Merge changes from upstream

Commands:
git clone https://fuchsia.googlesource.com/third_party/tink
cd tink
git checkout upstream/master
git checkout origin/master -b ${USER}-merge
git merge upstream/master
./tools/convert_for_cobalt

Had to commit using --no-verify because tink apparently added some files
which match its secret patterns.

Change-Id: I413c697c2a6fdcf81705ef706ccea30d55bef2ad
diff --git a/.bazelrc b/.bazelrc
new file mode 100644
index 0000000..94aad05
--- /dev/null
+++ b/.bazelrc
@@ -0,0 +1,3 @@
+# Fix for grpc build error on macOS.
+# See: https://github.com/bazelbuild/bazel/issues/4341
+build --copt -DGRPC_BAZEL_BUILD
diff --git a/BUILD.bazel b/BUILD.bazel
index 3e85084..b064150 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -5,7 +5,7 @@
 
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 exports_files(["LICENSE"])
 
@@ -18,3 +18,13 @@
     name = "tink_version",
     srcs = ["tink_version.bzl"],
 )
+
+filegroup(
+    name = "cmake_source_files",
+    data = glob(["cmake/**"])
+       + [
+           "//cc",
+           "CMakeLists.txt",
+           "tink_version.cmake",
+       ],
+)
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..db48ab6
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,79 @@
+cmake_minimum_required(VERSION 3.5)
+project(Tink CXX)
+
+# Deviate from the naming convention for consistency with tink_version.bzl.
+include(tink_version.cmake)
+
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
+
+option(TINK_BUILD_TESTS "Build Tink tests" OFF)
+
+# Build libtink.so and the bundle tarball (libtink + dependent headers).
+# This is useful to create a self-contained export of Tink, to be used in
+# projects that do not wish to include the full set of Tink targets in their
+# build system, or do not use CMake.
+#
+# Together with libtink, TinkConfig.cmake is created too, which allows to pull
+# Tink into your project as an external dependency using find_package().
+#
+# Off by default, since we don't currently support Windows and the shared lib
+# requires position independent code, which adds a small performance penalty.
+option(TINK_BUILD_SHARED_LIB "Build libtink bundle it with the headers" OFF)
+
+if (TINK_BUILD_SHARED_LIB)
+  set(CMAKE_POSITION_INDEPENDENT_CODE ON CACHE BOOL "libtink override" FORCE)
+endif()
+
+set(CPACK_GENERATOR TGZ)
+set(CPACK_PACKAGE_VERSION ${TINK_VERSION_LABEL})
+
+include(CPack)
+include(TinkWorkspace)
+include(TinkBuildRules)
+include(TinkUtil)
+
+# Bazel rewrites import paths so that "cc/example/foo.h" can be included as
+# "tink/example/foo.h". The following lines simulate this behaviour by creating
+# a symlink to cc/ called tink/, and placing it in a separate subdirectory,
+# which is then specified as a global include path.
+#
+# It's important to create a separate directory and not just drop the link in
+# CMAKE_CURRENT_BINARY_DIR, since adding that to the include paths will
+# make the whole contents of that directory visible to the compiled files,
+# which may result in undeclared dependencies that nevertheless happen to work.
+#
+set(TINK_INCLUDE_ALIAS_DIR "${CMAKE_CURRENT_BINARY_DIR}/__include_alias")
+add_directory_alias(
+  "${CMAKE_CURRENT_SOURCE_DIR}/cc" "${TINK_INCLUDE_ALIAS_DIR}/tink")
+list(APPEND TINK_INCLUDE_DIRS "${TINK_INCLUDE_ALIAS_DIR}")
+
+add_subdirectory(cc)
+add_subdirectory(proto)
+
+if (TINK_BUILD_SHARED_LIB)
+  install(FILES README.md LICENSE DESTINATION "share/doc/tink")
+
+  # The trailing slash in a directory name is used to strip it from the paths
+  # being installed. Do not add or remove it just for style reasons.
+  install(
+    DIRECTORY
+      "${CMAKE_CURRENT_SOURCE_DIR}/cc/"
+      "${TINK_GENFILE_DIR}/tink/"
+      "${TINK_GENFILE_DIR}/proto"
+    DESTINATION "include/tink"
+    FILES_MATCHING PATTERN "*.h"
+  )
+
+  # Bundle Abseil and BoringSSL headers with Tink.
+  install(
+    DIRECTORY
+      "${com_google_absl_SOURCE_DIR}/absl"
+      "${com_google_protobuf_SOURCE_DIR}/src/google"
+    DESTINATION "include"
+    FILES_MATCHING
+      REGEX "\\.(h|inc)$"
+      PATTERN "testdata" EXCLUDE
+  )
+
+  export(EXPORT Tink FILE TinkConfig.cmake)
+endif()
diff --git a/README.md b/README.md
index 22db7ef..0431424 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,5 @@
 # Tink
+
 *A multi-language, cross-platform library that provides cryptographic APIs that are secure, easy to use correctly, and hard(er) to misuse.*
 
 **`Ubuntu`**                                                                                   | **`macOS`**
@@ -6,11 +7,12 @@
 [![Kokoro Ubuntu](https://storage.googleapis.com/tink-kokoro-build-badges/tink-ubuntu.png)](#) | [![Kokoro macOS](https://storage.googleapis.com/tink-kokoro-build-badges/tink-macos.png)](#)
 
 ## Index
+
 1. [Introduction](#introduction)
-2. [Getting Started](#getting-started)
-3. [Current Status](#current-status)
-4. [Learn More](#learn-more)
-5. [Contact and Mailing List](#contact-and-mailing-list)
+2. [Getting started](#getting-started)
+3. [Current status](#current-status)
+4. [Learn more](#learn-more)
+5. [Contact and mailing list](#contact-and-mailing-list)
 6. [Maintainers](#maintainers)
 
 ## Introduction
@@ -35,7 +37,6 @@
 talk about Tink](https://www.youtube.com/watch?v=pqev9r3rUJs&t=9665) presented
 at [Real World Crypto 2019](https://rwc.iacr.org/2019/).
 
-
 ## Getting started
 
 **TIP** The easiest way to get started with Tink is to install
@@ -93,21 +94,22 @@
     byte[] ciphertext = aead.encrypt(plaintext, associatedData);
 ```
 
-## Current Status
+## Current status
 
-*   [Java and Android](docs/JAVA-HOWTO.md), [C++](docs/CPP-HOWTO.md) and
-    [Obj-C](docs/OBJC-HOWTO.md) are field tested and ready for production. The
-    latest version is
-    [1.2.2](https://github.com/google/tink/releases/tag/v1.2.2), released on
-    2019-01-24.
+*   [Java and Android](docs/JAVA-HOWTO.md), [C++](docs/CPP-HOWTO.md),
+    [Obj-C](docs/OBJC-HOWTO.md), and [Go](docs/GOLANG-HOWTO.md) are field
+    tested and ready for production. The latest version is
+    [1.3.0-rc2](https://github.com/google/tink/releases/tag/v1.3.0-rc2),
+    released on 2019-09-25.
 
-*   Tink for Go and JavaScript are in active development.
+*   Tink for Python and JavaScript are in active development.
 
-## Learn More
+## Learn more
 
 *   [Java HOW-TO](docs/JAVA-HOWTO.md)
 *   [C++ HOW-TO](docs/CPP-HOWTO.md)
 *   [Obj-C HOW-TO](docs/OBJC-HOWTO.md)
+*   [Go HOW-TO](docs/GOLANG-HOWTO.md)
 *   [Security and Usability Design Goals](docs/SECURITY-USABILITY.md)
 *   [Supported Crypto Primitives](docs/PRIMITIVES.md)
 *   [Key Management](docs/KEY-MANAGEMENT.md)
@@ -116,6 +118,18 @@
 *   [Feature Roadmap](docs/ROADMAP.md)
 *   [Java Hacking Guide](docs/JAVA-HACKING.md)
 
+## Community-driven ports
+
+Out of the box Tink supports a wide range of languages, but it still doesn't
+support every language. Fortunately, some users like Tink so much that they've
+ported it to their favorite languages! Below you can find notable ports.
+
+**WARNING** While we usually review these ports, until further notice, we do not
+maintain them and have no plan to support them in the foreseeable future.
+
+*   [C# (with JNI)](https://github.com/google-pay/tink-jni-examples)
+*   [Clojure](https://github.com/perkss/tinklj)
+
 ## Contact and mailing list
 
 If you want to contribute, please read [CONTRIBUTING](docs/CONTRIBUTING.md)
@@ -132,9 +146,13 @@
 
 -   Haris Andrianakis
 -   Daniel Bleichenbacher
+-   Tanuj Dhir
 -   Thai Duong
 -   Thomas Holenstein
 -   Charles Lee
 -   Quan Nguyen
 -   Bartosz Przydatek
+-   Enzo Puig
 -   Veronika Slívová
+-   Paula Vidas
+-   Jürg Wullschleger
diff --git a/WORKSPACE b/WORKSPACE
index 9a56a8a..86ac143 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -12,7 +12,7 @@
     urls = [
         "https://pki.goog/roots.pem"
     ],
-    sha256 = "24be41e33ba82bd7ac872f0ba0a9e6da219929a7c79b81ff23c229b40dca7234",
+    sha256 = "7f03c894282e3fc39105466a8ee5055ffd05e79dfd4010360117078afbfa68bd",
 )
 
 #-----------------------------------------------------------------------------
@@ -30,9 +30,9 @@
 #-----------------------------------------------------------------------------
 http_archive(
     name = "com_google_absl",
-    strip_prefix = "abseil-cpp-c476da141ca9cffc2137baf85872f0cae9ffa9ad",
-    url = "https://github.com/abseil/abseil-cpp/archive/c476da141ca9cffc2137baf85872f0cae9ffa9ad.zip",
-    sha256 = "84b4277a9b56f9a192952beca535313497826c6ff2e38b2cac7351a3ed2ae780",
+    strip_prefix = "abseil-cpp-20190808",
+    url = "https://github.com/abseil/abseil-cpp/archive/20190808.zip",
+    sha256 = "0b62fc2d00c2b2bc3761a892a17ac3b8af3578bd28535d90b4c914b0a7460d4e",
 )
 
 http_archive(
@@ -66,10 +66,44 @@
     urls = [
         "https://github.com/aws/aws-sdk-cpp/archive/1.4.80.tar.gz",
     ],
-    strip_prefix = "aws-sdk-cpp-1.4.80/",
+    strip_prefix = "aws-sdk-cpp-1.4.80",
     build_file = "//:third_party/aws_sdk_cpp.BUILD.bazel",
 )
 
+
+# Needed by googleapis.
+http_archive(
+    name = "com_google_api_codegen",
+    urls = ["https://github.com/googleapis/gapic-generator/archive/96c3c5a4c8397d4bd29a6abce861547a271383e1.zip"],
+    strip_prefix = "gapic-generator-96c3c5a4c8397d4bd29a6abce861547a271383e1",
+)
+
+# Needed for Cloud KMS API via gRPC.
+http_archive(
+    name = "googleapis",
+    urls = [
+        "https://github.com/googleapis/googleapis/archive/43a324913190da118e1c3c1a89ef6cfc47c5caf3.zip",
+    ],
+    sha256 = "d1860c5e806c0cf04d6d0806ab6f43f27c9d9a47cd76429f49f8a37750effccf",
+    strip_prefix = "googleapis-43a324913190da118e1c3c1a89ef6cfc47c5caf3",
+)
+
+# gRPC.
+http_archive(
+    name = "com_github_grpc_grpc",
+    urls = [
+        "https://github.com/grpc/grpc/archive/v1.22.1.tar.gz"
+    ],
+    sha256 = "cce1d4585dd017980d4a407d8c5e9f8fc8c1dbb03f249b99e88a387ebb45a035",
+    strip_prefix = "grpc-1.22.1",
+)
+
+# Load grpc_deps.
+# This is a workaround around the missing support for recursive WORKSPACE
+# file loading (https://github.com/bazelbuild/bazel/issues/1943).
+load("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_deps")
+grpc_deps()
+
 http_archive(
     name = "curl",
     urls = [
@@ -81,7 +115,7 @@
 )
 
 http_archive(
-    name = "zlib_archive",
+    name = "zlib",
     urls = [
         "https://mirror.bazel.build/zlib.net/zlib-1.2.11.tar.gz",
     ],
@@ -99,11 +133,17 @@
 # This statement defines the @com_google_protobuf repo.
 http_archive(
     name = "com_google_protobuf",
-    strip_prefix = "protobuf-3.6.1.2",
-    urls = ["https://github.com/google/protobuf/archive/v3.6.1.2.zip"],
-    sha256 = "d6618d117698132dadf0f830b762315807dc424ba36ab9183f1f436008a2fdb6",
+    strip_prefix = "protobuf-3.9.1",
+    urls = ["https://github.com/google/protobuf/archive/v3.9.1.zip"],
+    sha256 = "c90d9e13564c0af85fd2912545ee47b57deded6e5a97de80395b6d2d9be64854",
 )
 
+# Load protobuf_deps.
+# This is a workaround around the missing support for recursive WORKSPACE
+# file loading (https://github.com/bazelbuild/bazel/issues/1943).
+load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")
+protobuf_deps()
+
 # java_lite_proto_library rules implicitly depend on
 # @com_google_protobuf_javalite//:javalite_toolchain, which is the JavaLite proto
 # runtime (base classes and common utilities).
@@ -114,10 +154,33 @@
     sha256 = "79d102c61e2a479a0b7e5fc167bcfaa4832a0c6aad4a75fa7da0480564931bcc",
 )
 
+# Needed by gRPC, to build pb.h/pb.cc files from protos that contain services.
+http_archive(
+    name = "build_stack_rules_proto",
+    strip_prefix = "rules_proto-f5d6eea6a4528bef3c1d3a44d486b51a214d61c2",
+    urls = [
+        "https://github.com/stackb/rules_proto/archive/f5d6eea6a4528bef3c1d3a44d486b51a214d61c2.tar.gz",
+    ],
+    sha256 = "128c4486b1707db917411c6e448849dd76ea3b8ba704f9e0627d9b01f2ee45fe",
+)
+
+load("@build_stack_rules_proto//cpp:deps.bzl", "cpp_grpc_library")
+cpp_grpc_library()
+
 #-----------------------------------------------------------------------------
 # java
 #-----------------------------------------------------------------------------
 
+# Not used by Java Tink, but apparently needed for C++ gRPC library.
+http_archive(
+    name = "io_grpc_grpc_java",
+    strip_prefix = "grpc-java-1.20.0",
+    urls = [
+        "https://github.com/grpc/grpc-java/archive/v1.20.0.tar.gz",
+    ],
+    sha256 = "553d1bdbde3ff4035747c184486bae2f084c75c3c4cdf5ef31a6aa48bdccaf9b",
+)
+
 # android sdk
 android_sdk_repository(
     name = "androidsdk",
@@ -127,468 +190,83 @@
     api_level = 23, # M
 )
 
-load("@bazel_tools//tools/build_defs/repo:java.bzl", "java_import_external")
+RULES_JVM_EXTERNAL_TAG = "2.7"
+RULES_JVM_EXTERNAL_SHA = "f04b1466a00a2845106801e0c5cec96841f49ea4e7d1df88dc8e4bf31523df74"
 
-################################################################################
-# BEGIN BAZEL MAVEN CONFIG GENERATOR
-# go/bazel-maven-config-generator
-#   args4j:args4j:2.33
-#   com.amazonaws:aws-java-sdk-core:1.11.166
-#   com.amazonaws:aws-java-sdk-kms:1.11.166
-#   com.google.auto:auto-common:0.8
-#   com.google.auto.service:auto-service:1.0-rc3
-#   com.google.api-client:google-api-client:1.22.0
-#   com.google.apis:google-api-services-cloudkms:v1-rev4-1.22.0
-#   com.google.code.findbugs:jsr305:3.0.1
-#   com.google.errorprone:error_prone_annotations:2.0.19
-#   com.google.oauth-client:google-oauth-client:1.22.0
-#   org.json:json:20170516
-#   junit:junit_4:4.12
-#   org.mockito:mockito-core:2.8.47
-#   com.google.truth:truth:0.32
-
-java_import_external(
-    name = "args4j",
-    licenses = ["notice"],  # MIT License
-    jar_sha256 = "91ddeaba0b24adce72291c618c00bbdce1c884755f6c4dba9c5c46e871c69ed6",
-    jar_urls = [
-        "https://maven.ibiblio.org/maven2/args4j/args4j/2.33/args4j-2.33.jar",
-        "https://repo1.maven.org/maven2/args4j/args4j/2.33/args4j-2.33.jar",
-    ],
+http_archive(
+    name = "rules_jvm_external",
+    strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG,
+    sha256 = RULES_JVM_EXTERNAL_SHA,
+    url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG,
 )
 
-java_import_external(
-    name = "com_amazonaws_aws_java_sdk_core",
-    licenses = ["notice"],  # Apache License, Version 2.0
-    jar_sha256 = "be81b204f0ddf069a4c1f44f7e06971351aab725cbf85f542bd8dc8fdf50d5c9",
-    jar_urls = [
-        "https://maven.ibiblio.org/maven2/com/amazonaws/aws-java-sdk-core/1.11.166/aws-java-sdk-core-1.11.166.jar",
-        "https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-core/1.11.166/aws-java-sdk-core-1.11.166.jar",
+load("@rules_jvm_external//:defs.bzl", "maven_install")
+
+maven_install(
+    artifacts = [
+      "args4j:args4j:2.33",
+      "com.amazonaws:aws-java-sdk-core:1.11.625",
+      "com.amazonaws:aws-java-sdk-kms:1.11.625",
+      "com.google.auto:auto-common:0.10",
+      "com.google.auto.service:auto-service:1.0-rc6",
+      "com.google.auto.service:auto-service-annotations:1.0-rc6",
+      "com.google.api-client:google-api-client:1.22.0",
+      "com.google.apis:google-api-services-cloudkms:v1-rev89-1.25.0",
+      "com.google.code.findbugs:jsr305:3.0.1",
+      "com.google.errorprone:error_prone_annotations:2.3.3",
+      "com.google.http-client:google-http-client:1.31.0",
+      "com.google.http-client:google-http-client-jackson2:1.31.0",
+      "com.google.oauth-client:google-oauth-client:1.30.1",
+      "com.google.truth:truth:0.42",
+      "org.json:json:20170516",
+      "joda-time:joda-time:2.10.3",
+      "junit:junit:4.12",
+      "org.mockito:mockito-core:2.23.0",
     ],
-    deps = [
-        "@commons_logging",
-        "@org_apache_httpcomponents_httpclient",
-        "@software_amazon_ion_java",
-        "@com_fasterxml_jackson_core_jackson_databind",
-        "@com_fasterxml_jackson_dataformat_cbor",
-        "@joda_time",
+    repositories = [
+        "https://jcenter.bintray.com/",
+        "https://maven.google.com",
+        "https://repo1.maven.org/maven2",
     ],
 )
 
-java_import_external(
-    name = "com_amazonaws_aws_java_sdk_kms",
-    licenses = ["notice"],  # Apache License, Version 2.0
-    jar_sha256 = "e690e02028709196ace0eb3725f06c032242e40d187171fb4fe4cdc04cf0eec5",
-    jar_urls = [
-        "https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-kms/1.11.166/aws-java-sdk-kms-1.11.166.jar",
-        "https://maven.ibiblio.org/maven2/com/amazonaws/aws-java-sdk-kms/1.11.166/aws-java-sdk-kms-1.11.166.jar",
-    ],
-    deps = [
-        "@com_amazonaws_aws_java_sdk_core",
-        "@com_amazonaws_jmespath_java",
-    ],
-)
-
-java_import_external(
-    name = "com_amazonaws_jmespath_java",
-    licenses = ["notice"],  # Apache License, Version 2.0
-    jar_sha256 = "75e44f769a29f9d92f3dc481f38fb5ee2066fbb0c2bdd94a75f12f193962d997",
-    jar_urls = [
-        "https://maven.ibiblio.org/maven2/com/amazonaws/jmespath-java/1.11.166/jmespath-java-1.11.166.jar",
-        "https://repo1.maven.org/maven2/com/amazonaws/jmespath-java/1.11.166/jmespath-java-1.11.166.jar",
-    ],
-    deps = ["@com_fasterxml_jackson_core_jackson_databind"],
-)
-
-java_import_external(
-    name = "com_fasterxml_jackson_core",
-    licenses = ["notice"],  # The Apache Software License, Version 2.0
-    jar_sha256 = "918c04b9f9043d51dead2192b5d94d9f065870c9f26c8defbe9c6dbc951f304f",
-    jar_urls = [
-        "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.6.7/jackson-core-2.6.7.jar",
-        "https://maven.ibiblio.org/maven2/com/fasterxml/jackson/core/jackson-core/2.6.7/jackson-core-2.6.7.jar",
-    ],
-)
-
-java_import_external(
-    name = "com_fasterxml_jackson_core_jackson_annotations",
-    licenses = ["notice"],  # The Apache Software License, Version 2.0
-    jar_sha256 = "03348c047d981376cc444fc466cd80bda8d7eb0698dc6a99dd52c5aa15eff5ad",
-    jar_urls = [
-        "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.6.0/jackson-annotations-2.6.0.jar",
-        "https://maven.ibiblio.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.6.0/jackson-annotations-2.6.0.jar",
-    ],
-)
-
-java_import_external(
-    name = "com_fasterxml_jackson_core_jackson_databind",
-    licenses = ["notice"],  # The Apache Software License, Version 2.0
-    jar_sha256 = "c6b6043c6880697536f4ae3b9fad09517081ea22b966f0a084fa2d0c515e0a4a",
-    jar_urls = [
-        "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.6.7.1/jackson-databind-2.6.7.1.jar",
-        "https://maven.ibiblio.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.6.7.1/jackson-databind-2.6.7.1.jar",
-    ],
-    deps = [
-        "@com_fasterxml_jackson_core_jackson_annotations",
-        "@com_fasterxml_jackson_core",
-    ],
-)
-
-java_import_external(
-    name = "com_fasterxml_jackson_dataformat_cbor",
-    licenses = ["notice"],  # The Apache Software License, Version 2.0
-    jar_sha256 = "956a0fb9186a796b8a6548909da1ee55004279647e261c7f540e5d49d4f199bf",
-    jar_urls = [
-        "https://maven.ibiblio.org/maven2/com/fasterxml/jackson/dataformat/jackson-dataformat-cbor/2.6.7/jackson-dataformat-cbor-2.6.7.jar",
-        "https://repo1.maven.org/maven2/com/fasterxml/jackson/dataformat/jackson-dataformat-cbor/2.6.7/jackson-dataformat-cbor-2.6.7.jar",
-    ],
-    deps = ["@com_fasterxml_jackson_core"],
-)
-
-java_import_external(
-    name = "com_google_api_client",
-    licenses = ["notice"],  # The Apache Software License, Version 2.0
-    jar_sha256 = "47c625c83a8cf97b8bbdff2acde923ff8fd3174e62aabcfc5d1b86692594ffba",
-    jar_urls = [
-        "https://repo1.maven.org/maven2/com/google/api-client/google-api-client/1.22.0/google-api-client-1.22.0.jar",
-        "https://maven.ibiblio.org/maven2/com/google/api-client/google-api-client/1.22.0/google-api-client-1.22.0.jar",
-    ],
-    deps = [
-        "@com_google_oauth_client",
-        "@com_google_http_client_jackson2",
-        "@commons_codec",
-    ],
-)
-
-java_import_external(
-    name = "com_google_apis_google_api_services_cloudkms",
-    licenses = ["notice"],  # The Apache Software License, Version 2.0
-    jar_sha256 = "0a991ab42838b2eb80b9880e34c25ab8076a1472a2b485dd3c8911509327f494",
-    jar_urls = [
-        "https://repo1.maven.org/maven2/com/google/apis/google-api-services-cloudkms/v1-rev4-1.22.0/google-api-services-cloudkms-v1-rev4-1.22.0.jar",
-        "https://maven.ibiblio.org/maven2/com/google/apis/google-api-services-cloudkms/v1-rev4-1.22.0/google-api-services-cloudkms-v1-rev4-1.22.0.jar",
-    ],
-    deps = ["@com_google_api_client"],
-)
-
-java_import_external(
-    name = "com_google_auto_common",
-    licenses = ["notice"],  # Apache 2.0
-    jar_sha256 = "97db1709f57b91b32edacb596ef4641872f227b7d99ad90e467f0d77f5ba134a",
-    jar_urls = [
-        "https://repo1.maven.org/maven2/com/google/auto/auto-common/0.8/auto-common-0.8.jar",
-        "https://maven.ibiblio.org/maven2/com/google/auto/auto-common/0.8/auto-common-0.8.jar",
-    ],
-    deps = ["@com_google_guava"],
-)
-
-java_import_external(
-    name = "com_google_auto_service",
-    licenses = ["notice"],  # Apache 2.0
-    jar_sha256 = "f68e20cc5aba8ad1759d2779c2b3725cc0bd9420c40e7b464a796b8ca1499e9e",
-    jar_urls = [
-        "https://maven.ibiblio.org/maven2/com/google/auto/service/auto-service/1.0-rc3/auto-service-1.0-rc3.jar",
-        "https://repo1.maven.org/maven2/com/google/auto/service/auto-service/1.0-rc3/auto-service-1.0-rc3.jar",
-    ],
-    deps = [
-        "@com_google_auto_common",
-        "@com_google_guava",
-    ],
-)
-
-java_import_external(
-    name = "com_google_auto_value",
-    neverlink = 1,
-    licenses = ["notice"],  # Apache 2.0
-    jar_sha256 = "fd6fb139d97b427c321eb9370aeb29394e35d22d595166ca9071457448fa5660",
-    jar_urls = [
-        "https://repo1.maven.org/maven2/com/google/auto/value/auto-value/1.0/auto-value-1.0.jar",
-        "https://maven.ibiblio.org/maven2/com/google/auto/value/auto-value/1.0/auto-value-1.0.jar",
-    ],
-)
-
-java_import_external(
-    name = "com_google_code_findbugs_annotations",
-    neverlink = 1,
-    licenses = ["restricted"],  # GNU Lesser Public License
-    jar_sha256 = "acc0d2c06be70e9094d70cd05dffa077735c8f9d1a870eafda130b0592528200",
-    jar_urls = [
-        "https://maven.ibiblio.org/maven2/com/google/code/findbugs/annotations/3.0.1u2/annotations-3.0.1u2.jar",
-        "https://repo1.maven.org/maven2/com/google/code/findbugs/annotations/3.0.1u2/annotations-3.0.1u2.jar",
-    ],
-    deps = [
-        "@com_google_code_findbugs_jsr305",
-    ],
-)
-
-java_import_external(
-    name = "com_google_code_findbugs_jsr305",
-    licenses = ["notice"],  # The Apache Software License, Version 2.0
-    jar_sha256 = "c885ce34249682bc0236b4a7d56efcc12048e6135a5baf7a9cde8ad8cda13fcd",
-    jar_urls = [
-        "https://maven.ibiblio.org/maven2/com/google/code/findbugs/jsr305/3.0.1/jsr305-3.0.1.jar",
-        "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.1/jsr305-3.0.1.jar",
-    ],
-)
-
-java_import_external(
-    name = "com_google_errorprone_error_prone_annotations",
-    licenses = ["notice"],  # Apache 2.0
-    jar_sha256 = "cde78ace21e46398299d0d9c6be9f47b7f971c7f045d40c78f95be9a638cbf7e",
-    jar_urls = [
-        "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.0.19/error_prone_annotations-2.0.19.jar",
-        "https://maven.ibiblio.org/maven2/com/google/errorprone/error_prone_annotations/2.0.19/error_prone_annotations-2.0.19.jar",
-    ],
-)
-
-java_import_external(
-    name = "com_google_guava",
-    licenses = ["notice"],  # The Apache Software License, Version 2.0
-    jar_sha256 = "36a666e3b71ae7f0f0dca23654b67e086e6c93d192f60ba5dfd5519db6c288c8",
-    jar_urls = [
-        "https://maven.ibiblio.org/maven2/com/google/guava/guava/20.0/guava-20.0.jar",
-        "https://repo1.maven.org/maven2/com/google/guava/guava/20.0/guava-20.0.jar",
-    ],
-)
-
-java_import_external(
-    name = "com_google_http_client",
-    licenses = ["notice"],  # The Apache Software License, Version 2.0
-    jar_sha256 = "f88ffa329ac52fb4f2ff0eb877ef7318423ac9b791a107f886ed5c7a00e77e11",
-    jar_urls = [
-        "https://repo1.maven.org/maven2/com/google/http-client/google-http-client/1.22.0/google-http-client-1.22.0.jar",
-        "https://maven.ibiblio.org/maven2/com/google/http-client/google-http-client/1.22.0/google-http-client-1.22.0.jar",
-    ],
-    deps = [
-        "@com_google_code_findbugs_jsr305",
-        "@org_apache_httpcomponents_httpclient",
-        "@commons_codec",
-    ],
-)
-
-java_import_external(
-    name = "com_google_http_client_jackson2",
-    licenses = ["notice"],  # The Apache Software License, Version 2.0
-    jar_sha256 = "45b1e34b2dcef5cb496ef25a1223d19cf102b8c2ea4abf96491631b2faf4611c",
-    jar_urls = [
-        "https://maven.ibiblio.org/maven2/com/google/http-client/google-http-client-jackson2/1.22.0/google-http-client-jackson2-1.22.0.jar",
-        "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-jackson2/1.22.0/google-http-client-jackson2-1.22.0.jar",
-    ],
-    deps = [
-        "@com_google_http_client",
-        "@com_fasterxml_jackson_core",
-    ],
-)
-
-java_import_external(
-    name = "com_google_oauth_client",
-    licenses = ["notice"],  # The Apache Software License, Version 2.0
-    jar_sha256 = "a4c56168b3e042105d68cf136e40e74f6e27f63ed0a948df966b332678e19022",
-    jar_urls = [
-        "https://maven.ibiblio.org/maven2/com/google/oauth-client/google-oauth-client/1.22.0/google-oauth-client-1.22.0.jar",
-        "https://repo1.maven.org/maven2/com/google/oauth-client/google-oauth-client/1.22.0/google-oauth-client-1.22.0.jar",
-    ],
-    deps = [
-        "@com_google_http_client",
-        "@com_google_code_findbugs_jsr305",
-    ],
-)
-
-java_import_external(
-    name = "com_google_truth",
-    licenses = ["notice"],  # The Apache Software License, Version 2.0
-    jar_sha256 = "032eddc69652b0a1f8d458f999b4a9534965c646b8b5de0eba48ee69407051df",
-    jar_urls = [
-        "https://repo1.maven.org/maven2/com/google/truth/truth/0.32/truth-0.32.jar",
-        "https://maven.ibiblio.org/maven2/com/google/truth/truth/0.32/truth-0.32.jar",
-    ],
-    deps = [
-        "@com_google_guava",
-        "@junit",
-        "@com_google_auto_value",
-        "@com_google_errorprone_error_prone_annotations",
-    ],
-)
-
-java_import_external(
-    name = "commons_codec",
-    licenses = ["notice"],  # The Apache Software License, Version 2.0
-    jar_sha256 = "ad19d2601c3abf0b946b5c3a4113e226a8c1e3305e395b90013b78dd94a723ce",
-    jar_urls = [
-        "https://maven.ibiblio.org/maven2/commons-codec/commons-codec/1.9/commons-codec-1.9.jar",
-        "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.9/commons-codec-1.9.jar",
-    ],
-)
-
-java_import_external(
-    name = "commons_logging",
-    licenses = ["notice"],  # The Apache Software License, Version 2.0
-    jar_sha256 = "daddea1ea0be0f56978ab3006b8ac92834afeefbd9b7e4e6316fca57df0fa636",
-    jar_urls = [
-        "https://maven.ibiblio.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar",
-        "https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar",
-    ],
-)
-
-java_import_external(
-    name = "joda_time",
-    licenses = ["notice"],  # Apache 2
-    jar_sha256 = "b4670b95f75957c974284c5f3ada966040be2578f643c5c6083d262162061fa2",
-    jar_urls = [
-        "https://maven.ibiblio.org/maven2/joda-time/joda-time/2.8.1/joda-time-2.8.1.jar",
-        "https://repo1.maven.org/maven2/joda-time/joda-time/2.8.1/joda-time-2.8.1.jar",
-    ],
-)
-
-java_import_external(
-    name = "junit",
-    licenses = ["reciprocal"],  # Eclipse Public License 1.0
-    jar_sha256 = "59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a",
-    jar_urls = [
-        "https://repo1.maven.org/maven2/junit/junit/4.12/junit-4.12.jar",
-        "https://maven.ibiblio.org/maven2/junit/junit/4.12/junit-4.12.jar",
-    ],
-    deps = ["@org_hamcrest_core"],
-)
-
-java_import_external(
-    name = "net_bytebuddy_byte_buddy",
-    licenses = ["notice"],  # The Apache Software License, Version 2.0
-    jar_sha256 = "917758b3c651e278a15a029ba1d42dbf802d8b0e1fe2aa4b81c5750c64f461c1",
-    jar_urls = [
-        "https://maven.ibiblio.org/maven2/net/bytebuddy/byte-buddy/1.6.14/byte-buddy-1.6.14.jar",
-        "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy/1.6.14/byte-buddy-1.6.14.jar",
-    ],
-    deps = [
-        "@com_google_code_findbugs_annotations",
-    ],
-)
-
-java_import_external(
-    name = "net_bytebuddy_byte_buddy_agent",
-    licenses = ["notice"],  # The Apache Software License, Version 2.0
-    jar_sha256 = "c141a2d6809c3eeff4a43d25992826abccebdd4b793af3e7a5f346e88ae73a33",
-    jar_urls = [
-        "https://maven.ibiblio.org/maven2/net/bytebuddy/byte-buddy-agent/1.6.14/byte-buddy-agent-1.6.14.jar",
-        "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy-agent/1.6.14/byte-buddy-agent-1.6.14.jar",
-    ],
-)
-
-java_import_external(
-    name = "org_apache_httpcomponents_httpclient",
-    licenses = ["notice"],  # Apache License, Version 2.0
-    jar_sha256 = "0dffc621400d6c632f55787d996b8aeca36b30746a716e079a985f24d8074057",
-    jar_urls = [
-        "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.2/httpclient-4.5.2.jar",
-        "https://maven.ibiblio.org/maven2/org/apache/httpcomponents/httpclient/4.5.2/httpclient-4.5.2.jar",
-    ],
-    deps = [
-        "@org_apache_httpcomponents_httpcore",
-        "@commons_logging",
-        "@commons_codec",
-    ],
-)
-
-java_import_external(
-    name = "org_apache_httpcomponents_httpcore",
-    licenses = ["notice"],  # Apache License, Version 2.0
-    jar_sha256 = "f7bc09dc8a7003822d109634ffd3845d579d12e725ae54673e323a7ce7f5e325",
-    jar_urls = [
-        "https://maven.ibiblio.org/maven2/org/apache/httpcomponents/httpcore/4.4.4/httpcore-4.4.4.jar",
-        "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.4/httpcore-4.4.4.jar",
-    ],
-)
-
-java_import_external(
-    name = "org_hamcrest_core",
-    licenses = ["notice"],  # New BSD License
-    jar_sha256 = "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9",
-    jar_urls = [
-        "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar",
-        "https://maven.ibiblio.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar",
-    ],
-)
-
-java_import_external(
-    name = "org_json",
-    licenses = ["notice"],  # The JSON License
-    jar_sha256 = "813f37e4820f1854e8a4eb4f80df94bf1b1f2ec6c3b72692f23ab9a556256af6",
-    jar_urls = [
-        "https://maven.ibiblio.org/maven2/org/json/json/20170516/json-20170516.jar",
-        "https://repo1.maven.org/maven2/org/json/json/20170516/json-20170516.jar",
-    ],
-)
-
-java_import_external(
-    name = "org_mockito_core",
-    licenses = ["notice"],  # The MIT License
-    jar_sha256 = "c496fe3790c55c07697cf37f5062f8758591ab035900bc108ce185b48df563a0",
-    jar_urls = [
-        "https://repo1.maven.org/maven2/org/mockito/mockito-core/2.8.47/mockito-core-2.8.47.jar",
-        "https://maven.ibiblio.org/maven2/org/mockito/mockito-core/2.8.47/mockito-core-2.8.47.jar",
-    ],
-    deps = [
-        "@net_bytebuddy_byte_buddy",
-        "@net_bytebuddy_byte_buddy_agent",
-        "@org_objenesis",
-    ],
-)
-
-java_import_external(
-    name = "org_objenesis",
-    licenses = ["notice"],  # Apache 2
-    jar_sha256 = "293328e1b0d31ed30bb89fca542b6c52fac00989bb0e62eb9d98d630c4dd6b7c",
-    jar_urls = [
-        "https://maven.ibiblio.org/maven2/org/objenesis/objenesis/2.5/objenesis-2.5.jar",
-        "https://repo1.maven.org/maven2/org/objenesis/objenesis/2.5/objenesis-2.5.jar",
-    ],
-)
-
-java_import_external(
-    name = "software_amazon_ion_java",
-    licenses = ["notice"],  # The Apache License, Version 2.0
-    jar_sha256 = "0d127b205a1fce0abc2a3757a041748651bc66c15cf4c059bac5833b27d471a5",
-    jar_urls = [
-        "https://repo1.maven.org/maven2/software/amazon/ion/ion-java/1.0.2/ion-java-1.0.2.jar",
-        "https://maven.ibiblio.org/maven2/software/amazon/ion/ion-java/1.0.2/ion-java-1.0.2.jar",
-    ],
-)
-
-# END BAZEL MAVEN CONFIG GENERATOR
-################################################################################
-
 #-----------------------------------------------------------------------------
 # objc
 #-----------------------------------------------------------------------------
 
 http_archive(
     name = "build_bazel_rules_apple",
-    strip_prefix = "rules_apple-0.6.0",
-    url = "https://github.com/bazelbuild/rules_apple/archive/0.6.0.zip",
-    sha256 = "bcc39ad59bf3439e1fd704ab553857b77a865f7e30fe612699aeb12f6882a191",
+    strip_prefix = "rules_apple-0.17.0",
+    url = "https://github.com/bazelbuild/rules_apple/archive/0.17.0.zip",
+    sha256 = "5ec8a6dd73ddeec3bf051ea82906dcd369c77f7f6030bc517c82e0e7a84c1cb9",
 )
 
-http_archive(
-    name = "bazel_skylib",
-    strip_prefix = "bazel-skylib-0.4.0",
-    url = "https://github.com/bazelbuild/bazel-skylib/archive/0.4.0.zip",
-    sha256 = "b546c142abd7524e4d60959c19b0c387fe282f309be5efb7e0abae476b7bbef9",
+load(
+    "@build_bazel_rules_apple//apple:repositories.bzl",
+    "apple_rules_dependencies",
 )
 
-http_archive(
-    name = "build_bazel_rules_swift",
-    strip_prefix = "rules_swift-0.2.0",
-    url = "https://github.com/bazelbuild/rules_swift/archive/0.2.0.zip",
-    sha256 = "93e088c8b79a5c5eaa08fca43429fdcbeb88e71575d4fa34d2d53e3deb9e53c4",
+apple_rules_dependencies()
+
+load(
+    "@build_bazel_rules_swift//swift:repositories.bzl",
+    "swift_rules_dependencies",
 )
 
+swift_rules_dependencies()
+
+load(
+    "@build_bazel_apple_support//lib:repositories.bzl",
+    "apple_support_dependencies",
+)
+
+apple_support_dependencies()
+
 http_file(
     name = "xctestrunner",
     executable = 1,
-    urls = [
-        "https://github.com/google/xctestrunner/releases/download/0.2.1/ios_test_runner.par"
-    ],
-    sha256 = "5bfbd45c5ac89305e8bf3296999d490611b88d4d828b2a39ef6037027411aa94",
+    urls = ["https://github.com/google/xctestrunner/releases/download/0.2.6/ios_test_runner.par"],
+    sha256 = "15fc7d09315a230f3d8ee2913eef8699456366e44b37a9266e36b28517003628",
 )
 
 #-----------------------------------------------------------------------------
@@ -596,28 +274,33 @@
 #-----------------------------------------------------------------------------
 http_archive(
     name = "io_bazel_rules_go",
-    url = "https://github.com/bazelbuild/rules_go/releases/download/0.16.2/rules_go-0.16.2.tar.gz",
-    sha256 = "f87fa87475ea107b3c69196f39c82b7bbf58fe27c62a338684c20ca17d1d8613",
-)
-http_archive(
-    name = "bazel_gazelle",
-    urls = ["https://github.com/bazelbuild/bazel-gazelle/releases/download/0.14.0/bazel-gazelle-0.14.0.tar.gz"],
-    sha256 = "c0a5739d12c6d05b6c1ad56f2200cb0b57c5a70e03ebd2f7b87ce88cabf09c7b",
+    urls = [
+        "https://storage.googleapis.com/bazel-mirror/github.com/bazelbuild/rules_go/releases/download/0.18.6/rules_go-0.18.6.tar.gz",
+        "https://github.com/bazelbuild/rules_go/releases/download/0.18.6/rules_go-0.18.6.tar.gz",
+    ],
+    sha256 = "f04d2373bcaf8aa09bccb08a98a57e721306c8f6043a2a0ee610fd6853dcde3d",
 )
 
-load("@io_bazel_rules_go//go:def.bzl", "go_rules_dependencies", "go_register_toolchains")
+http_archive(
+    name = "bazel_gazelle",
+    strip_prefix = "bazel-gazelle-395b3a1c2f22d8cd63e19c92d4e1556eb3d96dde",
+    urls = ["https://github.com/bazelbuild/bazel-gazelle/archive/395b3a1c2f22d8cd63e19c92d4e1556eb3d96dde.zip"],
+    sha256 = "a40deb9c0cfa2e424ad9b15fe68aa3d259ccb0ef6405dd4fe0506d86d75b8475",
+)
+
+load("@io_bazel_rules_go//go:deps.bzl", "go_rules_dependencies", "go_register_toolchains")
 go_rules_dependencies()
 go_register_toolchains(nogo="@//go:tink_nogo")
 
-load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies")
+load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository")
 gazelle_dependencies()
 
-load("@bazel_gazelle//:deps.bzl", "go_repository")
 go_repository(
     name = "org_golang_x_crypto",
     commit = "0e37d006457bf46f9e6692014ba72ef82c33022c",
     importpath = "golang.org/x/crypto",
 )
+
 go_repository(
     name = "org_golang_x_sys",
     commit = "d0be0721c37eeb5299f245a996a483160fc36940",
@@ -641,3 +324,61 @@
     commit = "777200caa7fb8936aed0f12b1fd79af64cc83ec9",
     importpath = "cloud.google.com/go",
 )
+
+go_repository(
+    name = "com_github_aws_sdk_go",
+    commit = "182cda27d0921b14139ff6d352c09e0cb20e4578",
+    importpath = "github.com/aws/aws-sdk-go",
+)
+
+
+#-----------------------------------------------------------------------------
+# Javascript
+#-----------------------------------------------------------------------------
+
+http_archive(
+    name = "io_bazel_rules_closure",
+    sha256 = "3eff8985b5c6df196ce3a1944468a2c553ec4063f142d0feefe544e0fcdb583c",
+    strip_prefix = "rules_closure-0.9.0",
+    urls = [
+        "https://github.com/bazelbuild/rules_closure/archive/0.9.0.tar.gz",
+    ],
+)
+
+load("@io_bazel_rules_closure//closure:defs.bzl", "closure_repositories")
+
+closure_repositories(omit_zlib = True)
+
+#-----------------------------------------------------------------------------
+# Python
+#-----------------------------------------------------------------------------
+
+load("//third_party/py:python_configure.bzl", "python_configure")
+
+python_configure(name = "local_config_python")
+
+new_local_repository(
+    name = "clif",
+    build_file = "third_party/clif.BUILD.bazel",
+    path = "/usr/local",
+)
+
+#-----------------------------------------------------------------------------
+# Remote Build Execution
+#-----------------------------------------------------------------------------
+http_archive(
+    name = "bazel_toolchains",
+    sha256 = "4598bf5a8b4f5ced82c782899438a7ba695165d47b3bf783ce774e89a8c6e617",
+    strip_prefix = "bazel-toolchains-0.27.0",
+    urls = [
+        "https://mirror.bazel.build/github.com/bazelbuild/bazel-toolchains/archive/0.27.0.tar.gz",
+        "https://github.com/bazelbuild/bazel-toolchains/archive/0.27.0.tar.gz",
+    ],
+)
+
+load("@bazel_toolchains//rules:rbe_repo.bzl", "rbe_autoconfig")
+
+# Creates a default toolchain config for RBE.
+# Use this as is if you are using the rbe_ubuntu16_04 container,
+# otherwise refer to RBE docs.
+rbe_autoconfig(name = "rbe_default")
diff --git a/__init__.py b/__init__.py
new file mode 100644
index 0000000..123dd4e
--- /dev/null
+++ b/__init__.py
@@ -0,0 +1,60 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tink package."""
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from tink.python import aead
+from tink.python import core
+from tink.python import daead
+from tink.python import hybrid
+from tink.python import mac
+from tink.python import signature
+from tink.python import streaming_aead
+from tink.python import tink_config
+
+
+Aead = aead.Aead
+DeterministicAead = daead.DeterministicAead
+HybridDecrypt = hybrid.HybridDecrypt
+HybridEncrypt = hybrid.HybridEncrypt
+Mac = mac.Mac
+PublicKeySign = signature.PublicKeySign
+PublicKeyVerify = signature.PublicKeyVerify
+StreamingAead = streaming_aead.StreamingAead
+
+KeyManager = core.KeyManager
+PrivateKeyManager = core.PrivateKeyManager
+
+Registry = core.Registry
+
+new_keyset_handle = core.new_keyset_handle
+read_keyset_handle = core.read_keyset_handle
+KeysetHandle = core.KeysetHandle
+
+
+KeysetReader = core.KeysetReader
+JsonKeysetReader = core.JsonKeysetReader
+BinaryKeysetReader = core.BinaryKeysetReader
+
+KeysetWriter = core.KeysetWriter
+JsonKeysetWriter = core.JsonKeysetWriter
+BinaryKeysetWriter = core.BinaryKeysetWriter
+
+new_primitive_set = core.new_primitive_set
+
+TinkError = core.TinkError
diff --git a/apps/BUILD.bazel b/apps/BUILD.bazel
index 09610f7..6d4701f 100644
--- a/apps/BUILD.bazel
+++ b/apps/BUILD.bazel
@@ -1,3 +1,3 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
diff --git a/apps/paymentmethodtoken/BUILD.bazel b/apps/paymentmethodtoken/BUILD.bazel
index dee0b47..2ed090a 100644
--- a/apps/paymentmethodtoken/BUILD.bazel
+++ b/apps/paymentmethodtoken/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//visibility:public"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 load("//tools/build_defs:javac.bzl", "JAVACOPTS_OSS")
 
@@ -20,9 +20,9 @@
     deps = [
         "//java",
         "//java:subtle",
-        "@com_google_http_client//jar",
-        "@joda_time//jar",
-        "@org_json//jar",
+        "@maven//:com_google_http_client_google_http_client",
+        "@maven//:joda_time_joda_time",
+        "@maven//:org_json_json",
     ],
 )
 
@@ -64,10 +64,10 @@
     deps = [
         ":paymentmethodtoken",
         "//java:testonly",
-        "@com_google_http_client//jar",
-        "@joda_time//jar",
-        "@junit",
-        "@org_json//jar",
+        "@maven//:com_google_http_client_google_http_client",
+        "@maven//:joda_time_joda_time",
+        "@maven//:junit_junit",
+        "@maven//:org_json_json",
     ],
 )
 
diff --git a/apps/paymentmethodtoken/README.md b/apps/paymentmethodtoken/README.md
index 3f17e46..16b58c0 100644
--- a/apps/paymentmethodtoken/README.md
+++ b/apps/paymentmethodtoken/README.md
@@ -3,9 +3,9 @@
 ## Latest release
 
 The most recent release is
-[1.2.2](https://github.com/google/tink/releases/tag/v1.2.2), released
-2019-01-24. API docs can be found
-[here](https://google.github.com/tink/javadoc/apps-paymentmethodtoken/1.2.2).
+[1.3.0-rc2](https://github.com/google/tink/releases/tag/v1.3.0-rc2), released
+2019-09-25. API docs can be found
+[here](https://google.github.com/tink/javadoc/apps-paymentmethodtoken/1.3.0-rc2).
 
 The Maven group ID is `com.google.crypto.tink`, and the artifact ID is
 `apps-paymentmethodtoken`.
@@ -16,7 +16,7 @@
 <dependency>
   <groupId>com.google.crypto.tink</groupId>
   <artifactId>apps-paymentmethodtoken</artifactId>
-  <version>1.2.2</version>
+  <version>1.3.0-rc2</version>
 </dependency>
 ```
 
diff --git a/apps/rewardedads/BUILD.bazel b/apps/rewardedads/BUILD.bazel
index fec151d..ec93c5f 100644
--- a/apps/rewardedads/BUILD.bazel
+++ b/apps/rewardedads/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//visibility:public"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 load("//tools/build_defs:javac.bzl", "JAVACOPTS_OSS")
 
@@ -20,8 +20,8 @@
     deps = [
         "//java",
         "//java:subtle",
-        "@com_google_http_client",
-        "@org_json//jar",
+        "@maven//:com_google_http_client_google_http_client",
+        "@maven//:org_json_json",
     ],
 )
 
@@ -49,9 +49,9 @@
     deps = [
         ":rewardedads",
         "//java:testonly",
-        "@com_google_http_client",
-        "@junit",
-        "@org_json//jar",
+        "@maven//:com_google_http_client_google_http_client",
+        "@maven//:junit_junit",
+        "@maven//:org_json_json",
     ],
 )
 
diff --git a/apps/rewardedads/README.md b/apps/rewardedads/README.md
index 0650c2f..88234bb 100644
--- a/apps/rewardedads/README.md
+++ b/apps/rewardedads/README.md
@@ -3,10 +3,27 @@
 This app implements the verifier side of Server-Side Verification of Google
 AdMob Rewarded Ads.
 
-## Snapshots
+## Latest Release
 
-This app has yet not been released, though you can still play with it using
-snapshot versions.
+The most recent release is
+[1.3.0-rc2](https://github.com/google/tink/releases/tag/v1.3.0-rc2), released
+2019-09-25. API docs can be found
+[here](https://google.github.com/tink/javadoc/apps-rewardedads/1.3.0-rc2).
+
+The Maven group ID is `com.google.crypto.tink`, and the artifact ID is
+`apps-rewardedads`.
+
+To add a dependency using Maven:
+
+```xml
+<dependency>
+  <groupId>com.google.crypto.tink</groupId>
+  <artifactId>apps-rewardedads</artifactId>
+  <version>1.3.0-rc2</version>
+</dependency>
+```
+
+## Snapshots
 
 Snapshots of this app built from the master branch are available through Maven
 using version `HEAD-SNAPSHOT`. API docs can be found
diff --git a/apps/rewardedads/src/main/java/com/google/crypto/tink/apps/rewardedads/RewardedAdsVerifier.java b/apps/rewardedads/src/main/java/com/google/crypto/tink/apps/rewardedads/RewardedAdsVerifier.java
index 2fb19fb..8cc1460 100644
--- a/apps/rewardedads/src/main/java/com/google/crypto/tink/apps/rewardedads/RewardedAdsVerifier.java
+++ b/apps/rewardedads/src/main/java/com/google/crypto/tink/apps/rewardedads/RewardedAdsVerifier.java
@@ -205,12 +205,12 @@
      * {
      *   "keys": [
      *     {
-     *       key_id: 1916455855,
+     *       keyId: 1916455855,
      *       pem: "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUaWMKcBHWdhUE+DncSIHhFCLLEln\nUs0LB9oanZ4K/FNICIM8ltS4nzc9yjmhgVQOlmSS6unqvN9t8sqajRTPcw==\n-----END PUBLIC KEY-----"
      *       base64: "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUaWMKcBHWdhUE+DncSIHhFCLLElnUs0LB9oanZ4K/FNICIM8ltS4nzc9yjmhgVQOlmSS6unqvN9t8sqajRTPcw=="
      *     },
      *     {
-     *       key_id: 3901585526,
+     *       keyId: 3901585526,
      *       pem: "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEtxg2BsK/fllIeADtLspezS6YfHFWXZ8tiJncm8LDBa/NxEC84akdWbWDCUrMMGIV27/3/e7UuKSEonjGvaDUsw==\n-----END PUBLIC KEY-----"
      *       base64: "MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEtxg2BsK/fllIeADtLspezS6YfHFWXZ8tiJncm8LDBa/NxEC84akdWbWDCUrMMGIV27/3/e7UuKSEonjGvaDUsw=="
      *     },
diff --git a/apps/webpush/BUILD.bazel b/apps/webpush/BUILD.bazel
index 167a623..a55268a 100644
--- a/apps/webpush/BUILD.bazel
+++ b/apps/webpush/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//visibility:public"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 load("//tools/build_defs:javac.bzl", "JAVACOPTS_OSS")
 
@@ -40,7 +40,7 @@
     deps = [
         ":webpush",
         "//java:testonly",
-        "@junit",
+        "@maven//:junit_junit",
     ],
 )
 
diff --git a/apps/webpush/README.md b/apps/webpush/README.md
index b4ef951..42bf3d4 100644
--- a/apps/webpush/README.md
+++ b/apps/webpush/README.md
@@ -11,7 +11,7 @@
 <dependency>
   <groupId>com.google.crypto.tink</groupId>
   <artifactId>apps-webpush</artifactId>
-  <version>1.2.2</version>
+  <version>1.3.0-rc2</version>
 </dependency>
 ```
 
@@ -19,7 +19,7 @@
 
 ```
 dependencies {
-  compile 'com.google.crypto.tink:apps-webpush:1.2.2'
+  compile 'com.google.crypto.tink:apps-webpush:1.3.0-rc2'
 }
 ```
 
diff --git a/cc/BUILD.bazel b/cc/BUILD.bazel
index 16c5f51..0c73819 100644
--- a/cc/BUILD.bazel
+++ b/cc/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 load("//:tink_version.bzl", "TINK_VERSION_LABEL")
 load("//tools:common.bzl", "template_rule")
@@ -26,6 +26,7 @@
     "hybrid_encrypt.h",
     "hybrid_encrypt_factory.h",
     "hybrid_key_templates.h",
+    "input_stream.h",
     "json_keyset_reader.h",
     "json_keyset_writer.h",
     "key_manager.h",
@@ -38,13 +39,20 @@
     "mac_config.h",
     "mac_factory.h",
     "mac_key_templates.h",
+    "output_stream_with_result.h",
+    "output_stream.h",
     "public_key_sign.h",
     "public_key_sign_factory.h",
     "public_key_verify.h",
     "public_key_verify_factory.h",
+    "random_access_stream.h",
     "registry.h",
     "signature_config.h",
     "signature_key_templates.h",
+    "streaming_aead.h",
+    "streaming_aead_config.h",
+    "streaming_aead_key_templates.h",
+    "streaming_mac.h",
     "tink_config.h",
     "version.h",
 ]
@@ -58,16 +66,22 @@
     ":hybrid_encrypt",
     ":json_keyset_reader",
     ":json_keyset_writer",
+    ":input_stream",
     ":key_manager",
     ":keyset_handle",
     ":keyset_manager",
-    ":public_key_sign",
-    ":public_key_verify",
     ":keyset_reader",
     ":keyset_writer",
     ":kms_client",
     ":mac",
+    ":output_stream_with_result",
+    ":output_stream",
     ":primitive_set",
+    ":public_key_sign",
+    ":public_key_verify",
+    ":streaming_aead",
+    ":streaming_mac",
+    ":random_access_stream",
     ":registry",
     ":registry_impl",
     ":version",
@@ -89,6 +103,9 @@
     "//cc/signature:public_key_verify_factory",
     "//cc/signature:signature_config",
     "//cc/signature:signature_key_templates",
+    "//cc/streamingaead:streaming_aead_config",
+    "//cc/streamingaead:streaming_aead_key_templates",
+    "//cc/util:buffer",
     "//cc/util:errors",
     "//cc/util:protobuf_helper",
     "//cc/util:status",
@@ -114,6 +131,7 @@
     hdrs = ["input_stream.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         "//cc/util:status",
         "//cc/util:statusor",
@@ -125,6 +143,7 @@
     hdrs = ["output_stream.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         "//cc/util:status",
         "//cc/util:statusor",
@@ -132,10 +151,37 @@
 )
 
 cc_library(
+    name = "random_access_stream",
+    hdrs = ["random_access_stream.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
+    deps = [
+        "//cc/util:buffer",
+        "//cc/util:status",
+        "//cc/util:statusor",
+    ],
+)
+
+cc_library(
+    name = "output_stream_with_result",
+    hdrs = ["output_stream_with_result.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
+    deps = [
+        ":output_stream",
+        "//cc/util:status",
+        "//cc/util:statusor",
+    ],
+)
+
+cc_library(
     name = "aead",
     hdrs = ["aead.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         "//cc/util:statusor",
         "@com_google_absl//absl/strings",
@@ -147,6 +193,7 @@
     hdrs = ["deterministic_aead.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         "//cc/util:statusor",
         "@com_google_absl//absl/strings",
@@ -158,9 +205,25 @@
     hdrs = ["streaming_aead.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         ":input_stream",
         ":output_stream",
+        ":random_access_stream",
+        "//cc/util:statusor",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
+cc_library(
+    name = "streaming_mac",
+    hdrs = ["streaming_mac.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
+    deps = [
+        ":output_stream_with_result",
+        "//cc/util:status",
         "//cc/util:statusor",
         "@com_google_absl//absl/strings",
     ],
@@ -171,6 +234,7 @@
     hdrs = ["hybrid_decrypt.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         "//cc/util:statusor",
         "@com_google_absl//absl/strings",
@@ -182,6 +246,7 @@
     hdrs = ["hybrid_encrypt.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         "//cc/util:statusor",
         "@com_google_absl//absl/strings",
@@ -193,6 +258,7 @@
     hdrs = ["mac.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         "//cc/util:status",
         "//cc/util:statusor",
@@ -205,6 +271,7 @@
     hdrs = ["public_key_sign.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         "//cc/util:statusor",
         "@com_google_absl//absl/strings",
@@ -216,6 +283,7 @@
     hdrs = ["public_key_verify.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         "//cc/util:status",
         "@com_google_absl//absl/strings",
@@ -227,6 +295,7 @@
     hdrs = ["keyset_reader.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         "//cc/util:statusor",
         "//proto:tink_cc_proto",
@@ -238,6 +307,7 @@
     hdrs = ["keyset_writer.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         "//cc/util:status",
         "//proto:tink_cc_proto",
@@ -250,6 +320,7 @@
     hdrs = ["binary_keyset_reader.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         ":keyset_reader",
         "//cc/util:errors",
@@ -267,6 +338,7 @@
     hdrs = ["binary_keyset_writer.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         ":keyset_writer",
         "//cc/util:errors",
@@ -284,6 +356,7 @@
     hdrs = ["json_keyset_reader.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         ":keyset_reader",
         "//cc/util:enums",
@@ -303,6 +376,7 @@
     hdrs = ["json_keyset_writer.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         ":keyset_writer",
         "//cc/util:enums",
@@ -324,6 +398,7 @@
     deps = [
         ":key_manager",
         "//cc/util:statusor",
+        "@com_google_absl//absl/base:core_headers",
     ],
 )
 
@@ -334,23 +409,15 @@
     include_prefix = "tink",
     strip_include_prefix = "/cc",
     deps = [
-        ":aead",
         ":catalogue",
-        ":deterministic_aead",
-        ":hybrid_decrypt",
-        ":hybrid_encrypt",
         ":key_manager",
-        ":mac",
-        ":public_key_sign",
-        ":public_key_verify",
         ":registry",
-        "//cc/aead:aead_wrapper",
-        "//cc/daead:deterministic_aead_wrapper",
-        "//cc/hybrid:hybrid_decrypt_wrapper",
-        "//cc/hybrid:hybrid_encrypt_wrapper",
-        "//cc/mac:mac_wrapper",
-        "//cc/signature:public_key_sign_wrapper",
-        "//cc/signature:public_key_verify_wrapper",
+        "//cc/aead:aead_config",
+        "//cc/daead:deterministic_aead_config",
+        "//cc/hybrid:hybrid_config",
+        "//cc/mac:mac_config",
+        "//cc/signature:signature_config",
+        "//cc/streamingaead:streaming_aead_config",
         "//cc/util:errors",
         "//cc/util:status",
         "//cc/util:statusor",
@@ -420,6 +487,10 @@
     strip_include_prefix = "/cc",
     deps = [
         ":catalogue",
+        ":core/key_manager_impl",
+        ":core/key_type_manager",
+        ":core/private_key_manager_impl",
+        ":core/private_key_type_manager",
         ":key_manager",
         ":primitive_set",
         ":primitive_wrapper",
@@ -440,7 +511,7 @@
     src = "version.h.templ",
     out = "version.h",
     substitutions = {
-        "TINK_VERSION_LABEL": "%s" % TINK_VERSION_LABEL,
+        "@TINK_VERSION_LABEL@": "%s" % TINK_VERSION_LABEL,
     },
 )
 
@@ -458,6 +529,7 @@
     hdrs = ["keyset_handle.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         ":aead",
         ":key_manager",
@@ -504,23 +576,6 @@
 )
 
 cc_library(
-    name = "key_manager_base",
-    hdrs = ["core/key_manager_base.h"],
-    include_prefix = "tink",
-    strip_include_prefix = "/cc",
-    deps = [
-        ":key_manager",
-        "//cc/util:constants",
-        "//cc/util:errors",
-        "//cc/util:statusor",
-        "//proto:tink_cc_proto",
-        "@com_google_absl//absl/base",
-        "@com_google_absl//absl/memory",
-        "@com_google_absl//absl/strings",
-    ],
-)
-
-cc_library(
     name = "keyset_manager",
     srcs = ["core/keyset_manager.cc"],
     hdrs = ["keyset_manager.h"],
@@ -555,6 +610,84 @@
     ],
 )
 
+cc_library(
+    name = "kms_clients",
+    srcs = ["core/kms_clients.cc"],
+    hdrs = ["kms_clients.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":kms_client",
+        "//cc/util:errors",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@com_google_absl//absl/base",
+        "@com_google_absl//absl/strings",
+        "@com_google_absl//absl/synchronization",
+    ],
+)
+
+cc_library(
+    name = "core/template_util",
+    hdrs = ["core/template_util.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = ["@com_google_absl//absl/meta:type_traits"],
+)
+
+cc_library(
+    name = "core/key_type_manager",
+    hdrs = ["core/key_type_manager.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":core/template_util",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//proto:tink_cc_proto",
+        "@com_google_absl//absl/container:flat_hash_map",
+    ],
+)
+
+cc_library(
+    name = "core/key_manager_impl",
+    hdrs = ["core/key_manager_impl.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":core/key_type_manager",
+        ":key_manager",
+        "//cc/util:constants",
+        "//cc/util:status",
+        "//proto:tink_cc_proto",
+        "@com_google_absl//absl/base:core_headers",
+    ],
+)
+
+cc_library(
+    name = "core/private_key_type_manager",
+    hdrs = ["core/private_key_type_manager.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":core/key_type_manager",
+        "//cc/util:statusor",
+    ],
+)
+
+cc_library(
+    name = "core/private_key_manager_impl",
+    hdrs = ["core/private_key_manager_impl.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":core/key_manager_impl",
+        ":core/private_key_type_manager",
+        ":key_manager",
+        "//cc/util:validation",
+    ],
+)
+
 # Settings for building in various environments.
 config_setting(
     name = "linux_x86_64",
@@ -623,11 +756,11 @@
         ":linux_x86_64": "tar -cv -f $@ --dereference --transform \"s/^cc/tink/\" " +
                          "    --show-transformed-names `find cc/ -name \"*.h\"`; " +
                          "tar -rv -f $@ -C $(GENDIR) --dereference " +
-                         "    `cd $(GENDIR); find proto/ -name \"*.pb.h\"`",
+                         "    `cd $(GENDIR); find proto/ -name \"*.pb.h\" -or -name \"*.inc\"`",
         ":mac_x86_64": "tar -cv -f $@ --dereference -s \"/^cc/tink/p\" " +
                        "    `find cc/ -name \"*.h\"`; " +
                        "tar -rv -f $@ -C $(GENDIR) --dereference " +
-                       "    `cd $(GENDIR); find proto/ -name \"*.pb.h\"`",
+                       "    `cd $(GENDIR); find proto/ -name \"*.pb.h\" -or -name \"*.inc\"`",
     }),
     local = 1,  # To avoid sandboxing; otherwise cannot access srcs.
 )
@@ -642,15 +775,12 @@
         "tink_deps_headers.tar",
     ],
     # The command below collects headers of Tink dependencies in two steps:
-    #  * First a tar-archive with all Abseil .h-files is created.
-    #  * Then, absl .inc files are added to the tar-archive.
-    #  * Then .h-files of Protobuf library are added to the tar-archive.
+    #  * First a tar-archive with all Abseil .h and .inc-files is created.
+    #  * Then .h and .inc files of Protobuf library are added to the tar-archive.
     cmd = "tar -cv -f $@ -C external/com_google_absl --dereference " +
-          "    `cd external/com_google_absl; find absl/ -name \"*.h\"`; " +
-          "tar -rv -f $@ -C external/com_google_absl --dereference " +
-          "    `cd external/com_google_absl; find absl/ -name \"*.inc\"`; " +
+          "    `cd external/com_google_absl; find absl/ -name \"*.h\" -or -name \"*.inc\"`; " +
           "tar -rv -f $@ -C external/com_google_protobuf/src --dereference " +
-          "    `cd external/com_google_protobuf/src/; find google/ -name \"*.h\"`",
+          "    `cd external/com_google_protobuf/src/; find google/ -name \"*.h\" -or -name \"*.inc\"`",
     local = 1,  # To avoid sandboxing; otherwise cannot access srcs.
     tags = [
         "manual",  # Does not run on OSX yet.  TODO(b/78299422)
@@ -698,22 +828,27 @@
     deps = [
         ":aead",
         ":catalogue",
+        ":core/key_manager_impl",
+        ":core/key_type_manager",
         ":crypto_format",
         ":keyset_manager",
         ":registry",
-        "//cc/aead:aead_catalogue",
         "//cc/aead:aead_wrapper",
         "//cc/aead:aes_gcm_key_manager",
         "//cc/hybrid:ecies_aead_hkdf_private_key_manager",
         "//cc/hybrid:ecies_aead_hkdf_public_key_manager",
-        "//cc/util:keyset_util",
+        "//cc/subtle:aes_gcm_boringssl",
+        "//cc/subtle:random",
         "//cc/util:protobuf_helper",
         "//cc/util:status",
         "//cc/util:statusor",
+        "//cc/util:test_keyset_handle",
+        "//cc/util:test_matchers",
         "//cc/util:test_util",
         "//proto:aes_ctr_hmac_aead_cc_proto",
         "//proto:aes_gcm_cc_proto",
         "//proto:common_cc_proto",
+        "//proto:ecdsa_cc_proto",
         "//proto:tink_cc_proto",
         "@com_google_absl//absl/memory",
         "@com_google_googletest//:gtest_main",
@@ -827,6 +962,7 @@
         ":binary_keyset_reader",
         ":cleartext_keyset_handle",
         ":config",
+        ":core/key_manager_impl",
         ":json_keyset_reader",
         ":json_keyset_writer",
         ":keyset_handle",
@@ -837,8 +973,8 @@
         "//cc/config:tink_config",
         "//cc/signature:ecdsa_sign_key_manager",
         "//cc/signature:signature_key_templates",
-        "//cc/util:keyset_util",
         "//cc/util:protobuf_helper",
+        "//cc/util:test_keyset_handle",
         "//cc/util:test_matchers",
         "//cc/util:test_util",
         "//proto:tink_cc_proto",
@@ -871,7 +1007,7 @@
         ":keyset_manager",
         "//cc/aead:aead_config",
         "//cc/aead:aes_gcm_key_manager",
-        "//cc/util:keyset_util",
+        "//cc/util:test_keyset_handle",
         "//cc/util:test_util",
         "//proto:aes_gcm_cc_proto",
         "//proto:tink_cc_proto",
@@ -889,7 +1025,7 @@
         ":cleartext_keyset_handle",
         ":keyset_handle",
         ":keyset_reader",
-        "//cc/util:keyset_util",
+        "//cc/util:test_keyset_handle",
         "//cc/util:test_util",
         "//proto:tink_cc_proto",
         "@com_google_googletest//:gtest_main",
@@ -906,8 +1042,88 @@
         ":mac",
         ":primitive_set",
         "//cc/util:protobuf_helper",
+        "//cc/util:test_matchers",
         "//cc/util:test_util",
         "//proto:tink_cc_proto",
         "@com_google_googletest//:gtest_main",
     ],
 )
+
+cc_test(
+    name = "kms_clients_test",
+    size = "small",
+    srcs = ["core/kms_clients_test.cc"],
+    copts = ["-Iexternal/gtest/include"],
+    deps = [
+        ":aead",
+        ":kms_client",
+        ":kms_clients",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_matchers",
+        "//cc/util:test_util",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "core/template_util_test",
+    srcs = ["core/template_util_test.cc"],
+    deps = [
+        ":core/template_util",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "core/key_type_manager_test",
+    srcs = ["core/key_type_manager_test.cc"],
+    deps = [
+        ":aead",
+        ":core/key_type_manager",
+        "//cc/subtle",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_matchers",
+        "//cc/util:validation",
+        "//proto:aes_gcm_cc_proto",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "core/key_manager_impl_test",
+    srcs = ["core/key_manager_impl_test.cc"],
+    deps = [
+        ":aead",
+        ":core/key_manager_impl",
+        "//cc/subtle",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_matchers",
+        "//cc/util:test_util",
+        "//cc/util:validation",
+        "//proto:aes_gcm_cc_proto",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "core/private_key_manager_impl_test",
+    srcs = ["core/private_key_manager_impl_test.cc"],
+    deps = [
+        ":core/key_manager_impl",
+        ":core/private_key_manager_impl",
+        ":core/private_key_type_manager",
+        ":registry",
+        "//cc/subtle",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_matchers",
+        "//cc/util:test_util",
+        "//cc/util:validation",
+        "//proto:ecdsa_cc_proto",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index 2c67dfc..95cbd40 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -13,17 +13,6 @@
   public_configs = [ "//third_party/tink:tink_config" ]
 }
 
-# CC Library : deterministic_aead
-source_set("deterministic_aead") {
-  configs -= [ "//build/config:no_rtti" ]
-  sources = [ "deterministic_aead.h" ]
-  public_deps = [
-    "//third_party/tink/cc/util:statusor",
-    "//third_party/abseil-cpp/absl/strings:strings",
-  ]
-  public_configs = [ "//third_party/tink:tink_config" ]
-}
-
 # CC Library : hybrid_decrypt
 source_set("hybrid_decrypt") {
   configs -= [ "//build/config:no_rtti" ]
@@ -58,28 +47,6 @@
   public_configs = [ "//third_party/tink:tink_config" ]
 }
 
-# CC Library : public_key_sign
-source_set("public_key_sign") {
-  configs -= [ "//build/config:no_rtti" ]
-  sources = [ "public_key_sign.h" ]
-  public_deps = [
-    "//third_party/tink/cc/util:statusor",
-    "//third_party/abseil-cpp/absl/strings:strings",
-  ]
-  public_configs = [ "//third_party/tink:tink_config" ]
-}
-
-# CC Library : public_key_verify
-source_set("public_key_verify") {
-  configs -= [ "//build/config:no_rtti" ]
-  sources = [ "public_key_verify.h" ]
-  public_deps = [
-    "//third_party/tink/cc/util:status",
-    "//third_party/abseil-cpp/absl/strings:strings",
-  ]
-  public_configs = [ "//third_party/tink:tink_config" ]
-}
-
 # CC Library : keyset_reader
 source_set("keyset_reader") {
   configs -= [ "//build/config:no_rtti" ]
@@ -109,40 +76,7 @@
   public_deps = [
     ":key_manager",
     "//third_party/tink/cc/util:statusor",
-  ]
-  public_configs = [ "//third_party/tink:tink_config" ]
-}
-
-# CC Library : config
-source_set("config") {
-  configs -= [ "//build/config:no_rtti" ]
-  sources = [
-    "config.h",
-    "core/config.cc",
-  ]
-  public_deps = [
-    ":aead",
-    ":catalogue",
-    ":deterministic_aead",
-    ":hybrid_decrypt",
-    ":hybrid_encrypt",
-    ":key_manager",
-    ":mac",
-    ":public_key_sign",
-    ":public_key_verify",
-    ":registry",
-    "//third_party/tink/cc/aead:aead_wrapper",
-    "//third_party/tink/cc/daead:deterministic_aead_wrapper",
-    "//third_party/tink/cc/hybrid:hybrid_decrypt_wrapper",
-    "//third_party/tink/cc/hybrid:hybrid_encrypt_wrapper",
-    "//third_party/tink/cc/mac:mac_wrapper",
-    "//third_party/tink/cc/signature:public_key_sign_wrapper",
-    "//third_party/tink/cc/signature:public_key_verify_wrapper",
-    "//third_party/tink/cc/util:errors",
-    "//third_party/tink/cc/util:status",
-    "//third_party/tink/cc/util:statusor",
-    "//third_party/tink/proto:config_proto",
-    "//third_party/abseil-cpp/absl/strings:strings",
+    "//third_party/abseil-cpp/absl/base:core_headers",
   ]
   public_configs = [ "//third_party/tink:tink_config" ]
 }
@@ -261,3 +195,34 @@
   public_configs = [ "//third_party/tink:tink_config" ]
 }
 
+# CC Library : kms_client
+source_set("kms_client") {
+  configs -= [ "//build/config:no_rtti" ]
+  sources = [ "kms_client.h" ]
+  public_deps = [
+    ":aead",
+    "//third_party/tink/cc/util:statusor",
+    "//third_party/abseil-cpp/absl/strings:strings",
+  ]
+  public_configs = [ "//third_party/tink:tink_config" ]
+}
+
+# CC Library : kms_clients
+source_set("kms_clients") {
+  configs -= [ "//build/config:no_rtti" ]
+  sources = [
+    "core/kms_clients.cc",
+    "kms_clients.h",
+  ]
+  public_deps = [
+    ":kms_client",
+    "//third_party/tink/cc/util:errors",
+    "//third_party/tink/cc/util:status",
+    "//third_party/tink/cc/util:statusor",
+    "//third_party/abseil-cpp/absl/base:base",
+    "//third_party/abseil-cpp/absl/strings:strings",
+    "//third_party/abseil-cpp/absl/synchronization:synchronization",
+  ]
+  public_configs = [ "//third_party/tink:tink_config" ]
+}
+
diff --git a/cc/CMakeLists.txt b/cc/CMakeLists.txt
new file mode 100644
index 0000000..f78a367
--- /dev/null
+++ b/cc/CMakeLists.txt
@@ -0,0 +1,866 @@
+add_subdirectory(aead)
+add_subdirectory(config)
+add_subdirectory(daead)
+add_subdirectory(hybrid)
+add_subdirectory(mac)
+add_subdirectory(signature)
+add_subdirectory(streamingaead)
+add_subdirectory(subtle)
+add_subdirectory(util)
+
+tink_module(core)
+
+# public libraries
+
+set(TINK_VERSION_H "${TINK_GENFILE_DIR}/tink/version.h")
+
+set(TINK_PUBLIC_APIS
+  aead.h
+  aead_config.h
+  aead_factory.h
+  aead_key_templates.h
+  binary_keyset_reader.h
+  binary_keyset_writer.h
+  catalogue.h
+  config.h
+  deterministic_aead.h
+  deterministic_aead_config.h
+  deterministic_aead_factory.h
+  deterministic_aead_key_templates.h
+  hybrid_config.h
+  hybrid_decrypt.h
+  hybrid_decrypt_factory.h
+  hybrid_encrypt.h
+  hybrid_encrypt_factory.h
+  hybrid_key_templates.h
+  input_stream.h
+  json_keyset_reader.h
+  json_keyset_writer.h
+  key_manager.h
+  keyset_handle.h
+  keyset_manager.h
+  keyset_reader.h
+  keyset_writer.h
+  kms_client.h
+  mac.h
+  mac_config.h
+  mac_factory.h
+  mac_key_templates.h
+  output_stream_with_result.h
+  output_stream.h
+  public_key_sign.h
+  public_key_sign_factory.h
+  public_key_verify.h
+  public_key_verify_factory.h
+  random_access_stream.h
+  registry.h
+  signature_config.h
+  signature_key_templates.h
+  streaming_aead.h
+  streaming_aead_config.h
+  streaming_aead_key_templates.h
+  streaming_mac.h
+  tink_config.h
+  "${TINK_VERSION_H}"
+)
+
+set(TINK_PUBLIC_API_DEPS
+  tink::core::aead
+  tink::core::binary_keyset_reader
+  tink::core::binary_keyset_writer
+  tink::core::cleartext_keyset_handle
+  tink::core::deterministic_aead
+  tink::core::hybrid_decrypt
+  tink::core::hybrid_encrypt
+  tink::core::input_stream
+  tink::core::json_keyset_reader
+  tink::core::json_keyset_writer
+  tink::core::key_manager
+  tink::core::keyset_handle
+  tink::core::keyset_manager
+  tink::core::keyset_reader
+  tink::core::keyset_writer
+  tink::core::kms_client
+  tink::core::output_stream_with_result
+  tink::core::output_stream
+  tink::core::public_key_sign
+  tink::core::public_key_verify
+  tink::core::mac
+  tink::core::primitive_set
+  tink::core::random_access_stream
+  tink::core::registry
+  tink::core::registry_impl
+  tink::core::streaming_aead
+  tink::core::streaming_mac
+  tink::core::version
+  tink::aead::aead_config
+  tink::aead::aead_factory
+  tink::aead::aead_key_templates
+  tink::config::tink_config
+  tink::daead::deterministic_aead_config
+  tink::daead::deterministic_aead_factory
+  tink::daead::deterministic_aead_key_templates
+  tink::hybrid::hybrid_config
+  tink::hybrid::hybrid_decrypt_factory
+  tink::hybrid::hybrid_encrypt_factory
+  tink::hybrid::hybrid_key_templates
+  tink::mac::mac_config
+  tink::mac::mac_factory
+  tink::mac::mac_key_templates
+  tink::signature::public_key_sign_factory
+  tink::signature::public_key_verify_factory
+  tink::signature::signature_config
+  tink::signature::signature_key_templates
+  tink::streamingaead::streaming_aead_config
+  tink::streamingaead::streaming_aead_key_templates
+  tink::util::buffer
+  tink::util::errors
+  tink::util::protobuf_helper
+  tink::util::status
+  tink::util::statusor
+  tink::util::validation
+  absl::base
+  absl::memory
+  absl::strings
+  absl::synchronization
+)
+
+tink_cc_library(
+  NAME cc
+  SRCS ${TINK_PUBLIC_APIS}
+  DEPS ${TINK_PUBLIC_API_DEPS}
+  PUBLIC
+)
+
+add_library(tink::static ALIAS tink_core_cc)
+
+tink_cc_library(
+  NAME input_stream
+  SRCS input_stream.h
+  DEPS
+    tink::util::status
+    tink::util::statusor
+)
+
+tink_cc_library(
+  NAME output_stream
+  SRCS output_stream.h
+  DEPS
+    tink::util::status
+    tink::util::statusor
+)
+
+tink_cc_library(
+  NAME random_access_stream
+  SRCS random_access_stream.h
+  DEPS
+    tink::util::buffer
+    tink::util::status
+    tink::util::statusor
+)
+
+tink_cc_library(
+  NAME output_stream_with_result
+  SRCS output_stream_with_result.h
+  DEPS
+    tink::core::output_stream_with_result
+    tink::util::status
+    tink::util::statusor
+)
+
+tink_cc_library(
+  NAME aead
+  SRCS aead.h
+  DEPS
+    tink::util::statusor
+    absl::strings
+)
+
+tink_cc_library(
+  NAME deterministic_aead
+  SRCS deterministic_aead.h
+  DEPS
+    tink::util::statusor
+    absl::strings
+)
+
+tink_cc_library(
+  NAME streaming_aead
+  SRCS streaming_aead.h
+  DEPS
+    tink::core::input_stream
+    tink::core::output_stream
+    tink::core::random_access_stream
+    tink::util::statusor
+    absl::strings
+)
+
+tink_cc_library(
+  NAME streaming_mac
+  SRCS streaming_mac.h
+  DEPS
+    tink::core::output_stream_with_result
+    tink::util::status
+    tink::util::statusor
+    absl::strings
+)
+
+tink_cc_library(
+  NAME hybrid_decrypt
+  SRCS hybrid_decrypt.h
+  DEPS
+    tink::util::statusor
+    absl::strings
+)
+
+tink_cc_library(
+  NAME hybrid_encrypt
+  SRCS hybrid_encrypt.h
+  DEPS
+    tink::util::statusor
+    absl::strings
+)
+
+tink_cc_library(
+  NAME mac
+  SRCS mac.h
+  DEPS
+    tink::util::status
+    tink::util::statusor
+    absl::strings
+)
+
+tink_cc_library(
+  NAME public_key_sign
+  SRCS public_key_sign.h
+  DEPS
+    tink::util::statusor
+    absl::strings
+)
+
+tink_cc_library(
+  NAME public_key_verify
+  SRCS public_key_verify.h
+  DEPS
+    tink::util::status
+    absl::strings
+)
+
+tink_cc_library(
+  NAME keyset_reader
+  SRCS keyset_reader.h
+  DEPS
+    tink::util::statusor
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_library(
+  NAME keyset_writer
+  SRCS keyset_writer.h
+  DEPS
+    tink::util::status
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_library(
+  NAME binary_keyset_reader
+  SRCS
+    core/binary_keyset_reader.cc
+    binary_keyset_reader.h
+  DEPS
+    tink::core::keyset_reader
+    tink::util::errors
+    tink::util::statusor
+    tink::proto::tink_cc_proto
+    absl::memory
+    absl::strings
+    protobuf::libprotobuf-lite
+)
+
+tink_cc_library(
+  NAME binary_keyset_writer
+  SRCS
+    core/binary_keyset_writer.cc
+    binary_keyset_writer.h
+  DEPS
+    tink::core::keyset_writer
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::proto::tink_cc_proto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME json_keyset_reader
+  SRCS
+    core/json_keyset_reader.cc
+    json_keyset_reader.h
+  DEPS
+    tink::core::keyset_reader
+    tink::util::enums
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::statusor
+    tink::proto::tink_cc_proto
+    absl::memory
+    absl::strings
+    rapidjson
+)
+
+tink_cc_library(
+  NAME json_keyset_writer
+  SRCS
+    core/json_keyset_writer.cc
+    json_keyset_writer.h
+  DEPS
+    tink::core::keyset_writer
+    tink::util::enums
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::proto::tink_cc_proto
+    absl::strings
+    rapidjson
+)
+
+tink_cc_library(
+  NAME catalogue
+  SRCS catalogue.h
+  DEPS
+    tink::core::key_manager
+    tink::util::statusor
+    absl::base
+)
+
+tink_cc_library(
+  NAME config
+  SRCS
+    core/config.cc
+    config.h
+  DEPS
+    tink::core::catalogue
+    tink::core::key_manager
+    tink::core::registry
+    tink::aead::aead_config
+    tink::daead::deterministic_aead_config
+    tink::hybrid::hybrid_config
+    tink::mac::mac_config
+    tink::signature::signature_config
+    tink::streamingaead::streaming_aead_config
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    tink::proto::config_cc_proto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME crypto_format
+  SRCS
+    core/crypto_format.cc
+    crypto_format.h
+  DEPS
+    tink::util::errors
+    tink::util::statusor
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_library(
+  NAME primitive_set
+  SRCS primitive_set.h
+  DEPS
+    tink::core::crypto_format
+    tink::util::errors
+    tink::util::statusor
+    tink::proto::tink_cc_proto
+    absl::memory
+    absl::synchronization
+)
+
+tink_cc_library(
+  NAME primitive_wrapper
+  SRCS primitive_wrapper.h
+  DEPS
+    tink::core::primitive_set
+    tink::util::statusor
+)
+
+tink_cc_library(
+  NAME registry
+  SRCS registry.h
+  DEPS
+    tink::core::registry_impl
+    tink::util::status
+    tink::util::statusor
+    absl::strings
+)
+
+tink_cc_library(
+  NAME registry_impl
+  SRCS
+    core/registry_impl.cc
+    core/registry_impl.h
+  DEPS
+    tink::core::catalogue
+    tink::core::key_manager
+    tink::core::key_type_manager
+    tink::core::key_manager_impl
+    tink::core::private_key_manager_impl
+    tink::core::private_key_type_manager
+    tink::core::primitive_set
+    tink::core::primitive_wrapper
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::util::validation
+    tink::proto::tink_cc_proto
+    absl::base
+    absl::strings
+    absl::synchronization
+)
+
+configure_file(version.h.templ "${TINK_VERSION_H}")
+
+tink_cc_library(
+  NAME version
+  SRCS
+    core/version.cc
+    "${TINK_VERSION_H}"
+)
+
+tink_cc_library(
+  NAME keyset_handle
+  SRCS
+    core/keyset_handle.cc
+    keyset_handle.h
+  DEPS
+    tink::core::aead
+    tink::core::key_manager
+    tink::core::keyset_reader
+    tink::core::keyset_writer
+    tink::core::primitive_set
+    tink::core::registry
+    tink::util::errors
+    tink::proto::tink_cc_proto
+    absl::memory
+)
+
+tink_cc_library(
+  NAME cleartext_keyset_handle
+  SRCS
+    core/cleartext_keyset_handle.cc
+    cleartext_keyset_handle.h
+  DEPS
+    tink::core::keyset_handle
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_library(
+  NAME key_manager
+  SRCS
+    core/key_manager.cc
+    key_manager.h
+  DEPS
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::proto::tink_cc_proto
+    absl::memory
+    absl::strings
+)
+
+tink_cc_library(
+  NAME keyset_manager
+  SRCS
+    core/keyset_manager.cc
+    keyset_manager.h
+  DEPS
+    tink::core::keyset_handle
+    tink::core::keyset_reader
+    tink::core::registry
+    tink::util::enums
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::proto::tink_cc_proto
+    absl::base
+    absl::memory
+    absl::synchronization
+  PUBLIC
+)
+
+add_library(tink::keyset_manager ALIAS tink_core_keyset_manager)
+
+tink_cc_library(
+  NAME kms_client
+  SRCS kms_client.h
+  DEPS
+    tink::core::aead
+    tink::util::statusor
+    absl::strings
+)
+
+tink_cc_library(
+  NAME kms_clients
+  SRCS
+    core/kms_clients.cc
+    kms_clients.h
+  DEPS
+    tink::core::kms_client
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    absl::base
+    absl::strings
+    absl::synchronization
+)
+
+tink_cc_library(
+  NAME template_util
+  SRCS
+    core/template_util.h
+  DEPS
+    absl::meta
+)
+
+tink_cc_library(
+  NAME key_type_manager
+  SRCS
+    core/key_type_manager.h
+  DEPS
+    absl::hash
+    absl::flat_hash_map
+    tink::proto::tink_cc_proto
+    tink::util::status
+    tink::util::statusor
+)
+
+tink_cc_library(
+  NAME key_manager_impl
+  SRCS
+    core/key_manager_impl.h
+  DEPS
+    tink::core::key_manager
+    tink::core::key_type_manager
+    tink::proto::tink_cc_proto
+    tink::util::constants
+    tink::util::status
+    absl::base
+)
+
+tink_cc_library(
+  NAME private_key_type_manager
+  SRCS
+    core/private_key_type_manager.h
+  DEPS
+    tink::core::key_type_manager
+    tink::util::statusor
+)
+
+tink_cc_library(
+  NAME private_key_manager_impl
+  SRCS
+    core/private_key_manager_impl.h
+  DEPS
+    tink::core::private_key_type_manager
+    tink::core::key_manager_impl
+    tink::core::key_manager
+    tink::util::validation
+)
+
+if (TINK_BUILD_SHARED_LIB)
+  add_library(tink SHARED
+    ${TINK_PUBLIC_APIS}
+    version_script.lds
+    exported_symbols.lds
+  )
+
+  if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
+    target_link_libraries(tink
+      PRIVATE
+        -fuse-ld=gold  # GNU ld does not support ICF.
+        -Wl,--version-script="${CMAKE_CURRENT_SOURCE_DIR}/version_script.lds"
+        -Wl,--gc-sections
+        -Wl,--icf=all
+        -Wl,--strip-all
+    )
+  elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+    target_link_libraries(tink
+      PRIVATE
+        -Wl,-install_name,@rpath/libtink.so
+        -Wl,-exported_symbols_list="${CMAKE_CURRENT_SOURCE_DIR}/exported_symbols.lds"
+        -Wl,-x
+        -Wl,-dead_strip
+    )
+  else()
+    message(FATAL_ERROR "libtink not yet supported on your platform")
+  endif()
+
+  target_include_directories(tink PUBLIC ${TINK_INCLUDE_DIRS})
+  target_link_libraries(tink
+    PRIVATE
+      -Wl,--whole-archive
+      ${TINK_PUBLIC_API_DEPS}
+      -Wl,--no-whole-archive
+  )
+  set_target_properties(tink PROPERTIES SOVERSION ${TINK_VERSION_LABEL})
+
+  install(TARGETS tink EXPORT Tink LIBRARY DESTINATION "lib")
+endif()
+
+# tests
+
+tink_cc_test(
+  NAME registry_test
+  SRCS core/registry_test.cc
+  DEPS
+    tink::core::aead
+    tink::core::catalogue
+    tink::core::crypto_format
+    tink::core::key_manager_impl
+    tink::core::key_type_manager
+    tink::core::keyset_manager
+    tink::core::registry
+    tink::aead::aead_wrapper
+    tink::aead::aes_gcm_key_manager
+    tink::hybrid::ecies_aead_hkdf_private_key_manager
+    tink::hybrid::ecies_aead_hkdf_public_key_manager
+    tink::util::test_keyset_handle
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+    tink::util::test_matchers
+    tink::proto::aes_ctr_hmac_aead_cc_proto
+    tink::proto::aes_gcm_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::ecdsa_cc_proto
+    tink::proto::tink_cc_proto
+    absl::memory
+    gmock
+)
+
+tink_cc_test(
+  NAME version_test
+  SRCS core/version_test.cc
+  DEPS
+    tink::core::version
+    gmock
+)
+
+tink_cc_test(
+  NAME binary_keyset_reader_test
+  SRCS core/binary_keyset_reader_test.cc
+  DEPS
+    tink::core::binary_keyset_reader
+    tink::util::test_util
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME binary_keyset_writer_test
+  SRCS core/binary_keyset_writer_test.cc
+  DEPS
+    tink::core::binary_keyset_writer
+    tink::util::test_util
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME json_keyset_reader_test
+  SRCS core/json_keyset_reader_test.cc
+  DEPS
+    tink::core::json_keyset_reader
+    tink::util::protobuf_helper
+    tink::util::test_util
+    tink::proto::aes_eax_cc_proto
+    tink::proto::aes_gcm_cc_proto
+    tink::proto::tink_cc_proto
+    absl::strings
+)
+
+tink_cc_test(
+  NAME json_keyset_writer_test
+  SRCS core/json_keyset_writer_test.cc
+  DEPS
+    tink::core::json_keyset_reader
+    tink::core::json_keyset_writer
+    tink::util::protobuf_helper
+    tink::util::test_util
+    tink::proto::aes_eax_cc_proto
+    tink::proto::aes_gcm_cc_proto
+    tink::proto::tink_cc_proto
+    absl::strings
+    rapidjson
+)
+
+tink_cc_test(
+  NAME config_test
+  SRCS core/config_test.cc
+  DEPS
+    tink::core::config
+    tink::core::mac
+    tink::proto::config_cc_proto
+)
+
+tink_cc_test(
+  NAME crypto_format_test
+  SRCS core/crypto_format_test.cc
+  DEPS
+    tink::core::crypto_format
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME keyset_handle_test
+  SRCS core/keyset_handle_test.cc
+  DEPS
+    tink::core::binary_keyset_reader
+    tink::core::cleartext_keyset_handle
+    tink::core::config
+    tink::core::json_keyset_reader
+    tink::core::json_keyset_writer
+    tink::core::key_manager_impl
+    tink::core::keyset_handle
+    tink::static
+    tink::aead::aead_key_templates
+    tink::aead::aead_wrapper
+    tink::aead::aes_gcm_key_manager
+    tink::config::tink_config
+    tink::signature::ecdsa_sign_key_manager
+    tink::signature::signature_key_templates
+    tink::util::test_keyset_handle
+    tink::util::protobuf_helper
+    tink::util::test_matchers
+    tink::util::test_util
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME key_manager_test
+  SRCS core/key_manager_test.cc
+  DEPS
+    tink::core::key_manager
+    tink::util::status
+    tink::util::test_matchers
+    tink::proto::empty_cc_proto
+    gmock
+)
+
+tink_cc_test(
+  NAME keyset_manager_test
+  SRCS core/keyset_manager_test.cc
+  DEPS
+    tink::core::config
+    tink::core::keyset_handle
+    tink::core::keyset_manager
+    tink::aead::aead_config
+    tink::aead::aes_gcm_key_manager
+    tink::util::test_keyset_handle
+    tink::util::test_util
+    tink::proto::aes_gcm_cc_proto
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME cleartext_keyset_handle_test
+  SRCS core/cleartext_keyset_handle_test.cc
+  DEPS
+    tink::core::binary_keyset_reader
+    tink::core::cleartext_keyset_handle
+    tink::core::keyset_handle
+    tink::core::keyset_reader
+    tink::util::test_keyset_handle
+    tink::util::test_util
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME primitive_set_test
+  SRCS core/primitive_set_test.cc
+  DEPS
+    tink::core::crypto_format
+    tink::core::mac
+    tink::core::primitive_set
+    tink::util::protobuf_helper
+    tink::util::test_matchers
+    tink::util::test_util
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME kms_clients_test
+  SRCS core/kms_clients_test.cc
+  DEPS
+    absl::strings
+    tink::core::aead
+    tink::core::kms_client
+    tink::core::kms_clients
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::util::test_util
+)
+
+tink_cc_test(
+  NAME template_util_test
+  SRCS core/template_util_test.cc
+  DEPS
+    tink::core::template_util
+)
+
+tink_cc_test(
+  NAME key_type_manager_test
+  SRCS core/key_type_manager_test.cc
+  DEPS
+    tink::core::aead
+    tink::core::key_type_manager
+    tink::proto::aes_gcm_cc_proto
+    tink::proto::tink_cc_proto
+    tink::subtle::aes_gcm_boringssl
+    tink::subtle::random
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::util::validation
+)
+
+tink_cc_test(
+  NAME key_manager_impl_test
+  SRCS core/key_manager_impl_test.cc
+  DEPS
+    tink::core::aead
+    tink::core::key_manager_impl
+    tink::proto::aes_gcm_cc_proto
+    tink::proto::tink_cc_proto
+    tink::subtle::aes_gcm_boringssl
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::util::validation
+)
+
+tink_cc_test(
+  NAME private_key_manager_impl_test
+  SRCS core/private_key_manager_impl_test.cc
+  DEPS
+    tink::core::key_manager_impl
+    tink::core::private_key_type_manager
+    tink::proto::ecdsa_cc_proto
+    tink::proto::tink_cc_proto
+    tink::subtle::aes_gcm_boringssl
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::util::validation
+)
diff --git a/cc/aead/BUILD.bazel b/cc/aead/BUILD.bazel
index 6d183fc..57853a8 100644
--- a/cc/aead/BUILD.bazel
+++ b/cc/aead/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 cc_library(
     name = "aead_wrapper",
@@ -23,36 +23,26 @@
 )
 
 cc_library(
-    name = "aead_catalogue",
-    srcs = ["aead_catalogue.cc"],
-    hdrs = ["aead_catalogue.h"],
-    include_prefix = "tink",
-    strip_include_prefix = "/cc",
-    deps = [
-        ":aes_ctr_hmac_aead_key_manager",
-        ":aes_eax_key_manager",
-        ":aes_gcm_key_manager",
-        ":xchacha20_poly1305_key_manager",
-        "//cc:aead",
-        "//cc:catalogue",
-        "//cc:key_manager",
-        "//cc/util:status",
-    ],
-)
-
-cc_library(
     name = "aead_config",
     srcs = ["aead_config.cc"],
     hdrs = ["aead_config.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
-        ":aead_catalogue",
         ":aead_wrapper",
-        "//cc:config",
+        ":aes_ctr_hmac_aead_key_manager",
+        ":aes_eax_key_manager",
+        ":aes_gcm_key_manager",
+        ":aes_gcm_siv_key_manager",
+        ":kms_aead_key_manager",
+        ":kms_envelope_aead_key_manager",
+        ":xchacha20_poly1305_key_manager",
+        "//cc/config:config_util",
         "//cc/mac:mac_config",
         "//cc/util:status",
         "//proto:config_cc_proto",
+        "@com_google_absl//absl/base:core_headers",
         "@com_google_absl//absl/memory",
     ],
 )
@@ -82,10 +72,12 @@
     hdrs = ["aead_key_templates.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         "//proto:aes_ctr_hmac_aead_cc_proto",
         "//proto:aes_eax_cc_proto",
         "//proto:aes_gcm_cc_proto",
+        "//proto:aes_gcm_siv_cc_proto",
         "//proto:common_cc_proto",
         "//proto:tink_cc_proto",
         "//proto:xchacha20_poly1305_cc_proto",
@@ -94,22 +86,43 @@
 
 cc_library(
     name = "aes_eax_key_manager",
-    srcs = ["aes_eax_key_manager.cc"],
     hdrs = ["aes_eax_key_manager.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
     deps = [
         "//cc:aead",
-        "//cc:key_manager",
-        "//cc:key_manager_base",
+        "//cc:core/key_type_manager",
         "//cc/subtle:aes_eax_boringssl",
         "//cc/subtle:random",
+        "//cc/util:constants",
         "//cc/util:errors",
         "//cc/util:protobuf_helper",
         "//cc/util:status",
         "//cc/util:statusor",
         "//cc/util:validation",
         "//proto:aes_eax_cc_proto",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
+cc_library(
+    name = "aes_gcm_key_manager",
+    hdrs = ["aes_gcm_key_manager.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        "//cc:aead",
+        "//cc:core/key_type_manager",
+        "//cc:key_manager",
+        "//cc/subtle:aes_gcm_boringssl",
+        "//cc/subtle:random",
+        "//cc/util:constants",
+        "//cc/util:errors",
+        "//cc/util:protobuf_helper",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:validation",
+        "//proto:aes_gcm_cc_proto",
         "//proto:common_cc_proto",
         "//proto:tink_cc_proto",
         "@com_google_absl//absl/base",
@@ -117,23 +130,22 @@
 )
 
 cc_library(
-    name = "aes_gcm_key_manager",
-    srcs = ["aes_gcm_key_manager.cc"],
-    hdrs = ["aes_gcm_key_manager.h"],
+    name = "aes_gcm_siv_key_manager",
+    hdrs = ["aes_gcm_siv_key_manager.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
     deps = [
         "//cc:aead",
-        "//cc:key_manager",
-        "//cc:key_manager_base",
-        "//cc/subtle:aes_gcm_boringssl",
+        "//cc:core/key_type_manager",
+        "//cc/subtle:aes_gcm_siv_boringssl",
         "//cc/subtle:random",
+        "//cc/util:constants",
         "//cc/util:errors",
         "//cc/util:protobuf_helper",
         "//cc/util:status",
         "//cc/util:statusor",
         "//cc/util:validation",
-        "//proto:aes_gcm_cc_proto",
+        "//proto:aes_gcm_siv_cc_proto",
         "//proto:common_cc_proto",
         "//proto:tink_cc_proto",
         "@com_google_absl//absl/base",
@@ -148,14 +160,15 @@
     strip_include_prefix = "/cc",
     deps = [
         "//cc:aead",
-        "//cc:key_manager",
-        "//cc:key_manager_base",
+        "//cc:core/key_type_manager",
         "//cc:mac",
         "//cc:registry",
+        "//cc/mac:hmac_key_manager",
         "//cc/subtle:aes_ctr_boringssl",
         "//cc/subtle:encrypt_then_authenticate",
         "//cc/subtle:hmac_boringssl",
         "//cc/subtle:random",
+        "//cc/util:constants",
         "//cc/util:enums",
         "//cc/util:errors",
         "//cc/util:protobuf_helper",
@@ -171,28 +184,85 @@
 
 cc_library(
     name = "xchacha20_poly1305_key_manager",
-    srcs = ["xchacha20_poly1305_key_manager.cc"],
     hdrs = ["xchacha20_poly1305_key_manager.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
     deps = [
         "//cc:aead",
-        "//cc:key_manager",
-        "//cc:key_manager_base",
+        "//cc:core/key_type_manager",
         "//cc/subtle:random",
         "//cc/subtle:xchacha20_poly1305_boringssl",
+        "//cc/util:constants",
         "//cc/util:errors",
         "//cc/util:protobuf_helper",
         "//cc/util:status",
         "//cc/util:statusor",
         "//cc/util:validation",
-        "//proto:empty_cc_proto",
-        "//proto:tink_cc_proto",
         "//proto:xchacha20_poly1305_cc_proto",
         "@com_google_absl//absl/strings",
     ],
 )
 
+cc_library(
+    name = "kms_aead_key_manager",
+    hdrs = ["kms_aead_key_manager.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        "//cc:aead",
+        "//cc:core/key_type_manager",
+        "//cc:kms_clients",
+        "//cc/util:constants",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:validation",
+        "//proto:kms_aead_cc_proto",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
+cc_library(
+    name = "kms_envelope_aead",
+    srcs = ["kms_envelope_aead.cc"],
+    hdrs = ["kms_envelope_aead.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        "//cc:aead",
+        "//cc:registry",
+        "//cc/util:errors",
+        "//cc/util:protobuf_helper",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//proto:tink_cc_proto",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
+cc_library(
+    name = "kms_envelope_aead_key_manager",
+    srcs = ["kms_envelope_aead_key_manager.cc"],
+    hdrs = ["kms_envelope_aead_key_manager.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":kms_envelope_aead",
+        "//cc:aead",
+        "//cc:core/key_type_manager",
+        "//cc:kms_client",
+        "//cc:kms_clients",
+        "//cc/util:constants",
+        "//cc/util:errors",
+        "//cc/util:protobuf_helper",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:validation",
+        "//proto:kms_envelope_cc_proto",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
 # tests
 
 cc_test(
@@ -205,6 +275,7 @@
         "//cc:aead",
         "//cc:primitive_set",
         "//cc/util:status",
+        "//cc/util:test_matchers",
         "//cc/util:test_util",
         "//proto:tink_cc_proto",
         "@com_google_googletest//:gtest_main",
@@ -212,22 +283,6 @@
 )
 
 cc_test(
-    name = "aead_catalogue_test",
-    size = "small",
-    srcs = ["aead_catalogue_test.cc"],
-    copts = ["-Iexternal/gtest/include"],
-    deps = [
-        ":aead_catalogue",
-        ":aead_config",
-        "//cc:aead",
-        "//cc:catalogue",
-        "//cc/util:status",
-        "//cc/util:statusor",
-        "@com_google_googletest//:gtest_main",
-    ],
-)
-
-cc_test(
     name = "aead_config_test",
     size = "small",
     srcs = ["aead_config_test.cc"],
@@ -235,8 +290,8 @@
     deps = [
         ":aead_config",
         ":aead_key_templates",
+        ":aes_gcm_key_manager",
         "//cc:aead",
-        "//cc:catalogue",
         "//cc:config",
         "//cc:keyset_handle",
         "//cc:registry",
@@ -259,8 +314,8 @@
         "//cc:aead",
         "//cc:crypto_format",
         "//cc:keyset_handle",
-        "//cc/util:keyset_util",
         "//cc/util:status",
+        "//cc/util:test_keyset_handle",
         "//cc/util:test_util",
         "//proto:aes_gcm_cc_proto",
         "//proto:tink_cc_proto",
@@ -278,10 +333,14 @@
         ":aes_ctr_hmac_aead_key_manager",
         ":aes_eax_key_manager",
         ":aes_gcm_key_manager",
+        ":aes_gcm_siv_key_manager",
         ":xchacha20_poly1305_key_manager",
+        "//cc:core/key_manager_impl",
+        "//cc/util:test_matchers",
         "//proto:aes_ctr_hmac_aead_cc_proto",
         "//proto:aes_eax_cc_proto",
         "//proto:aes_gcm_cc_proto",
+        "//proto:aes_gcm_siv_cc_proto",
         "//proto:common_cc_proto",
         "//proto:tink_cc_proto",
         "//proto:xchacha20_poly1305_cc_proto",
@@ -297,8 +356,10 @@
     deps = [
         ":aes_eax_key_manager",
         "//cc:aead",
+        "//cc/subtle:aead_test_util",
         "//cc/util:status",
         "//cc/util:statusor",
+        "//cc/util:test_matchers",
         "//proto:aes_eax_cc_proto",
         "//proto:aes_gcm_cc_proto",
         "//proto:common_cc_proto",
@@ -315,8 +376,10 @@
     deps = [
         ":aes_gcm_key_manager",
         "//cc:aead",
+        "//cc/subtle:aead_test_util",
         "//cc/util:status",
         "//cc/util:statusor",
+        "//cc/util:test_matchers",
         "//proto:aes_eax_cc_proto",
         "//proto:aes_gcm_cc_proto",
         "//proto:common_cc_proto",
@@ -326,6 +389,23 @@
 )
 
 cc_test(
+    name = "aes_gcm_siv_key_manager_test",
+    size = "small",
+    srcs = ["aes_gcm_siv_key_manager_test.cc"],
+    copts = ["-Iexternal/gtest/include"],
+    deps = [
+        ":aes_gcm_siv_key_manager",
+        "//cc:aead",
+        "//cc/subtle:aead_test_util",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_matchers",
+        "//proto:aes_gcm_siv_cc_proto",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
     name = "aes_ctr_hmac_aead_key_manager_test",
     size = "small",
     srcs = ["aes_ctr_hmac_aead_key_manager_test.cc"],
@@ -334,8 +414,13 @@
         ":aes_ctr_hmac_aead_key_manager",
         "//cc:config",
         "//cc/mac:mac_config",
+        "//cc/subtle",
+        "//cc/subtle:aead_test_util",
+        "//cc/subtle:aes_ctr_boringssl",
+        "//cc/util:enums",
         "//cc/util:status",
         "//cc/util:statusor",
+        "//cc/util:test_matchers",
         "//proto:aes_ctr_hmac_aead_cc_proto",
         "//proto:aes_gcm_cc_proto",
         "//proto:common_cc_proto",
@@ -352,12 +437,83 @@
     deps = [
         ":xchacha20_poly1305_key_manager",
         "//cc:aead",
+        "//cc/subtle:aead_test_util",
         "//cc/util:status",
         "//cc/util:statusor",
-        "//proto:aes_eax_cc_proto",
-        "//proto:common_cc_proto",
-        "//proto:tink_cc_proto",
+        "//cc/util:test_matchers",
         "//proto:xchacha20_poly1305_cc_proto",
         "@com_google_googletest//:gtest_main",
     ],
 )
+
+cc_test(
+    name = "kms_aead_key_manager_test",
+    size = "small",
+    srcs = ["kms_aead_key_manager_test.cc"],
+    copts = ["-Iexternal/gtest/include"],
+    deps = [
+        ":kms_aead_key_manager",
+        "//cc:aead",
+        "//cc:kms_client",
+        "//cc:kms_clients",
+        "//cc/subtle:aead_test_util",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_matchers",
+        "//cc/util:test_util",
+        "//proto:kms_aead_cc_proto",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "kms_envelope_aead_test",
+    size = "small",
+    srcs = ["kms_envelope_aead_test.cc"],
+    copts = ["-Iexternal/gtest/include"],
+    deps = [
+        ":aead_config",
+        ":aead_key_templates",
+        ":kms_envelope_aead",
+        "//cc:aead",
+        "//cc:registry",
+        "//cc/mac:mac_key_templates",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_matchers",
+        "//cc/util:test_util",
+        "//proto:tink_cc_proto",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "kms_envelope_aead_key_manager_test",
+    size = "small",
+    srcs = ["kms_envelope_aead_key_manager_test.cc"],
+    copts = ["-Iexternal/gtest/include"],
+    deps = [
+        ":aead_config",
+        ":aead_key_templates",
+        ":aes_eax_key_manager",
+        ":kms_envelope_aead",
+        ":kms_envelope_aead_key_manager",
+        "//cc:aead",
+        "//cc:kms_client",
+        "//cc:kms_clients",
+        "//cc:registry",
+        "//cc/subtle:aead_test_util",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_matchers",
+        "//cc/util:test_util",
+        "//proto:aes_eax_cc_proto",
+        "//proto:kms_envelope_cc_proto",
+        "//proto:tink_cc_proto",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
diff --git a/cc/aead/BUILD.gn b/cc/aead/BUILD.gn
index 0d0f629..d8f0745 100644
--- a/cc/aead/BUILD.gn
+++ b/cc/aead/BUILD.gn
@@ -24,26 +24,6 @@
   public_configs = [ "//third_party/tink:tink_config" ]
 }
 
-# CC Library : aead_catalogue
-source_set("aead_catalogue") {
-  configs -= [ "//build/config:no_rtti" ]
-  sources = [
-    "aead_catalogue.cc",
-    "aead_catalogue.h",
-  ]
-  public_deps = [
-    ":aes_ctr_hmac_aead_key_manager",
-    ":aes_eax_key_manager",
-    ":aes_gcm_key_manager",
-    ":xchacha20_poly1305_key_manager",
-    "//third_party/tink/cc:aead",
-    "//third_party/tink/cc:catalogue",
-    "//third_party/tink/cc:key_manager",
-    "//third_party/tink/cc/util:status",
-  ]
-  public_configs = [ "//third_party/tink:tink_config" ]
-}
-
 # CC Library : aead_config
 source_set("aead_config") {
   configs -= [ "//build/config:no_rtti" ]
@@ -52,12 +32,19 @@
     "aead_config.h",
   ]
   public_deps = [
-    ":aead_catalogue",
     ":aead_wrapper",
-    "//third_party/tink/cc:config",
+    ":aes_ctr_hmac_aead_key_manager",
+    ":aes_eax_key_manager",
+    ":aes_gcm_key_manager",
+    ":aes_gcm_siv_key_manager",
+    ":kms_aead_key_manager",
+    ":kms_envelope_aead_key_manager",
+    ":xchacha20_poly1305_key_manager",
+    "//third_party/tink/cc/config:config_util",
     "//third_party/tink/cc/mac:mac_config",
     "//third_party/tink/cc/util:status",
     "//third_party/tink/proto:config_proto",
+    "//third_party/abseil-cpp/absl/base:core_headers",
     "//third_party/abseil-cpp/absl/memory:memory",
   ]
   public_configs = [ "//third_party/tink:tink_config" ]
@@ -74,6 +61,7 @@
     "//third_party/tink/proto:aes_ctr_hmac_aead_proto",
     "//third_party/tink/proto:aes_eax_proto",
     "//third_party/tink/proto:aes_gcm_proto",
+    "//third_party/tink/proto:aes_gcm_siv_proto",
     "//third_party/tink/proto:common_proto",
     "//third_party/tink/proto:tink_proto",
     "//third_party/tink/proto:xchacha20_poly1305_proto",
@@ -84,25 +72,20 @@
 # CC Library : aes_eax_key_manager
 source_set("aes_eax_key_manager") {
   configs -= [ "//build/config:no_rtti" ]
-  sources = [
-    "aes_eax_key_manager.cc",
-    "aes_eax_key_manager.h",
-  ]
+  sources = [ "aes_eax_key_manager.h" ]
   public_deps = [
     "//third_party/tink/cc:aead",
-    "//third_party/tink/cc:key_manager",
-    "//third_party/tink/cc/core:key_manager_base",
+    "//third_party/tink/cc/core:core/key_type_manager",
     "//third_party/tink/cc/subtle:aes_eax_boringssl",
     "//third_party/tink/cc/subtle:random",
+    "//third_party/tink/cc/util:constants",
     "//third_party/tink/cc/util:errors",
     "//third_party/tink/cc/util:protobuf_helper",
     "//third_party/tink/cc/util:status",
     "//third_party/tink/cc/util:statusor",
     "//third_party/tink/cc/util:validation",
     "//third_party/tink/proto:aes_eax_proto",
-    "//third_party/tink/proto:common_proto",
-    "//third_party/tink/proto:tink_proto",
-    "//third_party/abseil-cpp/absl/base:base",
+    "//third_party/abseil-cpp/absl/strings:strings",
   ]
   public_configs = [ "//third_party/tink:tink_config" ]
 }
@@ -110,16 +93,14 @@
 # CC Library : aes_gcm_key_manager
 source_set("aes_gcm_key_manager") {
   configs -= [ "//build/config:no_rtti" ]
-  sources = [
-    "aes_gcm_key_manager.cc",
-    "aes_gcm_key_manager.h",
-  ]
+  sources = [ "aes_gcm_key_manager.h" ]
   public_deps = [
     "//third_party/tink/cc:aead",
+    "//third_party/tink/cc/core:core/key_type_manager",
     "//third_party/tink/cc:key_manager",
-    "//third_party/tink/cc/core:key_manager_base",
     "//third_party/tink/cc/subtle:aes_gcm_boringssl",
     "//third_party/tink/cc/subtle:random",
+    "//third_party/tink/cc/util:constants",
     "//third_party/tink/cc/util:errors",
     "//third_party/tink/cc/util:protobuf_helper",
     "//third_party/tink/cc/util:status",
@@ -133,6 +114,29 @@
   public_configs = [ "//third_party/tink:tink_config" ]
 }
 
+# CC Library : aes_gcm_siv_key_manager
+source_set("aes_gcm_siv_key_manager") {
+  configs -= [ "//build/config:no_rtti" ]
+  sources = [ "aes_gcm_siv_key_manager.h" ]
+  public_deps = [
+    "//third_party/tink/cc:aead",
+    "//third_party/tink/cc/core:core/key_type_manager",
+    "//third_party/tink/cc/subtle:aes_gcm_siv_boringssl",
+    "//third_party/tink/cc/subtle:random",
+    "//third_party/tink/cc/util:constants",
+    "//third_party/tink/cc/util:errors",
+    "//third_party/tink/cc/util:protobuf_helper",
+    "//third_party/tink/cc/util:status",
+    "//third_party/tink/cc/util:statusor",
+    "//third_party/tink/cc/util:validation",
+    "//third_party/tink/proto:aes_gcm_siv_proto",
+    "//third_party/tink/proto:common_proto",
+    "//third_party/tink/proto:tink_proto",
+    "//third_party/abseil-cpp/absl/base:base",
+  ]
+  public_configs = [ "//third_party/tink:tink_config" ]
+}
+
 # CC Library : aes_ctr_hmac_aead_key_manager
 source_set("aes_ctr_hmac_aead_key_manager") {
   configs -= [ "//build/config:no_rtti" ]
@@ -142,14 +146,15 @@
   ]
   public_deps = [
     "//third_party/tink/cc:aead",
-    "//third_party/tink/cc:key_manager",
-    "//third_party/tink/cc/core:key_manager_base",
+    "//third_party/tink/cc/core:core/key_type_manager",
     "//third_party/tink/cc:mac",
     "//third_party/tink/cc:registry",
+    "//third_party/tink/cc/mac:hmac_key_manager",
     "//third_party/tink/cc/subtle:aes_ctr_boringssl",
     "//third_party/tink/cc/subtle:encrypt_then_authenticate",
     "//third_party/tink/cc/subtle:hmac_boringssl",
     "//third_party/tink/cc/subtle:random",
+    "//third_party/tink/cc/util:constants",
     "//third_party/tink/cc/util:enums",
     "//third_party/tink/cc/util:errors",
     "//third_party/tink/cc/util:protobuf_helper",
@@ -167,26 +172,85 @@
 # CC Library : xchacha20_poly1305_key_manager
 source_set("xchacha20_poly1305_key_manager") {
   configs -= [ "//build/config:no_rtti" ]
-  sources = [
-    "xchacha20_poly1305_key_manager.cc",
-    "xchacha20_poly1305_key_manager.h",
-  ]
+  sources = [ "xchacha20_poly1305_key_manager.h" ]
   public_deps = [
     "//third_party/tink/cc:aead",
-    "//third_party/tink/cc:key_manager",
-    "//third_party/tink/cc/core:key_manager_base",
+    "//third_party/tink/cc/core:core/key_type_manager",
     "//third_party/tink/cc/subtle:random",
     "//third_party/tink/cc/subtle:xchacha20_poly1305_boringssl",
+    "//third_party/tink/cc/util:constants",
     "//third_party/tink/cc/util:errors",
     "//third_party/tink/cc/util:protobuf_helper",
     "//third_party/tink/cc/util:status",
     "//third_party/tink/cc/util:statusor",
     "//third_party/tink/cc/util:validation",
-    "//third_party/tink/proto:empty_proto",
-    "//third_party/tink/proto:tink_proto",
     "//third_party/tink/proto:xchacha20_poly1305_proto",
     "//third_party/abseil-cpp/absl/strings:strings",
   ]
   public_configs = [ "//third_party/tink:tink_config" ]
 }
 
+# CC Library : kms_aead_key_manager
+source_set("kms_aead_key_manager") {
+  configs -= [ "//build/config:no_rtti" ]
+  sources = [ "kms_aead_key_manager.h" ]
+  public_deps = [
+    "//third_party/tink/cc:aead",
+    "//third_party/tink/cc/core:core/key_type_manager",
+    "//third_party/tink/cc:kms_clients",
+    "//third_party/tink/cc/util:constants",
+    "//third_party/tink/cc/util:status",
+    "//third_party/tink/cc/util:statusor",
+    "//third_party/tink/cc/util:validation",
+    "//third_party/tink/proto:kms_aead_proto",
+    "//third_party/abseil-cpp/absl/strings:strings",
+  ]
+  public_configs = [ "//third_party/tink:tink_config" ]
+}
+
+# CC Library : kms_envelope_aead
+source_set("kms_envelope_aead") {
+  configs -= [ "//build/config:no_rtti" ]
+  sources = [
+    "kms_envelope_aead.cc",
+    "kms_envelope_aead.h",
+  ]
+  public_deps = [
+    "//third_party/tink/cc:aead",
+    "//third_party/tink/cc:registry",
+    "//third_party/tink/cc/util:errors",
+    "//third_party/tink/cc/util:protobuf_helper",
+    "//third_party/tink/cc/util:status",
+    "//third_party/tink/cc/util:statusor",
+    "//third_party/tink/proto:tink_proto",
+    "//third_party/abseil-cpp/absl/strings:strings",
+  ]
+  public_configs = [ "//third_party/tink:tink_config" ]
+}
+
+# CC Library : kms_envelope_aead_key_manager
+source_set("kms_envelope_aead_key_manager") {
+  configs -= [ "//build/config:no_rtti" ]
+  sources = [
+    "kms_envelope_aead_key_manager.cc",
+    "kms_envelope_aead_key_manager.h",
+  ]
+  public_deps = [
+    ":kms_envelope_aead",
+    "//third_party/tink/cc:aead",
+    "//third_party/tink/cc/core:core/key_type_manager",
+    "//third_party/tink/cc:kms_client",
+    "//third_party/tink/cc:kms_clients",
+    "//third_party/tink/cc/util:constants",
+    "//third_party/tink/cc/util:errors",
+    "//third_party/tink/cc/util:protobuf_helper",
+    "//third_party/tink/cc/util:status",
+    "//third_party/tink/cc/util:statusor",
+    "//third_party/tink/cc/util:validation",
+    "//third_party/tink/proto:kms_envelope_proto",
+    "//third_party/abseil-cpp/absl/memory:memory",
+    "//third_party/abseil-cpp/absl/strings:strings",
+  ]
+  public_configs = [ "//third_party/tink:tink_config" ]
+}
+
diff --git a/cc/aead/CMakeLists.txt b/cc/aead/CMakeLists.txt
new file mode 100644
index 0000000..cf1315b
--- /dev/null
+++ b/cc/aead/CMakeLists.txt
@@ -0,0 +1,445 @@
+tink_module(aead)
+
+tink_cc_library(
+  NAME aead_wrapper
+  SRCS
+    aead_wrapper.cc
+    aead_wrapper.h
+  DEPS
+    absl::strings
+    tink::core::aead
+    tink::core::crypto_format
+    tink::core::primitive_set
+    tink::core::primitive_wrapper
+    tink::core::registry
+    tink::subtle::subtle_util_boringssl
+    tink::util::status
+    tink::util::statusor
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_library(
+  NAME aead_config
+  SRCS
+    aead_config.cc
+    aead_config.h
+  DEPS
+    tink::aead::aes_ctr_hmac_aead_key_manager
+    tink::aead::aes_eax_key_manager
+    tink::aead::aes_gcm_key_manager
+    tink::aead::aes_gcm_siv_key_manager
+    tink::aead::kms_aead_key_manager
+    tink::aead::kms_envelope_aead_key_manager
+    tink::aead::xchacha20_poly1305_key_manager
+    tink::aead::aead_wrapper
+    tink::config::config_util
+    tink::mac::mac_config
+    tink::util::status
+    tink::proto::config_cc_proto
+    absl::base
+    absl::memory
+)
+
+tink_cc_library(
+  NAME aead_factory
+  SRCS
+    aead_factory.cc
+    aead_factory.h
+  DEPS
+    tink::aead::aead_wrapper
+    tink::core::aead
+    tink::core::key_manager
+    tink::core::keyset_handle
+    tink::core::primitive_set
+    tink::core::registry
+    tink::util::status
+    tink::util::statusor
+    absl::base
+)
+
+tink_cc_library(
+  NAME aead_key_templates
+  SRCS
+    aead_key_templates.cc
+    aead_key_templates.h
+  DEPS
+    tink::proto::aes_ctr_hmac_aead_cc_proto
+    tink::proto::aes_eax_cc_proto
+    tink::proto::aes_gcm_cc_proto
+    tink::proto::aes_gcm_siv_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::tink_cc_proto
+    tink::proto::xchacha20_poly1305_cc_proto
+)
+
+tink_cc_library(
+  NAME aes_eax_key_manager
+  SRCS
+    aes_eax_key_manager.h
+  DEPS
+    tink::core::aead
+    tink::core::key_type_manager
+    tink::subtle::aes_eax_boringssl
+    tink::subtle::random
+    tink::util::constants
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::util::validation
+    tink::proto::aes_eax_cc_proto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME aes_gcm_key_manager
+  SRCS
+    aes_gcm_key_manager.h
+  DEPS
+    tink::core::aead
+    tink::core::key_manager
+    tink::core::key_type_manager
+    tink::subtle::aes_gcm_boringssl
+    tink::subtle::random
+    tink::util::constants
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::util::validation
+    tink::proto::aes_gcm_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::tink_cc_proto
+    absl::base
+)
+
+tink_cc_library(
+  NAME aes_gcm_siv_key_manager
+  SRCS
+    aes_gcm_siv_key_manager.h
+  DEPS
+    tink::core::aead
+    tink::core::key_manager
+    tink::subtle::aes_gcm_siv_boringssl
+    tink::subtle::random
+    tink::util::constants
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::util::validation
+    tink::proto::aes_gcm_siv_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::tink_cc_proto
+    absl::base
+)
+
+tink_cc_library(
+  NAME aes_ctr_hmac_aead_key_manager
+  SRCS
+    aes_ctr_hmac_aead_key_manager.cc
+    aes_ctr_hmac_aead_key_manager.h
+  DEPS
+    tink::core::aead
+    tink::core::key_type_manager
+    tink::core::mac
+    tink::core::registry
+    tink::mac::hmac_key_manager
+    tink::subtle::aes_ctr_boringssl
+    tink::subtle::encrypt_then_authenticate
+    tink::subtle::hmac_boringssl
+    tink::subtle::random
+    tink::util::constants
+    tink::util::enums
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::util::validation
+    tink::proto::aes_ctr_hmac_aead_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::tink_cc_proto
+    absl::base
+)
+
+tink_cc_library(
+  NAME xchacha20_poly1305_key_manager
+  SRCS
+    xchacha20_poly1305_key_manager.h
+  DEPS
+    tink::core::aead
+    tink::core::key_type_manager
+    tink::subtle::random
+    tink::subtle::xchacha20_poly1305_boringssl
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::util::validation
+    tink::proto::xchacha20_poly1305_cc_proto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME kms_aead_key_manager
+  SRCS
+    kms_aead_key_manager.h
+  DEPS
+    tink::core::aead
+    tink::core::key_type_manager
+    tink::core::kms_clients
+    tink::util::constants
+    tink::util::status
+    tink::util::statusor
+    tink::util::validation
+    tink::proto::kms_aead_cc_proto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME kms_envelope_aead
+  SRCS
+    kms_envelope_aead.cc
+    kms_envelope_aead.h
+  DEPS
+    tink::core::aead
+    tink::core::registry
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::proto::tink_cc_proto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME kms_envelope_aead_key_manager
+  SRCS
+    kms_envelope_aead_key_manager.cc
+    kms_envelope_aead_key_manager.h
+  DEPS
+    absl::memory
+    absl::strings
+    tink::core::aead
+    tink::core::key_type_manager
+    tink::core::kms_client
+    tink::core::kms_clients
+    tink::aead::kms_envelope_aead
+    tink::util::constants
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::util::validation
+    tink::proto::kms_envelope_cc_proto
+)
+
+# tests
+
+tink_cc_test(
+  NAME aead_wrapper_test
+  SRCS aead_wrapper_test.cc
+  DEPS
+    tink::aead::aead_wrapper
+    tink::core::aead
+    tink::core::primitive_set
+    tink::util::status
+    tink::util::test_matchers
+    tink::util::test_util
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME aead_config_test
+  SRCS aead_config_test.cc
+  DEPS
+    tink::aead::aead_config
+    tink::aead::aead_key_templates
+    tink::aead::aes_gcm_key_manager
+    tink::core::aead
+    tink::core::config
+    tink::core::keyset_handle
+    tink::core::registry
+    tink::util::status
+    tink::util::test_matchers
+    tink::util::test_util
+)
+
+tink_cc_test(
+  NAME aead_factory_test
+  SRCS aead_factory_test.cc
+  DEPS
+    tink::aead::aead_config
+    tink::aead::aead_factory
+    tink::aead::aes_gcm_key_manager
+    tink::core::aead
+    tink::core::crypto_format
+    tink::core::keyset_handle
+    tink::util::test_keyset_handle
+    tink::util::status
+    tink::util::test_util
+    tink::proto::aes_gcm_cc_proto
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME aead_key_templates_test
+  SRCS aead_key_templates_test.cc
+  DEPS
+    tink::aead::aead_key_templates
+    tink::aead::aes_ctr_hmac_aead_key_manager
+    tink::aead::aes_eax_key_manager
+    tink::aead::aes_gcm_key_manager
+    tink::aead::aes_gcm_siv_key_manager
+    tink::aead::xchacha20_poly1305_key_manager
+    tink::core::key_manager_impl
+    tink::util::test_matchers
+    tink::proto::aes_ctr_hmac_aead_cc_proto
+    tink::proto::aes_eax_cc_proto
+    tink::proto::aes_gcm_cc_proto
+    tink::proto::aes_gcm_siv_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::tink_cc_proto
+    tink::proto::xchacha20_poly1305_cc_proto
+)
+
+tink_cc_test(
+  NAME aes_eax_key_manager_test
+  SRCS aes_eax_key_manager_test.cc
+  DEPS
+    tink::aead::aes_eax_key_manager
+    tink::core::aead
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::subtle::aead_test_util
+    tink::proto::aes_eax_cc_proto
+    tink::proto::aes_gcm_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::tink_cc_proto
+    gmock
+)
+
+tink_cc_test(
+  NAME aes_gcm_key_manager_test
+  SRCS aes_gcm_key_manager_test.cc
+  DEPS
+    tink::aead::aes_gcm_key_manager
+    tink::core::aead
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::subtle::aead_test_util
+    tink::proto::aes_eax_cc_proto
+    tink::proto::aes_gcm_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::tink_cc_proto
+    gmock
+)
+
+tink_cc_test(
+  NAME aes_gcm_siv_key_manager_test
+  SRCS aes_gcm_siv_key_manager_test.cc
+  DEPS
+    tink::aead::aes_gcm_siv_key_manager
+    tink::core::key_type_manager
+    tink::subtle::aead_test_util
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::proto::aes_gcm_siv_cc_proto
+)
+
+tink_cc_test(
+  NAME aes_ctr_hmac_aead_key_manager_test
+  SRCS aes_ctr_hmac_aead_key_manager_test.cc
+  DEPS
+    tink::aead::aes_ctr_hmac_aead_key_manager
+    tink::core::config
+    tink::mac::mac_config
+    tink::proto::aes_ctr_hmac_aead_cc_proto
+    tink::proto::aes_gcm_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::tink_cc_proto
+    tink::subtle::aead_test_util
+    tink::subtle::aes_ctr_boringssl
+    tink::util::enums
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+)
+
+tink_cc_test(
+  NAME xchacha20_poly1305_key_manager_test
+  SRCS xchacha20_poly1305_key_manager_test.cc
+  DEPS
+    tink::aead::xchacha20_poly1305_key_manager
+    tink::core::aead
+    tink::core::key_manager_impl
+    tink::subtle::aead_test_util
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::proto::xchacha20_poly1305_cc_proto
+    gmock
+)
+
+tink_cc_test(
+  NAME kms_aead_key_manager_test
+  SRCS kms_aead_key_manager_test.cc
+  DEPS
+    tink::aead::kms_aead_key_manager
+    tink::core::aead
+    tink::core::kms_client
+    tink::core::kms_clients
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::util::test_util
+    tink::subtle::aead_test_util
+    tink::proto::kms_aead_cc_proto
+    gmock
+)
+
+tink_cc_test(
+  NAME kms_envelope_aead_test
+  SRCS kms_envelope_aead_test.cc
+  DEPS
+    absl::memory
+    absl::strings
+    tink::aead::aead_config
+    tink::aead::aead_key_templates
+    tink::aead::kms_envelope_aead
+    tink::core::aead
+    tink::core::registry
+    tink::mac::mac_key_templates
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::util::test_util
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME kms_envelope_aead_key_manager_test
+  SRCS kms_envelope_aead_key_manager_test.cc
+  DEPS
+    tink::aead::aead_config
+    tink::aead::aead_key_templates
+    tink::aead::aes_eax_key_manager
+    tink::aead::kms_envelope_aead
+    tink::aead::kms_envelope_aead_key_manager
+    tink::core::aead
+    tink::core::kms_client
+    tink::core::kms_clients
+    tink::core::registry
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::util::test_util
+    tink::subtle::aead_test_util
+    tink::proto::aes_eax_cc_proto
+    tink::proto::kms_envelope_cc_proto
+    tink::proto::tink_cc_proto
+    gmock
+)
diff --git a/cc/aead/aead_catalogue.cc b/cc/aead/aead_catalogue.cc
deleted file mode 100644
index 535e189..0000000
--- a/cc/aead/aead_catalogue.cc
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#include "tink/aead/aead_catalogue.h"
-
-#include "absl/strings/ascii.h"
-#include "tink/aead/aes_ctr_hmac_aead_key_manager.h"
-#include "tink/aead/aes_eax_key_manager.h"
-#include "tink/aead/aes_gcm_key_manager.h"
-#include "tink/aead/xchacha20_poly1305_key_manager.h"
-#include "tink/catalogue.h"
-#include "tink/key_manager.h"
-#include "tink/util/status.h"
-#include "tink/util/statusor.h"
-
-namespace crypto {
-namespace tink {
-
-namespace {
-
-crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<Aead>>>
-CreateKeyManager(const std::string& type_url) {
-  if (type_url == AesGcmKeyManager::static_key_type()) {
-    std::unique_ptr<KeyManager<Aead>> manager(new AesGcmKeyManager());
-    return std::move(manager);
-  } else if (type_url == AesEaxKeyManager::static_key_type()) {
-    std::unique_ptr<KeyManager<Aead>> manager(new AesEaxKeyManager());
-    return std::move(manager);
-  } else if (type_url == AesCtrHmacAeadKeyManager::static_key_type()) {
-    std::unique_ptr<KeyManager<Aead>> manager(new AesCtrHmacAeadKeyManager());
-    return std::move(manager);
-  } else if (type_url == XChaCha20Poly1305KeyManager::static_key_type()) {
-    std::unique_ptr<KeyManager<Aead>> manager(
-        new XChaCha20Poly1305KeyManager());
-    return std::move(manager);
-  }
-  return ToStatusF(crypto::tink::util::error::NOT_FOUND,
-                   "No key manager for type_url '%s'.", type_url.c_str());
-}
-
-}  // anonymous namespace
-
-crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<Aead>>>
-AeadCatalogue::GetKeyManager(const std::string& type_url,
-                             const std::string& primitive_name,
-                             uint32_t min_version) const {
-  if (!(absl::AsciiStrToLower(primitive_name) == "aead")) {
-    return ToStatusF(crypto::tink::util::error::NOT_FOUND,
-                     "This catalogue does not support primitive %s.",
-                     primitive_name.c_str());
-  }
-  auto manager_result = CreateKeyManager(type_url);
-  if (!manager_result.ok()) return manager_result;
-  if (manager_result.ValueOrDie()->get_version() < min_version) {
-    return ToStatusF(
-        crypto::tink::util::error::NOT_FOUND,
-        "No key manager for type_url '%s' with version at least %d.",
-        type_url.c_str(), min_version);
-  }
-  return std::move(manager_result.ValueOrDie());
-}
-
-}  // namespace tink
-}  // namespace crypto
diff --git a/cc/aead/aead_catalogue.h b/cc/aead/aead_catalogue.h
deleted file mode 100644
index 1153aa3..0000000
--- a/cc/aead/aead_catalogue.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#ifndef TINK_AEAD_AEAD_CATALOGUE_H_
-#define TINK_AEAD_AEAD_CATALOGUE_H_
-
-#include "tink/aead.h"
-#include "tink/catalogue.h"
-#include "tink/key_manager.h"
-#include "tink/util/statusor.h"
-
-namespace crypto {
-namespace tink {
-
-///////////////////////////////////////////////////////////////////////////////
-// A catalogue of Tink Aead key mangers.
-class AeadCatalogue : public Catalogue<Aead> {
- public:
-  AeadCatalogue() {}
-
-  crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<Aead>>>
-  GetKeyManager(const std::string& type_url,
-                const std::string& primitive_name,
-                uint32_t min_version) const;
-};
-
-}  // namespace tink
-}  // namespace crypto
-
-#endif  // TINK_AEAD_AEAD_CATALOGUE_H_
diff --git a/cc/aead/aead_catalogue_test.cc b/cc/aead/aead_catalogue_test.cc
deleted file mode 100644
index 9dc9803..0000000
--- a/cc/aead/aead_catalogue_test.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-#include "tink/aead/aead_catalogue.h"
-
-#include "tink/catalogue.h"
-#include "tink/aead/aead_config.h"
-#include "tink/util/status.h"
-#include "tink/util/statusor.h"
-#include "gtest/gtest.h"
-
-namespace crypto {
-namespace tink {
-namespace {
-
-class AeadCatalogueTest : public ::testing::Test {
-};
-
-TEST_F(AeadCatalogueTest, testBasic) {
-  std::string key_types[] = {
-      "type.googleapis.com/google.crypto.tink.AesEaxKey",
-      "type.googleapis.com/google.crypto.tink.AesGcmKey",
-      "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey",
-      "type.googleapis.com/google.crypto.tink.XChaCha20Poly1305Key"};
-
-  AeadCatalogue catalogue;
-  {
-    auto manager_result = catalogue.GetKeyManager("bad.key_type", "Aead", 0);
-    EXPECT_FALSE(manager_result.ok());
-    EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-  }
-  for (const std::string& key_type : key_types) {
-    {
-      auto manager_result = catalogue.GetKeyManager(key_type, "Aead", 0);
-      EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-      EXPECT_TRUE(manager_result.ValueOrDie()->DoesSupport(key_type));
-    }
-
-    {
-      auto manager_result = catalogue.GetKeyManager(key_type, "aeAD", 0);
-      EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-      EXPECT_TRUE(manager_result.ValueOrDie()->DoesSupport(key_type));
-    }
-
-    {
-      auto manager_result = catalogue.GetKeyManager(key_type, "Mac", 0);
-      EXPECT_FALSE(manager_result.ok());
-      EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-    }
-
-    {
-      auto manager_result = catalogue.GetKeyManager(key_type, "Aead", 1);
-      EXPECT_FALSE(manager_result.ok());
-      EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-    }
-  }
-}
-
-}  // namespace
-}  // namespace tink
-}  // namespace crypto
diff --git a/cc/aead/aead_config.cc b/cc/aead/aead_config.cc
index 40c4f17..dc18d80 100644
--- a/cc/aead/aead_config.cc
+++ b/cc/aead/aead_config.cc
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2017 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -17,50 +17,28 @@
 #include "tink/aead/aead_config.h"
 
 #include "absl/memory/memory.h"
+#include "tink/aead/aes_ctr_hmac_aead_key_manager.h"
+#include "tink/aead/aes_eax_key_manager.h"
+#include "tink/aead/aes_gcm_key_manager.h"
+#include "tink/aead/aes_gcm_siv_key_manager.h"
+#include "tink/aead/kms_aead_key_manager.h"
+#include "tink/aead/kms_envelope_aead_key_manager.h"
+#include "tink/aead/xchacha20_poly1305_key_manager.h"
 #include "tink/aead/aead_wrapper.h"
-#include "tink/config.h"
-#include "tink/registry.h"
-#include "tink/aead/aead_catalogue.h"
+#include "tink/config/config_util.h"
 #include "tink/mac/mac_config.h"
+#include "tink/registry.h"
 #include "tink/util/status.h"
 #include "proto/config.pb.h"
 
-
 using google::crypto::tink::RegistryConfig;
 
 namespace crypto {
 namespace tink {
 
-namespace {
-
-google::crypto::tink::RegistryConfig* GenerateRegistryConfig() {
-  google::crypto::tink::RegistryConfig* config =
-      new google::crypto::tink::RegistryConfig();
-  config->MergeFrom(MacConfig::Latest());
-  config->add_entry()->MergeFrom(*Config::GetTinkKeyTypeEntry(
-      AeadConfig::kCatalogueName, AeadConfig::kPrimitiveName,
-      "AesCtrHmacAeadKey", 0, true));
-  config->add_entry()->MergeFrom(*Config::GetTinkKeyTypeEntry(
-      AeadConfig::kCatalogueName, AeadConfig::kPrimitiveName,
-      "AesGcmKey", 0, true));
-  config->add_entry()->MergeFrom(*Config::GetTinkKeyTypeEntry(
-      AeadConfig::kCatalogueName, AeadConfig::kPrimitiveName,
-      "AesEaxKey", 0, true));
-  config->add_entry()->MergeFrom(*Config::GetTinkKeyTypeEntry(
-      AeadConfig::kCatalogueName, AeadConfig::kPrimitiveName,
-      "XChaCha20Poly1305Key", 0, true));
-  config->set_config_name("TINK_AEAD");
-  return config;
-}
-
-}  // anonymous namespace
-
-constexpr char AeadConfig::kCatalogueName[];
-constexpr char AeadConfig::kPrimitiveName[];
-
 // static
-const google::crypto::tink::RegistryConfig& AeadConfig::Latest() {
-  static const auto config = GenerateRegistryConfig();
+const RegistryConfig& AeadConfig::Latest() {
+  static const RegistryConfig* config = new RegistryConfig();
   return *config;
 }
 
@@ -68,10 +46,32 @@
 util::Status AeadConfig::Register() {
   auto status = MacConfig::Register();
   if (!status.ok()) return status;
-  status = Registry::AddCatalogue(kCatalogueName,
-                                  absl::make_unique<AeadCatalogue>());
+
+  // Register key managers.
+  status = Registry::RegisterKeyTypeManager(
+      absl::make_unique<AesCtrHmacAeadKeyManager>(), true);
   if (!status.ok()) return status;
-  return Config::Register(Latest());
+  status = Registry::RegisterKeyTypeManager(
+      absl::make_unique<AesGcmKeyManager>(), true);
+  if (!status.ok()) return status;
+  status = Registry::RegisterKeyTypeManager(
+      absl::make_unique<AesGcmSivKeyManager>(), true);
+  if (!status.ok()) return status;
+  status = Registry::RegisterKeyTypeManager(
+      absl::make_unique<AesEaxKeyManager>(), true);
+  if (!status.ok()) return status;
+  status = Registry::RegisterKeyTypeManager(
+      absl::make_unique<XChaCha20Poly1305KeyManager>(), true);
+  if (!status.ok()) return status;
+  status = Registry::RegisterKeyTypeManager(
+      absl::make_unique<KmsAeadKeyManager>(), true);
+  if (!status.ok()) return status;
+  status = Registry::RegisterKeyTypeManager(
+      absl::make_unique<KmsEnvelopeAeadKeyManager>(), true);
+  if (!status.ok()) return status;
+
+  // Register primitive wrapper.
+  return Registry::RegisterPrimitiveWrapper(absl::make_unique<AeadWrapper>());
 }
 
 }  // namespace tink
diff --git a/cc/aead/aead_config.h b/cc/aead/aead_config.h
index dde4b14..7541315 100644
--- a/cc/aead/aead_config.h
+++ b/cc/aead/aead_config.h
@@ -17,7 +17,7 @@
 #ifndef TINK_AEAD_AEAD_CONFIG_H_
 #define TINK_AEAD_AEAD_CONFIG_H_
 
-#include "tink/config.h"
+#include "absl/base/macros.h"
 #include "tink/util/status.h"
 #include "proto/config.pb.h"
 
@@ -32,7 +32,6 @@
 //
 //   auto status = AeadConfig::Register();
 //
-// For more information on creation and usage of Aead instances see AeadFactory.
 class AeadConfig {
  public:
   static constexpr char kCatalogueName[] = "TinkAead";
@@ -40,9 +39,10 @@
 
   // Returns config of Aead implementations supported
   // in the current Tink release.
+  ABSL_DEPRECATED("This is not supported anymore.")
   static const google::crypto::tink::RegistryConfig& Latest();
 
-  // Registers key managers for all Aead key types
+  // Registers Aead primitive wrapper and key managers for all Aead key types
   // from the current Tink release.
   static crypto::tink::util::Status Register();
 
diff --git a/cc/aead/aead_config_test.cc b/cc/aead/aead_config_test.cc
index 662fdc1..9ad96e3 100644
--- a/cc/aead/aead_config_test.cc
+++ b/cc/aead/aead_config_test.cc
@@ -17,124 +17,39 @@
 #include "tink/aead/aead_config.h"
 
 #include "gmock/gmock.h"
+#include "gtest/gtest.h"
 #include "tink/aead.h"
 #include "tink/aead/aead_key_templates.h"
-#include "tink/catalogue.h"
+#include "tink/aead/aes_gcm_key_manager.h"
 #include "tink/config.h"
 #include "tink/keyset_handle.h"
 #include "tink/registry.h"
 #include "tink/util/status.h"
-#include "gtest/gtest.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
 
-
 namespace crypto {
 namespace tink {
 namespace {
 
 using ::crypto::tink::test::DummyAead;
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
 using ::testing::Eq;
 
-class DummyAeadCatalogue : public Catalogue<Aead> {
- public:
-  DummyAeadCatalogue() {}
-
-  crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<Aead>>> GetKeyManager(
-      const std::string& type_url,
-      const std::string& primitive_name,
-      uint32_t min_version) const override {
-    return util::Status::UNKNOWN;
-  }
-};
-
 class AeadConfigTest : public ::testing::Test {
  protected:
   void SetUp() override { Registry::Reset(); }
 };
 
-TEST_F(AeadConfigTest, testBasic) {
-  std::string aes_ctr_hmac_aead_key_type =
-      "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey";
-  std::string aes_eax_key_type =
-      "type.googleapis.com/google.crypto.tink.AesEaxKey";
-  std::string aes_gcm_key_type = "type.googleapis.com/google.crypto.tink.AesGcmKey";
-  std::string xchacha20_poly1305_key_type =
-      "type.googleapis.com/google.crypto.tink.XChaCha20Poly1305Key";
-  std::string hmac_key_type = "type.googleapis.com/google.crypto.tink.HmacKey";
-  auto& config = AeadConfig::Latest();
-
-  EXPECT_EQ(5, AeadConfig::Latest().entry_size());
-
-  EXPECT_EQ("TinkMac", config.entry(0).catalogue_name());
-  EXPECT_EQ("Mac", config.entry(0).primitive_name());
-  EXPECT_EQ(hmac_key_type, config.entry(0).type_url());
-  EXPECT_EQ(true, config.entry(0).new_key_allowed());
-  EXPECT_EQ(0, config.entry(0).key_manager_version());
-
-  EXPECT_EQ("TinkAead", config.entry(1).catalogue_name());
-  EXPECT_EQ("Aead", config.entry(1).primitive_name());
-  EXPECT_EQ(aes_ctr_hmac_aead_key_type, config.entry(1).type_url());
-  EXPECT_EQ(true, config.entry(1).new_key_allowed());
-  EXPECT_EQ(0, config.entry(1).key_manager_version());
-
-  EXPECT_EQ("TinkAead", config.entry(2).catalogue_name());
-  EXPECT_EQ("Aead", config.entry(2).primitive_name());
-  EXPECT_EQ(aes_gcm_key_type, config.entry(2).type_url());
-  EXPECT_EQ(true, config.entry(2).new_key_allowed());
-  EXPECT_EQ(0, config.entry(2).key_manager_version());
-
-  EXPECT_EQ("TinkAead", config.entry(3).catalogue_name());
-  EXPECT_EQ("Aead", config.entry(3).primitive_name());
-  EXPECT_EQ(aes_eax_key_type, config.entry(3).type_url());
-  EXPECT_EQ(true, config.entry(3).new_key_allowed());
-  EXPECT_EQ(0, config.entry(3).key_manager_version());
-
-  EXPECT_EQ("TinkAead", config.entry(4).catalogue_name());
-  EXPECT_EQ("Aead", config.entry(4).primitive_name());
-  EXPECT_EQ(xchacha20_poly1305_key_type, config.entry(4).type_url());
-  EXPECT_EQ(true, config.entry(4).new_key_allowed());
-  EXPECT_EQ(0, config.entry(4).key_manager_version());
-
-  // No key manager before registration.
-  auto manager_result = Registry::get_key_manager<Aead>(aes_gcm_key_type);
-  EXPECT_FALSE(manager_result.ok());
-  EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-
-  // Registration of standard key types works.
-  auto status = AeadConfig::Register();
-  EXPECT_TRUE(status.ok()) << status;
-  manager_result = Registry::get_key_manager<Aead>(aes_gcm_key_type);
-  EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-  EXPECT_TRUE(manager_result.ValueOrDie()->DoesSupport(aes_gcm_key_type));
-}
-
-TEST_F(AeadConfigTest, testRegister) {
-  std::string key_type = "type.googleapis.com/google.crypto.tink.AesGcmKey";
-
-  // Try on empty registry.
-  auto status = Config::Register(AeadConfig::Latest());
-  EXPECT_FALSE(status.ok());
-  EXPECT_EQ(util::error::NOT_FOUND, status.error_code());
-  auto manager_result = Registry::get_key_manager<Aead>(key_type);
-  EXPECT_FALSE(manager_result.ok());
-
-  // Register and try again.
-  status = AeadConfig::Register();
-  EXPECT_TRUE(status.ok()) << status;
-  manager_result = Registry::get_key_manager<Aead>(key_type);
-  EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-
-  // Try Register() again, should succeed (idempotence).
-  status = AeadConfig::Register();
-  EXPECT_TRUE(status.ok()) << status;
-
-  // Reset the registry, and try overriding a catalogue with a different one.
-  Registry::Reset();
-  status = Registry::AddCatalogue("TinkAead", new DummyAeadCatalogue());
-  EXPECT_TRUE(status.ok()) << status;
-  status = AeadConfig::Register();
-  EXPECT_FALSE(status.ok());
-  EXPECT_EQ(util::error::ALREADY_EXISTS, status.error_code());
+TEST_F(AeadConfigTest, RegisterWorks) {
+  EXPECT_THAT(Registry::get_key_manager<Aead>(AesGcmKeyManager().get_key_type())
+                  .status(),
+              StatusIs(util::error::NOT_FOUND));
+  EXPECT_THAT(AeadConfig::Register(), IsOk());
+  EXPECT_THAT(Registry::get_key_manager<Aead>(AesGcmKeyManager().get_key_type())
+                  .status(),
+              IsOk());
 }
 
 // Tests that the AeadWrapper has been properly registered and we can wrap
@@ -147,9 +62,11 @@
   key.set_key_id(1234);
   key.set_output_prefix_type(google::crypto::tink::OutputPrefixType::RAW);
   auto primitive_set = absl::make_unique<PrimitiveSet<Aead>>();
-  primitive_set->set_primary(
-      primitive_set->AddPrimitive(absl::make_unique<DummyAead>("dummy"), key)
-          .ValueOrDie());
+  ASSERT_THAT(primitive_set->set_primary(
+                  primitive_set
+                      ->AddPrimitive(absl::make_unique<DummyAead>("dummy"), key)
+                      .ValueOrDie()),
+              IsOk());
 
   auto primitive_result = Registry::Wrap(std::move(primitive_set));
 
diff --git a/cc/aead/aead_factory_test.cc b/cc/aead/aead_factory_test.cc
index e438795..1cc2d3c 100644
--- a/cc/aead/aead_factory_test.cc
+++ b/cc/aead/aead_factory_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2017 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -21,15 +21,16 @@
 #include "tink/aead/aes_gcm_key_manager.h"
 #include "tink/crypto_format.h"
 #include "tink/keyset_handle.h"
-#include "tink/util/keyset_util.h"
+#include "tink/util/test_keyset_handle.h"
 #include "tink/util/status.h"
 #include "tink/util/test_util.h"
 #include "proto/aes_gcm.pb.h"
 #include "proto/tink.pb.h"
 
-using crypto::tink::KeysetUtil;
+using crypto::tink::TestKeysetHandle;
 using crypto::tink::test::AddRawKey;
 using crypto::tink::test::AddTinkKey;
+using google::crypto::tink::AesGcmKey;
 using google::crypto::tink::AesGcmKeyFormat;
 using google::crypto::tink::KeyData;
 using google::crypto::tink::Keyset;
@@ -46,7 +47,7 @@
 TEST_F(AeadFactoryTest, testBasic) {
   Keyset keyset;
   auto aead_result =
-      AeadFactory::GetPrimitive(*KeysetUtil::GetKeysetHandle(keyset));
+      AeadFactory::GetPrimitive(*TestKeysetHandle::GetKeysetHandle(keyset));
   EXPECT_FALSE(aead_result.ok());
   EXPECT_EQ(util::error::INVALID_ARGUMENT, aead_result.status().error_code());
   EXPECT_PRED_FORMAT2(testing::IsSubstring, "at least one key",
@@ -55,9 +56,7 @@
 
 TEST_F(AeadFactoryTest, testPrimitive) {
   // Prepare a template for generating keys for a Keyset.
-  AesGcmKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-  std::string key_type = key_manager.get_key_type();
+  std::string key_type = AesGcmKeyManager().get_key_type();
 
   AesGcmKeyFormat key_format;
   key_format.set_key_size(16);
@@ -65,18 +64,18 @@
   // Prepare a Keyset.
   Keyset keyset;
   uint32_t key_id_1 = 1234543;
-  auto new_key = std::move(key_factory.NewKey(key_format).ValueOrDie());
-  AddTinkKey(key_type, key_id_1, *new_key, KeyStatusType::ENABLED,
+  AesGcmKey new_key = AesGcmKeyManager().CreateKey(key_format).ValueOrDie();
+  AddTinkKey(key_type, key_id_1, new_key, KeyStatusType::ENABLED,
              KeyData::SYMMETRIC, &keyset);
 
   uint32_t key_id_2 = 726329;
-  new_key = std::move(key_factory.NewKey(key_format).ValueOrDie());
-  AddRawKey(key_type, key_id_2, *new_key, KeyStatusType::ENABLED,
+  new_key = AesGcmKeyManager().CreateKey(key_format).ValueOrDie();
+  AddRawKey(key_type, key_id_2, new_key, KeyStatusType::ENABLED,
             KeyData::SYMMETRIC, &keyset);
 
   uint32_t key_id_3 = 7213743;
-  new_key = std::move(key_factory.NewKey(key_format).ValueOrDie());
-  AddTinkKey(key_type, key_id_3, *new_key, KeyStatusType::ENABLED,
+  new_key = AesGcmKeyManager().CreateKey(key_format).ValueOrDie();
+  AddTinkKey(key_type, key_id_3, new_key, KeyStatusType::ENABLED,
              KeyData::SYMMETRIC, &keyset);
 
   keyset.set_primary_key_id(key_id_3);
@@ -86,7 +85,7 @@
 
   // Create a KeysetHandle and use it with the factory.
   auto aead_result =
-      AeadFactory::GetPrimitive(*KeysetUtil::GetKeysetHandle(keyset));
+      AeadFactory::GetPrimitive(*TestKeysetHandle::GetKeysetHandle(keyset));
   EXPECT_TRUE(aead_result.ok()) << aead_result.status();
   auto aead = std::move(aead_result.ValueOrDie());
 
@@ -113,8 +112,10 @@
                       decrypt_result.status().error_message());
 
   // Create raw ciphertext with 2nd key, and decrypt with Aead-instance.
-  auto raw_aead = std::move(
-      key_manager.GetPrimitive(keyset.key(1).key_data()).ValueOrDie());
+  AesGcmKey raw_key;
+  EXPECT_TRUE(raw_key.ParseFromString(keyset.key(1).key_data().value()));
+  auto raw_aead =
+      std::move(AesGcmKeyManager().GetPrimitive<Aead>(raw_key).ValueOrDie());
   std::string raw_ciphertext = raw_aead->Encrypt(plaintext, aad).ValueOrDie();
   decrypt_result = aead->Decrypt(ciphertext, aad);
   EXPECT_TRUE(decrypt_result.ok()) << decrypt_result.status();
diff --git a/cc/aead/aead_key_templates.cc b/cc/aead/aead_key_templates.cc
index 15957df..55504d9 100644
--- a/cc/aead/aead_key_templates.cc
+++ b/cc/aead/aead_key_templates.cc
@@ -19,6 +19,7 @@
 #include "proto/aes_ctr_hmac_aead.pb.h"
 #include "proto/aes_eax.pb.h"
 #include "proto/aes_gcm.pb.h"
+#include "proto/aes_gcm_siv.pb.h"
 #include "proto/common.pb.h"
 #include "proto/tink.pb.h"
 #include "proto/xchacha20_poly1305.pb.h"
@@ -26,6 +27,7 @@
 using google::crypto::tink::AesCtrHmacAeadKeyFormat;
 using google::crypto::tink::AesEaxKeyFormat;
 using google::crypto::tink::AesGcmKeyFormat;
+using google::crypto::tink::AesGcmSivKeyFormat;
 using google::crypto::tink::HashType;
 using google::crypto::tink::KeyTemplate;
 using google::crypto::tink::OutputPrefixType;
@@ -58,10 +60,22 @@
   return key_template;
 }
 
-KeyTemplate* NewAesCtrHmacAeadKeyTemplate(
-    int aes_key_size_in_bytes, int iv_size_in_bytes,
-    int hmac_key_size_in_bytes, int tag_size_in_bytes,
-    HashType hash_type) {
+KeyTemplate* NewAesGcmSivKeyTemplate(int key_size_in_bytes) {
+  KeyTemplate* key_template = new KeyTemplate;
+  key_template->set_type_url(
+      "type.googleapis.com/google.crypto.tink.AesGcmSivKey");
+  key_template->set_output_prefix_type(OutputPrefixType::TINK);
+  AesGcmSivKeyFormat key_format;
+  key_format.set_key_size(key_size_in_bytes);
+  key_format.SerializeToString(key_template->mutable_value());
+  return key_template;
+}
+
+KeyTemplate* NewAesCtrHmacAeadKeyTemplate(int aes_key_size_in_bytes,
+                                          int iv_size_in_bytes,
+                                          int hmac_key_size_in_bytes,
+                                          int tag_size_in_bytes,
+                                          HashType hash_type) {
   KeyTemplate* key_template = new KeyTemplate;
   key_template->set_type_url(
       "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey");
@@ -119,13 +133,26 @@
 }
 
 // static
+const KeyTemplate& AeadKeyTemplates::Aes128GcmSiv() {
+  static const KeyTemplate* key_template =
+      NewAesGcmSivKeyTemplate(/* key_size_in_bytes= */ 16);
+  return *key_template;
+}
+
+// static
+const KeyTemplate& AeadKeyTemplates::Aes256GcmSiv() {
+  static const KeyTemplate* key_template =
+      NewAesGcmSivKeyTemplate(/* key_size_in_bytes= */ 32);
+  return *key_template;
+}
+
+// static
 const KeyTemplate& AeadKeyTemplates::Aes128CtrHmacSha256() {
   static const KeyTemplate* key_template = NewAesCtrHmacAeadKeyTemplate(
       /* aes_key_size_in_bytes= */ 16,
       /* iv_size_in_bytes= */ 16,
       /* hmac_key_size_in_bytes= */ 32,
-      /* tag_size_in_bytes= */ 16,
-      HashType::SHA256);
+      /* tag_size_in_bytes= */ 16, HashType::SHA256);
   return *key_template;
 }
 
@@ -135,8 +162,7 @@
       /* aes_key_size_in_bytes= */ 32,
       /* iv_size_in_bytes= */ 16,
       /* hmac_key_size_in_bytes= */ 32,
-      /* tag_size_in_bytes= */ 32,
-      HashType::SHA256);
+      /* tag_size_in_bytes= */ 32, HashType::SHA256);
   return *key_template;
 }
 
diff --git a/cc/aead/aead_key_templates.h b/cc/aead/aead_key_templates.h
index 640e10e..1bc23a8 100644
--- a/cc/aead/aead_key_templates.h
+++ b/cc/aead/aead_key_templates.h
@@ -67,6 +67,22 @@
   //   - OutputPrefixType: TINK
   static const google::crypto::tink::KeyTemplate& Aes256Gcm();
 
+  // Returns a KeyTemplate that generates new instances of AesGcmSivKey
+  // with the following parameters:
+  //   - key size: 16 bytes
+  //   - IV size: 12 bytes
+  //   - tag size: 16 bytes
+  //   - OutputPrefixType: TINK
+  static const google::crypto::tink::KeyTemplate& Aes128GcmSiv();
+
+  // Returns a KeyTemplate that generates new instances of AesGcmSivKey
+  // with the following parameters:
+  //   - key size: 32 bytes
+  //   - IV size: 12 bytes
+  //   - tag size: 16 bytes
+  //   - OutputPrefixType: TINK
+  static const google::crypto::tink::KeyTemplate& Aes256GcmSiv();
+
   // Returns a KeyTemplate that generates new instances of AesCtrHmacAeadKey
   // with the following parameters:
   //   - AES key size: 16 bytes
diff --git a/cc/aead/aead_key_templates_test.cc b/cc/aead/aead_key_templates_test.cc
index 9c2b24e..b4bfc3d 100644
--- a/cc/aead/aead_key_templates_test.cc
+++ b/cc/aead/aead_key_templates_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2018 Google Inc.
+// Copyright 2018 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,14 +16,19 @@
 
 #include "tink/aead/aead_key_templates.h"
 
+#include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include "tink/aead/aes_ctr_hmac_aead_key_manager.h"
 #include "tink/aead/aes_eax_key_manager.h"
 #include "tink/aead/aes_gcm_key_manager.h"
+#include "tink/aead/aes_gcm_siv_key_manager.h"
 #include "tink/aead/xchacha20_poly1305_key_manager.h"
+#include "tink/core/key_manager_impl.h"
+#include "tink/util/test_matchers.h"
 #include "proto/aes_ctr_hmac_aead.pb.h"
 #include "proto/aes_eax.pb.h"
 #include "proto/aes_gcm.pb.h"
+#include "proto/aes_gcm_siv.pb.h"
 #include "proto/common.pb.h"
 #include "proto/tink.pb.h"
 #include "proto/xchacha20_poly1305.pb.h"
@@ -31,6 +36,7 @@
 using google::crypto::tink::AesCtrHmacAeadKeyFormat;
 using google::crypto::tink::AesEaxKeyFormat;
 using google::crypto::tink::AesGcmKeyFormat;
+using google::crypto::tink::AesGcmSivKeyFormat;
 using google::crypto::tink::HashType;
 using google::crypto::tink::KeyTemplate;
 using google::crypto::tink::OutputPrefixType;
@@ -39,6 +45,10 @@
 namespace tink {
 namespace {
 
+using ::crypto::tink::test::IsOk;
+using ::testing::Eq;
+using ::testing::Ref;
+
 TEST(AeadKeyTemplatesTest, testAesEaxKeyTemplates) {
   std::string type_url = "type.googleapis.com/google.crypto.tink.AesEaxKey";
 
@@ -57,10 +67,11 @@
     EXPECT_EQ(&key_template, &key_template_2);
 
     // Check that the template works with the key manager.
-    AesEaxKeyManager key_manager;
-    EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
+    AesEaxKeyManager key_type_manager;
+    auto key_manager = internal::MakeKeyManager<Aead>(&key_type_manager);
+    EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
     auto new_key_result =
-        key_manager.get_key_factory().NewKey(key_template.value());
+        key_manager->get_key_factory().NewKey(key_template.value());
     EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
   }
 
@@ -79,56 +90,121 @@
     EXPECT_EQ(&key_template, &key_template_2);
 
     // Check that the template works with the key manager.
-    AesEaxKeyManager key_manager;
-    EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
+    AesEaxKeyManager key_type_manager;
+    auto key_manager = internal::MakeKeyManager<Aead>(&key_type_manager);
+    EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
     auto new_key_result =
-        key_manager.get_key_factory().NewKey(key_template.value());
+        key_manager->get_key_factory().NewKey(key_template.value());
     EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
   }
 }
 
-TEST(AeadKeyTemplatesTest, testAesGcmKeyTemplates) {
-  std::string type_url = "type.googleapis.com/google.crypto.tink.AesGcmKey";
+TEST(Aes256Gcm, Basics) {
+  EXPECT_THAT(AeadKeyTemplates::Aes256Gcm().type_url(),
+              Eq("type.googleapis.com/google.crypto.tink.AesGcmKey"));
+  EXPECT_THAT(AeadKeyTemplates::Aes256Gcm().type_url(),
+              Eq(AesGcmKeyManager().get_key_type()));
+}
 
-  {  // Test Aes128Gcm().
+TEST(Aes256Gcm, OutputPrefixType) {
+  EXPECT_THAT(AeadKeyTemplates::Aes256Gcm().output_prefix_type(),
+              Eq(OutputPrefixType::TINK));
+}
+
+TEST(Aes256Gcm, MultipleCallsSameReference) {
+  EXPECT_THAT(AeadKeyTemplates::Aes256Gcm(),
+              Ref(AeadKeyTemplates::Aes256Gcm()));
+}
+
+TEST(Aes256Gcm, WorksWithKeyTypeManager) {
+  const KeyTemplate& key_template = AeadKeyTemplates::Aes256Gcm();
+  AesGcmKeyFormat key_format;
+  EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
+  EXPECT_THAT(AesGcmKeyManager().ValidateKeyFormat(key_format), IsOk());
+}
+
+TEST(Aes256Gcm, CheckValues) {
+  const KeyTemplate& key_template = AeadKeyTemplates::Aes256Gcm();
+  AesGcmKeyFormat key_format;
+  EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
+  EXPECT_THAT(key_format.key_size(), Eq(32));
+}
+
+TEST(Aes128Gcm, Basics) {
+  EXPECT_THAT(AeadKeyTemplates::Aes128Gcm().type_url(),
+              Eq("type.googleapis.com/google.crypto.tink.AesGcmKey"));
+  EXPECT_THAT(AeadKeyTemplates::Aes128Gcm().type_url(),
+              Eq(AesGcmKeyManager().get_key_type()));
+}
+
+TEST(Aes128Gcm, OutputPrefixType) {
+  EXPECT_THAT(AeadKeyTemplates::Aes128Gcm().output_prefix_type(),
+              Eq(OutputPrefixType::TINK));
+}
+
+TEST(Aes128Gcm, MultipleCallsSameReference) {
+  EXPECT_THAT(AeadKeyTemplates::Aes128Gcm(),
+              Ref(AeadKeyTemplates::Aes128Gcm()));
+}
+
+TEST(Aes128Gcm, WorksWithKeyTypeManager) {
+  const KeyTemplate& key_template = AeadKeyTemplates::Aes128Gcm();
+  AesGcmKeyFormat key_format;
+  EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
+  EXPECT_THAT(AesGcmKeyManager().ValidateKeyFormat(key_format), IsOk());
+}
+
+TEST(Aes128Gcm, CheckValues) {
+  const KeyTemplate& key_template = AeadKeyTemplates::Aes128Gcm();
+  AesGcmKeyFormat key_format;
+  EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
+  EXPECT_THAT(key_format.key_size(), Eq(16));
+}
+
+TEST(AeadKeyTemplatesTest, testAesGcmSivKeyTemplates) {
+  std::string type_url = "type.googleapis.com/google.crypto.tink.AesGcmSivKey";
+
+  {  // Test Aes128GcmSiv().
     // Check that returned template is correct.
-    const KeyTemplate& key_template = AeadKeyTemplates::Aes128Gcm();
+    const KeyTemplate& key_template = AeadKeyTemplates::Aes128GcmSiv();
     EXPECT_EQ(type_url, key_template.type_url());
     EXPECT_EQ(OutputPrefixType::TINK, key_template.output_prefix_type());
-    AesGcmKeyFormat key_format;
+    AesGcmSivKeyFormat key_format;
     EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
     EXPECT_EQ(16, key_format.key_size());
 
     // Check that reference to the same object is returned.
-    const KeyTemplate& key_template_2 = AeadKeyTemplates::Aes128Gcm();
+    const KeyTemplate& key_template_2 = AeadKeyTemplates::Aes128GcmSiv();
     EXPECT_EQ(&key_template, &key_template_2);
 
     // Check that the template works with the key manager.
-    AesGcmKeyManager key_manager;
-    EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
+    AesGcmSivKeyManager key_type_manager;
+    auto key_manager = internal::MakeKeyManager<Aead>(&key_type_manager);
+    EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
     auto new_key_result =
-        key_manager.get_key_factory().NewKey(key_template.value());
+        key_manager->get_key_factory().NewKey(key_template.value());
     EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
   }
 
-  {  // Test Aes256Gcm().
+  {  // Test Aes256GcmSiv().
     // Check that returned template is correct.
-    const KeyTemplate& key_template = AeadKeyTemplates::Aes256Gcm();
+    const KeyTemplate& key_template = AeadKeyTemplates::Aes256GcmSiv();
     EXPECT_EQ(type_url, key_template.type_url());
     EXPECT_EQ(OutputPrefixType::TINK, key_template.output_prefix_type());
-    AesGcmKeyFormat key_format;
+    AesGcmSivKeyFormat key_format;
     EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
     EXPECT_EQ(32, key_format.key_size());
 
     // Check that reference to the same object is returned.
-    const KeyTemplate& key_template_2 = AeadKeyTemplates::Aes256Gcm();
+    const KeyTemplate& key_template_2 = AeadKeyTemplates::Aes256GcmSiv();
     EXPECT_EQ(&key_template, &key_template_2);
 
     // Check that the template works with the key manager.
-    AesGcmKeyManager key_manager;
-    EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
+    AesGcmSivKeyManager key_type_manager;
+    auto key_manager = internal::MakeKeyManager<Aead>(&key_type_manager);
+    EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
     auto new_key_result =
-        key_manager.get_key_factory().NewKey(key_template.value());
+        key_manager->get_key_factory().NewKey(key_template.value());
     EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
   }
 }
@@ -154,10 +230,11 @@
     EXPECT_EQ(&key_template, &key_template_2);
 
     // Check that the template works with the key manager.
-    AesCtrHmacAeadKeyManager key_manager;
-    EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
+    AesCtrHmacAeadKeyManager key_type_manager;
+    auto key_manager = internal::MakeKeyManager<Aead>(&key_type_manager);
+    EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
     auto new_key_result =
-        key_manager.get_key_factory().NewKey(key_template.value());
+        key_manager->get_key_factory().NewKey(key_template.value());
     EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
   }
 
@@ -179,10 +256,11 @@
     EXPECT_EQ(&key_template, &key_template_2);
 
     // Check that the template works with the key manager.
-    AesCtrHmacAeadKeyManager key_manager;
-    EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
+    AesCtrHmacAeadKeyManager key_type_manager;
+    auto key_manager = internal::MakeKeyManager<Aead>(&key_type_manager);
+    EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
     auto new_key_result =
-        key_manager.get_key_factory().NewKey(key_template.value());
+        key_manager->get_key_factory().NewKey(key_template.value());
     EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
   }
 }
@@ -201,10 +279,11 @@
   EXPECT_EQ(&key_template, &key_template_2);
 
   // Check that the template works with the key manager.
-  XChaCha20Poly1305KeyManager key_manager;
-  EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
+  XChaCha20Poly1305KeyManager key_type_manager;
+  auto key_manager = internal::MakeKeyManager<Aead>(&key_type_manager);
+  EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
   auto new_key_result =
-      key_manager.get_key_factory().NewKey(key_template.value());
+      key_manager->get_key_factory().NewKey(key_template.value());
   EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
 }
 
diff --git a/cc/aead/aead_wrapper.h b/cc/aead/aead_wrapper.h
index be9e2e0..6057884 100644
--- a/cc/aead/aead_wrapper.h
+++ b/cc/aead/aead_wrapper.h
@@ -14,8 +14,8 @@
 //
 ///////////////////////////////////////////////////////////////////////////////
 
-#ifndef TINK_AEAD_AEAD_SET_WRAPPER_H_
-#define TINK_AEAD_AEAD_SET_WRAPPER_H_
+#ifndef TINK_AEAD_AEAD_WRAPPER_H_
+#define TINK_AEAD_AEAD_WRAPPER_H_
 
 #include "absl/strings/string_view.h"
 #include "tink/aead.h"
@@ -43,4 +43,4 @@
 }  // namespace tink
 }  // namespace crypto
 
-#endif  // TINK_AEAD_AEAD_SET_WRAPPER_H_
+#endif  // TINK_AEAD_AEAD_WRAPPER_H_
diff --git a/cc/aead/aead_wrapper_test.cc b/cc/aead/aead_wrapper_test.cc
index f272f1a..842effb 100644
--- a/cc/aead/aead_wrapper_test.cc
+++ b/cc/aead/aead_wrapper_test.cc
@@ -15,15 +15,19 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 #include "tink/aead/aead_wrapper.h"
+
 #include "gtest/gtest.h"
 #include "tink/aead.h"
 #include "tink/primitive_set.h"
 #include "tink/util/status.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
 
-using crypto::tink::test::DummyAead;
-using google::crypto::tink::Keyset;
-using google::crypto::tink::OutputPrefixType;
+using ::crypto::tink::test::DummyAead;
+using ::crypto::tink::test::IsOk;
+using ::google::crypto::tink::Keyset;
+using ::google::crypto::tink::KeyStatusType;
+using ::google::crypto::tink::OutputPrefixType;
 
 namespace crypto {
 namespace tink {
@@ -55,16 +59,19 @@
   key = keyset.add_key();
   key->set_output_prefix_type(OutputPrefixType::TINK);
   key->set_key_id(key_id_0);
+  key->set_status(KeyStatusType::ENABLED);
 
   uint32_t key_id_1 = 726329;
   key = keyset.add_key();
   key->set_output_prefix_type(OutputPrefixType::LEGACY);
   key->set_key_id(key_id_1);
+  key->set_status(KeyStatusType::ENABLED);
 
   uint32_t key_id_2 = 7213743;
   key = keyset.add_key();
   key->set_output_prefix_type(OutputPrefixType::TINK);
   key->set_key_id(key_id_2);
+  key->set_status(KeyStatusType::ENABLED);
 
   std::string aead_name_0 = "aead0";
   std::string aead_name_1 = "aead1";
@@ -80,7 +87,7 @@
   entry_result = aead_set->AddPrimitive(std::move(aead), keyset.key(2));
   ASSERT_TRUE(entry_result.ok());
   // The last key is the primary.
-  aead_set->set_primary(entry_result.ValueOrDie());
+  ASSERT_THAT(aead_set->set_primary(entry_result.ValueOrDie()), IsOk());
 
   // Wrap aead_set and test the resulting Aead.
   AeadWrapper wrapper;
diff --git a/cc/aead/aes_ctr_hmac_aead_key_manager.cc b/cc/aead/aes_ctr_hmac_aead_key_manager.cc
index 3fdef97..285eb2f 100644
--- a/cc/aead/aes_ctr_hmac_aead_key_manager.cc
+++ b/cc/aead/aes_ctr_hmac_aead_key_manager.cc
@@ -22,6 +22,7 @@
 #include "tink/aead.h"
 #include "tink/key_manager.h"
 #include "tink/mac.h"
+#include "tink/mac/hmac_key_manager.h"
 #include "tink/registry.h"
 #include "tink/subtle/aes_ctr_boringssl.h"
 #include "tink/subtle/encrypt_then_authenticate.h"
@@ -39,97 +40,65 @@
 namespace crypto {
 namespace tink {
 
+namespace {
+constexpr int kMinKeySizeInBytes = 16;
+constexpr int kMinIvSizeInBytes = 12;
+constexpr int kMinTagSizeInBytes = 10;
+}
+
 using crypto::tink::util::Enums;
 using crypto::tink::util::Status;
 using crypto::tink::util::StatusOr;
 using google::crypto::tink::AesCtrHmacAeadKey;
 using google::crypto::tink::AesCtrHmacAeadKeyFormat;
 using google::crypto::tink::HashType;
-using google::crypto::tink::KeyData;
 
-class AesCtrHmacAeadKeyFactory
-    : public KeyFactoryBase<AesCtrHmacAeadKey, AesCtrHmacAeadKeyFormat> {
- public:
-  AesCtrHmacAeadKeyFactory() = default;
+StatusOr<AesCtrHmacAeadKey> AesCtrHmacAeadKeyManager::CreateKey(
+    const AesCtrHmacAeadKeyFormat& aes_ctr_hmac_aead_key_format) const {
+  AesCtrHmacAeadKey aes_ctr_hmac_aead_key;
+  aes_ctr_hmac_aead_key.set_version(get_version());
 
-  KeyData::KeyMaterialType key_material_type() const override {
-    return KeyData::SYMMETRIC;
+  // Generate AesCtrKey.
+  auto aes_ctr_key = aes_ctr_hmac_aead_key.mutable_aes_ctr_key();
+  aes_ctr_key->set_version(get_version());
+  *(aes_ctr_key->mutable_params()) =
+      aes_ctr_hmac_aead_key_format.aes_ctr_key_format().params();
+  aes_ctr_key->set_key_value(subtle::Random::GetRandomBytes(
+      aes_ctr_hmac_aead_key_format.aes_ctr_key_format().key_size()));
+
+  // Generate HmacKey.
+  auto hmac_key_or = HmacKeyManager().CreateKey(
+      aes_ctr_hmac_aead_key_format.hmac_key_format());
+  if (!hmac_key_or.status().ok()) {
+    return hmac_key_or.status();
   }
+  *aes_ctr_hmac_aead_key.mutable_hmac_key() = hmac_key_or.ValueOrDie();
 
- protected:
-  StatusOr<std::unique_ptr<AesCtrHmacAeadKey>> NewKeyFromFormat(
-      const AesCtrHmacAeadKeyFormat& aes_ctr_hmac_aead_key_format)
-      const override {
-    Status status =
-        AesCtrHmacAeadKeyManager::Validate(aes_ctr_hmac_aead_key_format);
-    if (!status.ok()) return status;
-
-    auto aes_ctr_hmac_aead_key = absl::make_unique<AesCtrHmacAeadKey>();
-    aes_ctr_hmac_aead_key->set_version(AesCtrHmacAeadKeyManager::kVersion);
-
-    // Generate AesCtrKey.
-    auto aes_ctr_key = aes_ctr_hmac_aead_key->mutable_aes_ctr_key();
-    aes_ctr_key->set_version(AesCtrHmacAeadKeyManager::kVersion);
-    *(aes_ctr_key->mutable_params()) =
-        aes_ctr_hmac_aead_key_format.aes_ctr_key_format().params();
-    aes_ctr_key->set_key_value(subtle::Random::GetRandomBytes(
-        aes_ctr_hmac_aead_key_format.aes_ctr_key_format().key_size()));
-
-    // Generate HmacKey.
-    auto hmac_key = aes_ctr_hmac_aead_key->mutable_hmac_key();
-    hmac_key->set_version(AesCtrHmacAeadKeyManager::kVersion);
-    *(hmac_key->mutable_params()) =
-        aes_ctr_hmac_aead_key_format.hmac_key_format().params();
-    hmac_key->set_key_value(subtle::Random::GetRandomBytes(
-        aes_ctr_hmac_aead_key_format.hmac_key_format().key_size()));
-
-    return absl::implicit_cast<StatusOr<std::unique_ptr<AesCtrHmacAeadKey>>>(
-        std::move(aes_ctr_hmac_aead_key));
-  }
-};
-
-constexpr char AesCtrHmacAeadKeyManager::kHmacKeyType[];
-constexpr uint32_t AesCtrHmacAeadKeyManager::kVersion;
-
-const int kMinKeySizeInBytes = 16;
-const int kMinIvSizeInBytes = 12;
-const int kMinTagSizeInBytes = 10;
-
-AesCtrHmacAeadKeyManager::AesCtrHmacAeadKeyManager()
-    : key_factory_(absl::make_unique<AesCtrHmacAeadKeyFactory>()) {}
-
-const KeyFactory& AesCtrHmacAeadKeyManager::get_key_factory() const {
-  return *key_factory_;
+  return aes_ctr_hmac_aead_key;
 }
 
-uint32_t AesCtrHmacAeadKeyManager::get_version() const { return kVersion; }
-
-StatusOr<std::unique_ptr<Aead>> AesCtrHmacAeadKeyManager::GetPrimitiveFromKey(
-    const AesCtrHmacAeadKey& aes_ctr_hmac_aead_key) const {
-  Status status = Validate(aes_ctr_hmac_aead_key);
-  if (!status.ok()) return status;
+StatusOr<std::unique_ptr<Aead>> AesCtrHmacAeadKeyManager::AeadFactory::Create(
+    const AesCtrHmacAeadKey& key) const {
   auto aes_ctr_result = subtle::AesCtrBoringSsl::New(
-      aes_ctr_hmac_aead_key.aes_ctr_key().key_value(),
-      aes_ctr_hmac_aead_key.aes_ctr_key().params().iv_size());
+      key.aes_ctr_key().key_value(),
+      key.aes_ctr_key().params().iv_size());
   if (!aes_ctr_result.ok()) return aes_ctr_result.status();
 
-  auto hmac_result = Registry::GetPrimitive<Mac>(
-      kHmacKeyType, aes_ctr_hmac_aead_key.hmac_key());
+  auto hmac_result = HmacKeyManager().GetPrimitive<Mac>(key.hmac_key());
   if (!hmac_result.ok()) return hmac_result.status();
 
   auto cipher_res = subtle::EncryptThenAuthenticate::New(
       std::move(aes_ctr_result.ValueOrDie()),
-      std::move(hmac_result.ValueOrDie()),
-      aes_ctr_hmac_aead_key.hmac_key().params().tag_size());
+      std::move(hmac_result.ValueOrDie()), key.hmac_key().params().tag_size());
   if (!cipher_res.ok()) {
     return cipher_res.status();
   }
   return std::move(cipher_res.ValueOrDie());
 }
 
-// static
-Status AesCtrHmacAeadKeyManager::Validate(const AesCtrHmacAeadKey& key) {
-  Status status = ValidateVersion(key.version(), kVersion);
+Status AesCtrHmacAeadKeyManager::ValidateKey(
+    const AesCtrHmacAeadKey& key) const {
+  Status status = ValidateVersion(key.version(), get_version());
   if (!status.ok()) return status;
 
   // Validate AesCtrKey.
@@ -144,12 +113,11 @@
     return ToStatusF(util::error::INVALID_ARGUMENT,
                      "Invalid AesCtrHmacAeadKey: IV size out of range.");
   }
-  return Status::OK;
+  return HmacKeyManager().ValidateKey(key.hmac_key());
 }
 
-// static
-Status AesCtrHmacAeadKeyManager::Validate(
-    const AesCtrHmacAeadKeyFormat& key_format) {
+Status AesCtrHmacAeadKeyManager::ValidateKeyFormat(
+    const AesCtrHmacAeadKeyFormat& key_format) const {
   // Validate AesCtrKeyFormat.
   auto aes_ctr_key_format = key_format.aes_ctr_key_format();
   auto status = ValidateAesKeySize(aes_ctr_key_format.key_size());
@@ -190,7 +158,7 @@
     }
   }
 
-  return Status::OK;
+  return HmacKeyManager().ValidateKeyFormat(key_format.hmac_key_format());
 }
 
 }  // namespace tink
diff --git a/cc/aead/aes_ctr_hmac_aead_key_manager.h b/cc/aead/aes_ctr_hmac_aead_key_manager.h
index b5bf726..7e141ae 100644
--- a/cc/aead/aes_ctr_hmac_aead_key_manager.h
+++ b/cc/aead/aes_ctr_hmac_aead_key_manager.h
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2017 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -21,8 +21,9 @@
 
 #include "absl/strings/string_view.h"
 #include "tink/aead.h"
-#include "tink/core/key_manager_base.h"
+#include "tink/core/key_type_manager.h"
 #include "tink/key_manager.h"
+#include "tink/util/constants.h"
 #include "tink/util/errors.h"
 #include "tink/util/protobuf_helper.h"
 #include "tink/util/status.h"
@@ -34,41 +35,40 @@
 namespace tink {
 
 class AesCtrHmacAeadKeyManager
-    : public KeyManagerBase<Aead, google::crypto::tink::AesCtrHmacAeadKey> {
+    : public KeyTypeManager<google::crypto::tink::AesCtrHmacAeadKey,
+                            google::crypto::tink::AesCtrHmacAeadKeyFormat,
+                            List<Aead>> {
  public:
-  static constexpr char kHmacKeyType[] =
-      "type.googleapis.com/google.crypto.tink.HmacKey";
-  static constexpr uint32_t kVersion = 0;
+  class AeadFactory : public PrimitiveFactory<Aead> {
+    crypto::tink::util::StatusOr<std::unique_ptr<Aead>> Create(
+        const google::crypto::tink::AesCtrHmacAeadKey& key) const override;
+  };
 
-  AesCtrHmacAeadKeyManager();
+  AesCtrHmacAeadKeyManager()
+      : KeyTypeManager(absl::make_unique<AeadFactory>()) {}
 
-  // Returns the version of this key manager.
-  uint32_t get_version() const override;
+  uint32_t get_version() const override { return 0; }
 
-  // Returns a factory that generates keys of the key type
-  // handled by this manager.
-  const KeyFactory& get_key_factory() const override;
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::SYMMETRIC;
+  }
 
-  virtual ~AesCtrHmacAeadKeyManager() {}
+  const std::string& get_key_type() const override { return key_type_; }
 
- protected:
-  crypto::tink::util::StatusOr<std::unique_ptr<Aead>> GetPrimitiveFromKey(
-      const google::crypto::tink::AesCtrHmacAeadKey& aes_ctr_hmac_aead_key)
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::AesCtrHmacAeadKey& key) const override;
+  crypto::tink::util::Status ValidateKeyFormat(
+      const google::crypto::tink::AesCtrHmacAeadKeyFormat& key) const override;
+
+  crypto::tink::util::StatusOr<google::crypto::tink::AesCtrHmacAeadKey>
+  CreateKey(const google::crypto::tink::AesCtrHmacAeadKeyFormat& key_format)
       const override;
 
  private:
-  friend class AesCtrHmacAeadKeyFactory;
-
-  std::unique_ptr<KeyFactory> key_factory_;
-
-  // Constructs an instance of AES-CTR-HMAC-AEAD Aead for the given 'key'.
-  crypto::tink::util::StatusOr<std::unique_ptr<Aead>> GetPrimitiveImpl(
-      const google::crypto::tink::AesCtrHmacAeadKey& key) const;
-
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::AesCtrHmacAeadKey& key);
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::AesCtrHmacAeadKeyFormat& key_format);
+  const std::string key_type_ =
+      absl::StrCat(kTypeGoogleapisCom,
+                   google::crypto::tink::AesCtrHmacAeadKey().GetTypeName());
 };
 
 }  // namespace tink
diff --git a/cc/aead/aes_ctr_hmac_aead_key_manager_test.cc b/cc/aead/aes_ctr_hmac_aead_key_manager_test.cc
index 1fe6ef3..5508216 100644
--- a/cc/aead/aes_ctr_hmac_aead_key_manager_test.cc
+++ b/cc/aead/aes_ctr_hmac_aead_key_manager_test.cc
@@ -16,172 +16,53 @@
 
 #include "tink/aead/aes_ctr_hmac_aead_key_manager.h"
 
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
 #include "tink/config.h"
 #include "tink/mac/mac_config.h"
+#include "tink/subtle/aead_test_util.h"
+#include "tink/subtle/aes_ctr_boringssl.h"
+#include "tink/subtle/encrypt_then_authenticate.h"
+#include "tink/subtle/hmac_boringssl.h"
+#include "tink/util/enums.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
-#include "gtest/gtest.h"
+#include "tink/util/test_matchers.h"
 #include "proto/aes_ctr_hmac_aead.pb.h"
-#include "proto/aes_gcm.pb.h"
 #include "proto/common.pb.h"
 #include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
 
-using google::crypto::tink::AesCtrHmacAeadKey;
-using google::crypto::tink::AesCtrHmacAeadKeyFormat;
-using google::crypto::tink::AesGcmKey;
-using google::crypto::tink::AesGcmKeyFormat;
-using google::crypto::tink::HashType;
-using google::crypto::tink::KeyData;
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
+using ::crypto::tink::util::StatusOr;
+using ::google::crypto::tink::AesCtrHmacAeadKey;
+using ::google::crypto::tink::AesCtrHmacAeadKeyFormat;
+using ::google::crypto::tink::HashType;
+using ::google::crypto::tink::KeyData;
+using ::testing::Eq;
+using ::testing::Not;
+using ::testing::SizeIs;
 
 namespace {
 
-class AesCtrHmacAeadKeyManagerTest : public ::testing::Test {
- protected:
-  std::string key_type_prefix = "type.googleapis.com/";
-  std::string aes_ctr_hmac_aead_key_type =
-      "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey";
-
-  void SetUp() override {
-    // Initialize Tink.
-    auto status = MacConfig::Register();
-    if (!status.ok()) {
-      std::clog << "Tink initialization failed: " << status << std::endl;
-      exit(1);
-    }
-  }
-};
-
-TEST_F(AesCtrHmacAeadKeyManagerTest, testBasic) {
-  AesCtrHmacAeadKeyManager key_manager;
-
-  EXPECT_EQ(0, key_manager.get_version());
-  EXPECT_EQ("type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey",
-            key_manager.get_key_type());
-  EXPECT_TRUE(key_manager.DoesSupport(key_manager.get_key_type()));
+TEST(AesCtrHmacAeadKeyManagerTest, Basics) {
+  EXPECT_THAT(AesCtrHmacAeadKeyManager().get_version(), Eq(0));
+  EXPECT_THAT(AesCtrHmacAeadKeyManager().get_key_type(),
+              Eq("type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey"));
+  EXPECT_THAT(AesCtrHmacAeadKeyManager().key_material_type(),
+              Eq(google::crypto::tink::KeyData::SYMMETRIC));
 }
 
-TEST_F(AesCtrHmacAeadKeyManagerTest, testKeyDataErrors) {
-  AesCtrHmacAeadKeyManager key_manager;
-
-  {  // Bad key type.
-    KeyData key_data;
-    std::string bad_key_type =
-        "type.googleapis.com/google.crypto.tink.SomeOtherKey";
-    key_data.set_type_url(bad_key_type);
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, bad_key_type,
-                        result.status().error_message());
-  }
-
-  {  // Bad key value.
-    KeyData key_data;
-    key_data.set_type_url(aes_ctr_hmac_aead_key_type);
-    key_data.set_value("some bad serialized proto");
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
-
-  {  // Bad version.
-    KeyData key_data;
-    AesCtrHmacAeadKey key;
-    key.set_version(1);
-    key_data.set_type_url(aes_ctr_hmac_aead_key_type);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "version",
-                        result.status().error_message());
-  }
-
-  {  // Bad key_value size (supported sizes: 16 or 32).
-    for (int len = 0; len < 42; len++) {
-      AesCtrHmacAeadKey key;
-      key.set_version(0);
-      auto aes_ctr_key = key.mutable_aes_ctr_key();
-      aes_ctr_key->set_key_value(std::string(len, 'a'));
-      aes_ctr_key->mutable_params()->set_iv_size(12);
-      auto hmac_key = key.mutable_hmac_key();
-      hmac_key->set_key_value(std::string(len, 'b'));
-      hmac_key->mutable_params()->set_hash(HashType::SHA1);
-      hmac_key->mutable_params()->set_tag_size(10);
-      KeyData key_data;
-      key_data.set_type_url(aes_ctr_hmac_aead_key_type);
-      key_data.set_value(key.SerializeAsString());
-      auto result = key_manager.GetPrimitive(key_data);
-      if (len == 16 || len == 32) {
-        EXPECT_TRUE(result.ok()) << result.status();
-      } else {
-          EXPECT_FALSE(result.ok());
-          EXPECT_EQ(util::error::INVALID_ARGUMENT,
-                    result.status().error_code());
-          EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                              std::to_string(len) + " bytes",
-                              result.status().error_message());
-          EXPECT_PRED_FORMAT2(testing::IsSubstring, "supported sizes",
-                              result.status().error_message());
-        }
-    }
-  }
+TEST(AesCtrHmacAeadKeyManagerTest, ValidateEmptyKey) {
+  EXPECT_THAT(AesCtrHmacAeadKeyManager().ValidateKey(AesCtrHmacAeadKey()),
+              StatusIs(util::error::INVALID_ARGUMENT));
 }
 
-TEST_F(AesCtrHmacAeadKeyManagerTest, testKeyMessageErrors) {
-  AesCtrHmacAeadKeyManager key_manager;
-
-  {  // Bad protobuffer.
-    AesGcmKey key;
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "AesGcmKey",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-  }
-
-  {  // Bad key_value size (supported sizes: 16 or 32).
-    for (int len = 0; len < 42; len++) {
-      AesCtrHmacAeadKey key;
-      key.set_version(0);
-      auto aes_ctr_key = key.mutable_aes_ctr_key();
-      aes_ctr_key->set_key_value(std::string(len, 'a'));
-      aes_ctr_key->mutable_params()->set_iv_size(12);
-      auto hmac_key = key.mutable_hmac_key();
-      hmac_key->set_key_value(std::string(len, 'b'));
-      hmac_key->mutable_params()->set_hash(HashType::SHA1);
-      hmac_key->mutable_params()->set_tag_size(10);
-      auto result = key_manager.GetPrimitive(key);
-      if (len == 16 || len == 32) {
-        EXPECT_TRUE(result.ok()) << result.status();
-      } else {
-        EXPECT_FALSE(result.ok());
-        EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                            std::to_string(len) + " bytes",
-                            result.status().error_message());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring, "supported sizes",
-                            result.status().error_message());
-      }
-    }
-  }
-}
-
-TEST_F(AesCtrHmacAeadKeyManagerTest, testPrimitives) {
-  std::string plaintext = "some plaintext";
-  std::string aad = "some aad";
-  AesCtrHmacAeadKeyManager key_manager;
+AesCtrHmacAeadKey CreateValidKey() {
   AesCtrHmacAeadKey key;
-
   key.set_version(0);
   auto aes_ctr_key = key.mutable_aes_ctr_key();
   aes_ctr_key->set_key_value(std::string(16, 'a'));
@@ -190,152 +71,146 @@
   hmac_key->set_key_value(std::string(16, 'b'));
   hmac_key->mutable_params()->set_hash(HashType::SHA1);
   hmac_key->mutable_params()->set_tag_size(10);
+  return key;
+}
 
-  {  // Using key message only.
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto cipher = std::move(result.ValueOrDie());
-    auto encrypt_result = cipher->Encrypt(plaintext, aad);
-    EXPECT_TRUE(encrypt_result.ok()) << encrypt_result.status();
-    auto decrypt_result = cipher->Decrypt(encrypt_result.ValueOrDie(), aad);
-    EXPECT_TRUE(decrypt_result.ok()) << decrypt_result.status();
-    EXPECT_EQ(plaintext, decrypt_result.ValueOrDie());
-  }
+TEST(AesCtrHmacAeadKeyManagerTest, ValidKey) {
+  EXPECT_THAT(AesCtrHmacAeadKeyManager().ValidateKey(CreateValidKey()), IsOk());
+}
 
-  {  // Using KeyData proto.
-    KeyData key_data;
-    key_data.set_type_url(aes_ctr_hmac_aead_key_type);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto cipher = std::move(result.ValueOrDie());
-    auto encrypt_result = cipher->Encrypt(plaintext, aad);
-    EXPECT_TRUE(encrypt_result.ok()) << encrypt_result.status();
-    auto decrypt_result = cipher->Decrypt(encrypt_result.ValueOrDie(), aad);
-    EXPECT_TRUE(decrypt_result.ok()) << decrypt_result.status();
-    EXPECT_EQ(plaintext, decrypt_result.ValueOrDie());
+TEST(AesCtrHmacAeadKeyManagerTest, AesKeySizes) {
+  AesCtrHmacAeadKey key = CreateValidKey();
+  for (int len = 0; len < 42; len++) {
+    key.mutable_aes_ctr_key()->set_key_value(std::string(len, 'a'));
+    if (len == 16 || len == 32) {
+      EXPECT_THAT(AesCtrHmacAeadKeyManager().ValidateKey(key), IsOk())
+          << " for length " << len;
+    } else {
+      EXPECT_THAT(AesCtrHmacAeadKeyManager().ValidateKey(key), Not(IsOk()))
+          << " for length " << len;
+    }
   }
 }
 
-TEST_F(AesCtrHmacAeadKeyManagerTest, testNewKeyErrors) {
-  AesCtrHmacAeadKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-
-  {  // Bad key format.
-    AesGcmKeyFormat key_format;
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "AesGcmKeyFormat",
-                        result.status().error_message());
-  }
-
-  {  // Bad serialized key format.
-    auto result = key_factory.NewKey("some bad serialized proto");
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
-
-  {  // Bad AesCtrHmacAeadKeyFormat: small key_size.
-    AesCtrHmacAeadKeyFormat key_format;
-    key_format.mutable_aes_ctr_key_format()->set_key_size(8);
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "8 bytes",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "supported sizes",
-                        result.status().error_message());
-  }
-
-  {  // Bad AesCtrHmacAeadKeyFormat: small HMAC key_size.
-    AesCtrHmacAeadKeyFormat key_format;
-    auto aes_ctr_key_format = key_format.mutable_aes_ctr_key_format();
-    aes_ctr_key_format->set_key_size(16);
-    aes_ctr_key_format->mutable_params()->set_iv_size(12);
-    key_format.mutable_hmac_key_format()->set_key_size(8);
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "key_size",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "too small",
-                        result.status().error_message());
+TEST(AesCtrHmacAeadKeyManagerTest, HmacKeySizes) {
+  AesCtrHmacAeadKey key = CreateValidKey();
+  for (int len = 0; len < 42; len++) {
+    key.mutable_hmac_key()->set_key_value(std::string(len, 'b'));
+    if (len >= 16) {
+      EXPECT_THAT(AesCtrHmacAeadKeyManager().ValidateKey(key), IsOk())
+          << " for length " << len;
+    } else {
+      EXPECT_THAT(AesCtrHmacAeadKeyManager().ValidateKey(key), Not(IsOk()))
+          << " for length " << len;
+    }
   }
 }
 
-TEST_F(AesCtrHmacAeadKeyManagerTest, testNewKeyBasic) {
-  AesCtrHmacAeadKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
+AesCtrHmacAeadKeyFormat CreateValidKeyFormat() {
   AesCtrHmacAeadKeyFormat key_format;
   auto aes_ctr_key_format = key_format.mutable_aes_ctr_key_format();
   aes_ctr_key_format->set_key_size(16);
-  aes_ctr_key_format->mutable_params()->set_iv_size(12);
+  aes_ctr_key_format->mutable_params()->set_iv_size(16);
   auto hmac_key_format = key_format.mutable_hmac_key_format();
-  hmac_key_format->set_key_size(16);
-  hmac_key_format->mutable_params()->set_hash(HashType::SHA1);
-  hmac_key_format->mutable_params()->set_tag_size(10);
+  hmac_key_format->set_key_size(21);
+  hmac_key_format->mutable_params()->set_hash(HashType::SHA256);
+  hmac_key_format->mutable_params()->set_tag_size(16);
+  return key_format;
+}
 
-  { // Via NewKey(format_proto).
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key = std::move(result.ValueOrDie());
-    EXPECT_EQ(key_type_prefix + key->GetTypeName(), aes_ctr_hmac_aead_key_type);
-    std::unique_ptr<AesCtrHmacAeadKey> aes_ctr_hmac_aead_key(
-        static_cast<AesCtrHmacAeadKey*>(key.release()));
-    EXPECT_EQ(0, aes_ctr_hmac_aead_key->version());
-    EXPECT_EQ(key_format.aes_ctr_key_format().key_size(),
-              aes_ctr_hmac_aead_key->aes_ctr_key().key_value().size());
-    auto& hmac_key_format = key_format.hmac_key_format();
-    auto& hmac_key = aes_ctr_hmac_aead_key->hmac_key();
-    EXPECT_EQ(hmac_key_format.params().hash(), hmac_key.params().hash());
-    EXPECT_EQ(hmac_key_format.params().tag_size(),
-              hmac_key.params().tag_size());
-    EXPECT_EQ(hmac_key_format.key_size(), hmac_key.key_value().size());
-  }
+TEST(AesCtrHmacAeadKeyManagerTest, ValidateKeyFormat) {
+  AesCtrHmacAeadKeyFormat key_format = CreateValidKeyFormat();
+  EXPECT_THAT(
+      AesCtrHmacAeadKeyManager().ValidateKeyFormat(CreateValidKeyFormat()),
+      IsOk());
+}
 
-  { // Via NewKey(serialized_format_proto).
-    auto result = key_factory.NewKey(key_format.SerializeAsString());
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key = std::move(result.ValueOrDie());
-    EXPECT_EQ(key_type_prefix + key->GetTypeName(), aes_ctr_hmac_aead_key_type);
-    std::unique_ptr<AesCtrHmacAeadKey> aes_ctr_hmac_aead_key(
-        static_cast<AesCtrHmacAeadKey*>(key.release()));
-    EXPECT_EQ(0, aes_ctr_hmac_aead_key->version());
-    EXPECT_EQ(key_format.aes_ctr_key_format().key_size(),
-              aes_ctr_hmac_aead_key->aes_ctr_key().key_value().size());
-    auto& hmac_key_format = key_format.hmac_key_format();
-    auto& hmac_key = aes_ctr_hmac_aead_key->hmac_key();
-    EXPECT_EQ(hmac_key_format.params().hash(), hmac_key.params().hash());
-    EXPECT_EQ(hmac_key_format.params().tag_size(),
-              hmac_key.params().tag_size());
-    EXPECT_EQ(hmac_key_format.key_size(), hmac_key.key_value().size());
-  }
+TEST(AesCtrHmacAeadKeyManagerTest, ValidateEmptyKeyFormat) {
+  EXPECT_THAT(
+      AesCtrHmacAeadKeyManager().ValidateKeyFormat(AesCtrHmacAeadKeyFormat()),
+      Not(IsOk()));
+}
 
-  { // Via NewKeyData(serialized_format_proto).
-    auto result = key_factory.NewKeyData(key_format.SerializeAsString());
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key_data = std::move(result.ValueOrDie());
-    EXPECT_EQ(aes_ctr_hmac_aead_key_type, key_data->type_url());
-    EXPECT_EQ(KeyData::SYMMETRIC, key_data->key_material_type());
-    AesCtrHmacAeadKey aes_ctr_hmac_aead_key;
-    EXPECT_TRUE(aes_ctr_hmac_aead_key.ParseFromString(key_data->value()));
-    EXPECT_EQ(0, aes_ctr_hmac_aead_key.version());
-    EXPECT_EQ(key_format.aes_ctr_key_format().key_size(),
-              aes_ctr_hmac_aead_key.aes_ctr_key().key_value().size());
-    auto& hmac_key_format = key_format.hmac_key_format();
-    auto& hmac_key = aes_ctr_hmac_aead_key.hmac_key();
-    EXPECT_EQ(hmac_key_format.params().hash(), hmac_key.params().hash());
-    EXPECT_EQ(hmac_key_format.params().tag_size(),
-              hmac_key.params().tag_size());
-    EXPECT_EQ(hmac_key_format.key_size(), hmac_key.key_value().size());
+TEST(AesCtrHmacAeadKeyManagerTest, ValidateKeyFormatKeySizes) {
+  AesCtrHmacAeadKeyFormat key_format = CreateValidKeyFormat();
+  for (int len = 0; len < 42; ++len) {
+    key_format.mutable_aes_ctr_key_format()->set_key_size(len);
+    if (len == 16 || len == 32) {
+      EXPECT_THAT(AesCtrHmacAeadKeyManager().ValidateKeyFormat(key_format),
+                  IsOk())
+          << "for length " << len;
+    } else {
+      EXPECT_THAT(AesCtrHmacAeadKeyManager().ValidateKeyFormat(key_format),
+                  Not(IsOk()))
+          << "for length " << len;
+    }
   }
 }
 
+TEST(AesCtrHmacAeadKeyManagerTest, ValidateKeyFormatHmacKeySizes) {
+  AesCtrHmacAeadKeyFormat key_format = CreateValidKeyFormat();
+  for (int len = 0; len < 42; ++len) {
+    key_format.mutable_hmac_key_format()->set_key_size(len);
+    if (len >= 16) {
+      EXPECT_THAT(AesCtrHmacAeadKeyManager().ValidateKeyFormat(key_format),
+                  IsOk())
+          << "for length " << len;
+    } else {
+      EXPECT_THAT(AesCtrHmacAeadKeyManager().ValidateKeyFormat(key_format),
+                  Not(IsOk()))
+          << "for length " << len;
+    }
+  }
+}
+
+TEST(AesCtrHmacAeadKeyManagerTest, CreateKey) {
+  AesCtrHmacAeadKeyFormat key_format = CreateValidKeyFormat();
+  StatusOr<AesCtrHmacAeadKey> key_or =
+      AesCtrHmacAeadKeyManager().CreateKey(key_format);
+  ASSERT_THAT(key_or.status(), IsOk());
+  const AesCtrHmacAeadKey& key = key_or.ValueOrDie();
+  EXPECT_THAT(AesCtrHmacAeadKeyManager().ValidateKey(key),
+              IsOk());
+  EXPECT_THAT(key.aes_ctr_key().params().iv_size(),
+              Eq(key_format.aes_ctr_key_format().params().iv_size()));
+  EXPECT_THAT(key.aes_ctr_key().key_value(),
+              SizeIs(key_format.aes_ctr_key_format().key_size()));
+  EXPECT_THAT(key.hmac_key().params().hash(),
+              Eq(key_format.hmac_key_format().params().hash()));
+  EXPECT_THAT(key.hmac_key().params().tag_size(),
+              Eq(key_format.hmac_key_format().params().tag_size()));
+  EXPECT_THAT(key.hmac_key().key_value(),
+              SizeIs(key_format.hmac_key_format().key_size()));
+}
+
+TEST(AesCtrHmacAeadKeyManagerTest, CreateAead) {
+  AesCtrHmacAeadKey key = CreateValidKey();
+
+  StatusOr<std::unique_ptr<Aead>> aead_or =
+      AesCtrHmacAeadKeyManager().GetPrimitive<Aead>(key);
+  ASSERT_THAT(aead_or.status(), IsOk());
+
+  auto direct_aes_ctr_or = subtle::AesCtrBoringSsl::New(
+      key.aes_ctr_key().key_value(), key.aes_ctr_key().params().iv_size());
+  ASSERT_THAT(direct_aes_ctr_or.status(), IsOk());
+
+  auto direct_hmac_or = subtle::HmacBoringSsl::New(
+      util::Enums::ProtoToSubtle(key.hmac_key().params().hash()),
+      key.hmac_key().params().tag_size(), key.hmac_key().key_value());
+  ASSERT_THAT(direct_hmac_or.status(), IsOk());
+
+  auto direct_aead_or = subtle::EncryptThenAuthenticate::New(
+      std::move(direct_aes_ctr_or.ValueOrDie()),
+      std::move(direct_hmac_or.ValueOrDie()),
+      key.hmac_key().params().tag_size());
+  ASSERT_THAT(direct_aead_or.status(), IsOk());
+
+  EXPECT_THAT(EncryptThenDecrypt(aead_or.ValueOrDie().get(),
+                                 direct_aead_or.ValueOrDie().get(),
+                                 "message", "aad"),
+              IsOk());
+}
+
 }  // namespace
 }  // namespace tink
 }  // namespace crypto
diff --git a/cc/aead/aes_eax_key_manager.cc b/cc/aead/aes_eax_key_manager.cc
deleted file mode 100644
index 210455f..0000000
--- a/cc/aead/aes_eax_key_manager.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#include "tink/aead/aes_eax_key_manager.h"
-
-#include "absl/base/casts.h"
-#include "absl/strings/string_view.h"
-#include "tink/aead.h"
-#include "tink/key_manager.h"
-#include "tink/subtle/aes_eax_boringssl.h"
-#include "tink/subtle/random.h"
-#include "tink/util/errors.h"
-#include "tink/util/protobuf_helper.h"
-#include "tink/util/status.h"
-#include "tink/util/statusor.h"
-#include "tink/util/validation.h"
-#include "proto/aes_eax.pb.h"
-#include "proto/tink.pb.h"
-
-namespace crypto {
-namespace tink {
-
-using crypto::tink::util::Status;
-using crypto::tink::util::StatusOr;
-using google::crypto::tink::AesEaxKey;
-using google::crypto::tink::AesEaxKeyFormat;
-using google::crypto::tink::KeyData;
-
-class AesEaxKeyFactory : public KeyFactoryBase<AesEaxKey, AesEaxKeyFormat> {
- public:
-  AesEaxKeyFactory() {}
-
-  KeyData::KeyMaterialType key_material_type() const override {
-    return KeyData::SYMMETRIC;
-  }
-
- protected:
-  StatusOr<std::unique_ptr<AesEaxKey>> NewKeyFromFormat(
-      const AesEaxKeyFormat& aes_eax_key_format) const override {
-    Status status = AesEaxKeyManager::Validate(aes_eax_key_format);
-    if (!status.ok()) return status;
-
-    auto aes_eax_key = absl::make_unique<AesEaxKey>();
-    aes_eax_key->set_version(AesEaxKeyManager::kVersion);
-    aes_eax_key->set_key_value(
-        subtle::Random::GetRandomBytes(aes_eax_key_format.key_size()));
-    aes_eax_key->mutable_params()->set_iv_size(
-        aes_eax_key_format.params().iv_size());
-    return absl::implicit_cast<StatusOr<std::unique_ptr<AesEaxKey>>>(
-        std::move(aes_eax_key));
-  }
-};
-
-constexpr uint32_t AesEaxKeyManager::kVersion;
-
-AesEaxKeyManager::AesEaxKeyManager()
-    : key_factory_(absl::make_unique<AesEaxKeyFactory>()) {}
-
-uint32_t AesEaxKeyManager::get_version() const {
-  return kVersion;
-}
-
-const KeyFactory& AesEaxKeyManager::get_key_factory() const {
-  return *key_factory_;
-}
-
-StatusOr<std::unique_ptr<Aead>> AesEaxKeyManager::GetPrimitiveFromKey(
-    const AesEaxKey& aes_eax_key) const {
-  Status status = Validate(aes_eax_key);
-  if (!status.ok()) return status;
-  auto aes_eax_result = subtle::AesEaxBoringSsl::New(
-      aes_eax_key.key_value(), aes_eax_key.params().iv_size());
-  if (!aes_eax_result.ok()) return aes_eax_result.status();
-  return std::move(aes_eax_result.ValueOrDie());
-}
-
-// static
-Status AesEaxKeyManager::Validate(const AesEaxKey& key) {
-  Status status = ValidateVersion(key.version(), kVersion);
-  if (!status.ok()) return status;
-  uint32_t key_size = key.key_value().size();
-  if (key_size != 16 && key_size != 32) {
-      return ToStatusF(util::error::INVALID_ARGUMENT,
-                       "Invalid AesEaxKey: key_value has %d bytes; "
-                       "supported sizes: 16 or 32 bytes.", key_size);
-  }
-  uint32_t iv_size = key.params().iv_size();
-  if (iv_size != 12 && iv_size != 16) {
-      return ToStatusF(util::error::INVALID_ARGUMENT,
-                       "Invalid AesEaxKey: iv_size is %d bytes; "
-                       "supported sizes: 12 or 16 bytes.", iv_size);
-  }
-  return Status::OK;
-}
-
-// static
-Status AesEaxKeyManager::Validate(const AesEaxKeyFormat& key_format) {
-  uint32_t key_size = key_format.key_size();
-  if (key_size != 16 && key_size != 32) {
-      return ToStatusF(util::error::INVALID_ARGUMENT,
-                       "Invalid AesEaxKeyFormat: key_size is %d bytes; "
-                       "supported sizes: 16 or 32 bytes.", key_size);
-  }
-  uint32_t iv_size = key_format.params().iv_size();
-  if (iv_size != 12 && iv_size != 16) {
-      return ToStatusF(util::error::INVALID_ARGUMENT,
-                       "Invalid AesEaxKeyFormat: iv_size is %d bytes; "
-                       "supported sizes: 12 or 16 bytes.", iv_size);
-  }
-  return Status::OK;
-}
-
-}  // namespace tink
-}  // namespace crypto
diff --git a/cc/aead/aes_eax_key_manager.h b/cc/aead/aes_eax_key_manager.h
index 0d442a7..dbbf8b3 100644
--- a/cc/aead/aes_eax_key_manager.h
+++ b/cc/aead/aes_eax_key_manager.h
@@ -19,47 +19,94 @@
 
 #include "absl/strings/string_view.h"
 #include "tink/aead.h"
-#include "tink/core/key_manager_base.h"
-#include "tink/key_manager.h"
+#include "tink/core/key_type_manager.h"
+#include "tink/subtle/aes_eax_boringssl.h"
+#include "tink/subtle/random.h"
+#include "tink/util/constants.h"
 #include "tink/util/errors.h"
 #include "tink/util/protobuf_helper.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
+#include "tink/util/validation.h"
 #include "proto/aes_eax.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
 
 class AesEaxKeyManager
-    : public KeyManagerBase<Aead, google::crypto::tink::AesEaxKey> {
+    : public KeyTypeManager<google::crypto::tink::AesEaxKey,
+                            google::crypto::tink::AesEaxKeyFormat, List<Aead>> {
  public:
-  static constexpr uint32_t kVersion = 0;
+  class AeadFactory : public PrimitiveFactory<Aead> {
+    crypto::tink::util::StatusOr<std::unique_ptr<Aead>> Create(
+        const google::crypto::tink::AesEaxKey& key) const override {
+      return subtle::AesEaxBoringSsl::New(key.key_value(),
+                                          key.params().iv_size());
+    }
+  };
 
-  AesEaxKeyManager();
+  AesEaxKeyManager() : KeyTypeManager(absl::make_unique<AeadFactory>()) {}
 
-  // Returns the version of this key manager.
-  uint32_t get_version() const override;
+  uint32_t get_version() const override { return 0; }
 
-  // Returns a factory that generates keys of the key type
-  // handled by this manager.
-  const KeyFactory& get_key_factory() const override;
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::SYMMETRIC;
+  }
 
-  virtual ~AesEaxKeyManager() {}
+  const std::string& get_key_type() const override { return key_type_; }
 
- protected:
-  crypto::tink::util::StatusOr<std::unique_ptr<Aead>> GetPrimitiveFromKey(
-      const google::crypto::tink::AesEaxKey& aes_eax_key) const override;
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::AesEaxKey& key) const override {
+    crypto::tink::util::Status status =
+        ValidateVersion(key.version(), get_version());
+    if (!status.ok()) return status;
+    status = ValidateKeySize(key.key_value().size());
+    if (!status.ok()) return status;
+    return ValidateIvSize(key.params().iv_size());
+  }
+
+  crypto::tink::util::Status ValidateKeyFormat(
+      const google::crypto::tink::AesEaxKeyFormat& key_format) const override {
+    crypto::tink::util::Status status = ValidateKeySize(key_format.key_size());
+    if (!status.ok()) return status;
+    return ValidateIvSize(key_format.params().iv_size());
+  }
+
+  crypto::tink::util::StatusOr<google::crypto::tink::AesEaxKey> CreateKey(
+      const google::crypto::tink::AesEaxKeyFormat& key_format) const override {
+    google::crypto::tink::AesEaxKey aes_eax_key;
+    aes_eax_key.set_version(get_version());
+    aes_eax_key.set_key_value(
+        subtle::Random::GetRandomBytes(key_format.key_size()));
+    aes_eax_key.mutable_params()->set_iv_size(
+        key_format.params().iv_size());
+    return aes_eax_key;
+  }
 
  private:
-  friend class AesEaxKeyFactory;
+  crypto::tink::util::Status ValidateKeySize(uint32_t key_size) const {
+    if (key_size != 16 && key_size != 32) {
+      return crypto::tink::util::Status(
+          util::error::INVALID_ARGUMENT,
+          absl::StrCat("Invalid key size: ", key_size,
+                       " bytes, expected 16 or 32 bytes."));
+    }
+    return crypto::tink::util::OkStatus();
+  }
 
-  std::unique_ptr<KeyFactory> key_factory_;
+  crypto::tink::util::Status ValidateIvSize(uint32_t iv_size) const {
+    if (iv_size != 12 && iv_size != 16) {
+      return crypto::tink::util::Status(
+          util::error::INVALID_ARGUMENT,
+          absl::StrCat("Invalid IV size: ", iv_size,
+                       " bytes, expected 12 or 16 bytes."));
+    }
+    return crypto::tink::util::OkStatus();
+  }
 
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::AesEaxKey& key);
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::AesEaxKeyFormat& key_format);
+  const std::string key_type_ = absl::StrCat(
+      kTypeGoogleapisCom, google::crypto::tink::AesEaxKey().GetTypeName());
 };
 
 }  // namespace tink
diff --git a/cc/aead/aes_eax_key_manager_test.cc b/cc/aead/aes_eax_key_manager_test.cc
index 28684fb..1ee48ab 100644
--- a/cc/aead/aes_eax_key_manager_test.cc
+++ b/cc/aead/aes_eax_key_manager_test.cc
@@ -14,308 +14,178 @@
 
 #include "tink/aead/aes_eax_key_manager.h"
 
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
 #include "tink/aead.h"
+#include "tink/subtle/aead_test_util.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
-#include "gtest/gtest.h"
-#include "proto/aes_gcm.pb.h"
+#include "tink/util/test_matchers.h"
 #include "proto/aes_eax.pb.h"
-#include "proto/common.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
 
-using google::crypto::tink::AesEaxKey;
-using google::crypto::tink::AesEaxKeyFormat;
-using google::crypto::tink::AesGcmKey;
-using google::crypto::tink::AesGcmKeyFormat;
-using google::crypto::tink::KeyData;
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::util::StatusOr;
+using ::google::crypto::tink::AesEaxKey;
+using ::google::crypto::tink::AesEaxKeyFormat;
+using ::testing::Eq;
+using ::testing::Ne;
+using ::testing::Not;
+using ::testing::SizeIs;
 
 namespace {
 
-class AesEaxKeyManagerTest : public ::testing::Test {
- protected:
-  std::string key_type_prefix = "type.googleapis.com/";
-  std::string aes_eax_key_type =
-      "type.googleapis.com/google.crypto.tink.AesEaxKey";
-};
-
-TEST_F(AesEaxKeyManagerTest, testBasic) {
-  AesEaxKeyManager key_manager;
-
-  EXPECT_EQ(0, key_manager.get_version());
-  EXPECT_EQ("type.googleapis.com/google.crypto.tink.AesEaxKey",
-            key_manager.get_key_type());
-  EXPECT_TRUE(key_manager.DoesSupport(key_manager.get_key_type()));
+TEST(AesEaxKeyManagerTest, Basics) {
+  EXPECT_THAT(AesEaxKeyManager().get_version(), Eq(0));
+  EXPECT_THAT(AesEaxKeyManager().get_key_type(),
+              Eq("type.googleapis.com/google.crypto.tink.AesEaxKey"));
+  EXPECT_THAT(AesEaxKeyManager().key_material_type(),
+              Eq(google::crypto::tink::KeyData::SYMMETRIC));
 }
 
-TEST_F(AesEaxKeyManagerTest, testKeyDataErrors) {
-  AesEaxKeyManager key_manager;
+TEST(AesEaxKeyManagerTest, ValidateEmptyKey) {
+  EXPECT_THAT(AesEaxKeyManager().ValidateKey(AesEaxKey()), Not(IsOk()));
+}
 
-  {  // Bad key type.
-    KeyData key_data;
-    std::string bad_key_type =
-        "type.googleapis.com/google.crypto.tink.SomeOtherKey";
-    key_data.set_type_url(bad_key_type);
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, bad_key_type,
-                        result.status().error_message());
-  }
+TEST(AesEaxKeyManagerTest, ValidateEmptyKeyFormat) {
+  EXPECT_THAT(AesEaxKeyManager().ValidateKeyFormat(AesEaxKeyFormat()),
+              Not(IsOk()));
+}
 
-  {  // Bad key value.
-    KeyData key_data;
-    key_data.set_type_url(aes_eax_key_type);
-    key_data.set_value("some bad serialized proto");
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
+TEST(AesEaxKeyManagerTest, ValidKeyFormat) {
+  AesEaxKeyFormat format;
+  format.set_key_size(32);
+  format.mutable_params()->set_iv_size(16);
+  EXPECT_THAT(AesEaxKeyManager().ValidateKeyFormat(format), IsOk());
+}
 
-  {  // Bad version.
-    KeyData key_data;
-    AesEaxKey key;
-    key.set_version(1);
-    key_data.set_type_url(aes_eax_key_type);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "version",
-                        result.status().error_message());
-  }
+TEST(AesEaxKeyManagerTest, ValidKeyFormatKeySize) {
+  AesEaxKeyFormat format;
+  format.mutable_params()->set_iv_size(16);
 
-  {  // Bad key_value size (supported sizes: 16, 32).
-    for (int len = 0; len < 42; len++) {
-      AesEaxKey key;
-      key.set_version(0);
-      key.set_key_value(std::string(len, 'a'));
-      key.mutable_params()->set_iv_size(12);
-      KeyData key_data;
-      key_data.set_type_url(aes_eax_key_type);
-      key_data.set_value(key.SerializeAsString());
-      auto result = key_manager.GetPrimitive(key_data);
-      if (len == 16 || len == 32) {
-        EXPECT_TRUE(result.ok()) << result.status();
-      } else {
-        EXPECT_FALSE(result.ok());
-        EXPECT_EQ(util::error::INVALID_ARGUMENT,
-                  result.status().error_code());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                            std::to_string(len) + " bytes",
-                            result.status().error_message());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring, "supported sizes",
-                            result.status().error_message());
-      }
-    }
-  }
-
-  {  // Bad iv_size value (supported sizes: 12, 16).
-    int key_size = 16;
-    for (int iv_size = 0; iv_size < 42; iv_size++) {
-      AesEaxKey key;
-      key.set_version(0);
-      key.set_key_value(std::string(key_size, 'a'));
-      key.mutable_params()->set_iv_size(iv_size);
-      KeyData key_data;
-      key_data.set_type_url(aes_eax_key_type);
-      key_data.set_value(key.SerializeAsString());
-      auto result = key_manager.GetPrimitive(key_data);
-      if (iv_size == 12 || iv_size == 16) {
-        EXPECT_TRUE(result.ok()) << result.status();
-      } else {
-        EXPECT_FALSE(result.ok());
-        EXPECT_EQ(util::error::INVALID_ARGUMENT,
-                  result.status().error_code());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                            std::to_string(iv_size) + " bytes",
-                            result.status().error_message());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring, "supported sizes",
-                            result.status().error_message());
-      }
+  for (int len = 0; len < 200; ++len) {
+    format.set_key_size(len);
+    if (len == 16 || len == 32) {
+      EXPECT_THAT(AesEaxKeyManager().ValidateKeyFormat(format), IsOk())
+          << "for len = " << len;
+    } else {
+      EXPECT_THAT(AesEaxKeyManager().ValidateKeyFormat(format), Not(IsOk()))
+          << "for len = " << len;
     }
   }
 }
 
-TEST_F(AesEaxKeyManagerTest, testKeyMessageErrors) {
-  AesEaxKeyManager key_manager;
+TEST(AesEaxKeyManagerTest, ValidKeyFormatIvSize) {
+  AesEaxKeyFormat format;
+  format.set_key_size(32);
 
-  {  // Bad protobuffer.
-    AesGcmKey key;
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "AesGcmKey",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-  }
-
-  {  // Bad key_value size (supported sizes: 16, 32).
-    for (int len = 0; len < 42; len++) {
-      AesEaxKey key;
-      key.set_version(0);
-      key.set_key_value(std::string(len, 'a'));
-      key.mutable_params()->set_iv_size(16);
-      auto result = key_manager.GetPrimitive(key);
-      if (len == 16 || len == 32) {
-        EXPECT_TRUE(result.ok()) << result.status();
-      } else {
-        EXPECT_FALSE(result.ok());
-        EXPECT_EQ(util::error::INVALID_ARGUMENT,
-                  result.status().error_code());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                            std::to_string(len) + " bytes",
-                            result.status().error_message());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring, "supported sizes",
-                            result.status().error_message());
-      }
-    }
-  }
-
-  {  // Bad iv_size value (supported sizes: 12, 16).
-    int key_size = 32;
-    for (int iv_size = 0; iv_size < 42; iv_size++) {
-      AesEaxKey key;
-      key.set_version(0);
-      key.set_key_value(std::string(key_size, 'a'));
-      key.mutable_params()->set_iv_size(iv_size);
-      auto result = key_manager.GetPrimitive(key);
-      if (iv_size == 12 || iv_size == 16) {
-        EXPECT_TRUE(result.ok()) << result.status();
-      } else {
-        EXPECT_FALSE(result.ok());
-        EXPECT_EQ(util::error::INVALID_ARGUMENT,
-                  result.status().error_code());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                            std::to_string(iv_size) + " bytes",
-                            result.status().error_message());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring, "supported sizes",
-                            result.status().error_message());
-      }
+  for (int iv_size = 0; iv_size < 200; ++iv_size) {
+    format.mutable_params()->set_iv_size(iv_size);
+    if (iv_size == 12 || iv_size == 16) {
+      EXPECT_THAT(AesEaxKeyManager().ValidateKeyFormat(format), IsOk())
+          << "for iv_size = " << iv_size;
+    } else {
+      EXPECT_THAT(AesEaxKeyManager().ValidateKeyFormat(format), Not(IsOk()))
+          << "for iv_size = " << iv_size;
     }
   }
 }
 
-TEST_F(AesEaxKeyManagerTest, testPrimitives) {
-  std::string plaintext = "some plaintext";
-  std::string aad = "some aad";
-  AesEaxKeyManager key_manager;
+TEST(AesEaxKeyManagerTest, CreateKey) {
+  AesEaxKeyFormat format;
+  format.set_key_size(32);
+  format.mutable_params()->set_iv_size(16);
+  auto key_or = AesEaxKeyManager().CreateKey(format);
+  ASSERT_THAT(key_or.status(), IsOk());
+  EXPECT_THAT(key_or.ValueOrDie().key_value(), SizeIs(format.key_size()));
+  EXPECT_THAT(key_or.ValueOrDie().params().iv_size(),
+              Eq(format.params().iv_size()));
+}
+
+TEST(AesEaxKeyManagerTest, CreateKeyIsValid) {
+  AesEaxKeyFormat format;
+  format.set_key_size(32);
+  format.mutable_params()->set_iv_size(16);
+  auto key_or = AesEaxKeyManager().CreateKey(format);
+  ASSERT_THAT(key_or.status(), IsOk());
+  EXPECT_THAT(AesEaxKeyManager().ValidateKey(key_or.ValueOrDie()), IsOk());
+}
+
+TEST(AesEaxKeyManagerTest, MultipleCreateCallsCreateDifferentKeys) {
+  AesEaxKeyFormat format;
+  AesEaxKeyManager manager;
+  format.set_key_size(32);
+  format.mutable_params()->set_iv_size(16);
+  auto key1_or = manager.CreateKey(format);
+  ASSERT_THAT(key1_or.status(), IsOk());
+  auto key2_or = manager.CreateKey(format);
+  ASSERT_THAT(key2_or.status(), IsOk());
+  EXPECT_THAT(key1_or.ValueOrDie().key_value(),
+              Ne(key2_or.ValueOrDie().key_value()));
+}
+
+TEST(AesEaxKeyManagerTest, ValidKey) {
   AesEaxKey key;
+  key.set_key_value(std::string(32, 'a'));
+  key.mutable_params()->set_iv_size(16);
+  EXPECT_THAT(AesEaxKeyManager().ValidateKey(key), IsOk());
+}
 
-  key.set_version(0);
-  key.set_key_value("16 bytes of key ");
+TEST(AesEaxKeyManagerTest, ValidateKeyKeyLength) {
+  AesEaxKey key;
   key.mutable_params()->set_iv_size(16);
 
-  {  // Using key message only.
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto aes_eax = std::move(result.ValueOrDie());
-    auto encrypt_result = aes_eax->Encrypt(plaintext, aad);
-    EXPECT_TRUE(encrypt_result.ok()) << encrypt_result.status();
-    auto decrypt_result = aes_eax->Decrypt(encrypt_result.ValueOrDie(), aad);
-    EXPECT_TRUE(decrypt_result.ok()) << decrypt_result.status();
-    EXPECT_EQ(plaintext, decrypt_result.ValueOrDie());
-  }
-
-  {  // Using KeyData proto.
-    KeyData key_data;
-    key_data.set_type_url(aes_eax_key_type);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto aes_eax = std::move(result.ValueOrDie());
-    auto encrypt_result = aes_eax->Encrypt(plaintext, aad);
-    EXPECT_TRUE(encrypt_result.ok()) << encrypt_result.status();
-    auto decrypt_result = aes_eax->Decrypt(encrypt_result.ValueOrDie(), aad);
-    EXPECT_TRUE(decrypt_result.ok()) << decrypt_result.status();
-    EXPECT_EQ(plaintext, decrypt_result.ValueOrDie());
+  for (int len = 0; len < 200; ++len) {
+    key.set_key_value(std::string(len, 'a'));
+    if (len == 16 || len == 32) {
+      EXPECT_THAT(AesEaxKeyManager().ValidateKey(key), IsOk())
+          << "for len = " << len;
+    } else {
+      EXPECT_THAT(AesEaxKeyManager().ValidateKey(key), Not(IsOk()))
+          << "for len = " << len;
+    }
   }
 }
 
-TEST_F(AesEaxKeyManagerTest, testNewKeyErrors) {
-  AesEaxKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
+TEST(AesEaxKeyManagerTest, ValidateKeyIvLength) {
+  AesEaxKey key;
+  key.set_key_value(std::string(32, 'a'));
 
-  {  // Bad key format.
-    AesGcmKeyFormat key_format;
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "AesGcmKeyFormat",
-                        result.status().error_message());
-  }
-
-  {  // Bad serialized key format.
-    auto result = key_factory.NewKey("some bad serialized proto");
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
-
-  {  // Bad AesEaxKeyFormat: small key_size.
-    AesEaxKeyFormat key_format;
-    key_format.set_key_size(8);
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "key_size",
-                        result.status().error_message());
+  for (int iv_len = 0; iv_len < 200; ++iv_len) {
+    key.mutable_params()->set_iv_size(iv_len);
+    if (iv_len == 12 || iv_len == 16) {
+      EXPECT_THAT(AesEaxKeyManager().ValidateKey(key), IsOk())
+          << "for iv_size = " << iv_len;
+    } else {
+      EXPECT_THAT(AesEaxKeyManager().ValidateKey(key), Not(IsOk()))
+          << "for iv_size = " << iv_len;
+    }
   }
 }
 
-TEST_F(AesEaxKeyManagerTest, testNewKeyBasic) {
-  AesEaxKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-  AesEaxKeyFormat key_format;
-  key_format.set_key_size(16);
-  key_format.mutable_params()->set_iv_size(12);
+TEST(AesGcmKeyManagerTest, CreateAead) {
+  AesEaxKeyFormat format;
+  format.set_key_size(32);
+  format.mutable_params()->set_iv_size(16);
+  StatusOr<AesEaxKey> key_or = AesEaxKeyManager().CreateKey(format);
+  ASSERT_THAT(key_or.status(), IsOk());
 
-  { // Via NewKey(format_proto).
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key = std::move(result.ValueOrDie());
-    EXPECT_EQ(key_type_prefix + key->GetTypeName(), aes_eax_key_type);
-    std::unique_ptr<AesEaxKey> aes_eax_key(
-        reinterpret_cast<AesEaxKey*>(key.release()));
-    EXPECT_EQ(0, aes_eax_key->version());
-    EXPECT_EQ(key_format.key_size(), aes_eax_key->key_value().size());
-    EXPECT_EQ(key_format.params().iv_size(), aes_eax_key->params().iv_size());
-  }
+  StatusOr<std::unique_ptr<Aead>> aead_or =
+      AesEaxKeyManager().GetPrimitive<Aead>(key_or.ValueOrDie());
 
-  { // Via NewKey(serialized_format_proto).
-    auto result = key_factory.NewKey(key_format.SerializeAsString());
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key = std::move(result.ValueOrDie());
-    EXPECT_EQ(key_type_prefix + key->GetTypeName(), aes_eax_key_type);
-    std::unique_ptr<AesEaxKey> aes_eax_key(
-        reinterpret_cast<AesEaxKey*>(key.release()));
-    EXPECT_EQ(0, aes_eax_key->version());
-    EXPECT_EQ(key_format.key_size(), aes_eax_key->key_value().size());
-    EXPECT_EQ(key_format.params().iv_size(), aes_eax_key->params().iv_size());
-  }
+  ASSERT_THAT(aead_or.status(), IsOk());
 
-  { // Via NewKeyData(serialized_format_proto).
-    auto result = key_factory.NewKeyData(key_format.SerializeAsString());
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key_data = std::move(result.ValueOrDie());
-    EXPECT_EQ(aes_eax_key_type, key_data->type_url());
-    EXPECT_EQ(KeyData::SYMMETRIC, key_data->key_material_type());
-    AesEaxKey aes_eax_key;
-    EXPECT_TRUE(aes_eax_key.ParseFromString(key_data->value()));
-    EXPECT_EQ(0, aes_eax_key.version());
-    EXPECT_EQ(key_format.key_size(), aes_eax_key.key_value().size());
-    EXPECT_EQ(key_format.params().iv_size(), aes_eax_key.params().iv_size());
-  }
+  StatusOr<std::unique_ptr<Aead>> boring_ssl_aead_or =
+      subtle::AesEaxBoringSsl::New(key_or.ValueOrDie().key_value(),
+                                   key_or.ValueOrDie().params().iv_size());
+  ASSERT_THAT(boring_ssl_aead_or.status(), IsOk());
+
+  ASSERT_THAT(EncryptThenDecrypt(aead_or.ValueOrDie().get(),
+                                 boring_ssl_aead_or.ValueOrDie().get(),
+                                 "message", "aad"),
+              IsOk());
 }
 
 }  // namespace
diff --git a/cc/aead/aes_gcm_key_manager.cc b/cc/aead/aes_gcm_key_manager.cc
deleted file mode 100644
index cc98c42..0000000
--- a/cc/aead/aes_gcm_key_manager.cc
+++ /dev/null
@@ -1,99 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#include "tink/aead/aes_gcm_key_manager.h"
-
-#include "absl/base/casts.h"
-#include "absl/strings/string_view.h"
-#include "tink/aead.h"
-#include "tink/key_manager.h"
-#include "tink/subtle/aes_gcm_boringssl.h"
-#include "tink/subtle/random.h"
-#include "tink/util/errors.h"
-#include "tink/util/protobuf_helper.h"
-#include "tink/util/status.h"
-#include "tink/util/statusor.h"
-#include "tink/util/validation.h"
-#include "proto/aes_gcm.pb.h"
-#include "proto/tink.pb.h"
-
-namespace crypto {
-namespace tink {
-
-using ::crypto::tink::util::Status;
-using ::crypto::tink::util::StatusOr;
-using ::google::crypto::tink::AesGcmKey;
-using ::google::crypto::tink::AesGcmKeyFormat;
-using ::google::crypto::tink::KeyData;
-
-class AesGcmKeyFactory : public KeyFactoryBase<AesGcmKey, AesGcmKeyFormat> {
- public:
-  AesGcmKeyFactory() {}
-
-  KeyData::KeyMaterialType key_material_type() const override {
-    return KeyData::SYMMETRIC;
-  }
-
- protected:
-  StatusOr<std::unique_ptr<AesGcmKey>> NewKeyFromFormat(
-      const AesGcmKeyFormat& aes_gcm_key_format) const override {
-    Status status = AesGcmKeyManager::Validate(aes_gcm_key_format);
-    if (!status.ok()) return status;
-    std::unique_ptr<AesGcmKey> aes_gcm_key(new AesGcmKey());
-    aes_gcm_key->set_version(AesGcmKeyManager::kVersion);
-    aes_gcm_key->set_key_value(
-        subtle::Random::GetRandomBytes(aes_gcm_key_format.key_size()));
-    return absl::implicit_cast<StatusOr<std::unique_ptr<AesGcmKey>>>(
-        std::move(aes_gcm_key));
-  }
-};
-
-constexpr uint32_t AesGcmKeyManager::kVersion;
-
-AesGcmKeyManager::AesGcmKeyManager()
-    : key_factory_(absl::make_unique<AesGcmKeyFactory>()) {}
-
-uint32_t AesGcmKeyManager::get_version() const {
-  return kVersion;
-}
-
-const KeyFactory& AesGcmKeyManager::get_key_factory() const {
-  return *key_factory_;
-}
-
-StatusOr<std::unique_ptr<Aead>> AesGcmKeyManager::GetPrimitiveFromKey(
-    const AesGcmKey& aes_gcm_key) const {
-  Status status = Validate(aes_gcm_key);
-  if (!status.ok()) return status;
-  auto aes_gcm_result = subtle::AesGcmBoringSsl::New(aes_gcm_key.key_value());
-  if (!aes_gcm_result.ok()) return aes_gcm_result.status();
-  return std::move(aes_gcm_result.ValueOrDie());
-}
-
-// static
-Status AesGcmKeyManager::Validate(const AesGcmKey& key) {
-  Status status = ValidateVersion(key.version(), kVersion);
-  if (!status.ok()) return status;
-  return ValidateAesKeySize(key.key_value().size());
-}
-
-// static
-Status AesGcmKeyManager::Validate(const AesGcmKeyFormat& key_format) {
-  return ValidateAesKeySize(key_format.key_size());
-}
-
-}  // namespace tink
-}  // namespace crypto
diff --git a/cc/aead/aes_gcm_key_manager.h b/cc/aead/aes_gcm_key_manager.h
index 5bb41d4..5920b8c 100644
--- a/cc/aead/aes_gcm_key_manager.h
+++ b/cc/aead/aes_gcm_key_manager.h
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2017 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -21,12 +21,16 @@
 
 #include "absl/strings/string_view.h"
 #include "tink/aead.h"
-#include "tink/core/key_manager_base.h"
+#include "tink/core/key_type_manager.h"
 #include "tink/key_manager.h"
+#include "tink/subtle/aes_gcm_boringssl.h"
+#include "tink/subtle/random.h"
+#include "tink/util/constants.h"
 #include "tink/util/errors.h"
 #include "tink/util/protobuf_helper.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
+#include "tink/util/validation.h"
 #include "proto/aes_gcm.pb.h"
 #include "proto/tink.pb.h"
 
@@ -34,34 +38,56 @@
 namespace tink {
 
 class AesGcmKeyManager
-    : public KeyManagerBase<Aead, google::crypto::tink::AesGcmKey> {
+    : public KeyTypeManager<google::crypto::tink::AesGcmKey,
+                            google::crypto::tink::AesGcmKeyFormat, List<Aead>> {
  public:
-  static constexpr uint32_t kVersion = 0;
+  class AeadFactory : public PrimitiveFactory<Aead> {
+    crypto::tink::util::StatusOr<std::unique_ptr<Aead>> Create(
+        const google::crypto::tink::AesGcmKey& key) const override {
+      auto aes_gcm_result = subtle::AesGcmBoringSsl::New(key.key_value());
+      if (!aes_gcm_result.ok()) return aes_gcm_result.status();
+      return {std::move(aes_gcm_result.ValueOrDie())};
+    }
+  };
 
-  AesGcmKeyManager();
+  AesGcmKeyManager()
+      : KeyTypeManager(absl::make_unique<AesGcmKeyManager::AeadFactory>()) {}
 
   // Returns the version of this key manager.
-  uint32_t get_version() const override;
+  uint32_t get_version() const override { return 0; }
 
-  // Returns a factory that generates keys of the key type
-  // handled by this manager.
-  const KeyFactory& get_key_factory() const override;
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::SYMMETRIC;
+  }
 
-  virtual ~AesGcmKeyManager() {}
+  const std::string& get_key_type() const override { return key_type_; }
 
- protected:
-  crypto::tink::util::StatusOr<std::unique_ptr<Aead>> GetPrimitiveFromKey(
-      const google::crypto::tink::AesGcmKey& key) const override;
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::AesGcmKey& key) const override {
+    crypto::tink::util::Status status =
+        ValidateVersion(key.version(), get_version());
+    if (!status.ok()) return status;
+    return ValidateAesKeySize(key.key_value().size());
+  }
+
+  crypto::tink::util::Status ValidateKeyFormat(
+      const google::crypto::tink::AesGcmKeyFormat& key_format) const override {
+    return ValidateAesKeySize(key_format.key_size());
+  }
+
+  crypto::tink::util::StatusOr<google::crypto::tink::AesGcmKey> CreateKey(
+      const google::crypto::tink::AesGcmKeyFormat& key_format) const override {
+    google::crypto::tink::AesGcmKey key;
+    key.set_version(get_version());
+    key.set_key_value(
+        crypto::tink::subtle::Random::GetRandomBytes(key_format.key_size()));
+    return key;
+  }
 
  private:
-  friend class AesGcmKeyFactory;
-
-  std::unique_ptr<KeyFactory> key_factory_;
-
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::AesGcmKey& key);
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::AesGcmKeyFormat& key_format);
+  const std::string key_type_ = absl::StrCat(
+      kTypeGoogleapisCom, google::crypto::tink::AesGcmKey().GetTypeName());
 };
 
 }  // namespace tink
diff --git a/cc/aead/aes_gcm_key_manager_test.cc b/cc/aead/aes_gcm_key_manager_test.cc
index e069b44..6fb32a7 100644
--- a/cc/aead/aes_gcm_key_manager_test.cc
+++ b/cc/aead/aes_gcm_key_manager_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2017 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,255 +16,170 @@
 
 #include "tink/aead/aes_gcm_key_manager.h"
 
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
 #include "tink/aead.h"
+#include "tink/subtle/aead_test_util.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
-#include "gtest/gtest.h"
-#include "proto/aes_eax.pb.h"
+#include "tink/util/test_matchers.h"
 #include "proto/aes_gcm.pb.h"
-#include "proto/common.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
 
-using google::crypto::tink::AesEaxKey;
-using google::crypto::tink::AesEaxKeyFormat;
-using google::crypto::tink::AesGcmKey;
-using google::crypto::tink::AesGcmKeyFormat;
-using google::crypto::tink::KeyData;
-
 namespace {
 
-class AesGcmKeyManagerTest : public ::testing::Test {
- protected:
-  std::string key_type_prefix = "type.googleapis.com/";
-  std::string aes_gcm_key_type =
-      "type.googleapis.com/google.crypto.tink.AesGcmKey";
-};
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
+using ::crypto::tink::util::StatusOr;
+using ::google::crypto::tink::AesGcmKey;
+using ::google::crypto::tink::AesGcmKeyFormat;
+using ::testing::Eq;
 
-TEST_F(AesGcmKeyManagerTest, testBasic) {
-  AesGcmKeyManager key_manager;
-
-  EXPECT_EQ(0, key_manager.get_version());
-  EXPECT_EQ("type.googleapis.com/google.crypto.tink.AesGcmKey",
-            key_manager.get_key_type());
-  EXPECT_TRUE(key_manager.DoesSupport(key_manager.get_key_type()));
+TEST(AesGcmKeyManagerTest, Basics) {
+  EXPECT_THAT(AesGcmKeyManager().get_version(), Eq(0));
+  EXPECT_THAT(AesGcmKeyManager().get_key_type(),
+              Eq("type.googleapis.com/google.crypto.tink.AesGcmKey"));
+  EXPECT_THAT(AesGcmKeyManager().key_material_type(),
+              Eq(google::crypto::tink::KeyData::SYMMETRIC));
 }
 
-TEST_F(AesGcmKeyManagerTest, testKeyDataErrors) {
-  AesGcmKeyManager key_manager;
-
-  {  // Bad key type.
-    KeyData key_data;
-    std::string bad_key_type =
-        "type.googleapis.com/google.crypto.tink.SomeOtherKey";
-    key_data.set_type_url(bad_key_type);
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, bad_key_type,
-                        result.status().error_message());
-  }
-
-  {  // Bad key value.
-    KeyData key_data;
-    key_data.set_type_url(aes_gcm_key_type);
-    key_data.set_value("some bad serialized proto");
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
-
-  {  // Bad version.
-    KeyData key_data;
-    AesGcmKey key;
-    key.set_version(1);
-    key_data.set_type_url(aes_gcm_key_type);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "version",
-                        result.status().error_message());
-  }
-
-  {  // Bad key_value size (supported sizes: 16, 32).
-    for (int len = 0; len < 42; len++) {
-      AesGcmKey key;
-      key.set_version(0);
-      key.set_key_value(std::string(len, 'a'));
-      KeyData key_data;
-      key_data.set_type_url(aes_gcm_key_type);
-      key_data.set_value(key.SerializeAsString());
-      auto result = key_manager.GetPrimitive(key_data);
-      if (len == 16 || len == 32) {
-        EXPECT_TRUE(result.ok()) << result.status();
-      } else {
-        EXPECT_FALSE(result.ok());
-        EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                            std::to_string(len) + " bytes",
-                            result.status().error_message());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring, "supported sizes",
-                            result.status().error_message());
-      }
-    }
-  }
+TEST(AesGcmKeyManagerTest, ValidateEmptyKey) {
+  EXPECT_THAT(AesGcmKeyManager().ValidateKey(AesGcmKey()),
+              StatusIs(util::error::INVALID_ARGUMENT));
 }
 
-TEST_F(AesGcmKeyManagerTest, testKeyMessageErrors) {
-  AesGcmKeyManager key_manager;
-
-  {  // Bad protobuffer.
-    AesEaxKey key;
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "AesEaxKey",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-  }
-
-  {  // Bad key_value size (supported sizes: 16, 32).
-    for (int len = 0; len < 42; len++) {
-      AesGcmKey key;
-      key.set_version(0);
-      key.set_key_value(std::string(len, 'a'));
-      auto result = key_manager.GetPrimitive(key);
-      if (len == 16 || len == 32) {
-        EXPECT_TRUE(result.ok()) << result.status();
-      } else {
-          EXPECT_FALSE(result.ok());
-          EXPECT_EQ(util::error::INVALID_ARGUMENT,
-                    result.status().error_code());
-          EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                              std::to_string(len) + " bytes",
-                              result.status().error_message());
-          EXPECT_PRED_FORMAT2(testing::IsSubstring, "supported sizes",
-                              result.status().error_message());
-      }
-    }
-  }
-}
-
-TEST_F(AesGcmKeyManagerTest, testPrimitives) {
-  std::string plaintext = "some plaintext";
-  std::string aad = "some aad";
-  AesGcmKeyManager key_manager;
+TEST(AesGcmKeyManagerTest, ValidateValid16ByteKey) {
   AesGcmKey key;
-
   key.set_version(0);
-  key.set_key_value("16 bytes of key ");
-
-  {  // Using key message only.
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto aes_gcm = std::move(result.ValueOrDie());
-    auto encrypt_result = aes_gcm->Encrypt(plaintext, aad);
-    EXPECT_TRUE(encrypt_result.ok()) << encrypt_result.status();
-    auto decrypt_result = aes_gcm->Decrypt(encrypt_result.ValueOrDie(), aad);
-    EXPECT_TRUE(decrypt_result.ok()) << decrypt_result.status();
-    EXPECT_EQ(plaintext, decrypt_result.ValueOrDie());
-  }
-
-  {  // Using KeyData proto.
-    KeyData key_data;
-    key_data.set_type_url(aes_gcm_key_type);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto aes_gcm = std::move(result.ValueOrDie());
-    auto encrypt_result = aes_gcm->Encrypt(plaintext, aad);
-    EXPECT_TRUE(encrypt_result.ok()) << encrypt_result.status();
-    auto decrypt_result = aes_gcm->Decrypt(encrypt_result.ValueOrDie(), aad);
-    EXPECT_TRUE(decrypt_result.ok()) << decrypt_result.status();
-    EXPECT_EQ(plaintext, decrypt_result.ValueOrDie());
-  }
+  key.set_key_value("0123456789abcdef");
+  EXPECT_THAT(AesGcmKeyManager().ValidateKey(key), IsOk());
 }
 
-TEST_F(AesGcmKeyManagerTest, testNewKeyErrors) {
-  AesGcmKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-
-  {  // Bad key format.
-    AesEaxKeyFormat key_format;
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "AesEaxKeyFormat",
-                        result.status().error_message());
-  }
-
-  {  // Bad serialized key format.
-    auto result = key_factory.NewKey("some bad serialized proto");
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
-
-  {  // Bad AesGcmKeyFormat: small key_size.
-    AesGcmKeyFormat key_format;
-    key_format.set_key_size(8);
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "8 bytes",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "supported sizes",
-                        result.status().error_message());
-  }
+TEST(AesGcmKeyManagerTest, ValidateValid32ByteKey) {
+  AesGcmKey key;
+  key.set_version(0);
+  key.set_key_value("01234567890123456789012345678901");
+  EXPECT_THAT(AesGcmKeyManager().ValidateKey(key), IsOk());
 }
 
-TEST_F(AesGcmKeyManagerTest, testNewKeyBasic) {
-  AesGcmKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-  AesGcmKeyFormat key_format;
-  key_format.set_key_size(16);
-
-  { // Via NewKey(format_proto).
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key = std::move(result.ValueOrDie());
-    EXPECT_EQ(key_type_prefix + key->GetTypeName(), aes_gcm_key_type);
-    std::unique_ptr<AesGcmKey> aes_gcm_key(
-        reinterpret_cast<AesGcmKey*>(key.release()));
-    EXPECT_EQ(0, aes_gcm_key->version());
-    EXPECT_EQ(key_format.key_size(), aes_gcm_key->key_value().size());
-  }
-
-  { // Via NewKey(serialized_format_proto).
-    auto result = key_factory.NewKey(key_format.SerializeAsString());
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key = std::move(result.ValueOrDie());
-    EXPECT_EQ(key_type_prefix + key->GetTypeName(), aes_gcm_key_type);
-    std::unique_ptr<AesGcmKey> aes_gcm_key(
-        reinterpret_cast<AesGcmKey*>(key.release()));
-    EXPECT_EQ(0, aes_gcm_key->version());
-    EXPECT_EQ(key_format.key_size(), aes_gcm_key->key_value().size());
-  }
-
-  { // Via NewKeyData(serialized_format_proto).
-    auto result = key_factory.NewKeyData(key_format.SerializeAsString());
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key_data = std::move(result.ValueOrDie());
-    EXPECT_EQ(aes_gcm_key_type, key_data->type_url());
-    EXPECT_EQ(KeyData::SYMMETRIC, key_data->key_material_type());
-    AesGcmKey aes_gcm_key;
-    EXPECT_TRUE(aes_gcm_key.ParseFromString(key_data->value()));
-    EXPECT_EQ(0, aes_gcm_key.version());
-    EXPECT_EQ(key_format.key_size(), aes_gcm_key.key_value().size());
-  }
+TEST(AesGcmKeyManagerTest, InvalidKeySizes15Bytes) {
+  AesGcmKey key;
+  key.set_version(0);
+  key.set_key_value("0123456789abcde");
+  EXPECT_THAT(AesGcmKeyManager().ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT));
 }
 
+TEST(AesGcmKeyManagerTest, InvalidKeySizes17Bytes) {
+  AesGcmKey key;
+  key.set_version(0);
+  key.set_key_value("0123456789abcdefg");
+  EXPECT_THAT(AesGcmKeyManager().ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(AesGcmKeyManagerTest, InvalidKeySizes24Bytes) {
+  AesGcmKey key;
+  key.set_version(0);
+  key.set_key_value("01234567890123");
+  EXPECT_THAT(AesGcmKeyManager().ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(AesGcmKeyManagerTest, InvalidKeySizes31Bytes) {
+  AesGcmKey key;
+  key.set_version(0);
+  key.set_key_value("0123456789012345678901234567890");
+  EXPECT_THAT(AesGcmKeyManager().ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(AesGcmKeyManagerTest, InvalidKeySizes33Bytes) {
+  AesGcmKey key;
+  key.set_version(0);
+  key.set_key_value("012345678901234567890123456789012");
+  EXPECT_THAT(AesGcmKeyManager().ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(AesGcmKeyManagerTest, ValidateKeyFormat) {
+  AesGcmKeyFormat format;
+
+  format.set_key_size(0);
+  EXPECT_THAT(AesGcmKeyManager().ValidateKeyFormat(format),
+              StatusIs(util::error::INVALID_ARGUMENT));
+
+  format.set_key_size(1);
+  EXPECT_THAT(AesGcmKeyManager().ValidateKeyFormat(format),
+              StatusIs(util::error::INVALID_ARGUMENT));
+
+  format.set_key_size(15);
+  EXPECT_THAT(AesGcmKeyManager().ValidateKeyFormat(format),
+              StatusIs(util::error::INVALID_ARGUMENT));
+
+  format.set_key_size(16);
+  EXPECT_THAT(AesGcmKeyManager().ValidateKeyFormat(format), IsOk());
+
+  format.set_key_size(17);
+  EXPECT_THAT(AesGcmKeyManager().ValidateKeyFormat(format),
+              StatusIs(util::error::INVALID_ARGUMENT));
+
+  format.set_key_size(31);
+  EXPECT_THAT(AesGcmKeyManager().ValidateKeyFormat(format),
+              StatusIs(util::error::INVALID_ARGUMENT));
+
+  format.set_key_size(32);
+  EXPECT_THAT(AesGcmKeyManager().ValidateKeyFormat(format), IsOk());
+
+  format.set_key_size(33);
+  EXPECT_THAT(AesGcmKeyManager().ValidateKeyFormat(format),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(AesGcmKeyManagerTest, Create16ByteKey) {
+  AesGcmKeyFormat format;
+  format.set_key_size(16);
+
+  StatusOr<AesGcmKey> key_or = AesGcmKeyManager().CreateKey(format);
+
+  ASSERT_THAT(key_or.status(), IsOk());
+  EXPECT_THAT(key_or.ValueOrDie().key_value().size(), Eq(format.key_size()));
+}
+
+TEST(AesGcmKeyManagerTest, Create32ByteKey) {
+  AesGcmKeyFormat format;
+  format.set_key_size(32);
+
+  StatusOr<AesGcmKey> key_or = AesGcmKeyManager().CreateKey(format);
+
+  ASSERT_THAT(key_or.status(), IsOk());
+  EXPECT_THAT(key_or.ValueOrDie().key_value().size(), Eq(format.key_size()));
+}
+
+TEST(AesGcmKeyManagerTest, CreateAead) {
+  AesGcmKeyFormat format;
+  format.set_key_size(32);
+  StatusOr<AesGcmKey> key_or = AesGcmKeyManager().CreateKey(format);
+  ASSERT_THAT(key_or.status(), IsOk());
+
+  StatusOr<std::unique_ptr<Aead>> aead_or =
+      AesGcmKeyManager().GetPrimitive<Aead>(key_or.ValueOrDie());
+
+  ASSERT_THAT(aead_or.status(), IsOk());
+
+  StatusOr<std::unique_ptr<Aead>> boring_ssl_aead_or =
+      subtle::AesGcmBoringSsl::New(key_or.ValueOrDie().key_value());
+  ASSERT_THAT(boring_ssl_aead_or.status(), IsOk());
+
+  ASSERT_THAT(EncryptThenDecrypt(aead_or.ValueOrDie().get(),
+                                 boring_ssl_aead_or.ValueOrDie().get(),
+                                 "message", "aad"),
+              IsOk());
+}
+
+
 }  // namespace
 }  // namespace tink
 }  // namespace crypto
diff --git a/cc/aead/aes_gcm_siv_key_manager.h b/cc/aead/aes_gcm_siv_key_manager.h
new file mode 100644
index 0000000..6f80e19
--- /dev/null
+++ b/cc/aead/aes_gcm_siv_key_manager.h
@@ -0,0 +1,91 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+#ifndef TINK_AEAD_AES_GCM_SIV_KEY_MANAGER_H_
+#define TINK_AEAD_AES_GCM_SIV_KEY_MANAGER_H_
+
+#include <algorithm>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "tink/aead.h"
+#include "tink/core/key_type_manager.h"
+#include "tink/subtle/aes_gcm_siv_boringssl.h"
+#include "tink/subtle/random.h"
+#include "tink/util/constants.h"
+#include "tink/util/errors.h"
+#include "tink/util/protobuf_helper.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/validation.h"
+#include "proto/aes_gcm_siv.pb.h"
+
+namespace crypto {
+namespace tink {
+
+class AesGcmSivKeyManager
+    : public KeyTypeManager<google::crypto::tink::AesGcmSivKey,
+                            google::crypto::tink::AesGcmSivKeyFormat,
+                            List<Aead>> {
+ public:
+  class AeadFactory : public PrimitiveFactory<Aead> {
+    crypto::tink::util::StatusOr<std::unique_ptr<Aead>> Create(
+        const google::crypto::tink::AesGcmSivKey& key) const override {
+      return subtle::AesGcmSivBoringSsl::New(key.key_value());
+    }
+  };
+
+  AesGcmSivKeyManager() : KeyTypeManager(absl::make_unique<AeadFactory>()) {}
+
+  uint32_t get_version() const override { return 0; }
+
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::SYMMETRIC;
+  }
+
+  const std::string& get_key_type() const override { return key_type_; }
+
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::AesGcmSivKey& key) const override {
+    crypto::tink::util::Status status =
+        ValidateVersion(key.version(), get_version());
+    if (!status.ok()) return status;
+    return ValidateAesKeySize(key.key_value().size());
+  }
+
+  crypto::tink::util::Status ValidateKeyFormat(
+      const google::crypto::tink::AesGcmSivKeyFormat& format) const override {
+    return ValidateAesKeySize(format.key_size());
+  }
+
+  crypto::tink::util::StatusOr<google::crypto::tink::AesGcmSivKey> CreateKey(
+      const google::crypto::tink::AesGcmSivKeyFormat& format)
+      const override {
+    google::crypto::tink::AesGcmSivKey key;
+    key.set_version(get_version());
+    key.set_key_value(subtle::Random::GetRandomBytes(format.key_size()));
+    return key;
+  }
+
+ private:
+  const std::string key_type_ = absl::StrCat(
+      kTypeGoogleapisCom, google::crypto::tink::AesGcmSivKey().GetTypeName());
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_AEAD_AES_GCM_SIV_KEY_MANAGER_H_
diff --git a/cc/aead/aes_gcm_siv_key_manager_test.cc b/cc/aead/aes_gcm_siv_key_manager_test.cc
new file mode 100644
index 0000000..d023e6e
--- /dev/null
+++ b/cc/aead/aes_gcm_siv_key_manager_test.cc
@@ -0,0 +1,176 @@
+// Copyright 2019 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "tink/aead/aes_gcm_siv_key_manager.h"
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "tink/aead.h"
+#include "tink/subtle/aead_test_util.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/test_matchers.h"
+#include "proto/aes_gcm_siv.pb.h"
+
+namespace crypto {
+namespace tink {
+
+namespace {
+
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
+using ::crypto::tink::util::StatusOr;
+using ::google::crypto::tink::AesGcmSivKey;
+using ::google::crypto::tink::AesGcmSivKeyFormat;
+using ::testing::Eq;
+
+TEST(AesGcmSivKeyManagerTest, Basics) {
+  EXPECT_THAT(AesGcmSivKeyManager().get_version(), Eq(0));
+  EXPECT_THAT(AesGcmSivKeyManager().get_key_type(),
+              Eq("type.googleapis.com/google.crypto.tink.AesGcmSivKey"));
+  EXPECT_THAT(AesGcmSivKeyManager().key_material_type(),
+              Eq(google::crypto::tink::KeyData::SYMMETRIC));
+}
+
+TEST(AesGcmSivKeyManagerTest, ValidateEmptyKey) {
+  EXPECT_THAT(AesGcmSivKeyManager().ValidateKey(AesGcmSivKey()),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(AesGcmSivKeyManagerTest, ValidateValid16ByteKey) {
+  AesGcmSivKey key;
+  key.set_version(0);
+  key.set_key_value("0123456789abcdef");
+  EXPECT_THAT(AesGcmSivKeyManager().ValidateKey(key), IsOk());
+}
+
+TEST(AesGcmSivKeyManagerTest, ValidateValid32ByteKey) {
+  AesGcmSivKey key;
+  key.set_version(0);
+  key.set_key_value("01234567890123456789012345678901");
+  EXPECT_THAT(AesGcmSivKeyManager().ValidateKey(key), IsOk());
+}
+
+TEST(AesGcmSivKeyManagerTest, InvalidKeySizes17Bytes) {
+  AesGcmSivKey key;
+  key.set_version(0);
+  key.set_key_value("0123456789abcdefg");
+  EXPECT_THAT(AesGcmSivKeyManager().ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(AesGcmSivKeyManagerTest, InvalidKeySizes24Bytes) {
+  AesGcmSivKey key;
+  key.set_version(0);
+  key.set_key_value("01234567890123");
+  EXPECT_THAT(AesGcmSivKeyManager().ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(AesGcmSivKeyManagerTest, InvalidKeySizes31Bytes) {
+  AesGcmSivKey key;
+  key.set_version(0);
+  key.set_key_value("0123456789012345678901234567890");
+  EXPECT_THAT(AesGcmSivKeyManager().ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(AesGcmSivKeyManagerTest, InvalidKeySizes33Bytes) {
+  AesGcmSivKey key;
+  key.set_version(0);
+  key.set_key_value("012345678901234567890123456789012");
+  EXPECT_THAT(AesGcmSivKeyManager().ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(AesGcmSivKeyManagerTest, ValidateKeyFormat) {
+  AesGcmSivKeyFormat format;
+
+  format.set_key_size(0);
+  EXPECT_THAT(AesGcmSivKeyManager().ValidateKeyFormat(format),
+              StatusIs(util::error::INVALID_ARGUMENT));
+
+  format.set_key_size(1);
+  EXPECT_THAT(AesGcmSivKeyManager().ValidateKeyFormat(format),
+              StatusIs(util::error::INVALID_ARGUMENT));
+
+  format.set_key_size(15);
+  EXPECT_THAT(AesGcmSivKeyManager().ValidateKeyFormat(format),
+              StatusIs(util::error::INVALID_ARGUMENT));
+
+  format.set_key_size(16);
+  EXPECT_THAT(AesGcmSivKeyManager().ValidateKeyFormat(format), IsOk());
+
+  format.set_key_size(17);
+  EXPECT_THAT(AesGcmSivKeyManager().ValidateKeyFormat(format),
+              StatusIs(util::error::INVALID_ARGUMENT));
+
+  format.set_key_size(31);
+  EXPECT_THAT(AesGcmSivKeyManager().ValidateKeyFormat(format),
+              StatusIs(util::error::INVALID_ARGUMENT));
+
+  format.set_key_size(32);
+  EXPECT_THAT(AesGcmSivKeyManager().ValidateKeyFormat(format), IsOk());
+
+  format.set_key_size(33);
+  EXPECT_THAT(AesGcmSivKeyManager().ValidateKeyFormat(format),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(AesGcmSivKeyManagerTest, Create16ByteKey) {
+  AesGcmSivKeyFormat format;
+  format.set_key_size(16);
+
+  StatusOr<AesGcmSivKey> key_or = AesGcmSivKeyManager().CreateKey(format);
+
+  ASSERT_THAT(key_or.status(), IsOk());
+  EXPECT_THAT(key_or.ValueOrDie().key_value().size(), Eq(format.key_size()));
+}
+
+TEST(AesGcmSivKeyManagerTest, Create32ByteKey) {
+  AesGcmSivKeyFormat format;
+  format.set_key_size(32);
+
+  StatusOr<AesGcmSivKey> key_or = AesGcmSivKeyManager().CreateKey(format);
+
+  ASSERT_THAT(key_or.status(), IsOk());
+  EXPECT_THAT(key_or.ValueOrDie().key_value().size(), Eq(format.key_size()));
+}
+
+TEST(AesGcmSivKeyManagerTest, CreateAead) {
+  AesGcmSivKeyFormat format;
+  format.set_key_size(32);
+  StatusOr<AesGcmSivKey> key_or = AesGcmSivKeyManager().CreateKey(format);
+  ASSERT_THAT(key_or.status(), IsOk());
+
+  StatusOr<std::unique_ptr<Aead>> aead_or =
+      AesGcmSivKeyManager().GetPrimitive<Aead>(key_or.ValueOrDie());
+
+  ASSERT_THAT(aead_or.status(), IsOk());
+
+  StatusOr<std::unique_ptr<Aead>> boring_ssl_aead_or =
+      subtle::AesGcmSivBoringSsl::New(key_or.ValueOrDie().key_value());
+  ASSERT_THAT(boring_ssl_aead_or.status(), IsOk());
+
+  ASSERT_THAT(EncryptThenDecrypt(aead_or.ValueOrDie().get(),
+                                 boring_ssl_aead_or.ValueOrDie().get(),
+                                 "message", "aad"),
+              IsOk());
+}
+
+}  // namespace
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/aead/kms_aead_key_manager.h b/cc/aead/kms_aead_key_manager.h
new file mode 100644
index 0000000..9c061b5
--- /dev/null
+++ b/cc/aead/kms_aead_key_manager.h
@@ -0,0 +1,92 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+#ifndef TINK_AEAD_KMS_AEAD_KEY_MANAGER_H_
+#define TINK_AEAD_KMS_AEAD_KEY_MANAGER_H_
+
+#include <algorithm>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "tink/aead.h"
+#include "tink/core/key_type_manager.h"
+#include "tink/kms_clients.h"
+#include "tink/util/constants.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/validation.h"
+#include "proto/kms_aead.pb.h"
+
+namespace crypto {
+namespace tink {
+
+class KmsAeadKeyManager
+    : public KeyTypeManager<google::crypto::tink::KmsAeadKey,
+                            google::crypto::tink::KmsAeadKeyFormat,
+                            List<Aead>> {
+ public:
+  class AeadFactory : public PrimitiveFactory<Aead> {
+    crypto::tink::util::StatusOr<std::unique_ptr<Aead>> Create(
+        const google::crypto::tink::KmsAeadKey& kms_aead_key) const override {
+      const auto& key_uri = kms_aead_key.params().key_uri();
+      auto kms_client_result = KmsClients::Get(key_uri);
+      if (!kms_client_result.ok()) return kms_client_result.status();
+      return kms_client_result.ValueOrDie()->GetAead(key_uri);
+    }
+  };
+
+  KmsAeadKeyManager() : KeyTypeManager(absl::make_unique<AeadFactory>()) {}
+
+  uint32_t get_version() const override { return 0; }
+
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::REMOTE;
+  }
+
+  const std::string& get_key_type() const override { return key_type_; }
+
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::KmsAeadKey& key) const override {
+    crypto::tink::util::Status status =
+        ValidateVersion(key.version(), get_version());
+    if (!status.ok()) return status;
+    return ValidateKeyFormat(key.params());
+  }
+
+  crypto::tink::util::Status ValidateKeyFormat(
+      const google::crypto::tink::KmsAeadKeyFormat& key_format) const override {
+    if (key_format.key_uri().empty()) {
+      return crypto::tink::util::Status(
+          crypto::tink::util::error::INVALID_ARGUMENT, "Missing key_uri.");
+    }
+    return util::OkStatus();
+  }
+
+  crypto::tink::util::StatusOr<google::crypto::tink::KmsAeadKey> CreateKey(
+      const google::crypto::tink::KmsAeadKeyFormat& key_format) const override {
+    google::crypto::tink::KmsAeadKey kms_aead_key;
+    kms_aead_key.set_version(get_version());
+    *(kms_aead_key.mutable_params()) = key_format;
+    return kms_aead_key;
+  }
+
+ private:
+  const std::string key_type_ = absl::StrCat(
+      kTypeGoogleapisCom, google::crypto::tink::KmsAeadKey().GetTypeName());
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_AEAD_KMS_AEAD_KEY_MANAGER_H_
diff --git a/cc/aead/kms_aead_key_manager_test.cc b/cc/aead/kms_aead_key_manager_test.cc
new file mode 100644
index 0000000..308db71
--- /dev/null
+++ b/cc/aead/kms_aead_key_manager_test.cc
@@ -0,0 +1,166 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "tink/aead/kms_aead_key_manager.h"
+
+#include "gtest/gtest.h"
+#include "absl/strings/match.h"
+#include "absl/strings/str_cat.h"
+#include "tink/aead.h"
+#include "tink/kms_client.h"
+#include "tink/kms_clients.h"
+#include "tink/subtle/aead_test_util.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/test_matchers.h"
+#include "tink/util/test_util.h"
+#include "proto/kms_aead.pb.h"
+
+namespace crypto {
+namespace tink {
+
+using ::crypto::tink::test::DummyAead;
+using ::crypto::tink::test::DummyKmsClient;
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
+using ::google::crypto::tink::KmsAeadKey;
+using ::google::crypto::tink::KmsAeadKeyFormat;
+using ::testing::Eq;
+using ::testing::Not;
+
+namespace {
+
+TEST(KmsAeadKeyManagerTest, Basics) {
+  EXPECT_THAT(KmsAeadKeyManager().get_version(), Eq(0));
+  EXPECT_THAT(KmsAeadKeyManager().get_key_type(),
+              Eq("type.googleapis.com/google.crypto.tink.KmsAeadKey"));
+  EXPECT_THAT(KmsAeadKeyManager().key_material_type(),
+              Eq(google::crypto::tink::KeyData::REMOTE));
+}
+
+TEST(KmsAeadKeyManagerTest, ValidateEmptyKey) {
+  EXPECT_THAT(KmsAeadKeyManager().ValidateKey(KmsAeadKey()),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(KmsAeadKeyManagerTest, ValidateValidKey) {
+  KmsAeadKey key;
+  key.set_version(0);
+  key.mutable_params()->set_key_uri("Some uri");
+  EXPECT_THAT(KmsAeadKeyManager().ValidateKey(key), IsOk());
+}
+
+TEST(KmsAeadKeyManagerTest, ValidateWrongVersion) {
+  KmsAeadKey key;
+  key.set_version(1);
+  key.mutable_params()->set_key_uri("Some uri");
+  EXPECT_THAT(KmsAeadKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(KmsAeadKeyManagerTest, ValidateNoUri) {
+  KmsAeadKey key;
+  key.set_version(0);
+  EXPECT_THAT(KmsAeadKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(KmsAeadKeyManagerTest, ValidateKeyFormatEmptyKey) {
+  EXPECT_THAT(KmsAeadKeyManager().ValidateKeyFormat(KmsAeadKeyFormat()),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(KmsAeadKeyManagerTest, ValidateKeyFormatValidKey) {
+  KmsAeadKeyFormat key_format;
+  key_format.set_key_uri("Some uri");
+  EXPECT_THAT(KmsAeadKeyManager().ValidateKeyFormat(key_format), IsOk());
+}
+
+TEST(KmsAeadKeyManagerTest, ValidateKeyFormatNoUri) {
+  KmsAeadKeyFormat key_format;
+  EXPECT_THAT(KmsAeadKeyManager().ValidateKeyFormat(key_format), Not(IsOk()));
+}
+
+TEST(KmsAeadKeyManagerTest, CreateKey) {
+  KmsAeadKeyFormat key_format;
+  key_format.set_key_uri("Some uri");
+  auto key_or = KmsAeadKeyManager().CreateKey(key_format);
+  ASSERT_THAT(key_or.status(), IsOk());
+  EXPECT_THAT(key_or.ValueOrDie().params().key_uri(), Eq(key_format.key_uri()));
+}
+
+class KmsAeadKeyManagerCreateTest : public ::testing::Test {
+ public:
+  // The KmsClients class has a global variable which keeps the registered
+  // clients. To reflect that in the test, we set them up in the SetUpTestSuite
+  // function.
+  static void SetUpTestSuite() {
+    if (!KmsClients::Add(
+             absl::make_unique<DummyKmsClient>("prefix1", "prefix1:some_key1"))
+             .ok())
+      abort();
+    if (!KmsClients::Add(absl::make_unique<DummyKmsClient>("prefix2", "")).ok())
+      abort();
+  }
+};
+
+TEST_F(KmsAeadKeyManagerCreateTest, CreateAead) {
+  KmsAeadKey key;
+  key.set_version(0);
+  key.mutable_params()->set_key_uri("prefix1:some_key1");
+
+  auto kms_aead = KmsAeadKeyManager().GetPrimitive<Aead>(key);
+  ASSERT_THAT(kms_aead.status(), IsOk());
+
+  DummyAead direct_aead("prefix1:some_key1");
+
+  EXPECT_THAT(EncryptThenDecrypt(kms_aead.ValueOrDie().get(), &direct_aead,
+                                 "plaintext", "aad"),
+              IsOk());
+}
+
+TEST_F(KmsAeadKeyManagerCreateTest, CreateAeadWrongKeyName) {
+  KmsAeadKey key;
+  key.set_version(0);
+  key.mutable_params()->set_key_uri("prefix1:some_other_key");
+
+  auto kms_aead = KmsAeadKeyManager().GetPrimitive<Aead>(key);
+  ASSERT_THAT(kms_aead.status(), Not(IsOk()));
+}
+
+TEST_F(KmsAeadKeyManagerCreateTest, CreateAeadWrongPrefix) {
+  KmsAeadKey key;
+  key.set_version(0);
+  key.mutable_params()->set_key_uri("non-existing-prefix:some_key1");
+
+  auto kms_aead = KmsAeadKeyManager().GetPrimitive<Aead>(key);
+  ASSERT_THAT(kms_aead.status(), Not(IsOk()));
+}
+
+TEST_F(KmsAeadKeyManagerCreateTest, CreateAeadUnboundKey) {
+  KmsAeadKey key;
+  key.set_version(0);
+  key.mutable_params()->set_key_uri("prefix2:some_key2");
+
+  auto kms_aead = KmsAeadKeyManager().GetPrimitive<Aead>(key);
+  ASSERT_THAT(kms_aead.status(), IsOk());
+
+  DummyAead direct_aead("prefix2:some_key2");
+
+  EXPECT_THAT(EncryptThenDecrypt(kms_aead.ValueOrDie().get(), &direct_aead,
+                                 "plaintext", "aad"),
+              IsOk());
+}
+
+}  // namespace
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/aead/kms_envelope_aead.cc b/cc/aead/kms_envelope_aead.cc
new file mode 100644
index 0000000..9d9a8d2
--- /dev/null
+++ b/cc/aead/kms_envelope_aead.cc
@@ -0,0 +1,150 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/aead/kms_envelope_aead.h"
+
+#include <string>
+
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "tink/aead.h"
+#include "tink/registry.h"
+#include "tink/util/errors.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "proto/tink.pb.h"
+
+
+namespace crypto {
+namespace tink {
+
+namespace {
+
+const int kEncryptedDekPrefixSize = 4;
+const char* kEmptyAssociatedData = "";
+
+void BigEndianStore32(uint8_t dst[4], uint32_t val) {
+  dst[0] = (val >> 24) & 0xff;
+  dst[1] = (val >> 16) & 0xff;
+  dst[2] = (val >> 8) & 0xff;
+  dst[3] = val & 0xff;
+}
+
+int32_t BigEndianLoad32(const uint8_t src[4]) {
+  return static_cast<int32_t>(src[3])
+      | (static_cast<int32_t>(src[2]) << 8)
+      | (static_cast<int32_t>(src[1]) << 16)
+      | (static_cast<int32_t>(src[0]) << 24);
+}
+
+// Constructs a ciphertext of KMS envelope encryption.
+// The format of the ciphertext is the following:
+//   4-byte-prefix | encrypted_dek | encrypted_plaintext
+// where 4-byte-prefix is the length of encrypted_dek in big-endian format
+// (for compatibility with Java)
+std::string GetEnvelopeCiphertext(absl::string_view encrypted_dek,
+                                  absl::string_view encrypted_plaintext) {
+  uint8_t enc_dek_size[kEncryptedDekPrefixSize];
+  BigEndianStore32(enc_dek_size, encrypted_dek.size());
+  return absl::StrCat(
+      std::string(reinterpret_cast<const char*>(enc_dek_size),
+                  kEncryptedDekPrefixSize),
+      encrypted_dek, encrypted_plaintext);
+}
+
+}  // namespace
+
+
+// static
+util::StatusOr<std::unique_ptr<Aead>> KmsEnvelopeAead::New(
+      const google::crypto::tink::KeyTemplate& dek_template,
+      std::unique_ptr<Aead> remote_aead) {
+  if (remote_aead == nullptr) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "remote_aead must be non-null");
+  }
+  auto km_result = Registry::get_key_manager<Aead>(dek_template.type_url());
+  if (!km_result.ok()) return km_result.status();
+  std::unique_ptr<Aead> envelope_aead(
+      new KmsEnvelopeAead(dek_template, std::move(remote_aead)));
+  return std::move(envelope_aead);
+}
+
+util::StatusOr<std::string> KmsEnvelopeAead::Encrypt(
+    absl::string_view plaintext, absl::string_view associated_data) const {
+  // Generate DEK.
+  auto dek_result = Registry::NewKeyData(dek_template_);
+  if (!dek_result.ok()) return dek_result.status();
+  auto dek = std::move(dek_result.ValueOrDie());
+
+  // Wrap DEK with remote.
+  auto dek_encrypt_result = remote_aead_->Encrypt(
+      dek->SerializeAsString(), kEmptyAssociatedData);
+  if (!dek_encrypt_result.ok()) return dek_encrypt_result.status();
+
+  // Encrypt plaintext using DEK.
+  auto aead_result = Registry::GetPrimitive<Aead>(*dek);
+  if (!aead_result.ok()) return aead_result.status();
+  auto aead = std::move(aead_result.ValueOrDie());
+  auto encrypt_result = aead->Encrypt(plaintext, associated_data);
+  if (!encrypt_result.ok()) return encrypt_result.status();
+
+  // Build and return ciphertext.
+  return GetEnvelopeCiphertext(dek_encrypt_result.ValueOrDie(),
+                               encrypt_result.ValueOrDie());
+}
+
+util::StatusOr<std::string> KmsEnvelopeAead::Decrypt(
+    absl::string_view ciphertext, absl::string_view associated_data) const {
+  // Parse the ciphertext.
+  if (ciphertext.size() < kEncryptedDekPrefixSize) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "ciphertext too short");
+  }
+  auto enc_dek_size = BigEndianLoad32(
+      reinterpret_cast<const uint8_t*>(ciphertext.data()));
+  if (enc_dek_size > ciphertext.size() - kEncryptedDekPrefixSize ||
+      enc_dek_size < 0) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "invalid ciphertext");
+  }
+  // Decrypt the DEK with remote.
+  auto dek_decrypt_result = remote_aead_->Decrypt(
+      ciphertext.substr(kEncryptedDekPrefixSize, enc_dek_size),
+      kEmptyAssociatedData);
+  if (!dek_decrypt_result.ok()) {
+    return util::Status(
+        util::error::INVALID_ARGUMENT,
+        absl::StrCat("invalid ciphertext: ",
+                     dek_decrypt_result.status().error_message()));
+  }
+
+  // Create AEAD from DEK.
+  google::crypto::tink::KeyData dek;
+  if (!dek.ParseFromString(dek_decrypt_result.ValueOrDie())) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "invalid ciphertext");
+  }
+
+  // Encrypt plaintext using DEK.
+  auto aead_result = Registry::GetPrimitive<Aead>(dek);
+  if (!aead_result.ok()) return aead_result.status();
+  auto aead = std::move(aead_result.ValueOrDie());
+  return aead->Decrypt(
+      ciphertext.substr(kEncryptedDekPrefixSize + enc_dek_size),
+      associated_data);
+}
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/aead/kms_envelope_aead.h b/cc/aead/kms_envelope_aead.h
new file mode 100644
index 0000000..62ee75e
--- /dev/null
+++ b/cc/aead/kms_envelope_aead.h
@@ -0,0 +1,71 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_AEAD_KMS_ENVELOPE_AEAD_H_
+#define TINK_AEAD_KMS_ENVELOPE_AEAD_H_
+
+#include <memory>
+
+#include "absl/strings/string_view.h"
+#include "tink/aead.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "proto/tink.pb.h"
+
+namespace crypto {
+namespace tink {
+
+// An implementation of KMS Envelope AEAD encryption
+// (https://cloud.google.com/kms/docs/data-encryption-keys).
+//
+// In envelope encryption user generates a data encryption key (DEK) locally,
+// encrypts data with DEK, sends DEK to a KMS to be encrypted (with a key
+// managed by KMS), and stores encrypted DEK with encrypted data; at a later
+// point user can retrieve encrypted data and DEK, use KMS to decrypt DEK,
+// and use decrypted DEK to decrypt the data.
+//
+// The ciphertext structure is as follows:
+//  - Length of encrypted DEK: 4 bytes (big endian)
+//  - Encrypted DEK: variable length that is equal to the value
+//    specified in the last 4 bytes.
+//  - AEAD payload: variable length.
+class KmsEnvelopeAead : public Aead {
+ public:
+  static crypto::tink::util::StatusOr<std::unique_ptr<Aead>> New(
+      const google::crypto::tink::KeyTemplate& dek_template,
+      std::unique_ptr<Aead> remote_aead);
+
+  crypto::tink::util::StatusOr<std::string> Encrypt(
+      absl::string_view plaintext,
+      absl::string_view associated_data) const override;
+
+  crypto::tink::util::StatusOr<std::string> Decrypt(
+      absl::string_view ciphertext,
+      absl::string_view associated_data) const override;
+
+  ~KmsEnvelopeAead() override {}
+
+ private:
+  KmsEnvelopeAead(const google::crypto::tink::KeyTemplate& dek_template,
+                  std::unique_ptr<Aead> remote_aead) :
+      dek_template_(dek_template), remote_aead_(std::move(remote_aead)) {}
+
+  google::crypto::tink::KeyTemplate dek_template_;
+  std::unique_ptr<Aead> remote_aead_;
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_AEAD_KMS_ENVELOPE_AEAD_H_
diff --git a/cc/aead/kms_envelope_aead_key_manager.cc b/cc/aead/kms_envelope_aead_key_manager.cc
new file mode 100644
index 0000000..0b528d7
--- /dev/null
+++ b/cc/aead/kms_envelope_aead_key_manager.cc
@@ -0,0 +1,48 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/aead/kms_envelope_aead_key_manager.h"
+
+#include "absl/memory/memory.h"
+#include "absl/strings/string_view.h"
+#include "tink/aead.h"
+#include "tink/kms_client.h"
+#include "tink/kms_clients.h"
+#include "tink/aead/kms_envelope_aead.h"
+#include "tink/util/errors.h"
+#include "tink/util/protobuf_helper.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/validation.h"
+#include "proto/kms_envelope.pb.h"
+
+namespace crypto {
+namespace tink {
+
+using ::crypto::tink::util::StatusOr;
+using ::google::crypto::tink::KmsEnvelopeAeadKey;
+
+StatusOr<std::unique_ptr<Aead>> KmsEnvelopeAeadKeyManager::AeadFactory::Create(
+    const KmsEnvelopeAeadKey& key) const {
+  const auto& kek_uri = key.params().kek_uri();
+  auto kms_client_result = KmsClients::Get(kek_uri);
+  if (!kms_client_result.ok()) return kms_client_result.status();
+  auto aead_result = kms_client_result.ValueOrDie()->GetAead(kek_uri);
+  if (!aead_result.ok()) return aead_result.status();
+  return KmsEnvelopeAead::New(key.params().dek_template(),
+                              std::move(aead_result.ValueOrDie()));
+}
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/aead/kms_envelope_aead_key_manager.h b/cc/aead/kms_envelope_aead_key_manager.h
new file mode 100644
index 0000000..ca67e13
--- /dev/null
+++ b/cc/aead/kms_envelope_aead_key_manager.h
@@ -0,0 +1,91 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+#ifndef TINK_AEAD_KMS_ENVELOPE_AEAD_KEY_MANAGER_H_
+#define TINK_AEAD_KMS_ENVELOPE_AEAD_KEY_MANAGER_H_
+
+#include <algorithm>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "tink/aead.h"
+#include "tink/core/key_type_manager.h"
+#include "tink/key_manager.h"
+#include "tink/util/constants.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/validation.h"
+#include "proto/kms_envelope.pb.h"
+
+namespace crypto {
+namespace tink {
+
+class KmsEnvelopeAeadKeyManager
+    : public KeyTypeManager<google::crypto::tink::KmsEnvelopeAeadKey,
+                            google::crypto::tink::KmsEnvelopeAeadKeyFormat,
+                            List<Aead>> {
+ public:
+  class AeadFactory : public PrimitiveFactory<Aead> {
+    crypto::tink::util::StatusOr<std::unique_ptr<Aead>> Create(
+        const google::crypto::tink::KmsEnvelopeAeadKey& key) const override;
+  };
+
+  KmsEnvelopeAeadKeyManager()
+      : KeyTypeManager(absl::make_unique<AeadFactory>()) {}
+
+  uint32_t get_version() const override { return 0; }
+
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::REMOTE;
+  }
+
+  const std::string& get_key_type() const override { return key_type_; }
+
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::KmsEnvelopeAeadKey& key) const override {
+    crypto::tink::util::Status status =
+        ValidateVersion(key.version(), get_version());
+    if (!status.ok()) return status;
+    return ValidateKeyFormat(key.params());
+  }
+
+  crypto::tink::util::Status ValidateKeyFormat(
+      const google::crypto::tink::KmsEnvelopeAeadKeyFormat& format)
+      const override {
+    if (format.kek_uri().empty()) {
+      return crypto::tink::util::Status(util::error::INVALID_ARGUMENT,
+                                        "Missing kek_uri.");
+    }
+    return util::OkStatus();
+  }
+
+  crypto::tink::util::StatusOr<google::crypto::tink::KmsEnvelopeAeadKey>
+  CreateKey(const google::crypto::tink::KmsEnvelopeAeadKeyFormat& key_format)
+      const override {
+    google::crypto::tink::KmsEnvelopeAeadKey key;
+    key.set_version(get_version());
+    *(key.mutable_params()) = key_format;
+    return key;
+  }
+
+ private:
+  const std::string key_type_ =
+      absl::StrCat(kTypeGoogleapisCom,
+                   google::crypto::tink::KmsEnvelopeAeadKey().GetTypeName());
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_AEAD_KMS_ENVELOPE_AEAD_KEY_MANAGER_H_
diff --git a/cc/aead/kms_envelope_aead_key_manager_test.cc b/cc/aead/kms_envelope_aead_key_manager_test.cc
new file mode 100644
index 0000000..544d068
--- /dev/null
+++ b/cc/aead/kms_envelope_aead_key_manager_test.cc
@@ -0,0 +1,229 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "tink/aead/kms_envelope_aead_key_manager.h"
+
+#include "absl/strings/match.h"
+#include "absl/strings/str_cat.h"
+#include "tink/aead.h"
+#include "tink/aead/aes_eax_key_manager.h"
+#include "tink/aead/kms_envelope_aead.h"
+#include "tink/registry.h"
+#include "tink/kms_client.h"
+#include "tink/kms_clients.h"
+#include "tink/aead/aead_config.h"
+#include "tink/aead/aead_key_templates.h"
+#include "tink/subtle/aead_test_util.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/test_util.h"
+#include "tink/util/test_matchers.h"
+#include "gtest/gtest.h"
+#include "proto/kms_envelope.pb.h"
+#include "proto/tink.pb.h"
+
+namespace crypto {
+namespace tink {
+
+using ::crypto::tink::test::DummyAead;
+using ::crypto::tink::test::DummyKmsClient;
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
+using ::google::crypto::tink::KeyData;
+using ::google::crypto::tink::KmsEnvelopeAeadKey;
+using ::google::crypto::tink::KmsEnvelopeAeadKeyFormat;
+using ::testing::Eq;
+using ::testing::Not;
+
+namespace {
+
+TEST(KmsEnvelopeAeadKeyManagerTest, Basics) {
+  EXPECT_THAT(KmsEnvelopeAeadKeyManager().get_version(), Eq(0));
+  EXPECT_THAT(KmsEnvelopeAeadKeyManager().get_key_type(),
+              Eq("type.googleapis.com/google.crypto.tink.KmsEnvelopeAeadKey"));
+  EXPECT_THAT(KmsEnvelopeAeadKeyManager().key_material_type(),
+              Eq(google::crypto::tink::KeyData::REMOTE));
+}
+
+TEST(KmsEnvelopeAeadKeyManagerTest, ValidateEmptyKey) {
+  EXPECT_THAT(KmsEnvelopeAeadKeyManager().ValidateKey(KmsEnvelopeAeadKey()),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(KmsEnvelopeAeadKeyManagerTest, ValidateValidKey) {
+  KmsEnvelopeAeadKey key;
+  key.set_version(0);
+  key.mutable_params()->set_kek_uri("Some uri");
+  *(key.mutable_params()->mutable_dek_template()) =
+      AeadKeyTemplates::Aes128Eax();
+
+  EXPECT_THAT(KmsEnvelopeAeadKeyManager().ValidateKey(key), IsOk());
+}
+
+TEST(KmsEnvelopeAeadKeyManagerTest, ValidateWrongVersion) {
+  KmsEnvelopeAeadKey key;
+  key.set_version(1);
+  key.mutable_params()->set_kek_uri("Some uri");
+  *(key.mutable_params()->mutable_dek_template()) =
+      AeadKeyTemplates::Aes128Eax();
+  EXPECT_THAT(KmsEnvelopeAeadKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(KmsEnvelopeAeadKeyManagerTest, ValidateNoUri) {
+  KmsEnvelopeAeadKey key;
+  key.set_version(1);
+  *(key.mutable_params()->mutable_dek_template()) =
+      AeadKeyTemplates::Aes128Eax();
+  EXPECT_THAT(KmsEnvelopeAeadKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(KmsEnvelopeAeadKeyManagerTest, ValidateKeyFormatEmptyKey) {
+  EXPECT_THAT(
+      KmsEnvelopeAeadKeyManager().ValidateKeyFormat(KmsEnvelopeAeadKeyFormat()),
+      StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(KmsEnvelopeAeadKeyManagerTest, ValidateKeyFormatValidKey) {
+  KmsEnvelopeAeadKeyFormat key_format;
+  key_format.set_kek_uri("Some uri");
+  *key_format.mutable_dek_template() = AeadKeyTemplates::Aes128Eax();
+  EXPECT_THAT(KmsEnvelopeAeadKeyManager().ValidateKeyFormat(key_format),
+              IsOk());
+}
+
+TEST(KmsEnvelopeAeadKeyManagerTest, ValidateKeyFormatNoUri) {
+  KmsEnvelopeAeadKeyFormat key_format;
+  *key_format.mutable_dek_template() = AeadKeyTemplates::Aes128Eax();
+  EXPECT_THAT(KmsEnvelopeAeadKeyManager().ValidateKeyFormat(key_format),
+              Not(IsOk()));
+}
+
+TEST(KmsEnvelopeAeadKeyManagerTest, ValidateKeyFormatNoTemplate) {
+  KmsEnvelopeAeadKeyFormat key_format;
+  *key_format.mutable_dek_template() = AeadKeyTemplates::Aes128Eax();
+  EXPECT_THAT(KmsEnvelopeAeadKeyManager().ValidateKeyFormat(key_format),
+              Not(IsOk()));
+}
+
+TEST(KmsEnvelopeAeadKeyManagerTest, CreateKey) {
+  KmsEnvelopeAeadKeyFormat key_format;
+  key_format.set_kek_uri("Some uri");
+  *key_format.mutable_dek_template() = AeadKeyTemplates::Aes128Eax();
+  auto key_or = KmsEnvelopeAeadKeyManager().CreateKey(key_format);
+  ASSERT_THAT(key_or.status(), IsOk());
+  EXPECT_THAT(key_or.ValueOrDie().params().kek_uri(), Eq(key_format.kek_uri()));
+  EXPECT_THAT(key_or.ValueOrDie().params().dek_template().value(),
+              Eq(key_format.dek_template().value()));
+}
+
+class KmsEnvelopeAeadKeyManagerCreateTest : public ::testing::Test {
+ public:
+  // The KmsClients class has a global variable which keeps the registered
+  // clients. To reflect that in the test, we set them up in the SetUpTestSuite
+  // function.
+  static void SetUpTestSuite() {
+    if (!KmsClients::Add(
+             absl::make_unique<DummyKmsClient>("prefix1", "prefix1:some_key1"))
+             .ok())
+      abort();
+    if (!KmsClients::Add(absl::make_unique<DummyKmsClient>("prefix2", "")).ok())
+      abort();
+
+    if (!Registry::RegisterKeyTypeManager(absl::make_unique<AesEaxKeyManager>(),
+                                          true)
+             .ok())
+      abort();
+  }
+};
+
+TEST_F(KmsEnvelopeAeadKeyManagerCreateTest, CreateAead) {
+  KmsEnvelopeAeadKey key;
+  key.set_version(0);
+  key.mutable_params()->set_kek_uri("prefix1:some_key1");
+  *(key.mutable_params()->mutable_dek_template()) =
+      AeadKeyTemplates::Aes128Eax();
+
+  auto kms_aead = KmsEnvelopeAeadKeyManager().GetPrimitive<Aead>(key);
+  ASSERT_THAT(kms_aead.status(), IsOk());
+
+  auto direct_aead =
+      KmsEnvelopeAead::New(key.params().dek_template(),
+                           absl::make_unique<DummyAead>("prefix1:some_key1"));
+  ASSERT_THAT(direct_aead.status(), IsOk());
+
+  EXPECT_THAT(
+      EncryptThenDecrypt(kms_aead.ValueOrDie().get(),
+                         direct_aead.ValueOrDie().get(), "plaintext", "aad"),
+      IsOk());
+}
+
+TEST_F(KmsEnvelopeAeadKeyManagerCreateTest, CreateAeadWrongKeyName) {
+  KmsEnvelopeAeadKey key;
+  key.set_version(0);
+  key.mutable_params()->set_kek_uri("prefix1:some_other_key");
+  *(key.mutable_params()->mutable_dek_template()) =
+      AeadKeyTemplates::Aes128Eax();
+
+  auto kms_aead = KmsEnvelopeAeadKeyManager().GetPrimitive<Aead>(key);
+  ASSERT_THAT(kms_aead.status(), Not(IsOk()));
+}
+
+TEST_F(KmsEnvelopeAeadKeyManagerCreateTest, CreateAeadWrongTypeUrl) {
+  KmsEnvelopeAeadKey key;
+  key.set_version(0);
+  key.mutable_params()->set_kek_uri("prefix1:some_other_key");
+  *(key.mutable_params()->mutable_dek_template()) =
+      AeadKeyTemplates::Aes128Eax();
+  key.mutable_params()->mutable_dek_template()->set_type_url(
+      "Some unkonwn type url");
+
+  auto kms_aead = KmsEnvelopeAeadKeyManager().GetPrimitive<Aead>(key);
+  ASSERT_THAT(kms_aead.status(), Not(IsOk()));
+}
+
+TEST_F(KmsEnvelopeAeadKeyManagerCreateTest, CreateAeadWrongPrefix) {
+  KmsEnvelopeAeadKey key;
+  key.set_version(0);
+  key.mutable_params()->set_kek_uri("non-existing-prefix:some_key1");
+  *(key.mutable_params()->mutable_dek_template()) =
+      AeadKeyTemplates::Aes128Eax();
+
+  auto kms_aead = KmsEnvelopeAeadKeyManager().GetPrimitive<Aead>(key);
+  ASSERT_THAT(kms_aead.status(), Not(IsOk()));
+}
+
+TEST_F(KmsEnvelopeAeadKeyManagerCreateTest, CreateAeadUnboundKey) {
+  KmsEnvelopeAeadKey key;
+  key.set_version(0);
+  key.mutable_params()->set_kek_uri("prefix2:some_key2");
+  *(key.mutable_params()->mutable_dek_template()) =
+      AeadKeyTemplates::Aes128Eax();
+
+  auto kms_aead = KmsEnvelopeAeadKeyManager().GetPrimitive<Aead>(key);
+  ASSERT_THAT(kms_aead.status(), IsOk());
+
+  auto direct_aead =
+      KmsEnvelopeAead::New(key.params().dek_template(),
+                           absl::make_unique<DummyAead>("prefix2:some_key2"));
+  ASSERT_THAT(direct_aead.status(), IsOk());
+
+  EXPECT_THAT(
+      EncryptThenDecrypt(kms_aead.ValueOrDie().get(),
+                         direct_aead.ValueOrDie().get(), "plaintext", "aad"),
+      IsOk());
+}
+
+}  // namespace
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/aead/kms_envelope_aead_test.cc b/cc/aead/kms_envelope_aead_test.cc
new file mode 100644
index 0000000..d0efc38
--- /dev/null
+++ b/cc/aead/kms_envelope_aead_test.cc
@@ -0,0 +1,137 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "tink/aead/kms_envelope_aead.h"
+
+#include <string>
+#include <vector>
+
+#include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
+#include "tink/registry.h"
+#include "tink/aead/aead_config.h"
+#include "tink/aead/aead_key_templates.h"
+#include "tink/mac/mac_key_templates.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/test_util.h"
+#include "tink/util/test_matchers.h"
+#include "gtest/gtest.h"
+
+
+namespace crypto {
+namespace tink {
+namespace {
+
+using crypto::tink::test::IsOk;
+using crypto::tink::test::StatusIs;
+using crypto::tink::test::DummyAead;
+using testing::HasSubstr;
+
+TEST(KmsEnvelopeAeadTest, BasicEncryptDecrypt) {
+  EXPECT_THAT(AeadConfig::Register(), IsOk());
+
+  auto dek_template = AeadKeyTemplates::Aes128Eax();
+  std::string remote_aead_name = "kms-backed-aead";
+  auto remote_aead = absl::make_unique<DummyAead>(remote_aead_name);
+
+  auto aead_result = KmsEnvelopeAead::New(dek_template, std::move(remote_aead));
+  EXPECT_THAT(aead_result.status(), IsOk());
+  auto aead = std::move(aead_result.ValueOrDie());
+  std::string message = "Some data to encrypt.";
+  std::string aad = "Some data to authenticate.";
+  auto encrypt_result = aead->Encrypt(message, aad);
+  EXPECT_THAT(encrypt_result.status(), IsOk());
+  auto decrypt_result = aead->Decrypt(encrypt_result.ValueOrDie(), aad);
+  EXPECT_THAT(decrypt_result.status(), IsOk());
+  EXPECT_EQ(decrypt_result.ValueOrDie(), message);
+}
+
+TEST(KmsEnvelopeAeadTest, NullAead) {
+  auto dek_template = AeadKeyTemplates::Aes128Eax();
+  auto aead_result = KmsEnvelopeAead::New(dek_template, nullptr);
+  EXPECT_THAT(aead_result.status(), StatusIs(util::error::INVALID_ARGUMENT,
+                                             HasSubstr("non-null")));
+}
+
+TEST(KmsEnvelopeAeadTest, MissingDekKeyManager) {
+  Registry::Reset();
+  auto dek_template = AeadKeyTemplates::Aes128Eax();
+  std::string remote_aead_name = "kms-backed-aead";
+  auto remote_aead = absl::make_unique<DummyAead>(remote_aead_name);
+  auto aead_result = KmsEnvelopeAead::New(dek_template, std::move(remote_aead));
+  EXPECT_THAT(aead_result.status(), StatusIs(util::error::NOT_FOUND,
+                                             HasSubstr("AesEaxKey")));
+}
+
+TEST(KmsEnvelopeAeadTest, WrongDekPrimitive) {
+  EXPECT_THAT(AeadConfig::Register(), IsOk());
+  auto dek_template = MacKeyTemplates::HmacSha256();
+  std::string remote_aead_name = "kms-backed-aead";
+  auto remote_aead = absl::make_unique<DummyAead>(remote_aead_name);
+  auto aead_result = KmsEnvelopeAead::New(dek_template, std::move(remote_aead));
+  EXPECT_THAT(aead_result.status(),
+              StatusIs(util::error::INVALID_ARGUMENT,
+                       HasSubstr("not among supported primitives")));
+}
+
+TEST(KmsEnvelopeAeadTest, DecryptionErrors) {
+  EXPECT_THAT(AeadConfig::Register(), IsOk());
+
+  auto dek_template = AeadKeyTemplates::Aes128Gcm();
+  std::string remote_aead_name = "kms-backed-aead";
+  auto remote_aead = absl::make_unique<DummyAead>(remote_aead_name);
+
+  auto aead_result = KmsEnvelopeAead::New(dek_template, std::move(remote_aead));
+  EXPECT_THAT(aead_result.status(), IsOk());
+  auto aead = std::move(aead_result.ValueOrDie());
+  std::string message = "Some data to encrypt.";
+  std::string aad = "Some data to authenticate.";
+  auto encrypt_result = aead->Encrypt(message, aad);
+  EXPECT_THAT(encrypt_result.status(), IsOk());
+  auto ct = encrypt_result.ValueOrDie();
+
+  // Empty ciphertext.
+  auto decrypt_result = aead->Decrypt("", aad);
+  EXPECT_THAT(decrypt_result.status(), StatusIs(util::error::INVALID_ARGUMENT,
+                                                HasSubstr("too short")));
+
+  // Short ciphertext.
+  decrypt_result = aead->Decrypt("sh", aad);
+  EXPECT_THAT(decrypt_result.status(), StatusIs(util::error::INVALID_ARGUMENT,
+                                                HasSubstr("too short")));
+
+  // Truncated ciphertext.
+  decrypt_result = aead->Decrypt(ct.substr(2), aad);
+  EXPECT_THAT(decrypt_result.status(), StatusIs(util::error::INVALID_ARGUMENT,
+                                                HasSubstr("invalid")));
+
+  // Corrupted ciphertext.
+  auto ct_copy = ct;
+  ct_copy[4] = 'a';  // corrupt serialized DEK.
+  decrypt_result = aead->Decrypt(ct_copy, aad);
+  EXPECT_THAT(decrypt_result.status(), StatusIs(util::error::INVALID_ARGUMENT,
+                                                HasSubstr("invalid")));
+
+  // Wrong associated data.
+  decrypt_result = aead->Decrypt(ct, "wrong aad");
+  EXPECT_THAT(decrypt_result.status(),
+              StatusIs(util::error::INTERNAL,
+                       HasSubstr("Authentication failed")));
+}
+
+
+}  // namespace
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/aead/xchacha20_poly1305_key_manager.cc b/cc/aead/xchacha20_poly1305_key_manager.cc
deleted file mode 100644
index 79a5fca..0000000
--- a/cc/aead/xchacha20_poly1305_key_manager.cc
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2018 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#include "tink/aead/xchacha20_poly1305_key_manager.h"
-
-#include "absl/strings/string_view.h"
-#include "tink/aead.h"
-#include "tink/key_manager.h"
-#include "tink/subtle/random.h"
-#include "tink/subtle/xchacha20_poly1305_boringssl.h"
-#include "tink/util/errors.h"
-#include "tink/util/protobuf_helper.h"
-#include "tink/util/status.h"
-#include "tink/util/statusor.h"
-#include "tink/util/validation.h"
-#include "proto/empty.pb.h"
-#include "proto/tink.pb.h"
-#include "proto/xchacha20_poly1305.pb.h"
-
-namespace crypto {
-namespace tink {
-
-using crypto::tink::util::Status;
-using crypto::tink::util::StatusOr;
-using google::crypto::tink::KeyData;
-using google::crypto::tink::XChaCha20Poly1305Key;
-
-const int kKeySizeInBytes = 32;
-
-class XChaCha20Poly1305KeyFactory
-    : public KeyFactoryBase<XChaCha20Poly1305Key, google::crypto::tink::Empty> {
- public:
-  XChaCha20Poly1305KeyFactory() {}
-
-  KeyData::KeyMaterialType key_material_type() const override {
-    return KeyData::SYMMETRIC;
-  }
-
- protected:
-  StatusOr<std::unique_ptr<XChaCha20Poly1305Key>> NewKeyFromFormat(
-      const google::crypto::tink::Empty&) const override {
-    auto xchacha20_poly1305_key = absl::make_unique<XChaCha20Poly1305Key>();
-    xchacha20_poly1305_key->set_version(XChaCha20Poly1305KeyManager::kVersion);
-    xchacha20_poly1305_key->set_key_value(
-        subtle::Random::GetRandomBytes(kKeySizeInBytes));
-    return std::move(xchacha20_poly1305_key);
-  }
-};
-
-constexpr uint32_t XChaCha20Poly1305KeyManager::kVersion;
-
-XChaCha20Poly1305KeyManager::XChaCha20Poly1305KeyManager()
-    : key_factory_(absl::make_unique<XChaCha20Poly1305KeyFactory>()) {}
-
-uint32_t XChaCha20Poly1305KeyManager::get_version() const { return kVersion; }
-
-const KeyFactory& XChaCha20Poly1305KeyManager::get_key_factory() const {
-  return *key_factory_;
-}
-
-StatusOr<std::unique_ptr<Aead>>
-XChaCha20Poly1305KeyManager::GetPrimitiveFromKey(
-    const XChaCha20Poly1305Key& xchacha20_poly1305_key) const {
-  Status status = Validate(xchacha20_poly1305_key);
-  if (!status.ok()) return status;
-  auto xchacha20_poly1305_result = subtle::XChacha20Poly1305BoringSsl::New(
-      xchacha20_poly1305_key.key_value());
-  if (!xchacha20_poly1305_result.ok())
-    return xchacha20_poly1305_result.status();
-  return std::move(xchacha20_poly1305_result.ValueOrDie());
-}
-
-// static
-Status XChaCha20Poly1305KeyManager::Validate(const XChaCha20Poly1305Key& key) {
-  Status status = ValidateVersion(key.version(), kVersion);
-  if (!status.ok()) return status;
-  uint32_t key_size = key.key_value().size();
-  if (key_size != 32) {
-    return ToStatusF(util::error::INVALID_ARGUMENT,
-                     "Invalid XChaCha20Poly1305Key: key_value has %d bytes; "
-                     "supported size: 32 bytes.",
-                     key_size);
-  }
-  return Status::OK;
-}
-
-}  // namespace tink
-}  // namespace crypto
diff --git a/cc/aead/xchacha20_poly1305_key_manager.h b/cc/aead/xchacha20_poly1305_key_manager.h
index aa10f56..beb2b63 100644
--- a/cc/aead/xchacha20_poly1305_key_manager.h
+++ b/cc/aead/xchacha20_poly1305_key_manager.h
@@ -21,45 +21,79 @@
 
 #include "absl/strings/string_view.h"
 #include "tink/aead.h"
-#include "tink/core/key_manager_base.h"
-#include "tink/key_manager.h"
+#include "tink/core/key_type_manager.h"
+#include "tink/subtle/random.h"
+#include "tink/subtle/xchacha20_poly1305_boringssl.h"
+#include "tink/util/constants.h"
 #include "tink/util/errors.h"
 #include "tink/util/protobuf_helper.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
-#include "proto/tink.pb.h"
+#include "tink/util/validation.h"
 #include "proto/xchacha20_poly1305.pb.h"
 
 namespace crypto {
 namespace tink {
 
 class XChaCha20Poly1305KeyManager
-    : public KeyManagerBase<Aead, google::crypto::tink::XChaCha20Poly1305Key> {
+    : public KeyTypeManager<google::crypto::tink::XChaCha20Poly1305Key,
+                            google::crypto::tink::XChaCha20Poly1305KeyFormat,
+                            List<Aead>> {
  public:
-  static constexpr uint32_t kVersion = 0;
+  class AeadFactory : public PrimitiveFactory<Aead> {
+    crypto::tink::util::StatusOr<std::unique_ptr<Aead>> Create(
+        const google::crypto::tink::XChaCha20Poly1305Key& key) const override {
+      return subtle::XChacha20Poly1305BoringSsl::New(key.key_value());
+    }
+  };
 
-  XChaCha20Poly1305KeyManager();
+  XChaCha20Poly1305KeyManager()
+      : KeyTypeManager(absl::make_unique<AeadFactory>()) {}
 
-  // Returns the version of this key manager.
-  uint32_t get_version() const override;
+  uint32_t get_version() const override { return 0; }
 
-  // Returns a factory that generates keys of the key type
-  // handled by this manager.
-  const KeyFactory& get_key_factory() const override;
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::SYMMETRIC;
+  }
 
-  virtual ~XChaCha20Poly1305KeyManager() {}
+  const std::string& get_key_type() const override { return key_type_; }
 
- protected:
-  crypto::tink::util::StatusOr<std::unique_ptr<Aead>> GetPrimitiveFromKey(
-      const google::crypto::tink::XChaCha20Poly1305Key& key) const override;
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::XChaCha20Poly1305Key& key) const override {
+    crypto::tink::util::Status status =
+        ValidateVersion(key.version(), get_version());
+    if (!status.ok()) return status;
+    uint32_t key_size = key.key_value().size();
+    if (key.key_value().size() != kKeySizeInBytes) {
+      return crypto::tink::util::Status(
+          util::error::INVALID_ARGUMENT,
+          absl::StrCat("Invalid XChaCha20Poly1305Key: key_value has ", key_size,
+                       " bytes; supported size: ", kKeySizeInBytes, " bytes."));
+    }
+    return crypto::tink::util::Status::OK;
+  }
+
+  crypto::tink::util::Status ValidateKeyFormat(
+      const google::crypto::tink::XChaCha20Poly1305KeyFormat& key_format)
+      const override {
+    return crypto::tink::util::Status::OK;
+  }
+
+  crypto::tink::util::StatusOr<google::crypto::tink::XChaCha20Poly1305Key>
+  CreateKey(const google::crypto::tink::XChaCha20Poly1305KeyFormat& key_format)
+      const override {
+    google::crypto::tink::XChaCha20Poly1305Key result;
+    result.set_version(get_version());
+    result.set_key_value(subtle::Random::GetRandomBytes(kKeySizeInBytes));
+    return result;
+  }
 
  private:
-  friend class XChaCha20Poly1305KeyFactory;
-
-  std::unique_ptr<KeyFactory> key_factory_;
-
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::XChaCha20Poly1305Key& key);
+  const std::string key_type_ =
+      absl::StrCat(kTypeGoogleapisCom,
+                   google::crypto::tink::XChaCha20Poly1305Key().GetTypeName());
+  const int kKeySizeInBytes = 32;
 };
 
 }  // namespace tink
diff --git a/cc/aead/xchacha20_poly1305_key_manager_test.cc b/cc/aead/xchacha20_poly1305_key_manager_test.cc
index f87ab95..8be6f48 100644
--- a/cc/aead/xchacha20_poly1305_key_manager_test.cc
+++ b/cc/aead/xchacha20_poly1305_key_manager_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2018 Google Inc.
+// Copyright 2019 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,213 +16,119 @@
 
 #include "tink/aead/xchacha20_poly1305_key_manager.h"
 
+#include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include "tink/aead.h"
+#include "tink/subtle/aead_test_util.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
-#include "proto/aes_eax.pb.h"
-#include "proto/common.pb.h"
-#include "proto/tink.pb.h"
-#include "proto/xchacha20_poly1305.pb.h"
+#include "tink/util/test_matchers.h"
 
 namespace crypto {
 namespace tink {
 
-using google::crypto::tink::AesEaxKey;
-using google::crypto::tink::KeyData;
-using google::crypto::tink::XChaCha20Poly1305Key;
-
 namespace {
 
-class XChaCha20Poly1305KeyManagerTest : public ::testing::Test {
- protected:
-  std::string key_type_prefix = "type.googleapis.com/";
-  std::string xchaha20_poly1305_key_type =
-      "type.googleapis.com/google.crypto.tink.XChaCha20Poly1305Key";
-};
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
+using ::crypto::tink::util::StatusOr;
+using ::google::crypto::tink::XChaCha20Poly1305Key;
+using ::google::crypto::tink::XChaCha20Poly1305KeyFormat;
+using ::testing::Eq;
+using ::testing::Not;
+using ::testing::SizeIs;
 
-TEST_F(XChaCha20Poly1305KeyManagerTest, testBasic) {
-  XChaCha20Poly1305KeyManager key_manager;
-
-  EXPECT_EQ(0, key_manager.get_version());
-  EXPECT_EQ("type.googleapis.com/google.crypto.tink.XChaCha20Poly1305Key",
-            key_manager.get_key_type());
-  EXPECT_TRUE(key_manager.DoesSupport(key_manager.get_key_type()));
+TEST(XChaCha20Poly1305KeyManagerTest, Basics) {
+  EXPECT_THAT(XChaCha20Poly1305KeyManager().get_version(), Eq(0));
+  EXPECT_THAT(
+      XChaCha20Poly1305KeyManager().get_key_type(),
+      Eq("type.googleapis.com/google.crypto.tink.XChaCha20Poly1305Key"));
+  EXPECT_THAT(XChaCha20Poly1305KeyManager().key_material_type(),
+              Eq(google::crypto::tink::KeyData::SYMMETRIC));
 }
 
-TEST_F(XChaCha20Poly1305KeyManagerTest, testKeyDataErrors) {
-  XChaCha20Poly1305KeyManager key_manager;
-
-  {  // Bad key type.
-    KeyData key_data;
-    std::string bad_key_type =
-        "type.googleapis.com/google.crypto.tink.SomeOtherKey";
-    key_data.set_type_url(bad_key_type);
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, bad_key_type,
-                        result.status().error_message());
-  }
-
-  {  // Bad key value.
-    KeyData key_data;
-    key_data.set_type_url(xchaha20_poly1305_key_type);
-    key_data.set_value("some bad serialized proto");
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
-
-  {  // Bad version.
-    KeyData key_data;
-    XChaCha20Poly1305Key key;
-    key.set_version(1);
-    key_data.set_type_url(xchaha20_poly1305_key_type);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "version",
-                        result.status().error_message());
-  }
-
-  {  // Bad key_value size (supported size: 32).
-    for (int len = 0; len < 42; len++) {
-      XChaCha20Poly1305Key key;
-      key.set_version(0);
-      key.set_key_value(std::string(len, 'a'));
-      KeyData key_data;
-      key_data.set_type_url(xchaha20_poly1305_key_type);
-      key_data.set_value(key.SerializeAsString());
-      auto result = key_manager.GetPrimitive(key_data);
-      if (len == 32) {
-        EXPECT_TRUE(result.ok()) << result.status();
-      } else {
-        EXPECT_FALSE(result.ok());
-        EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                            std::to_string(len) + " bytes",
-                            result.status().error_message());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring, "supported size",
-                            result.status().error_message());
-      }
-    }
-  }
+TEST(XChaCha20Poly1305KeyManagerTest, ValidateEmptyKey) {
+  EXPECT_THAT(XChaCha20Poly1305KeyManager().ValidateKey(XChaCha20Poly1305Key()),
+              StatusIs(util::error::INVALID_ARGUMENT));
 }
 
-TEST_F(XChaCha20Poly1305KeyManagerTest, testKeyMessageErrors) {
-  XChaCha20Poly1305KeyManager key_manager;
-
-  {  // Bad protobuffer.
-    AesEaxKey key;
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "AesEaxKey",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-  }
-
-  {  // Bad key_value size (supported size: 32).
-    for (int len = 0; len < 42; len++) {
-      XChaCha20Poly1305Key key;
-      key.set_version(0);
-      key.set_key_value(std::string(len, 'a'));
-      auto result = key_manager.GetPrimitive(key);
-      if (len == 32) {
-        EXPECT_TRUE(result.ok()) << result.status();
-      } else {
-        EXPECT_FALSE(result.ok());
-        EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                            std::to_string(len) + " bytes",
-                            result.status().error_message());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring, "supported size",
-                            result.status().error_message());
-      }
-    }
-  }
-}
-
-TEST_F(XChaCha20Poly1305KeyManagerTest, testPrimitives) {
-  std::string plaintext = "some plaintext";
-  std::string aad = "some aad";
-  XChaCha20Poly1305KeyManager key_manager;
+TEST(XChaCha20Poly1305KeyManagerTest, ValidateValid32ByteKey) {
   XChaCha20Poly1305Key key;
-
   key.set_version(0);
-  key.set_key_value("32 bytes of key 0123456789abcdef");
-
-  {  // Using key message only.
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto xchaha20_poly1305 = std::move(result.ValueOrDie());
-    auto encrypt_result = xchaha20_poly1305->Encrypt(plaintext, aad);
-    EXPECT_TRUE(encrypt_result.ok()) << encrypt_result.status();
-    auto decrypt_result =
-        xchaha20_poly1305->Decrypt(encrypt_result.ValueOrDie(), aad);
-    EXPECT_TRUE(decrypt_result.ok()) << decrypt_result.status();
-    EXPECT_EQ(plaintext, decrypt_result.ValueOrDie());
-  }
-
-  {  // Using KeyData proto.
-    KeyData key_data;
-    key_data.set_type_url(xchaha20_poly1305_key_type);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto xchaha20_poly1305 = std::move(result.ValueOrDie());
-    auto encrypt_result = xchaha20_poly1305->Encrypt(plaintext, aad);
-    EXPECT_TRUE(encrypt_result.ok()) << encrypt_result.status();
-    auto decrypt_result =
-        xchaha20_poly1305->Decrypt(encrypt_result.ValueOrDie(), aad);
-    EXPECT_TRUE(decrypt_result.ok()) << decrypt_result.status();
-    EXPECT_EQ(plaintext, decrypt_result.ValueOrDie());
-  }
+  key.set_key_value("01234567890123456789012345678901");
+  EXPECT_THAT(XChaCha20Poly1305KeyManager().ValidateKey(key), IsOk());
 }
 
-TEST_F(XChaCha20Poly1305KeyManagerTest, testNewKeyBasic) {
-  XChaCha20Poly1305KeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-  { // Via NewKey(format_proto).
-    auto result = key_factory.NewKey(nullptr /* ignored */);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key = std::move(result.ValueOrDie());
-    EXPECT_EQ(key_type_prefix + key->GetTypeName(), xchaha20_poly1305_key_type);
-    std::unique_ptr<XChaCha20Poly1305Key> xchaha20_poly1305_key(
-        static_cast<XChaCha20Poly1305Key*>(key.release()));
-    EXPECT_EQ(0, xchaha20_poly1305_key->version());
-    EXPECT_EQ(32, xchaha20_poly1305_key->key_value().size());
-  }
+TEST(XChaCha20Poly1305KeyManagerTest, ValidateInvalid16ByteKey) {
+  XChaCha20Poly1305Key key;
+  key.set_version(0);
+  key.set_key_value("0123456789012345");
+  EXPECT_THAT(XChaCha20Poly1305KeyManager().ValidateKey(key), Not(IsOk()));
+}
 
-  { // Via NewKey(serialized_format_proto).
-    auto result = key_factory.NewKey("" /* ignored */);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key = std::move(result.ValueOrDie());
-    EXPECT_EQ(key_type_prefix + key->GetTypeName(), xchaha20_poly1305_key_type);
-    std::unique_ptr<XChaCha20Poly1305Key> xchaha20_poly1305_key(
-        static_cast<XChaCha20Poly1305Key*>(key.release()));
-    EXPECT_EQ(0, xchaha20_poly1305_key->version());
-    EXPECT_EQ(32, xchaha20_poly1305_key->key_value().size());
-  }
+TEST(XChaCha20Poly1305KeyManagerTest, ValidateInvalid31ByteKey) {
+  XChaCha20Poly1305Key key;
+  key.set_version(0);
+  key.set_key_value("0123456789012345678901234567890");
+  EXPECT_THAT(XChaCha20Poly1305KeyManager().ValidateKey(key), Not(IsOk()));
+}
 
-  { // Via NewKeyData(serialized_format_proto).
-    auto result = key_factory.NewKeyData("" /* ignored */);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key_data = std::move(result.ValueOrDie());
-    EXPECT_EQ(xchaha20_poly1305_key_type, key_data->type_url());
-    EXPECT_EQ(KeyData::SYMMETRIC, key_data->key_material_type());
-    XChaCha20Poly1305Key xchaha20_poly1305_key;
-    EXPECT_TRUE(xchaha20_poly1305_key.ParseFromString(key_data->value()));
-    EXPECT_EQ(0, xchaha20_poly1305_key.version());
-    EXPECT_EQ(32, xchaha20_poly1305_key.key_value().size());
-  }
+TEST(XChaCha20Poly1305KeyManagerTest, ValidateInvalid33ByteKey) {
+  XChaCha20Poly1305Key key;
+  key.set_version(0);
+  key.set_key_value("012345678901234567890123456789012");
+  EXPECT_THAT(XChaCha20Poly1305KeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(XChaCha20Poly1305KeyManagerTest, ValidateInvalidVersion) {
+  XChaCha20Poly1305Key key;
+  key.set_version(1);
+  key.set_key_value("01234567890123456789012345678901");
+  EXPECT_THAT(XChaCha20Poly1305KeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(XChaCha20Poly1305KeyManagerTest, ValidateKeyFormat) {
+  EXPECT_THAT(XChaCha20Poly1305KeyManager().ValidateKeyFormat(
+                  XChaCha20Poly1305KeyFormat()),
+              IsOk());
+}
+
+TEST(XChaCha20Poly1305KeyManagerTest, CreateKey) {
+  StatusOr<XChaCha20Poly1305Key> key_or =
+      XChaCha20Poly1305KeyManager().CreateKey(XChaCha20Poly1305KeyFormat());
+
+  ASSERT_THAT(key_or.status(), IsOk());
+  EXPECT_THAT(key_or.ValueOrDie().key_value(), SizeIs(32));
+  EXPECT_THAT(key_or.ValueOrDie().version(), Eq(0));
+}
+
+TEST(XChaCha20Poly1305KeyManagerTest, CreateKeyValid) {
+  StatusOr<XChaCha20Poly1305Key> key_or =
+      XChaCha20Poly1305KeyManager().CreateKey(XChaCha20Poly1305KeyFormat());
+
+  ASSERT_THAT(key_or.status(), IsOk());
+  EXPECT_THAT(XChaCha20Poly1305KeyManager().ValidateKey(key_or.ValueOrDie()),
+              IsOk());
+}
+
+TEST(XChaCha20Poly1305KeyManagerTest, CreateAead) {
+  StatusOr<XChaCha20Poly1305Key> key_or =
+      XChaCha20Poly1305KeyManager().CreateKey(XChaCha20Poly1305KeyFormat());
+  ASSERT_THAT(key_or.status(), IsOk());
+
+  StatusOr<std::unique_ptr<Aead>> aead_or =
+      XChaCha20Poly1305KeyManager().GetPrimitive<Aead>(key_or.ValueOrDie());
+
+  ASSERT_THAT(aead_or.status(), IsOk());
+
+  StatusOr<std::unique_ptr<Aead>> direct_aead_or =
+      subtle::XChacha20Poly1305BoringSsl::New(key_or.ValueOrDie().key_value());
+  ASSERT_THAT(direct_aead_or.status(), IsOk());
+
+  ASSERT_THAT(
+      EncryptThenDecrypt(aead_or.ValueOrDie().get(),
+                         direct_aead_or.ValueOrDie().get(), "message", "aad"),
+      IsOk());
 }
 
 }  // namespace
diff --git a/cc/catalogue.h b/cc/catalogue.h
index aa7acf8..e854da4 100644
--- a/cc/catalogue.h
+++ b/cc/catalogue.h
@@ -17,23 +17,16 @@
 #ifndef TINK_CATALOGUE_H_
 #define TINK_CATALOGUE_H_
 
+#include "absl/base/macros.h"
 #include "tink/key_manager.h"
 #include "tink/util/statusor.h"
 
 namespace crypto {
 namespace tink {
 
-// A catalogue of KeyManager objects.
-//
-// It is basically a map from a (key type, primitive name)-tuple to
-// KeyManager-objects, that determine the implementation that handles
-// the keys of the given key type.
-//
-// Tink includes default per-primitive catalogues, but it also
-// supports custom catalogues to enable user-defined configuration of
-// run-time environment via Registry.
+// This class is deprecated. We don't support catalogues anymore.
 template <class P>
-class Catalogue {
+class ABSL_DEPRECATED("Catalogues are not supported anymore.") Catalogue {
  public:
   // Returns a key manager for the given 'type_url', 'primitive_name',
   // and version at least 'min_version' (if any found).
diff --git a/cc/cleartext_keyset_handle.h b/cc/cleartext_keyset_handle.h
index 51c248c..36ae814 100644
--- a/cc/cleartext_keyset_handle.h
+++ b/cc/cleartext_keyset_handle.h
@@ -36,6 +36,15 @@
   static crypto::tink::util::StatusOr<std::unique_ptr<KeysetHandle>> Read(
       std::unique_ptr<KeysetReader> reader);
 
+  // Writes the keyset in the given |keyset_handle| to the |writer| which must
+  // be non-null.
+  static crypto::tink::util::Status Write(KeysetWriter* writer,
+                                          const KeysetHandle& keyset_handle);
+
+  // Creates a KeysetHandle object for the given 'keyset'.
+  static std::unique_ptr<KeysetHandle> GetKeysetHandle(
+      const google::crypto::tink::Keyset& keyset);
+
   // Returns a Keyset-proto from the given 'keyset_handle'.
   static const google::crypto::tink::Keyset& GetKeyset(
       const KeysetHandle& keyset_handle);
diff --git a/cc/config.h b/cc/config.h
index cc56848..2eb4d5c 100644
--- a/cc/config.h
+++ b/cc/config.h
@@ -17,14 +17,16 @@
 #ifndef TINK_CONFIG_H_
 #define TINK_CONFIG_H_
 
-#include "tink/aead.h"
+#include "absl/strings/ascii.h"
+#include "tink/aead/aead_config.h"
 #include "tink/catalogue.h"
-#include "tink/config.h"
-#include "tink/hybrid_encrypt.h"
-#include "tink/hybrid_decrypt.h"
+#include "tink/daead/deterministic_aead_config.h"
+#include "tink/hybrid/hybrid_config.h"
 #include "tink/key_manager.h"
-#include "tink/mac.h"
+#include "tink/mac/mac_config.h"
 #include "tink/registry.h"
+#include "tink/signature/signature_config.h"
+#include "tink/streamingaead/streaming_aead_config.h"
 #include "tink/util/errors.h"
 #include "tink/util/status.h"
 #include "proto/config.pb.h"
@@ -49,26 +51,21 @@
  public:
   // Returns a KeyTypeEntry for Tink key types with the specified parameters.
   static std::unique_ptr<google::crypto::tink::KeyTypeEntry>
-  GetTinkKeyTypeEntry(
-      const std::string& catalogue_name,
-      const std::string& primitive_name,
-      const std::string& key_proto_name,
-      int key_manager_version,
-      bool new_key_allowed);
+  GetTinkKeyTypeEntry(const std::string& catalogue_name,
+                      const std::string& primitive_name,
+                      const std::string& key_proto_name, int key_manager_version,
+                      bool new_key_allowed);
 
   // Registers a key manager according to the specification in 'entry'.
   template <class P>
   static crypto::tink::util::Status Register(
       const google::crypto::tink::KeyTypeEntry& entry);
 
-  // Registers key managers according to the specification in 'config'.
+  // Registers key managers and primitive wrappers according to the
+  // specification in 'config'.
   static crypto::tink::util::Status Register(
       const google::crypto::tink::RegistryConfig& config);
 
-  // Registers primitive wrappers for the entry given in KeyTypeEntry.
-  static crypto::tink::util::Status RegisterWrapper(
-      absl::string_view lowercase_primitive_name);
-
  private:
   static crypto::tink::util::Status Validate(
       const google::crypto::tink::KeyTypeEntry& entry);
@@ -77,22 +74,37 @@
 ///////////////////////////////////////////////////////////////////////////////
 // Implementation details of templated methods.
 
-
 // static
-template<class P>
+template <class P>
 crypto::tink::util::Status Config::Register(
     const google::crypto::tink::KeyTypeEntry& entry) {
-  crypto::tink::util::Status status = Validate(entry);
+  util::Status status;
+  std::string primitive_name = absl::AsciiStrToLower(entry.primitive_name());
+
+  if (primitive_name == "mac") {
+    status = MacConfig::Register();
+  } else if (primitive_name == "aead") {
+    status = AeadConfig::Register();
+  } else if (primitive_name == "deterministicaead") {
+    status = DeterministicAeadConfig::Register();
+  } else if (primitive_name == "hybridencrypt" ||
+             primitive_name == "hybriddecrypt") {
+    status = HybridConfig::Register();
+  } else if (primitive_name == "publickeysign" ||
+             primitive_name == "publickeyverify") {
+    status = SignatureConfig::Register();
+  } else if (primitive_name == "streamingaead") {
+    status = StreamingAeadConfig::Register();
+  } else {
+    status = util::Status(
+        crypto::tink::util::error::INVALID_ARGUMENT,
+        absl::StrCat("Non-standard primitive '", entry.primitive_name(),
+                     "', call Registry::RegisterKeyManager "
+                     "and Registry::"
+                     "RegisterPrimitiveWrapper directly."));
+  }
   if (!status.ok()) return status;
-  auto catalogue_result =
-      Registry::get_catalogue<P>(entry.catalogue_name());
-  if (!catalogue_result.ok()) return catalogue_result.status();
-  auto catalogue = catalogue_result.ValueOrDie();
-  auto key_manager_result = catalogue->GetKeyManager(
-      entry.type_url(), entry.primitive_name(), entry.key_manager_version());
-  if (!key_manager_result.ok()) return key_manager_result.status();
-  return Registry::RegisterKeyManager(
-      std::move(key_manager_result.ValueOrDie()), entry.new_key_allowed());
+  return util::Status::OK;
 }
 
 }  // namespace tink
diff --git a/cc/config/BUILD.bazel b/cc/config/BUILD.bazel
index 26ff2b6..7741188 100644
--- a/cc/config/BUILD.bazel
+++ b/cc/config/BUILD.bazel
@@ -1,22 +1,36 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 cc_library(
     name = "tink_config",
     srcs = ["tink_config.cc"],
     hdrs = ["tink_config.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         "//cc:config",
         "//cc:key_manager",
         "//cc/daead:deterministic_aead_config",
         "//cc/hybrid:hybrid_config",
         "//cc/signature:signature_config",
+        "//cc/streamingaead:streaming_aead_config",
         "//cc/util:status",
         "//proto:config_cc_proto",
+        "@com_google_absl//absl/base:core_headers",
     ],
-    strip_include_prefix = "/cc",
+)
+
+cc_library(
+    name = "config_util",
+    srcs = ["config_util.cc"],
+    hdrs = ["config_util.h"],
     include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        "//proto:config_cc_proto",
+    ],
 )
 
 # tests
@@ -29,14 +43,26 @@
     deps = [
         ":tink_config",
         "//cc:aead",
-        "//cc:catalogue",
         "//cc:config",
         "//cc:deterministic_aead",
         "//cc:hybrid_decrypt",
         "//cc:hybrid_encrypt",
         "//cc:mac",
         "//cc:registry",
+        "//cc:streaming_aead",
+        "//cc/aead:aes_gcm_key_manager",
         "//cc/util:status",
+        "//cc/util:test_matchers",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "config_util_test",
+    size = "small",
+    srcs = ["config_util_test.cc"],
+    deps = [
+        ":config_util",
         "@com_google_googletest//:gtest_main",
     ],
 )
diff --git a/cc/config/BUILD.gn b/cc/config/BUILD.gn
new file mode 100644
index 0000000..dcd2eee
--- /dev/null
+++ b/cc/config/BUILD.gn
@@ -0,0 +1,15 @@
+# Copyright 2019 The Fuchsia Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# CC Library : config_util
+source_set("config_util") {
+  configs -= [ "//build/config:no_rtti" ]
+  sources = [
+    "config_util.cc",
+    "config_util.h",
+  ]
+  public_deps = [ "//third_party/tink/proto:config_proto" ]
+  public_configs = [ "//third_party/tink:tink_config" ]
+}
+
diff --git a/cc/config/CMakeLists.txt b/cc/config/CMakeLists.txt
new file mode 100644
index 0000000..7e7c413
--- /dev/null
+++ b/cc/config/CMakeLists.txt
@@ -0,0 +1,55 @@
+tink_module(config)
+
+tink_cc_library(
+  NAME tink_config
+  SRCS
+    tink_config.cc
+    tink_config.h
+  DEPS
+    tink::core::config
+    tink::core::key_manager
+    tink::daead::deterministic_aead_config
+    tink::hybrid::hybrid_config
+    tink::signature::signature_config
+    tink::streamingaead::streaming_aead_config
+    tink::util::status
+    tink::proto::config_cc_proto
+    absl::base
+)
+
+tink_cc_library(
+  NAME config_util
+  SRCS
+    config_util.cc
+    config_util.h
+  DEPS
+    tink::proto::config_cc_proto
+)
+
+# tests
+
+tink_cc_test(
+  NAME tink_config_test
+  SRCS tink_config_test.cc
+  DEPS
+    tink::aead::aes_gcm_key_manager
+    tink::config::tink_config
+    tink::core::aead
+    tink::core::config
+    tink::core::deterministic_aead
+    tink::core::hybrid_decrypt
+    tink::core::hybrid_encrypt
+    tink::core::mac
+    tink::core::registry
+    tink::core::streaming_aead
+    tink::util::test_matchers
+    tink::util::status
+)
+
+tink_cc_test(
+  NAME config_util_test
+  SRCS config_util_test.cc
+  DEPS
+    tink::config::config_util
+    gmock
+)
diff --git a/cc/config/config_util.cc b/cc/config/config_util.cc
new file mode 100644
index 0000000..a2ee2d4
--- /dev/null
+++ b/cc/config/config_util.cc
@@ -0,0 +1,35 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "tink/config/config_util.h"
+
+namespace crypto {
+namespace tink {
+
+google::crypto::tink::KeyTypeEntry CreateTinkKeyTypeEntry(
+    const std::string& catalogue_name, const std::string& primitive_name,
+    const std::string& key_proto_name, int key_manager_version,
+    bool new_key_allowed) {
+  std::string prefix = "type.googleapis.com/google.crypto.tink.";
+  google::crypto::tink::KeyTypeEntry entry;
+  entry.set_catalogue_name(catalogue_name);
+  entry.set_primitive_name(primitive_name);
+  entry.set_type_url(prefix.append(key_proto_name));
+  entry.set_key_manager_version(key_manager_version);
+  entry.set_new_key_allowed(new_key_allowed);
+  return entry;
+}
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/config/config_util.h b/cc/config/config_util.h
new file mode 100644
index 0000000..066c878
--- /dev/null
+++ b/cc/config/config_util.h
@@ -0,0 +1,31 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_CONFIG_CONFIG_UTIL_H_
+#define TINK_CONFIG_CONFIG_UTIL_H_
+
+#include "proto/config.pb.h"
+
+namespace crypto {
+namespace tink {
+
+google::crypto::tink::KeyTypeEntry CreateTinkKeyTypeEntry(
+    const std::string& catalogue_name, const std::string& primitive_name,
+    const std::string& key_proto_name, int key_manager_version,
+    bool new_key_allowed);
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_CONFIG_CONFIG_UTIL_H_
diff --git a/cc/config/config_util_test.cc b/cc/config/config_util_test.cc
new file mode 100644
index 0000000..ba9edd1
--- /dev/null
+++ b/cc/config/config_util_test.cc
@@ -0,0 +1,37 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "tink/config/config_util.h"
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+using ::testing::Eq;
+
+namespace crypto {
+namespace tink {
+
+TEST(CreateKeyTypeEntry, Simple) {
+  google::crypto::tink::KeyTypeEntry entry = CreateTinkKeyTypeEntry(
+      "catalogue", "primitive_name", "key_proto_name", 12, true);
+  EXPECT_THAT(entry.primitive_name(), Eq("primitive_name"));
+  EXPECT_THAT(entry.type_url(),
+              Eq("type.googleapis.com/google.crypto.tink.key_proto_name"));
+  EXPECT_THAT(entry.key_manager_version(), Eq(12));
+  EXPECT_THAT(entry.new_key_allowed(), Eq(true));
+  EXPECT_THAT(entry.catalogue_name(), Eq("catalogue"));
+}
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/config/tink_config.cc b/cc/config/tink_config.cc
index 6435d4d..f360e4b 100644
--- a/cc/config/tink_config.cc
+++ b/cc/config/tink_config.cc
@@ -22,28 +22,18 @@
 #include "tink/daead/deterministic_aead_config.h"
 #include "tink/hybrid/hybrid_config.h"
 #include "tink/signature/signature_config.h"
+#include "tink/streamingaead/streaming_aead_config.h"
 #include "tink/util/status.h"
+#include "proto/config.pb.h"
+
+using google::crypto::tink::RegistryConfig;
 
 namespace crypto {
 namespace tink {
 
-namespace {
-
-google::crypto::tink::RegistryConfig* GenerateRegistryConfig() {
-  google::crypto::tink::RegistryConfig* config =
-      new google::crypto::tink::RegistryConfig();
-  config->MergeFrom(HybridConfig::Latest());  // includes Mac & Aead
-  config->MergeFrom(SignatureConfig::Latest());
-  config->MergeFrom(DeterministicAeadConfig::Latest());
-  config->set_config_name("TINK");
-  return config;
-}
-
-}  // anonymous namespace
-
 // static
-const google::crypto::tink::RegistryConfig& TinkConfig::Latest() {
-  static auto config = GenerateRegistryConfig();
+const RegistryConfig& TinkConfig::Latest() {
+  static const RegistryConfig* config = new RegistryConfig();
   return *config;
 }
 
@@ -53,7 +43,9 @@
   if (!status.ok()) return status;
   status = SignatureConfig::Register();
   if (!status.ok()) return status;
-  return DeterministicAeadConfig::Register();
+  status = DeterministicAeadConfig::Register();
+  if (!status.ok()) return status;
+  return StreamingAeadConfig::Register();
 }
 
 }  // namespace tink
diff --git a/cc/config/tink_config.h b/cc/config/tink_config.h
index c3663ca..98f0dd4 100644
--- a/cc/config/tink_config.h
+++ b/cc/config/tink_config.h
@@ -17,6 +17,7 @@
 #ifndef TINK_CONFIG_TINK_CONFIG_H_
 #define TINK_CONFIG_TINK_CONFIG_H_
 
+#include "absl/base/macros.h"
 #include "tink/util/status.h"
 #include "proto/config.pb.h"
 
@@ -35,10 +36,11 @@
  public:
   // Returns config of implementations of all primitives supported
   // in the current Tink release.
+  ABSL_DEPRECATED("This is not supported anymore.")
   static const google::crypto::tink::RegistryConfig& Latest();
 
-  // Registers all key managers for all primitives supported
-  // in the current Tink release.
+  // Registers all primitive wrappers and all key managers for all primitives
+  // supported in the current Tink release.
   static crypto::tink::util::Status Register();
 
  private:
diff --git a/cc/config/tink_config_test.cc b/cc/config/tink_config_test.cc
index db9d8a6..66938b9 100644
--- a/cc/config/tink_config_test.cc
+++ b/cc/config/tink_config_test.cc
@@ -18,7 +18,7 @@
 
 #include "gtest/gtest.h"
 #include "tink/aead.h"
-#include "tink/catalogue.h"
+#include "tink/aead/aes_gcm_key_manager.h"
 #include "tink/config.h"
 #include "tink/deterministic_aead.h"
 #include "tink/hybrid_decrypt.h"
@@ -27,269 +27,25 @@
 #include "tink/public_key_sign.h"
 #include "tink/public_key_verify.h"
 #include "tink/registry.h"
+#include "tink/streaming_aead.h"
 #include "tink/util/status.h"
+#include "tink/util/test_matchers.h"
 
 namespace crypto {
 namespace tink {
 namespace {
 
-class DummyHybridDecryptCatalogue : public Catalogue<HybridDecrypt> {
- public:
-  DummyHybridDecryptCatalogue() {}
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
 
-  crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<HybridDecrypt>>>
-  GetKeyManager(const std::string& type_url, const std::string& primitive_name,
-                uint32_t min_version) const override {
-    return util::Status::UNKNOWN;
-  }
-};
-
-class TinkConfigTest : public ::testing::Test {
- protected:
-  void SetUp() override { Registry::Reset(); }
-};
-
-typedef struct KeyTypeEntry {
-  std::string catalogue_name;
-  std::string primitive_name;
-  std::string type_url;
-  bool new_key_allowed;
-  int key_manager_version;
-} KeyTypeEntry;
-
-TEST_F(TinkConfigTest, testBasic) {
-  std::vector<KeyTypeEntry> all_key_type_entries;
-
-  std::vector<KeyTypeEntry> mac_key_type_entries;
-  mac_key_type_entries.push_back(
-      {"TinkMac", "Mac", "type.googleapis.com/google.crypto.tink.HmacKey", true,
-       0});
-  all_key_type_entries.insert(std::end(all_key_type_entries),
-                              std::begin(mac_key_type_entries),
-                              std::end(mac_key_type_entries));
-
-  std::vector<KeyTypeEntry> aead_key_type_entries;
-  aead_key_type_entries.push_back(
-      {"TinkAead", "Aead",
-       "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey", true, 0});
-  aead_key_type_entries.push_back(
-      {"TinkAead", "Aead", "type.googleapis.com/google.crypto.tink.AesGcmKey",
-       true, 0});
-  aead_key_type_entries.push_back(
-      {"TinkAead", "Aead", "type.googleapis.com/google.crypto.tink.AesEaxKey",
-       true, 0});
-  aead_key_type_entries.push_back(
-      {"TinkAead", "Aead",
-       "type.googleapis.com/google.crypto.tink.XChaCha20Poly1305Key", true, 0});
-  all_key_type_entries.insert(std::end(all_key_type_entries),
-                              std::begin(aead_key_type_entries),
-                              std::end(aead_key_type_entries));
-
-  std::vector<KeyTypeEntry> hybrid_key_type_entries;
-  hybrid_key_type_entries.push_back(
-      {"TinkHybridDecrypt", "HybridDecrypt",
-       "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey", true,
-       0});
-  hybrid_key_type_entries.push_back(
-      {"TinkHybridEncrypt", "HybridEncrypt",
-       "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey", true,
-       0});
-  all_key_type_entries.insert(std::end(all_key_type_entries),
-                              std::begin(hybrid_key_type_entries),
-                              std::end(hybrid_key_type_entries));
-
-  std::vector<KeyTypeEntry> signature_key_type_entries;
-  signature_key_type_entries.push_back(
-      {"TinkPublicKeySign", "PublicKeySign",
-       "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey", true, 0});
-  signature_key_type_entries.push_back(
-      {"TinkPublicKeyVerify", "PublicKeyVerify",
-       "type.googleapis.com/google.crypto.tink.EcdsaPublicKey", true, 0});
-  signature_key_type_entries.push_back(
-      {"TinkPublicKeySign", "PublicKeySign",
-       "type.googleapis.com/google.crypto.tink.Ed25519PrivateKey", true, 0});
-  signature_key_type_entries.push_back(
-      {"TinkPublicKeyVerify", "PublicKeyVerify",
-       "type.googleapis.com/google.crypto.tink.Ed25519PublicKey", true, 0});
-  signature_key_type_entries.push_back(
-      {"TinkPublicKeySign", "PublicKeySign",
-       "type.googleapis.com/google.crypto.tink.RsaSsaPssPrivateKey", true, 0});
-  signature_key_type_entries.push_back(
-      {"TinkPublicKeyVerify", "PublicKeyVerify",
-       "type.googleapis.com/google.crypto.tink.RsaSsaPssPublicKey", true, 0});
-  signature_key_type_entries.push_back(
-      {"TinkPublicKeySign", "PublicKeySign",
-       "type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PrivateKey", true,
-       0});
-  signature_key_type_entries.push_back(
-      {"TinkPublicKeyVerify", "PublicKeyVerify",
-       "type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PublicKey", true, 0});
-  all_key_type_entries.insert(std::end(all_key_type_entries),
-                              std::begin(signature_key_type_entries),
-                              std::end(signature_key_type_entries));
-
-  std::vector<KeyTypeEntry> daead_key_type_entries;
-  daead_key_type_entries.push_back(
-      {"TinkDeterministicAead", "DeterministicAead",
-       "type.googleapis.com/google.crypto.tink.AesSivKey", true, 0});
-  all_key_type_entries.insert(std::end(all_key_type_entries),
-                              std::begin(daead_key_type_entries),
-                              std::end(daead_key_type_entries));
-
-  auto& config = TinkConfig::Latest();
-
-  EXPECT_EQ(all_key_type_entries.size(), TinkConfig::Latest().entry_size());
-
-  int i = 0;
-  for (const auto& key_type_entry : all_key_type_entries) {
-    EXPECT_EQ(key_type_entry.catalogue_name, config.entry(i).catalogue_name());
-    EXPECT_EQ(key_type_entry.primitive_name, config.entry(i).primitive_name());
-    EXPECT_EQ(key_type_entry.type_url, config.entry(i).type_url());
-    EXPECT_EQ(key_type_entry.new_key_allowed,
-              config.entry(i).new_key_allowed());
-    EXPECT_EQ(key_type_entry.key_manager_version,
-              config.entry(i).key_manager_version());
-    i++;
-  }
-
-  // No key manager before registration.
-  for (const auto& key_type_entry : aead_key_type_entries) {
-    auto manager_result =
-        Registry::get_key_manager<Aead>(key_type_entry.type_url);
-    EXPECT_FALSE(manager_result.ok());
-    EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-  }
-  for (const auto& key_type_entry : mac_key_type_entries) {
-    auto manager_result =
-        Registry::get_key_manager<Mac>(key_type_entry.type_url);
-    EXPECT_FALSE(manager_result.ok());
-    EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-  }
-  for (const auto& key_type_entry : hybrid_key_type_entries) {
-    if (key_type_entry.catalogue_name == "TinkHybridEncrypt") {
-      // HybridEncrypt
-      auto manager_result =
-          Registry::get_key_manager<HybridEncrypt>(key_type_entry.type_url);
-      EXPECT_FALSE(manager_result.ok());
-      EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-    } else {
-      // HybridDecrypt
-      auto manager_result =
-          Registry::get_key_manager<HybridDecrypt>(key_type_entry.type_url);
-      EXPECT_FALSE(manager_result.ok());
-      EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-    }
-  }
-  for (const auto& key_type_entry : signature_key_type_entries) {
-    if (key_type_entry.catalogue_name == "TinkPublicKeySign") {
-      // PublicKeySign
-      auto manager_result =
-          Registry::get_key_manager<PublicKeySign>(key_type_entry.type_url);
-      EXPECT_FALSE(manager_result.ok());
-      EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-    } else {
-      // PublicKeyVerify
-      auto manager_result =
-          Registry::get_key_manager<PublicKeyVerify>(key_type_entry.type_url);
-      EXPECT_FALSE(manager_result.ok());
-      EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-    }
-  }
-  for (const auto& key_type_entry : daead_key_type_entries) {
-    auto manager_result =
-        Registry::get_key_manager<DeterministicAead>(key_type_entry.type_url);
-    EXPECT_FALSE(manager_result.ok());
-    EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-  }
-
-  // Registration of standard key types works.
-  auto status = TinkConfig::Register();
-  EXPECT_TRUE(status.ok()) << status;
-  for (const auto& key_type_entry : aead_key_type_entries) {
-    auto manager_result =
-        Registry::get_key_manager<Aead>(key_type_entry.type_url);
-    EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-    EXPECT_TRUE(
-        manager_result.ValueOrDie()->DoesSupport(key_type_entry.type_url));
-  }
-
-  for (const auto& key_type_entry : mac_key_type_entries) {
-    auto manager_result =
-        Registry::get_key_manager<Mac>(key_type_entry.type_url);
-    EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-    EXPECT_TRUE(
-        manager_result.ValueOrDie()->DoesSupport(key_type_entry.type_url));
-  }
-
-  for (const auto& key_type_entry : hybrid_key_type_entries) {
-    if (key_type_entry.catalogue_name == "TinkHybridEncrypt") {
-      auto manager_result =
-          Registry::get_key_manager<HybridEncrypt>(key_type_entry.type_url);
-      EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-      EXPECT_TRUE(
-          manager_result.ValueOrDie()->DoesSupport(key_type_entry.type_url));
-    } else {
-      auto manager_result =
-          Registry::get_key_manager<HybridDecrypt>(key_type_entry.type_url);
-      EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-      EXPECT_TRUE(
-          manager_result.ValueOrDie()->DoesSupport(key_type_entry.type_url));
-    }
-  }
-
-  for (const auto& key_type_entry : signature_key_type_entries) {
-    if (key_type_entry.catalogue_name == "TinkPublicKeySign") {
-      auto manager_result =
-          Registry::get_key_manager<PublicKeySign>(key_type_entry.type_url);
-      EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-      EXPECT_TRUE(
-          manager_result.ValueOrDie()->DoesSupport(key_type_entry.type_url));
-    } else {
-      auto manager_result =
-          Registry::get_key_manager<PublicKeyVerify>(key_type_entry.type_url);
-      EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-      EXPECT_TRUE(
-          manager_result.ValueOrDie()->DoesSupport(key_type_entry.type_url));
-    }
-  }
-
-  for (const auto& key_type_entry : daead_key_type_entries) {
-    auto manager_result =
-        Registry::get_key_manager<DeterministicAead>(key_type_entry.type_url);
-    EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-    EXPECT_TRUE(
-        manager_result.ValueOrDie()->DoesSupport(key_type_entry.type_url));
-  }
-}  // namespace
-
-TEST_F(TinkConfigTest, testRegister) {
-  std::string key_type = "type.googleapis.com/google.crypto.tink.AesGcmKey";
-
-  // Try on empty registry.
-  auto status = Config::Register(TinkConfig::Latest());
-  EXPECT_FALSE(status.ok());
-  EXPECT_EQ(util::error::NOT_FOUND, status.error_code());
-  auto manager_result = Registry::get_key_manager<Aead>(key_type);
-  EXPECT_FALSE(manager_result.ok());
-
-  // Register and try again.
-  status = TinkConfig::Register();
-  EXPECT_TRUE(status.ok()) << status;
-  manager_result = Registry::get_key_manager<Aead>(key_type);
-  EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-
-  // Try Register() again, should succeed (idempotence).
-  status = TinkConfig::Register();
-  EXPECT_TRUE(status.ok()) << status;
-
-  // Reset the registry, and try overriding a catalogue with a different one.
-  Registry::Reset();
-  status = Registry::AddCatalogue("TinkHybridDecrypt",
-                                  new DummyHybridDecryptCatalogue());
-  EXPECT_TRUE(status.ok()) << status;
-  status = TinkConfig::Register();
-  EXPECT_FALSE(status.ok());
-  EXPECT_EQ(util::error::ALREADY_EXISTS, status.error_code());
+TEST(TinkConfigTest, RegisterWorks) {
+  EXPECT_THAT(Registry::get_key_manager<Aead>(AesGcmKeyManager().get_key_type())
+                  .status(),
+              StatusIs(util::error::NOT_FOUND));
+  EXPECT_THAT(TinkConfig::Register(), IsOk());
+  EXPECT_THAT(Registry::get_key_manager<Aead>(AesGcmKeyManager().get_key_type())
+                  .status(),
+              IsOk());
 }
 
 }  // namespace
diff --git a/cc/core/BUILD.gn b/cc/core/BUILD.gn
index 833faa3..9c2abdc 100644
--- a/cc/core/BUILD.gn
+++ b/cc/core/BUILD.gn
@@ -11,6 +11,10 @@
   ]
   public_deps = [
     "//third_party/tink/cc:catalogue",
+    ":core/key_manager_impl",
+    ":core/key_type_manager",
+    ":core/private_key_manager_impl",
+    ":core/private_key_type_manager",
     "//third_party/tink/cc:key_manager",
     "//third_party/tink/cc:primitive_set",
     "//third_party/tink/cc:primitive_wrapper",
@@ -27,19 +31,63 @@
   public_configs = [ "//third_party/tink:tink_config" ]
 }
 
-# CC Library : key_manager_base
-source_set("key_manager_base") {
+# CC Library : core/template_util
+source_set("core/template_util") {
   configs -= [ "//build/config:no_rtti" ]
-  sources = [ "key_manager_base.h" ]
+  sources = [ "template_util.h" ]
+  public_deps = [ "//third_party/abseil-cpp/absl/meta:type_traits" ]
+  public_configs = [ "//third_party/tink:tink_config" ]
+}
+
+# CC Library : core/key_type_manager
+source_set("core/key_type_manager") {
+  configs -= [ "//build/config:no_rtti" ]
+  sources = [ "key_type_manager.h" ]
   public_deps = [
-    "//third_party/tink/cc:key_manager",
-    "//third_party/tink/cc/util:constants",
-    "//third_party/tink/cc/util:errors",
+    ":core/template_util",
+    "//third_party/tink/cc/util:status",
     "//third_party/tink/cc/util:statusor",
     "//third_party/tink/proto:tink_proto",
-    "//third_party/abseil-cpp/absl/base:base",
-    "//third_party/abseil-cpp/absl/memory:memory",
-    "//third_party/abseil-cpp/absl/strings:strings",
+    "//third_party/abseil-cpp/absl/container:flat_hash_map",
+  ]
+  public_configs = [ "//third_party/tink:tink_config" ]
+}
+
+# CC Library : core/key_manager_impl
+source_set("core/key_manager_impl") {
+  configs -= [ "//build/config:no_rtti" ]
+  sources = [ "key_manager_impl.h" ]
+  public_deps = [
+    ":core/key_type_manager",
+    "//third_party/tink/cc:key_manager",
+    "//third_party/tink/cc/util:constants",
+    "//third_party/tink/cc/util:status",
+    "//third_party/tink/proto:tink_proto",
+    "//third_party/abseil-cpp/absl/base:core_headers",
+  ]
+  public_configs = [ "//third_party/tink:tink_config" ]
+}
+
+# CC Library : core/private_key_type_manager
+source_set("core/private_key_type_manager") {
+  configs -= [ "//build/config:no_rtti" ]
+  sources = [ "private_key_type_manager.h" ]
+  public_deps = [
+    ":core/key_type_manager",
+    "//third_party/tink/cc/util:statusor",
+  ]
+  public_configs = [ "//third_party/tink:tink_config" ]
+}
+
+# CC Library : core/private_key_manager_impl
+source_set("core/private_key_manager_impl") {
+  configs -= [ "//build/config:no_rtti" ]
+  sources = [ "private_key_manager_impl.h" ]
+  public_deps = [
+    ":core/key_manager_impl",
+    ":core/private_key_type_manager",
+    "//third_party/tink/cc:key_manager",
+    "//third_party/tink/cc/util:validation",
   ]
   public_configs = [ "//third_party/tink:tink_config" ]
 }
diff --git a/cc/core/cleartext_keyset_handle.cc b/cc/core/cleartext_keyset_handle.cc
index 34bdbb6..82baa57 100644
--- a/cc/core/cleartext_keyset_handle.cc
+++ b/cc/core/cleartext_keyset_handle.cc
@@ -46,6 +46,25 @@
 }
 
 // static
+crypto::tink::util::Status CleartextKeysetHandle::Write(
+    KeysetWriter* writer, const KeysetHandle& keyset_handle) {
+  if (!writer) {
+    return ToStatusF(util::error::INVALID_ARGUMENT,
+                     "Error KeysetWriter cannot be null");
+  }
+  return writer->Write(keyset_handle.get_keyset());
+}
+
+// static
+std::unique_ptr<KeysetHandle> CleartextKeysetHandle::GetKeysetHandle(
+    const Keyset& keyset) {
+  auto unique_keyset = absl::make_unique<Keyset>(keyset);
+  std::unique_ptr<KeysetHandle> handle =
+      absl::WrapUnique(new KeysetHandle(std::move(unique_keyset)));
+  return handle;
+}
+
+// static
 const Keyset& CleartextKeysetHandle::GetKeyset(
     const KeysetHandle& keyset_handle) {
   return keyset_handle.get_keyset();
diff --git a/cc/core/cleartext_keyset_handle_test.cc b/cc/core/cleartext_keyset_handle_test.cc
index 8adea29..08d0e33 100644
--- a/cc/core/cleartext_keyset_handle_test.cc
+++ b/cc/core/cleartext_keyset_handle_test.cc
@@ -21,11 +21,11 @@
 #include "gtest/gtest.h"
 #include "tink/binary_keyset_reader.h"
 #include "tink/keyset_handle.h"
-#include "tink/util/keyset_util.h"
+#include "tink/util/test_keyset_handle.h"
 #include "tink/util/test_util.h"
 #include "proto/tink.pb.h"
 
-using crypto::tink::KeysetUtil;
+using crypto::tink::TestKeysetHandle;
 using crypto::tink::test::AddRawKey;
 using crypto::tink::test::AddTinkKey;
 
@@ -57,7 +57,7 @@
     EXPECT_TRUE(result.ok()) << result.status();
     auto handle = std::move(result.ValueOrDie());
     EXPECT_EQ(keyset.SerializeAsString(),
-              KeysetUtil::GetKeyset(*handle).SerializeAsString());
+              TestKeysetHandle::GetKeyset(*handle).SerializeAsString());
   }
 
   {  // Reader that fails upon read.
@@ -69,6 +69,31 @@
   }
 }
 
+TEST_F(CleartextKeysetHandleTest, testWrite) {
+  Keyset keyset;
+  Keyset::Key key;
+  AddTinkKey("some key type", 42, key, KeyStatusType::ENABLED,
+             KeyData::SYMMETRIC, &keyset);
+  AddRawKey("some other key type", 711, key, KeyStatusType::ENABLED,
+            KeyData::SYMMETRIC, &keyset);
+  keyset.set_primary_key_id(42);
+
+  auto handle = TestKeysetHandle::GetKeysetHandle(keyset);
+
+  std::stringbuf buffer;
+  std::unique_ptr<std::ostream> destination_stream(new std::ostream(&buffer));
+  auto writer =
+      test::DummyKeysetWriter::New(std::move(destination_stream)).ValueOrDie();
+
+  // Write a valid keyset.
+  EXPECT_EQ(CleartextKeysetHandle::Write(writer.get(), *(handle.get())),
+            util::Status::OK);
+
+  // Null writer.
+  EXPECT_NE(CleartextKeysetHandle::Write(nullptr, *(handle.get())),
+            util::Status::OK);
+}
+
 }  // namespace
 }  // namespace tink
 }  // namespace crypto
diff --git a/cc/core/config.cc b/cc/core/config.cc
index ed58693..433e1a2 100644
--- a/cc/core/config.cc
+++ b/cc/core/config.cc
@@ -17,20 +17,7 @@
 #include "tink/config.h"
 
 #include "absl/strings/ascii.h"
-#include "tink/aead.h"
-#include "tink/aead/aead_wrapper.h"
-#include "tink/daead/deterministic_aead_wrapper.h"
-#include "tink/deterministic_aead.h"
-#include "tink/hybrid/hybrid_decrypt_wrapper.h"
-#include "tink/hybrid/hybrid_encrypt_wrapper.h"
-#include "tink/hybrid_decrypt.h"
-#include "tink/hybrid_encrypt.h"
-#include "tink/mac.h"
-#include "tink/mac/mac_wrapper.h"
-#include "tink/public_key_sign.h"
-#include "tink/public_key_verify.h"
-#include "tink/signature/public_key_sign_wrapper.h"
-#include "tink/signature/public_key_verify_wrapper.h"
+#include "absl/strings/str_cat.h"
 #include "tink/util/errors.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
@@ -42,12 +29,10 @@
 namespace tink {
 
 // static
-std::unique_ptr<google::crypto::tink::KeyTypeEntry>
-Config::GetTinkKeyTypeEntry(const std::string& catalogue_name,
-                            const std::string& primitive_name,
-                            const std::string& key_proto_name,
-                            int key_manager_version,
-                            bool new_key_allowed) {
+std::unique_ptr<google::crypto::tink::KeyTypeEntry> Config::GetTinkKeyTypeEntry(
+    const std::string& catalogue_name, const std::string& primitive_name,
+    const std::string& key_proto_name, int key_manager_version,
+    bool new_key_allowed) {
   std::string prefix = "type.googleapis.com/google.crypto.tink.";
   std::unique_ptr<KeyTypeEntry> entry(new KeyTypeEntry());
   entry->set_catalogue_name(catalogue_name);
@@ -61,8 +46,7 @@
 // static
 crypto::tink::util::Status Config::Validate(const KeyTypeEntry& entry) {
   if (entry.type_url().empty()) {
-    return util::Status(util::error::INVALID_ARGUMENT,
-                        "Missing type_url.");
+    return util::Status(util::error::INVALID_ARGUMENT, "Missing type_url.");
   }
   if (entry.primitive_name().empty()) {
     return util::Status(util::error::INVALID_ARGUMENT,
@@ -78,70 +62,21 @@
 // static
 util::Status Config::Register(
     const google::crypto::tink::RegistryConfig& config) {
-  for (const auto& entry : config.entry()) {
-    util::Status status;
-    std::string primitive_name = absl::AsciiStrToLower(entry.primitive_name());
-
-    if (primitive_name == "mac") {
-      status = Register<Mac>(entry);
-    } else if (primitive_name == "aead") {
-      status = Register<Aead>(entry);
-    } else if (primitive_name == "deterministicaead") {
-      status = Register<DeterministicAead>(entry);
-    } else if (primitive_name == "hybriddecrypt") {
-      status = Register<HybridDecrypt>(entry);
-    } else if (primitive_name == "hybridencrypt") {
-      status = Register<HybridEncrypt>(entry);
-    } else if (primitive_name == "publickeysign") {
-      status = Register<PublicKeySign>(entry);
-    } else if (primitive_name == "publickeyverify") {
-      status = Register<PublicKeyVerify>(entry);
-    } else {
-      status = ToStatusF(crypto::tink::util::error::INVALID_ARGUMENT,
-                         "A non-standard primitive '%s' '%s', "
-                         "use directly Config::Register<P>(KeyTypeEntry&).",
-                         entry.primitive_name().c_str(),
-                         primitive_name.c_str()
-                         );
-    }
-    if (!status.ok()) return status;
-    status = RegisterWrapper(primitive_name);
-    if (!status.ok()) return status;
-  }
+  util::Status status;
+  status = MacConfig::Register();
+  if (!status.ok()) return status;
+  status = AeadConfig::Register();
+  if (!status.ok()) return status;
+  status = DeterministicAeadConfig::Register();
+  if (!status.ok()) return status;
+  status = HybridConfig::Register();
+  if (!status.ok()) return status;
+  status = SignatureConfig::Register();
+  if (!status.ok()) return status;
+  status = StreamingAeadConfig::Register();
+  if (!status.ok()) return status;
   return util::Status::OK;
 }
 
-// static
-util::Status Config::RegisterWrapper(
-    absl::string_view lowercase_primitive_name) {
-  if (lowercase_primitive_name == "mac") {
-    return Registry::RegisterPrimitiveWrapper(absl::make_unique<MacWrapper>());
-  } else if (lowercase_primitive_name == "aead") {
-    return Registry::RegisterPrimitiveWrapper(absl::make_unique<AeadWrapper>());
-  } else if (lowercase_primitive_name == "deterministicaead") {
-    return Registry::RegisterPrimitiveWrapper(
-        absl::make_unique<DeterministicAeadWrapper>());
-  } else if (lowercase_primitive_name == "hybriddecrypt") {
-    return Registry::RegisterPrimitiveWrapper(
-        absl::make_unique<HybridDecryptWrapper>());
-  } else if (lowercase_primitive_name == "hybridencrypt") {
-    return Registry::RegisterPrimitiveWrapper(
-        absl::make_unique<HybridEncryptWrapper>());
-  } else if (lowercase_primitive_name == "publickeysign") {
-    return Registry::RegisterPrimitiveWrapper(
-        absl::make_unique<PublicKeySignWrapper>());
-  } else if (lowercase_primitive_name == "publickeyverify") {
-    return Registry::RegisterPrimitiveWrapper(
-        absl::make_unique<PublicKeyVerifyWrapper>());
-  } else {
-    return crypto::tink::util::Status(
-        crypto::tink::util::error::INVALID_ARGUMENT,
-        absl::StrCat("Cannot register primitive wrapper for non-standard "
-                     "primitive ",
-                     lowercase_primitive_name,
-                     " (call Registry::RegisterPrimitiveWrapper directly)"));
-  }
-}
-
 }  // namespace tink
 }  // namespace crypto
diff --git a/cc/core/config_test.cc b/cc/core/config_test.cc
index 70f9d2d..dd0b542 100644
--- a/cc/core/config_test.cc
+++ b/cc/core/config_test.cc
@@ -44,7 +44,7 @@
   entry.set_primitive_name("some primitive");
   status = Config::Register<Mac>(entry);
   EXPECT_FALSE(status.ok());
-  EXPECT_EQ(util::error::NOT_FOUND, status.error_code());
+  EXPECT_EQ(util::error::INVALID_ARGUMENT, status.error_code());
 }
 
 
diff --git a/cc/core/json_keyset_reader.cc b/cc/core/json_keyset_reader.cc
index 52189a1..851c5fd 100644
--- a/cc/core/json_keyset_reader.cc
+++ b/cc/core/json_keyset_reader.cc
@@ -259,9 +259,9 @@
   rapidjson::Document json_doc(rapidjson::kObjectType);
   if (json_doc.Parse(serialized_keyset->c_str()).HasParseError()) {
     return ToStatusF(tinkutil::error::INVALID_ARGUMENT,
-        "Invalid JSON Keyset: Error (offset %u): %s",
-        (unsigned)json_doc.GetErrorOffset(),
-        rapidjson::GetParseError_En(json_doc.GetParseError()));
+                     "Invalid JSON Keyset: Error (offset %u): %s",
+                     static_cast<unsigned>(json_doc.GetErrorOffset()),
+                     rapidjson::GetParseError_En(json_doc.GetParseError()));
   }
   return KeysetFromJson(json_doc);
 }
@@ -280,9 +280,9 @@
   rapidjson::Document json_doc;
   if (json_doc.Parse(serialized_keyset->c_str()).HasParseError()) {
     return ToStatusF(tinkutil::error::INVALID_ARGUMENT,
-        "Invalid JSON EncryptedKeyset: Error (offset %u): %s",
-        (unsigned)json_doc.GetErrorOffset(),
-        rapidjson::GetParseError_En(json_doc.GetParseError()));
+                     "Invalid JSON EncryptedKeyset: Error (offset %u): %s",
+                     static_cast<unsigned>(json_doc.GetErrorOffset()),
+                     rapidjson::GetParseError_En(json_doc.GetParseError()));
   }
   return EncryptedKeysetFromJson(json_doc);
 }
diff --git a/cc/core/json_keyset_writer_test.cc b/cc/core/json_keyset_writer_test.cc
index 03ed049..c272b6f 100644
--- a/cc/core/json_keyset_writer_test.cc
+++ b/cc/core/json_keyset_writer_test.cc
@@ -192,7 +192,7 @@
   EXPECT_FALSE(
       json_encrypted_keyset.Parse(buffer.str().c_str()).HasParseError())
       << "Parsing error at position "
-      << (unsigned)json_encrypted_keyset.GetErrorOffset()
+      << static_cast<unsigned>(json_encrypted_keyset.GetErrorOffset())
       << " of JSON string\n"
       << buffer.str() << "\n"
       << rapidjson::GetParseError_En(json_encrypted_keyset.GetParseError());
diff --git a/cc/core/key_manager_base.h b/cc/core/key_manager_base.h
deleted file mode 100644
index d44a9ef..0000000
--- a/cc/core/key_manager_base.h
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-#ifndef TINK_CORE_KEY_MANAGER_BASE_H_
-#define TINK_CORE_KEY_MANAGER_BASE_H_
-
-#include <memory>
-#include <string>
-
-#include "absl/base/casts.h"
-#include "absl/memory/memory.h"
-#include "absl/strings/str_cat.h"
-#include "tink/key_manager.h"
-#include "tink/util/constants.h"
-#include "tink/util/errors.h"
-#include "tink/util/statusor.h"
-#include "proto/tink.pb.h"
-
-namespace crypto {
-namespace tink {
-
-template <typename KeyProto, typename KeyFormatProto>
-class KeyFactoryBase : public virtual KeyFactory {
- public:
-  KeyFactoryBase() {}
-
-  crypto::tink::util::StatusOr<std::unique_ptr<portable_proto::MessageLite>>
-  NewKey(const portable_proto::MessageLite& key_format) const override {
-    if (key_format.GetTypeName() != KeyFormatProto().GetTypeName()) {
-      return crypto::tink::util::Status(
-          util::error::INVALID_ARGUMENT,
-          absl::StrCat("Key format proto '", key_format.GetTypeName(),
-                       "' is not supported by this manager."));
-    }
-    crypto::tink::util::StatusOr<std::unique_ptr<KeyProto>> new_key_result =
-        NewKeyFromFormat(static_cast<const KeyFormatProto&>(key_format));
-    if (!new_key_result.ok()) return new_key_result.status();
-    return absl::implicit_cast<std::unique_ptr<portable_proto::MessageLite>>(
-        std::move(new_key_result.ValueOrDie()));
-  }
-
-  crypto::tink::util::StatusOr<std::unique_ptr<portable_proto::MessageLite>>
-  NewKey(absl::string_view serialized_key_format) const override {
-    KeyFormatProto key_format;
-    if (!key_format.ParseFromString(std::string(serialized_key_format))) {
-      return crypto::tink::util::Status(
-          util::error::INVALID_ARGUMENT,
-          absl::StrCat("Could not parse the passed string as proto '",
-                       KeyFormatProto().GetTypeName(), "'."));
-    }
-    return NewKey(key_format);
-  }
-
-  crypto::tink::util::StatusOr<std::unique_ptr<google::crypto::tink::KeyData>>
-  NewKeyData(absl::string_view serialized_key_format) const override {
-    auto new_key_result = NewKey(serialized_key_format);
-    if (!new_key_result.ok()) return new_key_result.status();
-    auto new_key =
-        static_cast<const KeyProto&>(*(new_key_result.ValueOrDie()));
-    auto key_data = absl::make_unique<google::crypto::tink::KeyData>();
-    key_data->set_type_url(
-        absl::StrCat(kTypeGoogleapisCom, KeyProto().GetTypeName()));
-    key_data->set_value(new_key.SerializeAsString());
-    key_data->set_key_material_type(key_material_type());
-    return std::move(key_data);
-  }
-
-  virtual google::crypto::tink::KeyData::KeyMaterialType key_material_type()
-      const = 0;
-
- protected:
-  virtual crypto::tink::util::StatusOr<std::unique_ptr<KeyProto>>
-  NewKeyFromFormat(const KeyFormatProto& format) const = 0;
-};
-
-template <typename Primitive, typename KeyProto>
-class KeyManagerBase : public KeyManager<Primitive> {
- public:
-  // Constructs an instance of Primitive for the given 'key_data'.
-  crypto::tink::util::StatusOr<std::unique_ptr<Primitive>> GetPrimitive(
-      const google::crypto::tink::KeyData& key_data) const override {
-    if (this->DoesSupport(key_data.type_url())) {
-      KeyProto key_proto;
-      if (!key_proto.ParseFromString(key_data.value())) {
-        return ToStatusF(util::error::INVALID_ARGUMENT,
-                         "Could not parse key_data.value as key type '%s'.",
-                         key_data.type_url().c_str());
-      }
-      return GetPrimitiveFromKey(key_proto);
-    } else {
-      return ToStatusF(util::error::INVALID_ARGUMENT,
-                       "Key type '%s' is not supported by this manager.",
-                       key_data.type_url().c_str());
-    }
-  }
-
-  // Constructs an instance of Primitive for the given 'key'.
-  crypto::tink::util::StatusOr<std::unique_ptr<Primitive>> GetPrimitive(
-      const portable_proto::MessageLite& key) const override {
-    std::string key_type = absl::StrCat(kTypeGoogleapisCom, key.GetTypeName());
-    if (this->DoesSupport(key_type)) {
-      const KeyProto& key_proto = static_cast<const KeyProto&>(key);
-      return GetPrimitiveFromKey(key_proto);
-    } else {
-      return ToStatusF(util::error::INVALID_ARGUMENT,
-                       "Key type '%s' is not supported by this manager.",
-                       key_type.c_str());
-    }
-  }
-
-  const std::string& get_key_type() const override {
-    return KeyManagerBase::static_key_type();
-  }
-
-  static std::string& static_key_type() {
-    static std::string* key_type =
-        new std::string(absl::StrCat(kTypeGoogleapisCom, KeyProto().GetTypeName()));
-    return *key_type;
-  }
-
- protected:
-  virtual crypto::tink::util::StatusOr<std::unique_ptr<Primitive>>
-  GetPrimitiveFromKey(const KeyProto& key_proto) const = 0;
-};
-
-}  // namespace tink
-}  // namespace crypto
-
-#endif  // TINK_CORE_KEY_MANAGER_BASE_H_
diff --git a/cc/core/key_manager_impl.h b/cc/core/key_manager_impl.h
new file mode 100644
index 0000000..7512d44
--- /dev/null
+++ b/cc/core/key_manager_impl.h
@@ -0,0 +1,240 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+#ifndef TINK_CORE_KEY_MANAGER_IMPL_H_
+#define TINK_CORE_KEY_MANAGER_IMPL_H_
+
+#include "absl/base/casts.h"
+#include "tink/core/key_type_manager.h"
+#include "tink/key_manager.h"
+#include "tink/util/constants.h"
+#include "tink/util/status.h"
+#include "proto/tink.pb.h"
+
+namespace crypto {
+namespace tink {
+namespace internal {
+
+// Template declaration of the class "KeyFactoryImpl" with a single template
+// argument. We first declare it, then later give two "partial template
+// specializations". This will imply that the KeyFactoryImpl can only be
+// instantiated with arguments of the form KeyTypeManager<...>.
+template <class KeyTypeManager>
+class KeyFactoryImpl;
+
+// First partial template specialization for KeyFactoryImpl: the given
+// KeyTypeManager is of the form KeyTypeManager<KeyProto,
+// KeyFormatProto, List<Primitives...>>.
+template <class KeyProto, class KeyFormatProto, class... Primitives>
+class KeyFactoryImpl<
+    KeyTypeManager<KeyProto, KeyFormatProto, List<Primitives...>>>
+    : public KeyFactory {
+ public:
+  explicit KeyFactoryImpl(KeyTypeManager<KeyProto, KeyFormatProto,
+                                         List<Primitives...>>* key_type_manager)
+      : key_type_manager_(key_type_manager) {}
+
+  crypto::tink::util::StatusOr<std::unique_ptr<portable_proto::MessageLite>>
+  NewKey(const portable_proto::MessageLite& key_format) const override {
+    if (key_format.GetTypeName() != KeyFormatProto().GetTypeName()) {
+      return crypto::tink::util::Status(
+          util::error::INVALID_ARGUMENT,
+          absl::StrCat("Key format proto '", key_format.GetTypeName(),
+                       "' is not supported by this manager."));
+    }
+    auto validation = key_type_manager_->ValidateKeyFormat(
+        static_cast<const KeyFormatProto&>(key_format));
+    if (!validation.ok()) {
+      return validation;
+    }
+    crypto::tink::util::StatusOr<KeyProto> new_key_result =
+        key_type_manager_->CreateKey(
+            static_cast<const KeyFormatProto&>(key_format));
+    if (!new_key_result.ok()) return new_key_result.status();
+    return absl::implicit_cast<std::unique_ptr<portable_proto::MessageLite>>(
+        absl::make_unique<KeyProto>(std::move(new_key_result.ValueOrDie())));
+  }
+
+  crypto::tink::util::StatusOr<std::unique_ptr<portable_proto::MessageLite>>
+  NewKey(absl::string_view serialized_key_format) const override {
+    KeyFormatProto key_format;
+    if (!key_format.ParseFromString(std::string(serialized_key_format))) {
+      return crypto::tink::util::Status(
+          util::error::INVALID_ARGUMENT,
+          absl::StrCat("Could not parse the passed string as proto '",
+                       KeyFormatProto().GetTypeName(), "'."));
+    }
+    auto validation = key_type_manager_->ValidateKeyFormat(key_format);
+    if (!validation.ok()) {
+      return validation;
+    }
+    return NewKey(static_cast<const portable_proto::MessageLite&>(key_format));
+  }
+
+  crypto::tink::util::StatusOr<std::unique_ptr<google::crypto::tink::KeyData>>
+  NewKeyData(absl::string_view serialized_key_format) const override {
+    auto new_key_result = NewKey(serialized_key_format);
+    if (!new_key_result.ok()) return new_key_result.status();
+    auto new_key = static_cast<const KeyProto&>(*(new_key_result.ValueOrDie()));
+    auto key_data = absl::make_unique<google::crypto::tink::KeyData>();
+    key_data->set_type_url(
+        absl::StrCat(kTypeGoogleapisCom, KeyProto().GetTypeName()));
+    key_data->set_value(new_key.SerializeAsString());
+    key_data->set_key_material_type(key_type_manager_->key_material_type());
+    return std::move(key_data);
+  }
+
+ private:
+  KeyTypeManager<KeyProto, KeyFormatProto, List<Primitives...>>*
+      key_type_manager_;
+};
+
+// Second partial template specialization for KeyFactoryImpl: the given
+// KeyTypeManager is of the form KeyTypeManager<KeyProto, void,
+// List<Primitives...>>.
+template <class KeyProto, class... Primitives>
+class KeyFactoryImpl<KeyTypeManager<KeyProto, void, List<Primitives...>>>
+    : public KeyFactory {
+ public:
+  // We don't need the KeyTypeManager, but this is called from a template,
+  // so the easiest way to ignore the argument is to provide a constructor which
+  // ignores the argument.
+  explicit KeyFactoryImpl(
+      KeyTypeManager<KeyProto, void, List<Primitives...>>* key_type_manager) {}
+
+  crypto::tink::util::StatusOr<std::unique_ptr<portable_proto::MessageLite>>
+  NewKey(const portable_proto::MessageLite& key_format) const override {
+    return util::Status(
+        util::error::UNIMPLEMENTED,
+        "Creating new keys is not supported for this key manager.");
+  }
+
+  crypto::tink::util::StatusOr<std::unique_ptr<portable_proto::MessageLite>>
+  NewKey(absl::string_view serialized_key_format) const override {
+    return util::Status(
+        util::error::UNIMPLEMENTED,
+        "Creating new keys is not supported for this key manager.");
+  }
+
+  crypto::tink::util::StatusOr<std::unique_ptr<google::crypto::tink::KeyData>>
+  NewKeyData(absl::string_view serialized_key_format) const override {
+    return util::Status(
+        util::error::UNIMPLEMENTED,
+        "Creating new keys is not supported for this key manager.");
+  }
+};
+
+// Template declaration of the class "KeyManagerImpl" with two template
+// arguments. There is only one specialization which is defined, namely when
+// the KeyTypeManager argument is of the form KeyTypeManager<KeyProto,
+// KeyFormatProto, List<Primitives...>>. We don't provide a
+// specialization for the case KeyFormatProto = void, so the compiler will pick
+// this instantiation in this case.
+template <class Primitive, class KeyTypeManager>
+class KeyManagerImpl;
+
+// The first template argument to the KeyManagerImpl is the primitive for which
+// we should generate a KeyManager. The second is the KeyTypeManager, which
+// takes itself template arguments. The list of the Primitives there must
+// contain the first Primitive argument (otherwise there will be failures at
+// runtime).
+template <class Primitive, class KeyProto, class KeyFormatProto,
+          class... Primitives>
+class KeyManagerImpl<
+    Primitive, KeyTypeManager<KeyProto, KeyFormatProto, List<Primitives...>>>
+    : public KeyManager<Primitive> {
+ public:
+  explicit KeyManagerImpl(KeyTypeManager<KeyProto, KeyFormatProto,
+                                         List<Primitives...>>* key_type_manager)
+      : key_type_manager_(key_type_manager),
+        key_factory_(
+            absl::make_unique<KeyFactoryImpl<
+                KeyTypeManager<KeyProto, KeyFormatProto, List<Primitives...>>>>(
+                key_type_manager_)) {}
+
+  // Constructs an instance of Primitive for the given 'key_data'.
+  crypto::tink::util::StatusOr<std::unique_ptr<Primitive>> GetPrimitive(
+      const google::crypto::tink::KeyData& key_data) const override {
+    if (!this->DoesSupport(key_data.type_url())) {
+      return ToStatusF(util::error::INVALID_ARGUMENT,
+                       "Key type '%s' is not supported by this manager.",
+                       key_data.type_url().c_str());
+    }
+    KeyProto key_proto;
+    if (!key_proto.ParseFromString(key_data.value())) {
+      return ToStatusF(util::error::INVALID_ARGUMENT,
+                       "Could not parse key_data.value as key type '%s'.",
+                       key_data.type_url().c_str());
+    }
+    auto validation = key_type_manager_->ValidateKey(key_proto);
+    if (!validation.ok()) {
+      return validation;
+    }
+    return key_type_manager_->template GetPrimitive<Primitive>(key_proto);
+  }
+
+  crypto::tink::util::StatusOr<std::unique_ptr<Primitive>> GetPrimitive(
+      const portable_proto::MessageLite& key) const override {
+    std::string key_type = absl::StrCat(kTypeGoogleapisCom, key.GetTypeName());
+    if (!this->DoesSupport(key_type)) {
+      return ToStatusF(util::error::INVALID_ARGUMENT,
+                       "Key type '%s' is not supported by this manager.",
+                       key_type.c_str());
+    }
+    const KeyProto& key_proto = static_cast<const KeyProto&>(key);
+    auto validation = key_type_manager_->ValidateKey(key_proto);
+    if (!validation.ok()) {
+      return validation;
+    }
+    return key_type_manager_->template GetPrimitive<Primitive>(key_proto);
+  }
+
+  uint32_t get_version() const override {
+    return key_type_manager_->get_version();
+  }
+
+  const std::string& get_key_type() const override {
+    return key_type_manager_->get_key_type();
+  }
+
+  const KeyFactory& get_key_factory() const override {
+    return *key_factory_;
+  }
+
+ private:
+  KeyTypeManager<KeyProto, KeyFormatProto, List<Primitives...>>*
+      key_type_manager_;
+  std::unique_ptr<KeyFactory> key_factory_;
+};
+
+// Helper function to create a KeyManager<Primitive> from a KeyTypeManager.
+// Using this, all template arguments except the first one can be infered.
+// Example:
+//   std::unique_ptr<KeyManager<Aead>> km =
+//     MakeKeyManager<Aead>(my_key_type_manager.get());
+template <class Primitive, class KeyProto, class KeyFormatProto,
+          class... Primitives>
+std::unique_ptr<KeyManager<Primitive>> MakeKeyManager(
+    KeyTypeManager<KeyProto, KeyFormatProto, List<Primitives...>>*
+        key_type_manager) {
+  return absl::make_unique<
+      KeyManagerImpl<Primitive, KeyTypeManager<KeyProto, KeyFormatProto,
+                                               List<Primitives...>>>>(
+      key_type_manager);
+}
+
+}  // namespace internal
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_CORE_KEY_MANAGER_IMPL_H_
diff --git a/cc/core/key_manager_impl_test.cc b/cc/core/key_manager_impl_test.cc
new file mode 100644
index 0000000..7d68b7a
--- /dev/null
+++ b/cc/core/key_manager_impl_test.cc
@@ -0,0 +1,454 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/core/key_manager_impl.h"
+
+#include <string>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "tink/aead.h"
+#include "tink/subtle/aes_gcm_boringssl.h"
+#include "tink/subtle/random.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/test_matchers.h"
+#include "tink/util/test_util.h"
+#include "tink/util/validation.h"
+#include "proto/aes_gcm.pb.h"
+
+namespace crypto {
+namespace tink {
+namespace internal {
+namespace {
+
+using ::crypto::tink::test::StatusIs;
+using ::google::crypto::tink::AesGcmKey;
+using ::google::crypto::tink::AesGcmKeyFormat;
+using ::google::crypto::tink::KeyData;
+using ::testing::_;
+using ::testing::Eq;
+using ::testing::HasSubstr;
+using ::testing::Return;
+using ::testing::SizeIs;
+
+// A class for testing. We will construct objects from an aead key, so that we
+// can check that a keymanager can handle multiple primitives. It is really
+// insecure, as it does nothing except provide access to the key.
+class AeadVariant {
+ public:
+  explicit AeadVariant(std::string s) : s_(s) {}
+
+  std::string get() { return s_; }
+
+ private:
+  std::string s_;
+};
+
+class ExampleKeyTypeManager : public KeyTypeManager<AesGcmKey, AesGcmKeyFormat,
+                                                    List<Aead, AeadVariant>> {
+ public:
+  class AeadFactory : public PrimitiveFactory<Aead> {
+   public:
+    crypto::tink::util::StatusOr<std::unique_ptr<Aead>> Create(
+        const AesGcmKey& key) const override {
+      // Ignore the key and returned one with a fixed size for this test.
+      return {subtle::AesGcmBoringSsl::New(key.key_value())};
+    }
+  };
+
+  class AeadVariantFactory : public PrimitiveFactory<AeadVariant> {
+   public:
+    crypto::tink::util::StatusOr<std::unique_ptr<AeadVariant>> Create(
+        const AesGcmKey& key) const override {
+      return absl::make_unique<AeadVariant>(key.key_value());
+    }
+  };
+
+  ExampleKeyTypeManager()
+      : KeyTypeManager(absl::make_unique<AeadFactory>(),
+                       absl::make_unique<AeadVariantFactory>()) {}
+
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::SYMMETRIC;
+  }
+
+  MOCK_CONST_METHOD0(get_version, uint32_t());
+
+  // We mock out ValidateKey and ValidateKeyFormat so that we can easily test
+  // proper behavior in case they return an error.
+  MOCK_CONST_METHOD1(ValidateKey,
+                     crypto::tink::util::Status(const AesGcmKey& key));
+  MOCK_CONST_METHOD1(ValidateKeyFormat,
+                     crypto::tink::util::Status(const AesGcmKeyFormat& key));
+
+  const std::string& get_key_type() const override { return kKeyType; }
+
+
+  crypto::tink::util::StatusOr<AesGcmKey> CreateKey(
+      const AesGcmKeyFormat& key_format) const override {
+    AesGcmKey result;
+    result.set_key_value(subtle::Random::GetRandomBytes(key_format.key_size()));
+    return result;
+  }
+
+ private:
+  const std::string kKeyType = "type.googleapis.com/google.crypto.tink.AesGcmKey";
+};
+
+TEST(KeyManagerImplTest, FactoryNewKeyFromMessage) {
+  ExampleKeyTypeManager internal_km;
+  std::unique_ptr<KeyManager<AeadVariant>> key_manager =
+      MakeKeyManager<AeadVariant>(&internal_km);
+
+  AesGcmKeyFormat key_format;
+  key_format.set_key_size(16);
+  auto key = key_manager->get_key_factory().NewKey(key_format).ValueOrDie();
+
+  EXPECT_THAT(dynamic_cast<AesGcmKey&>(*key).key_value(), SizeIs(16));
+}
+
+TEST(KeyManagerImplTest, FactoryNewKeyFromStringView) {
+  ExampleKeyTypeManager internal_km;
+  std::unique_ptr<KeyManager<AeadVariant>> key_manager =
+      MakeKeyManager<AeadVariant>(&internal_km);
+
+  AesGcmKeyFormat key_format;
+  key_format.set_key_size(16);
+  auto key = key_manager->get_key_factory()
+                 .NewKey(key_format.SerializeAsString())
+                 .ValueOrDie();
+
+  EXPECT_THAT(dynamic_cast<AesGcmKey&>(*key).key_value(), SizeIs(16));
+}
+
+TEST(KeyManagerImplTest, FactoryNewKeyFromKeyData) {
+  ExampleKeyTypeManager internal_km;
+  std::unique_ptr<KeyManager<AeadVariant>> key_manager =
+      MakeKeyManager<AeadVariant>(&internal_km);
+
+  AesGcmKeyFormat key_format;
+  key_format.set_key_size(16);
+  auto key_data = *key_manager->get_key_factory()
+                       .NewKeyData(key_format.SerializeAsString())
+                       .ValueOrDie();
+
+  AesGcmKey key;
+  key.ParseFromString(key_data.value());
+  EXPECT_THAT(key.key_value(), SizeIs(16));
+}
+
+TEST(KeyManagerImplTest, FactoryNewKeyFromMessageCallsValidate) {
+  ExampleKeyTypeManager internal_km;
+  std::unique_ptr<KeyManager<AeadVariant>> key_manager =
+      MakeKeyManager<AeadVariant>(&internal_km);
+
+  AesGcmKeyFormat key_format;
+  key_format.set_key_size(16);
+  EXPECT_CALL(internal_km, ValidateKeyFormat(_))
+      .WillOnce(Return(ToStatusF(util::error::OUT_OF_RANGE,
+                                 "FactoryNewKeyFromMessageCallsValidate")));
+  EXPECT_THAT(key_manager->get_key_factory().NewKey(key_format).status(),
+              StatusIs(util::error::OUT_OF_RANGE,
+                       HasSubstr("FactoryNewKeyFromMessageCallsValidate")));
+}
+
+TEST(KeyManagerImplTest, FactoryNewKeyFromStringViewCallsValidate) {
+  ExampleKeyTypeManager internal_km;
+  std::unique_ptr<KeyManager<AeadVariant>> key_manager =
+      MakeKeyManager<AeadVariant>(&internal_km);
+
+  AesGcmKeyFormat key_format;
+  key_format.set_key_size(16);
+  EXPECT_CALL(internal_km, ValidateKeyFormat(_))
+      .WillOnce(Return(ToStatusF(util::error::OUT_OF_RANGE,
+                                 "FactoryNewKeyFromStringViewCallsValidate")));
+  EXPECT_THAT(key_manager->get_key_factory()
+                  .NewKey(key_format.SerializeAsString())
+                  .status(),
+              StatusIs(util::error::OUT_OF_RANGE,
+                       HasSubstr("FactoryNewKeyFromStringViewCallsValidate")));
+}
+
+TEST(KeyManagerImplTest, FactoryNewKeyFromKeyDataCallsValidate) {
+  ExampleKeyTypeManager internal_km;
+  std::unique_ptr<KeyManager<AeadVariant>> key_manager =
+      MakeKeyManager<AeadVariant>(&internal_km);
+
+  AesGcmKeyFormat key_format;
+  key_format.set_key_size(16);
+  EXPECT_CALL(internal_km, ValidateKeyFormat(_))
+      .WillOnce(Return(ToStatusF(util::error::OUT_OF_RANGE,
+                                 "FactoryNewKeyFromKeyDataCallsValidate")));
+  EXPECT_THAT(key_manager->get_key_factory()
+                  .NewKeyData(key_format.SerializeAsString())
+                  .status(),
+              StatusIs(util::error::OUT_OF_RANGE,
+                       HasSubstr("FactoryNewKeyFromKeyDataCallsValidate")));
+}
+
+TEST(KeyManagerImplTest, GetPrimitiveAead) {
+  ExampleKeyTypeManager internal_km;
+  std::unique_ptr<KeyManager<Aead>> key_manager =
+      MakeKeyManager<Aead>(&internal_km);
+
+  AesGcmKeyFormat key_format;
+  key_format.set_key_size(16);
+
+  auto key_data = *key_manager->get_key_factory()
+                       .NewKeyData(key_format.SerializeAsString())
+                       .ValueOrDie();
+
+  auto aead = key_manager->GetPrimitive(key_data).ValueOrDie();
+  std::string encryption = aead->Encrypt("Hi", "aad").ValueOrDie();
+  std::string decryption = aead->Decrypt(encryption, "aad").ValueOrDie();
+  EXPECT_THAT(decryption, Eq("Hi"));
+}
+
+TEST(KeyManagerImplTest, GetPrimitiveAeadVariant) {
+  ExampleKeyTypeManager internal_km;
+  std::unique_ptr<KeyManager<AeadVariant>> key_manager =
+      MakeKeyManager<AeadVariant>(&internal_km);
+
+  AesGcmKeyFormat key_format;
+  key_format.set_key_size(16);
+  auto key_data = *key_manager->get_key_factory()
+                       .NewKeyData(key_format.SerializeAsString())
+                       .ValueOrDie();
+
+  AesGcmKey key;
+  key.ParseFromString(key_data.value());
+  auto aead_variant = key_manager->GetPrimitive(key_data).ValueOrDie();
+  EXPECT_THAT(aead_variant->get(), Eq(key.key_value()));
+}
+
+TEST(KeyManagerImplTest, GetPrimitiveFromKey) {
+  ExampleKeyTypeManager internal_km;
+  std::unique_ptr<KeyManager<Aead>> key_manager =
+      MakeKeyManager<Aead>(&internal_km);
+
+  AesGcmKeyFormat key_format;
+  key_format.set_key_size(16);
+  auto key = key_manager->get_key_factory()
+                 .NewKey(key_format.SerializeAsString())
+                 .ValueOrDie();
+
+  auto aead = key_manager->GetPrimitive(*key).ValueOrDie();
+  std::string encryption = aead->Encrypt("Hi", "aad").ValueOrDie();
+  std::string decryption = aead->Decrypt(encryption, "aad").ValueOrDie();
+  EXPECT_THAT(decryption, Eq("Hi"));
+}
+
+TEST(KeyManagerImplTest, GetKeyType) {
+  ExampleKeyTypeManager internal_km;
+  std::unique_ptr<KeyManager<Aead>> key_manager =
+      MakeKeyManager<Aead>(&internal_km);
+  EXPECT_THAT(key_manager->get_key_type(), Eq(internal_km.get_key_type()));
+}
+
+TEST(KeyManagerImplTest, GetVersion) {
+  ExampleKeyTypeManager internal_km;
+  std::unique_ptr<KeyManager<Aead>> key_manager =
+      MakeKeyManager<Aead>(&internal_km);
+  EXPECT_CALL(internal_km, get_version()).WillOnce(Return(121351));
+  EXPECT_THAT(121351, Eq(internal_km.get_version()));
+}
+
+TEST(KeyManagerImplTest, DoesSupport) {
+  ExampleKeyTypeManager internal_km;
+  std::unique_ptr<KeyManager<Aead>> key_manager =
+      MakeKeyManager<Aead>(&internal_km);
+  EXPECT_TRUE(key_manager->DoesSupport(internal_km.get_key_type()));
+  // Check with first and last letter removed.
+  EXPECT_FALSE(key_manager->DoesSupport(
+      "type.googleapis.com/google.crypto.tink.AesGcmKe"));
+  EXPECT_FALSE(key_manager->DoesSupport(
+      "ype.googleapis.com/google.crypto.tink.AesGcmKey"));
+}
+
+TEST(KeyManagerImplTest, GetPrimitiveCallsValidate) {
+  ExampleKeyTypeManager internal_km;
+  std::unique_ptr<KeyManager<Aead>> key_manager =
+      MakeKeyManager<Aead>(&internal_km);
+
+  AesGcmKeyFormat key_format;
+  key_format.set_key_size(16);
+  auto key_data = *key_manager->get_key_factory()
+                       .NewKeyData(key_format.SerializeAsString())
+                       .ValueOrDie();
+
+  AesGcmKey key;
+  key.ParseFromString(key_data.value());
+
+  EXPECT_CALL(internal_km, ValidateKey(_))
+      .WillOnce(
+          Return(ToStatusF(util::error::OUT_OF_RANGE,
+                           "GetPrimitiveCallsValidate")));
+  EXPECT_THAT(key_manager->GetPrimitive(key_data).status(),
+              StatusIs(util::error::OUT_OF_RANGE,
+                       HasSubstr("GetPrimitiveCallsValidate")));
+}
+
+TEST(KeyManagerImplTest, GetPrimitiveFromKeyCallsValidate) {
+  ExampleKeyTypeManager internal_km;
+  std::unique_ptr<KeyManager<Aead>> key_manager =
+      MakeKeyManager<Aead>(&internal_km);
+
+  AesGcmKeyFormat key_format;
+  key_format.set_key_size(16);
+  auto key_data = *key_manager->get_key_factory()
+                       .NewKeyData(key_format.SerializeAsString())
+                       .ValueOrDie();
+
+  AesGcmKey key;
+  key.ParseFromString(key_data.value());
+
+  EXPECT_CALL(internal_km, ValidateKey(_))
+      .WillOnce(Return(
+          ToStatusF(util::error::OUT_OF_RANGE,
+                    "GetPrimitiveFromKeyCallsValidate")));
+  EXPECT_THAT(key_manager->GetPrimitive(key).status(),
+              StatusIs(util::error::OUT_OF_RANGE,
+                       HasSubstr("GetPrimitiveFromKeyCallsValidate")));
+}
+
+// If we create a KeyManager for a not supported class, creating the key manager
+// succeeds, but "GetPrimitive" will fail. Since MakeKeyManager is only supposed
+// to be used internally, we are not doing extra work to make this a compile
+// time error.
+class NotSupported {};
+TEST(KeyManagerImplTest, GetPrimitiveFails) {
+  ExampleKeyTypeManager internal_km;
+  std::unique_ptr<KeyManager<NotSupported>> key_manager =
+      MakeKeyManager<NotSupported>(&internal_km);
+  AesGcmKeyFormat key_format;
+  key_format.set_key_size(16);
+  auto key_data = *key_manager->get_key_factory()
+                       .NewKeyData(key_format.SerializeAsString())
+                       .ValueOrDie();
+
+  EXPECT_THAT(key_manager->GetPrimitive(key_data).status(),
+              StatusIs(util::error::INVALID_ARGUMENT,
+                       HasSubstr("No PrimitiveFactory was registered")));
+}
+
+// Next, we test some of the methods with a KeyTypeManager which has no
+// factory.
+class ExampleKeyTypeManagerWithoutFactory
+    : public KeyTypeManager<AesGcmKey, void, List<Aead, AeadVariant>> {
+ public:
+  class AeadFactory : public PrimitiveFactory<Aead> {
+   public:
+    crypto::tink::util::StatusOr<std::unique_ptr<Aead>> Create(
+        const AesGcmKey& key) const override {
+      // Ignore the key and returned one with a fixed size for this test.
+      return {subtle::AesGcmBoringSsl::New(key.key_value())};
+    }
+  };
+
+  class AeadVariantFactory : public PrimitiveFactory<AeadVariant> {
+   public:
+    crypto::tink::util::StatusOr<std::unique_ptr<AeadVariant>> Create(
+        const AesGcmKey& key) const override {
+      return absl::make_unique<AeadVariant>(key.key_value());
+    }
+  };
+
+  ExampleKeyTypeManagerWithoutFactory()
+      : KeyTypeManager(absl::make_unique<AeadFactory>(),
+                       absl::make_unique<AeadVariantFactory>()) {}
+
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::SYMMETRIC;
+  }
+
+  uint32_t get_version() const override { return kVersion; }
+
+  const std::string& get_key_type() const override { return key_type_; }
+
+  util::Status ValidateKey(const AesGcmKey& key) const override {
+    util::Status status = ValidateVersion(key.version(), kVersion);
+    if (!status.ok()) return status;
+    return ValidateAesKeySize(key.key_value().size());
+  }
+
+ private:
+  static const int kVersion = 0;
+  const std::string key_type_ = "type.googleapis.com/google.crypto.tink.AesGcmKey";
+};
+
+TEST(KeyManagerImplTest, GetPrimitiveWithoutFactoryAead) {
+  ExampleKeyTypeManagerWithoutFactory internal_km;
+  std::unique_ptr<KeyManager<Aead>> key_manager =
+      MakeKeyManager<Aead>(&internal_km);
+
+  AesGcmKeyFormat key_format;
+  key_format.set_key_size(16);
+
+  KeyData key_data = test::AsKeyData(
+      ExampleKeyTypeManager().CreateKey(key_format).ValueOrDie(),
+      KeyData::SYMMETRIC);
+
+  auto aead = key_manager->GetPrimitive(key_data).ValueOrDie();
+  std::string encryption = aead->Encrypt("Hi", "aad").ValueOrDie();
+  std::string decryption = aead->Decrypt(encryption, "aad").ValueOrDie();
+  EXPECT_THAT(decryption, Eq("Hi"));
+}
+
+TEST(KeyManagerImplTest, NonexistentFactoryNewKeyFromMessage) {
+  ExampleKeyTypeManagerWithoutFactory internal_km;
+  std::unique_ptr<KeyManager<AeadVariant>> key_manager =
+      MakeKeyManager<AeadVariant>(&internal_km);
+
+  AesGcmKeyFormat key_format;
+  key_format.set_key_size(16);
+  EXPECT_THAT(key_manager->get_key_factory().NewKey(key_format).status(),
+              StatusIs(util::error::UNIMPLEMENTED));
+}
+
+TEST(KeyManagerImplTest, NonexistentFactoryNewKeyFromStringView) {
+  ExampleKeyTypeManagerWithoutFactory internal_km;
+  std::unique_ptr<KeyManager<AeadVariant>> key_manager =
+      MakeKeyManager<AeadVariant>(&internal_km);
+
+  AesGcmKeyFormat key_format;
+  key_format.set_key_size(16);
+
+  EXPECT_THAT(key_manager->get_key_factory()
+                  .NewKey(key_format.SerializeAsString())
+                  .status(),
+              StatusIs(util::error::UNIMPLEMENTED));
+}
+
+TEST(KeyManagerImplTest, NonexistentFactoryNewKeyFromKeyData) {
+  ExampleKeyTypeManagerWithoutFactory internal_km;
+  std::unique_ptr<KeyManager<AeadVariant>> key_manager =
+      MakeKeyManager<AeadVariant>(&internal_km);
+
+  AesGcmKeyFormat key_format;
+  key_format.set_key_size(16);
+  EXPECT_THAT(key_manager->get_key_factory()
+                  .NewKeyData(key_format.SerializeAsString())
+                  .status(),
+              StatusIs(util::error::UNIMPLEMENTED));
+}
+
+
+}  // namespace
+
+}  // namespace internal
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/core/key_type_manager.h b/cc/core/key_type_manager.h
new file mode 100644
index 0000000..25f62a4
--- /dev/null
+++ b/cc/core/key_type_manager.h
@@ -0,0 +1,161 @@
+// Copyright 2019 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_CORE_KEY_TYPE_MANAGER_H_
+#define TINK_CORE_KEY_TYPE_MANAGER_H_
+
+#include <typeindex>
+
+#include "absl/container/flat_hash_map.h"
+#include "tink/core/template_util.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "proto/tink.pb.h"
+
+namespace crypto {
+namespace tink {
+
+template <typename... P>
+class List {};
+
+namespace internal {
+
+// InternalKeyFactory should not be used directly: it is an implementation
+// detail. The internal key factory provides the functions which are required
+// if a KeyTypeManager can create new keys: ValidateKeyFormat and
+// CreateKey. The special case where KeyFormatProto = void implies that the
+// functions do not exist.
+template <typename KeyProto, typename KeyFormatProto>
+class InternalKeyFactory {
+ public:
+  virtual ~InternalKeyFactory() {}
+
+  virtual crypto::tink::util::Status ValidateKeyFormat(
+      const KeyFormatProto& key_format) const = 0;
+  virtual crypto::tink::util::StatusOr<KeyProto> CreateKey(
+      const KeyFormatProto& key_format) const = 0;
+};
+
+// Template specialization for when KeyFormatProto = void. The compiler will
+// pick the most specialized template when compiling.
+template <typename KeyProto>
+class InternalKeyFactory<KeyProto, void> {
+ public:
+  virtual ~InternalKeyFactory() {}
+};
+
+}  // namespace internal
+
+// We declare a KeyTypeManager without giving an implementation. We then
+// provide a specialization only for the case where PrimitivesList is a
+// List with multiple interfaces primitives. This allows to ensure
+// that such is always the case.
+template <typename KeyProto, typename KeyFormatProto, typename PrimitivesList>
+class KeyTypeManager;
+
+// A KeyTypeManager manages a single key proto. This includes
+//  * parsing and validating keys
+//  * parsing and validating key formats (in case generating keys is allowed).
+//  * creating primitives.
+// To implement, one should subclass KeyTypeManager with the corresponding
+// KeyProto as a template parameter; KeyFormatProto should be void in case
+// the key manager cannot produce keys and a protobuf otherwise.
+//
+// The constructor should take unique pointers to primitive factories.
+//
+// KeyTypeManager uses templates for KeyProto, KeyFormatProto and a list of
+// Primitives which have to be provided as a List.
+template <typename KeyProtoParam, typename KeyFormatProtoParam,
+          typename... Primitives>
+class KeyTypeManager<KeyProtoParam, KeyFormatProtoParam, List<Primitives...>>
+    : public internal::InternalKeyFactory<KeyProtoParam, KeyFormatProtoParam> {
+ public:
+  // The types used in this key type manager; these can be useful when writing
+  // templated code.
+  using KeyProto = KeyProtoParam;
+  using KeyFormatProto = KeyFormatProtoParam;
+  using PrimitiveList = List<Primitives...>;
+
+  // A PrimitiveFactory<Primitive> knows how to create instances of the
+  // Primitive.
+  template <typename Primitive>
+  class PrimitiveFactory {
+   public:
+    virtual ~PrimitiveFactory() {}
+    virtual crypto::tink::util::StatusOr<std::unique_ptr<Primitive>> Create(
+        const KeyProto& key) const = 0;
+  };
+
+  // Creates a new KeyTypeManager. The parameter(s) primitives must be some
+  // number of unique_ptr<PrimitiveFactory<P>> types.
+  explicit KeyTypeManager(
+      std::unique_ptr<PrimitiveFactory<Primitives>>... primitives) {
+    static_assert(
+        !crypto::tink::internal::HasDuplicates<Primitives...>::value,
+        "List or primitives contains a duplicate, which is not allowed.");
+    // https://stackoverflow.com/questions/17339789/how-to-call-a-function-on-all-variadic-template-args
+    ABSL_ATTRIBUTE_UNUSED
+    int unused[] = {(AddPrimitive(std::move(primitives)), 0)...};
+  }
+
+  // Returns the type_url identifying the key type handled by this manager.
+  virtual const std::string& get_key_type() const = 0;
+  // Returns the version of this key manager.
+  virtual uint32_t get_version() const = 0;
+
+  // Returns the key material type for this key type.
+  virtual google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const = 0;
+
+  // Validates the key. Returns util::OkStatus() if the key is valid,
+  // and an invalid argument error otherwise.
+  virtual util::Status ValidateKey(const KeyProto& key) const = 0;
+
+  // Creates a new primitive using one of the primitive factories passed in at
+  // construction time.
+  template <typename Primitive>
+  crypto::tink::util::StatusOr<std::unique_ptr<Primitive>> GetPrimitive(
+      const KeyProto& key) const {
+    auto iter = primitive_factories_.find(std::type_index(typeid(Primitive)));
+    if (iter == primitive_factories_.end()) {
+      return crypto::tink::util::Status(
+          util::error::INVALID_ARGUMENT,
+          absl::StrCat("No PrimitiveFactory was registered for type ",
+                       typeid(Primitive).name()));
+    }
+    return static_cast<PrimitiveFactory<Primitive>*>(iter->second.get())
+        ->Create(key);
+  }
+
+ private:
+  // Helper function which adds a single primivie.
+  template <typename Primitive>
+  void AddPrimitive(std::unique_ptr<PrimitiveFactory<Primitive>> primitive) {
+    primitive_factories_.emplace(std::type_index(typeid(Primitive)),
+                                 std::move(primitive));
+  }
+
+  // We use a shared_ptr here because shared_ptr<void> is valid (as opposed to
+  // unique_ptr<void>, where we would have to add a custom deleter with extra
+  // work).
+  absl::flat_hash_map<std::type_index, std::shared_ptr<void>>
+      primitive_factories_;
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_CORE_KEY_TYPE_MANAGER_H_
diff --git a/cc/core/key_type_manager_test.cc b/cc/core/key_type_manager_test.cc
new file mode 100644
index 0000000..6e53e27
--- /dev/null
+++ b/cc/core/key_type_manager_test.cc
@@ -0,0 +1,213 @@
+// Copyright 2019 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/core/key_type_manager.h"
+
+#include <string>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "tink/aead.h"
+#include "tink/subtle/aes_gcm_boringssl.h"
+#include "tink/subtle/random.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/test_matchers.h"
+#include "tink/util/validation.h"
+#include "proto/aes_gcm.pb.h"
+
+namespace crypto {
+namespace tink {
+
+namespace {
+
+using ::crypto::tink::test::StatusIs;
+using ::google::crypto::tink::AesGcmKey;
+using ::google::crypto::tink::AesGcmKeyFormat;
+using ::testing::Eq;
+
+// A class for testing. We will construct objects from an aead key, so that we
+// can check that a keymanager can handle multiple primitives. It is really
+// insecure, as it does nothing except provide access to the key.
+class AeadVariant {
+ public:
+  explicit AeadVariant(std::string s) : s_(s) {}
+
+  std::string get() { return s_; }
+
+ private:
+  std::string s_;
+};
+
+class ExampleKeyTypeManager : public KeyTypeManager<AesGcmKey, AesGcmKeyFormat,
+                                                    List<Aead, AeadVariant>> {
+ public:
+  class AeadFactory : public PrimitiveFactory<Aead> {
+   public:
+    crypto::tink::util::StatusOr<std::unique_ptr<Aead>> Create(
+        const AesGcmKey& key) const override {
+      // Ignore the key and returned one with a fixed size for this test.
+      return {subtle::AesGcmBoringSsl::New(key.key_value())};
+    }
+  };
+
+  class AeadVariantFactory : public PrimitiveFactory<AeadVariant> {
+   public:
+    crypto::tink::util::StatusOr<std::unique_ptr<AeadVariant>> Create(
+        const AesGcmKey& key) const override {
+      return absl::make_unique<AeadVariant>(key.key_value());
+    }
+  };
+
+  ExampleKeyTypeManager()
+      : KeyTypeManager(absl::make_unique<AeadFactory>(),
+                       absl::make_unique<AeadVariantFactory>()) {}
+
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::SYMMETRIC;
+  }
+
+  uint32_t get_version() const override { return kVersion; }
+
+  const std::string& get_key_type() const override { return kKeyType; }
+
+  crypto::tink::util::Status ValidateKey(const AesGcmKey& key) const override {
+    return util::OkStatus();
+  }
+
+  crypto::tink::util::Status ValidateKeyFormat(
+      const AesGcmKeyFormat& key_format) const override {
+    return util::OkStatus();
+  }
+
+  crypto::tink::util::StatusOr<AesGcmKey> CreateKey(
+      const AesGcmKeyFormat& key_format) const override {
+    AesGcmKey result;
+    result.set_key_value(subtle::Random::GetRandomBytes(key_format.key_size()));
+    return result;
+  }
+
+ private:
+  static const int kVersion = 0;
+  const std::string kKeyType = "myKeyType";
+};
+
+TEST(KeyManagerTest, CreateAead) {
+  AesGcmKeyFormat key_format;
+  key_format.set_key_size(16);
+  AesGcmKey key = ExampleKeyTypeManager().CreateKey(key_format).ValueOrDie();
+  std::unique_ptr<Aead> aead =
+      ExampleKeyTypeManager().GetPrimitive<Aead>(key).ValueOrDie();
+
+  std::string encryption = aead->Encrypt("Hi", "aad").ValueOrDie();
+  std::string decryption = aead->Decrypt(encryption, "aad").ValueOrDie();
+  EXPECT_THAT(decryption, Eq("Hi"));
+}
+
+TEST(KeyManagerTest, CreateAeadVariant) {
+  AesGcmKeyFormat key_format;
+  key_format.set_key_size(16);
+  AesGcmKey key = ExampleKeyTypeManager().CreateKey(key_format).ValueOrDie();
+  std::unique_ptr<AeadVariant> aead_variant =
+      ExampleKeyTypeManager().GetPrimitive<AeadVariant>(key).ValueOrDie();
+  EXPECT_THAT(aead_variant->get(), Eq(key.key_value()));
+}
+
+class NotRegistered {};
+TEST(KeyManagerTest, CreateFails) {
+  auto failing =
+      ExampleKeyTypeManager().GetPrimitive<NotRegistered>(AesGcmKey());
+  EXPECT_THAT(failing.status(), test::StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+class ExampleKeyTypeManagerWithoutFactory
+    : public KeyTypeManager<AesGcmKey, void, List<Aead, AeadVariant>> {
+ public:
+  class AeadFactory : public PrimitiveFactory<Aead> {
+   public:
+    crypto::tink::util::StatusOr<std::unique_ptr<Aead>> Create(
+        const AesGcmKey& key) const override {
+      // Ignore the key and returned one with a fixed size for this test.
+      return {subtle::AesGcmBoringSsl::New(key.key_value())};
+    }
+  };
+
+  class AeadVariantFactory : public PrimitiveFactory<AeadVariant> {
+   public:
+    crypto::tink::util::StatusOr<std::unique_ptr<AeadVariant>> Create(
+        const AesGcmKey& key) const override {
+      return absl::make_unique<AeadVariant>(key.key_value());
+    }
+  };
+
+  ExampleKeyTypeManagerWithoutFactory()
+      : KeyTypeManager(absl::make_unique<AeadFactory>(),
+                       absl::make_unique<AeadVariantFactory>()) {}
+
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::SYMMETRIC;
+  }
+
+  uint32_t get_version() const override { return kVersion; }
+
+  const std::string& get_key_type() const override { return key_type_; }
+
+  util::Status ValidateKey(const AesGcmKey& key) const override {
+    util::Status status = ValidateVersion(key.version(), kVersion);
+    if (!status.ok()) return status;
+    return ValidateAesKeySize(key.key_value().size());
+  }
+
+ private:
+  static const int kVersion = 0;
+  const std::string key_type_ = "bla";
+};
+
+TEST(KeyManagerWithoutFactoryTest, CreateAead) {
+  AesGcmKeyFormat key_format;
+  key_format.set_key_size(16);
+  AesGcmKey key = ExampleKeyTypeManager().CreateKey(key_format).ValueOrDie();
+  std::unique_ptr<Aead> aead = ExampleKeyTypeManagerWithoutFactory()
+                                   .GetPrimitive<Aead>(key)
+                                   .ValueOrDie();
+
+  std::string encryption = aead->Encrypt("Hi", "aad").ValueOrDie();
+  std::string decryption = aead->Decrypt(encryption, "aad").ValueOrDie();
+  EXPECT_THAT(decryption, Eq("Hi"));
+}
+
+TEST(KeyManagerWithoutFactoryTest, CreateAeadVariant) {
+  AesGcmKeyFormat key_format;
+  key_format.set_key_size(16);
+  AesGcmKey key = ExampleKeyTypeManager().CreateKey(key_format).ValueOrDie();
+  std::unique_ptr<AeadVariant> aead_variant =
+      ExampleKeyTypeManager().GetPrimitive<AeadVariant>(key).ValueOrDie();
+  EXPECT_THAT(aead_variant->get(), Eq(key.key_value()));
+}
+
+TEST(KeyManagerWithoutFactoryTest, CreateFails) {
+  auto failing =
+      ExampleKeyTypeManagerWithoutFactory().GetPrimitive<NotRegistered>(
+          AesGcmKey());
+  EXPECT_THAT(failing.status(), test::StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+}  // namespace
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/core/keyset_handle.cc b/cc/core/keyset_handle.cc
index 9a5b092..b1076fa 100644
--- a/cc/core/keyset_handle.cc
+++ b/cc/core/keyset_handle.cc
@@ -146,6 +146,18 @@
   return writer->Write(*(encrypt_result.ValueOrDie().get()));
 }
 
+util::Status KeysetHandle::WriteNoSecret(KeysetWriter* writer) {
+  if (writer == nullptr) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "Writer must be non-null");
+  }
+
+  util::Status validation = ValidateNoSecret(get_keyset());
+  if (!validation.ok()) return validation;
+
+  return writer->Write(get_keyset());
+}
+
 // static
 util::StatusOr<std::unique_ptr<KeysetHandle>> KeysetHandle::GenerateNew(
     const KeyTemplate& key_template) {
diff --git a/cc/core/keyset_handle_test.cc b/cc/core/keyset_handle_test.cc
index bdc05c3..c40f250 100644
--- a/cc/core/keyset_handle_test.cc
+++ b/cc/core/keyset_handle_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2017 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -14,6 +14,7 @@
 //
 ////////////////////////////////////////////////////////////////////////////////
 
+#include "tink/core/key_manager_impl.h"
 #include "tink/keyset_handle.h"
 
 #include "gtest/gtest.h"
@@ -28,8 +29,8 @@
 #include "tink/json_keyset_writer.h"
 #include "tink/signature/ecdsa_sign_key_manager.h"
 #include "tink/signature/signature_key_templates.h"
-#include "tink/util/keyset_util.h"
 #include "tink/util/protobuf_helper.h"
+#include "tink/util/test_keyset_handle.h"
 #include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
 #include "proto/tink.pb.h"
@@ -37,7 +38,7 @@
 namespace crypto {
 namespace tink {
 
-using crypto::tink::KeysetUtil;
+using crypto::tink::TestKeysetHandle;
 using crypto::tink::test::AddKeyData;
 using crypto::tink::test::AddLegacyKey;
 using crypto::tink::test::AddRawKey;
@@ -45,6 +46,7 @@
 using crypto::tink::test::DummyAead;
 using crypto::tink::test::IsOk;
 using crypto::tink::test::StatusIs;
+using google::crypto::tink::EcdsaKeyFormat;
 using google::crypto::tink::EncryptedKeyset;
 using google::crypto::tink::KeyData;
 using google::crypto::tink::Keyset;
@@ -83,7 +85,7 @@
     EXPECT_TRUE(result.ok()) << result.status();
     auto handle = std::move(result.ValueOrDie());
     EXPECT_EQ(keyset.SerializeAsString(),
-              KeysetUtil::GetKeyset(*handle).SerializeAsString());
+              TestKeysetHandle::GetKeyset(*handle).SerializeAsString());
   }
 
   {  // AEAD does not match the ciphertext
@@ -162,7 +164,7 @@
     EXPECT_TRUE(result.ok()) << result.status();
     auto handle = std::move(result.ValueOrDie());
     EXPECT_EQ(keyset.SerializeAsString(),
-              KeysetUtil::GetKeyset(*handle).SerializeAsString());
+              TestKeysetHandle::GetKeyset(*handle).SerializeAsString());
   }
 
   {  // AEAD does not match the ciphertext
@@ -286,9 +288,9 @@
     auto handle = std::move(handle_result.ValueOrDie());
     auto public_handle_result = handle->GetPublicKeysetHandle();
     ASSERT_TRUE(public_handle_result.ok()) << public_handle_result.status();
-    auto keyset = KeysetUtil::GetKeyset(*handle);
-    auto public_keyset = KeysetUtil::GetKeyset(
-        *(public_handle_result.ValueOrDie()));
+    auto keyset = TestKeysetHandle::GetKeyset(*handle);
+    auto public_keyset =
+        TestKeysetHandle::GetKeyset(*(public_handle_result.ValueOrDie()));
     EXPECT_EQ(keyset.primary_key_id(), public_keyset.primary_key_id());
     EXPECT_EQ(keyset.key_size(), public_keyset.key_size());
     CompareKeyMetadata(keyset.key(0), public_keyset.key(0));
@@ -297,37 +299,33 @@
   }
   { // A keyset with multiple keys.
     EcdsaSignKeyManager key_manager;
-    const KeyFactory& key_factory = key_manager.get_key_factory();
     Keyset keyset;
     int key_count = 3;
 
-    AddTinkKey(EcdsaSignKeyManager::static_key_type(),
+    EcdsaKeyFormat key_format;
+    ASSERT_TRUE(
+        key_format.ParseFromString(SignatureKeyTemplates::EcdsaP256().value()));
+    AddTinkKey(EcdsaSignKeyManager().get_key_type(),
                /* key_id= */ 623628,
-               *(key_factory.NewKey(
-                   SignatureKeyTemplates::EcdsaP256().value()).ValueOrDie()),
-               KeyStatusType::ENABLED,
-               KeyData::ASYMMETRIC_PRIVATE,
-               &keyset);
-    AddLegacyKey(EcdsaSignKeyManager::static_key_type(),
+               key_manager.CreateKey(key_format).ValueOrDie(),
+               KeyStatusType::ENABLED, KeyData::ASYMMETRIC_PRIVATE, &keyset);
+    ASSERT_TRUE(
+        key_format.ParseFromString(SignatureKeyTemplates::EcdsaP384().value()));
+    AddLegacyKey(EcdsaSignKeyManager().get_key_type(),
                  /* key_id= */ 36285,
-                 *(key_factory.NewKey(
-                     SignatureKeyTemplates::EcdsaP384().value()).ValueOrDie()),
-                 KeyStatusType::DISABLED,
-                 KeyData::ASYMMETRIC_PRIVATE,
-                 &keyset);
-    AddRawKey(EcdsaSignKeyManager::static_key_type(),
-              /* key_id= */ 42,
-              *(key_factory.NewKey(
-                  SignatureKeyTemplates::EcdsaP384().value()).ValueOrDie()),
-              KeyStatusType::ENABLED,
-              KeyData::ASYMMETRIC_PRIVATE,
-              &keyset);
+                 key_manager.CreateKey(key_format).ValueOrDie(),
+                 KeyStatusType::DISABLED, KeyData::ASYMMETRIC_PRIVATE, &keyset);
+    ASSERT_TRUE(
+        key_format.ParseFromString(SignatureKeyTemplates::EcdsaP384().value()));
+    AddRawKey(EcdsaSignKeyManager().get_key_type(),
+              /* key_id= */ 42, key_manager.CreateKey(key_format).ValueOrDie(),
+              KeyStatusType::ENABLED, KeyData::ASYMMETRIC_PRIVATE, &keyset);
     keyset.set_primary_key_id(42);
-    auto handle = KeysetUtil::GetKeysetHandle(keyset);
+    auto handle = TestKeysetHandle::GetKeysetHandle(keyset);
     auto public_handle_result = handle->GetPublicKeysetHandle();
     ASSERT_TRUE(public_handle_result.ok()) << public_handle_result.status();
-    auto public_keyset = KeysetUtil::GetKeyset(
-        *(public_handle_result.ValueOrDie()));
+    auto public_keyset =
+        TestKeysetHandle::GetKeyset(*(public_handle_result.ValueOrDie()));
     EXPECT_EQ(keyset.primary_key_id(), public_keyset.primary_key_id());
     EXPECT_EQ(keyset.key_size(), public_keyset.key_size());
     for (int i = 0; i < key_count; i++) {
@@ -351,29 +349,25 @@
                         public_handle_result.status().error_message());
   }
   { // A keyset with multiple keys.
-    EcdsaSignKeyManager key_manager;
-    const KeyFactory& key_factory = key_manager.get_key_factory();
-    AesGcmKeyManager aead_key_manager;
-    const KeyFactory& aead_key_factory = aead_key_manager.get_key_factory();
     Keyset keyset;
 
-    AddTinkKey(EcdsaSignKeyManager::static_key_type(),
+    EcdsaKeyFormat ecdsa_key_format;
+    ASSERT_TRUE(ecdsa_key_format.ParseFromString(
+        SignatureKeyTemplates::EcdsaP256().value()));
+    google::crypto::tink::AesGcmKeyFormat aead_key_format;
+    aead_key_format.set_key_size(16);
+    AddTinkKey(EcdsaSignKeyManager().get_key_type(),
                /* key_id= */ 623628,
-               *(key_factory.NewKey(
-                   SignatureKeyTemplates::EcdsaP256().value()).ValueOrDie()),
-               KeyStatusType::ENABLED,
-               KeyData::ASYMMETRIC_PRIVATE,
-               &keyset);
-    AddLegacyKey(
-        AesGcmKeyManager::static_key_type(),
-        /* key_id= */ 42,
-        *(aead_key_factory.NewKey(AeadKeyTemplates::Aes128Gcm().value())
-              .ValueOrDie()),
-        KeyStatusType::ENABLED,
-        KeyData::ASYMMETRIC_PRIVATE,  // Intentionally wrong setting.
-        &keyset);
+               EcdsaSignKeyManager().CreateKey(ecdsa_key_format).ValueOrDie(),
+               KeyStatusType::ENABLED, KeyData::ASYMMETRIC_PRIVATE, &keyset);
+    AddLegacyKey(AesGcmKeyManager().get_key_type(),
+                 /* key_id= */ 42,
+                 AesGcmKeyManager().CreateKey(aead_key_format).ValueOrDie(),
+                 KeyStatusType::ENABLED,
+                 KeyData::ASYMMETRIC_PRIVATE,  // Intentionally wrong setting.
+                 &keyset);
     keyset.set_primary_key_id(42);
-    auto handle = KeysetUtil::GetKeysetHandle(keyset);
+    auto handle = TestKeysetHandle::GetKeysetHandle(keyset);
     auto public_handle_result = handle->GetPublicKeysetHandle();
     ASSERT_FALSE(public_handle_result.ok());
     EXPECT_PRED_FORMAT2(testing::IsSubstring, "PrivateKeyFactory",
@@ -400,7 +394,7 @@
              KeyStatusType::ENABLED, &keyset);
   keyset.set_primary_key_id(1);
   std::unique_ptr<KeysetHandle> keyset_handle =
-      KeysetUtil::GetKeysetHandle(keyset);
+      TestKeysetHandle::GetKeysetHandle(keyset);
 
   // Check that encryption with the primary can be decrypted with key_data_1.
   auto aead_result = keyset_handle->GetPrimitive<Aead>();
@@ -428,7 +422,7 @@
              KeyStatusType::ENABLED, &keyset);
   keyset.set_primary_key_id(0);
   std::unique_ptr<KeysetHandle> keyset_handle =
-      KeysetUtil::GetKeysetHandle(keyset);
+      TestKeysetHandle::GetKeysetHandle(keyset);
   ASSERT_THAT(keyset_handle->GetPrimitive<Aead>(nullptr).status(),
               test::StatusIs(util::error::INVALID_ARGUMENT));
 }
@@ -445,9 +439,11 @@
           .ok());
   // Without custom key manager it now fails.
   ASSERT_FALSE(handle->GetPrimitive<Aead>().ok());
-  AesGcmKeyManager key_manager;
+  AesGcmKeyManager key_type_manager;
+  std::unique_ptr<KeyManager<Aead>> key_manager =
+      crypto::tink::internal::MakeKeyManager<Aead>(&key_type_manager);
   // With custom key manager it works ok.
-  ASSERT_TRUE(handle->GetPrimitive<Aead>(&key_manager).ok());
+  ASSERT_TRUE(handle->GetPrimitive<Aead>(key_manager.get()).ok());
 }
 
 // Compile time check: ensures that the KeysetHandle can be copied.
@@ -536,6 +532,104 @@
   EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
 }
 
+TEST_F(KeysetHandleTest, WriteNoSecret) {
+  Keyset keyset;
+  Keyset::Key key;
+  AddTinkKey("some key type", 42, key, KeyStatusType::ENABLED,
+             KeyData::ASYMMETRIC_PUBLIC, &keyset);
+  AddRawKey("some other key type", 711, key, KeyStatusType::ENABLED,
+            KeyData::REMOTE, &keyset);
+  keyset.set_primary_key_id(42);
+
+  auto handle = TestKeysetHandle::GetKeysetHandle(keyset);
+
+  std::stringbuf buffer;
+  std::unique_ptr<std::ostream> destination_stream(new std::ostream(&buffer));
+  auto writer =
+      test::DummyKeysetWriter::New(std::move(destination_stream)).ValueOrDie();
+  auto result = handle->WriteNoSecret(writer.get());
+  EXPECT_TRUE(result.ok());
+}
+
+TEST_F(KeysetHandleTest, WriteNoSecretFailForTypeUnknown) {
+  Keyset keyset;
+  Keyset::Key key;
+  AddTinkKey("some key type", 42, key, KeyStatusType::ENABLED,
+             KeyData::UNKNOWN_KEYMATERIAL, &keyset);
+  keyset.set_primary_key_id(42);
+
+  auto handle = TestKeysetHandle::GetKeysetHandle(keyset);
+
+  std::stringbuf buffer;
+  std::unique_ptr<std::ostream> destination_stream(new std::ostream(&buffer));
+  auto writer =
+      test::DummyKeysetWriter::New(std::move(destination_stream)).ValueOrDie();
+  auto result = handle->WriteNoSecret(writer.get());
+  EXPECT_FALSE(result.ok());
+}
+
+TEST_F(KeysetHandleTest, WriteNoSecretFailForTypeSymmetric) {
+  Keyset keyset;
+  Keyset::Key key;
+  AddTinkKey("some key type", 42, key, KeyStatusType::ENABLED,
+             KeyData::SYMMETRIC, &keyset);
+  keyset.set_primary_key_id(42);
+
+  auto handle = TestKeysetHandle::GetKeysetHandle(keyset);
+
+  std::stringbuf buffer;
+  std::unique_ptr<std::ostream> destination_stream(new std::ostream(&buffer));
+  auto writer =
+      test::DummyKeysetWriter::New(std::move(destination_stream)).ValueOrDie();
+  auto result = handle->WriteNoSecret(writer.get());
+  EXPECT_FALSE(result.ok());
+}
+
+TEST_F(KeysetHandleTest, WriteNoSecretFailForTypeAssymmetricPrivate) {
+  Keyset keyset;
+  Keyset::Key key;
+  AddTinkKey("some key type", 42, key, KeyStatusType::ENABLED,
+             KeyData::ASYMMETRIC_PRIVATE, &keyset);
+  keyset.set_primary_key_id(42);
+
+  auto handle = TestKeysetHandle::GetKeysetHandle(keyset);
+
+  std::stringbuf buffer;
+  std::unique_ptr<std::ostream> destination_stream(new std::ostream(&buffer));
+  auto writer =
+      test::DummyKeysetWriter::New(std::move(destination_stream)).ValueOrDie();
+  auto result = handle->WriteNoSecret(writer.get());
+  EXPECT_FALSE(result.ok());
+}
+
+TEST_F(KeysetHandleTest, WriteNoSecretFailForHidden) {
+  Keyset keyset;
+  Keyset::Key key;
+  AddTinkKey("some key type", 42, key, KeyStatusType::ENABLED,
+             KeyData::ASYMMETRIC_PUBLIC, &keyset);
+  for (int i = 0; i < 10; ++i) {
+    AddTinkKey(absl::StrCat("more key type", i), i, key, KeyStatusType::ENABLED,
+               KeyData::ASYMMETRIC_PUBLIC, &keyset);
+  }
+  AddRawKey("some other key type", 10, key, KeyStatusType::ENABLED,
+            KeyData::ASYMMETRIC_PRIVATE, &keyset);
+  for (int i = 0; i < 10; ++i) {
+    AddRawKey(absl::StrCat("more key type", i + 100), i + 100, key,
+              KeyStatusType::ENABLED, KeyData::ASYMMETRIC_PUBLIC, &keyset);
+  }
+
+  keyset.set_primary_key_id(42);
+
+  auto handle = TestKeysetHandle::GetKeysetHandle(keyset);
+
+  std::stringbuf buffer;
+  std::unique_ptr<std::ostream> destination_stream(new std::ostream(&buffer));
+  auto writer =
+      test::DummyKeysetWriter::New(std::move(destination_stream)).ValueOrDie();
+  auto result = handle->WriteNoSecret(writer.get());
+  EXPECT_FALSE(result.ok());
+}
+
 }  // namespace
 }  // namespace tink
 }  // namespace crypto
diff --git a/cc/core/keyset_manager_test.cc b/cc/core/keyset_manager_test.cc
index e94515f..3c99bbf 100644
--- a/cc/core/keyset_manager_test.cc
+++ b/cc/core/keyset_manager_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2017 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -20,11 +20,11 @@
 #include "tink/aead/aes_gcm_key_manager.h"
 #include "tink/config.h"
 #include "tink/keyset_handle.h"
-#include "tink/util/keyset_util.h"
+#include "tink/util/test_keyset_handle.h"
 #include "proto/aes_gcm.pb.h"
 #include "proto/tink.pb.h"
 
-using crypto::tink::KeysetUtil;
+using crypto::tink::TestKeysetHandle;
 
 using google::crypto::tink::AesGcmKeyFormat;
 using google::crypto::tink::KeyData;
@@ -48,7 +48,7 @@
   AesGcmKeyFormat key_format;
   key_format.set_key_size(16);
   KeyTemplate key_template;
-  key_template.set_type_url(AesGcmKeyManager::static_key_type());
+  key_template.set_type_url(AesGcmKeyManager().get_key_type());
   key_template.set_output_prefix_type(OutputPrefixType::TINK);
   key_template.set_value(key_format.SerializeAsString());
 
@@ -59,13 +59,14 @@
   EXPECT_EQ(1, keyset_manager->KeyCount());
 
   // Verify the keyset.
-  auto keyset = KeysetUtil::GetKeyset(*(keyset_manager->GetKeysetHandle()));
+  auto keyset =
+      TestKeysetHandle::GetKeyset(*(keyset_manager->GetKeysetHandle()));
   EXPECT_EQ(1, keyset.key().size());
   auto key_id_0 = keyset.key(0).key_id();
   EXPECT_EQ(key_id_0, keyset.primary_key_id());
   EXPECT_EQ(KeyStatusType::ENABLED, keyset.key(0).status());
   EXPECT_EQ(OutputPrefixType::TINK, keyset.key(0).output_prefix_type());
-  EXPECT_EQ(AesGcmKeyManager::static_key_type(),
+  EXPECT_EQ(AesGcmKeyManager().get_key_type(),
             keyset.key(0).key_data().type_url());
   EXPECT_EQ(KeyData::SYMMETRIC, keyset.key(0).key_data().key_material_type());
 
@@ -75,14 +76,14 @@
   EXPECT_TRUE(add_result.ok()) << add_result.status();
   EXPECT_EQ(2, keyset_manager->KeyCount());
   auto key_id_1 = add_result.ValueOrDie();
-  keyset = KeysetUtil::GetKeyset(*(keyset_manager->GetKeysetHandle()));
+  keyset = TestKeysetHandle::GetKeyset(*(keyset_manager->GetKeysetHandle()));
   EXPECT_EQ(2, keyset.key().size());
   EXPECT_EQ(key_id_0, keyset.primary_key_id());
   EXPECT_FALSE(keyset.key(0).key_data().value() ==
                keyset.key(1).key_data().value());
   EXPECT_EQ(KeyStatusType::ENABLED, keyset.key(1).status());
   EXPECT_EQ(OutputPrefixType::RAW, keyset.key(1).output_prefix_type());
-  EXPECT_EQ(AesGcmKeyManager::static_key_type(),
+  EXPECT_EQ(AesGcmKeyManager().get_key_type(),
             keyset.key(1).key_data().type_url());
   EXPECT_EQ(KeyData::SYMMETRIC, keyset.key(1).key_data().key_material_type());
 
@@ -92,7 +93,7 @@
   EXPECT_TRUE(rotate_result.ok()) << add_result.status();
   EXPECT_EQ(3, keyset_manager->KeyCount());
   auto key_id_2 = rotate_result.ValueOrDie();
-  keyset = KeysetUtil::GetKeyset(*(keyset_manager->GetKeysetHandle()));
+  keyset = TestKeysetHandle::GetKeyset(*(keyset_manager->GetKeysetHandle()));
   EXPECT_EQ(3, keyset.key().size());
   EXPECT_EQ(key_id_2, keyset.primary_key_id());
   EXPECT_FALSE(keyset.key(0).key_data().value() ==
@@ -101,14 +102,14 @@
                keyset.key(2).key_data().value());
   EXPECT_EQ(KeyStatusType::ENABLED, keyset.key(2).status());
   EXPECT_EQ(OutputPrefixType::LEGACY, keyset.key(2).output_prefix_type());
-  EXPECT_EQ(AesGcmKeyManager::static_key_type(),
+  EXPECT_EQ(AesGcmKeyManager().get_key_type(),
             keyset.key(2).key_data().type_url());
   EXPECT_EQ(KeyData::SYMMETRIC, keyset.key(2).key_data().key_material_type());
 
   // Change the primary.
   auto status = keyset_manager->SetPrimary(key_id_1);
   EXPECT_TRUE(status.ok()) << status;
-  keyset = KeysetUtil::GetKeyset(*(keyset_manager->GetKeysetHandle()));
+  keyset = TestKeysetHandle::GetKeyset(*(keyset_manager->GetKeysetHandle()));
   EXPECT_EQ(3, keyset.key().size());
   EXPECT_EQ(3, keyset_manager->KeyCount());
   EXPECT_EQ(key_id_1, keyset.primary_key_id());
@@ -116,7 +117,8 @@
   // Clone a keyset via the manager, and check equality.
   auto keyset_manager_2 = std::move(
       KeysetManager::New(*keyset_manager->GetKeysetHandle()).ValueOrDie());
-  auto keyset_2 = KeysetUtil::GetKeyset(*(keyset_manager_2->GetKeysetHandle()));
+  auto keyset_2 =
+      TestKeysetHandle::GetKeyset(*(keyset_manager_2->GetKeysetHandle()));
   EXPECT_EQ(keyset.SerializeAsString(), keyset_2.SerializeAsString());
 
   // Disable a key, and try to set it as primary.
@@ -124,7 +126,7 @@
   status = keyset_manager->Disable(key_id_2);
   EXPECT_TRUE(status.ok()) << status;
   EXPECT_EQ(3, keyset_manager->KeyCount());
-  keyset = KeysetUtil::GetKeyset(*(keyset_manager->GetKeysetHandle()));
+  keyset = TestKeysetHandle::GetKeyset(*(keyset_manager->GetKeysetHandle()));
   EXPECT_EQ(KeyStatusType::DISABLED, keyset.key(2).status());
 
   status = keyset_manager->SetPrimary(key_id_2);
@@ -132,34 +134,34 @@
   EXPECT_EQ(util::error::INVALID_ARGUMENT, status.error_code());
   EXPECT_PRED_FORMAT2(testing::IsSubstring, "must be ENABLED",
                       status.error_message());
-  keyset = KeysetUtil::GetKeyset(*(keyset_manager->GetKeysetHandle()));
+  keyset = TestKeysetHandle::GetKeyset(*(keyset_manager->GetKeysetHandle()));
   EXPECT_EQ(key_id_1, keyset.primary_key_id());
 
   // Enable ENABLED key, disable a DISABLED one.
   EXPECT_EQ(KeyStatusType::ENABLED, keyset.key(1).status());
   status = keyset_manager->Enable(key_id_1);
   EXPECT_TRUE(status.ok()) << status;
-  keyset = KeysetUtil::GetKeyset(*(keyset_manager->GetKeysetHandle()));
+  keyset = TestKeysetHandle::GetKeyset(*(keyset_manager->GetKeysetHandle()));
   EXPECT_EQ(KeyStatusType::ENABLED, keyset.key(1).status());
 
   EXPECT_EQ(KeyStatusType::DISABLED, keyset.key(2).status());
   status = keyset_manager->Disable(key_id_2);
   EXPECT_TRUE(status.ok()) << status;
-  keyset = KeysetUtil::GetKeyset(*(keyset_manager->GetKeysetHandle()));
+  keyset = TestKeysetHandle::GetKeyset(*(keyset_manager->GetKeysetHandle()));
   EXPECT_EQ(KeyStatusType::DISABLED, keyset.key(2).status());
 
   // Enable the disabled key, then destroy it, and try to re-enable.
   EXPECT_EQ(KeyStatusType::DISABLED, keyset.key(2).status());
   status = keyset_manager->Enable(key_id_2);
   EXPECT_TRUE(status.ok()) << status;
-  keyset = KeysetUtil::GetKeyset(*(keyset_manager->GetKeysetHandle()));
+  keyset = TestKeysetHandle::GetKeyset(*(keyset_manager->GetKeysetHandle()));
   EXPECT_EQ(KeyStatusType::ENABLED, keyset.key(2).status());
   EXPECT_TRUE(keyset.key(2).has_key_data());
 
   status = keyset_manager->Destroy(key_id_2);
   EXPECT_TRUE(status.ok()) << status;
   EXPECT_EQ(3, keyset_manager->KeyCount());
-  keyset = KeysetUtil::GetKeyset(*(keyset_manager->GetKeysetHandle()));
+  keyset = TestKeysetHandle::GetKeyset(*(keyset_manager->GetKeysetHandle()));
   EXPECT_EQ(KeyStatusType::DESTROYED, keyset.key(2).status());
   EXPECT_FALSE(keyset.key(2).has_key_data());
 
@@ -168,7 +170,7 @@
   EXPECT_EQ(util::error::INVALID_ARGUMENT, status.error_code());
   EXPECT_PRED_FORMAT2(testing::IsSubstring, "Cannot enable",
                       status.error_message());
-  keyset = KeysetUtil::GetKeyset(*(keyset_manager->GetKeysetHandle()));
+  keyset = TestKeysetHandle::GetKeyset(*(keyset_manager->GetKeysetHandle()));
   EXPECT_EQ(KeyStatusType::DESTROYED, keyset.key(2).status());
   EXPECT_EQ(key_id_1, keyset.primary_key_id());
 
@@ -176,7 +178,7 @@
   status = keyset_manager->Delete(key_id_2);
   EXPECT_TRUE(status.ok()) << status;
   EXPECT_EQ(2, keyset_manager->KeyCount());
-  keyset = KeysetUtil::GetKeyset(*(keyset_manager->GetKeysetHandle()));
+  keyset = TestKeysetHandle::GetKeyset(*(keyset_manager->GetKeysetHandle()));
 
   EXPECT_EQ(2, keyset.key().size());
 
@@ -191,7 +193,7 @@
                       status.error_message());
 
   // Try disabling/destroying/deleting the primary key.
-  keyset = KeysetUtil::GetKeyset(*(keyset_manager->GetKeysetHandle()));
+  keyset = TestKeysetHandle::GetKeyset(*(keyset_manager->GetKeysetHandle()));
 
   EXPECT_EQ(key_id_1, keyset.primary_key_id());
 
@@ -210,13 +212,13 @@
   EXPECT_PRED_FORMAT2(testing::IsSubstring, "Cannot delete primary",
                       status.error_message());
 
-  keyset = KeysetUtil::GetKeyset(*(keyset_manager->GetKeysetHandle()));
+  keyset = TestKeysetHandle::GetKeyset(*(keyset_manager->GetKeysetHandle()));
   EXPECT_EQ(key_id_1, keyset.primary_key_id());
 
   // Delete the first key, then try to set it as primary.
   status = keyset_manager->Delete(key_id_0);
   EXPECT_TRUE(status.ok()) << status;
-  keyset = KeysetUtil::GetKeyset(*(keyset_manager->GetKeysetHandle()));
+  keyset = TestKeysetHandle::GetKeyset(*(keyset_manager->GetKeysetHandle()));
   EXPECT_EQ(1, keyset.key().size());
   EXPECT_EQ(key_id_1, keyset.key(0).key_id());
 
diff --git a/cc/core/kms_clients.cc b/cc/core/kms_clients.cc
new file mode 100644
index 0000000..29cb94c
--- /dev/null
+++ b/cc/core/kms_clients.cc
@@ -0,0 +1,62 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+#include "tink/kms_clients.h"
+
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "absl/synchronization/mutex.h"
+#include "tink/kms_client.h"
+#include "tink/util/errors.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+
+using crypto::tink::util::Status;
+using crypto::tink::util::StatusOr;
+
+// static
+KmsClients& KmsClients::GlobalInstance() {
+  static KmsClients* instance = new KmsClients();
+  return *instance;
+}
+
+Status KmsClients::LocalAdd(std::unique_ptr<KmsClient> kms_client) {
+  if (kms_client == nullptr) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "kms_client must be non-null.");
+  }
+  absl::MutexLock lock(&clients_mutex_);
+  clients_.push_back(std::move(kms_client));
+  return util::OkStatus();
+}
+
+StatusOr<const KmsClient*> KmsClients::LocalGet(absl::string_view key_uri) {
+  if (key_uri.empty()) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "key_uri must be non-empty.");
+  }
+  absl::MutexLock lock(&clients_mutex_);
+  for (const auto& client : clients_) {
+    if (client->DoesSupport(key_uri)) return client.get();
+  }
+  return ToStatusF(util::error::NOT_FOUND,
+                   "no KmsClient found for key '%s'.",
+                   std::string(key_uri).c_str());
+}
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/core/kms_clients_test.cc b/cc/core/kms_clients_test.cc
new file mode 100644
index 0000000..d1802e3
--- /dev/null
+++ b/cc/core/kms_clients_test.cc
@@ -0,0 +1,106 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "absl/strings/string_view.h"
+#include "tink/aead.h"
+#include "tink/kms_clients.h"
+#include "tink/kms_client.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/test_util.h"
+#include "tink/util/test_matchers.h"
+#include "gtest/gtest.h"
+
+namespace crypto {
+namespace tink {
+namespace {
+
+using crypto::tink::test::IsOk;
+using crypto::tink::test::StatusIs;
+using crypto::tink::test::DummyKmsClient;
+
+TEST(KmsClientsTest, Empty) {
+  auto client_result = KmsClients::Get("some uri");
+  EXPECT_THAT(client_result.status(), StatusIs(util::error::NOT_FOUND));
+
+  client_result = KmsClients::Get("");
+  EXPECT_THAT(client_result.status(), StatusIs(util::error::INVALID_ARGUMENT));
+
+  auto status = KmsClients::Add(nullptr);
+  EXPECT_THAT(status, StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+struct UriData {
+  std::string prefix;
+  std::string uri;
+};
+
+TEST(KmsClientsTest, AddAndGet) {
+  UriData data_1 = {"prefix1", "prefix1:uri1"};
+  UriData data_2 = {"prefix1", "prefix1:uri2"};
+  UriData data_3 = {"prefix2", "prefix2:uri42"};
+
+  // Add client for data_1, and verify it.
+  auto status = KmsClients::Add(
+      absl::make_unique<DummyKmsClient>(data_1.prefix, data_1.uri));
+  EXPECT_THAT(status, IsOk());
+  auto client_result = KmsClients::Get(data_1.uri);
+  EXPECT_THAT(client_result.status(), IsOk());
+  EXPECT_TRUE(client_result.ValueOrDie()->DoesSupport(data_1.uri));
+  EXPECT_FALSE(client_result.ValueOrDie()->DoesSupport(data_2.uri));
+
+  // Verify there is no client for data_2.
+  client_result = KmsClients::Get(data_2.uri);
+  EXPECT_THAT(client_result.status(), StatusIs(util::error::NOT_FOUND));
+
+  // Add client for data_2, and verify it.
+  status = KmsClients::Add(
+      absl::make_unique<DummyKmsClient>(data_2.prefix, data_2.uri));
+  EXPECT_THAT(status, IsOk());
+  client_result = KmsClients::Get(data_2.uri);
+  EXPECT_THAT(client_result.status(), IsOk());
+  EXPECT_TRUE(client_result.ValueOrDie()->DoesSupport(data_2.uri));
+  EXPECT_FALSE(client_result.ValueOrDie()->DoesSupport(data_1.uri));
+
+
+  // Verify there is no client for data_3.
+  client_result = KmsClients::Get(data_3.uri);
+  EXPECT_THAT(client_result.status(), StatusIs(util::error::NOT_FOUND));
+
+  // Add client for data_3, and verify it.
+  status = KmsClients::Add(
+      absl::make_unique<DummyKmsClient>(data_3.prefix, data_3.uri));
+  EXPECT_THAT(status, IsOk());
+  client_result = KmsClients::Get(data_3.uri);
+  EXPECT_THAT(client_result.status(), IsOk());
+  EXPECT_TRUE(client_result.ValueOrDie()->DoesSupport(data_3.uri));
+  EXPECT_FALSE(client_result.ValueOrDie()->DoesSupport(data_2.uri));
+  EXPECT_FALSE(client_result.ValueOrDie()->DoesSupport(data_1.uri));
+
+  // Verify that clients for data_1 and data_2 are still present.
+  client_result = KmsClients::Get(data_1.uri);
+  EXPECT_THAT(client_result.status(), IsOk());
+  EXPECT_TRUE(client_result.ValueOrDie()->DoesSupport(data_1.uri));
+  EXPECT_FALSE(client_result.ValueOrDie()->DoesSupport(data_2.uri));
+
+  client_result = KmsClients::Get(data_2.uri);
+  EXPECT_THAT(client_result.status(), IsOk());
+  EXPECT_TRUE(client_result.ValueOrDie()->DoesSupport(data_2.uri));
+  EXPECT_FALSE(client_result.ValueOrDie()->DoesSupport(data_1.uri));
+}
+
+
+}  // namespace
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/core/primitive_set_test.cc b/cc/core/primitive_set_test.cc
index 391800b..b2d82d0 100644
--- a/cc/core/primitive_set_test.cc
+++ b/cc/core/primitive_set_test.cc
@@ -14,20 +14,22 @@
 //
 ////////////////////////////////////////////////////////////////////////////////
 
+#include "tink/primitive_set.h"
+
 #include <thread>  // NOLINT(build/c++11)
 
-#include "tink/primitive_set.h"
+#include "gtest/gtest.h"
 #include "tink/crypto_format.h"
 #include "tink/mac.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
-#include "gtest/gtest.h"
 #include "proto/tink.pb.h"
 
-using crypto::tink::test::DummyMac;
-using google::crypto::tink::Keyset;
-using google::crypto::tink::KeyStatusType;
-using google::crypto::tink::OutputPrefixType;
-
+using ::crypto::tink::test::DummyMac;
+using ::google::crypto::tink::Keyset;
+using ::google::crypto::tink::KeyStatusType;
+using ::google::crypto::tink::OutputPrefixType;
+using ::crypto::tink::test::IsOk;
 
 namespace crypto {
 namespace tink {
@@ -145,13 +147,13 @@
   Keyset::Key key_5;
   key_5.set_output_prefix_type(OutputPrefixType::RAW);
   key_5.set_key_id(key_id_5);
-  key_5.set_status(KeyStatusType::DISABLED);
+  key_5.set_status(KeyStatusType::ENABLED);
 
   uint32_t key_id_6 = key_id_1;    // same id as key_1
   Keyset::Key key_6;
   key_6.set_output_prefix_type(OutputPrefixType::TINK);
   key_6.set_key_id(key_id_6);
-  key_6.set_status(KeyStatusType::DISABLED);
+  key_6.set_status(KeyStatusType::ENABLED);
 
   PrimitiveSet<Mac> primitive_set;
   EXPECT_TRUE(primitive_set.get_primary() == nullptr);
@@ -170,7 +172,8 @@
 
   add_primitive_result = primitive_set.AddPrimitive(std::move(mac_3), key_3);
   EXPECT_TRUE(add_primitive_result.ok()) << add_primitive_result.status();
-  primitive_set.set_primary(add_primitive_result.ValueOrDie());
+  EXPECT_THAT(primitive_set.set_primary(add_primitive_result.ValueOrDie()),
+              IsOk());
 
   add_primitive_result = primitive_set.AddPrimitive(std::move(mac_4), key_4);
   EXPECT_TRUE(add_primitive_result.ok()) << add_primitive_result.status();
@@ -207,7 +210,7 @@
     EXPECT_EQ(OutputPrefixType::RAW, primitives[0]->get_output_prefix_type());
     EXPECT_EQ(DummyMac(mac_name_5).ComputeMac(data).ValueOrDie(),
               primitives[1]->get_primitive().ComputeMac(data).ValueOrDie());
-    EXPECT_EQ(KeyStatusType::DISABLED, primitives[1]->get_status());
+    EXPECT_EQ(KeyStatusType::ENABLED, primitives[1]->get_status());
     EXPECT_EQ(OutputPrefixType::RAW, primitives[1]->get_output_prefix_type());
   }
 
@@ -221,7 +224,7 @@
     EXPECT_EQ(OutputPrefixType::TINK, primitives[0]->get_output_prefix_type());
     EXPECT_EQ(DummyMac(mac_name_6).ComputeMac(data).ValueOrDie(),
               primitives[1]->get_primitive().ComputeMac(data).ValueOrDie());
-    EXPECT_EQ(KeyStatusType::DISABLED, primitives[1]->get_status());
+    EXPECT_EQ(KeyStatusType::ENABLED, primitives[1]->get_status());
     EXPECT_EQ(OutputPrefixType::TINK, primitives[1]->get_output_prefix_type());
   }
 
@@ -273,7 +276,8 @@
     auto add_primitive_result =
         primitive_set.AddPrimitive(std::move(mac_1), key_1);
     EXPECT_TRUE(add_primitive_result.ok()) << add_primitive_result.status();
-    primitive_set.set_primary(add_primitive_result.ValueOrDie());
+    ASSERT_THAT(primitive_set.set_primary(add_primitive_result.ValueOrDie()),
+                IsOk());
 
     std::string identifier = "";
     const auto& primitives =
@@ -300,7 +304,8 @@
     auto add_primitive_result =
         primitive_set.AddPrimitive(std::move(mac_1), key_1);
     EXPECT_TRUE(add_primitive_result.ok()) << add_primitive_result.status();
-    primitive_set.set_primary(add_primitive_result.ValueOrDie());
+    ASSERT_THAT(primitive_set.set_primary(add_primitive_result.ValueOrDie()),
+                IsOk());
 
     std::string identifier = CryptoFormat::get_output_prefix(key_1).ValueOrDie();
     const auto& primitives =
@@ -327,7 +332,8 @@
     auto add_primitive_result =
         primitive_set.AddPrimitive(std::move(mac_1), key_1);
     EXPECT_TRUE(add_primitive_result.ok()) << add_primitive_result.status();
-    primitive_set.set_primary(add_primitive_result.ValueOrDie());
+    ASSERT_THAT(primitive_set.set_primary(add_primitive_result.ValueOrDie()),
+                IsOk());
 
     std::string identifier = CryptoFormat::get_output_prefix(key_1).ValueOrDie();
     const auto& primitives =
@@ -343,6 +349,22 @@
   }
 }
 
+TEST_F(PrimitiveSetTest, DisabledKey) {
+  std::string mac_name_1 = "MAC#1";
+  std::unique_ptr<Mac> mac_1(new DummyMac(mac_name_1));
+
+  uint32_t key_id_1 = 1234543;
+  Keyset::Key key_1;
+  key_1.set_output_prefix_type(OutputPrefixType::TINK);
+  key_1.set_key_id(key_id_1);
+  key_1.set_status(KeyStatusType::DISABLED);
+
+  PrimitiveSet<Mac> primitive_set;
+  // Add all the primitives.
+  auto add_primitive_result =
+      primitive_set.AddPrimitive(std::move(mac_1), key_1);
+  EXPECT_FALSE(add_primitive_result.ok());
+}
 
 }  // namespace
 }  // namespace tink
diff --git a/cc/core/private_key_manager_impl.h b/cc/core/private_key_manager_impl.h
new file mode 100644
index 0000000..fb97205
--- /dev/null
+++ b/cc/core/private_key_manager_impl.h
@@ -0,0 +1,167 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+#ifndef TINK_CORE_PRIVATE_KEY_MANAGER_IMPL_H_
+#define TINK_CORE_PRIVATE_KEY_MANAGER_IMPL_H_
+
+#include "tink/core/key_manager_impl.h"
+#include "tink/core/private_key_type_manager.h"
+#include "tink/key_manager.h"
+#include "tink/util/validation.h"
+namespace crypto {
+namespace tink {
+namespace internal {
+
+// An implementation of a PrivateKeyFactory given a corresponding internal
+// private key manager and an internal (public) key manager.
+// The template arguments PrivatePrimitivesList and PublicPrimitivesList should
+// be of type List<Primitives...>. The assumption is that the given pointers in
+// the constructor are of type
+//   PrivateKeyTypeManager<PrivateKeyProto, PrivateKeyFormatProto,
+//                             PublicKeyProto, PrivatePrimitivesList>
+// and
+//   KeyTypeManager<PublicKeyProto, void, PublicPrimitivesList>.
+template <class PrivateKeyProto, class PrivateKeyFormatProto,
+          class PublicKeyProto, class PrivatePrimitivesList,
+          class PublicPrimitivesList>
+class PrivateKeyFactoryImpl : public PrivateKeyFactory {
+ public:
+  PrivateKeyFactoryImpl(
+      PrivateKeyTypeManager<PrivateKeyProto, PrivateKeyFormatProto,
+                            PublicKeyProto, PrivatePrimitivesList>*
+          private_key_manager,
+      KeyTypeManager<PublicKeyProto, void, PublicPrimitivesList>*
+          public_key_manager)
+      : key_factory_impl_(private_key_manager),
+        private_key_manager_(private_key_manager),
+        public_key_type_(public_key_manager->get_key_type()),
+        public_key_material_type_(public_key_manager->key_material_type()) {}
+
+  crypto::tink::util::StatusOr<std::unique_ptr<portable_proto::MessageLite>>
+  NewKey(const portable_proto::MessageLite& key_format) const override {
+    return key_factory_impl_.NewKey(key_format);
+  }
+
+  crypto::tink::util::StatusOr<std::unique_ptr<portable_proto::MessageLite>>
+  NewKey(absl::string_view serialized_key_format) const override {
+    return key_factory_impl_.NewKey(serialized_key_format);
+  }
+
+  crypto::tink::util::StatusOr<std::unique_ptr<google::crypto::tink::KeyData>>
+  NewKeyData(absl::string_view serialized_key_format) const override {
+    return key_factory_impl_.NewKeyData(serialized_key_format);
+  }
+
+  crypto::tink::util::StatusOr<std::unique_ptr<google::crypto::tink::KeyData>>
+  GetPublicKeyData(absl::string_view serialized_private_key) const override {
+    PrivateKeyProto private_key;
+    if (!private_key.ParseFromString(std::string(serialized_private_key))) {
+      return crypto::tink::util::Status(
+          util::error::INVALID_ARGUMENT,
+          absl::StrCat("Could not parse the passed string as proto '",
+                       PrivateKeyProto().GetTypeName(), "'."));
+    }
+    auto validation = private_key_manager_->ValidateKey(private_key);
+    if (!validation.ok()) return validation;
+    auto key_data = absl::make_unique<google::crypto::tink::KeyData>();
+    util::StatusOr<PublicKeyProto> public_key_result =
+        private_key_manager_->GetPublicKey(private_key);
+    if (!public_key_result.ok()) return public_key_result.status();
+    key_data->set_type_url(public_key_type_);
+    key_data->set_value(public_key_result.ValueOrDie().SerializeAsString());
+    key_data->set_key_material_type(public_key_material_type_);
+    return std::move(key_data);
+  }
+
+ private:
+  // We create a key_factory_impl_ as a member, instead of using virtual
+  // inheritance to have it as a sub class. This means we have to forward the
+  // calls to NewKeyData as above, but developers do not have to know about
+  // virtual inheritance.
+  KeyFactoryImpl<KeyTypeManager<PrivateKeyProto, PrivateKeyFormatProto,
+                                PrivatePrimitivesList>>
+      key_factory_impl_;
+  PrivateKeyTypeManager<PrivateKeyProto, PrivateKeyFormatProto, PublicKeyProto,
+                        PrivatePrimitivesList>* private_key_manager_;
+  const std::string public_key_type_;
+  google::crypto::tink::KeyData::KeyMaterialType public_key_material_type_;
+};
+
+template <class Primitive, class PrivateKeyTypeManager,
+          class PublicKeyTypeManager>
+class PrivateKeyManagerImpl;
+
+template <class Primitive, class PrivateKeyProto, class KeyFormatProto,
+          class PublicKeyProto, class PrivatePrimitivesList,
+          class PublicPrimitivesList>
+class PrivateKeyManagerImpl<
+    Primitive,
+    PrivateKeyTypeManager<PrivateKeyProto, KeyFormatProto, PublicKeyProto,
+                          PrivatePrimitivesList>,
+    KeyTypeManager<PublicKeyProto, void, PublicPrimitivesList>>
+    : public KeyManagerImpl<Primitive,
+                            KeyTypeManager<PrivateKeyProto, KeyFormatProto,
+                                           PrivatePrimitivesList>> {
+ public:
+  explicit PrivateKeyManagerImpl(
+      PrivateKeyTypeManager<PrivateKeyProto, KeyFormatProto, PublicKeyProto,
+                            PrivatePrimitivesList>* private_key_manager,
+      KeyTypeManager<PublicKeyProto, void, PublicPrimitivesList>*
+          public_key_manager)
+      : KeyManagerImpl<Primitive,
+                       KeyTypeManager<PrivateKeyProto, KeyFormatProto,
+                                      PrivatePrimitivesList>>(
+            private_key_manager),
+        private_key_factory_(private_key_manager, public_key_manager) {}
+
+  const PrivateKeyFactory& get_key_factory() const override {
+    return private_key_factory_;
+  }
+
+ private:
+  const PrivateKeyFactoryImpl<PrivateKeyProto, KeyFormatProto, PublicKeyProto,
+                              PrivatePrimitivesList, PublicPrimitivesList>
+      private_key_factory_;
+};
+
+// Helper function to create a KeyManager<Primitive> for a
+// PrivateKeyTypeManager. Using this, all template arguments except the
+// first one can be infered. Example:
+//   std::unique_ptr<KeyManager<PublicKeySign>> km =
+//     MakePrivateKeyManager<PublicKeySign>(internal_private_km,
+//                                          internal_public_km);
+//
+// When creating a KeyManager like this, the passed in "private_key_manager"
+// must outlive the constructed KeyManager. The passed in "public_key_manager"
+// however must only be valid during construction of the KeyManager.
+template <class Primitive, class PrivateKeyProto, class KeyFormatProto,
+          class PublicKeyProto, class PrivatePrimitivesList,
+          class PublicPrimitivesList>
+std::unique_ptr<KeyManager<Primitive>> MakePrivateKeyManager(
+    PrivateKeyTypeManager<PrivateKeyProto, KeyFormatProto, PublicKeyProto,
+                          PrivatePrimitivesList>* private_key_manager,
+    KeyTypeManager<PublicKeyProto, void, PublicPrimitivesList>*
+        public_key_manager) {
+  return absl::make_unique<PrivateKeyManagerImpl<
+      Primitive,
+      PrivateKeyTypeManager<PrivateKeyProto, KeyFormatProto, PublicKeyProto,
+                            PrivatePrimitivesList>,
+      KeyTypeManager<PublicKeyProto, void, PublicPrimitivesList>>>(
+      private_key_manager, public_key_manager);
+}
+
+}  // namespace internal
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_CORE_PRIVATE_KEY_MANAGER_IMPL_H_
diff --git a/cc/core/private_key_manager_impl_test.cc b/cc/core/private_key_manager_impl_test.cc
new file mode 100644
index 0000000..b1f5ed6
--- /dev/null
+++ b/cc/core/private_key_manager_impl_test.cc
@@ -0,0 +1,210 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+#include "tink/core/private_key_manager_impl.h"
+
+#include <string>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "tink/core/key_manager_impl.h"
+#include "tink/core/private_key_type_manager.h"
+#include "tink/registry.h"
+#include "tink/subtle/aes_gcm_boringssl.h"
+#include "tink/subtle/random.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/test_matchers.h"
+#include "tink/util/test_util.h"
+#include "tink/util/validation.h"
+#include "proto/ecdsa.pb.h"
+
+namespace crypto {
+namespace tink {
+namespace internal {
+namespace {
+
+using ::crypto::tink::test::StatusIs;
+using ::google::crypto::tink::EcdsaKeyFormat;
+using ::google::crypto::tink::EcdsaPrivateKey;
+using ::google::crypto::tink::EcdsaPublicKey;
+using ::google::crypto::tink::EcdsaSignatureEncoding;
+using ::google::crypto::tink::KeyData;
+using ::testing::Eq;
+using ::testing::HasSubstr;
+using ::testing::Return;
+
+// Placeholders for the primitives. We don't really want to test anything with
+// these except that things compile and List<PrivatePrimitive> is never confused
+// with List<PublicPrimitive> in private_key_manager_impl.
+class PrivatePrimitive {};
+class PublicPrimitive {};
+
+class ExamplePrivateKeyTypeManager
+    : public PrivateKeyTypeManager<EcdsaPrivateKey, EcdsaKeyFormat,
+                                   EcdsaPublicKey, List<PrivatePrimitive>> {
+ public:
+  class PrivatePrimitiveFactory : public PrimitiveFactory<PrivatePrimitive> {
+   public:
+    crypto::tink::util::StatusOr<std::unique_ptr<PrivatePrimitive>> Create(
+        const EcdsaPrivateKey& key) const override {
+      return util::Status(util::error::UNIMPLEMENTED, "Not implemented");
+    }
+  };
+
+  ExamplePrivateKeyTypeManager()
+      : PrivateKeyTypeManager(absl::make_unique<PrivatePrimitiveFactory>()) {}
+
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::ASYMMETRIC_PRIVATE;
+  }
+
+  MOCK_CONST_METHOD0(get_version, uint32_t());
+
+  // We mock out ValidateKey and ValidateKeyFormat so that we can easily test
+  // proper behavior in case they return an error.
+  MOCK_CONST_METHOD1(ValidateKey,
+                     crypto::tink::util::Status(const EcdsaPrivateKey& key));
+  MOCK_CONST_METHOD1(ValidateKeyFormat,
+                     crypto::tink::util::Status(const EcdsaKeyFormat& key));
+
+  const std::string& get_key_type() const override { return kKeyType; }
+
+  crypto::tink::util::StatusOr<EcdsaPrivateKey> CreateKey(
+      const EcdsaKeyFormat& key_format) const override {
+    EcdsaPublicKey public_key;
+    *public_key.mutable_params() = key_format.params();
+    EcdsaPrivateKey result;
+    *result.mutable_public_key() = public_key;
+    return result;
+  }
+
+  crypto::tink::util::StatusOr<EcdsaPublicKey> GetPublicKey(
+      const EcdsaPrivateKey& private_key) const override {
+    return private_key.public_key();
+  }
+
+ private:
+  const std::string kKeyType =
+      "type.googleapis.com/google.crypto.tink.EcdsaPublicKey";
+};
+
+class TestPublicKeyTypeManager
+    : public KeyTypeManager<EcdsaPublicKey, void, List<PublicPrimitive>> {
+ public:
+  class PublicPrimitiveFactory : public PrimitiveFactory<PublicPrimitive> {
+   public:
+    crypto::tink::util::StatusOr<std::unique_ptr<PublicPrimitive>> Create(
+        const EcdsaPublicKey& key) const override {
+      return util::Status(util::error::UNIMPLEMENTED, "Not implemented");
+    }
+  };
+
+  TestPublicKeyTypeManager()
+      : KeyTypeManager(absl::make_unique<PublicPrimitiveFactory>()) {}
+
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::ASYMMETRIC_PRIVATE;
+  }
+
+  MOCK_CONST_METHOD0(get_version, uint32_t());
+
+  // We mock out ValidateKey and ValidateKeyFormat so that we can easily test
+  // proper behavior in case they return an error.
+  MOCK_CONST_METHOD1(ValidateKey,
+                     crypto::tink::util::Status(const EcdsaPublicKey& key));
+
+  const std::string& get_key_type() const override { return kKeyType; }
+
+ private:
+  const std::string kKeyType =
+      "type.googleapis.com/google.crypto.tink.EcdsaPublicKey";
+};
+
+TEST(PrivateKeyManagerImplTest, FactoryNewKeyFromMessage) {
+  ExamplePrivateKeyTypeManager private_km;
+  TestPublicKeyTypeManager public_km;
+  std::unique_ptr<KeyManager<PrivatePrimitive>> key_manager =
+      MakePrivateKeyManager<PrivatePrimitive>(&private_km, &public_km);
+
+  EcdsaKeyFormat key_format;
+  key_format.mutable_params()->set_encoding(EcdsaSignatureEncoding::DER);
+  auto key = key_manager->get_key_factory().NewKey(key_format).ValueOrDie();
+  EXPECT_THAT(
+      dynamic_cast<EcdsaPrivateKey&>(*key).public_key().params().encoding(),
+      Eq(EcdsaSignatureEncoding::DER));
+}
+
+TEST(PrivateKeyManagerImplTest, GetPublicKeyData) {
+  ExamplePrivateKeyTypeManager private_km;
+  TestPublicKeyTypeManager public_km;
+  std::unique_ptr<KeyManager<PrivatePrimitive>> key_manager =
+      MakePrivateKeyManager<PrivatePrimitive>(&private_km, &public_km);
+
+  EcdsaPrivateKey private_key;
+  private_key.mutable_public_key()->mutable_params()->set_encoding(
+      EcdsaSignatureEncoding::DER);
+
+  auto key_data =
+      dynamic_cast<const PrivateKeyFactory&>(key_manager->get_key_factory())
+          .GetPublicKeyData(private_key.SerializeAsString())
+          .ValueOrDie();
+  ASSERT_THAT(key_data->type_url(), Eq(public_km.get_key_type()));
+  EcdsaPublicKey public_key;
+  public_key.ParseFromString(key_data->value());
+  EXPECT_THAT(public_key.params().encoding(), Eq(EcdsaSignatureEncoding::DER));
+}
+
+TEST(PrivateKeyManagerImplTest, GetPublicKeyDataValidatePrivateKey) {
+  ExamplePrivateKeyTypeManager private_km;
+  TestPublicKeyTypeManager public_km;
+  EXPECT_CALL(private_km, ValidateKey)
+      .WillOnce(Return(ToStatusF(util::error::OUT_OF_RANGE,
+                                 "GetPublicKeyDataValidatePrivateKey")));
+
+  std::unique_ptr<KeyManager<PrivatePrimitive>> key_manager =
+      MakePrivateKeyManager<PrivatePrimitive>(&private_km, &public_km);
+
+  EXPECT_THAT(
+      dynamic_cast<const PrivateKeyFactory&>(key_manager->get_key_factory())
+          .GetPublicKeyData(EcdsaPrivateKey().SerializeAsString())
+          .status(),
+      StatusIs(util::error::OUT_OF_RANGE,
+               HasSubstr("GetPublicKeyDataValidatePrivateKey")));
+}
+
+TEST(PrivateKeyManagerImplTest, PublicKeyManagerCanHaveShortLifetime) {
+  ExamplePrivateKeyTypeManager private_km;
+  std::unique_ptr<KeyManager<PrivatePrimitive>> key_manager;
+  {
+    TestPublicKeyTypeManager public_km;
+    key_manager =
+        MakePrivateKeyManager<PrivatePrimitive>(&private_km, &public_km);
+    // Let the public_km go out of scope; the key_manager should still work.
+  }
+
+  EcdsaKeyFormat key_format;
+  key_format.mutable_params()->set_encoding(EcdsaSignatureEncoding::DER);
+  auto key = key_manager->get_key_factory().NewKey(key_format).ValueOrDie();
+  EXPECT_THAT(
+      dynamic_cast<EcdsaPrivateKey&>(*key).public_key().params().encoding(),
+      Eq(EcdsaSignatureEncoding::DER));
+}
+
+}  // namespace
+
+}  // namespace internal
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/core/private_key_type_manager.h b/cc/core/private_key_type_manager.h
new file mode 100644
index 0000000..4a4f60a
--- /dev/null
+++ b/cc/core/private_key_type_manager.h
@@ -0,0 +1,55 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+#ifndef TINK_CORE_PRIVATE_KEY_TYPE_MANAGER_H_
+#define TINK_CORE_PRIVATE_KEY_TYPE_MANAGER_H_
+
+#include <memory>
+
+#include "tink/core/key_type_manager.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+
+template <typename KeyProto, typename KeyFormatProto, typename PublicKeyProto,
+          typename... Primitives>
+class PrivateKeyTypeManager;
+
+// A PrivateKeyTypeManager is an extension of KeyTypeManager. One
+// should implement this in case there is a public key corresponding to the
+// private key managed by this manager.
+// Hence, in addition to the tasks a KeyTypeManager does, in order to
+// implement a PrivateKeyTypeManager one needs to provide a function
+// StatusOr<PublicKeyProto> GetPublicKey(const KeyProto& private_key) const = 0;
+template <typename KeyProto, typename KeyFormatProto, typename PublicKeyProto,
+          typename... Primitives>
+class PrivateKeyTypeManager<KeyProto, KeyFormatProto, PublicKeyProto,
+                            List<Primitives...>>
+    : public KeyTypeManager<KeyProto, KeyFormatProto, List<Primitives...>> {
+ public:
+  explicit PrivateKeyTypeManager(
+      std::unique_ptr<typename KeyTypeManager<KeyProto, KeyFormatProto,
+                                              List<Primitives...>>::
+                          template PrimitiveFactory<Primitives>>... primitives)
+      : KeyTypeManager<KeyProto, KeyFormatProto, List<Primitives...>>(
+            std::move(primitives)...) {}
+
+  virtual crypto::tink::util::StatusOr<PublicKeyProto> GetPublicKey(
+      const KeyProto& private_key) const = 0;
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_CORE_PRIVATE_KEY_TYPE_MANAGER_H_
diff --git a/cc/core/registry_impl.cc b/cc/core/registry_impl.cc
index bbdebdb..c1ec40d 100644
--- a/cc/core/registry_impl.cc
+++ b/cc/core/registry_impl.cc
@@ -36,13 +36,13 @@
                      "No manager for type '%s' has been registered.",
                      type_url.c_str());
   }
-  if (!it->second.new_key_allowed) {
+  if (!it->second.new_key_allowed()) {
     return ToStatusF(util::error::INVALID_ARGUMENT,
                      "KeyManager for type '%s' does not allow "
                      "for creation of new keys.",
                      type_url.c_str());
   }
-  return it->second.key_factory.NewKeyData(key_template.value());
+  return it->second.key_factory().NewKeyData(key_template.value());
 }
 
 StatusOr<std::unique_ptr<KeyData>> RegistryImpl::GetPublicKeyData(
@@ -54,7 +54,7 @@
                      type_url.c_str());
   }
   auto factory =
-      dynamic_cast<const PrivateKeyFactory*>(&it->second.key_factory);
+      dynamic_cast<const PrivateKeyFactory*>(&it->second.key_factory());
   if (factory == nullptr) {
     return ToStatusF(util::error::INVALID_ARGUMENT,
                      "KeyManager for type '%s' does not have "
@@ -64,6 +64,28 @@
   return result;
 }
 
+crypto::tink::util::Status RegistryImpl::CheckInsertable(
+    const std::string& type_url, const std::type_index& key_manager_type_index,
+    bool new_key_allowed) const {
+  auto it = type_url_to_info_.find(type_url);
+
+  if (it == type_url_to_info_.end()) {
+    return crypto::tink::util::Status::OK;
+  }
+  if (it->second.key_manager_type_index() != key_manager_type_index) {
+    return ToStatusF(crypto::tink::util::error::ALREADY_EXISTS,
+                     "A manager for type '%s' has been already registered.",
+                     type_url.c_str());
+  }
+  if (!it->second.new_key_allowed() && new_key_allowed) {
+    return ToStatusF(crypto::tink::util::error::ALREADY_EXISTS,
+                     "A manager for type '%s' has been already registered "
+                     "with forbidden new key operation.",
+                     type_url.c_str());
+  }
+  return crypto::tink::util::Status::OK;
+}
+
 void RegistryImpl::Reset() {
   absl::MutexLock lock(&maps_mutex_);
   type_url_to_info_.clear();
diff --git a/cc/core/registry_impl.h b/cc/core/registry_impl.h
index 2cb4c8a..d6c218b 100644
--- a/cc/core/registry_impl.h
+++ b/cc/core/registry_impl.h
@@ -16,14 +16,20 @@
 #ifndef TINK_CORE_REGISTRY_IMPL_H_
 #define TINK_CORE_REGISTRY_IMPL_H_
 
+#include <algorithm>
+#include <typeindex>
 #include <typeinfo>
 #include <unordered_map>
 
 #include "absl/base/thread_annotations.h"
 #include "absl/strings/str_cat.h"
+#include "absl/strings/str_join.h"
 #include "absl/synchronization/mutex.h"
 #include "tink/catalogue.h"
-#include "tink/core/registry_impl.h"
+#include "tink/core/key_manager_impl.h"
+#include "tink/core/key_type_manager.h"
+#include "tink/core/private_key_manager_impl.h"
+#include "tink/core/private_key_type_manager.h"
 #include "tink/key_manager.h"
 #include "tink/primitive_set.h"
 #include "tink/primitive_wrapper.h"
@@ -43,132 +49,273 @@
     return *instance;
   }
 
+  RegistryImpl() = default;
+  RegistryImpl(const RegistryImpl&) = delete;
+  RegistryImpl& operator=(const RegistryImpl&) = delete;
+
   template <class P>
   crypto::tink::util::StatusOr<const Catalogue<P>*> get_catalogue(
-      const std::string& catalogue_name) const LOCKS_EXCLUDED(maps_mutex_);
+      const std::string& catalogue_name) const ABSL_LOCKS_EXCLUDED(maps_mutex_);
 
   template <class P>
   crypto::tink::util::Status AddCatalogue(const std::string& catalogue_name,
                                           Catalogue<P>* catalogue)
-      LOCKS_EXCLUDED(maps_mutex_);
+      ABSL_LOCKS_EXCLUDED(maps_mutex_);
 
   // Registers the given 'manager' for the key type 'manager->get_key_type()'.
   // Takes ownership of 'manager', which must be non-nullptr.
   template <class P>
   crypto::tink::util::Status RegisterKeyManager(KeyManager<P>* manager,
                                                 bool new_key_allowed)
-      LOCKS_EXCLUDED(maps_mutex_);
+      ABSL_LOCKS_EXCLUDED(maps_mutex_);
 
+  // Takes ownership of 'manager', which must be non-nullptr.
   template <class P>
   crypto::tink::util::Status RegisterKeyManager(KeyManager<P>* manager)
-      LOCKS_EXCLUDED(maps_mutex_) {
+      ABSL_LOCKS_EXCLUDED(maps_mutex_) {
     return RegisterKeyManager(manager, /* new_key_allowed= */ true);
   }
 
+  // Takes ownership of 'manager', which must be non-nullptr.
+  template <class KeyProto, class KeyFormatProto, class PrimitiveList>
+  crypto::tink::util::Status RegisterKeyTypeManager(
+      std::unique_ptr<KeyTypeManager<KeyProto, KeyFormatProto, PrimitiveList>>
+          manager,
+      bool new_key_allowed) ABSL_LOCKS_EXCLUDED(maps_mutex_);
+
+  // Takes ownership of 'private_key_manager' and 'public_key_manager'. Both
+  // must be non-nullptr.
+  template <class PrivateKeyProto, class KeyFormatProto, class PublicKeyProto,
+            class PrivatePrimitivesList, class PublicPrimitivesList>
+  crypto::tink::util::Status RegisterAsymmetricKeyManagers(
+      PrivateKeyTypeManager<PrivateKeyProto, KeyFormatProto, PublicKeyProto,
+                            PrivatePrimitivesList>* private_key_manager,
+      KeyTypeManager<PublicKeyProto, void, PublicPrimitivesList>*
+          public_key_manager,
+      bool new_key_allowed) ABSL_LOCKS_EXCLUDED(maps_mutex_);
+
   template <class P>
   crypto::tink::util::StatusOr<const KeyManager<P>*> get_key_manager(
-      const std::string& type_url) const LOCKS_EXCLUDED(maps_mutex_);
+      const std::string& type_url) const ABSL_LOCKS_EXCLUDED(maps_mutex_);
 
-
+  // Takes ownership of 'wrapper', which must be non-nullptr.
   template <class P>
   crypto::tink::util::Status RegisterPrimitiveWrapper(
-      PrimitiveWrapper<P>* wrapper) LOCKS_EXCLUDED(maps_mutex_);
+      PrimitiveWrapper<P>* wrapper) ABSL_LOCKS_EXCLUDED(maps_mutex_);
 
   template <class P>
   crypto::tink::util::StatusOr<std::unique_ptr<P>> GetPrimitive(
-      const google::crypto::tink::KeyData& key_data)
-      const LOCKS_EXCLUDED(maps_mutex_);
+      const google::crypto::tink::KeyData& key_data) const
+      ABSL_LOCKS_EXCLUDED(maps_mutex_);
 
   template <class P>
   crypto::tink::util::StatusOr<std::unique_ptr<P>> GetPrimitive(
-      const std::string& type_url, const portable_proto::MessageLite& key)
-      const LOCKS_EXCLUDED(maps_mutex_);
+      const std::string& type_url, const portable_proto::MessageLite& key) const
+      ABSL_LOCKS_EXCLUDED(maps_mutex_);
 
   crypto::tink::util::StatusOr<std::unique_ptr<google::crypto::tink::KeyData>>
-  NewKeyData(const google::crypto::tink::KeyTemplate& key_template)
-      const LOCKS_EXCLUDED(maps_mutex_);
+  NewKeyData(const google::crypto::tink::KeyTemplate& key_template) const
+      ABSL_LOCKS_EXCLUDED(maps_mutex_);
 
   crypto::tink::util::StatusOr<std::unique_ptr<google::crypto::tink::KeyData>>
-  GetPublicKeyData(const std::string& type_url, const std::string& serialized_private_key)
-      const LOCKS_EXCLUDED(maps_mutex_);
+  GetPublicKeyData(const std::string& type_url,
+                   const std::string& serialized_private_key) const
+      ABSL_LOCKS_EXCLUDED(maps_mutex_);
 
   template <class P>
   crypto::tink::util::StatusOr<std::unique_ptr<P>> Wrap(
       std::unique_ptr<PrimitiveSet<P>> primitive_set) const
-      LOCKS_EXCLUDED(maps_mutex_);
+      ABSL_LOCKS_EXCLUDED(maps_mutex_);
 
-  void Reset() LOCKS_EXCLUDED(maps_mutex_);
+  void Reset() ABSL_LOCKS_EXCLUDED(maps_mutex_);
 
  private:
   // All information for a given type url.
-  struct KeyTypeInfo {
-    KeyTypeInfo(std::unique_ptr<void, void (*)(void*)> key_manager,
-                const char* type_id_name, bool new_key_allowed,
-                const KeyFactory& key_factory)
-        : key_manager(std::move(key_manager)),
-          type_id_name(type_id_name),
-          new_key_allowed(new_key_allowed),
-          key_factory(key_factory) {}
+  class KeyTypeInfo {
+   public:
+    // Information for each primitive which is available for a key type.
+    struct PerPrimitiveIndex {
+      template <typename P>
+      explicit PerPrimitiveIndex(std::unique_ptr<KeyManager<P>> key_manager)
+          : key_manager(std::move(key_manager)),
+            type_index(std::type_index(typeid(P))) {}
 
-    // A pointer to a KeyManager<P>. We cannot use a normal unique_ptr because
-    // we do not know P. Hence, we pass a custom deleter which knows how to
-    // delete the object.
-    const std::unique_ptr<void, void (*)(void*)> key_manager;
-    // TypeId of the primitive for which this key was inserted.
-    const char* type_id_name;
+      // A pointer to a KeyManager<P>. We use a shared_ptr because
+      // shared_ptr<void> is valid (as opposed to unique_ptr<void>).
+      //
+      // If a KeyTypeManager was inserted, the KeyManager<P> was
+      // constructed at the time it was inserted. The constructed object is
+      // owned by this pointer here; the original KeyTypeManager is owned
+      // by the key_type_manager element of KeyTypeInfo.
+      std::shared_ptr<void> key_manager;
+      // std::type_index of the primitive for which this key was inserted.
+      std::type_index type_index;
+    };
+
+    // Takes ownership of the 'key_manager'.
+    template <typename P>
+    KeyTypeInfo(KeyManager<P>* key_manager, bool new_key_allowed)
+        : key_manager_type_index_(std::type_index(typeid(*key_manager))),
+          public_key_manager_type_index_(absl::nullopt),
+          per_primitive_managers_(std::vector<PerPrimitiveIndex>(
+              {PerPrimitiveIndex(absl::WrapUnique(key_manager))})),
+          new_key_allowed_(new_key_allowed),
+          internal_key_factory_(nullptr),
+          key_factory_(&key_manager->get_key_factory()),
+          key_type_manager_(nullptr) {}
+
+    // Takes ownership of the 'key_manager'.
+    template <typename KeyProto, typename KeyFormatProto,
+              typename... Primitives>
+    KeyTypeInfo(KeyTypeManager<KeyProto, KeyFormatProto, List<Primitives...>>*
+                    key_manager,
+                bool new_key_allowed)
+        : key_manager_type_index_(std::type_index(typeid(*key_manager))),
+          public_key_manager_type_index_(absl::nullopt),
+          per_primitive_managers_({PerPrimitiveIndex(
+              internal::MakeKeyManager<Primitives>(key_manager))...}),
+          new_key_allowed_(new_key_allowed),
+          internal_key_factory_(
+              absl::make_unique<internal::KeyFactoryImpl<KeyTypeManager<
+                  KeyProto, KeyFormatProto, List<Primitives...>>>>(
+                  key_manager)),
+          key_factory_(internal_key_factory_.get()),
+          key_type_manager_(absl::WrapUnique(key_manager)) {}
+
+    // Takes ownership of the 'private_key_manager', but *not* of the
+    // 'public_key_manager'. The public_key_manager must only be alive for the
+    // duration of the constructor.
+    template <typename PrivateKeyProto, typename KeyFormatProto,
+              typename PublicKeyProto, typename PublicPrimitivesList,
+              typename... PrivatePrimitives>
+    KeyTypeInfo(
+        PrivateKeyTypeManager<PrivateKeyProto, KeyFormatProto, PublicKeyProto,
+                              List<PrivatePrimitives...>>* private_key_manager,
+        KeyTypeManager<PublicKeyProto, void, PublicPrimitivesList>*
+            public_key_manager,
+        bool new_key_allowed)
+        : key_manager_type_index_(
+              std::type_index(typeid(*private_key_manager))),
+          public_key_manager_type_index_(
+              std::type_index(typeid(*public_key_manager))),
+          per_primitive_managers_({PerPrimitiveIndex(
+              internal::MakePrivateKeyManager<PrivatePrimitives>(
+                  private_key_manager, public_key_manager))...}),
+          new_key_allowed_(new_key_allowed),
+          internal_key_factory_(
+              absl::make_unique<internal::PrivateKeyFactoryImpl<
+                  PrivateKeyProto, KeyFormatProto, PublicKeyProto,
+                  List<PrivatePrimitives...>, PublicPrimitivesList>>(
+                  private_key_manager, public_key_manager)),
+          key_factory_(internal_key_factory_.get()),
+          key_type_manager_(absl::WrapUnique(private_key_manager)) {}
+
+    template <typename P>
+    crypto::tink::util::StatusOr<const KeyManager<P>*> get_key_manager(
+        absl::string_view requested_type_url) const {
+      std::type_index index_to_find = std::type_index(typeid(P));
+      auto it = std::find_if(
+          per_primitive_managers_.begin(), per_primitive_managers_.end(),
+          [&index_to_find](const PerPrimitiveIndex& per_primitive_index) {
+            return index_to_find == per_primitive_index.type_index;
+          });
+      if (it == per_primitive_managers_.end()) {
+        return crypto::tink::util::Status(
+            crypto::tink::util::error::INVALID_ARGUMENT,
+            absl::StrCat(
+                "Primitive type ", typeid(P).name(),
+                " not among supported primitives ",
+                absl::StrJoin(per_primitive_managers_.begin(),
+                              per_primitive_managers_.end(), ", ",
+                              [](std::string* out,
+                                 const PerPrimitiveIndex& per_primitive_index) {
+                                absl::StrAppend(
+                                    out, per_primitive_index.type_index.name());
+                              }),
+                " for type URL ", requested_type_url));
+      }
+      return static_cast<const KeyManager<P>*>(it->key_manager.get());
+    }
+
+    const std::type_index& key_manager_type_index() const {
+      return key_manager_type_index_;
+    }
+
+    const absl::optional<std::type_index>& public_key_manager_type_index()
+        const {
+      return public_key_manager_type_index_;
+    }
+
+    bool new_key_allowed() const { return new_key_allowed_; }
+    void set_new_key_allowed(bool b) { new_key_allowed_ = b; }
+
+    const KeyFactory& key_factory() const { return *key_factory_; }
+
+   private:
+    // dynamic std::type_index of the actual key manager class for which this
+    // key was inserted.
+    std::type_index key_manager_type_index_;
+    // dynamic std::type_index of the public key manager corresponding to this
+    // class, in case it was inserted using RegisterAsymmetricKeyManagers,
+    // nullopt otherwise.
+    absl::optional<std::type_index> public_key_manager_type_index_;
+
+    // For each primitive, the corresponding names and key_manager.
+    std::vector<PerPrimitiveIndex> per_primitive_managers_;
     // Whether the key manager allows creating new keys.
-    bool new_key_allowed;
-    // The factory which can produce keys of this type.
-    const KeyFactory& key_factory;
+    bool new_key_allowed_;
+    // A factory constructed from an internal key manager. Owned version of
+    // key_factory if constructed with a KeyTypeManager. This is nullptr if
+    // constructed with a KeyManager.
+    std::unique_ptr<const KeyFactory> internal_key_factory_;
+    // Unowned copy of internal_key_factory, always different from
+    // nullptr.
+    const KeyFactory* key_factory_;
+    // The owned pointer in case we use a KeyTypeManager, nullptr if
+    // constructed with a KeyManager.
+    std::shared_ptr<void> key_type_manager_;
   };
 
   // All information for a given primitive label.
   struct LabelInfo {
-    LabelInfo(std::unique_ptr<void, void (*)(void*)> catalogue,
+    LabelInfo(std::shared_ptr<void> catalogue, std::type_index type_index,
               const char* type_id_name)
-        : catalogue(std::move(catalogue)), type_id_name(type_id_name) {}
-    // A pointer to the underlying Catalogue<P>.
-    const std::unique_ptr<void, void (*)(void*)> catalogue;
-    // TypeId of the primitive for which this key was inserted.
-    const char* type_id_name;
+        : catalogue(std::move(catalogue)),
+          type_index(type_index),
+          type_id_name(type_id_name) {}
+    // A pointer to the underlying Catalogue<P>. We use a shared_ptr because
+    // shared_ptr<void> is valid (as opposed to unique_ptr<void>).
+    const std::shared_ptr<void> catalogue;
+    // std::type_index of the primitive for which this key was inserted.
+    std::type_index type_index;
+    // TypeId name of the primitive for which this key was inserted.
+    const std::string type_id_name;
   };
 
-  RegistryImpl() = default;
-  RegistryImpl(const RegistryImpl&) = delete;
-  RegistryImpl& operator=(const RegistryImpl&) = delete;
-
   template <class P>
-  crypto::tink::util::StatusOr<const PrimitiveWrapper<P>*> get_wrapper()
-      const LOCKS_EXCLUDED(maps_mutex_);
+  crypto::tink::util::StatusOr<const PrimitiveWrapper<P>*> get_wrapper() const
+      ABSL_LOCKS_EXCLUDED(maps_mutex_);
 
+  // Returns OK if the key manager with the given type index can be inserted
+  // for type url type_url and parameter new_key_allowed. Otherwise returns
+  // an error to be returned to the user.
+  crypto::tink::util::Status CheckInsertable(
+      const std::string& type_url, const std::type_index& key_manager_type_index,
+      bool new_key_allowed) const ABSL_SHARED_LOCKS_REQUIRED(maps_mutex_);
 
   mutable absl::Mutex maps_mutex_;
   std::unordered_map<std::string, KeyTypeInfo> type_url_to_info_
-      GUARDED_BY(maps_mutex_);
-  std::unordered_map<std::string, std::unique_ptr<void, void (*)(void*)>>
-      primitive_to_wrapper_ GUARDED_BY(maps_mutex_);
+      ABSL_GUARDED_BY(maps_mutex_);
+  // A map from the type_id to the corresponding wrapper. We use a shared_ptr
+  // because shared_ptr<void> is valid (as opposed to unique_ptr<void>).
+  std::unordered_map<std::type_index, std::shared_ptr<void>>
+      primitive_to_wrapper_ ABSL_GUARDED_BY(maps_mutex_);
 
   std::unordered_map<std::string, LabelInfo> name_to_catalogue_map_
-      GUARDED_BY(maps_mutex_);
+      ABSL_GUARDED_BY(maps_mutex_);
 };
 
 template <class P>
-void delete_manager(void* t) {
-  delete static_cast<KeyManager<P>*>(t);
-}
-
-template <class P>
-void delete_catalogue(void* t) {
-  delete static_cast<Catalogue<P>*>(t);
-}
-
-template <class Type>
-std::unique_ptr<void, void (*)(void*)> WrapAsVoidUnique(Type* ptr) {
-  return std::unique_ptr<void, void (*)(void*)>(
-      static_cast<void*>(ptr), [](void* t) { delete static_cast<Type*>(t); });
-}
-
-template <class P>
 crypto::tink::util::Status RegistryImpl::AddCatalogue(
     const std::string& catalogue_name, Catalogue<P>* catalogue) {
   if (catalogue == nullptr) {
@@ -176,13 +323,14 @@
         crypto::tink::util::error::INVALID_ARGUMENT,
         "Parameter 'catalogue' must be non-null.");
   }
-  std::unique_ptr<void, void (*)(void*)> entry(catalogue, delete_catalogue<P>);
+  std::shared_ptr<void> entry(catalogue);
   absl::MutexLock lock(&maps_mutex_);
   auto curr_catalogue = name_to_catalogue_map_.find(catalogue_name);
   if (curr_catalogue != name_to_catalogue_map_.end()) {
     auto existing =
         static_cast<Catalogue<P>*>(curr_catalogue->second.catalogue.get());
-    if (typeid(*existing).name() != typeid(*catalogue).name()) {
+    if (std::type_index(typeid(*existing)) !=
+        std::type_index(typeid(*catalogue))) {
       return ToStatusF(crypto::tink::util::error::ALREADY_EXISTS,
                        "A catalogue named '%s' has been already added.",
                        catalogue_name.c_str());
@@ -190,7 +338,8 @@
   } else {
     name_to_catalogue_map_.emplace(
         std::piecewise_construct, std::forward_as_tuple(catalogue_name),
-        std::forward_as_tuple(std::move(entry), typeid(P).name()));
+        std::forward_as_tuple(std::move(entry), std::type_index(typeid(P)),
+                              typeid(P).name()));
   }
   return crypto::tink::util::Status::OK;
 }
@@ -210,7 +359,7 @@
                      "Wrong Primitive type for catalogue named '%s': "
                      "got '%s', expected '%s'",
                      catalogue_name.c_str(), typeid(P).name(),
-                     catalogue_entry->second.type_id_name);
+                     catalogue_entry->second.type_id_name.c_str());
   }
   return static_cast<Catalogue<P>*>(catalogue_entry->second.catalogue.get());
 }
@@ -218,44 +367,139 @@
 template <class P>
 crypto::tink::util::Status RegistryImpl::RegisterKeyManager(
     KeyManager<P>* manager, bool new_key_allowed) {
-  if (manager == nullptr) {
+  auto owned_manager = absl::WrapUnique(manager);
+  if (owned_manager == nullptr) {
     return crypto::tink::util::Status(
         crypto::tink::util::error::INVALID_ARGUMENT,
         "Parameter 'manager' must be non-null.");
   }
-  std::unique_ptr<void, void (*)(void*)> entry(manager, delete_manager<P>);
-  std::string type_url = manager->get_key_type();
+  std::string type_url = owned_manager->get_key_type();
   if (!manager->DoesSupport(type_url)) {
     return ToStatusF(crypto::tink::util::error::INVALID_ARGUMENT,
                      "The manager does not support type '%s'.",
                      type_url.c_str());
   }
   absl::MutexLock lock(&maps_mutex_);
+  crypto::tink::util::Status status = CheckInsertable(
+      type_url, std::type_index(typeid(*owned_manager)), new_key_allowed);
+  if (!status.ok()) return status;
+
   auto it = type_url_to_info_.find(type_url);
   if (it != type_url_to_info_.end()) {
-    auto existing = static_cast<KeyManager<P>*>(it->second.key_manager.get());
-    if (typeid(*existing).name() != typeid(*manager).name()) {
-      return ToStatusF(crypto::tink::util::error::ALREADY_EXISTS,
-                       "A manager for type '%s' has been already registered.",
-                       type_url.c_str());
-    } else {
-      if (!it->second.new_key_allowed && new_key_allowed) {
-        return ToStatusF(crypto::tink::util::error::ALREADY_EXISTS,
-                         "A manager for type '%s' has been already registered "
-                         "with forbidden new key operation.",
-                         type_url.c_str());
-      }
-      it->second.new_key_allowed = new_key_allowed;
-    }
+    it->second.set_new_key_allowed(new_key_allowed);
   } else {
     type_url_to_info_.emplace(
         std::piecewise_construct, std::forward_as_tuple(type_url),
-        std::forward_as_tuple(std::move(entry), typeid(P).name(),
-                              new_key_allowed, manager->get_key_factory()));
+        std::forward_as_tuple(owned_manager.release(), new_key_allowed));
   }
   return crypto::tink::util::Status::OK;
 }
 
+template <class KeyProto, class KeyFormatProto, class PrimitiveList>
+crypto::tink::util::Status RegistryImpl::RegisterKeyTypeManager(
+    std::unique_ptr<KeyTypeManager<KeyProto, KeyFormatProto, PrimitiveList>>
+        owned_manager,
+    bool new_key_allowed) {
+  if (owned_manager == nullptr) {
+    return crypto::tink::util::Status(
+        crypto::tink::util::error::INVALID_ARGUMENT,
+        "Parameter 'manager' must be non-null.");
+  }
+  std::string type_url = owned_manager->get_key_type();
+  absl::MutexLock lock(&maps_mutex_);
+  crypto::tink::util::Status status = CheckInsertable(
+      type_url, std::type_index(typeid(*owned_manager)), new_key_allowed);
+  if (!status.ok()) return status;
+
+  auto it = type_url_to_info_.find(type_url);
+  if (it != type_url_to_info_.end()) {
+    it->second.set_new_key_allowed(new_key_allowed);
+  } else {
+    type_url_to_info_.emplace(
+        std::piecewise_construct, std::forward_as_tuple(type_url),
+        std::forward_as_tuple(owned_manager.release(), new_key_allowed));
+  }
+  return crypto::tink::util::Status::OK;
+}
+
+template <class PrivateKeyProto, class KeyFormatProto, class PublicKeyProto,
+          class PrivatePrimitivesList, class PublicPrimitivesList>
+crypto::tink::util::Status RegistryImpl::RegisterAsymmetricKeyManagers(
+    PrivateKeyTypeManager<PrivateKeyProto, KeyFormatProto, PublicKeyProto,
+                          PrivatePrimitivesList>* private_key_manager,
+    KeyTypeManager<PublicKeyProto, void, PublicPrimitivesList>*
+        public_key_manager,
+    bool new_key_allowed) ABSL_LOCKS_EXCLUDED(maps_mutex_) {
+  auto owned_private_key_manager = absl::WrapUnique(private_key_manager);
+  auto owned_public_key_manager = absl::WrapUnique(public_key_manager);
+  if (private_key_manager == nullptr) {
+    return crypto::tink::util::Status(
+        crypto::tink::util::error::INVALID_ARGUMENT,
+        "Parameter 'private_key_manager' must be non-null.");
+  }
+  if (owned_public_key_manager == nullptr) {
+    return crypto::tink::util::Status(
+        crypto::tink::util::error::INVALID_ARGUMENT,
+        "Parameter 'public_key_manager' must be non-null.");
+  }
+  std::string private_type_url = private_key_manager->get_key_type();
+  std::string public_type_url = public_key_manager->get_key_type();
+
+  absl::MutexLock lock(&maps_mutex_);
+  crypto::tink::util::Status status = CheckInsertable(
+      private_type_url, std::type_index(typeid(*private_key_manager)),
+      new_key_allowed);
+  if (!status.ok()) return status;
+  status = CheckInsertable(public_type_url,
+                           std::type_index(typeid(*public_key_manager)),
+                           new_key_allowed);
+  if (!status.ok()) return status;
+
+  if (private_type_url == public_type_url) {
+    return crypto::tink::util::Status(
+        crypto::tink::util::error::INVALID_ARGUMENT,
+        "Passed in key managers must have different get_key_type() results.");
+  }
+
+  auto it = type_url_to_info_.find(private_type_url);
+  if (it != type_url_to_info_.end()) {
+    if (it->second.public_key_manager_type_index().has_value()) {
+      if (*it->second.public_key_manager_type_index() !=
+          std::type_index(typeid(*public_key_manager))) {
+        return crypto::tink::util::Status(
+            crypto::tink::util::error::INVALID_ARGUMENT,
+            absl::StrCat("public key manager corresponding to ",
+                         std::type_index(typeid(*private_key_manager)).name(),
+                         " is already registered with ",
+                         it->second.public_key_manager_type_index()->name(),
+                         ", cannot be re-registered with ",
+                         std::type_index(typeid(*private_key_manager)).name()));
+      }
+    }
+  }
+
+  it = type_url_to_info_.find(private_type_url);
+  if (it == type_url_to_info_.end() ||
+      !it->second.public_key_manager_type_index().has_value()) {
+    type_url_to_info_.emplace(
+        std::piecewise_construct, std::forward_as_tuple(private_type_url),
+        std::forward_as_tuple(owned_private_key_manager.release(),
+                              owned_public_key_manager.get(), new_key_allowed));
+  } else {
+    it->second.set_new_key_allowed(new_key_allowed);
+  }
+
+  it = type_url_to_info_.find(public_type_url);
+  if (it == type_url_to_info_.end()) {
+    type_url_to_info_.emplace(
+        std::piecewise_construct, std::forward_as_tuple(public_type_url),
+        std::forward_as_tuple(owned_public_key_manager.release(),
+                              new_key_allowed));
+  }
+
+  return util::OkStatus();
+}
+
 template <class P>
 crypto::tink::util::Status RegistryImpl::RegisterPrimitiveWrapper(
     PrimitiveWrapper<P>* wrapper) {
@@ -264,13 +508,15 @@
         crypto::tink::util::error::INVALID_ARGUMENT,
         "Parameter 'wrapper' must be non-null.");
   }
-  std::unique_ptr<void, void (*)(void*)> entry = WrapAsVoidUnique(wrapper);
+  std::shared_ptr<void> entry(wrapper);
 
   absl::MutexLock lock(&maps_mutex_);
-  auto it = primitive_to_wrapper_.find(typeid(P).name());
+  auto it = primitive_to_wrapper_.find(std::type_index(typeid(P)));
   if (it != primitive_to_wrapper_.end()) {
-    if (typeid(*static_cast<PrimitiveWrapper<P>*>(it->second.get())).name() !=
-        typeid(*static_cast<PrimitiveWrapper<P>*>(entry.get())).name()) {
+    if (std::type_index(
+            typeid(*static_cast<PrimitiveWrapper<P>*>(it->second.get()))) !=
+        std::type_index(
+            typeid(*static_cast<PrimitiveWrapper<P>*>(entry.get())))) {
       return ToStatusF(
           crypto::tink::util::error::ALREADY_EXISTS,
           "A wrapper named for this primitive has already been added.");
@@ -278,7 +524,7 @@
     return crypto::tink::util::Status::OK;
   }
   primitive_to_wrapper_.insert(
-      std::make_pair(typeid(P).name(), std::move(entry)));
+      std::make_pair(std::type_index(typeid(P)), std::move(entry)));
   return crypto::tink::util::Status::OK;
 }
 
@@ -292,14 +538,7 @@
                      "No manager for type '%s' has been registered.",
                      type_url.c_str());
   }
-  if (it->second.type_id_name != typeid(P).name()) {
-    return ToStatusF(crypto::tink::util::error::INVALID_ARGUMENT,
-                     "Wrong Primitive type for key type '%s': "
-                     "got '%s', expected '%s'",
-                     type_url.c_str(), typeid(P).name(),
-                     it->second.type_id_name);
-  }
-  return static_cast<KeyManager<P>*>(it->second.key_manager.get());
+  return it->second.get_key_manager<P>(type_url);
 }
 
 template <class P>
@@ -326,7 +565,7 @@
 crypto::tink::util::StatusOr<const PrimitiveWrapper<P>*>
 RegistryImpl::get_wrapper() const {
   absl::MutexLock lock(&maps_mutex_);
-  auto it = primitive_to_wrapper_.find(typeid(P).name());
+  auto it = primitive_to_wrapper_.find(std::type_index(typeid(P)));
   if (it == primitive_to_wrapper_.end()) {
     return util::Status(
         util::error::INVALID_ARGUMENT,
diff --git a/cc/core/registry_test.cc b/cc/core/registry_test.cc
index 9eb7d2a..5aa7ae6 100644
--- a/cc/core/registry_test.cc
+++ b/cc/core/registry_test.cc
@@ -14,55 +14,69 @@
 //
 ////////////////////////////////////////////////////////////////////////////////
 
+#include "tink/registry.h"
 
 #include <thread>  // NOLINT(build/c++11)
 #include <vector>
 
+#include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include "absl/memory/memory.h"
 #include "absl/strings/string_view.h"
 #include "tink/aead.h"
-#include "tink/aead/aead_catalogue.h"
 #include "tink/aead/aead_wrapper.h"
 #include "tink/aead/aes_gcm_key_manager.h"
 #include "tink/catalogue.h"
+#include "tink/core/key_manager_impl.h"
+#include "tink/core/key_type_manager.h"
 #include "tink/crypto_format.h"
 #include "tink/hybrid/ecies_aead_hkdf_private_key_manager.h"
 #include "tink/hybrid/ecies_aead_hkdf_public_key_manager.h"
 #include "tink/keyset_manager.h"
-#include "tink/registry.h"
-#include "tink/util/keyset_util.h"
+#include "tink/subtle/aes_gcm_boringssl.h"
+#include "tink/subtle/random.h"
 #include "tink/util/protobuf_helper.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
+#include "tink/util/test_keyset_handle.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
 #include "proto/aes_ctr_hmac_aead.pb.h"
 #include "proto/aes_gcm.pb.h"
 #include "proto/common.pb.h"
+#include "proto/ecdsa.pb.h"
 #include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
 namespace {
 
-using crypto::tink::KeysetUtil;
-using crypto::tink::test::AddLegacyKey;
-using crypto::tink::test::AddRawKey;
-using crypto::tink::test::AddTinkKey;
-using crypto::tink::test::DummyAead;
-using crypto::tink::util::Status;
-using google::crypto::tink::AesCtrHmacAeadKey;
-using google::crypto::tink::AesGcmKey;
-using google::crypto::tink::AesGcmKeyFormat;
-using google::crypto::tink::EcPointFormat;
-using google::crypto::tink::EllipticCurveType;
-using google::crypto::tink::HashType;
-using google::crypto::tink::KeyData;
-using google::crypto::tink::Keyset;
-using google::crypto::tink::KeyStatusType;
-using google::crypto::tink::KeyTemplate;
-using google::crypto::tink::OutputPrefixType;
-using portable_proto::MessageLite;
+using ::crypto::tink::test::AddLegacyKey;
+using ::crypto::tink::test::AddRawKey;
+using ::crypto::tink::test::AddTinkKey;
+using ::crypto::tink::test::DummyAead;
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
+using ::crypto::tink::util::Status;
+using ::google::crypto::tink::AesCtrHmacAeadKey;
+using ::google::crypto::tink::AesGcmKey;
+using ::google::crypto::tink::AesGcmKeyFormat;
+using ::google::crypto::tink::EcdsaKeyFormat;
+using ::google::crypto::tink::EcdsaPrivateKey;
+using ::google::crypto::tink::EcdsaPublicKey;
+using ::google::crypto::tink::EcdsaSignatureEncoding;
+using ::google::crypto::tink::EcPointFormat;
+using ::google::crypto::tink::EllipticCurveType;
+using ::google::crypto::tink::HashType;
+using ::google::crypto::tink::KeyData;
+using ::google::crypto::tink::Keyset;
+using ::google::crypto::tink::KeyStatusType;
+using ::google::crypto::tink::KeyTemplate;
+using ::google::crypto::tink::OutputPrefixType;
+using ::portable_proto::MessageLite;
+using ::testing::Eq;
+using ::testing::HasSubstr;
+using ::testing::SizeIs;
 
 class RegistryTest : public ::testing::Test {
  protected:
@@ -75,8 +89,7 @@
 
 class TestKeyFactory : public KeyFactory {
  public:
-  TestKeyFactory(const std::string& key_type) : key_type_(key_type) {
-  }
+  explicit TestKeyFactory(const std::string& key_type) : key_type_(key_type) {}
 
   util::StatusOr<std::unique_ptr<portable_proto::MessageLite>> NewKey(
       const MessageLite& key_format) const override {
@@ -102,9 +115,8 @@
 
 class TestAeadKeyManager : public KeyManager<Aead> {
  public:
-  TestAeadKeyManager(const std::string& key_type)
-      : key_type_(key_type), key_factory_(key_type) {
-  }
+  explicit TestAeadKeyManager(const std::string& key_type)
+      : key_type_(key_type), key_factory_(key_type) {}
 
   util::StatusOr<std::unique_ptr<Aead>>
   GetPrimitive(const KeyData& key) const override {
@@ -135,19 +147,6 @@
   TestKeyFactory key_factory_;
 };
 
-class TestAeadCatalogue : public Catalogue<Aead> {
- public:
-  TestAeadCatalogue() {}
-
-  util::StatusOr<std::unique_ptr<KeyManager<Aead>>>
-      GetKeyManager(const std::string& type_url,
-                    const std::string& primitive_name,
-                    uint32_t min_version) const override {
-    return util::Status(util::error::UNIMPLEMENTED,
-                        "This is a test catalogue.");
-  }
-};
-
 template <typename P>
 class TestWrapper : public PrimitiveWrapper<P> {
  public:
@@ -309,7 +308,7 @@
 }
 
 TEST_F(RegistryTest, testRegisterKeyManager) {
-  std::string key_type_1 = AesGcmKeyManager::static_key_type();
+  std::string key_type_1 = AesGcmKeyManager().get_key_type();
 
   std::unique_ptr<TestAeadKeyManager> null_key_manager = nullptr;
   auto status = Registry::RegisterKeyManager(std::move(null_key_manager), true);
@@ -327,8 +326,9 @@
   EXPECT_TRUE(status.ok()) << status;
 
   // Try overriding a key manager.
-  status =
-      Registry::RegisterKeyManager(absl::make_unique<AesGcmKeyManager>(), true);
+  AesGcmKeyManager key_type_manager;
+  status = Registry::RegisterKeyManager(
+      crypto::tink::internal::MakeKeyManager<Aead>(&key_type_manager), true);
   EXPECT_FALSE(status.ok());
   EXPECT_EQ(util::error::ALREADY_EXISTS, status.error_code()) << status;
 
@@ -339,6 +339,21 @@
   EXPECT_TRUE(manager->DoesSupport(key_type_1));
 }
 
+class TestAeadCatalogue : public Catalogue<Aead> {
+ public:
+  TestAeadCatalogue() {}
+
+  util::StatusOr<std::unique_ptr<KeyManager<Aead>>>
+      GetKeyManager(const std::string& type_url,
+                    const std::string& primitive_name,
+                    uint32_t min_version) const override {
+    return util::Status(util::error::UNIMPLEMENTED,
+                        "This is a test catalogue.");
+  }
+};
+
+class TestAeadCatalogue2 : public TestAeadCatalogue {};
+
 TEST_F(RegistryTest, testAddCatalogue) {
   std::string catalogue_name = "SomeCatalogue";
 
@@ -360,18 +375,12 @@
 
   // Try overriding a catalogue.
   status = Registry::AddCatalogue(catalogue_name,
-                                  absl::make_unique<AeadCatalogue>());
+                                  absl::make_unique<TestAeadCatalogue2>());
   EXPECT_FALSE(status.ok());
   EXPECT_EQ(util::error::ALREADY_EXISTS, status.error_code()) << status;
 
   // Check the catalogue is still present.
-  auto catalogue_result = Registry::get_catalogue<Aead>(catalogue_name);
-  EXPECT_TRUE(catalogue_result.ok()) << catalogue_result.status();
-  auto catalogue = catalogue_result.ValueOrDie();
-  auto manager_result = catalogue->GetKeyManager("some type_url", "Aead", 0);
-  EXPECT_FALSE(manager_result.ok());
-  EXPECT_EQ(util::error::UNIMPLEMENTED, manager_result.status().error_code())
-      << manager_result.status();  // TestAeadCatalogue return UNIMPLEMENTED.
+  EXPECT_THAT(Registry::get_catalogue<Aead>(catalogue_name).status(), IsOk());
 }
 
 TEST_F(RegistryTest, testGettingPrimitives) {
@@ -508,11 +517,19 @@
 TEST_F(RegistryTest, testGetPublicKeyData) {
   // Setup the registry.
   Registry::Reset();
+  auto private_key_type_manager =
+      absl::make_unique<EciesAeadHkdfPrivateKeyManager>();
+  auto public_key_type_manager =
+      absl::make_unique<EciesAeadHkdfPublicKeyManager>();
+
   auto status = Registry::RegisterKeyManager(
-      absl::make_unique<EciesAeadHkdfPrivateKeyManager>(), true);
+      internal::MakePrivateKeyManager<HybridDecrypt>(
+          private_key_type_manager.get(), public_key_type_manager.get()),
+      true);
   ASSERT_TRUE(status.ok()) << status;
-  status =
-      Registry::RegisterKeyManager(absl::make_unique<AesGcmKeyManager>(), true);
+  AesGcmKeyManager key_type_manager;
+  status = Registry::RegisterKeyManager(
+      crypto::tink::internal::MakeKeyManager<Aead>(&key_type_manager), true);
   ASSERT_TRUE(status.ok()) << status;
 
   // Get a test private key.
@@ -522,11 +539,11 @@
 
   // Extract public key data and check.
   auto public_key_data_result = Registry::GetPublicKeyData(
-      EciesAeadHkdfPrivateKeyManager::static_key_type(),
+      EciesAeadHkdfPrivateKeyManager().get_key_type(),
       ecies_key.SerializeAsString());
   EXPECT_TRUE(public_key_data_result.ok()) << public_key_data_result.status();
   auto public_key_data = std::move(public_key_data_result.ValueOrDie());
-  EXPECT_EQ(EciesAeadHkdfPublicKeyManager::static_key_type(),
+  EXPECT_EQ(EciesAeadHkdfPublicKeyManager().get_key_type(),
             public_key_data->type_url());
   EXPECT_EQ(KeyData::ASYMMETRIC_PUBLIC, public_key_data->key_material_type());
   EXPECT_EQ(ecies_key.public_key().SerializeAsString(),
@@ -534,7 +551,7 @@
 
   // Try with a wrong key type.
   auto wrong_key_type_result = Registry::GetPublicKeyData(
-      AesGcmKeyManager::static_key_type(), ecies_key.SerializeAsString());
+      AesGcmKeyManager().get_key_type(), ecies_key.SerializeAsString());
   EXPECT_FALSE(wrong_key_type_result.ok());
   EXPECT_EQ(util::error::INVALID_ARGUMENT,
             wrong_key_type_result.status().error_code());
@@ -543,7 +560,7 @@
 
   // Try with a bad serialized key.
   auto bad_key_result = Registry::GetPublicKeyData(
-      EciesAeadHkdfPrivateKeyManager::static_key_type(),
+      EciesAeadHkdfPrivateKeyManager().get_key_type(),
       "some bad serialized key");
   EXPECT_FALSE(bad_key_result.ok());
   EXPECT_EQ(util::error::INVALID_ARGUMENT,
@@ -623,12 +640,15 @@
   keyset.add_key();
   keyset.mutable_key(0)->set_output_prefix_type(OutputPrefixType::TINK);
   keyset.mutable_key(0)->set_key_id(1234543);
+  keyset.mutable_key(0)->set_status(KeyStatusType::ENABLED);
   keyset.add_key();
   keyset.mutable_key(1)->set_output_prefix_type(OutputPrefixType::LEGACY);
   keyset.mutable_key(1)->set_key_id(726329);
+  keyset.mutable_key(1)->set_status(KeyStatusType::ENABLED);
   keyset.add_key();
   keyset.mutable_key(2)->set_output_prefix_type(OutputPrefixType::TINK);
   keyset.mutable_key(2)->set_key_id(7213743);
+  keyset.mutable_key(2)->set_status(KeyStatusType::ENABLED);
 
   auto primitive_set = absl::make_unique<PrimitiveSet<Aead>>();
   ASSERT_TRUE(
@@ -641,7 +661,7 @@
           .ok());
   auto entry_result = primitive_set->AddPrimitive(
       absl::make_unique<DummyAead>("primary_aead"), keyset.key(2));
-  primitive_set->set_primary(entry_result.ValueOrDie());
+  ASSERT_THAT(primitive_set->set_primary(entry_result.ValueOrDie()), IsOk());
 
   EXPECT_TRUE(
       Registry::RegisterPrimitiveWrapper(absl::make_unique<AeadWrapper>())
@@ -670,6 +690,583 @@
                       decrypt_result.status().error_message());
 }
 
+// Tests that the error message in GetKeyManager contains the type_id.name() of
+// the primitive for which the key manager was actually registered.
+TEST_F(RegistryTest, GetKeyManagerErrorMessage) {
+  AesGcmKeyManager key_type_manager;
+  EXPECT_TRUE(
+      Registry::RegisterKeyManager(
+          crypto::tink::internal::MakeKeyManager<Aead>(&key_type_manager), true)
+          .ok());
+  auto result =
+      Registry::get_key_manager<int>(AesGcmKeyManager().get_key_type());
+  EXPECT_FALSE(result.ok());
+  EXPECT_THAT(result.status().error_message(),
+              HasSubstr(AesGcmKeyManager().get_key_type()));
+  // Note: The C++ standard does not guarantee the next line.  If some toolchain
+  // update fails it, one can delete it.
+  EXPECT_THAT(result.status().error_message(), HasSubstr(typeid(Aead).name()));
+}
+
+// A class for testing. We will construct objects from an aead key, so that we
+// can check that a keymanager can handle multiple primitives. It is really
+// insecure, as it does nothing except provide access to the key.
+class AeadVariant {
+ public:
+  explicit AeadVariant(std::string s) : s_(s) {}
+
+  std::string get() { return s_; }
+
+ private:
+  std::string s_;
+};
+
+class ExampleKeyTypeManager : public KeyTypeManager<AesGcmKey, AesGcmKeyFormat,
+                                                    List<Aead, AeadVariant>> {
+ public:
+  class AeadFactory : public PrimitiveFactory<Aead> {
+   public:
+    crypto::tink::util::StatusOr<std::unique_ptr<Aead>> Create(
+        const AesGcmKey& key) const override {
+      // Ignore the key and returned one with a fixed size for this test.
+      return {subtle::AesGcmBoringSsl::New(key.key_value())};
+    }
+  };
+
+  class AeadVariantFactory : public PrimitiveFactory<AeadVariant> {
+   public:
+    crypto::tink::util::StatusOr<std::unique_ptr<AeadVariant>> Create(
+        const AesGcmKey& key) const override {
+      return absl::make_unique<AeadVariant>(key.key_value());
+    }
+  };
+
+  ExampleKeyTypeManager()
+      : KeyTypeManager(absl::make_unique<AeadFactory>(),
+                       absl::make_unique<AeadVariantFactory>()) {}
+
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::SYMMETRIC;
+  }
+
+  uint32_t get_version() const override { return kVersion; }
+
+  const std::string& get_key_type() const override { return kKeyType; }
+
+  crypto::tink::util::Status ValidateKey(const AesGcmKey& key) const override {
+    return util::OkStatus();
+  }
+
+  crypto::tink::util::Status ValidateKeyFormat(
+      const AesGcmKeyFormat& key_format) const override {
+    return util::OkStatus();
+  }
+
+  crypto::tink::util::StatusOr<AesGcmKey> CreateKey(
+      const AesGcmKeyFormat& key_format) const override {
+    AesGcmKey result;
+    result.set_key_value(subtle::Random::GetRandomBytes(key_format.key_size()));
+    return result;
+  }
+
+ private:
+  static const int kVersion = 0;
+  const std::string kKeyType = "type.googleapis.com/google.crypto.tink.AesGcmKey";
+};
+
+TEST_F(RegistryTest, RegisterKeyTypeManager) {
+  EXPECT_THAT(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<ExampleKeyTypeManager>(), true),
+              IsOk());
+}
+
+TEST_F(RegistryTest, KeyTypeManagerGetFirstKeyManager) {
+  EXPECT_THAT(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<ExampleKeyTypeManager>(), true),
+              IsOk());
+  AesGcmKeyFormat format;
+  format.set_key_size(16);
+  AesGcmKey key = ExampleKeyTypeManager().CreateKey(format).ValueOrDie();
+  auto aead = Registry::get_key_manager<Aead>(
+                  "type.googleapis.com/google.crypto.tink.AesGcmKey")
+                  .ValueOrDie()
+                  ->GetPrimitive(key)
+                  .ValueOrDie();
+  std::string encryption = aead->Encrypt("TESTMESSAGE", "").ValueOrDie();
+  std::string decryption = aead->Decrypt(encryption, "").ValueOrDie();
+  EXPECT_THAT(decryption, Eq("TESTMESSAGE"));
+}
+
+TEST_F(RegistryTest, KeyTypeManagerGetSecondKeyManager) {
+  EXPECT_THAT(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<ExampleKeyTypeManager>(), true),
+              IsOk());
+  AesGcmKeyFormat format;
+  format.set_key_size(16);
+  AesGcmKey key = ExampleKeyTypeManager().CreateKey(format).ValueOrDie();
+  auto aead_variant = Registry::get_key_manager<AeadVariant>(
+                          "type.googleapis.com/google.crypto.tink.AesGcmKey")
+                          .ValueOrDie()
+                          ->GetPrimitive(key)
+                          .ValueOrDie();
+  EXPECT_THAT(aead_variant->get(), Eq(key.key_value()));
+}
+
+TEST_F(RegistryTest, KeyTypeManagerNotSupportedPrimitive) {
+  EXPECT_THAT(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<ExampleKeyTypeManager>(), true),
+              IsOk());
+  EXPECT_THAT(Registry::get_key_manager<Mac>(
+                  "type.googleapis.com/google.crypto.tink.AesGcmKey")
+                  .status(),
+              StatusIs(util::error::INVALID_ARGUMENT,
+                       HasSubstr("not among supported primitives")));
+}
+
+TEST_F(RegistryTest, KeyTypeManagerNewKey) {
+  EXPECT_THAT(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<ExampleKeyTypeManager>(), true),
+              IsOk());
+
+  AesGcmKeyFormat format;
+  format.set_key_size(32);
+  KeyTemplate key_template;
+  key_template.set_type_url("type.googleapis.com/google.crypto.tink.AesGcmKey");
+  key_template.set_value(format.SerializeAsString());
+
+  KeyData key_data = *Registry::NewKeyData(key_template).ValueOrDie();
+  EXPECT_THAT(key_data.type_url(),
+              Eq("type.googleapis.com/google.crypto.tink.AesGcmKey"));
+  EXPECT_THAT(key_data.key_material_type(),
+              Eq(google::crypto::tink::KeyData::SYMMETRIC));
+  AesGcmKey key;
+  key.ParseFromString(key_data.value());
+  EXPECT_THAT(key.key_value(), SizeIs(32));
+}
+
+TEST_F(RegistryTest, KeyTypeManagerNewKeyInvalidSize) {
+  EXPECT_THAT(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<ExampleKeyTypeManager>(), true),
+              IsOk());
+
+  AesGcmKeyFormat format;
+  format.set_key_size(33);
+  KeyTemplate key_template;
+  key_template.set_type_url("type.googleapis.com/google.crypto.tink.AesGcmKey");
+  key_template.set_value(format.SerializeAsString());
+
+  EXPECT_THAT(Registry::NewKeyData(key_template).status(), IsOk());
+}
+
+TEST_F(RegistryTest, RegisterKeyTypeManagerTwiceMoreRestrictive) {
+  EXPECT_THAT(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<ExampleKeyTypeManager>(), true),
+              IsOk());
+  EXPECT_THAT(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<ExampleKeyTypeManager>(), false),
+              IsOk());
+}
+
+TEST_F(RegistryTest, RegisterKeyTypeManagerTwice) {
+  EXPECT_THAT(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<ExampleKeyTypeManager>(), true),
+              IsOk());
+  EXPECT_THAT(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<ExampleKeyTypeManager>(), true),
+              IsOk());
+  EXPECT_THAT(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<ExampleKeyTypeManager>(), false),
+              IsOk());
+  EXPECT_THAT(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<ExampleKeyTypeManager>(), false),
+              IsOk());
+}
+
+TEST_F(RegistryTest, RegisterKeyTypeManagerLessRestrictive) {
+  EXPECT_THAT(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<ExampleKeyTypeManager>(), false),
+              IsOk());
+  EXPECT_THAT(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<ExampleKeyTypeManager>(), true),
+              StatusIs(util::error::ALREADY_EXISTS));
+}
+
+TEST_F(RegistryTest, RegisterKeyTypeManagerBeforeKeyManager) {
+  EXPECT_THAT(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<ExampleKeyTypeManager>(), true),
+              IsOk());
+  EXPECT_THAT(Registry::RegisterKeyManager(
+                  absl::make_unique<TestAeadKeyManager>(
+                      "type.googleapis.com/google.crypto.tink.AesGcmKey"),
+                  true),
+              StatusIs(util::error::ALREADY_EXISTS));
+}
+
+TEST_F(RegistryTest, RegisterKeyTypeManagerAfterKeyManager) {
+  EXPECT_THAT(Registry::RegisterKeyManager(
+                  absl::make_unique<TestAeadKeyManager>(
+                      "type.googleapis.com/google.crypto.tink.AesGcmKey"),
+                  true),
+              IsOk());
+  EXPECT_THAT(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<ExampleKeyTypeManager>(), true),
+              StatusIs(util::error::ALREADY_EXISTS));
+}
+
+class PrivatePrimitiveA {};
+class PrivatePrimitiveB {};
+
+class TestPrivateKeyTypeManager
+    : public PrivateKeyTypeManager<EcdsaPrivateKey, EcdsaKeyFormat,
+                                   EcdsaPublicKey,
+                                   List<PrivatePrimitiveA, PrivatePrimitiveB>> {
+ public:
+  class PrivatePrimitiveAFactory : public PrimitiveFactory<PrivatePrimitiveA> {
+   public:
+    crypto::tink::util::StatusOr<std::unique_ptr<PrivatePrimitiveA>> Create(
+        const EcdsaPrivateKey& key) const override {
+      return util::Status(util::error::UNIMPLEMENTED, "Not implemented");
+    }
+  };
+  class PrivatePrimitiveBFactory : public PrimitiveFactory<PrivatePrimitiveB> {
+   public:
+    crypto::tink::util::StatusOr<std::unique_ptr<PrivatePrimitiveB>> Create(
+        const EcdsaPrivateKey& key) const override {
+      return util::Status(util::error::UNIMPLEMENTED, "Not implemented");
+    }
+  };
+
+  TestPrivateKeyTypeManager()
+      : PrivateKeyTypeManager(absl::make_unique<PrivatePrimitiveAFactory>(),
+                              absl::make_unique<PrivatePrimitiveBFactory>()) {}
+
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::ASYMMETRIC_PRIVATE;
+  }
+
+  uint32_t get_version() const override { return 0; }
+  crypto::tink::util::Status ValidateKey(
+      const EcdsaPrivateKey& key) const override {
+    return crypto::tink::util::Status::OK;
+  }
+  crypto::tink::util::Status ValidateKeyFormat(
+      const EcdsaKeyFormat& key) const override {
+    return crypto::tink::util::Status::OK;
+  }
+
+  const std::string& get_key_type() const override { return kKeyType; }
+
+  crypto::tink::util::StatusOr<EcdsaPrivateKey> CreateKey(
+      const EcdsaKeyFormat& key_format) const override {
+    EcdsaPublicKey public_key;
+    *public_key.mutable_params() = key_format.params();
+    EcdsaPrivateKey result;
+    *result.mutable_public_key() = public_key;
+    return result;
+  }
+
+  crypto::tink::util::StatusOr<EcdsaPublicKey> GetPublicKey(
+      const EcdsaPrivateKey& private_key) const override {
+    return private_key.public_key();
+  }
+
+ private:
+  const std::string kKeyType =
+      "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey";
+};
+
+class PublicPrimitiveA {};
+class PublicPrimitiveB {};
+
+class TestPublicKeyTypeManager
+    : public KeyTypeManager<EcdsaPublicKey, void,
+                            List<PublicPrimitiveA, PublicPrimitiveB>> {
+ public:
+  class PublicPrimitiveAFactory : public PrimitiveFactory<PublicPrimitiveA> {
+   public:
+    crypto::tink::util::StatusOr<std::unique_ptr<PublicPrimitiveA>> Create(
+        const EcdsaPublicKey& key) const override {
+      return util::Status(util::error::UNIMPLEMENTED, "Not implemented");
+    }
+  };
+  class PublicPrimitiveBFactory : public PrimitiveFactory<PublicPrimitiveB> {
+   public:
+    crypto::tink::util::StatusOr<std::unique_ptr<PublicPrimitiveB>> Create(
+        const EcdsaPublicKey& key) const override {
+      return util::Status(util::error::UNIMPLEMENTED, "Not implemented");
+    }
+  };
+
+  TestPublicKeyTypeManager()
+      : KeyTypeManager(absl::make_unique<PublicPrimitiveAFactory>(),
+                       absl::make_unique<PublicPrimitiveBFactory>()) {}
+
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::ASYMMETRIC_PRIVATE;
+  }
+
+  uint32_t get_version() const override { return 0; }
+  crypto::tink::util::Status ValidateKey(
+      const EcdsaPublicKey& key) const override {
+    return crypto::tink::util::Status::OK;
+  }
+
+  const std::string& get_key_type() const override { return kKeyType; }
+
+ private:
+  const std::string kKeyType =
+      "type.googleapis.com/google.crypto.tink.EcdsaPublicKey";
+};
+
+TEST_F(RegistryTest, RegisterAsymmetricKeyManagers) {
+  crypto::tink::util::Status status = Registry::RegisterAsymmetricKeyManagers(
+      absl::make_unique<TestPrivateKeyTypeManager>(),
+      absl::make_unique<TestPublicKeyTypeManager>(), true);
+  ASSERT_TRUE(status.ok()) << status;
+}
+
+TEST_F(RegistryTest, AsymmetricMoreRestrictiveNewKey) {
+  ASSERT_TRUE(Registry::RegisterAsymmetricKeyManagers(
+                  absl::make_unique<TestPrivateKeyTypeManager>(),
+                  absl::make_unique<TestPublicKeyTypeManager>(), true)
+                  .ok());
+  crypto::tink::util::Status status = Registry::RegisterAsymmetricKeyManagers(
+      absl::make_unique<TestPrivateKeyTypeManager>(),
+      absl::make_unique<TestPublicKeyTypeManager>(), false);
+  ASSERT_TRUE(status.ok()) << status;
+}
+
+TEST_F(RegistryTest, AsymmetricSameNewKey) {
+  ASSERT_TRUE(Registry::RegisterAsymmetricKeyManagers(
+                  absl::make_unique<TestPrivateKeyTypeManager>(),
+                  absl::make_unique<TestPublicKeyTypeManager>(), true)
+                  .ok());
+  crypto::tink::util::Status status = Registry::RegisterAsymmetricKeyManagers(
+      absl::make_unique<TestPrivateKeyTypeManager>(),
+      absl::make_unique<TestPublicKeyTypeManager>(), true);
+  ASSERT_TRUE(status.ok()) << status;
+
+  ASSERT_TRUE(Registry::RegisterAsymmetricKeyManagers(
+                  absl::make_unique<TestPrivateKeyTypeManager>(),
+                  absl::make_unique<TestPublicKeyTypeManager>(), false)
+                  .ok());
+  status = Registry::RegisterAsymmetricKeyManagers(
+      absl::make_unique<TestPrivateKeyTypeManager>(),
+      absl::make_unique<TestPublicKeyTypeManager>(), false);
+  ASSERT_TRUE(status.ok()) << status;
+}
+
+TEST_F(RegistryTest, AsymmetricLessRestrictiveGivesError) {
+  crypto::tink::util::Status status = Registry::RegisterAsymmetricKeyManagers(
+      absl::make_unique<TestPrivateKeyTypeManager>(),
+      absl::make_unique<TestPublicKeyTypeManager>(), false);
+  ASSERT_TRUE(status.ok()) << status;
+  EXPECT_THAT(Registry::RegisterAsymmetricKeyManagers(
+                  absl::make_unique<TestPrivateKeyTypeManager>(),
+                  absl::make_unique<TestPublicKeyTypeManager>(), true),
+              StatusIs(util::error::ALREADY_EXISTS,
+                       HasSubstr("forbidden new key operation")));
+}
+
+TEST_F(RegistryTest, AsymmetricPrivateRegisterAlone) {
+  ASSERT_TRUE(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<TestPrivateKeyTypeManager>(), true)
+                  .ok());
+  ASSERT_TRUE(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<TestPublicKeyTypeManager>(), true)
+                  .ok());
+  ASSERT_TRUE(Registry::RegisterAsymmetricKeyManagers(
+                  absl::make_unique<TestPrivateKeyTypeManager>(),
+                  absl::make_unique<TestPublicKeyTypeManager>(), true)
+                  .ok());
+  ASSERT_TRUE(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<TestPrivateKeyTypeManager>(), true)
+                  .ok());
+  ASSERT_TRUE(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<TestPublicKeyTypeManager>(), true)
+                  .ok());
+}
+
+TEST_F(RegistryTest, AsymmetricGetPrimitiveA) {
+  ASSERT_TRUE(Registry::RegisterAsymmetricKeyManagers(
+                  absl::make_unique<TestPrivateKeyTypeManager>(),
+                  absl::make_unique<TestPublicKeyTypeManager>(), true)
+                  .ok());
+  crypto::tink::util::StatusOr<const KeyManager<PrivatePrimitiveA>*> km =
+      Registry::get_key_manager<PrivatePrimitiveA>(
+          TestPrivateKeyTypeManager().get_key_type());
+  ASSERT_TRUE(km.ok()) << km.status();
+  EXPECT_THAT(km.ValueOrDie()->get_key_type(),
+              Eq(TestPrivateKeyTypeManager().get_key_type()));
+}
+
+TEST_F(RegistryTest, AsymmetricGetPrimitiveB) {
+  ASSERT_TRUE(Registry::RegisterAsymmetricKeyManagers(
+                  absl::make_unique<TestPrivateKeyTypeManager>(),
+                  absl::make_unique<TestPublicKeyTypeManager>(), true)
+                  .ok());
+  crypto::tink::util::StatusOr<const KeyManager<PrivatePrimitiveB>*> km =
+      Registry::get_key_manager<PrivatePrimitiveB>(
+          TestPrivateKeyTypeManager().get_key_type());
+  ASSERT_TRUE(km.ok()) << km.status();
+  EXPECT_THAT(km.ValueOrDie()->get_key_type(),
+              Eq(TestPrivateKeyTypeManager().get_key_type()));
+}
+
+TEST_F(RegistryTest, AsymmetricGetPublicPrimitiveA) {
+  ASSERT_TRUE(Registry::RegisterAsymmetricKeyManagers(
+                  absl::make_unique<TestPrivateKeyTypeManager>(),
+                  absl::make_unique<TestPublicKeyTypeManager>(), true)
+                  .ok());
+  crypto::tink::util::StatusOr<const KeyManager<PublicPrimitiveA>*> km =
+      Registry::get_key_manager<PublicPrimitiveA>(
+          TestPublicKeyTypeManager().get_key_type());
+  ASSERT_TRUE(km.ok()) << km.status();
+  EXPECT_THAT(km.ValueOrDie()->get_key_type(),
+              Eq(TestPublicKeyTypeManager().get_key_type()));
+}
+
+TEST_F(RegistryTest, AsymmetricGetPublicPrimitiveB) {
+  ASSERT_TRUE(Registry::RegisterAsymmetricKeyManagers(
+                  absl::make_unique<TestPrivateKeyTypeManager>(),
+                  absl::make_unique<TestPublicKeyTypeManager>(), true)
+                  .ok());
+  crypto::tink::util::StatusOr<const KeyManager<PublicPrimitiveB>*> km =
+      Registry::get_key_manager<PublicPrimitiveB>(
+          TestPublicKeyTypeManager().get_key_type());
+  ASSERT_TRUE(km.ok()) << km.status();
+  EXPECT_THAT(km.ValueOrDie()->get_key_type(),
+              Eq(TestPublicKeyTypeManager().get_key_type()));
+}
+
+TEST_F(RegistryTest, AsymmetricGetWrongPrimitiveError) {
+  ASSERT_TRUE(Registry::RegisterAsymmetricKeyManagers(
+                  absl::make_unique<TestPrivateKeyTypeManager>(),
+                  absl::make_unique<TestPublicKeyTypeManager>(), true)
+                  .ok());
+  crypto::tink::util::StatusOr<const KeyManager<PublicPrimitiveA>*> km =
+      Registry::get_key_manager<PublicPrimitiveA>(
+          TestPrivateKeyTypeManager().get_key_type());
+  EXPECT_THAT(km.status(),
+              StatusIs(util::error::INVALID_ARGUMENT,
+                       HasSubstr("not among supported primitives")));
+}
+
+TEST(PrivateKeyManagerImplTest, AsymmetricFactoryNewKeyFromMessage) {
+  ASSERT_TRUE(Registry::RegisterAsymmetricKeyManagers(
+                  absl::make_unique<TestPrivateKeyTypeManager>(),
+                  absl::make_unique<TestPublicKeyTypeManager>(), true)
+                  .ok());
+
+  EcdsaKeyFormat key_format;
+  key_format.mutable_params()->set_encoding(EcdsaSignatureEncoding::DER);
+  KeyTemplate key_template;
+  key_template.set_type_url(TestPrivateKeyTypeManager().get_key_type());
+  key_template.set_value(key_format.SerializeAsString());
+  key_template.set_output_prefix_type(OutputPrefixType::TINK);
+  std::unique_ptr<KeyData> key_data =
+      Registry::NewKeyData(key_template).ValueOrDie();
+  EXPECT_THAT(key_data->type_url(),
+              Eq(TestPrivateKeyTypeManager().get_key_type()));
+  EcdsaPrivateKey private_key;
+  private_key.ParseFromString(key_data->value());
+  EXPECT_THAT(private_key.public_key().params().encoding(),
+              Eq(EcdsaSignatureEncoding::DER));
+}
+
+TEST(PrivateKeyManagerImplTest, AsymmetricNewKeyDisallowed) {
+  ASSERT_TRUE(Registry::RegisterAsymmetricKeyManagers(
+                  absl::make_unique<TestPrivateKeyTypeManager>(),
+                  absl::make_unique<TestPublicKeyTypeManager>(), true)
+                  .ok());
+  ASSERT_TRUE(Registry::RegisterAsymmetricKeyManagers(
+                  absl::make_unique<TestPrivateKeyTypeManager>(),
+                  absl::make_unique<TestPublicKeyTypeManager>(), false)
+                  .ok());
+
+  KeyTemplate key_template;
+  key_template.set_type_url(TestPrivateKeyTypeManager().get_key_type());
+  EXPECT_THAT(Registry::NewKeyData(key_template).status(),
+              StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("not allow")));
+}
+
+TEST_F(RegistryTest, AsymmetricGetPublicKeyData) {
+  crypto::tink::util::Status status = Registry::RegisterAsymmetricKeyManagers(
+      absl::make_unique<TestPrivateKeyTypeManager>(),
+      absl::make_unique<TestPublicKeyTypeManager>(), true);
+  EcdsaPrivateKey private_key;
+  private_key.mutable_public_key()->mutable_params()->set_encoding(
+      EcdsaSignatureEncoding::DER);
+
+  std::unique_ptr<KeyData> key_data =
+      Registry::GetPublicKeyData(TestPrivateKeyTypeManager().get_key_type(),
+                                 private_key.SerializeAsString())
+          .ValueOrDie();
+  ASSERT_THAT(key_data->type_url(),
+              Eq(TestPublicKeyTypeManager().get_key_type()));
+  EcdsaPublicKey public_key;
+  public_key.ParseFromString(key_data->value());
+  EXPECT_THAT(public_key.params().encoding(), Eq(EcdsaSignatureEncoding::DER));
+}
+
+class TestPrivateKeyTypeManager2 : public TestPrivateKeyTypeManager {};
+class TestPublicKeyTypeManager2 : public TestPublicKeyTypeManager {};
+
+TEST_F(RegistryTest, RegisterAssymmetricReregistrationWithWrongClasses) {
+  ASSERT_TRUE(Registry::RegisterAsymmetricKeyManagers(
+                  absl::make_unique<TestPrivateKeyTypeManager>(),
+                  absl::make_unique<TestPublicKeyTypeManager>(), true)
+                  .ok());
+  EXPECT_THAT(
+      Registry::RegisterAsymmetricKeyManagers(
+          absl::make_unique<TestPrivateKeyTypeManager2>(),
+          absl::make_unique<TestPublicKeyTypeManager>(), true),
+      StatusIs(util::error::ALREADY_EXISTS, HasSubstr("already registered")));
+  EXPECT_THAT(
+      Registry::RegisterAsymmetricKeyManagers(
+          absl::make_unique<TestPrivateKeyTypeManager>(),
+          absl::make_unique<TestPublicKeyTypeManager2>(), true),
+      StatusIs(util::error::ALREADY_EXISTS, HasSubstr("already registered")));
+  EXPECT_THAT(
+      Registry::RegisterAsymmetricKeyManagers(
+          absl::make_unique<TestPrivateKeyTypeManager2>(),
+          absl::make_unique<TestPublicKeyTypeManager2>(), true),
+      StatusIs(util::error::ALREADY_EXISTS, HasSubstr("already registered")));
+  EXPECT_THAT(
+      Registry::RegisterKeyTypeManager(
+          absl::make_unique<TestPrivateKeyTypeManager2>(), true),
+      StatusIs(util::error::ALREADY_EXISTS, HasSubstr("already registered")));
+  EXPECT_THAT(
+      Registry::RegisterKeyTypeManager(
+          absl::make_unique<TestPublicKeyTypeManager2>(), true),
+      StatusIs(util::error::ALREADY_EXISTS, HasSubstr("already registered")));
+}
+
+class TestPublicKeyTypeManagerWithDifferentKeyType
+    : public TestPublicKeyTypeManager {
+  const std::string& get_key_type() const override { return kKeyType; }
+
+ private:
+  const std::string kKeyType = "bla";
+};
+
+TEST_F(RegistryTest, RegisterAssymmetricReregistrationWithNewKeyType) {
+  ASSERT_TRUE(Registry::RegisterAsymmetricKeyManagers(
+                  absl::make_unique<TestPrivateKeyTypeManager>(),
+                  absl::make_unique<TestPublicKeyTypeManager>(), true)
+                  .ok());
+  EXPECT_THAT(
+      Registry::RegisterAsymmetricKeyManagers(
+          absl::make_unique<TestPrivateKeyTypeManager>(),
+          absl::make_unique<TestPublicKeyTypeManagerWithDifferentKeyType>(),
+          true),
+      StatusIs(util::error::INVALID_ARGUMENT,
+               HasSubstr("cannot be re-registered")));
+}
+
 }  // namespace
 }  // namespace tink
 }  // namespace crypto
diff --git a/cc/core/template_util.h b/cc/core/template_util.h
new file mode 100644
index 0000000..f433ca7
--- /dev/null
+++ b/cc/core/template_util.h
@@ -0,0 +1,71 @@
+// Copyright 2019 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+#ifndef TINK_CORE_TEMPLATE_UTIL_H_
+#define TINK_CORE_TEMPLATE_UTIL_H_
+
+#include <tuple>
+#include <type_traits>
+
+#include "absl/meta/type_traits.h"
+
+namespace crypto {
+namespace tink {
+
+namespace internal {
+
+// A helper class template which decides if the TestType occurs in the Tuple
+// For example, OccursInTuple<int, std::tuple<float, float>>::value == false,
+// and OccursInTuple<int, std::tuple<float, int>>::value == true. Not intended
+// to be used directly.
+
+// First declare the template which always takes two parameters.
+template <typename TestType, typename Tuple>
+class OccursInTuple;
+
+// In the special case where the tuple is empty, the result is false.
+template <typename TestType>
+class OccursInTuple<TestType, std::tuple<>> : public std::false_type {};
+
+// If the list is not empty, the result is true if TestType equals the first in
+// the list, or  TestType occurs in the rest of the list.
+template <typename TestType, typename First, typename... List>
+class OccursInTuple<TestType, std::tuple<First, List...>>
+    : public absl::disjunction<
+          std::is_same<TestType, First>,
+          OccursInTuple<TestType, typename std::tuple<List...>>> {};
+
+// The class HasDuplicates. Defines ::value as true in case the given list has
+// a duplicate, false otherwise.
+template <typename... Args>
+class HasDuplicates;
+
+// Empty list has no duplicates.
+template <>
+class HasDuplicates<> : public std::false_type {};
+
+// Non-empty list has a duplicate if the first appears in the rest, or if the
+// rest has a duplicate.
+template <typename First, typename... List>
+class HasDuplicates<First, List...>
+    : public absl::disjunction<
+          OccursInTuple<First, typename std::tuple<List...>>,
+          HasDuplicates<List...>> {};
+
+}  // namespace internal
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_CORE_TEMPLATE_UTIL_H_
diff --git a/cc/core/template_util_test.cc b/cc/core/template_util_test.cc
new file mode 100644
index 0000000..8323c8a
--- /dev/null
+++ b/cc/core/template_util_test.cc
@@ -0,0 +1,43 @@
+// Copyright 2019 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/core/template_util.h"
+
+namespace crypto {
+namespace tink {
+namespace internal {
+
+class C0 {};
+class C1 {};
+class C2 {};
+class C3 {};
+class C4 {};
+
+static_assert(!HasDuplicates<>::value, "");
+static_assert(!HasDuplicates<C0>::value, "");
+static_assert(!HasDuplicates<C0, C1>::value, "");
+static_assert(!HasDuplicates<C0, C1, C2>::value, "");
+static_assert(!HasDuplicates<C0, C1, C2, C3>::value, "");
+
+static_assert(HasDuplicates<C0, C0>::value, "");
+static_assert(HasDuplicates<C0, C1, C0>::value, "");
+static_assert(HasDuplicates<C0, C1, C1>::value, "");
+static_assert(HasDuplicates<C0, C0, C1>::value, "");
+static_assert(HasDuplicates<C0, C1, C2, C3, C1, C4>::value, "");
+
+}  // namespace internal
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/daead/BUILD.bazel b/cc/daead/BUILD.bazel
index a525251..70d43c0 100644
--- a/cc/daead/BUILD.bazel
+++ b/cc/daead/BUILD.bazel
@@ -1,28 +1,25 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 cc_library(
     name = "aes_siv_key_manager",
-    srcs = ["aes_siv_key_manager.cc"],
     hdrs = ["aes_siv_key_manager.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
     deps = [
-        "//cc:aead",
-        "//cc:key_manager",
-        "//cc:key_manager_base",
+        "//cc:core/key_type_manager",
+        "//cc:deterministic_aead",
         "//cc/subtle:aes_siv_boringssl",
         "//cc/subtle:random",
+        "//cc/util:constants",
         "//cc/util:errors",
         "//cc/util:protobuf_helper",
         "//cc/util:status",
         "//cc/util:statusor",
         "//cc/util:validation",
         "//proto:aes_siv_cc_proto",
-        "//proto:common_cc_proto",
-        "//proto:tink_cc_proto",
-        "@com_google_absl//absl/base",
+        "@com_google_absl//absl/strings",
     ],
 )
 
@@ -46,33 +43,20 @@
 )
 
 cc_library(
-    name = "deterministic_aead_catalogue",
-    srcs = ["deterministic_aead_catalogue.cc"],
-    hdrs = ["deterministic_aead_catalogue.h"],
-    include_prefix = "tink",
-    strip_include_prefix = "/cc",
-    deps = [
-        ":aes_siv_key_manager",
-        "//cc:catalogue",
-        "//cc:deterministic_aead",
-        "//cc:key_manager",
-        "//cc/util:status",
-        "@com_google_absl//absl/memory",
-    ],
-)
-
-cc_library(
     name = "deterministic_aead_config",
     srcs = ["deterministic_aead_config.cc"],
     hdrs = ["deterministic_aead_config.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
-        ":deterministic_aead_catalogue",
-        "//cc:config",
+        ":aes_siv_key_manager",
+        ":deterministic_aead_wrapper",
+        "//cc/config:config_util",
         "//cc/mac:mac_config",
         "//cc/util:status",
         "//proto:config_cc_proto",
+        "@com_google_absl//absl/base:core_headers",
         "@com_google_absl//absl/memory",
     ],
 )
@@ -88,7 +72,6 @@
         "//cc:deterministic_aead",
         "//cc:key_manager",
         "//cc:keyset_handle",
-        "//cc:primitive_set",
         "//cc:registry",
         "//cc/util:status",
         "//cc/util:statusor",
@@ -102,6 +85,7 @@
     hdrs = ["deterministic_aead_key_templates.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         "//proto:aes_siv_cc_proto",
         "//proto:common_cc_proto",
@@ -121,10 +105,8 @@
         "//cc:aead",
         "//cc/util:status",
         "//cc/util:statusor",
-        "//proto:aes_eax_cc_proto",
+        "//cc/util:test_matchers",
         "//proto:aes_siv_cc_proto",
-        "//proto:common_cc_proto",
-        "//proto:tink_cc_proto",
         "@com_google_googletest//:gtest_main",
     ],
 )
@@ -139,6 +121,7 @@
         "//cc:deterministic_aead",
         "//cc:primitive_set",
         "//cc/util:status",
+        "//cc/util:test_matchers",
         "//cc/util:test_util",
         "//proto:tink_cc_proto",
         "@com_google_absl//absl/memory",
@@ -147,30 +130,14 @@
 )
 
 cc_test(
-    name = "deterministic_aead_catalogue_test",
-    size = "small",
-    srcs = ["deterministic_aead_catalogue_test.cc"],
-    copts = ["-Iexternal/gtest/include"],
-    deps = [
-        ":deterministic_aead_catalogue",
-        ":deterministic_aead_config",
-        "//cc:catalogue",
-        "//cc:deterministic_aead",
-        "//cc/util:status",
-        "//cc/util:statusor",
-        "@com_google_googletest//:gtest_main",
-    ],
-)
-
-cc_test(
     name = "deterministic_aead_config_test",
     size = "small",
     srcs = ["deterministic_aead_config_test.cc"],
     copts = ["-Iexternal/gtest/include"],
     deps = [
+        ":aes_siv_key_manager",
         ":deterministic_aead_config",
         ":deterministic_aead_key_templates",
-        "//cc:catalogue",
         "//cc:config",
         "//cc:deterministic_aead",
         "//cc:keyset_handle",
@@ -195,8 +162,8 @@
         "//cc:crypto_format",
         "//cc:deterministic_aead",
         "//cc:keyset_handle",
-        "//cc/util:keyset_util",
         "//cc/util:status",
+        "//cc/util:test_keyset_handle",
         "//cc/util:test_util",
         "//proto:aes_siv_cc_proto",
         "//proto:tink_cc_proto",
@@ -212,6 +179,7 @@
     deps = [
         ":aes_siv_key_manager",
         ":deterministic_aead_key_templates",
+        "//cc:core/key_manager_impl",
         "//proto:aes_siv_cc_proto",
         "//proto:common_cc_proto",
         "//proto:tink_cc_proto",
diff --git a/cc/daead/CMakeLists.txt b/cc/daead/CMakeLists.txt
new file mode 100644
index 0000000..a746c8c
--- /dev/null
+++ b/cc/daead/CMakeLists.txt
@@ -0,0 +1,156 @@
+tink_module(daead)
+
+tink_cc_library(
+  NAME aes_siv_key_manager
+  SRCS
+    aes_siv_key_manager.h
+  DEPS
+    tink::core::aead
+    tink::core::key_type_manager
+    tink::subtle::aes_siv_boringssl
+    tink::subtle::random
+    tink::util::constants
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::util::validation
+    tink::proto::aes_siv_cc_proto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME deterministic_aead_wrapper
+  SRCS
+    deterministic_aead_wrapper.cc
+    deterministic_aead_wrapper.h
+  DEPS
+    tink::core::crypto_format
+    tink::core::deterministic_aead
+    tink::core::primitive_set
+    tink::core::primitive_wrapper
+    tink::subtle::subtle_util_boringssl
+    tink::util::status
+    tink::util::statusor
+    tink::proto::tink_cc_proto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME deterministic_aead_config
+  SRCS
+    deterministic_aead_config.cc
+    deterministic_aead_config.h
+  DEPS
+    tink::daead::aes_siv_key_manager
+    tink::daead::deterministic_aead_wrapper
+    tink::config::config_util
+    tink::mac::mac_config
+    tink::util::status
+    tink::proto::config_cc_proto
+    absl::base
+    absl::memory
+)
+
+tink_cc_library(
+  NAME deterministic_aead_factory
+  SRCS
+    deterministic_aead_factory.cc
+    deterministic_aead_factory.h
+  DEPS
+    tink::daead::deterministic_aead_wrapper
+    tink::core::deterministic_aead
+    tink::core::key_manager
+    tink::core::keyset_handle
+    tink::core::primitive_set
+    tink::core::registry
+    tink::util::status
+    tink::util::statusor
+    absl::base
+)
+
+tink_cc_library(
+  NAME deterministic_aead_key_templates
+  SRCS
+    deterministic_aead_key_templates.cc
+    deterministic_aead_key_templates.h
+  DEPS
+    tink::proto::aes_siv_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::tink_cc_proto
+)
+
+# tests
+
+tink_cc_test(
+  NAME aes_siv_key_manager_test
+  SRCS aes_siv_key_manager_test.cc
+  DEPS
+    tink::daead::aes_siv_key_manager
+    tink::core::deterministic_aead
+    tink::util::status
+    tink::util::statusor
+    tink::proto::aes_siv_cc_proto
+    gmock
+)
+
+tink_cc_test(
+  NAME deterministic_aead_wrapper_test
+  SRCS deterministic_aead_wrapper_test.cc
+  DEPS
+    tink::daead::deterministic_aead_wrapper
+    tink::core::deterministic_aead
+    tink::core::primitive_set
+    tink::util::status
+    tink::util::test_matchers
+    tink::util::test_util
+    tink::proto::tink_cc_proto
+    absl::memory
+)
+
+tink_cc_test(
+  NAME deterministic_aead_config_test
+  SRCS deterministic_aead_config_test.cc
+  DEPS
+    tink::daead::aes_siv_key_manager
+    tink::daead::deterministic_aead_config
+    tink::daead::deterministic_aead_key_templates
+    tink::core::config
+    tink::core::deterministic_aead
+    tink::core::keyset_handle
+    tink::core::registry
+    tink::util::status
+    tink::util::test_matchers
+    tink::util::test_util
+    absl::memory
+)
+
+tink_cc_test(
+  NAME deterministic_aead_factory_test
+  SRCS deterministic_aead_factory_test.cc
+  DEPS
+    tink::core::key_manager_impl
+    tink::daead::aes_siv_key_manager
+    tink::daead::deterministic_aead_config
+    tink::daead::deterministic_aead_factory
+    tink::core::crypto_format
+    tink::core::deterministic_aead
+    tink::core::keyset_handle
+    tink::util::test_keyset_handle
+    tink::util::status
+    tink::util::test_util
+    tink::proto::aes_siv_cc_proto
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME deterministic_aead_key_templates_test
+  SRCS deterministic_aead_key_templates_test.cc
+  DEPS
+    tink::core::key_manager_impl
+    tink::daead::aes_siv_key_manager
+    tink::daead::deterministic_aead_key_templates
+    tink::proto::aes_siv_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::tink_cc_proto
+)
diff --git a/cc/daead/aes_siv_key_manager.cc b/cc/daead/aes_siv_key_manager.cc
deleted file mode 100644
index dd8c614..0000000
--- a/cc/daead/aes_siv_key_manager.cc
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2018 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#include "tink/daead/aes_siv_key_manager.h"
-
-#include "absl/base/casts.h"
-#include "absl/strings/string_view.h"
-#include "tink/deterministic_aead.h"
-#include "tink/key_manager.h"
-#include "tink/subtle/aes_siv_boringssl.h"
-#include "tink/subtle/random.h"
-#include "tink/util/errors.h"
-#include "tink/util/protobuf_helper.h"
-#include "tink/util/status.h"
-#include "tink/util/statusor.h"
-#include "tink/util/validation.h"
-#include "proto/aes_siv.pb.h"
-#include "proto/tink.pb.h"
-
-namespace crypto {
-namespace tink {
-
-using ::crypto::tink::util::Status;
-using ::crypto::tink::util::StatusOr;
-using ::google::crypto::tink::AesSivKey;
-using ::google::crypto::tink::AesSivKeyFormat;
-using ::google::crypto::tink::KeyData;
-
-class AesSivKeyFactory : public KeyFactoryBase<AesSivKey, AesSivKeyFormat> {
- public:
-  AesSivKeyFactory() {}
-
-  KeyData::KeyMaterialType key_material_type() const override {
-    return KeyData::SYMMETRIC;
-  }
-
- protected:
-  StatusOr<std::unique_ptr<AesSivKey>> NewKeyFromFormat(
-      const AesSivKeyFormat& aes_siv_key_format) const override {
-    Status status = AesSivKeyManager::Validate(aes_siv_key_format);
-    if (!status.ok()) return status;
-
-    auto aes_siv_key = absl::make_unique<AesSivKey>();
-    aes_siv_key->set_version(AesSivKeyManager::kVersion);
-    aes_siv_key->set_key_value(
-        subtle::Random::GetRandomBytes(aes_siv_key_format.key_size()));
-    return absl::implicit_cast<StatusOr<std::unique_ptr<AesSivKey>>>(
-        std::move(aes_siv_key));
-  }
-};
-
-constexpr uint32_t AesSivKeyManager::kVersion;
-
-AesSivKeyManager::AesSivKeyManager()
-    : key_factory_(absl::make_unique<AesSivKeyFactory>()) {}
-
-uint32_t AesSivKeyManager::get_version() const { return kVersion; }
-
-const KeyFactory& AesSivKeyManager::get_key_factory() const {
-  return *key_factory_;
-}
-
-StatusOr<std::unique_ptr<DeterministicAead>>
-AesSivKeyManager::GetPrimitiveFromKey(const AesSivKey& aes_siv_key) const {
-  Status status = Validate(aes_siv_key);
-  if (!status.ok()) return status;
-  auto aes_siv_result = subtle::AesSivBoringSsl::New(aes_siv_key.key_value());
-  if (!aes_siv_result.ok()) return aes_siv_result.status();
-  return std::move(aes_siv_result.ValueOrDie());
-}
-
-// static
-Status AesSivKeyManager::Validate(const AesSivKey& key) {
-  Status status = ValidateVersion(key.version(), kVersion);
-  if (!status.ok()) return status;
-  uint32_t key_size = key.key_value().size();
-  if (key_size != 64) {
-    return ToStatusF(util::error::INVALID_ARGUMENT,
-                     "Invalid AesSivKey: key_value has %d bytes; "
-                     "supported size: 64 bytes.",
-                     key_size);
-  }
-  return Status::OK;
-}
-
-// static
-Status AesSivKeyManager::Validate(const AesSivKeyFormat& key_format) {
-  uint32_t key_size = key_format.key_size();
-  if (key_size != 64) {
-    return ToStatusF(util::error::INVALID_ARGUMENT,
-                     "Invalid AesSivKeyFormat: key_size is %d bytes; "
-                     "supported size: 64 bytes.",
-                     key_size);
-  }
-  return Status::OK;
-}
-
-}  // namespace tink
-}  // namespace crypto
diff --git a/cc/daead/aes_siv_key_manager.h b/cc/daead/aes_siv_key_manager.h
index 4888169..3b6f44e 100644
--- a/cc/daead/aes_siv_key_manager.h
+++ b/cc/daead/aes_siv_key_manager.h
@@ -13,60 +13,89 @@
 // limitations under the License.
 //
 ///////////////////////////////////////////////////////////////////////////////
-#ifndef TINK_AEAD_AES_SIV_KEY_MANAGER_H_
-#define TINK_AEAD_AES_SIV_KEY_MANAGER_H_
+#ifndef TINK_DAEAD_AES_SIV_KEY_MANAGER_H_
+#define TINK_DAEAD_AES_SIV_KEY_MANAGER_H_
 
 #include <algorithm>
 #include <vector>
 
 #include "absl/strings/string_view.h"
+#include "tink/core/key_type_manager.h"
 #include "tink/deterministic_aead.h"
-#include "tink/core/key_manager_base.h"
-#include "tink/key_manager.h"
+#include "tink/subtle/aes_siv_boringssl.h"
+#include "tink/subtle/random.h"
+#include "tink/util/constants.h"
 #include "tink/util/errors.h"
 #include "tink/util/protobuf_helper.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
+#include "tink/util/validation.h"
 #include "proto/aes_siv.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
 
 class AesSivKeyManager
-    : public KeyManagerBase<DeterministicAead,
-                            google::crypto::tink::AesSivKey> {
+    : public KeyTypeManager<google::crypto::tink::AesSivKey,
+                            google::crypto::tink::AesSivKeyFormat,
+                            List<DeterministicAead>> {
  public:
-  static constexpr uint32_t kVersion = 0;
+  class DeterministicAeadFactory : public PrimitiveFactory<DeterministicAead> {
+    crypto::tink::util::StatusOr<std::unique_ptr<DeterministicAead>> Create(
+        const google::crypto::tink::AesSivKey& key) const override {
+      return subtle::AesSivBoringSsl::New(key.key_value());
+    }
+  };
 
-  AesSivKeyManager();
+  AesSivKeyManager()
+      : KeyTypeManager(absl::make_unique<DeterministicAeadFactory>()) {}
 
-  // Returns the version of this key manager.
-  uint32_t get_version() const override;
+  uint32_t get_version() const override { return 0; }
 
-  // Returns a factory that generates keys of the key type
-  // handled by this manager.
-  const KeyFactory& get_key_factory() const override;
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::SYMMETRIC;
+  }
 
-  virtual ~AesSivKeyManager() {}
+  const std::string& get_key_type() const override { return key_type_; }
 
- protected:
-  crypto::tink::util::StatusOr<std::unique_ptr<DeterministicAead>>
-  GetPrimitiveFromKey(
-      const google::crypto::tink::AesSivKey& aes_siv_key) const override;
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::AesSivKey& key) const override {
+    crypto::tink::util::Status status =
+        ValidateVersion(key.version(), get_version());
+    if (!status.ok()) return status;
+    return ValidateKeySize(key.key_value().size());
+  }
+
+  crypto::tink::util::Status ValidateKeyFormat(
+      const google::crypto::tink::AesSivKeyFormat& key_format) const override {
+    return ValidateKeySize(key_format.key_size());
+  }
+
+  crypto::tink::util::StatusOr<google::crypto::tink::AesSivKey> CreateKey(
+      const google::crypto::tink::AesSivKeyFormat& key_format) const override {
+    google::crypto::tink::AesSivKey key;
+    key.set_version(get_version());
+    key.set_key_value(subtle::Random::GetRandomBytes(key_format.key_size()));
+    return key;
+  }
 
  private:
-  friend class AesSivKeyFactory;
+  crypto::tink::util::Status ValidateKeySize(uint32_t key_size) const {
+    if (key_size != 64) {
+      return crypto::tink::util::Status(
+          crypto::tink::util::error::INVALID_ARGUMENT,
+          absl::StrCat("Invalid key size: key size is ", key_size,
+                       " bytes; supported size: 64 bytes."));
+    }
+    return crypto::tink::util::OkStatus();
+  }
 
-  std::unique_ptr<KeyFactory> key_factory_;
-
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::AesSivKey& key);
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::AesSivKeyFormat& key_format);
+  const std::string key_type_ = absl::StrCat(
+      kTypeGoogleapisCom, google::crypto::tink::AesSivKey().GetTypeName());
 };
 
 }  // namespace tink
 }  // namespace crypto
 
-#endif  // TINK_AEAD_AES_SIV_KEY_MANAGER_H_
+#endif  // TINK_DAEAD_AES_SIV_KEY_MANAGER_H_
diff --git a/cc/daead/aes_siv_key_manager_test.cc b/cc/daead/aes_siv_key_manager_test.cc
index 6cb3649..3cec510 100644
--- a/cc/daead/aes_siv_key_manager_test.cc
+++ b/cc/daead/aes_siv_key_manager_test.cc
@@ -16,256 +16,142 @@
 
 #include "tink/daead/aes_siv_key_manager.h"
 
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
 #include "tink/deterministic_aead.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
-#include "gtest/gtest.h"
-#include "proto/aes_eax.pb.h"
+#include "tink/util/test_matchers.h"
 #include "proto/aes_siv.pb.h"
-#include "proto/common.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
 
-using google::crypto::tink::AesEaxKey;
-using google::crypto::tink::AesEaxKeyFormat;
-using google::crypto::tink::AesSivKey;
-using google::crypto::tink::AesSivKeyFormat;
-using google::crypto::tink::KeyData;
-using google::crypto::tink::KeyTemplate;
+using ::crypto::tink::test::IsOk;
+using ::google::crypto::tink::AesSivKey;
+using ::google::crypto::tink::AesSivKeyFormat;
+using ::testing::Eq;
+using ::testing::Ne;
+using ::testing::Not;
+using ::testing::SizeIs;
 
 namespace {
 
-class AesSivKeyManagerTest : public ::testing::Test {
- protected:
-  std::string key_type_prefix_ = "type.googleapis.com/";
-  std::string aes_siv_key_type_ =
-      "type.googleapis.com/google.crypto.tink.AesSivKey";
-};
-
-TEST_F(AesSivKeyManagerTest, testBasic) {
-  AesSivKeyManager key_manager;
-
-  EXPECT_EQ(0, key_manager.get_version());
-  EXPECT_EQ("type.googleapis.com/google.crypto.tink.AesSivKey",
-            key_manager.get_key_type());
-  EXPECT_TRUE(key_manager.DoesSupport(key_manager.get_key_type()));
+TEST(AesSivKeyManagerTest, Basics) {
+  EXPECT_THAT(AesSivKeyManager().get_version(), Eq(0));
+  EXPECT_THAT(AesSivKeyManager().get_key_type(),
+              Eq("type.googleapis.com/google.crypto.tink.AesSivKey"));
+  EXPECT_THAT(AesSivKeyManager().key_material_type(),
+              Eq(google::crypto::tink::KeyData::SYMMETRIC));
 }
 
-TEST_F(AesSivKeyManagerTest, testKeyDataErrors) {
-  AesSivKeyManager key_manager;
+TEST(AesSivKeyManagerTest, ValidateEmptyKey) {
+  EXPECT_THAT(AesSivKeyManager().ValidateKey(AesSivKey()), Not(IsOk()));
+}
 
-  {  // Bad key type.
-    KeyData key_data;
-    std::string bad_key_type =
-        "type.googleapis.com/google.crypto.tink.SomeOtherKey";
-    key_data.set_type_url(bad_key_type);
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, bad_key_type,
-                        result.status().error_message());
+TEST(AesSivKeyManagerTest, ValidateEmptyKeyFormat) {
+  EXPECT_THAT(AesSivKeyManager().ValidateKeyFormat(AesSivKeyFormat()),
+              Not(IsOk()));
+}
+
+TEST(AesSivKeyManagerTest, ValidKeyFormat) {
+  AesSivKeyFormat format;
+  format.set_key_size(64);
+  EXPECT_THAT(AesSivKeyManager().ValidateKeyFormat(format), IsOk());
+}
+
+TEST(AesSivKeyManagerTest, ValidateKeyFormatWithWrongSizes) {
+  AesSivKeyFormat format;
+
+  for (int i = 0; i < 64; ++i) {
+    format.set_key_size(i);
+    EXPECT_THAT(AesSivKeyManager().ValidateKeyFormat(format), Not(IsOk()))
+        << " for length " << i;
   }
-
-  {  // Bad key value.
-    KeyData key_data;
-    key_data.set_type_url(aes_siv_key_type_);
-    key_data.set_value("some bad serialized proto");
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
-
-  {  // Bad version.
-    KeyData key_data;
-    AesSivKey key;
-    key.set_version(1);
-    key_data.set_type_url(aes_siv_key_type_);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "version",
-                        result.status().error_message());
-  }
-
-  {  // Bad key_value size (supported size: 64).
-    for (int len = 0; len < 72; len++) {
-      AesSivKey key;
-      key.set_version(0);
-      key.set_key_value(std::string(len, 'a'));
-      KeyData key_data;
-      key_data.set_type_url(aes_siv_key_type_);
-      key_data.set_value(key.SerializeAsString());
-      auto result = key_manager.GetPrimitive(key_data);
-      if (len == 64) {
-        EXPECT_TRUE(result.ok()) << result.status();
-      } else {
-        EXPECT_FALSE(result.ok());
-        EXPECT_EQ(util::error::INVALID_ARGUMENT,
-                  result.status().error_code());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                            std::to_string(len) + " bytes",
-                            result.status().error_message());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring, "supported size",
-                            result.status().error_message());
-      }
-    }
+  for (int i = 65; i <= 200; ++i) {
+    format.set_key_size(i);
+    EXPECT_THAT(AesSivKeyManager().ValidateKeyFormat(format), Not(IsOk()))
+        << " for length " << i;
   }
 }
 
-TEST_F(AesSivKeyManagerTest, testKeyMessageErrors) {
-  AesSivKeyManager key_manager;
-
-  {  // Bad protobuffer.
-    AesEaxKey key;
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "AesEaxKey",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-  }
-
-  {  // Bad key_value size (supported size: 64).
-    for (int len = 0; len < 72; len++) {
-      AesSivKey key;
-      key.set_version(0);
-      key.set_key_value(std::string(len, 'a'));
-      auto result = key_manager.GetPrimitive(key);
-      if (len == 64) {
-        EXPECT_TRUE(result.ok()) << result.status();
-      } else {
-        EXPECT_FALSE(result.ok());
-        EXPECT_EQ(util::error::INVALID_ARGUMENT,
-                  result.status().error_code());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                            std::to_string(len) + " bytes",
-                            result.status().error_message());
-        EXPECT_PRED_FORMAT2(testing::IsSubstring, "supported size",
-                            result.status().error_message());
-      }
-    }
-  }
+TEST(AesSivKeyManagerTest, CreateKey) {
+  AesSivKeyFormat format;
+  format.set_key_size(64);
+  auto key_or = AesSivKeyManager().CreateKey(format);
+  ASSERT_THAT(key_or.status(), IsOk());
+  EXPECT_THAT(key_or.ValueOrDie().key_value(), SizeIs(format.key_size()));
+  EXPECT_THAT(key_or.ValueOrDie().version(), Eq(0));
 }
 
-TEST_F(AesSivKeyManagerTest, testPrimitives) {
-  std::string plaintext = "some plaintext";
-  std::string aad = "some aad";
-  AesSivKeyManager key_manager;
+TEST(AesSivKeyManagerTest, CreateKeyIsValid) {
+  AesSivKeyFormat format;
+  format.set_key_size(64);
+  auto key_or = AesSivKeyManager().CreateKey(format);
+  ASSERT_THAT(key_or.status(), IsOk());
+  EXPECT_THAT(AesSivKeyManager().ValidateKey(key_or.ValueOrDie()), IsOk());
+}
+
+TEST(AesSivKeyManagerTest, MultipleCreateCallsCreateDifferentKeys) {
+  AesSivKeyFormat format;
+  AesSivKeyManager manager;
+  format.set_key_size(64);
+  auto key1_or = manager.CreateKey(format);
+  ASSERT_THAT(key1_or.status(), IsOk());
+  auto key2_or = manager.CreateKey(format);
+  ASSERT_THAT(key2_or.status(), IsOk());
+  EXPECT_THAT(key1_or.ValueOrDie().key_value(),
+              Ne(key2_or.ValueOrDie().key_value()));
+}
+
+TEST(AesSivKeyManagerTest, ValidateKey) {
   AesSivKey key;
-
+  *key.mutable_key_value() = std::string(64, 'a');
   key.set_version(0);
-  key.set_key_value(
-      "64 bytes of key 0123456789abcdef0123456789abcdef0123456789abcdef");
+  EXPECT_THAT(AesSivKeyManager().ValidateKey(key), IsOk());
+}
 
-  {  // Using key message only.
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto aes_siv = std::move(result.ValueOrDie());
-    auto encrypt_result = aes_siv->EncryptDeterministically(plaintext, aad);
-    EXPECT_TRUE(encrypt_result.ok()) << encrypt_result.status();
-    auto decrypt_result =
-        aes_siv->DecryptDeterministically(encrypt_result.ValueOrDie(), aad);
-    EXPECT_TRUE(decrypt_result.ok()) << decrypt_result.status();
-    EXPECT_EQ(plaintext, decrypt_result.ValueOrDie());
+TEST(AesSivKeyManagerTest, ValidateKeyStringLength) {
+  AesSivKey key;
+    key.set_version(0);
+  for (int i = 0 ; i < 64; ++i) {
+    *key.mutable_key_value() = std::string(i, 'a');
+    EXPECT_THAT(AesSivKeyManager().ValidateKey(key), Not(IsOk()));
   }
-
-  {  // Using KeyData proto.
-    KeyData key_data;
-    key_data.set_type_url(aes_siv_key_type_);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto aes_siv = std::move(result.ValueOrDie());
-    auto encrypt_result = aes_siv->EncryptDeterministically(plaintext, aad);
-    EXPECT_TRUE(encrypt_result.ok()) << encrypt_result.status();
-    auto decrypt_result =
-        aes_siv->DecryptDeterministically(encrypt_result.ValueOrDie(), aad);
-    EXPECT_TRUE(decrypt_result.ok()) << decrypt_result.status();
-    EXPECT_EQ(plaintext, decrypt_result.ValueOrDie());
+  for (int i = 65 ; i <= 200; ++i) {
+    *key.mutable_key_value() = std::string(i, 'a');
+    EXPECT_THAT(AesSivKeyManager().ValidateKey(key), Not(IsOk()));
   }
 }
 
-TEST_F(AesSivKeyManagerTest, testNewKeyErrors) {
-  AesSivKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-
-  {  // Bad key format.
-    AesEaxKeyFormat key_format;
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "AesEaxKeyFormat",
-                        result.status().error_message());
-  }
-
-  {  // Bad serialized key format.
-    auto result = key_factory.NewKey("some bad serialized proto");
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
-
-  {  // Bad AesSivKeyFormat: small key_size.
-    AesSivKeyFormat key_format;
-    key_format.set_key_size(32);
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "key_size",
-                        result.status().error_message());
-  }
+TEST(AesSivKeyManagerTest, ValidateKeyVersion) {
+  AesSivKey key;
+  *key.mutable_key_value() = std::string(64, 'a');
+  key.set_version(1);
+  EXPECT_THAT(AesSivKeyManager().ValidateKey(key), Not(IsOk()));
 }
 
-TEST_F(AesSivKeyManagerTest, testNewKeyBasic) {
-  AesSivKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-  AesSivKeyFormat key_format;
-  key_format.set_key_size(64);
+TEST(AesSivKeyManagerTest, GetPrimitive) {
+  AesSivKeyFormat format;
+  format.set_key_size(64);
+  auto key_or = AesSivKeyManager().CreateKey(format);
+  ASSERT_THAT(key_or.status(), IsOk());
+  auto daead_or =
+      AesSivKeyManager().GetPrimitive<DeterministicAead>(key_or.ValueOrDie());
+  ASSERT_THAT(daead_or.status(), IsOk());
 
-  { // Via NewKey(format_proto).
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key = std::move(result.ValueOrDie());
-    EXPECT_EQ(key_type_prefix_ + key->GetTypeName(), aes_siv_key_type_);
-    std::unique_ptr<AesSivKey> aes_siv_key(
-        reinterpret_cast<AesSivKey*>(key.release()));
-    EXPECT_EQ(0, aes_siv_key->version());
-    EXPECT_EQ(key_format.key_size(), aes_siv_key->key_value().size());
-  }
+  auto direct_daead_or =
+      subtle::AesSivBoringSsl::New(key_or.ValueOrDie().key_value());
+  ASSERT_THAT(direct_daead_or.status(), IsOk());
 
-  { // Via NewKey(serialized_format_proto).
-    auto result = key_factory.NewKey(key_format.SerializeAsString());
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key = std::move(result.ValueOrDie());
-    EXPECT_EQ(key_type_prefix_ + key->GetTypeName(), aes_siv_key_type_);
-    std::unique_ptr<AesSivKey> aes_siv_key(
-        reinterpret_cast<AesSivKey*>(key.release()));
-    EXPECT_EQ(0, aes_siv_key->version());
-    EXPECT_EQ(key_format.key_size(), aes_siv_key->key_value().size());
-  }
-
-  { // Via NewKeyData(serialized_format_proto).
-    auto result = key_factory.NewKeyData(key_format.SerializeAsString());
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key_data = std::move(result.ValueOrDie());
-    EXPECT_EQ(aes_siv_key_type_, key_data->type_url());
-    EXPECT_EQ(KeyData::SYMMETRIC, key_data->key_material_type());
-    AesSivKey aes_siv_key;
-    EXPECT_TRUE(aes_siv_key.ParseFromString(key_data->value()));
-    EXPECT_EQ(0, aes_siv_key.version());
-    EXPECT_EQ(key_format.key_size(), aes_siv_key.key_value().size());
-  }
+  auto encryption_or =
+      daead_or.ValueOrDie()->EncryptDeterministically("123", "abcd");
+  ASSERT_THAT(encryption_or.status(), IsOk());
+  auto direct_encryption_or =
+      direct_daead_or.ValueOrDie()->EncryptDeterministically("123", "abcd");
+  ASSERT_THAT(direct_encryption_or.status(), IsOk());
+  ASSERT_THAT(encryption_or.ValueOrDie(),
+              Eq(direct_encryption_or.ValueOrDie()));
 }
 
 }  // namespace
diff --git a/cc/daead/deterministic_aead_catalogue.cc b/cc/daead/deterministic_aead_catalogue.cc
deleted file mode 100644
index 7913bc8..0000000
--- a/cc/daead/deterministic_aead_catalogue.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#include "tink/daead/deterministic_aead_catalogue.h"
-
-#include "absl/memory/memory.h"
-#include "absl/strings/ascii.h"
-#include "tink/catalogue.h"
-#include "tink/daead/aes_siv_key_manager.h"
-#include "tink/key_manager.h"
-#include "tink/util/status.h"
-#include "tink/util/statusor.h"
-
-namespace crypto {
-namespace tink {
-
-namespace {
-
-crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<DeterministicAead>>>
-CreateKeyManager(const std::string& type_url) {
-  if (type_url == AesSivKeyManager::static_key_type()) {
-    std::unique_ptr<KeyManager<DeterministicAead>> manager(
-        new AesSivKeyManager());
-    return std::move(manager);
-  }
-  return ToStatusF(crypto::tink::util::error::NOT_FOUND,
-                   "No key manager for type_url '%s'.", type_url.c_str());
-}
-
-}  // anonymous namespace
-
-crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<DeterministicAead>>>
-DeterministicAeadCatalogue::GetKeyManager(const std::string& type_url,
-                                          const std::string& primitive_name,
-                                          uint32_t min_version) const {
-  if (!(absl::AsciiStrToLower(primitive_name) == "deterministicaead")) {
-    return ToStatusF(crypto::tink::util::error::NOT_FOUND,
-                     "This catalogue does not support primitive %s.",
-                     primitive_name.c_str());
-  }
-  auto manager_result = CreateKeyManager(type_url);
-  if (!manager_result.ok()) return manager_result;
-  if (manager_result.ValueOrDie()->get_version() < min_version) {
-    return ToStatusF(
-        crypto::tink::util::error::NOT_FOUND,
-        "No key manager for type_url '%s' with version at least %d.",
-        type_url.c_str(), min_version);
-  }
-  return std::move(manager_result.ValueOrDie());
-}
-
-}  // namespace tink
-}  // namespace crypto
diff --git a/cc/daead/deterministic_aead_catalogue.h b/cc/daead/deterministic_aead_catalogue.h
deleted file mode 100644
index 96917e9..0000000
--- a/cc/daead/deterministic_aead_catalogue.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#ifndef TINK_DAEAD_DETERMINISTIC_AEAD_CATALOGUE_H_
-#define TINK_DAEAD_DETERMINISTIC_AEAD_CATALOGUE_H_
-
-#include "tink/catalogue.h"
-#include "tink/deterministic_aead.h"
-#include "tink/key_manager.h"
-#include "tink/util/statusor.h"
-
-namespace crypto {
-namespace tink {
-
-///////////////////////////////////////////////////////////////////////////////
-// A catalogue of Tink DeterministicAead key mangers.
-class DeterministicAeadCatalogue : public Catalogue<DeterministicAead> {
- public:
-  DeterministicAeadCatalogue() {}
-
-  crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<DeterministicAead>>>
-  GetKeyManager(const std::string& type_url, const std::string& primitive_name,
-                uint32_t min_version) const;
-};
-
-}  // namespace tink
-}  // namespace crypto
-
-#endif  // TINK_DAEAD_DETERMINISTIC_AEAD_CATALOGUE_H_
diff --git a/cc/daead/deterministic_aead_catalogue_test.cc b/cc/daead/deterministic_aead_catalogue_test.cc
deleted file mode 100644
index 136a4ef..0000000
--- a/cc/daead/deterministic_aead_catalogue_test.cc
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-#include "tink/daead/deterministic_aead_catalogue.h"
-
-#include "gtest/gtest.h"
-#include "tink/catalogue.h"
-#include "tink/daead/deterministic_aead_config.h"
-#include "tink/util/status.h"
-#include "tink/util/statusor.h"
-
-namespace crypto {
-namespace tink {
-namespace {
-
-class DeterministicAeadCatalogueTest : public ::testing::Test {};
-
-TEST_F(DeterministicAeadCatalogueTest, testBasic) {
-  std::string key_types[] = {"type.googleapis.com/google.crypto.tink.AesSivKey"};
-
-  DeterministicAeadCatalogue catalogue;
-  {
-    auto manager_result =
-        catalogue.GetKeyManager("bad.key_type", "DeterministicAead", 0);
-    EXPECT_FALSE(manager_result.ok());
-    EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-  }
-  for (const std::string& key_type : key_types) {
-    {
-      auto manager_result =
-          catalogue.GetKeyManager(key_type, "DeterministicAead", 0);
-      EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-      EXPECT_TRUE(manager_result.ValueOrDie()->DoesSupport(key_type));
-    }
-
-    {
-      auto manager_result =
-          catalogue.GetKeyManager(key_type, "deterministicaead", 0);
-      EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-      EXPECT_TRUE(manager_result.ValueOrDie()->DoesSupport(key_type));
-    }
-
-    {
-      auto manager_result = catalogue.GetKeyManager(key_type, "Mac", 0);
-      EXPECT_FALSE(manager_result.ok());
-      EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-    }
-
-    {
-      auto manager_result =
-          catalogue.GetKeyManager(key_type, "DeterministicAead", 1);
-      EXPECT_FALSE(manager_result.ok());
-      EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-    }
-  }
-}
-
-}  // namespace
-}  // namespace tink
-}  // namespace crypto
diff --git a/cc/daead/deterministic_aead_config.cc b/cc/daead/deterministic_aead_config.cc
index e0ccd0d..4a4232b 100644
--- a/cc/daead/deterministic_aead_config.cc
+++ b/cc/daead/deterministic_aead_config.cc
@@ -17,8 +17,9 @@
 #include "tink/daead/deterministic_aead_config.h"
 
 #include "absl/memory/memory.h"
-#include "tink/config.h"
-#include "tink/daead/deterministic_aead_catalogue.h"
+#include "tink/config/config_util.h"
+#include "tink/daead/aes_siv_key_manager.h"
+#include "tink/daead/deterministic_aead_wrapper.h"
 #include "tink/registry.h"
 #include "tink/util/status.h"
 #include "proto/config.pb.h"
@@ -28,35 +29,22 @@
 namespace crypto {
 namespace tink {
 
-namespace {
-
-google::crypto::tink::RegistryConfig* GenerateRegistryConfig() {
-  google::crypto::tink::RegistryConfig* config =
-      new google::crypto::tink::RegistryConfig();
-  config->add_entry()->MergeFrom(*Config::GetTinkKeyTypeEntry(
-      DeterministicAeadConfig::kCatalogueName,
-      DeterministicAeadConfig::kPrimitiveName, "AesSivKey", 0, true));
-  config->set_config_name("TINK_DAEAD");
-  return config;
-}
-
-}  // anonymous namespace
-
-constexpr char DeterministicAeadConfig::kCatalogueName[];
-constexpr char DeterministicAeadConfig::kPrimitiveName[];
-
 // static
-const google::crypto::tink::RegistryConfig& DeterministicAeadConfig::Latest() {
-  static const auto config = GenerateRegistryConfig();
+const RegistryConfig& DeterministicAeadConfig::Latest() {
+  static const RegistryConfig* config = new RegistryConfig();
   return *config;
 }
 
 // static
 util::Status DeterministicAeadConfig::Register() {
-  auto status = Registry::AddCatalogue(
-      kCatalogueName, absl::make_unique<DeterministicAeadCatalogue>());
+  // Register key manager.
+  auto status = Registry::RegisterKeyTypeManager(
+      absl::make_unique<AesSivKeyManager>(), true);
   if (!status.ok()) return status;
-  return Config::Register(Latest());
+
+  // Register primitive wrapper.
+  return Registry::RegisterPrimitiveWrapper(
+      absl::make_unique<DeterministicAeadWrapper>());
 }
 
 }  // namespace tink
diff --git a/cc/daead/deterministic_aead_config.h b/cc/daead/deterministic_aead_config.h
index 38f93fa..1441fdd 100644
--- a/cc/daead/deterministic_aead_config.h
+++ b/cc/daead/deterministic_aead_config.h
@@ -14,10 +14,10 @@
 //
 ///////////////////////////////////////////////////////////////////////////////
 
-#ifndef TINK_DAEAD_DAEAD_CONFIG_H_
-#define TINK_DAEAD_DAEAD_CONFIG_H_
+#ifndef TINK_DAEAD_DETERMINISTIC_AEAD_CONFIG_H_
+#define TINK_DAEAD_DETERMINISTIC_AEAD_CONFIG_H_
 
-#include "tink/config.h"
+#include "absl/base/macros.h"
 #include "tink/util/status.h"
 #include "proto/config.pb.h"
 
@@ -33,8 +33,6 @@
 //
 //   auto status = DeterministicAeadConfig::Register();
 //
-// For more information on creation and usage of DeterministicAead instances
-// see DeterministicAeadFactory.
 class DeterministicAeadConfig {
  public:
   static constexpr char kCatalogueName[] = "TinkDeterministicAead";
@@ -42,10 +40,11 @@
 
   // Returns config of DeterministicAead implementations supported
   // in the current Tink release.
+  ABSL_DEPRECATED("This is not supported anymore.")
   static const google::crypto::tink::RegistryConfig& Latest();
 
-  // Registers key managers for all DeterministicAead key types
-  // from the current Tink release.
+  // Registers DeterministicAead primitive wrapper and key managers for all
+  // DeterministicAead key types from the current Tink release.
   static crypto::tink::util::Status Register();
 
  private:
@@ -55,4 +54,4 @@
 }  // namespace tink
 }  // namespace crypto
 
-#endif  // TINK_DAEAD_DAEAD_CONFIG_H_
+#endif  // TINK_DAEAD_DETERMINISTIC_AEAD_CONFIG_H_
diff --git a/cc/daead/deterministic_aead_config_test.cc b/cc/daead/deterministic_aead_config_test.cc
index 137715b..e05cf16 100644
--- a/cc/daead/deterministic_aead_config_test.cc
+++ b/cc/daead/deterministic_aead_config_test.cc
@@ -18,13 +18,14 @@
 
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "tink/catalogue.h"
 #include "tink/config.h"
+#include "tink/daead/aes_siv_key_manager.h"
 #include "tink/daead/deterministic_aead_key_templates.h"
 #include "tink/deterministic_aead.h"
 #include "tink/keyset_handle.h"
 #include "tink/registry.h"
 #include "tink/util/status.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
 
 namespace crypto {
@@ -32,79 +33,25 @@
 namespace {
 
 using ::crypto::tink::test::DummyDeterministicAead;
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
 using ::testing::Eq;
 
-class DummyDaeadCatalogue : public Catalogue<DeterministicAead> {
- public:
-  DummyDaeadCatalogue() {}
-
-  crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<DeterministicAead>>>
-  GetKeyManager(const std::string& type_url, const std::string& primitive_name,
-                uint32_t min_version) const override {
-    return util::Status::UNKNOWN;
-  }
-};
-
 class DeterministicAeadConfigTest : public ::testing::Test {
  protected:
   void SetUp() override { Registry::Reset(); }
 };
 
-TEST_F(DeterministicAeadConfigTest, testBasic) {
-  std::string aes_siv_key_type = "type.googleapis.com/google.crypto.tink.AesSivKey";
-  auto& config = DeterministicAeadConfig::Latest();
-
-  EXPECT_EQ(1, DeterministicAeadConfig::Latest().entry_size());
-
-  EXPECT_EQ("TinkDeterministicAead", config.entry(0).catalogue_name());
-  EXPECT_EQ("DeterministicAead", config.entry(0).primitive_name());
-  EXPECT_EQ(aes_siv_key_type, config.entry(0).type_url());
-  EXPECT_EQ(true, config.entry(0).new_key_allowed());
-  EXPECT_EQ(0, config.entry(0).key_manager_version());
-
-  // No key manager before registration.
-  auto manager_result =
-      Registry::get_key_manager<DeterministicAead>(aes_siv_key_type);
-  EXPECT_FALSE(manager_result.ok());
-  EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-
-  // Registration of standard key types works.
-  auto status = DeterministicAeadConfig::Register();
-  EXPECT_TRUE(status.ok()) << status;
-  manager_result =
-      Registry::get_key_manager<DeterministicAead>(aes_siv_key_type);
-  EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-  EXPECT_TRUE(manager_result.ValueOrDie()->DoesSupport(aes_siv_key_type));
-}
-
-TEST_F(DeterministicAeadConfigTest, testRegister) {
-  std::string key_type = "type.googleapis.com/google.crypto.tink.AesSivKey";
-
-  // Try on empty registry.
-  auto status = Config::Register(DeterministicAeadConfig::Latest());
-  EXPECT_FALSE(status.ok());
-  EXPECT_EQ(util::error::NOT_FOUND, status.error_code());
-  auto manager_result = Registry::get_key_manager<DeterministicAead>(key_type);
-  EXPECT_FALSE(manager_result.ok());
-
-  // Register and try again.
-  status = DeterministicAeadConfig::Register();
-  EXPECT_TRUE(status.ok()) << status;
-  manager_result = Registry::get_key_manager<DeterministicAead>(key_type);
-  EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-
-  // Try Register() again, should succeed (idempotence).
-  status = DeterministicAeadConfig::Register();
-  EXPECT_TRUE(status.ok()) << status;
-
-  // Reset the registry, and try overriding a catalogue with a different one.
-  Registry::Reset();
-  status = Registry::AddCatalogue("TinkDeterministicAead",
-                                  absl::make_unique<DummyDaeadCatalogue>());
-  EXPECT_TRUE(status.ok()) << status;
-  status = DeterministicAeadConfig::Register();
-  EXPECT_FALSE(status.ok());
-  EXPECT_EQ(util::error::ALREADY_EXISTS, status.error_code());
+TEST_F(DeterministicAeadConfigTest, Basic) {
+  EXPECT_THAT(Registry::get_key_manager<DeterministicAead>(
+                  AesSivKeyManager().get_key_type())
+                  .status(),
+              StatusIs(util::error::NOT_FOUND));
+  EXPECT_THAT(DeterministicAeadConfig::Register(), IsOk());
+  EXPECT_THAT(Registry::get_key_manager<DeterministicAead>(
+                  AesSivKeyManager().get_key_type())
+                  .status(),
+              IsOk());
 }
 
 // Tests that the DeterministicAeadWrapper has been properly registered and we
@@ -117,11 +64,13 @@
   key.set_key_id(1234);
   key.set_output_prefix_type(google::crypto::tink::OutputPrefixType::RAW);
   auto primitive_set = absl::make_unique<PrimitiveSet<DeterministicAead>>();
-  primitive_set->set_primary(
-      primitive_set
-          ->AddPrimitive(absl::make_unique<DummyDeterministicAead>("dummy"),
-                         key)
-          .ValueOrDie());
+  ASSERT_THAT(
+      primitive_set->set_primary(
+          primitive_set
+              ->AddPrimitive(absl::make_unique<DummyDeterministicAead>("dummy"),
+                             key)
+              .ValueOrDie()),
+      IsOk());
 
   auto registry_wrapped = Registry::Wrap(std::move(primitive_set));
 
diff --git a/cc/daead/deterministic_aead_factory_test.cc b/cc/daead/deterministic_aead_factory_test.cc
index ad4ad1d..90363c4 100644
--- a/cc/daead/deterministic_aead_factory_test.cc
+++ b/cc/daead/deterministic_aead_factory_test.cc
@@ -16,18 +16,18 @@
 #include "tink/daead/deterministic_aead_factory.h"
 
 #include "gtest/gtest.h"
+#include "tink/core/key_manager_impl.h"
 #include "tink/crypto_format.h"
 #include "tink/daead/aes_siv_key_manager.h"
 #include "tink/daead/deterministic_aead_config.h"
 #include "tink/deterministic_aead.h"
 #include "tink/keyset_handle.h"
-#include "tink/util/keyset_util.h"
+#include "tink/util/test_keyset_handle.h"
 #include "tink/util/status.h"
 #include "tink/util/test_util.h"
 #include "proto/aes_siv.pb.h"
-#include "proto/tink.pb.h"
 
-using crypto::tink::KeysetUtil;
+using crypto::tink::TestKeysetHandle;
 using crypto::tink::test::AddRawKey;
 using crypto::tink::test::AddTinkKey;
 using google::crypto::tink::AesSivKeyFormat;
@@ -45,7 +45,7 @@
 TEST_F(DeterministicAeadFactoryTest, testBasic) {
   Keyset keyset;
   auto daead_result = DeterministicAeadFactory::GetPrimitive(
-      *KeysetUtil::GetKeysetHandle(keyset));
+      *TestKeysetHandle::GetKeysetHandle(keyset));
   EXPECT_FALSE(daead_result.ok());
   EXPECT_EQ(util::error::INVALID_ARGUMENT, daead_result.status().error_code());
   EXPECT_PRED_FORMAT2(testing::IsSubstring, "at least one key",
@@ -54,9 +54,11 @@
 
 TEST_F(DeterministicAeadFactoryTest, testPrimitive) {
   // Prepare a template for generating keys for a Keyset.
-  AesSivKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-  std::string key_type = key_manager.get_key_type();
+  AesSivKeyManager key_type_manager;
+  auto key_manager =
+      internal::MakeKeyManager<DeterministicAead>(&key_type_manager);
+  const KeyFactory& key_factory = key_manager->get_key_factory();
+  std::string key_type = key_manager->get_key_type();
 
   AesSivKeyFormat key_format;
   key_format.set_key_size(64);
@@ -85,7 +87,7 @@
 
   // Create a KeysetHandle and use it with the factory.
   auto daead_result = DeterministicAeadFactory::GetPrimitive(
-      *KeysetUtil::GetKeysetHandle(keyset));
+      *TestKeysetHandle::GetKeysetHandle(keyset));
   EXPECT_TRUE(daead_result.ok()) << daead_result.status();
   auto daead = std::move(daead_result.ValueOrDie());
 
@@ -114,7 +116,7 @@
   // Create raw ciphertext with 2nd key, and decrypt
   // with DeterministicAead-instance.
   auto raw_daead = std::move(
-      key_manager.GetPrimitive(keyset.key(1).key_data()).ValueOrDie());
+      key_manager->GetPrimitive(keyset.key(1).key_data()).ValueOrDie());
   std::string raw_ciphertext =
       raw_daead->EncryptDeterministically(plaintext, aad).ValueOrDie();
   decrypt_result = daead->DecryptDeterministically(ciphertext, aad);
diff --git a/cc/daead/deterministic_aead_key_templates_test.cc b/cc/daead/deterministic_aead_key_templates_test.cc
index daa19d2..3d87baf 100644
--- a/cc/daead/deterministic_aead_key_templates_test.cc
+++ b/cc/daead/deterministic_aead_key_templates_test.cc
@@ -17,13 +17,13 @@
 #include "tink/daead/deterministic_aead_key_templates.h"
 
 #include "gtest/gtest.h"
+#include "tink/core/key_manager_impl.h"
 #include "tink/daead/aes_siv_key_manager.h"
 #include "proto/aes_siv.pb.h"
 #include "proto/common.pb.h"
 #include "proto/tink.pb.h"
 
 using google::crypto::tink::AesSivKeyFormat;
-using google::crypto::tink::HashType;
 using google::crypto::tink::KeyTemplate;
 using google::crypto::tink::OutputPrefixType;
 
@@ -50,10 +50,12 @@
     EXPECT_EQ(&key_template, &key_template_2);
 
     // Check that the template works with the key manager.
-    AesSivKeyManager key_manager;
-    EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
+    AesSivKeyManager key_type_manager;
+    auto key_manager =
+        internal::MakeKeyManager<DeterministicAead>(&key_type_manager);
+    EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
     auto new_key_result =
-        key_manager.get_key_factory().NewKey(key_template.value());
+        key_manager->get_key_factory().NewKey(key_template.value());
     EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
   }
 }
diff --git a/cc/daead/deterministic_aead_wrapper_test.cc b/cc/daead/deterministic_aead_wrapper_test.cc
index 388628d..71110f1 100644
--- a/cc/daead/deterministic_aead_wrapper_test.cc
+++ b/cc/daead/deterministic_aead_wrapper_test.cc
@@ -15,16 +15,20 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 #include "tink/daead/deterministic_aead_wrapper.h"
+
 #include "gtest/gtest.h"
 #include "absl/memory/memory.h"
 #include "tink/deterministic_aead.h"
 #include "tink/primitive_set.h"
 #include "tink/util/status.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
 
-using crypto::tink::test::DummyDeterministicAead;
-using google::crypto::tink::Keyset;
-using google::crypto::tink::OutputPrefixType;
+using ::crypto::tink::test::DummyDeterministicAead;
+using ::crypto::tink::test::IsOk;
+using ::google::crypto::tink::Keyset;
+using ::google::crypto::tink::KeyStatusType;
+using ::google::crypto::tink::OutputPrefixType;
 
 namespace crypto {
 namespace tink {
@@ -68,16 +72,19 @@
     key = keyset.add_key();
     key->set_output_prefix_type(OutputPrefixType::TINK);
     key->set_key_id(key_id_0);
+    key->set_status(KeyStatusType::ENABLED);
 
     uint32_t key_id_1 = 726329;
     key = keyset.add_key();
     key->set_output_prefix_type(OutputPrefixType::LEGACY);
     key->set_key_id(key_id_1);
+    key->set_status(KeyStatusType::ENABLED);
 
     uint32_t key_id_2 = 7213743;
     key = keyset.add_key();
     key->set_output_prefix_type(OutputPrefixType::TINK);
     key->set_key_id(key_id_2);
+    key->set_status(KeyStatusType::ENABLED);
 
     std::string daead_name_0 = "daead0";
     std::string daead_name_1 = "daead1";
@@ -96,7 +103,7 @@
     entry_result = daead_set->AddPrimitive(std::move(daead), keyset.key(2));
     ASSERT_TRUE(entry_result.ok());
     // The last key is the primary.
-    daead_set->set_primary(entry_result.ValueOrDie());
+    ASSERT_THAT(daead_set->set_primary(entry_result.ValueOrDie()), IsOk());
 
     // Wrap daead_set and test the resulting DeterministicAead.
     auto daead_result =
diff --git a/cc/hybrid/BUILD.bazel b/cc/hybrid/BUILD.bazel
index 0a229c4..a19fe54 100644
--- a/cc/hybrid/BUILD.bazel
+++ b/cc/hybrid/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 cc_library(
     name = "hybrid_config",
@@ -8,13 +8,18 @@
     hdrs = ["hybrid_config.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
-        ":hybrid_decrypt_catalogue",
-        ":hybrid_encrypt_catalogue",
-        "//cc:config",
+        ":ecies_aead_hkdf_private_key_manager",
+        ":ecies_aead_hkdf_public_key_manager",
+        ":hybrid_decrypt_wrapper",
+        ":hybrid_encrypt_wrapper",
+        "//cc:registry",
         "//cc/aead:aead_config",
+        "//cc/config:config_util",
         "//cc/util:status",
         "//proto:config_cc_proto",
+        "@com_google_absl//absl/base:core_headers",
         "@com_google_absl//absl/memory",
     ],
 )
@@ -58,22 +63,6 @@
 )
 
 cc_library(
-    name = "hybrid_decrypt_catalogue",
-    srcs = ["hybrid_decrypt_catalogue.cc"],
-    hdrs = ["hybrid_decrypt_catalogue.h"],
-    include_prefix = "tink",
-    strip_include_prefix = "/cc",
-    deps = [
-        ":ecies_aead_hkdf_private_key_manager",
-        "//cc:catalogue",
-        "//cc:hybrid_decrypt",
-        "//cc:key_manager",
-        "//cc/util:status",
-        "//cc/util:statusor",
-    ],
-)
-
-cc_library(
     name = "hybrid_decrypt_factory",
     srcs = ["hybrid_decrypt_factory.cc"],
     hdrs = ["hybrid_decrypt_factory.h"],
@@ -93,22 +82,6 @@
 )
 
 cc_library(
-    name = "hybrid_encrypt_catalogue",
-    srcs = ["hybrid_encrypt_catalogue.cc"],
-    hdrs = ["hybrid_encrypt_catalogue.h"],
-    include_prefix = "tink",
-    strip_include_prefix = "/cc",
-    deps = [
-        ":ecies_aead_hkdf_public_key_manager",
-        "//cc:catalogue",
-        "//cc:hybrid_encrypt",
-        "//cc:key_manager",
-        "//cc/util:status",
-        "//cc/util:statusor",
-    ],
-)
-
-cc_library(
     name = "hybrid_encrypt_factory",
     srcs = ["hybrid_encrypt_factory.cc"],
     hdrs = ["hybrid_encrypt_factory.h"],
@@ -133,6 +106,7 @@
     hdrs = ["hybrid_key_templates.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         "//cc/aead:aead_key_templates",
         "//proto:common_cc_proto",
@@ -160,6 +134,7 @@
         "//proto:aes_gcm_cc_proto",
         "//proto:common_cc_proto",
         "//proto:tink_cc_proto",
+        "//proto:xchacha20_poly1305_cc_proto",
         "@com_google_absl//absl/memory",
     ],
 )
@@ -221,10 +196,12 @@
     deps = [
         ":ecies_aead_hkdf_hybrid_decrypt",
         ":ecies_aead_hkdf_public_key_manager",
+        "//cc:core/key_type_manager",
+        "//cc:core/private_key_type_manager",
         "//cc:hybrid_decrypt",
         "//cc:key_manager",
-        "//cc:key_manager_base",
         "//cc/subtle:subtle_util_boringssl",
+        "//cc/util:constants",
         "//cc/util:enums",
         "//cc/util:errors",
         "//cc/util:protobuf_helper",
@@ -250,10 +227,11 @@
     ],
     deps = [
         ":ecies_aead_hkdf_hybrid_encrypt",
+        "//cc:core/key_type_manager",
         "//cc:hybrid_encrypt",
         "//cc:key_manager",
-        "//cc:key_manager_base",
         "//cc:registry",
+        "//cc/util:constants",
         "//cc/util:protobuf_helper",
         "//cc/util:status",
         "//cc/util:statusor",
@@ -273,7 +251,6 @@
     deps = [
         ":hybrid_config",
         ":hybrid_key_templates",
-        "//cc:catalogue",
         "//cc:config",
         "//cc:hybrid_decrypt",
         "//cc:hybrid_encrypt",
@@ -296,6 +273,7 @@
         "//cc:hybrid_decrypt",
         "//cc:primitive_set",
         "//cc/util:status",
+        "//cc/util:test_matchers",
         "//cc/util:test_util",
         "//proto:tink_cc_proto",
         "@com_google_googletest//:gtest_main",
@@ -312,6 +290,7 @@
         "//cc:hybrid_encrypt",
         "//cc:primitive_set",
         "//cc/util:status",
+        "//cc/util:test_matchers",
         "//cc/util:test_util",
         "//proto:tink_cc_proto",
         "@com_google_googletest//:gtest_main",
@@ -319,21 +298,6 @@
 )
 
 cc_test(
-    name = "hybrid_decrypt_catalogue_test",
-    size = "small",
-    srcs = ["hybrid_decrypt_catalogue_test.cc"],
-    copts = ["-Iexternal/gtest/include"],
-    deps = [
-        ":hybrid_decrypt_catalogue",
-        "//cc:catalogue",
-        "//cc:hybrid_decrypt",
-        "//cc/util:status",
-        "//cc/util:statusor",
-        "@com_google_googletest//:gtest_main",
-    ],
-)
-
-cc_test(
     name = "hybrid_decrypt_factory_test",
     size = "small",
     srcs = ["hybrid_decrypt_factory_test.cc"],
@@ -346,8 +310,8 @@
         "//cc:hybrid_decrypt",
         "//cc:hybrid_encrypt",
         "//cc:keyset_handle",
-        "//cc/util:keyset_util",
         "//cc/util:status",
+        "//cc/util:test_keyset_handle",
         "//cc/util:test_util",
         "//proto:ecies_aead_hkdf_cc_proto",
         "//proto:tink_cc_proto",
@@ -357,21 +321,6 @@
 )
 
 cc_test(
-    name = "hybrid_encrypt_catalogue_test",
-    size = "small",
-    srcs = ["hybrid_encrypt_catalogue_test.cc"],
-    copts = ["-Iexternal/gtest/include"],
-    deps = [
-        ":hybrid_encrypt_catalogue",
-        "//cc:catalogue",
-        "//cc:hybrid_encrypt",
-        "//cc/util:status",
-        "//cc/util:statusor",
-        "@com_google_googletest//:gtest_main",
-    ],
-)
-
-cc_test(
     name = "hybrid_encrypt_factory_test",
     size = "small",
     srcs = ["hybrid_encrypt_factory_test.cc"],
@@ -382,8 +331,8 @@
         "//cc:config",
         "//cc:hybrid_encrypt",
         "//cc:keyset_handle",
-        "//cc/util:keyset_util",
         "//cc/util:status",
+        "//cc/util:test_keyset_handle",
         "//cc/util:test_util",
         "//proto:ecies_aead_hkdf_cc_proto",
         "//proto:tink_cc_proto",
@@ -401,6 +350,7 @@
         ":hybrid_config",
         ":hybrid_key_templates",
         "//cc/aead:aead_key_templates",
+        "//cc/util:test_matchers",
         "//proto:common_cc_proto",
         "//proto:ecies_aead_hkdf_cc_proto",
         "//proto:tink_cc_proto",
@@ -417,7 +367,9 @@
         ":ecies_aead_hkdf_hybrid_decrypt",
         ":ecies_aead_hkdf_hybrid_encrypt",
         "//cc:hybrid_decrypt",
+        "//cc/aead:aes_ctr_hmac_aead_key_manager",
         "//cc/aead:aes_gcm_key_manager",
+        "//cc/aead:xchacha20_poly1305_key_manager",
         "//cc/subtle:random",
         "//cc/subtle:subtle_util_boringssl",
         "//cc/util:enums",
@@ -467,8 +419,10 @@
         "//cc/aead:aead_key_templates",
         "//cc/aead:aes_ctr_hmac_aead_key_manager",
         "//cc/aead:aes_gcm_key_manager",
+        "//cc/subtle:hybrid_test_util",
         "//cc/util:status",
         "//cc/util:statusor",
+        "//cc/util:test_matchers",
         "//cc/util:test_util",
         "//proto:aes_eax_cc_proto",
         "//proto:common_cc_proto",
@@ -484,12 +438,15 @@
     srcs = ["ecies_aead_hkdf_public_key_manager_test.cc"],
     copts = ["-Iexternal/gtest/include"],
     deps = [
+        ":ecies_aead_hkdf_private_key_manager",
         ":ecies_aead_hkdf_public_key_manager",
         "//cc:hybrid_encrypt",
         "//cc:registry",
+        "//cc/aead:aead_key_templates",
         "//cc/aead:aes_gcm_key_manager",
         "//cc/util:status",
         "//cc/util:statusor",
+        "//cc/util:test_matchers",
         "//cc/util:test_util",
         "//proto:aes_eax_cc_proto",
         "//proto:common_cc_proto",
diff --git a/cc/hybrid/BUILD.gn b/cc/hybrid/BUILD.gn
index 1dd42ad..eec8c85 100644
--- a/cc/hybrid/BUILD.gn
+++ b/cc/hybrid/BUILD.gn
@@ -10,12 +10,16 @@
     "hybrid_config.h",
   ]
   public_deps = [
-    ":hybrid_decrypt_catalogue",
-    ":hybrid_encrypt_catalogue",
-    "//third_party/tink/cc:config",
+    ":ecies_aead_hkdf_private_key_manager",
+    ":ecies_aead_hkdf_public_key_manager",
+    ":hybrid_decrypt_wrapper",
+    ":hybrid_encrypt_wrapper",
+    "//third_party/tink/cc:registry",
     "//third_party/tink/cc/aead:aead_config",
+    "//third_party/tink/cc/config:config_util",
     "//third_party/tink/cc/util:status",
     "//third_party/tink/proto:config_proto",
+    "//third_party/abseil-cpp/absl/base:core_headers",
     "//third_party/abseil-cpp/absl/memory:memory",
   ]
   public_configs = [ "//third_party/tink:tink_config" ]
@@ -63,24 +67,6 @@
   public_configs = [ "//third_party/tink:tink_config" ]
 }
 
-# CC Library : hybrid_decrypt_catalogue
-source_set("hybrid_decrypt_catalogue") {
-  configs -= [ "//build/config:no_rtti" ]
-  sources = [
-    "hybrid_decrypt_catalogue.cc",
-    "hybrid_decrypt_catalogue.h",
-  ]
-  public_deps = [
-    ":ecies_aead_hkdf_private_key_manager",
-    "//third_party/tink/cc:catalogue",
-    "//third_party/tink/cc:hybrid_decrypt",
-    "//third_party/tink/cc:key_manager",
-    "//third_party/tink/cc/util:status",
-    "//third_party/tink/cc/util:statusor",
-  ]
-  public_configs = [ "//third_party/tink:tink_config" ]
-}
-
 # CC Library : hybrid_decrypt_factory
 source_set("hybrid_decrypt_factory") {
   configs -= [ "//build/config:no_rtti" ]
@@ -102,24 +88,6 @@
   public_configs = [ "//third_party/tink:tink_config" ]
 }
 
-# CC Library : hybrid_encrypt_catalogue
-source_set("hybrid_encrypt_catalogue") {
-  configs -= [ "//build/config:no_rtti" ]
-  sources = [
-    "hybrid_encrypt_catalogue.cc",
-    "hybrid_encrypt_catalogue.h",
-  ]
-  public_deps = [
-    ":ecies_aead_hkdf_public_key_manager",
-    "//third_party/tink/cc:catalogue",
-    "//third_party/tink/cc:hybrid_encrypt",
-    "//third_party/tink/cc:key_manager",
-    "//third_party/tink/cc/util:status",
-    "//third_party/tink/cc/util:statusor",
-  ]
-  public_configs = [ "//third_party/tink:tink_config" ]
-}
-
 # CC Library : hybrid_encrypt_factory
 source_set("hybrid_encrypt_factory") {
   configs -= [ "//build/config:no_rtti" ]
@@ -176,6 +144,7 @@
     "//third_party/tink/proto:aes_gcm_proto",
     "//third_party/tink/proto:common_proto",
     "//third_party/tink/proto:tink_proto",
+    "//third_party/tink/proto:xchacha20_poly1305_proto",
     "//third_party/abseil-cpp/absl/memory:memory",
   ]
   public_configs = [ "//third_party/tink:tink_config" ]
@@ -237,10 +206,12 @@
   public_deps = [
     ":ecies_aead_hkdf_hybrid_decrypt",
     ":ecies_aead_hkdf_public_key_manager",
+    "//third_party/tink/cc/core:core/key_type_manager",
+    "//third_party/tink/cc/core:core/private_key_type_manager",
     "//third_party/tink/cc:hybrid_decrypt",
     "//third_party/tink/cc:key_manager",
-    "//third_party/tink/cc/core:key_manager_base",
     "//third_party/tink/cc/subtle:subtle_util_boringssl",
+    "//third_party/tink/cc/util:constants",
     "//third_party/tink/cc/util:enums",
     "//third_party/tink/cc/util:errors",
     "//third_party/tink/cc/util:protobuf_helper",
@@ -264,10 +235,11 @@
   ]
   public_deps = [
     ":ecies_aead_hkdf_hybrid_encrypt",
+    "//third_party/tink/cc/core:core/key_type_manager",
     "//third_party/tink/cc:hybrid_encrypt",
     "//third_party/tink/cc:key_manager",
-    "//third_party/tink/cc/core:key_manager_base",
     "//third_party/tink/cc:registry",
+    "//third_party/tink/cc/util:constants",
     "//third_party/tink/cc/util:protobuf_helper",
     "//third_party/tink/cc/util:status",
     "//third_party/tink/cc/util:statusor",
diff --git a/cc/hybrid/CMakeLists.txt b/cc/hybrid/CMakeLists.txt
new file mode 100644
index 0000000..a46baa6
--- /dev/null
+++ b/cc/hybrid/CMakeLists.txt
@@ -0,0 +1,380 @@
+tink_module(hybrid)
+
+tink_cc_library(
+  NAME hybrid_config
+  SRCS
+    hybrid_config.cc
+    hybrid_config.h
+  DEPS
+    tink::hybrid::ecies_aead_hkdf_private_key_manager
+    tink::hybrid::ecies_aead_hkdf_public_key_manager
+    tink::hybrid::hybrid_decrypt_wrapper
+    tink::hybrid::hybrid_encrypt_wrapper
+    tink::core::registry
+    tink::config::config_util
+    tink::aead::aead_config
+    tink::util::status
+    tink::proto::config_cc_proto
+    absl::base
+    absl::memory
+)
+
+tink_cc_library(
+  NAME hybrid_decrypt_wrapper
+  SRCS
+    hybrid_decrypt_wrapper.cc
+    hybrid_decrypt_wrapper.h
+  DEPS
+    tink::core::crypto_format
+    tink::core::hybrid_decrypt
+    tink::core::primitive_set
+    tink::core::primitive_wrapper
+    tink::subtle::subtle_util_boringssl
+    tink::util::status
+    tink::util::statusor
+    tink::proto::tink_cc_proto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME hybrid_encrypt_wrapper
+  SRCS
+    hybrid_encrypt_wrapper.cc
+    hybrid_encrypt_wrapper.h
+  DEPS
+    tink::core::crypto_format
+    tink::core::hybrid_encrypt
+    tink::core::primitive_set
+    tink::core::primitive_wrapper
+    tink::subtle::subtle_util_boringssl
+    tink::util::status
+    tink::util::statusor
+    tink::proto::tink_cc_proto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME hybrid_decrypt_factory
+  SRCS
+    hybrid_decrypt_factory.cc
+    hybrid_decrypt_factory.h
+  DEPS
+    tink::hybrid::hybrid_decrypt_wrapper
+    tink::core::hybrid_decrypt
+    tink::core::key_manager
+    tink::core::keyset_handle
+    tink::core::primitive_set
+    tink::core::registry
+    tink::util::status
+    tink::util::statusor
+    absl::base
+)
+
+tink_cc_library(
+  NAME hybrid_encrypt_factory
+  SRCS
+    hybrid_encrypt_factory.cc
+    hybrid_encrypt_factory.h
+  DEPS
+    tink::hybrid::hybrid_encrypt_wrapper
+    tink::core::hybrid_encrypt
+    tink::core::key_manager
+    tink::core::keyset_handle
+    tink::core::primitive_set
+    tink::core::registry
+    tink::util::status
+    tink::util::statusor
+    absl::base
+)
+
+tink_cc_library(
+  NAME hybrid_key_templates
+  SRCS
+    hybrid_key_templates.cc
+    hybrid_key_templates.h
+  DEPS
+    tink::aead::aead_key_templates
+    tink::proto::common_cc_proto
+    tink::proto::ecies_aead_hkdf_cc_proto
+    tink::proto::tink_cc_proto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME ecies_aead_hkdf_dem_helper
+  SRCS
+    ecies_aead_hkdf_dem_helper.cc
+    ecies_aead_hkdf_dem_helper.h
+  DEPS
+    tink::core::aead
+    tink::core::key_manager
+    tink::core::registry
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::proto::aes_ctr_hmac_aead_cc_proto
+    tink::proto::aes_gcm_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::tink_cc_proto
+    tink::proto::xchacha20_poly1305_cc_proto
+    absl::memory
+)
+
+tink_cc_library(
+  NAME ecies_aead_hkdf_hybrid_decrypt
+  SRCS
+    ecies_aead_hkdf_hybrid_decrypt.cc
+    ecies_aead_hkdf_hybrid_decrypt.h
+  DEPS
+    tink::hybrid::ecies_aead_hkdf_dem_helper
+    tink::core::hybrid_decrypt
+    tink::subtle::ec_util
+    tink::subtle::ecies_hkdf_recipient_kem_boringssl
+    tink::util::enums
+    tink::util::status
+    tink::util::statusor
+    tink::proto::common_cc_proto
+    tink::proto::ecies_aead_hkdf_cc_proto
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_library(
+  NAME ecies_aead_hkdf_hybrid_encrypt
+  SRCS
+    ecies_aead_hkdf_hybrid_encrypt.cc
+    ecies_aead_hkdf_hybrid_encrypt.h
+  DEPS
+    tink::hybrid::ecies_aead_hkdf_dem_helper
+    tink::core::aead
+    tink::core::hybrid_encrypt
+    tink::core::key_manager
+    tink::core::registry
+    tink::subtle::ecies_hkdf_sender_kem_boringssl
+    tink::util::enums
+    tink::util::status
+    tink::util::statusor
+    tink::proto::common_cc_proto
+    tink::proto::ecies_aead_hkdf_cc_proto
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_library(
+  NAME ecies_aead_hkdf_private_key_manager
+  SRCS
+    ecies_aead_hkdf_private_key_manager.cc
+    ecies_aead_hkdf_private_key_manager.h
+  DEPS
+    tink::hybrid::ecies_aead_hkdf_hybrid_decrypt
+    tink::hybrid::ecies_aead_hkdf_public_key_manager
+    tink::core::hybrid_decrypt
+    tink::core::key_manager
+    tink::core::key_type_manager
+    tink::core::private_key_type_manager
+    tink::subtle::subtle_util_boringssl
+    tink::util::constants
+    tink::util::enums
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::util::validation
+    tink::proto::ecies_aead_hkdf_cc_proto
+    tink::proto::tink_cc_proto
+    absl::memory
+    absl::strings
+)
+
+tink_cc_library(
+  NAME ecies_aead_hkdf_public_key_manager
+  SRCS
+    ecies_aead_hkdf_public_key_manager.cc
+    ecies_aead_hkdf_public_key_manager.h
+  DEPS
+    tink::hybrid::ecies_aead_hkdf_hybrid_encrypt
+    tink::core::hybrid_encrypt
+    tink::core::key_manager
+    tink::core::key_type_manager
+    tink::core::registry
+    tink::util::constants
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::proto::common_cc_proto
+    tink::proto::ecies_aead_hkdf_cc_proto
+    tink::proto::tink_cc_proto
+)
+
+# tests
+
+tink_cc_test(
+  NAME hybrid_config_test
+  SRCS hybrid_config_test.cc
+  DEPS
+    tink::hybrid::hybrid_config
+    tink::hybrid::hybrid_key_templates
+    tink::core::config
+    tink::core::hybrid_decrypt
+    tink::core::hybrid_encrypt
+    tink::core::keyset_handle
+    tink::core::registry
+    tink::util::status
+    tink::util::test_matchers
+    tink::util::test_util
+)
+
+tink_cc_test(
+  NAME hybrid_decrypt_wrapper_test
+  SRCS hybrid_decrypt_wrapper_test.cc
+  DEPS
+    tink::hybrid::hybrid_decrypt_wrapper
+    tink::core::hybrid_decrypt
+    tink::core::primitive_set
+    tink::util::status
+    tink::util::test_matchers
+    tink::util::test_util
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME hybrid_encrypt_wrapper_test
+  SRCS hybrid_encrypt_wrapper_test.cc
+  DEPS
+    tink::hybrid::hybrid_encrypt_wrapper
+    tink::core::hybrid_encrypt
+    tink::core::primitive_set
+    tink::util::status
+    tink::util::test_matchers
+    tink::util::test_util
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME hybrid_decrypt_factory_test
+  SRCS hybrid_decrypt_factory_test.cc
+  DEPS
+    tink::hybrid::ecies_aead_hkdf_public_key_manager
+    tink::hybrid::hybrid_config
+    tink::hybrid::hybrid_decrypt_factory
+    tink::core::config
+    tink::core::hybrid_decrypt
+    tink::core::hybrid_encrypt
+    tink::core::keyset_handle
+    tink::util::test_keyset_handle
+    tink::util::status
+    tink::util::test_util
+    tink::proto::ecies_aead_hkdf_cc_proto
+    tink::proto::tink_cc_proto
+    absl::memory
+)
+
+tink_cc_test(
+  NAME hybrid_encrypt_factory_test
+  SRCS hybrid_encrypt_factory_test.cc
+  DEPS
+    tink::hybrid::hybrid_config
+    tink::hybrid::hybrid_encrypt_factory
+    tink::core::config
+    tink::core::hybrid_encrypt
+    tink::core::keyset_handle
+    tink::util::test_keyset_handle
+    tink::util::status
+    tink::util::test_util
+    tink::proto::ecies_aead_hkdf_cc_proto
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME hybrid_key_templates_test
+  SRCS hybrid_key_templates_test.cc
+  DEPS
+    tink::hybrid::ecies_aead_hkdf_private_key_manager
+    tink::hybrid::hybrid_config
+    tink::hybrid::hybrid_key_templates
+    tink::aead::aead_key_templates
+    tink::proto::common_cc_proto
+    tink::proto::ecies_aead_hkdf_cc_proto
+    tink::proto::tink_cc_proto
+    tink::util::test_matchers
+)
+
+tink_cc_test(
+  NAME ecies_aead_hkdf_hybrid_decrypt_test
+  SRCS ecies_aead_hkdf_hybrid_decrypt_test.cc
+  DEPS
+    tink::hybrid::ecies_aead_hkdf_hybrid_decrypt
+    tink::hybrid::ecies_aead_hkdf_hybrid_encrypt
+    tink::core::hybrid_decrypt
+    tink::aead::aes_ctr_hmac_aead_key_manager
+    tink::aead::aes_gcm_key_manager
+    tink::aead::xchacha20_poly1305_key_manager
+    tink::subtle::random
+    tink::subtle::subtle_util_boringssl
+    tink::util::enums
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+    tink::proto::common_cc_proto
+    tink::proto::ecies_aead_hkdf_cc_proto
+    absl::memory
+)
+
+tink_cc_test(
+  NAME ecies_aead_hkdf_hybrid_encrypt_test
+  SRCS ecies_aead_hkdf_hybrid_encrypt_test.cc
+  DEPS
+    tink::hybrid::ecies_aead_hkdf_hybrid_encrypt
+    tink::core::hybrid_encrypt
+    tink::core::registry
+    tink::aead::aes_gcm_key_manager
+    tink::subtle::random
+    tink::subtle::subtle_util_boringssl
+    tink::util::enums
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+    tink::proto::common_cc_proto
+    tink::proto::ecies_aead_hkdf_cc_proto
+    absl::memory
+)
+
+tink_cc_test(
+  NAME ecies_aead_hkdf_private_key_manager_test
+  SRCS ecies_aead_hkdf_private_key_manager_test.cc
+  DEPS
+    tink::hybrid::ecies_aead_hkdf_private_key_manager
+    tink::hybrid::ecies_aead_hkdf_public_key_manager
+    tink::hybrid::hybrid_key_templates
+    tink::core::hybrid_decrypt
+    tink::aead::aead_key_templates
+    tink::aead::aes_ctr_hmac_aead_key_manager
+    tink::aead::aes_gcm_key_manager
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::util::test_util
+    tink::subtle::hybrid_test_util
+    tink::proto::aes_eax_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::ecies_aead_hkdf_cc_proto
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME ecies_aead_hkdf_public_key_manager_test
+  SRCS ecies_aead_hkdf_public_key_manager_test.cc
+  DEPS
+    tink::hybrid::ecies_aead_hkdf_private_key_manager
+    tink::hybrid::ecies_aead_hkdf_public_key_manager
+    tink::core::hybrid_encrypt
+    tink::core::registry
+    tink::aead::aead_key_templates
+    tink::aead::aes_gcm_key_manager
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::util::test_util
+    tink::proto::aes_eax_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::ecies_aead_hkdf_cc_proto
+    tink::proto::tink_cc_proto
+)
diff --git a/cc/hybrid/ecies_aead_hkdf_dem_helper.cc b/cc/hybrid/ecies_aead_hkdf_dem_helper.cc
index a6ddc4b..224a44e 100644
--- a/cc/hybrid/ecies_aead_hkdf_dem_helper.cc
+++ b/cc/hybrid/ecies_aead_hkdf_dem_helper.cc
@@ -25,6 +25,7 @@
 #include "proto/aes_ctr_hmac_aead.pb.h"
 #include "proto/aes_gcm.pb.h"
 #include "proto/tink.pb.h"
+#include "proto/xchacha20_poly1305.pb.h"
 
 using crypto::tink::util::Status;
 using crypto::tink::util::StatusOr;
@@ -33,7 +34,8 @@
 using google::crypto::tink::AesGcmKey;
 using google::crypto::tink::AesGcmKeyFormat;
 using google::crypto::tink::KeyTemplate;
-
+using google::crypto::tink::XChaCha20Poly1305Key;
+using google::crypto::tink::XChaCha20Poly1305KeyFormat;
 
 namespace crypto {
 namespace tink {
@@ -63,6 +65,15 @@
         key_format.aes_ctr_key_format().key_size();
     helper->dem_key_size_in_bytes_ = helper->aes_ctr_key_size_in_bytes_ +
                                      key_format.hmac_key_format().key_size();
+  } else if (dem_type_url ==
+             "type.googleapis.com/google.crypto.tink.XChaCha20Poly1305Key") {
+    helper->dem_key_type_ = XCHACHA20_POLY1305_KEY;
+    XChaCha20Poly1305KeyFormat key_format;
+    if (!key_format.ParseFromString(dem_key_template.value())) {
+      return Status(util::error::INVALID_ARGUMENT,
+                    "Invalid XChaCha20Poly1305 in DEM key template");
+    }
+    helper->dem_key_size_in_bytes_ = 32;
   } else {
     return ToStatusF(util::error::INVALID_ARGUMENT,
                      "Unsupported DEM key type '%s'.", dem_type_url.c_str());
@@ -107,6 +118,10 @@
         key_bytes.substr(aes_ctr_key_size_in_bytes_,
                          key_bytes.size() - aes_ctr_key_size_in_bytes_));
     return true;
+  } else if (dem_key_type_ == XCHACHA20_POLY1305_KEY) {
+    XChaCha20Poly1305Key* key = static_cast<XChaCha20Poly1305Key*>(proto);
+    key->set_key_value(key_bytes);
+    return true;
   }
   return false;
 }
diff --git a/cc/hybrid/ecies_aead_hkdf_dem_helper.h b/cc/hybrid/ecies_aead_hkdf_dem_helper.h
index a48a1e2..d8a9e66 100644
--- a/cc/hybrid/ecies_aead_hkdf_dem_helper.h
+++ b/cc/hybrid/ecies_aead_hkdf_dem_helper.h
@@ -51,6 +51,7 @@
     UNKNOWN_KEY = 0,
     AES_GCM_KEY,
     AES_CTR_HMAC_AEAD_KEY,
+    XCHACHA20_POLY1305_KEY,
   };
 
   EciesAeadHkdfDemHelper(
diff --git a/cc/hybrid/ecies_aead_hkdf_hybrid_decrypt.cc b/cc/hybrid/ecies_aead_hkdf_hybrid_decrypt.cc
index 24a1f77..66d07d8 100644
--- a/cc/hybrid/ecies_aead_hkdf_hybrid_decrypt.cc
+++ b/cc/hybrid/ecies_aead_hkdf_hybrid_decrypt.cc
@@ -26,7 +26,7 @@
 #include "proto/tink.pb.h"
 
 using google::crypto::tink::EciesAeadHkdfPrivateKey;
-
+using google::crypto::tink::EllipticCurveType;
 
 namespace crypto {
 namespace tink {
@@ -99,9 +99,22 @@
 // static
 util::Status EciesAeadHkdfHybridDecrypt::Validate(
     const EciesAeadHkdfPrivateKey& key) {
-  if (!key.has_public_key() || !key.public_key().has_params()
-      || key.public_key().x().empty() || key.public_key().y().empty()
-      || key.key_value().empty()) {
+  if (!key.has_public_key() || !key.public_key().has_params() ||
+      key.public_key().x().empty() || key.key_value().empty()) {
+    return util::Status(
+        util::error::INVALID_ARGUMENT,
+        "Invalid EciesAeadHkdfPublicKey: missing required fields.");
+  }
+
+  if (key.public_key().params().has_kem_params() &&
+      key.public_key().params().kem_params().curve_type() ==
+          EllipticCurveType::CURVE25519) {
+    if (!key.public_key().y().empty()) {
+      return util::Status(
+          util::error::INVALID_ARGUMENT,
+          "Invalid EciesAeadHkdfPublicKey: has unexpected field.");
+    }
+  } else if (key.public_key().y().empty()) {
     return util::Status(util::error::INVALID_ARGUMENT,
           "Invalid EciesAeadHkdfPublicKey: missing required fields.");
   }
diff --git a/cc/hybrid/ecies_aead_hkdf_hybrid_decrypt_test.cc b/cc/hybrid/ecies_aead_hkdf_hybrid_decrypt_test.cc
index cb57199..183cd30 100644
--- a/cc/hybrid/ecies_aead_hkdf_hybrid_decrypt_test.cc
+++ b/cc/hybrid/ecies_aead_hkdf_hybrid_decrypt_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2017 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,11 +16,14 @@
 
 #include "tink/hybrid/ecies_aead_hkdf_hybrid_decrypt.h"
 
+#include "gtest/gtest.h"
 #include "absl/memory/memory.h"
+#include "tink/aead/aes_ctr_hmac_aead_key_manager.h"
+#include "tink/aead/aes_gcm_key_manager.h"
+#include "tink/aead/xchacha20_poly1305_key_manager.h"
+#include "tink/hybrid/ecies_aead_hkdf_hybrid_encrypt.h"
 #include "tink/hybrid_decrypt.h"
 #include "tink/registry.h"
-#include "tink/aead/aes_gcm_key_manager.h"
-#include "tink/hybrid/ecies_aead_hkdf_hybrid_encrypt.h"
 #include "tink/subtle/random.h"
 #include "tink/subtle/subtle_util_boringssl.h"
 #include "tink/util/enums.h"
@@ -29,7 +32,6 @@
 #include "proto/aes_gcm.pb.h"
 #include "proto/common.pb.h"
 #include "proto/ecies_aead_hkdf.pb.h"
-#include "gtest/gtest.h"
 
 using crypto::tink::subtle::Random;
 using google::crypto::tink::EciesAeadHkdfPrivateKey;
@@ -48,6 +50,98 @@
   }
   void TearDown() override {
   }
+
+  struct CommonHybridKeyParams {
+    EllipticCurveType ec_curve;
+    EcPointFormat ec_point_format;
+    HashType hash_type;
+  };
+
+  std::vector<CommonHybridKeyParams> GetCommonHybridKeyParamsList() {
+    std::vector<CommonHybridKeyParams> params_list;
+    for (auto ec_curve :
+         {EllipticCurveType::NIST_P256, EllipticCurveType::NIST_P384,
+          EllipticCurveType::NIST_P521, EllipticCurveType::CURVE25519}) {
+      for (auto ec_point_format :
+           {EcPointFormat::UNCOMPRESSED, EcPointFormat::COMPRESSED}) {
+        if (ec_curve == EllipticCurveType::CURVE25519 &&
+            ec_point_format == EcPointFormat::UNCOMPRESSED) {
+          continue;
+        }
+        for (auto hash_type : {HashType::SHA256, HashType::SHA512}) {
+          CommonHybridKeyParams params;
+          params.ec_curve = ec_curve;
+          params.ec_point_format = ec_point_format;
+          params.hash_type = hash_type;
+          params_list.push_back(params);
+        }
+      }
+    }
+    return params_list;
+  }
+
+  void TestValidKey(const EciesAeadHkdfPrivateKey& ecies_key) {
+    auto result(EciesAeadHkdfHybridDecrypt::New(ecies_key));
+    ASSERT_TRUE(result.ok()) << result.status() << ecies_key.DebugString();
+    std::unique_ptr<HybridDecrypt> hybrid_decrypt(
+        std::move(result.ValueOrDie()));
+
+    std::unique_ptr<HybridEncrypt> hybrid_encrypt(std::move(
+        EciesAeadHkdfHybridEncrypt::New(ecies_key.public_key()).ValueOrDie()));
+
+    std::string context_info = "some context info";
+    for (uint32_t plaintext_size : {0, 1, 10, 100, 1000}) {
+      // Use the primitive.
+      std::string plaintext = Random::GetRandomBytes(plaintext_size);
+      auto ciphertext =
+          hybrid_encrypt->Encrypt(plaintext, context_info).ValueOrDie();
+      {  // Regular decryption.
+        auto decrypt_result = hybrid_decrypt->Decrypt(ciphertext, context_info);
+        EXPECT_TRUE(decrypt_result.ok()) << decrypt_result.status();
+        EXPECT_EQ(plaintext, decrypt_result.ValueOrDie());
+      }
+      {  // Encryption and decryption with empty context info.
+        const absl::string_view empty_context_info;
+        auto ciphertext =
+            hybrid_encrypt->Encrypt(plaintext, empty_context_info).ValueOrDie();
+        auto decrypt_result =
+            hybrid_decrypt->Decrypt(ciphertext, empty_context_info);
+        ASSERT_TRUE(decrypt_result.ok()) << decrypt_result.status();
+        EXPECT_EQ(plaintext, decrypt_result.ValueOrDie());
+      }
+      {  // Encryption and decryption w/ empty msg & context info.
+        const absl::string_view empty_plaintext;
+        const absl::string_view empty_context_info;
+        auto ciphertext =
+            hybrid_encrypt->Encrypt(empty_plaintext, empty_context_info)
+                .ValueOrDie();
+        auto decrypt_result =
+            hybrid_decrypt->Decrypt(ciphertext, empty_context_info);
+        ASSERT_TRUE(decrypt_result.ok()) << decrypt_result.status();
+        EXPECT_EQ(empty_plaintext, decrypt_result.ValueOrDie());
+      }
+      {  // Short bad ciphertext.
+        auto decrypt_result =
+            hybrid_decrypt->Decrypt(Random::GetRandomBytes(16), context_info);
+        EXPECT_FALSE(decrypt_result.ok());
+        EXPECT_EQ(util::error::INVALID_ARGUMENT,
+                  decrypt_result.status().error_code());
+        EXPECT_PRED_FORMAT2(testing::IsSubstring, "ciphertext too short",
+                            decrypt_result.status().error_message());
+      }
+      {  // Long but still bad ciphertext.
+        auto decrypt_result =
+            hybrid_decrypt->Decrypt(Random::GetRandomBytes(142), context_info);
+        EXPECT_FALSE(decrypt_result.ok());
+        // TODO(przydatek): add more checks while avoiding flakiness.
+      }
+      {  // Bad context info
+        auto decrypt_result =
+            hybrid_decrypt->Decrypt(ciphertext, Random::GetRandomBytes(14));
+        EXPECT_FALSE(decrypt_result.ok());
+      }
+    }
+  }
 };
 
 TEST_F(EciesAeadHkdfHybridDecryptTest, testInvalidKeys) {
@@ -108,7 +202,7 @@
   }
 }
 
-TEST_F(EciesAeadHkdfHybridDecryptTest, testBasic) {
+TEST_F(EciesAeadHkdfHybridDecryptTest, testGettingHybridEncryptWithoutManager) {
   // Prepare an ECIES key.
   auto ecies_key = test::GetEciesAesGcmHkdfTestKey(
       EllipticCurveType::NIST_P256,
@@ -122,85 +216,48 @@
   EXPECT_EQ(util::error::FAILED_PRECONDITION, bad_result.status().error_code());
   EXPECT_PRED_FORMAT2(testing::IsSubstring, "No manager for DEM",
                       bad_result.status().error_message());
+}
 
+TEST_F(EciesAeadHkdfHybridDecryptTest, testAesGcmHybridDecryption) {
   // Register DEM key manager.
-  auto key_manager = absl::make_unique<AesGcmKeyManager>();
-  std::string dem_key_type = key_manager->get_key_type();
-  ASSERT_TRUE(Registry::RegisterKeyManager(std::move(key_manager), true).ok());
+  std::string dem_key_type = AesGcmKeyManager().get_key_type();
+  ASSERT_TRUE(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<AesGcmKeyManager>(), true)
+                  .ok());
 
+  int i = 0;
   // Generate and test many keys with various parameters.
-  std::string context_info = "some context info";
-  for (auto curve : {EllipticCurveType::NIST_P256, EllipticCurveType::NIST_P384,
-                     EllipticCurveType::NIST_P521}) {
-    for (auto ec_point_format :
-        {EcPointFormat::UNCOMPRESSED, EcPointFormat::COMPRESSED}) {
-      for (auto hash_type : {HashType::SHA256, HashType::SHA512}) {
-        for (uint32_t aes_gcm_key_size : {16, 32}) {
-          for (uint32_t plaintext_size : {0, 1, 10, 100, 1000}) {
-            ecies_key = test::GetEciesAesGcmHkdfTestKey(
-                curve, ec_point_format, hash_type, aes_gcm_key_size);
+  for (auto key_params : GetCommonHybridKeyParamsList()) {
+    for (uint32_t aes_gcm_key_size : {16, 32}) {
+      ++i;
+      auto ecies_key = test::GetEciesAesGcmHkdfTestKey(
+          key_params.ec_curve, key_params.ec_point_format, key_params.hash_type,
+          aes_gcm_key_size);
+      TestValidKey(ecies_key);
+    }
+  }
+  EXPECT_EQ(i, 32 - 4);
+}
 
-            auto result(EciesAeadHkdfHybridDecrypt::New(ecies_key));
-            ASSERT_TRUE(result.ok()) << result.status()
-                                     << ecies_key.SerializeAsString();
-            std::unique_ptr<HybridDecrypt> hybrid_decrypt(
-                std::move(result.ValueOrDie()));
+TEST_F(EciesAeadHkdfHybridDecryptTest, testAesCtrAeadHybridDecryption) {
+  // Register DEM key manager.
+  std::string dem_key_type = AesCtrHmacAeadKeyManager().get_key_type();
+  ASSERT_TRUE(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<AesCtrHmacAeadKeyManager>(), true)
+                  .ok());
 
-            std::unique_ptr<HybridEncrypt> hybrid_encrypt(std::move(
-                EciesAeadHkdfHybridEncrypt::New(
-                    ecies_key.public_key()).ValueOrDie()));
-
-            // Use the primitive.
-            std::string plaintext = Random::GetRandomBytes(plaintext_size);
-            auto ciphertext =
-                hybrid_encrypt->Encrypt(plaintext, context_info).ValueOrDie();
-            {  // Regular decryption.
-              auto decrypt_result =
-                  hybrid_decrypt->Decrypt(ciphertext, context_info);
-              EXPECT_TRUE(decrypt_result.ok()) << decrypt_result.status();
-              EXPECT_EQ(plaintext, decrypt_result.ValueOrDie());
-            }
-            {  // Encryption and decryption with empty context info.
-              const absl::string_view empty_context_info;
-              auto ciphertext = hybrid_encrypt->Encrypt(
-                  plaintext, empty_context_info).ValueOrDie();
-              auto decrypt_result =
-                  hybrid_decrypt->Decrypt(ciphertext, empty_context_info);
-              ASSERT_TRUE(decrypt_result.ok()) << decrypt_result.status();
-              EXPECT_EQ(plaintext, decrypt_result.ValueOrDie());
-            }
-            {  // Encryption and decryption w/ empty msg & context info.
-              const absl::string_view empty_plaintext;
-              const absl::string_view empty_context_info;
-              auto ciphertext = hybrid_encrypt->Encrypt(
-                  empty_plaintext, empty_context_info).ValueOrDie();
-              auto decrypt_result =
-                  hybrid_decrypt->Decrypt(ciphertext, empty_context_info);
-              ASSERT_TRUE(decrypt_result.ok()) << decrypt_result.status();
-              EXPECT_EQ(empty_plaintext, decrypt_result.ValueOrDie());
-            }
-            {  // Short bad ciphertext.
-              auto decrypt_result = hybrid_decrypt->Decrypt(
-                  Random::GetRandomBytes(16), context_info);
-              EXPECT_FALSE(decrypt_result.ok());
-              EXPECT_EQ(util::error::INVALID_ARGUMENT,
-                        decrypt_result.status().error_code());
-              EXPECT_PRED_FORMAT2(testing::IsSubstring, "ciphertext too short",
-                                  decrypt_result.status().error_message());
-            }
-            {  // Long but still bad ciphertext.
-              auto decrypt_result = hybrid_decrypt->Decrypt(
-                      Random::GetRandomBytes(142), context_info);
-              EXPECT_FALSE(decrypt_result.ok());
-              // TODO(przydatek): add more checks while avoiding flakiness.
-            }
-            {  // Bad context info
-              auto decrypt_result = hybrid_decrypt->Decrypt(
-                  ciphertext, Random::GetRandomBytes(14));
-              EXPECT_FALSE(decrypt_result.ok());
-              EXPECT_EQ(util::error::INTERNAL,
-                        decrypt_result.status().error_code());
-            }
+  uint32_t aes_ctr_iv_size = 16;
+  // Generate and test many keys with various parameters.
+  for (auto key_params : GetCommonHybridKeyParamsList()) {
+    for (uint32_t aes_ctr_key_size : {16, 32}) {
+      for (auto hmac_hash_type : {HashType::SHA256, HashType::SHA512}) {
+        for (uint32_t hmac_tag_size : {16, 32}) {
+          for (uint32_t hmac_key_size : {16, 32}) {
+            auto ecies_key = test::GetEciesAesCtrHmacHkdfTestKey(
+                key_params.ec_curve, key_params.ec_point_format,
+                key_params.hash_type, aes_ctr_key_size, aes_ctr_iv_size,
+                hmac_hash_type, hmac_tag_size, hmac_key_size);
+            TestValidKey(ecies_key);
           }
         }
       }
@@ -208,6 +265,21 @@
   }
 }
 
+TEST_F(EciesAeadHkdfHybridDecryptTest, testXChaCha20Poly1305HybridDecryption) {
+  // Register DEM key manager.
+  std::string dem_key_type = XChaCha20Poly1305KeyManager().get_key_type();
+  ASSERT_TRUE(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<XChaCha20Poly1305KeyManager>(), true)
+                  .ok());
+
+  // Generate and test many keys with various parameters.
+  for (auto key_params : GetCommonHybridKeyParamsList()) {
+    auto ecies_key = test::GetEciesXChaCha20Poly1305HkdfTestKey(
+        key_params.ec_curve, key_params.ec_point_format, key_params.hash_type);
+    TestValidKey(ecies_key);
+  }
+}
+
 }  // namespace
 }  // namespace tink
 }  // namespace crypto
diff --git a/cc/hybrid/ecies_aead_hkdf_hybrid_encrypt.cc b/cc/hybrid/ecies_aead_hkdf_hybrid_encrypt.cc
index d9bc966..ff3fa01 100644
--- a/cc/hybrid/ecies_aead_hkdf_hybrid_encrypt.cc
+++ b/cc/hybrid/ecies_aead_hkdf_hybrid_encrypt.cc
@@ -28,10 +28,10 @@
 #include "proto/ecies_aead_hkdf.pb.h"
 #include "proto/tink.pb.h"
 
-using google::crypto::tink::EciesAeadHkdfPublicKey;
 using crypto::tink::util::Status;
 using crypto::tink::util::StatusOr;
-
+using google::crypto::tink::EciesAeadHkdfPublicKey;
+using google::crypto::tink::EllipticCurveType;
 
 namespace crypto {
 namespace tink {
@@ -90,10 +90,24 @@
 
 // static
 Status EciesAeadHkdfHybridEncrypt::Validate(const EciesAeadHkdfPublicKey& key) {
-  if (key.x().empty() || key.y().empty() || !key.has_params()) {
-      return Status(util::error::INVALID_ARGUMENT,
-          "Invalid EciesAeadHkdfPublicKey: missing required fields.");
+  if (key.x().empty() || !key.has_params()) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "Invalid EciesAeadHkdfPublicKey: missing required fields.");
   }
+
+  if (key.params().has_kem_params() &&
+      key.params().kem_params().curve_type() == EllipticCurveType::CURVE25519) {
+    if (!key.y().empty()) {
+      return util::Status(
+          util::error::INVALID_ARGUMENT,
+          "Invalid EciesAeadHkdfPublicKey: has unexpected field.");
+    }
+  } else if (key.y().empty()) {
+    return util::Status(
+        util::error::INVALID_ARGUMENT,
+        "Invalid EciesAeadHkdfPublicKey: missing required fields.");
+  }
+
   return Status::OK;
 }
 
diff --git a/cc/hybrid/ecies_aead_hkdf_hybrid_encrypt_test.cc b/cc/hybrid/ecies_aead_hkdf_hybrid_encrypt_test.cc
index 12f5bad..3c8fb74 100644
--- a/cc/hybrid/ecies_aead_hkdf_hybrid_encrypt_test.cc
+++ b/cc/hybrid/ecies_aead_hkdf_hybrid_encrypt_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2017 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -118,9 +118,10 @@
                       bad_result.status().error_message());
 
   // Register DEM key manager.
-  auto key_manager = absl::make_unique<AesGcmKeyManager>();
-  std::string dem_key_type = key_manager->get_key_type();
-  ASSERT_TRUE(Registry::RegisterKeyManager(std::move(key_manager), true).ok());
+  ASSERT_TRUE(Registry::RegisterKeyTypeManager(
+                  absl::make_unique<AesGcmKeyManager>(), true)
+                  .ok());
+  std::string dem_key_type = AesGcmKeyManager().get_key_type();
 
   // Generate and test many keys with various parameters.
   std::string plaintext = "some plaintext";
diff --git a/cc/hybrid/ecies_aead_hkdf_private_key_manager.cc b/cc/hybrid/ecies_aead_hkdf_private_key_manager.cc
index a1856a0..03b41a5 100644
--- a/cc/hybrid/ecies_aead_hkdf_private_key_manager.cc
+++ b/cc/hybrid/ecies_aead_hkdf_private_key_manager.cc
@@ -35,45 +35,24 @@
 namespace crypto {
 namespace tink {
 
-using google::crypto::tink::EciesAeadHkdfPrivateKey;
-using google::crypto::tink::EciesAeadHkdfKeyFormat;
-using google::crypto::tink::EciesAeadHkdfParams;
-using google::crypto::tink::EciesAeadDemParams;
-using google::crypto::tink::EciesHkdfKemParams;
-using google::crypto::tink::KeyData;
-using google::crypto::tink::KeyTemplate;
-using portable_proto::MessageLite;
 using crypto::tink::util::Status;
 using crypto::tink::util::StatusOr;
+using google::crypto::tink::EciesAeadHkdfKeyFormat;
+using google::crypto::tink::EciesAeadHkdfPrivateKey;
+using google::crypto::tink::EciesAeadHkdfPublicKey;
+using google::crypto::tink::EciesHkdfKemParams;
 
-class EciesAeadHkdfPrivateKeyFactory
-    : public PrivateKeyFactory,
-      public KeyFactoryBase<EciesAeadHkdfPrivateKey,
-                            EciesAeadHkdfKeyFormat> {
- public:
-  EciesAeadHkdfPrivateKeyFactory() {}
-
-  KeyData::KeyMaterialType key_material_type() const override {
-    return KeyData::ASYMMETRIC_PRIVATE;
+Status EciesAeadHkdfPrivateKeyManager::ValidateKeyFormat(
+    const EciesAeadHkdfKeyFormat& key_format) const {
+  if (!key_format.has_params()) {
+    return Status(util::error::INVALID_ARGUMENT, "Missing params.");
   }
+  return EciesAeadHkdfPublicKeyManager().ValidateParams(key_format.params());
+}
 
-  // Returns KeyData proto that contains EciesAeadHkdfPublicKey
-  // extracted from the given serialized_private_key, which must contain
-  // EciesAeadHkdfPrivateKey-proto.
-  crypto::tink::util::StatusOr<std::unique_ptr<google::crypto::tink::KeyData>>
-  GetPublicKeyData(absl::string_view serialized_private_key) const override;
-
- protected:
-  StatusOr<std::unique_ptr<EciesAeadHkdfPrivateKey>> NewKeyFromFormat(
-      const EciesAeadHkdfKeyFormat& ecies_key_format) const override;
-};
-
-StatusOr<std::unique_ptr<EciesAeadHkdfPrivateKey>>
-EciesAeadHkdfPrivateKeyFactory::NewKeyFromFormat(
+StatusOr<EciesAeadHkdfPrivateKey>
+EciesAeadHkdfPrivateKeyManager::CreateKey(
     const EciesAeadHkdfKeyFormat& ecies_key_format) const {
-  Status status = EciesAeadHkdfPublicKeyManager::Validate(ecies_key_format);
-  if (!status.ok()) return status;
-
   // Generate new EC key.
   const EciesHkdfKemParams& kem_params = ecies_key_format.params().kem_params();
   auto ec_key_result = subtle::SubtleUtilBoringSSL::GetNewEcKey(
@@ -82,72 +61,32 @@
   auto ec_key = ec_key_result.ValueOrDie();
 
   // Build EciesAeadHkdfPrivateKey.
-  std::unique_ptr<EciesAeadHkdfPrivateKey> ecies_private_key(
-      new EciesAeadHkdfPrivateKey());
-  ecies_private_key->set_version(EciesAeadHkdfPrivateKeyManager::kVersion);
-  ecies_private_key->set_key_value(ec_key.priv);
-  auto ecies_public_key = ecies_private_key->mutable_public_key();
-  ecies_public_key->set_version(EciesAeadHkdfPrivateKeyManager::kVersion);
+  EciesAeadHkdfPrivateKey ecies_private_key;
+  ecies_private_key.set_version(get_version());
+  ecies_private_key.set_key_value(ec_key.priv);
+  auto ecies_public_key = ecies_private_key.mutable_public_key();
+  ecies_public_key->set_version(get_version());
   ecies_public_key->set_x(ec_key.pub_x);
   ecies_public_key->set_y(ec_key.pub_y);
   *(ecies_public_key->mutable_params()) = ecies_key_format.params();
 
-  return absl::implicit_cast<
-      StatusOr<std::unique_ptr<EciesAeadHkdfPrivateKey>>>(
-      std::move(ecies_private_key));
+  return ecies_private_key;
 }
 
-StatusOr<std::unique_ptr<KeyData>>
-EciesAeadHkdfPrivateKeyFactory::GetPublicKeyData(
-    absl::string_view serialized_private_key) const {
-  EciesAeadHkdfPrivateKey private_key;
-  if (!private_key.ParseFromString(std::string(serialized_private_key))) {
-    return ToStatusF(util::error::INVALID_ARGUMENT,
-                     "Could not parse the passed string as proto '%s'.",
-                     EciesAeadHkdfPrivateKeyManager::static_key_type().c_str());
-  }
-  auto status = EciesAeadHkdfPrivateKeyManager::Validate(private_key);
-  if (!status.ok()) return status;
-  auto key_data = absl::make_unique<KeyData>();
-  key_data->set_type_url(EciesAeadHkdfPublicKeyManager::static_key_type());
-  key_data->set_value(private_key.public_key().SerializeAsString());
-  key_data->set_key_material_type(KeyData:: ASYMMETRIC_PUBLIC);
-  return std::move(key_data);
+StatusOr<EciesAeadHkdfPublicKey>
+EciesAeadHkdfPrivateKeyManager::GetPublicKey(
+    const EciesAeadHkdfPrivateKey& private_key) const {
+  return private_key.public_key();
 }
 
-constexpr uint32_t EciesAeadHkdfPrivateKeyManager::kVersion;
-
-EciesAeadHkdfPrivateKeyManager::EciesAeadHkdfPrivateKeyManager()
-    : key_factory_(new EciesAeadHkdfPrivateKeyFactory()) {
-}
-
-const KeyFactory& EciesAeadHkdfPrivateKeyManager::get_key_factory() const {
-  return *key_factory_;
-}
-
-uint32_t EciesAeadHkdfPrivateKeyManager::get_version() const {
-  return kVersion;
-}
-
-StatusOr<std::unique_ptr<HybridDecrypt>>
-EciesAeadHkdfPrivateKeyManager::GetPrimitiveFromKey(
-    const EciesAeadHkdfPrivateKey& ecies_private_key) const {
-  Status status = Validate(ecies_private_key);
-  if (!status.ok()) return status;
-  auto ecies_result = EciesAeadHkdfHybridDecrypt::New(ecies_private_key);
-  if (!ecies_result.ok()) return ecies_result.status();
-  return std::move(ecies_result.ValueOrDie());
-}
-
-// static
-Status EciesAeadHkdfPrivateKeyManager::Validate(
-    const EciesAeadHkdfPrivateKey& key) {
-  Status status = ValidateVersion(key.version(), kVersion);
+Status EciesAeadHkdfPrivateKeyManager::ValidateKey(
+    const EciesAeadHkdfPrivateKey& key) const {
+  Status status = ValidateVersion(key.version(), get_version());
   if (!status.ok()) return status;
   if (!key.has_public_key()) {
     return Status(util::error::INVALID_ARGUMENT, "Missing public_key.");
   }
-  return EciesAeadHkdfPublicKeyManager::Validate(key.public_key());
+  return EciesAeadHkdfPublicKeyManager().ValidateKey(key.public_key());
 }
 
 }  // namespace tink
diff --git a/cc/hybrid/ecies_aead_hkdf_private_key_manager.h b/cc/hybrid/ecies_aead_hkdf_private_key_manager.h
index 9b07582..9c3cbab 100644
--- a/cc/hybrid/ecies_aead_hkdf_private_key_manager.h
+++ b/cc/hybrid/ecies_aead_hkdf_private_key_manager.h
@@ -20,9 +20,12 @@
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "tink/core/key_manager_base.h"
+#include "tink/core/key_type_manager.h"
+#include "tink/core/private_key_type_manager.h"
+#include "tink/hybrid/ecies_aead_hkdf_hybrid_decrypt.h"
 #include "tink/hybrid_decrypt.h"
 #include "tink/key_manager.h"
+#include "tink/util/constants.h"
 #include "tink/util/errors.h"
 #include "tink/util/protobuf_helper.h"
 #include "tink/util/status.h"
@@ -34,37 +37,53 @@
 namespace tink {
 
 class EciesAeadHkdfPrivateKeyManager
-    : public KeyManagerBase<HybridDecrypt,
-                            google::crypto::tink::EciesAeadHkdfPrivateKey> {
+    : public PrivateKeyTypeManager<
+          google::crypto::tink::EciesAeadHkdfPrivateKey,
+          google::crypto::tink::EciesAeadHkdfKeyFormat,
+          google::crypto::tink::EciesAeadHkdfPublicKey, List<HybridDecrypt>> {
  public:
-  static constexpr uint32_t kVersion = 0;
+  class HybridDecryptFactory : public PrimitiveFactory<HybridDecrypt> {
+    crypto::tink::util::StatusOr<std::unique_ptr<HybridDecrypt>> Create(
+        const google::crypto::tink::EciesAeadHkdfPrivateKey& ecies_private_key)
+        const override {
+      return EciesAeadHkdfHybridDecrypt::New(ecies_private_key);
+    }
+  };
 
-  EciesAeadHkdfPrivateKeyManager();
+  EciesAeadHkdfPrivateKeyManager()
+      : PrivateKeyTypeManager(absl::make_unique<HybridDecryptFactory>()) {}
 
-  // Returns the version of this key manager.
-  uint32_t get_version() const override;
+  uint32_t get_version() const override { return 0; }
 
-  // Returns a factory that generates keys of the key type
-  // handled by this manager.
-  const KeyFactory& get_key_factory() const override;
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::ASYMMETRIC_PRIVATE;
+  }
 
-  virtual ~EciesAeadHkdfPrivateKeyManager() {}
+  const std::string& get_key_type() const override { return key_type_; }
 
- protected:
-  crypto::tink::util::StatusOr<std::unique_ptr<HybridDecrypt>>
-  GetPrimitiveFromKey(const google::crypto::tink::EciesAeadHkdfPrivateKey&
-                          ecies_private_key) const override;
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::EciesAeadHkdfPrivateKey& key) const override;
+
+  crypto::tink::util::Status ValidateKeyFormat(
+      const google::crypto::tink::EciesAeadHkdfKeyFormat& ecies_key_format)
+      const override;
+
+  crypto::tink::util::StatusOr<google::crypto::tink::EciesAeadHkdfPrivateKey>
+  CreateKey(const google::crypto::tink::EciesAeadHkdfKeyFormat& key_format)
+      const override;
+
+  crypto::tink::util::StatusOr<google::crypto::tink::EciesAeadHkdfPublicKey>
+  GetPublicKey(const google::crypto::tink::EciesAeadHkdfPrivateKey& private_key)
+      const override;
 
  private:
-  friend class EciesAeadHkdfPrivateKeyFactory;
-
-  std::unique_ptr<KeyFactory> key_factory_;
-
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::EciesAeadHkdfPrivateKey& key);
+  const std::string key_type_ = absl::StrCat(
+      kTypeGoogleapisCom,
+      google::crypto::tink::EciesAeadHkdfPrivateKey().GetTypeName());
 };
 
 }  // namespace tink
 }  // namespace crypto
 
-#endif  // TINK_HYBRID_ECIES_AEAD_HKDF_PUBLIC_KEY_MANAGER_H_
+#endif  // TINK_HYBRID_ECIES_AEAD_HKDF_PRIVATE_KEY_MANAGER_H_
diff --git a/cc/hybrid/ecies_aead_hkdf_private_key_manager_test.cc b/cc/hybrid/ecies_aead_hkdf_private_key_manager_test.cc
index d8154ee..5f88ed9 100644
--- a/cc/hybrid/ecies_aead_hkdf_private_key_manager_test.cc
+++ b/cc/hybrid/ecies_aead_hkdf_private_key_manager_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2017 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,17 +16,19 @@
 
 #include "tink/hybrid/ecies_aead_hkdf_private_key_manager.h"
 
-#include "tink/hybrid_decrypt.h"
-#include "tink/registry.h"
+#include "gtest/gtest.h"
 #include "tink/aead/aead_key_templates.h"
 #include "tink/aead/aes_ctr_hmac_aead_key_manager.h"
 #include "tink/aead/aes_gcm_key_manager.h"
 #include "tink/hybrid/ecies_aead_hkdf_public_key_manager.h"
 #include "tink/hybrid/hybrid_key_templates.h"
+#include "tink/hybrid_decrypt.h"
+#include "tink/registry.h"
+#include "tink/subtle/hybrid_test_util.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
-#include "gtest/gtest.h"
 #include "proto/aes_eax.pb.h"
 #include "proto/common.pb.h"
 #include "proto/ecies_aead_hkdf.pb.h"
@@ -35,303 +37,235 @@
 namespace crypto {
 namespace tink {
 
-using google::crypto::tink::AesEaxKey;
-using google::crypto::tink::EciesAeadHkdfKeyFormat;
-using google::crypto::tink::EciesAeadHkdfPrivateKey;
-using google::crypto::tink::EcPointFormat;
-using google::crypto::tink::EllipticCurveType;
-using google::crypto::tink::HashType;
-using google::crypto::tink::KeyData;
-using google::crypto::tink::KeyTemplate;
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
+using ::google::crypto::tink::EciesAeadHkdfKeyFormat;
+using ::google::crypto::tink::EciesAeadHkdfPrivateKey;
+using ::google::crypto::tink::EciesAeadHkdfPublicKey;
+using ::google::crypto::tink::EcPointFormat;
+using ::google::crypto::tink::EllipticCurveType;
+using ::google::crypto::tink::HashType;
+using ::google::crypto::tink::KeyData;
+using ::testing::Eq;
+using ::testing::IsEmpty;
+using ::testing::Not;
 
 namespace {
 
-class EciesAeadHkdfPrivateKeyManagerTest : public ::testing::Test {
- protected:
-  static void SetUpTestCase() {
-    ASSERT_TRUE(Registry::RegisterKeyManager(
-                    absl::make_unique<AesGcmKeyManager>(), true)
-                    .ok());
-    ASSERT_TRUE(Registry::RegisterKeyManager(
-                    absl::make_unique<AesCtrHmacAeadKeyManager>(), true)
-                    .ok());
-  }
-
-  std::string key_type_prefix = "type.googleapis.com/";
-  std::string ecies_private_key_type =
-      "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey";
-};
-
-// Checks whether given key is compatible with the given format.
-void CheckNewKey(const EciesAeadHkdfPrivateKey& ecies_key,
-                 const EciesAeadHkdfKeyFormat& key_format) {
-  EciesAeadHkdfPrivateKeyManager key_manager;
-  EXPECT_EQ(0, ecies_key.version());
-  EXPECT_TRUE(ecies_key.has_public_key());
-  EXPECT_GT(ecies_key.key_value().length(), 0);
-  EXPECT_EQ(0, ecies_key.public_key().version());
-  EXPECT_GT(ecies_key.public_key().x().length(), 0);
-  EXPECT_GT(ecies_key.public_key().y().length(), 0);
-  EXPECT_EQ(ecies_key.public_key().params().SerializeAsString(),
-            key_format.params().SerializeAsString());
-  auto primitive_result = key_manager.GetPrimitive(ecies_key);
-  EXPECT_TRUE(primitive_result.ok()) << primitive_result.status();
+TEST(EciesAeadHkdfPrivateKeyManagerTest, Basics) {
+  EXPECT_THAT(EciesAeadHkdfPrivateKeyManager().get_version(), Eq(0));
+  EXPECT_THAT(EciesAeadHkdfPrivateKeyManager().key_material_type(),
+              Eq(KeyData::ASYMMETRIC_PRIVATE));
+  EXPECT_THAT(
+      EciesAeadHkdfPrivateKeyManager().get_key_type(),
+      Eq("type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey"));
 }
 
-TEST_F(EciesAeadHkdfPrivateKeyManagerTest, testBasic) {
-  EciesAeadHkdfPrivateKeyManager key_manager;
-
-  EXPECT_EQ(0, key_manager.get_version());
-  EXPECT_EQ("type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey",
-            key_manager.get_key_type());
-  EXPECT_TRUE(key_manager.DoesSupport(key_manager.get_key_type()));
+TEST(EciesAeadHkdfPrivateKeyManagerTest, ValidateEmptyKey) {
+  EXPECT_THAT(
+      EciesAeadHkdfPrivateKeyManager().ValidateKey(EciesAeadHkdfPrivateKey()),
+      StatusIs(util::error::INVALID_ARGUMENT));
 }
 
-TEST_F(EciesAeadHkdfPrivateKeyManagerTest, testKeyDataErrors) {
-  EciesAeadHkdfPrivateKeyManager key_manager;
-
-  {  // Bad key type.
-    KeyData key_data;
-    std::string bad_key_type =
-        "type.googleapis.com/google.crypto.tink.SomeOtherKey";
-    key_data.set_type_url(bad_key_type);
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, bad_key_type,
-                        result.status().error_message());
-  }
-
-  {  // Bad key value.
-    KeyData key_data;
-    key_data.set_type_url(ecies_private_key_type);
-    key_data.set_value("some bad serialized proto");
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
-
-  {  // Bad version.
-    KeyData key_data;
-    EciesAeadHkdfPrivateKey key;
-    key.set_version(1);
-    key_data.set_type_url(ecies_private_key_type);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "version",
-                        result.status().error_message());
-  }
-}
-
-TEST_F(EciesAeadHkdfPrivateKeyManagerTest, testKeyMessageErrors) {
-  EciesAeadHkdfPrivateKeyManager key_manager;
-
-  {  // Bad protobuffer.
-    AesEaxKey key;
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "AesEaxKey",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-  }
-}
-
-TEST_F(EciesAeadHkdfPrivateKeyManagerTest, testPrimitives) {
-  std::string plaintext = "some plaintext";
-  std::string context_info = "some context info";
-  EciesAeadHkdfPublicKeyManager public_key_manager;
-  EciesAeadHkdfPrivateKeyManager private_key_manager;
-  EciesAeadHkdfPrivateKey key = test::GetEciesAesGcmHkdfTestKey(
-      EllipticCurveType::NIST_P256, EcPointFormat::UNCOMPRESSED,
-      HashType::SHA256, 32);
-  auto hybrid_encrypt = std::move(public_key_manager.GetPrimitive(
-      key.public_key()).ValueOrDie());
-  std::string ciphertext =
-      hybrid_encrypt->Encrypt(plaintext, context_info).ValueOrDie();
-
-  {  // Using Key proto.
-    auto result = private_key_manager.GetPrimitive(key);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto hybrid_decrypt = std::move(result.ValueOrDie());
-    auto decrypt_result = hybrid_decrypt->Decrypt(ciphertext, context_info);
-    EXPECT_TRUE(decrypt_result.ok()) << decrypt_result.status();
-  }
-
-  {  // Using KeyData proto.
-    KeyData key_data;
-    key_data.set_type_url(ecies_private_key_type);
-    key_data.set_value(key.SerializeAsString());
-    auto result = private_key_manager.GetPrimitive(key_data);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto hybrid_decrypt = std::move(result.ValueOrDie());
-    auto decrypt_result = hybrid_decrypt->Decrypt(ciphertext, context_info);
-    EXPECT_TRUE(decrypt_result.ok()) << decrypt_result.status();
-  }
-}
-
-TEST_F(EciesAeadHkdfPrivateKeyManagerTest, testNewKeyCreation) {
-  EciesAeadHkdfPrivateKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-
-  { // Via NewKey(format_proto).
-    EciesAeadHkdfKeyFormat key_format;
-    ASSERT_TRUE(key_format.ParseFromString(
-        HybridKeyTemplates::EciesP256HkdfHmacSha256Aes128Gcm().value()));
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key = std::move(result.ValueOrDie());
-    ASSERT_EQ(ecies_private_key_type, key_type_prefix + key->GetTypeName());
-    std::unique_ptr<EciesAeadHkdfPrivateKey> ecies_key(
-        reinterpret_cast<EciesAeadHkdfPrivateKey*>(key.release()));
-    CheckNewKey(*ecies_key, key_format);
-  }
-
-  { // Via NewKey(serialized_format_proto).
-    EciesAeadHkdfKeyFormat key_format;
-    ASSERT_TRUE(key_format.ParseFromString(
-        HybridKeyTemplates::EciesP256HkdfHmacSha256Aes128CtrHmacSha256()
-        .value()));
-    auto result = key_factory.NewKey(key_format.SerializeAsString());
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key = std::move(result.ValueOrDie());
-    ASSERT_EQ(ecies_private_key_type, key_type_prefix + key->GetTypeName());
-    std::unique_ptr<EciesAeadHkdfPrivateKey> ecies_key(
-        reinterpret_cast<EciesAeadHkdfPrivateKey*>(key.release()));
-    CheckNewKey(*ecies_key, key_format);
-  }
-
-  { // Via NewKeyData(serialized_format_proto).
-    EciesAeadHkdfKeyFormat key_format;
-    ASSERT_TRUE(key_format.ParseFromString(
-        HybridKeyTemplates::EciesP256HkdfHmacSha256Aes128CtrHmacSha256()
-        .value()));
-    auto result = key_factory.NewKeyData(key_format.SerializeAsString());
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key_data = std::move(result.ValueOrDie());
-    EXPECT_EQ(ecies_private_key_type, key_data->type_url());
-    EXPECT_EQ(KeyData::ASYMMETRIC_PRIVATE, key_data->key_material_type());
-    EciesAeadHkdfPrivateKey ecies_key;
-    ASSERT_TRUE(ecies_key.ParseFromString(key_data->value()));
-    CheckNewKey(ecies_key, key_format);
-  }
-}
-
-TEST_F(EciesAeadHkdfPrivateKeyManagerTest, testPublicKeyExtraction) {
-  EciesAeadHkdfPrivateKeyManager key_manager;
-  auto private_key_factory = dynamic_cast<const PrivateKeyFactory*>(
-      &(key_manager.get_key_factory()));
-  ASSERT_NE(private_key_factory, nullptr);
-
-  auto new_key_result = private_key_factory->NewKey(
-      HybridKeyTemplates::EciesP256HkdfHmacSha256Aes128CtrHmacSha256().value());
-  std::unique_ptr<EciesAeadHkdfPrivateKey> new_key(
-      reinterpret_cast<EciesAeadHkdfPrivateKey*>(
-          new_key_result.ValueOrDie().release()));
-  auto public_key_data_result = private_key_factory->GetPublicKeyData(
-      new_key->SerializeAsString());
-  EXPECT_TRUE(public_key_data_result.ok()) << public_key_data_result.status();
-  auto public_key_data = std::move(public_key_data_result.ValueOrDie());
-  EXPECT_EQ(EciesAeadHkdfPublicKeyManager::static_key_type(),
-            public_key_data->type_url());
-  EXPECT_EQ(KeyData::ASYMMETRIC_PUBLIC, public_key_data->key_material_type());
-  EXPECT_EQ(new_key->public_key().SerializeAsString(),
-            public_key_data->value());
-}
-
-TEST_F(EciesAeadHkdfPrivateKeyManagerTest, testPublicKeyExtractionErrors) {
-  EciesAeadHkdfPrivateKeyManager key_manager;
-  auto private_key_factory = dynamic_cast<const PrivateKeyFactory*>(
-      &(key_manager.get_key_factory()));
-  ASSERT_NE(private_key_factory, nullptr);
-
-  AesCtrHmacAeadKeyManager aead_key_manager;
-  auto aead_private_key_factory = dynamic_cast<const PrivateKeyFactory*>(
-      &(aead_key_manager.get_key_factory()));
-  ASSERT_EQ(nullptr, aead_private_key_factory);
-
-  auto aead_key_result = aead_key_manager.get_key_factory().NewKey(
-      AeadKeyTemplates::Aes128CtrHmacSha256().value());
-  ASSERT_TRUE(aead_key_result.ok()) << aead_key_result.status();
-  auto aead_key = std::move(aead_key_result.ValueOrDie());
-  auto public_key_data_result = private_key_factory->GetPublicKeyData(
-      aead_key->SerializeAsString());
-  EXPECT_FALSE(public_key_data_result.ok());
-  EXPECT_EQ(util::error::INVALID_ARGUMENT,
-            public_key_data_result.status().error_code());
-}
-
-TEST_F(EciesAeadHkdfPrivateKeyManagerTest, testNewKeyErrors) {
-  EciesAeadHkdfPrivateKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-
-  // Empty key format.
+EciesAeadHkdfKeyFormat CreateValidKeyFormat() {
   EciesAeadHkdfKeyFormat key_format;
-  {
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "Missing params",
-                        result.status().error_message());
-  }
-
-  // Missing kem_params.
-  auto params = key_format.mutable_params();
-  {
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "Missing kem_params",
-                        result.status().error_message());
-  }
-
-  // Invalid kem_params.
-  auto kem_params = params->mutable_kem_params();
-  {
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "Invalid kem_params",
-                        result.status().error_message());
-  }
-
-  // Missing dem_params.
+  key_format.mutable_params()->set_ec_point_format(EcPointFormat::UNCOMPRESSED);
+  auto dem_params = key_format.mutable_params()->mutable_dem_params();
+  *(dem_params->mutable_aead_dem()) = AeadKeyTemplates::Aes128Gcm();
+  auto kem_params = key_format.mutable_params()->mutable_kem_params();
   kem_params->set_curve_type(EllipticCurveType::NIST_P256);
   kem_params->set_hkdf_hash_type(HashType::SHA256);
-  {
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "Missing dem_params",
-                        result.status().error_message());
-  }
+  kem_params->set_hkdf_salt("");
+  return key_format;
+}
 
-  // Invalid dem_params.
-  auto dem_params = params->mutable_dem_params();
-  {
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "Invalid dem_params",
-                        result.status().error_message());
-  }
+TEST(EciesAeadHkdfPrivateKeyManagerTest, ValidateKeyFormat) {
+  EXPECT_THAT(EciesAeadHkdfPrivateKeyManager().ValidateKeyFormat(
+                  CreateValidKeyFormat()),
+              IsOk());
+}
 
-  // Invalid EC point format.
-  dem_params->mutable_aead_dem()->set_type_url("some type_url");
-  {
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "Unknown EC point format",
-                        result.status().error_message());
-  }
+TEST(EciesAeadHkdfPrivateKeyManagerTest, ValidateKeyFormatNoPoint) {
+  EciesAeadHkdfKeyFormat key_format = CreateValidKeyFormat();
+  key_format.mutable_params()->set_ec_point_format(
+      EcPointFormat::UNKNOWN_FORMAT);
+  EXPECT_THAT(EciesAeadHkdfPrivateKeyManager().ValidateKeyFormat(key_format),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(EciesAeadHkdfPrivateKeyManagerTest, ValidateKeyFormatNoDem) {
+  EciesAeadHkdfKeyFormat key_format = CreateValidKeyFormat();
+  key_format.mutable_params()->mutable_dem_params()->clear_aead_dem();
+  EXPECT_THAT(EciesAeadHkdfPrivateKeyManager().ValidateKeyFormat(key_format),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(EciesAeadHkdfPrivateKeyManagerTest, ValidateKeyFormatNoKemCurve) {
+  EciesAeadHkdfKeyFormat key_format = CreateValidKeyFormat();
+  key_format.mutable_params()->mutable_kem_params()->set_curve_type(
+      EllipticCurveType::UNKNOWN_CURVE);
+  EXPECT_THAT(EciesAeadHkdfPrivateKeyManager().ValidateKeyFormat(key_format),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(EciesAeadHkdfPrivateKeyManagerTest, ValidateKeyFormatNoKemHash) {
+  EciesAeadHkdfKeyFormat key_format = CreateValidKeyFormat();
+  key_format.mutable_params()->mutable_kem_params()->set_hkdf_hash_type(
+      HashType::UNKNOWN_HASH);
+  EXPECT_THAT(EciesAeadHkdfPrivateKeyManager().ValidateKeyFormat(key_format),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(EciesAeadHkdfPrivateKeyManagerTest, CreateKey) {
+  EciesAeadHkdfKeyFormat key_format = CreateValidKeyFormat();
+  ASSERT_THAT(EciesAeadHkdfPrivateKeyManager().CreateKey(key_format).status(),
+              IsOk());
+  EciesAeadHkdfPrivateKey key =
+      EciesAeadHkdfPrivateKeyManager().CreateKey(key_format).ValueOrDie();
+  EXPECT_THAT(key.public_key().params().kem_params().curve_type(),
+              Eq(key_format.params().kem_params().curve_type()));
+  EXPECT_THAT(key.public_key().params().kem_params().hkdf_hash_type(),
+              Eq(key_format.params().kem_params().hkdf_hash_type()));
+  EXPECT_THAT(key.public_key().params().dem_params().aead_dem().type_url(),
+              Eq(key_format.params().dem_params().aead_dem().type_url()));
+  EXPECT_THAT(key.public_key().params().dem_params().aead_dem().value(),
+              Eq(key_format.params().dem_params().aead_dem().value()));
+  EXPECT_THAT(
+      key.public_key().params().dem_params().aead_dem().output_prefix_type(),
+      Eq(key_format.params().dem_params().aead_dem().output_prefix_type()));
+
+  EXPECT_THAT(key.public_key().x(), Not(IsEmpty()));
+  EXPECT_THAT(key.public_key().y(), Not(IsEmpty()));
+  EXPECT_THAT(key.key_value(), Not(IsEmpty()));
+}
+
+EciesAeadHkdfPrivateKey CreateValidKey() {
+  return EciesAeadHkdfPrivateKeyManager()
+      .CreateKey(CreateValidKeyFormat())
+      .ValueOrDie();
+}
+
+TEST(EciesAeadHkdfPrivateKeyManagerTest, ValidateKeyEmpty) {
+  EXPECT_THAT(
+      EciesAeadHkdfPrivateKeyManager().ValidateKey(EciesAeadHkdfPrivateKey()),
+      StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(EciesAeadHkdfPrivateKeyManagerTest, ValidateKey) {
+  EXPECT_THAT(EciesAeadHkdfPrivateKeyManager().ValidateKey(CreateValidKey()),
+              IsOk());
+}
+
+TEST(EciesAeadHkdfPrivateKeyManagerTest, ValidateKeyWrongVersion) {
+  EciesAeadHkdfPrivateKey key = CreateValidKey();
+  key.set_version(1);
+  EXPECT_THAT(EciesAeadHkdfPrivateKeyManager().ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(EciesAeadHkdfPrivateKeyManagerTest, ValidateKeyNoPoint) {
+  EciesAeadHkdfPrivateKey key = CreateValidKey();
+  key.mutable_public_key()->mutable_params()->set_ec_point_format(
+      EcPointFormat::UNKNOWN_FORMAT);
+  EXPECT_THAT(EciesAeadHkdfPrivateKeyManager().ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(EciesAeadHkdfPrivateKeyManagerTest, ValidateKeyNoDem) {
+  EciesAeadHkdfPrivateKey key = CreateValidKey();
+  key.mutable_public_key()
+      ->mutable_params()
+      ->mutable_dem_params()
+      ->clear_aead_dem();
+  EXPECT_THAT(EciesAeadHkdfPrivateKeyManager().ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(EciesAeadHkdfPrivateKeyManagerTest, ValidateKeyNoKemCurve) {
+  EciesAeadHkdfPrivateKey key = CreateValidKey();
+  key.mutable_public_key()
+      ->mutable_params()
+      ->mutable_kem_params()
+      ->set_curve_type(EllipticCurveType::UNKNOWN_CURVE);
+  EXPECT_THAT(EciesAeadHkdfPrivateKeyManager().ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(EciesAeadHkdfPrivateKeyManagerTest, ValidateKeyNoKemHash) {
+  EciesAeadHkdfPrivateKey key = CreateValidKey();
+  key.mutable_public_key()
+      ->mutable_params()
+      ->mutable_kem_params()
+      ->set_hkdf_hash_type(HashType::UNKNOWN_HASH);
+  EXPECT_THAT(EciesAeadHkdfPrivateKeyManager().ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(EciesAeadHkdfPrivateKeyManagerTest, GetPublicKey) {
+  EciesAeadHkdfPrivateKey key = CreateValidKey();
+  ASSERT_THAT(EciesAeadHkdfPrivateKeyManager().GetPublicKey(key).status(),
+              IsOk());
+  EciesAeadHkdfPublicKey public_key =
+      EciesAeadHkdfPrivateKeyManager().GetPublicKey(key).ValueOrDie();
+  EXPECT_THAT(public_key.params().kem_params().curve_type(),
+              Eq(key.public_key().params().kem_params().curve_type()));
+  EXPECT_THAT(public_key.params().kem_params().hkdf_hash_type(),
+              Eq(key.public_key().params().kem_params().hkdf_hash_type()));
+  EXPECT_THAT(public_key.params().dem_params().aead_dem().type_url(),
+              Eq(key.public_key().params().dem_params().aead_dem().type_url()));
+  EXPECT_THAT(public_key.params().dem_params().aead_dem().value(),
+              Eq(key.public_key().params().dem_params().aead_dem().value()));
+  EXPECT_THAT(public_key.params().dem_params().aead_dem().output_prefix_type(),
+              Eq(key.public_key()
+                     .params()
+                     .dem_params()
+                     .aead_dem()
+                     .output_prefix_type()));
+
+  EXPECT_THAT(public_key.x(), Not(IsEmpty()));
+  EXPECT_THAT(public_key.y(), Not(IsEmpty()));
+}
+
+TEST(EciesAeadHkdfPrivateKeyManagerTest, Create) {
+  ASSERT_THAT(Registry::RegisterKeyTypeManager(
+      absl::make_unique<AesGcmKeyManager>(), true), IsOk());
+
+  EciesAeadHkdfPrivateKey private_key = CreateValidKey();
+  EciesAeadHkdfPublicKey public_key =
+      EciesAeadHkdfPrivateKeyManager().GetPublicKey(private_key).ValueOrDie();
+
+  auto decrypt_or =
+      EciesAeadHkdfPrivateKeyManager().GetPrimitive<HybridDecrypt>(private_key);
+  ASSERT_THAT(decrypt_or.status(), IsOk());
+  auto encrypt_or = EciesAeadHkdfHybridEncrypt::New(public_key);
+  ASSERT_THAT(encrypt_or.status(), IsOk());
+
+  ASSERT_THAT(HybridEncryptThenDecrypt(encrypt_or.ValueOrDie().get(),
+                                       decrypt_or.ValueOrDie().get(),
+                                       "some text", "some aad"),
+              IsOk());
+}
+
+TEST(EciesAeadHkdfPrivateKeyManagerTest, CreateDifferentKey) {
+  ASSERT_THAT(Registry::RegisterKeyTypeManager(
+      absl::make_unique<AesGcmKeyManager>(), true), IsOk());
+
+  EciesAeadHkdfPrivateKey private_key = CreateValidKey();
+  // Note: we create a new private key in the next line.
+  EciesAeadHkdfPublicKey public_key = EciesAeadHkdfPrivateKeyManager()
+                                          .GetPublicKey(CreateValidKey())
+                                          .ValueOrDie();
+
+  auto decrypt_or =
+      EciesAeadHkdfPrivateKeyManager().GetPrimitive<HybridDecrypt>(private_key);
+  ASSERT_THAT(decrypt_or.status(), IsOk());
+  auto encrypt_or = EciesAeadHkdfHybridEncrypt::New(public_key);
+  ASSERT_THAT(encrypt_or.status(), IsOk());
+
+  ASSERT_THAT(HybridEncryptThenDecrypt(encrypt_or.ValueOrDie().get(),
+                                       decrypt_or.ValueOrDie().get(),
+                                       "some text", "some aad"),
+              Not(IsOk()));
 }
 
 }  // namespace
diff --git a/cc/hybrid/ecies_aead_hkdf_public_key_manager.cc b/cc/hybrid/ecies_aead_hkdf_public_key_manager.cc
index 938ae86..bdfa9a6 100644
--- a/cc/hybrid/ecies_aead_hkdf_public_key_manager.cc
+++ b/cc/hybrid/ecies_aead_hkdf_public_key_manager.cc
@@ -32,47 +32,15 @@
 namespace crypto {
 namespace tink {
 
-using google::crypto::tink::EciesAeadHkdfPublicKey;
-using google::crypto::tink::EciesAeadHkdfKeyFormat;
+using crypto::tink::util::Status;
 using google::crypto::tink::EciesAeadHkdfParams;
+using google::crypto::tink::EciesAeadHkdfPublicKey;
 using google::crypto::tink::EcPointFormat;
 using google::crypto::tink::EllipticCurveType;
 using google::crypto::tink::HashType;
-using google::crypto::tink::KeyData;
-using google::crypto::tink::KeyTemplate;
-using portable_proto::MessageLite;
-using crypto::tink::util::Status;
-using crypto::tink::util::StatusOr;
 
-constexpr uint32_t EciesAeadHkdfPublicKeyManager::kVersion;
-
-EciesAeadHkdfPublicKeyManager::EciesAeadHkdfPublicKeyManager()
-    : key_factory_(KeyFactory::AlwaysFailingFactory(
-          util::Status(util::error::UNIMPLEMENTED,
-                       "Operation not supported for public keys, "
-                       "please use EciesAeadHkdfPrivateKeyManager."))) {}
-
-const KeyFactory& EciesAeadHkdfPublicKeyManager::get_key_factory() const {
-  return *key_factory_;
-}
-
-uint32_t EciesAeadHkdfPublicKeyManager::get_version() const {
-  return kVersion;
-}
-
-StatusOr<std::unique_ptr<HybridEncrypt>>
-EciesAeadHkdfPublicKeyManager::GetPrimitiveFromKey(
-    const EciesAeadHkdfPublicKey& recipient_key) const {
-  Status status = Validate(recipient_key);
-  if (!status.ok()) return status;
-  auto ecies_result = EciesAeadHkdfHybridEncrypt::New(recipient_key);
-  if (!ecies_result.ok()) return ecies_result.status();
-  return std::move(ecies_result.ValueOrDie());
-}
-
-// static
-Status EciesAeadHkdfPublicKeyManager::Validate(
-    const EciesAeadHkdfParams& params) {
+Status EciesAeadHkdfPublicKeyManager::ValidateParams(
+    const EciesAeadHkdfParams& params) const {
   // Validate KEM params.
   if (!params.has_kem_params()) {
     return Status(util::error::INVALID_ARGUMENT, "Missing kem_params.");
@@ -97,25 +65,16 @@
   return Status::OK;
 }
 
-// static
-Status EciesAeadHkdfPublicKeyManager::Validate(
-    const EciesAeadHkdfPublicKey& key) {
-  Status status = ValidateVersion(key.version(), kVersion);
+Status EciesAeadHkdfPublicKeyManager::ValidateKey(
+    const EciesAeadHkdfPublicKey& key) const {
+  Status status = ValidateVersion(key.version(), get_version());
   if (!status.ok()) return status;
   if (!key.has_params()) {
     return Status(util::error::INVALID_ARGUMENT, "Missing params.");
   }
-  return Validate(key.params());
+  return ValidateParams(key.params());
 }
 
-// static
-Status EciesAeadHkdfPublicKeyManager::Validate(
-    const EciesAeadHkdfKeyFormat& key_format) {
-  if (!key_format.has_params()) {
-    return Status(util::error::INVALID_ARGUMENT, "Missing params.");
-  }
-  return Validate(key_format.params());
-}
 
 }  // namespace tink
 }  // namespace crypto
diff --git a/cc/hybrid/ecies_aead_hkdf_public_key_manager.h b/cc/hybrid/ecies_aead_hkdf_public_key_manager.h
index e76389e..d95fc76 100644
--- a/cc/hybrid/ecies_aead_hkdf_public_key_manager.h
+++ b/cc/hybrid/ecies_aead_hkdf_public_key_manager.h
@@ -20,9 +20,11 @@
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "tink/core/key_manager_base.h"
+#include "tink/core/key_type_manager.h"
+#include "tink/hybrid/ecies_aead_hkdf_hybrid_encrypt.h"
 #include "tink/hybrid_encrypt.h"
 #include "tink/key_manager.h"
+#include "tink/util/constants.h"
 #include "tink/util/errors.h"
 #include "tink/util/protobuf_helper.h"
 #include "tink/util/status.h"
@@ -34,40 +36,38 @@
 namespace tink {
 
 class EciesAeadHkdfPublicKeyManager
-    : public KeyManagerBase<HybridEncrypt,
-                            google::crypto::tink::EciesAeadHkdfPublicKey> {
+    : public KeyTypeManager<google::crypto::tink::EciesAeadHkdfPublicKey, void,
+                            List<HybridEncrypt>> {
  public:
-  static constexpr uint32_t kVersion = 0;
+  class HybridEncryptFactory : public PrimitiveFactory<HybridEncrypt> {
+    crypto::tink::util::StatusOr<std::unique_ptr<HybridEncrypt>> Create(
+        const google::crypto::tink::EciesAeadHkdfPublicKey& ecies_public_key)
+        const override {
+      return EciesAeadHkdfHybridEncrypt::New(ecies_public_key);
+    }
+  };
 
-  EciesAeadHkdfPublicKeyManager();
+  EciesAeadHkdfPublicKeyManager()
+      : KeyTypeManager(absl::make_unique<HybridEncryptFactory>()) {}
 
-  // Returns the version of this key manager.
-  uint32_t get_version() const override;
+  uint32_t get_version() const override { return 0; }
 
-  // Returns a factory that generates keys of the key type
-  // handled by this manager.
-  const KeyFactory& get_key_factory() const override;
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::ASYMMETRIC_PUBLIC;
+  }
 
-  virtual ~EciesAeadHkdfPublicKeyManager() {}
+  const std::string& get_key_type() const override { return key_type_; }
 
- protected:
-  crypto::tink::util::StatusOr<std::unique_ptr<HybridEncrypt>>
-  GetPrimitiveFromKey(const google::crypto::tink::EciesAeadHkdfPublicKey&
-                          recipient_key) const override;
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::EciesAeadHkdfPublicKey& key) const override;
 
+  crypto::tink::util::Status ValidateParams(
+      const google::crypto::tink::EciesAeadHkdfParams& params) const;
  private:
-  // Friends that re-use proto validation helpers.
-  friend class EciesAeadHkdfPrivateKeyFactory;
-  friend class EciesAeadHkdfPrivateKeyManager;
-
-  std::unique_ptr<KeyFactory> key_factory_;
-
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::EciesAeadHkdfParams& params);
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::EciesAeadHkdfPublicKey& key);
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::EciesAeadHkdfKeyFormat& key_format);
+  const std::string key_type_ = absl::StrCat(
+      kTypeGoogleapisCom,
+      google::crypto::tink::EciesAeadHkdfPublicKey().GetTypeName());
 };
 
 }  // namespace tink
diff --git a/cc/hybrid/ecies_aead_hkdf_public_key_manager_test.cc b/cc/hybrid/ecies_aead_hkdf_public_key_manager_test.cc
index a085f60..f5ef9be 100644
--- a/cc/hybrid/ecies_aead_hkdf_public_key_manager_test.cc
+++ b/cc/hybrid/ecies_aead_hkdf_public_key_manager_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2017 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,13 +16,16 @@
 
 #include "tink/hybrid/ecies_aead_hkdf_public_key_manager.h"
 
+#include "gtest/gtest.h"
+#include "tink/aead/aead_key_templates.h"
+#include "tink/aead/aes_gcm_key_manager.h"
+#include "tink/hybrid/ecies_aead_hkdf_private_key_manager.h"
 #include "tink/hybrid_encrypt.h"
 #include "tink/registry.h"
-#include "tink/aead/aes_gcm_key_manager.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
-#include "gtest/gtest.h"
 #include "proto/aes_eax.pb.h"
 #include "proto/common.pb.h"
 #include "proto/ecies_aead_hkdf.pb.h"
@@ -30,155 +33,87 @@
 
 namespace crypto {
 namespace tink {
-
-using google::crypto::tink::AesEaxKey;
-using google::crypto::tink::EciesAeadHkdfKeyFormat;
-using google::crypto::tink::EciesAeadHkdfPublicKey;
-using google::crypto::tink::EcPointFormat;
-using google::crypto::tink::EllipticCurveType;
-using google::crypto::tink::HashType;
-using google::crypto::tink::KeyData;
-using google::crypto::tink::KeyTemplate;
-
 namespace {
 
-class EciesAeadHkdfPublicKeyManagerTest : public ::testing::Test {
- protected:
-  static void SetUpTestCase() {
-    ASSERT_TRUE(Registry::RegisterKeyManager(
-                    absl::make_unique<AesGcmKeyManager>(), true)
-                    .ok());
-  }
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
+using ::google::crypto::tink::EciesAeadHkdfKeyFormat;
+using ::google::crypto::tink::EciesAeadHkdfParams;
+using ::google::crypto::tink::EciesAeadHkdfPublicKey;
+using ::google::crypto::tink::EcPointFormat;
+using ::google::crypto::tink::EllipticCurveType;
+using ::google::crypto::tink::HashType;
+using ::google::crypto::tink::KeyData;
+using ::testing::Eq;
 
-  std::string key_type_prefix = "type.googleapis.com/";
-  std::string ecies_public_key_type =
-      "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey";
-};
-
-TEST_F(EciesAeadHkdfPublicKeyManagerTest, testBasic) {
-  EciesAeadHkdfPublicKeyManager key_manager;
-
-  EXPECT_EQ(0, key_manager.get_version());
-  EXPECT_EQ("type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey",
-            key_manager.get_key_type());
-  EXPECT_TRUE(key_manager.DoesSupport(key_manager.get_key_type()));
+TEST(EciesAeadHkdfPublicKeyManagerTest, Basics) {
+  EXPECT_THAT(EciesAeadHkdfPublicKeyManager().get_version(), Eq(0));
+  EXPECT_THAT(EciesAeadHkdfPublicKeyManager().key_material_type(),
+              Eq(KeyData::ASYMMETRIC_PUBLIC));
+  EXPECT_THAT(
+      EciesAeadHkdfPublicKeyManager().get_key_type(),
+      Eq("type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey"));
 }
 
-TEST_F(EciesAeadHkdfPublicKeyManagerTest, testKeyDataErrors) {
-  EciesAeadHkdfPublicKeyManager key_manager;
-
-  {  // Bad key type.
-    KeyData key_data;
-    std::string bad_key_type =
-        "type.googleapis.com/google.crypto.tink.SomeOtherKey";
-    key_data.set_type_url(bad_key_type);
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, bad_key_type,
-                        result.status().error_message());
-  }
-
-  {  // Bad key value.
-    KeyData key_data;
-    key_data.set_type_url(ecies_public_key_type);
-    key_data.set_value("some bad serialized proto");
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
-
-  {  // Bad version.
-    KeyData key_data;
-    EciesAeadHkdfPublicKey key;
-    key.set_version(1);
-    key_data.set_type_url(ecies_public_key_type);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "version",
-                        result.status().error_message());
-  }
+TEST(EciesAeadHkdfPublicKeyManagerTest, ValidateEmptyKey) {
+  EXPECT_THAT(
+      EciesAeadHkdfPublicKeyManager().ValidateKey(EciesAeadHkdfPublicKey()),
+      StatusIs(util::error::INVALID_ARGUMENT));
 }
 
-TEST_F(EciesAeadHkdfPublicKeyManagerTest, testKeyMessageErrors) {
-  EciesAeadHkdfPublicKeyManager key_manager;
-
-  {  // Bad protobuffer.
-    AesEaxKey key;
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "AesEaxKey",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-  }
+EciesAeadHkdfPublicKey CreatePublicKey() {
+  EciesAeadHkdfKeyFormat key_format;
+  key_format.mutable_params()->set_ec_point_format(EcPointFormat::UNCOMPRESSED);
+  auto dem_params = key_format.mutable_params()->mutable_dem_params();
+  *(dem_params->mutable_aead_dem()) = AeadKeyTemplates::Aes128Gcm();
+  auto kem_params = key_format.mutable_params()->mutable_kem_params();
+  kem_params->set_curve_type(EllipticCurveType::NIST_P256);
+  kem_params->set_hkdf_hash_type(HashType::SHA256);
+  kem_params->set_hkdf_salt("");
+  auto private_key_manager = EciesAeadHkdfPrivateKeyManager();
+  return private_key_manager
+      .GetPublicKey(
+          private_key_manager.CreateKey(key_format).ValueOrDie())
+      .ValueOrDie();
 }
 
-TEST_F(EciesAeadHkdfPublicKeyManagerTest, testPrimitives) {
-  std::string plaintext = "some plaintext";
-  std::string context_info = "some context info";
-  EciesAeadHkdfPublicKeyManager key_manager;
-  EciesAeadHkdfPublicKey key = test::GetEciesAesGcmHkdfTestKey(
-      EllipticCurveType::NIST_P256, EcPointFormat::UNCOMPRESSED,
-      HashType::SHA256, 32).public_key();
-
-  {  // Using Key proto.
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto hybrid_encrypt = std::move(result.ValueOrDie());
-    auto encrypt_result = hybrid_encrypt->Encrypt(plaintext, context_info);
-    EXPECT_TRUE(encrypt_result.ok()) << encrypt_result.status();
-  }
-
-  {  // Using KeyData proto.
-    KeyData key_data;
-    key_data.set_type_url(ecies_public_key_type);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto hybrid_encrypt = std::move(result.ValueOrDie());
-    auto encrypt_result = hybrid_encrypt->Encrypt(plaintext, context_info);
-    EXPECT_TRUE(encrypt_result.ok()) << encrypt_result.status();
-  }
+TEST(EciesAeadHkdfPublicKeyManagerTest, ValidateParams) {
+  EXPECT_THAT(EciesAeadHkdfPublicKeyManager().ValidateParams(
+                  CreatePublicKey().params()),
+              IsOk());
 }
 
-TEST_F(EciesAeadHkdfPublicKeyManagerTest, testNewKeyError) {
-  EciesAeadHkdfPublicKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
+TEST(EciesAeadHkdfPublicKeyManagerTest, ValidateKeyNoPoint) {
+  EciesAeadHkdfParams params = CreatePublicKey().params();
+  params.set_ec_point_format(EcPointFormat::UNKNOWN_FORMAT);
+  EXPECT_THAT(EciesAeadHkdfPublicKeyManager().ValidateParams(params),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
 
-  { // Via NewKey(format_proto).
-    EciesAeadHkdfKeyFormat key_format;
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::UNIMPLEMENTED, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-  }
+TEST(EciesAeadHkdfPublicKeyManagerTest, ValidateKeyNoDem) {
+  EciesAeadHkdfParams params = CreatePublicKey().params();
+  params.mutable_dem_params()->clear_aead_dem();
+  EXPECT_THAT(EciesAeadHkdfPublicKeyManager().ValidateParams(params),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
 
-  { // Via NewKey(serialized_format_proto).
-    EciesAeadHkdfKeyFormat key_format;
-    auto result = key_factory.NewKey(key_format.SerializeAsString());
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::UNIMPLEMENTED, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-  }
+TEST(EciesAeadHkdfPublicKeyManagerTest, ValidateKeyNoKemCurve) {
+  EciesAeadHkdfParams params = CreatePublicKey().params();
+  params.mutable_kem_params()->set_curve_type(EllipticCurveType::UNKNOWN_CURVE);
+  EXPECT_THAT(EciesAeadHkdfPublicKeyManager().ValidateParams(params),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
 
-  { // Via NewKeyData(serialized_format_proto).
-    EciesAeadHkdfKeyFormat key_format;
-    auto result = key_factory.NewKeyData(key_format.SerializeAsString());
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::UNIMPLEMENTED, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-  }
+TEST(EciesAeadHkdfPublicKeyManagerTest, ValidateKeyNoKemHash) {
+  EciesAeadHkdfParams params = CreatePublicKey().params();
+  params.mutable_kem_params()->set_hkdf_hash_type(HashType::UNKNOWN_HASH);
+  EXPECT_THAT(EciesAeadHkdfPublicKeyManager().ValidateParams(params),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(EciesAeadHkdfPublicKeyManagerTest, ValidateGeneratedKey) {
+  EXPECT_THAT(EciesAeadHkdfPublicKeyManager().ValidateKey(CreatePublicKey()),
+              IsOk());
 }
 
 }  // namespace
diff --git a/cc/hybrid/hybrid_config.cc b/cc/hybrid/hybrid_config.cc
index 90aab13..4f44d8b 100644
--- a/cc/hybrid/hybrid_config.cc
+++ b/cc/hybrid/hybrid_config.cc
@@ -18,57 +18,43 @@
 
 #include "absl/memory/memory.h"
 #include "tink/aead/aead_config.h"
-#include "tink/config.h"
-#include "tink/hybrid/hybrid_decrypt_catalogue.h"
-#include "tink/hybrid/hybrid_encrypt_catalogue.h"
+#include "tink/hybrid/ecies_aead_hkdf_private_key_manager.h"
+#include "tink/hybrid/ecies_aead_hkdf_public_key_manager.h"
+#include "tink/config/config_util.h"
+#include "tink/registry.h"
+#include "tink/hybrid/hybrid_decrypt_wrapper.h"
+#include "tink/hybrid/hybrid_encrypt_wrapper.h"
 #include "tink/util/status.h"
 #include "proto/config.pb.h"
 
+using google::crypto::tink::RegistryConfig;
+
 namespace crypto {
 namespace tink {
 
-namespace {
-
-google::crypto::tink::RegistryConfig* GenerateRegistryConfig() {
-  google::crypto::tink::RegistryConfig* config =
-      new google::crypto::tink::RegistryConfig();
-  config->MergeFrom(AeadConfig::Latest());
-  config->add_entry()->MergeFrom(*Config::GetTinkKeyTypeEntry(
-      HybridConfig::kHybridDecryptCatalogueName,
-      HybridConfig::kHybridDecryptPrimitiveName,
-      "EciesAeadHkdfPrivateKey", 0, true));
-  config->add_entry()->MergeFrom(*Config::GetTinkKeyTypeEntry(
-      HybridConfig::kHybridEncryptCatalogueName,
-      HybridConfig::kHybridEncryptPrimitiveName,
-      "EciesAeadHkdfPublicKey", 0, true));
-  config->set_config_name("TINK_HYBRID");
-  return config;
-}
-
-}  // anonymous namespace
-
-constexpr char HybridConfig::kHybridDecryptCatalogueName[];
-constexpr char HybridConfig::kHybridDecryptPrimitiveName[];
-constexpr char HybridConfig::kHybridEncryptCatalogueName[];
-constexpr char HybridConfig::kHybridEncryptPrimitiveName[];
-
 // static
-const google::crypto::tink::RegistryConfig& HybridConfig::Latest() {
-  static const auto config = GenerateRegistryConfig();
+const RegistryConfig& HybridConfig::Latest() {
+  static const RegistryConfig* config = new RegistryConfig();
   return *config;
 }
 
 // static
 util::Status HybridConfig::Register() {
   auto status = AeadConfig::Register();
+
+  // Register key managers.
   if (!status.ok()) return status;
-  status = Registry::AddCatalogue(kHybridDecryptCatalogueName,
-                                  absl::make_unique<HybridDecryptCatalogue>());
+  status = Registry::RegisterAsymmetricKeyManagers(
+      absl::make_unique<EciesAeadHkdfPrivateKeyManager>(),
+      absl::make_unique<EciesAeadHkdfPublicKeyManager>(), true);
   if (!status.ok()) return status;
-  status = Registry::AddCatalogue(kHybridEncryptCatalogueName,
-                                  absl::make_unique<HybridEncryptCatalogue>());
+
+  // Register primitive wrappers.
+  status = Registry::RegisterPrimitiveWrapper(
+      absl::make_unique<HybridEncryptWrapper>());
   if (!status.ok()) return status;
-  return Config::Register(Latest());
+  return Registry::RegisterPrimitiveWrapper(
+      absl::make_unique<HybridDecryptWrapper>());
 }
 
 }  // namespace tink
diff --git a/cc/hybrid/hybrid_config.h b/cc/hybrid/hybrid_config.h
index 74bd0c5..fdfbc37 100644
--- a/cc/hybrid/hybrid_config.h
+++ b/cc/hybrid/hybrid_config.h
@@ -17,6 +17,7 @@
 #ifndef TINK_HYBRID_HYBRID_CONFIG_H_
 #define TINK_HYBRID_HYBRID_CONFIG_H_
 
+#include "absl/base/macros.h"
 #include "tink/util/status.h"
 #include "proto/config.pb.h"
 
@@ -34,8 +35,6 @@
 //
 //   auto status = HybridConfig::Register();
 //
-// For more information on creation and usage of instances of HybridDecrypt
-// and HybridDecrypt see HybridEncryptFactory resp. HybridDecryptFactory.
 class HybridConfig {
  public:
   static constexpr char kHybridDecryptCatalogueName[] = "TinkHybridDecrypt";
@@ -45,10 +44,12 @@
 
   // Returns config with implementations of HybridEncrypt and HybridDecrypt
   // supported in the current Tink release.
+  ABSL_DEPRECATED("This is not supported anymore.")
   static const google::crypto::tink::RegistryConfig& Latest();
 
-  // Registers key managers for all implementations of HybridEncrypt
-  // and HybridDecrypt from the current Tink release.
+  // Registers HybridEncrypt and HybridDecrypt primitive wrappers, and key
+  // managers for all implementations of HybridEncrypt and HybridDecrypt from
+  // the current Tink release.
   static crypto::tink::util::Status Register();
 
  private:
diff --git a/cc/hybrid/hybrid_config_test.cc b/cc/hybrid/hybrid_config_test.cc
index b55f27c..2479bad 100644
--- a/cc/hybrid/hybrid_config_test.cc
+++ b/cc/hybrid/hybrid_config_test.cc
@@ -16,163 +16,52 @@
 
 #include "tink/hybrid/hybrid_config.h"
 
-#include "gtest/gtest.h"
 #include "gmock/gmock.h"
-#include "tink/catalogue.h"
+#include "gtest/gtest.h"
 #include "tink/config.h"
+#include "tink/hybrid/ecies_aead_hkdf_private_key_manager.h"
+#include "tink/hybrid/ecies_aead_hkdf_public_key_manager.h"
 #include "tink/hybrid/hybrid_key_templates.h"
 #include "tink/hybrid_decrypt.h"
 #include "tink/hybrid_encrypt.h"
 #include "tink/keyset_handle.h"
 #include "tink/registry.h"
 #include "tink/util/status.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
 
 namespace crypto {
 namespace tink {
 namespace {
 
-using ::crypto::tink::test::DummyHybridEncrypt;
 using ::crypto::tink::test::DummyHybridDecrypt;
-
-class DummyHybridDecryptCatalogue : public Catalogue<HybridDecrypt> {
- public:
-  DummyHybridDecryptCatalogue() {}
-
-  crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<HybridDecrypt>>>
-  GetKeyManager(const std::string& type_url,
-                const std::string& primitive_name,
-                uint32_t min_version) const override {
-    return util::Status::UNKNOWN;
-  }
-};
-
+using ::crypto::tink::test::DummyHybridEncrypt;
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
 
 class HybridConfigTest : public ::testing::Test {
  protected:
-  void SetUp() override {
-    Registry::Reset();
-  }
+  void SetUp() override { Registry::Reset(); }
 };
 
-TEST_F(HybridConfigTest, testBasic) {
-  std::string decrypt_key_type =
-      "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey";
-  std::string encrypt_key_type =
-      "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey";
-  std::string aes_ctr_hmac_aead_key_type =
-      "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey";
-  std::string aes_eax_key_type =
-      "type.googleapis.com/google.crypto.tink.AesEaxKey";
-  std::string aes_gcm_key_type =
-      "type.googleapis.com/google.crypto.tink.AesGcmKey";
-  std::string xchacha20_poly1305_key_type =
-      "type.googleapis.com/google.crypto.tink.XChaCha20Poly1305Key";
-  std::string hmac_key_type =
-      "type.googleapis.com/google.crypto.tink.HmacKey";
-  auto& config = HybridConfig::Latest();
-
-  EXPECT_EQ(7, HybridConfig::Latest().entry_size());
-
-  EXPECT_EQ("TinkMac", config.entry(0).catalogue_name());
-  EXPECT_EQ("Mac", config.entry(0).primitive_name());
-  EXPECT_EQ(hmac_key_type, config.entry(0).type_url());
-  EXPECT_EQ(true, config.entry(0).new_key_allowed());
-  EXPECT_EQ(0, config.entry(0).key_manager_version());
-
-  EXPECT_EQ("TinkAead", config.entry(1).catalogue_name());
-  EXPECT_EQ("Aead", config.entry(1).primitive_name());
-  EXPECT_EQ(aes_ctr_hmac_aead_key_type, config.entry(1).type_url());
-  EXPECT_EQ(true, config.entry(1).new_key_allowed());
-  EXPECT_EQ(0, config.entry(1).key_manager_version());
-
-  EXPECT_EQ("TinkAead", config.entry(2).catalogue_name());
-  EXPECT_EQ("Aead", config.entry(2).primitive_name());
-  EXPECT_EQ(aes_gcm_key_type, config.entry(2).type_url());
-  EXPECT_EQ(true, config.entry(2).new_key_allowed());
-  EXPECT_EQ(0, config.entry(2).key_manager_version());
-
-  EXPECT_EQ("TinkAead", config.entry(3).catalogue_name());
-  EXPECT_EQ("Aead", config.entry(3).primitive_name());
-  EXPECT_EQ(aes_eax_key_type, config.entry(3).type_url());
-  EXPECT_EQ(true, config.entry(3).new_key_allowed());
-  EXPECT_EQ(0, config.entry(3).key_manager_version());
-
-  EXPECT_EQ("TinkAead", config.entry(4).catalogue_name());
-  EXPECT_EQ("Aead", config.entry(4).primitive_name());
-  EXPECT_EQ(xchacha20_poly1305_key_type, config.entry(4).type_url());
-  EXPECT_EQ(true, config.entry(4).new_key_allowed());
-  EXPECT_EQ(0, config.entry(4).key_manager_version());
-
-  EXPECT_EQ("TinkHybridDecrypt", config.entry(5).catalogue_name());
-  EXPECT_EQ("HybridDecrypt", config.entry(5).primitive_name());
-  EXPECT_EQ(decrypt_key_type, config.entry(5).type_url());
-  EXPECT_EQ(true, config.entry(5).new_key_allowed());
-  EXPECT_EQ(0, config.entry(5).key_manager_version());
-
-  EXPECT_EQ("TinkHybridEncrypt", config.entry(6).catalogue_name());
-  EXPECT_EQ("HybridEncrypt", config.entry(6).primitive_name());
-  EXPECT_EQ(encrypt_key_type, config.entry(6).type_url());
-  EXPECT_EQ(true, config.entry(6).new_key_allowed());
-  EXPECT_EQ(0, config.entry(6).key_manager_version());
-
-  // No key manager before registration.
-  auto decrypt_manager_result =
-      Registry::get_key_manager<HybridDecrypt>(decrypt_key_type);
-  EXPECT_FALSE(decrypt_manager_result.ok());
-  EXPECT_EQ(util::error::NOT_FOUND,
-            decrypt_manager_result.status().error_code());
-
-  auto encrypt_manager_result =
-      Registry::get_key_manager<HybridEncrypt>(encrypt_key_type);
-  EXPECT_FALSE(encrypt_manager_result.ok());
-  EXPECT_EQ(util::error::NOT_FOUND,
-            encrypt_manager_result.status().error_code());
-
-  // Registration of standard key types works.
-  auto status = HybridConfig::Register();
-  EXPECT_TRUE(status.ok()) << status;
-  decrypt_manager_result =
-      Registry::get_key_manager<HybridDecrypt>(decrypt_key_type);
-  EXPECT_TRUE(decrypt_manager_result.ok()) << decrypt_manager_result.status();
-  EXPECT_TRUE(decrypt_manager_result.ValueOrDie()
-              ->DoesSupport(decrypt_key_type));
-  encrypt_manager_result =
-      Registry::get_key_manager<HybridEncrypt>(encrypt_key_type);
-  EXPECT_TRUE(encrypt_manager_result.ok()) << encrypt_manager_result.status();
-  EXPECT_TRUE(encrypt_manager_result.ValueOrDie()
-              ->DoesSupport(encrypt_key_type));
-}
-
-TEST_F(HybridConfigTest, testRegister) {
-  std::string key_type =
-      "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey";
-
-  // Try on empty registry.
-  auto status = Config::Register(HybridConfig::Latest());
-  EXPECT_FALSE(status.ok());
-  EXPECT_EQ(util::error::NOT_FOUND, status.error_code());
-  auto manager_result = Registry::get_key_manager<HybridEncrypt>(key_type);
-  EXPECT_FALSE(manager_result.ok());
-
-  // Register and try again.
-  status = HybridConfig::Register();
-  EXPECT_TRUE(status.ok()) << status;
-  manager_result = Registry::get_key_manager<HybridEncrypt>(key_type);
-  EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-
-  // Try Register() again, should succeed (idempotence).
-  status = HybridConfig::Register();
-  EXPECT_TRUE(status.ok()) << status;
-
-  // Reset the registry, and try overriding a catalogue with a different one.
-  Registry::Reset();
-  status = Registry::AddCatalogue("TinkHybridDecrypt",
-                                  new DummyHybridDecryptCatalogue());
-  EXPECT_TRUE(status.ok()) << status;
-  status = HybridConfig::Register();
-  EXPECT_FALSE(status.ok());
-  EXPECT_EQ(util::error::ALREADY_EXISTS, status.error_code());
+TEST_F(HybridConfigTest, Basic) {
+  EXPECT_THAT(Registry::get_key_manager<HybridDecrypt>(
+                  EciesAeadHkdfPrivateKeyManager().get_key_type())
+                  .status(),
+              StatusIs(util::error::NOT_FOUND));
+  EXPECT_THAT(Registry::get_key_manager<HybridEncrypt>(
+                  EciesAeadHkdfPublicKeyManager().get_key_type())
+                  .status(),
+              StatusIs(util::error::NOT_FOUND));
+  EXPECT_THAT(HybridConfig::Register(), IsOk());
+  EXPECT_THAT(Registry::get_key_manager<HybridDecrypt>(
+                  EciesAeadHkdfPrivateKeyManager().get_key_type())
+                  .status(),
+              IsOk());
+  EXPECT_THAT(Registry::get_key_manager<HybridEncrypt>(
+                  EciesAeadHkdfPublicKeyManager().get_key_type())
+                  .status(),
+              IsOk());
 }
 
 // Tests that the HybridEncryptWrapper has been properly registered and we
@@ -185,10 +74,12 @@
   key.set_key_id(1234);
   key.set_output_prefix_type(google::crypto::tink::OutputPrefixType::TINK);
   auto primitive_set = absl::make_unique<PrimitiveSet<HybridEncrypt>>();
-  primitive_set->set_primary(
-      primitive_set
-          ->AddPrimitive(absl::make_unique<DummyHybridEncrypt>("dummy"), key)
-          .ValueOrDie());
+  ASSERT_THAT(primitive_set->set_primary(
+                  primitive_set
+                      ->AddPrimitive(
+                          absl::make_unique<DummyHybridEncrypt>("dummy"), key)
+                      .ValueOrDie()),
+              IsOk());
 
   auto wrapped = Registry::Wrap(std::move(primitive_set));
 
@@ -214,10 +105,12 @@
   key.set_key_id(1234);
   key.set_output_prefix_type(google::crypto::tink::OutputPrefixType::TINK);
   auto primitive_set = absl::make_unique<PrimitiveSet<HybridDecrypt>>();
-  primitive_set->set_primary(
-      primitive_set
-          ->AddPrimitive(absl::make_unique<DummyHybridDecrypt>("dummy"), key)
-          .ValueOrDie());
+  ASSERT_THAT(primitive_set->set_primary(
+                  primitive_set
+                      ->AddPrimitive(
+                          absl::make_unique<DummyHybridDecrypt>("dummy"), key)
+                      .ValueOrDie()),
+              IsOk());
 
   auto wrapped = Registry::Wrap(std::move(primitive_set));
 
diff --git a/cc/hybrid/hybrid_decrypt_catalogue.cc b/cc/hybrid/hybrid_decrypt_catalogue.cc
deleted file mode 100644
index ecf6fea..0000000
--- a/cc/hybrid/hybrid_decrypt_catalogue.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#include "tink/hybrid/hybrid_decrypt_catalogue.h"
-
-#include "absl/strings/ascii.h"
-#include "tink/catalogue.h"
-#include "tink/hybrid/ecies_aead_hkdf_private_key_manager.h"
-#include "tink/key_manager.h"
-#include "tink/util/status.h"
-#include "tink/util/statusor.h"
-
-namespace crypto {
-namespace tink {
-
-namespace {
-
-crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<HybridDecrypt>>>
-CreateKeyManager(const std::string& type_url) {
-  if (type_url == EciesAeadHkdfPrivateKeyManager::static_key_type()) {
-    std::unique_ptr<KeyManager<HybridDecrypt>> manager(
-        new EciesAeadHkdfPrivateKeyManager());
-    return std::move(manager);
-  }
-  return ToStatusF(crypto::tink::util::error::NOT_FOUND,
-                   "No key manager for type_url '%s'.", type_url.c_str());
-}
-
-}  // anonymous namespace
-
-crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<HybridDecrypt>>>
-HybridDecryptCatalogue::GetKeyManager(const std::string& type_url,
-                                      const std::string& primitive_name,
-                                      uint32_t min_version) const {
-  if (!(absl::AsciiStrToLower(primitive_name) == "hybriddecrypt")) {
-    return ToStatusF(crypto::tink::util::error::NOT_FOUND,
-                     "This catalogue does not support primitive %s.",
-                     primitive_name.c_str());
-  }
-  auto manager_result = CreateKeyManager(type_url);
-  if (!manager_result.ok()) return manager_result;
-  if (manager_result.ValueOrDie()->get_version() < min_version) {
-    return ToStatusF(
-        crypto::tink::util::error::NOT_FOUND,
-        "No key manager for type_url '%s' with version at least %d.",
-        type_url.c_str(), min_version);
-  }
-  return std::move(manager_result.ValueOrDie());
-}
-
-}  // namespace tink
-}  // namespace crypto
diff --git a/cc/hybrid/hybrid_decrypt_catalogue.h b/cc/hybrid/hybrid_decrypt_catalogue.h
deleted file mode 100644
index f307ecf..0000000
--- a/cc/hybrid/hybrid_decrypt_catalogue.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#ifndef TINK_HYBRID_HYBRID_DECRYPT_CATALOGUE_H_
-#define TINK_HYBRID_HYBRID_DECRYPT_CATALOGUE_H_
-
-#include "tink/catalogue.h"
-#include "tink/hybrid_decrypt.h"
-#include "tink/key_manager.h"
-#include "tink/util/statusor.h"
-
-namespace crypto {
-namespace tink {
-
-///////////////////////////////////////////////////////////////////////////////
-// A catalogue of Tink HybridDecrypt key mangers.
-class HybridDecryptCatalogue : public Catalogue<HybridDecrypt> {
- public:
-  HybridDecryptCatalogue() {}
-
-  crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<HybridDecrypt>>>
-  GetKeyManager(const std::string& type_url, const std::string& primitive_name,
-                uint32_t min_version) const;
-};
-
-}  // namespace tink
-}  // namespace crypto
-
-#endif  // TINK_HYBRID_HYBRID_DECRYPT_CATALOGUE_H_
diff --git a/cc/hybrid/hybrid_decrypt_catalogue_test.cc b/cc/hybrid/hybrid_decrypt_catalogue_test.cc
deleted file mode 100644
index 7e26d5e..0000000
--- a/cc/hybrid/hybrid_decrypt_catalogue_test.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-#include "tink/hybrid/hybrid_decrypt_catalogue.h"
-
-#include "tink/catalogue.h"
-#include "tink/util/status.h"
-#include "tink/util/statusor.h"
-#include "gtest/gtest.h"
-
-namespace crypto {
-namespace tink {
-namespace {
-
-class HybridDecryptCatalogueTest : public ::testing::Test {
-};
-
-TEST_F(HybridDecryptCatalogueTest, testBasic) {
-  std::string key_type =
-      "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey";
-  HybridDecryptCatalogue catalogue;
-
-  {
-    auto manager_result = catalogue.GetKeyManager(key_type, "HybridDecrypt", 0);
-    EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-    EXPECT_TRUE(manager_result.ValueOrDie()->DoesSupport(key_type));
-  }
-
-  {
-    auto manager_result = catalogue.GetKeyManager(key_type, "hybRiDdeCrYpt", 0);
-    EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-    EXPECT_TRUE(manager_result.ValueOrDie()->DoesSupport(key_type));
-  }
-
-  {
-    auto manager_result = catalogue.GetKeyManager(key_type, "Mac", 0);
-    EXPECT_FALSE(manager_result.ok());
-    EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-  }
-
-  {
-    auto manager_result = catalogue.GetKeyManager(key_type, "HybridDecrypt", 1);
-    EXPECT_FALSE(manager_result.ok());
-    EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-  }
-}
-
-}  // namespace
-}  // namespace tink
-}  // namespace crypto
diff --git a/cc/hybrid/hybrid_decrypt_factory_test.cc b/cc/hybrid/hybrid_decrypt_factory_test.cc
index 3e172c5..59ef20f 100644
--- a/cc/hybrid/hybrid_decrypt_factory_test.cc
+++ b/cc/hybrid/hybrid_decrypt_factory_test.cc
@@ -25,16 +25,15 @@
 #include "tink/hybrid_decrypt.h"
 #include "tink/hybrid_encrypt.h"
 #include "tink/keyset_handle.h"
-#include "tink/util/keyset_util.h"
 #include "tink/util/status.h"
+#include "tink/util/test_keyset_handle.h"
 #include "tink/util/test_util.h"
 #include "proto/ecies_aead_hkdf.pb.h"
 #include "proto/tink.pb.h"
 
-using crypto::tink::KeysetUtil;
+using crypto::tink::TestKeysetHandle;
 using crypto::tink::test::AddRawKey;
 using crypto::tink::test::AddTinkKey;
-using google::crypto::tink::EciesAeadHkdfKeyFormat;
 using google::crypto::tink::EciesAeadHkdfPrivateKey;
 using google::crypto::tink::EcPointFormat;
 using google::crypto::tink::EllipticCurveType;
@@ -42,8 +41,6 @@
 using google::crypto::tink::KeyData;
 using google::crypto::tink::Keyset;
 using google::crypto::tink::KeyStatusType;
-using google::crypto::tink::KeyTemplate;
-
 
 namespace crypto {
 namespace tink {
@@ -60,8 +57,8 @@
 
 TEST_F(HybridDecryptFactoryTest, testBasic) {
   Keyset keyset;
-  auto hybrid_decrypt_result =
-      HybridDecryptFactory::GetPrimitive(*KeysetUtil::GetKeysetHandle(keyset));
+  auto hybrid_decrypt_result = HybridDecryptFactory::GetPrimitive(
+      *TestKeysetHandle::GetKeysetHandle(keyset));
   EXPECT_FALSE(hybrid_decrypt_result.ok());
   EXPECT_EQ(util::error::INVALID_ARGUMENT,
       hybrid_decrypt_result.status().error_code());
@@ -98,13 +95,15 @@
   // Prepare HybridEncrypt-instances.
   auto ecies_key_manager = absl::make_unique<EciesAeadHkdfPublicKeyManager>();
   std::unique_ptr<HybridEncrypt> ecies_1 = std::move(
-      ecies_key_manager->GetPrimitive(ecies_key_1.public_key()).ValueOrDie());
+      ecies_key_manager->GetPrimitive<HybridEncrypt>(ecies_key_1.public_key())
+          .ValueOrDie());
   std::unique_ptr<HybridEncrypt> ecies_2 = std::move(
-      ecies_key_manager->GetPrimitive(ecies_key_2.public_key()).ValueOrDie());
+      ecies_key_manager->GetPrimitive<HybridEncrypt>(ecies_key_2.public_key())
+          .ValueOrDie());
 
   // Create a KeysetHandle and use it with the factory.
-  auto hybrid_decrypt_result =
-      HybridDecryptFactory::GetPrimitive(*KeysetUtil::GetKeysetHandle(keyset));
+  auto hybrid_decrypt_result = HybridDecryptFactory::GetPrimitive(
+      *TestKeysetHandle::GetKeysetHandle(keyset));
   EXPECT_TRUE(hybrid_decrypt_result.ok()) << hybrid_decrypt_result.status();
   auto hybrid_decrypt = std::move(hybrid_decrypt_result.ValueOrDie());
 
diff --git a/cc/hybrid/hybrid_decrypt_wrapper_test.cc b/cc/hybrid/hybrid_decrypt_wrapper_test.cc
index 03c6283..b052d45 100644
--- a/cc/hybrid/hybrid_decrypt_wrapper_test.cc
+++ b/cc/hybrid/hybrid_decrypt_wrapper_test.cc
@@ -15,17 +15,20 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 #include "tink/hybrid/hybrid_decrypt_wrapper.h"
+
+#include "gtest/gtest.h"
 #include "tink/hybrid_decrypt.h"
 #include "tink/primitive_set.h"
 #include "tink/util/status.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
-#include "gtest/gtest.h"
 
-using crypto::tink::test::DummyHybridDecrypt;
-using crypto::tink::test::DummyHybridEncrypt;
-using google::crypto::tink::OutputPrefixType;
-using google::crypto::tink::Keyset;
-
+using ::crypto::tink::test::DummyHybridDecrypt;
+using ::crypto::tink::test::DummyHybridEncrypt;
+using ::google::crypto::tink::Keyset;
+using ::google::crypto::tink::KeyStatusType;
+using ::google::crypto::tink::OutputPrefixType;
+using ::crypto::tink::test::IsOk;
 
 namespace crypto {
 namespace tink {
@@ -70,16 +73,19 @@
     key = keyset.add_key();
     key->set_output_prefix_type(OutputPrefixType::RAW);
     key->set_key_id(key_id_0);
+    key->set_status(KeyStatusType::ENABLED);
 
     uint32_t key_id_1 = 726329;
     key = keyset.add_key();
     key->set_output_prefix_type(OutputPrefixType::LEGACY);
     key->set_key_id(key_id_1);
+    key->set_status(KeyStatusType::ENABLED);
 
     uint32_t key_id_2 = 7213743;
     key = keyset.add_key();
     key->set_output_prefix_type(OutputPrefixType::TINK);
     key->set_key_id(key_id_2);
+    key->set_status(KeyStatusType::ENABLED);
 
     std::string hybrid_name_0 = "hybrid_0";
     std::string hybrid_name_1 = "hybrid_1";
@@ -101,7 +107,8 @@
         std::move(hybrid_decrypt), keyset.key(2));
     ASSERT_TRUE(entry_result.ok());
     // The last key is the primary.
-    hybrid_decrypt_set->set_primary(entry_result.ValueOrDie());
+    ASSERT_THAT(hybrid_decrypt_set->set_primary(entry_result.ValueOrDie()),
+                IsOk());
 
     // Wrap hybrid_decrypt_set and test the resulting HybridDecrypt.
     auto hybrid_decrypt_result = HybridDecryptWrapper().Wrap(
diff --git a/cc/hybrid/hybrid_encrypt_catalogue.cc b/cc/hybrid/hybrid_encrypt_catalogue.cc
deleted file mode 100644
index 4375625..0000000
--- a/cc/hybrid/hybrid_encrypt_catalogue.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#include "tink/hybrid/hybrid_encrypt_catalogue.h"
-
-#include "absl/strings/ascii.h"
-#include "tink/catalogue.h"
-#include "tink/hybrid/ecies_aead_hkdf_public_key_manager.h"
-#include "tink/key_manager.h"
-#include "tink/util/status.h"
-#include "tink/util/statusor.h"
-
-namespace crypto {
-namespace tink {
-
-namespace {
-
-crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<HybridEncrypt>>>
-CreateKeyManager(const std::string& type_url) {
-  if (type_url == EciesAeadHkdfPublicKeyManager::static_key_type()) {
-    std::unique_ptr<KeyManager<HybridEncrypt>> manager(
-        absl::make_unique<EciesAeadHkdfPublicKeyManager>());
-    return std::move(manager);
-  }
-  return ToStatusF(crypto::tink::util::error::NOT_FOUND,
-                   "No key manager for type_url '%s'.", type_url.c_str());
-}
-
-}  // anonymous namespace
-
-crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<HybridEncrypt>>>
-HybridEncryptCatalogue::GetKeyManager(const std::string& type_url,
-                                      const std::string& primitive_name,
-                                      uint32_t min_version) const {
-  if (!(absl::AsciiStrToLower(primitive_name) == "hybridencrypt")) {
-    return ToStatusF(crypto::tink::util::error::NOT_FOUND,
-                     "This catalogue does not support primitive %s.",
-                     primitive_name.c_str());
-  }
-  auto manager_result = CreateKeyManager(type_url);
-  if (!manager_result.ok()) return manager_result;
-  if (manager_result.ValueOrDie()->get_version() < min_version) {
-    return ToStatusF(
-        crypto::tink::util::error::NOT_FOUND,
-        "No key manager for type_url '%s' with version at least %d.",
-        type_url.c_str(), min_version);
-  }
-  return std::move(manager_result.ValueOrDie());
-}
-
-}  // namespace tink
-}  // namespace crypto
diff --git a/cc/hybrid/hybrid_encrypt_catalogue.h b/cc/hybrid/hybrid_encrypt_catalogue.h
deleted file mode 100644
index 8ac0958..0000000
--- a/cc/hybrid/hybrid_encrypt_catalogue.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#ifndef TINK_HYBRID_HYBRID_ENCRYPT_CATALOGUE_H_
-#define TINK_HYBRID_HYBRID_ENCRYPT_CATALOGUE_H_
-
-#include "tink/catalogue.h"
-#include "tink/hybrid_encrypt.h"
-#include "tink/key_manager.h"
-#include "tink/util/statusor.h"
-
-namespace crypto {
-namespace tink {
-
-///////////////////////////////////////////////////////////////////////////////
-// A catalogue of Tink HybridEncrypt key mangers.
-class HybridEncryptCatalogue : public Catalogue<HybridEncrypt> {
- public:
-  HybridEncryptCatalogue() {}
-
-  crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<HybridEncrypt>>>
-  GetKeyManager(const std::string& type_url, const std::string& primitive_name,
-                uint32_t min_version) const;
-};
-
-}  // namespace tink
-}  // namespace crypto
-
-#endif  // TINK_HYBRID_HYBRID_ENCRYPT_CATALOGUE_H_
diff --git a/cc/hybrid/hybrid_encrypt_catalogue_test.cc b/cc/hybrid/hybrid_encrypt_catalogue_test.cc
deleted file mode 100644
index 0fde8c4..0000000
--- a/cc/hybrid/hybrid_encrypt_catalogue_test.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-#include "tink/hybrid/hybrid_encrypt_catalogue.h"
-
-#include "tink/catalogue.h"
-#include "tink/util/status.h"
-#include "tink/util/statusor.h"
-#include "gtest/gtest.h"
-
-namespace crypto {
-namespace tink {
-namespace {
-
-class HybridEncryptCatalogueTest : public ::testing::Test {
-};
-
-TEST_F(HybridEncryptCatalogueTest, testBasic) {
-  std::string key_type =
-      "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey";
-  HybridEncryptCatalogue catalogue;
-
-  {
-    auto manager_result = catalogue.GetKeyManager(key_type, "HybridEncrypt", 0);
-    EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-    EXPECT_TRUE(manager_result.ValueOrDie()->DoesSupport(key_type));
-  }
-
-  {
-    auto manager_result = catalogue.GetKeyManager(key_type, "hybRiDenCrypT", 0);
-    EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-    EXPECT_TRUE(manager_result.ValueOrDie()->DoesSupport(key_type));
-  }
-
-  {
-    auto manager_result = catalogue.GetKeyManager(key_type, "Mac", 0);
-    EXPECT_FALSE(manager_result.ok());
-    EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-  }
-
-  {
-    auto manager_result = catalogue.GetKeyManager(key_type, "HybridEncrypt", 1);
-    EXPECT_FALSE(manager_result.ok());
-    EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-  }
-}
-
-}  // namespace
-}  // namespace tink
-}  // namespace crypto
diff --git a/cc/hybrid/hybrid_encrypt_factory_test.cc b/cc/hybrid/hybrid_encrypt_factory_test.cc
index b12293b..aad2e6a 100644
--- a/cc/hybrid/hybrid_encrypt_factory_test.cc
+++ b/cc/hybrid/hybrid_encrypt_factory_test.cc
@@ -22,16 +22,15 @@
 #include "tink/hybrid/hybrid_config.h"
 #include "tink/hybrid_encrypt.h"
 #include "tink/keyset_handle.h"
-#include "tink/util/keyset_util.h"
 #include "tink/util/status.h"
+#include "tink/util/test_keyset_handle.h"
 #include "tink/util/test_util.h"
 #include "proto/ecies_aead_hkdf.pb.h"
 #include "proto/tink.pb.h"
 
-using crypto::tink::KeysetUtil;
+using crypto::tink::TestKeysetHandle;
 using crypto::tink::test::AddRawKey;
 using crypto::tink::test::AddTinkKey;
-using google::crypto::tink::EciesAeadHkdfKeyFormat;
 using google::crypto::tink::EciesAeadHkdfPublicKey;
 using google::crypto::tink::EcPointFormat;
 using google::crypto::tink::EllipticCurveType;
@@ -39,8 +38,6 @@
 using google::crypto::tink::KeyData;
 using google::crypto::tink::Keyset;
 using google::crypto::tink::KeyStatusType;
-using google::crypto::tink::KeyTemplate;
-
 
 namespace crypto {
 namespace tink {
@@ -58,8 +55,8 @@
 
 TEST_F(HybridEncryptFactoryTest, testBasic) {
   Keyset keyset;
-  auto hybrid_encrypt_result =
-      HybridEncryptFactory::GetPrimitive(*KeysetUtil::GetKeysetHandle(keyset));
+  auto hybrid_encrypt_result = HybridEncryptFactory::GetPrimitive(
+      *TestKeysetHandle::GetKeysetHandle(keyset));
   EXPECT_FALSE(hybrid_encrypt_result.ok());
   EXPECT_EQ(util::error::INVALID_ARGUMENT,
       hybrid_encrypt_result.status().error_code());
@@ -92,8 +89,8 @@
   ASSERT_TRUE(HybridConfig::Register().ok());
 
   // Create a KeysetHandle and use it with the factory.
-  auto hybrid_encrypt_result =
-      HybridEncryptFactory::GetPrimitive(*KeysetUtil::GetKeysetHandle(keyset));
+  auto hybrid_encrypt_result = HybridEncryptFactory::GetPrimitive(
+      *TestKeysetHandle::GetKeysetHandle(keyset));
   EXPECT_TRUE(hybrid_encrypt_result.ok()) << hybrid_encrypt_result.status();
   auto hybrid_encrypt = std::move(hybrid_encrypt_result.ValueOrDie());
 
diff --git a/cc/hybrid/hybrid_encrypt_wrapper_test.cc b/cc/hybrid/hybrid_encrypt_wrapper_test.cc
index 444484f..185ee34 100644
--- a/cc/hybrid/hybrid_encrypt_wrapper_test.cc
+++ b/cc/hybrid/hybrid_encrypt_wrapper_test.cc
@@ -15,15 +15,19 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 #include "tink/hybrid/hybrid_encrypt_wrapper.h"
+
+#include "gtest/gtest.h"
 #include "tink/hybrid_encrypt.h"
 #include "tink/primitive_set.h"
 #include "tink/util/status.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
-#include "gtest/gtest.h"
 
-using crypto::tink::test::DummyHybridEncrypt;
-using google::crypto::tink::OutputPrefixType;
-using google::crypto::tink::Keyset;
+using ::crypto::tink::test::DummyHybridEncrypt;
+using ::crypto::tink::test::IsOk;
+using ::google::crypto::tink::Keyset;
+using ::google::crypto::tink::KeyStatusType;
+using ::google::crypto::tink::OutputPrefixType;
 
 namespace crypto {
 namespace tink {
@@ -68,16 +72,19 @@
     key = keyset.add_key();
     key->set_output_prefix_type(OutputPrefixType::TINK);
     key->set_key_id(key_id_0);
+    key->set_status(KeyStatusType::ENABLED);
 
     uint32_t key_id_1 = 726329;
     key = keyset.add_key();
     key->set_output_prefix_type(OutputPrefixType::LEGACY);
     key->set_key_id(key_id_1);
+    key->set_status(KeyStatusType::ENABLED);
 
     uint32_t key_id_2 = 7213743;
     key = keyset.add_key();
     key->set_output_prefix_type(OutputPrefixType::TINK);
     key->set_key_id(key_id_2);
+    key->set_status(KeyStatusType::ENABLED);
 
     std::string hybrid_name_0 = "hybrid_0";
     std::string hybrid_name_1 = "hybrid_1";
@@ -98,7 +105,8 @@
         std::move(hybrid_encrypt), keyset.key(2));
     ASSERT_TRUE(entry_result.ok());
     // The last key is the primary.
-    hybrid_encrypt_set->set_primary(entry_result.ValueOrDie());
+    ASSERT_THAT(hybrid_encrypt_set->set_primary(entry_result.ValueOrDie()),
+                IsOk());
 
     // Wrap hybrid_encrypt_set and test the resulting HybridEncrypt.
     auto hybrid_encrypt_result = HybridEncryptWrapper().Wrap(
diff --git a/cc/hybrid/hybrid_key_templates.cc b/cc/hybrid/hybrid_key_templates.cc
index d921753..93ace16 100644
--- a/cc/hybrid/hybrid_key_templates.cc
+++ b/cc/hybrid/hybrid_key_templates.cc
@@ -80,6 +80,54 @@
   return *key_template;
 }
 
+// static
+const KeyTemplate&
+HybridKeyTemplates::EciesP256CompressedHkdfHmacSha256Aes128Gcm() {
+  static const KeyTemplate* key_template = NewEciesAeadHkdfKeyTemplate(
+      EllipticCurveType::NIST_P256, HashType::SHA256, EcPointFormat::COMPRESSED,
+      AeadKeyTemplates::Aes128Gcm(),
+      /* hkdf_salt= */ "");
+  return *key_template;
+}
+
+// static
+const KeyTemplate&
+HybridKeyTemplates::EciesP256CompressedHkdfHmacSha256Aes128CtrHmacSha256() {
+  static const KeyTemplate* key_template = NewEciesAeadHkdfKeyTemplate(
+      EllipticCurveType::NIST_P256, HashType::SHA256, EcPointFormat::COMPRESSED,
+      AeadKeyTemplates::Aes128CtrHmacSha256(),
+      /* hkdf_salt= */ "");
+  return *key_template;
+}
+
+// static
+const KeyTemplate& HybridKeyTemplates::EciesX25519HkdfHmacSha256Aes128Gcm() {
+  static const KeyTemplate* key_template = NewEciesAeadHkdfKeyTemplate(
+      EllipticCurveType::CURVE25519, HashType::SHA256,
+      EcPointFormat::COMPRESSED, AeadKeyTemplates::Aes128Gcm(),
+      /* hkdf_salt= */ "");
+  return *key_template;
+}
+
+// static
+const KeyTemplate&
+HybridKeyTemplates::EciesX25519HkdfHmacSha256Aes128CtrHmacSha256() {
+  static const KeyTemplate* key_template = NewEciesAeadHkdfKeyTemplate(
+      EllipticCurveType::CURVE25519, HashType::SHA256,
+      EcPointFormat::COMPRESSED, AeadKeyTemplates::Aes128CtrHmacSha256(),
+      /* hkdf_salt= */ "");
+  return *key_template;
+}
+
+// static
+const KeyTemplate&
+HybridKeyTemplates::EciesX25519HkdfHmacSha256XChaCha20Poly1305() {
+  static const KeyTemplate* key_template = NewEciesAeadHkdfKeyTemplate(
+      EllipticCurveType::CURVE25519, HashType::SHA256,
+      EcPointFormat::COMPRESSED, AeadKeyTemplates::XChaCha20Poly1305(),
+      /* hkdf_salt= */ "");
+  return *key_template;
+}
 
 }  // namespace tink
 }  // namespace crypto
diff --git a/cc/hybrid/hybrid_key_templates.h b/cc/hybrid/hybrid_key_templates.h
index fde5779..8282ee6 100644
--- a/cc/hybrid/hybrid_key_templates.h
+++ b/cc/hybrid/hybrid_key_templates.h
@@ -41,6 +41,7 @@
   //   - KEM: ECDH over NIST P-256
   //   - DEM: AES128-GCM
   //   - KDF: HKDF-HMAC-SHA256 with an empty salt
+  //   - EC Point Format: Uncompressed
   //   - OutputPrefixType: TINK
   static const google::crypto::tink::KeyTemplate&
   EciesP256HkdfHmacSha256Aes128Gcm();
@@ -54,9 +55,70 @@
   //          * HMAC key size: 32 bytes
   //          * HMAC tag size: 16 bytes
   //   - KDF: HKDF-HMAC-SHA256 with an empty salt
+  //   - EC Point Format: Uncompressed
   //   - OutputPrefixType: TINK
   static const google::crypto::tink::KeyTemplate&
   EciesP256HkdfHmacSha256Aes128CtrHmacSha256();
+
+  // Returns a KeyTemplate that generates new instances of
+  // EciesAeadHkdfPrivateKey with the following parameters:
+  //   - KEM: ECDH over NIST P-256
+  //   - DEM: AES128-GCM
+  //   - KDF: HKDF-HMAC-SHA256 with an empty salt
+  //   - EC Point Format: Compressed
+  //   - OutputPrefixType: TINK
+  static const google::crypto::tink::KeyTemplate&
+  EciesP256CompressedHkdfHmacSha256Aes128Gcm();
+
+  // Returns a KeyTemplate that generates new instances of
+  // EciesAeadHkdfPrivateKey with the following parameters:
+  //   - KEM: ECDH over NIST P-256
+  //   - DEM: AES128-CTR-HMAC-SHA256 with the following parameters:
+  //          * AES key size: 16 bytes
+  //          * AES CTR IV size: 16 bytes
+  //          * HMAC key size: 32 bytes
+  //          * HMAC tag size: 16 bytes
+  //   - KDF: HKDF-HMAC-SHA256 with an empty salt
+  //   - EC Point Format: Compressed
+  //   - OutputPrefixType: TINK
+  static const google::crypto::tink::KeyTemplate&
+  EciesP256CompressedHkdfHmacSha256Aes128CtrHmacSha256();
+
+  // Returns a KeyTemplate that generates new instances of
+  // EciesAeadHkdfPrivateKey with the following parameters:
+  //   - KEM: ECDH over curve 25519
+  //   - DEM: AES128-GCM
+  //   - KDF: HKDF-HMAC-SHA256 with an empty salt
+  //   - EC Point Format: Compressed
+  //   - OutputPrefixType: TINK
+  static const google::crypto::tink::KeyTemplate&
+  EciesX25519HkdfHmacSha256Aes128Gcm();
+
+  // Returns a KeyTemplate that generates new instances of
+  // EciesAeadHkdfPrivateKey with the following parameters:
+  //   - KEM: ECDH over curve 25519
+  //   - DEM: AES128-CTR-HMAC-SHA256 with the following parameters:
+  //          * AES key size: 16 bytes
+  //          * AES CTR IV size: 16 bytes
+  //          * HMAC key size: 32 bytes
+  //          * HMAC tag size: 16 bytes
+  //   - KDF: HKDF-HMAC-SHA256 with an empty salt
+  //   - EC Point Format: Compressed
+  //   - OutputPrefixType: TINK
+  static const google::crypto::tink::KeyTemplate&
+  EciesX25519HkdfHmacSha256Aes128CtrHmacSha256();
+
+  // Returns a KeyTemplate that generates new instances of
+  // EciesAeadHkdfPrivateKey with the following parameters:
+  //   - KEM: ECDH over curve 25519
+  //   - DEM: XChaCha20-Poly1305 with the following parameters:
+  //          * XChaCha20 key size: 32 bytes
+  //          * IV size: 24 bytes
+  //   - KDF: HKDF-HMAC-SHA256 with an empty salt
+  //   - EC Point Format: Compressed
+  //   - OutputPrefixType: TINK
+  static const google::crypto::tink::KeyTemplate&
+  EciesX25519HkdfHmacSha256XChaCha20Poly1305();
 };
 
 }  // namespace tink
diff --git a/cc/hybrid/hybrid_key_templates_test.cc b/cc/hybrid/hybrid_key_templates_test.cc
index e23aa4a..3105daa 100644
--- a/cc/hybrid/hybrid_key_templates_test.cc
+++ b/cc/hybrid/hybrid_key_templates_test.cc
@@ -16,13 +16,15 @@
 
 #include "tink/hybrid/hybrid_key_templates.h"
 
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
 #include "tink/aead/aead_key_templates.h"
 #include "tink/hybrid/ecies_aead_hkdf_private_key_manager.h"
 #include "tink/hybrid/hybrid_config.h"
+#include "tink/util/test_matchers.h"
 #include "proto/common.pb.h"
 #include "proto/ecies_aead_hkdf.pb.h"
 #include "proto/tink.pb.h"
-#include "gtest/gtest.h"
 
 namespace crypto {
 namespace tink {
@@ -34,12 +36,13 @@
 using google::crypto::tink::HashType;
 using google::crypto::tink::KeyTemplate;
 using google::crypto::tink::OutputPrefixType;
+using ::crypto::tink::test::IsOk;
 
 class HybridKeyTemplatesTest : public ::testing::Test {
  protected:
-  static void SetUpTestCase() {
+  static void SetUpTestSuite() {
     // Initialize the registry, so that the templates can be tested.
-    HybridConfig::Register();
+    ASSERT_THAT(HybridConfig::Register(), IsOk());
   }
 };
 
@@ -78,8 +81,7 @@
     // Check that the template works with the key manager.
     EciesAeadHkdfPrivateKeyManager key_manager;
     EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
-    auto new_key_result = key_manager.get_key_factory().NewKey(key_format);
-    EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
+    EXPECT_THAT(key_manager.ValidateKeyFormat(key_format), IsOk());
   }
 
   {  // Test EciesP256HkdfHmacSha256Aes128CtrHmacSha256().
@@ -113,8 +115,162 @@
     // Check that the template works with the key manager.
     EciesAeadHkdfPrivateKeyManager key_manager;
     EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
-    auto new_key_result = key_manager.get_key_factory().NewKey(key_format);
-    EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
+    EXPECT_THAT(key_manager.ValidateKeyFormat(key_format), IsOk());
+  }
+
+  {  // Test EciesP256CompressedHkdfHmacSha256Aes128Gcm().
+    // Check that returned template is correct.
+    const KeyTemplate& key_template =
+        HybridKeyTemplates::EciesP256CompressedHkdfHmacSha256Aes128Gcm();
+    EXPECT_EQ(type_url, key_template.type_url());
+    EXPECT_EQ(OutputPrefixType::TINK, key_template.output_prefix_type());
+    EciesAeadHkdfKeyFormat key_format;
+    EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
+    EXPECT_EQ(EcPointFormat::COMPRESSED, key_format.params().ec_point_format());
+    auto dem_params = key_format.mutable_params()->mutable_dem_params();
+    auto expected_dem = AeadKeyTemplates::Aes128Gcm();
+    EXPECT_EQ(expected_dem.output_prefix_type(),
+              dem_params->aead_dem().output_prefix_type());
+    EXPECT_EQ(expected_dem.type_url(), dem_params->aead_dem().type_url());
+    EXPECT_EQ(expected_dem.value(), dem_params->aead_dem().value());
+    auto kem_params = key_format.mutable_params()->mutable_kem_params();
+    EXPECT_EQ(EllipticCurveType::NIST_P256, kem_params->curve_type());
+    EXPECT_EQ(HashType::SHA256, kem_params->hkdf_hash_type());
+    EXPECT_EQ("", kem_params->hkdf_salt());
+
+    // Check that reference to the same object is returned.
+    const KeyTemplate& key_template_2 =
+        HybridKeyTemplates::EciesP256CompressedHkdfHmacSha256Aes128Gcm();
+    EXPECT_EQ(&key_template, &key_template_2);
+
+    // Check that the template works with the key manager.
+    EciesAeadHkdfPrivateKeyManager key_manager;
+    EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
+    EXPECT_THAT(key_manager.ValidateKeyFormat(key_format), IsOk());
+  }
+
+  {  // Test EciesP256CompressedHkdfHmacSha256Aes128CtrHmacSha256().
+    // Check that returned template is correct.
+    const KeyTemplate& key_template = HybridKeyTemplates::
+        EciesP256CompressedHkdfHmacSha256Aes128CtrHmacSha256();
+    EXPECT_EQ(type_url, key_template.type_url());
+    EXPECT_EQ(OutputPrefixType::TINK, key_template.output_prefix_type());
+    EciesAeadHkdfKeyFormat key_format;
+    EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
+    EXPECT_EQ(EcPointFormat::COMPRESSED, key_format.params().ec_point_format());
+    auto dem_params = key_format.mutable_params()->mutable_dem_params();
+    auto expected_dem = AeadKeyTemplates::Aes128CtrHmacSha256();
+    EXPECT_EQ(expected_dem.output_prefix_type(),
+              dem_params->aead_dem().output_prefix_type());
+    EXPECT_EQ(expected_dem.type_url(), dem_params->aead_dem().type_url());
+    EXPECT_EQ(expected_dem.value(), dem_params->aead_dem().value());
+    auto kem_params = key_format.mutable_params()->mutable_kem_params();
+    EXPECT_EQ(EllipticCurveType::NIST_P256, kem_params->curve_type());
+    EXPECT_EQ(HashType::SHA256, kem_params->hkdf_hash_type());
+    EXPECT_EQ("", kem_params->hkdf_salt());
+
+    // Check that reference to the same object is returned.
+    const KeyTemplate& key_template_2 = HybridKeyTemplates::
+        EciesP256CompressedHkdfHmacSha256Aes128CtrHmacSha256();
+    EXPECT_EQ(&key_template, &key_template_2);
+
+    // Check that the template works with the key manager.
+    EciesAeadHkdfPrivateKeyManager key_manager;
+    EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
+    EXPECT_THAT(key_manager.ValidateKeyFormat(key_format), IsOk());
+  }
+
+  {  // Test EciesX25519HkdfHmacSha256Aes128Gcm().
+    // Check that returned template is correct.
+    const KeyTemplate& key_template =
+        HybridKeyTemplates::EciesX25519HkdfHmacSha256Aes128Gcm();
+    EXPECT_EQ(type_url, key_template.type_url());
+    EXPECT_EQ(OutputPrefixType::TINK, key_template.output_prefix_type());
+    EciesAeadHkdfKeyFormat key_format;
+    EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
+    EXPECT_EQ(EcPointFormat::COMPRESSED, key_format.params().ec_point_format());
+    auto dem_params = key_format.mutable_params()->mutable_dem_params();
+    auto expected_dem = AeadKeyTemplates::Aes128Gcm();
+    EXPECT_EQ(expected_dem.output_prefix_type(),
+              dem_params->aead_dem().output_prefix_type());
+    EXPECT_EQ(expected_dem.type_url(), dem_params->aead_dem().type_url());
+    EXPECT_EQ(expected_dem.value(), dem_params->aead_dem().value());
+    auto kem_params = key_format.mutable_params()->mutable_kem_params();
+    EXPECT_EQ(EllipticCurveType::CURVE25519, kem_params->curve_type());
+    EXPECT_EQ(HashType::SHA256, kem_params->hkdf_hash_type());
+    EXPECT_EQ("", kem_params->hkdf_salt());
+
+    // Check that reference to the same object is returned.
+    const KeyTemplate& key_template_2 =
+        HybridKeyTemplates::EciesX25519HkdfHmacSha256Aes128Gcm();
+    EXPECT_EQ(&key_template, &key_template_2);
+
+    // Check that the template works with the key manager.
+    EciesAeadHkdfPrivateKeyManager key_manager;
+    EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
+    EXPECT_THAT(key_manager.ValidateKeyFormat(key_format), IsOk());
+  }
+
+  {  // Test EciesX25519HkdfHmacSha256Aes128CtrHmacSha256().
+    // Check that returned template is correct.
+    const KeyTemplate& key_template =
+        HybridKeyTemplates::EciesX25519HkdfHmacSha256Aes128CtrHmacSha256();
+    EXPECT_EQ(type_url, key_template.type_url());
+    EXPECT_EQ(OutputPrefixType::TINK, key_template.output_prefix_type());
+    EciesAeadHkdfKeyFormat key_format;
+    EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
+    EXPECT_EQ(EcPointFormat::COMPRESSED, key_format.params().ec_point_format());
+    auto dem_params = key_format.mutable_params()->mutable_dem_params();
+    auto expected_dem = AeadKeyTemplates::Aes128CtrHmacSha256();
+    EXPECT_EQ(expected_dem.output_prefix_type(),
+              dem_params->aead_dem().output_prefix_type());
+    EXPECT_EQ(expected_dem.type_url(), dem_params->aead_dem().type_url());
+    EXPECT_EQ(expected_dem.value(), dem_params->aead_dem().value());
+    auto kem_params = key_format.mutable_params()->mutable_kem_params();
+    EXPECT_EQ(EllipticCurveType::CURVE25519, kem_params->curve_type());
+    EXPECT_EQ(HashType::SHA256, kem_params->hkdf_hash_type());
+    EXPECT_EQ("", kem_params->hkdf_salt());
+
+    // Check that reference to the same object is returned.
+    const KeyTemplate& key_template_2 =
+        HybridKeyTemplates::EciesX25519HkdfHmacSha256Aes128CtrHmacSha256();
+    EXPECT_EQ(&key_template, &key_template_2);
+
+    // Check that the template works with the key manager.
+    EciesAeadHkdfPrivateKeyManager key_manager;
+    EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
+    EXPECT_THAT(key_manager.ValidateKeyFormat(key_format), IsOk());
+  }
+
+  {  // Test EciesX25519HkdfHmacSha256XChaCha20Poly1305().
+    // Check that returned template is correct.
+    const KeyTemplate& key_template =
+        HybridKeyTemplates::EciesX25519HkdfHmacSha256XChaCha20Poly1305();
+    EXPECT_EQ(type_url, key_template.type_url());
+    EXPECT_EQ(OutputPrefixType::TINK, key_template.output_prefix_type());
+    EciesAeadHkdfKeyFormat key_format;
+    EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
+    EXPECT_EQ(EcPointFormat::COMPRESSED, key_format.params().ec_point_format());
+    auto dem_params = key_format.mutable_params()->mutable_dem_params();
+    auto expected_dem = AeadKeyTemplates::XChaCha20Poly1305();
+    EXPECT_EQ(expected_dem.output_prefix_type(),
+              dem_params->aead_dem().output_prefix_type());
+    EXPECT_EQ(expected_dem.type_url(), dem_params->aead_dem().type_url());
+    EXPECT_EQ(expected_dem.value(), dem_params->aead_dem().value());
+    auto kem_params = key_format.mutable_params()->mutable_kem_params();
+    EXPECT_EQ(EllipticCurveType::CURVE25519, kem_params->curve_type());
+    EXPECT_EQ(HashType::SHA256, kem_params->hkdf_hash_type());
+    EXPECT_EQ("", kem_params->hkdf_salt());
+
+    // Check that reference to the same object is returned.
+    const KeyTemplate& key_template_2 =
+        HybridKeyTemplates::EciesX25519HkdfHmacSha256XChaCha20Poly1305();
+    EXPECT_EQ(&key_template, &key_template_2);
+
+    // Check that the template works with the key manager.
+    EciesAeadHkdfPrivateKeyManager key_manager;
+    EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
+    EXPECT_THAT(key_manager.ValidateKeyFormat(key_format), IsOk());
   }
 }
 
diff --git a/cc/integration/awskms/BUILD.bazel b/cc/integration/awskms/BUILD.bazel
index 093b0ec..ef326c8 100644
--- a/cc/integration/awskms/BUILD.bazel
+++ b/cc/integration/awskms/BUILD.bazel
@@ -1,7 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
-
+licenses(["notice"])
 
 cc_library(
     name = "aws_crypto",
@@ -11,20 +10,22 @@
     hdrs = [
         "aws_crypto.h",
     ],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
     deps = [
         "@aws_cpp_sdk//:aws_sdk_core",
         "@boringssl//:crypto",
         "@com_google_absl//absl/base",
     ],
     alwayslink = 1,
-    strip_include_prefix = "/cc",
-    include_prefix = "tink",
 )
 
 cc_library(
     name = "aws_kms_aead",
     srcs = ["aws_kms_aead.cc"],
     hdrs = ["aws_kms_aead.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
     deps = [
         "//cc:aead",
         "//cc/util:errors",
@@ -33,10 +34,30 @@
         "@aws_cpp_sdk//:aws_sdk_core",
     ],
     alwayslink = 1,
+)
+
+cc_library(
+    name = "aws_kms_client",
+    srcs = ["aws_kms_client.cc"],
+    hdrs = ["aws_kms_client.h"],
+    deps = [
+        ":aws_crypto",
+        ":aws_kms_aead",
+        "//cc:kms_client",
+        "//cc/util:errors",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@aws_cpp_sdk//:aws_sdk_core",
+        "@com_google_absl//absl/strings",
+        "@com_google_absl//absl/synchronization",
+    ],
+    alwayslink = 1,
     strip_include_prefix = "/cc",
     include_prefix = "tink",
 )
 
+# tests
+
 cc_test(
     name = "aws_kms_aead_test",
     size = "medium",
@@ -51,3 +72,19 @@
         "@com_google_googletest//:gtest_main",
     ],
 )
+
+cc_test(
+    name = "aws_kms_client_test",
+    size = "medium",
+    srcs = ["aws_kms_client_test.cc"],
+    copts = ["-Iexternal/gtest/include"],
+    data = ["//testdata:credentials"],
+    deps = [
+        ":aws_kms_client",
+        "//cc/util:errors",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@aws_cpp_sdk//:aws_sdk_core",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
diff --git a/cc/integration/awskms/aws_kms_aead.cc b/cc/integration/awskms/aws_kms_aead.cc
index 8ec0ccf..cc7f957 100644
--- a/cc/integration/awskms/aws_kms_aead.cc
+++ b/cc/integration/awskms/aws_kms_aead.cc
@@ -67,7 +67,7 @@
 }
 
 // static
-StatusOr<std::unique_ptr<AwsKmsAead>>
+StatusOr<std::unique_ptr<Aead>>
 AwsKmsAead::New(absl::string_view key_arn,
                 std::shared_ptr<Aws::KMS::KMSClient> aws_client) {
   if (key_arn.empty()) {
@@ -78,9 +78,8 @@
     return Status(util::error::INVALID_ARGUMENT,
                   "AWS KMS client cannot be null.");
   }
-  std::unique_ptr<AwsKmsAead> kms_aead(
-      new AwsKmsAead(key_arn, std::move(aws_client)));
-  return std::move(kms_aead);
+  std::unique_ptr<Aead> aead(new AwsKmsAead(key_arn, aws_client));
+  return std::move(aead);
 }
 
 StatusOr<std::string> AwsKmsAead::Encrypt(
diff --git a/cc/integration/awskms/aws_kms_aead.h b/cc/integration/awskms/aws_kms_aead.h
index ad008e9..4d5004b 100644
--- a/cc/integration/awskms/aws_kms_aead.h
+++ b/cc/integration/awskms/aws_kms_aead.h
@@ -32,7 +32,7 @@
  public:
   // Creates a new AwsKmsAead that is bound to the key specified in 'key_arn',
   // and that uses the given client when communicating with the KMS.
-  static crypto::tink::util::StatusOr<std::unique_ptr<AwsKmsAead>>
+  static crypto::tink::util::StatusOr<std::unique_ptr<Aead>>
   New(absl::string_view key_arn,
       std::shared_ptr<Aws::KMS::KMSClient> aws_client);
 
diff --git a/cc/integration/awskms/aws_kms_client.cc b/cc/integration/awskms/aws_kms_client.cc
new file mode 100644
index 0000000..905dc0f
--- /dev/null
+++ b/cc/integration/awskms/aws_kms_client.cc
@@ -0,0 +1,252 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+#include "tink/integration/awskms/aws_kms_client.h"
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+
+#include "absl/strings/match.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/str_split.h"
+#include "absl/strings/string_view.h"
+#include "absl/synchronization/mutex.h"
+#include "aws/core/Aws.h"
+#include "aws/core/auth/AWSCredentialsProvider.h"
+#include "aws/core/auth/AWSCredentialsProviderChain.h"
+#include "aws/core/client/ClientConfiguration.h"
+#include "aws/core/utils/crypto/Factories.h"
+#include "aws/core/utils/memory/AWSMemory.h"
+#include "aws/kms/KMSClient.h"
+#include "tink/integration/awskms/aws_crypto.h"
+#include "tink/integration/awskms/aws_kms_aead.h"
+#include "tink/kms_client.h"
+#include "tink/util/errors.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace integration {
+namespace awskms {
+
+namespace {
+
+using crypto::tink::ToStatusF;
+using crypto::tink::util::Status;
+using crypto::tink::util::StatusOr;
+
+static constexpr char kKeyUriPrefix[] = "aws-kms://";
+
+// Returns AWS key ARN contained in 'key_uri'.
+// If 'key_uri' does not refer to an AWS key, returns an empty std::string.
+std::string GetKeyArn(absl::string_view key_uri) {
+  if (!absl::StartsWithIgnoreCase(key_uri, kKeyUriPrefix)) return "";
+  return std::string(key_uri.substr(std::string(kKeyUriPrefix).length()));
+}
+
+// Returns ClientConfiguration with region set to the value
+// extracted from 'key_arn'.
+StatusOr<Aws::Client::ClientConfiguration>
+    GetAwsClientConfig(absl::string_view key_arn) {
+  std::vector<std::string> key_arn_parts = absl::StrSplit(key_arn, ':');
+  if (key_arn_parts.size() < 6) {
+    return ToStatusF(util::error::INVALID_ARGUMENT,
+                     "Invalid key ARN '%s'.",
+                     std::string(key_arn).c_str());
+  }
+  Aws::Client::ClientConfiguration config;
+  config.region = key_arn_parts[3].c_str();  // 4th part of key arn
+  config.scheme = Aws::Http::Scheme::HTTPS;
+  config.connectTimeoutMs = 30000;
+  config.requestTimeoutMs = 60000;
+  return config;
+}
+
+// Reads the specified file and returns the content as a std::string.
+StatusOr<std::string> Read(const std::string& filename) {
+  std::ifstream input_stream;
+  input_stream.open(filename, std::ifstream::in);
+  if (!input_stream.is_open()) {
+      return ToStatusF(util::error::INVALID_ARGUMENT,
+                       "Error opening file '%s'.", filename.c_str());
+  }
+  std::stringstream input;
+  input << input_stream.rdbuf();
+  input_stream.close();
+  return input.str();
+}
+
+// Extracts a value of 'name' from 'line', where 'line' must be in format:
+// name = some_value
+StatusOr<std::string> GetValue(absl::string_view name,
+                               absl::string_view line) {
+  std::vector<std::string> parts = absl::StrSplit(line, '=');
+  if (parts.size() != 2 || absl::StripAsciiWhitespace(parts[0]) != name) {
+      return ToStatusF(util::error::INVALID_ARGUMENT,
+          "Expected line in format '%s = some_value'.", std::string(name).c_str());
+  }
+  return std::string(absl::StripAsciiWhitespace(parts[1]));
+}
+
+// Returns AWS credentials that are retrieved as follows:
+//
+// If 'credentials_path' is not empty, then only the specified file
+// is accessed, which should contain lines in the following format:
+//
+//   [default]
+//   aws_access_key_id = your_access_key_id
+//   aws_secret_access_key = your_secret_access_key
+//
+// Otherwise, if 'credentials_path' is empty, the credentials are
+// searched for in the following order:
+//   1. file specified via environment variable AWS_SHARED_CREDENTIALS_FILE
+//   2. file specified via environment variable AWS_PROFILE
+//   3. file ~/.aws/credentials
+//   4. file ~/.aws/config
+//   5. values specified in environment variables AWS_ACCESS_KEY_ID,
+//      AWS_SECRET_ACCESS_KEY and AWS_SESSION_TOKEN
+//
+// For more info on AWS credentials see:
+// https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/credentials.html
+// and documentation of Aws::Auth::EnvironmentAWSCredentialsProvider and
+// Aws::Auth::ProfileConfigFileAWSCredentialsProvider.
+//
+StatusOr<Aws::Auth::AWSCredentials> GetAwsCredentials(
+    absl::string_view credentials_path) {
+  if (!credentials_path.empty()) {  // Read credentials from given file.
+    auto creds_result = Read(std::string(credentials_path));
+    if (!creds_result.ok()) return creds_result.status();
+    std::vector<std::string> creds_lines =
+        absl::StrSplit(creds_result.ValueOrDie(), '\n');
+    if (creds_lines.size() < 3) {
+      return ToStatusF(util::error::INVALID_ARGUMENT,
+                       "Invalid format of credentials in file '%s'.",
+                       std::string(credentials_path).c_str());
+    }
+    auto key_id_result = GetValue("aws_access_key_id", creds_lines[1]);
+    if (!key_id_result.ok()) {
+      return ToStatusF(util::error::INVALID_ARGUMENT,
+                       "Invalid format of credentials in file '%s': %s",
+                       std::string(credentials_path).c_str(),
+                       key_id_result.status().error_message().c_str());
+    }
+    auto secret_key_result = GetValue("aws_secret_access_key", creds_lines[2]);
+    if (!secret_key_result.ok()) {
+      return ToStatusF(util::error::INVALID_ARGUMENT,
+                       "Invalid format of credentials in file '%s': %s",
+                       std::string(credentials_path).c_str(),
+                       secret_key_result.status().error_message().c_str());
+    }
+    return Aws::Auth::AWSCredentials(key_id_result.ValueOrDie().c_str(),
+                                     secret_key_result.ValueOrDie().c_str());
+  }
+
+  // Get default credentials.
+  Aws::Auth::DefaultAWSCredentialsProviderChain provider_chain;
+  return provider_chain.GetAWSCredentials();
+}
+
+}  // namespace
+
+
+bool AwsKmsClient::aws_api_is_initialized_;
+absl::Mutex AwsKmsClient::aws_api_init_mutex_;
+
+// static
+void AwsKmsClient::InitAwsApi() {
+  absl::MutexLock lock(&aws_api_init_mutex_);
+  if (aws_api_is_initialized_) return;
+  Aws::SDKOptions options;
+  options.cryptoOptions.sha256Factory_create_fn = []() {
+      return Aws::MakeShared<AwsSha256Factory>(kAwsCryptoAllocationTag);
+  };
+  options.cryptoOptions.sha256HMACFactory_create_fn = []() {
+      return Aws::MakeShared<AwsSha256HmacFactory>(kAwsCryptoAllocationTag);
+  };
+  Aws::InitAPI(options);
+  aws_api_is_initialized_ = true;
+}
+
+// static
+StatusOr<std::unique_ptr<AwsKmsClient>>
+AwsKmsClient::New(absl::string_view key_uri,
+                  absl::string_view credentials_path) {
+  if (!aws_api_is_initialized_) InitAwsApi();
+  std::unique_ptr<AwsKmsClient> client(new AwsKmsClient());
+
+  // Read credentials.
+  auto credentials_result = GetAwsCredentials(credentials_path);
+  if (!credentials_result.ok()) {
+    return credentials_result.status();
+  }
+  client->credentials_ = credentials_result.ValueOrDie();
+
+  // If a specific key is given, create an AWS KMSClient.
+  if (!key_uri.empty()) {
+    client->key_arn_ = GetKeyArn(key_uri);
+    if (client->key_arn_.empty()) {
+      return ToStatusF(util::error::INVALID_ARGUMENT,
+                       "Key '%s' not supported",
+                       std::string(key_uri).c_str());
+    }
+    auto config_result = GetAwsClientConfig(client->key_arn_);
+    if (!config_result.ok()) return config_result.status();
+    // Create AWS KMSClient.
+    client->aws_client_ = Aws::MakeShared<Aws::KMS::KMSClient>(
+        kAwsCryptoAllocationTag,
+        client->credentials_,
+        config_result.ValueOrDie());
+  }
+  return std::move(client);
+}
+
+bool AwsKmsClient::DoesSupport(absl::string_view key_uri) const {
+  if (!key_arn_.empty()) {
+    return key_arn_ == GetKeyArn(key_uri);
+  }
+  return !GetKeyArn(key_uri).empty();
+}
+
+StatusOr<std::unique_ptr<Aead>>
+AwsKmsClient::GetAead(absl::string_view key_uri) const {
+  if (!DoesSupport(key_uri)) {
+    if (!key_arn_.empty()) {
+      return ToStatusF(util::error::INVALID_ARGUMENT,
+                       "This client is bound to '%s', and cannot use key '%s'.",
+                       key_arn_.c_str(),
+                       std::string(key_uri).c_str());
+    } else {
+      return ToStatusF(util::error::INVALID_ARGUMENT,
+                       "This client does not support key '%s'.",
+                       std::string(key_uri).c_str());
+    }
+  }
+  if (!key_arn_.empty()) {  // This client is bound to a specific key.
+    return AwsKmsAead::New(key_arn_, aws_client_);
+  } else {  // Create an AWS KMSClient for the given key.
+    auto key_arn = GetKeyArn(key_uri);
+    auto config_result = GetAwsClientConfig(key_arn);
+    if (!config_result.ok()) return config_result.status();
+    auto aws_client = Aws::MakeShared<Aws::KMS::KMSClient>(
+        kAwsCryptoAllocationTag, credentials_, config_result.ValueOrDie());
+    return AwsKmsAead::New(key_arn, aws_client);
+  }
+}
+
+
+}  // namespace awskms
+}  // namespace integration
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/integration/awskms/aws_kms_client.h b/cc/integration/awskms/aws_kms_client.h
new file mode 100644
index 0000000..48912a2
--- /dev/null
+++ b/cc/integration/awskms/aws_kms_client.h
@@ -0,0 +1,74 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_INTEGRATION_AWSKMS_AWS_KMS_CLIENT_H_
+#define TINK_INTEGRATION_AWSKMS_AWS_KMS_CLIENT_H_
+
+#include <memory>
+
+#include "absl/strings/string_view.h"
+#include "absl/synchronization/mutex.h"
+#include "aws/core/auth/AWSCredentialsProvider.h"
+#include "aws/kms/KMSClient.h"
+#include "tink/aead.h"
+#include "tink/kms_client.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace integration {
+namespace awskms {
+
+
+// AwsKmsClient is an implementation of KmsClient for
+// <a href="https://aws.amazon.com/kms/">AWS KMS</a>
+class AwsKmsClient : public crypto::tink::KmsClient  {
+ public:
+  // Creates a new AwsKmsClient that is bound to the key specified in 'key_uri',
+  // and that uses the specifed credentials when communicating with the KMS.
+  //
+  // Either of arguments can be empty.
+  // If 'key_uri' is empty, then the client is not bound to any particular key.
+  // If 'credential_path' is empty, then default credentials will be used.
+  static crypto::tink::util::StatusOr<std::unique_ptr<AwsKmsClient>>
+  New(absl::string_view key_uri, absl::string_view credentials_path);
+
+  // Returns true iff this client does support KMS key specified by 'key_uri'.
+  bool DoesSupport(absl::string_view key_uri) const override;
+
+  // Returns an Aead-primitive backed by KMS key specified by 'key_uri',
+  // provided that this KmsClient does support 'key_uri'.
+  crypto::tink::util::StatusOr<std::unique_ptr<Aead>>
+  GetAead(absl::string_view key_uri) const override;
+
+ private:
+  AwsKmsClient() {}
+  // Initializes AWS API.
+  static void InitAwsApi();
+  static bool aws_api_is_initialized_;
+  static absl::Mutex aws_api_init_mutex_;
+
+  std::string key_arn_;
+  Aws::Auth::AWSCredentials credentials_;
+  std::shared_ptr<Aws::KMS::KMSClient> aws_client_;
+};
+
+
+}  // namespace awskms
+}  // namespace integration
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_INTEGRATION_AWSKMS_AWS_KMS_CLIENT_H_
diff --git a/cc/integration/awskms/aws_kms_client_test.cc b/cc/integration/awskms/aws_kms_client_test.cc
new file mode 100644
index 0000000..68d1ec6
--- /dev/null
+++ b/cc/integration/awskms/aws_kms_client_test.cc
@@ -0,0 +1,67 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "tink/integration/awskms/aws_kms_client.h"
+
+#include <cstdlib>
+#include <string>
+#include <vector>
+
+#include "absl/strings/str_cat.h"
+#include "aws/core/Aws.h"
+#include "aws/kms/KMSClient.h"
+#include "gtest/gtest.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace integration {
+namespace awskms {
+namespace {
+
+using crypto::tink::integration::awskms::AwsKmsClient;
+
+TEST(AwsKmsClientTest, testBasic) {
+  std::string aws_key1 = "aws-kms://arn:aws:kms:us-east-1:acc:some/key1";
+  std::string aws_key2 = "aws-kms://arn:aws:kms:us-west-2:acc:other/key2";
+  std::string non_aws_key = "gcp-kms:://some/gcp/key";
+  std::string creds_file = std::string(getenv("TEST_SRCDIR")) +
+                      "/tink/testdata/aws_credentials_cc.txt";
+
+  {  // A client not bound to any particular key.
+    auto client_result = AwsKmsClient::New("", creds_file);
+    EXPECT_TRUE(client_result.ok()) << client_result.status();
+    auto client = std::move(client_result.ValueOrDie());
+    EXPECT_TRUE(client->DoesSupport(aws_key1));
+    EXPECT_TRUE(client->DoesSupport(aws_key2));
+    EXPECT_FALSE(client->DoesSupport(non_aws_key));
+  }
+
+  {  // A client bound to a specific AWS KMS key.
+    auto client_result = AwsKmsClient::New(aws_key1, creds_file);
+    EXPECT_TRUE(client_result.ok()) << client_result.status();
+    auto client = std::move(client_result.ValueOrDie());
+    EXPECT_TRUE(client->DoesSupport(aws_key1));
+    EXPECT_FALSE(client->DoesSupport(aws_key2));
+    EXPECT_FALSE(client->DoesSupport(non_aws_key));
+  }
+}
+
+
+}  // namespace
+}  // namespace awskms
+}  // namespace integration
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/integration/gcpkms/BUILD.bazel b/cc/integration/gcpkms/BUILD.bazel
new file mode 100644
index 0000000..21aa7f7
--- /dev/null
+++ b/cc/integration/gcpkms/BUILD.bazel
@@ -0,0 +1,75 @@
+package(default_visibility = ["//tools/build_defs:internal_pkg"])
+
+licenses(["notice"])
+
+load("@build_stack_rules_proto//cpp:cpp_grpc_library.bzl", "cpp_grpc_library")
+
+cpp_grpc_library(
+    name = "gcp_kms_service_proto",
+    deps = [
+        "@googleapis//google/cloud/kms/v1:kms_proto",
+    ],
+)
+
+cc_library(
+    name = "gcp_kms_aead",
+    srcs = ["gcp_kms_aead.cc"],
+    hdrs = ["gcp_kms_aead.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":gcp_kms_service_proto",
+        "//cc:aead",
+        "//cc/util:errors",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@com_github_grpc_grpc//:grpc++",
+    ],
+)
+
+cc_library(
+    name = "gcp_kms_client",
+    srcs = ["gcp_kms_client.cc"],
+    hdrs = ["gcp_kms_client.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":gcp_kms_aead",
+        "//cc:kms_client",
+        "//cc/util:errors",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@com_github_grpc_grpc//:grpc++",
+        "@com_google_absl//absl/strings",
+        "@com_google_absl//absl/synchronization",
+    ],
+)
+
+# tests
+
+cc_test(
+    name = "gcp_kms_aead_test",
+    size = "medium",
+    srcs = ["gcp_kms_aead_test.cc"],
+    deps = [
+        ":gcp_kms_aead",
+        "//cc/util:errors",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "gcp_kms_client_test",
+    size = "medium",
+    srcs = ["gcp_kms_client_test.cc"],
+    data = ["//testdata:credentials"],
+    deps = [
+        ":gcp_kms_client",
+        "//cc/util:errors",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
diff --git a/cc/integration/gcpkms/gcp_kms_aead.cc b/cc/integration/gcpkms/gcp_kms_aead.cc
new file mode 100644
index 0000000..79ae808
--- /dev/null
+++ b/cc/integration/gcpkms/gcp_kms_aead.cc
@@ -0,0 +1,100 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/integration/gcpkms/gcp_kms_aead.h"
+
+#include "absl/memory/memory.h"
+#include "absl/strings/match.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "google/cloud/kms/v1/service.grpc.pb.h"
+#include "tink/aead.h"
+#include "tink/util/errors.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace integration {
+namespace gcpkms {
+
+using crypto::tink::util::Status;
+using crypto::tink::util::StatusOr;
+using google::cloud::kms::v1::DecryptRequest;
+using google::cloud::kms::v1::DecryptResponse;
+using google::cloud::kms::v1::EncryptRequest;
+using google::cloud::kms::v1::EncryptResponse;
+using google::cloud::kms::v1::KeyManagementService;
+using grpc::ClientContext;
+
+GcpKmsAead::GcpKmsAead(
+    absl::string_view key_name,
+    std::shared_ptr<KeyManagementService::Stub> kms_stub)
+    : key_name_(key_name), kms_stub_(kms_stub) {}
+
+// static
+StatusOr<std::unique_ptr<Aead>>
+GcpKmsAead::New(absl::string_view key_name,
+                std::shared_ptr<KeyManagementService::Stub> kms_stub) {
+  if (key_name.empty()) {
+    return Status(util::error::INVALID_ARGUMENT, "Key URI cannot be empty.");
+  }
+  if (kms_stub == nullptr) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "KMS stub cannot be null.");
+  }
+  std::unique_ptr<Aead> aead(new GcpKmsAead(key_name, kms_stub));
+  return std::move(aead);
+}
+
+StatusOr<std::string> GcpKmsAead::Encrypt(
+    absl::string_view plaintext,
+    absl::string_view associated_data) const {
+  EncryptRequest req;
+  req.set_name(key_name_);
+  req.set_plaintext(std::string(plaintext));
+  req.set_additional_authenticated_data(std::string(associated_data));
+
+  EncryptResponse resp;
+  ClientContext context;
+  auto status =  kms_stub_->Encrypt(&context, req, &resp);
+
+  if (status.ok()) return resp.ciphertext();
+  return ToStatusF(util::error::INVALID_ARGUMENT,
+                   "GCP KMS encryption failed: %s",
+                   status.error_message().c_str());
+}
+
+StatusOr<std::string> GcpKmsAead::Decrypt(
+    absl::string_view ciphertext,
+    absl::string_view associated_data) const {
+  DecryptRequest req;
+  req.set_name(key_name_);
+  req.set_ciphertext(std::string(ciphertext));
+  req.set_additional_authenticated_data(std::string(associated_data));
+
+  DecryptResponse resp;
+  ClientContext context;
+  auto status =  kms_stub_->Decrypt(&context, req, &resp);
+
+  if (status.ok()) return resp.plaintext();
+  return ToStatusF(util::error::INVALID_ARGUMENT,
+                   "GCP KMS encryption failed: %s",
+                   status.error_message().c_str());
+}
+
+}  // namespace gcpkms
+}  // namespace integration
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/integration/gcpkms/gcp_kms_aead.h b/cc/integration/gcpkms/gcp_kms_aead.h
new file mode 100644
index 0000000..5896f0b
--- /dev/null
+++ b/cc/integration/gcpkms/gcp_kms_aead.h
@@ -0,0 +1,71 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_INTEGRATION_GCPKMS_GCP_KMS_AEAD_H_
+#define TINK_INTEGRATION_GCPKMS_GCP_KMS_AEAD_H_
+
+#include "absl/strings/string_view.h"
+
+#include "google/cloud/kms/v1/service.grpc.pb.h"
+
+#include "tink/aead.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace integration {
+namespace gcpkms {
+
+// GcpKmsAead is an implementation of AEAD that forwards
+// encryption/decryption requests to a key managed by
+// <a href="https://cloud.google.com/kms/">Google Cloud KMS</a>.
+class GcpKmsAead : public Aead {
+ public:
+  // Creates a new GcpKmsAead that is bound to the key specified in 'key_name',
+  // and that uses the channel when communicating with the KMS.
+  // Valid values for 'key_name' have the following format:
+  //    projects/*/locations/*/keyRings/*/cryptoKeys/*.
+  // See https://cloud.google.com/kms/docs/object-hierarchy for more info.
+  static crypto::tink::util::StatusOr<std::unique_ptr<Aead>>
+  New(absl::string_view key_name,
+      std::shared_ptr<google::cloud::kms::v1::KeyManagementService::Stub>
+          kms_stub);
+
+  crypto::tink::util::StatusOr<std::string> Encrypt(
+      absl::string_view plaintext,
+      absl::string_view associated_data) const override;
+
+  crypto::tink::util::StatusOr<std::string> Decrypt(
+      absl::string_view ciphertext,
+      absl::string_view associated_data) const override;
+
+  virtual ~GcpKmsAead() {}
+
+ private:
+  GcpKmsAead(
+      absl::string_view key_name,
+      std::shared_ptr<google::cloud::kms::v1::KeyManagementService::Stub>
+          kms_stub);
+  std::string key_name_;  // The location of a crypto key in GCP KMS.
+  std::shared_ptr<google::cloud::kms::v1::KeyManagementService::Stub>
+      kms_stub_;
+};
+
+
+}  // namespace gcpkms
+}  // namespace integration
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_INTEGRATION_GCPKMS_GCP_KMS_AEAD_H_
diff --git a/cc/integration/gcpkms/gcp_kms_aead_test.cc b/cc/integration/gcpkms/gcp_kms_aead_test.cc
new file mode 100644
index 0000000..846064d
--- /dev/null
+++ b/cc/integration/gcpkms/gcp_kms_aead_test.cc
@@ -0,0 +1,33 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "gtest/gtest.h"
+#include "tink/integration/gcpkms/gcp_kms_aead.h"
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+namespace {
+
+using crypto::tink::integration::gcpkms::GcpKmsAead;
+
+class GcpKmsAeadTest : public ::testing::Test {
+  // TODO(przydatek): add a test with a mock KMSClient.
+};
+
+
+}  // namespace
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/integration/gcpkms/gcp_kms_client.cc b/cc/integration/gcpkms/gcp_kms_client.cc
new file mode 100644
index 0000000..1b58c7c
--- /dev/null
+++ b/cc/integration/gcpkms/gcp_kms_client.cc
@@ -0,0 +1,160 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+#include "tink/integration/gcpkms/gcp_kms_client.h"
+
+#include <iostream>
+#include <fstream>
+#include <sstream>
+
+#include "absl/memory/memory.h"
+#include "absl/strings/ascii.h"
+#include "absl/strings/str_split.h"
+#include "absl/strings/string_view.h"
+#include "grpcpp/channel.h"
+#include "grpcpp/create_channel.h"
+#include "grpcpp/security/credentials.h"
+#include "tink/integration/gcpkms/gcp_kms_aead.h"
+#include "tink/kms_client.h"
+#include "tink/util/errors.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace integration {
+namespace gcpkms {
+
+namespace {
+
+using crypto::tink::ToStatusF;
+using crypto::tink::util::Status;
+using crypto::tink::util::StatusOr;
+using google::cloud::kms::v1::KeyManagementService;
+using grpc::Channel;
+using grpc::ChannelCredentials;
+
+static constexpr char kKeyUriPrefix[] = "gcp-kms://";
+static constexpr char kGcpKmsServer[] = "cloudkms.googleapis.com";
+
+StatusOr<std::string> ReadFile(absl::string_view filename) {
+  std::ifstream input_stream;
+  input_stream.open(std::string(filename), std::ifstream::in);
+  if (!input_stream.is_open()) {
+    return ToStatusF(util::error::INVALID_ARGUMENT,
+                     "Error reading file %s", std::string(filename).c_str());
+  }
+  std::stringstream input;
+  input << input_stream.rdbuf();
+  input_stream.close();
+  return input.str();
+}
+
+StatusOr<std::shared_ptr<ChannelCredentials>> GetCredentials(
+    absl::string_view credentials_path) {
+  if (credentials_path.empty()) {
+    auto creds = grpc::GoogleDefaultCredentials();
+    if (creds != nullptr) {
+      return creds;
+    } else {
+      return Status(util::error::INTERNAL,
+                    "Could not read default credentials");
+    }
+  }
+
+  // Try reading credentials from a file.
+  auto json_creds_result = ReadFile(credentials_path);
+  if (!json_creds_result.ok()) return json_creds_result.status();
+  auto creds = grpc::ServiceAccountJWTAccessCredentials(
+      json_creds_result.ValueOrDie());
+  if (creds != nullptr) {
+    // Creating "empty" 'channel_creds', to convert 'creds'
+    // to ChannelCredentials via CompositeChannelCredentials().
+    auto channel_creds = grpc::SslCredentials(grpc::SslCredentialsOptions());
+    return grpc::CompositeChannelCredentials(channel_creds, creds);
+  }
+  return ToStatusF(util::error::INVALID_ARGUMENT,
+                   "Could not load credentials from file %s",
+                   std::string(credentials_path).c_str());
+}
+
+// Returns GCP KMS key name contained in 'key_uri'.
+// If 'key_uri' does not refer to an GCP key, returns an empty std::string.
+std::string GetKeyName(absl::string_view key_uri) {
+  if (!absl::StartsWithIgnoreCase(key_uri, kKeyUriPrefix)) return "";
+  return std::string(key_uri.substr(std::string(kKeyUriPrefix).length()));
+}
+
+}  // namespace
+
+// static
+StatusOr<std::unique_ptr<GcpKmsClient>>
+GcpKmsClient::New(absl::string_view key_uri,
+                  absl::string_view credentials_path) {
+  std::unique_ptr<GcpKmsClient> client(new GcpKmsClient());
+
+  // If a specific key is given, create an AWS KMSClient.
+  if (!key_uri.empty()) {
+    client->key_name_ = GetKeyName(key_uri);
+    if (client->key_name_.empty()) {
+      return ToStatusF(util::error::INVALID_ARGUMENT,
+                       "Key '%s' not supported",
+                       std::string(key_uri).c_str());
+    }
+  }
+  // Read credentials.
+  auto creds_result = GetCredentials(credentials_path);
+  if (!creds_result.ok()) {
+    return creds_result.status();
+  }
+
+  // Create a KMS stub.
+  client->kms_stub_ = KeyManagementService::NewStub(
+      grpc::CreateChannel(kGcpKmsServer, creds_result.ValueOrDie()));
+  return std::move(client);
+}
+
+bool GcpKmsClient::DoesSupport(absl::string_view key_uri) const {
+  if (!key_name_.empty()) {
+    return key_name_ == GetKeyName(key_uri);
+  }
+  return !GetKeyName(key_uri).empty();
+}
+
+StatusOr<std::unique_ptr<Aead>>
+GcpKmsClient::GetAead(absl::string_view key_uri) const {
+  if (!DoesSupport(key_uri)) {
+    if (!key_name_.empty()) {
+      return ToStatusF(util::error::INVALID_ARGUMENT,
+                       "This client is bound to '%s', and cannot use key '%s'.",
+                       key_name_.c_str(),
+                       std::string(key_uri).c_str());
+    } else {
+      return ToStatusF(util::error::INVALID_ARGUMENT,
+                       "This client does not support key '%s'.",
+                       std::string(key_uri).c_str());
+    }
+  }
+  if (!key_name_.empty()) {  // This client is bound to a specific key.
+    return GcpKmsAead::New(key_name_, kms_stub_);
+  } else {  // Create an GCP KMSClient for the given key.
+    auto key_name = GetKeyName(key_uri);
+    return GcpKmsAead::New(key_name, kms_stub_);
+  }
+}
+
+
+}  // namespace gcpkms
+}  // namespace integration
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/integration/gcpkms/gcp_kms_client.h b/cc/integration/gcpkms/gcp_kms_client.h
new file mode 100644
index 0000000..e0c7f2f
--- /dev/null
+++ b/cc/integration/gcpkms/gcp_kms_client.h
@@ -0,0 +1,68 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_INTEGRATION_GCPKMS_GCP_KMS_CLIENT_H_
+#define TINK_INTEGRATION_GCPKMS_GCP_KMS_CLIENT_H_
+
+#include <memory>
+
+#include "absl/strings/string_view.h"
+#include "google/cloud/kms/v1/service.grpc.pb.h"
+#include "grpcpp/channel.h"
+#include "tink/aead.h"
+#include "tink/kms_client.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace integration {
+namespace gcpkms {
+
+
+// GcpKmsClient is an implementation of KmsClient for
+// <a href="https://cloud.google.com/kms/">Google Cloud KMS</a>.
+class GcpKmsClient : public crypto::tink::KmsClient  {
+ public:
+  // Creates a new GcpKmsClient that is bound to the key specified in 'key_uri',
+  // and that uses the specifed credentials when communicating with the KMS.
+  //
+  // Either of arguments can be empty.
+  // If 'key_uri' is empty, then the client is not bound to any particular key.
+  // If 'credential_path' is empty, then default credentials will be used.
+  static crypto::tink::util::StatusOr<std::unique_ptr<GcpKmsClient>>
+  New(absl::string_view key_uri, absl::string_view credentials_path);
+
+  // Returns true iff this client does support KMS key specified by 'key_uri'.
+  bool DoesSupport(absl::string_view key_uri) const override;
+
+  // Returns an Aead-primitive backed by KMS key specified by 'key_uri',
+  // provided that this KmsClient does support 'key_uri'.
+  crypto::tink::util::StatusOr<std::unique_ptr<Aead>>
+  GetAead(absl::string_view key_uri) const override;
+
+ private:
+  GcpKmsClient() {}
+
+  std::string key_name_;
+  std::shared_ptr<google::cloud::kms::v1::KeyManagementService::Stub> kms_stub_;
+};
+
+
+}  // namespace gcpkms
+}  // namespace integration
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_INTEGRATION_GCPKMS_GCP_KMS_CLIENT_H_
diff --git a/cc/integration/gcpkms/gcp_kms_client_test.cc b/cc/integration/gcpkms/gcp_kms_client_test.cc
new file mode 100644
index 0000000..e2c779d
--- /dev/null
+++ b/cc/integration/gcpkms/gcp_kms_client_test.cc
@@ -0,0 +1,69 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "tink/integration/gcpkms/gcp_kms_client.h"
+
+#include <cstdlib>
+#include <string>
+#include <vector>
+
+#include "absl/strings/str_cat.h"
+#include "gtest/gtest.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace integration {
+namespace gcpkms {
+namespace {
+
+using crypto::tink::integration::gcpkms::GcpKmsClient;
+
+TEST(GcpKmsClientTest, ClientNotBoundToAKey) {
+  std::string gcp_key1 = "gcp-kms://projects/someProject/.../cryptoKeys/key1";
+  std::string gcp_key2 = "gcp-kms://projects/otherProject/.../cryptoKeys/key2";
+  std::string non_gcp_key = "aws-kms://arn:aws:kms:us-west-2:acc:other/key3";
+  std::string creds_file = std::string(getenv("TEST_SRCDIR")) +
+                      "/tink/testdata/credential.json";
+
+  auto client_result = GcpKmsClient::New("", creds_file);
+  EXPECT_TRUE(client_result.ok()) << client_result.status();
+  auto client = std::move(client_result.ValueOrDie());
+  EXPECT_TRUE(client->DoesSupport(gcp_key1));
+  EXPECT_TRUE(client->DoesSupport(gcp_key2));
+  EXPECT_FALSE(client->DoesSupport(non_gcp_key));
+}
+
+TEST(GcpKmsClientTest, ClientBoundToASpecificKey) {
+  std::string gcp_key1 = "gcp-kms://projects/someProject/.../cryptoKeys/key1";
+  std::string gcp_key2 = "gcp-kms://projects/otherProject/.../cryptoKeys/key2";
+  std::string non_gcp_key = "aws-kms://arn:aws:kms:us-west-2:acc:other/key3";
+  std::string creds_file = std::string(getenv("TEST_SRCDIR")) +
+                      "/tink/testdata/credential.json";
+
+  auto client_result = GcpKmsClient::New(gcp_key1, creds_file);
+  EXPECT_TRUE(client_result.ok()) << client_result.status();
+  auto client = std::move(client_result.ValueOrDie());
+  EXPECT_TRUE(client->DoesSupport(gcp_key1));
+  EXPECT_FALSE(client->DoesSupport(gcp_key2));
+  EXPECT_FALSE(client->DoesSupport(non_gcp_key));
+}
+
+
+}  // namespace
+}  // namespace gcpkms
+}  // namespace integration
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/key_manager.h b/cc/key_manager.h
index 99e62a2..b486dd3 100644
--- a/cc/key_manager.h
+++ b/cc/key_manager.h
@@ -14,12 +14,12 @@
 //
 ///////////////////////////////////////////////////////////////////////////////
 
-#include <algorithm>
-#include <vector>
-
 #ifndef TINK_KEY_MANAGER_H_
 #define TINK_KEY_MANAGER_H_
 
+#include <algorithm>
+#include <vector>
+
 #include "absl/strings/string_view.h"
 #include "tink/util/errors.h"
 #include "tink/util/protobuf_helper.h"
diff --git a/cc/keyset_handle.h b/cc/keyset_handle.h
index d9270f1..90a1e0d 100644
--- a/cc/keyset_handle.h
+++ b/cc/keyset_handle.h
@@ -52,7 +52,14 @@
   // and writes the resulting EncryptedKeyset to the given |writer|,
   // which must be non-null.
   crypto::tink::util::Status Write(KeysetWriter* writer,
-      const Aead& master_key_aead);
+                                   const Aead& master_key_aead);
+
+  // Writes the underlying keyset to |writer| only if the keyset does not
+  // contain any secret key material.
+  // This can be used to persist public keysets or envelope encryption keysets.
+  // Users that need to persist cleartext keysets can use
+  // |CleartextKeysetHandle|.
+  crypto::tink::util::Status WriteNoSecret(KeysetWriter* writer);
 
   // Returns a new KeysetHandle that contains public keys corresponding
   // to the private keys from this handle.
@@ -78,12 +85,11 @@
  private:
   // The classes below need access to get_keyset();
   friend class CleartextKeysetHandle;
-  friend class NoSecretKeysetHandle;
   friend class KeysetManager;
   friend class RegistryImpl;
 
-  // KeysetUtil::GetKeyset() provides access to get_keyset().
-  friend class KeysetUtil;
+  // TestKeysetHandle::GetKeyset() provides access to get_keyset().
+  friend class TestKeysetHandle;
 
   // Creates a handle that contains the given keyset.
   explicit KeysetHandle(google::crypto::tink::Keyset keyset);
@@ -108,8 +114,8 @@
   // The returned set is usually later "wrapped" into a class that
   // implements the corresponding Primitive-interface.
   template <class P>
-  crypto::tink::util::StatusOr<std::unique_ptr<PrimitiveSet<P>>>
-      GetPrimitives(const KeyManager<P>* custom_manager) const;
+  crypto::tink::util::StatusOr<std::unique_ptr<PrimitiveSet<P>>> GetPrimitives(
+      const KeyManager<P>* custom_manager) const;
 
   google::crypto::tink::Keyset keyset_;
 };
@@ -139,7 +145,9 @@
       auto entry_result = primitives->AddPrimitive(std::move(primitive), key);
       if (!entry_result.ok()) return entry_result.status();
       if (key.key_id() == get_keyset().primary_key_id()) {
-        primitives->set_primary(entry_result.ValueOrDie());
+        auto primary_result =
+            primitives->set_primary(entry_result.ValueOrDie());
+        if (!primary_result.ok()) return primary_result;
       }
     }
   }
@@ -170,7 +178,6 @@
   return Registry::Wrap<P>(std::move(primitives_result.ValueOrDie()));
 }
 
-
 }  // namespace tink
 }  // namespace crypto
 
diff --git a/cc/keyset_manager.h b/cc/keyset_manager.h
index 97b4c3d..d3bfcff 100644
--- a/cc/keyset_manager.h
+++ b/cc/keyset_manager.h
@@ -16,8 +16,6 @@
 #ifndef TINK_KEYSET_MANAGER_H_
 #define TINK_KEYSET_MANAGER_H_
 
-#include <mutex>  // NOLINT(build/c++11)
-
 #include "absl/base/thread_annotations.h"
 #include "absl/synchronization/mutex.h"
 #include "tink/util/status.h"
@@ -53,7 +51,7 @@
   // The added key has status 'ENABLED'.
   crypto::tink::util::StatusOr<uint32_t> Add(
       const google::crypto::tink::KeyTemplate& key_template)
-      LOCKS_EXCLUDED(keyset_mutex_);
+      ABSL_LOCKS_EXCLUDED(keyset_mutex_);
 
   // Adds to the managed keyset a fresh key generated according to
   // 'keyset_template', sets the new key as the primary,
@@ -61,19 +59,19 @@
   // The key that was primary prior to rotation remains 'ENABLED'.
   crypto::tink::util::StatusOr<uint32_t> Rotate(
       const google::crypto::tink::KeyTemplate& key_template)
-      LOCKS_EXCLUDED(keyset_mutex_);
+      ABSL_LOCKS_EXCLUDED(keyset_mutex_);
 
   // Sets the status of the specified key to 'ENABLED'.
   // Succeeds only if before the call the specified key
   // has status 'DISABLED' or 'ENABLED'.
   crypto::tink::util::Status Enable(uint32_t key_id)
-      LOCKS_EXCLUDED(keyset_mutex_);
+      ABSL_LOCKS_EXCLUDED(keyset_mutex_);
 
   // Sets the status of the specified key to 'DISABLED'.
   // Succeeds only if before the call the specified key
   // is not primary and has status 'DISABLED' or 'ENABLED'.
   crypto::tink::util::Status Disable(uint32_t key_id)
-      LOCKS_EXCLUDED(keyset_mutex_);
+      ABSL_LOCKS_EXCLUDED(keyset_mutex_);
 
   // Sets the status of the specified key to 'DESTROYED',
   // and removes the corresponding key material, if any.
@@ -81,32 +79,33 @@
   // is not primary and has status 'DISABLED', or 'ENABLED',
   // or 'DESTROYED'.
   crypto::tink::util::Status Destroy(uint32_t key_id)
-      LOCKS_EXCLUDED(keyset_mutex_);
+      ABSL_LOCKS_EXCLUDED(keyset_mutex_);
 
   // Removes the specifed key from the managed keyset.
   // Succeeds only if the specified key is not primary.
   // After deletion the keyset contains one key fewer.
   crypto::tink::util::Status Delete(uint32_t key_id)
-      LOCKS_EXCLUDED(keyset_mutex_);
+      ABSL_LOCKS_EXCLUDED(keyset_mutex_);
 
   // Sets the specified key as the primary.
   // Succeeds only if the specified key is 'ENABLED'.
   crypto::tink::util::Status SetPrimary(uint32_t key_id)
-      LOCKS_EXCLUDED(keyset_mutex_);
+      ABSL_LOCKS_EXCLUDED(keyset_mutex_);
 
   // Returns the count of all keys in the keyset.
   int KeyCount() const;
 
   // Returns a handle with a copy of the managed keyset.
-  std::unique_ptr<KeysetHandle> GetKeysetHandle() LOCKS_EXCLUDED(keyset_mutex_);
+  std::unique_ptr<KeysetHandle> GetKeysetHandle()
+      ABSL_LOCKS_EXCLUDED(keyset_mutex_);
 
  private:
   crypto::tink::util::StatusOr<uint32_t> Add(
       const google::crypto::tink::KeyTemplate& key_template, bool as_primary)
-      LOCKS_EXCLUDED(keyset_mutex_);
+      ABSL_LOCKS_EXCLUDED(keyset_mutex_);
 
   mutable absl::Mutex keyset_mutex_;
-  google::crypto::tink::Keyset keyset_ GUARDED_BY(keyset_mutex_);
+  google::crypto::tink::Keyset keyset_ ABSL_GUARDED_BY(keyset_mutex_);
 };
 
 }  // namespace tink
diff --git a/cc/kms_clients.h b/cc/kms_clients.h
new file mode 100644
index 0000000..e3fafe1
--- /dev/null
+++ b/cc/kms_clients.h
@@ -0,0 +1,69 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_KMS_CLIENTS_H_
+#define TINK_KMS_CLIENTS_H_
+
+#include <vector>
+
+#include "absl/base/thread_annotations.h"
+#include "absl/strings/string_view.h"
+#include "absl/synchronization/mutex.h"
+#include "tink/kms_client.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+
+// A container for KmsClient-objects that are needed by KeyManager-objects for
+// primitives that use KMS-managed keys.
+//
+// This class consists exclusively of static methods that register and load
+// KmsClient-objects.
+class KmsClients {
+ public:
+  // Adds 'kms_client', which must be non-null, to the list
+  // of the list of known clients.
+  static crypto::tink::util::Status Add(std::unique_ptr<KmsClient> kms_client) {
+    return GlobalInstance().LocalAdd(std::move(kms_client));
+  }
+
+  // Returns the first KmsClient that was added previously via Add(),
+  // and that does support 'key_uri', which must be non-empty.
+  // Retains the ownership of the returned KmsClient.
+  static crypto::tink::util::StatusOr<const KmsClient*>
+      Get(absl::string_view key_uri) {
+    return GlobalInstance().LocalGet(key_uri);
+  }
+
+ private:
+  KmsClients() {}
+
+  // Per-instance API, to be used by GlobalInstance();
+  crypto::tink::util::Status
+      LocalAdd(std::unique_ptr<KmsClient> kms_client);
+  crypto::tink::util::StatusOr<const KmsClient*>
+      LocalGet(absl::string_view key_uri);
+  absl::Mutex clients_mutex_;
+  std::vector<std::unique_ptr<KmsClient>> clients_
+      ABSL_GUARDED_BY(clients_mutex_);
+
+  static KmsClients& GlobalInstance();
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_KMS_CLIENTS_H_
diff --git a/cc/mac/BUILD.bazel b/cc/mac/BUILD.bazel
index 6ad3347..cb3de73 100644
--- a/cc/mac/BUILD.bazel
+++ b/cc/mac/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 cc_library(
     name = "mac_wrapper",
@@ -26,29 +26,21 @@
     hdrs = ["mac_config.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
-        ":mac_catalogue",
-        "//cc:config",
+        ":aes_cmac_key_manager",
+        ":hmac_key_manager",
+        ":mac_wrapper",
+        "//cc:registry",
+        "//cc/config:config_util",
         "//cc/util:status",
         "//proto:config_cc_proto",
+        "@com_google_absl//absl/base:core_headers",
         "@com_google_absl//absl/memory",
     ],
 )
 
 cc_library(
-    name = "mac_catalogue",
-    srcs = ["mac_catalogue.cc"],
-    hdrs = ["mac_catalogue.h"],
-    include_prefix = "tink",
-    strip_include_prefix = "/cc",
-    deps = [
-        ":hmac_key_manager",
-        "//cc:catalogue",
-        "//cc/util:status",
-    ],
-)
-
-cc_library(
     name = "mac_factory",
     srcs = ["mac_factory.cc"],
     hdrs = ["mac_factory.h"],
@@ -73,7 +65,9 @@
     hdrs = ["mac_key_templates.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
+        "//proto:aes_cmac_cc_proto",
         "//proto:common_cc_proto",
         "//proto:hmac_cc_proto",
         "//proto:tink_cc_proto",
@@ -81,17 +75,41 @@
 )
 
 cc_library(
+    name = "aes_cmac_key_manager",
+    hdrs = ["aes_cmac_key_manager.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        "//cc:core/key_type_manager",
+        "//cc:key_manager",
+        "//cc:mac",
+        "//cc/subtle:aes_cmac_boringssl",
+        "//cc/subtle:random",
+        "//cc/util:constants",
+        "//cc/util:enums",
+        "//cc/util:errors",
+        "//cc/util:protobuf_helper",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:validation",
+        "//proto:aes_cmac_cc_proto",
+        "//proto:common_cc_proto",
+        "//proto:tink_cc_proto",
+    ],
+)
+
+cc_library(
     name = "hmac_key_manager",
     srcs = ["hmac_key_manager.cc"],
     hdrs = ["hmac_key_manager.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
     deps = [
-        "//cc:key_manager",
-        "//cc:key_manager_base",
+        "//cc:core/key_type_manager",
         "//cc:mac",
         "//cc/subtle:hmac_boringssl",
         "//cc/subtle:random",
+        "//cc/util:constants",
         "//cc/util:enums",
         "//cc/util:errors",
         "//cc/util:protobuf_helper",
@@ -101,6 +119,7 @@
         "//proto:common_cc_proto",
         "//proto:hmac_cc_proto",
         "//proto:tink_cc_proto",
+        "@com_google_absl//absl/strings",
     ],
 )
 
@@ -117,6 +136,7 @@
         "//cc:mac",
         "//cc:primitive_set",
         "//cc/util:status",
+        "//cc/util:test_matchers",
         "//cc/util:test_util",
         "//proto:tink_cc_proto",
         "@com_google_googletest//:gtest_main",
@@ -124,30 +144,14 @@
 )
 
 cc_test(
-    name = "mac_catalogue_test",
-    size = "small",
-    srcs = ["mac_catalogue_test.cc"],
-    copts = ["-Iexternal/gtest/include"],
-    deps = [
-        ":mac_catalogue",
-        ":mac_config",
-        "//cc:catalogue",
-        "//cc:config",
-        "//cc/util:status",
-        "//cc/util:statusor",
-        "@com_google_googletest//:gtest_main",
-    ],
-)
-
-cc_test(
     name = "mac_config_test",
     size = "small",
     srcs = ["mac_config_test.cc"],
     copts = ["-Iexternal/gtest/include"],
     deps = [
+        ":hmac_key_manager",
         ":mac_config",
         ":mac_key_templates",
-        "//cc:catalogue",
         "//cc:config",
         "//cc:keyset_handle",
         "//cc:mac",
@@ -165,16 +169,14 @@
     srcs = ["mac_factory_test.cc"],
     copts = ["-Iexternal/gtest/include"],
     deps = [
+        ":hmac_key_manager",
         ":mac_config",
         ":mac_factory",
-        ":mac_wrapper",
-        "//cc:config",
         "//cc:crypto_format",
         "//cc:keyset_handle",
         "//cc:mac",
-        "//cc/mac:hmac_key_manager",
-        "//cc/util:keyset_util",
         "//cc/util:status",
+        "//cc/util:test_keyset_handle",
         "//cc/util:test_util",
         "//proto:common_cc_proto",
         "//proto:hmac_cc_proto",
@@ -189,8 +191,12 @@
     srcs = ["mac_key_templates_test.cc"],
     copts = ["-Iexternal/gtest/include"],
     deps = [
+        ":aes_cmac_key_manager",
         ":hmac_key_manager",
         ":mac_key_templates",
+        "//cc:core/key_manager_impl",
+        "//cc/util:test_matchers",
+        "//proto:aes_cmac_cc_proto",
         "//proto:common_cc_proto",
         "//proto:hmac_cc_proto",
         "//proto:tink_cc_proto",
@@ -199,20 +205,40 @@
 )
 
 cc_test(
+    name = "aes_cmac_key_manager_test",
+    size = "small",
+    srcs = ["aes_cmac_key_manager_test.cc"],
+    copts = ["-Iexternal/gtest/include"],
+    deps = [
+        ":aes_cmac_key_manager",
+        "//cc:mac",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_matchers",
+        "//proto:aes_cmac_cc_proto",
+        "//proto:aes_ctr_cc_proto",
+        "//proto:aes_ctr_hmac_aead_cc_proto",
+        "//proto:common_cc_proto",
+        "//proto:tink_cc_proto",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
     name = "hmac_key_manager_test",
     size = "small",
     srcs = ["hmac_key_manager_test.cc"],
     copts = ["-Iexternal/gtest/include"],
     deps = [
         ":hmac_key_manager",
+        "//cc:core/key_manager_impl",
         "//cc:mac",
         "//cc/util:status",
         "//cc/util:statusor",
-        "//proto:aes_ctr_cc_proto",
+        "//cc/util:test_matchers",
         "//proto:aes_ctr_hmac_aead_cc_proto",
         "//proto:common_cc_proto",
         "//proto:hmac_cc_proto",
-        "//proto:tink_cc_proto",
         "@com_google_googletest//:gtest_main",
     ],
 )
diff --git a/cc/mac/BUILD.gn b/cc/mac/BUILD.gn
index e311841..325b36e 100644
--- a/cc/mac/BUILD.gn
+++ b/cc/mac/BUILD.gn
@@ -30,26 +30,39 @@
     "mac_config.h",
   ]
   public_deps = [
-    ":mac_catalogue",
-    "//third_party/tink/cc:config",
+    ":aes_cmac_key_manager",
+    ":hmac_key_manager",
+    ":mac_wrapper",
+    "//third_party/tink/cc:registry",
+    "//third_party/tink/cc/config:config_util",
     "//third_party/tink/cc/util:status",
     "//third_party/tink/proto:config_proto",
+    "//third_party/abseil-cpp/absl/base:core_headers",
     "//third_party/abseil-cpp/absl/memory:memory",
   ]
   public_configs = [ "//third_party/tink:tink_config" ]
 }
 
-# CC Library : mac_catalogue
-source_set("mac_catalogue") {
+# CC Library : aes_cmac_key_manager
+source_set("aes_cmac_key_manager") {
   configs -= [ "//build/config:no_rtti" ]
-  sources = [
-    "mac_catalogue.cc",
-    "mac_catalogue.h",
-  ]
+  sources = [ "aes_cmac_key_manager.h" ]
   public_deps = [
-    ":hmac_key_manager",
-    "//third_party/tink/cc:catalogue",
+    "//third_party/tink/cc/core:core/key_type_manager",
+    "//third_party/tink/cc:key_manager",
+    "//third_party/tink/cc:mac",
+    "//third_party/tink/cc/subtle:aes_cmac_boringssl",
+    "//third_party/tink/cc/subtle:random",
+    "//third_party/tink/cc/util:constants",
+    "//third_party/tink/cc/util:enums",
+    "//third_party/tink/cc/util:errors",
+    "//third_party/tink/cc/util:protobuf_helper",
     "//third_party/tink/cc/util:status",
+    "//third_party/tink/cc/util:statusor",
+    "//third_party/tink/cc/util:validation",
+    "//third_party/tink/proto:aes_cmac_proto",
+    "//third_party/tink/proto:common_proto",
+    "//third_party/tink/proto:tink_proto",
   ]
   public_configs = [ "//third_party/tink:tink_config" ]
 }
@@ -62,11 +75,11 @@
     "hmac_key_manager.h",
   ]
   public_deps = [
-    "//third_party/tink/cc:key_manager",
-    "//third_party/tink/cc/core:key_manager_base",
+    "//third_party/tink/cc/core:core/key_type_manager",
     "//third_party/tink/cc:mac",
     "//third_party/tink/cc/subtle:hmac_boringssl",
     "//third_party/tink/cc/subtle:random",
+    "//third_party/tink/cc/util:constants",
     "//third_party/tink/cc/util:enums",
     "//third_party/tink/cc/util:errors",
     "//third_party/tink/cc/util:protobuf_helper",
@@ -76,6 +89,7 @@
     "//third_party/tink/proto:common_proto",
     "//third_party/tink/proto:hmac_proto",
     "//third_party/tink/proto:tink_proto",
+    "//third_party/abseil-cpp/absl/strings:strings",
   ]
   public_configs = [ "//third_party/tink:tink_config" ]
 }
diff --git a/cc/mac/CMakeLists.txt b/cc/mac/CMakeLists.txt
new file mode 100644
index 0000000..6213534
--- /dev/null
+++ b/cc/mac/CMakeLists.txt
@@ -0,0 +1,205 @@
+tink_module(mac)
+
+tink_cc_library(
+  NAME mac_wrapper
+  SRCS
+    mac_wrapper.cc
+    mac_wrapper.h
+  DEPS
+    tink::core::crypto_format
+    tink::core::mac
+    tink::core::primitive_set
+    tink::core::primitive_wrapper
+    tink::subtle::subtle_util_boringssl
+    tink::util::status
+    tink::util::statusor
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_library(
+  NAME mac_config
+  SRCS
+    mac_config.cc
+    mac_config.h
+  DEPS
+    tink::mac::aes_cmac_key_manager
+    tink::mac::hmac_key_manager
+    tink::mac::mac_wrapper
+    tink::config::config_util
+    tink::core::registry
+    tink::util::status
+    tink::proto::config_cc_proto
+    absl::base
+    absl::memory
+)
+
+tink_cc_library(
+  NAME mac_factory
+  SRCS
+    mac_factory.cc
+    mac_factory.h
+  DEPS
+    tink::mac::mac_wrapper
+    tink::core::key_manager
+    tink::core::keyset_handle
+    tink::core::mac
+    tink::core::primitive_set
+    tink::core::registry
+    tink::util::status
+    tink::util::statusor
+    absl::base
+)
+
+tink_cc_library(
+  NAME mac_key_templates
+  SRCS
+    mac_key_templates.cc
+    mac_key_templates.h
+  DEPS
+    tink::proto::aes_cmac_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::hmac_cc_proto
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_library(
+  NAME aes_cmac_key_manager
+  SRCS
+    aes_cmac_key_manager.h
+  DEPS
+    tink::core::key_manager
+    tink::core::key_type_manager
+    tink::core::mac
+    tink::subtle::aes_cmac_boringssl
+    tink::subtle::random
+    tink::util::constants
+    tink::util::enums
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::util::validation
+    tink::proto::common_cc_proto
+    tink::proto::aes_cmac_cc_proto
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_library(
+  NAME hmac_key_manager
+  SRCS
+    hmac_key_manager.cc
+    hmac_key_manager.h
+  DEPS
+    tink::core::key_type_manager
+    tink::core::mac
+    tink::subtle::hmac_boringssl
+    tink::subtle::random
+    tink::util::constants
+    tink::util::enums
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::util::validation
+    tink::proto::common_cc_proto
+    tink::proto::hmac_cc_proto
+    tink::proto::tink_cc_proto
+    absl::strings
+)
+
+# tests
+
+tink_cc_test(
+  NAME mac_wrapper_test
+  SRCS mac_wrapper_test.cc
+  DEPS
+    tink::mac::mac_wrapper
+    tink::core::crypto_format
+    tink::core::mac
+    tink::core::primitive_set
+    tink::util::status
+    tink::util::test_matchers
+    tink::util::test_util
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME mac_config_test
+  SRCS mac_config_test.cc
+  DEPS
+    tink::mac::hmac_key_manager
+    tink::mac::mac_config
+    tink::mac::mac_key_templates
+    tink::core::config
+    tink::core::keyset_handle
+    tink::core::mac
+    tink::core::registry
+    tink::util::status
+    tink::util::test_matchers
+    tink::util::test_util
+)
+
+tink_cc_test(
+  NAME mac_factory_test
+  SRCS mac_factory_test.cc
+  DEPS
+    tink::mac::mac_config
+    tink::mac::mac_factory
+    tink::core::crypto_format
+    tink::core::keyset_handle
+    tink::core::mac
+    tink::mac::hmac_key_manager
+    tink::util::test_keyset_handle
+    tink::util::status
+    tink::util::test_util
+    tink::proto::common_cc_proto
+    tink::proto::hmac_cc_proto
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME mac_key_templates_test
+  SRCS mac_key_templates_test.cc
+  DEPS
+    tink::core::key_manager_impl
+    tink::mac::aes_cmac_key_manager
+    tink::mac::hmac_key_manager
+    tink::mac::mac_key_templates
+    tink::util::test_matchers
+    tink::proto::aes_cmac_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::hmac_cc_proto
+    tink::proto::tink_cc_proto
+    gmock
+)
+
+tink_cc_test(
+  NAME aes_cmac_key_manager_test
+  SRCS aes_cmac_key_manager_test.cc
+  DEPS
+    tink::mac::aes_cmac_key_manager
+    tink::core::mac
+    tink::util::test_matchers
+    tink::util::status
+    tink::util::statusor
+    tink::proto::aes_ctr_cc_proto
+    tink::proto::aes_ctr_hmac_aead_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::aes_cmac_cc_proto
+    tink::proto::tink_cc_proto
+    gmock
+)
+
+tink_cc_test(
+  NAME hmac_key_manager_test
+  SRCS hmac_key_manager_test.cc
+  DEPS
+    tink::mac::hmac_key_manager
+    tink::core::key_manager_impl
+    tink::core::mac
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::proto::hmac_cc_proto
+    gmock
+)
diff --git a/cc/mac/aes_cmac_key_manager.h b/cc/mac/aes_cmac_key_manager.h
new file mode 100644
index 0000000..3d1b81b
--- /dev/null
+++ b/cc/mac/aes_cmac_key_manager.h
@@ -0,0 +1,125 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+#ifndef TINK_MAC_AES_CMAC_KEY_MANAGER_H_
+#define TINK_MAC_AES_CMAC_KEY_MANAGER_H_
+
+#include <algorithm>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "tink/core/key_type_manager.h"
+#include "tink/key_manager.h"
+#include "tink/mac.h"
+#include "tink/subtle/aes_cmac_boringssl.h"
+#include "tink/subtle/random.h"
+#include "tink/util/constants.h"
+#include "tink/util/errors.h"
+#include "tink/util/protobuf_helper.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/validation.h"
+#include "proto/aes_cmac.pb.h"
+#include "proto/tink.pb.h"
+
+namespace crypto {
+namespace tink {
+
+class AesCmacKeyManager
+    : public KeyTypeManager<google::crypto::tink::AesCmacKey,
+                            google::crypto::tink::AesCmacKeyFormat,
+                            List<Mac>> {
+ public:
+  class MacFactory : public PrimitiveFactory<Mac> {
+    crypto::tink::util::StatusOr<std::unique_ptr<Mac>> Create(
+        const google::crypto::tink::AesCmacKey& key) const override {
+      return subtle::AesCmacBoringSsl::New(key.key_value(),
+                                           key.params().tag_size());
+    }
+  };
+
+  AesCmacKeyManager()
+      : KeyTypeManager(absl::make_unique<AesCmacKeyManager::MacFactory>()) {}
+
+  uint32_t get_version() const override { return 0; }
+
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::SYMMETRIC;
+  }
+
+  const std::string& get_key_type() const override { return key_type_; }
+
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::AesCmacKey& key) const override {
+    crypto::tink::util::Status status =
+        ValidateVersion(key.version(), get_version());
+    if (!status.ok()) return status;
+    if (key.key_value().size() != kKeySizeInBytes) {
+      return crypto::tink::util::Status(
+          util::error::INVALID_ARGUMENT,
+          "Invalid AesCmacKey: key_value wrong length.");
+    }
+    return ValidateParams(key.params());
+  }
+
+  crypto::tink::util::Status ValidateKeyFormat(
+      const google::crypto::tink::AesCmacKeyFormat& key_format) const override {
+    if (key_format.key_size() != kKeySizeInBytes) {
+      return crypto::tink::util::Status(
+          crypto::tink::util::error::INVALID_ARGUMENT,
+          "Invalid AesCmacKeyFormat: invalid key_size.");
+    }
+    return ValidateParams(key_format.params());
+  }
+
+  crypto::tink::util::StatusOr<google::crypto::tink::AesCmacKey> CreateKey(
+      const google::crypto::tink::AesCmacKeyFormat& key_format) const override {
+    google::crypto::tink::AesCmacKey key;
+    key.set_version(get_version());
+    key.set_key_value(
+        subtle::Random::GetRandomBytes(key_format.key_size()));
+    *key.mutable_params() = key_format.params();
+    return key;
+  }
+
+ private:
+  crypto::tink::util::Status ValidateParams(
+      const google::crypto::tink::AesCmacParams& params) const {
+    if (params.tag_size() < kMinTagSizeInBytes) {
+      return util::Status(util::error::INVALID_ARGUMENT,
+                          absl::StrCat("Invalid AesCmacParams: tag_size ",
+                                       params.tag_size(), " is too small."));
+    }
+    if (params.tag_size() > kMaxTagSizeInBytes) {
+      return util::Status(util::error::INVALID_ARGUMENT,
+                          absl::StrCat("Invalid AesCmacParams: tag_size ",
+                                       params.tag_size(), " is too big."));
+    }
+    return util::OkStatus();
+  }
+
+  // Due to https://www.math.uwaterloo.ca/~ajmeneze/publications/tightness.pdf,
+  // we only allow key sizes of 256 bit.
+  const int kKeySizeInBytes = 32;
+  const int kMaxTagSizeInBytes = 16;
+  const int kMinTagSizeInBytes = 10;
+
+  const std::string key_type_ = absl::StrCat(
+      kTypeGoogleapisCom, google::crypto::tink::AesCmacKey().GetTypeName());
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_MAC_AES_CMAC_KEY_MANAGER_H_
diff --git a/cc/mac/aes_cmac_key_manager_test.cc b/cc/mac/aes_cmac_key_manager_test.cc
new file mode 100644
index 0000000..8136841
--- /dev/null
+++ b/cc/mac/aes_cmac_key_manager_test.cc
@@ -0,0 +1,190 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+#include "tink/mac/aes_cmac_key_manager.h"
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/test_matchers.h"
+#include "proto/aes_cmac.pb.h"
+
+namespace crypto {
+namespace tink {
+
+namespace {
+
+using ::crypto::tink::test::IsOk;
+using ::google::crypto::tink::AesCmacKey;
+using ::google::crypto::tink::AesCmacKeyFormat;
+using ::google::crypto::tink::AesCmacParams;
+using ::testing::Eq;
+using ::testing::Not;
+using ::testing::SizeIs;
+
+TEST(AesCmacKeyManagerTest, Basics) {
+  EXPECT_THAT(AesCmacKeyManager().get_version(), Eq(0));
+  EXPECT_THAT(AesCmacKeyManager().get_key_type(),
+              Eq("type.googleapis.com/google.crypto.tink.AesCmacKey"));
+  EXPECT_THAT(AesCmacKeyManager().key_material_type(),
+              Eq(google::crypto::tink::KeyData::SYMMETRIC));
+}
+
+TEST(AesCmacKeyManagerTest, ValidateEmptyKey) {
+  EXPECT_THAT(AesCmacKeyManager().ValidateKey(AesCmacKey()), Not(IsOk()));
+}
+
+AesCmacParams ValidParams() {
+  AesCmacParams params;
+  params.set_tag_size(16);
+  return params;
+}
+
+AesCmacKeyFormat ValidKeyFormat() {
+  AesCmacKeyFormat format;
+  *format.mutable_params() = ValidParams();
+  format.set_key_size(32);
+  return format;
+}
+
+TEST(AesCmacKeyManagerTest, ValidateEmptyKeyFormat) {
+  EXPECT_THAT(AesCmacKeyManager().ValidateKeyFormat(AesCmacKeyFormat()),
+              Not(IsOk()));
+}
+
+TEST(AesCmacKeyManagerTest, ValidateSimpleKeyFormat) {
+  EXPECT_THAT(AesCmacKeyManager().ValidateKeyFormat(ValidKeyFormat()), IsOk());
+}
+
+TEST(AesCmacKeyManagerTest, ValidateKeyFormatKeySizes) {
+  AesCmacKeyFormat format = ValidKeyFormat();
+
+  format.set_key_size(0);
+  EXPECT_THAT(AesCmacKeyManager().ValidateKeyFormat(format), Not(IsOk()));
+
+  format.set_key_size(1);
+  EXPECT_THAT(AesCmacKeyManager().ValidateKeyFormat(format), Not(IsOk()));
+
+  format.set_key_size(15);
+  EXPECT_THAT(AesCmacKeyManager().ValidateKeyFormat(format), Not(IsOk()));
+
+  format.set_key_size(16);
+  EXPECT_THAT(AesCmacKeyManager().ValidateKeyFormat(format), Not(IsOk()));
+
+  format.set_key_size(17);
+  EXPECT_THAT(AesCmacKeyManager().ValidateKeyFormat(format), Not(IsOk()));
+
+  format.set_key_size(31);
+  EXPECT_THAT(AesCmacKeyManager().ValidateKeyFormat(format), Not(IsOk()));
+
+  format.set_key_size(32);
+  EXPECT_THAT(AesCmacKeyManager().ValidateKeyFormat(format), IsOk());
+
+  format.set_key_size(33);
+  EXPECT_THAT(AesCmacKeyManager().ValidateKeyFormat(format), Not(IsOk()));
+}
+
+TEST(AesCmacKeyManagerTest, ValidateKeyFormatTagSizes) {
+  AesCmacKeyFormat format = ValidKeyFormat();
+
+  format.mutable_params()->set_tag_size(0);
+  EXPECT_THAT(AesCmacKeyManager().ValidateKeyFormat(format), Not(IsOk()));
+
+  format.mutable_params()->set_tag_size(9);
+  EXPECT_THAT(AesCmacKeyManager().ValidateKeyFormat(format), Not(IsOk()));
+
+  format.mutable_params()->set_tag_size(10);
+  EXPECT_THAT(AesCmacKeyManager().ValidateKeyFormat(format), IsOk());
+
+  format.mutable_params()->set_tag_size(11);
+  EXPECT_THAT(AesCmacKeyManager().ValidateKeyFormat(format), IsOk());
+
+  format.mutable_params()->set_tag_size(12);
+  EXPECT_THAT(AesCmacKeyManager().ValidateKeyFormat(format), IsOk());
+
+  format.mutable_params()->set_tag_size(15);
+  EXPECT_THAT(AesCmacKeyManager().ValidateKeyFormat(format), IsOk());
+
+  format.mutable_params()->set_tag_size(16);
+  EXPECT_THAT(AesCmacKeyManager().ValidateKeyFormat(format), IsOk());
+
+  format.mutable_params()->set_tag_size(17);
+  EXPECT_THAT(AesCmacKeyManager().ValidateKeyFormat(format), Not(IsOk()));
+
+  format.mutable_params()->set_tag_size(32);
+  EXPECT_THAT(AesCmacKeyManager().ValidateKeyFormat(format), Not(IsOk()));
+}
+
+TEST(AesCmacKeyManagerTest, CreateKey) {
+  AesCmacKeyFormat format = ValidKeyFormat();
+  ASSERT_THAT(AesCmacKeyManager().CreateKey(format).status(), IsOk());
+  AesCmacKey key = AesCmacKeyManager().CreateKey(format).ValueOrDie();
+  EXPECT_THAT(key.version(), Eq(0));
+  EXPECT_THAT(key.key_value(), SizeIs(format.key_size()));
+  EXPECT_THAT(key.params().tag_size(), Eq(format.params().tag_size()));
+}
+
+TEST(AesCmacKeyManagerTest, ValidateKey) {
+  AesCmacKeyFormat format = ValidKeyFormat();
+  AesCmacKey key = AesCmacKeyManager().CreateKey(format).ValueOrDie();
+  EXPECT_THAT(AesCmacKeyManager().ValidateKey(key), IsOk());
+}
+
+TEST(AesCmacKeyManagerTest, ValidateKeyInvalidVersion) {
+  AesCmacKeyFormat format = ValidKeyFormat();
+  AesCmacKey key = AesCmacKeyManager().CreateKey(format).ValueOrDie();
+  key.set_version(1);
+  EXPECT_THAT(AesCmacKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(AesCmacKeyManagerTest, ValidateKeyShortKey) {
+  AesCmacKeyFormat format = ValidKeyFormat();
+  AesCmacKey key = AesCmacKeyManager().CreateKey(format).ValueOrDie();
+  key.set_key_value("0123456789abcdef");
+  EXPECT_THAT(AesCmacKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(AesCmacKeyManagerTest, ValidateKeyLongTagSize) {
+  AesCmacKeyFormat format = ValidKeyFormat();
+  AesCmacKey key = AesCmacKeyManager().CreateKey(format).ValueOrDie();
+  key.mutable_params()->set_tag_size(17);
+  EXPECT_THAT(AesCmacKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+
+TEST(AesCmacKeyManagerTest, ValidateKeyTooShortTagSize) {
+  AesCmacKeyFormat format = ValidKeyFormat();
+  AesCmacKey key = AesCmacKeyManager().CreateKey(format).ValueOrDie();
+  key.mutable_params()->set_tag_size(9);
+  EXPECT_THAT(AesCmacKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(AesCmacKeyManagerTest, GetPrimitive) {
+  AesCmacKeyFormat format = ValidKeyFormat();
+  AesCmacKey key = AesCmacKeyManager().CreateKey(format).ValueOrDie();
+  auto manager_mac_or = AesCmacKeyManager().GetPrimitive<Mac>(key);
+  ASSERT_THAT(manager_mac_or.status(), IsOk());
+  auto mac_value_or = manager_mac_or.ValueOrDie()->ComputeMac("some plaintext");
+  ASSERT_THAT(mac_value_or.status(), IsOk());
+
+  auto direct_mac_or =
+      subtle::AesCmacBoringSsl::New(key.key_value(), key.params().tag_size());
+  ASSERT_THAT(direct_mac_or.status(), IsOk());
+  EXPECT_THAT(direct_mac_or.ValueOrDie()->VerifyMac(mac_value_or.ValueOrDie(),
+                                                    "some plaintext"), IsOk());
+}
+
+}  // namespace
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/mac/hmac_key_manager.cc b/cc/mac/hmac_key_manager.cc
index 060fdd3..188bb52 100644
--- a/cc/mac/hmac_key_manager.cc
+++ b/cc/mac/hmac_key_manager.cc
@@ -20,7 +20,6 @@
 
 #include "absl/strings/string_view.h"
 #include "tink/mac.h"
-#include "tink/key_manager.h"
 #include "tink/subtle/hmac_boringssl.h"
 #include "tink/subtle/random.h"
 #include "tink/util/enums.h"
@@ -36,72 +35,32 @@
 namespace crypto {
 namespace tink {
 
+using crypto::tink::util::Enums;
+using crypto::tink::util::Status;
+using crypto::tink::util::StatusOr;
 using google::crypto::tink::HashType;
 using google::crypto::tink::HmacKey;
 using google::crypto::tink::HmacKeyFormat;
 using google::crypto::tink::HmacParams;
-using google::crypto::tink::KeyData;
-using google::crypto::tink::KeyTemplate;
-using portable_proto::MessageLite;
-using crypto::tink::util::Enums;
-using crypto::tink::util::Status;
-using crypto::tink::util::StatusOr;
 
-class HmacKeyFactory : public KeyFactoryBase<HmacKey, HmacKeyFormat> {
- public:
-  HmacKeyFactory() {}
+namespace {
 
-  KeyData::KeyMaterialType key_material_type() const override {
-    return KeyData::SYMMETRIC;
-  }
+constexpr int kMinKeySizeInBytes = 16;
+constexpr int kMinTagSizeInBytes = 10;
 
- protected:
-  StatusOr<std::unique_ptr<HmacKey>> NewKeyFromFormat(
-      const HmacKeyFormat& hmac_key_format) const override;
-};
+}  // namespace
 
-StatusOr<std::unique_ptr<HmacKey>> HmacKeyFactory::NewKeyFromFormat(
+StatusOr<HmacKey> HmacKeyManager::CreateKey(
     const HmacKeyFormat& hmac_key_format) const {
-  Status status =  HmacKeyManager::Validate(hmac_key_format);
-  if (!status.ok()) return status;
-  auto hmac_key = absl::make_unique<HmacKey>();
-  hmac_key->set_version(HmacKeyManager::kVersion);
-  *(hmac_key->mutable_params()) = hmac_key_format.params();
-  hmac_key->set_key_value(
+  HmacKey hmac_key;
+  hmac_key.set_version(get_version());
+  *(hmac_key.mutable_params()) = hmac_key_format.params();
+  hmac_key.set_key_value(
       subtle::Random::GetRandomBytes(hmac_key_format.key_size()));
-  return absl::implicit_cast<StatusOr<std::unique_ptr<HmacKey>>>(
-        std::move(hmac_key));
+  return hmac_key;
 }
 
-constexpr uint32_t HmacKeyManager::kVersion;
-
-const int kMinKeySizeInBytes = 16;
-const int kMinTagSizeInBytes = 10;
-
-HmacKeyManager::HmacKeyManager() : key_factory_(new HmacKeyFactory()) {}
-
-uint32_t HmacKeyManager::get_version() const {
-  return kVersion;
-}
-
-const KeyFactory& HmacKeyManager::get_key_factory() const {
-  return *key_factory_;
-}
-
-StatusOr<std::unique_ptr<Mac>> HmacKeyManager::GetPrimitiveFromKey(
-    const HmacKey& hmac_key) const {
-  Status status = Validate(hmac_key);
-  if (!status.ok()) return status;
-  auto hmac_result = subtle::HmacBoringSsl::New(
-      util::Enums::ProtoToSubtle(hmac_key.params().hash()),
-      hmac_key.params().tag_size(),
-      hmac_key.key_value());
-  if (!hmac_result.ok()) return hmac_result.status();
-  return std::move(hmac_result.ValueOrDie());
-}
-
-// static
-Status HmacKeyManager::Validate(const HmacParams& params) {
+Status HmacKeyManager::ValidateParams(const HmacParams& params) const {
   if (params.tag_size() < kMinTagSizeInBytes) {
     return ToStatusF(util::error::INVALID_ARGUMENT,
                      "Invalid HmacParams: tag_size %d is too small.",
@@ -124,24 +83,24 @@
   return Status::OK;
 }
 
-// static
-Status HmacKeyManager::Validate(const HmacKey& key) {
-  Status status = ValidateVersion(key.version(), kVersion);
+Status HmacKeyManager::ValidateKey(const HmacKey& key) const {
+  Status status = ValidateVersion(key.version(), get_version());
   if (!status.ok()) return status;
   if (key.key_value().size() < kMinKeySizeInBytes) {
       return ToStatusF(util::error::INVALID_ARGUMENT,
                        "Invalid HmacKey: key_value is too short.");
   }
-  return Validate(key.params());
+  return ValidateParams(key.params());
 }
 
 // static
-Status HmacKeyManager::Validate(const HmacKeyFormat& key_format) {
+Status HmacKeyManager::ValidateKeyFormat(
+    const HmacKeyFormat& key_format) const {
   if (key_format.key_size() < kMinKeySizeInBytes) {
       return ToStatusF(util::error::INVALID_ARGUMENT,
                        "Invalid HmacKeyFormat: key_size is too small.");
   }
-  return Validate(key_format.params());
+  return ValidateParams(key_format.params());
 }
 
 }  // namespace tink
diff --git a/cc/mac/hmac_key_manager.h b/cc/mac/hmac_key_manager.h
index 1597fb2..772fb01 100644
--- a/cc/mac/hmac_key_manager.h
+++ b/cc/mac/hmac_key_manager.h
@@ -20,9 +20,11 @@
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "tink/core/key_manager_base.h"
-#include "tink/key_manager.h"
+#include "tink/core/key_type_manager.h"
 #include "tink/mac.h"
+#include "tink/subtle/hmac_boringssl.h"
+#include "tink/util/constants.h"
+#include "tink/util/enums.h"
 #include "tink/util/errors.h"
 #include "tink/util/protobuf_helper.h"
 #include "tink/util/status.h"
@@ -34,36 +36,46 @@
 namespace tink {
 
 class HmacKeyManager
-    : public KeyManagerBase<Mac, google::crypto::tink::HmacKey> {
+    : public KeyTypeManager<google::crypto::tink::HmacKey,
+                            google::crypto::tink::HmacKeyFormat, List<Mac>> {
  public:
-  static constexpr uint32_t kVersion = 0;
+  class MacFactory : public PrimitiveFactory<Mac> {
+    crypto::tink::util::StatusOr<std::unique_ptr<Mac>> Create(
+        const google::crypto::tink::HmacKey& hmac_key) const override {
+      return subtle::HmacBoringSsl::New(
+          util::Enums::ProtoToSubtle(hmac_key.params().hash()),
+          hmac_key.params().tag_size(), hmac_key.key_value());
+    }
+  };
 
-  HmacKeyManager();
+  HmacKeyManager() : KeyTypeManager(absl::make_unique<MacFactory>()) {}
 
-  // Returns the version of this key manager.
-  uint32_t get_version() const override;
+  uint32_t get_version() const override { return 0; }
 
-  // Returns a factory that generates keys of the key type
-  // handled by this manager.
-  const KeyFactory& get_key_factory() const override;
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::SYMMETRIC;
+  }
 
-  virtual ~HmacKeyManager() {}
+  const std::string& get_key_type() const override { return key_type_; }
 
- protected:
-  crypto::tink::util::StatusOr<std::unique_ptr<Mac>> GetPrimitiveFromKey(
-      const google::crypto::tink::HmacKey& hmac_key) const override;
+
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::HmacKey& key) const override;
+
+  crypto::tink::util::Status ValidateKeyFormat(
+      const google::crypto::tink::HmacKeyFormat& key_format) const override;
+
+  crypto::tink::util::StatusOr<google::crypto::tink::HmacKey> CreateKey(
+      const google::crypto::tink::HmacKeyFormat& key_format) const override;
 
  private:
-  friend class HmacKeyFactory;
+  crypto::tink::util::Status ValidateParams(
+      const google::crypto::tink::HmacParams& params) const;
 
-  std::unique_ptr<KeyFactory> key_factory_;
 
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::HmacParams& params);
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::HmacKey& key);
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::HmacKeyFormat& key_format);
+  const std::string key_type_ = absl::StrCat(
+      kTypeGoogleapisCom, google::crypto::tink::HmacKey().GetTypeName());
 };
 
 }  // namespace tink
diff --git a/cc/mac/hmac_key_manager_test.cc b/cc/mac/hmac_key_manager_test.cc
index 0d8f8c9..04f445d 100644
--- a/cc/mac/hmac_key_manager_test.cc
+++ b/cc/mac/hmac_key_manager_test.cc
@@ -16,255 +16,215 @@
 
 #include "tink/mac/hmac_key_manager.h"
 
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "tink/core/key_manager_impl.h"
 #include "tink/mac.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
-#include "gtest/gtest.h"
-#include "proto/aes_ctr.pb.h"
-#include "proto/common.pb.h"
+#include "tink/util/test_matchers.h"
 #include "proto/hmac.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
 
-using google::crypto::tink::AesCtrKey;
-using google::crypto::tink::AesCtrKeyFormat;
-using google::crypto::tink::HashType;
-using google::crypto::tink::HmacKey;
-using google::crypto::tink::HmacKeyFormat;
-using google::crypto::tink::KeyData;
-using google::crypto::tink::KeyTemplate;
+using ::crypto::tink::test::IsOk;
+using ::google::crypto::tink::HashType;
+using ::google::crypto::tink::HmacKey;
+using ::google::crypto::tink::HmacKeyFormat;
+using ::google::crypto::tink::KeyData;
+using ::testing::Eq;
+using ::testing::Not;
+using ::testing::SizeIs;
 
 namespace {
 
-class HmacKeyManagerTest : public ::testing::Test {
- protected:
-  std::string key_type_prefix = "type.googleapis.com/";
-  std::string hmac_key_type =
-      "type.googleapis.com/google.crypto.tink.HmacKey";
-};
-
-TEST_F(HmacKeyManagerTest, testBasic) {
-  HmacKeyManager key_manager;
-
-  EXPECT_EQ(0, key_manager.get_version());
-  EXPECT_EQ("type.googleapis.com/google.crypto.tink.HmacKey",
-            key_manager.get_key_type());
-  EXPECT_TRUE(key_manager.DoesSupport(key_manager.get_key_type()));
+TEST(HmacKeyManagerTest, Basics) {
+  EXPECT_THAT(HmacKeyManager().get_version(), Eq(0));
+  EXPECT_THAT(HmacKeyManager().get_key_type(),
+              Eq("type.googleapis.com/google.crypto.tink.HmacKey"));
+  EXPECT_THAT(HmacKeyManager().key_material_type(),
+              Eq(google::crypto::tink::KeyData::SYMMETRIC));
 }
 
-TEST_F(HmacKeyManagerTest, testKeyDataErrors) {
-  HmacKeyManager key_manager;
-
-  {  // Bad key type.
-    KeyData key_data;
-    std::string bad_key_type =
-        "type.googleapis.com/google.crypto.tink.SomeOtherKey";
-    key_data.set_type_url(bad_key_type);
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, bad_key_type,
-                        result.status().error_message());
-  }
-
-  {  // Bad key value.
-    KeyData key_data;
-    key_data.set_type_url(hmac_key_type);
-    key_data.set_value("some bad serialized proto");
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
-
-  {  // Bad version.
-    KeyData key_data;
-    HmacKey key;
-    key.set_version(1);
-    key_data.set_type_url(hmac_key_type);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "version",
-                        result.status().error_message());
-  }
+TEST(HmacKeyManagerTest, ValidateEmptyKey) {
+  EXPECT_THAT(HmacKeyManager().ValidateKey(HmacKey()), Not(IsOk()));
 }
 
-TEST_F(HmacKeyManagerTest, testKeyMessageErrors) {
-  HmacKeyManager key_manager;
-
-  {  // Bad protobuffer.
-    AesCtrKey key_message;
-    auto result = key_manager.GetPrimitive(key_message);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "AesCtrKey",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-  }
+TEST(HmacKeyManagerTest, ValidateEmptyKeyFormat) {
+  EXPECT_THAT(HmacKeyManager().ValidateKeyFormat(HmacKeyFormat()), Not(IsOk()));
 }
 
-// TODO(przydatek): do real verification of HMACs once they are implemented.
-TEST_F(HmacKeyManagerTest, testPrimitives) {
-  HmacKeyManager key_manager;
-  HmacKey key;
-
-  key.set_version(0);
-  key.mutable_params()->set_tag_size(16);
-  key.mutable_params()->set_hash(HashType::SHA256);
-  key.set_key_value("some key of sufficient length");
-
-  {  // Using key message only.
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto hmac = std::move(result.ValueOrDie());
-    auto hmac_result = hmac->ComputeMac("some data");
-    EXPECT_TRUE(hmac_result.ok());
-  }
-
-  {  // Using KeyData proto.
-    KeyData key_data;
-    key_data.set_type_url(hmac_key_type);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto hmac = std::move(result.ValueOrDie());
-    auto hmac_result = hmac->ComputeMac("some data");
-    EXPECT_TRUE(hmac_result.ok());
-  }
+TEST(HmacKeyManagerTest, ValidKeyFormat) {
+  HmacKeyFormat key_format;
+  key_format.mutable_params()->set_tag_size(16);
+  key_format.mutable_params()->set_hash(HashType::SHA256);
+  key_format.set_key_size(16);
+  EXPECT_THAT(HmacKeyManager().ValidateKeyFormat(key_format), IsOk());
 }
 
-TEST_F(HmacKeyManagerTest, testNewKeyErrors) {
-  HmacKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-
-  {  // Bad key format.
-    AesCtrKeyFormat key_format;
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "AesCtrKeyFormat",
-                        result.status().error_message());
-  }
-
-  {  // Bad serialized key format.
-    auto result = key_factory.NewKey("some bad serialized proto");
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
-
-  {  // Bad HmacKeyFormat: small key_size.
+TEST(HmacKeyManagerTest, ValidateKeyFormatSmallTagSizes) {
+  for (int i = 0; i < 10; ++i) {
     HmacKeyFormat key_format;
-    key_format.set_key_size(8);
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "key_size",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "too small",
-                        result.status().error_message());
-  }
-
-  {  // Bad HmacKeyFormat: HashType not supported.
-    HmacKeyFormat key_format;
-    key_format.set_key_size(16);
-    key_format.mutable_params()->set_tag_size(10);
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "HashType",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-  }
-
-  {  // Bad HmacKeyFormat: tag_size too small.
-    HmacKeyFormat key_format;
-    key_format.set_key_size(16);
+    key_format.mutable_params()->set_tag_size(i);
     key_format.mutable_params()->set_hash(HashType::SHA256);
-    key_format.mutable_params()->set_tag_size(8);
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "tag_size",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "too small",
-                        result.status().error_message());
-  }
-
-  {  // Bad HmacKeyFormat: tag_size too big.
-    HmacKeyFormat key_format;
     key_format.set_key_size(16);
-    key_format.mutable_params()->set_hash(HashType::SHA256);
-    key_format.mutable_params()->set_tag_size(42);
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "tag_size",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "too big",
-                        result.status().error_message());
+    EXPECT_THAT(HmacKeyManager().ValidateKeyFormat(key_format), Not(IsOk()))
+        << " for length " << i;
   }
 }
 
-TEST_F(HmacKeyManagerTest, testNewKeyBasic) {
-  HmacKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
+TEST(HmacKeyManagerTest, ValidateKeyFormatTagSizesSha1) {
+  HmacKeyFormat key_format;
+  key_format.mutable_params()->set_hash(HashType::SHA1);
+  key_format.set_key_size(16);
+
+  key_format.mutable_params()->set_tag_size(10);
+  EXPECT_THAT(HmacKeyManager().ValidateKeyFormat(key_format), IsOk());
+  key_format.mutable_params()->set_tag_size(20);
+  EXPECT_THAT(HmacKeyManager().ValidateKeyFormat(key_format), IsOk());
+  key_format.mutable_params()->set_tag_size(21);
+  EXPECT_THAT(HmacKeyManager().ValidateKeyFormat(key_format), Not(IsOk()));
+}
+
+TEST(HmacKeyManagerTest, ValidateKeyFormatTagSizesSha256) {
+  HmacKeyFormat key_format;
+  key_format.mutable_params()->set_hash(HashType::SHA256);
+  key_format.set_key_size(16);
+
+  key_format.mutable_params()->set_tag_size(10);
+  EXPECT_THAT(HmacKeyManager().ValidateKeyFormat(key_format), IsOk());
+  key_format.mutable_params()->set_tag_size(32);
+  EXPECT_THAT(HmacKeyManager().ValidateKeyFormat(key_format), IsOk());
+  key_format.mutable_params()->set_tag_size(33);
+  EXPECT_THAT(HmacKeyManager().ValidateKeyFormat(key_format), Not(IsOk()));
+}
+
+TEST(HmacKeyManagerTest, ValidateKeyFormatTagSizesSha512) {
+  HmacKeyFormat key_format;
+  key_format.mutable_params()->set_hash(HashType::SHA512);
+  key_format.set_key_size(16);
+
+  key_format.mutable_params()->set_tag_size(10);
+  EXPECT_THAT(HmacKeyManager().ValidateKeyFormat(key_format), IsOk());
+  key_format.mutable_params()->set_tag_size(64);
+  EXPECT_THAT(HmacKeyManager().ValidateKeyFormat(key_format), IsOk());
+  key_format.mutable_params()->set_tag_size(65);
+  EXPECT_THAT(HmacKeyManager().ValidateKeyFormat(key_format), Not(IsOk()));
+}
+
+TEST(HmacKeyManagerTest, ValidateKeyFormatKeySizes) {
+  HmacKeyFormat key_format;
+  key_format.mutable_params()->set_hash(HashType::SHA512);
+  key_format.mutable_params()->set_tag_size(64);
+
+  key_format.set_key_size(15);
+  EXPECT_THAT(HmacKeyManager().ValidateKeyFormat(key_format), Not(IsOk()));
+
+  key_format.set_key_size(16);
+  EXPECT_THAT(HmacKeyManager().ValidateKeyFormat(key_format), IsOk());
+}
+
+TEST(HmacKeyManagerTest, CreateKey) {
   HmacKeyFormat key_format;
   key_format.set_key_size(16);
+  key_format.mutable_params()->set_tag_size(10);
+  key_format.mutable_params()->set_hash(HashType::SHA512);
+  auto hmac_key_or = HmacKeyManager().CreateKey(key_format);
+  ASSERT_THAT(hmac_key_or.status(), IsOk());
+  EXPECT_THAT(hmac_key_or.ValueOrDie().version(), Eq(0));
+  EXPECT_THAT(hmac_key_or.ValueOrDie().params().hash(),
+              Eq(key_format.params().hash()));
+  EXPECT_THAT(hmac_key_or.ValueOrDie().params().tag_size(),
+              Eq(key_format.params().tag_size()));
+  EXPECT_THAT(hmac_key_or.ValueOrDie().key_value(),
+              SizeIs(key_format.key_size()));
+
+  EXPECT_THAT(HmacKeyManager().ValidateKey(hmac_key_or.ValueOrDie()),
+              IsOk());
+}
+
+TEST(HmacKeyManagerTest, ValidKey) {
+  HmacKey key;
+  key.set_version(0);
+
+  key.mutable_params()->set_hash(HashType::SHA256);
+  key.mutable_params()->set_tag_size(10);
+  key.set_key_value("0123456789abcdef");
+
+  EXPECT_THAT(HmacKeyManager().ValidateKey(key), IsOk());
+}
+
+TEST(HmacKeyManagerTest, ValidateKeyTagSizesSha1) {
+  HmacKey key;
+  key.set_version(0);
+  key.mutable_params()->set_hash(HashType::SHA1);
+  key.set_key_value("0123456789abcdef");
+
+  key.mutable_params()->set_tag_size(10);
+  EXPECT_THAT(HmacKeyManager().ValidateKey(key), IsOk());
+  key.mutable_params()->set_tag_size(20);
+  EXPECT_THAT(HmacKeyManager().ValidateKey(key), IsOk());
+  key.mutable_params()->set_tag_size(21);
+  EXPECT_THAT(HmacKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(HmacKeyManagerTest, ValidateKeyTagSizesSha256) {
+  HmacKey key;
+  key.set_version(0);
+  key.mutable_params()->set_hash(HashType::SHA256);
+  key.set_key_value("0123456789abcdef");
+
+  key.mutable_params()->set_tag_size(10);
+  EXPECT_THAT(HmacKeyManager().ValidateKey(key), IsOk());
+  key.mutable_params()->set_tag_size(32);
+  EXPECT_THAT(HmacKeyManager().ValidateKey(key), IsOk());
+  key.mutable_params()->set_tag_size(33);
+  EXPECT_THAT(HmacKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(HmacKeyManagerTest, ValidateKeyTagSizesSha512) {
+  HmacKey key;
+  key.set_version(0);
+  key.mutable_params()->set_hash(HashType::SHA512);
+  key.set_key_value("0123456789abcdef");
+
+  key.mutable_params()->set_tag_size(10);
+  EXPECT_THAT(HmacKeyManager().ValidateKey(key), IsOk());
+  key.mutable_params()->set_tag_size(64);
+  EXPECT_THAT(HmacKeyManager().ValidateKey(key), IsOk());
+  key.mutable_params()->set_tag_size(65);
+  EXPECT_THAT(HmacKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(HmacKeyManagerTest, ValidateKeyShortKey) {
+  HmacKey key;
+  key.set_version(0);
+
+  key.mutable_params()->set_hash(HashType::SHA256);
+  key.mutable_params()->set_tag_size(10);
+  key.set_key_value("0123456789abcde");
+
+  EXPECT_THAT(HmacKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(HmacKeyManagerTest, GetPrimitive) {
+  HmacKeyFormat key_format;
+  key_format.mutable_params()->set_tag_size(16);
   key_format.mutable_params()->set_hash(HashType::SHA256);
-  key_format.mutable_params()->set_tag_size(18);
+  key_format.set_key_size(16);
+  HmacKey key = HmacKeyManager().CreateKey(key_format).ValueOrDie();
+  auto manager_mac_or = HmacKeyManager().GetPrimitive<Mac>(key);
+  ASSERT_THAT(manager_mac_or.status(), IsOk());
+  auto mac_value_or = manager_mac_or.ValueOrDie()->ComputeMac("some plaintext");
+  ASSERT_THAT(mac_value_or.status(), IsOk());
 
-  { // Via NewKey(format_proto).
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key = std::move(result.ValueOrDie());
-    EXPECT_EQ(key_type_prefix + key->GetTypeName(), hmac_key_type);
-    std::unique_ptr<HmacKey> hmac_key(
-        static_cast<HmacKey*>(key.release()));
-    EXPECT_EQ(0, hmac_key->version());
-    EXPECT_EQ(key_format.params().hash(), hmac_key->params().hash());
-    EXPECT_EQ(key_format.params().tag_size(), hmac_key->params().tag_size());
-    EXPECT_EQ(key_format.key_size(), hmac_key->key_value().size());
-  }
-
-  { // Via NewKey(serialized_format_proto).
-    auto result = key_factory.NewKey(key_format.SerializeAsString());
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key = std::move(result.ValueOrDie());
-    EXPECT_EQ(key_type_prefix + key->GetTypeName(), hmac_key_type);
-    std::unique_ptr<HmacKey> hmac_key(
-        static_cast<HmacKey*>(key.release()));
-    EXPECT_EQ(0, hmac_key->version());
-    EXPECT_EQ(key_format.params().hash(), hmac_key->params().hash());
-    EXPECT_EQ(key_format.params().tag_size(), hmac_key->params().tag_size());
-    EXPECT_EQ(key_format.key_size(), hmac_key->key_value().size());
-  }
-
-  { // Via NewKeyData(serialized_format_proto).
-    auto result = key_factory.NewKeyData(key_format.SerializeAsString());
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key_data = std::move(result.ValueOrDie());
-    EXPECT_EQ(hmac_key_type, key_data->type_url());
-    EXPECT_EQ(KeyData::SYMMETRIC, key_data->key_material_type());
-    HmacKey hmac_key;
-    EXPECT_TRUE(hmac_key.ParseFromString(key_data->value()));
-    EXPECT_EQ(0, hmac_key.version());
-    EXPECT_EQ(key_format.params().hash(), hmac_key.params().hash());
-    EXPECT_EQ(key_format.params().tag_size(), hmac_key.params().tag_size());
-    EXPECT_EQ(key_format.key_size(), hmac_key.key_value().size());
-  }
+  auto direct_mac_or = subtle::HmacBoringSsl::New(
+      util::Enums::ProtoToSubtle(key.params().hash()),
+      key.params().tag_size(), key.key_value());
+  ASSERT_THAT(direct_mac_or.status(), IsOk());
+  EXPECT_THAT(direct_mac_or.ValueOrDie()->VerifyMac(mac_value_or.ValueOrDie(),
+                                                    "some plaintext"), IsOk());
 }
 
 }  // namespace
diff --git a/cc/mac/mac_catalogue.cc b/cc/mac/mac_catalogue.cc
deleted file mode 100644
index 8b210c7..0000000
--- a/cc/mac/mac_catalogue.cc
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#include "tink/mac/mac_catalogue.h"
-
-#include "absl/strings/ascii.h"
-#include "tink/catalogue.h"
-#include "tink/key_manager.h"
-#include "tink/mac/hmac_key_manager.h"
-#include "tink/util/status.h"
-#include "tink/util/statusor.h"
-
-namespace crypto {
-namespace tink {
-
-namespace {
-
-crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<Mac>>> CreateKeyManager(
-    const std::string& type_url) {
-  if (type_url == HmacKeyManager::static_key_type()) {
-    std::unique_ptr<KeyManager<Mac>> manager(new HmacKeyManager());
-    return std::move(manager);
-  }
-  return ToStatusF(crypto::tink::util::error::NOT_FOUND,
-                   "No key manager for type_url '%s'.", type_url.c_str());
-}
-
-}  // anonymous namespace
-
-crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<Mac>>>
-MacCatalogue::GetKeyManager(const std::string& type_url,
-                            const std::string& primitive_name,
-                            uint32_t min_version) const {
-  if (!(absl::AsciiStrToLower(primitive_name) == "mac")) {
-    return ToStatusF(crypto::tink::util::error::NOT_FOUND,
-                     "This catalogue does not support primitive %s.",
-                     primitive_name.c_str());
-  }
-  auto manager_result = CreateKeyManager(type_url);
-  if (!manager_result.ok()) return manager_result;
-  if (manager_result.ValueOrDie()->get_version() < min_version) {
-    return ToStatusF(
-        crypto::tink::util::error::NOT_FOUND,
-        "No key manager for type_url '%s' with version at least %d.",
-        type_url.c_str(), min_version);
-  }
-  return std::move(manager_result.ValueOrDie());
-}
-
-}  // namespace tink
-}  // namespace crypto
diff --git a/cc/mac/mac_catalogue.h b/cc/mac/mac_catalogue.h
deleted file mode 100644
index 76403e6..0000000
--- a/cc/mac/mac_catalogue.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#ifndef TINK_MAC_MAC_CATALOGUE_H_
-#define TINK_MAC_MAC_CATALOGUE_H_
-
-#include "tink/catalogue.h"
-#include "tink/key_manager.h"
-#include "tink/mac.h"
-#include "tink/util/statusor.h"
-
-namespace crypto {
-namespace tink {
-
-///////////////////////////////////////////////////////////////////////////////
-// A catalogue of Tink Mac key mangers.
-class MacCatalogue : public Catalogue<Mac> {
- public:
-  MacCatalogue() {}
-
-  crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<Mac>>> GetKeyManager(
-      const std::string& type_url, const std::string& primitive_name,
-      uint32_t min_version) const override;
-};
-
-}  // namespace tink
-}  // namespace crypto
-
-#endif  // TINK_MAC_MAC_CATALOGUE_H_
diff --git a/cc/mac/mac_catalogue_test.cc b/cc/mac/mac_catalogue_test.cc
deleted file mode 100644
index 81d0e68..0000000
--- a/cc/mac/mac_catalogue_test.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-#include "tink/mac/mac_catalogue.h"
-
-#include "tink/catalogue.h"
-#include "tink/mac/mac_config.h"
-#include "tink/util/status.h"
-#include "tink/util/statusor.h"
-#include "gtest/gtest.h"
-
-namespace crypto {
-namespace tink {
-namespace {
-
-class MacCatalogueTest : public ::testing::Test {
-};
-
-TEST_F(MacCatalogueTest, testBasic) {
-  std::string key_type = "type.googleapis.com/google.crypto.tink.HmacKey";
-  MacCatalogue catalogue;
-
-  {
-    auto manager_result = catalogue.GetKeyManager(key_type, "Mac", 0);
-    EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-    EXPECT_TRUE(manager_result.ValueOrDie()->DoesSupport(key_type));
-  }
-
-  {
-    auto manager_result = catalogue.GetKeyManager(key_type, "mAC", 0);
-    EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-    EXPECT_TRUE(manager_result.ValueOrDie()->DoesSupport(key_type));
-  }
-
-  {
-    auto manager_result = catalogue.GetKeyManager(key_type, "Aead", 0);
-    EXPECT_FALSE(manager_result.ok());
-    EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-  }
-
-  {
-    auto manager_result = catalogue.GetKeyManager(key_type, "Mac", 1);
-    EXPECT_FALSE(manager_result.ok());
-    EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-  }
-}
-
-}  // namespace
-}  // namespace tink
-}  // namespace crypto
diff --git a/cc/mac/mac_config.cc b/cc/mac/mac_config.cc
index 254a3d9..b891285 100644
--- a/cc/mac/mac_config.cc
+++ b/cc/mac/mac_config.cc
@@ -17,42 +17,37 @@
 #include "tink/mac/mac_config.h"
 
 #include "absl/memory/memory.h"
-#include "tink/config.h"
-#include "tink/mac/mac_catalogue.h"
+#include "tink/config/config_util.h"
+#include "tink/mac/aes_cmac_key_manager.h"
+#include "tink/mac/hmac_key_manager.h"
+#include "tink/mac/mac_wrapper.h"
+#include "tink/registry.h"
 #include "tink/util/status.h"
+#include "proto/config.pb.h"
+
+using google::crypto::tink::RegistryConfig;
 
 namespace crypto {
 namespace tink {
 
-namespace {
-
-google::crypto::tink::RegistryConfig* GenerateRegistryConfig() {
-  google::crypto::tink::RegistryConfig* config =
-      new google::crypto::tink::RegistryConfig();
-  config->add_entry()->MergeFrom(*Config::GetTinkKeyTypeEntry(
-      MacConfig::kCatalogueName, MacConfig::kPrimitiveName,
-      "HmacKey", 0, true));
-  config->set_config_name("TINK_MAC");
-  return config;
-}
-
-}  // anonymous namespace
-
-constexpr char MacConfig::kCatalogueName[];
-constexpr char MacConfig::kPrimitiveName[];
-
 // static
-const google::crypto::tink::RegistryConfig& MacConfig::Latest() {
-  static auto config = GenerateRegistryConfig();
+const RegistryConfig& MacConfig::Latest() {
+  static const RegistryConfig* config = new RegistryConfig();
   return *config;
 }
 
 // static
 util::Status MacConfig::Register() {
-  auto status =
-      Registry::AddCatalogue(kCatalogueName, absl::make_unique<MacCatalogue>());
+  // Register key managers.
+  auto status = Registry::RegisterKeyTypeManager(
+      absl::make_unique<HmacKeyManager>(), true);
   if (!status.ok()) return status;
-  return Config::Register(Latest());
+  status = Registry::RegisterKeyTypeManager(
+      absl::make_unique<AesCmacKeyManager>(), true);
+  if (!status.ok()) return status;
+
+  // Register primitive wrapper.
+  return Registry::RegisterPrimitiveWrapper(absl::make_unique<MacWrapper>());
 }
 
 }  // namespace tink
diff --git a/cc/mac/mac_config.h b/cc/mac/mac_config.h
index 96b7dfa..7213e61 100644
--- a/cc/mac/mac_config.h
+++ b/cc/mac/mac_config.h
@@ -17,6 +17,7 @@
 #ifndef TINK_MAC_MAC_CONFIG_H_
 #define TINK_MAC_MAC_CONFIG_H_
 
+#include "absl/base/macros.h"
 #include "tink/util/status.h"
 #include "proto/config.pb.h"
 
@@ -31,7 +32,6 @@
 //
 //   auto status = MacConfig::Register();
 //
-// For more information on creation and usage of Mac instances see MacFactory.
 class MacConfig {
  public:
   static constexpr char kCatalogueName[] = "TinkMac";
@@ -39,9 +39,10 @@
 
   // Returns config of Mac implementations supported
   // in the current Tink release.
+  ABSL_DEPRECATED("This is not supported anymore.")
   static const google::crypto::tink::RegistryConfig& Latest();
 
-  // Registers key managers for all Mac key types
+  // Registers Mac primitive wrapper and key managers for all Mac key types
   // from the current Tink release.
   static crypto::tink::util::Status Register();
 
diff --git a/cc/mac/mac_config_test.cc b/cc/mac/mac_config_test.cc
index 8695a01..a6208e6 100644
--- a/cc/mac/mac_config_test.cc
+++ b/cc/mac/mac_config_test.cc
@@ -16,14 +16,15 @@
 
 #include "tink/mac/mac_config.h"
 
-#include "tink/catalogue.h"
+#include "gtest/gtest.h"
 #include "tink/config.h"
 #include "tink/keyset_handle.h"
 #include "tink/mac.h"
+#include "tink/mac/hmac_key_manager.h"
 #include "tink/mac/mac_key_templates.h"
 #include "tink/registry.h"
 #include "tink/util/status.h"
-#include "gtest/gtest.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
 
 namespace crypto {
@@ -31,19 +32,8 @@
 namespace {
 
 using ::crypto::tink::test::DummyMac;
-
-class DummyMacCatalogue : public Catalogue<Mac> {
- public:
-  DummyMacCatalogue() {}
-
-  crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<Mac>>>
-  GetKeyManager(const std::string& type_url,
-                const std::string& primitive_name,
-                uint32_t min_version) const override {
-    return util::Status::UNKNOWN;
-  }
-};
-
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
 
 class MacConfigTest : public ::testing::Test {
  protected:
@@ -52,57 +42,14 @@
   }
 };
 
-TEST_F(MacConfigTest, testBasic) {
-  std::string key_type = "type.googleapis.com/google.crypto.tink.HmacKey";
-  auto& config = MacConfig::Latest();
-
-  EXPECT_EQ(1, MacConfig::Latest().entry_size());
-  EXPECT_EQ("TinkMac", config.entry(0).catalogue_name());
-  EXPECT_EQ("Mac", config.entry(0).primitive_name());
-  EXPECT_EQ(key_type, config.entry(0).type_url());
-  EXPECT_EQ(true, config.entry(0).new_key_allowed());
-  EXPECT_EQ(0, config.entry(0).key_manager_version());
-
-  // No key manager before registration.
-  auto manager_result = Registry::get_key_manager<Mac>(key_type);
-  EXPECT_FALSE(manager_result.ok());
-  EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-
-  // Registration of standard key types works.
-  auto status = MacConfig::Register();
-  EXPECT_TRUE(status.ok()) << status;
-  manager_result = Registry::get_key_manager<Mac>(key_type);
-  EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-  EXPECT_TRUE(manager_result.ValueOrDie()->DoesSupport(key_type));
-}
-
-TEST_F(MacConfigTest, testRegister) {
-  std::string key_type = "type.googleapis.com/google.crypto.tink.HmacKey";
-
-  // Try on empty registry.
-  auto status = Config::Register(MacConfig::Latest());
-  EXPECT_FALSE(status.ok());
-  EXPECT_EQ(util::error::NOT_FOUND, status.error_code());
-  auto manager_result = Registry::get_key_manager<Mac>(key_type);
-  EXPECT_FALSE(manager_result.ok());
-
-  // Register and try again.
-  status = MacConfig::Register();
-  EXPECT_TRUE(status.ok()) << status;
-  manager_result = Registry::get_key_manager<Mac>(key_type);
-  EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-
-  // Try Register() again, should succeed (idempotence).
-  status = MacConfig::Register();
-  EXPECT_TRUE(status.ok()) << status;
-
-  // Reset the registry, and try overriding a catalogue with a different one.
-  Registry::Reset();
-  status = Registry::AddCatalogue("TinkMac", new DummyMacCatalogue());
-  EXPECT_TRUE(status.ok()) << status;
-  status = MacConfig::Register();
-  EXPECT_FALSE(status.ok());
-  EXPECT_EQ(util::error::ALREADY_EXISTS, status.error_code());
+TEST_F(MacConfigTest, Basic) {
+  EXPECT_THAT(
+      Registry::get_key_manager<Mac>(HmacKeyManager().get_key_type()).status(),
+      StatusIs(util::error::NOT_FOUND));
+  ASSERT_THAT(MacConfig::Register(), IsOk());
+  EXPECT_THAT(
+      Registry::get_key_manager<Mac>(HmacKeyManager().get_key_type()).status(),
+      IsOk());
 }
 
 // Tests that the MacWrapper has been properly registered and we can wrap
@@ -115,9 +62,13 @@
   key.set_key_id(1234);
   key.set_output_prefix_type(google::crypto::tink::OutputPrefixType::RAW);
   auto primitive_set = absl::make_unique<PrimitiveSet<Mac>>();
-  primitive_set->set_primary(
-      primitive_set->AddPrimitive(absl::make_unique<DummyMac>("dummy"), key)
-          .ValueOrDie());
+  ASSERT_TRUE(
+      primitive_set
+          ->set_primary(
+              primitive_set
+                  ->AddPrimitive(absl::make_unique<DummyMac>("dummy"), key)
+                  .ValueOrDie())
+          .ok());
 
   auto primitive_result = Registry::Wrap(std::move(primitive_set));
 
diff --git a/cc/mac/mac_factory_test.cc b/cc/mac/mac_factory_test.cc
index c43b991..f73032b 100644
--- a/cc/mac/mac_factory_test.cc
+++ b/cc/mac/mac_factory_test.cc
@@ -22,14 +22,14 @@
 #include "tink/mac.h"
 #include "tink/mac/hmac_key_manager.h"
 #include "tink/mac/mac_config.h"
-#include "tink/util/keyset_util.h"
+#include "tink/util/test_keyset_handle.h"
 #include "tink/util/status.h"
 #include "tink/util/test_util.h"
 #include "proto/common.pb.h"
 #include "proto/hmac.pb.h"
 #include "proto/tink.pb.h"
 
-using crypto::tink::KeysetUtil;
+using crypto::tink::TestKeysetHandle;
 using crypto::tink::test::AddRawKey;
 using crypto::tink::test::AddTinkKey;
 using google::crypto::tink::HashType;
@@ -49,7 +49,7 @@
 TEST_F(MacFactoryTest, testBasic) {
   Keyset keyset;
   auto mac_result =
-      MacFactory::GetPrimitive(*KeysetUtil::GetKeysetHandle(keyset));
+      MacFactory::GetPrimitive(*TestKeysetHandle::GetKeysetHandle(keyset));
   EXPECT_FALSE(mac_result.ok());
   EXPECT_EQ(util::error::INVALID_ARGUMENT, mac_result.status().error_code());
   EXPECT_PRED_FORMAT2(testing::IsSubstring, "at least one key",
@@ -58,9 +58,10 @@
 
 TEST_F(MacFactoryTest, testPrimitive) {
   // Prepare a format for generating keys for a Keyset.
-  HmacKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-  std::string key_type = key_manager.get_key_type();
+  HmacKeyManager key_type_manager;
+  auto key_manager = internal::MakeKeyManager<Mac>(&key_type_manager);
+  const KeyFactory& key_factory = key_manager->get_key_factory();
+  std::string key_type = key_manager->get_key_type();
 
   HmacKeyFormat key_format;
   key_format.set_key_size(16);
@@ -91,7 +92,7 @@
 
   // Create a KeysetHandle and use it with the factory.
   auto mac_result =
-      MacFactory::GetPrimitive(*KeysetUtil::GetKeysetHandle(keyset));
+      MacFactory::GetPrimitive(*TestKeysetHandle::GetKeysetHandle(keyset));
   EXPECT_TRUE(mac_result.ok()) << mac_result.status();
   auto mac = std::move(mac_result.ValueOrDie());
 
@@ -122,7 +123,7 @@
 
   // Create raw MAC value with 2nd key, and verify with Mac-instance.
   auto raw_mac = std::move(
-      key_manager.GetPrimitive(keyset.key(1).key_data()).ValueOrDie());
+      key_manager->GetPrimitive(keyset.key(1).key_data()).ValueOrDie());
   std::string raw_mac_value = raw_mac->ComputeMac(data).ValueOrDie();
   status = mac->VerifyMac(raw_mac_value, data);
   EXPECT_TRUE(status.ok()) << status;
diff --git a/cc/mac/mac_key_templates.cc b/cc/mac/mac_key_templates.cc
index 457c3dc..14b0d6b 100644
--- a/cc/mac/mac_key_templates.cc
+++ b/cc/mac/mac_key_templates.cc
@@ -16,6 +16,7 @@
 
 #include "tink/mac/mac_key_templates.h"
 
+#include "proto/aes_cmac.pb.h"
 #include "proto/common.pb.h"
 #include "proto/hmac.pb.h"
 #include "proto/tink.pb.h"
@@ -24,17 +25,16 @@
 namespace tink {
 namespace {
 
-using google::crypto::tink::HmacKeyFormat;
+using google::crypto::tink::AesCmacKeyFormat;
 using google::crypto::tink::HashType;
+using google::crypto::tink::HmacKeyFormat;
 using google::crypto::tink::KeyTemplate;
 using google::crypto::tink::OutputPrefixType;
 
-KeyTemplate* NewHmacKeyTemplate(int key_size_in_bytes,
-                                int tag_size_in_bytes,
+KeyTemplate* NewHmacKeyTemplate(int key_size_in_bytes, int tag_size_in_bytes,
                                 HashType hash_type) {
   KeyTemplate* key_template = new KeyTemplate;
-  key_template->set_type_url(
-      "type.googleapis.com/google.crypto.tink.HmacKey");
+  key_template->set_type_url("type.googleapis.com/google.crypto.tink.HmacKey");
   key_template->set_output_prefix_type(OutputPrefixType::TINK);
   HmacKeyFormat key_format;
   key_format.set_key_size(key_size_in_bytes);
@@ -44,6 +44,18 @@
   return key_template;
 }
 
+KeyTemplate* NewAesCmacKeyTemplate(int key_size_in_bytes,
+                                   int tag_size_in_bytes) {
+  KeyTemplate* key_template = new KeyTemplate;
+  key_template->set_type_url(
+      "type.googleapis.com/google.crypto.tink.AesCmacKey");
+  key_template->set_output_prefix_type(OutputPrefixType::TINK);
+  AesCmacKeyFormat key_format;
+  key_format.set_key_size(key_size_in_bytes);
+  key_format.mutable_params()->set_tag_size(tag_size_in_bytes);
+  key_format.SerializeToString(key_template->mutable_value());
+  return key_template;
+}
 
 }  // anonymous namespace
 
@@ -51,8 +63,7 @@
 const KeyTemplate& MacKeyTemplates::HmacSha256HalfSizeTag() {
   static const KeyTemplate* key_template =
       NewHmacKeyTemplate(/* key_size_in_bytes= */ 32,
-                         /* tag_size_in_bytes= */ 16,
-                         HashType::SHA256);
+                         /* tag_size_in_bytes= */ 16, HashType::SHA256);
   return *key_template;
 }
 
@@ -60,8 +71,30 @@
 const KeyTemplate& MacKeyTemplates::HmacSha256() {
   static const KeyTemplate* key_template =
       NewHmacKeyTemplate(/* key_size_in_bytes= */ 32,
-                         /* tag_size_in_bytes= */ 32,
-                         HashType::SHA256);
+                         /* tag_size_in_bytes= */ 32, HashType::SHA256);
+  return *key_template;
+}
+
+// static
+const KeyTemplate& MacKeyTemplates::HmacSha512HalfSizeTag() {
+  static const KeyTemplate* key_template =
+      NewHmacKeyTemplate(/* key_size_in_bytes= */ 64,
+                         /* tag_size_in_bytes= */ 32, HashType::SHA512);
+  return *key_template;
+}
+
+// static
+const KeyTemplate& MacKeyTemplates::HmacSha512() {
+  static const KeyTemplate* key_template =
+      NewHmacKeyTemplate(/* key_size_in_bytes= */ 64,
+                         /* tag_size_in_bytes= */ 64, HashType::SHA512);
+  return *key_template;
+}
+
+// static
+const KeyTemplate& MacKeyTemplates::AesCmac() {
+  static const KeyTemplate* key_template = NewAesCmacKeyTemplate(
+      /* key_size_in_bytes= */ 32, /* tag_size_in_bytes= */ 16);
   return *key_template;
 }
 
diff --git a/cc/mac/mac_key_templates.h b/cc/mac/mac_key_templates.h
index b9d59e3..c3b0028 100644
--- a/cc/mac/mac_key_templates.h
+++ b/cc/mac/mac_key_templates.h
@@ -50,6 +50,29 @@
   //   - hash function: SHA256
   //   - OutputPrefixType: TINK
   static const google::crypto::tink::KeyTemplate& HmacSha256();
+
+  // Returns a KeyTemplate that generates new instances of HmacKey
+  // with the following parameters:
+  //   - key size: 64 bytes
+  //   - tag size: 32 bytes
+  //   - hash function: SHA512
+  //   - OutputPrefixType: TINK
+  static const google::crypto::tink::KeyTemplate& HmacSha512HalfSizeTag();
+
+  // Returns a KeyTemplate that generates new instances of HmacKey
+  // with the following parameters:
+  //   - key size: 64 bytes
+  //   - tag size: 64 bytes
+  //   - hash function: SHA512
+  //   - OutputPrefixType: TINK
+  static const google::crypto::tink::KeyTemplate& HmacSha512();
+
+  // Returns a KeyTemplate that generates new instances of AesCmacKey
+  // with the following parameters:
+  //   - key size: 32 bytes
+  //   - tag size: 16 bytes
+  //   - OutputPrefixType: TINK
+  static const google::crypto::tink::KeyTemplate& AesCmac();
 };
 
 }  // namespace tink
diff --git a/cc/mac/mac_key_templates_test.cc b/cc/mac/mac_key_templates_test.cc
index 863ab51..75c4773 100644
--- a/cc/mac/mac_key_templates_test.cc
+++ b/cc/mac/mac_key_templates_test.cc
@@ -16,20 +16,29 @@
 
 #include "tink/mac/mac_key_templates.h"
 
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "tink/core/key_manager_impl.h"
+#include "tink/mac/aes_cmac_key_manager.h"
 #include "tink/mac/hmac_key_manager.h"
+#include "tink/util/test_matchers.h"
+#include "proto/aes_cmac.pb.h"
 #include "proto/common.pb.h"
 #include "proto/hmac.pb.h"
 #include "proto/tink.pb.h"
-#include "gtest/gtest.h"
 
 namespace crypto {
 namespace tink {
 namespace {
 
-using google::crypto::tink::HashType;
-using google::crypto::tink::HmacKeyFormat;
-using google::crypto::tink::KeyTemplate;
-using google::crypto::tink::OutputPrefixType;
+using ::crypto::tink::test::IsOk;
+using ::google::crypto::tink::AesCmacKeyFormat;
+using ::google::crypto::tink::HashType;
+using ::google::crypto::tink::HmacKeyFormat;
+using ::google::crypto::tink::KeyTemplate;
+using ::google::crypto::tink::OutputPrefixType;
+using ::testing::Eq;
+using ::testing::Ref;
 
 TEST(MacKeyTemplatesTest, testHmacKeyTemplates) {
   std::string type_url = "type.googleapis.com/google.crypto.tink.HmacKey";
@@ -51,9 +60,10 @@
     EXPECT_EQ(&key_template, &key_template_2);
 
     // Check that the template works with the key manager.
-    HmacKeyManager key_manager;
-    EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
-    auto new_key_result = key_manager.get_key_factory().NewKey(key_format);
+    HmacKeyManager key_type_manager;
+    auto key_manager = internal::MakeKeyManager<Mac>(&key_type_manager);
+    EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
+    auto new_key_result = key_manager->get_key_factory().NewKey(key_format);
     EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
   }
 
@@ -73,11 +83,88 @@
     EXPECT_EQ(&key_template, &key_template_2);
 
     // Check that the template works with the key manager.
-    HmacKeyManager key_manager;
-    EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
-    auto new_key_result = key_manager.get_key_factory().NewKey(key_format);
+    HmacKeyManager key_type_manager;
+    auto key_manager = internal::MakeKeyManager<Mac>(&key_type_manager);
+    EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
+    auto new_key_result = key_manager->get_key_factory().NewKey(key_format);
     EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
   }
+
+  {  // Test Hmac256BittagSha512().
+    // Check that returned template is correct.
+    const KeyTemplate& key_template = MacKeyTemplates::HmacSha512HalfSizeTag();
+    EXPECT_EQ(type_url, key_template.type_url());
+    EXPECT_EQ(OutputPrefixType::TINK, key_template.output_prefix_type());
+    HmacKeyFormat key_format;
+    EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
+    EXPECT_EQ(64, key_format.key_size());
+    EXPECT_EQ(32, key_format.params().tag_size());
+    EXPECT_EQ(HashType::SHA512, key_format.params().hash());
+
+    // Check that reference to the same object is returned.
+    const KeyTemplate& key_template_2 =
+        MacKeyTemplates::HmacSha512HalfSizeTag();
+    EXPECT_EQ(&key_template, &key_template_2);
+
+    // Check that the template works with the key manager.
+    HmacKeyManager key_type_manager;
+    auto key_manager = internal::MakeKeyManager<Mac>(&key_type_manager);
+    EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
+    auto new_key_result = key_manager->get_key_factory().NewKey(key_format);
+    EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
+  }
+
+  {  // Test Hmac512BittagSha512().
+    // Check that returned template is correct.
+    const KeyTemplate& key_template = MacKeyTemplates::HmacSha512();
+    EXPECT_EQ(type_url, key_template.type_url());
+    EXPECT_EQ(OutputPrefixType::TINK, key_template.output_prefix_type());
+    HmacKeyFormat key_format;
+    EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
+    EXPECT_EQ(64, key_format.key_size());
+    EXPECT_EQ(64, key_format.params().tag_size());
+    EXPECT_EQ(HashType::SHA512, key_format.params().hash());
+
+    // Check that reference to the same object is returned.
+    const KeyTemplate& key_template_2 = MacKeyTemplates::HmacSha512();
+    EXPECT_EQ(&key_template, &key_template_2);
+
+    // Check that the template works with the key manager.
+    HmacKeyManager key_type_manager;
+    auto key_manager = internal::MakeKeyManager<Mac>(&key_type_manager);
+    EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
+    auto new_key_result = key_manager->get_key_factory().NewKey(key_format);
+    EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
+  }
+}
+
+TEST(AesCmac, Basics) {
+  EXPECT_THAT(MacKeyTemplates::AesCmac().type_url(),
+              Eq("type.googleapis.com/google.crypto.tink.AesCmacKey"));
+  EXPECT_THAT(MacKeyTemplates::AesCmac().type_url(),
+              Eq(AesCmacKeyManager().get_key_type()));
+}
+
+TEST(AesCmac, OutputPrefixType) {
+  EXPECT_THAT(MacKeyTemplates::AesCmac().output_prefix_type(),
+              Eq(OutputPrefixType::TINK));
+}
+
+TEST(AesCmac, MultipleCallsSameReference) {
+  EXPECT_THAT(MacKeyTemplates::AesCmac(), Ref(MacKeyTemplates::AesCmac()));
+}
+
+TEST(AesCmac, WorksWithKeyTypeManager) {
+  AesCmacKeyFormat key_format;
+  EXPECT_TRUE(key_format.ParseFromString(MacKeyTemplates::AesCmac().value()));
+  EXPECT_THAT(AesCmacKeyManager().ValidateKeyFormat(key_format), IsOk());
+}
+
+TEST(AesCmac, CheckValues) {
+  AesCmacKeyFormat key_format;
+  EXPECT_TRUE(key_format.ParseFromString(MacKeyTemplates::AesCmac().value()));
+  EXPECT_THAT(key_format.key_size(), Eq(32));
+  EXPECT_THAT(key_format.params().tag_size(), Eq(16));
 }
 
 }  // namespace
diff --git a/cc/mac/mac_wrapper_test.cc b/cc/mac/mac_wrapper_test.cc
index c3b04e3..0898a51 100644
--- a/cc/mac/mac_wrapper_test.cc
+++ b/cc/mac/mac_wrapper_test.cc
@@ -15,16 +15,20 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 #include "tink/mac/mac_wrapper.h"
+
+#include "gtest/gtest.h"
 #include "tink/crypto_format.h"
 #include "tink/mac.h"
 #include "tink/primitive_set.h"
 #include "tink/util/status.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
-#include "gtest/gtest.h"
 
 using crypto::tink::test::DummyMac;
-using google::crypto::tink::OutputPrefixType;
 using google::crypto::tink::Keyset;
+using google::crypto::tink::KeyStatusType;
+using google::crypto::tink::OutputPrefixType;
+using ::crypto::tink::test::IsOk;
 
 namespace crypto {
 namespace tink {
@@ -55,16 +59,19 @@
   key = keyset.add_key();
   key->set_output_prefix_type(OutputPrefixType::TINK);
   key->set_key_id(key_id_0);
+  key->set_status(KeyStatusType::ENABLED);
 
   uint32_t key_id_1 = 726329;
   key = keyset.add_key();
   key->set_output_prefix_type(OutputPrefixType::LEGACY);
   key->set_key_id(key_id_1);
+  key->set_status(KeyStatusType::ENABLED);
 
   uint32_t key_id_2 = 7213743;
   key = keyset.add_key();
   key->set_output_prefix_type(OutputPrefixType::TINK);
   key->set_key_id(key_id_2);
+  key->set_status(KeyStatusType::ENABLED);
 
   std::string mac_name_0 = "mac0";
   std::string mac_name_1 = "mac1";
@@ -80,7 +87,7 @@
                                        keyset.key(2));
   ASSERT_TRUE(entry_result.ok());
   // The last key is the primary.
-  mac_set->set_primary(entry_result.ValueOrDie());
+  ASSERT_THAT(mac_set->set_primary(entry_result.ValueOrDie()), IsOk());
 
   // Wrap mac_set and test the resulting Mac.
   auto mac_result = MacWrapper().Wrap(std::move(mac_set));
@@ -109,13 +116,14 @@
   uint32_t key_id = 1234543;
   key.set_output_prefix_type(OutputPrefixType::LEGACY);
   key.set_key_id(key_id);
+  key.set_status(KeyStatusType::ENABLED);
   std::string mac_name = "SomeLegacyMac";
 
   std::unique_ptr<PrimitiveSet<Mac>> mac_set(new PrimitiveSet<Mac>());
   std::unique_ptr<Mac> mac(new DummyMac(mac_name));
   auto entry_result = mac_set->AddPrimitive(std::move(mac), key);
   ASSERT_TRUE(entry_result.ok());
-  mac_set->set_primary(entry_result.ValueOrDie());
+  ASSERT_THAT(mac_set->set_primary(entry_result.ValueOrDie()), IsOk());
 
   // Wrap mac_set and test the resulting Mac.
   auto mac_result = MacWrapper().Wrap(std::move(mac_set));
diff --git a/cc/output_stream_with_result.h b/cc/output_stream_with_result.h
new file mode 100644
index 0000000..01f330d
--- /dev/null
+++ b/cc/output_stream_with_result.h
@@ -0,0 +1,110 @@
+// Copyright 2018 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_OUTPUT_STREAM_WITH_RESULT_H_
+#define TINK_OUTPUT_STREAM_WITH_RESULT_H_
+
+#include <type_traits>
+
+#include "tink/output_stream.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+
+// An abstract OutputStream subclass that acts as a sink for data and returns a
+// result after the stream has been closed.
+// The result is only available if the stream was able to close with an ok
+// status. Otherwise, the status of the GetResult call will be the same status
+// as the Close call had. If Close is successful, GetResult is guaranteed to
+// return a valid result.
+// The return type of GetResult will be StatusOr<T>, except for T == Status, in
+// which case the return type is Status.
+template <class T>
+class OutputStreamWithResult : public OutputStream {
+ public:
+  OutputStreamWithResult() : closed_(false) {}
+  ~OutputStreamWithResult() override {}
+
+  // The return type is StatusOr<T> if T != Status, and Status otherwise.
+  using ResultType =
+      typename std::conditional<std::is_same<T, util::Status>::value,
+                                util::Status, util::StatusOr<T>>::type;
+
+  // Get the result associated with this OutputStream. Can only be called on
+  // closed streams, and will otherwise fail with FAILED_PRECONDITION as error
+  // code.
+  // If Close() returned an ok status, this method is guaranteed to contain a
+  // valid result.
+  // The return type is StatusOr<T> if T != Status, and Status otherwise.
+  ResultType GetResult() {
+    if (!closed_) {
+      return util::Status(util::error::FAILED_PRECONDITION,
+                          "Stream is not closed");
+    }
+    return result_;
+  }
+
+  // Close the stream and return the computed result. Equivalent to calling
+  // Close() and GetResult() if Close() returned an OK status.
+  // The return type is StatusOr<T> if T != Status, and Status otherwise.
+  ResultType CloseAndGetResult() {
+    util::Status closing_status = Close();
+    if (!closing_status.ok()) {
+      return closing_status;
+    }
+    return GetResult();
+  }
+
+  // Closes the OutputStream.
+  util::Status Close() final {
+    if (closed_) {
+      return util::Status(util::error::FAILED_PRECONDITION, "Stream closed");
+    }
+    result_ = CloseStreamAndComputeResult();
+    closed_ = true;
+    return result_.status();
+  }
+
+  // Getting the next OutputStream buffer. See OutputStream for detailed
+  // description.
+  crypto::tink::util::StatusOr<int> Next(void** data) final {
+    if (closed_) {
+      return util::Status(util::error::FAILED_PRECONDITION,
+                          "Write on closed Stream");
+    }
+    return NextBuffer(data);
+  }
+
+ protected:
+  // Compute the result for this OutputStream. Safe for thread safety problems,
+  // this method will only be called once.
+  // The return type is StatusOr<T> if T != Status, and Status otherwise.
+  virtual ResultType CloseStreamAndComputeResult() = 0;
+  // Getting the next OutputStream buffer. See OutputStream for detailed
+  // description.
+  virtual util::StatusOr<int> NextBuffer(void** data) = 0;
+
+ private:
+  bool closed_;
+  ResultType result_;
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_OUTPUT_STREAM_WITH_RESULT_H_
diff --git a/cc/primitive_set.h b/cc/primitive_set.h
index c782794..b9ccfe2 100644
--- a/cc/primitive_set.h
+++ b/cc/primitive_set.h
@@ -67,12 +67,9 @@
 
     const std::string& get_identifier() const { return identifier_; }
 
-    const google::crypto::tink::KeyStatusType get_status() const {
-      return status_;
-    }
+    google::crypto::tink::KeyStatusType get_status() const { return status_; }
 
-    const google::crypto::tink::OutputPrefixType get_output_prefix_type()
-        const {
+    google::crypto::tink::OutputPrefixType get_output_prefix_type() const {
       return output_prefix_type_;
     }
 
@@ -91,6 +88,10 @@
   // Adds 'primitive' to this set for the specified 'key'.
   crypto::tink::util::StatusOr<Entry<P>*> AddPrimitive(
       std::unique_ptr<P> primitive, google::crypto::tink::Keyset::Key key) {
+    if (key.status() != google::crypto::tink::KeyStatusType::ENABLED) {
+      return ToStatusF(crypto::tink::util::error::INVALID_ARGUMENT,
+                       "The key must be ENABLED.");
+    }
     auto identifier_result = CryptoFormat::get_output_prefix(key);
     if (!identifier_result.ok()) return identifier_result.status();
     if (primitive == nullptr) {
@@ -100,9 +101,8 @@
     std::string identifier = identifier_result.ValueOrDie();
     absl::MutexLock lock(&primitives_mutex_);
     primitives_[identifier].push_back(
-        absl::make_unique<Entry<P>>(std::move(primitive),
-                                    identifier, key.status(),
-                                    key.output_prefix_type()));
+        absl::make_unique<Entry<P>>(std::move(primitive), identifier,
+                                    key.status(), key.output_prefix_type()));
     return primitives_[identifier].back().get();
   }
 
@@ -125,8 +125,26 @@
     return get_primitives(CryptoFormat::kRawPrefix);
   }
 
-  // Sets the given 'primary' as as the primary primitive of this set.
-  void set_primary(Entry<P>* primary) { primary_ = primary; }
+  // Sets the given 'primary' as the primary primitive of this set.
+  crypto::tink::util::Status set_primary(Entry<P>* primary) {
+    if (!primary) {
+      return ToStatusF(crypto::tink::util::error::INVALID_ARGUMENT,
+                       "The primary primitive must be non-null.");
+    }
+    if (primary->get_status() != google::crypto::tink::KeyStatusType::ENABLED) {
+      return ToStatusF(crypto::tink::util::error::INVALID_ARGUMENT,
+                       "Primary has to be enabled.");
+    }
+    auto entries_result = get_primitives(primary->get_identifier());
+    if (!entries_result.ok()) {
+      return ToStatusF(crypto::tink::util::error::INVALID_ARGUMENT,
+                       "Primary cannot be set to an entry which is "
+                       "not held by this primitive set.");
+    }
+
+    primary_ = primary;
+    return crypto::tink::util::Status::OK;
+  }
 
   // Returns the entry with the primary primitive.
   const Entry<P>* get_primary() const { return primary_; }
@@ -136,7 +154,8 @@
       CiphertextPrefixToPrimitivesMap;
   Entry<P>* primary_;  // the Entry<P> object is owned by primitives_
   absl::Mutex primitives_mutex_;
-  CiphertextPrefixToPrimitivesMap primitives_ GUARDED_BY(primitives_mutex_);
+  CiphertextPrefixToPrimitivesMap primitives_
+      ABSL_GUARDED_BY(primitives_mutex_);
 };
 
 }  // namespace tink
diff --git a/cc/primitive_wrapper.h b/cc/primitive_wrapper.h
index c03e756..5c222c9 100644
--- a/cc/primitive_wrapper.h
+++ b/cc/primitive_wrapper.h
@@ -14,8 +14,8 @@
 //
 ///////////////////////////////////////////////////////////////////////////////
 
-#ifndef TINK_SET_WRAPPER_FACTORY_H_
-#define TINK_SET_WRAPPER_FACTORY_H_
+#ifndef TINK_PRIMITIVE_WRAPPER_H_
+#define TINK_PRIMITIVE_WRAPPER_H_
 
 #include <memory>
 
@@ -30,7 +30,7 @@
 // PrimitiveSet<Primitive> and wraps it into a single primitive.
 //
 // PrimitiveWrappers need to be written for every new primitive. They can be
-// registered in the registry to be fully integrated in tink.
+// registered in the registry to be fully integrated in Tink.
 template <class Primitive>
 class PrimitiveWrapper {
  public:
@@ -42,4 +42,4 @@
 }  // namespace tink
 }  // namespace crypto
 
-#endif  // TINK_SET_WRAPPER_FACTORY_H_
+#endif  // TINK_PRIMITIVE_WRAPPER_H_
diff --git a/cc/python/aead.clif b/cc/python/aead.clif
new file mode 100644
index 0000000..ca1e653
--- /dev/null
+++ b/cc/python/aead.clif
@@ -0,0 +1,37 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from "tink/python/util/clif.h" import *  # StatusOr
+
+from "tink/cc/aead.h":
+  namespace `crypto::tink`:
+    # The interface for authenticated encryption with associated data.
+    # Implementations of this interface are secure against adaptive
+    # chosen ciphertext attacks.  Encryption with associated data ensures
+    # authenticity and integrity of that data, but not its secrecy.
+    # (see RFC 5116, https://tools.ietf.org/html/rfc5116)
+    class Aead:
+      # Encrypts 'plaintext' with 'associated_data' as associated data,
+      # and returns the resulting ciphertext.
+      # The ciphertext allows for checking authenticity and integrity
+      # of the associated data , but does not guarantee its secrecy.
+      def `Encrypt` as encrypt(self, plaintext: bytes, associated_data: bytes)
+        -> StatusOr<bytes>
+      # Decrypts 'ciphertext' with 'associated_data' as associated data,
+      # and returns the resulting plaintext.
+      # The decryption verifies the authenticity and integrity
+      # of the associated data, but there are no guarantees wrt. secrecy
+      # of that data.
+      def `Decrypt` as decrypt(self, ciphertext: bytes, associated_data: bytes)
+        -> StatusOr<bytes>
diff --git a/cc/python/deterministic_aead.clif b/cc/python/deterministic_aead.clif
new file mode 100644
index 0000000..e66b4cf
--- /dev/null
+++ b/cc/python/deterministic_aead.clif
@@ -0,0 +1,45 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from "tink/python/util/clif.h" import *  # StatusOr
+
+from "tink/cc/deterministic_aead.h":
+  namespace `crypto::tink`:
+    # Interface for Deterministic Authenticated Encryption with Associated Data
+    # (Deterministic AEAD)
+    #
+    # For why this interface is desirable and some of its use cases, see for
+    # example https://tools.ietf.org/html/rfc5297#section-1.3.
+    #
+    # Warning!
+    # Unlike Aead, implementations of this interface are not semantically
+    # secure, because encrypting the same plaintex always yields the same
+    # ciphertext.
+    #
+    # Security guarantees
+    #
+    # Implementations of this interface provide 128-bit security level against
+    # multi-user attacks with up to 2^32 keys. That means if an adversary
+    # obtains 2^32 ciphertexts of the same message encrypted under 2^32 keys,
+    # they need to do 2^128 computations to obtain a single key.
+    #
+    # Encryption with associated data ensures authenticity (who the sender is)
+    # and integrity (the data has not been tampered with) of that data, but not
+    # its secrecy. (see https://tools.ietf.org/html/rfc5116)
+    class DeterministicAead:
+
+      def `EncryptDeterministically` as encrypt_deterministically(
+          self, plaintext: bytes, associated_data: bytes) -> StatusOr<bytes>
+      def `DecryptDeterministically` as decrypt_deterministically(
+          self, ciphertext: bytes, associated_data: bytes) -> StatusOr<bytes>
diff --git a/cc/python/hybrid_decrypt.clif b/cc/python/hybrid_decrypt.clif
new file mode 100644
index 0000000..a69f8fa
--- /dev/null
+++ b/cc/python/hybrid_decrypt.clif
@@ -0,0 +1,21 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from "tink/python/util/clif.h" import *  # StatusOr
+
+from "tink/cc/hybrid_decrypt.h":
+  namespace `crypto::tink`:
+    class HybridDecrypt:
+      def `Decrypt` as decrypt(self, ciphertext: bytes, context_info: bytes)
+        -> StatusOr<bytes>
diff --git a/cc/python/hybrid_encrypt.clif b/cc/python/hybrid_encrypt.clif
new file mode 100644
index 0000000..afad001
--- /dev/null
+++ b/cc/python/hybrid_encrypt.clif
@@ -0,0 +1,21 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from "tink/python/util/clif.h" import *  # StatusOr
+
+from "tink/cc/hybrid_encrypt.h":
+  namespace `crypto::tink`:
+    class HybridEncrypt:
+      def `Encrypt` as encrypt(self, plaintext: bytes, context_info: bytes)
+        -> StatusOr<bytes>
diff --git a/cc/python/mac.clif b/cc/python/mac.clif
new file mode 100644
index 0000000..3105b3e
--- /dev/null
+++ b/cc/python/mac.clif
@@ -0,0 +1,30 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from "tink/python/util/clif.h" import *  # Status, StatusOr
+from clif.python.postproc import DropOkStatus
+
+from "tink/cc/mac.h":
+  namespace `crypto::tink`:
+    # Interface for MACs (Message Authentication Codes).
+    # This interface should be used for authentication only, and not for other
+    # purposes (e.g., it should not be used to generate pseudorandom bytes).
+    class Mac:
+      # Computes and returns the message authentication code (MAC) for 'data'.
+      def `ComputeMac` as compute_mac(self, data: bytes) -> StatusOr<bytes>
+      # Verifies if 'mac' is a correct authentication code (MAC) for 'data'.
+      # Raises a StatusNotOk exception if the verification fails.
+      def `VerifyMac` as verify_mac(self, mac: bytes, data: bytes)
+          -> (ok: Status):
+        return DropOkStatus(...)
diff --git a/cc/python/public_key_sign.clif b/cc/python/public_key_sign.clif
new file mode 100644
index 0000000..d599bd4
--- /dev/null
+++ b/cc/python/public_key_sign.clif
@@ -0,0 +1,28 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from "tink/python/util/clif.h" import *  # StatusOr
+
+from "tink/cc/public_key_sign.h":
+  namespace `crypto::tink`:
+    # Interface for public key signing.
+    # Digital Signatures provide functionality of signing data and verification
+    # of the signatures. They are represented by a pair of primitives
+    # (interfaces) 'PublicKeySign' for signing of data, and 'PublicKeyVerify'
+    # for verification of signatures. Implementations of these interfaces are
+    # secure against adaptive chosen-message attacks. Signing data ensures the
+    # authenticity and the integrity of that data, but not its secrecy.
+    class PublicKeySign:
+      # Computes the signature for 'data'.
+      def `Sign` as sign(self, data: bytes) -> StatusOr<bytes>
diff --git a/cc/python/public_key_verify.clif b/cc/python/public_key_verify.clif
new file mode 100644
index 0000000..9ea3bb4
--- /dev/null
+++ b/cc/python/public_key_verify.clif
@@ -0,0 +1,31 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from "tink/python/util/clif.h" import *  # Status
+from clif.python.postproc import DropOkStatus
+
+from "tink/cc/public_key_verify.h":
+  namespace `crypto::tink`:
+    # Interface for public key verifying.
+    # Digital Signatures provide functionality of signing data and verification
+    # of the signatures. They are represented by a pair of primitives
+    # (interfaces) 'PublicKeySign' for signing of data, and 'PublicKeyVerify'
+    # for verification of signatures. Implementations of these interfaces are
+    # secure against adaptive chosen-message attacks. Signing data ensures the
+    # authenticity and the integrity of that data, but not its secrecy.
+    class PublicKeyVerify:
+      # Verifies that signature is a digital signature for data.
+      def `Verify` as verify(self, signature: bytes, data: bytes)
+        -> (ok: Status):
+        return DropOkStatus(...)
diff --git a/cc/python/streaming_aead.clif b/cc/python/streaming_aead.clif
new file mode 100644
index 0000000..0c08d02
--- /dev/null
+++ b/cc/python/streaming_aead.clif
@@ -0,0 +1,30 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from "tink/python/util/clif.h" import *  # StatusOr
+
+from "tink/cc/streaming_aead.h":
+  namespace `crypto::tink`:
+    # Interface for streaming authenticated encryption with associated data.
+    # Streaming encryption is typically used for encrypting large plaintexts
+    # such as large files. This interface supports a streaming interface for
+    # symmetric encryption with authentication. The underlying encryption modes
+    # are selected so that partial plaintext can be obtained fast by decrypting
+    # and authenticating just a part of the ciphertext.
+    class StreamingAead:
+        # Intentionally empty.
+        #
+        # The cliffed CC primitive's only purpose is to be stored as a member
+        # variable and later be passed to a wrapper function (which sidesteps
+        # cliffing an OutputStream). Therefore Python doesn't need to know about
+        # its methods, just that it exists.
+        pass
diff --git a/cc/random_access_stream.h b/cc/random_access_stream.h
new file mode 100644
index 0000000..b40445a
--- /dev/null
+++ b/cc/random_access_stream.h
@@ -0,0 +1,68 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_RANDOM_ACCESS_STREAM_H_
+#define TINK_RANDOM_ACCESS_STREAM_H_
+
+#include "tink/util/buffer.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+
+// Abstract interface for streams that provide random access for reading,
+// like regular files.
+class RandomAccessStream {
+ public:
+  RandomAccessStream() {}
+  virtual ~RandomAccessStream() {}
+
+  // Reads up to 'count' bytes starting at 'position' and writes them
+  // to 'dest_buffer'.  'position' must be within the size of the stream,
+  // 'count' must be positive, 'dest_buffer' must be non-NULL and its
+  // allocated size must be not smaller than 'count'.
+  //
+  // Return values:
+  //  OK: if exactly 'count' bytes were read and written to 'dest_buffer',
+  //      or if fewer than 'count' (potentially 0) bytes were read,
+  //      but the lack of bytes is not permanent, and retrying may succeed;
+  //      in this case 'dest_buffer' contains the read bytes, and the size
+  //      of the buffer has been changed to the number of bytes read.
+  //  OUT_OF_RANGE: if the end of stream has been reached;
+  //      in this case 'dest_buffer' contains the bytes read till the end
+  //      of the stream (if any).  This status is returned also when
+  //      'position' is larger than the current size of the stream.
+  //  INVALID_ARGUMENT: if some of the arguments are not valid.
+  //  other: if some other error occurred.
+  virtual crypto::tink::util::Status PRead(
+      int64_t position,
+      int count,
+      crypto::tink::util::Buffer* dest_buffer) = 0;
+
+  // Returns the size of this stream in bytes, if available.
+  // If the size is not available, returns a non-Ok status.
+  // The returned value is the "logical" size of a stream, i.e. of
+  // a sequence of bytes), stating how many bytes are there in the sequence.
+  // For a successful PRead-operation the starting position should be
+  // in the range 0..size()-1 (otherwise PRead may return a non-Ok status).
+  virtual crypto::tink::util::StatusOr<int64_t> size() = 0;
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_RANDOM_ACCESS_STREAM_H_
diff --git a/cc/registry.h b/cc/registry.h
index 5bc6df7..ba32c03 100644
--- a/cc/registry.h
+++ b/cc/registry.h
@@ -27,23 +27,25 @@
 namespace crypto {
 namespace tink {
 
-// Registry for KeyMangers.
+// Registry for KeyMangers and PrimitiveWrappers.
 //
-// It is essentially a big container (map) that for each supported key
-// type holds a corresponding KeyManager object, which "understands"
-// the key type (i.e. the KeyManager can instantiate the primitive
-// corresponding to given key, or can generate new keys of the
-// supported key type).  Registry is initialized at startup, and is
-// later used to instantiate primitives for given keys or keysets.
-// Keeping KeyManagers for all primitives in a single Registry (rather
-// than having a separate KeyManager per primitive) enables modular
-// construction of compound primitives from "simple" ones, e.g.,
+// It is essentially a big container (map) that for each supported key type
+// holds a corresponding KeyManager object, which "understands" the key type
+// (i.e. the KeyManager can instantiate the primitive corresponding to given
+// key, or can generate new keys of the supported key type).  It holds also
+// a so-called PrimitiveWrapper for each supported primitive, so that it can
+// wrap a set of primitives (corresponding to a keyset) into a single primitive.
+//
+// Registry is initialized at startup, and is later used to instantiate
+// primitives for given keys or keysets.  Keeping KeyManagers for all primitives
+// in a single Registry (rather than having a separate KeyManager per primitive)
+// enables modular construction of compound primitives from "simple" ones, e.g.,
 // AES-CTR-HMAC AEAD encryption uses IND-CPA encryption and a MAC.
 //
-// Note that regular users will usually not work directly with
-// Registry, but rather via primitive factories, which in the
-// background query the Registry for specific KeyManagers.  Registry
-// is public though, to enable configurations with custom primitives
+// Note that regular users will usually not work directly with Registry, but
+// rather via KeysetHandle::GetPrimitive()-methods, which in the background
+// query the Registry for specific KeyManagers and PrimitiveWrappers.
+// Registry is public though, to enable configurations with custom primitives
 // and KeyManagers.
 class Registry {
  public:
@@ -54,6 +56,7 @@
   // (cannot return reference directly, as StatusOr does not support it,
   // see https://goo.gl/x0ymDz)
   template <class P>
+  ABSL_DEPRECATED("Catalogues are not supported anymore.")
   static crypto::tink::util::StatusOr<const Catalogue<P>*> get_catalogue(
       const std::string& catalogue_name) {
     return RegistryImpl::GlobalInstance().get_catalogue<P>(catalogue_name);
@@ -66,6 +69,7 @@
   // and fails if the given 'catalogue' tries to override
   // an existing, different catalogue for the specified name.
   template <class ConcreteCatalogue>
+  ABSL_DEPRECATED("Catalogues are not supported anymore.")
   static crypto::tink::util::Status AddCatalogue(
       const std::string& catalogue_name,
       std::unique_ptr<ConcreteCatalogue> catalogue) {
@@ -110,6 +114,26 @@
     return RegisterKeyManager(absl::WrapUnique(manager), new_key_allowed);
   }
 
+  template <class KTManager>
+  static crypto::tink::util::Status RegisterKeyTypeManager(
+      std::unique_ptr<KTManager> manager, bool new_key_allowed) {
+    return RegistryImpl::GlobalInstance()
+        .RegisterKeyTypeManager<typename KTManager::KeyProto,
+                                typename KTManager::KeyFormatProto,
+                                typename KTManager::PrimitiveList>(
+            std::move(manager), new_key_allowed);
+  }
+
+  template <class PrivateKeyTypeManager, class KeyTypeManager>
+  static crypto::tink::util::Status RegisterAsymmetricKeyManagers(
+      std::unique_ptr<PrivateKeyTypeManager> private_key_manager,
+      std::unique_ptr<KeyTypeManager> public_key_manager,
+      bool new_key_allowed) {
+    return RegistryImpl::GlobalInstance().RegisterAsymmetricKeyManagers(
+        private_key_manager.release(), public_key_manager.release(),
+        new_key_allowed);
+  }
+
   template <class ConcretePrimitiveWrapper>
   static crypto::tink::util::Status RegisterPrimitiveWrapper(
       std::unique_ptr<ConcretePrimitiveWrapper> wrapper) {
diff --git a/cc/signature/BUILD.bazel b/cc/signature/BUILD.bazel
index 683593a..9de97d3 100644
--- a/cc/signature/BUILD.bazel
+++ b/cc/signature/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 cc_library(
     name = "public_key_verify_wrapper",
@@ -84,6 +84,7 @@
     hdrs = ["signature_key_templates.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
         "//cc/subtle:subtle_util_boringssl",
         "//cc/util:constants",
@@ -107,20 +108,18 @@
     strip_include_prefix = "/cc",
     deps = [
         ":ecdsa_verify_key_manager",
-        "//cc:key_manager",
-        "//cc:key_manager_base",
+        "//cc:core/private_key_type_manager",
         "//cc:public_key_sign",
-        "//cc:registry",
         "//cc/subtle:ecdsa_sign_boringssl",
         "//cc/subtle:subtle_util_boringssl",
+        "//cc/util:constants",
         "//cc/util:enums",
         "//cc/util:errors",
         "//cc/util:protobuf_helper",
         "//cc/util:status",
         "//cc/util:statusor",
-        "//proto:common_cc_proto",
+        "//cc/util:validation",
         "//proto:ecdsa_cc_proto",
-        "//proto:tink_cc_proto",
         "@com_google_absl//absl/memory",
         "@com_google_absl//absl/strings",
     ],
@@ -133,20 +132,18 @@
     include_prefix = "tink",
     strip_include_prefix = "/cc",
     deps = [
-        "//cc:key_manager",
-        "//cc:key_manager_base",
+        "//cc:core/key_type_manager",
         "//cc:public_key_verify",
-        "//cc:registry",
         "//cc/subtle:ecdsa_verify_boringssl",
         "//cc/subtle:subtle_util_boringssl",
+        "//cc/util:constants",
         "//cc/util:enums",
         "//cc/util:errors",
         "//cc/util:protobuf_helper",
         "//cc/util:status",
         "//cc/util:statusor",
-        "//proto:common_cc_proto",
+        "//cc/util:validation",
         "//proto:ecdsa_cc_proto",
-        "//proto:tink_cc_proto",
     ],
 )
 
@@ -158,11 +155,11 @@
     strip_include_prefix = "/cc",
     deps = [
         ":ed25519_verify_key_manager",
-        "//cc:key_manager",
-        "//cc:key_manager_base",
+        "//cc:core/private_key_type_manager",
         "//cc:public_key_sign",
         "//cc/subtle:ed25519_sign_boringssl",
         "//cc/subtle:subtle_util_boringssl",
+        "//cc/util:constants",
         "//cc/util:enums",
         "//cc/util:errors",
         "//cc/util:protobuf_helper",
@@ -170,8 +167,6 @@
         "//cc/util:statusor",
         "//cc/util:validation",
         "//proto:ed25519_cc_proto",
-        "//proto:empty_cc_proto",
-        "//proto:tink_cc_proto",
         "@com_google_absl//absl/memory",
         "@com_google_absl//absl/strings",
     ],
@@ -184,11 +179,11 @@
     include_prefix = "tink",
     strip_include_prefix = "/cc",
     deps = [
-        "//cc:key_manager",
-        "//cc:key_manager_base",
+        "//cc:core/key_type_manager",
         "//cc:public_key_verify",
         "//cc/subtle:ed25519_verify_boringssl",
         "//cc/subtle:subtle_util_boringssl",
+        "//cc/util:constants",
         "//cc/util:errors",
         "//cc/util:protobuf_helper",
         "//cc/util:status",
@@ -221,20 +216,18 @@
     deps = [
         ":rsa_ssa_pkcs1_verify_key_manager",
         ":sig_util",
-        "//cc:key_manager",
-        "//cc:key_manager_base",
+        "//cc:core/private_key_type_manager",
         "//cc:public_key_sign",
-        "//cc:registry",
+        "//cc:public_key_verify",
         "//cc/subtle:rsa_ssa_pkcs1_sign_boringssl",
         "//cc/subtle:subtle_util_boringssl",
+        "//cc/util:constants",
         "//cc/util:enums",
         "//cc/util:errors",
         "//cc/util:protobuf_helper",
         "//cc/util:status",
         "//cc/util:statusor",
-        "//proto:common_cc_proto",
         "//proto:rsa_ssa_pkcs1_cc_proto",
-        "//proto:tink_cc_proto",
         "@com_google_absl//absl/memory",
         "@com_google_absl//absl/strings",
     ],
@@ -247,20 +240,19 @@
     include_prefix = "tink",
     strip_include_prefix = "/cc",
     deps = [
-        "//cc:key_manager",
-        "//cc:key_manager_base",
+        "//cc:core/key_type_manager",
         "//cc:public_key_verify",
-        "//cc:registry",
         "//cc/subtle:rsa_ssa_pkcs1_verify_boringssl",
         "//cc/subtle:subtle_util_boringssl",
+        "//cc/util:constants",
         "//cc/util:enums",
         "//cc/util:errors",
         "//cc/util:protobuf_helper",
         "//cc/util:status",
         "//cc/util:statusor",
-        "//proto:common_cc_proto",
+        "//cc/util:validation",
         "//proto:rsa_ssa_pkcs1_cc_proto",
-        "//proto:tink_cc_proto",
+        "@com_google_absl//absl/strings",
     ],
 )
 
@@ -273,12 +265,13 @@
     deps = [
         ":rsa_ssa_pss_verify_key_manager",
         ":sig_util",
-        "//cc:key_manager",
-        "//cc:key_manager_base",
+        "//cc:core/key_type_manager",
+        "//cc:core/private_key_type_manager",
         "//cc:public_key_sign",
         "//cc:registry",
         "//cc/subtle:rsa_ssa_pss_sign_boringssl",
         "//cc/subtle:subtle_util_boringssl",
+        "//cc/util:constants",
         "//cc/util:enums",
         "//cc/util:errors",
         "//cc/util:protobuf_helper",
@@ -299,12 +292,13 @@
     include_prefix = "tink",
     strip_include_prefix = "/cc",
     deps = [
-        "//cc:key_manager",
-        "//cc:key_manager_base",
+        "//cc:core/key_type_manager",
+        "//cc:public_key_sign",
         "//cc:public_key_verify",
         "//cc:registry",
         "//cc/subtle:rsa_ssa_pss_verify_boringssl",
         "//cc/subtle:subtle_util_boringssl",
+        "//cc/util:constants",
         "//cc/util:enums",
         "//cc/util:errors",
         "//cc/util:protobuf_helper",
@@ -317,56 +311,28 @@
 )
 
 cc_library(
-    name = "public_key_sign_catalogue",
-    srcs = ["public_key_sign_catalogue.cc"],
-    hdrs = ["public_key_sign_catalogue.h"],
-    include_prefix = "tink",
-    strip_include_prefix = "/cc",
-    deps = [
-        ":ecdsa_sign_key_manager",
-        ":ed25519_sign_key_manager",
-        ":rsa_ssa_pkcs1_sign_key_manager",
-        ":rsa_ssa_pss_sign_key_manager",
-        "//cc:catalogue",
-        "//cc:key_manager",
-        "//cc:public_key_sign",
-        "//cc/util:status",
-        "//cc/util:statusor",
-    ],
-)
-
-cc_library(
-    name = "public_key_verify_catalogue",
-    srcs = ["public_key_verify_catalogue.cc"],
-    hdrs = ["public_key_verify_catalogue.h"],
-    include_prefix = "tink",
-    strip_include_prefix = "/cc",
-    deps = [
-        ":ecdsa_verify_key_manager",
-        ":ed25519_verify_key_manager",
-        ":rsa_ssa_pkcs1_verify_key_manager",
-        ":rsa_ssa_pss_verify_key_manager",
-        "//cc:catalogue",
-        "//cc:key_manager",
-        "//cc:public_key_verify",
-        "//cc/util:status",
-        "//cc/util:statusor",
-    ],
-)
-
-cc_library(
     name = "signature_config",
     srcs = ["signature_config.cc"],
     hdrs = ["signature_config.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    visibility = ["//visibility:public"],
     deps = [
-        ":public_key_sign_catalogue",
-        ":public_key_verify_catalogue",
-        "//cc:config",
+        ":ecdsa_sign_key_manager",
+        ":ecdsa_verify_key_manager",
+        ":ed25519_sign_key_manager",
+        ":ed25519_verify_key_manager",
+        ":public_key_sign_wrapper",
+        ":public_key_verify_wrapper",
+        ":rsa_ssa_pkcs1_sign_key_manager",
+        ":rsa_ssa_pkcs1_verify_key_manager",
+        ":rsa_ssa_pss_sign_key_manager",
+        ":rsa_ssa_pss_verify_key_manager",
         "//cc:registry",
+        "//cc/config:config_util",
         "//cc/util:status",
         "//proto:config_cc_proto",
+        "@com_google_absl//absl/base:core_headers",
         "@com_google_absl//absl/memory",
     ],
 )
@@ -384,6 +350,7 @@
         "//cc:public_key_sign",
         "//cc:public_key_verify",
         "//cc/util:status",
+        "//cc/util:test_matchers",
         "//cc/util:test_util",
         "//proto:tink_cc_proto",
         "@com_google_googletest//:gtest_main",
@@ -403,8 +370,8 @@
         "//cc:keyset_handle",
         "//cc:public_key_verify",
         "//cc:registry",
-        "//cc/util:keyset_util",
         "//cc/util:status",
+        "//cc/util:test_keyset_handle",
         "//cc/util:test_util",
         "//proto:ecdsa_cc_proto",
         "//proto:tink_cc_proto",
@@ -424,6 +391,7 @@
         "//cc:public_key_sign",
         "//cc:public_key_verify",
         "//cc/util:status",
+        "//cc/util:test_matchers",
         "//cc/util:test_util",
         "//proto:tink_cc_proto",
         "@com_google_googletest//:gtest_main",
@@ -443,8 +411,8 @@
         "//cc:keyset_handle",
         "//cc:public_key_sign",
         "//cc:registry",
-        "//cc/util:keyset_util",
         "//cc/util:status",
+        "//cc/util:test_keyset_handle",
         "//cc/util:test_util",
         "//proto:ecdsa_cc_proto",
         "//proto:tink_cc_proto",
@@ -460,11 +428,14 @@
     deps = [
         ":ecdsa_sign_key_manager",
         ":ecdsa_verify_key_manager",
-        "//cc:config",
         "//cc:public_key_sign",
         "//cc:public_key_verify",
         "//cc:registry",
+        "//cc/subtle:ecdsa_sign_boringssl",
+        "//cc/subtle:subtle_util_boringssl",
+        "//cc/util:enums",
         "//cc/util:status",
+        "//cc/util:test_matchers",
         "//cc/util:test_util",
         "//proto:aes_eax_cc_proto",
         "//proto:common_cc_proto",
@@ -485,14 +456,13 @@
         "//cc:public_key_sign",
         "//cc:public_key_verify",
         "//cc:registry",
+        "//cc/subtle:ed25519_sign_boringssl",
+        "//cc/util:enums",
         "//cc/util:status",
         "//cc/util:statusor",
+        "//cc/util:test_matchers",
         "//cc/util:test_util",
-        "//proto:aes_eax_cc_proto",
-        "//proto:common_cc_proto",
         "//proto:ed25519_cc_proto",
-        "//proto:empty_cc_proto",
-        "//proto:tink_cc_proto",
         "@com_google_googletest//:gtest_main",
     ],
 )
@@ -503,17 +473,19 @@
     srcs = ["rsa_ssa_pkcs1_verify_key_manager_test.cc"],
     copts = ["-Iexternal/gtest/include"],
     deps = [
+        ":rsa_ssa_pkcs1_sign_key_manager",
         ":rsa_ssa_pkcs1_verify_key_manager",
-        "//cc:config",
         "//cc:public_key_sign",
         "//cc:public_key_verify",
-        "//cc:registry",
+        "//cc/subtle:rsa_ssa_pkcs1_sign_boringssl",
+        "//cc/subtle:subtle_util_boringssl",
         "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_matchers",
         "//cc/util:test_util",
-        "//proto:aes_eax_cc_proto",
-        "//proto:common_cc_proto",
         "//proto:rsa_ssa_pkcs1_cc_proto",
         "//proto:tink_cc_proto",
+        "@boringssl//:crypto",
         "@com_google_absl//absl/strings",
         "@com_google_googletest//:gtest_main",
     ],
@@ -525,17 +497,18 @@
     srcs = ["rsa_ssa_pss_verify_key_manager_test.cc"],
     copts = ["-Iexternal/gtest/include"],
     deps = [
+        ":rsa_ssa_pss_sign_key_manager",
         ":rsa_ssa_pss_verify_key_manager",
-        "//cc:config",
         "//cc:public_key_sign",
         "//cc:public_key_verify",
-        "//cc:registry",
+        "//cc/subtle:rsa_ssa_pss_sign_boringssl",
+        "//cc/subtle:subtle_util_boringssl",
         "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_matchers",
         "//cc/util:test_util",
-        "//proto:aes_eax_cc_proto",
-        "//proto:common_cc_proto",
         "//proto:rsa_ssa_pss_cc_proto",
-        "//proto:tink_cc_proto",
+        "@boringssl//:crypto",
         "@com_google_absl//absl/strings",
         "@com_google_googletest//:gtest_main",
     ],
@@ -549,18 +522,14 @@
     deps = [
         ":ecdsa_sign_key_manager",
         ":ecdsa_verify_key_manager",
-        ":signature_key_templates",
-        "//cc:config",
         "//cc:public_key_sign",
-        "//cc:registry",
-        "//cc/aead:aead_key_templates",
-        "//cc/aead:aes_gcm_key_manager",
+        "//cc:public_key_verify",
+        "//cc/util:enums",
         "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_matchers",
         "//cc/util:test_util",
-        "//proto:aes_eax_cc_proto",
-        "//proto:common_cc_proto",
         "//proto:ecdsa_cc_proto",
-        "//proto:tink_cc_proto",
         "@com_google_googletest//:gtest_main",
     ],
 )
@@ -573,20 +542,17 @@
     deps = [
         ":ed25519_sign_key_manager",
         ":ed25519_verify_key_manager",
-        ":signature_key_templates",
         "//cc:public_key_sign",
         "//cc:registry",
-        "//cc/aead:aead_key_templates",
-        "//cc/aead:aes_gcm_key_manager",
+        "//cc/subtle:ed25519_verify_boringssl",
+        "//cc/util:enums",
         "//cc/util:protobuf_helper",
         "//cc/util:status",
         "//cc/util:statusor",
+        "//cc/util:test_matchers",
         "//cc/util:test_util",
-        "//proto:aes_eax_cc_proto",
-        "//proto:common_cc_proto",
         "//proto:ed25519_cc_proto",
-        "//proto:empty_cc_proto",
-        "//proto:tink_cc_proto",
+        "@com_google_absl//absl/container:flat_hash_set",
         "@com_google_googletest//:gtest_main",
     ],
 )
@@ -599,20 +565,18 @@
     deps = [
         ":rsa_ssa_pkcs1_sign_key_manager",
         ":rsa_ssa_pkcs1_verify_key_manager",
-        ":signature_key_templates",
-        "//cc:config",
         "//cc:public_key_sign",
-        "//cc:registry",
-        "//cc/aead:aead_key_templates",
-        "//cc/aead:aes_gcm_key_manager",
+        "//cc:public_key_verify",
+        "//cc/subtle:rsa_ssa_pkcs1_verify_boringssl",
         "//cc/subtle:subtle_util_boringssl",
         "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_matchers",
         "//cc/util:test_util",
-        "//proto:aes_eax_cc_proto",
-        "//proto:common_cc_proto",
         "//proto:rsa_ssa_pkcs1_cc_proto",
         "//proto:tink_cc_proto",
         "@boringssl//:crypto",
+        "@com_google_absl//absl/container:flat_hash_set",
         "@com_google_googletest//:gtest_main",
     ],
 )
@@ -626,47 +590,17 @@
         ":rsa_ssa_pss_sign_key_manager",
         ":rsa_ssa_pss_verify_key_manager",
         ":signature_key_templates",
-        "//cc:config",
         "//cc:public_key_sign",
         "//cc:registry",
-        "//cc/aead:aead_key_templates",
-        "//cc/aead:aes_gcm_key_manager",
+        "//cc/subtle:rsa_ssa_pss_verify_boringssl",
         "//cc/subtle:subtle_util_boringssl",
         "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_matchers",
         "//cc/util:test_util",
-        "//proto:aes_eax_cc_proto",
-        "//proto:common_cc_proto",
         "//proto:rsa_ssa_pss_cc_proto",
-        "//proto:tink_cc_proto",
         "@boringssl//:crypto",
-        "@com_google_googletest//:gtest_main",
-    ],
-)
-
-cc_test(
-    name = "public_key_sign_catalogue_test",
-    size = "small",
-    srcs = ["public_key_sign_catalogue_test.cc"],
-    copts = ["-Iexternal/gtest/include"],
-    deps = [
-        ":public_key_sign_catalogue",
-        "//cc:catalogue",
-        "//cc/util:status",
-        "//cc/util:statusor",
-        "@com_google_googletest//:gtest_main",
-    ],
-)
-
-cc_test(
-    name = "public_key_verify_catalogue_test",
-    size = "small",
-    srcs = ["public_key_verify_catalogue_test.cc"],
-    copts = ["-Iexternal/gtest/include"],
-    deps = [
-        ":public_key_verify_catalogue",
-        "//cc:catalogue",
-        "//cc/util:status",
-        "//cc/util:statusor",
+        "@com_google_absl//absl/container:flat_hash_set",
         "@com_google_googletest//:gtest_main",
     ],
 )
@@ -677,9 +611,10 @@
     srcs = ["signature_config_test.cc"],
     copts = ["-Iexternal/gtest/include"],
     deps = [
+        ":rsa_ssa_pss_sign_key_manager",
+        ":rsa_ssa_pss_verify_key_manager",
         ":signature_config",
         ":signature_key_templates",
-        "//cc:catalogue",
         "//cc:config",
         "//cc:keyset_handle",
         "//cc:public_key_sign",
@@ -701,6 +636,7 @@
     deps = [
         ":ecdsa_sign_key_manager",
         ":ed25519_sign_key_manager",
+        ":ed25519_verify_key_manager",
         ":rsa_ssa_pkcs1_sign_key_manager",
         ":rsa_ssa_pss_sign_key_manager",
         ":signature_key_templates",
diff --git a/cc/signature/CMakeLists.txt b/cc/signature/CMakeLists.txt
new file mode 100644
index 0000000..38b2753
--- /dev/null
+++ b/cc/signature/CMakeLists.txt
@@ -0,0 +1,564 @@
+tink_module(signature)
+
+tink_cc_library(
+  NAME public_key_verify_wrapper
+  SRCS
+    public_key_verify_wrapper.cc
+    public_key_verify_wrapper.h
+  DEPS
+    tink::core::crypto_format
+    tink::core::primitive_set
+    tink::core::primitive_wrapper
+    tink::core::public_key_verify
+    tink::subtle::subtle_util_boringssl
+    tink::util::status
+    tink::util::statusor
+    tink::proto::tink_cc_proto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME public_key_verify_factory
+  SRCS
+    public_key_verify_factory.cc
+    public_key_verify_factory.h
+  DEPS
+    tink::signature::public_key_verify_wrapper
+    tink::core::key_manager
+    tink::core::keyset_handle
+    tink::core::primitive_set
+    tink::core::public_key_verify
+    tink::core::registry
+    tink::util::status
+    tink::util::statusor
+    absl::base
+)
+
+tink_cc_library(
+  NAME public_key_sign_wrapper
+  SRCS
+    public_key_sign_wrapper.cc
+    public_key_sign_wrapper.h
+  DEPS
+    tink::core::crypto_format
+    tink::core::primitive_set
+    tink::core::primitive_wrapper
+    tink::core::public_key_sign
+    tink::subtle::subtle_util_boringssl
+    tink::util::status
+    tink::util::statusor
+    tink::proto::tink_cc_proto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME public_key_sign_factory
+  SRCS
+    public_key_sign_factory.cc
+    public_key_sign_factory.h
+  DEPS
+    tink::signature::public_key_sign_wrapper
+    tink::core::key_manager
+    tink::core::keyset_handle
+    tink::core::primitive_set
+    tink::core::public_key_sign
+    tink::core::registry
+    tink::util::status
+    tink::util::statusor
+    absl::base
+)
+
+tink_cc_library(
+  NAME signature_key_templates
+  SRCS
+    signature_key_templates.cc
+    signature_key_templates.h
+  DEPS
+    tink::subtle::subtle_util_boringssl
+    tink::util::constants
+    tink::proto::common_cc_proto
+    tink::proto::ecdsa_cc_proto
+    tink::proto::ed25519_cc_proto
+    tink::proto::rsa_ssa_pkcs1_cc_proto
+    tink::proto::rsa_ssa_pss_cc_proto
+    tink::proto::tink_cc_proto
+    crypto
+    absl::memory
+    absl::strings
+)
+
+tink_cc_library(
+  NAME ecdsa_sign_key_manager
+  SRCS
+    ecdsa_sign_key_manager.cc
+    ecdsa_sign_key_manager.h
+  DEPS
+    tink::signature::ecdsa_verify_key_manager
+    tink::core::private_key_type_manager
+    tink::core::public_key_sign
+    tink::subtle::ecdsa_sign_boringssl
+    tink::subtle::subtle_util_boringssl
+    tink::util::constants
+    tink::util::enums
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::proto::ecdsa_cc_proto
+    absl::memory
+    absl::strings
+)
+
+tink_cc_library(
+  NAME ecdsa_verify_key_manager
+  SRCS
+    ecdsa_verify_key_manager.cc
+    ecdsa_verify_key_manager.h
+  DEPS
+    tink::core::key_type_manager
+    tink::core::public_key_verify
+    tink::subtle::ecdsa_verify_boringssl
+    tink::subtle::subtle_util_boringssl
+    tink::util::constants
+    tink::util::enums
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::proto::ecdsa_cc_proto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME ed25519_sign_key_manager
+  SRCS
+    ed25519_sign_key_manager.cc
+    ed25519_sign_key_manager.h
+  DEPS
+    tink::signature::ed25519_verify_key_manager
+    tink::core::private_key_type_manager
+    tink::core::public_key_sign
+    tink::subtle::ed25519_sign_boringssl
+    tink::subtle::subtle_util_boringssl
+    tink::util::constants
+    tink::util::enums
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::util::validation
+    tink::proto::ed25519_cc_proto
+    absl::memory
+    absl::strings
+)
+
+tink_cc_library(
+  NAME ed25519_verify_key_manager
+  SRCS
+    ed25519_verify_key_manager.cc
+    ed25519_verify_key_manager.h
+  DEPS
+    tink::core::key_type_manager
+    tink::core::public_key_verify
+    tink::subtle::ed25519_verify_boringssl
+    tink::subtle::subtle_util_boringssl
+    tink::util::constants
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::util::validation
+    tink::proto::ed25519_cc_proto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME sig_util
+  SRCS
+    sig_util.cc
+    sig_util.h
+  DEPS
+    tink::core::public_key_sign
+    tink::core::public_key_verify
+    tink::util::status
+)
+
+tink_cc_library(
+  NAME rsa_ssa_pkcs1_sign_key_manager
+  SRCS
+    rsa_ssa_pkcs1_sign_key_manager.cc
+    rsa_ssa_pkcs1_sign_key_manager.h
+  DEPS
+    tink::signature::rsa_ssa_pkcs1_verify_key_manager
+    tink::signature::sig_util
+    tink::core::private_key_type_manager
+    tink::core::public_key_sign
+    tink::core::public_key_verify
+    tink::subtle::rsa_ssa_pkcs1_sign_boringssl
+    tink::subtle::subtle_util_boringssl
+    tink::util::constants
+    tink::util::enums
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::util::validation
+    tink::proto::rsa_ssa_pkcs1_cc_proto
+    absl::memory
+    absl::strings
+)
+
+tink_cc_library(
+  NAME rsa_ssa_pkcs1_verify_key_manager
+  SRCS
+    rsa_ssa_pkcs1_verify_key_manager.cc
+    rsa_ssa_pkcs1_verify_key_manager.h
+  DEPS
+    tink::core::key_type_manager
+    tink::core::public_key_verify
+    tink::subtle::rsa_ssa_pkcs1_verify_boringssl
+    tink::subtle::subtle_util_boringssl
+    tink::util::constants
+    tink::util::enums
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::util::validation
+    tink::proto::rsa_ssa_pkcs1_cc_proto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME rsa_ssa_pss_sign_key_manager
+  SRCS
+    rsa_ssa_pss_sign_key_manager.cc
+    rsa_ssa_pss_sign_key_manager.h
+  DEPS
+    tink::signature::rsa_ssa_pss_verify_key_manager
+    tink::signature::sig_util
+    tink::core::key_type_manager
+    tink::core::private_key_type_manager
+    tink::core::public_key_sign
+    tink::subtle::rsa_ssa_pss_sign_boringssl
+    tink::subtle::subtle_util_boringssl
+    tink::util::constants
+    tink::util::enums
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::proto::common_cc_proto
+    tink::proto::rsa_ssa_pss_cc_proto
+    tink::proto::tink_cc_proto
+    absl::memory
+    absl::strings
+)
+
+tink_cc_library(
+  NAME rsa_ssa_pss_verify_key_manager
+  SRCS
+    rsa_ssa_pss_verify_key_manager.cc
+    rsa_ssa_pss_verify_key_manager.h
+  DEPS
+    tink::core::key_manager
+    tink::core::public_key_verify
+    tink::core::public_key_sign
+    tink::subtle::rsa_ssa_pss_verify_boringssl
+    tink::subtle::subtle_util_boringssl
+    tink::util::constants
+    tink::util::enums
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::proto::common_cc_proto
+    tink::proto::rsa_ssa_pss_cc_proto
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_library(
+  NAME signature_config
+  SRCS
+    signature_config.cc
+    signature_config.h
+  DEPS
+    tink::signature::ecdsa_sign_key_manager
+    tink::signature::ed25519_sign_key_manager
+    tink::signature::rsa_ssa_pkcs1_sign_key_manager
+    tink::signature::rsa_ssa_pss_sign_key_manager
+    tink::signature::ecdsa_verify_key_manager
+    tink::signature::ed25519_verify_key_manager
+    tink::signature::rsa_ssa_pkcs1_verify_key_manager
+    tink::signature::rsa_ssa_pss_verify_key_manager
+    tink::signature::public_key_sign_wrapper
+    tink::signature::public_key_verify_wrapper
+    tink::config::config_util
+    tink::core::registry
+    tink::util::status
+    tink::proto::config_cc_proto
+    absl::base
+    absl::memory
+)
+
+# tests
+
+tink_cc_test(
+  NAME public_key_verify_wrapper_test
+  SRCS public_key_verify_wrapper_test.cc
+  DEPS
+    tink::signature::public_key_verify_wrapper
+    tink::core::primitive_set
+    tink::core::public_key_sign
+    tink::core::public_key_verify
+    tink::util::status
+    tink::util::test_matchers
+    tink::util::test_util
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME public_key_verify_factory_test
+  SRCS public_key_verify_factory_test.cc
+  DEPS
+    tink::signature::ecdsa_verify_key_manager
+    tink::signature::public_key_verify_factory
+    tink::signature::signature_config
+    tink::core::config
+    tink::core::keyset_handle
+    tink::core::public_key_verify
+    tink::core::registry
+    tink::util::test_keyset_handle
+    tink::util::status
+    tink::util::test_util
+    tink::proto::ecdsa_cc_proto
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME public_key_sign_wrapper_test
+  SRCS public_key_sign_wrapper_test.cc
+  DEPS
+    tink::signature::public_key_sign_wrapper
+    tink::core::crypto_format
+    tink::core::primitive_set
+    tink::core::public_key_sign
+    tink::core::public_key_verify
+    tink::util::status
+    tink::util::test_matchers
+    tink::util::test_util
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME public_key_sign_factory_test
+  SRCS public_key_sign_factory_test.cc
+  DEPS
+    tink::signature::ecdsa_sign_key_manager
+    tink::signature::public_key_sign_factory
+    tink::signature::signature_config
+    tink::core::config
+    tink::core::keyset_handle
+    tink::core::public_key_sign
+    tink::core::registry
+    tink::util::test_keyset_handle
+    tink::util::status
+    tink::util::test_util
+    tink::proto::ecdsa_cc_proto
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_test(
+  NAME ecdsa_verify_key_manager_test
+  SRCS ecdsa_verify_key_manager_test.cc
+  DEPS
+    tink::signature::ecdsa_sign_key_manager
+    tink::signature::ecdsa_verify_key_manager
+    tink::core::public_key_sign
+    tink::core::public_key_verify
+    tink::subtle::ecdsa_sign_boringssl
+    tink::subtle::subtle_util_boringssl
+    tink::util::enums
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::util::test_util
+    tink::proto::ecdsa_cc_proto
+    gmock
+)
+
+tink_cc_test(
+  NAME ed25519_verify_key_manager_test
+  SRCS ed25519_verify_key_manager_test.cc
+  DEPS
+    tink::signature::ed25519_sign_key_manager
+    tink::signature::ed25519_verify_key_manager
+    tink::core::public_key_sign
+    tink::core::public_key_verify
+    tink::core::registry
+    tink::subtle::ed25519_sign_boringssl
+    tink::util::enums
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::util::test_util
+    tink::proto::ed25519_cc_proto
+    gmock
+)
+
+tink_cc_test(
+  NAME rsa_ssa_pkcs1_verify_key_manager_test
+  SRCS rsa_ssa_pkcs1_verify_key_manager_test.cc
+  DEPS
+    tink::signature::rsa_ssa_pkcs1_sign_key_manager
+    tink::signature::rsa_ssa_pkcs1_verify_key_manager
+    tink::core::public_key_sign
+    tink::core::public_key_verify
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+    tink::util::test_matchers
+    tink::proto::rsa_ssa_pkcs1_cc_proto
+    tink::proto::tink_cc_proto
+    absl::strings
+    crypto
+    gmock
+)
+
+tink_cc_test(
+  NAME rsa_ssa_pss_verify_key_manager_test
+  SRCS rsa_ssa_pss_verify_key_manager_test.cc
+  DEPS
+    tink::signature::rsa_ssa_pss_sign_key_manager
+    tink::signature::rsa_ssa_pss_verify_key_manager
+    tink::core::public_key_sign
+    tink::core::public_key_verify
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+    tink::util::test_matchers
+    tink::proto::rsa_ssa_pss_cc_proto
+    absl::strings
+    crypto
+    gmock
+)
+
+tink_cc_test(
+  NAME ecdsa_sign_key_manager_test
+  SRCS ecdsa_sign_key_manager_test.cc
+  DEPS
+    tink::signature::ecdsa_sign_key_manager
+    tink::signature::ecdsa_verify_key_manager
+    tink::signature::signature_key_templates
+    tink::core::public_key_sign
+    tink::core::public_key_verify
+    tink::subtle::ecdsa_verify_boringssl
+    tink::subtle::subtle_util_boringssl
+    tink::util::enums
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::util::test_util
+    tink::proto::ecdsa_cc_proto
+    gmock
+)
+
+tink_cc_test(
+  NAME ed25519_sign_key_manager_test
+  SRCS ed25519_sign_key_manager_test.cc
+  DEPS
+    tink::signature::ed25519_sign_key_manager
+    tink::signature::ed25519_verify_key_manager
+    tink::core::public_key_sign
+    tink::core::registry
+    tink::subtle::ed25519_verify_boringssl
+    tink::util::enums
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::util::test_util
+    tink::proto::ed25519_cc_proto
+    absl::flat_hash_set
+    gmock
+)
+
+tink_cc_test(
+  NAME rsa_ssa_pkcs1_sign_key_manager_test
+  SRCS rsa_ssa_pkcs1_sign_key_manager_test.cc
+  DEPS
+    tink::signature::rsa_ssa_pkcs1_sign_key_manager
+    tink::signature::rsa_ssa_pkcs1_verify_key_manager
+    tink::core::public_key_sign
+    tink::core::public_key_verify
+    tink::subtle::rsa_ssa_pkcs1_verify_boringssl
+    tink::subtle::subtle_util_boringssl
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::util::test_util
+    tink::proto::rsa_ssa_pkcs1_cc_proto
+    tink::proto::tink_cc_proto
+    crypto
+    gmock
+    absl::flat_hash_set
+)
+
+tink_cc_test(
+  NAME rsa_ssa_pss_sign_key_manager_test
+  SRCS rsa_ssa_pss_sign_key_manager_test.cc
+  DEPS
+    tink::signature::rsa_ssa_pss_sign_key_manager
+    tink::signature::rsa_ssa_pss_verify_key_manager
+    tink::signature::signature_key_templates
+    tink::core::public_key_sign
+    tink::subtle::rsa_ssa_pss_verify_boringssl
+    tink::subtle::subtle_util_boringssl
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::util::test_util
+    tink::proto::rsa_ssa_pss_cc_proto
+    absl::flat_hash_set
+    crypto
+    gmock
+)
+
+tink_cc_test(
+  NAME signature_config_test
+  SRCS signature_config_test.cc
+  DEPS
+    tink::signature::rsa_ssa_pss_sign_key_manager
+    tink::signature::rsa_ssa_pss_verify_key_manager
+    tink::signature::signature_config
+    tink::signature::signature_key_templates
+    tink::core::config
+    tink::core::keyset_handle
+    tink::core::public_key_sign
+    tink::core::public_key_verify
+    tink::core::registry
+    tink::util::status
+    tink::util::test_matchers
+    tink::util::test_util
+    absl::memory
+)
+
+tink_cc_test(
+  NAME signature_key_templates_test
+  SRCS signature_key_templates_test.cc
+  DEPS
+    tink::signature::ecdsa_sign_key_manager
+    tink::signature::ed25519_sign_key_manager
+    tink::signature::rsa_ssa_pkcs1_sign_key_manager
+    tink::signature::rsa_ssa_pss_sign_key_manager
+    tink::signature::signature_key_templates
+    tink::subtle::subtle_util_boringssl
+    tink::proto::common_cc_proto
+    tink::proto::ecdsa_cc_proto
+    tink::proto::ed25519_cc_proto
+    tink::proto::empty_cc_proto
+    tink::proto::rsa_ssa_pkcs1_cc_proto
+    tink::proto::rsa_ssa_pss_cc_proto
+    tink::proto::tink_cc_proto
+    crypto
+)
diff --git a/cc/signature/ecdsa_sign_key_manager.cc b/cc/signature/ecdsa_sign_key_manager.cc
index ee522bb..3449e4e 100644
--- a/cc/signature/ecdsa_sign_key_manager.cc
+++ b/cc/signature/ecdsa_sign_key_manager.cc
@@ -16,11 +16,9 @@
 
 #include "tink/signature/ecdsa_sign_key_manager.h"
 
-#include "absl/strings/string_view.h"
 #include "absl/memory/memory.h"
-#include "tink/core/key_manager_base.h"
+#include "absl/strings/string_view.h"
 #include "tink/public_key_sign.h"
-#include "tink/key_manager.h"
 #include "tink/signature/ecdsa_verify_key_manager.h"
 #include "tink/subtle/ecdsa_sign_boringssl.h"
 #include "tink/subtle/subtle_util_boringssl.h"
@@ -31,47 +29,19 @@
 #include "tink/util/statusor.h"
 #include "tink/util/validation.h"
 #include "proto/ecdsa.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
 
-using google::crypto::tink::EcdsaKeyFormat;
-using google::crypto::tink::EcdsaPrivateKey;
-using google::crypto::tink::EcdsaPublicKey;
-using google::crypto::tink::KeyData;
-using portable_proto::MessageLite;
 using crypto::tink::util::Enums;
 using crypto::tink::util::Status;
 using crypto::tink::util::StatusOr;
+using google::crypto::tink::EcdsaKeyFormat;
+using google::crypto::tink::EcdsaPrivateKey;
+using google::crypto::tink::EcdsaPublicKey;
 
-class EcdsaPrivateKeyFactory
-    : public PrivateKeyFactory,
-      public KeyFactoryBase<EcdsaPrivateKey, EcdsaKeyFormat> {
- public:
-  EcdsaPrivateKeyFactory() {}
-
-  KeyData::KeyMaterialType key_material_type() const override {
-    return KeyData::ASYMMETRIC_PRIVATE;
-  }
-
-  // Returns KeyData proto that contains EcdsaPublicKey
-  // extracted from the given serialized_private_key, which must contain
-  // EcdsaPrivateKey-proto.
-  crypto::tink::util::StatusOr<std::unique_ptr<google::crypto::tink::KeyData>>
-  GetPublicKeyData(absl::string_view serialized_private_key) const override;
-
- protected:
-  StatusOr<std::unique_ptr<EcdsaPrivateKey>> NewKeyFromFormat(
-      const EcdsaKeyFormat& ecdsa_key_format) const override;
-};
-
-StatusOr<std::unique_ptr<EcdsaPrivateKey>>
-EcdsaPrivateKeyFactory::NewKeyFromFormat(
+StatusOr<EcdsaPrivateKey> EcdsaSignKeyManager::CreateKey(
     const EcdsaKeyFormat& ecdsa_key_format) const {
-  Status status = EcdsaVerifyKeyManager::Validate(ecdsa_key_format);
-  if (!status.ok()) return status;
-
   // Generate new EC key.
   auto ec_key_result = subtle::SubtleUtilBoringSSL::GetNewEcKey(
       util::Enums::ProtoToSubtle(ecdsa_key_format.params().curve()));
@@ -79,76 +49,45 @@
   auto ec_key = ec_key_result.ValueOrDie();
 
   // Build EcdsaPrivateKey.
-  std::unique_ptr<EcdsaPrivateKey> ecdsa_private_key(
-      new EcdsaPrivateKey());
-  ecdsa_private_key->set_version(EcdsaSignKeyManager::kVersion);
-  ecdsa_private_key->set_key_value(ec_key.priv);
-  auto ecdsa_public_key = ecdsa_private_key->mutable_public_key();
-  ecdsa_public_key->set_version(EcdsaSignKeyManager::kVersion);
+  EcdsaPrivateKey ecdsa_private_key;
+  ecdsa_private_key.set_version(get_version());
+  ecdsa_private_key.set_key_value(ec_key.priv);
+  auto ecdsa_public_key = ecdsa_private_key.mutable_public_key();
+  ecdsa_public_key->set_version(get_version());
   ecdsa_public_key->set_x(ec_key.pub_x);
   ecdsa_public_key->set_y(ec_key.pub_y);
   *(ecdsa_public_key->mutable_params()) = ecdsa_key_format.params();
-
-  return absl::implicit_cast<StatusOr<std::unique_ptr<EcdsaPrivateKey>>>(
-        std::move(ecdsa_private_key));
-}
-
-StatusOr<std::unique_ptr<KeyData>>
-EcdsaPrivateKeyFactory::GetPublicKeyData(
-    absl::string_view serialized_private_key) const {
-  EcdsaPrivateKey private_key;
-  if (!private_key.ParseFromString(std::string(serialized_private_key))) {
-    return Status(util::error::INVALID_ARGUMENT,
-                  absl::StrCat("Could not parse the passed string as proto '",
-                               EcdsaVerifyKeyManager::static_key_type(), "'."));
-  }
-  auto status = EcdsaSignKeyManager::Validate(private_key);
-  if (!status.ok()) return status;
-  auto key_data = absl::make_unique<KeyData>();
-  key_data->set_type_url(EcdsaVerifyKeyManager::static_key_type());
-  key_data->set_value(private_key.public_key().SerializeAsString());
-  key_data->set_key_material_type(KeyData::ASYMMETRIC_PUBLIC);
-  return std::move(key_data);
-}
-
-constexpr uint32_t EcdsaSignKeyManager::kVersion;
-
-EcdsaSignKeyManager::EcdsaSignKeyManager()
-    : key_factory_(absl::make_unique<EcdsaPrivateKeyFactory>()) {}
-
-const KeyFactory& EcdsaSignKeyManager::get_key_factory() const {
-  return *key_factory_;
-}
-
-uint32_t EcdsaSignKeyManager::get_version() const {
-  return kVersion;
+  return ecdsa_private_key;
 }
 
 StatusOr<std::unique_ptr<PublicKeySign>>
-EcdsaSignKeyManager::GetPrimitiveFromKey(
+EcdsaSignKeyManager::PublicKeySignFactory::Create(
     const EcdsaPrivateKey& ecdsa_private_key) const {
-  Status status = Validate(ecdsa_private_key);
-  if (!status.ok()) return status;
   const EcdsaPublicKey& public_key = ecdsa_private_key.public_key();
   subtle::SubtleUtilBoringSSL::EcKey ec_key;
   ec_key.curve = Enums::ProtoToSubtle(public_key.params().curve());
   ec_key.pub_x = public_key.x();
   ec_key.pub_y = public_key.y();
   ec_key.priv = ecdsa_private_key.key_value();
-  auto ecdsa_result = subtle::EcdsaSignBoringSsl::New(
+  auto result = subtle::EcdsaSignBoringSsl::New(
       ec_key, Enums::ProtoToSubtle(public_key.params().hash_type()),
       Enums::ProtoToSubtle(public_key.params().encoding()));
-  if (!ecdsa_result.ok()) return ecdsa_result.status();
-  std::unique_ptr<PublicKeySign> ecdsa(ecdsa_result.ValueOrDie().release());
-  return std::move(ecdsa);
+  if (!result.ok()) return result.status();
+  return {std::move(result.ValueOrDie())};
 }
 
-// static
-Status EcdsaSignKeyManager::Validate(
-    const EcdsaPrivateKey& key) {
-  Status status = ValidateVersion(key.version(), kVersion);
+Status EcdsaSignKeyManager::ValidateKey(const EcdsaPrivateKey& key) const {
+  Status status = ValidateVersion(key.version(), get_version());
   if (!status.ok()) return status;
-  return EcdsaVerifyKeyManager::Validate(key.public_key().params());
+  return EcdsaVerifyKeyManager().ValidateKey(key.public_key());
+}
+
+Status EcdsaSignKeyManager::ValidateKeyFormat(
+    const EcdsaKeyFormat& key_format) const {
+  if (!key_format.has_params()) {
+    return Status(util::error::INVALID_ARGUMENT, "Missing params.");
+  }
+  return EcdsaVerifyKeyManager().ValidateParams(key_format.params());
 }
 
 }  // namespace tink
diff --git a/cc/signature/ecdsa_sign_key_manager.h b/cc/signature/ecdsa_sign_key_manager.h
index 4287e78..44e94b7 100644
--- a/cc/signature/ecdsa_sign_key_manager.h
+++ b/cc/signature/ecdsa_sign_key_manager.h
@@ -20,48 +20,61 @@
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "tink/core/key_manager_base.h"
-#include "tink/key_manager.h"
+#include "tink/core/private_key_type_manager.h"
 #include "tink/public_key_sign.h"
+#include "tink/util/constants.h"
 #include "tink/util/errors.h"
 #include "tink/util/protobuf_helper.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
 #include "proto/ecdsa.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
 
 class EcdsaSignKeyManager
-    : public KeyManagerBase<PublicKeySign,
-                            google::crypto::tink::EcdsaPrivateKey> {
+    : public PrivateKeyTypeManager<google::crypto::tink::EcdsaPrivateKey,
+                                   google::crypto::tink::EcdsaKeyFormat,
+                                   google::crypto::tink::EcdsaPublicKey,
+                                   List<PublicKeySign>> {
  public:
-  static constexpr uint32_t kVersion = 0;
+  class PublicKeySignFactory : public PrimitiveFactory<PublicKeySign> {
+    crypto::tink::util::StatusOr<std::unique_ptr<PublicKeySign>> Create(
+        const google::crypto::tink::EcdsaPrivateKey& private_key)
+        const override;
+  };
 
-  EcdsaSignKeyManager();
+  EcdsaSignKeyManager()
+      : PrivateKeyTypeManager(absl::make_unique<PublicKeySignFactory>()) {}
 
-  // Returns the version of this key manager.
-  uint32_t get_version() const override;
+  uint32_t get_version() const override { return 0; }
 
-  // Returns a factory that generates keys of the key type
-  // handled by this manager.
-  const KeyFactory& get_key_factory() const override;
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::ASYMMETRIC_PRIVATE;
+  }
 
-  virtual ~EcdsaSignKeyManager() {}
+  const std::string& get_key_type() const override { return key_type_; }
 
- protected:
-  crypto::tink::util::StatusOr<std::unique_ptr<PublicKeySign>>
-  GetPrimitiveFromKey(const google::crypto::tink::EcdsaPrivateKey&
-                          ecdsa_private_key) const override;
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::EcdsaPrivateKey& key) const override;
+
+  crypto::tink::util::Status ValidateKeyFormat(
+      const google::crypto::tink::EcdsaKeyFormat& key_format) const override;
+
+  crypto::tink::util::StatusOr<google::crypto::tink::EcdsaPrivateKey> CreateKey(
+      const google::crypto::tink::EcdsaKeyFormat& key_format) const override;
+
+  crypto::tink::util::StatusOr<google::crypto::tink::EcdsaPublicKey>
+  GetPublicKey(
+      const google::crypto::tink::EcdsaPrivateKey& private_key) const override {
+    return private_key.public_key();
+  }
 
  private:
-  friend class EcdsaPrivateKeyFactory;
-
-  std::unique_ptr<KeyFactory> key_factory_;
-
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::EcdsaPrivateKey& key);
+  const std::string key_type_ =
+      absl::StrCat(kTypeGoogleapisCom,
+                   google::crypto::tink::EcdsaPrivateKey().GetTypeName());
 };
 
 }  // namespace tink
diff --git a/cc/signature/ecdsa_sign_key_manager_test.cc b/cc/signature/ecdsa_sign_key_manager_test.cc
index ffe8236..301d4bb 100644
--- a/cc/signature/ecdsa_sign_key_manager_test.cc
+++ b/cc/signature/ecdsa_sign_key_manager_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2017 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,355 +16,248 @@
 
 #include "tink/signature/ecdsa_sign_key_manager.h"
 
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
 #include "tink/public_key_sign.h"
-#include "tink/registry.h"
-#include "tink/aead/aead_key_templates.h"
-#include "tink/aead/aes_gcm_key_manager.h"
-#include "tink/signature/signature_key_templates.h"
+#include "tink/public_key_verify.h"
 #include "tink/signature/ecdsa_verify_key_manager.h"
+#include "tink/subtle/ecdsa_verify_boringssl.h"
+#include "tink/subtle/subtle_util_boringssl.h"
+#include "tink/util/enums.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
-#include "gtest/gtest.h"
-#include "proto/common.pb.h"
 #include "proto/ecdsa.pb.h"
-#include "proto/aes_eax.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
 
-using google::crypto::tink::AesEaxKey;
-using google::crypto::tink::AesEaxKeyFormat;
-using google::crypto::tink::EcdsaKeyFormat;
-using google::crypto::tink::EcdsaPrivateKey;
-using google::crypto::tink::EcdsaSignatureEncoding;
-using google::crypto::tink::EllipticCurveType;
-using google::crypto::tink::HashType;
-using google::crypto::tink::KeyData;
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
+using ::crypto::tink::util::Enums;
+using ::crypto::tink::util::StatusOr;
+using ::google::crypto::tink::EcdsaKeyFormat;
+using ::google::crypto::tink::EcdsaParams;
+using ::google::crypto::tink::EcdsaPrivateKey;
+using ::google::crypto::tink::EcdsaPublicKey;
+using ::google::crypto::tink::EcdsaSignatureEncoding;
+using ::google::crypto::tink::EllipticCurveType;
+using ::google::crypto::tink::HashType;
+using ::google::crypto::tink::KeyData;
+using ::testing::Eq;
+using ::testing::Gt;
+using ::testing::HasSubstr;
+using ::testing::Not;
+using ::testing::SizeIs;
 
 namespace {
 
-class EcdsaSignKeyManagerTest : public ::testing::Test {
- protected:
-  std::string key_type_prefix_ = "type.googleapis.com/";
-  std::string ecdsa_sign_key_type_ =
-      "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey";
-};
-
-// Checks whether given key is compatible with the given format.
-void CheckNewKey(const EcdsaPrivateKey& ecdsa_key,
-                 const EcdsaKeyFormat& key_format) {
-  EcdsaSignKeyManager key_manager;
-  EXPECT_EQ(0, ecdsa_key.version());
-  EXPECT_TRUE(ecdsa_key.has_public_key());
-  EXPECT_GT(ecdsa_key.key_value().length(), 0);
-  EXPECT_EQ(0, ecdsa_key.public_key().version());
-  EXPECT_GT(ecdsa_key.public_key().x().length(), 0);
-  EXPECT_GT(ecdsa_key.public_key().y().length(), 0);
-  EXPECT_EQ(ecdsa_key.public_key().params().SerializeAsString(),
-            key_format.params().SerializeAsString());
-  auto primitive_result = key_manager.GetPrimitive(ecdsa_key);
-  EXPECT_TRUE(primitive_result.ok()) << primitive_result.status();
+TEST(EcdsaSignKeyManagerTest, Basic) {
+  EXPECT_THAT(EcdsaSignKeyManager().get_version(), Eq(0));
+  EXPECT_THAT(EcdsaSignKeyManager().key_material_type(),
+              Eq(KeyData::ASYMMETRIC_PRIVATE));
+  EXPECT_THAT(EcdsaSignKeyManager().get_key_type(),
+              Eq("type.googleapis.com/google.crypto.tink.EcdsaPrivateKey"));
 }
 
-TEST_F(EcdsaSignKeyManagerTest, testBasic) {
-  EcdsaSignKeyManager key_manager;
-
-  EXPECT_EQ(0, key_manager.get_version());
-  EXPECT_EQ("type.googleapis.com/google.crypto.tink.EcdsaPrivateKey",
-            key_manager.get_key_type());
-  EXPECT_TRUE(key_manager.DoesSupport(key_manager.get_key_type()));
+TEST(EcdsaSignKeyManagerTest, ValidateEmptyKeyFormat) {
+  EXPECT_THAT(EcdsaSignKeyManager().ValidateKeyFormat(EcdsaKeyFormat()),
+              Not(IsOk()));
 }
 
-TEST_F(EcdsaSignKeyManagerTest, testKeyDataErrors) {
-  EcdsaSignKeyManager key_manager;
-
-  {  // Bad key type.
-    KeyData key_data;
-    std::string bad_key_type =
-        "type.googleapis.com/google.crypto.tink.SomeOtherKey";
-    key_data.set_type_url(bad_key_type);
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, bad_key_type,
-                        result.status().error_message());
-  }
-
-  {  // Bad key value.
-    KeyData key_data;
-    key_data.set_type_url(ecdsa_sign_key_type_);
-    key_data.set_value("some bad serialized proto");
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
-
-  {  // Bad version.
-    KeyData key_data;
-    EcdsaPrivateKey key;
-    key.set_version(1);
-    key_data.set_type_url(ecdsa_sign_key_type_);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "version",
-                        result.status().error_message());
-  }
-}
-
-TEST_F(EcdsaSignKeyManagerTest, testKeyMessageErrors) {
-  EcdsaSignKeyManager key_manager;
-
-  {  // Bad protobuffer.
-    AesEaxKey key;
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "AesEaxKey",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-  }
-
-  {  // Bad elliptic curve.
-    EcdsaPrivateKey key;
-    auto public_key = key.mutable_public_key();
-    public_key->mutable_params()->set_encoding(EcdsaSignatureEncoding::DER);
-    public_key->mutable_params()->set_curve(EllipticCurveType::UNKNOWN_CURVE);
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "Unsupported elliptic curve",
-                        result.status().error_message());
-  }
-
-  {  // Bad hash type for NIST P256.
-    EcdsaPrivateKey key;
-    auto public_key = key.mutable_public_key();
-    public_key->mutable_params()->set_encoding(EcdsaSignatureEncoding::DER);
-    public_key->mutable_params()->set_curve(EllipticCurveType::NIST_P256);
-    public_key->mutable_params()->set_hash_type(HashType::SHA512);
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "Only SHA256",
-                        result.status().error_message());
-  }
-
-  {  // Bad hash type for NIST P384.
-    EcdsaPrivateKey key;
-    auto public_key = key.mutable_public_key();
-    public_key->mutable_params()->set_encoding(EcdsaSignatureEncoding::DER);
-    public_key->mutable_params()->set_curve(EllipticCurveType::NIST_P384);
-    public_key->mutable_params()->set_hash_type(HashType::SHA256);
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "Only SHA512",
-                        result.status().error_message());
-  }
-
-  {  // Bad hash type for NIST P521.
-    EcdsaPrivateKey key;
-    auto public_key = key.mutable_public_key();
-    public_key->mutable_params()->set_encoding(EcdsaSignatureEncoding::DER);
-    public_key->mutable_params()->set_curve(EllipticCurveType::NIST_P384);
-    public_key->mutable_params()->set_hash_type(HashType::SHA256);
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "Only SHA512",
-                        result.status().error_message());
-  }
-}
-
-TEST_F(EcdsaSignKeyManagerTest, testPrimitives) {
-  EcdsaSignatureEncoding encodings[2] = {EcdsaSignatureEncoding::DER,
-                                         EcdsaSignatureEncoding::IEEE_P1363};
-  for (EcdsaSignatureEncoding encoding : encodings) {
-    std::string message = "some message to sign";
-    EcdsaSignKeyManager sign_key_manager;
-    EcdsaPrivateKey key = test::GetEcdsaTestPrivateKey(
-        EllipticCurveType::NIST_P256, HashType::SHA256, encoding);
-
-    {  // Using Key proto.
-      auto result = sign_key_manager.GetPrimitive(key);
-      EXPECT_TRUE(result.ok()) << result.status();
-      auto sign = std::move(result.ValueOrDie());
-      auto signing_result = sign->Sign(message);
-      EXPECT_TRUE(signing_result.ok()) << signing_result.status();
-    }
-
-    {  // Using KeyData proto.
-      KeyData key_data;
-      key_data.set_type_url(ecdsa_sign_key_type_);
-      key_data.set_value(key.SerializeAsString());
-      auto result = sign_key_manager.GetPrimitive(key_data);
-      EXPECT_TRUE(result.ok()) << result.status();
-      auto sign = std::move(result.ValueOrDie());
-      auto signing_result = sign->Sign(message);
-      EXPECT_TRUE(signing_result.ok()) << signing_result.status();
-    }
-  }
-}
-
-TEST_F(EcdsaSignKeyManagerTest, testNewKeyCreation) {
-  EcdsaSignKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-
-  { // Via NewKey(format_proto).
-    EcdsaKeyFormat key_format;
-    ASSERT_TRUE(key_format.ParseFromString(
-        SignatureKeyTemplates::EcdsaP256().value()));
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key = std::move(result.ValueOrDie());
-    ASSERT_EQ(ecdsa_sign_key_type_, key_type_prefix_ + key->GetTypeName());
-    std::unique_ptr<EcdsaPrivateKey> ecdsa_key(
-        static_cast<EcdsaPrivateKey*>(key.release()));
-    CheckNewKey(*ecdsa_key, key_format);
-  }
-
-  { // Via NewKey(serialized_format_proto).
-    EcdsaKeyFormat key_format;
-    ASSERT_TRUE(key_format.ParseFromString(
-        SignatureKeyTemplates::EcdsaP384().value()));
-    auto result = key_factory.NewKey(key_format.SerializeAsString());
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key = std::move(result.ValueOrDie());
-    ASSERT_EQ(ecdsa_sign_key_type_, key_type_prefix_ + key->GetTypeName());
-    std::unique_ptr<EcdsaPrivateKey> ecdsa_key(
-        static_cast<EcdsaPrivateKey*>(key.release()));
-    CheckNewKey(*ecdsa_key, key_format);
-  }
-
-  { // Via NewKeyData(serialized_format_proto).
-    EcdsaKeyFormat key_format;
-    ASSERT_TRUE(key_format.ParseFromString(
-        SignatureKeyTemplates::EcdsaP521().value()));
-    auto result = key_factory.NewKeyData(key_format.SerializeAsString());
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto key_data = std::move(result.ValueOrDie());
-    EXPECT_EQ(ecdsa_sign_key_type_, key_data->type_url());
-    EXPECT_EQ(KeyData::ASYMMETRIC_PRIVATE, key_data->key_material_type());
-    EcdsaPrivateKey ecdsa_key;
-    ASSERT_TRUE(ecdsa_key.ParseFromString(key_data->value()));
-    CheckNewKey(ecdsa_key, key_format);
-  }
-}
-
-TEST_F(EcdsaSignKeyManagerTest, testPublicKeyExtraction) {
-  EcdsaSignKeyManager key_manager;
-  auto private_key_factory = dynamic_cast<const PrivateKeyFactory*>(
-      &(key_manager.get_key_factory()));
-  ASSERT_NE(private_key_factory, nullptr);
-
-  auto new_key_result = private_key_factory->NewKey(
-      SignatureKeyTemplates::EcdsaP256().value());
-  std::unique_ptr<EcdsaPrivateKey> new_key(
-      reinterpret_cast<EcdsaPrivateKey*>(
-          new_key_result.ValueOrDie().release()));
-  auto public_key_data_result = private_key_factory->GetPublicKeyData(
-      new_key->SerializeAsString());
-  EXPECT_TRUE(public_key_data_result.ok()) << public_key_data_result.status();
-  auto public_key_data = std::move(public_key_data_result.ValueOrDie());
-  EXPECT_EQ(EcdsaVerifyKeyManager::static_key_type(),
-            public_key_data->type_url());
-  EXPECT_EQ(KeyData::ASYMMETRIC_PUBLIC, public_key_data->key_material_type());
-  EXPECT_EQ(new_key->public_key().SerializeAsString(),
-            public_key_data->value());
-}
-
-TEST_F(EcdsaSignKeyManagerTest, testPublicKeyExtractionErrors) {
-  EcdsaSignKeyManager key_manager;
-  auto private_key_factory = dynamic_cast<const PrivateKeyFactory*>(
-      &(key_manager.get_key_factory()));
-  ASSERT_NE(private_key_factory, nullptr);
-
-  AesGcmKeyManager aead_key_manager;
-  auto aead_private_key_factory = dynamic_cast<const PrivateKeyFactory*>(
-      &(aead_key_manager.get_key_factory()));
-  ASSERT_EQ(nullptr, aead_private_key_factory);
-
-  auto aead_key_result = aead_key_manager.get_key_factory().NewKey(
-      AeadKeyTemplates::Aes128Gcm().value());
-  ASSERT_TRUE(aead_key_result.ok()) << aead_key_result.status();
-  auto aead_key = std::move(aead_key_result.ValueOrDie());
-  auto public_key_data_result = private_key_factory->GetPublicKeyData(
-      aead_key->SerializeAsString());
-  EXPECT_FALSE(public_key_data_result.ok());
-  EXPECT_EQ(util::error::INVALID_ARGUMENT,
-            public_key_data_result.status().error_code());
-}
-
-TEST_F(EcdsaSignKeyManagerTest, testNewKeyErrors) {
-  EcdsaSignKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-
-  // Empty key format.
+EcdsaKeyFormat CreateValidKeyFormat() {
   EcdsaKeyFormat key_format;
-  {
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "Missing params",
-                        result.status().error_message());
-  }
-
-  // Wrong encoding.
-  auto params = key_format.mutable_params();
-  {
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "Unsupported signature encoding",
-                        result.status().error_message());
-  }
-  // Wrong curve
+  EcdsaParams* params = key_format.mutable_params();
+  params->set_hash_type(HashType::SHA256);
+  params->set_curve(EllipticCurveType::NIST_P256);
   params->set_encoding(EcdsaSignatureEncoding::DER);
-  {
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "Unsupported elliptic curve",
-                        result.status().error_message());
-  }
+  return key_format;
+}
 
-  // Wrong hash for the curve.
+TEST(EcdsaSignKeyManagerTest, ValidateKeyFormat) {
+  EcdsaKeyFormat format = CreateValidKeyFormat();
+  EXPECT_THAT(EcdsaSignKeyManager().ValidateKeyFormat(format), IsOk());
+}
+
+TEST(EcdsaSignKeyManagerTest, ValidateKeyFormatUnknownCurve) {
+  EcdsaKeyFormat format = CreateValidKeyFormat();
+  EcdsaParams* params = format.mutable_params();
+  params->set_curve(EllipticCurveType::UNKNOWN_CURVE);
+  EXPECT_THAT(EcdsaSignKeyManager().ValidateKeyFormat(format), Not(IsOk()));
+}
+
+TEST(EcdsaSignKeyManagerTest, ValidateKeyFormatBadHashP256) {
+  EcdsaKeyFormat format = CreateValidKeyFormat();
+  EcdsaParams* params = format.mutable_params();
+  params->set_curve(EllipticCurveType::NIST_P256);
+  params->set_hash_type(HashType::SHA512);
+  EXPECT_THAT(EcdsaSignKeyManager().ValidateKeyFormat(format), Not(IsOk()));
+  EXPECT_THAT(
+      EcdsaSignKeyManager().ValidateKeyFormat(format),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("Only SHA256")));
+}
+
+TEST(EcdsaSignKeyManagerTest, ValidateKeyFormatBadHashP384) {
+  EcdsaKeyFormat format = CreateValidKeyFormat();
+  EcdsaParams* params = format.mutable_params();
+  params->set_curve(EllipticCurveType::NIST_P384);
+  params->set_hash_type(HashType::SHA256);
+  EXPECT_THAT(EcdsaSignKeyManager().ValidateKeyFormat(format), Not(IsOk()));
+  EXPECT_THAT(
+      EcdsaSignKeyManager().ValidateKeyFormat(format),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("Only SHA512")));
+}
+
+TEST(EcdsaSignKeyManagerTest, ValidateKeyFormatBadHashP521) {
+  EcdsaKeyFormat format = CreateValidKeyFormat();
+  EcdsaParams* params = format.mutable_params();
   params->set_curve(EllipticCurveType::NIST_P521);
-  {
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "Only SHA512",
-                        result.status().error_message());
-  }
+  params->set_hash_type(HashType::SHA256);
+  EXPECT_THAT(EcdsaSignKeyManager().ValidateKeyFormat(format), Not(IsOk()));
+  EXPECT_THAT(
+      EcdsaSignKeyManager().ValidateKeyFormat(format),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("Only SHA512")));
+}
 
-  // Bad serialized format.
-  {
-    auto result = key_factory.NewKey("some bad serialization");
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "Could not parse",
-                        result.status().error_message());
-  }
+TEST(EcdsaSignKeyManagerTest, CreateKey) {
+  EcdsaKeyFormat format = CreateValidKeyFormat();
+  StatusOr<EcdsaPrivateKey> key_or = EcdsaSignKeyManager().CreateKey(format);
+  ASSERT_THAT(key_or.status(), IsOk());
+  EcdsaPrivateKey key = key_or.ValueOrDie();
 
-  // Wrong format proto.
-  {
-    AesEaxKeyFormat wrong_key_format;
-    auto result = key_factory.NewKey(wrong_key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "is not supported",
-                        result.status().error_message());
-  }
+  EXPECT_THAT(key.version(), Eq(0));
+
+  EXPECT_THAT(key.public_key().version(), Eq(key.version()));
+  EXPECT_THAT(key.public_key().params().hash_type(),
+              Eq(format.params().hash_type()));
+  EXPECT_THAT(key.public_key().params().curve(), Eq(format.params().curve()));
+  EXPECT_THAT(key.public_key().params().encoding(),
+              Eq(format.params().encoding()));
+
+  EXPECT_THAT(key.public_key().x(), SizeIs(Gt(0)));
+  EXPECT_THAT(key.public_key().y(), SizeIs(Gt(0)));
+
+  EXPECT_THAT(key.key_value(), SizeIs(Gt(0)));
+}
+
+TEST(EcdsaSignKeyManagerTest, CreateKeyValid) {
+  EcdsaKeyFormat format = CreateValidKeyFormat();
+  StatusOr<EcdsaPrivateKey> key_or = EcdsaSignKeyManager().CreateKey(format);
+  ASSERT_THAT(key_or.status(), IsOk());
+  EXPECT_THAT(EcdsaSignKeyManager().ValidateKey(key_or.ValueOrDie()), IsOk());
+}
+
+EcdsaPrivateKey CreateValidKey() {
+  EcdsaKeyFormat format = CreateValidKeyFormat();
+  return EcdsaSignKeyManager().CreateKey(format).ValueOrDie();
+}
+
+TEST(EcdsaSignKeyManagerTest, ValidateKey) {
+  EcdsaPrivateKey key = CreateValidKey();
+  EXPECT_THAT(EcdsaSignKeyManager().ValidateKey(key), IsOk());
+}
+
+TEST(EcdsaSignKeyManagerTest, ValidateKeyBadHashP256) {
+  EcdsaPrivateKey key = CreateValidKey();
+  EcdsaParams* params = key.mutable_public_key()->mutable_params();
+  params->set_curve(EllipticCurveType::NIST_P256);
+  params->set_hash_type(HashType::SHA512);
+  EXPECT_THAT(EcdsaSignKeyManager().ValidateKey(key), Not(IsOk()));
+  EXPECT_THAT(
+      EcdsaSignKeyManager().ValidateKey(key),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("Only SHA256")));
+}
+
+TEST(EcdsaSignKeyManagerTest, ValidateKeyBadHashP384) {
+  EcdsaPrivateKey key = CreateValidKey();
+  EcdsaParams* params = key.mutable_public_key()->mutable_params();
+  params->set_curve(EllipticCurveType::NIST_P384);
+  params->set_hash_type(HashType::SHA256);
+  EXPECT_THAT(EcdsaSignKeyManager().ValidateKey(key), Not(IsOk()));
+  EXPECT_THAT(
+      EcdsaSignKeyManager().ValidateKey(key),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("Only SHA512")));
+}
+
+TEST(EcdsaSignKeyManagerTest, ValidateKeyBadHashP521) {
+  EcdsaPrivateKey key = CreateValidKey();
+  EcdsaParams* params = key.mutable_public_key()->mutable_params();
+  params->set_curve(EllipticCurveType::NIST_P521);
+  params->set_hash_type(HashType::SHA256);
+  EXPECT_THAT(EcdsaSignKeyManager().ValidateKey(key), Not(IsOk()));
+  EXPECT_THAT(
+      EcdsaSignKeyManager().ValidateKey(key),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("Only SHA512")));
+}
+
+TEST(EcdsaSignKeyManagerTest, GetPublicKey) {
+  EcdsaPrivateKey key = CreateValidKey();
+  StatusOr<EcdsaPublicKey> public_key_or =
+      EcdsaSignKeyManager().GetPublicKey(key);
+
+  ASSERT_THAT(public_key_or.status(), IsOk());
+  EcdsaPublicKey public_key = public_key_or.ValueOrDie();
+
+  EXPECT_THAT(public_key.version(), Eq(key.public_key().version()));
+  EXPECT_THAT(public_key.params().hash_type(),
+              Eq(key.public_key().params().hash_type()));
+  EXPECT_THAT(public_key.params().curve(),
+              Eq(key.public_key().params().curve()));
+  EXPECT_THAT(public_key.params().encoding(),
+              Eq(key.public_key().params().encoding()));
+
+  EXPECT_THAT(public_key.x(), Eq(key.public_key().x()));
+  EXPECT_THAT(public_key.y(), Eq(key.public_key().y()));
+}
+
+TEST(EcdsaSignKeyManagerTest, Create) {
+  EcdsaPrivateKey private_key = CreateValidKey();
+  EcdsaPublicKey public_key =
+      EcdsaSignKeyManager().GetPublicKey(private_key).ValueOrDie();
+
+  auto signer_or =
+      EcdsaSignKeyManager().GetPrimitive<PublicKeySign>(private_key);
+  ASSERT_THAT(signer_or.status(), IsOk());
+
+  subtle::SubtleUtilBoringSSL::EcKey ec_key;
+  ec_key.curve = Enums::ProtoToSubtle(public_key.params().curve());
+  ec_key.pub_x = public_key.x();
+  ec_key.pub_y = public_key.y();
+  auto direct_verifier_or = subtle::EcdsaVerifyBoringSsl::New(
+      ec_key, Enums::ProtoToSubtle(public_key.params().hash_type()),
+      Enums::ProtoToSubtle(public_key.params().encoding()));
+  ASSERT_THAT(direct_verifier_or.status(), IsOk());
+
+  std::string message = "Some message";
+  EXPECT_THAT(direct_verifier_or.ValueOrDie()->Verify(
+                  signer_or.ValueOrDie()->Sign(message).ValueOrDie(), message),
+              IsOk());
+}
+
+TEST(EcdsaSignKeyManagerTest, CreateDifferentKey) {
+  EcdsaPrivateKey private_key = CreateValidKey();
+  // Note: we create a new key in the next line.
+  EcdsaPublicKey public_key =
+      EcdsaSignKeyManager().GetPublicKey(CreateValidKey()).ValueOrDie();
+
+  auto signer_or =
+      EcdsaSignKeyManager().GetPrimitive<PublicKeySign>(private_key);
+  ASSERT_THAT(signer_or.status(), IsOk());
+
+  subtle::SubtleUtilBoringSSL::EcKey ec_key;
+  ec_key.curve = Enums::ProtoToSubtle(public_key.params().curve());
+  ec_key.pub_x = public_key.x();
+  ec_key.pub_y = public_key.y();
+  auto direct_verifier_or = subtle::EcdsaVerifyBoringSsl::New(
+      ec_key, Enums::ProtoToSubtle(public_key.params().hash_type()),
+      Enums::ProtoToSubtle(public_key.params().encoding()));
+  ASSERT_THAT(direct_verifier_or.status(), IsOk());
+
+  std::string message = "Some message";
+  EXPECT_THAT(direct_verifier_or.ValueOrDie()->Verify(
+                  signer_or.ValueOrDie()->Sign(message).ValueOrDie(), message),
+              Not(IsOk()));
 }
 
 }  // namespace
diff --git a/cc/signature/ecdsa_verify_key_manager.cc b/cc/signature/ecdsa_verify_key_manager.cc
index c74f9ae..78ab0d9 100644
--- a/cc/signature/ecdsa_verify_key_manager.cc
+++ b/cc/signature/ecdsa_verify_key_manager.cc
@@ -17,7 +17,6 @@
 #include "tink/signature/ecdsa_verify_key_manager.h"
 
 #include "absl/strings/string_view.h"
-#include "tink/key_manager.h"
 #include "tink/public_key_verify.h"
 #include "tink/subtle/ecdsa_verify_boringssl.h"
 #include "tink/subtle/subtle_util_boringssl.h"
@@ -28,7 +27,6 @@
 #include "tink/util/statusor.h"
 #include "tink/util/validation.h"
 #include "proto/ecdsa.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
@@ -36,48 +34,27 @@
 using crypto::tink::util::Enums;
 using crypto::tink::util::Status;
 using crypto::tink::util::StatusOr;
-using google::crypto::tink::EcdsaKeyFormat;
 using google::crypto::tink::EcdsaParams;
 using google::crypto::tink::EcdsaPublicKey;
 using google::crypto::tink::EcdsaSignatureEncoding;
 using google::crypto::tink::EllipticCurveType;
 using google::crypto::tink::HashType;
-using google::crypto::tink::KeyData;
-using portable_proto::MessageLite;
-
-constexpr uint32_t EcdsaVerifyKeyManager::kVersion;
-
-EcdsaVerifyKeyManager::EcdsaVerifyKeyManager()
-    : key_factory_(KeyFactory::AlwaysFailingFactory(
-          util::Status(util::error::UNIMPLEMENTED,
-                       "Operation not supported for public keys, "
-                       "please use the EcdsaSignKeyManager."))) {}
-
-const KeyFactory& EcdsaVerifyKeyManager::get_key_factory() const {
-  return *key_factory_;
-}
-
-uint32_t EcdsaVerifyKeyManager::get_version() const { return kVersion; }
 
 StatusOr<std::unique_ptr<PublicKeyVerify>>
-EcdsaVerifyKeyManager::GetPrimitiveFromKey(
+EcdsaVerifyKeyManager::PublicKeyVerifyFactory::Create(
     const EcdsaPublicKey& ecdsa_public_key) const {
-  Status status = Validate(ecdsa_public_key);
-  if (!status.ok()) return status;
   subtle::SubtleUtilBoringSSL::EcKey ec_key;
   ec_key.curve = Enums::ProtoToSubtle(ecdsa_public_key.params().curve());
   ec_key.pub_x = ecdsa_public_key.x();
   ec_key.pub_y = ecdsa_public_key.y();
-  auto ecdsa_result = subtle::EcdsaVerifyBoringSsl::New(
+  auto result = subtle::EcdsaVerifyBoringSsl::New(
       ec_key, Enums::ProtoToSubtle(ecdsa_public_key.params().hash_type()),
       Enums::ProtoToSubtle(ecdsa_public_key.params().encoding()));
-  if (!ecdsa_result.ok()) return ecdsa_result.status();
-  std::unique_ptr<PublicKeyVerify> ecdsa(ecdsa_result.ValueOrDie().release());
-  return std::move(ecdsa);
+  if (!result.ok()) return result.status();
+  return {std::move(result.ValueOrDie())};
 }
 
-// static
-Status EcdsaVerifyKeyManager::Validate(const EcdsaParams& params) {
+Status EcdsaVerifyKeyManager::ValidateParams(const EcdsaParams& params) const {
   switch (params.encoding()) {
     case EcdsaSignatureEncoding::DER:  // fall through
     case EcdsaSignatureEncoding::IEEE_P1363:
@@ -110,19 +87,10 @@
   return Status::OK;
 }
 
-// static
-Status EcdsaVerifyKeyManager::Validate(const EcdsaPublicKey& key) {
-  Status status = ValidateVersion(key.version(), kVersion);
+Status EcdsaVerifyKeyManager::ValidateKey(const EcdsaPublicKey& key) const {
+  Status status = ValidateVersion(key.version(), get_version());
   if (!status.ok()) return status;
-  return Validate(key.params());
-}
-
-// static
-Status EcdsaVerifyKeyManager::Validate(const EcdsaKeyFormat& key_format) {
-  if (!key_format.has_params()) {
-    return Status(util::error::INVALID_ARGUMENT, "Missing params.");
-  }
-  return Validate(key_format.params());
+  return ValidateParams(key.params());
 }
 
 }  // namespace tink
diff --git a/cc/signature/ecdsa_verify_key_manager.h b/cc/signature/ecdsa_verify_key_manager.h
index e35fc7c..c7cbd0f 100644
--- a/cc/signature/ecdsa_verify_key_manager.h
+++ b/cc/signature/ecdsa_verify_key_manager.h
@@ -20,54 +20,49 @@
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "tink/core/key_manager_base.h"
-#include "tink/key_manager.h"
+#include "tink/core/key_type_manager.h"
 #include "tink/public_key_verify.h"
+#include "tink/util/constants.h"
 #include "tink/util/errors.h"
 #include "tink/util/protobuf_helper.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
 #include "proto/ecdsa.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
 
 class EcdsaVerifyKeyManager
-    : public KeyManagerBase<PublicKeyVerify,
-                            google::crypto::tink::EcdsaPublicKey> {
+    : public KeyTypeManager<google::crypto::tink::EcdsaPublicKey, void,
+                            List<PublicKeyVerify>> {
  public:
-  static constexpr uint32_t kVersion = 0;
+  class PublicKeyVerifyFactory : public PrimitiveFactory<PublicKeyVerify> {
+    crypto::tink::util::StatusOr<std::unique_ptr<PublicKeyVerify>> Create(
+        const google::crypto::tink::EcdsaPublicKey& ecdsa_public_key)
+        const override;
+  };
 
-  EcdsaVerifyKeyManager();
+  EcdsaVerifyKeyManager()
+      : KeyTypeManager(absl::make_unique<PublicKeyVerifyFactory>()) {}
 
-  // Returns the version of this key manager.
-  uint32_t get_version() const override;
+  uint32_t get_version() const override { return 0; }
 
-  // Returns a factory that generates keys of the key type
-  // handled by this manager.
-  const KeyFactory& get_key_factory() const override;
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::ASYMMETRIC_PUBLIC;
+  }
 
-  virtual ~EcdsaVerifyKeyManager() {}
+  const std::string& get_key_type() const override { return key_type_; }
 
- protected:
-  crypto::tink::util::StatusOr<std::unique_ptr<PublicKeyVerify>>
-  GetPrimitiveFromKey(const google::crypto::tink::EcdsaPublicKey&
-                          ecdsa_public_key) const override;
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::EcdsaPublicKey& key) const override;
+
+  crypto::tink::util::Status ValidateParams(
+      const google::crypto::tink::EcdsaParams& params) const;
 
  private:
-  // Friends that re-use proto validation helpers.
-  friend class EcdsaPrivateKeyFactory;
-  friend class EcdsaSignKeyManager;
-
-  std::unique_ptr<KeyFactory> key_factory_;
-
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::EcdsaParams& params);
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::EcdsaPublicKey& key);
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::EcdsaKeyFormat& key_format);
+  const std::string key_type_ = absl::StrCat(
+      kTypeGoogleapisCom, google::crypto::tink::EcdsaPublicKey().GetTypeName());
 };
 
 }  // namespace tink
diff --git a/cc/signature/ecdsa_verify_key_manager_test.cc b/cc/signature/ecdsa_verify_key_manager_test.cc
index 38e6598..5fa27e6 100644
--- a/cc/signature/ecdsa_verify_key_manager_test.cc
+++ b/cc/signature/ecdsa_verify_key_manager_test.cc
@@ -16,236 +16,201 @@
 
 #include "tink/signature/ecdsa_verify_key_manager.h"
 
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
 #include "tink/public_key_sign.h"
 #include "tink/public_key_verify.h"
-#include "tink/registry.h"
 #include "tink/signature/ecdsa_sign_key_manager.h"
+#include "tink/subtle/ecdsa_sign_boringssl.h"
+#include "tink/subtle/subtle_util_boringssl.h"
+#include "tink/util/enums.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
-#include "gtest/gtest.h"
-#include "proto/common.pb.h"
 #include "proto/ecdsa.pb.h"
-#include "proto/aes_eax.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
 
-using google::crypto::tink::AesEaxKey;
-using google::crypto::tink::EcdsaKeyFormat;
-using google::crypto::tink::EcdsaPrivateKey;
-using google::crypto::tink::EcdsaPublicKey;
-using google::crypto::tink::EcdsaSignatureEncoding;
-using google::crypto::tink::EllipticCurveType;
-using google::crypto::tink::HashType;
-using google::crypto::tink::KeyData;
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
+using ::crypto::tink::util::Enums;
+using ::google::crypto::tink::EcdsaKeyFormat;
+using ::google::crypto::tink::EcdsaParams;
+using ::google::crypto::tink::EcdsaPrivateKey;
+using ::google::crypto::tink::EcdsaPublicKey;
+using ::google::crypto::tink::EcdsaSignatureEncoding;
+using ::google::crypto::tink::EllipticCurveType;
+using ::google::crypto::tink::HashType;
+using ::google::crypto::tink::KeyData;
+using ::testing::Eq;
+using ::testing::HasSubstr;
+using ::testing::Not;
 
 namespace {
 
-class EcdsaVerifyKeyManagerTest : public ::testing::Test {
- protected:
-  std::string key_type_prefix_ = "type.googleapis.com/";
-  std::string ecdsa_verify_key_type_ =
-      "type.googleapis.com/google.crypto.tink.EcdsaPublicKey";
-};
-
-TEST_F(EcdsaVerifyKeyManagerTest, testBasic) {
-  EcdsaVerifyKeyManager key_manager;
-
-  EXPECT_EQ(0, key_manager.get_version());
-  EXPECT_EQ("type.googleapis.com/google.crypto.tink.EcdsaPublicKey",
-            key_manager.get_key_type());
-  EXPECT_TRUE(key_manager.DoesSupport(key_manager.get_key_type()));
+TEST(EcdsaVerifyKeyManagerTest, Basics) {
+  EXPECT_THAT(EcdsaVerifyKeyManager().get_version(), Eq(0));
+  EXPECT_THAT(EcdsaVerifyKeyManager().key_material_type(),
+              Eq(KeyData::ASYMMETRIC_PUBLIC));
+  EXPECT_THAT(EcdsaVerifyKeyManager().get_key_type(),
+              Eq("type.googleapis.com/google.crypto.tink.EcdsaPublicKey"));
 }
 
-TEST_F(EcdsaVerifyKeyManagerTest, testKeyDataErrors) {
-  EcdsaVerifyKeyManager key_manager;
-
-  {  // Bad key type.
-    KeyData key_data;
-    std::string bad_key_type =
-        "type.googleapis.com/google.crypto.tink.SomeOtherKey";
-    key_data.set_type_url(bad_key_type);
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, bad_key_type,
-                        result.status().error_message());
-  }
-
-  {  // Bad key value.
-    KeyData key_data;
-    key_data.set_type_url(ecdsa_verify_key_type_);
-    key_data.set_value("some bad serialized proto");
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
-
-  {  // Bad version.
-    KeyData key_data;
-    EcdsaPublicKey key;
-    key.set_version(1);
-    key_data.set_type_url(ecdsa_verify_key_type_);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "version",
-                        result.status().error_message());
-  }
+TEST(EcdsaVerifyKeyManagerTest, ValidateEmptyKey) {
+  EXPECT_THAT(EcdsaVerifyKeyManager().ValidateKey(EcdsaPublicKey()),
+              Not(IsOk()));
 }
 
-TEST_F(EcdsaVerifyKeyManagerTest, testKeyMessageErrors) {
-  EcdsaVerifyKeyManager key_manager;
-
-  {  // Bad protobuffer.
-    AesEaxKey key;
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "AesEaxKey",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-  }
-
-  {  // Bad elliptic curve.
-    EcdsaPublicKey key;
-    key.mutable_params()->set_encoding(EcdsaSignatureEncoding::DER);
-    key.mutable_params()->set_curve(EllipticCurveType::UNKNOWN_CURVE);
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "Unsupported elliptic curve",
-                        result.status().error_message());
-  }
-
-  {  // Bad hash type for NIST P256.
-    EcdsaPublicKey key;
-    key.mutable_params()->set_encoding(EcdsaSignatureEncoding::DER);
-    key.mutable_params()->set_curve(EllipticCurveType::NIST_P256);
-    key.mutable_params()->set_hash_type(HashType::SHA512);
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "Only SHA256",
-                        result.status().error_message());
-  }
-
-  {  // Bad hash type for NIST P384.
-    EcdsaPublicKey key;
-    key.mutable_params()->set_encoding(EcdsaSignatureEncoding::DER);
-    key.mutable_params()->set_curve(EllipticCurveType::NIST_P384);
-    key.mutable_params()->set_hash_type(HashType::SHA256);
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "Only SHA512",
-                        result.status().error_message());
-  }
-
-  {  // Bad hash type for NIST P521.
-    EcdsaPublicKey key;
-    key.mutable_params()->set_encoding(EcdsaSignatureEncoding::DER);
-    key.mutable_params()->set_curve(EllipticCurveType::NIST_P384);
-    key.mutable_params()->set_hash_type(HashType::SHA256);
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "Only SHA512",
-                        result.status().error_message());
-  }
+EcdsaPrivateKey CreateValidPrivateKey() {
+  EcdsaKeyFormat key_format;
+  EcdsaParams* params = key_format.mutable_params();
+  params->set_hash_type(HashType::SHA256);
+  params->set_curve(EllipticCurveType::NIST_P256);
+  params->set_encoding(EcdsaSignatureEncoding::DER);
+  return EcdsaSignKeyManager().CreateKey(key_format).ValueOrDie();
 }
 
-TEST_F(EcdsaVerifyKeyManagerTest, testPrimitives) {
-  EcdsaSignatureEncoding encodings[2] = {EcdsaSignatureEncoding::DER,
-                                         EcdsaSignatureEncoding::IEEE_P1363};
-  for (EcdsaSignatureEncoding encoding : encodings) {
-    std::string message = "some message to sign";
-    EcdsaSignKeyManager sign_key_manager;
-    EcdsaVerifyKeyManager verify_key_manager;
-    EcdsaPrivateKey private_key = test::GetEcdsaTestPrivateKey(
-        EllipticCurveType::NIST_P256, HashType::SHA256, encoding);
-    EcdsaPublicKey key = private_key.public_key();
-    auto sign =
-        std::move(sign_key_manager.GetPrimitive(private_key).ValueOrDie());
-    std::string signature = sign->Sign(message).ValueOrDie();
-
-    {  // Using Key proto.
-      auto result = verify_key_manager.GetPrimitive(key);
-      EXPECT_TRUE(result.ok()) << result.status();
-      auto verify = std::move(result.ValueOrDie());
-      auto verify_status = verify->Verify(signature, message);
-      EXPECT_TRUE(verify_status.ok()) << verify_status;
-    }
-
-    {  // Using KeyData proto.
-      KeyData key_data;
-      key_data.set_type_url(ecdsa_verify_key_type_);
-      key_data.set_value(key.SerializeAsString());
-      auto result = verify_key_manager.GetPrimitive(key_data);
-      EXPECT_TRUE(result.ok()) << result.status();
-      auto verify = std::move(result.ValueOrDie());
-      auto verify_status = verify->Verify(signature, message);
-      EXPECT_TRUE(verify_status.ok()) << verify_status;
-    }
-
-    {  // Using Key proto with wrong encoding.
-      auto params = key.mutable_params();
-      params->set_encoding(encoding == EcdsaSignatureEncoding::DER
-                               ? EcdsaSignatureEncoding::IEEE_P1363
-                               : EcdsaSignatureEncoding::DER);
-      auto result = verify_key_manager.GetPrimitive(key);
-      EXPECT_TRUE(result.ok()) << result.status();
-      auto verify = std::move(result.ValueOrDie());
-      auto verify_status = verify->Verify(signature, message);
-      EXPECT_FALSE(verify_status.ok()) << verify_status;
-    }
-  }
+EcdsaPublicKey CreateValidPublicKey() {
+  return EcdsaSignKeyManager()
+      .GetPublicKey(CreateValidPrivateKey())
+      .ValueOrDie();
 }
 
-TEST_F(EcdsaVerifyKeyManagerTest, testNewKeyError) {
-  EcdsaVerifyKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
+// Checks that a public key generaed by the SignKeyManager is considered valid.
+TEST(EcdsaVerifyKeyManagerTest, PublicKeyValid) {
+  EcdsaPublicKey key = CreateValidPublicKey();
+  EXPECT_THAT(EcdsaVerifyKeyManager().ValidateKey(key), IsOk());
+}
 
-  { // Via NewKey(format_proto).
-    EcdsaKeyFormat key_format;
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::UNIMPLEMENTED, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "use the EcdsaSignKeyManager",
-                        result.status().error_message());
-  }
+TEST(EcdsaSignKeyManagerTest, ValidateKeyBadHashP256) {
+  EcdsaPublicKey key = CreateValidPublicKey();
+  EcdsaParams* params = key.mutable_params();
+  params->set_curve(EllipticCurveType::NIST_P256);
+  params->set_hash_type(HashType::SHA512);
+  EXPECT_THAT(EcdsaVerifyKeyManager().ValidateKey(key), Not(IsOk()));
+  EXPECT_THAT(
+      EcdsaVerifyKeyManager().ValidateKey(key),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("Only SHA256")));
+}
 
-  { // Via NewKey(serialized_format_proto).
-    EcdsaKeyFormat key_format;
-    auto result = key_factory.NewKey(key_format.SerializeAsString());
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::UNIMPLEMENTED, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "use the EcdsaSignKeyManager",
-                        result.status().error_message());
-  }
+TEST(EcdsaSignKeyManagerTest, ValidateKeyBadHashP384) {
+  EcdsaPublicKey key = CreateValidPublicKey();
+  EcdsaParams* params = key.mutable_params();
+  params->set_curve(EllipticCurveType::NIST_P384);
+  params->set_hash_type(HashType::SHA256);
+  EXPECT_THAT(EcdsaVerifyKeyManager().ValidateKey(key), Not(IsOk()));
+  EXPECT_THAT(
+      EcdsaVerifyKeyManager().ValidateKey(key),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("Only SHA512")));
+}
 
-  { // Via NewKeyData(serialized_format_proto).
-    EcdsaKeyFormat key_format;
-    auto result = key_factory.NewKeyData(key_format.SerializeAsString());
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::UNIMPLEMENTED, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "use the EcdsaSignKeyManager",
-                        result.status().error_message());
-  }
+TEST(EcdsaSignKeyManagerTest, ValidateKeyBadHashP521) {
+  EcdsaPublicKey key = CreateValidPublicKey();
+  EcdsaParams* params = key.mutable_params();
+  params->set_curve(EllipticCurveType::NIST_P521);
+  params->set_hash_type(HashType::SHA256);
+  EXPECT_THAT(EcdsaVerifyKeyManager().ValidateKey(key), Not(IsOk()));
+  EXPECT_THAT(
+      EcdsaVerifyKeyManager().ValidateKey(key),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("Only SHA512")));
+}
+
+TEST(EcdsaSignKeyManagerTest, ValidateParams) {
+  EcdsaParams params;
+  params.set_hash_type(HashType::SHA256);
+  params.set_curve(EllipticCurveType::NIST_P256);
+  params.set_encoding(EcdsaSignatureEncoding::DER);
+  EXPECT_THAT(EcdsaVerifyKeyManager().ValidateParams(params), IsOk());
+}
+
+TEST(EcdsaSignKeyManagerTest, ValidateParamsBadHashP256) {
+  EcdsaParams params;
+  params.set_hash_type(HashType::SHA512);
+  params.set_curve(EllipticCurveType::NIST_P256);
+  params.set_encoding(EcdsaSignatureEncoding::DER);
+  EXPECT_THAT(EcdsaVerifyKeyManager().ValidateParams(params), Not(IsOk()));
+  EXPECT_THAT(
+      EcdsaVerifyKeyManager().ValidateParams(params),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("Only SHA256")));
+}
+
+TEST(EcdsaSignKeyManagerTest, ValidateParamsBadHashP384) {
+  EcdsaParams params;
+  params.set_curve(EllipticCurveType::NIST_P384);
+  params.set_hash_type(HashType::SHA256);
+  params.set_encoding(EcdsaSignatureEncoding::DER);
+  EXPECT_THAT(EcdsaVerifyKeyManager().ValidateParams(params), Not(IsOk()));
+  EXPECT_THAT(
+      EcdsaVerifyKeyManager().ValidateParams(params),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("Only SHA512")));
+}
+
+TEST(EcdsaSignKeyManagerTest, ValidateParamsBadHashP521) {
+  EcdsaParams params;
+  params.set_curve(EllipticCurveType::NIST_P521);
+  params.set_hash_type(HashType::SHA256);
+  params.set_encoding(EcdsaSignatureEncoding::DER);
+  EXPECT_THAT(EcdsaVerifyKeyManager().ValidateParams(params), Not(IsOk()));
+  EXPECT_THAT(
+      EcdsaVerifyKeyManager().ValidateParams(params),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("Only SHA512")));
+}
+
+TEST(EcdsaSignKeyManagerTest, Create) {
+  EcdsaPrivateKey private_key = CreateValidPrivateKey();
+  EcdsaPublicKey public_key =
+      EcdsaSignKeyManager().GetPublicKey(private_key).ValueOrDie();
+
+  subtle::SubtleUtilBoringSSL::EcKey ec_key;
+  ec_key.curve = Enums::ProtoToSubtle(public_key.params().curve());
+  ec_key.pub_x = public_key.x();
+  ec_key.pub_y = public_key.y();
+  ec_key.priv = private_key.key_value();
+
+  auto direct_signer_or = subtle::EcdsaSignBoringSsl::New(
+      ec_key, Enums::ProtoToSubtle(public_key.params().hash_type()),
+      Enums::ProtoToSubtle(public_key.params().encoding()));
+  ASSERT_THAT(direct_signer_or.status(), IsOk());
+
+  auto verifier_or =
+      EcdsaVerifyKeyManager().GetPrimitive<PublicKeyVerify>(public_key);
+  ASSERT_THAT(verifier_or.status(), IsOk());
+
+  std::string message = "Some message";
+  EXPECT_THAT(
+      verifier_or.ValueOrDie()->Verify(
+          direct_signer_or.ValueOrDie()->Sign(message).ValueOrDie(), message),
+      IsOk());
+}
+
+TEST(EcdsaSignKeyManagerTest, CreateDifferentPrivateKey) {
+  EcdsaPrivateKey private_key = CreateValidPrivateKey();
+  // Note: we create a new key in the next line.
+  EcdsaPublicKey public_key =
+      EcdsaSignKeyManager().GetPublicKey(CreateValidPrivateKey()).ValueOrDie();
+
+  subtle::SubtleUtilBoringSSL::EcKey ec_key;
+  ec_key.curve = Enums::ProtoToSubtle(public_key.params().curve());
+  ec_key.pub_x = public_key.x();
+  ec_key.pub_y = public_key.y();
+  ec_key.priv = private_key.key_value();
+
+  auto direct_signer_or = subtle::EcdsaSignBoringSsl::New(
+      ec_key, Enums::ProtoToSubtle(public_key.params().hash_type()),
+      Enums::ProtoToSubtle(public_key.params().encoding()));
+  ASSERT_THAT(direct_signer_or.status(), IsOk());
+
+  auto verifier_or =
+      EcdsaVerifyKeyManager().GetPrimitive<PublicKeyVerify>(public_key);
+  ASSERT_THAT(verifier_or.status(), IsOk());
+
+  std::string message = "Some message";
+  EXPECT_THAT(
+      verifier_or.ValueOrDie()->Verify(
+          direct_signer_or.ValueOrDie()->Sign(message).ValueOrDie(), message),
+      Not(IsOk()));
 }
 
 }  // namespace
diff --git a/cc/signature/ed25519_sign_key_manager.cc b/cc/signature/ed25519_sign_key_manager.cc
index 8950bef..9e78b4e 100644
--- a/cc/signature/ed25519_sign_key_manager.cc
+++ b/cc/signature/ed25519_sign_key_manager.cc
@@ -18,8 +18,6 @@
 
 #include "absl/memory/memory.h"
 #include "absl/strings/string_view.h"
-#include "tink/core/key_manager_base.h"
-#include "tink/key_manager.h"
 #include "tink/public_key_sign.h"
 #include "tink/signature/ed25519_verify_key_manager.h"
 #include "tink/subtle/ed25519_sign_boringssl.h"
@@ -31,117 +29,54 @@
 #include "tink/util/statusor.h"
 #include "tink/util/validation.h"
 #include "proto/ed25519.pb.h"
-#include "proto/empty.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
 
 using crypto::tink::util::Status;
 using crypto::tink::util::StatusOr;
+using google::crypto::tink::Ed25519KeyFormat;
 using google::crypto::tink::Ed25519PrivateKey;
-using google::crypto::tink::Empty;
-using google::crypto::tink::KeyData;
 
-class Ed25519PrivateKeyFactory
-    : public PrivateKeyFactory,
-      public KeyFactoryBase<Ed25519PrivateKey, Empty> {
- public:
-  Ed25519PrivateKeyFactory() {}
-
-  KeyData::KeyMaterialType key_material_type() const override {
-    return KeyData::ASYMMETRIC_PRIVATE;
-  }
-
-  // Returns KeyData proto that contains Ed25519PublicKey
-  // extracted from the given serialized_private_key, which must contain
-  // Ed25519PrivateKey-proto.
-  crypto::tink::util::StatusOr<std::unique_ptr<google::crypto::tink::KeyData>>
-  GetPublicKeyData(absl::string_view serialized_private_key) const override;
-
- protected:
-  StatusOr<std::unique_ptr<Ed25519PrivateKey>> NewKeyFromFormat(
-      const Empty& unused) const override;
-};
-
-StatusOr<std::unique_ptr<Ed25519PrivateKey>>
-Ed25519PrivateKeyFactory::NewKeyFromFormat(const Empty& unused) const {
+StatusOr<Ed25519PrivateKey> Ed25519SignKeyManager::CreateKey(
+    const Ed25519KeyFormat& key_format) const {
   auto key = subtle::SubtleUtilBoringSSL::GetNewEd25519Key();
 
-  // Build Ed25519PrivateKey.
-  std::unique_ptr<Ed25519PrivateKey> ed25519_private_key(
-      new Ed25519PrivateKey());
-  ed25519_private_key->set_version(Ed25519SignKeyManager::kVersion);
-  ed25519_private_key->set_key_value(key->private_key);
+  Ed25519PrivateKey ed25519_private_key;
+  ed25519_private_key.set_version(get_version());
+  ed25519_private_key.set_key_value(key->private_key);
 
   // Build Ed25519PublicKey.
-  auto ed25519_public_key = ed25519_private_key->mutable_public_key();
-  ed25519_public_key->set_version(Ed25519SignKeyManager::kVersion);
+  auto ed25519_public_key = ed25519_private_key.mutable_public_key();
+  ed25519_public_key->set_version(get_version());
   ed25519_public_key->set_key_value(key->public_key);
 
-  return absl::implicit_cast<StatusOr<std::unique_ptr<Ed25519PrivateKey>>>(
-      std::move(ed25519_private_key));
+  return ed25519_private_key;
 }
 
-StatusOr<std::unique_ptr<KeyData>> Ed25519PrivateKeyFactory::GetPublicKeyData(
-    absl::string_view serialized_private_key) const {
-  Ed25519PrivateKey private_key;
-  if (!private_key.ParseFromString(std::string(serialized_private_key))) {
-    return Status(
-        util::error::INVALID_ARGUMENT,
-        absl::StrCat("Could not parse the passed string as proto '",
-                     Ed25519VerifyKeyManager::static_key_type(), "'."));
-    return util::Status::OK;
-  }
-  auto status = Ed25519SignKeyManager::Validate(private_key);
-  if (!status.ok()) return status;
-  auto key_data = absl::make_unique<KeyData>();
-  key_data->set_type_url(Ed25519VerifyKeyManager::static_key_type());
-  key_data->set_value(private_key.public_key().SerializeAsString());
-  key_data->set_key_material_type(KeyData::ASYMMETRIC_PUBLIC);
-  return std::move(key_data);
-}
-
-constexpr uint32_t Ed25519SignKeyManager::kVersion;
-
-Ed25519SignKeyManager::Ed25519SignKeyManager()
-    : key_factory_(absl::make_unique<Ed25519PrivateKeyFactory>()) {}
-
-const KeyFactory& Ed25519SignKeyManager::get_key_factory() const {
-  return *key_factory_;
-}
-
-uint32_t Ed25519SignKeyManager::get_version() const { return kVersion; }
-
 StatusOr<std::unique_ptr<PublicKeySign>>
-Ed25519SignKeyManager::GetPrimitiveFromKey(
-    const Ed25519PrivateKey& ed25519_private_key) const {
-  Status status = Validate(ed25519_private_key);
-  if (!status.ok()) return status;
-
+Ed25519SignKeyManager::PublicKeySignFactory::Create(
+    const Ed25519PrivateKey& private_key) const {
   // BoringSSL expects a 64-byte private key which contains the public key as a
   // suffix.
-  std::string sk = ed25519_private_key.key_value() +
-              ed25519_private_key.public_key().key_value();
+  std::string sk = private_key.key_value() + private_key.public_key().key_value();
 
-  auto ed25519_result = subtle::Ed25519SignBoringSsl::New(sk);
-  if (!ed25519_result.ok()) return ed25519_result.status();
-
-  std::unique_ptr<PublicKeySign> ed25519(ed25519_result.ValueOrDie().release());
-  return std::move(ed25519);
+  return subtle::Ed25519SignBoringSsl::New(sk);
 }
 
-// static
-Status Ed25519SignKeyManager::Validate(const Ed25519PrivateKey& key) {
-  Status status = ValidateVersion(key.version(), kVersion);
+Status Ed25519SignKeyManager::ValidateKey(const Ed25519PrivateKey& key) const {
+  Status status = ValidateVersion(key.version(), get_version());
   if (!status.ok()) return status;
-
   if (key.key_value().length() != 32) {
     return Status(util::error::INVALID_ARGUMENT,
                   "The ED25519 private key must be 32-bytes long.");
   }
+  return Ed25519VerifyKeyManager().ValidateKey(key.public_key());
+}
 
-  return Ed25519VerifyKeyManager::Validate(key.public_key());
+Status Ed25519SignKeyManager::ValidateKeyFormat(
+    const Ed25519KeyFormat& key_format) const {
+  return util::OkStatus();
 }
 
 }  // namespace tink
diff --git a/cc/signature/ed25519_sign_key_manager.h b/cc/signature/ed25519_sign_key_manager.h
index 7e62a1f..c94267f 100644
--- a/cc/signature/ed25519_sign_key_manager.h
+++ b/cc/signature/ed25519_sign_key_manager.h
@@ -20,48 +20,62 @@
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "tink/core/key_manager_base.h"
-#include "tink/key_manager.h"
+#include "tink/core/private_key_type_manager.h"
 #include "tink/public_key_sign.h"
+#include "tink/util/constants.h"
 #include "tink/util/errors.h"
 #include "tink/util/protobuf_helper.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
 #include "proto/ed25519.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
 
 class Ed25519SignKeyManager
-    : public KeyManagerBase<PublicKeySign,
-                            google::crypto::tink::Ed25519PrivateKey> {
+    : public PrivateKeyTypeManager<google::crypto::tink::Ed25519PrivateKey,
+                                   google::crypto::tink::Ed25519KeyFormat,
+                                   google::crypto::tink::Ed25519PublicKey,
+                                   List<PublicKeySign>> {
  public:
-  static constexpr uint32_t kVersion = 0;
+  class PublicKeySignFactory : public PrimitiveFactory<PublicKeySign> {
+    crypto::tink::util::StatusOr<std::unique_ptr<PublicKeySign>> Create(
+        const google::crypto::tink::Ed25519PrivateKey& private_key)
+        const override;
+  };
 
-  Ed25519SignKeyManager();
+  Ed25519SignKeyManager()
+      : PrivateKeyTypeManager(absl::make_unique<PublicKeySignFactory>()) {}
 
-  // Returns the version of this key manager.
-  uint32_t get_version() const override;
+  uint32_t get_version() const override { return 0; }
 
-  // Returns a factory that generates keys of the key type
-  // handled by this manager.
-  const KeyFactory& get_key_factory() const override;
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::ASYMMETRIC_PRIVATE;
+  }
 
-  ~Ed25519SignKeyManager() override {}
+  const std::string& get_key_type() const override { return key_type_; }
 
- protected:
-  crypto::tink::util::StatusOr<std::unique_ptr<PublicKeySign>>
-  GetPrimitiveFromKey(const google::crypto::tink::Ed25519PrivateKey&
-                          ed25519_private_key) const override;
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::Ed25519PrivateKey& key) const override;
+
+  crypto::tink::util::Status ValidateKeyFormat(
+      const google::crypto::tink::Ed25519KeyFormat& key_format) const override;
+
+  crypto::tink::util::StatusOr<google::crypto::tink::Ed25519PrivateKey>
+  CreateKey(
+      const google::crypto::tink::Ed25519KeyFormat& key_format) const override;
+
+  crypto::tink::util::StatusOr<google::crypto::tink::Ed25519PublicKey>
+  GetPublicKey(const google::crypto::tink::Ed25519PrivateKey& private_key)
+      const override {
+    return private_key.public_key();
+  }
 
  private:
-  friend class Ed25519PrivateKeyFactory;
-
-  std::unique_ptr<KeyFactory> key_factory_;
-
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::Ed25519PrivateKey& key);
+  const std::string key_type_ =
+      absl::StrCat(kTypeGoogleapisCom,
+                   google::crypto::tink::Ed25519PrivateKey().GetTypeName());
 };
 
 }  // namespace tink
diff --git a/cc/signature/ed25519_sign_key_manager_test.cc b/cc/signature/ed25519_sign_key_manager_test.cc
index 602a700..73a5e4a 100644
--- a/cc/signature/ed25519_sign_key_manager_test.cc
+++ b/cc/signature/ed25519_sign_key_manager_test.cc
@@ -16,182 +16,137 @@
 
 #include "tink/signature/ed25519_sign_key_manager.h"
 
+#include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "tink/aead/aead_key_templates.h"
-#include "tink/aead/aes_gcm_key_manager.h"
+#include "absl/container/flat_hash_set.h"
 #include "tink/public_key_sign.h"
 #include "tink/registry.h"
 #include "tink/signature/ed25519_verify_key_manager.h"
-#include "tink/signature/signature_key_templates.h"
+#include "tink/subtle/ed25519_verify_boringssl.h"
+#include "tink/util/enums.h"
 #include "tink/util/protobuf_helper.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
-#include "proto/aes_eax.pb.h"
-#include "proto/common.pb.h"
 #include "proto/ed25519.pb.h"
-#include "proto/empty.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
 
-using google::crypto::tink::AesEaxKey;
-using google::crypto::tink::Ed25519PrivateKey;
-using google::crypto::tink::Empty;
-using google::crypto::tink::KeyData;
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::util::StatusOr;
+using ::google::crypto::tink::Ed25519KeyFormat;
+using ::google::crypto::tink::Ed25519PrivateKey;
+using ::google::crypto::tink::Ed25519PublicKey;
+using ::google::crypto::tink::KeyData;
+using ::testing::Eq;
+using ::testing::Not;
+using ::testing::SizeIs;
 
 namespace {
 
-class Ed25519SignKeyManagerTest : public ::testing::Test {
- protected:
-  std::string key_type_prefix_ = "type.googleapis.com/";
-  std::string ed25519_sign_key_type_ =
-      "type.googleapis.com/google.crypto.tink.Ed25519PrivateKey";
-};
-
-TEST_F(Ed25519SignKeyManagerTest, testBasic) {
-  Ed25519SignKeyManager key_manager;
-
-  EXPECT_EQ(0, key_manager.get_version());
-  EXPECT_EQ("type.googleapis.com/google.crypto.tink.Ed25519PrivateKey",
-            key_manager.get_key_type());
-  EXPECT_TRUE(key_manager.DoesSupport(key_manager.get_key_type()));
+TEST(Ed25519SignKeyManagerTest, Basic) {
+  EXPECT_THAT(Ed25519SignKeyManager().get_version(), Eq(0));
+  EXPECT_THAT(Ed25519SignKeyManager().key_material_type(),
+              Eq(KeyData::ASYMMETRIC_PRIVATE));
+  EXPECT_THAT(Ed25519SignKeyManager().get_key_type(),
+              Eq("type.googleapis.com/google.crypto.tink.Ed25519PrivateKey"));
 }
 
-TEST_F(Ed25519SignKeyManagerTest, testKeyDataErrors) {
-  Ed25519SignKeyManager key_manager;
+TEST(Ed25519SignKeyManagerTest, ValidateKeyFormat) {
+  EXPECT_THAT(Ed25519SignKeyManager().ValidateKeyFormat(Ed25519KeyFormat()),
+              IsOk());
+}
 
-  {  // Bad key type.
-    KeyData key_data;
-    std::string bad_key_type = "type.googleapis.com/google.crypto.tink.SomeOtherKey";
-    key_data.set_type_url(bad_key_type);
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, bad_key_type,
-                        result.status().error_message());
+TEST(Ed25519SignKeyManagerTest, CreateKey) {
+  StatusOr<Ed25519PrivateKey> key_or =
+      Ed25519SignKeyManager().CreateKey(Ed25519KeyFormat());
+  ASSERT_THAT(key_or.status(), IsOk());
+  Ed25519PrivateKey key = key_or.ValueOrDie();
+
+  EXPECT_THAT(key.version(), Eq(0));
+
+  EXPECT_THAT(key.public_key().version(), Eq(key.version()));
+
+  EXPECT_THAT(key.key_value(), SizeIs(32));
+  EXPECT_THAT(key.public_key().key_value(), SizeIs(32));
+}
+
+TEST(Ed25519SignKeyManagerTest, CreateKeyValid) {
+  StatusOr<Ed25519PrivateKey> key_or =
+      Ed25519SignKeyManager().CreateKey(Ed25519KeyFormat());
+  ASSERT_THAT(key_or.status(), IsOk());
+  EXPECT_THAT(Ed25519SignKeyManager().ValidateKey(key_or.ValueOrDie()), IsOk());
+}
+
+TEST(Ed25519SignKeyManagerTest, CreateKeyAlwaysNew) {
+  absl::flat_hash_set<std::string> keys;
+  int num_tests = 100;
+  for (int i = 0; i < num_tests; ++i) {
+    StatusOr<Ed25519PrivateKey> key_or =
+        Ed25519SignKeyManager().CreateKey(Ed25519KeyFormat());
+    ASSERT_THAT(key_or.status(), IsOk());
+    keys.insert(key_or.ValueOrDie().key_value());
   }
-
-  {  // Bad key value.
-    KeyData key_data;
-    key_data.set_type_url(ed25519_sign_key_type_);
-    key_data.set_value("some bad serialized proto");
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
-
-  {  // Bad version.
-    KeyData key_data;
-    Ed25519PrivateKey key;
-    key.set_version(1);
-    key_data.set_type_url(ed25519_sign_key_type_);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "version",
-                        result.status().error_message());
-  }
+  EXPECT_THAT(keys, SizeIs(num_tests));
 }
 
-TEST_F(Ed25519SignKeyManagerTest, testKeyMessageErrors) {
-  Ed25519SignKeyManager key_manager;
-
-  {  // Bad protobuffer.
-    AesEaxKey key;
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "AesEaxKey",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-  }
+TEST(Ed25519SignKeyManagerTest, GetPublicKey) {
+  StatusOr<Ed25519PrivateKey> key_or =
+      Ed25519SignKeyManager().CreateKey(Ed25519KeyFormat());
+  ASSERT_THAT(key_or.status(), IsOk());
+  StatusOr<Ed25519PublicKey> public_key_or =
+      Ed25519SignKeyManager().GetPublicKey(key_or.ValueOrDie());
+  ASSERT_THAT(public_key_or.status(), IsOk());
+  EXPECT_THAT(public_key_or.ValueOrDie().version(),
+              Eq(key_or.ValueOrDie().public_key().version()));
+  EXPECT_THAT(public_key_or.ValueOrDie().key_value(),
+              Eq(key_or.ValueOrDie().public_key().key_value()));
 }
 
-TEST_F(Ed25519SignKeyManagerTest, testPrimitives) {
-  std::string message = "some message to sign";
-  Ed25519SignKeyManager sign_key_manager;
-  Ed25519PrivateKey key = test::GetEd25519TestPrivateKey();
+TEST(EcdsaSignKeyManagerTest, Create) {
+  StatusOr<Ed25519PrivateKey> key_or =
+      Ed25519SignKeyManager().CreateKey(Ed25519KeyFormat());
+  ASSERT_THAT(key_or.status(), IsOk());
+  Ed25519PrivateKey key = key_or.ValueOrDie();
 
-  {  // Using Key proto.
-    auto result = sign_key_manager.GetPrimitive(key);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto sign = std::move(result.ValueOrDie());
-    auto signing_result = sign->Sign(message);
-    EXPECT_TRUE(signing_result.ok()) << signing_result.status();
-  }
+  auto signer_or =
+      Ed25519SignKeyManager().GetPrimitive<PublicKeySign>(key);
+  ASSERT_THAT(signer_or.status(), IsOk());
 
-  {  // Using KeyData proto.
-    KeyData key_data;
-    key_data.set_type_url(ed25519_sign_key_type_);
-    key_data.set_value(key.SerializeAsString());
-    auto result = sign_key_manager.GetPrimitive(key_data);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto sign = std::move(result.ValueOrDie());
-    auto signing_result = sign->Sign(message);
-    EXPECT_TRUE(signing_result.ok()) << signing_result.status();
-  }
+  auto direct_verifier_or =
+      subtle::Ed25519VerifyBoringSsl::New(key.public_key().key_value());
+
+  ASSERT_THAT(direct_verifier_or.status(), IsOk());
+
+  std::string message = "Some message";
+  EXPECT_THAT(direct_verifier_or.ValueOrDie()->Verify(
+                  signer_or.ValueOrDie()->Sign(message).ValueOrDie(), message),
+              IsOk());
 }
 
-TEST_F(Ed25519SignKeyManagerTest, testPublicKeyExtraction) {
-  Ed25519SignKeyManager key_manager;
-  auto private_key_factory =
-      dynamic_cast<const PrivateKeyFactory*>(&(key_manager.get_key_factory()));
-  ASSERT_NE(private_key_factory, nullptr);
+TEST(EcdsaSignKeyManagerTest, CreateDifferentKey) {
+  StatusOr<Ed25519PrivateKey> key_or =
+      Ed25519SignKeyManager().CreateKey(Ed25519KeyFormat());
+  ASSERT_THAT(key_or.status(), IsOk());
+  Ed25519PrivateKey key = key_or.ValueOrDie();
 
-  auto new_key_result =
-      private_key_factory->NewKey(SignatureKeyTemplates::Ed25519().value());
-  std::unique_ptr<Ed25519PrivateKey> new_key(
-      reinterpret_cast<Ed25519PrivateKey*>(
-          new_key_result.ValueOrDie().release()));
-  auto public_key_data_result =
-      private_key_factory->GetPublicKeyData(new_key->SerializeAsString());
-  EXPECT_TRUE(public_key_data_result.ok()) << public_key_data_result.status();
-  auto public_key_data = std::move(public_key_data_result.ValueOrDie());
-  EXPECT_EQ(Ed25519VerifyKeyManager::static_key_type(),
-            public_key_data->type_url());
-  EXPECT_EQ(KeyData::ASYMMETRIC_PUBLIC, public_key_data->key_material_type());
-  EXPECT_EQ(new_key->public_key().SerializeAsString(),
-            public_key_data->value());
+  auto signer_or =
+      Ed25519SignKeyManager().GetPrimitive<PublicKeySign>(key);
+  ASSERT_THAT(signer_or.status(), IsOk());
+
+  auto direct_verifier_or =
+      subtle::Ed25519VerifyBoringSsl::New("01234567890123456789012345678901");
+
+  ASSERT_THAT(direct_verifier_or.status(), IsOk());
+
+  std::string message = "Some message";
+  EXPECT_THAT(direct_verifier_or.ValueOrDie()->Verify(
+                  signer_or.ValueOrDie()->Sign(message).ValueOrDie(), message),
+              Not(IsOk()));
 }
-
-TEST_F(Ed25519SignKeyManagerTest, testPublicKeyExtractionErrors) {
-  Ed25519SignKeyManager key_manager;
-  auto private_key_factory =
-      dynamic_cast<const PrivateKeyFactory*>(&(key_manager.get_key_factory()));
-  ASSERT_NE(private_key_factory, nullptr);
-
-  AesGcmKeyManager aead_key_manager;
-  auto aead_private_key_factory = dynamic_cast<const PrivateKeyFactory*>(
-      &(aead_key_manager.get_key_factory()));
-  ASSERT_EQ(nullptr, aead_private_key_factory);
-
-  auto aead_key_result = aead_key_manager.get_key_factory().NewKey(
-      AeadKeyTemplates::Aes128Gcm().value());
-  ASSERT_TRUE(aead_key_result.ok()) << aead_key_result.status();
-  auto aead_key = std::move(aead_key_result.ValueOrDie());
-  auto public_key_data_result =
-      private_key_factory->GetPublicKeyData(aead_key->SerializeAsString());
-  EXPECT_FALSE(public_key_data_result.ok());
-  EXPECT_EQ(util::error::INVALID_ARGUMENT,
-            public_key_data_result.status().error_code());
-}
-
-TEST_F(Ed25519SignKeyManagerTest, testNewKey) {
-  Ed25519SignKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-  Empty key_format;
-  auto result = key_factory.NewKey(key_format);
-  EXPECT_TRUE(result.ok());
-}
-
 }  // namespace
 }  // namespace tink
 }  // namespace crypto
+
diff --git a/cc/signature/ed25519_verify_key_manager.cc b/cc/signature/ed25519_verify_key_manager.cc
index 52abae0..30b5d9b 100644
--- a/cc/signature/ed25519_verify_key_manager.cc
+++ b/cc/signature/ed25519_verify_key_manager.cc
@@ -17,7 +17,6 @@
 #include "tink/signature/ed25519_verify_key_manager.h"
 
 #include "absl/strings/string_view.h"
-#include "tink/key_manager.h"
 #include "tink/public_key_verify.h"
 #include "tink/subtle/ed25519_verify_boringssl.h"
 #include "tink/subtle/subtle_util_boringssl.h"
@@ -35,45 +34,20 @@
 using crypto::tink::util::StatusOr;
 using google::crypto::tink::Ed25519PublicKey;
 
-constexpr uint32_t Ed25519VerifyKeyManager::kVersion;
-
-Ed25519VerifyKeyManager::Ed25519VerifyKeyManager()
-    : key_factory_(KeyFactory::AlwaysFailingFactory(
-          util::Status(util::error::UNIMPLEMENTED,
-                       "Operation not supported for public keys, "
-                       "please use the Ed25519SignKeyManager."))) {}
-
-const KeyFactory& Ed25519VerifyKeyManager::get_key_factory() const {
-  return *key_factory_;
-}
-
-uint32_t Ed25519VerifyKeyManager::get_version() const { return kVersion; }
-
 StatusOr<std::unique_ptr<PublicKeyVerify>>
-Ed25519VerifyKeyManager::GetPrimitiveFromKey(
-    const Ed25519PublicKey& ed25519_public_key) const {
-  Status status = Validate(ed25519_public_key);
-  if (!status.ok()) return status;
-
-  auto ed25519_result =
-      subtle::Ed25519VerifyBoringSsl::New(ed25519_public_key.key_value());
-  if (!ed25519_result.ok()) return ed25519_result.status();
-
-  std::unique_ptr<PublicKeyVerify> ed25519(
-      ed25519_result.ValueOrDie().release());
-  return std::move(ed25519);
+Ed25519VerifyKeyManager::PublicKeyVerifyFactory::Create(
+    const Ed25519PublicKey& public_key) const {
+  return subtle::Ed25519VerifyBoringSsl::New(public_key.key_value());
 }
 
-// static
-Status Ed25519VerifyKeyManager::Validate(const Ed25519PublicKey& key) {
-  Status status = ValidateVersion(key.version(), kVersion);
+Status Ed25519VerifyKeyManager::ValidateKey(const Ed25519PublicKey& key) const {
+  Status status = ValidateVersion(key.version(), get_version());
   if (!status.ok()) return status;
 
   if (key.key_value().length() != 32) {
     return Status(util::error::INVALID_ARGUMENT,
                   "The ED25519 public key must be 32-bytes long.");
   }
-
   return Status::OK;
 }
 
diff --git a/cc/signature/ed25519_verify_key_manager.h b/cc/signature/ed25519_verify_key_manager.h
index 3cacbec..2fbaf6a 100644
--- a/cc/signature/ed25519_verify_key_manager.h
+++ b/cc/signature/ed25519_verify_key_manager.h
@@ -20,9 +20,9 @@
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "tink/core/key_manager_base.h"
-#include "tink/key_manager.h"
+#include "tink/core/key_type_manager.h"
 #include "tink/public_key_verify.h"
+#include "tink/util/constants.h"
 #include "tink/util/errors.h"
 #include "tink/util/protobuf_helper.h"
 #include "tink/util/status.h"
@@ -33,36 +33,34 @@
 namespace tink {
 
 class Ed25519VerifyKeyManager
-    : public KeyManagerBase<PublicKeyVerify,
-                            google::crypto::tink::Ed25519PublicKey> {
+    : public KeyTypeManager<google::crypto::tink::Ed25519PublicKey, void,
+                            List<PublicKeyVerify>> {
  public:
-  static constexpr uint32_t kVersion = 0;
+  class PublicKeyVerifyFactory : public PrimitiveFactory<PublicKeyVerify> {
+    crypto::tink::util::StatusOr<std::unique_ptr<PublicKeyVerify>> Create(
+        const google::crypto::tink::Ed25519PublicKey& ecdsa_public_key)
+        const override;
+  };
 
-  Ed25519VerifyKeyManager();
+  Ed25519VerifyKeyManager()
+      : KeyTypeManager(absl::make_unique<PublicKeyVerifyFactory>()) {}
 
-  // Returns the version of this key manager.
-  uint32_t get_version() const override;
+  uint32_t get_version() const override { return 0; }
 
-  // Returns a factory that generates keys of the key type
-  // handled by this manager.
-  const KeyFactory& get_key_factory() const override;
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::ASYMMETRIC_PUBLIC;
+  }
 
-  ~Ed25519VerifyKeyManager() override {}
+  const std::string& get_key_type() const override { return key_type_; }
 
- protected:
-  crypto::tink::util::StatusOr<std::unique_ptr<PublicKeyVerify>>
-  GetPrimitiveFromKey(const google::crypto::tink::Ed25519PublicKey&
-                          ed25519_public_key) const override;
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::Ed25519PublicKey& key) const override;
 
  private:
-  // Friends that re-use proto validation helpers.
-  friend class Ed25519PrivateKeyFactory;
-  friend class Ed25519SignKeyManager;
-
-  std::unique_ptr<KeyFactory> key_factory_;
-
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::Ed25519PublicKey& key);
+  const std::string key_type_ =
+      absl::StrCat(kTypeGoogleapisCom,
+                   google::crypto::tink::Ed25519PublicKey().GetTypeName());
 };
 
 }  // namespace tink
diff --git a/cc/signature/ed25519_verify_key_manager_test.cc b/cc/signature/ed25519_verify_key_manager_test.cc
index 77ffdb2..b903e51 100644
--- a/cc/signature/ed25519_verify_key_manager_test.cc
+++ b/cc/signature/ed25519_verify_key_manager_test.cc
@@ -16,143 +16,120 @@
 
 #include "tink/signature/ed25519_verify_key_manager.h"
 
+#include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include "tink/public_key_sign.h"
 #include "tink/public_key_verify.h"
 #include "tink/registry.h"
 #include "tink/signature/ed25519_sign_key_manager.h"
+#include "tink/subtle/ed25519_sign_boringssl.h"
+#include "tink/util/enums.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
-#include "proto/aes_eax.pb.h"
-#include "proto/common.pb.h"
 #include "proto/ed25519.pb.h"
-#include "proto/empty.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
 
-using google::crypto::tink::AesEaxKey;
-using google::crypto::tink::Ed25519PrivateKey;
-using google::crypto::tink::Ed25519PublicKey;
-using google::crypto::tink::Empty;
-using google::crypto::tink::KeyData;
+using ::crypto::tink::test::IsOk;
+using ::google::crypto::tink::Ed25519KeyFormat;
+using ::google::crypto::tink::Ed25519PrivateKey;
+using ::google::crypto::tink::Ed25519PublicKey;
+using ::google::crypto::tink::KeyData;
+using ::testing::Eq;
+using ::testing::Not;
 
 namespace {
 
-class Ed25519VerifyKeyManagerTest : public ::testing::Test {
- protected:
-  std::string key_type_prefix_ = "type.googleapis.com/";
-  std::string ed25519_verify_key_type_ =
-      "type.googleapis.com/google.crypto.tink.Ed25519PublicKey";
-};
-
-TEST_F(Ed25519VerifyKeyManagerTest, testBasic) {
-  Ed25519VerifyKeyManager key_manager;
-
-  EXPECT_EQ(0, key_manager.get_version());
-  EXPECT_EQ("type.googleapis.com/google.crypto.tink.Ed25519PublicKey",
-            key_manager.get_key_type());
-  EXPECT_TRUE(key_manager.DoesSupport(key_manager.get_key_type()));
+TEST(Ed25519VerifyKeyManagerTest, Basics) {
+  EXPECT_THAT(Ed25519VerifyKeyManager().get_version(), Eq(0));
+  EXPECT_THAT(Ed25519VerifyKeyManager().key_material_type(),
+              Eq(KeyData::ASYMMETRIC_PUBLIC));
+  EXPECT_THAT(Ed25519VerifyKeyManager().get_key_type(),
+              Eq("type.googleapis.com/google.crypto.tink.Ed25519PublicKey"));
 }
 
-TEST_F(Ed25519VerifyKeyManagerTest, testKeyDataErrors) {
-  Ed25519VerifyKeyManager key_manager;
-
-  {  // Bad key type.
-    KeyData key_data;
-    std::string bad_key_type = "type.googleapis.com/google.crypto.tink.SomeOtherKey";
-    key_data.set_type_url(bad_key_type);
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, bad_key_type,
-                        result.status().error_message());
-  }
-
-  {  // Bad key value.
-    KeyData key_data;
-    key_data.set_type_url(ed25519_verify_key_type_);
-    key_data.set_value("some bad serialized proto");
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
-
-  {  // Bad version.
-    KeyData key_data;
-    Ed25519PublicKey key;
-    key.set_version(1);
-    key_data.set_type_url(ed25519_verify_key_type_);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "version",
-                        result.status().error_message());
-  }
+TEST(Ed25519VerifyKeyManagerTest, ValidateEmptyKey) {
+  EXPECT_THAT(Ed25519VerifyKeyManager().ValidateKey(Ed25519PublicKey()),
+              Not(IsOk()));
 }
 
-TEST_F(Ed25519VerifyKeyManagerTest, testKeyMessageErrors) {
-  Ed25519VerifyKeyManager key_manager;
-
-  {  // Bad protobuffer.
-    AesEaxKey key;
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "AesEaxKey",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-  }
+Ed25519PrivateKey CreateValidPrivateKey() {
+  return Ed25519SignKeyManager().CreateKey(Ed25519KeyFormat()).ValueOrDie();
 }
 
-TEST_F(Ed25519VerifyKeyManagerTest, testPrimitives) {
-  std::string message = "some message to sign";
-  Ed25519SignKeyManager sign_key_manager;
-  Ed25519VerifyKeyManager verify_key_manager;
-  Ed25519PrivateKey private_key = test::GetEd25519TestPrivateKey();
-  Ed25519PublicKey key = private_key.public_key();
-  auto sign =
-      std::move(sign_key_manager.GetPrimitive(private_key).ValueOrDie());
-  std::string signature = sign->Sign(message).ValueOrDie();
-
-  {  // Using Key proto.
-    auto result = verify_key_manager.GetPrimitive(key);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto verify = std::move(result.ValueOrDie());
-    auto verify_status = verify->Verify(signature, message);
-    EXPECT_TRUE(verify_status.ok()) << verify_status;
-  }
-
-  {  // Using KeyData proto.
-    KeyData key_data;
-    key_data.set_type_url(ed25519_verify_key_type_);
-    key_data.set_value(key.SerializeAsString());
-    auto result = verify_key_manager.GetPrimitive(key_data);
-    EXPECT_TRUE(result.ok()) << result.status();
-    auto verify = std::move(result.ValueOrDie());
-    auto verify_status = verify->Verify(signature, message);
-    EXPECT_TRUE(verify_status.ok()) << verify_status;
-  }
+Ed25519PublicKey CreateValidPublicKey() {
+  return Ed25519SignKeyManager()
+      .GetPublicKey(CreateValidPrivateKey())
+      .ValueOrDie();
 }
 
-TEST_F(Ed25519VerifyKeyManagerTest, testNewKey) {
-  Ed25519VerifyKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-  Empty key_format;
-  auto result = key_factory.NewKey(key_format);
-  EXPECT_FALSE(result.ok());
-  EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                      "Operation not supported for public keys, please use the "
-                      "Ed25519SignKeyManager.",
-                      result.status().error_message());
+// Checks that a public key generaed by the SignKeyManager is considered valid.
+TEST(Ed25519VerifyKeyManagerTest, PublicKeyValid) {
+  Ed25519PublicKey key = CreateValidPublicKey();
+  EXPECT_THAT(Ed25519VerifyKeyManager().ValidateKey(key), IsOk());
+}
+
+TEST(Ed25519VerifyKeyManagerTest, PublicKeyWrongVersion) {
+  Ed25519PublicKey key = CreateValidPublicKey();
+  key.set_version(1);
+  EXPECT_THAT(Ed25519VerifyKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(Ed25519VerifyKeyManagerTest, PublicKeyWrongKeyLength31) {
+  Ed25519PublicKey key = CreateValidPublicKey();
+  key.set_key_value(std::string(31, 'a'));
+  EXPECT_THAT(Ed25519VerifyKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(Ed25519VerifyKeyManagerTest, PublicKeyWrongKeyLength64) {
+  Ed25519PublicKey key = CreateValidPublicKey();
+  key.set_key_value(std::string(64, 'a'));
+  EXPECT_THAT(Ed25519VerifyKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(Ed25519SignKeyManagerTest, Create) {
+  Ed25519PrivateKey private_key = CreateValidPrivateKey();
+  Ed25519PublicKey public_key =
+      Ed25519SignKeyManager().GetPublicKey(private_key).ValueOrDie();
+
+  auto direct_signer_or = subtle::Ed25519SignBoringSsl::New(
+      absl::StrCat(private_key.key_value(), public_key.key_value()));
+  ASSERT_THAT(direct_signer_or.status(), IsOk());
+
+  auto verifier_or =
+      Ed25519VerifyKeyManager().GetPrimitive<PublicKeyVerify>(public_key);
+  ASSERT_THAT(verifier_or.status(), IsOk());
+
+  std::string message = "Some message";
+  EXPECT_THAT(
+      verifier_or.ValueOrDie()->Verify(
+          direct_signer_or.ValueOrDie()->Sign(message).ValueOrDie(), message),
+      IsOk());
+}
+
+TEST(Ed25519SignKeyManagerTest, CreateDifferentPrivateKey) {
+  Ed25519PrivateKey private_key = CreateValidPrivateKey();
+  // Note: we create a new key in the next line.
+  Ed25519PublicKey public_key = Ed25519SignKeyManager()
+                                    .GetPublicKey(CreateValidPrivateKey())
+                                    .ValueOrDie();
+
+  auto direct_signer_or = subtle::Ed25519SignBoringSsl::New(absl::StrCat(
+      private_key.key_value(), private_key.public_key().key_value()));
+  ASSERT_THAT(direct_signer_or.status(), IsOk());
+
+  auto verifier_or =
+      Ed25519VerifyKeyManager().GetPrimitive<PublicKeyVerify>(public_key);
+  ASSERT_THAT(verifier_or.status(), IsOk());
+
+  std::string message = "Some message";
+  EXPECT_THAT(
+      verifier_or.ValueOrDie()->Verify(
+          direct_signer_or.ValueOrDie()->Sign(message).ValueOrDie(), message),
+      Not(IsOk()));
 }
 
 }  // namespace
diff --git a/cc/signature/public_key_sign_catalogue.cc b/cc/signature/public_key_sign_catalogue.cc
deleted file mode 100644
index 537d25c..0000000
--- a/cc/signature/public_key_sign_catalogue.cc
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#include "tink/signature/public_key_sign_catalogue.h"
-
-#include "absl/strings/ascii.h"
-#include "tink/catalogue.h"
-#include "tink/key_manager.h"
-#include "tink/signature/ecdsa_sign_key_manager.h"
-#include "tink/signature/ed25519_sign_key_manager.h"
-#include "tink/signature/rsa_ssa_pkcs1_sign_key_manager.h"
-#include "tink/signature/rsa_ssa_pss_sign_key_manager.h"
-#include "tink/util/status.h"
-#include "tink/util/statusor.h"
-
-namespace crypto {
-namespace tink {
-
-namespace {
-
-crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<PublicKeySign>>>
-CreateKeyManager(const std::string& type_url) {
-  if (type_url == EcdsaSignKeyManager::static_key_type()) {
-    std::unique_ptr<KeyManager<PublicKeySign>> manager(
-        new EcdsaSignKeyManager());
-    return std::move(manager);
-  } else if (type_url == Ed25519SignKeyManager::static_key_type()) {
-    std::unique_ptr<KeyManager<PublicKeySign>> manager(
-        new Ed25519SignKeyManager());
-    return std::move(manager);
-  } else if (type_url == RsaSsaPkcs1SignKeyManager::static_key_type()) {
-    std::unique_ptr<KeyManager<PublicKeySign>> manager(
-        new RsaSsaPkcs1SignKeyManager());
-    return std::move(manager);
-  } else if (type_url == RsaSsaPssSignKeyManager::static_key_type()) {
-    std::unique_ptr<KeyManager<PublicKeySign>> manager(
-        new RsaSsaPssSignKeyManager());
-    return std::move(manager);
-  } else {
-    return ToStatusF(crypto::tink::util::error::NOT_FOUND,
-                     "No key manager for type_url '%s'.", type_url.c_str());
-  }
-}
-
-}  // anonymous namespace
-
-crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<PublicKeySign>>>
-PublicKeySignCatalogue::GetKeyManager(const std::string& type_url,
-                                      const std::string& primitive_name,
-                                      uint32_t min_version) const {
-  if (!(absl::AsciiStrToLower(primitive_name) == "publickeysign")) {
-    return ToStatusF(crypto::tink::util::error::NOT_FOUND,
-                     "This catalogue does not support primitive %s.",
-                     primitive_name.c_str());
-  }
-  auto manager_result = CreateKeyManager(type_url);
-  if (!manager_result.ok()) return manager_result;
-  if (manager_result.ValueOrDie()->get_version() < min_version) {
-    return ToStatusF(
-        crypto::tink::util::error::NOT_FOUND,
-        "No key manager for type_url '%s' with version at least %d.",
-        type_url.c_str(), min_version);
-  }
-  return std::move(manager_result.ValueOrDie());
-}
-
-}  // namespace tink
-}  // namespace crypto
diff --git a/cc/signature/public_key_sign_catalogue.h b/cc/signature/public_key_sign_catalogue.h
deleted file mode 100644
index 422e4a8..0000000
--- a/cc/signature/public_key_sign_catalogue.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#ifndef TINK_SIGNATURE_PUBLIC_KEY_SIGN_CATALOGUE_H_
-#define TINK_SIGNATURE_PUBLIC_KEY_SIGN_CATALOGUE_H_
-
-#include "tink/catalogue.h"
-#include "tink/public_key_sign.h"
-#include "tink/key_manager.h"
-#include "tink/util/statusor.h"
-
-namespace crypto {
-namespace tink {
-
-///////////////////////////////////////////////////////////////////////////////
-// A catalogue of Tink PublicKeySign key mangers.
-class PublicKeySignCatalogue : public Catalogue<PublicKeySign> {
- public:
-  PublicKeySignCatalogue() {}
-
-  crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<PublicKeySign>>>
-  GetKeyManager(const std::string& type_url, const std::string& primitive_name,
-                uint32_t min_version) const;
-};
-
-}  // namespace tink
-}  // namespace crypto
-
-#endif  // TINK_SIGNATURE_PUBLIC_KEY_SIGN_CATALOGUE_H_
diff --git a/cc/signature/public_key_sign_catalogue_test.cc b/cc/signature/public_key_sign_catalogue_test.cc
deleted file mode 100644
index 9368536..0000000
--- a/cc/signature/public_key_sign_catalogue_test.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-#include "tink/signature/public_key_sign_catalogue.h"
-
-#include "tink/catalogue.h"
-#include "tink/util/status.h"
-#include "tink/util/statusor.h"
-#include "gtest/gtest.h"
-
-namespace crypto {
-namespace tink {
-namespace {
-
-class PublicKeySignCatalogueTest : public ::testing::Test {
-};
-
-TEST_F(PublicKeySignCatalogueTest, testBasic) {
-  std::string key_type =
-      "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey";
-  PublicKeySignCatalogue catalogue;
-
-  {
-    auto manager_result = catalogue.GetKeyManager(key_type, "PublicKeySign", 0);
-    EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-    EXPECT_TRUE(manager_result.ValueOrDie()->DoesSupport(key_type));
-  }
-
-  {
-    auto manager_result = catalogue.GetKeyManager(key_type, "pUblIckEySiGn", 0);
-    EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-    EXPECT_TRUE(manager_result.ValueOrDie()->DoesSupport(key_type));
-  }
-
-  {
-    auto manager_result = catalogue.GetKeyManager(key_type, "Aead", 0);
-    EXPECT_FALSE(manager_result.ok());
-    EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-  }
-
-  {
-    auto manager_result = catalogue.GetKeyManager(key_type, "PublicKeySign", 1);
-    EXPECT_FALSE(manager_result.ok());
-    EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-  }
-}
-
-}  // namespace
-}  // namespace tink
-}  // namespace crypto
diff --git a/cc/signature/public_key_sign_factory_test.cc b/cc/signature/public_key_sign_factory_test.cc
index fc70fa0..cd76896 100644
--- a/cc/signature/public_key_sign_factory_test.cc
+++ b/cc/signature/public_key_sign_factory_test.cc
@@ -24,13 +24,13 @@
 #include "tink/registry.h"
 #include "tink/signature/ecdsa_sign_key_manager.h"
 #include "tink/signature/signature_config.h"
-#include "tink/util/keyset_util.h"
 #include "tink/util/status.h"
+#include "tink/util/test_keyset_handle.h"
 #include "tink/util/test_util.h"
 #include "proto/ecdsa.pb.h"
 #include "proto/tink.pb.h"
 
-using crypto::tink::KeysetUtil;
+using crypto::tink::TestKeysetHandle;
 using crypto::tink::test::AddTinkKey;
 using google::crypto::tink::EcdsaPrivateKey;
 using google::crypto::tink::EcdsaSignatureEncoding;
@@ -60,8 +60,8 @@
 
 TEST_F(PublicKeySignFactoryTest, testBasic) {
   Keyset keyset;
-  auto public_key_sign_result =
-      PublicKeySignFactory::GetPrimitive(*KeysetUtil::GetKeysetHandle(keyset));
+  auto public_key_sign_result = PublicKeySignFactory::GetPrimitive(
+      *TestKeysetHandle::GetKeysetHandle(keyset));
   EXPECT_FALSE(public_key_sign_result.ok());
   EXPECT_EQ(util::error::INVALID_ARGUMENT,
       public_key_sign_result.status().error_code());
@@ -90,8 +90,8 @@
   keyset.set_primary_key_id(key_id_3);
 
   // Create a KeysetHandle and use it with the factory.
-  auto public_key_sign_result =
-      PublicKeySignFactory::GetPrimitive(*KeysetUtil::GetKeysetHandle(keyset));
+  auto public_key_sign_result = PublicKeySignFactory::GetPrimitive(
+      *TestKeysetHandle::GetKeysetHandle(keyset));
   EXPECT_TRUE(public_key_sign_result.ok())
       << public_key_sign_result.status();
   auto public_key_sign = std::move(public_key_sign_result.ValueOrDie());
diff --git a/cc/signature/public_key_sign_wrapper_test.cc b/cc/signature/public_key_sign_wrapper_test.cc
index 2fb1bf9..1eb6f04 100644
--- a/cc/signature/public_key_sign_wrapper_test.cc
+++ b/cc/signature/public_key_sign_wrapper_test.cc
@@ -21,11 +21,14 @@
 #include "tink/public_key_sign.h"
 #include "tink/util/status.h"
 #include "tink/util/test_util.h"
+#include "tink/util/test_matchers.h"
 
-using crypto::tink::test::DummyPublicKeySign;
-using crypto::tink::test::DummyPublicKeyVerify;
-using google::crypto::tink::OutputPrefixType;
-using google::crypto::tink::Keyset;
+using ::crypto::tink::test::DummyPublicKeySign;
+using ::crypto::tink::test::DummyPublicKeyVerify;
+using ::crypto::tink::test::IsOk;
+using ::google::crypto::tink::Keyset;
+using ::google::crypto::tink::KeyStatusType;
+using ::google::crypto::tink::OutputPrefixType;
 
 namespace crypto {
 namespace tink {
@@ -67,16 +70,19 @@
     key = keyset.add_key();
     key->set_output_prefix_type(OutputPrefixType::TINK);
     key->set_key_id(key_id_0);
+    key->set_status(KeyStatusType::ENABLED);
 
     uint32_t key_id_1 = 726329;
     key = keyset.add_key();
     key->set_output_prefix_type(OutputPrefixType::LEGACY);
     key->set_key_id(key_id_1);
+    key->set_status(KeyStatusType::ENABLED);
 
     uint32_t key_id_2 = 7213743;
     key = keyset.add_key();
     key->set_output_prefix_type(OutputPrefixType::RAW);
     key->set_key_id(key_id_2);
+    key->set_status(KeyStatusType::ENABLED);
 
     std::string signature_name_0 = "signature_0";
     std::string signature_name_1 = "signature_1";
@@ -101,7 +107,7 @@
     ASSERT_TRUE(entry_result.ok());
 
     // The last key is the primary.
-    pk_sign_set->set_primary(entry_result.ValueOrDie());
+    ASSERT_THAT(pk_sign_set->set_primary(entry_result.ValueOrDie()), IsOk());
 
     // Wrap pk_sign_set and test the resulting PublicKeySign.
     auto pk_sign_result = PublicKeySignWrapper().Wrap(std::move(pk_sign_set));
@@ -124,6 +130,7 @@
     uint32_t key_id = 1234543;
     key.set_output_prefix_type(OutputPrefixType::LEGACY);
     key.set_key_id(key_id);
+    key.set_status(KeyStatusType::ENABLED);
     std::string signature_name = "SomeLegacySignatures";
 
     std::unique_ptr<PrimitiveSet<PublicKeySign>> pk_sign_set(
@@ -133,7 +140,7 @@
         new DummyPublicKeySign(signature_name));
     auto entry_result = pk_sign_set->AddPrimitive(std::move(pk_sign), key);
     ASSERT_TRUE(entry_result.ok());
-    pk_sign_set->set_primary(entry_result.ValueOrDie());
+    ASSERT_THAT(pk_sign_set->set_primary(entry_result.ValueOrDie()), IsOk());
 
     // Wrap pk_sign_set and test the resulting PublicKeySign.
     auto pk_sign_result = PublicKeySignWrapper().Wrap(std::move(pk_sign_set));
diff --git a/cc/signature/public_key_verify_catalogue.cc b/cc/signature/public_key_verify_catalogue.cc
deleted file mode 100644
index f8f2851..0000000
--- a/cc/signature/public_key_verify_catalogue.cc
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#include "tink/signature/public_key_verify_catalogue.h"
-
-#include "absl/strings/ascii.h"
-#include "tink/catalogue.h"
-#include "tink/key_manager.h"
-#include "tink/signature/ecdsa_verify_key_manager.h"
-#include "tink/signature/ed25519_verify_key_manager.h"
-#include "tink/signature/rsa_ssa_pkcs1_verify_key_manager.h"
-#include "tink/signature/rsa_ssa_pss_verify_key_manager.h"
-#include "tink/util/status.h"
-#include "tink/util/statusor.h"
-
-namespace crypto {
-namespace tink {
-
-namespace {
-
-crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<PublicKeyVerify>>>
-CreateKeyManager(const std::string& type_url) {
-  if (type_url == EcdsaVerifyKeyManager::static_key_type()) {
-    std::unique_ptr<KeyManager<PublicKeyVerify>> manager(
-        new EcdsaVerifyKeyManager());
-    return std::move(manager);
-  } else if (type_url == Ed25519VerifyKeyManager::static_key_type()) {
-    std::unique_ptr<KeyManager<PublicKeyVerify>> manager(
-        new Ed25519VerifyKeyManager());
-    return std::move(manager);
-  } else if (type_url == RsaSsaPkcs1VerifyKeyManager::static_key_type()) {
-    std::unique_ptr<KeyManager<PublicKeyVerify>> manager(
-        new RsaSsaPkcs1VerifyKeyManager());
-    return std::move(manager);
-  } else if (type_url == RsaSsaPssVerifyKeyManager::static_key_type()) {
-    std::unique_ptr<KeyManager<PublicKeyVerify>> manager(
-        new RsaSsaPssVerifyKeyManager());
-    return std::move(manager);
-  } else {
-    return ToStatusF(crypto::tink::util::error::NOT_FOUND,
-                     "No key manager for type_url '%s'.", type_url.c_str());
-  }
-}
-
-}  // anonymous namespace
-
-crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<PublicKeyVerify>>>
-PublicKeyVerifyCatalogue::GetKeyManager(const std::string& type_url,
-                                        const std::string& primitive_name,
-                                        uint32_t min_version) const {
-  if (!(absl::AsciiStrToLower(primitive_name) == "publickeyverify")) {
-    return ToStatusF(crypto::tink::util::error::NOT_FOUND,
-                     "This catalogue does not support primitive %s.",
-                     primitive_name.c_str());
-  }
-  auto manager_result = CreateKeyManager(type_url);
-  if (!manager_result.ok()) return manager_result;
-  if (manager_result.ValueOrDie()->get_version() < min_version) {
-    return ToStatusF(
-        crypto::tink::util::error::NOT_FOUND,
-        "No key manager for type_url '%s' with version at least %d.",
-        type_url.c_str(), min_version);
-  }
-  return std::move(manager_result.ValueOrDie());
-}
-
-}  // namespace tink
-}  // namespace crypto
diff --git a/cc/signature/public_key_verify_catalogue.h b/cc/signature/public_key_verify_catalogue.h
deleted file mode 100644
index ccf6fc0..0000000
--- a/cc/signature/public_key_verify_catalogue.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#ifndef TINK_SIGNATURE_PUBLIC_KEY_VERIFY_CATALOGUE_H_
-#define TINK_SIGNATURE_PUBLIC_KEY_VERIFY_CATALOGUE_H_
-
-#include "tink/catalogue.h"
-#include "tink/public_key_verify.h"
-#include "tink/key_manager.h"
-#include "tink/util/statusor.h"
-
-namespace crypto {
-namespace tink {
-
-///////////////////////////////////////////////////////////////////////////////
-// A catalogue of Tink PublicKeyVerify key mangers.
-class PublicKeyVerifyCatalogue : public Catalogue<PublicKeyVerify> {
- public:
-  PublicKeyVerifyCatalogue() {}
-
-  crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<PublicKeyVerify>>>
-  GetKeyManager(const std::string& type_url, const std::string& primitive_name,
-                uint32_t min_version) const;
-};
-
-}  // namespace tink
-}  // namespace crypto
-
-#endif  // TINK_SIGNATURE_PUBLIC_KEY_VERIFY_CATALOGUE_H_
diff --git a/cc/signature/public_key_verify_catalogue_test.cc b/cc/signature/public_key_verify_catalogue_test.cc
deleted file mode 100644
index 58c6226..0000000
--- a/cc/signature/public_key_verify_catalogue_test.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-#include "tink/signature/public_key_verify_catalogue.h"
-
-#include "tink/catalogue.h"
-#include "tink/util/status.h"
-#include "tink/util/statusor.h"
-#include "gtest/gtest.h"
-
-namespace crypto {
-namespace tink {
-namespace {
-
-class PublicKeyVerifyCatalogueTest : public ::testing::Test {
-};
-
-TEST_F(PublicKeyVerifyCatalogueTest, testBasic) {
-  std::string key_type =
-      "type.googleapis.com/google.crypto.tink.EcdsaPublicKey";
-  PublicKeyVerifyCatalogue catalogue;
-
-  {
-    auto manager_result = catalogue.GetKeyManager(key_type,
-                                                  "PublicKeyVerify", 0);
-    EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-    EXPECT_TRUE(manager_result.ValueOrDie()->DoesSupport(key_type));
-  }
-
-  {
-    auto manager_result = catalogue.GetKeyManager(key_type,
-                                                  "pUblIckEyVerify", 0);
-    EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-    EXPECT_TRUE(manager_result.ValueOrDie()->DoesSupport(key_type));
-  }
-
-  {
-    auto manager_result = catalogue.GetKeyManager(key_type, "Aead", 0);
-    EXPECT_FALSE(manager_result.ok());
-    EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-  }
-
-  {
-    auto manager_result = catalogue.GetKeyManager(key_type,
-                                                  "PublicKeyVerify", 1);
-    EXPECT_FALSE(manager_result.ok());
-    EXPECT_EQ(util::error::NOT_FOUND, manager_result.status().error_code());
-  }
-}
-
-}  // namespace
-}  // namespace tink
-}  // namespace crypto
diff --git a/cc/signature/public_key_verify_factory_test.cc b/cc/signature/public_key_verify_factory_test.cc
index 9baa193..cd67ce6 100644
--- a/cc/signature/public_key_verify_factory_test.cc
+++ b/cc/signature/public_key_verify_factory_test.cc
@@ -24,13 +24,13 @@
 #include "tink/registry.h"
 #include "tink/signature/ecdsa_verify_key_manager.h"
 #include "tink/signature/signature_config.h"
-#include "tink/util/keyset_util.h"
+#include "tink/util/test_keyset_handle.h"
 #include "tink/util/status.h"
 #include "tink/util/test_util.h"
 #include "proto/ecdsa.pb.h"
 #include "proto/tink.pb.h"
 
-using crypto::tink::KeysetUtil;
+using crypto::tink::TestKeysetHandle;
 using crypto::tink::test::AddTinkKey;
 using google::crypto::tink::EcdsaPublicKey;
 using google::crypto::tink::EcdsaSignatureEncoding;
@@ -62,7 +62,7 @@
 TEST_F(PublicKeyVerifyFactoryTest, testBasic) {
   Keyset keyset;
   auto public_key_verify_result = PublicKeyVerifyFactory::GetPrimitive(
-      *KeysetUtil::GetKeysetHandle(keyset));
+      *TestKeysetHandle::GetKeysetHandle(keyset));
   EXPECT_FALSE(public_key_verify_result.ok());
   EXPECT_EQ(util::error::INVALID_ARGUMENT,
       public_key_verify_result.status().error_code());
@@ -92,7 +92,7 @@
 
   // Create a KeysetHandle and use it with the factory.
   auto public_key_verify_result = PublicKeyVerifyFactory::GetPrimitive(
-      *KeysetUtil::GetKeysetHandle(keyset));
+      *TestKeysetHandle::GetKeysetHandle(keyset));
   EXPECT_TRUE(public_key_verify_result.ok())
       << public_key_verify_result.status();
   auto public_key_verify = std::move(public_key_verify_result.ValueOrDie());
diff --git a/cc/signature/public_key_verify_wrapper_test.cc b/cc/signature/public_key_verify_wrapper_test.cc
index 546643b..0959191 100644
--- a/cc/signature/public_key_verify_wrapper_test.cc
+++ b/cc/signature/public_key_verify_wrapper_test.cc
@@ -15,16 +15,20 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 #include "tink/signature/public_key_verify_wrapper.h"
+
 #include "gtest/gtest.h"
 #include "tink/primitive_set.h"
 #include "tink/public_key_verify.h"
 #include "tink/util/status.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
 
-using crypto::tink::test::DummyPublicKeySign;
-using crypto::tink::test::DummyPublicKeyVerify;
-using google::crypto::tink::OutputPrefixType;
-using google::crypto::tink::Keyset;
+using ::crypto::tink::test::DummyPublicKeySign;
+using ::crypto::tink::test::DummyPublicKeyVerify;
+using ::crypto::tink::test::IsOk;
+using ::google::crypto::tink::Keyset;
+using ::google::crypto::tink::KeyStatusType;
+using ::google::crypto::tink::OutputPrefixType;
 
 namespace crypto {
 namespace tink {
@@ -67,16 +71,19 @@
     key = keyset.add_key();
     key->set_output_prefix_type(OutputPrefixType::RAW);
     key->set_key_id(key_id_0);
+    key->set_status(KeyStatusType::ENABLED);
 
     uint32_t key_id_1 = 726329;
     key = keyset.add_key();
     key->set_output_prefix_type(OutputPrefixType::LEGACY);
     key->set_key_id(key_id_1);
+    key->set_status(KeyStatusType::ENABLED);
 
     uint32_t key_id_2 = 7213743;
     key = keyset.add_key();
     key->set_output_prefix_type(OutputPrefixType::TINK);
     key->set_key_id(key_id_2);
+    key->set_status(KeyStatusType::ENABLED);
 
     std::string signature_name_0 = "signature_0";
     std::string signature_name_1 = "signature_1";
@@ -101,7 +108,7 @@
     ASSERT_TRUE(entry_result.ok());
 
     // The last key is the primary.
-    pk_verify_set->set_primary(entry_result.ValueOrDie());
+    ASSERT_THAT(pk_verify_set->set_primary(entry_result.ValueOrDie()), IsOk());
 
     // Wrap pk_verify_set and test the resulting PublicKeyVerify.
     auto pk_verify_result =
diff --git a/cc/signature/rsa_ssa_pkcs1_sign_key_manager.cc b/cc/signature/rsa_ssa_pkcs1_sign_key_manager.cc
index c572b9e..b7a791b 100644
--- a/cc/signature/rsa_ssa_pkcs1_sign_key_manager.cc
+++ b/cc/signature/rsa_ssa_pkcs1_sign_key_manager.cc
@@ -18,9 +18,8 @@
 
 #include "absl/memory/memory.h"
 #include "absl/strings/string_view.h"
-#include "tink/core/key_manager_base.h"
-#include "tink/key_manager.h"
 #include "tink/public_key_sign.h"
+#include "tink/public_key_verify.h"
 #include "tink/signature/rsa_ssa_pkcs1_verify_key_manager.h"
 #include "tink/signature/sig_util.h"
 #include "tink/subtle/rsa_ssa_pkcs1_sign_boringssl.h"
@@ -32,7 +31,6 @@
 #include "tink/util/statusor.h"
 #include "tink/util/validation.h"
 #include "proto/rsa_ssa_pkcs1.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
@@ -40,24 +38,23 @@
 using crypto::tink::util::Enums;
 using crypto::tink::util::Status;
 using crypto::tink::util::StatusOr;
-using google::crypto::tink::KeyData;
 using google::crypto::tink::RsaSsaPkcs1KeyFormat;
 using google::crypto::tink::RsaSsaPkcs1Params;
 using google::crypto::tink::RsaSsaPkcs1PrivateKey;
 
 namespace {
-std::unique_ptr<RsaSsaPkcs1PrivateKey> RsaPrivateKeySubtleToProto(
+RsaSsaPkcs1PrivateKey RsaPrivateKeySubtleToProto(
     const subtle::SubtleUtilBoringSSL::RsaPrivateKey& private_key) {
-  auto key_proto = absl::make_unique<RsaSsaPkcs1PrivateKey>();
-  key_proto->set_version(RsaSsaPkcs1SignKeyManager::kVersion);
-  key_proto->set_d(private_key.d);
-  key_proto->set_p(private_key.p);
-  key_proto->set_q(private_key.q);
-  key_proto->set_dp(private_key.dp);
-  key_proto->set_dq(private_key.dq);
-  key_proto->set_crt(private_key.crt);
-  auto* public_key_proto = key_proto->mutable_public_key();
-  public_key_proto->set_version(RsaSsaPkcs1SignKeyManager::kVersion);
+  RsaSsaPkcs1PrivateKey key_proto;
+  key_proto.set_version(RsaSsaPkcs1SignKeyManager().get_version());
+  key_proto.set_d(private_key.d);
+  key_proto.set_p(private_key.p);
+  key_proto.set_q(private_key.q);
+  key_proto.set_dp(private_key.dp);
+  key_proto.set_dq(private_key.dq);
+  key_proto.set_crt(private_key.crt);
+  auto* public_key_proto = key_proto.mutable_public_key();
+  public_key_proto->set_version(RsaSsaPkcs1SignKeyManager().get_version());
   public_key_proto->set_n(private_key.n);
   public_key_proto->set_e(private_key.e);
   return key_proto;
@@ -79,34 +76,8 @@
 
 }  // namespace
 
-class RsaSsaPkcs1PrivateKeyFactory
-    : public PrivateKeyFactory,
-      public KeyFactoryBase<RsaSsaPkcs1PrivateKey, RsaSsaPkcs1KeyFormat> {
- public:
-  RsaSsaPkcs1PrivateKeyFactory() {}
-
-  KeyData::KeyMaterialType key_material_type() const override {
-    return KeyData::ASYMMETRIC_PRIVATE;
-  }
-
-  // Returns KeyData proto that contains RsaSsaPkcs1PublicKey
-  // extracted from the given serialized_private_key, which must contain
-  // RsaSsaPkcs1PrivateKey-proto.
-  crypto::tink::util::StatusOr<std::unique_ptr<google::crypto::tink::KeyData>>
-  GetPublicKeyData(absl::string_view serialized_private_key) const override;
-
- protected:
-  StatusOr<std::unique_ptr<RsaSsaPkcs1PrivateKey>> NewKeyFromFormat(
-      const RsaSsaPkcs1KeyFormat& rsa_ssa_pkcs1_key_format) const override;
-};
-
-StatusOr<std::unique_ptr<RsaSsaPkcs1PrivateKey>>
-RsaSsaPkcs1PrivateKeyFactory::NewKeyFromFormat(
+StatusOr<RsaSsaPkcs1PrivateKey> RsaSsaPkcs1SignKeyManager::CreateKey(
     const RsaSsaPkcs1KeyFormat& rsa_ssa_pkcs1_key_format) const {
-  util::Status is_valid =
-      RsaSsaPkcs1SignKeyManager::Validate(rsa_ssa_pkcs1_key_format);
-  if (!is_valid.ok()) return is_valid;
-
   auto e = subtle::SubtleUtilBoringSSL::str2bn(
       rsa_ssa_pkcs1_key_format.public_exponent());
   if (!e.ok()) return e.status();
@@ -118,62 +89,26 @@
       &private_key, &public_key);
   if (!status.ok()) return status;
 
-  auto key_proto = RsaPrivateKeySubtleToProto(private_key);
-  auto* public_key_proto = key_proto->mutable_public_key();
+  RsaSsaPkcs1PrivateKey key_proto = RsaPrivateKeySubtleToProto(private_key);
+  auto* public_key_proto = key_proto.mutable_public_key();
   *public_key_proto->mutable_params() = rsa_ssa_pkcs1_key_format.params();
 
-  return absl::implicit_cast<StatusOr<std::unique_ptr<RsaSsaPkcs1PrivateKey>>>(
-      std::move(key_proto));
+  return key_proto;
 }
 
-StatusOr<std::unique_ptr<KeyData>>
-RsaSsaPkcs1PrivateKeyFactory::GetPublicKeyData(
-    absl::string_view serialized_private_key) const {
-  RsaSsaPkcs1PrivateKey private_key;
-  if (!private_key.ParseFromString(std::string(serialized_private_key))) {
-    return ToStatusF(util::error::INVALID_ARGUMENT,
-                     "Could not parse the passed string as proto '%s'.",
-                     RsaSsaPkcs1VerifyKeyManager::static_key_type().c_str());
-  }
-  auto status = RsaSsaPkcs1SignKeyManager::Validate(private_key);
-  if (!status.ok()) return status;
-  auto key_data = absl::make_unique<KeyData>();
-  key_data->set_type_url(RsaSsaPkcs1VerifyKeyManager::static_key_type());
-  key_data->set_value(private_key.public_key().SerializeAsString());
-  key_data->set_key_material_type(KeyData::ASYMMETRIC_PUBLIC);
-  return std::move(key_data);
-}
-
-constexpr uint32_t RsaSsaPkcs1SignKeyManager::kVersion;
-
-RsaSsaPkcs1SignKeyManager::RsaSsaPkcs1SignKeyManager()
-    : key_factory_(absl::make_unique<RsaSsaPkcs1PrivateKeyFactory>()) {}
-
-const KeyFactory& RsaSsaPkcs1SignKeyManager::get_key_factory() const {
-  return *key_factory_;
-}
-
-uint32_t RsaSsaPkcs1SignKeyManager::get_version() const { return kVersion; }
-
 StatusOr<std::unique_ptr<PublicKeySign>>
-RsaSsaPkcs1SignKeyManager::GetPrimitiveFromKey(
-    const RsaSsaPkcs1PrivateKey& key_proto) const {
-  Status status = Validate(key_proto);
-  if (!status.ok()) return status;
-  auto key = RsaPrivateKeyProtoToSubtle(key_proto);
+RsaSsaPkcs1SignKeyManager::PublicKeySignFactory::Create(
+    const RsaSsaPkcs1PrivateKey& private_key) const {
+  auto key = RsaPrivateKeyProtoToSubtle(private_key);
   subtle::SubtleUtilBoringSSL::RsaSsaPkcs1Params params;
-  const RsaSsaPkcs1Params& params_proto = key_proto.public_key().params();
+  const RsaSsaPkcs1Params& params_proto = private_key.public_key().params();
   params.hash_type = Enums::ProtoToSubtle(params_proto.hash_type());
   auto signer = subtle::RsaSsaPkcs1SignBoringSsl::New(key, params);
   if (!signer.ok()) return signer.status();
   // To check that the key is correct, we sign a test message with private key
   // and verify with public key.
-  auto public_key_data_result =
-      key_factory_->GetPublicKeyData(key_proto.SerializeAsString());
-  if (!public_key_data_result.ok()) return public_key_data_result.status();
-  auto public_key_data = std::move(public_key_data_result.ValueOrDie());
-  RsaSsaPkcs1VerifyKeyManager verify_key_manager;
-  auto verifier = verify_key_manager.GetPrimitive(*public_key_data);
+  auto verifier = RsaSsaPkcs1VerifyKeyManager().GetPrimitive<PublicKeyVerify>(
+      private_key.public_key());
   if (!verifier.ok()) return verifier.status();
   auto sign_verify_result =
       SignAndVerify(signer.ValueOrDie().get(), verifier.ValueOrDie().get());
@@ -185,20 +120,21 @@
   return signer;
 }
 
-// static
-Status RsaSsaPkcs1SignKeyManager::Validate(const RsaSsaPkcs1PrivateKey& key) {
-  Status status = ValidateVersion(key.version(), kVersion);
+Status RsaSsaPkcs1SignKeyManager::ValidateKey(
+    const RsaSsaPkcs1PrivateKey& key) const {
+  Status status = ValidateVersion(key.version(), get_version());
   if (!status.ok()) return status;
-  return RsaSsaPkcs1VerifyKeyManager::Validate(key.public_key());
+  return RsaSsaPkcs1VerifyKeyManager().ValidateKey(key.public_key());
 }
 
-// static
-Status RsaSsaPkcs1SignKeyManager::Validate(
-    const RsaSsaPkcs1KeyFormat& key_format) {
+Status RsaSsaPkcs1SignKeyManager::ValidateKeyFormat(
+    const RsaSsaPkcs1KeyFormat& key_format) const {
   auto modulus_status = subtle::SubtleUtilBoringSSL::ValidateRsaModulusSize(
       key_format.modulus_size_in_bits());
   if (!modulus_status.ok()) return modulus_status;
-  return RsaSsaPkcs1VerifyKeyManager::Validate(key_format.params());
+  return RsaSsaPkcs1VerifyKeyManager().ValidateParams(key_format.params());
 }
+
 }  // namespace tink
 }  // namespace crypto
+
diff --git a/cc/signature/rsa_ssa_pkcs1_sign_key_manager.h b/cc/signature/rsa_ssa_pkcs1_sign_key_manager.h
index 105244d..2a7c990 100644
--- a/cc/signature/rsa_ssa_pkcs1_sign_key_manager.h
+++ b/cc/signature/rsa_ssa_pkcs1_sign_key_manager.h
@@ -20,51 +20,63 @@
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "tink/core/key_manager_base.h"
-#include "tink/key_manager.h"
+#include "tink/core/private_key_type_manager.h"
 #include "tink/public_key_sign.h"
+#include "tink/util/constants.h"
 #include "tink/util/errors.h"
 #include "tink/util/protobuf_helper.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
 #include "proto/rsa_ssa_pkcs1.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
 
 class RsaSsaPkcs1SignKeyManager
-    : public KeyManagerBase<PublicKeySign,
-                            google::crypto::tink::RsaSsaPkcs1PrivateKey> {
+    : public PrivateKeyTypeManager<google::crypto::tink::RsaSsaPkcs1PrivateKey,
+                                   google::crypto::tink::RsaSsaPkcs1KeyFormat,
+                                   google::crypto::tink::RsaSsaPkcs1PublicKey,
+                                   List<PublicKeySign>> {
  public:
-  static constexpr uint32_t kVersion = 0;
+  class PublicKeySignFactory : public PrimitiveFactory<PublicKeySign> {
+    crypto::tink::util::StatusOr<std::unique_ptr<PublicKeySign>> Create(
+        const google::crypto::tink::RsaSsaPkcs1PrivateKey& private_key)
+        const override;
+  };
 
-  RsaSsaPkcs1SignKeyManager();
+  RsaSsaPkcs1SignKeyManager()
+      : PrivateKeyTypeManager(absl::make_unique<PublicKeySignFactory>()) {}
 
-  // Returns the version of this key manager.
-  uint32_t get_version() const override;
+  uint32_t get_version() const override { return 0; }
 
-  // Returns a factory that generates keys of the key type
-  // handled by this manager.
-  const KeyFactory& get_key_factory() const override;
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::ASYMMETRIC_PRIVATE;
+  }
 
-  virtual ~RsaSsaPkcs1SignKeyManager() {}
+  const std::string& get_key_type() const override { return key_type_; }
 
- protected:
-  crypto::tink::util::StatusOr<std::unique_ptr<PublicKeySign>>
-  GetPrimitiveFromKey(const google::crypto::tink::RsaSsaPkcs1PrivateKey&
-                          key_proto) const override;
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::RsaSsaPkcs1PrivateKey& key) const override;
+
+  crypto::tink::util::Status ValidateKeyFormat(
+      const google::crypto::tink::RsaSsaPkcs1KeyFormat& key_format)
+      const override;
+
+  crypto::tink::util::StatusOr<google::crypto::tink::RsaSsaPkcs1PrivateKey>
+  CreateKey(const google::crypto::tink::RsaSsaPkcs1KeyFormat& key_format)
+      const override;
+
+  crypto::tink::util::StatusOr<google::crypto::tink::RsaSsaPkcs1PublicKey>
+  GetPublicKey(const google::crypto::tink::RsaSsaPkcs1PrivateKey& private_key)
+      const override {
+    return private_key.public_key();
+  }
 
  private:
-  friend class RsaSsaPkcs1PrivateKeyFactory;
-
-  std::unique_ptr<PrivateKeyFactory> key_factory_;
-
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::RsaSsaPkcs1KeyFormat& key_format);
-
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::RsaSsaPkcs1PrivateKey& key);
+  const std::string key_type_ =
+      absl::StrCat(kTypeGoogleapisCom,
+                   google::crypto::tink::RsaSsaPkcs1PrivateKey().GetTypeName());
 };
 
 }  // namespace tink
diff --git a/cc/signature/rsa_ssa_pkcs1_sign_key_manager_test.cc b/cc/signature/rsa_ssa_pkcs1_sign_key_manager_test.cc
index 0277e80..e7e53fb 100644
--- a/cc/signature/rsa_ssa_pkcs1_sign_key_manager_test.cc
+++ b/cc/signature/rsa_ssa_pkcs1_sign_key_manager_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2018 Google Inc.
+// Copyright 2018 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -17,41 +17,104 @@
 #include "tink/signature/rsa_ssa_pkcs1_sign_key_manager.h"
 
 #include "gtest/gtest.h"
-#include "tink/aead/aead_key_templates.h"
-#include "tink/aead/aes_gcm_key_manager.h"
+#include "gmock/gmock.h"
+#include "absl/container/flat_hash_set.h"
+#include "openssl/rsa.h"
 #include "tink/public_key_sign.h"
-#include "tink/registry.h"
 #include "tink/signature/rsa_ssa_pkcs1_verify_key_manager.h"
-#include "tink/signature/signature_key_templates.h"
+#include "tink/subtle/rsa_ssa_pkcs1_verify_boringssl.h"
 #include "tink/subtle/subtle_util_boringssl.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
 #include "tink/util/test_util.h"
-#include "proto/aes_eax.pb.h"
-#include "proto/common.pb.h"
+#include "tink/util/test_matchers.h"
 #include "proto/rsa_ssa_pkcs1.pb.h"
 #include "proto/tink.pb.h"
 
-namespace pb = google::crypto::tink;
-
 namespace crypto {
 namespace tink {
-
-using google::crypto::tink::AesEaxKeyFormat;
-using google::crypto::tink::KeyData;
-using google::crypto::tink::RsaSsaPkcs1KeyFormat;
-using google::crypto::tink::RsaSsaPkcs1PrivateKey;
-using google::crypto::tink::RsaSsaPkcs1PublicKey;
-using subtle::SubtleUtilBoringSSL;
-
 namespace {
 
-class RsaSsaPkcs1SignKeyManagerTest : public ::testing::Test {
- protected:
-  std::string key_type_prefix_ = "type.googleapis.com/";
-  std::string rsa_ssa_pkcs1_sign_key_type_ =
-      "type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PrivateKey";
-};
+using ::crypto::tink::subtle::SubtleUtilBoringSSL;
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::util::StatusOr;
+using ::google::crypto::tink::HashType;
+using ::google::crypto::tink::KeyData;
+using ::google::crypto::tink::RsaSsaPkcs1KeyFormat;
+using ::google::crypto::tink::RsaSsaPkcs1PrivateKey;
+using ::google::crypto::tink::RsaSsaPkcs1PublicKey;
+using ::testing::Eq;
+using ::testing::Not;
+using ::testing::SizeIs;
+
+TEST(RsaSsaPkcsSignKeyManagerTest, Basic) {
+  EXPECT_THAT(RsaSsaPkcs1SignKeyManager().get_version(), Eq(0));
+  EXPECT_THAT(RsaSsaPkcs1SignKeyManager().key_material_type(),
+              Eq(KeyData::ASYMMETRIC_PRIVATE));
+  EXPECT_THAT(
+      RsaSsaPkcs1SignKeyManager().get_key_type(),
+      Eq("type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PrivateKey"));
+}
+
+RsaSsaPkcs1KeyFormat CreateKeyFormat(HashType hash_type,
+                                     int modulus_size_in_bits,
+                                     int public_exponent) {
+  RsaSsaPkcs1KeyFormat key_format;
+  auto params = key_format.mutable_params();
+  params->set_hash_type(hash_type);
+  key_format.set_modulus_size_in_bits(modulus_size_in_bits);
+  bssl::UniquePtr<BIGNUM> e(BN_new());
+  BN_set_word(e.get(), public_exponent);
+  key_format.set_public_exponent(
+      subtle::SubtleUtilBoringSSL::bn2str(e.get(), BN_num_bytes(e.get()))
+          .ValueOrDie());
+  return key_format;
+}
+
+RsaSsaPkcs1KeyFormat ValidKeyFormat() {
+  return CreateKeyFormat(HashType::SHA256, 3072, RSA_F4);
+}
+
+TEST(RsaSsaPkcs1SignKeyManagerTest, ValidateKeyFormat) {
+  EXPECT_THAT(RsaSsaPkcs1SignKeyManager().ValidateKeyFormat(ValidKeyFormat()),
+              IsOk());
+}
+
+TEST(RsaSsaPkcs1SignKeyManagerTest, ValidateKeyFormatSha384Disallowed) {
+  RsaSsaPkcs1KeyFormat key_format = ValidKeyFormat();
+  key_format.mutable_params()->set_hash_type(HashType::SHA384);
+  // TODO(b/140410067): Check if SHA384 should be allowed.
+  EXPECT_THAT(RsaSsaPkcs1SignKeyManager().ValidateKeyFormat(key_format),
+              Not(IsOk()));
+}
+
+TEST(RsaSsaPkcs1SignKeyManagerTest, ValidateKeyFormatSha512Allowed) {
+  RsaSsaPkcs1KeyFormat key_format = ValidKeyFormat();
+  key_format.mutable_params()->set_hash_type(HashType::SHA512);
+  EXPECT_THAT(RsaSsaPkcs1SignKeyManager().ValidateKeyFormat(key_format),
+              IsOk());
+}
+
+TEST(RsaSsaPkcs1SignKeyManagerTest, ValidateKeyFormatSha1Disallowed) {
+  RsaSsaPkcs1KeyFormat key_format = ValidKeyFormat();
+  key_format.mutable_params()->set_hash_type(HashType::SHA1);
+  EXPECT_THAT(RsaSsaPkcs1SignKeyManager().ValidateKeyFormat(key_format),
+              Not(IsOk()));
+}
+
+TEST(RsaSsaPkcs1SignKeyManagerTest, ValidateKeyFormatUnkownHashDisallowed) {
+  RsaSsaPkcs1KeyFormat key_format = ValidKeyFormat();
+  key_format.mutable_params()->set_hash_type(HashType::UNKNOWN_HASH);
+  EXPECT_THAT(RsaSsaPkcs1SignKeyManager().ValidateKeyFormat(key_format),
+              Not(IsOk()));
+}
+
+TEST(RsaSsaPkcs1SignKeyManagerTest, ValidateKeyFormatSmallModulusDisallowed) {
+  RsaSsaPkcs1KeyFormat key_format = ValidKeyFormat();
+  key_format.set_modulus_size_in_bits(2047);
+  EXPECT_THAT(RsaSsaPkcs1SignKeyManager().ValidateKeyFormat(key_format),
+              Not(IsOk()));
+}
 
 // Checks whether given key is compatible with the given format.
 void CheckNewKey(const RsaSsaPkcs1PrivateKey& private_key,
@@ -66,8 +129,6 @@
   EXPECT_EQ(public_key.params().SerializeAsString(),
             key_format.params().SerializeAsString());
   EXPECT_EQ(key_format.public_exponent(), public_key.e());
-  auto primitive_result = key_manager.GetPrimitive(private_key);
-  EXPECT_TRUE(primitive_result.ok()) << primitive_result.status();
   auto n = std::move(SubtleUtilBoringSSL::str2bn(public_key.n()).ValueOrDie());
   auto d = std::move(SubtleUtilBoringSSL::str2bn(private_key.d()).ValueOrDie());
   auto p = std::move(SubtleUtilBoringSSL::str2bn(private_key.p()).ValueOrDie());
@@ -80,274 +141,119 @@
 
   // Check n = p * q.
   auto n_calc = bssl::UniquePtr<BIGNUM>(BN_new());
-  ASSERT_TRUE(BN_mul(n_calc.get(), p.get(), q.get(), ctx.get()));
-  ASSERT_TRUE(BN_equal_consttime(n_calc.get(), n.get()));
+  EXPECT_TRUE(BN_mul(n_calc.get(), p.get(), q.get(), ctx.get()));
+  EXPECT_TRUE(BN_equal_consttime(n_calc.get(), n.get()));
 
   // Check n size >= modulus_size_in_bits bit.
   EXPECT_GE(BN_num_bits(n.get()), key_format.modulus_size_in_bits());
 
   // dp = d mod (p - 1)
   auto pm1 = bssl::UniquePtr<BIGNUM>(BN_dup(p.get()));
-  ASSERT_TRUE(BN_sub_word(pm1.get(), 1));
+  EXPECT_TRUE(BN_sub_word(pm1.get(), 1));
   auto dp_calc = bssl::UniquePtr<BIGNUM>(BN_new());
-  ASSERT_TRUE(BN_mod(dp_calc.get(), d.get(), pm1.get(), ctx.get()));
-  ASSERT_TRUE(BN_equal_consttime(dp_calc.get(), dp.get()));
+  EXPECT_TRUE(BN_mod(dp_calc.get(), d.get(), pm1.get(), ctx.get()));
+  EXPECT_TRUE(BN_equal_consttime(dp_calc.get(), dp.get()));
 
   // dq = d mod (q - 1)
   auto qm1 = bssl::UniquePtr<BIGNUM>(BN_dup(q.get()));
-  ASSERT_TRUE(BN_sub_word(qm1.get(), 1));
+  EXPECT_TRUE(BN_sub_word(qm1.get(), 1));
   auto dq_calc = bssl::UniquePtr<BIGNUM>(BN_new());
-  ASSERT_TRUE(BN_mod(dq_calc.get(), d.get(), qm1.get(), ctx.get()));
+  EXPECT_TRUE(BN_mod(dq_calc.get(), d.get(), qm1.get(), ctx.get()));
 
-  ASSERT_TRUE(BN_equal_consttime(dq_calc.get(), dq.get()));
+  EXPECT_TRUE(BN_equal_consttime(dq_calc.get(), dq.get()));
 }
 
-TEST_F(RsaSsaPkcs1SignKeyManagerTest, Basic) {
-  RsaSsaPkcs1SignKeyManager key_manager;
-  EXPECT_EQ(0, key_manager.get_version());
-  EXPECT_EQ("type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PrivateKey",
-            key_manager.get_key_type());
-  EXPECT_TRUE(key_manager.DoesSupport(key_manager.get_key_type()));
+TEST(RsaSsaPkcs1SignKeyManagerTest, CreateKey) {
+  RsaSsaPkcs1KeyFormat key_format =
+      CreateKeyFormat(HashType::SHA256, 3072, RSA_F4);
+  StatusOr<RsaSsaPkcs1PrivateKey> private_key_or =
+      RsaSsaPkcs1SignKeyManager().CreateKey(key_format);
+  ASSERT_THAT(private_key_or.status(), IsOk());
+  CheckNewKey(private_key_or.ValueOrDie(), key_format);
 }
 
-TEST_F(RsaSsaPkcs1SignKeyManagerTest, NewKeyFromKeyFormat) {
-  RsaSsaPkcs1SignKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-  RsaSsaPkcs1KeyFormat key_format;
-  ASSERT_TRUE(key_format.ParseFromString(
-      SignatureKeyTemplates::RsaSsaPkcs13072Sha256F4().value()));
-  auto result = key_factory.NewKey(key_format);
-  EXPECT_TRUE(result.ok()) << result.status();
-  auto key = std::move(result.ValueOrDie());
-  ASSERT_EQ(rsa_ssa_pkcs1_sign_key_type_,
-            key_type_prefix_ + key->GetTypeName());
-  std::unique_ptr<RsaSsaPkcs1PrivateKey> rsa_key(
-      static_cast<RsaSsaPkcs1PrivateKey*>(key.release()));
-  CheckNewKey(*rsa_key, key_format);
+TEST(RsaSsaPkcs1SignKeyManagerTest, CreateKeySmallKey) {
+  RsaSsaPkcs1KeyFormat key_format =
+      CreateKeyFormat(HashType::SHA256, 2048, RSA_F4);
+
+  StatusOr<RsaSsaPkcs1PrivateKey> private_key_or =
+      RsaSsaPkcs1SignKeyManager().CreateKey(key_format);
+  ASSERT_THAT(private_key_or.status(), IsOk());
+  CheckNewKey(private_key_or.ValueOrDie(), key_format);
 }
 
-TEST_F(RsaSsaPkcs1SignKeyManagerTest, NewKeyFromSerializedKeyFormat) {
-  RsaSsaPkcs1SignKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-  RsaSsaPkcs1KeyFormat key_format;
-  ASSERT_TRUE(key_format.ParseFromString(
-      SignatureKeyTemplates::RsaSsaPkcs14096Sha512F4().value()));
-  auto result = key_factory.NewKey(key_format.SerializeAsString());
-  EXPECT_TRUE(result.ok()) << result.status();
-  auto key = std::move(result.ValueOrDie());
-  ASSERT_EQ(rsa_ssa_pkcs1_sign_key_type_,
-            key_type_prefix_ + key->GetTypeName());
-  std::unique_ptr<RsaSsaPkcs1PrivateKey> rsa_key(
-      static_cast<RsaSsaPkcs1PrivateKey*>(key.release()));
-  CheckNewKey(*rsa_key, key_format);
+TEST(RsaSsaPkcs1SignKeyManagerTest, CreateKeyLargeKey) {
+  RsaSsaPkcs1KeyFormat key_format =
+      CreateKeyFormat(HashType::SHA512, 4096, RSA_F4);
+
+  StatusOr<RsaSsaPkcs1PrivateKey> private_key_or =
+      RsaSsaPkcs1SignKeyManager().CreateKey(key_format);
+  ASSERT_THAT(private_key_or.status(), IsOk());
+  CheckNewKey(private_key_or.ValueOrDie(), key_format);
 }
 
-TEST_F(RsaSsaPkcs1SignKeyManagerTest, NewKeyDataFromSerializedKeyFormat) {
-  RsaSsaPkcs1SignKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-  RsaSsaPkcs1KeyFormat key_format;
-  ASSERT_TRUE(key_format.ParseFromString(
-      SignatureKeyTemplates::RsaSsaPkcs14096Sha512F4().value()));
-  auto result = key_factory.NewKeyData(key_format.SerializeAsString());
-  EXPECT_TRUE(result.ok()) << result.status();
-  auto key_data = std::move(result.ValueOrDie());
-  ASSERT_EQ(rsa_ssa_pkcs1_sign_key_type_, key_data->type_url());
-  RsaSsaPkcs1PrivateKey rsa_key;
-  ASSERT_TRUE(rsa_key.ParseFromString(key_data->value()));
-  CheckNewKey(rsa_key, key_format);
+TEST(RsaSsaPkcs1SignKeyManagerTest, CreateKeyValid) {
+  StatusOr<RsaSsaPkcs1PrivateKey> key_or =
+      RsaSsaPkcs1SignKeyManager().CreateKey(ValidKeyFormat());
+  ASSERT_THAT(key_or.status(), IsOk());
+  EXPECT_THAT(RsaSsaPkcs1SignKeyManager().ValidateKey(key_or.ValueOrDie()),
+              IsOk());
 }
 
-TEST_F(RsaSsaPkcs1SignKeyManagerTest, PublicKeyExtraction) {
-  RsaSsaPkcs1SignKeyManager sign_key_manager;
-  auto private_key_factory = dynamic_cast<const PrivateKeyFactory*>(
-      &(sign_key_manager.get_key_factory()));
-  ASSERT_NE(private_key_factory, nullptr);
-  auto new_key_result = private_key_factory->NewKey(
-      SignatureKeyTemplates::RsaSsaPkcs13072Sha256F4().value());
-  std::unique_ptr<RsaSsaPkcs1PrivateKey> private_key(
-      static_cast<RsaSsaPkcs1PrivateKey*>(
-          new_key_result.ValueOrDie().release()));
-  auto public_key_data_result =
-      private_key_factory->GetPublicKeyData(private_key->SerializeAsString());
-  EXPECT_TRUE(public_key_data_result.ok()) << public_key_data_result.status();
-  auto public_key_data = std::move(public_key_data_result.ValueOrDie());
-  EXPECT_EQ(RsaSsaPkcs1VerifyKeyManager::static_key_type(),
-            public_key_data->type_url());
-  EXPECT_EQ(KeyData::ASYMMETRIC_PUBLIC, public_key_data->key_material_type());
-  EXPECT_EQ(private_key->public_key().SerializeAsString(),
-            public_key_data->value());
-  // Sign with private key and verify with public key.
-  RsaSsaPkcs1VerifyKeyManager verify_key_manager;
-  auto signer = sign_key_manager.GetPrimitive(*private_key);
-  auto verifier = verify_key_manager.GetPrimitive(*public_key_data);
-  std::string message = "Wycheproof";
-  EXPECT_TRUE(
-      verifier.ValueOrDie()
-          ->Verify(signer.ValueOrDie()->Sign(message).ValueOrDie(), message)
-          .ok());
-}
-
-TEST_F(RsaSsaPkcs1SignKeyManagerTest, NewKeyWithWeakSignatureHash) {
-  RsaSsaPkcs1SignKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-  RsaSsaPkcs1KeyFormat key_format;
-  ASSERT_TRUE(key_format.ParseFromString(
-      SignatureKeyTemplates::RsaSsaPkcs14096Sha512F4().value()));
-  key_format.mutable_params()->set_hash_type(pb::HashType::SHA1);
-  auto result = key_factory.NewKey(key_format.SerializeAsString());
-  EXPECT_FALSE(result.ok());
-  EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-  EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                      "SHA1 is not safe for digital signature",
-                      result.status().error_message());
-}
-
-TEST_F(RsaSsaPkcs1SignKeyManagerTest, NewKeyWithSmallModulus) {
-  RsaSsaPkcs1SignKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-  RsaSsaPkcs1KeyFormat key_format;
-  ASSERT_TRUE(key_format.ParseFromString(
-      SignatureKeyTemplates::RsaSsaPkcs14096Sha512F4().value()));
-  key_format.set_modulus_size_in_bits(512);
-  auto result = key_factory.NewKey(key_format.SerializeAsString());
-  EXPECT_FALSE(result.ok());
-  EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-  EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                      "only modulus size >= 2048-bit is supported",
-                      result.status().error_message());
-}
-
-TEST_F(RsaSsaPkcs1SignKeyManagerTest, GetPrimitiveWithWeakSignatureHash) {
-  RsaSsaPkcs1SignKeyManager sign_key_manager;
-  auto private_key_factory = dynamic_cast<const PrivateKeyFactory*>(
-      &(sign_key_manager.get_key_factory()));
-  ASSERT_NE(private_key_factory, nullptr);
-  auto new_key_result = private_key_factory->NewKey(
-      SignatureKeyTemplates::RsaSsaPkcs13072Sha256F4().value());
-  std::unique_ptr<RsaSsaPkcs1PrivateKey> private_key(
-      static_cast<RsaSsaPkcs1PrivateKey*>(
-          new_key_result.ValueOrDie().release()));
-  private_key->mutable_public_key()->mutable_params()->set_hash_type(
-      pb::HashType::SHA1);
-  auto result = sign_key_manager.GetPrimitive(*private_key);
-  EXPECT_FALSE(result.ok());
-  EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-  EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                      "SHA1 is not safe for digital signature",
-                      result.status().error_message());
-}
-
-TEST_F(RsaSsaPkcs1SignKeyManagerTest, GetPrimitiveWithSmallModulus) {
-  RsaSsaPkcs1SignKeyManager sign_key_manager;
-  auto private_key_factory = dynamic_cast<const PrivateKeyFactory*>(
-      &(sign_key_manager.get_key_factory()));
-  ASSERT_NE(private_key_factory, nullptr);
-  auto new_key_result = private_key_factory->NewKey(
-      SignatureKeyTemplates::RsaSsaPkcs13072Sha256F4().value());
-  std::unique_ptr<RsaSsaPkcs1PrivateKey> private_key(
-      static_cast<RsaSsaPkcs1PrivateKey*>(
-          new_key_result.ValueOrDie().release()));
-  private_key->mutable_public_key()->set_n("\x23");
-  private_key->mutable_public_key()->set_e("\x3");
-  auto result = sign_key_manager.GetPrimitive(*private_key);
-  EXPECT_FALSE(result.ok());
-  EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-  EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                      "only modulus size >= 2048-bit is supported",
-                      result.status().error_message());
-}
-
-TEST_F(RsaSsaPkcs1SignKeyManagerTest, KeyDataErrors) {
-  RsaSsaPkcs1SignKeyManager key_manager;
-
-  {  // Bad key type.
-    KeyData key_data;
-    std::string bad_key_type = "type.googleapis.com/google.crypto.tink.SomeOtherKey";
-    key_data.set_type_url(bad_key_type);
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, bad_key_type,
-                        result.status().error_message());
+// Check that in a bunch of CreateKey calls all generated primes are distinct.
+TEST(RsaSsaPkcs1SignKeyManagerTest, CreateKeyAlwaysNewRsaPair) {
+  absl::flat_hash_set<std::string> keys;
+  // This test takes about a second per key.
+  int num_generated_keys = 5;
+  for (int i = 0; i < num_generated_keys; ++i) {
+    StatusOr<RsaSsaPkcs1PrivateKey> key_or =
+        RsaSsaPkcs1SignKeyManager().CreateKey(ValidKeyFormat());
+    ASSERT_THAT(key_or.status(), IsOk());
+    keys.insert(key_or.ValueOrDie().p());
+    keys.insert(key_or.ValueOrDie().q());
   }
-
-  {  // Bad key value.
-    KeyData key_data;
-    key_data.set_type_url(rsa_ssa_pkcs1_sign_key_type_);
-    key_data.set_value("some bad serialized proto");
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
-
-  {  // Bad version.
-    KeyData key_data;
-    RsaSsaPkcs1PrivateKey key;
-    key.set_version(1);
-    key_data.set_type_url(rsa_ssa_pkcs1_sign_key_type_);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "version",
-                        result.status().error_message());
-  }
+  EXPECT_THAT(keys, SizeIs(2 * num_generated_keys));
 }
 
-TEST_F(RsaSsaPkcs1SignKeyManagerTest, NewKeyErrors) {
-  RsaSsaPkcs1SignKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-
-  // Empty key format.
-  RsaSsaPkcs1KeyFormat key_format;
-  {
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-  }
-
-  // Bad serialized format.
-  {
-    auto result = key_factory.NewKey("some bad serialization");
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-  }
-
-  // Wrong format proto.
-  {
-    AesEaxKeyFormat wrong_key_format;
-    auto result = key_factory.NewKey(wrong_key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-  }
+TEST(RsaSsaPkcs1SignKeyManagerTest, GetPublicKey) {
+  StatusOr<RsaSsaPkcs1PrivateKey> key_or =
+      RsaSsaPkcs1SignKeyManager().CreateKey(ValidKeyFormat());
+  ASSERT_THAT(key_or.status(), IsOk());
+  StatusOr<RsaSsaPkcs1PublicKey> public_key_or =
+      RsaSsaPkcs1SignKeyManager().GetPublicKey(key_or.ValueOrDie());
+  ASSERT_THAT(public_key_or.status(), IsOk());
+  EXPECT_THAT(public_key_or.ValueOrDie().version(),
+              Eq(key_or.ValueOrDie().public_key().version()));
+  EXPECT_THAT(public_key_or.ValueOrDie().params().hash_type(),
+              Eq(key_or.ValueOrDie().public_key().params().hash_type()));
+  EXPECT_THAT(public_key_or.ValueOrDie().n(),
+              Eq(key_or.ValueOrDie().public_key().n()));
+  EXPECT_THAT(public_key_or.ValueOrDie().e(),
+              Eq(key_or.ValueOrDie().public_key().e()));
 }
 
-TEST_F(RsaSsaPkcs1SignKeyManagerTest, PublicKeyExtractionErrors) {
-  RsaSsaPkcs1SignKeyManager key_manager;
-  auto private_key_factory =
-      dynamic_cast<const PrivateKeyFactory*>(&(key_manager.get_key_factory()));
-  ASSERT_NE(private_key_factory, nullptr);
+TEST(EcdsaSignKeyManagerTest, Create) {
+  RsaSsaPkcs1KeyFormat key_format =
+      CreateKeyFormat(HashType::SHA256, 3072, RSA_F4);
+  StatusOr<RsaSsaPkcs1PrivateKey> key_or =
+      RsaSsaPkcs1SignKeyManager().CreateKey(key_format);
+  ASSERT_THAT(key_or.status(), IsOk());
+  RsaSsaPkcs1PrivateKey key = key_or.ValueOrDie();
 
-  AesGcmKeyManager aead_key_manager;
-  auto aead_private_key_factory = dynamic_cast<const PrivateKeyFactory*>(
-      &(aead_key_manager.get_key_factory()));
-  ASSERT_EQ(nullptr, aead_private_key_factory);
+  auto signer_or = RsaSsaPkcs1SignKeyManager().GetPrimitive<PublicKeySign>(key);
+  ASSERT_THAT(signer_or.status(), IsOk());
 
-  auto aead_key_result = aead_key_manager.get_key_factory().NewKey(
-      AeadKeyTemplates::Aes128Gcm().value());
-  ASSERT_TRUE(aead_key_result.ok()) << aead_key_result.status();
-  auto aead_key = std::move(aead_key_result.ValueOrDie());
-  auto public_key_data_result =
-      private_key_factory->GetPublicKeyData(aead_key->SerializeAsString());
-  EXPECT_FALSE(public_key_data_result.ok());
-  EXPECT_EQ(util::error::INVALID_ARGUMENT,
-            public_key_data_result.status().error_code());
+  auto direct_verifier_or = subtle::RsaSsaPkcs1VerifyBoringSsl::New(
+      {key.public_key().n(), key.public_key().e()}, {subtle::HashType::SHA256});
+  ASSERT_THAT(direct_verifier_or.status(), IsOk());
+
+  std::string message = "Some message";
+  EXPECT_THAT(direct_verifier_or.ValueOrDie()->Verify(
+                  signer_or.ValueOrDie()->Sign(message).ValueOrDie(), message),
+              IsOk());
 }
 
 }  // namespace
 }  // namespace tink
 }  // namespace crypto
+
diff --git a/cc/signature/rsa_ssa_pkcs1_verify_key_manager.cc b/cc/signature/rsa_ssa_pkcs1_verify_key_manager.cc
index b08c304..b73caa7 100644
--- a/cc/signature/rsa_ssa_pkcs1_verify_key_manager.cc
+++ b/cc/signature/rsa_ssa_pkcs1_verify_key_manager.cc
@@ -17,7 +17,6 @@
 #include "tink/signature/rsa_ssa_pkcs1_verify_key_manager.h"
 
 #include "absl/strings/string_view.h"
-#include "tink/key_manager.h"
 #include "tink/public_key_verify.h"
 #include "tink/subtle/rsa_ssa_pkcs1_verify_boringssl.h"
 #include "tink/subtle/subtle_util_boringssl.h"
@@ -28,7 +27,6 @@
 #include "tink/util/statusor.h"
 #include "tink/util/validation.h"
 #include "proto/rsa_ssa_pkcs1.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
@@ -36,30 +34,12 @@
 using crypto::tink::util::Enums;
 using crypto::tink::util::Status;
 using crypto::tink::util::StatusOr;
-using google::crypto::tink::KeyData;
 using google::crypto::tink::RsaSsaPkcs1Params;
 using google::crypto::tink::RsaSsaPkcs1PublicKey;
-using portable_proto::MessageLite;
-
-constexpr uint32_t RsaSsaPkcs1VerifyKeyManager::kVersion;
-
-RsaSsaPkcs1VerifyKeyManager::RsaSsaPkcs1VerifyKeyManager()
-    : key_factory_(KeyFactory::AlwaysFailingFactory(
-          util::Status(util::error::UNIMPLEMENTED,
-                       "Operation not supported for public keys, "
-                       "please use the RsaSsaPkcs1SignKeyManager."))) {}
-
-const KeyFactory& RsaSsaPkcs1VerifyKeyManager::get_key_factory() const {
-  return *key_factory_;
-}
-
-uint32_t RsaSsaPkcs1VerifyKeyManager::get_version() const { return kVersion; }
 
 StatusOr<std::unique_ptr<PublicKeyVerify>>
-RsaSsaPkcs1VerifyKeyManager::GetPrimitiveFromKey(
+RsaSsaPkcs1VerifyKeyManager::PublicKeyVerifyFactory::Create(
     const RsaSsaPkcs1PublicKey& rsa_ssa_pkcs1_public_key) const {
-  Status status = Validate(rsa_ssa_pkcs1_public_key);
-  if (!status.ok()) return status;
   subtle::SubtleUtilBoringSSL::RsaPublicKey rsa_pub_key;
   rsa_pub_key.n = rsa_ssa_pkcs1_public_key.n();
   rsa_pub_key.e = rsa_ssa_pkcs1_public_key.e();
@@ -71,27 +51,25 @@
   auto rsa_ssa_pkcs1_result =
       subtle::RsaSsaPkcs1VerifyBoringSsl::New(rsa_pub_key, params);
   if (!rsa_ssa_pkcs1_result.ok()) return rsa_ssa_pkcs1_result.status();
-  std::unique_ptr<PublicKeyVerify> rsa_ssa_pkcs1(
-      rsa_ssa_pkcs1_result.ValueOrDie().release());
-  return std::move(rsa_ssa_pkcs1);
+  return {std::move(rsa_ssa_pkcs1_result.ValueOrDie())};
 }
 
-// static
-Status RsaSsaPkcs1VerifyKeyManager::Validate(const RsaSsaPkcs1Params& params) {
+Status RsaSsaPkcs1VerifyKeyManager::ValidateParams(
+    const RsaSsaPkcs1Params& params) const {
   return subtle::SubtleUtilBoringSSL::ValidateSignatureHash(
       Enums::ProtoToSubtle(params.hash_type()));
 }
 
-// static
-Status RsaSsaPkcs1VerifyKeyManager::Validate(const RsaSsaPkcs1PublicKey& key) {
-  Status status = ValidateVersion(key.version(), kVersion);
+Status RsaSsaPkcs1VerifyKeyManager::ValidateKey(
+    const RsaSsaPkcs1PublicKey& key) const {
+  Status status = ValidateVersion(key.version(), get_version());
   if (!status.ok()) return status;
   auto status_or_n = subtle::SubtleUtilBoringSSL::str2bn(key.n());
   if (!status_or_n.ok()) return status_or_n.status();
   auto modulus_status = subtle::SubtleUtilBoringSSL::ValidateRsaModulusSize(
       BN_num_bits(status_or_n.ValueOrDie().get()));
   if (!modulus_status.ok()) return modulus_status;
-  return Validate(key.params());
+  return ValidateParams(key.params());
 }
 
 }  // namespace tink
diff --git a/cc/signature/rsa_ssa_pkcs1_verify_key_manager.h b/cc/signature/rsa_ssa_pkcs1_verify_key_manager.h
index 2e78d0e..ac5008f 100644
--- a/cc/signature/rsa_ssa_pkcs1_verify_key_manager.h
+++ b/cc/signature/rsa_ssa_pkcs1_verify_key_manager.h
@@ -21,52 +21,50 @@
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "tink/core/key_manager_base.h"
-#include "tink/key_manager.h"
+#include "tink/core/key_type_manager.h"
 #include "tink/public_key_verify.h"
+#include "tink/util/constants.h"
 #include "tink/util/errors.h"
 #include "tink/util/protobuf_helper.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
 #include "proto/rsa_ssa_pkcs1.pb.h"
-#include "proto/tink.pb.h"
 
 namespace crypto {
 namespace tink {
 
 class RsaSsaPkcs1VerifyKeyManager
-    : public KeyManagerBase<PublicKeyVerify,
-                            google::crypto::tink::RsaSsaPkcs1PublicKey> {
+    : public KeyTypeManager<google::crypto::tink::RsaSsaPkcs1PublicKey, void,
+                            List<PublicKeyVerify>> {
  public:
-  static constexpr uint32_t kVersion = 0;
+  class PublicKeyVerifyFactory : public PrimitiveFactory<PublicKeyVerify> {
+    crypto::tink::util::StatusOr<std::unique_ptr<PublicKeyVerify>> Create(
+        const google::crypto::tink::RsaSsaPkcs1PublicKey&
+            rsa_ssa_pkcs1_public_key) const override;
+  };
 
-  RsaSsaPkcs1VerifyKeyManager();
+  RsaSsaPkcs1VerifyKeyManager()
+      : KeyTypeManager(absl::make_unique<PublicKeyVerifyFactory>()) {}
 
-  // Returns the version of this key manager.
-  uint32_t get_version() const override;
+  uint32_t get_version() const override { return 0; }
 
-  // Returns a factory that generates keys of the key type
-  // handled by this manager.
-  const KeyFactory& get_key_factory() const override;
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::ASYMMETRIC_PUBLIC;
+  }
 
-  virtual ~RsaSsaPkcs1VerifyKeyManager() {}
+  const std::string& get_key_type() const override { return key_type_; }
 
- protected:
-  crypto::tink::util::StatusOr<std::unique_ptr<PublicKeyVerify>>
-  GetPrimitiveFromKey(const google::crypto::tink::RsaSsaPkcs1PublicKey&
-                          rsa_ssa_pkcs1_public_key) const override;
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::RsaSsaPkcs1PublicKey& key) const override;
+
+  crypto::tink::util::Status ValidateParams(
+      const google::crypto::tink::RsaSsaPkcs1Params& params) const;
 
  private:
-  // Friends that re-use proto validation helpers.
-  friend class RsaSsaPkcs1PrivateKeyFactory;
-  friend class RsaSsaPkcs1SignKeyManager;
-
-  std::unique_ptr<KeyFactory> key_factory_;
-
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::RsaSsaPkcs1Params& params);
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::RsaSsaPkcs1PublicKey& key);
+  const std::string key_type_ =
+      absl::StrCat(kTypeGoogleapisCom,
+                   google::crypto::tink::RsaSsaPkcs1PublicKey().GetTypeName());
 };
 
 }  // namespace tink
diff --git a/cc/signature/rsa_ssa_pkcs1_verify_key_manager_test.cc b/cc/signature/rsa_ssa_pkcs1_verify_key_manager_test.cc
index e82d381..93e54fd 100644
--- a/cc/signature/rsa_ssa_pkcs1_verify_key_manager_test.cc
+++ b/cc/signature/rsa_ssa_pkcs1_verify_key_manager_test.cc
@@ -16,44 +16,156 @@
 
 #include "tink/signature/rsa_ssa_pkcs1_verify_key_manager.h"
 
+#include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include "absl/strings/escaping.h"
+#include "openssl/bn.h"
+#include "openssl/rsa.h"
 #include "tink/public_key_sign.h"
 #include "tink/public_key_verify.h"
-
-#include "tink/registry.h"
+#include "tink/signature/rsa_ssa_pkcs1_sign_key_manager.h"
+#include "tink/subtle/rsa_ssa_pkcs1_sign_boringssl.h"
+#include "tink/subtle/subtle_util_boringssl.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
-#include "proto/common.pb.h"
 #include "proto/rsa_ssa_pkcs1.pb.h"
 #include "proto/tink.pb.h"
 
-namespace pb = google::crypto::tink;
-
-// TODO(quannguyen): add more tests once RsaSsaPkcs1SignKeyManager is available.
 namespace crypto {
 namespace tink {
 
-using google::crypto::tink::KeyData;
-using google::crypto::tink::RsaSsaPkcs1KeyFormat;
-using google::crypto::tink::RsaSsaPkcs1PublicKey;
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
+using ::crypto::tink::util::StatusOr;
+using ::google::crypto::tink::HashType;
+using ::google::crypto::tink::KeyData;
+using ::google::crypto::tink::RsaSsaPkcs1KeyFormat;
+using ::google::crypto::tink::RsaSsaPkcs1PrivateKey;
+using ::google::crypto::tink::RsaSsaPkcs1PublicKey;
+using ::testing::Eq;
+using ::testing::HasSubstr;
+using ::testing::Not;
 
 namespace {
 
-// Test vector from
-// https://csrc.nist.gov/Projects/Cryptographic-Algorithm-Validation-Program/Digital-Signatures
-struct NistTestVector {
-  std::string n;
-  std::string e;
-  std::string message;
-  std::string signature;
-  pb::HashType hash_type;
-};
+TEST(RsaSsaPkcs1VerifyKeyManagerTest, Basics) {
+  EXPECT_THAT(RsaSsaPkcs1VerifyKeyManager().get_version(), Eq(0));
+  EXPECT_THAT(RsaSsaPkcs1VerifyKeyManager().key_material_type(),
+              Eq(KeyData::ASYMMETRIC_PUBLIC));
+  EXPECT_THAT(
+      RsaSsaPkcs1VerifyKeyManager().get_key_type(),
+      Eq("type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PublicKey"));
+}
 
-class RsaSsaPkcs1VerifyKeyManagerTest : public ::testing::Test {
- protected:
-  const NistTestVector nist_test_vector_{
+TEST(RsaSsaPkcs1VerifyKeyManagerTest, ValidateEmptyKey) {
+  EXPECT_THAT(RsaSsaPkcs1VerifyKeyManager().ValidateKey(RsaSsaPkcs1PublicKey()),
+              Not(IsOk()));
+}
+
+RsaSsaPkcs1KeyFormat CreateKeyFormat(HashType hash_type,
+                                     int modulus_size_in_bits,
+                                     int public_exponent) {
+  RsaSsaPkcs1KeyFormat key_format;
+  auto params = key_format.mutable_params();
+  params->set_hash_type(hash_type);
+  key_format.set_modulus_size_in_bits(modulus_size_in_bits);
+  bssl::UniquePtr<BIGNUM> e(BN_new());
+  BN_set_word(e.get(), public_exponent);
+  key_format.set_public_exponent(
+      subtle::SubtleUtilBoringSSL::bn2str(e.get(), BN_num_bytes(e.get()))
+          .ValueOrDie());
+  return key_format;
+}
+
+RsaSsaPkcs1KeyFormat ValidKeyFormat() {
+  return CreateKeyFormat(HashType::SHA256, 3072, RSA_F4);
+}
+
+RsaSsaPkcs1PrivateKey CreateValidPrivateKey() {
+  return RsaSsaPkcs1SignKeyManager().CreateKey(ValidKeyFormat()).ValueOrDie();
+}
+
+RsaSsaPkcs1PublicKey CreateValidPublicKey() {
+  return RsaSsaPkcs1SignKeyManager()
+      .GetPublicKey(CreateValidPrivateKey())
+      .ValueOrDie();
+}
+
+// Checks that a public key generaed by the SignKeyManager is considered valid.
+TEST(RsaSsaPkcs1VerifyKeyManagerTest, PublicKeyValid) {
+  RsaSsaPkcs1PublicKey key = CreateValidPublicKey();
+  EXPECT_THAT(RsaSsaPkcs1VerifyKeyManager().ValidateKey(key), IsOk());
+}
+
+TEST(RsaSsaPkcs1VerifyKeyManagerTest, PublicKeyWrongVersion) {
+  RsaSsaPkcs1PublicKey key = CreateValidPublicKey();
+  key.set_version(1);
+  EXPECT_THAT(RsaSsaPkcs1VerifyKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(RsaSsaPkcs1VerifyKeyManagerTest, PublicKeyUnkownHashDisallowed) {
+  RsaSsaPkcs1PublicKey key = CreateValidPublicKey();
+  key.mutable_params()->set_hash_type(HashType::UNKNOWN_HASH);
+  EXPECT_THAT(RsaSsaPkcs1VerifyKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(RsaSsaPkcs1VerifyKeyManagerTest, ValidateKeyFormatSmallModulusDisallowed) {
+  RsaSsaPkcs1PublicKey key = CreateValidPublicKey();
+  key.set_n("\x23");
+  key.set_e("\x3");
+  EXPECT_THAT(RsaSsaPkcs1VerifyKeyManager().ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT,
+                       HasSubstr("only modulus size >= 2048")));
+}
+
+TEST(RsaSsaPkcs1SignKeyManagerTest, Create) {
+  RsaSsaPkcs1KeyFormat key_format =
+      CreateKeyFormat(HashType::SHA256, 3072, RSA_F4);
+  StatusOr<RsaSsaPkcs1PrivateKey> private_key_or =
+      RsaSsaPkcs1SignKeyManager().CreateKey(key_format);
+  ASSERT_THAT(private_key_or.status(), IsOk());
+  RsaSsaPkcs1PrivateKey private_key = private_key_or.ValueOrDie();
+  RsaSsaPkcs1PublicKey public_key =
+      RsaSsaPkcs1SignKeyManager().GetPublicKey(private_key).ValueOrDie();
+
+  subtle::SubtleUtilBoringSSL::RsaPrivateKey private_key_subtle;
+  private_key_subtle.n = private_key.public_key().n();
+  private_key_subtle.e = private_key.public_key().e();
+  private_key_subtle.d = private_key.d();
+  private_key_subtle.p = private_key.p();
+  private_key_subtle.q = private_key.q();
+  private_key_subtle.dp = private_key.dp();
+  private_key_subtle.dq = private_key.dq();
+  private_key_subtle.crt = private_key.crt();
+
+  auto direct_signer_or = subtle::RsaSsaPkcs1SignBoringSsl::New(
+      private_key_subtle, {crypto::tink::subtle::HashType::SHA256});
+
+  auto verifier_or =
+      RsaSsaPkcs1VerifyKeyManager().GetPrimitive<PublicKeyVerify>(public_key);
+  ASSERT_THAT(verifier_or.status(), IsOk());
+
+  std::string message = "Some message";
+  EXPECT_THAT(
+      verifier_or.ValueOrDie()->Verify(
+          direct_signer_or.ValueOrDie()->Sign(message).ValueOrDie(), message),
+      IsOk());
+}
+
+TEST(RsaSsaPkcs1VerifyKeyManagerTest, NistTestVector) {
+  // Test vector from
+  // https://csrc.nist.gov/Projects/Cryptographic-Algorithm-Validation-Program/Digital-Signatures
+  struct NistTestVector {
+    std::string n;
+    std::string e;
+    std::string message;
+    std::string signature;
+    HashType hash_type;
+  };
+
+  const NistTestVector nist_test_vector{
       absl::HexStringToBytes(
           "c9548608087bed6be0a4623b9d849aa0b4b4b6114ad0a7d82578076ceefe26ce48d1"
           "448e16d69963510e1e5fc658f3cf8f32a489b62d93fec1cdea6e1dde3feba04bb6a0"
@@ -78,146 +190,19 @@
           "34b76711e76813ad5f5c3a5c95399e907650534dbfafec900c21be1308ddff6eda52"
           "5f35e4fb3d275de46250ea1e4b96b60bd125b85f6c52b5419a725cd69b10cefd0901"
           "abe7f9e15940594cf811e34c60f38768244c"),
-      pb::HashType::SHA256};
+      HashType::SHA256};
 
-  std::string rsa_ssa_pkcs1_verify_key_type_ =
-      "type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PublicKey";
-};
-
-TEST_F(RsaSsaPkcs1VerifyKeyManagerTest, NistTestVector) {
-  RsaSsaPkcs1VerifyKeyManager key_manager;
-
-  EXPECT_EQ(0, key_manager.get_version());
-  EXPECT_EQ("type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PublicKey",
-            key_manager.get_key_type());
-  EXPECT_TRUE(key_manager.DoesSupport(key_manager.get_key_type()));
-
-  // NIST test vector should work.
   RsaSsaPkcs1PublicKey key;
-  key.mutable_params()->set_hash_type(nist_test_vector_.hash_type);
+  key.mutable_params()->set_hash_type(nist_test_vector.hash_type);
   key.set_version(0);
-  key.set_n(nist_test_vector_.n);
-  key.set_e(nist_test_vector_.e);
-  auto result = key_manager.GetPrimitive(key);
-  EXPECT_TRUE(result.ok());
-  EXPECT_TRUE(
-      result.ValueOrDie()
-          ->Verify(nist_test_vector_.signature, nist_test_vector_.message)
-          .ok());
-}
-
-TEST_F(RsaSsaPkcs1VerifyKeyManagerTest, KeyDataErrors) {
-  RsaSsaPkcs1VerifyKeyManager key_manager;
-
-  {  // Bad key type.
-    KeyData key_data;
-    std::string bad_key_type = "type.googleapis.com/google.crypto.tink.SomeOtherKey";
-    key_data.set_type_url(bad_key_type);
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, bad_key_type,
-                        result.status().error_message());
-  }
-
-  {  // Bad key value.
-    KeyData key_data;
-    key_data.set_type_url(rsa_ssa_pkcs1_verify_key_type_);
-    key_data.set_value("some bad serialized proto");
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
-
-  {  // Bad version.
-    KeyData key_data;
-    RsaSsaPkcs1PublicKey key;
-    key.set_version(1);
-    key_data.set_type_url(rsa_ssa_pkcs1_verify_key_type_);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "version",
-                        result.status().error_message());
-  }
-}
-
-TEST_F(RsaSsaPkcs1VerifyKeyManagerTest, KeyMessageErrors) {
-  RsaSsaPkcs1VerifyKeyManager key_manager;
-
-  {  // Use SHA1 as signature hash.
-    RsaSsaPkcs1PublicKey key;
-    key.mutable_params()->set_hash_type(pb::HashType::SHA1);
-    key.set_version(0);
-    key.set_n(nist_test_vector_.n);
-    key.set_e(nist_test_vector_.e);
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                        "SHA1 is not safe for digital signature",
-                        result.status().error_message());
-  }
-
-  {  // Small modulus.
-    RsaSsaPkcs1PublicKey key;
-    key.mutable_params()->set_hash_type(pb::HashType::SHA256);
-    key.set_version(0);
-    key.set_n("\x23");
-    key.set_e("\x3");
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                        "only modulus size >= 2048-bit is supported",
-                        result.status().error_message());
-  }
-}
-
-TEST_F(RsaSsaPkcs1VerifyKeyManagerTest, NewKeyError) {
-  RsaSsaPkcs1VerifyKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-
-  {  // Via NewKey(format_proto).
-    RsaSsaPkcs1KeyFormat key_format;
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::UNIMPLEMENTED, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                        "use the RsaSsaPkcs1SignKeyManager",
-                        result.status().error_message());
-  }
-
-  {  // Via NewKey(serialized_format_proto).
-    RsaSsaPkcs1KeyFormat key_format;
-    auto result = key_factory.NewKey(key_format.SerializeAsString());
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::UNIMPLEMENTED, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                        "use the RsaSsaPkcs1SignKeyManager",
-                        result.status().error_message());
-  }
-
-  {  // Via NewKeyData(serialized_format_proto).
-    RsaSsaPkcs1KeyFormat key_format;
-    auto result = key_factory.NewKeyData(key_format.SerializeAsString());
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::UNIMPLEMENTED, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                        "use the RsaSsaPkcs1SignKeyManager",
-                        result.status().error_message());
-  }
+  key.set_n(nist_test_vector.n);
+  key.set_e(nist_test_vector.e);
+  auto result =
+      RsaSsaPkcs1VerifyKeyManager().GetPrimitive<PublicKeyVerify>(key);
+  EXPECT_THAT(result.status(), IsOk());
+  EXPECT_THAT(result.ValueOrDie()->Verify(nist_test_vector.signature,
+                                          nist_test_vector.message),
+              IsOk());
 }
 
 }  // namespace
diff --git a/cc/signature/rsa_ssa_pss_sign_key_manager.cc b/cc/signature/rsa_ssa_pss_sign_key_manager.cc
index 9bdac19..5f0ccba 100644
--- a/cc/signature/rsa_ssa_pss_sign_key_manager.cc
+++ b/cc/signature/rsa_ssa_pss_sign_key_manager.cc
@@ -18,7 +18,6 @@
 
 #include "absl/memory/memory.h"
 #include "absl/strings/string_view.h"
-#include "tink/key_manager.h"
 #include "tink/public_key_sign.h"
 #include "tink/signature/rsa_ssa_pss_verify_key_manager.h"
 #include "tink/signature/sig_util.h"
@@ -39,7 +38,6 @@
 using crypto::tink::util::Enums;
 using crypto::tink::util::Status;
 using crypto::tink::util::StatusOr;
-using google::crypto::tink::KeyData;
 using google::crypto::tink::RsaSsaPssKeyFormat;
 using google::crypto::tink::RsaSsaPssParams;
 using google::crypto::tink::RsaSsaPssPrivateKey;
@@ -48,7 +46,7 @@
 std::unique_ptr<RsaSsaPssPrivateKey> RsaPrivateKeySubtleToProto(
     const subtle::SubtleUtilBoringSSL::RsaPrivateKey& private_key) {
   auto key_proto = absl::make_unique<RsaSsaPssPrivateKey>();
-  key_proto->set_version(RsaSsaPssSignKeyManager::kVersion);
+  key_proto->set_version(RsaSsaPssSignKeyManager().get_version());
   key_proto->set_d(private_key.d);
   key_proto->set_p(private_key.p);
   key_proto->set_q(private_key.q);
@@ -56,7 +54,7 @@
   key_proto->set_dq(private_key.dq);
   key_proto->set_crt(private_key.crt);
   auto* public_key_proto = key_proto->mutable_public_key();
-  public_key_proto->set_version(RsaSsaPssSignKeyManager::kVersion);
+  public_key_proto->set_version(RsaSsaPssSignKeyManager().get_version());
   public_key_proto->set_n(private_key.n);
   public_key_proto->set_e(private_key.e);
   return key_proto;
@@ -78,88 +76,31 @@
 
 }  // namespace
 
-class RsaSsaPssPrivateKeyFactory
-    : public PrivateKeyFactory,
-      public KeyFactoryBase<RsaSsaPssPrivateKey, RsaSsaPssKeyFormat> {
- public:
-  RsaSsaPssPrivateKeyFactory() {}
-
-  KeyData::KeyMaterialType key_material_type() const override {
-    return KeyData::ASYMMETRIC_PRIVATE;
-  }
-
-  // Returns KeyData proto that contains RsaSsaPssPublicKey
-  // extracted from the given serialized_private_key, which must contain
-  // RsaSsaPssPrivateKey-proto.
-  crypto::tink::util::StatusOr<std::unique_ptr<google::crypto::tink::KeyData>>
-  GetPublicKeyData(absl::string_view serialized_private_key) const override;
-
- protected:
-  StatusOr<std::unique_ptr<RsaSsaPssPrivateKey>> NewKeyFromFormat(
-      const RsaSsaPssKeyFormat& rsa_ssa_pss_key_format) const override;
-};
-
-StatusOr<std::unique_ptr<RsaSsaPssPrivateKey>>
-RsaSsaPssPrivateKeyFactory::NewKeyFromFormat(
-    const RsaSsaPssKeyFormat& rsa_ssa_pss_key_format) const {
-  util::Status is_valid =
-      RsaSsaPssSignKeyManager::Validate(rsa_ssa_pss_key_format);
-  if (!is_valid.ok()) return is_valid;
-
+StatusOr<RsaSsaPssPrivateKey> RsaSsaPssSignKeyManager::CreateKey(
+    const RsaSsaPssKeyFormat& key_format) const {
   auto e = subtle::SubtleUtilBoringSSL::str2bn(
-      rsa_ssa_pss_key_format.public_exponent());
+      key_format.public_exponent());
   if (!e.ok()) return e.status();
 
   subtle::SubtleUtilBoringSSL::RsaPrivateKey private_key;
   subtle::SubtleUtilBoringSSL::RsaPublicKey public_key;
   util::Status status = subtle::SubtleUtilBoringSSL::GetNewRsaKeyPair(
-      rsa_ssa_pss_key_format.modulus_size_in_bits(), e.ValueOrDie().get(),
+      key_format.modulus_size_in_bits(), e.ValueOrDie().get(),
       &private_key, &public_key);
   if (!status.ok()) return status;
 
-  auto key_proto = RsaPrivateKeySubtleToProto(private_key);
-  auto* public_key_proto = key_proto->mutable_public_key();
-  *public_key_proto->mutable_params() = rsa_ssa_pss_key_format.params();
-  return absl::implicit_cast<StatusOr<std::unique_ptr<RsaSsaPssPrivateKey>>>(
-      std::move(key_proto));
+  RsaSsaPssPrivateKey key_proto =
+      std::move(*RsaPrivateKeySubtleToProto(private_key));
+  *key_proto.mutable_public_key()->mutable_params() = key_format.params();
+  return key_proto;
 }
 
-StatusOr<std::unique_ptr<KeyData>> RsaSsaPssPrivateKeyFactory::GetPublicKeyData(
-    absl::string_view serialized_private_key) const {
-  RsaSsaPssPrivateKey private_key;
-  if (!private_key.ParseFromString(std::string(serialized_private_key))) {
-    return ToStatusF(util::error::INVALID_ARGUMENT,
-                     "Could not parse the passed string as proto '%s'.",
-                     RsaSsaPssVerifyKeyManager::static_key_type().c_str());
-  }
-  auto status = RsaSsaPssSignKeyManager::Validate(private_key);
-  if (!status.ok()) return status;
-  auto key_data = absl::make_unique<KeyData>();
-  key_data->set_type_url(RsaSsaPssVerifyKeyManager::static_key_type());
-  key_data->set_value(private_key.public_key().SerializeAsString());
-  key_data->set_key_material_type(KeyData::ASYMMETRIC_PUBLIC);
-  return std::move(key_data);
-}
-
-constexpr uint32_t RsaSsaPssSignKeyManager::kVersion;
-
-RsaSsaPssSignKeyManager::RsaSsaPssSignKeyManager()
-    : key_factory_(absl::make_unique<RsaSsaPssPrivateKeyFactory>()) {}
-
-const KeyFactory& RsaSsaPssSignKeyManager::get_key_factory() const {
-  return *key_factory_;
-}
-
-uint32_t RsaSsaPssSignKeyManager::get_version() const { return kVersion; }
-
 StatusOr<std::unique_ptr<PublicKeySign>>
-RsaSsaPssSignKeyManager::GetPrimitiveFromKey(
-    const RsaSsaPssPrivateKey& key_proto) const {
-  Status status = Validate(key_proto);
-  if (!status.ok()) return status;
-  auto key = RsaPrivateKeyProtoToSubtle(key_proto);
+RsaSsaPssSignKeyManager::PublicKeySignFactory::Create(
+    const RsaSsaPssPrivateKey& private_key) const {
+  auto key = RsaPrivateKeyProtoToSubtle(private_key);
   subtle::SubtleUtilBoringSSL::RsaSsaPssParams params;
-  const RsaSsaPssParams& params_proto = key_proto.public_key().params();
+  const RsaSsaPssParams& params_proto = private_key.public_key().params();
   params.sig_hash = Enums::ProtoToSubtle(params_proto.sig_hash());
   params.mgf1_hash = Enums::ProtoToSubtle(params_proto.mgf1_hash());
   params.salt_length = params_proto.salt_length();
@@ -167,11 +108,8 @@
   if (!signer.ok()) return signer.status();
   // To check that the key is correct, we sign a test message with private key
   // and verify with public key.
-  auto public_key_data_result =
-      key_factory_->GetPublicKeyData(key_proto.SerializeAsString());
-  auto public_key_data = std::move(public_key_data_result.ValueOrDie());
-  RsaSsaPssVerifyKeyManager verify_key_manager;
-  auto verifier = verify_key_manager.GetPrimitive(*public_key_data);
+  auto verifier = RsaSsaPssVerifyKeyManager().GetPrimitive<PublicKeyVerify>(
+      private_key.public_key());
   if (!verifier.ok()) return verifier.status();
   auto sign_verify_result =
       SignAndVerify(signer.ValueOrDie().get(), verifier.ValueOrDie().get());
@@ -183,19 +121,20 @@
   return signer;
 }
 
-// static
-Status RsaSsaPssSignKeyManager::Validate(const RsaSsaPssPrivateKey& key) {
-  Status status = ValidateVersion(key.version(), kVersion);
+Status RsaSsaPssSignKeyManager::ValidateKey(
+    const RsaSsaPssPrivateKey& key) const {
+  Status status = ValidateVersion(key.version(), get_version());
   if (!status.ok()) return status;
-  return RsaSsaPssVerifyKeyManager::Validate(key.public_key());
+  return RsaSsaPssVerifyKeyManager().ValidateKey(key.public_key());
 }
 
-// static
-Status RsaSsaPssSignKeyManager::Validate(const RsaSsaPssKeyFormat& key_format) {
+Status RsaSsaPssSignKeyManager::ValidateKeyFormat(
+    const RsaSsaPssKeyFormat& key_format) const {
   auto modulus_status = subtle::SubtleUtilBoringSSL::ValidateRsaModulusSize(
       key_format.modulus_size_in_bits());
   if (!modulus_status.ok()) return modulus_status;
-  return RsaSsaPssVerifyKeyManager::Validate(key_format.params());
+  return RsaSsaPssVerifyKeyManager().ValidateParams(key_format.params());
 }
+
 }  // namespace tink
 }  // namespace crypto
diff --git a/cc/signature/rsa_ssa_pss_sign_key_manager.h b/cc/signature/rsa_ssa_pss_sign_key_manager.h
index 7ceb2db..383b480 100644
--- a/cc/signature/rsa_ssa_pss_sign_key_manager.h
+++ b/cc/signature/rsa_ssa_pss_sign_key_manager.h
@@ -20,9 +20,10 @@
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "tink/core/key_manager_base.h"
-#include "tink/key_manager.h"
+#include "tink/core/key_type_manager.h"
+#include "tink/core/private_key_type_manager.h"
 #include "tink/public_key_sign.h"
+#include "tink/util/constants.h"
 #include "tink/util/errors.h"
 #include "tink/util/protobuf_helper.h"
 #include "tink/util/status.h"
@@ -34,37 +35,50 @@
 namespace tink {
 
 class RsaSsaPssSignKeyManager
-    : public KeyManagerBase<PublicKeySign,
-                            google::crypto::tink::RsaSsaPssPrivateKey> {
+    : public PrivateKeyTypeManager<google::crypto::tink::RsaSsaPssPrivateKey,
+                                   google::crypto::tink::RsaSsaPssKeyFormat,
+                                   google::crypto::tink::RsaSsaPssPublicKey,
+                                   List<PublicKeySign>> {
  public:
-  static constexpr uint32_t kVersion = 0;
+  class PublicKeySignFactory : public PrimitiveFactory<PublicKeySign> {
+    crypto::tink::util::StatusOr<std::unique_ptr<PublicKeySign>> Create(
+        const google::crypto::tink::RsaSsaPssPrivateKey& private_key)
+        const override;
+  };
 
-  RsaSsaPssSignKeyManager();
+  RsaSsaPssSignKeyManager()
+      : PrivateKeyTypeManager(absl::make_unique<PublicKeySignFactory>()) {}
 
-  // Returns the version of this key manager.
-  uint32_t get_version() const override;
+  uint32_t get_version() const override { return 0; }
 
-  // Returns a factory that generates keys of the key type
-  // handled by this manager.
-  const KeyFactory& get_key_factory() const override;
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::ASYMMETRIC_PRIVATE;
+  }
 
-  virtual ~RsaSsaPssSignKeyManager() {}
+  const std::string& get_key_type() const override { return key_type_; }
 
- protected:
-  crypto::tink::util::StatusOr<std::unique_ptr<PublicKeySign>>
-  GetPrimitiveFromKey(const google::crypto::tink::RsaSsaPssPrivateKey&
-                          key_proto) const override;
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::RsaSsaPssPrivateKey& key) const override;
+
+  crypto::tink::util::Status ValidateKeyFormat(
+      const google::crypto::tink::RsaSsaPssKeyFormat& key_format)
+      const override;
+
+  crypto::tink::util::StatusOr<google::crypto::tink::RsaSsaPssPrivateKey>
+  CreateKey(const google::crypto::tink::RsaSsaPssKeyFormat& key_format)
+      const override;
+
+  crypto::tink::util::StatusOr<google::crypto::tink::RsaSsaPssPublicKey>
+  GetPublicKey(const google::crypto::tink::RsaSsaPssPrivateKey& private_key)
+      const override {
+    return private_key.public_key();
+  }
 
  private:
-  friend class RsaSsaPssPrivateKeyFactory;
-
-  std::unique_ptr<PrivateKeyFactory> key_factory_;
-
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::RsaSsaPssKeyFormat& key_format);
-
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::RsaSsaPssPrivateKey& key);
+  const std::string key_type_ =
+      absl::StrCat(kTypeGoogleapisCom,
+                   google::crypto::tink::RsaSsaPssPrivateKey().GetTypeName());
 };
 
 }  // namespace tink
diff --git a/cc/signature/rsa_ssa_pss_sign_key_manager_test.cc b/cc/signature/rsa_ssa_pss_sign_key_manager_test.cc
index 210aff0..e6152aa 100644
--- a/cc/signature/rsa_ssa_pss_sign_key_manager_test.cc
+++ b/cc/signature/rsa_ssa_pss_sign_key_manager_test.cc
@@ -1,4 +1,4 @@
-// Copyright 2018 Google Inc.
+// Copyright 2018 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,58 +16,137 @@
 
 #include "tink/signature/rsa_ssa_pss_sign_key_manager.h"
 
+#include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "tink/aead/aead_key_templates.h"
-#include "tink/aead/aes_gcm_key_manager.h"
+#include "absl/container/flat_hash_set.h"
+#include "openssl/rsa.h"
 #include "tink/public_key_sign.h"
-#include "tink/registry.h"
 #include "tink/signature/rsa_ssa_pss_verify_key_manager.h"
 #include "tink/signature/signature_key_templates.h"
+#include "tink/subtle/rsa_ssa_pss_verify_boringssl.h"
 #include "tink/subtle/subtle_util_boringssl.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
-#include "proto/aes_eax.pb.h"
-#include "proto/common.pb.h"
 #include "proto/rsa_ssa_pss.pb.h"
-#include "proto/tink.pb.h"
-
-namespace pb = google::crypto::tink;
 
 namespace crypto {
 namespace tink {
-
-using google::crypto::tink::AesEaxKeyFormat;
-using google::crypto::tink::KeyData;
-using google::crypto::tink::RsaSsaPssKeyFormat;
-using google::crypto::tink::RsaSsaPssPrivateKey;
-using google::crypto::tink::RsaSsaPssPublicKey;
-using subtle::SubtleUtilBoringSSL;
-
 namespace {
 
-class RsaSsaPssSignKeyManagerTest : public ::testing::Test {
- protected:
-  std::string key_type_prefix_ = "type.googleapis.com/";
-  std::string rsa_ssa_pss_sign_key_type_ =
-      "type.googleapis.com/google.crypto.tink.RsaSsaPssPrivateKey";
-};
+using ::crypto::tink::subtle::SubtleUtilBoringSSL;
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::util::StatusOr;
+using ::google::crypto::tink::HashType;
+using ::google::crypto::tink::KeyData;
+using ::google::crypto::tink::RsaSsaPssKeyFormat;
+using ::google::crypto::tink::RsaSsaPssPrivateKey;
+using ::google::crypto::tink::RsaSsaPssPublicKey;
+using ::testing::Eq;
+using ::testing::Gt;
+using ::testing::Not;
+using ::testing::SizeIs;
 
-// Checks whether given key is compatible with the given format.
+TEST(RsaSsaPssSignKeyManagerTest, Basic) {
+  EXPECT_THAT(RsaSsaPssSignKeyManager().get_version(), Eq(0));
+  EXPECT_THAT(RsaSsaPssSignKeyManager().key_material_type(),
+              Eq(KeyData::ASYMMETRIC_PRIVATE));
+  EXPECT_THAT(RsaSsaPssSignKeyManager().get_key_type(),
+              Eq("type.googleapis.com/google.crypto.tink.RsaSsaPssPrivateKey"));
+}
+
+RsaSsaPssKeyFormat CreateKeyFormat(HashType sig_hash, HashType mgf1_hash,
+                                   int salt_length, int modulus_size_in_bits,
+                                   int public_exponent) {
+  RsaSsaPssKeyFormat key_format;
+  auto params = key_format.mutable_params();
+  params->set_sig_hash(sig_hash);
+  params->set_mgf1_hash(mgf1_hash);
+  params->set_salt_length(salt_length);
+  key_format.set_modulus_size_in_bits(modulus_size_in_bits);
+
+  bssl::UniquePtr<BIGNUM> e(BN_new());
+  BN_set_word(e.get(), public_exponent);
+  key_format.set_public_exponent(
+      subtle::SubtleUtilBoringSSL::bn2str(e.get(), BN_num_bytes(e.get()))
+          .ValueOrDie());
+
+  return key_format;
+}
+
+RsaSsaPssKeyFormat ValidKeyFormat() {
+  return CreateKeyFormat(HashType::SHA256, HashType::SHA256, 32, 3072, RSA_F4);
+}
+
+TEST(RsaSsaPssSignKeyManagerTest, ValidateKeyFormat) {
+  EXPECT_THAT(RsaSsaPssSignKeyManager().ValidateKeyFormat(ValidKeyFormat()),
+              IsOk());
+}
+
+TEST(RsaSsaPssSignKeyManagerTest, ValidateKeyFormatSha512Allowed) {
+  RsaSsaPssKeyFormat key_format = ValidKeyFormat();
+  key_format.mutable_params()->set_sig_hash(HashType::SHA512);
+  key_format.mutable_params()->set_mgf1_hash(HashType::SHA512);
+  EXPECT_THAT(RsaSsaPssSignKeyManager().ValidateKeyFormat(ValidKeyFormat()),
+              IsOk());
+}
+
+TEST(RsaSsaPssSignKeyManagerTest, ValidateKeyFormatSha1Disallowed) {
+  RsaSsaPssKeyFormat key_format = ValidKeyFormat();
+  key_format.mutable_params()->set_sig_hash(HashType::SHA1);
+  EXPECT_THAT(RsaSsaPssSignKeyManager().ValidateKeyFormat(key_format),
+              Not(IsOk()));
+}
+
+TEST(RsaSsaPssSignKeyManagerTest, ValidateKeyFormatSmallModulusDisallowed) {
+  RsaSsaPssKeyFormat key_format = ValidKeyFormat();
+  key_format.set_modulus_size_in_bits(512);
+  EXPECT_THAT(RsaSsaPssSignKeyManager().ValidateKeyFormat(key_format),
+              Not(IsOk()));
+}
+
+TEST(RsaSsaPssSignKeyManagerTest, ValidateKeyFormatHashMismatchDisallowed) {
+  RsaSsaPssKeyFormat key_format = ValidKeyFormat();
+  key_format.mutable_params()->set_sig_hash(HashType::SHA512);
+  key_format.mutable_params()->set_mgf1_hash(HashType::SHA256);
+  EXPECT_THAT(RsaSsaPssSignKeyManager().ValidateKeyFormat(key_format),
+              Not(IsOk()));
+}
+
+TEST(RsaSsaPssSignKeyManagerTest, ValidateKeyFormatHashMismatchDisallowed2) {
+  RsaSsaPssKeyFormat key_format = ValidKeyFormat();
+  key_format.mutable_params()->set_sig_hash(HashType::SHA256);
+  key_format.mutable_params()->set_mgf1_hash(HashType::SHA512);
+  EXPECT_THAT(RsaSsaPssSignKeyManager().ValidateKeyFormat(key_format),
+              Not(IsOk()));
+}
+
+TEST(RsaSsaPssSignKeyManagerTest, ValidateKeyFormatUnkownHashDisallowed) {
+  RsaSsaPssKeyFormat key_format = ValidKeyFormat();
+  key_format.mutable_params()->set_sig_hash(HashType::UNKNOWN_HASH);
+  key_format.mutable_params()->set_mgf1_hash(HashType::UNKNOWN_HASH);
+  EXPECT_THAT(RsaSsaPssSignKeyManager().ValidateKeyFormat(key_format),
+              Not(IsOk()));
+}
+
+// Runs several sanity checks, checking if a given private key fits a format.
 void CheckNewKey(const RsaSsaPssPrivateKey& private_key,
                  const RsaSsaPssKeyFormat& key_format) {
-  RsaSsaPssSignKeyManager key_manager;
   RsaSsaPssPublicKey public_key = private_key.public_key();
-  EXPECT_EQ(0, private_key.version());
-  EXPECT_TRUE(private_key.has_public_key());
-  EXPECT_EQ(0, public_key.version());
-  EXPECT_GT(public_key.n().length(), 0);
-  EXPECT_GT(public_key.e().length(), 0);
-  EXPECT_EQ(public_key.params().SerializeAsString(),
-            key_format.params().SerializeAsString());
-  EXPECT_EQ(key_format.public_exponent(), public_key.e());
-  auto primitive_result = key_manager.GetPrimitive(private_key);
-  EXPECT_TRUE(primitive_result.ok()) << primitive_result.status();
+
+  EXPECT_THAT(private_key.version(), Eq(0));
+  EXPECT_THAT(private_key.version(), Eq(public_key.version()));
+  EXPECT_THAT(public_key.n().length(), Gt(0));
+  EXPECT_THAT(public_key.e().length(), Gt(0));
+  EXPECT_THAT(public_key.params().sig_hash(),
+              Eq(key_format.params().sig_hash()));
+  EXPECT_THAT(public_key.params().mgf1_hash(),
+              Eq(key_format.params().mgf1_hash()));
+  EXPECT_THAT(public_key.params().salt_length(),
+              Eq(key_format.params().salt_length()));
+
+  EXPECT_THAT(key_format.public_exponent(), Eq(public_key.e()));
   auto n = std::move(SubtleUtilBoringSSL::str2bn(public_key.n()).ValueOrDie());
   auto d = std::move(SubtleUtilBoringSSL::str2bn(private_key.d()).ValueOrDie());
   auto p = std::move(SubtleUtilBoringSSL::str2bn(private_key.p()).ValueOrDie());
@@ -80,300 +159,149 @@
 
   // Check n = p * q.
   auto n_calc = bssl::UniquePtr<BIGNUM>(BN_new());
-  ASSERT_TRUE(BN_mul(n_calc.get(), p.get(), q.get(), ctx.get()));
-  ASSERT_TRUE(BN_equal_consttime(n_calc.get(), n.get()));
+  EXPECT_TRUE(BN_mul(n_calc.get(), p.get(), q.get(), ctx.get()));
+  EXPECT_TRUE(BN_equal_consttime(n_calc.get(), n.get()));
 
   // Check n size >= modulus_size_in_bits bit.
   EXPECT_GE(BN_num_bits(n.get()), key_format.modulus_size_in_bits());
 
   // dp = d mod (p - 1)
   auto pm1 = bssl::UniquePtr<BIGNUM>(BN_dup(p.get()));
-  ASSERT_TRUE(BN_sub_word(pm1.get(), 1));
+  EXPECT_TRUE(BN_sub_word(pm1.get(), 1));
   auto dp_calc = bssl::UniquePtr<BIGNUM>(BN_new());
-  ASSERT_TRUE(BN_mod(dp_calc.get(), d.get(), pm1.get(), ctx.get()));
-  ASSERT_TRUE(BN_equal_consttime(dp_calc.get(), dp.get()));
+  EXPECT_TRUE(BN_mod(dp_calc.get(), d.get(), pm1.get(), ctx.get()));
+  EXPECT_TRUE(BN_equal_consttime(dp_calc.get(), dp.get()));
 
   // dq = d mod (q - 1)
   auto qm1 = bssl::UniquePtr<BIGNUM>(BN_dup(q.get()));
-  ASSERT_TRUE(BN_sub_word(qm1.get(), 1));
+  EXPECT_TRUE(BN_sub_word(qm1.get(), 1));
   auto dq_calc = bssl::UniquePtr<BIGNUM>(BN_new());
-  ASSERT_TRUE(BN_mod(dq_calc.get(), d.get(), qm1.get(), ctx.get()));
-
-  ASSERT_TRUE(BN_equal_consttime(dq_calc.get(), dq.get()));
+  EXPECT_TRUE(BN_mod(dq_calc.get(), d.get(), qm1.get(), ctx.get()));
+  EXPECT_TRUE(BN_equal_consttime(dq_calc.get(), dq.get()));
 }
 
-TEST_F(RsaSsaPssSignKeyManagerTest, Basic) {
-  RsaSsaPssSignKeyManager key_manager;
-  EXPECT_EQ(0, key_manager.get_version());
-  EXPECT_EQ("type.googleapis.com/google.crypto.tink.RsaSsaPssPrivateKey",
-            key_manager.get_key_type());
-  EXPECT_TRUE(key_manager.DoesSupport(key_manager.get_key_type()));
+TEST(RsaSsaPssSignKeyManagerTest, CreateKey) {
+  RsaSsaPssKeyFormat key_format = ValidKeyFormat();
+  StatusOr<RsaSsaPssPrivateKey> private_key_or =
+      RsaSsaPssSignKeyManager().CreateKey(key_format);
+  ASSERT_THAT(private_key_or.status(), IsOk());
+  CheckNewKey(private_key_or.ValueOrDie(), key_format);
 }
 
-TEST_F(RsaSsaPssSignKeyManagerTest, NewKeyFromKeyFormat) {
-  RsaSsaPssSignKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-  RsaSsaPssKeyFormat key_format;
-  ASSERT_TRUE(key_format.ParseFromString(
-      SignatureKeyTemplates::RsaSsaPss3072Sha256Sha256F4().value()));
-  auto result = key_factory.NewKey(key_format);
-  EXPECT_TRUE(result.ok()) << result.status();
-  auto key = std::move(result.ValueOrDie());
-  ASSERT_EQ(rsa_ssa_pss_sign_key_type_, key_type_prefix_ + key->GetTypeName());
-  std::unique_ptr<RsaSsaPssPrivateKey> rsa_key(
-      static_cast<RsaSsaPssPrivateKey*>(key.release()));
-  CheckNewKey(*rsa_key, key_format);
+TEST(RsaSsaPssSignKeyManagerTest, CreateKeySmallKey) {
+  RsaSsaPssKeyFormat key_format =
+      CreateKeyFormat(HashType::SHA256, HashType::SHA256, 32, 3072, RSA_F4);
+
+  StatusOr<RsaSsaPssPrivateKey> private_key_or =
+      RsaSsaPssSignKeyManager().CreateKey(key_format);
+  ASSERT_THAT(private_key_or.status(), IsOk());
+  CheckNewKey(private_key_or.ValueOrDie(), key_format);
 }
 
-TEST_F(RsaSsaPssSignKeyManagerTest, NewKeyFromSerializedKeyFormat) {
-  RsaSsaPssSignKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-  RsaSsaPssKeyFormat key_format;
-  ASSERT_TRUE(key_format.ParseFromString(
-      SignatureKeyTemplates::RsaSsaPss4096Sha512Sha512F4().value()));
-  auto result = key_factory.NewKey(key_format.SerializeAsString());
-  EXPECT_TRUE(result.ok()) << result.status();
-  auto key = std::move(result.ValueOrDie());
-  ASSERT_EQ(rsa_ssa_pss_sign_key_type_, key_type_prefix_ + key->GetTypeName());
-  std::unique_ptr<RsaSsaPssPrivateKey> rsa_key(
-      static_cast<RsaSsaPssPrivateKey*>(key.release()));
-  CheckNewKey(*rsa_key, key_format);
+TEST(RsaSsaPssSignKeyManagerTest, CreateKeyLargeKey) {
+  RsaSsaPssKeyFormat key_format =
+      CreateKeyFormat(HashType::SHA512, HashType::SHA512, 64, 4096, RSA_F4);
+
+  StatusOr<RsaSsaPssPrivateKey> private_key_or =
+      RsaSsaPssSignKeyManager().CreateKey(key_format);
+  ASSERT_THAT(private_key_or.status(), IsOk());
+  CheckNewKey(private_key_or.ValueOrDie(), key_format);
 }
 
-TEST_F(RsaSsaPssSignKeyManagerTest, NewKeyDataFromSerializedKeyFormat) {
-  RsaSsaPssSignKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-  RsaSsaPssKeyFormat key_format;
-  ASSERT_TRUE(key_format.ParseFromString(
-      SignatureKeyTemplates::RsaSsaPss4096Sha512Sha512F4().value()));
-  auto result = key_factory.NewKeyData(key_format.SerializeAsString());
-  EXPECT_TRUE(result.ok()) << result.status();
-  auto key_data = std::move(result.ValueOrDie());
-  ASSERT_EQ(rsa_ssa_pss_sign_key_type_, key_data->type_url());
-  RsaSsaPssPrivateKey rsa_key;
-  ASSERT_TRUE(rsa_key.ParseFromString(key_data->value()));
-  CheckNewKey(rsa_key, key_format);
+TEST(RsaSsaPssSignKeyManagerTest, CreateKeyValid) {
+  StatusOr<RsaSsaPssPrivateKey> key_or =
+      RsaSsaPssSignKeyManager().CreateKey(ValidKeyFormat());
+  ASSERT_THAT(key_or.status(), IsOk());
+  EXPECT_THAT(RsaSsaPssSignKeyManager().ValidateKey(key_or.ValueOrDie()),
+              IsOk());
 }
 
-TEST_F(RsaSsaPssSignKeyManagerTest, PublicKeyExtraction) {
-  RsaSsaPssSignKeyManager sign_key_manager;
-  auto private_key_factory = dynamic_cast<const PrivateKeyFactory*>(
-      &(sign_key_manager.get_key_factory()));
-  ASSERT_NE(private_key_factory, nullptr);
-  auto new_key_result = private_key_factory->NewKey(
-      SignatureKeyTemplates::RsaSsaPss3072Sha256Sha256F4().value());
-  std::unique_ptr<RsaSsaPssPrivateKey> private_key(
-      static_cast<RsaSsaPssPrivateKey*>(new_key_result.ValueOrDie().release()));
-  auto public_key_data_result =
-      private_key_factory->GetPublicKeyData(private_key->SerializeAsString());
-  EXPECT_TRUE(public_key_data_result.ok()) << public_key_data_result.status();
-  auto public_key_data = std::move(public_key_data_result.ValueOrDie());
-  EXPECT_EQ(RsaSsaPssVerifyKeyManager::static_key_type(),
-            public_key_data->type_url());
-  EXPECT_EQ(KeyData::ASYMMETRIC_PUBLIC, public_key_data->key_material_type());
-  EXPECT_EQ(private_key->public_key().SerializeAsString(),
-            public_key_data->value());
-  // Sign with private key and verify with public key.
-  RsaSsaPssVerifyKeyManager verify_key_manager;
-  auto signer = sign_key_manager.GetPrimitive(*private_key);
-  auto verifier = verify_key_manager.GetPrimitive(*public_key_data);
-  std::string message = "Wycheproof";
-  EXPECT_TRUE(
-      verifier.ValueOrDie()
-          ->Verify(signer.ValueOrDie()->Sign(message).ValueOrDie(), message)
-          .ok());
-}
-
-TEST_F(RsaSsaPssSignKeyManagerTest, NewKeyWithWeakSignatureHash) {
-  RsaSsaPssSignKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-  RsaSsaPssKeyFormat key_format;
-  ASSERT_TRUE(key_format.ParseFromString(
-      SignatureKeyTemplates::RsaSsaPss3072Sha256Sha256F4().value()));
-  key_format.mutable_params()->set_sig_hash(pb::HashType::SHA1);
-  auto result = key_factory.NewKey(key_format.SerializeAsString());
-  EXPECT_FALSE(result.ok());
-  EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-  EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                      "SHA1 is not safe for digital signature",
-                      result.status().error_message());
-}
-
-TEST_F(RsaSsaPssSignKeyManagerTest, NewKeyWithSmallModulus) {
-  RsaSsaPssSignKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-  RsaSsaPssKeyFormat key_format;
-  ASSERT_TRUE(key_format.ParseFromString(
-      SignatureKeyTemplates::RsaSsaPss3072Sha256Sha256F4().value()));
-  key_format.set_modulus_size_in_bits(512);
-  auto result = key_factory.NewKey(key_format.SerializeAsString());
-  EXPECT_FALSE(result.ok());
-  EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-  EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                      "only modulus size >= 2048-bit is supported",
-                      result.status().error_message());
-}
-
-TEST_F(RsaSsaPssSignKeyManagerTest, NewKeyWithMismatchMg1HashAndSigHash) {
-  RsaSsaPssSignKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-  RsaSsaPssKeyFormat key_format;
-  ASSERT_TRUE(key_format.ParseFromString(
-      SignatureKeyTemplates::RsaSsaPss3072Sha256Sha256F4().value()));
-  key_format.mutable_params()->set_sig_hash(pb::HashType::SHA512);
-  key_format.mutable_params()->set_mgf1_hash(pb::HashType::SHA256);
-  auto result = key_factory.NewKey(key_format.SerializeAsString());
-  EXPECT_FALSE(result.ok());
-  EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-}
-
-TEST_F(RsaSsaPssSignKeyManagerTest,
-       GetPrimitiveWithMismatchMgf1HashAndSigHash) {
-  RsaSsaPssSignKeyManager sign_key_manager;
-  auto private_key_factory = dynamic_cast<const PrivateKeyFactory*>(
-      &(sign_key_manager.get_key_factory()));
-  ASSERT_NE(private_key_factory, nullptr);
-  auto new_key_result = private_key_factory->NewKey(
-      SignatureKeyTemplates::RsaSsaPss3072Sha256Sha256F4().value());
-  std::unique_ptr<RsaSsaPssPrivateKey> private_key(
-      static_cast<RsaSsaPssPrivateKey*>(new_key_result.ValueOrDie().release()));
-  private_key->mutable_public_key()->mutable_params()->set_sig_hash(
-      pb::HashType::SHA256);
-  private_key->mutable_public_key()->mutable_params()->set_mgf1_hash(
-      pb::HashType::SHA512);
-
-  auto result = sign_key_manager.GetPrimitive(*private_key);
-  EXPECT_FALSE(result.ok());
-  EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-}
-
-TEST_F(RsaSsaPssSignKeyManagerTest, GetPrimitiveWithWeakSignatureHash) {
-  RsaSsaPssSignKeyManager sign_key_manager;
-  auto private_key_factory = dynamic_cast<const PrivateKeyFactory*>(
-      &(sign_key_manager.get_key_factory()));
-  ASSERT_NE(private_key_factory, nullptr);
-  auto new_key_result = private_key_factory->NewKey(
-      SignatureKeyTemplates::RsaSsaPss3072Sha256Sha256F4().value());
-  std::unique_ptr<RsaSsaPssPrivateKey> private_key(
-      static_cast<RsaSsaPssPrivateKey*>(new_key_result.ValueOrDie().release()));
-  private_key->mutable_public_key()->mutable_params()->set_sig_hash(
-      pb::HashType::SHA1);
-  auto result = sign_key_manager.GetPrimitive(*private_key);
-  EXPECT_FALSE(result.ok());
-  EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-  EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                      "SHA1 is not safe for digital signature",
-                      result.status().error_message());
-}
-
-TEST_F(RsaSsaPssSignKeyManagerTest, GetPrimitiveWithSmallModulus) {
-  RsaSsaPssSignKeyManager sign_key_manager;
-  auto private_key_factory = dynamic_cast<const PrivateKeyFactory*>(
-      &(sign_key_manager.get_key_factory()));
-  ASSERT_NE(private_key_factory, nullptr);
-  auto new_key_result = private_key_factory->NewKey(
-      SignatureKeyTemplates::RsaSsaPss3072Sha256Sha256F4().value());
-  std::unique_ptr<RsaSsaPssPrivateKey> private_key(
-      static_cast<RsaSsaPssPrivateKey*>(new_key_result.ValueOrDie().release()));
-  private_key->mutable_public_key()->set_n("\x23");
-  private_key->mutable_public_key()->set_e("\x3");
-  auto result = sign_key_manager.GetPrimitive(*private_key);
-  EXPECT_FALSE(result.ok());
-  EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-  EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                      "only modulus size >= 2048-bit is supported",
-                      result.status().error_message());
-}
-
-TEST_F(RsaSsaPssSignKeyManagerTest, KeyDataErrors) {
-  RsaSsaPssSignKeyManager key_manager;
-
-  {  // Bad key type.
-    KeyData key_data;
-    std::string bad_key_type = "type.googleapis.com/google.crypto.tink.SomeOtherKey";
-    key_data.set_type_url(bad_key_type);
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, bad_key_type,
-                        result.status().error_message());
+// Check that in a bunch of CreateKey calls all generated primes are distinct.
+TEST(RsaSsaPssSignKeyManagerTest, CreateKeyAlwaysNewRsaPair) {
+  absl::flat_hash_set<std::string> keys;
+  // This test takes about a second per key.
+  int num_generated_keys = 5;
+  for (int i = 0; i < num_generated_keys; ++i) {
+    StatusOr<RsaSsaPssPrivateKey> key_or =
+        RsaSsaPssSignKeyManager().CreateKey(ValidKeyFormat());
+    ASSERT_THAT(key_or.status(), IsOk());
+    keys.insert(key_or.ValueOrDie().p());
+    keys.insert(key_or.ValueOrDie().q());
   }
-
-  {  // Bad key value.
-    KeyData key_data;
-    key_data.set_type_url(rsa_ssa_pss_sign_key_type_);
-    key_data.set_value("some bad serialized proto");
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
-
-  {  // Bad version.
-    KeyData key_data;
-    RsaSsaPssPrivateKey key;
-    key.set_version(1);
-    key_data.set_type_url(rsa_ssa_pss_sign_key_type_);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "version",
-                        result.status().error_message());
-  }
+  EXPECT_THAT(keys, SizeIs(2 * num_generated_keys));
 }
 
-TEST_F(RsaSsaPssSignKeyManagerTest, NewKeyErrors) {
-  RsaSsaPssSignKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-
-  // Empty key format.
-  RsaSsaPssKeyFormat key_format;
-  {
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-  }
-
-  // Bad serialized format.
-  {
-    auto result = key_factory.NewKey("some bad serialization");
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-  }
-
-  // Wrong format proto.
-  {
-    AesEaxKeyFormat wrong_key_format;
-    auto result = key_factory.NewKey(wrong_key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-  }
+TEST(RsaSsaPssSignKeyManagerTest, GetPublicKey) {
+  StatusOr<RsaSsaPssPrivateKey> key_or =
+      RsaSsaPssSignKeyManager().CreateKey(ValidKeyFormat());
+  ASSERT_THAT(key_or.status(), IsOk());
+  StatusOr<RsaSsaPssPublicKey> public_key_or =
+      RsaSsaPssSignKeyManager().GetPublicKey(key_or.ValueOrDie());
+  ASSERT_THAT(public_key_or.status(), IsOk());
+  EXPECT_THAT(public_key_or.ValueOrDie().version(),
+              Eq(key_or.ValueOrDie().public_key().version()));
+  EXPECT_THAT(public_key_or.ValueOrDie().n(),
+              Eq(key_or.ValueOrDie().public_key().n()));
+  EXPECT_THAT(public_key_or.ValueOrDie().e(),
+              Eq(key_or.ValueOrDie().public_key().e()));
 }
 
-TEST_F(RsaSsaPssSignKeyManagerTest, PublicKeyExtractionErrors) {
-  RsaSsaPssSignKeyManager key_manager;
-  auto private_key_factory =
-      dynamic_cast<const PrivateKeyFactory*>(&(key_manager.get_key_factory()));
-  ASSERT_NE(private_key_factory, nullptr);
+TEST(EcdsaSignKeyManagerTest, Create) {
+  RsaSsaPssKeyFormat key_format =
+      CreateKeyFormat(HashType::SHA256, HashType::SHA256, 32, 3072, RSA_F4);
+  StatusOr<RsaSsaPssPrivateKey> key_or =
+      RsaSsaPssSignKeyManager().CreateKey(key_format);
+  ASSERT_THAT(key_or.status(), IsOk());
+  RsaSsaPssPrivateKey key = key_or.ValueOrDie();
 
-  AesGcmKeyManager aead_key_manager;
-  auto aead_private_key_factory = dynamic_cast<const PrivateKeyFactory*>(
-      &(aead_key_manager.get_key_factory()));
-  ASSERT_EQ(nullptr, aead_private_key_factory);
+  auto signer_or = RsaSsaPssSignKeyManager().GetPrimitive<PublicKeySign>(key);
+  ASSERT_THAT(signer_or.status(), IsOk());
 
-  auto aead_key_result = aead_key_manager.get_key_factory().NewKey(
-      AeadKeyTemplates::Aes128Gcm().value());
-  ASSERT_TRUE(aead_key_result.ok()) << aead_key_result.status();
-  auto aead_key = std::move(aead_key_result.ValueOrDie());
-  auto public_key_data_result =
-      private_key_factory->GetPublicKeyData(aead_key->SerializeAsString());
-  EXPECT_FALSE(public_key_data_result.ok());
-  EXPECT_EQ(util::error::INVALID_ARGUMENT,
-            public_key_data_result.status().error_code());
+  subtle::SubtleUtilBoringSSL::RsaSsaPssParams params;
+  params.sig_hash = subtle::HashType::SHA256;
+  params.mgf1_hash = subtle::HashType::SHA256;
+  params.salt_length = 32;
+  auto direct_verifier_or = subtle::RsaSsaPssVerifyBoringSsl::New(
+      {key.public_key().n(), key.public_key().e()}, params);
+
+  ASSERT_THAT(direct_verifier_or.status(), IsOk());
+
+  std::string message = "Some message";
+  EXPECT_THAT(direct_verifier_or.ValueOrDie()->Verify(
+                  signer_or.ValueOrDie()->Sign(message).ValueOrDie(), message),
+              IsOk());
+}
+
+TEST(EcdsaSignKeyManagerTest, CreateWrongKey) {
+  RsaSsaPssKeyFormat key_format =
+      CreateKeyFormat(HashType::SHA256, HashType::SHA256, 32, 3072, RSA_F4);
+  StatusOr<RsaSsaPssPrivateKey> key_or =
+      RsaSsaPssSignKeyManager().CreateKey(key_format);
+  ASSERT_THAT(key_or.status(), IsOk());
+  RsaSsaPssPrivateKey key = key_or.ValueOrDie();
+
+  auto signer_or = RsaSsaPssSignKeyManager().GetPrimitive<PublicKeySign>(key);
+
+  StatusOr<RsaSsaPssPrivateKey> second_key_or =
+      RsaSsaPssSignKeyManager().CreateKey(key_format);
+  ASSERT_THAT(second_key_or.status(), IsOk());
+  RsaSsaPssPrivateKey second_key = second_key_or.ValueOrDie();
+
+  ASSERT_THAT(signer_or.status(), IsOk());
+
+  subtle::SubtleUtilBoringSSL::RsaSsaPssParams params;
+  params.sig_hash = subtle::HashType::SHA256;
+  params.mgf1_hash = subtle::HashType::SHA256;
+  params.salt_length = 32;
+  auto direct_verifier_or = subtle::RsaSsaPssVerifyBoringSsl::New(
+      {second_key.public_key().n(), second_key.public_key().e()}, params);
+
+  ASSERT_THAT(direct_verifier_or.status(), IsOk());
+
+  std::string message = "Some message";
+  EXPECT_THAT(direct_verifier_or.ValueOrDie()->Verify(
+                  signer_or.ValueOrDie()->Sign(message).ValueOrDie(), message),
+              Not(IsOk()));
 }
 
 }  // namespace
diff --git a/cc/signature/rsa_ssa_pss_verify_key_manager.cc b/cc/signature/rsa_ssa_pss_verify_key_manager.cc
index 4ffe374..fb11657 100644
--- a/cc/signature/rsa_ssa_pss_verify_key_manager.cc
+++ b/cc/signature/rsa_ssa_pss_verify_key_manager.cc
@@ -17,7 +17,6 @@
 #include "tink/signature/rsa_ssa_pss_verify_key_manager.h"
 
 #include "absl/strings/string_view.h"
-#include "tink/key_manager.h"
 #include "tink/public_key_verify.h"
 #include "tink/subtle/rsa_ssa_pss_verify_boringssl.h"
 #include "tink/subtle/subtle_util_boringssl.h"
@@ -38,32 +37,12 @@
 using crypto::tink::util::Enums;
 using crypto::tink::util::Status;
 using crypto::tink::util::StatusOr;
-using google::crypto::tink::HashType;
-using google::crypto::tink::KeyData;
-using google::crypto::tink::RsaSsaPssKeyFormat;
 using google::crypto::tink::RsaSsaPssParams;
 using google::crypto::tink::RsaSsaPssPublicKey;
-using portable_proto::MessageLite;
-
-constexpr uint32_t RsaSsaPssVerifyKeyManager::kVersion;
-
-RsaSsaPssVerifyKeyManager::RsaSsaPssVerifyKeyManager()
-    : key_factory_(KeyFactory::AlwaysFailingFactory(
-          util::Status(util::error::UNIMPLEMENTED,
-                       "Operation not supported for public keys, "
-                       "please use the RsaSsaPssSignKeyManager."))) {}
-
-const KeyFactory& RsaSsaPssVerifyKeyManager::get_key_factory() const {
-  return *key_factory_;
-}
-
-uint32_t RsaSsaPssVerifyKeyManager::get_version() const { return kVersion; }
 
 StatusOr<std::unique_ptr<PublicKeyVerify>>
-RsaSsaPssVerifyKeyManager::GetPrimitiveFromKey(
+RsaSsaPssVerifyKeyManager::PublicKeyVerifyFactory::Create(
     const RsaSsaPssPublicKey& rsa_ssa_pss_public_key) const {
-  Status status = Validate(rsa_ssa_pss_public_key);
-  if (!status.ok()) return status;
   subtle::SubtleUtilBoringSSL::RsaPublicKey rsa_pub_key;
   rsa_pub_key.n = rsa_ssa_pss_public_key.n();
   rsa_pub_key.e = rsa_ssa_pss_public_key.e();
@@ -82,8 +61,20 @@
   return std::move(rsa_ssa_pss);
 }
 
-// static
-Status RsaSsaPssVerifyKeyManager::Validate(const RsaSsaPssParams& params) {
+Status RsaSsaPssVerifyKeyManager::ValidateKey(
+    const RsaSsaPssPublicKey& key) const {
+  Status status = ValidateVersion(key.version(), get_version());
+  if (!status.ok()) return status;
+  auto status_or_n = subtle::SubtleUtilBoringSSL::str2bn(key.n());
+  if (!status_or_n.ok()) return status_or_n.status();
+  auto modulus_status = subtle::SubtleUtilBoringSSL::ValidateRsaModulusSize(
+      BN_num_bits(status_or_n.ValueOrDie().get()));
+  if (!modulus_status.ok()) return modulus_status;
+  return ValidateParams(key.params());
+}
+
+Status RsaSsaPssVerifyKeyManager::ValidateParams(
+    const RsaSsaPssParams& params) const {
   auto hash_result = subtle::SubtleUtilBoringSSL::ValidateSignatureHash(
       Enums::ProtoToSubtle(params.sig_hash()));
   if (!hash_result.ok()) return hash_result;
@@ -106,17 +97,5 @@
   return Status::OK;
 }
 
-// static
-Status RsaSsaPssVerifyKeyManager::Validate(const RsaSsaPssPublicKey& key) {
-  Status status = ValidateVersion(key.version(), kVersion);
-  if (!status.ok()) return status;
-  auto status_or_n = subtle::SubtleUtilBoringSSL::str2bn(key.n());
-  if (!status_or_n.ok()) return status_or_n.status();
-  auto modulus_status = subtle::SubtleUtilBoringSSL::ValidateRsaModulusSize(
-      BN_num_bits(status_or_n.ValueOrDie().get()));
-  if (!modulus_status.ok()) return modulus_status;
-  return Validate(key.params());
-}
-
 }  // namespace tink
 }  // namespace crypto
diff --git a/cc/signature/rsa_ssa_pss_verify_key_manager.h b/cc/signature/rsa_ssa_pss_verify_key_manager.h
index 022b723..51caadf 100644
--- a/cc/signature/rsa_ssa_pss_verify_key_manager.h
+++ b/cc/signature/rsa_ssa_pss_verify_key_manager.h
@@ -20,9 +20,10 @@
 #include <vector>
 
 #include "absl/strings/string_view.h"
-#include "tink/core/key_manager_base.h"
-#include "tink/key_manager.h"
+#include "tink/core/private_key_type_manager.h"
+#include "tink/public_key_sign.h"
 #include "tink/public_key_verify.h"
+#include "tink/util/constants.h"
 #include "tink/util/errors.h"
 #include "tink/util/protobuf_helper.h"
 #include "tink/util/status.h"
@@ -34,38 +35,37 @@
 namespace tink {
 
 class RsaSsaPssVerifyKeyManager
-    : public KeyManagerBase<PublicKeyVerify,
-                            google::crypto::tink::RsaSsaPssPublicKey> {
+    : public KeyTypeManager<google::crypto::tink::RsaSsaPssPublicKey, void,
+                            List<PublicKeyVerify>> {
  public:
-  static constexpr uint32_t kVersion = 0;
+  class PublicKeyVerifyFactory : public PrimitiveFactory<PublicKeyVerify> {
+    crypto::tink::util::StatusOr<std::unique_ptr<PublicKeyVerify>> Create(
+        const google::crypto::tink::RsaSsaPssPublicKey& rsa_ssa_pss_public_key)
+        const override;
+  };
 
-  RsaSsaPssVerifyKeyManager();
+  RsaSsaPssVerifyKeyManager()
+      : KeyTypeManager(absl::make_unique<PublicKeyVerifyFactory>()) {}
 
-  // Returns the version of this key manager.
-  uint32_t get_version() const override;
+  uint32_t get_version() const override { return 0; }
 
-  // Returns a factory that generates keys of the key type
-  // handled by this manager.
-  const KeyFactory& get_key_factory() const override;
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::ASYMMETRIC_PUBLIC;
+  }
 
-  virtual ~RsaSsaPssVerifyKeyManager() {}
+  const std::string& get_key_type() const override { return key_type_; }
 
- protected:
-  crypto::tink::util::StatusOr<std::unique_ptr<PublicKeyVerify>>
-  GetPrimitiveFromKey(const google::crypto::tink::RsaSsaPssPublicKey&
-                          rsa_ssa_pss_public_key) const override;
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::RsaSsaPssPublicKey& key) const override;
+
+  crypto::tink::util::Status ValidateParams(
+      const google::crypto::tink::RsaSsaPssParams& params) const;
 
  private:
-  // Friends that re-use proto validation helpers.
-  friend class RsaSsaPssPrivateKeyFactory;
-  friend class RsaSsaPssSignKeyManager;
-
-  std::unique_ptr<KeyFactory> key_factory_;
-
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::RsaSsaPssParams& params);
-  static crypto::tink::util::Status Validate(
-      const google::crypto::tink::RsaSsaPssPublicKey& key);
+  const std::string key_type_ =
+      absl::StrCat(kTypeGoogleapisCom,
+                   google::crypto::tink::RsaSsaPssPublicKey().GetTypeName());
 };
 
 }  // namespace tink
diff --git a/cc/signature/rsa_ssa_pss_verify_key_manager_test.cc b/cc/signature/rsa_ssa_pss_verify_key_manager_test.cc
index 674ebe2..a8fa3a9 100644
--- a/cc/signature/rsa_ssa_pss_verify_key_manager_test.cc
+++ b/cc/signature/rsa_ssa_pss_verify_key_manager_test.cc
@@ -16,37 +16,159 @@
 
 #include "tink/signature/rsa_ssa_pss_verify_key_manager.h"
 
+#include "gmock/gmock.h"
 #include "gtest/gtest.h"
 #include "absl/strings/escaping.h"
+#include "openssl/rsa.h"
 #include "tink/public_key_sign.h"
 #include "tink/public_key_verify.h"
-
-#include "tink/registry.h"
+#include "tink/signature/rsa_ssa_pss_sign_key_manager.h"
+#include "tink/subtle/rsa_ssa_pss_sign_boringssl.h"
+#include "tink/subtle/subtle_util_boringssl.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
-#include "proto/common.pb.h"
 #include "proto/rsa_ssa_pss.pb.h"
-#include "proto/tink.pb.h"
 
-namespace pb = google::crypto::tink;
-
-// TODO(quannguyen): add more tests once RsaSsaPssSignKeyManager is available.
 namespace crypto {
 namespace tink {
-
-using google::crypto::tink::KeyData;
-using google::crypto::tink::RsaSsaPssKeyFormat;
-using google::crypto::tink::RsaSsaPssPublicKey;
-
 namespace {
 
-class RsaSsaPssVerifyKeyManagerTest : public ::testing::Test {
- protected:
-  std::string key_type_prefix_ = "type.googleapis.com/";
-  std::string rsa_ssa_pss_verify_key_type_ =
-      "type.googleapis.com/google.crypto.tink.RsaSsaPssPublicKey";
-};
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
+using ::crypto::tink::util::StatusOr;
+using ::google::crypto::tink::HashType;
+using ::google::crypto::tink::KeyData;
+using ::google::crypto::tink::RsaSsaPssKeyFormat;
+using ::google::crypto::tink::RsaSsaPssPrivateKey;
+using ::google::crypto::tink::RsaSsaPssPublicKey;
+using ::testing::Eq;
+using ::testing::Not;
+using ::testing::HasSubstr;
+
+TEST(RsaSsaPssVerifyKeyManagerTest, Basics) {
+  EXPECT_THAT(RsaSsaPssVerifyKeyManager().get_version(), Eq(0));
+  EXPECT_THAT(RsaSsaPssVerifyKeyManager().key_material_type(),
+              Eq(KeyData::ASYMMETRIC_PUBLIC));
+  EXPECT_THAT(RsaSsaPssVerifyKeyManager().get_key_type(),
+              Eq("type.googleapis.com/google.crypto.tink.RsaSsaPssPublicKey"));
+}
+
+TEST(RsaSsaPssVerifyKeyManagerTest, ValidateEmptyKey) {
+  EXPECT_THAT(RsaSsaPssVerifyKeyManager().ValidateKey(RsaSsaPssPublicKey()),
+              Not(IsOk()));
+}
+
+RsaSsaPssKeyFormat CreateKeyFormat(HashType sig_hash, HashType mgf1_hash,
+                                   int salt_length, int modulus_size_in_bits,
+                                   int public_exponent) {
+  RsaSsaPssKeyFormat key_format;
+  auto params = key_format.mutable_params();
+  params->set_sig_hash(sig_hash);
+  params->set_mgf1_hash(mgf1_hash);
+  params->set_salt_length(salt_length);
+  key_format.set_modulus_size_in_bits(modulus_size_in_bits);
+
+  bssl::UniquePtr<BIGNUM> e(BN_new());
+  BN_set_word(e.get(), public_exponent);
+  key_format.set_public_exponent(
+      subtle::SubtleUtilBoringSSL::bn2str(e.get(), BN_num_bytes(e.get()))
+          .ValueOrDie());
+
+  return key_format;
+}
+
+RsaSsaPssKeyFormat ValidKeyFormat() {
+  return CreateKeyFormat(HashType::SHA256, HashType::SHA256, 32, 3072, RSA_F4);
+}
+
+RsaSsaPssPrivateKey CreateValidPrivateKey() {
+  return RsaSsaPssSignKeyManager().CreateKey(ValidKeyFormat()).ValueOrDie();
+}
+
+RsaSsaPssPublicKey CreateValidPublicKey() {
+  return RsaSsaPssSignKeyManager()
+      .GetPublicKey(CreateValidPrivateKey())
+      .ValueOrDie();
+}
+
+// Checks that a public key generaed by the SignKeyManager is considered valid.
+TEST(RsaSsaPssVerifyKeyManagerTest, PublicKeyValid) {
+  RsaSsaPssPublicKey key = CreateValidPublicKey();
+  EXPECT_THAT(RsaSsaPssVerifyKeyManager().ValidateKey(key), IsOk());
+}
+
+TEST(RsaSsaPssVerifyKeyManagerTest, PublicKeyWrongVersion) {
+  RsaSsaPssPublicKey key = CreateValidPublicKey();
+  key.set_version(1);
+  EXPECT_THAT(RsaSsaPssVerifyKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(RsaSsaPssVerifyKeyManagerTest, PublicKeyHashMismatchDisallowed) {
+  RsaSsaPssPublicKey key = CreateValidPublicKey();
+  key.mutable_params()->set_sig_hash(HashType::SHA512);
+  key.mutable_params()->set_mgf1_hash(HashType::SHA256);
+  EXPECT_THAT(RsaSsaPssVerifyKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(RsaSsaPssVerifyKeyManagerTest, PublicKeyHashMismatchDisallowed2) {
+  RsaSsaPssPublicKey key = CreateValidPublicKey();
+  key.mutable_params()->set_sig_hash(HashType::SHA256);
+  key.mutable_params()->set_mgf1_hash(HashType::SHA512);
+  EXPECT_THAT(RsaSsaPssVerifyKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(RsaSsaPssVerifyKeyManagerTest, PublicKeyUnkownHashDisallowed) {
+  RsaSsaPssPublicKey key = CreateValidPublicKey();
+  key.mutable_params()->set_sig_hash(HashType::UNKNOWN_HASH);
+  key.mutable_params()->set_mgf1_hash(HashType::UNKNOWN_HASH);
+  EXPECT_THAT(RsaSsaPssVerifyKeyManager().ValidateKey(key), Not(IsOk()));
+}
+
+TEST(RsaSsaPssVerifyKeyManagerTest, ValidateKeyFormatSmallModulusDisallowed) {
+  RsaSsaPssPublicKey key = CreateValidPublicKey();
+  key.set_n("\x23");
+  key.set_e("\x3");
+  EXPECT_THAT(RsaSsaPssVerifyKeyManager().ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT,
+                       HasSubstr("only modulus size >= 2048")));
+}
+
+TEST(RsaSsaPssSignKeyManagerTest, Create) {
+  RsaSsaPssKeyFormat key_format =
+      CreateKeyFormat(HashType::SHA256, HashType::SHA256, 32, 3072, RSA_F4);
+  StatusOr<RsaSsaPssPrivateKey> private_key_or =
+      RsaSsaPssSignKeyManager().CreateKey(key_format);
+  ASSERT_THAT(private_key_or.status(), IsOk());
+  RsaSsaPssPrivateKey private_key = private_key_or.ValueOrDie();
+  RsaSsaPssPublicKey public_key =
+      RsaSsaPssSignKeyManager().GetPublicKey(private_key).ValueOrDie();
+
+  subtle::SubtleUtilBoringSSL::RsaPrivateKey private_key_subtle;
+  private_key_subtle.n = private_key.public_key().n();
+  private_key_subtle.e = private_key.public_key().e();
+  private_key_subtle.d = private_key.d();
+  private_key_subtle.p = private_key.p();
+  private_key_subtle.q = private_key.q();
+  private_key_subtle.dp = private_key.dp();
+  private_key_subtle.dq = private_key.dq();
+  private_key_subtle.crt = private_key.crt();
+
+  auto direct_signer_or = subtle::RsaSsaPssSignBoringSsl::New(
+      private_key_subtle, {crypto::tink::subtle::HashType::SHA256,
+                           crypto::tink::subtle::HashType::SHA256, 32});
+
+  auto verifier_or =
+      RsaSsaPssVerifyKeyManager().GetPrimitive<PublicKeyVerify>(public_key);
+  ASSERT_THAT(verifier_or.status(), IsOk());
+
+  std::string message = "Some message";
+  EXPECT_THAT(
+      verifier_or.ValueOrDie()->Verify(
+          direct_signer_or.ValueOrDie()->Sign(message).ValueOrDie(), message),
+      IsOk());
+}
 
 // Test vector from
 // https://csrc.nist.gov/Projects/Cryptographic-Algorithm-Validation-Program/Digital-Signatures
@@ -55,12 +177,13 @@
   std::string e;
   std::string message;
   std::string signature;
-  pb::HashType sig_hash;
-  pb::HashType mgf1_hash;
+  HashType sig_hash;
+  HashType mgf1_hash;
   int salt_length;
 };
 
-static const NistTestVector nist_test_vector{
+// clang-format off
+static const NistTestVector* nist_test_vector = new NistTestVector({
     absl::HexStringToBytes(
         "a47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783"
         "d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d"
@@ -85,164 +208,27 @@
         "b5388383c26079f344e2aea600d0e324164b450f7b9b465111b7265f3b1b063089ae7e"
         "2623fc0fda8052cf4bf3379102fbf71d7c98e8258664ceed637d20f95ff0111881e650"
         "ce61f251d9c3a629ef222d"),
-    pb::HashType::SHA256,
-    pb::HashType::SHA256,
-    32};
+    HashType::SHA256,
+    HashType::SHA256,
+    32});
+// clang-format on
 
-TEST_F(RsaSsaPssVerifyKeyManagerTest, testBasic) {
-  RsaSsaPssVerifyKeyManager key_manager;
-
-  EXPECT_EQ(0, key_manager.get_version());
-  EXPECT_EQ("type.googleapis.com/google.crypto.tink.RsaSsaPssPublicKey",
-            key_manager.get_key_type());
-  EXPECT_TRUE(key_manager.DoesSupport(key_manager.get_key_type()));
-
-  // NIST test vector should work.
+TEST(RsaSsaPssVerifyKeyManagerTest, TestVector) {
   RsaSsaPssPublicKey key;
-  key.mutable_params()->set_mgf1_hash(nist_test_vector.mgf1_hash);
-  key.mutable_params()->set_sig_hash(nist_test_vector.sig_hash);
-  key.mutable_params()->set_salt_length(nist_test_vector.salt_length);
+  key.mutable_params()->set_mgf1_hash(nist_test_vector->mgf1_hash);
+  key.mutable_params()->set_sig_hash(nist_test_vector->sig_hash);
+  key.mutable_params()->set_salt_length(nist_test_vector->salt_length);
   key.set_version(0);
-  key.set_n(nist_test_vector.n);
-  key.set_e(nist_test_vector.e);
-  auto result = key_manager.GetPrimitive(key);
-  EXPECT_TRUE(result.ok());
-  EXPECT_TRUE(result.ValueOrDie()
-                  ->Verify(nist_test_vector.signature, nist_test_vector.message)
-                  .ok());
-}
-
-TEST_F(RsaSsaPssVerifyKeyManagerTest, testKeyDataErrors) {
-  RsaSsaPssVerifyKeyManager key_manager;
-
-  {  // Bad key type.
-    KeyData key_data;
-    std::string bad_key_type = "type.googleapis.com/google.crypto.tink.SomeOtherKey";
-    key_data.set_type_url(bad_key_type);
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, bad_key_type,
-                        result.status().error_message());
-  }
-
-  {  // Bad key value.
-    KeyData key_data;
-    key_data.set_type_url(rsa_ssa_pss_verify_key_type_);
-    key_data.set_value("some bad serialized proto");
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not parse",
-                        result.status().error_message());
-  }
-
-  {  // Bad version.
-    KeyData key_data;
-    RsaSsaPssPublicKey key;
-    key.set_version(1);
-    key_data.set_type_url(rsa_ssa_pss_verify_key_type_);
-    key_data.set_value(key.SerializeAsString());
-    auto result = key_manager.GetPrimitive(key_data);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "version",
-                        result.status().error_message());
-  }
-}
-
-TEST_F(RsaSsaPssVerifyKeyManagerTest, testKeyMessageErrors) {
-  RsaSsaPssVerifyKeyManager key_manager;
-
-  {  // Use SHA1 as signature hash.
-    RsaSsaPssPublicKey key;
-    key.mutable_params()->set_mgf1_hash(pb::HashType::SHA1);
-    key.mutable_params()->set_sig_hash(pb::HashType::SHA1);
-    key.mutable_params()->set_salt_length(20);
-    key.set_version(0);
-    key.set_n(nist_test_vector.n);
-    key.set_e(nist_test_vector.e);
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                        "SHA1 is not safe for digital signature",
-                        result.status().error_message());
-  }
-
-  {  // Small modulus.
-    RsaSsaPssPublicKey key;
-    key.mutable_params()->set_mgf1_hash(pb::HashType::SHA256);
-    key.mutable_params()->set_sig_hash(pb::HashType::SHA256);
-    key.mutable_params()->set_salt_length(32);
-    key.set_version(0);
-    key.set_n(std::string("\x23"));
-    key.set_e(std::string("\x3"));
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                        "only modulus size >= 2048-bit is supported",
-                        result.status().error_message());
-  }
-
-  {  // MGF1 hash and signature hash mismatch.
-    RsaSsaPssPublicKey key;
-    key.mutable_params()->set_mgf1_hash(pb::HashType::SHA256);
-    key.mutable_params()->set_sig_hash(pb::HashType::SHA512);
-    key.mutable_params()->set_salt_length(32);
-    key.set_version(0);
-    key.set_n(nist_test_vector.n);
-    key.set_e(nist_test_vector.e);
-    auto result = key_manager.GetPrimitive(key);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring,
-                        "is different from signature hash",
-                        result.status().error_message());
-  }
-}
-
-TEST_F(RsaSsaPssVerifyKeyManagerTest, testNewKeyError) {
-  RsaSsaPssVerifyKeyManager key_manager;
-  const KeyFactory& key_factory = key_manager.get_key_factory();
-
-  {  // Via NewKey(format_proto).
-    RsaSsaPssKeyFormat key_format;
-    auto result = key_factory.NewKey(key_format);
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::UNIMPLEMENTED, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "use the RsaSsaPssSignKeyManager",
-                        result.status().error_message());
-  }
-
-  {  // Via NewKey(serialized_format_proto).
-    RsaSsaPssKeyFormat key_format;
-    auto result = key_factory.NewKey(key_format.SerializeAsString());
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::UNIMPLEMENTED, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "use the RsaSsaPssSignKeyManager",
-                        result.status().error_message());
-  }
-
-  {  // Via NewKeyData(serialized_format_proto).
-    RsaSsaPssKeyFormat key_format;
-    auto result = key_factory.NewKeyData(key_format.SerializeAsString());
-    EXPECT_FALSE(result.ok());
-    EXPECT_EQ(util::error::UNIMPLEMENTED, result.status().error_code());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "not supported",
-                        result.status().error_message());
-    EXPECT_PRED_FORMAT2(testing::IsSubstring, "use the RsaSsaPssSignKeyManager",
-                        result.status().error_message());
-  }
+  key.set_n(nist_test_vector->n);
+  key.set_e(nist_test_vector->e);
+  auto result = RsaSsaPssVerifyKeyManager().GetPrimitive<PublicKeyVerify>(key);
+  ASSERT_THAT(result.status(), IsOk());
+  EXPECT_THAT(result.ValueOrDie()->Verify(nist_test_vector->signature,
+                                          nist_test_vector->message),
+              IsOk());
 }
 
 }  // namespace
 }  // namespace tink
 }  // namespace crypto
+
diff --git a/cc/signature/signature_config.cc b/cc/signature/signature_config.cc
index 445f4dc..75f463d 100644
--- a/cc/signature/signature_config.cc
+++ b/cc/signature/signature_config.cc
@@ -17,87 +17,65 @@
 #include "tink/signature/signature_config.h"
 
 #include "absl/memory/memory.h"
-#include "tink/config.h"
+#include "tink/config/config_util.h"
 #include "tink/registry.h"
-#include "tink/signature/public_key_sign_catalogue.h"
-#include "tink/signature/public_key_verify_catalogue.h"
+#include "tink/signature/ecdsa_sign_key_manager.h"
+#include "tink/signature/ed25519_sign_key_manager.h"
+#include "tink/signature/rsa_ssa_pkcs1_sign_key_manager.h"
+#include "tink/signature/rsa_ssa_pss_sign_key_manager.h"
+#include "tink/signature/ecdsa_verify_key_manager.h"
+#include "tink/signature/ed25519_verify_key_manager.h"
+#include "tink/signature/rsa_ssa_pkcs1_verify_key_manager.h"
+#include "tink/signature/rsa_ssa_pss_verify_key_manager.h"
+#include "tink/signature/public_key_sign_wrapper.h"
+#include "tink/signature/public_key_verify_wrapper.h"
 #include "tink/util/status.h"
 #include "proto/config.pb.h"
 
+using google::crypto::tink::RegistryConfig;
+
 namespace crypto {
 namespace tink {
 
-namespace {
-
-google::crypto::tink::RegistryConfig* GenerateRegistryConfig() {
-  google::crypto::tink::RegistryConfig* config =
-      new google::crypto::tink::RegistryConfig();
-  // ECDSA
-  config->add_entry()->MergeFrom(
-      *Config::GetTinkKeyTypeEntry(SignatureConfig::kPublicKeySignCatalogueName,
-                                   SignatureConfig::kPublicKeySignPrimitiveName,
-                                   "EcdsaPrivateKey", 0, true));
-  config->add_entry()->MergeFrom(*Config::GetTinkKeyTypeEntry(
-      SignatureConfig::kPublicKeyVerifyCatalogueName,
-      SignatureConfig::kPublicKeyVerifyPrimitiveName, "EcdsaPublicKey", 0,
-      true));
-
-  // ED25519
-  config->add_entry()->MergeFrom(
-      *Config::GetTinkKeyTypeEntry(SignatureConfig::kPublicKeySignCatalogueName,
-                                   SignatureConfig::kPublicKeySignPrimitiveName,
-                                   "Ed25519PrivateKey", 0, true));
-  config->add_entry()->MergeFrom(*Config::GetTinkKeyTypeEntry(
-      SignatureConfig::kPublicKeyVerifyCatalogueName,
-      SignatureConfig::kPublicKeyVerifyPrimitiveName, "Ed25519PublicKey", 0,
-      true));
-
-  // RSA SSA PSS
-  config->add_entry()->MergeFrom(
-      *Config::GetTinkKeyTypeEntry(SignatureConfig::kPublicKeySignCatalogueName,
-                                   SignatureConfig::kPublicKeySignPrimitiveName,
-                                   "RsaSsaPssPrivateKey", 0, true));
-  config->add_entry()->MergeFrom(*Config::GetTinkKeyTypeEntry(
-      SignatureConfig::kPublicKeyVerifyCatalogueName,
-      SignatureConfig::kPublicKeyVerifyPrimitiveName, "RsaSsaPssPublicKey", 0,
-      true));
-
-  // RSA SSA PKCS1
-  config->add_entry()->MergeFrom(
-      *Config::GetTinkKeyTypeEntry(SignatureConfig::kPublicKeySignCatalogueName,
-                                   SignatureConfig::kPublicKeySignPrimitiveName,
-                                   "RsaSsaPkcs1PrivateKey", 0, true));
-  config->add_entry()->MergeFrom(*Config::GetTinkKeyTypeEntry(
-      SignatureConfig::kPublicKeyVerifyCatalogueName,
-      SignatureConfig::kPublicKeyVerifyPrimitiveName, "RsaSsaPkcs1PublicKey", 0,
-      true));
-  config->set_config_name("TINK_SIGNATURE");
-  return config;
-}
-
-}  // anonymous namespace
-
-constexpr char SignatureConfig::kPublicKeySignCatalogueName[];
-constexpr char SignatureConfig::kPublicKeyVerifyCatalogueName[];
-constexpr char SignatureConfig::kPublicKeySignPrimitiveName[];
-constexpr char SignatureConfig::kPublicKeyVerifyPrimitiveName[];
-
 // static
 const google::crypto::tink::RegistryConfig& SignatureConfig::Latest() {
-  static const auto config = GenerateRegistryConfig();
+  static const RegistryConfig* config = new RegistryConfig();
   return *config;
 }
 
 // static
 util::Status SignatureConfig::Register() {
-  auto status = Registry::AddCatalogue(
-      kPublicKeySignCatalogueName, absl::make_unique<PublicKeySignCatalogue>());
+  // Register key managers.
+  // ECDSA
+  auto status = Registry::RegisterAsymmetricKeyManagers(
+      absl::make_unique<EcdsaSignKeyManager>(),
+      absl::make_unique<EcdsaVerifyKeyManager>(), true);
   if (!status.ok()) return status;
-  status =
-      Registry::AddCatalogue(kPublicKeyVerifyCatalogueName,
-                             absl::make_unique<PublicKeyVerifyCatalogue>());
+
+  // ED25519
+  status = Registry::RegisterAsymmetricKeyManagers(
+      absl::make_unique<Ed25519SignKeyManager>(),
+      absl::make_unique<Ed25519VerifyKeyManager>(), true);
   if (!status.ok()) return status;
-  return Config::Register(Latest());
+
+  // RSA SSA PSS
+  status = Registry::RegisterAsymmetricKeyManagers(
+      absl::make_unique<RsaSsaPssSignKeyManager>(),
+      absl::make_unique<RsaSsaPssVerifyKeyManager>(), true);
+  if (!status.ok()) return status;
+
+  // RSA SSA PKCS1
+  status = Registry::RegisterAsymmetricKeyManagers(
+      absl::make_unique<RsaSsaPkcs1SignKeyManager>(),
+      absl::make_unique<RsaSsaPkcs1VerifyKeyManager>(), true);
+  if (!status.ok()) return status;
+
+  // Register primitive wrappers.
+  status = Registry::RegisterPrimitiveWrapper(
+      absl::make_unique<PublicKeySignWrapper>());
+  if (!status.ok()) return status;
+  return  Registry::RegisterPrimitiveWrapper(
+      absl::make_unique<PublicKeyVerifyWrapper>());
 }
 
 }  // namespace tink
diff --git a/cc/signature/signature_config.h b/cc/signature/signature_config.h
index 596594c..ca9dab4 100644
--- a/cc/signature/signature_config.h
+++ b/cc/signature/signature_config.h
@@ -17,6 +17,7 @@
 #ifndef TINK_SIGNATURE_SIGNATURE_CONFIG_H_
 #define TINK_SIGNATURE_SIGNATURE_CONFIG_H_
 
+#include "absl/base/macros.h"
 #include "tink/util/status.h"
 #include "proto/config.pb.h"
 
@@ -34,8 +35,6 @@
 //
 //   auto status = SignatureConfig::Register();
 //
-// For more information on creation and usage of instances of PublicKeySign
-// and PublicKeyVerify see PublicKeySignFactory resp. PublicKeyVerifyFactory.
 class SignatureConfig {
  public:
   static constexpr char kPublicKeySignCatalogueName[] = "TinkPublicKeySign";
@@ -45,10 +44,12 @@
 
   // Returns config with implementations of PublicKeySign and PublicKeyVerify
   // supported in the current Tink release.
+  ABSL_DEPRECATED("This is not supported anymore.")
   static const google::crypto::tink::RegistryConfig& Latest();
 
-  // Registers key managers for all implementations of PublicKeySign
-  // and PublicKeyVerify from the current Tink release.
+  // Registers PublicKeySign and PublicKeyVerify primitive wrappers, and key
+  // managers for all implementations of PublicKeySign and PublicKeyVerify from
+  // the current Tink release.
   static crypto::tink::util::Status Register();
 
  private:
diff --git a/cc/signature/signature_config_test.cc b/cc/signature/signature_config_test.cc
index 435ca7e..0da2d54 100644
--- a/cc/signature/signature_config_test.cc
+++ b/cc/signature/signature_config_test.cc
@@ -18,16 +18,18 @@
 
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "tink/catalogue.h"
+#include "absl/memory/memory.h"
 #include "tink/config.h"
 #include "tink/keyset_handle.h"
 #include "tink/public_key_sign.h"
 #include "tink/public_key_verify.h"
 #include "tink/registry.h"
+#include "tink/signature/rsa_ssa_pss_sign_key_manager.h"
+#include "tink/signature/rsa_ssa_pss_verify_key_manager.h"
 #include "tink/signature/signature_key_templates.h"
 #include "tink/util/status.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
-#include "absl/memory/memory.h"
 
 namespace crypto {
 namespace tink {
@@ -35,17 +37,8 @@
 
 using ::crypto::tink::test::DummyPublicKeySign;
 using ::crypto::tink::test::DummyPublicKeyVerify;
-
-class DummySignCatalogue : public Catalogue<PublicKeySign> {
- public:
-  DummySignCatalogue() {}
-
-  crypto::tink::util::StatusOr<std::unique_ptr<KeyManager<PublicKeySign>>>
-  GetKeyManager(const std::string& type_url, const std::string& primitive_name,
-                uint32_t min_version) const override {
-    return util::Status::UNKNOWN;
-  }
-};
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
 
 class SignatureConfigTest : public ::testing::Test {
  protected:
@@ -53,114 +46,23 @@
 };
 
 TEST_F(SignatureConfigTest, testBasic) {
-  std::vector<std::string> sign_key_types;
-  sign_key_types.push_back(
-      "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey");
-  sign_key_types.push_back(
-      "type.googleapis.com/google.crypto.tink.Ed25519PrivateKey");
-  sign_key_types.push_back(
-      "type.googleapis.com/google.crypto.tink.RsaSsaPssPrivateKey");
-  sign_key_types.push_back(
-      "type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PrivateKey");
-
-  std::vector<std::string> verify_key_types;
-  verify_key_types.push_back(
-      "type.googleapis.com/google.crypto.tink.EcdsaPublicKey");
-  verify_key_types.push_back(
-      "type.googleapis.com/google.crypto.tink.Ed25519PublicKey");
-  verify_key_types.push_back(
-      "type.googleapis.com/google.crypto.tink.RsaSsaPssPublicKey");
-  verify_key_types.push_back(
-      "type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PublicKey");
-
-  const size_t total_key_types =
-      sign_key_types.size() + verify_key_types.size();
-
-  auto& config = SignatureConfig::Latest();
-
-  EXPECT_EQ(total_key_types, SignatureConfig::Latest().entry_size());
-  EXPECT_EQ(sign_key_types.size(), verify_key_types.size());
-
-  for (int i = 0; i < SignatureConfig::Latest().entry_size(); i += 2) {
-    std::string sign_key_type = sign_key_types[i / 2];
-    EXPECT_EQ("TinkPublicKeySign", config.entry(i).catalogue_name());
-    EXPECT_EQ("PublicKeySign", config.entry(i).primitive_name());
-    EXPECT_EQ(sign_key_type, config.entry(i).type_url());
-    EXPECT_EQ(true, config.entry(i).new_key_allowed());
-    EXPECT_EQ(0, config.entry(i).key_manager_version());
-
-    std::string verify_key_type = verify_key_types[i / 2];
-    EXPECT_EQ("TinkPublicKeyVerify", config.entry(i + 1).catalogue_name());
-    EXPECT_EQ("PublicKeyVerify", config.entry(i + 1).primitive_name());
-    EXPECT_EQ(verify_key_type, config.entry(i + 1).type_url());
-    EXPECT_EQ(true, config.entry(i + 1).new_key_allowed());
-    EXPECT_EQ(0, config.entry(i + 1).key_manager_version());
-  }
-
-  // No key manager before registration.
-  for (const auto& sign_key_type : sign_key_types) {
-    auto sign_manager_result =
-        Registry::get_key_manager<PublicKeySign>(sign_key_type);
-    EXPECT_FALSE(sign_manager_result.ok());
-    EXPECT_EQ(util::error::NOT_FOUND,
-              sign_manager_result.status().error_code());
-  }
-  for (const auto& verify_key_type : verify_key_types) {
-    auto verify_manager_result =
-        Registry::get_key_manager<PublicKeyVerify>(verify_key_type);
-    EXPECT_FALSE(verify_manager_result.ok());
-    EXPECT_EQ(util::error::NOT_FOUND,
-              verify_manager_result.status().error_code());
-  }
-
-  // Registration of standard key types works.
-  auto status = SignatureConfig::Register();
-  EXPECT_TRUE(status.ok()) << status;
-
-  for (const auto& sign_key_type : sign_key_types) {
-    auto sign_manager_result =
-        Registry::get_key_manager<PublicKeySign>(sign_key_type);
-    EXPECT_TRUE(sign_manager_result.ok()) << sign_manager_result.status();
-    EXPECT_TRUE(sign_manager_result.ValueOrDie()->DoesSupport(sign_key_type));
-  }
-
-  for (const auto& verify_key_type : verify_key_types) {
-    auto verify_manager_result =
-        Registry::get_key_manager<PublicKeyVerify>(verify_key_type);
-    EXPECT_TRUE(verify_manager_result.ok()) << verify_manager_result.status();
-    EXPECT_TRUE(
-        verify_manager_result.ValueOrDie()->DoesSupport(verify_key_type));
-  }
-}
-
-TEST_F(SignatureConfigTest, testRegister) {
-  std::string key_type = "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey";
-
-  // Try on empty registry.
-  auto status = Config::Register(SignatureConfig::Latest());
-  EXPECT_FALSE(status.ok());
-  EXPECT_EQ(util::error::NOT_FOUND, status.error_code());
-  auto manager_result = Registry::get_key_manager<PublicKeySign>(key_type);
-  EXPECT_FALSE(manager_result.ok());
-
-  // Register and try again.
-  status = SignatureConfig::Register();
-  EXPECT_TRUE(status.ok()) << status;
-  manager_result = Registry::get_key_manager<PublicKeySign>(key_type);
-  EXPECT_TRUE(manager_result.ok()) << manager_result.status();
-
-  // Try Register() again, should succeed (idempotence).
-  status = SignatureConfig::Register();
-  EXPECT_TRUE(status.ok()) << status;
-
-  // Reset the registry, and try overriding a catalogue with a different one.
-  Registry::Reset();
-  status = Registry::AddCatalogue("TinkPublicKeySign",
-                                  absl::make_unique<DummySignCatalogue>());
-  EXPECT_TRUE(status.ok()) << status;
-  status = SignatureConfig::Register();
-  EXPECT_FALSE(status.ok());
-  EXPECT_EQ(util::error::ALREADY_EXISTS, status.error_code());
+  EXPECT_THAT(Registry::get_key_manager<PublicKeySign>(
+                  RsaSsaPssSignKeyManager().get_key_type())
+                  .status(),
+              StatusIs(util::error::NOT_FOUND));
+  EXPECT_THAT(Registry::get_key_manager<PublicKeyVerify>(
+                  RsaSsaPssVerifyKeyManager().get_key_type())
+                  .status(),
+              StatusIs(util::error::NOT_FOUND));
+  EXPECT_THAT(SignatureConfig::Register(), IsOk());
+  EXPECT_THAT(Registry::get_key_manager<PublicKeySign>(
+                  RsaSsaPssSignKeyManager().get_key_type())
+                  .status(),
+              IsOk());
+  EXPECT_THAT(Registry::get_key_manager<PublicKeyVerify>(
+                  RsaSsaPssVerifyKeyManager().get_key_type())
+                  .status(),
+              IsOk());
 }
 
 // Tests that the PublicKeySignWrapper has been properly registered and we
@@ -173,10 +75,10 @@
   key.set_key_id(1234);
   key.set_output_prefix_type(google::crypto::tink::OutputPrefixType::TINK);
   auto primitive_set = absl::make_unique<PrimitiveSet<PublicKeySign>>();
-  primitive_set->set_primary(
+  ASSERT_THAT(primitive_set->set_primary(
       primitive_set
           ->AddPrimitive(absl::make_unique<DummyPublicKeySign>("dummy"), key)
-          .ValueOrDie());
+          .ValueOrDie()), IsOk());
 
   auto wrapped = Registry::Wrap(std::move(primitive_set));
 
@@ -202,10 +104,12 @@
   key.set_key_id(1234);
   key.set_output_prefix_type(google::crypto::tink::OutputPrefixType::TINK);
   auto primitive_set = absl::make_unique<PrimitiveSet<PublicKeyVerify>>();
-  primitive_set->set_primary(
-      primitive_set
-          ->AddPrimitive(absl::make_unique<DummyPublicKeyVerify>("dummy"), key)
-          .ValueOrDie());
+  ASSERT_THAT(primitive_set->set_primary(
+                  primitive_set
+                      ->AddPrimitive(
+                          absl::make_unique<DummyPublicKeyVerify>("dummy"), key)
+                      .ValueOrDie()),
+              IsOk());
   std::string prefix = CryptoFormat::get_output_prefix(key).ValueOrDie();
   std::string signature = DummyPublicKeySign("dummy").Sign("message").ValueOrDie();
 
diff --git a/cc/signature/signature_key_templates_test.cc b/cc/signature/signature_key_templates_test.cc
index 8e4070f..e1056a3 100644
--- a/cc/signature/signature_key_templates_test.cc
+++ b/cc/signature/signature_key_templates_test.cc
@@ -19,17 +19,19 @@
 #include "gtest/gtest.h"
 #include "openssl/bn.h"
 #include "openssl/rsa.h"
+#include "tink/core/key_manager_impl.h"
+#include "tink/core/private_key_manager_impl.h"
 #include "tink/signature/ecdsa_sign_key_manager.h"
+#include "tink/signature/ecdsa_verify_key_manager.h"
 #include "tink/signature/ed25519_sign_key_manager.h"
+#include "tink/signature/ed25519_verify_key_manager.h"
 #include "tink/signature/rsa_ssa_pkcs1_sign_key_manager.h"
 #include "tink/signature/rsa_ssa_pss_sign_key_manager.h"
 #include "tink/subtle/subtle_util_boringssl.h"
 #include "proto/common.pb.h"
 #include "proto/ecdsa.pb.h"
-#include "proto/empty.pb.h"
 #include "proto/rsa_ssa_pkcs1.pb.h"
 #include "proto/rsa_ssa_pss.pb.h"
-
 #include "proto/tink.pb.h"
 
 namespace crypto {
@@ -39,7 +41,7 @@
 using google::crypto::tink::EcdsaKeyFormat;
 using google::crypto::tink::EcdsaSignatureEncoding;
 using google::crypto::tink::EllipticCurveType;
-using google::crypto::tink::Empty;
+using google::crypto::tink::Ed25519KeyFormat;
 using google::crypto::tink::HashType;
 using google::crypto::tink::KeyTemplate;
 using google::crypto::tink::OutputPrefixType;
@@ -65,9 +67,13 @@
     EXPECT_EQ(&key_template, &key_template_2);
 
     // Check that the key manager works with the template.
-    EcdsaSignKeyManager key_manager;
-    EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
-    auto new_key_result = key_manager.get_key_factory().NewKey(key_format);
+    EcdsaSignKeyManager sign_key_type_manager;
+    EcdsaVerifyKeyManager verify_key_type_manager;
+    auto key_manager = internal::MakePrivateKeyManager<PublicKeySign>(
+        &sign_key_type_manager, &verify_key_type_manager);
+
+    EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
+    auto new_key_result = key_manager->get_key_factory().NewKey(key_format);
     EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
   }
 
@@ -87,9 +93,12 @@
     EXPECT_EQ(&key_template, &key_template_2);
 
     // Check that the template works with the key manager.
-    EcdsaSignKeyManager key_manager;
-    EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
-    auto new_key_result = key_manager.get_key_factory().NewKey(key_format);
+    EcdsaSignKeyManager sign_key_type_manager;
+    EcdsaVerifyKeyManager verify_key_type_manager;
+    auto key_manager = internal::MakePrivateKeyManager<PublicKeySign>(
+        &sign_key_type_manager, &verify_key_type_manager);
+    EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
+    auto new_key_result = key_manager->get_key_factory().NewKey(key_format);
     EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
   }
 
@@ -109,9 +118,12 @@
     EXPECT_EQ(&key_template, &key_template_2);
 
     // Check that the template works with the key manager.
-    EcdsaSignKeyManager key_manager;
-    EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
-    auto new_key_result = key_manager.get_key_factory().NewKey(key_format);
+    EcdsaSignKeyManager sign_key_type_manager;
+    EcdsaVerifyKeyManager verify_key_type_manager;
+    auto key_manager = internal::MakePrivateKeyManager<PublicKeySign>(
+        &sign_key_type_manager, &verify_key_type_manager);
+    EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
+    auto new_key_result = key_manager->get_key_factory().NewKey(key_format);
     EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
   }
 }
@@ -136,9 +148,12 @@
     EXPECT_EQ(&key_template, &key_template_2);
 
     // Check that the key manager works with the template.
-    EcdsaSignKeyManager key_manager;
-    EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
-    auto new_key_result = key_manager.get_key_factory().NewKey(key_format);
+    EcdsaSignKeyManager sign_key_type_manager;
+    EcdsaVerifyKeyManager verify_key_type_manager;
+    auto key_manager = internal::MakePrivateKeyManager<PublicKeySign>(
+        &sign_key_type_manager, &verify_key_type_manager);
+    EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
+    auto new_key_result = key_manager->get_key_factory().NewKey(key_format);
     EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
   }
 
@@ -159,9 +174,12 @@
     EXPECT_EQ(&key_template, &key_template_2);
 
     // Check that the template works with the key manager.
-    EcdsaSignKeyManager key_manager;
-    EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
-    auto new_key_result = key_manager.get_key_factory().NewKey(key_format);
+    EcdsaSignKeyManager sign_key_type_manager;
+    EcdsaVerifyKeyManager verify_key_type_manager;
+    auto key_manager = internal::MakePrivateKeyManager<PublicKeySign>(
+        &sign_key_type_manager, &verify_key_type_manager);
+    EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
+    auto new_key_result = key_manager->get_key_factory().NewKey(key_format);
     EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
   }
 
@@ -182,9 +200,12 @@
     EXPECT_EQ(&key_template, &key_template_2);
 
     // Check that the template works with the key manager.
-    EcdsaSignKeyManager key_manager;
-    EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
-    auto new_key_result = key_manager.get_key_factory().NewKey(key_format);
+    EcdsaSignKeyManager sign_key_type_manager;
+    EcdsaVerifyKeyManager verify_key_type_manager;
+    auto key_manager = internal::MakePrivateKeyManager<PublicKeySign>(
+        &sign_key_type_manager, &verify_key_type_manager);
+    EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
+    auto new_key_result = key_manager->get_key_factory().NewKey(key_format);
     EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
   }
 }
@@ -215,9 +236,11 @@
   EXPECT_EQ(&key_template, &key_template_2);
 
   // Check that the key manager works with the template.
-  RsaSsaPkcs1SignKeyManager key_manager;
-  EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
-  auto new_key_result = key_manager.get_key_factory().NewKey(key_format);
+  RsaSsaPkcs1SignKeyManager key_type_manager;
+  auto key_manager =
+      internal::MakeKeyManager<PublicKeySign>(&key_type_manager);
+  EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
+  auto new_key_result = key_manager->get_key_factory().NewKey(key_format);
   EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
 }
 
@@ -246,9 +269,11 @@
   EXPECT_EQ(&key_template, &key_template_2);
 
   // Check that the key manager works with the template.
-  RsaSsaPkcs1SignKeyManager key_manager;
-  EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
-  auto new_key_result = key_manager.get_key_factory().NewKey(key_format);
+  RsaSsaPkcs1SignKeyManager key_type_manager;
+  auto key_manager =
+      internal::MakeKeyManager<PublicKeySign>(&key_type_manager);
+  EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
+  auto new_key_result = key_manager->get_key_factory().NewKey(key_format);
   EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
 }
 
@@ -280,9 +305,11 @@
   EXPECT_EQ(&key_template, &key_template_2);
 
   // Check that the key manager works with the template.
-  RsaSsaPssSignKeyManager key_manager;
-  EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
-  auto new_key_result = key_manager.get_key_factory().NewKey(key_format);
+  RsaSsaPssSignKeyManager key_type_manager;
+  auto key_manager =
+      internal::MakeKeyManager<PublicKeySign>(&key_type_manager);
+  EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
+  auto new_key_result = key_manager->get_key_factory().NewKey(key_format);
   EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
 }
 
@@ -314,9 +341,11 @@
   EXPECT_EQ(&key_template, &key_template_2);
 
   // Check that the key manager works with the template.
-  RsaSsaPssSignKeyManager key_manager;
-  EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
-  auto new_key_result = key_manager.get_key_factory().NewKey(key_format);
+  RsaSsaPssSignKeyManager key_type_manager;
+  auto key_manager =
+      internal::MakeKeyManager<PublicKeySign>(&key_type_manager);
+  EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
+  auto new_key_result = key_manager->get_key_factory().NewKey(key_format);
   EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
 }
 
@@ -331,10 +360,14 @@
   EXPECT_EQ(&key_template, &key_template_2);
 
   // Check that the key manager works with the template.
-  Ed25519SignKeyManager key_manager;
-  EXPECT_EQ(key_manager.get_key_type(), key_template.type_url());
-  Empty empty;
-  auto new_key_result = key_manager.get_key_factory().NewKey(empty);
+  Ed25519SignKeyManager sign_key_type_manager;
+  Ed25519VerifyKeyManager verify_key_type_manager;
+  auto key_manager = internal::MakePrivateKeyManager<PublicKeySign>(
+      &sign_key_type_manager, &verify_key_type_manager);
+
+  EXPECT_EQ(key_manager->get_key_type(), key_template.type_url());
+  Ed25519KeyFormat key_format;
+  auto new_key_result = key_manager->get_key_factory().NewKey(key_format);
   EXPECT_TRUE(new_key_result.ok()) << new_key_result.status();
 }
 
diff --git a/cc/streaming_aead.h b/cc/streaming_aead.h
index b51a61f..ddc9a6b 100644
--- a/cc/streaming_aead.h
+++ b/cc/streaming_aead.h
@@ -22,6 +22,7 @@
 #include "absl/strings/string_view.h"
 #include "tink/input_stream.h"
 #include "tink/output_stream.h"
+#include "tink/random_access_stream.h"
 #include "tink/util/statusor.h"
 
 namespace crypto {
@@ -50,7 +51,7 @@
       std::unique_ptr<crypto::tink::OutputStream> ciphertext_destination,
       absl::string_view associated_data) = 0;
 
-  // Returns a wrapper around 'ciphertext_source', such that reading via the
+  // Returns a wrapper around 'ciphertext_source', such that reading
   // via the wrapper leads to AEAD-decryption of the underlying ciphertext,
   // using 'associated_data' as associated authenticated data, and the
   // read bytes are bytes of the resulting plaintext.
@@ -61,6 +62,21 @@
       std::unique_ptr<crypto::tink::InputStream> ciphertext_source,
       absl::string_view associated_data) = 0;
 
+  // Returns a wrapper around 'ciphertext_source', such that reading
+  // via the wrapper leads to AEAD-decryption of the underlying ciphertext,
+  // using 'associated_data' as associated authenticated data, and the
+  // read bytes are bytes of the resulting plaintext.
+  // Note that the returned wrapper's size()-method reports size that is
+  // not checked for integrity.  For example, if the ciphertext file has been
+  // truncated then size() will return a wrong result.  Reading the last block
+  // of the plaintext will verify whether size() is correct.
+  // Reading through the wrapper is thread safe.
+  virtual crypto::tink::util::StatusOr<
+      std::unique_ptr<crypto::tink::RandomAccessStream>>
+  NewDecryptingRandomAccessStream(
+      std::unique_ptr<crypto::tink::RandomAccessStream> ciphertext_source,
+      absl::string_view associated_data) = 0;
+
   virtual ~StreamingAead() {}
 };
 
diff --git a/cc/streaming_aead_config.h b/cc/streaming_aead_config.h
new file mode 100644
index 0000000..ae6d6ac
--- /dev/null
+++ b/cc/streaming_aead_config.h
@@ -0,0 +1,24 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_STREAMING_AEAD_CONFIG_H_
+#define TINK_STREAMING_AEAD_CONFIG_H_
+
+// IWYU pragma: begin_exports
+#include "tink/streamingaead/streaming_aead_config.h"
+// IWYU pragma: end_exports
+
+#endif  // TINK_STREAMING_AEAD_CONFIG_H_
diff --git a/cc/streaming_aead_key_templates.h b/cc/streaming_aead_key_templates.h
new file mode 100644
index 0000000..b1419e0
--- /dev/null
+++ b/cc/streaming_aead_key_templates.h
@@ -0,0 +1,24 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_STREAMING_AEAD_KEY_TEMPLATES_H_
+#define TINK_STREAMING_AEAD_KEY_TEMPLATES_H_
+
+// IWYU pragma: begin_exports
+#include "tink/streamingaead/streaming_aead_key_templates.h"
+// IWYU pragma: end_exports
+
+#endif  // TINK_STREAMING_AEAD_KEY_TEMPLATES_H_
diff --git a/cc/streaming_mac.h b/cc/streaming_mac.h
new file mode 100644
index 0000000..037b148
--- /dev/null
+++ b/cc/streaming_mac.h
@@ -0,0 +1,53 @@
+// Copyright 2017 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_STREAMING_MAC_H_
+#define TINK_STREAMING_MAC_H_
+
+#include <memory>
+#include <string>
+
+#include "absl/strings/string_view.h"
+#include "tink/output_stream_with_result.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+
+///////////////////////////////////////////////////////////////////////////////
+// Interface for Streaming MACs (Message Authentication Codes).
+// This interface should be used for authentication only, and not for other
+// purposes (e.g., it should not be used to generate pseudorandom bytes).
+class StreamingMac {
+ public:
+  // Returns an ComputeMacOutputStream, which when closed will return the
+  // message authentication code (MAC) of the data put into the stream.
+  virtual util::StatusOr<std::unique_ptr<OutputStreamWithResult<std::string>>>
+  NewComputeMacOutputStream() const = 0;
+
+  // Returns an VerifyMacOutputStream which verifies if 'mac' is a correct
+  // message authentication code (MAC) for the data written to it.
+  virtual util::StatusOr<std::unique_ptr<OutputStreamWithResult<util::Status>>>
+  NewVerifyMacOutputStream(const std::string& mac_value) const = 0;
+
+  virtual ~StreamingMac() {}
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_STREAMING_MAC_H_
diff --git a/cc/streamingaead/BUILD.bazel b/cc/streamingaead/BUILD.bazel
index 67ed7a3..2e559f1 100644
--- a/cc/streamingaead/BUILD.bazel
+++ b/cc/streamingaead/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 cc_library(
     name = "streaming_aead_wrapper",
@@ -9,11 +9,14 @@
     include_prefix = "tink",
     strip_include_prefix = "/cc",
     deps = [
+        ":decrypting_input_stream",
+        ":decrypting_random_access_stream",
         "//cc:crypto_format",
         "//cc:input_stream",
         "//cc:output_stream",
         "//cc:primitive_set",
         "//cc:primitive_wrapper",
+        "//cc:random_access_stream",
         "//cc:registry",
         "//cc:streaming_aead",
         "//cc/util:status",
@@ -23,6 +26,172 @@
     ],
 )
 
+cc_library(
+    name = "streaming_aead_config",
+    srcs = ["streaming_aead_config.cc"],
+    hdrs = ["streaming_aead_config.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":aes_ctr_hmac_streaming_key_manager",
+        ":aes_gcm_hkdf_streaming_key_manager",
+        ":streaming_aead_wrapper",
+        "//cc:registry",
+        "//cc/config:config_util",
+        "//cc/util:status",
+        "//proto:config_cc_proto",
+        "@com_google_absl//absl/base:core_headers",
+        "@com_google_absl//absl/memory",
+    ],
+)
+
+cc_library(
+    name = "streaming_aead_key_templates",
+    srcs = ["streaming_aead_key_templates.cc"],
+    hdrs = ["streaming_aead_key_templates.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        "//proto:aes_ctr_hmac_streaming_cc_proto",
+        "//proto:aes_gcm_hkdf_streaming_cc_proto",
+        "//proto:common_cc_proto",
+        "//proto:tink_cc_proto",
+    ],
+)
+
+cc_library(
+    name = "aes_gcm_hkdf_streaming_key_manager",
+    srcs = ["aes_gcm_hkdf_streaming_key_manager.cc"],
+    hdrs = ["aes_gcm_hkdf_streaming_key_manager.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        "//cc:core/key_type_manager",
+        "//cc:key_manager",
+        "//cc:streaming_aead",
+        "//cc/subtle:aes_gcm_hkdf_stream_segment_encrypter",
+        "//cc/subtle:aes_gcm_hkdf_streaming",
+        "//cc/subtle:random",
+        "//cc/util:constants",
+        "//cc/util:enums",
+        "//cc/util:errors",
+        "//cc/util:protobuf_helper",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:validation",
+        "//proto:aes_gcm_hkdf_streaming_cc_proto",
+        "//proto:tink_cc_proto",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
+cc_library(
+    name = "aes_ctr_hmac_streaming_key_manager",
+    srcs = ["aes_ctr_hmac_streaming_key_manager.cc"],
+    hdrs = ["aes_ctr_hmac_streaming_key_manager.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        "//cc:core/key_type_manager",
+        "//cc:key_manager",
+        "//cc:streaming_aead",
+        "//cc/subtle:aes_ctr_hmac_streaming",
+        "//cc/subtle:random",
+        "//cc/util:constants",
+        "//cc/util:enums",
+        "//cc/util:errors",
+        "//cc/util:protobuf_helper",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:validation",
+        "//proto:aes_ctr_hmac_streaming_cc_proto",
+        "//proto:tink_cc_proto",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
+cc_library(
+    name = "buffered_input_stream",
+    srcs = ["buffered_input_stream.cc"],
+    hdrs = ["buffered_input_stream.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        "//cc:input_stream",
+        "//cc/util:errors",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@com_google_absl//absl/memory",
+    ],
+)
+
+cc_library(
+    name = "shared_input_stream",
+    srcs = ["shared_input_stream.h"],
+    hdrs = ["shared_input_stream.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        "//cc:input_stream",
+        "//cc/util:errors",
+        "//cc/util:statusor",
+        "@com_google_absl//absl/memory",
+    ],
+)
+
+cc_library(
+    name = "shared_random_access_stream",
+    srcs = ["shared_random_access_stream.h"],
+    hdrs = ["shared_random_access_stream.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        "//cc:random_access_stream",
+        "//cc/util:buffer",
+        "//cc/util:status",
+        "//cc/util:statusor",
+    ],
+)
+
+cc_library(
+    name = "decrypting_input_stream",
+    srcs = ["decrypting_input_stream.cc"],
+    hdrs = ["decrypting_input_stream.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":buffered_input_stream",
+        ":shared_input_stream",
+        "//cc:input_stream",
+        "//cc:primitive_set",
+        "//cc:streaming_aead",
+        "//cc/util:errors",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@com_google_absl//absl/memory",
+    ],
+)
+
+cc_library(
+    name = "decrypting_random_access_stream",
+    srcs = ["decrypting_random_access_stream.cc"],
+    hdrs = ["decrypting_random_access_stream.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":shared_random_access_stream",
+        "//cc:primitive_set",
+        "//cc:random_access_stream",
+        "//cc:streaming_aead",
+        "//cc/util:buffer",
+        "//cc/util:errors",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/synchronization",
+    ],
+)
+
 # tests
 
 cc_test(
@@ -34,14 +203,216 @@
         ":streaming_aead_wrapper",
         "//cc:input_stream",
         "//cc:output_stream",
-        "//cc:streaming_aead",
         "//cc:primitive_set",
+        "//cc:random_access_stream",
+        "//cc:streaming_aead",
+        "//cc/subtle:random",
+        "//cc/subtle:test_util",
+        "//cc/util:buffer",
+        "//cc/util:file_random_access_stream",
         "//cc/util:istream_input_stream",
         "//cc/util:ostream_output_stream",
         "//cc/util:status",
+        "//cc/util:test_matchers",
         "//cc/util:test_util",
         "//proto:tink_cc_proto",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "aes_gcm_hkdf_streaming_key_manager_test",
+    size = "small",
+    srcs = ["aes_gcm_hkdf_streaming_key_manager_test.cc"],
+    deps = [
+        ":aes_gcm_hkdf_streaming_key_manager",
+        "//cc:streaming_aead",
+        "//cc/subtle:aes_gcm_hkdf_streaming",
+        "//cc/subtle:common_enums",
+        "//cc/subtle:random",
+        "//cc/subtle:streaming_aead_test_util",
+        "//cc/subtle:test_util",
+        "//cc/util:istream_input_stream",
+        "//cc/util:ostream_output_stream",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_matchers",
+        "//proto:aes_eax_cc_proto",
+        "//proto:aes_gcm_hkdf_streaming_cc_proto",
+        "//proto:common_cc_proto",
+        "//proto:tink_cc_proto",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "aes_ctr_hmac_streaming_key_manager_test",
+    size = "small",
+    srcs = ["aes_ctr_hmac_streaming_key_manager_test.cc"],
+    deps = [
+        ":aes_ctr_hmac_streaming_key_manager",
+        "//cc:streaming_aead",
+        "//cc/subtle:aes_ctr_hmac_streaming",
+        "//cc/subtle:common_enums",
+        "//cc/subtle:random",
+        "//cc/subtle:streaming_aead_test_util",
+        "//cc/subtle:test_util",
+        "//cc/util:istream_input_stream",
+        "//cc/util:ostream_output_stream",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_matchers",
+        "//proto:aes_eax_cc_proto",
+        "//proto:aes_ctr_hmac_streaming_cc_proto",
+        "//proto:common_cc_proto",
+        "//proto:tink_cc_proto",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "streaming_aead_key_templates_test",
+    size = "small",
+    srcs = ["streaming_aead_key_templates_test.cc"],
+    deps = [
+        ":aes_ctr_hmac_streaming_key_manager",
+        ":aes_gcm_hkdf_streaming_key_manager",
+        ":streaming_aead_key_templates",
+        "//cc/util:test_matchers",
+        "//proto:aes_ctr_hmac_streaming_cc_proto",
+        "//proto:aes_gcm_hkdf_streaming_cc_proto",
+        "//proto:common_cc_proto",
+        "//proto:tink_cc_proto",
         "@com_google_googletest//:gtest_main",
     ],
 )
 
+cc_test(
+    name = "streaming_aead_config_test",
+    size = "small",
+    srcs = ["streaming_aead_config_test.cc"],
+    deps = [
+        ":aes_ctr_hmac_streaming_key_manager",
+        ":aes_gcm_hkdf_streaming_key_manager",
+        ":streaming_aead_config",
+        ":streaming_aead_key_templates",
+        "//cc:config",
+        "//cc:keyset_handle",
+        "//cc:registry",
+        "//cc:streaming_aead",
+        "//cc/util:status",
+        "//cc/util:test_matchers",
+        "//cc/util:test_util",
+        "@com_google_absl//absl/memory",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "buffered_input_stream_test",
+    size = "small",
+    srcs = ["buffered_input_stream_test.cc"],
+    linkopts = ["-lpthread"],
+    deps = [
+        ":buffered_input_stream",
+        "//cc:input_stream",
+        "//cc/subtle:random",
+        "//cc/subtle:test_util",
+        "//cc/util:istream_input_stream",
+        "//cc/util:status",
+        "//cc/util:test_matchers",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "decrypting_input_stream_test",
+    size = "small",
+    srcs = ["decrypting_input_stream_test.cc"],
+    deps = [
+        ":decrypting_input_stream",
+        "//cc:input_stream",
+        "//cc:output_stream",
+        "//cc:primitive_set",
+        "//cc:streaming_aead",
+        "//cc/subtle:random",
+        "//cc/subtle:test_util",
+        "//cc/util:istream_input_stream",
+        "//cc/util:ostream_output_stream",
+        "//cc/util:status",
+        "//cc/util:test_matchers",
+        "//cc/util:test_util",
+        "//proto:tink_cc_proto",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "decrypting_random_access_stream_test",
+    size = "small",
+    srcs = ["decrypting_random_access_stream_test.cc"],
+    deps = [
+        ":decrypting_random_access_stream",
+        "//cc:output_stream",
+        "//cc:primitive_set",
+        "//cc:random_access_stream",
+        "//cc:streaming_aead",
+        "//cc/subtle:random",
+        "//cc/subtle:test_util",
+        "//cc/util:file_random_access_stream",
+        "//cc/util:ostream_output_stream",
+        "//cc/util:status",
+        "//cc/util:test_matchers",
+        "//cc/util:test_util",
+        "//proto:tink_cc_proto",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "shared_input_stream_test",
+    size = "small",
+    srcs = ["shared_input_stream_test.cc"],
+    linkopts = ["-lpthread"],
+    deps = [
+        ":buffered_input_stream",
+        ":shared_input_stream",
+        "//cc:input_stream",
+        "//cc/subtle:random",
+        "//cc/subtle:test_util",
+        "//cc/util:istream_input_stream",
+        "//cc/util:status",
+        "//cc/util:test_matchers",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "shared_random_access_stream_test",
+    size = "small",
+    srcs = ["shared_random_access_stream_test.cc"],
+    linkopts = ["-lpthread"],
+    deps = [
+        ":shared_random_access_stream",
+        "//cc:random_access_stream",
+        "//cc/util:buffer",
+        "//cc/util:file_random_access_stream",
+        "//cc/util:status",
+        "//cc/util:test_util",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
diff --git a/cc/streamingaead/CMakeLists.txt b/cc/streamingaead/CMakeLists.txt
new file mode 100644
index 0000000..d87a781
--- /dev/null
+++ b/cc/streamingaead/CMakeLists.txt
@@ -0,0 +1,362 @@
+tink_module(streamingaead)
+
+
+tink_cc_library(
+  NAME streaming_aead_wrapper
+  SRCS
+    streaming_aead_wrapper.cc
+    streaming_aead_wrapper.h
+  DEPS
+    absl::strings
+    tink::core::crypto_format
+    tink::core::input_stream
+    tink::core::output_stream
+    tink::core::primitive_set
+    tink::core::primitive_wrapper
+    tink::core::random_access_stream
+    tink::core::registry
+    tink::core::streaming_aead
+    tink::proto::tink_cc_proto
+    tink::streamingaead::decrypting_input_stream
+    tink::streamingaead::decrypting_random_access_stream
+    tink::util::status
+    tink::util::statusor
+)
+
+tink_cc_library(
+  NAME streaming_aead_config
+  SRCS
+    streaming_aead_config.cc
+    streaming_aead_config.h
+  DEPS
+    absl::memory
+    tink::config::config_util
+    tink::core::registry
+    tink::proto::config_cc_proto
+    tink::streamingaead::aes_ctr_hmac_streaming_key_manager
+    tink::streamingaead::aes_gcm_hkdf_streaming_key_manager
+    tink::streamingaead::streaming_aead_wrapper
+    tink::util::status
+    absl::base
+)
+
+tink_cc_library(
+  NAME streaming_aead_key_templates
+  SRCS
+    streaming_aead_key_templates.cc
+    streaming_aead_key_templates.h
+  DEPS
+    tink::proto::aes_ctr_hmac_streaming_cc_proto
+    tink::proto::aes_gcm_hkdf_streaming_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_library(
+  NAME aes_gcm_hkdf_streaming_key_manager
+  SRCS
+    aes_gcm_hkdf_streaming_key_manager.cc
+    aes_gcm_hkdf_streaming_key_manager.h
+  DEPS
+    absl::strings
+    tink::core::key_manager
+    tink::core::key_type_manager
+    tink::core::streaming_aead
+    tink::proto::aes_gcm_hkdf_streaming_cc_proto
+    tink::proto::tink_cc_proto
+    tink::subtle::aes_gcm_hkdf_stream_segment_encrypter
+    tink::subtle::aes_gcm_hkdf_streaming
+    tink::subtle::random
+    tink::util::constants
+    tink::util::enums
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::util::validation
+)
+
+tink_cc_library(
+  NAME aes_ctr_hmac_streaming_key_manager
+  SRCS
+    aes_ctr_hmac_streaming_key_manager.cc
+    aes_ctr_hmac_streaming_key_manager.h
+  DEPS
+    absl::strings
+    tink::core::key_manager
+    tink::core::key_type_manager
+    tink::core::streaming_aead
+    tink::proto::aes_ctr_hmac_streaming_cc_proto
+    tink::proto::tink_cc_proto
+    tink::subtle::aes_ctr_hmac_streaming
+    tink::subtle::random
+    tink::util::constants
+    tink::util::enums
+    tink::util::errors
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::util::validation
+)
+
+tink_cc_library(
+  NAME buffered_input_stream
+  SRCS
+    buffered_input_stream.cc
+    buffered_input_stream.h
+  DEPS
+    absl::memory
+    tink::core::input_stream
+    tink::core::registry
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+)
+
+tink_cc_library(
+  NAME shared_input_stream
+  SRCS shared_input_stream.h
+  DEPS
+    absl::memory
+    tink::core::input_stream
+    tink::util::errors
+    tink::util::statusor
+)
+
+tink_cc_library(
+  NAME shared_random_access_stream
+  SRCS shared_random_access_stream.h
+  DEPS
+    absl::memory
+    tink::core::random_access_stream
+    tink::util::buffer
+    tink::util::status
+    tink::util::statusor
+)
+
+tink_cc_library(
+  NAME decrypting_input_stream
+  SRCS
+    decrypting_input_stream.cc
+    decrypting_input_stream.h
+  DEPS
+    tink::core::input_stream
+    tink::core::primitive_set
+    tink::core::streaming_aead
+    tink::streamingaead::buffered_input_stream
+    tink::streamingaead::shared_input_stream
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    absl::memory
+)
+
+tink_cc_library(
+  NAME decrypting_random_access_stream
+  SRCS
+    decrypting_random_access_stream.cc
+    decrypting_random_access_stream.h
+  DEPS
+    absl::memory
+    absl::synchronization
+    tink::core::primitive_set
+    tink::core::random_access_stream
+    tink::core::streaming_aead
+    tink::streamingaead::shared_random_access_stream
+    tink::util::buffer
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+)
+
+# tests
+
+tink_cc_test(
+  NAME streaming_aead_wrapper_test
+  SRCS streaming_aead_wrapper_test.cc
+  DEPS
+    absl::memory
+    absl::strings
+    tink::core::input_stream
+    tink::core::output_stream
+    tink::core::primitive_set
+    tink::core::random_access_stream
+    tink::core::streaming_aead
+    tink::proto::tink_cc_proto
+    tink::streamingaead::streaming_aead_wrapper
+    tink::subtle::random
+    tink::subtle::test_util
+    tink::util::buffer
+    tink::util::file_random_access_stream
+    tink::util::istream_input_stream
+    tink::util::ostream_output_stream
+    tink::util::status
+    tink::util::test_matchers
+    tink::util::test_util
+)
+
+tink_cc_test(
+  NAME aes_gcm_hkdf_streaming_key_manager_test
+  SRCS aes_gcm_hkdf_streaming_key_manager_test.cc
+  DEPS
+    absl::strings
+    tink::core::streaming_aead
+    tink::proto::aes_eax_cc_proto
+    tink::proto::aes_gcm_hkdf_streaming_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::tink_cc_proto
+    tink::streamingaead::aes_gcm_hkdf_streaming_key_manager
+    tink::subtle::aes_gcm_hkdf_streaming
+    tink::subtle::common_enums
+    tink::subtle::random
+    tink::subtle::streaming_aead_test_util
+    tink::subtle::test_util
+    tink::util::istream_input_stream
+    tink::util::ostream_output_stream
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+)
+
+tink_cc_test(
+  NAME aes_ctr_hmac_streaming_key_manager_test
+  SRCS aes_ctr_hmac_streaming_key_manager_test.cc
+  DEPS
+    absl::strings
+    tink::core::streaming_aead
+    tink::proto::aes_eax_cc_proto
+    tink::proto::aes_ctr_hmac_streaming_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::tink_cc_proto
+    tink::streamingaead::aes_ctr_hmac_streaming_key_manager
+    tink::subtle::aes_ctr_hmac_streaming
+    tink::subtle::common_enums
+    tink::subtle::random
+    tink::subtle::streaming_aead_test_util
+    tink::subtle::test_util
+    tink::util::istream_input_stream
+    tink::util::ostream_output_stream
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+)
+
+tink_cc_test(
+  NAME streaming_aead_key_templates_test
+  SRCS streaming_aead_key_templates_test.cc
+  DEPS
+    tink::proto::aes_ctr_hmac_streaming_cc_proto
+    tink::proto::aes_gcm_hkdf_streaming_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::tink_cc_proto
+    tink::streamingaead::aes_ctr_hmac_streaming_key_manager
+    tink::streamingaead::aes_gcm_hkdf_streaming_key_manager
+    tink::streamingaead::streaming_aead_key_templates
+    tink::util::test_matchers
+)
+
+tink_cc_test(
+  NAME streaming_aead_config_test
+  SRCS streaming_aead_config_test.cc
+  DEPS
+    absl::memory
+    tink::core::config
+    tink::core::keyset_handle
+    tink::core::registry
+    tink::core::streaming_aead
+    tink::streamingaead::aes_ctr_hmac_streaming_key_manager
+    tink::streamingaead::aes_gcm_hkdf_streaming_key_manager
+    tink::streamingaead::streaming_aead_config
+    tink::streamingaead::streaming_aead_key_templates
+    tink::util::status
+    tink::util::test_matchers
+    tink::util::test_util
+)
+
+tink_cc_test(
+  NAME buffered_input_stream_test
+  SRCS buffered_input_stream_test.cc
+  DEPS
+    absl::memory
+    absl::strings
+    gmock
+    tink::core::input_stream
+    tink::streamingaead::buffered_input_stream
+    tink::subtle::random
+    tink::subtle::test_util
+    tink::util::istream_input_stream
+    tink::util::status
+    tink::util::test_matchers
+)
+
+tink_cc_test(
+  NAME decrypting_input_stream_test
+  SRCS decrypting_input_stream_test.cc
+  DEPS
+    absl::memory
+    absl::strings
+    tink::streamingaead::decrypting_input_stream
+    tink::core::input_stream
+    tink::core::output_stream
+    tink::core::primitive_set
+    tink::core::streaming_aead
+    tink::proto::tink_cc_proto
+    tink::subtle::random
+    tink::subtle::test_util
+    tink::util::istream_input_stream
+    tink::util::ostream_output_stream
+    tink::util::status
+    tink::util::test_matchers
+    tink::util::test_util
+)
+
+tink_cc_test(
+  NAME decrypting_random_access_stream_test
+  SRCS decrypting_random_access_stream_test.cc
+  DEPS
+    absl::memory
+    absl::strings
+    tink::core::output_stream
+    tink::core::primitive_set
+    tink::core::random_access_stream
+    tink::core::streaming_aead
+    tink::proto::tink_cc_proto
+    tink::streamingaead::decrypting_random_access_stream
+    tink::subtle::random
+    tink::subtle::test_util
+    tink::util::file_random_access_stream
+    tink::util::ostream_output_stream
+    tink::util::status
+    tink::util::test_matchers
+    tink::util::test_util
+)
+
+tink_cc_test(
+  NAME shared_input_stream_test
+  SRCS shared_input_stream_test.cc
+  DEPS
+    absl::memory
+    absl::strings
+    tink::core::input_stream
+    tink::streamingaead::buffered_input_stream
+    tink::streamingaead::shared_input_stream
+    tink::subtle::random
+    tink::subtle::test_util
+    tink::util::istream_input_stream
+    tink::util::status
+    tink::util::test_matchers
+)
+
+tink_cc_test(
+  NAME shared_random_access_stream_test
+  SRCS shared_random_access_stream_test.cc
+  DEPS
+    absl::memory
+    absl::strings
+    tink::core::random_access_stream
+    tink::streamingaead::shared_random_access_stream
+    tink::util::buffer
+    tink::util::file_random_access_stream
+    tink::util::status
+    tink::util::test_util
+)
diff --git a/cc/streamingaead/aes_ctr_hmac_streaming_key_manager.cc b/cc/streamingaead/aes_ctr_hmac_streaming_key_manager.cc
new file mode 100644
index 0000000..11266c5
--- /dev/null
+++ b/cc/streamingaead/aes_ctr_hmac_streaming_key_manager.cc
@@ -0,0 +1,105 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/streamingaead/aes_ctr_hmac_streaming_key_manager.h"
+
+#include "tink/subtle/aes_ctr_hmac_streaming.h"
+#include "tink/subtle/random.h"
+#include "tink/util/status.h"
+#include "tink/util/validation.h"
+
+namespace crypto {
+namespace tink {
+
+using ::crypto::tink::subtle::AesCtrHmacStreaming;
+using ::crypto::tink::util::Status;
+using ::crypto::tink::util::StatusOr;
+using ::google::crypto::tink::AesCtrHmacStreamingKey;
+using ::google::crypto::tink::AesCtrHmacStreamingKeyFormat;
+using ::google::crypto::tink::AesCtrHmacStreamingParams;
+using ::google::crypto::tink::HashType;
+
+namespace {
+
+Status ValidateParams(const AesCtrHmacStreamingParams& params) {
+  if (!(params.hkdf_hash_type() == HashType::SHA1 ||
+        params.hkdf_hash_type() == HashType::SHA256 ||
+        params.hkdf_hash_type() == HashType::SHA512)) {
+    return Status(util::error::INVALID_ARGUMENT, "unsupported hkdf_hash_type");
+  }
+  if (!(params.hmac_params().hash() == HashType::SHA1 ||
+        params.hmac_params().hash() == HashType::SHA256 ||
+        params.hmac_params().hash() == HashType::SHA512)) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "unsupported hmac_params.hash");
+  }
+  if (params.hmac_params().tag_size() < 10) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "hmac_params.tag_size too small");
+  }
+  if ((params.hmac_params().hash() == HashType::SHA1 &&
+       params.hmac_params().tag_size() > 20) ||
+      (params.hmac_params().hash() == HashType::SHA256 &&
+       params.hmac_params().tag_size() > 32) ||
+      (params.hmac_params().hash() == HashType::SHA512 &&
+       params.hmac_params().tag_size() > 64)) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "hmac_params.tag_size too big");
+  }
+  int header_size = 1 + params.derived_key_size() +
+      AesCtrHmacStreaming::kNoncePrefixSizeInBytes;
+  if (params.ciphertext_segment_size() <=
+      header_size + params.hmac_params().tag_size()) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "ciphertext_segment_size too small");
+  }
+  return ValidateAesKeySize(params.derived_key_size());
+}
+
+}  // namespace
+
+crypto::tink::util::StatusOr<google::crypto::tink::AesCtrHmacStreamingKey>
+AesCtrHmacStreamingKeyManager::CreateKey(
+    const google::crypto::tink::AesCtrHmacStreamingKeyFormat& key_format)
+    const {
+  AesCtrHmacStreamingKey key;
+  key.set_version(get_version());
+  key.set_key_value(subtle::Random::GetRandomBytes(key_format.key_size()));
+  *key.mutable_params() = key_format.params();
+  return key;
+};
+
+
+Status AesCtrHmacStreamingKeyManager::ValidateKey(
+    const AesCtrHmacStreamingKey& key) const {
+  Status status = ValidateVersion(key.version(), get_version());
+  if (!status.ok()) return status;
+  if (key.key_value().size() < key.params().derived_key_size()) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "key_value (i.e. ikm) too short");
+  }
+  return ValidateParams(key.params());
+}
+
+Status AesCtrHmacStreamingKeyManager::ValidateKeyFormat(
+    const AesCtrHmacStreamingKeyFormat& key_format) const {
+  if (key_format.key_size() < key_format.params().derived_key_size()) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "key_size must not be smaller than derived_key_size");
+  }
+  return ValidateParams(key_format.params());
+}
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/streamingaead/aes_ctr_hmac_streaming_key_manager.h b/cc/streamingaead/aes_ctr_hmac_streaming_key_manager.h
new file mode 100644
index 0000000..a3b48c6
--- /dev/null
+++ b/cc/streamingaead/aes_ctr_hmac_streaming_key_manager.h
@@ -0,0 +1,101 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+#ifndef TINK_STREAMINGAEAD_AES_CTR_HMAC_STREAMING_KEY_MANAGER_H_
+#define TINK_STREAMINGAEAD_AES_CTR_HMAC_STREAMING_KEY_MANAGER_H_
+
+#include <algorithm>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "tink/core/key_type_manager.h"
+#include "tink/streaming_aead.h"
+#include "tink/subtle/aes_ctr_hmac_streaming.h"
+#include "tink/util/constants.h"
+#include "tink/util/enums.h"
+#include "tink/util/errors.h"
+#include "tink/util/protobuf_helper.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "proto/aes_ctr_hmac_streaming.pb.h"
+#include "proto/tink.pb.h"
+
+namespace crypto {
+namespace tink {
+
+class AesCtrHmacStreamingKeyManager
+    : public KeyTypeManager<google::crypto::tink::AesCtrHmacStreamingKey,
+                            google::crypto::tink::AesCtrHmacStreamingKeyFormat,
+                            List<StreamingAead>> {
+ public:
+  class StreamingAeadFactory
+      : public PrimitiveFactory<StreamingAead> {
+    crypto::tink::util::StatusOr<std::unique_ptr<StreamingAead>> Create(
+        const google::crypto::tink::AesCtrHmacStreamingKey& key)
+        const override {
+          subtle::AesCtrHmacStreaming::Params params;
+          params.ikm = key.key_value();
+          params.hkdf_algo = crypto::tink::util::Enums::ProtoToSubtle(
+              key.params().hkdf_hash_type());
+          params.key_size = key.params().derived_key_size();
+          params.ciphertext_segment_size =
+              key.params().ciphertext_segment_size();
+          params.ciphertext_offset = 0;
+          params.tag_algo = crypto::tink::util::Enums::ProtoToSubtle(
+              key.params().hmac_params().hash());
+          params.tag_size = key.params().hmac_params().tag_size();
+          auto streaming_result =
+              crypto::tink::subtle::AesCtrHmacStreaming::New(params);
+          if (!streaming_result.ok()) return streaming_result.status();
+          return {std::move(streaming_result.ValueOrDie())};
+        }
+  };
+
+  AesCtrHmacStreamingKeyManager()
+      : KeyTypeManager(
+            absl::make_unique<AesCtrHmacStreamingKeyManager::
+                                  StreamingAeadFactory>()) {}
+
+  // Returns the version of this key manager.
+  uint32_t get_version() const override { return 0; }
+
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::SYMMETRIC;
+  }
+
+  const std::string& get_key_type() const override { return key_type_; }
+
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::AesCtrHmacStreamingKey& key) const override;
+
+  crypto::tink::util::Status ValidateKeyFormat(
+      const google::crypto::tink::AesCtrHmacStreamingKeyFormat& key_format)
+      const override;
+
+  crypto::tink::util::StatusOr<google::crypto::tink::AesCtrHmacStreamingKey>
+  CreateKey(const google::crypto::tink::AesCtrHmacStreamingKeyFormat&
+                key_format) const override;
+
+  ~AesCtrHmacStreamingKeyManager() override {}
+
+ private:
+  const std::string key_type_ = absl::StrCat(
+      kTypeGoogleapisCom,
+      google::crypto::tink::AesCtrHmacStreamingKey().GetTypeName());
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_STREAMINGAEAD_AES_CTR_HMAC_STREAMING_KEY_MANAGER_H_
diff --git a/cc/streamingaead/aes_ctr_hmac_streaming_key_manager_test.cc b/cc/streamingaead/aes_ctr_hmac_streaming_key_manager_test.cc
new file mode 100644
index 0000000..886b512
--- /dev/null
+++ b/cc/streamingaead/aes_ctr_hmac_streaming_key_manager_test.cc
@@ -0,0 +1,252 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "tink/streamingaead/aes_ctr_hmac_streaming_key_manager.h"
+
+#include <sstream>
+#include <string>
+
+#include "gtest/gtest.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "tink/streaming_aead.h"
+#include "tink/subtle/aes_ctr_hmac_streaming.h"
+#include "tink/subtle/common_enums.h"
+#include "tink/subtle/random.h"
+#include "tink/subtle/streaming_aead_test_util.h"
+#include "tink/subtle/test_util.h"
+#include "tink/util/istream_input_stream.h"
+#include "tink/util/ostream_output_stream.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/test_matchers.h"
+#include "proto/aes_eax.pb.h"
+#include "proto/aes_ctr_hmac_streaming.pb.h"
+#include "proto/common.pb.h"
+#include "proto/tink.pb.h"
+
+namespace crypto {
+namespace tink {
+
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
+using ::google::crypto::tink::AesCtrHmacStreamingKey;
+using ::google::crypto::tink::AesCtrHmacStreamingKeyFormat;
+using ::google::crypto::tink::HashType;
+using ::google::crypto::tink::KeyData;
+using ::testing::Eq;
+using ::testing::HasSubstr;
+
+namespace {
+
+TEST(AesCtrHmacStreamingKeyManagerTest, ValidateKey) {
+  AesCtrHmacStreamingKey key;
+  key.set_version(0);
+  key.set_key_value("0123456789abcdef");
+  key.mutable_params()->set_derived_key_size(16);
+  key.mutable_params()->set_hkdf_hash_type(HashType::SHA256);
+  key.mutable_params()->set_ciphertext_segment_size(1024);
+  key.mutable_params()->mutable_hmac_params()->set_hash(HashType::SHA256);
+  key.mutable_params()->mutable_hmac_params()->set_tag_size(32);
+  EXPECT_THAT(AesCtrHmacStreamingKeyManager().ValidateKey(key), IsOk());
+}
+
+TEST(AesCtrHmacStreamingKeyManagerTest, ValidateKeyDerivedKeySizes) {
+  for (int derived_key_size = 0; derived_key_size < 42; derived_key_size++) {
+    SCOPED_TRACE(absl::StrCat(" derived_key_size = ", derived_key_size));
+    AesCtrHmacStreamingKey key;
+    key.set_version(0);
+    key.set_key_value(std::string(derived_key_size, 'a'));  // ikm
+    key.mutable_params()->set_derived_key_size(derived_key_size);
+    key.mutable_params()->set_hkdf_hash_type(HashType::SHA256);
+    key.mutable_params()->set_ciphertext_segment_size(1024);
+    key.mutable_params()->mutable_hmac_params()->set_hash(HashType::SHA256);
+    key.mutable_params()->mutable_hmac_params()->set_tag_size(32);
+    if (derived_key_size == 16 || derived_key_size == 32) {
+      EXPECT_THAT(AesCtrHmacStreamingKeyManager().ValidateKey(key), IsOk());
+    } else {
+      EXPECT_THAT(AesCtrHmacStreamingKeyManager().ValidateKey(key),
+                  StatusIs(util::error::INVALID_ARGUMENT));
+    }
+  }
+}
+
+TEST(AesCtrHmacStreamingKeyManagerTest, ValidateKeyDerivedKeyWrongVersion) {
+  AesCtrHmacStreamingKey key;
+  key.set_version(1);
+  key.set_key_value("0123456789abcdef");
+  key.mutable_params()->set_derived_key_size(16);
+  key.mutable_params()->set_hkdf_hash_type(HashType::SHA256);
+  key.mutable_params()->set_ciphertext_segment_size(1024);
+  key.mutable_params()->mutable_hmac_params()->set_hash(HashType::SHA256);
+  key.mutable_params()->mutable_hmac_params()->set_tag_size(32);
+  EXPECT_THAT(AesCtrHmacStreamingKeyManager().ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(AesCtrHmacStreamingKeyManagerTest, GetPrimitive) {
+  std::string plaintext = "some plaintext";
+  std::string aad = "some aad";
+
+  AesCtrHmacStreamingKey key;
+  key.set_version(0);
+  key.set_key_value("16 bytes of key ");
+  key.mutable_params()->set_ciphertext_segment_size(1024);
+  key.mutable_params()->set_derived_key_size(16);
+  key.mutable_params()->set_hkdf_hash_type(HashType::SHA256);
+  key.mutable_params()->mutable_hmac_params()->set_hash(HashType::SHA256);
+  key.mutable_params()->mutable_hmac_params()->set_tag_size(32);
+
+  auto streaming_aead_from_manager_result =
+      AesCtrHmacStreamingKeyManager().GetPrimitive<StreamingAead>(key);
+  ASSERT_THAT(streaming_aead_from_manager_result.status(), IsOk());
+
+  subtle::AesCtrHmacStreaming::Params params;
+  params.ikm = "16 bytes of key ";
+  params.hkdf_algo = subtle::HashType::SHA256;;
+  params.key_size = 16;
+  params.ciphertext_segment_size = 1024;
+  params.ciphertext_offset = 0;
+  params.tag_algo = subtle::HashType::SHA256;
+  params.tag_size = 32;
+  auto streaming_aead_direct_result =
+      crypto::tink::subtle::AesCtrHmacStreaming::New(params);
+  ASSERT_THAT(streaming_aead_direct_result.status(), IsOk());
+
+  // Check that the two primitives are the same by encrypting with one, and
+  // decrypting with the other.
+  EXPECT_THAT(
+      EncryptThenDecrypt(streaming_aead_from_manager_result.ValueOrDie().get(),
+                         streaming_aead_direct_result.ValueOrDie().get(),
+                         subtle::Random::GetRandomBytes(10000),
+                         "some associated data", params.ciphertext_offset),
+      IsOk());
+}
+
+TEST(AesCtrHmacStreamingKeyManagerTest, Version) {
+  EXPECT_THAT(AesCtrHmacStreamingKeyManager().get_version(), Eq(0));
+}
+
+TEST(AesCtrHmacStreamingKeyManagerTest, KeyMaterialType) {
+  EXPECT_THAT(AesCtrHmacStreamingKeyManager().key_material_type(),
+              Eq(google::crypto::tink::KeyData::SYMMETRIC));
+}
+
+TEST(AesCtrHmacStreamingKeyManagerTest, KeyType) {
+  EXPECT_THAT(
+      AesCtrHmacStreamingKeyManager().get_key_type(),
+      Eq("type.googleapis.com/google.crypto.tink.AesCtrHmacStreamingKey"));
+}
+
+TEST(AesCtrHmacStreamingKeyManagerTest, ValidateKeyFormatEmpty) {
+  EXPECT_THAT(AesCtrHmacStreamingKeyManager().ValidateKeyFormat(
+                  AesCtrHmacStreamingKeyFormat()),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(AesCtrHmacStreamingKeyManagerTest, ValidateKeyFormat) {
+  AesCtrHmacStreamingKeyFormat key_format;
+  key_format.set_key_size(32);
+  key_format.mutable_params()->set_derived_key_size(32);
+  key_format.mutable_params()->set_hkdf_hash_type(HashType::SHA256);
+  key_format.mutable_params()->set_ciphertext_segment_size(1024);
+  key_format.mutable_params()->mutable_hmac_params()->
+      set_hash(HashType::SHA256);
+  key_format.mutable_params()->mutable_hmac_params()->set_tag_size(32);
+  EXPECT_THAT(AesCtrHmacStreamingKeyManager().ValidateKeyFormat(key_format),
+              IsOk());
+}
+
+TEST(AesCtrHmacStreamingKeyManagerTest, ValidateKeyFormatSmallKey) {
+  AesCtrHmacStreamingKeyFormat key_format;
+  key_format.set_key_size(16);
+  key_format.mutable_params()->set_derived_key_size(32);
+  key_format.mutable_params()->set_hkdf_hash_type(HashType::SHA256);
+  key_format.mutable_params()->set_ciphertext_segment_size(1024);
+  key_format.mutable_params()->mutable_hmac_params()->
+      set_hash(HashType::SHA256);
+  key_format.mutable_params()->mutable_hmac_params()->set_tag_size(32);
+  EXPECT_THAT(
+      AesCtrHmacStreamingKeyManager().ValidateKeyFormat(key_format),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("derived_key_size")));
+}
+
+TEST(AesCtrHmacStreamingKeyManagerTest, ValidateKeyFormatWrongHash) {
+  AesCtrHmacStreamingKeyFormat key_format;
+  key_format.set_key_size(32);
+  key_format.mutable_params()->set_derived_key_size(32);
+  key_format.mutable_params()->set_ciphertext_segment_size(1024);
+  key_format.mutable_params()->mutable_hmac_params()->
+      set_hash(HashType::SHA256);
+  key_format.mutable_params()->mutable_hmac_params()->set_tag_size(32);
+  EXPECT_THAT(
+      AesCtrHmacStreamingKeyManager().ValidateKeyFormat(key_format),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("hkdf_hash_type")));
+}
+
+TEST(AesCtrHmacStreamingKeyManagerTest, ValidateKeyFormatWrongHmacHash) {
+  AesCtrHmacStreamingKeyFormat key_format;
+  key_format.set_key_size(32);
+  key_format.mutable_params()->set_derived_key_size(32);
+  key_format.mutable_params()->set_hkdf_hash_type(HashType::SHA256);
+  key_format.mutable_params()->set_ciphertext_segment_size(1024);
+  key_format.mutable_params()->mutable_hmac_params()->set_tag_size(32);
+  EXPECT_THAT(
+      AesCtrHmacStreamingKeyManager().ValidateKeyFormat(key_format),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("hmac_params.hash")));
+}
+
+TEST(AesCtrHmacStreamingKeyManagerTest, ValidateKeyFormatSmallSegment) {
+  AesCtrHmacStreamingKeyFormat key_format;
+  key_format.set_key_size(32);
+  key_format.mutable_params()->set_derived_key_size(32);
+  key_format.mutable_params()->set_hkdf_hash_type(HashType::SHA256);
+  key_format.mutable_params()->set_ciphertext_segment_size(45);
+  key_format.mutable_params()->mutable_hmac_params()->
+      set_hash(HashType::SHA256);
+  key_format.mutable_params()->mutable_hmac_params()->set_tag_size(32);
+  EXPECT_THAT(AesCtrHmacStreamingKeyManager().ValidateKeyFormat(key_format),
+              StatusIs(util::error::INVALID_ARGUMENT,
+                       HasSubstr("ciphertext_segment_size")));
+}
+
+TEST(AesCtrHmacStreamingKeyManagerTest, CreateKey) {
+  AesCtrHmacStreamingKeyFormat key_format;
+  key_format.set_key_size(32);
+  key_format.mutable_params()->set_derived_key_size(32);
+  key_format.mutable_params()->set_hkdf_hash_type(HashType::SHA256);
+  key_format.mutable_params()->set_ciphertext_segment_size(1024);
+  key_format.mutable_params()->mutable_hmac_params()->
+      set_hash(HashType::SHA256);
+  key_format.mutable_params()->mutable_hmac_params()->set_tag_size(32);
+  auto key_or = AesCtrHmacStreamingKeyManager().CreateKey(key_format);
+  ASSERT_THAT(key_or.status(), IsOk());
+  EXPECT_THAT(key_or.ValueOrDie().version(), Eq(0));
+  EXPECT_THAT(key_or.ValueOrDie().params().ciphertext_segment_size(),
+              Eq(key_format.params().ciphertext_segment_size()));
+  EXPECT_THAT(key_or.ValueOrDie().params().derived_key_size(),
+              Eq(key_format.params().derived_key_size()));
+  EXPECT_THAT(key_or.ValueOrDie().params().hkdf_hash_type(),
+              Eq(key_format.params().hkdf_hash_type()));
+  EXPECT_THAT(key_or.ValueOrDie().key_value().size(),
+              Eq(key_format.key_size()));
+  EXPECT_THAT(key_or.ValueOrDie().params().hmac_params().hash(),
+              Eq(key_format.params().hmac_params().hash()));
+  EXPECT_THAT(key_or.ValueOrDie().params().hmac_params().tag_size(),
+              Eq(key_format.params().hmac_params().tag_size()));
+}
+
+}  // namespace
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/streamingaead/aes_gcm_hkdf_streaming_key_manager.cc b/cc/streamingaead/aes_gcm_hkdf_streaming_key_manager.cc
new file mode 100644
index 0000000..f0fa258
--- /dev/null
+++ b/cc/streamingaead/aes_gcm_hkdf_streaming_key_manager.cc
@@ -0,0 +1,87 @@
+// Copyright 2017 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/streamingaead/aes_gcm_hkdf_streaming_key_manager.h"
+
+#include "tink/subtle/aes_gcm_hkdf_stream_segment_encrypter.h"
+#include "tink/subtle/random.h"
+#include "tink/util/validation.h"
+
+namespace crypto {
+namespace tink {
+
+using ::crypto::tink::subtle::AesGcmHkdfStreamSegmentEncrypter;
+using ::crypto::tink::util::Status;
+using ::crypto::tink::util::StatusOr;
+using ::google::crypto::tink::AesGcmHkdfStreamingKey;
+using ::google::crypto::tink::AesGcmHkdfStreamingKeyFormat;
+using ::google::crypto::tink::AesGcmHkdfStreamingParams;
+using ::google::crypto::tink::HashType;
+
+namespace {
+
+Status ValidateParams(const AesGcmHkdfStreamingParams& params) {
+  if (!(params.hkdf_hash_type() == HashType::SHA1 ||
+        params.hkdf_hash_type() == HashType::SHA256 ||
+        params.hkdf_hash_type() == HashType::SHA512)) {
+    return Status(util::error::INVALID_ARGUMENT, "unsupported hkdf_hash_type");
+  }
+  int header_size = 1 + params.derived_key_size() +
+      AesGcmHkdfStreamSegmentEncrypter::kNoncePrefixSizeInBytes;
+  if (params.ciphertext_segment_size() <=
+      header_size + AesGcmHkdfStreamSegmentEncrypter::kTagSizeInBytes) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "ciphertext_segment_size too small");
+  }
+  return ValidateAesKeySize(params.derived_key_size());
+}
+
+}  // namespace
+
+crypto::tink::util::StatusOr<google::crypto::tink::AesGcmHkdfStreamingKey>
+AesGcmHkdfStreamingKeyManager::CreateKey(
+    const google::crypto::tink::AesGcmHkdfStreamingKeyFormat& key_format)
+    const {
+  AesGcmHkdfStreamingKey key;
+  key.set_version(get_version());
+  key.set_key_value(subtle::Random::GetRandomBytes(key_format.key_size()));
+  *key.mutable_params() = key_format.params();
+  return key;
+};
+
+
+Status AesGcmHkdfStreamingKeyManager::ValidateKey(
+    const AesGcmHkdfStreamingKey& key) const {
+  Status status = ValidateVersion(key.version(), get_version());
+  if (!status.ok()) return status;
+  if (key.key_value().size() < key.params().derived_key_size()) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "key_value (i.e. ikm) too short");
+  }
+  return ValidateParams(key.params());
+}
+
+Status AesGcmHkdfStreamingKeyManager::ValidateKeyFormat(
+    const AesGcmHkdfStreamingKeyFormat& key_format) const {
+  if (key_format.key_size() < key_format.params().derived_key_size()) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "key_size must not be smaller than derived_key_size");
+  }
+  return ValidateParams(key_format.params());
+}
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/streamingaead/aes_gcm_hkdf_streaming_key_manager.h b/cc/streamingaead/aes_gcm_hkdf_streaming_key_manager.h
new file mode 100644
index 0000000..15b18a3
--- /dev/null
+++ b/cc/streamingaead/aes_gcm_hkdf_streaming_key_manager.h
@@ -0,0 +1,101 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+#ifndef TINK_STREAMINGAEAD_AES_GCM_HKDF_STREAMING_KEY_MANAGER_H_
+#define TINK_STREAMINGAEAD_AES_GCM_HKDF_STREAMING_KEY_MANAGER_H_
+
+#include <algorithm>
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "tink/core/key_type_manager.h"
+#include "tink/key_manager.h"
+#include "tink/streaming_aead.h"
+#include "tink/subtle/aes_gcm_hkdf_streaming.h"
+#include "tink/util/constants.h"
+#include "tink/util/enums.h"
+#include "tink/util/errors.h"
+#include "tink/util/protobuf_helper.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "proto/aes_gcm_hkdf_streaming.pb.h"
+#include "proto/tink.pb.h"
+
+namespace crypto {
+namespace tink {
+
+class AesGcmHkdfStreamingKeyManager
+    : public KeyTypeManager<google::crypto::tink::AesGcmHkdfStreamingKey,
+                            google::crypto::tink::AesGcmHkdfStreamingKeyFormat,
+                            List<StreamingAead>> {
+ public:
+  class AesGcmHkdfStreamingKeyManagerFactory
+      : public PrimitiveFactory<StreamingAead> {
+    crypto::tink::util::StatusOr<std::unique_ptr<StreamingAead>> Create(
+        const google::crypto::tink::AesGcmHkdfStreamingKey& key)
+        const override {
+      auto streaming_result = crypto::tink::subtle::AesGcmHkdfStreaming::New(
+          key.key_value(),
+          crypto::tink::util::Enums::ProtoToSubtle(
+              key.params().hkdf_hash_type()),
+          key.params().derived_key_size(),
+          key.params().ciphertext_segment_size(),
+          /* ciphertext_offset = */ 0);
+      if (!streaming_result.ok()) return streaming_result.status();
+      return {std::move(streaming_result.ValueOrDie())};
+    }
+  };
+
+  AesGcmHkdfStreamingKeyManager()
+      : KeyTypeManager(
+            absl::make_unique<AesGcmHkdfStreamingKeyManager::
+                                  AesGcmHkdfStreamingKeyManagerFactory>()) {}
+
+  // Returns the version of this key manager.
+  uint32_t get_version() const override { return 0; }
+
+  google::crypto::tink::KeyData::KeyMaterialType key_material_type()
+      const override {
+    return google::crypto::tink::KeyData::SYMMETRIC;
+  }
+
+  const std::string& get_key_type() const override { return key_type_; }
+
+  crypto::tink::util::Status ValidateKey(
+      const google::crypto::tink::AesGcmHkdfStreamingKey& key) const override;
+
+  crypto::tink::util::Status ValidateKeyFormat(
+      const google::crypto::tink::AesGcmHkdfStreamingKeyFormat& key_format)
+      const override;
+
+  crypto::tink::util::StatusOr<google::crypto::tink::AesGcmHkdfStreamingKey>
+  CreateKey(const google::crypto::tink::AesGcmHkdfStreamingKeyFormat&
+                key_format) const override;
+
+  ~AesGcmHkdfStreamingKeyManager() override {}
+
+ private:
+  const std::string key_type_ = absl::StrCat(
+      kTypeGoogleapisCom,
+      google::crypto::tink::AesGcmHkdfStreamingKey().GetTypeName());
+
+  static crypto::tink::util::Status Validate(
+      const google::crypto::tink::AesGcmHkdfStreamingKeyFormat& key_format);
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_STREAMINGAEAD_AES_GCM_HKDF_STREAMING_KEY_MANAGER_H_
diff --git a/cc/streamingaead/aes_gcm_hkdf_streaming_key_manager_test.cc b/cc/streamingaead/aes_gcm_hkdf_streaming_key_manager_test.cc
new file mode 100644
index 0000000..e14994c
--- /dev/null
+++ b/cc/streamingaead/aes_gcm_hkdf_streaming_key_manager_test.cc
@@ -0,0 +1,212 @@
+// Copyright 2017 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "tink/streamingaead/aes_gcm_hkdf_streaming_key_manager.h"
+
+#include <sstream>
+#include <string>
+
+#include "gtest/gtest.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "tink/streaming_aead.h"
+#include "tink/subtle/aes_gcm_hkdf_streaming.h"
+#include "tink/subtle/common_enums.h"
+#include "tink/subtle/random.h"
+#include "tink/subtle/streaming_aead_test_util.h"
+#include "tink/subtle/test_util.h"
+#include "tink/util/istream_input_stream.h"
+#include "tink/util/ostream_output_stream.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/test_matchers.h"
+#include "proto/aes_eax.pb.h"
+#include "proto/aes_gcm_hkdf_streaming.pb.h"
+#include "proto/common.pb.h"
+#include "proto/tink.pb.h"
+
+namespace crypto {
+namespace tink {
+
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
+using ::google::crypto::tink::AesGcmHkdfStreamingKey;
+using ::google::crypto::tink::AesGcmHkdfStreamingKeyFormat;
+using ::google::crypto::tink::HashType;
+using ::google::crypto::tink::KeyData;
+using ::testing::Eq;
+using ::testing::HasSubstr;
+
+namespace {
+
+TEST(AesGcmHkdfStreamingKeyManagerTest, ValidateKey) {
+  AesGcmHkdfStreamingKey key;
+  key.set_version(0);
+  key.set_key_value("0123456789abcdef");
+  key.mutable_params()->set_derived_key_size(16);
+  key.mutable_params()->set_hkdf_hash_type(HashType::SHA256);
+  key.mutable_params()->set_ciphertext_segment_size(1024);
+  EXPECT_THAT(AesGcmHkdfStreamingKeyManager().ValidateKey(key), IsOk());
+}
+
+TEST(AesGcmHkdfStreamingKeyManagerTest, ValidateKeyDerivedKeySizes) {
+  for (int derived_key_size = 0; derived_key_size < 42; derived_key_size++) {
+    SCOPED_TRACE(absl::StrCat(" derived_key_size = ", derived_key_size));
+    AesGcmHkdfStreamingKey key;
+    key.set_version(0);
+    key.set_key_value(std::string(derived_key_size, 'a'));  // ikm
+    key.mutable_params()->set_derived_key_size(derived_key_size);
+    key.mutable_params()->set_hkdf_hash_type(HashType::SHA256);
+    key.mutable_params()->set_ciphertext_segment_size(1024);
+    if (derived_key_size == 16 || derived_key_size == 32) {
+      EXPECT_THAT(AesGcmHkdfStreamingKeyManager().ValidateKey(key), IsOk());
+    } else {
+      EXPECT_THAT(AesGcmHkdfStreamingKeyManager().ValidateKey(key),
+                  StatusIs(util::error::INVALID_ARGUMENT));
+    }
+  }
+}
+
+TEST(AesGcmHkdfStreamingKeyManagerTest, ValidateKeyDerivedKeyWrongVersion) {
+  AesGcmHkdfStreamingKey key;
+  key.set_version(1);
+  key.set_key_value("0123456789abcdef");
+  key.mutable_params()->set_derived_key_size(16);
+  key.mutable_params()->set_hkdf_hash_type(HashType::SHA256);
+  key.mutable_params()->set_ciphertext_segment_size(1024);
+  EXPECT_THAT(AesGcmHkdfStreamingKeyManager().ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(AesGcmHkdfStreamingKeyManagerTest, GetPrimitive) {
+  std::string plaintext = "some plaintext";
+  std::string aad = "some aad";
+
+  AesGcmHkdfStreamingKey key;
+  key.set_version(0);
+  key.set_key_value("16 bytes of key ");
+  key.mutable_params()->set_ciphertext_segment_size(1024);
+  key.mutable_params()->set_derived_key_size(16);
+  key.mutable_params()->set_hkdf_hash_type(HashType::SHA256);
+
+  auto streaming_aead_from_manager_result =
+      AesGcmHkdfStreamingKeyManager().GetPrimitive<StreamingAead>(key);
+  EXPECT_THAT(streaming_aead_from_manager_result.status(), IsOk());
+
+  int derived_key_size = 16;
+  int ciphertext_segment_size = 1024;
+  int ciphertext_offset = 0;
+  auto streaming_aead_direct_result =
+      crypto::tink::subtle::AesGcmHkdfStreaming::New(
+          "16 bytes of key ", crypto::tink::subtle::HashType::SHA256,
+          derived_key_size, ciphertext_segment_size, ciphertext_offset);
+  EXPECT_THAT(streaming_aead_direct_result.status(), IsOk());
+
+  // Check that the two primitives are the same by encrypting with one, and
+  // decrypting with the other.
+  EXPECT_THAT(
+      EncryptThenDecrypt(streaming_aead_from_manager_result.ValueOrDie().get(),
+                         streaming_aead_direct_result.ValueOrDie().get(),
+                         subtle::Random::GetRandomBytes(10000),
+                         "some associated data", ciphertext_offset),
+      IsOk());
+}
+
+TEST(AesGcmHkdfStreamingKeyManagerTest, Version) {
+  EXPECT_THAT(AesGcmHkdfStreamingKeyManager().get_version(), Eq(0));
+}
+
+TEST(AesGcmHkdfStreamingKeyManagerTest, KeyMaterialType) {
+  EXPECT_THAT(AesGcmHkdfStreamingKeyManager().key_material_type(),
+              Eq(google::crypto::tink::KeyData::SYMMETRIC));
+}
+
+TEST(AesGcmHkdfStreamingKeyManagerTest, KeyType) {
+  EXPECT_THAT(
+      AesGcmHkdfStreamingKeyManager().get_key_type(),
+      Eq("type.googleapis.com/google.crypto.tink.AesGcmHkdfStreamingKey"));
+}
+
+TEST(AesGcmHkdfStreamingKeyManagerTest, ValidateKeyFormatEmpty) {
+  EXPECT_THAT(AesGcmHkdfStreamingKeyManager().ValidateKeyFormat(
+                  AesGcmHkdfStreamingKeyFormat()),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(AesGcmHkdfStreamingKeyManagerTest, ValidateKeyFormat) {
+  AesGcmHkdfStreamingKeyFormat key_format;
+  key_format.set_key_size(32);
+  key_format.mutable_params()->set_derived_key_size(32);
+  key_format.mutable_params()->set_hkdf_hash_type(HashType::SHA256);
+  key_format.mutable_params()->set_ciphertext_segment_size(1024);
+  EXPECT_THAT(AesGcmHkdfStreamingKeyManager().ValidateKeyFormat(key_format),
+              IsOk());
+}
+
+TEST(AesGcmHkdfStreamingKeyManagerTest, ValidateKeyFormatSmallKey) {
+  AesGcmHkdfStreamingKeyFormat key_format;
+  key_format.set_key_size(16);
+  key_format.mutable_params()->set_derived_key_size(32);
+  key_format.mutable_params()->set_hkdf_hash_type(HashType::SHA256);
+  key_format.mutable_params()->set_ciphertext_segment_size(1024);
+  EXPECT_THAT(
+      AesGcmHkdfStreamingKeyManager().ValidateKeyFormat(key_format),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("derived_key_size")));
+}
+
+TEST(AesGcmHkdfStreamingKeyManagerTest, ValidateKeyFormatWrongHash) {
+  AesGcmHkdfStreamingKeyFormat key_format;
+  key_format.set_key_size(32);
+  key_format.mutable_params()->set_derived_key_size(32);
+  key_format.mutable_params()->set_ciphertext_segment_size(1024);
+  EXPECT_THAT(
+      AesGcmHkdfStreamingKeyManager().ValidateKeyFormat(key_format),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("hkdf_hash_type")));
+}
+
+TEST(AesGcmHkdfStreamingKeyManagerTest, ValidateKeyFormatSmallSegment) {
+  AesGcmHkdfStreamingKeyFormat key_format;
+  key_format.set_key_size(32);
+  key_format.mutable_params()->set_derived_key_size(32);
+  key_format.mutable_params()->set_hkdf_hash_type(HashType::SHA256);
+  key_format.mutable_params()->set_ciphertext_segment_size(45);
+  EXPECT_THAT(AesGcmHkdfStreamingKeyManager().ValidateKeyFormat(key_format),
+              StatusIs(util::error::INVALID_ARGUMENT,
+                       HasSubstr("ciphertext_segment_size")));
+}
+
+TEST(AesGcmHkdfStreamingKeyManagerTest, CreateKey) {
+  AesGcmHkdfStreamingKeyFormat key_format;
+  key_format.set_key_size(32);
+  key_format.mutable_params()->set_derived_key_size(32);
+  key_format.mutable_params()->set_hkdf_hash_type(HashType::SHA256);
+  key_format.mutable_params()->set_ciphertext_segment_size(1024);
+  auto key_or = AesGcmHkdfStreamingKeyManager().CreateKey(key_format);
+  ASSERT_THAT(key_or.status(), IsOk());
+  EXPECT_THAT(key_or.ValueOrDie().version(), Eq(0));
+  EXPECT_THAT(key_or.ValueOrDie().params().ciphertext_segment_size(),
+              Eq(key_format.params().ciphertext_segment_size()));
+  EXPECT_THAT(key_or.ValueOrDie().params().derived_key_size(),
+              Eq(key_format.params().derived_key_size()));
+  EXPECT_THAT(key_or.ValueOrDie().params().hkdf_hash_type(),
+              Eq(key_format.params().hkdf_hash_type()));
+  EXPECT_THAT(key_or.ValueOrDie().key_value().size(),
+              Eq(key_format.key_size()));
+}
+
+}  // namespace
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/streamingaead/buffered_input_stream.cc b/cc/streamingaead/buffered_input_stream.cc
new file mode 100644
index 0000000..4f30ac5
--- /dev/null
+++ b/cc/streamingaead/buffered_input_stream.cc
@@ -0,0 +1,146 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/streamingaead/buffered_input_stream.h"
+
+#include <algorithm>
+#include <cstring>
+#include <vector>
+
+#include "absl/memory/memory.h"
+#include "tink/input_stream.h"
+#include "tink/util/errors.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace streamingaead {
+
+using util::Status;
+using util::StatusOr;
+
+BufferedInputStream::BufferedInputStream(
+    std::unique_ptr<crypto::tink::InputStream> input_stream) {
+  input_stream_ = std::move(input_stream);
+  count_in_buffer_ = 0;
+  count_backedup_ = 0;
+  position_ = 0;
+  buffer_.resize(4 * 1024);  // 4 KB
+  buffer_offset_ = 0;
+  after_rewind_ = false;
+  rewinding_enabled_ = true;
+  direct_access_ = false;
+  status_ = Status::OK;
+}
+
+crypto::tink::util::StatusOr<int> BufferedInputStream::Next(const void** data) {
+  if (direct_access_) return input_stream_->Next(data);
+  if (!status_.ok()) return status_;
+
+  // We're just after rewind, so return all the data in the buffer, if any.
+  if (after_rewind_ && count_in_buffer_ > 0) {
+    after_rewind_ = false;
+    *data = buffer_.data();
+    position_ = count_in_buffer_;
+    return count_in_buffer_;
+  }
+  if (count_backedup_ > 0) {  // Return the backed-up bytes.
+    buffer_offset_ = count_in_buffer_ - count_backedup_;
+    *data = buffer_.data() + buffer_offset_;
+    int backedup = count_backedup_;
+    count_backedup_ = 0;
+    position_ = count_in_buffer_;
+    return backedup;
+  }
+
+  // Read new bytes from input_stream_.
+  //
+  // If we don't allow rewind any more, all the data buffered so far
+  // can be discarded, and from now on we go directly to input_stream_
+  if (!rewinding_enabled_) {
+    direct_access_ = true;
+    buffer_.resize(0);
+    return input_stream_->Next(data);
+  }
+
+  // Otherwise, we read from input_stream_ the next chunk of data,
+  // and append it to buffer_.
+  after_rewind_ = false;
+  const void* buf;
+  auto next_result = input_stream_->Next(&buf);
+  if (!next_result.ok()) {
+    status_ = next_result.status();
+    return status_;
+  }
+  size_t count_read = next_result.ValueOrDie();
+  if (buffer_.size() < count_in_buffer_ + count_read) {
+    buffer_.resize(buffer_.size() + std::max(buffer_.size(), count_read));
+  }
+  memcpy(buffer_.data() + count_in_buffer_, buf, count_read);
+  buffer_offset_ = count_in_buffer_;
+  count_backedup_ = 0;
+  count_in_buffer_ += count_read;
+  position_ = position_ + count_read;
+  *data = buffer_.data() + buffer_offset_;
+  return count_read;
+}
+
+void BufferedInputStream::BackUp(int count) {
+  if (direct_access_) {
+    input_stream_->BackUp(count);
+    return;
+  }
+  if (!status_.ok() || count < 1 ||
+      count_backedup_ == (count_in_buffer_ - buffer_offset_)) {
+    return;
+  }
+  int actual_count = std::min(
+      count, count_in_buffer_ - buffer_offset_ - count_backedup_);
+  count_backedup_ += actual_count;
+  position_ = position_ - actual_count;
+}
+
+void BufferedInputStream::DisableRewinding() {
+  rewinding_enabled_ = false;
+}
+
+crypto::tink::util::Status BufferedInputStream::Rewind() {
+  if (!rewinding_enabled_) {
+    return util::Status(util::error::INVALID_ARGUMENT, "rewinding is disabled");
+  }
+  if (status_.ok() || status_.error_code() == util::error::OUT_OF_RANGE) {
+    status_ = util::OkStatus();
+    position_ = 0;
+    count_backedup_ = 0;
+    buffer_offset_ = 0;
+    after_rewind_ = true;
+  }
+  return status_;
+}
+
+
+BufferedInputStream::~BufferedInputStream() {
+}
+
+int64_t BufferedInputStream::Position() const {
+  if (direct_access_) return input_stream_->Position();
+  return position_;
+}
+
+}  // namespace streamingaead
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/streamingaead/buffered_input_stream.h b/cc/streamingaead/buffered_input_stream.h
new file mode 100644
index 0000000..2948861
--- /dev/null
+++ b/cc/streamingaead/buffered_input_stream.h
@@ -0,0 +1,79 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_STREAMINGAEAD_BUFFERED_INPUT_STREAM_H_
+#define TINK_STREAMINGAEAD_BUFFERED_INPUT_STREAM_H_
+
+#include <memory>
+#include <vector>
+
+#include "tink/input_stream.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace streamingaead {
+
+// An InputStream that initially buffers all the read bytes, and offers
+// rewind-functionality, until explicitly instructed to disable
+// rewinding (and stop buffering).
+class BufferedInputStream : public crypto::tink::InputStream {
+ public:
+  // Constructs an InputStream that will read from 'input_stream',
+  // buffering all the read bytes in memory, and offering rewinding
+  // to the beginning of the stream (as long as rewinding is enabled).
+  explicit BufferedInputStream(
+      std::unique_ptr<crypto::tink::InputStream> input_stream);
+
+  ~BufferedInputStream() override;
+
+  crypto::tink::util::StatusOr<int> Next(const void** data) override;
+
+  void BackUp(int count) override;
+
+  int64_t Position() const override;
+
+  // Rewinds this stream to the beginning (if rewinding is still enabled).
+  crypto::tink::util::Status Rewind();
+
+  // Disables rewinding.
+  void DisableRewinding();
+
+ private:
+  std::unique_ptr<crypto::tink::InputStream> input_stream_;
+  bool direct_access_;      // true iff we don't buffer any data any more
+
+  // The fields below are valid and in use iff direct_access_ is false.
+  // Once direct_access_ becomes true, all the calls to this stream's methods
+  // are directly relayed to methods of input_stream_.
+  crypto::tink::util::Status status_;
+  std::vector<uint8_t> buffer_;
+  bool after_rewind_;       // true iff no Next has been called after rewind
+  bool rewinding_enabled_;  // true iff this stream can be rewound
+  int64_t position_;     // current position in the stream (from the beginning)
+
+  // Counters that describe the state of the data in buffer_.
+  int count_in_buffer_;  // # of bytes available in buffer_
+  int count_backedup_;   // # of bytes available in buffer_ that were backed up
+  int buffer_offset_;    // offset at which the returned bytes start in buffer_
+};
+
+}  // namespace streamingaead
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_STREAMINGAEAD_BUFFERED_INPUT_STREAM_H_
diff --git a/cc/streamingaead/buffered_input_stream_test.cc b/cc/streamingaead/buffered_input_stream_test.cc
new file mode 100644
index 0000000..1ac3f07
--- /dev/null
+++ b/cc/streamingaead/buffered_input_stream_test.cc
@@ -0,0 +1,325 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/streamingaead/buffered_input_stream.h"
+
+#include <sstream>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "tink/input_stream.h"
+#include "tink/subtle/random.h"
+#include "tink/subtle/test_util.h"
+#include "tink/util/istream_input_stream.h"
+#include "tink/util/status.h"
+#include "tink/util/test_matchers.h"
+
+namespace crypto {
+namespace tink {
+namespace streamingaead {
+namespace {
+
+using crypto::tink::test::IsOk;
+using crypto::tink::test::StatusIs;
+using subtle::test::ReadFromStream;
+using testing::HasSubstr;
+
+
+static int kBufferSize = 4096;
+
+// Creates an InputStream with the specified contents.
+std::unique_ptr<InputStream> GetInputStream(absl::string_view contents) {
+  // Prepare ciphertext source stream.
+  auto string_stream = absl::make_unique<std::stringstream>(std::string(contents));
+  std::unique_ptr<InputStream> input_stream(
+      absl::make_unique<util::IstreamInputStream>(
+          std::move(string_stream), kBufferSize));
+  return input_stream;
+}
+
+// Attempts to read 'count' bytes from 'input_stream', and writes the read
+// bytes to 'output'.
+util::Status ReadFromStream(
+    InputStream* input_stream, int count, std::string* output) {
+  if (input_stream == nullptr || output == nullptr || count < 0) {
+    return util::Status(util::error::INTERNAL, "Illegal read from a stream");
+  }
+  const void* buffer;
+  output->clear();
+  int bytes_to_read = count;
+  while (bytes_to_read > 0) {
+    auto next_result = input_stream->Next(&buffer);
+    if (next_result.status().error_code() == util::error::OUT_OF_RANGE) {
+      // End of stream.
+      return util::Status::OK;
+    }
+    if (!next_result.ok()) return next_result.status();
+    auto read_bytes = next_result.ValueOrDie();
+    auto used_bytes = std::min(read_bytes, bytes_to_read);
+    if (used_bytes > 0) {
+      output->append(std::string(reinterpret_cast<const char*>(buffer), used_bytes));
+      bytes_to_read -= used_bytes;
+      if (bytes_to_read == 0) input_stream->BackUp(read_bytes - used_bytes);
+    }
+  }
+  return util::Status::OK;
+}
+
+TEST(BufferedInputStreamTest, ReadingAndRewinding) {
+  for (auto input_size : {0, 1, 10, 100, 1000, 10000, 100000}) {
+    std::string contents = subtle::Random::GetRandomBytes(input_size);
+    auto input_stream = GetInputStream(contents);
+    auto buf_stream = absl::make_unique<BufferedInputStream>(
+        std::move(input_stream));
+    for (auto read_size : {0, 1, 10, 123, 300}) {
+      SCOPED_TRACE(absl::StrCat("input_size = ", input_size,
+                                ", read_size = ", read_size));
+      // Read a prefix of the stream.
+      std::string prefix;
+      auto status = ReadFromStream(buf_stream.get(), read_size, &prefix);
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ(std::min(read_size, input_size), buf_stream->Position());
+      EXPECT_EQ(contents.substr(0, read_size), prefix);
+
+      // Read the rest of the stream.
+      std::string rest;
+      status = ReadFromStream(buf_stream.get(), &rest);
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ(input_size, buf_stream->Position());
+      EXPECT_EQ(contents, prefix + rest);
+
+      // Try reading again, should get an empty std::string.
+      status = ReadFromStream(buf_stream.get(), &rest);
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ("", rest);
+
+      // Rewind and read again, again in two parts.
+      status = buf_stream->Rewind();
+      EXPECT_EQ(0, buf_stream->Position());
+      EXPECT_THAT(status, IsOk());
+      status = ReadFromStream(buf_stream.get(), read_size, &prefix);
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ(std::min(read_size, input_size), buf_stream->Position());
+      EXPECT_EQ(contents.substr(0, read_size), prefix);
+      status = ReadFromStream(buf_stream.get(), &rest);
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ(input_size, buf_stream->Position());
+      EXPECT_EQ(contents, prefix + rest);
+
+      // Rewind so that the next read iteration starts from the beginning.
+      status = buf_stream->Rewind();
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ(0, buf_stream->Position());
+    }
+  }
+}
+
+TEST(BufferedInputStreamTest, SingleBackup) {
+  for (auto input_size : {0, 1, 10, 100, 1000, 10000, 100000}) {
+    std::string contents = subtle::Random::GetRandomBytes(input_size);
+    for (auto read_size : {0, 1, 10, 123, 300, 1024}) {
+      SCOPED_TRACE(absl::StrCat("input_size = ", input_size,
+                                ", read_size = ", read_size));
+      auto input_stream = GetInputStream(contents);
+      auto buf_stream = absl::make_unique<BufferedInputStream>(
+          std::move(input_stream));
+
+      // Read a part of the stream.
+      std::string prefix;
+      auto status = ReadFromStream(buf_stream.get(), read_size, &prefix);
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ(std::min(read_size, input_size), buf_stream->Position());
+      EXPECT_EQ(contents.substr(0, read_size), prefix);
+
+      // Read the next block of the stream, and then back it up.
+      const void* buf;
+      int pos = buf_stream->Position();
+      auto next_result = buf_stream->Next(&buf);
+      if (read_size < input_size) {
+        EXPECT_THAT(next_result.status(), IsOk());
+        auto next_size = next_result.ValueOrDie();
+        EXPECT_LE(next_size, kBufferSize);
+        EXPECT_EQ(pos + next_size, buf_stream->Position());
+        buf_stream->BackUp(next_size);
+        EXPECT_EQ(pos, buf_stream->Position());
+        buf_stream->BackUp(input_size);
+        EXPECT_EQ(pos, buf_stream->Position());
+      } else {
+        EXPECT_EQ(util::error::OUT_OF_RANGE, next_result.status().error_code());
+      }
+
+      // Read the rest of the input.
+      std::string rest;
+      status = ReadFromStream(buf_stream.get(), &rest);
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ(input_size, buf_stream->Position());
+      EXPECT_EQ(contents, prefix + rest);
+
+      // Rewind and read prefix again.
+      status = buf_stream->Rewind();
+      EXPECT_EQ(0, buf_stream->Position());
+      EXPECT_THAT(status, IsOk());
+      status = ReadFromStream(buf_stream.get(), read_size, &prefix);
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ(std::min(read_size, input_size), buf_stream->Position());
+      EXPECT_EQ(contents.substr(0, read_size), prefix);
+
+      // The next buffer should contain the rest of the input, if any.
+      pos = buf_stream->Position();
+      next_result = buf_stream->Next(&buf);
+      if (read_size < input_size) {
+        EXPECT_THAT(next_result.status(), IsOk());
+        auto next_size = next_result.ValueOrDie();
+        EXPECT_EQ(input_size - pos, next_size);
+        EXPECT_EQ(input_size, buf_stream->Position());
+        buf_stream->BackUp(next_size);
+        EXPECT_EQ(pos, buf_stream->Position());
+        buf_stream->BackUp(input_size);
+        EXPECT_EQ(pos, buf_stream->Position());
+      } else {
+        EXPECT_EQ(util::error::OUT_OF_RANGE, next_result.status().error_code());
+      }
+
+      // Read the rest of the input.
+      status = ReadFromStream(buf_stream.get(), &rest);
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ(input_size, buf_stream->Position());
+      EXPECT_EQ(contents, prefix + rest);
+    }
+  }
+}
+
+TEST(BufferedInputStreamTest, MultipleBackups) {
+  int input_size = 70000;
+  std::string contents = subtle::Random::GetRandomBytes(input_size);
+  auto input_stream = GetInputStream(contents);
+  auto buf_stream = absl::make_unique<BufferedInputStream>(
+      std::move(input_stream));
+  const void* buffer;
+
+  EXPECT_EQ(0, buf_stream->Position());
+  auto next_result = buf_stream->Next(&buffer);
+  EXPECT_THAT(next_result.status(), IsOk());
+  auto next_size = next_result.ValueOrDie();
+  EXPECT_EQ(contents.substr(0, next_size),
+      std::string(static_cast<const char*>(buffer), next_size));
+
+  // BackUp several times, but in total fewer bytes than returned by Next().
+  int total_backup_size = 0;
+  for (auto backup_size : {0, 1, 5, 0, 10, 100, -42, 400, 20, -100}) {
+    buf_stream->BackUp(backup_size);
+    total_backup_size += std::max(0, backup_size);
+    EXPECT_EQ(next_size - total_backup_size, buf_stream->Position());
+  }
+  EXPECT_GT(next_size, total_backup_size);
+
+  // Call Next(), it should return exactly the backed up bytes.
+  next_result = buf_stream->Next(&buffer);
+  EXPECT_THAT(next_result.status(), IsOk());
+  EXPECT_EQ(total_backup_size, next_result.ValueOrDie());
+  EXPECT_EQ(next_size, buf_stream->Position());
+  EXPECT_EQ(
+      contents.substr(next_size - total_backup_size, total_backup_size),
+      std::string(static_cast<const char*>(buffer), total_backup_size));
+}
+
+TEST(BufferedInputStreamTest, DisableRewindingInitially) {
+  for (auto input_size : {0, 10, 100, 1000, 10000}) {
+    std::string contents = subtle::Random::GetRandomBytes(input_size);
+    for (auto read_size : {0, 1, 10, 123, 300, 1024}) {
+      SCOPED_TRACE(absl::StrCat("input_size = ", input_size,
+                                ", read_size = ", read_size));
+      auto input_stream = GetInputStream(contents);
+      auto buf_stream = absl::make_unique<BufferedInputStream>(
+          std::move(input_stream));
+
+      // Disable rewinding, and attempt rewind.
+      EXPECT_EQ(0, buf_stream->Position());
+      buf_stream->DisableRewinding();
+      auto status = buf_stream->Rewind();
+      EXPECT_THAT(status, StatusIs(util::error::INVALID_ARGUMENT,
+                                   HasSubstr("rewinding is disabled")));
+
+      // Read a prefix of the stream.
+      std::string prefix;
+      status = ReadFromStream(buf_stream.get(), read_size, &prefix);
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ(std::min(read_size, input_size), buf_stream->Position());
+      EXPECT_EQ(contents.substr(0, read_size), prefix);
+
+      // Attempt rewidning again.
+      status = buf_stream->Rewind();
+      EXPECT_THAT(status, StatusIs(util::error::INVALID_ARGUMENT,
+                                   HasSubstr("rewinding is disabled")));
+
+      // Read the rest of the input.
+      std::string rest;
+      status = ReadFromStream(buf_stream.get(), &rest);
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ(input_size, buf_stream->Position());
+      EXPECT_EQ(contents, prefix + rest);
+    }
+  }
+}
+
+TEST(BufferedInputStreamTest, DisableRewindingAfterRewind) {
+  for (auto input_size : {0, 10, 100, 1000, 10000}) {
+    std::string contents = subtle::Random::GetRandomBytes(input_size);
+    for (auto read_size : {0, 1, 10, 123, 300, 1024}) {
+      SCOPED_TRACE(absl::StrCat("input_size = ", input_size,
+                                ", read_size = ", read_size));
+      auto input_stream = GetInputStream(contents);
+      auto buf_stream = absl::make_unique<BufferedInputStream>(
+          std::move(input_stream));
+
+      // Read a prefix of the stream.
+      std::string prefix;
+      auto status = ReadFromStream(buf_stream.get(), read_size, &prefix);
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ(std::min(read_size, input_size), buf_stream->Position());
+      EXPECT_EQ(contents.substr(0, read_size), prefix);
+
+      // Rewind, and disable rewinding.
+      status = buf_stream->Rewind();
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ(0, buf_stream->Position());
+      buf_stream->DisableRewinding();
+      status = buf_stream->Rewind();
+      EXPECT_THAT(status, StatusIs(util::error::INVALID_ARGUMENT,
+                                   HasSubstr("rewinding is disabled")));
+      // Read the prefix again.
+      status = ReadFromStream(buf_stream.get(), read_size, &prefix);
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ(std::min(read_size, input_size), buf_stream->Position());
+      EXPECT_EQ(contents.substr(0, read_size), prefix);
+
+      // Read the rest of the input.
+      std::string rest;
+      status = ReadFromStream(buf_stream.get(), &rest);
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ(input_size, buf_stream->Position());
+      EXPECT_EQ(contents, prefix + rest);
+    }
+  }
+}
+
+}  // namespace
+}  // namespace streamingaead
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/streamingaead/decrypting_input_stream.cc b/cc/streamingaead/decrypting_input_stream.cc
new file mode 100644
index 0000000..eb9a215
--- /dev/null
+++ b/cc/streamingaead/decrypting_input_stream.cc
@@ -0,0 +1,113 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/streamingaead/decrypting_input_stream.h"
+
+#include <algorithm>
+#include <cstring>
+#include <vector>
+
+#include "absl/memory/memory.h"
+#include "tink/input_stream.h"
+#include "tink/primitive_set.h"
+#include "tink/streaming_aead.h"
+#include "tink/streamingaead/buffered_input_stream.h"
+#include "tink/streamingaead/shared_input_stream.h"
+#include "tink/util/errors.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace streamingaead {
+
+using crypto::tink::PrimitiveSet;
+using crypto::tink::StreamingAead;
+using util::Status;
+using util::StatusOr;
+
+// static
+StatusOr<std::unique_ptr<InputStream>> DecryptingInputStream::New(
+    std::shared_ptr<PrimitiveSet<StreamingAead>> primitives,
+    std::unique_ptr<crypto::tink::InputStream> ciphertext_source,
+    absl::string_view associated_data) {
+  std::unique_ptr<DecryptingInputStream> dec_stream(
+      new DecryptingInputStream());
+  dec_stream->primitives_ = primitives;
+  dec_stream->buffered_ct_source_ =
+      std::make_shared<BufferedInputStream>(std::move(ciphertext_source));
+  dec_stream->associated_data_ = std::string(associated_data);
+  dec_stream->attempted_matching_ = false;
+  dec_stream->matching_stream_ = nullptr;
+  return {std::move(dec_stream)};
+}
+
+util::StatusOr<int> DecryptingInputStream::Next(const void** data) {
+  if (matching_stream_ != nullptr) {
+    return matching_stream_->Next(data);
+  }
+  if (attempted_matching_) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "Could not find a decrypter matching the ciphertext stream.");
+  }
+  // Matching has not been attempted yet, so try it now.
+  attempted_matching_ = true;
+  auto raw_primitives_result = primitives_->get_raw_primitives();
+  if (!raw_primitives_result.ok()) {
+    return Status(util::error::INTERNAL, "No RAW primitives found");
+  }
+  for (auto& primitive : *(raw_primitives_result.ValueOrDie())) {
+    StreamingAead& streaming_aead = primitive->get_primitive();
+    auto shared_ct = absl::make_unique<SharedInputStream>(
+        buffered_ct_source_.get());
+    auto decrypting_stream_result = streaming_aead.NewDecryptingStream(
+        std::move(shared_ct), associated_data_);
+    if (decrypting_stream_result.ok()) {
+      auto next_result = decrypting_stream_result.ValueOrDie()->Next(data);
+      if (next_result.status().error_code() == util::error::OUT_OF_RANGE ||
+          next_result.ok()) {  // Found a match.
+        buffered_ct_source_->DisableRewinding();
+        matching_stream_ = std::move(decrypting_stream_result.ValueOrDie());
+        return next_result;
+      }
+    }
+    // Not a match, rewind and try the next primitive.
+    Status s = buffered_ct_source_->Rewind();
+    if (!s.ok()) {
+      return s;
+    }
+  }
+  return Status(util::error::INVALID_ARGUMENT,
+                "Could not find a decrypter matching the ciphertext stream.");
+}
+
+void DecryptingInputStream::BackUp(int count) {
+  if (matching_stream_ != nullptr) {
+    matching_stream_->BackUp(count);
+  }
+}
+
+
+int64_t DecryptingInputStream::Position() const {
+  if (matching_stream_ != nullptr) {
+    return matching_stream_->Position();
+  }
+  return 0;
+}
+
+}  // namespace streamingaead
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/streamingaead/decrypting_input_stream.h b/cc/streamingaead/decrypting_input_stream.h
new file mode 100644
index 0000000..93f03a5
--- /dev/null
+++ b/cc/streamingaead/decrypting_input_stream.h
@@ -0,0 +1,69 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_STREAMINGAEAD_DECRYPTING_INPUT_STREAM_H_
+#define TINK_STREAMINGAEAD_DECRYPTING_INPUT_STREAM_H_
+
+#include <memory>
+#include <vector>
+
+#include "tink/input_stream.h"
+#include "tink/primitive_set.h"
+#include "tink/streaming_aead.h"
+#include "tink/util/statusor.h"
+#include "tink/streamingaead/buffered_input_stream.h"
+
+namespace crypto {
+namespace tink {
+namespace streamingaead {
+
+// A wrapper around an InputStream that holds a reference to a
+// set of StreamingAead-primitives and upon first Next()-call probes the
+// initial portion of the wrapped InputStream, to find a matching
+// primitive, i.e. the primitive that is able to decrypt the stream.
+// Once a match is found, all subsequent calls are forwarded to it.
+class DecryptingInputStream : public crypto::tink::InputStream {
+ public:
+  // Constructs an InputStream that wraps 'input_stream', and will use
+  // (one of) provided 'primitives' to decrypt the contents of 'input_stream',
+  // using 'associated_data' as authenticated associated data
+  // of the decryption process.
+  static util::StatusOr<std::unique_ptr<InputStream>> New(
+      std::shared_ptr<
+          crypto::tink::PrimitiveSet<crypto::tink::StreamingAead>> primitives,
+      std::unique_ptr<crypto::tink::InputStream> ciphertext_source,
+      absl::string_view associated_data);
+
+  ~DecryptingInputStream() override {}
+  util::StatusOr<int> Next(const void** data) override;
+  void BackUp(int count) override;
+  int64_t Position() const override;
+
+ private:
+  DecryptingInputStream() {}
+  std::shared_ptr<
+      crypto::tink::PrimitiveSet<crypto::tink::StreamingAead>> primitives_;
+  std::shared_ptr<BufferedInputStream> buffered_ct_source_;
+  std::string associated_data_;
+  std::unique_ptr<crypto::tink::InputStream> matching_stream_;
+  bool attempted_matching_;
+};
+
+}  // namespace streamingaead
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_STREAMINGAEAD_DECRYPTING_INPUT_STREAM_H_
diff --git a/cc/streamingaead/decrypting_input_stream_test.cc b/cc/streamingaead/decrypting_input_stream_test.cc
new file mode 100644
index 0000000..f2bbc94
--- /dev/null
+++ b/cc/streamingaead/decrypting_input_stream_test.cc
@@ -0,0 +1,235 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/streamingaead/decrypting_input_stream.h"
+
+#include <sstream>
+#include <vector>
+
+#include "gtest/gtest.h"
+#include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "tink/input_stream.h"
+#include "tink/output_stream.h"
+#include "tink/primitive_set.h"
+#include "tink/streaming_aead.h"
+#include "tink/subtle/random.h"
+#include "tink/subtle/test_util.h"
+#include "tink/util/istream_input_stream.h"
+#include "tink/util/ostream_output_stream.h"
+#include "tink/util/status.h"
+#include "tink/util/test_matchers.h"
+#include "tink/util/test_util.h"
+
+namespace crypto {
+namespace tink {
+namespace streamingaead {
+namespace {
+
+using crypto::tink::test::IsOk;
+using crypto::tink::test::StatusIs;
+using crypto::tink::test::DummyStreamingAead;
+using crypto::tink::util::OstreamOutputStream;
+using crypto::tink::util::IstreamInputStream;
+using google::crypto::tink::Keyset;
+using google::crypto::tink::KeyStatusType;
+using google::crypto::tink::OutputPrefixType;
+using subtle::test::ReadFromStream;
+using subtle::test::WriteToStream;
+
+static int kBufferSize = 128;
+
+// Creates an InputStream with the specified contents.
+std::unique_ptr<InputStream> GetInputStream(absl::string_view contents) {
+  // Prepare ciphertext source stream.
+  auto string_stream = absl::make_unique<std::stringstream>(std::string(contents));
+  std::unique_ptr<InputStream> input_stream(
+      absl::make_unique<util::IstreamInputStream>(
+          std::move(string_stream), kBufferSize));
+  return input_stream;
+}
+
+// Creates an InputStream that contains ciphertext resulting
+// from encryption of 'pt' with 'aad' as associated data, using 'saead'.
+std::unique_ptr<InputStream> GetCiphertextSource(StreamingAead* saead,
+                                                 absl::string_view pt,
+                                                 absl::string_view aad) {
+  // Prepare ciphertext destination stream.
+  auto ct_stream = absl::make_unique<std::stringstream>();
+  // A reference to the ciphertext buffer.
+  auto ct_buf = ct_stream->rdbuf();
+  std::unique_ptr<OutputStream> ct_destination(
+      absl::make_unique<OstreamOutputStream>(std::move(ct_stream)));
+
+  // Compute the ciphertext.
+  auto enc_stream_result =
+      saead->NewEncryptingStream(std::move(ct_destination), aad);
+  EXPECT_THAT(enc_stream_result.status(), IsOk());
+  EXPECT_THAT(WriteToStream(enc_stream_result.ValueOrDie().get(), pt), IsOk());
+
+  // Return the ciphertext as InputStream.
+  auto ct_stream3 = absl::make_unique<std::stringstream>(ct_buf->str());
+  auto input =  absl::make_unique<IstreamInputStream>(std::move(ct_stream3));
+  std::string reads;
+  EXPECT_THAT(ReadFromStream(input.get(), &reads), IsOk());
+  auto ct_stream2 = absl::make_unique<std::stringstream>(ct_buf->str());
+  return absl::make_unique<IstreamInputStream>(std::move(ct_stream2));
+}
+
+// A container for specification of instances of DummyStreamingAead
+// to be created for testing.
+struct StreamingAeadSpec {
+  uint32_t key_id;
+  std::string saead_name;
+};
+
+// Generates a PrimitiveSet<StreamingAead> with DummyStreamingAead
+// instances according to the specification in 'spec'.
+// The last entry in 'spec' will be the primary primitive in the returned set.
+std::shared_ptr<PrimitiveSet<StreamingAead>> GetTestStreamingAeadSet(
+    const std::vector<StreamingAeadSpec>& spec) {
+  Keyset::Key* key;
+  Keyset keyset;
+  std::shared_ptr<PrimitiveSet<StreamingAead>> saead_set =
+      std::make_shared<PrimitiveSet<StreamingAead>>();
+  int i = 0;
+  for (auto& s : spec) {
+    key = keyset.add_key();
+    key->set_output_prefix_type(OutputPrefixType::RAW);
+    key->set_key_id(s.key_id);
+    key->set_status(KeyStatusType::ENABLED);
+    std::unique_ptr<StreamingAead> saead =
+        absl::make_unique<DummyStreamingAead>(s.saead_name);
+    auto entry_result = saead_set->AddPrimitive(std::move(saead), *key);
+    EXPECT_TRUE(entry_result.ok());
+    if (i + 1 == spec.size()) {
+      EXPECT_THAT(saead_set->set_primary(entry_result.ValueOrDie()), IsOk());
+    }
+    i++;
+  }
+  return saead_set;
+}
+
+TEST(DecryptingInputStreamTest, BasicDecryption) {
+  uint32_t key_id_0 = 1234543;
+  uint32_t key_id_1 = 726329;
+  uint32_t key_id_2 = 7213743;
+  std::string saead_name_0 = "streaming_aead0";
+  std::string saead_name_1 = "streaming_aead1";
+  std::string saead_name_2 = "streaming_aead2";
+
+  auto saead_set = GetTestStreamingAeadSet(
+      {{key_id_0, saead_name_0}, {key_id_1, saead_name_1},
+       {key_id_2, saead_name_2}});
+
+  for (int pt_size : {0, 1, 10, 100, 10000}) {
+    std::string plaintext = subtle::Random::GetRandomBytes(pt_size);
+    for (std::string aad : {"some_aad", "", "some other aad"}) {
+      SCOPED_TRACE(absl::StrCat("pt_size = ", pt_size,
+                                ", aad = '", aad, "'"));
+      // Pre-compute ciphertexts. We create one ciphertext for each primitive
+      // in the primitive set, so that we can test decryption with both
+      // the primary primitive, and the non-primary ones.
+      std::vector<std::unique_ptr<InputStream>> ciphertexts;
+      for (const auto& p : *(saead_set->get_raw_primitives().ValueOrDie())) {
+        ciphertexts.push_back(
+            GetCiphertextSource(&(p->get_primitive()), plaintext, aad));
+      }
+      EXPECT_EQ(3, ciphertexts.size());
+
+      // Check the decryption of each of the pre-computed ciphertexts.
+      for (auto& ct : ciphertexts) {
+        // Wrap the primitive set and test the resulting DecryptingInputStream.
+        auto dec_stream_result =
+            DecryptingInputStream::New(saead_set, std::move(ct), aad);
+        EXPECT_THAT(dec_stream_result.status(), IsOk());
+        std::string decrypted;
+        auto status = ReadFromStream(dec_stream_result.ValueOrDie().get(),
+                                &decrypted);
+        EXPECT_THAT(status, IsOk());
+        EXPECT_EQ(plaintext, decrypted);
+      }
+    }
+  }
+}
+
+TEST(DecryptingInputStreamTest, WrongAssociatedData) {
+  uint32_t key_id_0 = 1234543;
+  uint32_t key_id_1 = 726329;
+  uint32_t key_id_2 = 7213743;
+  std::string saead_name_0 = "streaming_aead0";
+  std::string saead_name_1 = "streaming_aead1";
+  std::string saead_name_2 = "streaming_aead2";
+
+  auto saead_set = GetTestStreamingAeadSet(
+      {{key_id_0, saead_name_0}, {key_id_1, saead_name_1},
+       {key_id_2, saead_name_2}});
+
+  for (int pt_size : {0, 1, 10, 100, 10000}) {
+    std::string plaintext = subtle::Random::GetRandomBytes(pt_size);
+    for (std::string aad : {"some_aad", "", "some other aad"}) {
+      SCOPED_TRACE(absl::StrCat("pt_size = ", pt_size,
+                                ", aad = '", aad, "'"));
+      // Compute a ciphertext with the primary primitive.
+      auto ct = GetCiphertextSource(
+          &(saead_set->get_primary()->get_primitive()), plaintext, aad);
+      auto dec_stream_result =
+          DecryptingInputStream::New(saead_set, std::move(ct), "wrong aad");
+      EXPECT_THAT(dec_stream_result.status(), IsOk());
+      std::string decrypted;
+      auto status = ReadFromStream(dec_stream_result.ValueOrDie().get(),
+                                   &decrypted);
+      EXPECT_THAT(status, StatusIs(util::error::INVALID_ARGUMENT));
+    }
+  }
+}
+
+TEST(DecryptingInputStreamTest, WrongCiphertext) {
+  uint32_t key_id_0 = 1234543;
+  uint32_t key_id_1 = 726329;
+  uint32_t key_id_2 = 7213743;
+  std::string saead_name_0 = "streaming_aead0";
+  std::string saead_name_1 = "streaming_aead1";
+  std::string saead_name_2 = "streaming_aead2";
+
+  auto saead_set = GetTestStreamingAeadSet(
+      {{key_id_0, saead_name_0}, {key_id_1, saead_name_1},
+       {key_id_2, saead_name_2}});
+
+  for (int pt_size : {0, 1, 10, 100, 10000}) {
+    std::string plaintext = subtle::Random::GetRandomBytes(pt_size);
+    for (std::string aad : {"some_aad", "", "some other aad"}) {
+      SCOPED_TRACE(absl::StrCat("pt_size = ", pt_size,
+                                ", aad = '", aad, "'"));
+      // Try decrypting a wrong ciphertext.
+      auto wrong_ct = GetInputStream(subtle::Random::GetRandomBytes(pt_size));
+      auto dec_stream_result =
+          DecryptingInputStream::New(saead_set, std::move(wrong_ct), aad);
+      EXPECT_THAT(dec_stream_result.status(), IsOk());
+      std::string decrypted;
+      auto status = ReadFromStream(dec_stream_result.ValueOrDie().get(),
+                                   &decrypted);
+      EXPECT_THAT(status, StatusIs(util::error::INVALID_ARGUMENT));
+    }
+  }
+}
+
+
+}  // namespace
+}  // namespace streamingaead
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/streamingaead/decrypting_random_access_stream.cc b/cc/streamingaead/decrypting_random_access_stream.cc
new file mode 100644
index 0000000..055c07e
--- /dev/null
+++ b/cc/streamingaead/decrypting_random_access_stream.cc
@@ -0,0 +1,134 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/streamingaead/decrypting_random_access_stream.h"
+
+#include "absl/memory/memory.h"
+#include "absl/synchronization/mutex.h"
+#include "tink/random_access_stream.h"
+#include "tink/primitive_set.h"
+#include "tink/streaming_aead.h"
+#include "tink/streamingaead/shared_random_access_stream.h"
+#include "tink/util/buffer.h"
+#include "tink/util/errors.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace streamingaead {
+
+using crypto::tink::PrimitiveSet;
+using crypto::tink::StreamingAead;
+using util::Status;
+using util::StatusOr;
+
+// static
+StatusOr<std::unique_ptr<RandomAccessStream>> DecryptingRandomAccessStream::New(
+    std::shared_ptr<PrimitiveSet<StreamingAead>> primitives,
+    std::unique_ptr<crypto::tink::RandomAccessStream> ciphertext_source,
+    absl::string_view associated_data) {
+  if (primitives == nullptr) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "primitives must be non-null.");
+  }
+  if (ciphertext_source == nullptr) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "ciphertext_source must be non-null.");
+  }
+  return {absl::WrapUnique(new DecryptingRandomAccessStream(
+      primitives, std::move(ciphertext_source), associated_data))};
+}
+
+util::Status DecryptingRandomAccessStream::PRead(
+    int64_t position, int count,
+    crypto::tink::util::Buffer* dest_buffer) {
+  {  // "fast-track": quickly proceed if matching has been attempted/found.
+    if (dest_buffer == nullptr) {
+      return ToStatusF(util::error::INVALID_ARGUMENT,
+                       "dest_buffer must be non-null");
+    }
+    if (count < 0) {
+      return ToStatusF(util::error::INVALID_ARGUMENT,
+                       "count cannot be negative");
+    }
+    if (count > dest_buffer->allocated_size()) {
+      return ToStatusF(util::error::INVALID_ARGUMENT,
+                       "buffer too small");
+    }
+    if (position < 0) {
+      return ToStatusF(util::error::INVALID_ARGUMENT,
+                       "position cannot be negative");
+    }
+    absl::ReaderMutexLock lock(&matching_mutex_);
+    if (matching_stream_ != nullptr) {
+      return matching_stream_->PRead(position, count, dest_buffer);
+    }
+    if (attempted_matching_) {
+      return Status(util::error::INVALID_ARGUMENT,
+                    "Did not find a decrypter matching the ciphertext stream.");
+    }
+  }
+  // Matching has not been attempted yet, so try it now.
+  absl::MutexLock lock(&matching_mutex_);
+
+  // Re-check that matching hasn't been attempted in the meantime.
+  if (matching_stream_ != nullptr) {
+    return matching_stream_->PRead(position, count, dest_buffer);
+  }
+  if (attempted_matching_) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "Did not find a decrypter matching the ciphertext stream.");
+  }
+  attempted_matching_ = true;
+  auto raw_primitives_result = primitives_->get_raw_primitives();
+  if (!raw_primitives_result.ok()) {
+    return Status(util::error::INTERNAL, "No RAW primitives found");
+  }
+  for (auto& primitive : *(raw_primitives_result.ValueOrDie())) {
+    StreamingAead& streaming_aead = primitive->get_primitive();
+    auto shared_ct = absl::make_unique<SharedRandomAccessStream>(
+        ciphertext_source_.get());
+    auto decrypting_stream_result =
+        streaming_aead.NewDecryptingRandomAccessStream(
+            std::move(shared_ct), associated_data_);
+    if (decrypting_stream_result.ok()) {
+      auto status = decrypting_stream_result.ValueOrDie()->PRead(
+          position, count, dest_buffer);
+      if (status.ok() || status.error_code() == util::error::OUT_OF_RANGE) {
+        // Found a match.
+        matching_stream_ = std::move(decrypting_stream_result.ValueOrDie());
+        return status;
+      }
+    }
+    // Not a match, try the next primitive.
+  }
+  return Status(util::error::INVALID_ARGUMENT,
+                "Could not find a decrypter matching the ciphertext stream.");
+}
+
+StatusOr<int64_t> DecryptingRandomAccessStream::size() {
+  absl::ReaderMutexLock lock(&matching_mutex_);
+  if (matching_stream_ != nullptr) {
+    return matching_stream_->size();
+  }
+  // TODO(b/139722894): attempt matching here?
+  return Status(util::error::UNAVAILABLE, "no matching found yet");
+}
+
+}  // namespace streamingaead
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/streamingaead/decrypting_random_access_stream.h b/cc/streamingaead/decrypting_random_access_stream.h
new file mode 100644
index 0000000..24fa424
--- /dev/null
+++ b/cc/streamingaead/decrypting_random_access_stream.h
@@ -0,0 +1,81 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_STREAMINGAEAD_DECRYPTING_RANDOM_ACCESS_STREAM_H_
+#define TINK_STREAMINGAEAD_DECRYPTING_RANDOM_ACCESS_STREAM_H_
+
+#include <memory>
+#include <vector>
+
+#include "absl/synchronization/mutex.h"
+#include "tink/random_access_stream.h"
+#include "tink/primitive_set.h"
+#include "tink/streaming_aead.h"
+#include "tink/util/buffer.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace streamingaead {
+
+// A wrapper around a RandomAccessStream that holds a reference to a
+// set of StreamingAead-primitives and upon first PRead()-call attempts
+// to read the stream via the provided primitives to find a matching one,
+// i.e. the primitive that is able to decrypt the stream.
+// Once a match is found, all subsequent calls are forwarded to it.
+class DecryptingRandomAccessStream : public crypto::tink::RandomAccessStream {
+ public:
+  // Constructs an RandomAccessStream that wraps 'random_access_stream',
+  // and will use (one of) provided 'primitives' to decrypt the contents
+  // of 'random_access_stream', using 'associated_data' as authenticated
+  // associated data of the decryption process.
+  static util::StatusOr<std::unique_ptr<RandomAccessStream>> New(
+      std::shared_ptr<
+          crypto::tink::PrimitiveSet<crypto::tink::StreamingAead>> primitives,
+      std::unique_ptr<crypto::tink::RandomAccessStream> ciphertext_source,
+      absl::string_view associated_data);
+
+  ~DecryptingRandomAccessStream() override {}
+  crypto::tink::util::Status PRead(int64_t position, int count,
+      crypto::tink::util::Buffer* dest_buffer) override;
+  crypto::tink::util::StatusOr<int64_t> size() override;
+
+ private:
+  DecryptingRandomAccessStream(
+      std::shared_ptr<
+          crypto::tink::PrimitiveSet<crypto::tink::StreamingAead>> primitives,
+      std::unique_ptr<crypto::tink::RandomAccessStream> ciphertext_source,
+      absl::string_view associated_data)
+      : primitives_(primitives),
+        ciphertext_source_(std::move(ciphertext_source)),
+        associated_data_(associated_data),
+        attempted_matching_(false),
+        matching_stream_(nullptr) {}
+  std::shared_ptr<
+      crypto::tink::PrimitiveSet<crypto::tink::StreamingAead>> primitives_;
+  std::unique_ptr<crypto::tink::RandomAccessStream> ciphertext_source_;
+  std::string associated_data_;
+  mutable absl::Mutex matching_mutex_;
+  bool attempted_matching_ ABSL_GUARDED_BY(matching_mutex_);
+  std::unique_ptr<crypto::tink::RandomAccessStream> matching_stream_
+      ABSL_GUARDED_BY(matching_mutex_);
+};
+
+}  // namespace streamingaead
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_STREAMINGAEAD_DECRYPTING_RANDOM_ACCESS_STREAM_H_
diff --git a/cc/streamingaead/decrypting_random_access_stream_test.cc b/cc/streamingaead/decrypting_random_access_stream_test.cc
new file mode 100644
index 0000000..02b78f0
--- /dev/null
+++ b/cc/streamingaead/decrypting_random_access_stream_test.cc
@@ -0,0 +1,382 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/streamingaead/decrypting_random_access_stream.h"
+
+#include <sstream>
+#include <vector>
+
+#include "gtest/gtest.h"
+#include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "tink/random_access_stream.h"
+#include "tink/output_stream.h"
+#include "tink/primitive_set.h"
+#include "tink/streaming_aead.h"
+#include "tink/subtle/random.h"
+#include "tink/subtle/test_util.h"
+#include "tink/util/file_random_access_stream.h"
+#include "tink/util/ostream_output_stream.h"
+#include "tink/util/status.h"
+#include "tink/util/test_matchers.h"
+#include "tink/util/test_util.h"
+
+namespace crypto {
+namespace tink {
+namespace streamingaead {
+namespace {
+
+using crypto::tink::test::IsOk;
+using crypto::tink::test::StatusIs;
+using crypto::tink::test::DummyStreamingAead;
+using google::crypto::tink::Keyset;
+using google::crypto::tink::KeyStatusType;
+using google::crypto::tink::OutputPrefixType;
+using subtle::test::WriteToStream;
+using testing::HasSubstr;
+
+// Creates a RandomAccessStream with the specified contents.
+std::unique_ptr<RandomAccessStream> GetRandomAccessStream(
+    absl::string_view contents) {
+  static int index = 1;
+  std::string filename = absl::StrCat("stream_data_file_", index, ".txt");
+  index++;
+  int input_fd = test::GetTestFileDescriptor(filename, contents);
+  return {absl::make_unique<util::FileRandomAccessStream>(input_fd)};
+}
+
+// Creates an RandomAccessStream that contains ciphertext resulting
+// from encryption of 'pt' with 'aad' as associated data, using 'saead'.
+std::unique_ptr<RandomAccessStream> GetCiphertextSource(
+    StreamingAead* saead, absl::string_view pt, absl::string_view aad) {
+  // Prepare ciphertext destination stream.
+  auto ct_stream = absl::make_unique<std::stringstream>();
+  // A reference to the ciphertext buffer.
+  auto ct_buf = ct_stream->rdbuf();
+  std::unique_ptr<OutputStream> ct_destination(
+      absl::make_unique<util::OstreamOutputStream>(std::move(ct_stream)));
+
+  // Compute the ciphertext.
+  auto enc_stream_result =
+      saead->NewEncryptingStream(std::move(ct_destination), aad);
+  EXPECT_THAT(enc_stream_result.status(), IsOk());
+  EXPECT_THAT(WriteToStream(enc_stream_result.ValueOrDie().get(), pt), IsOk());
+
+  // Return the ciphertext as RandomAccessStream.
+  return GetRandomAccessStream(ct_buf->str());
+}
+
+// Reads the entire 'ra_stream', until no more bytes can be read,
+// and puts the read bytes into 'contents'.
+// Returns the status of the last ra_stream->PRead()-operation.
+util::Status ReadAll(RandomAccessStream* ra_stream, std::string* contents) {
+  int chunk_size = 42;
+  contents->clear();
+  auto buffer = std::move(util::Buffer::New(chunk_size).ValueOrDie());
+  int64_t position = 0;
+  auto status = ra_stream->PRead(position, chunk_size, buffer.get());
+  while (status.ok()) {
+    contents->append(buffer->get_mem_block(), buffer->size());
+    position = contents->size();
+    status = ra_stream->PRead(position, chunk_size, buffer.get());
+  }
+  if (status.error_code() == util::error::OUT_OF_RANGE) {  // EOF
+    EXPECT_EQ(0, buffer->size());
+  }
+  return status;
+}
+
+// A container for specification of instances of DummyStreamingAead
+// to be created for testing.
+struct StreamingAeadSpec {
+  uint32_t key_id;
+  std::string saead_name;
+};
+
+// Generates a PrimitiveSet<StreamingAead> with DummyStreamingAead
+// instances according to the specification in 'spec'.
+// The last entry in 'spec' will be the primary primitive in the returned set.
+std::shared_ptr<PrimitiveSet<StreamingAead>> GetTestStreamingAeadSet(
+    const std::vector<StreamingAeadSpec>& spec) {
+  Keyset::Key* key;
+  Keyset keyset;
+  std::shared_ptr<PrimitiveSet<StreamingAead>> saead_set =
+      std::make_shared<PrimitiveSet<StreamingAead>>();
+  int i = 0;
+  for (auto& s : spec) {
+    key = keyset.add_key();
+    key->set_output_prefix_type(OutputPrefixType::RAW);
+    key->set_key_id(s.key_id);
+    key->set_status(KeyStatusType::ENABLED);
+    std::unique_ptr<StreamingAead> saead =
+        absl::make_unique<DummyStreamingAead>(s.saead_name);
+    auto entry_result = saead_set->AddPrimitive(std::move(saead), *key);
+    EXPECT_TRUE(entry_result.ok());
+    if (i + 1 == spec.size()) {
+      EXPECT_THAT(saead_set->set_primary(entry_result.ValueOrDie()), IsOk());
+    }
+    i++;
+  }
+  return saead_set;
+}
+
+TEST(DecryptingRandomAccessStreamTest, BasicDecryption) {
+  uint32_t key_id_0 = 1234543;
+  uint32_t key_id_1 = 726329;
+  uint32_t key_id_2 = 7213743;
+  std::string saead_name_0 = "streaming_aead0";
+  std::string saead_name_1 = "streaming_aead1";
+  std::string saead_name_2 = "streaming_aead2";
+
+  auto saead_set = GetTestStreamingAeadSet(
+      {{key_id_0, saead_name_0}, {key_id_1, saead_name_1},
+       {key_id_2, saead_name_2}});
+
+  for (int pt_size : {0, 1, 10, 100, 10000}) {
+    std::string plaintext = subtle::Random::GetRandomBytes(pt_size);
+    for (std::string aad : {"some_aad", "", "some other aad"}) {
+      SCOPED_TRACE(absl::StrCat("pt_size = ", pt_size,
+                                ", aad = '", aad, "'"));
+      // Pre-compute ciphertexts. We create one ciphertext for each primitive
+      // in the primitive set, so that we can test decryption with both
+      // the primary primitive, and the non-primary ones.
+      std::vector<std::unique_ptr<RandomAccessStream>> ciphertexts;
+      for (const auto& p : *(saead_set->get_raw_primitives().ValueOrDie())) {
+        ciphertexts.push_back(
+            GetCiphertextSource(&(p->get_primitive()), plaintext, aad));
+      }
+      EXPECT_EQ(3, ciphertexts.size());
+
+      // Check the decryption of each of the pre-computed ciphertexts.
+      for (auto& ct : ciphertexts) {
+        // Wrap the primitive set and test the resulting
+        // DecryptingRandomAccessStream.
+        auto dec_stream_result =
+            DecryptingRandomAccessStream::New(saead_set, std::move(ct), aad);
+        EXPECT_THAT(dec_stream_result.status(), IsOk());
+        auto dec_stream = std::move(dec_stream_result.ValueOrDie());
+        std::string decrypted;
+        auto status = ReadAll(dec_stream.get(), &decrypted);
+        EXPECT_THAT(status, StatusIs(util::error::OUT_OF_RANGE,
+                                     HasSubstr("EOF")));
+        EXPECT_EQ(pt_size, dec_stream->size().ValueOrDie());
+        EXPECT_EQ(plaintext, decrypted);
+      }
+    }
+  }
+}
+
+TEST(DecryptingRandomAccessStreamTest, SelectiveDecryption) {
+  uint32_t key_id_0 = 1234543;
+  uint32_t key_id_1 = 726329;
+  uint32_t key_id_2 = 7213743;
+  std::string saead_name_0 = "streaming_aead0";
+  std::string saead_name_1 = "streaming_aead1";
+  std::string saead_name_2 = "streaming_aead2";
+
+  auto saead_set = GetTestStreamingAeadSet(
+      {{key_id_0, saead_name_0}, {key_id_1, saead_name_1},
+       {key_id_2, saead_name_2}});
+
+  for (int pt_size : {5, 10, 100, 10000}) {
+    std::string plaintext = subtle::Random::GetRandomBytes(pt_size);
+    for (std::string aad : {"some_aad", "", "some other aad"}) {
+      SCOPED_TRACE(absl::StrCat("pt_size = ", pt_size,
+                                ", aad = '", aad, "'"));
+      // Pre-compute ciphertexts. We create one ciphertext for each primitive
+      // in the primitive set, so that we can test decryption with both
+      // the primary primitive, and the non-primary ones.
+      std::vector<std::unique_ptr<RandomAccessStream>> ciphertexts;
+      for (const auto& p : *(saead_set->get_raw_primitives().ValueOrDie())) {
+        ciphertexts.push_back(
+            GetCiphertextSource(&(p->get_primitive()), plaintext, aad));
+      }
+      EXPECT_EQ(3, ciphertexts.size());
+
+      // Check the decryption of each of the pre-computed ciphertexts.
+      int ct_number = 0;
+      for (auto& ct : ciphertexts) {
+        // Wrap the primitive set and test the resulting
+        // DecryptingRandomAccessStream.
+        auto dec_stream_result =
+            DecryptingRandomAccessStream::New(saead_set, std::move(ct), aad);
+        EXPECT_THAT(dec_stream_result.status(), IsOk());
+        auto dec_stream = std::move(dec_stream_result.ValueOrDie());
+        for (int position : {0, 1, 2, pt_size/2, pt_size-1}) {
+          for (int chunk_size : {1, pt_size/2, pt_size}) {
+            SCOPED_TRACE(absl::StrCat("ct_number = ", ct_number,
+                                      ", position = ", position,
+                                      ", chunk_size = ", chunk_size));
+            auto buffer = std::move(util::Buffer::New(chunk_size).ValueOrDie());
+            auto status = dec_stream->PRead(position, chunk_size, buffer.get());
+            EXPECT_THAT(status, IsOk());
+            EXPECT_EQ(std::min(chunk_size, pt_size - position), buffer->size());
+            EXPECT_EQ(0, std::memcmp(plaintext.data() + position,
+                                     buffer->get_mem_block(), buffer->size()));
+          }
+        }
+        ct_number++;
+      }
+    }
+  }
+}
+
+TEST(DecryptingRandomAccessStreamTest, OutOfRangeDecryption) {
+  uint32_t key_id_0 = 1234543;
+  uint32_t key_id_1 = 726329;
+  uint32_t key_id_2 = 7213743;
+  std::string saead_name_0 = "streaming_aead0";
+  std::string saead_name_1 = "streaming_aead1";
+  std::string saead_name_2 = "streaming_aead2";
+
+  auto saead_set = GetTestStreamingAeadSet(
+      {{key_id_0, saead_name_0}, {key_id_1, saead_name_1},
+       {key_id_2, saead_name_2}});
+
+  for (int pt_size : {1, 5, 10, 100, 10000}) {
+    std::string plaintext = subtle::Random::GetRandomBytes(pt_size);
+    for (std::string aad : {"some_aad", "", "some other aad"}) {
+      SCOPED_TRACE(absl::StrCat("pt_size = ", pt_size,
+                                ", aad = '", aad, "'"));
+      // Pre-compute ciphertexts. We create one ciphertext for each primitive
+      // in the primitive set, so that we can test decryption with both
+      // the primary primitive, and the non-primary ones.
+      std::vector<std::unique_ptr<RandomAccessStream>> ciphertexts;
+      for (const auto& p : *(saead_set->get_raw_primitives().ValueOrDie())) {
+        ciphertexts.push_back(
+            GetCiphertextSource(&(p->get_primitive()), plaintext, aad));
+      }
+      EXPECT_EQ(3, ciphertexts.size());
+
+      // Check the decryption of each of the pre-computed ciphertexts.
+      int ct_number = 0;
+      for (auto& ct : ciphertexts) {
+        // Wrap the primitive set and test the resulting
+        // DecryptingRandomAccessStream.
+        auto dec_stream_result =
+            DecryptingRandomAccessStream::New(saead_set, std::move(ct), aad);
+        EXPECT_THAT(dec_stream_result.status(), IsOk());
+        auto dec_stream = std::move(dec_stream_result.ValueOrDie());
+        int chunk_size = 1;
+        auto buffer = std::move(util::Buffer::New(chunk_size).ValueOrDie());
+        for (int position : {pt_size, pt_size + 1}) {
+          SCOPED_TRACE(absl::StrCat("ct_number = ", ct_number,
+                                    ", position = ", position));
+          // Negative chunk size.
+          auto status = dec_stream->PRead(position, -1, buffer.get());
+          EXPECT_THAT(status, StatusIs(util::error::INVALID_ARGUMENT));
+
+          // Negative position.
+          status = dec_stream->PRead(-1, chunk_size, buffer.get());
+          EXPECT_THAT(status, StatusIs(util::error::INVALID_ARGUMENT));
+
+          // Reading past EOF.
+          status = dec_stream->PRead(position, chunk_size, buffer.get());
+          EXPECT_THAT(status, StatusIs(util::error::OUT_OF_RANGE));
+        }
+        ct_number++;
+      }
+    }
+  }
+}
+
+TEST(DecryptingRandomAccessStreamTest, WrongAssociatedData) {
+  uint32_t key_id_0 = 1234543;
+  uint32_t key_id_1 = 726329;
+  uint32_t key_id_2 = 7213743;
+  std::string saead_name_0 = "streaming_aead0";
+  std::string saead_name_1 = "streaming_aead1";
+  std::string saead_name_2 = "streaming_aead2";
+
+  auto saead_set = GetTestStreamingAeadSet(
+      {{key_id_0, saead_name_0}, {key_id_1, saead_name_1},
+       {key_id_2, saead_name_2}});
+
+  for (int pt_size : {0, 1, 10, 100, 10000}) {
+    std::string plaintext = subtle::Random::GetRandomBytes(pt_size);
+    for (std::string aad : {"some_aad", "", "some other aad"}) {
+      SCOPED_TRACE(absl::StrCat("pt_size = ", pt_size,
+                                ", aad = '", aad, "'"));
+      // Compute a ciphertext with the primary primitive.
+      auto ct = GetCiphertextSource(
+          &(saead_set->get_primary()->get_primitive()), plaintext, aad);
+      auto dec_stream_result = DecryptingRandomAccessStream::New(
+          saead_set, std::move(ct), "wrong aad");
+      EXPECT_THAT(dec_stream_result.status(), IsOk());
+      std::string decrypted;
+      auto status = ReadAll(dec_stream_result.ValueOrDie().get(),
+                            &decrypted);
+      EXPECT_THAT(status, StatusIs(util::error::INVALID_ARGUMENT));
+    }
+  }
+}
+
+TEST(DecryptingRandomAccessStreamTest, WrongCiphertext) {
+  uint32_t key_id_0 = 1234543;
+  uint32_t key_id_1 = 726329;
+  uint32_t key_id_2 = 7213743;
+  std::string saead_name_0 = "streaming_aead0";
+  std::string saead_name_1 = "streaming_aead1";
+  std::string saead_name_2 = "streaming_aead2";
+
+  auto saead_set = GetTestStreamingAeadSet(
+      {{key_id_0, saead_name_0}, {key_id_1, saead_name_1},
+       {key_id_2, saead_name_2}});
+
+  for (int pt_size : {0, 1, 10, 100, 10000}) {
+    std::string plaintext = subtle::Random::GetRandomBytes(pt_size);
+    for (std::string aad : {"some_aad", "", "some other aad"}) {
+      SCOPED_TRACE(absl::StrCat("pt_size = ", pt_size,
+                                ", aad = '", aad, "'"));
+      // Try decrypting a wrong ciphertext.
+      auto wrong_ct =
+          GetRandomAccessStream(subtle::Random::GetRandomBytes(pt_size));
+      auto dec_stream_result = DecryptingRandomAccessStream::New(
+          saead_set, std::move(wrong_ct), aad);
+      EXPECT_THAT(dec_stream_result.status(), IsOk());
+      std::string decrypted;
+      auto status = ReadAll(dec_stream_result.ValueOrDie().get(), &decrypted);
+      EXPECT_THAT(status, StatusIs(util::error::INVALID_ARGUMENT));
+    }
+  }
+}
+
+TEST(DecryptingRandomAccessStreamTest, NullPrimitiveSet) {
+  auto ct_stream = GetRandomAccessStream("some ciphertext contents");
+  auto dec_stream_result = DecryptingRandomAccessStream::New(
+          nullptr, std::move(ct_stream), "some aad");
+  EXPECT_THAT(dec_stream_result.status(),
+              StatusIs(util::error::INVALID_ARGUMENT,
+                       HasSubstr("primitives must be non-null")));
+}
+
+TEST(DecryptingRandomAccessStreamTest, NullCiphertextSource) {
+  uint32_t key_id = 1234543;
+  std::string saead_name = "streaming_aead";
+  auto saead_set = GetTestStreamingAeadSet({{key_id, saead_name}});
+
+  auto dec_stream_result = DecryptingRandomAccessStream::New(
+      saead_set, nullptr, "some aad");
+  EXPECT_THAT(dec_stream_result.status(),
+              StatusIs(util::error::INVALID_ARGUMENT,
+                       HasSubstr("ciphertext_source must be non-null")));
+}
+
+}  // namespace
+}  // namespace streamingaead
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/streamingaead/shared_input_stream.h b/cc/streamingaead/shared_input_stream.h
new file mode 100644
index 0000000..1733754
--- /dev/null
+++ b/cc/streamingaead/shared_input_stream.h
@@ -0,0 +1,60 @@
+// Copyright 2019 Google LLC.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_STREAMINGAEAD_SHARED_INPUT_STREAM_H_
+#define TINK_STREAMINGAEAD_SHARED_INPUT_STREAM_H_
+
+#include "tink/input_stream.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace streamingaead {
+
+// An InputStream that wraps another InputStream as a non-owned pointer.
+// The wrapper forwards all calls to the wrapped InputStream,
+// which must remain alive as long as as the wrapper is in use.
+class SharedInputStream : public crypto::tink::InputStream {
+ public:
+  // Constructs an InputStream that wraps 'input_stream',
+  // and will forward all the method calls to this wrapped stream.
+  explicit SharedInputStream(
+      crypto::tink::InputStream* input_stream)
+      : input_stream_(input_stream) {}
+
+  ~SharedInputStream() override {}
+
+  crypto::tink::util::StatusOr<int> Next(const void** data) override {
+    return input_stream_->Next(data);
+  }
+
+  void BackUp(int count) override {
+    input_stream_->BackUp(count);
+  }
+
+  int64_t Position() const override {
+    return input_stream_->Position();
+  }
+
+ private:
+  crypto::tink::InputStream* input_stream_;
+};
+
+}  // namespace streamingaead
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_STREAMINGAEAD_SHARED_INPUT_STREAM_H_
diff --git a/cc/streamingaead/shared_input_stream_test.cc b/cc/streamingaead/shared_input_stream_test.cc
new file mode 100644
index 0000000..5dacd16
--- /dev/null
+++ b/cc/streamingaead/shared_input_stream_test.cc
@@ -0,0 +1,233 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/streamingaead/shared_input_stream.h"
+
+#include <sstream>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "tink/input_stream.h"
+#include "tink/streamingaead/buffered_input_stream.h"
+#include "tink/subtle/random.h"
+#include "tink/subtle/test_util.h"
+#include "tink/util/istream_input_stream.h"
+#include "tink/util/status.h"
+#include "tink/util/test_matchers.h"
+
+namespace crypto {
+namespace tink {
+namespace streamingaead {
+namespace {
+
+using crypto::tink::test::IsOk;
+using crypto::tink::test::StatusIs;
+using subtle::test::ReadFromStream;
+
+static int kBufferSize = 4096;
+
+// Creates an InputStream with the specified contents.
+std::unique_ptr<InputStream> GetInputStream(absl::string_view contents) {
+  // Prepare ciphertext source stream.
+  auto string_stream = absl::make_unique<std::stringstream>(std::string(contents));
+  std::unique_ptr<InputStream> input_stream(
+      absl::make_unique<util::IstreamInputStream>(
+          std::move(string_stream), kBufferSize));
+  return input_stream;
+}
+
+// Attempts to read 'count' bytes from 'input_stream', and writes the read
+// bytes to 'output'.
+util::Status ReadFromStream(
+    InputStream* input_stream, int count, std::string* output) {
+  if (input_stream == nullptr || output == nullptr || count < 0) {
+    return util::Status(util::error::INTERNAL, "Illegal read from a stream");
+  }
+  const void* buffer;
+  output->clear();
+  int bytes_to_read = count;
+  while (bytes_to_read > 0) {
+    auto next_result = input_stream->Next(&buffer);
+    if (next_result.status().error_code() == util::error::OUT_OF_RANGE) {
+      // End of stream.
+      return util::Status::OK;
+    }
+    if (!next_result.ok()) return next_result.status();
+    auto read_bytes = next_result.ValueOrDie();
+    auto used_bytes = std::min(read_bytes, bytes_to_read);
+    if (used_bytes > 0) {
+      output->append(std::string(reinterpret_cast<const char*>(buffer), used_bytes));
+      bytes_to_read -= used_bytes;
+      if (bytes_to_read == 0) input_stream->BackUp(read_bytes - used_bytes);
+    }
+  }
+  return util::Status::OK;
+}
+
+TEST(SharedInputStreamTest, BasicOperations) {
+  for (auto input_size : {0, 1, 10, 100, 1000, 10000, 100000}) {
+    std::string contents = subtle::Random::GetRandomBytes(input_size);
+    auto input_stream = GetInputStream(contents);
+    auto buffered_stream =
+        std::make_shared<BufferedInputStream>(std::move(input_stream));
+    for (auto read_size : {0, 1, 10, 123, 300}) {
+      SCOPED_TRACE(absl::StrCat("input_size = ", input_size,
+                                ", read_size = ", read_size));
+      {
+        auto shared_stream =
+            absl::make_unique<SharedInputStream>(buffered_stream.get());
+
+        // Read a prefix of the stream.
+        std::string prefix;
+        auto status = ReadFromStream(shared_stream.get(), read_size, &prefix);
+        EXPECT_THAT(status, IsOk());
+        EXPECT_EQ(std::min(read_size, input_size), shared_stream->Position());
+        EXPECT_EQ(contents.substr(0, read_size), prefix);
+        EXPECT_EQ(buffered_stream->Position(), shared_stream->Position());
+
+        // Read the rest of the stream.
+        std::string rest;
+        status = ReadFromStream(shared_stream.get(), &rest);
+        EXPECT_THAT(status, IsOk());
+        EXPECT_EQ(input_size, shared_stream->Position());
+        EXPECT_EQ(contents, prefix + rest);
+        EXPECT_EQ(buffered_stream->Position(), shared_stream->Position());
+
+        // Try reading again, should get an empty std::string.
+        status = ReadFromStream(shared_stream.get(), &rest);
+        EXPECT_THAT(status, IsOk());
+        EXPECT_EQ("", rest);
+        EXPECT_EQ(buffered_stream->Position(), shared_stream->Position());
+      }
+
+      // Now that shared_stream is out of scope, we rewind the underlying
+      // buffered_stream, so that the next read iteration starts from
+      // the beginning.
+      auto status = buffered_stream->Rewind();
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ(0, buffered_stream->Position());
+    }
+  }
+}
+
+
+TEST(SharedInputStreamTest, SingleBackup) {
+  for (auto input_size : {0, 1, 10, 100, 1000, 10000, 100000}) {
+    std::string contents = subtle::Random::GetRandomBytes(input_size);
+    auto input_stream = GetInputStream(contents);
+    auto buffered_stream =
+        std::make_shared<BufferedInputStream>(std::move(input_stream));
+    for (auto read_size : {0, 1, 10, 123, 300, 1024}) {
+      SCOPED_TRACE(absl::StrCat("input_size = ", input_size,
+                                ", read_size = ", read_size));
+      {
+        auto shared_stream = absl::make_unique<SharedInputStream>(
+            buffered_stream.get());
+
+        // Read a part of the stream.
+        std::string prefix;
+        auto status = ReadFromStream(shared_stream.get(), read_size, &prefix);
+        EXPECT_THAT(status, IsOk());
+        EXPECT_EQ(std::min(read_size, input_size), shared_stream->Position());
+        EXPECT_EQ(contents.substr(0, read_size), prefix);
+
+        // Read the next block of the stream, and then back it up.
+        const void* buf;
+        int pos = shared_stream->Position();
+        auto next_result = shared_stream->Next(&buf);
+        if (read_size < input_size) {
+          EXPECT_THAT(next_result.status(), IsOk());
+          auto next_size = next_result.ValueOrDie();
+          EXPECT_EQ(pos + next_size, shared_stream->Position());
+          shared_stream->BackUp(next_size);
+          EXPECT_EQ(pos, shared_stream->Position());
+          shared_stream->BackUp(input_size);
+          EXPECT_EQ(pos, shared_stream->Position());
+        } else {
+          EXPECT_THAT(next_result.status(),
+                      StatusIs(util::error::OUT_OF_RANGE));
+        }
+
+        // Read the rest of the input.
+        std::string rest;
+        status = ReadFromStream(shared_stream.get(), &rest);
+        EXPECT_THAT(status, IsOk());
+        EXPECT_EQ(input_size, shared_stream->Position());
+        EXPECT_EQ(contents, prefix + rest);
+      }
+      // Now that shared_stream is out of scope, we rewind the underlying
+      // buffered_stream, so that the next read iteration starts from
+      // the beginning.
+      auto status = buffered_stream->Rewind();
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ(0, buffered_stream->Position());
+    }
+  }
+}
+
+TEST(SharedInputStreamTest, MultipleBackups) {
+  int input_size = 70000;
+  std::string contents = subtle::Random::GetRandomBytes(input_size);
+  auto input_stream = GetInputStream(contents);
+  auto buffered_stream =
+      std::make_shared<BufferedInputStream>(std::move(input_stream));
+
+  for (int i = 0; i < 2; i++) {  // Two rounds, to test with Rewind.
+    auto status = buffered_stream->Rewind();
+    EXPECT_THAT(status, IsOk());
+    EXPECT_EQ(0, buffered_stream->Position());
+
+    auto shared_stream = absl::make_unique<SharedInputStream>(
+        buffered_stream.get());
+    EXPECT_EQ(0, shared_stream->Position());
+
+    const void* buffer;
+    auto next_result = shared_stream->Next(&buffer);
+    EXPECT_THAT(next_result.status(), IsOk());
+    auto next_size = next_result.ValueOrDie();
+    EXPECT_EQ(contents.substr(0, next_size),
+              std::string(static_cast<const char*>(buffer), next_size));
+
+    // BackUp several times, but in total fewer bytes than returned by Next().
+    int total_backup_size = 0;
+    for (auto backup_size : {0, 1, 5, 0, 10, 100, -42, 400, 20, -100}) {
+      shared_stream->BackUp(backup_size);
+      total_backup_size += std::max(0, backup_size);
+      EXPECT_EQ(next_size - total_backup_size, shared_stream->Position());
+      EXPECT_EQ(buffered_stream->Position(), shared_stream->Position());
+    }
+    EXPECT_GT(next_size, total_backup_size);
+
+    // Call Next(), it should return exactly the backed up bytes.
+    next_result = shared_stream->Next(&buffer);
+    EXPECT_THAT(next_result.status(), IsOk());
+    EXPECT_EQ(total_backup_size, next_result.ValueOrDie());
+    EXPECT_EQ(next_size, shared_stream->Position());
+    EXPECT_EQ(buffered_stream->Position(), shared_stream->Position());
+    EXPECT_EQ(
+        contents.substr(next_size - total_backup_size, total_backup_size),
+        std::string(static_cast<const char*>(buffer), total_backup_size));
+  }
+}
+
+
+}  // namespace
+}  // namespace streamingaead
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/streamingaead/shared_random_access_stream.h b/cc/streamingaead/shared_random_access_stream.h
new file mode 100644
index 0000000..9e8a0a4
--- /dev/null
+++ b/cc/streamingaead/shared_random_access_stream.h
@@ -0,0 +1,61 @@
+// Copyright 2019 Google LLC.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_STREAMINGAEAD_SHARED_RANDOM_ACCESS_STREAM_H_
+#define TINK_STREAMINGAEAD_SHARED_RANDOM_ACCESS_STREAM_H_
+
+#include "tink/random_access_stream.h"
+#include "tink/util/buffer.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace streamingaead {
+
+// A RandomAccessStream that wraps another RandomAccessStream
+// as a non-owned pointer.
+// The wrapper forwards all calls to the wrapped RandomAccessStream,
+// which must remain alive as long as as the wrapper is in use.
+class SharedRandomAccessStream : public crypto::tink::RandomAccessStream {
+ public:
+  // Constructs an RandomAccessStream that wraps 'random_access_stream',
+  // and will forward all the method calls to this wrapped stream.
+  explicit SharedRandomAccessStream(
+      crypto::tink::RandomAccessStream* random_access_stream)
+      : random_access_stream_(random_access_stream) {}
+
+  ~SharedRandomAccessStream() override {}
+
+  crypto::tink::util::Status PRead(
+      int64_t position, int count,
+      crypto::tink::util::Buffer* dest_buffer) override {
+    return random_access_stream_->PRead(position, count, dest_buffer);
+  }
+
+  crypto::tink::util::StatusOr<int64_t> size() override {
+    return random_access_stream_->size();
+  }
+
+ private:
+  crypto::tink::RandomAccessStream* random_access_stream_;
+};
+
+}  // namespace streamingaead
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_STREAMINGAEAD_SHARED_RANDOM_ACCESS_STREAM_H_
diff --git a/cc/streamingaead/shared_random_access_stream_test.cc b/cc/streamingaead/shared_random_access_stream_test.cc
new file mode 100644
index 0000000..1aa473e
--- /dev/null
+++ b/cc/streamingaead/shared_random_access_stream_test.cc
@@ -0,0 +1,77 @@
+// Copyright 2019 Google LLC.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/streamingaead/shared_random_access_stream.h"
+
+#include "gtest/gtest.h"
+#include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
+#include "tink/random_access_stream.h"
+#include "tink/util/file_random_access_stream.h"
+#include "tink/util/buffer.h"
+#include "tink/util/status.h"
+#include "tink/util/test_util.h"
+
+namespace crypto {
+namespace tink {
+namespace streamingaead {
+namespace {
+
+// Reads the entire 'ra_stream' in chunks of size 'chunk_size',
+// until no more bytes can be read, and puts the read bytes into 'contents'.
+// Returns the status of the last ra_stream->Next()-operation.
+util::Status ReadAll(RandomAccessStream* ra_stream, int chunk_size,
+                     std::string* contents) {
+  contents->clear();
+  auto buffer = std::move(util::Buffer::New(chunk_size).ValueOrDie());
+  int64_t position = 0;
+  auto status = ra_stream->PRead(position, chunk_size, buffer.get());
+  while (status.ok()) {
+    contents->append(buffer->get_mem_block(), buffer->size());
+    position = contents->size();
+    status = ra_stream->PRead(position, chunk_size, buffer.get());
+  }
+  if (status.error_code() == util::error::OUT_OF_RANGE) {  // EOF
+    EXPECT_EQ(0, buffer->size());
+  }
+  return status;
+}
+
+TEST(SharedRandomAccessStreamTest, ReadingStreams) {
+  for (auto stream_size : {0, 10, 100, 1000, 10000, 1000000}) {
+    SCOPED_TRACE(absl::StrCat("stream_size = ", stream_size));
+    std::string file_contents;
+    std::string filename = absl::StrCat(stream_size, "_reading_test.bin");
+    int input_fd = test::GetTestFileDescriptor(
+        filename, stream_size, &file_contents);
+    EXPECT_EQ(stream_size, file_contents.size());
+    auto ra_stream = absl::make_unique<util::FileRandomAccessStream>(input_fd);
+    SharedRandomAccessStream shared_stream(ra_stream.get());
+    std::string stream_contents;
+    auto status = ReadAll(&shared_stream, 1 + (stream_size / 10),
+                          &stream_contents);
+    EXPECT_EQ(util::error::OUT_OF_RANGE, status.error_code());
+    EXPECT_EQ("EOF", status.error_message());
+    EXPECT_EQ(file_contents, stream_contents);
+    EXPECT_EQ(stream_size, shared_stream.size().ValueOrDie());
+  }
+}
+
+
+}  // namespace
+}  // namespace streamingaead
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/streamingaead/streaming_aead_config.cc b/cc/streamingaead/streaming_aead_config.cc
new file mode 100644
index 0000000..edb46b3
--- /dev/null
+++ b/cc/streamingaead/streaming_aead_config.cc
@@ -0,0 +1,55 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/streamingaead/streaming_aead_config.h"
+
+#include "absl/memory/memory.h"
+#include "tink/config/config_util.h"
+#include "tink/registry.h"
+#include "tink/streamingaead/aes_ctr_hmac_streaming_key_manager.h"
+#include "tink/streamingaead/aes_gcm_hkdf_streaming_key_manager.h"
+#include "tink/streamingaead/streaming_aead_wrapper.h"
+#include "tink/util/status.h"
+
+using google::crypto::tink::RegistryConfig;
+
+namespace crypto {
+namespace tink {
+
+// static
+const RegistryConfig& StreamingAeadConfig::Latest() {
+  static const RegistryConfig* config = new RegistryConfig();
+  return *config;
+}
+
+// static
+util::Status StreamingAeadConfig::Register() {
+  // Register key managers.
+  auto status = Registry::RegisterKeyTypeManager(
+      absl::make_unique<AesGcmHkdfStreamingKeyManager>(), true);
+  if (!status.ok()) return status;
+
+  status = Registry::RegisterKeyTypeManager(
+      absl::make_unique<AesCtrHmacStreamingKeyManager>(), true);
+  if (!status.ok()) return status;
+
+  // Register primitive wrapper.
+  return Registry::RegisterPrimitiveWrapper(
+      absl::make_unique<StreamingAeadWrapper>());
+}
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/streamingaead/streaming_aead_config.h b/cc/streamingaead/streaming_aead_config.h
new file mode 100644
index 0000000..179647d
--- /dev/null
+++ b/cc/streamingaead/streaming_aead_config.h
@@ -0,0 +1,57 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_STREAMINGAEAD_STREAMING_AEAD_CONFIG_H_
+#define TINK_STREAMINGAEAD_STREAMING_AEAD_CONFIG_H_
+
+#include "absl/base/macros.h"
+#include "tink/util/status.h"
+#include "proto/config.pb.h"
+
+namespace crypto {
+namespace tink {
+
+///////////////////////////////////////////////////////////////////////////////
+// Static methods and constants for registering with the Registry all instances
+// of StreamingAead key types supported in a particular release of Tink.
+//
+// To register all StreamingAead key types from the current Tink release
+// one can do:
+//
+//   auto status = StreamingAeadConfig::Register();
+//
+class StreamingAeadConfig {
+ public:
+  static constexpr char kCatalogueName[] = "TinkStreamingAead";
+  static constexpr char kPrimitiveName[] = "StreamingAead";
+
+  // Returns config of StreamingAead implementations supported
+  // in the current Tink release.
+  ABSL_DEPRECATED("This is not supported anymore.")
+  static const google::crypto::tink::RegistryConfig& Latest();
+
+  // Registers StreamingAead primitive wrapper and key managers for all
+  // StreamingAead key types from the current Tink release.
+  static crypto::tink::util::Status Register();
+
+ private:
+  StreamingAeadConfig() {}
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_STREAMINGAEAD_STREAMING_AEAD_CONFIG_H_
diff --git a/cc/streamingaead/streaming_aead_config_test.cc b/cc/streamingaead/streaming_aead_config_test.cc
new file mode 100644
index 0000000..c0079b2
--- /dev/null
+++ b/cc/streamingaead/streaming_aead_config_test.cc
@@ -0,0 +1,91 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "tink/streamingaead/streaming_aead_config.h"
+
+#include <sstream>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/memory/memory.h"
+#include "tink/config.h"
+#include "tink/keyset_handle.h"
+#include "tink/registry.h"
+#include "tink/streaming_aead.h"
+#include "tink/streamingaead/aes_ctr_hmac_streaming_key_manager.h"
+#include "tink/streamingaead/aes_gcm_hkdf_streaming_key_manager.h"
+#include "tink/streamingaead/streaming_aead_key_templates.h"
+#include "tink/util/status.h"
+#include "tink/util/test_matchers.h"
+#include "tink/util/test_util.h"
+
+namespace crypto {
+namespace tink {
+namespace {
+
+using ::crypto::tink::test::DummyStreamingAead;
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
+
+class StreamingAeadConfigTest : public ::testing::Test {
+ protected:
+  void SetUp() override { Registry::Reset(); }
+};
+
+TEST_F(StreamingAeadConfigTest, Basic) {
+  EXPECT_THAT(Registry::get_key_manager<StreamingAead>(
+                  AesGcmHkdfStreamingKeyManager().get_key_type())
+                  .status(),
+              StatusIs(util::error::NOT_FOUND));
+  EXPECT_THAT(Registry::get_key_manager<StreamingAead>(
+                  AesCtrHmacStreamingKeyManager().get_key_type())
+                  .status(),
+              StatusIs(util::error::NOT_FOUND));
+  EXPECT_THAT(StreamingAeadConfig::Register(), IsOk());
+  EXPECT_THAT(Registry::get_key_manager<StreamingAead>(
+                  AesGcmHkdfStreamingKeyManager().get_key_type())
+                  .status(),
+              IsOk());
+  EXPECT_THAT(Registry::get_key_manager<StreamingAead>(
+                  AesCtrHmacStreamingKeyManager().get_key_type())
+                  .status(),
+              IsOk());
+}
+
+// Tests that the StreamingAeadWrapper has been properly registered
+// and we can wrap primitives.
+TEST_F(StreamingAeadConfigTest, WrappersRegistered) {
+  ASSERT_TRUE(StreamingAeadConfig::Register().ok());
+
+  google::crypto::tink::Keyset::Key key;
+  key.set_status(google::crypto::tink::KeyStatusType::ENABLED);
+  key.set_key_id(1234);
+  key.set_output_prefix_type(google::crypto::tink::OutputPrefixType::RAW);
+  auto primitive_set = absl::make_unique<PrimitiveSet<StreamingAead>>();
+  ASSERT_THAT(primitive_set->set_primary(
+                  primitive_set
+                      ->AddPrimitive(
+                          absl::make_unique<DummyStreamingAead>("dummy"), key)
+                      .ValueOrDie()),
+              IsOk());
+
+  auto primitive_result = Registry::Wrap(std::move(primitive_set));
+  ASSERT_TRUE(primitive_result.ok()) << primitive_result.status();
+}
+
+}  // namespace
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/streamingaead/streaming_aead_key_templates.cc b/cc/streamingaead/streaming_aead_key_templates.cc
new file mode 100644
index 0000000..4e3d28a
--- /dev/null
+++ b/cc/streamingaead/streaming_aead_key_templates.cc
@@ -0,0 +1,99 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/streamingaead/streaming_aead_key_templates.h"
+
+#include "proto/aes_gcm_hkdf_streaming.pb.h"
+#include "proto/aes_ctr_hmac_streaming.pb.h"
+#include "proto/common.pb.h"
+#include "proto/tink.pb.h"
+
+using google::crypto::tink::AesGcmHkdfStreamingKeyFormat;
+using google::crypto::tink::AesCtrHmacStreamingKeyFormat;
+using google::crypto::tink::HashType;
+using google::crypto::tink::KeyTemplate;
+using google::crypto::tink::OutputPrefixType;
+
+namespace crypto {
+namespace tink {
+
+namespace {
+
+KeyTemplate* NewAesGcmHkdfStreamingKeyTemplate(int ikm_size_in_bytes) {
+  KeyTemplate* key_template = new KeyTemplate;
+  key_template->set_type_url(
+      "type.googleapis.com/google.crypto.tink.AesGcmHkdfStreamingKey");
+  key_template->set_output_prefix_type(OutputPrefixType::RAW);
+  AesGcmHkdfStreamingKeyFormat key_format;
+  key_format.set_key_size(ikm_size_in_bytes);
+  auto params = key_format.mutable_params();
+  params->set_ciphertext_segment_size(4096);
+  params->set_derived_key_size(ikm_size_in_bytes);
+  params->set_hkdf_hash_type(HashType::SHA256);
+  key_format.SerializeToString(key_template->mutable_value());
+  return key_template;
+}
+
+KeyTemplate* NewAesCtrHmacStreamingKeyTemplate(int ikm_size_in_bytes) {
+  KeyTemplate* key_template = new KeyTemplate;
+  key_template->set_type_url(
+      "type.googleapis.com/google.crypto.tink.AesCtrHmacStreamingKey");
+  key_template->set_output_prefix_type(OutputPrefixType::RAW);
+  AesCtrHmacStreamingKeyFormat key_format;
+  key_format.set_key_size(ikm_size_in_bytes);
+  auto params = key_format.mutable_params();
+  params->set_ciphertext_segment_size(4096);
+  params->set_derived_key_size(ikm_size_in_bytes);
+  params->set_hkdf_hash_type(HashType::SHA256);
+  auto hmac_params = params->mutable_hmac_params();
+  hmac_params->set_hash(HashType::SHA256);
+  hmac_params->set_tag_size(32);
+  key_format.SerializeToString(key_template->mutable_value());
+  return key_template;
+}
+
+}  // anonymous namespace
+
+// static
+const KeyTemplate& StreamingAeadKeyTemplates::Aes128GcmHkdf4KB() {
+  static const KeyTemplate* key_template =
+      NewAesGcmHkdfStreamingKeyTemplate(/* ikm_size_in_bytes= */ 16);
+  return *key_template;
+}
+
+// static
+const KeyTemplate& StreamingAeadKeyTemplates::Aes256GcmHkdf4KB() {
+  static const KeyTemplate* key_template =
+      NewAesGcmHkdfStreamingKeyTemplate(/* ikm_size_in_bytes= */ 32);
+  return *key_template;
+}
+
+// static
+const KeyTemplate& StreamingAeadKeyTemplates::Aes128CtrHmacSha256Segment4KB() {
+  static const KeyTemplate* key_template =
+      NewAesCtrHmacStreamingKeyTemplate(/* ikm_size_in_bytes= */ 16);
+  return *key_template;
+}
+
+// static
+const KeyTemplate& StreamingAeadKeyTemplates::Aes256CtrHmacSha256Segment4KB() {
+  static const KeyTemplate* key_template =
+      NewAesCtrHmacStreamingKeyTemplate(/* ikm_size_in_bytes= */ 32);
+  return *key_template;
+}
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/streamingaead/streaming_aead_key_templates.h b/cc/streamingaead/streaming_aead_key_templates.h
new file mode 100644
index 0000000..13245ac
--- /dev/null
+++ b/cc/streamingaead/streaming_aead_key_templates.h
@@ -0,0 +1,84 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_STREAMINGAEAD_STREAMING_AEAD_KEY_TEMPLATES_H_
+#define TINK_STREAMINGAEAD_STREAMING_AEAD_KEY_TEMPLATES_H_
+
+#include "proto/tink.pb.h"
+
+namespace crypto {
+namespace tink {
+
+///////////////////////////////////////////////////////////////////////////////
+// Pre-generated KeyTemplate for StreamingAead key types. One can use these
+// templates to generate new KeysetHandle object with fresh keys.
+// To generate a new keyset that contains a single AesGcmKey, one can do:
+//
+//   auto status = StreamingAeadConfig::Register();
+//   if (!status.ok()) { /* fail with error */ }
+//   auto handle_result = KeysetHandle::GenerateNew(
+//       StreamingAeadKeyTemplates::Aes128GcmHkdf4KB());
+//   if (!handle_result.ok()) { /* fail with error */ }
+//   auto keyset_handle = std::move(handle_result.ValueOrDie());
+class StreamingAeadKeyTemplates {
+ public:
+  // Returns a KeyTemplate that generates new instances of
+  // AesGcmHkdfStreamingKey with the following parameters:
+  //   - main key (ikm) size: 16 bytes
+  //   - HKDF algorithm: HMAC-SHA256
+  //   - size of derived AES-GCM keys: 16 bytes
+  //   - ciphertext segment size: 4096 bytes
+  //   - OutputPrefixType: RAW
+  static const google::crypto::tink::KeyTemplate& Aes128GcmHkdf4KB();
+
+  // Returns a KeyTemplate that generates new instances of
+  // AesGcmHkdfStreamingKey with the following parameters:
+  //   - main key (ikm) size: 32 bytes
+  //   - HKDF algorithm: HMAC-SHA256
+  //   - size of derived AES-GCM keys: 32 bytes
+  //   - ciphertext segment size: 4096 bytes
+  //   - OutputPrefixType: RAW
+  static const google::crypto::tink::KeyTemplate& Aes256GcmHkdf4KB();
+
+  // Returns a KeyTemplate that generates new instances of
+  // AesCtrHmacStreamingKey with the following parameters:
+  //   - main key (ikm) size: 16 bytes
+  //   - HKDF algorithm: HMAC-SHA256
+  //   - size of derived AES-CTR keys: 16 bytes
+  //   - tag algorithm: HMAC-SHA256
+  //   - tag size: 32 bytes
+  //   - ciphertext segment size: 4096 bytes
+  //   - OutputPrefixType: RAW
+  static const google::crypto::tink::KeyTemplate&
+      Aes128CtrHmacSha256Segment4KB();
+
+  // Returns a KeyTemplate that generates new instances of
+  // AesCtrHmacStreamingKey with the following parameters:
+  //   - main key (ikm) size: 32 bytes
+  //   - HKDF algorithm: HMAC-SHA256
+  //   - size of derived AES-CTR keys: 32 bytes
+  //   - tag algorithm: HMAC-SHA256
+  //   - tag size: 32 bytes
+  //   - ciphertext segment size: 4096 bytes
+  //   - OutputPrefixType: RAW
+  static const google::crypto::tink::KeyTemplate&
+      Aes256CtrHmacSha256Segment4KB();
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_STREAMINGAEAD_STREAMING_AEAD_KEY_TEMPLATES_H_
diff --git a/cc/streamingaead/streaming_aead_key_templates_test.cc b/cc/streamingaead/streaming_aead_key_templates_test.cc
new file mode 100644
index 0000000..507a9d4
--- /dev/null
+++ b/cc/streamingaead/streaming_aead_key_templates_test.cc
@@ -0,0 +1,215 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "tink/streamingaead/streaming_aead_key_templates.h"
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "tink/streamingaead/aes_ctr_hmac_streaming_key_manager.h"
+#include "tink/streamingaead/aes_gcm_hkdf_streaming_key_manager.h"
+#include "tink/util/test_matchers.h"
+#include "proto/aes_gcm_hkdf_streaming.pb.h"
+#include "proto/aes_ctr_hmac_streaming.pb.h"
+#include "proto/common.pb.h"
+#include "proto/tink.pb.h"
+
+using google::crypto::tink::AesGcmHkdfStreamingKeyFormat;
+using google::crypto::tink::AesCtrHmacStreamingKeyFormat;
+using google::crypto::tink::HashType;
+using google::crypto::tink::KeyTemplate;
+using google::crypto::tink::OutputPrefixType;
+
+namespace crypto {
+namespace tink {
+namespace {
+
+using ::testing::Eq;
+using ::testing::Ref;
+using ::crypto::tink::test::IsOk;
+
+TEST(Aes128GcmHkdf4KBTest, TypeUrl) {
+  EXPECT_THAT(
+      StreamingAeadKeyTemplates::Aes128GcmHkdf4KB().type_url(),
+      Eq("type.googleapis.com/google.crypto.tink.AesGcmHkdfStreamingKey"));
+  EXPECT_THAT(
+      StreamingAeadKeyTemplates::Aes128GcmHkdf4KB().type_url(),
+      Eq(AesGcmHkdfStreamingKeyManager().get_key_type()));
+}
+
+TEST(Aes128GcmHkdf4KBTest, OutputPrefixType) {
+  EXPECT_THAT(
+      StreamingAeadKeyTemplates::Aes128GcmHkdf4KB().output_prefix_type(),
+      Eq(OutputPrefixType::RAW));
+}
+
+TEST(Aes128GcmHkdf4KBTest, SameReference) {
+  // Check that reference to the same object is returned.
+  EXPECT_THAT(StreamingAeadKeyTemplates::Aes128GcmHkdf4KB(),
+              Ref(StreamingAeadKeyTemplates::Aes128GcmHkdf4KB()));
+}
+
+TEST(Aes128GcmHkdf4KBTest, WorksWithKeyTypeManager) {
+  const KeyTemplate& key_template =
+      StreamingAeadKeyTemplates::Aes128GcmHkdf4KB();
+  AesGcmHkdfStreamingKeyFormat key_format;
+  EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
+  EXPECT_THAT(AesGcmHkdfStreamingKeyManager().ValidateKeyFormat(key_format),
+              IsOk());
+}
+
+TEST(Aes128GcmHkdf4KBTest, CheckValues) {
+  const KeyTemplate& key_template =
+      StreamingAeadKeyTemplates::Aes128GcmHkdf4KB();
+  AesGcmHkdfStreamingKeyFormat key_format;
+  EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
+  EXPECT_THAT(key_format.key_size(), Eq(16));
+  EXPECT_THAT(key_format.params().derived_key_size(), Eq(16));
+  EXPECT_THAT(key_format.params().ciphertext_segment_size(), Eq(4096));
+  EXPECT_THAT(key_format.params().hkdf_hash_type(), Eq(HashType::SHA256));
+}
+
+TEST(Aes256GcmHkdf4KBTest, TypeUrl) {
+  EXPECT_THAT(
+      StreamingAeadKeyTemplates::Aes256GcmHkdf4KB().type_url(),
+      Eq("type.googleapis.com/google.crypto.tink.AesGcmHkdfStreamingKey"));
+  EXPECT_THAT(
+      StreamingAeadKeyTemplates::Aes256GcmHkdf4KB().type_url(),
+      Eq(AesGcmHkdfStreamingKeyManager().get_key_type()));
+}
+
+TEST(Aes256GcmHkdf4KBTest, OutputPrefixType) {
+  EXPECT_THAT(
+      StreamingAeadKeyTemplates::Aes256GcmHkdf4KB().output_prefix_type(),
+      Eq(OutputPrefixType::RAW));
+}
+
+TEST(Aes256GcmHkdf4KBTest, SameReference) {
+  // Check that reference to the same object is returned.
+  EXPECT_THAT(StreamingAeadKeyTemplates::Aes256GcmHkdf4KB(),
+              Ref(StreamingAeadKeyTemplates::Aes256GcmHkdf4KB()));
+}
+
+TEST(Aes256GcmHkdf4KBTest, WorksWithKeyTypeManager) {
+  const KeyTemplate& key_template =
+      StreamingAeadKeyTemplates::Aes256GcmHkdf4KB();
+  AesGcmHkdfStreamingKeyFormat key_format;
+  EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
+  EXPECT_THAT(AesGcmHkdfStreamingKeyManager().ValidateKeyFormat(key_format),
+              IsOk());
+}
+
+TEST(Aes256GcmHkdf4KBTest, CheckValues) {
+  const KeyTemplate& key_template =
+      StreamingAeadKeyTemplates::Aes256GcmHkdf4KB();
+  AesGcmHkdfStreamingKeyFormat key_format;
+  EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
+  EXPECT_THAT(key_format.key_size(), Eq(32));
+  EXPECT_THAT(key_format.params().derived_key_size(), Eq(32));
+  EXPECT_THAT(key_format.params().ciphertext_segment_size(), Eq(4096));
+  EXPECT_THAT(key_format.params().hkdf_hash_type(), Eq(HashType::SHA256));
+}
+
+TEST(Aes128CtrHmacSha256Segment4KBTest, TypeUrl) {
+  EXPECT_THAT(
+      StreamingAeadKeyTemplates::Aes128CtrHmacSha256Segment4KB().type_url(),
+      Eq("type.googleapis.com/google.crypto.tink.AesCtrHmacStreamingKey"));
+  EXPECT_THAT(
+      StreamingAeadKeyTemplates::Aes128CtrHmacSha256Segment4KB().type_url(),
+      Eq(AesCtrHmacStreamingKeyManager().get_key_type()));
+}
+
+TEST(Aes128CtrHmacSha256Segment4KBTest, OutputPrefixType) {
+  EXPECT_THAT(
+      StreamingAeadKeyTemplates::
+      Aes128CtrHmacSha256Segment4KB().output_prefix_type(),
+      Eq(OutputPrefixType::RAW));
+}
+
+TEST(Aes128CtrHmacSha256Segment4KBTest, SameReference) {
+  // Check that reference to the same object is returned.
+  EXPECT_THAT(StreamingAeadKeyTemplates::Aes128CtrHmacSha256Segment4KB(),
+              Ref(StreamingAeadKeyTemplates::Aes128CtrHmacSha256Segment4KB()));
+}
+
+TEST(Aes128CtrHmacSha256Segment4KBTest, WorksWithKeyTypeManager) {
+  const KeyTemplate& key_template =
+      StreamingAeadKeyTemplates::Aes128CtrHmacSha256Segment4KB();
+  AesCtrHmacStreamingKeyFormat key_format;
+  EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
+  EXPECT_THAT(AesCtrHmacStreamingKeyManager().ValidateKeyFormat(key_format),
+              IsOk());
+}
+
+TEST(Aes128CtrHmacSha256Segment4KBTest, CheckValues) {
+  const KeyTemplate& key_template =
+      StreamingAeadKeyTemplates::Aes128CtrHmacSha256Segment4KB();
+  AesCtrHmacStreamingKeyFormat key_format;
+  EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
+  EXPECT_THAT(key_format.key_size(), Eq(16));
+  EXPECT_THAT(key_format.params().ciphertext_segment_size(), Eq(4096));
+  EXPECT_THAT(key_format.params().derived_key_size(), Eq(16));
+  EXPECT_THAT(key_format.params().hkdf_hash_type(), Eq(HashType::SHA256));
+  EXPECT_THAT(key_format.params().hmac_params().hash(), Eq(HashType::SHA256));
+  EXPECT_THAT(key_format.params().hmac_params().tag_size(), Eq(32));
+}
+
+TEST(Aes256CtrHmacSha256Segment4KBTest, TypeUrl) {
+  EXPECT_THAT(
+      StreamingAeadKeyTemplates::Aes256CtrHmacSha256Segment4KB().type_url(),
+      Eq("type.googleapis.com/google.crypto.tink.AesCtrHmacStreamingKey"));
+  EXPECT_THAT(
+      StreamingAeadKeyTemplates::Aes256CtrHmacSha256Segment4KB().type_url(),
+      Eq(AesCtrHmacStreamingKeyManager().get_key_type()));
+}
+
+TEST(Aes256CtrHmacSha256Segment4KBTest, OutputPrefixType) {
+  EXPECT_THAT(
+      StreamingAeadKeyTemplates::
+      Aes256CtrHmacSha256Segment4KB().output_prefix_type(),
+      Eq(OutputPrefixType::RAW));
+}
+
+TEST(Aes256CtrHmacSha256Segment4KBTest, SameReference) {
+  // Check that reference to the same object is returned.
+  EXPECT_THAT(StreamingAeadKeyTemplates::Aes256CtrHmacSha256Segment4KB(),
+              Ref(StreamingAeadKeyTemplates::Aes256CtrHmacSha256Segment4KB()));
+}
+
+TEST(Aes256CtrHmacSha256Segment4KBTest, WorksWithKeyTypeManager) {
+  const KeyTemplate& key_template =
+      StreamingAeadKeyTemplates::Aes256CtrHmacSha256Segment4KB();
+  AesCtrHmacStreamingKeyFormat key_format;
+  EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
+  EXPECT_THAT(AesCtrHmacStreamingKeyManager().ValidateKeyFormat(key_format),
+              IsOk());
+}
+
+TEST(Aes256CtrHmacSha256Segment4KBTest, CheckValues) {
+  const KeyTemplate& key_template =
+      StreamingAeadKeyTemplates::Aes256CtrHmacSha256Segment4KB();
+  AesCtrHmacStreamingKeyFormat key_format;
+  EXPECT_TRUE(key_format.ParseFromString(key_template.value()));
+  EXPECT_THAT(key_format.key_size(), Eq(32));
+  EXPECT_THAT(key_format.params().ciphertext_segment_size(), Eq(4096));
+  EXPECT_THAT(key_format.params().derived_key_size(), Eq(32));
+  EXPECT_THAT(key_format.params().hkdf_hash_type(), Eq(HashType::SHA256));
+  EXPECT_THAT(key_format.params().hmac_params().hash(), Eq(HashType::SHA256));
+  EXPECT_THAT(key_format.params().hmac_params().tag_size(), Eq(32));
+}
+
+}  // namespace
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/streamingaead/streaming_aead_wrapper.cc b/cc/streamingaead/streaming_aead_wrapper.cc
index 11a524c..97379ad 100644
--- a/cc/streamingaead/streaming_aead_wrapper.cc
+++ b/cc/streamingaead/streaming_aead_wrapper.cc
@@ -21,6 +21,9 @@
 #include "tink/input_stream.h"
 #include "tink/output_stream.h"
 #include "tink/primitive_set.h"
+#include "tink/random_access_stream.h"
+#include "tink/streamingaead/decrypting_input_stream.h"
+#include "tink/streamingaead/decrypting_random_access_stream.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
 
@@ -38,8 +41,14 @@
   }
   if (primitives->get_primary() == nullptr) {
     return Status(util::error::INVALID_ARGUMENT,
-                        "primitive set has no primary");
+                  "primitive set has no primary");
   }
+  auto raw_primitives_result = primitives->get_raw_primitives();
+  if (!raw_primitives_result.ok()) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "primitive set has no raw primitives");
+  }
+  // TODO(b/129044084)
   return Status::OK;
 }
 
@@ -59,10 +68,21 @@
       std::unique_ptr<crypto::tink::InputStream> ciphertext_source,
       absl::string_view associated_data) override;
 
+  crypto::tink::util::StatusOr<
+      std::unique_ptr<crypto::tink::RandomAccessStream>>
+  NewDecryptingRandomAccessStream(
+      std::unique_ptr<crypto::tink::RandomAccessStream> ciphertext_source,
+      absl::string_view associated_data) override;
+
   ~StreamingAeadSetWrapper() override {}
 
  private:
-  std::unique_ptr<PrimitiveSet<StreamingAead>> primitives_;
+  // We use a shared_ptr here to ensure that primitives_ stays alive
+  // as long as it might be needed by some decrypting stream returned
+  // by NewDecryptingStream.  This can happen after this wrapper
+  // is destroyed, as we refer to primitives_ only when the user attempts
+  // to read some data from the decrypting stream.
+  std::shared_ptr<PrimitiveSet<StreamingAead>> primitives_;
 };  // class StreamingAeadSetWrapper
 
 StatusOr<std::unique_ptr<OutputStream>>
@@ -77,7 +97,16 @@
 StreamingAeadSetWrapper::NewDecryptingStream(
     std::unique_ptr<InputStream> ciphertext_source,
     absl::string_view associated_data) {
-  return Status(util::error::UNIMPLEMENTED, "Not implemented yet");
+  return {streamingaead::DecryptingInputStream::New(
+      primitives_, std::move(ciphertext_source), associated_data)};
+}
+
+StatusOr<std::unique_ptr<RandomAccessStream>>
+StreamingAeadSetWrapper::NewDecryptingRandomAccessStream(
+    std::unique_ptr<RandomAccessStream> ciphertext_source,
+    absl::string_view associated_data) {
+  return {streamingaead::DecryptingRandomAccessStream::New(
+      primitives_, std::move(ciphertext_source), associated_data)};
 }
 
 }  // anonymous namespace
diff --git a/cc/streamingaead/streaming_aead_wrapper.h b/cc/streamingaead/streaming_aead_wrapper.h
index ac03648..c6e7675 100644
--- a/cc/streamingaead/streaming_aead_wrapper.h
+++ b/cc/streamingaead/streaming_aead_wrapper.h
@@ -36,7 +36,7 @@
 //     the ciphertext prefix.
 class StreamingAeadWrapper : public PrimitiveWrapper<StreamingAead> {
  public:
-  // Returns an StreamingAead-primitive that uses StreamingAead-instances
+  // Returns a StreamingAead-primitive that uses StreamingAead-instances
   // provided in 'streaming_aead_set', which must be non-NULL and must contain
   // a primary instance.
   util::StatusOr<std::unique_ptr<StreamingAead>> Wrap(
diff --git a/cc/streamingaead/streaming_aead_wrapper_test.cc b/cc/streamingaead/streaming_aead_wrapper_test.cc
index ec4591b..43d0465 100644
--- a/cc/streamingaead/streaming_aead_wrapper_test.cc
+++ b/cc/streamingaead/streaming_aead_wrapper_test.cc
@@ -19,21 +19,100 @@
 #include <sstream>
 
 #include "gtest/gtest.h"
+#include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
 #include "tink/primitive_set.h"
+#include "tink/random_access_stream.h"
 #include "tink/streaming_aead.h"
+#include "tink/subtle/random.h"
+#include "tink/subtle/test_util.h"
+#include "tink/util/buffer.h"
+#include "tink/util/file_random_access_stream.h"
 #include "tink/util/istream_input_stream.h"
 #include "tink/util/ostream_output_stream.h"
 #include "tink/util/status.h"
+#include "tink/util/test_matchers.h"
 #include "tink/util/test_util.h"
 
-using crypto::tink::test::DummyStreamingAead;
-using google::crypto::tink::Keyset;
-using google::crypto::tink::OutputPrefixType;
-
 namespace crypto {
 namespace tink {
 namespace {
 
+using crypto::tink::test::IsOk;
+using crypto::tink::test::StatusIs;
+using crypto::tink::test::DummyStreamingAead;
+using google::crypto::tink::Keyset;
+using google::crypto::tink::KeyStatusType;
+using google::crypto::tink::OutputPrefixType;
+using subtle::test::ReadFromStream;
+using subtle::test::WriteToStream;
+using testing::HasSubstr;
+
+// Creates a RandomAccessStream with the specified contents.
+std::unique_ptr<RandomAccessStream> GetRandomAccessStream(
+    absl::string_view contents) {
+  static int index = 1;
+  std::string filename = absl::StrCat("stream_data_file_", index, ".txt");
+  index++;
+  int input_fd = test::GetTestFileDescriptor(filename, contents);
+  return {absl::make_unique<util::FileRandomAccessStream>(input_fd)};
+}
+
+// Reads the entire 'ra_stream', until no more bytes can be read,
+// and puts the read bytes into 'contents'.
+// Returns the status of the last ra_stream->PRead()-operation.
+util::Status ReadAll(RandomAccessStream* ra_stream, std::string* contents) {
+  int chunk_size = 42;
+  contents->clear();
+  auto buffer = std::move(util::Buffer::New(chunk_size).ValueOrDie());
+  int64_t position = 0;
+  auto status = ra_stream->PRead(position, chunk_size, buffer.get());
+  while (status.ok()) {
+    contents->append(buffer->get_mem_block(), buffer->size());
+    position = contents->size();
+    status = ra_stream->PRead(position, chunk_size, buffer.get());
+  }
+  if (status.error_code() == util::error::OUT_OF_RANGE) {  // EOF
+    EXPECT_EQ(0, buffer->size());
+  }
+  return status;
+}
+
+// A container for specification of instances of DummyStreamingAead
+// to be created for testing.
+struct StreamingAeadSpec {
+  uint32_t key_id;
+  std::string saead_name;
+  OutputPrefixType output_prefix_type;
+};
+
+// Generates a PrimitiveSet<StreamingAead> with DummyStreamingAead
+// instances according to the specification in 'spec'.
+// The last entry in 'spec' will be the primary primitive in the returned set.
+std::unique_ptr<PrimitiveSet<StreamingAead>> GetTestStreamingAeadSet(
+    const std::vector<StreamingAeadSpec>& spec) {
+  Keyset::Key* key;
+  Keyset keyset;
+  auto saead_set = absl::make_unique<PrimitiveSet<StreamingAead>>();
+  int i = 0;
+  for (auto& s : spec) {
+    key = keyset.add_key();
+    key->set_output_prefix_type(s.output_prefix_type);
+    key->set_key_id(s.key_id);
+    key->set_status(KeyStatusType::ENABLED);
+    std::unique_ptr<StreamingAead> saead =
+        absl::make_unique<DummyStreamingAead>(s.saead_name);
+    auto entry_result = saead_set->AddPrimitive(std::move(saead), *key);
+    EXPECT_TRUE(entry_result.ok());
+    if (i + 1 == spec.size()) {
+      EXPECT_THAT(saead_set->set_primary(entry_result.ValueOrDie()), IsOk());
+    }
+    i++;
+  }
+  return saead_set;
+}
+
 TEST(StreamingAeadSetWrapperTest, WrapNullptr) {
   StreamingAeadWrapper wrapper;
   auto result = wrapper.Wrap(nullptr);
@@ -52,80 +131,192 @@
                       result.status().error_message());
 }
 
-TEST(StreamingAeadSetWrapperTest, Basic) {
-  Keyset::Key* key;
-  Keyset keyset;
-
+TEST(StreamingAeadSetWrapperTest, BasicEncryptionAndDecryption) {
   uint32_t key_id_0 = 1234543;
-  key = keyset.add_key();
-  key->set_output_prefix_type(OutputPrefixType::TINK);
-  key->set_key_id(key_id_0);
-
   uint32_t key_id_1 = 726329;
-  key = keyset.add_key();
-  key->set_output_prefix_type(OutputPrefixType::LEGACY);
-  key->set_key_id(key_id_1);
-
   uint32_t key_id_2 = 7213743;
-  key = keyset.add_key();
-  key->set_output_prefix_type(OutputPrefixType::TINK);
-  key->set_key_id(key_id_2);
-
   std::string saead_name_0 = "streaming_aead0";
   std::string saead_name_1 = "streaming_aead1";
   std::string saead_name_2 = "streaming_aead2";
-  std::unique_ptr<PrimitiveSet<StreamingAead>> saead_set(
-      new PrimitiveSet<StreamingAead>());
 
-  std::unique_ptr<StreamingAead> saead =
-      absl::make_unique<DummyStreamingAead>(saead_name_0);
-  auto entry_result = saead_set->AddPrimitive(std::move(saead), keyset.key(0));
-  ASSERT_TRUE(entry_result.ok());
+  auto saead_set = GetTestStreamingAeadSet(
+      {{key_id_0, saead_name_0, OutputPrefixType::RAW},
+       {key_id_1, saead_name_1, OutputPrefixType::RAW},
+       {key_id_2, saead_name_2, OutputPrefixType::RAW}});
 
-  saead = absl::make_unique<DummyStreamingAead>(saead_name_1);
-  entry_result = saead_set->AddPrimitive(std::move(saead), keyset.key(1));
-  ASSERT_TRUE(entry_result.ok());
-
-  saead = absl::make_unique<DummyStreamingAead>(saead_name_2);
-  entry_result = saead_set->AddPrimitive(std::move(saead), keyset.key(2));
-  ASSERT_TRUE(entry_result.ok());
-  // The last key is the primary.
-  saead_set->set_primary(entry_result.ValueOrDie());
-
-  // Wrap aead_set and test the resulting StreamingAead.
+  // Wrap saead_set and test the resulting StreamingAead.
   StreamingAeadWrapper wrapper;
   auto wrap_result = wrapper.Wrap(std::move(saead_set));
   EXPECT_TRUE(wrap_result.ok()) << wrap_result.status();
-  saead = std::move(wrap_result.ValueOrDie());
-  std::string plaintext = "some_plaintext";
+  auto saead = std::move(wrap_result.ValueOrDie());
+  for (int pt_size : {0, 1, 10, 100, 10000}) {
+    std::string plaintext = subtle::Random::GetRandomBytes(pt_size);
+    for (std::string aad : {"some_aad", "", "some other aad"}) {
+      SCOPED_TRACE(absl::StrCat("pt_size = ", pt_size,
+                                ", aad = '", aad, "'"));
+
+      // Prepare ciphertext destination stream.
+      auto ct_stream = absl::make_unique<std::stringstream>();
+      // A reference to the ciphertext buffer, for later validation.
+      auto ct_buf = ct_stream->rdbuf();
+      std::unique_ptr<OutputStream> ct_destination(
+          absl::make_unique<util::OstreamOutputStream>(std::move(ct_stream)));
+      // Encrypt the plaintext.
+      auto enc_stream_result =
+          saead->NewEncryptingStream(std::move(ct_destination), aad);
+      EXPECT_THAT(enc_stream_result.status(), IsOk());
+      auto enc_stream = std::move(enc_stream_result.ValueOrDie());
+      auto status = WriteToStream(enc_stream.get(), plaintext);
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ(absl::StrCat(saead_name_2, aad, plaintext), ct_buf->str());
+      // Prepare ciphertext source stream.
+      auto ct_source_stream =
+          absl::make_unique<std::stringstream>(ct_buf->str());
+      std::unique_ptr<InputStream> ct_source(
+          absl::make_unique<util::IstreamInputStream>(
+              std::move(ct_source_stream)));
+      // Decrypt the ciphertext.
+      auto dec_stream_result =
+          saead->NewDecryptingStream(std::move(ct_source), aad);
+      EXPECT_THAT(dec_stream_result.status(), IsOk());
+      std::string decrypted;
+      status = ReadFromStream(dec_stream_result.ValueOrDie().get(), &decrypted);
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ(plaintext, decrypted);
+    }
+  }
+}
+
+TEST(StreamingAeadSetWrapperTest, DecryptionWithRandomAccessStream) {
+  uint32_t key_id_0 = 1234543;
+  uint32_t key_id_1 = 726329;
+  uint32_t key_id_2 = 7213743;
+  std::string saead_name_0 = "streaming_aead0";
+  std::string saead_name_1 = "streaming_aead1";
+  std::string saead_name_2 = "streaming_aead2";
+
+  auto saead_set = GetTestStreamingAeadSet(
+      {{key_id_0, saead_name_0, OutputPrefixType::RAW},
+       {key_id_1, saead_name_1, OutputPrefixType::RAW},
+       {key_id_2, saead_name_2, OutputPrefixType::RAW}});
+
+  // Wrap saead_set and test the resulting StreamingAead.
+  StreamingAeadWrapper wrapper;
+  auto wrap_result = wrapper.Wrap(std::move(saead_set));
+  EXPECT_TRUE(wrap_result.ok()) << wrap_result.status();
+  auto saead = std::move(wrap_result.ValueOrDie());
+  for (int pt_size : {0, 1, 10, 100, 10000}) {
+    std::string plaintext = subtle::Random::GetRandomBytes(pt_size);
+    for (std::string aad : {"some_aad", "", "some other aad"}) {
+      SCOPED_TRACE(absl::StrCat("pt_size = ", pt_size,
+                                ", aad = '", aad, "'"));
+
+      // Prepare ciphertext destination stream.
+      auto ct_stream = absl::make_unique<std::stringstream>();
+      // A reference to the ciphertext buffer, for later validation.
+      auto ct_buf = ct_stream->rdbuf();
+      std::unique_ptr<OutputStream> ct_destination(
+          absl::make_unique<util::OstreamOutputStream>(std::move(ct_stream)));
+
+      // Encrypt the plaintext.
+      auto enc_stream_result =
+          saead->NewEncryptingStream(std::move(ct_destination), aad);
+      EXPECT_THAT(enc_stream_result.status(), IsOk());
+      auto enc_stream = std::move(enc_stream_result.ValueOrDie());
+      auto status = WriteToStream(enc_stream.get(), plaintext);
+      EXPECT_THAT(status, IsOk());
+      EXPECT_EQ(absl::StrCat(saead_name_2, aad, plaintext), ct_buf->str());
+
+      // Decrypt the ciphertext.
+      auto ct_source = GetRandomAccessStream(ct_buf->str());
+      auto dec_stream_result =
+          saead->NewDecryptingRandomAccessStream(std::move(ct_source), aad);
+      EXPECT_THAT(dec_stream_result.status(), IsOk());
+      std::string decrypted;
+      status = ReadAll(dec_stream_result.ValueOrDie().get(), &decrypted);
+      EXPECT_THAT(status, StatusIs(util::error::OUT_OF_RANGE,
+                                   HasSubstr("EOF")));
+      EXPECT_EQ(plaintext, decrypted);
+    }
+  }
+}
+
+TEST(StreamingAeadSetWrapperTest, DecryptionAfterWrapperIsDestroyed) {
+  uint32_t key_id_0 = 1234543;
+  uint32_t key_id_1 = 726329;
+  uint32_t key_id_2 = 7213743;
+  std::string saead_name_0 = "streaming_aead0";
+  std::string saead_name_1 = "streaming_aead1";
+  std::string saead_name_2 = "streaming_aead2";
+
+  auto saead_set = GetTestStreamingAeadSet(
+      {{key_id_0, saead_name_0, OutputPrefixType::RAW},
+       {key_id_1, saead_name_1, OutputPrefixType::RAW},
+       {key_id_2, saead_name_2, OutputPrefixType::RAW}});
+
+  int pt_size = 100;
+  std::string plaintext = subtle::Random::GetRandomBytes(pt_size);
   std::string aad = "some_aad";
+  std::unique_ptr<InputStream> dec_stream;
+  {
+    // Wrap saead_set and test the resulting StreamingAead.
+    StreamingAeadWrapper wrapper;
+    auto wrap_result = wrapper.Wrap(std::move(saead_set));
+    EXPECT_TRUE(wrap_result.ok()) << wrap_result.status();
+    auto saead = std::move(wrap_result.ValueOrDie());
 
-  // Prepare ciphertext destination stream.
-  auto ct_stream = absl::make_unique<std::stringstream>();
-  // A reference to the ciphertext buffer, for later validation.
-  auto ct_buf = ct_stream->rdbuf();
-  std::unique_ptr<OutputStream> ct_destination(
-      absl::make_unique<util::OstreamOutputStream>(std::move(ct_stream)));
+    // Prepare ciphertext destination stream.
+    auto ct_stream = absl::make_unique<std::stringstream>();
+    // A reference to the ciphertext buffer, for later validation.
+    auto ct_buf = ct_stream->rdbuf();
+    std::unique_ptr<OutputStream> ct_destination(
+        absl::make_unique<util::OstreamOutputStream>(std::move(ct_stream)));
+    // Encrypt the plaintext.
+    auto enc_stream_result =
+        saead->NewEncryptingStream(std::move(ct_destination), aad);
+    EXPECT_THAT(enc_stream_result.status(), IsOk());
+    auto enc_stream = std::move(enc_stream_result.ValueOrDie());
+    auto status = WriteToStream(enc_stream.get(), plaintext);
+    EXPECT_THAT(status, IsOk());
+    EXPECT_EQ(absl::StrCat(saead_name_2, aad, plaintext), ct_buf->str());
+    // Prepare ciphertext source stream.
+    auto ct_source_stream =
+        absl::make_unique<std::stringstream>(ct_buf->str());
+    std::unique_ptr<InputStream> ct_source(
+        absl::make_unique<util::IstreamInputStream>(
+            std::move(ct_source_stream)));
+    // Decrypt the ciphertext.
+    auto dec_stream_result =
+        saead->NewDecryptingStream(std::move(ct_source), aad);
+    EXPECT_THAT(dec_stream_result.status(), IsOk());
+    dec_stream = std::move(dec_stream_result.ValueOrDie());
+  }
+  // Now wrapper and saead are out of scope,
+  // but decrypting stream should still work.
+  std::string decrypted;
+  auto status = ReadFromStream(dec_stream.get(), &decrypted);
+  EXPECT_THAT(status, IsOk());
+  EXPECT_EQ(plaintext, decrypted);
+}
 
-  auto encrypt_result =
-      saead->NewEncryptingStream(std::move(ct_destination), aad);
-  EXPECT_TRUE(encrypt_result.ok()) << encrypt_result.status();
-  auto encrypting_stream = std::move(encrypt_result.ValueOrDie());
-  auto status = encrypting_stream->Close();
-  EXPECT_TRUE(status.ok()) << status;
-  EXPECT_EQ(absl::StrCat(saead_name_2, aad), ct_buf->str());
+TEST(StreamingAeadSetWrapperTest, MissingRawPrimitives) {
+  uint32_t key_id_0 = 1234543;
+  uint32_t key_id_1 = 726329;
+  uint32_t key_id_2 = 7213743;
+  std::string saead_name_0 = "streaming_aead0";
+  std::string saead_name_1 = "streaming_aead1";
+  std::string saead_name_2 = "streaming_aead2";
 
-  // Prepare ciphertext source stream.
-  ct_stream = absl::make_unique<std::stringstream>();
-  // A reference to the ciphertext buffer, for later validation.
-  ct_buf = ct_stream->rdbuf();
-  std::unique_ptr<InputStream> ct_source(
-      absl::make_unique<util::IstreamInputStream>(std::move(ct_stream)));
-  auto decrypt_result = saead->NewDecryptingStream(std::move(ct_source), aad);
-  EXPECT_FALSE(decrypt_result.ok());
-  EXPECT_EQ(util::error::UNIMPLEMENTED, decrypt_result.status().error_code());
-  EXPECT_PRED_FORMAT2(testing::IsSubstring, "Not implemented yet",
-                      decrypt_result.status().error_message());
+  auto saead_set = GetTestStreamingAeadSet(
+      {{key_id_0, saead_name_0, OutputPrefixType::TINK},
+       {key_id_1, saead_name_1, OutputPrefixType::LEGACY},
+       {key_id_2, saead_name_2, OutputPrefixType::TINK}});
+
+  // Wrap saead_set and test the resulting StreamingAead.
+  StreamingAeadWrapper wrapper;
+  auto wrap_result = wrapper.Wrap(std::move(saead_set));
+  EXPECT_THAT(wrap_result.status(), StatusIs(util::error::INVALID_ARGUMENT,
+                                             HasSubstr("no raw primitives")));
 }
 
 }  // namespace
diff --git a/cc/subtle/BUILD.bazel b/cc/subtle/BUILD.bazel
index ab909ab..d60ae9b 100644
--- a/cc/subtle/BUILD.bazel
+++ b/cc/subtle/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 PUBLIC_APIS = [
     "common_enums.h",
@@ -155,6 +155,24 @@
 )
 
 cc_library(
+    name = "aes_cmac_boringssl",
+    srcs = ["aes_cmac_boringssl.cc"],
+    hdrs = ["aes_cmac_boringssl.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":common_enums",
+        ":subtle_util_boringssl",
+        "//cc:mac",
+        "//cc/util:errors",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@boringssl//:crypto",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
+cc_library(
     name = "hmac_boringssl",
     srcs = ["hmac_boringssl.cc"],
     hdrs = ["hmac_boringssl.h"],
@@ -288,6 +306,7 @@
     strip_include_prefix = "/cc",
     deps = [
         ":random",
+        ":subtle_util",
         ":subtle_util_boringssl",
         "//cc:aead",
         "//cc/util:errors",
@@ -299,6 +318,97 @@
 )
 
 cc_library(
+    name = "aes_gcm_hkdf_stream_segment_decrypter",
+    srcs = ["aes_gcm_hkdf_stream_segment_decrypter.cc"],
+    hdrs = ["aes_gcm_hkdf_stream_segment_decrypter.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":aes_gcm_hkdf_stream_segment_encrypter",
+        ":common_enums",
+        ":hkdf",
+        ":random",
+        ":stream_segment_decrypter",
+        ":subtle_util_boringssl",
+        "//cc/util:errors",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@boringssl//:crypto",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
+cc_library(
+    name = "aes_gcm_hkdf_stream_segment_encrypter",
+    srcs = ["aes_gcm_hkdf_stream_segment_encrypter.cc"],
+    hdrs = ["aes_gcm_hkdf_stream_segment_encrypter.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":random",
+        ":stream_segment_encrypter",
+        ":subtle_util_boringssl",
+        "//cc/util:errors",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@boringssl//:crypto",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
+cc_library(
+    name = "aes_gcm_hkdf_streaming",
+    srcs = ["aes_gcm_hkdf_streaming.cc"],
+    hdrs = ["aes_gcm_hkdf_streaming.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":aes_gcm_hkdf_stream_segment_decrypter",
+        ":aes_gcm_hkdf_stream_segment_encrypter",
+        ":common_enums",
+        ":hkdf",
+        ":nonce_based_streaming_aead",
+        ":random",
+        ":stream_segment_decrypter",
+        ":stream_segment_encrypter",
+        ":subtle_util_boringssl",
+        "//cc:input_stream",
+        "//cc:output_stream",
+        "//cc/util:errors",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@boringssl//:crypto",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
+cc_library(
+    name = "aes_ctr_hmac_streaming",
+    srcs = ["aes_ctr_hmac_streaming.cc"],
+    hdrs = ["aes_ctr_hmac_streaming.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":common_enums",
+        ":hkdf",
+        ":hmac_boringssl",
+        ":nonce_based_streaming_aead",
+        ":random",
+        ":stream_segment_decrypter",
+        ":stream_segment_encrypter",
+        ":subtle_util",
+        ":subtle_util_boringssl",
+        "//cc:mac",
+        "//cc/util:errors",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@boringssl//:crypto",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
+cc_library(
     name = "aes_eax_boringssl",
     srcs = ["aes_eax_boringssl.cc"],
     hdrs = ["aes_eax_boringssl.h"],
@@ -344,6 +454,7 @@
     deps = [
         ":ind_cpa_cipher",
         ":random",
+        ":subtle_util",
         ":subtle_util_boringssl",
         "//cc/util:errors",
         "//cc/util:status",
@@ -405,15 +516,13 @@
 
 cc_library(
     name = "aes_gcm_siv_boringssl",
-    srcs = [
-        "aes_gcm_siv_boringssl.cc",
-    ],
+    srcs = ["aes_gcm_siv_boringssl.cc"],
     hdrs = ["aes_gcm_siv_boringssl.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
     deps = [
         ":random",
-        ":subtle_util_boringssl",
+        ":subtle_util",
         "//cc:aead",
         "//cc/util:errors",
         "//cc/util:status",
@@ -429,6 +538,15 @@
     hdrs = ["common_enums.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
+    deps = ["@com_google_absl//absl/strings"],
+)
+
+cc_library(
+    name = "subtle_util",
+    srcs = ["subtle_util.cc"],
+    hdrs = ["subtle_util.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
 )
 
 cc_library(
@@ -443,6 +561,7 @@
         "//cc/util:status",
         "//cc/util:statusor",
         "@boringssl//:crypto",
+        "@com_google_absl//absl/memory",
         "@com_google_absl//absl/strings",
     ],
 )
@@ -463,6 +582,16 @@
 )
 
 cc_library(
+    name = "stream_segment_decrypter",
+    hdrs = ["stream_segment_decrypter.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        "//cc/util:status",
+    ],
+)
+
+cc_library(
     name = "stream_segment_encrypter",
     hdrs = ["stream_segment_encrypter.h"],
     include_prefix = "tink",
@@ -473,6 +602,21 @@
 )
 
 cc_library(
+    name = "streaming_aead_decrypting_stream",
+    srcs = ["streaming_aead_decrypting_stream.cc"],
+    hdrs = ["streaming_aead_decrypting_stream.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":stream_segment_decrypter",
+        "//cc:input_stream",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@com_google_absl//absl/memory",
+    ],
+)
+
+cc_library(
     name = "streaming_aead_encrypting_stream",
     srcs = ["streaming_aead_encrypting_stream.cc"],
     hdrs = ["streaming_aead_encrypting_stream.h"],
@@ -493,16 +637,109 @@
     include_prefix = "tink",
     strip_include_prefix = "/cc",
     deps = [
+        ":decrypting_random_access_stream",
+        ":stream_segment_decrypter",
         ":stream_segment_encrypter",
+        ":streaming_aead_decrypting_stream",
         ":streaming_aead_encrypting_stream",
         "//cc:input_stream",
         "//cc:output_stream",
+        "//cc:random_access_stream",
         "//cc:streaming_aead",
         "//cc/util:statusor",
         "@com_google_absl//absl/strings",
     ],
 )
 
+cc_library(
+    name = "test_util",
+    testonly = 1,
+    srcs = ["test_util.cc"],
+    hdrs = ["test_util.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":nonce_based_streaming_aead",
+        ":stream_segment_decrypter",
+        ":stream_segment_encrypter",
+        "//cc:input_stream",
+        "//cc:output_stream",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
+cc_library(
+    name = "aead_test_util",
+    testonly = 1,
+    srcs = ["aead_test_util.cc"],
+    hdrs = ["aead_test_util.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":test_util",
+        "//cc:aead",
+        "//cc/util:status",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
+cc_library(
+    name = "streaming_aead_test_util",
+    testonly = 1,
+    srcs = ["streaming_aead_test_util.cc"],
+    hdrs = ["streaming_aead_test_util.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":test_util",
+        "//cc:random_access_stream",
+        "//cc:streaming_aead",
+        "//cc/util:buffer",
+        "//cc/util:file_random_access_stream",
+        "//cc/util:istream_input_stream",
+        "//cc/util:ostream_output_stream",
+        "//cc/util:status",
+        "//cc/util:test_util",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
+cc_library(
+    name = "hybrid_test_util",
+    testonly = 1,
+    srcs = ["hybrid_test_util.cc"],
+    hdrs = ["hybrid_test_util.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        "//cc:hybrid_decrypt",
+        "//cc:hybrid_encrypt",
+        "//cc/util:status",
+    ],
+)
+
+cc_library(
+    name = "decrypting_random_access_stream",
+    srcs = ["decrypting_random_access_stream.cc"],
+    hdrs = ["decrypting_random_access_stream.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":stream_segment_decrypter",
+        "//cc:random_access_stream",
+        "//cc/util:buffer",
+        "//cc/util:errors",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@com_google_absl//absl/base:core_headers",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/synchronization",
+    ],
+)
+
 # tests
 
 cc_test(
@@ -567,6 +804,22 @@
 )
 
 cc_test(
+    name = "aes_cmac_boringssl_test",
+    size = "small",
+    srcs = ["aes_cmac_boringssl_test.cc"],
+    copts = ["-Iexternal/gtest/include"],
+    deps = [
+        ":aes_cmac_boringssl",
+        ":common_enums",
+        "//cc:mac",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_util",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
     name = "hmac_boringssl_test",
     size = "small",
     srcs = ["hmac_boringssl_test.cc"],
@@ -604,6 +857,87 @@
 )
 
 cc_test(
+    name = "aes_gcm_hkdf_stream_segment_decrypter_test",
+    size = "small",
+    srcs = ["aes_gcm_hkdf_stream_segment_decrypter_test.cc"],
+    deps = [
+        ":aes_gcm_hkdf_stream_segment_decrypter",
+        ":aes_gcm_hkdf_stream_segment_encrypter",
+        ":common_enums",
+        ":hkdf",
+        ":random",
+        ":stream_segment_decrypter",
+        ":stream_segment_encrypter",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_util",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "aes_gcm_hkdf_stream_segment_encrypter_test",
+    size = "small",
+    srcs = ["aes_gcm_hkdf_stream_segment_encrypter_test.cc"],
+    deps = [
+        ":aes_gcm_hkdf_stream_segment_encrypter",
+        ":random",
+        ":stream_segment_encrypter",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_util",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "aes_gcm_hkdf_streaming_test",
+    size = "small",
+    srcs = ["aes_gcm_hkdf_streaming_test.cc"],
+    deps = [
+        ":aes_gcm_hkdf_streaming",
+        ":common_enums",
+        ":random",
+        ":streaming_aead_test_util",
+        ":test_util",
+        "//cc:output_stream",
+        "//cc/util:istream_input_stream",
+        "//cc/util:ostream_output_stream",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_matchers",
+        "//cc/util:test_util",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "aes_ctr_hmac_streaming_test",
+    size = "small",
+    srcs = ["aes_ctr_hmac_streaming_test.cc"],
+    deps = [
+        ":aes_ctr_hmac_streaming",
+        ":common_enums",
+        ":random",
+        ":stream_segment_decrypter",
+        ":stream_segment_encrypter",
+        ":streaming_aead_test_util",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//cc/util:test_matchers",
+        "//cc/util:test_util",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
     name = "aes_eax_boringssl_test",
     size = "small",
     srcs = ["aes_eax_boringssl_test.cc"],
@@ -894,6 +1228,16 @@
 )
 
 cc_test(
+    name = "subtle_util_test",
+    size = "small",
+    srcs = ["subtle_util_test.cc"],
+    deps = [
+        ":subtle_util",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
     name = "subtle_util_boringssl_test",
     size = "small",
     srcs = ["subtle_util_boringssl_test.cc"],
@@ -935,6 +1279,27 @@
 )
 
 cc_test(
+    name = "streaming_aead_decrypting_stream_test",
+    size = "medium",
+    srcs = ["streaming_aead_decrypting_stream_test.cc"],
+    copts = ["-Iexternal/gtest/include"],
+    linkopts = ["-lpthread"],
+    deps = [
+        ":random",
+        ":stream_segment_decrypter",
+        ":streaming_aead_decrypting_stream",
+        ":test_util",
+        "//cc:input_stream",
+        "//cc/util:istream_input_stream",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
     name = "streaming_aead_encrypting_stream_test",
     size = "medium",
     srcs = ["streaming_aead_encrypting_stream_test.cc"],
@@ -944,6 +1309,7 @@
         ":random",
         ":stream_segment_encrypter",
         ":streaming_aead_encrypting_stream",
+        ":test_util",
         "//cc:output_stream",
         "//cc/util:ostream_output_stream",
         "//cc/util:status",
@@ -953,3 +1319,57 @@
         "@com_google_googletest//:gtest_main",
     ],
 )
+
+cc_test(
+    name = "aead_test_util_test",
+    srcs = ["aead_test_util_test.cc"],
+    deps = [
+        ":aead_test_util",
+        "//cc/util:test_matchers",
+        "//cc/util:test_util",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "streaming_aead_test_util_test",
+    srcs = ["streaming_aead_test_util_test.cc"],
+    deps = [
+        ":streaming_aead_test_util",
+        "//cc/util:test_matchers",
+        "//cc/util:test_util",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "hybrid_test_util_test",
+    srcs = ["hybrid_test_util_test.cc"],
+    deps = [
+        ":hybrid_test_util",
+        "//cc/util:test_matchers",
+        "//cc/util:test_util",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "decrypting_random_access_stream_test",
+    srcs = ["decrypting_random_access_stream_test.cc"],
+    deps = [
+        ":decrypting_random_access_stream",
+        "//cc:output_stream",
+        "//cc:random_access_stream",
+        "//cc:streaming_aead",
+        "//cc/subtle:random",
+        "//cc/subtle:test_util",
+        "//cc/util:file_random_access_stream",
+        "//cc/util:ostream_output_stream",
+        "//cc/util:status",
+        "//cc/util:test_matchers",
+        "//cc/util:test_util",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
diff --git a/cc/subtle/BUILD.gn b/cc/subtle/BUILD.gn
index 1ef5678..d78cefd 100644
--- a/cc/subtle/BUILD.gn
+++ b/cc/subtle/BUILD.gn
@@ -92,6 +92,26 @@
   public_configs = [ "//third_party/tink:tink_config" ]
 }
 
+# CC Library : aes_cmac_boringssl
+source_set("aes_cmac_boringssl") {
+  configs -= [ "//build/config:no_rtti" ]
+  sources = [
+    "aes_cmac_boringssl.cc",
+    "aes_cmac_boringssl.h",
+  ]
+  public_deps = [
+    ":common_enums",
+    ":subtle_util_boringssl",
+    "//third_party/tink/cc:mac",
+    "//third_party/tink/cc/util:errors",
+    "//third_party/tink/cc/util:status",
+    "//third_party/tink/cc/util:statusor",
+    "//third_party/boringssl:crypto",
+    "//third_party/abseil-cpp/absl/strings:strings",
+  ]
+  public_configs = [ "//third_party/tink:tink_config" ]
+}
+
 # CC Library : hmac_boringssl
 source_set("hmac_boringssl") {
   configs -= [ "//build/config:no_rtti" ]
@@ -121,6 +141,7 @@
   ]
   public_deps = [
     ":random",
+    ":subtle_util",
     ":subtle_util_boringssl",
     "//third_party/tink/cc:aead",
     "//third_party/tink/cc/util:errors",
@@ -183,6 +204,7 @@
   public_deps = [
     ":ind_cpa_cipher",
     ":random",
+    ":subtle_util",
     ":subtle_util_boringssl",
     "//third_party/tink/cc/util:errors",
     "//third_party/tink/cc/util:status",
@@ -225,6 +247,26 @@
   public_configs = [ "//third_party/tink:tink_config" ]
 }
 
+# CC Library : aes_gcm_siv_boringssl
+source_set("aes_gcm_siv_boringssl") {
+  configs -= [ "//build/config:no_rtti" ]
+  sources = [
+    "aes_gcm_siv_boringssl.cc",
+    "aes_gcm_siv_boringssl.h",
+  ]
+  public_deps = [
+    ":random",
+    ":subtle_util",
+    "//third_party/tink/cc:aead",
+    "//third_party/tink/cc/util:errors",
+    "//third_party/tink/cc/util:status",
+    "//third_party/tink/cc/util:statusor",
+    "//third_party/boringssl:crypto",
+    "//third_party/abseil-cpp/absl/strings:strings",
+  ]
+  public_configs = [ "//third_party/tink:tink_config" ]
+}
+
 # CC Library : common_enums
 source_set("common_enums") {
   configs -= [ "//build/config:no_rtti" ]
@@ -232,6 +274,17 @@
     "common_enums.cc",
     "common_enums.h",
   ]
+  public_deps = [ "//third_party/abseil-cpp/absl/strings:strings" ]
+  public_configs = [ "//third_party/tink:tink_config" ]
+}
+
+# CC Library : subtle_util
+source_set("subtle_util") {
+  configs -= [ "//build/config:no_rtti" ]
+  sources = [
+    "subtle_util.cc",
+    "subtle_util.h",
+  ]
   public_configs = [ "//third_party/tink:tink_config" ]
 }
 
@@ -248,6 +301,7 @@
     "//third_party/tink/cc/util:status",
     "//third_party/tink/cc/util:statusor",
     "//third_party/boringssl:crypto",
+    "//third_party/abseil-cpp/absl/memory:memory",
     "//third_party/abseil-cpp/absl/strings:strings",
   ]
   public_configs = [ "//third_party/tink:tink_config" ]
diff --git a/cc/subtle/CMakeLists.txt b/cc/subtle/CMakeLists.txt
new file mode 100644
index 0000000..7198e5e
--- /dev/null
+++ b/cc/subtle/CMakeLists.txt
@@ -0,0 +1,1144 @@
+tink_module(subtle)
+
+
+set(TINK_SUBTLE_PUBLIC_APIS
+  common_enums.h
+  aes_gcm_boringssl.h
+  encrypt_then_authenticate.h
+  hmac_boringssl.h
+  hkdf.h
+  ind_cpa_cipher.h
+  random.h
+)
+
+tink_cc_library(
+  NAME subtle
+  SRCS ${TINK_SUBTLE_PUBLIC_APIS}
+  DEPS
+    tink::subtle::aes_gcm_boringssl
+    tink::subtle::common_enums
+    tink::subtle::encrypt_then_authenticate
+    tink::subtle::hkdf
+    tink::subtle::hmac_boringssl
+    tink::subtle::random
+    tink::core::aead
+    tink::core::hybrid_decrypt
+    tink::core::hybrid_encrypt
+    tink::core::mac
+    tink::core::public_key_sign
+    tink::core::public_key_verify
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+  PUBLIC
+)
+
+add_library(tink::subtle ALIAS tink_subtle_subtle)
+
+tink_cc_library(
+  NAME ind_cpa_cipher
+  SRCS ind_cpa_cipher.h
+  DEPS
+    tink::util::statusor
+    absl::strings
+)
+
+tink_cc_library(
+  NAME ecies_hkdf_recipient_kem_boringssl
+  SRCS
+    ecies_hkdf_recipient_kem_boringssl.cc
+    ecies_hkdf_recipient_kem_boringssl.h
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::hkdf
+    tink::subtle::subtle_util_boringssl
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::memory
+    absl::strings
+)
+
+tink_cc_library(
+  NAME ecies_hkdf_sender_kem_boringssl
+  SRCS
+    ecies_hkdf_sender_kem_boringssl.cc
+    ecies_hkdf_sender_kem_boringssl.h
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::hkdf
+    tink::subtle::subtle_util_boringssl
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::memory
+    absl::strings
+)
+
+tink_cc_library(
+  NAME ec_util
+  SRCS
+    ec_util.cc
+    ec_util.h
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::subtle_util_boringssl
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME ed25519_sign_boringssl
+  SRCS
+    ed25519_sign_boringssl.cc
+    ed25519_sign_boringssl.h
+  DEPS
+    tink::subtle::subtle_util_boringssl
+    tink::core::public_key_sign
+    tink::util::errors
+    tink::util::statusor
+    crypto
+    absl::strings
+    absl::str_format
+)
+
+tink_cc_library(
+  NAME ed25519_verify_boringssl
+  SRCS
+    ed25519_verify_boringssl.cc
+    ed25519_verify_boringssl.h
+  DEPS
+    tink::subtle::subtle_util_boringssl
+    tink::core::public_key_verify
+    tink::util::errors
+    tink::util::statusor
+    crypto
+    absl::strings
+    absl::str_format
+)
+
+tink_cc_library(
+  NAME hkdf
+  SRCS
+    hkdf.cc
+    hkdf.h
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::subtle_util_boringssl
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME aes_cmac_boringssl
+  SRCS
+    aes_cmac_boringssl.cc
+    aes_cmac_boringssl.h
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::subtle_util_boringssl
+    tink::core::mac
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME hmac_boringssl
+  SRCS
+    hmac_boringssl.cc
+    hmac_boringssl.h
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::subtle_util_boringssl
+    tink::core::mac
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME ecdsa_sign_boringssl
+  SRCS
+    ecdsa_sign_boringssl.cc
+    ecdsa_sign_boringssl.h
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::subtle_util_boringssl
+    tink::core::public_key_sign
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME ecdsa_verify_boringssl
+  SRCS
+    ecdsa_verify_boringssl.cc
+    ecdsa_verify_boringssl.h
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::subtle_util_boringssl
+    tink::core::public_key_verify
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME rsa_ssa_pss_verify_boringssl
+  SRCS
+    rsa_ssa_pss_verify_boringssl.cc
+    rsa_ssa_pss_verify_boringssl.h
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::subtle_util_boringssl
+    tink::core::public_key_verify
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME rsa_ssa_pss_sign_boringssl
+  SRCS
+    rsa_ssa_pss_sign_boringssl.cc
+    rsa_ssa_pss_sign_boringssl.h
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::subtle_util_boringssl
+    tink::core::public_key_sign
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME rsa_ssa_pkcs1_verify_boringssl
+  SRCS
+    rsa_ssa_pkcs1_verify_boringssl.cc
+    rsa_ssa_pkcs1_verify_boringssl.h
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::subtle_util_boringssl
+    tink::core::public_key_verify
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME rsa_ssa_pkcs1_sign_boringssl
+  SRCS
+    rsa_ssa_pkcs1_sign_boringssl.cc
+    rsa_ssa_pkcs1_sign_boringssl.h
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::subtle_util_boringssl
+    tink::core::public_key_sign
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME aes_gcm_boringssl
+  SRCS
+    aes_gcm_boringssl.cc
+    aes_gcm_boringssl.h
+  DEPS
+    tink::subtle::random
+    tink::subtle::subtle_util
+    tink::subtle::subtle_util_boringssl
+    tink::core::aead
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME aes_gcm_hkdf_stream_segment_decrypter
+  SRCS
+    aes_gcm_hkdf_stream_segment_decrypter.cc
+    aes_gcm_hkdf_stream_segment_decrypter.h
+  DEPS
+    tink::subtle::aes_gcm_hkdf_stream_segment_encrypter
+    tink::subtle::common_enums
+    tink::subtle::hkdf
+    tink::subtle::random
+    tink::subtle::stream_segment_decrypter
+    tink::subtle::subtle_util_boringssl
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME aes_gcm_hkdf_stream_segment_encrypter
+  SRCS
+    aes_gcm_hkdf_stream_segment_encrypter.cc
+    aes_gcm_hkdf_stream_segment_encrypter.h
+  DEPS
+    tink::subtle::random
+    tink::subtle::stream_segment_encrypter
+    tink::subtle::subtle_util_boringssl
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME aes_gcm_hkdf_streaming
+  SRCS
+    aes_gcm_hkdf_streaming.cc
+    aes_gcm_hkdf_streaming.h
+  DEPS
+    tink::subtle::aes_gcm_hkdf_stream_segment_decrypter
+    tink::subtle::aes_gcm_hkdf_stream_segment_encrypter
+    tink::subtle::common_enums
+    tink::subtle::hkdf
+    tink::subtle::nonce_based_streaming_aead
+    tink::subtle::random
+    tink::subtle::stream_segment_decrypter
+    tink::subtle::stream_segment_encrypter
+    tink::subtle::subtle_util_boringssl
+    tink::core::input_stream
+    tink::core::output_stream
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME aes_ctr_hmac_streaming
+  SRCS
+    aes_ctr_hmac_streaming.cc
+    aes_ctr_hmac_streaming.h
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::hkdf
+    tink::subtle::hmac_boringssl
+    tink::subtle::nonce_based_streaming_aead
+    tink::subtle::random
+    tink::subtle::stream_segment_decrypter
+    tink::subtle::stream_segment_encrypter
+    tink::subtle::subtle_util
+    tink::subtle::subtle_util_boringssl
+    tink::core::mac
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::memory
+    absl::strings
+)
+
+tink_cc_library(
+  NAME aes_eax_boringssl
+  SRCS
+    aes_eax_boringssl.cc
+    aes_eax_boringssl.h
+  DEPS
+    tink::subtle::random
+    tink::subtle::subtle_util_boringssl
+    tink::core::aead
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME encrypt_then_authenticate
+  SRCS
+    encrypt_then_authenticate.cc
+    encrypt_then_authenticate.h
+  DEPS
+    tink::subtle::aes_ctr_boringssl
+    tink::subtle::ind_cpa_cipher
+    tink::subtle::subtle_util_boringssl
+    tink::core::aead
+    tink::core::mac
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    absl::strings
+)
+
+tink_cc_library(
+  NAME aes_ctr_boringssl
+  SRCS
+    aes_ctr_boringssl.cc
+    aes_ctr_boringssl.h
+  DEPS
+    tink::subtle::ind_cpa_cipher
+    tink::subtle::random
+    tink::subtle::subtle_util
+    tink::subtle::subtle_util_boringssl
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME random
+  SRCS
+    random.cc
+    random.h
+  DEPS
+    crypto
+)
+
+tink_cc_library(
+  NAME xchacha20_poly1305_boringssl
+  SRCS
+    xchacha20_poly1305_boringssl.cc
+    xchacha20_poly1305_boringssl.h
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::random
+    tink::subtle::subtle_util_boringssl
+    tink::core::aead
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME aes_siv_boringssl
+  SRCS
+    aes_siv_boringssl.cc
+    aes_siv_boringssl.h
+  DEPS
+    tink::subtle::random
+    tink::subtle::subtle_util_boringssl
+    tink::core::deterministic_aead
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME aes_gcm_siv_boringssl
+  SRCS
+    aes_gcm_siv_boringssl.cc
+    aes_gcm_siv_boringssl.h
+  DEPS
+    tink::subtle::random
+    tink::subtle::subtle_util
+    tink::core::aead
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME common_enums
+  SRCS
+    common_enums.cc
+    common_enums.h
+  DEPS
+    absl::strings
+)
+
+tink_cc_library(
+  NAME subtle_util
+  SRCS
+    subtle_util.cc
+    subtle_util.h
+)
+
+tink_cc_library(
+  NAME subtle_util_boringssl
+  SRCS
+    subtle_util_boringssl.cc
+    subtle_util_boringssl.h
+  DEPS
+    tink::subtle::common_enums
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    crypto
+    absl::strings
+    absl::memory
+)
+
+tink_cc_library(
+  NAME wycheproof_util
+  SRCS
+    wycheproof_util.cc
+    wycheproof_util.h
+  DEPS
+    tink::subtle::common_enums
+    tink::util::status
+    tink::util::statusor
+    absl::strings
+    rapidjson
+)
+
+tink_cc_library(
+  NAME stream_segment_decrypter
+  SRCS stream_segment_decrypter.h
+  DEPS tink::util::status
+)
+
+tink_cc_library(
+  NAME stream_segment_encrypter
+  SRCS stream_segment_encrypter.h
+  DEPS tink::util::status
+)
+
+tink_cc_library(
+  NAME streaming_aead_decrypting_stream
+  SRCS
+    streaming_aead_decrypting_stream.cc
+    streaming_aead_decrypting_stream.h
+  DEPS
+    tink::subtle::stream_segment_decrypter
+    tink::core::input_stream
+    tink::util::status
+    tink::util::statusor
+    absl::memory
+)
+
+tink_cc_library(
+  NAME streaming_aead_encrypting_stream
+  SRCS
+    streaming_aead_encrypting_stream.cc
+    streaming_aead_encrypting_stream.h
+  DEPS
+    tink::subtle::stream_segment_encrypter
+    tink::core::output_stream
+    tink::util::statusor
+    absl::memory
+)
+
+tink_cc_library(
+  NAME nonce_based_streaming_aead
+  SRCS
+    nonce_based_streaming_aead.cc
+    nonce_based_streaming_aead.h
+  DEPS
+    tink::subtle::decrypting_random_access_stream
+    tink::subtle::stream_segment_decrypter
+    tink::subtle::stream_segment_encrypter
+    tink::subtle::streaming_aead_decrypting_stream
+    tink::subtle::streaming_aead_encrypting_stream
+    tink::core::input_stream
+    tink::core::output_stream
+    tink::core::random_access_stream
+    tink::core::streaming_aead
+    tink::util::statusor
+    absl::strings
+)
+
+tink_cc_library(
+  NAME test_util
+  SRCS
+    test_util.cc
+    test_util.h
+  DEPS
+    tink::subtle::nonce_based_streaming_aead
+    tink::subtle::stream_segment_decrypter
+    tink::subtle::stream_segment_encrypter
+    tink::core::input_stream
+    tink::core::output_stream
+    tink::util::status
+    tink::util::statusor
+    absl::memory
+    absl::strings
+)
+
+tink_cc_library(
+  NAME aead_test_util
+  SRCS
+    aead_test_util.cc
+    aead_test_util.h
+  DEPS
+    absl::strings
+    tink::core::aead
+    tink::util::status
+)
+
+tink_cc_library(
+  NAME streaming_aead_test_util
+  SRCS
+    streaming_aead_test_util.cc
+    streaming_aead_test_util.h
+  DEPS
+    absl::strings
+    tink::core::random_access_stream
+    tink::core::streaming_aead
+    tink::util::ostream_output_stream
+    tink::util::istream_input_stream
+    tink::util::buffer
+    tink::util::file_random_access_stream
+    tink::util::status
+    tink::util::test_util
+    tink::subtle::test_util
+)
+
+tink_cc_library(
+  NAME hybrid_test_util
+  SRCS
+    hybrid_test_util.cc
+    hybrid_test_util.h
+  DEPS
+    absl::strings
+    tink::core::hybrid_decrypt
+    tink::core::hybrid_encrypt
+    tink::util::status
+)
+
+tink_cc_library(
+  NAME decrypting_random_access_stream
+  SRCS
+    decrypting_random_access_stream.cc
+    decrypting_random_access_stream.h
+  DEPS
+    absl::core_headers
+    absl::memory
+    absl::synchronization
+    tink::subtle::stream_segment_decrypter
+    tink::core::random_access_stream
+    tink::util::buffer
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+)
+
+# tests
+
+tink_cc_test(
+  NAME ecies_hkdf_recipient_kem_boringssl_test
+  SRCS ecies_hkdf_recipient_kem_boringssl_test.cc
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::ecies_hkdf_recipient_kem_boringssl
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+)
+
+tink_cc_test(
+  NAME ecies_hkdf_sender_kem_boringssl_test
+  SRCS ecies_hkdf_sender_kem_boringssl_test.cc
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::ecies_hkdf_recipient_kem_boringssl
+    tink::subtle::ecies_hkdf_sender_kem_boringssl
+    tink::subtle::subtle_util_boringssl
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+)
+
+tink_cc_test(
+  NAME ec_util_test
+  SRCS ec_util_test.cc
+  DEPS
+    tink::subtle::ec_util
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+)
+
+tink_cc_test(
+  NAME hkdf_test
+  SRCS hkdf_test.cc
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::hkdf
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+)
+
+tink_cc_test(
+  NAME aes_cmac_boringssl_test
+  SRCS aes_cmac_boringssl_test.cc
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::aes_cmac_boringssl
+    tink::core::mac
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+)
+
+tink_cc_test(
+  NAME hmac_boringssl_test
+  SRCS hmac_boringssl_test.cc
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::hmac_boringssl
+    tink::core::mac
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+)
+
+tink_cc_test(
+  NAME aes_gcm_boringssl_test
+  SRCS aes_gcm_boringssl_test.cc
+  DATA wycheproof::testvectors
+  DEPS
+    tink::subtle::aes_gcm_boringssl
+    tink::subtle::wycheproof_util
+    tink::core::aead
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+    absl::strings
+    rapidjson
+)
+
+tink_cc_test(
+  NAME aes_gcm_hkdf_stream_segment_decrypter_test
+  SRCS aes_gcm_hkdf_stream_segment_decrypter_test.cc
+  DEPS
+    tink::subtle::aes_gcm_hkdf_stream_segment_decrypter
+    tink::subtle::aes_gcm_hkdf_stream_segment_encrypter
+    tink::subtle::common_enums
+    tink::subtle::hkdf
+    tink::subtle::random
+    tink::subtle::stream_segment_decrypter
+    tink::subtle::stream_segment_encrypter
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+    absl::memory
+    absl::strings
+)
+
+tink_cc_test(
+  NAME aes_gcm_hkdf_stream_segment_encrypter_test
+  SRCS aes_gcm_hkdf_stream_segment_encrypter_test.cc
+  DEPS
+    tink::subtle::aes_gcm_hkdf_stream_segment_encrypter
+    tink::subtle::random
+    tink::subtle::stream_segment_encrypter
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+    absl::memory
+    absl::strings
+)
+
+tink_cc_test(
+  NAME aes_gcm_hkdf_streaming_test
+  SRCS aes_gcm_hkdf_streaming_test.cc
+  DEPS
+    tink::subtle::aes_gcm_hkdf_streaming
+    tink::subtle::common_enums
+    tink::subtle::random
+    tink::subtle::streaming_aead_test_util
+    tink::subtle::test_util
+    tink::core::output_stream
+    tink::util::ostream_output_stream
+    tink::util::istream_input_stream
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::util::test_util
+    absl::strings
+)
+
+tink_cc_test(
+  NAME aes_ctr_hmac_streaming_test
+  SRCS aes_ctr_hmac_streaming_test.cc
+  DEPS
+    tink::subtle::aes_ctr_hmac_streaming
+    tink::subtle::common_enums
+    tink::subtle::random
+    tink::subtle::stream_segment_decrypter
+    tink::subtle::stream_segment_encrypter
+    tink::subtle::streaming_aead_test_util
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+    tink::util::test_matchers
+    absl::memory
+    absl::strings
+)
+
+tink_cc_test(
+  NAME aes_eax_boringssl_test
+  SRCS aes_eax_boringssl_test.cc
+  DATA wycheproof::testvectors
+  DEPS
+    tink::subtle::aes_eax_boringssl
+    tink::subtle::common_enums
+    tink::subtle::wycheproof_util
+    tink::core::aead
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+    absl::strings
+    rapidjson
+)
+
+tink_cc_test(
+  NAME encrypt_then_authenticate_test
+  SRCS encrypt_then_authenticate_test.cc
+  DEPS
+    tink::subtle::aes_ctr_boringssl
+    tink::subtle::common_enums
+    tink::subtle::encrypt_then_authenticate
+    tink::subtle::hmac_boringssl
+    tink::subtle::random
+    tink::core::aead
+    tink::core::mac
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+)
+
+tink_cc_test(
+  NAME aes_ctr_boringssl_test
+  SRCS aes_ctr_boringssl_test.cc
+  DEPS
+    tink::subtle::aes_ctr_boringssl
+    tink::subtle::random
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+)
+
+tink_cc_test(
+  NAME aes_siv_boringssl_test
+  SRCS aes_siv_boringssl_test.cc
+  DATA wycheproof::testvectors
+  DEPS
+    tink::subtle::aes_siv_boringssl
+    tink::subtle::common_enums
+    tink::subtle::wycheproof_util
+    tink::core::deterministic_aead
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+    absl::strings
+    rapidjson
+)
+
+tink_cc_test(
+  NAME ecdsa_sign_boringssl_test
+  SRCS ecdsa_sign_boringssl_test.cc
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::ec_util
+    tink::subtle::ecdsa_sign_boringssl
+    tink::subtle::ecdsa_verify_boringssl
+    tink::core::public_key_sign
+    tink::core::public_key_verify
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+)
+
+tink_cc_test(
+  NAME ecdsa_verify_boringssl_test
+  SRCS ecdsa_verify_boringssl_test.cc
+  DATA wycheproof::testvectors
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::ecdsa_sign_boringssl
+    tink::subtle::ecdsa_verify_boringssl
+    tink::subtle::wycheproof_util
+    tink::core::public_key_sign
+    tink::core::public_key_verify
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+    absl::strings
+    rapidjson
+)
+
+tink_cc_test(
+  NAME ed25519_sign_boringssl_test
+  SRCS ed25519_sign_boringssl_test.cc
+  DEPS
+    tink::subtle::ed25519_sign_boringssl
+    tink::subtle::ed25519_verify_boringssl
+    tink::subtle::random
+    tink::subtle::subtle_util_boringssl
+    tink::core::public_key_sign
+    tink::core::public_key_verify
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+    crypto
+    absl::strings
+)
+
+tink_cc_test(
+  NAME ed25519_verify_boringssl_test
+  SRCS ed25519_verify_boringssl_test.cc
+  DATA wycheproof::testvectors
+  DEPS
+    tink::subtle::ed25519_sign_boringssl
+    tink::subtle::ed25519_verify_boringssl
+    tink::subtle::subtle_util_boringssl
+    tink::subtle::wycheproof_util
+    tink::core::public_key_sign
+    tink::core::public_key_verify
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+    crypto
+    absl::strings
+)
+
+tink_cc_test(
+  NAME rsa_ssa_pss_verify_boringssl_test
+  SRCS rsa_ssa_pss_verify_boringssl_test.cc
+  DATA wycheproof::testvectors
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::rsa_ssa_pss_verify_boringssl
+    tink::subtle::wycheproof_util
+    tink::core::public_key_sign
+    tink::core::public_key_verify
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+    absl::strings
+    rapidjson
+)
+
+tink_cc_test(
+  NAME rsa_ssa_pss_sign_boringssl_test
+  SRCS rsa_ssa_pss_sign_boringssl_test.cc
+  DEPS
+    tink::subtle::rsa_ssa_pss_sign_boringssl
+    tink::subtle::rsa_ssa_pss_verify_boringssl
+    tink::subtle::subtle_util_boringssl
+    tink::util::test_matchers
+    absl::strings
+)
+
+tink_cc_test(
+  NAME rsa_ssa_pkcs1_verify_boringssl_test
+  SRCS rsa_ssa_pkcs1_verify_boringssl_test.cc
+  DATA wycheproof::testvectors
+  DEPS
+    tink::subtle::common_enums
+    tink::subtle::rsa_ssa_pkcs1_verify_boringssl
+    tink::subtle::wycheproof_util
+    tink::core::public_key_sign
+    tink::core::public_key_verify
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+    absl::strings
+    rapidjson
+)
+
+tink_cc_test(
+  NAME rsa_ssa_pkcs1_sign_boringssl_test
+  SRCS rsa_ssa_pkcs1_sign_boringssl_test.cc
+  DEPS
+    tink::subtle::rsa_ssa_pkcs1_sign_boringssl
+    tink::subtle::rsa_ssa_pkcs1_verify_boringssl
+    tink::subtle::subtle_util_boringssl
+    tink::util::test_matchers
+    absl::strings
+)
+
+tink_cc_test(
+  NAME aes_gcm_siv_boringssl_test
+  SRCS aes_gcm_siv_boringssl_test.cc
+  DATA wycheproof::testvectors
+  DEPS
+    tink::subtle::aes_gcm_siv_boringssl
+    tink::subtle::common_enums
+    tink::subtle::wycheproof_util
+    tink::core::aead
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+    crypto
+    absl::strings
+    rapidjson
+)
+
+tink_cc_test(
+  NAME random_test
+  SRCS random_test.cc
+  DEPS tink::subtle::random
+)
+
+tink_cc_test(
+  NAME common_enums_test
+  SRCS common_enums_test.cc
+  DEPS tink::subtle::common_enums
+)
+
+tink_cc_test(
+  NAME subtle_util_test
+  SRCS subtle_util_test
+  DEPS
+    tink::subtle::subtle_util
+    gmock
+)
+
+tink_cc_test(
+  NAME subtle_util_boringssl_test
+  SRCS subtle_util_boringssl_test.cc
+  DATA wycheproof::testvectors
+  DEPS
+    tink::subtle::ec_util
+    tink::subtle::subtle_util_boringssl
+    tink::subtle::wycheproof_util
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_matchers
+    tink::util::test_util
+    crypto
+    absl::strings
+    rapidjson
+)
+
+tink_cc_test(
+  NAME xchacha20_poly1305_boringssl_test
+  SRCS xchacha20_poly1305_boringssl_test.cc
+  DEPS
+    tink::subtle::xchacha20_poly1305_boringssl
+    tink::core::aead
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+    crypto
+    absl::strings
+)
+
+tink_cc_test(
+  NAME streaming_aead_decrypting_stream_test
+  SRCS streaming_aead_decrypting_stream_test.cc
+  DEPS
+    tink::subtle::random
+    tink::subtle::stream_segment_decrypter
+    tink::subtle::streaming_aead_decrypting_stream
+    tink::subtle::test_util
+    tink::core::input_stream
+    tink::util::istream_input_stream
+    tink::util::status
+    tink::util::statusor
+    absl::memory
+    absl::strings
+)
+
+tink_cc_test(
+  NAME streaming_aead_encrypting_stream_test
+  SRCS streaming_aead_encrypting_stream_test.cc
+  DEPS
+    tink::subtle::random
+    tink::subtle::stream_segment_encrypter
+    tink::subtle::streaming_aead_encrypting_stream
+    tink::subtle::test_util
+    tink::core::output_stream
+    tink::util::ostream_output_stream
+    tink::util::status
+    tink::util::statusor
+    absl::memory
+    absl::strings
+)
+
+tink_cc_test(
+  NAME aead_test_util_test
+  SRCS aead_test_util_test.cc
+  DEPS
+    tink::subtle::aead_test_util
+    tink::util::test_matchers
+    tink::util::test_util
+    absl::strings
+    gmock
+)
+
+
+tink_cc_test(
+  NAME streaming_aead_test_util_test
+  SRCS streaming_aead_test_util_test.cc
+  DEPS
+    tink::subtle::streaming_aead_test_util
+    tink::subtle::test_util
+    tink::core::output_stream
+    tink::util::ostream_output_stream
+    tink::util::status
+    tink::util::statusor
+    tink::util::test_util
+    absl::memory
+    absl::strings
+    gmock
+)
+
+tink_cc_test(
+  NAME hybrid_test_util_test
+  SRCS hybrid_test_util_test.cc
+  DEPS
+    tink::subtle::hybrid_test_util
+    tink::util::test_matchers
+    tink::util::test_util
+    absl::strings
+    gmock
+)
+
+tink_cc_test(
+  NAME decrypting_random_access_stream_test
+  SRCS decrypting_random_access_stream_test.cc
+  DEPS
+    absl::memory
+    absl::strings
+    tink::core::output_stream
+    tink::core::random_access_stream
+    tink::core::streaming_aead
+    tink::subtle::decrypting_random_access_stream
+    tink::subtle::random
+    tink::subtle::test_util
+    tink::util::file_random_access_stream
+    tink::util::ostream_output_stream
+    tink::util::status
+    tink::util::test_matchers
+    tink::util::test_util
+)
diff --git a/cc/subtle/aead_test_util.cc b/cc/subtle/aead_test_util.cc
new file mode 100644
index 0000000..df123d1
--- /dev/null
+++ b/cc/subtle/aead_test_util.cc
@@ -0,0 +1,42 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+#include "tink/subtle/aead_test_util.h"
+
+#include <string>
+
+#include "tink/subtle/test_util.h"
+#include "tink/util/status.h"
+
+namespace crypto {
+namespace tink {
+
+using ::crypto::tink::util::StatusOr;
+
+crypto::tink::util::Status EncryptThenDecrypt(Aead* encrypter, Aead* decrypter,
+                                              absl::string_view message,
+                                              absl::string_view aad) {
+  StatusOr<std::string> encryption_or = encrypter->Encrypt(message, aad);
+  if (!encryption_or.status().ok()) return encryption_or.status();
+  StatusOr<std::string> decryption_or =
+      decrypter->Decrypt(encryption_or.ValueOrDie(), aad);
+  if (!decryption_or.status().ok()) return decryption_or.status();
+  if (decryption_or.ValueOrDie() != message) {
+    return crypto::tink::util::Status(crypto::tink::util::error::INTERNAL,
+                                      "Message/Decryption mismatch");
+  }
+  return util::OkStatus();
+}
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/aead_test_util.h b/cc/subtle/aead_test_util.h
new file mode 100644
index 0000000..541f74f
--- /dev/null
+++ b/cc/subtle/aead_test_util.h
@@ -0,0 +1,33 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+#ifndef TINK_SUBTLE_AEAD_TEST_UTIL_H_
+#define TINK_SUBTLE_AEAD_TEST_UTIL_H_
+
+#include "absl/strings/string_view.h"
+#include "tink/aead.h"
+#include "tink/util/status.h"
+
+namespace crypto {
+namespace tink {
+
+// Encrypt, then decrypt. Any error will be propagated to the caller. Returns OK
+// if the resulting decryption is equal to the plaintext.
+crypto::tink::util::Status EncryptThenDecrypt(Aead* encrypter, Aead* decrypter,
+                                              absl::string_view message,
+                                              absl::string_view aad);
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_SUBTLE_AEAD_TEST_UTIL_H_
diff --git a/cc/subtle/aead_test_util_test.cc b/cc/subtle/aead_test_util_test.cc
new file mode 100644
index 0000000..a78c4a8
--- /dev/null
+++ b/cc/subtle/aead_test_util_test.cc
@@ -0,0 +1,43 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+#include "tink/subtle/aead_test_util.h"
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "tink/util/test_matchers.h"
+#include "tink/util/test_util.h"
+
+namespace crypto {
+namespace tink {
+
+using ::crypto::tink::test::IsOk;
+using ::testing::Not;
+
+namespace {
+
+TEST(EncryptThenDecrypt, Basic) {
+  test::DummyAead aead("Aead 1");
+  EXPECT_THAT(EncryptThenDecrypt(&aead, &aead, "plaintext", "aad"), IsOk());
+}
+
+TEST(EncryptThenDecrypt, DifferentAeads) {
+  test::DummyAead aead_1("Aead 1");
+  test::DummyAead aead_2("Aead 2");
+  EXPECT_THAT(EncryptThenDecrypt(&aead_1, &aead_2, "plaintext", "aad"),
+              Not(IsOk()));
+}
+
+}  // namespace
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/aes_cmac_boringssl.cc b/cc/subtle/aes_cmac_boringssl.cc
new file mode 100644
index 0000000..849bd9d
--- /dev/null
+++ b/cc/subtle/aes_cmac_boringssl.cc
@@ -0,0 +1,99 @@
+// Copyright 2017 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/subtle/aes_cmac_boringssl.h"
+
+#include <string>
+
+#include "openssl/cmac.h"
+#include "openssl/err.h"
+#include "tink/mac.h"
+#include "tink/subtle/common_enums.h"
+#include "tink/subtle/subtle_util_boringssl.h"
+#include "tink/util/errors.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+
+// static
+util::StatusOr<std::unique_ptr<Mac>> AesCmacBoringSsl::New(
+    const std::string& key_value, uint32_t tag_size) {
+  if (key_value.size() != kSmallKeySize && key_value.size() != kBigKeySize) {
+    return util::Status(util::error::INTERNAL, "invalid key size");
+  }
+  if (tag_size > kMaxTagSize) {
+    return util::Status(util::error::INTERNAL, "invalid tag size");
+  }
+  std::unique_ptr<Mac> cmac(new AesCmacBoringSsl(key_value, tag_size));
+  return std::move(cmac);
+}
+
+AesCmacBoringSsl::AesCmacBoringSsl(const std::string& key_value, uint32_t tag_size)
+    : key_value_(key_value), tag_size_(tag_size) {}
+
+util::StatusOr<std::string> AesCmacBoringSsl::ComputeMac(
+    absl::string_view data) const {
+  // BoringSSL expects a non-null pointer for data,
+  // regardless of whether the size is 0.
+  data = SubtleUtilBoringSSL::EnsureNonNull(data);
+
+  uint8_t buf[kMaxTagSize];
+  const int res =
+      AES_CMAC(buf, reinterpret_cast<const uint8_t*>(key_value_.data()),
+               key_value_.size(), reinterpret_cast<const uint8_t*>(data.data()),
+               data.size());
+  if (res == 0) {
+    return util::Status(util::error::INTERNAL,
+                        "BoringSSL failed to compute CMAC");
+  }
+  return std::string(reinterpret_cast<char*>(buf), tag_size_);
+}
+
+util::Status AesCmacBoringSsl::VerifyMac(absl::string_view mac,
+                                         absl::string_view data) const {
+  // BoringSSL expects a non-null pointer for data,
+  // regardless of whether the size is 0.
+  data = SubtleUtilBoringSSL::EnsureNonNull(data);
+
+  if (mac.size() != tag_size_) {
+    return util::Status(util::error::INVALID_ARGUMENT, "incorrect tag size");
+  }
+  uint8_t buf[kMaxTagSize];
+  const int res =
+      AES_CMAC(buf, reinterpret_cast<const uint8_t*>(key_value_.data()),
+               key_value_.size(), reinterpret_cast<const uint8_t*>(data.data()),
+               data.size());
+  if (res == 0) {
+    return util::Status(util::error::INTERNAL,
+                        "BoringSSL failed to compute CMAC");
+  }
+  uint8_t diff = 0;
+  for (uint32_t i = 0; i < tag_size_; i++) {
+    diff |= buf[i] ^ static_cast<uint8_t>(mac[i]);
+  }
+  if (diff == 0) {
+    return util::Status::OK;
+  } else {
+    return util::Status(util::error::INVALID_ARGUMENT, "verification failed");
+  }
+}
+
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/aes_cmac_boringssl.h b/cc/subtle/aes_cmac_boringssl.h
new file mode 100644
index 0000000..ad20447
--- /dev/null
+++ b/cc/subtle/aes_cmac_boringssl.h
@@ -0,0 +1,68 @@
+// Copyright 2017 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_SUBTLE_AES_CMAC_BORINGSSL_H_
+#define TINK_SUBTLE_AES_CMAC_BORINGSSL_H_
+
+#include <memory>
+
+#include "absl/strings/string_view.h"
+#include "tink/mac.h"
+#include "tink/subtle/common_enums.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+
+class AesCmacBoringSsl : public Mac {
+ public:
+  static crypto::tink::util::StatusOr<std::unique_ptr<Mac>> New(
+      const std::string& key_value, uint32_t tag_size);
+
+  // Computes and returns the CMAC for 'data'.
+  crypto::tink::util::StatusOr<std::string> ComputeMac(
+      absl::string_view data) const override;
+
+  // Verifies if 'mac' is a correct CMAC for 'data'.
+  // Returns Status::OK if 'mac' is correct, and a non-OK-Status otherwise.
+  crypto::tink::util::Status VerifyMac(absl::string_view mac,
+                                       absl::string_view data) const override;
+
+  ~AesCmacBoringSsl() override {}
+
+ private:
+  // CMAC key sizes in bytes.
+  // The small key size is used only to check RFC 4493's test vectors due to
+  // the attack described in
+  // https://www.math.uwaterloo.ca/~ajmeneze/publications/tightness.pdf. We
+  // check this restriction in AesCmacManager.
+  static const size_t kSmallKeySize = 16;
+  static const size_t kBigKeySize = 32;
+  static const size_t kMaxTagSize = 16;
+
+  AesCmacBoringSsl(const std::string& key_value, uint32_t tag_size);
+
+  const std::string key_value_;
+  const uint32_t tag_size_;
+};
+
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_SUBTLE_AES_CMAC_BORINGSSL_H_
diff --git a/cc/subtle/aes_cmac_boringssl_test.cc b/cc/subtle/aes_cmac_boringssl_test.cc
new file mode 100644
index 0000000..c536c04
--- /dev/null
+++ b/cc/subtle/aes_cmac_boringssl_test.cc
@@ -0,0 +1,236 @@
+// Copyright 2017 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "tink/subtle/aes_cmac_boringssl.h"
+
+#include <string>
+
+#include "gtest/gtest.h"
+#include "tink/mac.h"
+#include "tink/subtle/common_enums.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/test_util.h"
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+namespace {
+
+constexpr uint32_t kTagSize = 16;
+constexpr uint32_t kSmallTagSize = 10;
+
+TEST(AesCmacBoringSslTest, Basic) {
+  std::string key(test::HexDecodeOrDie(
+      "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"));
+  auto cmac_result = AesCmacBoringSsl::New(key, kTagSize);
+  EXPECT_TRUE(cmac_result.ok()) << cmac_result.status();
+  auto cmac = std::move(cmac_result.ValueOrDie());
+  {  // Test with some example data.
+    std::string data = "Some data to test.";
+    auto res = cmac->ComputeMac(data);
+    EXPECT_TRUE(res.ok()) << res.status().ToString();
+    std::string tag = res.ValueOrDie();
+    EXPECT_EQ(16, tag.size());
+    auto status = cmac->VerifyMac(tag, data);
+    EXPECT_TRUE(status.ok())
+        << "tag:" << test::HexEncode(tag) << " status:" << status.ToString();
+  }
+  {  // Test with empty example data.
+    absl::string_view data;
+    auto res = cmac->ComputeMac(data);
+    EXPECT_TRUE(res.ok()) << res.status().ToString();
+    std::string tag = res.ValueOrDie();
+    EXPECT_EQ(16, tag.size());
+    auto status = cmac->VerifyMac(tag, data);
+    EXPECT_TRUE(status.ok())
+        << "tag:" << test::HexEncode(tag) << " status:" << status.ToString();
+  }
+}
+
+TEST(AesCmacBoringSslTest, Modification) {
+  std::string key(test::HexDecodeOrDie(
+      "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"));
+  auto cmac_result = AesCmacBoringSsl::New(key, kTagSize);
+  EXPECT_TRUE(cmac_result.ok()) << cmac_result.status();
+  auto cmac = std::move(cmac_result.ValueOrDie());
+  std::string data = "Some data to test";
+  std::string tag = cmac->ComputeMac(data).ValueOrDie();
+  auto status = cmac->VerifyMac(tag, data);
+  EXPECT_TRUE(status.ok()) << status.ToString();
+  size_t bits = tag.size() * 8;
+  for (size_t i = 0; i < bits; i++) {
+    std::string modified_tag = tag;
+    modified_tag[i / 8] ^= 1 << (i % 8);
+    EXPECT_FALSE(cmac->VerifyMac(modified_tag, data).ok())
+        << "tag:" << test::HexEncode(tag)
+        << " modified:" << test::HexEncode(modified_tag);
+  }
+}
+
+TEST(AesCmacBoringSslTest, Truncation) {
+  std::string key(test::HexDecodeOrDie(
+      "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"));
+  auto cmac_result = AesCmacBoringSsl::New(key, kTagSize);
+  EXPECT_TRUE(cmac_result.ok()) << cmac_result.status();
+  auto cmac = std::move(cmac_result.ValueOrDie());
+  std::string data = "Some data to test";
+  std::string tag = cmac->ComputeMac(data).ValueOrDie();
+  auto status = cmac->VerifyMac(tag, data);
+  EXPECT_TRUE(status.ok()) << status.ToString();
+  for (size_t i = 0; i < tag.size(); i++) {
+    std::string modified_tag(tag, 0, i);
+    EXPECT_FALSE(cmac->VerifyMac(modified_tag, data).ok())
+        << "tag:" << test::HexEncode(tag)
+        << " modified:" << test::HexEncode(modified_tag);
+  }
+}
+
+TEST(AesCmacBoringSslTest, BasicSmallTag) {
+  std::string key(test::HexDecodeOrDie(
+      "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"));
+  auto cmac_result = AesCmacBoringSsl::New(key, kSmallTagSize);
+  EXPECT_TRUE(cmac_result.ok()) << cmac_result.status();
+  auto cmac = std::move(cmac_result.ValueOrDie());
+  {  // Test with some example data.
+    std::string data = "Some data to test.";
+    auto res = cmac->ComputeMac(data);
+    EXPECT_TRUE(res.ok()) << res.status().ToString();
+    std::string tag = res.ValueOrDie();
+    EXPECT_EQ(kSmallTagSize, tag.size());
+    auto status = cmac->VerifyMac(tag, data);
+    EXPECT_TRUE(status.ok())
+        << "tag:" << test::HexEncode(tag) << " status:" << status.ToString();
+  }
+  {  // Test with empty example data.
+    absl::string_view data;
+    auto res = cmac->ComputeMac(data);
+    EXPECT_TRUE(res.ok()) << res.status().ToString();
+    std::string tag = res.ValueOrDie();
+    EXPECT_EQ(kSmallTagSize, tag.size());
+    auto status = cmac->VerifyMac(tag, data);
+    EXPECT_TRUE(status.ok())
+        << "tag:" << test::HexEncode(tag) << " status:" << status.ToString();
+  }
+}
+
+TEST(AesCmacBoringSslTest, ModificationSmallTag) {
+  std::string key(test::HexDecodeOrDie(
+      "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"));
+  auto cmac_result = AesCmacBoringSsl::New(key, kSmallTagSize);
+  EXPECT_TRUE(cmac_result.ok()) << cmac_result.status();
+  auto cmac = std::move(cmac_result.ValueOrDie());
+  std::string data = "Some data to test";
+  std::string tag = cmac->ComputeMac(data).ValueOrDie();
+  auto status = cmac->VerifyMac(tag, data);
+  EXPECT_TRUE(status.ok()) << status.ToString();
+  size_t bits = tag.size() * 8;
+  for (size_t i = 0; i < bits; i++) {
+    std::string modified_tag = tag;
+    modified_tag[i / 8] ^= 1 << (i % 8);
+    EXPECT_FALSE(cmac->VerifyMac(modified_tag, data).ok())
+        << "tag:" << test::HexEncode(tag)
+        << " modified:" << test::HexEncode(modified_tag);
+  }
+}
+
+TEST(AesCmacBoringSslTest, TruncationOrAdditionSmallTag) {
+  std::string key(test::HexDecodeOrDie(
+      "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"));
+  auto cmac_result = AesCmacBoringSsl::New(key, kSmallTagSize);
+  EXPECT_TRUE(cmac_result.ok()) << cmac_result.status();
+  auto cmac = std::move(cmac_result.ValueOrDie());
+  std::string data = "Some data to test";
+  std::string tag = cmac->ComputeMac(data).ValueOrDie();
+  auto status = cmac->VerifyMac(tag, data);
+  EXPECT_TRUE(status.ok()) << status.ToString();
+  for (size_t i = 0; i < kSmallTagSize; i++) {
+    std::string modified_tag(tag, 0, i);
+    EXPECT_FALSE(cmac->VerifyMac(modified_tag, data).ok())
+        << "tag:" << test::HexEncode(tag)
+        << " modified:" << test::HexEncode(modified_tag);
+  }
+  for (size_t i = kSmallTagSize + 1; i < kTagSize; i++) {
+    std::string modified_tag(tag + std::string(i - kSmallTagSize, 'x'));
+    EXPECT_FALSE(cmac->VerifyMac(modified_tag, data).ok())
+        << "tag:" << test::HexEncode(tag)
+        << " modified:" << test::HexEncode(modified_tag);
+  }
+}
+
+TEST(AesCmacBoringSslTest, InvalidKeySizes) {
+  for (int keysize = 0; keysize < 65; keysize++) {
+    std::string key(keysize, 'x');
+    auto cmac_result = AesCmacBoringSsl::New(key, kTagSize);
+    if (keysize == 16 || keysize == 32) {
+      EXPECT_TRUE(cmac_result.ok());
+    } else {
+      EXPECT_FALSE(cmac_result.ok());
+    }
+  }
+}
+
+TEST(AesCmacBoringSslTest, InvalidTagSizes) {
+  for (int tagsize = 0; tagsize < 65; tagsize++) {
+    std::string key(32, 'x');
+    auto cmac_result = AesCmacBoringSsl::New(key, tagsize);
+    if (tagsize <= 16) {
+      EXPECT_TRUE(cmac_result.ok());
+    } else {
+      EXPECT_FALSE(cmac_result.ok());
+    }
+  }
+}
+
+class AesCmacBoringSslTestVectorTest
+    : public ::testing::TestWithParam<std::pair<int, std::string>> {
+ public:
+  // Utility to simplify testing with test vectors.
+  // Arguments and result are hexadecimal.
+  bool CmacVerifyHex(const std::string &key_hex, const std::string &tag_hex,
+                     const std::string &data_hex) {
+    std::string key = test::HexDecodeOrDie(key_hex);
+    std::string tag = test::HexDecodeOrDie(tag_hex);
+    std::string data = test::HexDecodeOrDie(data_hex);
+    auto cmac_result = AesCmacBoringSsl::New(key, kTagSize);
+    EXPECT_TRUE(cmac_result.ok()) << cmac_result.status();
+    auto cmac = std::move(cmac_result.ValueOrDie());
+    auto result = cmac->VerifyMac(tag, data);
+    return result.ok();
+  }
+};
+
+TEST_P(AesCmacBoringSslTestVectorTest, RfcTestVectors) {
+  // Test vectors from RFC 4493.
+  std::string key("2b7e151628aed2a6abf7158809cf4f3c");
+  std::string data(
+      "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46"
+      "a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710");
+  EXPECT_TRUE(CmacVerifyHex(key, GetParam().second,
+                            data.substr(0, 2 * GetParam().first)));
+}
+INSTANTIATE_TEST_SUITE_P(
+    RfcTest, AesCmacBoringSslTestVectorTest,
+    testing::Values(
+        std::make_pair(0, "bb1d6929e95937287fa37d129b756746"),
+        std::make_pair(16, "070a16b46b4d4144f79bdd9dd04a287c"),
+        std::make_pair(40, "dfa66747de9ae63030ca32611497c827"),
+        std::make_pair(64, "51f0bebf7e3b9d92fc49741779363cfe")));
+
+}  // namespace
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/aes_ctr_boringssl.cc b/cc/subtle/aes_ctr_boringssl.cc
index 909a031..3187ba8 100644
--- a/cc/subtle/aes_ctr_boringssl.cc
+++ b/cc/subtle/aes_ctr_boringssl.cc
@@ -23,6 +23,7 @@
 #include "openssl/evp.h"
 #include "tink/subtle/ind_cpa_cipher.h"
 #include "tink/subtle/random.h"
+#include "tink/subtle/subtle_util.h"
 #include "tink/subtle/subtle_util_boringssl.h"
 #include "tink/util/errors.h"
 #include "tink/util/status.h"
@@ -33,24 +34,14 @@
 namespace tink {
 namespace subtle {
 
-static const EVP_CIPHER* GetCipherForKeySize(uint32_t size_in_bytes) {
-  switch (size_in_bytes) {
-    case 16:
-      return EVP_aes_128_ctr();
-    case 32:
-      return EVP_aes_256_ctr();
-    default:
-      return nullptr;
-  }
-}
-
 AesCtrBoringSsl::AesCtrBoringSsl(absl::string_view key_value,
                                  uint8_t iv_size, const EVP_CIPHER* cipher)
     : key_(key_value), iv_size_(iv_size), cipher_(cipher) {}
 
 util::StatusOr<std::unique_ptr<IndCpaCipher>> AesCtrBoringSsl::New(
     absl::string_view key_value, uint8_t iv_size) {
-  const EVP_CIPHER* cipher = GetCipherForKeySize(key_value.size());
+  const EVP_CIPHER* cipher =
+      SubtleUtilBoringSSL::GetAesCtrCipherForKeySize(key_value.size());
   if (cipher == nullptr) {
     return util::Status(util::error::INTERNAL, "invalid key size");
   }
@@ -73,36 +64,32 @@
     return util::Status(util::error::INTERNAL,
                         "could not initialize EVP_CIPHER_CTX");
   }
-  const std::string iv = Random::GetRandomBytes(iv_size_);
-  // OpenSSL expects that the IV must be a full block.
-  uint8_t iv_block[BLOCK_SIZE];
-  memset(iv_block, 0, sizeof(iv_block));
-  memcpy(iv_block, iv.data(), iv.size());
+  std::string ciphertext = Random::GetRandomBytes(iv_size_);
+  // OpenSSL expects that the IV must be a full block. We pad with zeros.
+  std::string iv_block = ciphertext;
+  // Note that BLOCK_SIZE >= iv_size_ is checked in the factory method.
+  // We explicitly add the '\0' argument to stress that we need to initialize
+  // the new memory.
+  iv_block.resize(BLOCK_SIZE, '\0');
+
   int ret = EVP_EncryptInit_ex(ctx.get(), cipher_, nullptr /* engine */,
                                reinterpret_cast<const uint8_t*>(key_.data()),
-                               iv_block);
+                               reinterpret_cast<const uint8_t*>(&iv_block[0]));
   if (ret != 1) {
     return util::Status(util::error::INTERNAL, "could not initialize ctx");
   }
-  size_t ciphertext_size = iv.size() + plaintext.size();
-  // Allocates 1 byte more than necessary because we may potentially access
-  // &ct[ciphertext_size] causing vector range check error.
-  std::vector<uint8_t> ct(ciphertext_size + 1);
-  memcpy(&ct[0], reinterpret_cast<const uint8_t*>(iv.data()), iv.size());
-  size_t written = iv.size();
+  ResizeStringUninitialized(&ciphertext, iv_size_ + plaintext.size());
   int len;
-  ret = EVP_EncryptUpdate(ctx.get(), &ct[written], &len,
-                          reinterpret_cast<const uint8_t*>(plaintext.data()),
-                          plaintext.size());
+  ret = EVP_EncryptUpdate(
+      ctx.get(), reinterpret_cast<uint8_t*>(&ciphertext[iv_size_]), &len,
+      reinterpret_cast<const uint8_t*>(plaintext.data()), plaintext.size());
   if (ret != 1) {
-    util::Status(util::error::INTERNAL, "encryption failed");
+    return util::Status(util::error::INTERNAL, "encryption failed");
   }
-  written += len;
-
-  if (written != ciphertext_size) {
-    util::Status(util::error::INTERNAL, "incorrect ciphertext size");
+  if (len != plaintext.size()) {
+    return util::Status(util::error::INTERNAL, "incorrect ciphertext size");
   }
-  return std::string(reinterpret_cast<const char*>(&ct[0]), written);
+  return ciphertext;
 }
 
 util::StatusOr<std::string> AesCtrBoringSsl::Decrypt(
@@ -118,37 +105,33 @@
   }
 
   // Initialise key and IV
-  uint8_t iv_block[BLOCK_SIZE];
-  memset(iv_block, 0, sizeof(iv_block));
-  memcpy(iv_block, &ciphertext.data()[0], iv_size_);
+  std::string iv_block = std::string(ciphertext.substr(0, iv_size_));
+  iv_block.resize(BLOCK_SIZE, '\0');
   int ret = EVP_DecryptInit_ex(ctx.get(), cipher_, nullptr /* engine */,
                                reinterpret_cast<const uint8_t*>(key_.data()),
-                               iv_block);
+                               reinterpret_cast<const uint8_t*>(&iv_block[0]));
   if (ret != 1) {
     return util::Status(util::error::INTERNAL,
                         "could not initialize key or iv");
   }
 
   size_t plaintext_size = ciphertext.size() - iv_size_;
-  // Allocates 1 byte more than necessary because we may potentially access
-  // &pt[plaintext_size] causing vector range check error.
-  std::vector<uint8_t> pt(plaintext_size + 1);
+  std::string plaintext;
+  ResizeStringUninitialized(&plaintext, plaintext_size);
   size_t read = iv_size_;
-  size_t written = 0;
   int len;
   ret = EVP_DecryptUpdate(
-      ctx.get(), &pt[written], &len,
+      ctx.get(), reinterpret_cast<uint8_t*>(&plaintext[0]), &len,
       reinterpret_cast<const uint8_t*>(&ciphertext.data()[read]),
       plaintext_size);
   if (ret != 1) {
-    util::Status(util::error::INTERNAL, "decryption failed");
+    return util::Status(util::error::INTERNAL, "decryption failed");
   }
-  written += len;
 
-  if (written != plaintext_size) {
+  if (len != plaintext_size) {
     return util::Status(util::error::INTERNAL, "incorrect plaintext size");
   }
-  return std::string(reinterpret_cast<const char*>(&pt[0]), written);
+  return plaintext;
 }
 
 }  // namespace subtle
diff --git a/cc/subtle/aes_ctr_hmac_streaming.cc b/cc/subtle/aes_ctr_hmac_streaming.cc
new file mode 100644
index 0000000..f2cbd16
--- /dev/null
+++ b/cc/subtle/aes_ctr_hmac_streaming.cc
@@ -0,0 +1,343 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/subtle/aes_ctr_hmac_streaming.h"
+
+#include <limits>
+#include <string>
+#include <vector>
+
+#include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "openssl/base.h"
+#include "openssl/cipher.h"
+#include "openssl/err.h"
+#include "openssl/evp.h"
+#include "tink/subtle/common_enums.h"
+#include "tink/subtle/hkdf.h"
+#include "tink/subtle/hmac_boringssl.h"
+#include "tink/subtle/random.h"
+#include "tink/subtle/stream_segment_decrypter.h"
+#include "tink/subtle/stream_segment_encrypter.h"
+#include "tink/subtle/subtle_util.h"
+#include "tink/subtle/subtle_util_boringssl.h"
+#include "tink/util/errors.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+
+static std::string NonceForSegment(absl::string_view nonce_prefix,
+                              int64_t segment_number, bool is_last_segment) {
+  return absl::StrCat(nonce_prefix, BigEndian32(segment_number),
+                      is_last_segment ? std::string(1, '\x01') : std::string(1, '\x00'),
+                      std::string(4, '\x00'));
+}
+
+static util::Status DeriveKeys(absl::string_view ikm, HashType hkdf_algo,
+                               absl::string_view salt,
+                               absl::string_view associated_data, int key_size,
+                               std::string* key_value, std::string* hmac_key_value) {
+  int derived_key_material_size =
+      key_size + AesCtrHmacStreaming::kHmacKeySizeInBytes;
+  auto hkdf_result = Hkdf::ComputeHkdf(hkdf_algo, ikm, salt, associated_data,
+                                       derived_key_material_size);
+  if (!hkdf_result.ok()) return hkdf_result.status();
+  std::string key_material = std::move(hkdf_result.ValueOrDie());
+  *key_value = key_material.substr(0, key_size);
+  *hmac_key_value =
+      key_material.substr(key_size, AesCtrHmacStreaming::kHmacKeySizeInBytes);
+  return util::OkStatus();
+}
+
+static util::Status Validate(const AesCtrHmacStreaming::Params& params) {
+  if (params.ikm.size() < std::max(16, params.key_size)) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "input key material too small");
+  }
+  if (!(params.hkdf_algo == SHA1 || params.hkdf_algo == SHA256 ||
+        params.hkdf_algo == SHA512)) {
+    return util::Status(util::error::INVALID_ARGUMENT, "unsupported hkdf_algo");
+  }
+  if (params.key_size != 16 && params.key_size != 32) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "key_size must be 16 or 32");
+  }
+  int header_size =
+      1 + params.key_size + AesCtrHmacStreaming::kNoncePrefixSizeInBytes;
+  if (params.ciphertext_segment_size <=
+      params.ciphertext_offset + header_size + params.tag_size) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "ciphertext_segment_size too small");
+  }
+  if (params.ciphertext_offset < 0) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "ciphertext_offset must be non-negative");
+  }
+  if (params.tag_size < 10) {
+    return util::Status(util::error::INVALID_ARGUMENT, "tag_size too small");
+  }
+  if (!(params.tag_algo == SHA1 || params.tag_algo == SHA256 ||
+        params.tag_algo == SHA512)) {
+    return util::Status(util::error::INVALID_ARGUMENT, "unsupported tag_algo");
+  }
+  if ((params.tag_algo == SHA1 && params.tag_size > 20) ||
+      (params.tag_algo == SHA256 && params.tag_size > 32) ||
+      (params.tag_algo == SHA512 && params.tag_size > 64)) {
+    return util::Status(util::error::INVALID_ARGUMENT, "tag_size too big");
+  }
+
+  return util::OkStatus();
+}
+
+// AesCtrHmacStreaming
+// static
+util::StatusOr<std::unique_ptr<AesCtrHmacStreaming>> AesCtrHmacStreaming::New(
+    const Params& params) {
+  auto status = Validate(params);
+  if (!status.ok()) return status;
+  return {absl::WrapUnique(new AesCtrHmacStreaming(params))};
+}
+
+// static
+util::StatusOr<std::unique_ptr<StreamSegmentEncrypter>>
+AesCtrHmacStreaming::NewSegmentEncrypter(
+    absl::string_view associated_data) const {
+  return AesCtrHmacStreamSegmentEncrypter::New(params_, associated_data);
+}
+
+// static
+util::StatusOr<std::unique_ptr<StreamSegmentDecrypter>>
+AesCtrHmacStreaming::NewSegmentDecrypter(
+    absl::string_view associated_data) const {
+  return AesCtrHmacStreamSegmentDecrypter::New(params_, associated_data);
+}
+
+// AesCtrHmacStreamSegmentEncrypter
+static std::string MakeHeader(absl::string_view salt,
+                         absl::string_view nonce_prefix) {
+  uint8_t header_size =
+      static_cast<uint8_t>(1 + salt.size() + nonce_prefix.size());
+  return absl::StrCat(std::string(1, header_size), salt, nonce_prefix);
+}
+
+// static
+util::StatusOr<std::unique_ptr<StreamSegmentEncrypter>>
+AesCtrHmacStreamSegmentEncrypter::New(const AesCtrHmacStreaming::Params& params,
+                                      absl::string_view associated_data) {
+  auto status = Validate(params);
+  if (!status.ok()) return status;
+
+  std::string salt = Random::GetRandomBytes(params.key_size);
+  std::string nonce_prefix =
+      Random::GetRandomBytes(AesCtrHmacStreaming::kNoncePrefixSizeInBytes);
+  std::string header = MakeHeader(salt, nonce_prefix);
+
+  std::string key_value, hmac_key_value;
+  status = DeriveKeys(params.ikm, params.hkdf_algo, salt, associated_data,
+                      params.key_size, &key_value, &hmac_key_value);
+  if (!status.ok()) return status;
+
+  auto cipher = SubtleUtilBoringSSL::GetAesCtrCipherForKeySize(params.key_size);
+  if (cipher == nullptr) {
+    return util::Status(util::error::INTERNAL, "invalid key size");
+  }
+
+  auto hmac_result =
+      HmacBoringSsl::New(params.tag_algo, params.tag_size, hmac_key_value);
+  if (!hmac_result.ok()) return hmac_result.status();
+  auto mac = std::move(hmac_result.ValueOrDie());
+
+  return {absl::WrapUnique(new AesCtrHmacStreamSegmentEncrypter(
+      key_value, header, nonce_prefix, params.ciphertext_segment_size,
+      params.ciphertext_offset, params.tag_size, cipher, std::move(mac)))};
+}
+
+util::Status AesCtrHmacStreamSegmentEncrypter::EncryptSegment(
+    const std::vector<uint8_t>& plaintext, bool is_last_segment,
+    std::vector<uint8_t>* ciphertext_buffer) {
+  if (plaintext.size() > get_plaintext_segment_size()) {
+    return util::Status(util::error::INVALID_ARGUMENT, "plaintext too long");
+  }
+  if (ciphertext_buffer == nullptr) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "ciphertext_buffer must be non-null");
+  }
+  if (get_segment_number() > std::numeric_limits<uint32_t>::max() ||
+      (get_segment_number() == std::numeric_limits<uint32_t>::max() &&
+       !is_last_segment)) {
+    return util::Status(util::error::INVALID_ARGUMENT, "too many segments");
+  }
+
+  int ct_size = plaintext.size() + tag_size_;
+  ciphertext_buffer->resize(ct_size);
+
+  std::string nonce =
+      NonceForSegment(nonce_prefix_, segment_number_, is_last_segment);
+
+  // Encrypt.
+  bssl::UniquePtr<EVP_CIPHER_CTX> ctx(EVP_CIPHER_CTX_new());
+  if (ctx.get() == nullptr) {
+    return util::Status(util::error::INTERNAL,
+                        "could not initialize EVP_CIPHER_CTX");
+  }
+  if (EVP_EncryptInit_ex(ctx.get(), cipher_, nullptr /* engine */,
+                         reinterpret_cast<const uint8_t*>(key_value_.data()),
+                         reinterpret_cast<const uint8_t*>(nonce.data())) != 1) {
+    return util::Status(util::error::INTERNAL, "could not initialize ctx");
+  }
+
+  int out_len;
+  if (EVP_EncryptUpdate(ctx.get(), ciphertext_buffer->data(), &out_len,
+                        plaintext.data(), plaintext.size()) != 1) {
+    return util::Status(util::error::INTERNAL, "encryption failed");
+  }
+  if (out_len != plaintext.size()) {
+    return util::Status(util::error::INTERNAL, "incorrect ciphertext size");
+  }
+
+  // Add MAC tag.
+  absl::string_view ciphertext_string(
+      reinterpret_cast<const char*>(ciphertext_buffer->data()),
+      plaintext.size());
+  auto tag_result = mac_->ComputeMac(absl::StrCat(nonce, ciphertext_string));
+  if (!tag_result.ok()) return tag_result.status();
+  std::string tag = tag_result.ValueOrDie();
+  memcpy(ciphertext_buffer->data() + plaintext.size(),
+         reinterpret_cast<const uint8_t*>(tag.data()), tag_size_);
+
+  IncSegmentNumber();
+  return util::OkStatus();
+}
+
+// AesCtrHmacStreamSegmentDecrypter
+// static
+util::StatusOr<std::unique_ptr<StreamSegmentDecrypter>>
+AesCtrHmacStreamSegmentDecrypter::New(const AesCtrHmacStreaming::Params& params,
+                                      absl::string_view associated_data) {
+  auto status = Validate(params);
+  if (!status.ok()) return status;
+
+  return {absl::WrapUnique(new AesCtrHmacStreamSegmentDecrypter(
+      params.ikm, params.hkdf_algo, params.key_size, associated_data,
+      params.ciphertext_segment_size, params.ciphertext_offset, params.tag_algo,
+      params.tag_size))};
+}
+
+util::Status AesCtrHmacStreamSegmentDecrypter::Init(
+    const std::vector<uint8_t>& header) {
+  if (is_initialized_) {
+    return util::Status(util::error::FAILED_PRECONDITION,
+                        "decrypter alreday initialized");
+  }
+  if (header.size() != get_header_size()) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        absl::StrCat("wrong header size, expected ",
+                                     get_header_size(), " bytes"));
+  }
+  if (header[0] != header.size()) {
+    return util::Status(util::error::INVALID_ARGUMENT, "corrupted header");
+  }
+
+  // Extract salt and nonce prefix.
+  std::string salt(reinterpret_cast<const char*>(header.data() + 1), key_size_);
+  nonce_prefix_ =
+      std::string(reinterpret_cast<const char*>(header.data() + 1 + key_size_),
+             AesCtrHmacStreaming::kNoncePrefixSizeInBytes);
+
+  std::string hmac_key_value;
+  auto status = DeriveKeys(ikm_, hkdf_algo_, salt, associated_data_, key_size_,
+                           &key_value_, &hmac_key_value);
+  if (!status.ok()) return status;
+
+  cipher_ = SubtleUtilBoringSSL::GetAesCtrCipherForKeySize(key_size_);
+  if (cipher_ == nullptr) {
+    return util::Status(util::error::INTERNAL, "invalid key size");
+  }
+
+  auto hmac_result = HmacBoringSsl::New(tag_algo_, tag_size_, hmac_key_value);
+  if (!hmac_result.ok()) return hmac_result.status();
+  mac_ = std::move(hmac_result.ValueOrDie());
+
+  is_initialized_ = true;
+  return util::OkStatus();
+}
+
+util::Status AesCtrHmacStreamSegmentDecrypter::DecryptSegment(
+    const std::vector<uint8_t>& ciphertext, int64_t segment_number,
+    bool is_last_segment, std::vector<uint8_t>* plaintext_buffer) {
+  if (!is_initialized_) {
+    return util::Status(util::error::FAILED_PRECONDITION,
+                        "decrypter not initialized");
+  }
+  if (ciphertext.size() > get_ciphertext_segment_size()) {
+    return util::Status(util::error::INVALID_ARGUMENT, "ciphertext too long");
+  }
+  if (ciphertext.size() < tag_size_) {
+    return util::Status(util::error::INVALID_ARGUMENT, "ciphertext too short");
+  }
+  if (plaintext_buffer == nullptr) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "plaintext_buffer must be non-null");
+  }
+  if (segment_number > std::numeric_limits<uint32_t>::max() ||
+      (segment_number == std::numeric_limits<uint32_t>::max() &&
+       !is_last_segment)) {
+    return util::Status(util::error::INVALID_ARGUMENT, "too many segments");
+  }
+
+  int pt_size = ciphertext.size() - tag_size_;
+  plaintext_buffer->resize(pt_size);
+
+  std::string nonce =
+      NonceForSegment(nonce_prefix_, segment_number, is_last_segment);
+
+  // Verify MAC tag.
+  absl::string_view tag(
+      reinterpret_cast<const char*>(ciphertext.data() + pt_size), tag_size_);
+  absl::string_view ciphertext_string(
+      reinterpret_cast<const char*>(ciphertext.data()), pt_size);
+  auto status = mac_->VerifyMac(tag, absl::StrCat(nonce, ciphertext_string));
+  if (!status.ok()) return status;
+
+  // Decrypt.
+  bssl::UniquePtr<EVP_CIPHER_CTX> ctx(EVP_CIPHER_CTX_new());
+  if (ctx.get() == nullptr) {
+    return util::Status(util::error::INTERNAL,
+                        "could not initialize EVP_CIPHER_CTX");
+  }
+  if (EVP_DecryptInit_ex(ctx.get(), cipher_, nullptr /* engine */,
+                         reinterpret_cast<const uint8_t*>(key_value_.data()),
+                         reinterpret_cast<const uint8_t*>(nonce.data())) != 1) {
+    return util::Status(util::error::INTERNAL, "could not initialize ctx");
+  }
+
+  int out_len;
+  if (EVP_DecryptUpdate(ctx.get(), plaintext_buffer->data(), &out_len,
+                        ciphertext.data(), pt_size) != 1) {
+    return util::Status(util::error::INTERNAL, "decryption failed");
+  }
+  if (out_len != pt_size) {
+    return util::Status(util::error::INTERNAL, "incorrect plaintext size");
+  }
+
+  return util::OkStatus();
+}
+
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/aes_ctr_hmac_streaming.h b/cc/subtle/aes_ctr_hmac_streaming.h
new file mode 100644
index 0000000..1a80e7e
--- /dev/null
+++ b/cc/subtle/aes_ctr_hmac_streaming.h
@@ -0,0 +1,220 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_SUBTLE_AES_CTR_HMAC_STREAMING_H_
+#define TINK_SUBTLE_AES_CTR_HMAC_STREAMING_H_
+
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "openssl/evp.h"
+#include "tink/mac.h"
+#include "tink/subtle/common_enums.h"
+#include "tink/subtle/nonce_based_streaming_aead.h"
+#include "tink/subtle/stream_segment_decrypter.h"
+#include "tink/subtle/stream_segment_encrypter.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+
+// Streaming encryption using AES-CTR and HMAC.
+//
+// Each ciphertext uses a new AES-CTR key and HMAC key that are derived from the
+// key derivation key, a randomly chosen salt of the same size as the key and a
+// nonce prefix using HKDF.
+//
+// The format of a ciphertext is
+//   header || segment_0 || segment_1 || ... || segment_k.
+// where:
+//  - segment_i is the i-th segment of the ciphertext.
+//  - the size of segment_1 .. segment_{k-1} is get_ciphertext_segment_size()
+//  - segment_0 is shorter, so that segment_0, the header and other information
+//    of size get_ciphertext_offset() align with get_ciphertext_segment_size().
+//
+// The format of the header is
+//   header_size || salt || nonce_prefix
+// where
+//  - header_size is 1 byte determining the size of the header
+//  - salt is a salt used in the key derivation
+//  - nonce_prefix is the prefix of the nonce
+//
+// In principle header_size is redundant information, since the length of the
+// header can be determined from the key size.
+class AesCtrHmacStreaming : public NonceBasedStreamingAead {
+ public:
+  struct Params {
+    std::string ikm;
+    HashType hkdf_algo;
+    int key_size;
+    int ciphertext_segment_size;
+    int ciphertext_offset;
+    HashType tag_algo;
+    int tag_size;
+  };
+
+  // The size of the nonce for AES-CTR.
+  static const int kNonceSizeInBytes = 16;
+
+  // The nonce has the format nonce_prefix || ctr || last_block || 0 0 0 0,
+  // where:
+  //  - nonce_prefix is a constant of kNoncePrefixSizeInBytes bytes
+  //    for the whole file
+  //  - ctr is a big endian 32 bit counter
+  //  - last_block is a byte equal to 1 for the last block of the file
+  //    and 0 otherwise.
+  static const int kNoncePrefixSizeInBytes = 7;
+
+  static const int kHmacKeySizeInBytes = 32;
+
+  static util::StatusOr<std::unique_ptr<AesCtrHmacStreaming>> New(
+      const Params& params);
+
+  ~AesCtrHmacStreaming() override {}
+
+ protected:
+  util::StatusOr<std::unique_ptr<StreamSegmentEncrypter>> NewSegmentEncrypter(
+      absl::string_view associated_data) const override;
+
+  util::StatusOr<std::unique_ptr<StreamSegmentDecrypter>> NewSegmentDecrypter(
+      absl::string_view associated_data) const override;
+
+ private:
+  explicit AesCtrHmacStreaming(const Params& params) : params_(params) {}
+  const Params params_;
+};
+
+class AesCtrHmacStreamSegmentEncrypter : public StreamSegmentEncrypter {
+ public:
+  // A factory.
+  static util::StatusOr<std::unique_ptr<StreamSegmentEncrypter>> New(
+      const AesCtrHmacStreaming::Params& params,
+      absl::string_view associated_data);
+
+  // Overridden methods of StreamSegmentEncrypter.
+  util::Status EncryptSegment(const std::vector<uint8_t>& plaintext,
+                              bool is_last_segment,
+                              std::vector<uint8_t>* ciphertext_buffer) override;
+
+  const std::vector<uint8_t>& get_header() const override { return header_; }
+  int64_t get_segment_number() const override { return segment_number_; }
+  int get_plaintext_segment_size() const override {
+    return ciphertext_segment_size_ - tag_size_;
+  }
+  int get_ciphertext_segment_size() const override {
+    return ciphertext_segment_size_;
+  }
+  int get_ciphertext_offset() const override { return ciphertext_offset_; }
+  ~AesCtrHmacStreamSegmentEncrypter() override {}
+
+ protected:
+  void IncSegmentNumber() override { segment_number_++; }
+
+ private:
+  AesCtrHmacStreamSegmentEncrypter(absl::string_view key_value,
+                                   absl::string_view header,
+                                   absl::string_view nonce_prefix,
+                                   int ciphertext_segment_size,
+                                   int ciphertext_offset, int tag_size,
+                                   const EVP_CIPHER* cipher,
+                                   std::unique_ptr<Mac> mac)
+      : key_value_(key_value),
+        header_(header.begin(), header.end()),
+        nonce_prefix_(nonce_prefix),
+        ciphertext_segment_size_(ciphertext_segment_size),
+        ciphertext_offset_(ciphertext_offset),
+        tag_size_(tag_size),
+        cipher_(cipher),
+        mac_(std::move(mac)),
+        segment_number_(0) {}
+
+  const std::string key_value_;
+  const std::vector<uint8_t> header_;
+  const std::string nonce_prefix_;
+  const int ciphertext_segment_size_;
+  const int ciphertext_offset_;
+  const int tag_size_;
+  const EVP_CIPHER* cipher_;
+  const std::unique_ptr<Mac> mac_;
+  int64_t segment_number_;
+};
+
+class AesCtrHmacStreamSegmentDecrypter : public StreamSegmentDecrypter {
+ public:
+  // A factory.
+  static util::StatusOr<std::unique_ptr<StreamSegmentDecrypter>> New(
+      const AesCtrHmacStreaming::Params& params,
+      absl::string_view associated_data);
+
+  // Overridden methods of StreamSegmentDecrypter.
+  util::Status Init(const std::vector<uint8_t>& header) override;
+
+  util::Status DecryptSegment(const std::vector<uint8_t>& ciphertext,
+                              int64_t segment_number, bool is_last_segment,
+                              std::vector<uint8_t>* plaintext_buffer) override;
+
+  int get_header_size() const override {
+    return 1 + key_size_ + AesCtrHmacStreaming::kNoncePrefixSizeInBytes;
+  }
+  int get_plaintext_segment_size() const override {
+    return ciphertext_segment_size_ - tag_size_;
+  }
+  int get_ciphertext_segment_size() const override {
+    return ciphertext_segment_size_;
+  }
+  int get_ciphertext_offset() const override { return ciphertext_offset_; }
+  ~AesCtrHmacStreamSegmentDecrypter() override {}
+
+ private:
+  AesCtrHmacStreamSegmentDecrypter(absl::string_view ikm, HashType hkdf_algo,
+                                   int key_size,
+                                   absl::string_view associated_data,
+                                   int ciphertext_segment_size,
+                                   int ciphertext_offset, HashType tag_algo,
+                                   int tag_size)
+      : ikm_(ikm),
+        hkdf_algo_(hkdf_algo),
+        key_size_(key_size),
+        associated_data_(associated_data),
+        ciphertext_segment_size_(ciphertext_segment_size),
+        ciphertext_offset_(ciphertext_offset),
+        tag_algo_(tag_algo),
+        tag_size_(tag_size),
+        is_initialized_(false) {}
+
+  // Parameters set upon decrypter creation.
+  const std::string ikm_;
+  const HashType hkdf_algo_;
+  const int key_size_;
+  const std::string associated_data_;
+  const int ciphertext_segment_size_;
+  const int ciphertext_offset_;
+  const HashType tag_algo_;
+  const int tag_size_;
+  bool is_initialized_;
+
+  // Parameters set when initializing with data from stream header.
+  std::string key_value_;
+  std::string nonce_prefix_;
+  const EVP_CIPHER* cipher_;
+  std::unique_ptr<Mac> mac_;
+};
+
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_SUBTLE_AES_CTR_HMAC_STREAMING_H_
diff --git a/cc/subtle/aes_ctr_hmac_streaming_test.cc b/cc/subtle/aes_ctr_hmac_streaming_test.cc
new file mode 100644
index 0000000..68908d8
--- /dev/null
+++ b/cc/subtle/aes_ctr_hmac_streaming_test.cc
@@ -0,0 +1,486 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "tink/subtle/aes_ctr_hmac_streaming.h"
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "absl/strings/str_cat.h"
+#include "tink/subtle/common_enums.h"
+#include "tink/subtle/random.h"
+#include "tink/subtle/stream_segment_decrypter.h"
+#include "tink/subtle/stream_segment_encrypter.h"
+#include "tink/subtle/streaming_aead_test_util.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/test_matchers.h"
+#include "tink/util/test_util.h"
+
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
+using ::testing::HasSubstr;
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+namespace {
+
+AesCtrHmacStreaming::Params ValidParams() {
+  AesCtrHmacStreaming::Params params;
+  params.ikm = Random::GetRandomBytes(32);
+  params.hkdf_algo = SHA256;
+  params.key_size = 32;
+  params.ciphertext_segment_size = 256;
+  params.ciphertext_offset = 0;
+  params.tag_algo = SHA256;
+  params.tag_size = 16;
+  return params;
+}
+
+TEST(AesCtrHmacStreamSegmentEncrypterTest, Basic) {
+  for (int ikm_size : {16, 32}) {
+    for (HashType hkdf_algo : {SHA1, SHA256, SHA512}) {
+      for (int key_size : {16, 32}) {
+        if (ikm_size < key_size) continue;
+        for (int ciphertext_segment_size : {80, 128, 200}) {
+          for (int ciphertext_offset : {0, 5, 10}) {
+            for (HashType tag_algo : {SHA1, SHA256, SHA512}) {
+              for (int tag_size : {10, 16, 20}) {
+                SCOPED_TRACE(absl::StrCat(
+                    "ikm_size = ", ikm_size, ", hkdf_algo = ",
+                    EnumToString(hkdf_algo), ", key_size = ", key_size,
+                    ", ciphertext_segment_size = ", ciphertext_segment_size,
+                    ", ciphertext_offset = ", ciphertext_offset,
+                    ", tag_algo = ", EnumToString(tag_algo),
+                    ", tag_size = ", tag_size));
+
+                // Construct the parameters.
+                AesCtrHmacStreaming::Params params;
+                params.ikm = Random::GetRandomBytes(ikm_size);
+                params.hkdf_algo = hkdf_algo;
+                params.key_size = key_size;
+                params.ciphertext_segment_size = ciphertext_segment_size;
+                params.ciphertext_offset = ciphertext_offset;
+                params.tag_algo = tag_algo;
+                params.tag_size = tag_size;
+                std::string associated_data = "associated data";
+
+                // Get a segment encrypter.
+                auto enc_result = AesCtrHmacStreamSegmentEncrypter::New(
+                    params, associated_data);
+                ASSERT_THAT(enc_result.status(), IsOk());
+                auto enc = std::move(enc_result.ValueOrDie());
+                EXPECT_EQ(0, enc->get_segment_number());
+                int header_size = 1 + key_size + /* nonce_prefix_size = */ 7;
+                EXPECT_EQ(header_size, enc->get_header().size());
+                EXPECT_EQ(header_size, enc->get_header()[0]);
+                EXPECT_EQ(ciphertext_segment_size,
+                          enc->get_ciphertext_segment_size());
+                EXPECT_EQ(ciphertext_segment_size - tag_size,
+                          enc->get_plaintext_segment_size());
+                EXPECT_EQ(ciphertext_offset, enc->get_ciphertext_offset());
+
+                int segment_number = 0;
+                for (int pt_size :
+                     {0, 1, 10, enc->get_plaintext_segment_size()}) {
+                  for (bool is_last_segment : {false, true}) {
+                    SCOPED_TRACE(
+                        absl::StrCat("plaintext_size = ", pt_size,
+                                     ", is_last_segment = ", is_last_segment));
+                    std::vector<uint8_t> pt(pt_size, 'p');
+                    std::vector<uint8_t> ct;
+                    EXPECT_THAT(enc->EncryptSegment(pt, is_last_segment, &ct),
+                                IsOk());
+                    EXPECT_EQ(ct.size(), pt.size() + tag_size);
+                    segment_number++;
+                    EXPECT_EQ(segment_number, enc->get_segment_number());
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+TEST(AesCtrHmacStreamSegmentEncrypterTest, EncryptLongPlaintext) {
+  AesCtrHmacStreaming::Params params = ValidParams();
+  std::string associated_data = "associated data";
+
+  auto enc_result =
+      AesCtrHmacStreamSegmentEncrypter::New(params, associated_data);
+  ASSERT_THAT(enc_result.status(), IsOk());
+  auto enc = std::move(enc_result.ValueOrDie());
+
+  std::vector<uint8_t> pt(enc->get_plaintext_segment_size() + 1, 'p');
+  std::vector<uint8_t> ct;
+  ASSERT_THAT(
+      enc->EncryptSegment(pt, true, &ct),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("plaintext too long")));
+}
+
+TEST(AesCtrHmacStreamSegmentEncrypterTest, EncryptNullCtBuffer) {
+  AesCtrHmacStreaming::Params params = ValidParams();
+  std::string associated_data = "associated data";
+
+  auto enc_result =
+      AesCtrHmacStreamSegmentEncrypter::New(params, associated_data);
+  ASSERT_THAT(enc_result.status(), IsOk());
+  auto enc = std::move(enc_result.ValueOrDie());
+
+  std::vector<uint8_t> pt(enc->get_plaintext_segment_size(), 'p');
+  ASSERT_THAT(
+      enc->EncryptSegment(pt, true, nullptr),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("must be non-null")));
+}
+
+TEST(AesCtrHmacStreamSegmentDecrypterTest, Basic) {
+  for (int ikm_size : {16, 32}) {
+    for (HashType hkdf_algo : {SHA1, SHA256, SHA512}) {
+      for (int key_size : {16, 32}) {
+        if (ikm_size < key_size) continue;
+        for (int ciphertext_segment_size : {80, 128, 200}) {
+          for (int ciphertext_offset : {0, 5, 10}) {
+            for (HashType tag_algo : {SHA1, SHA256, SHA512}) {
+              for (int tag_size : {10, 16, 20}) {
+                SCOPED_TRACE(absl::StrCat(
+                    "ikm_size = ", ikm_size, ", hkdf_algo = ",
+                    EnumToString(hkdf_algo), ", key_size = ", key_size,
+                    ", ciphertext_segment_size = ", ciphertext_segment_size,
+                    ", ciphertext_offset = ", ciphertext_offset,
+                    ", tag_algo = ", EnumToString(tag_algo),
+                    ", tag_size = ", tag_size));
+
+                // Construct the parameters.
+                AesCtrHmacStreaming::Params params;
+                params.ikm = Random::GetRandomBytes(ikm_size);
+                params.hkdf_algo = hkdf_algo;
+                params.key_size = key_size;
+                params.ciphertext_segment_size = ciphertext_segment_size;
+                params.ciphertext_offset = ciphertext_offset;
+                params.tag_algo = tag_algo;
+                params.tag_size = tag_size;
+                std::string associated_data = "associated data";
+
+                // Get a segment encrypter.
+                auto enc_result = AesCtrHmacStreamSegmentEncrypter::New(
+                    params, associated_data);
+                ASSERT_THAT(enc_result.status(), IsOk());
+                auto enc = std::move(enc_result.ValueOrDie());
+
+                // Get and initialize a segment decrypter.
+                auto dec_result = AesCtrHmacStreamSegmentDecrypter::New(
+                    params, associated_data);
+                ASSERT_THAT(dec_result.status(), IsOk());
+                auto dec = std::move(dec_result.ValueOrDie());
+                ASSERT_THAT(dec->Init(enc->get_header()), IsOk());
+                int header_size = 1 + key_size + /* nonce_prefix_size = */ 7;
+                EXPECT_EQ(header_size, dec->get_header_size());
+                EXPECT_EQ(enc->get_header().size(), dec->get_header_size());
+                EXPECT_EQ(ciphertext_segment_size,
+                          dec->get_ciphertext_segment_size());
+                EXPECT_EQ(ciphertext_segment_size - tag_size,
+                          dec->get_plaintext_segment_size());
+                EXPECT_EQ(ciphertext_offset, dec->get_ciphertext_offset());
+
+                int segment_number = 0;
+                for (int pt_size :
+                     {0, 1, 10, dec->get_plaintext_segment_size()}) {
+                  for (bool is_last_segment : {false, true}) {
+                    SCOPED_TRACE(
+                        absl::StrCat("plaintext_size = ", pt_size,
+                                     ", is_last_segment = ", is_last_segment));
+                    std::vector<uint8_t> pt(pt_size, 'p');
+                    std::vector<uint8_t> ct;
+                    std::vector<uint8_t> decrypted;
+                    auto status = enc->EncryptSegment(pt, is_last_segment, &ct);
+                    EXPECT_THAT(status, IsOk());
+                    EXPECT_EQ(ct.size(), pt.size() + tag_size);
+                    EXPECT_THAT(
+                        dec->DecryptSegment(ct, segment_number, is_last_segment,
+                                            &decrypted),
+                        IsOk());
+                    EXPECT_EQ(pt, decrypted);
+                    segment_number++;
+                    EXPECT_EQ(segment_number, enc->get_segment_number());
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+TEST(AesCtrHmacStreamSegmentDecrypterTest, AlreadyInit) {
+  AesCtrHmacStreaming::Params params = ValidParams();
+  std::string associated_data = "associated data";
+
+  auto enc_result =
+      AesCtrHmacStreamSegmentEncrypter::New(params, associated_data);
+  ASSERT_THAT(enc_result.status(), IsOk());
+  auto enc = std::move(enc_result.ValueOrDie());
+  auto dec_result =
+      AesCtrHmacStreamSegmentDecrypter::New(params, associated_data);
+  ASSERT_THAT(dec_result.status(), IsOk());
+  auto dec = std::move(dec_result.ValueOrDie());
+  ASSERT_THAT(dec->Init(enc->get_header()), IsOk());
+  ASSERT_THAT(dec->Init(enc->get_header()),
+              StatusIs(util::error::FAILED_PRECONDITION,
+                       HasSubstr("alreday initialized")));
+}
+
+TEST(AesCtrHmacStreamSegmentDecrypterTest, InitWrongHeaderSize) {
+  AesCtrHmacStreaming::Params params = ValidParams();
+  std::string associated_data = "associated data";
+
+  auto enc_result =
+      AesCtrHmacStreamSegmentEncrypter::New(params, associated_data);
+  ASSERT_THAT(enc_result.status(), IsOk());
+  auto enc = std::move(enc_result.ValueOrDie());
+  auto dec_result =
+      AesCtrHmacStreamSegmentDecrypter::New(params, associated_data);
+  ASSERT_THAT(dec_result.status(), IsOk());
+  auto dec = std::move(dec_result.ValueOrDie());
+  auto header = enc->get_header();
+  header.resize(dec->get_header_size() - 1);
+  ASSERT_THAT(dec->Init(header), StatusIs(util::error::INVALID_ARGUMENT,
+                                          HasSubstr("wrong header size")));
+}
+
+TEST(AesCtrHmacStreamSegmentDecrypterTest, InitCorruptedHeader) {
+  AesCtrHmacStreaming::Params params = ValidParams();
+  std::string associated_data = "associated data";
+
+  auto enc_result =
+      AesCtrHmacStreamSegmentEncrypter::New(params, associated_data);
+  ASSERT_THAT(enc_result.status(), IsOk());
+  auto enc = std::move(enc_result.ValueOrDie());
+  auto dec_result =
+      AesCtrHmacStreamSegmentDecrypter::New(params, associated_data);
+  ASSERT_THAT(dec_result.status(), IsOk());
+  auto dec = std::move(dec_result.ValueOrDie());
+  auto header = enc->get_header();
+  header[0] = 0;
+  ASSERT_THAT(dec->Init(header), StatusIs(util::error::INVALID_ARGUMENT,
+                                          HasSubstr("corrupted header")));
+}
+
+TEST(AesCtrHmacStreamSegmentDecrypterTest, DecryptNotInit) {
+  AesCtrHmacStreaming::Params params = ValidParams();
+  std::string associated_data = "associated data";
+
+  auto enc_result =
+      AesCtrHmacStreamSegmentEncrypter::New(params, associated_data);
+  ASSERT_THAT(enc_result.status(), IsOk());
+  auto enc = std::move(enc_result.ValueOrDie());
+  auto dec_result =
+      AesCtrHmacStreamSegmentDecrypter::New(params, associated_data);
+  ASSERT_THAT(dec_result.status(), IsOk());
+  auto dec = std::move(dec_result.ValueOrDie());
+
+  std::vector<uint8_t> ct(dec->get_ciphertext_segment_size(), 'c');
+  std::vector<uint8_t> pt;
+  ASSERT_THAT(
+      dec->DecryptSegment(ct, 0, true, &pt),
+      StatusIs(util::error::FAILED_PRECONDITION, HasSubstr("not initialized")));
+}
+
+TEST(AesCtrHmacStreamSegmentDecrypterTest, DecryptLongCiphertext) {
+  AesCtrHmacStreaming::Params params = ValidParams();
+  std::string associated_data = "associated data";
+
+  auto enc_result =
+      AesCtrHmacStreamSegmentEncrypter::New(params, associated_data);
+  ASSERT_THAT(enc_result.status(), IsOk());
+  auto enc = std::move(enc_result.ValueOrDie());
+  auto dec_result =
+      AesCtrHmacStreamSegmentDecrypter::New(params, associated_data);
+  ASSERT_THAT(dec_result.status(), IsOk());
+  auto dec = std::move(dec_result.ValueOrDie());
+  ASSERT_THAT(dec->Init(enc->get_header()), IsOk());
+
+  std::vector<uint8_t> ct(dec->get_ciphertext_segment_size() + 1, 'c');
+  std::vector<uint8_t> pt;
+  ASSERT_THAT(dec->DecryptSegment(ct, 0, true, &pt),
+              StatusIs(util::error::INVALID_ARGUMENT,
+                       HasSubstr("ciphertext too long")));
+}
+
+TEST(AesCtrHmacStreamSegmentDecrypterTest, DecryptNullPtBuffer) {
+  AesCtrHmacStreaming::Params params = ValidParams();
+  std::string associated_data = "associated data";
+
+  auto enc_result =
+      AesCtrHmacStreamSegmentEncrypter::New(params, associated_data);
+  ASSERT_THAT(enc_result.status(), IsOk());
+  auto enc = std::move(enc_result.ValueOrDie());
+  auto dec_result =
+      AesCtrHmacStreamSegmentDecrypter::New(params, associated_data);
+  ASSERT_THAT(dec_result.status(), IsOk());
+  auto dec = std::move(dec_result.ValueOrDie());
+  ASSERT_THAT(dec->Init(enc->get_header()), IsOk());
+
+  std::vector<uint8_t> ct(dec->get_ciphertext_segment_size(), 'c');
+  ASSERT_THAT(
+      dec->DecryptSegment(ct, 0, true, nullptr),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("must be non-null")));
+}
+
+TEST(AesCtrHmacStreamingTest, Basic) {
+  for (int ikm_size : {16, 32}) {
+    for (HashType hkdf_algo : {SHA1, SHA256, SHA512}) {
+      for (int key_size : {16, 32}) {
+        if (ikm_size < key_size) continue;
+        for (int ciphertext_segment_size : {80, 128, 200}) {
+          for (int ciphertext_offset : {0, 5, 10}) {
+            for (HashType tag_algo : {SHA1, SHA256, SHA512}) {
+              for (int tag_size : {10, 16, 20}) {
+                for (int plaintext_size : {0, 10, 100, 1000}) {
+                  SCOPED_TRACE(absl::StrCat(
+                      "ikm_size = ", ikm_size, ", hkdf_algo = ",
+                      EnumToString(hkdf_algo), ", key_size = ", key_size,
+                      ", ciphertext_segment_size = ", ciphertext_segment_size,
+                      ", ciphertext_offset = ", ciphertext_offset,
+                      ", tag_algo = ", EnumToString(tag_algo), ", tag_size = ",
+                      tag_size, ", plaintext_size = ", plaintext_size));
+
+                  // Create AesCtrHmacStreaming.
+                  AesCtrHmacStreaming::Params params;
+                  params.ikm = Random::GetRandomBytes(ikm_size);
+                  params.hkdf_algo = hkdf_algo;
+                  params.key_size = key_size;
+                  params.ciphertext_segment_size = ciphertext_segment_size;
+                  params.ciphertext_offset = ciphertext_offset;
+                  params.tag_algo = tag_algo;
+                  params.tag_size = tag_size;
+                  auto result = AesCtrHmacStreaming::New(params);
+                  ASSERT_THAT(result.status(), IsOk());
+                  auto streaming_aead = std::move(result.ValueOrDie());
+
+                  std::string plaintext(plaintext_size, 'p');
+                  std::string associated_data = "associated data";
+
+                  EXPECT_THAT(
+                      EncryptThenDecrypt(streaming_aead.get(),
+                                         streaming_aead.get(), plaintext,
+                                         associated_data, ciphertext_offset),
+                      IsOk());
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+TEST(ValidateTest, ValidParams) {
+  AesCtrHmacStreaming::Params params = ValidParams();
+  ASSERT_THAT(AesCtrHmacStreaming::New(params).status(), IsOk());
+}
+
+TEST(ValidateTest, WrongIkm) {
+  AesCtrHmacStreaming::Params params = ValidParams();
+  params.ikm = Random::GetRandomBytes(16);
+  ASSERT_THAT(AesCtrHmacStreaming::New(params).status(),
+              StatusIs(util::error::INVALID_ARGUMENT,
+                       HasSubstr("key material too small")));
+}
+
+TEST(ValidateTest, WrongHkdfAlgo) {
+  AesCtrHmacStreaming::Params params = ValidParams();
+  params.hkdf_algo = SHA384;
+  ASSERT_THAT(AesCtrHmacStreaming::New(params).status(),
+              StatusIs(util::error::INVALID_ARGUMENT,
+                       HasSubstr("unsupported hkdf_algo")));
+}
+
+TEST(ValidateTest, WrongKeySize) {
+  AesCtrHmacStreaming::Params params = ValidParams();
+  params.ikm = Random::GetRandomBytes(64);
+  params.key_size = 64;
+  ASSERT_THAT(
+      AesCtrHmacStreaming::New(params).status(),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("key_size must be")));
+}
+
+TEST(ValidateTest, WrongCtSegmentSize) {
+  AesCtrHmacStreaming::Params params = ValidParams();
+  params.ciphertext_segment_size = 10;
+  ASSERT_THAT(AesCtrHmacStreaming::New(params).status(),
+              StatusIs(util::error::INVALID_ARGUMENT,
+                       HasSubstr("ciphertext_segment_size too small")));
+
+  params.ciphertext_segment_size = 1 + 32 + 7 + 16;
+  ASSERT_THAT(AesCtrHmacStreaming::New(params).status(),
+              StatusIs(util::error::INVALID_ARGUMENT,
+                       HasSubstr("ciphertext_segment_size too small")));
+}
+
+TEST(ValidateTest, WrongCtOffset) {
+  AesCtrHmacStreaming::Params params = ValidParams();
+  params.ciphertext_offset = -10;
+  ASSERT_THAT(AesCtrHmacStreaming::New(params).status(),
+              StatusIs(util::error::INVALID_ARGUMENT,
+                       HasSubstr("ciphertext_offset must be")));
+}
+
+TEST(ValidateTest, WrongTagSize) {
+  AesCtrHmacStreaming::Params params = ValidParams();
+  params.tag_size = 5;
+  ASSERT_THAT(
+      AesCtrHmacStreaming::New(params).status(),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("tag_size too small")));
+
+  params.tag_algo = SHA1;
+  params.tag_size = 21;
+  ASSERT_THAT(
+      AesCtrHmacStreaming::New(params).status(),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("tag_size too big")));
+
+  params.tag_algo = SHA256;
+  params.tag_size = 33;
+  ASSERT_THAT(
+      AesCtrHmacStreaming::New(params).status(),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("tag_size too big")));
+
+  params.tag_algo = SHA512;
+  params.tag_size = 65;
+  ASSERT_THAT(
+      AesCtrHmacStreaming::New(params).status(),
+      StatusIs(util::error::INVALID_ARGUMENT, HasSubstr("tag_size too big")));
+}
+
+TEST(ValidateTest, WrongTagAlgo) {
+  AesCtrHmacStreaming::Params params = ValidParams();
+  params.tag_algo = SHA384;
+  ASSERT_THAT(AesCtrHmacStreaming::New(params).status(),
+              StatusIs(util::error::INVALID_ARGUMENT,
+                       HasSubstr("unsupported tag_algo")));
+}
+
+}  // namespace
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/aes_gcm_boringssl.cc b/cc/subtle/aes_gcm_boringssl.cc
index ab839f6..bf9558c 100644
--- a/cc/subtle/aes_gcm_boringssl.cc
+++ b/cc/subtle/aes_gcm_boringssl.cc
@@ -21,6 +21,8 @@
 
 #include "tink/aead.h"
 #include "tink/subtle/random.h"
+#include "tink/subtle/subtle_util.h"
+#include "tink/subtle/subtle_util_boringssl.h"
 #include "tink/util/errors.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
@@ -32,19 +34,9 @@
 namespace tink {
 namespace subtle {
 
-static const EVP_AEAD* GetAeadForKeySize(uint32_t size_in_bytes) {
-  switch (size_in_bytes) {
-    case 16:
-      return EVP_aead_aes_128_gcm();
-    case 32:
-      return EVP_aead_aes_256_gcm();
-    default:
-      return nullptr;
-  }
-}
-
 util::Status AesGcmBoringSsl::Init(absl::string_view key_value) {
-  const EVP_AEAD* aead = GetAeadForKeySize(key_value.size());
+  const EVP_AEAD* aead =
+      SubtleUtilBoringSSL::GetAesGcmAeadForKeySize(key_value.size());
   if (aead == nullptr) {
     return util::Status(util::error::INTERNAL, "invalid key size");
   }
@@ -69,21 +61,20 @@
 
 util::StatusOr<std::string> AesGcmBoringSsl::Encrypt(
     absl::string_view plaintext, absl::string_view additional_data) const {
-  const std::string iv = Random::GetRandomBytes(IV_SIZE_IN_BYTES);
-  // TODO(bleichen): Check if it is OK to work on a std::string.
-  //   This is unclear since some compiler may use copy-on-write.
-  std::vector<uint8_t> ct(iv.size() + plaintext.size() + TAG_SIZE_IN_BYTES);
-  memcpy(ct.data(), iv.data(), iv.size());
+  std::string result = Random::GetRandomBytes(IV_SIZE_IN_BYTES);
+  ResizeStringUninitialized(
+      &result, IV_SIZE_IN_BYTES + plaintext.size() + TAG_SIZE_IN_BYTES);
   size_t len;
   if (EVP_AEAD_CTX_seal(
-          ctx_.get(), ct.data() + iv.size(), &len, ct.size() - iv.size(),
-          reinterpret_cast<const uint8_t*>(iv.data()), iv.size(),
+          ctx_.get(), reinterpret_cast<uint8_t*>(&result[IV_SIZE_IN_BYTES]),
+          &len, plaintext.size() + TAG_SIZE_IN_BYTES,
+          reinterpret_cast<const uint8_t*>(&result[0]), IV_SIZE_IN_BYTES,
           reinterpret_cast<const uint8_t*>(plaintext.data()), plaintext.size(),
           reinterpret_cast<const uint8_t*>(additional_data.data()),
           additional_data.size()) != 1) {
     return util::Status(util::error::INTERNAL, "Encryption failed");
   }
-  return std::string(reinterpret_cast<const char*>(ct.data()), iv.size() + len);
+  return result;
 }
 
 util::StatusOr<std::string> AesGcmBoringSsl::Decrypt(
@@ -92,11 +83,13 @@
     return util::Status(util::error::INTERNAL, "Ciphertext too short");
   }
 
-  std::vector<uint8_t> pt(ciphertext.size() - IV_SIZE_IN_BYTES -
-                          TAG_SIZE_IN_BYTES);
+  std::string result;
+  ResizeStringUninitialized(
+      &result, ciphertext.size() - IV_SIZE_IN_BYTES - TAG_SIZE_IN_BYTES);
   size_t len;
   if (EVP_AEAD_CTX_open(
-          ctx_.get(), pt.data(), &len, pt.size(),
+          ctx_.get(), reinterpret_cast<uint8_t*>(&result[0]), &len,
+          result.size(),
           // The nonce is the first |IV_SIZE_IN_BYTES| bytes of |ciphertext|.
           reinterpret_cast<const uint8_t*>(ciphertext.data()), IV_SIZE_IN_BYTES,
           // The input is the remainder.
@@ -107,7 +100,7 @@
           additional_data.size()) != 1) {
     return util::Status(util::error::INTERNAL, "Authentication failed");
   }
-  return std::string(reinterpret_cast<const char*>(pt.data()), len);
+  return result;
 }
 
 }  // namespace subtle
diff --git a/cc/subtle/aes_gcm_hkdf_stream_segment_decrypter.cc b/cc/subtle/aes_gcm_hkdf_stream_segment_decrypter.cc
new file mode 100644
index 0000000..5ad9a2d
--- /dev/null
+++ b/cc/subtle/aes_gcm_hkdf_stream_segment_decrypter.cc
@@ -0,0 +1,212 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/subtle/aes_gcm_hkdf_stream_segment_decrypter.h"
+
+#include <limits>
+#include <string>
+#include <vector>
+
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "tink/subtle/aes_gcm_hkdf_stream_segment_encrypter.h"
+#include "tink/subtle/common_enums.h"
+#include "tink/subtle/hkdf.h"
+#include "tink/subtle/random.h"
+#include "tink/subtle/stream_segment_decrypter.h"
+#include "tink/subtle/subtle_util_boringssl.h"
+#include "tink/util/errors.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "openssl/aead.h"
+#include "openssl/err.h"
+
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+
+namespace {
+
+void BigEndianStore32(uint8_t dst[8], uint32_t val) {
+  dst[0] = (val >> 24) & 0xff;
+  dst[1] = (val >> 16) & 0xff;
+  dst[2] = (val >> 8) & 0xff;
+  dst[3] = val & 0xff;
+}
+
+}  // namespace
+
+util::Status Validate(const AesGcmHkdfStreamSegmentDecrypter::Params& params) {
+  if (!(params.hkdf_hash == SHA1 || params.hkdf_hash == SHA256 ||
+        params.hkdf_hash == SHA512)) {
+    return util::Status(util::error::INVALID_ARGUMENT, "unsupported hkdf_hash");
+  }
+  if (params.derived_key_size != 16 && params.derived_key_size != 32) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "derived_key_size must be 16 or 32");
+  }
+  if (params.ikm.size() < 16 || params.ikm.size() < params.derived_key_size) {
+    return util::Status(util::error::INVALID_ARGUMENT, "ikm too small");
+  }
+  if (params.ciphertext_offset < 0) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "ciphertext_offset must be non-negative");
+  }
+  int header_size = 1 + params.derived_key_size +
+                    AesGcmHkdfStreamSegmentEncrypter::kNoncePrefixSizeInBytes;
+  if (params.ciphertext_segment_size <=
+      params.ciphertext_offset + header_size +
+      AesGcmHkdfStreamSegmentEncrypter::kTagSizeInBytes) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "ciphertext_segment_size too small");
+  }
+  return util::OkStatus();
+}
+
+// static
+util::StatusOr<std::unique_ptr<StreamSegmentDecrypter>>
+    AesGcmHkdfStreamSegmentDecrypter::New(const Params& params) {
+  auto status = Validate(params);
+  if (!status.ok()) return status;
+
+  std::unique_ptr<AesGcmHkdfStreamSegmentDecrypter>
+      decrypter(new AesGcmHkdfStreamSegmentDecrypter());
+  decrypter->ikm_ = params.ikm;
+  decrypter->hkdf_hash_ = params.hkdf_hash;
+  int header_size = 1 + params.derived_key_size +
+                    AesGcmHkdfStreamSegmentEncrypter::kNoncePrefixSizeInBytes;
+  decrypter->header_size_ = header_size;
+  decrypter->ciphertext_offset_ = params.ciphertext_offset;
+  decrypter->ciphertext_segment_size_ = params.ciphertext_segment_size;
+  decrypter->derived_key_size_ = params.derived_key_size;
+  decrypter->associated_data_ = params.associated_data;
+  decrypter->is_initialized_ = false;
+
+  return {std::move(decrypter)};
+}
+
+util::Status AesGcmHkdfStreamSegmentDecrypter::Init(
+    const std::vector<uint8_t>& header) {
+  if (is_initialized_) {
+    return util::Status(util::error::FAILED_PRECONDITION,
+                        "decrypter already initialized");
+  }
+  if (header.size() != header_size_) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+        absl::StrCat("wrong header size, expected ", header_size_, " bytes"));
+  }
+  if (header[0] != header_size_) {
+    return util::Status(util::error::INVALID_ARGUMENT, "corrupted header");
+  }
+
+  // Extract salt and nonce_prefix.
+  salt_.resize(derived_key_size_);
+  nonce_prefix_.resize(
+      AesGcmHkdfStreamSegmentEncrypter::kNoncePrefixSizeInBytes);
+  memcpy(salt_.data(), header.data() + 1, derived_key_size_);
+  memcpy(nonce_prefix_.data(), header.data() + 1 + derived_key_size_,
+         AesGcmHkdfStreamSegmentEncrypter::kNoncePrefixSizeInBytes);
+
+  // Derive symmetric key.
+  auto hkdf_result = Hkdf::ComputeHkdf(
+      hkdf_hash_, ikm_,
+      std::string(reinterpret_cast<const char *>(salt_.data()), derived_key_size_),
+      associated_data_, derived_key_size_);
+  if (!hkdf_result.ok()) return hkdf_result.status();
+  key_value_ = hkdf_result.ValueOrDie();
+
+  // Initialize ctx_.
+  const EVP_AEAD* aead =
+      SubtleUtilBoringSSL::GetAesGcmAeadForKeySize(key_value_.size());
+  if (aead == nullptr) {
+    return util::Status(util::error::INTERNAL, "invalid key size");
+  }
+  if (EVP_AEAD_CTX_init(ctx_.get(),
+                        aead,
+                        reinterpret_cast<const uint8_t*>(key_value_.data()),
+                        key_value_.size(),
+                        AesGcmHkdfStreamSegmentEncrypter::kTagSizeInBytes,
+                        nullptr) != 1) {
+    return util::Status(util::error::INTERNAL,
+                        "could not initialize EVP_AEAD_CTX");
+  }
+  is_initialized_ = true;
+  return util::OkStatus();
+}
+
+int AesGcmHkdfStreamSegmentDecrypter::get_plaintext_segment_size() const {
+  return ciphertext_segment_size_ -
+      AesGcmHkdfStreamSegmentEncrypter::kTagSizeInBytes;
+}
+
+util::Status AesGcmHkdfStreamSegmentDecrypter::DecryptSegment(
+    const std::vector<uint8_t>& ciphertext,
+    int64_t segment_number,
+    bool is_last_segment,
+    std::vector<uint8_t>* plaintext_buffer) {
+  if (!is_initialized_) {
+    return util::Status(util::error::FAILED_PRECONDITION,
+                        "decrypter not initialized");
+  }
+  if (ciphertext.size() > get_ciphertext_segment_size()) {
+    return util::Status(util::error::INVALID_ARGUMENT, "ciphertext too long");
+  }
+  if (ciphertext.size() < AesGcmHkdfStreamSegmentEncrypter::kTagSizeInBytes) {
+    return util::Status(util::error::INVALID_ARGUMENT, "ciphertext too short");
+  }
+  if (plaintext_buffer == nullptr) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "plaintext_buffer must be non-null");
+  }
+  if (segment_number > std::numeric_limits<uint32_t>::max() ||
+      (segment_number == std::numeric_limits<uint32_t>::max() &&
+       !is_last_segment)) {
+    return util::Status(util::error::INVALID_ARGUMENT, "too many segments");
+  }
+
+  int pt_size =
+      ciphertext.size() - AesGcmHkdfStreamSegmentEncrypter::kTagSizeInBytes;
+  plaintext_buffer->resize(pt_size);
+
+  // Construct IV.
+  std::vector<uint8_t> iv(AesGcmHkdfStreamSegmentEncrypter::kNonceSizeInBytes);
+  memcpy(iv.data(), nonce_prefix_.data(),
+         AesGcmHkdfStreamSegmentEncrypter::kNoncePrefixSizeInBytes);
+  BigEndianStore32(
+      iv.data() + AesGcmHkdfStreamSegmentEncrypter::kNoncePrefixSizeInBytes,
+      static_cast<uint32_t>(segment_number));
+  iv.back() = is_last_segment ? 1 : 0;
+
+  // Decrypt.
+  size_t out_len;
+  if (!EVP_AEAD_CTX_open(
+          ctx_.get(), plaintext_buffer->data(), &out_len,
+          plaintext_buffer->size(),
+          iv.data(), iv.size(),
+          ciphertext.data(), ciphertext.size(),
+          /* ad = */ nullptr, /* ad.length() = */ 0)) {
+    return util::Status(util::error::INTERNAL,
+                        absl::StrCat("Decryption failed: ",
+                                     SubtleUtilBoringSSL::GetErrors()));
+  }
+  return util::OkStatus();
+}
+
+
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/aes_gcm_hkdf_stream_segment_decrypter.h b/cc/subtle/aes_gcm_hkdf_stream_segment_decrypter.h
new file mode 100644
index 0000000..6634aa6
--- /dev/null
+++ b/cc/subtle/aes_gcm_hkdf_stream_segment_decrypter.h
@@ -0,0 +1,124 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_SUBTLE_AES_GCM_HKDF_STREAM_SEGMENT_DECRYPTER_H_
+#define TINK_SUBTLE_AES_GCM_HKDF_STREAM_SEGMENT_DECRYPTER_H_
+
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "openssl/aead.h"
+#include "tink/subtle/common_enums.h"
+#include "tink/subtle/stream_segment_decrypter.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+
+// StreamSegmentDecrypter for streaming decryption using AES-GCM with HKDF as
+// key derivation function.
+//
+// Each ciphertext uses a new AES-GCM key that is derived from the key
+// derivation key, a randomly chosen salt of the same size as the key and a
+// nonce prefix.
+//
+// The format of a ciphertext is
+//   other || header || segment_0 || segment_1 || ... || segment_k.
+// where:
+//  - segment_i is the i-th segment of the ciphertext.
+//  - the size of segment_1 .. segment_{k-1} is get_ciphertext_segment_size()
+//  - segment_0 is shorter, so that segment_0, the header, and other information
+//    of size get_ciphertext_offset() align with get_ciphertext_segment_size().
+//
+// The format of the header is
+//   header_size || salt || nonce_prefix
+// where
+//  - header_size is 1 byte determining the size of the header
+//  - salt is a salt used in the key derivation
+//  - nonce_prefix is the prefix of the nonce
+//
+// In principle header_size is redundant information, since the length of the
+// header can be determined from the key size.
+
+class AesGcmHkdfStreamSegmentDecrypter : public StreamSegmentDecrypter {
+ public:
+  // All sizes are in bytes.
+  struct Params {
+    std::string ikm;
+    HashType hkdf_hash;
+    int derived_key_size;
+    int ciphertext_offset;
+    int ciphertext_segment_size;
+    std::string associated_data;
+  };
+
+  // A factory.
+  static util::StatusOr<std::unique_ptr<StreamSegmentDecrypter>>
+      New(const Params& params);
+
+  // Overridden methods of StreamSegmentDecrypter.
+  util::Status Init(const std::vector<uint8_t>& header) override;
+
+  util::Status DecryptSegment(
+      const std::vector<uint8_t>& ciphertext,
+      int64_t segment_number,
+      bool is_last_segment,
+      std::vector<uint8_t>* plaintext_buffer) override;
+
+  int get_header_size() const override {
+    return header_size_;
+  }
+
+  int get_plaintext_segment_size() const override;
+
+  int get_ciphertext_segment_size() const override {
+    return ciphertext_segment_size_;
+  }
+  int get_ciphertext_offset() const override {
+    return ciphertext_offset_;
+  }
+  ~AesGcmHkdfStreamSegmentDecrypter() override {}
+  util::Status InitCtx(absl::string_view key_value);
+
+
+ private:
+  AesGcmHkdfStreamSegmentDecrypter() {}
+
+  // Parameters set upon decrypter creation.
+  // All sizes are in bytes.
+  std::string ikm_;
+  HashType hkdf_hash_;
+  int header_size_;
+  int ciphertext_segment_size_;
+  int ciphertext_offset_;
+  int derived_key_size_;
+  std::string associated_data_;
+  bool is_initialized_;
+
+  // Parameters set when initializing with data from stream header.
+  std::vector<uint8_t> salt_;
+  std::vector<uint8_t> nonce_prefix_;
+  std::string key_value_;
+  bssl::ScopedEVP_AEAD_CTX ctx_;
+};
+
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_SUBTLE_AES_GCM_HKDF_STREAM_SEGMENT_DECRYPTER_H_
diff --git a/cc/subtle/aes_gcm_hkdf_stream_segment_decrypter_test.cc b/cc/subtle/aes_gcm_hkdf_stream_segment_decrypter_test.cc
new file mode 100644
index 0000000..0ea741b
--- /dev/null
+++ b/cc/subtle/aes_gcm_hkdf_stream_segment_decrypter_test.cc
@@ -0,0 +1,269 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "tink/subtle/aes_gcm_hkdf_stream_segment_decrypter.h"
+
+#include <string>
+#include <vector>
+
+#include "absl/strings/str_cat.h"
+#include "tink/subtle/aes_gcm_hkdf_stream_segment_encrypter.h"
+#include "tink/subtle/common_enums.h"
+#include "tink/subtle/hkdf.h"
+#include "tink/subtle/random.h"
+#include "tink/subtle/stream_segment_encrypter.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/test_util.h"
+#include "gtest/gtest.h"
+
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+namespace {
+
+util::StatusOr<std::unique_ptr<StreamSegmentEncrypter>>
+GetEncrypter(absl::string_view ikm,
+             HashType hkdf_hash,
+             int derived_key_size,
+             int ciphertext_offset,
+             int ciphertext_segment_size,
+             absl::string_view associated_data) {
+  AesGcmHkdfStreamSegmentEncrypter::Params params;
+  params.salt = Random::GetRandomBytes(derived_key_size);
+  auto hkdf_result = Hkdf::ComputeHkdf(
+      hkdf_hash, ikm, params.salt, associated_data,
+      derived_key_size);
+  if (!hkdf_result.ok()) return hkdf_result.status();
+  params.key_value = hkdf_result.ValueOrDie();
+  params.ciphertext_offset = ciphertext_offset;
+  params.ciphertext_segment_size = ciphertext_segment_size;
+  return AesGcmHkdfStreamSegmentEncrypter::New(params);
+}
+
+TEST(AesGcmHkdfStreamSegmentDecrypterTest, testBasic) {
+  for (int ikm_size : {16, 32}) {
+    for (HashType hkdf_hash : {SHA1, SHA256, SHA512}) {
+      for (int derived_key_size = 16;
+           derived_key_size <= ikm_size;
+           derived_key_size += 16) {
+        for (int ciphertext_offset : {0, 5, 10}) {
+          for (int ct_segment_size : {80, 128, 200}) {
+            for (std::string associated_data : {"associated data", "42", ""}) {
+              SCOPED_TRACE(absl::StrCat(
+                  "hkdf_hash = ", EnumToString(hkdf_hash),
+                  ", ikm_size = ", ikm_size,
+                  ", associated_data = '", associated_data, "'",
+                  ", derived_key_size = ", derived_key_size,
+                  ", ciphertext_offset = ", ciphertext_offset,
+                  ", ciphertext_segment_size = ", ct_segment_size));
+
+              // Construct a decrypter.
+              AesGcmHkdfStreamSegmentDecrypter::Params params;
+              params.ikm = Random::GetRandomBytes(ikm_size);
+              params.hkdf_hash = hkdf_hash;
+              params.derived_key_size = derived_key_size;
+              params.ciphertext_offset = ciphertext_offset;
+              params.ciphertext_segment_size = ct_segment_size;
+              params.associated_data = associated_data;
+              auto result = AesGcmHkdfStreamSegmentDecrypter::New(params);
+              EXPECT_TRUE(result.ok()) << result.status();
+              auto dec = std::move(result.ValueOrDie());
+
+              // Try to use the decrypter.
+              std::vector<uint8_t> pt;
+              auto status = dec->DecryptSegment(pt, 42, false, nullptr);
+              EXPECT_FALSE(status.ok());
+              EXPECT_EQ(util::error::FAILED_PRECONDITION, status.error_code());
+              EXPECT_PRED_FORMAT2(testing::IsSubstring, "not initialized",
+                                  status.error_message());
+
+              // Get an encrypter and initialize the decrypter.
+              auto enc = std::move(
+                  GetEncrypter(params.ikm, hkdf_hash, derived_key_size,
+                               ciphertext_offset, ct_segment_size,
+                               associated_data).ValueOrDie());
+              status = dec->Init(enc->get_header());
+              EXPECT_TRUE(status.ok()) << status;
+
+              // Use the constructed decrypter.
+              int header_size =
+                  derived_key_size + /* nonce_prefix_size = */ 7 + 1;
+              EXPECT_EQ(header_size, dec->get_header_size());
+              EXPECT_EQ(enc->get_header().size(), dec->get_header_size());
+              EXPECT_EQ(ct_segment_size, dec->get_ciphertext_segment_size());
+              EXPECT_EQ(ct_segment_size - /* tag_size = */ 16,
+                        dec->get_plaintext_segment_size());
+              EXPECT_EQ(ciphertext_offset, dec->get_ciphertext_offset());
+              int segment_number = 0;
+              for (int pt_size : {1, 10, dec->get_plaintext_segment_size()}) {
+                for (bool is_last_segment : {false, true}) {
+                  SCOPED_TRACE(absl::StrCat(
+                      "plaintext_size = ", pt_size,
+                      ", is_last_segment = ", is_last_segment));
+                  std::vector<uint8_t> pt(pt_size, 'p');
+                  std::vector<uint8_t> ct;
+                  std::vector<uint8_t> decrypted;
+                  auto status = enc->EncryptSegment(pt, is_last_segment, &ct);
+                  EXPECT_TRUE(status.ok()) << status;
+                  status = dec->DecryptSegment(ct, segment_number,
+                                               is_last_segment, &decrypted);
+                  EXPECT_TRUE(status.ok()) << status;
+                  EXPECT_EQ(pt, decrypted);
+                  segment_number++;
+                  EXPECT_EQ(segment_number, enc->get_segment_number());
+                }
+              }
+
+              // Try decryption with wrong params.
+              std::vector<uint8_t> ct(
+                  dec->get_ciphertext_segment_size() + 1, 'c');
+              status = dec->DecryptSegment(ct, 42, true, nullptr);
+              EXPECT_FALSE(status.ok());
+              EXPECT_PRED_FORMAT2(testing::IsSubstring, "ciphertext too long",
+                                  status.error_message());
+              ct.resize(dec->get_plaintext_segment_size());
+              status = dec->DecryptSegment(ct, 42, true, nullptr);
+              EXPECT_FALSE(status.ok());
+              EXPECT_PRED_FORMAT2(testing::IsSubstring, "must be non-null",
+                                  status.error_message());
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+
+TEST(AesGcmHkdfStreamSegmentDecrypterTest, testWrongDerivedKeySize) {
+  for (int derived_key_size : {12, 24, 64}) {
+    for (HashType hkdf_hash : {SHA1, SHA256, SHA512}) {
+      for (int ct_segment_size : {128, 200}) {
+        SCOPED_TRACE(absl::StrCat(
+            "derived_key_size = ", derived_key_size,
+            ", hkdf_hash = ", EnumToString(hkdf_hash),
+            ", ciphertext_segment_size = ", ct_segment_size));
+        AesGcmHkdfStreamSegmentDecrypter::Params params;
+        params.ikm = Random::GetRandomBytes(derived_key_size);
+        params.hkdf_hash = hkdf_hash;
+        params.derived_key_size = derived_key_size;
+        params.ciphertext_offset = 0;
+        params.ciphertext_segment_size = ct_segment_size;
+        params.associated_data = "associated data";
+        auto result = AesGcmHkdfStreamSegmentDecrypter::New(params);
+        EXPECT_FALSE(result.ok());
+        EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
+        EXPECT_PRED_FORMAT2(testing::IsSubstring, "must be 16 or 32",
+                            result.status().error_message());
+      }
+    }
+  }
+}
+
+TEST(AesGcmHkdfStreamSegmentDecrypterTest, testWrongIkmSize) {
+  for (int derived_key_size : {16, 32}) {
+    for (HashType hkdf_hash : {SHA1, SHA256, SHA512}) {
+      for (int ikm_size_delta : {-8, -4, -2, -1}) {
+        SCOPED_TRACE(absl::StrCat(
+            "derived_key_size = ", derived_key_size,
+            ", hkdf_hash = ", EnumToString(hkdf_hash),
+            ", ikm_size_delta = ", ikm_size_delta));
+        AesGcmHkdfStreamSegmentDecrypter::Params params;
+        params.ikm = Random::GetRandomBytes(derived_key_size + ikm_size_delta);
+        params.hkdf_hash = hkdf_hash;
+        params.derived_key_size = derived_key_size;
+        params.ciphertext_offset = 0;
+        params.ciphertext_segment_size = 128;
+        params.associated_data = "associated data";
+        auto result = AesGcmHkdfStreamSegmentDecrypter::New(params);
+        EXPECT_FALSE(result.ok());
+        EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
+        EXPECT_PRED_FORMAT2(testing::IsSubstring, "ikm too small",
+                            result.status().error_message());
+      }
+    }
+  }
+}
+
+TEST(AesGcmHkdfStreamSegmentDecrypterTest, testWrongCiphertextOffset) {
+  for (int derived_key_size : {16, 32}) {
+    for (HashType hkdf_hash : {SHA1, SHA256, SHA512}) {
+      for (int ciphertext_offset : {-16, -10, -3, -1}) {
+        SCOPED_TRACE(absl::StrCat(
+            "derived_key_size = ", derived_key_size,
+            ", hkdf_hash = ", EnumToString(hkdf_hash),
+            ", ciphertext_offset = ", ciphertext_offset));
+        AesGcmHkdfStreamSegmentDecrypter::Params params;
+        params.ikm = Random::GetRandomBytes(derived_key_size);
+        params.hkdf_hash = hkdf_hash;
+        params.derived_key_size = derived_key_size;
+        params.ciphertext_offset = ciphertext_offset;
+        params.ciphertext_segment_size = 128;
+        params.associated_data = "associated data";
+        auto result = AesGcmHkdfStreamSegmentDecrypter::New(params);
+        EXPECT_FALSE(result.ok());
+        EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
+        EXPECT_PRED_FORMAT2(testing::IsSubstring, "must be non-negative",
+                            result.status().error_message());
+      }
+    }
+  }
+}
+
+TEST(AesGcmHkdfStreamSegmentDecrypterTest, testWrongCiphertextSegmentSize) {
+  for (int derived_key_size : {16, 32}) {
+    for (HashType hkdf_hash : {SHA1, SHA256, SHA512}) {
+      for (int ciphertext_offset : {0, 1, 5, 10}) {
+        int min_ct_segment_size = derived_key_size + ciphertext_offset +
+                                  8 +   // nonce_prefix_size + 1
+                                  16 +   // tag_size
+                                  1;
+
+        for (int ct_segment_size : {min_ct_segment_size - 5,
+                min_ct_segment_size - 1, min_ct_segment_size,
+                min_ct_segment_size + 1, min_ct_segment_size + 10}) {
+          SCOPED_TRACE(absl::StrCat(
+              "derived_key_size = ", derived_key_size,
+              ", ciphertext_offset = ", ciphertext_offset,
+              ", ciphertext_segment_size = ", ct_segment_size));
+          AesGcmHkdfStreamSegmentDecrypter::Params params;
+          params.ikm = Random::GetRandomBytes(derived_key_size);
+          params.hkdf_hash = hkdf_hash;
+          params.derived_key_size = derived_key_size;
+          params.ciphertext_offset = ciphertext_offset;
+          params.ciphertext_segment_size = ct_segment_size;
+          auto result = AesGcmHkdfStreamSegmentDecrypter::New(params);
+          if (ct_segment_size < min_ct_segment_size) {
+            EXPECT_FALSE(result.ok());
+            EXPECT_EQ(util::error::INVALID_ARGUMENT,
+                      result.status().error_code());
+            EXPECT_PRED_FORMAT2(testing::IsSubstring, "too small",
+                                result.status().error_message());
+          } else {
+            EXPECT_TRUE(result.ok()) << result.status();
+          }
+        }
+      }
+    }
+  }
+}
+
+}  // namespace
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/aes_gcm_hkdf_stream_segment_encrypter.cc b/cc/subtle/aes_gcm_hkdf_stream_segment_encrypter.cc
new file mode 100644
index 0000000..2c4d6a9
--- /dev/null
+++ b/cc/subtle/aes_gcm_hkdf_stream_segment_encrypter.cc
@@ -0,0 +1,165 @@
+// Copyright 2017 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/subtle/aes_gcm_hkdf_stream_segment_encrypter.h"
+
+#include <limits>
+#include <string>
+#include <vector>
+
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "tink/subtle/random.h"
+#include "tink/subtle/stream_segment_encrypter.h"
+#include "tink/subtle/subtle_util_boringssl.h"
+#include "tink/util/errors.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "openssl/aead.h"
+#include "openssl/err.h"
+
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+
+namespace {
+
+void BigEndianStore32(uint8_t dst[8], uint32_t val) {
+  dst[0] = (val >> 24) & 0xff;
+  dst[1] = (val >> 16) & 0xff;
+  dst[2] = (val >> 8) & 0xff;
+  dst[3] = val & 0xff;
+}
+
+}  // namespace
+
+const int AesGcmHkdfStreamSegmentEncrypter::kNonceSizeInBytes;
+const int AesGcmHkdfStreamSegmentEncrypter::kNoncePrefixSizeInBytes;
+const int AesGcmHkdfStreamSegmentEncrypter::kTagSizeInBytes;
+
+util::Status Validate(const AesGcmHkdfStreamSegmentEncrypter::Params& params) {
+  if (params.key_value.size() != 16 && params.key_value.size() != 32) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "key_value must have 16 or 32 bytes");
+  }
+  if (params.key_value.size() != params.salt.size()) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "salt must have same size as key_value");
+  }
+  if (params.ciphertext_offset < 0) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "ciphertext_offset must be non-negative");
+  }
+  int header_size = 1 + params.salt.size() +
+                    AesGcmHkdfStreamSegmentEncrypter::kNoncePrefixSizeInBytes;
+  if (params.ciphertext_segment_size <=
+      params.ciphertext_offset + header_size +
+      AesGcmHkdfStreamSegmentEncrypter::kTagSizeInBytes) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "ciphertext_segment_size too small");
+  }
+  return util::OkStatus();
+}
+
+util::Status AesGcmHkdfStreamSegmentEncrypter::InitCtx(
+    absl::string_view key_value) {
+  const EVP_AEAD* aead =
+      SubtleUtilBoringSSL::GetAesGcmAeadForKeySize(key_value.size());
+  if (aead == nullptr) {
+    return util::Status(util::error::INTERNAL, "invalid key size");
+  }
+  if (EVP_AEAD_CTX_init(
+          ctx_.get(), aead, reinterpret_cast<const uint8_t*>(key_value.data()),
+          key_value.size(), kTagSizeInBytes, nullptr) != 1) {
+    return util::Status(util::error::INTERNAL,
+                        "could not initialize EVP_AEAD_CTX");
+  }
+  return util::OkStatus();
+}
+
+int AesGcmHkdfStreamSegmentEncrypter::get_plaintext_segment_size() const {
+  return ciphertext_segment_size_ - kTagSizeInBytes;
+}
+
+// static
+util::StatusOr<std::unique_ptr<StreamSegmentEncrypter>>
+    AesGcmHkdfStreamSegmentEncrypter::New(const Params& params) {
+  auto status = Validate(params);
+  if (!status.ok()) return status;
+
+  std::unique_ptr<AesGcmHkdfStreamSegmentEncrypter>
+      encrypter(new AesGcmHkdfStreamSegmentEncrypter());
+  status = encrypter->InitCtx(params.key_value);
+  if (!status.ok()) return status;
+  uint8_t header_size =
+      static_cast<uint8_t>(1 + params.salt.size() + kNoncePrefixSizeInBytes);
+  encrypter->ciphertext_offset_ = params.ciphertext_offset;
+  encrypter->ciphertext_segment_size_ = params.ciphertext_segment_size;
+  encrypter->nonce_prefix_ = Random::GetRandomBytes(kNoncePrefixSizeInBytes);
+  encrypter->header_.resize(header_size);
+  encrypter->header_[0] = header_size;
+  memcpy(encrypter->header_.data() + 1, params.salt.data(), params.salt.size());
+  memcpy(encrypter->header_.data() + 1 + params.salt.size(),
+         encrypter->nonce_prefix_.data(), encrypter->nonce_prefix_.size());
+  return {std::move(encrypter)};
+}
+
+util::Status AesGcmHkdfStreamSegmentEncrypter::EncryptSegment(
+    const std::vector<uint8_t>& plaintext,
+    bool is_last_segment,
+    std::vector<uint8_t>* ciphertext_buffer) {
+  if (plaintext.size() > get_plaintext_segment_size()) {
+    return util::Status(util::error::INVALID_ARGUMENT, "plaintext too long");
+  }
+  if (ciphertext_buffer == nullptr) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "ciphertext_buffer must be non-null");
+  }
+  if (get_segment_number() > std::numeric_limits<uint32_t>::max() ||
+      (get_segment_number() == std::numeric_limits<uint32_t>::max() &&
+       !is_last_segment)) {
+    return util::Status(util::error::INVALID_ARGUMENT, "too many segments");
+  }
+
+  int ct_size = plaintext.size() + kTagSizeInBytes;
+  ciphertext_buffer->resize(ct_size);
+
+  // Construct IV.
+  std::vector<uint8_t> iv(kNonceSizeInBytes);
+  memcpy(iv.data(), nonce_prefix_.data(), kNoncePrefixSizeInBytes);
+  BigEndianStore32(iv.data() + kNoncePrefixSizeInBytes,
+                   static_cast<uint32_t>(get_segment_number()));
+  iv.back() = is_last_segment ? 1 : 0;
+  size_t out_len;
+  if (!EVP_AEAD_CTX_seal(
+          ctx_.get(), ciphertext_buffer->data(), &out_len,
+          ciphertext_buffer->size(),
+          iv.data(), iv.size(),
+          plaintext.data(), plaintext.size(),
+          /* ad = */ nullptr, /* ad.length() = */ 0)) {
+    return util::Status(util::error::INTERNAL,
+                        absl::StrCat("Encryption failed: ",
+                                     SubtleUtilBoringSSL::GetErrors()));
+  }
+  IncSegmentNumber();
+  return util::OkStatus();
+}
+
+
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/aes_gcm_hkdf_stream_segment_encrypter.h b/cc/subtle/aes_gcm_hkdf_stream_segment_encrypter.h
new file mode 100644
index 0000000..5af33f4
--- /dev/null
+++ b/cc/subtle/aes_gcm_hkdf_stream_segment_encrypter.h
@@ -0,0 +1,127 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_SUBTLE_AES_GCM_HKDF_STREAM_SEGMENT_ENCRYPTER_H_
+#define TINK_SUBTLE_AES_GCM_HKDF_STREAM_SEGMENT_ENCRYPTER_H_
+
+#include <vector>
+
+#include "absl/strings/string_view.h"
+#include "openssl/aead.h"
+#include "tink/subtle/stream_segment_encrypter.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+
+// StreamSegmentEncrypter for streaming encryption using AES-GCM with HKDF as
+// key derivation function.
+//
+// Each ciphertext uses a new AES-GCM key that is derived from the key
+// derivation key, a randomly chosen salt of the same size as the key and a
+// nonce prefix.
+//
+// The format of a ciphertext is
+//   header || segment_0 || segment_1 || ... || segment_k.
+// where:
+//  - segment_i is the i-th segment of the ciphertext.
+//  - the size of segment_1 .. segment_{k-1} is get_ciphertext_segment_size()
+//  - segment_0 is shorter, so that segment_0, the header and other information
+//    of size get_ciphertext_offset() align with get_ciphertext_segment_size().
+//
+// The format of the header is
+//   header_size || salt || nonce_prefix
+// where
+//  - header_size is 1 byte determining the size of the header
+//  - salt is a salt used in the key derivation
+//  - nonce_prefix is the prefix of the nonce
+//
+// In principle header_size is redundant information, since the length of the
+// header can be determined from the key size.
+
+class AesGcmHkdfStreamSegmentEncrypter : public StreamSegmentEncrypter {
+ public:
+  // The size of the IVs for GCM.
+  static const int kNonceSizeInBytes = 12;
+
+  // The nonce has the format nonce_prefix || ctr || last_block, where:
+  //  - nonce_prefix is a constant of kNoncePrefixSizeInBytes bytes
+  //    for the whole file
+  //  - ctr is a 32 bit counter
+  //  - last_block is a byte equal to 1 for the last block of the file
+  //    and 0 otherwise.
+  static const int kNoncePrefixSizeInBytes = 7;
+
+  // The size of the tags of each ciphertext segment.
+  static const int kTagSizeInBytes = 16;
+
+  struct Params {
+    std::string key_value;
+    std::string salt;
+    int ciphertext_offset;
+    int ciphertext_segment_size;
+  };
+
+  // A factory.
+  static util::StatusOr<std::unique_ptr<StreamSegmentEncrypter>>
+      New(const Params& params);
+
+  // Overridden methods of StreamSegmentEncrypter.
+  util::Status EncryptSegment(
+      const std::vector<uint8_t>& plaintext,
+      bool is_last_segment,
+      std::vector<uint8_t>* ciphertext_buffer) override;
+
+  const std::vector<uint8_t>& get_header() const override {
+    return header_;
+  }
+  int64_t get_segment_number() const override {
+    return segment_number_;
+  }
+  int get_plaintext_segment_size() const override;
+  int get_ciphertext_segment_size() const override {
+    return ciphertext_segment_size_;
+  }
+  int get_ciphertext_offset() const override {
+    return ciphertext_offset_;
+  }
+  ~AesGcmHkdfStreamSegmentEncrypter() override {}
+
+ protected:
+  void IncSegmentNumber() override {
+    segment_number_++;
+  }
+
+ private:
+  AesGcmHkdfStreamSegmentEncrypter() : segment_number_(0) {}
+  util::Status InitCtx(absl::string_view key_value);
+
+  std::vector<uint8_t> header_;
+  std::string nonce_prefix_;
+  int64_t segment_number_;
+  int ciphertext_segment_size_;
+  int ciphertext_offset_;
+
+  bssl::ScopedEVP_AEAD_CTX ctx_;
+};
+
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_SUBTLE_AES_GCM_HKDF_STREAM_SEGMENT_ENCRYPTER_H_
diff --git a/cc/subtle/aes_gcm_hkdf_stream_segment_encrypter_test.cc b/cc/subtle/aes_gcm_hkdf_stream_segment_encrypter_test.cc
new file mode 100644
index 0000000..a60b811
--- /dev/null
+++ b/cc/subtle/aes_gcm_hkdf_stream_segment_encrypter_test.cc
@@ -0,0 +1,198 @@
+// Copyright 2017 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "tink/subtle/aes_gcm_hkdf_stream_segment_encrypter.h"
+
+#include <string>
+#include <vector>
+
+#include "absl/strings/str_cat.h"
+#include "tink/subtle/random.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/test_util.h"
+#include "gtest/gtest.h"
+
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+namespace {
+
+TEST(AesGcmHkdfStreamSegmentEncrypterTest, testBasic) {
+  for (int key_size : {16, 32}) {
+    for (int ciphertext_offset : {0, 5, 10}) {
+      for (int ct_segment_size : {80, 128, 200}) {
+        SCOPED_TRACE(absl::StrCat(
+            "key_size = ", key_size,
+            ", ciphertext_offset = ", ciphertext_offset,
+            ", ciphertext_segment_size = ", ct_segment_size));
+
+        // Construct an encrypter.
+        AesGcmHkdfStreamSegmentEncrypter::Params params;
+        params.key_value = Random::GetRandomBytes(key_size);
+        params.salt = Random::GetRandomBytes(key_size);
+        params.ciphertext_offset = ciphertext_offset;
+        params.ciphertext_segment_size = ct_segment_size;
+        auto result = AesGcmHkdfStreamSegmentEncrypter::New(params);
+        EXPECT_TRUE(result.ok()) << result.status();
+
+        // Use the Constructed encrypter.
+        auto enc = std::move(result.ValueOrDie());
+        EXPECT_EQ(0, enc->get_segment_number());
+        int header_size = key_size + /* nonce_prefix_size = */ 7 + 1;
+        EXPECT_EQ(header_size, enc->get_header().size());
+        EXPECT_EQ(header_size, enc->get_header()[0]);
+        EXPECT_EQ(params.salt, std::string(
+            reinterpret_cast<const char*>(enc->get_header().data() + 1),
+            key_size));
+        EXPECT_EQ(ct_segment_size, enc->get_ciphertext_segment_size());
+        EXPECT_EQ(ct_segment_size - /* tag_size = */ 16,
+                  enc->get_plaintext_segment_size());
+        EXPECT_EQ(ciphertext_offset, enc->get_ciphertext_offset());
+        int segment_number = 0;
+        for (int pt_size : {1, 10, enc->get_plaintext_segment_size()}) {
+          for (bool is_last_segment : {false, true}) {
+            SCOPED_TRACE(absl::StrCat(
+                "plaintext_size = ", pt_size,
+                ", is_last_segment = ", is_last_segment));
+            std::vector<uint8_t> pt(pt_size, 'p');
+            std::vector<uint8_t> ct;
+            auto status = enc->EncryptSegment(pt, is_last_segment, &ct);
+            EXPECT_TRUE(status.ok()) << status;
+            EXPECT_EQ(pt_size + /* tag_size = */ 16, ct.size());
+            segment_number++;
+            EXPECT_EQ(segment_number, enc->get_segment_number());
+          }
+        }
+
+        // Try encryption with wrong params.
+        std::vector<uint8_t> pt(enc->get_plaintext_segment_size() + 1, 'p');
+        auto status = enc->EncryptSegment(pt, true, nullptr);
+        EXPECT_FALSE(status.ok());
+        EXPECT_PRED_FORMAT2(testing::IsSubstring, "plaintext too long",
+                            status.error_message());
+        pt.resize(enc->get_plaintext_segment_size());
+        status = enc->EncryptSegment(pt, true, nullptr);
+        EXPECT_FALSE(status.ok());
+        EXPECT_PRED_FORMAT2(testing::IsSubstring, "must be non-null",
+                            status.error_message());
+      }
+    }
+  }
+}
+
+TEST(AesGcmHkdfStreamSegmentEncrypterTest, testWrongKeySize) {
+  for (int key_size : {12, 24, 64}) {
+    for (int ciphertext_offset : {0, 5, 10}) {
+      for (int ct_segment_size : {128, 200}) {
+           SCOPED_TRACE(absl::StrCat(
+               "key_size = ", key_size,
+               ", ciphertext_offset = ", ciphertext_offset,
+               ", ciphertext_segment_size = ", ct_segment_size));
+        AesGcmHkdfStreamSegmentEncrypter::Params params;
+        params.key_value = Random::GetRandomBytes(key_size);
+        params.salt = Random::GetRandomBytes(key_size);
+        params.ciphertext_offset = ciphertext_offset;
+        params.ciphertext_segment_size = ct_segment_size;
+        auto result = AesGcmHkdfStreamSegmentEncrypter::New(params);
+        EXPECT_FALSE(result.ok());
+        EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
+        EXPECT_PRED_FORMAT2(testing::IsSubstring, "must have 16 or 32 bytes",
+                            result.status().error_message());
+      }
+    }
+  }
+}
+
+TEST(AesGcmHkdfStreamSegmentEncrypterTest, testWrongSaltSize) {
+  for (int key_size : {16, 32}) {
+    for (int salt_size_delta : {-3, -1, 1, 5, 16}) {
+      SCOPED_TRACE(absl::StrCat(
+          "key_size = ", key_size,
+          ", salt_size = ", key_size + salt_size_delta));
+      AesGcmHkdfStreamSegmentEncrypter::Params params;
+      params.key_value = Random::GetRandomBytes(key_size);
+      params.salt = Random::GetRandomBytes(key_size + salt_size_delta);
+      params.ciphertext_offset = 0;
+      params.ciphertext_segment_size = 128;
+      auto result = AesGcmHkdfStreamSegmentEncrypter::New(params);
+      EXPECT_FALSE(result.ok());
+      EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
+      EXPECT_PRED_FORMAT2(testing::IsSubstring, "same size as key_value",
+                          result.status().error_message());
+    }
+  }
+}
+
+TEST(AesGcmHkdfStreamSegmentEncrypterTest, testWrongCiphertextOffset) {
+  for (int key_size : {16, 32}) {
+    for (int ciphertext_offset : {-16, -10, -3, -1}) {
+      SCOPED_TRACE(absl::StrCat(
+          "key_size = ", key_size,
+          ", ciphertext_offset = ", ciphertext_offset));
+      AesGcmHkdfStreamSegmentEncrypter::Params params;
+      params.key_value = Random::GetRandomBytes(key_size);
+      params.salt = Random::GetRandomBytes(key_size);
+      params.ciphertext_offset = ciphertext_offset;
+      params.ciphertext_segment_size = 128;
+      auto result = AesGcmHkdfStreamSegmentEncrypter::New(params);
+      EXPECT_FALSE(result.ok());
+      EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
+      EXPECT_PRED_FORMAT2(testing::IsSubstring, "must be non-negative",
+                          result.status().error_message());
+    }
+  }
+}
+
+TEST(AesGcmHkdfStreamSegmentEncrypterTest, testWrongCiphertextSegmentSize) {
+  for (int key_size : {16, 32}) {
+    for (int ciphertext_offset : {0, 1, 5, 10}) {
+      int min_ct_segment_size = key_size + ciphertext_offset +
+                                8 +   // nonce_prefix_size + 1
+                                16 +   // tag_size
+                                1;
+      for (int ct_segment_size : {min_ct_segment_size - 5,
+              min_ct_segment_size - 1, min_ct_segment_size,
+              min_ct_segment_size + 1, min_ct_segment_size + 10}) {
+        SCOPED_TRACE(absl::StrCat(
+            "key_size = ", key_size,
+            ", ciphertext_offset = ", ciphertext_offset,
+            ", ciphertext_segment_size = ", ct_segment_size));
+        AesGcmHkdfStreamSegmentEncrypter::Params params;
+        params.key_value = Random::GetRandomBytes(key_size);
+        params.salt = Random::GetRandomBytes(key_size);
+        params.ciphertext_offset = ciphertext_offset;
+        params.ciphertext_segment_size = ct_segment_size;
+        auto result = AesGcmHkdfStreamSegmentEncrypter::New(params);
+        if (ct_segment_size < min_ct_segment_size) {
+          EXPECT_FALSE(result.ok());
+          EXPECT_EQ(util::error::INVALID_ARGUMENT,
+                    result.status().error_code());
+          EXPECT_PRED_FORMAT2(testing::IsSubstring, "too small",
+                              result.status().error_message());
+        } else {
+          EXPECT_TRUE(result.ok()) << result.status();
+        }
+      }
+    }
+  }
+}
+
+}  // namespace
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/aes_gcm_hkdf_streaming.cc b/cc/subtle/aes_gcm_hkdf_streaming.cc
new file mode 100644
index 0000000..fb12993
--- /dev/null
+++ b/cc/subtle/aes_gcm_hkdf_streaming.cc
@@ -0,0 +1,119 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/subtle/aes_gcm_hkdf_streaming.h"
+
+#include <string>
+
+#include "tink/subtle/aes_gcm_hkdf_stream_segment_decrypter.h"
+#include "tink/subtle/aes_gcm_hkdf_stream_segment_encrypter.h"
+#include "tink/subtle/common_enums.h"
+#include "tink/subtle/hkdf.h"
+#include "tink/subtle/random.h"
+#include "tink/subtle/stream_segment_decrypter.h"
+#include "tink/subtle/stream_segment_encrypter.h"
+#include "tink/util/errors.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+
+using crypto::tink::util::Status;
+using crypto::tink::util::StatusOr;
+
+namespace {
+Status Validate(absl::string_view ikm,
+                HashType hkdf_hash,
+                int derived_key_size,
+                int ciphertext_segment_size,
+                int ciphertext_offset) {
+  if (!(hkdf_hash == SHA1 || hkdf_hash == SHA256 || hkdf_hash == SHA512)) {
+    return Status(util::error::INVALID_ARGUMENT, "unsupported hkdf_hash");
+  }
+  if (ikm.size() < 16 || ikm.size() < derived_key_size) {
+    return Status(util::error::INVALID_ARGUMENT, "ikm too small");
+  }
+  if (derived_key_size != 16 && derived_key_size != 32) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "derived_key_size must be 16 or 32");
+  }
+  if (ciphertext_offset < 0) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "ciphertext_offset must be non-negative");
+  }
+  if (ciphertext_segment_size <=
+      ciphertext_offset + derived_key_size +
+      AesGcmHkdfStreamSegmentEncrypter::kTagSizeInBytes) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "ciphertext_segment_size too small");
+  }
+  return util::OkStatus();
+}
+
+}  // namespace
+StatusOr<std::unique_ptr<AesGcmHkdfStreaming>>
+AesGcmHkdfStreaming::New(absl::string_view ikm,
+                         HashType hkdf_hash,
+                         int derived_key_size,
+                         int ciphertext_segment_size,
+                         int ciphertext_offset) {
+  auto status = Validate(ikm, hkdf_hash, derived_key_size,
+                         ciphertext_segment_size, ciphertext_offset);
+  if (!status.ok()) return status;
+  std::unique_ptr<AesGcmHkdfStreaming>
+      streaming_aead(new AesGcmHkdfStreaming());
+  streaming_aead->ikm_ = std::string(ikm);
+  streaming_aead->hkdf_hash_ = hkdf_hash;
+  streaming_aead->derived_key_size_ = derived_key_size;
+  streaming_aead->ciphertext_segment_size_ = ciphertext_segment_size;
+  streaming_aead->ciphertext_offset_ = ciphertext_offset;
+  return std::move(streaming_aead);
+}
+
+StatusOr<std::unique_ptr<StreamSegmentEncrypter>>
+AesGcmHkdfStreaming::NewSegmentEncrypter(
+    absl::string_view associated_data) const {
+  AesGcmHkdfStreamSegmentEncrypter::Params params;
+  params.salt = Random::GetRandomBytes(derived_key_size_);
+  auto hkdf_result = Hkdf::ComputeHkdf(
+      hkdf_hash_, ikm_, params.salt, associated_data,
+      derived_key_size_);
+  if (!hkdf_result.ok()) return hkdf_result.status();
+  params.key_value = hkdf_result.ValueOrDie();
+  params.ciphertext_offset = ciphertext_offset_;
+  params.ciphertext_segment_size = ciphertext_segment_size_;
+  return AesGcmHkdfStreamSegmentEncrypter::New(params);
+}
+
+StatusOr<std::unique_ptr<StreamSegmentDecrypter>>
+AesGcmHkdfStreaming::NewSegmentDecrypter(
+    absl::string_view associated_data) const {
+  AesGcmHkdfStreamSegmentDecrypter::Params params;
+  params.ikm = ikm_;
+  params.hkdf_hash = hkdf_hash_;
+  params.derived_key_size = derived_key_size_;
+  params.ciphertext_offset = ciphertext_offset_;
+  params.ciphertext_segment_size = ciphertext_segment_size_;
+  params.associated_data = std::string(associated_data);
+  return AesGcmHkdfStreamSegmentDecrypter::New(params);
+}
+
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/aes_gcm_hkdf_streaming.h b/cc/subtle/aes_gcm_hkdf_streaming.h
new file mode 100644
index 0000000..3cfed1d
--- /dev/null
+++ b/cc/subtle/aes_gcm_hkdf_streaming.h
@@ -0,0 +1,66 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_SUBTLE_AES_GCM_HKDF_STREAMING_H_
+#define TINK_SUBTLE_AES_GCM_HKDF_STREAMING_H_
+
+#include <memory>
+
+#include "absl/strings/string_view.h"
+#include "tink/input_stream.h"
+#include "tink/output_stream.h"
+#include "tink/subtle/common_enums.h"
+#include "tink/subtle/nonce_based_streaming_aead.h"
+#include "tink/subtle/stream_segment_decrypter.h"
+#include "tink/subtle/stream_segment_encrypter.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+
+class AesGcmHkdfStreaming : public NonceBasedStreamingAead {
+ public:
+  static crypto::tink::util::StatusOr<std::unique_ptr<AesGcmHkdfStreaming>>
+  New(absl::string_view ikm,
+      HashType hkdf_hash,
+      int derived_key_size,
+      int ciphertext_segment_size,
+      int ciphertext_offset);
+
+  ~AesGcmHkdfStreaming() override {}
+
+ protected:
+  crypto::tink::util::StatusOr<std::unique_ptr<StreamSegmentEncrypter>>
+  NewSegmentEncrypter(absl::string_view associated_data) const override;
+
+  crypto::tink::util::StatusOr<std::unique_ptr<StreamSegmentDecrypter>>
+  NewSegmentDecrypter(absl::string_view associated_data) const override;
+
+ private:
+  AesGcmHkdfStreaming() {}
+  std::string ikm_;
+  HashType hkdf_hash_;
+  int derived_key_size_;
+  int ciphertext_segment_size_;
+  int ciphertext_offset_;
+};
+
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_SUBTLE_AES_GCM_HKDF_STREAMING_H_
diff --git a/cc/subtle/aes_gcm_hkdf_streaming_test.cc b/cc/subtle/aes_gcm_hkdf_streaming_test.cc
new file mode 100644
index 0000000..8035de8
--- /dev/null
+++ b/cc/subtle/aes_gcm_hkdf_streaming_test.cc
@@ -0,0 +1,191 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "tink/subtle/aes_gcm_hkdf_streaming.h"
+
+#include <sstream>
+#include <string>
+
+#include "gtest/gtest.h"
+#include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
+#include "tink/output_stream.h"
+#include "tink/subtle/common_enums.h"
+#include "tink/subtle/random.h"
+#include "tink/subtle/streaming_aead_test_util.h"
+#include "tink/subtle/test_util.h"
+#include "tink/util/istream_input_stream.h"
+#include "tink/util/ostream_output_stream.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/util/test_matchers.h"
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+namespace {
+
+using ::crypto::tink::test::IsOk;
+
+TEST(AesGcmHkdfStreamingTest, testBasic) {
+  for (HashType hkdf_hash : {SHA1, SHA256, SHA512}) {
+    for (int ikm_size : {16, 32}) {
+      for (int derived_key_size = 16;
+           derived_key_size <= ikm_size;
+           derived_key_size += 16) {
+        for (int ct_segment_size : {80, 128, 200}) {
+          for (int ciphertext_offset : {0, 10, 16}) {
+            SCOPED_TRACE(absl::StrCat(
+                "hkdf_hash = ", EnumToString(hkdf_hash),
+                ", ikm_size = ", ikm_size,
+                ", derived_key_size = ", derived_key_size,
+                ", ciphertext_segment_size = ", ct_segment_size,
+                ", ciphertext_offset = ", ciphertext_offset));
+            // Create AesGcmHkdfStreaming.
+            std::string ikm = Random::GetRandomBytes(ikm_size);
+            auto result = AesGcmHkdfStreaming::New(
+                ikm, hkdf_hash, derived_key_size,
+                ct_segment_size, ciphertext_offset);
+            EXPECT_TRUE(result.ok()) << result.status();
+            auto streaming_aead = std::move(result.ValueOrDie());
+
+            // Try to get an encrypting stream to a "null" ct_destination.
+            std::string associated_data = "some associated data";
+            auto failed_result = streaming_aead->NewEncryptingStream(
+                nullptr, associated_data);
+            EXPECT_FALSE(failed_result.ok());
+            EXPECT_EQ(util::error::INVALID_ARGUMENT,
+                      failed_result.status().error_code());
+            EXPECT_PRED_FORMAT2(testing::IsSubstring, "non-null",
+                                failed_result.status().error_message());
+
+            for (int pt_size : {0, 16, 100, 1000, 10000}) {
+              SCOPED_TRACE(absl::StrCat(" pt_size = ", pt_size));
+              std::string pt = Random::GetRandomBytes(pt_size);
+              EXPECT_THAT(
+                  EncryptThenDecrypt(streaming_aead.get(), streaming_aead.get(),
+                                     pt, associated_data, ciphertext_offset),
+                  IsOk());
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+TEST(AesGcmHkdfStreamingTest, testIkmSmallerThanDerivedKey) {
+  int ikm_size = 16;
+  int derived_key_size = 17;
+  int ct_segment_size = 100;
+  int ciphertext_offset = 10;
+  HashType hkdf_hash = SHA256;
+  std::string ikm = Random::GetRandomBytes(ikm_size);
+
+  auto result = AesGcmHkdfStreaming::New(
+      ikm, hkdf_hash, derived_key_size, ct_segment_size, ciphertext_offset);
+  EXPECT_FALSE(result.ok());
+  EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "ikm too small",
+                      result.status().error_message());
+}
+
+TEST(AesGcmHkdfStreamingTest, testIkmSize) {
+  for (int ikm_size : {5, 10, 15}) {
+    int derived_key_size = ikm_size;
+    int ct_segment_size = 100;
+    int ciphertext_offset = 0;
+    HashType hkdf_hash = SHA256;
+    std::string ikm = Random::GetRandomBytes(ikm_size);
+
+    auto result = AesGcmHkdfStreaming::New(
+        ikm, hkdf_hash, derived_key_size,
+        ct_segment_size, ciphertext_offset);
+    EXPECT_FALSE(result.ok());
+    EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
+    EXPECT_PRED_FORMAT2(testing::IsSubstring, "ikm too small",
+                        result.status().error_message());
+  }
+}
+
+TEST(AesGcmHkdfStreamingTest, testWrongHkdfHash) {
+  int ikm_size = 16;
+  int derived_key_size = 16;
+  int ct_segment_size = 100;
+  int ciphertext_offset = 10;
+  HashType hkdf_hash = SHA384;
+  std::string ikm = Random::GetRandomBytes(ikm_size);
+
+  auto result = AesGcmHkdfStreaming::New(ikm, hkdf_hash, derived_key_size,
+                                         ct_segment_size, ciphertext_offset);
+  EXPECT_FALSE(result.ok());
+  EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "unsupported hkdf_hash",
+                      result.status().error_message());
+}
+
+TEST(AesGcmHkdfStreamingTest, testWrongDerivedKeySize) {
+  int ikm_size = 20;
+  int derived_key_size = 20;
+  int ct_segment_size = 100;
+  int ciphertext_offset = 10;
+  HashType hkdf_hash = SHA256;
+  std::string ikm = Random::GetRandomBytes(ikm_size);
+
+  auto result = AesGcmHkdfStreaming::New(
+      ikm, hkdf_hash, derived_key_size, ct_segment_size, ciphertext_offset);
+  EXPECT_FALSE(result.ok());
+  EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "must be 16 or 32",
+                      result.status().error_message());
+}
+
+TEST(AesGcmHkdfStreamingTest, testWrongCiphertextOffset) {
+  int ikm_size = 32;
+  int derived_key_size = 32;
+  int ct_segment_size = 100;
+  int ciphertext_offset = -5;
+  HashType hkdf_hash = SHA256;
+  std::string ikm = Random::GetRandomBytes(ikm_size);
+
+  auto result = AesGcmHkdfStreaming::New(
+      ikm, hkdf_hash, derived_key_size, ct_segment_size, ciphertext_offset);
+  EXPECT_FALSE(result.ok());
+  EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "must be non-negative",
+                      result.status().error_message());
+}
+
+TEST(AesGcmHkdfStreamingTest, testWrongCiphertextSegmentSize) {
+  int ikm_size = 32;
+  int derived_key_size = 32;
+  int ct_segment_size = 64;
+  int ciphertext_offset = 40;
+  HashType hkdf_hash = SHA256;
+  std::string ikm = Random::GetRandomBytes(ikm_size);
+
+  auto result = AesGcmHkdfStreaming::New(
+      ikm, hkdf_hash, derived_key_size, ct_segment_size, ciphertext_offset);
+  EXPECT_FALSE(result.ok());
+  EXPECT_EQ(util::error::INVALID_ARGUMENT, result.status().error_code());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "ciphertext_segment_size too small",
+                      result.status().error_message());
+}
+
+}  // namespace
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/aes_gcm_siv_boringssl.cc b/cc/subtle/aes_gcm_siv_boringssl.cc
index 7cefcfb..898aec9 100644
--- a/cc/subtle/aes_gcm_siv_boringssl.cc
+++ b/cc/subtle/aes_gcm_siv_boringssl.cc
@@ -23,6 +23,7 @@
 #include "openssl/err.h"
 #include "tink/aead.h"
 #include "tink/subtle/random.h"
+#include "tink/subtle/subtle_util.h"
 #include "tink/util/errors.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
@@ -68,19 +69,23 @@
 
 util::StatusOr<std::string> AesGcmSivBoringSsl::Encrypt(
     absl::string_view plaintext, absl::string_view additional_data) const {
-  const std::string iv = Random::GetRandomBytes(IV_SIZE_IN_BYTES);
-  std::vector<uint8_t> ct(iv.size() + plaintext.size() + TAG_SIZE_IN_BYTES);
-  memcpy(ct.data(), iv.data(), iv.size());
+  std::string ciphertext = Random::GetRandomBytes(IV_SIZE_IN_BYTES);
+  ResizeStringUninitialized(
+      &ciphertext, IV_SIZE_IN_BYTES + plaintext.size() + TAG_SIZE_IN_BYTES);
   size_t len;
   if (EVP_AEAD_CTX_seal(
-          ctx_.get(), ct.data() + iv.size(), &len, ct.size() - iv.size(),
-          reinterpret_cast<const uint8_t*>(iv.data()), iv.size(),
+          ctx_.get(), reinterpret_cast<uint8_t*>(&ciphertext[IV_SIZE_IN_BYTES]),
+          &len, ciphertext.size() - IV_SIZE_IN_BYTES,
+          reinterpret_cast<const uint8_t*>(&ciphertext[0]), IV_SIZE_IN_BYTES,
           reinterpret_cast<const uint8_t*>(plaintext.data()), plaintext.size(),
           reinterpret_cast<const uint8_t*>(additional_data.data()),
           additional_data.size()) != 1) {
     return util::Status(util::error::INTERNAL, "Encryption failed");
   }
-  return std::string(reinterpret_cast<const char*>(ct.data()), iv.size() + len);
+  if (len != ciphertext.size() - IV_SIZE_IN_BYTES) {
+    return util::Status(util::error::INTERNAL, "incorrect ciphertext size");
+  }
+  return ciphertext;
 }
 
 util::StatusOr<std::string> AesGcmSivBoringSsl::Decrypt(
@@ -89,11 +94,13 @@
     return util::Status(util::error::INTERNAL, "Ciphertext too short");
   }
 
-  std::vector<uint8_t> pt(ciphertext.size() - IV_SIZE_IN_BYTES -
-                          TAG_SIZE_IN_BYTES);
+  std::string plaintext;
+  ResizeStringUninitialized(
+      &plaintext, ciphertext.size() - IV_SIZE_IN_BYTES - TAG_SIZE_IN_BYTES);
   size_t len;
   if (EVP_AEAD_CTX_open(
-          ctx_.get(), pt.data(), &len, pt.size(),
+          ctx_.get(), reinterpret_cast<uint8_t*>(&plaintext[0]), &len,
+          plaintext.size(),
           // The nonce is the first |IV_SIZE_IN_BYTES| bytes of |ciphertext|.
           reinterpret_cast<const uint8_t*>(ciphertext.data()), IV_SIZE_IN_BYTES,
           // The input is the remainder.
@@ -104,7 +111,10 @@
           additional_data.size()) != 1) {
     return util::Status(util::error::INTERNAL, "Authentication failed");
   }
-  return std::string(reinterpret_cast<const char*>(pt.data()), len);
+  if (len != plaintext.size()) {
+    return util::Status(util::error::INTERNAL, "incorrect ciphertext size");
+  }
+  return plaintext;
 }
 
 }  // namespace subtle
diff --git a/cc/subtle/common_enums.cc b/cc/subtle/common_enums.cc
index 62d4c30..f2ff20e 100644
--- a/cc/subtle/common_enums.cc
+++ b/cc/subtle/common_enums.cc
@@ -18,6 +18,8 @@
 
 #include <string>
 
+#include "absl/strings/str_cat.h"
+
 namespace crypto {
 namespace tink {
 namespace subtle {
@@ -30,10 +32,12 @@
     return "NIST_P384";
   case EllipticCurveType::NIST_P521:
     return "NIST_P521";
+  case EllipticCurveType::CURVE25519:
+    return "CURVE25519";
   case EllipticCurveType::UNKNOWN_CURVE:
     return "UNKNOWN_CURVE";
   default:
-    return "UNKNOWN_CURVE: " + std::to_string(type);
+    return absl::StrCat("UNKNOWN_CURVE: ", type);
   }
 }
 
@@ -48,7 +52,7 @@
   case EcPointFormat::UNKNOWN_FORMAT:
     return "UNKNOWN_FORMAT";
   default:
-    return "UNKNOWN_FORMAT: " + std::to_string(format);
+    return absl::StrCat("UNKNOWN_FORMAT: ", format);
   }
 }
 
@@ -58,12 +62,14 @@
     return "SHA1";
   case HashType::SHA256:
     return "SHA256";
+  case HashType::SHA384:
+    return "SHA384";
   case HashType::SHA512:
     return "SHA512";
   case HashType::UNKNOWN_HASH:
     return "UNKNOWN_HASH";
   default:
-    return "UNKNOWN_HASH: " + std::to_string(type);
+    return absl::StrCat("UNKNOWN_HASH: ", type);
   }
 }
 
diff --git a/cc/subtle/common_enums.h b/cc/subtle/common_enums.h
index a1d1277..dacc140 100644
--- a/cc/subtle/common_enums.h
+++ b/cc/subtle/common_enums.h
@@ -29,6 +29,7 @@
   NIST_P256 = 2,
   NIST_P384 = 3,
   NIST_P521 = 4,
+  CURVE25519 = 5,
 };
 
 enum EcPointFormat {
@@ -43,6 +44,7 @@
 enum HashType {
   UNKNOWN_HASH = 0,
   SHA1 = 1,  // SHA1 for digital signature is deprecated but HMAC-SHA1 is fine.
+  SHA384 = 2,
   SHA256 = 3,
   SHA512 = 4,
 };
diff --git a/cc/subtle/common_enums_test.cc b/cc/subtle/common_enums_test.cc
index e52757e..ce35502 100644
--- a/cc/subtle/common_enums_test.cc
+++ b/cc/subtle/common_enums_test.cc
@@ -35,6 +35,7 @@
 TEST_F(CommonEnumsTest, testHashTypeToString) {
   EXPECT_EQ("SHA1", EnumToString(HashType::SHA1));
   EXPECT_EQ("SHA256", EnumToString(HashType::SHA256));
+  EXPECT_EQ("SHA384", EnumToString(HashType::SHA384));
   EXPECT_EQ("SHA512", EnumToString(HashType::SHA512));
   EXPECT_EQ("UNKNOWN_HASH", EnumToString(HashType::UNKNOWN_HASH));
   EXPECT_EQ("UNKNOWN_HASH: 42", EnumToString((HashType)42));
diff --git a/cc/subtle/decrypting_random_access_stream.cc b/cc/subtle/decrypting_random_access_stream.cc
new file mode 100644
index 0000000..d4e1338
--- /dev/null
+++ b/cc/subtle/decrypting_random_access_stream.cc
@@ -0,0 +1,266 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/subtle/decrypting_random_access_stream.h"
+
+#include <algorithm>
+#include <cstring>
+#include <vector>
+
+#include "absl/base/thread_annotations.h"
+#include "absl/memory/memory.h"
+#include "absl/synchronization/mutex.h"
+#include "tink/random_access_stream.h"
+#include "tink/subtle/stream_segment_decrypter.h"
+#include "tink/util/buffer.h"
+#include "tink/util/errors.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+
+using crypto::tink::RandomAccessStream;
+using crypto::tink::ToStatusF;
+using crypto::tink::util::Buffer;
+using crypto::tink::util::Status;
+using crypto::tink::util::StatusOr;
+
+// static
+StatusOr<std::unique_ptr<RandomAccessStream>> DecryptingRandomAccessStream::New(
+    std::unique_ptr<StreamSegmentDecrypter> segment_decrypter,
+    std::unique_ptr<RandomAccessStream> ciphertext_source) {
+  if (segment_decrypter == nullptr) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "segment_decrypter must be non-null");
+  }
+  if (ciphertext_source == nullptr) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "cipertext_source must be non-null");
+  }
+  std::unique_ptr<DecryptingRandomAccessStream> dec_stream(
+      new DecryptingRandomAccessStream());
+  absl::MutexLock lock(&(dec_stream->status_mutex_));
+  dec_stream->segment_decrypter_ = std::move(segment_decrypter);
+  dec_stream->ct_source_ = std::move(ciphertext_source);
+  int first_segment_size =
+      dec_stream->segment_decrypter_->get_ciphertext_segment_size() -
+      dec_stream->segment_decrypter_->get_ciphertext_offset();
+  if (first_segment_size <= 0) {
+    return Status(util::error::INTERNAL,
+                  "Size of the first segment must be greater than 0.");
+  }
+  dec_stream->status_ =
+      Status(util::error::UNAVAILABLE, "The header hasn't been read yet.");
+  return {std::move(dec_stream)};
+}
+
+util::Status DecryptingRandomAccessStream::PRead(int64_t position, int count,
+                                                 Buffer* dest_buffer) {
+  if (dest_buffer == nullptr) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "dest_buffer must be non-null");
+  }
+  auto status = dest_buffer->set_size(0);
+  if (!status.ok()) return status;
+  if (count < 0) {
+    return Status(util::error::INVALID_ARGUMENT, "count cannot be negative");
+  }
+  if (count > dest_buffer->allocated_size()) {
+    return Status(util::error::INVALID_ARGUMENT, "buffer too small");
+  }
+  if (position < 0) {
+    return Status(util::error::INVALID_ARGUMENT, "position cannot be negative");
+  }
+
+  {  // Initialize, if not initialized yet.
+    absl::MutexLock lock(&status_mutex_);
+    InitializeIfNeeded();
+    if (!status_.ok()) return status_;
+  }
+
+  if (position > pt_size_) {
+    return Status(util::error::INVALID_ARGUMENT, "position too large");
+  }
+  return PReadAndDecrypt(position, count, dest_buffer);
+}
+
+// NOTE: As the initialization below requires availability of size() of the
+// underlying ciphertext stream, the current implementation does not support
+// dynamic encrypted streams, whose size is not known or can change over time
+// (e.g. when one process produces an encrypted file/stream, while concurrently
+// another process consumes the resulting encrypted stream).
+//
+// This is consistent with Java implementation of SeekableDecryptingChannel,
+// and detects ciphertext truncation attacks.  However, a support for dynamic
+// streams can be added in the future if needed.
+void DecryptingRandomAccessStream::InitializeIfNeeded()
+    ABSL_EXCLUSIVE_LOCKS_REQUIRED(status_mutex_) {
+  if (status_.error_code() != util::error::UNAVAILABLE) {
+    // Already initialized or stream failed permanently.
+    return;
+  }
+
+  // Initialize segment decrypter from data in the stream header.
+  header_size_ = segment_decrypter_->get_header_size();
+  ct_offset_ = segment_decrypter_->get_ciphertext_offset();
+  auto buf_result = Buffer::New(header_size_);
+  if (!buf_result.ok()) {
+    status_ = buf_result.status();
+    return;
+  }
+  auto buf = std::move(buf_result.ValueOrDie());
+  status_ = ct_source_->PRead(ct_offset_, header_size_, buf.get());
+  if (!status_.ok()) {
+    if (status_.error_code() == util::error::OUT_OF_RANGE) {
+      status_ = Status(util::error::INVALID_ARGUMENT, "could not read header");
+    }
+    return;
+  }
+  status_ = segment_decrypter_->Init(std::vector<uint8_t>(
+      buf->get_mem_block(), buf->get_mem_block() + header_size_));
+  if (!status_.ok()) return;
+  ct_segment_size_ = segment_decrypter_->get_ciphertext_segment_size();
+  pt_segment_size_ = segment_decrypter_->get_plaintext_segment_size();
+  ct_segment_overhead_ = ct_segment_size_ - pt_segment_size_;
+
+  // Calculate the number of segments and the plaintext size.
+  auto ct_size_result = ct_source_->size();
+  if (!ct_size_result.ok()) {
+    status_ = ct_size_result.status();
+    return;
+  }
+  auto ct_size = ct_size_result.ValueOrDie();
+  auto full_segment_count = ct_size / ct_segment_size_;
+  auto remainder_size = ct_size % ct_segment_size_;
+  if (remainder_size > 0) {
+    segment_count_ = full_segment_count + 1;
+  } else {
+    segment_count_ = full_segment_count;
+  }
+  auto overhead =
+      ct_segment_overhead_ * segment_count_ + ct_offset_ + header_size_;
+  if (overhead > ct_size) {
+    status_ = Status(util::error::INVALID_ARGUMENT,
+                     "ciphertext stream is too short");
+    return;
+  }
+  pt_size_ = ct_size - overhead;
+}
+
+int DecryptingRandomAccessStream::GetPlaintextOffset(int64_t pt_position) {
+  if (GetSegmentNr(pt_position) == 0) return pt_position;
+  // Computed according to the formula:
+  // (pt_position - (pt_segment_size_ - ct_offset_ - header_size_))
+  //     % pt_segment_size_;
+  return (pt_position + ct_offset_ + header_size_) % pt_segment_size_;
+}
+
+int DecryptingRandomAccessStream::GetSegmentNr(int64_t pt_position) {
+  return (pt_position + ct_offset_ + header_size_) / pt_segment_size_;
+}
+
+util::Status DecryptingRandomAccessStream::ReadAndDecryptSegment(
+    int segment_nr, Buffer* ct_buffer, std::vector<uint8_t>* pt_segment) {
+  int64_t ct_position = segment_nr * ct_segment_size_;
+  int segment_size = ct_segment_size_;
+  if (segment_nr == 0) {
+    ct_position = ct_offset_ + header_size_;
+    segment_size = ct_segment_size_ - ct_position;
+  }
+  bool is_last_segment = (segment_nr == segment_count_ - 1);
+  auto pread_status = ct_source_->PRead(ct_position, segment_size, ct_buffer);
+  if (pread_status.ok() ||
+      (is_last_segment && ct_buffer->size() > 0 &&
+       pread_status.error_code() == util::error::OUT_OF_RANGE)) {
+    // some bytes were read
+    auto dec_status = segment_decrypter_->DecryptSegment(
+        std::vector<uint8_t>(ct_buffer->get_mem_block(),
+                             ct_buffer->get_mem_block() + ct_buffer->size()),
+        segment_nr, is_last_segment, pt_segment);
+    if (dec_status.ok()) {
+      return is_last_segment ?
+          Status(util::error::OUT_OF_RANGE, "EOF") : Status::OK;
+    }
+    return dec_status;
+  }
+  return pread_status;
+}
+
+util::Status DecryptingRandomAccessStream::PReadAndDecrypt(
+    int64_t position, int count, Buffer* dest_buffer) {
+  if (position < 0 || count < 0 || dest_buffer == nullptr
+      || count > dest_buffer->allocated_size() || dest_buffer->size() != 0) {
+    return Status(util::error::INTERNAL,
+                  "Invalid parameters to PReadAndDecrypt");
+  }
+
+  auto pt_size_result = size();
+  if (pt_size_result.ok()) {
+    auto pt_size = pt_size_result.ValueOrDie();
+    if (position > pt_size) {
+      return Status(util::error::OUT_OF_RANGE,
+                    "position is larger than stream size");
+    }
+  }
+  auto ct_buffer_result = Buffer::New(ct_segment_size_);
+  if (!ct_buffer_result.ok()) {
+    return ToStatusF(util::error::INVALID_ARGUMENT,
+                     "Invalid ciphertext segment size %d.",
+                     ct_segment_size_);
+  }
+  auto ct_buffer = std::move(ct_buffer_result.ValueOrDie());
+  std::vector<uint8_t> pt_segment;
+  int remaining = count;
+  int read_count = 0;
+  int pt_offset = GetPlaintextOffset(position);
+  while (remaining > 0) {
+    auto segment_nr = GetSegmentNr(position + read_count);
+    auto status =
+        ReadAndDecryptSegment(segment_nr, ct_buffer.get(), &pt_segment);
+    if (status.ok() || status.error_code() == util::error::OUT_OF_RANGE) {
+      int pt_count = pt_segment.size() - pt_offset;
+      int to_copy_count = std::min(pt_count, remaining);
+      auto s = dest_buffer->set_size(read_count + to_copy_count);
+      if (!s.ok()) return s;
+      std::memcpy(dest_buffer->get_mem_block() + read_count,
+                  pt_segment.data() + pt_offset, to_copy_count);
+      pt_offset = 0;
+      if (status.error_code() == util::error::OUT_OF_RANGE &&
+          to_copy_count == pt_count)
+        return status;
+      read_count += to_copy_count;
+      remaining = count - dest_buffer->size();
+    } else {  // some other error happened
+      return status;
+    }
+  }
+  return util::Status::OK;
+}
+
+StatusOr<int64_t> DecryptingRandomAccessStream::size() {
+  {  // Initialize, if not initialized yet.
+    absl::MutexLock lock(&status_mutex_);
+    InitializeIfNeeded();
+    if (!status_.ok()) return status_;
+  }
+  return pt_size_;
+}
+
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/decrypting_random_access_stream.h b/cc/subtle/decrypting_random_access_stream.h
new file mode 100644
index 0000000..d200bd9
--- /dev/null
+++ b/cc/subtle/decrypting_random_access_stream.h
@@ -0,0 +1,95 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_SUBTLE_DECRYPTING_RANDOM_ACCESS_STREAM_H_
+#define TINK_SUBTLE_DECRYPTING_RANDOM_ACCESS_STREAM_H_
+
+#include <memory>
+#include <vector>
+
+#include "absl/synchronization/mutex.h"
+#include "tink/random_access_stream.h"
+#include "tink/subtle/stream_segment_decrypter.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+
+// A RandomAccessStream that wraps another RandomAccessStream
+// as a ciphertext source, and provides a "plaintext access" to
+// the plaintext data contained in the ciphertext:
+//  - PRead()-calls to this class read appropriate segments
+//    of the ciphertext, decrypt them, and return the resulting
+//    plaintext, where the 'position' and 'count' arguments
+//    refer to the plaintext bytes.
+//  - size()-call returns the size of the entire plaintext
+//    if it were to be decrypted.
+// Instances of this class are thread safe.
+class DecryptingRandomAccessStream : public crypto::tink::RandomAccessStream {
+ public:
+  // A factory that produces decrypting random access streams.
+  // The returned stream is a wrapper around 'ciphertext_source',
+  // such that any bytes written via the wrapper are AEAD-decrypted
+  // by 'segment_decrypter' using 'associated_data' as associated
+  // authenticated data.
+  static crypto::tink::util::StatusOr<
+      std::unique_ptr<crypto::tink::RandomAccessStream>>
+  New(std::unique_ptr<StreamSegmentDecrypter> segment_decrypter,
+      std::unique_ptr<crypto::tink::RandomAccessStream> ciphertext_source);
+
+  // -----------------------
+  // Methods of RandomAccessStream-interface implemented by this class.
+  crypto::tink::util::Status PRead(
+      int64_t position, int count,
+      crypto::tink::util::Buffer* dest_buffer) override;
+  crypto::tink::util::StatusOr<int64_t> size() override;
+
+ private:
+  DecryptingRandomAccessStream() {}
+  crypto::tink::util::Status PReadAndDecrypt(
+      int64_t position, int count, crypto::tink::util::Buffer* dest_buffer);
+  // Reads the specified ciphertext segment from ct_source_, decrypts it,
+  // and writes the resulting plaintext bytes to pt_segment.
+  // Uses the provided ct_buffer as a buffer for the ciphertext segment.
+  crypto::tink::util::Status ReadAndDecryptSegment(
+      int segment_nr, crypto::tink::util::Buffer* ct_buffer,
+      std::vector<uint8_t>* pt_segment);
+  // Returns the segment number that contains the specified 'pt_position'.
+  int GetSegmentNr(int64_t pt_position);
+  // Returns the offset within a segment for the specified 'pt_position'
+  int GetPlaintextOffset(int64_t pt_position);
+  // Initializes this stream (if not initialized yet or in a permantent error)
+  // by reading the stream header from ct_source_ and using it initialize
+  // segment_decrypter_.
+  void InitializeIfNeeded();
+  std::unique_ptr<StreamSegmentDecrypter> segment_decrypter_;
+  std::unique_ptr<crypto::tink::RandomAccessStream> ct_source_;
+
+  mutable absl::Mutex status_mutex_;
+  crypto::tink::util::Status status_ ABSL_GUARDED_BY(status_mutex_);
+  int header_size_;
+  int ct_offset_;
+  int ct_segment_size_;
+  int pt_segment_size_;
+  int ct_segment_overhead_;
+  int segment_count_;
+  int64_t pt_size_;
+};
+
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_SUBTLE_DECRYPTING_RANDOM_ACCESS_STREAM_H_
diff --git a/cc/subtle/decrypting_random_access_stream_test.cc b/cc/subtle/decrypting_random_access_stream_test.cc
new file mode 100644
index 0000000..7810aea
--- /dev/null
+++ b/cc/subtle/decrypting_random_access_stream_test.cc
@@ -0,0 +1,331 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/subtle/decrypting_random_access_stream.h"
+
+#include <sstream>
+#include <vector>
+
+#include "gtest/gtest.h"
+#include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "tink/output_stream.h"
+#include "tink/random_access_stream.h"
+#include "tink/streaming_aead.h"
+#include "tink/subtle/random.h"
+#include "tink/subtle/test_util.h"
+#include "tink/util/file_random_access_stream.h"
+#include "tink/util/ostream_output_stream.h"
+#include "tink/util/status.h"
+#include "tink/util/test_matchers.h"
+#include "tink/util/test_util.h"
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+namespace {
+
+using crypto::tink::subtle::test::DummyStreamingAead;
+using crypto::tink::subtle::test::DummyStreamSegmentDecrypter;
+using crypto::tink::test::GetTestFileDescriptor;
+using crypto::tink::test::IsOk;
+using crypto::tink::test::StatusIs;
+using google::crypto::tink::Keyset;
+using google::crypto::tink::KeyStatusType;
+using google::crypto::tink::OutputPrefixType;
+using subtle::test::WriteToStream;
+using testing::HasSubstr;
+
+// Creates a RandomAccessStream with the specified contents.
+std::unique_ptr<RandomAccessStream> GetRandomAccessStream(
+    absl::string_view contents) {
+  static int index = 1;
+  std::string filename = absl::StrCat("stream_data_file_", index, ".txt");
+  index++;
+  int input_fd = GetTestFileDescriptor(filename, contents);
+  return {absl::make_unique<util::FileRandomAccessStream>(input_fd)};
+}
+
+// Returns a ciphertext resulting from encryption of 'pt' with 'aad' as
+// associated data, using 'saead'.
+std::string GetCiphertext(StreamingAead* saead,
+                     absl::string_view pt,
+                     absl::string_view aad,
+                     int ct_offset) {
+  // Prepare ciphertext destination stream.
+  auto ct_stream = absl::make_unique<std::stringstream>();
+  // Write ct_offset 'o'-characters for the ciphertext offset.
+  *ct_stream << std::string(ct_offset, 'o');
+  // A reference to the ciphertext buffer.
+  auto ct_buf = ct_stream->rdbuf();
+  std::unique_ptr<OutputStream> ct_destination(
+      absl::make_unique<util::OstreamOutputStream>(std::move(ct_stream)));
+
+  // Compute the ciphertext.
+  auto enc_stream_result =
+      saead->NewEncryptingStream(std::move(ct_destination), aad);
+  EXPECT_THAT(enc_stream_result.status(), IsOk());
+  EXPECT_THAT(WriteToStream(enc_stream_result.ValueOrDie().get(), pt), IsOk());
+
+  return ct_buf->str();
+}
+
+// Creates an RandomAccessStream that contains ciphertext resulting
+// from encryption of 'pt' with 'aad' as associated data, using 'saead'.
+std::unique_ptr<RandomAccessStream> GetCiphertextSource(StreamingAead* saead,
+                                                        absl::string_view pt,
+                                                        absl::string_view aad,
+                                                        int ct_offset) {
+  return GetRandomAccessStream(GetCiphertext(saead, pt, aad, ct_offset));
+}
+
+// Reads the entire 'ra_stream', until no more bytes can be read,
+// and puts the read bytes into 'contents'.
+// Returns the status of the last ra_stream->PRead()-operation.
+util::Status ReadAll(RandomAccessStream* ra_stream, std::string* contents) {
+  int chunk_size = 42;
+  contents->clear();
+  auto buffer = std::move(util::Buffer::New(chunk_size).ValueOrDie());
+  int64_t position = 0;
+  auto status = util::Status::OK;
+  while (status.ok()) {
+    status = ra_stream->PRead(position, chunk_size, buffer.get());
+    contents->append(buffer->get_mem_block(), buffer->size());
+    position = contents->size();
+  }
+  return status;
+}
+
+TEST(DecryptingRandomAccessStreamTest, BasicDecryption) {
+  for (int pt_size : {1, 5, 20, 42, 100, 1000, 10000}) {
+    std::string plaintext = subtle::Random::GetRandomBytes(pt_size);
+    for (int pt_segment_size : {50, 100, 123}) {
+      for (int header_size : {5, 10, 15}) {
+        for (int ct_offset : {0, 1, 5, 12}) {
+          SCOPED_TRACE(absl::StrCat(
+              "pt_size = ", pt_size, ", pt_segment_size = ", pt_segment_size,
+              ", header_size = ", header_size, ", ct_offset = ", ct_offset));
+          DummyStreamingAead saead(pt_segment_size, header_size, ct_offset);
+          // Pre-compute the ciphertext.
+          auto ciphertext =
+              GetCiphertextSource(&saead, plaintext, "some aad", ct_offset);
+          // Check the decryption of the pre-computed ciphertext.
+          auto seg_decrypter = absl::make_unique<DummyStreamSegmentDecrypter>(
+              pt_segment_size, header_size, ct_offset);
+          auto dec_stream_result = DecryptingRandomAccessStream::New(
+              std::move(seg_decrypter), std::move(ciphertext));
+          EXPECT_THAT(dec_stream_result.status(), IsOk());
+          auto dec_stream = std::move(dec_stream_result.ValueOrDie());
+          EXPECT_EQ(pt_size, dec_stream->size().ValueOrDie());
+          std::string decrypted;
+          auto status = ReadAll(dec_stream.get(), &decrypted);
+          EXPECT_THAT(status,
+                      StatusIs(util::error::OUT_OF_RANGE, HasSubstr("EOF")));
+          EXPECT_EQ(plaintext, decrypted);
+        }
+      }
+    }
+  }
+}
+
+TEST(DecryptingRandomAccessStreamTest, SelectiveDecryption) {
+  for (int pt_size : {1, 20, 42, 100, 1000, 10000}) {
+    std::string plaintext = subtle::Random::GetRandomBytes(pt_size);
+    for (int pt_segment_size : {50, 100, 200}) {
+      for (int header_size : {5, 10, 20}) {
+        for (int ct_offset : {0, 1, 10}) {
+          SCOPED_TRACE(absl::StrCat(
+              "pt_size = ", pt_size, ", pt_segment_size = ", pt_segment_size,
+              ", header_size = ", header_size, ", ct_offset = ", ct_offset));
+          DummyStreamingAead saead(pt_segment_size, header_size, ct_offset);
+          // Pre-compute the ciphertext.
+          auto ciphertext =
+              GetCiphertextSource(&saead, plaintext, "some aad", ct_offset);
+          // Check the decryption of the pre-computed ciphertext.
+          auto seg_decrypter = absl::make_unique<DummyStreamSegmentDecrypter>(
+              pt_segment_size, header_size, ct_offset);
+          auto dec_stream_result = DecryptingRandomAccessStream::New(
+              std::move(seg_decrypter), std::move(ciphertext));
+          EXPECT_THAT(dec_stream_result.status(), IsOk());
+          auto dec_stream = std::move(dec_stream_result.ValueOrDie());
+          for (int position : {0, 1, 2, pt_size / 2, pt_size - 1}) {
+            for (int chunk_size : {1, pt_size / 2, pt_size}) {
+              SCOPED_TRACE(absl::StrCat("position = ", position,
+                                        ", chunk_size = ", chunk_size));
+              auto buffer = std::move(
+                  util::Buffer::New(std::max(chunk_size, 1)).ValueOrDie());
+              auto status =
+                  dec_stream->PRead(position, chunk_size, buffer.get());
+              if (position <= pt_size) {
+                EXPECT_TRUE(status.ok() ||
+                            status.error_code() == util::error::OUT_OF_RANGE);
+              } else {
+                EXPECT_THAT(status, StatusIs(util::error::INVALID_ARGUMENT));
+              }
+              EXPECT_EQ(std::min(chunk_size, std::max(pt_size - position, 0)),
+                        buffer->size());
+              EXPECT_EQ(0,
+                        std::memcmp(plaintext.data() + position,
+                                    buffer->get_mem_block(), buffer->size()));
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+TEST(DecryptingRandomAccessStreamTest, TruncatedCiphertextDecryption) {
+  for (int pt_size : {100, 200, 1000}) {
+    std::string plaintext = subtle::Random::GetRandomBytes(pt_size);
+    for (int pt_segment_size : {50, 70}) {
+      for (int header_size : {5, 10, 20}) {
+        for (int ct_offset : {0, 1, 10}) {
+          SCOPED_TRACE(absl::StrCat(
+              "pt_size = ", pt_size, ", pt_segment_size = ", pt_segment_size,
+              ", header_size = ", header_size, ", ct_offset = ", ct_offset));
+          DummyStreamingAead saead(pt_segment_size, header_size, ct_offset);
+          // Pre-compute the ciphertext.
+          auto ct = GetCiphertext(&saead, plaintext, "some aad", ct_offset);
+          // Check the decryption of a truncated ciphertext.
+          auto seg_decrypter = absl::make_unique<DummyStreamSegmentDecrypter>(
+              pt_segment_size, header_size, ct_offset);
+          for (int trunc_ct_size : {header_size + ct_offset,
+                  static_cast<int>(ct.size()) - 1,
+                  static_cast<int>(ct.size()) - pt_segment_size,
+                  static_cast<int>(ct.size())
+                      - seg_decrypter->get_ciphertext_segment_size()}) {
+            for (int chunk_size : {pt_size}) {
+              SCOPED_TRACE(absl::StrCat("ct_size = ", ct.size(),
+                                        ", trunc_ct_size = ", trunc_ct_size,
+                                        ", chunk_size = ", chunk_size));
+              auto trunc_ct =
+                  GetRandomAccessStream(ct.substr(0, trunc_ct_size));
+              int position = 0;
+              auto per_stream_seg_decrypter =
+                  absl::make_unique<DummyStreamSegmentDecrypter>(
+                      pt_segment_size, header_size, ct_offset);
+              auto dec_stream_result = DecryptingRandomAccessStream::New(
+                  std::move(per_stream_seg_decrypter), std::move(trunc_ct));
+              EXPECT_THAT(dec_stream_result.status(), IsOk());
+              auto dec_stream = std::move(dec_stream_result.ValueOrDie());
+              auto buffer =
+                  std::move(util::Buffer::New(chunk_size).ValueOrDie());
+              auto status =
+                  dec_stream->PRead(position, chunk_size, buffer.get());
+              EXPECT_THAT(status, StatusIs(util::error::INVALID_ARGUMENT));
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+TEST(DecryptingRandomAccessStreamTest, OutOfRangeDecryption) {
+  for (int pt_size : {0, 20, 42, 100, 1000, 10000}) {
+    std::string plaintext = subtle::Random::GetRandomBytes(pt_size);
+    for (int pt_segment_size : {50, 100, 123}) {
+      for (int header_size : {5, 10, 20}) {
+        SCOPED_TRACE(absl::StrCat("pt_size = ", pt_size,
+                                  ", pt_segment_size = ", pt_segment_size,
+                                  ", header_size = ", header_size));
+        int ct_offset = 0;
+        DummyStreamingAead saead(pt_segment_size, header_size, ct_offset);
+        // Pre-compute the ciphertext.
+        auto ciphertext =
+            GetCiphertextSource(&saead, plaintext, "some aad", ct_offset);
+        // Check the decryption of the pre-computed ciphertext.
+        auto seg_decrypter = absl::make_unique<DummyStreamSegmentDecrypter>(
+            pt_segment_size, header_size, ct_offset);
+        auto dec_stream_result = DecryptingRandomAccessStream::New(
+            std::move(seg_decrypter), std::move(ciphertext));
+        EXPECT_THAT(dec_stream_result.status(), IsOk());
+        auto dec_stream = std::move(dec_stream_result.ValueOrDie());
+        int chunk_size = 1;
+        auto buffer = std::move(util::Buffer::New(chunk_size).ValueOrDie());
+        int position = pt_size;
+        // Negative chunk size.
+        auto status = dec_stream->PRead(position, -1, buffer.get());
+        EXPECT_THAT(status, StatusIs(util::error::INVALID_ARGUMENT));
+
+        // Negative position.
+        status = dec_stream->PRead(-1, chunk_size, buffer.get());
+        EXPECT_THAT(status, StatusIs(util::error::INVALID_ARGUMENT));
+
+        // Reading at EOF.
+        status = dec_stream->PRead(position, chunk_size, buffer.get());
+        EXPECT_THAT(status, StatusIs(util::error::OUT_OF_RANGE));
+
+        // Reading past EOF.
+        status = dec_stream->PRead(position + 1 , chunk_size, buffer.get());
+        EXPECT_THAT(status, StatusIs(util::error::INVALID_ARGUMENT));
+      }
+    }
+  }
+}
+
+TEST(DecryptingRandomAccessStreamTest, WrongCiphertext) {
+  int pt_segment_size = 42;
+  int header_size = 10;
+  int ct_offset = 0;
+  for (int ct_size : {0, 10, 100}) {
+    SCOPED_TRACE(absl::StrCat("ct_size = ", ct_size));
+    // Try decrypting a wrong ciphertext.
+    auto wrong_ct =
+        GetRandomAccessStream(subtle::Random::GetRandomBytes(ct_size));
+    auto seg_decrypter = absl::make_unique<DummyStreamSegmentDecrypter>(
+        pt_segment_size, header_size, ct_offset);
+    auto dec_stream_result = DecryptingRandomAccessStream::New(
+        std::move(seg_decrypter), std::move(wrong_ct));
+    EXPECT_THAT(dec_stream_result.status(), IsOk());
+    auto dec_stream = std::move(dec_stream_result.ValueOrDie());
+    std::string decrypted;
+    int chunk_size = 1;
+    int position = 0;
+    auto buffer = std::move(util::Buffer::New(chunk_size).ValueOrDie());
+    auto status = dec_stream->PRead(position, chunk_size, buffer.get());
+    EXPECT_THAT(status, StatusIs(util::error::INVALID_ARGUMENT));
+  }
+}
+
+TEST(DecryptingRandomAccessStreamTest, NullSegmentDecrypter) {
+  auto ct_stream = GetRandomAccessStream("some ciphertext contents");
+  auto dec_stream_result =
+      DecryptingRandomAccessStream::New(nullptr, std::move(ct_stream));
+  EXPECT_THAT(dec_stream_result.status(),
+              StatusIs(util::error::INVALID_ARGUMENT,
+                       HasSubstr("segment_decrypter must be non-null")));
+}
+
+TEST(DecryptingRandomAccessStreamTest, NullCiphertextSource) {
+  int pt_segment_size = 42;
+  int header_size = 10;
+  int ct_offset = 0;
+  auto seg_decrypter = absl::make_unique<DummyStreamSegmentDecrypter>(
+      pt_segment_size, header_size, ct_offset);
+  auto dec_stream_result =
+      DecryptingRandomAccessStream::New(std::move(seg_decrypter), nullptr);
+  EXPECT_THAT(dec_stream_result.status(),
+              StatusIs(util::error::INVALID_ARGUMENT,
+                       HasSubstr("cipertext_source must be non-null")));
+}
+
+}  // namespace
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/ec_util.cc b/cc/subtle/ec_util.cc
index e92146d..6061c1d 100644
--- a/cc/subtle/ec_util.cc
+++ b/cc/subtle/ec_util.cc
@@ -32,6 +32,9 @@
 
 // static
 uint32_t EcUtil::FieldSizeInBytes(EllipticCurveType curve_type) {
+  if (curve_type == EllipticCurveType::CURVE25519) {
+    return 32;
+  }
   auto ec_group_result = SubtleUtilBoringSSL::GetEcGroup(curve_type);
   if (!ec_group_result.ok()) return 0;
   bssl::UniquePtr<EC_GROUP> ec_group(ec_group_result.ValueOrDie());
@@ -42,6 +45,9 @@
 crypto::tink::util::StatusOr<uint32_t> EcUtil::EncodingSizeInBytes(
     EllipticCurveType curve_type, EcPointFormat point_format) {
   int coordinate_size = FieldSizeInBytes(curve_type);
+  if (curve_type == EllipticCurveType::CURVE25519) {
+    return coordinate_size;
+  }
   if (coordinate_size == 0) {
     return ToStatusF(crypto::tink::util::error::INVALID_ARGUMENT,
                      "Unsupported elliptic curve type: %s",
diff --git a/cc/subtle/ec_util_test.cc b/cc/subtle/ec_util_test.cc
index 8c5f747..3ed281b 100644
--- a/cc/subtle/ec_util_test.cc
+++ b/cc/subtle/ec_util_test.cc
@@ -31,6 +31,7 @@
   EXPECT_EQ(384/8, EcUtil::FieldSizeInBytes(EllipticCurveType::NIST_P384));
   EXPECT_EQ((521 + 7)/8,
             EcUtil::FieldSizeInBytes(EllipticCurveType::NIST_P521));
+  EXPECT_EQ((256) / 8, EcUtil::FieldSizeInBytes(EllipticCurveType::CURVE25519));
 
   EXPECT_EQ(0, EcUtil::FieldSizeInBytes(EllipticCurveType::UNKNOWN_CURVE));
 }
@@ -60,6 +61,10 @@
             EcUtil::EncodingSizeInBytes(EllipticCurveType::NIST_P521,
                                         EcPointFormat::COMPRESSED)
             .ValueOrDie());
+  EXPECT_EQ((256) / 8,
+            EcUtil::EncodingSizeInBytes(EllipticCurveType::CURVE25519,
+                                        EcPointFormat::COMPRESSED)
+                .ValueOrDie());
 
   EXPECT_FALSE(EcUtil::EncodingSizeInBytes(EllipticCurveType::NIST_P256,
                                            EcPointFormat::UNKNOWN_FORMAT).ok());
diff --git a/cc/subtle/ecdsa_verify_boringssl.cc b/cc/subtle/ecdsa_verify_boringssl.cc
index 7d08ca0..e78203b 100644
--- a/cc/subtle/ecdsa_verify_boringssl.cc
+++ b/cc/subtle/ecdsa_verify_boringssl.cc
@@ -69,13 +69,14 @@
   status_or_r.ValueOrDie().release();
   status_or_s.ValueOrDie().release();
   uint8_t* der = nullptr;
-  bssl::UniquePtr<uint8_t> unique(der);
   size_t der_len;
   if (!ECDSA_SIG_to_bytes(&der, &der_len, ecdsa.get())) {
     return util::Status(util::error::INVALID_ARGUMENT,
                         "ECDSA_SIG_to_bytes error");
   }
-  return std::string(reinterpret_cast<char*>(der), der_len);
+  std::string result = std::string(reinterpret_cast<char*>(der), der_len);
+  OPENSSL_free(der);
+  return result;
 }
 }  // namespace
 
diff --git a/cc/subtle/ecies_hkdf_recipient_kem_boringssl.cc b/cc/subtle/ecies_hkdf_recipient_kem_boringssl.cc
index 35fec67..5c4485b 100644
--- a/cc/subtle/ecies_hkdf_recipient_kem_boringssl.cc
+++ b/cc/subtle/ecies_hkdf_recipient_kem_boringssl.cc
@@ -17,13 +17,13 @@
 #include "tink/subtle/ecies_hkdf_recipient_kem_boringssl.h"
 
 #include "absl/memory/memory.h"
+#include "openssl/bn.h"
+#include "openssl/curve25519.h"
+#include "openssl/ec.h"
 #include "tink/subtle/common_enums.h"
 #include "tink/subtle/hkdf.h"
 #include "tink/subtle/subtle_util_boringssl.h"
 #include "tink/util/errors.h"
-#include "openssl/bn.h"
-#include "openssl/ec.h"
-
 
 namespace crypto {
 namespace tink {
@@ -31,28 +31,47 @@
 
 // static
 util::StatusOr<std::unique_ptr<EciesHkdfRecipientKemBoringSsl>>
-EciesHkdfRecipientKemBoringSsl::New(
-    EllipticCurveType curve, const std::string& priv_key) {
+EciesHkdfRecipientKemBoringSsl::New(EllipticCurveType curve,
+                                    const std::string& priv_key) {
+  switch (curve) {
+    case EllipticCurveType::NIST_P256:
+    case EllipticCurveType::NIST_P384:
+    case EllipticCurveType::NIST_P521:
+      return EciesHkdfNistPCurveRecipientKemBoringSsl::New(curve, priv_key);
+    case EllipticCurveType::CURVE25519:
+      return EciesHkdfX25519RecipientKemBoringSsl::New(curve, priv_key);
+    default:
+      return util::Status(util::error::UNIMPLEMENTED,
+                          "Unsupported elliptic curve");
+  }
+}
+
+// static
+util::StatusOr<std::unique_ptr<EciesHkdfRecipientKemBoringSsl>>
+EciesHkdfNistPCurveRecipientKemBoringSsl::New(EllipticCurveType curve,
+                                              const std::string& priv_key) {
+  if (priv_key.empty()) {
+    return util::Status(util::error::INVALID_ARGUMENT, "empty priv_key");
+  }
   auto status_or_ec_group = SubtleUtilBoringSSL::GetEcGroup(curve);
   if (!status_or_ec_group.ok()) return status_or_ec_group.status();
-  auto recipient_kem =
-      absl::WrapUnique(new EciesHkdfRecipientKemBoringSsl(curve, priv_key));
   // TODO(przydatek): consider refactoring SubtleUtilBoringSSL,
   //     so that the saved group can be used for KEM operations.
-  recipient_kem->ec_group_.reset(status_or_ec_group.ValueOrDie());
+  std::unique_ptr<EciesHkdfRecipientKemBoringSsl> recipient_kem(
+      new EciesHkdfNistPCurveRecipientKemBoringSsl(
+          curve, priv_key, status_or_ec_group.ValueOrDie()));
   return std::move(recipient_kem);
 }
 
-EciesHkdfRecipientKemBoringSsl::EciesHkdfRecipientKemBoringSsl(
-    EllipticCurveType curve, const std::string& priv_key_value)
-    : curve_(curve), priv_key_value_(priv_key_value) {}
+EciesHkdfNistPCurveRecipientKemBoringSsl::
+    EciesHkdfNistPCurveRecipientKemBoringSsl(EllipticCurveType curve,
+                                             const std::string& priv_key_value,
+                                             EC_GROUP* ec_group)
+    : curve_(curve), priv_key_value_(priv_key_value), ec_group_(ec_group) {}
 
-util::StatusOr<std::string> EciesHkdfRecipientKemBoringSsl::GenerateKey(
-    absl::string_view kem_bytes,
-    HashType hash,
-    absl::string_view hkdf_salt,
-    absl::string_view hkdf_info,
-    uint32_t key_size_in_bytes,
+util::StatusOr<std::string> EciesHkdfNistPCurveRecipientKemBoringSsl::GenerateKey(
+    absl::string_view kem_bytes, HashType hash, absl::string_view hkdf_salt,
+    absl::string_view hkdf_info, uint32_t key_size_in_bytes,
     EcPointFormat point_format) const {
   auto status_or_ec_point =
       SubtleUtilBoringSSL::EcPointDecode(curve_, point_format, kem_bytes);
@@ -61,7 +80,8 @@
                      "Invalid KEM bytes: %s",
                      status_or_ec_point.status().error_message().c_str());
   }
-  bssl::UniquePtr<EC_POINT> pub_key(status_or_ec_point.ValueOrDie());
+  bssl::UniquePtr<EC_POINT> pub_key =
+      std::move(status_or_ec_point.ValueOrDie());
   bssl::UniquePtr<BIGNUM> priv_key(
       BN_bin2bn(reinterpret_cast<const unsigned char*>(priv_key_value_.data()),
                 priv_key_value_.size(), nullptr));
@@ -75,6 +95,55 @@
       hash, kem_bytes, shared_secret, hkdf_salt, hkdf_info, key_size_in_bytes);
 }
 
+EciesHkdfX25519RecipientKemBoringSsl::EciesHkdfX25519RecipientKemBoringSsl(
+    const std::string& private_key) {
+  private_key.copy(reinterpret_cast<char*>(private_key_),
+                   X25519_PRIVATE_KEY_LEN);
+}
+
+// static
+util::StatusOr<std::unique_ptr<EciesHkdfRecipientKemBoringSsl>>
+EciesHkdfX25519RecipientKemBoringSsl::New(EllipticCurveType curve,
+                                          const std::string& priv_key) {
+  if (curve != CURVE25519) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "curve is not CURVE25519");
+  }
+  if (priv_key.size() != X25519_PUBLIC_VALUE_LEN) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "pubx has unexpected length");
+  }
+
+  std::unique_ptr<EciesHkdfRecipientKemBoringSsl> recipient_kem(
+      new EciesHkdfX25519RecipientKemBoringSsl(priv_key));
+  return std::move(recipient_kem);
+}
+
+crypto::tink::util::StatusOr<std::string>
+EciesHkdfX25519RecipientKemBoringSsl::GenerateKey(
+    absl::string_view kem_bytes, HashType hash, absl::string_view hkdf_salt,
+    absl::string_view hkdf_info, uint32_t key_size_in_bytes,
+    EcPointFormat point_format) const {
+  if (point_format != EcPointFormat::COMPRESSED) {
+    return util::Status(
+        util::error::INVALID_ARGUMENT,
+        "X25519 only supports compressed elliptic curve points");
+  }
+
+  if (kem_bytes.size() != X25519_PUBLIC_VALUE_LEN) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "kem_bytes has unexpected size");
+  }
+
+  uint8_t shared_key[X25519_SHARED_KEY_LEN];
+  X25519(shared_key, private_key_,
+         reinterpret_cast<const uint8_t*>(kem_bytes.data()));
+  std::string shared_secret(shared_key, &shared_key[X25519_SHARED_KEY_LEN]);
+
+  return Hkdf::ComputeEciesHkdfSymmetricKey(
+      hash, kem_bytes, shared_secret, hkdf_salt, hkdf_info, key_size_in_bytes);
+}
+
 }  // namespace subtle
 }  // namespace tink
 }  // namespace crypto
diff --git a/cc/subtle/ecies_hkdf_recipient_kem_boringssl.h b/cc/subtle/ecies_hkdf_recipient_kem_boringssl.h
index f0c975d..3c85d98 100644
--- a/cc/subtle/ecies_hkdf_recipient_kem_boringssl.h
+++ b/cc/subtle/ecies_hkdf_recipient_kem_boringssl.h
@@ -18,9 +18,10 @@
 #define TINK_SUBTLE_ECIES_HKDF_RECIPIENT_KEM_BORINGSSL_H_
 
 #include "absl/strings/string_view.h"
+#include "openssl/curve25519.h"
+#include "openssl/ec.h"
 #include "tink/subtle/common_enums.h"
 #include "tink/util/statusor.h"
-#include "openssl/ec.h"
 
 namespace crypto {
 namespace tink {
@@ -32,31 +33,73 @@
  public:
   // Constructs a recipient KEM for the specified curve and recipient's
   // private key, which must be a big-endian byte array.
-  static
-  crypto::tink::util::StatusOr<std::unique_ptr<EciesHkdfRecipientKemBoringSsl>>
-      New(EllipticCurveType curve, const std::string& priv_key);
+  static crypto::tink::util::StatusOr<
+      std::unique_ptr<EciesHkdfRecipientKemBoringSsl>>
+  New(EllipticCurveType curve, const std::string& priv_key);
+
+  // Computes the ecdh's shared secret from our private key and peer's encoded
+  // public key, then uses hkdf to derive the symmetric key from the shared
+  // secret, hkdf info and hkdf salt.
+  virtual crypto::tink::util::StatusOr<std::string> GenerateKey(
+      absl::string_view kem_bytes, HashType hash, absl::string_view hkdf_salt,
+      absl::string_view hkdf_info, uint32_t key_size_in_bytes,
+      EcPointFormat point_format) const = 0;
+
+  virtual ~EciesHkdfRecipientKemBoringSsl() = default;
+};
+
+// Implementation of EciesHkdfRecipientKemBoringSsl for the NIST P-curves.
+class EciesHkdfNistPCurveRecipientKemBoringSsl
+    : public EciesHkdfRecipientKemBoringSsl {
+ public:
+  // Constructs a recipient KEM for the specified curve and recipient's
+  // private key, which must be a big-endian byte array.
+  static crypto::tink::util::StatusOr<
+      std::unique_ptr<EciesHkdfRecipientKemBoringSsl>>
+  New(EllipticCurveType curve, const std::string& priv_key);
 
   // Computes the ecdh's shared secret from our private key and peer's encoded
   // public key, then uses hkdf to derive the symmetric key from the shared
   // secret, hkdf info and hkdf salt.
   crypto::tink::util::StatusOr<std::string> GenerateKey(
-      absl::string_view kem_bytes,
-      HashType hash,
-      absl::string_view hkdf_salt,
-      absl::string_view hkdf_info,
-      uint32_t key_size_in_bytes,
-      EcPointFormat point_format) const;
+      absl::string_view kem_bytes, HashType hash, absl::string_view hkdf_salt,
+      absl::string_view hkdf_info, uint32_t key_size_in_bytes,
+      EcPointFormat point_format) const override;
 
  private:
-  EciesHkdfRecipientKemBoringSsl(
-      EllipticCurveType curve,
-      const std::string& priv_key_value);
+  EciesHkdfNistPCurveRecipientKemBoringSsl(EllipticCurveType curve,
+                                           const std::string& priv_key_value,
+                                           EC_GROUP* ec_group);
 
   EllipticCurveType curve_;
   std::string priv_key_value_;
   bssl::UniquePtr<EC_GROUP> ec_group_;
 };
 
+// Implementation of EciesHkdfRecipientKemBoringSsl for curve25519.
+class EciesHkdfX25519RecipientKemBoringSsl
+    : public EciesHkdfRecipientKemBoringSsl {
+ public:
+  // Constructs a recipient KEM for the specified curve and recipient's
+  // private key, which must be a big-endian byte array.
+  static crypto::tink::util::StatusOr<
+      std::unique_ptr<EciesHkdfRecipientKemBoringSsl>>
+  New(EllipticCurveType curve, const std::string& priv_key);
+
+  // Computes the ecdh's shared secret from our private key and peer's encoded
+  // public key, then uses hkdf to derive the symmetric key from the shared
+  // secret, hkdf info and hkdf salt.
+  crypto::tink::util::StatusOr<std::string> GenerateKey(
+      absl::string_view kem_bytes, HashType hash, absl::string_view hkdf_salt,
+      absl::string_view hkdf_info, uint32_t key_size_in_bytes,
+      EcPointFormat point_format) const override;
+
+ private:
+  explicit EciesHkdfX25519RecipientKemBoringSsl(const std::string& private_key);
+
+  uint8_t private_key_[X25519_PRIVATE_KEY_LEN];
+};
+
 }  // namespace subtle
 }  // namespace tink
 }  // namespace crypto
diff --git a/cc/subtle/ecies_hkdf_recipient_kem_boringssl_test.cc b/cc/subtle/ecies_hkdf_recipient_kem_boringssl_test.cc
index 7e9f263..efda2ff 100644
--- a/cc/subtle/ecies_hkdf_recipient_kem_boringssl_test.cc
+++ b/cc/subtle/ecies_hkdf_recipient_kem_boringssl_test.cc
@@ -41,31 +41,119 @@
   std::string out_key_hex;
 };
 
+static const char kSaltHex[] = "0b0b0b0b";
+static const char kInfoHex[] = "0b0b0b0b0b0b0b0b";
+
+static const char kNistP256PublicValueHex[] =
+    "04700c48f77f56584c5cc632ca65640db91b6bacce3a4df6b42ce7cc838833d287db71e509"
+    "e3fd9b060ddb20ba5c51dcc5948d46fbf640dfe0441782cab85fa4ac";
+static const char kNistP256PrivateKeyHex[] =
+    "7d7dc5f71eb29ddaf80d6214632eeae03d9058af1fb6d22ed80badb62bc1a534";
+static const char kNistP256SharedKeyHex[] =
+    "0f19c0f322fc0a4b73b32bac6a66baa274de261db38a57f11ee4896ede24dbba";
+
+static const char kX25519PublicValueHex[] =
+    "bef00c1a15e0601678ef4899a8506f751cd0c1f4d210a2852ac9d42151d0e160";
+static const char kX25519PrivateKeyHex[] =
+    "df4320cecfd87a5a928355241c9d0e491be499cedf7b2b70687193124039eb92";
+static const char kX25519SharedKeyHex[] =
+    "4c77c4d086e2d267052bad906f8c00092f8ea944fc1dc69eb2fe8bb29df400cc";
+
 static const std::vector<TestVector> test_vector(
     {{EllipticCurveType::NIST_P256, HashType::SHA256,
-      EcPointFormat::UNCOMPRESSED,
-      "04700c48f77f56584c5cc632ca65640db91b6bacce3a4df6b42ce7cc838833d287"
-      "db71e509e3fd9b060ddb20ba5c51dcc5948d46fbf640dfe0441782cab85fa4ac",
-      "7d7dc5f71eb29ddaf80d6214632eeae03d9058af1fb6d22ed80badb62bc1a534",
-      "0b0b0b0b", "0b0b0b0b0b0b0b0b", 32,
-      "0f19c0f322fc0a4b73b32bac6a66baa274de261db38a57f11ee4896ede24dbba"}});
+      EcPointFormat::UNCOMPRESSED, kNistP256PublicValueHex,
+      kNistP256PrivateKeyHex, kSaltHex, kInfoHex, 32, kNistP256SharedKeyHex},
+     {EllipticCurveType::CURVE25519, HashType::SHA256,
+      EcPointFormat::COMPRESSED, kX25519PublicValueHex, kX25519PrivateKeyHex,
+      kSaltHex, kInfoHex, 32, kX25519SharedKeyHex}});
 
 TEST_F(EciesHkdfRecipientKemBoringSslTest, testBasic) {
   for (const TestVector& test : test_vector) {
     auto ecies_kem(std::move(EciesHkdfRecipientKemBoringSsl::New(
         test.curve, test::HexDecodeOrDie(test.priv_hex)).ValueOrDie()));
-    auto status_or_string =
-        ecies_kem->EciesHkdfRecipientKemBoringSsl::GenerateKey(
-            test::HexDecodeOrDie(test.pub_encoded_hex), test.hash,
-            test::HexDecodeOrDie(test.salt_hex),
-            test::HexDecodeOrDie(test.info_hex), test.out_len,
-            test.point_format);
+    auto status_or_string = ecies_kem->GenerateKey(
+        test::HexDecodeOrDie(test.pub_encoded_hex), test.hash,
+        test::HexDecodeOrDie(test.salt_hex),
+        test::HexDecodeOrDie(test.info_hex), test.out_len, test.point_format);
     EXPECT_TRUE(status_or_string.ok());
 
     EXPECT_EQ(test.out_key_hex, test::HexEncode(status_or_string.ValueOrDie()));
   }
 }
 
+TEST_F(EciesHkdfRecipientKemBoringSslTest, testNewUnimplementedCurve) {
+  auto status_or_recipient_kem =
+      EciesHkdfRecipientKemBoringSsl::New(EllipticCurveType::UNKNOWN_CURVE, "");
+  EXPECT_EQ(status_or_recipient_kem.status().error_code(),
+            util::error::UNIMPLEMENTED);
+}
+
+class EciesHkdfNistPCurveRecipientKemBoringSslTest : public ::testing::Test {};
+
+TEST_F(EciesHkdfNistPCurveRecipientKemBoringSslTest, testNew) {
+  auto status_or_recipient_kem = EciesHkdfNistPCurveRecipientKemBoringSsl::New(
+      EllipticCurveType::NIST_P256,
+      test::HexDecodeOrDie(kNistP256PrivateKeyHex));
+  ASSERT_TRUE(status_or_recipient_kem.ok());
+}
+
+TEST_F(EciesHkdfNistPCurveRecipientKemBoringSslTest, testNewInvalidCurve) {
+  auto status_or_recipient_kem = EciesHkdfNistPCurveRecipientKemBoringSsl::New(
+      EllipticCurveType::CURVE25519,
+      test::HexDecodeOrDie(kNistP256PrivateKeyHex));
+  EXPECT_EQ(status_or_recipient_kem.status().error_code(),
+            util::error::UNIMPLEMENTED);
+}
+
+TEST_F(EciesHkdfNistPCurveRecipientKemBoringSslTest, testNewEmptyPrivateKey) {
+  auto status_or_recipient_kem = EciesHkdfNistPCurveRecipientKemBoringSsl::New(
+      EllipticCurveType::CURVE25519, "");
+  EXPECT_EQ(status_or_recipient_kem.status().error_code(),
+            util::error::INVALID_ARGUMENT);
+}
+
+TEST_F(EciesHkdfNistPCurveRecipientKemBoringSslTest, testGenerateKey) {
+  auto status_or_recipient_kem = EciesHkdfNistPCurveRecipientKemBoringSsl::New(
+      EllipticCurveType::NIST_P256,
+      test::HexDecodeOrDie(kNistP256PrivateKeyHex));
+  ASSERT_TRUE(status_or_recipient_kem.ok());
+  auto recipient_kem = std::move(status_or_recipient_kem.ValueOrDie());
+
+  auto status_or_shared_key = recipient_kem->GenerateKey(
+      test::HexDecodeOrDie(kNistP256PublicValueHex), HashType::SHA256,
+      test::HexDecodeOrDie(kSaltHex), test::HexDecodeOrDie(kInfoHex), 32,
+      EcPointFormat::UNCOMPRESSED);
+  ASSERT_TRUE(status_or_shared_key.ok());
+
+  EXPECT_EQ(test::HexEncode(status_or_shared_key.ValueOrDie()),
+            kNistP256SharedKeyHex);
+}
+
+class EciesHkdfX25519RecipientKemBoringSslTest : public ::testing::Test {};
+
+TEST_F(EciesHkdfX25519RecipientKemBoringSslTest, testNew) {
+  auto status_or_recipient_kem = EciesHkdfX25519RecipientKemBoringSsl::New(
+      EllipticCurveType::CURVE25519,
+      test::HexDecodeOrDie(kX25519PrivateKeyHex));
+  ASSERT_TRUE(status_or_recipient_kem.ok());
+}
+
+TEST_F(EciesHkdfX25519RecipientKemBoringSslTest, testNewInvalidCurve) {
+  auto status_or_recipient_kem = EciesHkdfX25519RecipientKemBoringSsl::New(
+      EllipticCurveType::NIST_P256, test::HexDecodeOrDie(kX25519PrivateKeyHex));
+  EXPECT_EQ(status_or_recipient_kem.status().error_code(),
+            util::error::INVALID_ARGUMENT);
+}
+
+TEST_F(EciesHkdfX25519RecipientKemBoringSslTest, testNewShortKey) {
+  std::string private_key = test::HexDecodeOrDie(kX25519PrivateKeyHex);
+  private_key.resize(private_key.size() / 2);
+  auto status_or_recipient_kem = EciesHkdfX25519RecipientKemBoringSsl::New(
+      EllipticCurveType::CURVE25519, private_key);
+  EXPECT_EQ(status_or_recipient_kem.status().error_code(),
+            util::error::INVALID_ARGUMENT);
+}
+
 }  // namespace
 }  // namespace subtle
 }  // namespace tink
diff --git a/cc/subtle/ecies_hkdf_sender_kem_boringssl.cc b/cc/subtle/ecies_hkdf_sender_kem_boringssl.cc
index a8e8bd9..8726373 100644
--- a/cc/subtle/ecies_hkdf_sender_kem_boringssl.cc
+++ b/cc/subtle/ecies_hkdf_sender_kem_boringssl.cc
@@ -17,11 +17,11 @@
 #include "tink/subtle/ecies_hkdf_sender_kem_boringssl.h"
 
 #include "absl/memory/memory.h"
+#include "openssl/bn.h"
+#include "openssl/curve25519.h"
 #include "tink/subtle/common_enums.h"
 #include "tink/subtle/hkdf.h"
 #include "tink/subtle/subtle_util_boringssl.h"
-#include "openssl/bn.h"
-
 
 namespace crypto {
 namespace tink {
@@ -39,32 +39,46 @@
   return symmetric_key_;
 }
 
-EciesHkdfSenderKemBoringSsl::EciesHkdfSenderKemBoringSsl(
-    subtle::EllipticCurveType curve,
-    const std::string& pubx, const std::string& puby)
-    : curve_(curve), pubx_(pubx), puby_(puby), peer_pub_key_(nullptr) {
+// static
+util::StatusOr<std::unique_ptr<EciesHkdfSenderKemBoringSsl>>
+EciesHkdfSenderKemBoringSsl::New(subtle::EllipticCurveType curve,
+                                 const std::string& pubx, const std::string& puby) {
+  switch (curve) {
+    case EllipticCurveType::NIST_P256:
+    case EllipticCurveType::NIST_P384:
+    case EllipticCurveType::NIST_P521:
+      return EciesHkdfNistPCurveSendKemBoringSsl::New(curve, pubx, puby);
+    case EllipticCurveType::CURVE25519:
+      return EciesHkdfX25519SendKemBoringSsl::New(curve, pubx, puby);
+    default:
+      return util::Status(util::error::UNIMPLEMENTED,
+                          "Unsupported elliptic curve");
+  }
 }
 
+EciesHkdfNistPCurveSendKemBoringSsl::EciesHkdfNistPCurveSendKemBoringSsl(
+    subtle::EllipticCurveType curve, const std::string& pubx, const std::string& puby,
+    EC_POINT* peer_pub_key)
+    : curve_(curve), pubx_(pubx), puby_(puby), peer_pub_key_(peer_pub_key) {}
+
 // static
 util::StatusOr<std::unique_ptr<EciesHkdfSenderKemBoringSsl>>
-EciesHkdfSenderKemBoringSsl::New(
-    subtle::EllipticCurveType curve,
-    const std::string& pubx, const std::string& puby) {
+EciesHkdfNistPCurveSendKemBoringSsl::New(subtle::EllipticCurveType curve,
+                                         const std::string& pubx,
+                                         const std::string& puby) {
   auto status_or_ec_point =
       SubtleUtilBoringSSL::GetEcPoint(curve, pubx, puby);
   if (!status_or_ec_point.ok()) return status_or_ec_point.status();
-  auto sender_kem =
-      absl::WrapUnique(new EciesHkdfSenderKemBoringSsl(curve, pubx, puby));
-  sender_kem->peer_pub_key_.reset(status_or_ec_point.ValueOrDie());
+  std::unique_ptr<EciesHkdfSenderKemBoringSsl> sender_kem(
+      new EciesHkdfNistPCurveSendKemBoringSsl(curve, pubx, puby,
+                                              status_or_ec_point.ValueOrDie()));
   return std::move(sender_kem);
 }
 
 util::StatusOr<std::unique_ptr<EciesHkdfSenderKemBoringSsl::KemKey>>
-EciesHkdfSenderKemBoringSsl::GenerateKey(
-    subtle::HashType hash,
-    absl::string_view hkdf_salt,
-    absl::string_view hkdf_info,
-    uint32_t key_size_in_bytes,
+EciesHkdfNistPCurveSendKemBoringSsl::GenerateKey(
+    subtle::HashType hash, absl::string_view hkdf_salt,
+    absl::string_view hkdf_info, uint32_t key_size_in_bytes,
     subtle::EcPointFormat point_format) const {
   if (peer_pub_key_.get() == nullptr) {
     return util::Status(util::error::INTERNAL,
@@ -108,6 +122,63 @@
   return std::move(kem_key);
 }
 
+EciesHkdfX25519SendKemBoringSsl::EciesHkdfX25519SendKemBoringSsl(
+    const std::string& peer_public_value) {
+  peer_public_value.copy(reinterpret_cast<char*>(peer_public_value_),
+                         X25519_PUBLIC_VALUE_LEN);
+}
+
+// static
+util::StatusOr<std::unique_ptr<EciesHkdfSenderKemBoringSsl>>
+EciesHkdfX25519SendKemBoringSsl::New(subtle::EllipticCurveType curve,
+                                     const std::string& pubx, const std::string& puby) {
+  if (curve != CURVE25519) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "curve is not CURVE25519");
+  }
+  if (pubx.size() != X25519_PUBLIC_VALUE_LEN) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "pubx has unexpected length");
+  }
+  if (!puby.empty()) {
+    return util::Status(util::error::INVALID_ARGUMENT, "puby is not empty");
+  }
+  std::unique_ptr<EciesHkdfSenderKemBoringSsl> sender_kem(
+      new EciesHkdfX25519SendKemBoringSsl(pubx));
+  return std::move(sender_kem);
+}
+
+util::StatusOr<std::unique_ptr<EciesHkdfSenderKemBoringSsl::KemKey>>
+EciesHkdfX25519SendKemBoringSsl::GenerateKey(
+    subtle::HashType hash, absl::string_view hkdf_salt,
+    absl::string_view hkdf_info, uint32_t key_size_in_bytes,
+    subtle::EcPointFormat point_format) const {
+  if (point_format != EcPointFormat::COMPRESSED) {
+    return util::Status(
+        util::error::INVALID_ARGUMENT,
+        "X25519 only supports compressed elliptic curve points");
+  }
+
+  uint8_t ephemeral_private_key[X25519_PRIVATE_KEY_LEN];
+  uint8_t ephemeral_public_value[X25519_PUBLIC_VALUE_LEN];
+  X25519_keypair(ephemeral_public_value, ephemeral_private_key);
+  std::string kem_bytes(ephemeral_public_value,
+                   &ephemeral_public_value[X25519_PUBLIC_VALUE_LEN]);
+
+  uint8_t shared_key[X25519_SHARED_KEY_LEN];
+  X25519(shared_key, ephemeral_private_key, peer_public_value_);
+  std::string shared_secret(shared_key, &shared_key[X25519_SHARED_KEY_LEN]);
+
+  auto status_or_string_symmetric_key = Hkdf::ComputeEciesHkdfSymmetricKey(
+      hash, kem_bytes, shared_secret, hkdf_salt, hkdf_info, key_size_in_bytes);
+  if (!status_or_string_symmetric_key.ok()) {
+    return status_or_string_symmetric_key.status();
+  }
+  std::string symmetric_key(status_or_string_symmetric_key.ValueOrDie());
+  auto kem_key = absl::make_unique<KemKey>(kem_bytes, symmetric_key);
+  return std::move(kem_key);
+}
+
 }  // namespace subtle
 }  // namespace tink
 }  // namespace crypto
diff --git a/cc/subtle/ecies_hkdf_sender_kem_boringssl.h b/cc/subtle/ecies_hkdf_sender_kem_boringssl.h
index d20efe9..0cf1917 100644
--- a/cc/subtle/ecies_hkdf_sender_kem_boringssl.h
+++ b/cc/subtle/ecies_hkdf_sender_kem_boringssl.h
@@ -18,9 +18,10 @@
 #define TINK_SUBTLE_ECIES_HKDF_SENDER_KEM_BORINGSSL_H_
 
 #include "absl/strings/string_view.h"
+#include "openssl/curve25519.h"
+#include "openssl/ec.h"
 #include "tink/subtle/common_enums.h"
 #include "tink/util/statusor.h"
-#include "openssl/ec.h"
 
 namespace crypto {
 namespace tink {
@@ -47,27 +48,42 @@
 
   // Constructs a sender KEM for the specified curve and recipient's
   // public key point.  The public key's coordinates are big-endian byte array.
-  static
-  crypto::tink::util::StatusOr<std::unique_ptr<EciesHkdfSenderKemBoringSsl>>
-      New(EllipticCurveType curve,
-          const std::string& pubx,
-          const std::string& puby);
+  static crypto::tink::util::StatusOr<
+      std::unique_ptr<EciesHkdfSenderKemBoringSsl>>
+  New(EllipticCurveType curve, const std::string& pubx, const std::string& puby);
+
+  // Generates ephemeral key pairs, computes ECDH's shared secret based on
+  // generated ephemeral key and recipient's public key, then uses HKDF
+  // to derive the symmetric key from the shared secret, 'hkdf_info' and
+  // hkdf_salt.
+  virtual crypto::tink::util::StatusOr<std::unique_ptr<KemKey>> GenerateKey(
+      HashType hash, absl::string_view hkdf_salt, absl::string_view hkdf_info,
+      uint32_t key_size_in_bytes, EcPointFormat point_format) const = 0;
+
+  virtual ~EciesHkdfSenderKemBoringSsl() = default;
+};
+
+// Implementation of EciesHkdfSenderKemBoringSsl for the NIST P-curves.
+class EciesHkdfNistPCurveSendKemBoringSsl : public EciesHkdfSenderKemBoringSsl {
+ public:
+  // Constructs a sender KEM for the specified curve and recipient's
+  // public key point.  The public key's coordinates are big-endian byte array.
+  static crypto::tink::util::StatusOr<
+      std::unique_ptr<EciesHkdfSenderKemBoringSsl>>
+  New(EllipticCurveType curve, const std::string& pubx, const std::string& puby);
 
   // Generates ephemeral key pairs, computes ECDH's shared secret based on
   // generated ephemeral key and recipient's public key, then uses HKDF
   // to derive the symmetric key from the shared secret, 'hkdf_info' and
   // hkdf_salt.
   crypto::tink::util::StatusOr<std::unique_ptr<KemKey>> GenerateKey(
-      HashType hash,
-      absl::string_view hkdf_salt,
-      absl::string_view hkdf_info,
-      uint32_t key_size_in_bytes,
-      EcPointFormat point_format) const;
+      HashType hash, absl::string_view hkdf_salt, absl::string_view hkdf_info,
+      uint32_t key_size_in_bytes, EcPointFormat point_format) const override;
 
  private:
-  EciesHkdfSenderKemBoringSsl(
-      EllipticCurveType curve,
-      const std::string& pubx, const std::string& puby);
+  EciesHkdfNistPCurveSendKemBoringSsl(EllipticCurveType curve,
+                                      const std::string& pubx, const std::string& puby,
+                                      EC_POINT* peer_pub_key);
 
   EllipticCurveType curve_;
   std::string pubx_;
@@ -75,6 +91,29 @@
   bssl::UniquePtr<EC_POINT> peer_pub_key_;
 };
 
+// Implementation of EciesHkdfSenderKemBoringSsl for curve25519.
+class EciesHkdfX25519SendKemBoringSsl : public EciesHkdfSenderKemBoringSsl {
+ public:
+  // Constructs a sender KEM for the specified curve and recipient's
+  // public key point.  The public key's coordinates are big-endian byte array.
+  static crypto::tink::util::StatusOr<
+      std::unique_ptr<EciesHkdfSenderKemBoringSsl>>
+  New(EllipticCurveType curve, const std::string& pubx, const std::string& puby);
+
+  // Generates ephemeral key pairs, computes ECDH's shared secret based on
+  // generated ephemeral key and recipient's public key, then uses HKDF
+  // to derive the symmetric key from the shared secret, 'hkdf_info' and
+  // hkdf_salt.
+  crypto::tink::util::StatusOr<std::unique_ptr<KemKey>> GenerateKey(
+      HashType hash, absl::string_view hkdf_salt, absl::string_view hkdf_info,
+      uint32_t key_size_in_bytes, EcPointFormat point_format) const override;
+
+ private:
+  explicit EciesHkdfX25519SendKemBoringSsl(const std::string& peer_public_value);
+
+  uint8_t peer_public_value_[X25519_PUBLIC_VALUE_LEN];
+};
+
 }  // namespace subtle
 }  // namespace tink
 }  // namespace crypto
diff --git a/cc/subtle/ecies_hkdf_sender_kem_boringssl_test.cc b/cc/subtle/ecies_hkdf_sender_kem_boringssl_test.cc
index 3377994..ac192ee 100644
--- a/cc/subtle/ecies_hkdf_sender_kem_boringssl_test.cc
+++ b/cc/subtle/ecies_hkdf_sender_kem_boringssl_test.cc
@@ -45,17 +45,35 @@
 
 static const std::vector<TestVector> test_vector(
     {{
-         EllipticCurveType::NIST_P256, HashType::SHA256,
-         EcPointFormat::UNCOMPRESSED, "0b0b0b0b", "0b0b0b0b0b0b0b0b", 32,
+         EllipticCurveType::NIST_P256,
+         HashType::SHA256,
+         EcPointFormat::UNCOMPRESSED,
+         "0b0b0b0b",
+         "0b0b0b0b0b0b0b0b",
+         32,
      },
      {
-         EllipticCurveType::NIST_P256, HashType::SHA256,
-         EcPointFormat::COMPRESSED, "0b0b0b0b", "0b0b0b0b0b0b0b0b", 32,
+         EllipticCurveType::NIST_P256,
+         HashType::SHA256,
+         EcPointFormat::COMPRESSED,
+         "0b0b0b0b",
+         "0b0b0b0b0b0b0b0b",
+         32,
+     },
+     {
+         EllipticCurveType::CURVE25519,
+         HashType::SHA256,
+         EcPointFormat::COMPRESSED,
+         "0b0b0b0b",
+         "0b0b0b0b0b0b0b0b",
+         32,
      }});
 
 TEST_F(EciesHkdfSenderKemBoringSslTest, testSenderRecipientBasic) {
   for (const TestVector& test : test_vector) {
-    auto test_key = SubtleUtilBoringSSL::GetNewEcKey(test.curve).ValueOrDie();
+    auto status_or_test_key = SubtleUtilBoringSSL::GetNewEcKey(test.curve);
+    ASSERT_TRUE(status_or_test_key.ok());
+    auto test_key = status_or_test_key.ValueOrDie();
     auto status_or_sender_kem = EciesHkdfSenderKemBoringSsl::New(
         test.curve, test_key.pub_x, test_key.pub_y);
     ASSERT_TRUE(status_or_sender_kem.ok());
@@ -78,6 +96,140 @@
   }
 }
 
+TEST_F(EciesHkdfSenderKemBoringSslTest, testNewUnknownCurve) {
+  auto status_or_sender_kem = EciesHkdfSenderKemBoringSsl::New(
+      EllipticCurveType::UNKNOWN_CURVE, "", "");
+  EXPECT_EQ(util::error::UNIMPLEMENTED,
+            status_or_sender_kem.status().error_code());
+}
+
+class EciesHkdfNistPCurveSendKemBoringSslTest : public ::testing::Test {};
+
+TEST_F(EciesHkdfNistPCurveSendKemBoringSslTest, testNew) {
+  EllipticCurveType curve = EllipticCurveType::NIST_P256;
+  auto status_or_test_key = SubtleUtilBoringSSL::GetNewEcKey(curve);
+  ASSERT_TRUE(status_or_test_key.ok());
+  auto test_key = status_or_test_key.ValueOrDie();
+  auto status_or_sender_kem = EciesHkdfNistPCurveSendKemBoringSsl::New(
+      curve, test_key.pub_x, test_key.pub_y);
+  ASSERT_TRUE(status_or_sender_kem.ok());
+}
+
+TEST_F(EciesHkdfNistPCurveSendKemBoringSslTest, testNewInvalidCurve) {
+  EllipticCurveType curve = EllipticCurveType::NIST_P256;
+  auto status_or_test_key = SubtleUtilBoringSSL::GetNewEcKey(curve);
+  ASSERT_TRUE(status_or_test_key.ok());
+  auto test_key = status_or_test_key.ValueOrDie();
+  auto status_or_sender_kem = EciesHkdfNistPCurveSendKemBoringSsl::New(
+      EllipticCurveType::CURVE25519, test_key.pub_x, test_key.pub_y);
+  EXPECT_EQ(status_or_sender_kem.status().error_code(),
+            util::error::UNIMPLEMENTED);
+}
+
+TEST_F(EciesHkdfNistPCurveSendKemBoringSslTest, testGenerateKey) {
+  EllipticCurveType curve = EllipticCurveType::NIST_P256;
+  auto status_or_test_key = SubtleUtilBoringSSL::GetNewEcKey(curve);
+  ASSERT_TRUE(status_or_test_key.ok());
+  auto test_key = status_or_test_key.ValueOrDie();
+  auto status_or_sender_kem = EciesHkdfNistPCurveSendKemBoringSsl::New(
+      curve, test_key.pub_x, test_key.pub_y);
+  ASSERT_TRUE(status_or_sender_kem.ok());
+  auto sender_kem = std::move(status_or_sender_kem.ValueOrDie());
+
+  uint32_t key_size_in_bytes = 128;
+  auto status_or_kem_key =
+      sender_kem->GenerateKey(HashType::SHA256, "hkdf_salt", "hkdf_info",
+                              key_size_in_bytes, EcPointFormat::COMPRESSED);
+  ASSERT_TRUE(status_or_kem_key.ok());
+  auto kem_key = std::move(status_or_kem_key.ValueOrDie());
+  EXPECT_FALSE(kem_key->get_kem_bytes().empty());
+  EXPECT_EQ(kem_key->get_symmetric_key().size(), key_size_in_bytes);
+}
+
+class EciesHkdfX25519SendKemBoringSslTest : public ::testing::Test {};
+
+TEST_F(EciesHkdfX25519SendKemBoringSslTest, testNew) {
+  EllipticCurveType curve = EllipticCurveType::CURVE25519;
+  auto status_or_test_key = SubtleUtilBoringSSL::GetNewEcKey(curve);
+  ASSERT_TRUE(status_or_test_key.ok());
+  auto test_key = status_or_test_key.ValueOrDie();
+  auto status_or_sender_kem = EciesHkdfX25519SendKemBoringSsl::New(
+      curve, test_key.pub_x, test_key.pub_y);
+  ASSERT_TRUE(status_or_sender_kem.ok());
+}
+
+TEST_F(EciesHkdfX25519SendKemBoringSslTest, testNewInvalidCurve) {
+  EllipticCurveType curve = EllipticCurveType::CURVE25519;
+  auto status_or_test_key = SubtleUtilBoringSSL::GetNewEcKey(curve);
+  ASSERT_TRUE(status_or_test_key.ok());
+  auto test_key = status_or_test_key.ValueOrDie();
+  auto status_or_sender_kem = EciesHkdfX25519SendKemBoringSsl::New(
+      EllipticCurveType::NIST_P256, test_key.pub_x, test_key.pub_y);
+  EXPECT_EQ(status_or_sender_kem.status().error_code(),
+            util::error::INVALID_ARGUMENT);
+}
+
+TEST_F(EciesHkdfX25519SendKemBoringSslTest, testNewPubxTooLong) {
+  EllipticCurveType curve = EllipticCurveType::CURVE25519;
+  auto status_or_test_key = SubtleUtilBoringSSL::GetNewEcKey(curve);
+  ASSERT_TRUE(status_or_test_key.ok());
+  auto test_key = status_or_test_key.ValueOrDie();
+  test_key.pub_x.resize(test_key.pub_x.size() / 2);
+  auto status_or_sender_kem = EciesHkdfX25519SendKemBoringSsl::New(
+      curve, test_key.pub_x, test_key.pub_y);
+  EXPECT_EQ(status_or_sender_kem.status().error_code(),
+            util::error::INVALID_ARGUMENT);
+}
+
+TEST_F(EciesHkdfX25519SendKemBoringSslTest, testNewPubyNotEmpty) {
+  EllipticCurveType curve = EllipticCurveType::CURVE25519;
+  auto status_or_test_key = SubtleUtilBoringSSL::GetNewEcKey(curve);
+  ASSERT_TRUE(status_or_test_key.ok());
+  auto test_key = status_or_test_key.ValueOrDie();
+  test_key.pub_y = test_key.pub_x;
+  auto status_or_sender_kem = EciesHkdfX25519SendKemBoringSsl::New(
+      curve, test_key.pub_x, test_key.pub_y);
+  EXPECT_EQ(status_or_sender_kem.status().error_code(),
+            util::error::INVALID_ARGUMENT);
+}
+
+TEST_F(EciesHkdfX25519SendKemBoringSslTest, testGenerateKey) {
+  EllipticCurveType curve = EllipticCurveType::CURVE25519;
+  auto status_or_test_key = SubtleUtilBoringSSL::GetNewEcKey(curve);
+  ASSERT_TRUE(status_or_test_key.ok());
+  auto test_key = status_or_test_key.ValueOrDie();
+  auto status_or_sender_kem = EciesHkdfX25519SendKemBoringSsl::New(
+      curve, test_key.pub_x, test_key.pub_y);
+  ASSERT_TRUE(status_or_sender_kem.ok());
+  auto sender_kem = std::move(status_or_sender_kem.ValueOrDie());
+
+  uint32_t key_size_in_bytes = 128;
+  auto status_or_kem_key =
+      sender_kem->GenerateKey(HashType::SHA256, "hkdf_salt", "hkdf_info",
+                              key_size_in_bytes, EcPointFormat::COMPRESSED);
+  ASSERT_TRUE(status_or_kem_key.ok());
+  auto kem_key = std::move(status_or_kem_key.ValueOrDie());
+  EXPECT_EQ(kem_key->get_kem_bytes().size(), X25519_PUBLIC_VALUE_LEN);
+  EXPECT_EQ(kem_key->get_symmetric_key().size(), key_size_in_bytes);
+}
+
+TEST_F(EciesHkdfX25519SendKemBoringSslTest, testGenerateKeyUncompressed) {
+  EllipticCurveType curve = EllipticCurveType::CURVE25519;
+  auto status_or_test_key = SubtleUtilBoringSSL::GetNewEcKey(curve);
+  ASSERT_TRUE(status_or_test_key.ok());
+  auto test_key = status_or_test_key.ValueOrDie();
+  auto status_or_sender_kem = EciesHkdfX25519SendKemBoringSsl::New(
+      curve, test_key.pub_x, test_key.pub_y);
+  ASSERT_TRUE(status_or_sender_kem.ok());
+  auto sender_kem = std::move(status_or_sender_kem.ValueOrDie());
+
+  auto status_or_kem_key =
+      sender_kem->GenerateKey(HashType::SHA256, "hkdf_salt", "hkdf_info", 32,
+                              EcPointFormat::UNCOMPRESSED);
+  EXPECT_EQ(status_or_kem_key.status().error_code(),
+            util::error::INVALID_ARGUMENT);
+}
+
 }  // namespace
 }  // namespace subtle
 }  // namespace tink
diff --git a/cc/subtle/hybrid_test_util.cc b/cc/subtle/hybrid_test_util.cc
new file mode 100644
index 0000000..406ce49
--- /dev/null
+++ b/cc/subtle/hybrid_test_util.cc
@@ -0,0 +1,38 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "tink/subtle/hybrid_test_util.h"
+
+namespace crypto {
+namespace tink {
+
+crypto::tink::util::Status HybridEncryptThenDecrypt(
+    HybridEncrypt* encrypter, HybridDecrypt* decrypter,
+    absl::string_view plaintext, absl::string_view context_info) {
+  auto ciphertext = encrypter->Encrypt(plaintext, context_info);
+  if (!ciphertext.ok()) return ciphertext.status();
+
+  auto decryption =
+      decrypter->Decrypt(ciphertext.ValueOrDie(), context_info);
+  if (!decryption.ok()) return decryption.status();
+
+  if (decryption.ValueOrDie() != plaintext) {
+    return crypto::tink::util::Status(util::error::INVALID_ARGUMENT,
+                                      "decryption and encryption differ");
+  }
+  return util::OkStatus();
+}
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/hybrid_test_util.h b/cc/subtle/hybrid_test_util.h
new file mode 100644
index 0000000..4bdfdcb
--- /dev/null
+++ b/cc/subtle/hybrid_test_util.h
@@ -0,0 +1,35 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_SUBTLE_HYBRID_TEST_UTIL_H_
+#define TINK_SUBTLE_HYBRID_TEST_UTIL_H_
+
+#include "tink/hybrid_decrypt.h"
+#include "tink/hybrid_encrypt.h"
+#include "tink/util/status.h"
+
+// Encrypt with the encrypter, then decrypt with the decrypter. Returns OK if
+// the resulting decryption is equal to the plaintext. Errors are propagated.
+
+namespace crypto {
+namespace tink {
+
+crypto::tink::util::Status HybridEncryptThenDecrypt(
+    HybridEncrypt* encrypter, HybridDecrypt* decrypter,
+    absl::string_view plaintext, absl::string_view context_info);
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_SUBTLE_HYBRID_TEST_UTIL_H_
diff --git a/cc/subtle/hybrid_test_util_test.cc b/cc/subtle/hybrid_test_util_test.cc
new file mode 100644
index 0000000..936cf12
--- /dev/null
+++ b/cc/subtle/hybrid_test_util_test.cc
@@ -0,0 +1,49 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+#include "tink/subtle/hybrid_test_util.h"
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "tink/util/test_matchers.h"
+#include "tink/util/test_util.h"
+
+namespace crypto {
+namespace tink {
+
+namespace {
+
+using ::crypto::tink::test::DummyHybridDecrypt;
+using ::crypto::tink::test::DummyHybridEncrypt;
+using ::crypto::tink::test::IsOk;
+using ::testing::Not;
+
+TEST(EncryptThenDecrypt, Basic) {
+  DummyHybridEncrypt hybrid_encrypt("Encrypt1");
+  DummyHybridDecrypt hybrid_decrypt("Encrypt1");
+  EXPECT_THAT(HybridEncryptThenDecrypt(&hybrid_encrypt, &hybrid_decrypt,
+                                       "plaintext", "aad"),
+              IsOk());
+}
+
+TEST(EncryptThenDecrypt, Failing) {
+  DummyHybridEncrypt hybrid_encrypt("Encrypt1");
+  DummyHybridDecrypt hybrid_decrypt("Encrypt2");
+  EXPECT_THAT(HybridEncryptThenDecrypt(&hybrid_encrypt, &hybrid_decrypt,
+                                       "plaintext", "aad"),
+              Not(IsOk()));
+}
+
+}  // namespace
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/nonce_based_streaming_aead.cc b/cc/subtle/nonce_based_streaming_aead.cc
index 44b163e..d9ed687 100644
--- a/cc/subtle/nonce_based_streaming_aead.cc
+++ b/cc/subtle/nonce_based_streaming_aead.cc
@@ -19,8 +19,12 @@
 #include "absl/strings/string_view.h"
 #include "tink/input_stream.h"
 #include "tink/output_stream.h"
+#include "tink/random_access_stream.h"
 #include "tink/streaming_aead.h"
+#include "tink/subtle/decrypting_random_access_stream.h"
+#include "tink/subtle/stream_segment_decrypter.h"
 #include "tink/subtle/stream_segment_encrypter.h"
+#include "tink/subtle/streaming_aead_decrypting_stream.h"
 #include "tink/subtle/streaming_aead_encrypting_stream.h"
 #include "tink/util/statusor.h"
 
@@ -32,15 +36,33 @@
     NonceBasedStreamingAead::NewEncryptingStream(
         std::unique_ptr<crypto::tink::OutputStream> ciphertext_destination,
         absl::string_view associated_data) {
+  auto segment_encrypter_result = NewSegmentEncrypter(associated_data);
+  if (!segment_encrypter_result.ok()) return segment_encrypter_result.status();
   return StreamingAeadEncryptingStream::New(
-      NewSegmentEncrypter(associated_data), std::move(ciphertext_destination));
+      std::move(segment_encrypter_result.ValueOrDie()),
+      std::move(ciphertext_destination));
 }
 
 crypto::tink::util::StatusOr<std::unique_ptr<crypto::tink::InputStream>>
     NonceBasedStreamingAead::NewDecryptingStream(
         std::unique_ptr<crypto::tink::InputStream> ciphertext_source,
         absl::string_view associated_data) {
-  return util::Status(util::error::UNIMPLEMENTED, "Not implemented yet");
+  auto segment_decrypter_result = NewSegmentDecrypter(associated_data);
+  if (!segment_decrypter_result.ok()) return segment_decrypter_result.status();
+  return StreamingAeadDecryptingStream::New(
+      std::move(segment_decrypter_result.ValueOrDie()),
+      std::move(ciphertext_source));
+}
+
+crypto::tink::util::StatusOr<std::unique_ptr<crypto::tink::RandomAccessStream>>
+    NonceBasedStreamingAead::NewDecryptingRandomAccessStream(
+        std::unique_ptr<crypto::tink::RandomAccessStream> ciphertext_source,
+        absl::string_view associated_data) {
+  auto segment_decrypter_result = NewSegmentDecrypter(associated_data);
+  if (!segment_decrypter_result.ok()) return segment_decrypter_result.status();
+  return DecryptingRandomAccessStream::New(
+      std::move(segment_decrypter_result.ValueOrDie()),
+      std::move(ciphertext_source));
 }
 
 }  // namespace subtle
diff --git a/cc/subtle/nonce_based_streaming_aead.h b/cc/subtle/nonce_based_streaming_aead.h
index 1cf6e11..810ac23 100644
--- a/cc/subtle/nonce_based_streaming_aead.h
+++ b/cc/subtle/nonce_based_streaming_aead.h
@@ -20,7 +20,9 @@
 #include "absl/strings/string_view.h"
 #include "tink/input_stream.h"
 #include "tink/output_stream.h"
+#include "tink/random_access_stream.h"
 #include "tink/streaming_aead.h"
+#include "tink/subtle/stream_segment_decrypter.h"
 #include "tink/subtle/stream_segment_encrypter.h"
 #include "tink/util/statusor.h"
 
@@ -46,13 +48,23 @@
       std::unique_ptr<crypto::tink::InputStream> ciphertext_source,
       absl::string_view associated_data) override;
 
+  crypto::tink::util::StatusOr<
+      std::unique_ptr<crypto::tink::RandomAccessStream>>
+  NewDecryptingRandomAccessStream(
+      std::unique_ptr<crypto::tink::RandomAccessStream> ciphertext_source,
+      absl::string_view associated_data) override;
+
  protected:
   // -----------------------
   // Methods to be implemented by a subclass of this class.
 
   // Returns a new StreamSegmentEncrypter that uses `associated_data` for AEAD.
-  virtual std::unique_ptr<StreamSegmentEncrypter> NewSegmentEncrypter(
-      absl::string_view associated_data) const = 0;
+  virtual crypto::tink::util::StatusOr<std::unique_ptr<StreamSegmentEncrypter>>
+  NewSegmentEncrypter(absl::string_view associated_data) const = 0;
+
+  // Returns a new StreamSegmentDecrypter that uses `associated_data` for AEAD.
+  virtual crypto::tink::util::StatusOr<std::unique_ptr<StreamSegmentDecrypter>>
+  NewSegmentDecrypter(absl::string_view associated_data) const = 0;
 };
 
 }  // namespace subtle
diff --git a/cc/subtle/stream_segment_decrypter.h b/cc/subtle/stream_segment_decrypter.h
new file mode 100644
index 0000000..c7ded9c
--- /dev/null
+++ b/cc/subtle/stream_segment_decrypter.h
@@ -0,0 +1,81 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_SUBTLE_STREAM_SEGMENT_DECRYPTER_H_
+#define TINK_SUBTLE_STREAM_SEGMENT_DECRYPTER_H_
+
+#include <vector>
+
+#include "tink/util/status.h"
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+
+// StreamSegmentDecrypter is a helper class that decrypts individual
+// segments of a stream.
+//
+// Instances of this are passed to an ...DecryptingStream. Each instance
+// of a segment decrypter must be initialized with a header of a ciphertext
+// stream and is used to decrypt that stream.
+//
+// See stream_segment_encrypter.h for more info on the structure of
+// a ciphertext stream.
+class StreamSegmentDecrypter {
+ public:
+  // Decrypts 'ciphertext' as a segment, and writes the resulting plaintext
+  // to 'plaintext_buffer', adjusting its size as needed.
+  // 'ciphertext' and 'plaintext_buffer' must refer to distinct and
+  // non-overlapping space.
+  // Decryption uses the current value returned by get_segment_number()
+  // as the segment number, and subsequently increments the current
+  // segment number.
+  virtual util::Status DecryptSegment(
+      const std::vector<uint8_t>& ciphertext,
+      int64_t segment_number,
+      bool is_last_segment,
+      std::vector<uint8_t>* plaintext_buffer) = 0;
+
+  // Initializes this decrypter, using the information from 'header',
+  // which must be of size exactly get_header_size().
+  virtual util::Status Init(const std::vector<uint8_t>& header) = 0;
+
+  // Returns the size (in bytes) of the header of a ciphertext stream.
+  virtual int get_header_size() const = 0;
+
+  // Returns the size (in bytes) of a plaintext segment.
+  virtual int get_plaintext_segment_size() const = 0;
+
+  // Returns the size (in bytes) of a ciphertext segment.
+  virtual int get_ciphertext_segment_size() const = 0;
+
+  // Returns the offset (in bytes) of the ciphertext within an decrypted stream.
+  // The offset is non-negative, and not larger than
+  //   ciphertext_segment_size - (header_size + segment_overhead)
+  // where
+  //   ciphertext_segment_size = get_ciphertext_segment_size()
+  //   header_size = get_header_size()
+  //   segment_overhead = ciphertext_segment_size - get_plaintext_segment_size()
+  virtual int get_ciphertext_offset() const = 0;
+
+  virtual ~StreamSegmentDecrypter() {}
+};
+
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_SUBTLE_STREAM_SEGMENT_DECRYPTER_H_
diff --git a/cc/subtle/stream_segment_encrypter.h b/cc/subtle/stream_segment_encrypter.h
index f265d23..555e4ed 100644
--- a/cc/subtle/stream_segment_encrypter.h
+++ b/cc/subtle/stream_segment_encrypter.h
@@ -57,10 +57,10 @@
 //    encrypts get_plaintext_segment_size() bytes of plaintext
 //  * if the ciphertext stream encrypts at least one byte of plaintext,
 //    then the last segment encrypts at least one byte of plaintext
-//  * 'other' is (get_ciphertext_offset() - get_header().size()) bytes long,
-//    and represents potential other bytes already written to the stream;
-//    the purpose of ciphertext offset is to allow alignment of ciphertext
-//    segments with segments of the underlying storage or transmission stream.
+//  * 'other' is get_ciphertext_offset() bytes long, and represents potential
+//    other bytes already written to the stream;  the purpose of ciphertext
+//    offset is to allow alignment of ciphertext segments with segments
+//    of the underlying storage or transmission stream.
 class StreamSegmentEncrypter {
  public:
   // Encrypts 'plaintext' as a segment, and writes the resulting ciphertext
@@ -89,7 +89,12 @@
   virtual int get_ciphertext_segment_size() const = 0;
 
   // Returns the offset (in bytes) of the ciphertext within an encrypted stream.
-  // The offset is not smaller than the size of the header.
+  // The offset is non-negative, and not larger than
+  //   ciphertext_segment_size - (header_size + segment_overhead)
+  // where
+  //   ciphertext_segment_size = get_ciphertext_segment_size()
+  //   header_size = get_header().size()
+  //   segment_overhead = ciphertext_segment_size - get_plaintext_segment_size()
   virtual int get_ciphertext_offset() const = 0;
 
   virtual ~StreamSegmentEncrypter() {}
diff --git a/cc/subtle/streaming_aead_decrypting_stream.cc b/cc/subtle/streaming_aead_decrypting_stream.cc
new file mode 100644
index 0000000..66df6c9
--- /dev/null
+++ b/cc/subtle/streaming_aead_decrypting_stream.cc
@@ -0,0 +1,213 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/subtle/streaming_aead_decrypting_stream.h"
+
+#include <algorithm>
+#include <cstring>
+
+#include "absl/memory/memory.h"
+#include "tink/input_stream.h"
+#include "tink/subtle/stream_segment_decrypter.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+using crypto::tink::InputStream;
+using crypto::tink::util::Status;
+using crypto::tink::util::StatusOr;
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+
+namespace {
+
+// Reads at most 'count' bytes from the specified 'input_stream',
+// and puts them into 'output', where both 'input_stream' and 'output'
+// must be non-null.
+// Will try to read exactly 'count' bytes, unless the end of stream
+// is reached (then returns status OUT_OF_RANGE) or an error occurs
+// (an other non-OK status).
+// Before returning, resizes 'output' accordingly, to reflect
+// the actual number of bytes read.
+
+util::Status ReadFromStream(InputStream* input_stream, int count,
+                            std::vector<uint8_t>* output) {
+  if (count <= 0 || input_stream == nullptr || output == nullptr) {
+    return Status(util::error::INTERNAL, "Illegal read from a stream");
+  }
+  const void* buffer;
+  int bytes_to_be_read = count;
+  int read_bytes;    // bytes read in one Next()-call
+  int needed_bytes;  // bytes actually needed
+  output->resize(count);
+  while (bytes_to_be_read > 0) {
+    auto next_result = input_stream->Next(&buffer);
+    if (next_result.status().error_code() == util::error::OUT_OF_RANGE) {
+      // End of stream.
+      output->resize(count - bytes_to_be_read);
+      return next_result.status();
+    }
+    if (!next_result.ok()) return next_result.status();
+    read_bytes = next_result.ValueOrDie();
+    needed_bytes = std::min(read_bytes, bytes_to_be_read);
+    memcpy(output->data() + (count - bytes_to_be_read), buffer, needed_bytes);
+    bytes_to_be_read -= needed_bytes;
+  }
+  if (read_bytes > needed_bytes) {
+    input_stream->BackUp(read_bytes - needed_bytes);
+  }
+  return Status::OK;
+}
+
+}  // anonymous namespace
+
+// static
+StatusOr<std::unique_ptr<InputStream>> StreamingAeadDecryptingStream::New(
+    std::unique_ptr<StreamSegmentDecrypter> segment_decrypter,
+    std::unique_ptr<InputStream> ciphertext_source) {
+  if (segment_decrypter == nullptr) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "segment_decrypter must be non-null");
+  }
+  if (ciphertext_source == nullptr) {
+    return Status(util::error::INVALID_ARGUMENT,
+                  "cipertext_source must be non-null");
+  }
+  std::unique_ptr<StreamingAeadDecryptingStream> dec_stream(
+      new StreamingAeadDecryptingStream());
+  dec_stream->segment_decrypter_ = std::move(segment_decrypter);
+  dec_stream->ct_source_ = std::move(ciphertext_source);
+  int first_segment_size =
+      dec_stream->segment_decrypter_->get_ciphertext_segment_size() -
+      dec_stream->segment_decrypter_->get_ciphertext_offset() -
+      dec_stream->segment_decrypter_->get_header_size();
+  if (first_segment_size <= 0) {
+    return Status(util::error::INTERNAL,
+                  "Size of the first segment must be greater than 0.");
+  }
+  dec_stream->ct_buffer_.resize(first_segment_size);
+  dec_stream->position_ = 0;
+  dec_stream->segment_number_ = 0;
+  dec_stream->is_initialized_ = false;
+  dec_stream->read_last_segment_ = false;
+  dec_stream->count_backedup_ = first_segment_size;
+  dec_stream->pt_buffer_offset_ = 0;
+  dec_stream->status_ = Status::OK;
+  return {std::move(dec_stream)};
+}
+
+StatusOr<int> StreamingAeadDecryptingStream::Next(const void** data) {
+  if (!status_.ok()) return status_;
+
+  // The first call to Next().
+  if (!is_initialized_) {
+    std::vector<uint8_t> header;
+    status_ = ReadFromStream(ct_source_.get(),
+                             segment_decrypter_->get_header_size(), &header);
+    if (status_.error_code() == util::error::OUT_OF_RANGE) {
+      status_ = Status(util::error::INVALID_ARGUMENT,
+                       "Could not read stream header.");
+    }
+    if (!status_.ok()) return status_;
+    status_ = segment_decrypter_->Init(header);
+    if (!status_.ok()) return status_;
+    is_initialized_ = true;
+    count_backedup_ = 0;
+    status_ = ReadFromStream(ct_source_.get(), ct_buffer_.size(), &ct_buffer_);
+    if (!status_.ok() && (status_.error_code() != util::error::OUT_OF_RANGE)) {
+      return status_;
+    }
+    read_last_segment_ = (status_.error_code() == util::error::OUT_OF_RANGE);
+    status_ = segment_decrypter_->DecryptSegment(
+        ct_buffer_,
+        /* segment_number = */ segment_number_,
+        /* is_last_segment = */ read_last_segment_,
+        &pt_buffer_);
+    if (!status_.ok() && !read_last_segment_) {
+      // Try decrypting as the last segment, if haven't tried yet.
+      read_last_segment_ = true;
+      status_ = segment_decrypter_->DecryptSegment(
+          ct_buffer_,
+          /* segment_number = */ segment_number_,
+          /* is_last_segment = */ read_last_segment_,
+          &pt_buffer_);
+    }
+    if (!status_.ok()) return status_;
+    *data = pt_buffer_.data();
+    position_ = pt_buffer_.size();
+    return pt_buffer_.size();
+  }
+
+  // If some bytes were backed up, return them first.
+  if (count_backedup_ > 0) {
+    position_ += count_backedup_;
+    pt_buffer_offset_ = pt_buffer_.size() - count_backedup_;
+    int backedup = count_backedup_;
+    count_backedup_ = 0;
+    *data = pt_buffer_.data() + pt_buffer_offset_;
+    return backedup;
+  }
+
+  // We're past the first segment, and no space was backed up, so we
+  // try to get and decrypt the next ciphertext segment, if any.
+  if (read_last_segment_) {
+    status_ = Status(util::error::OUT_OF_RANGE, "Reached end of stream.");
+    return status_;
+  }
+  segment_number_++;
+  ct_buffer_.resize(segment_decrypter_->get_ciphertext_segment_size());
+  status_ = ReadFromStream(ct_source_.get(), ct_buffer_.size(), &ct_buffer_);
+  if (!status_.ok() && (status_.error_code() != util::error::OUT_OF_RANGE)) {
+    return status_;
+  }
+  read_last_segment_ = (status_.error_code() == util::error::OUT_OF_RANGE);
+  status_ = segment_decrypter_->DecryptSegment(
+      ct_buffer_,
+      /* segment_number = */ segment_number_,
+      /* is_last_segment = */ read_last_segment_,
+      &pt_buffer_);
+  if (!status_.ok() && !read_last_segment_) {
+    // Try decrypting as the last segment, if haven't tried yet.
+    read_last_segment_ = true;
+    status_ = segment_decrypter_->DecryptSegment(
+        ct_buffer_,
+        /* segment_number = */ segment_number_,
+        /* is_last_segment = */ read_last_segment_,
+        &pt_buffer_);
+  }
+  if (!status_.ok()) return status_;
+  *data = pt_buffer_.data();
+  pt_buffer_offset_ = 0;
+  position_ += pt_buffer_.size();
+  return pt_buffer_.size();
+}
+
+void StreamingAeadDecryptingStream::BackUp(int count) {
+  if (!is_initialized_ || !status_.ok() || count < 1) return;
+  int curr_buffer_size = pt_buffer_.size() - pt_buffer_offset_;
+  int actual_count = std::min(count, curr_buffer_size - count_backedup_);
+  count_backedup_ += actual_count;
+  position_ -= actual_count;
+}
+
+int64_t StreamingAeadDecryptingStream::Position() const {
+  return position_;
+}
+
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/streaming_aead_decrypting_stream.h b/cc/subtle/streaming_aead_decrypting_stream.h
new file mode 100644
index 0000000..dd85329
--- /dev/null
+++ b/cc/subtle/streaming_aead_decrypting_stream.h
@@ -0,0 +1,75 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_SUBTLE_STREAMING_AEAD_DECRYPTING_STREAM_H_
+#define TINK_SUBTLE_STREAMING_AEAD_DECRYPTING_STREAM_H_
+
+#include <memory>
+#include <vector>
+
+#include "tink/input_stream.h"
+#include "tink/subtle/stream_segment_decrypter.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+
+class StreamingAeadDecryptingStream : public InputStream {
+ public:
+  // A factory that produces decrypting streams.
+  // The returned stream is a wrapper around 'ciphertext_source',
+  // such that reading via the wrapper leads to AEAD-decryption of the
+  // underlying ciphertext by 'segment_decrypter', using 'associated_data' as
+  // associated authenticated data, and the read bytes are bytes of the
+  // resulting plaintext.
+  static
+  crypto::tink::util::StatusOr<std::unique_ptr<crypto::tink::InputStream>>
+      New(std::unique_ptr<StreamSegmentDecrypter> segment_decrypter,
+          std::unique_ptr<crypto::tink::InputStream> ciphertext_source);
+
+  // -----------------------
+  // Methods of InputStream-interface implemented by this class.
+  crypto::tink::util::StatusOr<int> Next(const void** data) override;
+  void BackUp(int count) override;
+  int64_t Position() const override;
+
+ private:
+  StreamingAeadDecryptingStream() {}
+  std::unique_ptr<StreamSegmentDecrypter> segment_decrypter_;
+  std::unique_ptr<crypto::tink::InputStream> ct_source_;
+  std::vector<uint8_t> ct_buffer_;  // ciphertext buffer
+  std::vector<uint8_t> pt_buffer_;  // plaintext buffer
+  int64_t position_;  // number of plaintext bytes read from this stream
+  int64_t segment_number_;  // current segment number
+  crypto::tink::util::Status status_;  // status of the stream
+
+  // Counters that describe the state of the data in pt_buffer_.
+  int count_backedup_;    // # bytes in pt_buffer_ that were backed up
+  int pt_buffer_offset_;  // offset at which *data starts in pt_buffer_
+
+  // Flag that indicates whether the decrypting stream has been initialized.
+  // If true, the header of the ciphertext stream has been already read
+  // and processed.
+  bool is_initialized_;
+  bool read_last_segment_;
+};
+
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_SUBTLE_STREAMING_AEAD_DECRYPTING_STREAM_H_
diff --git a/cc/subtle/streaming_aead_decrypting_stream_test.cc b/cc/subtle/streaming_aead_decrypting_stream_test.cc
new file mode 100644
index 0000000..29168e2
--- /dev/null
+++ b/cc/subtle/streaming_aead_decrypting_stream_test.cc
@@ -0,0 +1,409 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/subtle/streaming_aead_decrypting_stream.h"
+
+#include <sstream>
+#include <vector>
+
+#include "gtest/gtest.h"
+#include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "tink/input_stream.h"
+#include "tink/subtle/stream_segment_decrypter.h"
+#include "tink/subtle/random.h"
+#include "tink/subtle/test_util.h"
+#include "tink/util/istream_input_stream.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+using crypto::tink::InputStream;
+using crypto::tink::subtle::test::DummyStreamSegmentDecrypter;
+using crypto::tink::subtle::test::DummyStreamSegmentEncrypter;
+using crypto::tink::util::IstreamInputStream;
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+namespace {
+
+// References to objects used for test validation.
+// The objects pointed to are not owned by this structure.
+struct ValidationRefs {
+  DummyStreamSegmentDecrypter* seg_dec;  // segment decrypter
+};
+
+// A helper for creating StreamingAeadDecryptingStream together
+// with references to internal objects, used for test validation.
+std::unique_ptr<InputStream> GetDecryptingStream(
+    int pt_segment_size, int header_size, int ct_offset,
+    absl::string_view ciphertext, ValidationRefs* refs) {
+  // Prepare ciphertext source stream.
+  auto ct_stream = absl::make_unique<std::stringstream>(std::string(ciphertext));
+  std::unique_ptr<InputStream> ct_source(
+      absl::make_unique<IstreamInputStream>(std::move(ct_stream)));
+  auto seg_dec = absl::make_unique<DummyStreamSegmentDecrypter>(
+          pt_segment_size, header_size, ct_offset);
+  // A reference to the segment decrypter, for later validation.
+  refs->seg_dec = seg_dec.get();
+  auto dec_stream = std::move(StreamingAeadDecryptingStream::New(
+      std::move(seg_dec), std::move(ct_source)).ValueOrDie());
+  EXPECT_EQ(0, dec_stream->Position());
+  return dec_stream;
+}
+
+
+class StreamingAeadDecryptingStreamTest : public ::testing::Test {
+};
+
+TEST_F(StreamingAeadDecryptingStreamTest, WritingStreams) {
+  std::vector<int> pt_sizes = {0, 10, 100, 1000, 10000, 100000, 1000000};
+  std::vector<int> pt_segment_sizes = {64, 100, 128, 1000, 1024};
+  std::vector<int> header_sizes = {5, 10, 32};
+  std::vector<int> ct_offsets = {0, 1, 5, 15};
+  for (auto pt_size : pt_sizes) {
+    for (auto pt_segment_size : pt_segment_sizes) {
+      for (auto header_size : header_sizes) {
+        for (auto ct_offset : ct_offsets) {
+          SCOPED_TRACE(absl::StrCat("pt_size = ", pt_size,
+                                    ", pt_segment_size = ", pt_segment_size,
+                                    ", header_size = ", header_size,
+                                    ", ct_offset = ", ct_offset));
+          // Get a decrypting stream.
+          std::string pt = Random::GetRandomBytes(pt_size);
+          DummyStreamSegmentEncrypter seg_enc(pt_segment_size, header_size,
+              ct_offset);
+          std::string ct = seg_enc.GenerateCiphertext(pt);
+
+          ValidationRefs refs;
+          auto dec_stream = GetDecryptingStream(pt_segment_size, header_size,
+              ct_offset, ct, &refs);
+
+          // First buffer returned by Next();
+          const void* buffer;
+          auto next_result = dec_stream->Next(&buffer);
+          EXPECT_TRUE(next_result.ok()) << next_result.status();
+          int buffer_size = next_result.ValueOrDie();
+          int exp_buffer_size = pt_segment_size - (header_size + ct_offset);
+          if (exp_buffer_size > pt_size) exp_buffer_size = pt_size;
+          EXPECT_EQ(exp_buffer_size, buffer_size);
+          EXPECT_EQ(buffer_size, dec_stream->Position());
+
+          // Backup the entire first buffer.
+          dec_stream->BackUp(buffer_size);
+          EXPECT_EQ(0, dec_stream->Position());
+
+          // Read the entire plaintext to the stream.
+          std::string decrypted;
+          auto status = test::ReadFromStream(dec_stream.get(), &decrypted);
+          EXPECT_TRUE(status.ok()) << status;
+          EXPECT_EQ(dec_stream->Position(), pt.size());
+          EXPECT_EQ(pt, decrypted);
+        }
+      }
+    }
+  }
+}
+
+TEST_F(StreamingAeadDecryptingStreamTest, EmptyCiphertext) {
+  int pt_segment_size = 512;
+  int header_size = 64;
+
+  // Get a decrypting stream.
+  ValidationRefs refs;
+  auto dec_stream = GetDecryptingStream(pt_segment_size, header_size,
+      /* ct_offset = */ 0, /* ciphertext = */ "", &refs);
+
+  // First buffer returned by Next();
+  const void* buffer;
+  auto next_result = dec_stream->Next(&buffer);
+  EXPECT_FALSE(next_result.ok());
+  EXPECT_EQ(next_result.status().error_code(), util::error::INVALID_ARGUMENT);
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "Could not read stream header",
+                      next_result.status().error_message());
+}
+
+TEST_F(StreamingAeadDecryptingStreamTest, InvalidStreamHeader) {
+  int pt_segment_size = 512;
+  int header_size = 64;
+
+  // Get a decrypting stream.
+  ValidationRefs refs;
+  auto dec_stream = GetDecryptingStream(pt_segment_size, header_size,
+      /* ct_offset = */ 0, std::string(header_size, 'a'), &refs);
+
+  // First buffer returned by Next();
+  const void* buffer;
+  auto next_result = dec_stream->Next(&buffer);
+  EXPECT_FALSE(next_result.ok());
+  EXPECT_EQ(next_result.status().error_code(), util::error::INVALID_ARGUMENT);
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "Invalid stream header",
+                      next_result.status().error_message());
+}
+
+TEST_F(StreamingAeadDecryptingStreamTest, TruncatedLastSegment) {
+  int pt_segment_size = 120;
+  int pt_size = 500;
+  int header_size = 64;
+
+  // Get a decrypting stream.
+  std::string pt = Random::GetRandomBytes(pt_size);
+  DummyStreamSegmentEncrypter seg_enc(pt_segment_size, header_size,
+      /* ct_offset = */ 0);
+  std::string ct = seg_enc.GenerateCiphertext(pt);
+
+  ValidationRefs refs;
+  auto dec_stream = GetDecryptingStream(pt_segment_size, header_size,
+      /* ct_offset = */ 0, ct.substr(0, ct.size()-2), &refs);
+
+  // First buffer returned by Next();
+  std::string decrypted;
+  auto status = test::ReadFromStream(dec_stream.get(), &decrypted);
+  EXPECT_FALSE(status.ok());
+  EXPECT_EQ(status.error_code(), util::error::INVALID_ARGUMENT);
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "unexpected last-segment marker",
+                      status.error_message());
+}
+
+
+TEST_F(StreamingAeadDecryptingStreamTest, OneSegmentPlaintext) {
+  int pt_segment_size = 512;
+  int header_size = 64;
+
+  // Get a decrypting stream.
+  std::string pt = Random::GetRandomBytes(pt_segment_size - header_size);
+  DummyStreamSegmentEncrypter seg_enc(pt_segment_size, header_size,
+      /* ct_offset = */ 0);
+  std::string ct = seg_enc.GenerateCiphertext(pt);
+  EXPECT_EQ(seg_enc.get_ciphertext_segment_size(), ct.size());
+
+  ValidationRefs refs;
+  auto dec_stream = GetDecryptingStream(pt_segment_size, header_size,
+      /* ct_offset = */ 0, ct, &refs);
+
+  // Get the first segment.
+  const void* buffer;
+  auto next_result = dec_stream->Next(&buffer);
+  int buffer_size = pt_segment_size - header_size;
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(buffer_size, next_result.ValueOrDie());
+  EXPECT_EQ(buffer_size, dec_stream->Position());
+  EXPECT_EQ(pt, std::string(reinterpret_cast<const char*>(buffer), buffer_size));
+
+  // Try getting another segment.
+  next_result = dec_stream->Next(&buffer);
+  EXPECT_FALSE(next_result.ok());
+  EXPECT_EQ(util::error::OUT_OF_RANGE, next_result.status().error_code());
+}
+
+
+TEST_F(StreamingAeadDecryptingStreamTest, OneSegmentAndOneBytePlaintext) {
+  int pt_segment_size = 512;
+  int header_size = 64;
+
+  // Get a decrypting stream.
+  std::string pt = Random::GetRandomBytes(pt_segment_size - header_size + 1);
+  DummyStreamSegmentEncrypter seg_enc(pt_segment_size, header_size,
+      /* ct_offset = */ 0);
+  std::string ct = seg_enc.GenerateCiphertext(pt);
+  EXPECT_EQ(seg_enc.get_ciphertext_segment_size() +
+            DummyStreamSegmentEncrypter::kSegmentTagSize + 1,
+            ct.size());
+
+  ValidationRefs refs;
+  auto dec_stream = GetDecryptingStream(pt_segment_size, header_size,
+      /* ct_offset = */ 0, ct, &refs);
+
+  // Get the first segment.
+  const void* buffer;
+  auto next_result = dec_stream->Next(&buffer);
+  int buffer_size = pt_segment_size - header_size;
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(buffer_size, next_result.ValueOrDie());
+  EXPECT_EQ(buffer_size, dec_stream->Position());
+  EXPECT_EQ(pt.substr(0, buffer_size),
+            std::string(reinterpret_cast<const char*>(buffer), buffer_size));
+
+  // Get the second segment.
+  next_result = dec_stream->Next(&buffer);
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(1, next_result.ValueOrDie());
+  EXPECT_EQ(pt.size(), dec_stream->Position());
+  EXPECT_EQ(pt.at(pt.size()-1), *(reinterpret_cast<const char*>(buffer)));
+
+  // Try getting another segment.
+  next_result = dec_stream->Next(&buffer);
+  EXPECT_FALSE(next_result.ok());
+  EXPECT_EQ(util::error::OUT_OF_RANGE, next_result.status().error_code());
+}
+
+TEST_F(StreamingAeadDecryptingStreamTest, NextAfterBackUp) {
+  int pt_segment_size = 97;
+  int pt_size = 334;
+  int header_size = 30;
+
+  // Get a decrypting stream.
+  std::string pt = Random::GetRandomBytes(pt_size);
+  DummyStreamSegmentEncrypter seg_enc(pt_segment_size, header_size,
+      /* ct_offset = */ 0);
+  std::string ct = seg_enc.GenerateCiphertext(pt);
+  ValidationRefs refs;
+  auto dec_stream = GetDecryptingStream(pt_segment_size, header_size,
+      /* ct_offset = */ 0, ct, &refs);
+
+  // Get the first segment.
+  const void* buffer;
+  auto next_result = dec_stream->Next(&buffer);
+  int buffer_size = pt_segment_size - header_size;
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(buffer_size, next_result.ValueOrDie());
+  EXPECT_EQ(buffer_size, dec_stream->Position());
+  EXPECT_EQ(pt.substr(0, buffer_size),
+            std::string(reinterpret_cast<const char*>(buffer), buffer_size));
+  std::string decrypted_first_segment(
+      reinterpret_cast<const char*>(buffer), buffer_size);
+
+  // Backup part of the first segment, and call Next again.
+  int backup_size = buffer_size / 2;
+  dec_stream->BackUp(backup_size);
+  EXPECT_EQ(buffer_size - backup_size, dec_stream->Position());
+  next_result = dec_stream->Next(&buffer);
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(backup_size, next_result.ValueOrDie());
+  EXPECT_EQ(buffer_size, dec_stream->Position());
+  EXPECT_EQ(pt.substr(buffer_size - backup_size, backup_size),
+            std::string(reinterpret_cast<const char*>(buffer), backup_size));
+
+  // Backup a smaller part of the first segment, and call Next again.
+  int backup2_size = buffer_size / 4;
+  dec_stream->BackUp(backup2_size);
+  EXPECT_EQ(buffer_size - backup2_size, dec_stream->Position());
+  next_result = dec_stream->Next(&buffer);
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(backup2_size, next_result.ValueOrDie());
+  EXPECT_EQ(buffer_size, dec_stream->Position());
+  EXPECT_EQ(pt.substr(buffer_size - backup2_size, backup2_size),
+            std::string(reinterpret_cast<const char*>(buffer), backup2_size));
+
+  // Read the stream to the end.
+  std::string decrypted_rest;
+  auto status = test::ReadFromStream(dec_stream.get(), &decrypted_rest);
+  EXPECT_TRUE(status.ok()) << status;
+  EXPECT_EQ(pt_size, dec_stream->Position());
+  EXPECT_EQ(pt, (decrypted_first_segment + decrypted_rest));
+}
+
+TEST_F(StreamingAeadDecryptingStreamTest, BackupAndPosition) {
+  int pt_segment_size = 555;
+  int pt_size = 2313;
+  int header_size = 33;
+
+  // Get a decrypting stream.
+  std::string pt = Random::GetRandomBytes(pt_size);
+  DummyStreamSegmentEncrypter seg_enc(pt_segment_size, header_size,
+      /* ct_offset = */ 0);
+  std::string ct = seg_enc.GenerateCiphertext(pt);
+  ValidationRefs refs;
+  auto dec_stream = GetDecryptingStream(pt_segment_size, header_size,
+      /* ct_offset = */ 0, ct, &refs);
+
+  // The first segment.
+  const void* buffer;
+  auto next_result = dec_stream->Next(&buffer);
+  int buffer_size = pt_segment_size - header_size;
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(buffer_size, next_result.ValueOrDie());
+  EXPECT_EQ(buffer_size, dec_stream->Position());
+  std::string decrypted_first_segment(
+      reinterpret_cast<const char*>(buffer), buffer_size);
+
+  // BackUp several times, but in total fewer bytes than returned by Next().
+  std::vector<int> backup_sizes = {0, 1, 5, 0, 10, 78, -42, 60, 120, -120};
+  int total_backup_size = 0;
+  for (auto backup_size : backup_sizes) {
+    dec_stream->BackUp(backup_size);
+    total_backup_size += std::max(0, backup_size);
+    EXPECT_EQ(buffer_size - total_backup_size, dec_stream->Position());
+  }
+  EXPECT_LT(total_backup_size, next_result.ValueOrDie());
+
+  // Call Next(), it should succeed (backuped bytes of 1st segment).
+  next_result = dec_stream->Next(&buffer);
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(total_backup_size, next_result.ValueOrDie());
+  EXPECT_EQ(buffer_size, dec_stream->Position());
+
+  // BackUp() some bytes, again fewer than returned by Next().
+  backup_sizes = {0, 72, -94, 37, 82};
+  total_backup_size = 0;
+  for (auto backup_size : backup_sizes) {
+    dec_stream->BackUp(backup_size);
+    total_backup_size += std::max(0, backup_size);
+    EXPECT_EQ(buffer_size - total_backup_size, dec_stream->Position());
+  }
+  EXPECT_LT(total_backup_size, next_result.ValueOrDie());
+
+  // Call Next(), it should succeed  (backuped bytes of 1st segment).
+  next_result = dec_stream->Next(&buffer);
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(total_backup_size, next_result.ValueOrDie());
+  EXPECT_EQ(buffer_size, dec_stream->Position());
+
+  // Call Next() again, it should return a full block (2nd segment).
+  auto prev_position = dec_stream->Position();
+  buffer_size = pt_segment_size;
+  next_result = dec_stream->Next(&buffer);
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(buffer_size, next_result.ValueOrDie());
+  EXPECT_EQ(prev_position + buffer_size, dec_stream->Position());
+
+  // BackUp a few times, with total over the returned buffer_size.
+  backup_sizes = {0, 72, -100, buffer_size / 2, 200, -25, buffer_size / 2, 42};
+  total_backup_size = 0;
+  for (auto backup_size : backup_sizes) {
+    SCOPED_TRACE(absl::StrCat("backup_size = ", backup_size,
+                              ", total_backup_size = ", total_backup_size));
+    dec_stream->BackUp(backup_size);
+    total_backup_size = std::min(buffer_size,
+                                 total_backup_size + std::max(0, backup_size));
+    EXPECT_EQ(prev_position + buffer_size - total_backup_size,
+              dec_stream->Position());
+  }
+  EXPECT_EQ(total_backup_size, buffer_size);
+  EXPECT_EQ(prev_position, dec_stream->Position());
+
+  // Call Next() again, it should return a full segment (2nd segment);
+  next_result = dec_stream->Next(&buffer);
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(buffer_size, next_result.ValueOrDie());
+  EXPECT_EQ(prev_position + buffer_size, dec_stream->Position());
+  EXPECT_EQ(2 * pt_segment_size - header_size, dec_stream->Position());
+
+  // Backup the 2nd segment again, and read the stream to the end.
+  dec_stream->BackUp(buffer_size);
+  EXPECT_EQ(prev_position, dec_stream->Position());
+  std::string decrypted_rest;
+  auto status = test::ReadFromStream(dec_stream.get(), &decrypted_rest);
+  EXPECT_TRUE(status.ok()) << status;
+  EXPECT_EQ(pt_size, dec_stream->Position());
+  EXPECT_EQ(pt, decrypted_first_segment + decrypted_rest);
+}
+
+}  // namespace
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/streaming_aead_encrypting_stream.cc b/cc/subtle/streaming_aead_encrypting_stream.cc
index fd42881..4bad92c 100644
--- a/cc/subtle/streaming_aead_encrypting_stream.cc
+++ b/cc/subtle/streaming_aead_encrypting_stream.cc
@@ -34,8 +34,7 @@
 
 namespace {
 
-
-// Writes 'contents' the specified 'output_stream', which must be non-null.
+// Writes 'contents' to the specified 'output_stream', which must be non-null.
 // In case of errors returns the first non-OK status of
 // output_stream->Next()-operation.
 
@@ -44,8 +43,8 @@
   void* buffer;
   int pos = 0;
   int remaining = contents.size();
-  int available_space;
-  int available_bytes;
+  int available_space = 0;
+  int available_bytes = 0;
   while (remaining > 0) {
     auto next_result = output_stream->Next(&buffer);
     if (!next_result.ok()) return next_result.status();
@@ -81,7 +80,9 @@
   enc_stream->ct_destination_ = std::move(ciphertext_destination);
   int first_segment_size =
       enc_stream->segment_encrypter_->get_plaintext_segment_size() -
-      enc_stream->segment_encrypter_->get_ciphertext_offset();
+      enc_stream->segment_encrypter_->get_ciphertext_offset() -
+      enc_stream->segment_encrypter_->get_header().size();
+
   if (first_segment_size <= 0) {
     return Status(util::error::INTERNAL,
                   "Size of the first segment must be greater than 0.");
@@ -92,6 +93,7 @@
   enc_stream->is_first_segment_ = true;
   enc_stream->count_backedup_ = first_segment_size;
   enc_stream->pt_buffer_offset_ = 0;
+  enc_stream->status_ = Status::OK;
   return {std::move(enc_stream)};
 }
 
@@ -102,8 +104,8 @@
   if (is_first_segment_) {
     is_first_segment_ = false;
     count_backedup_ = 0;
-    status_ = WriteToStream(segment_encrypter_->get_header(),
-                            ct_destination_.get());
+    status_ =
+        WriteToStream(segment_encrypter_->get_header(), ct_destination_.get());
     if (!status_.ok()) return status_;
     *data = pt_buffer_.data();
     position_ = pt_buffer_.size();
@@ -113,7 +115,7 @@
   // If some space was backed up, return it first.
   if (count_backedup_ > 0) {
     position_ += count_backedup_;
-    pt_buffer_offset_ = pt_buffer_.size() - pt_buffer_offset_ - count_backedup_;
+    pt_buffer_offset_ = pt_buffer_.size() - count_backedup_;
     int backedup = count_backedup_;
     count_backedup_ = 0;
     *data = pt_buffer_.data() + pt_buffer_offset_;
@@ -156,8 +158,8 @@
 Status StreamingAeadEncryptingStream::Close() {
   if (!status_.ok()) return status_;
   if (is_first_segment_) {  // Next() was never called.
-    status_ = WriteToStream(segment_encrypter_->get_header(),
-                            ct_destination_.get());
+    status_ =
+        WriteToStream(segment_encrypter_->get_header(), ct_destination_.get());
     if (!status_.ok()) return status_;
   }
 
@@ -172,14 +174,14 @@
   if (pt_last_segment != &pt_to_encrypt_ && (!pt_to_encrypt_.empty())) {
     // Before writing the last segment we must encrypt pt_to_encrypt_.
     status_ = segment_encrypter_->EncryptSegment(
-      pt_to_encrypt_, /* is_last_segment = */ false, &ct_buffer_);
+        pt_to_encrypt_, /* is_last_segment = */ false, &ct_buffer_);
     if (!status_.ok()) {
-      ct_destination_->Close();
+      ct_destination_->Close().IgnoreError();
       return status_;
     }
     status_ = WriteToStream(ct_buffer_, ct_destination_.get());
     if (!status_.ok()) {
-      ct_destination_->Close();
+      ct_destination_->Close().IgnoreError();
       return status_;
     }
   }
@@ -188,21 +190,19 @@
   status_ = segment_encrypter_->EncryptSegment(
       *pt_last_segment, /* is_last_segment = */ true, &ct_buffer_);
   if (!status_.ok()) {
-    ct_destination_->Close();
+    ct_destination_->Close().IgnoreError();
     return status_;
   }
   status_ = WriteToStream(ct_buffer_, ct_destination_.get());
   if (!status_.ok()) {
-    ct_destination_->Close();
+    ct_destination_->Close().IgnoreError();
     return status_;
   }
   status_ = Status(util::error::FAILED_PRECONDITION, "Stream closed");
   return ct_destination_->Close();
 }
 
-int64_t StreamingAeadEncryptingStream::Position() const {
-  return position_;
-}
+int64_t StreamingAeadEncryptingStream::Position() const { return position_; }
 
 }  // namespace subtle
 }  // namespace tink
diff --git a/cc/subtle/streaming_aead_encrypting_stream.h b/cc/subtle/streaming_aead_encrypting_stream.h
index ff13d57..5313eea 100644
--- a/cc/subtle/streaming_aead_encrypting_stream.h
+++ b/cc/subtle/streaming_aead_encrypting_stream.h
@@ -28,15 +28,13 @@
 namespace tink {
 namespace subtle {
 
-class NonceBasedStreamingAead;
-
 class StreamingAeadEncryptingStream : public OutputStream {
  public:
   // A factory that produces encrypting streams.
   // The returned stream is a wrapper around 'ciphertext_destination',
-  // such that any bytes written via the wrapper are streaming AEAD-encrypted
-  // via 'nonce_based_streaming_aead' using 'associated_data' as
-  // associated authenticated data.
+  // such that any bytes written via the wrapper are AEAD-encrypted
+  // by 'segment_encrypter' using 'associated_data' as associated
+  // authenticated data.
   static
   crypto::tink::util::StatusOr<std::unique_ptr<crypto::tink::OutputStream>>
       New(std::unique_ptr<StreamSegmentEncrypter> segment_encrypter,
@@ -63,8 +61,8 @@
   int count_backedup_;    // # bytes in pt_buffer_ that were backed up
   int pt_buffer_offset_;  // offset at which *data starts in pt_buffer_
 
-  // Flag that indicates user obtained a buffer to write data of
-  // the first segment.
+  // Flag that indicates whether the user has obtained a buffer to write
+  // the data of the first segment.
   // If true, Next() was not called yet, which implies that neither
   // header has been written to ct_destination_, nor the user had
   // a chance to write any data to this stream.
diff --git a/cc/subtle/streaming_aead_encrypting_stream_test.cc b/cc/subtle/streaming_aead_encrypting_stream_test.cc
index 60f0a1b..75903c1 100644
--- a/cc/subtle/streaming_aead_encrypting_stream_test.cc
+++ b/cc/subtle/streaming_aead_encrypting_stream_test.cc
@@ -26,124 +26,21 @@
 #include "tink/output_stream.h"
 #include "tink/subtle/stream_segment_encrypter.h"
 #include "tink/subtle/random.h"
+#include "tink/subtle/test_util.h"
 #include "tink/util/ostream_output_stream.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
 
-using crypto::tink::OutputStream;
-using crypto::tink::util::OstreamOutputStream;
-using crypto::tink::util::Status;
-
 namespace crypto {
 namespace tink {
 namespace subtle {
+
+using crypto::tink::OutputStream;
+using crypto::tink::subtle::test::DummyStreamSegmentEncrypter;
+using crypto::tink::util::OstreamOutputStream;
+
 namespace {
 
-// Writes 'contents' the specified 'output_stream', and closes the stream.
-// Returns the status of output_stream->Close()-operation, or a non-OK status
-// of a prior output_stream->Next()-operation, if any.
-Status WriteToStream(OutputStream* output_stream,
-                     absl::string_view contents) {
-  void* buffer;
-  int pos = 0;
-  int remaining = contents.length();
-  int available_space;
-  int available_bytes;
-  while (remaining > 0) {
-    auto next_result = output_stream->Next(&buffer);
-    if (!next_result.ok()) return next_result.status();
-    available_space = next_result.ValueOrDie();
-    available_bytes = std::min(available_space, remaining);
-    memcpy(buffer, contents.data() + pos, available_bytes);
-    remaining -= available_bytes;
-    pos += available_bytes;
-  }
-  if (available_space > available_bytes) {
-    output_stream->BackUp(available_space - available_bytes);
-  }
-  return output_stream->Close();
-}
-
-// Size of the per-segment tag added upon encryption.
-const int kSegmentTagSize = sizeof(int64_t) + 1;
-
-// Bytes for marking whether a given segment is the last one.
-const char kLastSegment = 'l';
-const char kNotLastSegment = 'n';
-
-
-// A dummy encrypter that "encrypts" by just appending to the plaintext
-// the current segment number and a marker byte indicating whether
-// the segment is last one.
-class DummyStreamSegmentEncrypter : public StreamSegmentEncrypter {
- public:
-  DummyStreamSegmentEncrypter(int pt_segment_size,
-                              int header_size,
-                              int ct_offset) :
-      pt_segment_size_(pt_segment_size),
-      ct_offset_(ct_offset),
-      segment_number_(0) {
-    // Fill the header with 'header_size' copies of letter 'h'
-    header_.resize(0);
-    header_.resize(header_size, static_cast<uint8_t>('h'));
-    generated_output_size_ = header_size;
-  }
-
-  util::Status EncryptSegment(
-      const std::vector<uint8_t>& plaintext,
-      bool is_last_segment,
-      std::vector<uint8_t>* ciphertext_buffer) override {
-    ciphertext_buffer->resize(plaintext.size() + kSegmentTagSize);
-    memcpy(ciphertext_buffer->data(), plaintext.data(), plaintext.size());
-    memcpy(ciphertext_buffer->data() + plaintext.size(),
-           &segment_number_, sizeof(segment_number_));
-    // The last byte of the a ciphertext segment.
-    ciphertext_buffer->back() =
-        is_last_segment ? kLastSegment : kNotLastSegment;
-    generated_output_size_ += ciphertext_buffer->size();
-    IncSegmentNumber();
-    return Status::OK;
-  }
-
-  const std::vector<uint8_t>& get_header() const override {
-    return header_;
-  }
-
-  int64_t get_segment_number() const override {
-    return segment_number_;
-  }
-
-  int get_plaintext_segment_size() const override {
-    return pt_segment_size_;
-  }
-
-  int get_ciphertext_segment_size() const override {
-    return pt_segment_size_ + kSegmentTagSize;
-  }
-
-  int get_ciphertext_offset() const override {
-    return ct_offset_;
-  }
-
-  ~DummyStreamSegmentEncrypter() override {}
-
-  int get_generated_output_size() {
-    return generated_output_size_;
-  }
-
- protected:
-  void IncSegmentNumber() override {
-    segment_number_++;
-  }
-
- private:
-  std::vector<uint8_t> header_;
-  int pt_segment_size_;
-  int ct_offset_;
-  int64_t segment_number_;
-  int64_t generated_output_size_;
-};   // class DummyStreamSegmentEncrypter
-
 // References to objects used for test validation.
 // The objects pointed to are not owned by this structure.
 struct ValidationRefs {
@@ -179,26 +76,26 @@
   std::vector<int> pt_sizes = {0, 10, 100, 1000, 10000, 100000, 1000000};
   std::vector<int> pt_segment_sizes = {64, 100, 128, 1000, 1024};
   std::vector<int> header_sizes = {5, 10, 32};
-  std::vector<int> ct_offset_deltas = {0, 1, 5, 15};
+  std::vector<int> ct_offsets = {0, 1, 5, 15};
   for (auto pt_size : pt_sizes) {
     for (auto pt_segment_size : pt_segment_sizes) {
       for (auto header_size : header_sizes) {
-        for (auto offset_delta : ct_offset_deltas) {
+        for (auto ct_offset : ct_offsets) {
           SCOPED_TRACE(absl::StrCat("pt_size = ", pt_size,
                                     ", pt_segment_size = ", pt_segment_size,
                                     ", header_size = ", header_size,
-                                    ", offset_delta = ", offset_delta));
+                                    ", ct_offset = ", ct_offset));
           // Get an encrypting stream.
           ValidationRefs refs;
           auto enc_stream = GetEncryptingStream(pt_segment_size, header_size,
-              /* ct_offset = */ header_size + offset_delta, &refs);
+              ct_offset, &refs);
 
           // First buffer returned by Next();
           void* buffer;
           auto next_result = enc_stream->Next(&buffer);
           EXPECT_TRUE(next_result.ok()) << next_result.status();
           int buffer_size = next_result.ValueOrDie();
-          EXPECT_EQ(pt_segment_size - header_size - offset_delta, buffer_size);
+          EXPECT_EQ(pt_segment_size - (header_size + ct_offset), buffer_size);
           EXPECT_EQ(buffer_size, enc_stream->Position());
 
           // Backup the entire first buffer.
@@ -207,13 +104,14 @@
 
           // Write plaintext to the stream, and close the stream.
           std::string pt = Random::GetRandomBytes(pt_size);
-          auto status = WriteToStream(enc_stream.get(), pt);
+          auto status = test::WriteToStream(enc_stream.get(), pt);
           EXPECT_TRUE(status.ok()) << status;
           EXPECT_EQ(enc_stream->Position(), pt.size());
           EXPECT_EQ(refs.seg_enc->get_generated_output_size(),
                     refs.ct_buf->str().size());
-          EXPECT_EQ(std::string(header_size, 'h'),
-                    refs.ct_buf->str().substr(0, header_size));
+          auto exp_ciphertext = refs.seg_enc->GenerateCiphertext(pt);
+          EXPECT_EQ(exp_ciphertext.size(), refs.ct_buf->str().size());
+          EXPECT_EQ(exp_ciphertext, refs.ct_buf->str());
 
           // Try closing the stream again.
           status = enc_stream->Close();
@@ -232,17 +130,19 @@
   // Get an encrypting stream.
   ValidationRefs refs;
   auto enc_stream = GetEncryptingStream(
-      pt_segment_size, header_size, /* ct_offset = */ header_size, &refs);
+      pt_segment_size, header_size, /* ct_offset = */ 0, &refs);
 
   // Close the stream.
   auto close_status = enc_stream->Close();
   EXPECT_TRUE(close_status.ok()) << close_status;
   EXPECT_EQ(refs.seg_enc->get_generated_output_size(),
             refs.ct_buf->str().size());
-  // Ciphertext contains only the header and an "empty" first block.
-  EXPECT_EQ(header_size + kSegmentTagSize, refs.ct_buf->str().size());
+  // Ciphertext contains only the header and an "empty" first segment.
+  EXPECT_EQ(header_size + DummyStreamSegmentEncrypter::kSegmentTagSize,
+            refs.ct_buf->str().size());
   // The last segment is marked as such.
-  EXPECT_EQ(kLastSegment, refs.ct_buf->str().back());
+  EXPECT_EQ(DummyStreamSegmentEncrypter::kLastSegment,
+            refs.ct_buf->str().back());
 
   // Try closing the stream again.
   close_status = enc_stream->Close();
@@ -258,26 +158,28 @@
   // Get an encrypting stream.
   ValidationRefs refs;
   auto enc_stream = GetEncryptingStream(
-      pt_segment_size, header_size, /* ct_offset = */ header_size, &refs);
+      pt_segment_size, header_size, /* ct_offset = */ 0, &refs);
 
-  // Get the first block.
+  // Get the first segment.
   auto next_result = enc_stream->Next(&buffer);
   int buffer_size = pt_segment_size - header_size;
   EXPECT_TRUE(next_result.ok()) << next_result.status();
   EXPECT_EQ(buffer_size, next_result.ValueOrDie());
   EXPECT_EQ(buffer_size, enc_stream->Position());
 
-  // Backup the entire block, and close the stream.
+  // Backup the entire segment, and close the stream.
   enc_stream->BackUp(buffer_size);
   EXPECT_EQ(0, enc_stream->Position());
   auto close_status = enc_stream->Close();
   EXPECT_TRUE(close_status.ok()) << close_status;
   EXPECT_EQ(refs.seg_enc->get_generated_output_size(),
             refs.ct_buf->str().size());
-  // Ciphertext contains only the header and an "empty" first block.
-  EXPECT_EQ(header_size + kSegmentTagSize, refs.ct_buf->str().size());
+  // Ciphertext contains only the header and an "empty" first segment.
+  EXPECT_EQ(header_size + DummyStreamSegmentEncrypter::kSegmentTagSize,
+            refs.ct_buf->str().size());
   // The last segment is marked as such.
-  EXPECT_EQ(kLastSegment, refs.ct_buf->str().back());
+  EXPECT_EQ(DummyStreamSegmentEncrypter::kLastSegment,
+            refs.ct_buf->str().back());
 
   // Try closing the stream again.
   close_status = enc_stream->Close();
@@ -293,7 +195,7 @@
   // Get an encrypting stream.
   ValidationRefs refs;
   auto enc_stream = GetEncryptingStream(
-      pt_segment_size, header_size, /* ct_offset = */ header_size, &refs);
+      pt_segment_size, header_size, /* ct_offset = */ 0, &refs);
 
   // Get the first segment, and close the stream.
   auto next_result = enc_stream->Next(&buffer);
@@ -305,10 +207,12 @@
   EXPECT_TRUE(close_status.ok()) << close_status;
   EXPECT_EQ(refs.seg_enc->get_generated_output_size(),
             refs.ct_buf->str().size());
-  // Ciphertext contains only header and a full first block.
-  EXPECT_EQ(pt_segment_size + kSegmentTagSize, refs.ct_buf->str().size());
+  // Ciphertext contains only header and a full first segment.
+  EXPECT_EQ(pt_segment_size + DummyStreamSegmentEncrypter::kSegmentTagSize,
+            refs.ct_buf->str().size());
   // The last segment is marked as such.
-  EXPECT_EQ(kLastSegment, refs.ct_buf->str().back());
+  EXPECT_EQ(DummyStreamSegmentEncrypter::kLastSegment,
+            refs.ct_buf->str().back());
 
   // Try closing the stream again.
   close_status = enc_stream->Close();
@@ -316,6 +220,53 @@
   EXPECT_EQ(util::error::FAILED_PRECONDITION, close_status.error_code());
 }
 
+TEST_F(StreamingAeadEncryptingStreamTest, NextAfterBackup) {
+  int pt_segment_size = 512;
+  int part1_size = 123;
+  int part2_size = 74;
+  int header_size = 64;
+  void* buffer;
+
+  // Get an encrypting stream.
+  ValidationRefs refs;
+  auto enc_stream = GetEncryptingStream(
+      pt_segment_size, header_size, /* ct_offset = */ 0, &refs);
+
+  // Get the first segment.
+  auto next_result = enc_stream->Next(&buffer);
+  int buffer_size = pt_segment_size - header_size;
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(buffer_size, next_result.ValueOrDie());
+  EXPECT_EQ(buffer_size, enc_stream->Position());
+
+  // Backup so that only part1_size bytes are written.
+  enc_stream->BackUp(buffer_size - part1_size);
+  EXPECT_EQ(part1_size, enc_stream->Position());
+
+  // Get backed up space.
+  void* backedup_buffer;
+  next_result = enc_stream->Next(&backedup_buffer);
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(buffer_size - part1_size, next_result.ValueOrDie());
+  EXPECT_EQ(reinterpret_cast<uint8_t*>(buffer) + part1_size,
+            reinterpret_cast<uint8_t*>(backedup_buffer));
+
+  // Backup so again that (part1_size + part2_size) bytes are written.
+  enc_stream->BackUp(buffer_size - (part1_size + part2_size));
+  EXPECT_EQ(part1_size + part2_size, enc_stream->Position());
+
+  // Get backed up space again.
+  next_result = enc_stream->Next(&backedup_buffer);
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(buffer_size - (part1_size + part2_size), next_result.ValueOrDie());
+  EXPECT_EQ(reinterpret_cast<uint8_t*>(buffer) + part1_size + part2_size,
+            reinterpret_cast<uint8_t*>(backedup_buffer));
+
+  // Close the stream.
+  auto close_status = enc_stream->Close();
+  EXPECT_TRUE(close_status.ok()) << close_status;
+}
+
 TEST_F(StreamingAeadEncryptingStreamTest, OneSegmentPlaintextWithBackup) {
   int pt_segment_size = 512;
   int pt_size = 200;
@@ -325,9 +276,9 @@
   // Get an encrypting stream.
   ValidationRefs refs;
   auto enc_stream = GetEncryptingStream(
-      pt_segment_size, header_size, /* ct_offset = */ header_size, &refs);
+      pt_segment_size, header_size, /* ct_offset = */ 0, &refs);
 
-  // Get the first block.
+  // Get the first segment.
   auto next_result = enc_stream->Next(&buffer);
   int buffer_size = pt_segment_size - header_size;
   EXPECT_TRUE(next_result.ok()) << next_result.status();
@@ -341,10 +292,13 @@
   EXPECT_TRUE(close_status.ok()) << close_status;
   EXPECT_EQ(refs.seg_enc->get_generated_output_size(),
             refs.ct_buf->str().size());
-  // Ciphertext contains only the header and partial first block.
-  EXPECT_EQ(header_size + pt_size + kSegmentTagSize, refs.ct_buf->str().size());
+  // Ciphertext contains only the header and partial first segment.
+  EXPECT_EQ(
+      header_size + pt_size + DummyStreamSegmentEncrypter::kSegmentTagSize,
+      refs.ct_buf->str().size());
   // The last segment is marked as such.
-  EXPECT_EQ(kLastSegment, refs.ct_buf->str().back());
+  EXPECT_EQ(DummyStreamSegmentEncrypter::kLastSegment,
+            refs.ct_buf->str().back());
 
   // Try closing the stream again.
   close_status = enc_stream->Close();
@@ -360,7 +314,7 @@
   // Get an encrypting stream.
   ValidationRefs refs;
   auto enc_stream = GetEncryptingStream(
-      pt_segment_size, header_size, /* ct_offset = */ header_size, &refs);
+      pt_segment_size, header_size, /* ct_offset = */ 0, &refs);
 
   int seg_count = 5;
   // Get the first segment.
@@ -384,14 +338,17 @@
   EXPECT_EQ(refs.seg_enc->get_generated_output_size(),
             refs.ct_buf->str().size());
   // Ciphertext contains seg_count full segments.
-  int ct_segment_size = pt_segment_size + kSegmentTagSize;
+  int ct_segment_size =
+      pt_segment_size + DummyStreamSegmentEncrypter::kSegmentTagSize;
   EXPECT_EQ(refs.seg_enc->get_ciphertext_segment_size(), ct_segment_size);
   EXPECT_EQ(ct_segment_size * seg_count, refs.ct_buf->str().size());
   // The last segment is marked as such.
-  EXPECT_EQ(kLastSegment, refs.ct_buf->str().back());
+  EXPECT_EQ(DummyStreamSegmentEncrypter::kLastSegment,
+            refs.ct_buf->str().back());
   // The previous segments are marked as not-last ones.
   for (int i = 1; i < seg_count - 1; i++) {
-    EXPECT_EQ(kNotLastSegment, refs.ct_buf->str()[(ct_segment_size * i)-1]);
+    EXPECT_EQ(DummyStreamSegmentEncrypter::kNotLastSegment,
+              refs.ct_buf->str()[(ct_segment_size * i)-1]);
   }
 
   // Try closing the stream again.
@@ -409,7 +366,7 @@
   // Get an encrypting stream.
   ValidationRefs refs;
   auto enc_stream = GetEncryptingStream(
-      pt_segment_size, header_size, /* ct_offset = */ header_size, &refs);
+      pt_segment_size, header_size, /* ct_offset = */ 0, &refs);
 
   int seg_count = 5;
   // Get the first segment.
@@ -435,15 +392,18 @@
   EXPECT_EQ(refs.seg_enc->get_generated_output_size(),
             refs.ct_buf->str().size());
   // Ciphertext contains seg_count full segments, minus the size of the backup.
-  int ct_segment_size = pt_segment_size + kSegmentTagSize;
+  int ct_segment_size =
+      pt_segment_size + DummyStreamSegmentEncrypter::kSegmentTagSize;
   EXPECT_EQ(refs.seg_enc->get_ciphertext_segment_size(), ct_segment_size);
   EXPECT_EQ(ct_segment_size * seg_count - backup_size,
             refs.ct_buf->str().size());
   // The last segment is marked as such.
-  EXPECT_EQ(kLastSegment, refs.ct_buf->str().back());
+  EXPECT_EQ(DummyStreamSegmentEncrypter::kLastSegment,
+            refs.ct_buf->str().back());
   // The previous segments are marked as not-last ones.
   for (int i = 1; i < seg_count - 1; i++) {
-    EXPECT_EQ(kNotLastSegment, refs.ct_buf->str()[(ct_segment_size * i)-1]);
+    EXPECT_EQ(DummyStreamSegmentEncrypter::kNotLastSegment,
+              refs.ct_buf->str()[(ct_segment_size * i)-1]);
   }
 
   // Try closing the stream again.
@@ -460,7 +420,7 @@
   // Get an encrypting stream.
   ValidationRefs refs;
   auto enc_stream = GetEncryptingStream(
-      pt_segment_size, header_size, /* ct_offset = */ header_size, &refs);
+      pt_segment_size, header_size, /* ct_offset = */ 0, &refs);
 
   int seg_count = 5;
   // Get the first segment.
@@ -486,14 +446,17 @@
   EXPECT_EQ(refs.seg_enc->get_generated_output_size(),
             refs.ct_buf->str().size());
   // Ciphertext contains (seg_count - 1) full segments.
-  int ct_segment_size = pt_segment_size + kSegmentTagSize;
+  int ct_segment_size =
+      pt_segment_size + DummyStreamSegmentEncrypter::kSegmentTagSize;
   EXPECT_EQ(refs.seg_enc->get_ciphertext_segment_size(), ct_segment_size);
   EXPECT_EQ(ct_segment_size * (seg_count - 1), refs.ct_buf->str().size());
   // The last segment is marked as such.
-  EXPECT_EQ(kLastSegment, refs.ct_buf->str().back());
+  EXPECT_EQ(DummyStreamSegmentEncrypter::kLastSegment,
+            refs.ct_buf->str().back());
   // The previous segments are marked as not-last ones.
   for (int i = 1; i < seg_count - 1; i++) {
-    EXPECT_EQ(kNotLastSegment, refs.ct_buf->str()[(ct_segment_size * i)-1]);
+    EXPECT_EQ(DummyStreamSegmentEncrypter::kNotLastSegment,
+              refs.ct_buf->str()[(ct_segment_size * i)-1]);
   }
 
   // Try closing the stream again.
@@ -510,7 +473,7 @@
   // Get an encrypting stream.
   ValidationRefs refs;
   auto enc_stream = GetEncryptingStream(
-      pt_segment_size, header_size, /* ct_offset = */ header_size, &refs);
+      pt_segment_size, header_size, /* ct_offset = */ 0, &refs);
 
   // The first buffer.
   auto next_result = enc_stream->Next(&buffer);
@@ -529,7 +492,7 @@
   }
   EXPECT_LT(total_backup_size, next_result.ValueOrDie());
 
-  // Call Next(), it should succeed (backuped bytes of 1st block).
+  // Call Next(), it should succeed (backuped bytes of 1st segment).
   next_result = enc_stream->Next(&buffer);
   EXPECT_TRUE(next_result.ok()) << next_result.status();
   EXPECT_EQ(total_backup_size, next_result.ValueOrDie());
@@ -545,13 +508,13 @@
   }
   EXPECT_LT(total_backup_size, next_result.ValueOrDie());
 
-  // Call Next(), it should succeed  (backuped bytes of 1st block).
+  // Call Next(), it should succeed  (backuped bytes of 1st segment).
   next_result = enc_stream->Next(&buffer);
   EXPECT_TRUE(next_result.ok()) << next_result.status();
   EXPECT_EQ(total_backup_size, next_result.ValueOrDie());
   EXPECT_EQ(buffer_size, enc_stream->Position());
 
-  // Call Next() again, it should return a full block (2nd block).
+  // Call Next() again, it should return a full segment (2nd segment).
   auto prev_position = enc_stream->Position();
   buffer_size = pt_segment_size;
   next_result = enc_stream->Next(&buffer);
@@ -574,14 +537,14 @@
   EXPECT_EQ(total_backup_size, buffer_size);
   EXPECT_EQ(prev_position, enc_stream->Position());
 
-  // Call Next() again, it should return a full block (2nd block);
+  // Call Next() again, it should return a full segment (2nd segment);
   next_result = enc_stream->Next(&buffer);
   EXPECT_TRUE(next_result.ok()) << next_result.status();
   EXPECT_EQ(buffer_size, next_result.ValueOrDie());
   EXPECT_EQ(prev_position + buffer_size, enc_stream->Position());
   EXPECT_EQ(2 * pt_segment_size - header_size, enc_stream->Position());
 
-  // Backup the entire block, and close the stream.
+  // Backup the entire segment, and close the stream.
   enc_stream->BackUp(buffer_size);
   EXPECT_EQ(pt_segment_size - header_size, enc_stream->Position());
   auto close_status = enc_stream->Close();
@@ -589,8 +552,9 @@
   EXPECT_EQ(refs.seg_enc->get_generated_output_size(),
             refs.ct_buf->str().size());
   // Ciphertext contains 1st segment (with header), and no traces
-  // of the "empty" (backed-up) block.
-  EXPECT_EQ((pt_segment_size + kSegmentTagSize), refs.ct_buf->str().size());
+  // of the "empty" (backed-up) segment.
+  EXPECT_EQ((pt_segment_size + DummyStreamSegmentEncrypter::kSegmentTagSize),
+            refs.ct_buf->str().size());
 
   // Try closing the stream again.
   close_status = enc_stream->Close();
diff --git a/cc/subtle/streaming_aead_test_util.cc b/cc/subtle/streaming_aead_test_util.cc
new file mode 100644
index 0000000..8d91050
--- /dev/null
+++ b/cc/subtle/streaming_aead_test_util.cc
@@ -0,0 +1,159 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+#include "tink/subtle/streaming_aead_test_util.h"
+
+#include <sstream>
+#include <string>
+
+#include "tink/random_access_stream.h"
+#include "tink/subtle/test_util.h"
+#include "tink/util/buffer.h"
+#include "tink/util/file_random_access_stream.h"
+#include "tink/util/istream_input_stream.h"
+#include "tink/util/ostream_output_stream.h"
+#include "tink/util/status.h"
+#include "tink/util/test_util.h"
+
+namespace crypto {
+namespace tink {
+
+using ::crypto::tink::test::GetTestFileDescriptor;
+using ::crypto::tink::util::IstreamInputStream;
+using ::crypto::tink::util::OstreamOutputStream;
+using ::crypto::tink::util::Status;
+
+namespace {
+
+// Creates a RandomAccessStream with the specified contents.
+std::unique_ptr<RandomAccessStream> GetRandomAccessStreamContaining(
+    absl::string_view contents) {
+  static int index = 1;
+  std::string filename = absl::StrCat("stream_data_file_", index, ".txt");
+  index++;
+  int input_fd = GetTestFileDescriptor(filename, contents);
+  return {absl::make_unique<util::FileRandomAccessStream>(input_fd)};
+}
+
+// Reads up to 'count' bytes from 'ras' starting at position 'pos'
+// and verifies that the read bytes are equal to the corresponding
+// subsequence in 'full_contents'.
+Status ReadAndVerifyFragment(RandomAccessStream* ras, int pos, int count,
+                             absl::string_view full_contents) {
+  auto buf_result = util::Buffer::New(count);
+  if (!buf_result.ok()) {
+    return Status(crypto::tink::util::error::INTERNAL,
+                  absl::StrCat("Could not allocate buffer of size ", count));
+  }
+  auto buf = std::move(buf_result.ValueOrDie());
+  int full_size = full_contents.size();
+  auto status = ras->PRead(pos, count, buf.get());
+  if (!status.ok() && status.error_code() != util::error::OUT_OF_RANGE) {
+    return Status(
+        crypto::tink::util::error::INTERNAL,
+        absl::StrCat("PRead failed with status: ", status.ToString()));
+  }
+  int exp_size = std::min(count, full_size - pos);
+  if (exp_size != buf->size()) {
+    return Status(crypto::tink::util::error::INTERNAL,
+                  absl::StrCat("PRead returned ", buf->size(), " bytes, while ",
+                               exp_size, " bytes were expected."));
+  }
+  if (std::memcmp(full_contents.data() + pos, buf->get_mem_block(), exp_size)) {
+    return Status(
+        crypto::tink::util::error::INTERNAL,
+        absl::StrCat("PRead returned bytes [",
+                     std::string(buf->get_mem_block(), exp_size), "] while [",
+                     full_contents.substr(pos, exp_size), "] were expected."));
+  }
+  return Status::OK;
+}
+
+}  // namespace
+
+crypto::tink::util::Status EncryptThenDecrypt(StreamingAead* encrypter,
+                                              StreamingAead* decrypter,
+                                              absl::string_view plaintext,
+                                              absl::string_view associated_data,
+                                              int ciphertext_offset) {
+  // Prepare ciphertext destination stream.
+  auto ct_stream = absl::make_unique<std::stringstream>();
+
+  // A reference to the ciphertext buffer, for later validation.
+  auto ct_buf = ct_stream->rdbuf();
+  auto ct_destination =
+      absl::make_unique<OstreamOutputStream>(std::move(ct_stream));
+  auto status = subtle::test::WriteToStream(
+      ct_destination.get(), std::string(ciphertext_offset, 'o'), false);
+  if (!status.ok()) return status;
+
+  // Use encrypter to encrypt some data.
+  auto enc_stream_result = encrypter->NewEncryptingStream(
+      std::move(ct_destination), associated_data);
+  if (!enc_stream_result.ok()) return enc_stream_result.status();
+  auto enc_stream = std::move(enc_stream_result.ValueOrDie());
+  status = subtle::test::WriteToStream(enc_stream.get(), plaintext);
+  if (!status.ok()) return status;
+  if (plaintext.size() != enc_stream->Position()) {
+    return ::crypto::tink::util::Status(
+        crypto::tink::util::error::INTERNAL,
+        "Plaintext size different from stream position.");
+  }
+
+  // Prepare an InputStream with the ciphertext.
+  auto ct_bytes = absl::make_unique<std::stringstream>(
+      ct_buf->str().substr(ciphertext_offset));
+  std::unique_ptr<InputStream> ct_source(
+      absl::make_unique<IstreamInputStream>(std::move(ct_bytes)));
+
+  // Decrypt the ciphertext using the decrypter.
+  auto dec_stream_result = decrypter->NewDecryptingStream(
+      std::move(ct_source), associated_data);
+  if (!dec_stream_result.ok()) return dec_stream_result.status();
+  auto dec_stream = std::move(dec_stream_result.ValueOrDie());
+  std::string decrypted;
+  status = subtle::test::ReadFromStream(dec_stream.get(), &decrypted);
+  if (!status.ok()) {
+    return status;
+  }
+  if (plaintext != decrypted) {
+    return ::crypto::tink::util::Status(crypto::tink::util::error::INTERNAL,
+                                        "Decryption differs from plaintext.");
+  }
+
+  // Prepare a RandomAccessStream with the ciphertext.
+  auto ct_ras = GetRandomAccessStreamContaining(std::string(ct_buf->str()));
+
+  // Decrypt fragments of the ciphertext using the decrypter.
+  auto dec_ras_result = decrypter->NewDecryptingRandomAccessStream(
+      std::move(ct_ras), associated_data);
+  if (!dec_ras_result.ok()) return dec_ras_result.status();
+  auto dec_ras = std::move(dec_ras_result.ValueOrDie());
+  int pt_size = plaintext.size();
+  for (int pos : {0, pt_size / 2, std::max(pt_size - 10, 0)}) {
+    for (int count : {1, 10, std::max(pt_size / 2, 1), std::max(pt_size, 1)}) {
+      auto status = ReadAndVerifyFragment(dec_ras.get(), pos, count, plaintext);
+      if (!status.ok()) {
+        return Status(
+            crypto::tink::util::error::INTERNAL,
+            absl::StrCat("Random access decryption failed at position=", pos,
+                         " with count=", count,
+                         " and status: ", status.ToString()));
+      }
+    }
+  }
+  return crypto::tink::util::OkStatus();
+}
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/streaming_aead_test_util.h b/cc/subtle/streaming_aead_test_util.h
new file mode 100644
index 0000000..9b31c8f
--- /dev/null
+++ b/cc/subtle/streaming_aead_test_util.h
@@ -0,0 +1,41 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_SUBTLE_STREAMING_AEAD_TEST_UTIL_H_
+#define TINK_SUBTLE_STREAMING_AEAD_TEST_UTIL_H_
+
+#include "absl/strings/string_view.h"
+#include "tink/streaming_aead.h"
+#include "tink/util/status.h"
+
+namespace crypto {
+namespace tink {
+
+// Encrypt with NewEncryptingStream, then decrypt using NewDecryptingStream,
+// and NewDecryptingRandomAccessStream (for a few fragments).
+// 'ciphertext_offset' is the offset of the actual ciphertext in the
+// computed ciphertext stream (cf. description of StreamSegmentEncrypter
+// in stream_segment_encrypter.h).
+// Any error will be propagated to the caller. Returns OK if the resulting
+// decryptions are equal to the plaintext.
+crypto::tink::util::Status EncryptThenDecrypt(StreamingAead* encrypter,
+                                              StreamingAead* decrypter,
+                                              absl::string_view plaintext,
+                                              absl::string_view associated_data,
+                                              int ciphertext_offset);
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_SUBTLE_STREAMING_AEAD_TEST_UTIL_H_
diff --git a/cc/subtle/streaming_aead_test_util_test.cc b/cc/subtle/streaming_aead_test_util_test.cc
new file mode 100644
index 0000000..bef20d3
--- /dev/null
+++ b/cc/subtle/streaming_aead_test_util_test.cc
@@ -0,0 +1,49 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+#include "tink/subtle/streaming_aead_test_util.h"
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "tink/util/test_matchers.h"
+#include "tink/util/test_util.h"
+
+namespace crypto {
+namespace tink {
+
+using ::crypto::tink::test::DummyStreamingAead;
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
+
+namespace {
+
+TEST(EncryptThenDecrypt, Basic) {
+  DummyStreamingAead streaming_aead("Aead 1");
+  int ciphertext_offset = 0;
+  EXPECT_THAT(EncryptThenDecrypt(&streaming_aead, &streaming_aead, "plaintext",
+                                 "aad", ciphertext_offset),
+              IsOk());
+}
+
+TEST(EncryptThenDecrypt, DifferentAeads) {
+  DummyStreamingAead streaming_aead_1("Aead 1");
+  DummyStreamingAead streaming_aead_2("Aead 2");
+  int ciphertext_offset = 0;
+  EXPECT_THAT(EncryptThenDecrypt(&streaming_aead_1, &streaming_aead_2,
+                                 "plaintext", "aad", ciphertext_offset),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+}  // namespace
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/subtle_util.cc b/cc/subtle/subtle_util.cc
new file mode 100644
index 0000000..6c74a71
--- /dev/null
+++ b/cc/subtle/subtle_util.cc
@@ -0,0 +1,38 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/subtle/subtle_util.h"
+// placeholder_subtle_util_cc
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+
+std::string BigEndian32(uint32_t val) {
+  std::string result(4, '\0');
+  result[0] = (val >> 24) & 0xff;
+  result[1] = (val >> 16) & 0xff;
+  result[2] = (val >> 8) & 0xff;
+  result[3] = val & 0xff;
+  return result;
+}
+
+void ResizeStringUninitialized(std::string* s, size_t new_size) {
+  s->resize(new_size);
+}
+
+
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/subtle_util.h b/cc/subtle/subtle_util.h
new file mode 100644
index 0000000..c481238
--- /dev/null
+++ b/cc/subtle/subtle_util.h
@@ -0,0 +1,37 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_SUBTLE_SUBTLE_UTIL_H_
+#define TINK_SUBTLE_SUBTLE_UTIL_H_
+
+#include <cstdint>
+#include <string>
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+
+// Returnes big endian order representation of |val|.
+std::string BigEndian32(uint32_t val);
+
+// Like std::string::resize, but the newly allocated storage may be left
+// uninitialized. C++11 provides no portable way to do this. Using this function
+// allows us to do this on a per compiler/library version basis.
+void ResizeStringUninitialized(std::string* s, size_t new_size);
+
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_SUBTLE_SUBTLE_UTIL_H_
diff --git a/cc/subtle/subtle_util_boringssl.cc b/cc/subtle/subtle_util_boringssl.cc
index 0569610..5cd050d 100644
--- a/cc/subtle/subtle_util_boringssl.cc
+++ b/cc/subtle/subtle_util_boringssl.cc
@@ -15,9 +15,11 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 #include "tink/subtle/subtle_util_boringssl.h"
+#include "absl/memory/memory.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/substitute.h"
 #include "openssl/bn.h"
+#include "openssl/cipher.h"
 #include "openssl/curve25519.h"
 #include "openssl/ec.h"
 #include "openssl/err.h"
@@ -109,6 +111,10 @@
 // static
 util::StatusOr<SubtleUtilBoringSSL::EcKey> SubtleUtilBoringSSL::GetNewEcKey(
     EllipticCurveType curve_type) {
+  if (curve_type == EllipticCurveType::CURVE25519) {
+    auto key = GenerateNewX25519Key();
+    return EcKeyFromX25519Key(key.get());
+  }
   auto status_or_group(SubtleUtilBoringSSL::GetEcGroup(curve_type));
   if (!status_or_group.ok()) return status_or_group.status();
   bssl::UniquePtr<EC_GROUP> group(status_or_group.ValueOrDie());
@@ -148,6 +154,50 @@
 }
 
 // static
+std::unique_ptr<SubtleUtilBoringSSL::X25519Key>
+SubtleUtilBoringSSL::GenerateNewX25519Key() {
+  auto key = absl::make_unique<X25519Key>();
+  X25519_keypair(key->public_value, key->private_key);
+
+  return key;
+}
+
+// static
+SubtleUtilBoringSSL::EcKey SubtleUtilBoringSSL::EcKeyFromX25519Key(
+    const SubtleUtilBoringSSL::X25519Key *x25519_key) {
+  SubtleUtilBoringSSL::EcKey ec_key;
+  ec_key.curve = EllipticCurveType::CURVE25519;
+  // Curve25519 public key is x, not (x,y).
+  ec_key.pub_x =
+      std::string(reinterpret_cast<const char *>(x25519_key->public_value),
+             X25519_PUBLIC_VALUE_LEN);
+  ec_key.priv = std::string(reinterpret_cast<const char *>(x25519_key->private_key),
+                       X25519_PRIVATE_KEY_LEN);
+  return ec_key;
+}
+
+// static
+util::StatusOr<std::unique_ptr<SubtleUtilBoringSSL::X25519Key>>
+SubtleUtilBoringSSL::X25519KeyFromEcKey(
+    const SubtleUtilBoringSSL::EcKey &ec_key) {
+  auto x25519_key = absl::make_unique<SubtleUtilBoringSSL::X25519Key>();
+  if (ec_key.curve != EllipticCurveType::CURVE25519) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "This key is not on curve 25519");
+  }
+  if (!ec_key.pub_y.empty()) {
+    return util::Status(util::error::INVALID_ARGUMENT,
+                        "Invalid X25519 key. pub_y is unexpectedly set.");
+  }
+  // Curve25519 public key is x, not (x,y).
+  ec_key.pub_x.copy(reinterpret_cast<char *>(x25519_key->public_value),
+                    X25519_PUBLIC_VALUE_LEN);
+  ec_key.priv.copy(reinterpret_cast<char *>(x25519_key->private_key),
+                   X25519_PRIVATE_KEY_LEN);
+  return std::move(x25519_key);
+}
+
+// static
 std::unique_ptr<SubtleUtilBoringSSL::Ed25519Key>
 SubtleUtilBoringSSL::GetNewEd25519Key() {
   // Generate a new key pair.
@@ -219,7 +269,7 @@
 }
 
 // static
-util::StatusOr<EC_POINT *> SubtleUtilBoringSSL::EcPointDecode(
+util::StatusOr<bssl::UniquePtr<EC_POINT>> SubtleUtilBoringSSL::EcPointDecode(
     EllipticCurveType curve, EcPointFormat format, absl::string_view encoded) {
   auto status_or_ec_group = GetEcGroup(curve);
   if (!status_or_ec_group.ok()) {
@@ -303,7 +353,7 @@
   if (1 != EC_POINT_is_on_curve(group.get(), point.get(), nullptr)) {
     return util::Status(util::error::INTERNAL, "Point is not on curve");
   }
-  return point.release();
+  return {std::move(point)};
 }
 
 // static
@@ -545,6 +595,32 @@
   return util::OkStatus();
 }
 
+// static
+const EVP_CIPHER* SubtleUtilBoringSSL::GetAesCtrCipherForKeySize(
+    uint32_t size_in_bytes) {
+  switch (size_in_bytes) {
+    case 16:
+      return EVP_aes_128_ctr();
+    case 32:
+      return EVP_aes_256_ctr();
+    default:
+      return nullptr;
+  }
+}
+
+// static
+const EVP_AEAD* SubtleUtilBoringSSL::GetAesGcmAeadForKeySize(
+    uint32_t size_in_bytes) {
+  switch (size_in_bytes) {
+    case 16:
+      return EVP_aead_aes_128_gcm();
+    case 32:
+      return EVP_aead_aes_256_gcm();
+    default:
+      return nullptr;
+  }
+}
+
 namespace boringssl {
 
 util::StatusOr<std::vector<uint8_t>> ComputeHash(absl::string_view input,
diff --git a/cc/subtle/subtle_util_boringssl.h b/cc/subtle/subtle_util_boringssl.h
index 38b24e6..1ee520a 100644
--- a/cc/subtle/subtle_util_boringssl.h
+++ b/cc/subtle/subtle_util_boringssl.h
@@ -21,6 +21,8 @@
 
 #include "absl/strings/string_view.h"
 #include "openssl/bn.h"
+#include "openssl/cipher.h"
+#include "openssl/curve25519.h"
 #include "openssl/err.h"
 #include "openssl/evp.h"
 #include "tink/subtle/common_enums.h"
@@ -40,6 +42,11 @@
     std::string priv;  // big integer in bigendian represnetation
   };
 
+  struct X25519Key {
+    uint8_t public_value[X25519_PUBLIC_VALUE_LEN];
+    uint8_t private_key[X25519_PRIVATE_KEY_LEN];
+  };
+
   struct Ed25519Key {
     std::string public_key;
     std::string private_key;
@@ -127,6 +134,16 @@
   static crypto::tink::util::StatusOr<EcKey> GetNewEcKey(
       EllipticCurveType curve_type);
 
+  // Returns a new X25519 key.
+  static std::unique_ptr<X25519Key> GenerateNewX25519Key();
+
+  // Returns a X25519Key matching the specified EcKey.
+  static crypto::tink::util::StatusOr<std::unique_ptr<X25519Key>>
+  X25519KeyFromEcKey(const EcKey &ec_key);
+
+  // Returns an EcKey matching the specified X25519Key.
+  static EcKey EcKeyFromX25519Key(const X25519Key *x25519_key);
+
   // Returns a new ED25519 key.
   static std::unique_ptr<Ed25519Key> GetNewEd25519Key();
 
@@ -136,7 +153,7 @@
   // The compressed point is encoded as 1-byte || x where x is
   // curve_size_in_bytes big-endian byte array and if the least significant bit
   // of y is 1, the 1st byte is 0x03, otherwise it's 0x02.
-  static crypto::tink::util::StatusOr<EC_POINT *> EcPointDecode(
+  static util::StatusOr<bssl::UniquePtr<EC_POINT>> EcPointDecode(
       EllipticCurveType curve, EcPointFormat format, absl::string_view encoded);
 
   // Returns the encoded public key based on curve type, point format and
@@ -186,6 +203,12 @@
 
   // Copies the CRT params and dp, dq into the RSA key.
   static util::Status CopyCrtParams(const RsaPrivateKey &key, RSA *rsa);
+
+  // Returns BoringSSL's AES CTR EVP_CIPHER for the key size.
+  static const EVP_CIPHER* GetAesCtrCipherForKeySize(uint32_t size_in_bytes);
+
+  // Returns BoringSSL's AES GCM EVP_AEAD for the key size.
+  static const EVP_AEAD* GetAesGcmAeadForKeySize(uint32_t size_in_bytes);
 };
 
 namespace boringssl {
diff --git a/cc/subtle/subtle_util_boringssl_test.cc b/cc/subtle/subtle_util_boringssl_test.cc
index 2ea213e..51d0bc9 100644
--- a/cc/subtle/subtle_util_boringssl_test.cc
+++ b/cc/subtle/subtle_util_boringssl_test.cc
@@ -23,6 +23,7 @@
 #include "gtest/gtest.h"
 #include "absl/strings/escaping.h"
 #include "absl/strings/str_cat.h"
+#include "openssl/cipher.h"
 #include "openssl/curve25519.h"
 #include "openssl/digest.h"
 #include "openssl/ec.h"
@@ -45,6 +46,7 @@
 using ::crypto::tink::test::StatusIs;
 using ::testing::IsEmpty;
 using ::testing::Not;
+using ::testing::NotNull;
 using ::testing::StrEq;
 
 struct EncodingTestVector {
@@ -127,13 +129,13 @@
         test.curve, test.format, encoded_str);
     EXPECT_TRUE(status_or_ec_point.ok());
     EXPECT_EQ(0, EC_POINT_cmp(status_or_group.ValueOrDie(), point.get(),
-                              status_or_ec_point.ValueOrDie(), nullptr));
+                              status_or_ec_point.ValueOrDie().get(), nullptr));
     // Modify the 1st byte.
     encoded_str = std::string("0") + encoded_str.substr(1);
-    status_or_ec_point = SubtleUtilBoringSSL::EcPointDecode(
+    auto status_or_ec_point2 = SubtleUtilBoringSSL::EcPointDecode(
         test.curve, test.format, encoded_str);
-    EXPECT_FALSE(status_or_ec_point.ok());
-    EXPECT_LE(0, status_or_ec_point.status().error_message().find(
+    EXPECT_FALSE(status_or_ec_point2.ok());
+    EXPECT_LE(0, status_or_ec_point2.status().error_message().find(
                      "point should start with"));
   }
 }
@@ -236,7 +238,8 @@
         }
         continue;
       }
-      bssl::UniquePtr<EC_POINT> pub_key(status_or_ec_point.ValueOrDie());
+      bssl::UniquePtr<EC_POINT> pub_key =
+          std::move(status_or_ec_point.ValueOrDie());
       bssl::UniquePtr<BIGNUM> priv_key(
           BN_bin2bn(reinterpret_cast<const unsigned char*>(priv_bytes.data()),
                     priv_bytes.size(), nullptr));
@@ -427,6 +430,59 @@
   ASSERT_NE(keypair1->public_key, keypair1->private_key);
 }
 
+TEST(CreateNewX25519KeyTest, KeyIsWellFormed) {
+  auto ec_key_or_status =
+      SubtleUtilBoringSSL::GetNewEcKey(EllipticCurveType::CURVE25519);
+  ASSERT_THAT(ec_key_or_status.status(), IsOk());
+  auto ec_key = ec_key_or_status.ValueOrDie();
+  EXPECT_EQ(ec_key.curve, EllipticCurveType::CURVE25519);
+  EXPECT_EQ(ec_key.pub_x.length(), X25519_PUBLIC_VALUE_LEN);
+  EXPECT_TRUE(ec_key.pub_y.empty());
+  EXPECT_EQ(ec_key.priv.length(), X25519_PRIVATE_KEY_LEN);
+}
+
+TEST(CreateNewX25519KeyTest, GeneratesDifferentKeysEveryTime) {
+  auto keypair1 = SubtleUtilBoringSSL::GenerateNewX25519Key();
+  auto keypair2 = SubtleUtilBoringSSL::GenerateNewX25519Key();
+
+  EXPECT_FALSE(std::equal(keypair1->private_key,
+                          &keypair1->private_key[X25519_PRIVATE_KEY_LEN],
+                          keypair2->private_key));
+  EXPECT_FALSE(std::equal(keypair1->public_value,
+                          &keypair1->public_value[X25519_PUBLIC_VALUE_LEN],
+                          keypair2->public_value));
+}
+
+TEST(EcKeyFromX25519KeyTest, RoundTripKey) {
+  auto x25519_key = SubtleUtilBoringSSL::GenerateNewX25519Key();
+  ASSERT_THAT(x25519_key, NotNull());
+  auto ec_key = SubtleUtilBoringSSL::EcKeyFromX25519Key(x25519_key.get());
+  ASSERT_EQ(ec_key.curve, EllipticCurveType::CURVE25519);
+
+  auto roundtrip_key_or_status =
+      SubtleUtilBoringSSL::X25519KeyFromEcKey(ec_key);
+  ASSERT_THAT(roundtrip_key_or_status.status(), IsOk());
+
+  auto roundtrip_key = std::move(roundtrip_key_or_status.ValueOrDie());
+  EXPECT_TRUE(std::equal(x25519_key->private_key,
+                         &x25519_key->private_key[X25519_PRIVATE_KEY_LEN],
+                         roundtrip_key->private_key));
+  EXPECT_TRUE(std::equal(x25519_key->public_value,
+                         &x25519_key->public_value[X25519_PUBLIC_VALUE_LEN],
+                         roundtrip_key->public_value));
+}
+
+TEST(X25519KeyFromEcKeyTest, RejectNistPCurves) {
+  auto ec_key_or_status =
+      SubtleUtilBoringSSL::GetNewEcKey(EllipticCurveType::NIST_P256);
+  ASSERT_THAT(ec_key_or_status.status(), IsOk());
+
+  auto x25519_key_or_status =
+      SubtleUtilBoringSSL::X25519KeyFromEcKey(ec_key_or_status.ValueOrDie());
+  EXPECT_THAT(x25519_key_or_status.status(),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
 TEST(SubtleUtilBoringSSLTest, ValidateRsaModulusSize) {
   SubtleUtilBoringSSL::RsaPublicKey public_key;
   SubtleUtilBoringSSL::RsaPrivateKey private_key;
@@ -451,6 +507,14 @@
       Not(IsOk()));
 }
 
+TEST(SublteUtilBoringSSLTest, GetCipherForKeySize) {
+  EXPECT_EQ(SubtleUtilBoringSSL::GetAesCtrCipherForKeySize(16),
+            EVP_aes_128_ctr());
+  EXPECT_EQ(SubtleUtilBoringSSL::GetAesCtrCipherForKeySize(32),
+            EVP_aes_256_ctr());
+  EXPECT_EQ(SubtleUtilBoringSSL::GetAesCtrCipherForKeySize(64), nullptr);
+}
+
 TEST(ComputeHashTest, AcceptsNullStringView) {
   auto null_hash =
       boringssl::ComputeHash(absl::string_view(nullptr, 0), *EVP_sha512());
diff --git a/cc/subtle/subtle_util_test.cc b/cc/subtle/subtle_util_test.cc
new file mode 100644
index 0000000..d6135ae
--- /dev/null
+++ b/cc/subtle/subtle_util_test.cc
@@ -0,0 +1,54 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "tink/subtle/subtle_util.h"
+
+#include <string>
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+
+using ::testing::Eq;
+
+TEST(SubtleUtilTest, Basic) {
+  std::string result = BigEndian32(0x12345678);
+  EXPECT_EQ(result[0], 0x12);
+  EXPECT_EQ(result[1], 0x34);
+  EXPECT_EQ(result[2], 0x56);
+  EXPECT_EQ(result[3], 0x78);
+}
+
+TEST(SubtleUtilTest, ResizeStringUninitialized) {
+  std::string s;
+  for (int len = 0; len <= 123; len += 17) {
+    int old_len = s.size();
+    ResizeStringUninitialized(&s, len);
+    for (int i = old_len; i < len; ++i) {
+      s[i] = 'a';
+    }
+    EXPECT_THAT(s, Eq(std::string(len, 'a')));
+  }
+  for (int len = 100; len >= 0; len -= 20) {
+    ResizeStringUninitialized(&s, len);
+    EXPECT_THAT(s, Eq(std::string(len, 'a')));
+  }
+}
+
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/test_util.cc b/cc/subtle/test_util.cc
new file mode 100644
index 0000000..be75368
--- /dev/null
+++ b/cc/subtle/test_util.cc
@@ -0,0 +1,75 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/subtle/test_util.h"
+
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+namespace test {
+
+const int DummyStreamSegmentEncrypter::kSegmentTagSize;
+const char DummyStreamSegmentEncrypter::kLastSegment;
+const char DummyStreamSegmentEncrypter::kNotLastSegment;
+
+util::Status WriteToStream(OutputStream* output_stream,
+                           absl::string_view contents, bool close_stream) {
+  void* buffer;
+  int pos = 0;
+  int remaining = contents.length();
+  int available_space = 0;
+  int available_bytes = 0;
+  while (remaining > 0) {
+    auto next_result = output_stream->Next(&buffer);
+    if (!next_result.ok()) return next_result.status();
+    available_space = next_result.ValueOrDie();
+    available_bytes = std::min(available_space, remaining);
+    memcpy(buffer, contents.data() + pos, available_bytes);
+    remaining -= available_bytes;
+    pos += available_bytes;
+  }
+  if (available_space > available_bytes) {
+    output_stream->BackUp(available_space - available_bytes);
+  }
+  return close_stream ? output_stream->Close() : util::Status::OK;
+}
+
+util::Status ReadFromStream(InputStream* input_stream, std::string* output) {
+  if (input_stream == nullptr || output == nullptr) {
+    return util::Status(util::error::INTERNAL, "Illegal read from a stream");
+  }
+  const void* buffer;
+  output->clear();
+  while (true) {
+    auto next_result = input_stream->Next(&buffer);
+    if (next_result.status().error_code() == util::error::OUT_OF_RANGE) {
+      // End of stream.
+      return util::Status::OK;
+    }
+    if (!next_result.ok()) return next_result.status();
+    auto read_bytes = next_result.ValueOrDie();
+    if (read_bytes > 0) {
+      output->append(std::string(reinterpret_cast<const char*>(buffer), read_bytes));
+    }
+  }
+  return util::Status::OK;
+}
+
+}  // namespace test
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/subtle/test_util.h b/cc/subtle/test_util.h
new file mode 100644
index 0000000..eb93363
--- /dev/null
+++ b/cc/subtle/test_util.h
@@ -0,0 +1,273 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_SUBTLE_TEST_UTIL_H_
+#define TINK_SUBTLE_TEST_UTIL_H_
+
+#include <string>
+#include <vector>
+
+#include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "tink/input_stream.h"
+#include "tink/output_stream.h"
+#include "tink/subtle/nonce_based_streaming_aead.h"
+#include "tink/subtle/stream_segment_decrypter.h"
+#include "tink/subtle/stream_segment_encrypter.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace subtle {
+namespace test {
+
+// Various utilities for testing.
+///////////////////////////////////////////////////////////////////////////////
+
+// Writes 'contents' the specified 'output_stream', and if 'close_stream'
+// is true, then closes the stream.
+// Returns the status of output_stream->Close()-operation, or a non-OK status
+// of a prior output_stream->Next()-operation, if any.
+util::Status WriteToStream(OutputStream* output_stream,
+                           absl::string_view contents,
+                           bool close_stream = true);
+
+// Reads all bytes from the specified 'input_stream', and puts
+// them into 'output', where both 'input_stream' and 'output must be non-null.
+// Returns a non-OK status only if reading fails for some reason.
+// If the end of stream is reached ('input_stream' returns OUT_OF_RANGE),
+// then this function returns OK.
+util::Status ReadFromStream(InputStream* input_stream,
+                            std::string* output);
+
+// A dummy encrypter that "encrypts" by just appending to the plaintext
+// the current segment number and a marker byte indicating whether
+// the segment is last one.
+class DummyStreamSegmentEncrypter : public StreamSegmentEncrypter {
+ public:
+  // Size of the per-segment tag added upon encryption.
+  static const int kSegmentTagSize = sizeof(int64_t) + 1;
+
+  // Bytes for marking whether a given segment is the last one.
+  static const char kLastSegment = 'l';
+  static const char kNotLastSegment = 'n';
+
+  DummyStreamSegmentEncrypter(int pt_segment_size,
+                              int header_size,
+                              int ct_offset) :
+      pt_segment_size_(pt_segment_size),
+      ct_offset_(ct_offset),
+      segment_number_(0) {
+    // Fill the header with 'header_size' copies of letter 'h'
+    header_.resize(0);
+    header_.resize(header_size, static_cast<uint8_t>('h'));
+    generated_output_size_ = header_size;
+  }
+
+  // Generates an expected ciphertext for the given 'plaintext'.
+  std::string GenerateCiphertext(absl::string_view plaintext) {
+    std::string ct(header_.begin(), header_.end());
+    int64_t seg_no = 0;
+    int pos = 0;
+    do {
+      int seg_len = pt_segment_size_;
+      if (pos == 0) {  // The first segment.
+        seg_len -= (ct_offset_ + header_.size());
+      }
+      if (seg_len > plaintext.size() - pos) {  // The last segment.
+        seg_len = plaintext.size() - pos;
+      }
+      ct.append(plaintext.substr(pos, seg_len).data(), seg_len);
+      pos += seg_len;
+      ct.append(reinterpret_cast<const char*>(&seg_no), sizeof(seg_no));
+      ct.append(1, pos < plaintext.size() ? kNotLastSegment : kLastSegment);
+      seg_no++;
+    } while (pos < plaintext.size());
+    return ct;
+  }
+
+  util::Status EncryptSegment(
+      const std::vector<uint8_t>& plaintext,
+      bool is_last_segment,
+      std::vector<uint8_t>* ciphertext_buffer) override {
+    ciphertext_buffer->resize(plaintext.size() + kSegmentTagSize);
+    memcpy(ciphertext_buffer->data(), plaintext.data(), plaintext.size());
+    memcpy(ciphertext_buffer->data() + plaintext.size(),
+           &segment_number_, sizeof(segment_number_));
+    // The last byte of the a ciphertext segment.
+    ciphertext_buffer->back() =
+        is_last_segment ? kLastSegment : kNotLastSegment;
+    generated_output_size_ += ciphertext_buffer->size();
+    IncSegmentNumber();
+    return util::Status::OK;
+  }
+
+  const std::vector<uint8_t>& get_header() const override {
+    return header_;
+  }
+
+  int64_t get_segment_number() const override {
+    return segment_number_;
+  }
+
+  int get_plaintext_segment_size() const override {
+    return pt_segment_size_;
+  }
+
+  int get_ciphertext_segment_size() const override {
+    return pt_segment_size_ + kSegmentTagSize;
+  }
+
+  int get_ciphertext_offset() const override {
+    return ct_offset_;
+  }
+
+  ~DummyStreamSegmentEncrypter() override {}
+
+  int get_generated_output_size() {
+    return generated_output_size_;
+  }
+
+ protected:
+  void IncSegmentNumber() override {
+    segment_number_++;
+  }
+
+ private:
+  std::vector<uint8_t> header_;
+  int pt_segment_size_;
+  int ct_offset_;
+  int64_t segment_number_;
+  int64_t generated_output_size_;
+};   // class DummyStreamSegmentEncrypter
+
+// A dummy decrypter that "decrypts" segments encrypted by
+// DummyStreamSegmentEncrypter.
+class DummyStreamSegmentDecrypter : public StreamSegmentDecrypter {
+ public:
+  DummyStreamSegmentDecrypter(int pt_segment_size,
+                              int header_size,
+                              int ct_offset) :
+      pt_segment_size_(pt_segment_size),
+      ct_offset_(ct_offset) {
+    // Fill the header with 'header_size' copies of letter 'h'
+    header_.resize(0);
+    header_.resize(header_size, static_cast<uint8_t>('h'));
+    generated_output_size_ = 0;
+  }
+
+  util::Status Init(const std::vector<uint8_t>& header) override {
+    if (header_.size() != header.size() ||
+        memcmp(header_.data(), header.data(), header_.size()) != 0) {
+      return util::Status(util::error::INVALID_ARGUMENT,
+                          "Invalid stream header");
+    }
+    return util::Status::OK;
+  }
+
+  int get_header_size() const override {
+    return header_.size();
+  }
+
+  util::Status DecryptSegment(
+      const std::vector<uint8_t>& ciphertext,
+      int64_t segment_number,
+      bool is_last_segment,
+      std::vector<uint8_t>* plaintext_buffer) override {
+    if (ciphertext.size() < DummyStreamSegmentEncrypter::kSegmentTagSize) {
+      return util::Status(util::error::INVALID_ARGUMENT,
+                          "Ciphertext segment too short");
+    }
+    if (ciphertext.back() !=
+        (is_last_segment ? DummyStreamSegmentEncrypter::kLastSegment :
+         DummyStreamSegmentEncrypter::kNotLastSegment)) {
+      return util::Status(util::error::INVALID_ARGUMENT,
+                          "unexpected last-segment marker");
+    }
+    int pt_size =
+        ciphertext.size() - DummyStreamSegmentEncrypter::kSegmentTagSize;
+    if (memcmp(ciphertext.data() + pt_size,
+               reinterpret_cast<const char*>(&segment_number),
+               sizeof(segment_number)) != 0) {
+      return util::Status(util::error::INVALID_ARGUMENT,
+                          "wrong segment number");
+    }
+    plaintext_buffer->resize(pt_size);
+    memcpy(plaintext_buffer->data(), ciphertext.data(), pt_size);
+    generated_output_size_ += pt_size;
+    return util::Status::OK;
+  }
+
+
+  int get_plaintext_segment_size() const override {
+    return pt_segment_size_;
+  }
+
+  int get_ciphertext_segment_size() const override {
+    return pt_segment_size_ + DummyStreamSegmentEncrypter::kSegmentTagSize;
+  }
+
+  int get_ciphertext_offset() const override {
+    return ct_offset_;
+  }
+
+  ~DummyStreamSegmentDecrypter() override {}
+
+  int get_generated_output_size() {
+    return generated_output_size_;
+  }
+
+ private:
+  std::vector<uint8_t> header_;
+  int pt_segment_size_;
+  int ct_offset_;
+  int64_t generated_output_size_;
+};   // class DummyStreamSegmentDecrypter
+
+class DummyStreamingAead : public NonceBasedStreamingAead {
+ public:
+  DummyStreamingAead(int pt_segment_size, int header_size, int ct_offset)
+      : pt_segment_size_(pt_segment_size),
+        header_size_(header_size),
+        ct_offset_(ct_offset) {}
+
+ protected:
+  util::StatusOr<std::unique_ptr<StreamSegmentEncrypter>> NewSegmentEncrypter(
+      absl::string_view associated_data) const override {
+    return {absl::make_unique<DummyStreamSegmentEncrypter>(
+        pt_segment_size_, header_size_, ct_offset_)};
+  }
+
+  util::StatusOr<std::unique_ptr<StreamSegmentDecrypter>> NewSegmentDecrypter(
+      absl::string_view associated_data) const override {
+    return {absl::make_unique<DummyStreamSegmentDecrypter>(
+        pt_segment_size_, header_size_, ct_offset_)};
+  }
+
+ private:
+  int pt_segment_size_;
+  int header_size_;
+  int ct_offset_;
+};
+
+}  // namespace test
+}  // namespace subtle
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_SUBTLE_TEST_UTIL_H_
diff --git a/cc/util/BUILD.bazel b/cc/util/BUILD.bazel
index 330082f..05744aa 100644
--- a/cc/util/BUILD.bazel
+++ b/cc/util/BUILD.bazel
@@ -1,6 +1,19 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
+
+cc_library(
+    name = "buffer",
+    srcs = ["buffer.cc"],
+    hdrs = ["buffer.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":status",
+        ":statusor",
+        "@com_google_absl//absl/memory",
+    ],
+)
 
 cc_library(
     name = "constants",
@@ -46,6 +59,10 @@
     include_prefix = "tink",
     strip_include_prefix = "/cc",
     visibility = ["//visibility:public"],
+    deps = [
+        "@com_google_absl//absl/base:core_headers",
+        "@com_google_absl//absl/strings",
+    ],
 )
 
 cc_library(
@@ -104,6 +121,22 @@
 )
 
 cc_library(
+    name = "file_random_access_stream",
+    srcs = ["file_random_access_stream.cc"],
+    hdrs = ["file_random_access_stream.h"],
+    include_prefix = "tink",
+    strip_include_prefix = "/cc",
+    deps = [
+        ":buffer",
+        ":errors",
+        ":status",
+        ":statusor",
+        "//cc:random_access_stream",
+        "@com_google_absl//absl/memory",
+    ],
+)
+
+cc_library(
     name = "istream_input_stream",
     srcs = ["istream_input_stream.cc"],
     hdrs = ["istream_input_stream.h"],
@@ -141,6 +174,8 @@
     include_prefix = "tink",
     strip_include_prefix = "/cc",
     deps = [
+        ":buffer",
+        ":constants",
         ":enums",
         ":protobuf_helper",
         ":status",
@@ -150,23 +185,32 @@
         "//cc:deterministic_aead",
         "//cc:hybrid_decrypt",
         "//cc:hybrid_encrypt",
-        "//cc:keyset_handle",
         "//cc:input_stream",
+        "//cc:keyset_handle",
+        "//cc:kms_client",
         "//cc:mac",
         "//cc:output_stream",
         "//cc:public_key_sign",
         "//cc:public_key_verify",
+        "//cc:random_access_stream",
         "//cc:streaming_aead",
+        "//cc/aead:aes_ctr_hmac_aead_key_manager",
         "//cc/aead:aes_gcm_key_manager",
+        "//cc/aead:xchacha20_poly1305_key_manager",
+        "//cc/subtle:random",
         "//cc/subtle:subtle_util_boringssl",
+        "//proto:aes_ctr_hmac_aead_cc_proto",
         "//proto:aes_gcm_cc_proto",
         "//proto:common_cc_proto",
         "//proto:ecdsa_cc_proto",
         "//proto:ecies_aead_hkdf_cc_proto",
         "//proto:ed25519_cc_proto",
         "//proto:tink_cc_proto",
+        "//proto:xchacha20_poly1305_cc_proto",
+        "@com_google_absl//absl/base:core_headers",
         "@com_google_absl//absl/memory",
         "@com_google_absl//absl/strings",
+        "@com_google_absl//absl/synchronization",
     ],
 )
 
@@ -184,9 +228,10 @@
 )
 
 cc_library(
-    name = "keyset_util",
-    srcs = ["keyset_util.cc"],
-    hdrs = ["keyset_util.h"],
+    name = "test_keyset_handle",
+    testonly = 1,
+    srcs = ["test_keyset_handle.cc"],
+    hdrs = ["test_keyset_handle.h"],
     include_prefix = "tink",
     strip_include_prefix = "/cc",
     deps = [
@@ -209,6 +254,23 @@
 # tests
 
 cc_test(
+    name = "buffer_test",
+    size = "small",
+    srcs = ["buffer_test.cc"],
+    copts = ["-Iexternal/gtest/include"],
+    linkopts = ["-lpthread"],
+    deps = [
+        ":buffer",
+        ":status",
+        ":test_matchers",
+        "//cc/subtle:random",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
     name = "errors_test",
     size = "small",
     srcs = ["errors_test.cc"],
@@ -244,7 +306,6 @@
     deps = [
         ":file_input_stream",
         ":test_util",
-        "//cc/subtle:random",
         "@com_google_absl//absl/memory",
         "@com_google_absl//absl/strings",
         "@com_google_googletest//:gtest_main",
@@ -268,6 +329,22 @@
 )
 
 cc_test(
+    name = "file_random_access_stream_test",
+    size = "medium",
+    srcs = ["file_random_access_stream_test.cc"],
+    copts = ["-Iexternal/gtest/include"],
+    linkopts = ["-lpthread"],
+    deps = [
+        ":buffer",
+        ":file_random_access_stream",
+        ":test_util",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
     name = "istream_input_stream_test",
     size = "medium",
     srcs = ["istream_input_stream_test.cc"],
@@ -298,3 +375,25 @@
         "@com_google_googletest//:gtest_main",
     ],
 )
+
+cc_test(
+    name = "test_util_test",
+    srcs = ["test_util_test.cc"],
+    deps = [
+        ":test_util",
+        "//cc/subtle:random",
+        "//proto:aes_gcm_cc_proto",
+        "//proto:tink_cc_proto",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_test(
+    name = "validation_test",
+    srcs = ["validation_test.cc"],
+    deps = [
+        ":test_matchers",
+        ":validation",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
diff --git a/cc/util/BUILD.gn b/cc/util/BUILD.gn
index d1aa075..2d183ed 100644
--- a/cc/util/BUILD.gn
+++ b/cc/util/BUILD.gn
@@ -48,6 +48,10 @@
     "status.cc",
     "status.h",
   ]
+  public_deps = [
+    "//third_party/abseil-cpp/absl/base:core_headers",
+    "//third_party/abseil-cpp/absl/strings:strings",
+  ]
   public_configs = [ "//third_party/tink:tink_config" ]
 }
 
diff --git a/cc/util/CMakeLists.txt b/cc/util/CMakeLists.txt
new file mode 100644
index 0000000..bfdc6fa
--- /dev/null
+++ b/cc/util/CMakeLists.txt
@@ -0,0 +1,327 @@
+tink_module(util)
+
+tink_cc_library(
+  NAME buffer
+  SRCS
+    buffer.cc
+    buffer.h
+  DEPS
+    absl::memory
+    tink::util::status
+    tink::util::statusor
+)
+
+tink_cc_library(
+  NAME constants
+  SRCS
+    constants.cc
+    constants.h
+  DEPS
+    absl::base
+)
+
+tink_cc_library(
+  NAME errors
+  SRCS
+    errors.cc
+    errors.h
+  DEPS
+    tink::util::status
+)
+
+tink_cc_library(
+  NAME enums
+  SRCS
+    enums.cc
+    enums.h
+  DEPS
+    tink::subtle::common_enums
+    tink::proto::common_cc_proto
+    tink::proto::ecdsa_cc_proto
+    tink::proto::tink_cc_proto
+    absl::strings
+)
+
+tink_cc_library(
+  NAME status
+  SRCS
+    status.cc
+    status.h
+  DEPS
+    absl::base
+    absl::strings
+  PUBLIC
+)
+
+tink_cc_library(
+  NAME statusor
+  SRCS
+    statusor.h
+  DEPS
+    tink::util::status
+  PUBLIC
+)
+
+tink_cc_library(
+  NAME validation
+  SRCS
+    validation.cc
+    validation.h
+  DEPS
+    tink::util::errors
+    tink::util::status
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_library(
+  NAME file_input_stream
+  SRCS
+    file_input_stream.cc
+    file_input_stream.h
+  DEPS
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    tink::core::input_stream
+    absl::memory
+)
+
+tink_cc_library(
+  NAME file_output_stream
+  SRCS
+    file_output_stream.cc
+    file_output_stream.h
+  DEPS
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    tink::core::output_stream
+    absl::memory
+)
+
+tink_cc_library(
+  NAME file_random_access_stream
+  SRCS
+    file_random_access_stream.cc
+    file_random_access_stream.h
+  DEPS
+    tink::util::buffer
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    tink::core::random_access_stream
+    absl::memory
+)
+
+tink_cc_library(
+  NAME istream_input_stream
+  SRCS
+    istream_input_stream.cc
+    istream_input_stream.h
+  DEPS
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    tink::core::input_stream
+    absl::memory
+)
+
+tink_cc_library(
+  NAME ostream_output_stream
+  SRCS
+    ostream_output_stream.cc
+    ostream_output_stream.h
+  DEPS
+    tink::util::errors
+    tink::util::status
+    tink::util::statusor
+    tink::core::output_stream
+    absl::memory
+)
+
+tink_cc_library(
+  NAME test_util
+  SRCS
+    test_util.cc
+    test_util.h
+  DEPS
+    tink::util::constants
+    tink::util::enums
+    tink::util::protobuf_helper
+    tink::util::status
+    tink::util::statusor
+    tink::core::aead
+    tink::core::cleartext_keyset_handle
+    tink::core::deterministic_aead
+    tink::core::hybrid_decrypt
+    tink::core::hybrid_encrypt
+    tink::core::input_stream
+    tink::core::keyset_handle
+    tink::core::kms_client
+    tink::core::mac
+    tink::core::output_stream
+    tink::core::public_key_sign
+    tink::core::public_key_verify
+    tink::core::random_access_stream
+    tink::core::streaming_aead
+    tink::aead::aes_ctr_hmac_aead_key_manager
+    tink::aead::aes_gcm_key_manager
+    tink::aead::xchacha20_poly1305_key_manager
+    tink::subtle::random
+    tink::subtle::subtle_util_boringssl
+    tink::proto::aes_ctr_hmac_aead_cc_proto
+    tink::proto::aes_gcm_cc_proto
+    tink::proto::common_cc_proto
+    tink::proto::ecdsa_cc_proto
+    tink::proto::ecies_aead_hkdf_cc_proto
+    tink::proto::ed25519_cc_proto
+    tink::proto::tink_cc_proto
+    tink::proto::xchacha20_poly1305_cc_proto
+    tink::util::buffer
+    absl::core_headers
+    absl::memory
+    absl::strings
+    absl::synchronization
+)
+
+tink_cc_library(
+  NAME test_matchers
+  SRCS
+    test_matchers.h
+  DEPS
+    tink::util::status
+    gmock
+)
+
+tink_cc_library(
+  NAME test_keyset_handle
+  SRCS
+    test_keyset_handle.cc
+    test_keyset_handle.h
+  DEPS
+    tink::core::keyset_handle
+    tink::proto::tink_cc_proto
+    absl::memory
+)
+
+tink_cc_library(
+  NAME protobuf_helper
+  SRCS protobuf_helper.h
+  DEPS protobuf::libprotobuf-lite
+)
+
+# tests
+
+tink_cc_test(
+  NAME buffer_test
+  SRCS
+    buffer_test.cc
+  DEPS
+    absl::memory
+    absl::strings
+    tink::subtle::random
+    tink::util::buffer
+    tink::util::status
+    tink::util::test_matchers
+)
+
+tink_cc_test(
+  NAME errors_test
+  SRCS
+    errors_test.cc
+  DEPS
+    tink::util::errors
+    tink::util::status
+)
+
+tink_cc_test(
+  NAME enums_test
+  SRCS
+    enums_test.cc
+  DEPS
+    tink::util::enums
+    tink::subtle::common_enums
+    tink::proto::common_cc_proto
+)
+
+tink_cc_test(
+  NAME file_input_stream_test
+  SRCS
+    file_input_stream_test.cc
+  DEPS
+    tink::util::file_input_stream
+    tink::util::test_util
+    absl::memory
+    absl::strings
+)
+
+tink_cc_test(
+  NAME file_output_stream_test
+  SRCS
+    file_output_stream_test.cc
+  DEPS
+    tink::util::file_output_stream
+    tink::util::test_util
+    tink::subtle::random
+    absl::memory
+    absl::strings
+)
+
+tink_cc_test(
+  NAME file_random_access_stream_test
+  SRCS
+    file_random_access_stream_test.cc
+  DEPS
+    tink::util::buffer
+    tink::util::file_random_access_stream
+    tink::util::test_util
+    absl::memory
+    absl::strings
+)
+
+tink_cc_test(
+  NAME istream_input_stream_test
+  SRCS
+    istream_input_stream_test.cc
+  DEPS
+    tink::util::istream_input_stream
+    tink::util::test_util
+    tink::subtle::random
+    absl::memory
+    absl::strings
+)
+
+tink_cc_test(
+  NAME ostream_output_stream_test
+  SRCS
+    ostream_output_stream_test.cc
+  DEPS
+    tink::util::ostream_output_stream
+    tink::util::test_util
+    tink::subtle::random
+    absl::memory
+    absl::strings
+)
+
+tink_cc_test(
+  NAME test_util_test
+  SRCS
+    test_util_test.cc
+  DEPS
+    tink::proto::aes_gcm_cc_proto
+    tink::proto::tink_cc_proto
+    tink::util::test_util
+    tink::subtle::random
+    absl::strings
+    gmock
+)
+
+tink_cc_test(
+  NAME validation_test
+  SRCS
+    validation_test.cc
+  DEPS
+    tink::util::test_matchers
+    tink::util::validation
+    gmock
+)
diff --git a/cc/util/buffer.cc b/cc/util/buffer.cc
new file mode 100644
index 0000000..d165121
--- /dev/null
+++ b/cc/util/buffer.cc
@@ -0,0 +1,129 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/util/buffer.h"
+
+#include "absl/memory/memory.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace util {
+namespace {
+
+class OwningBuffer : public Buffer {
+ public:
+  // Constructs a new Buffer which allocates a new memory block
+  // of size 'allocated_size' and uses it for the actual data.
+  // The allocated memory block is owned by this Buffer.
+  // It is assumed that 'allocated_size' is positive.
+  explicit OwningBuffer(int allocated_size)
+      : allocated_size_(allocated_size), size_(allocated_size) {
+    owned_mem_block_ = absl::make_unique<char[]>(allocated_size);
+  }
+
+  char* const get_mem_block() const override  {
+    return owned_mem_block_.get();
+  }
+
+  int allocated_size() const override { return allocated_size_; }
+
+  int size() const override { return size_; }
+
+  util::Status set_size(int new_size) override {
+    if (new_size < 0  || new_size > allocated_size_) {
+      return Status(crypto::tink::util::error::INVALID_ARGUMENT,
+                    "new_size must satisfy 0 <= new_size <= allocated_size()");
+    }
+    size_ = new_size;
+    return Status::OK;
+  }
+
+  ~OwningBuffer() override {}
+
+ private:
+  std::unique_ptr<char[]> owned_mem_block_;
+  const int allocated_size_;
+  int size_;
+};
+
+
+class NonOwningBuffer : public Buffer {
+ public:
+  // Constructs a new Buffer which uses the given 'mem_block' as a buffer
+  // for the actual data.
+  // Does NOT take the ownership of 'mem_block' which must be non-null,
+  // must allocate at least 'allocated_size' bytes, and must remain alive
+  // as long as the returned Buffer is in use.
+  // It is assumed that 'mem_block' is non-null, and that
+  // 'allocated_size' is positive.
+  NonOwningBuffer(char* mem_block, int allocated_size)
+      : mem_block_(mem_block),
+        allocated_size_(allocated_size), size_(allocated_size) {}
+
+  char* const get_mem_block() const override { return mem_block_; };
+
+  int allocated_size() const override { return allocated_size_; }
+
+  int size() const override { return size_; }
+
+  util::Status set_size(int new_size) override {
+    if (new_size < 0  || new_size > allocated_size_) {
+      return Status(crypto::tink::util::error::INVALID_ARGUMENT,
+                    "new_size must satisfy 0 <= new_size <= allocated_size()");
+    }
+    size_ = new_size;
+    return Status::OK;
+  }
+
+  ~NonOwningBuffer() override {}
+
+ private:
+  char* const mem_block_;
+  const int allocated_size_;
+  int size_;
+};
+
+}  // namespace
+
+// static
+StatusOr<std::unique_ptr<Buffer>> Buffer::New(int allocated_size) {
+  if (allocated_size <= 0) {
+    return Status(crypto::tink::util::error::INVALID_ARGUMENT,
+                  "allocated_size must be positive");
+  }
+  return {absl::make_unique<OwningBuffer>(allocated_size)};
+}
+
+// static
+StatusOr<std::unique_ptr<Buffer>> Buffer::NewNonOwning(
+    char* mem_block, int allocated_size) {
+  if (allocated_size <= 0) {
+    return Status(crypto::tink::util::error::INVALID_ARGUMENT,
+                  "allocated_size must be positive");
+  }
+  if (mem_block == nullptr) {
+    return Status(crypto::tink::util::error::INVALID_ARGUMENT,
+                  "mem_block must be non-null");
+  }
+  return {absl::make_unique<NonOwningBuffer>(mem_block, allocated_size)};
+}
+
+
+}  // namespace util
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/util/buffer.h b/cc/util/buffer.h
new file mode 100644
index 0000000..f46de54
--- /dev/null
+++ b/cc/util/buffer.h
@@ -0,0 +1,68 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_UTIL_BUFFER_H_
+#define TINK_UTIL_BUFFER_H_
+
+#include "absl/memory/memory.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace util {
+
+class Buffer {
+ public:
+  // Creates a new Buffer which allocates a new memory block
+  // of size 'allocated_size' and uses it for the actual data.
+  // The allocated memory block is owned by this Buffer.
+  static util::StatusOr<std::unique_ptr<Buffer>> New(int allocated_size);
+
+  // Creates a new Buffer which uses the given 'mem_block' as a buffer
+  // for the actual data.
+  // Does NOT take the ownership of 'mem_block' which must be non-null,
+  // must allocate at least 'allocated_size' bytes, and must remain alive
+  // as long as the returned Buffer is in use.
+  static util::StatusOr<std::unique_ptr<Buffer>> NewNonOwning(
+      char* mem_block, int allocated_size);
+
+  // Returns the internal memory block of this Buffer,
+  // that holds the actual data.
+  // A reading caller may read up to size() bytes from the block.
+  // A writing caller may write up to allocated_size() bytes to the block,
+  // and should accordingly adjust size via set_size(int).
+  virtual char* const get_mem_block() const = 0;
+
+  // Returns the allocated size of this buffer.
+  virtual int allocated_size() const = 0;
+
+  // Returns the current size of this buffer.
+  virtual int size() const = 0;
+
+  // Sets the size of this buffer to 'new_size', which must
+  // be in range 0..allocated_size().
+  // Returns OK iff 0 <= new_size <= allocated_size();
+  virtual util::Status set_size(int new_size) = 0;
+
+  virtual ~Buffer() {}
+};
+
+}  // namespace util
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_UTIL_BUFFER_H_
diff --git a/cc/util/buffer_test.cc b/cc/util/buffer_test.cc
new file mode 100644
index 0000000..e5aced1
--- /dev/null
+++ b/cc/util/buffer_test.cc
@@ -0,0 +1,136 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include <cstring>
+
+#include "tink/util/buffer.h"
+
+#include "gtest/gtest.h"
+#include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
+#include "tink/subtle/random.h"
+#include "tink/util/status.h"
+#include "tink/util/test_matchers.h"
+
+namespace crypto {
+namespace tink {
+namespace util {
+namespace {
+
+using ::crypto::tink::test::IsOk;
+using ::crypto::tink::test::StatusIs;
+using testing::HasSubstr;
+
+TEST(BufferTest, ExternalMemoryBlock) {
+  for (auto buf_size : {1, 10, 100, 1000, 10000, 100000, 1000000}) {
+    SCOPED_TRACE(absl::StrCat("buf_size = ", buf_size));
+    auto mem_block = absl::make_unique<char[]>(buf_size);
+    auto buf_result = Buffer::NewNonOwning(mem_block.get(), buf_size);
+    ASSERT_THAT(buf_result.status(), IsOk());
+    auto buf = std::move(buf_result.ValueOrDie());
+    EXPECT_EQ(buf_size, buf->size());
+    EXPECT_EQ(buf_size, buf->allocated_size());
+    EXPECT_EQ(mem_block.get(), buf->get_mem_block());
+    for (auto new_size : {0, 1, buf_size/2, buf_size}) {
+      SCOPED_TRACE(absl::StrCat("new_size = ", buf_size));
+      ASSERT_THAT(buf->set_size(new_size), IsOk());
+      EXPECT_EQ(new_size, buf->size());
+      EXPECT_EQ(buf_size, buf->allocated_size());
+      EXPECT_EQ(mem_block.get(), buf->get_mem_block());
+      auto data = subtle::Random::GetRandomBytes(new_size);
+      std::memcpy(buf->get_mem_block(), data.data(), new_size);
+      EXPECT_EQ(0, std::memcmp(data.data(), buf->get_mem_block(), new_size));
+    }
+  }
+}
+
+TEST(BufferTest, InternalMemoryBlock) {
+  for (auto buf_size : {1, 10, 100, 1000, 10000, 100000, 1000000}) {
+    SCOPED_TRACE(absl::StrCat("buf_size = ", buf_size));
+    auto buf_result = Buffer::New(buf_size);
+    ASSERT_THAT(buf_result.status(), IsOk());
+    auto buf = std::move(buf_result.ValueOrDie());
+    EXPECT_EQ(buf_size, buf->size());
+    EXPECT_EQ(buf_size, buf->allocated_size());
+    for (auto new_size : {0, 1, buf_size/2, buf_size}) {
+      SCOPED_TRACE(absl::StrCat("new_size = ", buf_size));
+      ASSERT_THAT(buf->set_size(new_size), IsOk());
+      EXPECT_EQ(new_size, buf->size());
+      EXPECT_EQ(buf_size, buf->allocated_size());
+      auto data = subtle::Random::GetRandomBytes(new_size);
+      std::memcpy(buf->get_mem_block(), data.data(), new_size);
+      EXPECT_EQ(0, std::memcmp(data.data(), buf->get_mem_block(), new_size));
+    }
+  }
+}
+
+TEST(BufferTest, NullMemoryBlock) {
+  auto buf_result = Buffer::NewNonOwning(nullptr, 42);
+  EXPECT_THAT(buf_result.status(), StatusIs(util::error::INVALID_ARGUMENT,
+                                            HasSubstr("non-null")));
+}
+
+TEST(BufferTest, BadAllocatedSize_ExternalMemoryBlock) {
+  for (auto allocated_size : {-10, -1, 0}) {
+    SCOPED_TRACE(absl::StrCat("allocated_size = ", allocated_size));
+    auto mem_block = absl::make_unique<char[]>(42);
+    auto buf_result = Buffer::NewNonOwning(mem_block.get(), allocated_size);
+    EXPECT_THAT(buf_result.status(), StatusIs(util::error::INVALID_ARGUMENT,
+                                              HasSubstr("allocated_size")));
+  }
+}
+
+TEST(BufferTest, BadAllocatedSize_InternalMemoryBlock) {
+  for (auto allocated_size : {-10, -1, 0}) {
+    SCOPED_TRACE(absl::StrCat("allocated_size = ", allocated_size));
+    auto buf_result = Buffer::New(allocated_size);
+    EXPECT_THAT(buf_result.status(), StatusIs(util::error::INVALID_ARGUMENT,
+                                              HasSubstr("allocated_size")));
+  }
+}
+
+TEST(BufferTest, BadNewSize_ExternalMemoryBlock) {
+  for (auto buf_size : {1, 10, 100, 1000, 10000}) {
+    SCOPED_TRACE(absl::StrCat("buf_size = ", buf_size));
+    auto buf = std::move(Buffer::New(buf_size).ValueOrDie());
+    for (auto new_size : {-10, -1, buf_size + 1, 2 * buf_size}) {
+      SCOPED_TRACE(absl::StrCat("new_size = ", buf_size));
+      EXPECT_THAT(buf->set_size(new_size),
+                  StatusIs(util::error::INVALID_ARGUMENT,
+                           HasSubstr("new_size must satisfy")));
+    }
+  }
+}
+
+TEST(BufferTest, BadNewSize_InternalMemoryBlock) {
+  for (auto buf_size : {1, 10, 100, 1000, 10000}) {
+    SCOPED_TRACE(absl::StrCat("buf_size = ", buf_size));
+    auto mem_block = absl::make_unique<char[]>(buf_size);
+    auto buf = std::move(
+        Buffer::NewNonOwning(mem_block.get(), buf_size).ValueOrDie());
+    for (auto new_size : {-10, -1, buf_size + 1, 2 * buf_size}) {
+      SCOPED_TRACE(absl::StrCat("new_size = ", buf_size));
+      EXPECT_THAT(buf->set_size(new_size),
+                  StatusIs(util::error::INVALID_ARGUMENT,
+                           HasSubstr("new_size must satisfy")));
+    }
+  }
+}
+
+}  // namespace
+}  // namespace util
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/util/enums.cc b/cc/util/enums.cc
index 6ea7e9d..2d71929 100644
--- a/cc/util/enums.cc
+++ b/cc/util/enums.cc
@@ -34,6 +34,8 @@
     return pb::EllipticCurveType::NIST_P384;
   case subtle::EllipticCurveType::NIST_P521:
     return pb::EllipticCurveType::NIST_P521;
+  case subtle::EllipticCurveType::CURVE25519:
+    return pb::EllipticCurveType::CURVE25519;
   default:
     return pb::EllipticCurveType::UNKNOWN_CURVE;
   }
@@ -48,6 +50,8 @@
     return subtle::EllipticCurveType::NIST_P384;
   case pb::EllipticCurveType::NIST_P521:
     return subtle::EllipticCurveType::NIST_P521;
+  case pb::EllipticCurveType::CURVE25519:
+    return subtle::EllipticCurveType::CURVE25519;
   default:
     return subtle::EllipticCurveType::UNKNOWN_CURVE;
   }
@@ -88,6 +92,8 @@
     return pb::HashType::SHA1;
   case subtle::HashType::SHA256:
     return pb::HashType::SHA256;
+  case subtle::HashType::SHA384:
+    return pb::HashType::SHA384;
   case subtle::HashType::SHA512:
     return pb::HashType::SHA512;
   default:
@@ -102,6 +108,8 @@
     return subtle::HashType::SHA1;
   case pb::HashType::SHA256:
     return subtle::HashType::SHA256;
+  case pb::HashType::SHA384:
+    return subtle::HashType::SHA384;
   case pb::HashType::SHA512:
     return subtle::HashType::SHA512;
   default:
@@ -156,6 +164,8 @@
       return "SHA1";
     case pb::HashType::SHA256:
       return "SHA256";
+    case pb::HashType::SHA384:
+      return "SHA384";
     case pb::HashType::SHA512:
       return "SHA512";
     default:
@@ -208,6 +218,7 @@
 pb::HashType Enums::Hash(absl::string_view name) {
   if (name == "SHA1") return pb::HashType::SHA1;
   if (name == "SHA256") return pb::HashType::SHA256;
+  if (name == "SHA384") return pb::HashType::SHA384;
   if (name == "SHA512") return pb::HashType::SHA512;
   return pb::HashType::UNKNOWN_HASH;
 }
diff --git a/cc/util/enums_test.cc b/cc/util/enums_test.cc
index 5f4f552..5e373f6 100644
--- a/cc/util/enums_test.cc
+++ b/cc/util/enums_test.cc
@@ -38,6 +38,8 @@
             Enums::SubtleToProto(subtle::EllipticCurveType::NIST_P384));
   EXPECT_EQ(pb::EllipticCurveType::NIST_P521,
             Enums::SubtleToProto(subtle::EllipticCurveType::NIST_P521));
+  EXPECT_EQ(pb::EllipticCurveType::CURVE25519,
+            Enums::SubtleToProto(subtle::EllipticCurveType::CURVE25519));
   EXPECT_EQ(pb::EllipticCurveType::UNKNOWN_CURVE,
             Enums::SubtleToProto(subtle::EllipticCurveType::UNKNOWN_CURVE));
   EXPECT_EQ(pb::EllipticCurveType::UNKNOWN_CURVE,
@@ -49,6 +51,8 @@
             Enums::ProtoToSubtle(pb::EllipticCurveType::NIST_P384));
   EXPECT_EQ(subtle::EllipticCurveType::NIST_P521,
             Enums::ProtoToSubtle(pb::EllipticCurveType::NIST_P521));
+  EXPECT_EQ(subtle::EllipticCurveType::CURVE25519,
+            Enums::ProtoToSubtle(pb::EllipticCurveType::CURVE25519));
   EXPECT_EQ(subtle::EllipticCurveType::UNKNOWN_CURVE,
             Enums::ProtoToSubtle(pb::EllipticCurveType::UNKNOWN_CURVE));
   EXPECT_EQ(subtle::EllipticCurveType::UNKNOWN_CURVE,
@@ -65,7 +69,7 @@
       count++;
     }
   }
-  EXPECT_EQ(4, count);
+  EXPECT_EQ(5, count);
 }
 
 TEST_F(EnumsTest, testHashType) {
@@ -73,6 +77,8 @@
             Enums::SubtleToProto(subtle::HashType::SHA1));
   EXPECT_EQ(pb::HashType::SHA256,
             Enums::SubtleToProto(subtle::HashType::SHA256));
+  EXPECT_EQ(pb::HashType::SHA384,
+            Enums::SubtleToProto(subtle::HashType::SHA384));
   EXPECT_EQ(pb::HashType::SHA512,
             Enums::SubtleToProto(subtle::HashType::SHA512));
   EXPECT_EQ(pb::HashType::UNKNOWN_HASH,
@@ -84,6 +90,8 @@
             Enums::ProtoToSubtle(pb::HashType::SHA1));
   EXPECT_EQ(subtle::HashType::SHA256,
             Enums::ProtoToSubtle(pb::HashType::SHA256));
+  EXPECT_EQ(subtle::HashType::SHA384,
+            Enums::ProtoToSubtle(pb::HashType::SHA384));
   EXPECT_EQ(subtle::HashType::SHA512,
             Enums::ProtoToSubtle(pb::HashType::SHA512));
   EXPECT_EQ(subtle::HashType::UNKNOWN_HASH,
@@ -102,7 +110,7 @@
       count++;
     }
   }
-  EXPECT_EQ(4, count);
+  EXPECT_EQ(5, count);
 }
 
 TEST_F(EnumsTest, testEcPointFormat) {
@@ -218,6 +226,7 @@
 
   EXPECT_EQ(pb::HashType::SHA1, Enums::Hash("SHA1"));
   EXPECT_EQ(pb::HashType::SHA256, Enums::Hash("SHA256"));
+  EXPECT_EQ(pb::HashType::SHA384, Enums::Hash("SHA384"));
   EXPECT_EQ(pb::HashType::SHA512, Enums::Hash("SHA512"));
   EXPECT_EQ(pb::HashType::UNKNOWN_HASH, Enums::Hash("Other string"));
   EXPECT_EQ(pb::HashType::UNKNOWN_HASH, Enums::Hash("UNKNOWN_HASH"));
@@ -232,7 +241,7 @@
       count++;
     }
   }
-  EXPECT_EQ(4, count);
+  EXPECT_EQ(5, count);
 }
 
 TEST_F(EnumsTest, testKeyMaterialName) {
diff --git a/cc/util/errors.cc b/cc/util/errors.cc
index d9a0737..200a5b5 100644
--- a/cc/util/errors.cc
+++ b/cc/util/errors.cc
@@ -14,6 +14,10 @@
 //
 ///////////////////////////////////////////////////////////////////////////////
 
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE  // needed for vasprintf(3)
+#endif
+
 #include "tink/util/errors.h"
 
 #include <stdarg.h>
@@ -32,7 +36,9 @@
   va_list ap;
   va_start(ap, format);
   char* p;
-  vasprintf(&p, format, ap);
+  if (vasprintf(&p, format, ap) < 0) {
+    abort();
+  }
   va_end(ap);
   Status status(code, p);
   free(p);
diff --git a/cc/util/file_input_stream_test.cc b/cc/util/file_input_stream_test.cc
index 441544c..e8f8d12 100644
--- a/cc/util/file_input_stream_test.cc
+++ b/cc/util/file_input_stream_test.cc
@@ -16,51 +16,16 @@
 
 #include "tink/util/file_input_stream.h"
 
-#include <fcntl.h>
-#include <unistd.h>
-#include <vector>
-
 #include "gtest/gtest.h"
 #include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
 #include "absl/strings/string_view.h"
-#include "tink/subtle/random.h"
 #include "tink/util/test_util.h"
 
 namespace crypto {
 namespace tink {
 namespace {
 
-// Creates a new test file with the specified 'filename', writes 'size' random
-// bytes to the file, and returns a file descriptor for reading from the file.
-// A copy of the bytes written to the file is returned in 'file_contents'.
-int GetTestFileDescriptor(
-    absl::string_view filename, int size, std::string* file_contents) {
-  std::string full_filename =
-      absl::StrCat(crypto::tink::test::TmpDir(), "/", filename);
-  (*file_contents) = subtle::Random::GetRandomBytes(size);
-  mode_t mode = S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH;
-  int fd = open(full_filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC, mode);
-  if (fd == -1) {
-    std::clog << "Cannot create file " << full_filename
-              << " error: " << errno << std::endl;
-    exit(1);
-  }
-  if (write(fd, file_contents->data(), size) != size) {
-    std::clog << "Failed to write " << size << " bytes to file "
-              << full_filename << " error: " << errno << std::endl;
-
-    exit(1);
-  }
-  close(fd);
-  fd = open(full_filename.c_str(), O_RDONLY);
-  if (fd == -1) {
-    std::clog << "Cannot re-open file " << full_filename
-              << " error: " << errno << std::endl;
-    exit(1);
-  }
-  return fd;
-}
-
 // Reads the specified 'input_stream' until no more bytes can be read,
 // and puts the read bytes into 'contents'.
 // Returns the status of the last input_stream->Next()-operation.
@@ -81,11 +46,12 @@
 };
 
 TEST_F(FileInputStreamTest, testReadingStreams) {
-  std::vector<int> stream_sizes = {0, 10, 100, 1000, 10000, 100000, 1000000};
-  for (auto stream_size : stream_sizes) {
+  for (auto stream_size : {0, 10, 100, 1000, 10000, 100000, 1000000}) {
+    SCOPED_TRACE(absl::StrCat("stream_size = ", stream_size));
     std::string file_contents;
     std::string filename = absl::StrCat(stream_size, "_reading_test.bin");
-    int input_fd = GetTestFileDescriptor(filename, stream_size, &file_contents);
+    int input_fd =
+        test::GetTestFileDescriptor(filename, stream_size, &file_contents);
     EXPECT_EQ(stream_size, file_contents.size());
     auto input_stream = absl::make_unique<util::FileInputStream>(input_fd);
     std::string stream_contents;
@@ -97,12 +63,13 @@
 }
 
 TEST_F(FileInputStreamTest, testCustomBufferSizes) {
-  std::vector<int> buffer_sizes = {1, 10, 100, 1000, 10000};
   int stream_size = 100000;
-  for (auto buffer_size : buffer_sizes) {
+  for (auto buffer_size : {1, 10, 100, 1000, 10000}) {
+    SCOPED_TRACE(absl::StrCat("buffer_size = ", buffer_size));
     std::string file_contents;
     std::string filename = absl::StrCat(buffer_size, "_buffer_size_test.bin");
-    int input_fd = GetTestFileDescriptor(filename, stream_size, &file_contents);
+    int input_fd =
+        test::GetTestFileDescriptor(filename, stream_size, &file_contents);
     EXPECT_EQ(stream_size, file_contents.size());
     auto input_stream =
         absl::make_unique<util::FileInputStream>(input_fd, buffer_size);
@@ -121,7 +88,8 @@
   const void* buffer;
   std::string file_contents;
   std::string filename = absl::StrCat(buffer_size, "_backup_test.bin");
-  int input_fd = GetTestFileDescriptor(filename, stream_size, &file_contents);
+  int input_fd =
+      test::GetTestFileDescriptor(filename, stream_size, &file_contents);
   EXPECT_EQ(stream_size, file_contents.size());
 
   // Prepare the stream and do the first call to Next().
@@ -136,9 +104,9 @@
             std::string(static_cast<const char*>(buffer), buffer_size));
 
   // BackUp several times, but in total fewer bytes than returned by Next().
-  std::vector<int> backup_sizes = {0, 1, 5, 0, 10, 100, -42, 400, 20, -100};
   int total_backup_size = 0;
-  for (auto backup_size : backup_sizes) {
+  for (auto backup_size : {0, 1, 5, 0, 10, 100, -42, 400, 20, -100}) {
+    SCOPED_TRACE(absl::StrCat("backup_size = ", backup_size));
     input_stream->BackUp(backup_size);
     total_backup_size += std::max(0, backup_size);
     EXPECT_EQ(buffer_size - total_backup_size, input_stream->Position());
@@ -153,9 +121,9 @@
       std::string(static_cast<const char*>(buffer), total_backup_size));
 
   // BackUp() some bytes, again fewer than returned by Next().
-  backup_sizes = {0, 72, -94, 37, 82};
   total_backup_size = 0;
-  for (auto backup_size : backup_sizes) {
+  for (auto backup_size : {0, 72, -94, 37, 82}) {
+    SCOPED_TRACE(absl::StrCat("backup_size = ", backup_size));
     input_stream->BackUp(backup_size);
     total_backup_size += std::max(0, backup_size);
     EXPECT_EQ(buffer_size - total_backup_size, input_stream->Position());
@@ -180,9 +148,10 @@
       std::string(static_cast<const char*>(buffer), buffer_size));
 
   // BackUp a few times, with total over the returned buffer_size.
-  backup_sizes = {0, 72, -100, buffer_size/2, 200, -25, buffer_size, 42};
   total_backup_size = 0;
-  for (auto backup_size : backup_sizes) {
+  for (auto backup_size :
+           {0, 72, -100, buffer_size/2, 200, -25, buffer_size, 42}) {
+    SCOPED_TRACE(absl::StrCat("backup_size = ", backup_size));
     input_stream->BackUp(backup_size);
     total_backup_size = std::min(buffer_size,
                                  total_backup_size + std::max(0, backup_size));
diff --git a/cc/util/file_output_stream_test.cc b/cc/util/file_output_stream_test.cc
index 8f47f87..fb6c94d 100644
--- a/cc/util/file_output_stream_test.cc
+++ b/cc/util/file_output_stream_test.cc
@@ -16,12 +16,9 @@
 
 #include "tink/util/file_output_stream.h"
 
-#include <fcntl.h>
-#include <unistd.h>
-#include <vector>
-
 #include "gtest/gtest.h"
 #include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
 #include "absl/strings/string_view.h"
 #include "tink/subtle/random.h"
 #include "tink/util/test_util.h"
@@ -30,20 +27,6 @@
 namespace tink {
 namespace {
 
-// Creates a new test file with the specified 'filename', ready for writing.
-int GetTestFileDescriptor(absl::string_view filename) {
-  std::string full_filename =
-      absl::StrCat(crypto::tink::test::TmpDir(), "/", filename);
-  mode_t mode = S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH;
-  int fd = open(full_filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC, mode);
-  if (fd == -1) {
-    std::clog << "Cannot create file " << full_filename
-              << " error: " << errno << std::endl;
-    exit(1);
-  }
-  return fd;
-}
-
 // Writes 'contents' the specified 'output_stream', and closes the stream.
 // Returns the status of output_stream->Close()-operation, or a non-OK status
 // of a prior output_stream->Next()-operation, if any.
@@ -52,8 +35,8 @@
   void* buffer;
   int pos = 0;
   int remaining = contents.length();
-  int available_space;
-  int available_bytes;
+  int available_space = 0;
+  int available_bytes = 0;
   while (remaining > 0) {
     auto next_result = output_stream->Next(&buffer);
     if (!next_result.ok()) return next_result.status();
@@ -69,60 +52,31 @@
   return output_stream->Close();
 }
 
-// Reads the test file specified by 'filename', and returns its contents.
-std::string ReadFile(std::string filename) {
-  std::string full_filename =
-      absl::StrCat(crypto::tink::test::TmpDir(), "/", filename);
-  int fd = open(full_filename.c_str(), O_RDONLY);
-  if (fd == -1) {
-    std::clog << "Cannot open file " << full_filename
-              << " error: " << errno << std::endl;
-    exit(1);
-  }
-  std::string contents;
-  int buffer_size = 128 * 1024;
-  auto buffer = absl::make_unique<uint8_t[]>(buffer_size);
-  int read_result = read(fd, buffer.get(), buffer_size);
-  while (read_result > 0) {
-    std::clog << "Read " << read_result << " bytes" << std::endl;
-    contents.append(reinterpret_cast<const char*>(buffer.get()), read_result);
-    read_result = read(fd, buffer.get(), buffer_size);
-  }
-  if (read_result < 0) {
-    std::clog << "Error reading file " << full_filename
-              << " error: " << errno << std::endl;
-    exit(1);
-  }
-  close(fd);
-  std::clog << "Read in total " << contents.length() << " bytes" << std::endl;
-  return contents;
-}
-
 class FileOutputStreamTest : public ::testing::Test {
 };
 
 TEST_F(FileOutputStreamTest, WritingStreams) {
-  std::vector<int> stream_sizes = {0, 10, 100, 1000, 10000, 100000, 1000000};
-  for (auto stream_size : stream_sizes) {
+  for (auto stream_size : {0, 10, 100, 1000, 10000, 100000, 1000000}) {
+    SCOPED_TRACE(absl::StrCat("stream_size = ", stream_size));
     std::string stream_contents = subtle::Random::GetRandomBytes(stream_size);
     std::string filename = absl::StrCat(stream_size, "_writing_test.bin");
-    int output_fd = GetTestFileDescriptor(filename);
+    int output_fd = test::GetTestFileDescriptor(filename);
     auto output_stream = absl::make_unique<util::FileOutputStream>(output_fd);
     auto status = WriteToStream(output_stream.get(), stream_contents);
     EXPECT_TRUE(status.ok()) << status;
-    std::string file_contents = ReadFile(filename);
+    std::string file_contents = test::ReadTestFile(filename);
     EXPECT_EQ(stream_size, file_contents.size());
     EXPECT_EQ(stream_contents, file_contents);
   }
 }
 
 TEST_F(FileOutputStreamTest, CustomBufferSizes) {
-  std::vector<int> buffer_sizes = {1, 10, 100, 1000, 10000, 100000, 1000000};
   int stream_size = 1024 * 1024;
   std::string stream_contents = subtle::Random::GetRandomBytes(stream_size);
-  for (auto buffer_size : buffer_sizes) {
+  for (auto buffer_size : {1, 10, 100, 1000, 10000, 100000, 1000000}) {
+    SCOPED_TRACE(absl::StrCat("buffer_size = ", buffer_size));
     std::string filename = absl::StrCat(buffer_size, "_buffer_size_test.bin");
-    int output_fd = GetTestFileDescriptor(filename);
+    int output_fd = test::GetTestFileDescriptor(filename);
     auto output_stream =
         absl::make_unique<util::FileOutputStream>(output_fd, buffer_size);
     void* buffer;
@@ -132,7 +86,7 @@
     output_stream->BackUp(buffer_size);
     auto status = WriteToStream(output_stream.get(), stream_contents);
     EXPECT_TRUE(status.ok()) << status;
-    std::string file_contents = ReadFile(filename);
+    std::string file_contents = test::ReadTestFile(filename);
     EXPECT_EQ(stream_size, file_contents.size());
     EXPECT_EQ(stream_contents, file_contents);
   }
@@ -145,7 +99,7 @@
   void* buffer;
   std::string stream_contents = subtle::Random::GetRandomBytes(stream_size);
   std::string filename = absl::StrCat(buffer_size, "_backup_test.bin");
-  int output_fd = GetTestFileDescriptor(filename);
+  int output_fd = test::GetTestFileDescriptor(filename);
 
   // Prepare the stream and do the first call to Next().
   auto output_stream =
@@ -158,9 +112,9 @@
   std::memcpy(buffer, stream_contents.data(), buffer_size);
 
   // BackUp several times, but in total fewer bytes than returned by Next().
-  std::vector<int> backup_sizes = {0, 1, 5, 0, 10, 100, -42, 400, 20, -100};
   int total_backup_size = 0;
-  for (auto backup_size : backup_sizes) {
+  for (auto backup_size : {0, 1, 5, 0, 10, 100, -42, 400, 20, -100}) {
+    SCOPED_TRACE(absl::StrCat("backup_size = ", backup_size));
     output_stream->BackUp(backup_size);
     total_backup_size += std::max(0, backup_size);
     EXPECT_EQ(buffer_size - total_backup_size, output_stream->Position());
@@ -172,9 +126,9 @@
   EXPECT_TRUE(next_result.ok()) << next_result.status();
 
   // BackUp() some bytes, again fewer than returned by Next().
-  backup_sizes = {0, 72, -94, 37, 82};
   total_backup_size = 0;
-  for (auto backup_size : backup_sizes) {
+  for (auto backup_size : {0, 72, -94, 37, 82}) {
+    SCOPED_TRACE(absl::StrCat("backup_size = ", backup_size));
     output_stream->BackUp(backup_size);
     total_backup_size += std::max(0, backup_size);
     EXPECT_EQ(buffer_size - total_backup_size, output_stream->Position());
@@ -194,9 +148,10 @@
   std::memcpy(buffer, stream_contents.data() + buffer_size, buffer_size);
 
   // BackUp a few times, with total over the returned buffer_size.
-  backup_sizes = {0, 72, -100, buffer_size / 2, 200, -25, buffer_size / 2, 42};
   total_backup_size = 0;
-  for (auto backup_size : backup_sizes) {
+  for (auto backup_size :
+           {0, 72, -100, buffer_size / 2, 200, -25, buffer_size / 2, 42}) {
+    SCOPED_TRACE(absl::StrCat("backup_size = ", backup_size));
     output_stream->BackUp(backup_size);
     total_backup_size = std::min(buffer_size,
                                  total_backup_size + std::max(0, backup_size));
@@ -217,7 +172,7 @@
   auto status = WriteToStream(
       output_stream.get(), stream_contents.substr(output_stream->Position()));
   EXPECT_TRUE(status.ok()) << status;
-  std::string file_contents = ReadFile(filename);
+  std::string file_contents = test::ReadTestFile(filename);
   EXPECT_EQ(stream_size, file_contents.size());
   EXPECT_EQ(stream_contents, file_contents);
 }
diff --git a/cc/util/file_random_access_stream.cc b/cc/util/file_random_access_stream.cc
new file mode 100644
index 0000000..ca869bd
--- /dev/null
+++ b/cc/util/file_random_access_stream.cc
@@ -0,0 +1,104 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/util/file_random_access_stream.h"
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <algorithm>
+
+#include "absl/memory/memory.h"
+#include "tink/random_access_stream.h"
+#include "tink/util/buffer.h"
+#include "tink/util/errors.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace util {
+
+using crypto::tink::util::Status;
+using crypto::tink::util::StatusOr;
+
+namespace {
+
+// Attempts to close file descriptor fd, while ignoring EINTR.
+// (code borrowed from ZeroCopy-streams)
+int close_ignoring_eintr(int fd) {
+  int result;
+  do {
+    result = close(fd);
+  } while (result < 0 && errno == EINTR);
+  return result;
+}
+
+}  // anonymous namespace
+
+FileRandomAccessStream::FileRandomAccessStream(int file_descriptor) {
+  fd_ = file_descriptor;
+}
+
+Status FileRandomAccessStream::PRead(int64_t position, int count,
+                                     Buffer* dest_buffer) {
+  if (dest_buffer == nullptr) {
+    return ToStatusF(util::error::INVALID_ARGUMENT,
+                     "dest_buffer must be non-null");
+  }
+  if (count <= 0) {
+    return ToStatusF(util::error::INVALID_ARGUMENT,
+                     "count must be positive");
+  }
+  if (count > dest_buffer->allocated_size()) {
+    return ToStatusF(util::error::INVALID_ARGUMENT,
+                     "buffer too small");
+  }
+  if (position < 0) {
+    return ToStatusF(util::error::INVALID_ARGUMENT,
+                     "position cannot be negative");
+  }
+  crypto::tink::util::Status status = dest_buffer->set_size(count);
+  if (!status.ok()) return status;
+  int read_count = pread(fd_, dest_buffer->get_mem_block(), count, position);
+  if (read_count == 0) {
+    dest_buffer->set_size(0).IgnoreError();
+    return Status(util::error::OUT_OF_RANGE, "EOF");
+  }
+  if (read_count < 0) {
+    dest_buffer->set_size(0).IgnoreError();
+    return ToStatusF(util::error::UNKNOWN, "I/O error: %d", errno);
+  }
+  status = dest_buffer->set_size(read_count);
+  if (!status.ok()) return status;
+  return Status::OK;
+}
+
+FileRandomAccessStream::~FileRandomAccessStream() {
+  close_ignoring_eintr(fd_);
+}
+
+StatusOr<int64_t> FileRandomAccessStream::size() {
+  struct stat s;
+  if (fstat(fd_, &s) == -1) {
+    return Status(util::error::UNAVAILABLE, "size unavailable");
+  } else {
+    return s.st_size;
+  }
+}
+
+}  // namespace util
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/util/file_random_access_stream.h b/cc/util/file_random_access_stream.h
new file mode 100644
index 0000000..47bfc13
--- /dev/null
+++ b/cc/util/file_random_access_stream.h
@@ -0,0 +1,55 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_UTIL_FILE_RANDOM_ACCESS_STREAM_H_
+#define TINK_UTIL_FILE_RANDOM_ACCESS_STREAM_H_
+
+#include <memory>
+
+#include "tink/random_access_stream.h"
+#include "tink/util/buffer.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+namespace util {
+
+// An RandomAccessStream that reads from a file descriptor.
+class FileRandomAccessStream : public crypto::tink::RandomAccessStream {
+ public:
+  // Constructs a FileRandomAccessStream that will read from the file specified
+  // via 'file_descriptor'.
+  // Takes the ownership of the file, and will close it upon destruction.
+  explicit FileRandomAccessStream(int file_descriptor);
+
+  ~FileRandomAccessStream() override;
+
+  crypto::tink::util::Status PRead(int64_t position,
+                                   int count,
+                                   Buffer* dest_buffer) override;
+
+  crypto::tink::util::StatusOr<int64_t> size() override;
+
+ private:
+  int fd_;
+};
+
+}  // namespace util
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_UTIL_FILE_RANDOM_ACCESS_STREAM_H_
diff --git a/cc/util/file_random_access_stream_test.cc b/cc/util/file_random_access_stream_test.cc
new file mode 100644
index 0000000..134d02d
--- /dev/null
+++ b/cc/util/file_random_access_stream_test.cc
@@ -0,0 +1,201 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/util/file_random_access_stream.h"
+
+#include <thread>  // NOLINT(build/c++11)
+
+#include "gtest/gtest.h"
+#include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "tink/util/buffer.h"
+#include "tink/util/test_util.h"
+
+namespace crypto {
+namespace tink {
+namespace util {
+namespace {
+
+// Reads the entire 'ra_stream' in chunks of size 'chunk_size',
+// until no more bytes can be read, and puts the read bytes into 'contents'.
+// Returns the status of the last ra_stream->Next()-operation.
+util::Status ReadAll(RandomAccessStream* ra_stream, int chunk_size,
+                     std::string* contents) {
+  contents->clear();
+  auto buffer = std::move(Buffer::New(chunk_size).ValueOrDie());
+  int64_t position = 0;
+  auto status = ra_stream->PRead(position, chunk_size, buffer.get());
+  while (status.ok()) {
+    contents->append(buffer->get_mem_block(), buffer->size());
+    position = contents->size();
+    status = ra_stream->PRead(position, chunk_size, buffer.get());
+  }
+  if (status.error_code() == util::error::OUT_OF_RANGE) {  // EOF
+    EXPECT_EQ(0, buffer->size());
+  }
+  return status;
+}
+
+// Reads from 'ra_stream' a chunk of 'count' bytes starting offset 'position',
+// and compares the read bytes to the corresponding bytes in 'file_contents'.
+void ReadAndVerifyChunk(RandomAccessStream* ra_stream,
+                        int64_t position,
+                        int count,
+                        absl::string_view file_contents) {
+  SCOPED_TRACE(absl::StrCat("stream_size = ", file_contents.size(),
+                            ", position = ", position,
+                            ", count = ", count));
+  auto buffer = std::move(Buffer::New(count).ValueOrDie());
+  int stream_size = ra_stream->size().ValueOrDie();
+  EXPECT_EQ(file_contents.size(), stream_size);
+  auto status = ra_stream->PRead(position, count, buffer.get());
+  EXPECT_TRUE(status.ok());
+  int read_count = buffer->size();
+  int expected_count = count;
+  if (position + count > stream_size) {
+    expected_count = stream_size - position;
+  }
+  EXPECT_EQ(expected_count, read_count);
+  EXPECT_EQ(0, memcmp(&file_contents[position],
+                      buffer->get_mem_block(), read_count));
+}
+
+TEST(FileRandomAccessStreamTest, ReadingStreams) {
+  for (auto stream_size : {1, 10, 100, 1000, 10000, 1000000}) {
+    SCOPED_TRACE(absl::StrCat("stream_size = ", stream_size));
+    std::string file_contents;
+    std::string filename = absl::StrCat(stream_size, "_reading_test.bin");
+    int input_fd =
+        test::GetTestFileDescriptor(filename, stream_size, &file_contents);
+    EXPECT_EQ(stream_size, file_contents.size());
+    auto ra_stream = absl::make_unique<util::FileRandomAccessStream>(input_fd);
+    std::string stream_contents;
+    auto status = ReadAll(ra_stream.get(), 1 + (stream_size / 10),
+                          &stream_contents);
+    EXPECT_EQ(util::error::OUT_OF_RANGE, status.error_code());
+    EXPECT_EQ("EOF", status.error_message());
+    EXPECT_EQ(file_contents, stream_contents);
+    EXPECT_EQ(stream_size, ra_stream->size().ValueOrDie());
+  }
+}
+
+TEST(FileRandomAccessStreamTest, ReadingStreamsTillLastByte) {
+  for (auto stream_size : {1, 10, 100, 1000, 10000}) {
+    SCOPED_TRACE(absl::StrCat("stream_size = ", stream_size));
+    std::string file_contents;
+    std::string filename = absl::StrCat(stream_size, "_reading_test.bin");
+    int input_fd =
+        test::GetTestFileDescriptor(filename, stream_size, &file_contents);
+    EXPECT_EQ(stream_size, file_contents.size());
+    auto ra_stream = absl::make_unique<util::FileRandomAccessStream>(input_fd);
+    auto buffer = std::move(Buffer::New(stream_size).ValueOrDie());
+
+    // Read from the beginning till the last byte.
+    auto status = ra_stream->PRead(/* position = */ 0,
+                                   stream_size, buffer.get());
+    EXPECT_TRUE(status.ok());
+    EXPECT_EQ(stream_size, ra_stream->size().ValueOrDie());
+    EXPECT_EQ(0, memcmp(&file_contents[0],
+                        buffer->get_mem_block(), stream_size));
+  }
+}
+
+
+TEST(FileRandomAccessStreamTest, ConcurrentReads) {
+  for (auto stream_size : {100, 1000, 10000, 100000}) {
+    std::string file_contents;
+    std::string filename = absl::StrCat(stream_size, "_reading_test.bin");
+    int input_fd =
+        test::GetTestFileDescriptor(filename, stream_size, &file_contents);
+    EXPECT_EQ(stream_size, file_contents.size());
+    auto ra_stream = absl::make_unique<util::FileRandomAccessStream>(input_fd);
+    std::thread read_0(ReadAndVerifyChunk,
+        ra_stream.get(), 0, stream_size / 2, file_contents);
+    std::thread read_1(ReadAndVerifyChunk,
+        ra_stream.get(), stream_size / 4, stream_size / 2, file_contents);
+    std::thread read_2(ReadAndVerifyChunk,
+        ra_stream.get(), stream_size / 2, stream_size / 2, file_contents);
+    std::thread read_3(ReadAndVerifyChunk,
+        ra_stream.get(), 3 * stream_size / 4, stream_size / 2, file_contents);
+    read_0.join();
+    read_1.join();
+    read_2.join();
+    read_3.join();
+  }
+}
+
+TEST(FileRandomAccessStreamTest, NegativeReadPosition) {
+  for (auto stream_size : {0, 10, 100, 1000, 10000}) {
+    std::string file_contents;
+    std::string filename = absl::StrCat(stream_size, "_reading_test.bin");
+    int input_fd =
+        test::GetTestFileDescriptor(filename, stream_size, &file_contents);
+    auto ra_stream = absl::make_unique<util::FileRandomAccessStream>(input_fd);
+    int count = 42;
+    auto buffer = std::move(Buffer::New(count).ValueOrDie());
+    for (auto position : {-100, -10, -1}) {
+      SCOPED_TRACE(absl::StrCat("stream_size = ", stream_size,
+                                " position = ", position));
+
+      auto status = ra_stream->PRead(position, count, buffer.get());
+      EXPECT_EQ(util::error::INVALID_ARGUMENT, status.error_code());
+    }
+  }
+}
+
+TEST(FileRandomAccessStreamTest, NotPositiveReadCount) {
+  for (auto stream_size : {0, 10, 100, 1000, 10000}) {
+    std::string file_contents;
+    std::string filename = absl::StrCat(stream_size, "_reading_test.bin");
+    int input_fd =
+        test::GetTestFileDescriptor(filename, stream_size, &file_contents);
+    auto ra_stream = absl::make_unique<util::FileRandomAccessStream>(input_fd);
+    auto buffer = std::move(Buffer::New(42).ValueOrDie());
+    int64_t position = 0;
+    for (auto count : {-100, -10, -1, 0}) {
+      SCOPED_TRACE(absl::StrCat("stream_size = ", stream_size,
+                                " count = ", count));
+      auto status = ra_stream->PRead(position, count, buffer.get());
+      EXPECT_EQ(util::error::INVALID_ARGUMENT, status.error_code());
+    }
+  }
+}
+
+TEST(FileRandomAccessStreamTest, ReadPositionAfterEof) {
+  for (auto stream_size : {0, 10, 100, 1000, 10000}) {
+    std::string file_contents;
+    std::string filename = absl::StrCat(stream_size, "_reading_test.bin");
+    int input_fd =
+        test::GetTestFileDescriptor(filename, stream_size, &file_contents);
+    auto ra_stream = absl::make_unique<util::FileRandomAccessStream>(input_fd);
+    int count = 42;
+    auto buffer = std::move(Buffer::New(count).ValueOrDie());
+    for (auto position : {stream_size + 1, stream_size + 10}) {
+      SCOPED_TRACE(absl::StrCat("stream_size = ", stream_size,
+                                " position = ", position));
+
+      auto status = ra_stream->PRead(position, count, buffer.get());
+      EXPECT_EQ(util::error::OUT_OF_RANGE, status.error_code());
+      EXPECT_EQ(0, buffer->size());
+    }
+  }
+}
+
+}  // namespace
+}  // namespace util
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/util/istream_input_stream_test.cc b/cc/util/istream_input_stream_test.cc
index 42e442d..331d2cf 100644
--- a/cc/util/istream_input_stream_test.cc
+++ b/cc/util/istream_input_stream_test.cc
@@ -20,7 +20,6 @@
 #include <fstream>
 #include <iostream>
 #include <istream>
-#include <vector>
 
 #include "gtest/gtest.h"
 #include "absl/memory/memory.h"
@@ -73,8 +72,7 @@
 };
 
 TEST_F(IstreamInputStreamTest, testReadingStreams) {
-  std::vector<int> stream_sizes = {0, 10, 100, 1000, 10000, 100000, 1000000};
-  for (auto stream_size : stream_sizes) {
+  for (int stream_size : {0, 10, 100, 1000, 10000, 100000, 1000000}) {
     std::string file_contents;
     std::string filename = absl::StrCat(stream_size, "_reading_test.bin");
     auto input = GetTestIstream(filename, stream_size, &file_contents);
@@ -90,9 +88,8 @@
 }
 
 TEST_F(IstreamInputStreamTest, testCustomBufferSizes) {
-  std::vector<int> buffer_sizes = {1, 10, 100, 1000, 10000};
   int stream_size = 100000;
-  for (auto buffer_size : buffer_sizes) {
+  for (int buffer_size : {1, 10, 100, 1000, 10000}) {
     std::string file_contents;
     std::string filename = absl::StrCat(buffer_size, "_buffer_size_test.bin");
     auto input = GetTestIstream(filename, stream_size, &file_contents);
@@ -129,9 +126,8 @@
             std::string(static_cast<const char*>(buffer), buffer_size));
 
   // BackUp several times, but in total fewer bytes than returned by Next().
-  std::vector<int> backup_sizes = {0, 1, 5, 0, 10, 100, -42, 400, 20, -100};
   int total_backup_size = 0;
-  for (auto backup_size : backup_sizes) {
+  for (auto backup_size : {0, 1, 5, 0, 10, 100, -42, 400, 20, -100}) {
     input_stream->BackUp(backup_size);
     total_backup_size += std::max(0, backup_size);
     EXPECT_EQ(buffer_size - total_backup_size, input_stream->Position());
@@ -146,9 +142,8 @@
       std::string(static_cast<const char*>(buffer), total_backup_size));
 
   // BackUp() some bytes, again fewer than returned by Next().
-  backup_sizes = {0, 72, -94, 37, 82};
   total_backup_size = 0;
-  for (auto backup_size : backup_sizes) {
+  for (int backup_size : {0, 72, -94, 37, 82}) {
     input_stream->BackUp(backup_size);
     total_backup_size += std::max(0, backup_size);
     EXPECT_EQ(buffer_size - total_backup_size, input_stream->Position());
@@ -173,9 +168,9 @@
       std::string(static_cast<const char*>(buffer), buffer_size));
 
   // BackUp a few times, with total over the returned buffer_size.
-  backup_sizes = {0, 72, -100, buffer_size/2, 200, -25, buffer_size, 42};
   total_backup_size = 0;
-  for (auto backup_size : backup_sizes) {
+  for (int backup_size :
+           {0, 72, -100, buffer_size/2, 200, -25, buffer_size, 42}) {
     input_stream->BackUp(backup_size);
     total_backup_size = std::min(buffer_size,
                                  total_backup_size + std::max(0, backup_size));
diff --git a/cc/util/keyset_util.cc b/cc/util/keyset_util.cc
deleted file mode 100644
index 58274ce..0000000
--- a/cc/util/keyset_util.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2018 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#include "tink/util/keyset_util.h"
-
-#include "absl/memory/memory.h"
-#include "tink/keyset_handle.h"
-#include "proto/tink.pb.h"
-
-using google::crypto::tink::Keyset;
-
-namespace crypto {
-namespace tink {
-
-// static
-std::unique_ptr<KeysetHandle> KeysetUtil::GetKeysetHandle(
-    const Keyset& keyset) {
-  auto unique_keyset = absl::make_unique<Keyset>(keyset);
-  std::unique_ptr<KeysetHandle> handle =
-      absl::WrapUnique(new KeysetHandle(std::move(unique_keyset)));
-  return handle;
-}
-
-// static
-const Keyset& KeysetUtil::GetKeyset(const KeysetHandle& keyset_handle) {
-  return keyset_handle.get_keyset();
-}
-
-}  // namespace tink
-}  // namespace crypto
diff --git a/cc/util/keyset_util.h b/cc/util/keyset_util.h
deleted file mode 100644
index 3e80796..0000000
--- a/cc/util/keyset_util.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2018 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-///////////////////////////////////////////////////////////////////////////////
-
-#ifndef TINK_UTIL_KEYSET_UTIL_H_
-#define TINK_UTIL_KEYSET_UTIL_H_
-
-#include "tink/keyset_handle.h"
-#include "proto/tink.pb.h"
-
-namespace crypto {
-namespace tink {
-
-// The helpers below are "packed" in a class to allow for an easier
-// addition of them as a "friend class".
-class KeysetUtil {
- public:
-  // Creates a KeysetHandle object for the given 'keyset'.
-  static std::unique_ptr<KeysetHandle> GetKeysetHandle(
-      const google::crypto::tink::Keyset& keyset);
-
-  // Returns a Keyset-proto from the given 'keyset_handle'.
-  static const google::crypto::tink::Keyset& GetKeyset(
-      const KeysetHandle& keyset_handle);
-};
-
-}  // namespace tink
-}  // namespace crypto
-
-#endif  // TINK_UTIL_KEYSET_UTIL_H_
diff --git a/cc/util/ostream_output_stream.cc b/cc/util/ostream_output_stream.cc
index 65c1b00..f96a2ee 100644
--- a/cc/util/ostream_output_stream.cc
+++ b/cc/util/ostream_output_stream.cc
@@ -16,6 +16,7 @@
 
 #include "tink/util/ostream_output_stream.h"
 
+#include <algorithm>
 #include <cerrno>
 #include <cstring>
 #include <memory>
diff --git a/cc/util/ostream_output_stream_test.cc b/cc/util/ostream_output_stream_test.cc
index d48a79d..8194e85 100644
--- a/cc/util/ostream_output_stream_test.cc
+++ b/cc/util/ostream_output_stream_test.cc
@@ -19,10 +19,10 @@
 #include <fstream>
 #include <iostream>
 #include <memory>
-#include <vector>
 
 #include "gtest/gtest.h"
 #include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
 #include "absl/strings/string_view.h"
 #include "tink/subtle/random.h"
 #include "tink/util/test_util.h"
@@ -48,8 +48,8 @@
   void* buffer;
   int pos = 0;
   int remaining = contents.length();
-  int available_space;
-  int available_bytes;
+  int available_space = 0;
+  int available_bytes = 0;
   while (remaining > 0) {
     auto next_result = output_stream->Next(&buffer);
     if (!next_result.ok()) return next_result.status();
@@ -65,36 +65,12 @@
   return output_stream->Close();
 }
 
-// Reads the test file specified by 'filename', and returns its contents.
-std::string ReadFile(std::string filename) {
-  std::string full_filename =
-      absl::StrCat(crypto::tink::test::TmpDir(), "/", filename);
-  std::string contents;
-  int buffer_size = 128 * 1024;
-  auto buffer = absl::make_unique<uint8_t[]>(buffer_size);
-  std::ifstream input(full_filename, std::ifstream::binary);
-  while (input.good()) {
-    input.read(reinterpret_cast<char*>(buffer.get()), buffer_size);
-    int read_result = input.gcount();
-    std::clog << "Read " << read_result << " bytes" << std::endl;
-    contents.append(reinterpret_cast<const char*>(buffer.get()), read_result);
-  }
-  if (!input.eof()) {
-    std::clog << "Error reading ostream " << full_filename
-              << " error: " << errno << std::endl;
-    exit(1);
-  }
-  input.close();
-  std::clog << "Read in total " << contents.length() << " bytes" << std::endl;
-  return contents;
-}
-
 class OstreamOutputStreamTest : public ::testing::Test {
 };
 
 TEST_F(OstreamOutputStreamTest, WritingStreams) {
-  std::vector<int> stream_sizes = {0, 10, 100, 1000, 10000, 100000, 1000000};
-  for (auto stream_size : stream_sizes) {
+  for (size_t stream_size : {0, 10, 100, 1000, 10000, 100000, 1000000}) {
+    SCOPED_TRACE(absl::StrCat("stream_size = ", stream_size));
     std::string stream_contents = subtle::Random::GetRandomBytes(stream_size);
     std::string filename = absl::StrCat(stream_size, "_writing_test.bin");
     auto output = GetTestOstream(filename);
@@ -102,17 +78,17 @@
         std::move(output));
     auto status = WriteToStream(output_stream.get(), stream_contents);
     EXPECT_TRUE(status.ok()) << status;
-    std::string ostream_contents = ReadFile(filename);
+    std::string ostream_contents = test::ReadTestFile(filename);
     EXPECT_EQ(stream_size, ostream_contents.size());
     EXPECT_EQ(stream_contents, ostream_contents);
   }
 }
 
 TEST_F(OstreamOutputStreamTest, CustomBufferSizes) {
-  std::vector<int> buffer_sizes = {1, 10, 100, 1000, 10000, 100000, 1000000};
   int stream_size = 1024 * 1024;
   std::string stream_contents = subtle::Random::GetRandomBytes(stream_size);
-  for (auto buffer_size : buffer_sizes) {
+  for (int buffer_size : {1, 10, 100, 1000, 10000, 100000, 1000000}) {
+    SCOPED_TRACE(absl::StrCat("buffer_size = ", buffer_size));
     std::string filename = absl::StrCat(buffer_size, "_buffer_size_test.bin");
     auto output = GetTestOstream(filename);
     auto output_stream = absl::make_unique<util::OstreamOutputStream>(
@@ -124,7 +100,7 @@
     output_stream->BackUp(buffer_size);
     auto status = WriteToStream(output_stream.get(), stream_contents);
     EXPECT_TRUE(status.ok()) << status;
-    std::string ostream_contents = ReadFile(filename);
+    std::string ostream_contents = test::ReadTestFile(filename);
     EXPECT_EQ(stream_size, ostream_contents.size());
     EXPECT_EQ(stream_contents, ostream_contents);
   }
@@ -149,11 +125,11 @@
   std::memcpy(buffer, stream_contents.data(), buffer_size);
 
   // BackUp several times, but in total fewer bytes than returned by Next().
-  std::vector<int> backup_sizes = {0, 1, 5, 0, 10, 100, -42, 400, 20, -100};
   int total_backup_size = 0;
-  for (auto backup_size : backup_sizes) {
+  for (int backup_size : {0, 1, 5, 0, 10, 100, -42, 400, 20, -100}) {
+    SCOPED_TRACE(absl::StrCat("backup_size = ", backup_size));
     output_stream->BackUp(backup_size);
-    total_backup_size += std::max(0, backup_size);
+    total_backup_size += std::max(backup_size, 0);
     EXPECT_EQ(buffer_size - total_backup_size, output_stream->Position());
   }
   EXPECT_LT(total_backup_size, next_result.ValueOrDie());
@@ -163,9 +139,9 @@
   EXPECT_TRUE(next_result.ok()) << next_result.status();
 
   // BackUp() some bytes, again fewer than returned by Next().
-  backup_sizes = {0, 72, -94, 37, 82};
   total_backup_size = 0;
-  for (auto backup_size : backup_sizes) {
+  for (int backup_size : {0, 72, -94, 37, 82}) {
+    SCOPED_TRACE(absl::StrCat("backup_size = ", backup_size));
     output_stream->BackUp(backup_size);
     total_backup_size += std::max(0, backup_size);
     EXPECT_EQ(buffer_size - total_backup_size, output_stream->Position());
@@ -185,12 +161,13 @@
   std::memcpy(buffer, stream_contents.data() + buffer_size, buffer_size);
 
   // BackUp a few times, with total over the returned buffer_size.
-  backup_sizes = {0, 72, -100, buffer_size / 2, 200, -25, buffer_size / 2, 42};
   total_backup_size = 0;
-  for (auto backup_size : backup_sizes) {
+  for (int backup_size :
+           {0, 72, -100, buffer_size / 2, 200, -25, buffer_size / 2, 42}) {
+    SCOPED_TRACE(absl::StrCat("backup_size = ", backup_size));
     output_stream->BackUp(backup_size);
     total_backup_size = std::min(buffer_size,
-                                 total_backup_size + std::max(0, backup_size));
+                                 total_backup_size + std::max(backup_size, 0));
     EXPECT_EQ(prev_position + buffer_size - total_backup_size,
               output_stream->Position());
   }
@@ -208,7 +185,7 @@
   auto status = WriteToStream(
       output_stream.get(), stream_contents.substr(output_stream->Position()));
   EXPECT_TRUE(status.ok()) << status;
-  std::string ostream_contents = ReadFile(filename);
+  std::string ostream_contents = test::ReadTestFile(filename);
   EXPECT_EQ(stream_size, ostream_contents.size());
   EXPECT_EQ(stream_contents, ostream_contents);
 }
diff --git a/cc/util/status.cc b/cc/util/status.cc
index eab3fe3..a962449 100644
--- a/cc/util/status.cc
+++ b/cc/util/status.cc
@@ -17,6 +17,8 @@
 #include <sstream>
 
 #include "tink/util/status.h"
+
+#include "absl/strings/str_cat.h"
 // placeholder_google3_status_header, please ignore
 
 using ::std::ostream;
@@ -29,15 +31,21 @@
 
 
 const Status& GetCancelled() {
-  static const Status status(::crypto::tink::util::error::CANCELLED, "");
-  return status;
+  static const Status* status =
+      new Status(::crypto::tink::util::error::CANCELLED, "");
+  return *status;
 }
 
 const Status& GetUnknown() {
-  static const Status status(::crypto::tink::util::error::UNKNOWN, "");
-  return status;
+  static const Status* status =
+      new Status(::crypto::tink::util::error::UNKNOWN, "");
+  return *status;
 }
 
+const Status& GetOk() {
+  static const Status* status = new Status;
+  return *status;
+}
 
 }  // namespace
 
@@ -62,7 +70,7 @@
 
 const Status& Status::CANCELLED = GetCancelled();
 const Status& Status::UNKNOWN = GetUnknown();
-const Status& Status::OK = Status();
+const Status& Status::OK = GetOk();
 
 std::string Status::ToString() const {
   if (code_ == ::crypto::tink::util::error::OK) {
@@ -111,7 +119,7 @@
   }
   // Avoid using a "default" in the switch, so that the compiler can
   // give us a warning, but still provide a fallback here.
-  return std::to_string(error);
+  return absl::StrCat(error);
 }
 
 extern ostream& operator<<(ostream& os, crypto::tink::util::error::Code code) {
diff --git a/cc/util/status.h b/cc/util/status.h
index c8dc1a4..5e3c68f 100644
--- a/cc/util/status.h
+++ b/cc/util/status.h
@@ -22,6 +22,8 @@
 
 #include <string>
 
+#include "absl/base/attributes.h"
+
 // placeholder_forward_declaration, please ignore
 
 namespace crypto {
@@ -124,6 +126,11 @@
 
 }  // namespace error
 
+// TODO(tholenst) Remove this compile time flag in Tink 1.5. This should not be
+// used, except as a temporary measure.
+#ifndef CPP_TINK_TEMPORARY_STATUS_MUST_NOT_USE_RESULT
+class ABSL_MUST_USE_RESULT Status;
+#endif
 
 // A Status is a combination of an error code and a std::string message (for non-OK
 // error codes).
diff --git a/cc/util/statusor.h b/cc/util/statusor.h
index 5868ba2..15d58ef 100644
--- a/cc/util/statusor.h
+++ b/cc/util/statusor.h
@@ -26,6 +26,11 @@
 namespace tink {
 namespace util {
 
+#ifndef CPP_TINK_TEMPORARY_STATUS_MUST_NOT_USE_RESULT
+template <typename T>
+class ABSL_MUST_USE_RESULT StatusOr;
+#endif
+
 // A StatusOr holds a Status (in the case of an error), or a value T.
 template <typename T>
 class StatusOr {
diff --git a/cc/util/test_keyset_handle.cc b/cc/util/test_keyset_handle.cc
new file mode 100644
index 0000000..464c848
--- /dev/null
+++ b/cc/util/test_keyset_handle.cc
@@ -0,0 +1,43 @@
+// Copyright 2018 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/util/test_keyset_handle.h"
+
+#include "absl/memory/memory.h"
+#include "tink/keyset_handle.h"
+#include "proto/tink.pb.h"
+
+using google::crypto::tink::Keyset;
+
+namespace crypto {
+namespace tink {
+
+// static
+std::unique_ptr<KeysetHandle> TestKeysetHandle::GetKeysetHandle(
+    const Keyset& keyset) {
+  auto unique_keyset = absl::make_unique<Keyset>(keyset);
+  std::unique_ptr<KeysetHandle> handle =
+      absl::WrapUnique(new KeysetHandle(std::move(unique_keyset)));
+  return handle;
+}
+
+// static
+const Keyset& TestKeysetHandle::GetKeyset(const KeysetHandle& keyset_handle) {
+  return keyset_handle.get_keyset();
+}
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/util/test_keyset_handle.h b/cc/util/test_keyset_handle.h
new file mode 100644
index 0000000..dc086da
--- /dev/null
+++ b/cc/util/test_keyset_handle.h
@@ -0,0 +1,42 @@
+// Copyright 2018 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_UTIL_TEST_KEYSET_HANDLE_H_
+#define TINK_UTIL_TEST_KEYSET_HANDLE_H_
+
+#include "tink/keyset_handle.h"
+#include "proto/tink.pb.h"
+
+namespace crypto {
+namespace tink {
+
+// The helpers below are "packed" in a class to allow for an easier
+// addition of them as a "friend class".
+class TestKeysetHandle {
+ public:
+  // Creates a KeysetHandle object for the given 'keyset'.
+  static std::unique_ptr<KeysetHandle> GetKeysetHandle(
+      const google::crypto::tink::Keyset& keyset);
+
+  // Returns a Keyset-proto from the given 'keyset_handle'.
+  static const google::crypto::tink::Keyset& GetKeyset(
+      const KeysetHandle& keyset_handle);
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_UTIL_TEST_KEYSET_HANDLE_H_
diff --git a/cc/util/test_matchers.h b/cc/util/test_matchers.h
index 2d51078..6d0f1e4 100644
--- a/cc/util/test_matchers.h
+++ b/cc/util/test_matchers.h
@@ -14,8 +14,8 @@
 //
 ////////////////////////////////////////////////////////////////////////////////
 
-#ifndef TINK_CC_UTIL_TEST_MATCHERS_H_
-#define TINK_CC_UTIL_TEST_MATCHERS_H_
+#ifndef TINK_UTIL_TEST_MATCHERS_H_
+#define TINK_UTIL_TEST_MATCHERS_H_
 
 #include "gmock/gmock.h"
 #include "gtest/gtest.h"
@@ -25,8 +25,8 @@
 namespace tink {
 namespace test {
 
-// Matches a util::Status value. This is better than
-// EXPECT_TRUE(status.ok())
+// Matches a util::StatusOk() value.
+// This is better than EXPECT_TRUE(status.ok())
 // because the error message is a part of the failure messsage.
 MATCHER(IsOk, "is a Status with an OK value") {
   if (arg.ok()) {
@@ -36,6 +36,7 @@
   return false;
 }
 
+// Matches a Status with the specified 'code' as error_code().
 MATCHER_P(StatusIs, code,
           "is a Status with a " + util::ErrorCodeString(code) + " code") {
   if (arg.CanonicalCode() == code) {
@@ -45,8 +46,15 @@
   return false;
 }
 
+// Matches a Status whose error_code() equals 'code', and whose
+// error_message() matches 'message_macher'.
+MATCHER_P2(StatusIs, code, message_matcher, "") {
+  return (arg.CanonicalCode() == code) &&
+      testing::Matches(message_matcher)(arg.error_message());
+}
+
 }  // namespace test
 }  // namespace tink
 }  // namespace crypto
 
-#endif  // TINK_CC_UTIL_TEST_MATCHERS_H_
+#endif  // TINK_UTIL_TEST_MATCHERS_H_
diff --git a/cc/util/test_util.cc b/cc/util/test_util.cc
index 2babed3..b6d66ea 100644
--- a/cc/util/test_util.cc
+++ b/cc/util/test_util.cc
@@ -16,26 +16,33 @@
 
 #include "tink/util/test_util.h"
 
+#include <fcntl.h>
 #include <stdarg.h>
 #include <stdlib.h>
+#include <unistd.h>
+
 #include <cstdlib>
 
 #include "absl/memory/memory.h"
+#include "tink/aead/aes_ctr_hmac_aead_key_manager.h"
 #include "tink/aead/aes_gcm_key_manager.h"
+#include "tink/aead/xchacha20_poly1305_key_manager.h"
 #include "tink/cleartext_keyset_handle.h"
 #include "tink/keyset_handle.h"
 #include "tink/subtle/common_enums.h"
+#include "tink/subtle/random.h"
 #include "tink/subtle/subtle_util_boringssl.h"
 #include "tink/util/enums.h"
 #include "tink/util/protobuf_helper.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
-#include "proto/aes_gcm.pb.h"
+#include "proto/aes_ctr_hmac_aead.pb.h"
 #include "proto/common.pb.h"
 #include "proto/ecdsa.pb.h"
 #include "proto/ecies_aead_hkdf.pb.h"
 #include "proto/ed25519.pb.h"
 #include "proto/tink.pb.h"
+#include "proto/xchacha20_poly1305.pb.h"
 
 using crypto::tink::util::Enums;
 using crypto::tink::util::Status;
@@ -52,6 +59,82 @@
 namespace tink {
 namespace test {
 
+int GetTestFileDescriptor(
+    absl::string_view filename, int size, std::string* file_contents) {
+  (*file_contents) = subtle::Random::GetRandomBytes(size);
+  return GetTestFileDescriptor(filename, *file_contents);
+}
+
+int GetTestFileDescriptor(
+    absl::string_view filename, absl::string_view file_contents) {
+  std::string full_filename =
+      absl::StrCat(crypto::tink::test::TmpDir(), "/", filename);
+  mode_t mode = S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH;
+  int fd = open(full_filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC, mode);
+  if (fd == -1) {
+    std::clog << "Cannot create file " << full_filename
+              << " error: " << errno << std::endl;
+    exit(1);
+  }
+  auto size = file_contents.size();
+  if (write(fd, file_contents.data(), size) != size) {
+    std::clog << "Failed to write " << size << " bytes to file "
+              << full_filename << " error: " << errno << std::endl;
+
+    exit(1);
+  }
+  close(fd);
+  fd = open(full_filename.c_str(), O_RDONLY);
+  if (fd == -1) {
+    std::clog << "Cannot re-open file " << full_filename
+              << " error: " << errno << std::endl;
+    exit(1);
+  }
+  return fd;
+}
+
+
+int GetTestFileDescriptor(absl::string_view filename) {
+  std::string full_filename =
+      absl::StrCat(crypto::tink::test::TmpDir(), "/", filename);
+  mode_t mode = S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH;
+  int fd = open(full_filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC, mode);
+  if (fd == -1) {
+    std::clog << "Cannot create file " << full_filename
+              << " error: " << errno << std::endl;
+    exit(1);
+  }
+  return fd;
+}
+
+std::string ReadTestFile(std::string filename) {
+  std::string full_filename =
+      absl::StrCat(crypto::tink::test::TmpDir(), "/", filename);
+  int fd = open(full_filename.c_str(), O_RDONLY);
+  if (fd == -1) {
+    std::clog << "Cannot open file " << full_filename
+              << " error: " << errno << std::endl;
+    exit(1);
+  }
+  std::string contents;
+  int buffer_size = 128 * 1024;
+  auto buffer = absl::make_unique<uint8_t[]>(buffer_size);
+  int read_result = read(fd, buffer.get(), buffer_size);
+  while (read_result > 0) {
+    std::clog << "Read " << read_result << " bytes" << std::endl;
+    contents.append(reinterpret_cast<const char*>(buffer.get()), read_result);
+    read_result = read(fd, buffer.get(), buffer_size);
+  }
+  if (read_result < 0) {
+    std::clog << "Error reading file " << full_filename
+              << " error: " << errno << std::endl;
+    exit(1);
+  }
+  close(fd);
+  std::clog << "Read in total " << contents.length() << " bytes" << std::endl;
+  return contents;
+}
+
 util::StatusOr<std::string> HexDecode(absl::string_view hex) {
   if (hex.size() % 2 != 0) {
     return util::Status(util::error::INVALID_ARGUMENT, "Input has odd size.");
@@ -176,11 +259,10 @@
       aes_gcm_key_size);
 }
 
-EciesAeadHkdfPrivateKey GetEciesAesGcmHkdfTestKey(
+EciesAeadHkdfPrivateKey GetEciesAeadHkdfTestKey(
     google::crypto::tink::EllipticCurveType curve_type,
     google::crypto::tink::EcPointFormat ec_point_format,
-    google::crypto::tink::HashType hash_type,
-    uint32_t aes_gcm_key_size) {
+    google::crypto::tink::HashType hash_type) {
   auto test_key = subtle::SubtleUtilBoringSSL::GetNewEcKey(
       Enums::ProtoToSubtle(curve_type)).ValueOrDie();
   EciesAeadHkdfPrivateKey ecies_key;
@@ -195,6 +277,17 @@
   params->mutable_kem_params()->set_curve_type(curve_type);
   params->mutable_kem_params()->set_hkdf_hash_type(hash_type);
 
+  return ecies_key;
+}
+
+EciesAeadHkdfPrivateKey GetEciesAesGcmHkdfTestKey(
+    google::crypto::tink::EllipticCurveType curve_type,
+    google::crypto::tink::EcPointFormat ec_point_format,
+    google::crypto::tink::HashType hash_type, uint32_t aes_gcm_key_size) {
+  auto ecies_key =
+      GetEciesAeadHkdfTestKey(curve_type, ec_point_format, hash_type);
+  auto params = ecies_key.mutable_public_key()->mutable_params();
+
   AesGcmKeyFormat key_format;
   key_format.set_key_size(aes_gcm_key_size);
   auto aead_dem = params->mutable_dem_params()->mutable_aead_dem();
@@ -205,6 +298,56 @@
   return ecies_key;
 }
 
+EciesAeadHkdfPrivateKey GetEciesAesCtrHmacHkdfTestKey(
+    google::crypto::tink::EllipticCurveType curve_type,
+    google::crypto::tink::EcPointFormat ec_point_format,
+    google::crypto::tink::HashType hash_type, uint32_t aes_ctr_key_size,
+    uint32_t aes_ctr_iv_size, google::crypto::tink::HashType hmac_hash_type,
+    uint32_t hmac_tag_size, uint32_t hmac_key_size) {
+  auto ecies_key =
+      GetEciesAeadHkdfTestKey(curve_type, ec_point_format, hash_type);
+
+  google::crypto::tink::AesCtrHmacAeadKeyFormat key_format;
+  auto aes_ctr_key_format = key_format.mutable_aes_ctr_key_format();
+  auto aes_ctr_params = aes_ctr_key_format->mutable_params();
+  aes_ctr_params->set_iv_size(aes_ctr_iv_size);
+  aes_ctr_key_format->set_key_size(aes_ctr_key_size);
+
+  auto hmac_key_format = key_format.mutable_hmac_key_format();
+  auto hmac_params = hmac_key_format->mutable_params();
+  hmac_params->set_hash(hmac_hash_type);
+  hmac_params->set_tag_size(hmac_tag_size);
+  hmac_key_format->set_key_size(hmac_key_size);
+
+  auto params = ecies_key.mutable_public_key()->mutable_params();
+  auto aead_dem = params->mutable_dem_params()->mutable_aead_dem();
+
+  std::unique_ptr<AesCtrHmacAeadKeyManager> key_manager(
+      new AesCtrHmacAeadKeyManager());
+  std::string dem_key_type = key_manager->get_key_type();
+  aead_dem->set_type_url(dem_key_type);
+  aead_dem->set_value(key_format.SerializeAsString());
+  return ecies_key;
+}
+
+EciesAeadHkdfPrivateKey GetEciesXChaCha20Poly1305HkdfTestKey(
+    google::crypto::tink::EllipticCurveType curve_type,
+    google::crypto::tink::EcPointFormat ec_point_format,
+    google::crypto::tink::HashType hash_type) {
+  auto ecies_key =
+      GetEciesAeadHkdfTestKey(curve_type, ec_point_format, hash_type);
+  auto params = ecies_key.mutable_public_key()->mutable_params();
+
+  google::crypto::tink::XChaCha20Poly1305KeyFormat key_format;
+  auto aead_dem = params->mutable_dem_params()->mutable_aead_dem();
+  std::unique_ptr<XChaCha20Poly1305KeyManager> key_manager(
+      new XChaCha20Poly1305KeyManager());
+  std::string dem_key_type = key_manager->get_key_type();
+  aead_dem->set_type_url(dem_key_type);
+  aead_dem->set_value(key_format.SerializeAsString());
+  return ecies_key;
+}
+
 EcdsaPrivateKey GetEcdsaTestPrivateKey(
     subtle::EllipticCurveType curve_type, subtle::HashType hash_type,
     subtle::EcdsaSignatureEncoding encoding) {
diff --git a/cc/util/test_util.h b/cc/util/test_util.h
index 165f89d..5fae3b9 100644
--- a/cc/util/test_util.h
+++ b/cc/util/test_util.h
@@ -17,23 +17,30 @@
 #ifndef TINK_UTIL_TEST_UTIL_H_
 #define TINK_UTIL_TEST_UTIL_H_
 
+#include <limits>
 #include <string>
 
+#include "absl/base/thread_annotations.h"
 #include "absl/strings/match.h"
 #include "absl/strings/str_cat.h"
 #include "absl/strings/string_view.h"
+#include "absl/synchronization/mutex.h"
 #include "tink/aead.h"
 #include "tink/deterministic_aead.h"
 #include "tink/hybrid_decrypt.h"
 #include "tink/hybrid_encrypt.h"
 #include "tink/input_stream.h"
 #include "tink/keyset_handle.h"
+#include "tink/kms_client.h"
 #include "tink/mac.h"
 #include "tink/output_stream.h"
+#include "tink/random_access_stream.h"
 #include "tink/public_key_sign.h"
 #include "tink/public_key_verify.h"
 #include "tink/streaming_aead.h"
 #include "tink/subtle/common_enums.h"
+#include "tink/util/buffer.h"
+#include "tink/util/constants.h"
 #include "tink/util/protobuf_helper.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
@@ -50,11 +57,27 @@
 // Various utilities for testing.
 ///////////////////////////////////////////////////////////////////////////////
 
-// Converts a hexadecimal std::string into a std::string of bytes.
+// Creates a new test file with the specified 'filename', writes 'size' random
+// bytes to the file, and returns a file descriptor for reading from the file.
+// A copy of the bytes written to the file is returned in 'file_contents'.
+int GetTestFileDescriptor(
+    absl::string_view filename, int size, std::string* file_contents);
+
+// Creates a new test file with the specified 'filename', with contents from
+// 'file_contents', and returns a file descriptor for reading from the file.
+int GetTestFileDescriptor(
+    absl::string_view filename, absl::string_view file_contents);
+
+// Creates a new test file with the specified 'filename', ready for writing.
+int GetTestFileDescriptor(absl::string_view filename);
+
+// Reads the test file specified by 'filename', and returns its contents.
+std::string ReadTestFile(std::string filename);
+
+  // Converts a hexadecimal std::string into a std::string of bytes.
 // Returns a status if the size of the input is odd or if the input contains
 // characters that are not hexadecimal.
-crypto::tink::util::StatusOr<std::string> HexDecode(
-    absl::string_view hex);
+crypto::tink::util::StatusOr<std::string> HexDecode(absl::string_view hex);
 
 // Converts a hexadecimal std::string into a std::string of bytes.
 // Dies if the input is not a valid hexadecimal std::string.
@@ -68,60 +91,64 @@
 
 // Adds the given 'keyData' with specified status, key_id, and
 // output_prefix_type to the keyset.
-void AddKeyData(
-    const google::crypto::tink::KeyData& key_data,
-    uint32_t key_id,
-    google::crypto::tink::OutputPrefixType output_prefix,
-    google::crypto::tink::KeyStatusType key_status,
-    google::crypto::tink::Keyset* keyset);
-
+void AddKeyData(const google::crypto::tink::KeyData& key_data, uint32_t key_id,
+                google::crypto::tink::OutputPrefixType output_prefix,
+                google::crypto::tink::KeyStatusType key_status,
+                google::crypto::tink::Keyset* keyset);
 
 // Adds the given 'key' with specified parameters and output_prefix_type=TINK
 // to the specified 'keyset'.
-void AddTinkKey(
-    const std::string& key_type,
-    uint32_t key_id,
-    const portable_proto::MessageLite& key,
-    google::crypto::tink::KeyStatusType key_status,
-    google::crypto::tink::KeyData::KeyMaterialType material_type,
-    google::crypto::tink::Keyset* keyset);
+void AddTinkKey(const std::string& key_type, uint32_t key_id,
+                const portable_proto::MessageLite& key,
+                google::crypto::tink::KeyStatusType key_status,
+                google::crypto::tink::KeyData::KeyMaterialType material_type,
+                google::crypto::tink::Keyset* keyset);
 
 // Adds the given 'key' with specified parameters and output_prefix_type=LEGACY
 // to the specified 'keyset'.
-void AddLegacyKey(
-    const std::string& key_type,
-    uint32_t key_id,
-    const portable_proto::MessageLite& key,
-    google::crypto::tink::KeyStatusType key_status,
-    google::crypto::tink::KeyData::KeyMaterialType material_type,
-    google::crypto::tink::Keyset* keyset);
+void AddLegacyKey(const std::string& key_type, uint32_t key_id,
+                  const portable_proto::MessageLite& key,
+                  google::crypto::tink::KeyStatusType key_status,
+                  google::crypto::tink::KeyData::KeyMaterialType material_type,
+                  google::crypto::tink::Keyset* keyset);
 
 // Adds the given 'key' with specified parameters and output_prefix_type=RAW
 // to the specified 'keyset'.
-void AddRawKey(
-    const std::string& key_type,
-    uint32_t key_id,
-    const portable_proto::MessageLite& key,
-    google::crypto::tink::KeyStatusType key_status,
-    google::crypto::tink::KeyData::KeyMaterialType material_type,
-    google::crypto::tink::Keyset* keyset);
-
+void AddRawKey(const std::string& key_type, uint32_t key_id,
+               const portable_proto::MessageLite& key,
+               google::crypto::tink::KeyStatusType key_status,
+               google::crypto::tink::KeyData::KeyMaterialType material_type,
+               google::crypto::tink::Keyset* keyset);
 
 // Generates a fresh test key for ECIES-AEAD-HKDF for the given curve,
 // using AesGcm with the specified key size as AEAD, and HKDF with 'hash_type'.
 google::crypto::tink::EciesAeadHkdfPrivateKey GetEciesAesGcmHkdfTestKey(
-    subtle::EllipticCurveType curve_type,
-    subtle::EcPointFormat ec_point_format,
-    subtle::HashType hash_type,
-    uint32_t aes_gcm_key_size);
+    subtle::EllipticCurveType curve_type, subtle::EcPointFormat ec_point_format,
+    subtle::HashType hash_type, uint32_t aes_gcm_key_size);
 
 // Generates a fresh test key for ECIES-AEAD-HKDF for the given curve,
 // using AesGcm with the specified key size as AEAD, and HKDF with 'hash_type'.
 google::crypto::tink::EciesAeadHkdfPrivateKey GetEciesAesGcmHkdfTestKey(
     google::crypto::tink::EllipticCurveType curve_type,
     google::crypto::tink::EcPointFormat ec_point_format,
-    google::crypto::tink::HashType hash_type,
-    uint32_t aes_gcm_key_size);
+    google::crypto::tink::HashType hash_type, uint32_t aes_gcm_key_size);
+
+// Generates a fresh test key for ECIES-AEAD-HKDF for the given curve,
+// using XChaCha20Poly1305 as AEAD, and HKDF with 'hash_type'.
+google::crypto::tink::EciesAeadHkdfPrivateKey
+GetEciesXChaCha20Poly1305HkdfTestKey(
+    google::crypto::tink::EllipticCurveType curve_type,
+    google::crypto::tink::EcPointFormat ec_point_format,
+    google::crypto::tink::HashType hash_type);
+
+// Generates a fresh test key for ECIES-AEAD-HKDF for the given curve,
+// using AesCtrHmac with the specified AEAD params, and HKDF with 'hash_type'.
+google::crypto::tink::EciesAeadHkdfPrivateKey GetEciesAesCtrHmacHkdfTestKey(
+    google::crypto::tink::EllipticCurveType curve_type,
+    google::crypto::tink::EcPointFormat ec_point_format,
+    google::crypto::tink::HashType hash_type, uint32_t aes_ctr_key_size,
+    uint32_t aes_ctr_iv_size, google::crypto::tink::HashType hmac_hash_type,
+    uint32_t hmac_tag_size, uint32_t hmac_key_size);
 
 // Generates a fresh test key for EC DSA for the given 'curve_type', 'hash_type'
 // and 'encoding'.
@@ -139,6 +166,18 @@
 // Generates a fresh test key for ED25519.
 google::crypto::tink::Ed25519PrivateKey GetEd25519TestPrivateKey();
 
+// Embeds the given Proto into a KeyData proto.
+template <typename Proto>
+google::crypto::tink::KeyData AsKeyData(
+    const Proto& proto,
+    google::crypto::tink::KeyData::KeyMaterialType key_material_type) {
+  google::crypto::tink::KeyData result;
+  result.set_value(proto.SerializeAsString());
+  result.set_type_url(absl::StrCat(kTypeGoogleapisCom, proto.GetTypeName()));
+  result.set_key_material_type(key_material_type);
+  return result;
+}
+
 // A dummy implementation of Aead-interface.
 // An instance of DummyAead can be identified by a name specified
 // as a parameter of the constructor.
@@ -198,60 +237,232 @@
   DummyAead aead_;
 };
 
-// A dummy implementation of StreamingAead-interface.
-// An instance of DummyStreamingAead can be identified by a name specified
-// as a parameter of the constructor.
+// A dummy implementation of StreamingAead-interface.  An instance of
+// DummyStreamingAead can be identified by a name specified as a parameter of
+// the constructor.  This name concatenated with 'associated_data' for a
+// specific stream yields a header of an encrypted stream produced/consumed
+// by DummyStreamingAead.
 class DummyStreamingAead : public StreamingAead {
  public:
   explicit DummyStreamingAead(absl::string_view streaming_aead_name)
       : streaming_aead_name_(streaming_aead_name) {}
 
-  // Writes to 'ciphertext_destination' the name of this instance
-  // followed by 'associated_data', and returns 'ciphertext_destination'
-  // as the encrypting stream.
   crypto::tink::util::StatusOr<std::unique_ptr<crypto::tink::OutputStream>>
   NewEncryptingStream(
       std::unique_ptr<crypto::tink::OutputStream> ciphertext_destination,
       absl::string_view associated_data) override {
-    auto header = absl::StrCat(streaming_aead_name_, associated_data);
-    void* buffer;
-    auto next_result = ciphertext_destination->Next(&buffer);
-    if (!next_result.status().ok()) return next_result.status();
-    if (next_result.ValueOrDie() < header.size()) {
-      return crypto::tink::util::Status(
-          crypto::tink::util::error::INTERNAL, "Buffer too small");
-    }
-    memcpy(buffer, header.data(), header.size());
-    ciphertext_destination->BackUp(next_result.ValueOrDie() - header.size());
-    return std::move(ciphertext_destination);
+    return {absl::make_unique<DummyEncryptingStream>(
+        std::move(ciphertext_destination),
+        absl::StrCat(streaming_aead_name_, associated_data))};
   }
 
-  // Reads a prefix from 'ciphertext_source' and verifies that it starts
-  // with the name of this instance, followed by 'associated_data'.
-  // Returns 'ciphertext_source' as the decrypting stream.
   crypto::tink::util::StatusOr<std::unique_ptr<crypto::tink::InputStream>>
   NewDecryptingStream(
       std::unique_ptr<crypto::tink::InputStream> ciphertext_source,
       absl::string_view associated_data) override {
-    auto header = absl::StrCat(streaming_aead_name_, associated_data);
-    const void* buffer;
-    auto next_result = ciphertext_source->Next(&buffer);
-    if (!next_result.status().ok()) return next_result.status();
-    if (next_result.ValueOrDie() < header.size()) {
-      return crypto::tink::util::Status(
-          crypto::tink::util::error::INTERNAL, "Buffer too small");
-    }
-    if (!memcmp(buffer, header.data(), header.size())) {
-      return crypto::tink::util::Status(
-          crypto::tink::util::error::INVALID_ARGUMENT, "Corrupted header");
-    }
-    ciphertext_source->BackUp(next_result.ValueOrDie() - header.size());
-    return std::move(ciphertext_source);
+    return {absl::make_unique<DummyDecryptingStream>(
+        std::move(ciphertext_source),
+        absl::StrCat(streaming_aead_name_, associated_data))};
   }
 
+  crypto::tink::util::StatusOr<
+      std::unique_ptr<crypto::tink::RandomAccessStream>>
+  NewDecryptingRandomAccessStream(
+      std::unique_ptr<crypto::tink::RandomAccessStream> ciphertext_source,
+      absl::string_view associated_data) override {
+    return {absl::make_unique<DummyDecryptingRandomAccessStream>(
+        std::move(ciphertext_source),
+        absl::StrCat(streaming_aead_name_, associated_data))};
+  }
+
+  // Upon first call to Next() writes to 'ct_dest' the specifed 'header',
+  // and subsequently forwards all methods calls to the corresponding
+  // methods of 'cd_dest'.
+  class DummyEncryptingStream : public crypto::tink::OutputStream {
+   public:
+    DummyEncryptingStream(std::unique_ptr<crypto::tink::OutputStream> ct_dest,
+                          absl::string_view header)
+        : ct_dest_(std::move(ct_dest)), header_(header),
+          after_init_(false), status_(util::OkStatus()) {}
+
+    crypto::tink::util::StatusOr<int> Next(void** data) override {
+      if (!after_init_) {  // Try to initialize.
+        after_init_ = true;
+        auto next_result = ct_dest_->Next(data);
+        if (!next_result.ok()) {
+          status_ = next_result.status();
+          return status_;
+        }
+        if (next_result.ValueOrDie() < header_.size()) {
+          status_ = util::Status(util::error::INTERNAL, "Buffer too small");
+        } else {
+          memcpy(*data, header_.data(), static_cast<int>(header_.size()));
+          ct_dest_->BackUp(next_result.ValueOrDie() - header_.size());
+        }
+      }
+      if (!status_.ok()) return status_;
+      return ct_dest_->Next(data);
+    }
+
+    void BackUp(int count) override {
+      if (after_init_ && status_.ok()) {
+        ct_dest_->BackUp(count);
+      }
+    }
+
+    int64_t Position() const override {
+      if (after_init_ && status_.ok()) {
+        return ct_dest_->Position() - header_.size();
+      } else {
+        return 0;
+      }
+    }
+    util::Status Close() override {
+      if (!after_init_) {  // Call Next() to write the header to ct_dest_.
+        void *buf;
+        auto next_result = Next(&buf);
+        if (next_result.ok()) {
+          BackUp(next_result.ValueOrDie());
+        } else {
+          status_ = next_result.status();
+          return status_;
+        }
+      }
+      return ct_dest_->Close();
+    }
+
+   private:
+    std::unique_ptr<crypto::tink::OutputStream> ct_dest_;
+    std::string header_;
+    bool after_init_;
+    util::Status status_;
+  };  // class DummyEncryptingStream
+
+  // Upon first call to Next() tries to read from 'ct_source' a header
+  // that is expected to be equal to 'expected_header'.  If this
+  // header matching succeeds, all subsequent method calls are forwarded
+  // to the corresponding methods of 'cd_source'.
+  class DummyDecryptingStream : public crypto::tink::InputStream {
+   public:
+    DummyDecryptingStream(std::unique_ptr<crypto::tink::InputStream> ct_source,
+                          absl::string_view expected_header)
+        : ct_source_(std::move(ct_source)), exp_header_(expected_header),
+          after_init_(false), status_(util::OkStatus()) {}
+
+    crypto::tink::util::StatusOr<int> Next(const void** data) override {
+      if (!after_init_) {  // Try to initialize.
+        after_init_ = true;
+        auto next_result = ct_source_->Next(data);
+        if (!next_result.ok()) {
+          status_ = next_result.status();
+          if (status_.error_code() == util::error::OUT_OF_RANGE) {
+            status_ = util::Status(
+                util::error::INVALID_ARGUMENT, "Could not read header");
+          }
+          return status_;
+        }
+        if (next_result.ValueOrDie() < exp_header_.size()) {
+          status_ = util::Status(util::error::INTERNAL, "Buffer too small");
+        } else if (memcmp((*data), exp_header_.data(),
+                          static_cast<int>(exp_header_.size()))) {
+          status_ = util::Status(
+              util::error::INVALID_ARGUMENT, "Corrupted header");
+        }
+        if (status_.ok()) {
+          ct_source_->BackUp(next_result.ValueOrDie() - exp_header_.size());
+        }
+      }
+      if (!status_.ok()) return status_;
+      return ct_source_->Next(data);
+    }
+
+    void BackUp(int count) override {
+      if (after_init_ && status_.ok()) {
+        ct_source_->BackUp(count);
+      }
+    }
+
+    int64_t Position() const override {
+      if (after_init_ && status_.ok()) {
+        return ct_source_->Position() - exp_header_.size();
+      } else {
+        return 0;
+      }
+    }
+
+   private:
+    std::unique_ptr<crypto::tink::InputStream> ct_source_;
+    std::string exp_header_;
+    bool after_init_;
+    util::Status status_;
+  };  // class DummyDecryptingStream
+
+  // Upon first call to PRead() tries to read from 'ct_source' a header
+  // that is expected to be equal to 'expected_header'.  If this
+  // header matching succeeds, all subsequent method calls are forwarded
+  // to the corresponding methods of 'cd_source'.
+  class DummyDecryptingRandomAccessStream :
+      public crypto::tink::RandomAccessStream {
+   public:
+    DummyDecryptingRandomAccessStream(
+        std::unique_ptr<crypto::tink::RandomAccessStream> ct_source,
+        absl::string_view expected_header)
+        : ct_source_(std::move(ct_source)), exp_header_(expected_header),
+          status_(util::Status(util::error::UNAVAILABLE, "not initialized")) {}
+
+    crypto::tink::util::Status PRead(
+        int64_t position, int count,
+        crypto::tink::util::Buffer* dest_buffer) override {
+      {  // Initialize, if not initialized yet.
+        absl::MutexLock lock(&status_mutex_);
+        if (status_.error_code() == util::error::UNAVAILABLE) Initialize();
+        if (!status_.ok()) return status_;
+      }
+      auto status = dest_buffer->set_size(0);
+      if (!status.ok()) return status;
+      return ct_source_->PRead(
+          position + exp_header_.size(), count, dest_buffer);
+    }
+
+    util::StatusOr<int64_t> size() override {
+      {  // Initialize, if not initialized yet.
+        absl::MutexLock lock(&status_mutex_);
+        if (status_.error_code() == util::error::UNAVAILABLE) Initialize();
+        if (!status_.ok()) return status_;
+      }
+      auto ct_size_result = ct_source_->size();
+      if (!ct_size_result.ok()) return ct_size_result.status();
+      auto pt_size = ct_size_result.ValueOrDie() - exp_header_.size();
+      if (pt_size >= 0) return pt_size;
+      return util::Status(util::error::UNAVAILABLE, "size not available");
+    }
+
+   private:
+    void Initialize() ABSL_EXCLUSIVE_LOCKS_REQUIRED(status_mutex_) {
+      auto buf = std::move(
+          util::Buffer::New(exp_header_.size()).ValueOrDie());
+      status_ = ct_source_->PRead(0, exp_header_.size(), buf.get());
+      if (!status_.ok() &&
+          status_.error_code() != util::error::OUT_OF_RANGE) return;
+      if (buf->size() < exp_header_.size()) {
+        status_ = util::Status(
+            util::error::INVALID_ARGUMENT, "Could not read header");
+      } else if (memcmp(buf->get_mem_block(), exp_header_.data(),
+                        static_cast<int>(exp_header_.size()))) {
+        status_ = util::Status(
+            util::error::INVALID_ARGUMENT, "Corrupted header");
+      }
+    }
+
+    std::unique_ptr<crypto::tink::RandomAccessStream> ct_source_;
+    std::string exp_header_;
+    mutable absl::Mutex status_mutex_;
+    util::Status status_ ABSL_GUARDED_BY(status_mutex_);
+  };  // class DummyDecryptingRandomAccessStream
+
  private:
   std::string streaming_aead_name_;
-};
+};  // class DummyStreamingAead
 
 // A dummy implementation of HybridEncrypt-interface.
 // An instance of DummyHybridEncrypt can be identified by a name specified
@@ -322,8 +533,8 @@
 
   // Verifies a dummy signature, should be a concatenation of the name
   // of this DummyPublicKeyVerify with the provided 'data'.
-  crypto::tink::util::Status Verify(
-      absl::string_view signature, absl::string_view data) const override {
+  crypto::tink::util::Status Verify(absl::string_view signature,
+                                    absl::string_view data) const override {
     return dummy_aead_.Decrypt(signature, data).status();
   }
 
@@ -346,15 +557,67 @@
     return dummy_aead_.Encrypt("", data);
   }
 
-  crypto::tink::util::Status VerifyMac(
-      absl::string_view mac,
-      absl::string_view data) const override {
+  crypto::tink::util::Status VerifyMac(absl::string_view mac,
+                                       absl::string_view data) const override {
     return dummy_aead_.Decrypt(mac, data).status();
   }
+
  private:
   DummyAead dummy_aead_;
 };
 
+// A dummy implementation of KeysetWriter-interface.
+class DummyKeysetWriter : public KeysetWriter {
+ public:
+  static crypto::tink::util::StatusOr<std::unique_ptr<DummyKeysetWriter>> New(
+      std::unique_ptr<std::ostream> destination_stream) {
+    std::unique_ptr<DummyKeysetWriter> writer(
+        new DummyKeysetWriter(std::move(destination_stream)));
+    return std::move(writer);
+  }
+
+  crypto::tink::util::Status Write(
+      const google::crypto::tink::Keyset& keyset) override {
+    return crypto::tink::util::Status::OK;
+  }
+
+  crypto::tink::util::Status Write(
+      const google::crypto::tink::EncryptedKeyset& encrypted_keyset) override {
+    return crypto::tink::util::Status::OK;
+  }
+
+ private:
+  explicit DummyKeysetWriter(std::unique_ptr<std::ostream> destination_stream)
+      : destination_stream_(std::move(destination_stream)) {}
+
+  std::unique_ptr<std::ostream> destination_stream_;
+};
+
+// A dummy implementation of KmsClient-interface.
+class DummyKmsClient : public KmsClient {
+ public:
+  DummyKmsClient(absl::string_view uri_prefix, absl::string_view key_uri)
+      : uri_prefix_(uri_prefix), key_uri_(key_uri) {}
+
+  bool DoesSupport(absl::string_view key_uri) const override {
+    if (key_uri.empty()) return false;
+    if (key_uri_.empty()) return StartsWith(key_uri, uri_prefix_);
+    return key_uri == key_uri_;
+  }
+
+  crypto::tink::util::StatusOr<std::unique_ptr<Aead>> GetAead(
+      absl::string_view key_uri) const override {
+    if (!DoesSupport(key_uri)) return crypto::tink::util::Status(
+            util::error::INVALID_ARGUMENT, "key_uri not supported");
+    return {absl::make_unique<DummyAead>(key_uri)};
+  }
+
+  ~DummyKmsClient() override {}
+
+ private:
+  std::string uri_prefix_;
+  std::string key_uri_;
+};
 
 }  // namespace test
 }  // namespace tink
diff --git a/cc/util/test_util_test.cc b/cc/util/test_util_test.cc
new file mode 100644
index 0000000..dc8ad5b
--- /dev/null
+++ b/cc/util/test_util_test.cc
@@ -0,0 +1,49 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+#include "tink/util/test_util.h"
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "tink/subtle/random.h"
+#include "proto/aes_gcm.pb.h"
+#include "proto/tink.pb.h"
+
+namespace crypto {
+namespace tink {
+namespace test {
+namespace {
+
+using ::google::crypto::tink::AesGcmKey;
+using ::google::crypto::tink::KeyData;
+using ::testing::Eq;
+
+TEST(AsKeyDataTest, Basic) {
+  AesGcmKey key;
+  key.set_key_value(crypto::tink::subtle::Random::GetRandomBytes(11));
+
+  KeyData key_data = AsKeyData(key, KeyData::SYMMETRIC);
+
+  EXPECT_THAT(key_data.type_url(),
+              Eq("type.googleapis.com/google.crypto.tink.AesGcmKey"));
+  EXPECT_THAT(key_data.key_material_type(), Eq(KeyData::SYMMETRIC));
+  AesGcmKey deserialized_key;
+  EXPECT_TRUE(deserialized_key.ParseFromString(key_data.value()));
+  EXPECT_THAT(deserialized_key.key_value(), Eq(key.key_value()));
+}
+
+}  // namespace
+
+}  // namespace test
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/util/validation.cc b/cc/util/validation.cc
index 96a9bef..19040a8 100644
--- a/cc/util/validation.cc
+++ b/cc/util/validation.cc
@@ -20,12 +20,13 @@
 #include "tink/util/status.h"
 #include "proto/tink.pb.h"
 
+using google::crypto::tink::KeyData;
+using google::crypto::tink::Keyset;
+using google::crypto::tink::KeyStatusType;
 
 namespace crypto {
 namespace tink {
 
-// TODO(przydatek): add more validation checks
-
 util::Status ValidateAesKeySize(uint32_t key_size) {
   if (key_size != 16 && key_size != 32) {
     return ToStatusF(util::error::INVALID_ARGUMENT,
@@ -35,11 +36,77 @@
   return util::Status::OK;
 }
 
-util::Status ValidateKeyset(const google::crypto::tink::Keyset& keyset) {
+util::Status ValidateKey(const Keyset::Key& key) {
+  if (!key.has_key_data()) {
+    return ToStatusF(util::error::INVALID_ARGUMENT, "key %d, has no key data",
+                     key.key_id());
+  }
+
+  if (key.output_prefix_type() ==
+      google::crypto::tink::OutputPrefixType::UNKNOWN_PREFIX) {
+    return ToStatusF(util::error::INVALID_ARGUMENT, "key %d has unknown prefix",
+                     key.key_id());
+  }
+
+  if (key.status() == google::crypto::tink::KeyStatusType::UNKNOWN_STATUS) {
+    return ToStatusF(util::error::INVALID_ARGUMENT, "key %d has unknown status",
+                     key.key_id());
+  }
+  return util::Status::OK;
+}
+
+util::Status ValidateKeyset(const Keyset& keyset) {
   if (keyset.key_size() < 1) {
     return ToStatusF(util::error::INVALID_ARGUMENT,
                      "A valid keyset must contain at least one key.");
   }
+
+  uint32_t primary_key_id = keyset.primary_key_id();
+  bool has_primary_key = false;
+  bool contains_only_public_key_material = true;
+  int enabled_keys = 0;
+
+  for (int i = 0; i < keyset.key_size(); i++) {
+    const Keyset::Key& key = keyset.key(i);
+
+
+    if (key.status() != KeyStatusType::ENABLED) {
+      continue;
+    }
+    enabled_keys += 1;
+
+    auto validation_result = ValidateKey(key);
+    if (!validation_result.ok()) {
+      return validation_result;
+    }
+
+    if (key.status() == KeyStatusType::ENABLED &&
+        key.key_id() == primary_key_id) {
+      if (has_primary_key) {
+        return ToStatusF(util::error::INVALID_ARGUMENT,
+                         "keyset contains multiple primary keys");
+      }
+      has_primary_key = true;
+    }
+
+    if (key.key_data().key_material_type() != KeyData::ASYMMETRIC_PUBLIC) {
+      contains_only_public_key_material = false;
+    }
+  }
+
+  if (enabled_keys == 0) {
+    return ToStatusF(util::error::INVALID_ARGUMENT,
+                     "keyset must contain at least one ENABLED key");
+  }
+
+  // A public key can be used for verification without being set as the primary
+  // key. Therefore, it is okay to have a keyset that contains public but
+  // doesn't have a primary key set.
+  if (!has_primary_key && !contains_only_public_key_material) {
+    return ToStatusF(util::error::INVALID_ARGUMENT,
+                     "keyset doesn't contain a valid primary key");
+  }
+
   return util::Status::OK;
 }
 
@@ -53,6 +120,5 @@
   return util::Status::OK;
 }
 
-
 }  // namespace tink
 }  // namespace crypto
diff --git a/cc/util/validation.h b/cc/util/validation.h
index a6e3605..4580723 100644
--- a/cc/util/validation.h
+++ b/cc/util/validation.h
@@ -27,6 +27,9 @@
 
 crypto::tink::util::Status ValidateAesKeySize(uint32_t key_size);
 
+crypto::tink::util::Status ValidateKey(
+    const google::crypto::tink::Keyset::Key& key);
+
 crypto::tink::util::Status ValidateKeyset(
     const google::crypto::tink::Keyset& keyset);
 
diff --git a/cc/util/validation_test.cc b/cc/util/validation_test.cc
new file mode 100644
index 0000000..98cc465
--- /dev/null
+++ b/cc/util/validation_test.cc
@@ -0,0 +1,124 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/util/validation.h"
+
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+#include "tink/util/test_matchers.h"
+
+namespace crypto {
+namespace tink {
+
+namespace {
+
+using crypto::tink::test::IsOk;
+using crypto::tink::test::StatusIs;
+
+TEST(ValidateKey, ValidKey) {
+  google::crypto::tink::Keyset::Key key;
+  key.set_key_id(100);
+  key.mutable_key_data()->set_value("some value");
+  key.set_output_prefix_type(google::crypto::tink::OutputPrefixType::TINK);
+  key.set_status(google::crypto::tink::KeyStatusType::ENABLED);
+  EXPECT_THAT(crypto::tink::ValidateKey(key), IsOk());
+}
+
+TEST(ValidateKey, MissingOutputPrefixType) {
+  google::crypto::tink::Keyset::Key key;
+  key.set_key_id(100);
+  key.mutable_key_data()->set_value("some value");
+  key.set_status(google::crypto::tink::KeyStatusType::ENABLED);
+  EXPECT_THAT(crypto::tink::ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(ValidateKey, MissingKeyData) {
+  google::crypto::tink::Keyset::Key key;
+  key.set_key_id(100);
+  key.set_output_prefix_type(google::crypto::tink::OutputPrefixType::TINK);
+  key.set_status(google::crypto::tink::KeyStatusType::ENABLED);
+  EXPECT_THAT(crypto::tink::ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(ValidateKey, MissingStatus) {
+  google::crypto::tink::Keyset::Key key;
+  key.set_key_id(100);
+  key.mutable_key_data()->set_value("some value");
+  key.set_output_prefix_type(google::crypto::tink::OutputPrefixType::TINK);
+  EXPECT_THAT(crypto::tink::ValidateKey(key),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+TEST(ValidateKeyset, Valid) {
+  google::crypto::tink::Keyset keyset;
+  google::crypto::tink::Keyset::Key* key = keyset.add_key();
+  key->set_key_id(100);
+  key->mutable_key_data()->set_value("some value");
+  key->set_output_prefix_type(google::crypto::tink::OutputPrefixType::TINK);
+  key->set_status(google::crypto::tink::KeyStatusType::ENABLED);
+  keyset.set_primary_key_id(100);
+  EXPECT_THAT(crypto::tink::ValidateKeyset(keyset), IsOk());
+}
+
+TEST(ValidateKeyset, ValidMultipleKeys) {
+  google::crypto::tink::Keyset keyset;
+  google::crypto::tink::Keyset::Key* key = keyset.add_key();
+  key->set_key_id(32);
+  key->mutable_key_data()->set_value("some value");
+  key->set_output_prefix_type(google::crypto::tink::OutputPrefixType::TINK);
+  key->set_status(google::crypto::tink::KeyStatusType::ENABLED);
+  key = keyset.add_key();
+  key->set_key_id(100);
+  key->mutable_key_data()->set_value("some other value");
+  key->set_output_prefix_type(google::crypto::tink::OutputPrefixType::TINK);
+  key->set_status(google::crypto::tink::KeyStatusType::ENABLED);
+  key = keyset.add_key();
+  key->set_key_id(18);
+  key->mutable_key_data()->set_value("some third value");
+  key->set_output_prefix_type(google::crypto::tink::OutputPrefixType::TINK);
+  key->set_status(google::crypto::tink::KeyStatusType::ENABLED);
+  keyset.set_primary_key_id(100);
+  EXPECT_THAT(crypto::tink::ValidateKeyset(keyset), IsOk());
+}
+
+TEST(ValidateKeyset, PrimaryIdNonExistent) {
+  google::crypto::tink::Keyset keyset;
+  google::crypto::tink::Keyset::Key* key = keyset.add_key();
+  key->set_key_id(100);
+  key->mutable_key_data()->set_value("some value");
+  key->set_output_prefix_type(google::crypto::tink::OutputPrefixType::TINK);
+  key->set_status(google::crypto::tink::KeyStatusType::ENABLED);
+  keyset.set_primary_key_id(99);
+  EXPECT_THAT(crypto::tink::ValidateKeyset(keyset),
+              StatusIs(util::error::INVALID_ARGUMENT));
+}
+
+
+TEST(ValidateKeyset, ValidHighId) {
+  google::crypto::tink::Keyset keyset;
+  google::crypto::tink::Keyset::Key* key = keyset.add_key();
+  key->set_key_id(std::numeric_limits<uint32_t>::max());
+  key->mutable_key_data()->set_value("some value");
+  key->set_output_prefix_type(google::crypto::tink::OutputPrefixType::TINK);
+  key->set_status(google::crypto::tink::KeyStatusType::ENABLED);
+  keyset.set_primary_key_id(std::numeric_limits<uint32_t>::max());
+  EXPECT_THAT(crypto::tink::ValidateKeyset(keyset), IsOk());
+}
+
+}  // namespace
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/cc/version.h.templ b/cc/version.h.templ
index eb33b82..724a7cc 100644
--- a/cc/version.h.templ
+++ b/cc/version.h.templ
@@ -22,7 +22,7 @@
 
 class Version {
  public:
-  static constexpr char kTinkVersion[] = "TINK_VERSION_LABEL";
+  static constexpr char kTinkVersion[] = "@TINK_VERSION_LABEL@";
 };
 
 }  // namespace tink
diff --git a/cc/version_script.lds b/cc/version_script.lds
index 6fbcc0e..390ac43 100644
--- a/cc/version_script.lds
+++ b/cc/version_script.lds
@@ -1,4 +1,4 @@
-VERS_1.2.2 {
+VERS_1.3.0-rc2 {
   global:
     *tink*;
     *absl*;
diff --git a/cmake/HttpArchive.cmake b/cmake/HttpArchive.cmake
new file mode 100644
index 0000000..ed5680d
--- /dev/null
+++ b/cmake/HttpArchive.cmake
@@ -0,0 +1,86 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+include(ExternalProject)
+include(CMakeParseArguments)
+
+if (NOT DEFINED TINK_THIRD_PARTY_DIR)
+  set(TINK_THIRD_PARTY_DIR "${CMAKE_CURRENT_BINARY_DIR}/__third_party")
+endif()
+
+# Download, unpack and configure a dependency.
+#
+# The project is added as a subdirectory of Tink, unless DATA_ONLY is
+# specified. This makes all target defined by it available as dependencies.
+#
+# This rule also defines a <NAME>_SOURCE_DIR variable, which points to the
+# root directory of the downloaded package and can be used to reference data in
+# tests, or append extra include/link paths in the Workspace file.
+#
+# Parameters:
+#   NAME name of the dependency.
+#   URL url to fetch a source archive from.
+#   SHA256 hash of the file downloaded from URL.
+#
+# Optional parameters:
+#   CMAKE_SUBDIR subdirectory of the downloaded archive where the root
+#     CMakeLists.txt file for the project is located. Defaults to the root.
+#   CMAKE_ARGS any additional argument that should be passed to cmake when
+#     configuring the downloaded archive. Defaults to empty.
+#   DATA_ONLY flag, if present the package will only be downloaded, verified and
+#     unpacked. No configuration step is performed, and no target included. This
+#     is useful for downloading archives of test vectors or artifacts.
+#     False by default.
+#
+function(http_archive)
+  cmake_parse_arguments(PARSE_ARGV 0 http_archive
+    "DATA_ONLY"
+    "NAME;URL;SHA256;CMAKE_SUBDIR"
+    "CMAKE_ARGS"
+  )
+
+  message(STATUS "Fetching ${http_archive_NAME}")
+
+  set(http_archive_PREFIX "${TINK_THIRD_PARTY_DIR}/${http_archive_NAME}")
+  set(http_archive_SOURCE_DIR "${http_archive_PREFIX}/src")
+  set(http_archive_BINARY_DIR "${http_archive_PREFIX}/build")
+
+  configure_file(
+    cmake/HttpArchiveDownloader.cmake.in
+    "${http_archive_PREFIX}/CMakeLists.txt")
+
+  execute_process(
+    COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
+    RESULT_VARIABLE errors
+    WORKING_DIRECTORY "${http_archive_PREFIX}")
+
+  if (errors)
+    message(FATAL_ERROR "While configuring ${http_archive_NAME}: ${errors}")
+  endif()
+
+  set(${http_archive_NAME}_SOURCE_DIR "${http_archive_SOURCE_DIR}" PARENT_SCOPE)
+
+  execute_process(
+    COMMAND ${CMAKE_COMMAND} --build .
+    RESULT_VARIABLE errors
+    WORKING_DIRECTORY "${http_archive_PREFIX}")
+
+  if (errors)
+    message(FATAL_ERROR "While fetching ${http_archive_NAME}: ${errors}")
+  endif()
+
+  if (NOT http_archive_DATA_ONLY)
+    add_subdirectory(
+      "${http_archive_SOURCE_DIR}/${http_archive_CMAKE_SUBDIR}"
+      "${http_archive_BINARY_DIR}" EXCLUDE_FROM_ALL)
+  endif()
+endfunction(http_archive)
diff --git a/cmake/HttpArchiveDownloader.cmake.in b/cmake/HttpArchiveDownloader.cmake.in
new file mode 100644
index 0000000..708e13d
--- /dev/null
+++ b/cmake/HttpArchiveDownloader.cmake.in
@@ -0,0 +1,35 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This template is used by http_archive() to download, unpack and configure Tink
+# dependencies. You shouldn't need to use it directly.
+
+cmake_minimum_required(VERSION 3.5)
+project(http-archive-${http_archive_NAME})
+
+include(ExternalProject)
+
+ExternalProject_Add(${http_archive_NAME}
+  URL "${http_archive_URL}"
+  URL_HASH SHA256=${http_archive_SHA256}
+  TLS_VERIFY true
+  SOURCE_DIR "${http_archive_SOURCE_DIR}"
+  BINARY_DIR "${http_archive_BINARY_DIR}"
+  SOURCE_SUBDIR "${http_archive_CMAKE_SUBDIR}"
+  CMAKE_ARGS ${http_archive_CMAKE_ARGS}
+  CONFIGURE_COMMAND ""
+  BUILD_COMMAND ""
+  TEST_COMMAND ""
+  INSTALL_COMMAND ""
+  ${http_archive_EXTRA_OPTIONS}
+  EXCLUDE_FROM_ALL
+)
diff --git a/cmake/TinkBuildRules.cmake b/cmake/TinkBuildRules.cmake
new file mode 100644
index 0000000..1e1c001
--- /dev/null
+++ b/cmake/TinkBuildRules.cmake
@@ -0,0 +1,264 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Partially adapted from Abseil's CMake helpers
+# https://github.com/abseil/abseil-cpp/blob/master/CMake/AbseilHelpers.cmake
+
+# Rules for declaring Tink targets in a way similar to Bazel.
+#
+# These functions are intended to reduce the difficulty of supporting completely
+# different build systems, and are designed for Tink internal usage only.
+# They may work outside this project too, but we don't support that.
+#
+# A set of global variables influences the behavior of the rules:
+#
+#   TINK_MODULE name used to build more descriptive names and for namespaces.
+#   TINK_GENFILE_DIR generated content root, such pb.{cc,h} files.
+#   TINK_INCLUDE_DIRS list of global include paths.
+#   TINK_CXX_STANDARD C++ standard to enforce, 11 for now.
+#   TINK_BUILD_TESTS flag, set to false to disable tests (default false).
+#
+# Sensible defaults are provided for all variables, except TINK_MODULE, which is
+# defined by calls to tink_module(). Please don't alter it directly.
+
+include(CMakeParseArguments)
+
+if (NOT ${CMAKE_VERSION} VERSION_LESS 3.9)
+  include(GoogleTest)
+endif()
+
+
+if (TINK_BUILD_TESTS)
+  enable_testing()
+endif()
+
+if (NOT DEFINED TINK_GENFILE_DIR)
+  set(TINK_GENFILE_DIR "${PROJECT_BINARY_DIR}/__generated")
+endif()
+
+if (NOT DEFINED TINK_CXX_STANDARD)
+ set(TINK_CXX_STANDARD 11)
+endif()
+
+list(APPEND TINK_INCLUDE_DIRS "${TINK_GENFILE_DIR}")
+
+set(TINK_IDE_FOLDER "Tink")
+
+# Declare the beginning of a new Tink library namespace.
+#
+# As a rule of thumb, every CMakeLists.txt should be a different module, named
+# after the directory that contains it, and this function should appear at the
+# top of each CMakeLists script.
+#
+# This is not a requirement, though. Targets should be grouped logically, and
+# multiple directories can be part of the same module as long as target names
+# do not collide.
+#
+macro(tink_module NAME)
+  set(TINK_MODULE ${NAME})
+endmacro()
+
+# Declare a Tink library. Produces a static library that can be linked into
+# other test, binary or library targets. Tink libraries are mainly meant as
+# a way to organise code and speed up compilation.
+#
+# Arguments:
+#   NAME base name of the target. See below for target naming conventions.
+#   SRCS list of source files, including headers.
+#   DEPS list of dependency targets.
+#   PUBLIC flag, signal that this target is intended for external use.
+#
+# If SRCS contains only headers, an INTERFACE rule is created. This rule carries
+# include path and link library information, but is not directly buildable.
+#
+# The corresponding build target is named tink_<MODULE>_<NAME> if PUBLIC is
+# specified, or tink_internal_<MODULE>_<NAME> otherwise. An alias is also
+# defined for use in CMake scripts, in the tink::<MODULE>::<NAME> form.
+#
+# Unlike Bazel, CMake does not enforce the rule that all dependencies must be
+# listed. CMake DEPS just carry include, build and link flags that are passed
+# to the compiler. Because of this, a target might compile even if a dependency
+# is not specified, but that could break at any time. So make sure that all
+# dependencies are explicitly specified.
+#
+function(tink_cc_library)
+  cmake_parse_arguments(PARSE_ARGV 0 tink_cc_library
+    "PUBLIC"
+    "NAME"
+    "SRCS;DEPS"
+  )
+
+  if (NOT DEFINED TINK_MODULE)
+    message(FATAL_ERROR
+            "TINK_MODULE not defined, perhaps you are missing a tink_module() statement?")
+  endif()
+
+  set(_is_headers_only_lib true)
+  foreach(_src_file ${tink_cc_library_SRCS})
+    if(${_src_file} MATCHES "\\.cc$")
+      set(_is_headers_only_lib false)
+      break()
+    endif()
+  endforeach()
+
+  if (tink_cc_library_PUBLIC)
+    set(_target_name "tink_${TINK_MODULE}_${tink_cc_library_NAME}")
+  else()
+    set(_target_name "tink_internal_${TINK_MODULE}_${tink_cc_library_NAME}")
+  endif()
+
+  if(NOT _is_headers_only_lib)
+    add_library(${_target_name} STATIC "")
+    target_sources(${_target_name} PRIVATE ${tink_cc_library_SRCS})
+    target_include_directories(${_target_name} PUBLIC ${TINK_INCLUDE_DIRS})
+    target_link_libraries(${_target_name} PUBLIC ${tink_cc_library_DEPS})
+    set_property(TARGET ${_target_name} PROPERTY CXX_STANDARD ${TINK_CXX_STANDARD})
+    set_property(TARGET ${_target_name} PROPERTY CXX_STANDARD_REQUIRED true)
+    if (tink_cc_library_PUBLIC)
+      set_property(TARGET ${_target_name}
+                   PROPERTY FOLDER "${TINK_IDE_FOLDER}")
+    else()
+      set_property(TARGET ${_target_name}
+                   PROPERTY FOLDER "${TINK_IDE_FOLDER}/Internal")
+    endif()
+  else()
+    add_library(${_target_name} INTERFACE)
+    target_include_directories(${_target_name} INTERFACE ${TINK_INCLUDE_DIRS})
+    target_link_libraries(${_target_name} INTERFACE ${tink_cc_library_DEPS})
+  endif()
+
+  add_library(
+    tink::${TINK_MODULE}::${tink_cc_library_NAME} ALIAS ${_target_name})
+endfunction(tink_cc_library)
+
+# Declare a Tink test using googletest, with a syntax similar to Bazel.
+#
+# Parameters:
+#   NAME base name of the test.
+#   SRCS list of test source files, headers included.
+#   DEPS list of dependencies, see tink_cc_library above.
+#   DATA list of non-code dependencies, such as test vectors.
+#
+# Tests added with this macro are automatically registered.
+# Each test produces a build target named tink_test_<MODULE>_<NAME>.
+#
+function(tink_cc_test)
+  cmake_parse_arguments(PARSE_ARGV 0 tink_cc_test
+    ""
+    "NAME"
+    "SRCS;DEPS;DATA"
+  )
+
+  if (NOT TINK_BUILD_TESTS)
+    return()
+  endif()
+
+  if (NOT DEFINED TINK_MODULE)
+    message(FATAL_ERROR "TINK_MODULE not defined")
+  endif()
+
+  set(_target_name "tink_test_${TINK_MODULE}_${tink_cc_test_NAME}")
+
+  add_executable(${_target_name}
+    ${tink_cc_test_SRCS}
+  )
+
+  target_link_libraries(${_target_name}
+    gtest_main
+    ${tink_cc_test_DEPS}
+  )
+
+  set_property(TARGET ${_target_name}
+               PROPERTY FOLDER "${TINK_IDE_FOLDER}/Tests")
+  set_property(TARGET ${_target_name} PROPERTY CXX_STANDARD ${TINK_CXX_STANDARD})
+  set_property(TARGET ${_target_name} PROPERTY CXX_STANDARD_REQUIRED true)
+
+  if (${CMAKE_VERSION} VERSION_LESS 3.9)
+    add_test(NAME ${_target_name} COMMAND ${_target_name})
+  else()
+    gtest_discover_tests(${_target_name})
+  endif()
+endfunction(tink_cc_test)
+
+# Declare a C++ Proto library.
+#
+# Parameters:
+#   NAME base name of the library.
+#   SRCS list of .proto source files.
+#   DEPS list of proto library dependencies, produced by tink_cc_proto or not.
+#
+# The resulting library follows the same naming convention as tink_cc_library.
+#
+function(tink_cc_proto)
+  cmake_parse_arguments(PARSE_ARGV 0 tink_cc_proto
+    ""
+    "NAME"
+    "SRCS;DEPS"
+  )
+
+  set(tink_cc_proto_GEN_SRCS)
+  foreach(_src_path ${tink_cc_proto_SRCS})
+    get_filename_component(_src_absolute_path "${_src_path}" ABSOLUTE)
+    get_filename_component(_src_basename "${_src_path}" NAME_WE)
+    get_filename_component(_src_dir "${_src_absolute_path}" DIRECTORY)
+    file(RELATIVE_PATH _src_rel_path "${PROJECT_SOURCE_DIR}" "${_src_dir}")
+
+    set(_gen_srcs)
+    foreach(_gen_ext .pb.h .pb.cc)
+      list(APPEND _gen_srcs
+           "${TINK_GENFILE_DIR}/${_src_rel_path}/${_src_basename}${_gen_ext}")
+    endforeach()
+
+    list(APPEND tink_cc_proto_GEN_SRCS ${_gen_srcs})
+
+    add_custom_command(
+      COMMAND protobuf::protoc
+      ARGS
+        --cpp_out "${TINK_GENFILE_DIR}"
+        -I "${PROJECT_SOURCE_DIR}"
+        "${_src_absolute_path}"
+      OUTPUT
+        ${_gen_srcs}
+      DEPENDS
+        protobuf::protoc
+        ${_src_absolute_path}
+      COMMENT "Running CXX protocol buffer compiler on ${_src_path}"
+      VERBATIM
+    )
+  endforeach()
+
+  set_source_files_properties(
+    ${tink_cc_proto_GEN_SRCS} PROPERTIES GENERATED true)
+
+  tink_cc_library(
+    NAME ${tink_cc_proto_NAME}
+    SRCS ${tink_cc_proto_GEN_SRCS}
+    DEPS
+      protobuf::libprotoc
+      ${tink_cc_proto_DEPS}
+  )
+endfunction()
+
+# Declare an empty target, that depends on all those specified. Use this rule
+# to group dependencies that are logically related and give them a single name.
+#
+# Parameters:
+#   NAME base name of the target.
+#   DEPS list of dependencies to group.
+#
+# Each tink_target_group produces a target named tink_<MODULE>_<NAME>.
+function(tink_target_group)
+  cmake_parse_arguments(PARSE_ARGV 0 tink_target_group "" "NAME" "DEPS")
+  set(_target_name "tink_${TINK_MODULE}_${tink_target_group_NAME}")
+  add_custom_target(${_target_name})
+  add_dependencies(${_target_name} ${tink_target_group_DEPS})
+endfunction()
diff --git a/cmake/TinkUtil.cmake b/cmake/TinkUtil.cmake
new file mode 100644
index 0000000..375ebca
--- /dev/null
+++ b/cmake/TinkUtil.cmake
@@ -0,0 +1,32 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Create an alias for SOURCE, called DESTINATION.
+#
+# On platforms that support them, this rule will effectively create a symlink.
+#
+# SOURCE may be relative to CMAKE_CURRENT_SOURCE_DIR, or absolute.
+# DESTINATION may relative to CMAKE_CURRENT_BINARY_DIR, or absolute.
+#
+# Adapted from https://github.com/google/binexport/blob/master/util.cmake
+function(add_directory_alias SOURCE DESTINATION)
+  get_filename_component(_destination_parent "${DESTINATION}" DIRECTORY)
+  file(MAKE_DIRECTORY "${_destination_parent}")
+
+  if (WIN32)
+    file(TO_NATIVE_PATH "${SOURCE}" _native_source)
+    file(TO_NATIVE_PATH "${DESTINATION}" _native_destination)
+    execute_process(COMMAND $ENV{ComSpec} /c mklink /J "${_native_destination}" "${_native_source}" ERROR_QUIET)
+  else()
+    execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${SOURCE}" "${DESTINATION}")
+  endif()
+endfunction(add_directory_alias)
diff --git a/cmake/TinkWorkspace.cmake b/cmake/TinkWorkspace.cmake
new file mode 100644
index 0000000..279ddc8
--- /dev/null
+++ b/cmake/TinkWorkspace.cmake
@@ -0,0 +1,94 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Download, unpack and setup Tink dependencies.
+#
+# Despite the looks, http_archive rules are not purely declarative, and order
+# matters. All variables defined before a rule are visible when configuring the
+# dependency it declares, and the targets provided by a dependency are visible
+# (only) after it has been declared. Following dependencies may rely on targets
+# defined by a previous one, for instance on gtest or absl.
+#
+# Some rules imported from dependencies require small fixes, which are specified
+# after the relative http_archive rule. Please always document the intended
+# purpose of such statements, and why they are necessary.
+#
+# In general, when adding a new dependency you should follow this structure:
+#
+# <set any configuration variable, if any>
+# <http_archive for your dependency>
+# <define or fix newly imported targets, if any>
+#
+# Many projects provide switches to disable tests or examples, which you should
+# specify, in order to speed up the compilation process.
+
+include(HttpArchive)
+include(TinkUtil)
+
+set(gtest_force_shared_crt ON CACHE BOOL "Tink dependency override" FORCE)
+
+http_archive(
+  NAME com_google_googletest
+  URL https://github.com/google/googletest/archive/eb9225ce361affe561592e0912320b9db84985d0.zip
+  SHA256 a7db7d1295ce46b93f3d1a90dbbc55a48409c00d19684fcd87823037add88118
+)
+
+http_archive(
+  NAME com_google_absl
+  URL https://github.com/abseil/abseil-cpp/archive/20190808.zip
+  SHA256 0b62fc2d00c2b2bc3761a892a17ac3b8af3578bd28535d90b4c914b0a7460d4e
+)
+
+http_archive(
+  NAME wycheproof
+  URL https://github.com/google/wycheproof/archive/f89f4c53a8845fcefcdb9f14ee9191dbe167e3e3.zip
+  SHA256 b44bb0339ad149e6cdab1337445cf52440cbfc79684203a3db1c094d9ef8daea
+  DATA_ONLY
+)
+
+# Symlink the Wycheproof test data.
+# Paths are hard-coded in tests, which expects wycheproof/ in this location.
+add_directory_alias("${wycheproof_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/cc/wycheproof")
+
+http_archive(
+  NAME boringssl
+  URL https://github.com/google/boringssl/archive/18637c5f37b87e57ebde0c40fe19c1560ec88813.zip
+  SHA256 bd923e59fca0d2b50db09af441d11c844c5e882a54c68943b7fc39a8cb5dd211
+  CMAKE_SUBDIR src
+)
+
+# BoringSSL targets do not carry include directory info, this fixes it.
+target_include_directories(crypto PUBLIC "${boringssl_SOURCE_DIR}/src/include")
+
+set(RAPIDJSON_BUILD_DOC OFF CACHE BOOL "Tink dependency override" FORCE)
+set(RAPIDJSON_BUILD_EXAMPLES OFF CACHE BOOL "Tink dependency override" FORCE)
+set(RAPIDJSON_BUILD_TESTS OFF CACHE BOOL "Tink dependency override" FORCE)
+
+http_archive(
+  NAME rapidjson
+  URL https://github.com/Tencent/rapidjson/archive/v1.1.0.tar.gz
+  SHA256 bf7ced29704a1e696fbccf2a2b4ea068e7774fa37f6d7dd4039d0787f8bed98e
+)
+
+# Rapidjson is a header-only library with no explicit target. Here we create one.
+add_library(rapidjson INTERFACE)
+target_include_directories(rapidjson INTERFACE "${rapidjson_SOURCE_DIR}")
+
+set(protobuf_BUILD_TESTS OFF CACHE BOOL "Tink dependency override" FORCE)
+set(protobuf_BUILD_EXAMPLES OFF CACHE BOOL "Tink dependency override" FORCE)
+
+http_archive(
+  NAME com_google_protobuf
+  URL https://github.com/google/protobuf/archive/v3.9.1.zip
+  SHA256 c90d9e13564c0af85fd2912545ee47b57deded6e5a97de80395b6d2d9be64854
+  CMAKE_SUBDIR cmake
+)
diff --git a/docs/CMAKE-HOWTO.md b/docs/CMAKE-HOWTO.md
new file mode 100644
index 0000000..72349f3
--- /dev/null
+++ b/docs/CMAKE-HOWTO.md
@@ -0,0 +1,110 @@
+# CMake for Tink HOW-TO
+
+# Incorporating Tink into your project
+
+If you are developing a project that uses Tink, you might incorporate the
+library following one of the following approaches. At the moment, only the
+in-tree dependency is supported, although all of them should work.
+
+## In-tree dependency
+
+Tink can be embedded directly in your CMake project and statically linked in
+your executable. This is the approach we currently recommend. Assuming the Tink
+source tree has been copied in the `third_party/tink` directory of your project,
+your top-level CMake script should look like this:
+
+    cmake_minimum_required(VERSION 3.5)
+    project(YourProject CXX)
+    set(CMAKE_CXX_STANDARD 11)
+
+    add_subdirectory(third_party/tink)
+
+    add_executable(your_app your_app.cc)
+    target_link_libraries(your_app tink::static)
+
+NOTE: You need at least CMake 3.5 to build Tink and its dependencies.
+
+Include Tink headers in `your_app.cc` as follows:
+
+    #include "tink/config.h"
+    #include "tink/json_keyset_reader.h"
+
+    // ...
+
+NOTE: `tink::static` provides the `tink/...` include path. It is just a shortcut
+for your convenience, and you might still refer to Tink headers using a
+filesystem path, such as `third_party/tink/cc/...`, if you prefer or need to.
+
+You can see a full example in `examples/helloworld/cc/hello_world.cc`.
+
+Generate the build directory as you normally would and invoke your build system
+of choice:
+
+    $ ls
+    CMakeLists.txt your_app.cc third_party/
+    $ mkdir build && cd build
+    $ cmake ..
+    $ make
+    $ ./your_app
+
+If you have the option, we recommend using [Ninja](https://ninja-build.org/) to
+build your project:
+
+    $ cmake -DCMAKE_GENERATOR=Ninja ..
+    $ ninja
+
+## Stand-alone libtink.so
+
+Alternatively, you may build `libtink.so` on Linux and Darwin systems. This
+feature is disabled by default, and is currently not supported on Windows. You
+can enable it at configure time:
+
+    $ ls
+    tink/
+    $ mkdir tink-build && cd tink-build
+    $ cmake ../tink -DTINK_BUILD_SHARED_LIB=ON
+    $ make package
+
+We recommend using Ninja in this case too:
+
+    $ cmake ../tink -DTINK_BUILD_SHARED_LIB=ON -DCMAKE_GENERATOR=Ninja
+    $ ninja package
+
+This produces a `.tar.gz` archive containing `libtink.so`, all Tink headers and
+some extra support headers. This is a stand-alone build that you can integrate
+in your own process.
+
+WARNING: Setting `TINK_BUILD_SHARED_LIB` to `ON` is not recommended in
+combination with the in-tree dependency approach, as this option causes several
+`install` targets to be created, which will pollute your own install.
+
+## libtink.so CMake config
+
+Building `libtink.so` also writes a CMake config to the build directory,
+`TinkConfig.cmake`. You can use it with `find_package` in `CONFIG` mode to
+import the `tink` target in your project without embedding all of Tink internal
+targets in your CMake build. In this case you have to provide your own system
+for building and keeping `libtink.so` up to date.
+
+NOTE: We currently only export `libtink.so` as `tink`. We are working on a way
+to provide `tink::static` too.
+
+# Developing Tink with CMake
+
+If you are developing Tink, Bazel is the primary build system, but you should
+test all your changes with CMake too. Build Tink as a regular CMake project, but
+enable tests and build the shared library as well:
+
+    $ ls
+    tink/
+    $ mkdir tink-build && cd tink-build
+    $ cmake ../tink -DTINK_BUILD_SHARED_LIB=ON -DTINK_BUILD_TESTS=ON -DCMAKE_GENERATOR=Ninja
+    $ ninja
+    $ CTEST_OUTPUT_ON_FAILURE=1 ninja test
+    $ ninja package
+
+This combination of options ensures that the entire CMake configuration is
+evaluated.
+
+WARNING: When editing a `BUILD.bazel` file, remember to keep it in sync with the
+corresponding `CMakeLists.txt` file.
diff --git a/docs/CPP-HOWTO.md b/docs/CPP-HOWTO.md
index 8680b53..d21a4fa 100644
--- a/docs/CPP-HOWTO.md
+++ b/docs/CPP-HOWTO.md
@@ -1,78 +1,79 @@
 # Tink for C++ HOW-TO
 
-The following subsections present instructions and/or C++ snippets for some
-common tasks in [Tink](https://github.com/google/tink).
+This document contains instructions and C++ code snippets for common tasks in
+[Tink](https://github.com/google/tink).
 
+## Setup instructions
 
-## Installing Tink
+### Bazel
 
-Tink is built with [Bazel](https://www.bazel.build), so it is quite easy to use
-Tink in a project built with Bazel, and this is the recommended way.  See for
-example [tink-examples repo](https://github.com/thaidn/tink-examples) on how to
-import Tink using Bazel's WORKSPACE file.
+Tink is built using [Bazel](https://www.bazel.build).
 
-Still, there are definitely projects for which using Bazel is not an option, and
-for such situations we offer a library that can be used with other build
-tools.  Currently only we offer support for Linux machines, but are working on
-supporting other operating systems as well.
+Using Tink in projects built with Bazel is straighforward and is the recommended
+approach. For an example, see [this project which specifies Tink as a dependency
+in a Bazel WORKSPACE file](https://github.com/thaidn/tink-examples).
 
-**Warning:** In any case, the use of Tink without Bazel is at experimental stage,
-so the instructions given below might not work in some environments.
+#### Caveats
 
-#### Supported Platforms
+Tink has a number of library dependencies specified in the "cc" section of the
+[Bazel WORKSPACE file](https://github.com/google/tink/blob/master/WORKSPACE).
+
+Any project using Tink should either:
+
+ * explicitly depend on the same versions of these libraries
+ * not depend directly on these libraries at all (i.e. have only the indirect
+   dependence via Tink).
+
+### Precompiled library
+
+There are projects where using Bazel is not an option. For such situations, we
+offer a precompiled library that can be used with other build tools.
+
+#### Supported platforms
 
 *   Linux x86_64
 *   macOS x86_64, 10.12.6 (Sierra) or newer
 
-#### Caveats
+**Warning:** The use of Tink without Bazel is at experimental stage, so the
+instructions given below might not work in some environments.
 
-Tink depends on [Abseil](https://github.com/abseil/abseil-cpp), [Protocol
-Buffers](https://developers.google.com/protocol-buffers/), and
-[BoringSSL](https://opensource.google.com/projects/boringssl), so any project
-that wants to use Tink should either depend on the same versions of these
-libraries (cf. versions in the corresponding entries in
-[WORKSPACE](https://github.com/google/tink/blob/master/WORKSPACE) file), or not
-depend directly on these libraries at all (i.e. have only the indirect
-dependence via Tink).
+#### Using the precompiled library
 
-### Installing pre-built binaries
-
-1.  Download and extract the Tink library into `/usr/local/lib` by invoking the
-    following shell commands:
+1.  Download and extract the Tink library.
 
     ```sh
     OS="linux" # Change to "darwin" for macOS
     TARGET_DIR="/usr/local"
+
     curl -L \
-    "https://storage.googleapis.com/tink/releases/libtink-${OS}-x86_64-1.2.0-rc2.tar.gz" |
-    sudo tar -xz -C $TARGET_DIR
+    "https://storage.googleapis.com/tink/releases/libtink-${OS}-x86_64-1.2.0-rc2.tar.gz" \
+    | sudo tar -xz -C ${TARGET_DIR}
     ```
 
-The tar command extracts the Tink library into the `lib` subdirectory of
-`TARGET_DIR`. For example, specifying `/usr/local` as `TARGET_DIR` causes tar to
-extract the Tink library into `/usr/local/lib`.
+    The tar command extracts the Tink library into the `lib` subdirectory of
+    `TARGET_DIR`. For example, specifying `/usr/local` as `TARGET_DIR` causes tar to
+    extract the Tink library into `/usr/local/lib`.
 
-If you'd prefer to extract the library into a different directory, adjust
-`TARGET_DIR` accordingly.
+    If you'd prefer to extract the library into a different directory, adjust
+    `TARGET_DIR` accordingly.
 
-1.  On Linux, if in Step 2 you specified a system directory (for example,
-    `/usr/local`) as the `TARGET_DIR`, then run ldconfig to configure the
-    linker. For example:
+1.  On Linux, if you specified a system directory as the `TARGET_DIR` (for
+    example, `/usr/local`), then run `ldconfig` to configure the linker.
 
     ```sh
     sudo ldconfig
     ```
 
-    If you assigned a `TARGET_DIR` other than a system directory (for example,
-    `~/mydir`), then you must append the extraction directory (for example,
-    `~/mydir/lib`) to two environment variables:
+    If you set `TARGET_DIR` to a non-system directory (for example, `~/mydir`),
+    then you must append the extraction directory (for example, `~/mydir/lib`)
+    to two environment variables:
 
     ```sh
-    export LIBRARY_PATH=$LIBRARY_PATH:$TARGET_DIR/lib
-    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TARGET_DIR/lib
+    export LIBRARY_PATH=${LIBRARY_PATH}:${TARGET_DIR}/lib
+    export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${TARGET_DIR}/lib
     ```
 
-### Installing from the source
+#### Compiling the library from source
 
 #### Prerequisites
 
@@ -81,65 +82,78 @@
  * [git](https://git-scm.com/) - to download the source of Tink
  * [Bazel](https://www.bazel.build) - to build the Tink library
 
+**Note:** You need to use Bazel to build the library, but you will be able to
+use the resultant build artifacts in a non-Bazel project.
+
 #### Step-by-step instructions to build and use `libtink.so`
 
-1.  clone Tink from GitHub:
+1.  Clone Tink from GitHub.
 
     ```sh
     git clone https://github.com/google/tink/
     ```
 
-2.  build the library and header-file bundles, and install them in appropriate
-    directories of the target project (`TARGET_DIR`):
+1.  Build the library and header file bundles.
 
     ```sh
     cd tink
-    TARGET_DIR="/usr/local"
-    mkdir -p $TARGET_DIR/lib $TARGET_DIR/include
     bazel build -c opt cc:libtink.so
-    sudo cp bazel-bin/cc/libtink.so $TARGET_DIR/lib/
     bazel build cc:tink_headers cc:tink_deps_headers
-    sudo tar xfv bazel-genfiles/cc/tink_headers.tar -C $TARGET_DIR/include/
-    sudo tar xfv bazel-genfiles/cc/tink_deps_headers.tar -C $TARGET_DIR/include/
     ```
 
-3.  On Linux, if in Step 2 you specified a system directory (for example,
-    `/usr/local`) as the `TARGET_DIR`, then run ldconfig to configure the
-    linker. For example:
+1.  Prepare the installation target directory.
+
+    ```sh
+    TARGET_DIR="/usr/local"
+    mkdir -p ${TARGET_DIR}/lib ${TARGET_DIR}/include
+    ```
+
+1.  Install the libary and header file bundles.
+
+    ```sh
+    sudo cp bazel-bin/cc/libtink.so ${TARGET_DIR}/lib/
+    sudo tar xfv bazel-genfiles/cc/tink_headers.tar -C ${TARGET_DIR}/include/
+    sudo tar xfv bazel-genfiles/cc/tink_deps_headers.tar -C ${TARGET_DIR}/include/
+    ```
+
+1.  On Linux, if you specified a system directory as the `TARGET_DIR` (for
+    example, `/usr/local`), then run `ldconfig` to configure the linker.
 
     ```sh
     sudo ldconfig
     ```
 
-    If you assigned a `TARGET_DIR` other than a system directory (for example,
-    `~/mydir`), then you must append the extraction directory (for example,
-    `~/mydir/lib`) to two environment variables:
+    If you set `TARGET_DIR` to a non-system directory (for example, `~/mydir`),
+    then you must append the extraction directory (for example, `~/mydir/lib`)
+    to two environment variables:
 
     ```sh
-    export LIBRARY_PATH=$LIBRARY_PATH:$TARGET_DIR/lib
-    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TARGET_DIR/lib
+    export LIBRARY_PATH=${LIBRARY_PATH}:${TARGET_DIR}/lib
+    export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${TARGET_DIR}/lib
+
     ```
 
 ### Validate your installation
 
-To validate the installation compile and run [`hello_world.cc`](https://github.com/google/tink/tree/master/examples/helloworld/cc/hello_world.cc).
+To validate the installation, compile and run
+[`hello_world.cc`](https://github.com/google/tink/tree/master/examples/helloworld/cc/hello_world.cc).
 
-1. Copy the source code and a test cryptographic key, create some plaintext to encrypt.
+1. Download the source code and a test cryptographic key. Also, create some plaintext to encrypt.
 
    ```sh
    cd /tmp
-   GITHUB_DIR=https://raw.githubusercontent.com/google/tink/master/examples/helloworld/cc/
-   curl $GITHUB_DIR/hello_world.cc -O $GITHUB_DIR/aes128_gcm_test_keyset_json.txt -O
+   GITHUB_URL=https://raw.githubusercontent.com/google/tink/master/examples/helloworld/cc/
+   curl ${GITHUB_URL}/hello_world.cc -O ${GITHUB_URL}/aes128_gcm_test_keyset_json.txt -O
    echo "some message to be encrypted" > plaintext.txt
    ```
 
-2. Compile the source code.
+1. Compile the source code.
 
    ```sh
-    g++ -std=c++11 -I$TARGET_DIR/include/ -L$TARGET_DIR/lib/ hello_world.cc -ltink -o hello_world
+   g++ -std=c++11 -I${TARGET_DIR}/include/ -L${TARGET_DIR}/lib/ hello_world.cc -ltink -o hello_world
    ```
 
-3. Run `hello_world` application to encrypt and decrypt some data.
+1. Use the `hello_world` application to encrypt and decrypt the plaintext data.
 
    ```sh
    ./hello_world aes128_gcm_test_keyset_json.txt encrypt plaintext.txt "associated data" ciphertext.bin
@@ -154,7 +168,7 @@
 initialization happens via _registration_ of the implementations.
 
 For example, if you want to use all standard implementations of all primitives
-in the current release of Tink, the initialization would look as follows:
+in the current release of Tink, the initialization would be:
 
 ```cpp
    #include "tink/config/tink_config.h"
@@ -165,7 +179,7 @@
    // ...
 ```
 
-To use standard implementations of only one primitive, say AEAD, proceed as follows:
+To use standard implementations of only one primitive, say AEAD:
 
 ```cpp
    #include "tink/aead/aead_config.h"
@@ -177,7 +191,7 @@
 ```
 
 The registration of custom key managers can proceed directly via
-`Registry`-class:
+`Registry` class:
 
 ```cpp
    #include "tink/registry.h"
@@ -188,27 +202,17 @@
    if (!status.ok()) /* ... handle failure */;
 ```
 
-A more complex custom initialization (especially when registering a mix of
-standard and custom key managers) can take advantage of
-[`Config`](https://github.com/google/tink/blob/master/cc/config.h)-class, which
-enables use of human-readable configuration files for Tink initialization.
-Please note however that to use such configurations one must first add to the
-Registry so-called _catalogues_, which provide a bridge between text
-descriptions of key managers and their implementations (see
-e.g. [`AeadConfig::Register()`](https://github.com/google/tink/blob/master/cc/aead/aead_config.cc)-method).
+## Generating new keys and keysets
 
-
-## Generating New Key(set)s
-
-Each `KeyManager`-implementation provides `NewKey(template)`-method that generates new
-keys of the corresponding key type.  However to avoid accidental leakage of
-sensitive key material one should be careful with mixing key(set) generation
-with key(set) usage in code. To support the separation between these activities
-Tink package provides a command-line tool called [Tinkey](TINKEY.md), which can
-be used for common key management tasks.
+Each `KeyManager` implementation provides a `NewKey(template)` method that
+generates new keys of the corresponding key type.  However, to avoid accidental
+leakage of sensitive key material, you should avoid mixing key(set) generation
+with key(set) usage in code. To support the separation between these activities,
+Tink provides a command-line tool called [Tinkey](TINKEY.md), which can be used
+for common key management tasks.
 
 Still, if there is a need to generate a KeysetHandle with fresh key material
-directly in C++ code, one can use
+directly in C++ code, you can use
 [`KeysetHandle`](https://github.com/google/tink/blob/master/cc/keyset_handle.h):
 
 ```cpp
@@ -218,31 +222,23 @@
     // use the keyset...
 ```
 
-where `key_template` can be initialized with one of pre-generated templates from
-[examples/keytemplates](https://github.com/google/tink/tree/master/examples/keytemplates)-folder.
+Recommended key templates can be obtained from util classes corresponding to
+Tink primitives, e.g.
+[MacKeyTemplates](https://github.com/google/tink/blob/master/cc/mac/mac_key_templates.h),
+[AeadKeyTemplates](https://github.com/google/tink/blob/master/cc/aead/aead_key_templates.h),
+and
+[HybridKeyTemplates](https://github.com/google/tink/blob/master/cc/hybrid/hybrid_key_templates.h).
 
+## Loading existing keysets
 
-## Loading Existing Keysets
-
-To load cleartext keysets, use
-[`CleartextKeysetHandle`](https://github.com/google/tink/blob/master/cc/cleartext_keyset_handle.h) and an appropriate [`KeysetReader`](https://github.com/google/tink/blob/master/cc/keyset_reader.h), depending on the wire format of the stored keyset, for example a [`BinaryKeysetReader`](https://github.com/google/tink/blob/master/cc/binary_keyset_reader.h) or a [`JsonKeysetReader`](https://github.com/google/tink/blob/master/cc/json_keyset_reader.h).
-
-```cpp
-    #include "tink/binary_keyset_reader.h"
-    #include "tink/cleartext_keyset_handle.h"
-
-    // ...
-    std::string binary_keyset = ...;
-    auto reader_result = BinaryKeysetReader::New(binary_keyset);
-    if (!reader_result.ok()) return reader_result.status();
-    auto reader = std::move(reader_result.ValueOrDie());
-    auto handle_result = CleartextKeysetHandle::Read(std::move(reader));
-    if (!handle_result.ok()) return handle_result.status();
-    auto keyset_handle = std::move(handle_result.ValueOrDie());
-```
-
-To load encrypted keysets, one can use
-[`KeysetHandle`](https://github.com/google/tink/blob/master/cc/keyset_handle.h) and an appropriate [`KeysetReader`](https://github.com/google/tink/blob/master/cc/keyset_reader.h):
+To load encrypted keysets, use
+[`KeysetHandle`](https://github.com/google/tink/blob/master/cc/keyset_handle.h)
+and an appropriate
+[`KeysetReader`](https://github.com/google/tink/blob/master/cc/keyset_reader.h)
+depending on the wire format of the stored keyset, for example a
+[`BinaryKeysetReader`](https://github.com/google/tink/blob/master/cc/binary_keyset_reader.h)
+or a
+[`JsonKeysetReader`](https://github.com/google/tink/blob/master/cc/json_keyset_reader.h):
 
 ```cpp
     #include "tink/aead.h"
@@ -263,35 +259,45 @@
     auto keyset_handle = std::move(handle_result.ValueOrDie());
 ```
 
-## Obtaining and Using Primitives
+To load cleartext keysets, use
+[`CleartextKeysetHandle`](https://github.com/google/tink/blob/master/cc/cleartext_keyset_handle.h)
+and an appropriate
+[`KeysetReader`](https://github.com/google/tink/blob/master/cc/keyset_reader.h),
+
+```cpp
+    #include "tink/binary_keyset_reader.h"
+    #include "tink/cleartext_keyset_handle.h"
+
+    // ...
+    std::string binary_keyset = ...;
+    auto reader_result = BinaryKeysetReader::New(binary_keyset);
+    if (!reader_result.ok()) return reader_result.status();
+    auto reader = std::move(reader_result.ValueOrDie());
+    auto handle_result = CleartextKeysetHandle::Read(std::move(reader));
+    if (!handle_result.ok()) return handle_result.status();
+    auto keyset_handle = std::move(handle_result.ValueOrDie());
+```
+
+## Obtaining and using primitives
 
 [_Primitives_](PRIMITIVES.md) represent cryptographic operations offered by
-Tink, hence they form the core of Tink API. A primitive is just an interface
-that specifies what operations are offered by the primitive. A primitive can
-have multiple implementations, and user chooses a desired implementation by
-using a key of corresponding type (see the [this
-section](KEY-MANAGEMENT.md#key-keyset-and-keysethandle) for details).
+Tink, hence they form the core of the Tink API. A primitive is an interface that
+specifies what operations are offered by the primitive. A primitive can have
+multiple implementations, and you choose a desired implementation by using a key
+of a corresponding type (see [this
+document](KEY-MANAGEMENT.md#key-keyset-and-keysethandle) for further details).
 
-The following table summarizes C++ implementations of primitives that are
-currently available or planned (the latter are listed in brackets).
+A list of primitives and the implementations currently supported by Tink in C++
+can be found [here](PRIMITIVES.md#c).
 
-| Primitive          | Implementations                               |
-| ------------------ | --------------------------------------------- |
-| AEAD               | AES-GCM, AES-CTR-HMAC, AES-EAX                |
-| Deterministic AEAD | AES-SIV                                       |
-| MAC                | HMAC-SHA2                                     |
-| Digital Signatures | ECDSA over NIST curves, (Ed25519)             |
-| Hybrid Encryption  | ECIES with AEAD and HKDF                      |
-
-The user obtains a primitive by calling the function `getPrimitive<>` of the
+You obtain a primitive by calling the method `GetPrimitive<>` of a
 `KeysetHandle`.
 
-### Symmetric Key Encryption
+### Symmetric key encryption
 
-Here is how you can obtain and use an [AEAD (Authenticated Encryption with
-Associated
-Data)](PRIMITIVES.md#authenticated-encryption-with-associated-data) primitive
-to encrypt or decrypt data:
+You can use an [AEAD (Authenticated Encryption with Associated
+Data)](PRIMITIVES.md#authenticated-encryption-with-associated-data) primitive to
+encrypt or decrypt data:
 
 ```cpp
     #include "tink/aead.h"
@@ -312,9 +318,9 @@
     auto ciphertext = std::move(ciphertext_result.ValueOrDie());
 ```
 
-### Hybrid Encryption
+### Hybrid encryption
 
-To decrypt using [a combination of public key encryption and
+You can encrypt and decrypt using [a combination of public key encryption and
 symmetric key encryption](PRIMITIVES.md#hybrid-encryption):
 
 ```cpp
diff --git a/docs/GOLANG-HOWTO.md b/docs/GOLANG-HOWTO.md
new file mode 100644
index 0000000..ee76312
--- /dev/null
+++ b/docs/GOLANG-HOWTO.md
@@ -0,0 +1,505 @@
+# Tink for Go HOW-TO
+
+This document contains instructions and Go code snippets for common tasks in
+[Tink](https://github.com/google/tink).
+
+## Setup instructions
+
+To install Tink locally run:
+
+```sh
+go get github.com/google/tink/go/...
+```
+
+to run all the tests locally:
+
+```sh
+cd $GOPATH/go/src/github.com/google/tink/go
+go test ./...
+```
+
+Golang Tink API also supports [Bazel](https://www.bazel.build) builds. To run
+the tests using bazel:
+
+```sh
+cd $GOPATH/go/src/github.com/google/tink/go
+bazel build ... && bazel test ...
+```
+
+## GoDoc
+
+Documentation for the Tink API can be found
+[here](https://godoc.org/github.com/google/tink).
+
+## Obtaining and using primitives
+
+[_Primitives_](PRIMITIVES.md) represent cryptographic operations offered by
+Tink, hence they form the core of Tink API. A primitive is just an interface
+that specifies what operations are offered by the primitive. A primitive can
+have multiple implementations, and you choose a desired implementation by
+using a key of corresponding type (see the [this
+section](KEY-MANAGEMENT.md#key-keyset-and-keysethandle) for details).
+
+A list of primitives and their implemenations currently supported by Tink in
+Golang can be found [here](PRIMITIVES.md#golang).
+
+### AEAD
+
+AEAD encryption assures the confidentiality and authenticity of the data. This
+primitive is CPA secure.
+
+```go
+package main
+
+import (
+        "fmt"
+        "log"
+
+        "github.com/google/tink/go/aead"
+        "github.com/google/tink/go/keyset"
+)
+
+func main() {
+
+        kh, err := keyset.NewHandle(aead.AES256GCMKeyTemplate())
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        a, err := aead.New(kh)
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        ct, err := a.Encrypt([]byte("this data needs to be encrypted"), []byte("associated data"))
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        pt, err := a.Decrypt(ct, []byte("associated data"))
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        fmt.Printf("Cipher text: %s\nPlain text: %s\n", ct, pt)
+
+}
+```
+
+### MAC
+
+MAC computes a tag for a given message that can be used to authenticate a
+message. MAC protects data integrity as well as provides for authenticity of the
+message.
+
+```go
+package main
+
+import (
+        "fmt"
+        "log"
+
+        "github.com/google/tink/go/keyset"
+        "github.com/google/tink/go/mac"
+)
+
+func main() {
+
+        kh, err := keyset.NewHandle(mac.HMACSHA256Tag256KeyTemplate())
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        m, err := mac.New(kh)
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        mac, err := m.ComputeMAC([]byte("this data needs to be MACed"))
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        if m.VerifyMAC(mac, []byte("this data needs to be MACed")); err != nil {
+                log.fatal("MAC verification failed")
+        }
+
+        fmt.Println("MAC verification succeeded.")
+
+}
+```
+
+### Deterministic AEAD
+
+Unlike AEAD, implementations of this interface are not semantically secure,
+because encrypting the same plaintext always yields the same ciphertext.
+
+```go
+package main
+
+import (
+        "bytes"
+        "fmt"
+        "log"
+
+        "github.com/google/tink/go/daead"
+        "github.com/google/tink/go/keyset"
+)
+
+func main() {
+
+        kh, err := keyset.NewHandle(daead.AESSIVKeyTemplate())
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        d, err := daead.New(kh)
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        ct1, err := d.EncryptDeterministically([]byte("this data needs to be encrypted"), []byte("additional data"))
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        ct2, err := d.EncryptDeterministically([]byte("this data needs to be encrypted"), []byte("additional data"))
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        if !bytes.Equal(ct1, ct2) {
+                log.Fatal("cipher texts are not equal")
+        }
+
+        fmt.Print("Cipher texts are equal.\n")
+
+        pt, err := d.DecryptDeterministically(ct1, []byte("additional data"))
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        fmt.Printf("Plain text: %s\n", pt)
+
+}
+```
+
+### Signature
+
+To sign data using Tink you can use ECDSA or ED25519 key templates.
+
+```go
+package main
+
+import (
+        "fmt"
+        "log"
+
+        "github.com/google/tink/go/keyset"
+        "github.com/google/tink/go/signature"
+)
+
+func main() {
+
+        khPriv, err := keyset.NewHandle(signature.ECDSAP256KeyTemplate())
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        s, err := signature.NewSigner(khPriv)
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        a, err := s.Sign([]byte("this data needs to be signed"))
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        khPub, err := khPriv.Public()
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        v, err := signature.NewVerifier(khPub)
+
+        if err := v.Verify(a, []byte("this data needs to be signed")); err != nil {
+                log.Fatal("signature verification failed")
+        }
+
+        fmt.Println("Signature verification succeeded.")
+
+}
+```
+
+### Hybrid encryption and decryption
+
+The functionality of Hybrid Encryption is represented as a pair of primitives
+(interfaces):
+
+ * `HybridEncrypt` for encryption of data
+ * `HybridDecrypt` for decryption
+
+Implementations of these interfaces are secure against adaptive chosen
+ciphertext attacks.
+
+In addition to plaintext, the encryption takes an extra parameter, contextInfo.
+It usually is public data implicit from the context.  It is bound to the
+resulting ciphertext, which allows for checking the integrity of contextInfo
+(but there are no guarantees in regards to the secrecy or authenticity of
+contextInfo).
+
+```go
+package main
+
+import (
+        "fmt"
+        "log"
+
+        "github.com/google/tink/go/hybrid"
+        "github.com/google/tink/go/keyset"
+)
+
+func main() {
+
+        khPriv, err := keyset.NewHandle(hybrid.ECIESHKDFAES128CTRHMACSHA256KeyTemplate())
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        khPub, err := khPriv.Public()
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        he, err := hybrid.NewHybridEncrypt(khPub)
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        ct, err := he.Encrypt([]byte("secret message"), []byte("context info"))
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        hd, err := hybrid.NewHybridDecrypt(khPriv)
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        pt, err := hd.Decrypt(ct, []byte("context info"))
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        fmt.Printf("Cipher text: %s\nPlain text: %s\n", ct, pt)
+
+}
+```
+
+
+### Envelope encryption
+
+Tink APIs work with GCP and AWS KMS (cf. more info on
+[Key Management Systems](KEY-MANAGEMENT.md#key-management-systems)
+and [Credentials](KEY-MANAGEMENT.md#credentials)).
+
+```go
+package main
+
+import (
+        "fmt"
+
+        "github.com/google/tink/go/aead"
+        "github.com/google/tink/go/core/registry"
+        "github.com/google/tink/go/integration/gcpkms"
+        "github.com/google/tink/go/keyset"
+)
+
+const (
+        keyURI          = "gcp-kms://......"   // customize for your key
+        credentialsPath = "/mysecurestorage/credentials.json"
+)
+
+func main() {
+        gcpclient, err := gcpkms.NewGCPClient(keyURI)
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        _, err = gcpclient.LoadCredentials(credentialsPath)
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        registry.RegisterKMSClient(gcpclient)
+
+        dek := aead.AES128CTRHMACSHA256KeyTemplate()
+        kh, err := keyset.NewHandle(aead.KMSEnvelopeAEADKeyTemplate(keyURI, dek))
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        a, err := aead.New(kh)
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        ct, err := a.Encrypt([]byte("secret message"), []byte("associated data"))
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        pt, err := a.Decrypt(ct, []byte("associated data"))
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        fmt.Printf("Cipher text: %s\nPlain text: %s\n", ct, pt)
+
+}
+```
+
+## Key management
+
+### Generating new keys and keysets
+
+To take advantage of key rotation and other key management features, you usually
+do not work with single keys, but with keysets. Keysets are just sets of keys
+with some additional parameters and metadata.
+
+Internally Tink stores keysets as Protocol Buffers, but you can work with
+keysets via a wrapper called keyset handle. You can generate a new keyset and
+obtain its handle using a KeyTemplate. KeysetHandle objects enforce certain
+restrictions that prevent accidental leakage of the sensitive key material.
+
+```go
+package main
+
+import (
+        "fmt"
+        "log"
+
+        "github.com/google/tink/go/aead"
+        "github.com/google/tink/go/keyset"
+)
+
+func main() {
+
+        // Other key templates can also be used.
+        kh, err := keyset.NewHandle(aead.AES128GCMKeyTemplate())
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        fmt.Println(kh.String())
+
+}
+
+```
+
+Key templates are available for MAC, digital signatures, AEAD encryption, DAEAD
+encryption and hybrid encryption.
+
+Key Template Type  | Key Template
+------------------ | ------------
+AEAD               | aead.AES128CTRHMACSHA256KeyTemplate()
+AEAD               | aead.AES128GCMKeyTemplate()
+AEAD               | aead.AES256CTRHMACSHA256KeyTemplate()
+AEAD               | aead.AES256GCMKeyTemplate()
+AEAD               | aead.ChaCha20Poly1305KeyTemplate()
+AEAD               | aead.XChaCha20Poly1305KeyTemplate()
+DAEAD              | daead.AESSIVKeyTemplate()
+MAC                | mac.HMACSHA256Tag128KeyTemplate()
+MAC                | mac.HMACSHA256Tag256KeyTemplate()
+MAC                | mac.HMACSHA512Tag256KeyTemplate()
+MAC                | mac.HMACSHA512Tag512KeyTemplate()
+Signature          | signature.ECDSAP256KeyTemplate()
+Signature          | signature.ECDSAP384KeyTemplate()
+Signature          | signature.ECDSAP521KeyTemplate()
+Hybrid             | hybrid.ECIESHKDFAES128GCMKeyTemplate()
+Hybrid             | hybrid.ECIESHKDFAES128CTRHMACSHA256KeyTemplate()
+
+To avoid accidental leakage of sensitive key material, one should avoid mixing
+keyset generation and usage in code. To support the separation of these
+activities Tink provides a command-line tool, [Tinkey](TINKEY.md), which can be
+used for common key management tasks.
+
+### Storing and loading existing keysets
+
+After generating key material, you might want to persist it to a storage system.
+Tink supports persisting the keys after encryption to any io.Writer and
+io.Reader implementations.
+
+```go
+package main
+
+import (
+        "fmt"
+        "log"
+
+        "github.com/golang/protobuf/proto"
+        "github.com/google/tink/go/aead"
+        "github.com/google/tink/go/core/registry"
+        "github.com/google/tink/go/integration/gcpkms"
+        "github.com/google/tink/go/keyset"
+)
+
+const (
+        keyURI          = "gcp-kms://..."
+        credentialsPath = "/mysecurestorage/..."
+)
+
+func main() {
+
+        // Generate a new key.
+        kh1, err := keyset.NewHandle(aead.AES128GCMKeyTemplate())
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        // Fetch the master key from a KMS.
+        gcpClient := gcpkms.NewGCPClient(keyURI)
+
+        _, err := gpcClient.LoadCredentials(credentialsPath)
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        registry.RegisterKMSClient(gcpClient)
+
+        backend, err := gcpClient.GetAEAD(keyURI)
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        masterKey, err = aead.NewKMSEnvelopeAead(*aead.AES256GCMKeyTemplate(), backend)
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        // An io.Reader and io.Writer implementation which simply writes to memory.
+        memKeyset := &keyset.MemReaderWriter{}
+
+        // Write encrypts the keyset handle with the master key and writes to the
+        // io.Writer implementation (memKeyset).  We recommend you encrypt the keyset
+        // handle before persisting it.
+        if err := kh1.Write(memKeyset, masterKey); err != nil {
+                log.Fatal(err)
+        }
+
+        // Read reads the encrypted keyset handle back from the io.Reader implementation
+        // and decrypts it using the master key.
+        kh2, err := keyset.Read(memKeyset, masterKey)
+        if err != nil {
+                log.Fatal(err)
+        }
+
+        if !proto.Equal(kh1.Keyset(), kh2.Keyset()) {
+                log.Fatal("key handlers are not equal")
+        }
+
+        fmt.Println("Key handlers are equal.")
+
+}
+```
diff --git a/docs/JAVA-HOWTO.md b/docs/JAVA-HOWTO.md
index 83ee50f..2792fdc 100644
--- a/docs/JAVA-HOWTO.md
+++ b/docs/JAVA-HOWTO.md
@@ -1,73 +1,90 @@
 # Tink for Java HOW-TO
 
-The following subsections present instructions and/or Java-snippets for some
-common tasks in [Tink](https://github.com/google/tink).
+This document contains instructions and Java code snippets for common tasks in
+[Tink](https://github.com/google/tink).
 
-If you want to contribute, please read [Java hacking guide](JAVA-HACKING.md).
+If you want to contribute code to the Java implementation, please read the [Java
+hacking guide](JAVA-HACKING.md).
 
-## Installation
-
-Tink for Java comes in two flavors:
-
--   The main flavor.
--   The Android flavor that is optimized for Android.
-
-Tink can be installed with Maven or Gradle. The Maven group ID is
-`com.google.crypto.tink`, and the artifact ID is `tink`.
+## Setup instructions
 
 The most recent release is
-[1.2.2](https://github.com/google/tink/releases/tag/v1.2.2), released
-2019-01-24.
+[1.3.0-rc2](https://github.com/google/tink/releases/tag/v1.3.0-rc2), released
+2019-09-25.
 
-Java developers can add Tink using Maven:
+In addition to the versioned releases, snapshots of Tink are regurlarly built
+using the master branch of the Tink GitHub repository.
+
+Tink for Java has two primary build targets specified:
+
+- "tink": the default, for general purpose use
+- "android": which is optimized for use in Android projects
+
+### Maven
+
+You can can include Tink in Java projects projects using
+[Maven](https://maven.apache.org/).
+
+The Maven group ID is `com.google.crypto.tink`, and the artifact ID is `tink`.
+
+You can specify the current release of Tink as a project dependency using the
+following configuration:
 
 ```xml
-<dependency>
-  <groupId>com.google.crypto.tink</groupId>
-  <artifactId>tink</artifactId>
-  <version>1.2.2</version>
-</dependency>
+<dependencies>
+  <dependency>
+    <groupId>com.google.crypto.tink</groupId>
+    <artifactId>tink</artifactId>
+    <version>1.3.0-rc2</version>
+  </dependency>
+</dependencies>
 ```
 
-Android developers can add Tink using Gradle:
-
-```
-dependencies {
-  compile 'com.google.crypto.tink:tink-android:1.2.2'
-}
-```
-
-### Snapshots
-
-Snapshots of Tink built from the master branch are available through Maven using
-version `HEAD-SNAPSHOT`.
-
-To add a dependency using Maven:
+You can specify the latest snapshot as a project dependency by using the version
+`HEAD-SNAPSHOT`:
 
 ```xml
 <repositories>
-<repository>
-  <id>sonatype-snapshots</id>
-  <name>sonatype-snapshots</name>
-  <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
-  <snapshots>
-    <enabled>true</enabled>
-    <updatePolicy>always</updatePolicy>
-  </snapshots>
-  <releases>
-    <updatePolicy>always</updatePolicy>
-  </releases>
-</repository>
+  <repository>
+    <id>sonatype-snapshots</id>
+    <name>sonatype-snapshots</name>
+    <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
+    <snapshots>
+      <enabled>true</enabled>
+      <updatePolicy>always</updatePolicy>
+    </snapshots>
+    <releases>
+      <updatePolicy>always</updatePolicy>
+    </releases>
+  </repository>
 </repositories>
 
-<dependency>
-  <groupId>com.google.crypto.tink</groupId>
-  <artifactId>tink</artifactId>
-  <version>HEAD-SNAPSHOT</version>
-</dependency>
+...
+
+<dependencies>
+  <dependency>
+    <groupId>com.google.crypto.tink</groupId>
+    <artifactId>tink</artifactId>
+    <version>HEAD-SNAPSHOT</version>
+  </dependency>
+</dependencies>
 ```
 
-To add a dependency using Gradle:
+### Gradle
+
+You can include Tink in Android projects using [Gradle](https://gradle.org).
+
+You can specify the current release of Tink as a project dependency using the
+following configuration:
+
+```
+dependencies {
+  compile 'com.google.crypto.tink:tink-android:1.3.0-rc2'
+}
+```
+
+You can specify the latest snapshot as a project dependency using the following
+configuration:
 
 ```
 repositories {
@@ -79,34 +96,34 @@
 }
 ```
 
-## API docs
+## API documentation
 
 *   Java:
-    *   [1.2.1](https://google.github.com/tink/javadoc/tink/1.2.1)
+    *   [1.3.0-rc2](https://google.github.com/tink/javadoc/tink/1.3.0-rc2)
     *   [HEAD-SNAPSHOT](https://google.github.com/tink/javadoc/tink/HEAD-SNAPSHOT)
 *   Android:
-    *   [1.2.1](https://google.github.com/tink/javadoc/tink-android/1.2.1)
+    *   [1.3.0-rc2](https://google.github.com/tink/javadoc/tink-android/1.3.0-rc2)
     *   [HEAD-SNAPSHOT](https://google.github.com/tink/javadoc/tink-android/HEAD-SNAPSHOT)
 
-## Important Warnings
+## Important warnings
 
-Do not use APIs including fields and methods marked with the `@Alpha`
-annotation. They can be modified in any way, or even removed, at any time. They
-are in the package, but not for official, production release, but only for
+**Do not use APIs which have fields or methods marked with the `@Alpha`
+annotation.** They can be modified in any way, or even removed, at any time.
+They are in the package, but not for official, production release, but only for
 testing.
 
-Do not use APIs in the `com.google.crypto.tink.subtle`. While they're generally
+**Do not use APIs in `com.google.crypto.tink.subtle`.** While they're generally
 safe to use, they're not meant for public consumption and can be modified in any
 way, or even removed, at any time.
 
 ## Initializing Tink
 
-Tink provides customizable initialization, which allows for choosing specific
+Tink provides customizable initialization, which allows you to choose specific
 implementations (identified by _key types_) of desired primitives. This
 initialization happens via _registration_ of the implementations.
 
 For example, if you want to use all implementations of all primitives in Tink,
-the initialization would look as follows:
+the initialization would be:
 
 ```java
     import com.google.crypto.tink.config.TinkConfig;
@@ -122,8 +139,8 @@
     AeadConfig.register();
 ```
 
-For custom initialization the registration proceeds directly via
-`Registry`-class:
+For custom initialization the registration proceeds directly via the
+`Registry` class:
 
 ```java
     import com.google.crypto.tink.Registry;
@@ -134,14 +151,14 @@
 
 ```
 
-## Generating New Key(set)s
+## Generating new keys and keysets
 
 Each `KeyManager`-implementation provides `newKey(..)`-methods that generate new
-keys of the corresponding key type. However to avoid accidental leakage of
-sensitive key material you should be careful with mixing key(set) generation
-with key(set) usage in code. To support the separation between these activities
-Tink package provides a command-line tool called [Tinkey](TINKEY.md), which can
-be used for common key management tasks.
+keys of the corresponding key type. However, to avoid accidental leakage of
+sensitive key material, you should avoid mixing key(set) generation with
+key(set) usage in code. To support the separation between these activities, Tink
+provides a command-line tool called [Tinkey](TINKEY.md), which can be used for
+common key management tasks.
 
 Still, if there is a need to generate a KeysetHandle with fresh key material
 directly in Java code, you can use
@@ -165,7 +182,7 @@
 [HybridKeyTemplates](https://github.com/google/tink/blob/master/java/src/main/java/com/google/crypto/tink/hybrid/HybridKeyTemplates.java),
 respectively.
 
-## Storing Keysets
+## Storing keysets
 
 After generating key material, you might want to persist it to a storage system,
 e.g., writing to a file:
@@ -179,7 +196,7 @@
 
     // Generate the key material...
     KeysetHandle keysetHandle = KeysetHandle.generateNew(
-        AeadKeyTemplates.AES_128_GCM);
+        AeadKeyTemplates.AES128_GCM);
 
     // and write it to a file.
     String keysetFilename = "my_keyset.json";
@@ -188,12 +205,11 @@
 ```
 
 Storing cleartext keysets on disk is not recommended. Tink supports encrypting
-keysets with master keys stored in a remote [key management
+keysets with master keys stored in remote [key management
 systems](KEY-MANAGEMENT.md).
 
-For example, you can encrypt the key material with a Google Cloud KMS key at
-`gcp-kms://projects/tink-examples/locations/global/keyRings/foo/cryptoKeys/bar`
-as follows:
+For example, you can encrypt the key material with a key stored in Google Cloud
+KMS key as follows:
 
 ```java
     import com.google.crypto.tink.JsonKeysetWriter;
@@ -204,7 +220,7 @@
 
     // Generate the key material...
     KeysetHandle keysetHandle = KeysetHandle.generateNew(
-        AeadKeyTemplates.AES_128_GCM);
+        AeadKeyTemplates.AES128_GCM);
 
     // and write it to a file...
     String keysetFilename = "my_keyset.json";
@@ -214,9 +230,9 @@
         new GcpKmsClient().getAead(masterKeyUri));
 ```
 
-## Loading Existing Keysets
+## Loading existing keysets
 
-To load encrypted keysets, you can use
+To load encrypted keysets, use
 [`KeysetHandle`](https://github.com/google/tink/blob/master/java/src/main/java/com/google/crypto/tink/KeysetHandle.java):
 
 ```java
@@ -246,39 +262,27 @@
         JsonKeysetReader.withFile(new File(keysetFilename)));
 ```
 
-## Obtaining and Using Primitives
+## Obtaining and using primitives
 
-[_Primitives_](PRIMITIVES.md) represent cryptographic operations offered by
-Tink, hence they form the core of Tink API. A primitive is just an interface
-that specifies what operations are offered by the primitive. A primitive can
-have multiple implementations, and user chooses a desired implementation by
-using a key of corresponding type (see the [this
-section](KEY-MANAGEMENT.md#key-keyset-and-keysethandle) for details).
+[Primitives](PRIMITIVES.md) represent cryptographic operations offered by Tink,
+hence they form the core of the Tink API. A primitive is an interface which
+specifies what operations are offered by the primitive. A primitive can have
+multiple implementations, and you choose a desired implementation by using a key
+of a corresponding type (see [this
+document](KEY-MANAGEMENT.md#key-keyset-and-keysethandle) for further details).
 
-The following table summarizes Java implementations of primitives that are
-currently available or planned (the latter are listed in brackets).
+A list of primitives and the implemenations currently supported by Tink in Java
+can be found [here](PRIMITIVES.md#java).
 
-| Primitive          | Implementations                                                 |
-| ------------------ | --------------------------------------------------------------- |
-| AEAD               | AES-EAX, AES-GCM, AES-CTR-HMAC, KMS Envelope, CHACHA20-POLY1305 |
-| Streaming AEAD     | AES-GCM-HKDF-STREAMING, AES-CTR-HMAC-STREAMING                  |
-| Deterministic AEAD | AES-SIV                                                         |
-| MAC                | HMAC-SHA2                                                       |
-| Digital Signatures | ECDSA over NIST curves, ED25519                                 |
-| Hybrid Encryption  | ECIES with AEAD and HKDF, (NaCl CryptoBox)                      |
-
-Exact listings of primitives and their implementations available in a release _x.y.z_ of Tink
-are given in a corresponding [`TinkConfig.TINK_x_y_z`](https://github.com/google/tink/blob/master/java/src/main/java/com/google/crypto/tink/config/TinkConfig.java)-variable.
-
-The user obtains a primitive by calling the function `getPrimitive(classObject)`
-of the `KeysetHandle`, where the `classObject` is the class object corresponding
-to the primitive (for example `Aead.class` for AEAD).
+You obtain a primitive by calling the method `getPrimitive(classObject)` of a
+`KeysetHandle`, where the `classObject` is the class object corresponding to the
+primitive (for example `Aead.class` for AEAD).
 
 ### Symmetric Key Encryption
 
-Here is how you can obtain and use an [AEAD (Authenticated Encryption with
-Associated Data](PRIMITIVES.md#authenticated-encryption-with-associated-data)
-primitive to encrypt or decrypt data:
+You can obtain and use an [AEAD (Authenticated Encryption with Associated
+Data](PRIMITIVES.md#authenticated-encryption-with-associated-data) primitive to
+encrypt or decrypt data:
 
 ```java
     import com.google.crypto.tink.Aead;
@@ -299,10 +303,10 @@
     byte[] decrypted = aead.decrypt(ciphertext, aad);
 ```
 
-### Deterministic Symmetric Key Encryption
+### Deterministic symmetric key encryption
 
-Here is how you can obtain and use an [DeterministicAEAD (Deterministic
-Authenticated Encryption with Associated
+You can obtain and use a [DeterministicAEAD (Deterministic Authenticated
+Encryption with Associated
 Data](PRIMITIVES.md#deterministic-authenticated-encryption-with-associated-data)
 primitive to encrypt or decrypt data:
 
@@ -326,9 +330,9 @@
     byte[] decrypted = daead.decryptDeterministically(ciphertext, aad);
 ```
 
-### Symmetric Key Encryption of Streaming Data
+### Symmetric key encryption of streaming data
 
-Here is how you can obtain and use an [Streaming AEAD (Streaming Authenticated Encryption with
+You can obtain and use a [Streaming AEAD (Streaming Authenticated Encryption with
 Associated Data)](PRIMITIVES.md#streaming-authenticated-encryption-with-associated-data) primitive
 to encrypt or decrypt data streams:
 
@@ -385,7 +389,7 @@
 
 ### Message Authentication Code
 
-The following snippets shows how to compute or verify a [MAC (Message
+You can compute or verify a [MAC (Message
 Authentication Code)](PRIMITIVES.md#message-authentication-code):
 
 ```java
@@ -407,9 +411,9 @@
     mac.verifyMac(tag, data);
 ```
 
-### Digitial Signatures
+### Digital signatures
 
-Here is an example of how to sign or verify a [digital
+You can sign or verify a [digital
 signature](PRIMITIVES.md#digital-signatures):
 
 ```java
@@ -443,7 +447,7 @@
     verifier.verify(signature, data);
 ```
 
-### Hybrid Encryption
+### Hybrid encryption
 
 To encrypt or decrypt using [a combination of public key encryption and
 symmetric key encryption](PRIMITIVES.md#hybrid-encryption) one can
@@ -482,18 +486,21 @@
     byte[] plaintext = hybridDecrypt.decrypt(ciphertext, contextInfo);
 ```
 
-### Envelope Encryption
+### Envelope encryption
 
-Via the AEAD interface, Tink supports
-[envelope](http://docs.aws.amazon.com/kms/latest/developerguide/workflow.html)
-[encryption](https://cloud.google.com/kms/docs/data-encryption-keys) (a.k.a. KMS
-Envelope) which is getting popular with Cloud users.
+Via the AEAD interface, Tink supports envelope encryption, which is getting
+popular with Cloud users.
 
-In this mode, Cloud users first create a key encryption key (KEK) in a Key
+For more context, reference the following cloud service provider documentation:
+
+* [Amazon Web Services](http://docs.aws.amazon.com/kms/latest/developerguide/workflow.html)
+* [Google Cloud Platform](https://cloud.google.com/kms/docs/data-encryption-keys)
+
+In this mode, you first create a key encryption key (KEK) in a Key
 Management System (KMS) such as AWS KMS or Google Cloud KMS. To encrypt some
-data, users then generate locally a data encryption key (DEK), encrypt data with
-the DEK, ask the KMS to encrypt the DEK with the KEK, and stores the encrypted
-DEK with the encrypted data. At a later point Cloud users can retrieve encrypted
+data, you then generate locally a data encryption key (DEK), encrypt data with
+the DEK, ask the KMS to encrypt the DEK with the KEK, and store the encrypted
+DEK with the encrypted data. At a later point, you can retrieve the encrypted
 data and the DEK, ask the KMS to decrypt DEK, and use the decrypted DEK to
 decrypt the data.
 
@@ -525,14 +532,16 @@
     byte[] ciphertext = aead.encrypt(plaintext, aad);
 ```
 
-## Key Rotation
+## Key rotation
 
-The support for key rotation in Tink is provided via
-[`KeysetManager`](https://github.com/google/tink/blob/master/java/src/main/java/com/google/crypto/tink/KeysetManager.java)-class.
+Support for key rotation in Tink is provided via the
+[`KeysetManager`](https://github.com/google/tink/blob/master/java/src/main/java/com/google/crypto/tink/KeysetManager.java)
+class.
 
 You have to provide a `KeysetHandle`-object that contains the keyset that should
 be rotated, and a specification of the new key via a
-[`KeyTemplate`](https://github.com/google/tink/blob/master/proto/tink.proto#L50)-message.
+[`KeyTemplate`](https://github.com/google/tink/blob/master/proto/tink.proto#L50)
+message.
 
 ```java
     import com.google.crypto.tink.KeysetHandle;
@@ -548,39 +557,40 @@
         .getKeysetHandle();
 ```
 
-Some common specifications are available as pre-generated templates
-in [examples/keytemplates](https://github.com/google/tink/tree/master/examples/keytemplates)-folder,
-and can be accessed via `...KeyTemplates.java` classes of the respective
-primitives.  After a successful rotation the resulting keyset contains a new key
-generated according to the specification in `keyTemplate`, and the new key
-becomes the _primary key_ of the keyset.  For the rotation to succeed the
-`Registry` must contain a key manager for the key type specified in
-`keyTemplate`.
+Some common specifications are available as pre-generated templates in
+[examples/keytemplates](https://github.com/google/tink/tree/master/examples/keytemplates),
+and can be accessed via the `...KeyTemplates.java` classes of the respective
+primitives.
+
+After a successful rotation, the resulting keyset contains a new key generated
+according to the specification in `keyTemplate`, and the new key becomes the
+_primary key_ of the keyset.  For the rotation to succeed the `Registry` must
+contain a key manager for the key type specified in `keyTemplate`.
 
 Alternatively, you can use [Tinkey](TINKEY.md) to rotate or manage a keyset.
 
-## Custom Implementation of a Primitive
+## Custom implementation of a primitive
 
-**NOTE**: The usage of **custom key managers should be enjoyed
-responsibly**: we (i.e. Tink developers) have no way checking or enforcing that
-a custom implementation satisfies security properties of the corresponding
-primitive interface, so it is up to the implementer and the user of the custom
-implementation ensure the required properties.
+**NOTE**: The usage of **custom key managers should be enjoyed responsibly**. We
+(i.e. Tink developers) have no way of checking or enforcing that a custom
+implementation satisfies security properties of the corresponding primitive
+interface, so it is up to the implementer and the user of the custom
+implementation ensure the required properties are met.
 
-**TIP** For a working example, please check out the
+**TIP**: For a working example, please check out the
 [AES-CBC-HMAC](https://github.com/thaidn/tink-examples/blob/master/timestamper/src/main/java/com/timestamper/AesCbcHmacKeyManager.java)
 implementation of the AEAD primitive in the
 [timestamper](https://github.com/thaidn/tink-examples/tree/master/timestamper)
 example.
 
 The main cryptographic operations offered by Tink are accessible via so-called
-_primitives_, which essentially are interfaces that represent corresponding
-cryptographic functionalities. While Tink comes with several standard
-implementations of common primitives, it allows also for adding custom
-implementations of primitives. Such implementations allow for seamless
-integration of Tink with custom third-party cryptographic schemes or hardware
-modules, and in combination with [key rotation](#key-rotation)-features enable
-painless migration between cryptographic schemes.
+_primitives_, which are interfaces that represent corresponding cryptographic
+functionalities. While Tink comes with several standard implementations of
+common primitives, it also allows for adding custom implementations of
+primitives. Such implementations allow for seamless integration of Tink with
+custom third-party cryptographic schemes or hardware modules, and in combination
+with [key rotation](#key-rotation) features, enables the painless migration
+between cryptographic schemes.
 
 To create a custom implementation of a primitive proceed as follows:
 
@@ -588,13 +598,13 @@
 2.  Define protocol buffers that hold key material and parameters for the custom
     cryptographic scheme; the name of the key protocol buffer (a.k.a. type URL)
     determines the _key type_ for the custom implementation.
-3.  Implement
+3.  Implement a
     [`KeyManager`](https://github.com/google/tink/blob/master/java/src/main/java/com/google/crypto/tink/KeyManager.java)
     interface for the _primitive_ from step #1 and the _key type_ from step #2.
 
 To use a custom implementation of a primitive in an application, register with
 the [`Registry`](https://github.com/google/tink/blob/master/java/src/main/java/com/google/crypto/tink/Registry.java)
-the custom `KeyManager`-implementation (from step #3 above) for the custom key
+the custom `KeyManager` implementation (from step #3 above) for the custom key
 type (from step #2 above):
 
 ```java
@@ -612,13 +622,13 @@
  * `...Params`: parameters of an instantiation of the primitive,
    needed when a key is being used.
  * `...Key`: the actual key proto, contains the key material and the
-   corresponding `...Params`-proto.
+   corresponding `...Params` proto.
  * `...KeyFormat`: parameters needed to generate a new key.
 
-Here are a few conventions/recommendations wrt. defining these messages
-(see [tink.proto](https://github.com/google/tink/blob/master/proto/tink.proto)
-and definitions of [existing key types](https://github.com/google/tink/blob/master/proto/)
-for details):
+Here are a few conventions/recommendations when defining these messages (see
+[tink.proto](https://github.com/google/tink/blob/master/proto/tink.proto) and
+definitions of [existing key
+types](https://github.com/google/tink/blob/master/proto/) for details):
 
  * `...Key` should contain a version field (a monotonic counter, `uint32 version;`),
    which identifies the version of implementation that can work with this key.
@@ -628,19 +638,20 @@
    one has all information it needs to generate a new `...Key` message.
 
 Alternatively, depending on the use case requirements, you can skip step #2
-entirely and re-use for the key material an existing protocol buffer messages.
-In such a case you should not configure the Registry via the `Config`-class, but
+entirely and re-use an existing protocol buffer messages for the key material.
+In such a case, you should not configure the Registry via the `Config`-class, but
 rather register the needed `KeyManager`-instances manually.
 
 For a concrete example, let's assume that we'd like a custom implementation of
-[`Aead`](https://github.com/google/tink/blob/master/java/src/main/java/com/google/crypto/tink/Aead.java)-primitive
-(step #1). We define then three protocol buffer messages (step #2):
+the
+[`Aead`](https://github.com/google/tink/blob/master/java/src/main/java/com/google/crypto/tink/Aead.java)
+primitive (step #1). We define then three protocol buffer messages (step #2):
 
  * `MyCustomAeadParams`: holds parameters needed for the use of the key material.
  * `MyCustomAeadKey`: holds the actual key material and parameters needed for its use.
  * `MyCustomAeadKeyFormat`: holds parameters needed for generation of a new `MyCustomAeadKey`-key.
 
-```protocol-buffer
+```proto
     syntax = "proto3";
     package mycompany.mypackage;
 
@@ -676,5 +687,5 @@
     }
 ```
 
-After registering `MyCustomAeadKeyManager` with the Registry it will be used
-when a user calls `keysetHandle.getPrimitive(Aead.class)`.
+After registering `MyCustomAeadKeyManager` with the Registry, it will be used
+when you call `keysetHandle.getPrimitive(Aead.class)`.
diff --git a/docs/OBJC-HOWTO.md b/docs/OBJC-HOWTO.md
index 721d48a..b99deb9 100644
--- a/docs/OBJC-HOWTO.md
+++ b/docs/OBJC-HOWTO.md
@@ -1,17 +1,18 @@
 # Tink for Obj-C HOW-TO
 
-The following subsections present instructions and/or Obj-C snippets for some
-common tasks in [Tink](https://github.com/google/tink).
+This document contains instructions and Obj-C code snippets for common tasks in
+[Tink](https://github.com/google/tink).
 
-## Installing Tink
+## Setup intructions
 
 Tink is released as a [Cocoapod](https://cocoapods.org/). It can be installed by
-using the pod command as described below.
+using the pod command as described below, which is the recommended way to use
+Tink.
 
-We also provide step-by-step instructions on how to build and use Tink from
-source. However, Cocoapods is the recommended way to use Tink.
+We also provide step-by-step instructions on building and using Tink from
+source.
 
-#### Supported Platforms
+#### Supported platforms
 
  * iOS 9.0 or newer
  * Xcode 9.2 or newer
@@ -29,17 +30,18 @@
    ```sh
    pod init
    ```
+
    This command creates a file called Podfile.
 
 3. Edit the Podfile.
 
-   For a stable release, add the following line:
+   For the current stable release, add the following line:
 
    ```
    pod 'Tink'
    ```
 
-   For a pre-release use the following line instead:
+   For a particular version, use a line like the following instead:
 
    ```
    pod 'Tink', '1.2.0-rc2'
@@ -69,7 +71,7 @@
    #import "Tink/TINKAead.h"
    ```
 
-### Installing from the source
+### Installing from source
 
 #### Prerequisites
 
@@ -81,13 +83,13 @@
 
 #### Step-by-step instructions
 
-1.  Clone Tink from GitHub:
+1.  Clone Tink from GitHub.
 
     ```sh
     git clone https://github.com/google/tink/
     ```
 
-2.  Build the library and generate a static iOS framework:
+2.  Build the library and generate a static iOS framework.
 
     ```sh
     cd tink
@@ -109,7 +111,7 @@
         the App Store you should generate a framework that includes only the ARM
         architectures and link it to your binary.
 
-3.  Unzip Tink\_framework.zip into your Xcode project folder:
+3.  Unzip Tink\_framework.zip into your Xcode project folder.
 
     ```sh
     unzip bazel-bin/objc/Tink_framework.zip -d /path/to/your/project/folder/
@@ -129,10 +131,21 @@
 
     *   Find `Other Linker Flags` and add `-lc++`
 
-5.  Start using Tink in your code:
+5.  Start using Tink in your code.
 
-    Add `#import "Tink/Tink.h"` in your code and start using
-    Tink.
+   You can import the umbrella header:
+
+   ```objc
+   #import "Tink/Tink.h"
+   ```
+
+   Or individual headers:
+
+   ```objc
+   #import "Tink/TINKAeadConfig.h"
+   #import "Tink/TINKAeadKeyTemplate.h"
+   #import "Tink/TINKAead.h"
+   ```
 
 ## Initializing Tink
 
@@ -175,17 +188,17 @@
     }
 ```
 
-## Generating New Key(set)s
+## Generating new keys and keysets
 
-To avoid accidental leakage of sensitive key material one should be careful
-mixing keyset generation and usage in code. To support the separation
-between these activities the Tink package provides a command-line tool called
+To avoid accidental leakage of sensitive key material, you should avoid mixing
+keyset generation and usage in code. To support the separation between these
+activities the Tink package provides a command-line tool called
 [Tinkey](TINKEY.md), which can be used for common key management tasks.
 
 Still, if there is a need to generate a KeysetHandle with fresh key material
 directly in Obj-C code, one can use
 [`TINKKeysetHandle`](https://github.com/google/tink/blob/master/objc/TINKKeysetHandle.h)
-with one of the available KeyTemplates (AeadKeyTemplate, HybridKeyTemplate etc):
+with one of the available KeyTemplates (AeadKeyTemplate, HybridKeyTemplate, etc.):
 
 ```objc
     #import "Tink/TINKAeadKeyTemplate.h"
@@ -203,7 +216,7 @@
     }
 ```
 
-## Storing Keysets
+## Storing keysets
 
 After generating key material, you might want to persist it to a storage system.
 Tink supports storing keysets to the iOS keychain where they remain encrypted:
@@ -231,7 +244,7 @@
 These settings prevent the keysets from leaving the device and keep them
 encrypted until the device is unlocked once.
 
-## Loading Existing Keysets
+## Loading existing keysets
 
 To load keysets from the iOS keychain:
 
@@ -275,35 +288,29 @@
     }
 ```
 
-## Obtaining and Using Primitives
+## Obtaining and using primitives
 
 [_Primitives_](PRIMITIVES.md) represent cryptographic operations offered by
 Tink, hence they form the core of Tink API. A primitive is just an interface
 that specifies what operations are offered by the primitive. A primitive can
-have multiple implementations, and user chooses a desired implementation by
-using a key of corresponding type (see the [this
-section](KEY-MANAGEMENT.md#key-keyset-and-keysethandle) for details).
+have multiple implementations, and you choose a desired implementation by using
+a key of corresponding type (see the [this
+section](KEY-MANAGEMENT.md#key-keyset-and-keysethandle) for details).  A list of
+primitives and their implemenations currently supported by Tink in Objective-C
+can be found [here](PRIMITIVES.md#objective-c).
 
-The following table summarizes Obj-C implementations of primitives that are
-currently available or planned (the latter are listed in brackets).
+You access implementations of a primitive via a factory that corresponds to the
+primitive which offers corresponding `primitiveWithKeysetHandle:error:` methods.
 
-Primitive          | Implementations
------------------- | ---------------------------------
-AEAD               | AES-GCM, AES-CTR-HMAC, AES-EAX
-MAC                | HMAC-SHA2
-Digital Signatures | ECDSA over NIST curves, (Ed25519)
-Hybrid Encryption  | ECIES with AEAD and HKDF
+*  AEAD via `TINKAeadFactory`
+*  MAC via `TINKMacFactory`
+*  etc.
 
-Tink user accesses implementations of a primitive via a factory that corresponds
-to the primitive: AEAD via `TINKAeadFactory`, MAC via `TINKMacFactory`, etc.
-where each factory offers corresponding `primitiveWithKeysetHandle:error:`
-methods.
+### Symmetric key encryption
 
-### Symmetric Key Encryption
-
-Here is how you can obtain and use an [AEAD (Authenticated Encryption with
-Associated Data](PRIMITIVES.md#authenticated-encryption-with-associated-data)
-primitive to encrypt or decrypt data:
+You can use an [AEAD (Authenticated Encryption with Associated
+Data)](PRIMITIVES.md#authenticated-encryption-with-associated-data) primitive to
+encrypt or decrypt data:
 
 ```objc
     #import "Tink/TINKAead.h"
@@ -327,7 +334,7 @@
     }
 ```
 
-### Hybrid Encryption
+### Hybrid encryption
 
 To decrypt using [a combination of public key encryption and symmetric key
 encryption](PRIMITIVES.md#hybrid-encryption):
diff --git a/docs/PRIMITIVES.md b/docs/PRIMITIVES.md
index a6fc302..9cc3679 100644
--- a/docs/PRIMITIVES.md
+++ b/docs/PRIMITIVES.md
@@ -5,14 +5,75 @@
 functionality.  Currently Tink supports the following cryptographic operations
 via the corresponding primitives:
 
-- authenticated encryption with associated data (primitive: AEAD)
-- message authentication codes (primitive: MAC),
-- digital signatures (primitives: PublicKeySign and PublicKeyVerify)
-- hybrid encryption (primitives: HybridEncrypt and HybridDecrypt).
+-   authenticated encryption with associated data (primitive: AEAD)
+-   *streaming* authenticated encryption with associated data (primitive:
+    StreamingAead)
+-   *deterministic* authenticated encryption with associated data (primitive:
+    DeterministicAead)
+-   message authentication codes (primitive: MAC),
+-   digital signatures (primitives: PublicKeySign and PublicKeyVerify)
+-   hybrid encryption (primitives: HybridEncrypt and HybridDecrypt).
 
-This document describes the main properties of Tink’s primitives.
+The tables in the section below summarise the current implementations of
+primitives available in the corresponding languages, and the subsequent sections
+describe the main properties of Tink primitives.
 
-General properties of all primitives:
+## Supported primitives and their implementations
+
+**Primitive**      | **Java** | **C++** | **ObjC** | **Go**
+------------------ | -------- | ------- | -------- | ------
+AEAD               | yes      | yes     | yes      | yes
+Streaming AEAD     | yes      | yes     | no       | no
+Deterministic AEAD | yes      | yes     | yes      | yes
+MAC                | yes      | yes     | yes      | yes
+Digital Signatures | yes      | yes     | yes      | yes
+Hybrid Encryption  | yes      | yes     | yes      | yes
+
+In development: JavaScript and Python.
+
+### Java
+
+Primitive          | Java Implementations
+------------------ | ---------------------------------------------------------------------------------
+AEAD               | AES-EAX, AES-GCM, AES-CTR-HMAC, KMS Envelope, CHACHA20-POLY1305, XCHACHA-POLY1305
+Streaming AEAD     | AES-GCM-HKDF-STREAMING, AES-CTR-HMAC-STREAMING
+Deterministic AEAD | AES-SIV
+MAC                | HMAC-SHA2
+Digital Signatures | ECDSA over NIST curves, Ed25519, RSA-SSA-PKCS1, RSA-SSA-PSS
+Hybrid Encryption  | ECIES with AEAD and HKDF
+
+### C++
+
+Primitive          | C++ Implementations
+------------------ | ----------------------------------------------------------------
+AEAD               | AES-GCM, AES-CTR-HMAC, AES-EAX, KMS Envelope, XCHACHA20-POLY1305
+Streaming AEAD     | AES-GCM-HKDF-STREAMING, AES-CTR-HMAC-STREAMING
+Deterministic AEAD | AES-SIV
+MAC                | HMAC-SHA2, AES-CMAC
+Digital Signatures | ECDSA over NIST curves, Ed25519, RSA-SSA-PKCS1, RSA-SSA-PSS
+Hybrid Encryption  | ECIES with AEAD and HKDF
+
+### Objective-C
+
+Primitive          | Objective-C Implementations
+------------------ | -----------------------------------------------------------
+AEAD               | AES-GCM, AES-CTR-HMAC, AES-EAX, XCHACHA20-POLY1305
+Deterministic AEAD | AES-SIV
+MAC                | HMAC-SHA2
+Digital Signatures | ECDSA over NIST curves, Ed25519, RSA-SSA-PKCS1, RSA-SSA-PSS
+Hybrid Encryption  | ECIES with AEAD and HKDF
+
+### Golang
+
+Primitive          | Golang Implementations
+------------------ | ----------------------------------------------------------
+AEAD               | AES-GCM, AES-CTR-HMAC, CHACHA20-PLOY1305, XCHACHA-POLY1305
+Deterministic AEAD | AES-SIV
+MAC                | HMAC-SHA2
+Digital Signatures | ECDSA over NIST curves, Ed25519
+Hybrid Encryption  | ECIES with AEAD and HKDF
+
+## General properties of all primitives:
 
 - stateless (hence thread-safe)
 - copy-safe (for the parameters)
@@ -22,12 +83,17 @@
 
 AEAD primitive (Authenticated Encryption with Associated Data) provides
 functionality of symmetric authenticated encryption. Implementations of this
-primitive are secure against adaptive chosen ciphertext attacks.  When
-encrypting a plaintext one can optionally provide _associated data_ that should
-be authenticated but not encrypted. That is, the encryption with associated data
-ensures authenticity (ie. who the sender is) and integrity (ie. data has not
-been tampered with) of that data, but not its secrecy
-(see [RFC 5116](https://tools.ietf.org/html/rfc5116)).
+primitive are secure against adaptive chosen ciphertext attacks.
+
+When encrypting a plaintext one can optionally provide _associated data_ that
+should be authenticated but not encrypted. That is, the encryption with
+associated data ensures authenticity (ie. who the sender is) and integrity (ie.
+data has not been tampered with) of that data, but not its secrecy (see
+[RFC 5116](https://tools.ietf.org/html/rfc5116)). This is often used for binding
+encryptions to a context. For example, in a banking database the contents of a
+row (e.g. bank account balance) can be encrypted using the customer's id as
+_associated data_. This would prevent swapping encrypted data between customers'
+records.
 
 Minimal properties:
 
diff --git a/docs/TINKEY.md b/docs/TINKEY.md
index 4fdb79e..44a0fe6 100644
--- a/docs/TINKEY.md
+++ b/docs/TINKEY.md
@@ -68,7 +68,7 @@
 -   List metadata of keys in a keyset:
 
 ```shell
-tinkey list-keys --in private-keyset.cfg
+tinkey list-keyset --in private-keyset.cfg
 ```
 
 -   Create a public keyset from a private keyset
diff --git a/examples/BUILD.bazel b/examples/BUILD.bazel
index f631b6d..e6d05e7 100644
--- a/examples/BUILD.bazel
+++ b/examples/BUILD.bazel
@@ -1,3 +1,3 @@
 package(default_visibility = ["//visibility:public"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
diff --git a/examples/digital_signatures/cc/BUILD.bazel b/examples/digital_signatures/cc/BUILD.bazel
new file mode 100644
index 0000000..7074b17
--- /dev/null
+++ b/examples/digital_signatures/cc/BUILD.bazel
@@ -0,0 +1,38 @@
+package(default_visibility = ["//visibility:public"])
+
+licenses(["notice"])
+
+cc_library(
+    name = "util",
+    srcs = ["util.cc"],
+    hdrs = ["util.h"],
+    deps = [
+        "//cc:binary_keyset_reader",
+        "//cc:binary_keyset_writer",
+        "//cc:cleartext_keyset_handle",
+        "//cc:config",
+        "//cc:keyset_handle",
+        "//cc:keyset_reader",
+        "//cc:keyset_writer",
+        "//cc/config:tink_config",
+        "//cc/util:status",
+    ],
+)
+
+cc_binary(
+    name = "digital_signatures_cli",
+    srcs = ["digital_signatures_cli.cc"],
+    deps = [
+        ":util",
+        "//cc:public_key_sign",
+        "//cc:public_key_verify",
+        "//cc/signature:signature_key_templates",
+    ],
+)
+
+sh_test(
+    name = "digital_signatures_cli_test",
+    size = "small",
+    srcs = ["digital_signatures_cli_test.sh"],
+    data = [":digital_signatures_cli"],
+)
diff --git a/examples/digital_signatures/cc/README.md b/examples/digital_signatures/cc/README.md
new file mode 100644
index 0000000..3ad1723
--- /dev/null
+++ b/examples/digital_signatures/cc/README.md
@@ -0,0 +1,30 @@
+# C++ Digital Signatures CLI
+
+This is a command-line tool that can generate
+[Digital Signature](../../../docs/PRIMITIVES.md#digital-signatures)
+keys, and create and verify digital signatures.
+
+It demonstrates the basic steps of using Tink, namely loading key material,
+obtaining a primitive, and using the primitive to do crypto.
+
+Moreover, since this app shares the same Bazel WORKSPACE with Tink, its BUILD
+file can directly depend on Tink.
+
+## Build and Run
+
+### Bazel
+
+```shell
+git clone https://github.com/google/tink
+cd tink
+bazel build ...
+echo "a message" > message.txt
+./bazel-bin/examples/digital_signatures/cc/digital_signatures_cli gen-private-key private_keyset.bin
+./bazel-bin/examples/digital_signatures/cc/digital_signatures_cli get-public-key private_keyset.bin \
+    public_keyset.bin
+./bazel-bin/examples/digital_signatures/cc/digital_signatures_cli sign private_keyset.bin \
+    message.txt signature.bin
+./bazel-bin/examples/digital_signatures/cc/digital_signatures_cli verify public_keyset.bin \
+    message.txt signature.bin result.txt
+cat result.txt
+```
diff --git a/examples/digital_signatures/cc/digital_signatures_cli.cc b/examples/digital_signatures/cc/digital_signatures_cli.cc
new file mode 100644
index 0000000..51162fb
--- /dev/null
+++ b/examples/digital_signatures/cc/digital_signatures_cli.cc
@@ -0,0 +1,255 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+// A command-line utility for generating Digital Signatures keys, and creating
+// and verifying digital signatures.
+//
+// The first argument is the operation and it should be one of the following:
+// gen-private-key get-public-key sign verify.
+// Additional arguments depend on the operation.
+//
+// gen-private-key
+//   Generates a new private keyset using the RsaSsaPkcs13072Sha256F4 template.
+//   It requires 1 additional argument:
+//     output-file: name of the file for the resulting output
+//
+// get-public-key
+//   Extracts a public keyset associated with the given private keyset.
+//   It requires 2 additional arguments:
+//     private-keyset-file: name of the file with the private keyset
+//     output-file: name of the file for the resulting output
+//
+// sign
+//   Signs the message using the given private keyset.
+//   It requires 3 additional arguments:
+//     private-keyset-file: name of the file with the private keyset
+//     message-file: name of the file with the message
+//     output-file: name of the file for the resulting output
+//
+// verify
+//   Verifies the signature of the message using the given public keyset.
+//   It requires 4 additional arguments:
+//     public-keyset-file: name of the file with the public keyset
+//     message-file: name of the file with the message
+//     signature-file: name of the file with the signature
+//     output-file: name of the file for the resulting output (valid/invalid)
+
+#include <iostream>
+
+#include "examples/digital_signatures/cc/util.h"
+#include "tink/signature/signature_key_templates.h"
+#include "tink/public_key_sign.h"
+#include "tink/public_key_verify.h"
+
+// Prints usage info.
+void PrintUsageInfo() {
+  std::clog << "Usage: operation arguments\n"
+            << "where operation is one of the following:\n"
+            << "  gen-private-key get-public-key sign verify\n"
+            << "and, depending on the operation, arguments are:\n"
+            << "  gen-private-key: output-file\n"
+            << "  get-public-key: private-keyset-file output-file\n"
+            << "  sign: private-keyset-file message-file output-file\n"
+            << "  verify: public-keyset-file message-file signature-file "
+            << "output-file" << std::endl;
+}
+
+// Generates a new private keyset using the RsaSsaPkcs13072Sha256F4 template
+// and writes it to the output file.
+void GeneratePrivateKey(const std::string& output_filename) {
+  std::clog << "Generating a new private keyset.." << std::endl;
+
+  auto key_template =
+      crypto::tink::SignatureKeyTemplates::RsaSsaPkcs13072Sha256F4();
+  auto new_keyset_handle_result =
+      crypto::tink::KeysetHandle::GenerateNew(key_template);
+  if (!new_keyset_handle_result.ok()) {
+    std::clog << "Generating new keyset failed: "
+              << new_keyset_handle_result.status().error_message()
+              << std::endl;
+    exit(1);
+  }
+  auto keyset_handle = std::move(new_keyset_handle_result.ValueOrDie());
+
+  std::clog << "Writing the keyset to file " << output_filename
+            << "..." << std::endl;
+
+  Util::WriteKeyset(keyset_handle, output_filename);
+}
+
+// Extracts a public keyset associated with the given private keyset
+// and writes it to the output file.
+void ExtractPublicKey(
+    const std::string& private_keyset_filename, const std::string& output_filename) {
+  std::clog << "Extracting a public keyset associated with the private "
+            << "keyset from file " << private_keyset_filename << "..."
+            << std::endl;
+
+  auto private_keyset_handle = Util::ReadKeyset(private_keyset_filename);
+
+  auto new_keyset_handle_result =
+      private_keyset_handle->GetPublicKeysetHandle();
+  if (!new_keyset_handle_result.ok()) {
+    std::clog << "Getting the keyset failed: "
+              << new_keyset_handle_result.status().error_message()
+              << std::endl;
+    exit(1);
+  }
+  auto public_keyset_handle =
+      std::move(new_keyset_handle_result.ValueOrDie());
+
+  std::clog << "Writing the keyset to file " << output_filename
+            << "..." << std::endl;
+
+  Util::WriteKeyset(public_keyset_handle, output_filename);
+}
+
+// Signs the message using the given private keyset
+// and writes the signature to the output file.
+void Sign(const std::string& keyset_filename, const std::string& message_filename,
+          const std::string& output_filename) {
+  auto keyset_handle = Util::ReadKeyset(keyset_filename);
+
+  auto primitive_result =
+      keyset_handle->GetPrimitive<crypto::tink::PublicKeySign>();
+  if (!primitive_result.ok()) {
+    std::clog << "Getting PublicKeySign-primitive from the factory failed: "
+              << primitive_result.status().error_message() << std::endl;
+    exit(1);
+  }
+  auto public_key_sign = std::move(primitive_result.ValueOrDie());
+
+  std::clog << "Signing message from file " << message_filename
+            << " using private keyset from file " << keyset_filename
+            << "..." << std::endl;
+
+  std::string message = Util::Read(message_filename);
+
+  auto sign_result = public_key_sign->Sign(message);
+  if (!sign_result.ok()) {
+    std::clog << "Error while signing the message: "
+              << sign_result.status().error_message() << std::endl;
+    exit(1);
+  }
+  std::string signature = sign_result.ValueOrDie();
+
+  std::clog << "Writing the resulting signature to file " << output_filename
+            << "..." << std::endl;
+
+  Util::Write(signature, output_filename);
+}
+
+// Verifies the signature of the message using the given public keyset
+// and writes the result to the output file.
+void Verify(const std::string& keyset_filename, const std::string& message_filename,
+          const std::string& signature_filename, const std::string& output_filename) {
+  auto keyset_handle = Util::ReadKeyset(keyset_filename);
+
+  auto primitive_result =
+      keyset_handle->GetPrimitive<crypto::tink::PublicKeyVerify>();
+  if (!primitive_result.ok()) {
+    std::clog << "Getting PublicKeyVerify-primitive from the factory "
+              << "failed: " << primitive_result.status().error_message()
+              << std::endl;
+    exit(1);
+  }
+  auto public_key_verify = std::move(primitive_result.ValueOrDie());
+
+  std::clog << "Verifying signature from file " << signature_filename
+            << " of the message from file " << message_filename
+            << " using public keyset from file " << keyset_filename
+            << "..." << std::endl;
+
+  std::string signature = Util::Read(signature_filename);
+  std::string message = Util::Read(message_filename);
+
+  std::string result;
+  auto verify_status = public_key_verify->Verify(signature, message);
+  if (!verify_status.ok()) {
+    std::clog << "Error while verifying the signature: "
+              << verify_status.error_message() << std::endl;
+    result = "invalid";
+  } else {
+    result = "valid";
+  }
+
+  std::clog << "Writing the result to file " << output_filename
+            << "..." << std::endl;
+
+  Util::Write(result, output_filename);
+}
+
+int main(int argc, char** argv) {
+  if (argc == 1) {
+    PrintUsageInfo();
+    exit(1);
+  }
+
+  Util::InitTink();
+
+  std::string operation = argv[1];
+
+  if (operation == "gen-private-key") {
+    if (argc != 3) {
+      PrintUsageInfo();
+      exit(1);
+    }
+
+    std::string output_filename = argv[2];
+
+    GeneratePrivateKey(output_filename);
+  } else if (operation == "get-public-key") {
+    if (argc != 4) {
+      PrintUsageInfo();
+      exit(1);
+    }
+
+    std::string private_keyset_filename = argv[2];
+    std::string output_filename = argv[3];
+
+    ExtractPublicKey(private_keyset_filename, output_filename);
+  } else if (operation == "sign") {
+    if (argc != 5) {
+      PrintUsageInfo();
+      exit(1);
+    }
+
+    std::string keyset_filename = argv[2];
+    std::string message_filename = argv[3];
+    std::string output_filename = argv[4];
+
+    Sign(keyset_filename, message_filename, output_filename);
+  } else if (operation == "verify") {
+    if (argc != 6) {
+      PrintUsageInfo();
+      exit(1);
+    }
+
+    std::string keyset_filename = argv[2];
+    std::string message_filename = argv[3];
+    std::string signature_filename = argv[4];
+    std::string output_filename = argv[5];
+
+    Verify(keyset_filename, message_filename, signature_filename,
+           output_filename);
+  } else {
+    std::clog << "Unknown operation. Supported operations are: "
+              << "gen-private-key get-public-key sign verify" << std::endl;
+    exit(1);
+  }
+
+  std::clog << "Done!" << std::endl;
+
+  return 0;
+}
diff --git a/examples/digital_signatures/cc/digital_signatures_cli_test.sh b/examples/digital_signatures/cc/digital_signatures_cli_test.sh
new file mode 100755
index 0000000..9176f35
--- /dev/null
+++ b/examples/digital_signatures/cc/digital_signatures_cli_test.sh
@@ -0,0 +1,113 @@
+#!/bin/bash
+
+#############################################################################
+#### Tests for digital_signatures_cli binary.
+
+ROOT_DIR="$TEST_SRCDIR/tink"
+SIGNATURE_CLI="$ROOT_DIR/examples/digital_signatures/cc/digital_signatures_cli"
+
+PRIVATE_KEYSET_FILE="$TEST_TMPDIR/private_keyset.bin"
+PUBLIC_KEYSET_FILE="$TEST_TMPDIR/public_keyset.bin"
+MESSAGE_FILE="$TEST_TMPDIR/message.txt"
+SIGNATURE_FILE="$TEST_TMPDIR/signature.bin"
+RESULT_FILE="$TEST_TMPDIR/result.txt"
+
+OTHER_PRIVATE_KEYSET_FILE="$TEST_TMPDIR/other_private_keyset.bin"
+OTHER_PUBLIC_KEYSET_FILE="$TEST_TMPDIR/other_public_keyset.bin"
+OTHER_MESSAGE_FILE="$TEST_TMPDIR/other_message.txt"
+
+echo "This is a message." > $MESSAGE_FILE
+echo "This is a different message." > $OTHER_MESSAGE_FILE
+
+#############################################################################
+#### Helper function that checks if values are equal.
+
+assert_equal() {
+  if [ "$1" == "$2" ]; then
+    echo "+++ Success: values are equal."
+  else
+    echo "--- Failure: values are different. Expected: [$1], actual: [$2]."
+    exit 1
+  fi
+}
+
+#############################################################################
+#### All good, everything should work.
+test_name="all_good"
+echo "+++ Starting test $test_name..."
+
+#### Generate a private key and get a public key.
+$SIGNATURE_CLI gen-private-key $PRIVATE_KEYSET_FILE || exit 1
+$SIGNATURE_CLI get-public-key $PRIVATE_KEYSET_FILE $PUBLIC_KEYSET_FILE || exit 1
+
+#### Sign the message.
+$SIGNATURE_CLI sign $PRIVATE_KEYSET_FILE $MESSAGE_FILE $SIGNATURE_FILE || exit 1
+
+#### Verify the signature.
+$SIGNATURE_CLI verify $PUBLIC_KEYSET_FILE $MESSAGE_FILE $SIGNATURE_FILE $RESULT_FILE || exit 1
+
+#### Check that the signature is valid.
+RESULT=$(<$RESULT_FILE)
+assert_equal "valid" "$RESULT"
+
+#############################################################################
+#### Bad private key when getting the public key.
+test_name="get_public_key_with_bad_private_key"
+echo "+++ Starting test $test_name..."
+
+echo "abcd" >> $PRIVATE_KEYSET_FILE
+$SIGNATURE_CLI get-public-key $PRIVATE_KEYSET_FILE $PUBLIC_KEYSET_FILE
+
+EXIT_VALUE="$?"
+assert_equal 1 "$EXIT_VALUE"
+
+#############################################################################
+#### Different public key when verifying a signature.
+test_name="verify_with_different_public_key"
+echo "+++ Starting test $test_name..."
+
+$SIGNATURE_CLI gen-private-key $PRIVATE_KEYSET_FILE || exit 1
+$SIGNATURE_CLI gen-private-key $OTHER_PRIVATE_KEYSET_FILE || exit 1
+$SIGNATURE_CLI get-public-key $OTHER_PRIVATE_KEYSET_FILE $OTHER_PUBLIC_KEYSET_FILE || exit 1
+$SIGNATURE_CLI sign $PRIVATE_KEYSET_FILE $MESSAGE_FILE $SIGNATURE_FILE || exit 1
+$SIGNATURE_CLI verify $OTHER_PUBLIC_KEYSET_FILE $MESSAGE_FILE $SIGNATURE_FILE $RESULT_FILE || exit 1
+
+RESULT=$(<$RESULT_FILE)
+assert_equal "invalid" "$RESULT"
+
+#############################################################################
+#### Different message when verifying a signature.
+test_name="verify_with_different_message"
+echo "+++ Starting test $test_name..."
+
+$SIGNATURE_CLI gen-private-key $PRIVATE_KEYSET_FILE || exit 1
+$SIGNATURE_CLI get-public-key $PRIVATE_KEYSET_FILE $PUBLIC_KEYSET_FILE || exit 1
+$SIGNATURE_CLI sign $PRIVATE_KEYSET_FILE $MESSAGE_FILE $SIGNATURE_FILE || exit 1
+$SIGNATURE_CLI verify $PUBLIC_KEYSET_FILE $OTHER_MESSAGE_FILE $SIGNATURE_FILE $RESULT_FILE || exit 1
+
+RESULT=$(<$RESULT_FILE)
+assert_equal "invalid" "$RESULT"
+
+#############################################################################
+#### Sign with wrong key.
+test_name="sign_with_wrong_key"
+echo "+++ Starting test $test_name..."
+
+$SIGNATURE_CLI gen-private-key $PRIVATE_KEYSET_FILE || exit 1
+$SIGNATURE_CLI get-public-key $PRIVATE_KEYSET_FILE $PUBLIC_KEYSET_FILE || exit 1
+$SIGNATURE_CLI sign $PUBLIC_KEYSET_FILE $MESSAGE_FILE $SIGNATURE_FILE
+
+EXIT_VALUE="$?"
+assert_equal 1 "$EXIT_VALUE"
+
+#############################################################################
+#### Verify with wrong key.
+test_name="verify_with_wrong_key"
+echo "+++ Starting test $test_name..."
+
+$SIGNATURE_CLI gen-private-key $PRIVATE_KEYSET_FILE || exit 1
+$SIGNATURE_CLI sign $PRIVATE_KEYSET_FILE $MESSAGE_FILE $SIGNATURE_FILE || exit 1
+$SIGNATURE_CLI verify $PRIVATE_KEYSET_FILE $MESSAGE_FILE $SIGNATURE_FILE $RESULT_FILE
+
+EXIT_VALUE="$?"
+assert_equal 1 "$EXIT_VALUE"
diff --git a/examples/digital_signatures/cc/util.cc b/examples/digital_signatures/cc/util.cc
new file mode 100644
index 0000000..d5cc33b
--- /dev/null
+++ b/examples/digital_signatures/cc/util.cc
@@ -0,0 +1,128 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "examples/digital_signatures/cc/util.h"
+
+#include <iostream>
+#include <fstream>
+
+#include "tink/binary_keyset_reader.h"
+#include "tink/binary_keyset_writer.h"
+#include "tink/cleartext_keyset_handle.h"
+#include "tink/keyset_reader.h"
+#include "tink/keyset_writer.h"
+#include "tink/config.h"
+#include "tink/keyset_handle.h"
+#include "tink/config/tink_config.h"
+#include "tink/util/status.h"
+
+using crypto::tink::BinaryKeysetReader;
+using crypto::tink::BinaryKeysetWriter;
+using crypto::tink::CleartextKeysetHandle;
+using crypto::tink::KeysetHandle;
+using crypto::tink::KeysetReader;
+using crypto::tink::KeysetWriter;
+using crypto::tink::TinkConfig;
+
+// static
+std::unique_ptr<KeysetReader> Util::GetBinaryKeysetReader(
+    const std::string& filename) {
+  std::unique_ptr<std::ifstream> keyset_stream(new std::ifstream());
+  keyset_stream->open(filename, std::ifstream::in);
+  auto keyset_reader_result = BinaryKeysetReader::New(std::move(keyset_stream));
+  if (!keyset_reader_result.ok()) {
+    std::clog << "Creation of the BinaryKeysetReader failed: "
+              << keyset_reader_result.status().error_message() << std::endl;
+    exit(1);
+  }
+  return std::move(keyset_reader_result.ValueOrDie());
+}
+
+// static
+std::unique_ptr<KeysetWriter> Util::GetBinaryKeysetWriter(
+    const std::string& filename) {
+  std::unique_ptr<std::ofstream> keyset_stream(new std::ofstream());
+  keyset_stream->open(filename, std::ofstream::out);
+  auto keyset_writer_result = BinaryKeysetWriter::New(std::move(keyset_stream));
+  if (!keyset_writer_result.ok()) {
+    std::clog << "Creation of the BinaryKeysetWriter failed: "
+              << keyset_writer_result.status().error_message() << std::endl;
+    exit(1);
+  }
+  return std::move(keyset_writer_result.ValueOrDie());
+}
+
+// static
+std::unique_ptr<KeysetHandle> Util::ReadKeyset(const std::string& filename) {
+  auto keyset_reader = GetBinaryKeysetReader(filename);
+  auto keyset_handle_result =
+      CleartextKeysetHandle::Read(std::move(keyset_reader));
+  if (!keyset_handle_result.ok()) {
+    std::clog << "Reading the keyset failed: "
+              << keyset_handle_result.status().error_message() << std::endl;
+    exit(1);
+  }
+  return std::move(keyset_handle_result.ValueOrDie());
+}
+
+// static
+void Util::WriteKeyset(
+    const std::unique_ptr<KeysetHandle>& keyset_handle,
+    const std::string& filename) {
+  auto keyset_writer = GetBinaryKeysetWriter(filename);
+  auto status = CleartextKeysetHandle::Write(keyset_writer.get(),
+                                             *keyset_handle);
+  if (!status.ok()) {
+    std::clog << "Writing the keyset failed: "
+              << status.error_message() << std::endl;
+    exit(1);
+  }
+}
+
+// static
+void Util::InitTink() {
+  auto status = TinkConfig::Register();
+  if (!status.ok()) {
+    std::clog << "Initialization of Tink failed: "
+              << status.error_message() << std::endl;
+    exit(1);
+  }
+}
+
+// static
+std::string Util::Read(const std::string& filename) {
+  std::ifstream input_stream;
+  input_stream.open(filename, std::ifstream::in);
+  if (!input_stream.is_open()) {
+    std::clog << "Error opening input file " << filename << std::endl;
+    exit(1);
+  }
+  std::stringstream input;
+  input << input_stream.rdbuf();
+  input_stream.close();
+  return input.str();
+}
+
+// static
+void Util::Write(const std::string& output,
+                    const std::string& filename) {
+  std::ofstream output_stream(filename,
+                              std::ofstream::out | std::ofstream::binary);
+  if (!output_stream.is_open()) {
+    std::clog << "Error opening output file " << filename << std::endl;
+    exit(1);
+  }
+  output_stream << output;
+  output_stream.close();
+}
diff --git a/examples/digital_signatures/cc/util.h b/examples/digital_signatures/cc/util.h
new file mode 100644
index 0000000..53eb741
--- /dev/null
+++ b/examples/digital_signatures/cc/util.h
@@ -0,0 +1,60 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef EXAMPLES_DIGITAL_SIGNATURES_CC_UTIL_H_
+#define EXAMPLES_DIGITAL_SIGNATURES_CC_UTIL_H_
+
+#include <iostream>
+#include <fstream>
+
+#include "tink/keyset_handle.h"
+
+// Helper functions for Digital Signatures CLI
+class Util {
+ public:
+  // Returns a BinaryKeysetReader that reads from the specified file.
+  // In case of errors writes a log message and aborts.
+  static std::unique_ptr<crypto::tink::KeysetReader> GetBinaryKeysetReader(
+      const std::string& filename);
+
+  // Returns a BinaryKeysetWriter that writes from the specified file.
+  // In case of errors writes a log message and aborts.
+  static std::unique_ptr<crypto::tink::KeysetWriter> GetBinaryKeysetWriter(
+      const std::string& filename);
+
+  // Reads a keyset from the specified file.
+  // In case of errors writes a log message and aborts.
+  static std::unique_ptr<crypto::tink::KeysetHandle> ReadKeyset(
+      const std::string& filename);
+
+  // Writes the keyset to the specified file.
+  // In case of errors writes a log message and aborts.
+  static void WriteKeyset(
+      const std::unique_ptr<crypto::tink::KeysetHandle>& keyset_handle,
+      const std::string& filename);
+
+  // Initializes Tink registry.
+  // In case of errors writes a log message and aborts.
+  static void InitTink();
+
+  // Reads the specified file and returns the contents as a std::string.
+  // In case of errors writes a log message and aborts.
+  static std::string Read(const std::string& filename);
+
+  // Writes the given 'output' to the specified file.
+  // In case of errors writes a log message and aborts.
+  static void Write(const std::string& output, const std::string& filename);
+};
+
+#endif  // EXAMPLES_DIGITAL_SIGNATURES_CC_UTIL_H_
diff --git a/examples/file_mac/python/README.md b/examples/file_mac/python/README.md
new file mode 100644
index 0000000..562edb3
--- /dev/null
+++ b/examples/file_mac/python/README.md
@@ -0,0 +1,34 @@
+# Python File MAC
+
+This is a command-line tool that can check the integrity of a file using
+[MAC (Message Authentication Code)](../../../docs/PRIMITIVES.md#message-authentication-code).
+
+It demonstrates the basic steps of using Tink, namely loading key material,
+obtaining a primitive, and using the primitive to do crypto.
+
+Moreover, since this app shares the same Bazel WORKSPACE with Tink, its BUILD
+file can directly depend on Tink.
+
+The key material was generated with:
+
+```shell
+tinkey create-keyset --key-template HMAC_SHA256_256BITTAG --out-format JSON \
+--out tmp/hmac_sha256_256bittag_test_keyset.json
+```
+
+## Build and Run
+
+### Bazel
+
+```shell
+git clone https://github.com/google/tink
+cd tink
+bazel build ...
+echo "some data" > data.txt
+echo "01293ce6590fb883aa111a53e56d537dea5641b664901e35ce10e0c31df8398218fa9b030d" > expected.txt
+
+./bazel-bin/examples/file_mac/python/file_mac ./examples/file_mac/python/hmac_sha256_256bittag_test_keyset.json \
+    data.txt
+./bazel-bin/examples/file_mac/python/file_mac ./examples/file_mac/python/hmac_sha256_256bittag_test_keyset.json \
+    data.txt expected.txt
+```
diff --git a/examples/file_mac/python/file_mac_cleartext.py b/examples/file_mac/python/file_mac_cleartext.py
new file mode 100644
index 0000000..67b2bc8
--- /dev/null
+++ b/examples/file_mac/python/file_mac_cleartext.py
@@ -0,0 +1,118 @@
+# Copyright 2019 Google Inc. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS-IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""A command-line utility for checking file integrity with a MAC.
+
+It loads cleartext keys from disk - this is not recommended!
+
+It requires 2 or 3 arguments:
+  keyset-file: name of the file with the keyset to be used for the MAC
+  data-file:  name of the file with the input data to be checked
+  [optional] expected-code-file:  name of the file containing a hexadecimal MAC
+  with which to compare the MAC of the input data
+If expected-code-file is supplied, the program will print whether the MACs
+matched or not. If not, it will just print the hexadecimal MAC of the data file.
+"""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import binascii
+
+# Special imports
+from absl import app
+from absl import flags
+from absl import logging
+import tink
+from tink.core import cleartext_keyset_handle
+
+FLAGS = flags.FLAGS
+
+
+def main(argv):
+  if len(argv) not in (3, 4):
+    raise app.UsageError(
+        'Expected 2 or 3 arguments, got %d.\n'
+        'Usage: %s keyset-file data-file [expected-code-file]' %
+        (len(argv) - 1, argv[0]))
+
+  keyset_filename = argv[1]
+  data_filename = argv[2]
+  expected_code_filename = argv[3] if len(argv) == 4 else None
+
+  if expected_code_filename is not None:
+    with open(expected_code_filename, 'rb') as expected_code_file:
+      expected_code_hex = expected_code_file.read().strip()
+
+    logging.info(
+        'Using keyset from file %s to verify file %s against expected code %s',
+        keyset_filename, data_filename, expected_code_hex.decode('utf-8'))
+  else:
+    expected_code_hex = None
+    logging.info('Using keyset from file %s to verify file %s', keyset_filename,
+                 data_filename)
+
+  # Initialise Tink.
+  try:
+    tink.tink_config.register()
+  except tink.TinkError as e:
+    logging.error('Error initialising Tink: %s', e)
+    return 1
+
+  # Read the keyset.
+  with open(keyset_filename, 'rb') as keyset_file:
+    try:
+      text = keyset_file.read()
+      keyset = cleartext_keyset_handle.CleartextKeysetHandle(
+          tink.JsonKeysetReader(text).read())
+    except tink.TinkError as e:
+      logging.error('Error reading key: %s', e)
+      return 1
+
+  # Get the primitive.
+  try:
+    cipher = keyset.primitive(tink.Mac)
+  except tink.TinkError as e:
+    logging.error('Error creating primitive: %s', e)
+    return 1
+
+  # Compute the MAC.
+  with open(data_filename, 'rb') as data_file:
+    data = data_file.read()
+
+  if expected_code_hex is None:
+    code = cipher.compute_mac(data)
+    logging.info('MAC output is %s', binascii.hexlify(code).decode('utf-8'))
+    return 0
+
+  try:
+    expected_code = binascii.unhexlify(expected_code_hex)
+  except binascii.Error as e:
+    logging.error('Error reading expected code: %s', e)
+    return 1
+
+  try:
+    cipher.verify_mac(expected_code, data)
+    logging.info('MAC outputs matched. Success!')
+    return 0
+  except tink.TinkError as e:
+    logging.info('MAC outputs did not match!')
+    code = binascii.hexlify(cipher.compute_mac(data)).decode('utf-8')
+    logging.info('Actual MAC output is %s', code)
+    return 1
+
+
+if __name__ == '__main__':
+  app.run(main)
diff --git a/examples/file_mac/python/file_mac_test.sh b/examples/file_mac/python/file_mac_test.sh
new file mode 100755
index 0000000..592f759
--- /dev/null
+++ b/examples/file_mac/python/file_mac_test.sh
@@ -0,0 +1,139 @@
+#!/bin/bash
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+################################################################################
+
+set -euo pipefail
+
+#############################################################################
+##### Tests for file_mac python example.
+
+ROOT_DIR="$TEST_SRCDIR/tink"
+FILE_MAC_CLI="$ROOT_DIR/examples/file_mac/python/file_mac_cleartext"
+
+KEYSET_FILE="$ROOT_DIR/examples/file_mac/python/hmac_sha256_256bittag_test_keyset.json"
+DATA_FILE="$TEST_TMPDIR/example_data.txt"
+EXPECTED_MAC_FILE="$TEST_TMPDIR/expected_mac.txt"
+
+echo "This is some message to be verified." > $DATA_FILE
+CORRECT_MAC="01293CE659EBCFB08AF02C9B2E564D8352CD8EB58A363E7DE62BAA0BED9CA92BD257F76F4F"
+
+#############################################################################
+
+# A helper function for getting the return code of a command that may fail
+# Temporarily disables error safety and stores return value in $TEST_STATUS
+# Usage:
+# % test_command somecommand some args
+# % echo $TEST_STATUS
+test_command() {
+  set +e
+  "$@"
+  TEST_STATUS=$?
+  set -e
+}
+
+#############################################################################
+#### Test good key and correct MAC verification.
+test_name="normal_verification"
+echo "+++ Starting test $test_name..."
+
+##### Create a plaintext and actual MAC.
+echo "$CORRECT_MAC" > $EXPECTED_MAC_FILE
+
+##### Run verification
+test_command $FILE_MAC_CLI $KEYSET_FILE $DATA_FILE $EXPECTED_MAC_FILE
+
+if [[ $TEST_STATUS -eq 0 ]]; then
+  echo "+++ Success: MAC outputs matched."
+else
+  echo "--- Failure: the MAC outputs did not match"
+  exit 1
+fi
+
+
+#############################################################################
+#### Test good key and incorrect MAC verification.
+test_name="incorrect_mac_verification"
+echo "+++ Starting test $test_name..."
+
+##### Create a plaintext and incorrect MAC.
+echo "ABCABCABCD" > $EXPECTED_MAC_FILE
+
+##### Run verification.
+test_command $FILE_MAC_CLI $KEYSET_FILE $DATA_FILE $EXPECTED_MAC_FILE
+
+if [[ $TEST_STATUS -ne 0 ]]; then
+  echo "+++ Success: MAC verification reported non-match for incorrect MAC."
+else
+  echo "--- Failure: MAC verification reported match for incorrect MAC"
+  exit 1
+fi
+
+
+#############################################################################
+#### Test good key and non-hexadecimal MAC verification.
+test_name="non_hex_mac_verification"
+echo "+++ Starting test $test_name..."
+
+##### Create a plaintext and non-hexadecimal MAC.
+echo "SMDHTBFYGM" > $EXPECTED_MAC_FILE
+
+##### Run verification.
+test_command $FILE_MAC_CLI $KEYSET_FILE $DATA_FILE $EXPECTED_MAC_FILE
+
+if [[ $TEST_STATUS -ne 0 ]]; then
+  echo "+++ Success: MAC verification reported non-match for non-hex MAC."
+else
+  echo "--- Failure: MAC verification reported match for non-hex MAC"
+  exit 1
+fi
+
+
+#############################################################################
+#### Test good key MAC computation.
+test_name="mac_computation"
+echo "+++ Starting test $test_name..."
+
+##### Create a plaintext and actual MAC.
+MAC_OUTPUT_FILE="$TEST_TMPDIR/computed_mac_log.txt"
+
+##### Run computation.
+$FILE_MAC_CLI $KEYSET_FILE $DATA_FILE --alsologtostderr 2> $MAC_OUTPUT_FILE
+##### Check that the correct MAC was produced in the logs
+test_command grep --quiet --ignore-case "$CORRECT_MAC" "$MAC_OUTPUT_FILE"
+
+if [[ $TEST_STATUS -eq 0 ]]; then
+  echo "+++ Success: MAC computation was successful."
+else
+  echo "--- Failure: MAC computation was unsuccessful"
+  exit 1
+fi
+
+
+#############################################################################
+#### Test bad key MAC computation.
+test_name="bad_key_computation"
+echo "+++ Starting test $test_name..."
+
+##### Create a plaintext and bad keyset.
+BAD_KEY_FILE="$TEST_TMPDIR/bad_key.txt"
+echo "not a key" > $BAD_KEY_FILE
+
+##### Run computation.
+test_command $FILE_MAC_CLI $BAD_KEY_FILE $DATA_FILE
+
+if [[ $TEST_STATUS -ne 0 ]]; then
+  echo "+++ Success: MAC computation failed with bad keyset."
+else
+  echo "--- Failure: MAC computation did not fail with bad keyset"
+  exit 1
+fi
diff --git a/examples/file_mac/python/hmac_sha256_256bittag_test_keyset.json b/examples/file_mac/python/hmac_sha256_256bittag_test_keyset.json
new file mode 100644
index 0000000..d4ef7e1
--- /dev/null
+++ b/examples/file_mac/python/hmac_sha256_256bittag_test_keyset.json
@@ -0,0 +1,13 @@
+{
+    "primaryKeyId": 691856985,
+    "key": [{
+        "keyData": {
+            "typeUrl": "type.googleapis.com/google.crypto.tink.HmacKey",
+            "keyMaterialType": "SYMMETRIC",
+            "value": "EgQIAxAgGiDZsmkTufMG/XlKlk9m7bqxustjUPT2YULEVm8mOp2mSA\u003d\u003d"
+        },
+        "outputPrefixType": "TINK",
+        "keyId": 691856985,
+        "status": "ENABLED"
+    }]
+}
diff --git a/examples/helloworld/cc/BUILD.bazel b/examples/helloworld/cc/BUILD.bazel
index a343c52..dacd4a4 100644
--- a/examples/helloworld/cc/BUILD.bazel
+++ b/examples/helloworld/cc/BUILD.bazel
@@ -1,12 +1,13 @@
 package(default_visibility = ["//visibility:public"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 filegroup(
     name = "hello_world_files",
     srcs = [
         "aes128_gcm_test_keyset_json.txt",
         "hello_world.cc",
+        "CMakeLists_for_CMakeBuildTest.txt",
     ],
 )
 
@@ -39,13 +40,14 @@
     srcs = [
         "non_bazel_build_test.sh",
     ],
-    tags = [
-        "local",   # This tests needs g++.
-    ],
     data = [
         ":hello_world_files",
         "//cc:libtink.so",
-        "//cc:tink_headers",
         "//cc:tink_deps_headers",
+        "//cc:tink_headers",
+    ],
+    tags = [
+        "local",  # This tests needs g++.
+        "no_rbe",
     ],
 )
diff --git a/examples/helloworld/cc/CMakeLists.txt b/examples/helloworld/cc/CMakeLists.txt
new file mode 100644
index 0000000..32932a5
--- /dev/null
+++ b/examples/helloworld/cc/CMakeLists.txt
@@ -0,0 +1,11 @@
+# 3.5 is the minimum version supported by Tink and its dependencies.
+cmake_minimum_required(VERSION 3.5)
+project(TinkHelloWorld CXX)
+
+set(CMAKE_BUILD_TYPE Release)
+
+# Import Tink as an in-tree dependency.
+add_subdirectory(../../.. tink)
+
+add_executable(hello_world hello_world.cc)
+target_link_libraries(hello_world tink::static)
diff --git a/examples/helloworld/cc/CMakeLists_for_CMakeBuildTest.txt b/examples/helloworld/cc/CMakeLists_for_CMakeBuildTest.txt
new file mode 100644
index 0000000..d8a0778
--- /dev/null
+++ b/examples/helloworld/cc/CMakeLists_for_CMakeBuildTest.txt
@@ -0,0 +1,8 @@
+cmake_minimum_required(VERSION 3.5)
+project(HelloWorld CXX)
+set(CMAKE_CXX_STANDARD 11)
+
+add_subdirectory(third_party/tink)
+
+add_executable(hello_world hello_world.cc)
+target_link_libraries(hello_world tink::static)
diff --git a/examples/helloworld/cc/cmake_build_test.sh b/examples/helloworld/cc/cmake_build_test.sh
new file mode 100755
index 0000000..8ef94b4
--- /dev/null
+++ b/examples/helloworld/cc/cmake_build_test.sh
@@ -0,0 +1,75 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+################################################################################
+
+#!/bin/bash
+
+set -ue
+
+#############################################################################
+##### Test for using Tink in a CMake project.
+## This expects the following variables to be set:
+## TEST_TMPDIR -- a temporary directory we can use
+## TEST_DATA_DIR -- the directory in which the project with hello_world.cc
+##                  can be found.
+## TEST_SRCDIR -- The directory in which Tink is stored.
+
+# XDG_CACHE_HOME must be set for a successful build of BoringSSL.
+export XDG_CACHE_HOME="$TEST_TMPDIR/cache"
+TEST_DATA_DIR="$TEST_SRCDIR/tink/examples/helloworld/cc"
+CMAKE_LISTS_FILE="$TEST_DATA_DIR/CMakeLists_for_CMakeBuildTest.txt"
+HELLO_WORLD_SRC="$TEST_DATA_DIR/hello_world.cc"
+KEYSET_FILE="$TEST_DATA_DIR/aes128_gcm_test_keyset_json.txt"
+
+PROJECT_DIR="$TEST_TMPDIR/my_project"
+PLAINTEXT_FILE="$TEST_TMPDIR/example_plaintext.txt"
+CIPHERTEXT_FILE="$TEST_TMPDIR/ciphertext.bin"
+DECRYPTED_FILE="$TEST_TMPDIR/decrypted.txt"
+AAD_TEXT="some associated data"
+
+#############################################################################
+
+##### Create necessary directories, and link Tink source.
+mkdir -p $XDG_CACHE_HOME
+mkdir -p $PROJECT_DIR $PROJECT_DIR/third_party
+ln -s $TINK_SRC_DIR $PROJECT_DIR/third_party/tink
+
+##### Copy "my_project" files.
+cp $HELLO_WORLD_SRC $KEYSET_FILE $PROJECT_DIR
+cp $CMAKE_LISTS_FILE $PROJECT_DIR/CMakeLists.txt
+
+##### Build "my_project".
+cd $PROJECT_DIR
+mkdir build && cd build
+# Record CMake version in the build log.
+cmake --version
+cmake ..
+make
+
+##### Use the resulting hello_world application.
+HELLO_WORLD_CLI="$PROJECT_DIR/build/hello_world"
+
+# Create a plaintext.
+echo "This is some message to be encrypted." > $PLAINTEXT_FILE
+
+# Run encryption & decryption.
+$HELLO_WORLD_CLI $KEYSET_FILE encrypt $PLAINTEXT_FILE "$AAD_TEXT" $CIPHERTEXT_FILE
+$HELLO_WORLD_CLI $KEYSET_FILE decrypt $CIPHERTEXT_FILE "$AAD_TEXT" $DECRYPTED_FILE
+
+# Check that decryption is correct.
+diff -q $DECRYPTED_FILE $PLAINTEXT_FILE
+if [ $? -ne 0 ]; then
+  echo "--- Failure: the decrypted file differs from the original plaintext."
+  diff $DECRYPTED_FILE $PLAINTEXT_FILE
+  exit 1
+fi
+echo "+++ Success: decryption was correct."
diff --git a/examples/helloworld/java/BUILD.bazel b/examples/helloworld/java/BUILD.bazel
index 40b367e..b099a5c 100644
--- a/examples/helloworld/java/BUILD.bazel
+++ b/examples/helloworld/java/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//visibility:public"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 java_binary(
     name = "helloworld",
@@ -10,12 +10,12 @@
     main_class = "com.helloworld.HelloWorld",
     runtime_deps = [
         "@com_google_protobuf//:protobuf_java",
-        "@org_json",
+        "@maven//:org_json_json",
     ],
     deps = [
         "//java",
         "//java:cleartext_keyset_handle",
         "//java:subtle",
-        "@args4j//jar",
+        "@maven//:args4j_args4j",
     ],
 )
diff --git a/examples/helloworld/java/pom.xml b/examples/helloworld/java/pom.xml
index e13150a..ee4f309 100644
--- a/examples/helloworld/java/pom.xml
+++ b/examples/helloworld/java/pom.xml
@@ -44,6 +44,18 @@
       <artifactId>tink</artifactId>
       <version>HEAD-SNAPSHOT</version>
     </dependency>
+
+    <dependency>
+      <groupId>com.google.crypto.tink</groupId>
+      <artifactId>tink-awskms</artifactId>
+      <version>HEAD-SNAPSHOT</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.google.crypto.tink</groupId>
+      <artifactId>tink-gcpkms</artifactId>
+      <version>HEAD-SNAPSHOT</version>
+    </dependency>
   </dependencies>
 
   <build>
diff --git a/examples/helloworld/objc/Podfile b/examples/helloworld/objc/Podfile
new file mode 100644
index 0000000..e85ebcd
--- /dev/null
+++ b/examples/helloworld/objc/Podfile
@@ -0,0 +1,5 @@
+platform :ios, '9.0'
+use_frameworks!
+target 'TinkExampleApp' do
+  pod 'Tink'
+end
diff --git a/examples/helloworld/objc/README.md b/examples/helloworld/objc/README.md
new file mode 100644
index 0000000..2e5c45c
--- /dev/null
+++ b/examples/helloworld/objc/README.md
@@ -0,0 +1,22 @@
+# Obj-C Hello World
+
+This is an example iOS application that can encrypt and decrypt text using [AEAD
+(Authenticated Encryption with Associated
+Data)](../../../docs/PRIMITIVES.md#authenticated-encryption-with-associated-data).
+
+It demonstrates the basic steps of using Tink, namely generating key material,
+obtaining a primitive, and using the primitive to do crypto.
+
+The example comes with a Podfile that demonstrates how to install Tink from Cocoapods.
+
+## Build and Run
+
+### Cocoapods
+
+```shell
+git clone https://github.com/google/tink
+cd tink/examples/helloworld/objc
+pod install
+open TinkExampleApp.xcworkspace
+```
+
diff --git a/examples/helloworld/objc/TinkExampleApp.xcodeproj/project.pbxproj b/examples/helloworld/objc/TinkExampleApp.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..6231b63
--- /dev/null
+++ b/examples/helloworld/objc/TinkExampleApp.xcodeproj/project.pbxproj
@@ -0,0 +1,398 @@
+// !$*UTF8*$!
+{
+    archiveVersion = 1;
+    classes = {
+    };
+    objectVersion = 50;
+    objects = {
+
+/* Begin PBXBuildFile section */
+        3AC9C6BB2618E3633470C292 /* Pods_TinkExampleApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1682DD5A8D6AA0153B74F3DD /* Pods_TinkExampleApp.framework */; };
+        DE077E30223700FD0059676B /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = DE077E2F223700FD0059676B /* AppDelegate.m */; };
+        DE077E33223700FD0059676B /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DE077E32223700FD0059676B /* ViewController.m */; };
+        DE077E36223700FD0059676B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DE077E34223700FD0059676B /* Main.storyboard */; };
+        DE077E38223700FE0059676B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DE077E37223700FE0059676B /* Assets.xcassets */; };
+        DE077E3B223700FE0059676B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DE077E39223700FE0059676B /* LaunchScreen.storyboard */; };
+        DE077E3E223700FE0059676B /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = DE077E3D223700FE0059676B /* main.m */; };
+        DE1B08F7223705B5008A1102 /* AeadPrimitive.m in Sources */ = {isa = PBXBuildFile; fileRef = DE1B08F5223705B5008A1102 /* AeadPrimitive.m */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+        0DFD422FF4CC044A798C7A37 /* Pods-TinkExampleApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TinkExampleApp.release.xcconfig"; path = "Target Support Files/Pods-TinkExampleApp/Pods-TinkExampleApp.release.xcconfig"; sourceTree = "<group>"; };
+        1682DD5A8D6AA0153B74F3DD /* Pods_TinkExampleApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TinkExampleApp.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+        35C2FA17A63F64CB7F0A3662 /* Pods-TinkExampleApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TinkExampleApp.debug.xcconfig"; path = "Target Support Files/Pods-TinkExampleApp/Pods-TinkExampleApp.debug.xcconfig"; sourceTree = "<group>"; };
+        DE077E2B223700FD0059676B /* TinkExampleApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TinkExampleApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
+        DE077E2E223700FD0059676B /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+        DE077E2F223700FD0059676B /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+        DE077E31223700FD0059676B /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
+        DE077E32223700FD0059676B /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
+        DE077E35223700FD0059676B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
+        DE077E37223700FE0059676B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+        DE077E3A223700FE0059676B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
+        DE077E3C223700FE0059676B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+        DE077E3D223700FE0059676B /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+        DE1B08F5223705B5008A1102 /* AeadPrimitive.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AeadPrimitive.m; sourceTree = "<group>"; };
+        DE1B08F6223705B5008A1102 /* AeadPrimitive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AeadPrimitive.h; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+        DE077E28223700FD0059676B /* Frameworks */ = {
+            isa = PBXFrameworksBuildPhase;
+            buildActionMask = 2147483647;
+            files = (
+                3AC9C6BB2618E3633470C292 /* Pods_TinkExampleApp.framework in Frameworks */,
+            );
+            runOnlyForDeploymentPostprocessing = 0;
+        };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+        982183B5767AA12B9635BB63 /* Frameworks */ = {
+            isa = PBXGroup;
+            children = (
+                1682DD5A8D6AA0153B74F3DD /* Pods_TinkExampleApp.framework */,
+            );
+            name = Frameworks;
+            sourceTree = "<group>";
+        };
+        DE077E22223700FD0059676B = {
+            isa = PBXGroup;
+            children = (
+                DE077E2D223700FD0059676B /* TinkExampleApp */,
+                DE077E2C223700FD0059676B /* Products */,
+                E9A4863E47DB683100B5808F /* Pods */,
+                982183B5767AA12B9635BB63 /* Frameworks */,
+            );
+            sourceTree = "<group>";
+        };
+        DE077E2C223700FD0059676B /* Products */ = {
+            isa = PBXGroup;
+            children = (
+                DE077E2B223700FD0059676B /* TinkExampleApp.app */,
+            );
+            name = Products;
+            sourceTree = "<group>";
+        };
+        DE077E2D223700FD0059676B /* TinkExampleApp */ = {
+            isa = PBXGroup;
+            children = (
+                DE1B08F6223705B5008A1102 /* AeadPrimitive.h */,
+                DE1B08F5223705B5008A1102 /* AeadPrimitive.m */,
+                DE077E2E223700FD0059676B /* AppDelegate.h */,
+                DE077E2F223700FD0059676B /* AppDelegate.m */,
+                DE077E31223700FD0059676B /* ViewController.h */,
+                DE077E32223700FD0059676B /* ViewController.m */,
+                DE077E34223700FD0059676B /* Main.storyboard */,
+                DE077E37223700FE0059676B /* Assets.xcassets */,
+                DE077E39223700FE0059676B /* LaunchScreen.storyboard */,
+                DE077E3C223700FE0059676B /* Info.plist */,
+                DE077E3D223700FE0059676B /* main.m */,
+            );
+            path = TinkExampleApp;
+            sourceTree = "<group>";
+        };
+        E9A4863E47DB683100B5808F /* Pods */ = {
+            isa = PBXGroup;
+            children = (
+                35C2FA17A63F64CB7F0A3662 /* Pods-TinkExampleApp.debug.xcconfig */,
+                0DFD422FF4CC044A798C7A37 /* Pods-TinkExampleApp.release.xcconfig */,
+            );
+            path = Pods;
+            sourceTree = "<group>";
+        };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+        DE077E2A223700FD0059676B /* TinkExampleApp */ = {
+            isa = PBXNativeTarget;
+            buildConfigurationList = DE077E41223700FE0059676B /* Build configuration list for PBXNativeTarget "TinkExampleApp" */;
+            buildPhases = (
+                25C6A4DF2378404A2690AC85 /* [CP] Check Pods Manifest.lock */,
+                DE077E27223700FD0059676B /* Sources */,
+                DE077E28223700FD0059676B /* Frameworks */,
+                DE077E29223700FD0059676B /* Resources */,
+            );
+            buildRules = (
+            );
+            dependencies = (
+            );
+            name = TinkExampleApp;
+            productName = TinkExampleApp;
+            productReference = DE077E2B223700FD0059676B /* TinkExampleApp.app */;
+            productType = "com.apple.product-type.application";
+        };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+        DE077E23223700FD0059676B /* Project object */ = {
+            isa = PBXProject;
+            attributes = {
+                LastUpgradeCheck = 1010;
+                ORGANIZATIONNAME = Google;
+                TargetAttributes = {
+                    DE077E2A223700FD0059676B = {
+                        CreatedOnToolsVersion = 10.1;
+                    };
+                };
+            };
+            buildConfigurationList = DE077E26223700FD0059676B /* Build configuration list for PBXProject "TinkExampleApp" */;
+            compatibilityVersion = "Xcode 9.3";
+            developmentRegion = en;
+            hasScannedForEncodings = 0;
+            knownRegions = (
+                en,
+                Base,
+            );
+            mainGroup = DE077E22223700FD0059676B;
+            productRefGroup = DE077E2C223700FD0059676B /* Products */;
+            projectDirPath = "";
+            projectRoot = "";
+            targets = (
+                DE077E2A223700FD0059676B /* TinkExampleApp */,
+            );
+        };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+        DE077E29223700FD0059676B /* Resources */ = {
+            isa = PBXResourcesBuildPhase;
+            buildActionMask = 2147483647;
+            files = (
+                DE077E3B223700FE0059676B /* LaunchScreen.storyboard in Resources */,
+                DE077E38223700FE0059676B /* Assets.xcassets in Resources */,
+                DE077E36223700FD0059676B /* Main.storyboard in Resources */,
+            );
+            runOnlyForDeploymentPostprocessing = 0;
+        };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+        25C6A4DF2378404A2690AC85 /* [CP] Check Pods Manifest.lock */ = {
+            isa = PBXShellScriptBuildPhase;
+            buildActionMask = 2147483647;
+            files = (
+            );
+            inputFileListPaths = (
+            );
+            inputPaths = (
+                "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+                "${PODS_ROOT}/Manifest.lock",
+            );
+            name = "[CP] Check Pods Manifest.lock";
+            outputFileListPaths = (
+            );
+            outputPaths = (
+                "$(DERIVED_FILE_DIR)/Pods-TinkExampleApp-checkManifestLockResult.txt",
+            );
+            runOnlyForDeploymentPostprocessing = 0;
+            shellPath = /bin/sh;
+            shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+            showEnvVarsInLog = 0;
+        };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+        DE077E27223700FD0059676B /* Sources */ = {
+            isa = PBXSourcesBuildPhase;
+            buildActionMask = 2147483647;
+            files = (
+                DE077E33223700FD0059676B /* ViewController.m in Sources */,
+                DE077E3E223700FE0059676B /* main.m in Sources */,
+                DE1B08F7223705B5008A1102 /* AeadPrimitive.m in Sources */,
+                DE077E30223700FD0059676B /* AppDelegate.m in Sources */,
+            );
+            runOnlyForDeploymentPostprocessing = 0;
+        };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+        DE077E34223700FD0059676B /* Main.storyboard */ = {
+            isa = PBXVariantGroup;
+            children = (
+                DE077E35223700FD0059676B /* Base */,
+            );
+            name = Main.storyboard;
+            sourceTree = "<group>";
+        };
+        DE077E39223700FE0059676B /* LaunchScreen.storyboard */ = {
+            isa = PBXVariantGroup;
+            children = (
+                DE077E3A223700FE0059676B /* Base */,
+            );
+            name = LaunchScreen.storyboard;
+            sourceTree = "<group>";
+        };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+        DE077E3F223700FE0059676B /* Debug */ = {
+            isa = XCBuildConfiguration;
+            buildSettings = {
+                ALWAYS_SEARCH_USER_PATHS = NO;
+                CLANG_ANALYZER_NONNULL = YES;
+                CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+                CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+                CLANG_CXX_LIBRARY = "libc++";
+                CLANG_ENABLE_MODULES = YES;
+                CLANG_ENABLE_OBJC_ARC = YES;
+                CLANG_ENABLE_OBJC_WEAK = YES;
+                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+                CLANG_WARN_BOOL_CONVERSION = YES;
+                CLANG_WARN_COMMA = YES;
+                CLANG_WARN_CONSTANT_CONVERSION = YES;
+                CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+                CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+                CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+                CLANG_WARN_EMPTY_BODY = YES;
+                CLANG_WARN_ENUM_CONVERSION = YES;
+                CLANG_WARN_INFINITE_RECURSION = YES;
+                CLANG_WARN_INT_CONVERSION = YES;
+                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+                CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+                CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+                CLANG_WARN_STRICT_PROTOTYPES = YES;
+                CLANG_WARN_SUSPICIOUS_MOVE = YES;
+                CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+                CLANG_WARN_UNREACHABLE_CODE = YES;
+                CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+                CODE_SIGN_IDENTITY = "iPhone Developer";
+                COPY_PHASE_STRIP = NO;
+                DEBUG_INFORMATION_FORMAT = dwarf;
+                ENABLE_STRICT_OBJC_MSGSEND = YES;
+                ENABLE_TESTABILITY = YES;
+                GCC_C_LANGUAGE_STANDARD = gnu11;
+                GCC_DYNAMIC_NO_PIC = NO;
+                GCC_NO_COMMON_BLOCKS = YES;
+                GCC_OPTIMIZATION_LEVEL = 0;
+                GCC_PREPROCESSOR_DEFINITIONS = (
+                    "DEBUG=1",
+                    "$(inherited)",
+                );
+                GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+                GCC_WARN_UNDECLARED_SELECTOR = YES;
+                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+                GCC_WARN_UNUSED_FUNCTION = YES;
+                GCC_WARN_UNUSED_VARIABLE = YES;
+                IPHONEOS_DEPLOYMENT_TARGET = 12.1;
+                MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+                MTL_FAST_MATH = YES;
+                ONLY_ACTIVE_ARCH = YES;
+                SDKROOT = iphoneos;
+            };
+            name = Debug;
+        };
+        DE077E40223700FE0059676B /* Release */ = {
+            isa = XCBuildConfiguration;
+            buildSettings = {
+                ALWAYS_SEARCH_USER_PATHS = NO;
+                CLANG_ANALYZER_NONNULL = YES;
+                CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+                CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+                CLANG_CXX_LIBRARY = "libc++";
+                CLANG_ENABLE_MODULES = YES;
+                CLANG_ENABLE_OBJC_ARC = YES;
+                CLANG_ENABLE_OBJC_WEAK = YES;
+                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+                CLANG_WARN_BOOL_CONVERSION = YES;
+                CLANG_WARN_COMMA = YES;
+                CLANG_WARN_CONSTANT_CONVERSION = YES;
+                CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+                CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+                CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+                CLANG_WARN_EMPTY_BODY = YES;
+                CLANG_WARN_ENUM_CONVERSION = YES;
+                CLANG_WARN_INFINITE_RECURSION = YES;
+                CLANG_WARN_INT_CONVERSION = YES;
+                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+                CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+                CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+                CLANG_WARN_STRICT_PROTOTYPES = YES;
+                CLANG_WARN_SUSPICIOUS_MOVE = YES;
+                CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+                CLANG_WARN_UNREACHABLE_CODE = YES;
+                CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+                CODE_SIGN_IDENTITY = "iPhone Developer";
+                COPY_PHASE_STRIP = NO;
+                DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+                ENABLE_NS_ASSERTIONS = NO;
+                ENABLE_STRICT_OBJC_MSGSEND = YES;
+                GCC_C_LANGUAGE_STANDARD = gnu11;
+                GCC_NO_COMMON_BLOCKS = YES;
+                GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+                GCC_WARN_UNDECLARED_SELECTOR = YES;
+                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+                GCC_WARN_UNUSED_FUNCTION = YES;
+                GCC_WARN_UNUSED_VARIABLE = YES;
+                IPHONEOS_DEPLOYMENT_TARGET = 12.1;
+                MTL_ENABLE_DEBUG_INFO = NO;
+                MTL_FAST_MATH = YES;
+                SDKROOT = iphoneos;
+                VALIDATE_PRODUCT = YES;
+            };
+            name = Release;
+        };
+        DE077E42223700FE0059676B /* Debug */ = {
+            isa = XCBuildConfiguration;
+            baseConfigurationReference = 35C2FA17A63F64CB7F0A3662 /* Pods-TinkExampleApp.debug.xcconfig */;
+            buildSettings = {
+                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+                CODE_SIGN_STYLE = Automatic;
+                INFOPLIST_FILE = TinkExampleApp/Info.plist;
+                LD_RUNPATH_SEARCH_PATHS = (
+                    "$(inherited)",
+                    "@executable_path/Frameworks",
+                );
+                PRODUCT_BUNDLE_IDENTIFIER = com.google.crypto.tink.TinkExampleApp;
+                PRODUCT_NAME = "$(TARGET_NAME)";
+                TARGETED_DEVICE_FAMILY = "1,2";
+            };
+            name = Debug;
+        };
+        DE077E43223700FE0059676B /* Release */ = {
+            isa = XCBuildConfiguration;
+            baseConfigurationReference = 0DFD422FF4CC044A798C7A37 /* Pods-TinkExampleApp.release.xcconfig */;
+            buildSettings = {
+                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+                CODE_SIGN_STYLE = Automatic;
+                INFOPLIST_FILE = TinkExampleApp/Info.plist;
+                LD_RUNPATH_SEARCH_PATHS = (
+                    "$(inherited)",
+                    "@executable_path/Frameworks",
+                );
+                PRODUCT_BUNDLE_IDENTIFIER = com.google.crypto.tink.TinkExampleApp;
+                PRODUCT_NAME = "$(TARGET_NAME)";
+                TARGETED_DEVICE_FAMILY = "1,2";
+            };
+            name = Release;
+        };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+        DE077E26223700FD0059676B /* Build configuration list for PBXProject "TinkExampleApp" */ = {
+            isa = XCConfigurationList;
+            buildConfigurations = (
+                DE077E3F223700FE0059676B /* Debug */,
+                DE077E40223700FE0059676B /* Release */,
+            );
+            defaultConfigurationIsVisible = 0;
+            defaultConfigurationName = Release;
+        };
+        DE077E41223700FE0059676B /* Build configuration list for PBXNativeTarget "TinkExampleApp" */ = {
+            isa = XCConfigurationList;
+            buildConfigurations = (
+                DE077E42223700FE0059676B /* Debug */,
+                DE077E43223700FE0059676B /* Release */,
+            );
+            defaultConfigurationIsVisible = 0;
+            defaultConfigurationName = Release;
+        };
+/* End XCConfigurationList section */
+    };
+    rootObject = DE077E23223700FD0059676B /* Project object */;
+}
diff --git a/examples/helloworld/objc/TinkExampleApp/AeadPrimitive.h b/examples/helloworld/objc/TinkExampleApp/AeadPrimitive.h
new file mode 100644
index 0000000..3fdb390
--- /dev/null
+++ b/examples/helloworld/objc/TinkExampleApp/AeadPrimitive.h
@@ -0,0 +1,34 @@
+/**
+ * Copyright 2019 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ **************************************************************************
+ */
+
+#import <Foundation/Foundation.h>
+
+#import "Tink/TINKAead.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface AeadPrimitive : NSObject
+
+@property(nonatomic) id<TINKAead> tinkAead;
+
+- (NSData *)encryptUTF8String:(NSString *)plaintext error:(NSError **)error;
+- (NSString *)decryptToUTF8String:(NSData *)ciphertextData error:(NSError **)error;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/examples/helloworld/objc/TinkExampleApp/AeadPrimitive.m b/examples/helloworld/objc/TinkExampleApp/AeadPrimitive.m
new file mode 100644
index 0000000..c1f03ee
--- /dev/null
+++ b/examples/helloworld/objc/TinkExampleApp/AeadPrimitive.m
@@ -0,0 +1,87 @@
+/**
+ * Copyright 2019 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ **************************************************************************
+ */
+
+#import "AeadPrimitive.h"
+
+#import "Tink/TINKAead.h"
+#import "Tink/TINKAeadFactory.h"
+#import "Tink/TINKAeadKeyTemplate.h"
+#import "Tink/TINKKeysetHandle.h"
+
+@implementation AeadPrimitive
+
+- (instancetype)init {
+  if ((self = [super init])) {
+    NSError *error = nil;
+
+    // Generate an AEAD key template for AES 128 GCM.
+    TINKAeadKeyTemplate *tpl = [[TINKAeadKeyTemplate alloc] initWithKeyTemplate:TINKAes128Gcm
+                                                                          error:&error];
+    if (!tpl || error) {
+      NSLog(@"Failed to generate tink AEAD key template, error: %@", error);
+      return nil;
+    }
+
+    // Get a keyset handle from the key template.
+    TINKKeysetHandle *handle = [[TINKKeysetHandle alloc] initWithKeyTemplate:tpl error:&error];
+    if (!handle || error) {
+      NSLog(@"Failed to get keyset handle from key template, error: %@", error);
+      return nil;
+    }
+
+    // Use the keyset handle to get an AEAD primitive. You can use the primitive to encrypt/decrypt
+    // data.
+    id<TINKAead> aead = [TINKAeadFactory primitiveWithKeysetHandle:handle error:&error];
+    if (!aead || error) {
+      NSLog(@"Failed to get AEAD primitive, error: %@", error);
+      return nil;
+    }
+    _tinkAead = aead;
+  }
+  return self;
+}
+
+- (NSData *)encryptUTF8String:(NSString *)plaintext error:(NSError **)error {
+  // Convert the UTF-8 string to NSData.
+  NSData *plaintextData = [plaintext dataUsingEncoding:NSUTF8StringEncoding];
+
+  // Encrypt.
+  NSData *ciphertextData = [self.tinkAead encrypt:plaintextData withAdditionalData:nil error:error];
+  if (!ciphertextData || *error) {
+    NSLog(@"Failed to encrypt plaintext, error: %@", *error);
+    return nil;
+  }
+  return ciphertextData;
+}
+
+- (NSString *)decryptToUTF8String:(NSData *)ciphertextData error:(NSError **)error {
+  // Decrypt the ciphertext using the AEAD primitive.
+  NSData *decryptedData = [self.tinkAead decrypt:ciphertextData withAdditionalData:nil error:error];
+  if (!decryptedData || *error) {
+    NSLog(@"Failed to decrypt ciphertext, error: %@", *error);
+    return nil;
+  }
+
+  // Convert the decrypted data to a UTF-8 string.
+  if ([decryptedData length] == 0) {
+    return @"";
+  }
+  return [NSString stringWithUTF8String:[decryptedData bytes]];
+}
+
+@end
diff --git a/examples/helloworld/objc/TinkExampleApp/AppDelegate.h b/examples/helloworld/objc/TinkExampleApp/AppDelegate.h
new file mode 100644
index 0000000..8d25050
--- /dev/null
+++ b/examples/helloworld/objc/TinkExampleApp/AppDelegate.h
@@ -0,0 +1,25 @@
+/**
+ * Copyright 2019 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ **************************************************************************
+ */
+
+#import <UIKit/UIKit.h>
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+@property(strong, nonatomic) UIWindow *window;
+
+@end
diff --git a/examples/helloworld/objc/TinkExampleApp/AppDelegate.m b/examples/helloworld/objc/TinkExampleApp/AppDelegate.m
new file mode 100644
index 0000000..b3435a7
--- /dev/null
+++ b/examples/helloworld/objc/TinkExampleApp/AppDelegate.m
@@ -0,0 +1,63 @@
+/**
+ * Copyright 2019 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ **************************************************************************
+ */
+
+// TINKVersion is only available on Tink v1.3.0+
+#define USING_1_3_0 0
+
+#import "AppDelegate.h"
+
+#import "Tink/TINKAllConfig.h"
+#import "Tink/TINKConfig.h"
+#if USING_1_3_0
+#import "Tink/TINKVersion.h"
+#endif
+
+@interface AppDelegate ()
+
+@end
+
+@implementation AppDelegate
+
+- (BOOL)application:(UIApplication *)application
+    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+  // Initialize Tink.
+  static dispatch_once_t onceToken;
+  dispatch_once(&onceToken, ^{
+    NSError *error = nil;
+
+#if USING_1_3_0
+    NSLog(@"Tink v%@", TINKVersion);
+#endif
+
+    // Get a config instance that enables all Tink functionality.
+    TINKAllConfig *config = [[TINKAllConfig alloc] initWithError:&error];
+    if (!config || error) {
+      NSLog(@"Failed to init tink config, error: %@", error);
+      return;
+    }
+
+    // Register the configuration.
+    if (![TINKConfig registerConfig:config error:&error]) {
+      NSLog(@"Failed to register tink config, error: %@", error);
+      return;
+    }
+  });
+  return YES;
+}
+
+@end
diff --git a/examples/helloworld/objc/TinkExampleApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/helloworld/objc/TinkExampleApp/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..a1895a2
--- /dev/null
+++ b/examples/helloworld/objc/TinkExampleApp/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,99 @@
+{
+  "images" : [
+    {
+      "idiom" : "iphone",
+      "size" : "20x20",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "20x20",
+      "scale" : "3x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "29x29",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "29x29",
+      "scale" : "3x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "40x40",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "40x40",
+      "scale" : "3x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "60x60",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "iphone",
+      "size" : "60x60",
+      "scale" : "3x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "20x20",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "20x20",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "29x29",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "29x29",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "40x40",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "40x40",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "76x76",
+      "scale" : "1x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "76x76",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "ipad",
+      "size" : "83.5x83.5",
+      "scale" : "2x"
+    },
+    {
+      "idiom" : "ios-marketing",
+      "size" : "1024x1024",
+      "scale" : "1x"
+    }
+  ],
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
+
diff --git a/examples/helloworld/objc/TinkExampleApp/Assets.xcassets/Contents.json b/examples/helloworld/objc/TinkExampleApp/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..7afcdfa
--- /dev/null
+++ b/examples/helloworld/objc/TinkExampleApp/Assets.xcassets/Contents.json
@@ -0,0 +1,7 @@
+{
+  "info" : {
+    "version" : 1,
+    "author" : "xcode"
+  }
+}
+
diff --git a/examples/helloworld/objc/TinkExampleApp/Base.lproj/LaunchScreen.storyboard b/examples/helloworld/objc/TinkExampleApp/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000..bfa3612
--- /dev/null
+++ b/examples/helloworld/objc/TinkExampleApp/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <scenes>
+        <!--View Controller-->
+        <scene sceneID="EHf-IW-A2E">
+            <objects>
+                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
+                    </view>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="53" y="375"/>
+        </scene>
+    </scenes>
+</document>
diff --git a/examples/helloworld/objc/TinkExampleApp/Base.lproj/Main.storyboard b/examples/helloworld/objc/TinkExampleApp/Base.lproj/Main.storyboard
new file mode 100644
index 0000000..36922e2
--- /dev/null
+++ b/examples/helloworld/objc/TinkExampleApp/Base.lproj/Main.storyboard
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
+    <device id="retina4_7" orientation="portrait">
+        <adaptation id="fullscreen"/>
+    </device>
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <scenes>
+        <!--View Controller-->
+        <scene sceneID="tne-QT-ifu">
+            <objects>
+                <viewController id="BYZ-38-t0r" customClass="ViewController" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <textField opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="9SF-bf-Ul6">
+                                <rect key="frame" x="122" y="77" width="220" height="30"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                <nil key="textColor"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                <textInputTraits key="textInputTraits"/>
+                            </textField>
+                            <textField opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="NGM-s8-RPE">
+                                <rect key="frame" x="122" y="153" width="220" height="30"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                <nil key="textColor"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                <textInputTraits key="textInputTraits"/>
+                            </textField>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Plaintext" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="wqY-hE-eQc">
+                                <rect key="frame" x="48" y="82" width="66" height="21"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                <nil key="textColor"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Ciphertext" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8yX-Fn-wvl">
+                                <rect key="frame" x="33" y="158" width="81" height="21"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                <nil key="textColor"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ioM-5O-tXe">
+                                <rect key="frame" x="122" y="115" width="53" height="30"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                <state key="normal" title="Encrypt"/>
+                                <connections>
+                                    <action selector="encryptButton:" destination="BYZ-38-t0r" eventType="touchUpInside" id="hkM-U9-fz7"/>
+                                </connections>
+                            </button>
+                            <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bZ1-sg-ctG">
+                                <rect key="frame" x="122" y="191" width="55" height="30"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                <state key="normal" title="Decrypt"/>
+                                <connections>
+                                    <action selector="decryptButton:" destination="BYZ-38-t0r" eventType="touchUpInside" id="TSv-Vu-oGh"/>
+                                </connections>
+                            </button>
+                            <textField opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="5GD-80-4UC">
+                                <rect key="frame" x="122" y="229" width="220" height="30"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                <nil key="textColor"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                <textInputTraits key="textInputTraits"/>
+                            </textField>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Decrypted" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DGT-e7-mfj">
+                                <rect key="frame" x="33" y="234" width="81" height="21"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                <nil key="textColor"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Tink AEAD Example" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="EXq-fX-p7v">
+                                <rect key="frame" x="85" y="20" width="205" height="29"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="24"/>
+                                <color key="textColor" red="0.14883520697796726" green="0.1405070470376748" blue="1" alpha="0.84705882352941175" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Ksj-ti-qSx">
+                                <rect key="frame" x="303" y="299" width="39" height="30"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                <state key="normal" title="Reset"/>
+                                <connections>
+                                    <action selector="resetButton:" destination="BYZ-38-t0r" eventType="touchUpInside" id="Tht-7Z-TQ1"/>
+                                </connections>
+                            </button>
+                        </subviews>
+                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                        <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
+                    </view>
+                    <connections>
+                        <outlet property="ciphertext" destination="NGM-s8-RPE" id="ze1-52-Rns"/>
+                        <outlet property="decrypted" destination="5GD-80-4UC" id="DWi-VA-8LV"/>
+                        <outlet property="plaintext" destination="9SF-bf-Ul6" id="RRH-Kv-qf4"/>
+                    </connections>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="132" y="132.68365817091455"/>
+        </scene>
+    </scenes>
+</document>
diff --git a/examples/helloworld/objc/TinkExampleApp/Info.plist b/examples/helloworld/objc/TinkExampleApp/Info.plist
new file mode 100644
index 0000000..2865c10
--- /dev/null
+++ b/examples/helloworld/objc/TinkExampleApp/Info.plist
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+    <key>CFBundleDevelopmentRegion</key>
+    <string>en</string>
+    <key>CFBundleExecutable</key>
+    <string>$(EXECUTABLE_NAME)</string>
+    <key>CFBundleIdentifier</key>
+    <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+    <key>CFBundleInfoDictionaryVersion</key>
+    <string>6.0</string>
+    <key>CFBundleName</key>
+    <string>$(PRODUCT_NAME)</string>
+    <key>CFBundlePackageType</key>
+    <string>APPL</string>
+    <key>CFBundleShortVersionString</key>
+    <string>1.0</string>
+    <key>CFBundleVersion</key>
+    <string>1</string>
+    <key>LSRequiresIPhoneOS</key>
+    <true/>
+    <key>UILaunchStoryboardName</key>
+    <string>LaunchScreen</string>
+    <key>UIMainStoryboardFile</key>
+    <string>Main</string>
+    <key>UIRequiredDeviceCapabilities</key>
+    <array>
+        <string>armv7</string>
+    </array>
+    <key>UISupportedInterfaceOrientations</key>
+    <array>
+        <string>UIInterfaceOrientationPortrait</string>
+        <string>UIInterfaceOrientationLandscapeLeft</string>
+        <string>UIInterfaceOrientationLandscapeRight</string>
+    </array>
+    <key>UISupportedInterfaceOrientations~ipad</key>
+    <array>
+        <string>UIInterfaceOrientationPortrait</string>
+        <string>UIInterfaceOrientationPortraitUpsideDown</string>
+        <string>UIInterfaceOrientationLandscapeLeft</string>
+        <string>UIInterfaceOrientationLandscapeRight</string>
+    </array>
+</dict>
+</plist>
diff --git a/examples/helloworld/objc/TinkExampleApp/ViewController.h b/examples/helloworld/objc/TinkExampleApp/ViewController.h
new file mode 100644
index 0000000..9980c99
--- /dev/null
+++ b/examples/helloworld/objc/TinkExampleApp/ViewController.h
@@ -0,0 +1,35 @@
+/**
+ * Copyright 2019 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ **************************************************************************
+ */
+
+#import <UIKit/UIKit.h>
+
+#import "AeadPrimitive.h"
+
+@interface ViewController : UIViewController <UITextFieldDelegate>
+
+@property(unsafe_unretained, nonatomic) IBOutlet UITextField *plaintext;
+@property(unsafe_unretained, nonatomic) IBOutlet UITextField *ciphertext;
+@property(unsafe_unretained, nonatomic) IBOutlet UITextField *decrypted;
+@property(nonatomic) AeadPrimitive *aead;
+
+- (IBAction)decryptButton:(id)sender;
+- (IBAction)encryptButton:(id)sender;
+- (IBAction)resetButton:(id)sender;
+- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField;
+
+@end
diff --git a/examples/helloworld/objc/TinkExampleApp/ViewController.m b/examples/helloworld/objc/TinkExampleApp/ViewController.m
new file mode 100644
index 0000000..a0e1704
--- /dev/null
+++ b/examples/helloworld/objc/TinkExampleApp/ViewController.m
@@ -0,0 +1,79 @@
+/**
+ * Copyright 2019 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ **************************************************************************
+ */
+
+#import "ViewController.h"
+
+#import "AeadPrimitive.h"
+
+@interface ViewController ()
+
+@end
+
+@implementation ViewController
+
+- (void)viewDidLoad {
+  [super viewDidLoad];
+
+  self.aead = [[AeadPrimitive alloc] init];
+  self.ciphertext.delegate = self;
+  self.decrypted.delegate = self;
+}
+
+- (IBAction)encryptButton:(id)sender {
+  // Encrypt the plaintext.
+  NSError *error = nil;
+  NSData *ciphertext = [self.aead encryptUTF8String:self.plaintext.text error:&error];
+  if (!ciphertext || error) {
+    NSLog(@"Failed to encrypt plaintext, error: %@", error);
+    return;
+  }
+  // Base64 encode the ciphertext and display it in the ciphertext UITextField.
+  self.ciphertext.text = [ciphertext base64EncodedStringWithOptions:0];
+}
+
+- (IBAction)decryptButton:(id)sender {
+  NSData *encryptedData = [[NSData alloc] initWithBase64EncodedString:self.ciphertext.text
+                                                              options:0];
+
+  // Decrypt the ciphertext.
+  NSError *error = nil;
+  NSString *decrypted = [self.aead decryptToUTF8String:encryptedData error:&error];
+  if (!decrypted || error) {
+    NSLog(@"Failed to decrypt ciphertext, error: %@", error);
+    return;
+  }
+  self.decrypted.text = decrypted;
+}
+
+- (IBAction)resetButton:(id)sender {
+  self.plaintext.text = @"";
+  self.ciphertext.text = @"";
+  self.decrypted.text = @"";
+}
+
+- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
+  BOOL editable;
+  if (textField == self.plaintext || textField == self.ciphertext) {
+    editable = YES;
+  } else {
+    editable = NO;
+  }
+  return editable;
+}
+
+@end
diff --git a/examples/helloworld/objc/TinkExampleApp/main.m b/examples/helloworld/objc/TinkExampleApp/main.m
new file mode 100644
index 0000000..f61f6c8
--- /dev/null
+++ b/examples/helloworld/objc/TinkExampleApp/main.m
@@ -0,0 +1,26 @@
+/**
+ * Copyright 2019 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ **************************************************************************
+ */
+
+#import <UIKit/UIKit.h>
+#import "AppDelegate.h"
+
+int main(int argc, char* argv[]) {
+  @autoreleasepool {
+    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+  }
+}
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..cbbf8ac
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,11 @@
+module github.com/google/tink
+
+go 1.12
+
+require (
+	github.com/aws/aws-sdk-go v1.19.40
+	github.com/golang/protobuf v1.3.1
+	golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5
+	golang.org/x/oauth2 v0.0.0-20190523182746-aaccbc9213b0
+	google.golang.org/api v0.5.0
+)
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..83e55d9
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,60 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/aws/aws-sdk-go v1.19.40 h1:omRrS4bCM/IbzU6UEb8Ojg1PvlElZzYZkOh8vWWgFMc=
+github.com/aws/aws-sdk-go v1.19.40/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM=
+github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
+go.opencensus.io v0.21.0 h1:mU6zScU4U1YAFPHEHYk+3JC4SY7JxgkqS10ZOSyksNg=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5 h1:8dUaAV7K4uHsF56JQWkprecIQKdPHtR9jCHF5nB8uzc=
+golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190523182746-aaccbc9213b0 h1:xFEXbcD0oa/xhqQmMXztdZ0bWvexAWds+8c1gRN8nu0=
+golang.org/x/oauth2 v0.0.0-20190523182746-aaccbc9213b0/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+google.golang.org/api v0.5.0 h1:lj9SyhMzyoa38fgFF0oO2T6pjs5IzkLPKfVtxpyCRMM=
+google.golang.org/api v0.5.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19 h1:Lj2SnHtxkRGJDqnGaSjo+CCdIieEnwVazbOXILwQemk=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
diff --git a/go/BUILD.bazel b/go/BUILD.bazel
index 78a5827..bb6b92b 100644
--- a/go/BUILD.bazel
+++ b/go/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 load("@io_bazel_rules_go//go:def.bzl", "nogo")
 
diff --git a/go/aead/BUILD.bazel b/go/aead/BUILD.bazel
index e480dc8..d289e7b 100644
--- a/go/aead/BUILD.bazel
+++ b/go/aead/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
 
-licenses(["notice"])  # Apache 2.0 # keep
+licenses(["notice"])  # keep
 
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
@@ -20,10 +20,10 @@
     importpath = "github.com/google/tink/go/aead",
     visibility = ["//visibility:public"],
     deps = [
-        "//go/format:go_default_library",
+        "//go/core/cryptofmt:go_default_library",
+        "//go/core/primitiveset:go_default_library",
+        "//go/core/registry:go_default_library",
         "//go/keyset:go_default_library",
-        "//go/primitiveset:go_default_library",
-        "//go/registry:go_default_library",
         "//go/subtle/aead:go_default_library",
         "//go/subtle/mac:go_default_library",
         "//go/subtle/random:go_default_library",
@@ -45,19 +45,20 @@
 go_test(
     name = "go_default_test",
     srcs = [
-        "aead_test.go",
         "aead_factory_test.go",
         "aead_key_templates_test.go",
+        "aead_test.go",
         "aes_ctr_hmac_aead_key_manager_test.go",
         "aes_gcm_key_manager_test.go",
         "chacha20poly1305_key_manager_test.go",
+        "kms_envelope_aead_test.go",
         "xchacha20poly1305_key_manager_test.go",
     ],
     embed = [":go_default_library"],
     deps = [
-        "//go/format:go_default_library",
+        "//go/core/cryptofmt:go_default_library",
+        "//go/core/registry:go_default_library",
         "//go/keyset:go_default_library",
-        "//go/registry:go_default_library",
         "//go/subtle/aead:go_default_library",
         "//go/subtle/random:go_default_library",
         "//go/testkeyset:go_default_library",
diff --git a/go/aead/aead.go b/go/aead/aead.go
index bec3046..3398eae 100644
--- a/go/aead/aead.go
+++ b/go/aead/aead.go
@@ -13,12 +13,46 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 // Package aead provides implementations of the AEAD primitive.
+//
+// AEAD encryption assures the confidentiality and authenticity of the data. This primitive is CPA secure.
+//
+// Example:
+//
+//   package main
+//
+//   import (
+//       "fmt"
+//
+//       "github.com/google/tink/go/aead"
+//       "github.com/google/tink/go/keyset"
+//   )
+//
+//   func main() {
+//
+//       kh, err := keyset.NewHandle(aead.AES256GCMKeyTemplate())
+//       if err != nil {
+//           // handle the error
+//       }
+//
+//       a := aead.New(kh)
+//
+//       ct , err := a.Encrypt([]byte("this data needs to be encrypted"), []byte("associated data"))
+//       if err != nil {
+//           // handle error
+//       }
+//
+//       pt, err := a.Decrypt(ct, []byte("associated data"))
+//       if err != nil {
+//           //handle error
+//       }
+//
+//   }
 package aead
 
 import (
 	"fmt"
 
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 )
 
 func init() {
diff --git a/go/aead/aead_factory.go b/go/aead/aead_factory.go
index 160d127..617ddcf 100644
--- a/go/aead/aead_factory.go
+++ b/go/aead/aead_factory.go
@@ -17,10 +17,10 @@
 import (
 	"fmt"
 
-	"github.com/google/tink/go/format"
+	"github.com/google/tink/go/core/cryptofmt"
 	"github.com/google/tink/go/keyset"
-	"github.com/google/tink/go/primitiveset"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/primitiveset"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/tink"
 )
 
@@ -62,7 +62,7 @@
 	if err != nil {
 		return nil, err
 	}
-	var ret []byte
+	ret := make([]byte, 0, len(primary.Prefix) + len(ct))
 	ret = append(ret, primary.Prefix...)
 	ret = append(ret, ct...)
 	return ret, nil
@@ -73,7 +73,7 @@
 // ciphertext is authenticated.
 func (a *primitiveSet) Decrypt(ct, ad []byte) ([]byte, error) {
 	// try non-raw keys
-	prefixSize := format.NonRawPrefixSize
+	prefixSize := cryptofmt.NonRawPrefixSize
 	if len(ct) > prefixSize {
 		prefix := ct[:prefixSize]
 		ctNoPrefix := ct[prefixSize:]
diff --git a/go/aead/aead_factory_test.go b/go/aead/aead_factory_test.go
index 818156c..5eeab41 100644
--- a/go/aead/aead_factory_test.go
+++ b/go/aead/aead_factory_test.go
@@ -21,7 +21,7 @@
 	"testing"
 
 	"github.com/google/tink/go/aead"
-	"github.com/google/tink/go/format"
+	"github.com/google/tink/go/core/cryptofmt"
 	"github.com/google/tink/go/subtle/random"
 	"github.com/google/tink/go/testkeyset"
 	"github.com/google/tink/go/testutil"
@@ -43,7 +43,7 @@
 	if err != nil {
 		t.Errorf("aead.New failed: %s", err)
 	}
-	expectedPrefix, _ := format.OutputPrefix(primaryKey)
+	expectedPrefix, _ := cryptofmt.OutputPrefix(primaryKey)
 	if err := validateAEADFactoryCipher(a, a, expectedPrefix); err != nil {
 		t.Errorf("invalid cipher: %s", err)
 	}
@@ -59,14 +59,14 @@
 	if err != nil {
 		t.Errorf("aead.New failed: %s", err)
 	}
-	if err := validateAEADFactoryCipher(a2, a, format.RawPrefix); err != nil {
+	if err := validateAEADFactoryCipher(a2, a, cryptofmt.RawPrefix); err != nil {
 		t.Errorf("invalid cipher: %s", err)
 	}
 
 	// encrypt with a random key not in the keyset, decrypt with the keyset should fail
 	keyset2 = testutil.NewTestAESGCMKeyset(tinkpb.OutputPrefixType_TINK)
 	primaryKey = keyset2.Key[0]
-	expectedPrefix, _ = format.OutputPrefix(primaryKey)
+	expectedPrefix, _ = cryptofmt.OutputPrefix(primaryKey)
 	keysetHandle2, _ = testkeyset.NewHandle(keyset2)
 	a2, err = aead.New(keysetHandle2)
 	if err != nil {
@@ -89,7 +89,7 @@
 	if err != nil {
 		t.Errorf("cannot get primitive from keyset handle: %s", err)
 	}
-	if err := validateAEADFactoryCipher(a, a, format.RawPrefix); err != nil {
+	if err := validateAEADFactoryCipher(a, a, cryptofmt.RawPrefix); err != nil {
 		t.Errorf("invalid cipher: %s", err)
 	}
 }
diff --git a/go/aead/aead_key_templates.go b/go/aead/aead_key_templates.go
index 4fbfd46..dddd395 100644
--- a/go/aead/aead_key_templates.go
+++ b/go/aead/aead_key_templates.go
@@ -30,14 +30,23 @@
 
 // AES128GCMKeyTemplate is a KeyTemplate that generates an AES-GCM key with the following parameters:
 //   - Key size: 16 bytes
+//   - Output prefix type: TINK
 func AES128GCMKeyTemplate() *tinkpb.KeyTemplate {
-	return createAESGCMKeyTemplate(16)
+	return createAESGCMKeyTemplate(16, tinkpb.OutputPrefixType_TINK)
 }
 
 // AES256GCMKeyTemplate is a KeyTemplate that generates an AES-GCM key with the following parameters:
 //   - Key size: 32 bytes
+//   - Output prefix type: TINK
 func AES256GCMKeyTemplate() *tinkpb.KeyTemplate {
-	return createAESGCMKeyTemplate(32)
+	return createAESGCMKeyTemplate(32, tinkpb.OutputPrefixType_TINK)
+}
+
+// AES256GCMNoPrefixKeyTemplate is a KeyTemplate that generates an AES-GCM key with the following parameters:
+//   - Key size: 32 bytes
+//   - Output prefix type: RAW
+func AES256GCMNoPrefixKeyTemplate() *tinkpb.KeyTemplate {
+	return createAESGCMKeyTemplate(32, tinkpb.OutputPrefixType_RAW)
 }
 
 // AES128CTRHMACSHA256KeyTemplate is a KeyTemplate that generates an AES-CTR-HMAC-AEAD key with the following parameters:
@@ -60,6 +69,24 @@
 	return createAESCTRHMACAEADKeyTemplate(32, 16, 32, 32, commonpb.HashType_SHA256)
 }
 
+// ChaCha20Poly1305KeyTemplate is a KeyTemplate that generates a CHACHA20_POLY1305 key.
+func ChaCha20Poly1305KeyTemplate() *tinkpb.KeyTemplate {
+	return &tinkpb.KeyTemplate{
+		// Don't set value because KeyFormat is not required.
+		TypeUrl:          chaCha20Poly1305TypeURL,
+		OutputPrefixType: tinkpb.OutputPrefixType_TINK,
+	}
+}
+
+// XChaCha20Poly1305KeyTemplate is a KeyTemplate that generates a XCHACHA20_POLY1305 key.
+func XChaCha20Poly1305KeyTemplate() *tinkpb.KeyTemplate {
+	return &tinkpb.KeyTemplate{
+		// Don't set value because KeyFormat is not required.
+		TypeUrl:          xChaCha20Poly1305TypeURL,
+		OutputPrefixType: tinkpb.OutputPrefixType_TINK,
+	}
+}
+
 // KMSEnvelopeAEADKeyTemplate is a KeyTemplate that generates a KMSEnvelopeAEAD key for a given KEK in remote KMS
 func KMSEnvelopeAEADKeyTemplate(uri string, dekT *tinkpb.KeyTemplate) *tinkpb.KeyTemplate {
 	f := &kmsenvpb.KmsEnvelopeAeadKeyFormat{
@@ -76,14 +103,15 @@
 
 // createAESGCMKeyTemplate creates a new AES-GCM key template with the given key
 // size in bytes.
-func createAESGCMKeyTemplate(keySize uint32) *tinkpb.KeyTemplate {
+func createAESGCMKeyTemplate(keySize uint32, outputPrefixType tinkpb.OutputPrefixType) *tinkpb.KeyTemplate {
 	format := &gcmpb.AesGcmKeyFormat{
 		KeySize: keySize,
 	}
 	serializedFormat, _ := proto.Marshal(format)
 	return &tinkpb.KeyTemplate{
-		TypeUrl: aesGCMTypeURL,
-		Value:   serializedFormat,
+		TypeUrl:          aesGCMTypeURL,
+		Value:            serializedFormat,
+		OutputPrefixType: outputPrefixType,
 	}
 }
 
diff --git a/go/aead/aead_key_templates_test.go b/go/aead/aead_key_templates_test.go
index 22dcfbb..51598d1 100644
--- a/go/aead/aead_key_templates_test.go
+++ b/go/aead/aead_key_templates_test.go
@@ -22,7 +22,7 @@
 
 	"github.com/golang/protobuf/proto"
 	"github.com/google/tink/go/aead"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/testutil"
 	"github.com/google/tink/go/tink"
 	ctrhmacpb "github.com/google/tink/proto/aes_ctr_hmac_aead_go_proto"
@@ -34,7 +34,7 @@
 func TestAESGCMKeyTemplates(t *testing.T) {
 	// AES-GCM 128 bit
 	template := aead.AES128GCMKeyTemplate()
-	if err := checkAESGCMKeyTemplate(template, uint32(16)); err != nil {
+	if err := checkAESGCMKeyTemplate(template, uint32(16), tinkpb.OutputPrefixType_TINK); err != nil {
 		t.Errorf("invalid AES-128 GCM key template: %s", err)
 	}
 	if err := testEncryptDecrypt(template, testutil.AESGCMTypeURL); err != nil {
@@ -43,18 +43,30 @@
 
 	// AES-GCM 256 bit
 	template = aead.AES256GCMKeyTemplate()
-	if err := checkAESGCMKeyTemplate(template, uint32(32)); err != nil {
+	if err := checkAESGCMKeyTemplate(template, uint32(32), tinkpb.OutputPrefixType_TINK); err != nil {
 		t.Errorf("invalid AES-256 GCM key template: %s", err)
 	}
 	if err := testEncryptDecrypt(template, testutil.AESGCMTypeURL); err != nil {
 		t.Errorf("%v", err)
 	}
+
+	// AES-GCM 256 bit No Prefix
+	template = aead.AES256GCMNoPrefixKeyTemplate()
+	if err := checkAESGCMKeyTemplate(template, uint32(32), tinkpb.OutputPrefixType_RAW); err != nil {
+		t.Errorf("invalid AES-256 GCM No Prefix key template: %s", err)
+	}
+	if err := testEncryptDecrypt(template, testutil.AESGCMTypeURL); err != nil {
+		t.Errorf("%v", err)
+	}
 }
 
-func checkAESGCMKeyTemplate(template *tinkpb.KeyTemplate, keySize uint32) error {
+func checkAESGCMKeyTemplate(template *tinkpb.KeyTemplate, keySize uint32, outputPrefixType tinkpb.OutputPrefixType) error {
 	if template.TypeUrl != testutil.AESGCMTypeURL {
 		return fmt.Errorf("incorrect type url")
 	}
+	if template.OutputPrefixType != outputPrefixType {
+		return fmt.Errorf("incorrect output prefix type")
+	}
 	keyFormat := new(gcmpb.AesGcmKeyFormat)
 	err := proto.Unmarshal(template.Value, keyFormat)
 	if err != nil {
@@ -114,6 +126,26 @@
 	return nil
 }
 
+func TestChaCha20Poly1305KeyTemplate(t *testing.T) {
+	template := aead.ChaCha20Poly1305KeyTemplate()
+	if template.TypeUrl != testutil.ChaCha20Poly1305TypeURL {
+		t.Errorf("incorrect type url: %v, expected %v", template.TypeUrl, testutil.ChaCha20Poly1305TypeURL)
+	}
+	if err := testEncryptDecrypt(template, testutil.ChaCha20Poly1305TypeURL); err != nil {
+		t.Errorf("%v", err)
+	}
+}
+
+func TestXChaCha20Poly1305KeyTemplate(t *testing.T) {
+	template := aead.XChaCha20Poly1305KeyTemplate()
+	if template.TypeUrl != testutil.XChaCha20Poly1305TypeURL {
+		t.Errorf("incorrect type url: %v, expected %v", template.TypeUrl, testutil.XChaCha20Poly1305TypeURL)
+	}
+	if err := testEncryptDecrypt(template, testutil.XChaCha20Poly1305TypeURL); err != nil {
+		t.Errorf("%v", err)
+	}
+}
+
 func testEncryptDecrypt(template *tinkpb.KeyTemplate, typeURL string) error {
 	key, err := registry.NewKey(template)
 	if err != nil {
@@ -146,7 +178,7 @@
 		return fmt.Errorf("decryption failed, error: %v", err)
 	}
 
-	if bytes.Compare(plaintext, decrypted) != 0 {
+	if !bytes.Equal(plaintext, decrypted) {
 		return fmt.Errorf("decrypted data doesn't match plaintext, got: %q, want: %q", decrypted, plaintext)
 	}
 
diff --git a/go/aead/aead_test.go b/go/aead/aead_test.go
index 366162a..f9ca3ae 100644
--- a/go/aead/aead_test.go
+++ b/go/aead/aead_test.go
@@ -17,7 +17,7 @@
 import (
 	"testing"
 
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/testutil"
 )
 
diff --git a/go/aead/aes_ctr_hmac_aead_key_manager.go b/go/aead/aes_ctr_hmac_aead_key_manager.go
index db47891..15c8068 100644
--- a/go/aead/aes_ctr_hmac_aead_key_manager.go
+++ b/go/aead/aes_ctr_hmac_aead_key_manager.go
@@ -20,7 +20,7 @@
 
 	"github.com/golang/protobuf/proto"
 	"github.com/google/tink/go/keyset"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/subtle/aead"
 	"github.com/google/tink/go/subtle/mac"
 	"github.com/google/tink/go/subtle/random"
diff --git a/go/aead/aes_ctr_hmac_aead_key_manager_test.go b/go/aead/aes_ctr_hmac_aead_key_manager_test.go
index 12c19b6..89e6a85 100644
--- a/go/aead/aes_ctr_hmac_aead_key_manager_test.go
+++ b/go/aead/aes_ctr_hmac_aead_key_manager_test.go
@@ -19,7 +19,7 @@
 
 	"github.com/golang/protobuf/proto"
 	"github.com/google/tink/go/aead"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/testutil"
 	ctrhmacpb "github.com/google/tink/proto/aes_ctr_hmac_aead_go_proto"
 	tinkpb "github.com/google/tink/proto/tink_go_proto"
diff --git a/go/aead/aes_gcm_key_manager.go b/go/aead/aes_gcm_key_manager.go
index f53377d..64ea4ce 100644
--- a/go/aead/aes_gcm_key_manager.go
+++ b/go/aead/aes_gcm_key_manager.go
@@ -19,7 +19,7 @@
 
 	"github.com/golang/protobuf/proto"
 	"github.com/google/tink/go/keyset"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/subtle/aead"
 	"github.com/google/tink/go/subtle/random"
 	gcmpb "github.com/google/tink/proto/aes_gcm_go_proto"
diff --git a/go/aead/aes_gcm_key_manager_test.go b/go/aead/aes_gcm_key_manager_test.go
index 1b50a7d..c6fb92e 100644
--- a/go/aead/aes_gcm_key_manager_test.go
+++ b/go/aead/aes_gcm_key_manager_test.go
@@ -20,7 +20,7 @@
 	"testing"
 
 	"github.com/golang/protobuf/proto"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	subteAEAD "github.com/google/tink/go/subtle/aead"
 	"github.com/google/tink/go/subtle/random"
 	"github.com/google/tink/go/testutil"
diff --git a/go/aead/chacha20poly1305_key_manager.go b/go/aead/chacha20poly1305_key_manager.go
index 61478dd..3d4ba72 100644
--- a/go/aead/chacha20poly1305_key_manager.go
+++ b/go/aead/chacha20poly1305_key_manager.go
@@ -20,7 +20,7 @@
 	"github.com/golang/protobuf/proto"
 	"golang.org/x/crypto/chacha20poly1305"
 	"github.com/google/tink/go/keyset"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/subtle/aead"
 	"github.com/google/tink/go/subtle/random"
 
diff --git a/go/aead/chacha20poly1305_key_manager_test.go b/go/aead/chacha20poly1305_key_manager_test.go
index 33b39b6..dd69e8a 100644
--- a/go/aead/chacha20poly1305_key_manager_test.go
+++ b/go/aead/chacha20poly1305_key_manager_test.go
@@ -21,7 +21,7 @@
 
 	"github.com/golang/protobuf/proto"
 	"golang.org/x/crypto/chacha20poly1305"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/subtle/random"
 	"github.com/google/tink/go/testutil"
 
diff --git a/go/aead/kms_envelope_aead.go b/go/aead/kms_envelope_aead.go
index fba0a3f..3a0228b 100644
--- a/go/aead/kms_envelope_aead.go
+++ b/go/aead/kms_envelope_aead.go
@@ -18,9 +18,10 @@
 	"bytes"
 	"encoding/binary"
 	"errors"
+	"fmt"
 
 	"github.com/golang/protobuf/proto"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/tink"
 	tinkpb "github.com/google/tink/proto/tink_go_proto"
 )
@@ -55,7 +56,7 @@
 	if err != nil {
 		return nil, err
 	}
-	encryptedDEK, err := a.remote.Encrypt(dek, []byte{0})
+	encryptedDEK, err := a.remote.Encrypt(dek, []byte{})
 	if err != nil {
 		return nil, err
 	}
@@ -65,7 +66,7 @@
 	}
 	primitive, ok := p.(tink.AEAD)
 	if !ok {
-		return nil, errors.New("failed to convert AEAD primitive")
+		return nil, errors.New("kms_envelope_aead: failed to convert AEAD primitive")
 	}
 
 	payload, err := primitive.Encrypt(pt, aad)
@@ -78,58 +79,63 @@
 
 // Decrypt implements the tink.AEAD interface for decryption.
 func (a *KMSEnvelopeAEAD) Decrypt(ct, aad []byte) ([]byte, error) {
-	b := bytes.NewBuffer(ct)
-	bLen := b.Len()
-	l := make([]byte, lenDEK)
-	_, err := b.Read(l)
-	ed, err := binary.ReadVarint(bytes.NewReader(l))
-	if err != nil {
-		return nil, errors.New("invalid ciphertext")
-	}
-	if ed <= 0 || ed > int64(len(ct)-lenDEK) {
-		return nil, errors.New("invalid ciphertext")
-	}
-	encryptedDEK := make([]byte, ed)
-	n, err := b.Read(encryptedDEK)
-	if err != nil || int64(n) != ed {
-		return nil, errors.New("invalid ciphertext")
-	}
-	pl := bLen - lenDEK - int(ed)
-	payload := make([]byte, pl)
-	n, err = b.Read(payload)
-	if err != nil || n != pl {
-		return nil, errors.New("invalid ciphertext")
+	// Verify we have enough bytes for the length of the encrypted DEK.
+	if len(ct) <= lenDEK {
+		return nil, errors.New("kms_envelope_aead: invalid ciphertext")
 	}
 
-	dek, err := a.remote.Decrypt(encryptedDEK, []byte{0})
-	if err != nil {
-		return nil, errors.New("decryption failed")
+	// Extract length of encrypted DEK and advance past that length.
+	ed := int(binary.BigEndian.Uint32(ct[:lenDEK]))
+	ct = ct[lenDEK:]
+
+	// Verify we have enough bytes for the encrypted DEK.
+	if ed <= 0 || len(ct) < ed {
+		return nil, errors.New("kms_envelope_aead: invalid ciphertext")
 	}
+
+	// Extract the encrypted DEK and the payload.
+	encryptedDEK := ct[:ed]
+	payload := ct[ed:]
+	ct = nil
+
+	// Decrypt the DEK.
+	dek, err := a.remote.Decrypt(encryptedDEK, []byte{})
+	if err != nil {
+		return nil, err
+	}
+
+	// Get an AEAD primitive corresponding to the DEK.
 	p, err := registry.Primitive(a.dekTemplate.TypeUrl, dek)
 	if err != nil {
-		return nil, errors.New("decryption failed")
+		return nil, fmt.Errorf("kms_envelope_aead: %s", err)
 	}
 	primitive, ok := p.(tink.AEAD)
 	if !ok {
-		return nil, errors.New("failed to convert AEAD primitive")
+		return nil, errors.New("kms_envelope_aead: failed to convert AEAD primitive")
 	}
+
+	// Decrypt the payload.
 	return primitive.Decrypt(payload, aad)
 }
 
 // buildCipherText builds the cipher text by appending the length DEK, encrypted DEK
 // and the encrypted payload.
 func buildCipherText(encryptedDEK, payload []byte) ([]byte, error) {
-	buf := make([]byte, lenDEK)
 	var b bytes.Buffer
-	_ = binary.PutVarint(buf, int64(len(encryptedDEK)))
-	_, err := b.Write(buf)
+
+	// Write the length of the encrypted DEK.
+	lenDEKbuf := make([]byte, lenDEK)
+	binary.BigEndian.PutUint32(lenDEKbuf, uint32(len(encryptedDEK)))
+	_, err := b.Write(lenDEKbuf)
 	if err != nil {
 		return nil, err
 	}
+
 	_, err = b.Write(encryptedDEK)
 	if err != nil {
 		return nil, err
 	}
+
 	_, err = b.Write(payload)
 	if err != nil {
 		return nil, err
diff --git a/go/aead/kms_envelope_aead_key_manager.go b/go/aead/kms_envelope_aead_key_manager.go
index da75bde..096c57f 100644
--- a/go/aead/kms_envelope_aead_key_manager.go
+++ b/go/aead/kms_envelope_aead_key_manager.go
@@ -20,7 +20,7 @@
 
 	"github.com/golang/protobuf/proto"
 	"github.com/google/tink/go/keyset"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	kmsepb "github.com/google/tink/proto/kms_envelope_go_proto"
 	tinkpb "github.com/google/tink/proto/tink_go_proto"
 )
diff --git a/go/aead/kms_envelope_aead_test.go b/go/aead/kms_envelope_aead_test.go
new file mode 100644
index 0000000..1bceb9a
--- /dev/null
+++ b/go/aead/kms_envelope_aead_test.go
@@ -0,0 +1,70 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package aead_test
+
+import (
+	"testing"
+
+	"github.com/google/tink/go/aead"
+	"github.com/google/tink/go/keyset"
+	"github.com/google/tink/go/tink"
+)
+
+func createKMSEnvelopeAEAD(t *testing.T) tink.AEAD {
+	t.Helper()
+
+	kh, err := keyset.NewHandle(aead.AES256GCMKeyTemplate())
+	if err != nil {
+		t.Fatalf("failed to create new handle: %v", err)
+	}
+
+	parentAEAD, err := aead.New(kh)
+	if err != nil {
+		t.Fatalf("failed to create parent AEAD: %v", err)
+	}
+
+	return aead.NewKMSEnvelopeAEAD(*aead.AES256GCMKeyTemplate(), parentAEAD)
+}
+
+func TestKMSEnvelopeRoundtrip(t *testing.T) {
+	a := createKMSEnvelopeAEAD(t)
+
+	originalPlaintext := "hello world"
+
+	ciphertext, err := a.Encrypt([]byte(originalPlaintext), nil)
+	if err != nil {
+		t.Fatalf("failed to encrypt: %v", err)
+	}
+
+	plaintextBytes, err := a.Decrypt(ciphertext, nil)
+	if err != nil {
+		t.Fatalf("failed to decrypt: %v", err)
+	}
+	plaintext := string(plaintextBytes)
+
+	if plaintext != originalPlaintext {
+		t.Errorf("Decrypt(Encrypt(%q)) = %q; want %q", originalPlaintext, plaintext, originalPlaintext)
+	}
+}
+
+func TestKMSEnvelopeShortCiphertext(t *testing.T) {
+	a := createKMSEnvelopeAEAD(t)
+
+	_, err := a.Decrypt([]byte{1}, nil)
+	if err == nil {
+		t.Errorf("Decrypt({1}) worked, but should've errored out")
+	}
+
+}
diff --git a/go/aead/xchacha20poly1305_key_manager.go b/go/aead/xchacha20poly1305_key_manager.go
index 0f27135..9691b14 100644
--- a/go/aead/xchacha20poly1305_key_manager.go
+++ b/go/aead/xchacha20poly1305_key_manager.go
@@ -20,7 +20,7 @@
 	"github.com/golang/protobuf/proto"
 	"golang.org/x/crypto/chacha20poly1305"
 	"github.com/google/tink/go/keyset"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/subtle/aead"
 	"github.com/google/tink/go/subtle/random"
 
diff --git a/go/aead/xchacha20poly1305_key_manager_test.go b/go/aead/xchacha20poly1305_key_manager_test.go
index 30b97e2..810c903 100644
--- a/go/aead/xchacha20poly1305_key_manager_test.go
+++ b/go/aead/xchacha20poly1305_key_manager_test.go
@@ -21,7 +21,7 @@
 
 	"github.com/golang/protobuf/proto"
 	"golang.org/x/crypto/chacha20poly1305"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/subtle/random"
 	"github.com/google/tink/go/testutil"
 
diff --git a/go/core/cryptofmt/BUILD.bazel b/go/core/cryptofmt/BUILD.bazel
new file mode 100644
index 0000000..573ef11
--- /dev/null
+++ b/go/core/cryptofmt/BUILD.bazel
@@ -0,0 +1,24 @@
+package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
+
+licenses(["notice"])  # keep
+
+load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
+
+go_library(
+    name = "go_default_library",
+    srcs = ["cryptofmt.go"],
+    importpath = "github.com/google/tink/go/core/cryptofmt",
+    visibility = ["//visibility:public"],
+    deps = [
+        "//proto:tink_go_proto",
+    ],
+)
+
+go_test(
+    name = "go_default_test",
+    srcs = ["cryptofmt_test.go"],
+    embed = [":go_default_library"],
+    deps = [
+        "//proto:tink_go_proto",
+    ],
+)
diff --git a/go/core/cryptofmt/cryptofmt.go b/go/core/cryptofmt/cryptofmt.go
new file mode 100644
index 0000000..ef4aecc
--- /dev/null
+++ b/go/core/cryptofmt/cryptofmt.go
@@ -0,0 +1,71 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// Package cryptofmt provides constants and convenience methods that define the
+// format of ciphertexts and signatures.
+package cryptofmt
+
+import (
+	"encoding/binary"
+	"fmt"
+
+	tinkpb "github.com/google/tink/proto/tink_go_proto"
+)
+
+const (
+	// NonRawPrefixSize is the prefix size of Tink and Legacy key types.
+	NonRawPrefixSize = 5
+
+	// LegacyPrefixSize is the prefix size of legacy key types.
+	// The prefix starts with \x00 and followed by a 4-byte key id.
+	LegacyPrefixSize = NonRawPrefixSize
+	// LegacyStartByte is the first byte of the prefix of legacy key types.
+	LegacyStartByte = byte(0)
+
+	// TinkPrefixSize is the prefix size of Tink key types.
+	// The prefix starts with \x01 and followed by a 4-byte key id.
+	TinkPrefixSize = NonRawPrefixSize
+	// TinkStartByte is the first byte of the prefix of Tink key types.
+	TinkStartByte = byte(1)
+
+	// RawPrefixSize is the prefix size of Raw key types.
+	// Raw prefix is empty.
+	RawPrefixSize = 0
+	// RawPrefix is the empty prefix of Raw key types.
+	RawPrefix = ""
+)
+
+// OutputPrefix generates the prefix of ciphertexts produced by the crypto
+// primitive obtained from key.  The prefix can be either empty (for RAW-type
+// prefix), or consists of a 1-byte indicator of the type of the prefix,
+// followed by 4 bytes of the key ID in big endian encoding.
+func OutputPrefix(key *tinkpb.Keyset_Key) (string, error) {
+	switch key.OutputPrefixType {
+	case tinkpb.OutputPrefixType_LEGACY, tinkpb.OutputPrefixType_CRUNCHY:
+		return createOutputPrefix(LegacyPrefixSize, LegacyStartByte, key.KeyId), nil
+	case tinkpb.OutputPrefixType_TINK:
+		return createOutputPrefix(TinkPrefixSize, TinkStartByte, key.KeyId), nil
+	case tinkpb.OutputPrefixType_RAW:
+		return RawPrefix, nil
+	default:
+		return "", fmt.Errorf("crypto_format: unknown output prefix type")
+	}
+}
+
+func createOutputPrefix(size int, startByte byte, keyID uint32) string {
+	prefix := make([]byte, size)
+	prefix[0] = startByte
+	binary.BigEndian.PutUint32(prefix[1:], keyID)
+	return string(prefix)
+}
diff --git a/go/core/cryptofmt/cryptofmt_test.go b/go/core/cryptofmt/cryptofmt_test.go
new file mode 100644
index 0000000..b6fa6a5
--- /dev/null
+++ b/go/core/cryptofmt/cryptofmt_test.go
@@ -0,0 +1,83 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package cryptofmt_test
+
+import (
+	"testing"
+
+	"github.com/google/tink/go/core/cryptofmt"
+	tinkpb "github.com/google/tink/proto/tink_go_proto"
+)
+
+var tests = []struct {
+	keyID  uint32
+	result string // expected prefix
+}{
+	{
+		keyID:  1000000,
+		result: string([]byte{0, 15, 66, 64}),
+	},
+	{
+		keyID:  4294967295,
+		result: string([]byte{255, 255, 255, 255}),
+	},
+	{
+		keyID:  0,
+		result: string([]byte{0, 0, 0, 0}),
+	},
+}
+
+func TestOutputPrefix(t *testing.T) {
+	key := new(tinkpb.Keyset_Key)
+	for i, test := range tests {
+		key.KeyId = test.keyID
+		// legacy type
+		key.OutputPrefixType = tinkpb.OutputPrefixType_LEGACY
+		prefix, err := cryptofmt.OutputPrefix(key)
+		if err != nil || !validatePrefix(prefix, cryptofmt.LegacyStartByte, test.result) {
+			t.Errorf("incorrect legacy prefix in test %d", i)
+		}
+		// crunchy type
+		key.OutputPrefixType = tinkpb.OutputPrefixType_CRUNCHY
+		prefix, err = cryptofmt.OutputPrefix(key)
+		if err != nil || !validatePrefix(prefix, cryptofmt.LegacyStartByte, test.result) {
+			t.Errorf("incorrect legacy prefix in test %d", i)
+		}
+		// tink type
+		key.OutputPrefixType = tinkpb.OutputPrefixType_TINK
+		prefix, err = cryptofmt.OutputPrefix(key)
+		if err != nil || !validatePrefix(prefix, cryptofmt.TinkStartByte, test.result) {
+			t.Errorf("incorrect tink prefix in test %d", i)
+		}
+		// raw type
+		key.OutputPrefixType = tinkpb.OutputPrefixType_RAW
+		prefix, err = cryptofmt.OutputPrefix(key)
+		if err != nil || prefix != cryptofmt.RawPrefix {
+			t.Errorf("incorrect raw prefix in test %d", i)
+		}
+	}
+	// unknown prefix type
+	key.OutputPrefixType = tinkpb.OutputPrefixType_UNKNOWN_PREFIX
+	if _, err := cryptofmt.OutputPrefix(key); err == nil {
+		t.Errorf("expect an error when prefix type is unknown")
+	}
+}
+
+func validatePrefix(prefix string, startByte byte, key string) bool {
+	if prefix[0] != startByte {
+		return false
+	}
+	return prefix[1:] == key
+}
diff --git a/go/core/primitiveset/BUILD.bazel b/go/core/primitiveset/BUILD.bazel
new file mode 100644
index 0000000..b33ab10
--- /dev/null
+++ b/go/core/primitiveset/BUILD.bazel
@@ -0,0 +1,27 @@
+package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
+
+licenses(["notice"])  # keep
+
+load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
+
+go_library(
+    name = "go_default_library",
+    srcs = ["primitiveset.go"],
+    importpath = "github.com/google/tink/go/core/primitiveset",
+    visibility = ["//visibility:public"],
+    deps = [
+        "//go/core/cryptofmt:go_default_library",
+        "//proto:tink_go_proto",
+    ],
+)
+
+go_test(
+    name = "go_default_test",
+    srcs = ["primitiveset_test.go"],
+    embed = [":go_default_library"],
+    deps = [
+        "//go/core/cryptofmt:go_default_library",
+        "//go/testutil:go_default_library",
+        "//proto:tink_go_proto",
+    ],
+)
diff --git a/go/core/primitiveset/primitiveset.go b/go/core/primitiveset/primitiveset.go
new file mode 100644
index 0000000..9f7f20a
--- /dev/null
+++ b/go/core/primitiveset/primitiveset.go
@@ -0,0 +1,106 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// Package primitiveset provides a container for a set of cryptographic
+// primitives.
+//
+// It provides also additional properties for the primitives it holds. In
+// particular, one of the primitives in the set can be distinguished as "the
+// primary" one.
+package primitiveset
+
+import (
+	"fmt"
+
+	"github.com/google/tink/go/core/cryptofmt"
+	tinkpb "github.com/google/tink/proto/tink_go_proto"
+)
+
+// Entry represents a single entry in the keyset. In addition to the actual
+// primitive, it holds the identifier and status of the primitive.
+type Entry struct {
+	Primitive  interface{}
+	Prefix     string
+	PrefixType tinkpb.OutputPrefixType
+	Status     tinkpb.KeyStatusType
+}
+
+func newEntry(p interface{}, prefix string, prefixType tinkpb.OutputPrefixType, status tinkpb.KeyStatusType) *Entry {
+	return &Entry{
+		Primitive:  p,
+		Prefix:     prefix,
+		Status:     status,
+		PrefixType: prefixType,
+	}
+}
+
+// PrimitiveSet is used for supporting key rotation: primitives in a set
+// correspond to keys in a keyset. Users will usually work with primitive
+// instances, which essentially wrap primitive sets. For example an instance of
+// an AEAD-primitive for a given keyset holds a set of AEAD-primitives
+// corresponding to the keys in the keyset, and uses the set members to do the
+// actual crypto operations: to encrypt data the primary AEAD-primitive from
+// the set is used, and upon decryption the ciphertext's prefix determines the
+// id of the primitive from the set.
+//
+// PrimitiveSet is a public to allow its use in implementations of custom
+// primitives.
+type PrimitiveSet struct {
+	// Primary entry.
+	Primary *Entry
+
+	// The primitives are stored in a map of (ciphertext prefix, list of
+	// primitives sharing the prefix). This allows quickly retrieving the
+	// primitives sharing some particular prefix.
+	Entries map[string][]*Entry
+}
+
+// New returns an empty instance of PrimitiveSet.
+func New() *PrimitiveSet {
+	return &PrimitiveSet{
+		Primary: nil,
+		Entries: make(map[string][]*Entry),
+	}
+}
+
+// RawEntries returns all primitives in the set that have RAW prefix.
+func (ps *PrimitiveSet) RawEntries() ([]*Entry, error) {
+	return ps.EntriesForPrefix(cryptofmt.RawPrefix)
+}
+
+// EntriesForPrefix returns all primitives in the set that have the given prefix.
+func (ps *PrimitiveSet) EntriesForPrefix(prefix string) ([]*Entry, error) {
+	result, found := ps.Entries[prefix]
+	if !found {
+		return []*Entry{}, nil
+	}
+	return result, nil
+}
+
+// Add creates a new entry in the primitive set and returns the added entry.
+func (ps *PrimitiveSet) Add(p interface{}, key *tinkpb.Keyset_Key) (*Entry, error) {
+	if key == nil || p == nil {
+		return nil, fmt.Errorf("primitive_set: key and primitive must not be nil")
+	}
+	if key.Status != tinkpb.KeyStatusType_ENABLED {
+		return nil, fmt.Errorf("The key must be ENABLED")
+	}
+	prefix, err := cryptofmt.OutputPrefix(key)
+	if err != nil {
+		return nil, fmt.Errorf("primitive_set: %s", err)
+	}
+	e := newEntry(p, prefix, key.OutputPrefixType, key.Status)
+	ps.Entries[prefix] = append(ps.Entries[prefix], e)
+	return e, nil
+}
diff --git a/go/core/primitiveset/primitiveset_test.go b/go/core/primitiveset/primitiveset_test.go
new file mode 100644
index 0000000..5a33dad
--- /dev/null
+++ b/go/core/primitiveset/primitiveset_test.go
@@ -0,0 +1,169 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package primitiveset_test
+
+import (
+	"fmt"
+	"reflect"
+	"testing"
+
+	"github.com/google/tink/go/core/cryptofmt"
+	"github.com/google/tink/go/core/primitiveset"
+	"github.com/google/tink/go/testutil"
+	tinkpb "github.com/google/tink/proto/tink_go_proto"
+)
+
+func createKeyset() []*tinkpb.Keyset_Key {
+	var keyID0 = 1234543
+	var keyID1 = 7213743
+	var keyID2 = keyID1
+	var keyID3 = 947327
+	var keyID4 = 529472
+	var keyID5 = keyID0
+	return []*tinkpb.Keyset_Key{
+		testutil.NewDummyKey(keyID0, tinkpb.KeyStatusType_ENABLED, tinkpb.OutputPrefixType_TINK),
+		testutil.NewDummyKey(keyID1, tinkpb.KeyStatusType_ENABLED, tinkpb.OutputPrefixType_LEGACY),
+		testutil.NewDummyKey(keyID2, tinkpb.KeyStatusType_ENABLED, tinkpb.OutputPrefixType_TINK),
+		testutil.NewDummyKey(keyID3, tinkpb.KeyStatusType_ENABLED, tinkpb.OutputPrefixType_RAW),
+		testutil.NewDummyKey(keyID4, tinkpb.KeyStatusType_ENABLED, tinkpb.OutputPrefixType_RAW),
+		testutil.NewDummyKey(keyID5, tinkpb.KeyStatusType_ENABLED, tinkpb.OutputPrefixType_TINK),
+	}
+}
+
+func TestPrimitiveSetBasic(t *testing.T) {
+	var err error
+	ps := primitiveset.New()
+	if ps.Primary != nil || ps.Entries == nil {
+		t.Errorf("expect primary to be nil and primitives is initialized")
+	}
+	// generate test keys
+	keys := createKeyset()
+	// add all test primitives
+	macs := make([]testutil.DummyMAC, len(keys))
+	entries := make([]*primitiveset.Entry, len(macs))
+	for i := 0; i < len(macs); i++ {
+		macs[i] = testutil.DummyMAC{Name: fmt.Sprintf("Mac#%d", i)}
+		entries[i], err = ps.Add(macs[i], keys[i])
+		if err != nil {
+			t.Errorf("unexpected error when adding mac%d: %s", i, err)
+		}
+	}
+	// set primary entry
+	primaryID := 2
+	ps.Primary = entries[primaryID]
+
+	// check raw primitive
+	rawMacs := []testutil.DummyMAC{macs[3], macs[4]}
+	rawStatuses := []tinkpb.KeyStatusType{keys[3].Status, keys[4].Status}
+	rawPrefixTypes := []tinkpb.OutputPrefixType{keys[3].OutputPrefixType, keys[4].OutputPrefixType}
+	rawEntries, err := ps.RawEntries()
+	if err != nil {
+		t.Errorf("unexpected error when getting raw primitives: %s", err)
+	}
+	if !validateEntryList(rawEntries, rawMacs, rawStatuses, rawPrefixTypes) {
+		t.Errorf("raw primitives do not match input")
+	}
+	// check tink primitives, same id
+	tinkMacs := []testutil.DummyMAC{macs[0], macs[5]}
+	tinkStatuses := []tinkpb.KeyStatusType{keys[0].Status, keys[5].Status}
+	tinkPrefixTypes := []tinkpb.OutputPrefixType{keys[0].OutputPrefixType, keys[5].OutputPrefixType}
+	prefix, _ := cryptofmt.OutputPrefix(keys[0])
+	tinkEntries, err := ps.EntriesForPrefix(prefix)
+	if err != nil {
+		t.Errorf("unexpected error when getting primitives: %s", err)
+	}
+	if !validateEntryList(tinkEntries, tinkMacs, tinkStatuses, tinkPrefixTypes) {
+		t.Errorf("tink primitives do not match the input key")
+	}
+	// check another tink primitive
+	tinkMacs = []testutil.DummyMAC{macs[2]}
+	tinkStatuses = []tinkpb.KeyStatusType{keys[2].Status}
+	tinkPrefixTypes = []tinkpb.OutputPrefixType{keys[2].OutputPrefixType}
+	prefix, _ = cryptofmt.OutputPrefix(keys[2])
+	tinkEntries, err = ps.EntriesForPrefix(prefix)
+	if err != nil {
+		t.Errorf("unexpected error when getting tink primitives: %s", err)
+	}
+	if !validateEntryList(tinkEntries, tinkMacs, tinkStatuses, tinkPrefixTypes) {
+		t.Errorf("tink primitives do not match the input key")
+	}
+	//check legacy primitives
+	legacyMacs := []testutil.DummyMAC{macs[1]}
+	legacyStatuses := []tinkpb.KeyStatusType{keys[1].Status}
+	legacyPrefixTypes := []tinkpb.OutputPrefixType{keys[1].OutputPrefixType}
+	legacyPrefix, _ := cryptofmt.OutputPrefix(keys[1])
+	legacyEntries, err := ps.EntriesForPrefix(legacyPrefix)
+	if err != nil {
+		t.Errorf("unexpected error when getting legacy primitives: %s", err)
+	}
+	if !validateEntryList(legacyEntries, legacyMacs, legacyStatuses, legacyPrefixTypes) {
+		t.Errorf("legacy primitives do not match the input key")
+	}
+}
+
+func TestAddWithInvalidInput(t *testing.T) {
+	ps := primitiveset.New()
+	// nil input
+	key := testutil.NewDummyKey(0, tinkpb.KeyStatusType_ENABLED, tinkpb.OutputPrefixType_TINK)
+	if _, err := ps.Add(nil, key); err == nil {
+		t.Errorf("expect an error when primitive input is nil")
+	}
+	if _, err := ps.Add(*new(testutil.DummyMAC), nil); err == nil {
+		t.Errorf("expect an error when key input is nil")
+	}
+	// unknown prefix type
+	invalidKey := testutil.NewDummyKey(0, tinkpb.KeyStatusType_ENABLED, tinkpb.OutputPrefixType_UNKNOWN_PREFIX)
+	if _, err := ps.Add(*new(testutil.DummyMAC), invalidKey); err == nil {
+		t.Errorf("expect an error when key is invalid")
+	}
+	// disabled key
+	disabledKey := testutil.NewDummyKey(0, tinkpb.KeyStatusType_DISABLED, tinkpb.OutputPrefixType_UNKNOWN_PREFIX)
+	if _, err := ps.Add(*new(testutil.DummyMAC), disabledKey); err == nil {
+		t.Errorf("expect an error when key is disabled")
+	}
+
+}
+
+func validateEntryList(entries []*primitiveset.Entry,
+	macs []testutil.DummyMAC,
+	statuses []tinkpb.KeyStatusType,
+	prefixTypes []tinkpb.OutputPrefixType) bool {
+	if len(entries) != len(macs) {
+		return false
+	}
+	for i := 0; i < len(entries); i++ {
+		if !validateEntry(entries[i], macs[i], statuses[i], prefixTypes[i]) {
+			return false
+		}
+	}
+	return true
+}
+
+// Compares an entry with the testutil.DummyMAC that was used to create the entry
+func validateEntry(entry *primitiveset.Entry,
+	testMac testutil.DummyMAC,
+	status tinkpb.KeyStatusType,
+	outputPrefixType tinkpb.OutputPrefixType) bool {
+	if entry.Status != status || entry.PrefixType != outputPrefixType {
+		return false
+	}
+	var dummyMac = entry.Primitive.(testutil.DummyMAC)
+	data := []byte{1, 2, 3, 4, 5}
+	digest, err := dummyMac.ComputeMAC(data)
+	if err != nil || !reflect.DeepEqual(append(data, testMac.Name...), digest) {
+		return false
+	}
+	return true
+}
diff --git a/go/core/registry/BUILD.bazel b/go/core/registry/BUILD.bazel
new file mode 100644
index 0000000..04665a6
--- /dev/null
+++ b/go/core/registry/BUILD.bazel
@@ -0,0 +1,40 @@
+package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
+
+licenses(["notice"])  # keep
+
+load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
+
+go_library(
+    name = "go_default_library",
+    srcs = [
+        "key_manager.go",
+        "kms_client.go",
+        "private_key_manager.go",
+        "registry.go",
+    ],
+    importpath = "github.com/google/tink/go/core/registry",
+    visibility = ["//visibility:public"],
+    deps = [
+        "//go/tink:go_default_library",
+        "//proto:tink_go_proto",
+        "@com_github_golang_protobuf//proto:go_default_library",
+    ],
+)
+
+go_test(
+    name = "tink_test",
+    size = "small",
+    srcs = ["registry_test.go"],
+    deps = [
+        "//go/aead:go_default_library",
+        "//go/core/registry:go_default_library",
+        "//go/mac:go_default_library",
+        "//go/subtle/mac:go_default_library",
+        "//go/testutil:go_default_library",
+        "//proto:aes_gcm_go_proto",
+        "//proto:common_go_proto",
+        "//proto:hmac_go_proto",
+        "//proto:tink_go_proto",
+        "@com_github_golang_protobuf//proto:go_default_library",
+    ],
+)
diff --git a/go/registry/key_manager.go b/go/core/registry/key_manager.go
similarity index 100%
rename from go/registry/key_manager.go
rename to go/core/registry/key_manager.go
diff --git a/go/core/registry/kms_client.go b/go/core/registry/kms_client.go
new file mode 100644
index 0000000..00abf80
--- /dev/null
+++ b/go/core/registry/kms_client.go
@@ -0,0 +1,26 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package registry
+
+import "github.com/google/tink/go/tink"
+
+// KMSClient knows how to produce primitives backed by keys stored in remote KMS services.
+type KMSClient interface {
+	// Supported true if this client does support keyURI
+	Supported(keyURI string) bool
+
+	// GetAEAD  gets an AEAD backend by keyURI.
+	GetAEAD(keyURI string) (tink.AEAD, error)
+}
diff --git a/go/registry/private_key_manager.go b/go/core/registry/private_key_manager.go
similarity index 100%
rename from go/registry/private_key_manager.go
rename to go/core/registry/private_key_manager.go
diff --git a/go/core/registry/registry.go b/go/core/registry/registry.go
new file mode 100644
index 0000000..758a921
--- /dev/null
+++ b/go/core/registry/registry.go
@@ -0,0 +1,132 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// Package registry provides a container that for each supported key type holds
+// a corresponding KeyManager object, which can generate new keys or
+// instantiate the primitive corresponding to given key.
+//
+// Registry is initialized at startup, and is later used to instantiate
+// primitives for given keys or keysets. Keeping KeyManagers for all primitives
+// in a single Registry (rather than having a separate KeyManager per
+// primitive) enables modular construction of compound primitives from "simple"
+// ones, e.g., AES-CTR-HMAC AEAD encryption uses IND-CPA encryption and a MAC.
+//
+// Note that regular users will usually not work directly with Registry, but
+// rather via primitive factories, which in the background query the Registry
+// for specific KeyManagers. Registry is public though, to enable
+// configurations with custom primitives and KeyManagers.
+package registry
+
+import (
+	"fmt"
+	"sync"
+
+	"github.com/golang/protobuf/proto"
+	tinkpb "github.com/google/tink/proto/tink_go_proto"
+)
+
+var (
+	keyManagersMu sync.RWMutex
+	keyManagers   = make(map[string]KeyManager) // typeURL -> KeyManager
+	kmsClientsMu  sync.RWMutex
+	kmsClients    = []KMSClient{}
+)
+
+// RegisterKeyManager registers the given key manager.
+// Does not allow to overwrite existing key managers.
+func RegisterKeyManager(km KeyManager) error {
+	keyManagersMu.Lock()
+	defer keyManagersMu.Unlock()
+	typeURL := km.TypeURL()
+	if _, existed := keyManagers[typeURL]; existed {
+		return fmt.Errorf("registry.RegisterKeyManager: type %s already registered", typeURL)
+	}
+	keyManagers[typeURL] = km
+	return nil
+}
+
+// GetKeyManager returns the key manager for the given typeURL if existed.
+func GetKeyManager(typeURL string) (KeyManager, error) {
+	keyManagersMu.RLock()
+	defer keyManagersMu.RUnlock()
+	km, existed := keyManagers[typeURL]
+	if !existed {
+		return nil, fmt.Errorf("registry.GetKeyManager: unsupported key type: %s", typeURL)
+	}
+	return km, nil
+}
+
+// NewKeyData generates a new KeyData for the given key template.
+func NewKeyData(kt *tinkpb.KeyTemplate) (*tinkpb.KeyData, error) {
+	if kt == nil {
+		return nil, fmt.Errorf("registry.NewKeyData: invalid key template")
+	}
+	km, err := GetKeyManager(kt.TypeUrl)
+	if err != nil {
+		return nil, err
+	}
+	return km.NewKeyData(kt.Value)
+}
+
+// NewKey generates a new key for the given key template.
+func NewKey(kt *tinkpb.KeyTemplate) (proto.Message, error) {
+	if kt == nil {
+		return nil, fmt.Errorf("registry.NewKey: invalid key template")
+	}
+	km, err := GetKeyManager(kt.TypeUrl)
+	if err != nil {
+		return nil, err
+	}
+	return km.NewKey(kt.Value)
+}
+
+// PrimitiveFromKeyData creates a new primitive for the key given in the given KeyData.
+func PrimitiveFromKeyData(kd *tinkpb.KeyData) (interface{}, error) {
+	if kd == nil {
+		return nil, fmt.Errorf("registry.PrimitiveFromKeyData: invalid key data")
+	}
+	return Primitive(kd.TypeUrl, kd.Value)
+}
+
+// Primitive creates a new primitive for the given serialized key using the KeyManager
+// identified by the given typeURL.
+func Primitive(typeURL string, sk []byte) (interface{}, error) {
+	if len(sk) == 0 {
+		return nil, fmt.Errorf("registry.Primitive: invalid serialized key")
+	}
+	km, err := GetKeyManager(typeURL)
+	if err != nil {
+		return nil, err
+	}
+	return km.Primitive(sk)
+}
+
+// RegisterKMSClient is used to register a new KMS client
+func RegisterKMSClient(k KMSClient) {
+	kmsClientsMu.Lock()
+	defer kmsClientsMu.Unlock()
+	kmsClients = append(kmsClients, k)
+}
+
+// GetKMSClient fetches a KMSClient by a given URI.
+func GetKMSClient(keyURI string) (KMSClient, error) {
+	kmsClientsMu.RLock()
+	defer kmsClientsMu.RUnlock()
+	for _, k := range kmsClients {
+		if k.Supported(keyURI) {
+			return k, nil
+		}
+	}
+	return nil, fmt.Errorf("KMS client supporting %s not found", keyURI)
+}
diff --git a/go/core/registry/registry_test.go b/go/core/registry/registry_test.go
new file mode 100644
index 0000000..0fa6812
--- /dev/null
+++ b/go/core/registry/registry_test.go
@@ -0,0 +1,181 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package registry_test
+
+import (
+	"testing"
+
+	"github.com/golang/protobuf/proto"
+	"github.com/google/tink/go/aead"
+	"github.com/google/tink/go/mac"
+	"github.com/google/tink/go/core/registry"
+	subtleMac "github.com/google/tink/go/subtle/mac"
+	"github.com/google/tink/go/testutil"
+	gcmpb "github.com/google/tink/proto/aes_gcm_go_proto"
+	commonpb "github.com/google/tink/proto/common_go_proto"
+	hmacpb "github.com/google/tink/proto/hmac_go_proto"
+	tinkpb "github.com/google/tink/proto/tink_go_proto"
+)
+
+func TestRegisterKeyManager(t *testing.T) {
+	// get HMACKeyManager
+	_, err := registry.GetKeyManager(testutil.HMACTypeURL)
+	if err != nil {
+		t.Errorf("unexpected error: %s", err)
+	}
+	// get AESGCMKeyManager
+	_, err = registry.GetKeyManager(testutil.AESGCMTypeURL)
+	if err != nil {
+		t.Errorf("unexpected error: %s", err)
+	}
+	// some random typeurl
+	if _, err = registry.GetKeyManager("some url"); err == nil {
+		t.Errorf("expect an error when a type url doesn't exist in the registry")
+	}
+}
+
+func TestRegisterKeyManagerWithCollision(t *testing.T) {
+	// dummyKeyManager's typeURL is equal to that of AESGCM
+	var dummyKeyManager = new(testutil.DummyAEADKeyManager)
+	// This should fail because overwriting is disallowed.
+	err := registry.RegisterKeyManager(dummyKeyManager)
+	if err == nil {
+		t.Errorf("%s shouldn't be registered again", testutil.AESGCMTypeURL)
+	}
+
+	km, err := registry.GetKeyManager(testutil.AESGCMTypeURL)
+	if err != nil {
+		t.Errorf("unexpected error: %s", err)
+	}
+	// This should fail because overwriting is disallowed, even with the same key manager.
+	err = registry.RegisterKeyManager(km)
+	if err == nil {
+		t.Errorf("%s shouldn't be registered again", testutil.AESGCMTypeURL)
+	}
+}
+
+func TestNewKeyData(t *testing.T) {
+	// new Keydata from a Hmac KeyTemplate
+	keyData, err := registry.NewKeyData(mac.HMACSHA256Tag128KeyTemplate())
+	if err != nil {
+		t.Errorf("unexpected error: %s", err)
+	}
+	if keyData.TypeUrl != testutil.HMACTypeURL {
+		t.Errorf("invalid key data")
+	}
+	key := new(hmacpb.HmacKey)
+	if err := proto.Unmarshal(keyData.Value, key); err != nil {
+		t.Errorf("unexpected error when unmarshal HmacKey: %s", err)
+	}
+	// nil
+	if _, err := registry.NewKeyData(nil); err == nil {
+		t.Errorf("expect an error when key template is nil")
+	}
+	// unregistered type url
+	template := &tinkpb.KeyTemplate{TypeUrl: "some url", Value: []byte{0}}
+	if _, err := registry.NewKeyData(template); err == nil {
+		t.Errorf("expect an error when key template contains unregistered typeURL")
+	}
+}
+
+func TestNewKey(t *testing.T) {
+	// aead template
+	aesGcmTemplate := aead.AES128GCMKeyTemplate()
+	key, err := registry.NewKey(aesGcmTemplate)
+	if err != nil {
+		t.Errorf("unexpected error: %s", err)
+	}
+	var aesGcmKey = key.(*gcmpb.AesGcmKey)
+	aesGcmFormat := new(gcmpb.AesGcmKeyFormat)
+	if err := proto.Unmarshal(aesGcmTemplate.Value, aesGcmFormat); err != nil {
+		t.Errorf("unexpected error: %s", err)
+	}
+	if aesGcmFormat.KeySize != uint32(len(aesGcmKey.KeyValue)) {
+		t.Errorf("key doesn't match template")
+	}
+	//nil
+	if _, err := registry.NewKey(nil); err == nil {
+		t.Errorf("expect an error when key template is nil")
+	}
+	// unregistered type url
+	template := &tinkpb.KeyTemplate{TypeUrl: "some url", Value: []byte{0}}
+	if _, err := registry.NewKey(template); err == nil {
+		t.Errorf("expect an error when key template is not registered")
+	}
+}
+
+func TestPrimitiveFromKeyData(t *testing.T) {
+	// hmac keydata
+	keyData := testutil.NewHMACKeyData(commonpb.HashType_SHA256, 16)
+	p, err := registry.PrimitiveFromKeyData(keyData)
+	if err != nil {
+		t.Errorf("unexpected error: %s", err)
+	}
+	var _ *subtleMac.HMAC = p.(*subtleMac.HMAC)
+	// unregistered url
+	keyData.TypeUrl = "some url"
+	if _, err := registry.PrimitiveFromKeyData(keyData); err == nil {
+		t.Errorf("expect an error when typeURL has not been registered")
+	}
+	// unmatched url
+	keyData.TypeUrl = testutil.AESGCMTypeURL
+	if _, err := registry.PrimitiveFromKeyData(keyData); err == nil {
+		t.Errorf("expect an error when typeURL doesn't match key")
+	}
+	// nil
+	if _, err := registry.PrimitiveFromKeyData(nil); err == nil {
+		t.Errorf("expect an error when key data is nil")
+	}
+}
+
+func TestPrimitive(t *testing.T) {
+	// hmac key
+	key := testutil.NewHMACKey(commonpb.HashType_SHA256, 16)
+	serializedKey, _ := proto.Marshal(key)
+	p, err := registry.Primitive(testutil.HMACTypeURL, serializedKey)
+	if err != nil {
+		t.Errorf("unexpected error: %s", err)
+	}
+	var _ *subtleMac.HMAC = p.(*subtleMac.HMAC)
+	// unregistered url
+	if _, err := registry.Primitive("some url", serializedKey); err == nil {
+		t.Errorf("expect an error when typeURL has not been registered")
+	}
+	// unmatched url
+	if _, err := registry.Primitive(testutil.AESGCMTypeURL, serializedKey); err == nil {
+		t.Errorf("expect an error when typeURL doesn't match key")
+	}
+	// void key
+	if _, err := registry.Primitive(testutil.AESGCMTypeURL, nil); err == nil {
+		t.Errorf("expect an error when key is nil")
+	}
+	if _, err := registry.Primitive(testutil.AESGCMTypeURL, []byte{}); err == nil {
+		t.Errorf("expect an error when key is nil")
+	}
+	if _, err := registry.Primitive(testutil.AESGCMTypeURL, []byte{0}); err == nil {
+		t.Errorf("expect an error when key is nil")
+	}
+}
+
+func TestRegisterKmsClient(t *testing.T) {
+	kms := &testutil.DummyKMSClient{}
+	registry.RegisterKMSClient(kms)
+
+	_, err := registry.GetKMSClient("dummy")
+	if err != nil {
+		t.Errorf("error fetching dummy kms client: %s", err)
+	}
+
+}
diff --git a/go/daead/BUILD.bazel b/go/daead/BUILD.bazel
index bc93b6b..97592a6 100644
--- a/go/daead/BUILD.bazel
+++ b/go/daead/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
 
-licenses(["notice"])  # Apache 2.0 # keep
+licenses(["notice"])  # keep
 
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
@@ -10,14 +10,15 @@
         "aes_siv_key_manager.go",
         "daead.go",
         "daead_factory.go",
+        "daead_key_templates.go",
     ],
     importpath = "github.com/google/tink/go/daead",
     visibility = ["//visibility:public"],
     deps = [
-        "//go/format:go_default_library",
+        "//go/core/cryptofmt:go_default_library",
+        "//go/core/primitiveset:go_default_library",
+        "//go/core/registry:go_default_library",
         "//go/keyset:go_default_library",
-        "//go/registry:go_default_library",
-        "//go/primitiveset:go_default_library",
         "//go/subtle/daead:go_default_library",
         "//go/subtle/random:go_default_library",
         "//go/tink:go_default_library",
@@ -32,13 +33,14 @@
     srcs = [
         "aes_siv_key_manager_test.go",
         "daead_factory_test.go",
+        "daead_key_templates_test.go",
         "daead_test.go",
     ],
     embed = [":go_default_library"],
     deps = [
-        "//go/format:go_default_library",
+        "//go/core/cryptofmt:go_default_library",
+        "//go/core/registry:go_default_library",
         "//go/keyset:go_default_library",
-        "//go/registry:go_default_library",
         "//go/subtle/daead:go_default_library",
         "//go/subtle/random:go_default_library",
         "//go/testkeyset:go_default_library",
@@ -49,4 +51,3 @@
         "@com_github_golang_protobuf//proto:go_default_library",
     ],
 )
-
diff --git a/go/daead/aes_siv_key_manager.go b/go/daead/aes_siv_key_manager.go
index c7c4de9..ece7524 100644
--- a/go/daead/aes_siv_key_manager.go
+++ b/go/daead/aes_siv_key_manager.go
@@ -19,7 +19,7 @@
 
 	"github.com/golang/protobuf/proto"
 	"github.com/google/tink/go/keyset"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/subtle/daead"
 	"github.com/google/tink/go/subtle/random"
 
diff --git a/go/daead/aes_siv_key_manager_test.go b/go/daead/aes_siv_key_manager_test.go
index f07ec8f..c1bcc74 100644
--- a/go/daead/aes_siv_key_manager_test.go
+++ b/go/daead/aes_siv_key_manager_test.go
@@ -20,7 +20,7 @@
 	"testing"
 
 	"github.com/golang/protobuf/proto"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/subtle/random"
 	"github.com/google/tink/go/testutil"
 
diff --git a/go/daead/daead.go b/go/daead/daead.go
index 4516ae2..3342188 100644
--- a/go/daead/daead.go
+++ b/go/daead/daead.go
@@ -13,12 +13,54 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 // Package daead provides implementations of the DeterministicAEAD primitive.
+//
+// Unlike AEAD, implementations of this interface are not semantically secure, because
+// encrypting the same plaintex always yields the same ciphertext.
+//
+// Example:
+//
+//   package main
+//
+//   import (
+//       "fmt"
+//
+//       "github.com/google/tink/go/daead"
+//       "github.com/google/tink/go/keyset"
+//   )
+//
+//   func main() {
+//
+//       kh, err := keyset.NewHandle(daead.AESSIVKeyTemplate())
+//       if err != nil {
+//           // handle the error
+//       }
+//
+//       d := daead.New(kh)
+//
+//       ct1 , err := d.EncryptDeterministically([]byte("this data needs to be encrypted"), []byte("additional data"))
+//       if err != nil {
+//           // handle error
+//       }
+//
+//       pt , err := d.DecryptDeterministically(ct, []byte("additional data"))
+//       if err != nil {
+//           // handle error
+//       }
+//
+//       ct2 , err := d.EncryptDeterministically([]byte("this data needs to be encrypted"), []byte("additional data"))
+//       if err != nil {
+//           // handle error
+//       }
+//
+//       // ct1 will be equal to ct2
+//
+//   }
 package daead
 
 import (
 	"fmt"
 
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 )
 
 func init() {
diff --git a/go/daead/daead_factory.go b/go/daead/daead_factory.go
index d0a3068..b5598cf 100644
--- a/go/daead/daead_factory.go
+++ b/go/daead/daead_factory.go
@@ -17,10 +17,10 @@
 import (
 	"fmt"
 
-	"github.com/google/tink/go/format"
+	"github.com/google/tink/go/core/cryptofmt"
 	"github.com/google/tink/go/keyset"
-	"github.com/google/tink/go/primitiveset"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/primitiveset"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/tink"
 )
 
@@ -59,7 +59,7 @@
 		return nil, err
 	}
 
-	var ret []byte
+	ret := make([]byte, 0, len(primary.Prefix) + len(ct))
 	ret = append(ret, primary.Prefix...)
 	ret = append(ret, ct...)
 	return ret, nil
@@ -70,7 +70,7 @@
 // ciphertext is authenticated.
 func (d *primitiveSet) DecryptDeterministically(ct, aad []byte) ([]byte, error) {
 	// try non-raw keys
-	prefixSize := format.NonRawPrefixSize
+	prefixSize := cryptofmt.NonRawPrefixSize
 	if len(ct) > prefixSize {
 		prefix := ct[:prefixSize]
 		ctNoPrefix := ct[prefixSize:]
diff --git a/go/daead/daead_factory_test.go b/go/daead/daead_factory_test.go
index 2f2d4d7..8964dbf 100644
--- a/go/daead/daead_factory_test.go
+++ b/go/daead/daead_factory_test.go
@@ -21,7 +21,7 @@
 	"testing"
 
 	"github.com/google/tink/go/daead"
-	"github.com/google/tink/go/format"
+	"github.com/google/tink/go/core/cryptofmt"
 	"github.com/google/tink/go/subtle/random"
 	"github.com/google/tink/go/testkeyset"
 	"github.com/google/tink/go/testutil"
@@ -42,7 +42,7 @@
 	if err != nil {
 		t.Errorf("daead.New failed: %s", err)
 	}
-	expectedPrefix, _ := format.OutputPrefix(primaryKey)
+	expectedPrefix, _ := cryptofmt.OutputPrefix(primaryKey)
 	if err := validateDAEADFactoryCipher(d, d, expectedPrefix); err != nil {
 		t.Errorf("invalid cipher: %s", err)
 	}
@@ -59,7 +59,7 @@
 		if err != nil {
 			t.Errorf("daead.New failed: %s", err)
 		}
-		if err := validateDAEADFactoryCipher(d2, d, format.RawPrefix); err != nil {
+		if err := validateDAEADFactoryCipher(d2, d, cryptofmt.RawPrefix); err != nil {
 			t.Errorf("invalid cipher: %s", err)
 		}
 	}
@@ -76,7 +76,7 @@
 		if err != nil {
 			t.Errorf("daead.New failed: %s", err)
 		}
-		expectedPrefix, _ = format.OutputPrefix(newPK)
+		expectedPrefix, _ = cryptofmt.OutputPrefix(newPK)
 		err = validateDAEADFactoryCipher(d2, d, expectedPrefix)
 		if err == nil || !strings.Contains(err.Error(), "decryption failed") {
 			t.Errorf("expect decryption to fail with random key: %s", err)
@@ -95,7 +95,7 @@
 	if err != nil {
 		t.Errorf("cannot get primitive from keyset handle: %s", err)
 	}
-	if err := validateDAEADFactoryCipher(d, d, format.RawPrefix); err != nil {
+	if err := validateDAEADFactoryCipher(d, d, cryptofmt.RawPrefix); err != nil {
 		t.Errorf("invalid cipher: %s", err)
 	}
 }
diff --git a/go/daead/daead_key_templates.go b/go/daead/daead_key_templates.go
new file mode 100644
index 0000000..6afb7ec
--- /dev/null
+++ b/go/daead/daead_key_templates.go
@@ -0,0 +1,26 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package daead
+
+import tinkpb "github.com/google/tink/proto/tink_go_proto"
+
+// AESSIVKeyTemplate is a KeyTemplate that generates a AES-SIV key.
+func AESSIVKeyTemplate() *tinkpb.KeyTemplate {
+	return &tinkpb.KeyTemplate{
+		// Don't set value because KeyFormat is not required.
+		TypeUrl:          aesSIVTypeURL,
+		OutputPrefixType: tinkpb.OutputPrefixType_TINK,
+	}
+}
diff --git a/go/daead/daead_key_templates_test.go b/go/daead/daead_key_templates_test.go
new file mode 100644
index 0000000..382e6ac
--- /dev/null
+++ b/go/daead/daead_key_templates_test.go
@@ -0,0 +1,79 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package daead_test
+
+import (
+	"bytes"
+	"errors"
+	"fmt"
+	"testing"
+
+	"github.com/golang/protobuf/proto"
+	"github.com/google/tink/go/core/registry"
+	"github.com/google/tink/go/daead"
+	"github.com/google/tink/go/testutil"
+	"github.com/google/tink/go/tink"
+
+	tinkpb "github.com/google/tink/proto/tink_go_proto"
+)
+
+func TestAESSIVKeyTemplate(t *testing.T) {
+	template := daead.AESSIVKeyTemplate()
+	if template.TypeUrl != testutil.AESSIVTypeURL {
+		t.Errorf("incorrect type url: %v, expected %v", template.TypeUrl, testutil.AESSIVTypeURL)
+	}
+	if err := testEncryptDecrypt(template); err != nil {
+		t.Errorf("%v", err)
+	}
+}
+
+func testEncryptDecrypt(template *tinkpb.KeyTemplate) error {
+	key, err := registry.NewKey(template)
+	if err != nil {
+		return fmt.Errorf("failed to get key from template, error: %v", err)
+	}
+
+	sk, err := proto.Marshal(key)
+	if err != nil {
+		return fmt.Errorf("failed to serialize key, error: %v", err)
+	}
+
+	p, err := registry.Primitive(template.TypeUrl, sk)
+	if err != nil {
+		return fmt.Errorf("failed to get primitive from serialized key, error: %v", err)
+	}
+
+	primitive, ok := p.(tink.DeterministicAEAD)
+	if !ok {
+		return errors.New("failed to convert DeterministicAEAD primitive")
+	}
+
+	plaintext := []byte("some data to encrypt")
+	aad := []byte("extra data to authenticate")
+	ciphertext, err := primitive.EncryptDeterministically(plaintext, aad)
+	if err != nil {
+		return fmt.Errorf("encryption failed, error: %v", err)
+	}
+	decrypted, err := primitive.DecryptDeterministically(ciphertext, aad)
+	if err != nil {
+		return fmt.Errorf("decryption failed, error: %v", err)
+	}
+
+	if !bytes.Equal(plaintext, decrypted) {
+		return fmt.Errorf("decrypted data doesn't match plaintext, got: %q, want: %q", decrypted, plaintext)
+	}
+
+	return nil
+}
diff --git a/go/daead/daead_test.go b/go/daead/daead_test.go
index db4279e..4c6b852 100644
--- a/go/daead/daead_test.go
+++ b/go/daead/daead_test.go
@@ -17,7 +17,7 @@
 import (
 	"testing"
 
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/testutil"
 )
 
diff --git a/go/format/BUILD.bazel b/go/format/BUILD.bazel
deleted file mode 100644
index 7d98279..0000000
--- a/go/format/BUILD.bazel
+++ /dev/null
@@ -1,24 +0,0 @@
-package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
-
-licenses(["notice"])  # Apache 2.0 # keep
-
-load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
-
-go_library(
-    name = "go_default_library",
-    srcs = ["format.go"],
-    importpath = "github.com/google/tink/go/format",
-    visibility = ["//visibility:public"],
-    deps = [
-        "//proto:tink_go_proto",
-    ],
-)
-
-go_test(
-    name = "go_default_test",
-    srcs = ["format_test.go"],
-    embed = [":go_default_library"],
-    deps = [
-        "//proto:tink_go_proto",
-    ],
-)
diff --git a/go/format/format.go b/go/format/format.go
deleted file mode 100644
index aab77f3..0000000
--- a/go/format/format.go
+++ /dev/null
@@ -1,71 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-// Package format contains constants and convenience methods that deal with ciphertext and signature format.
-package format
-
-import (
-	"encoding/binary"
-	"fmt"
-
-	tinkpb "github.com/google/tink/proto/tink_go_proto"
-)
-
-const (
-	// NonRawPrefixSize is the prefix size of Tink and Legacy key types.
-	NonRawPrefixSize = 5
-
-	// LegacyPrefixSize is the prefix size of legacy key types.
-	// The prefix starts with \x00 and followed by a 4-byte key id.
-	LegacyPrefixSize = NonRawPrefixSize
-	// LegacyStartByte is the first byte of the prefix of legacy key types.
-	LegacyStartByte = byte(0)
-
-	// TinkPrefixSize is the prefix size of Tink key types.
-	// The prefix starts with \x01 and followed by a 4-byte key id.
-	TinkPrefixSize = NonRawPrefixSize
-	// TinkStartByte is the first byte of the prefix of Tink key types.
-	TinkStartByte = byte(1)
-
-	// RawPrefixSize is the prefix size of Raw key types.
-	// Raw prefix is empty.
-	RawPrefixSize = 0
-	// RawPrefix is the empty prefix of Raw key types.
-	RawPrefix = ""
-)
-
-/*
-OutputPrefix generates the prefix of ciphertexts produced by the crypto primitive obtained from key.
-The prefix can be either empty (for RAW-type prefix), or consists of a 1-byte indicator of the type
-of the prefix, followed by 4 bytes of the key ID in big endian encoding.
-*/
-func OutputPrefix(key *tinkpb.Keyset_Key) (string, error) {
-	switch key.OutputPrefixType {
-	case tinkpb.OutputPrefixType_LEGACY, tinkpb.OutputPrefixType_CRUNCHY:
-		return createOutputPrefix(LegacyPrefixSize, LegacyStartByte, key.KeyId), nil
-	case tinkpb.OutputPrefixType_TINK:
-		return createOutputPrefix(TinkPrefixSize, TinkStartByte, key.KeyId), nil
-	case tinkpb.OutputPrefixType_RAW:
-		return RawPrefix, nil
-	default:
-		return "", fmt.Errorf("crypto_format: unknown output prefix type")
-	}
-}
-
-func createOutputPrefix(size int, startByte byte, keyID uint32) string {
-	prefix := make([]byte, size)
-	prefix[0] = startByte
-	binary.BigEndian.PutUint32(prefix[1:], keyID)
-	return string(prefix)
-}
diff --git a/go/format/format_test.go b/go/format/format_test.go
deleted file mode 100644
index 995f6ca..0000000
--- a/go/format/format_test.go
+++ /dev/null
@@ -1,83 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package format_test
-
-import (
-	"testing"
-
-	"github.com/google/tink/go/format"
-	tinkpb "github.com/google/tink/proto/tink_go_proto"
-)
-
-var tests = []struct {
-	keyID  uint32
-	result string // expected prefix
-}{
-	{
-		keyID:  1000000,
-		result: string([]byte{0, 15, 66, 64}),
-	},
-	{
-		keyID:  4294967295,
-		result: string([]byte{255, 255, 255, 255}),
-	},
-	{
-		keyID:  0,
-		result: string([]byte{0, 0, 0, 0}),
-	},
-}
-
-func TestOutputPrefix(t *testing.T) {
-	key := new(tinkpb.Keyset_Key)
-	for i, test := range tests {
-		key.KeyId = test.keyID
-		// legacy type
-		key.OutputPrefixType = tinkpb.OutputPrefixType_LEGACY
-		prefix, err := format.OutputPrefix(key)
-		if err != nil || !validatePrefix(prefix, format.LegacyStartByte, test.result) {
-			t.Errorf("incorrect legacy prefix in test %d", i)
-		}
-		// crunchy type
-		key.OutputPrefixType = tinkpb.OutputPrefixType_CRUNCHY
-		prefix, err = format.OutputPrefix(key)
-		if err != nil || !validatePrefix(prefix, format.LegacyStartByte, test.result) {
-			t.Errorf("incorrect legacy prefix in test %d", i)
-		}
-		// tink type
-		key.OutputPrefixType = tinkpb.OutputPrefixType_TINK
-		prefix, err = format.OutputPrefix(key)
-		if err != nil || !validatePrefix(prefix, format.TinkStartByte, test.result) {
-			t.Errorf("incorrect tink prefix in test %d", i)
-		}
-		// raw type
-		key.OutputPrefixType = tinkpb.OutputPrefixType_RAW
-		prefix, err = format.OutputPrefix(key)
-		if err != nil || prefix != format.RawPrefix {
-			t.Errorf("incorrect raw prefix in test %d", i)
-		}
-	}
-	// unknown prefix type
-	key.OutputPrefixType = tinkpb.OutputPrefixType_UNKNOWN_PREFIX
-	if _, err := format.OutputPrefix(key); err == nil {
-		t.Errorf("expect an error when prefix type is unknown")
-	}
-}
-
-func validatePrefix(prefix string, startByte byte, key string) bool {
-	if prefix[0] != startByte {
-		return false
-	}
-	return prefix[1:] == key
-}
diff --git a/go/hybrid/BUILD.bazel b/go/hybrid/BUILD.bazel
new file mode 100644
index 0000000..f701aa4
--- /dev/null
+++ b/go/hybrid/BUILD.bazel
@@ -0,0 +1,54 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
+
+go_library(
+    name = "go_default_library",
+    srcs = [
+        "ecies_aead_hkdf_private_key_manager.go",
+        "ecies_aead_hkdf_public_key_manager.go",
+        "hybrid.go",
+        "hybrid_decrypt_factory.go",
+        "hybrid_encrypt_factory.go",
+        "hybrid_key_templates.go",
+        "register_ecies_aead_hkdf_dem_helper.go",
+    ],
+    importpath = "github.com/google/tink/go/hybrid",
+    visibility = ["//visibility:public"],
+    deps = [
+        "//go/aead:go_default_library",
+        "//go/core/cryptofmt:go_default_library",
+        "//go/core/primitiveset:go_default_library",
+        "//go/core/registry:go_default_library",
+        "//go/keyset:go_default_library",
+        "//go/subtle/hybrid:go_default_library",
+        "//go/tink:go_default_library",
+        "//proto:aes_ctr_hmac_aead_go_proto",
+        "//proto:aes_gcm_go_proto",
+        "//proto:common_go_proto",
+        "//proto:ecies_aead_hkdf_go_proto",
+        "//proto:tink_go_proto",
+        "@com_github_golang_protobuf//proto:go_default_library",
+    ],
+)
+
+go_test(
+    name = "go_default_test",
+    srcs = [
+        "ecies_aead_hkdf_hybrid_decrypt_test.go",
+        "ecies_aead_hkdf_hybrid_encrypt_test.go",
+        "hybrid_factory_test.go",
+        "hybrid_key_templates_test.go",
+        "register_ecies_aead_hkdf_dem_helper_test.go",
+    ],
+    embed = [":go_default_library"],
+    deps = [
+        "//go/aead:go_default_library",
+        "//go/mac:go_default_library",
+        "//go/signature:go_default_library",
+        "//go/subtle/random:go_default_library",
+        "//go/testkeyset:go_default_library",
+        "//go/testutil:go_default_library",
+        "//proto:common_go_proto",
+        "//proto:ecies_aead_hkdf_go_proto",
+        "//proto:tink_go_proto",
+    ],
+)
diff --git a/go/hybrid/ecies_aead_hkdf_hybrid_decrypt_test.go b/go/hybrid/ecies_aead_hkdf_hybrid_decrypt_test.go
new file mode 100644
index 0000000..5a76c92
--- /dev/null
+++ b/go/hybrid/ecies_aead_hkdf_hybrid_decrypt_test.go
@@ -0,0 +1,117 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package hybrid
+
+import (
+	"bytes"
+	"testing"
+
+	"github.com/google/tink/go/aead"
+	subtle "github.com/google/tink/go/subtle/hybrid"
+	"github.com/google/tink/go/subtle/random"
+	"github.com/google/tink/go/testutil"
+	tinkpb "github.com/google/tink/proto/tink_go_proto"
+)
+
+func TestXxx(t *testing.T) {
+}
+
+func modifyDecrypt(t *testing.T, c string, k *tinkpb.KeyTemplate) {
+	t.Helper()
+	curve, err := subtle.GetCurve(c)
+	if err != nil {
+		t.Fatalf("error getting %s curve: %s ", c, err)
+	}
+	pvt, err := subtle.GenerateECDHKeyPair(curve)
+	if err != nil {
+		t.Fatalf("error generating ECDH key pair: %s", err)
+	}
+	salt := random.GetRandomBytes(8)
+	pt := random.GetRandomBytes(4)
+	context := random.GetRandomBytes(4)
+	rDem, err := newRegisterECIESAEADHKDFDemHelper(k)
+	if err != nil {
+		t.Fatalf("error generating a DEM helper :%s", err)
+	}
+	e, err := subtle.NewECIESAEADHKDFHybridEncrypt(&pvt.PublicKey, salt, "SHA256", "UNCOMPRESSED", rDem)
+	if err != nil {
+		t.Fatalf("error generating an encryption construct :%s", err)
+	}
+	d, err := subtle.NewECIESAEADHKDFHybridDecrypt(pvt, salt, "SHA256", "UNCOMPRESSED", rDem)
+	if err != nil {
+		t.Fatalf("error generating an decryption construct :%s", err)
+	}
+	ct, err := e.Encrypt(pt, context)
+	if err != nil {
+		t.Fatalf("encryption error :%s", err)
+	}
+	dt, err := d.Decrypt(ct, context)
+	if err != nil {
+		t.Fatalf("decryption error :%s", err)
+	}
+	if !bytes.Equal(dt, pt) {
+		t.Fatalf("decryption not inverse of encryption")
+	}
+
+	for _, g := range testutil.GenerateMutations(ct) {
+		if _, err := d.Decrypt(g, context); err == nil {
+			t.Fatalf("invalid cipher text should throw exception")
+		}
+	}
+	for _, g := range testutil.GenerateMutations(context) {
+		if _, err := d.Decrypt(ct, g); err == nil {
+			t.Fatalf("invalid context should throw exception")
+		}
+	}
+	mSalt := make([]byte, len(salt))
+
+	for i := 0; i < len(salt); i++ {
+		for j := 0; j < 8; j++ {
+			copy(mSalt, salt)
+			mSalt[i] ^= (1 << uint8(j))
+			d, err = subtle.NewECIESAEADHKDFHybridDecrypt(pvt, mSalt, "SHA256", "UNCOMPRESSED", rDem)
+			if err != nil {
+				t.Fatalf("subtle.NewECIESAEADHKDFHybridDecrypt:%v", err)
+			}
+			if _, err := d.Decrypt(ct, context); err == nil {
+				t.Fatalf("invalid salt should throw exception")
+			}
+		}
+	}
+}
+
+func TestECAESCTRHMACSHA256Decrypt(t *testing.T) {
+	modifyDecrypt(t, "NIST_P256", aead.AES256CTRHMACSHA256KeyTemplate())
+	modifyDecrypt(t, "NIST_P384", aead.AES256CTRHMACSHA256KeyTemplate())
+	modifyDecrypt(t, "NIST_P521", aead.AES256CTRHMACSHA256KeyTemplate())
+	modifyDecrypt(t, "NIST_P224", aead.AES256CTRHMACSHA256KeyTemplate())
+
+	modifyDecrypt(t, "NIST_P256", aead.AES128CTRHMACSHA256KeyTemplate())
+	modifyDecrypt(t, "NIST_P384", aead.AES128CTRHMACSHA256KeyTemplate())
+	modifyDecrypt(t, "NIST_P521", aead.AES128CTRHMACSHA256KeyTemplate())
+	modifyDecrypt(t, "NIST_P224", aead.AES128CTRHMACSHA256KeyTemplate())
+}
+
+func TestECAES256GCMDecrypt(t *testing.T) {
+	modifyDecrypt(t, "NIST_P256", aead.AES256GCMKeyTemplate())
+	modifyDecrypt(t, "NIST_P384", aead.AES256GCMKeyTemplate())
+	modifyDecrypt(t, "NIST_P521", aead.AES256GCMKeyTemplate())
+	modifyDecrypt(t, "NIST_P224", aead.AES256GCMKeyTemplate())
+
+	modifyDecrypt(t, "NIST_P256", aead.AES128GCMKeyTemplate())
+	modifyDecrypt(t, "NIST_P384", aead.AES128GCMKeyTemplate())
+	modifyDecrypt(t, "NIST_P521", aead.AES128GCMKeyTemplate())
+	modifyDecrypt(t, "NIST_P224", aead.AES128GCMKeyTemplate())
+}
diff --git a/go/hybrid/ecies_aead_hkdf_hybrid_encrypt_test.go b/go/hybrid/ecies_aead_hkdf_hybrid_encrypt_test.go
new file mode 100644
index 0000000..d24fa7c
--- /dev/null
+++ b/go/hybrid/ecies_aead_hkdf_hybrid_encrypt_test.go
@@ -0,0 +1,99 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package hybrid
+
+import (
+	"bytes"
+	"testing"
+
+	"github.com/google/tink/go/aead"
+	subtle "github.com/google/tink/go/subtle/hybrid"
+	"github.com/google/tink/go/subtle/random"
+	tinkpb "github.com/google/tink/proto/tink_go_proto"
+)
+
+func basicMultipleEncrypts(t *testing.T, c string, k *tinkpb.KeyTemplate) {
+	t.Helper()
+	curve, err := subtle.GetCurve(c)
+	if err != nil {
+		t.Fatalf("error getting %s curve: %s ", c, err)
+	}
+	pvt, err := subtle.GenerateECDHKeyPair(curve)
+	if err != nil {
+		t.Fatalf("error generating ECDH key pair: %s", err)
+	}
+	salt := []byte("some salt")
+	pt := random.GetRandomBytes(20)
+	context := []byte("context info")
+	rDem, err := newRegisterECIESAEADHKDFDemHelper(k)
+	if err != nil {
+		t.Fatalf("error generating a DEM helper :%s", err)
+	}
+	e, err := subtle.NewECIESAEADHKDFHybridEncrypt(&pvt.PublicKey, salt, "SHA256", "UNCOMPRESSED", rDem)
+	if err != nil {
+		t.Fatalf("error generating an encryption construct :%s", err)
+	}
+	d, err := subtle.NewECIESAEADHKDFHybridDecrypt(pvt, salt, "SHA256", "UNCOMPRESSED", rDem)
+	if err != nil {
+		t.Fatalf("error generating an decryption construct :%s", err)
+	}
+	cl := [][]byte{}
+	for i := 0; i < 8; i++ {
+		ct, err := e.Encrypt(pt, context)
+		if err != nil {
+			t.Fatalf("encryption error :%s", err)
+		}
+		for _, c := range cl {
+			if bytes.Equal(ct, c) {
+				t.Fatalf("encryption is not randomized")
+			}
+		}
+		cl = append(cl, ct)
+		dt, err := d.Decrypt(ct, context)
+		if err != nil {
+			t.Fatalf("decryption error :%s", err)
+		}
+		if !bytes.Equal(dt, pt) {
+			t.Fatalf("decryption not inverse of encryption")
+		}
+	}
+	if len(cl) != 8 {
+		t.Errorf("randomized encryption check failed")
+	}
+}
+
+func TestECAESCTRHMACSHA256Encrypt(t *testing.T) {
+	basicMultipleEncrypts(t, "NIST_P256", aead.AES256CTRHMACSHA256KeyTemplate())
+	basicMultipleEncrypts(t, "NIST_P384", aead.AES256CTRHMACSHA256KeyTemplate())
+	basicMultipleEncrypts(t, "NIST_P521", aead.AES256CTRHMACSHA256KeyTemplate())
+	basicMultipleEncrypts(t, "NIST_P224", aead.AES256CTRHMACSHA256KeyTemplate())
+
+	basicMultipleEncrypts(t, "NIST_P256", aead.AES128CTRHMACSHA256KeyTemplate())
+	basicMultipleEncrypts(t, "NIST_P384", aead.AES128CTRHMACSHA256KeyTemplate())
+	basicMultipleEncrypts(t, "NIST_P521", aead.AES128CTRHMACSHA256KeyTemplate())
+	basicMultipleEncrypts(t, "NIST_P224", aead.AES128CTRHMACSHA256KeyTemplate())
+}
+
+func TestECAES256GCMEncrypt(t *testing.T) {
+	basicMultipleEncrypts(t, "NIST_P256", aead.AES256GCMKeyTemplate())
+	basicMultipleEncrypts(t, "NIST_P384", aead.AES256GCMKeyTemplate())
+	basicMultipleEncrypts(t, "NIST_P521", aead.AES256GCMKeyTemplate())
+	basicMultipleEncrypts(t, "NIST_P224", aead.AES256GCMKeyTemplate())
+
+	basicMultipleEncrypts(t, "NIST_P256", aead.AES128GCMKeyTemplate())
+	basicMultipleEncrypts(t, "NIST_P384", aead.AES128GCMKeyTemplate())
+	basicMultipleEncrypts(t, "NIST_P521", aead.AES128GCMKeyTemplate())
+	basicMultipleEncrypts(t, "NIST_P224", aead.AES128GCMKeyTemplate())
+}
diff --git a/go/hybrid/ecies_aead_hkdf_private_key_manager.go b/go/hybrid/ecies_aead_hkdf_private_key_manager.go
new file mode 100644
index 0000000..e653e56
--- /dev/null
+++ b/go/hybrid/ecies_aead_hkdf_private_key_manager.go
@@ -0,0 +1,190 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package hybrid
+
+import (
+	"errors"
+	"fmt"
+	"strings"
+
+	"github.com/golang/protobuf/proto"
+	"github.com/google/tink/go/core/registry"
+	"github.com/google/tink/go/keyset"
+	subtle "github.com/google/tink/go/subtle/hybrid"
+	eahpb "github.com/google/tink/proto/ecies_aead_hkdf_go_proto"
+	tinkpb "github.com/google/tink/proto/tink_go_proto"
+)
+
+const (
+	eciesAEADHKDFPrivateKeyKeyVersion = 0
+	eciesAEADHKDFPrivateKeyTypeURL    = "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey"
+)
+
+// common errors
+var errInvalidECIESAEADHKDFPrivateKeyKey = fmt.Errorf("ecies_aead_hkdf_private_key_manager: invalid key")
+var errInvalidECIESAEADHKDFPrivateKeyKeyFormat = fmt.Errorf("ecies_aead_hkdf_private_key_manager: invalid key format")
+
+// eciesAEADHKDFPrivateKeyKeyManager is an implementation of PrivateKeyManager interface.
+// It generates new ECIESAEADHKDFPrivateKeyKey keys and produces new instances of ECIESAEADHKDFPrivateKey subtle.
+type eciesAEADHKDFPrivateKeyKeyManager struct{}
+
+// Assert that eciesAEADHKDFPrivateKeyKeyManager implements the PrivateKeyManager interface.
+var _ registry.PrivateKeyManager = (*eciesAEADHKDFPrivateKeyKeyManager)(nil)
+
+// newECIESAEADHKDFPrivateKeyKeyManager creates a new aesGcmKeyManager.
+func newECIESAEADHKDFPrivateKeyKeyManager() *eciesAEADHKDFPrivateKeyKeyManager {
+	return new(eciesAEADHKDFPrivateKeyKeyManager)
+}
+
+// Primitive creates an ECIESAEADHKDFPrivateKey subtle for the given serialized ECIESAEADHKDFPrivateKey proto.
+func (km *eciesAEADHKDFPrivateKeyKeyManager) Primitive(serializedKey []byte) (interface{}, error) {
+	if len(serializedKey) == 0 {
+		return nil, errInvalidECIESAEADHKDFPrivateKeyKey
+	}
+	key := new(eahpb.EciesAeadHkdfPrivateKey)
+	if err := proto.Unmarshal(serializedKey, key); err != nil {
+		return nil, errInvalidECIESAEADHKDFPrivateKeyKey
+	}
+	if err := km.validateKey(key); err != nil {
+		return nil, errInvalidECIESAEADHKDFPrivateKeyKey
+	}
+	curve, err := subtle.GetCurve(key.PublicKey.Params.KemParams.CurveType.String())
+	if err != nil {
+		return nil, err
+	}
+	pvt := subtle.GetECPrivateKey(curve, key.KeyValue)
+	rDem, err := newRegisterECIESAEADHKDFDemHelper(key.PublicKey.Params.DemParams.AeadDem)
+	if err != nil {
+		return nil, err
+	}
+	salt := key.PublicKey.Params.KemParams.HkdfSalt
+	hash := key.PublicKey.Params.KemParams.HkdfHashType.String()
+	ptFormat := key.PublicKey.Params.EcPointFormat.String()
+	return subtle.NewECIESAEADHKDFHybridDecrypt(pvt, salt, hash, ptFormat, rDem)
+}
+
+// NewKey creates a new key according to specification the given serialized ECIESAEADHKDFPrivateKeyKeyFormat.
+func (km *eciesAEADHKDFPrivateKeyKeyManager) NewKey(serializedKeyFormat []byte) (proto.Message, error) {
+	if len(serializedKeyFormat) == 0 {
+		return nil, errInvalidECIESAEADHKDFPrivateKeyKeyFormat
+	}
+	keyFormat := new(eahpb.EciesAeadHkdfKeyFormat)
+	if err := proto.Unmarshal(serializedKeyFormat, keyFormat); err != nil {
+		return nil, errInvalidECIESAEADHKDFPrivateKeyKeyFormat
+	}
+	if err := km.validateKeyFormat(keyFormat); err != nil {
+		return nil, errInvalidECIESAEADHKDFPrivateKeyKeyFormat
+	}
+	curve, err := subtle.GetCurve(keyFormat.Params.KemParams.CurveType.String())
+	if err != nil {
+		return nil, err
+	}
+	pvt, err := subtle.GenerateECDHKeyPair(curve)
+	if err != nil {
+		return nil, err
+	}
+
+	return &eahpb.EciesAeadHkdfPrivateKey{
+		Version:  eciesAEADHKDFPrivateKeyKeyVersion,
+		KeyValue: pvt.D.Bytes(),
+		PublicKey: &eahpb.EciesAeadHkdfPublicKey{
+			Version: eciesAEADHKDFPrivateKeyKeyVersion,
+			Params:  keyFormat.Params,
+			X:       pvt.PublicKey.Point.X.Bytes(),
+			Y:       pvt.PublicKey.Point.Y.Bytes(),
+		},
+	}, nil
+}
+
+// NewKeyData creates a new KeyData according to specification in the given serialized
+// ECIESAEADHKDFPrivateKeyKeyFormat.
+// It should be used solely by the key management API.
+func (km *eciesAEADHKDFPrivateKeyKeyManager) NewKeyData(serializedKeyFormat []byte) (*tinkpb.KeyData, error) {
+	key, err := km.NewKey(serializedKeyFormat)
+	if err != nil {
+		return nil, err
+	}
+	serializedKey, err := proto.Marshal(key)
+	if err != nil {
+		return nil, err
+	}
+	return &tinkpb.KeyData{
+		TypeUrl:         eciesAEADHKDFPrivateKeyTypeURL,
+		Value:           serializedKey,
+		KeyMaterialType: tinkpb.KeyData_ASYMMETRIC_PRIVATE,
+	}, nil
+}
+
+func (km *eciesAEADHKDFPrivateKeyKeyManager) PublicKeyData(serializedPrivKey []byte) (*tinkpb.KeyData, error) {
+	privKey := new(eahpb.EciesAeadHkdfPrivateKey)
+	if err := proto.Unmarshal(serializedPrivKey, privKey); err != nil {
+		return nil, errInvalidECIESAEADHKDFPrivateKeyKey
+	}
+	serializedPubKey, err := proto.Marshal(privKey.PublicKey)
+	if err != nil {
+		return nil, errInvalidECIESAEADHKDFPrivateKeyKey
+	}
+	return &tinkpb.KeyData{
+		TypeUrl:         eciesAEADHKDFPublicKeyTypeURL,
+		Value:           serializedPubKey,
+		KeyMaterialType: tinkpb.KeyData_ASYMMETRIC_PUBLIC,
+	}, nil
+}
+
+// DoesSupport indicates if this key manager supports the given key type.
+func (km *eciesAEADHKDFPrivateKeyKeyManager) DoesSupport(typeURL string) bool {
+	return typeURL == eciesAEADHKDFPrivateKeyTypeURL
+}
+
+// TypeURL returns the key type of keys managed by this key manager.
+func (km *eciesAEADHKDFPrivateKeyKeyManager) TypeURL() string {
+	return eciesAEADHKDFPrivateKeyTypeURL
+}
+
+// validateKey validates the given ECDSAPrivateKey.
+func (km *eciesAEADHKDFPrivateKeyKeyManager) validateKey(key *eahpb.EciesAeadHkdfPrivateKey) error {
+	if err := keyset.ValidateKeyVersion(key.Version, eciesAEADHKDFPrivateKeyKeyVersion); err != nil {
+		return fmt.Errorf("ecies_aead_hkdf_private_key_manager: invalid key: %s", err)
+	}
+	return checkECIESAEADHKDFParams(key.PublicKey.Params)
+}
+
+// validateKeyFormat validates the given ECDSAKeyFormat.
+func (km *eciesAEADHKDFPrivateKeyKeyManager) validateKeyFormat(format *eahpb.EciesAeadHkdfKeyFormat) error {
+	return checkECIESAEADHKDFParams(format.Params)
+}
+
+func checkECIESAEADHKDFParams(params *eahpb.EciesAeadHkdfParams) error {
+	_, err := subtle.GetCurve(params.KemParams.CurveType.String())
+	if err != nil {
+		return err
+	}
+	if strings.Compare(params.KemParams.HkdfHashType.String(), "HashType_UNKNOWN_HASH") == 0 {
+		return errors.New("hash unsupported for HMAC")
+	}
+
+	if strings.Compare(params.EcPointFormat.String(), "EcPointFormat_UNKNOWN_FORMAT") == 0 {
+		return errors.New("unknown EC point format")
+	}
+	km, err := registry.GetKeyManager(params.DemParams.AeadDem.TypeUrl)
+	if err != nil {
+		return err
+	}
+	_, err = km.NewKeyData(params.DemParams.AeadDem.Value)
+	if err != nil {
+		return err
+	}
+	return nil
+}
diff --git a/go/hybrid/ecies_aead_hkdf_public_key_manager.go b/go/hybrid/ecies_aead_hkdf_public_key_manager.go
new file mode 100644
index 0000000..709ecb9
--- /dev/null
+++ b/go/hybrid/ecies_aead_hkdf_public_key_manager.go
@@ -0,0 +1,112 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package hybrid
+
+import (
+	"errors"
+	"fmt"
+	"math/big"
+
+	"github.com/golang/protobuf/proto"
+	"github.com/google/tink/go/core/registry"
+	"github.com/google/tink/go/keyset"
+	subtle "github.com/google/tink/go/subtle/hybrid"
+	eahpb "github.com/google/tink/proto/ecies_aead_hkdf_go_proto"
+	tinkpb "github.com/google/tink/proto/tink_go_proto"
+)
+
+const (
+	eciesAEADHKDFPublicKeyKeyVersion = 0
+
+	eciesAEADHKDFPublicKeyTypeURL = "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey"
+)
+
+// common errors
+var errInvalidECIESAEADHKDFPublicKeyKey = fmt.Errorf("ecies_aead_hkdf_public_key_manager: invalid key")
+var errInvalidECIESAEADHKDFPublicKeyKeyFormat = fmt.Errorf("ecies_aead_hkdf_public_key_manager: invalid key format")
+
+// eciesAEADHKDFPublicKeyKeyManager is an implementation of KeyManager interface.
+// It generates new ECIESAEADHKDFPublicKeyKey keys and produces new instances of ECIESAEADHKDFPublicKey subtle.
+type eciesAEADHKDFPublicKeyKeyManager struct{}
+
+// Assert that eciesAEADHKDFPublicKeyKeyManager implements the KeyManager interface.
+var _ registry.KeyManager = (*eciesAEADHKDFPublicKeyKeyManager)(nil)
+
+// newECIESAEADHKDFPublicKeyKeyManager creates a new aesGcmKeyManager.
+func newECIESAEADHKDFPublicKeyKeyManager() *eciesAEADHKDFPublicKeyKeyManager {
+	return new(eciesAEADHKDFPublicKeyKeyManager)
+}
+
+// Primitive creates an ECIESAEADHKDFPublicKey subtle for the given serialized ECIESAEADHKDFPublicKey proto.
+func (km *eciesAEADHKDFPublicKeyKeyManager) Primitive(serializedKey []byte) (interface{}, error) {
+	if len(serializedKey) == 0 {
+		return nil, errInvalidECIESAEADHKDFPublicKeyKey
+	}
+	key := new(eahpb.EciesAeadHkdfPublicKey)
+	if err := proto.Unmarshal(serializedKey, key); err != nil {
+		return nil, errInvalidECIESAEADHKDFPublicKeyKey
+	}
+	if err := km.validateKey(key); err != nil {
+		return nil, errInvalidECIESAEADHKDFPublicKeyKey
+	}
+	curve, err := subtle.GetCurve(key.Params.KemParams.CurveType.String())
+	if err != nil {
+		return nil, err
+	}
+	pub := subtle.ECPublicKey{
+		Curve: curve,
+		Point: subtle.ECPoint{
+			X: new(big.Int).SetBytes(key.X),
+			Y: new(big.Int).SetBytes(key.Y),
+		},
+	}
+	rDem, err := newRegisterECIESAEADHKDFDemHelper(key.Params.DemParams.AeadDem)
+	if err != nil {
+		return nil, err
+	}
+	salt := key.Params.KemParams.HkdfSalt
+	hash := key.Params.KemParams.HkdfHashType.String()
+	ptFormat := key.Params.EcPointFormat.String()
+
+	return subtle.NewECIESAEADHKDFHybridEncrypt(&pub, salt, hash, ptFormat, rDem)
+}
+
+// DoesSupport indicates if this key manager supports the given key type.
+func (km *eciesAEADHKDFPublicKeyKeyManager) DoesSupport(typeURL string) bool {
+	return typeURL == eciesAEADHKDFPublicKeyTypeURL
+}
+
+// TypeURL returns the key type of keys managed by this key manager.
+func (km *eciesAEADHKDFPublicKeyKeyManager) TypeURL() string {
+	return eciesAEADHKDFPublicKeyTypeURL
+}
+
+// validateKey validates the given ECDSAPrivateKey.
+func (km *eciesAEADHKDFPublicKeyKeyManager) validateKey(key *eahpb.EciesAeadHkdfPublicKey) error {
+	if err := keyset.ValidateKeyVersion(key.Version, eciesAEADHKDFPublicKeyKeyVersion); err != nil {
+		return fmt.Errorf("ecies_aead_hkdf_public_key_manager: invalid key: %s", err)
+	}
+	return checkECIESAEADHKDFParams(key.Params)
+}
+
+// NewKey is not implemented for public key manager.
+func (km *eciesAEADHKDFPublicKeyKeyManager) NewKey(serializedKeyFormat []byte) (proto.Message, error) {
+	return nil, errors.New("public key manager does not implement NewKey")
+}
+
+// NewKeyData is not implemented for public key manager.
+func (km *eciesAEADHKDFPublicKeyKeyManager) NewKeyData(serializedKeyFormat []byte) (*tinkpb.KeyData, error) {
+	return nil, errors.New("public key manager does not implement NewKeyData")
+}
diff --git a/go/hybrid/hybrid.go b/go/hybrid/hybrid.go
new file mode 100644
index 0000000..2fb9570
--- /dev/null
+++ b/go/hybrid/hybrid.go
@@ -0,0 +1,77 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// Package hybrid provides subtle implementations of the HKDF and EC primitives.
+//
+// The functionality of Hybrid Encryption is represented as a pair of
+// primitives (interfaces):
+//
+//  * HybridEncrypt for encryption of data
+//
+//  * HybridDecrypt for decryption of data
+//
+// Implementations of these interfaces are secure against adaptive chosen
+// ciphertext attacks. In addition to plaintext the encryption takes an extra
+// parameter contextInfo, which usually is public data implicit from the
+// context, but should be bound to the resulting ciphertext, i.e. the
+// ciphertext allows for checking the integrity of contextInfo (but there are
+// no guarantees wrt. the secrecy or authenticity of contextInfo).
+//
+// Example:
+//
+//   package main
+//
+//   import (
+//       "github.com/google/tink/go/hybrid"
+//       "github.com/google/tink/go/core/registry"
+//       "github.com/google/tink/go/keyset"
+//   )
+//
+//   func main() {
+//
+//       kh , err := keyset.NewHandle(hybrid.ECIESHKDFAES128CTRHMACSHA256KeyTemplate())
+//       if err != nil {
+//           //handle error
+//       }
+//       h := hybrid.NewHybridEncrypt(kh)
+//
+//       ct, err = h.Encrypt([]byte("secret message"), []byte("context info"))
+//       if err != nil {
+//           // handle error
+//       }
+//
+//       khd , err := keyset.NewHandle( .....); /// get a handle on the decryption key material
+//       hd := hybrid.NewHybridDecrypt(khd)
+//
+//       pt, err := hd.Decrypt(ct, []byte("context info"))
+//       if err != nil {
+//           // handle error
+//       }
+//   }
+package hybrid
+
+import (
+	"fmt"
+
+	"github.com/google/tink/go/core/registry"
+)
+
+func init() {
+	if err := registry.RegisterKeyManager(newECIESAEADHKDFPrivateKeyKeyManager()); err != nil {
+		panic(fmt.Sprintf("hybrid.init() failed: %v", err))
+	}
+	if err := registry.RegisterKeyManager(newECIESAEADHKDFPublicKeyKeyManager()); err != nil {
+		panic(fmt.Sprintf("hybrid.init() failed: %v", err))
+	}
+}
diff --git a/go/hybrid/hybrid_decrypt_factory.go b/go/hybrid/hybrid_decrypt_factory.go
new file mode 100644
index 0000000..2819d8c
--- /dev/null
+++ b/go/hybrid/hybrid_decrypt_factory.go
@@ -0,0 +1,89 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package hybrid
+
+import (
+	"fmt"
+
+	"github.com/google/tink/go/core/cryptofmt"
+	"github.com/google/tink/go/core/primitiveset"
+	"github.com/google/tink/go/core/registry"
+	"github.com/google/tink/go/keyset"
+	"github.com/google/tink/go/tink"
+)
+
+// NewHybridDecrypt returns an HybridDecrypt primitive from the given keyset handle.
+func NewHybridDecrypt(h *keyset.Handle) (tink.HybridDecrypt, error) {
+	return NewHybridDecryptWithKeyManager(h, nil /*keyManager*/)
+}
+
+// NewHybridDecryptWithKeyManager returns an HybridDecrypt primitive from the given keyset handle and custom key manager.
+func NewHybridDecryptWithKeyManager(h *keyset.Handle, km registry.KeyManager) (tink.HybridDecrypt, error) {
+	ps, err := h.PrimitivesWithKeyManager(km)
+	if err != nil {
+		return nil, fmt.Errorf("hybrid_factory: cannot obtain primitive set: %s", err)
+	}
+	return newDecryptPrimitiveSet(ps), nil
+}
+
+// decryptPrimitiveSet is an HybridDecrypt implementation that uses the underlying primitive set for
+// decryption.
+type decryptPrimitiveSet struct {
+	ps *primitiveset.PrimitiveSet
+}
+
+// Asserts that primitiveSet implements the HybridDecrypt interface.
+var _ tink.HybridDecrypt = (*decryptPrimitiveSet)(nil)
+
+func newDecryptPrimitiveSet(ps *primitiveset.PrimitiveSet) *decryptPrimitiveSet {
+	ret := new(decryptPrimitiveSet)
+	ret.ps = ps
+	return ret
+}
+
+// Decrypt decrypts the given ciphertext and authenticates it with the given
+// additional authenticated data. It returns the corresponding plaintext if the
+// ciphertext is authenticated.
+func (a *decryptPrimitiveSet) Decrypt(ct, ad []byte) ([]byte, error) {
+	// try non-raw keys
+	prefixSize := cryptofmt.NonRawPrefixSize
+	if len(ct) > prefixSize {
+		prefix := ct[:prefixSize]
+		ctNoPrefix := ct[prefixSize:]
+		entries, err := a.ps.EntriesForPrefix(string(prefix))
+		if err == nil {
+			for i := 0; i < len(entries); i++ {
+				var p = (entries[i].Primitive).(tink.HybridDecrypt)
+				pt, err := p.Decrypt(ctNoPrefix, ad)
+				if err == nil {
+					return pt, nil
+				}
+			}
+		}
+	}
+	// try raw keys
+	entries, err := a.ps.RawEntries()
+	if err == nil {
+		for i := 0; i < len(entries); i++ {
+			var p = (entries[i].Primitive).(tink.HybridDecrypt)
+			pt, err := p.Decrypt(ct, ad)
+			if err == nil {
+				return pt, nil
+			}
+		}
+	}
+	// nothing worked
+	return nil, fmt.Errorf("hybrid_factory: decryption failed")
+}
diff --git a/go/hybrid/hybrid_encrypt_factory.go b/go/hybrid/hybrid_encrypt_factory.go
new file mode 100644
index 0000000..674dc32
--- /dev/null
+++ b/go/hybrid/hybrid_encrypt_factory.go
@@ -0,0 +1,67 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package hybrid
+
+import (
+	"fmt"
+
+	"github.com/google/tink/go/core/primitiveset"
+	"github.com/google/tink/go/core/registry"
+	"github.com/google/tink/go/keyset"
+	"github.com/google/tink/go/tink"
+)
+
+// NewHybridEncrypt returns an HybridEncrypt primitive from the given keyset handle.
+func NewHybridEncrypt(h *keyset.Handle) (tink.HybridEncrypt, error) {
+	return NewHybridEncryptWithKeyManager(h, nil /*keyManager*/)
+}
+
+// NewHybridEncryptWithKeyManager returns an HybridEncrypt primitive from the given keyset handle and custom key manager.
+func NewHybridEncryptWithKeyManager(h *keyset.Handle, km registry.KeyManager) (tink.HybridEncrypt, error) {
+	ps, err := h.PrimitivesWithKeyManager(km)
+	if err != nil {
+		return nil, fmt.Errorf("hybrid_factory: cannot obtain primitive set: %s", err)
+	}
+	return newEncryptPrimitiveSet(ps), nil
+}
+
+// encryptPrimitiveSet is an HybridEncrypt implementation that uses the underlying primitive set for encryption.
+type encryptPrimitiveSet struct {
+	ps *primitiveset.PrimitiveSet
+}
+
+// Asserts that primitiveSet implements the HybridEncrypt interface.
+var _ tink.HybridEncrypt = (*encryptPrimitiveSet)(nil)
+
+func newEncryptPrimitiveSet(ps *primitiveset.PrimitiveSet) *encryptPrimitiveSet {
+	ret := new(encryptPrimitiveSet)
+	ret.ps = ps
+	return ret
+}
+
+// Encrypt encrypts the given plaintext with the given additional authenticated data.
+// It returns the concatenation of the primary's identifier and the ciphertext.
+func (a *encryptPrimitiveSet) Encrypt(pt, ad []byte) ([]byte, error) {
+	primary := a.ps.Primary
+	var p = (primary.Primitive).(tink.HybridEncrypt)
+	ct, err := p.Encrypt(pt, ad)
+	if err != nil {
+		return nil, err
+	}
+	ret := make([]byte, 0, len(primary.Prefix) + len(ct))
+	ret = append(ret, primary.Prefix...)
+	ret = append(ret, ct...)
+	return ret, nil
+}
diff --git a/go/hybrid/hybrid_factory_test.go b/go/hybrid/hybrid_factory_test.go
new file mode 100644
index 0000000..c871359
--- /dev/null
+++ b/go/hybrid/hybrid_factory_test.go
@@ -0,0 +1,101 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package hybrid
+
+import (
+	"bytes"
+	"testing"
+
+	"github.com/golang/protobuf/proto"
+	"github.com/google/tink/go/aead"
+	"github.com/google/tink/go/subtle/random"
+	"github.com/google/tink/go/testkeyset"
+	"github.com/google/tink/go/testutil"
+	commonpb "github.com/google/tink/proto/common_go_proto"
+	tinkpb "github.com/google/tink/proto/tink_go_proto"
+)
+
+func TestHybridFactoryTest(t *testing.T) {
+	c := commonpb.EllipticCurveType_NIST_P256
+	ht := commonpb.HashType_SHA256
+	primaryPtFmt := commonpb.EcPointFormat_UNCOMPRESSED
+	rawPtFmt := commonpb.EcPointFormat_COMPRESSED
+	primaryDek := aead.AES128CTRHMACSHA256KeyTemplate()
+	rawDek := aead.AES128CTRHMACSHA256KeyTemplate()
+	primarySalt := []byte("some salt")
+	rawSalt := []byte("other salt")
+
+	primaryPrivProto, err := testutil.GenerateECIESAEADHKDFPrivateKey(c, ht, primaryPtFmt, primaryDek, primarySalt)
+	if err != nil {
+		t.Error(err)
+	}
+	sPrimaryPriv, err := proto.Marshal(primaryPrivProto)
+	if err != nil {
+		t.Error(err)
+	}
+
+	primaryPrivKey := testutil.NewKey(
+		testutil.NewKeyData(eciesAEADHKDFPrivateKeyTypeURL, sPrimaryPriv, tinkpb.KeyData_ASYMMETRIC_PRIVATE),
+		tinkpb.KeyStatusType_ENABLED, 8, tinkpb.OutputPrefixType_RAW)
+
+	rawPrivProto, err := testutil.GenerateECIESAEADHKDFPrivateKey(c, ht, rawPtFmt, rawDek, rawSalt)
+	if err != nil {
+		t.Error(err)
+	}
+	sRawPriv, err := proto.Marshal(rawPrivProto)
+	if err != nil {
+		t.Error(err)
+	}
+	rawPrivKey := testutil.NewKey(
+		testutil.NewKeyData(eciesAEADHKDFPrivateKeyTypeURL, sRawPriv, tinkpb.KeyData_ASYMMETRIC_PRIVATE),
+		tinkpb.KeyStatusType_ENABLED, 11, tinkpb.OutputPrefixType_RAW)
+
+	privKeys := []*tinkpb.Keyset_Key{primaryPrivKey, rawPrivKey}
+	privKeyset := testutil.NewKeyset(privKeys[0].KeyId, privKeys)
+	khPriv, err := testkeyset.NewHandle(privKeyset)
+	if err != nil {
+		t.Error(err)
+	}
+
+	khPub, err := khPriv.Public()
+	if err != nil {
+		t.Error(err)
+	}
+
+	e, err := NewHybridEncrypt(khPub)
+	if err != nil {
+		t.Error(err)
+	}
+	d, err := NewHybridDecrypt(khPriv)
+	if err != nil {
+		t.Error(err)
+	}
+
+	for i := 0; i < 1000; i++ {
+		pt := random.GetRandomBytes(20)
+		ci := random.GetRandomBytes(20)
+		ct, err := e.Encrypt(pt, ci)
+		if err != nil {
+			t.Error(err)
+		}
+		gotpt, err := d.Decrypt(ct, ci)
+		if err != nil {
+			t.Error(err)
+		}
+		if !bytes.Equal(pt, gotpt) {
+			t.Error(err)
+		}
+	}
+}
diff --git a/go/hybrid/hybrid_key_templates.go b/go/hybrid/hybrid_key_templates.go
new file mode 100644
index 0000000..a5a01fa
--- /dev/null
+++ b/go/hybrid/hybrid_key_templates.go
@@ -0,0 +1,72 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package hybrid
+
+import (
+	"github.com/golang/protobuf/proto"
+	"github.com/google/tink/go/aead"
+	commonpb "github.com/google/tink/proto/common_go_proto"
+	eciespb "github.com/google/tink/proto/ecies_aead_hkdf_go_proto"
+	tinkpb "github.com/google/tink/proto/tink_go_proto"
+)
+
+// This file contains pre-generated KeyTemplates for HybridEncrypt keys. One can use these templates
+// to generate new Keysets.
+
+// ECIESHKDFAES128GCMKeyTemplate is a KeyTemplate that generates an ECDH P-256 and decapsulation key AES128-GCM key with the following parameters:
+//  - KEM: ECDH over NIST P-256
+//  - DEM: AES128-GCM
+//  - KDF: HKDF-HMAC-SHA256 with an empty salt
+func ECIESHKDFAES128GCMKeyTemplate() *tinkpb.KeyTemplate {
+	empty := []byte{}
+	return createECIESAEADHKDFKeyTemplate(commonpb.EllipticCurveType_NIST_P256, commonpb.HashType_SHA256, commonpb.EcPointFormat_UNCOMPRESSED, aead.AES128GCMKeyTemplate(), empty)
+}
+
+// ECIESHKDFAES128CTRHMACSHA256KeyTemplate is a KeyTemplate that generates an ECDH P-256 and decapsulation key AES128-CTR-HMAC-SHA256 with the following parameters:
+//  - KEM: ECDH over NIST P-256
+//  - DEM: AES128-CTR-HMAC-SHA256 with the following parameters
+//      - AES key size: 16 bytes
+//      - AES CTR IV size: 16 bytes
+//      - HMAC key size: 32 bytes
+//      - HMAC tag size: 16 bytes
+//  - KDF: HKDF-HMAC-SHA256 with an empty salt
+func ECIESHKDFAES128CTRHMACSHA256KeyTemplate() *tinkpb.KeyTemplate {
+	empty := []byte{}
+	return createECIESAEADHKDFKeyTemplate(commonpb.EllipticCurveType_NIST_P256, commonpb.HashType_SHA256, commonpb.EcPointFormat_UNCOMPRESSED, aead.AES128CTRHMACSHA256KeyTemplate(), empty)
+}
+
+// createEciesAEADHKDFKeyTemplate creates a new ECIES-AEAD-HKDF key template with the given key
+// size in bytes.
+func createECIESAEADHKDFKeyTemplate(c commonpb.EllipticCurveType, ht commonpb.HashType, ptfmt commonpb.EcPointFormat, dekT *tinkpb.KeyTemplate, salt []byte) *tinkpb.KeyTemplate {
+	format := &eciespb.EciesAeadHkdfKeyFormat{
+		Params: &eciespb.EciesAeadHkdfParams{
+			KemParams: &eciespb.EciesHkdfKemParams{
+				CurveType:    c,
+				HkdfHashType: ht,
+				HkdfSalt:     salt,
+			},
+			DemParams: &eciespb.EciesAeadDemParams{
+				AeadDem: dekT,
+			},
+			EcPointFormat: ptfmt,
+		},
+	}
+	serializedFormat, _ := proto.Marshal(format)
+	return &tinkpb.KeyTemplate{
+		TypeUrl:          eciesAEADHKDFPrivateKeyTypeURL,
+		Value:            serializedFormat,
+		OutputPrefixType: tinkpb.OutputPrefixType_TINK,
+	}
+}
diff --git a/go/hybrid/hybrid_key_templates_test.go b/go/hybrid/hybrid_key_templates_test.go
new file mode 100644
index 0000000..2f242a2
--- /dev/null
+++ b/go/hybrid/hybrid_key_templates_test.go
@@ -0,0 +1,85 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package hybrid
+
+import (
+	"bytes"
+	"strings"
+	"testing"
+
+	"github.com/golang/protobuf/proto"
+	"github.com/google/tink/go/aead"
+	commonpb "github.com/google/tink/proto/common_go_proto"
+	eciespb "github.com/google/tink/proto/ecies_aead_hkdf_go_proto"
+	tinkpb "github.com/google/tink/proto/tink_go_proto"
+)
+
+func TestECIESHKDFAES128GCMKeyTemplate(t *testing.T) {
+	kformat := new(eciespb.EciesAeadHkdfKeyFormat)
+	kt := ECIESHKDFAES128GCMKeyTemplate()
+	if kt.TypeUrl != eciesAEADHKDFPrivateKeyTypeURL {
+		t.Error("type url mismatch")
+	}
+	if kt.OutputPrefixType != tinkpb.OutputPrefixType_TINK {
+		t.Error("tink output prefix mismatch")
+	}
+	if err := proto.Unmarshal(kt.Value, kformat); err != nil {
+		t.Error("output format")
+	}
+	if kformat.Params.KemParams.CurveType != commonpb.EllipticCurveType_NIST_P256 {
+		t.Error("EC Curve mismatch")
+	}
+	if kformat.Params.KemParams.HkdfHashType != commonpb.HashType_SHA256 {
+		t.Error("Hash type mismatch")
+	}
+	if !bytes.Equal(kformat.Params.KemParams.HkdfSalt, []byte{}) {
+		t.Error("salt mismatch")
+	}
+	if strings.Compare(kformat.Params.DemParams.AeadDem.String(), aead.AES128GCMKeyTemplate().String()) != 0 {
+		t.Error("AEAD DEM mismatch")
+	}
+	if kformat.Params.EcPointFormat != commonpb.EcPointFormat_UNCOMPRESSED {
+		t.Error("point format mismatch")
+	}
+}
+
+func TestECIESHKDFAES128CTRHMACSHA256KeyTemplate(t *testing.T) {
+	kformat := new(eciespb.EciesAeadHkdfKeyFormat)
+	kt := ECIESHKDFAES128CTRHMACSHA256KeyTemplate()
+	if kt.TypeUrl != eciesAEADHKDFPrivateKeyTypeURL {
+		t.Error("type url mismatch")
+	}
+	if kt.OutputPrefixType != tinkpb.OutputPrefixType_TINK {
+		t.Error("tink output prefix mismatch")
+	}
+	if err := proto.Unmarshal(kt.Value, kformat); err != nil {
+		t.Error("output format")
+	}
+	if kformat.Params.KemParams.CurveType != commonpb.EllipticCurveType_NIST_P256 {
+		t.Error("EC Curve mismatch")
+	}
+	if kformat.Params.KemParams.HkdfHashType != commonpb.HashType_SHA256 {
+		t.Error("Hash type mismatch")
+	}
+	if !bytes.Equal(kformat.Params.KemParams.HkdfSalt, []byte{}) {
+		t.Error("salt mismatch")
+	}
+	if strings.Compare(kformat.Params.DemParams.AeadDem.String(), aead.AES128CTRHMACSHA256KeyTemplate().String()) != 0 {
+		t.Error("AEAD DEM mismatch")
+	}
+	if kformat.Params.EcPointFormat != commonpb.EcPointFormat_UNCOMPRESSED {
+		t.Error("point format mismatch")
+	}
+}
diff --git a/go/hybrid/register_ecies_aead_hkdf_dem_helper.go b/go/hybrid/register_ecies_aead_hkdf_dem_helper.go
new file mode 100644
index 0000000..6870984
--- /dev/null
+++ b/go/hybrid/register_ecies_aead_hkdf_dem_helper.go
@@ -0,0 +1,150 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package hybrid
+
+import (
+	"errors"
+	"fmt"
+	"strings"
+
+	"github.com/golang/protobuf/proto"
+	"github.com/google/tink/go/core/registry"
+	subtle "github.com/google/tink/go/subtle/hybrid"
+	"github.com/google/tink/go/tink"
+	ctrhmacpb "github.com/google/tink/proto/aes_ctr_hmac_aead_go_proto"
+	gcmpb "github.com/google/tink/proto/aes_gcm_go_proto"
+	tinkpb "github.com/google/tink/proto/tink_go_proto"
+)
+
+const (
+	aesGCMTypeURL         = "type.googleapis.com/google.crypto.tink.AesGcmKey"
+	aesCTRHMACAEADTypeURL = "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey"
+)
+
+// registerECIESAEADHKDFDemHelper registers a DEM helper.
+type registerECIESAEADHKDFDemHelper struct {
+	demKeyURL        string
+	keyData          []byte
+	symmetricKeySize uint32
+	aesCTRSize       uint32
+}
+
+var _ subtle.EciesAEADHKDFDEMHelper = (*registerECIESAEADHKDFDemHelper)(nil)
+
+// newRegisterECIESAEADHKDFDemHelper initializes and returns a RegisterECIESAEADHKDFDemHelper
+func newRegisterECIESAEADHKDFDemHelper(k *tinkpb.KeyTemplate) (*registerECIESAEADHKDFDemHelper, error) {
+	var len uint32
+	var a uint32
+	var skf []byte
+	var err error
+	u := k.TypeUrl
+
+	if strings.Compare(u, aesGCMTypeURL) == 0 {
+		gcmKeyFormat := new(gcmpb.AesGcmKeyFormat)
+		if err := proto.Unmarshal(k.Value, gcmKeyFormat); err != nil {
+			return nil, err
+		}
+		len = gcmKeyFormat.KeySize
+		a = 0
+		skf, err = proto.Marshal(gcmKeyFormat)
+		if err != nil {
+			return nil, fmt.Errorf("failed to serialize key format, error :%v", err)
+		}
+	} else if strings.Compare(u, aesCTRHMACAEADTypeURL) == 0 {
+		aeadKeyFormat := new(ctrhmacpb.AesCtrHmacAeadKeyFormat)
+		if err := proto.Unmarshal(k.Value, aeadKeyFormat); err != nil {
+			return nil, err
+		}
+		if aeadKeyFormat.AesCtrKeyFormat == nil || aeadKeyFormat.HmacKeyFormat == nil {
+			return nil, fmt.Errorf("failed to deserialize key format")
+		}
+		a = aeadKeyFormat.AesCtrKeyFormat.KeySize
+		len = a + aeadKeyFormat.HmacKeyFormat.KeySize
+		skf, err = proto.Marshal(aeadKeyFormat)
+		if err != nil {
+			return nil, fmt.Errorf("failed to serialize key format, error :%v", err)
+		}
+	} else {
+		return nil, fmt.Errorf("unsupported AEAD DEM key type: %s", u)
+	}
+	km, err := registry.GetKeyManager(k.TypeUrl)
+	if err != nil {
+		return nil, fmt.Errorf("failed to fetch KeyManager, error: %v", err)
+	}
+
+	key, err := km.NewKey(skf)
+	if err != nil {
+		return nil, fmt.Errorf("failed to fetch key, error: %v", err)
+	}
+	sk, err := proto.Marshal(key)
+	if err != nil {
+		return nil, fmt.Errorf("failed to serialize key, error: %v", err)
+	}
+
+	return &registerECIESAEADHKDFDemHelper{
+		demKeyURL:        u,
+		keyData:          sk,
+		symmetricKeySize: len,
+		aesCTRSize:       a,
+	}, nil
+}
+
+// GetSymmetricKeySize returns the symmetric key size
+func (r *registerECIESAEADHKDFDemHelper) GetSymmetricKeySize() uint32 {
+	return r.symmetricKeySize
+
+}
+
+// GetAEAD returns the AEAD primitive from the DEM
+func (r *registerECIESAEADHKDFDemHelper) GetAEAD(symmetricKeyValue []byte) (tink.AEAD, error) {
+	var sk []byte
+	var pErr error
+	if uint32(len(symmetricKeyValue)) != r.GetSymmetricKeySize() {
+		return nil, errors.New("symmetric key has incorrect length")
+	}
+	if strings.Compare(r.demKeyURL, aesGCMTypeURL) == 0 {
+		gcmKey := new(gcmpb.AesGcmKey)
+		if err := proto.Unmarshal(r.keyData, gcmKey); err != nil {
+			return nil, err
+		}
+		gcmKey.KeyValue = symmetricKeyValue
+		sk, pErr = proto.Marshal(gcmKey)
+		if pErr != nil {
+			return nil, fmt.Errorf("failed to serialize key, error: %v", pErr)
+		}
+
+	} else if strings.Compare(r.demKeyURL, aesCTRHMACAEADTypeURL) == 0 {
+		aesCTR := new(ctrhmacpb.AesCtrHmacAeadKey)
+		if err := proto.Unmarshal(r.keyData, aesCTR); err != nil {
+			return nil, err
+		}
+		aesCTR.AesCtrKey.KeyValue = symmetricKeyValue[:r.aesCTRSize]
+		aesCTR.HmacKey.KeyValue = symmetricKeyValue[r.aesCTRSize:]
+		sk, pErr = proto.Marshal(aesCTR)
+		if pErr != nil {
+			return nil, fmt.Errorf("failed to serialize key, error: %v", pErr)
+		}
+
+	} else {
+		return nil, fmt.Errorf("unsupported AEAD DEM key type: %s", r.demKeyURL)
+	}
+
+	p, err := registry.Primitive(r.demKeyURL, sk)
+	if err != nil {
+		return nil, err
+	}
+	g := p.(tink.AEAD)
+	return g, nil
+}
diff --git a/go/hybrid/register_ecies_aead_hkdf_dem_helper_test.go b/go/hybrid/register_ecies_aead_hkdf_dem_helper_test.go
new file mode 100644
index 0000000..b6cc792
--- /dev/null
+++ b/go/hybrid/register_ecies_aead_hkdf_dem_helper_test.go
@@ -0,0 +1,104 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package hybrid
+
+import (
+	"bytes"
+	"encoding/hex"
+	"testing"
+
+	"github.com/google/tink/go/aead"
+	"github.com/google/tink/go/mac"
+	"github.com/google/tink/go/signature"
+	"github.com/google/tink/go/subtle/random"
+	tinkpb "github.com/google/tink/proto/tink_go_proto"
+)
+
+var (
+	keyTemplates = map[*tinkpb.KeyTemplate]uint32{
+		aead.AES256CTRHMACSHA256KeyTemplate(): 64,
+		aead.AES128CTRHMACSHA256KeyTemplate(): 48,
+		aead.AES256GCMKeyTemplate():           32,
+		aead.AES128GCMKeyTemplate():           16,
+	}
+	uTemplates = []*tinkpb.KeyTemplate{
+		signature.ECDSAP256KeyTemplate(),
+		mac.HMACSHA256Tag256KeyTemplate(),
+		&tinkpb.KeyTemplate{TypeUrl: "some url", Value: []byte{0}},
+		&tinkpb.KeyTemplate{TypeUrl: aesCTRHMACAEADTypeURL},
+		&tinkpb.KeyTemplate{TypeUrl: aesGCMTypeURL},
+	}
+)
+
+func TestCipherKeySize(t *testing.T) {
+	for c, l := range keyTemplates {
+		rDem, err := newRegisterECIESAEADHKDFDemHelper(c)
+		if err != nil {
+			t.Fatalf("error generating a DEM helper :%s", err)
+		}
+		if rDem.GetSymmetricKeySize() != l {
+			t.Errorf("incorrect key size %s template, got: %d, want: %d", c, rDem.GetSymmetricKeySize(), l)
+		}
+	}
+}
+
+func TestUnsupportedKeyTemplates(t *testing.T) {
+	for _, l := range uTemplates {
+		_, err := newRegisterECIESAEADHKDFDemHelper(l)
+		if err == nil {
+			t.Fatalf("unsupported key template %s should have generated error", l)
+		}
+	}
+}
+
+func TestAead(t *testing.T) {
+	for c := range keyTemplates {
+		pt := random.GetRandomBytes(20)
+		ad := random.GetRandomBytes(20)
+		rDem, err := newRegisterECIESAEADHKDFDemHelper(c)
+		if err != nil {
+			t.Fatalf("error generating a DEM helper :%s", err)
+		}
+		sk := random.GetRandomBytes(rDem.GetSymmetricKeySize())
+		a, err := rDem.GetAEAD(sk)
+		if err != nil {
+			t.Errorf("error getting AEAD primitive :%s", err)
+		}
+		ct, err := a.Encrypt(pt, ad)
+		if err != nil {
+			t.Errorf("error encrypting :%s", err)
+		}
+		dt, err := a.Decrypt(ct, ad)
+		if err != nil {
+			t.Errorf("error decrypting :%s", err)
+		}
+		if !bytes.Equal(dt, pt) {
+			t.Errorf("decryption not inverse of encryption,\n want :%s,\n got: %s", hex.Dump(pt), hex.Dump(dt))
+		}
+
+		// shorter symmetric key
+		sk = random.GetRandomBytes(rDem.GetSymmetricKeySize() - 1)
+		if _, err = rDem.GetAEAD(sk); err == nil {
+			t.Errorf("retrieving AEAD primitive should have failed")
+		}
+
+		// longer symmetric key
+		sk = random.GetRandomBytes(rDem.GetSymmetricKeySize() + 1)
+		if _, err = rDem.GetAEAD(sk); err == nil {
+			t.Errorf("retrieving AEAD primitive should have failed")
+		}
+
+	}
+}
diff --git a/go/insecurecleartextkeyset/BUILD.bazel b/go/insecurecleartextkeyset/BUILD.bazel
index 2edcfcb..7e3ca8f 100644
--- a/go/insecurecleartextkeyset/BUILD.bazel
+++ b/go/insecurecleartextkeyset/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
 
-licenses(["notice"])  # Apache 2.0 # keep
+licenses(["notice"])  # keep
 
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
@@ -20,9 +20,9 @@
     srcs = ["insecurecleartextkeyset_test.go"],
     embed = [":go_default_library"],
     deps = [
+        "//go/keyset:go_default_library",
         "//go/mac:go_default_library",
         "//go/testutil:go_default_library",
-        "//go/keyset:go_default_library",
         "//proto:tink_go_proto",
         "@com_github_golang_protobuf//proto:go_default_library",
     ],
diff --git a/go/insecurecleartextkeyset/insecurecleartextkeyset.go b/go/insecurecleartextkeyset/insecurecleartextkeyset.go
index 52197bb..62b99d9 100644
--- a/go/insecurecleartextkeyset/insecurecleartextkeyset.go
+++ b/go/insecurecleartextkeyset/insecurecleartextkeyset.go
@@ -12,10 +12,11 @@
 //
 ////////////////////////////////////////////////////////////////////////////////
 
-// Package insecurecleartextkeyset provides methods to read or write cleartext keyset material.
+// Package insecurecleartextkeyset provides methods to read or write cleartext
+// keyset material.
 //
-// This package contains dangerous functions, and is separate from the rest of Tink so that its
-// usage can be restricted and audited.
+// This package contains dangerous functions, and is separate from the rest of
+// Tink so that its usage can be restricted and audited.
 package insecurecleartextkeyset
 
 import (
@@ -27,7 +28,11 @@
 )
 
 var (
-	keysetHandle     = internal.KeysetHandle.(func(*tinkpb.Keyset) *keyset.Handle)
+	// KeysetHandle creates a keyset.Handle from cleartext key material.
+	KeysetHandle = internal.KeysetHandle.(func(*tinkpb.Keyset) *keyset.Handle)
+	// KeysetMaterial returns the key material contained in a keyset.Handle.
+	KeysetMaterial = internal.KeysetMaterial.(func(*keyset.Handle) *tinkpb.Keyset)
+
 	errInvalidKeyset = errors.New("insecurecleartextkeyset: invalid keyset")
 	errInvalidHandle = errors.New("insecurecleartextkeyset: invalid handle")
 	errInvalidReader = errors.New("insecurecleartextkeyset: invalid reader")
@@ -43,12 +48,13 @@
 	if err != nil || ks == nil || len(ks.Key) == 0 {
 		return nil, errInvalidKeyset
 	}
-	return keysetHandle(ks), nil
+	return KeysetHandle(ks), nil
 }
 
 // Write exports the keyset from h to the given writer w without encrypting it.
-// Storing secret key material in an unencrypted fashion is dangerous. If feasible, you should use
-// func keyset.Handle.Write() instead.
+//
+// Storing secret key material in an unencrypted fashion is dangerous. If
+// feasible, you should use func keyset.Handle.Write() instead.
 func Write(h *keyset.Handle, w keyset.Writer) error {
 	if h == nil {
 		return errInvalidHandle
@@ -56,5 +62,5 @@
 	if w == nil {
 		return errInvalidWriter
 	}
-	return w.Write(h.Keyset())
+	return w.Write(KeysetMaterial(h))
 }
diff --git a/go/insecurecleartextkeyset/insecurecleartextkeyset_test.go b/go/insecurecleartextkeyset/insecurecleartextkeyset_test.go
index e597f70..5217364 100644
--- a/go/insecurecleartextkeyset/insecurecleartextkeyset_test.go
+++ b/go/insecurecleartextkeyset/insecurecleartextkeyset_test.go
@@ -44,12 +44,14 @@
 	if handle == nil || err != nil {
 		t.Fatalf("cannot get keyset handle: %v", err)
 	}
-	parsedHandle, err := insecurecleartextkeyset.Read(&keyset.MemReaderWriter{Keyset: handle.Keyset()})
+	ks := insecurecleartextkeyset.KeysetMaterial(handle)
+	parsedHandle, err := insecurecleartextkeyset.Read(&keyset.MemReaderWriter{Keyset: ks})
 	if err != nil {
 		t.Fatalf("unexpected error reading keyset: %v", err)
 	}
-	if !proto.Equal(handle.Keyset(), parsedHandle.Keyset()) {
-		t.Errorf("parsed keyset (%s) doesn't match original keyset (%s)", parsedHandle.Keyset(), handle.Keyset())
+	parsedKs := insecurecleartextkeyset.KeysetMaterial(parsedHandle)
+	if !proto.Equal(ks, parsedKs) {
+		t.Errorf("parsed keyset (%s) doesn't match original keyset (%s)", parsedKs, ks)
 	}
 }
 
diff --git a/go/integration/awskms/BUILD.bazel b/go/integration/awskms/BUILD.bazel
new file mode 100644
index 0000000..7f9e92a
--- /dev/null
+++ b/go/integration/awskms/BUILD.bazel
@@ -0,0 +1,45 @@
+package(default_visibility = ["//tools/build_defs:internal_pkg"])
+
+licenses(["notice"])  # keep
+
+
+load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
+
+
+go_library(
+    name = "go_default_library",
+    srcs = [
+        "aws_kms_aead.go",
+        "aws_kms_client.go",
+    ],
+    importpath = "github.com/google/tink/go/integration/awskms",
+    visibility = ["//visibility:public"],
+    deps = [
+        "@com_github_aws_sdk_go//aws:go_default_library",
+        "@com_github_aws_sdk_go//service/kms:go_default_library",
+        "@com_github_aws_sdk_go//aws/credentials:go_default_library",
+        "@com_github_aws_sdk_go//aws/session:go_default_library",
+        "//go/aead:go_default_library",
+        "//go/tink:go_default_library",
+        "//go/core/registry:go_default_library",
+    ],
+)
+
+go_test(
+    name = "go_default_test",
+    srcs = ["aws_kms_aead_test.go"],
+    data = [
+        "@google_root_pem//file", #keep
+        "//testdata:credentials",
+    ],
+    embed = [":go_default_library",],
+    deps = [
+        "//go/aead:go_default_library",
+        "//go/subtle/random:go_default_library",
+        "//go/subtle/aead:go_default_library",
+        "//go/tink:go_default_library",
+        "//go/keyset:go_default_library",
+        "//go/core/registry:go_default_library",
+    ],
+    tags = ["no_rbe"],
+)
diff --git a/go/integration/awskms/aws_kms_aead.go b/go/integration/awskms/aws_kms_aead.go
new file mode 100644
index 0000000..53dc411
--- /dev/null
+++ b/go/integration/awskms/aws_kms_aead.go
@@ -0,0 +1,93 @@
+// Copyright 2017 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// Package awskms provides integration with the AWS Cloud KMS.
+package awskms
+
+import (
+	"encoding/hex"
+	"errors"
+	"strings"
+
+	"github.com/aws/aws-sdk-go/aws"
+	"github.com/aws/aws-sdk-go/service/kms"
+
+	"github.com/google/tink/go/aead"
+	"github.com/google/tink/go/tink"
+)
+
+// AWSAEAD represents a AWS KMS service to a particular URI.
+type AWSAEAD struct {
+	keyURI string
+	kms    *kms.KMS
+}
+
+var (
+	_       tink.AEAD = (*AWSAEAD)(nil)
+	awsaead           = aead.New
+)
+
+// NewAWSAEAD returns a new AWS KMS service.
+func NewAWSAEAD(keyURI string, kms *kms.KMS) *AWSAEAD {
+	return &AWSAEAD{
+		keyURI: keyURI,
+		kms:    kms,
+	}
+}
+
+// Encrypt AEAD encrypts the plaintext data and uses addtionaldata from authentication.
+func (a *AWSAEAD) Encrypt(plaintext, additionalData []byte) ([]byte, error) {
+	ad := hex.EncodeToString(additionalData)
+	req := &kms.EncryptInput{
+		KeyId:             aws.String(a.keyURI),
+		Plaintext:         plaintext,
+		EncryptionContext: map[string]*string{"additionalData": &ad},
+	}
+	if ad == "" {
+		req = &kms.EncryptInput{
+			KeyId:     aws.String(a.keyURI),
+			Plaintext: plaintext,
+		}
+	}
+	resp, err := a.kms.Encrypt(req)
+	if err != nil {
+		return nil, err
+	}
+
+	return resp.CiphertextBlob, nil
+}
+
+// Decrypt AEAD decrypts the data and verified the additional data.
+func (a *AWSAEAD) Decrypt(ciphertext, additionalData []byte) ([]byte, error) {
+	ad := hex.EncodeToString(additionalData)
+	req := &kms.DecryptInput{
+		CiphertextBlob:    ciphertext,
+		EncryptionContext: map[string]*string{"additionalData": &ad},
+	}
+	if ad == "" {
+		req = &kms.DecryptInput{
+			CiphertextBlob: ciphertext,
+		}
+	}
+	resp, err := a.kms.Decrypt(req)
+	if strings.Compare(*resp.KeyId, a.keyURI) != 0 {
+		return nil, errors.New("decryption failed: wrong key id")
+	}
+	if err != nil {
+		return nil, err
+	}
+	return resp.Plaintext, nil
+}
diff --git a/go/integration/awskms/aws_kms_aead_test.go b/go/integration/awskms/aws_kms_aead_test.go
new file mode 100644
index 0000000..60df87f
--- /dev/null
+++ b/go/integration/awskms/aws_kms_aead_test.go
@@ -0,0 +1,154 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package awskms
+
+import (
+	"bytes"
+	"errors"
+	"os"
+	// ignore-placeholder1
+	// ignore-placeholder2
+	"testing"
+
+	"flag"
+	// context is used to cancel outstanding requests
+	// TEST_SRCDIR to read the roots.pem
+	"github.com/google/tink/go/aead"
+	"github.com/google/tink/go/core/registry"
+	"github.com/google/tink/go/keyset"
+	// ignore-placeholder3
+	"github.com/google/tink/go/subtle/random"
+	"github.com/google/tink/go/tink"
+)
+
+const (
+	keyURI  = "aws-kms://arn:aws:kms:us-east-2:235739564943:key/3ee50705-5a82-4f5b-9753-05c4f473922f"
+	profile = "tink-user1"
+)
+
+var (
+	// lint placeholder header, please ignore
+	credFile    = os.Getenv("TEST_SRCDIR") + "/" + os.Getenv("TEST_WORKSPACE") + "/" + "testdata/credentials_aws.csv"
+	badCredFile = os.Getenv("TEST_SRCDIR") + "/" + os.Getenv("TEST_WORKSPACE") + "/" + "testdata/bad_access_keys_aws.csv"
+	credINIFile = os.Getenv("TEST_SRCDIR") + "/" + os.Getenv("TEST_WORKSPACE") + "/" + "testdata/credentials_aws.cred"
+	// lint placeholder footer, please ignore
+)
+
+// lint placeholder header, please ignore
+func init() {
+	certPath := os.Getenv("TEST_SRCDIR") + "/" + os.Getenv("TEST_WORKSPACE") + "/" + "roots.pem"
+	flag.Set("cacerts", certPath)
+	os.Setenv("SSL_CERT_FILE", certPath)
+}
+
+// lint placeholder footer, please ignore
+
+func setupKMS(t *testing.T, cf string) {
+	t.Helper()
+	g, err := NewAWSClient(keyURI)
+	if err != nil {
+		t.Fatalf("error setting up aws client: %v", err)
+	}
+	_, err = g.LoadCredentials(cf)
+	if err != nil {
+		t.Fatalf("error loading credentials : %v", err)
+	}
+	registry.RegisterKMSClient(g)
+}
+
+func basicAEADTest(t *testing.T, a tink.AEAD) error {
+	t.Helper()
+	for i := 0; i < 100; i++ {
+		pt := random.GetRandomBytes(20)
+		ad := random.GetRandomBytes(20)
+		ct, err := a.Encrypt(pt, ad)
+		if err != nil {
+			return err
+		}
+		dt, err := a.Decrypt(ct, ad)
+		if err != nil {
+			return err
+		}
+		if !bytes.Equal(dt, pt) {
+			return errors.New("decrypt not inverse of encrypt")
+		}
+	}
+	return nil
+}
+
+func TestBasicAead(t *testing.T) {
+	for _, file := range []string{credFile, credINIFile} {
+		setupKMS(t, file)
+		// ignore-placeholder4
+		dek := aead.AES128CTRHMACSHA256KeyTemplate()
+		kh, err := keyset.NewHandle(aead.KMSEnvelopeAEADKeyTemplate(keyURI, dek))
+		if err != nil {
+			t.Fatalf("error getting a new keyset handle: %v", err)
+		}
+		a, err := awsaead(kh)
+		if err != nil {
+			t.Fatalf("error getting the primitive: %v", err)
+		}
+		if err := basicAEADTest(t, a); err != nil {
+			t.Errorf("error in basic aead tests: %v", err)
+		}
+	}
+}
+
+func TestBasicAeadWithoutAdditionalData(t *testing.T) {
+	for _, file := range []string{credFile, credINIFile} {
+		setupKMS(t, file)
+		// ignore-placeholder4
+		dek := aead.AES128CTRHMACSHA256KeyTemplate()
+		kh, err := keyset.NewHandle(aead.KMSEnvelopeAEADKeyTemplate(keyURI, dek))
+		if err != nil {
+			t.Fatalf("error getting a new keyset handle: %v", err)
+		}
+		a, err := awsaead(kh)
+		if err != nil {
+			t.Fatalf("error getting the primitive: %v", err)
+		}
+		for i := 0; i < 100; i++ {
+			pt := random.GetRandomBytes(20)
+			ct, err := a.Encrypt(pt, nil)
+			if err != nil {
+				t.Fatalf("error encrypting data: %v", err)
+			}
+			dt, err := a.Decrypt(ct, nil)
+			if err != nil {
+				t.Fatalf("error decrypting data: %v", err)
+			}
+			if !bytes.Equal(dt, pt) {
+				t.Fatalf("decrypt not inverse of encrypt")
+			}
+		}
+	}
+}
+
+// ignore-placeholder5
+
+func TestLoadBadCSVCredential(t *testing.T) {
+	g, err := NewAWSClient(keyURI)
+	if err != nil {
+		t.Fatalf("error setting up aws client: %v", err)
+	}
+	_, err = g.LoadCredentials(badCredFile)
+	if err == nil {
+		t.Fatalf("does not reject two-column csv file, expect error : %v", errCredCSV)
+	}
+	if err != errCredCSV {
+		t.Fatalf("expect error : %v, got: %v", errCredCSV, err)
+	}
+}
diff --git a/go/integration/awskms/aws_kms_client.go b/go/integration/awskms/aws_kms_client.go
new file mode 100644
index 0000000..4818dec
--- /dev/null
+++ b/go/integration/awskms/aws_kms_client.go
@@ -0,0 +1,197 @@
+// Copyright 2017 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package awskms
+
+import (
+	"encoding/csv"
+	"errors"
+	"fmt"
+	"os"
+	"regexp"
+	"strings"
+
+	"github.com/aws/aws-sdk-go/aws"
+	"github.com/aws/aws-sdk-go/aws/credentials"
+	"github.com/aws/aws-sdk-go/aws/session"
+	"github.com/aws/aws-sdk-go/service/kms"
+	"github.com/google/tink/go/core/registry"
+	"github.com/google/tink/go/tink"
+)
+
+const (
+	awsPrefix = "aws-kms://"
+)
+
+var (
+	errCred    = errors.New("invalid credential path")
+	errBadFile = errors.New("cannot open credential path")
+	errCredCSV = errors.New("malformed credential csv file")
+)
+
+// AWSClient represents a client that connects to the AWS KMS backend.
+type AWSClient struct {
+	keyURI string
+	kms    *kms.KMS
+	region string
+}
+
+var _ registry.KMSClient = (*AWSClient)(nil)
+
+// NewAWSClient returns a new client to AWS KMS. It does not have an established session.
+func NewAWSClient(URI string) (*AWSClient, error) {
+	if !strings.HasPrefix(strings.ToLower(URI), awsPrefix) {
+		return nil, fmt.Errorf("key URI must start with %s", awsPrefix)
+	}
+	r, err := getRegion(URI)
+	if err != nil {
+		return nil, err
+	}
+	return &AWSClient{
+		keyURI: URI,
+		region: r,
+	}, nil
+
+}
+
+// Supported true if this client does support keyURI
+func (g *AWSClient) Supported(keyURI string) bool {
+	if (len(g.keyURI) > 0) && (strings.Compare(strings.ToLower(g.keyURI), strings.ToLower(keyURI)) == 0) {
+		return true
+	}
+	return ((len(g.keyURI) == 0) && (strings.HasPrefix(strings.ToLower(keyURI), awsPrefix)))
+}
+
+// LoadCredentials loads the credentials in credentialPath.
+func (g *AWSClient) LoadCredentials(credentialPath string) (*AWSClient, error) {
+	var creds *credentials.Credentials
+	if len(credentialPath) <= 0 {
+		return nil, errCred
+	}
+	c, err := extractCredsCSV(credentialPath)
+	switch err {
+	case nil:
+		creds = credentials.NewStaticCredentialsFromCreds(*c)
+	case errBadFile, errCredCSV:
+		return nil, err
+	default:
+		// fallback to load the credential path as .ini shared credentials.
+		creds = credentials.NewSharedCredentials(credentialPath, "default")
+	}
+	session := session.Must(session.NewSession(&aws.Config{
+		Credentials: creds,
+		Region:      aws.String(g.region),
+	}))
+
+	g.kms = kms.New(session)
+	return g, nil
+}
+
+// LoadDefaultCredentials loads with the default credentials.
+func (g *AWSClient) LoadDefaultCredentials() (*AWSClient, error) {
+	session := session.Must(session.NewSession(&aws.Config{
+		Region: aws.String(g.region),
+	}))
+	g.kms = kms.New(session)
+	return g, nil
+}
+
+// WithCredentials retrieves credentials using a provider.
+func (g *AWSClient) WithCredentials(p *credentials.Credentials) (*AWSClient, error) {
+	session := session.Must(session.NewSession(&aws.Config{
+		Region:      aws.String(g.region),
+		Credentials: p,
+	}))
+	g.kms = kms.New(session)
+	return g, nil
+}
+
+// GetAEAD gets an AEAD backend by keyURI.
+func (g *AWSClient) GetAEAD(keyURI string) (tink.AEAD, error) {
+	if len(g.keyURI) > 0 && strings.Compare(strings.ToLower(g.keyURI), strings.ToLower(keyURI)) != 0 {
+		return nil, fmt.Errorf("this client is bound to %s, cannot load keys bound to %s", g.keyURI, keyURI)
+	}
+	uri, err := validateTrimKMSPrefix(g.keyURI, awsPrefix)
+	if err != nil {
+		return nil, err
+	}
+	return NewAWSAEAD(uri, g.kms), nil
+}
+
+func validateKMSPrefix(keyURI, prefix string) bool {
+	if len(keyURI) > 0 && strings.HasPrefix(strings.ToLower(keyURI), awsPrefix) {
+		return true
+	}
+	return false
+}
+
+func validateTrimKMSPrefix(keyURI, prefix string) (string, error) {
+	if !validateKMSPrefix(keyURI, prefix) {
+		return "", fmt.Errorf("key URI must start with %s", prefix)
+	}
+	return strings.TrimPrefix(keyURI, prefix), nil
+}
+
+func extractCredsCSV(file string) (*credentials.Value, error) {
+	f, err := os.Open(file)
+	if err != nil {
+		return nil, errBadFile
+	}
+	defer f.Close()
+
+	lines, err := csv.NewReader(f).ReadAll()
+	if err != nil {
+		return nil, err
+	}
+
+	// It is possible that the file is an AWS .ini credential file, and it can be
+	// parsed as 1-column CSV file as well. A real AWS credentials.csv is never 1 column.
+	if len(lines) > 0 && len(lines[0]) == 1 {
+		return nil, errors.New("not a valid CSV credential file")
+	}
+
+	// credentials.csv can be obtained when a AWS IAM user is created through IAM console.
+	// The first line of the csv file is "User name,Password,Access key ID,Secret access key,Console login link"
+	// The 2nd line of it contains 5 comma separated values.
+	// Parse the file with a strict format assumption as follows:
+	// 1. There must be at least 4 columns and 2 rows.
+	// 2. The access key id and the secret access key must be on (0-based) column 2 and 3.
+	if len(lines) < 2 {
+		return nil, errCredCSV
+	}
+
+	if len(lines[1]) < 4 {
+		return nil, errCredCSV
+	}
+
+	return &credentials.Value{
+		AccessKeyID:     lines[1][2],
+		SecretAccessKey: lines[1][3],
+	}, nil
+
+}
+
+func getRegion(keyURI string) (string, error) {
+	re1, err := regexp.Compile(`aws-kms://arn:aws:kms:([a-z0-9-]+):`)
+	if err != nil {
+		return "", err
+	}
+	r := re1.FindStringSubmatch(keyURI)
+	if len(r) != 2 {
+		return "", errors.New("extracting region from URI failed")
+	}
+	return r[1], nil
+}
diff --git a/go/integration/gcpkms/BUILD.bazel b/go/integration/gcpkms/BUILD.bazel
index f043eca..4a16265 100644
--- a/go/integration/gcpkms/BUILD.bazel
+++ b/go/integration/gcpkms/BUILD.bazel
@@ -1,11 +1,9 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0 # keep
-
+licenses(["notice"])  # keep
 
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
-
 go_library(
     name = "go_default_library",
     srcs = [
@@ -15,11 +13,11 @@
     importpath = "github.com/google/tink/go/integration/gcpkms",
     visibility = ["//visibility:public"],
     deps = [
+        "//go/core/registry:go_default_library",
+        "//go/tink:go_default_library",
         "@org_golang_google_api//cloudkms/v1:go_default_library",
         "@org_golang_x_oauth2//:go_default_library",
         "@org_golang_x_oauth2//google:go_default_library",
-        "//go/tink:go_default_library",
-        "//go/registry:go_default_library",
     ],
 )
 
@@ -27,17 +25,18 @@
     name = "go_default_test",
     srcs = ["gcp_kms_aead_test.go"],
     data = [
-        "@google_root_pem//file", #keep
         "//testdata:credentials",
         "//testdata:ecies_keysets",
-        "@wycheproof//testvectors:all", #keep
+        "@google_root_pem//file",  #keep
+        "@wycheproof//testvectors:all",  #keep
     ],
-    embed = [":go_default_library",],
+    embed = [":go_default_library"],
     deps = [
         "//go/aead:go_default_library",
+        "//go/core/registry:go_default_library",
+        "//go/keyset:go_default_library",
         "//go/subtle/random:go_default_library",
         "//go/tink:go_default_library",
-        "//go/keyset:go_default_library",
-        "//go/registry:go_default_library",
     ],
+    tags = ["no_rbe"],
 )
diff --git a/go/integration/gcpkms/gcp_kms_aead.go b/go/integration/gcpkms/gcp_kms_aead.go
index e43a98a..50f2911 100644
--- a/go/integration/gcpkms/gcp_kms_aead.go
+++ b/go/integration/gcpkms/gcp_kms_aead.go
@@ -14,7 +14,7 @@
 //
 ////////////////////////////////////////////////////////////////////////////////
 
-// Package gcpkms provides integration with the GCP Cloud KMS.
+// Package gcpkms provides integration with the Google Cloud KMS.
 package gcpkms
 
 import (
@@ -45,8 +45,8 @@
 func (a *GCPAEAD) Encrypt(plaintext, additionalData []byte) ([]byte, error) {
 
 	req := &cloudkms.EncryptRequest{
-		Plaintext:                   base64.StdEncoding.EncodeToString(plaintext),
-		AdditionalAuthenticatedData: base64.StdEncoding.EncodeToString(additionalData),
+		Plaintext:                   base64.URLEncoding.EncodeToString(plaintext),
+		AdditionalAuthenticatedData: base64.URLEncoding.EncodeToString(additionalData),
 	}
 	resp, err := a.kms.Projects.Locations.KeyRings.CryptoKeys.Encrypt(a.keyURI, req).Do()
 	if err != nil {
@@ -60,8 +60,8 @@
 func (a *GCPAEAD) Decrypt(ciphertext, additionalData []byte) ([]byte, error) {
 
 	req := &cloudkms.DecryptRequest{
-		Ciphertext:                  base64.StdEncoding.EncodeToString(ciphertext),
-		AdditionalAuthenticatedData: base64.StdEncoding.EncodeToString(additionalData),
+		Ciphertext:                  base64.URLEncoding.EncodeToString(ciphertext),
+		AdditionalAuthenticatedData: base64.URLEncoding.EncodeToString(additionalData),
 	}
 	resp, err := a.kms.Projects.Locations.KeyRings.CryptoKeys.Decrypt(a.keyURI, req).Do()
 	if err != nil {
diff --git a/go/integration/gcpkms/gcp_kms_aead_test.go b/go/integration/gcpkms/gcp_kms_aead_test.go
index 0e98c68..c9e9a5d 100644
--- a/go/integration/gcpkms/gcp_kms_aead_test.go
+++ b/go/integration/gcpkms/gcp_kms_aead_test.go
@@ -24,8 +24,8 @@
 	// context is used to cancel outstanding requests
 	// TEST_SRCDIR to read the roots.pem
 	"github.com/google/tink/go/aead"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/keyset"
-	"github.com/google/tink/go/registry"
 	"github.com/google/tink/go/subtle/random"
 	"github.com/google/tink/go/tink"
 )
@@ -35,19 +35,19 @@
 )
 
 var (
-	// LINT.IfChange
+	// lint placeholder header, please ignore
 	credFile = os.Getenv("TEST_SRCDIR") + "/" + os.Getenv("TEST_WORKSPACE") + "/" + "testdata/credential.json"
-	// LINT.ThenChange(//depot/google3/third_party/tink/copybara/go.bara.sky)
+	// lint placeholder footer, please ignore
 )
 
-// LINT.IfChange
+// lint placeholder header, please ignore
 func init() {
 	certPath := os.Getenv("TEST_SRCDIR") + "/" + os.Getenv("TEST_WORKSPACE") + "/" + "roots.pem"
 	flag.Set("cacerts", certPath)
 	os.Setenv("SSL_CERT_FILE", certPath)
 }
 
-// LINT.ThenChange(//depot/google3/third_party/tink/copybara/go.bara.sky)
+// lint placeholder footer, please ignore
 
 func setupKMS(t *testing.T) {
 	t.Helper()
@@ -55,9 +55,8 @@
 	if err != nil {
 		t.Errorf("error setting up gcp client: %v", err)
 	}
-	_, err = g.LoadCredentials(credFile)
-	if err != nil {
-		t.Errorf("error loading credentials : %v", err)
+	if _, err = g.LoadCredentials(credFile); err != nil {
+		t.Fatalf("error loading credentials : %v", err)
 	}
 	registry.RegisterKMSClient(g)
 }
diff --git a/go/integration/gcpkms/gcp_kms_client.go b/go/integration/gcpkms/gcp_kms_client.go
index 8866b06..abf3bf4 100644
--- a/go/integration/gcpkms/gcp_kms_client.go
+++ b/go/integration/gcpkms/gcp_kms_client.go
@@ -14,6 +14,52 @@
 //
 ////////////////////////////////////////////////////////////////////////////////
 
+// Package gcpkms provides integration with the GCP Cloud KMS.
+// Tink APIs work with GCP and AWS KMS.
+// GCP Example below:
+//
+// package main
+//
+// import (
+//     "github.com/google/tink/go/aead"
+//     "github.com/google/tink/go/core/registry"
+//     "github.com/google/tink/go/integration/gcpkms"
+//     "github.com/google/tink/go/keyset"
+// )
+//
+// const (
+//     keyURI = "gcp-kms://......"
+// )
+//
+// func main() {
+//     gcpclient := gcpkms.NewGCPClient(keyURI)
+//     _, err := gcpclient.LoadCredentials("/mysecurestorage/credentials.json")
+//     if err != nil {
+//         //handle error
+//     }
+//     registry.RegisterKMSClient(gcpclient)
+//
+//     dek := aead.AES128CTRHMACSHA256KeyTemplate()
+//     kh, err := keyset.NewHandle(aead.KMSEnvelopeAEADKeyTemplate(keyURI, dek))
+//     if err != nil {
+//         // handle error
+//     }
+//     a, err := aead.New(kh)
+//     if err != nil {
+//         // handle error
+//     }
+//
+//     ct, err = a.Encrypt([]byte("secret message"), []byte("associated data"))
+//     if err != nil {
+//         // handle error
+//     }
+//
+//     pt, err = a.Decrypt(ct, []byte("associated data"))
+//     if err != nil {
+//         // handle error
+//     }
+// }
+
 package gcpkms
 
 import (
@@ -23,11 +69,11 @@
 	"io/ioutil"
 	"strings"
 
-	"google.golang.org/api/cloudkms/v1"
-	"golang.org/x/oauth2/google"
-	"golang.org/x/oauth2"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/tink"
+	"golang.org/x/oauth2"
+	"golang.org/x/oauth2/google"
+	"google.golang.org/api/cloudkms/v1"
 )
 
 const (
@@ -68,7 +114,7 @@
 
 // LoadCredentials loads the credentials in credentialPath. If credentialPath is  null, loads the
 // default credentials.
-func (g *GCPClient) LoadCredentials(credentialPath string) (interface{}, error) {
+func (g *GCPClient) LoadCredentials(credentialPath string) (*GCPClient, error) {
 	ctx := context.Background()
 	if len(credentialPath) <= 0 {
 		return nil, errCred
@@ -91,7 +137,7 @@
 }
 
 // LoadDefaultCredentials loads with the default credentials.
-func (g *GCPClient) LoadDefaultCredentials() (interface{}, error) {
+func (g *GCPClient) LoadDefaultCredentials() (*GCPClient, error) {
 	ctx := context.Background()
 	client, err := google.DefaultClient(ctx, cloudkms.CloudPlatformScope)
 	if err != nil {
diff --git a/go/internal/BUILD.bazel b/go/internal/BUILD.bazel
index b8f931d..f11c37a 100644
--- a/go/internal/BUILD.bazel
+++ b/go/internal/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
 
-licenses(["notice"])  # Apache 2.0 # keep
+licenses(["notice"])  # keep
 
 load("@io_bazel_rules_go//go:def.bzl", "go_library")
 
diff --git a/go/internal/internal.go b/go/internal/internal.go
index f644270..b26b74c 100644
--- a/go/internal/internal.go
+++ b/go/internal/internal.go
@@ -12,9 +12,13 @@
 //
 ////////////////////////////////////////////////////////////////////////////////
 
-// Package internal provides a coordination point for package keyset, package insecurecleartextkeyset, and package testkeyset.
-// internal must only be imported by these three packages.
+// Package internal provides a coordination point for package keyset, package
+// insecurecleartextkeyset, and package testkeyset.  internal must only be
+// imported by these three packages.
 package internal
 
-// KeysetHandle is the raw constructor for a keyset.Handle.
+// KeysetHandle is a raw constructor of keyset.Handle.
 var KeysetHandle interface{}
+
+// KeysetMaterial returns the key material contained in a keyset.Handle.
+var KeysetMaterial interface{}
diff --git a/go/keyset/BUILD.bazel b/go/keyset/BUILD.bazel
index 0c76b99..77499ed 100644
--- a/go/keyset/BUILD.bazel
+++ b/go/keyset/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
@@ -9,6 +9,7 @@
     srcs = [
         "binary_io.go",
         "handle.go",
+        "json_io.go",
         "keyset.go",
         "manager.go",
         "mem_io.go",
@@ -17,14 +18,18 @@
         "writer.go",
     ],
     importpath = "github.com/google/tink/go/keyset",
+    visibility = [
+        "//visibility:public",
+    ],
     deps = [
+        "//go/core/primitiveset:go_default_library",
+        "//go/core/registry:go_default_library",
         "//go/internal:go_default_library",
-        "//go/primitiveset:go_default_library",
-        "//go/registry:go_default_library",
         "//go/subtle/random:go_default_library",
         "//go/tink:go_default_library",
         "//proto:tink_go_proto",
         "@com_github_golang_protobuf//proto:go_default_library",
+        "@com_github_golang_protobuf//jsonpb:go_default_library",
     ],
 )
 
@@ -32,6 +37,7 @@
     name = "go_default_test",
     srcs = [
         "binary_io_test.go",
+        "json_io_test.go",
         "handle_test.go",
         "manager_test.go",
         "validation_test.go",
@@ -40,10 +46,10 @@
         "//go/keyset:go_default_library",
         "//go/mac:go_default_library",
         "//go/subtle/aead:go_default_library",
+        "//go/subtle/random:go_default_library",
         "//go/testkeyset:go_default_library",
         "//go/testutil:go_default_library",
         "//proto:tink_go_proto",
         "@com_github_golang_protobuf//proto:go_default_library",
     ],
 )
-
diff --git a/go/keyset/binary_io_test.go b/go/keyset/binary_io_test.go
index cfa6d2c..c233248 100644
--- a/go/keyset/binary_io_test.go
+++ b/go/keyset/binary_io_test.go
@@ -21,6 +21,7 @@
 
 	"github.com/golang/protobuf/proto"
 	"github.com/google/tink/go/keyset"
+	"github.com/google/tink/go/testkeyset"
 	"github.com/google/tink/go/testutil"
 
 	tinkpb "github.com/google/tink/proto/tink_go_proto"
@@ -37,7 +38,8 @@
 		t.Fatalf("cannot get keyset handle: %v", err)
 	}
 
-	if err := w.Write(h.Keyset()); err != nil {
+	ks1 := testkeyset.KeysetMaterial(h)
+	if err := w.Write(ks1); err != nil {
 		t.Fatalf("cannot write keyset: %v", err)
 	}
 
@@ -46,8 +48,8 @@
 		t.Fatalf("cannot read keyset: %v", err)
 	}
 
-	if !proto.Equal(h.Keyset(), ks2) {
-		t.Errorf("written keyset (%s) doesn't match read keyset (%s)", h.Keyset(), ks2)
+	if !proto.Equal(ks1, ks2) {
+		t.Errorf("written keyset (%s) doesn't match read keyset (%s)", ks1, ks2)
 	}
 }
 
diff --git a/go/keyset/handle.go b/go/keyset/handle.go
index 125d885..b7568b2 100644
--- a/go/keyset/handle.go
+++ b/go/keyset/handle.go
@@ -20,8 +20,8 @@
 
 	"github.com/golang/protobuf/proto"
 
-	"github.com/google/tink/go/primitiveset"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/primitiveset"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/tink"
 	tinkpb "github.com/google/tink/proto/tink_go_proto"
 )
@@ -52,6 +52,9 @@
 // NewHandleWithNoSecrets creates a new instance of KeysetHandle using the given keyset which does
 // not contain any secret key material.
 func NewHandleWithNoSecrets(ks *tinkpb.Keyset) (*Handle, error) {
+	if ks == nil {
+		return nil, errors.New("keyset.Handle: nil keyset")
+	}
 	h := &Handle{ks}
 	if h.hasSecrets() {
 		// If you need to do this, you have to use func insecurecleartextkeyset.Read() instead.
@@ -110,11 +113,6 @@
 	return &Handle{ks}, nil
 }
 
-// Keyset returns the Keyset managed by this handle.
-func (h *Handle) Keyset() *tinkpb.Keyset {
-	return h.ks
-}
-
 // String returns a string representation of the managed keyset.
 // The result does not contain any sensitive key material.
 func (h *Handle) String() string {
@@ -127,7 +125,7 @@
 
 // Write encrypts and writes the enclosing keyset.
 func (h *Handle) Write(writer Writer, masterKey tink.AEAD) error {
-	encrypted, err := encrypt(h.Keyset(), masterKey)
+	encrypted, err := encrypt(h.ks, masterKey)
 	if err != nil {
 		return err
 	}
@@ -167,12 +165,11 @@
 // The returned set is usually later "wrapped" into a class that implements
 // the corresponding Primitive-interface.
 func (h *Handle) PrimitivesWithKeyManager(km registry.KeyManager) (*primitiveset.PrimitiveSet, error) {
-	ks := h.Keyset()
-	if err := Validate(ks); err != nil {
+	if err := Validate(h.ks); err != nil {
 		return nil, fmt.Errorf("registry.PrimitivesWithKeyManager: invalid keyset: %s", err)
 	}
 	primitiveSet := primitiveset.New()
-	for _, key := range ks.Key {
+	for _, key := range h.ks.Key {
 		if key.Status != tinkpb.KeyStatusType_ENABLED {
 			continue
 		}
@@ -190,7 +187,7 @@
 		if err != nil {
 			return nil, fmt.Errorf("registry.PrimitivesWithKeyManager: cannot add primitive: %s", err)
 		}
-		if key.KeyId == ks.PrimaryKeyId {
+		if key.KeyId == h.ks.PrimaryKeyId {
 			primitiveSet.Primary = entry
 		}
 	}
@@ -205,9 +202,15 @@
 		if k == nil || k.KeyData == nil {
 			continue
 		}
-		if k.KeyData.KeyMaterialType == tinkpb.KeyData_ASYMMETRIC_PRIVATE || k.KeyData.KeyMaterialType == tinkpb.KeyData_SYMMETRIC {
+		if k.KeyData.KeyMaterialType == tinkpb.KeyData_UNKNOWN_KEYMATERIAL {
 			return true
 		}
+		if k.KeyData.KeyMaterialType == tinkpb.KeyData_ASYMMETRIC_PRIVATE {
+			return true
+		}
+    if k.KeyData.KeyMaterialType == tinkpb.KeyData_SYMMETRIC {
+    	return true
+    }
 	}
 	return false
 }
diff --git a/go/keyset/handle_test.go b/go/keyset/handle_test.go
index 9679b8c..7eb7359 100644
--- a/go/keyset/handle_test.go
+++ b/go/keyset/handle_test.go
@@ -34,13 +34,13 @@
 	if err != nil {
 		t.Errorf("unexpected error: %s", err)
 	}
-	keyset := kh.Keyset()
-	if len(keyset.Key) != 1 {
-		t.Errorf("incorrect number of keys in the keyset: %d", len(keyset.Key))
+	ks := testkeyset.KeysetMaterial(kh)
+	if len(ks.Key) != 1 {
+		t.Errorf("incorrect number of keys in the keyset: %d", len(ks.Key))
 	}
-	key := keyset.Key[0]
-	if keyset.PrimaryKeyId != key.KeyId {
-		t.Errorf("incorrect primary key id, expect %d, got %d", key.KeyId, keyset.PrimaryKeyId)
+	key := ks.Key[0]
+	if ks.PrimaryKeyId != key.KeyId {
+		t.Errorf("incorrect primary key id, expect %d, got %d", key.KeyId, ks.PrimaryKeyId)
 	}
 	if key.KeyData.TypeUrl != kt.TypeUrl {
 		t.Errorf("incorrect type url, expect %s, got %s", kt.TypeUrl, key.KeyData.TypeUrl)
@@ -83,7 +83,7 @@
 	if err != nil {
 		t.Fatalf("keyset.Read(): %v", err)
 	}
-	if !proto.Equal(h.Keyset(), h2.Keyset()) {
+	if !proto.Equal(testkeyset.KeysetMaterial(h), testkeyset.KeysetMaterial(h2)) {
 		t.Fatalf("Decrypt failed: got %v, want %v", h2, h)
 	}
 }
@@ -103,7 +103,7 @@
 	if err != nil {
 		t.Fatalf("keyset.ReadWithNoSecrets(): %v", err)
 	}
-	if !proto.Equal(h.Keyset(), h2.Keyset()) {
+	if !proto.Equal(testkeyset.KeysetMaterial(h), testkeyset.KeysetMaterial(h2)) {
 		t.Fatalf("Decrypt failed: got %v, want %v", h2, h)
 	}
 }
@@ -119,7 +119,39 @@
 		t.Error("handle.WriteWithNoSecrets() should fail when exporting secret key material")
 	}
 
-	if _, err := keyset.ReadWithNoSecrets(&keyset.MemReaderWriter{Keyset: h.Keyset()}); err == nil {
+	if _, err := keyset.ReadWithNoSecrets(&keyset.MemReaderWriter{Keyset: testkeyset.KeysetMaterial(h)}); err == nil {
+		t.Error("keyset.ReadWithNoSecrets should fail when importing secret key material")
+	}
+}
+
+func TestWithNoSecretsFunctionsFailWhenUnknownKeyMaterial(t *testing.T) {
+	// Create a keyset containing secret key material (symmetric)
+	keyData := testutil.NewKeyData("some type url", []byte{0}, tinkpb.KeyData_UNKNOWN_KEYMATERIAL)
+	key := testutil.NewKey(keyData, tinkpb.KeyStatusType_ENABLED, 1, tinkpb.OutputPrefixType_TINK)
+	ks := testutil.NewKeyset(1, []*tinkpb.Keyset_Key{key})
+	h, _ := testkeyset.NewHandle(ks)
+
+	if err := h.WriteWithNoSecrets(&keyset.MemReaderWriter{}); err == nil {
+		t.Error("handle.WriteWithNoSecrets() should fail when exporting secret key material")
+	}
+
+	if _, err := keyset.ReadWithNoSecrets(&keyset.MemReaderWriter{Keyset: testkeyset.KeysetMaterial(h)}); err == nil {
+		t.Error("keyset.ReadWithNoSecrets should fail when importing secret key material")
+	}
+}
+
+func TestWithNoSecretsFunctionsFailWithAsymmetricPrivateKeyMaterial(t *testing.T) {
+	// Create a keyset containing secret key material (symmetric)
+	keyData := testutil.NewKeyData("some type url", []byte{0}, tinkpb.KeyData_ASYMMETRIC_PRIVATE)
+	key := testutil.NewKey(keyData, tinkpb.KeyStatusType_ENABLED, 1, tinkpb.OutputPrefixType_TINK)
+	ks := testutil.NewKeyset(1, []*tinkpb.Keyset_Key{key})
+	h, _ := testkeyset.NewHandle(ks)
+
+	if err := h.WriteWithNoSecrets(&keyset.MemReaderWriter{}); err == nil {
+		t.Error("handle.WriteWithNoSecrets() should fail when exporting secret key material")
+	}
+
+	if _, err := keyset.ReadWithNoSecrets(&keyset.MemReaderWriter{Keyset: testkeyset.KeysetMaterial(h)}); err == nil {
 		t.Error("keyset.ReadWithNoSecrets should fail when importing secret key material")
 	}
 }
diff --git a/go/keyset/json_io.go b/go/keyset/json_io.go
new file mode 100644
index 0000000..c79e654
--- /dev/null
+++ b/go/keyset/json_io.go
@@ -0,0 +1,93 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package keyset
+
+import (
+	"io"
+
+	"github.com/golang/protobuf/jsonpb"
+
+	"github.com/golang/protobuf/proto"
+
+	tinkpb "github.com/google/tink/proto/tink_go_proto"
+)
+
+// JSONReader deserializes a keyset from json format.
+type JSONReader struct {
+	r io.Reader
+	j *jsonpb.Unmarshaler
+}
+
+// NewJSONReader returns new JSONReader that will read from r.
+func NewJSONReader(r io.Reader) *JSONReader {
+	return &JSONReader{
+		r: r,
+		j: &jsonpb.Unmarshaler{},
+	}
+}
+
+// Read parses a (cleartext) keyset from the underlying io.Reader.
+func (bkr *JSONReader) Read() (*tinkpb.Keyset, error) {
+	keyset := &tinkpb.Keyset{}
+
+	if err := bkr.readJSON(bkr.r, keyset); err != nil {
+		return nil, err
+	}
+	return keyset, nil
+}
+
+// ReadEncrypted parses an EncryptedKeyset from the underlying io.Reader.
+func (bkr *JSONReader) ReadEncrypted() (*tinkpb.EncryptedKeyset, error) {
+	keyset := &tinkpb.EncryptedKeyset{}
+
+	if err := bkr.readJSON(bkr.r, keyset); err != nil {
+		return nil, err
+	}
+	return keyset, nil
+}
+
+func (bkr *JSONReader) readJSON(r io.Reader, msg proto.Message) error {
+	return bkr.j.Unmarshal(r, msg)
+}
+
+// JSONWriter serializes a keyset into binary proto format.
+type JSONWriter struct {
+	w io.Writer
+	j *jsonpb.Marshaler
+}
+
+// NewJSONWriter returns a new JSONWriter that will write to w.
+func NewJSONWriter(w io.Writer) *JSONWriter {
+	return &JSONWriter{
+		w: w,
+		j: &jsonpb.Marshaler{
+			EmitDefaults: true,
+		},
+	}
+}
+
+// Write writes the keyset to the underlying io.Writer.
+func (bkw *JSONWriter) Write(keyset *tinkpb.Keyset) error {
+	return bkw.writeJSON(bkw.w, keyset)
+}
+
+// WriteEncrypted writes the encrypted keyset to the underlying io.Writer.
+func (bkw *JSONWriter) WriteEncrypted(keyset *tinkpb.EncryptedKeyset) error {
+	return bkw.writeJSON(bkw.w, keyset)
+}
+
+func (bkw *JSONWriter) writeJSON(w io.Writer, msg proto.Message) error {
+	return bkw.j.Marshal(w, msg)
+}
diff --git a/go/keyset/json_io_test.go b/go/keyset/json_io_test.go
new file mode 100644
index 0000000..97d2aef
--- /dev/null
+++ b/go/keyset/json_io_test.go
@@ -0,0 +1,75 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package keyset_test
+
+import (
+	"bytes"
+	"strings"
+	"testing"
+
+	"github.com/golang/protobuf/proto"
+	"github.com/google/tink/go/keyset"
+	"github.com/google/tink/go/testkeyset"
+	"github.com/google/tink/go/testutil"
+
+	tinkpb "github.com/google/tink/proto/tink_go_proto"
+)
+
+func TestJSONIOUnencrypted(t *testing.T) {
+	buf := new(bytes.Buffer)
+	w := keyset.NewJSONWriter(buf)
+	r := keyset.NewJSONReader(buf)
+
+	manager := testutil.NewHMACKeysetManager()
+	h, err := manager.Handle()
+	if h == nil || err != nil {
+		t.Fatalf("cannot get keyset handle: %v", err)
+	}
+
+	ks1 := testkeyset.KeysetMaterial(h)
+	if err := w.Write(ks1); err != nil {
+		t.Fatalf("cannot write keyset: %v", err)
+	}
+
+	ks2, err := r.Read()
+	if err != nil {
+		t.Fatalf("cannot read keyset: %v", err)
+	}
+
+	if !proto.Equal(ks1, ks2) {
+		t.Errorf("written keyset (%s) doesn't match read keyset (%s)", ks1, ks2)
+	}
+}
+
+func TestJSONIOEncrypted(t *testing.T) {
+	buf := new(bytes.Buffer)
+	w := keyset.NewJSONWriter(buf)
+	r := keyset.NewJSONReader(buf)
+
+	kse1 := &tinkpb.EncryptedKeyset{EncryptedKeyset: []byte(strings.Repeat("A", 32))}
+
+	if err := w.WriteEncrypted(kse1); err != nil {
+		t.Fatalf("cannot write encrypted keyset: %v", err)
+	}
+
+	kse2, err := r.ReadEncrypted()
+	if err != nil {
+		t.Fatalf("cannot read encryped keyset: %v", err)
+	}
+
+	if !proto.Equal(kse1, kse2) {
+		t.Errorf("written encryped keyset (%s) doesn't match read encryped keyset (%s)", kse1, kse2)
+	}
+}
diff --git a/go/keyset/keyset.go b/go/keyset/keyset.go
index a77cea8..3cf9912 100644
--- a/go/keyset/keyset.go
+++ b/go/keyset/keyset.go
@@ -12,7 +12,8 @@
 //
 ////////////////////////////////////////////////////////////////////////////////
 
-// Package keyset provides methods to generate, read, write or validate keysets.
+// Package keyset provides methods to generate, read, write or validate
+// keysets.
 package keyset
 
 import (
@@ -20,12 +21,21 @@
 	tinkpb "github.com/google/tink/proto/tink_go_proto"
 )
 
-// keysetHandle is used by package insecure and package testkeysethandle (via package internal)
-// to create KeysetHandle from cleartext key material.
+// keysetHandle is used by package insecurecleartextkeyset and package
+// testkeyset (via package internal) to create a keyset.Handle from cleartext
+// key material.
 func keysetHandle(ks *tinkpb.Keyset) *Handle {
 	return &Handle{ks}
 }
 
+// keysetMaterial is used by package insecurecleartextkeyset and package
+// testkeyset (via package internal) to read the key material in a
+// keyset.Handle.
+func keysetMaterial(h *Handle) *tinkpb.Keyset {
+	return h.ks
+}
+
 func init() {
 	internal.KeysetHandle = keysetHandle
+	internal.KeysetMaterial = keysetMaterial
 }
diff --git a/go/keyset/manager.go b/go/keyset/manager.go
index bca3902..bbe222a 100644
--- a/go/keyset/manager.go
+++ b/go/keyset/manager.go
@@ -17,7 +17,7 @@
 import (
 	"fmt"
 
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/subtle/random"
 	tinkpb "github.com/google/tink/proto/tink_go_proto"
 )
diff --git a/go/keyset/manager_test.go b/go/keyset/manager_test.go
index 2074b65..8b0ef8d 100644
--- a/go/keyset/manager_test.go
+++ b/go/keyset/manager_test.go
@@ -18,6 +18,8 @@
 	"testing"
 
 	"github.com/google/tink/go/keyset"
+	"github.com/google/tink/go/testkeyset"
+
 	"github.com/google/tink/go/mac"
 	"github.com/google/tink/go/testutil"
 	tinkpb "github.com/google/tink/proto/tink_go_proto"
@@ -35,7 +37,7 @@
 	if err != nil {
 		t.Errorf("cannot get keyset handle: %s", err)
 	}
-	ks := h.Keyset()
+	ks := testkeyset.KeysetMaterial(h)
 	if len(ks.Key) != 1 {
 		t.Errorf("expect the number of keys in the keyset is 1")
 	}
@@ -60,7 +62,7 @@
 	if err != nil {
 		t.Errorf("cannot get keyset handle: %s", err)
 	}
-	ks1 := h1.Keyset()
+	ks1 := testkeyset.KeysetMaterial(h1)
 
 	ksm2 := keyset.NewManagerFromHandle(h1)
 	ksm2.Rotate(kt)
@@ -68,7 +70,8 @@
 	if err != nil {
 		t.Errorf("cannot get keyset handle: %s", err)
 	}
-	ks2 := h2.Keyset()
+	ks2 := testkeyset.KeysetMaterial(h2)
+
 	if len(ks2.Key) != 2 {
 		t.Errorf("expect the number of keys to be 2, got %d", len(ks2.Key))
 	}
diff --git a/go/keyset/validation.go b/go/keyset/validation.go
index 4c5c8cf..df6e04e 100644
--- a/go/keyset/validation.go
+++ b/go/keyset/validation.go
@@ -41,18 +41,31 @@
 	}
 	primaryKeyID := keyset.PrimaryKeyId
 	hasPrimaryKey := false
+	containsOnlyPub := true
+	numEnabledKeys := 0
 	for _, key := range keyset.Key {
 		if err := validateKey(key); err != nil {
 			return err
 		}
-		if key.Status == tinkpb.KeyStatusType_ENABLED && key.KeyId == primaryKeyID {
+		if key.Status != tinkpb.KeyStatusType_ENABLED {
+			continue
+		}
+		if key.KeyId == primaryKeyID {
 			if hasPrimaryKey {
 				return fmt.Errorf("keyset contains multiple primary keys")
 			}
 			hasPrimaryKey = true
 		}
+		if key.KeyData.KeyMaterialType != tinkpb.KeyData_ASYMMETRIC_PUBLIC {
+			containsOnlyPub = false
+		}
+		numEnabledKeys++
 	}
-	if !hasPrimaryKey {
+	if numEnabledKeys == 0 {
+		return fmt.Errorf("keyset must contain at least one ENABLED key")
+	}
+
+	if !hasPrimaryKey && !containsOnlyPub {
 		return fmt.Errorf("keyset does not contain a valid primary key")
 	}
 	return nil
diff --git a/go/keyset/validation_test.go b/go/keyset/validation_test.go
index a347077..bfa4403 100644
--- a/go/keyset/validation_test.go
+++ b/go/keyset/validation_test.go
@@ -18,6 +18,7 @@
 	"testing"
 
 	"github.com/google/tink/go/keyset"
+	"github.com/google/tink/go/subtle/random"
 	"github.com/google/tink/go/testutil"
 	tinkpb "github.com/google/tink/proto/tink_go_proto"
 )
@@ -72,6 +73,29 @@
 			t.Errorf("expect an error when validate invalid key %d", i)
 		}
 	}
+	//no primary keys
+	keys = []*tinkpb.Keyset_Key{
+		testutil.NewDummyKey(1, tinkpb.KeyStatusType_DISABLED, tinkpb.OutputPrefixType_TINK),
+		testutil.NewDummyKey(1, tinkpb.KeyStatusType_DISABLED, tinkpb.OutputPrefixType_LEGACY),
+	}
+	if err = keyset.Validate(testutil.NewKeyset(1, keys)); err == nil {
+		t.Errorf("expect an error when there are no primary keys")
+	}
+	// public key only
+	keys = []*tinkpb.Keyset_Key{
+		testutil.NewKey(testutil.NewKeyData(testutil.EciesAeadHkdfPublicKeyTypeURL, random.GetRandomBytes(10), tinkpb.KeyData_ASYMMETRIC_PUBLIC), tinkpb.KeyStatusType_ENABLED, 1, tinkpb.OutputPrefixType_TINK),
+	}
+	if err = keyset.Validate(testutil.NewKeyset(1, keys)); err != nil {
+		t.Errorf("valid test failed when using public key only: %v", err)
+	}
+	// private key
+	keys = []*tinkpb.Keyset_Key{
+		testutil.NewKey(testutil.NewKeyData(testutil.EciesAeadHkdfPublicKeyTypeURL, random.GetRandomBytes(10), tinkpb.KeyData_ASYMMETRIC_PUBLIC), tinkpb.KeyStatusType_ENABLED, 1, tinkpb.OutputPrefixType_TINK),
+		testutil.NewKey(testutil.NewKeyData(testutil.EciesAeadHkdfPrivateKeyTypeURL, random.GetRandomBytes(10), tinkpb.KeyData_ASYMMETRIC_PRIVATE), tinkpb.KeyStatusType_ENABLED, 1, tinkpb.OutputPrefixType_TINK),
+	}
+	if err = keyset.Validate(testutil.NewKeyset(1, keys)); err == nil {
+		t.Errorf("expect an error when there are keydata other than public")
+	}
 }
 
 func generateInvalidKeys() []*tinkpb.Keyset_Key {
diff --git a/go/mac/BUILD.bazel b/go/mac/BUILD.bazel
index 9edc52c..be80e3e 100644
--- a/go/mac/BUILD.bazel
+++ b/go/mac/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
 
-licenses(["notice"])  # Apache 2.0 # keep
+licenses(["notice"])  # keep
 
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
@@ -15,10 +15,10 @@
     importpath = "github.com/google/tink/go/mac",
     visibility = ["//visibility:public"],
     deps = [
-        "//go/format:go_default_library",
+        "//go/core/cryptofmt:go_default_library",
+        "//go/core/primitiveset:go_default_library",
+        "//go/core/registry:go_default_library",
         "//go/keyset:go_default_library",
-        "//go/primitiveset:go_default_library",
-        "//go/registry:go_default_library",
         "//go/subtle/mac:go_default_library",
         "//go/subtle/random:go_default_library",
         "//go/tink:go_default_library",
@@ -39,8 +39,8 @@
     ],
     embed = [":go_default_library"],
     deps = [
-        "//go/format:go_default_library",
-        "//go/registry:go_default_library",
+        "//go/core/cryptofmt:go_default_library",
+        "//go/core/registry:go_default_library",
         "//go/subtle:go_default_library",
         "//go/subtle/mac:go_default_library",
         "//go/subtle/random:go_default_library",
diff --git a/go/mac/hmac_key_manager.go b/go/mac/hmac_key_manager.go
index aff45a1..b331845 100644
--- a/go/mac/hmac_key_manager.go
+++ b/go/mac/hmac_key_manager.go
@@ -20,7 +20,7 @@
 
 	"github.com/golang/protobuf/proto"
 	"github.com/google/tink/go/keyset"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/subtle/mac"
 	"github.com/google/tink/go/subtle/random"
 	commonpb "github.com/google/tink/proto/common_go_proto"
diff --git a/go/mac/hmac_key_manager_test.go b/go/mac/hmac_key_manager_test.go
index e2609d0..7bb7133 100644
--- a/go/mac/hmac_key_manager_test.go
+++ b/go/mac/hmac_key_manager_test.go
@@ -21,7 +21,7 @@
 	"testing"
 
 	"github.com/golang/protobuf/proto"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	subtleMac "github.com/google/tink/go/subtle/mac"
 	"github.com/google/tink/go/subtle/random"
 	"github.com/google/tink/go/subtle"
diff --git a/go/mac/mac.go b/go/mac/mac.go
index d6a5487..b75a827 100644
--- a/go/mac/mac.go
+++ b/go/mac/mac.go
@@ -13,12 +13,47 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 // Package mac provides implementations of the MAC primitive.
+//
+// MAC computes a tag for a given message that can be used to authenticate a
+// message.  MAC protects data integrity as well as provides for authenticity
+// of the message.
+//
+// Example:
+//
+//   package main
+//
+//   import (
+//       "fmt"
+//
+//       "github.com/google/tink/go/mac"
+//       "github.com/google/tink/go/keyset"
+//   )
+//
+//   func main() {
+//
+//       kh, err := keyset.NewHandle(mac.HMACSHA256Tag256KeyTemplate())
+//       if err != nil {
+//           // handle the error
+//       }
+//
+//       m := mac.New(kh)
+//
+//       mac , err := m.ComputeMac([]byte("this data needs to be MACed"))
+//       if err != nil {
+//           // handle error
+//       }
+//
+//       if m.VerifyMAC(mac, []byte("this data needs to be MACed")); err != nil {
+//           //handle error
+//       }
+//
+//   }
 package mac
 
 import (
 	"fmt"
 
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 )
 
 func init() {
diff --git a/go/mac/mac_factory.go b/go/mac/mac_factory.go
index f8b3377..768a3d2 100644
--- a/go/mac/mac_factory.go
+++ b/go/mac/mac_factory.go
@@ -17,10 +17,10 @@
 import (
 	"fmt"
 
-	"github.com/google/tink/go/format"
+	"github.com/google/tink/go/core/cryptofmt"
 	"github.com/google/tink/go/keyset"
-	"github.com/google/tink/go/primitiveset"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/primitiveset"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/tink"
 )
 
@@ -62,7 +62,7 @@
 	if err != nil {
 		return nil, err
 	}
-	var ret []byte
+	ret := make([]byte, 0, len(primary.Prefix) + len(mac))
 	ret = append(ret, primary.Prefix...)
 	ret = append(ret, mac...)
 	return ret, nil
@@ -75,7 +75,7 @@
 func (m *primitiveSet) VerifyMAC(mac, data []byte) error {
 	// This also rejects raw MAC with size of 4 bytes or fewer. Those MACs are
 	// clearly insecure, thus should be discouraged.
-	prefixSize := format.NonRawPrefixSize
+	prefixSize := cryptofmt.NonRawPrefixSize
 	if len(mac) <= prefixSize {
 		return errInvalidMAC
 	}
diff --git a/go/mac/mac_factory_test.go b/go/mac/mac_factory_test.go
index 243dc97..d56a92d 100644
--- a/go/mac/mac_factory_test.go
+++ b/go/mac/mac_factory_test.go
@@ -19,7 +19,7 @@
 	"strings"
 	"testing"
 
-	"github.com/google/tink/go/format"
+	"github.com/google/tink/go/core/cryptofmt"
 	"github.com/google/tink/go/mac"
 	"github.com/google/tink/go/testkeyset"
 	"github.com/google/tink/go/testutil"
@@ -44,9 +44,9 @@
 	if err != nil {
 		t.Errorf("mac.New failed: %s", err)
 	}
-	expectedPrefix, err := format.OutputPrefix(primaryKey)
+	expectedPrefix, err := cryptofmt.OutputPrefix(primaryKey)
 	if err != nil {
-		t.Errorf("format.OutputPrefix failed: %s", err)
+		t.Errorf("cryptofmt.OutputPrefix failed: %s", err)
 	}
 
 	if err := verifyMacPrimitive(p, p, expectedPrefix, tagSize); err != nil {
@@ -68,14 +68,14 @@
 	if err != nil {
 		t.Errorf("mac.New failed: %s", err)
 	}
-	if err := verifyMacPrimitive(p2, p, format.RawPrefix, tagSize); err != nil {
+	if err := verifyMacPrimitive(p2, p, cryptofmt.RawPrefix, tagSize); err != nil {
 		t.Errorf("invalid primitive: %s", err)
 	}
 
 	// mac with a random key not in the keyset, verify with the keyset should fail
 	keyset2 = testutil.NewTestHMACKeyset(tagSize, tinkpb.OutputPrefixType_TINK)
 	primaryKey = keyset2.Key[0]
-	expectedPrefix, _ = format.OutputPrefix(primaryKey)
+	expectedPrefix, _ = cryptofmt.OutputPrefix(primaryKey)
 	keysetHandle2, err = testkeyset.NewHandle(keyset2)
 	if err != nil {
 		t.Errorf("testkeyset.NewHandle failed: %s", err)
@@ -106,7 +106,7 @@
 	if err != nil {
 		t.Errorf("mac.New failed: %s", err)
 	}
-	if err := verifyMacPrimitive(p, p, format.RawPrefix, tagSize); err != nil {
+	if err := verifyMacPrimitive(p, p, cryptofmt.RawPrefix, tagSize); err != nil {
 		t.Errorf("invalid primitive: %s", err)
 	}
 }
diff --git a/go/mac/mac_key_templates.go b/go/mac/mac_key_templates.go
index f3e121d..1e8f652 100644
--- a/go/mac/mac_key_templates.go
+++ b/go/mac/mac_key_templates.go
@@ -39,6 +39,22 @@
 	return createHMACKeyTemplate(32, 32, commonpb.HashType_SHA256)
 }
 
+// HMACSHA512Tag256KeyTemplate is a KeyTemplate that generates a HMAC key with the following parameters:
+//   - Key size: 64 bytes
+//   - Tag size: 32 bytes
+//   - Hash function: SHA512
+func HMACSHA512Tag256KeyTemplate() *tinkpb.KeyTemplate {
+	return createHMACKeyTemplate(64, 32, commonpb.HashType_SHA512)
+}
+
+// HMACSHA512Tag512KeyTemplate is a KeyTemplate that generates a HMAC key with the following parameters:
+//   - Key size: 64 bytes
+//   - Tag size: 64 bytes
+//   - Hash function: SHA512
+func HMACSHA512Tag512KeyTemplate() *tinkpb.KeyTemplate {
+	return createHMACKeyTemplate(64, 64, commonpb.HashType_SHA512)
+}
+
 // createHMACKeyTemplate creates a new KeyTemplate for HMAC using the given parameters.
 func createHMACKeyTemplate(keySize uint32,
 	tagSize uint32,
diff --git a/go/mac/mac_key_templates_test.go b/go/mac/mac_key_templates_test.go
index 173ed46..af1f7c4 100644
--- a/go/mac/mac_key_templates_test.go
+++ b/go/mac/mac_key_templates_test.go
@@ -35,6 +35,14 @@
 	if err := checkTemplate(template, 32, 32, commonpb.HashType_SHA256); err != nil {
 		t.Errorf("incorrect HMACSHA256Tag256KeyTemplate: %s", err)
 	}
+	template = mac.HMACSHA512Tag256KeyTemplate()
+	if err := checkTemplate(template, 64, 32, commonpb.HashType_SHA512); err != nil {
+		t.Errorf("incorrect HMACSHA512Tag256KeyTemplate: %s", err)
+	}
+	template = mac.HMACSHA512Tag512KeyTemplate()
+	if err := checkTemplate(template, 64, 64, commonpb.HashType_SHA512); err != nil {
+		t.Errorf("incorrect HMACSHA512Tag512KeyTemplate: %s", err)
+	}
 }
 
 func checkTemplate(template *tinkpb.KeyTemplate,
diff --git a/go/mac/mac_test.go b/go/mac/mac_test.go
index 816e6ce..9b9d581 100644
--- a/go/mac/mac_test.go
+++ b/go/mac/mac_test.go
@@ -17,7 +17,7 @@
 import (
 	"testing"
 
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/testutil"
 )
 
diff --git a/go/primitiveset/BUILD.bazel b/go/primitiveset/BUILD.bazel
deleted file mode 100644
index e20df65..0000000
--- a/go/primitiveset/BUILD.bazel
+++ /dev/null
@@ -1,27 +0,0 @@
-package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
-
-licenses(["notice"])  # Apache 2.0 # keep
-
-load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
-
-go_library(
-    name = "go_default_library",
-    srcs = ["primitiveset.go"],
-    importpath = "github.com/google/tink/go/primitiveset",
-    visibility = ["//visibility:public"],
-    deps = [
-        "//go/format:go_default_library",
-        "//proto:tink_go_proto",
-    ],
-)
-
-go_test(
-    name = "go_default_test",
-    srcs = ["primitiveset_test.go"],
-    embed = [":go_default_library"],
-    deps = [
-        "//go/format:go_default_library",
-        "//go/testutil:go_default_library",
-        "//proto:tink_go_proto",
-    ],
-)
diff --git a/go/primitiveset/primitiveset.go b/go/primitiveset/primitiveset.go
deleted file mode 100644
index 2c78d17..0000000
--- a/go/primitiveset/primitiveset.go
+++ /dev/null
@@ -1,96 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-// Package primitiveset is a container for a set of primitives (i.e., implementations of cryptographic primitives offered by Tink).
-//
-// It provides also additional properties for the primitives it holds. In particular, one of the primitives in the set can be distinguished as "the primary" one.
-package primitiveset
-
-import (
-	"fmt"
-
-	"github.com/google/tink/go/format"
-	tinkpb "github.com/google/tink/proto/tink_go_proto"
-)
-
-// Entry represents a single entry in the keyset. In addition to the actual primitive,
-// it holds the identifier and status of the primitive.
-type Entry struct {
-	Primitive  interface{}
-	Prefix     string
-	PrefixType tinkpb.OutputPrefixType
-	Status     tinkpb.KeyStatusType
-}
-
-func newEntry(p interface{}, prefix string, prefixType tinkpb.OutputPrefixType, status tinkpb.KeyStatusType) *Entry {
-	return &Entry{
-		Primitive:  p,
-		Prefix:     prefix,
-		Status:     status,
-		PrefixType: prefixType,
-	}
-}
-
-// PrimitiveSet is used for supporting key rotation: primitives in a set correspond to keys in a
-// keyset. Users will usually work with primitive instances, which essentially wrap primitive
-// sets. For example an instance of an AEAD-primitive for a given keyset holds a set of
-// AEAD-primitives corresponding to the keys in the keyset, and uses the set members to do the
-// actual crypto operations: to encrypt data the primary AEAD-primitive from the set is used, and
-// upon decryption the ciphertext's prefix determines the id of the primitive from the set.
-
-// PrimitiveSet is a public to allow its use in implementations of custom primitives.
-type PrimitiveSet struct {
-	// Primary entry.
-	Primary *Entry
-
-	// The primitives are stored in a map of (ciphertext prefix, list of primitives sharing the
-	// prefix). This allows quickly retrieving the primitives sharing some particular prefix.
-	Entries map[string][]*Entry
-}
-
-// New returns an empty instance of PrimitiveSet.
-func New() *PrimitiveSet {
-	return &PrimitiveSet{
-		Primary: nil,
-		Entries: make(map[string][]*Entry),
-	}
-}
-
-// RawEntries returns all primitives in the set that have RAW prefix.
-func (ps *PrimitiveSet) RawEntries() ([]*Entry, error) {
-	return ps.EntriesForPrefix(format.RawPrefix)
-}
-
-// EntriesForPrefix returns all primitives in the set that have the given prefix.
-func (ps *PrimitiveSet) EntriesForPrefix(prefix string) ([]*Entry, error) {
-	result, found := ps.Entries[prefix]
-	if !found {
-		return []*Entry{}, nil
-	}
-	return result, nil
-}
-
-// Add creates a new entry in the primitive set and returns the added entry.
-func (ps *PrimitiveSet) Add(p interface{}, key *tinkpb.Keyset_Key) (*Entry, error) {
-	if key == nil || p == nil {
-		return nil, fmt.Errorf("primitive_set: key and primitive must not be nil")
-	}
-	prefix, err := format.OutputPrefix(key)
-	if err != nil {
-		return nil, fmt.Errorf("primitive_set: %s", err)
-	}
-	e := newEntry(p, prefix, key.OutputPrefixType, key.Status)
-	ps.Entries[prefix] = append(ps.Entries[prefix], e)
-	return e, nil
-}
diff --git a/go/primitiveset/primitiveset_test.go b/go/primitiveset/primitiveset_test.go
deleted file mode 100644
index ed0448f..0000000
--- a/go/primitiveset/primitiveset_test.go
+++ /dev/null
@@ -1,163 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package primitiveset_test
-
-import (
-	"fmt"
-	"reflect"
-	"testing"
-
-	"github.com/google/tink/go/format"
-	"github.com/google/tink/go/primitiveset"
-	"github.com/google/tink/go/testutil"
-	tinkpb "github.com/google/tink/proto/tink_go_proto"
-)
-
-func createKeyset() []*tinkpb.Keyset_Key {
-	var keyID0 = 1234543
-	var keyID1 = 7213743
-	var keyID2 = keyID1
-	var keyID3 = 947327
-	var keyID4 = 529472
-	var keyID5 = keyID0
-	return []*tinkpb.Keyset_Key{
-		testutil.NewDummyKey(keyID0, tinkpb.KeyStatusType_ENABLED, tinkpb.OutputPrefixType_TINK),
-		testutil.NewDummyKey(keyID1, tinkpb.KeyStatusType_ENABLED, tinkpb.OutputPrefixType_LEGACY),
-		testutil.NewDummyKey(keyID2, tinkpb.KeyStatusType_ENABLED, tinkpb.OutputPrefixType_TINK),
-		testutil.NewDummyKey(keyID3, tinkpb.KeyStatusType_ENABLED, tinkpb.OutputPrefixType_RAW),
-		testutil.NewDummyKey(keyID4, tinkpb.KeyStatusType_DISABLED, tinkpb.OutputPrefixType_RAW),
-		testutil.NewDummyKey(keyID5, tinkpb.KeyStatusType_DISABLED, tinkpb.OutputPrefixType_TINK),
-	}
-}
-
-func TestPrimitiveSetBasic(t *testing.T) {
-	var err error
-	ps := primitiveset.New()
-	if ps.Primary != nil || ps.Entries == nil {
-		t.Errorf("expect primary to be nil and primitives is initialized")
-	}
-	// generate test keys
-	keys := createKeyset()
-	// add all test primitives
-	macs := make([]testutil.DummyMAC, len(keys))
-	entries := make([]*primitiveset.Entry, len(macs))
-	for i := 0; i < len(macs); i++ {
-		macs[i] = testutil.DummyMAC{Name: fmt.Sprintf("Mac#%d", i)}
-		entries[i], err = ps.Add(macs[i], keys[i])
-		if err != nil {
-			t.Errorf("unexpected error when adding mac%d: %s", i, err)
-		}
-	}
-	// set primary entry
-	primaryID := 2
-	ps.Primary = entries[primaryID]
-
-	// check raw primitive
-	rawMacs := []testutil.DummyMAC{macs[3], macs[4]}
-	rawStatuses := []tinkpb.KeyStatusType{keys[3].Status, keys[4].Status}
-	rawPrefixTypes := []tinkpb.OutputPrefixType{keys[3].OutputPrefixType, keys[4].OutputPrefixType}
-	rawEntries, err := ps.RawEntries()
-	if err != nil {
-		t.Errorf("unexpected error when getting raw primitives: %s", err)
-	}
-	if !validateEntryList(rawEntries, rawMacs, rawStatuses, rawPrefixTypes) {
-		t.Errorf("raw primitives do not match input")
-	}
-	// check tink primitives, same id
-	tinkMacs := []testutil.DummyMAC{macs[0], macs[5]}
-	tinkStatuses := []tinkpb.KeyStatusType{keys[0].Status, keys[5].Status}
-	tinkPrefixTypes := []tinkpb.OutputPrefixType{keys[0].OutputPrefixType, keys[5].OutputPrefixType}
-	prefix, _ := format.OutputPrefix(keys[0])
-	tinkEntries, err := ps.EntriesForPrefix(prefix)
-	if err != nil {
-		t.Errorf("unexpected error when getting primitives: %s", err)
-	}
-	if !validateEntryList(tinkEntries, tinkMacs, tinkStatuses, tinkPrefixTypes) {
-		t.Errorf("tink primitives do not match the input key")
-	}
-	// check another tink primitive
-	tinkMacs = []testutil.DummyMAC{macs[2]}
-	tinkStatuses = []tinkpb.KeyStatusType{keys[2].Status}
-	tinkPrefixTypes = []tinkpb.OutputPrefixType{keys[2].OutputPrefixType}
-	prefix, _ = format.OutputPrefix(keys[2])
-	tinkEntries, err = ps.EntriesForPrefix(prefix)
-	if err != nil {
-		t.Errorf("unexpected error when getting tink primitives: %s", err)
-	}
-	if !validateEntryList(tinkEntries, tinkMacs, tinkStatuses, tinkPrefixTypes) {
-		t.Errorf("tink primitives do not match the input key")
-	}
-	//check legacy primitives
-	legacyMacs := []testutil.DummyMAC{macs[1]}
-	legacyStatuses := []tinkpb.KeyStatusType{keys[1].Status}
-	legacyPrefixTypes := []tinkpb.OutputPrefixType{keys[1].OutputPrefixType}
-	legacyPrefix, _ := format.OutputPrefix(keys[1])
-	legacyEntries, err := ps.EntriesForPrefix(legacyPrefix)
-	if err != nil {
-		t.Errorf("unexpected error when getting legacy primitives: %s", err)
-	}
-	if !validateEntryList(legacyEntries, legacyMacs, legacyStatuses, legacyPrefixTypes) {
-		t.Errorf("legacy primitives do not match the input key")
-	}
-}
-
-func TestAddWithInvalidInput(t *testing.T) {
-	ps := primitiveset.New()
-	// nil input
-	key := testutil.NewDummyKey(0, tinkpb.KeyStatusType_ENABLED, tinkpb.OutputPrefixType_TINK)
-	if _, err := ps.Add(nil, key); err == nil {
-		t.Errorf("expect an error when primitive input is nil")
-	}
-	if _, err := ps.Add(*new(testutil.DummyMAC), nil); err == nil {
-		t.Errorf("expect an error when key input is nil")
-	}
-	// unknown prefix type
-	invalidKey := testutil.NewDummyKey(0, tinkpb.KeyStatusType_ENABLED, tinkpb.OutputPrefixType_UNKNOWN_PREFIX)
-	if _, err := ps.Add(*new(testutil.DummyMAC), invalidKey); err == nil {
-		t.Errorf("expect an error when key is invalid")
-	}
-}
-
-func validateEntryList(entries []*primitiveset.Entry,
-	macs []testutil.DummyMAC,
-	statuses []tinkpb.KeyStatusType,
-	prefixTypes []tinkpb.OutputPrefixType) bool {
-	if len(entries) != len(macs) {
-		return false
-	}
-	for i := 0; i < len(entries); i++ {
-		if !validateEntry(entries[i], macs[i], statuses[i], prefixTypes[i]) {
-			return false
-		}
-	}
-	return true
-}
-
-// Compares an entry with the testutil.DummyMAC that was used to create the entry
-func validateEntry(entry *primitiveset.Entry,
-	testMac testutil.DummyMAC,
-	status tinkpb.KeyStatusType,
-	outputPrefixType tinkpb.OutputPrefixType) bool {
-	if entry.Status != status || entry.PrefixType != outputPrefixType {
-		return false
-	}
-	var dummyMac = entry.Primitive.(testutil.DummyMAC)
-	data := []byte{1, 2, 3, 4, 5}
-	digest, err := dummyMac.ComputeMAC(data)
-	if err != nil || !reflect.DeepEqual(append(data, testMac.Name...), digest) {
-		return false
-	}
-	return true
-}
diff --git a/go/registry/BUILD.bazel b/go/registry/BUILD.bazel
deleted file mode 100644
index 8241efc..0000000
--- a/go/registry/BUILD.bazel
+++ /dev/null
@@ -1,39 +0,0 @@
-package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
-
-licenses(["notice"])  # Apache 2.0 # keep
-
-load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
-
-go_library(
-    name = "go_default_library",
-    srcs = [
-        "key_manager.go",
-        "kms_client.go",
-        "private_key_manager.go",
-        "registry.go",
-    ],
-    importpath = "github.com/google/tink/go/registry",
-    deps = [
-        "//go/tink:go_default_library",
-        "//proto:tink_go_proto",
-        "@com_github_golang_protobuf//proto:go_default_library",
-    ],
-)
-
-go_test(
-    name = "tink_test",
-    size = "small",
-    srcs = ["registry_test.go"],
-    deps = [
-        "//go/aead:go_default_library",
-        "//go/mac:go_default_library",
-        "//go/registry:go_default_library",
-        "//go/subtle/mac:go_default_library",
-        "//go/testutil:go_default_library",
-        "//proto:aes_gcm_go_proto",
-        "//proto:common_go_proto",
-        "//proto:hmac_go_proto",
-        "//proto:tink_go_proto",
-        "@com_github_golang_protobuf//proto:go_default_library",
-    ],
-)
diff --git a/go/registry/kms_client.go b/go/registry/kms_client.go
deleted file mode 100644
index 446c7d5..0000000
--- a/go/registry/kms_client.go
+++ /dev/null
@@ -1,33 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package registry
-
-import "github.com/google/tink/go/tink"
-
-// KMSClient knows how to produce primitives backed by keys stored in remote KMS services.
-type KMSClient interface {
-	// Supported true if this client does support keyURI
-	Supported(keyURI string) bool
-
-	// LoadCredentials loads the credentials in credentialPath. If credentialPath is null, loads the
-	// default credentials.
-	LoadCredentials(credentialPath string) (interface{}, error)
-
-	// LoadDefaultCredentials loads with the default credentials.
-	LoadDefaultCredentials() (interface{}, error)
-
-	// GetAEAD  gets an AEAD backend by keyURI.
-	GetAEAD(keyURI string) (tink.AEAD, error)
-}
diff --git a/go/registry/registry.go b/go/registry/registry.go
deleted file mode 100644
index f5f7306..0000000
--- a/go/registry/registry.go
+++ /dev/null
@@ -1,130 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-// Package registry is a container that for each supported key type holds a corresponding KeyManager
-// object, which can generate new keys or instantiate the primitive corresponding to given key.
-//
-// Registry is initialized at startup, and is later used to instantiate primitives for given keys
-// or keysets. Keeping KeyManagers for all primitives in a single Registry (rather than having a
-// separate KeyManager per primitive) enables modular construction of compound primitives from
-// "simple" ones, e.g., AES-CTR-HMAC AEAD encryption uses IND-CPA encryption and a MAC.
-//
-// Note that regular users will usually not work directly with Registry, but rather
-// via primitive factories, which in the background query the Registry for specific
-// KeyManagers. Registry is public though, to enable configurations with custom
-// primitives and KeyManagers.
-package registry
-
-import (
-	"fmt"
-	"sync"
-
-	"github.com/golang/protobuf/proto"
-	tinkpb "github.com/google/tink/proto/tink_go_proto"
-)
-
-var (
-	keyManagersMu sync.RWMutex
-	keyManagers   = make(map[string]KeyManager) // typeURL -> KeyManager
-	kmsClientsMu  sync.RWMutex
-	kmsClients    = []KMSClient{}
-)
-
-// RegisterKeyManager registers the given key manager.
-// Does not allow to overwrite existing key managers.
-func RegisterKeyManager(km KeyManager) error {
-	keyManagersMu.Lock()
-	defer keyManagersMu.Unlock()
-	typeURL := km.TypeURL()
-	if _, existed := keyManagers[typeURL]; existed {
-		return fmt.Errorf("registry.RegisterKeyManager: type %s already registered", typeURL)
-	}
-	keyManagers[typeURL] = km
-	return nil
-}
-
-// GetKeyManager returns the key manager for the given typeURL if existed.
-func GetKeyManager(typeURL string) (KeyManager, error) {
-	keyManagersMu.RLock()
-	defer keyManagersMu.RUnlock()
-	km, existed := keyManagers[typeURL]
-	if !existed {
-		return nil, fmt.Errorf("registry.GetKeyManager: unsupported key type: %s", typeURL)
-	}
-	return km, nil
-}
-
-// NewKeyData generates a new KeyData for the given key template.
-func NewKeyData(kt *tinkpb.KeyTemplate) (*tinkpb.KeyData, error) {
-	if kt == nil {
-		return nil, fmt.Errorf("registry.NewKeyData: invalid key template")
-	}
-	km, err := GetKeyManager(kt.TypeUrl)
-	if err != nil {
-		return nil, err
-	}
-	return km.NewKeyData(kt.Value)
-}
-
-// NewKey generates a new key for the given key template.
-func NewKey(kt *tinkpb.KeyTemplate) (proto.Message, error) {
-	if kt == nil {
-		return nil, fmt.Errorf("registry.NewKey: invalid key template")
-	}
-	km, err := GetKeyManager(kt.TypeUrl)
-	if err != nil {
-		return nil, err
-	}
-	return km.NewKey(kt.Value)
-}
-
-// PrimitiveFromKeyData creates a new primitive for the key given in the given KeyData.
-func PrimitiveFromKeyData(kd *tinkpb.KeyData) (interface{}, error) {
-	if kd == nil {
-		return nil, fmt.Errorf("registry.PrimitiveFromKeyData: invalid key data")
-	}
-	return Primitive(kd.TypeUrl, kd.Value)
-}
-
-// Primitive creates a new primitive for the given serialized key using the KeyManager
-// identified by the given typeURL.
-func Primitive(typeURL string, sk []byte) (interface{}, error) {
-	if len(sk) == 0 {
-		return nil, fmt.Errorf("registry.Primitive: invalid serialized key")
-	}
-	km, err := GetKeyManager(typeURL)
-	if err != nil {
-		return nil, err
-	}
-	return km.Primitive(sk)
-}
-
-// RegisterKMSClient is used to register a new KMS client
-func RegisterKMSClient(k KMSClient) {
-	kmsClientsMu.Lock()
-	defer kmsClientsMu.Unlock()
-	kmsClients = append(kmsClients, k)
-}
-
-// GetKMSClient fetches a KMSClient by a given URI.
-func GetKMSClient(keyURI string) (KMSClient, error) {
-	kmsClientsMu.RLock()
-	defer kmsClientsMu.RUnlock()
-	for _, k := range kmsClients {
-		if k.Supported(keyURI) {
-			return k, nil
-		}
-	}
-	return nil, fmt.Errorf("KMS client supporting %s not found", keyURI)
-}
diff --git a/go/registry/registry_test.go b/go/registry/registry_test.go
deleted file mode 100644
index 88e835e..0000000
--- a/go/registry/registry_test.go
+++ /dev/null
@@ -1,181 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package registry_test
-
-import (
-	"testing"
-
-	"github.com/golang/protobuf/proto"
-	"github.com/google/tink/go/aead"
-	"github.com/google/tink/go/mac"
-	"github.com/google/tink/go/registry"
-	subtleMac "github.com/google/tink/go/subtle/mac"
-	"github.com/google/tink/go/testutil"
-	gcmpb "github.com/google/tink/proto/aes_gcm_go_proto"
-	commonpb "github.com/google/tink/proto/common_go_proto"
-	hmacpb "github.com/google/tink/proto/hmac_go_proto"
-	tinkpb "github.com/google/tink/proto/tink_go_proto"
-)
-
-func TestRegisterKeyManager(t *testing.T) {
-	// get HMACKeyManager
-	_, err := registry.GetKeyManager(testutil.HMACTypeURL)
-	if err != nil {
-		t.Errorf("unexpected error: %s", err)
-	}
-	// get AESGCMKeyManager
-	_, err = registry.GetKeyManager(testutil.AESGCMTypeURL)
-	if err != nil {
-		t.Errorf("unexpected error: %s", err)
-	}
-	// some random typeurl
-	if _, err = registry.GetKeyManager("some url"); err == nil {
-		t.Errorf("expect an error when a type url doesn't exist in the registry")
-	}
-}
-
-func TestRegisterKeyManagerWithCollision(t *testing.T) {
-	// dummyKeyManager's typeURL is equal to that of AESGCM
-	var dummyKeyManager = new(testutil.DummyAEADKeyManager)
-	// This should fail because overwriting is disallowed.
-	err := registry.RegisterKeyManager(dummyKeyManager)
-	if err == nil {
-		t.Errorf("%s shouldn't be registered again", testutil.AESGCMTypeURL)
-	}
-
-	km, err := registry.GetKeyManager(testutil.AESGCMTypeURL)
-	if err != nil {
-		t.Errorf("unexpected error: %s", err)
-	}
-	// This should fail because overwriting is disallowed, even with the same key manager.
-	err = registry.RegisterKeyManager(km)
-	if err == nil {
-		t.Errorf("%s shouldn't be registered again", testutil.AESGCMTypeURL)
-	}
-}
-
-func TestNewKeyData(t *testing.T) {
-	// new Keydata from a Hmac KeyTemplate
-	keyData, err := registry.NewKeyData(mac.HMACSHA256Tag128KeyTemplate())
-	if err != nil {
-		t.Errorf("unexpected error: %s", err)
-	}
-	if keyData.TypeUrl != testutil.HMACTypeURL {
-		t.Errorf("invalid key data")
-	}
-	key := new(hmacpb.HmacKey)
-	if err := proto.Unmarshal(keyData.Value, key); err != nil {
-		t.Errorf("unexpected error when unmarshal HmacKey: %s", err)
-	}
-	// nil
-	if _, err := registry.NewKeyData(nil); err == nil {
-		t.Errorf("expect an error when key template is nil")
-	}
-	// unregistered type url
-	template := &tinkpb.KeyTemplate{TypeUrl: "some url", Value: []byte{0}}
-	if _, err := registry.NewKeyData(template); err == nil {
-		t.Errorf("expect an error when key template contains unregistered typeURL")
-	}
-}
-
-func TestNewKey(t *testing.T) {
-	// aead template
-	aesGcmTemplate := aead.AES128GCMKeyTemplate()
-	key, err := registry.NewKey(aesGcmTemplate)
-	if err != nil {
-		t.Errorf("unexpected error: %s", err)
-	}
-	var aesGcmKey = key.(*gcmpb.AesGcmKey)
-	aesGcmFormat := new(gcmpb.AesGcmKeyFormat)
-	if err := proto.Unmarshal(aesGcmTemplate.Value, aesGcmFormat); err != nil {
-		t.Errorf("unexpected error: %s", err)
-	}
-	if aesGcmFormat.KeySize != uint32(len(aesGcmKey.KeyValue)) {
-		t.Errorf("key doesn't match template")
-	}
-	//nil
-	if _, err := registry.NewKey(nil); err == nil {
-		t.Errorf("expect an error when key template is nil")
-	}
-	// unregistered type url
-	template := &tinkpb.KeyTemplate{TypeUrl: "some url", Value: []byte{0}}
-	if _, err := registry.NewKey(template); err == nil {
-		t.Errorf("expect an error when key template is not registered")
-	}
-}
-
-func TestPrimitiveFromKeyData(t *testing.T) {
-	// hmac keydata
-	keyData := testutil.NewHMACKeyData(commonpb.HashType_SHA256, 16)
-	p, err := registry.PrimitiveFromKeyData(keyData)
-	if err != nil {
-		t.Errorf("unexpected error: %s", err)
-	}
-	var _ *subtleMac.HMAC = p.(*subtleMac.HMAC)
-	// unregistered url
-	keyData.TypeUrl = "some url"
-	if _, err := registry.PrimitiveFromKeyData(keyData); err == nil {
-		t.Errorf("expect an error when typeURL has not been registered")
-	}
-	// unmatched url
-	keyData.TypeUrl = testutil.AESGCMTypeURL
-	if _, err := registry.PrimitiveFromKeyData(keyData); err == nil {
-		t.Errorf("expect an error when typeURL doesn't match key")
-	}
-	// nil
-	if _, err := registry.PrimitiveFromKeyData(nil); err == nil {
-		t.Errorf("expect an error when key data is nil")
-	}
-}
-
-func TestPrimitive(t *testing.T) {
-	// hmac key
-	key := testutil.NewHMACKey(commonpb.HashType_SHA256, 16)
-	serializedKey, _ := proto.Marshal(key)
-	p, err := registry.Primitive(testutil.HMACTypeURL, serializedKey)
-	if err != nil {
-		t.Errorf("unexpected error: %s", err)
-	}
-	var _ *subtleMac.HMAC = p.(*subtleMac.HMAC)
-	// unregistered url
-	if _, err := registry.Primitive("some url", serializedKey); err == nil {
-		t.Errorf("expect an error when typeURL has not been registered")
-	}
-	// unmatched url
-	if _, err := registry.Primitive(testutil.AESGCMTypeURL, serializedKey); err == nil {
-		t.Errorf("expect an error when typeURL doesn't match key")
-	}
-	// void key
-	if _, err := registry.Primitive(testutil.AESGCMTypeURL, nil); err == nil {
-		t.Errorf("expect an error when key is nil")
-	}
-	if _, err := registry.Primitive(testutil.AESGCMTypeURL, []byte{}); err == nil {
-		t.Errorf("expect an error when key is nil")
-	}
-	if _, err := registry.Primitive(testutil.AESGCMTypeURL, []byte{0}); err == nil {
-		t.Errorf("expect an error when key is nil")
-	}
-}
-
-func TestRegisterKmsClient(t *testing.T) {
-	kms := &testutil.DummyKMSClient{}
-	registry.RegisterKMSClient(kms)
-
-	_, err := registry.GetKMSClient("dummy")
-	if err != nil {
-		t.Errorf("error fetching dummy kms client: %s", err)
-	}
-
-}
diff --git a/go/signature/BUILD.bazel b/go/signature/BUILD.bazel
index a26c81f..eb6e16f 100644
--- a/go/signature/BUILD.bazel
+++ b/go/signature/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
 
-licenses(["notice"])  # Apache 2.0 # keep
+licenses(["notice"])  # keep
 
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
@@ -20,10 +20,10 @@
     importpath = "github.com/google/tink/go/signature",
     visibility = ["//visibility:public"],
     deps = [
-        "//go/format:go_default_library",
+        "//go/core/cryptofmt:go_default_library",
+        "//go/core/primitiveset:go_default_library",
+        "//go/core/registry:go_default_library",
         "//go/keyset:go_default_library",
-        "//go/primitiveset:go_default_library",
-        "//go/registry:go_default_library",
         "//go/subtle:go_default_library",
         "//go/subtle/signature:go_default_library",
         "//go/tink:go_default_library",
@@ -49,8 +49,8 @@
     ],
     embed = [":go_default_library"],
     deps = [
-        "//go/format:go_default_library",
-        "//go/registry:go_default_library",
+        "//go/core/cryptofmt:go_default_library",
+        "//go/core/registry:go_default_library",
         "//go/subtle/random:go_default_library",
         "//go/subtle/signature:go_default_library",
         "//go/testkeyset:go_default_library",
diff --git a/go/signature/ecdsa_signer_key_manager.go b/go/signature/ecdsa_signer_key_manager.go
index 5d351fe..aae2f4c 100644
--- a/go/signature/ecdsa_signer_key_manager.go
+++ b/go/signature/ecdsa_signer_key_manager.go
@@ -22,7 +22,7 @@
 
 	"github.com/golang/protobuf/proto"
 	"github.com/google/tink/go/keyset"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	subtleSignature "github.com/google/tink/go/subtle/signature"
 	"github.com/google/tink/go/subtle"
 	commonpb "github.com/google/tink/proto/common_go_proto"
diff --git a/go/signature/ecdsa_signer_key_manager_test.go b/go/signature/ecdsa_signer_key_manager_test.go
index d8bcbbc..1ccbb60 100644
--- a/go/signature/ecdsa_signer_key_manager_test.go
+++ b/go/signature/ecdsa_signer_key_manager_test.go
@@ -20,7 +20,7 @@
 	"testing"
 
 	"github.com/golang/protobuf/proto"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/subtle/random"
 	"github.com/google/tink/go/subtle/signature"
 	"github.com/google/tink/go/testutil"
diff --git a/go/signature/ecdsa_verifier_key_manager.go b/go/signature/ecdsa_verifier_key_manager.go
index 6e3c506..ce63232 100644
--- a/go/signature/ecdsa_verifier_key_manager.go
+++ b/go/signature/ecdsa_verifier_key_manager.go
@@ -19,7 +19,7 @@
 
 	"github.com/golang/protobuf/proto"
 	"github.com/google/tink/go/keyset"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	subtleSignature "github.com/google/tink/go/subtle/signature"
 	ecdsapb "github.com/google/tink/proto/ecdsa_go_proto"
 	tinkpb "github.com/google/tink/proto/tink_go_proto"
diff --git a/go/signature/ecdsa_verifier_key_manager_test.go b/go/signature/ecdsa_verifier_key_manager_test.go
index a9fe73e..fb7cd08 100644
--- a/go/signature/ecdsa_verifier_key_manager_test.go
+++ b/go/signature/ecdsa_verifier_key_manager_test.go
@@ -18,7 +18,7 @@
 	"testing"
 
 	"github.com/golang/protobuf/proto"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/subtle/signature"
 	"github.com/google/tink/go/testutil"
 	commonpb "github.com/google/tink/proto/common_go_proto"
diff --git a/go/signature/ed25519_signer_key_manager.go b/go/signature/ed25519_signer_key_manager.go
index 5c4a9a2..bd4cc03 100644
--- a/go/signature/ed25519_signer_key_manager.go
+++ b/go/signature/ed25519_signer_key_manager.go
@@ -23,7 +23,7 @@
 
 	"github.com/golang/protobuf/proto"
 	"github.com/google/tink/go/keyset"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	subtleSignature "github.com/google/tink/go/subtle/signature"
 	ed25519pb "github.com/google/tink/proto/ed25519_go_proto"
 	tinkpb "github.com/google/tink/proto/tink_go_proto"
diff --git a/go/signature/ed25519_signer_key_manager_test.go b/go/signature/ed25519_signer_key_manager_test.go
index 3b96dfb..89fff3e 100644
--- a/go/signature/ed25519_signer_key_manager_test.go
+++ b/go/signature/ed25519_signer_key_manager_test.go
@@ -19,7 +19,7 @@
 	"testing"
 
 	"github.com/golang/protobuf/proto"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/subtle/random"
 	"github.com/google/tink/go/subtle/signature"
 	"github.com/google/tink/go/testutil"
diff --git a/go/signature/ed25519_verifier_key_manager.go b/go/signature/ed25519_verifier_key_manager.go
index 3a324ef..363820b 100644
--- a/go/signature/ed25519_verifier_key_manager.go
+++ b/go/signature/ed25519_verifier_key_manager.go
@@ -20,7 +20,7 @@
 	"github.com/golang/protobuf/proto"
 	"golang.org/x/crypto/ed25519"
 	"github.com/google/tink/go/keyset"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	subtleSignature "github.com/google/tink/go/subtle/signature"
 	ed25519pb "github.com/google/tink/proto/ed25519_go_proto"
 	tinkpb "github.com/google/tink/proto/tink_go_proto"
diff --git a/go/signature/ed25519_verifier_key_manager_test.go b/go/signature/ed25519_verifier_key_manager_test.go
index d2620c1..4bfff9d 100644
--- a/go/signature/ed25519_verifier_key_manager_test.go
+++ b/go/signature/ed25519_verifier_key_manager_test.go
@@ -18,7 +18,7 @@
 	"testing"
 
 	"github.com/golang/protobuf/proto"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/subtle/signature"
 	"github.com/google/tink/go/testutil"
 )
diff --git a/go/signature/signature.go b/go/signature/signature.go
index 47059ac..20ad794 100644
--- a/go/signature/signature.go
+++ b/go/signature/signature.go
@@ -12,13 +12,48 @@
 //
 ////////////////////////////////////////////////////////////////////////////////
 
-// Package signature provides implementations of the Signer and Verifier primitives.
+// Package signature provides implementations of the Signer and Verifier
+// primitives.
+//
+// To sign data using Tink you can use ECDSA or ED25519 key templates.
+//
+// Example:
+//
+//   package main
+//
+//   import (
+//       "fmt"
+//
+//       "github.com/google/tink/go/signature"
+//       "github.com/google/tink/go/keyset"
+//   )
+//
+//   func main() {
+//
+//       kh, err := keyset.NewHandle(signature.ECDSAP256KeyTemplate()) // other key templates can also be used
+//       if err != nil {
+//           // handle the error
+//       }
+//
+//       s := signature.NewSigner(kh)
+//
+//       a , err := s.Sign([]byte("this data needs to be signed"))
+//       if err != nil {
+//           // handle error
+//       }
+//
+//       v := signature.NewVerifier(kh)
+//
+//       if err := v.Verify(a, []byte("this data needs to be signed")); err != nil {
+//           // handle error
+//       }
+//   }
 package signature
 
 import (
 	"fmt"
 
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 )
 
 func init() {
diff --git a/go/signature/signature_test.go b/go/signature/signature_test.go
index ddf1d60..cc8cdbc 100644
--- a/go/signature/signature_test.go
+++ b/go/signature/signature_test.go
@@ -17,7 +17,7 @@
 import (
 	"testing"
 
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/testutil"
 )
 
diff --git a/go/signature/signer_factory.go b/go/signature/signer_factory.go
index 5d4cb53..ef1c366 100644
--- a/go/signature/signer_factory.go
+++ b/go/signature/signer_factory.go
@@ -17,10 +17,10 @@
 import (
 	"fmt"
 
-	"github.com/google/tink/go/format"
+	"github.com/google/tink/go/core/cryptofmt"
 	"github.com/google/tink/go/keyset"
-	"github.com/google/tink/go/primitiveset"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/primitiveset"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/tink"
 	tinkpb "github.com/google/tink/proto/tink_go_proto"
 )
@@ -61,7 +61,7 @@
 	var signedData []byte
 	if primary.PrefixType == tinkpb.OutputPrefixType_LEGACY {
 		signedData = append(signedData, data...)
-		signedData = append(signedData, format.LegacyStartByte)
+		signedData = append(signedData, cryptofmt.LegacyStartByte)
 	} else {
 		signedData = data
 	}
@@ -69,7 +69,7 @@
 	if err != nil {
 		return nil, err
 	}
-	var ret []byte
+	ret := make([]byte, 0, len(primary.Prefix) + len(signature))
 	ret = append(ret, primary.Prefix...)
 	ret = append(ret, signature...)
 	return ret, nil
diff --git a/go/signature/verifier_factory.go b/go/signature/verifier_factory.go
index 8375479..004f963 100644
--- a/go/signature/verifier_factory.go
+++ b/go/signature/verifier_factory.go
@@ -18,10 +18,10 @@
 	"errors"
 	"fmt"
 
-	"github.com/google/tink/go/format"
+	"github.com/google/tink/go/core/cryptofmt"
 	"github.com/google/tink/go/keyset"
-	"github.com/google/tink/go/primitiveset"
-	"github.com/google/tink/go/registry"
+	"github.com/google/tink/go/core/primitiveset"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/tink"
 	tinkpb "github.com/google/tink/proto/tink_go_proto"
 )
@@ -60,7 +60,7 @@
 
 // Verify checks whether the given signature is a valid signature of the given data.
 func (v *verifierSet) Verify(signature, data []byte) error {
-	prefixSize := format.NonRawPrefixSize
+	prefixSize := cryptofmt.NonRawPrefixSize
 	if len(signature) < prefixSize {
 		return errInvalidSignature
 	}
@@ -72,8 +72,7 @@
 		for i := 0; i < len(entries); i++ {
 			var signedData []byte
 			if entries[i].PrefixType == tinkpb.OutputPrefixType_LEGACY {
-				signedData = append(signedData, data...)
-				signedData = append(signedData, format.LegacyStartByte)
+				signedData = append(data, cryptofmt.LegacyStartByte)
 			} else {
 				signedData = data
 			}
diff --git a/go/subtle/BUILD.bazel b/go/subtle/BUILD.bazel
index 1043084..8a5a2fa 100644
--- a/go/subtle/BUILD.bazel
+++ b/go/subtle/BUILD.bazel
@@ -1,10 +1,11 @@
+package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
+
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
 go_library(
     name = "go_default_library",
     srcs = ["subtle.go"],
     importpath = "github.com/google/tink/go/subtle",
-    visibility = ["//visibility:public"],
 )
 
 go_test(
diff --git a/go/subtle/aead/BUILD.bazel b/go/subtle/aead/BUILD.bazel
index 37ad08f..3900788 100644
--- a/go/subtle/aead/BUILD.bazel
+++ b/go/subtle/aead/BUILD.bazel
@@ -1,18 +1,19 @@
+package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
+
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
 go_library(
     name = "go_default_library",
     srcs = [
         "aead.go",
-        "aes_gcm.go",
         "aes_ctr.go",
+        "aes_gcm.go",
+        "chacha20poly1305.go",
         "encrypt_then_authenticate.go",
         "ind_cpa.go",
-        "chacha20poly1305.go",
         "xchacha20poly1305.go",
     ],
     importpath = "github.com/google/tink/go/subtle/aead",
-    visibility = ["//visibility:public"],
     deps = [
         "//go/subtle/random:go_default_library",
         "//go/tink:go_default_library",
@@ -24,16 +25,16 @@
     name = "go_default_test",
     srcs = [
         "aead_test.go",
-        "aes_gcm_test.go",
         "aes_ctr_test.go",
-        "encrypt_then_authenticate_test.go",
+        "aes_gcm_test.go",
         "chacha20poly1305_test.go",
         "chacha20poly1305_vectors_test.go",
+        "encrypt_then_authenticate_test.go",
         "xchacha20poly1305_test.go",
         "xchacha20poly1305_vectors_test.go",
     ],
     data = [
-        "@wycheproof//testvectors:all",  # keep
+        "//third_party/wycheproof:testvectors",
     ],
     deps = [
         ":go_default_library",
diff --git a/go/subtle/aead/aes_ctr_test.go b/go/subtle/aead/aes_ctr_test.go
index cd4624a..ecfce7d 100644
--- a/go/subtle/aead/aes_ctr_test.go
+++ b/go/subtle/aead/aes_ctr_test.go
@@ -117,7 +117,7 @@
 		t.Errorf("failed to decrypt ciphertext, error: %v", err)
 	}
 
-	if bytes.Compare(plaintext, message) != 0 {
+	if !bytes.Equal(plaintext, message) {
 		t.Errorf("plaintext doesn't match message")
 	}
 }
@@ -139,7 +139,7 @@
 	if err != nil {
 		t.Errorf("encryption failed, error: %v", err)
 	}
-	if bytes.Compare(ct1, ct2) == 0 {
+	if bytes.Equal(ct1, ct2) {
 		t.Error("the two ciphertexts cannot be equal")
 	}
 	// Encrypt 100 times and verify that the result is 100 different ciphertexts.
@@ -183,7 +183,7 @@
 		t.Errorf("decryption failed, error: %v", err)
 	}
 
-	if bytes.Compare(message, plaintext) != 0 {
+	if !bytes.Equal(message, plaintext) {
 		t.Errorf("decryption result mismatch, got: %v, want: %v", plaintext, message)
 	}
 }
@@ -211,7 +211,7 @@
 			t.Errorf("decryption failed at iteration %d, error: %v", i, err)
 		}
 
-		if bytes.Compare(plaintext, message) != 0 {
+		if !bytes.Equal(plaintext, message) {
 			t.Errorf("plaintext doesn't match message, i = %d", i)
 		}
 	}
@@ -240,7 +240,7 @@
 			t.Errorf("decryption failed at iteration %d, error: %v", i, err)
 		}
 
-		if bytes.Compare(plaintext, message) != 0 {
+		if !bytes.Equal(plaintext, message) {
 			t.Errorf("plaintext doesn't match message, i = %d", i)
 		}
 	}
diff --git a/go/subtle/aead/aes_gcm.go b/go/subtle/aead/aes_gcm.go
index 18b43dc..19d7cf6 100644
--- a/go/subtle/aead/aes_gcm.go
+++ b/go/subtle/aead/aes_gcm.go
@@ -67,7 +67,7 @@
 	}
 	iv := a.newIV()
 	ct := cipher.Seal(nil, iv, pt, aad)
-	var ret []byte
+	ret := make([]byte, 0, len(iv) + len(ct))
 	ret = append(ret, iv...)
 	ret = append(ret, ct...)
 	return ret, nil
diff --git a/go/subtle/aead/aes_gcm_test.go b/go/subtle/aead/aes_gcm_test.go
index bc66033..05e4d93 100644
--- a/go/subtle/aead/aes_gcm_test.go
+++ b/go/subtle/aead/aes_gcm_test.go
@@ -184,7 +184,7 @@
 }
 
 func TestVectors(t *testing.T) {
-	f, err := os.Open("../../../../wycheproof/testvectors/aes_gcm_test.json")
+	f, err := os.Open("../../../third_party/wycheproof/testvectors/aes_gcm_test.json")
 	if err != nil {
 		t.Fatalf("cannot open file: %s, make sure that github.com/google/wycheproof is in your gopath", err)
 	}
diff --git a/go/subtle/aead/chacha20poly1305.go b/go/subtle/aead/chacha20poly1305.go
index 7ea0f18..fc0e534 100644
--- a/go/subtle/aead/chacha20poly1305.go
+++ b/go/subtle/aead/chacha20poly1305.go
@@ -52,7 +52,7 @@
 
 	n := ca.newNonce()
 	ct := c.Seal(nil, n, pt, aad)
-	var ret []byte
+	ret := make([]byte, 0, len(n) + len(ct))
 	ret = append(ret, n...)
 	ret = append(ret, ct...)
 	return ret, nil
diff --git a/go/subtle/aead/chacha20poly1305_test.go b/go/subtle/aead/chacha20poly1305_test.go
index 096c60a..d8242f5 100644
--- a/go/subtle/aead/chacha20poly1305_test.go
+++ b/go/subtle/aead/chacha20poly1305_test.go
@@ -197,7 +197,7 @@
 }
 
 func TestChaCha20Poly1305WycheproofVectors(t *testing.T) {
-	f, err := os.Open("../../../../wycheproof/testvectors/chacha20_poly1305_test.json")
+	f, err := os.Open("../../../third_party/wycheproof/testvectors/chacha20_poly1305_test.json")
 	if err != nil {
 		t.Fatalf("cannot open file: %s, make sure that github.com/google/wycheproof is in your gopath", err)
 	}
diff --git a/go/subtle/aead/encrypt_then_authenticate_test.go b/go/subtle/aead/encrypt_then_authenticate_test.go
index da4e7ac..2375830 100644
--- a/go/subtle/aead/encrypt_then_authenticate_test.go
+++ b/go/subtle/aead/encrypt_then_authenticate_test.go
@@ -168,7 +168,7 @@
 		t.Fatalf("decryption failed, error: %v", err)
 	}
 
-	if bytes.Compare(plaintext, message) != 0 {
+	if !bytes.Equal(plaintext, message) {
 		t.Errorf("invalid plaintext, got: %q, want: %q", plaintext, message)
 	}
 }
@@ -202,7 +202,7 @@
 			t.Fatalf("decryption failed, error: %v", err)
 		}
 
-		if bytes.Compare(plaintext, message) != 0 {
+		if !bytes.Equal(plaintext, message) {
 			t.Errorf("invalid plaintext, got: %q, want: %q", plaintext, message)
 		}
 	}
@@ -232,7 +232,7 @@
 		t.Fatalf("encryption failed, error: %v", err)
 	}
 
-	if bytes.Compare(ciphertext1, ciphertext2) == 0 {
+	if bytes.Equal(ciphertext1, ciphertext2) {
 		t.Error("ciphertexts must not be the same")
 	}
 }
@@ -273,7 +273,7 @@
 		// Save the byte to be modified.
 		b := modct[i/8]
 		modct[i/8] ^= (1 << uint(i%8))
-		if bytes.Compare(ciphertext, modct) == 0 {
+		if bytes.Equal(ciphertext, modct) {
 			t.Errorf("modified ciphertext shouldn't be the same as aad")
 		}
 		if _, err := cipher.Decrypt(modct, aad); err == nil {
@@ -290,7 +290,7 @@
 		// Save the byte to be modified.
 		b := modaad[i/8]
 		modaad[i/8] ^= (1 << uint(i%8))
-		if bytes.Compare(aad, modaad) == 0 {
+		if bytes.Equal(aad, modaad) {
 			t.Errorf("modified aad shouldn't be the same as aad")
 		}
 		if _, err := cipher.Decrypt(ciphertext, modaad); err == nil {
diff --git a/go/subtle/daead/BUILD.bazel b/go/subtle/daead/BUILD.bazel
index 6f690e4..14ffa1f 100644
--- a/go/subtle/daead/BUILD.bazel
+++ b/go/subtle/daead/BUILD.bazel
@@ -1,3 +1,5 @@
+package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
+
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
 go_library(
@@ -6,7 +8,6 @@
         "aes_siv.go",
     ],
     importpath = "github.com/google/tink/go/subtle/daead",
-    visibility = ["//visibility:public"],
     deps = [
         "//go/tink:go_default_library",
     ],
@@ -18,7 +19,7 @@
         "aes_siv_test.go",
     ],
     data = [
-        "@wycheproof//testvectors:all",  # keep
+        "//third_party/wycheproof:testvectors",
     ],
     deps = [
         ":go_default_library",
diff --git a/go/subtle/daead/aes_siv.go b/go/subtle/daead/aes_siv.go
index b2fc913..263dbc7 100644
--- a/go/subtle/daead/aes_siv.go
+++ b/go/subtle/daead/aes_siv.go
@@ -12,7 +12,8 @@
 //
 ////////////////////////////////////////////////////////////////////////////////
 
-// Package daead provides subtle implementations of the DeterministicAEAD primitive.
+// Package daead provides subtle implementations of the DeterministicAEAD
+// primitive.
 package daead
 
 import (
@@ -26,15 +27,17 @@
 )
 
 // AESSIV is an implemenatation of AES-SIV-CMAC as defined in
-// https://tools.ietf.org/html/rfc5297 .
-// AESSIV implements a deterministic encryption with additional
-// data (i.e. the DeterministicAEAD interface). Hence the implementation
-// below is restricted to one AD component.
+// https://tools.ietf.org/html/rfc5297.
 //
-// Security:
-// =========
+// AESSIV implements a deterministic encryption with additional data (i.e. the
+// DeterministicAEAD interface). Hence the implementation below is restricted
+// to one AD component.
+//
+// Security Note:
+//
 // Chatterjee, Menezes and Sarkar analyze AES-SIV in Section 5.1 of
 // https://www.math.uwaterloo.ca/~ajmeneze/publications/tightness.pdf
+//
 // Their analysis shows that AES-SIV is susceptible to an attack in
 // a multi-user setting. Concretely, if an attacker knows the encryption
 // of a message m encrypted and authenticated with k different keys,
@@ -90,7 +93,8 @@
 }
 
 // multiplyByX multiplies an element in GF(2^128) by its generator.
-// This functions is incorrectly named "doubling" in section 2.3 of RFC 5297.
+//
+// This function is incorrectly named "doubling" in section 2.3 of RFC 5297.
 func multiplyByX(block []byte) {
 	carry := block[0] >> 7
 	for i := 0; i < aes.BlockSize-1; i++ {
@@ -104,8 +108,8 @@
 	}
 }
 
-// EncryptDeterministically deterministically encrypts plaintext with additionalData as
-// additional authenticated data.
+// EncryptDeterministically deterministically encrypts plaintext with
+// additionalData as additional authenticated data.
 func (asc *AESSIV) EncryptDeterministically(pt, aad []byte) ([]byte, error) {
 	siv := make([]byte, aes.BlockSize)
 	asc.s2v(pt, aad, siv)
@@ -119,8 +123,8 @@
 	return ct, nil
 }
 
-// DecryptDeterministically deterministically decrypts ciphertext with additionalData as
-// additional authenticated data.
+// DecryptDeterministically deterministically decrypts ciphertext with
+// additionalData as additional authenticated data.
 func (asc *AESSIV) DecryptDeterministically(ct, aad []byte) ([]byte, error) {
 	if len(ct) < aes.BlockSize {
 		return nil, errors.New("aes_siv: ciphertext is too short")
@@ -143,7 +147,8 @@
 	return pt, nil
 }
 
-// ctrCrypt encrypts (or decrypts) the bytes in in using an SIV and writes the result to out.
+// ctrCrypt encrypts (or decrypts) the bytes in in using an SIV and writes the
+// result to out.
 func (asc *AESSIV) ctrCrypt(siv, in, out []byte) error {
 	// siv might be used outside of ctrCrypt(), so making a copy of it.
 	iv := make([]byte, aes.BlockSize)
@@ -161,7 +166,8 @@
 	return nil
 }
 
-// s2v is a Pseudo-Random Function (PRF) construction: https://tools.ietf.org/html/rfc5297.
+// s2v is a Pseudo-Random Function (PRF) construction:
+// https://tools.ietf.org/html/rfc5297.
 func (asc *AESSIV) s2v(msg, aad, siv []byte) {
 	block := make([]byte, aes.BlockSize)
 	asc.cmac(block, block)
@@ -183,7 +189,9 @@
 	}
 }
 
-// cmacLong computes CMAC(XorEnd(data, last)), where XorEnd xors the bytes in last to the last bytes in data.
+// cmacLong computes CMAC(XorEnd(data, last)), where XorEnd xors the bytes in
+// last to the last bytes in data.
+//
 // The size of the data must be at least 16 bytes.
 func (asc *AESSIV) cmacLong(data, last, mac []byte) {
 	block := make([]byte, aes.BlockSize)
diff --git a/go/subtle/daead/aes_siv_test.go b/go/subtle/daead/aes_siv_test.go
index 9cc98c0..0991398 100644
--- a/go/subtle/daead/aes_siv_test.go
+++ b/go/subtle/daead/aes_siv_test.go
@@ -250,7 +250,7 @@
 }
 
 func TestAESSIV_WycheproofVectors(t *testing.T) {
-	f, err := os.Open("../../../../wycheproof/testvectors/aes_siv_cmac_test.json")
+	f, err := os.Open("../../../third_party/wycheproof/testvectors/aes_siv_cmac_test.json")
 	if err != nil {
 		t.Fatalf("Cannot open file: %s, make sure that github.com/google/wycheproof is in your gopath.", err)
 	}
diff --git a/go/subtle/hybrid/BUILD.bazel b/go/subtle/hybrid/BUILD.bazel
index 0bc34ea..9a20f57 100644
--- a/go/subtle/hybrid/BUILD.bazel
+++ b/go/subtle/hybrid/BUILD.bazel
@@ -1,3 +1,5 @@
+package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
+
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
 go_library(
@@ -9,10 +11,9 @@
         "ecies_hkdf_recipient_kem.go",
         "ecies_hkdf_sender_kem.go",
         "elliptic_curves.go",
-        "hkdf.go"
-        ],
+        "hkdf.go",
+    ],
     importpath = "github.com/google/tink/go/subtle/hybrid",
-    visibility = ["//visibility:public"],
     deps = [
         "//go/subtle:go_default_library",
         "//go/tink:go_default_library",
@@ -23,16 +24,13 @@
 go_test(
     name = "go_default_test",
     srcs = [
-            "elliptic_curves_test.go",
-            "hkdf_test.go"
-            ],
-    data = ["@wycheproof//testvectors:all",],
-    embed = [":go_default_library",],
+        "elliptic_curves_test.go",
+        "hkdf_test.go",
+    ],
+    data = ["//third_party/wycheproof:testvectors"],
+    embed = [":go_default_library"],
     deps = [
         "//go/subtle/random:go_default_library",
         "@org_golang_x_crypto//hkdf:go_default_library",
     ],
 )
-
-
-
diff --git a/go/subtle/hybrid/ecies_aead_hkdf_dem_helper.go b/go/subtle/hybrid/ecies_aead_hkdf_dem_helper.go
index 0d3f370..cb228ef 100644
--- a/go/subtle/hybrid/ecies_aead_hkdf_dem_helper.go
+++ b/go/subtle/hybrid/ecies_aead_hkdf_dem_helper.go
@@ -16,8 +16,12 @@
 
 import "github.com/google/tink/go/tink"
 
-// EciesAeadHkdfDemHelper a helper for DEM (data encapsulation mechanism) of ECIES-AEAD-HKDF.
-type EciesAeadHkdfDemHelper interface {
-	getSymmetricKeySize() uint32
-	getAead(symmetricKeyValue []byte) (tink.AEAD, error)
+// EciesAEADHKDFDEMHelper a helper for DEM (data encapsulation mechanism) of ECIES-AEAD-HKDF.
+type EciesAEADHKDFDEMHelper interface {
+
+	// GetSymmetricKeySize gives the size of the DEM-key in bytes
+	GetSymmetricKeySize() uint32
+
+	// GetAEAD returns the newly created AEAD primitive.
+	GetAEAD(symmetricKeyValue []byte) (tink.AEAD, error)
 }
diff --git a/go/subtle/hybrid/ecies_aead_hkdf_hybrid_decrypt.go b/go/subtle/hybrid/ecies_aead_hkdf_hybrid_decrypt.go
index 50ccdb6..2f9d10e 100644
--- a/go/subtle/hybrid/ecies_aead_hkdf_hybrid_decrypt.go
+++ b/go/subtle/hybrid/ecies_aead_hkdf_hybrid_decrypt.go
@@ -20,22 +20,22 @@
 	"github.com/google/tink/go/tink"
 )
 
-// EciesAeadHkdfHybridDecrypt is an instance of ECIES decryption with HKDF-KEM (key encapsulation mechanism)
+// ECIESAEADHKDFHybridDecrypt is an instance of ECIES decryption with HKDF-KEM (key encapsulation mechanism)
 // and AEAD-DEM (data encapsulation mechanism).
-type EciesAeadHkdfHybridDecrypt struct {
+type ECIESAEADHKDFHybridDecrypt struct {
 	privateKey   *ECPrivateKey
 	hkdfSalt     []byte
 	hkdfHMACAlgo string
 	pointFormat  string
-	demHelper    EciesAeadHkdfDemHelper
+	demHelper    EciesAEADHKDFDEMHelper
 }
 
-var _ tink.HybridDecrypt = (*EciesAeadHkdfHybridDecrypt)(nil)
+var _ tink.HybridDecrypt = (*ECIESAEADHKDFHybridDecrypt)(nil)
 
-// NewEciesAeadHkdfHybridDecrypt returns ECIES decryption construct with HKDF-KEM (key encapsulation mechanism)
+// NewECIESAEADHKDFHybridDecrypt returns ECIES decryption construct with HKDF-KEM (key encapsulation mechanism)
 // and AEAD-DEM (data encapsulation mechanism).
-func NewEciesAeadHkdfHybridDecrypt(pvt *ECPrivateKey, hkdfSalt []byte, hkdfHMACAlgo string, ptFormat string, demHelper EciesAeadHkdfDemHelper) (*EciesAeadHkdfHybridDecrypt, error) {
-	return &EciesAeadHkdfHybridDecrypt{
+func NewECIESAEADHKDFHybridDecrypt(pvt *ECPrivateKey, hkdfSalt []byte, hkdfHMACAlgo string, ptFormat string, demHelper EciesAEADHKDFDEMHelper) (*ECIESAEADHKDFHybridDecrypt, error) {
+	return &ECIESAEADHKDFHybridDecrypt{
 		privateKey:   pvt,
 		hkdfSalt:     hkdfSalt,
 		hkdfHMACAlgo: hkdfHMACAlgo,
@@ -45,9 +45,8 @@
 }
 
 // Decrypt is used to decrypt using ECIES with a HKDF-KEM and AEAD-DEM mechanisms.
-func (e *EciesAeadHkdfHybridDecrypt) Decrypt(ciphertext, contextInfo []byte) ([]byte, error) {
+func (e *ECIESAEADHKDFHybridDecrypt) Decrypt(ciphertext, contextInfo []byte) ([]byte, error) {
 	curve := e.privateKey.PublicKey.Curve
-
 	headerSize, err := encodingSizeInBytes(curve, e.pointFormat)
 	if err != nil {
 		return nil, err
@@ -55,17 +54,20 @@
 	if len(ciphertext) < headerSize {
 		return nil, errors.New("ciphertext too short")
 	}
-	kemBytes := ciphertext[:headerSize]
+	var kemBytes = make([]byte, headerSize)
+	var ct = make([]byte, len(ciphertext)-headerSize)
+	copy(kemBytes, ciphertext[:headerSize])
+	copy(ct, ciphertext[headerSize:])
 	rKem := &ECIESHKDFRecipientKem{
 		recipientPrivateKey: e.privateKey,
 	}
-	symmetricKey, err := rKem.decapsulate(kemBytes, e.hkdfHMACAlgo, e.hkdfSalt, contextInfo, e.demHelper.getSymmetricKeySize(), e.pointFormat)
+	symmetricKey, err := rKem.decapsulate(kemBytes, e.hkdfHMACAlgo, e.hkdfSalt, contextInfo, e.demHelper.GetSymmetricKeySize(), e.pointFormat)
 	if err != nil {
 		return nil, err
 	}
-	aead, err := e.demHelper.getAead(symmetricKey)
+	aead, err := e.demHelper.GetAEAD(symmetricKey)
 	if err != nil {
 		return nil, err
 	}
-	return aead.Decrypt(ciphertext[headerSize:], []byte{})
+	return aead.Decrypt(ct, []byte{})
 }
diff --git a/go/subtle/hybrid/ecies_aead_hkdf_hybrid_encrypt.go b/go/subtle/hybrid/ecies_aead_hkdf_hybrid_encrypt.go
index 8964344..0432aba 100644
--- a/go/subtle/hybrid/ecies_aead_hkdf_hybrid_encrypt.go
+++ b/go/subtle/hybrid/ecies_aead_hkdf_hybrid_encrypt.go
@@ -20,26 +20,26 @@
 	"github.com/google/tink/go/tink"
 )
 
-// EciesAeadHkdfHybridEncrypt is an instance of ECIES encryption with HKDF-KEM (key encapsulation mechanism)
+// ECIESAEADHKDFHybridEncrypt is an instance of ECIES encryption with HKDF-KEM (key encapsulation mechanism)
 // and AEAD-DEM (data encapsulation mechanism).
-type EciesAeadHkdfHybridEncrypt struct {
+type ECIESAEADHKDFHybridEncrypt struct {
 	publicKey    *ECPublicKey
 	hkdfSalt     []byte
 	hkdfHMACAlgo string
 	pointFormat  string
-	demHelper    EciesAeadHkdfDemHelper
+	demHelper    EciesAEADHKDFDEMHelper
 }
 
-var _ tink.HybridEncrypt = (*EciesAeadHkdfHybridEncrypt)(nil)
+var _ tink.HybridEncrypt = (*ECIESAEADHKDFHybridEncrypt)(nil)
 
-// NewEciesAeadHkdfHybridEncrypt returns ECIES encryption construct with HKDF-KEM (key encapsulation mechanism)
+// NewECIESAEADHKDFHybridEncrypt returns ECIES encryption construct with HKDF-KEM (key encapsulation mechanism)
 // and AEAD-DEM (data encapsulation mechanism).
-func NewEciesAeadHkdfHybridEncrypt(pub *ECPublicKey, hkdfSalt []byte, hkdfHMACAlgo string, ptFormat string, demHelper EciesAeadHkdfDemHelper) (*EciesAeadHkdfHybridEncrypt, error) {
-	c, err := getCurve(pub.Curve.Params().Name)
+func NewECIESAEADHKDFHybridEncrypt(pub *ECPublicKey, hkdfSalt []byte, hkdfHMACAlgo string, ptFormat string, demHelper EciesAEADHKDFDEMHelper) (*ECIESAEADHKDFHybridEncrypt, error) {
+	c, err := GetCurve(pub.Curve.Params().Name)
 	if err != nil {
 		return nil, err
 	}
-	return &EciesAeadHkdfHybridEncrypt{
+	return &ECIESAEADHKDFHybridEncrypt{
 		publicKey: &ECPublicKey{
 			Curve: c,
 			Point: pub.Point,
@@ -52,16 +52,16 @@
 }
 
 // Encrypt is used to encrypt using ECIES with a HKDF-KEM and AEAD-DEM mechanisms.
-func (e *EciesAeadHkdfHybridEncrypt) Encrypt(plaintext, contextInfo []byte) ([]byte, error) {
+func (e *ECIESAEADHKDFHybridEncrypt) Encrypt(plaintext, contextInfo []byte) ([]byte, error) {
 	var b bytes.Buffer
 	sKem := &ECIESHKDFSenderKem{
 		recipientPublicKey: e.publicKey,
 	}
-	kemKey, err := sKem.encapsulate(e.hkdfHMACAlgo, e.hkdfSalt, contextInfo, e.demHelper.getSymmetricKeySize(), e.pointFormat)
+	kemKey, err := sKem.encapsulate(e.hkdfHMACAlgo, e.hkdfSalt, contextInfo, e.demHelper.GetSymmetricKeySize(), e.pointFormat)
 	if err != nil {
 		return nil, err
 	}
-	aead, err := e.demHelper.getAead(kemKey.SymmetricKey)
+	aead, err := e.demHelper.GetAEAD(kemKey.SymmetricKey)
 	if err != nil {
 		return nil, err
 	}
diff --git a/go/subtle/hybrid/ecies_hkdf_recipient_kem.go b/go/subtle/hybrid/ecies_hkdf_recipient_kem.go
index 93f3ea3..64ebf92 100644
--- a/go/subtle/hybrid/ecies_hkdf_recipient_kem.go
+++ b/go/subtle/hybrid/ecies_hkdf_recipient_kem.go
@@ -22,12 +22,11 @@
 
 // decapsulate uses the KEM to generate a new HKDF-based key.
 func (s *ECIESHKDFRecipientKem) decapsulate(kem []byte, hashAlg string, salt []byte, info []byte, keySize uint32, pointFormat string) ([]byte, error) {
-	ephemeralPvt, err := GenerateECDHKeyPair(s.recipientPrivateKey.PublicKey.Curve)
+	pubPoint, err := pointDecode(s.recipientPrivateKey.PublicKey.Curve, pointFormat, kem)
 	if err != nil {
 		return nil, err
 	}
-
-	secret, err := ComputeSharedSecret(&ephemeralPvt.PublicKey.Point, s.recipientPrivateKey)
+	secret, err := ComputeSharedSecret(pubPoint, s.recipientPrivateKey)
 	if err != nil {
 		return nil, err
 	}
diff --git a/go/subtle/hybrid/ecies_hkdf_sender_kem.go b/go/subtle/hybrid/ecies_hkdf_sender_kem.go
index 8422e97..32fad46 100644
--- a/go/subtle/hybrid/ecies_hkdf_sender_kem.go
+++ b/go/subtle/hybrid/ecies_hkdf_sender_kem.go
@@ -42,7 +42,9 @@
 	if err != nil {
 		return nil, err
 	}
-	sKey, err := computeHKDF(hashAlg, secret, salt, info, keySize)
+	i := append(sdata, secret...)
+
+	sKey, err := computeHKDF(hashAlg, i, salt, info, keySize)
 	if err != nil {
 		return nil, err
 	}
diff --git a/go/subtle/hybrid/elliptic_curves.go b/go/subtle/hybrid/elliptic_curves.go
index 9ee065d..dad4149 100644
--- a/go/subtle/hybrid/elliptic_curves.go
+++ b/go/subtle/hybrid/elliptic_curves.go
@@ -237,10 +237,14 @@
 	if err := validatePublicPoint(&ECPoint{X: x, Y: y}, priv); err != nil {
 		return nil, errors.New("invalid shared key")
 	}
-	return x.Bytes(), nil
+
+	sharedSecret := make([]byte, maxSharedKeyLength(priv.PublicKey))
+	xBytes := x.Bytes()
+	copy(sharedSecret[len(sharedSecret)-len(xBytes):], xBytes)
+	return sharedSecret, nil
 }
 
-func maxSharedKeyLength(pub *ECPublicKey) int {
+func maxSharedKeyLength(pub ECPublicKey) int {
 	return (pub.Curve.Params().BitSize + 7) / 8
 }
 
@@ -263,16 +267,16 @@
 
 }
 
-// getCurve returns the elliptic.Curve for a given standard curve name.
-func getCurve(c string) (elliptic.Curve, error) {
+// GetCurve returns the elliptic.Curve for a given standard curve name.
+func GetCurve(c string) (elliptic.Curve, error) {
 	switch c {
 	case "secp224r1", "NIST_P224", "P-224":
 		return elliptic.P224(), nil
-	case "secp256r1", "NIST_P256", "P-256":
+	case "secp256r1", "NIST_P256", "P-256", "EllipticCurveType_NIST_P256":
 		return elliptic.P256(), nil
-	case "secp384r1", "NIST_P384", "P-384":
+	case "secp384r1", "NIST_P384", "P-384", "EllipticCurveType_NIST_P384":
 		return elliptic.P384(), nil
-	case "secp521r1", "NIST_521", "P-521":
+	case "secp521r1", "NIST_P521", "P-521", "EllipticCurveType_NIST_P521":
 		return elliptic.P521(), nil
 	default:
 		return nil, errors.New("unsupported curve")
diff --git a/go/subtle/hybrid/elliptic_curves_test.go b/go/subtle/hybrid/elliptic_curves_test.go
index 5aee983..b62e65c 100644
--- a/go/subtle/hybrid/elliptic_curves_test.go
+++ b/go/subtle/hybrid/elliptic_curves_test.go
@@ -70,8 +70,8 @@
 // Test cases same as the java tests from
 // //third_party/tink/java/src/test/java/com/google/crypto/tink/subtle/EllipticCurvesTest.java
 var (
-	testVectors = []string{"../../../../wycheproof/testvectors/ecdh_test.json",
-		"../../../../wycheproof/testvectors/ecdh_test.json",
+	testVectors = []string{"../../../third_party/wycheproof/testvectors/ecdh_test.json",
+		"../../../third_party/wycheproof/testvectors/ecdh_test.json",
 	}
 	tEC1 = []testEC1{
 		{
@@ -562,7 +562,7 @@
 		}
 
 		for _, g := range data.TestGroups {
-			curve, err := getCurve(g.Curve)
+			curve, err := GetCurve(g.Curve)
 			if err != nil {
 				t.Logf("unsupported curve: %s", g.Curve)
 				continue
@@ -616,8 +616,8 @@
 					continue
 				}
 				cShared, err := ComputeSharedSecret(&pubKey.Point, pvtKey)
-				got := strings.TrimLeft(hex.EncodeToString(cShared), "0")
-				want := strings.TrimLeft(test.Shared, "0")
+				got := hex.EncodeToString(cShared)
+				want := test.Shared
 				if test.Result == "invalid" {
 					if err != nil { // shared secret was not computed
 						continue
diff --git a/go/subtle/hybrid/hkdf.go b/go/subtle/hybrid/hkdf.go
index 7266835..a1d33d4 100644
--- a/go/subtle/hybrid/hkdf.go
+++ b/go/subtle/hybrid/hkdf.go
@@ -20,8 +20,8 @@
 	"fmt"
 	"io"
 
-	"golang.org/x/crypto/hkdf"
 	"github.com/google/tink/go/subtle"
+	"golang.org/x/crypto/hkdf"
 )
 
 const (
@@ -61,7 +61,7 @@
 		return nil, fmt.Errorf("hkdf: %s", err)
 	}
 	hashFunc := subtle.GetHashFunc(hashAlg)
-	if salt == nil || len(salt) == 0 {
+	if len(salt) == 0 {
 		salt = make([]byte, tagSize)
 	}
 
diff --git a/go/subtle/kwp/BUILD.bazel b/go/subtle/kwp/BUILD.bazel
new file mode 100644
index 0000000..069671c
--- /dev/null
+++ b/go/subtle/kwp/BUILD.bazel
@@ -0,0 +1,22 @@
+package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
+
+load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
+
+go_library(
+    name = "go_default_library",
+    srcs = ["kwp.go"],
+    importpath = "github.com/google/tink/go/subtle/kwp",
+)
+
+go_test(
+    name = "go_default_test",
+    srcs = ["kwp_test.go"],
+    data = [
+        "//third_party/wycheproof:testvectors",
+    ],
+    deps = [
+        ":go_default_library",
+        "//go/subtle/random:go_default_library",
+        "//go/testutil:go_default_library",
+    ],
+)
diff --git a/go/subtle/kwp/kwp.go b/go/subtle/kwp/kwp.go
new file mode 100644
index 0000000..9c267f9
--- /dev/null
+++ b/go/subtle/kwp/kwp.go
@@ -0,0 +1,218 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// Package kwp implements the key wrapping primitive KWP defined in
+// NIST SP 800 38f.
+//
+// The same encryption mode is also defined in RFC 5649. The NIST document is
+// used here as a primary reference, since it contains a security analysis and
+// further recommendations. In particular, Section 8 of NIST SP 800 38f
+// suggests that the allowed key sizes may be restricted. The implementation in
+// this package requires that the key sizes are in the range MinWrapSize and
+// MaxWrapSize.
+//
+// The minimum of 16 bytes has been chosen, because 128 bit keys are the
+// smallest key sizes used in tink. Additionally, wrapping short keys with KWP
+// does not use the function W and hence prevents using security arguments
+// based on the assumption that W is a strong pseudorandom. One consequence of
+// using a strong pseudorandom permutation as an underlying function is that
+// leaking partial information about decrypted bytes is not useful for an
+// attack.
+//
+// The upper bound for the key size is somewhat arbitrary. Setting an upper
+// bound is motivated by the analysis in section A.4 of NIST SP 800 38f:
+// forgery of long messages is simpler than forgery of short messages.
+package kwp
+
+import (
+	"crypto/aes"
+	"crypto/cipher"
+	"encoding/binary"
+	"fmt"
+	"math"
+)
+
+const (
+	// MinWrapSize is the smallest key byte length that may be wrapped.
+	MinWrapSize = 16
+	// MaxWrapSize is the largest key byte length that may be wrapped.
+	MaxWrapSize = 8192
+
+	roundCount = 6
+	ivPrefix   = uint32(0xA65959A6)
+)
+
+// KWP is an implementation of an AES-KWP key wrapping cipher.
+type KWP struct {
+	block cipher.Block
+}
+
+// NewKWP returns a KWP instance.
+//
+// The key argument should be the AES wrapping key, either 16 or 32 bytes
+// to select AES-128 or AES-256.
+func NewKWP(wrappingKey []byte) (*KWP, error) {
+	switch len(wrappingKey) {
+	default:
+		return nil, fmt.Errorf("kwp: invalid AES key size; want 16 or 32, got %d", len(wrappingKey))
+	case 16, 32:
+		block, err := aes.NewCipher(wrappingKey)
+		if err != nil {
+			return nil, fmt.Errorf("kwp: error building AES cipher: %v", err)
+		}
+		return &KWP{block: block}, nil
+	}
+}
+
+// wrappingSize computes the byte length of the ciphertext output for the
+// provided plaintext input.
+func wrappingSize(inputSize int) int {
+	paddingSize := 7 - (inputSize+7)%8
+	return inputSize + paddingSize + 8
+}
+
+// computeW computes the pseudorandom permutation W over the IV concatenated
+// with zero-padded key material.
+func (kwp *KWP) computeW(iv, key []byte) ([]byte, error) {
+	// Checks the parameter sizes for which W is defined.
+	// Note that the caller ensures stricter limits.
+	if len(key) <= 8 || len(key) > math.MaxInt32-16 || len(iv) != 8 {
+		return nil, fmt.Errorf("kwp: computeW called with invalid parameters")
+	}
+
+	data := make([]byte, wrappingSize(len(key)))
+	copy(data, iv)
+	copy(data[8:], key)
+	blockCount := len(data)/8 - 1
+
+	buf := make([]byte, 16)
+	copy(buf, data[:8])
+
+	for i := 0; i < roundCount; i++ {
+		for j := 0; j < blockCount; j++ {
+
+			copy(buf[8:], data[8*(j+1):])
+			kwp.block.Encrypt(buf, buf)
+
+			// xor the round constant in big endian order
+			// to the left half of the buffer
+			roundConst := uint(i*blockCount + j + 1)
+			for b := 0; b < 4; b++ {
+				buf[7-b] ^= byte(roundConst & 0xFF)
+				roundConst >>= 8
+			}
+
+			copy(data[8*(j+1):], buf[8:])
+		}
+	}
+	copy(data[:8], buf)
+	return data, nil
+}
+
+// invertW computes the inverse of the pseudorandom permutation W. Note that
+// invertW does not perform an integrity check.
+func (kwp *KWP) invertW(wrapped []byte) ([]byte, error) {
+	// Checks the input size for which invertW is defined.
+	// Note that the caller ensures stricter limits.
+	if len(wrapped) < 24 || len(wrapped)%8 != 0 {
+		return nil, fmt.Errorf("kwp: incorrect data size")
+	}
+
+	data := make([]byte, len(wrapped))
+	copy(data, wrapped)
+
+	blockCount := len(data)/8 - 1
+
+	buf := make([]byte, 16)
+	copy(buf, data[:8])
+
+	for i := roundCount - 1; i >= 0; i-- {
+		for j := blockCount - 1; j >= 0; j-- {
+			copy(buf[8:], data[8*(j+1):])
+
+			// xor the round constant in big endian order
+			// to the left half of the buffer
+			roundConst := uint(i*blockCount + j + 1)
+			for b := 0; b < 4; b++ {
+				buf[7-b] ^= byte(roundConst & 0xFF)
+				roundConst >>= 8
+			}
+
+			kwp.block.Decrypt(buf, buf)
+			copy(data[8*(j+1):], buf[8:])
+		}
+	}
+
+	copy(data, buf[:8])
+	return data, nil
+}
+
+// Wrap wraps the provided key material.
+func (kwp *KWP) Wrap(data []byte) ([]byte, error) {
+	if len(data) < MinWrapSize {
+		return nil, fmt.Errorf("kwp: key size to wrap too small")
+	}
+	if len(data) > MaxWrapSize {
+		return nil, fmt.Errorf("kwp: key size to wrap too large")
+	}
+
+	iv := make([]byte, 8)
+	binary.BigEndian.PutUint32(iv, ivPrefix)
+	binary.BigEndian.PutUint32(iv[4:], uint32(len(data)))
+
+	return kwp.computeW(iv, data)
+}
+
+var errIntegrity = fmt.Errorf("kwp: unwrap failed integrity check")
+
+// Unwrap unwraps a wrapped key.
+func (kwp *KWP) Unwrap(data []byte) ([]byte, error) {
+	if len(data) < wrappingSize(MinWrapSize) {
+		return nil, fmt.Errorf("kwp: wrapped key size too small")
+	}
+	if len(data) > wrappingSize(MaxWrapSize) {
+		return nil, fmt.Errorf("kwp: wrapped key size too large")
+	}
+	if len(data)%8 != 0 {
+		return nil, fmt.Errorf("kwp: wrapped key size must be a multiple of 8 bytes")
+	}
+
+	unwrapped, err := kwp.invertW(data)
+	if err != nil {
+		return nil, err
+	}
+
+	// Check the IV and padding.
+	// W has been designed to be strong pseudorandom permutation, so
+	// leaking information about improperly padded keys would not be a
+	// vulnerability. This means we don't have to go to extra lengths to
+	// ensure that the integrity checks run in constant time.
+
+	if binary.BigEndian.Uint32(unwrapped) != ivPrefix {
+		return nil, errIntegrity
+	}
+
+	encodedSize := int(binary.BigEndian.Uint32(unwrapped[4:]))
+	if encodedSize < 0 || wrappingSize(encodedSize) != len(unwrapped) {
+		return nil, errIntegrity
+	}
+
+	for i := 8 + encodedSize; i < len(unwrapped); i++ {
+		if unwrapped[i] != 0 {
+			return nil, errIntegrity
+		}
+	}
+
+	return unwrapped[8 : 8+encodedSize], nil
+}
diff --git a/go/subtle/kwp/kwp_test.go b/go/subtle/kwp/kwp_test.go
new file mode 100644
index 0000000..c6af935
--- /dev/null
+++ b/go/subtle/kwp/kwp_test.go
@@ -0,0 +1,196 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package kwp_test
+
+import (
+	"bytes"
+	"encoding/hex"
+	"encoding/json"
+	"fmt"
+	"io/ioutil"
+	"testing"
+
+	"github.com/google/tink/go/subtle/kwp"
+	"github.com/google/tink/go/subtle/random"
+	"github.com/google/tink/go/testutil"
+)
+
+func TestWrapUnwrap(t *testing.T) {
+	kek := random.GetRandomBytes(16)
+	cipher, err := kwp.NewKWP(kek)
+	if err != nil {
+		t.Fatalf("failed to make kwp, error: %v", err)
+	}
+
+	for i := uint32(16); i < 128; i++ {
+		t.Run(fmt.Sprintf("MessageSize%d", i), func(t *testing.T) {
+			toWrap := random.GetRandomBytes(i)
+
+			wrapped, err := cipher.Wrap(toWrap)
+			if err != nil {
+				t.Fatalf("failed to wrap, error: %v", err)
+			}
+
+			unwrapped, err := cipher.Unwrap(wrapped)
+			if err != nil {
+				t.Fatalf("failed to unwrap, error: %v", err)
+			}
+
+			if !bytes.Equal(toWrap, unwrapped) {
+				t.Error("unwrapped doesn't match original key")
+			}
+		})
+	}
+}
+
+func TestKeySizes(t *testing.T) {
+	for i := 0; i < 255; i++ {
+		expectSuccess := i == 16 || i == 32
+		t.Run(fmt.Sprintf("KeySize%d", i), func(t *testing.T) {
+			_, err := kwp.NewKWP(make([]byte, i))
+
+			if expectSuccess && err != nil {
+				t.Errorf("failed to create KWP: %v", err)
+			}
+
+			if !expectSuccess && err == nil {
+				t.Error("created KWP with invalid key size")
+			}
+		})
+
+	}
+}
+
+func TestInvalidWrappingSizes(t *testing.T) {
+	kek := random.GetRandomBytes(16)
+	cipher, err := kwp.NewKWP(kek)
+	if err != nil {
+		t.Fatalf("failed to make kwp, error: %v", err)
+	}
+
+	for i := 0; i < 16; i++ {
+		t.Run(fmt.Sprintf("KeySize%d", i), func(t *testing.T) {
+			if _, err := cipher.Wrap(make([]byte, i)); err == nil {
+				t.Error("wrapped a short key")
+			}
+		})
+	}
+}
+
+type KwpCase struct {
+	testutil.WycheproofCase
+	Key        string `json:"key"`
+	Message    string `json:"msg"`
+	Ciphertext string `json:"ct"`
+}
+
+type KwpGroup struct {
+	testutil.WycheproofGroup
+	KeySize int        `json:"keySize"`
+	Tests   []*KwpCase `json:"tests"`
+}
+
+type KwpSuite struct {
+	testutil.WycheproofSuite
+	Groups []*KwpGroup `json:"testGroups"`
+}
+
+func TestWycheproofCases(t *testing.T) {
+	suiteBytes, err := ioutil.ReadFile("../../../third_party/wycheproof/testvectors/kwp_test.json")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	suite := new(KwpSuite)
+	err = json.Unmarshal(suiteBytes, suite)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	for _, group := range suite.Groups {
+		if group.KeySize == 192 {
+			continue
+		}
+
+		for _, test := range group.Tests {
+			caseName := fmt.Sprintf("%s-%s(%d):Case-%d",
+				suite.Algorithm, group.Type, group.KeySize, test.CaseID)
+			t.Run(caseName, func(t *testing.T) { runWycheproofCase(t, test) })
+		}
+	}
+}
+
+func runWycheproofCase(t *testing.T, testCase *KwpCase) {
+	kek, err := hex.DecodeString(testCase.Key)
+	if err != nil {
+		t.Fatalf("hex.DecodeString(testCase.Key) => %v", err)
+	}
+
+	msg, err := hex.DecodeString(testCase.Message)
+	if err != nil {
+		t.Fatalf("hex.DecodeString(testCase.Message) => %v", err)
+	}
+
+	ct, err := hex.DecodeString(testCase.Ciphertext)
+	if err != nil {
+		t.Fatalf("hex.DecodeString(testCase.Ciphertext) => %v", err)
+	}
+
+	cipher, err := kwp.NewKWP(kek)
+	if err != nil {
+		switch testCase.Result {
+		case "valid":
+			t.Fatalf("cannot create kwp, error: %v", err)
+		case "invalid", "acceptable":
+			return
+		}
+	}
+
+	wrapped, err := cipher.Wrap(msg)
+	switch testCase.Result {
+	case "valid":
+		if err != nil {
+			t.Errorf("cannot wrap, error: %v", err)
+		} else if !bytes.Equal(ct, wrapped) {
+			t.Error("wrapped key mismatches test vector")
+		}
+	case "invalid":
+		if err == nil && bytes.Equal(ct, wrapped) {
+			t.Error("no error and wrapped key matches test vector for invalid case")
+		}
+	case "acceptable":
+		if err == nil && !bytes.Equal(ct, wrapped) {
+			t.Error("no error and wrapped key mismatches test vector for acceptable case")
+		}
+	}
+
+	unwrapped, err := cipher.Unwrap(ct)
+	switch testCase.Result {
+	case "valid":
+		if err != nil {
+			t.Errorf("cannot unwrap, error: %v", err)
+		} else if !bytes.Equal(msg, unwrapped) {
+			t.Error("unwrapped key mismatches test vector")
+		}
+	case "invalid":
+		if err == nil {
+			t.Error("no error unwrapping invalid case")
+		}
+	case "acceptable":
+		if err == nil && !bytes.Equal(msg, unwrapped) {
+			t.Error("no error and unwrapped key mismatches plaintext")
+		}
+	}
+}
diff --git a/go/subtle/mac/BUILD.bazel b/go/subtle/mac/BUILD.bazel
index efb076e..b42f546 100644
--- a/go/subtle/mac/BUILD.bazel
+++ b/go/subtle/mac/BUILD.bazel
@@ -1,10 +1,11 @@
+package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
+
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
 go_library(
     name = "go_default_library",
     srcs = ["hmac.go"],
     importpath = "github.com/google/tink/go/subtle/mac",
-    visibility = ["//visibility:public"],
     deps = [
         "//go/subtle:go_default_library",
         "//go/tink:go_default_library",
diff --git a/go/subtle/mac/hmac.go b/go/subtle/mac/hmac.go
index 5ddd447..8dc3414 100644
--- a/go/subtle/mac/hmac.go
+++ b/go/subtle/mac/hmac.go
@@ -12,7 +12,7 @@
 //
 ////////////////////////////////////////////////////////////////////////////////
 
-// Package mac provides subtle implementations of the Mac primitive.
+// Package mac provides subtle implementations of the MAC primitive.
 package mac
 
 import (
@@ -102,8 +102,8 @@
 	return tag[:h.TagSize], nil
 }
 
-// VerifyMAC verifies whether the given MAC is a correct authentication code (MAC)
-// the given data.
+// VerifyMAC verifies whether the given MAC is a correct message authentication
+// code (MAC) the given data.
 func (h *HMAC) VerifyMAC(mac []byte, data []byte) error {
 	if mac == nil || data == nil {
 		return errHMACInvalidInput
diff --git a/go/subtle/random/BUILD.bazel b/go/subtle/random/BUILD.bazel
index 298bd1d..31d5ea5 100644
--- a/go/subtle/random/BUILD.bazel
+++ b/go/subtle/random/BUILD.bazel
@@ -1,3 +1,5 @@
+package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
+
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
 go_library(
diff --git a/go/subtle/signature/BUILD.bazel b/go/subtle/signature/BUILD.bazel
index 9f8185f..60d1e4d 100644
--- a/go/subtle/signature/BUILD.bazel
+++ b/go/subtle/signature/BUILD.bazel
@@ -1,3 +1,5 @@
+package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
+
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
 go_library(
@@ -11,7 +13,6 @@
         "encoding.go",
     ],
     importpath = "github.com/google/tink/go/subtle/signature",
-    visibility = ["//visibility:public"],
     deps = [
         "//go/subtle:go_default_library",
         "//go/tink:go_default_library",
@@ -23,11 +24,11 @@
     name = "go_default_test",
     srcs = [
         "ecdsa_signer_verifier_test.go",
-        "ed25519_signer_verifier_test.go",
         "ecdsa_test.go",
+        "ed25519_signer_verifier_test.go",
     ],
     data = [
-        "@wycheproof//testvectors:all",  # keep
+        "//third_party/wycheproof:testvectors",
     ],
     deps = [
         ":go_default_library",
diff --git a/go/subtle/signature/ecdsa.go b/go/subtle/signature/ecdsa.go
index da9a8a8..b92464a 100644
--- a/go/subtle/signature/ecdsa.go
+++ b/go/subtle/signature/ecdsa.go
@@ -34,35 +34,41 @@
 }
 
 // EncodeECDSASignature converts the signature to the given encoding format.
-// Only DER encoding is supported now.
-func (sig *ECDSASignature) EncodeECDSASignature(encoding string) ([]byte, error) {
+func (sig *ECDSASignature) EncodeECDSASignature(encoding, curveName string) ([]byte, error) {
+	var enc []byte
+	var err error
 	switch encoding {
+	case "IEEE_P1363":
+		enc, err = ieeeP1363Encode(sig, curveName)
 	case "DER":
-		enc, err := asn1encode(sig)
-		if err != nil {
-			return nil, fmt.Errorf("ecdsa: can't convert ECDSA signature to %s encoding: %v", encoding, err)
-		}
-		return enc, nil
+		enc, err = asn1encode(sig)
 	default:
-		return nil, errUnsupportedEncoding
+		err = errUnsupportedEncoding
 	}
+	if err != nil {
+		return nil, fmt.Errorf("ecdsa: can't convert ECDSA signature to %s encoding: %v", encoding, err)
+	}
+	return enc, nil
 }
 
 // DecodeECDSASignature creates a new ECDSA signature using the given byte slice.
 // The function assumes that the byte slice is the concatenation of the BigEndian
 // representation of two big integer r and s.
-func DecodeECDSASignature(encodedBytes []byte,
-	encoding string) (*ECDSASignature, error) {
+func DecodeECDSASignature(encodedBytes []byte, encoding string) (*ECDSASignature, error) {
+	var sig *ECDSASignature
+	var err error
 	switch encoding {
+	case "IEEE_P1363":
+		sig, err = ieeeP1363Decode(encodedBytes)
 	case "DER":
-		sig, err := asn1decode(encodedBytes)
-		if err != nil {
-			return nil, fmt.Errorf("ecdsa: %s", err)
-		}
-		return sig, nil
+		sig, err = asn1decode(encodedBytes)
 	default:
-		return nil, errUnsupportedEncoding
+		err = errUnsupportedEncoding
 	}
+	if err != nil {
+		return nil, fmt.Errorf("ecdsa: %s", err)
+	}
+	return sig, nil
 }
 
 // ValidateECDSAParams validates ECDSA parameters.
@@ -71,7 +77,7 @@
 func ValidateECDSAParams(hashAlg string, curve string, encoding string) error {
 	switch encoding {
 	case "DER":
-		break
+	case "IEEE_P1363":
 	default:
 		return errUnsupportedEncoding
 	}
@@ -80,7 +86,11 @@
 		if hashAlg != "SHA256" {
 			return errors.New("invalid hash type, expect SHA-256")
 		}
-	case "NIST_P384", "NIST_P521":
+	case "NIST_P384":
+		if hashAlg != "SHA384" && hashAlg != "SHA512" {
+			return errors.New("invalid hash type, expect SHA-384 or SHA-512")
+		}
+	case "NIST_P521":
 		if hashAlg != "SHA512" {
 			return errors.New("invalid hash type, expect SHA-512")
 		}
diff --git a/go/subtle/signature/ecdsa_signer.go b/go/subtle/signature/ecdsa_signer.go
index 6964329..4e5ddaa 100644
--- a/go/subtle/signature/ecdsa_signer.go
+++ b/go/subtle/signature/ecdsa_signer.go
@@ -81,7 +81,7 @@
 	}
 	// format the signature
 	sig := NewECDSASignature(r, s)
-	ret, err := sig.EncodeECDSASignature(e.encoding)
+	ret, err := sig.EncodeECDSASignature(e.encoding, e.privateKey.PublicKey.Curve.Params().Name)
 	if err != nil {
 		return nil, fmt.Errorf("ecdsa_signer: signing failed: %s", err)
 	}
diff --git a/go/subtle/signature/ecdsa_signer_verifier_test.go b/go/subtle/signature/ecdsa_signer_verifier_test.go
index 3b5e882..cc2a7d7 100644
--- a/go/subtle/signature/ecdsa_signer_verifier_test.go
+++ b/go/subtle/signature/ecdsa_signer_verifier_test.go
@@ -32,40 +32,42 @@
 	data := random.GetRandomBytes(20)
 	hash := "SHA256"
 	curve := "NIST_P256"
-	encoding := "DER"
-	priv, _ := ecdsa.GenerateKey(subtle.GetCurve(curve), rand.Reader)
-	// Use the private key and public key directly to create new instances
-	signer, err := subtleSignature.NewECDSASignerFromPrivateKey(hash, encoding, priv)
-	if err != nil {
-		t.Errorf("unexpected error when creating ECDSASigner: %s", err)
-	}
-	verifier, err := subtleSignature.NewECDSAVerifierFromPublicKey(hash, encoding, &priv.PublicKey)
-	if err != nil {
-		t.Errorf("unexpected error when creating ECDSAVerifier: %s", err)
-	}
-	signature, err := signer.Sign(data)
-	if err != nil {
-		t.Errorf("unexpected error when signing: %s", err)
-	}
-	if err := verifier.Verify(signature, data); err != nil {
-		t.Errorf("unexpected error when verifying: %s", err)
-	}
+	encodings := []string{"DER", "IEEE_P1363"}
+	for _, encoding := range encodings {
+		priv, _ := ecdsa.GenerateKey(subtle.GetCurve(curve), rand.Reader)
+		// Use the private key and public key directly to create new instances
+		signer, err := subtleSignature.NewECDSASignerFromPrivateKey(hash, encoding, priv)
+		if err != nil {
+			t.Errorf("unexpected error when creating ECDSASigner: %s", err)
+		}
+		verifier, err := subtleSignature.NewECDSAVerifierFromPublicKey(hash, encoding, &priv.PublicKey)
+		if err != nil {
+			t.Errorf("unexpected error when creating ECDSAVerifier: %s", err)
+		}
+		signature, err := signer.Sign(data)
+		if err != nil {
+			t.Errorf("unexpected error when signing: %s", err)
+		}
+		if err := verifier.Verify(signature, data); err != nil {
+			t.Errorf("unexpected error when verifying: %s", err)
+		}
 
-	// Use byte slices to create new instances
-	signer, err = subtleSignature.NewECDSASigner(hash, curve, encoding, priv.D.Bytes())
-	if err != nil {
-		t.Errorf("unexpected error when creating ECDSASigner: %s", err)
-	}
-	verifier, err = subtleSignature.NewECDSAVerifier(hash, curve, encoding, priv.X.Bytes(), priv.Y.Bytes())
-	if err != nil {
-		t.Errorf("unexpected error when creating ECDSAVerifier: %s", err)
-	}
-	signature, err = signer.Sign(data)
-	if err != nil {
-		t.Errorf("unexpected error when signing: %s", err)
-	}
-	if err = verifier.Verify(signature, data); err != nil {
-		t.Errorf("unexpected error when verifying: %s", err)
+		// Use byte slices to create new instances
+		signer, err = subtleSignature.NewECDSASigner(hash, curve, encoding, priv.D.Bytes())
+		if err != nil {
+			t.Errorf("unexpected error when creating ECDSASigner: %s", err)
+		}
+		verifier, err = subtleSignature.NewECDSAVerifier(hash, curve, encoding, priv.X.Bytes(), priv.Y.Bytes())
+		if err != nil {
+			t.Errorf("unexpected error when creating ECDSAVerifier: %s", err)
+		}
+		signature, err = signer.Sign(data)
+		if err != nil {
+			t.Errorf("unexpected error when signing: %s", err)
+		}
+		if err = verifier.Verify(signature, data); err != nil {
+			t.Errorf("unexpected error when verifying: %s", err)
+		}
 	}
 }
 
@@ -77,6 +79,7 @@
 }
 
 type testGroup struct {
+	Jwk    *jwk `json:"jwk,omitempty"`
 	KeyDer string
 	KeyPem string
 	Sha    string
@@ -94,16 +97,43 @@
 
 type testcase struct {
 	Comment string
-	Message string
+	Msg     string
 	Result  string
 	Sig     string
 	TcID    uint32
 }
 
-func TestVectors(t *testing.T) {
-	f, err := os.Open("../../../../wycheproof/testvectors/ecdsa_test.json")
+type jwk struct {
+	Jwk string
+	Crv string
+	Kid string
+	Kty string
+	X   string
+	Y   string
+}
+
+func TestWycheproofVectors(t *testing.T) {
+	vectors := []struct {
+		Filename string
+		Encoding string
+	}{
+		{"../../../third_party/wycheproof/testvectors/ecdsa_test.json", "DER"},
+		{"../../../third_party/wycheproof/testvectors/ecdsa_secp256r1_sha256_p1363_test.json", "IEEE_P1363"},
+		{"../../../third_party/wycheproof/testvectors/ecdsa_secp384r1_sha512_p1363_test.json", "IEEE_P1363"},
+		{"../../../third_party/wycheproof/testvectors/ecdsa_secp521r1_sha512_p1363_test.json", "IEEE_P1363"},
+	}
+
+	for _, v := range vectors {
+		wycheproofTest(t, v.Filename, v.Encoding)
+	}
+}
+
+func wycheproofTest(t *testing.T, filename, encoding string) {
+	fmt.Printf("now testing wycheproof file %q, encoding %q\n", filename, encoding)
+	f, err := os.Open(filename)
 	if err != nil {
-		t.Errorf("cannot open file: %s", err)
+		fmt.Printf("cannot open file: %s, this is typically caused by an older version of Wycheproof.", err)
+		return
 	}
 	parser := json.NewDecoder(f)
 	content := new(testData)
@@ -116,7 +146,6 @@
 		if hash == "" || curve == "" {
 			continue
 		}
-		encoding := "DER"
 		x, err := subtle.NewBigIntFromHex(g.Key.Wx)
 		if err != nil {
 			t.Errorf("cannot decode wx: %s", err)
@@ -130,7 +159,7 @@
 			continue
 		}
 		for _, tc := range g.Tests {
-			message, err := hex.DecodeString(tc.Message)
+			message, err := hex.DecodeString(tc.Msg)
 			if err != nil {
 				t.Errorf("cannot decode message in test case %d: %s", tc.TcID, err)
 			}
@@ -141,7 +170,7 @@
 			err = verifier.Verify(sig, message)
 			if (tc.Result == "valid" && err != nil) ||
 				(tc.Result == "invalid" && err == nil) {
-				fmt.Println("failed in test case ", tc.TcID, err)
+				t.Errorf("failed in test case %d with error %q ", tc.TcID, err)
 			}
 		}
 	}
diff --git a/go/subtle/signature/ecdsa_test.go b/go/subtle/signature/ecdsa_test.go
index f804d64..3620f86 100644
--- a/go/subtle/signature/ecdsa_test.go
+++ b/go/subtle/signature/ecdsa_test.go
@@ -16,6 +16,7 @@
 
 import (
 	"encoding/asn1"
+	"encoding/hex"
 	"fmt"
 	"math/big"
 	"testing"
@@ -32,12 +33,12 @@
 
 var _ = fmt.Println
 
-func TestECDSAEncodeDecode(t *testing.T) {
+func TestECDSAEncodeDecodeDER(t *testing.T) {
 	nTest := 1000
 	for i := 0; i < nTest; i++ {
 		sig := newECDSARandomSignature()
 		encoding := "DER"
-		encoded, err := sig.EncodeECDSASignature(encoding)
+		encoded, err := sig.EncodeECDSASignature(encoding, "P-256")
 		if err != nil {
 			t.Errorf("unexpected error during encoding: %s", err)
 		}
@@ -63,9 +64,47 @@
 	}
 }
 
+func TestECDSAEncodeDecodeIEEEP1363(t *testing.T) {
+	nTest := 1000
+	for i := 0; i < nTest; i++ {
+		sig := newECDSARandomSignature()
+		encoding := "IEEE_P1363"
+		encoded, err := sig.EncodeECDSASignature(encoding, "P-256")
+		if err != nil {
+			t.Errorf("unexpected error during encoding: %s", err)
+		}
+		if len(encoded) != 64 {
+			t.Errorf("incorrect length, expected %d, got %d", 64, len(encoded))
+		}
+		if len(sig.R.Bytes()) < 32 {
+			expectedZeros := 32 - len(sig.R.Bytes())
+			for i := 0; i < expectedZeros; i++ {
+				if encoded[i] != 0 {
+					t.Errorf("expect byte %d to be 0, got %d. encoded data = %s", i, encoded[i], hex.Dump(encoded))
+				}
+			}
+		}
+		if len(sig.S.Bytes()) < 32 {
+			expectedZeros := 32 - len(sig.S.Bytes())
+			for i := 32; i < (32 + expectedZeros); i++ {
+				if encoded[i] != 0 {
+					t.Errorf("expect byte %d to be 0, got %d. encoded data = %s", i, encoded[i], hex.Dump(encoded))
+				}
+			}
+		}
+		decodedSig, err := DecodeECDSASignature(encoded, encoding)
+		if err != nil {
+			t.Errorf("unexpected error during decoding: %s", err)
+		}
+		if decodedSig.R.Cmp(sig.R) != 0 || decodedSig.S.Cmp(sig.S) != 0 {
+			t.Errorf("decoded signature doesn't match original value")
+		}
+	}
+}
+
 func TestECDSAEncodeWithInvalidInput(t *testing.T) {
 	sig := newECDSARandomSignature()
-	_, err := sig.EncodeECDSASignature("UNKNOWN_ENCODING")
+	_, err := sig.EncodeECDSASignature("UNKNOWN_ENCODING", "P-256")
 	if err == nil {
 		t.Errorf("expect an error when encoding is invalid")
 	}
@@ -78,28 +117,28 @@
 
 	// modified first byte
 	sig = newECDSARandomSignature()
-	encoded, _ = sig.EncodeECDSASignature(encoding)
+	encoded, _ = sig.EncodeECDSASignature(encoding, "P-256")
 	encoded[0] = 0x31
 	if _, err := DecodeECDSASignature(encoded, encoding); err == nil {
 		t.Errorf("expect an error when first byte is not 0x30")
 	}
 	// modified tag
 	sig = newECDSARandomSignature()
-	encoded, _ = sig.EncodeECDSASignature(encoding)
+	encoded, _ = sig.EncodeECDSASignature(encoding, "P-256")
 	encoded[2] = encoded[2] + 1
 	if _, err := DecodeECDSASignature(encoded, encoding); err == nil {
 		t.Errorf("expect an error when tag is modified")
 	}
 	// modified length
 	sig = newECDSARandomSignature()
-	encoded, _ = sig.EncodeECDSASignature(encoding)
+	encoded, _ = sig.EncodeECDSASignature(encoding, "P-256")
 	encoded[1] = encoded[1] + 1
 	if _, err := DecodeECDSASignature(encoded, encoding); err == nil {
 		t.Errorf("expect an error when length is modified")
 	}
 	// append unused 0s
 	sig = newECDSARandomSignature()
-	encoded, _ = sig.EncodeECDSASignature(encoding)
+	encoded, _ = sig.EncodeECDSASignature(encoding, "P-256")
 	tmp := make([]byte, len(encoded)+4)
 	copy(tmp, encoded)
 	if _, err := DecodeECDSASignature(tmp, encoding); err == nil {
@@ -133,25 +172,34 @@
 }
 
 func genECDSAInvalidParams() []paramsTest {
-	return []paramsTest{
+	encodings := []string{"DER", "IEEE_P1363"}
+	testCases := []paramsTest{
 		// invalid encoding
 		paramsTest{hash: "SHA256", curve: "NIST_P256", encoding: "UNKNOWN_ENCODING"},
-		// invalid curve
-		paramsTest{hash: "SHA256", curve: "UNKNOWN_CURVE", encoding: "DER"},
-		// invalid hash: P256 and SHA-512
-		paramsTest{hash: "SHA512", curve: "NIST_P256", encoding: "DER"},
-		// invalid hash: P521 and SHA-256
-		paramsTest{hash: "SHA256", curve: "NIST_P521", encoding: "DER"},
-		// invalid hash: P384 and SHA-256
-		paramsTest{hash: "SHA256", curve: "NIST_P384", encoding: "DER"},
 	}
+	for _, encoding := range encodings {
+		// invalid curve
+		testCases = append(testCases, paramsTest{hash: "SHA256", curve: "UNKNOWN_CURVE", encoding: encoding})
+		// invalid hash: P256 and SHA-512
+		testCases = append(testCases, paramsTest{hash: "SHA512", curve: "NIST_P256", encoding: encoding})
+		// invalid hash: P521 and SHA-256
+		testCases = append(testCases, paramsTest{hash: "SHA256", curve: "NIST_P521", encoding: encoding})
+		// invalid hash: P384 and SHA-256
+		testCases = append(testCases, paramsTest{hash: "SHA256", curve: "NIST_P384", encoding: encoding})
+	}
+	return testCases
 }
 
 func genECDSAValidParams() []paramsTest {
 	return []paramsTest{
 		paramsTest{hash: "SHA256", curve: "NIST_P256", encoding: "DER"},
+		paramsTest{hash: "SHA256", curve: "NIST_P256", encoding: "IEEE_P1363"},
+		paramsTest{hash: "SHA384", curve: "NIST_P384", encoding: "DER"},
+		paramsTest{hash: "SHA384", curve: "NIST_P384", encoding: "IEEE_P1363"},
 		paramsTest{hash: "SHA512", curve: "NIST_P384", encoding: "DER"},
+		paramsTest{hash: "SHA512", curve: "NIST_P384", encoding: "IEEE_P1363"},
 		paramsTest{hash: "SHA512", curve: "NIST_P521", encoding: "DER"},
+		paramsTest{hash: "SHA512", curve: "NIST_P521", encoding: "IEEE_P1363"},
 	}
 }
 
diff --git a/go/subtle/signature/ed25519_signer_verifier_test.go b/go/subtle/signature/ed25519_signer_verifier_test.go
index 9bb40fc..be63697 100644
--- a/go/subtle/signature/ed25519_signer_verifier_test.go
+++ b/go/subtle/signature/ed25519_signer_verifier_test.go
@@ -19,7 +19,6 @@
 	"crypto/rand"
 	"encoding/hex"
 	"encoding/json"
-	"fmt"
 	"os"
 	"testing"
 
@@ -56,7 +55,7 @@
 	if err := verifier.Verify(sign2, data); err != nil {
 		t.Errorf("unexpected error when verifying: %s", err)
 	}
-	if bytes.Compare(sign1, sign2) != 0 {
+	if !bytes.Equal(sign1, sign2) {
 		t.Error("deterministic signature check failure")
 	}
 
@@ -70,6 +69,9 @@
 	}
 	// Use the private key and public key directly to create new instances
 	signer, verifier, err := newSignerVerifier(t, &priv, &public)
+	if err != nil {
+		t.Fatalf("failed to create new signer verifier: %v", err)
+	}
 
 	sign, err := signer.Sign(data)
 	if err != nil {
@@ -94,6 +96,9 @@
 
 	// Use the private key and public key directly to create new instances
 	signer, verifier, err := newSignerVerifier(t, &priv, &public)
+	if err != nil {
+		t.Fatalf("failed to create new signer verifier: %v", err)
+	}
 
 	sign, err := signer.Sign(data)
 	if err != nil {
@@ -165,11 +170,12 @@
 
 type testKeyED25519 struct {
 	Sk string
+	Pk string
 }
 
 type testcaseED25519 struct {
 	Comment string
-	Message string
+	Msg     string
 	Result  string
 	Sig     string
 	TcID    uint32
@@ -177,30 +183,37 @@
 
 func TestVectorsED25519(t *testing.T) {
 	// signing tests are same between ecdsa and ed25519
-	f, err := os.Open("../../../../wycheproof/testvectors/eddsa_test.json")
+	f, err := os.Open("../../../third_party/wycheproof/testvectors/eddsa_test.json")
 	if err != nil {
-		t.Errorf("cannot open file: %s", err)
+		t.Fatalf("cannot open file: %s", err)
 	}
 	parser := json.NewDecoder(f)
 	content := new(testDataED25519)
 	if err := parser.Decode(content); err != nil {
-		t.Errorf("cannot decode content of file: %s", err)
+		t.Fatalf("cannot decode content of file: %s", err)
 	}
 	for _, g := range content.TestGroups {
 		pvtKey, err := hex.DecodeString(g.Key.Sk)
 		if err != nil {
-			t.Errorf("cannot decode private key: %s", err)
+			t.Fatalf("cannot decode sk key: %s", err)
+		}
+		pubKey, err := hex.DecodeString(g.Key.Pk)
+		if err != nil {
+			t.Fatalf("cannot decode private key: %s", err)
 		}
 
 		private := ed25519.PrivateKey(pvtKey)
-		public := private.Public()
-
-		verifier, err := subtleSignature.NewED25519Verifier(public.(ed25519.PublicKey))
+		public := ed25519.PrivateKey(pubKey)
+		signer, err := subtleSignature.NewED25519Signer(private)
+		if err != nil {
+			continue
+		}
+		verifier, err := subtleSignature.NewED25519Verifier(public)
 		if err != nil {
 			continue
 		}
 		for _, tc := range g.Tests {
-			message, err := hex.DecodeString(tc.Message)
+			message, err := hex.DecodeString(tc.Msg)
 			if err != nil {
 				t.Errorf("cannot decode message in test case %d: %s", tc.TcID, err)
 			}
@@ -208,10 +221,25 @@
 			if err != nil {
 				t.Errorf("cannot decode signature in test case %d: %s", tc.TcID, err)
 			}
+			got, err := signer.Sign(message)
+			if tc.Result == "valid" && err != nil {
+				t.Errorf("sign failed in test case %d: with error %s", tc.TcID, err)
+			}
+			if tc.Result == "valid" && err == nil && !bytes.Equal(sig, got) {
+				// Ed25519 is deterministic.
+				// Getting an alternative signature may leak the private key.
+				// This is especially the case if an attacker can also learn the valid signature.
+				t.Errorf("sign failed in test case %d: invalid signature generated %s", tc.TcID, hex.EncodeToString(got))
+			}
+			if tc.Result == "invalid" && err == nil && bytes.Equal(sig, got) {
+				t.Errorf("sign failed in test case %d: invalid signature generated", tc.TcID)
+			}
 			err = verifier.Verify(sig, message)
-			if (tc.Result == "valid" && err != nil) ||
-				(tc.Result == "invalid" && err == nil) {
-				fmt.Println("failed in test case ", tc.TcID, err)
+			if tc.Result == "valid" && err != nil {
+				t.Errorf("verify failed in test case %d: valid signature is rejected with error %s", tc.TcID, err)
+			}
+			if tc.Result == "invalid" && err == nil {
+				t.Errorf("verify failed in test case %d: invalid signature is accepted", tc.TcID)
 			}
 		}
 	}
diff --git a/go/subtle/signature/encoding.go b/go/subtle/signature/encoding.go
index 0d6f0f8..96b6de2 100644
--- a/go/subtle/signature/encoding.go
+++ b/go/subtle/signature/encoding.go
@@ -16,8 +16,10 @@
 
 import (
 	"bytes"
+	"crypto/elliptic"
 	"encoding/asn1"
 	"fmt"
+	"math/big"
 )
 
 // asn1encode encodes the given ECDSA signature using ASN.1 encoding.
@@ -54,3 +56,52 @@
 	}
 	return sig, nil
 }
+
+func ieeeSignatureSize(curveName string) (int, error) {
+	switch curveName {
+	case elliptic.P256().Params().Name:
+		return 64, nil
+	case elliptic.P384().Params().Name:
+		return 96, nil
+	case elliptic.P521().Params().Name:
+		return 132, nil
+	default:
+		return 0, fmt.Errorf("ieeeP1363 unsupported curve name: %q", curveName)
+	}
+}
+
+func ieeeP1363Encode(sig *ECDSASignature, curveName string) ([]byte, error) {
+	sigSize, err := ieeeSignatureSize(curveName)
+	if err != nil {
+		return nil, err
+	}
+
+	enc := make([]byte, sigSize)
+
+	// sigR and sigS must be half the size of the signature. If not, we need to pad them with zeros.
+	offset := 0
+	if len(sig.R.Bytes()) < (sigSize / 2) {
+		offset += (sigSize / 2) - len(sig.R.Bytes())
+	}
+	// Copy sigR after any zero-padding.
+	copy(enc[offset:], sig.R.Bytes())
+
+	// Skip the bytes of sigR.
+	offset = sigSize / 2
+	if len(sig.S.Bytes()) < (sigSize / 2) {
+		offset += (sigSize / 2) - len(sig.S.Bytes())
+	}
+	// Copy sigS after sigR and any zero-padding.
+	copy(enc[offset:], sig.S.Bytes())
+
+	return enc, nil
+}
+
+func ieeeP1363Decode(encodedBytes []byte) (*ECDSASignature, error) {
+	if len(encodedBytes) == 0 || len(encodedBytes) > 132 || len(encodedBytes)%2 != 0 {
+		return nil, fmt.Errorf("ecdsa: Invalid IEEE_P1363 encoded bytes")
+	}
+	r := new(big.Int).SetBytes(encodedBytes[:len(encodedBytes)/2])
+	s := new(big.Int).SetBytes(encodedBytes[len(encodedBytes)/2:])
+	return &ECDSASignature{R: r, S: s}, nil
+}
diff --git a/go/subtle/subtle.go b/go/subtle/subtle.go
index 45b100f..44fa4d0 100644
--- a/go/subtle/subtle.go
+++ b/go/subtle/subtle.go
@@ -34,6 +34,8 @@
 	switch name {
 	case "SHA-256":
 		return "SHA256"
+	case "SHA-384":
+		return "SHA384"
 	case "SHA-512":
 		return "SHA512"
 	case "SHA-1":
@@ -44,7 +46,7 @@
 }
 
 // ConvertCurveName converts different forms of a curve name to the
-// name that tink recognizes
+// name that tink recognizes.
 func ConvertCurveName(name string) string {
 	switch name {
 	case "secp256r1", "P-256":
@@ -65,6 +67,8 @@
 		return sha1.New
 	case "SHA256":
 		return sha256.New
+	case "SHA384":
+		return sha512.New384
 	case "SHA512":
 		return sha512.New
 	default:
diff --git a/go/testkeyset/BUILD.bazel b/go/testkeyset/BUILD.bazel
index b11683a..1464c21 100644
--- a/go/testkeyset/BUILD.bazel
+++ b/go/testkeyset/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
 
-licenses(["notice"])  # Apache 2.0 # keep
+licenses(["notice"])  # keep
 
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
diff --git a/go/testkeyset/testkeyset.go b/go/testkeyset/testkeyset.go
index 6d8fdcf..df16d40 100644
--- a/go/testkeyset/testkeyset.go
+++ b/go/testkeyset/testkeyset.go
@@ -24,7 +24,11 @@
 )
 
 var (
-	keysetHandle     = internal.KeysetHandle.(func(*tinkpb.Keyset) *keyset.Handle)
+	// KeysetHandle creates a keyset.Handle from cleartext key material.
+	KeysetHandle = internal.KeysetHandle.(func(*tinkpb.Keyset) *keyset.Handle)
+	// KeysetMaterial returns the key material contained in a keyset.Handle.
+	KeysetMaterial = internal.KeysetMaterial.(func(*keyset.Handle) *tinkpb.Keyset)
+
 	errInvalidKeyset = errors.New("cleartextkeyset: invalid keyset")
 	errInvalidHandle = errors.New("cleartextkeyset: invalid handle")
 	errInvalidReader = errors.New("cleartextkeyset: invalid reader")
@@ -36,7 +40,7 @@
 	if ks == nil || len(ks.Key) == 0 {
 		return nil, errInvalidKeyset
 	}
-	return keysetHandle(ks), nil
+	return KeysetHandle(ks), nil
 }
 
 // Read creates a keyset.Handle from a cleartext keyset obtained via r.
@@ -48,7 +52,7 @@
 	if err != nil || ks == nil || len(ks.Key) == 0 {
 		return nil, errInvalidKeyset
 	}
-	return keysetHandle(ks), nil
+	return KeysetHandle(ks), nil
 }
 
 // Write exports the keyset from h to the given writer w without encrypting it.
@@ -61,5 +65,5 @@
 	if w == nil {
 		return errInvalidWriter
 	}
-	return w.Write(h.Keyset())
+	return w.Write(KeysetMaterial(h))
 }
diff --git a/go/testutil/BUILD.bazel b/go/testutil/BUILD.bazel
index e8872d0..f061300 100644
--- a/go/testutil/BUILD.bazel
+++ b/go/testutil/BUILD.bazel
@@ -1,3 +1,5 @@
+package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
+
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
 go_library(
@@ -5,24 +7,26 @@
     srcs = [
         "constant.go",
         "testutil.go",
+        "wycheproofutil.go",
     ],
     importpath = "github.com/google/tink/go/testutil",
-    visibility = ["//visibility:public"],
     deps = [
         "//go/aead:go_default_library",
+        "//go/core/registry:go_default_library",
         "//go/daead:go_default_library",
         "//go/keyset:go_default_library",
         "//go/mac:go_default_library",
-        "//go/registry:go_default_library",
         "//go/signature:go_default_library",
         "//go/subtle:go_default_library",
         "//go/subtle/daead:go_default_library",
+        "//go/subtle/hybrid:go_default_library",
         "//go/subtle/random:go_default_library",
         "//go/tink:go_default_library",
         "//proto:aes_gcm_go_proto",
         "//proto:aes_siv_go_proto",
         "//proto:common_go_proto",
         "//proto:ecdsa_go_proto",
+        "//proto:ecies_aead_hkdf_go_proto",
         "//proto:ed25519_go_proto",
         "//proto:hmac_go_proto",
         "//proto:tink_go_proto",
@@ -33,7 +37,13 @@
 
 go_test(
     name = "go_default_test",
-    srcs = ["testutil_test.go"],
+    srcs = [
+        "testutil_test.go",
+        "wycheproofutil_test.go",
+    ],
+    data = [
+        "//third_party/wycheproof:testvectors",
+    ],
     deps = [
         "//go/testutil:go_default_library",
         "//go/tink:go_default_library",
diff --git a/go/testutil/constant.go b/go/testutil/constant.go
index 9973ece..2344b21 100644
--- a/go/testutil/constant.go
+++ b/go/testutil/constant.go
@@ -42,6 +42,18 @@
 	// XChaCha20Poly1305TypeURL is the type URL of XChaCha20Poly1305 keys.
 	XChaCha20Poly1305TypeURL = "type.googleapis.com/google.crypto.tink.XChaCha20Poly1305Key"
 
+	// EciesAeadHkdfPrivateKeyKeyVersion is the maxmimal version of keys that this key manager supports.
+	EciesAeadHkdfPrivateKeyKeyVersion = 0
+
+	// EciesAeadHkdfPrivateKeyTypeURL is the url that this key manager supports.
+	EciesAeadHkdfPrivateKeyTypeURL = "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey"
+
+	// EciesAeadHkdfPublicKeyKeyVersion is the maxmimal version of keys that this key manager supports.
+	EciesAeadHkdfPublicKeyKeyVersion = 0
+
+	// EciesAeadHkdfPublicKeyTypeURL is the url that this key manager supports.
+	EciesAeadHkdfPublicKeyTypeURL = "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey"
+
 	// DeterministicAEAD
 
 	// AESSIVKeyVersion is the maxmimal version of AES-SIV keys that Tink supports.
diff --git a/go/testutil/testutil.go b/go/testutil/testutil.go
index 9a98324..28dcd0e 100644
--- a/go/testutil/testutil.go
+++ b/go/testutil/testutil.go
@@ -21,19 +21,21 @@
 	"fmt"
 
 	"github.com/golang/protobuf/proto"
-	"golang.org/x/crypto/ed25519"
+	"github.com/google/tink/go/core/registry"
 	"github.com/google/tink/go/keyset"
 	"github.com/google/tink/go/mac"
-	"github.com/google/tink/go/registry"
-	"github.com/google/tink/go/subtle/random"
 	"github.com/google/tink/go/subtle"
+	subtlehybrid "github.com/google/tink/go/subtle/hybrid"
+	"github.com/google/tink/go/subtle/random"
 	"github.com/google/tink/go/tink"
+	"golang.org/x/crypto/ed25519"
 
 	subtedaead "github.com/google/tink/go/subtle/daead"
 	gcmpb "github.com/google/tink/proto/aes_gcm_go_proto"
 	aspb "github.com/google/tink/proto/aes_siv_go_proto"
 	commonpb "github.com/google/tink/proto/common_go_proto"
 	ecdsapb "github.com/google/tink/proto/ecdsa_go_proto"
+	eciespb "github.com/google/tink/proto/ecies_aead_hkdf_go_proto"
 	ed25519pb "github.com/google/tink/proto/ed25519_go_proto"
 	hmacpb "github.com/google/tink/proto/hmac_go_proto"
 	tinkpb "github.com/google/tink/proto/tink_go_proto"
@@ -109,10 +111,7 @@
 
 // Supported true if this client does support keyURI
 func (d *DummyKMSClient) Supported(keyURI string) bool {
-	if keyURI == "dummy" {
-		return true
-	}
-	return false
+	return keyURI == "dummy"
 }
 
 // LoadCredentials loads the credentials in credentialPath. If credentialPath is null, loads the
@@ -405,3 +404,73 @@
 		KeysetInfo:      info,
 	}
 }
+
+// GenerateMutations generates different byte mutations for a given byte array.
+func GenerateMutations(src []byte) (all [][]byte) {
+	n := make([]byte, len(src))
+
+	// Flip bits
+	for i := 0; i < len(src); i++ {
+		for j := 0; j < 8; j++ {
+			copy(n, src)
+			n[i] = n[i] ^ (1 << uint8(j))
+			all = append(all, n)
+		}
+	}
+
+	//truncate bytes
+	for i := 0; i < len(src); i++ {
+		copy(n, src[i:])
+		all = append(all, n)
+	}
+
+	//append extra byte
+	m := make([]byte, len(src)+1)
+	copy(m, src)
+	all = append(all, m)
+	return
+}
+
+// eciesAEADHKDFPublicKey returns a EciesAeadHkdfPublicKey with specified parameters.
+func eciesAEADHKDFPublicKey(c commonpb.EllipticCurveType, ht commonpb.HashType, ptfmt commonpb.EcPointFormat, dekT *tinkpb.KeyTemplate, x, y, salt []byte) *eciespb.EciesAeadHkdfPublicKey {
+	return &eciespb.EciesAeadHkdfPublicKey{
+		Version: 0,
+		Params: &eciespb.EciesAeadHkdfParams{
+			KemParams: &eciespb.EciesHkdfKemParams{
+				CurveType:    c,
+				HkdfHashType: ht,
+				HkdfSalt:     salt,
+			},
+			DemParams: &eciespb.EciesAeadDemParams{
+				AeadDem: dekT,
+			},
+			EcPointFormat: ptfmt,
+		},
+		X: x,
+		Y: y,
+	}
+}
+
+// eciesAEADHKDFPrivateKey returns a EciesAeadHkdfPrivateKey with specified parameters
+func eciesAEADHKDFPrivateKey(p *eciespb.EciesAeadHkdfPublicKey, d []byte) *eciespb.EciesAeadHkdfPrivateKey {
+	return &eciespb.EciesAeadHkdfPrivateKey{
+		Version:   0,
+		PublicKey: p,
+		KeyValue:  d,
+	}
+}
+
+// GenerateECIESAEADHKDFPrivateKey generates a new EC key pair and returns the private key proto.
+func GenerateECIESAEADHKDFPrivateKey(c commonpb.EllipticCurveType, ht commonpb.HashType, ptfmt commonpb.EcPointFormat, dekT *tinkpb.KeyTemplate, salt []byte) (*eciespb.EciesAeadHkdfPrivateKey, error) {
+	curve, err := subtlehybrid.GetCurve(c.String())
+	if err != nil {
+		return nil, err
+	}
+	pvt, err := subtlehybrid.GenerateECDHKeyPair(curve)
+	if err != nil {
+		return nil, err
+	}
+	pubKey := eciesAEADHKDFPublicKey(c, ht, ptfmt, dekT, pvt.PublicKey.Point.X.Bytes(), pvt.PublicKey.Point.Y.Bytes(), salt)
+	//fmt.Println(proto.MarshalTextString(pubKey))
+	return eciesAEADHKDFPrivateKey(pubKey, pvt.D.Bytes()), nil
+}
diff --git a/go/testutil/wycheproofutil.go b/go/testutil/wycheproofutil.go
new file mode 100644
index 0000000..dad707d
--- /dev/null
+++ b/go/testutil/wycheproofutil.go
@@ -0,0 +1,45 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package testutil
+
+// WycheproofSuite represents the common elements of the top level
+// object in a Wycheproof json file. Implementations should embed
+// WycheproofSuite in a struct that strongly types the testGroups
+// field. See wycheproofutil_test.go for an example.
+type WycheproofSuite struct {
+	Algorithm        string            `json:"algorithm"`
+	GeneratorVersion string            `json:"generatorVersion"`
+	NumberOfTests    int               `json:"numberOfTests"`
+	Notes            map[string]string `json:"notes"`
+}
+
+// WycheproofGroup represents the common elements of a testGroups
+// object in a Wycheproof suite. Implementations should embed
+// WycheproofGroup in a struct that strongly types its list of cases.
+// See wycheproofutil_test.go for an example.
+type WycheproofGroup struct {
+	Type string `json:"type"`
+}
+
+// WycheproofCase represents the common elements of a tests object
+// in a Wycheproof group. Implementation should embed WycheproofCase
+// in a struct that contains fields specific to the test type.
+// See wycheproofutil_test.go for an example.
+type WycheproofCase struct {
+	CaseID  int      `json:"tcId"`
+	Comment string   `json:"comment"`
+	Result  string   `json:"result"`
+	Flags   []string `json:"flags"`
+}
diff --git a/go/testutil/wycheproofutil_test.go b/go/testutil/wycheproofutil_test.go
new file mode 100644
index 0000000..9fa8908
--- /dev/null
+++ b/go/testutil/wycheproofutil_test.go
@@ -0,0 +1,65 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package testutil_test
+
+import (
+	"encoding/json"
+	"io/ioutil"
+	"testing"
+
+	"github.com/google/tink/go/testutil"
+)
+
+func TestWycheproofParsing(t *testing.T) {
+
+	type AeadTest struct {
+		testutil.WycheproofCase
+		Key        string `json:"key"`
+		IV         string `json:"iv"`
+		AAD        string `json:"aad"`
+		Message    string `json:"msg"`
+		Ciphertext string `json:"ct"`
+		Tag        string `json:"tag"`
+	}
+
+	type AeadGroup struct {
+		testutil.WycheproofGroup
+		Tests []*AeadTest `json:"tests"`
+	}
+
+	type AeadSuite struct {
+		testutil.WycheproofSuite
+		TestGroups []*AeadGroup `json:"testGroups"`
+	}
+
+	bytes, err := ioutil.ReadFile("../../third_party/wycheproof/testvectors/aes_gcm_test.json")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	suite := new(AeadSuite)
+	err = json.Unmarshal(bytes, suite)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if suite.Algorithm != "AES-GCM" {
+		t.Errorf("suite.Algorithm=%s, want AES-GCM", suite.Algorithm)
+	}
+
+	if suite.TestGroups[0].Tests[0].Key == "" {
+		t.Error("suite.TestGroups[0].Tests[0].Key is empty")
+	}
+}
diff --git a/go/tink/BUILD.bazel b/go/tink/BUILD.bazel
index e78b7db..4d6ab4b 100644
--- a/go/tink/BUILD.bazel
+++ b/go/tink/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])  # keep
 
-licenses(["notice"])  # Apache 2.0 # keep
+licenses(["notice"])  # keep
 
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
diff --git a/go/tink/signer.go b/go/tink/signer.go
index 9a399d4..a976b02 100644
--- a/go/tink/signer.go
+++ b/go/tink/signer.go
@@ -15,8 +15,10 @@
 package tink
 
 // Signer is the signing interface for digital signature.
-// Implementations of this interface are secure against adaptive chosen-message attacks.
-// Signing data ensures authenticity and integrity of that data, but not its secrecy.
+//
+// Implementations of this interface are secure against adaptive chosen-message
+// attacks.  Signing data ensures authenticity and integrity of that data, but
+// not its secrecy.
 type Signer interface {
 	// Computes the digital signature for data.
 	Sign(data []byte) ([]byte, error)
diff --git a/go/tink/verifier.go b/go/tink/verifier.go
index 88aacc7..d458db2 100644
--- a/go/tink/verifier.go
+++ b/go/tink/verifier.go
@@ -15,8 +15,10 @@
 package tink
 
 // Verifier is the verifying interface for digital signature.
-// Implementations of this interface are secure against adaptive chosen-message attacks.
-// Signing data ensures authenticity and integrity of that data, but not its secrecy.
+//
+// Implementations of this interface are secure against adaptive chosen-message
+// attacks.  Signing data ensures authenticity and integrity of that data, but
+// not its secrecy.
 type Verifier interface {
 	// Verifies returns nil if signature is a valid signature for data; otherwise returns an error.
 	Verify(signature, data []byte) error
diff --git a/java/BUILD.bazel b/java/BUILD.bazel
index 5589e78..72c6525 100644
--- a/java/BUILD.bazel
+++ b/java/BUILD.bazel
@@ -1,8 +1,9 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 full_proto_deps = [
+    "//proto:aes_cmac_java_proto",
     "//proto:aes_ctr_hmac_aead_java_proto",
     "//proto:aes_ctr_hmac_streaming_java_proto",
     "//proto:aes_ctr_java_proto",
@@ -27,6 +28,7 @@
 ]
 
 lite_proto_deps = [
+    "//proto:aes_cmac_java_proto_lite",
     "//proto:aes_ctr_hmac_aead_java_proto_lite",
     "//proto:aes_ctr_hmac_streaming_java_proto_lite",
     "//proto:aes_ctr_java_proto_lite",
@@ -69,8 +71,6 @@
     "//java/src/main/java/com/google/crypto/tink/config",
     "//java/src/main/java/com/google/crypto/tink/daead",
     "//java/src/main/java/com/google/crypto/tink/hybrid",
-    "//java/src/main/java/com/google/crypto/tink/integration/awskms",
-    "//java/src/main/java/com/google/crypto/tink/integration/gcpkms",
     "//java/src/main/java/com/google/crypto/tink/mac",
     "//java/src/main/java/com/google/crypto/tink/signature",
     "//java/src/main/java/com/google/crypto/tink/streamingaead",
@@ -105,6 +105,22 @@
     exports = java_deps,
 )
 
+java_library(
+    name = "awskms",
+    visibility = ["//visibility:public"],
+    exports = [
+        "//java/src/main/java/com/google/crypto/tink/integration/awskms",
+    ],
+)
+
+java_library(
+    name = "gcpkms",
+    visibility = ["//visibility:public"],
+    exports = [
+        "//java/src/main/java/com/google/crypto/tink/integration/gcpkms",
+    ],
+)
+
 # like :java, but for Android
 android_library(
     name = "android",
@@ -144,13 +160,29 @@
 load("//tools:gen_maven_jar_rules.bzl", "gen_maven_jar_rules")
 
 gen_maven_jar_rules(
-    name = "maven",
+    name = "tink",
     doctitle = "Tink Cryptography API",
     deps = full_proto_deps + java_deps + cleartext_deps + subtle_deps,
 )
 
 gen_maven_jar_rules(
-    name = "maven-android",
+    name = "tink-awskms",
+    doctitle = "Tink Cryptography API with AWS KMS",
+    deps = [
+        "//java/src/main/java/com/google/crypto/tink/integration/awskms",
+    ],
+)
+
+gen_maven_jar_rules(
+    name = "tink-gcpkms",
+    doctitle = "Tink Cryptography API with Google Cloud KMS",
+    deps = [
+        "//java/src/main/java/com/google/crypto/tink/integration/gcpkms",
+    ],
+)
+
+gen_maven_jar_rules(
+    name = "tink-android",
     doctitle = "Tink Cryptography API for Android",
     deps = lite_proto_deps + android_deps + cleartext_android_deps + subtle_deps,
 )
@@ -184,7 +216,7 @@
 )
 
 java_library(
-    name = "test_util",
+    name = "testutil",
     testonly = 1,
     srcs = glob([
         "src/test/**/TestUtil.java",
@@ -194,11 +226,10 @@
     ],
     deps = [
         ":testonly",
-        "@com_google_guava",
         "@com_google_protobuf_javalite//:protobuf_java_lite",
-        "@com_google_truth",
-        "@junit",
-        "@org_json",
+        "@maven//:com_google_truth_truth",
+        "@maven//:junit_junit",
+        "@maven//:org_json_json",
     ],
 )
 
@@ -212,24 +243,19 @@
     srcs = glob([
         "src/test/**/*.java",
     ]),
-    runtime_deps = [
-        "@net_bytebuddy_byte_buddy",
-        "@net_bytebuddy_byte_buddy_agent",
-        "@org_objenesis",
-    ],
     deps = [
+        ":awskms",
+        ":gcpkms",
         ":testonly",
-        "@com_amazonaws_aws_java_sdk_core",
-        "@com_amazonaws_aws_java_sdk_kms",
-        "@com_fasterxml_jackson_core",
-        "@com_google_api_client",
-        "@com_google_guava",
-        "@com_google_http_client",
         "@com_google_protobuf_javalite//:protobuf_java_lite",
-        "@com_google_truth",
-        "@junit",
-        "@org_json",
-        "@org_mockito_core",
+        "@maven//:com_amazonaws_aws_java_sdk_core",
+        "@maven//:com_amazonaws_aws_java_sdk_kms",
+        "@maven//:com_google_api_client_google_api_client",
+        "@maven//:com_google_http_client_google_http_client",
+        "@maven//:com_google_truth_truth",
+        "@maven//:junit_junit",
+        "@maven//:org_json_json",
+        "@maven//:org_mockito_mockito_core",
     ],
 )
 
@@ -254,6 +280,10 @@
         "src/test/java/com/google/crypto/tink/subtle/AesGcmJceTest",
         "src/test/java/com/google/crypto/tink/hybrid/EciesAeadHkdfHybridDecryptTest",
     ],
+    no_rbe_tests = [
+        "src/test/java/com/google/crypto/tink/aead/KmsAeadKeyManagerTest",
+        "src/test/java/com/google/crypto/tink/aead/KmsEnvelopeAeadKeyManagerTest",
+    ],
     test_files = glob(
         [
             "src/test/**/*Test.java",
diff --git a/java/src/main/java/com/google/crypto/tink/BUILD.bazel b/java/src/main/java/com/google/crypto/tink/BUILD.bazel
index e49ee55..9f03f75 100644
--- a/java/src/main/java/com/google/crypto/tink/BUILD.bazel
+++ b/java/src/main/java/com/google/crypto/tink/BUILD.bazel
@@ -1,4 +1,4 @@
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
@@ -34,6 +34,7 @@
         "StreamingAead.java",
     ],
     javacopts = JAVACOPTS_OSS,
+    visibility = ["//visibility:public"],
 )
 
 # restricted APIs
@@ -74,6 +75,7 @@
     name = "tink",
     srcs = [":srcs"],
     javacopts = JAVACOPTS_OSS,
+    visibility = ["//visibility:public"],
     deps = full_protos + [
         "//java/src/main/java/com/google/crypto/tink/annotations",
         "//java/src/main/java/com/google/crypto/tink/subtle",
@@ -99,6 +101,7 @@
     name = "android",
     srcs = [":android_srcs"],
     javacopts = JAVACOPTS_OSS,
+    visibility = ["//visibility:public"],
     deps = lite_protos + [
         "//java/src/main/java/com/google/crypto/tink/annotations",
         "//java/src/main/java/com/google/crypto/tink/subtle",
diff --git a/java/src/main/java/com/google/crypto/tink/Catalogue.java b/java/src/main/java/com/google/crypto/tink/Catalogue.java
index bff2264..1f62e51 100644
--- a/java/src/main/java/com/google/crypto/tink/Catalogue.java
+++ b/java/src/main/java/com/google/crypto/tink/Catalogue.java
@@ -31,7 +31,9 @@
  * handled by this catalogue.
  *
  * @since 1.0.0
+ * @deprecated Catalogues are no longer supported.
  */
+@Deprecated
 public interface Catalogue<P> {
   /**
    * @return a {@link KeyManager} for the given {@code typeUrl}, {@code primitiveName}, and version
diff --git a/java/src/main/java/com/google/crypto/tink/Config.java b/java/src/main/java/com/google/crypto/tink/Config.java
index 13b9029..e72b167 100644
--- a/java/src/main/java/com/google/crypto/tink/Config.java
+++ b/java/src/main/java/com/google/crypto/tink/Config.java
@@ -81,6 +81,18 @@
    */
   public static void registerKeyType(KeyTypeEntry entry) throws GeneralSecurityException {
     validate(entry);
+    // Catalogues are no longer supported; we simply return on those catalogues which have been
+    // removed, as the key managers will be registered already.
+    if (entry.getCatalogueName().equals("TinkAead")
+        || entry.getCatalogueName().equals("TinkMac")
+        || entry.getCatalogueName().equals("TinkHybridDecrypt")
+        || entry.getCatalogueName().equals("TinkHybridEncrypt")
+        || entry.getCatalogueName().equals("TinkPublicKeySign")
+        || entry.getCatalogueName().equals("TinkPublicKeyVerify")
+        || entry.getCatalogueName().equals("TinkStreamingAead")
+        || entry.getCatalogueName().equals("TinkDeterministicAead")) {
+      return;
+    }
     Catalogue<?> catalogue = Registry.getCatalogue(entry.getCatalogueName());
     Registry.registerPrimitiveWrapper(catalogue.getPrimitiveWrapper());
     KeyManager<?> keyManager =
diff --git a/java/src/main/java/com/google/crypto/tink/JsonKeysetWriter.java b/java/src/main/java/com/google/crypto/tink/JsonKeysetWriter.java
index 2b12ea0..f14f9f0 100644
--- a/java/src/main/java/com/google/crypto/tink/JsonKeysetWriter.java
+++ b/java/src/main/java/com/google/crypto/tink/JsonKeysetWriter.java
@@ -105,16 +105,16 @@
   private JSONObject toJson(Key key) throws JSONException {
     return new JSONObject()
         .put("keyData", toJson(key.getKeyData()))
-        .put("status", key.getStatus().toString())
+        .put("status", key.getStatus().name())
         .put("keyId", key.getKeyId())
-        .put("outputPrefixType", key.getOutputPrefixType().toString());
+        .put("outputPrefixType", key.getOutputPrefixType().name());
   }
 
   private JSONObject toJson(KeyData keyData) throws JSONException {
     return new JSONObject()
         .put("typeUrl", keyData.getTypeUrl())
         .put("value", Base64.encode(keyData.getValue().toByteArray()))
-        .put("keyMaterialType", keyData.getKeyMaterialType().toString());
+        .put("keyMaterialType", keyData.getKeyMaterialType().name());
   }
 
   private JSONObject toJson(EncryptedKeyset keyset) throws JSONException {
@@ -137,8 +137,8 @@
   private JSONObject toJson(KeyInfo keyInfo) throws JSONException {
     return new JSONObject()
         .put("typeUrl", keyInfo.getTypeUrl())
-        .put("status", keyInfo.getStatus().toString())
+        .put("status", keyInfo.getStatus().name())
         .put("keyId", keyInfo.getKeyId())
-        .put("outputPrefixType", keyInfo.getOutputPrefixType().toString());
+        .put("outputPrefixType", keyInfo.getOutputPrefixType().name());
   }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/KeyManagerBase.java b/java/src/main/java/com/google/crypto/tink/KeyManagerBase.java
deleted file mode 100644
index 7a3d5fa..0000000
--- a/java/src/main/java/com/google/crypto/tink/KeyManagerBase.java
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright 2018 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package com.google.crypto.tink;
-
-import com.google.crypto.tink.annotations.Alpha;
-import com.google.crypto.tink.proto.KeyData;
-import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
-import com.google.protobuf.ByteString;
-import com.google.protobuf.InvalidProtocolBufferException;
-import com.google.protobuf.MessageLite;
-import java.security.GeneralSecurityException;
-
-/**
- * A utility class to implement a {@code KeyManager}.
- *
- * <p>Implementing many of the methods in the {@code KeyManager} can be repetitive. This is an
- * internal utility class to implement these methods. In order to instantiate it, one calls
- * the constructor with class objects of the protos used and the type URL:
- *
- * <pre> {@code
- * class MyConcreteKeyManager
- *     extends KeyManagerBase<ConcretePrimitive, ConcreteKeyProto, ConcreteKeyFormatProto> {
- *   public MyConcreteKeyManager() {
- *     super(ConcreteKeyProto.class, ConcreteKeyFormatProto.class, TYPE_URL);
- *   }
- *   [...]
- * }</pre>
- * Furthermore, one implements all the abstract methods in this class.
- *
- * This code is currently Alpha and may change without warning.
- */
-@Alpha
-public abstract class KeyManagerBase<
-        P, KeyProto extends MessageLite, KeyFormatProto extends MessageLite>
-    implements KeyManager<P> {
-  protected KeyManagerBase(
-      final Class<P> primitiveClass,
-      final Class<KeyProto> keyProtoClass,
-      final Class<KeyFormatProto> keyFormatProtoClass,
-      final String typeUrl) {
-    this.primitiveClass = primitiveClass;
-    this.keyProtoClass = keyProtoClass;
-    this.keyFormatProtoClass = keyFormatProtoClass;
-    this.typeUrl = typeUrl;
-  }
-
-  private final Class<P> primitiveClass;
-  private final Class<KeyProto> keyProtoClass;
-  private final Class<KeyFormatProto> keyFormatProtoClass;
-  private final String typeUrl;
-
-  @SuppressWarnings("unchecked")
-  private static <Casted> Casted castOrSecurityException(
-      Object objectToCast, String exceptionText, Class<Casted> classObject)
-      throws GeneralSecurityException {
-    if (!classObject.isInstance(objectToCast)) {
-      throw new GeneralSecurityException(exceptionText);
-    }
-    return (Casted) objectToCast;
-  }
-
-  @Override
-  public final P getPrimitive(ByteString serializedKey) throws GeneralSecurityException {
-    try {
-      KeyProto keyProto = parseKeyProto(serializedKey);
-      return validateKeyAndGetPrimitive(keyProto);
-    } catch (InvalidProtocolBufferException e) {
-      throw new GeneralSecurityException(
-          "Failures parsing proto of type " + keyProtoClass.getName(), e);
-    }
-  }
-
-  @Override
-  public final P getPrimitive(MessageLite key) throws GeneralSecurityException {
-    return validateKeyAndGetPrimitive(
-        castOrSecurityException(
-            key, "Expected proto of type " + keyProtoClass.getName(), keyProtoClass));
-  }
-
-  /**
-   * @param serializedKeyFormat serialized {@code AesGcmKeyFormat} proto
-   * @return new {@code AesGcmKey} proto
-   */
-  @Override
-  public final MessageLite newKey(ByteString serializedKeyFormat) throws GeneralSecurityException {
-    try {
-      return validateFormatAndCreateKey(parseKeyFormatProto(serializedKeyFormat));
-    } catch (InvalidProtocolBufferException e) {
-      throw new GeneralSecurityException(
-          "Failures parsing proto of type " + keyFormatProtoClass.getName(), e);
-    }
-  }
-
-  /**
-   * @param keyFormat {@code AesGcmKeyFormat} proto
-   * @return new {@code AesGcmKey} proto
-   */
-  @Override
-  public final MessageLite newKey(MessageLite keyFormat) throws GeneralSecurityException {
-    return validateFormatAndCreateKey(
-        castOrSecurityException(
-            keyFormat,
-            "Expected proto of type " + keyFormatProtoClass.getName(),
-            keyFormatProtoClass));
-  }
-
-  @Override
-  public final boolean doesSupport(String typeUrl) {
-    return typeUrl.equals(getKeyType());
-  }
-
-  @Override
-  public final String getKeyType() {
-    return typeUrl;
-  }
-
-  /**
-   * @param serializedKeyFormat serialized {@code AesGcmKeyFormat} proto
-   * @return {@code KeyData} proto with a new {@code AesGcmKey} proto
-   */
-  @Override
-  public final KeyData newKeyData(ByteString serializedKeyFormat) throws GeneralSecurityException {
-    KeyFormatProto format;
-    try {
-      format = parseKeyFormatProto(serializedKeyFormat);
-    } catch (InvalidProtocolBufferException e) {
-      throw new GeneralSecurityException("Unexpected proto", e);
-    }
-    KeyProto key = validateFormatAndCreateKey(format);
-    return KeyData.newBuilder()
-        .setTypeUrl(getKeyType())
-        .setValue(key.toByteString())
-        .setKeyMaterialType(keyMaterialType())
-        .build();
-  }
-
-  @Override
-  public final Class<P> getPrimitiveClass() {
-    return primitiveClass;
-  }
-
-  /**
-   * Checks if the given {@code keyProto} is a valid key. Throws a GeneralSecurityException if it is
-   * not.
-   */
-  protected abstract void validateKey(KeyProto keyProto) throws GeneralSecurityException;
-
-  /**
-   * Checks if the given {@code keyProto} is a valid key format. Throws a GeneralSecurityException
-   * if it is not.
-   */
-  protected abstract void validateKeyFormat(KeyFormatProto keyProto)
-      throws GeneralSecurityException;
-
-  /** Returns the {@code KeyMaterialType} for this proto. */
-  protected abstract KeyMaterialType keyMaterialType();
-
-  /**
-   * Creates a primitive from a given key. Only called with validated {@code validatedKeyProto}s.
-   */
-  protected abstract P getPrimitiveFromKey(KeyProto validatedKeyProto)
-      throws GeneralSecurityException;
-
-  /** Creates a key proto after validating */
-  private P validateKeyAndGetPrimitive(KeyProto keyProto) throws GeneralSecurityException {
-    validateKey(keyProto);
-    return getPrimitiveFromKey(keyProto);
-  }
-
-  /**
-   * Creates a new key for a given format. Only called with validated {@code
-   * validatedKeyFormatProto}s. The returned {@code KeyProto} will be validated.
-   */
-  protected abstract KeyProto newKeyFromFormat(KeyFormatProto validatedKeyFormatProto)
-      throws GeneralSecurityException;
-
-  /**
-   * Validates the given {@code KeyFormatProto}, uses it to create a new key, validates it, then
-   * returns
-   */
-  private KeyProto validateFormatAndCreateKey(KeyFormatProto keyFormatProto)
-      throws GeneralSecurityException {
-    validateKeyFormat(keyFormatProto);
-    KeyProto result = newKeyFromFormat(keyFormatProto);
-    validateKey(result);
-    return result;
-  }
-
-  /**
-   * Parses a serialized key proto.
-   *
-   * <p>Should be implemented as {code return MyKeyProto.parseFrom(byteString);}.
-   */
-  protected abstract KeyProto parseKeyProto(ByteString byteString)
-      throws InvalidProtocolBufferException;
-
-  /**
-   * Parses a serialized key format proto.
-   *
-   * <p>Should be implemented as {code return MyKeyFormatProto.parseFrom(byteString);}.
-   */
-  protected abstract KeyFormatProto parseKeyFormatProto(ByteString byteString)
-      throws InvalidProtocolBufferException;
-}
diff --git a/java/src/main/java/com/google/crypto/tink/KeyManagerImpl.java b/java/src/main/java/com/google/crypto/tink/KeyManagerImpl.java
new file mode 100644
index 0000000..d7e9a40
--- /dev/null
+++ b/java/src/main/java/com/google/crypto/tink/KeyManagerImpl.java
@@ -0,0 +1,180 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.google.crypto.tink;
+
+import com.google.crypto.tink.annotations.Alpha;
+import com.google.crypto.tink.proto.KeyData;
+import com.google.protobuf.ByteString;
+import com.google.protobuf.InvalidProtocolBufferException;
+import com.google.protobuf.MessageLite;
+import java.security.GeneralSecurityException;
+
+/**
+ * Implementation of the {@link KeyManager} interface based on an {@link KeyTypeManager}.
+ *
+ * <p>Choosing {@code PrimitiveT} equal to {@link java.lang.Void} is valid; in this case the
+ * functions {@link #getPrimitive} will throw if invoked.
+ *
+ * <p>TODO(tholenst): Visibility restrict to package visibility once all key managers are migrated
+ * to KeyTypeManager's.
+ */
+@Alpha
+public class KeyManagerImpl<PrimitiveT, KeyProtoT extends MessageLite>
+    implements KeyManager<PrimitiveT> {
+  public KeyManagerImpl(
+      KeyTypeManager<KeyProtoT> keyTypeManager, Class<PrimitiveT> primitiveClass) {
+    if (!keyTypeManager.supportedPrimitives().contains(primitiveClass)
+        && !Void.class.equals(primitiveClass)) {
+      throw new IllegalArgumentException(
+          String.format(
+              "Given internalKeyMananger %s does not support primitive class %s",
+              keyTypeManager.toString(), primitiveClass.getName()));
+    }
+    this.keyTypeManager = keyTypeManager;
+    this.primitiveClass = primitiveClass;
+  }
+
+  private final KeyTypeManager<KeyProtoT> keyTypeManager;
+  private final Class<PrimitiveT> primitiveClass;
+
+  private static <CastedT> CastedT castOrThrowSecurityException(
+      Object objectToCast, String exceptionText, Class<CastedT> classObject)
+      throws GeneralSecurityException {
+    if (!classObject.isInstance(objectToCast)) {
+      throw new GeneralSecurityException(exceptionText);
+    }
+    @SuppressWarnings("unchecked")
+    CastedT result = (CastedT) objectToCast;
+    return result;
+  }
+
+  @Override
+  public final PrimitiveT getPrimitive(ByteString serializedKey) throws GeneralSecurityException {
+    try {
+      KeyProtoT keyProto = keyTypeManager.parseKey(serializedKey);
+      return validateKeyAndGetPrimitive(keyProto);
+    } catch (InvalidProtocolBufferException e) {
+      throw new GeneralSecurityException(
+          "Failures parsing proto of type " + keyTypeManager.getKeyClass().getName(), e);
+    }
+  }
+
+  @Override
+  public final PrimitiveT getPrimitive(MessageLite key) throws GeneralSecurityException {
+    return validateKeyAndGetPrimitive(
+        castOrThrowSecurityException(
+            key,
+            "Expected proto of type " + keyTypeManager.getKeyClass().getName(),
+            keyTypeManager.getKeyClass()));
+  }
+
+  @Override
+  public final MessageLite newKey(ByteString serializedKeyFormat) throws GeneralSecurityException {
+    try {
+      return keyFactoryHelper().parseValidateCreate(serializedKeyFormat);
+    } catch (InvalidProtocolBufferException e) {
+      throw new GeneralSecurityException(
+          "Failures parsing proto of type "
+              + keyTypeManager.keyFactory().getKeyFormatClass().getName(),
+          e);
+    }
+  }
+
+  @Override
+  public final MessageLite newKey(MessageLite keyFormat) throws GeneralSecurityException {
+    return keyFactoryHelper().castValidateCreate(keyFormat);
+  }
+
+  @Override
+  public final boolean doesSupport(String typeUrl) {
+    return typeUrl.equals(getKeyType());
+  }
+
+  @Override
+  public final String getKeyType() {
+    return keyTypeManager.getKeyType();
+  }
+
+  @Override
+  public int getVersion() {
+    return keyTypeManager.getVersion();
+  }
+
+  @Override
+  public final KeyData newKeyData(ByteString serializedKeyFormat) throws GeneralSecurityException {
+    try {
+      KeyProtoT key = keyFactoryHelper().parseValidateCreate(serializedKeyFormat);
+      return KeyData.newBuilder()
+          .setTypeUrl(getKeyType())
+          .setValue(key.toByteString())
+          .setKeyMaterialType(keyTypeManager.keyMaterialType())
+          .build();
+    } catch (InvalidProtocolBufferException e) {
+      throw new GeneralSecurityException("Unexpected proto", e);
+    }
+  }
+
+  @Override
+  public final Class<PrimitiveT> getPrimitiveClass() {
+    return primitiveClass;
+  }
+
+  private PrimitiveT validateKeyAndGetPrimitive(KeyProtoT keyProto)
+      throws GeneralSecurityException {
+    if (Void.class.equals(primitiveClass)) {
+      throw new GeneralSecurityException("Cannot create a primitive for Void");
+    }
+    keyTypeManager.validateKey(keyProto);
+    return keyTypeManager.getPrimitive(keyProto, primitiveClass);
+  }
+
+  /**
+   * A helper class which exposes functions bundling multiple functions of the given {@link
+   * KeyTypeManager.KeyFactory}.
+   *
+   * <p>The KeyFactory uses generics. By bundling functions in a class which uses the same generics
+   * we can refer to the types in code.
+   */
+  private static class KeyFactoryHelper<
+      KeyFormatProtoT extends MessageLite, KeyProtoT extends MessageLite> {
+    KeyFactoryHelper(KeyTypeManager.KeyFactory<KeyFormatProtoT, KeyProtoT> keyFactory) {
+      this.keyFactory = keyFactory;
+    }
+
+    final KeyTypeManager.KeyFactory<KeyFormatProtoT, KeyProtoT> keyFactory;
+
+    private KeyProtoT validateCreate(KeyFormatProtoT keyFormat) throws GeneralSecurityException {
+      keyFactory.validateKeyFormat(keyFormat);
+      return keyFactory.createKey(keyFormat);
+    }
+
+    KeyProtoT parseValidateCreate(ByteString serializedKeyFormat)
+        throws GeneralSecurityException, InvalidProtocolBufferException {
+      return validateCreate(keyFactory.parseKeyFormat(serializedKeyFormat));
+    }
+
+    KeyProtoT castValidateCreate(MessageLite message) throws GeneralSecurityException {
+      return validateCreate(
+          castOrThrowSecurityException(
+              message,
+              "Expected proto of type " + keyFactory.getKeyFormatClass().getName(),
+              keyFactory.getKeyFormatClass()));
+    }
+  }
+
+  private KeyFactoryHelper<?, KeyProtoT> keyFactoryHelper() {
+    return new KeyFactoryHelper<>(keyTypeManager.keyFactory());
+  }
+}
diff --git a/java/src/main/java/com/google/crypto/tink/KeyTypeManager.java b/java/src/main/java/com/google/crypto/tink/KeyTypeManager.java
new file mode 100644
index 0000000..17c2874
--- /dev/null
+++ b/java/src/main/java/com/google/crypto/tink/KeyTypeManager.java
@@ -0,0 +1,221 @@
+// Copyright 2019 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.google.crypto.tink;
+
+import com.google.crypto.tink.annotations.Alpha;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
+import com.google.protobuf.ByteString;
+import com.google.protobuf.InvalidProtocolBufferException;
+import com.google.protobuf.MessageLite;
+import java.security.GeneralSecurityException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * An object which collects all the operations which one can do on for a single key type, identified
+ * by a single KeyProto.
+ *
+ * <p>A KeyTypeManager manages all the operations one can do on a given KeyProto. This includes
+ * generating primitives, generating keys (if applicable), parsing and validating keys and key
+ * formats. This object is meant to be implemented, i.e., one should use it via the {@link
+ * Registry}, and not directly.
+ *
+ * <p>In order to implement a new key manager, one should subclass this class, setting the type
+ * parameter to the proto of the corresponding key (e.g., subclass {@code
+ * KeyTypeManager<AesGcmKey>}).
+ *
+ * <p>For each primitive the key manager should implement, one needs to add an argument to the
+ * constructor. The type of it should be a {@code PrimitiveFactory<PrimitiveT, KeyT>}, an object
+ * which knows how to produce primitives.
+ *
+ * <p>If the key manager can create new keys, one also needs to implement the method {@code
+ * #keyFactory}. In this case it needs to return an object of type {@code KeyFactory<KeyFormatProto,
+ * KeyProtoT>}, where one has to specify a proto for the key format as well.
+ */
+@Alpha
+public abstract class KeyTypeManager<KeyProtoT extends MessageLite> {
+  /** A PrimitiveFactory knows how to create primitives from a given key. */
+  protected abstract static class PrimitiveFactory<PrimitiveT, KeyT> {
+    private final Class<PrimitiveT> clazz;
+
+    public PrimitiveFactory(Class<PrimitiveT> clazz) {
+      this.clazz = clazz;
+    }
+
+    /**
+     * Returns the class object corresponding to the generic parameter {@code PrimitiveT}.
+     */
+    final Class<PrimitiveT> getPrimitiveClass() {
+      return clazz;
+    }
+
+    /** Creates a new instance of {@code PrimitiveT}. */
+    public abstract PrimitiveT getPrimitive(KeyT key) throws GeneralSecurityException;
+  }
+
+  private final Class<KeyProtoT> clazz;
+
+  private final Map<Class<?>, PrimitiveFactory<?, KeyProtoT>> factories;
+  private final Class<?> firstPrimitiveClass;
+
+  /**
+   * Constructs a new KeyTypeManager.
+   *
+   * <p>Takes an arbitrary number of {@link PrimitiveFactory} objects as input. These will be used
+   * and provided via {@link #createPrimitive} to the user.
+   *
+   * @throws IllegalArgumentException if two of the passed in factories produce primitives of the
+   *     same class.
+   */
+  @SafeVarargs // Safe because we do not reference the array (see Effective Java ed. 3, Item 32).
+  protected KeyTypeManager(Class<KeyProtoT> clazz, PrimitiveFactory<?, KeyProtoT>... factories) {
+    this.clazz = clazz;
+    Map<Class<?>, PrimitiveFactory<?, KeyProtoT>> factoriesMap = new HashMap<>();
+    for (PrimitiveFactory<?, KeyProtoT> factory : factories) {
+      if (factoriesMap.containsKey(factory.getPrimitiveClass())) {
+        throw new IllegalArgumentException(
+            "KeyTypeManager constructed with duplicate factories for primitive "
+                + factory.getPrimitiveClass().getCanonicalName());
+      }
+      factoriesMap.put(factory.getPrimitiveClass(), factory);
+    }
+    if (factories.length > 0) {
+      this.firstPrimitiveClass = factories[0].getPrimitiveClass();
+    } else {
+      this.firstPrimitiveClass = Void.class;
+    }
+    this.factories = Collections.unmodifiableMap(factoriesMap);
+  }
+
+  /** Returns the class corresponding to the key protobuffer. */
+  public final Class<KeyProtoT> getKeyClass() {
+    return clazz;
+  }
+
+  /** Returns the type URL that identifies the key type of keys managed by this KeyManager. */
+  public abstract String getKeyType();
+
+  /** Returns the version number of this KeyManager. */
+  public abstract int getVersion();
+
+  /** Returns the {@link KeyMaterialType} for this proto. */
+  public abstract KeyMaterialType keyMaterialType();
+
+  /**
+   * Parses a serialized key proto.
+   *
+   * <p>Implement as {@code return KeyProtoT.parseFrom(byteString);}.
+   */
+  public abstract KeyProtoT parseKey(ByteString byteString) throws InvalidProtocolBufferException;
+
+  /**
+   * Checks if the given {@code keyProto} is a valid key.
+   *
+   * @throws GeneralSecurityException if the passed {@code keyProto} is not valid in any way.
+   */
+  public abstract void validateKey(KeyProtoT keyProto) throws GeneralSecurityException;
+
+  /**
+   * Creates the requested primitive.
+   *
+   * @throws java.lang.IllegalArgumentException if the given {@code primitiveClass} is not supported
+   *     (i.e., not returned by {@link #supportedPrimitives}.
+   * @throws GeneralSecurityException if the underlying factory throws a GeneralSecurityException
+   *     creating the primitive.
+   */
+  public final <P> P getPrimitive(KeyProtoT key, Class<P> primitiveClass)
+      throws GeneralSecurityException {
+    @SuppressWarnings("unchecked") //  factories maps Class<P> to PrimitiveFactory<P, KeyProtoT>.
+    PrimitiveFactory<P, KeyProtoT> factory =
+        (PrimitiveFactory<P, KeyProtoT>) factories.get(primitiveClass);
+    if (factory == null) {
+      throw new IllegalArgumentException(
+          "Requested primitive class " + primitiveClass.getCanonicalName() + " not supported.");
+    }
+    return factory.getPrimitive(key);
+  }
+
+  /**
+   * Returns a set containing the supported primitives.
+   */
+  public final Set<Class<?>> supportedPrimitives() {
+    return factories.keySet();
+  }
+
+  /**
+   * Returns the first class object of the first supported primitive, or {@code Class<Void>} if the
+   * key manager supports no primitive at all.
+   */
+  final Class<?> firstSupportedPrimitiveClass() {
+    return firstPrimitiveClass;
+  }
+
+  /**
+   * A {@code KeyFactory} creates new keys from a given KeyFormat.
+   *
+   * <p>A KeyFactory implements all the methods which are required if a KeyTypeManager should also
+   * be able to generate keys. In particular, in this case it needs to have some KeyFormat protocol
+   * buffer which can be validated, parsed, and from which a key can be generated.
+   */
+  public abstract static class KeyFactory<KeyFormatProtoT extends MessageLite, KeyT> {
+    private final Class<KeyFormatProtoT> clazz;
+    public KeyFactory(Class<KeyFormatProtoT> clazz) {
+      this.clazz = clazz;
+    }
+
+    /**
+     * Returns the class corresponding to the key format protobuffer.
+     */
+    public final Class<KeyFormatProtoT> getKeyFormatClass() {
+      return clazz;
+    }
+
+    /**
+     * Checks if the given {@code keyFormatProto} is a valid key.
+     *
+     * @throws GeneralSecurityException if the passed {@code keyFormatProto} is not valid in any
+     *     way.
+     */
+    public abstract void validateKeyFormat(KeyFormatProtoT keyFormatProto)
+        throws GeneralSecurityException;
+
+    /**
+     * Parses a serialized key proto.
+     *
+     * <p>Implement as {@code return KeyFormatProtoT.parseFrom(byteString);}.
+     */
+    public abstract KeyFormatProtoT parseKeyFormat(ByteString byteString)
+        throws InvalidProtocolBufferException;
+
+    /** Creates a new key from a given format. */
+    public abstract KeyT createKey(KeyFormatProtoT keyFormat) throws GeneralSecurityException;
+  }
+
+  /**
+   * Returns the {@link KeyFactory} for this key type.
+   *
+   * <p>By default, this throws an UnsupportedOperationException. Hence, if an implementation does
+   * not support creating primitives, no implementation is required.
+   *
+   * @throws UnsupportedOperationException if the manager does not support creating primitives.
+   */
+  public KeyFactory<?, KeyProtoT> keyFactory() {
+    throw new UnsupportedOperationException("Creating keys is not supported.");
+  }
+}
diff --git a/java/src/main/java/com/google/crypto/tink/KeysetHandle.java b/java/src/main/java/com/google/crypto/tink/KeysetHandle.java
index ab9be1d..9de133c 100644
--- a/java/src/main/java/com/google/crypto/tink/KeysetHandle.java
+++ b/java/src/main/java/com/google/crypto/tink/KeysetHandle.java
@@ -16,7 +16,6 @@
 
 package com.google.crypto.tink;
 
-import com.google.crypto.tink.annotations.Alpha;
 import com.google.crypto.tink.proto.EncryptedKeyset;
 import com.google.crypto.tink.proto.KeyData;
 import com.google.crypto.tink.proto.KeyTemplate;
@@ -143,6 +142,20 @@
     return;
   }
 
+  /**
+   * Tries to write to {@code writer} this keyset which must not contain any secret key material.
+   *
+   * <p>This can be used to persist public keysets or envelope encryption keysets. Users that need
+   * to persist cleartext keysets can use {@link CleartextKeysetHandle}.
+   *
+   * @throws GeneralSecurityException if the keyset contains any secret key material
+   */
+  public void writeNoSecret(KeysetWriter writer) throws GeneralSecurityException, IOException {
+    assertNoSecretKeyMaterial(keyset);
+    writer.write(keyset);
+    return;
+  }
+
   /** Encrypts the keyset with the {@link Aead} master key. */
   private static EncryptedKeyset encrypt(Keyset keyset, Aead masterKey)
       throws GeneralSecurityException {
@@ -236,13 +249,16 @@
       if (key.getKeyData().getKeyMaterialType() == KeyData.KeyMaterialType.UNKNOWN_KEYMATERIAL
           || key.getKeyData().getKeyMaterialType() == KeyData.KeyMaterialType.SYMMETRIC
           || key.getKeyData().getKeyMaterialType() == KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE) {
-        throw new GeneralSecurityException("keyset contains secret key material");
+        throw new GeneralSecurityException(
+            String.format(
+                "keyset contains key material of type %s for type url %s",
+                key.getKeyData().getKeyMaterialType(), key.getKeyData().getTypeUrl()));
       }
     }
   }
 
   /**
-   * Validates that an keyset handle contains enough key material to build a keyset on.
+   * Validates that a keyset handle contains enough key material to build a keyset on.
    *
    * @throws GeneralSecurityException
    */
@@ -278,7 +294,6 @@
    * registry to get resources creating the primitive. The given keyManager will take precedence
    * when creating primitives over the globally registered keyManagers.
    */
-  @Alpha
   public <P> P getPrimitive(KeyManager<P> customKeyManager, Class<P> classObject)
       throws GeneralSecurityException {
     if (customKeyManager == null) {
diff --git a/java/src/main/java/com/google/crypto/tink/KeysetManager.java b/java/src/main/java/com/google/crypto/tink/KeysetManager.java
index 45703f0..f925b4e 100644
--- a/java/src/main/java/com/google/crypto/tink/KeysetManager.java
+++ b/java/src/main/java/com/google/crypto/tink/KeysetManager.java
@@ -243,16 +243,20 @@
   }
 
   @GuardedBy("this")
+  private synchronized boolean keyIdExists(int keyId) {
+    for (Keyset.Key key : keysetBuilder.getKeyList()) {
+      if (key.getKeyId() == keyId) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  @GuardedBy("this")
   private synchronized int newKeyId() {
     int keyId = randPositiveInt();
-    while (true) {
-      for (Keyset.Key key : keysetBuilder.getKeyList()) {
-        if (key.getKeyId() == keyId) {
-          keyId = randPositiveInt();
-          continue;
-        }
-      }
-      break;
+    while (keyIdExists(keyId)) {
+      keyId = randPositiveInt();
     }
     return keyId;
   }
diff --git a/java/src/main/java/com/google/crypto/tink/PrimitiveSet.java b/java/src/main/java/com/google/crypto/tink/PrimitiveSet.java
index 816e50f..97bc477 100644
--- a/java/src/main/java/com/google/crypto/tink/PrimitiveSet.java
+++ b/java/src/main/java/com/google/crypto/tink/PrimitiveSet.java
@@ -58,7 +58,7 @@
     // The actual primitive.
     private final P primitive;
     // Identifies the primitive within the set.
-    // It is the ciphertext prefix of the correponding key.
+    // It is the ciphertext prefix of the corresponding key.
     private final byte[] identifier;
     // The status of the key represented by the primitive.
     private final KeyStatusType status;
@@ -103,18 +103,23 @@
   }
 
   /** @return all primitives using RAW prefix. */
-  public List<Entry<P>> getRawPrimitives() throws GeneralSecurityException {
+  public List<Entry<P>> getRawPrimitives() {
     return getPrimitive(CryptoFormat.RAW_PREFIX);
   }
 
   /** @return the entries with primitive identifed by {@code identifier}. */
-  public List<Entry<P>> getPrimitive(final byte[] identifier) throws GeneralSecurityException {
+  public List<Entry<P>> getPrimitive(final byte[] identifier) {
     List<Entry<P>> found = primitives.get(new String(identifier, UTF_8));
     return found != null ? found : Collections.<Entry<P>>emptyList();
   }
 
+  /** Returns the entries with primitives identified by the ciphertext prefix of {@code key}. */
+  protected List<Entry<P>> getPrimitive(Keyset.Key key) throws GeneralSecurityException {
+    return getPrimitive(CryptoFormat.getOutputPrefix(key));
+  }
+
   /** @return all primitives */
-  public Collection<List<Entry<P>>> getAll() throws GeneralSecurityException {
+  public Collection<List<Entry<P>>> getAll() {
     return primitives.values();
   }
 
@@ -137,13 +142,19 @@
     return new PrimitiveSet<P>(primitiveClass);
   }
 
-  /** @return the entries with primitives identified by the ciphertext prefix of {@code key}. */
-  protected List<Entry<P>> getPrimitive(Keyset.Key key) throws GeneralSecurityException {
-    return getPrimitive(CryptoFormat.getOutputPrefix(key));
-  }
-
   /** Sets given Entry {@code primary} as the primary one. */
   public void setPrimary(final Entry<P> primary) {
+    if (primary == null) {
+      throw new IllegalArgumentException("the primary entry must be non-null");
+    }
+    if (primary.getStatus() != KeyStatusType.ENABLED) {
+      throw new IllegalArgumentException("the primary entry has to be ENABLED");
+    }
+    List<Entry<P>> entries = getPrimitive(primary.getIdentifier());
+    if (entries.isEmpty()) {
+      throw new IllegalArgumentException(
+          "the primary entry cannot be set to an entry which is not held by this primitive set");
+    }
     this.primary = primary;
   }
 
@@ -154,6 +165,9 @@
    */
   public Entry<P> addPrimitive(final P primitive, Keyset.Key key)
       throws GeneralSecurityException {
+    if (key.getStatus() != KeyStatusType.ENABLED) {
+      throw new GeneralSecurityException("only ENABLED key is allowed");
+    }
     Entry<P> entry =
         new Entry<P>(
             primitive,
diff --git a/java/src/main/java/com/google/crypto/tink/PrivateKeyManagerImpl.java b/java/src/main/java/com/google/crypto/tink/PrivateKeyManagerImpl.java
new file mode 100644
index 0000000..63b147a
--- /dev/null
+++ b/java/src/main/java/com/google/crypto/tink/PrivateKeyManagerImpl.java
@@ -0,0 +1,66 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.google.crypto.tink;
+
+import com.google.crypto.tink.annotations.Alpha;
+import com.google.crypto.tink.proto.KeyData;
+import com.google.protobuf.ByteString;
+import com.google.protobuf.InvalidProtocolBufferException;
+import com.google.protobuf.MessageLite;
+import java.security.GeneralSecurityException;
+
+/**
+ * Implementation of the {@link PrivateKeyManager} interface based on an {@link
+ * PrivateKeyTypeManager} and the corresponding public key manager, implemented by an {@link
+ * KeyTypeManager}.
+ *
+ * <p>Choosing {@code PrimitiveT} equal to {@link java.lang.Void} is valid; in this case the
+ * functions {@link #getPrimitive} will throw if invoked.
+ * TODO(tholenst) Reduce visibility to package visible once all managers have been migrated.
+ */
+@Alpha
+public class PrivateKeyManagerImpl<
+        PrimitiveT, KeyProtoT extends MessageLite, PublicKeyProtoT extends MessageLite>
+    extends KeyManagerImpl<PrimitiveT, KeyProtoT> implements PrivateKeyManager<PrimitiveT> {
+
+  private final PrivateKeyTypeManager<KeyProtoT, PublicKeyProtoT> privateKeyManager;
+  private final KeyTypeManager<PublicKeyProtoT> publicKeyManager;
+
+  public PrivateKeyManagerImpl(
+      PrivateKeyTypeManager<KeyProtoT, PublicKeyProtoT> privateKeyManager,
+      KeyTypeManager<PublicKeyProtoT> publicKeyManager,
+      Class<PrimitiveT> primitiveClass) {
+    super(privateKeyManager, primitiveClass);
+    this.privateKeyManager = privateKeyManager;
+    this.publicKeyManager = publicKeyManager;
+  }
+
+  @Override
+  public KeyData getPublicKeyData(ByteString serializedKey) throws GeneralSecurityException {
+    try {
+      KeyProtoT privKeyProto = privateKeyManager.parseKey(serializedKey);
+      privateKeyManager.validateKey(privKeyProto);
+      PublicKeyProtoT publicKeyProto = privateKeyManager.getPublicKey(privKeyProto);
+      publicKeyManager.validateKey(publicKeyProto);
+      return KeyData.newBuilder()
+          .setTypeUrl(publicKeyManager.getKeyType())
+          .setValue(publicKeyProto.toByteString())
+          .setKeyMaterialType(publicKeyManager.keyMaterialType())
+          .build();
+    } catch (InvalidProtocolBufferException e) {
+      throw new GeneralSecurityException("expected serialized proto of type ", e);
+    }
+  }
+}
diff --git a/java/src/main/java/com/google/crypto/tink/PrivateKeyTypeManager.java b/java/src/main/java/com/google/crypto/tink/PrivateKeyTypeManager.java
new file mode 100644
index 0000000..b9cd557
--- /dev/null
+++ b/java/src/main/java/com/google/crypto/tink/PrivateKeyTypeManager.java
@@ -0,0 +1,49 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.google.crypto.tink;
+
+import com.google.crypto.tink.annotations.Alpha;
+import com.google.protobuf.MessageLite;
+import java.security.GeneralSecurityException;
+
+/**
+ * A PrivateKeyManager is like an {@link KeyTypeManager}, but additionally has a method to create a
+ * public key.
+ */
+@Alpha
+public abstract class PrivateKeyTypeManager<
+        KeyProtoT extends MessageLite, PublicKeyProtoT extends MessageLite>
+    extends KeyTypeManager<KeyProtoT> {
+
+  @SafeVarargs // Safe because super() is marked as safe.
+  protected PrivateKeyTypeManager(
+      Class<KeyProtoT> clazz,
+      Class<PublicKeyProtoT> publicKeyClazz,
+      KeyTypeManager.PrimitiveFactory<?, KeyProtoT>... factories) {
+    super(clazz, factories);
+    this.publicKeyClazz = publicKeyClazz;
+  }
+
+  private final Class<PublicKeyProtoT> publicKeyClazz;
+
+  /** Returns the class corresponding to the public key protobuffer. */
+  public final Class<PublicKeyProtoT> getPublicKeyClass() {
+    return publicKeyClazz;
+  }
+
+  /** Creates a public key from the given private key. */
+  public abstract PublicKeyProtoT getPublicKey(KeyProtoT keyProto)
+      throws GeneralSecurityException;
+}
diff --git a/java/src/main/java/com/google/crypto/tink/Registry.java b/java/src/main/java/com/google/crypto/tink/Registry.java
index 28be54c..a7feac1 100644
--- a/java/src/main/java/com/google/crypto/tink/Registry.java
+++ b/java/src/main/java/com/google/crypto/tink/Registry.java
@@ -23,6 +23,8 @@
 import com.google.protobuf.ByteString;
 import com.google.protobuf.MessageLite;
 import java.security.GeneralSecurityException;
+import java.util.Collections;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.logging.Logger;
@@ -33,17 +35,20 @@
  * <p>Registry maps catalogue names to instances of {@link Catalogue} and each supported key type to
  * a corresponding {@link KeyManager} object, which "understands" the key type (i.e., the KeyManager
  * can instantiate the primitive corresponding to given key, or can generate new keys of the
- * supported key type). Keeping KeyManagers for all primitives in a single Registry (rather than
+ * supported key type). It holds also a {@link PrimitiveWrapper} for each supported primitive,
+ * so that it can wrap a set of primitives (corresponding to a keyset) into a single primitive.
+ *
+ * <p> Keeping KeyManagers for all primitives in a single Registry (rather than
  * having a separate KeyManager per primitive) enables modular construction of compound primitives
  * from "simple" ones, e.g., AES-CTR-HMAC AEAD encryption uses IND-CPA encryption and a MAC.
  *
  * <p>Registry is initialized at startup, and is later used to instantiate primitives for given keys
  * or keysets. Note that regular users will usually not work directly with Registry, but rather via
- * {@link Config} and primitive factories which in the background register and query the Registry
- * for specific KeyManagers. Registry is public though, to enable configurations with custom
- * catalogues, primitives or KeyManagers.
+ * {@link Config} and {@link KeysetHandle#getPrimitive()}-methods, which in the background register
+ * and query the Registry for specific KeyManagers and PrimitiveWrappers. Registry is public though,
+ * to enable configurations with custom catalogues, primitives or KeyManagers.
  *
- * <p>To initialize the Registry with all key managers in Tink 1.0.0, one can do as follows:
+ * <p>To initialize the Registry with all key managers:
  *
  * <pre>{@code
  * TinkConfig.register();
@@ -68,19 +73,175 @@
 public final class Registry {
   private static final Logger logger = Logger.getLogger(Registry.class.getName());
 
-  @SuppressWarnings("rawtypes")
-  private static final ConcurrentMap<String, KeyManager> keyManagerMap =
-      new ConcurrentHashMap<String, KeyManager>(); // typeUrl -> KeyManager mapping
+  private static final ConcurrentMap<String, KeyManagerContainer> keyManagerMap =
+      new ConcurrentHashMap<>(); // typeUrl -> KeyManager mapping
 
   private static final ConcurrentMap<String, Boolean> newKeyAllowedMap =
-      new ConcurrentHashMap<String, Boolean>(); // typeUrl -> newKeyAllowed mapping
+      new ConcurrentHashMap<>(); // typeUrl -> newKeyAllowed mapping
 
-  @SuppressWarnings("rawtypes")
-  private static final ConcurrentMap<String, Catalogue> catalogueMap =
-      new ConcurrentHashMap<String, Catalogue>(); //  name -> catalogue mapping
+  private static final ConcurrentMap<String, Catalogue<?>> catalogueMap =
+      new ConcurrentHashMap<>(); //  name -> catalogue mapping
 
   private static final ConcurrentMap<Class<?>, PrimitiveWrapper<?>> primitiveWrapperMap =
-      new ConcurrentHashMap<Class<?>, PrimitiveWrapper<?>>();
+      new ConcurrentHashMap<>();
+
+  /**
+   * A container which either is constructed from a {@link KeyTypeManager} or from a {@link
+   * KeyManager}.
+   */
+  private static interface KeyManagerContainer {
+    /**
+     * Returns the KeyManager for the given primitive or throws if the given primitive is not in
+     * supportedPrimitives.
+     */
+    <P> KeyManager<P> getKeyManager(Class<P> primitiveClass) throws GeneralSecurityException;
+
+    /** Returns some KeyManager from the given one. */
+    KeyManager<?> getUntypedKeyManager();
+
+    /**
+     * The Class object corresponding to the actual KeyTypeManager/KeyManager used to build this
+     * object.
+     */
+    Class<?> getImplementingClass();
+
+    /**
+     * The primitives supported by the underlying {@link KeyTypeManager} resp. {@link KeyManager}.
+     */
+    Set<Class<?>> supportedPrimitives();
+
+    /**
+     * The Class object corresponding to the public key manager when this key manager was registered
+     * as first argument with "registerAsymmetricKeyManagers". Null otherwise.
+     */
+    Class<?> publicKeyManagerClassOrNull();
+  }
+
+  private static <P> KeyManagerContainer createContainerFor(KeyManager<P> keyManager) {
+    final KeyManager<P> localKeyManager = keyManager;
+    return new KeyManagerContainer() {
+      @Override
+      public <Q> KeyManager<Q> getKeyManager(Class<Q> primitiveClass)
+          throws GeneralSecurityException {
+        if (!localKeyManager.getPrimitiveClass().equals(primitiveClass)) {
+          throw new InternalError(
+              "This should never be called, as we always first check supportedPrimitives.");
+        }
+        @SuppressWarnings("unchecked") // We checked equality of the primitiveClass objects.
+        KeyManager<Q> result = (KeyManager<Q>) localKeyManager;
+        return result;
+      }
+
+      @Override
+      public KeyManager<?> getUntypedKeyManager() {
+        return localKeyManager;
+      }
+
+      @Override
+      public Class<?> getImplementingClass() {
+        return localKeyManager.getClass();
+      }
+
+      @Override
+      public Set<Class<?>> supportedPrimitives() {
+        return Collections.<Class<?>>singleton(localKeyManager.getPrimitiveClass());
+      }
+
+      @Override
+      public Class<?> publicKeyManagerClassOrNull() {
+        return null;
+      }
+    };
+  }
+
+  private static <KeyProtoT extends MessageLite> KeyManagerContainer createContainerFor(
+      KeyTypeManager<KeyProtoT> keyManager) {
+    final KeyTypeManager<KeyProtoT> localKeyManager = keyManager;
+    return new KeyManagerContainer() {
+      @Override
+      public <Q> KeyManager<Q> getKeyManager(Class<Q> primitiveClass)
+          throws GeneralSecurityException {
+        try {
+          return new KeyManagerImpl<>(localKeyManager, primitiveClass);
+        } catch (IllegalArgumentException e) {
+          throw new GeneralSecurityException("Primitive type not supported", e);
+        }
+      }
+
+      @Override
+      public KeyManager<?> getUntypedKeyManager() {
+        return new KeyManagerImpl<>(
+            localKeyManager, localKeyManager.firstSupportedPrimitiveClass());
+      }
+
+      @Override
+      public Class<?> getImplementingClass() {
+        return localKeyManager.getClass();
+      }
+
+      @Override
+      public Set<Class<?>> supportedPrimitives() {
+        return localKeyManager.supportedPrimitives();
+      }
+
+      @Override
+      public Class<?> publicKeyManagerClassOrNull() {
+        return null;
+      }
+    };
+  }
+
+  private static <KeyProtoT extends MessageLite, PublicKeyProtoT extends MessageLite>
+      KeyManagerContainer createPrivateKeyContainerFor(
+          final PrivateKeyTypeManager<KeyProtoT, PublicKeyProtoT> privateKeyTypeManager,
+          final KeyTypeManager<PublicKeyProtoT> publicKeyTypeManager) {
+    final PrivateKeyTypeManager<KeyProtoT, PublicKeyProtoT> localPrivateKeyManager =
+        privateKeyTypeManager;
+    final KeyTypeManager<PublicKeyProtoT> localPublicKeyManager = publicKeyTypeManager;
+    return new KeyManagerContainer() {
+      @Override
+      public <Q> KeyManager<Q> getKeyManager(Class<Q> primitiveClass)
+          throws GeneralSecurityException {
+        try {
+          return new PrivateKeyManagerImpl<>(
+              localPrivateKeyManager, localPublicKeyManager, primitiveClass);
+        } catch (IllegalArgumentException e) {
+          throw new GeneralSecurityException("Primitive type not supported", e);
+        }
+      }
+
+      @Override
+      public KeyManager<?> getUntypedKeyManager() {
+        return new PrivateKeyManagerImpl<>(
+            localPrivateKeyManager,
+            localPublicKeyManager,
+            localPrivateKeyManager.firstSupportedPrimitiveClass());
+      }
+
+      @Override
+      public Class<?> getImplementingClass() {
+        return localPrivateKeyManager.getClass();
+      }
+
+      @Override
+      public Set<Class<?>> supportedPrimitives() {
+        return localPrivateKeyManager.supportedPrimitives();
+      }
+
+      @Override
+      public Class<?> publicKeyManagerClassOrNull() {
+        return localPublicKeyManager.getClass();
+      }
+    };
+  }
+
+  private static synchronized KeyManagerContainer getKeyManagerContainerOrThrow(String typeUrl)
+      throws GeneralSecurityException {
+    if (!keyManagerMap.containsKey(typeUrl)) {
+      throw new GeneralSecurityException("No key manager found for key type " + typeUrl);
+    }
+    return keyManagerMap.get(typeUrl);
+  }
 
   /**
    * Resets the registry.
@@ -104,9 +265,11 @@
    * throw exception if {@code catalogue} and the existing catalogue aren't instances of the same
    * class, and do nothing if they are.
    *
-   * @throws GeneralSecurityException if there's an existing catalogue is not an instance of the
-   *     same class as {@code catalogue}
+   * @throws GeneralSecurityException if there's an existing catalogue and it is not an instance of
+   *     the same class as {@code catalogue}
+   * @deprecated Catalogues are no longer supported.
    */
+  @Deprecated
   public static synchronized void addCatalogue(String catalogueName, Catalogue<?> catalogue)
       throws GeneralSecurityException {
     if (catalogueName == null) {
@@ -130,8 +293,10 @@
   /**
    * Tries to get a catalogue associated with {@code catalogueName}.
    *
-   * @throws GeneralSecurityException if cannot find any catalogue
+   * @deprecated Catalogues are no longer supported.
+   * @throws GeneralSecurityException if no catalogue is found
    */
+  @Deprecated
   public static Catalogue<?> getCatalogue(String catalogueName)
       throws GeneralSecurityException {
     if (catalogueName == null) {
@@ -191,6 +356,31 @@
   }
 
   /**
+   * Throws a general security exception iff there is already a key manager registered for typeURL,
+   * and at least one of the following is true:
+   *   * The class implementing the existing key manager differs from the given one.
+   *   * The value of newKeyAllowed currently registered is false, but the input parameter is true.
+   */
+  private static synchronized <P> void ensureKeyManagerInsertable(
+      String typeUrl, Class<?> implementingClass, boolean newKeyAllowed)
+      throws GeneralSecurityException {
+    if (!keyManagerMap.containsKey(typeUrl)) {
+      return;
+    }
+    KeyManagerContainer container = keyManagerMap.get(typeUrl);
+    if (!container.getImplementingClass().equals(implementingClass)) {
+        logger.warning("Attempted overwrite of a registered key manager for key type " + typeUrl);
+      throw new GeneralSecurityException(
+          String.format(
+              "typeUrl (%s) is already registered with %s, cannot be re-registered with %s",
+              typeUrl, container.getImplementingClass().getName(), implementingClass.getName()));
+    }
+    if (newKeyAllowed && !newKeyAllowedMap.get(typeUrl)) {
+      throw new GeneralSecurityException("New keys are already disallowed for key type " + typeUrl);
+    }
+  }
+
+  /**
    * Tries to register {@code manager} for {@code manager.getKeyType()}. If {@code newKeyAllowed} is
    * true, users can generate new keys with this manager using the {@link Registry#newKey} methods.
    *
@@ -202,40 +392,106 @@
    *     of the class of {@code manager}, or the registration tries to re-enable the generation
    *     of new keys.
    */
-  @SuppressWarnings("unchecked")
   public static synchronized <P> void registerKeyManager(
       final KeyManager<P> manager, boolean newKeyAllowed) throws GeneralSecurityException {
     if (manager == null) {
       throw new IllegalArgumentException("key manager must be non-null.");
     }
     String typeUrl = manager.getKeyType();
-    if (keyManagerMap.containsKey(typeUrl)) {
-      KeyManager<P> existingManager = getKeyManager(typeUrl);
-      boolean existingNewKeyAllowed = newKeyAllowedMap.get(typeUrl).booleanValue();
-      if (!manager.getClass().equals(existingManager.getClass())
-          // Disallow changing newKeyAllowed from false to true.
-          || ((!existingNewKeyAllowed) && newKeyAllowed)) {
-        logger.warning("Attempted overwrite of a registered key manager for key type " + typeUrl);
-        throw new GeneralSecurityException(
-            String.format(
-                "typeUrl (%s) is already registered with %s, cannot be re-registered with %s",
-                typeUrl, existingManager.getClass().getName(), manager.getClass().getName()));
+    ensureKeyManagerInsertable(typeUrl, manager.getClass(), newKeyAllowed);
+    if (!keyManagerMap.containsKey(typeUrl)) {
+      keyManagerMap.put(typeUrl, createContainerFor(manager));
+    }
+    newKeyAllowedMap.put(typeUrl, Boolean.valueOf(newKeyAllowed));
+  }
+
+  public static synchronized <KeyProtoT extends MessageLite> void registerKeyManager(
+      final KeyTypeManager<KeyProtoT> manager, boolean newKeyAllowed)
+      throws GeneralSecurityException {
+    if (manager == null) {
+      throw new IllegalArgumentException("key manager must be non-null.");
+    }
+    String typeUrl = manager.getKeyType();
+    ensureKeyManagerInsertable(typeUrl, manager.getClass(), newKeyAllowed);
+    if (!keyManagerMap.containsKey(typeUrl)) {
+      keyManagerMap.put(typeUrl, createContainerFor(manager));
+    }
+    newKeyAllowedMap.put(typeUrl, Boolean.valueOf(newKeyAllowed));
+  }
+
+  /**
+   * Tries to register {@code manager} for {@code manager.getKeyType()}. If {@code newKeyAllowed} is
+   * true, users can generate new keys with this manager using the {@link Registry#newKey} methods.
+   *
+   * <p>If there is an existing key manager, throws an exception if {@code manager} and the existing
+   * key manager aren't instances of the same class, or if {@code newKeyAllowed} is true while the
+   * existing key manager could not create new keys. Otherwise registration succeeds.
+   *
+   * @throws GeneralSecurityException if there's an existing key manager is not an instance of the
+   *     class of {@code manager}, or the registration tries to re-enable the generation of new
+   *     keys.
+   */
+  public static synchronized <KeyProtoT extends MessageLite, PublicKeyProtoT extends MessageLite>
+      void registerAsymmetricKeyManagers(
+          final PrivateKeyTypeManager<KeyProtoT, PublicKeyProtoT> privateKeyTypeManager,
+          final KeyTypeManager<PublicKeyProtoT> publicKeyTypeManager,
+          boolean newKeyAllowed)
+          throws GeneralSecurityException {
+    if (privateKeyTypeManager == null || publicKeyTypeManager == null) {
+      throw new IllegalArgumentException("given key managers must be non-null.");
+    }
+    String privateTypeUrl = privateKeyTypeManager.getKeyType();
+    String publicTypeUrl = publicKeyTypeManager.getKeyType();
+    ensureKeyManagerInsertable(privateTypeUrl, privateKeyTypeManager.getClass(), newKeyAllowed);
+    ensureKeyManagerInsertable(publicTypeUrl, publicKeyTypeManager.getClass(), false);
+    if (privateTypeUrl.equals(publicTypeUrl)) {
+      throw new GeneralSecurityException("Private and public key type must be different.");
+    }
+
+    if (keyManagerMap.containsKey(privateTypeUrl)) {
+      Class<?> existingPublicKeyManagerClass =
+          keyManagerMap.get(privateTypeUrl).publicKeyManagerClassOrNull();
+      if (existingPublicKeyManagerClass != null) {
+        if (!existingPublicKeyManagerClass.equals(publicKeyTypeManager.getClass())) {
+          logger.warning(
+              "Attempted overwrite of a registered key manager for key type "
+                  + privateTypeUrl
+                  + " with inconsistent public key type "
+                  + publicTypeUrl);
+          throw new GeneralSecurityException(
+              String.format(
+                  "public key manager corresponding to %s is already registered with %s, cannot"
+                      + " be re-registered with %s",
+                  privateKeyTypeManager.getClass().getName(),
+                  existingPublicKeyManagerClass.getName(),
+                  publicKeyTypeManager.getClass().getName()));
+        }
       }
     }
-    keyManagerMap.put(typeUrl, manager);
-    newKeyAllowedMap.put(typeUrl, Boolean.valueOf(newKeyAllowed));
+
+    if (!keyManagerMap.containsKey(privateTypeUrl)
+        || keyManagerMap.get(privateTypeUrl).publicKeyManagerClassOrNull() == null) {
+      keyManagerMap.put(
+          privateTypeUrl,
+          createPrivateKeyContainerFor(privateKeyTypeManager, publicKeyTypeManager));
+    }
+    newKeyAllowedMap.put(privateTypeUrl, newKeyAllowed);
+    if (!keyManagerMap.containsKey(publicTypeUrl)) {
+      keyManagerMap.put(publicTypeUrl, createContainerFor(publicKeyTypeManager));
+    }
+    newKeyAllowedMap.put(publicTypeUrl, false);
   }
 
   /**
    * Tries to register {@code manager} for the given {@code typeUrl}. Users can generate new keys
    * with this manager using the {@link Registry#newKey} methods.
    *
-   * <p>If there is an existing key manager, throw exception if {@code manager} and the existing
-   * key manager aren't instances of the same class, and do nothing if they are.
+   * <p>Does nothing if there's an existing key manager and it's an instance of the same class as
+   * {@code manager}.
    *
-   * @throws GeneralSecurityException if there's an existing key manager is not an instance of the
-   *     class of {@code manager}
-   * @deprecated use {@link #registerKeyManager(KeyManager<P>)}
+   * @throws GeneralSecurityException if there's an existing key manager and it is not an instance
+   *     of the same class as {@code manager}
+   * @deprecated use {@link #registerKeyManager(KeyManager) registerKeyManager(KeyManager&lt;P&gt;)}
    */
   @Deprecated
   public static synchronized <P> void registerKeyManager(
@@ -247,12 +503,13 @@
    * Tries to register {@code manager} for the given {@code typeUrl}. If {@code newKeyAllowed} is
    * true, users can generate new keys with this manager using the {@link Registry#newKey} methods.
    *
-   * <p>If there is an existing key manager, throw exception if {@code manager} and the existing
-   * key manager aren't instances of the same class, and do nothing if they are.
+   * <p>Does nothing if there's an existing key manager and it's an instance of the same class as
+   * {@code manager}.
    *
-   * @throws GeneralSecurityException if there's an existing key manager is not an instance of the
-   *     class of {@code manager}
-   * @deprecated use {@link #registerKeyManager(KeyManager<P>, boolean)}
+   * @throws GeneralSecurityException if there's an existing key manager and it is not an instance
+   *     of the same class as {@code manager}
+   * @deprecated use {@link #registerKeyManager(KeyManager, boolean)
+   *     registerKeyManager(KeyManager&lt;P&gt;, boolean)}
    */
   @Deprecated
   public static synchronized <P> void registerKeyManager(
@@ -271,16 +528,15 @@
   /**
    * Tries to register {@code wrapper} as a new SetWrapper for primitive {@code P}.
    *
-   * <p>If no SetWrapper is registered for {@code P} registers the given one. If already is a
+   * <p>If no SetWrapper is registered for {@code P}, registers the given one. If there already is a
    * SetWrapper registered which is of the same class ass the passed in set wrapper, the call is
    * silently ignored. If the new set wrapper is of a different type, the call fails with a {@code
    * GeneralSecurityException}.
    *
-   * @throws GeneralSecurityException if there's an existing key manager is not an instance of the
-   *     class of {@code manager}, or the registration tries to re-enable the generation of new
-   *     keys.
+   * @throws GeneralSecurityException if there's an existing key manager and it is not an instance
+   *     of the class of {@code manager}, or the registration tries to re-enable the generation of
+   *     new keys.
    */
-  @SuppressWarnings("unchecked")
   public static synchronized <P> void registerPrimitiveWrapper(final PrimitiveWrapper<P> wrapper)
       throws GeneralSecurityException {
     if (wrapper == null) {
@@ -288,6 +544,7 @@
     }
     Class<P> classObject = wrapper.getPrimitiveClass();
     if (primitiveWrapperMap.containsKey(classObject)) {
+      @SuppressWarnings("unchecked") // We know that we only inserted objects of the correct type.
       PrimitiveWrapper<P> existingWrapper =
           (PrimitiveWrapper<P>) (primitiveWrapperMap.get(classObject));
       if (!wrapper.getClass().equals(existingWrapper.getClass())) {
@@ -318,7 +575,8 @@
   /** @return a {@link KeyManager} for the given {@code typeUrl} (if found). */
   public static KeyManager<?> getUntypedKeyManager(String typeUrl)
       throws GeneralSecurityException {
-    return getKeyManagerInternal(typeUrl, null);
+    KeyManagerContainer container = getKeyManagerContainerOrThrow(typeUrl);
+    return container.getUntypedKeyManager();
   }
 
   /** @return a {@link KeyManager} for the given {@code typeUrl} (if found). */
@@ -327,26 +585,38 @@
     return getKeyManagerInternal(typeUrl, checkNotNull(primitiveClass));
   }
 
+  private static String toCommaSeparatedString(Set<Class<?>> setOfClasses) {
+    StringBuilder b = new StringBuilder();
+    boolean first = true;
+    for (Class<?> clazz : setOfClasses) {
+      if (!first) {
+        b.append(", ");
+      }
+      b.append(clazz.getCanonicalName());
+      first = false;
+    }
+    return b.toString();
+  }
+
   @SuppressWarnings("unchecked")
   private static <P> KeyManager<P> getKeyManagerInternal(String typeUrl, Class<P> primitiveClass)
       throws GeneralSecurityException {
-    KeyManager<P> manager = keyManagerMap.get(typeUrl);
-    if (manager == null) {
-      throw new GeneralSecurityException(
-          "No key manager found for key type: "
-              + typeUrl
-              + ".  Check the configuration of the registry.");
+    KeyManagerContainer container = getKeyManagerContainerOrThrow(typeUrl);
+    if (primitiveClass == null) {
+      @SuppressWarnings("Unchecked")  // Only called from deprecated functions; unavoidable there.
+      KeyManager<P> result = (KeyManager<P>) container.getUntypedKeyManager();
+      return result;
     }
-    if (primitiveClass != null && !manager.getPrimitiveClass().equals(primitiveClass)) {
-      throw new GeneralSecurityException(
-          "Primitive type "
-              + manager.getPrimitiveClass().getName()
-              + " of keymanager for type "
-              + typeUrl
-              + " does not match requested primitive type "
-              + primitiveClass.getName());
+    if (container.supportedPrimitives().contains(primitiveClass)) {
+      return container.getKeyManager(primitiveClass);
     }
-    return manager;
+    throw new GeneralSecurityException(
+        "Primitive type "
+            + primitiveClass.getName()
+            + " not supported by key manager of type "
+            + container.getImplementingClass()
+            + ", supported primitives: "
+            + toCommaSeparatedString(container.supportedPrimitives()));
   }
 
   /**
@@ -361,7 +631,7 @@
    */
   public static synchronized KeyData newKeyData(KeyTemplate keyTemplate)
       throws GeneralSecurityException {
-    KeyManager<?> manager = getKeyManager(keyTemplate.getTypeUrl());
+    KeyManager<?> manager = getUntypedKeyManager(keyTemplate.getTypeUrl());
     if (newKeyAllowedMap.get(keyTemplate.getTypeUrl()).booleanValue()) {
       return manager.newKeyData(keyTemplate.getValue());
     } else {
@@ -380,7 +650,7 @@
    */
   public static synchronized MessageLite newKey(KeyTemplate keyTemplate)
       throws GeneralSecurityException {
-    KeyManager<?> manager = getKeyManager(keyTemplate.getTypeUrl());
+    KeyManager<?> manager = getUntypedKeyManager(keyTemplate.getTypeUrl());
     if (newKeyAllowedMap.get(keyTemplate.getTypeUrl()).booleanValue()) {
       return manager.newKey(keyTemplate.getValue());
     } else {
diff --git a/java/src/main/java/com/google/crypto/tink/Util.java b/java/src/main/java/com/google/crypto/tink/Util.java
index 21372e8..f9df834 100644
--- a/java/src/main/java/com/google/crypto/tink/Util.java
+++ b/java/src/main/java/com/google/crypto/tink/Util.java
@@ -80,14 +80,13 @@
     int primaryKeyId = keyset.getPrimaryKeyId();
     boolean hasPrimaryKey = false;
     boolean containsOnlyPublicKeyMaterial = true;
-    int nonDestroyedKeys = 0;
+    int numEnabledKeys = 0;
     for (Keyset.Key key : keyset.getKeyList()) {
-      if (key.getStatus() == KeyStatusType.DESTROYED) {
+      if (key.getStatus() != KeyStatusType.ENABLED) {
         continue;
       }
-      ++nonDestroyedKeys;
       validateKey(key);
-      if (key.getStatus() == KeyStatusType.ENABLED && key.getKeyId() == primaryKeyId) {
+      if (key.getKeyId() == primaryKeyId) {
         if (hasPrimaryKey) {
           throw new GeneralSecurityException("keyset contains multiple primary keys");
         }
@@ -96,11 +95,12 @@
       if (key.getKeyData().getKeyMaterialType() != KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC) {
         containsOnlyPublicKeyMaterial = false;
       }
-      // TODO(thaidn): use TypeLiteral to ensure that all keys are of the same primitive.
+      numEnabledKeys++;
     }
-    if (nonDestroyedKeys == 0) {
-      throw new GeneralSecurityException("empty keyset");
+    if (numEnabledKeys == 0) {
+      throw new GeneralSecurityException("keyset must contain at least one ENABLED key");
     }
+    // Checks that a keyset contains a primary key, except when it contains only public keys.
     if (!hasPrimaryKey && !containsOnlyPublicKeyMaterial) {
       throw new GeneralSecurityException("keyset doesn't contain a valid primary key");
     }
diff --git a/java/src/main/java/com/google/crypto/tink/aead/AeadCatalogue.java b/java/src/main/java/com/google/crypto/tink/aead/AeadCatalogue.java
deleted file mode 100644
index a4aa607..0000000
--- a/java/src/main/java/com/google/crypto/tink/aead/AeadCatalogue.java
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package com.google.crypto.tink.aead;
-
-import com.google.crypto.tink.Aead;
-import com.google.crypto.tink.Catalogue;
-import com.google.crypto.tink.KeyManager;
-import com.google.crypto.tink.PrimitiveWrapper;
-import java.security.GeneralSecurityException;
-
-/** A catalogue of {@link Aead} key managers. */
-class AeadCatalogue implements Catalogue<Aead> {
-  public AeadCatalogue() {}
-
-  /**
-   * @return a KeyManager for the given {@code typeUrl}, {@code primitiveName} and version at least
-   *     {@code minVersion} (if it exists in the catalogue).
-   */
-  @Override
-  public KeyManager<Aead> getKeyManager(String typeUrl, String primitiveName, int minVersion)
-      throws GeneralSecurityException {
-    KeyManager<Aead> keyManager;
-    switch (primitiveName.toLowerCase()) {
-      case "aead":
-        keyManager = aeadKeyManager(typeUrl);
-        break;
-      default:
-        throw new GeneralSecurityException(
-            String.format("No support for primitive '%s'.", primitiveName));
-    }
-    if (keyManager.getVersion() < minVersion) {
-      throw new GeneralSecurityException(
-          String.format(
-              "No key manager for key type '%s' with version at least %d.", typeUrl, minVersion));
-    }
-    return keyManager;
-  }
-
-  private KeyManager<Aead> aeadKeyManager(String typeUrl) throws GeneralSecurityException {
-    switch (typeUrl) {
-      case AesCtrHmacAeadKeyManager.TYPE_URL:
-        return new AesCtrHmacAeadKeyManager();
-      case AesEaxKeyManager.TYPE_URL:
-        return new AesEaxKeyManager();
-      case AesGcmKeyManager.TYPE_URL:
-        return new AesGcmKeyManager();
-      case ChaCha20Poly1305KeyManager.TYPE_URL:
-        return new ChaCha20Poly1305KeyManager();
-      case KmsAeadKeyManager.TYPE_URL:
-        return new KmsAeadKeyManager();
-      case KmsEnvelopeAeadKeyManager.TYPE_URL:
-        return new KmsEnvelopeAeadKeyManager();
-      case XChaCha20Poly1305KeyManager.TYPE_URL:
-        return new XChaCha20Poly1305KeyManager();
-      default:
-        throw new GeneralSecurityException(
-            String.format("No support for primitive 'Aead' with key type '%s'.", typeUrl));
-    }
-  }
-
-  @Override
-  public PrimitiveWrapper<Aead> getPrimitiveWrapper() {
-    return new AeadWrapper();
-  }
-}
diff --git a/java/src/main/java/com/google/crypto/tink/aead/AeadConfig.java b/java/src/main/java/com/google/crypto/tink/aead/AeadConfig.java
index 422b98a..d311175 100644
--- a/java/src/main/java/com/google/crypto/tink/aead/AeadConfig.java
+++ b/java/src/main/java/com/google/crypto/tink/aead/AeadConfig.java
@@ -16,7 +16,6 @@
 
 package com.google.crypto.tink.aead;
 
-import com.google.crypto.tink.Config;
 import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.mac.MacConfig;
 import com.google.crypto.tink.proto.RegistryConfig;
@@ -35,72 +34,33 @@
  * @since 1.0.0
  */
 public final class AeadConfig {
-  public static final String AES_CTR_HMAC_AEAD_TYPE_URL = AesCtrHmacAeadKeyManager.TYPE_URL;
-  public static final String AES_GCM_TYPE_URL = AesGcmKeyManager.TYPE_URL;
-  public static final String AES_EAX_TYPE_URL = AesEaxKeyManager.TYPE_URL;
-  public static final String KMS_AEAD_TYPE_URL = KmsAeadKeyManager.TYPE_URL;
-  public static final String KMS_ENVELOPE_AEAD_TYPE_URL = KmsEnvelopeAeadKeyManager.TYPE_URL;
-  public static final String CHACHA20_POLY1305_TYPE_URL = ChaCha20Poly1305KeyManager.TYPE_URL;
-  public static final String XCHACHA20_POLY1305_TYPE_URL = XChaCha20Poly1305KeyManager.TYPE_URL;
-
-  private static final String CATALOGUE_NAME = "TinkAead";
-  private static final String PRIMITIVE_NAME = "Aead";
+  public static final String AES_CTR_HMAC_AEAD_TYPE_URL =
+      new AesCtrHmacAeadKeyManager().getKeyType();
+  public static final String AES_GCM_TYPE_URL = new AesGcmKeyManager().getKeyType();
+  public static final String AES_EAX_TYPE_URL = new AesEaxKeyManager().getKeyType();
+  public static final String KMS_AEAD_TYPE_URL = new KmsAeadKeyManager().getKeyType();
+  public static final String KMS_ENVELOPE_AEAD_TYPE_URL =
+      new KmsEnvelopeAeadKeyManager().getKeyType();
+  public static final String CHACHA20_POLY1305_TYPE_URL =
+      new ChaCha20Poly1305KeyManager().getKeyType();
+  public static final String XCHACHA20_POLY1305_TYPE_URL =
+      new XChaCha20Poly1305KeyManager().getKeyType();
 
   /** @deprecated */
-  @Deprecated
-  public static final RegistryConfig TINK_1_0_0 =
-      RegistryConfig.newBuilder()
-          .mergeFrom(MacConfig.TINK_1_0_0)
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  CATALOGUE_NAME, PRIMITIVE_NAME, "AesCtrHmacAeadKey", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(CATALOGUE_NAME, PRIMITIVE_NAME, "AesEaxKey", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(CATALOGUE_NAME, PRIMITIVE_NAME, "AesGcmKey", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  CATALOGUE_NAME, PRIMITIVE_NAME, "ChaCha20Poly1305Key", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(CATALOGUE_NAME, PRIMITIVE_NAME, "KmsAeadKey", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  CATALOGUE_NAME, PRIMITIVE_NAME, "KmsEnvelopeAeadKey", 0, true))
-          .setConfigName("TINK_AEAD_1_0_0")
-          .build();
+  @Deprecated public static final RegistryConfig TINK_1_0_0 = RegistryConfig.getDefaultInstance();
 
   /**
    * @deprecated
    * @since 1.1.0
    */
-  @Deprecated
-  public static final RegistryConfig TINK_1_1_0 =
-      RegistryConfig.newBuilder().mergeFrom(TINK_1_0_0).setConfigName("TINK_AEAD_1_1_0").build();
+  @Deprecated public static final RegistryConfig TINK_1_1_0 = TINK_1_0_0;
 
-  /** @since 1.2.0 */
-  public static final RegistryConfig LATEST =
-      RegistryConfig.newBuilder()
-          .mergeFrom(MacConfig.LATEST)
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  CATALOGUE_NAME, PRIMITIVE_NAME, "AesCtrHmacAeadKey", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(CATALOGUE_NAME, PRIMITIVE_NAME, "AesEaxKey", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(CATALOGUE_NAME, PRIMITIVE_NAME, "AesGcmKey", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  CATALOGUE_NAME, PRIMITIVE_NAME, "ChaCha20Poly1305Key", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(CATALOGUE_NAME, PRIMITIVE_NAME, "KmsAeadKey", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  CATALOGUE_NAME, PRIMITIVE_NAME, "KmsEnvelopeAeadKey", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  CATALOGUE_NAME, PRIMITIVE_NAME, "XChaCha20Poly1305Key", 0, true))
-          .setConfigName("TINK_AEAD")
-          .build();
+  /**
+   * * @deprecated
+   *
+   * @since 1.2.0
+   */
+  @Deprecated public static final RegistryConfig LATEST = TINK_1_0_0;
 
   static {
     try {
@@ -136,10 +96,15 @@
    * @since 1.2.0
    */
   public static void register() throws GeneralSecurityException {
-    // The order of these calls matters.
     MacConfig.register();
-    Registry.addCatalogue(CATALOGUE_NAME, new AeadCatalogue());
-    Config.register(LATEST);
+    AesCtrHmacAeadKeyManager.register(/*newKeyAllowed=*/ true);
+    AesEaxKeyManager.register(/*newKeyAllowed=*/ true);
+    AesGcmKeyManager.register(/*newKeyAllowed=*/ true);
+    ChaCha20Poly1305KeyManager.register(/*newKeyAllowed=*/ true);
+    KmsAeadKeyManager.register(/*newKeyAllowed=*/ true);
+    KmsEnvelopeAeadKeyManager.register(/*newKeyAllowed=*/ true);
+    XChaCha20Poly1305KeyManager.register(/*newKeyAllowed=*/ true);
+    AeadWrapper.register();
   }
 
   /**
diff --git a/java/src/main/java/com/google/crypto/tink/aead/AeadKeyTemplates.java b/java/src/main/java/com/google/crypto/tink/aead/AeadKeyTemplates.java
index d9aeb01..c96e4c2 100644
--- a/java/src/main/java/com/google/crypto/tink/aead/AeadKeyTemplates.java
+++ b/java/src/main/java/com/google/crypto/tink/aead/AeadKeyTemplates.java
@@ -134,7 +134,7 @@
    */
   public static final KeyTemplate CHACHA20_POLY1305 =
       KeyTemplate.newBuilder()
-          .setTypeUrl(ChaCha20Poly1305KeyManager.TYPE_URL)
+          .setTypeUrl(new ChaCha20Poly1305KeyManager().getKeyType())
           .setOutputPrefixType(OutputPrefixType.TINK)
           .build();
 
@@ -146,7 +146,7 @@
    */
   public static final KeyTemplate XCHACHA20_POLY1305 =
       KeyTemplate.newBuilder()
-          .setTypeUrl(XChaCha20Poly1305KeyManager.TYPE_URL)
+          .setTypeUrl(new XChaCha20Poly1305KeyManager().getKeyType())
           .setOutputPrefixType(OutputPrefixType.TINK)
           .build();
 
@@ -160,7 +160,7 @@
         .build();
     return KeyTemplate.newBuilder()
         .setValue(format.toByteString())
-        .setTypeUrl(AesGcmKeyManager.TYPE_URL)
+        .setTypeUrl(new AesGcmKeyManager().getKeyType())
         .setOutputPrefixType(OutputPrefixType.TINK)
         .build();
   }
@@ -176,7 +176,7 @@
         .build();
     return KeyTemplate.newBuilder()
         .setValue(format.toByteString())
-        .setTypeUrl(AesEaxKeyManager.TYPE_URL)
+        .setTypeUrl(new AesEaxKeyManager().getKeyType())
         .setOutputPrefixType(OutputPrefixType.TINK)
         .build();
   }
@@ -202,7 +202,7 @@
         .build();
     return KeyTemplate.newBuilder()
         .setValue(format.toByteString())
-        .setTypeUrl(AesCtrHmacAeadKeyManager.TYPE_URL)
+        .setTypeUrl(new AesCtrHmacAeadKeyManager().getKeyType())
         .setOutputPrefixType(OutputPrefixType.TINK)
         .build();
   }
@@ -217,7 +217,7 @@
         .build();
     return KeyTemplate.newBuilder()
         .setValue(format.toByteString())
-        .setTypeUrl(KmsAeadKeyManager.TYPE_URL)
+        .setTypeUrl(new KmsAeadKeyManager().getKeyType())
         .setOutputPrefixType(OutputPrefixType.TINK)
         .build();
   }
@@ -235,7 +235,7 @@
         .build();
     return KeyTemplate.newBuilder()
         .setValue(format.toByteString())
-        .setTypeUrl(KmsEnvelopeAeadKeyManager.TYPE_URL)
+        .setTypeUrl(new KmsEnvelopeAeadKeyManager().getKeyType())
         .setOutputPrefixType(OutputPrefixType.TINK)
         .build();
   }
diff --git a/java/src/main/java/com/google/crypto/tink/aead/AeadWrapper.java b/java/src/main/java/com/google/crypto/tink/aead/AeadWrapper.java
index 0a0f216..1455353 100644
--- a/java/src/main/java/com/google/crypto/tink/aead/AeadWrapper.java
+++ b/java/src/main/java/com/google/crypto/tink/aead/AeadWrapper.java
@@ -20,6 +20,7 @@
 import com.google.crypto.tink.CryptoFormat;
 import com.google.crypto.tink.PrimitiveSet;
 import com.google.crypto.tink.PrimitiveWrapper;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.subtle.Bytes;
 import java.security.GeneralSecurityException;
 import java.util.Arrays;
@@ -83,6 +84,8 @@
     }
   }
 
+  AeadWrapper() {}
+
   @Override
   public Aead wrap(final PrimitiveSet<Aead> pset) throws GeneralSecurityException {
     return new WrappedAead(pset);
@@ -92,4 +95,8 @@
   public Class<Aead> getPrimitiveClass() {
     return Aead.class;
   }
+
+  public static void register() throws GeneralSecurityException {
+    Registry.registerPrimitiveWrapper(new AeadWrapper());
+  }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/aead/AesCtrHmacAeadKeyManager.java b/java/src/main/java/com/google/crypto/tink/aead/AesCtrHmacAeadKeyManager.java
index b1006f0..50368d8 100644
--- a/java/src/main/java/com/google/crypto/tink/aead/AesCtrHmacAeadKeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/aead/AesCtrHmacAeadKeyManager.java
@@ -17,10 +17,10 @@
 package com.google.crypto.tink.aead;
 
 import com.google.crypto.tink.Aead;
-import com.google.crypto.tink.KeyManagerBase;
+import com.google.crypto.tink.KeyTypeManager;
 import com.google.crypto.tink.Mac;
 import com.google.crypto.tink.Registry;
-import com.google.crypto.tink.mac.MacConfig;
+import com.google.crypto.tink.mac.HmacKeyManager;
 import com.google.crypto.tink.proto.AesCtrHmacAeadKey;
 import com.google.crypto.tink.proto.AesCtrHmacAeadKeyFormat;
 import com.google.crypto.tink.proto.AesCtrKey;
@@ -37,68 +37,82 @@
  * This key manager generates new {@link AesCtrHmacAeadKey} keys and produces new instances of
  * {@link EncryptThenAuthenticate}.
  */
-class AesCtrHmacAeadKeyManager
-    extends KeyManagerBase<Aead, AesCtrHmacAeadKey, AesCtrHmacAeadKeyFormat> {
-  public AesCtrHmacAeadKeyManager() throws GeneralSecurityException {
-    super(Aead.class, AesCtrHmacAeadKey.class, AesCtrHmacAeadKeyFormat.class, TYPE_URL);
-    Registry.registerKeyManager(new AesCtrKeyManager());
+public class AesCtrHmacAeadKeyManager extends KeyTypeManager<AesCtrHmacAeadKey> {
+  AesCtrHmacAeadKeyManager() {
+    super(
+        AesCtrHmacAeadKey.class,
+        new PrimitiveFactory<Aead, AesCtrHmacAeadKey>(Aead.class) {
+          @Override
+          public Aead getPrimitive(AesCtrHmacAeadKey key) throws GeneralSecurityException {
+            return new EncryptThenAuthenticate(
+                new AesCtrKeyManager().getPrimitive(key.getAesCtrKey(), IndCpaCipher.class),
+                new HmacKeyManager().getPrimitive(key.getHmacKey(), Mac.class),
+                key.getHmacKey().getParams().getTagSize());
+          }
+        });
   }
 
-  private static final int VERSION = 0;
-
-  public static final String TYPE_URL = "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey";
-
+  // Static so we don't have to construct the object and handle the exception when we need the
+  // key type.
   @Override
-  public Aead getPrimitiveFromKey(AesCtrHmacAeadKey keyProto) throws GeneralSecurityException {
-    return new EncryptThenAuthenticate(
-        Registry.getPrimitive(
-            AesCtrKeyManager.TYPE_URL, keyProto.getAesCtrKey(), IndCpaCipher.class),
-        Registry.getPrimitive(MacConfig.HMAC_TYPE_URL, keyProto.getHmacKey(), Mac.class),
-        keyProto.getHmacKey().getParams().getTagSize());
-  }
-
-  @Override
-  public AesCtrHmacAeadKey newKeyFromFormat(AesCtrHmacAeadKeyFormat format)
-      throws GeneralSecurityException {
-    AesCtrKey aesCtrKey =
-        (AesCtrKey) Registry.newKey(AesCtrKeyManager.TYPE_URL, format.getAesCtrKeyFormat());
-    HmacKey hmacKey = (HmacKey) Registry.newKey(MacConfig.HMAC_TYPE_URL, format.getHmacKeyFormat());
-    return AesCtrHmacAeadKey.newBuilder()
-        .setAesCtrKey(aesCtrKey)
-        .setHmacKey(hmacKey)
-        .setVersion(VERSION)
-        .build();
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey";
   }
 
   @Override
   public int getVersion() {
-    return VERSION;
+    return 0;
   }
 
   @Override
-  protected KeyMaterialType keyMaterialType() {
+  public KeyMaterialType keyMaterialType() {
     return KeyMaterialType.SYMMETRIC;
   }
 
   @Override
-  protected AesCtrHmacAeadKey parseKeyProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
+  public void validateKey(AesCtrHmacAeadKey key) throws GeneralSecurityException {
+    Validators.validateVersion(key.getVersion(), getVersion());
+  }
+
+  @Override
+  public AesCtrHmacAeadKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
     return AesCtrHmacAeadKey.parseFrom(byteString);
   }
 
   @Override
-  protected AesCtrHmacAeadKeyFormat parseKeyFormatProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return AesCtrHmacAeadKeyFormat.parseFrom(byteString);
+  public KeyFactory<AesCtrHmacAeadKeyFormat, AesCtrHmacAeadKey> keyFactory() {
+    return new KeyFactory<AesCtrHmacAeadKeyFormat, AesCtrHmacAeadKey>(
+        AesCtrHmacAeadKeyFormat.class) {
+      @Override
+      public void validateKeyFormat(AesCtrHmacAeadKeyFormat format)
+          throws GeneralSecurityException {
+        new AesCtrKeyManager().keyFactory().validateKeyFormat(format.getAesCtrKeyFormat());
+        new HmacKeyManager().keyFactory().validateKeyFormat(format.getHmacKeyFormat());
+        Validators.validateAesKeySize(format.getAesCtrKeyFormat().getKeySize());
+      }
+
+      @Override
+      public AesCtrHmacAeadKeyFormat parseKeyFormat(ByteString byteString)
+          throws InvalidProtocolBufferException {
+        return AesCtrHmacAeadKeyFormat.parseFrom(byteString);
+      }
+
+      @Override
+      public AesCtrHmacAeadKey createKey(AesCtrHmacAeadKeyFormat format)
+          throws GeneralSecurityException {
+        AesCtrKey aesCtrKey =
+            new AesCtrKeyManager().keyFactory().createKey(format.getAesCtrKeyFormat());
+        HmacKey hmacKey = new HmacKeyManager().keyFactory().createKey(format.getHmacKeyFormat());
+        return AesCtrHmacAeadKey.newBuilder()
+            .setAesCtrKey(aesCtrKey)
+            .setHmacKey(hmacKey)
+            .setVersion(getVersion())
+            .build();
+      }
+    };
   }
 
-  @Override
-  protected void validateKeyFormat(AesCtrHmacAeadKeyFormat format) throws GeneralSecurityException {
-    Validators.validateAesKeySize(format.getAesCtrKeyFormat().getKeySize());
-  }
-
-  @Override
-  protected void validateKey(AesCtrHmacAeadKey key) throws GeneralSecurityException {
-    Validators.validateVersion(key.getVersion(), VERSION);
+  public static void register(boolean newKeyAllowed) throws GeneralSecurityException {
+    Registry.registerKeyManager(new AesCtrHmacAeadKeyManager(), newKeyAllowed);
   }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/aead/AesCtrKeyManager.java b/java/src/main/java/com/google/crypto/tink/aead/AesCtrKeyManager.java
index f8cfde8..30eebec 100644
--- a/java/src/main/java/com/google/crypto/tink/aead/AesCtrKeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/aead/AesCtrKeyManager.java
@@ -16,7 +16,8 @@
 
 package com.google.crypto.tink.aead;
 
-import com.google.crypto.tink.KeyManagerBase;
+import com.google.crypto.tink.KeyTypeManager;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.proto.AesCtrKey;
 import com.google.crypto.tink.proto.AesCtrKeyFormat;
 import com.google.crypto.tink.proto.AesCtrParams;
@@ -33,15 +34,19 @@
  * This key manager generates new {@code AesCtrKey} keys and produces new instances of {@code
  * AesCtrJceCipher}.
  */
-class AesCtrKeyManager extends KeyManagerBase<IndCpaCipher, AesCtrKey, AesCtrKeyFormat> {
-  public AesCtrKeyManager() {
-    super(IndCpaCipher.class, AesCtrKey.class, AesCtrKeyFormat.class, TYPE_URL);
+public class AesCtrKeyManager extends KeyTypeManager<AesCtrKey> {
+  AesCtrKeyManager() {
+    super(
+        AesCtrKey.class,
+        new PrimitiveFactory<IndCpaCipher, AesCtrKey>(IndCpaCipher.class) {
+          @Override
+          public IndCpaCipher getPrimitive(AesCtrKey key) throws GeneralSecurityException {
+            return new AesCtrJceCipher(
+                key.getKeyValue().toByteArray(), key.getParams().getIvSize());
+          }
+        });
   }
 
-  private static final int VERSION = 0;
-
-  static final String TYPE_URL = "type.googleapis.com/google.crypto.tink.AesCtrKey";
-
   // In counter mode each message is encrypted with an initialization vector (IV) that must be
   // unique. If one single IV is ever used to encrypt two or more messages, the confidentiality of
   // these messages might be lost. This cipher uses a randomly generated IV for each message. The
@@ -52,58 +57,65 @@
   private static final int MIN_IV_SIZE_IN_BYTES = 12;
 
   @Override
-  public IndCpaCipher getPrimitiveFromKey(AesCtrKey keyProto) throws GeneralSecurityException {
-    return new AesCtrJceCipher(
-        keyProto.getKeyValue().toByteArray(), keyProto.getParams().getIvSize());
-  }
-
-  @Override
-  public AesCtrKey newKeyFromFormat(AesCtrKeyFormat format) throws GeneralSecurityException {
-    return AesCtrKey.newBuilder()
-        .setParams(format.getParams())
-        .setKeyValue(ByteString.copyFrom(Random.randBytes(format.getKeySize())))
-        .setVersion(VERSION)
-        .build();
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.AesCtrKey";
   }
 
   @Override
   public int getVersion() {
-    return VERSION;
+    return 0;
   }
 
   @Override
-  protected KeyMaterialType keyMaterialType() {
+  public KeyMaterialType keyMaterialType() {
     return KeyMaterialType.SYMMETRIC;
   }
 
   @Override
-  protected AesCtrKey parseKeyProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
+  public void validateKey(AesCtrKey key) throws GeneralSecurityException {
+    Validators.validateVersion(key.getVersion(), getVersion());
+    Validators.validateAesKeySize(key.getKeyValue().size());
+    validateParams(key.getParams());
+  }
+
+  @Override
+  public AesCtrKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
     return AesCtrKey.parseFrom(byteString);
   }
 
   @Override
-  protected AesCtrKeyFormat parseKeyFormatProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return AesCtrKeyFormat.parseFrom(byteString);
+  public KeyFactory<AesCtrKeyFormat, AesCtrKey> keyFactory() {
+    return new KeyFactory<AesCtrKeyFormat, AesCtrKey>(AesCtrKeyFormat.class) {
+      @Override
+      public void validateKeyFormat(AesCtrKeyFormat format) throws GeneralSecurityException {
+        Validators.validateAesKeySize(format.getKeySize());
+        validateParams(format.getParams());
+      }
+
+      @Override
+      public AesCtrKeyFormat parseKeyFormat(ByteString byteString)
+          throws InvalidProtocolBufferException {
+        return AesCtrKeyFormat.parseFrom(byteString);
+      }
+
+      @Override
+      public AesCtrKey createKey(AesCtrKeyFormat format) throws GeneralSecurityException {
+        return AesCtrKey.newBuilder()
+            .setParams(format.getParams())
+            .setKeyValue(ByteString.copyFrom(Random.randBytes(format.getKeySize())))
+            .setVersion(getVersion())
+            .build();
+      }
+    };
   }
 
-  @Override
-  protected void validateKey(AesCtrKey key) throws GeneralSecurityException {
-    Validators.validateVersion(key.getVersion(), VERSION);
-    Validators.validateAesKeySize(key.getKeyValue().size());
-    validate(key.getParams());
-  }
-
-  @Override
-  protected void validateKeyFormat(AesCtrKeyFormat format) throws GeneralSecurityException {
-    Validators.validateAesKeySize(format.getKeySize());
-    validate(format.getParams());
-  }
-
-  private void validate(AesCtrParams params) throws GeneralSecurityException {
+  private void validateParams(AesCtrParams params) throws GeneralSecurityException {
     if (params.getIvSize() < MIN_IV_SIZE_IN_BYTES || params.getIvSize() > 16) {
       throw new GeneralSecurityException("invalid IV size");
     }
   }
+
+  public static void register(boolean newKeyAllowed) throws GeneralSecurityException {
+    Registry.registerKeyManager(new AesCtrKeyManager(), newKeyAllowed);
+  }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/aead/AesEaxKeyManager.java b/java/src/main/java/com/google/crypto/tink/aead/AesEaxKeyManager.java
index 00edb58..bb7b6ed 100644
--- a/java/src/main/java/com/google/crypto/tink/aead/AesEaxKeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/aead/AesEaxKeyManager.java
@@ -17,7 +17,8 @@
 package com.google.crypto.tink.aead;
 
 import com.google.crypto.tink.Aead;
-import com.google.crypto.tink.KeyManagerBase;
+import com.google.crypto.tink.KeyTypeManager;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.proto.AesEaxKey;
 import com.google.crypto.tink.proto.AesEaxKeyFormat;
 import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
@@ -32,54 +33,37 @@
  * This key manager generates new {@code AesEaxKey} keys and produces new instances of {@code
  * AesEaxJce}.
  */
-class AesEaxKeyManager extends KeyManagerBase<Aead, AesEaxKey, AesEaxKeyFormat> {
-  public AesEaxKeyManager() {
-    super(Aead.class, AesEaxKey.class, AesEaxKeyFormat.class, TYPE_URL);
-  }
-
-  private static final int VERSION = 0;
-
-  public static final String TYPE_URL = "type.googleapis.com/google.crypto.tink.AesEaxKey";
-
-  @Override
-  public Aead getPrimitiveFromKey(AesEaxKey keyProto) throws GeneralSecurityException {
-    return new AesEaxJce(keyProto.getKeyValue().toByteArray(), keyProto.getParams().getIvSize());
+public class AesEaxKeyManager extends KeyTypeManager<AesEaxKey> {
+  AesEaxKeyManager() {
+    super(
+        AesEaxKey.class,
+        new PrimitiveFactory<Aead, AesEaxKey>(Aead.class) {
+          @Override
+          public Aead getPrimitive(AesEaxKey key) throws GeneralSecurityException {
+            return new AesEaxJce(
+                key.getKeyValue().toByteArray(), key.getParams().getIvSize());
+          }
+        });
   }
 
   @Override
-  public AesEaxKey newKeyFromFormat(AesEaxKeyFormat format) throws GeneralSecurityException {
-    return AesEaxKey.newBuilder()
-        .setKeyValue(ByteString.copyFrom(Random.randBytes(format.getKeySize())))
-        .setParams(format.getParams())
-        .setVersion(VERSION)
-        .build();
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.AesEaxKey";
   }
 
   @Override
   public int getVersion() {
-    return VERSION;
+    return 0;
   }
 
   @Override
-  protected KeyMaterialType keyMaterialType() {
+  public KeyMaterialType keyMaterialType() {
     return KeyMaterialType.SYMMETRIC;
   }
 
   @Override
-  protected AesEaxKey parseKeyProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return AesEaxKey.parseFrom(byteString);
-  }
-
-  @Override
-  protected AesEaxKeyFormat parseKeyFormatProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return AesEaxKeyFormat.parseFrom(byteString);
-  }
-
-  @Override
-  protected void validateKey(AesEaxKey key) throws GeneralSecurityException {
-    Validators.validateVersion(key.getVersion(), VERSION);
+  public void validateKey(AesEaxKey key) throws GeneralSecurityException {
+    Validators.validateVersion(key.getVersion(), getVersion());
     Validators.validateAesKeySize(key.getKeyValue().size());
     if (key.getParams().getIvSize() != 12 && key.getParams().getIvSize() != 16) {
       throw new GeneralSecurityException("invalid IV size; acceptable values have 12 or 16 bytes");
@@ -87,10 +71,40 @@
   }
 
   @Override
-  protected void validateKeyFormat(AesEaxKeyFormat format) throws GeneralSecurityException {
-    Validators.validateAesKeySize(format.getKeySize());
-    if (format.getParams().getIvSize() != 12 && format.getParams().getIvSize() != 16) {
-      throw new GeneralSecurityException("invalid IV size; acceptable values have 12 or 16 bytes");
-    }
+  public AesEaxKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
+    return AesEaxKey.parseFrom(byteString);
+  }
+
+  @Override
+  public KeyFactory<AesEaxKeyFormat, AesEaxKey> keyFactory() {
+    return new KeyFactory<AesEaxKeyFormat, AesEaxKey>(AesEaxKeyFormat.class) {
+      @Override
+      public void validateKeyFormat(AesEaxKeyFormat format) throws GeneralSecurityException {
+        Validators.validateAesKeySize(format.getKeySize());
+        if (format.getParams().getIvSize() != 12 && format.getParams().getIvSize() != 16) {
+          throw new GeneralSecurityException(
+              "invalid IV size; acceptable values have 12 or 16 bytes");
+        }
+      }
+
+      @Override
+      public AesEaxKeyFormat parseKeyFormat(ByteString byteString)
+          throws InvalidProtocolBufferException {
+        return AesEaxKeyFormat.parseFrom(byteString);
+      }
+
+      @Override
+      public AesEaxKey createKey(AesEaxKeyFormat format) throws GeneralSecurityException {
+        return AesEaxKey.newBuilder()
+            .setKeyValue(ByteString.copyFrom(Random.randBytes(format.getKeySize())))
+            .setParams(format.getParams())
+            .setVersion(getVersion())
+            .build();
+      }
+    };
+  }
+
+  public static void register(boolean newKeyAllowed) throws GeneralSecurityException {
+    Registry.registerKeyManager(new AesEaxKeyManager(), newKeyAllowed);
   }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/aead/AesGcmKeyManager.java b/java/src/main/java/com/google/crypto/tink/aead/AesGcmKeyManager.java
index c7aa4f3..18049c1 100644
--- a/java/src/main/java/com/google/crypto/tink/aead/AesGcmKeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/aead/AesGcmKeyManager.java
@@ -17,7 +17,8 @@
 package com.google.crypto.tink.aead;
 
 import com.google.crypto.tink.Aead;
-import com.google.crypto.tink.KeyManagerBase;
+import com.google.crypto.tink.KeyTypeManager;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.proto.AesGcmKey;
 import com.google.crypto.tink.proto.AesGcmKeyFormat;
 import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
@@ -32,59 +33,69 @@
  * This key manager generates new {@code AesGcmKey} keys and produces new instances of {@code
  * AesGcmJce}.
  */
-class AesGcmKeyManager extends KeyManagerBase<Aead, AesGcmKey, AesGcmKeyFormat> {
-  public AesGcmKeyManager() {
-    super(Aead.class, AesGcmKey.class, AesGcmKeyFormat.class, TYPE_URL);
-  }
-
-  private static final int VERSION = 0;
-
-  public static final String TYPE_URL = "type.googleapis.com/google.crypto.tink.AesGcmKey";
-
-  /** @param key {@code AesGcmKey} proto */
-  @Override
-  protected Aead getPrimitiveFromKey(AesGcmKey key) throws GeneralSecurityException {
-    return new AesGcmJce(key.getKeyValue().toByteArray());
+public class AesGcmKeyManager extends KeyTypeManager<AesGcmKey> {
+  AesGcmKeyManager() {
+    super(
+        AesGcmKey.class,
+        new PrimitiveFactory<Aead, AesGcmKey>(Aead.class) {
+          @Override
+          public Aead getPrimitive(AesGcmKey key) throws GeneralSecurityException {
+            return new AesGcmJce(key.getKeyValue().toByteArray());
+          }
+        });
   }
 
   @Override
-  protected AesGcmKey newKeyFromFormat(AesGcmKeyFormat format) throws GeneralSecurityException {
-    return AesGcmKey.newBuilder()
-        .setKeyValue(ByteString.copyFrom(Random.randBytes(format.getKeySize())))
-        .setVersion(VERSION)
-        .build();
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.AesGcmKey";
   }
 
   @Override
   public int getVersion() {
-    return VERSION;
+    return 0;
   }
 
   @Override
-  protected KeyMaterialType keyMaterialType() {
+  public KeyMaterialType keyMaterialType() {
     return KeyMaterialType.SYMMETRIC;
   }
 
   @Override
-  protected AesGcmKey parseKeyProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return AesGcmKey.parseFrom(byteString);
-  }
-
-  @Override
-  protected AesGcmKeyFormat parseKeyFormatProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return AesGcmKeyFormat.parseFrom(byteString);
-  }
-
-  @Override
-  protected void validateKey(AesGcmKey key) throws GeneralSecurityException {
-    Validators.validateVersion(key.getVersion(), VERSION);
+  public void validateKey(AesGcmKey key) throws GeneralSecurityException {
+    Validators.validateVersion(key.getVersion(), getVersion());
     Validators.validateAesKeySize(key.getKeyValue().size());
   }
 
   @Override
-  protected void validateKeyFormat(AesGcmKeyFormat format) throws GeneralSecurityException {
-    Validators.validateAesKeySize(format.getKeySize());
+  public AesGcmKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
+    return AesGcmKey.parseFrom(byteString);
+  }
+
+  @Override
+  public KeyFactory<AesGcmKeyFormat, AesGcmKey> keyFactory() {
+    return new KeyFactory<AesGcmKeyFormat, AesGcmKey>(AesGcmKeyFormat.class) {
+      @Override
+      public void validateKeyFormat(AesGcmKeyFormat format) throws GeneralSecurityException {
+        Validators.validateAesKeySize(format.getKeySize());
+      }
+
+      @Override
+      public AesGcmKeyFormat parseKeyFormat(ByteString byteString)
+          throws InvalidProtocolBufferException {
+        return AesGcmKeyFormat.parseFrom(byteString);
+      }
+
+      @Override
+      public AesGcmKey createKey(AesGcmKeyFormat format) throws GeneralSecurityException {
+        return AesGcmKey.newBuilder()
+            .setKeyValue(ByteString.copyFrom(Random.randBytes(format.getKeySize())))
+            .setVersion(getVersion())
+            .build();
+      }
+    };
+  }
+
+  public static void register(boolean newKeyAllowed) throws GeneralSecurityException {
+    Registry.registerKeyManager(new AesGcmKeyManager(), newKeyAllowed);
   }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/aead/BUILD.bazel b/java/src/main/java/com/google/crypto/tink/aead/BUILD.bazel
index 5685b9d..5424b31 100644
--- a/java/src/main/java/com/google/crypto/tink/aead/BUILD.bazel
+++ b/java/src/main/java/com/google/crypto/tink/aead/BUILD.bazel
@@ -1,4 +1,4 @@
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
@@ -49,6 +49,7 @@
     name = "aead",
     srcs = [":srcs"],
     javacopts = JAVACOPTS_OSS,
+    visibility = ["//visibility:public"],
     deps = full_protos + [
         "//java/src/main/java/com/google/crypto/tink",
         "//java/src/main/java/com/google/crypto/tink/annotations",
@@ -63,6 +64,7 @@
     name = "android",
     srcs = [":srcs"],
     javacopts = JAVACOPTS_OSS,
+    visibility = ["//visibility:public"],
     deps = lite_protos + [
         "//java/src/main/java/com/google/crypto/tink:android",
         "//java/src/main/java/com/google/crypto/tink/annotations",
diff --git a/java/src/main/java/com/google/crypto/tink/aead/ChaCha20Poly1305KeyManager.java b/java/src/main/java/com/google/crypto/tink/aead/ChaCha20Poly1305KeyManager.java
index 4217be0..bae2303 100644
--- a/java/src/main/java/com/google/crypto/tink/aead/ChaCha20Poly1305KeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/aead/ChaCha20Poly1305KeyManager.java
@@ -17,9 +17,10 @@
 package com.google.crypto.tink.aead;
 
 import com.google.crypto.tink.Aead;
-import com.google.crypto.tink.KeyManagerBase;
+import com.google.crypto.tink.KeyTypeManager;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.proto.ChaCha20Poly1305Key;
-import com.google.crypto.tink.proto.Empty;
+import com.google.crypto.tink.proto.ChaCha20Poly1305KeyFormat;
 import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.subtle.ChaCha20Poly1305;
 import com.google.crypto.tink.subtle.Random;
@@ -32,63 +33,74 @@
  * This instance of {@code KeyManager} generates new {@code ChaCha20Poly1305} keys and produces new
  * instances of {@code ChaCha20Poly1305}.
  */
-class ChaCha20Poly1305KeyManager
-    extends KeyManagerBase<Aead, ChaCha20Poly1305Key, Empty> {
-  public ChaCha20Poly1305KeyManager() {
-    super(Aead.class, ChaCha20Poly1305Key.class, Empty.class, TYPE_URL);
+public class ChaCha20Poly1305KeyManager extends KeyTypeManager<ChaCha20Poly1305Key> {
+  ChaCha20Poly1305KeyManager() {
+    super(
+        ChaCha20Poly1305Key.class,
+        new PrimitiveFactory<Aead, ChaCha20Poly1305Key>(Aead.class) {
+          @Override
+          public Aead getPrimitive(ChaCha20Poly1305Key key) throws GeneralSecurityException {
+            return new ChaCha20Poly1305(key.getKeyValue().toByteArray());
+          }
+        });
   }
 
-  /** Type url that this manager supports */
-  public static final String TYPE_URL =
-      "type.googleapis.com/google.crypto.tink.ChaCha20Poly1305Key";
-
   private static final int KEY_SIZE_IN_BYTES = 32;
 
-  /** Current version of this key manager. Keys with greater version are not supported. */
-  private static final int VERSION = 0;
-
   @Override
-  public Aead getPrimitiveFromKey(ChaCha20Poly1305Key keyProto) throws GeneralSecurityException {
-    return new ChaCha20Poly1305(keyProto.getKeyValue().toByteArray());
-  }
-
-  @Override
-  protected ChaCha20Poly1305Key newKeyFromFormat(Empty unused) throws GeneralSecurityException {
-    return ChaCha20Poly1305Key.newBuilder()
-        .setVersion(VERSION)
-        .setKeyValue(ByteString.copyFrom(Random.randBytes(KEY_SIZE_IN_BYTES)))
-        .build();
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.ChaCha20Poly1305Key";
   }
 
   @Override
   public int getVersion() {
-    return VERSION;
+    return 0;
   }
 
   @Override
-  protected KeyMaterialType keyMaterialType() {
+  public KeyMaterialType keyMaterialType() {
     return KeyMaterialType.SYMMETRIC;
   }
 
   @Override
-  protected ChaCha20Poly1305Key parseKeyProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return ChaCha20Poly1305Key.parseFrom(byteString);
-  }
-
-  @Override
-  protected Empty parseKeyFormatProto(ByteString byteString) throws InvalidProtocolBufferException {
-    return Empty.parseFrom(byteString);
-  }
-
-  @Override
-  protected void validateKey(ChaCha20Poly1305Key keyProto) throws GeneralSecurityException {
-    Validators.validateVersion(keyProto.getVersion(), VERSION);
-    if (keyProto.getKeyValue().size() != KEY_SIZE_IN_BYTES) {
+  public void validateKey(ChaCha20Poly1305Key key) throws GeneralSecurityException {
+    Validators.validateVersion(key.getVersion(), getVersion());
+    if (key.getKeyValue().size() != KEY_SIZE_IN_BYTES) {
       throw new GeneralSecurityException("invalid ChaCha20Poly1305Key: incorrect key length");
     }
   }
 
   @Override
-  protected void validateKeyFormat(Empty unused) throws GeneralSecurityException {}
+  public ChaCha20Poly1305Key parseKey(ByteString byteString) throws InvalidProtocolBufferException {
+    return ChaCha20Poly1305Key.parseFrom(byteString);
+  }
+
+  @Override
+  public KeyFactory<ChaCha20Poly1305KeyFormat, ChaCha20Poly1305Key> keyFactory() {
+    return new KeyFactory<ChaCha20Poly1305KeyFormat, ChaCha20Poly1305Key>(
+        ChaCha20Poly1305KeyFormat.class) {
+      @Override
+      public void validateKeyFormat(ChaCha20Poly1305KeyFormat format)
+          throws GeneralSecurityException {}
+
+      @Override
+      public ChaCha20Poly1305KeyFormat parseKeyFormat(ByteString byteString)
+          throws InvalidProtocolBufferException {
+        return ChaCha20Poly1305KeyFormat.parseFrom(byteString);
+      }
+
+      @Override
+      public ChaCha20Poly1305Key createKey(ChaCha20Poly1305KeyFormat format)
+          throws GeneralSecurityException {
+        return ChaCha20Poly1305Key.newBuilder()
+            .setVersion(getVersion())
+            .setKeyValue(ByteString.copyFrom(Random.randBytes(KEY_SIZE_IN_BYTES)))
+            .build();
+      }
+    };
+  }
+
+  public static void register(boolean newKeyAllowed) throws GeneralSecurityException {
+    Registry.registerKeyManager(new ChaCha20Poly1305KeyManager(), newKeyAllowed);
+  }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/aead/KmsAeadKeyManager.java b/java/src/main/java/com/google/crypto/tink/aead/KmsAeadKeyManager.java
index a7abfc9..4eaff5a 100644
--- a/java/src/main/java/com/google/crypto/tink/aead/KmsAeadKeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/aead/KmsAeadKeyManager.java
@@ -17,9 +17,10 @@
 package com.google.crypto.tink.aead;
 
 import com.google.crypto.tink.Aead;
-import com.google.crypto.tink.KeyManagerBase;
+import com.google.crypto.tink.KeyTypeManager;
 import com.google.crypto.tink.KmsClient;
 import com.google.crypto.tink.KmsClients;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.proto.KmsAeadKey;
 import com.google.crypto.tink.proto.KmsAeadKeyFormat;
@@ -32,55 +33,65 @@
  * This key manager produces new instances of {@code Aead} that forwards encrypt/decrypt requests to
  * a key residing in a remote KMS.
  */
-class KmsAeadKeyManager extends KeyManagerBase<Aead, KmsAeadKey, KmsAeadKeyFormat> {
-  public KmsAeadKeyManager() {
-    super(Aead.class, KmsAeadKey.class, KmsAeadKeyFormat.class, TYPE_URL);
-  }
-
-  private static final int VERSION = 0;
-
-  public static final String TYPE_URL =
-      "type.googleapis.com/google.crypto.tink.KmsAeadKey";
-
-  @Override
-  public Aead getPrimitiveFromKey(KmsAeadKey keyProto) throws GeneralSecurityException {
-    String keyUri = keyProto.getParams().getKeyUri();
-    KmsClient kmsClient = KmsClients.get(keyUri);
-    return kmsClient.getAead(keyUri);
+public class KmsAeadKeyManager extends KeyTypeManager<KmsAeadKey> {
+  KmsAeadKeyManager() {
+    super(
+        KmsAeadKey.class,
+        new PrimitiveFactory<Aead, KmsAeadKey>(Aead.class) {
+          @Override
+          public Aead getPrimitive(KmsAeadKey keyProto) throws GeneralSecurityException {
+            String keyUri = keyProto.getParams().getKeyUri();
+            KmsClient kmsClient = KmsClients.get(keyUri);
+            return kmsClient.getAead(keyUri);
+          }
+        });
   }
 
   @Override
-  public KmsAeadKey newKeyFromFormat(KmsAeadKeyFormat format) throws GeneralSecurityException {
-    return KmsAeadKey.newBuilder().setParams(format).setVersion(VERSION).build();
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.KmsAeadKey";
   }
 
   @Override
   public int getVersion() {
-    return VERSION;
+    return 0;
   }
 
   @Override
-  protected KeyMaterialType keyMaterialType() {
+  public KeyMaterialType keyMaterialType() {
     return KeyMaterialType.REMOTE;
   }
 
   @Override
-  protected KmsAeadKey parseKeyProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
+  public void validateKey(KmsAeadKey key) throws GeneralSecurityException {
+    Validators.validateVersion(key.getVersion(), getVersion());
+  }
+
+  @Override
+  public KmsAeadKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
     return KmsAeadKey.parseFrom(byteString);
   }
 
   @Override
-  protected KmsAeadKeyFormat parseKeyFormatProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return KmsAeadKeyFormat.parseFrom(byteString);
+  public KeyFactory<KmsAeadKeyFormat, KmsAeadKey> keyFactory() {
+    return new KeyFactory<KmsAeadKeyFormat, KmsAeadKey>(KmsAeadKeyFormat.class) {
+      @Override
+      public void validateKeyFormat(KmsAeadKeyFormat format) throws GeneralSecurityException {}
+
+      @Override
+      public KmsAeadKeyFormat parseKeyFormat(ByteString byteString)
+          throws InvalidProtocolBufferException {
+        return KmsAeadKeyFormat.parseFrom(byteString);
+      }
+
+      @Override
+      public KmsAeadKey createKey(KmsAeadKeyFormat format) throws GeneralSecurityException {
+        return KmsAeadKey.newBuilder().setParams(format).setVersion(getVersion()).build();
+      }
+    };
   }
 
-  @Override
-  protected void validateKey(KmsAeadKey key) throws GeneralSecurityException {
-    Validators.validateVersion(key.getVersion(), VERSION);
+  public static void register(boolean newKeyAllowed) throws GeneralSecurityException {
+    Registry.registerKeyManager(new KmsAeadKeyManager(), newKeyAllowed);
   }
-
-  @Override
-  protected void validateKeyFormat(KmsAeadKeyFormat format) {}
 }
diff --git a/java/src/main/java/com/google/crypto/tink/aead/KmsEnvelopeAead.java b/java/src/main/java/com/google/crypto/tink/aead/KmsEnvelopeAead.java
index 0eddb87..fe281d1 100644
--- a/java/src/main/java/com/google/crypto/tink/aead/KmsEnvelopeAead.java
+++ b/java/src/main/java/com/google/crypto/tink/aead/KmsEnvelopeAead.java
@@ -25,14 +25,21 @@
 
 /**
  * This primitive implements <a href="https://cloud.google.com/kms/docs/data-encryption-keys">
- * envelope encryption</a>. In envelope encryption, user generates a data encryption key (DEK)
- * locally, encrypts data with DEK, sends DEK to a KMS to be encrypted (with a key managed by KMS),
- * and stores encrypted DEK with encrypted data; at a later point user can retrieve encrypted data
- * and DEK, use Storky to decrypt DEK, and use decrypted DEK to decrypt the data.
- * The ciphertext structure is as follows:
- *   - Length of encrypted DEK: 4 bytes.
- *   - Encrypted DEK: variable length that is equal to the value specified in the last 4 bytes.
- *   - AEAD payload: variable length.
+ * envelope encryption</a>.
+ *
+ * <p>In envelope encryption, a user generates a data encryption key (DEK) locally, encrypts data
+ * with the DEK, sends the DEK to a KMS to be encrypted (with a key managed by KMS), and then stores
+ * the encrypted DEK with the encrypted data. At a later point, a user can retrieve the encrypted
+ * data and the encyrpted DEK, use the KMS to decrypt the DEK, and use the decrypted DEK to decrypt
+ * the data.
+ *
+ * <p>The ciphertext structure is as follows:
+ *
+ * <ul>
+ *   <li>Length of the encrypted DEK: 4 bytes.
+ *   <li>Encrypted DEK: variable length that is equal to the value specified in the last 4 bytes.
+ *   <li>AEAD payload: variable length.
+ * </ul>
  */
 public final class KmsEnvelopeAead implements Aead {
   private static final byte[] EMPTY_AAD = new byte[0];
diff --git a/java/src/main/java/com/google/crypto/tink/aead/KmsEnvelopeAeadKeyManager.java b/java/src/main/java/com/google/crypto/tink/aead/KmsEnvelopeAeadKeyManager.java
index cc86464..c900c18 100644
--- a/java/src/main/java/com/google/crypto/tink/aead/KmsEnvelopeAeadKeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/aead/KmsEnvelopeAeadKeyManager.java
@@ -17,9 +17,10 @@
 package com.google.crypto.tink.aead;
 
 import com.google.crypto.tink.Aead;
-import com.google.crypto.tink.KeyManagerBase;
+import com.google.crypto.tink.KeyTypeManager;
 import com.google.crypto.tink.KmsClient;
 import com.google.crypto.tink.KmsClients;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.proto.KmsEnvelopeAeadKey;
 import com.google.crypto.tink.proto.KmsEnvelopeAeadKeyFormat;
@@ -32,58 +33,69 @@
  * This key manager generates new {@code KmsEnvelopeAeadKey} keys and produces new instances of
  * {@code KmsEnvelopeAead}.
  */
-class KmsEnvelopeAeadKeyManager
-    extends KeyManagerBase<Aead, KmsEnvelopeAeadKey, KmsEnvelopeAeadKeyFormat> {
-  public KmsEnvelopeAeadKeyManager() {
-    super(Aead.class, KmsEnvelopeAeadKey.class, KmsEnvelopeAeadKeyFormat.class, TYPE_URL);
-  }
-
-  private static final int VERSION = 0;
-
-  public static final String TYPE_URL = "type.googleapis.com/google.crypto.tink.KmsEnvelopeAeadKey";
-
-  @Override
-  public Aead getPrimitiveFromKey(KmsEnvelopeAeadKey keyProto) throws GeneralSecurityException {
-    String keyUri = keyProto.getParams().getKekUri();
-    KmsClient kmsClient = KmsClients.get(keyUri);
-    Aead remote = kmsClient.getAead(keyUri);
-    return new KmsEnvelopeAead(keyProto.getParams().getDekTemplate(), remote);
+public class KmsEnvelopeAeadKeyManager extends KeyTypeManager<KmsEnvelopeAeadKey> {
+  KmsEnvelopeAeadKeyManager() {
+    super(
+        KmsEnvelopeAeadKey.class,
+        new PrimitiveFactory<Aead, KmsEnvelopeAeadKey>(Aead.class) {
+          @Override
+          public Aead getPrimitive(KmsEnvelopeAeadKey keyProto) throws GeneralSecurityException {
+            String keyUri = keyProto.getParams().getKekUri();
+            KmsClient kmsClient = KmsClients.get(keyUri);
+            Aead remote = kmsClient.getAead(keyUri);
+            return new KmsEnvelopeAead(keyProto.getParams().getDekTemplate(), remote);
+          }
+        });
   }
 
   @Override
-  public KmsEnvelopeAeadKey newKeyFromFormat(KmsEnvelopeAeadKeyFormat format)
-      throws GeneralSecurityException {
-    return KmsEnvelopeAeadKey.newBuilder().setParams(format).setVersion(VERSION).build();
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.KmsEnvelopeAeadKey";
   }
 
   @Override
   public int getVersion() {
-    return VERSION;
+    return 0;
   }
 
   @Override
-  protected KeyMaterialType keyMaterialType() {
+  public KeyMaterialType keyMaterialType() {
     return KeyMaterialType.REMOTE;
   }
 
   @Override
-  protected KmsEnvelopeAeadKey parseKeyProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
+  public void validateKey(KmsEnvelopeAeadKey key) throws GeneralSecurityException {
+    Validators.validateVersion(key.getVersion(), getVersion());
+  }
+
+  @Override
+  public KmsEnvelopeAeadKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
     return KmsEnvelopeAeadKey.parseFrom(byteString);
   }
 
   @Override
-  protected KmsEnvelopeAeadKeyFormat parseKeyFormatProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return KmsEnvelopeAeadKeyFormat.parseFrom(byteString);
+  public KeyFactory<KmsEnvelopeAeadKeyFormat, KmsEnvelopeAeadKey> keyFactory() {
+    return new KeyFactory<KmsEnvelopeAeadKeyFormat, KmsEnvelopeAeadKey>(
+        KmsEnvelopeAeadKeyFormat.class) {
+      @Override
+      public void validateKeyFormat(KmsEnvelopeAeadKeyFormat format)
+          throws GeneralSecurityException {}
+
+      @Override
+      public KmsEnvelopeAeadKeyFormat parseKeyFormat(ByteString byteString)
+          throws InvalidProtocolBufferException {
+        return KmsEnvelopeAeadKeyFormat.parseFrom(byteString);
+      }
+
+      @Override
+      public KmsEnvelopeAeadKey createKey(KmsEnvelopeAeadKeyFormat format)
+          throws GeneralSecurityException {
+        return KmsEnvelopeAeadKey.newBuilder().setParams(format).setVersion(getVersion()).build();
+      }
+    };
   }
 
-  @Override
-  protected void validateKey(KmsEnvelopeAeadKey key) throws GeneralSecurityException {
-    Validators.validateVersion(key.getVersion(), VERSION);
+  public static void register(boolean newKeyAllowed) throws GeneralSecurityException {
+    Registry.registerKeyManager(new KmsEnvelopeAeadKeyManager(), newKeyAllowed);
   }
-
-  @Override
-  protected void validateKeyFormat(KmsEnvelopeAeadKeyFormat format)
-      throws GeneralSecurityException {}
 }
diff --git a/java/src/main/java/com/google/crypto/tink/aead/XChaCha20Poly1305KeyManager.java b/java/src/main/java/com/google/crypto/tink/aead/XChaCha20Poly1305KeyManager.java
index 51d33bb..ec4c8ad 100644
--- a/java/src/main/java/com/google/crypto/tink/aead/XChaCha20Poly1305KeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/aead/XChaCha20Poly1305KeyManager.java
@@ -17,10 +17,11 @@
 package com.google.crypto.tink.aead;
 
 import com.google.crypto.tink.Aead;
-import com.google.crypto.tink.KeyManagerBase;
-import com.google.crypto.tink.proto.Empty;
+import com.google.crypto.tink.KeyTypeManager;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.proto.XChaCha20Poly1305Key;
+import com.google.crypto.tink.proto.XChaCha20Poly1305KeyFormat;
 import com.google.crypto.tink.subtle.Random;
 import com.google.crypto.tink.subtle.Validators;
 import com.google.crypto.tink.subtle.XChaCha20Poly1305;
@@ -32,60 +33,75 @@
  * This instance of {@code KeyManager} generates new {@code XChaCha20Poly1305} keys and produces new
  * instances of {@code XChaCha20Poly1305}.
  */
-class XChaCha20Poly1305KeyManager extends KeyManagerBase<Aead, XChaCha20Poly1305Key, Empty> {
-  public XChaCha20Poly1305KeyManager() {
-    super(Aead.class, XChaCha20Poly1305Key.class, Empty.class, TYPE_URL);
+public class XChaCha20Poly1305KeyManager extends KeyTypeManager<XChaCha20Poly1305Key> {
+  XChaCha20Poly1305KeyManager() {
+    super(
+        XChaCha20Poly1305Key.class,
+        new PrimitiveFactory<Aead, XChaCha20Poly1305Key>(Aead.class) {
+          @Override
+          public Aead getPrimitive(XChaCha20Poly1305Key key) throws GeneralSecurityException {
+            return new XChaCha20Poly1305(key.getKeyValue().toByteArray());
+          }
+        });
   }
 
-  public static final String TYPE_URL =
-      "type.googleapis.com/google.crypto.tink.XChaCha20Poly1305Key";
-
   private static final int KEY_SIZE_IN_BYTES = 32;
 
-  private static final int VERSION = 0;
-
   @Override
-  public Aead getPrimitiveFromKey(XChaCha20Poly1305Key keyProto) throws GeneralSecurityException {
-    return new XChaCha20Poly1305(keyProto.getKeyValue().toByteArray());
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.XChaCha20Poly1305Key";
   }
 
   @Override
   public int getVersion() {
-    return VERSION;
+    return 0;
   }
 
   @Override
-  protected XChaCha20Poly1305Key newKeyFromFormat(Empty unused) throws GeneralSecurityException {
-    return XChaCha20Poly1305Key.newBuilder()
-        .setVersion(VERSION)
-        .setKeyValue(ByteString.copyFrom(Random.randBytes(KEY_SIZE_IN_BYTES)))
-        .build();
-  }
-
-  @Override
-  protected KeyMaterialType keyMaterialType() {
+  public KeyMaterialType keyMaterialType() {
     return KeyMaterialType.SYMMETRIC;
   }
 
   @Override
-  protected XChaCha20Poly1305Key parseKeyProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return XChaCha20Poly1305Key.parseFrom(byteString);
-  }
-
-  @Override
-  protected Empty parseKeyFormatProto(ByteString byteString) throws InvalidProtocolBufferException {
-    return Empty.parseFrom(byteString);
-  }
-
-  @Override
-  protected void validateKey(XChaCha20Poly1305Key keyProto) throws GeneralSecurityException {
-    Validators.validateVersion(keyProto.getVersion(), VERSION);
-    if (keyProto.getKeyValue().size() != KEY_SIZE_IN_BYTES) {
+  public void validateKey(XChaCha20Poly1305Key key) throws GeneralSecurityException {
+    Validators.validateVersion(key.getVersion(), getVersion());
+    if (key.getKeyValue().size() != KEY_SIZE_IN_BYTES) {
       throw new GeneralSecurityException("invalid XChaCha20Poly1305Key: incorrect key length");
     }
   }
 
   @Override
-  protected void validateKeyFormat(Empty empty) throws GeneralSecurityException {}
+  public XChaCha20Poly1305Key parseKey(ByteString byteString)
+      throws InvalidProtocolBufferException {
+    return XChaCha20Poly1305Key.parseFrom(byteString);
+  }
+
+  @Override
+  public KeyFactory<XChaCha20Poly1305KeyFormat, XChaCha20Poly1305Key> keyFactory() {
+    return new KeyFactory<XChaCha20Poly1305KeyFormat, XChaCha20Poly1305Key>(
+        XChaCha20Poly1305KeyFormat.class) {
+      @Override
+      public void validateKeyFormat(XChaCha20Poly1305KeyFormat format)
+          throws GeneralSecurityException {}
+
+      @Override
+      public XChaCha20Poly1305KeyFormat parseKeyFormat(ByteString byteString)
+          throws InvalidProtocolBufferException {
+        return XChaCha20Poly1305KeyFormat.parseFrom(byteString);
+      }
+
+      @Override
+      public XChaCha20Poly1305Key createKey(XChaCha20Poly1305KeyFormat format)
+          throws GeneralSecurityException {
+        return XChaCha20Poly1305Key.newBuilder()
+            .setVersion(getVersion())
+            .setKeyValue(ByteString.copyFrom(Random.randBytes(KEY_SIZE_IN_BYTES)))
+            .build();
+      }
+    };
+  }
+
+  public static void register(boolean newKeyAllowed) throws GeneralSecurityException {
+    Registry.registerKeyManager(new XChaCha20Poly1305KeyManager(), newKeyAllowed);
+  }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/annotations/BUILD.bazel b/java/src/main/java/com/google/crypto/tink/annotations/BUILD.bazel
index 5a56f2a..b8e57cf 100644
--- a/java/src/main/java/com/google/crypto/tink/annotations/BUILD.bazel
+++ b/java/src/main/java/com/google/crypto/tink/annotations/BUILD.bazel
@@ -1,4 +1,4 @@
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
diff --git a/java/src/main/java/com/google/crypto/tink/config/BUILD.bazel b/java/src/main/java/com/google/crypto/tink/config/BUILD.bazel
index 9a5190d..ddfbef1 100644
--- a/java/src/main/java/com/google/crypto/tink/config/BUILD.bazel
+++ b/java/src/main/java/com/google/crypto/tink/config/BUILD.bazel
@@ -1,4 +1,4 @@
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
@@ -17,6 +17,7 @@
     name = "config",
     srcs = [":srcs"],
     javacopts = JAVACOPTS_OSS,
+    visibility = ["//visibility:public"],
     deps = [
         "//java/src/main/java/com/google/crypto/tink/daead",
         "//java/src/main/java/com/google/crypto/tink/hybrid",
@@ -30,6 +31,7 @@
     name = "android",
     srcs = [":srcs"],
     javacopts = JAVACOPTS_OSS,
+    visibility = ["//visibility:public"],
     deps = [
         "//java/src/main/java/com/google/crypto/tink/daead:android",
         "//java/src/main/java/com/google/crypto/tink/hybrid:android",
diff --git a/java/src/main/java/com/google/crypto/tink/config/TinkConfig.java b/java/src/main/java/com/google/crypto/tink/config/TinkConfig.java
index 1ce1592..0ec7186 100644
--- a/java/src/main/java/com/google/crypto/tink/config/TinkConfig.java
+++ b/java/src/main/java/com/google/crypto/tink/config/TinkConfig.java
@@ -61,7 +61,11 @@
           .setConfigName("TINK_1_1_0")
           .build();
 
-  /** @since 1.2.0 */
+  /**
+   * @deprecated This is not supported anymore.
+   * @since 1.2.0
+   */
+  @Deprecated
   public static final RegistryConfig LATEST =
       RegistryConfig.newBuilder()
           .mergeFrom(HybridConfig.LATEST) // include AeadConfig.LATEST and MacConfig.LATEST
diff --git a/java/src/main/java/com/google/crypto/tink/daead/AesSivKeyManager.java b/java/src/main/java/com/google/crypto/tink/daead/AesSivKeyManager.java
index 7f3ebce..311dcb9 100644
--- a/java/src/main/java/com/google/crypto/tink/daead/AesSivKeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/daead/AesSivKeyManager.java
@@ -17,7 +17,8 @@
 package com.google.crypto.tink.daead;
 
 import com.google.crypto.tink.DeterministicAead;
-import com.google.crypto.tink.KeyManagerBase;
+import com.google.crypto.tink.KeyTypeManager;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.proto.AesSivKey;
 import com.google.crypto.tink.proto.AesSivKeyFormat;
 import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
@@ -34,54 +35,36 @@
  * This key manager generates new {@code AesSivKey} keys and produces new instances of {@code
  * AesSiv}.
  */
-class AesSivKeyManager extends KeyManagerBase<DeterministicAead, AesSivKey, AesSivKeyFormat> {
-  public AesSivKeyManager() {
-    super(DeterministicAead.class, AesSivKey.class, AesSivKeyFormat.class, TYPE_URL);
-  }
-
-  private static final int VERSION = 0;
-
-  public static final String TYPE_URL = "type.googleapis.com/google.crypto.tink.AesSivKey";
-
-  @Override
-  protected DeterministicAead getPrimitiveFromKey(AesSivKey keyProto)
-      throws GeneralSecurityException {
-    return new AesSiv(keyProto.getKeyValue().toByteArray());
+public class AesSivKeyManager extends KeyTypeManager<AesSivKey> {
+  AesSivKeyManager() {
+    super(
+        AesSivKey.class,
+        new PrimitiveFactory<DeterministicAead, AesSivKey>(DeterministicAead.class) {
+          @Override
+          public DeterministicAead getPrimitive(AesSivKey key) throws GeneralSecurityException {
+            return new AesSiv(key.getKeyValue().toByteArray());
+          }
+        });
   }
 
   @Override
-  public AesSivKey newKeyFromFormat(AesSivKeyFormat format) throws GeneralSecurityException {
-    return AesSivKey.newBuilder()
-        .setKeyValue(ByteString.copyFrom(Random.randBytes(format.getKeySize())))
-        .setVersion(VERSION)
-        .build();
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.AesSivKey";
   }
 
   @Override
   public int getVersion() {
-    return VERSION;
+    return 0;
   }
 
   @Override
-  protected KeyMaterialType keyMaterialType() {
+  public KeyMaterialType keyMaterialType() {
     return KeyMaterialType.SYMMETRIC;
   }
 
   @Override
-  protected AesSivKey parseKeyProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return AesSivKey.parseFrom(byteString);
-  }
-
-  @Override
-  protected AesSivKeyFormat parseKeyFormatProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return AesSivKeyFormat.parseFrom(byteString);
-  }
-
-  @Override
-  protected void validateKey(AesSivKey key) throws GeneralSecurityException {
-    Validators.validateVersion(key.getVersion(), VERSION);
+  public void validateKey(AesSivKey key) throws GeneralSecurityException {
+    Validators.validateVersion(key.getVersion(), getVersion());
     if (key.getKeyValue().size() != 64) {
       throw new InvalidKeyException(
           "invalid key size: " + key.getKeyValue().size() + ". Valid keys must have 64 bytes.");
@@ -89,10 +72,38 @@
   }
 
   @Override
-  protected void validateKeyFormat(AesSivKeyFormat format) throws GeneralSecurityException {
-    if (format.getKeySize() != 64) {
-      throw new InvalidAlgorithmParameterException(
-          "invalid key size: " + format.getKeySize() + ". Valid keys must have 64 bytes.");
-    }
+  public AesSivKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
+    return AesSivKey.parseFrom(byteString);
+  }
+
+  @Override
+  public KeyFactory<AesSivKeyFormat, AesSivKey> keyFactory() {
+    return new KeyFactory<AesSivKeyFormat, AesSivKey>(AesSivKeyFormat.class) {
+      @Override
+      public void validateKeyFormat(AesSivKeyFormat format) throws GeneralSecurityException {
+        if (format.getKeySize() != 64) {
+          throw new InvalidAlgorithmParameterException(
+              "invalid key size: " + format.getKeySize() + ". Valid keys must have 64 bytes.");
+        }
+      }
+
+      @Override
+      public AesSivKeyFormat parseKeyFormat(ByteString byteString)
+          throws InvalidProtocolBufferException {
+        return AesSivKeyFormat.parseFrom(byteString);
+      }
+
+      @Override
+      public AesSivKey createKey(AesSivKeyFormat format) throws GeneralSecurityException {
+        return AesSivKey.newBuilder()
+            .setKeyValue(ByteString.copyFrom(Random.randBytes(format.getKeySize())))
+            .setVersion(getVersion())
+            .build();
+      }
+    };
+  }
+
+  public static void register(boolean newKeyAllowed) throws GeneralSecurityException {
+    Registry.registerKeyManager(new AesSivKeyManager(), newKeyAllowed);
   }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/daead/BUILD.bazel b/java/src/main/java/com/google/crypto/tink/daead/BUILD.bazel
index d2f39ca..1cbc9e3 100644
--- a/java/src/main/java/com/google/crypto/tink/daead/BUILD.bazel
+++ b/java/src/main/java/com/google/crypto/tink/daead/BUILD.bazel
@@ -1,4 +1,4 @@
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
@@ -31,6 +31,7 @@
     name = "daead",
     srcs = [":srcs"],
     javacopts = JAVACOPTS_OSS,
+    visibility = ["//visibility:public"],
     deps = full_protos + [
         "//java/src/main/java/com/google/crypto/tink",
         "//java/src/main/java/com/google/crypto/tink/subtle",
@@ -43,6 +44,7 @@
     name = "android",
     srcs = [":srcs"],
     javacopts = JAVACOPTS_OSS,
+    visibility = ["//visibility:public"],
     deps = lite_protos + [
         "//java/src/main/java/com/google/crypto/tink:android",
         "//java/src/main/java/com/google/crypto/tink/subtle",
diff --git a/java/src/main/java/com/google/crypto/tink/daead/DeterministicAeadCatalogue.java b/java/src/main/java/com/google/crypto/tink/daead/DeterministicAeadCatalogue.java
deleted file mode 100644
index cbe75d8..0000000
--- a/java/src/main/java/com/google/crypto/tink/daead/DeterministicAeadCatalogue.java
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package com.google.crypto.tink.daead;
-
-import com.google.crypto.tink.Catalogue;
-import com.google.crypto.tink.DeterministicAead;
-import com.google.crypto.tink.KeyManager;
-import com.google.crypto.tink.PrimitiveWrapper;
-import java.security.GeneralSecurityException;
-
-/** A catalogue of {@link DeterministicAead} key managers. */
-class DeterministicAeadCatalogue implements Catalogue<DeterministicAead> {
-  public DeterministicAeadCatalogue() {}
-
-  /**
-   * @return a KeyManager for the given {@code typeUrl}, {@code primitiveName} and version at least
-   *     {@code minVersion} (if it exists in the catalogue).
-   */
-  @Override
-  public KeyManager<DeterministicAead> getKeyManager(
-      String typeUrl, String primitiveName, int minVersion) throws GeneralSecurityException {
-    KeyManager<DeterministicAead> keyManager;
-    switch (primitiveName.toLowerCase()) {
-      case "deterministicaead":
-        keyManager = daeadKeyManager(typeUrl);
-        break;
-      default:
-        throw new GeneralSecurityException(
-            String.format("No support for primitive '%s'.", primitiveName));
-    }
-    if (keyManager.getVersion() < minVersion) {
-      throw new GeneralSecurityException(
-          String.format(
-              "No key manager for key type '%s' with version at least %d.", typeUrl, minVersion));
-    }
-    return keyManager;
-  }
-
-  private KeyManager<DeterministicAead> daeadKeyManager(String typeUrl)
-      throws GeneralSecurityException {
-    switch (typeUrl) {
-      case AesSivKeyManager.TYPE_URL:
-        return new AesSivKeyManager();
-      default:
-        throw new GeneralSecurityException(
-            String.format(
-                "No support for primitive 'DeterministicAead' with key type '%s'.", typeUrl));
-    }
-  }
-
-  @Override
-  public PrimitiveWrapper<DeterministicAead> getPrimitiveWrapper() {
-    return new DeterministicAeadWrapper();
-  }
-}
diff --git a/java/src/main/java/com/google/crypto/tink/daead/DeterministicAeadConfig.java b/java/src/main/java/com/google/crypto/tink/daead/DeterministicAeadConfig.java
index a63223c..b81a9e1 100644
--- a/java/src/main/java/com/google/crypto/tink/daead/DeterministicAeadConfig.java
+++ b/java/src/main/java/com/google/crypto/tink/daead/DeterministicAeadConfig.java
@@ -16,7 +16,6 @@
 
 package com.google.crypto.tink.daead;
 
-import com.google.crypto.tink.Config;
 import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.proto.RegistryConfig;
 import java.security.GeneralSecurityException;
@@ -37,27 +36,18 @@
  * @since 1.1.0
  */
 public final class DeterministicAeadConfig {
-  public static final String AES_SIV_TYPE_URL = AesSivKeyManager.TYPE_URL;
-
-  private static final String CATALOGUE_NAME = "TinkDeterministicAead";
-  private static final String PRIMITIVE_NAME = "DeterministicAead";
+  public static final String AES_SIV_TYPE_URL = new AesSivKeyManager().getKeyType();
 
   /** @deprecated */
   @Deprecated
-  public static final RegistryConfig TINK_1_1_0 =
-      RegistryConfig.newBuilder()
-          .addEntry(
-              Config.getTinkKeyTypeEntry(CATALOGUE_NAME, PRIMITIVE_NAME, "AesSivKey", 0, true))
-          .setConfigName("TINK_DETERMINISTIC_AEAD_1_1_0")
-          .build();
+  public static final RegistryConfig TINK_1_1_0 = RegistryConfig.getDefaultInstance();
 
-  /** @since 1.2.0 */
-  public static final RegistryConfig LATEST =
-      RegistryConfig.newBuilder()
-          .addEntry(
-              Config.getTinkKeyTypeEntry(CATALOGUE_NAME, PRIMITIVE_NAME, "AesSivKey", 0, true))
-          .setConfigName("TINK_DETERMINISTIC_AEAD")
-          .build();
+  /**
+   * @deprecated
+   * @since 1.2.0
+   */
+  @Deprecated
+  public static final RegistryConfig LATEST = RegistryConfig.getDefaultInstance();
 
   static {
     try {
@@ -90,8 +80,7 @@
    * @since 1.2.0
    */
   public static void register() throws GeneralSecurityException {
-    Registry.addCatalogue(CATALOGUE_NAME, new DeterministicAeadCatalogue());
-    Config.register(LATEST);
-    Registry.registerPrimitiveWrapper(new DeterministicAeadWrapper());
+    AesSivKeyManager.register(/* newKeyAllowed = */ true);
+    DeterministicAeadWrapper.register();
   }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/daead/DeterministicAeadKeyTemplates.java b/java/src/main/java/com/google/crypto/tink/daead/DeterministicAeadKeyTemplates.java
index 91cd3ea..68ef381 100644
--- a/java/src/main/java/com/google/crypto/tink/daead/DeterministicAeadKeyTemplates.java
+++ b/java/src/main/java/com/google/crypto/tink/daead/DeterministicAeadKeyTemplates.java
@@ -28,7 +28,7 @@
  * <pre>
  *   Config.register(DeterministicAeadConfig.TINK_1_1_0);
  *   KeysetHandle handle = KeysetHandle.generateNew(DeterministicAeadKeyTemplates.AES256_SIV);
- *   DeterministicAead daead = DeterministicAeadFactory.getPrimitive(handle);
+ *   DeterministicAead daead = handle.getPrimitive(DeterministicAead.class);
  * </pre>
  *
  * @since 1.1.0
@@ -45,7 +45,7 @@
     AesSivKeyFormat format = AesSivKeyFormat.newBuilder().setKeySize(keySize).build();
     return KeyTemplate.newBuilder()
         .setValue(format.toByteString())
-        .setTypeUrl(AesSivKeyManager.TYPE_URL)
+        .setTypeUrl(new AesSivKeyManager().getKeyType())
         .setOutputPrefixType(OutputPrefixType.TINK)
         .build();
   }
diff --git a/java/src/main/java/com/google/crypto/tink/daead/DeterministicAeadWrapper.java b/java/src/main/java/com/google/crypto/tink/daead/DeterministicAeadWrapper.java
index 5e18766..089561a 100644
--- a/java/src/main/java/com/google/crypto/tink/daead/DeterministicAeadWrapper.java
+++ b/java/src/main/java/com/google/crypto/tink/daead/DeterministicAeadWrapper.java
@@ -20,6 +20,7 @@
 import com.google.crypto.tink.DeterministicAead;
 import com.google.crypto.tink.PrimitiveSet;
 import com.google.crypto.tink.PrimitiveWrapper;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.subtle.Bytes;
 import java.security.GeneralSecurityException;
 import java.util.Arrays;
@@ -35,7 +36,7 @@
  * select the right key in the set. If the keys associated with the prefix do not work, the
  * primitive tries all keys with {@link com.google.crypto.tink.proto.OutputPrefixType#RAW}.
  */
-public final class DeterministicAeadWrapper implements PrimitiveWrapper<DeterministicAead> {
+public class DeterministicAeadWrapper implements PrimitiveWrapper<DeterministicAead> {
   private static final Logger logger = Logger.getLogger(DeterministicAeadWrapper.class.getName());
 
   private static class WrappedDeterministicAead implements DeterministicAead {
@@ -90,6 +91,8 @@
     }
   }
 
+  DeterministicAeadWrapper() {}
+
   @Override
   public DeterministicAead wrap(final PrimitiveSet<DeterministicAead> primitives) {
     return new WrappedDeterministicAead(primitives);
@@ -99,4 +102,8 @@
   public Class<DeterministicAead> getPrimitiveClass() {
     return DeterministicAead.class;
   }
+
+  public static void register() throws GeneralSecurityException {
+    Registry.registerPrimitiveWrapper(new DeterministicAeadWrapper());
+  }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/hybrid/BUILD.bazel b/java/src/main/java/com/google/crypto/tink/hybrid/BUILD.bazel
index 54aa3b1..275730e 100644
--- a/java/src/main/java/com/google/crypto/tink/hybrid/BUILD.bazel
+++ b/java/src/main/java/com/google/crypto/tink/hybrid/BUILD.bazel
@@ -1,4 +1,4 @@
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
@@ -43,6 +43,7 @@
         ":srcs",
     ],
     javacopts = JAVACOPTS_OSS,
+    visibility = ["//visibility:public"],
     deps = full_protos + [
         "//java/src/main/java/com/google/crypto/tink",
         "//java/src/main/java/com/google/crypto/tink/aead",
@@ -59,6 +60,7 @@
         ":srcs",
     ],
     javacopts = JAVACOPTS_OSS,
+    visibility = ["//visibility:public"],
     deps = lite_protos + [
         "//java/src/main/java/com/google/crypto/tink:android",
         "//java/src/main/java/com/google/crypto/tink/aead:android",
diff --git a/java/src/main/java/com/google/crypto/tink/hybrid/EciesAeadHkdfPrivateKeyManager.java b/java/src/main/java/com/google/crypto/tink/hybrid/EciesAeadHkdfPrivateKeyManager.java
index fc3c636..621370c 100644
--- a/java/src/main/java/com/google/crypto/tink/hybrid/EciesAeadHkdfPrivateKeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/hybrid/EciesAeadHkdfPrivateKeyManager.java
@@ -17,14 +17,13 @@
 package com.google.crypto.tink.hybrid;
 
 import com.google.crypto.tink.HybridDecrypt;
-import com.google.crypto.tink.KeyManagerBase;
-import com.google.crypto.tink.PrivateKeyManager;
+import com.google.crypto.tink.PrivateKeyTypeManager;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.proto.EciesAeadHkdfKeyFormat;
 import com.google.crypto.tink.proto.EciesAeadHkdfParams;
 import com.google.crypto.tink.proto.EciesAeadHkdfPrivateKey;
 import com.google.crypto.tink.proto.EciesAeadHkdfPublicKey;
 import com.google.crypto.tink.proto.EciesHkdfKemParams;
-import com.google.crypto.tink.proto.KeyData;
 import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.subtle.EciesAeadHkdfDemHelper;
 import com.google.crypto.tink.subtle.EciesAeadHkdfHybridDecrypt;
@@ -42,112 +41,123 @@
  * This key manager generates new {@code EciesAeadHkdfPrivateKey} keys and produces new instances of
  * {@code EciesAeadHkdfHybridDecrypt}.
  */
-class EciesAeadHkdfPrivateKeyManager
-    extends KeyManagerBase<HybridDecrypt, EciesAeadHkdfPrivateKey, EciesAeadHkdfKeyFormat>
-    implements PrivateKeyManager<HybridDecrypt> {
-  public EciesAeadHkdfPrivateKeyManager() {
+public class EciesAeadHkdfPrivateKeyManager
+    extends PrivateKeyTypeManager<EciesAeadHkdfPrivateKey, EciesAeadHkdfPublicKey> {
+  EciesAeadHkdfPrivateKeyManager() {
     super(
-        HybridDecrypt.class, EciesAeadHkdfPrivateKey.class, EciesAeadHkdfKeyFormat.class, TYPE_URL);
+        EciesAeadHkdfPrivateKey.class,
+        EciesAeadHkdfPublicKey.class,
+        new PrimitiveFactory<HybridDecrypt, EciesAeadHkdfPrivateKey>(HybridDecrypt.class) {
+          @Override
+          public HybridDecrypt getPrimitive(EciesAeadHkdfPrivateKey recipientKeyProto)
+              throws GeneralSecurityException {
+            EciesAeadHkdfParams eciesParams = recipientKeyProto.getPublicKey().getParams();
+            EciesHkdfKemParams kemParams = eciesParams.getKemParams();
+
+            ECPrivateKey recipientPrivateKey =
+                EllipticCurves.getEcPrivateKey(
+                    HybridUtil.toCurveType(kemParams.getCurveType()),
+                    recipientKeyProto.getKeyValue().toByteArray());
+            EciesAeadHkdfDemHelper demHelper =
+                new RegistryEciesAeadHkdfDemHelper(eciesParams.getDemParams().getAeadDem());
+            return new EciesAeadHkdfHybridDecrypt(
+                recipientPrivateKey,
+                kemParams.getHkdfSalt().toByteArray(),
+                HybridUtil.toHmacAlgo(kemParams.getHkdfHashType()),
+                HybridUtil.toPointFormatType(eciesParams.getEcPointFormat()),
+                demHelper);
+          }
+        });
   }
 
-  private static final int VERSION = 0;
-
-  public static final String TYPE_URL =
-      "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey";
+  @Override
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey";
+  }
 
   @Override
-  public HybridDecrypt getPrimitiveFromKey(EciesAeadHkdfPrivateKey recipientKeyProto)
+  public int getVersion() {
+    return 0;
+  }
+
+  @Override
+  public EciesAeadHkdfPublicKey getPublicKey(EciesAeadHkdfPrivateKey key)
       throws GeneralSecurityException {
-    EciesAeadHkdfParams eciesParams = recipientKeyProto.getPublicKey().getParams();
-    EciesHkdfKemParams kemParams = eciesParams.getKemParams();
-
-    ECPrivateKey recipientPrivateKey =
-        EllipticCurves.getEcPrivateKey(
-            HybridUtil.toCurveType(kemParams.getCurveType()),
-            recipientKeyProto.getKeyValue().toByteArray());
-    EciesAeadHkdfDemHelper demHelper =
-        new RegistryEciesAeadHkdfDemHelper(eciesParams.getDemParams().getAeadDem());
-    return new EciesAeadHkdfHybridDecrypt(
-        recipientPrivateKey,
-        kemParams.getHkdfSalt().toByteArray(),
-        HybridUtil.toHmacAlgo(kemParams.getHkdfHashType()),
-        HybridUtil.toPointFormatType(eciesParams.getEcPointFormat()),
-        demHelper);
+    return key.getPublicKey();
   }
 
   @Override
-  public EciesAeadHkdfPrivateKey newKeyFromFormat(EciesAeadHkdfKeyFormat eciesKeyFormat)
-      throws GeneralSecurityException {
-    EciesHkdfKemParams kemParams = eciesKeyFormat.getParams().getKemParams();
-    KeyPair keyPair =
-        EllipticCurves.generateKeyPair(HybridUtil.toCurveType(kemParams.getCurveType()));
-    ECPublicKey pubKey = (ECPublicKey) keyPair.getPublic();
-    ECPrivateKey privKey = (ECPrivateKey) keyPair.getPrivate();
-    ECPoint w = pubKey.getW();
-
-    // Creates EciesAeadHkdfPublicKey.
-    EciesAeadHkdfPublicKey eciesPublicKey =
-        EciesAeadHkdfPublicKey.newBuilder()
-            .setVersion(VERSION)
-            .setParams(eciesKeyFormat.getParams())
-            .setX(ByteString.copyFrom(w.getAffineX().toByteArray()))
-            .setY(ByteString.copyFrom(w.getAffineY().toByteArray()))
-            .build();
-
-    // Creates EciesAeadHkdfPrivateKey.
-    return EciesAeadHkdfPrivateKey.newBuilder()
-        .setVersion(VERSION)
-        .setPublicKey(eciesPublicKey)
-        .setKeyValue(ByteString.copyFrom(privKey.getS().toByteArray()))
-        .build();
-  }
-
-  @Override
-  public KeyData getPublicKeyData(ByteString serializedKey) throws GeneralSecurityException {
-    try {
-      EciesAeadHkdfPrivateKey privKeyProto = EciesAeadHkdfPrivateKey.parseFrom(serializedKey);
-      return KeyData.newBuilder()
-          .setTypeUrl(EciesAeadHkdfPublicKeyManager.TYPE_URL)
-          .setValue(privKeyProto.getPublicKey().toByteString())
-          .setKeyMaterialType(KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC)
-          .build();
-    } catch (InvalidProtocolBufferException e) {
-      throw new GeneralSecurityException("expected serialized EciesAeadHkdfPrivateKey proto", e);
-    }
-  }
-
-  @Override
-  protected KeyMaterialType keyMaterialType() {
+  public KeyMaterialType keyMaterialType() {
     return KeyMaterialType.ASYMMETRIC_PRIVATE;
   }
 
   @Override
-  protected EciesAeadHkdfPrivateKey parseKeyProto(ByteString byteString)
+  public EciesAeadHkdfPrivateKey parseKey(ByteString byteString)
       throws InvalidProtocolBufferException {
     return EciesAeadHkdfPrivateKey.parseFrom(byteString);
   }
 
   @Override
-  protected EciesAeadHkdfKeyFormat parseKeyFormatProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return EciesAeadHkdfKeyFormat.parseFrom(byteString);
-  }
-
-  @Override
-  public int getVersion() {
-    return VERSION;
-  }
-
-  @Override
-  protected void validateKey(EciesAeadHkdfPrivateKey keyProto) throws GeneralSecurityException {
-    // TODO(b/74249437): add more checks.
-    Validators.validateVersion(keyProto.getVersion(), VERSION);
+  public void validateKey(EciesAeadHkdfPrivateKey keyProto) throws GeneralSecurityException {
+    if (keyProto.getKeyValue().isEmpty()) {
+      throw new GeneralSecurityException("invalid ECIES private key");
+    }
+    Validators.validateVersion(keyProto.getVersion(), getVersion());
     HybridUtil.validate(keyProto.getPublicKey().getParams());
   }
 
   @Override
-  protected void validateKeyFormat(EciesAeadHkdfKeyFormat eciesKeyFormat)
-      throws GeneralSecurityException {
-    HybridUtil.validate(eciesKeyFormat.getParams());
+  public KeyFactory<EciesAeadHkdfKeyFormat, EciesAeadHkdfPrivateKey> keyFactory() {
+    return new KeyFactory<EciesAeadHkdfKeyFormat, EciesAeadHkdfPrivateKey>(
+        EciesAeadHkdfKeyFormat.class) {
+      @Override
+      public void validateKeyFormat(EciesAeadHkdfKeyFormat eciesKeyFormat)
+          throws GeneralSecurityException {
+        HybridUtil.validate(eciesKeyFormat.getParams());
+      }
+
+      @Override
+      public EciesAeadHkdfKeyFormat parseKeyFormat(ByteString byteString)
+          throws InvalidProtocolBufferException {
+        return EciesAeadHkdfKeyFormat.parseFrom(byteString);
+      }
+
+      @Override
+      public EciesAeadHkdfPrivateKey createKey(EciesAeadHkdfKeyFormat eciesKeyFormat)
+          throws GeneralSecurityException {
+        EciesHkdfKemParams kemParams = eciesKeyFormat.getParams().getKemParams();
+        KeyPair keyPair =
+            EllipticCurves.generateKeyPair(HybridUtil.toCurveType(kemParams.getCurveType()));
+        ECPublicKey pubKey = (ECPublicKey) keyPair.getPublic();
+        ECPrivateKey privKey = (ECPrivateKey) keyPair.getPrivate();
+        ECPoint w = pubKey.getW();
+
+        // Creates EciesAeadHkdfPublicKey.
+        EciesAeadHkdfPublicKey eciesPublicKey =
+            EciesAeadHkdfPublicKey.newBuilder()
+                .setVersion(getVersion())
+                .setParams(eciesKeyFormat.getParams())
+                .setX(ByteString.copyFrom(w.getAffineX().toByteArray()))
+                .setY(ByteString.copyFrom(w.getAffineY().toByteArray()))
+                .build();
+
+        // Creates EciesAeadHkdfPrivateKey.
+        return EciesAeadHkdfPrivateKey.newBuilder()
+            .setVersion(getVersion())
+            .setPublicKey(eciesPublicKey)
+            .setKeyValue(ByteString.copyFrom(privKey.getS().toByteArray()))
+            .build();
+      }
+    };
+  }
+
+  /**
+   * Registers the {@link EciesAeadHkdfPrivateKeyManager} and the {@link
+   * EciesAeadHkdfPublicKeyManager} with the registry, so that the the EciesAeadHkdfKeys can be used
+   * with Tink.
+   */
+  public static void registerPair(boolean newKeyAllowed) throws GeneralSecurityException {
+    Registry.registerAsymmetricKeyManagers(
+        new EciesAeadHkdfPrivateKeyManager(), new EciesAeadHkdfPublicKeyManager(), newKeyAllowed);
   }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/hybrid/EciesAeadHkdfPublicKeyManager.java b/java/src/main/java/com/google/crypto/tink/hybrid/EciesAeadHkdfPublicKeyManager.java
index 94806dd..7a32a48 100644
--- a/java/src/main/java/com/google/crypto/tink/hybrid/EciesAeadHkdfPublicKeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/hybrid/EciesAeadHkdfPublicKeyManager.java
@@ -17,11 +17,10 @@
 package com.google.crypto.tink.hybrid;
 
 import com.google.crypto.tink.HybridEncrypt;
-import com.google.crypto.tink.KeyManagerBase;
+import com.google.crypto.tink.KeyTypeManager;
 import com.google.crypto.tink.proto.EciesAeadHkdfParams;
 import com.google.crypto.tink.proto.EciesAeadHkdfPublicKey;
 import com.google.crypto.tink.proto.EciesHkdfKemParams;
-import com.google.crypto.tink.proto.Empty;
 import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.subtle.EciesAeadHkdfDemHelper;
 import com.google.crypto.tink.subtle.EciesAeadHkdfHybridEncrypt;
@@ -36,70 +35,58 @@
  * This key manager produces new instances of {@code EciesAeadHkdfHybridEncrypt}. It doesn't support
  * key generation.
  */
-class EciesAeadHkdfPublicKeyManager
-    extends KeyManagerBase<HybridEncrypt, EciesAeadHkdfPublicKey, Empty> {
+class EciesAeadHkdfPublicKeyManager extends KeyTypeManager<EciesAeadHkdfPublicKey> {
   public EciesAeadHkdfPublicKeyManager() {
-    super(HybridEncrypt.class, EciesAeadHkdfPublicKey.class, Empty.class, TYPE_URL);
-  }
-
-  private static final int VERSION = 0;
-
-  public static final String TYPE_URL =
-      "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey";
-
-  @Override
-  protected HybridEncrypt getPrimitiveFromKey(EciesAeadHkdfPublicKey recipientKeyProto)
-      throws GeneralSecurityException {
-    EciesAeadHkdfParams eciesParams = recipientKeyProto.getParams();
-    EciesHkdfKemParams kemParams = eciesParams.getKemParams();
-    ECPublicKey recipientPublicKey =
-        EllipticCurves.getEcPublicKey(
-            HybridUtil.toCurveType(kemParams.getCurveType()),
-            recipientKeyProto.getX().toByteArray(),
-            recipientKeyProto.getY().toByteArray());
-    EciesAeadHkdfDemHelper demHelper =
-        new RegistryEciesAeadHkdfDemHelper(eciesParams.getDemParams().getAeadDem());
-    return new EciesAeadHkdfHybridEncrypt(
-        recipientPublicKey,
-        kemParams.getHkdfSalt().toByteArray(),
-        HybridUtil.toHmacAlgo(kemParams.getHkdfHashType()),
-        HybridUtil.toPointFormatType(eciesParams.getEcPointFormat()),
-        demHelper);
+    super(
+        EciesAeadHkdfPublicKey.class,
+        new PrimitiveFactory<HybridEncrypt, EciesAeadHkdfPublicKey>(HybridEncrypt.class) {
+          @Override
+          public HybridEncrypt getPrimitive(EciesAeadHkdfPublicKey recipientKeyProto)
+              throws GeneralSecurityException {
+            EciesAeadHkdfParams eciesParams = recipientKeyProto.getParams();
+            EciesHkdfKemParams kemParams = eciesParams.getKemParams();
+            ECPublicKey recipientPublicKey =
+                EllipticCurves.getEcPublicKey(
+                    HybridUtil.toCurveType(kemParams.getCurveType()),
+                    recipientKeyProto.getX().toByteArray(),
+                    recipientKeyProto.getY().toByteArray());
+            EciesAeadHkdfDemHelper demHelper =
+                new RegistryEciesAeadHkdfDemHelper(eciesParams.getDemParams().getAeadDem());
+            return new EciesAeadHkdfHybridEncrypt(
+                recipientPublicKey,
+                kemParams.getHkdfSalt().toByteArray(),
+                HybridUtil.toHmacAlgo(kemParams.getHkdfHashType()),
+                HybridUtil.toPointFormatType(eciesParams.getEcPointFormat()),
+                demHelper);
+          }
+        });
   }
 
   @Override
-  public EciesAeadHkdfPublicKey newKeyFromFormat(Empty format) throws GeneralSecurityException {
-    throw new GeneralSecurityException("Not implemented.");
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey";
   }
 
   @Override
   public int getVersion() {
-    return VERSION;
+    return 0;
   }
 
   @Override
-  protected KeyMaterialType keyMaterialType() {
+  public KeyMaterialType keyMaterialType() {
     return KeyMaterialType.ASYMMETRIC_PUBLIC;
   }
 
   @Override
-  protected EciesAeadHkdfPublicKey parseKeyProto(ByteString byteString)
+  public EciesAeadHkdfPublicKey parseKey(ByteString byteString)
       throws InvalidProtocolBufferException {
     return EciesAeadHkdfPublicKey.parseFrom(byteString);
   }
 
   @Override
-  protected Empty parseKeyFormatProto(ByteString byteString) throws InvalidProtocolBufferException {
-    return Empty.parseFrom(byteString);
-  }
-
-  @Override
-  protected void validateKey(EciesAeadHkdfPublicKey key) throws GeneralSecurityException {
+  public void validateKey(EciesAeadHkdfPublicKey key) throws GeneralSecurityException {
     // TODO(b/74251423): add more checks.
-    Validators.validateVersion(key.getVersion(), VERSION);
+    Validators.validateVersion(key.getVersion(), getVersion());
     HybridUtil.validate(key.getParams());
   }
-
-  @Override
-  protected void validateKeyFormat(Empty unused) throws GeneralSecurityException {}
 }
diff --git a/java/src/main/java/com/google/crypto/tink/hybrid/HybridConfig.java b/java/src/main/java/com/google/crypto/tink/hybrid/HybridConfig.java
index 43814b3..fa268d1 100644
--- a/java/src/main/java/com/google/crypto/tink/hybrid/HybridConfig.java
+++ b/java/src/main/java/com/google/crypto/tink/hybrid/HybridConfig.java
@@ -16,7 +16,6 @@
 
 package com.google.crypto.tink.hybrid;
 
-import com.google.crypto.tink.Config;
 import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.aead.AeadConfig;
 import com.google.crypto.tink.proto.RegistryConfig;
@@ -41,62 +40,23 @@
  */
 public final class HybridConfig {
   public static final String ECIES_AEAD_HKDF_PUBLIC_KEY_TYPE_URL =
-      EciesAeadHkdfPublicKeyManager.TYPE_URL;
+      new EciesAeadHkdfPublicKeyManager().getKeyType();
   public static final String ECIES_AEAD_HKDF_PRIVATE_KEY_TYPE_URL =
-      EciesAeadHkdfPrivateKeyManager.TYPE_URL;
-  private static final String HYBRID_ENCRYPT_CATALOGUE_NAME = "TinkHybridEncrypt";
-  private static final String HYBRID_DECRYPT_CATALOGUE_NAME = "TinkHybridDecrypt";
+      new EciesAeadHkdfPrivateKeyManager().getKeyType();
 
   /** @deprecated */
-  @Deprecated
-  public static final RegistryConfig TINK_1_0_0 =
-      RegistryConfig.newBuilder()
-          .mergeFrom(AeadConfig.TINK_1_0_0)
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  HYBRID_DECRYPT_CATALOGUE_NAME,
-                  "HybridDecrypt",
-                  "EciesAeadHkdfPrivateKey",
-                  0,
-                  true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  HYBRID_ENCRYPT_CATALOGUE_NAME,
-                  "HybridEncrypt",
-                  "EciesAeadHkdfPublicKey",
-                  0,
-                  true))
-          .setConfigName("TINK_HYBRID_1_0_0")
-          .build();
-
+  @Deprecated public static final RegistryConfig TINK_1_0_0 = RegistryConfig.getDefaultInstance();
   /**
    * @deprecated
    * @since 1.1.0
    */
-  @Deprecated
-  public static final RegistryConfig TINK_1_1_0 =
-      RegistryConfig.newBuilder().mergeFrom(TINK_1_0_0).setConfigName("TINK_HYBRID_1_1_0").build();
+  @Deprecated public static final RegistryConfig TINK_1_1_0 = RegistryConfig.getDefaultInstance();
 
-  /** @since 1.2.0 */
-  public static final RegistryConfig LATEST =
-      RegistryConfig.newBuilder()
-          .mergeFrom(AeadConfig.LATEST)
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  HYBRID_DECRYPT_CATALOGUE_NAME,
-                  "HybridDecrypt",
-                  "EciesAeadHkdfPrivateKey",
-                  0,
-                  true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  HYBRID_ENCRYPT_CATALOGUE_NAME,
-                  "HybridEncrypt",
-                  "EciesAeadHkdfPublicKey",
-                  0,
-                  true))
-          .setConfigName("TINK_HYBRID")
-          .build();
+  /**
+   * @deprecated
+   * @since 1.2.0
+   */
+  @Deprecated public static final RegistryConfig LATEST = RegistryConfig.getDefaultInstance();
 
   static {
     try {
@@ -134,10 +94,9 @@
    * @since 1.2.0
    */
   public static void register() throws GeneralSecurityException {
-    // The order of these calls matters.
-    AeadConfig.register(); // includes Mac
-    Registry.addCatalogue(HYBRID_ENCRYPT_CATALOGUE_NAME, new HybridEncryptCatalogue());
-    Registry.addCatalogue(HYBRID_DECRYPT_CATALOGUE_NAME, new HybridDecryptCatalogue());
-    Config.register(LATEST);
+    AeadConfig.register();
+    EciesAeadHkdfPrivateKeyManager.registerPair(/*newKeyAllowed=*/true);
+    HybridDecryptWrapper.register();
+    HybridEncryptWrapper.register();
   }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/hybrid/HybridDecryptCatalogue.java b/java/src/main/java/com/google/crypto/tink/hybrid/HybridDecryptCatalogue.java
deleted file mode 100644
index acf1bf9..0000000
--- a/java/src/main/java/com/google/crypto/tink/hybrid/HybridDecryptCatalogue.java
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package com.google.crypto.tink.hybrid;
-
-import com.google.crypto.tink.Catalogue;
-import com.google.crypto.tink.HybridDecrypt;
-import com.google.crypto.tink.KeyManager;
-import com.google.crypto.tink.PrimitiveWrapper;
-import java.security.GeneralSecurityException;
-
-/** A catalogue of {@link HybridDecrypt} key managers. */
-class HybridDecryptCatalogue implements Catalogue<HybridDecrypt> {
-  public HybridDecryptCatalogue() {}
-
-  /**
-   * @return a KeyManager for the given {@code typeUrl}, {@code primitiveName} and version at least
-   *     {@code minVersion} (if it exists in the catalogue).
-   */
-  @Override
-  public KeyManager<HybridDecrypt> getKeyManager(
-      String typeUrl, String primitiveName, int minVersion) throws GeneralSecurityException {
-    KeyManager<HybridDecrypt> keyManager;
-    switch (primitiveName.toLowerCase()) {
-      case "hybriddecrypt":
-        keyManager = hybridDecryptKeyManager(typeUrl);
-        break;
-      default:
-        throw new GeneralSecurityException(
-            String.format("No support for primitive '%s'.", primitiveName));
-    }
-    if (keyManager.getVersion() < minVersion) {
-      throw new GeneralSecurityException(
-          String.format(
-              "No key manager for key type '%s' with version at least %d.", typeUrl, minVersion));
-    }
-    return keyManager;
-  }
-
-  private KeyManager<HybridDecrypt> hybridDecryptKeyManager(String typeUrl)
-      throws GeneralSecurityException {
-    switch (typeUrl) {
-      case EciesAeadHkdfPrivateKeyManager.TYPE_URL:
-        return new EciesAeadHkdfPrivateKeyManager();
-      default:
-        throw new GeneralSecurityException(
-            String.format("No support for primitive 'HybridEncrypt' with key type '%s'.", typeUrl));
-    }
-  }
-
-  @Override
-  public PrimitiveWrapper<HybridDecrypt> getPrimitiveWrapper() {
-    return new HybridDecryptWrapper();
-  }
-}
diff --git a/java/src/main/java/com/google/crypto/tink/hybrid/HybridDecryptWrapper.java b/java/src/main/java/com/google/crypto/tink/hybrid/HybridDecryptWrapper.java
index dd72b09..68fd909 100644
--- a/java/src/main/java/com/google/crypto/tink/hybrid/HybridDecryptWrapper.java
+++ b/java/src/main/java/com/google/crypto/tink/hybrid/HybridDecryptWrapper.java
@@ -19,6 +19,7 @@
 import com.google.crypto.tink.HybridDecrypt;
 import com.google.crypto.tink.PrimitiveSet;
 import com.google.crypto.tink.PrimitiveWrapper;
+import com.google.crypto.tink.Registry;
 import java.security.GeneralSecurityException;
 import java.util.Arrays;
 import java.util.List;
@@ -32,7 +33,7 @@
  * the keys associated with the prefix do not work, the primitive tries all keys with {@link
  * com.google.crypto.tink.proto.OutputPrefixType#RAW}.
  */
-public final class HybridDecryptWrapper implements PrimitiveWrapper<HybridDecrypt> {
+public class HybridDecryptWrapper implements PrimitiveWrapper<HybridDecrypt> {
   private static final Logger logger = Logger.getLogger(HybridDecryptWrapper.class.getName());
 
   private static class WrappedHybridDecrypt implements HybridDecrypt {
@@ -73,6 +74,8 @@
     }
   }
 
+  HybridDecryptWrapper() {}
+
   @Override
   public HybridDecrypt wrap(final PrimitiveSet<HybridDecrypt> primitives) {
     return new WrappedHybridDecrypt(primitives);
@@ -82,4 +85,14 @@
   public Class<HybridDecrypt> getPrimitiveClass() {
     return HybridDecrypt.class;
   }
+
+  /**
+   * Register the wrapper within the registry.
+   *
+   * <p>This is required for calls to {@link Keyset.getPrimitive} with a {@link HybridDecrypt}
+   * argument.
+   */
+  public static void register() throws GeneralSecurityException {
+    Registry.registerPrimitiveWrapper(new HybridDecryptWrapper());
+  }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/hybrid/HybridEncryptCatalogue.java b/java/src/main/java/com/google/crypto/tink/hybrid/HybridEncryptCatalogue.java
deleted file mode 100644
index f404e92..0000000
--- a/java/src/main/java/com/google/crypto/tink/hybrid/HybridEncryptCatalogue.java
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package com.google.crypto.tink.hybrid;
-
-import com.google.crypto.tink.Catalogue;
-import com.google.crypto.tink.HybridEncrypt;
-import com.google.crypto.tink.KeyManager;
-import com.google.crypto.tink.PrimitiveWrapper;
-import java.security.GeneralSecurityException;
-
-/** A catalogue of {@link HybridEncrypt} key managers. */
-class HybridEncryptCatalogue implements Catalogue<HybridEncrypt> {
-  public HybridEncryptCatalogue() {}
-
-  /**
-   * @return a KeyManager for the given {@code typeUrl}, {@code primitiveName} and version at least
-   *     {@code minVersion} (if it exists in the catalogue).
-   */
-  @Override
-  public KeyManager<HybridEncrypt> getKeyManager(
-      String typeUrl, String primitiveName, int minVersion) throws GeneralSecurityException {
-    KeyManager<HybridEncrypt> keyManager;
-    switch (primitiveName.toLowerCase()) {
-      case "hybridencrypt":
-        keyManager = hybridEncryptKeyManager(typeUrl);
-        break;
-      default:
-        throw new GeneralSecurityException(
-            String.format("No support for primitive '%s'.", primitiveName));
-    }
-    if (keyManager.getVersion() < minVersion) {
-      throw new GeneralSecurityException(
-          String.format(
-              "No key manager for key type '%s' with version at least %d.", typeUrl, minVersion));
-    }
-    return keyManager;
-  }
-
-  private KeyManager<HybridEncrypt> hybridEncryptKeyManager(String typeUrl)
-      throws GeneralSecurityException {
-    switch (typeUrl) {
-      case EciesAeadHkdfPublicKeyManager.TYPE_URL:
-        return new EciesAeadHkdfPublicKeyManager();
-      default:
-        throw new GeneralSecurityException(
-            String.format("No support for primitive 'HybridEncrypt' with key type '%s'.", typeUrl));
-    }
-  }
-
-  @Override
-  public PrimitiveWrapper<HybridEncrypt> getPrimitiveWrapper() {
-    return new HybridEncryptWrapper();
-  }
-}
diff --git a/java/src/main/java/com/google/crypto/tink/hybrid/HybridEncryptWrapper.java b/java/src/main/java/com/google/crypto/tink/hybrid/HybridEncryptWrapper.java
index 87ed5e3..6574864 100644
--- a/java/src/main/java/com/google/crypto/tink/hybrid/HybridEncryptWrapper.java
+++ b/java/src/main/java/com/google/crypto/tink/hybrid/HybridEncryptWrapper.java
@@ -18,6 +18,7 @@
 import com.google.crypto.tink.HybridEncrypt;
 import com.google.crypto.tink.PrimitiveSet;
 import com.google.crypto.tink.PrimitiveWrapper;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.subtle.Bytes;
 import java.security.GeneralSecurityException;
 
@@ -28,7 +29,7 @@
  * it uses the primary key in the keyset, and prepends to the ciphertext a certain prefix associated
  * with the primary key.
  */
-public final class HybridEncryptWrapper implements PrimitiveWrapper<HybridEncrypt> {
+class HybridEncryptWrapper implements PrimitiveWrapper<HybridEncrypt> {
   private static class WrappedHybridEncrypt implements HybridEncrypt {
     final PrimitiveSet<HybridEncrypt> primitives;
 
@@ -54,4 +55,14 @@
   public Class<HybridEncrypt> getPrimitiveClass() {
     return HybridEncrypt.class;
   }
+
+  /**
+   * Register the wrapper within the registry.
+   *
+   * <p>This is required for calls to {@link Keyset.getPrimitive} with a {@link HybridEncrypt}
+   * argument.
+   */
+  public static void register() throws GeneralSecurityException {
+    Registry.registerPrimitiveWrapper(new HybridEncryptWrapper());
+  }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/hybrid/HybridKeyTemplates.java b/java/src/main/java/com/google/crypto/tink/hybrid/HybridKeyTemplates.java
index c5a6494..e9ba72e 100644
--- a/java/src/main/java/com/google/crypto/tink/hybrid/HybridKeyTemplates.java
+++ b/java/src/main/java/com/google/crypto/tink/hybrid/HybridKeyTemplates.java
@@ -39,7 +39,8 @@
  * Config.register(HybridConfig.TINK_1_0_0);
  * KeysetHandle handle = KeysetHandle.generateNew(
  *     HybridKeyTemplates.ECIES_P256_HKDF_HMAC_SHA256_AES128_GCM);
- * PublicKeySign signer = PublicKeySignFactory.getPrimitive(handle);
+ * HybridDecrypt decrypter = handle.getPrimitive(HybridDecrypt.class);
+ * HybridEncrypt encrypter = handle.getPublicKeysetHandle().getPrimitive(HybridDecrypt.class);
  * }</pre>
  *
  * @since 1.0.0
@@ -104,7 +105,7 @@
             createEciesAeadHkdfParams(curve, hashType, ecPointFormat, demKeyTemplate, salt))
         .build();
     return KeyTemplate.newBuilder()
-        .setTypeUrl(EciesAeadHkdfPrivateKeyManager.TYPE_URL)
+        .setTypeUrl(new EciesAeadHkdfPrivateKeyManager().getKeyType())
         .setOutputPrefixType(OutputPrefixType.TINK)
         .setValue(format.toByteString())
         .build();
diff --git a/java/src/main/java/com/google/crypto/tink/integration/android/AndroidKeysetManager.java b/java/src/main/java/com/google/crypto/tink/integration/android/AndroidKeysetManager.java
index 3eda5ac..f5e6988 100644
--- a/java/src/main/java/com/google/crypto/tink/integration/android/AndroidKeysetManager.java
+++ b/java/src/main/java/com/google/crypto/tink/integration/android/AndroidKeysetManager.java
@@ -86,7 +86,7 @@
  * @since 1.0.0
  */
 public final class AndroidKeysetManager {
-  private static final String TAG = AndroidKeysetManager.class.getName();
+  private static final String TAG = AndroidKeysetManager.class.getSimpleName();
   private final KeysetReader reader;
   private final KeysetWriter writer;
   private final boolean useKeystore;
diff --git a/java/src/main/java/com/google/crypto/tink/integration/android/BUILD.bazel b/java/src/main/java/com/google/crypto/tink/integration/android/BUILD.bazel
index 6ce8a20..d880a9c 100644
--- a/java/src/main/java/com/google/crypto/tink/integration/android/BUILD.bazel
+++ b/java/src/main/java/com/google/crypto/tink/integration/android/BUILD.bazel
@@ -1,4 +1,4 @@
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
@@ -28,6 +28,7 @@
         ":srcs",
     ],
     javacopts = JAVACOPTS_OSS,
+    visibility = ["//visibility:public"],
     deps = [
         ":protos",
         "//java/src/main/java/com/google/crypto/tink:android",
diff --git a/java/src/main/java/com/google/crypto/tink/integration/android/SharedPrefKeysetWriter.java b/java/src/main/java/com/google/crypto/tink/integration/android/SharedPrefKeysetWriter.java
index ae5cd17..23e36aa 100644
--- a/java/src/main/java/com/google/crypto/tink/integration/android/SharedPrefKeysetWriter.java
+++ b/java/src/main/java/com/google/crypto/tink/integration/android/SharedPrefKeysetWriter.java
@@ -59,11 +59,17 @@
 
   @Override
   public void write(Keyset keyset) throws IOException {
-    editor.putString(keysetName, Hex.encode(keyset.toByteArray())).apply();
+    boolean success = editor.putString(keysetName, Hex.encode(keyset.toByteArray())).commit();
+    if (!success) {
+      throw new IOException("Failed to write to SharedPreferences");
+    }
   }
 
   @Override
   public void write(EncryptedKeyset keyset) throws IOException {
-    editor.putString(keysetName, Hex.encode(keyset.toByteArray())).apply();
+    boolean success = editor.putString(keysetName, Hex.encode(keyset.toByteArray())).commit();
+    if (!success) {
+      throw new IOException("Failed to write to SharedPreferences");
+    }
   }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/integration/awskms/AwsKmsClient.java b/java/src/main/java/com/google/crypto/tink/integration/awskms/AwsKmsClient.java
index 31be1d6..6d1bb17 100644
--- a/java/src/main/java/com/google/crypto/tink/integration/awskms/AwsKmsClient.java
+++ b/java/src/main/java/com/google/crypto/tink/integration/awskms/AwsKmsClient.java
@@ -20,6 +20,7 @@
 import com.amazonaws.auth.AWSCredentialsProvider;
 import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
 import com.amazonaws.auth.PropertiesFileCredentialsProvider;
+import com.amazonaws.regions.Regions;
 import com.amazonaws.services.kms.AWSKMS;
 import com.amazonaws.services.kms.AWSKMSClientBuilder;
 import com.google.auto.service.AutoService;
@@ -112,7 +113,12 @@
   public KmsClient withCredentialsProvider(AWSCredentialsProvider provider)
       throws GeneralSecurityException {
     try {
-      this.client = AWSKMSClientBuilder.standard().withCredentials(provider).build();
+      String[] tokens = this.keyUri.split(":");
+      this.client =
+          AWSKMSClientBuilder.standard()
+              .withCredentials(provider)
+              .withRegion(Regions.fromName(tokens[4]))
+              .build();
       return this;
     } catch (AmazonServiceException e) {
       throw new GeneralSecurityException("cannot load credentials from provider", e);
@@ -123,8 +129,8 @@
   public Aead getAead(String uri) throws GeneralSecurityException {
     if (this.keyUri != null && !this.keyUri.equals(uri)) {
       throw new GeneralSecurityException(
-          String.format("this client is bound to %s, cannot load keys bound to %s",
-              this.keyUri, uri));
+          String.format(
+              "this client is bound to %s, cannot load keys bound to %s", this.keyUri, uri));
     }
     return new AwsKmsAead(client, Validators.validateKmsKeyUriAndRemovePrefix(PREFIX, uri));
   }
diff --git a/java/src/main/java/com/google/crypto/tink/integration/awskms/BUILD.bazel b/java/src/main/java/com/google/crypto/tink/integration/awskms/BUILD.bazel
index 26a65ca..967cd64 100644
--- a/java/src/main/java/com/google/crypto/tink/integration/awskms/BUILD.bazel
+++ b/java/src/main/java/com/google/crypto/tink/integration/awskms/BUILD.bazel
@@ -1,4 +1,4 @@
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
@@ -24,20 +24,12 @@
     plugins = [
         ":auto_service_plugin",
     ],
-    runtime_deps = [
-        "@com_fasterxml_jackson_core_jackson_annotations",
-        "@com_fasterxml_jackson_core_jackson_databind",
-        "@commons_logging",
-        "@joda_time",
-        "@org_apache_httpcomponents_httpclient",
-        "@org_apache_httpcomponents_httpcore",
-    ],
     deps = [
         "//java/src/main/java/com/google/crypto/tink",
         "//java/src/main/java/com/google/crypto/tink/subtle",
-        "@com_amazonaws_aws_java_sdk_core",
-        "@com_amazonaws_aws_java_sdk_kms",
-        "@com_google_auto_service",
+        "@maven//:com_amazonaws_aws_java_sdk_core",
+        "@maven//:com_amazonaws_aws_java_sdk_kms",
+        "@maven//:com_google_auto_service_auto_service_annotations",
     ],
 )
 
@@ -45,8 +37,7 @@
     name = "auto_service_plugin",
     processor_class = "com.google.auto.service.processor.AutoServiceProcessor",
     deps = [
-        "@com_google_auto_common",
-        "@com_google_auto_service",
-        "@com_google_guava",
+        "@maven//:com_google_auto_auto_common",
+        "@maven//:com_google_auto_service_auto_service",
     ],
 )
diff --git a/java/src/main/java/com/google/crypto/tink/integration/gcpkms/BUILD.bazel b/java/src/main/java/com/google/crypto/tink/integration/gcpkms/BUILD.bazel
index d3dff46..1f4bf5d 100644
--- a/java/src/main/java/com/google/crypto/tink/integration/gcpkms/BUILD.bazel
+++ b/java/src/main/java/com/google/crypto/tink/integration/gcpkms/BUILD.bazel
@@ -1,4 +1,4 @@
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
@@ -27,12 +27,12 @@
     deps = [
         "//java/src/main/java/com/google/crypto/tink",
         "//java/src/main/java/com/google/crypto/tink/subtle",
-        "@com_google_api_client",
-        "@com_google_apis_google_api_services_cloudkms",
-        "@com_google_auto_service",
-        "@com_google_http_client",
-        "@com_google_http_client_jackson2",
-        "@com_google_oauth_client",
+        "@maven//:com_google_api_client_google_api_client",
+        "@maven//:com_google_apis_google_api_services_cloudkms",
+        "@maven//:com_google_auto_service_auto_service_annotations",
+        "@maven//:com_google_http_client_google_http_client",
+        "@maven//:com_google_http_client_google_http_client_jackson2",
+        "@maven//:com_google_oauth_client_google_oauth_client",
     ],
 )
 
@@ -40,8 +40,7 @@
     name = "auto_service_plugin",
     processor_class = "com.google.auto.service.processor.AutoServiceProcessor",
     deps = [
-        "@com_google_auto_common",
-        "@com_google_auto_service",
-        "@com_google_guava",
+        "@maven//:com_google_auto_auto_common",
+        "@maven//:com_google_auto_service_auto_service",
     ],
 )
diff --git a/java/src/main/java/com/google/crypto/tink/integration/gcpkms/GcpKmsClient.java b/java/src/main/java/com/google/crypto/tink/integration/gcpkms/GcpKmsClient.java
index fcf7f81..a447786 100644
--- a/java/src/main/java/com/google/crypto/tink/integration/gcpkms/GcpKmsClient.java
+++ b/java/src/main/java/com/google/crypto/tink/integration/gcpkms/GcpKmsClient.java
@@ -108,7 +108,7 @@
   }
 
   /** Loads the provided credential. */
-  private KmsClient withCredentials(GoogleCredential credential) {
+  public KmsClient withCredentials(GoogleCredential credential) {
     if (credential.createScopedRequired()) {
       credential = credential.createScoped(CloudKMSScopes.all());
     }
diff --git a/java/src/main/java/com/google/crypto/tink/mac/AesCmacKeyManager.java b/java/src/main/java/com/google/crypto/tink/mac/AesCmacKeyManager.java
new file mode 100644
index 0000000..5823b32
--- /dev/null
+++ b/java/src/main/java/com/google/crypto/tink/mac/AesCmacKeyManager.java
@@ -0,0 +1,126 @@
+// Copyright 2017 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.google.crypto.tink.mac;
+
+import com.google.crypto.tink.KeyTypeManager;
+import com.google.crypto.tink.Mac;
+import com.google.crypto.tink.Registry;
+import com.google.crypto.tink.proto.AesCmacKey;
+import com.google.crypto.tink.proto.AesCmacKeyFormat;
+import com.google.crypto.tink.proto.AesCmacParams;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
+import com.google.crypto.tink.subtle.AesCmac;
+import com.google.crypto.tink.subtle.Random;
+import com.google.crypto.tink.subtle.Validators;
+import com.google.protobuf.ByteString;
+import com.google.protobuf.InvalidProtocolBufferException;
+import java.security.GeneralSecurityException;
+
+/**
+ * This key manager generates new {@code AesCmacKey} keys and produces new instances of {@code
+ * AesCmac}.
+ */
+public class AesCmacKeyManager extends KeyTypeManager<AesCmacKey> {
+
+  AesCmacKeyManager() {
+    super(
+        AesCmacKey.class,
+        new PrimitiveFactory<Mac, AesCmacKey>(Mac.class) {
+          @Override
+          public Mac getPrimitive(AesCmacKey key) throws GeneralSecurityException {
+            return new AesCmac(key.getKeyValue().toByteArray(), key.getParams().getTagSize());
+          }
+        });
+  }
+
+  private static final int VERSION = 0;
+  private static final int KEY_SIZE_IN_BYTES = 32;
+  private static final int MIN_TAG_SIZE_IN_BYTES = 10;
+  private static final int MAX_TAG_SIZE_IN_BYTES = 16;
+
+  @Override
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.AesCmacKey";
+  }
+
+  @Override
+  public int getVersion() {
+    return VERSION;
+  }
+
+  @Override
+  public KeyMaterialType keyMaterialType() {
+    return KeyMaterialType.SYMMETRIC;
+  }
+
+  @Override
+  public void validateKey(AesCmacKey key) throws GeneralSecurityException {
+    Validators.validateVersion(key.getVersion(), getVersion());
+    validateSize(key.getKeyValue().size());
+    validateParams(key.getParams());
+  }
+
+  @Override
+  public AesCmacKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
+    return AesCmacKey.parseFrom(byteString);
+  }
+
+  private static void validateParams(AesCmacParams params) throws GeneralSecurityException {
+    if (params.getTagSize() < MIN_TAG_SIZE_IN_BYTES) {
+      throw new GeneralSecurityException("tag size too short");
+    }
+    if (params.getTagSize() > MAX_TAG_SIZE_IN_BYTES) {
+      throw new GeneralSecurityException("tag size too long");
+    }
+  }
+
+  private static void validateSize(int size) throws GeneralSecurityException {
+    if (size != KEY_SIZE_IN_BYTES) {
+      throw new GeneralSecurityException("AesCmacKey size wrong, must be 16 bytes");
+    }
+  }
+
+  @Override
+  public KeyFactory<AesCmacKeyFormat, AesCmacKey> keyFactory() {
+    return new KeyFactory<AesCmacKeyFormat, AesCmacKey>(AesCmacKeyFormat.class) {
+      @Override
+      public void validateKeyFormat(AesCmacKeyFormat format) throws GeneralSecurityException {
+        validateParams(format.getParams());
+        validateSize(format.getKeySize());
+      }
+
+      @Override
+      public AesCmacKeyFormat parseKeyFormat(ByteString byteString)
+          throws InvalidProtocolBufferException {
+        return AesCmacKeyFormat.parseFrom(byteString);
+      }
+
+      @Override
+      public AesCmacKey createKey(AesCmacKeyFormat format) throws GeneralSecurityException {
+        return AesCmacKey.newBuilder()
+            .setVersion(VERSION)
+            .setKeyValue(ByteString.copyFrom(Random.randBytes(format.getKeySize())))
+            .setParams(format.getParams())
+            .build();
+      }
+    };
+  }
+
+  public static void register(boolean newKeyAllowed) throws GeneralSecurityException {
+    Registry.registerKeyManager(new AesCmacKeyManager(), newKeyAllowed);
+  }
+}
diff --git a/java/src/main/java/com/google/crypto/tink/mac/BUILD.bazel b/java/src/main/java/com/google/crypto/tink/mac/BUILD.bazel
index 1294b57..9477780 100644
--- a/java/src/main/java/com/google/crypto/tink/mac/BUILD.bazel
+++ b/java/src/main/java/com/google/crypto/tink/mac/BUILD.bazel
@@ -1,4 +1,4 @@
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
@@ -14,6 +14,7 @@
 )
 
 full_protos = [
+    "//proto:aes_cmac_java_proto",
     "//proto:common_java_proto",
     "//proto:config_java_proto",
     "//proto:hmac_java_proto",
@@ -21,6 +22,7 @@
 ]
 
 lite_protos = [
+    "//proto:aes_cmac_java_proto_lite",
     "//proto:common_java_proto_lite",
     "//proto:config_java_proto_lite",
     "//proto:hmac_java_proto_lite",
@@ -31,6 +33,7 @@
     name = "mac",
     srcs = [":srcs"],
     javacopts = JAVACOPTS_OSS,
+    visibility = ["//visibility:public"],
     deps = full_protos + [
         "//java/src/main/java/com/google/crypto/tink",
         "//java/src/main/java/com/google/crypto/tink/subtle",
@@ -43,6 +46,7 @@
     name = "android",
     srcs = [":srcs"],
     javacopts = JAVACOPTS_OSS,
+    visibility = ["//visibility:public"],
     deps = lite_protos + [
         "//java/src/main/java/com/google/crypto/tink:android",
         "//java/src/main/java/com/google/crypto/tink/subtle",
diff --git a/java/src/main/java/com/google/crypto/tink/mac/HmacKeyManager.java b/java/src/main/java/com/google/crypto/tink/mac/HmacKeyManager.java
index 1262971..cd9429c 100644
--- a/java/src/main/java/com/google/crypto/tink/mac/HmacKeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/mac/HmacKeyManager.java
@@ -16,8 +16,9 @@
 
 package com.google.crypto.tink.mac;
 
-import com.google.crypto.tink.KeyManagerBase;
+import com.google.crypto.tink.KeyTypeManager;
 import com.google.crypto.tink.Mac;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.proto.HashType;
 import com.google.crypto.tink.proto.HmacKey;
 import com.google.crypto.tink.proto.HmacKeyFormat;
@@ -34,51 +35,42 @@
 /**
  * This key manager generates new {@code HmacKey} keys and produces new instances of {@code MacJce}.
  */
-class HmacKeyManager extends KeyManagerBase<Mac, HmacKey, HmacKeyFormat> {
+public class HmacKeyManager extends KeyTypeManager<HmacKey> {
   public HmacKeyManager() {
-    super(Mac.class, HmacKey.class, HmacKeyFormat.class, TYPE_URL);
+    super(
+        HmacKey.class,
+        new PrimitiveFactory<Mac, HmacKey>(Mac.class) {
+          @Override
+          public Mac getPrimitive(HmacKey key) throws GeneralSecurityException {
+            HashType hash = key.getParams().getHash();
+            byte[] keyValue = key.getKeyValue().toByteArray();
+            SecretKeySpec keySpec = new SecretKeySpec(keyValue, "HMAC");
+            int tagSize = key.getParams().getTagSize();
+            switch (hash) {
+              case SHA1:
+                return new MacJce("HMACSHA1", keySpec, tagSize);
+              case SHA256:
+                return new MacJce("HMACSHA256", keySpec, tagSize);
+              case SHA512:
+                return new MacJce("HMACSHA512", keySpec, tagSize);
+              default:
+                throw new GeneralSecurityException("unknown hash");
+            }
+          }
+        });
   }
-  /** Type url that this manager does support. */
-  public static final String TYPE_URL = "type.googleapis.com/google.crypto.tink.HmacKey";
-  /** Current version of this key manager. Keys with version equal or smaller are supported. */
-  private static final int VERSION = 0;
 
+  private static final int VERSION = 0;
+  
   /** Minimum key size in bytes. */
   private static final int MIN_KEY_SIZE_IN_BYTES = 16;
 
   /** Minimum tag size in bytes. This provides minimum 80-bit security strength. */
   private static final int MIN_TAG_SIZE_IN_BYTES = 10;
 
-  /** @param serializedKey serialized {@code HmacKey} proto */
   @Override
-  public Mac getPrimitiveFromKey(HmacKey keyProto) throws GeneralSecurityException {
-    HashType hash = keyProto.getParams().getHash();
-    byte[] keyValue = keyProto.getKeyValue().toByteArray();
-    SecretKeySpec keySpec = new SecretKeySpec(keyValue, "HMAC");
-    int tagSize = keyProto.getParams().getTagSize();
-    switch (hash) {
-      case SHA1:
-        return new MacJce("HMACSHA1", keySpec, tagSize);
-      case SHA256:
-        return new MacJce("HMACSHA256", keySpec, tagSize);
-      case SHA512:
-        return new MacJce("HMACSHA512", keySpec, tagSize);
-      default:
-        throw new GeneralSecurityException("unknown hash");
-    }
-  }
-
-  /**
-   * @param serializedKeyFormat serialized {@code HmacKeyFormat} proto
-   * @return new {@code HmacKey} proto
-   */
-  @Override
-  public HmacKey newKeyFromFormat(HmacKeyFormat format) throws GeneralSecurityException {
-    return HmacKey.newBuilder()
-        .setVersion(VERSION)
-        .setParams(format.getParams())
-        .setKeyValue(ByteString.copyFrom(Random.randBytes(format.getKeySize())))
-        .build();
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.HmacKey";
   }
 
   @Override
@@ -87,40 +79,25 @@
   }
 
   @Override
-  protected KeyMaterialType keyMaterialType() {
+  public KeyMaterialType keyMaterialType() {
     return KeyMaterialType.SYMMETRIC;
   }
 
   @Override
-  protected HmacKey parseKeyProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return HmacKey.parseFrom(byteString);
-  }
-
-  @Override
-  protected HmacKeyFormat parseKeyFormatProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return HmacKeyFormat.parseFrom(byteString);
-  }
-
-  @Override
-  protected void validateKey(HmacKey key) throws GeneralSecurityException {
+  public void validateKey(HmacKey key) throws GeneralSecurityException {
     Validators.validateVersion(key.getVersion(), VERSION);
     if (key.getKeyValue().size() < MIN_KEY_SIZE_IN_BYTES) {
       throw new GeneralSecurityException("key too short");
     }
-    validate(key.getParams());
+    validateParams(key.getParams());
   }
 
   @Override
-  protected void validateKeyFormat(HmacKeyFormat format) throws GeneralSecurityException {
-    if (format.getKeySize() < MIN_KEY_SIZE_IN_BYTES) {
-      throw new GeneralSecurityException("key too short");
-    }
-    validate(format.getParams());
+  public HmacKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
+    return HmacKey.parseFrom(byteString);
   }
 
-  private void validate(HmacParams params) throws GeneralSecurityException {
+  private static void validateParams(HmacParams params) throws GeneralSecurityException {
     if (params.getTagSize() < MIN_TAG_SIZE_IN_BYTES) {
       throw new GeneralSecurityException("tag size too small");
     }
@@ -144,4 +121,36 @@
         throw new GeneralSecurityException("unknown hash type");
     }
   }
+
+  @Override
+  public KeyFactory<HmacKeyFormat, HmacKey> keyFactory() {
+    return new KeyFactory<HmacKeyFormat, HmacKey>(HmacKeyFormat.class) {
+      @Override
+      public void validateKeyFormat(HmacKeyFormat format) throws GeneralSecurityException {
+        if (format.getKeySize() < MIN_KEY_SIZE_IN_BYTES) {
+          throw new GeneralSecurityException("key too short");
+        }
+        validateParams(format.getParams());
+      }
+
+      @Override
+      public HmacKeyFormat parseKeyFormat(ByteString byteString)
+          throws InvalidProtocolBufferException {
+        return HmacKeyFormat.parseFrom(byteString);
+      }
+
+      @Override
+      public HmacKey createKey(HmacKeyFormat format) throws GeneralSecurityException {
+        return HmacKey.newBuilder()
+            .setVersion(VERSION)
+            .setParams(format.getParams())
+            .setKeyValue(ByteString.copyFrom(Random.randBytes(format.getKeySize())))
+            .build();
+      }
+    };
+  }
+
+  public static void register(boolean newKeyAllowed) throws GeneralSecurityException {
+    Registry.registerKeyManager(new HmacKeyManager(), newKeyAllowed);
+  }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/mac/MacCatalogue.java b/java/src/main/java/com/google/crypto/tink/mac/MacCatalogue.java
deleted file mode 100644
index 8b2bd0c..0000000
--- a/java/src/main/java/com/google/crypto/tink/mac/MacCatalogue.java
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package com.google.crypto.tink.mac;
-
-import com.google.crypto.tink.Catalogue;
-import com.google.crypto.tink.KeyManager;
-import com.google.crypto.tink.Mac;
-import com.google.crypto.tink.PrimitiveWrapper;
-import java.security.GeneralSecurityException;
-
-/** A catalogue of {@link Mac} key managers. */
-class MacCatalogue implements Catalogue<Mac> {
-  public MacCatalogue() {}
-
-  /**
-   * @return a KeyManager for the given {@code typeUrl}, {@code primitiveName} and version at least
-   *     {@code minVersion} (if it exists in the catalogue).
-   */
-  @Override
-  public KeyManager<Mac> getKeyManager(String typeUrl, String primitiveName, int minVersion)
-      throws GeneralSecurityException {
-    KeyManager<Mac> keyManager;
-    switch (primitiveName.toLowerCase()) {
-      case "mac":
-        keyManager = macKeyManager(typeUrl);
-        break;
-      default:
-        throw new GeneralSecurityException(
-            String.format("No support for primitive '%s'.", primitiveName));
-    }
-    if (keyManager.getVersion() < minVersion) {
-      throw new GeneralSecurityException(
-          String.format(
-              "No key manager for key type '%s' with version at least %d.", typeUrl, minVersion));
-    }
-    return keyManager;
-  }
-
-  private KeyManager<Mac> macKeyManager(String typeUrl) throws GeneralSecurityException {
-    switch (typeUrl) {
-      case HmacKeyManager.TYPE_URL:
-        return new HmacKeyManager();
-      default:
-        throw new GeneralSecurityException(
-            String.format("No support for primitive 'Mac' with key type '%s'.", typeUrl));
-    }
-  }
-
-  @Override
-  public PrimitiveWrapper<Mac> getPrimitiveWrapper() {
-    return new MacWrapper();
-  }
-}
diff --git a/java/src/main/java/com/google/crypto/tink/mac/MacConfig.java b/java/src/main/java/com/google/crypto/tink/mac/MacConfig.java
index 304f87e..802a70a 100644
--- a/java/src/main/java/com/google/crypto/tink/mac/MacConfig.java
+++ b/java/src/main/java/com/google/crypto/tink/mac/MacConfig.java
@@ -16,7 +16,6 @@
 
 package com.google.crypto.tink.mac;
 
-import com.google.crypto.tink.Config;
 import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.proto.RegistryConfig;
 import java.security.GeneralSecurityException;
@@ -36,30 +35,25 @@
  * @since 1.0.0
  */
 public final class MacConfig {
-  public static final String HMAC_TYPE_URL = HmacKeyManager.TYPE_URL;
-
-  private static final String CATALOGUE_NAME = "TinkMac";
-  private static final String PRIMITIVE_NAME = "Mac";
+  public static final String HMAC_TYPE_URL = new HmacKeyManager().getKeyType();
 
   /** @deprecated */
   @Deprecated
-  public static final RegistryConfig TINK_1_0_0 =
-      RegistryConfig.newBuilder()
-          .setConfigName("TINK_MAC_1_0_0")
-          .addEntry(Config.getTinkKeyTypeEntry(CATALOGUE_NAME, PRIMITIVE_NAME, "HmacKey", 0, true))
-          .build();
+  public static final RegistryConfig TINK_1_0_0 = RegistryConfig.getDefaultInstance();
 
   /**
    * @deprecated
    * @since 1.1.0
    */
   @Deprecated
-  public static final RegistryConfig TINK_1_1_0 =
-      RegistryConfig.newBuilder().mergeFrom(TINK_1_0_0).setConfigName("TINK_MAC_1_1_0").build();
+  public static final RegistryConfig TINK_1_1_0 = TINK_1_0_0;
 
-  /** @since 1.2.0 */
-  public static final RegistryConfig LATEST =
-      RegistryConfig.newBuilder().mergeFrom(TINK_1_0_0).setConfigName("TINK_MAC").build();
+  /**
+   * @deprecated
+   * @since 1.2.0
+   */
+  @Deprecated
+  public static final RegistryConfig LATEST = TINK_1_0_0;
 
   static {
     try {
@@ -89,8 +83,9 @@
    * @since 1.2.0
    */
   public static void register() throws GeneralSecurityException {
-    Registry.addCatalogue(CATALOGUE_NAME, new MacCatalogue());
-    Config.register(LATEST);
+    HmacKeyManager.register(true);
+    AesCmacKeyManager.register(true);
+    MacWrapper.register();
   }
 
   /**
diff --git a/java/src/main/java/com/google/crypto/tink/mac/MacKeyTemplates.java b/java/src/main/java/com/google/crypto/tink/mac/MacKeyTemplates.java
index 3fd8f88..7bfecea 100644
--- a/java/src/main/java/com/google/crypto/tink/mac/MacKeyTemplates.java
+++ b/java/src/main/java/com/google/crypto/tink/mac/MacKeyTemplates.java
@@ -16,6 +16,8 @@
 
 package com.google.crypto.tink.mac;
 
+import com.google.crypto.tink.proto.AesCmacKeyFormat;
+import com.google.crypto.tink.proto.AesCmacParams;
 import com.google.crypto.tink.proto.HashType;
 import com.google.crypto.tink.proto.HmacKeyFormat;
 import com.google.crypto.tink.proto.HmacParams;
@@ -32,7 +34,7 @@
  * <pre>{@code
  * Config.register(Mac.TINK_1_0_0);
  * KeysetHandle handle = KeysetHandle.generateNew(MacKeyTemplates.HMAC_SHA256_128BITTAG);
- * Mac mac = MacFactory.getPrimitive(handle);
+ * Mac mac = handle.getPrimitive(Mac.class);
  * }</pre>
  *
  * @since 1.0.0
@@ -46,6 +48,7 @@
    *   <li>Key size: 32 bytes
    *   <li>Tag size: 16 bytes
    *   <li>Hash function: SHA256
+   *   <li>OutputPrefixType: TINK
    * </ul>
    */
   public static final KeyTemplate HMAC_SHA256_128BITTAG =
@@ -59,12 +62,62 @@
    *   <li>Key size: 32 bytes
    *   <li>Tag size: 32 bytes
    *   <li>Hash function: SHA256
+   *   <li>OutputPrefixType: TINK
    * </ul>
    */
   public static final KeyTemplate HMAC_SHA256_256BITTAG =
       createHmacKeyTemplate(32, 32, HashType.SHA256);
 
   /**
+   * A {@link KeyTemplate} that generates new instances of {@link
+   * com.google.crypto.tink.proto.HmacKey} with the following parameters:
+   *
+   * <ul>
+   *   <li>Key size: 64 bytes
+   *   <li>Tag size: 32 bytes
+   *   <li>Hash function: SHA512
+   *   <li>OutputPrefixType: TINK
+   * </ul>
+   */
+  public static final KeyTemplate HMAC_SHA512_256BITTAG =
+      createHmacKeyTemplate(64, 32, HashType.SHA512);
+
+  /**
+   * A {@link KeyTemplate} that generates new instances of {@link
+   * com.google.crypto.tink.proto.HmacKey} with the following parameters:
+   *
+   * <ul>
+   *   <li>Key size: 64 bytes
+   *   <li>Tag size: 64 bytes
+   *   <li>Hash function: SHA512
+   *   <li>OutputPrefixType: TINK
+   * </ul>
+   */
+  public static final KeyTemplate HMAC_SHA512_512BITTAG =
+      createHmacKeyTemplate(64, 64, HashType.SHA512);
+
+  /**
+   * A {@link KeyTemplate} that generates new instances of {@link
+   * com.google.crypto.tink.proto.CmacKey} with the following parameters:
+   *
+   * <ul>
+   *   <li>Key size: 32 bytes
+   *   <li>Tag size: 16 bytes
+   *   <li>OutputPrefixType: TINK
+   * </ul>
+   */
+  public static final KeyTemplate AES_CMAC =
+      KeyTemplate.newBuilder()
+          .setValue(
+              AesCmacKeyFormat.newBuilder()
+                  .setKeySize(32)
+                  .setParams(AesCmacParams.newBuilder().setTagSize(16).build())
+                  .build().toByteString())
+          .setTypeUrl(new AesCmacKeyManager().getKeyType())
+          .setOutputPrefixType(OutputPrefixType.TINK)
+          .build();
+
+  /**
    * @return a {@link KeyTemplate} containing a {@link HmacKeyFormat} with some specified
    *     parameters.
    */
@@ -79,7 +132,7 @@
         .build();
     return KeyTemplate.newBuilder()
         .setValue(format.toByteString())
-        .setTypeUrl(HmacKeyManager.TYPE_URL)
+        .setTypeUrl(new HmacKeyManager().getKeyType())
         .setOutputPrefixType(OutputPrefixType.TINK)
         .build();
   }
diff --git a/java/src/main/java/com/google/crypto/tink/mac/MacWrapper.java b/java/src/main/java/com/google/crypto/tink/mac/MacWrapper.java
index 9a75e40..1d0f68b 100644
--- a/java/src/main/java/com/google/crypto/tink/mac/MacWrapper.java
+++ b/java/src/main/java/com/google/crypto/tink/mac/MacWrapper.java
@@ -20,6 +20,7 @@
 import com.google.crypto.tink.Mac;
 import com.google.crypto.tink.PrimitiveSet;
 import com.google.crypto.tink.PrimitiveWrapper;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.proto.OutputPrefixType;
 import com.google.crypto.tink.subtle.Bytes;
 import java.security.GeneralSecurityException;
@@ -36,7 +37,7 @@
  * the right key in the set. If the keys associated with the prefix do not validate the tag, the
  * primitive tries all keys with {@link com.google.crypto.tink.proto.OutputPrefixType#RAW}.
  */
-public final class MacWrapper implements PrimitiveWrapper<Mac> {
+class MacWrapper implements PrimitiveWrapper<Mac> {
   private static final Logger logger = Logger.getLogger(MacWrapper.class.getName());
 
   private static class WrappedMac implements Mac {
@@ -100,6 +101,8 @@
     }
   }
 
+  MacWrapper() {}
+
   @Override
   public Mac wrap(final PrimitiveSet<Mac> primitives) throws GeneralSecurityException {
     return new WrappedMac(primitives);
@@ -109,4 +112,8 @@
   public Class<Mac> getPrimitiveClass() {
     return Mac.class;
   }
+
+ public static void register() throws GeneralSecurityException {
+    Registry.registerPrimitiveWrapper(new MacWrapper());
+  }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/signature/BUILD.bazel b/java/src/main/java/com/google/crypto/tink/signature/BUILD.bazel
index ba973a8..169ec07 100644
--- a/java/src/main/java/com/google/crypto/tink/signature/BUILD.bazel
+++ b/java/src/main/java/com/google/crypto/tink/signature/BUILD.bazel
@@ -1,4 +1,4 @@
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
@@ -39,6 +39,7 @@
     name = "signature",
     srcs = [":srcs"],
     javacopts = JAVACOPTS_OSS,
+    visibility = ["//visibility:public"],
     deps = full_protos + [
         "//java/src/main/java/com/google/crypto/tink",
         "//java/src/main/java/com/google/crypto/tink/annotations",
@@ -52,6 +53,7 @@
     name = "android",
     srcs = [":srcs"],
     javacopts = JAVACOPTS_OSS,
+    visibility = ["//visibility:public"],
     deps = lite_protos + [
         "//java/src/main/java/com/google/crypto/tink:android",
         "//java/src/main/java/com/google/crypto/tink/annotations",
diff --git a/java/src/main/java/com/google/crypto/tink/signature/EcdsaSignKeyManager.java b/java/src/main/java/com/google/crypto/tink/signature/EcdsaSignKeyManager.java
index 411d7f7..751f993 100644
--- a/java/src/main/java/com/google/crypto/tink/signature/EcdsaSignKeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/signature/EcdsaSignKeyManager.java
@@ -16,14 +16,13 @@
 
 package com.google.crypto.tink.signature;
 
-import com.google.crypto.tink.KeyManagerBase;
-import com.google.crypto.tink.PrivateKeyManager;
+import com.google.crypto.tink.PrivateKeyTypeManager;
 import com.google.crypto.tink.PublicKeySign;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.proto.EcdsaKeyFormat;
 import com.google.crypto.tink.proto.EcdsaParams;
 import com.google.crypto.tink.proto.EcdsaPrivateKey;
 import com.google.crypto.tink.proto.EcdsaPublicKey;
-import com.google.crypto.tink.proto.KeyData;
 import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.subtle.EcdsaSignJce;
 import com.google.crypto.tink.subtle.EllipticCurves;
@@ -40,102 +39,106 @@
  * This key manager generates new {@code EcdsaPrivateKey} keys and produces new instances of {@code
  * EcdsaSignJce}.
  */
-class EcdsaSignKeyManager
-    extends KeyManagerBase<PublicKeySign, EcdsaPrivateKey, EcdsaKeyFormat>
-    implements PrivateKeyManager<PublicKeySign> {
-  public EcdsaSignKeyManager() {
-    super(PublicKeySign.class, EcdsaPrivateKey.class, EcdsaKeyFormat.class, TYPE_URL);
-  }
-
-  /** Type url that this manager supports */
-  public static final String TYPE_URL = "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey";
-
-  /** Current version of this key manager. Keys with greater version are not supported. */
-  private static final int VERSION = 0;
-
-  @Override
-  public PublicKeySign getPrimitiveFromKey(EcdsaPrivateKey keyProto)
-      throws GeneralSecurityException {
-    ECPrivateKey privateKey =
-        EllipticCurves.getEcPrivateKey(
-            SigUtil.toCurveType(keyProto.getPublicKey().getParams().getCurve()),
-            keyProto.getKeyValue().toByteArray());
-    return new EcdsaSignJce(
-        privateKey,
-        SigUtil.toHashType(keyProto.getPublicKey().getParams().getHashType()),
-        SigUtil.toEcdsaEncoding(keyProto.getPublicKey().getParams().getEncoding()));
+public class EcdsaSignKeyManager extends PrivateKeyTypeManager<EcdsaPrivateKey, EcdsaPublicKey> {
+  EcdsaSignKeyManager() {
+    super(
+        EcdsaPrivateKey.class,
+        EcdsaPublicKey.class,
+        new PrimitiveFactory<PublicKeySign, EcdsaPrivateKey>(PublicKeySign.class) {
+          @Override
+          public PublicKeySign getPrimitive(EcdsaPrivateKey key) throws GeneralSecurityException {
+            ECPrivateKey privateKey =
+                EllipticCurves.getEcPrivateKey(
+                    SigUtil.toCurveType(key.getPublicKey().getParams().getCurve()),
+                    key.getKeyValue().toByteArray());
+            return new EcdsaSignJce(
+                privateKey,
+                SigUtil.toHashType(key.getPublicKey().getParams().getHashType()),
+                SigUtil.toEcdsaEncoding(key.getPublicKey().getParams().getEncoding()));
+          }
+        });
   }
 
   @Override
-  public EcdsaPrivateKey newKeyFromFormat(EcdsaKeyFormat format)
-      throws GeneralSecurityException {
-    EcdsaParams ecdsaParams = format.getParams();
-    KeyPair keyPair = EllipticCurves.generateKeyPair(SigUtil.toCurveType(ecdsaParams.getCurve()));
-    ECPublicKey pubKey = (ECPublicKey) keyPair.getPublic();
-    ECPrivateKey privKey = (ECPrivateKey) keyPair.getPrivate();
-    ECPoint w = pubKey.getW();
-
-    // Creates EcdsaPublicKey.
-    EcdsaPublicKey ecdsaPubKey =
-        EcdsaPublicKey.newBuilder()
-            .setVersion(VERSION)
-            .setParams(ecdsaParams)
-            .setX(ByteString.copyFrom(w.getAffineX().toByteArray()))
-            .setY(ByteString.copyFrom(w.getAffineY().toByteArray()))
-            .build();
-
-    // Creates EcdsaPrivateKey.
-    return EcdsaPrivateKey.newBuilder()
-        .setVersion(VERSION)
-        .setPublicKey(ecdsaPubKey)
-        .setKeyValue(ByteString.copyFrom(privKey.getS().toByteArray()))
-        .build();
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey";
   }
 
   @Override
-  public KeyData getPublicKeyData(ByteString serializedKey) throws GeneralSecurityException {
-    try {
-      EcdsaPrivateKey privKeyProto = EcdsaPrivateKey.parseFrom(serializedKey);
-      return KeyData.newBuilder()
-          .setTypeUrl(EcdsaVerifyKeyManager.TYPE_URL)
-          .setValue(privKeyProto.getPublicKey().toByteString())
-          .setKeyMaterialType(KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC)
-          .build();
-    } catch (InvalidProtocolBufferException e) {
-      throw new GeneralSecurityException("expected serialized EcdsaPrivateKey proto", e);
-    }
+  public int getVersion() {
+    return 0;
   }
 
   @Override
-  protected KeyMaterialType keyMaterialType() {
+  public EcdsaPublicKey getPublicKey(EcdsaPrivateKey key) throws GeneralSecurityException {
+    return key.getPublicKey();
+  }
+
+  @Override
+  public KeyMaterialType keyMaterialType() {
     return KeyMaterialType.ASYMMETRIC_PRIVATE;
   }
 
   @Override
-  protected EcdsaPrivateKey parseKeyProto(ByteString byteString)
+  public EcdsaPrivateKey parseKey(ByteString byteString)
       throws InvalidProtocolBufferException {
     return EcdsaPrivateKey.parseFrom(byteString);
   }
 
   @Override
-  protected EcdsaKeyFormat parseKeyFormatProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return EcdsaKeyFormat.parseFrom(byteString);
-  }
-
-  @Override
-  public int getVersion() {
-    return VERSION;
-  }
-
-  @Override
-  protected void validateKey(EcdsaPrivateKey privKey) throws GeneralSecurityException {
-    Validators.validateVersion(privKey.getVersion(), VERSION);
+  public void validateKey(EcdsaPrivateKey privKey) throws GeneralSecurityException {
+    Validators.validateVersion(privKey.getVersion(), getVersion());
     SigUtil.validateEcdsaParams(privKey.getPublicKey().getParams());
   }
 
   @Override
-  protected void validateKeyFormat(EcdsaKeyFormat format) throws GeneralSecurityException {
-    SigUtil.validateEcdsaParams(format.getParams());
+  public KeyFactory<EcdsaKeyFormat, EcdsaPrivateKey> keyFactory() {
+    return new KeyFactory<EcdsaKeyFormat, EcdsaPrivateKey>(EcdsaKeyFormat.class) {
+      @Override
+      public void validateKeyFormat(EcdsaKeyFormat format) throws GeneralSecurityException {
+        SigUtil.validateEcdsaParams(format.getParams());
+      }
+
+      @Override
+      public EcdsaKeyFormat parseKeyFormat(ByteString byteString)
+          throws InvalidProtocolBufferException {
+        return EcdsaKeyFormat.parseFrom(byteString);
+      }
+
+      @Override
+      public EcdsaPrivateKey createKey(EcdsaKeyFormat format) throws GeneralSecurityException {
+        EcdsaParams ecdsaParams = format.getParams();
+        KeyPair keyPair =
+            EllipticCurves.generateKeyPair(SigUtil.toCurveType(ecdsaParams.getCurve()));
+        ECPublicKey pubKey = (ECPublicKey) keyPair.getPublic();
+        ECPrivateKey privKey = (ECPrivateKey) keyPair.getPrivate();
+        ECPoint w = pubKey.getW();
+
+        // Creates EcdsaPublicKey.
+        EcdsaPublicKey ecdsaPubKey =
+            EcdsaPublicKey.newBuilder()
+                .setVersion(getVersion())
+                .setParams(ecdsaParams)
+                .setX(ByteString.copyFrom(w.getAffineX().toByteArray()))
+                .setY(ByteString.copyFrom(w.getAffineY().toByteArray()))
+                .build();
+
+        // Creates EcdsaPrivateKey.
+        return EcdsaPrivateKey.newBuilder()
+            .setVersion(getVersion())
+            .setPublicKey(ecdsaPubKey)
+            .setKeyValue(ByteString.copyFrom(privKey.getS().toByteArray()))
+            .build();
+      }
+    };
+  }
+
+  /**
+   * Registers the {@link EcdsaSignKeyManager} and the {@link EcdsaVerifyKeyManager} with the
+   * registry, so that the the Ecdsa-Keys can be used with Tink.
+   */
+  public static void registerPair(boolean newKeyAllowed) throws GeneralSecurityException {
+    Registry.registerAsymmetricKeyManagers(
+        new EcdsaSignKeyManager(), new EcdsaVerifyKeyManager(), newKeyAllowed);
   }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/signature/EcdsaVerifyKeyManager.java b/java/src/main/java/com/google/crypto/tink/signature/EcdsaVerifyKeyManager.java
index 275d01c..55de6f7 100644
--- a/java/src/main/java/com/google/crypto/tink/signature/EcdsaVerifyKeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/signature/EcdsaVerifyKeyManager.java
@@ -16,10 +16,9 @@
 
 package com.google.crypto.tink.signature;
 
-import com.google.crypto.tink.KeyManagerBase;
+import com.google.crypto.tink.KeyTypeManager;
 import com.google.crypto.tink.PublicKeyVerify;
 import com.google.crypto.tink.proto.EcdsaPublicKey;
-import com.google.crypto.tink.proto.Empty;
 import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.subtle.EcdsaVerifyJce;
 import com.google.crypto.tink.subtle.EllipticCurves;
@@ -33,62 +32,50 @@
  * This key manager produces new instances of {@code EcdsaVerifyJce}. It doesn't support key
  * generation.
  */
-class EcdsaVerifyKeyManager extends KeyManagerBase<PublicKeyVerify, EcdsaPublicKey, Empty> {
+class EcdsaVerifyKeyManager extends KeyTypeManager<EcdsaPublicKey> {
   public EcdsaVerifyKeyManager() {
-    super(PublicKeyVerify.class, EcdsaPublicKey.class, Empty.class, TYPE_URL);
-  }
-
-  public static final String TYPE_URL = "type.googleapis.com/google.crypto.tink.EcdsaPublicKey";
-  /** Current version of this key manager. Keys with greater version are not supported. */
-  private static final int VERSION = 0;
-
-  @Override
-  public PublicKeyVerify getPrimitiveFromKey(EcdsaPublicKey keyProto)
-      throws GeneralSecurityException {
-    ECPublicKey publicKey =
-        EllipticCurves.getEcPublicKey(
-            SigUtil.toCurveType(keyProto.getParams().getCurve()),
-            keyProto.getX().toByteArray(),
-            keyProto.getY().toByteArray());
-    return new EcdsaVerifyJce(
-        publicKey,
-        SigUtil.toHashType(keyProto.getParams().getHashType()),
-        SigUtil.toEcdsaEncoding(keyProto.getParams().getEncoding()));
+    super(
+        EcdsaPublicKey.class,
+        new PrimitiveFactory<PublicKeyVerify, EcdsaPublicKey>(PublicKeyVerify.class) {
+          @Override
+          public PublicKeyVerify getPrimitive(EcdsaPublicKey keyProto)
+              throws GeneralSecurityException {
+            ECPublicKey publicKey =
+                EllipticCurves.getEcPublicKey(
+                    SigUtil.toCurveType(keyProto.getParams().getCurve()),
+                    keyProto.getX().toByteArray(),
+                    keyProto.getY().toByteArray());
+            return new EcdsaVerifyJce(
+                publicKey,
+                SigUtil.toHashType(keyProto.getParams().getHashType()),
+                SigUtil.toEcdsaEncoding(keyProto.getParams().getEncoding()));
+          }
+        });
   }
 
   @Override
-  public EcdsaPublicKey newKeyFromFormat(Empty unused) throws GeneralSecurityException {
-    throw new GeneralSecurityException("Not implemented");
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.EcdsaPublicKey";
   }
 
   @Override
   public int getVersion() {
-    return VERSION;
+    return 0;
   }
 
   @Override
-  protected KeyMaterialType keyMaterialType() {
+  public KeyMaterialType keyMaterialType() {
     return KeyMaterialType.ASYMMETRIC_PUBLIC;
   }
 
   @Override
-  protected EcdsaPublicKey parseKeyProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
+  public EcdsaPublicKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
     return EcdsaPublicKey.parseFrom(byteString);
   }
 
   @Override
-  protected Empty parseKeyFormatProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return Empty.parseFrom(byteString);
-  }
-
-  @Override
-  protected void validateKey(EcdsaPublicKey pubKey) throws GeneralSecurityException {
-    Validators.validateVersion(pubKey.getVersion(), VERSION);
+  public void validateKey(EcdsaPublicKey pubKey) throws GeneralSecurityException {
+    Validators.validateVersion(pubKey.getVersion(), getVersion());
     SigUtil.validateEcdsaParams(pubKey.getParams());
   }
-
-  @Override
-  protected void validateKeyFormat(Empty unused) throws GeneralSecurityException {}
 }
diff --git a/java/src/main/java/com/google/crypto/tink/signature/Ed25519PrivateKeyManager.java b/java/src/main/java/com/google/crypto/tink/signature/Ed25519PrivateKeyManager.java
index 0c565ce..6acf802 100644
--- a/java/src/main/java/com/google/crypto/tink/signature/Ed25519PrivateKeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/signature/Ed25519PrivateKeyManager.java
@@ -16,13 +16,12 @@
 
 package com.google.crypto.tink.signature;
 
-import com.google.crypto.tink.KeyManagerBase;
-import com.google.crypto.tink.PrivateKeyManager;
+import com.google.crypto.tink.PrivateKeyTypeManager;
 import com.google.crypto.tink.PublicKeySign;
+import com.google.crypto.tink.Registry;
+import com.google.crypto.tink.proto.Ed25519KeyFormat;
 import com.google.crypto.tink.proto.Ed25519PrivateKey;
 import com.google.crypto.tink.proto.Ed25519PublicKey;
-import com.google.crypto.tink.proto.Empty;
-import com.google.crypto.tink.proto.KeyData;
 import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.subtle.Ed25519Sign;
 import com.google.crypto.tink.subtle.Validators;
@@ -34,82 +33,89 @@
  * This instance of {@code KeyManager} generates new {@code Ed25519PrivateKey} keys and produces new
  * instances of {@code Ed25519Sign}.
  */
-class Ed25519PrivateKeyManager
-    extends KeyManagerBase<PublicKeySign, Ed25519PrivateKey, Empty>
-    implements PrivateKeyManager<PublicKeySign> {
+class Ed25519PrivateKeyManager extends PrivateKeyTypeManager<Ed25519PrivateKey, Ed25519PublicKey> {
   public Ed25519PrivateKeyManager() {
-    super(PublicKeySign.class, Ed25519PrivateKey.class, Empty.class, TYPE_URL);
-  }
-
-  public static final String TYPE_URL = "type.googleapis.com/google.crypto.tink.Ed25519PrivateKey";
-
-  private static final int VERSION = 0;
-
-  @Override
-  public PublicKeySign getPrimitiveFromKey(Ed25519PrivateKey keyProto)
-      throws GeneralSecurityException {
-    return new Ed25519Sign(keyProto.getKeyValue().toByteArray());
+    super(
+        Ed25519PrivateKey.class,
+        Ed25519PublicKey.class,
+        new PrimitiveFactory<PublicKeySign, Ed25519PrivateKey>(PublicKeySign.class) {
+          @Override
+          public PublicKeySign getPrimitive(Ed25519PrivateKey keyProto)
+              throws GeneralSecurityException {
+            return new Ed25519Sign(keyProto.getKeyValue().toByteArray());
+          }
+        });
   }
 
   @Override
-  public Ed25519PrivateKey newKeyFromFormat(Empty unused) throws GeneralSecurityException {
-    Ed25519Sign.KeyPair keyPair = Ed25519Sign.KeyPair.newKeyPair();
-    Ed25519PublicKey publicKey =
-        Ed25519PublicKey.newBuilder()
-            .setVersion(VERSION)
-            .setKeyValue(ByteString.copyFrom(keyPair.getPublicKey()))
-            .build();
-    return Ed25519PrivateKey.newBuilder()
-        .setVersion(VERSION)
-        .setKeyValue(ByteString.copyFrom(keyPair.getPrivateKey()))
-        .setPublicKey(publicKey)
-        .build();
-  }
-
-  @Override
-  public KeyData getPublicKeyData(ByteString serializedKey) throws GeneralSecurityException {
-    try {
-      Ed25519PrivateKey privKeyProto = Ed25519PrivateKey.parseFrom(serializedKey);
-      return KeyData.newBuilder()
-          .setTypeUrl(Ed25519PublicKeyManager.TYPE_URL)
-          .setValue(privKeyProto.getPublicKey().toByteString())
-          .setKeyMaterialType(KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC)
-          .build();
-    } catch (InvalidProtocolBufferException e) {
-      throw new GeneralSecurityException("expected serialized Ed25519PrivateKey proto", e);
-    }
-  }
-
-  @Override
-  protected KeyMaterialType keyMaterialType() {
-    return KeyMaterialType.ASYMMETRIC_PRIVATE;
-  }
-
-  @Override
-  protected Ed25519PrivateKey parseKeyProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return Ed25519PrivateKey.parseFrom(byteString);
-  }
-
-  @Override
-  protected Empty parseKeyFormatProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return Empty.parseFrom(byteString);
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.Ed25519PrivateKey";
   }
 
   @Override
   public int getVersion() {
-    return VERSION;
+    return 0;
   }
 
   @Override
-  protected void validateKey(Ed25519PrivateKey keyProto) throws GeneralSecurityException {
-    Validators.validateVersion(keyProto.getVersion(), VERSION);
+  public Ed25519PublicKey getPublicKey(Ed25519PrivateKey key) throws GeneralSecurityException {
+    return key.getPublicKey();
+  }
+
+  @Override
+  public KeyMaterialType keyMaterialType() {
+    return KeyMaterialType.ASYMMETRIC_PRIVATE;
+  }
+
+  @Override
+  public Ed25519PrivateKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
+    return Ed25519PrivateKey.parseFrom(byteString);
+  }
+
+  @Override
+  public void validateKey(Ed25519PrivateKey keyProto) throws GeneralSecurityException {
+    Validators.validateVersion(keyProto.getVersion(), getVersion());
+    new Ed25519PublicKeyManager().validateKey(keyProto.getPublicKey());
     if (keyProto.getKeyValue().size() != Ed25519Sign.SECRET_KEY_LEN) {
       throw new GeneralSecurityException("invalid Ed25519 private key: incorrect key length");
     }
   }
 
   @Override
-  protected void validateKeyFormat(Empty unused) {}
+  public KeyFactory<Ed25519KeyFormat, Ed25519PrivateKey> keyFactory() {
+    return new KeyFactory<Ed25519KeyFormat, Ed25519PrivateKey>(Ed25519KeyFormat.class) {
+      @Override
+      public void validateKeyFormat(Ed25519KeyFormat format) throws GeneralSecurityException {}
+
+      @Override
+      public Ed25519KeyFormat parseKeyFormat(ByteString byteString)
+          throws InvalidProtocolBufferException {
+        return Ed25519KeyFormat.parseFrom(byteString);
+      }
+
+      @Override
+      public Ed25519PrivateKey createKey(Ed25519KeyFormat format) throws GeneralSecurityException {
+        Ed25519Sign.KeyPair keyPair = Ed25519Sign.KeyPair.newKeyPair();
+        Ed25519PublicKey publicKey =
+            Ed25519PublicKey.newBuilder()
+                .setVersion(getVersion())
+                .setKeyValue(ByteString.copyFrom(keyPair.getPublicKey()))
+                .build();
+        return Ed25519PrivateKey.newBuilder()
+            .setVersion(getVersion())
+            .setKeyValue(ByteString.copyFrom(keyPair.getPrivateKey()))
+            .setPublicKey(publicKey)
+            .build();
+      }
+    };
+  }
+
+  /**
+   * Registers the {@link Ed25519PrivateKeyManager} and the {@link Ed25519PublicKeyManager} with the
+   * registry, so that the the Ed25519-Keys can be used with Tink.
+   */
+  public static void registerPair(boolean newKeyAllowed) throws GeneralSecurityException {
+    Registry.registerAsymmetricKeyManagers(
+        new Ed25519PrivateKeyManager(), new Ed25519PublicKeyManager(), newKeyAllowed);
+  }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/signature/Ed25519PublicKeyManager.java b/java/src/main/java/com/google/crypto/tink/signature/Ed25519PublicKeyManager.java
index f6050ad..2ec3956 100644
--- a/java/src/main/java/com/google/crypto/tink/signature/Ed25519PublicKeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/signature/Ed25519PublicKeyManager.java
@@ -16,10 +16,9 @@
 
 package com.google.crypto.tink.signature;
 
-import com.google.crypto.tink.KeyManagerBase;
+import com.google.crypto.tink.KeyTypeManager;
 import com.google.crypto.tink.PublicKeyVerify;
 import com.google.crypto.tink.proto.Ed25519PublicKey;
-import com.google.crypto.tink.proto.Empty;
 import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.subtle.Ed25519Verify;
 import com.google.crypto.tink.subtle.Validators;
@@ -31,55 +30,43 @@
  * This key manager produces new instances of {@code Ed25519Verify}. It doesn't support key
  * generation.
  */
-class Ed25519PublicKeyManager extends KeyManagerBase<PublicKeyVerify, Ed25519PublicKey, Empty> {
+class Ed25519PublicKeyManager extends KeyTypeManager<Ed25519PublicKey> {
   public Ed25519PublicKeyManager() {
-    super(PublicKeyVerify.class, Ed25519PublicKey.class, Empty.class, TYPE_URL);
-  }
-  public static final String TYPE_URL = "type.googleapis.com/google.crypto.tink.Ed25519PublicKey";
-
-  private static final int VERSION = 0;
-
-  @Override
-  public PublicKeyVerify getPrimitiveFromKey(Ed25519PublicKey keyProto)
-      throws GeneralSecurityException {
-    return new Ed25519Verify(keyProto.getKeyValue().toByteArray());
+    super(
+        Ed25519PublicKey.class,
+        new PrimitiveFactory<PublicKeyVerify, Ed25519PublicKey>(PublicKeyVerify.class) {
+          @Override
+          public PublicKeyVerify getPrimitive(Ed25519PublicKey keyProto) {
+            return new Ed25519Verify(keyProto.getKeyValue().toByteArray());
+          }
+        });
   }
 
   @Override
-  protected Ed25519PublicKey newKeyFromFormat(Empty unused) throws GeneralSecurityException {
-    throw new GeneralSecurityException("Not implemented");
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.Ed25519PublicKey";
   }
 
   @Override
   public int getVersion() {
-    return VERSION;
+    return 0;
   }
 
   @Override
-  protected KeyMaterialType keyMaterialType() {
+  public KeyMaterialType keyMaterialType() {
     return KeyMaterialType.ASYMMETRIC_PUBLIC;
   }
 
   @Override
-  protected Ed25519PublicKey parseKeyProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
+  public Ed25519PublicKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
     return Ed25519PublicKey.parseFrom(byteString);
   }
 
   @Override
-  protected Empty parseKeyFormatProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return Empty.parseFrom(byteString);
-  }
-
-  @Override
-  protected void validateKey(Ed25519PublicKey keyProto) throws GeneralSecurityException {
-    Validators.validateVersion(keyProto.getVersion(), VERSION);
+  public void validateKey(Ed25519PublicKey keyProto) throws GeneralSecurityException {
+    Validators.validateVersion(keyProto.getVersion(), getVersion());
     if (keyProto.getKeyValue().size() != Ed25519Verify.PUBLIC_KEY_LEN) {
       throw new GeneralSecurityException("invalid Ed25519 public key: incorrect key length");
     }
   }
-
-  @Override
-  protected void validateKeyFormat(Empty unused) throws GeneralSecurityException {}
 }
diff --git a/java/src/main/java/com/google/crypto/tink/signature/PublicKeySignCatalogue.java b/java/src/main/java/com/google/crypto/tink/signature/PublicKeySignCatalogue.java
deleted file mode 100644
index 62d5550..0000000
--- a/java/src/main/java/com/google/crypto/tink/signature/PublicKeySignCatalogue.java
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package com.google.crypto.tink.signature;
-
-import com.google.crypto.tink.Catalogue;
-import com.google.crypto.tink.KeyManager;
-import com.google.crypto.tink.PrimitiveWrapper;
-import com.google.crypto.tink.PublicKeySign;
-import java.security.GeneralSecurityException;
-
-/** A catalogue of {@link PublicKeySign} key managers. */
-class PublicKeySignCatalogue implements Catalogue<PublicKeySign> {
-  public PublicKeySignCatalogue() {}
-
-  /**
-   * @return a KeyManager for the given {@code typeUrl}, {@code primitiveName} and version at least
-   *     {@code minVersion} (if it exists in the catalogue).
-   */
-  @Override
-  public KeyManager<PublicKeySign> getKeyManager(
-      String typeUrl, String primitiveName, int minVersion) throws GeneralSecurityException {
-    KeyManager<PublicKeySign> keyManager;
-    switch (primitiveName.toLowerCase()) {
-      case "publickeysign":
-        keyManager = publicKeySignKeyManager(typeUrl);
-        break;
-      default:
-        throw new GeneralSecurityException(
-            String.format("No support for primitive '%s'.", primitiveName));
-    }
-    if (keyManager.getVersion() < minVersion) {
-      throw new GeneralSecurityException(
-          String.format(
-              "No key manager for key type '%s' with version at least %d.", typeUrl, minVersion));
-    }
-    return keyManager;
-  }
-
-  private KeyManager<PublicKeySign> publicKeySignKeyManager(String typeUrl)
-      throws GeneralSecurityException {
-    switch (typeUrl) {
-      case EcdsaSignKeyManager.TYPE_URL:
-        return new EcdsaSignKeyManager();
-      case Ed25519PrivateKeyManager.TYPE_URL:
-        return new Ed25519PrivateKeyManager();
-      case RsaSsaPkcs1SignKeyManager.TYPE_URL:
-        return new RsaSsaPkcs1SignKeyManager();
-      case RsaSsaPssSignKeyManager.TYPE_URL:
-        return new RsaSsaPssSignKeyManager();
-      default:
-        throw new GeneralSecurityException(
-            String.format("No support for primitive 'PublicKeySign' with key type '%s'.", typeUrl));
-    }
-  }
-
-  @Override
-  public PrimitiveWrapper<PublicKeySign> getPrimitiveWrapper() {
-    return new PublicKeySignWrapper();
-  }
-}
diff --git a/java/src/main/java/com/google/crypto/tink/signature/PublicKeySignWrapper.java b/java/src/main/java/com/google/crypto/tink/signature/PublicKeySignWrapper.java
index 4c509da..d65c9a5 100644
--- a/java/src/main/java/com/google/crypto/tink/signature/PublicKeySignWrapper.java
+++ b/java/src/main/java/com/google/crypto/tink/signature/PublicKeySignWrapper.java
@@ -20,6 +20,7 @@
 import com.google.crypto.tink.PrimitiveSet;
 import com.google.crypto.tink.PrimitiveWrapper;
 import com.google.crypto.tink.PublicKeySign;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.proto.OutputPrefixType;
 import com.google.crypto.tink.subtle.Bytes;
 import java.security.GeneralSecurityException;
@@ -31,7 +32,7 @@
  * uses the primary key in the keyset, and prepends to the signature a certain prefix associated
  * with the primary key.
  */
-public final class PublicKeySignWrapper implements PrimitiveWrapper<PublicKeySign> {
+public class PublicKeySignWrapper implements PrimitiveWrapper<PublicKeySign> {
   private static class WrappedPublicKeySign implements PublicKeySign {
     private final PrimitiveSet<PublicKeySign> primitives;
 
@@ -53,6 +54,8 @@
     }
   }
 
+  PublicKeySignWrapper() {}
+
   @Override
   public PublicKeySign wrap(final PrimitiveSet<PublicKeySign> primitives) {
     return new WrappedPublicKeySign(primitives);
@@ -62,4 +65,14 @@
   public Class<PublicKeySign> getPrimitiveClass() {
     return PublicKeySign.class;
   }
+
+  /**
+   * Register the wrapper within the registry.
+   *
+   * <p>This is required for calls to {@link Keyset.getPrimitive} with a {@link PublicKeySign}
+   * argument.
+   */
+  public static void register() throws GeneralSecurityException {
+    Registry.registerPrimitiveWrapper(new PublicKeySignWrapper());
+  }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/signature/PublicKeyVerifyCatalogue.java b/java/src/main/java/com/google/crypto/tink/signature/PublicKeyVerifyCatalogue.java
deleted file mode 100644
index a384657..0000000
--- a/java/src/main/java/com/google/crypto/tink/signature/PublicKeyVerifyCatalogue.java
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package com.google.crypto.tink.signature;
-
-import com.google.crypto.tink.Catalogue;
-import com.google.crypto.tink.KeyManager;
-import com.google.crypto.tink.PrimitiveWrapper;
-import com.google.crypto.tink.PublicKeyVerify;
-import java.security.GeneralSecurityException;
-
-/** A catalogue of {@link PublicKeyVerify} key managers. */
-class PublicKeyVerifyCatalogue implements Catalogue<PublicKeyVerify> {
-  public PublicKeyVerifyCatalogue() {}
-
-  /**
-   * @return a KeyManager for the given {@code typeUrl}, {@code primitiveName} and version at least
-   *     {@code minVersion} (if it exists in the catalogue).
-   */
-  @Override
-  public KeyManager<PublicKeyVerify> getKeyManager(
-      String typeUrl, String primitiveName, int minVersion) throws GeneralSecurityException {
-    KeyManager<PublicKeyVerify> keyManager;
-    switch (primitiveName.toLowerCase()) {
-      case "publickeyverify":
-        keyManager = publicKeyVerifyKeyManager(typeUrl);
-        break;
-      default:
-        throw new GeneralSecurityException(
-            String.format("No support for primitive '%s'.", primitiveName));
-    }
-    if (keyManager.getVersion() < minVersion) {
-      throw new GeneralSecurityException(
-          String.format(
-              "No key manager for key type '%s' with version at least %d.", typeUrl, minVersion));
-    }
-    return keyManager;
-  }
-
-  private KeyManager<PublicKeyVerify> publicKeyVerifyKeyManager(String typeUrl)
-      throws GeneralSecurityException {
-    switch (typeUrl) {
-      case EcdsaVerifyKeyManager.TYPE_URL:
-        return new EcdsaVerifyKeyManager();
-      case Ed25519PublicKeyManager.TYPE_URL:
-        return new Ed25519PublicKeyManager();
-      case RsaSsaPkcs1VerifyKeyManager.TYPE_URL:
-        return new RsaSsaPkcs1VerifyKeyManager();
-      case RsaSsaPssVerifyKeyManager.TYPE_URL:
-        return new RsaSsaPssVerifyKeyManager();
-      default:
-        throw new GeneralSecurityException(
-            String.format(
-                "No support for primitive 'PublicKeyVerify' with key type '%s'.", typeUrl));
-    }
-  }
-
-  @Override
-  public PrimitiveWrapper<PublicKeyVerify> getPrimitiveWrapper() {
-    return new PublicKeyVerifyWrapper();
-  }
-}
diff --git a/java/src/main/java/com/google/crypto/tink/signature/PublicKeyVerifyWrapper.java b/java/src/main/java/com/google/crypto/tink/signature/PublicKeyVerifyWrapper.java
index 996ae03..9f2dd36 100644
--- a/java/src/main/java/com/google/crypto/tink/signature/PublicKeyVerifyWrapper.java
+++ b/java/src/main/java/com/google/crypto/tink/signature/PublicKeyVerifyWrapper.java
@@ -20,6 +20,7 @@
 import com.google.crypto.tink.PrimitiveSet;
 import com.google.crypto.tink.PrimitiveWrapper;
 import com.google.crypto.tink.PublicKeyVerify;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.proto.OutputPrefixType;
 import com.google.crypto.tink.subtle.Bytes;
 import java.security.GeneralSecurityException;
@@ -37,7 +38,7 @@
  *
  * @since 1.0.0
  */
-public final class PublicKeyVerifyWrapper implements PrimitiveWrapper<PublicKeyVerify> {
+class PublicKeyVerifyWrapper implements PrimitiveWrapper<PublicKeyVerify> {
   private static final Logger logger = Logger.getLogger(PublicKeyVerifyWrapper.class.getName());
 
   private static class WrappedPublicKeyVerify implements PublicKeyVerify {
@@ -100,4 +101,14 @@
   public Class<PublicKeyVerify> getPrimitiveClass() {
     return PublicKeyVerify.class;
   }
+
+  /**
+   * Register the wrapper within the registry.
+   *
+   * <p>This is required for calls to {@link Keyset.getPrimitive} with a {@link PublicKeyVerify}
+   * argument.
+   */
+  public static void register() throws GeneralSecurityException {
+    Registry.registerPrimitiveWrapper(new PublicKeyVerifyWrapper());
+  }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/signature/RsaSsaPkcs1SignKeyManager.java b/java/src/main/java/com/google/crypto/tink/signature/RsaSsaPkcs1SignKeyManager.java
index ef5cfe6..4c84020 100644
--- a/java/src/main/java/com/google/crypto/tink/signature/RsaSsaPkcs1SignKeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/signature/RsaSsaPkcs1SignKeyManager.java
@@ -16,10 +16,9 @@
 
 package com.google.crypto.tink.signature;
 
-import com.google.crypto.tink.KeyManagerBase;
-import com.google.crypto.tink.PrivateKeyManager;
+import com.google.crypto.tink.PrivateKeyTypeManager;
 import com.google.crypto.tink.PublicKeySign;
-import com.google.crypto.tink.proto.KeyData;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.proto.RsaSsaPkcs1KeyFormat;
 import com.google.crypto.tink.proto.RsaSsaPkcs1Params;
@@ -48,150 +47,154 @@
  * {@code RsaSsaPkcs1SignJce}.
  */
 class RsaSsaPkcs1SignKeyManager
-    extends KeyManagerBase<PublicKeySign, RsaSsaPkcs1PrivateKey, RsaSsaPkcs1KeyFormat>
-    implements PrivateKeyManager<PublicKeySign> {
+    extends PrivateKeyTypeManager<RsaSsaPkcs1PrivateKey, RsaSsaPkcs1PublicKey> {
+  private static final byte[] TEST_MESSAGE =
+      "Tink and Wycheproof.".getBytes(Charset.forName("UTF-8"));
+
   public RsaSsaPkcs1SignKeyManager() {
-    super(PublicKeySign.class, RsaSsaPkcs1PrivateKey.class, RsaSsaPkcs1KeyFormat.class, TYPE_URL);
+    super(
+        RsaSsaPkcs1PrivateKey.class,
+        RsaSsaPkcs1PublicKey.class,
+        new PrimitiveFactory<PublicKeySign, RsaSsaPkcs1PrivateKey>(PublicKeySign.class) {
+          @Override
+          public PublicKeySign getPrimitive(RsaSsaPkcs1PrivateKey keyProto)
+              throws GeneralSecurityException {
+            java.security.KeyFactory kf = EngineFactory.KEY_FACTORY.getInstance("RSA");
+            RSAPrivateCrtKey privateKey =
+                (RSAPrivateCrtKey)
+                    kf.generatePrivate(
+                        new RSAPrivateCrtKeySpec(
+                            new BigInteger(1, keyProto.getPublicKey().getN().toByteArray()),
+                            new BigInteger(1, keyProto.getPublicKey().getE().toByteArray()),
+                            new BigInteger(1, keyProto.getD().toByteArray()),
+                            new BigInteger(1, keyProto.getP().toByteArray()),
+                            new BigInteger(1, keyProto.getQ().toByteArray()),
+                            new BigInteger(1, keyProto.getDp().toByteArray()),
+                            new BigInteger(1, keyProto.getDq().toByteArray()),
+                            new BigInteger(1, keyProto.getCrt().toByteArray())));
+            // Sign and verify a test message to make sure that the key is correct.
+            RsaSsaPkcs1SignJce signer =
+                new RsaSsaPkcs1SignJce(
+                    privateKey,
+                    SigUtil.toHashType(keyProto.getPublicKey().getParams().getHashType()));
+            RSAPublicKey publicKey =
+                (RSAPublicKey)
+                    kf.generatePublic(
+                        new RSAPublicKeySpec(
+                            new BigInteger(1, keyProto.getPublicKey().getN().toByteArray()),
+                            new BigInteger(1, keyProto.getPublicKey().getE().toByteArray())));
+            RsaSsaPkcs1VerifyJce verifier =
+                new RsaSsaPkcs1VerifyJce(
+                    publicKey,
+                    SigUtil.toHashType(keyProto.getPublicKey().getParams().getHashType()));
+            try {
+              verifier.verify(signer.sign(TEST_MESSAGE), TEST_MESSAGE);
+            } catch (GeneralSecurityException e) {
+              throw new RuntimeException(
+                  "Security bug: signing with private key followed by verifying with public key"
+                      + " failed"
+                      + e);
+            }
+            return signer;
+          }
+        });
   }
 
-  public static final String TYPE_URL =
-      "type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PrivateKey";
-
-  private static final int VERSION = 0;
-
-  private static final Charset UTF_8 = Charset.forName("UTF-8");
-
-  /** Test message. */
-  private static final byte[] TEST_MESSAGE = "Tink and Wycheproof.".getBytes(UTF_8);
+  @Override
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PrivateKey";
+  }
 
   @Override
-  public PublicKeySign getPrimitiveFromKey(RsaSsaPkcs1PrivateKey keyProto)
+  public int getVersion() {
+    return 0;
+  }
+
+  @Override
+  public RsaSsaPkcs1PublicKey getPublicKey(RsaSsaPkcs1PrivateKey privKeyProto)
       throws GeneralSecurityException {
-    validateKey(keyProto);
-    KeyFactory kf = EngineFactory.KEY_FACTORY.getInstance("RSA");
-    RSAPrivateCrtKey privateKey =
-        (RSAPrivateCrtKey)
-            kf.generatePrivate(
-                new RSAPrivateCrtKeySpec(
-                    new BigInteger(1, keyProto.getPublicKey().getN().toByteArray()),
-                    new BigInteger(1, keyProto.getPublicKey().getE().toByteArray()),
-                    new BigInteger(1, keyProto.getD().toByteArray()),
-                    new BigInteger(1, keyProto.getP().toByteArray()),
-                    new BigInteger(1, keyProto.getQ().toByteArray()),
-                    new BigInteger(1, keyProto.getDp().toByteArray()),
-                    new BigInteger(1, keyProto.getDq().toByteArray()),
-                    new BigInteger(1, keyProto.getCrt().toByteArray())));
-    // Sign and verify a test message to make sure that the key is correct.
-    RsaSsaPkcs1SignJce signer =
-        new RsaSsaPkcs1SignJce(
-            privateKey, SigUtil.toHashType(keyProto.getPublicKey().getParams().getHashType()));
-    RSAPublicKey publicKey =
-        (RSAPublicKey)
-            kf.generatePublic(
-                new RSAPublicKeySpec(
-                    new BigInteger(1, keyProto.getPublicKey().getN().toByteArray()),
-                    new BigInteger(1, keyProto.getPublicKey().getE().toByteArray())));
-    RsaSsaPkcs1VerifyJce verifier =
-        new RsaSsaPkcs1VerifyJce(
-            publicKey, SigUtil.toHashType(keyProto.getPublicKey().getParams().getHashType()));
-    try {
-      verifier.verify(signer.sign(TEST_MESSAGE), TEST_MESSAGE);
-    } catch (GeneralSecurityException e) {
-      throw new RuntimeException(
-          "Security bug: signing with private key followed by verifying with public key failed"
-              + e);
-    }
-    return signer;
-  }
-
-  /**
-   * @param serializedKeyFormat serialized {@code RsaSsaPkcs1KeyFormat} proto
-   * @return new {@code RsaSsaPkcs1PrivateKey} proto
-   */
-  @Override
-  public RsaSsaPkcs1PrivateKey newKeyFromFormat(RsaSsaPkcs1KeyFormat format)
-      throws GeneralSecurityException {
-    validateKeyFormat(format);
-    RsaSsaPkcs1Params params = format.getParams();
-    KeyPairGenerator keyGen = EngineFactory.KEY_PAIR_GENERATOR.getInstance("RSA");
-    RSAKeyGenParameterSpec spec =
-        new RSAKeyGenParameterSpec(
-            format.getModulusSizeInBits(),
-            new BigInteger(1, format.getPublicExponent().toByteArray()));
-    keyGen.initialize(spec);
-    KeyPair keyPair = keyGen.generateKeyPair();
-    RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublic();
-    RSAPrivateCrtKey privKey = (RSAPrivateCrtKey) keyPair.getPrivate();
-
-    // Creates RsaSsaPkcs1PublicKey.
-    RsaSsaPkcs1PublicKey pkcs1PubKey =
-        RsaSsaPkcs1PublicKey.newBuilder()
-            .setVersion(VERSION)
-            .setParams(params)
-            .setE(ByteString.copyFrom(pubKey.getPublicExponent().toByteArray()))
-            .setN(ByteString.copyFrom(pubKey.getModulus().toByteArray()))
-            .build();
-
-    // Creates RsaSsaPkcs1PrivateKey.
-    return RsaSsaPkcs1PrivateKey.newBuilder()
-        .setVersion(VERSION)
-        .setPublicKey(pkcs1PubKey)
-        .setD(ByteString.copyFrom(privKey.getPrivateExponent().toByteArray()))
-        .setP(ByteString.copyFrom(privKey.getPrimeP().toByteArray()))
-        .setQ(ByteString.copyFrom(privKey.getPrimeQ().toByteArray()))
-        .setDp(ByteString.copyFrom(privKey.getPrimeExponentP().toByteArray()))
-        .setDq(ByteString.copyFrom(privKey.getPrimeExponentQ().toByteArray()))
-        .setCrt(ByteString.copyFrom(privKey.getCrtCoefficient().toByteArray()))
-        .build();
+    return privKeyProto.getPublicKey();
   }
 
   @Override
-  protected KeyMaterialType keyMaterialType() {
+  public KeyMaterialType keyMaterialType() {
     return KeyMaterialType.ASYMMETRIC_PRIVATE;
   }
 
   @Override
-  protected RsaSsaPkcs1PrivateKey parseKeyProto(ByteString byteString)
+  public RsaSsaPkcs1PrivateKey parseKey(ByteString byteString)
       throws InvalidProtocolBufferException {
     return RsaSsaPkcs1PrivateKey.parseFrom(byteString);
   }
 
   @Override
-  protected RsaSsaPkcs1KeyFormat parseKeyFormatProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return RsaSsaPkcs1KeyFormat.parseFrom(byteString);
-  }
-
-  @Override
-  public KeyData getPublicKeyData(ByteString serializedKey) throws GeneralSecurityException {
-    try {
-      RsaSsaPkcs1PrivateKey privKeyProto = RsaSsaPkcs1PrivateKey.parseFrom(serializedKey);
-      return KeyData.newBuilder()
-          .setTypeUrl(RsaSsaPkcs1VerifyKeyManager.TYPE_URL)
-          .setValue(privKeyProto.getPublicKey().toByteString())
-          .setKeyMaterialType(KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC)
-          .build();
-    } catch (InvalidProtocolBufferException e) {
-      throw new GeneralSecurityException("expected serialized RsaSsaPkcs1PrivateKey proto", e);
-    }
-  }
-
-  @Override
-  public int getVersion() {
-    return VERSION;
-  }
-
-  @Override
-  protected void validateKeyFormat(RsaSsaPkcs1KeyFormat keyFormat) throws GeneralSecurityException {
-    SigUtil.validateRsaSsaPkcs1Params(keyFormat.getParams());
-    Validators.validateRsaModulusSize(keyFormat.getModulusSizeInBits());
-  }
-
-  @Override
-  protected void validateKey(RsaSsaPkcs1PrivateKey privKey) throws GeneralSecurityException {
-    Validators.validateVersion(privKey.getVersion(), VERSION);
+  public void validateKey(RsaSsaPkcs1PrivateKey privKey) throws GeneralSecurityException {
+    Validators.validateVersion(privKey.getVersion(), getVersion());
     Validators.validateRsaModulusSize(
-        (new BigInteger(1, privKey.getPublicKey().getN().toByteArray())).bitLength());
+        new BigInteger(1, privKey.getPublicKey().getN().toByteArray()).bitLength());
     SigUtil.validateRsaSsaPkcs1Params(privKey.getPublicKey().getParams());
   }
+
+  @Override
+  public KeyFactory<RsaSsaPkcs1KeyFormat, RsaSsaPkcs1PrivateKey> keyFactory() {
+    return new KeyFactory<RsaSsaPkcs1KeyFormat, RsaSsaPkcs1PrivateKey>(RsaSsaPkcs1KeyFormat.class) {
+      @Override
+      public void validateKeyFormat(RsaSsaPkcs1KeyFormat keyFormat)
+          throws GeneralSecurityException {
+        SigUtil.validateRsaSsaPkcs1Params(keyFormat.getParams());
+        Validators.validateRsaModulusSize(keyFormat.getModulusSizeInBits());
+      }
+
+      @Override
+      public RsaSsaPkcs1KeyFormat parseKeyFormat(ByteString byteString)
+          throws InvalidProtocolBufferException {
+        return RsaSsaPkcs1KeyFormat.parseFrom(byteString);
+      }
+
+      @Override
+      public RsaSsaPkcs1PrivateKey createKey(RsaSsaPkcs1KeyFormat format)
+          throws GeneralSecurityException {
+        RsaSsaPkcs1Params params = format.getParams();
+        KeyPairGenerator keyGen = EngineFactory.KEY_PAIR_GENERATOR.getInstance("RSA");
+        RSAKeyGenParameterSpec spec =
+            new RSAKeyGenParameterSpec(
+                format.getModulusSizeInBits(),
+                new BigInteger(1, format.getPublicExponent().toByteArray()));
+        keyGen.initialize(spec);
+        KeyPair keyPair = keyGen.generateKeyPair();
+        RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublic();
+        RSAPrivateCrtKey privKey = (RSAPrivateCrtKey) keyPair.getPrivate();
+
+        // Creates RsaSsaPkcs1PublicKey.
+        RsaSsaPkcs1PublicKey pkcs1PubKey =
+            RsaSsaPkcs1PublicKey.newBuilder()
+                .setVersion(getVersion())
+                .setParams(params)
+                .setE(ByteString.copyFrom(pubKey.getPublicExponent().toByteArray()))
+                .setN(ByteString.copyFrom(pubKey.getModulus().toByteArray()))
+                .build();
+
+        // Creates RsaSsaPkcs1PrivateKey.
+        return RsaSsaPkcs1PrivateKey.newBuilder()
+            .setVersion(getVersion())
+            .setPublicKey(pkcs1PubKey)
+            .setD(ByteString.copyFrom(privKey.getPrivateExponent().toByteArray()))
+            .setP(ByteString.copyFrom(privKey.getPrimeP().toByteArray()))
+            .setQ(ByteString.copyFrom(privKey.getPrimeQ().toByteArray()))
+            .setDp(ByteString.copyFrom(privKey.getPrimeExponentP().toByteArray()))
+            .setDq(ByteString.copyFrom(privKey.getPrimeExponentQ().toByteArray()))
+            .setCrt(ByteString.copyFrom(privKey.getCrtCoefficient().toByteArray()))
+            .build();
+      }
+    };
+  }
+
+  /**
+   * Registers the {@link RsaSsaPkcs1SignKeyManager} and the {@link RsaSsaPkcs1VerifyKeyManager}
+   * with the registry, so that the the RsaSsaPkcs1-Keys can be used with Tink.
+   */
+  public static void registerPair(boolean newKeyAllowed) throws GeneralSecurityException {
+    Registry.registerAsymmetricKeyManagers(
+        new RsaSsaPkcs1SignKeyManager(), new RsaSsaPkcs1VerifyKeyManager(), newKeyAllowed);
+  }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/signature/RsaSsaPkcs1VerifyKeyManager.java b/java/src/main/java/com/google/crypto/tink/signature/RsaSsaPkcs1VerifyKeyManager.java
index 430bfe7..b320ac0 100644
--- a/java/src/main/java/com/google/crypto/tink/signature/RsaSsaPkcs1VerifyKeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/signature/RsaSsaPkcs1VerifyKeyManager.java
@@ -16,9 +16,8 @@
 
 package com.google.crypto.tink.signature;
 
-import com.google.crypto.tink.KeyManagerBase;
+import com.google.crypto.tink.KeyTypeManager;
 import com.google.crypto.tink.PublicKeyVerify;
-import com.google.crypto.tink.proto.Empty;
 import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.proto.RsaSsaPkcs1PublicKey;
 import com.google.crypto.tink.subtle.EngineFactory;
@@ -28,7 +27,6 @@
 import com.google.protobuf.InvalidProtocolBufferException;
 import java.math.BigInteger;
 import java.security.GeneralSecurityException;
-import java.security.KeyFactory;
 import java.security.interfaces.RSAPublicKey;
 import java.security.spec.RSAPublicKeySpec;
 
@@ -36,64 +34,50 @@
  * This key manager produces new instances of {@code RsaSsaPkcs1VerifyJce}. It doesn't support key
  * generation.
  */
-class RsaSsaPkcs1VerifyKeyManager
-    extends KeyManagerBase<PublicKeyVerify, RsaSsaPkcs1PublicKey, Empty> {
+class RsaSsaPkcs1VerifyKeyManager extends KeyTypeManager<RsaSsaPkcs1PublicKey> {
   public RsaSsaPkcs1VerifyKeyManager() {
-    super(PublicKeyVerify.class, RsaSsaPkcs1PublicKey.class, Empty.class, TYPE_URL);
-  }
-
-  private static final int VERSION = 0;
-  public static final String TYPE_URL =
-      "type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PublicKey";
-
-  @Override
-  public PublicKeyVerify getPrimitiveFromKey(RsaSsaPkcs1PublicKey keyProto)
-      throws GeneralSecurityException {
-    validateKey(keyProto);
-    KeyFactory kf = EngineFactory.KEY_FACTORY.getInstance("RSA");
-    BigInteger modulus = new BigInteger(1, keyProto.getN().toByteArray());
-    BigInteger exponent = new BigInteger(1, keyProto.getE().toByteArray());
-    RSAPublicKey publicKey =
-        (RSAPublicKey) kf.generatePublic(new RSAPublicKeySpec(modulus, exponent));
-    return new RsaSsaPkcs1VerifyJce(
-        publicKey, SigUtil.toHashType(keyProto.getParams().getHashType()));
+    super(
+        RsaSsaPkcs1PublicKey.class,
+        new PrimitiveFactory<PublicKeyVerify, RsaSsaPkcs1PublicKey>(PublicKeyVerify.class) {
+          @Override
+          public PublicKeyVerify getPrimitive(RsaSsaPkcs1PublicKey keyProto)
+              throws GeneralSecurityException {
+            java.security.KeyFactory kf = EngineFactory.KEY_FACTORY.getInstance("RSA");
+            BigInteger modulus = new BigInteger(1, keyProto.getN().toByteArray());
+            BigInteger exponent = new BigInteger(1, keyProto.getE().toByteArray());
+            RSAPublicKey publicKey =
+                (RSAPublicKey) kf.generatePublic(new RSAPublicKeySpec(modulus, exponent));
+            return new RsaSsaPkcs1VerifyJce(
+                publicKey, SigUtil.toHashType(keyProto.getParams().getHashType()));
+          }
+        });
   }
 
   @Override
-  public RsaSsaPkcs1PublicKey newKeyFromFormat(Empty serializedKeyFormat)
-      throws GeneralSecurityException {
-    throw new GeneralSecurityException("Not implemented");
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PublicKey";
   }
 
   @Override
   public int getVersion() {
-    return VERSION;
+    return 0;
   }
 
   @Override
-  protected KeyMaterialType keyMaterialType() {
+  public KeyMaterialType keyMaterialType() {
     return KeyMaterialType.ASYMMETRIC_PUBLIC;
   }
 
   @Override
-  protected RsaSsaPkcs1PublicKey parseKeyProto(ByteString byteString)
+  public RsaSsaPkcs1PublicKey parseKey(ByteString byteString)
       throws InvalidProtocolBufferException {
     return RsaSsaPkcs1PublicKey.parseFrom(byteString);
   }
 
   @Override
-  protected Empty parseKeyFormatProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return Empty.parseFrom(byteString);
-  }
-
-  @Override
-  protected void validateKey(RsaSsaPkcs1PublicKey pubKey) throws GeneralSecurityException {
-    Validators.validateVersion(pubKey.getVersion(), VERSION);
+  public void validateKey(RsaSsaPkcs1PublicKey pubKey) throws GeneralSecurityException {
+    Validators.validateVersion(pubKey.getVersion(), getVersion());
     Validators.validateRsaModulusSize((new BigInteger(1, pubKey.getN().toByteArray())).bitLength());
     SigUtil.validateRsaSsaPkcs1Params(pubKey.getParams());
   }
-
-  @Override
-  protected void validateKeyFormat(Empty unused) {}
 }
diff --git a/java/src/main/java/com/google/crypto/tink/signature/RsaSsaPssSignKeyManager.java b/java/src/main/java/com/google/crypto/tink/signature/RsaSsaPssSignKeyManager.java
index 8d85cdd..971ac05 100644
--- a/java/src/main/java/com/google/crypto/tink/signature/RsaSsaPssSignKeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/signature/RsaSsaPssSignKeyManager.java
@@ -16,10 +16,9 @@
 
 package com.google.crypto.tink.signature;
 
-import com.google.crypto.tink.KeyManagerBase;
-import com.google.crypto.tink.PrivateKeyManager;
+import com.google.crypto.tink.PrivateKeyTypeManager;
 import com.google.crypto.tink.PublicKeySign;
-import com.google.crypto.tink.proto.KeyData;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.proto.RsaSsaPssKeyFormat;
 import com.google.crypto.tink.proto.RsaSsaPssParams;
@@ -48,157 +47,159 @@
  * {@code RsaSsaPssSignJce}.
  */
 class RsaSsaPssSignKeyManager
-    extends KeyManagerBase<PublicKeySign, RsaSsaPssPrivateKey, RsaSsaPssKeyFormat>
-    implements PrivateKeyManager<PublicKeySign> {
+    extends PrivateKeyTypeManager<RsaSsaPssPrivateKey, RsaSsaPssPublicKey> {
+  private static final byte[] TEST_MESSAGE =
+      "Tink and Wycheproof.".getBytes(Charset.forName("UTF-8"));
+
   public RsaSsaPssSignKeyManager() {
-    super(PublicKeySign.class, RsaSsaPssPrivateKey.class, RsaSsaPssKeyFormat.class, TYPE_URL);
-  }
-
-  public static final String TYPE_URL =
-      "type.googleapis.com/google.crypto.tink.RsaSsaPssPrivateKey";
-
-  private static final int VERSION = 0;
-
-  private static final Charset UTF_8 = Charset.forName("UTF-8");
-
-  /** Test message. */
-  private static final byte[] TEST_MESSAGE = "Tink and Wycheproof.".getBytes(UTF_8);
-
-  @Override
-  public PublicKeySign getPrimitiveFromKey(RsaSsaPssPrivateKey keyProto)
-      throws GeneralSecurityException {
-    KeyFactory kf = EngineFactory.KEY_FACTORY.getInstance("RSA");
-    RSAPrivateCrtKey privateKey =
-        (RSAPrivateCrtKey)
-            kf.generatePrivate(
-                new RSAPrivateCrtKeySpec(
-                    new BigInteger(1, keyProto.getPublicKey().getN().toByteArray()),
-                    new BigInteger(1, keyProto.getPublicKey().getE().toByteArray()),
-                    new BigInteger(1, keyProto.getD().toByteArray()),
-                    new BigInteger(1, keyProto.getP().toByteArray()),
-                    new BigInteger(1, keyProto.getQ().toByteArray()),
-                    new BigInteger(1, keyProto.getDp().toByteArray()),
-                    new BigInteger(1, keyProto.getDq().toByteArray()),
-                    new BigInteger(1, keyProto.getCrt().toByteArray())));
-    RsaSsaPssParams params = keyProto.getPublicKey().getParams();
-    // Sign and verify a test message to make sure that the key is correct.
-    RsaSsaPssSignJce signer =
-        new RsaSsaPssSignJce(
-            privateKey,
-            SigUtil.toHashType(params.getSigHash()),
-            SigUtil.toHashType(params.getMgf1Hash()),
-            params.getSaltLength());
-    RSAPublicKey publicKey =
-        (RSAPublicKey)
-            kf.generatePublic(
-                new RSAPublicKeySpec(
-                    new BigInteger(1, keyProto.getPublicKey().getN().toByteArray()),
-                    new BigInteger(1, keyProto.getPublicKey().getE().toByteArray())));
-    RsaSsaPssVerifyJce verifier =
-        new RsaSsaPssVerifyJce(
-            publicKey,
-            SigUtil.toHashType(params.getSigHash()),
-            SigUtil.toHashType(params.getMgf1Hash()),
-            params.getSaltLength());
-    try {
-      verifier.verify(signer.sign(TEST_MESSAGE), TEST_MESSAGE);
-    } catch (GeneralSecurityException e) {
-      throw new RuntimeException(
-          "Security bug: signing with private key followed by verifying with public key failed"
-              + e);
-    }
-    return signer;
-  }
-
-  /**
-   * @param serializedKeyFormat serialized {@code RsaSsaPssKeyFormat} proto
-   * @return new {@code RsaSsaPssPrivateKey} proto
-   */
-  @Override
-  protected RsaSsaPssPrivateKey newKeyFromFormat(RsaSsaPssKeyFormat format)
-      throws GeneralSecurityException {
-    RsaSsaPssParams params = format.getParams();
-    Validators.validateRsaModulusSize(format.getModulusSizeInBits());
-    Validators.validateSignatureHash(SigUtil.toHashType(params.getSigHash()));
-    KeyPairGenerator keyGen = EngineFactory.KEY_PAIR_GENERATOR.getInstance("RSA");
-    RSAKeyGenParameterSpec spec =
-        new RSAKeyGenParameterSpec(
-            format.getModulusSizeInBits(),
-            new BigInteger(1, format.getPublicExponent().toByteArray()));
-    keyGen.initialize(spec);
-    KeyPair keyPair = keyGen.generateKeyPair();
-    RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublic();
-    RSAPrivateCrtKey privKey = (RSAPrivateCrtKey) keyPair.getPrivate();
-
-    // Creates RsaSsaPssPublicKey.
-    RsaSsaPssPublicKey pssPubKey =
-        RsaSsaPssPublicKey.newBuilder()
-            .setVersion(VERSION)
-            .setParams(params)
-            .setE(ByteString.copyFrom(pubKey.getPublicExponent().toByteArray()))
-            .setN(ByteString.copyFrom(pubKey.getModulus().toByteArray()))
-            .build();
-
-    // Creates RsaSsaPssPrivateKey.
-    return RsaSsaPssPrivateKey.newBuilder()
-        .setVersion(VERSION)
-        .setPublicKey(pssPubKey)
-        .setD(ByteString.copyFrom(privKey.getPrivateExponent().toByteArray()))
-        .setP(ByteString.copyFrom(privKey.getPrimeP().toByteArray()))
-        .setQ(ByteString.copyFrom(privKey.getPrimeQ().toByteArray()))
-        .setDp(ByteString.copyFrom(privKey.getPrimeExponentP().toByteArray()))
-        .setDq(ByteString.copyFrom(privKey.getPrimeExponentQ().toByteArray()))
-        .setCrt(ByteString.copyFrom(privKey.getCrtCoefficient().toByteArray()))
-        .build();
+    super(
+        RsaSsaPssPrivateKey.class,
+        RsaSsaPssPublicKey.class,
+        new PrimitiveFactory<PublicKeySign, RsaSsaPssPrivateKey>(PublicKeySign.class) {
+          @Override
+          public PublicKeySign getPrimitive(RsaSsaPssPrivateKey keyProto)
+              throws GeneralSecurityException {
+            java.security.KeyFactory kf = EngineFactory.KEY_FACTORY.getInstance("RSA");
+            RSAPrivateCrtKey privateKey =
+                (RSAPrivateCrtKey)
+                    kf.generatePrivate(
+                        new RSAPrivateCrtKeySpec(
+                            new BigInteger(1, keyProto.getPublicKey().getN().toByteArray()),
+                            new BigInteger(1, keyProto.getPublicKey().getE().toByteArray()),
+                            new BigInteger(1, keyProto.getD().toByteArray()),
+                            new BigInteger(1, keyProto.getP().toByteArray()),
+                            new BigInteger(1, keyProto.getQ().toByteArray()),
+                            new BigInteger(1, keyProto.getDp().toByteArray()),
+                            new BigInteger(1, keyProto.getDq().toByteArray()),
+                            new BigInteger(1, keyProto.getCrt().toByteArray())));
+            RsaSsaPssParams params = keyProto.getPublicKey().getParams();
+            // Sign and verify a test message to make sure that the key is correct.
+            RsaSsaPssSignJce signer =
+                new RsaSsaPssSignJce(
+                    privateKey,
+                    SigUtil.toHashType(params.getSigHash()),
+                    SigUtil.toHashType(params.getMgf1Hash()),
+                    params.getSaltLength());
+            RSAPublicKey publicKey =
+                (RSAPublicKey)
+                    kf.generatePublic(
+                        new RSAPublicKeySpec(
+                            new BigInteger(1, keyProto.getPublicKey().getN().toByteArray()),
+                            new BigInteger(1, keyProto.getPublicKey().getE().toByteArray())));
+            RsaSsaPssVerifyJce verifier =
+                new RsaSsaPssVerifyJce(
+                    publicKey,
+                    SigUtil.toHashType(params.getSigHash()),
+                    SigUtil.toHashType(params.getMgf1Hash()),
+                    params.getSaltLength());
+            try {
+              verifier.verify(signer.sign(TEST_MESSAGE), TEST_MESSAGE);
+            } catch (GeneralSecurityException e) {
+              throw new RuntimeException(
+                  "Security bug: signing with private key followed by verifying with public key"
+                      + " failed"
+                      + e);
+            }
+            return signer;
+          }
+        });
   }
 
   @Override
-  public KeyData getPublicKeyData(ByteString serializedKey) throws GeneralSecurityException {
-    try {
-      RsaSsaPssPrivateKey privKeyProto = RsaSsaPssPrivateKey.parseFrom(serializedKey);
-      return KeyData.newBuilder()
-          .setTypeUrl(RsaSsaPssVerifyKeyManager.TYPE_URL)
-          .setValue(privKeyProto.getPublicKey().toByteString())
-          .setKeyMaterialType(KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC)
-          .build();
-    } catch (InvalidProtocolBufferException e) {
-      throw new GeneralSecurityException("expected serialized RsaSsaPssPrivateKey proto", e);
-    }
-  }
-
-  @Override
-  protected KeyMaterialType keyMaterialType() {
-    return KeyMaterialType.ASYMMETRIC_PRIVATE;
-  }
-
-  @Override
-  protected RsaSsaPssPrivateKey parseKeyProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return RsaSsaPssPrivateKey.parseFrom(byteString);
-  }
-
-  @Override
-  protected RsaSsaPssKeyFormat parseKeyFormatProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return RsaSsaPssKeyFormat.parseFrom(byteString);
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.RsaSsaPssPrivateKey";
   }
 
   @Override
   public int getVersion() {
-    return VERSION;
+    return 0;
   }
 
   @Override
-  protected void validateKeyFormat(RsaSsaPssKeyFormat format) throws GeneralSecurityException {
-    SigUtil.validateRsaSsaPssParams(format.getParams());
-    Validators.validateRsaModulusSize(format.getModulusSizeInBits());
+  public RsaSsaPssPublicKey getPublicKey(RsaSsaPssPrivateKey privKeyProto)
+      throws GeneralSecurityException {
+    return privKeyProto.getPublicKey();
   }
 
   @Override
-  protected void validateKey(RsaSsaPssPrivateKey privKey) throws GeneralSecurityException {
-    Validators.validateVersion(privKey.getVersion(), VERSION);
+  public KeyMaterialType keyMaterialType() {
+    return KeyMaterialType.ASYMMETRIC_PRIVATE;
+  }
+
+  @Override
+  public RsaSsaPssPrivateKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
+    return RsaSsaPssPrivateKey.parseFrom(byteString);
+  }
+
+  @Override
+  public void validateKey(RsaSsaPssPrivateKey keyProto) throws GeneralSecurityException {
+    Validators.validateVersion(keyProto.getVersion(), getVersion());
     Validators.validateRsaModulusSize(
-        new BigInteger(1, privKey.getPublicKey().getN().toByteArray()).bitLength());
-    SigUtil.validateRsaSsaPssParams(privKey.getPublicKey().getParams());
+        new BigInteger(1, keyProto.getPublicKey().getN().toByteArray()).bitLength());
+    SigUtil.validateRsaSsaPssParams(keyProto.getPublicKey().getParams());
+  }
+
+  @Override
+  public KeyFactory<RsaSsaPssKeyFormat, RsaSsaPssPrivateKey> keyFactory() {
+    return new KeyFactory<RsaSsaPssKeyFormat, RsaSsaPssPrivateKey>(RsaSsaPssKeyFormat.class) {
+      @Override
+      public void validateKeyFormat(RsaSsaPssKeyFormat format) throws GeneralSecurityException {
+        SigUtil.validateRsaSsaPssParams(format.getParams());
+        Validators.validateRsaModulusSize(format.getModulusSizeInBits());
+      }
+
+      @Override
+      public RsaSsaPssKeyFormat parseKeyFormat(ByteString byteString)
+          throws InvalidProtocolBufferException {
+        return RsaSsaPssKeyFormat.parseFrom(byteString);
+      }
+
+      @Override
+      public RsaSsaPssPrivateKey createKey(RsaSsaPssKeyFormat format)
+          throws GeneralSecurityException {
+        RsaSsaPssParams params = format.getParams();
+        Validators.validateRsaModulusSize(format.getModulusSizeInBits());
+        Validators.validateSignatureHash(SigUtil.toHashType(params.getSigHash()));
+        KeyPairGenerator keyGen = EngineFactory.KEY_PAIR_GENERATOR.getInstance("RSA");
+        RSAKeyGenParameterSpec spec =
+            new RSAKeyGenParameterSpec(
+                format.getModulusSizeInBits(),
+                new BigInteger(1, format.getPublicExponent().toByteArray()));
+        keyGen.initialize(spec);
+        KeyPair keyPair = keyGen.generateKeyPair();
+        RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublic();
+        RSAPrivateCrtKey privKey = (RSAPrivateCrtKey) keyPair.getPrivate();
+
+        // Creates RsaSsaPssPublicKey.
+        RsaSsaPssPublicKey pssPubKey =
+            RsaSsaPssPublicKey.newBuilder()
+                .setVersion(getVersion())
+                .setParams(params)
+                .setE(ByteString.copyFrom(pubKey.getPublicExponent().toByteArray()))
+                .setN(ByteString.copyFrom(pubKey.getModulus().toByteArray()))
+                .build();
+
+        // Creates RsaSsaPssPrivateKey.
+        return RsaSsaPssPrivateKey.newBuilder()
+            .setVersion(getVersion())
+            .setPublicKey(pssPubKey)
+            .setD(ByteString.copyFrom(privKey.getPrivateExponent().toByteArray()))
+            .setP(ByteString.copyFrom(privKey.getPrimeP().toByteArray()))
+            .setQ(ByteString.copyFrom(privKey.getPrimeQ().toByteArray()))
+            .setDp(ByteString.copyFrom(privKey.getPrimeExponentP().toByteArray()))
+            .setDq(ByteString.copyFrom(privKey.getPrimeExponentQ().toByteArray()))
+            .setCrt(ByteString.copyFrom(privKey.getCrtCoefficient().toByteArray()))
+            .build();
+      }
+    };
+  }
+
+  /**
+   * Registers the {@link RsaSsaPssSignKeyManager} and the {@link RsaSsaPssVerifyKeyManager}
+   * with the registry, so that the the RsaSsaPss-Keys can be used with Tink.
+   */
+  public static void registerPair(boolean newKeyAllowed) throws GeneralSecurityException {
+    Registry.registerAsymmetricKeyManagers(
+        new RsaSsaPssSignKeyManager(), new RsaSsaPssVerifyKeyManager(), newKeyAllowed);
   }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/signature/RsaSsaPssVerifyKeyManager.java b/java/src/main/java/com/google/crypto/tink/signature/RsaSsaPssVerifyKeyManager.java
index c2a7490..b9dd808 100644
--- a/java/src/main/java/com/google/crypto/tink/signature/RsaSsaPssVerifyKeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/signature/RsaSsaPssVerifyKeyManager.java
@@ -16,9 +16,8 @@
 
 package com.google.crypto.tink.signature;
 
-import com.google.crypto.tink.KeyManagerBase;
+import com.google.crypto.tink.KeyTypeManager;
 import com.google.crypto.tink.PublicKeyVerify;
-import com.google.crypto.tink.proto.Empty;
 import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.proto.RsaSsaPssParams;
 import com.google.crypto.tink.proto.RsaSsaPssPublicKey;
@@ -29,7 +28,6 @@
 import com.google.protobuf.InvalidProtocolBufferException;
 import java.math.BigInteger;
 import java.security.GeneralSecurityException;
-import java.security.KeyFactory;
 import java.security.interfaces.RSAPublicKey;
 import java.security.spec.RSAPublicKeySpec;
 
@@ -37,65 +35,53 @@
  * This key manager produces new instances of {@code RsaSsaPssVerifyJce}. It doesn't support key
  * generation.
  */
-class RsaSsaPssVerifyKeyManager extends KeyManagerBase<PublicKeyVerify, RsaSsaPssPublicKey, Empty> {
+class RsaSsaPssVerifyKeyManager extends KeyTypeManager<RsaSsaPssPublicKey> {
   public RsaSsaPssVerifyKeyManager() {
-    super(PublicKeyVerify.class, RsaSsaPssPublicKey.class, Empty.class, TYPE_URL);
-  }
-
-  public static final String TYPE_URL = "type.googleapis.com/google.crypto.tink.RsaSsaPssPublicKey";
-
-  private static final int VERSION = 0;
-
-  @Override
-  public PublicKeyVerify getPrimitiveFromKey(RsaSsaPssPublicKey keyProto)
-      throws GeneralSecurityException {
-    KeyFactory kf = EngineFactory.KEY_FACTORY.getInstance("RSA");
-    BigInteger modulus = new BigInteger(1, keyProto.getN().toByteArray());
-    BigInteger exponent = new BigInteger(1, keyProto.getE().toByteArray());
-    RSAPublicKey publicKey =
-        (RSAPublicKey) kf.generatePublic(new RSAPublicKeySpec(modulus, exponent));
-    RsaSsaPssParams params = keyProto.getParams();
-    return new RsaSsaPssVerifyJce(
-        publicKey,
-        SigUtil.toHashType(params.getSigHash()),
-        SigUtil.toHashType(params.getMgf1Hash()),
-        params.getSaltLength());
+    super(
+        RsaSsaPssPublicKey.class,
+        new PrimitiveFactory<PublicKeyVerify, RsaSsaPssPublicKey>(PublicKeyVerify.class) {
+          @Override
+          public PublicKeyVerify getPrimitive(RsaSsaPssPublicKey keyProto)
+              throws GeneralSecurityException {
+            java.security.KeyFactory kf = EngineFactory.KEY_FACTORY.getInstance("RSA");
+            BigInteger modulus = new BigInteger(1, keyProto.getN().toByteArray());
+            BigInteger exponent = new BigInteger(1, keyProto.getE().toByteArray());
+            RSAPublicKey publicKey =
+                (RSAPublicKey) kf.generatePublic(new RSAPublicKeySpec(modulus, exponent));
+            RsaSsaPssParams params = keyProto.getParams();
+            return new RsaSsaPssVerifyJce(
+                publicKey,
+                SigUtil.toHashType(params.getSigHash()),
+                SigUtil.toHashType(params.getMgf1Hash()),
+                params.getSaltLength());
+          }
+        });
   }
 
   @Override
-  protected RsaSsaPssPublicKey newKeyFromFormat(Empty unused) throws GeneralSecurityException {
-    throw new GeneralSecurityException("Not implemented");
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.RsaSsaPssPublicKey";
   }
 
   @Override
   public int getVersion() {
-    return VERSION;
+    return 0;
   }
 
   @Override
-  protected KeyMaterialType keyMaterialType() {
+  public KeyMaterialType keyMaterialType() {
     return KeyMaterialType.ASYMMETRIC_PUBLIC;
   }
 
   @Override
-  protected RsaSsaPssPublicKey parseKeyProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
+  public RsaSsaPssPublicKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
     return RsaSsaPssPublicKey.parseFrom(byteString);
   }
 
   @Override
-  protected Empty parseKeyFormatProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return Empty.parseFrom(byteString);
-  }
-
-  @Override
-  protected void validateKey(RsaSsaPssPublicKey pubKey) throws GeneralSecurityException {
-    Validators.validateVersion(pubKey.getVersion(), VERSION);
+  public void validateKey(RsaSsaPssPublicKey pubKey) throws GeneralSecurityException {
+    Validators.validateVersion(pubKey.getVersion(), getVersion());
     Validators.validateRsaModulusSize(new BigInteger(1, pubKey.getN().toByteArray()).bitLength());
     SigUtil.validateRsaSsaPssParams(pubKey.getParams());
   }
-
-  @Override
-  protected void validateKeyFormat(Empty unused) throws GeneralSecurityException {}
 }
diff --git a/java/src/main/java/com/google/crypto/tink/signature/SigUtil.java b/java/src/main/java/com/google/crypto/tink/signature/SigUtil.java
index 1223bb7..3500417 100644
--- a/java/src/main/java/com/google/crypto/tink/signature/SigUtil.java
+++ b/java/src/main/java/com/google/crypto/tink/signature/SigUtil.java
@@ -24,7 +24,6 @@
 import com.google.crypto.tink.proto.RsaSsaPssParams;
 import com.google.crypto.tink.subtle.EllipticCurves;
 import com.google.crypto.tink.subtle.Enums;
-import com.google.crypto.tink.subtle.Validators;
 import java.security.GeneralSecurityException;
 
 final class SigUtil {
@@ -50,14 +49,17 @@
     switch (curve) {
       case NIST_P256:
         // Using SHA512 for curve P256 is fine. However, only the 256 leftmost bits of the hash is
-        // used in signature computation. Therefore, we don't allow it here to prevent security's
+        // used in signature computation. Therefore, we don't allow it here to prevent security
         // illusion.
         if (hash != HashType.SHA256) {
           throw new GeneralSecurityException(INVALID_PARAMS);
         }
         break;
       case NIST_P384:
-        /* fall through */
+        if (hash != HashType.SHA384 && hash != HashType.SHA512) {
+          throw new GeneralSecurityException(INVALID_PARAMS);
+        }
+        break;
       case NIST_P521:
         if (hash != HashType.SHA512) {
           throw new GeneralSecurityException(INVALID_PARAMS);
@@ -77,7 +79,7 @@
    */
   public static void validateRsaSsaPkcs1Params(RsaSsaPkcs1Params params)
       throws GeneralSecurityException {
-    Validators.validateSignatureHash(toHashType(params.getHashType()));
+    toHashType(params.getHashType());
   }
 
   /**
@@ -102,7 +104,7 @@
    */
   public static void validateRsaSsaPssParams(RsaSsaPssParams params)
       throws GeneralSecurityException {
-    Validators.validateSignatureHash(toHashType(params.getSigHash()));
+    toHashType(params.getSigHash());
     if (params.getSigHash() != params.getMgf1Hash()) {
       throw new GeneralSecurityException("MGF1 hash is different from signature hash");
     }
@@ -111,15 +113,16 @@
   /** Converts protobuf enum {@code HashType} to raw Java enum {@code Enums.HashType}. */
   public static Enums.HashType toHashType(HashType hash) throws GeneralSecurityException {
     switch (hash) {
-      case SHA1:
-        return Enums.HashType.SHA1;
       case SHA256:
         return Enums.HashType.SHA256;
+      case SHA384:
+        return Enums.HashType.SHA384;
       case SHA512:
         return Enums.HashType.SHA512;
       default:
-        throw new GeneralSecurityException("unknown hash type: " + hash);
+        break;
     }
+    throw new GeneralSecurityException("unsupported hash type: " + hash.name());
   }
 
   /** Converts protobuf enum {@code EllipticCurveType} to raw Java enum {code CurveType}. */
diff --git a/java/src/main/java/com/google/crypto/tink/signature/SignatureConfig.java b/java/src/main/java/com/google/crypto/tink/signature/SignatureConfig.java
index c4ee94f..206e15a 100644
--- a/java/src/main/java/com/google/crypto/tink/signature/SignatureConfig.java
+++ b/java/src/main/java/com/google/crypto/tink/signature/SignatureConfig.java
@@ -16,7 +16,6 @@
 
 package com.google.crypto.tink.signature;
 
-import com.google.crypto.tink.Config;
 import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.proto.RegistryConfig;
 import java.security.GeneralSecurityException;
@@ -39,84 +38,25 @@
  * @since 1.0.0
  */
 public final class SignatureConfig {
-  public static final String ECDSA_PUBLIC_KEY_TYPE_URL = EcdsaVerifyKeyManager.TYPE_URL;
-  public static final String ECDSA_PRIVATE_KEY_TYPE_URL = EcdsaSignKeyManager.TYPE_URL;
-  public static final String ED25519_PUBLIC_KEY_TYPE_URL = Ed25519PublicKeyManager.TYPE_URL;
-  public static final String ED25519_PRIVATE_KEY_TYPE_URL = Ed25519PrivateKeyManager.TYPE_URL;
-  private static final String PUBLIC_KEY_SIGN_CATALOGUE_NAME = "TinkPublicKeySign";
-  private static final String PUBLIC_KEY_VERIFY_CATALOGUE_NAME = "TinkPublicKeyVerify";
+  public static final String ECDSA_PUBLIC_KEY_TYPE_URL = new EcdsaVerifyKeyManager().getKeyType();
+  public static final String ECDSA_PRIVATE_KEY_TYPE_URL = new EcdsaSignKeyManager().getKeyType();
+  public static final String ED25519_PUBLIC_KEY_TYPE_URL =
+      new Ed25519PublicKeyManager().getKeyType();
+  public static final String ED25519_PRIVATE_KEY_TYPE_URL =
+      new Ed25519PrivateKeyManager().getKeyType();
 
   /** @deprecated */
   @Deprecated
-  public static final RegistryConfig TINK_1_0_0 =
-      RegistryConfig.newBuilder()
-          .setConfigName("TINK_SIGNATURE_1_0_0")
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  PUBLIC_KEY_SIGN_CATALOGUE_NAME, "PublicKeySign", "EcdsaPrivateKey", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  PUBLIC_KEY_SIGN_CATALOGUE_NAME, "PublicKeySign", "Ed25519PrivateKey", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  PUBLIC_KEY_VERIFY_CATALOGUE_NAME, "PublicKeyVerify", "EcdsaPublicKey", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  PUBLIC_KEY_VERIFY_CATALOGUE_NAME, "PublicKeyVerify", "Ed25519PublicKey", 0, true))
-          .build();
-
+  public static final RegistryConfig TINK_1_0_0 = RegistryConfig.getDefaultInstance();
   /**
    * @deprecated
    * @since 1.1.0
    */
   @Deprecated
-  public static final RegistryConfig TINK_1_1_0 =
-      RegistryConfig.newBuilder()
-          .mergeFrom(TINK_1_0_0)
-          .setConfigName("TINK_SIGNATURE_1_1_0")
-          .build();
+  public static final RegistryConfig TINK_1_1_0 = RegistryConfig.getDefaultInstance();
 
   /** @since 1.2.0 */
-  public static final RegistryConfig LATEST =
-      RegistryConfig.newBuilder()
-          .setConfigName("TINK_SIGNATURE")
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  PUBLIC_KEY_SIGN_CATALOGUE_NAME, "PublicKeySign", "EcdsaPrivateKey", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  PUBLIC_KEY_SIGN_CATALOGUE_NAME, "PublicKeySign", "Ed25519PrivateKey", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  PUBLIC_KEY_SIGN_CATALOGUE_NAME,
-                  "PublicKeySign",
-                  "RsaSsaPkcs1PrivateKey",
-                  0,
-                  true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  PUBLIC_KEY_SIGN_CATALOGUE_NAME, "PublicKeySign", "RsaSsaPssPrivateKey", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  PUBLIC_KEY_VERIFY_CATALOGUE_NAME, "PublicKeyVerify", "EcdsaPublicKey", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  PUBLIC_KEY_VERIFY_CATALOGUE_NAME, "PublicKeyVerify", "Ed25519PublicKey", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  PUBLIC_KEY_VERIFY_CATALOGUE_NAME,
-                  "PublicKeyVerify",
-                  "RsaSsaPkcs1PublicKey",
-                  0,
-                  true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  PUBLIC_KEY_VERIFY_CATALOGUE_NAME,
-                  "PublicKeyVerify",
-                  "RsaSsaPssPublicKey",
-                  0,
-                  true))
-          .build();
+  public static final RegistryConfig LATEST = RegistryConfig.getDefaultInstance();
 
   static {
     try {
@@ -146,8 +86,12 @@
    * @since 1.2.0
    */
   public static void register() throws GeneralSecurityException {
-    Registry.addCatalogue(PUBLIC_KEY_SIGN_CATALOGUE_NAME, new PublicKeySignCatalogue());
-    Registry.addCatalogue(PUBLIC_KEY_VERIFY_CATALOGUE_NAME, new PublicKeyVerifyCatalogue());
-    Config.register(LATEST);
+    EcdsaSignKeyManager.registerPair(/*newKeyAllowed=*/ true);
+    Ed25519PrivateKeyManager.registerPair(/*newKeyAllowed=*/ true);
+    RsaSsaPkcs1SignKeyManager.registerPair(/*newKeyAllowed=*/ true);
+    RsaSsaPssSignKeyManager.registerPair(/*newKeyAllowed=*/ true);
+
+    PublicKeySignWrapper.register();
+    PublicKeyVerifyWrapper.register();
   }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/signature/SignatureKeyTemplates.java b/java/src/main/java/com/google/crypto/tink/signature/SignatureKeyTemplates.java
index fc015c7..a634bc9 100644
--- a/java/src/main/java/com/google/crypto/tink/signature/SignatureKeyTemplates.java
+++ b/java/src/main/java/com/google/crypto/tink/signature/SignatureKeyTemplates.java
@@ -42,7 +42,8 @@
  * <pre>{@code
  * Config.register(SignatureConfig.TINK_1_1_0);
  * KeysetHandle handle = KeysetHandle.generateNew(SignatureKeyTemplates.ECDSA_P256);
- * PublicKeySign signer = PublicKeySignFactory.getPrimitive(handle);
+ * PublicKeySign signer = handle.getPrimitive(PublicKeySign.class);
+ * PublicKeyVerify verifier = handle.getPublicKeyset().getPrimitive(PublicKeyVerify.class);
  * }</pre>
  *
  * @since 1.0.0
@@ -140,7 +141,7 @@
    */
   public static final KeyTemplate ED25519 =
       KeyTemplate.newBuilder()
-          .setTypeUrl(Ed25519PrivateKeyManager.TYPE_URL)
+          .setTypeUrl(new Ed25519PrivateKeyManager().getKeyType())
           .setOutputPrefixType(OutputPrefixType.TINK)
           .build();
 
@@ -159,7 +160,7 @@
     EcdsaKeyFormat format = EcdsaKeyFormat.newBuilder().setParams(params).build();
     return KeyTemplate.newBuilder()
         .setValue(format.toByteString())
-        .setTypeUrl(EcdsaSignKeyManager.TYPE_URL)
+        .setTypeUrl(new EcdsaSignKeyManager().getKeyType())
         .setOutputPrefixType(OutputPrefixType.TINK)
         .build();
   }
@@ -205,7 +206,7 @@
             .build();
     return KeyTemplate.newBuilder()
         .setValue(format.toByteString())
-        .setTypeUrl(RsaSsaPkcs1SignKeyManager.TYPE_URL)
+        .setTypeUrl(new RsaSsaPkcs1SignKeyManager().getKeyType())
         .setOutputPrefixType(OutputPrefixType.TINK)
         .build();
   }
@@ -266,7 +267,7 @@
             .build();
     return KeyTemplate.newBuilder()
         .setValue(format.toByteString())
-        .setTypeUrl(RsaSsaPssSignKeyManager.TYPE_URL)
+        .setTypeUrl(new RsaSsaPssSignKeyManager().getKeyType())
         .setOutputPrefixType(OutputPrefixType.TINK)
         .build();
   }
diff --git a/java/src/main/java/com/google/crypto/tink/signature/SignaturePemKeysetReader.java b/java/src/main/java/com/google/crypto/tink/signature/SignaturePemKeysetReader.java
new file mode 100644
index 0000000..fb6a4fd
--- /dev/null
+++ b/java/src/main/java/com/google/crypto/tink/signature/SignaturePemKeysetReader.java
@@ -0,0 +1,262 @@
+// Copyright 2017 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.google.crypto.tink.signature;
+
+import com.google.crypto.tink.KeysetReader;
+import com.google.crypto.tink.proto.EcdsaParams;
+import com.google.crypto.tink.proto.EcdsaPublicKey;
+import com.google.crypto.tink.proto.EcdsaSignatureEncoding;
+import com.google.crypto.tink.proto.EllipticCurveType;
+import com.google.crypto.tink.proto.EncryptedKeyset;
+import com.google.crypto.tink.proto.HashType;
+import com.google.crypto.tink.proto.KeyData;
+import com.google.crypto.tink.proto.KeyStatusType;
+import com.google.crypto.tink.proto.Keyset;
+import com.google.crypto.tink.proto.OutputPrefixType;
+import com.google.crypto.tink.proto.RsaSsaPkcs1Params;
+import com.google.crypto.tink.proto.RsaSsaPkcs1PublicKey;
+import com.google.crypto.tink.proto.RsaSsaPssParams;
+import com.google.crypto.tink.proto.RsaSsaPssPublicKey;
+import com.google.crypto.tink.subtle.PemKeyType;
+import com.google.crypto.tink.subtle.Random;
+import com.google.protobuf.ByteString;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+import java.security.Key;
+import java.security.interfaces.ECPublicKey;
+import java.security.interfaces.RSAPublicKey;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * SignaturePemKeysetReader is a {@link KeysetReader} that can read digital signature keys in PEM
+ * format (RFC 7468).
+ *
+ * <h3>Usage</h3>
+ *
+ * <pre>{@code
+ * import com.google.crypto.tink.subtle.PemKeyType;
+ *
+ * String pem = ...;
+ * PemKeyType type = ...;
+ * KeysetReader reader = SignaturePemKeysetReader.newBuilder().addPem(pem, type).build();
+ * }</pre>
+ */
+public final class SignaturePemKeysetReader implements KeysetReader {
+  private List<PemKey> pemKeys;
+
+  SignaturePemKeysetReader(List<PemKey> pemKeys) {
+    this.pemKeys = pemKeys;
+  }
+
+  /** @return a {@link Builder} for {@link SignaturePemKeysetReader}. */
+  public static Builder newBuilder() {
+    return new Builder();
+  }
+
+  /** Builder for SignaturePemKeysetReader */
+  public static final class Builder {
+    private List<PemKey> pemKeys = new ArrayList<PemKey>();
+
+    Builder() {}
+
+    public KeysetReader build() {
+      return new SignaturePemKeysetReader(pemKeys);
+    }
+
+    /**
+     * Adds a PEM.
+     *
+     * <p>A single PEM can contain multiple keys, but all must have the same {@code keyType}.
+     * Invalid or unparsable keys are ignored.
+     *
+     * <p>The first key in the first added PEM is the primary key.
+     */
+    public Builder addPem(String pem, PemKeyType keyType) {
+      PemKey pemKey = new PemKey();
+      pemKey.reader = new BufferedReader(new StringReader(pem));
+      pemKey.type = keyType;
+      pemKeys.add(pemKey);
+      return this;
+    }
+  }
+
+  private static final class PemKey {
+    BufferedReader reader;
+    PemKeyType type;
+  }
+
+  @Override
+  public Keyset read() throws IOException {
+    Keyset.Builder keyset = Keyset.newBuilder();
+    for (PemKey pemKey : pemKeys) {
+      for (Keyset.Key key = readKey(pemKey.reader, pemKey.type);
+          key != null;
+          key = readKey(pemKey.reader, pemKey.type)) {
+        keyset.addKey(key);
+      }
+    }
+
+    if (keyset.getKeyCount() == 0) {
+      throw new IOException("cannot find any key");
+    }
+    // Use the first key as the primary key id.
+    keyset.setPrimaryKeyId(keyset.getKey(0).getKeyId());
+    return keyset.build();
+  }
+
+  @Override
+  public EncryptedKeyset readEncrypted() throws IOException {
+    throw new UnsupportedOperationException();
+  }
+
+  /** Reads a single PEM key from {@code reader}. Invalid or unparsable PEM would be ignored */
+  private static Keyset.Key readKey(BufferedReader reader, PemKeyType pemKeyType)
+      throws IOException {
+    Key key = pemKeyType.readKey(reader);
+    if (key == null) {
+      return null;
+    }
+
+    KeyData keyData;
+    if (key instanceof RSAPublicKey) {
+      keyData = convertRsaPublicKey(pemKeyType, (RSAPublicKey) key);
+    } else if (key instanceof ECPublicKey) {
+      keyData = convertEcPublicKey(pemKeyType, (ECPublicKey) key);
+    } else {
+      // TODO(thaidn): support RSA and EC private keys.
+      return null;
+    }
+
+    return Keyset.Key.newBuilder()
+        .setKeyData(keyData)
+        .setStatus(KeyStatusType.ENABLED)
+        .setOutputPrefixType(OutputPrefixType.RAW) // PEM keys don't add any prefix to signatures
+        .setKeyId(Random.randInt())
+        .build();
+  }
+
+  private static KeyData convertRsaPublicKey(PemKeyType pemKeyType, RSAPublicKey key)
+      throws IOException {
+    if (pemKeyType.algorithm.equals("RSASSA-PKCS1-v1_5")) {
+      RsaSsaPkcs1Params params =
+          RsaSsaPkcs1Params.newBuilder().setHashType(getHashType(pemKeyType)).build();
+      RsaSsaPkcs1PublicKey pkcs1PubKey =
+          RsaSsaPkcs1PublicKey.newBuilder()
+              .setVersion(new RsaSsaPkcs1VerifyKeyManager().getVersion())
+              .setParams(params)
+              .setE(ByteString.copyFrom(key.getPublicExponent().toByteArray()))
+              .setN(ByteString.copyFrom(key.getModulus().toByteArray()))
+              .build();
+      return KeyData.newBuilder()
+          .setTypeUrl(new RsaSsaPkcs1VerifyKeyManager().getKeyType())
+          .setValue(pkcs1PubKey.toByteString())
+          .setKeyMaterialType(KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC)
+          .build();
+    } else if (pemKeyType.algorithm.equals("RSASSA-PSS")) {
+      RsaSsaPssParams params =
+          RsaSsaPssParams.newBuilder()
+              .setSigHash(getHashType(pemKeyType))
+              .setMgf1Hash(getHashType(pemKeyType))
+              .setSaltLength(getDigestSizeInBytes(pemKeyType))
+              .build();
+      RsaSsaPssPublicKey pssPubKey =
+          RsaSsaPssPublicKey.newBuilder()
+              .setVersion(new RsaSsaPssVerifyKeyManager().getVersion())
+              .setParams(params)
+              .setE(ByteString.copyFrom(key.getPublicExponent().toByteArray()))
+              .setN(ByteString.copyFrom(key.getModulus().toByteArray()))
+              .build();
+      return KeyData.newBuilder()
+          .setTypeUrl(new RsaSsaPssVerifyKeyManager().getKeyType())
+          .setValue(pssPubKey.toByteString())
+          .setKeyMaterialType(KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC)
+          .build();
+    }
+    throw new IOException("unsupported RSA signature algorithm: " + pemKeyType.algorithm);
+  }
+
+  private static KeyData convertEcPublicKey(PemKeyType pemKeyType, ECPublicKey key)
+      throws IOException {
+    if (pemKeyType.algorithm.equals("ECDSA")) {
+      EcdsaParams params =
+          EcdsaParams.newBuilder()
+              .setHashType(getHashType(pemKeyType))
+              .setCurve(getCurveType(pemKeyType))
+              .setEncoding(EcdsaSignatureEncoding.DER)
+              .build();
+      EcdsaPublicKey ecdsaPubKey =
+          EcdsaPublicKey.newBuilder()
+              .setVersion(new EcdsaVerifyKeyManager().getVersion())
+              .setParams(params)
+              .setX(ByteString.copyFrom(key.getW().getAffineX().toByteArray()))
+              .setY(ByteString.copyFrom(key.getW().getAffineY().toByteArray()))
+              .build();
+
+      return KeyData.newBuilder()
+          .setTypeUrl(new EcdsaVerifyKeyManager().getKeyType())
+          .setValue(ecdsaPubKey.toByteString())
+          .setKeyMaterialType(KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC)
+          .build();
+    }
+    throw new IOException("unsupported EC signature algorithm: " + pemKeyType.algorithm);
+  }
+
+  private static HashType getHashType(PemKeyType pemKeyType) {
+    switch (pemKeyType.hash) {
+      case SHA256:
+        return HashType.SHA256;
+      case SHA384:
+        return HashType.SHA384;
+      case SHA512:
+        return HashType.SHA512;
+      default:
+        break;
+    }
+    throw new IllegalArgumentException("unsupported hash type: " + pemKeyType.hash.name());
+  }
+
+  private static int getDigestSizeInBytes(PemKeyType pemKeyType) {
+    switch (pemKeyType.hash) {
+      case SHA256:
+        return 32;
+      case SHA384:
+        return 48;
+      case SHA512:
+        return 64;
+      default:
+        break;
+    }
+    throw new IllegalArgumentException("unsupported hash type: " + pemKeyType.hash.name());
+  }
+
+  private static EllipticCurveType getCurveType(PemKeyType pemKeyType) {
+    switch (pemKeyType.keySizeInBits) {
+      case 256:
+        return EllipticCurveType.NIST_P256;
+      case 384:
+        return EllipticCurveType.NIST_P384;
+      case 521:
+        return EllipticCurveType.NIST_P521;
+      default:
+        break;
+    }
+    throw new IllegalArgumentException(
+        "unsupported curve for key size: " + pemKeyType.keySizeInBits);
+  }
+}
diff --git a/java/src/main/java/com/google/crypto/tink/streamingaead/AesCtrHmacStreamingKeyManager.java b/java/src/main/java/com/google/crypto/tink/streamingaead/AesCtrHmacStreamingKeyManager.java
index 329f6c7..a8aaeee 100644
--- a/java/src/main/java/com/google/crypto/tink/streamingaead/AesCtrHmacStreamingKeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/streamingaead/AesCtrHmacStreamingKeyManager.java
@@ -16,7 +16,8 @@
 
 package com.google.crypto.tink.streamingaead;
 
-import com.google.crypto.tink.KeyManagerBase;
+import com.google.crypto.tink.KeyTypeManager;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.StreamingAead;
 import com.google.crypto.tink.proto.AesCtrHmacStreamingKey;
 import com.google.crypto.tink.proto.AesCtrHmacStreamingKeyFormat;
@@ -35,79 +36,49 @@
  * This key manager generates new {@code AesCtrHmacStreamingKey} keys and produces new instances of
  * {@code AesCtrHmacStreaming}.
  */
-class AesCtrHmacStreamingKeyManager
-    extends KeyManagerBase<StreamingAead, AesCtrHmacStreamingKey, AesCtrHmacStreamingKeyFormat> {
-  public AesCtrHmacStreamingKeyManager() {
+public class AesCtrHmacStreamingKeyManager extends KeyTypeManager<AesCtrHmacStreamingKey> {
+  AesCtrHmacStreamingKeyManager() {
     super(
-        StreamingAead.class,
         AesCtrHmacStreamingKey.class,
-        AesCtrHmacStreamingKeyFormat.class,
-        TYPE_URL);
+        new PrimitiveFactory<StreamingAead, AesCtrHmacStreamingKey>(StreamingAead.class) {
+          @Override
+          public StreamingAead getPrimitive(AesCtrHmacStreamingKey key)
+              throws GeneralSecurityException {
+            return new AesCtrHmacStreaming(
+                key.getKeyValue().toByteArray(),
+                StreamingAeadUtil.toHmacAlgo(key.getParams().getHkdfHashType()),
+                key.getParams().getDerivedKeySize(),
+                StreamingAeadUtil.toHmacAlgo(key.getParams().getHmacParams().getHash()),
+                key.getParams().getHmacParams().getTagSize(),
+                key.getParams().getCiphertextSegmentSize(),
+                /* firstSegmentOffset= */ 0);
+          }
+        });
   }
 
-  private static final int VERSION = 0;
-
-  public static final String TYPE_URL =
-      "type.googleapis.com/google.crypto.tink.AesCtrHmacStreamingKey";
-
   /** Minimum tag size in bytes. This provides minimum 80-bit security strength. */
   private static final int MIN_TAG_SIZE_IN_BYTES = 10;
 
-  /** @param serializedKey serialized {@code AesCtrHmacStreamingKey} proto */
-  @Override
-  public StreamingAead getPrimitiveFromKey(AesCtrHmacStreamingKey keyProto)
-      throws GeneralSecurityException {
-    return new AesCtrHmacStreaming(
-        keyProto.getKeyValue().toByteArray(),
-        StreamingAeadUtil.toHmacAlgo(
-            keyProto.getParams().getHkdfHashType()),
-        keyProto.getParams().getDerivedKeySize(),
-        StreamingAeadUtil.toHmacAlgo(
-            keyProto.getParams().getHmacParams().getHash()),
-        keyProto.getParams().getHmacParams().getTagSize(),
-        keyProto.getParams().getCiphertextSegmentSize(),
-        /* firstSegmentOffset= */ 0);
-  }
+  private static final int NONCE_PREFIX_IN_BYTES = 7;
 
-  /**
-   * @param serializedKeyFormat serialized {@code AesCtrHmacStreamingKeyFormat} proto
-   * @return new {@code AesCtrHmacStreamingKey} proto
-   */
   @Override
-  public AesCtrHmacStreamingKey newKeyFromFormat(AesCtrHmacStreamingKeyFormat format)
-      throws GeneralSecurityException {
-    return AesCtrHmacStreamingKey.newBuilder()
-        .setKeyValue(ByteString.copyFrom(Random.randBytes(format.getKeySize())))
-        .setParams(format.getParams())
-        .setVersion(VERSION)
-        .build();
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.AesCtrHmacStreamingKey";
   }
 
   @Override
   public int getVersion() {
-    return VERSION;
+    return 0;
   }
 
   @Override
-  protected KeyMaterialType keyMaterialType() {
+  public KeyMaterialType keyMaterialType() {
     return KeyMaterialType.SYMMETRIC;
   }
 
   @Override
-  protected AesCtrHmacStreamingKey parseKeyProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return AesCtrHmacStreamingKey.parseFrom(byteString);
-  }
-
-  @Override
-  protected AesCtrHmacStreamingKeyFormat parseKeyFormatProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return AesCtrHmacStreamingKeyFormat.parseFrom(byteString);
-  }
-
-  @Override
-  protected void validateKey(AesCtrHmacStreamingKey key) throws GeneralSecurityException {
-    Validators.validateVersion(key.getVersion(), VERSION);
+  public void validateKey(AesCtrHmacStreamingKey key) throws GeneralSecurityException {
+    Validators.validateVersion(key.getVersion(), getVersion());
     if (key.getKeyValue().size() < 16) {
       throw new GeneralSecurityException("key_value must have at least 16 bytes");
     }
@@ -115,19 +86,48 @@
       throw new GeneralSecurityException(
           "key_value must have at least as many bits as derived keys");
     }
-    validate(key.getParams());
+    validateParams(key.getParams());
   }
 
   @Override
-  protected void validateKeyFormat(AesCtrHmacStreamingKeyFormat format)
-      throws GeneralSecurityException {
-    if (format.getKeySize() < 16) {
-      throw new GeneralSecurityException("key_size must be at least 16 bytes");
-    }
-    validate(format.getParams());
+  public AesCtrHmacStreamingKey parseKey(ByteString byteString)
+      throws InvalidProtocolBufferException {
+    return AesCtrHmacStreamingKey.parseFrom(byteString);
   }
 
-  private void validate(AesCtrHmacStreamingParams params) throws GeneralSecurityException {
+  @Override
+  public KeyFactory<AesCtrHmacStreamingKeyFormat, AesCtrHmacStreamingKey> keyFactory() {
+    return new KeyFactory<AesCtrHmacStreamingKeyFormat, AesCtrHmacStreamingKey>(
+        AesCtrHmacStreamingKeyFormat.class) {
+      @Override
+      public void validateKeyFormat(AesCtrHmacStreamingKeyFormat format)
+          throws GeneralSecurityException {
+        if (format.getKeySize() < 16) {
+          throw new GeneralSecurityException("key_size must be at least 16 bytes");
+        }
+        validateParams(format.getParams());
+      }
+
+      @Override
+      public AesCtrHmacStreamingKeyFormat parseKeyFormat(ByteString byteString)
+          throws InvalidProtocolBufferException {
+        return AesCtrHmacStreamingKeyFormat.parseFrom(byteString);
+      }
+
+      @Override
+      public AesCtrHmacStreamingKey createKey(AesCtrHmacStreamingKeyFormat format)
+          throws GeneralSecurityException {
+        return AesCtrHmacStreamingKey.newBuilder()
+            .setKeyValue(ByteString.copyFrom(Random.randBytes(format.getKeySize())))
+            .setParams(format.getParams())
+            .setVersion(getVersion())
+            .build();
+      }
+    };
+  }
+
+  private static void validateParams(AesCtrHmacStreamingParams params)
+      throws GeneralSecurityException {
     Validators.validateAesKeySize(params.getDerivedKeySize());
     if (params.getHkdfHashType() == HashType.UNKNOWN_HASH) {
       throw new GeneralSecurityException("unknown HKDF hash type");
@@ -138,13 +138,17 @@
     validateHmacParams(params.getHmacParams());
 
     if (params.getCiphertextSegmentSize()
-        < params.getDerivedKeySize() + params.getHmacParams().getTagSize() + 8) {
+        < params.getDerivedKeySize()
+            + params.getHmacParams().getTagSize()
+            + 2
+            + NONCE_PREFIX_IN_BYTES) {
       throw new GeneralSecurityException(
-          "ciphertext_segment_size must be at least (derived_key_size + tag_size + 8)");
+          "ciphertext_segment_size must be at least (derived_key_size + tag_size + "
+              + "NONCE_PREFIX_IN_BYTES + 2)");
     }
   }
 
-  private void validateHmacParams(HmacParams params) throws GeneralSecurityException {
+  private static void validateHmacParams(HmacParams params) throws GeneralSecurityException {
     if (params.getTagSize() < MIN_TAG_SIZE_IN_BYTES) {
       throw new GeneralSecurityException("tag size too small");
     }
@@ -168,4 +172,8 @@
         throw new GeneralSecurityException("unknown hash type");
     }
   }
+
+  public static void register(boolean newKeyAllowed) throws GeneralSecurityException {
+    Registry.registerKeyManager(new AesCtrHmacStreamingKeyManager(), newKeyAllowed);
+  }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/streamingaead/AesGcmHkdfStreamingKeyManager.java b/java/src/main/java/com/google/crypto/tink/streamingaead/AesGcmHkdfStreamingKeyManager.java
index bfad923..7c15647 100644
--- a/java/src/main/java/com/google/crypto/tink/streamingaead/AesGcmHkdfStreamingKeyManager.java
+++ b/java/src/main/java/com/google/crypto/tink/streamingaead/AesGcmHkdfStreamingKeyManager.java
@@ -16,7 +16,8 @@
 
 package com.google.crypto.tink.streamingaead;
 
-import com.google.crypto.tink.KeyManagerBase;
+import com.google.crypto.tink.KeyTypeManager;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.StreamingAead;
 import com.google.crypto.tink.proto.AesGcmHkdfStreamingKey;
 import com.google.crypto.tink.proto.AesGcmHkdfStreamingKeyFormat;
@@ -34,93 +35,100 @@
  * This key manager generates new {@code AesGcmHkdfStreamingKey} keys and produces new instances of
  * {@code AesGcmHkdfStreaming}.
  */
-class AesGcmHkdfStreamingKeyManager
-    extends KeyManagerBase<StreamingAead, AesGcmHkdfStreamingKey, AesGcmHkdfStreamingKeyFormat> {
-  public AesGcmHkdfStreamingKeyManager() {
+public class AesGcmHkdfStreamingKeyManager extends KeyTypeManager<AesGcmHkdfStreamingKey> {
+  AesGcmHkdfStreamingKeyManager() {
     super(
-        StreamingAead.class,
         AesGcmHkdfStreamingKey.class,
-        AesGcmHkdfStreamingKeyFormat.class,
-        TYPE_URL);
+        new PrimitiveFactory<StreamingAead, AesGcmHkdfStreamingKey>(StreamingAead.class) {
+          @Override
+          public StreamingAead getPrimitive(AesGcmHkdfStreamingKey key)
+              throws GeneralSecurityException {
+            return new AesGcmHkdfStreaming(
+                key.getKeyValue().toByteArray(),
+                StreamingAeadUtil.toHmacAlgo(key.getParams().getHkdfHashType()),
+                key.getParams().getDerivedKeySize(),
+                key.getParams().getCiphertextSegmentSize(),
+                /* firstSegmentOffset= */ 0);
+          }
+        });
   }
 
-  private static final int VERSION = 0;
+  private static final int NONCE_PREFIX_IN_BYTES = 7;
+  private static final int TAG_SIZE_IN_BYTES = 16;
 
-  public static final String TYPE_URL =
-      "type.googleapis.com/google.crypto.tink.AesGcmHkdfStreamingKey";
-
-  /** @param serializedKey serialized {@code AesGcmHkdfStreamingKey} proto */
   @Override
-  public StreamingAead getPrimitiveFromKey(AesGcmHkdfStreamingKey keyProto)
-      throws GeneralSecurityException {
-    return new AesGcmHkdfStreaming(
-        keyProto.getKeyValue().toByteArray(),
-        StreamingAeadUtil.toHmacAlgo(
-            keyProto.getParams().getHkdfHashType()),
-        keyProto.getParams().getDerivedKeySize(),
-        keyProto.getParams().getCiphertextSegmentSize(),
-        /* firstSegmentOffset= */ 0);
-  }
-
-  /**
-   * @param serializedKeyFormat serialized {@code AesGcmHkdfStreamingKeyFormat} proto
-   * @return new {@code AesGcmHkdfStreamingKey} proto
-   */
-  @Override
-  public AesGcmHkdfStreamingKey newKeyFromFormat(AesGcmHkdfStreamingKeyFormat format)
-      throws GeneralSecurityException {
-    return AesGcmHkdfStreamingKey.newBuilder()
-        .setKeyValue(ByteString.copyFrom(Random.randBytes(format.getKeySize())))
-        .setParams(format.getParams())
-        .setVersion(VERSION)
-        .build();
+  public String getKeyType() {
+    return "type.googleapis.com/google.crypto.tink.AesGcmHkdfStreamingKey";
   }
 
   @Override
   public int getVersion() {
-    return VERSION;
+    return 0;
   }
 
   @Override
-  protected KeyMaterialType keyMaterialType() {
+  public KeyMaterialType keyMaterialType() {
     return KeyMaterialType.SYMMETRIC;
   }
 
   @Override
-  protected AesGcmHkdfStreamingKey parseKeyProto(ByteString byteString)
+  public void validateKey(AesGcmHkdfStreamingKey key) throws GeneralSecurityException {
+    Validators.validateVersion(key.getVersion(), getVersion());
+    validateParams(key.getParams());
+  }
+
+  @Override
+  public AesGcmHkdfStreamingKey parseKey(ByteString byteString)
       throws InvalidProtocolBufferException {
     return AesGcmHkdfStreamingKey.parseFrom(byteString);
   }
 
   @Override
-  protected AesGcmHkdfStreamingKeyFormat parseKeyFormatProto(ByteString byteString)
-      throws InvalidProtocolBufferException {
-    return AesGcmHkdfStreamingKeyFormat.parseFrom(byteString);
+  public KeyFactory<AesGcmHkdfStreamingKeyFormat, AesGcmHkdfStreamingKey> keyFactory() {
+    return new KeyFactory<AesGcmHkdfStreamingKeyFormat, AesGcmHkdfStreamingKey>(
+        AesGcmHkdfStreamingKeyFormat.class) {
+      @Override
+      public void validateKeyFormat(AesGcmHkdfStreamingKeyFormat format)
+          throws GeneralSecurityException {
+        if (format.getKeySize() < 16) {
+          throw new GeneralSecurityException("key_size must be at least 16 bytes");
+        }
+        validateParams(format.getParams());
+      }
+
+      @Override
+      public AesGcmHkdfStreamingKeyFormat parseKeyFormat(ByteString byteString)
+          throws InvalidProtocolBufferException {
+        return AesGcmHkdfStreamingKeyFormat.parseFrom(byteString);
+      }
+
+      @Override
+      public AesGcmHkdfStreamingKey createKey(AesGcmHkdfStreamingKeyFormat format)
+          throws GeneralSecurityException {
+        return AesGcmHkdfStreamingKey.newBuilder()
+            .setKeyValue(ByteString.copyFrom(Random.randBytes(format.getKeySize())))
+            .setParams(format.getParams())
+            .setVersion(getVersion())
+            .build();
+      }
+    };
   }
 
-  @Override
-  protected void validateKey(AesGcmHkdfStreamingKey key) throws GeneralSecurityException {
-    Validators.validateVersion(key.getVersion(), VERSION);
-    validate(key.getParams());
-  }
-
-  @Override
-  protected void validateKeyFormat(AesGcmHkdfStreamingKeyFormat format)
+  private static void validateParams(AesGcmHkdfStreamingParams params)
       throws GeneralSecurityException {
-    if (format.getKeySize() < 16) {
-      throw new GeneralSecurityException("key_size must be at least 16 bytes");
-    }
-    validate(format.getParams());
-  }
-
-  private void validate(AesGcmHkdfStreamingParams params) throws GeneralSecurityException {
     Validators.validateAesKeySize(params.getDerivedKeySize());
     if (params.getHkdfHashType() == HashType.UNKNOWN_HASH) {
       throw new GeneralSecurityException("unknown HKDF hash type");
     }
-    if (params.getCiphertextSegmentSize() < params.getDerivedKeySize() + 8) {
+    if (params.getCiphertextSegmentSize()
+        < params.getDerivedKeySize() + NONCE_PREFIX_IN_BYTES + TAG_SIZE_IN_BYTES + 2) {
       throw new GeneralSecurityException(
-          "ciphertext_segment_size must be at least (derived_key_size + 8)");
+          "ciphertext_segment_size must be at least (derived_key_size + NONCE_PREFIX_IN_BYTES + "
+              + "TAG_SIZE_IN_BYTES + 2)");
     }
   }
+
+  public static void register(boolean newKeyAllowed) throws GeneralSecurityException {
+    Registry.registerKeyManager(new AesGcmHkdfStreamingKeyManager(), newKeyAllowed);
+  }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/streamingaead/BUILD.bazel b/java/src/main/java/com/google/crypto/tink/streamingaead/BUILD.bazel
index 454c184..3394dbf 100644
--- a/java/src/main/java/com/google/crypto/tink/streamingaead/BUILD.bazel
+++ b/java/src/main/java/com/google/crypto/tink/streamingaead/BUILD.bazel
@@ -1,4 +1,4 @@
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
@@ -35,6 +35,7 @@
     name = "streamingaead",
     srcs = [":srcs"],
     javacopts = JAVACOPTS_OSS,
+    visibility = ["//visibility:public"],
     deps = full_protos + [
         "//java/src/main/java/com/google/crypto/tink",
         "//java/src/main/java/com/google/crypto/tink/subtle",
@@ -48,6 +49,7 @@
     name = "android",
     srcs = [":srcs"],
     javacopts = JAVACOPTS_OSS,
+    visibility = ["//visibility:public"],
     deps = lite_protos + [
         "//java/src/main/java/com/google/crypto/tink:android",
         "//java/src/main/java/com/google/crypto/tink/subtle",
diff --git a/java/src/main/java/com/google/crypto/tink/streamingaead/InputStreamDecrypter.java b/java/src/main/java/com/google/crypto/tink/streamingaead/InputStreamDecrypter.java
index 48c8707..b898924 100644
--- a/java/src/main/java/com/google/crypto/tink/streamingaead/InputStreamDecrypter.java
+++ b/java/src/main/java/com/google/crypto/tink/streamingaead/InputStreamDecrypter.java
@@ -143,12 +143,7 @@
         throw new IOException("No matching key found for the ciphertext in the stream.");
       }
       attemptedMatching = true;
-      List<PrimitiveSet.Entry<StreamingAead>> entries;
-      try {
-        entries = primitives.getRawPrimitives();
-      } catch (GeneralSecurityException e) {
-        throw new IOException("Keyset failure: ", e);
-      }
+      List<PrimitiveSet.Entry<StreamingAead>> entries = primitives.getRawPrimitives();
       for (PrimitiveSet.Entry<StreamingAead> entry : entries) {
         try {
           InputStream attemptedStream =
diff --git a/java/src/main/java/com/google/crypto/tink/streamingaead/ReadableByteChannelDecrypter.java b/java/src/main/java/com/google/crypto/tink/streamingaead/ReadableByteChannelDecrypter.java
index 4f07a35..26047c1 100644
--- a/java/src/main/java/com/google/crypto/tink/streamingaead/ReadableByteChannelDecrypter.java
+++ b/java/src/main/java/com/google/crypto/tink/streamingaead/ReadableByteChannelDecrypter.java
@@ -77,12 +77,7 @@
         throw new IOException("No matching key found for the ciphertext in the stream.");
       }
       attemptedMatching = true;
-      List<PrimitiveSet.Entry<StreamingAead>> entries;
-      try {
-        entries = primitives.getRawPrimitives();
-      } catch (GeneralSecurityException e) {
-        throw new IOException("Keyset failure: ", e);
-      }
+      List<PrimitiveSet.Entry<StreamingAead>> entries = primitives.getRawPrimitives();
       for (PrimitiveSet.Entry<StreamingAead> entry : entries) {
         try {
           ReadableByteChannel attemptedChannel =
diff --git a/java/src/main/java/com/google/crypto/tink/streamingaead/SeekableByteChannelDecrypter.java b/java/src/main/java/com/google/crypto/tink/streamingaead/SeekableByteChannelDecrypter.java
index acbfb01..c953f72 100644
--- a/java/src/main/java/com/google/crypto/tink/streamingaead/SeekableByteChannelDecrypter.java
+++ b/java/src/main/java/com/google/crypto/tink/streamingaead/SeekableByteChannelDecrypter.java
@@ -79,12 +79,7 @@
         throw new IOException("No matching key found for the ciphertext in the stream.");
       }
       attemptedMatching = true;
-      List<PrimitiveSet.Entry<StreamingAead>> entries;
-      try {
-        entries = primitives.getRawPrimitives();
-      } catch (GeneralSecurityException e) {
-        throw new IOException("Keyset failure: ", e);
-      }
+      List<PrimitiveSet.Entry<StreamingAead>> entries = primitives.getRawPrimitives();
       for (PrimitiveSet.Entry<StreamingAead> entry : entries) {
         try {
           SeekableByteChannel attemptedChannel =
diff --git a/java/src/main/java/com/google/crypto/tink/streamingaead/StreamingAeadCatalogue.java b/java/src/main/java/com/google/crypto/tink/streamingaead/StreamingAeadCatalogue.java
deleted file mode 100644
index d8b1b54..0000000
--- a/java/src/main/java/com/google/crypto/tink/streamingaead/StreamingAeadCatalogue.java
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package com.google.crypto.tink.streamingaead;
-
-import com.google.crypto.tink.Catalogue;
-import com.google.crypto.tink.KeyManager;
-import com.google.crypto.tink.PrimitiveWrapper;
-import com.google.crypto.tink.StreamingAead;
-import java.security.GeneralSecurityException;
-
-/** A catalogue of {@link StreamingAead} key managers. */
-class StreamingAeadCatalogue implements Catalogue<StreamingAead> {
-  public StreamingAeadCatalogue() {}
-
-  /**
-   * @return a KeyManager for the given {@code typeUrl}, {@code primitiveName} and version at least
-   *     {@code minVersion} (if it exists in the catalogue).
-   */
-  @Override
-  public KeyManager<StreamingAead> getKeyManager(
-      String typeUrl, String primitiveName, int minVersion) throws GeneralSecurityException {
-    KeyManager<StreamingAead> keyManager;
-    switch (primitiveName.toLowerCase()) {
-      case "streamingaead":
-        keyManager = streamingAeadKeyManager(typeUrl);
-        break;
-      default:
-        throw new GeneralSecurityException(
-            String.format("No support for primitive '%s'.", primitiveName));
-    }
-    if (keyManager.getVersion() < minVersion) {
-      throw new GeneralSecurityException(
-          String.format(
-              "No key manager for key type '%s' with version at least %d.", typeUrl, minVersion));
-    }
-    return keyManager;
-  }
-
-  private KeyManager<StreamingAead> streamingAeadKeyManager(String typeUrl)
-      throws GeneralSecurityException {
-    switch (typeUrl) {
-      case AesCtrHmacStreamingKeyManager.TYPE_URL:
-        return new AesCtrHmacStreamingKeyManager();
-      case AesGcmHkdfStreamingKeyManager.TYPE_URL:
-        return new AesGcmHkdfStreamingKeyManager();
-      default:
-        throw new GeneralSecurityException(
-            String.format("No support for primitive 'StreamingAead' with key type '%s'.", typeUrl));
-    }
-  }
-
-  @Override
-  public PrimitiveWrapper<StreamingAead> getPrimitiveWrapper() {
-    return new StreamingAeadWrapper();
-  }
-}
diff --git a/java/src/main/java/com/google/crypto/tink/streamingaead/StreamingAeadConfig.java b/java/src/main/java/com/google/crypto/tink/streamingaead/StreamingAeadConfig.java
index b3cc0fc..7994922 100644
--- a/java/src/main/java/com/google/crypto/tink/streamingaead/StreamingAeadConfig.java
+++ b/java/src/main/java/com/google/crypto/tink/streamingaead/StreamingAeadConfig.java
@@ -16,7 +16,6 @@
 
 package com.google.crypto.tink.streamingaead;
 
-import com.google.crypto.tink.Config;
 import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.proto.RegistryConfig;
 import java.security.GeneralSecurityException;
@@ -38,37 +37,16 @@
  */
 public final class StreamingAeadConfig {
   public static final String AES_CTR_HMAC_STREAMINGAEAD_TYPE_URL =
-      AesCtrHmacStreamingKeyManager.TYPE_URL;
+      new AesCtrHmacStreamingKeyManager().getKeyType();
   public static final String AES_GCM_HKDF_STREAMINGAEAD_TYPE_URL =
-      AesGcmHkdfStreamingKeyManager.TYPE_URL;
-
-  private static final String CATALOGUE_NAME = "TinkStreamingAead";
-  private static final String PRIMITIVE_NAME = "StreamingAead";
+      new AesGcmHkdfStreamingKeyManager().getKeyType();
 
   /** @deprecated */
   @Deprecated
-  public static final RegistryConfig TINK_1_1_0 =
-      RegistryConfig.newBuilder()
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  CATALOGUE_NAME, PRIMITIVE_NAME, "AesCtrHmacStreamingKey", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  CATALOGUE_NAME, PRIMITIVE_NAME, "AesGcmHkdfStreamingKey", 0, true))
-          .setConfigName("TINK_STREAMINGAEAD_1_1_0")
-          .build();
+  public static final RegistryConfig TINK_1_1_0 = RegistryConfig.getDefaultInstance();
 
   /** @since 1.2.0 */
-  public static final RegistryConfig LATEST =
-      RegistryConfig.newBuilder()
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  CATALOGUE_NAME, PRIMITIVE_NAME, "AesCtrHmacStreamingKey", 0, true))
-          .addEntry(
-              Config.getTinkKeyTypeEntry(
-                  CATALOGUE_NAME, PRIMITIVE_NAME, "AesGcmHkdfStreamingKey", 0, true))
-          .setConfigName("TINK_STREAMINGAEAD")
-          .build();
+  public static final RegistryConfig LATEST = RegistryConfig.getDefaultInstance();
 
   static {
     try {
@@ -96,7 +74,8 @@
    * @since 1.2.0
    */
   public static void register() throws GeneralSecurityException {
-    Registry.addCatalogue(CATALOGUE_NAME, new StreamingAeadCatalogue());
-    Config.register(LATEST);
+    AesCtrHmacStreamingKeyManager.register(/* newKeyAllowed = */ true);
+    AesGcmHkdfStreamingKeyManager.register(/* newKeyAllowed = */ true);
+    StreamingAeadWrapper.register();
   }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/streamingaead/StreamingAeadKeyTemplates.java b/java/src/main/java/com/google/crypto/tink/streamingaead/StreamingAeadKeyTemplates.java
index 2fd14cc..5541ca4 100644
--- a/java/src/main/java/com/google/crypto/tink/streamingaead/StreamingAeadKeyTemplates.java
+++ b/java/src/main/java/com/google/crypto/tink/streamingaead/StreamingAeadKeyTemplates.java
@@ -129,7 +129,7 @@
         .build();
     return KeyTemplate.newBuilder()
         .setValue(format.toByteString())
-        .setTypeUrl(AesCtrHmacStreamingKeyManager.TYPE_URL)
+        .setTypeUrl(new AesCtrHmacStreamingKeyManager().getKeyType())
         .setOutputPrefixType(OutputPrefixType.RAW)
         .build();
   }
@@ -153,7 +153,7 @@
             .build();
     return KeyTemplate.newBuilder()
         .setValue(format.toByteString())
-        .setTypeUrl(AesGcmHkdfStreamingKeyManager.TYPE_URL)
+        .setTypeUrl(new AesGcmHkdfStreamingKeyManager().getKeyType())
         .setOutputPrefixType(OutputPrefixType.RAW)
         .build();
   }
diff --git a/java/src/main/java/com/google/crypto/tink/streamingaead/StreamingAeadWrapper.java b/java/src/main/java/com/google/crypto/tink/streamingaead/StreamingAeadWrapper.java
index cc65086..c619ad5 100644
--- a/java/src/main/java/com/google/crypto/tink/streamingaead/StreamingAeadWrapper.java
+++ b/java/src/main/java/com/google/crypto/tink/streamingaead/StreamingAeadWrapper.java
@@ -18,6 +18,7 @@
 
 import com.google.crypto.tink.PrimitiveSet;
 import com.google.crypto.tink.PrimitiveWrapper;
+import com.google.crypto.tink.Registry;
 import com.google.crypto.tink.StreamingAead;
 import java.security.GeneralSecurityException;
 
@@ -29,7 +30,9 @@
  * keyset to select the right key for decryption. All keys in a keyset of StreamingAead have type
  * {@link com.google.crypto.tink.proto.OutputPrefixType#RAW}.
  */
-public final class StreamingAeadWrapper implements PrimitiveWrapper<StreamingAead> {
+public class StreamingAeadWrapper implements PrimitiveWrapper<StreamingAead> {
+  StreamingAeadWrapper() {}
+
   /**
    * @return a StreamingAead primitive from a {@code keysetHandle}.
    * @throws GeneralSecurityException
@@ -44,4 +47,8 @@
   public Class<StreamingAead> getPrimitiveClass() {
     return StreamingAead.class;
   }
+
+  public static void register() throws GeneralSecurityException {
+    Registry.registerPrimitiveWrapper(new StreamingAeadWrapper());
+  }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/AesCmac.java b/java/src/main/java/com/google/crypto/tink/subtle/AesCmac.java
index f34de39..45af89e 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/AesCmac.java
+++ b/java/src/main/java/com/google/crypto/tink/subtle/AesCmac.java
@@ -17,7 +17,6 @@
 package com.google.crypto.tink.subtle;
 
 import com.google.crypto.tink.Mac;
-import com.google.crypto.tink.annotations.Alpha;
 import java.security.GeneralSecurityException;
 import java.security.InvalidAlgorithmParameterException;
 import java.util.Arrays;
@@ -27,14 +26,7 @@
 
 /**
  * An implementation of CMAC following <a href="https://tools.ietf.org/html/rfc4493">RFC 4493</a>.
- *
- * <h3>Warning</h3>
- *
- * <p>Do not use this API or any other APIs including fields and methods marked with the @Alpha
- * annotation. They can be modified in any way, or even removed, at any time. They are in the
- * package, but not for official, production release, but only for testing.
  */
-@Alpha
 public final class AesCmac implements Mac {
   static final int MIN_TAG_SIZE_IN_BYTES = 10;
 
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/AesCtrHmacStreaming.java b/java/src/main/java/com/google/crypto/tink/subtle/AesCtrHmacStreaming.java
index b14d308..75c4355 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/AesCtrHmacStreaming.java
+++ b/java/src/main/java/com/google/crypto/tink/subtle/AesCtrHmacStreaming.java
@@ -29,10 +29,10 @@
 /**
  * Streaming encryption using AES-CTR and HMAC.
  *
- * <p>Each ciphertext uses a new AES-CTR key and HMAC key that ared derived from the key derivation
+ * <p>Each ciphertext uses a new AES-CTR key and HMAC key that are derived from the key derivation
  * key, a randomly chosen salt of the same size as the key and a nonce prefix using HKDF.
  *
- * <p>The the format of a ciphertext is header || segment_0 || segment_1 || ... || segment_k. The
+ * <p>The format of a ciphertext is header || segment_0 || segment_1 || ... || segment_k. The
  * header has size this.getHeaderLength(). Its format is headerLength || salt || prefix. where
  * headerLength is 1 byte determining the size of the header, salt is a salt used in the key
  * derivation and prefix is the prefix of the nonce. In principle headerLength is redundant
@@ -193,7 +193,7 @@
   }
 
   /**
-   * Returns the expected size of the ciphertext for a given plaintext The returned value includes
+   * Returns the expected size of the ciphertext for a given plaintext. The returned value includes
    * the header and offset.
    */
   public long expectedCiphertextSize(long plaintextSize) {
@@ -219,11 +219,12 @@
     return Random.randBytes(keySizeInBytes);
   }
 
-  private byte[] nonceForSegment(byte[] prefix, int segmentNr, boolean last) {
+  private byte[] nonceForSegment(byte[] prefix, long segmentNr, boolean last)
+      throws GeneralSecurityException {
     ByteBuffer nonce = ByteBuffer.allocate(NONCE_SIZE_IN_BYTES);
     nonce.order(ByteOrder.BIG_ENDIAN);
     nonce.put(prefix);
-    nonce.putInt(segmentNr);
+    SubtleUtil.putAsUnsigedInt(nonce, segmentNr);
     nonce.put((byte) (last ? 1 : 0));
     nonce.putInt(0);
     return nonce.array();
@@ -259,7 +260,7 @@
     private final Mac mac;
     private final byte[] noncePrefix;
     private ByteBuffer header;
-    private int encryptedSegments = 0;
+    private long encryptedSegments = 0;
 
     public AesCtrHmacStreamEncrypter(byte[] aad) throws GeneralSecurityException {
       cipher = cipherInstance();
@@ -328,12 +329,6 @@
       byte[] tag = mac.doFinal();
       ciphertext.put(tag, 0, tagSizeInBytes);
     }
-
-    @Override
-    // TODO(b/74250492): So far this is unused.
-    public synchronized int getEncryptedSegments() {
-      return encryptedSegments;
-    }
   }
 
   /** An instance of a crypter used to decrypt a ciphertext stream. */
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/AesGcmHkdfStreaming.java b/java/src/main/java/com/google/crypto/tink/subtle/AesGcmHkdfStreaming.java
index 5ebbc61..59eda8a 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/AesGcmHkdfStreaming.java
+++ b/java/src/main/java/com/google/crypto/tink/subtle/AesGcmHkdfStreaming.java
@@ -31,7 +31,7 @@
  * <p>Each ciphertext uses a new AES-GCM key that is derived from the key derivation key, a randomly
  * chosen salt of the same size as the key and a nonce prefix.
  *
- * <p>The the format of a ciphertext is header || segment_0 || segment_1 || ... || segment_k. The
+ * <p>The format of a ciphertext is header || segment_0 || segment_1 || ... || segment_k. The
  * header has size this.getHeaderLength(). Its format is headerLength || salt || prefix. where
  * headerLength is 1 byte determining the size of the header, salt is a salt used in the key
  * derivation and prefix is the prefix of the nonce. In principle headerLength is redundant
@@ -151,7 +151,7 @@
   }
 
   /**
-   * Returns the expected size of the ciphertext for a given plaintext The returned value includes
+   * Returns the expected size of the ciphertext for a given plaintext. The returned value includes
    * the header and offset.
    */
   public long expectedCiphertextSize(long plaintextSize) {
@@ -251,13 +251,14 @@
           keySpec,
           paramsForSegment(noncePrefix, encryptedSegments, isLastSegment));
       encryptedSegments++;
-      cipher.update(part1, ciphertext);
-      cipher.doFinal(part2, ciphertext);
-    }
-
-    @Override
-    public synchronized int getEncryptedSegments() {
-      return encryptedSegments;
+      // `update(nonEmpty)`, `doFinal(empty)` is known to cause problems on Android 23.
+      // See https://github.com/google/tink/issues/229
+      if (part2.hasRemaining()) {
+        cipher.update(part1, ciphertext);
+        cipher.doFinal(part2, ciphertext);
+      } else {
+        cipher.doFinal(part1, ciphertext);
+      }
     }
   }
 
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/AesGcmJce.java b/java/src/main/java/com/google/crypto/tink/subtle/AesGcmJce.java
index 16b5b77..5aaeafc 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/AesGcmJce.java
+++ b/java/src/main/java/com/google/crypto/tink/subtle/AesGcmJce.java
@@ -31,6 +31,17 @@
  * @since 1.0.0
  */
 public final class AesGcmJce implements Aead {
+  private static final ThreadLocal<Cipher> localCipher =
+      new ThreadLocal<Cipher>() {
+        @Override
+        protected Cipher initialValue() {
+          try {
+            return EngineFactory.CIPHER.getInstance("AES/GCM/NoPadding");
+          } catch (GeneralSecurityException ex) {
+            throw new IllegalStateException(ex);
+          }
+        }
+      };
 
   // All instances of this class use a 12 byte IV and a 16 byte tag.
   private static final int IV_SIZE_IN_BYTES = 12;
@@ -43,10 +54,6 @@
     keySpec = new SecretKeySpec(key, "AES");
   }
 
-  private static Cipher instance() throws GeneralSecurityException {
-    return EngineFactory.CIPHER.getInstance("AES/GCM/NoPadding");
-  }
-
   @Override
   /**
    * On Android KitKat (API level 19) this method does not support non null or non empty {@code
@@ -62,13 +69,13 @@
     byte[] iv = Random.randBytes(IV_SIZE_IN_BYTES);
     System.arraycopy(iv, 0, ciphertext, 0, IV_SIZE_IN_BYTES);
 
-    Cipher cipher = instance();
     AlgorithmParameterSpec params = getParams(iv);
-    cipher.init(Cipher.ENCRYPT_MODE, keySpec, params);
+    localCipher.get().init(Cipher.ENCRYPT_MODE, keySpec, params);
     if (associatedData != null && associatedData.length != 0) {
-      cipher.updateAAD(associatedData);
+      localCipher.get().updateAAD(associatedData);
     }
-    int written = cipher.doFinal(plaintext, 0, plaintext.length, ciphertext, IV_SIZE_IN_BYTES);
+    int written =
+        localCipher.get().doFinal(plaintext, 0, plaintext.length, ciphertext, IV_SIZE_IN_BYTES);
     // For security reasons, AES-GCM encryption must always use tag of TAG_SIZE_IN_BYTES bytes. If
     // so, written must be equal to plaintext.length + TAG_SIZE_IN_BYTES.
 
@@ -95,12 +102,13 @@
     }
 
     AlgorithmParameterSpec params = getParams(ciphertext, 0, IV_SIZE_IN_BYTES);
-    Cipher cipher = instance();
-    cipher.init(Cipher.DECRYPT_MODE, keySpec, params);
+    localCipher.get().init(Cipher.DECRYPT_MODE, keySpec, params);
     if (associatedData != null && associatedData.length != 0) {
-      cipher.updateAAD(associatedData);
+      localCipher.get().updateAAD(associatedData);
     }
-    return cipher.doFinal(ciphertext, IV_SIZE_IN_BYTES, ciphertext.length - IV_SIZE_IN_BYTES);
+    return localCipher
+        .get()
+        .doFinal(ciphertext, IV_SIZE_IN_BYTES, ciphertext.length - IV_SIZE_IN_BYTES);
   }
 
   private static AlgorithmParameterSpec getParams(final byte[] iv) throws GeneralSecurityException {
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/BUILD.bazel b/java/src/main/java/com/google/crypto/tink/subtle/BUILD.bazel
index 90a76e0..66fe670 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/BUILD.bazel
+++ b/java/src/main/java/com/google/crypto/tink/subtle/BUILD.bazel
@@ -1,4 +1,4 @@
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
@@ -26,6 +26,7 @@
         "Enums.java",
         "Hex.java",
         "ImmutableByteArray.java",
+        "PemKeyType.java",
         "Random.java",
         "SubtleUtil.java",
         "Validators.java",
@@ -87,6 +88,7 @@
     javacopts = JAVACOPTS_OSS,
     deps = [
         ":subtle",
+        "@com_google_errorprone_error_prone_annotations",
         "//java/src/main/java/com/google/crypto/tink:primitives",
         "//java/src/main/java/com/google/crypto/tink/annotations",
     ],
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/Ed25519.java b/java/src/main/java/com/google/crypto/tink/subtle/Ed25519.java
index 0cf1530..cbc7d46 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/Ed25519.java
+++ b/java/src/main/java/com/google/crypto/tink/subtle/Ed25519.java
@@ -145,6 +145,9 @@
       Field25519.mult(rhs, rhs, D);
       // rhs = z^4 + D * x^2 * y^2
       Field25519.sum(rhs, z4);
+      // Field25519.mult reduces its output, but Field25519.sum does not, so we have to manually
+      // reduce it here.
+      Field25519.reduce(rhs, rhs);
       // z^2 (y^2 - x^2) == z^4 + D * x^2 * y^2
       return Bytes.equal(Field25519.contract(lhs), Field25519.contract(rhs));
     }
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/EllipticCurves.java b/java/src/main/java/com/google/crypto/tink/subtle/EllipticCurves.java
index 52b17ca..56857b9 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/EllipticCurves.java
+++ b/java/src/main/java/com/google/crypto/tink/subtle/EllipticCurves.java
@@ -132,10 +132,10 @@
       throw new GeneralSecurityException("point is at infinity");
     }
     // Check 0 <= x < p and 0 <= y < p.
-    if (x.signum() == -1 || x.compareTo(p) != -1) {
+    if (x.signum() == -1 || x.compareTo(p) >= 0) {
       throw new GeneralSecurityException("x is out of range");
     }
-    if (y.signum() == -1 || y.compareTo(p) != -1) {
+    if (y.signum() == -1 || y.compareTo(p) >= 0) {
       throw new GeneralSecurityException("y is out of range");
     }
     // Check y^2 == x^3 + a x + b (mod p)
@@ -164,6 +164,21 @@
     checkPointOnCurve(key.getW(), key.getParams().getCurve());
   }
 
+  /** Returns whether {@code spec} is a {@link ECParameterSpec} of one of the NIST curves. */
+  public static boolean isNistEcParameterSpec(ECParameterSpec spec) {
+    return isSameEcParameterSpec(spec, getNistP256Params())
+        || isSameEcParameterSpec(spec, getNistP384Params())
+        || isSameEcParameterSpec(spec, getNistP521Params());
+  }
+
+  /** Returns whether {@code one} is the same {@link ECParameterSpec} as {@code two}. */
+  public static boolean isSameEcParameterSpec(ECParameterSpec one, ECParameterSpec two) {
+    return one.getCurve().equals(two.getCurve())
+        && one.getGenerator().equals(two.getGenerator())
+        && one.getOrder().equals(two.getOrder())
+        && one.getCofactor() == two.getCofactor();
+  }
+
   /**
    * Checks that the public key's params is the same as the private key's params, and the public key
    * is a valid point on the private key's curve.
@@ -182,10 +197,7 @@
     try {
       ECParameterSpec publicKeySpec = publicKey.getParams();
       ECParameterSpec privateKeySpec = privateKey.getParams();
-      if (!publicKeySpec.getCurve().equals(privateKeySpec.getCurve())
-          || !publicKeySpec.getGenerator().equals(privateKeySpec.getGenerator())
-          || !publicKeySpec.getOrder().equals(privateKeySpec.getOrder())
-          || publicKeySpec.getCofactor() != privateKeySpec.getCofactor()) {
+      if (!isSameEcParameterSpec(publicKeySpec, privateKeySpec)) {
         throw new GeneralSecurityException("invalid public key spec");
       }
     } catch (IllegalArgumentException | NullPointerException ex) {
@@ -216,7 +228,7 @@
    * @param curve must be a prime order elliptic curve
    * @return the size of an element in bits
    */
-  private static int fieldSizeInBits(EllipticCurve curve) throws GeneralSecurityException {
+  static int fieldSizeInBits(EllipticCurve curve) throws GeneralSecurityException {
     return getModulus(curve).subtract(BigInteger.ONE).bitLength();
   }
 
@@ -717,7 +729,7 @@
             throw new GeneralSecurityException("invalid format");
           }
           BigInteger x = new BigInteger(1, Arrays.copyOfRange(encoded, 1, encoded.length));
-          if (x.signum() == -1 || x.compareTo(p) != -1) {
+          if (x.signum() == -1 || x.compareTo(p) >= 0) {
             throw new GeneralSecurityException("x is out of range");
           }
           BigInteger y = getY(x, lsb, curve);
@@ -911,7 +923,7 @@
       throws GeneralSecurityException {
     EllipticCurve privateKeyCurve = privateKey.getParams().getCurve();
     BigInteger x = new BigInteger(1, secret);
-    if (x.signum() == -1 || x.compareTo(getModulus(privateKeyCurve)) != -1) {
+    if (x.signum() == -1 || x.compareTo(getModulus(privateKeyCurve)) >= 0) {
       throw new GeneralSecurityException("shared secret is out of range");
     }
     // This will throw if x is not a valid coordinate.
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/EngineFactory.java b/java/src/main/java/com/google/crypto/tink/subtle/EngineFactory.java
index 5b2a4fb..a88b0a2 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/EngineFactory.java
+++ b/java/src/main/java/com/google/crypto/tink/subtle/EngineFactory.java
@@ -155,28 +155,23 @@
   }
 
   public T_ENGINE getInstance(String algorithm) throws GeneralSecurityException {
-    for (Provider p : this.policy) {
-      if (tryProvider(algorithm, p)) {
-        return this.instanceBuilder.getInstance(algorithm, p);
+    Exception cause = null;
+    for (Provider provider : this.policy) {
+      try {
+        return this.instanceBuilder.getInstance(algorithm, provider);
+      } catch (Exception e) {
+        if (cause == null) {
+          cause = e;
+        }
       }
     }
     if (letFallback) {
       return this.instanceBuilder.getInstance(algorithm, null);
     }
-    throw new GeneralSecurityException("No good Provider found.");
+    throw new GeneralSecurityException("No good Provider found.", cause);
   }
 
   private T_WRAPPER instanceBuilder;
   private List<Provider> policy;
   private boolean letFallback;
-
-  private boolean tryProvider(String algorithm, Provider provider) {
-    try {
-      this.instanceBuilder.getInstance(algorithm, provider);
-      return true;
-    } catch (Exception e) { // Don't care which one specifically.
-      e.printStackTrace();
-      return false;
-    }
-  }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/Enums.java b/java/src/main/java/com/google/crypto/tink/subtle/Enums.java
index 803b519..e66db60 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/Enums.java
+++ b/java/src/main/java/com/google/crypto/tink/subtle/Enums.java
@@ -22,6 +22,7 @@
   public enum HashType {
     SHA1, // Using SHA1 for digital signature is deprecated but HMAC-SHA1 is fine.
     SHA256,
+    SHA384,
     SHA512,
   };
 }
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/Field25519.java b/java/src/main/java/com/google/crypto/tink/subtle/Field25519.java
index 1795008..5a24d60 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/Field25519.java
+++ b/java/src/main/java/com/google/crypto/tink/subtle/Field25519.java
@@ -213,6 +213,27 @@
   }
 
   /**
+   * Reduce a field element by calling reduceSizeByModularReduction and reduceCoefficients.
+   *
+   * @param input An input array of any length. If the array has 19 elements, it will be used as
+   * temporary buffer and its contents changed.
+   * @param output An output array of size LIMB_CNT. After the call |output[i]| < 2^26 will hold.
+   *
+   */
+  static void reduce(long[] input, long[] output) {
+    long[] tmp;
+    if (input.length == 19) {
+      tmp = input;
+    } else {
+      tmp = new long[19];
+      System.arraycopy(input, 0, tmp, 0, input.length);
+    }
+    reduceSizeByModularReduction(tmp);
+    reduceCoefficients(tmp);
+    System.arraycopy(tmp, 0, output, 0, LIMB_CNT);
+  }
+
+  /**
    * Reduce a long form to a reduced-size form by taking the input mod 2^255 - 19.
    *
    * On entry: |output[i]| < 14*2^54
@@ -306,11 +327,8 @@
   static void mult(long[] output, long[] in, long[] in2) {
     long[] t = new long[19];
     product(t, in, in2);
-    // |t[i]| < 14*2^54
-    reduceSizeByModularReduction(t);
-    reduceCoefficients(t);
     // |t[i]| < 2^26
-    System.arraycopy(t, 0, output, 0, LIMB_CNT);
+    reduce(t, output);
   }
 
   /**
@@ -363,10 +381,7 @@
     squareInner(t, in);
     // |t[i]| < 14*2^54 because the largest product of two limbs will be < 2^(27+27) and SquareInner
     // adds together, at most, 14 of those products.
-    reduceSizeByModularReduction(t);
-    reduceCoefficients(t);
-    // |t[i]| < 2^26
-    System.arraycopy(t, 0, output, 0, LIMB_CNT);
+    reduce(t, output);
   }
 
   /**
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/MacJce.java b/java/src/main/java/com/google/crypto/tink/subtle/MacJce.java
index 0403ab6..e842940 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/MacJce.java
+++ b/java/src/main/java/com/google/crypto/tink/subtle/MacJce.java
@@ -17,6 +17,7 @@
 package com.google.crypto.tink.subtle;
 
 import com.google.crypto.tink.Mac;
+import com.google.errorprone.annotations.Immutable;
 import java.security.GeneralSecurityException;
 import java.security.InvalidAlgorithmParameterException;
 import java.security.NoSuchAlgorithmException;
@@ -26,13 +27,17 @@
  *
  * @since 1.0.0
  */
+@Immutable
 public final class MacJce implements Mac {
   static final int MIN_TAG_SIZE_IN_BYTES = 10;
   static final int MIN_KEY_SIZE_IN_BYTES = 16;
 
-  private javax.crypto.Mac mac;
+  @SuppressWarnings("Immutable")  // We do not mutate the underlying mac.
+  private final javax.crypto.Mac mac;
+
   private final int digestSize;
   private final String algorithm;
+  @SuppressWarnings("Immutable")  // We do not mutate the key.
   private final java.security.Key key;
 
   public MacJce(String algorithm, java.security.Key key, int digestSize)
@@ -41,6 +46,10 @@
       throw new InvalidAlgorithmParameterException(
           "tag size too small, need at least " + MIN_TAG_SIZE_IN_BYTES + " bytes");
     }
+    if (key.getEncoded().length < MIN_KEY_SIZE_IN_BYTES) {
+      throw new InvalidAlgorithmParameterException(
+          "key size too small, need at least " + MIN_KEY_SIZE_IN_BYTES + " bytes");
+    }
     switch (algorithm) {
       case "HMACSHA1":
         if (digestSize > 20) {
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/PemKeyType.java b/java/src/main/java/com/google/crypto/tink/subtle/PemKeyType.java
new file mode 100644
index 0000000..0cd86e8
--- /dev/null
+++ b/java/src/main/java/com/google/crypto/tink/subtle/PemKeyType.java
@@ -0,0 +1,157 @@
+// Copyright 2017 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.google.crypto.tink.subtle;
+
+import com.google.crypto.tink.subtle.Enums.HashType;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.security.Key;
+import java.security.KeyFactory;
+import java.security.interfaces.ECKey;
+import java.security.interfaces.RSAKey;
+import java.security.spec.ECParameterSpec;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+
+/** PEM key types that Tink supports */
+public enum PemKeyType {
+  // RSASSA-PSS 2048 bit key with a SHA256 digest.
+  RSA_PSS_2048_SHA256("RSA", "RSASSA-PSS", 2048, HashType.SHA256),
+  // RSASSA-PSS 3072 bit key with a SHA256 digest.
+  RSA_PSS_3072_SHA256("RSA", "RSASSA-PSS", 3072, HashType.SHA256),
+  // RSASSA-PSS 4096 bit key with a SHA256 digest.
+  RSA_PSS_4096_SHA256("RSA", "RSASSA-PSS", 4096, HashType.SHA256),
+  // RSASSA-PSS 4096 bit key with a SHA512 digest.
+  RSA_PSS_4096_SHA512("RSA", "RSASSA-PSS", 4096, HashType.SHA512),
+
+  // RSASSA-PKCS1-v1_5 with a 2048 bit key and a SHA256 digest.
+  RSA_SIGN_PKCS1_2048_SHA256("RSA", "RSASSA-PKCS1-v1_5", 2048, HashType.SHA256),
+  // RSASSA-PKCS1-v1_5 with a 3072 bit key and a SHA256 digest.
+  RSA_SIGN_PKCS1_3072_SHA256("RSA", "RSASSA-PKCS1-v1_5", 3072, HashType.SHA256),
+  // RSASSA-PKCS1-v1_5 with a 4096 bit key and a SHA256 digest.
+  RSA_SIGN_PKCS1_4096_SHA256("RSA", "RSASSA-PKCS1-v1_5", 4096, HashType.SHA256),
+  // RSASSA-PKCS1-v1_5 with a 4096 bit key and a SHA512 digest.
+  RSA_SIGN_PKCS1_4096_SHA512("RSA", "RSASSA-PKCS1-v1_5", 4096, HashType.SHA512),
+
+  // ECDSA on the NIST P-256 curve with a SHA256 digest.
+  ECDSA_P256_SHA256("EC", "ECDSA", 256, HashType.SHA256),
+  // ECDSA on the NIST P-384 curve with a SHA384 digest.
+  ECDSA_P384_SHA384("EC", "ECDSA", 384, HashType.SHA384),
+  // ECDSA on the NIST P-521 curve with a SHA512 digest.
+  ECDSA_P521_SHA512("EC", "ECDSA", 521, HashType.SHA512);
+
+  public final String keyType;
+  public final String algorithm;
+  public final int keySizeInBits;
+  public final HashType hash;
+
+  PemKeyType(String keyType, String algorithm, int keySizeInBits, HashType hash) {
+    this.keyType = keyType;
+    this.algorithm = algorithm;
+    this.keySizeInBits = keySizeInBits;
+    this.hash = hash;
+  }
+
+  private static final String PUBLIC_KEY = "PUBLIC KEY";
+  private static final String PRIVATE_KEY = "PRIVATE KEY";
+  private static final String BEGIN = "-----BEGIN ";
+  private static final String END = "-----END ";
+  private static final String MARKER = "-----";
+
+  /**
+   * Reads a single key from {@code reader}.
+   *
+   * @return a {@link Key} or null if the reader doesn't contain a valid PEM.
+   */
+  public Key readKey(BufferedReader reader) throws IOException {
+    String line = reader.readLine();
+    while (line != null && !line.startsWith(BEGIN)) {
+      line = reader.readLine();
+    }
+    if (line == null) {
+      return null;
+    }
+
+    line = line.trim().substring(BEGIN.length());
+    int index = line.indexOf(MARKER);
+    if (index < 0) {
+      return null;
+    }
+    String type = line.substring(0, index);
+    String endMarker = END + type + MARKER;
+    StringBuilder base64key = new StringBuilder();
+
+    while ((line = reader.readLine()) != null) {
+      if (line.indexOf(":") > 0) {
+        // header, ignore
+        continue;
+      }
+      if (line.contains(endMarker)) {
+        break;
+      }
+      base64key.append(line);
+    }
+    try {
+      byte[] key = Base64.decode(base64key.toString(), Base64.DEFAULT);
+      if (type.contains(PUBLIC_KEY)) {
+        return getPublicKey(key);
+      } else if (type.contains(PRIVATE_KEY)) {
+        return getPrivateKey(key);
+      }
+    } catch (GeneralSecurityException | IllegalArgumentException ex) {
+      return null;
+    }
+    return null;
+  }
+
+  private Key getPublicKey(final byte[] key) throws GeneralSecurityException {
+    KeyFactory keyFactory = EngineFactory.KEY_FACTORY.getInstance(this.keyType);
+    return validate(keyFactory.generatePublic(new X509EncodedKeySpec(key)));
+  }
+
+  private Key getPrivateKey(final byte[] key) throws GeneralSecurityException {
+    KeyFactory keyFactory = EngineFactory.KEY_FACTORY.getInstance(this.keyType);
+    return validate(keyFactory.generatePrivate(new PKCS8EncodedKeySpec(key)));
+  }
+
+  private Key validate(Key key) throws GeneralSecurityException {
+    if (this.keyType.equals("RSA")) {
+      RSAKey rsaKey = (RSAKey) key;
+      int foundKeySizeInBits = rsaKey.getModulus().bitLength();
+      if (foundKeySizeInBits != this.keySizeInBits) {
+        throw new GeneralSecurityException(
+            String.format(
+                "invalid RSA key size, want %d got %d", this.keySizeInBits, foundKeySizeInBits));
+      }
+    } else {
+      ECKey ecKey = (ECKey) key;
+      ECParameterSpec ecParams = ecKey.getParams();
+      if (!EllipticCurves.isNistEcParameterSpec(ecParams)) {
+        throw new GeneralSecurityException("unsupport EC spec: " + ecParams.toString());
+      }
+
+      int foundKeySizeInBits = EllipticCurves.fieldSizeInBits(ecParams.getCurve());
+      if (foundKeySizeInBits != this.keySizeInBits) {
+        throw new GeneralSecurityException(
+            String.format(
+                "invalid EC key size, want %d got %d", this.keySizeInBits, foundKeySizeInBits));
+      }
+    }
+    return key;
+  }
+}
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/Random.java b/java/src/main/java/com/google/crypto/tink/subtle/Random.java
index 74ea4ec..94e7651 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/Random.java
+++ b/java/src/main/java/com/google/crypto/tink/subtle/Random.java
@@ -47,4 +47,8 @@
   public static final int randInt(int max) {
     return localRandom.get().nextInt(max);
   }
+
+  public static final int randInt() {
+    return localRandom.get().nextInt();
+  }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/StreamSegmentEncrypter.java b/java/src/main/java/com/google/crypto/tink/subtle/StreamSegmentEncrypter.java
index 8a78406..4df6ce6 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/StreamSegmentEncrypter.java
+++ b/java/src/main/java/com/google/crypto/tink/subtle/StreamSegmentEncrypter.java
@@ -62,7 +62,5 @@
         boolean isLastSegment,
         ByteBuffer ciphertext)
         throws GeneralSecurityException;
-
-  int getEncryptedSegments();
 }
 
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/StreamingAeadDecryptingChannel.java b/java/src/main/java/com/google/crypto/tink/subtle/StreamingAeadDecryptingChannel.java
index e1f3866..2ff77be 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/StreamingAeadDecryptingChannel.java
+++ b/java/src/main/java/com/google/crypto/tink/subtle/StreamingAeadDecryptingChannel.java
@@ -128,7 +128,7 @@
 
   /**
    * Tries to read the header of the ciphertext.
-   * @return true if the header has been fully read and false if not enogh bytes were available
+   * @return true if the header has been fully read and false if not enough bytes were available
    *          from the ciphertext stream.
    * @throws IOException when an exception occurs while reading the ciphertextStream or when
    *         the header is too short.
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/StreamingAeadDecryptingStream.java b/java/src/main/java/com/google/crypto/tink/subtle/StreamingAeadDecryptingStream.java
index b306c3b..483cc34 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/StreamingAeadDecryptingStream.java
+++ b/java/src/main/java/com/google/crypto/tink/subtle/StreamingAeadDecryptingStream.java
@@ -85,7 +85,6 @@
     super(ciphertextStream);
     decrypter = streamAead.newStreamSegmentDecrypter();
     headerLength = streamAead.getHeaderLength();
-    headerRead = false;
     aad = Arrays.copyOf(associatedData, associatedData.length);
     // ciphertextSegment is one byte longer than a ciphertext segment,
     // so that the code can decide if the current segment is the last segment in the
@@ -107,8 +106,8 @@
   /**
    * Tries to read the header of the ciphertext.
    *
-   * @return true if the header has been fully read and false if not enogh bytes were available from
-   *     the ciphertext stream.
+   * @return true if the header has been fully read and false if not enough bytes were available
+   *     from the ciphertext stream.
    * @throws IOException when an exception occurs while reading from @code{in} or when the header is
    *     too short.
    */
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/StreamingAeadSeekableDecryptingChannel.java b/java/src/main/java/com/google/crypto/tink/subtle/StreamingAeadSeekableDecryptingChannel.java
index 0563203..f891e8c 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/StreamingAeadSeekableDecryptingChannel.java
+++ b/java/src/main/java/com/google/crypto/tink/subtle/StreamingAeadSeekableDecryptingChannel.java
@@ -258,7 +258,7 @@
   /**
    * Atomic read from a given position.
    *
-   * This method works in the same way as read(ByteBuffer), except that is tart at the given
+   * This method works in the same way as read(ByteBuffer), except that it starts at the given
    * position and does not modify the channel's position.
    */
   public synchronized int read(ByteBuffer dst, long start) throws IOException {
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/SubtleUtil.java b/java/src/main/java/com/google/crypto/tink/subtle/SubtleUtil.java
index a56b6ac..cc8f8ab 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/SubtleUtil.java
+++ b/java/src/main/java/com/google/crypto/tink/subtle/SubtleUtil.java
@@ -18,6 +18,7 @@
 
 import com.google.crypto.tink.subtle.Enums.HashType;
 import java.math.BigInteger;
+import java.nio.ByteBuffer;
 import java.security.GeneralSecurityException;
 import java.security.MessageDigest;
 import java.util.Arrays;
@@ -65,6 +66,8 @@
         return "SHA-1";
       case SHA256:
         return "SHA-256";
+      case SHA384:
+        return "SHA-384";
       case SHA512:
         return "SHA-512";
     }
@@ -149,4 +152,17 @@
     }
     return t;
   }
+
+  /**
+   * Inserts {@param value} as unsigned into into {@param buffer}.
+   *
+   * <p>@throws GeneralSecurityException if not 0 <= value < 2^32.
+   */
+  public static void putAsUnsigedInt(ByteBuffer buffer, long value)
+      throws GeneralSecurityException {
+    if (!(0 <= value && value < 0x100000000L)) {
+      throw new GeneralSecurityException("Index out of range");
+    }
+    buffer.putInt((int) value);
+  }
 }
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/Validators.java b/java/src/main/java/com/google/crypto/tink/subtle/Validators.java
index b5bb2b8..eafc4cf 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/Validators.java
+++ b/java/src/main/java/com/google/crypto/tink/subtle/Validators.java
@@ -53,7 +53,9 @@
   public static void validateAesKeySize(int sizeInBytes) throws InvalidAlgorithmParameterException {
     if (sizeInBytes != 16 && sizeInBytes != 32) {
       throw new InvalidAlgorithmParameterException(
-          "invalid key size; only 128-bit and 256-bit AES keys are supported");
+          String.format(
+              "invalid key size %d; only 128-bit and 256-bit AES keys are supported",
+              sizeInBytes * 8));
     }
   }
 
@@ -80,12 +82,13 @@
   public static void validateSignatureHash(HashType hash) throws GeneralSecurityException {
     switch (hash) {
       case SHA256: // fall through
+      case SHA384: // fall through
       case SHA512:
         return;
-      case SHA1:
-        throw new GeneralSecurityException("SHA1 is not safe for signature");
+      default:
+        break;
     }
-    throw new GeneralSecurityException("Unsupported hash " + hash);
+    throw new GeneralSecurityException("Unsupported hash: " + hash.name());
   }
 
   /**
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/XChaCha20.java b/java/src/main/java/com/google/crypto/tink/subtle/XChaCha20.java
index 8c9aefe..0ac59a5 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/XChaCha20.java
+++ b/java/src/main/java/com/google/crypto/tink/subtle/XChaCha20.java
@@ -16,7 +16,6 @@
 
 package com.google.crypto.tink.subtle;
 
-import com.google.crypto.tink.annotations.Alpha;
 import java.security.InvalidKeyException;
 import java.util.Arrays;
 
@@ -27,7 +26,6 @@
  *
  * <p>This cipher is meant to be used to construct an AEAD with Poly1305.
  */
-@Alpha
 class XChaCha20 extends ChaCha20Base {
   /**
    * Constructs a new XChaCha20 cipher with the supplied {@code key}.
diff --git a/java/src/main/java/com/google/crypto/tink/subtle/XChaCha20Poly1305.java b/java/src/main/java/com/google/crypto/tink/subtle/XChaCha20Poly1305.java
index ccfd5ff..f8a4864 100644
--- a/java/src/main/java/com/google/crypto/tink/subtle/XChaCha20Poly1305.java
+++ b/java/src/main/java/com/google/crypto/tink/subtle/XChaCha20Poly1305.java
@@ -16,14 +16,12 @@
 
 package com.google.crypto.tink.subtle;
 
-import com.google.crypto.tink.annotations.Alpha;
 import java.security.InvalidKeyException;
 
 /**
  * XChaCha20Poly1305 AEAD construction, as described in
  * https://tools.ietf.org/html/draft-arciszewski-xchacha-01.
  */
-@Alpha
 public final class XChaCha20Poly1305 extends ChaCha20Poly1305Base {
   public XChaCha20Poly1305(final byte[] key) throws InvalidKeyException {
     super(key);
diff --git a/java/src/main/java/com/google/crypto/tink/util/BUILD.bazel b/java/src/main/java/com/google/crypto/tink/util/BUILD.bazel
index 08ced28..ce3e758 100644
--- a/java/src/main/java/com/google/crypto/tink/util/BUILD.bazel
+++ b/java/src/main/java/com/google/crypto/tink/util/BUILD.bazel
@@ -1,4 +1,4 @@
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
@@ -20,8 +20,8 @@
     ],
     javacopts = JAVACOPTS_OSS,
     deps = [
-        "@com_google_code_findbugs_jsr305",
-        "@com_google_http_client//jar",
-        "@joda_time//jar",
+        "@maven//:com_google_code_findbugs_jsr305",
+        "@maven//:com_google_http_client_google_http_client",
+        "@maven//:joda_time_joda_time",
     ],
 )
diff --git a/java/src/test/java/com/google/crypto/tink/ConfigTest.java b/java/src/test/java/com/google/crypto/tink/ConfigTest.java
index 4505107..b804c06 100644
--- a/java/src/test/java/com/google/crypto/tink/ConfigTest.java
+++ b/java/src/test/java/com/google/crypto/tink/ConfigTest.java
@@ -18,11 +18,7 @@
 
 import static org.junit.Assert.fail;
 
-import com.google.crypto.tink.aead.AeadConfig;
-import com.google.crypto.tink.hybrid.HybridConfig;
 import com.google.crypto.tink.proto.KeyTypeEntry;
-import com.google.crypto.tink.proto.RegistryConfig;
-import com.google.crypto.tink.signature.SignatureConfig;
 import java.security.GeneralSecurityException;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -31,47 +27,9 @@
 /** Tests for Config. */
 @RunWith(JUnit4.class)
 public class ConfigTest {
-  private RegistryConfig createAeadConfig() {
-    return RegistryConfig.newBuilder()
-        .addEntry(Config.getTinkKeyTypeEntry("TinkAead", "Aead", "AesEaxKey", 0, true))
-        .setConfigName("TINK_AEAD_1_0_0")
-        .build();
-  }
-
-  private RegistryConfig createMacConfig() {
-    return RegistryConfig.newBuilder()
-        .addEntry(Config.getTinkKeyTypeEntry("TinkMac", "Mac", "HmacKey", 0, true))
-        .setConfigName("TINK_MAC_1_0_0")
-        .build();
-  }
-
-  private RegistryConfig createHybridConfig() {
-    return RegistryConfig.newBuilder()
-        .addEntry(
-            Config.getTinkKeyTypeEntry(
-                "TinkHybridDecrypt", "HybridDecrypt", "EciesAeadHkdfPrivateKey", 0, true))
-        .addEntry(
-            Config.getTinkKeyTypeEntry(
-                "TinkHybridEncrypt", "HybridEncrypt", "EciesAeadHkdfPublicKey", 0, true))
-        .setConfigName("TINK_HYBRID_1_0_0")
-        .build();
-  }
-
-  private RegistryConfig createSignatureConfig() {
-    return RegistryConfig.newBuilder()
-        .addEntry(
-            Config.getTinkKeyTypeEntry(
-                "TinkPublicKeySign", "PublicKeySign", "EcdsaPrivateKey", 0, true))
-        .addEntry(
-            Config.getTinkKeyTypeEntry(
-                "TinkPublicKeyVerify", "PublicKeyVerify", "Ed25519PublicKey", 0, true))
-        .build();
-  }
-
   @Test
   public void testRegisterKeyType_NoCatalogue_shouldThrowException() throws Exception {
     KeyTypeEntry entry = KeyTypeEntry.newBuilder().setCatalogueName("DoesNotExist").build();
-
     try {
       Config.registerKeyType(entry);
       fail("Expected GeneralSecurityException");
@@ -79,42 +37,4 @@
       // expected
     }
   }
-
-  private void testRegister_NoCatalogue_shouldThrowException(RegistryConfig config)
-      throws Exception {
-    try {
-      Config.register(config);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      // expected
-    }
-  }
-
-  @Test
-  public void testRegister_initialization_shouldWork() throws Exception {
-    Registry.reset();
-    // The registry is empty, register should fail.
-    testRegister_NoCatalogue_shouldThrowException(createAeadConfig());
-    testRegister_NoCatalogue_shouldThrowException(createMacConfig());
-    testRegister_NoCatalogue_shouldThrowException(createHybridConfig());
-    testRegister_NoCatalogue_shouldThrowException(createSignatureConfig());
-
-    // Fill the registry with Aead key managers.
-    AeadConfig.init();
-    // Now register for Aead and Mac should succeed.
-    Config.register(createAeadConfig());
-    Config.register(createMacConfig());
-
-    // But hybrid should be still failing.
-    testRegister_NoCatalogue_shouldThrowException(createHybridConfig());
-    HybridConfig.init();
-    // Hybrid should work now.
-    Config.register(createHybridConfig());
-
-    // Signature is still failing.
-    testRegister_NoCatalogue_shouldThrowException(createSignatureConfig());
-    SignatureConfig.init();
-    // Signature should work now.
-    Config.register(createSignatureConfig());
-  }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/JsonKeysetWriterTest.java b/java/src/test/java/com/google/crypto/tink/JsonKeysetWriterTest.java
index b69d2a7..e30b52b 100644
--- a/java/src/test/java/com/google/crypto/tink/JsonKeysetWriterTest.java
+++ b/java/src/test/java/com/google/crypto/tink/JsonKeysetWriterTest.java
@@ -20,7 +20,6 @@
 
 import com.google.crypto.tink.aead.AeadKeyTemplates;
 import com.google.crypto.tink.config.TinkConfig;
-import com.google.crypto.tink.mac.MacFactory;
 import com.google.crypto.tink.mac.MacKeyTemplates;
 import com.google.crypto.tink.proto.KeyTemplate;
 import com.google.crypto.tink.subtle.Random;
@@ -41,8 +40,8 @@
   }
 
   private void assertKeysetHandle(KeysetHandle handle1, KeysetHandle handle2) throws Exception {
-    Mac mac1 = MacFactory.getPrimitive(handle1);
-    Mac mac2 = MacFactory.getPrimitive(handle2);
+    Mac mac1 = handle1.getPrimitive(Mac.class);
+    Mac mac2 = handle2.getPrimitive(Mac.class);
     byte[] message = Random.randBytes(20);
 
     assertThat(handle2.getKeyset()).isEqualTo(handle1.getKeyset());
diff --git a/java/src/test/java/com/google/crypto/tink/KeyManagerBaseTest.java b/java/src/test/java/com/google/crypto/tink/KeyManagerBaseTest.java
deleted file mode 100644
index 37e4cab..0000000
--- a/java/src/test/java/com/google/crypto/tink/KeyManagerBaseTest.java
+++ /dev/null
@@ -1,246 +0,0 @@
-// Copyright 2018 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package com.google.crypto.tink;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
-
-import com.google.crypto.tink.TestUtil.DummyAead;
-import com.google.crypto.tink.proto.AesGcmKey;
-import com.google.crypto.tink.proto.AesGcmKeyFormat;
-import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
-import com.google.crypto.tink.subtle.Random;
-import com.google.crypto.tink.subtle.Validators;
-import com.google.protobuf.ByteString;
-import com.google.protobuf.InvalidProtocolBufferException;
-import com.google.protobuf.MessageLite;
-import java.security.GeneralSecurityException;
-import java.security.InvalidAlgorithmParameterException;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests the methods implemented in KeyManagerBase using the concrete implementation above. */
-@RunWith(JUnit4.class)
-public final class KeyManagerBaseTest {
-  /** Keymanager for testing. Only produces dummy aeads, and wants the key size to be exactly 16. */
-  static class TestKeyManager extends KeyManagerBase<Aead, AesGcmKey, AesGcmKeyFormat> {
-    public TestKeyManager() {
-      super(Aead.class, AesGcmKey.class, AesGcmKeyFormat.class, TYPE_URL);
-    }
-
-    private static final int VERSION = 0;
-
-    public static final String TYPE_URL = "type.googleapis.com/google.crypto.tink.AesGcmKey";
-
-    @Override
-    protected Aead getPrimitiveFromKey(AesGcmKey key) throws GeneralSecurityException {
-      return new DummyAead();
-    }
-
-    @Override
-    protected AesGcmKey newKeyFromFormat(AesGcmKeyFormat format) throws GeneralSecurityException {
-      return AesGcmKey.newBuilder()
-          .setKeyValue(ByteString.copyFrom(Random.randBytes(format.getKeySize())))
-          .setVersion(VERSION)
-          .build();
-    }
-
-    @Override
-    public int getVersion() {
-      return VERSION;
-    }
-
-    @Override
-    protected KeyMaterialType keyMaterialType() {
-      return KeyMaterialType.SYMMETRIC;
-    }
-
-    @Override
-    protected AesGcmKey parseKeyProto(ByteString byteString) throws InvalidProtocolBufferException {
-      return AesGcmKey.parseFrom(byteString);
-    }
-
-    @Override
-    protected AesGcmKeyFormat parseKeyFormatProto(ByteString byteString)
-        throws InvalidProtocolBufferException {
-      return AesGcmKeyFormat.parseFrom(byteString);
-    }
-
-    private void throwIfNot16(int size) throws GeneralSecurityException {
-      if (size != 16) {
-        throw new InvalidAlgorithmParameterException("invalid key size; only size 16 is good.");
-      }
-    }
-
-    @Override
-    protected void validateKey(AesGcmKey key) throws GeneralSecurityException {
-      Validators.validateVersion(key.getVersion(), VERSION);
-      throwIfNot16(key.getKeyValue().size());
-    }
-
-    @Override
-    protected void validateKeyFormat(AesGcmKeyFormat format) throws GeneralSecurityException {
-      throwIfNot16(format.getKeySize());
-    }
-  }
-
-  @Test
-  public void getPrimitive_ByteString_works() throws Exception {
-    TestKeyManager keyManager = new TestKeyManager();
-    MessageLite key = keyManager.newKey(AesGcmKeyFormat.newBuilder().setKeySize(16).build());
-    keyManager.getPrimitive(key.toByteString());
-  }
-
-  @Test
-  public void getPrimitive_ByteString_throwsInvalidKey() throws Exception {
-    TestKeyManager keyManager = new TestKeyManager();
-    MessageLite notAKey = AesGcmKey.getDefaultInstance();
-    try {
-      keyManager.getPrimitive(notAKey.toByteString());
-      fail("expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("invalid key size");
-    }
-  }
-
-  @Test
-  public void getPrimitive_MessageLite_works() throws Exception {
-    TestKeyManager keyManager = new TestKeyManager();
-    MessageLite key = keyManager.newKey(AesGcmKeyFormat.newBuilder().setKeySize(16).build());
-    keyManager.getPrimitive(key);
-  }
-
-  @Test
-  public void getPrimitive_MessageLite_throwsWrongProto() throws Exception {
-    TestKeyManager keyManager = new TestKeyManager();
-    MessageLite notAKey = AesGcmKeyFormat.getDefaultInstance();
-    try {
-      keyManager.getPrimitive(notAKey);
-      fail("expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("Expected proto of type");
-    }
-  }
-
-  @Test
-  public void getPrimitive_MessageLite_throwsInvalidKey() throws Exception {
-    TestKeyManager keyManager = new TestKeyManager();
-    MessageLite notAKey = AesGcmKey.getDefaultInstance();
-    try {
-      keyManager.getPrimitive(notAKey);
-      fail("expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("invalid key size");
-    }
-  }
-
-  @Test
-  public void newKey_ByteString_works() throws Exception {
-    TestKeyManager keyManager = new TestKeyManager();
-    keyManager.newKey(AesGcmKeyFormat.newBuilder().setKeySize(16).build().toByteString());
-  }
-
-  @Test
-  public void newKey_ByteString_throwsInvalidKeySize() throws Exception {
-    TestKeyManager keyManager = new TestKeyManager();
-    try {
-      keyManager.newKey(AesGcmKeyFormat.newBuilder().setKeySize(17).build().toByteString());
-      fail("expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("invalid key size");
-    }
-  }
-
-  @Test
-  public void newKey_MessageLite_works() throws Exception {
-    TestKeyManager keyManager = new TestKeyManager();
-    keyManager.newKey(AesGcmKeyFormat.newBuilder().setKeySize(16).build());
-  }
-
-  @Test
-  public void newKey_MessageLite_throwsWrongProto() throws Exception {
-    TestKeyManager keyManager = new TestKeyManager();
-    try {
-      keyManager.newKey(AesGcmKey.getDefaultInstance());
-      fail("expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("Expected proto of type");
-    }
-  }
-
-  @Test
-  public void doesSupport_returnsTrue() throws Exception {
-    assertThat(new TestKeyManager().doesSupport("type.googleapis.com/google.crypto.tink.AesGcmKey"))
-        .isTrue();
-  }
-
-  @Test
-  public void doesSupport_returnsFalse() throws Exception {
-    assertThat(new TestKeyManager().doesSupport("type.googleapis.com/SomeOtherKey")).isFalse();
-  }
-
-  @Test
-  public void getKeyType() throws Exception {
-    assertThat(new TestKeyManager().getKeyType())
-        .isEqualTo("type.googleapis.com/google.crypto.tink.AesGcmKey");
-  }
-
-  @Test
-  public void newKeyData_works() throws Exception {
-    TestKeyManager keyManager = new TestKeyManager();
-    keyManager.newKeyData(AesGcmKeyFormat.newBuilder().setKeySize(16).build().toByteString());
-  }
-
-  @Test
-  public void newKeyData_typeUrlCorrect() throws Exception {
-    TestKeyManager keyManager = new TestKeyManager();
-    assertThat(
-            keyManager
-                .newKeyData(AesGcmKeyFormat.newBuilder().setKeySize(16).build().toByteString())
-                .getTypeUrl())
-        .isEqualTo("type.googleapis.com/google.crypto.tink.AesGcmKey");
-  }
-
-  @Test
-  public void newKeyData_valueLengthCorrect() throws Exception {
-    TestKeyManager keyManager = new TestKeyManager();
-    // We allow the keysize to be bigger than 16 since proto serialized adds some overhead.
-    assertThat(
-            keyManager
-                .newKeyData(AesGcmKeyFormat.newBuilder().setKeySize(16).build().toByteString())
-                .getValue()
-                .size())
-        .isAtLeast(16);
-  }
-
-  @Test
-  public void newKeyData_keyMaterialTypeCorrect() throws Exception {
-    TestKeyManager keyManager = new TestKeyManager();
-    assertThat(
-            keyManager
-                .newKeyData(AesGcmKeyFormat.newBuilder().setKeySize(16).build().toByteString())
-                .getKeyMaterialType())
-        .isEqualTo(KeyMaterialType.SYMMETRIC);
-  }
-
-  @Test
-  public void getPrimitiveClass() throws Exception {
-    TestKeyManager keyManager = new TestKeyManager();
-    assertThat(keyManager.getPrimitiveClass()).isEqualTo(Aead.class);
-  }
-}
diff --git a/java/src/test/java/com/google/crypto/tink/KeyManagerImplTest.java b/java/src/test/java/com/google/crypto/tink/KeyManagerImplTest.java
new file mode 100644
index 0000000..423ae18
--- /dev/null
+++ b/java/src/test/java/com/google/crypto/tink/KeyManagerImplTest.java
@@ -0,0 +1,393 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.google.crypto.tink;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.fail;
+
+import com.google.crypto.tink.proto.AesGcmKey;
+import com.google.crypto.tink.proto.AesGcmKeyFormat;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
+import com.google.crypto.tink.subtle.AesGcmJce;
+import com.google.crypto.tink.subtle.Random;
+import com.google.protobuf.ByteString;
+import com.google.protobuf.InvalidProtocolBufferException;
+import com.google.protobuf.MessageLite;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Tests the methods implemented in KeyManagerImpl using the concrete implementation above. */
+@RunWith(JUnit4.class)
+public final class KeyManagerImplTest {
+  /** Implementation of a KeyTypeManager for testing. */
+  private static class TestKeyTypeManager extends KeyTypeManager<AesGcmKey> {
+    public TestKeyTypeManager() {
+      super(
+          AesGcmKey.class,
+          new PrimitiveFactory<Aead, AesGcmKey>(Aead.class) {
+            @Override
+            public Aead getPrimitive(AesGcmKey key) throws GeneralSecurityException {
+              return new AesGcmJce(key.getKeyValue().toByteArray());
+            }
+          },
+          new PrimitiveFactory<FakeAead, AesGcmKey>(FakeAead.class) {
+            @Override
+            public FakeAead getPrimitive(AesGcmKey key) {
+              return new FakeAead();
+            }
+          });
+    }
+
+    @Override
+    public String getKeyType() {
+      return "type.googleapis.com/google.crypto.tink.AesGcmKey";
+    }
+
+    @Override
+    public int getVersion() {
+      return 1;
+    }
+
+    @Override
+    public KeyMaterialType keyMaterialType() {
+      return KeyMaterialType.SYMMETRIC;
+    }
+
+    @Override
+    public void validateKey(AesGcmKey keyProto) throws GeneralSecurityException {
+      // Throw by hand so we can verify the exception comes from here.
+      if (keyProto.getKeyValue().size() != 16) {
+        throw new GeneralSecurityException("validateKey(AesGcmKey) failed");
+      }
+    }
+
+    @Override
+    public AesGcmKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
+      return AesGcmKey.parseFrom(byteString);
+    }
+
+    @Override
+    public KeyFactory<AesGcmKeyFormat, AesGcmKey> keyFactory() {
+      return new KeyFactory<AesGcmKeyFormat, AesGcmKey>(AesGcmKeyFormat.class) {
+        @Override
+        public void validateKeyFormat(AesGcmKeyFormat format) throws GeneralSecurityException {
+          // Throw by hand so we can verify the exception comes from here.
+          if (format.getKeySize() != 16) {
+            throw new GeneralSecurityException("validateKeyFormat(AesGcmKeyFormat) failed");
+          }
+        }
+
+        @Override
+        public AesGcmKeyFormat parseKeyFormat(ByteString byteString)
+            throws InvalidProtocolBufferException {
+          return AesGcmKeyFormat.parseFrom(byteString);
+        }
+
+        @Override
+        public AesGcmKey createKey(AesGcmKeyFormat format) throws GeneralSecurityException {
+          return AesGcmKey.newBuilder()
+              .setKeyValue(ByteString.copyFrom(Random.randBytes(format.getKeySize())))
+              .setVersion(getVersion())
+              .build();
+        }
+      };
+    }
+  }
+
+  @Test
+  public void getPrimitive_ByteString_works() throws Exception {
+    KeyManager<Aead> keyManager = new KeyManagerImpl<>(new TestKeyTypeManager(), Aead.class);
+    MessageLite key = keyManager.newKey(AesGcmKeyFormat.newBuilder().setKeySize(16).build());
+    keyManager.getPrimitive(key.toByteString());
+  }
+
+  @Test
+  public void getPrimitive_FakeAead_ByteString_works() throws Exception {
+    KeyManager<FakeAead> fakeAeadKeyManager =
+        new KeyManagerImpl<>(new TestKeyTypeManager(), FakeAead.class);
+    MessageLite key =
+        fakeAeadKeyManager.newKey(AesGcmKeyFormat.newBuilder().setKeySize(16).build());
+    fakeAeadKeyManager.getPrimitive(key.toByteString());
+  }
+
+  @Test
+  public void creatingKeyManager_nonSupportedPrimitive_fails() throws Exception {
+    try {
+      new KeyManagerImpl<>(new TestKeyTypeManager(), Integer.class);
+      fail("IllegalArgumentException expected.");
+    } catch (IllegalArgumentException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void getPrimitive_ByteString_throwsInvalidKey() throws Exception {
+    KeyManager<Aead> keyManager = new KeyManagerImpl<>(new TestKeyTypeManager(), Aead.class);
+    MessageLite notAKey = AesGcmKey.getDefaultInstance();
+    try {
+      keyManager.getPrimitive(notAKey.toByteString());
+      fail("expected GeneralSecurityException");
+    } catch (GeneralSecurityException e) {
+      assertThat(e.toString()).contains("validateKey(AesGcmKey) failed");
+    }
+  }
+
+  @Test
+  public void getPrimitive_MessageLite_works() throws Exception {
+    KeyManager<Aead> keyManager = new KeyManagerImpl<>(new TestKeyTypeManager(), Aead.class);
+    MessageLite key = keyManager.newKey(AesGcmKeyFormat.newBuilder().setKeySize(16).build());
+    keyManager.getPrimitive(key);
+  }
+
+  @Test
+  public void getPrimitive_MessageLite_throwsIfVoid() throws Exception {
+    KeyManager<Void> keyManager = new KeyManagerImpl<>(new TestKeyTypeManager(), Void.class);
+    MessageLite key = keyManager.newKey(AesGcmKeyFormat.newBuilder().setKeySize(16).build());
+    try {
+      keyManager.getPrimitive(key);
+      fail("expected GeneralSecurityException");
+    } catch (GeneralSecurityException e) {
+      assertThat(e.toString()).contains("Void");
+    }
+  }
+
+  @Test
+  public void getPrimitive_MessageLite_throwsWrongProto() throws Exception {
+    KeyManager<Aead> keyManager = new KeyManagerImpl<>(new TestKeyTypeManager(), Aead.class);
+    MessageLite notAKey = AesGcmKeyFormat.getDefaultInstance();
+    try {
+      keyManager.getPrimitive(notAKey);
+      fail("expected GeneralSecurityException");
+    } catch (GeneralSecurityException e) {
+      assertThat(e.toString()).contains("Expected proto of type");
+    }
+  }
+
+  @Test
+  public void getPrimitive_MessageLite_throwsInvalidKey() throws Exception {
+    KeyManager<Aead> keyManager = new KeyManagerImpl<>(new TestKeyTypeManager(), Aead.class);
+    MessageLite notAKey = AesGcmKey.getDefaultInstance();
+    try {
+      keyManager.getPrimitive(notAKey);
+      fail("expected GeneralSecurityException");
+    } catch (GeneralSecurityException e) {
+      assertThat(e.toString()).contains("validateKey(AesGcmKey) failed");
+    }
+  }
+
+  @Test
+  public void newKey_ByteString_works() throws Exception {
+    KeyManager<Aead> keyManager = new KeyManagerImpl<>(new TestKeyTypeManager(), Aead.class);
+    keyManager.newKey(AesGcmKeyFormat.newBuilder().setKeySize(16).build().toByteString());
+  }
+
+  @Test
+  public void newKey_ByteString_throwsInvalidKeySize() throws Exception {
+    KeyManager<Aead> keyManager = new KeyManagerImpl<>(new TestKeyTypeManager(), Aead.class);
+    try {
+      keyManager.newKey(AesGcmKeyFormat.newBuilder().setKeySize(17).build().toByteString());
+      fail("expected GeneralSecurityException");
+    } catch (GeneralSecurityException e) {
+      assertThat(e.toString()).contains("validateKeyFormat(AesGcmKeyFormat) failed");
+    }
+  }
+
+  @Test
+  public void newKey_MessageLite_works() throws Exception {
+    KeyManager<Aead> keyManager = new KeyManagerImpl<>(new TestKeyTypeManager(), Aead.class);
+    keyManager.newKey(AesGcmKeyFormat.newBuilder().setKeySize(16).build());
+  }
+
+  @Test
+  public void newKey_MessageLite_throwsWrongProto() throws Exception {
+    KeyManager<Aead> keyManager = new KeyManagerImpl<>(new TestKeyTypeManager(), Aead.class);
+    try {
+      // Note: newKey expects AesGcmKeyFormat, not AesGcmKey.
+      keyManager.newKey(AesGcmKey.getDefaultInstance());
+      fail("expected GeneralSecurityException");
+    } catch (GeneralSecurityException e) {
+      assertThat(e.toString()).contains("Expected proto of type");
+    }
+  }
+
+  @Test
+  public void newKey_MessageLite_throwsInvalidKeySize() throws Exception {
+    KeyManager<Aead> keyManager = new KeyManagerImpl<>(new TestKeyTypeManager(), Aead.class);
+    try {
+      // Note: newKey expects AesGcmKeyFormat, not AesGcmKey.
+      keyManager.newKey((MessageLite) AesGcmKeyFormat.getDefaultInstance());
+      fail("expected GeneralSecurityException");
+    } catch (GeneralSecurityException e) {
+      assertThat(e.toString()).contains("validateKeyFormat(AesGcmKeyFormat) failed");
+    }
+  }
+
+  @Test
+  public void doesSupport_returnsTrue() throws Exception {
+    KeyManager<Aead> keyManager = new KeyManagerImpl<>(new TestKeyTypeManager(), Aead.class);
+    assertThat(keyManager.doesSupport("type.googleapis.com/google.crypto.tink.AesGcmKey")).isTrue();
+  }
+
+  @Test
+  public void doesSupport_returnsFalse() throws Exception {
+    KeyManager<Aead> keyManager = new KeyManagerImpl<>(new TestKeyTypeManager(), Aead.class);
+    assertThat(keyManager.doesSupport("type.googleapis.com/SomeOtherKey")).isFalse();
+  }
+
+  @Test
+  public void getKeyType() throws Exception {
+    KeyManager<Aead> keyManager = new KeyManagerImpl<>(new TestKeyTypeManager(), Aead.class);
+    assertThat(keyManager.getKeyType())
+        .isEqualTo("type.googleapis.com/google.crypto.tink.AesGcmKey");
+  }
+
+  @Test
+  public void newKeyData_works() throws Exception {
+    KeyManager<Aead> keyManager = new KeyManagerImpl<>(new TestKeyTypeManager(), Aead.class);
+    keyManager.newKeyData(AesGcmKeyFormat.newBuilder().setKeySize(16).build().toByteString());
+  }
+
+  @Test
+  public void newKeyData_typeUrlCorrect() throws Exception {
+    KeyManager<Aead> keyManager = new KeyManagerImpl<>(new TestKeyTypeManager(), Aead.class);
+    assertThat(
+            keyManager
+                .newKeyData(AesGcmKeyFormat.newBuilder().setKeySize(16).build().toByteString())
+                .getTypeUrl())
+        .isEqualTo("type.googleapis.com/google.crypto.tink.AesGcmKey");
+  }
+
+  @Test
+  public void newKeyData_valueLengthCorrect() throws Exception {
+    KeyManager<Aead> keyManager = new KeyManagerImpl<>(new TestKeyTypeManager(), Aead.class);
+    // We allow the keysize to be bigger than 16 since proto serialized adds some overhead.
+    assertThat(
+            keyManager
+                .newKeyData(AesGcmKeyFormat.newBuilder().setKeySize(16).build().toByteString())
+                .getValue()
+                .size())
+        .isAtLeast(16);
+  }
+
+  @Test
+  public void newKeyData_wrongKeySize_throws() throws Exception {
+    KeyManager<Aead> keyManager = new KeyManagerImpl<>(new TestKeyTypeManager(), Aead.class);
+    // We allow the keysize to be bigger than 16 since proto serialized adds some overhead.
+    try {
+      keyManager.newKeyData(AesGcmKeyFormat.newBuilder().setKeySize(17).build().toByteString());
+      fail("expected GeneralSecurityException");
+    } catch (GeneralSecurityException e) {
+      assertThat(e.toString()).contains("validateKeyFormat(AesGcmKeyFormat) failed");
+    }
+  }
+
+  @Test
+  public void newKeyData_keyMaterialTypeCorrect() throws Exception {
+    KeyManager<Aead> keyManager = new KeyManagerImpl<>(new TestKeyTypeManager(), Aead.class);
+    assertThat(
+            keyManager
+                .newKeyData(AesGcmKeyFormat.newBuilder().setKeySize(16).build().toByteString())
+                .getKeyMaterialType())
+        .isEqualTo(KeyMaterialType.SYMMETRIC);
+  }
+
+  @Test
+  public void getPrimitiveClass() throws Exception {
+    KeyManager<Aead> keyManager = new KeyManagerImpl<>(new TestKeyTypeManager(), Aead.class);
+    assertThat(keyManager.getPrimitiveClass()).isEqualTo(Aead.class);
+  }
+
+  /** Implementation of a KeyTypeManager for testing, not supporting creating new keys. */
+  private static class TestKeyTypeManagerWithoutKeyFactory extends KeyTypeManager<AesGcmKey> {
+    public TestKeyTypeManagerWithoutKeyFactory() {
+      super(AesGcmKey.class);
+    }
+
+    @Override
+    public String getKeyType() {
+      return "type.googleapis.com/google.crypto.tink.AesGcmKey";
+    }
+
+    @Override
+    public int getVersion() {
+      return 1;
+    }
+
+    @Override
+    public KeyMaterialType keyMaterialType() {
+      return KeyMaterialType.SYMMETRIC;
+    }
+
+    @Override
+    public void validateKey(AesGcmKey keyProto) {}
+
+    @Override
+    public AesGcmKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
+      return AesGcmKey.parseFrom(byteString);
+    }
+  }
+
+  @Test
+  public void newKey_ByteString_throwsUnsupportedOperation() throws Exception {
+    KeyManager<Void> keyManager =
+        new KeyManagerImpl<>(new TestKeyTypeManagerWithoutKeyFactory(), Void.class);
+    try {
+      keyManager.newKey(ByteString.copyFromUtf8(""));
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void newKey_byteString_throwsUnsupportedOperation() throws Exception {
+    KeyManager<Void> keyManager =
+        new KeyManagerImpl<>(new TestKeyTypeManagerWithoutKeyFactory(), Void.class);
+    try {
+      keyManager.newKey(ByteString.copyFromUtf8(""));
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void newKey_messageList_throwsUnsupportedOperation() throws Exception {
+    KeyManager<Void> keyManager =
+        new KeyManagerImpl<>(new TestKeyTypeManagerWithoutKeyFactory(), Void.class);
+    try {
+      keyManager.newKey(AesGcmKey.getDefaultInstance());
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void newKeyData_byteString_throwsUnsupportedOperation() throws Exception {
+    KeyManager<Void> keyManager =
+        new KeyManagerImpl<>(new TestKeyTypeManagerWithoutKeyFactory(), Void.class);
+    try {
+      keyManager.newKeyData(ByteString.copyFromUtf8(""));
+      fail("UnsupportedOperationException expected");
+    } catch (UnsupportedOperationException e) {
+      // expected
+    }
+  }
+
+  private static class FakeAead {}
+}
diff --git a/java/src/test/java/com/google/crypto/tink/KeyTypeManagerTest.java b/java/src/test/java/com/google/crypto/tink/KeyTypeManagerTest.java
new file mode 100644
index 0000000..1e273ad
--- /dev/null
+++ b/java/src/test/java/com/google/crypto/tink/KeyTypeManagerTest.java
@@ -0,0 +1,222 @@
+// Copyright 2019 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package com.google.crypto.tink;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.fail;
+
+import com.google.crypto.tink.proto.AesGcmKey;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
+import com.google.protobuf.ByteString;
+import com.google.protobuf.InvalidProtocolBufferException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Tests for KeyTypeManager. */
+@RunWith(JUnit4.class)
+public final class KeyTypeManagerTest {
+  private static final ByteString TEST_BYTESTRING = ByteString.copyFromUtf8("Some text");
+
+  /**
+   * A KeyTypeManager for testing. It accepts AesGcmKeys and produces primitives as with the passed
+   * in factory.
+   */
+  public static class TestKeyTypeManager extends KeyTypeManager<AesGcmKey> {
+    public TestKeyTypeManager(PrimitiveFactory<?, AesGcmKey>... factories) {
+      super(AesGcmKey.class, factories);
+    }
+
+    @Override
+    public String getKeyType() {
+      return "type.googleapis.com/google.crypto.tink.AesGcmKey";
+    }
+
+    @Override
+    public int getVersion() {
+      return 1;
+    }
+
+    @Override
+    public KeyMaterialType keyMaterialType() {
+      return KeyMaterialType.SYMMETRIC;
+    }
+
+    @Override
+    public void validateKey(AesGcmKey keyProto) {}
+
+    @Override
+    public AesGcmKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
+      return AesGcmKey.parseFrom(byteString);
+    }
+  }
+
+  @Test
+  public void getPrimitive_works() throws Exception {
+    KeyTypeManager<AesGcmKey> keyManager =
+        new TestKeyTypeManager(
+            new TestKeyTypeManager.PrimitiveFactory<Primitive1, AesGcmKey>(Primitive1.class) {
+              @Override
+              public Primitive1 getPrimitive(AesGcmKey key) {
+                return new Primitive1(key.getKeyValue());
+              }
+            },
+            new TestKeyTypeManager.PrimitiveFactory<Primitive2, AesGcmKey>(Primitive2.class) {
+              @Override
+              public Primitive2 getPrimitive(AesGcmKey key) {
+                return new Primitive2(key.getKeyValue().size());
+              }
+            });
+    Primitive1 primitive1 =
+        keyManager.getPrimitive(
+            AesGcmKey.newBuilder().setKeyValue(TEST_BYTESTRING).build(), Primitive1.class);
+    assertThat(primitive1.getKeyValue()).isEqualTo(TEST_BYTESTRING);
+    Primitive2 primitive2 =
+        keyManager.getPrimitive(
+            AesGcmKey.newBuilder().setKeyValue(TEST_BYTESTRING).build(), Primitive2.class);
+    assertThat(primitive2.getSize()).isEqualTo(TEST_BYTESTRING.size());
+  }
+
+  @Test
+  public void firstSupportedPrimitiveClass() throws Exception {
+    KeyTypeManager<AesGcmKey> keyManager =
+        new TestKeyTypeManager(
+            new TestKeyTypeManager.PrimitiveFactory<Primitive1, AesGcmKey>(Primitive1.class) {
+              @Override
+              public Primitive1 getPrimitive(AesGcmKey key) {
+                return new Primitive1(key.getKeyValue());
+              }
+            },
+            new TestKeyTypeManager.PrimitiveFactory<Primitive2, AesGcmKey>(Primitive2.class) {
+              @Override
+              public Primitive2 getPrimitive(AesGcmKey key) {
+                return new Primitive2(key.getKeyValue().size());
+              }
+            });
+    assertThat(keyManager.firstSupportedPrimitiveClass()).isEqualTo(Primitive1.class);
+  }
+
+  @Test
+  public void firstSupportedPrimitiveClass_returnsVoid() throws Exception {
+    KeyTypeManager<AesGcmKey> keyManager = new TestKeyTypeManager();
+    assertThat(keyManager.firstSupportedPrimitiveClass()).isEqualTo(Void.class);
+  }
+
+  @Test
+  public void supportedPrimitives_equalsGivenPrimitives() throws Exception {
+    KeyTypeManager<AesGcmKey> keyManager =
+        new TestKeyTypeManager(
+            new TestKeyTypeManager.PrimitiveFactory<Primitive1, AesGcmKey>(Primitive1.class) {
+              @Override
+              public Primitive1 getPrimitive(AesGcmKey key) {
+                return new Primitive1(key.getKeyValue());
+              }
+            },
+            new TestKeyTypeManager.PrimitiveFactory<Primitive2, AesGcmKey>(Primitive2.class) {
+              @Override
+              public Primitive2 getPrimitive(AesGcmKey key) {
+                return new Primitive2(key.getKeyValue().size());
+              }
+            });
+    assertThat(keyManager.supportedPrimitives())
+        .containsExactly(Primitive1.class, Primitive2.class);
+  }
+
+  @Test
+  public void supportedPrimitives_canBeEmpty() throws Exception {
+    KeyTypeManager<AesGcmKey> keyManager = new TestKeyTypeManager();
+    assertThat(keyManager.supportedPrimitives()).isEmpty();
+  }
+
+  @Test
+  public void getPrimitive_throwsForUnknownPrimitives() throws Exception {
+    KeyTypeManager<AesGcmKey> keyManager = new TestKeyTypeManager();
+    try {
+      keyManager.getPrimitive(AesGcmKey.getDefaultInstance(), Primitive1.class);
+      fail();
+    } catch (IllegalArgumentException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void getPrimitive_throwsForVoid() throws Exception {
+    KeyTypeManager<AesGcmKey> keyManager = new TestKeyTypeManager();
+    try {
+      keyManager.getPrimitive(AesGcmKey.getDefaultInstance(), Void.class);
+      fail();
+    } catch (IllegalArgumentException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void keyFactory_throwsUnsupported() throws Exception {
+    KeyTypeManager<AesGcmKey> keyManager = new TestKeyTypeManager();
+    try {
+      keyManager.keyFactory();
+      fail();
+    } catch (UnsupportedOperationException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void constructor_repeatedPrimitive_throwsIllegalArgument() throws Exception {
+    try {
+      new TestKeyTypeManager(
+          new TestKeyTypeManager.PrimitiveFactory<Primitive1, AesGcmKey>(Primitive1.class) {
+            @Override
+            public Primitive1 getPrimitive(AesGcmKey key) {
+              return new Primitive1(key.getKeyValue());
+            }
+          },
+          new TestKeyTypeManager.PrimitiveFactory<Primitive1, AesGcmKey>(Primitive1.class) {
+            @Override
+            public Primitive1 getPrimitive(AesGcmKey key) {
+              return new Primitive1(key.getKeyValue());
+            }
+          });
+      fail();
+    } catch (IllegalArgumentException e) {
+      // expected
+    }
+  }
+
+  private static final class Primitive1 {
+    public Primitive1(ByteString keyValue) {
+      this.keyValue = keyValue;
+    }
+
+    private final ByteString keyValue;
+
+    public ByteString getKeyValue() {
+      return keyValue;
+    }
+  }
+
+  private static final class Primitive2 {
+    public Primitive2(int size) {
+      this.size = size;
+    }
+
+    private final int size;
+
+    public int getSize() {
+      return size;
+    }
+  }
+}
diff --git a/java/src/test/java/com/google/crypto/tink/KeysetHandleTest.java b/java/src/test/java/com/google/crypto/tink/KeysetHandleTest.java
index a7df307..b512734 100644
--- a/java/src/test/java/com/google/crypto/tink/KeysetHandleTest.java
+++ b/java/src/test/java/com/google/crypto/tink/KeysetHandleTest.java
@@ -23,9 +23,11 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import com.google.crypto.tink.TestUtil.DummyAead;
 import com.google.crypto.tink.aead.AeadKeyTemplates;
 import com.google.crypto.tink.config.TinkConfig;
 import com.google.crypto.tink.mac.MacKeyTemplates;
+import com.google.crypto.tink.proto.AesGcmKey;
 import com.google.crypto.tink.proto.EcdsaPrivateKey;
 import com.google.crypto.tink.proto.KeyData;
 import com.google.crypto.tink.proto.KeyStatusType;
@@ -195,8 +197,20 @@
                 KeyStatusType.ENABLED,
                 OutputPrefixType.TINK));
     KeysetHandle handle = KeysetHandle.fromKeyset(keyset);
-    // The TestKeyManager accepts AES128_GCM keys, but creates a DummyAead which always fails.
-    Aead aead = handle.getPrimitive(new KeyManagerBaseTest.TestKeyManager(), Aead.class);
+    // A key manager which accepts AES_GCM keys, but which creates a DummyAead primitive which
+    // always fails.
+    KeyManager<Aead> manager =
+        new KeyManagerImpl<>(
+            new KeyTypeManagerTest.TestKeyTypeManager(
+                new KeyTypeManagerTest.TestKeyTypeManager.PrimitiveFactory<Aead, AesGcmKey>(
+                    Aead.class) {
+                  @Override
+                  public Aead getPrimitive(AesGcmKey key) {
+                    return new DummyAead();
+                  }
+                }),
+            Aead.class);
+    Aead aead = handle.getPrimitive(manager, Aead.class);
     try {
       aead.encrypt(new byte[0], new byte[0]);
       fail("Expected GeneralSecurityException");
@@ -236,7 +250,7 @@
   }
 
   @Test
-  public void readNoSecretFailForTypeSymmetric() throws Exception {
+  public void readNoSecretFailWithTypeSymmetric() throws Exception {
     String keyValue = "01234567890123456";
     Keyset keyset =
         TestUtil.createKeyset(
@@ -249,7 +263,8 @@
       KeysetHandle unused = KeysetHandle.readNoSecret(keyset.toByteArray());
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertExceptionContains(e, "keyset contains secret key material");
+      assertExceptionContains(e, "keyset contains key material of type");
+      assertExceptionContains(e, " type.googleapis.com/google.crypto.tink.HmacKey");
     }
 
     try {
@@ -257,19 +272,19 @@
           KeysetHandle.readNoSecret(BinaryKeysetReader.withBytes(keyset.toByteArray()));
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertExceptionContains(e, "keyset contains secret key material");
+      assertExceptionContains(e, "keyset contains key material");
     }
   }
 
   @Test
-  public void readNoSecretForTypeAssymmetricPrivate() throws Exception {
+  public void readNoSecretFailWithTypeAsymmetricPrivate() throws Exception {
     Keyset keyset = KeysetHandle.generateNew(SignatureKeyTemplates.ECDSA_P256).getKeyset();
 
     try {
       KeysetHandle unused = KeysetHandle.readNoSecret(keyset.toByteArray());
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertExceptionContains(e, "keyset contains secret key material");
+      assertExceptionContains(e, "keyset contains key material");
     }
 
     try {
@@ -277,7 +292,7 @@
           KeysetHandle.readNoSecret(BinaryKeysetReader.withBytes(keyset.toByteArray()));
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertExceptionContains(e, "keyset contains secret key material");
+      assertExceptionContains(e, "keyset contains key material");
     }
   }
 
@@ -301,4 +316,49 @@
       assertExceptionContains(e, "invalid");
     }
   }
+
+  @Test
+  public void writeNoSecretShouldWork() throws Exception {
+    KeysetHandle privateHandle = KeysetHandle.generateNew(SignatureKeyTemplates.ECDSA_P256);
+    KeysetHandle publicHandle = privateHandle.getPublicKeysetHandle();
+    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+    KeysetWriter writer = BinaryKeysetWriter.withOutputStream(outputStream);
+    Keyset keyset = publicHandle.getKeyset();
+    publicHandle.writeNoSecret(writer);
+    ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
+    KeysetReader reader = BinaryKeysetReader.withInputStream(inputStream);
+    Keyset keyset2 = KeysetHandle.readNoSecret(reader).getKeyset();
+    assertEquals(keyset, keyset2);
+  }
+
+  @Test
+  public void writeNoSecretFailWithTypeSymmetric() throws Exception {
+    String keyValue = "01234567890123456";
+    Keyset keyset =
+        TestUtil.createKeyset(
+            TestUtil.createKey(
+                TestUtil.createHmacKeyData(keyValue.getBytes("UTF-8"), 16),
+                42,
+                KeyStatusType.ENABLED,
+                OutputPrefixType.TINK));
+    KeysetHandle handle = KeysetHandle.fromKeyset(keyset);
+    try {
+      handle.writeNoSecret(null /* writer */);
+      fail("Expected GeneralSecurityException");
+    } catch (GeneralSecurityException e) {
+      assertExceptionContains(e, "keyset contains key material");
+    }
+  }
+
+  @Test
+  public void writeNoSecretFailWithTypeAsymmetricPrivate() throws Exception {
+    KeysetHandle handle = KeysetHandle.generateNew(SignatureKeyTemplates.ECDSA_P256);
+
+    try {
+      handle.writeNoSecret(null /* writer */);
+      fail("Expected GeneralSecurityException");
+    } catch (GeneralSecurityException e) {
+      assertExceptionContains(e, "keyset contains key material");
+    }
+  }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/PrimitiveSetTest.java b/java/src/test/java/com/google/crypto/tink/PrimitiveSetTest.java
index b2dc31a..8d43261 100644
--- a/java/src/test/java/com/google/crypto/tink/PrimitiveSetTest.java
+++ b/java/src/test/java/com/google/crypto/tink/PrimitiveSetTest.java
@@ -84,7 +84,7 @@
     Key key3 =
         Key.newBuilder()
             .setKeyId(3)
-            .setStatus(KeyStatusType.DISABLED)
+            .setStatus(KeyStatusType.ENABLED)
             .setOutputPrefixType(OutputPrefixType.LEGACY)
             .build();
     pset.addPrimitive(new DummyMac1(), key3);
@@ -117,7 +117,7 @@
     assertEquals(
         DummyMac1.class.getSimpleName(),
         new String(entry.getPrimitive().computeMac(null), "UTF-8"));
-    assertEquals(KeyStatusType.DISABLED, entry.getStatus());
+    assertEquals(KeyStatusType.ENABLED, entry.getStatus());
     assertEquals(CryptoFormat.LEGACY_START_BYTE, entry.getIdentifier()[0]);
     assertArrayEquals(CryptoFormat.getOutputPrefix(key3), entry.getIdentifier());
 
@@ -234,7 +234,7 @@
   }
 
   @Test
-  public void testAddInvalidKey() throws Exception {
+  public void testAddPrimive_withUnknownPrefixType_shouldFail() throws Exception {
     PrimitiveSet<Mac> pset = PrimitiveSet.newPrimitiveSet(Mac.class);
     Key key1 = Key.newBuilder().setKeyId(1).setStatus(KeyStatusType.ENABLED).build();
     try {
@@ -244,4 +244,21 @@
       assertExceptionContains(e, "unknown output prefix type");
     }
   }
+
+  @Test
+  public void testAddPrimive_WithDisabledKey_shouldFail() throws Exception {
+    PrimitiveSet<Mac> pset = PrimitiveSet.newPrimitiveSet(Mac.class);
+    Key key1 =
+        Key.newBuilder()
+            .setKeyId(1)
+            .setStatus(KeyStatusType.DISABLED)
+            .setOutputPrefixType(OutputPrefixType.TINK)
+            .build();
+    try {
+      pset.addPrimitive(new DummyMac1(), key1);
+      fail("Expected GeneralSecurityException.");
+    } catch (GeneralSecurityException e) {
+      assertExceptionContains(e, "only ENABLED key is allowed");
+    }
+  }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/PrivateKeyManagerImplTest.java b/java/src/test/java/com/google/crypto/tink/PrivateKeyManagerImplTest.java
new file mode 100644
index 0000000..d517fe1
--- /dev/null
+++ b/java/src/test/java/com/google/crypto/tink/PrivateKeyManagerImplTest.java
@@ -0,0 +1,178 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.google.crypto.tink;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.crypto.tink.TestUtil.assertExceptionContains;
+import static org.junit.Assert.fail;
+
+import com.google.crypto.tink.proto.Ed25519PrivateKey;
+import com.google.crypto.tink.proto.Ed25519PublicKey;
+import com.google.crypto.tink.proto.KeyData;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
+import com.google.crypto.tink.subtle.Random;
+import com.google.protobuf.ByteString;
+import com.google.protobuf.InvalidProtocolBufferException;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Tests the methods implemented in KeyManagerImpl using the concrete implementation above. */
+@RunWith(JUnit4.class)
+public final class PrivateKeyManagerImplTest {
+
+  private static class TestPublicKeyTypeManager extends KeyTypeManager<Ed25519PublicKey> {
+    public TestPublicKeyTypeManager() {
+      super(Ed25519PublicKey.class);
+    }
+
+    @Override
+    public String getKeyType() {
+      return "type.googleapis.com/google.crypto.tink.Ed25519PublicKey";
+    }
+
+    @Override
+    public int getVersion() {
+      return 1;
+    }
+
+    @Override
+    public KeyMaterialType keyMaterialType() {
+      return KeyMaterialType.ASYMMETRIC_PUBLIC;
+    }
+
+    @Override
+    public void validateKey(Ed25519PublicKey keyProto) throws GeneralSecurityException {
+      if (keyProto.getKeyValue().size() != 32) {
+        throw new GeneralSecurityException("validateKey(Ed25519PublicKey) failed");
+      }
+    }
+
+    @Override
+    public Ed25519PublicKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
+      return Ed25519PublicKey.parseFrom(byteString);
+    }
+  }
+
+  private static class TestPrivateKeyTypeManager
+      extends PrivateKeyTypeManager<Ed25519PrivateKey, Ed25519PublicKey> {
+    public TestPrivateKeyTypeManager() {
+      super(Ed25519PrivateKey.class, Ed25519PublicKey.class);
+    }
+
+    @Override
+    public String getKeyType() {
+      return "type.googleapis.com/google.crypto.tink.Ed25519PrivateKey";
+    }
+
+    @Override
+    public int getVersion() {
+      return 1;
+    }
+
+    @Override
+    public KeyMaterialType keyMaterialType() {
+      return KeyMaterialType.ASYMMETRIC_PRIVATE;
+    }
+
+    @Override
+    public void validateKey(Ed25519PrivateKey keyProto) throws GeneralSecurityException {
+      // Throw by hand so we can verify the exception comes from here.
+      if (keyProto.getKeyValue().size() != 32) {
+        throw new GeneralSecurityException("validateKey(Ed25519PrivateKey) failed");
+      }
+    }
+
+    @Override
+    public Ed25519PrivateKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
+      return Ed25519PrivateKey.parseFrom(byteString);
+    }
+
+    @Override
+    public Ed25519PublicKey getPublicKey(Ed25519PrivateKey privateKey) {
+      return privateKey.getPublicKey();
+    }
+  }
+
+  @Test
+  public void getPublicKeyData_works() throws Exception {
+    TestPrivateKeyTypeManager privateManager = new TestPrivateKeyTypeManager();
+    TestPublicKeyTypeManager publicManager = new TestPublicKeyTypeManager();
+    PrivateKeyManager<Void> manager =
+        new PrivateKeyManagerImpl<>(privateManager, publicManager, Void.class);
+    Ed25519PrivateKey privateKey =
+        Ed25519PrivateKey.newBuilder()
+            .setPublicKey(
+                Ed25519PublicKey.newBuilder()
+                    .setKeyValue(ByteString.copyFrom(Random.randBytes(32))))
+            .setKeyValue(ByteString.copyFrom(Random.randBytes(32)))
+            .build();
+
+    KeyData keyData = manager.getPublicKeyData(privateKey.toByteString());
+
+    assertThat(keyData.getTypeUrl())
+        .isEqualTo("type.googleapis.com/google.crypto.tink.Ed25519PublicKey");
+    Ed25519PublicKey publicKey = Ed25519PublicKey.parseFrom(keyData.getValue());
+    assertThat(publicKey).isEqualTo(privateKey.getPublicKey());
+    assertThat(keyData.getKeyMaterialType()).isEqualTo(KeyMaterialType.ASYMMETRIC_PUBLIC);
+  }
+
+  @Test
+  public void getPublicKeyData_invalidPrivateKey_throws() throws Exception {
+    TestPrivateKeyTypeManager privateManager = new TestPrivateKeyTypeManager();
+    TestPublicKeyTypeManager publicManager = new TestPublicKeyTypeManager();
+    PrivateKeyManager<Void> manager =
+        new PrivateKeyManagerImpl<>(privateManager, publicManager, Void.class);
+    Ed25519PrivateKey privateKey =
+        Ed25519PrivateKey.newBuilder()
+            .setPublicKey(
+                Ed25519PublicKey.newBuilder()
+                    .setKeyValue(ByteString.copyFrom(Random.randBytes(32))))
+            .setKeyValue(ByteString.copyFrom(Random.randBytes(33)))
+            .build();
+    ByteString privateKeyByteString = privateKey.toByteString();
+    
+    try {
+      manager.getPublicKeyData(privateKeyByteString);
+      fail();
+    } catch (GeneralSecurityException e) {
+      assertExceptionContains(e, "validateKey(Ed25519PrivateKey)");
+    }
+  }
+
+  @Test
+  public void getPublicKeyData_invalidPublicKey_throws() throws Exception {
+    TestPrivateKeyTypeManager privateManager = new TestPrivateKeyTypeManager();
+    TestPublicKeyTypeManager publicManager = new TestPublicKeyTypeManager();
+    PrivateKeyManager<Void> manager =
+        new PrivateKeyManagerImpl<>(privateManager, publicManager, Void.class);
+    Ed25519PrivateKey privateKey =
+        Ed25519PrivateKey.newBuilder()
+            .setPublicKey(
+                Ed25519PublicKey.newBuilder()
+                    .setKeyValue(ByteString.copyFrom(Random.randBytes(33))))
+            .setKeyValue(ByteString.copyFrom(Random.randBytes(32)))
+            .build();
+    ByteString privateKeyByteString = privateKey.toByteString();
+
+    try {
+      manager.getPublicKeyData(privateKeyByteString);
+      fail();
+    } catch (GeneralSecurityException e) {
+      assertExceptionContains(e, "validateKey(Ed25519PublicKey)");
+    }
+  }
+}
diff --git a/java/src/test/java/com/google/crypto/tink/RegistryTest.java b/java/src/test/java/com/google/crypto/tink/RegistryTest.java
index 6550513..641371f 100644
--- a/java/src/test/java/com/google/crypto/tink/RegistryTest.java
+++ b/java/src/test/java/com/google/crypto/tink/RegistryTest.java
@@ -28,18 +28,26 @@
 import com.google.crypto.tink.mac.MacConfig;
 import com.google.crypto.tink.mac.MacKeyTemplates;
 import com.google.crypto.tink.proto.AesEaxKey;
+import com.google.crypto.tink.proto.AesGcmKey;
+import com.google.crypto.tink.proto.AesGcmKeyFormat;
+import com.google.crypto.tink.proto.Ed25519PrivateKey;
+import com.google.crypto.tink.proto.Ed25519PublicKey;
 import com.google.crypto.tink.proto.HashType;
 import com.google.crypto.tink.proto.HmacKey;
 import com.google.crypto.tink.proto.KeyData;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.proto.KeyStatusType;
 import com.google.crypto.tink.proto.KeyTemplate;
 import com.google.crypto.tink.proto.Keyset;
 import com.google.crypto.tink.proto.OutputPrefixType;
 import com.google.crypto.tink.signature.SignatureKeyTemplates;
 import com.google.crypto.tink.subtle.AesEaxJce;
+import com.google.crypto.tink.subtle.AesGcmJce;
 import com.google.crypto.tink.subtle.EncryptThenAuthenticate;
 import com.google.crypto.tink.subtle.MacJce;
+import com.google.crypto.tink.subtle.Random;
 import com.google.protobuf.ByteString;
+import com.google.protobuf.InvalidProtocolBufferException;
 import com.google.protobuf.MessageLite;
 import java.security.GeneralSecurityException;
 import java.util.List;
@@ -106,6 +114,7 @@
 
   @Before
   public void setUp() throws GeneralSecurityException {
+    Registry.reset();
     TinkConfig.register();
   }
 
@@ -115,22 +124,22 @@
 
   @Test
   public void testGetKeyManager_legacy_shouldWork() throws Exception {
-    testGetKeyManager_shouldWork(AeadConfig.AES_CTR_HMAC_AEAD_TYPE_URL, "AesCtrHmacAeadKeyManager");
-    testGetKeyManager_shouldWork(AeadConfig.AES_EAX_TYPE_URL, "AesEaxKeyManager");
-    testGetKeyManager_shouldWork(MacConfig.HMAC_TYPE_URL, "HmacKeyManager");
+    testGetKeyManager_shouldWork(AeadConfig.AES_CTR_HMAC_AEAD_TYPE_URL, "KeyManagerImpl");
+    testGetKeyManager_shouldWork(AeadConfig.AES_EAX_TYPE_URL, "KeyManagerImpl");
+    testGetKeyManager_shouldWork(MacConfig.HMAC_TYPE_URL, "KeyManagerImpl");
   }
 
   @Test
   public void testGetKeyManager_shouldWorkAesEax() throws Exception {
     assertThat(
             Registry.getKeyManager(AeadConfig.AES_EAX_TYPE_URL, Aead.class).getClass().toString())
-        .contains("AesEaxKeyManager");
+        .contains("KeyManagerImpl");
   }
 
   @Test
   public void testGetKeyManager_shouldWorkHmac() throws Exception {
     assertThat(Registry.getKeyManager(MacConfig.HMAC_TYPE_URL, Mac.class).getClass().toString())
-        .contains("HmacKeyManager");
+        .contains("KeyManagerImpl");
   }
 
   @Test
@@ -153,9 +162,8 @@
       Registry.getKeyManager(MacConfig.HMAC_TYPE_URL, Aead.class);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertExceptionContains(e, "Primitive type com.google.crypto.tink.Mac");
-      assertExceptionContains(
-          e, "does not match requested primitive type com.google.crypto.tink.Aead");
+      assertExceptionContains(e, "com.google.crypto.tink.Mac");
+      assertExceptionContains(e, "com.google.crypto.tink.Aead not supported");
     }
   }
 
@@ -188,7 +196,7 @@
   @Test
   public void testGetUntypedKeyManager_shouldWorkHmac() throws Exception {
     assertThat(Registry.getUntypedKeyManager(MacConfig.HMAC_TYPE_URL).getClass().toString())
-        .contains("HmacKeyManager");
+        .contains("KeyManagerImpl");
   }
 
   @Test
@@ -241,7 +249,7 @@
     }
 
     KeyManager<Aead> manager = Registry.getKeyManager(AeadConfig.AES_CTR_HMAC_AEAD_TYPE_URL);
-    assertThat(manager.getClass().toString()).contains("AesCtrHmacAeadKeyManager");
+    assertThat(manager.getClass().toString()).contains("KeyManagerImpl");
   }
 
   @Test
@@ -309,7 +317,7 @@
     }
 
     KeyManager<Aead> manager = Registry.getKeyManager(AeadConfig.AES_CTR_HMAC_AEAD_TYPE_URL);
-    assertThat(manager.getClass().toString()).contains("AesCtrHmacAeadKeyManager");
+    assertThat(manager.getClass().toString()).contains("KeyManagerImpl");
   }
 
   @Test
@@ -424,7 +432,7 @@
                         .build())
                 .setPrimaryKeyId(2)
                 .build());
-    PrimitiveSet<Aead> aeadSet = Registry.getPrimitives(keysetHandle);
+    PrimitiveSet<Aead> aeadSet = Registry.getPrimitives(keysetHandle, Aead.class);
 
     assertThat(aeadSet.getPrimary().getPrimitive().getClass()).isEqualTo(AesEaxJce.class);
   }
@@ -641,6 +649,13 @@
                         .setStatus(KeyStatusType.DISABLED)
                         .setOutputPrefixType(OutputPrefixType.TINK)
                         .build())
+                .addKey(
+                    Keyset.Key.newBuilder()
+                        .setKeyData(key1)
+                        .setKeyId(2)
+                        .setStatus(KeyStatusType.ENABLED)
+                        .setOutputPrefixType(OutputPrefixType.TINK)
+                        .build())
                 .setPrimaryKeyId(1)
                 .build());
 
@@ -678,7 +693,7 @@
                 .build());
 
     try {
-      Registry.getPrimitives(keysetHandle, Aead.class);
+      Registry.getPrimitives(keysetHandle, Mac.class);
       fail("Invalid keyset. Expect GeneralSecurityException");
     } catch (GeneralSecurityException e) {
       assertExceptionContains(e, "keyset contains multiple primary keys");
@@ -688,8 +703,8 @@
   @Test
   public void testGetPrimitives_KeysetWithKeyForWrongPrimitive_shouldThrowException()
       throws Exception {
-    // Try a keyset with some keys non-ENABLED.
     KeyData key1 = Registry.newKeyData(AeadKeyTemplates.AES128_EAX);
+    // This MAC key should cause an exception.
     KeyData key2 = Registry.newKeyData(MacKeyTemplates.HMAC_SHA256_128BITTAG);
     KeyData key3 = Registry.newKeyData(AeadKeyTemplates.AES128_EAX);
     KeysetHandle keysetHandle =
@@ -722,8 +737,575 @@
       Registry.getPrimitives(keysetHandle, Aead.class);
       fail("Non Aead keys. Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertExceptionContains(e, "Primitive type com.google.crypto.tink.Mac");
-      assertExceptionContains(e, "not match requested primitive type com.google.crypto.tink.Aead");
+      assertExceptionContains(e, "com.google.crypto.tink.Mac");
+      assertExceptionContains(e, "com.google.crypto.tink.Aead not supported");
+    }
+  }
+
+  /** Implementation of a KeyTypeManager for testing. */
+  private static class TestKeyTypeManager extends KeyTypeManager<AesGcmKey> {
+    public TestKeyTypeManager() {
+      super(
+          AesGcmKey.class,
+          new PrimitiveFactory<Aead, AesGcmKey>(Aead.class) {
+            @Override
+            public Aead getPrimitive(AesGcmKey key) throws GeneralSecurityException {
+              return new AesGcmJce(key.getKeyValue().toByteArray());
+            }
+          },
+          new PrimitiveFactory<FakeAead, AesGcmKey>(FakeAead.class) {
+            @Override
+            public FakeAead getPrimitive(AesGcmKey key) {
+              return new FakeAead();
+            }
+          });
+    }
+
+    @Override
+    public String getKeyType() {
+      return "type.googleapis.com/google.crypto.tink.AesGcmKey";
+    }
+
+    @Override
+    public int getVersion() {
+      return 1;
+    }
+
+    @Override
+    public KeyMaterialType keyMaterialType() {
+      return KeyMaterialType.SYMMETRIC;
+    }
+
+    @Override
+    public void validateKey(AesGcmKey keyProto) throws GeneralSecurityException {
+      // Throw by hand so we can verify the exception comes from here.
+      if (keyProto.getKeyValue().size() != 16) {
+        throw new GeneralSecurityException("validateKey(AesGcmKey) failed");
+      }
+    }
+
+    @Override
+    public AesGcmKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
+      return AesGcmKey.parseFrom(byteString);
+    }
+
+    @Override
+    public KeyFactory<AesGcmKeyFormat, AesGcmKey> keyFactory() {
+      return new KeyFactory<AesGcmKeyFormat, AesGcmKey>(AesGcmKeyFormat.class) {
+        @Override
+        public void validateKeyFormat(AesGcmKeyFormat format) throws GeneralSecurityException {
+          // Throw by hand so we can verify the exception comes from here.
+          if (format.getKeySize() != 16) {
+            throw new GeneralSecurityException("validateKeyFormat(AesGcmKeyFormat) failed");
+          }
+        }
+
+        @Override
+        public AesGcmKeyFormat parseKeyFormat(ByteString byteString)
+            throws InvalidProtocolBufferException {
+          return AesGcmKeyFormat.parseFrom(byteString);
+        }
+
+        @Override
+        public AesGcmKey createKey(AesGcmKeyFormat format) throws GeneralSecurityException {
+          return AesGcmKey.newBuilder()
+              .setKeyValue(ByteString.copyFrom(Random.randBytes(format.getKeySize())))
+              .setVersion(getVersion())
+              .build();
+        }
+      };
+    }
+  }
+
+  @Test
+  public void testRegisterKeyTypeManager() throws Exception {
+    Registry.reset();
+    Registry.registerKeyManager(new TestKeyTypeManager(), true);
+  }
+
+  @Test
+  public void testRegisterKeyTypeManager_getKeyManagerAead_works() throws Exception {
+    Registry.reset();
+    TestKeyTypeManager testKeyTypeManager = new TestKeyTypeManager();
+    Registry.registerKeyManager(testKeyTypeManager, true);
+    KeyManager<Aead> km = Registry.getKeyManager(testKeyTypeManager.getKeyType(), Aead.class);
+    assertThat(km.getKeyType()).isEqualTo(testKeyTypeManager.getKeyType());
+  }
+
+  @Test
+  public void testRegisterKeyTypeManager_getKeyManagerFakeAead_works() throws Exception {
+    Registry.reset();
+    TestKeyTypeManager testKeyTypeManager = new TestKeyTypeManager();
+    Registry.registerKeyManager(testKeyTypeManager, true);
+    KeyManager<FakeAead> km =
+        Registry.getKeyManager(testKeyTypeManager.getKeyType(), FakeAead.class);
+    assertThat(km.getKeyType()).isEqualTo(testKeyTypeManager.getKeyType());
+  }
+
+  @Test
+  public void testRegisterKeyTypeManager_getKeyManagerMac_throws() throws Exception {
+    Registry.reset();
+    TestKeyTypeManager testKeyTypeManager = new TestKeyTypeManager();
+    Registry.registerKeyManager(testKeyTypeManager, true);
+    try {
+      Registry.getKeyManager(testKeyTypeManager.getKeyType(), Mac.class);
+      fail();
+    } catch (GeneralSecurityException e) {
+        assertExceptionContains(e, "com.google.crypto.tink.Mac");
+        assertExceptionContains(e, "com.google.crypto.tink.Aead");
+        assertExceptionContains(e, "com.google.crypto.tink.RegistryTest.FakeAead");
+    }
+  }
+
+  // Checks that calling getUntypedKeyManager will return the keymanager for the *first* implemented
+  // class in the constructor.
+  @Test
+  public void testRegisterKeyTypeManager_getUntypedKeyManager_returnsAead() throws Exception {
+    Registry.reset();
+    TestKeyTypeManager testKeyTypeManager = new TestKeyTypeManager();
+    Registry.registerKeyManager(testKeyTypeManager, true);
+    KeyManager<?> km = Registry.getUntypedKeyManager(testKeyTypeManager.getKeyType());
+    assertThat(km.getPrimitiveClass()).isEqualTo(Aead.class);
+  }
+
+  @Test
+  public void testRegisterKeyTypeManager_MoreRestrictedNewKeyAllowed_shouldWork() throws Exception {
+    Registry.reset();
+    Registry.registerKeyManager(new TestKeyTypeManager(), true);
+    Registry.registerKeyManager(new TestKeyTypeManager(), false);
+  }
+
+  @Test
+  public void testRegisterKeyTypeManager_SameNewKeyAllowed_shouldWork() throws Exception {
+    Registry.reset();
+    Registry.registerKeyManager(new TestKeyTypeManager(), true);
+    Registry.registerKeyManager(new TestKeyTypeManager(), true);
+    Registry.registerKeyManager(new TestKeyTypeManager(), false);
+    Registry.registerKeyManager(new TestKeyTypeManager(), false);
+  }
+
+  @Test
+  public void testRegisterKeyTypeManager_LessRestrictedNewKeyAllowed_throws() throws Exception {
+    Registry.reset();
+    Registry.registerKeyManager(new TestKeyTypeManager(), false);
+    try {
+      Registry.registerKeyManager(new TestKeyTypeManager(), true);
+      fail("Expected GeneralSecurityException");
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void testRegisterKeyTypeManager_DifferentClass_throws() throws Exception {
+    Registry.reset();
+    Registry.registerKeyManager(new TestKeyTypeManager(), true);
+    try {
+      // Note: due to the {} this is a subclass of TestKeyTypeManager.
+      Registry.registerKeyManager(new TestKeyTypeManager() {}, true);
+      fail("Expected GeneralSecurityException");
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void testRegisterKeyTypeManager_AfterKeyManager_throws() throws Exception {
+    Registry.reset();
+    Registry.registerKeyManager(new CustomAeadKeyManager(new TestKeyTypeManager().getKeyType()));
+    try {
+      Registry.registerKeyManager(new TestKeyTypeManager(), true);
+      fail("Expected GeneralSecurityException");
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void testRegisterKeyTypeManager_BeforeKeyManager_throws() throws Exception {
+    Registry.reset();
+    Registry.registerKeyManager(new TestKeyTypeManager(), true);
+    try {
+      Registry.registerKeyManager(new CustomAeadKeyManager(new TestKeyTypeManager().getKeyType()));
+      fail("Expected GeneralSecurityException");
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  private static class PublicPrimitiveA {}
+
+  private static class PublicPrimitiveB {}
+
+  private static class TestPublicKeyTypeManager extends KeyTypeManager<Ed25519PublicKey> {
+
+    public TestPublicKeyTypeManager() {
+      super(
+          Ed25519PublicKey.class,
+          new PrimitiveFactory<PublicPrimitiveA, Ed25519PublicKey>(PublicPrimitiveA.class) {
+            @Override
+            public PublicPrimitiveA getPrimitive(Ed25519PublicKey key) {
+              return new PublicPrimitiveA();
+            }
+          },
+          new PrimitiveFactory<PublicPrimitiveB, Ed25519PublicKey>(PublicPrimitiveB.class) {
+            @Override
+            public PublicPrimitiveB getPrimitive(Ed25519PublicKey key) {
+              return new PublicPrimitiveB();
+            }
+          });
+    }
+
+    @Override
+    public String getKeyType() {
+      return "type.googleapis.com/google.crypto.tink.Ed25519PublicKey";
+    }
+
+    @Override
+    public int getVersion() {
+      return 1;
+    }
+
+    @Override
+    public KeyMaterialType keyMaterialType() {
+      return KeyMaterialType.ASYMMETRIC_PUBLIC;
+    }
+
+    @Override
+    public void validateKey(Ed25519PublicKey keyProto) throws GeneralSecurityException {
+      if (keyProto.getKeyValue().size() != 32) {
+        throw new GeneralSecurityException("validateKey(Ed25519PublicKey) failed");
+      }
+    }
+
+    @Override
+    public Ed25519PublicKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
+      return Ed25519PublicKey.parseFrom(byteString);
+    }
+  }
+
+  private static class PrivatePrimitiveA {}
+
+  private static class PrivatePrimitiveB {}
+
+  private static class TestPrivateKeyTypeManager
+      extends PrivateKeyTypeManager<Ed25519PrivateKey, Ed25519PublicKey> {
+    public TestPrivateKeyTypeManager() {
+      super(
+          Ed25519PrivateKey.class,
+          Ed25519PublicKey.class,
+          new PrimitiveFactory<PrivatePrimitiveA, Ed25519PrivateKey>(PrivatePrimitiveA.class) {
+            @Override
+            public PrivatePrimitiveA getPrimitive(Ed25519PrivateKey key) {
+              return new PrivatePrimitiveA();
+            }
+          },
+          new PrimitiveFactory<PrivatePrimitiveB, Ed25519PrivateKey>(PrivatePrimitiveB.class) {
+            @Override
+            public PrivatePrimitiveB getPrimitive(Ed25519PrivateKey key) {
+              return new PrivatePrimitiveB();
+            }
+          });
+    }
+
+    @Override
+    public String getKeyType() {
+      return "type.googleapis.com/google.crypto.tink.Ed25519PrivateKey";
+    }
+
+    @Override
+    public int getVersion() {
+      return 1;
+    }
+
+    @Override
+    public KeyMaterialType keyMaterialType() {
+      return KeyMaterialType.ASYMMETRIC_PRIVATE;
+    }
+
+    @Override
+    public void validateKey(Ed25519PrivateKey keyProto) throws GeneralSecurityException {
+      // Throw by hand so we can verify the exception comes from here.
+      if (keyProto.getKeyValue().size() != 32) {
+        throw new GeneralSecurityException("validateKey(Ed25519PrivateKey) failed");
+      }
+    }
+
+    @Override
+    public Ed25519PrivateKey parseKey(ByteString byteString) throws InvalidProtocolBufferException {
+      return Ed25519PrivateKey.parseFrom(byteString);
+    }
+
+    @Override
+    public Ed25519PublicKey getPublicKey(Ed25519PrivateKey privateKey) {
+      return privateKey.getPublicKey();
+    }
+  }
+
+  @Test
+  public void testRegisterAssymmetricKeyManagers() throws Exception {
+    Registry.reset();
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), true);
+  }
+
+  @Test
+  public void testRegisterAssymmetricKeyManagers_getPrivateKeyManagerPrimitiveA_works()
+      throws Exception {
+    Registry.reset();
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), true);
+    KeyManager<PrivatePrimitiveA> km =
+        Registry.getKeyManager(
+            new TestPrivateKeyTypeManager().getKeyType(), PrivatePrimitiveA.class);
+    assertThat(km.getKeyType()).isEqualTo(new TestPrivateKeyTypeManager().getKeyType());
+  }
+
+  @Test
+  public void testRegisterAssymmetricKeyManagers_getPrivateKeyManagerPrimitiveB_works()
+      throws Exception {
+    Registry.reset();
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), true);
+    KeyManager<PrivatePrimitiveB> km =
+        Registry.getKeyManager(
+            new TestPrivateKeyTypeManager().getKeyType(), PrivatePrimitiveB.class);
+    assertThat(km.getKeyType()).isEqualTo(new TestPrivateKeyTypeManager().getKeyType());
+  }
+
+  @Test
+  public void testRegisterAssymmetricKeyManagers_getPrivateKeyManagerPublicA_works()
+      throws Exception {
+    Registry.reset();
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), true);
+    KeyManager<PublicPrimitiveA> km =
+        Registry.getKeyManager(new TestPublicKeyTypeManager().getKeyType(), PublicPrimitiveA.class);
+    assertThat(km.getKeyType()).isEqualTo(new TestPublicKeyTypeManager().getKeyType());
+  }
+
+  @Test
+  public void testRegisterAssymmetricKeyManagers_getPrivateKeyManagerPublicB_works()
+      throws Exception {
+    Registry.reset();
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), true);
+    KeyManager<PublicPrimitiveB> km =
+        Registry.getKeyManager(new TestPublicKeyTypeManager().getKeyType(), PublicPrimitiveB.class);
+    assertThat(km.getKeyType()).isEqualTo(new TestPublicKeyTypeManager().getKeyType());
+  }
+
+  @Test
+  public void testRegisterAssymmetricKeyManagers_getPrivateKeyManagerWrongPrimitive_throws()
+      throws Exception {
+    Registry.reset();
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), true);
+    try {
+      Registry.getKeyManager(new TestPrivateKeyTypeManager().getKeyType(), Mac.class);
+      fail();
+    } catch (GeneralSecurityException e) {
+      assertExceptionContains(e, "com.google.crypto.tink.Mac");
+      assertExceptionContains(e, "PrivatePrimitiveA");
+      assertExceptionContains(e, "PrivatePrimitiveB");
+    }
+  }
+
+  @Test
+  public void testRegisterAssymmetricKeyManagers_getPublicKeyManagerWrongPrimitive_throws()
+      throws Exception {
+    Registry.reset();
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), true);
+    try {
+      Registry.getKeyManager(new TestPublicKeyTypeManager().getKeyType(), Mac.class);
+      fail();
+    } catch (GeneralSecurityException e) {
+      assertExceptionContains(e, "com.google.crypto.tink.Mac");
+      assertExceptionContains(e, "PublicPrimitiveA");
+      assertExceptionContains(e, "PublicPrimitiveB");
+    }
+  }
+
+  // Checks that calling getUntypedKeyManager will return the keymanager for the *first* implemented
+  // class in the constructor.
+  @Test
+  public void testRegisterAssymmetricKeyManagers_getUntypedPrivateKeyManager_returnsPrimitiveA()
+      throws Exception {
+    Registry.reset();
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), true);
+    KeyManager<?> km = Registry.getUntypedKeyManager(new TestPrivateKeyTypeManager().getKeyType());
+    assertThat(km.getPrimitiveClass()).isEqualTo(PrivatePrimitiveA.class);
+  }
+
+  // Checks that calling getUntypedKeyManager will return the keymanager for the *first* implemented
+  // class in the constructor.
+  @Test
+  public void testRegisterAssymmetricKeyManagers_getUntypedPublicKeyManager_returnsPrimitiveA()
+      throws Exception {
+    Registry.reset();
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), true);
+    KeyManager<?> km = Registry.getUntypedKeyManager(new TestPublicKeyTypeManager().getKeyType());
+    assertThat(km.getPrimitiveClass()).isEqualTo(PublicPrimitiveA.class);
+  }
+
+  @Test
+  public void testRegisterAssymmetricKeyManagers_MoreRestrictedNewKeyAllowed_shouldWork()
+      throws Exception {
+    Registry.reset();
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), true);
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), false);
+  }
+
+  @Test
+  public void testRegisterAssymmetricKeyManagers_SameNewKeyAllowed_shouldWork() throws Exception {
+    Registry.reset();
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), true);
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), true);
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), false);
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), false);
+  }
+
+  @Test
+  public void testRegisterAssymmetricKeyManagers_LessRestrictedNewKeyAllowed_throws()
+      throws Exception {
+    Registry.reset();
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), false);
+    try {
+      Registry.registerAsymmetricKeyManagers(
+          new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), true);
+      fail("Expected GeneralSecurityException");
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void testRegisterAssymmetricKeyManagers_PublicKeyManagerCanBeRegisteredAlone()
+      throws Exception {
+    Registry.reset();
+    Registry.registerKeyManager(new TestPublicKeyTypeManager(), false);
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), true);
+    Registry.registerKeyManager(new TestPublicKeyTypeManager(), false);
+  }
+
+  @Test
+  public void testRegisterAssymmetricKeyManagers_PublicKeyManagerReRegister_getPublicKeyData()
+      throws Exception {
+    Registry.reset();
+    Registry.registerKeyManager(new TestPublicKeyTypeManager(), false);
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), true);
+    Registry.registerKeyManager(new TestPublicKeyTypeManager(), false);
+
+    // Check that getPublicKeyData works now.
+    Ed25519PrivateKey privateKey =
+        Ed25519PrivateKey.newBuilder()
+            .setKeyValue(ByteString.copyFrom(Random.randBytes(32)))
+            .setPublicKey(
+                Ed25519PublicKey.newBuilder()
+                    .setKeyValue(ByteString.copyFrom(Random.randBytes(32))))
+            .build();
+    KeyData publicKeyData =
+        Registry.getPublicKeyData(
+            new TestPrivateKeyTypeManager().getKeyType(), privateKey.toByteString());
+    assertThat(publicKeyData.getTypeUrl()).isEqualTo(new TestPublicKeyTypeManager().getKeyType());
+    Ed25519PublicKey publicKey = Ed25519PublicKey.parseFrom(publicKeyData.getValue());
+    assertThat(publicKey.getKeyValue()).isEqualTo(privateKey.getPublicKey().getKeyValue());
+  }
+
+  @Test
+  public void testRegisterAssymmetricKeyManagers_DifferentClassPrivateKey_throws()
+      throws Exception {
+    Registry.reset();
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), true);
+    try {
+      // Note: due to the {} this is a subclass of TestPrivateKeyTypeManager.
+      Registry.registerAsymmetricKeyManagers(
+          new TestPrivateKeyTypeManager() {}, new TestPublicKeyTypeManager(), true);
+      fail("Expected GeneralSecurityException");
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void testRegisterAssymmetricKeyManagers_DifferentClassPublicKey_throws()
+      throws Exception {
+    Registry.reset();
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), true);
+    try {
+      // Note: due to the {} this is a subclass of TestPublicKeyTypeManager.
+      Registry.registerAsymmetricKeyManagers(
+          new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager() {}, true);
+      fail("Expected GeneralSecurityException");
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void testRegisterAssymmetricKeyManagers_thenNormalRegister_throws()
+      throws Exception {
+    Registry.reset();
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), true);
+    try {
+      // Note: due to the {} this is a subclass.
+      Registry.registerKeyManager(new TestPrivateKeyTypeManager() {}, true);
+      fail("Expected GeneralSecurityException");
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void testRegisterAssymmetricKeyManagers_thenNormalRegisterForPublic_throws()
+      throws Exception {
+    Registry.reset();
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), true);
+    try {
+      // Note: due to the {} this is a subclass.
+      Registry.registerKeyManager(new TestPublicKeyTypeManager() {}, true);
+      fail("Expected GeneralSecurityException");
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void testRegisterAssymmetricKeyManagers_ThrowsWithDifferentPublicKeyManager()
+      throws Exception {
+    Registry.reset();
+    Registry.registerAsymmetricKeyManagers(
+        new TestPrivateKeyTypeManager(), new TestPublicKeyTypeManager(), true);
+    try {
+      Registry.registerAsymmetricKeyManagers(
+          new TestPrivateKeyTypeManager(),
+          new TestPublicKeyTypeManager() {
+            @Override
+            public String getKeyType() {
+              return "bla";
+            }
+          },
+          true);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // Expected.
+      assertExceptionContains(e, "public key manager corresponding to");
     }
   }
 
@@ -878,4 +1460,6 @@
       assertExceptionContains(e, "Aead");
     }
   }
+
+  private static class FakeAead {}
 }
diff --git a/java/src/test/java/com/google/crypto/tink/TestUtil.java b/java/src/test/java/com/google/crypto/tink/TestUtil.java
index 8ed92a9..4b1ef0f 100644
--- a/java/src/test/java/com/google/crypto/tink/TestUtil.java
+++ b/java/src/test/java/com/google/crypto/tink/TestUtil.java
@@ -104,6 +104,13 @@
   // {@code RESTRICTED_CRYPTO_KEY_URI}.
   public static final String SERVICE_ACCOUNT_FILE = "testdata/credential.json";
 
+  // This AWS KMS CryptoKey is restricted to Google use only and {@code AWS_CREDS}.
+  public static final String AWS_CRYPTO_URI = "aws-kms://arn:aws:kms:us-east-2:235739564943:key/3ee50705-5a82-4f5b-9753-05c4f473922f";
+
+  // This is a credential for the AWS service account with granted access to
+  // {@code AWS_CRYPTO_URI}.
+  public static final String AWS_CREDS = "testdata/credentials_aws.cred";
+
   /** A dummy Aead-implementation that just throws exception. */
   public static class DummyAead implements Aead {
     public DummyAead() {}
@@ -530,6 +537,17 @@
   }
 
   /**
+   * Check that this is running in Remote Build Execution.
+   *
+   * @return true if running on Remote Build Execution.
+   */
+  public static boolean isRemoteBuildExecution() {
+    // This check depends on the system property rbe being set to 1.
+    // The property is set in kokoro/presubmit-remote.sh via bazel: --jvmopt=-Drbe=1.
+    return "1".equals(System.getProperty("rbe"));
+  }
+
+  /**
    * Best-effort checks that this is running under tsan. Returns false in doubt and externally to
    * google.
    */
diff --git a/java/src/test/java/com/google/crypto/tink/UtilTest.java b/java/src/test/java/com/google/crypto/tink/UtilTest.java
index 909b980..85ae525 100644
--- a/java/src/test/java/com/google/crypto/tink/UtilTest.java
+++ b/java/src/test/java/com/google/crypto/tink/UtilTest.java
@@ -21,8 +21,6 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import com.google.crypto.tink.aead.AeadKeyTemplates;
-import com.google.crypto.tink.config.TinkConfig;
 import com.google.crypto.tink.proto.KeyData;
 import com.google.crypto.tink.proto.KeyStatusType;
 import com.google.crypto.tink.proto.Keyset;
@@ -38,7 +36,7 @@
 @RunWith(JUnit4.class)
 public class UtilTest {
   @Test
-  public void testValidateKeyset() throws Exception {
+  public void testValidateKeyset_shouldWork() throws Exception {
     String keyValue = "01234567890123456";
     Keyset keyset =
         TestUtil.createKeyset(
@@ -52,15 +50,21 @@
     } catch (GeneralSecurityException e) {
       fail("Valid keyset; should not throw Exception: " + e);
     }
+  }
 
-    // Empty keyset.
+  @Test
+  public void testValidateKeyset_emptyKeyset_shouldFail() throws Exception {
     try {
       Util.validateKeyset(Keyset.newBuilder().build());
       fail("Invalid keyset. Expect GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertExceptionContains(e, "empty keyset");
+      assertExceptionContains(e, "keyset must contain at least one ENABLED key");
     }
+  }
 
+  @Test
+  public void testValidateKeyset_multiplePrimaryKeys_shouldFail() throws Exception {
+    String keyValue = "01234567890123456";
     // Multiple primary keys.
     Keyset invalidKeyset =
         TestUtil.createKeyset(
@@ -80,14 +84,23 @@
     } catch (GeneralSecurityException e) {
       assertExceptionContains(e, "keyset contains multiple primary keys");
     }
+  }
 
+  @Test
+  public void testValidateKeyset_primaryKeyIsDisabled_shouldFail() throws Exception {
+    String keyValue = "01234567890123456";
     // Primary key is disabled.
-    invalidKeyset =
+    Keyset invalidKeyset =
         TestUtil.createKeyset(
             TestUtil.createKey(
                 TestUtil.createHmacKeyData(keyValue.getBytes("UTF-8"), 16),
                 42,
                 KeyStatusType.DISABLED,
+                OutputPrefixType.TINK),
+            TestUtil.createKey(
+                TestUtil.createHmacKeyData(keyValue.getBytes("UTF-8"), 16),
+                43,
+                KeyStatusType.ENABLED,
                 OutputPrefixType.TINK));
     try {
       Util.validateKeyset(invalidKeyset);
@@ -95,9 +108,37 @@
     } catch (GeneralSecurityException e) {
       assertExceptionContains(e, "keyset doesn't contain a valid primary key");
     }
+  }
 
+  @Test
+  public void testValidateKeyset_noEnabledKey_shouldFail() throws Exception {
+    String keyValue = "01234567890123456";
+    // No ENABLED key.
+    Keyset invalidKeyset =
+        TestUtil.createKeyset(
+            TestUtil.createKey(
+                TestUtil.createHmacKeyData(keyValue.getBytes("UTF-8"), 16),
+                42,
+                KeyStatusType.DISABLED,
+                OutputPrefixType.TINK),
+            TestUtil.createKey(
+                TestUtil.createHmacKeyData(keyValue.getBytes("UTF-8"), 16),
+                42,
+                KeyStatusType.DESTROYED,
+                OutputPrefixType.TINK));
+    try {
+      Util.validateKeyset(invalidKeyset);
+      fail("Invalid keyset. Expect GeneralSecurityException");
+    } catch (GeneralSecurityException e) {
+      assertExceptionContains(e, "keyset must contain at least one ENABLED key");
+    }
+  }
+
+  @Test
+  public void testValidateKeyset_noPrimaryKey_shouldFail() throws Exception {
+    String keyValue = "01234567890123456";
     // No primary key.
-    invalidKeyset =
+    Keyset invalidKeyset =
         Keyset.newBuilder()
             .addKey(
                 Keyset.Key.newBuilder()
@@ -113,7 +154,11 @@
     } catch (GeneralSecurityException e) {
       assertExceptionContains(e, "keyset doesn't contain a valid primary key");
     }
+  }
 
+  @Test
+  public void testValidateKeyset_noPrimaryKey_keysetContainsOnlyPublicKeys_shouldWork()
+      throws Exception {
     // No primary key, but contains only public key material.
     Keyset validKeyset =
         Keyset.newBuilder()
@@ -137,13 +182,25 @@
   }
 
   @Test
-  public void testValidateKeyset_withDestroyedKey() throws Exception {
-    TinkConfig.register();
-    KeysetManager keysetManager = KeysetManager.withEmptyKeyset();
-    keysetManager.addNewKey(AeadKeyTemplates.AES128_GCM, true);
-    int secondaryKey = keysetManager.addNewKey(AeadKeyTemplates.AES128_GCM, false);
-    keysetManager.destroy(secondaryKey);
-    Util.validateKeyset(CleartextKeysetHandle.getKeyset(keysetManager.getKeysetHandle()));
+  public void testValidateKeyset_withDestroyedKey_shouldWork() throws Exception {
+    String keyValue = "01234567890123456";
+    Keyset validKeyset =
+        TestUtil.createKeyset(
+            TestUtil.createKey(
+                TestUtil.createHmacKeyData(keyValue.getBytes("UTF-8"), 16),
+                42,
+                KeyStatusType.ENABLED,
+                OutputPrefixType.TINK),
+            TestUtil.createKey(
+                TestUtil.createHmacKeyData(keyValue.getBytes("UTF-8"), 16),
+                42,
+                KeyStatusType.DESTROYED,
+                OutputPrefixType.TINK));
+    try {
+      Util.validateKeyset(validKeyset);
+    } catch (GeneralSecurityException e) {
+      fail("Valid keyset, should not fail: " + e);
+    }
   }
 
   /** Tests that getKeysetInfo doesn't contain key material. */
diff --git a/java/src/test/java/com/google/crypto/tink/aead/AeadCatalogueTest.java b/java/src/test/java/com/google/crypto/tink/aead/AeadCatalogueTest.java
deleted file mode 100644
index 8becb9a..0000000
--- a/java/src/test/java/com/google/crypto/tink/aead/AeadCatalogueTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package com.google.crypto.tink.aead;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import com.google.crypto.tink.Aead;
-import com.google.crypto.tink.KeyManager;
-import com.google.crypto.tink.proto.KeyTypeEntry;
-import com.google.crypto.tink.proto.RegistryConfig;
-import java.security.GeneralSecurityException;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for AeadCatalogue.
- */
-@RunWith(JUnit4.class)
-public class AeadCatalogueTest {
-
-  @Test
-  public void testBasic() throws Exception {
-    AeadCatalogue catalogue = new AeadCatalogue();
-
-    // Check a single key type, incl. case-insensitve primitive name.
-    String keyType = "type.googleapis.com/google.crypto.tink.AesGcmKey";
-    {
-      KeyManager<Aead> manager = catalogue.getKeyManager(keyType, "Aead", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-    {
-      KeyManager<Aead> manager = catalogue.getKeyManager(keyType, "AEaD", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-    {
-      KeyManager<Aead> manager = catalogue.getKeyManager(keyType, "aeAD", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-
-    // Check all entries from the current AeadConfig.
-    RegistryConfig config = AeadConfig.TINK_1_0_0;
-    int count = 0;
-    for (KeyTypeEntry entry : config.getEntryList()) {
-      if ("Aead".equals(entry.getPrimitiveName())) {
-        count = count + 1;
-        KeyManager<Aead> manager = catalogue.getKeyManager(
-            entry.getTypeUrl(), "aead", entry.getKeyManagerVersion());
-        assertThat(manager.doesSupport(entry.getTypeUrl())).isTrue();
-      }
-    }
-    assertEquals(6, count);
-  }
-
-  @Test
-  public void testErrors() throws Exception {
-    AeadCatalogue catalogue = new AeadCatalogue();
-    String keyType = "type.googleapis.com/google.crypto.tink.AesGcmKey";
-
-    // Wrong primitive name.
-    try {
-      catalogue.getKeyManager(keyType, "mac", 0);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No support for primitive");
-    }
-
-    // Wrong key manager version.
-    try {
-      catalogue.getKeyManager(keyType, "aead", 1);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No key manager");
-      assertThat(e.toString()).contains("version at least");
-    }
-
-    // Wrong key type.
-    try {
-      catalogue.getKeyManager("some.unknown.key.type", "aead", 0);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No support for primitive");
-      assertThat(e.toString()).contains("with key type");
-    }
-  }
-}
diff --git a/java/src/test/java/com/google/crypto/tink/aead/AeadConfigTest.java b/java/src/test/java/com/google/crypto/tink/aead/AeadConfigTest.java
index bfa7381..cf19072 100644
--- a/java/src/test/java/com/google/crypto/tink/aead/AeadConfigTest.java
+++ b/java/src/test/java/com/google/crypto/tink/aead/AeadConfigTest.java
@@ -17,12 +17,10 @@
 package com.google.crypto.tink.aead;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
+import com.google.crypto.tink.Aead;
 import com.google.crypto.tink.Registry;
-import com.google.crypto.tink.TestUtil;
-import com.google.crypto.tink.proto.RegistryConfig;
 import java.security.GeneralSecurityException;
 import org.junit.FixMethodOrder;
 import org.junit.Test;
@@ -59,7 +57,7 @@
     // Before registration, key manager should be absent.
     String typeUrl = "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey";
     try {
-      Registry.getKeyManager(typeUrl);
+      Registry.getUntypedKeyManager(typeUrl);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
       assertThat(e.toString()).contains("No key manager found");
@@ -68,192 +66,10 @@
     // Initialize the config.
     AeadConfig.register();
 
-    // Now the catalogues should be present.
-    Registry.getCatalogue("tinkmac");
-    Registry.getCatalogue("tinkaead");
-
     // After registration the key manager should be present.
-    Registry.getKeyManager(typeUrl);
+    Registry.getKeyManager(typeUrl, Aead.class);
 
     // Running init() manually again should succeed.
     AeadConfig.register();
   }
-
-  @Test
-  public void testConfigContents1_0_0() throws Exception {
-    RegistryConfig config = AeadConfig.TINK_1_0_0;
-    assertEquals(7, config.getEntryCount());
-    assertEquals("TINK_AEAD_1_0_0", config.getConfigName());
-
-    TestUtil.verifyConfigEntry(
-        config.getEntry(0),
-        "TinkMac",
-        "Mac",
-        "type.googleapis.com/google.crypto.tink.HmacKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(1),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(2),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesEaxKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(3),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesGcmKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(4),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.ChaCha20Poly1305Key",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(5),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.KmsAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(6),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.KmsEnvelopeAeadKey",
-        true,
-        0);
-  }
-
-  @Test
-  public void testConfigContents1_1_0() throws Exception {
-    RegistryConfig config = AeadConfig.TINK_1_1_0;
-    assertEquals(7, config.getEntryCount());
-    assertEquals("TINK_AEAD_1_1_0", config.getConfigName());
-
-    TestUtil.verifyConfigEntry(
-        config.getEntry(0),
-        "TinkMac",
-        "Mac",
-        "type.googleapis.com/google.crypto.tink.HmacKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(1),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(2),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesEaxKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(3),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesGcmKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(4),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.ChaCha20Poly1305Key",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(5),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.KmsAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(6),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.KmsEnvelopeAeadKey",
-        true,
-        0);
-  }
-
-  @Test
-  public void testConfigContents_LATEST() throws Exception {
-    RegistryConfig config = AeadConfig.LATEST;
-    assertEquals(8, config.getEntryCount());
-    assertEquals("TINK_AEAD", config.getConfigName());
-
-    TestUtil.verifyConfigEntry(
-        config.getEntry(0),
-        "TinkMac",
-        "Mac",
-        "type.googleapis.com/google.crypto.tink.HmacKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(1),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(2),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesEaxKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(3),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesGcmKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(4),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.ChaCha20Poly1305Key",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(5),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.KmsAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(6),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.KmsEnvelopeAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(7),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.XChaCha20Poly1305Key",
-        true,
-        0);
-  }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/aead/AeadFactoryTest.java b/java/src/test/java/com/google/crypto/tink/aead/AeadFactoryTest.java
index 76d5cfd..37f391f 100644
--- a/java/src/test/java/com/google/crypto/tink/aead/AeadFactoryTest.java
+++ b/java/src/test/java/com/google/crypto/tink/aead/AeadFactoryTest.java
@@ -221,7 +221,7 @@
       keysetHandle.getPrimitive(Aead.class);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertExceptionContains(e, "Primitive type com.google.crypto.tink.DeterministicAead");
+      assertExceptionContains(e, "com.google.crypto.tink.DeterministicAead");
     }
 
     // invalid as the primary key.
@@ -230,7 +230,7 @@
       keysetHandle.getPrimitive(Aead.class);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertExceptionContains(e, "Primitive type com.google.crypto.tink.DeterministicAead");
+      assertExceptionContains(e, "com.google.crypto.tink.DeterministicAead");
     }
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/aead/AeadIntegrationTest.java b/java/src/test/java/com/google/crypto/tink/aead/AeadIntegrationTest.java
index d67bb9d..af39f56 100644
--- a/java/src/test/java/com/google/crypto/tink/aead/AeadIntegrationTest.java
+++ b/java/src/test/java/com/google/crypto/tink/aead/AeadIntegrationTest.java
@@ -226,7 +226,7 @@
       keysetHandle.getPrimitive(Aead.class);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertExceptionContains(e, "Primitive type com.google.crypto.tink.DeterministicAead");
+      assertExceptionContains(e, "com.google.crypto.tink.DeterministicAead");
     }
 
     // invalid as the primary key.
@@ -235,7 +235,7 @@
       keysetHandle.getPrimitive(Aead.class);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertExceptionContains(e, "Primitive type com.google.crypto.tink.DeterministicAead");
+      assertExceptionContains(e, "com.google.crypto.tink.DeterministicAead");
     }
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/aead/AeadKeyTemplatesTest.java b/java/src/test/java/com/google/crypto/tink/aead/AeadKeyTemplatesTest.java
index 8cc6383..7ad9ed6 100644
--- a/java/src/test/java/com/google/crypto/tink/aead/AeadKeyTemplatesTest.java
+++ b/java/src/test/java/com/google/crypto/tink/aead/AeadKeyTemplatesTest.java
@@ -37,7 +37,7 @@
   @Test
   public void testAES128_GCM() throws Exception {
     KeyTemplate template = AeadKeyTemplates.AES128_GCM;
-    assertEquals(AesGcmKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new AesGcmKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     AesGcmKeyFormat format = AesGcmKeyFormat.parseFrom(template.getValue());
     assertEquals(16, format.getKeySize());
@@ -46,7 +46,7 @@
   @Test
   public void testAES256_GCM() throws Exception {
     KeyTemplate template = AeadKeyTemplates.AES256_GCM;
-    assertEquals(AesGcmKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new AesGcmKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     AesGcmKeyFormat format = AesGcmKeyFormat.parseFrom(template.getValue());
     assertEquals(32, format.getKeySize());
@@ -58,7 +58,7 @@
     // to test that the function correctly puts them in the resulting template.
     int keySize = 42;
     KeyTemplate template = AeadKeyTemplates.createAesGcmKeyTemplate(keySize);
-    assertEquals(AesGcmKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new AesGcmKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
 
     AesGcmKeyFormat format = AesGcmKeyFormat.parseFrom(template.getValue());
@@ -68,7 +68,7 @@
   @Test
   public void testAES128_EAX() throws Exception {
     KeyTemplate template = AeadKeyTemplates.AES128_EAX;
-    assertEquals(AesEaxKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new AesEaxKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     AesEaxKeyFormat format = AesEaxKeyFormat.parseFrom(template.getValue());
     assertEquals(16, format.getKeySize());
@@ -79,7 +79,7 @@
   @Test
   public void testAES256_EAX() throws Exception {
     KeyTemplate template = AeadKeyTemplates.AES256_EAX;
-    assertEquals(AesEaxKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new AesEaxKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     AesEaxKeyFormat format = AesEaxKeyFormat.parseFrom(template.getValue());
     assertEquals(32, format.getKeySize());
@@ -94,7 +94,7 @@
     int keySize = 42;
     int ivSize = 72;
     KeyTemplate template = AeadKeyTemplates.createAesEaxKeyTemplate(keySize, ivSize);
-    assertEquals(AesEaxKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new AesEaxKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
 
     AesEaxKeyFormat format = AesEaxKeyFormat.parseFrom(template.getValue());
@@ -106,7 +106,7 @@
   @Test
   public void testAES128_CTR_HMAC_SHA256() throws Exception {
     KeyTemplate template = AeadKeyTemplates.AES128_CTR_HMAC_SHA256;
-    assertEquals(AesCtrHmacAeadKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new AesCtrHmacAeadKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     AesCtrHmacAeadKeyFormat format = AesCtrHmacAeadKeyFormat.parseFrom(template.getValue());
 
@@ -125,7 +125,7 @@
   @Test
   public void testAES256_CTR_HMAC_SHA256() throws Exception {
     KeyTemplate template = AeadKeyTemplates.AES256_CTR_HMAC_SHA256;
-    assertEquals(AesCtrHmacAeadKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new AesCtrHmacAeadKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     AesCtrHmacAeadKeyFormat format = AesCtrHmacAeadKeyFormat.parseFrom(template.getValue());
 
@@ -152,7 +152,7 @@
     HashType hashType = HashType.UNKNOWN_HASH;
     KeyTemplate template = AeadKeyTemplates.createAesCtrHmacAeadKeyTemplate(
         aesKeySize, ivSize, hmacKeySize, tagSize, hashType);
-    assertEquals(AesCtrHmacAeadKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new AesCtrHmacAeadKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     AesCtrHmacAeadKeyFormat format = AesCtrHmacAeadKeyFormat.parseFrom(template.getValue());
 
@@ -171,7 +171,7 @@
   @Test
   public void testCHACHA20_POLY1305() throws Exception {
     KeyTemplate template = AeadKeyTemplates.CHACHA20_POLY1305;
-    assertEquals(ChaCha20Poly1305KeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new ChaCha20Poly1305KeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     assertTrue(template.getValue().isEmpty());  // Empty format.
   }
@@ -179,7 +179,7 @@
   @Test
   public void testXCHACHA20_POLY1305() throws Exception {
     KeyTemplate template = AeadKeyTemplates.XCHACHA20_POLY1305;
-    assertEquals(XChaCha20Poly1305KeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new XChaCha20Poly1305KeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     assertTrue(template.getValue().isEmpty()); // Empty format.
   }
@@ -190,7 +190,7 @@
     // to test that the function correctly puts them in the resulting template.
     String keyUri = "some example URI";
     KeyTemplate template = AeadKeyTemplates.createKmsAeadKeyTemplate(keyUri);
-    assertEquals(KmsAeadKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new KmsAeadKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
 
     KmsAeadKeyFormat format = KmsAeadKeyFormat.parseFrom(template.getValue());
@@ -204,7 +204,7 @@
     String kekUri = "some example KEK URI";
     KeyTemplate dekTemplate = AeadKeyTemplates.AES256_GCM;
     KeyTemplate template = AeadKeyTemplates.createKmsEnvelopeAeadKeyTemplate(kekUri, dekTemplate);
-    assertEquals(KmsEnvelopeAeadKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new KmsEnvelopeAeadKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
 
     KmsEnvelopeAeadKeyFormat format = KmsEnvelopeAeadKeyFormat.parseFrom(template.getValue());
diff --git a/java/src/test/java/com/google/crypto/tink/aead/AeadWrapperTest.java b/java/src/test/java/com/google/crypto/tink/aead/AeadWrapperTest.java
index 3843d88..79c991a 100644
--- a/java/src/test/java/com/google/crypto/tink/aead/AeadWrapperTest.java
+++ b/java/src/test/java/com/google/crypto/tink/aead/AeadWrapperTest.java
@@ -63,7 +63,7 @@
                     42,
                     KeyStatusType.ENABLED,
                     OutputPrefixType.TINK)));
-    Aead aead = new AeadWrapper().wrap(Registry.getPrimitives(keysetHandle));
+    Aead aead = new AeadWrapper().wrap(Registry.getPrimitives(keysetHandle, Aead.class));
     byte[] plaintext = Random.randBytes(20);
     byte[] associatedData = Random.randBytes(20);
     byte[] ciphertext = aead.encrypt(plaintext, associatedData);
@@ -106,7 +106,7 @@
 
     KeysetHandle keysetHandle =
         TestUtil.createKeysetHandle(TestUtil.createKeyset(primary, raw, legacy, tink));
-    Aead aead = new AeadWrapper().wrap(Registry.getPrimitives(keysetHandle));
+    Aead aead = new AeadWrapper().wrap(Registry.getPrimitives(keysetHandle, Aead.class));
     byte[] plaintext = Random.randBytes(20);
     byte[] associatedData = Random.randBytes(20);
     byte[] ciphertext = aead.encrypt(plaintext, associatedData);
@@ -120,7 +120,7 @@
     // encrypt with a non-primary RAW key and decrypt with the keyset
     KeysetHandle keysetHandle2 =
         TestUtil.createKeysetHandle(TestUtil.createKeyset(raw, legacy, tink));
-    Aead aead2 = new AeadWrapper().wrap(Registry.getPrimitives(keysetHandle2));
+    Aead aead2 = new AeadWrapper().wrap(Registry.getPrimitives(keysetHandle2, Aead.class));
     ciphertext = aead2.encrypt(plaintext, associatedData);
     assertArrayEquals(plaintext, aead.decrypt(ciphertext, associatedData));
 
@@ -134,7 +134,7 @@
             KeyStatusType.ENABLED,
             OutputPrefixType.TINK);
     keysetHandle2 = TestUtil.createKeysetHandle(TestUtil.createKeyset(random));
-    aead2 = new AeadWrapper().wrap(Registry.getPrimitives(keysetHandle2));
+    aead2 = new AeadWrapper().wrap(Registry.getPrimitives(keysetHandle2, Aead.class));
     ciphertext = aead2.encrypt(plaintext, associatedData);
     try {
       aead.decrypt(ciphertext, associatedData);
@@ -171,7 +171,7 @@
             OutputPrefixType.LEGACY);
     KeysetHandle keysetHandle =
         TestUtil.createKeysetHandle(TestUtil.createKeyset(primary, raw, legacy));
-    Aead aead = new AeadWrapper().wrap(Registry.getPrimitives(keysetHandle));
+    Aead aead = new AeadWrapper().wrap(Registry.getPrimitives(keysetHandle, Aead.class));
     byte[] plaintext = Random.randBytes(20);
     byte[] associatedData = Random.randBytes(20);
     byte[] ciphertext = aead.encrypt(plaintext, associatedData);
@@ -194,7 +194,7 @@
             KeyStatusType.ENABLED,
             OutputPrefixType.RAW);
     KeysetHandle keysetHandle = TestUtil.createKeysetHandle(TestUtil.createKeyset(primary));
-    Aead aead = new AeadWrapper().wrap(Registry.getPrimitives(keysetHandle));
+    Aead aead = new AeadWrapper().wrap(Registry.getPrimitives(keysetHandle, Aead.class));
     byte[] plaintext = Random.randBytes(1);
     byte[] associatedData = Random.randBytes(20);
     byte[] ciphertext = aead.encrypt(plaintext, associatedData);
diff --git a/java/src/test/java/com/google/crypto/tink/aead/AesCtrHmacAeadKeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/aead/AesCtrHmacAeadKeyManagerTest.java
index 82ae96d..9b499ca 100644
--- a/java/src/test/java/com/google/crypto/tink/aead/AesCtrHmacAeadKeyManagerTest.java
+++ b/java/src/test/java/com/google/crypto/tink/aead/AesCtrHmacAeadKeyManagerTest.java
@@ -16,18 +16,24 @@
 
 package com.google.crypto.tink.aead;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
+import com.google.crypto.tink.Aead;
+import com.google.crypto.tink.TestUtil;
 import com.google.crypto.tink.proto.AesCtrHmacAeadKey;
 import com.google.crypto.tink.proto.AesCtrHmacAeadKeyFormat;
-import com.google.crypto.tink.proto.KeyData;
-import com.google.crypto.tink.proto.KeyTemplate;
-import com.google.protobuf.ByteString;
+import com.google.crypto.tink.proto.AesCtrKeyFormat;
+import com.google.crypto.tink.proto.AesCtrParams;
+import com.google.crypto.tink.proto.HashType;
+import com.google.crypto.tink.proto.HmacKeyFormat;
+import com.google.crypto.tink.proto.HmacParams;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
+import com.google.crypto.tink.subtle.EncryptThenAuthenticate;
+import com.google.crypto.tink.subtle.Random;
 import java.security.GeneralSecurityException;
 import java.util.Set;
 import java.util.TreeSet;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -35,64 +41,140 @@
 /** Tests for AesCtrHmaAeadKeyManager. */
 @RunWith(JUnit4.class)
 public class AesCtrHmacAeadKeyManagerTest {
-  @BeforeClass
-  public static void setUp() throws Exception {
-    AeadConfig.register();
+  private final AesCtrHmacAeadKeyManager manager = new AesCtrHmacAeadKeyManager();
+  private final AesCtrHmacAeadKeyManager.KeyFactory<AesCtrHmacAeadKeyFormat, AesCtrHmacAeadKey>
+      factory = manager.keyFactory();
+
+  @Test
+  public void basics() throws Exception {
+    assertThat(manager.getKeyType())
+        .isEqualTo("type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey");
+    assertThat(manager.getVersion()).isEqualTo(0);
+    assertThat(manager.keyMaterialType()).isEqualTo(KeyMaterialType.SYMMETRIC);
   }
 
   @Test
-  public void testNewKeyMultipleTimes() throws Exception {
-    KeyTemplate keyTemplate = AeadKeyTemplates.AES128_CTR_HMAC_SHA256;
-    AesCtrHmacAeadKeyFormat aeadKeyFormat =
-        AesCtrHmacAeadKeyFormat.parseFrom(keyTemplate.getValue());
-    ByteString serialized = ByteString.copyFrom(aeadKeyFormat.toByteArray());
-    AesCtrHmacAeadKeyManager keyManager = new AesCtrHmacAeadKeyManager();
-    Set<String> keys = new TreeSet<String>();
+  public void validateKeyFormat_empty() throws Exception {
+    try {
+      factory.validateKeyFormat(AesCtrHmacAeadKeyFormat.getDefaultInstance());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected.
+    }
+  }
+
+
+  // Returns an AesCtrKeyFormat.Builder with valid parameters
+  private static AesCtrKeyFormat.Builder createAesCtrKeyFormat() {
+    return AesCtrKeyFormat.newBuilder()
+        .setParams(AesCtrParams.newBuilder().setIvSize(16))
+        .setKeySize(16);
+  }
+
+  // Returns an HmacParams.Builder with valid parameters
+  private static HmacParams.Builder createHmacParams() {
+    return HmacParams.newBuilder().setHash(HashType.SHA256).setTagSize(32);
+  }
+
+  // Returns an HmacParams.Builder with valid parameters
+  private static HmacKeyFormat.Builder createHmacKeyFormat() {
+    return HmacKeyFormat.newBuilder().setParams(createHmacParams()).setKeySize(32);
+  }
+
+  // Returns an AesCtrHmacStreamingKeyFormat.Builder with valid parameters
+  private static AesCtrHmacAeadKeyFormat.Builder createKeyFormat() {
+    return AesCtrHmacAeadKeyFormat.newBuilder()
+        .setAesCtrKeyFormat(createAesCtrKeyFormat())
+        .setHmacKeyFormat(createHmacKeyFormat());
+  }
+
+  @Test
+  public void validateKeyFormat_valid() throws Exception {
+    factory.validateKeyFormat(createKeyFormat().build());
+  }
+
+  @Test
+  public void validateKeyFormat_keySizes() throws Exception {
+    for (int keySize = 0; keySize < 42; ++keySize) {
+      AesCtrHmacAeadKeyFormat format =
+          createKeyFormat().setAesCtrKeyFormat(createAesCtrKeyFormat().setKeySize(keySize)).build();
+      if (keySize == 16 || keySize == 32) {
+        factory.validateKeyFormat(format);
+      } else {
+        try {
+          factory.validateKeyFormat(format);
+          fail();
+        } catch (GeneralSecurityException e) {
+          // expected
+        }
+      }
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_hmacKeySizes() throws Exception {
+    for (int keySize = 0; keySize < 42; ++keySize) {
+      AesCtrHmacAeadKeyFormat format =
+          createKeyFormat().setHmacKeyFormat(createHmacKeyFormat().setKeySize(keySize)).build();
+      if (keySize >= 16) {
+        factory.validateKeyFormat(format);
+      } else {
+        try {
+          factory.validateKeyFormat(format);
+          fail("For key size" + keySize);
+        } catch (GeneralSecurityException e) {
+          // expected
+        }
+      }
+    }
+  }
+
+  @Test
+  public void createKey_multipleTimes_distinctAesKeys() throws Exception {
+    AesCtrHmacAeadKeyFormat format = createKeyFormat().build();
+    Set<String> keys = new TreeSet<>();
     // Calls newKey multiple times and make sure that they generate different keys.
-    int numTests = 24;
-    for (int i = 0; i < numTests / 6; i++) {
-      AesCtrHmacAeadKey key = (AesCtrHmacAeadKey) keyManager.newKey(aeadKeyFormat);
-      keys.add(new String(key.getAesCtrKey().getKeyValue().toByteArray(), "UTF-8"));
-      keys.add(new String(key.getHmacKey().getKeyValue().toByteArray(), "UTF-8"));
-      assertEquals(16, key.getAesCtrKey().getKeyValue().toByteArray().length);
-      assertEquals(32, key.getHmacKey().getKeyValue().toByteArray().length);
-
-      key = (AesCtrHmacAeadKey) keyManager.newKey(serialized);
-      keys.add(new String(key.getAesCtrKey().getKeyValue().toByteArray(), "UTF-8"));
-      keys.add(new String(key.getHmacKey().getKeyValue().toByteArray(), "UTF-8"));
-      assertEquals(16, key.getAesCtrKey().getKeyValue().toByteArray().length);
-      assertEquals(32, key.getHmacKey().getKeyValue().toByteArray().length);
-
-      KeyData keyData = keyManager.newKeyData(keyTemplate.getValue());
-      key = AesCtrHmacAeadKey.parseFrom(keyData.getValue());
-      keys.add(new String(key.getAesCtrKey().getKeyValue().toByteArray(), "UTF-8"));
-      keys.add(new String(key.getHmacKey().getKeyValue().toByteArray(), "UTF-8"));
-      assertEquals(16, key.getAesCtrKey().getKeyValue().toByteArray().length);
-      assertEquals(32, key.getHmacKey().getKeyValue().toByteArray().length);
+    int numTests = 50;
+    for (int i = 0; i < numTests; i++) {
+      keys.add(
+          TestUtil.hexEncode(factory.createKey(format).getAesCtrKey().getKeyValue().toByteArray()));
     }
-    assertEquals(numTests, keys.size());
+    assertThat(keys).hasSize(numTests);
   }
 
   @Test
-  public void testNewKeyWithCorruptedFormat() throws Exception {
-    ByteString serialized = ByteString.copyFrom(new byte[128]);
-    KeyTemplate keyTemplate =
-        KeyTemplate.newBuilder()
-            .setTypeUrl(AesCtrHmacAeadKeyManager.TYPE_URL)
-            .setValue(serialized)
-            .build();
-    AesCtrHmacAeadKeyManager keyManager = new AesCtrHmacAeadKeyManager();
-    try {
-      keyManager.newKey(serialized);
-      fail("Corrupted format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
+  public void createKey_multipleTimes_distinctHmacKeys() throws Exception {
+    AesCtrHmacAeadKeyFormat format = createKeyFormat().build();
+    Set<String> keys = new TreeSet<>();
+    // Calls newKey multiple times and make sure that they generate different keys.
+    int numTests = 50;
+    for (int i = 0; i < numTests; i++) {
+      keys.add(
+          TestUtil.hexEncode(factory.createKey(format).getHmacKey().getKeyValue().toByteArray()));
     }
-    try {
-      keyManager.newKeyData(keyTemplate.getValue());
-      fail("Corrupted format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
-    }
+    assertThat(keys).hasSize(numTests);
+  }
+
+  @Test
+  public void getPrimitive() throws Exception {
+    AesCtrHmacAeadKey key =
+        factory.createKey(
+            createKeyFormat()
+                .setHmacKeyFormat(
+                    createHmacKeyFormat().setParams(createHmacParams().setHash(HashType.SHA512)))
+                .build());
+    Aead managerAead = manager.getPrimitive(key, Aead.class);
+    Aead directAead =
+        EncryptThenAuthenticate.newAesCtrHmac(
+            key.getAesCtrKey().getKeyValue().toByteArray(),
+            key.getAesCtrKey().getParams().getIvSize(),
+            "HMACSHA512",
+            key.getHmacKey().getKeyValue().toByteArray(),
+            key.getHmacKey().getParams().getTagSize());
+
+    byte[] plaintext = Random.randBytes(20);
+    byte[] associatedData = Random.randBytes(20);
+    assertThat(directAead.decrypt(managerAead.encrypt(plaintext, associatedData), associatedData))
+        .isEqualTo(plaintext);
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/aead/AesCtrKeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/aead/AesCtrKeyManagerTest.java
index 488087c..bd26f47 100644
--- a/java/src/test/java/com/google/crypto/tink/aead/AesCtrKeyManagerTest.java
+++ b/java/src/test/java/com/google/crypto/tink/aead/AesCtrKeyManagerTest.java
@@ -16,16 +16,17 @@
 
 package com.google.crypto.tink.aead;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
 import com.google.crypto.tink.TestUtil;
 import com.google.crypto.tink.proto.AesCtrKey;
 import com.google.crypto.tink.proto.AesCtrKeyFormat;
 import com.google.crypto.tink.proto.AesCtrParams;
-import com.google.crypto.tink.proto.KeyData;
-import com.google.crypto.tink.proto.KeyTemplate;
-import com.google.protobuf.ByteString;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
+import com.google.crypto.tink.subtle.AesCtrJceCipher;
+import com.google.crypto.tink.subtle.IndCpaCipher;
+import com.google.crypto.tink.subtle.Random;
 import java.security.GeneralSecurityException;
 import java.util.Set;
 import java.util.TreeSet;
@@ -36,57 +37,128 @@
 /** Unit tests for {@link AesCtrKeyManager}. */
 @RunWith(JUnit4.class)
 public class AesCtrKeyManagerTest {
+  private final AesCtrKeyManager manager = new AesCtrKeyManager();
+  private final AesCtrKeyManager.KeyFactory<AesCtrKeyFormat, AesCtrKey> factory =
+      manager.keyFactory();
+
   @Test
-  public void testNewKeyMultipleTimes() throws Exception {
-    AesCtrKeyFormat ctrKeyFormat = AesCtrKeyFormat.newBuilder()
-        .setParams(AesCtrParams.newBuilder().setIvSize(16).build())
-        .setKeySize(16)
-        .build();
-    ByteString serialized = ByteString.copyFrom(ctrKeyFormat.toByteArray());
-    KeyTemplate keyTemplate = KeyTemplate.newBuilder()
-        .setTypeUrl(AesCtrKeyManager.TYPE_URL)
-        .setValue(serialized)
-        .build();
-    AesCtrKeyManager keyManager = new AesCtrKeyManager();
-    Set<String> keys = new TreeSet<String>();
-    // Calls newKey multiple times and make sure that they generate different keys.
-    int numTests = 27;
-    for (int i = 0; i < numTests / 3; i++) {
-      AesCtrKey key = (AesCtrKey) keyManager.newKey(ctrKeyFormat);
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-      assertEquals(16, key.getKeyValue().toByteArray().length);
-
-      key = (AesCtrKey) keyManager.newKey(serialized);
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-      assertEquals(16, key.getKeyValue().toByteArray().length);
-
-      KeyData keyData = keyManager.newKeyData(keyTemplate.getValue());
-      key = AesCtrKey.parseFrom(keyData.getValue());
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-      assertEquals(16, key.getKeyValue().toByteArray().length);
-    }
-    assertEquals(numTests, keys.size());
+  public void basics() throws Exception {
+    assertThat(manager.getKeyType()).isEqualTo("type.googleapis.com/google.crypto.tink.AesCtrKey");
+    assertThat(manager.getVersion()).isEqualTo(0);
+    assertThat(manager.keyMaterialType()).isEqualTo(KeyMaterialType.SYMMETRIC);
   }
 
   @Test
-  public void testNewKeyWithCorruptedFormat() throws Exception {
-    ByteString serialized = ByteString.copyFrom(new byte[128]);
-    KeyTemplate keyTemplate = KeyTemplate.newBuilder()
-        .setTypeUrl(AesCtrKeyManager.TYPE_URL)
-        .setValue(serialized)
+  public void validateKeyFormat_empty_invalid() throws Exception {
+    try {
+      factory.validateKeyFormat(AesCtrKeyFormat.getDefaultInstance());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  private AesCtrKeyFormat createFormat(int ivSize, int keySize) {
+    return AesCtrKeyFormat.newBuilder()
+        .setParams(AesCtrParams.newBuilder().setIvSize(ivSize).build())
+        .setKeySize(keySize)
         .build();
-    AesCtrKeyManager keyManager = new AesCtrKeyManager();
+  }
+
+  @Test
+  public void createKey_valid() throws Exception {
+    factory.validateKeyFormat(createFormat(12, 16));
+    factory.validateKeyFormat(createFormat(13, 16));
+    factory.validateKeyFormat(createFormat(14, 16));
+    factory.validateKeyFormat(createFormat(15, 16));
+    factory.validateKeyFormat(createFormat(16, 16));
+
+    factory.validateKeyFormat(createFormat(12, 32));
+    factory.validateKeyFormat(createFormat(13, 32));
+    factory.validateKeyFormat(createFormat(14, 32));
+    factory.validateKeyFormat(createFormat(15, 32));
+    factory.validateKeyFormat(createFormat(16, 32));
+  }
+
+  @Test
+  public void createKey_smallIv_throws() throws Exception {
     try {
-      keyManager.newKey(serialized);
-      fail("Corrupted format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
+      factory.validateKeyFormat(createFormat(11, 16));
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
     }
+  }
+
+  @Test
+  public void createKey_bigIv_throws() throws Exception {
     try {
-      keyManager.newKeyData(keyTemplate.getValue());
-      fail("Corrupted format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
+      factory.validateKeyFormat(createFormat(17, 16));
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
     }
   }
+
+  @Test
+  public void createKey_8ByteAesKey_throws() throws Exception {
+    try {
+      factory.validateKeyFormat(createFormat(16, 8));
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void createKey_15ByteAesKey_throws() throws Exception {
+    try {
+      factory.validateKeyFormat(createFormat(16, 15));
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void createKey_17ByteAesKey_throws() throws Exception {
+    try {
+      factory.validateKeyFormat(createFormat(16, 17));
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void createKey_correctVersion() throws Exception {
+    assertThat(factory.createKey(createFormat(16, 16)).getVersion()).isEqualTo(0);
+  }
+
+  @Test
+  public void createKey_keySize() throws Exception {
+    assertThat(factory.createKey(createFormat(16, 16)).getKeyValue()).hasSize(16);
+    assertThat(factory.createKey(createFormat(16, 32)).getKeyValue()).hasSize(32);
+  }
+
+  @Test
+  public void createKey_multipleCallsCreateDifferentKeys() throws Exception {
+    Set<String> keys = new TreeSet<>();
+    final int numKeys = 100;
+    for (int i = 0; i < numKeys; ++i) {
+      keys.add(
+          TestUtil.hexEncode(factory.createKey(createFormat(16, 16)).getKeyValue().toByteArray()));
+    }
+    assertThat(keys).hasSize(numKeys);
+  }
+
+  @Test
+  public void getPrimitive() throws Exception {
+    AesCtrKey key = factory.createKey(createFormat(14, 32));
+    IndCpaCipher managerCipher = manager.getPrimitive(key, IndCpaCipher.class);
+    IndCpaCipher directCipher = new AesCtrJceCipher(key.getKeyValue().toByteArray(), 14);
+
+    byte[] plaintext = Random.randBytes(20);
+    assertThat(directCipher.decrypt(managerCipher.encrypt(plaintext))).isEqualTo(plaintext);
+  }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/aead/AesEaxKeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/aead/AesEaxKeyManagerTest.java
index d7e1944..d9cc16e 100644
--- a/java/src/test/java/com/google/crypto/tink/aead/AesEaxKeyManagerTest.java
+++ b/java/src/test/java/com/google/crypto/tink/aead/AesEaxKeyManagerTest.java
@@ -16,97 +16,140 @@
 
 package com.google.crypto.tink.aead;
 
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 import com.google.crypto.tink.Aead;
-import com.google.crypto.tink.CryptoFormat;
-import com.google.crypto.tink.KeysetHandle;
 import com.google.crypto.tink.TestUtil;
 import com.google.crypto.tink.proto.AesEaxKey;
 import com.google.crypto.tink.proto.AesEaxKeyFormat;
 import com.google.crypto.tink.proto.AesEaxParams;
-import com.google.crypto.tink.proto.KeyData;
-import com.google.crypto.tink.proto.KeyStatusType;
-import com.google.crypto.tink.proto.KeyTemplate;
-import com.google.crypto.tink.proto.OutputPrefixType;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
+import com.google.crypto.tink.subtle.AesEaxJce;
 import com.google.crypto.tink.subtle.Bytes;
 import com.google.crypto.tink.subtle.Random;
 import com.google.protobuf.ByteString;
 import java.security.GeneralSecurityException;
 import java.util.Set;
 import java.util.TreeSet;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-/**
- * Test for AesEaxJce and its key manager.
- */
+/** Test for AesEaxJce and its key manager. */
 @RunWith(JUnit4.class)
 public class AesEaxKeyManagerTest {
-  @BeforeClass
-  public static void setUp() throws GeneralSecurityException {
-    AeadConfig.register();
+  private final AesEaxKeyManager manager = new AesEaxKeyManager();
+  private final AesEaxKeyManager.KeyFactory<AesEaxKeyFormat, AesEaxKey> factory =
+      manager.keyFactory();
+
+  @Test
+  public void basics() throws Exception {
+    assertThat(manager.getKeyType()).isEqualTo("type.googleapis.com/google.crypto.tink.AesEaxKey");
+    assertThat(manager.getVersion()).isEqualTo(0);
+    assertThat(manager.keyMaterialType()).isEqualTo(KeyMaterialType.SYMMETRIC);
+  }
+
+  private static AesEaxKeyFormat createKeyFormat(int keySize, int ivSize) {
+    return AesEaxKeyFormat.newBuilder()
+        .setParams(AesEaxParams.newBuilder().setIvSize(ivSize))
+        .setKeySize(keySize)
+        .build();
   }
 
   @Test
-  public void testNewKeyMultipleTimes() throws Exception {
-    AesEaxKeyFormat eaxKeyFormat = AesEaxKeyFormat.newBuilder()
-        .setParams(AesEaxParams.newBuilder().setIvSize(16).build())
-        .setKeySize(16)
-        .build();
-    ByteString serialized = ByteString.copyFrom(eaxKeyFormat.toByteArray());
-    KeyTemplate keyTemplate = KeyTemplate.newBuilder()
-        .setTypeUrl(AesEaxKeyManager.TYPE_URL)
-        .setValue(serialized)
-        .build();
-    AesEaxKeyManager keyManager = new AesEaxKeyManager();
-    Set<String> keys = new TreeSet<String>();
+  public void validateKeyFormat_empty() throws Exception {
+    try {
+      factory.validateKeyFormat(AesEaxKeyFormat.getDefaultInstance());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected.
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_valid() throws Exception {
+    factory.validateKeyFormat(createKeyFormat(16, 12));
+    factory.validateKeyFormat(createKeyFormat(16, 16));
+    factory.validateKeyFormat(createKeyFormat(32, 12));
+    factory.validateKeyFormat(createKeyFormat(32, 16));
+  }
+
+  @Test
+  public void validateKeyFormat_keySize() throws Exception {
+    for (int len = 0; len < 200; ++len) {
+      AesEaxKeyFormat format = createKeyFormat(len, 16);
+      if (len == 16 || len == 32) {
+        factory.validateKeyFormat(format);
+      } else {
+        try {
+          factory.validateKeyFormat(format);
+          fail();
+        } catch (GeneralSecurityException e) {
+          // expected
+        }
+      }
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_ivSize() throws Exception {
+    for (int ivSize = 0; ivSize < 200; ++ivSize) {
+      AesEaxKeyFormat format = createKeyFormat(32, ivSize);
+      if (ivSize == 12 || ivSize == 16) {
+        factory.validateKeyFormat(format);
+      } else {
+        try {
+          factory.validateKeyFormat(format);
+          fail();
+        } catch (GeneralSecurityException e) {
+          // expected
+        }
+      }
+    }
+  }
+
+  @Test
+  public void createKey_checkValues() throws Exception {
+    AesEaxKeyFormat format = createKeyFormat(32, 16);
+    AesEaxKey key = factory.createKey(format);
+    assertThat(key.getKeyValue()).hasSize(format.getKeySize());
+    assertThat(key.getParams()).isEqualTo(format.getParams());
+  }
+
+  @Test
+  public void createKey_checkValues_variant2() throws Exception {
+    AesEaxKeyFormat format = createKeyFormat(16, 12);
+    AesEaxKey key = factory.createKey(format);
+    assertThat(key.getKeyValue()).hasSize(format.getKeySize());
+    assertThat(key.getParams()).isEqualTo(format.getParams());
+  }
+
+  @Test
+  public void createKey_multipleTimes() throws Exception {
+    AesEaxKeyFormat format = createKeyFormat(32, 16);
+    Set<String> keys = new TreeSet<>();
     // Calls newKey multiple times and make sure that they generate different keys.
-    int numTests = 27;
-    for (int i = 0; i < numTests / 3; i++) {
-      AesEaxKey key = (AesEaxKey) keyManager.newKey(eaxKeyFormat);
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-      assertEquals(16, key.getKeyValue().toByteArray().length);
-
-      key = (AesEaxKey) keyManager.newKey(serialized);
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-      assertEquals(16, key.getKeyValue().toByteArray().length);
-
-      KeyData keyData = keyManager.newKeyData(keyTemplate.getValue());
-      key = AesEaxKey.parseFrom(keyData.getValue());
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-      assertEquals(16, key.getKeyValue().toByteArray().length);
+    int numTests = 50;
+    for (int i = 0; i < numTests; i++) {
+      keys.add(TestUtil.hexEncode(factory.createKey(format).getKeyValue().toByteArray()));
     }
-    assertEquals(numTests, keys.size());
+    assertThat(keys).hasSize(numTests);
   }
 
   @Test
-  public void testNewKeyWithCorruptedFormat() throws Exception {
-    ByteString serialized = ByteString.copyFrom(new byte[128]);
-    KeyTemplate keyTemplate = KeyTemplate.newBuilder()
-        .setTypeUrl(AesEaxKeyManager.TYPE_URL)
-        .setValue(serialized)
-        .build();
-    AesEaxKeyManager keyManager = new AesEaxKeyManager();
-    try {
-      keyManager.newKey(serialized);
-      fail("Corrupted format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
-    }
-    try {
-      keyManager.newKeyData(keyTemplate.getValue());
-      fail("Corrupted format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
-    }
-  }
+  public void getPrimitive() throws Exception {
+    AesEaxKey key = factory.createKey(createKeyFormat(32, 16));
+    Aead managerAead = manager.getPrimitive(key, Aead.class);
+    Aead directAead = new AesEaxJce(key.getKeyValue().toByteArray(), key.getParams().getIvSize());
 
-  private static final int AES_KEY_SIZE = 16;
+    byte[] plaintext = Random.randBytes(20);
+    byte[] associatedData = Random.randBytes(20);
+    assertThat(directAead.decrypt(managerAead.encrypt(plaintext, associatedData), associatedData))
+        .isEqualTo(plaintext);
+  }
 
   private static class PublicTestVector {
     String name;
@@ -116,8 +159,15 @@
     public byte[] iv;
     public byte[] ciphertext;
     public byte[] tag;
-    public PublicTestVector(String name, String keyValue, String plaintext, String aad,
-        String iv, String ciphertext, String tag) {
+
+    public PublicTestVector(
+        String name,
+        String keyValue,
+        String plaintext,
+        String aad,
+        String iv,
+        String ciphertext,
+        String tag) {
       try {
         this.name = name;
         this.keyValue = TestUtil.hexDecode(keyValue);
@@ -135,86 +185,86 @@
   // Test vectors from
   // http://web.cs.ucdavis.edu/~rogaway/papers/eax.pdf.
   PublicTestVector[] publicTestVectors = {
-      new PublicTestVector(
-          "Test Case 1",
-          "233952dee4d5ed5f9b9c6d6ff80ff478",
-          "",
-          "6bfb914fd07eae6b",
-          "62ec67f9c3a4a407fcb2a8c49031a8b3",
-          "",
-          "e037830e8389f27b025a2d6527e79d01"),
-      new PublicTestVector(
-          "Test Case 2",
-          "91945d3f4dcbee0bf45ef52255f095a4",
-          "f7fb",
-          "fa3bfd4806eb53fa",
-          "becaf043b0a23d843194ba972c66debd",
-          "19dd",
-          "5c4c9331049d0bdab0277408f67967e5"),
-      new PublicTestVector(
-          "Test Case 3",
-          "01f74ad64077f2e704c0f60ada3dd523",
-          "1a47cb4933",
-          "234a3463c1264ac6",
-          "70c3db4f0d26368400a10ed05d2bff5e",
-          "d851d5bae0",
-          "3a59f238a23e39199dc9266626c40f80"),
-      new PublicTestVector(
-          "Test Case 4",
-          "d07cf6cbb7f313bdde66b727afd3c5e8",
-          "481c9e39b1",
-          "33cce2eabff5a79d",
-          "8408dfff3c1a2b1292dc199e46b7d617",
-          "632a9d131a",
-          "d4c168a4225d8e1ff755939974a7bede"),
-      new PublicTestVector(
-          "Test Case 5",
-          "35b6d0580005bbc12b0587124557d2c2",
-          "40d0c07da5e4",
-          "aeb96eaebe2970e9",
-          "fdb6b06676eedc5c61d74276e1f8e816",
-          "071dfe16c675",
-          "cb0677e536f73afe6a14b74ee49844dd"),
-      new PublicTestVector(
-          "Test Case 6",
-          "bd8e6e11475e60b268784c38c62feb22",
-          "4de3b35c3fc039245bd1fb7d",
-          "d4482d1ca78dce0f",
-          "6eac5c93072d8e8513f750935e46da1b",
-          "835bb4f15d743e350e728414",
-          "abb8644fd6ccb86947c5e10590210a4f"),
-      new PublicTestVector(
-          "Test Case 7",
-          "7c77d6e813bed5ac98baa417477a2e7d",
-          "8b0a79306c9ce7ed99dae4f87f8dd61636",
-          "65d2017990d62528",
-          "1a8c98dcd73d38393b2bf1569deefc19",
-          "02083e3979da014812f59f11d52630da30",
-          "137327d10649b0aa6e1c181db617d7f2"),
-      new PublicTestVector(
-          "Test Case 8",
-          "5fff20cafab119ca2fc73549e20f5b0d",
-          "1bda122bce8a8dbaf1877d962b8592dd2d56",
-          "54b9f04e6a09189a",
-          "dde59b97d722156d4d9aff2bc7559826",
-          "2ec47b2c4954a489afc7ba4897edcdae8cc3",
-          "3b60450599bd02c96382902aef7f832a"),
-      new PublicTestVector(
-          "Test Case 9",
-          "a4a4782bcffd3ec5e7ef6d8c34a56123",
-          "6cf36720872b8513f6eab1a8a44438d5ef11",
-          "899a175897561d7e",
-          "b781fcf2f75fa5a8de97a9ca48e522ec",
-          "0de18fd0fdd91e7af19f1d8ee8733938b1e8",
-          "e7f6d2231618102fdb7fe55ff1991700"),
-      new PublicTestVector(
-          "Test Case 10",
-          "8395fcf1e95bebd697bd010bc766aac3",
-          "ca40d7446e545ffaed3bd12a740a659ffbbb3ceab7",
-          "126735fcc320d25a",
-          "22e7add93cfc6393c57ec0b3c17d6b44",
-          "cb8920f87a6c75cff39627b56e3ed197c552d295a7",
-          "cfc46afc253b4652b1af3795b124ab6e"),
+    new PublicTestVector(
+        "Test Case 1",
+        "233952dee4d5ed5f9b9c6d6ff80ff478",
+        "",
+        "6bfb914fd07eae6b",
+        "62ec67f9c3a4a407fcb2a8c49031a8b3",
+        "",
+        "e037830e8389f27b025a2d6527e79d01"),
+    new PublicTestVector(
+        "Test Case 2",
+        "91945d3f4dcbee0bf45ef52255f095a4",
+        "f7fb",
+        "fa3bfd4806eb53fa",
+        "becaf043b0a23d843194ba972c66debd",
+        "19dd",
+        "5c4c9331049d0bdab0277408f67967e5"),
+    new PublicTestVector(
+        "Test Case 3",
+        "01f74ad64077f2e704c0f60ada3dd523",
+        "1a47cb4933",
+        "234a3463c1264ac6",
+        "70c3db4f0d26368400a10ed05d2bff5e",
+        "d851d5bae0",
+        "3a59f238a23e39199dc9266626c40f80"),
+    new PublicTestVector(
+        "Test Case 4",
+        "d07cf6cbb7f313bdde66b727afd3c5e8",
+        "481c9e39b1",
+        "33cce2eabff5a79d",
+        "8408dfff3c1a2b1292dc199e46b7d617",
+        "632a9d131a",
+        "d4c168a4225d8e1ff755939974a7bede"),
+    new PublicTestVector(
+        "Test Case 5",
+        "35b6d0580005bbc12b0587124557d2c2",
+        "40d0c07da5e4",
+        "aeb96eaebe2970e9",
+        "fdb6b06676eedc5c61d74276e1f8e816",
+        "071dfe16c675",
+        "cb0677e536f73afe6a14b74ee49844dd"),
+    new PublicTestVector(
+        "Test Case 6",
+        "bd8e6e11475e60b268784c38c62feb22",
+        "4de3b35c3fc039245bd1fb7d",
+        "d4482d1ca78dce0f",
+        "6eac5c93072d8e8513f750935e46da1b",
+        "835bb4f15d743e350e728414",
+        "abb8644fd6ccb86947c5e10590210a4f"),
+    new PublicTestVector(
+        "Test Case 7",
+        "7c77d6e813bed5ac98baa417477a2e7d",
+        "8b0a79306c9ce7ed99dae4f87f8dd61636",
+        "65d2017990d62528",
+        "1a8c98dcd73d38393b2bf1569deefc19",
+        "02083e3979da014812f59f11d52630da30",
+        "137327d10649b0aa6e1c181db617d7f2"),
+    new PublicTestVector(
+        "Test Case 8",
+        "5fff20cafab119ca2fc73549e20f5b0d",
+        "1bda122bce8a8dbaf1877d962b8592dd2d56",
+        "54b9f04e6a09189a",
+        "dde59b97d722156d4d9aff2bc7559826",
+        "2ec47b2c4954a489afc7ba4897edcdae8cc3",
+        "3b60450599bd02c96382902aef7f832a"),
+    new PublicTestVector(
+        "Test Case 9",
+        "a4a4782bcffd3ec5e7ef6d8c34a56123",
+        "6cf36720872b8513f6eab1a8a44438d5ef11",
+        "899a175897561d7e",
+        "b781fcf2f75fa5a8de97a9ca48e522ec",
+        "0de18fd0fdd91e7af19f1d8ee8733938b1e8",
+        "e7f6d2231618102fdb7fe55ff1991700"),
+    new PublicTestVector(
+        "Test Case 10",
+        "8395fcf1e95bebd697bd010bc766aac3",
+        "ca40d7446e545ffaed3bd12a740a659ffbbb3ceab7",
+        "126735fcc320d25a",
+        "22e7add93cfc6393c57ec0b3c17d6b44",
+        "cb8920f87a6c75cff39627b56e3ed197c552d295a7",
+        "cfc46afc253b4652b1af3795b124ab6e"),
   };
 
   @Test
@@ -223,7 +273,12 @@
       if (TestUtil.shouldSkipTestWithAesKeySize(t.keyValue.length)) {
         continue;
       }
-      Aead aead = getRawAesEax(t.keyValue, t.iv.length);
+      AesEaxKey key =
+          AesEaxKey.newBuilder()
+              .setKeyValue(ByteString.copyFrom(t.keyValue))
+              .setParams(AesEaxParams.newBuilder().setIvSize(t.iv.length))
+              .build();
+      Aead aead = manager.getPrimitive(key, Aead.class);
       try {
         byte[] ciphertext = Bytes.concat(t.iv, t.ciphertext, t.tag);
         byte[] plaintext = aead.decrypt(ciphertext, t.aad);
@@ -234,46 +289,13 @@
     }
   }
 
-  private Aead getRawAesEax(byte[] keyValue, int ivSizeInBytes) throws Exception {
-    KeysetHandle keysetHandle = TestUtil.createKeysetHandle(
-        TestUtil.createKeyset(
-            TestUtil.createKey(
-                TestUtil.createAesEaxKeyData(keyValue, ivSizeInBytes),
-                42,
-                KeyStatusType.ENABLED,
-                OutputPrefixType.RAW)));
-    return keysetHandle.getPrimitive(Aead.class);
-  }
-
-  @Test
-  public void testBasic() throws Exception {
-    byte[] keyValue = Random.randBytes(AES_KEY_SIZE);
-    KeysetHandle keysetHandle = TestUtil.createKeysetHandle(
-        TestUtil.createKeyset(
-            TestUtil.createKey(
-                TestUtil.createAesEaxKeyData(keyValue, 12),
-                42,
-                KeyStatusType.ENABLED,
-                OutputPrefixType.TINK)));
-    TestUtil.runBasicAeadTests(keysetHandle.getPrimitive(Aead.class));
-  }
-
   @Test
   public void testCiphertextSize() throws Exception {
-    byte[] keyValue = Random.randBytes(AES_KEY_SIZE);
-    KeysetHandle keysetHandle = TestUtil.createKeysetHandle(
-        TestUtil.createKeyset(
-            TestUtil.createKey(
-                TestUtil.createAesEaxKeyData(keyValue, 16),
-                42,
-                KeyStatusType.ENABLED,
-                OutputPrefixType.TINK)));
-    Aead aead = keysetHandle.getPrimitive(Aead.class);
+    AesEaxKey key = factory.createKey(createKeyFormat(32, 16));
+    Aead aead = manager.getPrimitive(key, Aead.class);
     byte[] plaintext = "plaintext".getBytes("UTF-8");
     byte[] associatedData = "associatedData".getBytes("UTF-8");
     byte[] ciphertext = aead.encrypt(plaintext, associatedData);
-    assertEquals(
-        CryptoFormat.NON_RAW_PREFIX_SIZE + 16 /* IV_SIZE */ + plaintext.length + 16 /* TAG_SIZE */,
-        ciphertext.length);
+    assertEquals(16 /* IV_SIZE */ + plaintext.length + 16 /* TAG_SIZE */, ciphertext.length);
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/aead/AesGcmKeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/aead/AesGcmKeyManagerTest.java
index 407a0d2..2ef88c8 100644
--- a/java/src/test/java/com/google/crypto/tink/aead/AesGcmKeyManagerTest.java
+++ b/java/src/test/java/com/google/crypto/tink/aead/AesGcmKeyManagerTest.java
@@ -16,27 +16,22 @@
 
 package com.google.crypto.tink.aead;
 
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 import com.google.crypto.tink.Aead;
-import com.google.crypto.tink.CryptoFormat;
-import com.google.crypto.tink.KeysetHandle;
 import com.google.crypto.tink.TestUtil;
 import com.google.crypto.tink.proto.AesGcmKey;
 import com.google.crypto.tink.proto.AesGcmKeyFormat;
-import com.google.crypto.tink.proto.KeyData;
-import com.google.crypto.tink.proto.KeyStatusType;
-import com.google.crypto.tink.proto.KeyTemplate;
-import com.google.crypto.tink.proto.OutputPrefixType;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
+import com.google.crypto.tink.subtle.AesGcmJce;
 import com.google.crypto.tink.subtle.Bytes;
 import com.google.crypto.tink.subtle.Random;
 import com.google.protobuf.ByteString;
 import java.security.GeneralSecurityException;
 import java.util.Set;
 import java.util.TreeSet;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -44,62 +39,108 @@
 /** Test for AesGcmJce and its key manager. */
 @RunWith(JUnit4.class)
 public class AesGcmKeyManagerTest {
-  @BeforeClass
-  public static void setUp() throws GeneralSecurityException {
-    AeadConfig.register();
+  private final AesGcmKeyManager manager = new AesGcmKeyManager();
+  private final AesGcmKeyManager.KeyFactory<AesGcmKeyFormat, AesGcmKey> factory =
+      manager.keyFactory();
+
+  @Test
+  public void basics() throws Exception {
+    assertThat(manager.getKeyType()).isEqualTo("type.googleapis.com/google.crypto.tink.AesGcmKey");
+    assertThat(manager.getVersion()).isEqualTo(0);
+    assertThat(manager.keyMaterialType()).isEqualTo(KeyMaterialType.SYMMETRIC);
   }
 
   @Test
-  public void testNewKeyMultipleTimes() throws Exception {
-    AesGcmKeyFormat gcmKeyFormat =
-        AesGcmKeyFormat.newBuilder()
-            .setKeySize(16)
-            .build();
-    ByteString serialized = ByteString.copyFrom(gcmKeyFormat.toByteArray());
-    KeyTemplate keyTemplate =
-        KeyTemplate.newBuilder().setTypeUrl(AesGcmKeyManager.TYPE_URL).setValue(serialized).build();
-    AesGcmKeyManager keyManager = new AesGcmKeyManager();
-    Set<String> keys = new TreeSet<String>();
+  public void validateKeyFormat_empty() throws Exception {
+    try {
+      factory.validateKeyFormat(AesGcmKeyFormat.getDefaultInstance());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected.
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_valid() throws Exception {
+    factory.validateKeyFormat(AesGcmKeyFormat.newBuilder().setKeySize(16).build());
+    factory.validateKeyFormat(AesGcmKeyFormat.newBuilder().setKeySize(32).build());
+  }
+
+  @Test
+  public void validateKeyFormat_invalid() throws Exception {
+    try {
+      factory.validateKeyFormat(AesGcmKeyFormat.newBuilder().setKeySize(1).build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected.
+    }
+    try {
+      factory.validateKeyFormat(AesGcmKeyFormat.newBuilder().setKeySize(15).build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected.
+    }
+    try {
+      factory.validateKeyFormat(AesGcmKeyFormat.newBuilder().setKeySize(17).build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected.
+    }
+    try {
+      factory.validateKeyFormat(AesGcmKeyFormat.newBuilder().setKeySize(31).build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected.
+    }
+    try {
+      factory.validateKeyFormat(AesGcmKeyFormat.newBuilder().setKeySize(33).build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected.
+    }
+    try {
+      factory.validateKeyFormat(AesGcmKeyFormat.newBuilder().setKeySize(64).build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected.
+    }
+  }
+
+  @Test
+  public void createKey_16Bytes() throws Exception {
+    AesGcmKey key = factory.createKey(AesGcmKeyFormat.newBuilder().setKeySize(16).build());
+    assertThat(key.getKeyValue()).hasSize(16);
+  }
+
+  @Test
+  public void createKey_32Bytes() throws Exception {
+    AesGcmKey key = factory.createKey(AesGcmKeyFormat.newBuilder().setKeySize(32).build());
+    assertThat(key.getKeyValue()).hasSize(32);
+  }
+
+  @Test
+  public void createKey_multipleTimes() throws Exception {
+    AesGcmKeyFormat format = AesGcmKeyFormat.newBuilder().setKeySize(16).build();
+    Set<String> keys = new TreeSet<>();
     // Calls newKey multiple times and make sure that they generate different keys.
-    int numTests = 27;
-    for (int i = 0; i < numTests / 3; i++) {
-      AesGcmKey key = (AesGcmKey) keyManager.newKey(gcmKeyFormat);
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-      assertEquals(16, key.getKeyValue().toByteArray().length);
-
-      key = (AesGcmKey) keyManager.newKey(serialized);
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-      assertEquals(16, key.getKeyValue().toByteArray().length);
-
-      KeyData keyData = keyManager.newKeyData(keyTemplate.getValue());
-      key = AesGcmKey.parseFrom(keyData.getValue());
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-      assertEquals(16, key.getKeyValue().toByteArray().length);
+    int numTests = 50;
+    for (int i = 0; i < numTests; i++) {
+      keys.add(TestUtil.hexEncode(factory.createKey(format).getKeyValue().toByteArray()));
     }
-    assertEquals(numTests, keys.size());
+    assertThat(keys).hasSize(numTests);
   }
 
   @Test
-  public void testNewKeyWithCorruptedFormat() throws Exception {
-    ByteString serialized = ByteString.copyFrom(new byte[128]);
-    KeyTemplate keyTemplate =
-        KeyTemplate.newBuilder().setTypeUrl(AesGcmKeyManager.TYPE_URL).setValue(serialized).build();
-    AesGcmKeyManager keyManager = new AesGcmKeyManager();
-    try {
-      keyManager.newKey(serialized);
-      fail("Corrupted format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
-    }
-    try {
-      keyManager.newKeyData(keyTemplate.getValue());
-      fail("Corrupted format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
-    }
-  }
+  public void getPrimitive() throws Exception {
+    AesGcmKey key = factory.createKey(AesGcmKeyFormat.newBuilder().setKeySize(16).build());
+    Aead managerAead = manager.getPrimitive(key, Aead.class);
+    Aead directAead = new AesGcmJce(key.getKeyValue().toByteArray());
 
-  private static final int AES_KEY_SIZE = 16;
+    byte[] plaintext = Random.randBytes(20);
+    byte[] associatedData = Random.randBytes(20);
+    assertThat(directAead.decrypt(managerAead.encrypt(plaintext, associatedData), associatedData))
+        .isEqualTo(plaintext);
+  }
 
   private static class NistTestVector {
     String name;
@@ -297,7 +338,8 @@
         // We support only 12-byte IV and 16-byte tag.
         continue;
       }
-      Aead aead = getRawAesGcm(t.keyValue);
+      AesGcmKey key = AesGcmKey.newBuilder().setKeyValue(ByteString.copyFrom(t.keyValue)).build();
+      Aead aead = manager.getPrimitive(key, Aead.class);
       try {
         byte[] ciphertext = Bytes.concat(t.iv, t.ciphertext, t.tag);
         byte[] plaintext = aead.decrypt(ciphertext, t.aad);
@@ -308,49 +350,14 @@
     }
   }
 
-  private Aead getRawAesGcm(byte[] keyValue) throws Exception {
-    KeysetHandle keysetHandle =
-        TestUtil.createKeysetHandle(
-            TestUtil.createKeyset(
-                TestUtil.createKey(
-                    TestUtil.createAesGcmKeyData(keyValue),
-                    42,
-                    KeyStatusType.ENABLED,
-                    OutputPrefixType.RAW)));
-    return keysetHandle.getPrimitive(Aead.class);
-  }
-
-  @Test
-  public void testBasic() throws Exception {
-    byte[] keyValue = Random.randBytes(AES_KEY_SIZE);
-    KeysetHandle keysetHandle =
-        TestUtil.createKeysetHandle(
-            TestUtil.createKeyset(
-                TestUtil.createKey(
-                    TestUtil.createAesGcmKeyData(keyValue),
-                    42,
-                    KeyStatusType.ENABLED,
-                    OutputPrefixType.TINK)));
-    TestUtil.runBasicAeadTests(keysetHandle.getPrimitive(Aead.class));
-  }
-
   @Test
   public void testCiphertextSize() throws Exception {
-    byte[] keyValue = Random.randBytes(AES_KEY_SIZE);
-    KeysetHandle keysetHandle =
-        TestUtil.createKeysetHandle(
-            TestUtil.createKeyset(
-                TestUtil.createKey(
-                    TestUtil.createAesGcmKeyData(keyValue),
-                    42,
-                    KeyStatusType.ENABLED,
-                    OutputPrefixType.TINK)));
-    Aead aead = keysetHandle.getPrimitive(Aead.class);
+    AesGcmKey key = factory.createKey(AesGcmKeyFormat.newBuilder().setKeySize(32).build());
+    Aead aead = new AesGcmKeyManager().getPrimitive(key, Aead.class);
     byte[] plaintext = "plaintext".getBytes("UTF-8");
     byte[] associatedData = "associatedData".getBytes("UTF-8");
     byte[] ciphertext = aead.encrypt(plaintext, associatedData);
-    assertEquals(
-        CryptoFormat.NON_RAW_PREFIX_SIZE + 12 /* IV_SIZE */ + plaintext.length + 16 /* TAG_SIZE */,
-        ciphertext.length);
+    assertThat(ciphertext.length)
+        .isEqualTo(12 /* IV_SIZE */ + plaintext.length + 16 /* TAG_SIZE */);
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/aead/ChaCha20Poly1305KeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/aead/ChaCha20Poly1305KeyManagerTest.java
index e43d976..731c225 100644
--- a/java/src/test/java/com/google/crypto/tink/aead/ChaCha20Poly1305KeyManagerTest.java
+++ b/java/src/test/java/com/google/crypto/tink/aead/ChaCha20Poly1305KeyManagerTest.java
@@ -16,19 +16,19 @@
 
 package com.google.crypto.tink.aead;
 
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
 
 import com.google.crypto.tink.Aead;
-import com.google.crypto.tink.CryptoFormat;
-import com.google.crypto.tink.KeysetHandle;
 import com.google.crypto.tink.TestUtil;
 import com.google.crypto.tink.proto.ChaCha20Poly1305Key;
-import com.google.crypto.tink.proto.KeyData;
-import com.google.crypto.tink.proto.KeyTemplate;
+import com.google.crypto.tink.proto.ChaCha20Poly1305KeyFormat;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
+import com.google.crypto.tink.subtle.Random;
+import com.google.protobuf.ByteString;
 import java.security.GeneralSecurityException;
-import java.util.Set;
 import java.util.TreeSet;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -36,46 +36,107 @@
 /** Test for ChaCha20Poly1305KeyManager. */
 @RunWith(JUnit4.class)
 public class ChaCha20Poly1305KeyManagerTest {
-  @BeforeClass
-  public static void setUp() throws GeneralSecurityException {
-    AeadConfig.register();
+  @Test
+  public void basics() throws Exception {
+    assertThat(new ChaCha20Poly1305KeyManager().getKeyType())
+        .isEqualTo("type.googleapis.com/google.crypto.tink.ChaCha20Poly1305Key");
+    assertThat(new ChaCha20Poly1305KeyManager().getVersion()).isEqualTo(0);
+    assertThat(new ChaCha20Poly1305KeyManager().keyMaterialType())
+        .isEqualTo(KeyMaterialType.SYMMETRIC);
   }
 
   @Test
-  public void testBasic() throws Exception {
-    KeysetHandle keysetHandle = KeysetHandle.generateNew(AeadKeyTemplates.CHACHA20_POLY1305);
-    TestUtil.runBasicAeadTests(keysetHandle.getPrimitive(Aead.class));
+  public void validateKeyFormat() throws Exception {
+    new ChaCha20Poly1305KeyManager()
+        .keyFactory()
+        .validateKeyFormat(ChaCha20Poly1305KeyFormat.getDefaultInstance());
+  }
+
+
+  @Test
+  public void validateKey_empty() throws Exception {
+    try {
+      new ChaCha20Poly1305KeyManager().validateKey(ChaCha20Poly1305Key.getDefaultInstance());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKey_checkAllLengths() throws Exception {
+    ChaCha20Poly1305KeyManager manager = new ChaCha20Poly1305KeyManager();
+    for (int i = 0; i < 100; i++) {
+      if (i == 32) {
+        manager.validateKey(createChaCha20Poly1305Key(i));
+      } else {
+        try {
+          manager.validateKey(createChaCha20Poly1305Key(i));
+          fail();
+        } catch (GeneralSecurityException e) {
+          // expected
+        }
+      }
+    }
+  }
+
+  @Test
+  public void validateKey_version() throws Exception {
+    ChaCha20Poly1305KeyManager manager = new ChaCha20Poly1305KeyManager();
+
+    try {
+      manager.validateKey(
+          ChaCha20Poly1305Key.newBuilder(createChaCha20Poly1305Key(32)).setVersion(1).build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void createKey_valid() throws Exception {
+    ChaCha20Poly1305KeyManager manager = new ChaCha20Poly1305KeyManager();
+    manager.validateKey(
+        manager.keyFactory().createKey(ChaCha20Poly1305KeyFormat.getDefaultInstance()));
+  }
+
+  @Test
+  public void createKey_values() throws Exception {
+    ChaCha20Poly1305KeyManager manager = new ChaCha20Poly1305KeyManager();
+    ChaCha20Poly1305Key key =
+        manager.keyFactory().createKey(ChaCha20Poly1305KeyFormat.getDefaultInstance());
+    assertThat(key.getVersion()).isEqualTo(0);
+    assertThat(key.getKeyValue()).hasSize(32);
+  }
+
+  @Test
+  public void createKey_multipleCallsCreateDifferentKeys() throws Exception {
+    TreeSet<String> keys = new TreeSet<>();
+    ChaCha20Poly1305KeyManager.KeyFactory<ChaCha20Poly1305KeyFormat, ChaCha20Poly1305Key> factory =
+        new ChaCha20Poly1305KeyManager().keyFactory();
+    final int numKeys = 1000;
+    for (int i = 0; i < numKeys; ++i) {
+      keys.add(
+          TestUtil.hexEncode(
+              factory.createKey(ChaCha20Poly1305KeyFormat.getDefaultInstance()).toByteArray()));
+    }
+    assertThat(keys).hasSize(numKeys);
   }
 
   @Test
   public void testCiphertextSize() throws Exception {
-    KeysetHandle keysetHandle = KeysetHandle.generateNew(AeadKeyTemplates.CHACHA20_POLY1305);
-    Aead aead = keysetHandle.getPrimitive(Aead.class);
+    Aead aead =
+        new ChaCha20Poly1305KeyManager().getPrimitive(createChaCha20Poly1305Key(32), Aead.class);
     byte[] plaintext = "plaintext".getBytes("UTF-8");
     byte[] associatedData = "associatedData".getBytes("UTF-8");
     byte[] ciphertext = aead.encrypt(plaintext, associatedData);
-    assertEquals(
-        CryptoFormat.NON_RAW_PREFIX_SIZE + 12 /* IV_SIZE */ + plaintext.length + 16 /* TAG_SIZE */,
-        ciphertext.length);
+    assertEquals(12 /* IV_SIZE */ + plaintext.length + 16 /* TAG_SIZE */, ciphertext.length);
   }
 
-  @Test
-  public void testNewKeyMultipleTimes() throws Exception {
-    KeyTemplate keyTemplate = AeadKeyTemplates.CHACHA20_POLY1305;
-    ChaCha20Poly1305KeyManager keyManager = new ChaCha20Poly1305KeyManager();
-    Set<String> keys = new TreeSet<String>();
-    // Calls newKey multiple times and make sure that they generate different keys.
-    int numTests = 10;
-    for (int i = 0; i < numTests; i++) {
-      ChaCha20Poly1305Key key = (ChaCha20Poly1305Key) keyManager.newKey(keyTemplate.getValue());
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-      assertEquals(32, key.getKeyValue().toByteArray().length);
-
-      KeyData keyData = keyManager.newKeyData(keyTemplate.getValue());
-      key = ChaCha20Poly1305Key.parseFrom(keyData.getValue());
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-      assertEquals(32, key.getKeyValue().toByteArray().length);
-    }
-    assertEquals(numTests * 2, keys.size());
+  private ChaCha20Poly1305Key createChaCha20Poly1305Key(int keySize) {
+    return ChaCha20Poly1305Key.newBuilder()
+        .setVersion(0)
+        .setKeyValue(ByteString.copyFrom(Random.randBytes(keySize)))
+        .build();
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/aead/XChaCha20Poly1305KeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/aead/XChaCha20Poly1305KeyManagerTest.java
index 37c5e1c..58f77ee 100644
--- a/java/src/test/java/com/google/crypto/tink/aead/XChaCha20Poly1305KeyManagerTest.java
+++ b/java/src/test/java/com/google/crypto/tink/aead/XChaCha20Poly1305KeyManagerTest.java
@@ -16,19 +16,17 @@
 
 package com.google.crypto.tink.aead;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 
 import com.google.crypto.tink.Aead;
-import com.google.crypto.tink.CryptoFormat;
-import com.google.crypto.tink.KeysetHandle;
 import com.google.crypto.tink.TestUtil;
-import com.google.crypto.tink.proto.KeyData;
-import com.google.crypto.tink.proto.KeyTemplate;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.proto.XChaCha20Poly1305Key;
-import java.security.GeneralSecurityException;
+import com.google.crypto.tink.proto.XChaCha20Poly1305KeyFormat;
+import com.google.crypto.tink.subtle.Random;
+import com.google.crypto.tink.subtle.XChaCha20Poly1305;
 import java.util.Set;
 import java.util.TreeSet;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -36,46 +34,65 @@
 /** Test for XChaCha20Poly1305KeyManager. */
 @RunWith(JUnit4.class)
 public class XChaCha20Poly1305KeyManagerTest {
-  @BeforeClass
-  public static void setUp() throws GeneralSecurityException {
-    AeadConfig.register();
+  private final XChaCha20Poly1305KeyManager manager = new XChaCha20Poly1305KeyManager();
+  private final XChaCha20Poly1305KeyManager.KeyFactory<
+          XChaCha20Poly1305KeyFormat, XChaCha20Poly1305Key>
+      factory = manager.keyFactory();
+
+  @Test
+  public void basics() throws Exception {
+    assertThat(manager.getKeyType())
+        .isEqualTo("type.googleapis.com/google.crypto.tink.XChaCha20Poly1305Key");
+    assertThat(manager.getVersion()).isEqualTo(0);
+    assertThat(manager.keyMaterialType()).isEqualTo(KeyMaterialType.SYMMETRIC);
   }
 
   @Test
-  public void testBasic() throws Exception {
-    KeysetHandle keysetHandle = KeysetHandle.generateNew(AeadKeyTemplates.XCHACHA20_POLY1305);
-    TestUtil.runBasicAeadTests(keysetHandle.getPrimitive(Aead.class));
+  public void validateKeyFormat() throws Exception {
+    factory.validateKeyFormat(XChaCha20Poly1305KeyFormat.getDefaultInstance());
   }
 
   @Test
-  public void testCiphertextSize() throws Exception {
-    KeysetHandle keysetHandle = KeysetHandle.generateNew(AeadKeyTemplates.XCHACHA20_POLY1305);
-    Aead aead = keysetHandle.getPrimitive(Aead.class);
-    byte[] plaintext = "plaintext".getBytes("UTF-8");
-    byte[] associatedData = "associatedData".getBytes("UTF-8");
-    byte[] ciphertext = aead.encrypt(plaintext, associatedData);
-    assertEquals(
-        CryptoFormat.NON_RAW_PREFIX_SIZE + 24 /* IV_SIZE */ + plaintext.length + 16 /* TAG_SIZE */,
-        ciphertext.length);
+  public void createKey_valid() throws Exception {
+    manager.validateKey(factory.createKey(XChaCha20Poly1305KeyFormat.getDefaultInstance()));
   }
 
   @Test
-  public void testNewKeyMultipleTimes() throws Exception {
-    KeyTemplate keyTemplate = AeadKeyTemplates.XCHACHA20_POLY1305;
-    XChaCha20Poly1305KeyManager keyManager = new XChaCha20Poly1305KeyManager();
-    Set<String> keys = new TreeSet<String>();
-    // Calls newKey multiple times and make sure that they generate different keys.
-    int numTests = 10;
-    for (int i = 0; i < numTests; i++) {
-      XChaCha20Poly1305Key key = (XChaCha20Poly1305Key) keyManager.newKey(keyTemplate.getValue());
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-      assertEquals(32, key.getKeyValue().toByteArray().length);
+  public void createKey_correctVersion() throws Exception {
+    assertThat(factory.createKey(XChaCha20Poly1305KeyFormat.getDefaultInstance()).getVersion())
+        .isEqualTo(0);
+  }
 
-      KeyData keyData = keyManager.newKeyData(keyTemplate.getValue());
-      key = XChaCha20Poly1305Key.parseFrom(keyData.getValue());
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-      assertEquals(32, key.getKeyValue().toByteArray().length);
+  @Test
+  public void createKey_keySize() throws Exception {
+    assertThat(factory.createKey(XChaCha20Poly1305KeyFormat.getDefaultInstance()).getKeyValue())
+        .hasSize(32);
+  }
+
+  @Test
+  public void createKey_multipleCallsCreateDifferentKeys() throws Exception {
+    Set<String> keys = new TreeSet<>();
+    final int numKeys = 100;
+    for (int i = 0; i < numKeys; ++i) {
+      keys.add(
+          TestUtil.hexEncode(
+              factory
+                  .createKey(XChaCha20Poly1305KeyFormat.getDefaultInstance())
+                  .getKeyValue()
+                  .toByteArray()));
     }
-    assertEquals(numTests * 2, keys.size());
+    assertThat(keys).hasSize(numKeys);
+  }
+
+  @Test
+  public void getPrimitive() throws Exception {
+    XChaCha20Poly1305Key key = factory.createKey(XChaCha20Poly1305KeyFormat.getDefaultInstance());
+    Aead managerAead = manager.getPrimitive(key, Aead.class);
+    Aead directAead = new XChaCha20Poly1305(key.getKeyValue().toByteArray());
+
+    byte[] plaintext = Random.randBytes(20);
+    byte[] associatedData = Random.randBytes(20);
+    assertThat(directAead.decrypt(managerAead.encrypt(plaintext, associatedData), associatedData))
+        .isEqualTo(plaintext);
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/config/TinkConfigTest.java b/java/src/test/java/com/google/crypto/tink/config/TinkConfigTest.java
index d9908bf..6326ecc 100644
--- a/java/src/test/java/com/google/crypto/tink/config/TinkConfigTest.java
+++ b/java/src/test/java/com/google/crypto/tink/config/TinkConfigTest.java
@@ -17,13 +17,10 @@
 package com.google.crypto.tink.config;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 import com.google.crypto.tink.Config;
 import com.google.crypto.tink.Registry;
-import com.google.crypto.tink.TestUtil;
-import com.google.crypto.tink.proto.RegistryConfig;
 import java.security.GeneralSecurityException;
 import org.junit.FixMethodOrder;
 import org.junit.Test;
@@ -90,37 +87,37 @@
     String signTypeUrl = "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey";
     String streamingAeadTypeUrl = "type.googleapis.com/google.crypto.tink.AesCtrHmacStreamingKey";
     try {
-      Registry.getKeyManager(macTypeUrl);
+      Registry.getUntypedKeyManager(macTypeUrl);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
       assertThat(e.toString()).contains("No key manager found");
     }
     try {
-      Registry.getKeyManager(aeadTypeUrl);
+      Registry.getUntypedKeyManager(aeadTypeUrl);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
       assertThat(e.toString()).contains("No key manager found");
     }
     try {
-      Registry.getKeyManager(daeadTypeUrl);
+      Registry.getUntypedKeyManager(daeadTypeUrl);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
       assertThat(e.toString()).contains("No key manager found");
     }
     try {
-      Registry.getKeyManager(hybridTypeUrl);
+      Registry.getUntypedKeyManager(hybridTypeUrl);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
       assertThat(e.toString()).contains("No key manager found");
     }
     try {
-      Registry.getKeyManager(signTypeUrl);
+      Registry.getUntypedKeyManager(signTypeUrl);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
       assertThat(e.toString()).contains("No key manager found");
     }
     try {
-      Registry.getKeyManager(streamingAeadTypeUrl);
+      Registry.getUntypedKeyManager(streamingAeadTypeUrl);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
       assertThat(e.toString()).contains("No key manager found");
@@ -129,241 +126,13 @@
     // Initialize the config.
     TinkConfig.register();
 
-    // Now the catalogues should be present.
-    Registry.getCatalogue("tinkmac");
-    Registry.getCatalogue("tinkaead");
-    Registry.getCatalogue("tinkdeterministicaead");
-    Registry.getCatalogue("tinkhybridencrypt");
-    Registry.getCatalogue("tinkhybriddecrypt");
-    Registry.getCatalogue("tinkpublickeysign");
-    Registry.getCatalogue("tinkpublickeyverify");
-
     // After registration the key managers should be present.
     Config.register(TinkConfig.TINK_1_1_0);
-    Registry.getKeyManager(macTypeUrl);
-    Registry.getKeyManager(aeadTypeUrl);
-    Registry.getKeyManager(daeadTypeUrl);
-    Registry.getKeyManager(hybridTypeUrl);
-    Registry.getKeyManager(signTypeUrl);
-    Registry.getKeyManager(streamingAeadTypeUrl);
-  }
-
-  @Test
-  public void testConfigContentsVersion1_0_0() throws Exception {
-    RegistryConfig config = TinkConfig.TINK_1_0_0;
-    assertEquals(13, config.getEntryCount());
-    assertEquals("TINK_1_0_0", config.getConfigName());
-
-    TestUtil.verifyConfigEntry(
-        config.getEntry(0),
-        "TinkMac",
-        "Mac",
-        "type.googleapis.com/google.crypto.tink.HmacKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(1),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(2),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesEaxKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(3),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesGcmKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(4),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.ChaCha20Poly1305Key",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(5),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.KmsAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(6),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.KmsEnvelopeAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(7),
-        "TinkHybridDecrypt",
-        "HybridDecrypt",
-        "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(8),
-        "TinkHybridEncrypt",
-        "HybridEncrypt",
-        "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(9),
-        "TinkPublicKeySign",
-        "PublicKeySign",
-        "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(10),
-        "TinkPublicKeySign",
-        "PublicKeySign",
-        "type.googleapis.com/google.crypto.tink.Ed25519PrivateKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(11),
-        "TinkPublicKeyVerify",
-        "PublicKeyVerify",
-        "type.googleapis.com/google.crypto.tink.EcdsaPublicKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(12),
-        "TinkPublicKeyVerify",
-        "PublicKeyVerify",
-        "type.googleapis.com/google.crypto.tink.Ed25519PublicKey",
-        true,
-        0);
-  }
-
-  @Test
-  public void testConfigContentsVersion1_1_0() throws Exception {
-    RegistryConfig config = TinkConfig.TINK_1_1_0;
-    assertEquals(16, config.getEntryCount());
-    assertEquals("TINK_1_1_0", config.getConfigName());
-
-    TestUtil.verifyConfigEntry(
-        config.getEntry(0),
-        "TinkMac",
-        "Mac",
-        "type.googleapis.com/google.crypto.tink.HmacKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(1),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(2),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesEaxKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(3),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesGcmKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(4),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.ChaCha20Poly1305Key",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(5),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.KmsAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(6),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.KmsEnvelopeAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(7),
-        "TinkHybridDecrypt",
-        "HybridDecrypt",
-        "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(8),
-        "TinkHybridEncrypt",
-        "HybridEncrypt",
-        "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(9),
-        "TinkPublicKeySign",
-        "PublicKeySign",
-        "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(10),
-        "TinkPublicKeySign",
-        "PublicKeySign",
-        "type.googleapis.com/google.crypto.tink.Ed25519PrivateKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(11),
-        "TinkPublicKeyVerify",
-        "PublicKeyVerify",
-        "type.googleapis.com/google.crypto.tink.EcdsaPublicKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(12),
-        "TinkPublicKeyVerify",
-        "PublicKeyVerify",
-        "type.googleapis.com/google.crypto.tink.Ed25519PublicKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(13),
-        "TinkDeterministicAead",
-        "DeterministicAead",
-        "type.googleapis.com/google.crypto.tink.AesSivKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(14),
-        "TinkStreamingAead",
-        "StreamingAead",
-        "type.googleapis.com/google.crypto.tink.AesCtrHmacStreamingKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(15),
-        "TinkStreamingAead",
-        "StreamingAead",
-        "type.googleapis.com/google.crypto.tink.AesGcmHkdfStreamingKey",
-        true,
-        0);
+    Registry.getUntypedKeyManager(macTypeUrl);
+    Registry.getUntypedKeyManager(aeadTypeUrl);
+    Registry.getUntypedKeyManager(daeadTypeUrl);
+    Registry.getUntypedKeyManager(hybridTypeUrl);
+    Registry.getUntypedKeyManager(signTypeUrl);
+    Registry.getUntypedKeyManager(streamingAeadTypeUrl);
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/daead/AesSivKeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/daead/AesSivKeyManagerTest.java
index 4650439..4d92431 100644
--- a/java/src/test/java/com/google/crypto/tink/daead/AesSivKeyManagerTest.java
+++ b/java/src/test/java/com/google/crypto/tink/daead/AesSivKeyManagerTest.java
@@ -16,27 +16,19 @@
 
 package com.google.crypto.tink.daead;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
-import com.google.crypto.tink.CryptoFormat;
 import com.google.crypto.tink.DeterministicAead;
-import com.google.crypto.tink.KeysetHandle;
 import com.google.crypto.tink.TestUtil;
 import com.google.crypto.tink.proto.AesSivKey;
 import com.google.crypto.tink.proto.AesSivKeyFormat;
-import com.google.crypto.tink.proto.KeyData;
-import com.google.crypto.tink.proto.KeyTemplate;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.subtle.Random;
 import com.google.protobuf.ByteString;
 import java.security.GeneralSecurityException;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.util.Set;
 import java.util.TreeSet;
 import javax.crypto.Cipher;
-import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -44,135 +36,122 @@
 /** Test for AesSivKeyManager. */
 @RunWith(JUnit4.class)
 public class AesSivKeyManagerTest {
-  private KeyTemplate[] keyTemplates;
-
-  @BeforeClass
-  public static void setUp() throws GeneralSecurityException {
-    DeterministicAeadConfig.register();
+  @Test
+  public void basics() throws Exception {
+    assertThat(new AesSivKeyManager().getKeyType())
+        .isEqualTo("type.googleapis.com/google.crypto.tink.AesSivKey");
+    assertThat(new AesSivKeyManager().getVersion()).isEqualTo(0);
+    assertThat(new AesSivKeyManager().keyMaterialType()).isEqualTo(KeyMaterialType.SYMMETRIC);
   }
 
-  @Before
-  public void setUp2() throws Exception {
-    if (Cipher.getMaxAllowedKeyLength("AES") < 256) {
-      System.out.println(
-          "Unlimited Strength Jurisdiction Policy Files are required"
-              + " but not installed. Skip all DeterministicAeadFactory tests");
-      keyTemplates = new KeyTemplate[] {};
-    } else {
-      keyTemplates = new KeyTemplate[] {DeterministicAeadKeyTemplates.AES256_SIV};
+  @Test
+  public void validateKeyFormat_empty() throws Exception {
+    try {
+      new AesSivKeyManager().keyFactory().validateKeyFormat(AesSivKeyFormat.getDefaultInstance());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
     }
   }
 
   @Test
+  public void validateKeyFormat_checkAllLengths() throws Exception {
+    AesSivKeyManager manager = new AesSivKeyManager();
+    for (int i = 0; i < 100; i++) {
+      if (i == 64) {
+        manager.keyFactory().validateKeyFormat(createAesSivKeyFormat(i));
+      } else {
+        try {
+          manager.keyFactory().validateKeyFormat(createAesSivKeyFormat(i));
+          fail();
+        } catch (GeneralSecurityException e) {
+          // expected
+        }
+      }
+    }
+  }
+
+  @Test
+  public void validateKey_empty() throws Exception {
+    try {
+      new AesSivKeyManager().validateKey(AesSivKey.getDefaultInstance());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKey_checkAllLengths() throws Exception {
+    AesSivKeyManager manager = new AesSivKeyManager();
+    for (int i = 0; i < 100; i++) {
+      if (i == 64) {
+        manager.validateKey(createAesSivKey(i));
+      } else {
+        try {
+          manager.validateKey(createAesSivKey(i));
+          fail();
+        } catch (GeneralSecurityException e) {
+          // expected
+        }
+      }
+    }
+  }
+
+  @Test
+  public void validateKey_version() throws Exception {
+    AesSivKeyManager manager = new AesSivKeyManager();
+    try {
+      manager.validateKey(AesSivKey.newBuilder(createAesSivKey(64)).setVersion(1).build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void createKey_valid() throws Exception {
+    AesSivKeyFormat format = createAesSivKeyFormat(64);
+    AesSivKey key = new AesSivKeyManager().keyFactory().createKey(format);
+    new AesSivKeyManager().validateKey(key);
+  }
+
+  @Test
+  public void createKey_values() throws Exception {
+    AesSivKeyFormat format = createAesSivKeyFormat(64);
+    AesSivKey key = new AesSivKeyManager().keyFactory().createKey(format);
+    assertThat(key.getVersion()).isEqualTo(0);
+    assertThat(key.getKeyValue()).hasSize(format.getKeySize());
+  }
+
+  @Test
+  public void createKey_multipleCallsCreateDifferentKeys() throws Exception {
+    AesSivKeyFormat format = createAesSivKeyFormat(64);
+    TreeSet<String> keys = new TreeSet<>();
+    AesSivKeyManager.KeyFactory<AesSivKeyFormat, AesSivKey> factory =
+        new AesSivKeyManager().keyFactory();
+    final int numKeys = 1000;
+    for (int i = 0; i < numKeys; ++i) {
+      keys.add(TestUtil.hexEncode(factory.createKey(format).toByteArray()));
+    }
+    assertThat(keys).hasSize(numKeys);
+  }
+
+  @Test
   public void testCiphertextSize() throws Exception {
-    for (KeyTemplate template : keyTemplates) {
-      KeysetHandle keysetHandle = KeysetHandle.generateNew(template);
-      DeterministicAead daead = keysetHandle.getPrimitive(DeterministicAead.class);
-      byte[] plaintext = "plaintext".getBytes("UTF-8");
-      byte[] associatedData = "associatedData".getBytes("UTF-8");
-      byte[] ciphertext = daead.encryptDeterministically(plaintext, associatedData);
-      assertEquals(
-          CryptoFormat.NON_RAW_PREFIX_SIZE + plaintext.length + 16 /* IV_SIZE */,
-          ciphertext.length);
-    }
-  }
-
-  @Test
-  public void testNewKeyMultipleTimes() throws Exception {
-    for (KeyTemplate keyTemplate : keyTemplates) {
-      AesSivKeyManager keyManager = new AesSivKeyManager();
-      Set<String> keys = new TreeSet<String>();
-      // Calls newKey multiple times and make sure that they generate different keys.
-      int numTests = 10;
-      for (int i = 0; i < numTests; i++) {
-        AesSivKey key = (AesSivKey) keyManager.newKey(keyTemplate.getValue());
-        keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-
-        KeyData keyData = keyManager.newKeyData(keyTemplate.getValue());
-        key = AesSivKey.parseFrom(keyData.getValue());
-        keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-      }
-      assertEquals(numTests * 2, keys.size());
-    }
-  }
-
-  @Test
-  public void testNewKeyWithInvalidKeyFormats() throws Exception {
     if (Cipher.getMaxAllowedKeyLength("AES") < 256) {
       System.out.println(
           "Unlimited Strength Jurisdiction Policy Files are required"
-              + " but not installed. Skip all AesSivKeyManager tests");
+              + " but not installed. Skipping testCiphertextSize");
       return;
     }
 
-    AesSivKeyManager keyManager = new AesSivKeyManager();
-
-    try {
-      // AesSiv doesn't accept 32-byte keys.
-      keyManager.newKey(createAesSivKeyFormat(32));
-      fail("32-byte keys should not be accepted");
-    } catch (InvalidAlgorithmParameterException ex) {
-      // expected.
-    }
-
-    try {
-      // AesSiv doesn't accept 48-byte keys.
-      keyManager.newKey(createAesSivKeyFormat(48));
-      fail("48-byte keys should not be accepted");
-    } catch (InvalidAlgorithmParameterException ex) {
-      // expected.
-    }
-
-    for (int j = 0; j < 100; j++) {
-      if (j == 64) {
-        continue;
-      }
-
-      try {
-        keyManager.newKey(createAesSivKeyFormat(j));
-        fail("Keys with invalid size should not be accepted: " + j);
-      } catch (InvalidAlgorithmParameterException ex) {
-        // expected.
-      }
-    }
-  }
-
-  @Test
-  public void testGetPrimitiveWithInvalidKeys() throws Exception {
-    if (Cipher.getMaxAllowedKeyLength("AES") < 256) {
-      System.out.println(
-          "Unlimited Strength Jurisdiction Policy Files are required"
-              + " but not installed. Skip all AesSivKeyManager tests");
-      return;
-    }
-    AesSivKeyManager keyManager = new AesSivKeyManager();
-
-    try {
-      keyManager.getPrimitive(createAesSivKey(32));
-      fail("32-byte keys should not be accepted");
-    } catch (InvalidKeyException ex) {
-      // expected.
-    }
-
-    try {
-      keyManager.getPrimitive(createAesSivKey(48));
-      fail("48-byte keys should not be accepted");
-    } catch (InvalidKeyException ex) {
-      // expected.
-    }
-
-    for (int j = 0; j < 100; j++) {
-      if (j == 64) {
-        continue;
-      }
-
-      try {
-        keyManager.getPrimitive(createAesSivKey(j));
-        fail("Keys with invalid size should not be accepted: " + j);
-      } catch (InvalidKeyException ex) {
-        // expected.
-      }
-    }
+    DeterministicAead daead =
+        new AesSivKeyManager().getPrimitive(createAesSivKey(64), DeterministicAead.class);
+    byte[] plaintext = "plaintext".getBytes("UTF-8");
+    byte[] associatedData = "associatedData".getBytes("UTF-8");
+    assertThat(daead.encryptDeterministically(plaintext, associatedData))
+        .hasLength(plaintext.length + /* IV_SIZE= */ 16);
   }
 
   private AesSivKeyFormat createAesSivKeyFormat(int keySize) {
diff --git a/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadCatalogueTest.java b/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadCatalogueTest.java
deleted file mode 100644
index da9064e..0000000
--- a/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadCatalogueTest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package com.google.crypto.tink.daead;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import com.google.crypto.tink.DeterministicAead;
-import com.google.crypto.tink.KeyManager;
-import com.google.crypto.tink.proto.KeyTypeEntry;
-import com.google.crypto.tink.proto.RegistryConfig;
-import java.security.GeneralSecurityException;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for DeterministicAeadCatalogue. */
-@RunWith(JUnit4.class)
-public class DeterministicAeadCatalogueTest {
-
-  @Test
-  public void testBasic() throws Exception {
-    DeterministicAeadCatalogue catalogue = new DeterministicAeadCatalogue();
-
-    // Check a single key type, incl. case-insensitve primitive name.
-    String keyType = "type.googleapis.com/google.crypto.tink.AesSivKey";
-    {
-      KeyManager<DeterministicAead> manager =
-          catalogue.getKeyManager(keyType, "DeterministicAead", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-    {
-      KeyManager<DeterministicAead> manager =
-          catalogue.getKeyManager(keyType, "DeterministicAEaD", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-    {
-      KeyManager<DeterministicAead> manager =
-          catalogue.getKeyManager(keyType, "dEtermInisticaeAD", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-
-    // Check all entries from the current DeterministicAeadConfig.
-    RegistryConfig config = DeterministicAeadConfig.TINK_1_1_0;
-    int count = 0;
-    for (KeyTypeEntry entry : config.getEntryList()) {
-      if ("DeterministicAead".equals(entry.getPrimitiveName())) {
-        count = count + 1;
-        KeyManager<DeterministicAead> manager =
-            catalogue.getKeyManager(
-                entry.getTypeUrl(), "deterministicaead", entry.getKeyManagerVersion());
-        assertThat(manager.doesSupport(entry.getTypeUrl())).isTrue();
-      }
-    }
-    assertEquals(1, count);
-  }
-
-  @Test
-  public void testErrors() throws Exception {
-    DeterministicAeadCatalogue catalogue = new DeterministicAeadCatalogue();
-    String keyType = "type.googleapis.com/google.crypto.tink.AesSivKey";
-
-    // Wrong primitive name.
-    try {
-      catalogue.getKeyManager(keyType, "mac", 0);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No support for primitive");
-    }
-
-    // Wrong key manager version.
-    try {
-      catalogue.getKeyManager(keyType, "deterministicaead", 1);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No key manager");
-      assertThat(e.toString()).contains("version at least");
-    }
-
-    // Wrong key type.
-    try {
-      catalogue.getKeyManager("some.unknown.key.type", "deterministicaead", 0);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No support for primitive");
-      assertThat(e.toString()).contains("with key type");
-    }
-  }
-}
diff --git a/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadConfigTest.java b/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadConfigTest.java
index fae44b0..c88a9c7 100644
--- a/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadConfigTest.java
+++ b/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadConfigTest.java
@@ -17,12 +17,10 @@
 package com.google.crypto.tink.daead;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
+import com.google.crypto.tink.DeterministicAead;
 import com.google.crypto.tink.Registry;
-import com.google.crypto.tink.TestUtil;
-import com.google.crypto.tink.proto.RegistryConfig;
 import java.security.GeneralSecurityException;
 import org.junit.FixMethodOrder;
 import org.junit.Test;
@@ -52,7 +50,7 @@
     // Before registration, the key manager should be absent.
     String typeUrl = "type.googleapis.com/google.crypto.tink.AesSivKey";
     try {
-      Registry.getKeyManager(typeUrl);
+      Registry.getUntypedKeyManager(typeUrl);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
       assertThat(e.toString()).contains("No key manager found");
@@ -61,44 +59,10 @@
     // Initialize the config.
     DeterministicAeadConfig.register();
 
-    // Now the catalogues should be present.
-    RegistryConfig unused = DeterministicAeadConfig.TINK_1_1_0;
-    Registry.getCatalogue("tinkdeterministicaead");
-
     // After registration, the key manager should be present.
-    Registry.getKeyManager(typeUrl);
+    Registry.getKeyManager(typeUrl, DeterministicAead.class);
 
     // Running init() manually again should succeed.
     DeterministicAeadConfig.register();
   }
-
-  @Test
-  public void testConfigContents_1_1_0() throws Exception {
-    RegistryConfig config = DeterministicAeadConfig.TINK_1_1_0;
-    assertEquals(1, config.getEntryCount());
-    assertEquals("TINK_DETERMINISTIC_AEAD_1_1_0", config.getConfigName());
-
-    TestUtil.verifyConfigEntry(
-        config.getEntry(0),
-        "TinkDeterministicAead",
-        "DeterministicAead",
-        "type.googleapis.com/google.crypto.tink.AesSivKey",
-        true,
-        0);
-  }
-
-  @Test
-  public void testConfigContents_LATEST() throws Exception {
-    RegistryConfig config = DeterministicAeadConfig.LATEST;
-    assertEquals(1, config.getEntryCount());
-    assertEquals("TINK_DETERMINISTIC_AEAD", config.getConfigName());
-
-    TestUtil.verifyConfigEntry(
-        config.getEntry(0),
-        "TinkDeterministicAead",
-        "DeterministicAead",
-        "type.googleapis.com/google.crypto.tink.AesSivKey",
-        true,
-        0);
-  }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadFactoryTest.java b/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadFactoryTest.java
index cc9ff55..9a77a29 100644
--- a/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadFactoryTest.java
+++ b/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadFactoryTest.java
@@ -216,8 +216,7 @@
       DeterministicAeadFactory.getPrimitive(keysetHandle);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertExceptionContains(
-          e, "not match requested primitive type com.google.crypto.tink.DeterministicAead");
+      assertExceptionContains(e, "com.google.crypto.tink.DeterministicAead not supported");
     }
 
     // invalid as the primary key.
@@ -226,8 +225,7 @@
       DeterministicAeadFactory.getPrimitive(keysetHandle);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertExceptionContains(
-          e, "not match requested primitive type com.google.crypto.tink.DeterministicAead");
+      assertExceptionContains(e, "com.google.crypto.tink.DeterministicAead not supported");
     }
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadIntegrationTest.java b/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadIntegrationTest.java
index db36ac7..2f945be 100644
--- a/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadIntegrationTest.java
+++ b/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadIntegrationTest.java
@@ -216,8 +216,7 @@
       keysetHandle.getPrimitive(DeterministicAead.class);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertExceptionContains(
-          e, "not match requested primitive type com.google.crypto.tink.DeterministicAead");
+      assertExceptionContains(e, "com.google.crypto.tink.DeterministicAead not supported");
     }
 
     // invalid as the primary key.
@@ -226,8 +225,7 @@
       keysetHandle.getPrimitive(DeterministicAead.class);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertExceptionContains(
-          e, "not match requested primitive type com.google.crypto.tink.DeterministicAead");
+      assertExceptionContains(e, "com.google.crypto.tink.DeterministicAead not supported");
     }
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadKeyTemplatesTest.java b/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadKeyTemplatesTest.java
index 3656f6b..bc86fcd 100644
--- a/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadKeyTemplatesTest.java
+++ b/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadKeyTemplatesTest.java
@@ -31,7 +31,7 @@
   @Test
   public void testAES256_SIV() throws Exception {
     KeyTemplate template = DeterministicAeadKeyTemplates.AES256_SIV;
-    assertEquals(AesSivKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new AesSivKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     AesSivKeyFormat format = AesSivKeyFormat.parseFrom(
         template.getValue());
@@ -45,7 +45,7 @@
     // to test that the function correctly puts them in the resulting template.
     int keySize = 42;
     KeyTemplate template = DeterministicAeadKeyTemplates.createAesSivKeyTemplate(keySize);
-    assertEquals(AesSivKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new AesSivKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     AesSivKeyFormat format = AesSivKeyFormat.parseFrom(template.getValue());
 
diff --git a/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadWrapperTest.java b/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadWrapperTest.java
index 23d40b5..8498678 100644
--- a/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadWrapperTest.java
+++ b/java/src/test/java/com/google/crypto/tink/daead/DeterministicAeadWrapperTest.java
@@ -111,7 +111,8 @@
         TestUtil.createKeysetHandle(TestUtil.createKeyset(primary, raw, legacy, tink));
 
     DeterministicAead daead =
-        new DeterministicAeadWrapper().wrap(Registry.getPrimitives(keysetHandle));
+        new DeterministicAeadWrapper()
+            .wrap(Registry.getPrimitives(keysetHandle, DeterministicAead.class));
     byte[] plaintext = Random.randBytes(20);
     byte[] associatedData = Random.randBytes(20);
     byte[] ciphertext = daead.encryptDeterministically(plaintext, associatedData);
@@ -124,7 +125,8 @@
     KeysetHandle keysetHandle2 =
         TestUtil.createKeysetHandle(TestUtil.createKeyset(raw, legacy, tink));
     DeterministicAead daead2 =
-        new DeterministicAeadWrapper().wrap(Registry.getPrimitives(keysetHandle2));
+        new DeterministicAeadWrapper()
+            .wrap(Registry.getPrimitives(keysetHandle2, DeterministicAead.class));
     ciphertext = daead2.encryptDeterministically(plaintext, associatedData);
     assertArrayEquals(plaintext, daead.decryptDeterministically(ciphertext, associatedData));
 
@@ -136,7 +138,9 @@
             KeyStatusType.ENABLED,
             OutputPrefixType.TINK);
     keysetHandle2 = TestUtil.createKeysetHandle(TestUtil.createKeyset(random));
-    daead2 = new DeterministicAeadWrapper().wrap(Registry.getPrimitives(keysetHandle2));
+    daead2 =
+        new DeterministicAeadWrapper()
+            .wrap(Registry.getPrimitives(keysetHandle2, DeterministicAead.class));
     ciphertext = daead2.encryptDeterministically(plaintext, associatedData);
     try {
       daead.decryptDeterministically(ciphertext, associatedData);
@@ -170,7 +174,8 @@
         TestUtil.createKeysetHandle(TestUtil.createKeyset(primary, raw, legacy));
 
     DeterministicAead daead =
-        new DeterministicAeadWrapper().wrap(Registry.getPrimitives(keysetHandle));
+        new DeterministicAeadWrapper()
+            .wrap(Registry.getPrimitives(keysetHandle, DeterministicAead.class));
     byte[] plaintext = Random.randBytes(20);
     byte[] associatedData = Random.randBytes(20);
     byte[] ciphertext = daead.encryptDeterministically(plaintext, associatedData);
@@ -193,7 +198,8 @@
     KeysetHandle keysetHandle = TestUtil.createKeysetHandle(TestUtil.createKeyset(primary));
 
     DeterministicAead daead =
-        new DeterministicAeadWrapper().wrap(Registry.getPrimitives(keysetHandle));
+        new DeterministicAeadWrapper()
+            .wrap(Registry.getPrimitives(keysetHandle, DeterministicAead.class));
     byte[] plaintext = Random.randBytes(1);
     byte[] associatedData = Random.randBytes(20);
     byte[] ciphertext = daead.encryptDeterministically(plaintext, associatedData);
diff --git a/java/src/test/java/com/google/crypto/tink/hybrid/EciesAeadHkdfPrivateKeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/hybrid/EciesAeadHkdfPrivateKeyManagerTest.java
index 0f99dde..4985fb2 100644
--- a/java/src/test/java/com/google/crypto/tink/hybrid/EciesAeadHkdfPrivateKeyManagerTest.java
+++ b/java/src/test/java/com/google/crypto/tink/hybrid/EciesAeadHkdfPrivateKeyManagerTest.java
@@ -16,27 +16,32 @@
 
 package com.google.crypto.tink.hybrid;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.fail;
 
-import com.google.crypto.tink.Config;
 import com.google.crypto.tink.HybridDecrypt;
 import com.google.crypto.tink.HybridEncrypt;
-import com.google.crypto.tink.KeysetHandle;
 import com.google.crypto.tink.TestUtil;
+import com.google.crypto.tink.aead.AeadConfig;
 import com.google.crypto.tink.aead.AeadKeyTemplates;
 import com.google.crypto.tink.proto.EcPointFormat;
+import com.google.crypto.tink.proto.EciesAeadDemParams;
 import com.google.crypto.tink.proto.EciesAeadHkdfKeyFormat;
 import com.google.crypto.tink.proto.EciesAeadHkdfParams;
 import com.google.crypto.tink.proto.EciesAeadHkdfPrivateKey;
+import com.google.crypto.tink.proto.EciesAeadHkdfPublicKey;
+import com.google.crypto.tink.proto.EciesHkdfKemParams;
 import com.google.crypto.tink.proto.EllipticCurveType;
 import com.google.crypto.tink.proto.HashType;
-import com.google.crypto.tink.proto.KeyData;
-import com.google.crypto.tink.proto.KeyStatusType;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.proto.KeyTemplate;
-import com.google.crypto.tink.proto.Keyset.Key;
-import com.google.crypto.tink.proto.OutputPrefixType;
+import com.google.crypto.tink.subtle.EciesAeadHkdfDemHelper;
+import com.google.crypto.tink.subtle.EciesAeadHkdfHybridEncrypt;
+import com.google.crypto.tink.subtle.EllipticCurves;
 import com.google.crypto.tink.subtle.Random;
+import com.google.protobuf.ByteString;
+import java.security.GeneralSecurityException;
+import java.security.interfaces.ECPublicKey;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -47,77 +52,214 @@
 public class EciesAeadHkdfPrivateKeyManagerTest {
   @BeforeClass
   public static void setUp() throws Exception {
-    Config.register(HybridConfig.TINK_1_0_0);
+    AeadConfig.register();
+  }
+
+  private final EciesAeadHkdfPrivateKeyManager manager = new EciesAeadHkdfPrivateKeyManager();
+  private final EciesAeadHkdfPrivateKeyManager.KeyFactory<
+          EciesAeadHkdfKeyFormat, EciesAeadHkdfPrivateKey>
+      factory = manager.keyFactory();
+
+  @Test
+  public void basics() throws Exception {
+    assertThat(manager.getKeyType())
+        .isEqualTo("type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey");
+    assertThat(manager.getVersion()).isEqualTo(0);
+    assertThat(manager.keyMaterialType()).isEqualTo(KeyMaterialType.ASYMMETRIC_PRIVATE);
   }
 
   @Test
-  public void testNewKey() throws Exception {
-    EllipticCurveType curve = EllipticCurveType.NIST_P384;
-    HashType hashType = HashType.SHA256;
-    EcPointFormat pointFormat = EcPointFormat.UNCOMPRESSED;
-    KeyTemplate demKeyTemplate = AeadKeyTemplates.AES128_CTR_HMAC_SHA256;
+  public void validateKeyFormat_empty() throws Exception {
+    try {
+      factory.validateKeyFormat(EciesAeadHkdfKeyFormat.getDefaultInstance());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
 
-    byte[] salt = "some salt".getBytes("UTF-8");
+  private static EciesAeadHkdfKeyFormat createKeyFormat(
+      EllipticCurveType curve,
+      HashType hashType,
+      EcPointFormat ecPointFormat,
+      KeyTemplate demKeyTemplate,
+      byte[] salt) {
+    EciesHkdfKemParams kemParams =
+        EciesHkdfKemParams.newBuilder()
+            .setCurveType(curve)
+            .setHkdfHashType(hashType)
+            .setHkdfSalt(ByteString.copyFrom(salt))
+            .build();
+    EciesAeadDemParams demParams =
+        EciesAeadDemParams.newBuilder().setAeadDem(demKeyTemplate).build();
     EciesAeadHkdfParams params =
-        HybridKeyTemplates.createEciesAeadHkdfParams(
-            curve, hashType, pointFormat, demKeyTemplate, salt);
+        EciesAeadHkdfParams.newBuilder()
+            .setKemParams(kemParams)
+            .setDemParams(demParams)
+            .setEcPointFormat(ecPointFormat)
+            .build();
 
-    EciesAeadHkdfPrivateKeyManager manager = new EciesAeadHkdfPrivateKeyManager();
-    EciesAeadHkdfPrivateKey keyProto =
-        (EciesAeadHkdfPrivateKey)
-            manager.newKey(EciesAeadHkdfKeyFormat.newBuilder().setParams(params).build());
-    assertEquals(params, keyProto.getPublicKey().getParams());
-
-    Key primaryPriv =
-        TestUtil.createKey(
-            TestUtil.createKeyData(
-                keyProto,
-                EciesAeadHkdfPrivateKeyManager.TYPE_URL,
-                KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
-            8,
-            KeyStatusType.ENABLED,
-            OutputPrefixType.RAW);
-    Key primaryPub =
-        TestUtil.createKey(
-            TestUtil.createKeyData(
-                keyProto.getPublicKey(),
-                EciesAeadHkdfPublicKeyManager.TYPE_URL,
-                KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
-            42,
-            KeyStatusType.ENABLED,
-            OutputPrefixType.RAW);
-    KeysetHandle keysetHandlePub = TestUtil.createKeysetHandle(TestUtil.createKeyset(primaryPub));
-    KeysetHandle keysetHandlePriv = TestUtil.createKeysetHandle(TestUtil.createKeyset(primaryPriv));
-    HybridEncrypt hybridEncrypt = HybridEncryptFactory.getPrimitive(keysetHandlePub);
-    HybridDecrypt hybridDecrypt = HybridDecryptFactory.getPrimitive(keysetHandlePriv);
-    byte[] plaintext = Random.randBytes(20);
-    byte[] contextInfo = Random.randBytes(20);
-    byte[] ciphertext = hybridEncrypt.encrypt(plaintext, contextInfo);
-    assertArrayEquals(plaintext, hybridDecrypt.decrypt(ciphertext, contextInfo));
+    return EciesAeadHkdfKeyFormat.newBuilder().setParams(params).build();
   }
 
-  /** Tests that a public key is extracted properly from a private key. */
   @Test
-  public void testGetPublicKeyData() throws Exception {
-    KeysetHandle privateHandle =
-        KeysetHandle.generateNew(
-            HybridKeyTemplates.ECIES_P256_HKDF_HMAC_SHA256_AES128_CTR_HMAC_SHA256);
-    KeyData privateKeyData = TestUtil.getKeyset(privateHandle).getKey(0).getKeyData();
-    EciesAeadHkdfPrivateKeyManager privateManager = new EciesAeadHkdfPrivateKeyManager();
-    KeyData publicKeyData = privateManager.getPublicKeyData(privateKeyData.getValue());
-    assertEquals(EciesAeadHkdfPublicKeyManager.TYPE_URL, publicKeyData.getTypeUrl());
-    assertEquals(KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC, publicKeyData.getKeyMaterialType());
-    EciesAeadHkdfPrivateKey privateKey =
-        EciesAeadHkdfPrivateKey.parseFrom(privateKeyData.getValue());
-    assertArrayEquals(
-        privateKey.getPublicKey().toByteArray(), publicKeyData.getValue().toByteArray());
+  public void validateKeyFormat_valid() throws Exception {
+    EciesAeadHkdfKeyFormat format =
+        createKeyFormat(
+            EllipticCurveType.NIST_P256,
+            HashType.SHA256,
+            EcPointFormat.UNCOMPRESSED,
+            AeadKeyTemplates.AES128_CTR_HMAC_SHA256,
+            TestUtil.hexDecode("aabbccddeeff"));
+    factory.validateKeyFormat(format);
+  }
 
-    EciesAeadHkdfPublicKeyManager publicManager = new EciesAeadHkdfPublicKeyManager();
-    HybridEncrypt hybridEncrypt = publicManager.getPrimitive(publicKeyData.getValue());
-    HybridDecrypt hybridDecrypt = privateManager.getPrimitive(privateKeyData.getValue());
+  @Test
+  public void validateKeyFormat_noPointFormat_throws() throws Exception {
+    EciesAeadHkdfKeyFormat format =
+        createKeyFormat(
+            EllipticCurveType.NIST_P256,
+            HashType.SHA256,
+            EcPointFormat.UNKNOWN_FORMAT,
+            AeadKeyTemplates.AES128_CTR_HMAC_SHA256,
+            TestUtil.hexDecode("aabbccddeeff"));
+    try {
+      factory.validateKeyFormat(format);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_noDem_throws() throws Exception {
+    EciesAeadHkdfKeyFormat format =
+        createKeyFormat(
+            EllipticCurveType.NIST_P256,
+            HashType.SHA256,
+            EcPointFormat.UNCOMPRESSED,
+            KeyTemplate.getDefaultInstance(),
+            TestUtil.hexDecode("aabbccddeeff"));
+    try {
+      factory.validateKeyFormat(format);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_noKemCurve_throws() throws Exception {
+    EciesAeadHkdfKeyFormat format =
+        createKeyFormat(
+            EllipticCurveType.UNKNOWN_CURVE,
+            HashType.SHA256,
+            EcPointFormat.UNCOMPRESSED,
+            AeadKeyTemplates.AES128_CTR_HMAC_SHA256,
+            TestUtil.hexDecode("aabbccddeeff"));
+    try {
+      factory.validateKeyFormat(format);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_noKemHash_throws() throws Exception {
+    EciesAeadHkdfKeyFormat format =
+        createKeyFormat(
+            EllipticCurveType.NIST_P256,
+            HashType.UNKNOWN_HASH,
+            EcPointFormat.UNCOMPRESSED,
+            AeadKeyTemplates.AES128_CTR_HMAC_SHA256,
+            TestUtil.hexDecode("aabbccddeeff"));
+    try {
+      factory.validateKeyFormat(format);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void createKey_checkValues() throws Exception {
+    EciesAeadHkdfKeyFormat format =
+        createKeyFormat(
+            EllipticCurveType.NIST_P256,
+            HashType.SHA256,
+            EcPointFormat.UNCOMPRESSED,
+            AeadKeyTemplates.AES128_CTR_HMAC_SHA256,
+            TestUtil.hexDecode("aabbccddeeff"));
+    EciesAeadHkdfPrivateKey key = factory.createKey(format);
+    assertThat(key.getPublicKey().getParams()).isEqualTo(format.getParams());
+    assertThat(key.getPublicKey().getX()).isNotEmpty();
+    assertThat(key.getPublicKey().getY()).isNotEmpty();
+    assertThat(key.getKeyValue()).isNotEmpty();
+  }
+
+  private EciesAeadHkdfPrivateKey createValidKey() throws Exception {
+    EciesAeadHkdfKeyFormat format =
+        createKeyFormat(
+            EllipticCurveType.NIST_P256,
+            HashType.SHA256,
+            EcPointFormat.UNCOMPRESSED,
+            AeadKeyTemplates.AES128_CTR_HMAC_SHA256,
+            TestUtil.hexDecode("aabbccddeeff"));
+    return factory.createKey(format);
+  }
+
+  @Test
+  public void validateKey_valid() throws Exception {
+    manager.validateKey(createValidKey());
+  }
+
+  @Test
+  public void validateKey_invalidVersion_throws() throws Exception {
+    EciesAeadHkdfPrivateKey key =
+        EciesAeadHkdfPrivateKey.newBuilder(createValidKey()).setVersion(1).build();
+    try {
+      manager.validateKey(key);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void getPublicKey_values() throws Exception {
+    EciesAeadHkdfPrivateKey key = createValidKey();
+    EciesAeadHkdfPublicKey publicKey = manager.getPublicKey(key);
+
+    assertThat(publicKey).isEqualTo(key.getPublicKey());
+  }
+
+  @Test
+  public void createPrimitive() throws Exception {
+    EciesAeadHkdfPrivateKey key = createValidKey();
+    HybridDecrypt hybridDecrypt = manager.getPrimitive(key, HybridDecrypt.class);
+
+    EciesAeadHkdfParams eciesParams = key.getPublicKey().getParams();
+    EciesHkdfKemParams kemParams = eciesParams.getKemParams();
+    ECPublicKey recipientPublicKey =
+        EllipticCurves.getEcPublicKey(
+            HybridUtil.toCurveType(kemParams.getCurveType()),
+            key.getPublicKey().getX().toByteArray(),
+            key.getPublicKey().getY().toByteArray());
+    EciesAeadHkdfDemHelper demHelper =
+        new RegistryEciesAeadHkdfDemHelper(eciesParams.getDemParams().getAeadDem());
+    HybridEncrypt hybridEncrypt = new EciesAeadHkdfHybridEncrypt(
+        recipientPublicKey,
+        kemParams.getHkdfSalt().toByteArray(),
+        HybridUtil.toHmacAlgo(kemParams.getHkdfHashType()),
+        HybridUtil.toPointFormatType(eciesParams.getEcPointFormat()),
+        demHelper);
+
     byte[] message = Random.randBytes(20);
     byte[] contextInfo = Random.randBytes(20);
-    assertArrayEquals(
-        message, hybridDecrypt.decrypt(hybridEncrypt.encrypt(message, contextInfo), contextInfo));
+    assertThat(hybridDecrypt.decrypt(hybridEncrypt.encrypt(message, contextInfo), contextInfo))
+        .isEqualTo(message);
   }
+
+
 }
diff --git a/java/src/test/java/com/google/crypto/tink/hybrid/EciesAeadHkdfPublicKeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/hybrid/EciesAeadHkdfPublicKeyManagerTest.java
new file mode 100644
index 0000000..2c56ac0
--- /dev/null
+++ b/java/src/test/java/com/google/crypto/tink/hybrid/EciesAeadHkdfPublicKeyManagerTest.java
@@ -0,0 +1,165 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package com.google.crypto.tink.hybrid;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.fail;
+
+import com.google.crypto.tink.HybridDecrypt;
+import com.google.crypto.tink.HybridEncrypt;
+import com.google.crypto.tink.aead.AeadConfig;
+import com.google.crypto.tink.aead.AeadKeyTemplates;
+import com.google.crypto.tink.proto.EcPointFormat;
+import com.google.crypto.tink.proto.EciesAeadDemParams;
+import com.google.crypto.tink.proto.EciesAeadHkdfKeyFormat;
+import com.google.crypto.tink.proto.EciesAeadHkdfParams;
+import com.google.crypto.tink.proto.EciesAeadHkdfPrivateKey;
+import com.google.crypto.tink.proto.EciesAeadHkdfPublicKey;
+import com.google.crypto.tink.proto.EciesHkdfKemParams;
+import com.google.crypto.tink.proto.EllipticCurveType;
+import com.google.crypto.tink.proto.HashType;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
+import com.google.crypto.tink.proto.KeyTemplate;
+import com.google.crypto.tink.subtle.Random;
+import com.google.protobuf.ByteString;
+import java.security.GeneralSecurityException;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Unit tests for RsaSsaPssVerifyKeyManager. */
+@RunWith(JUnit4.class)
+public final class EciesAeadHkdfPublicKeyManagerTest {
+  private final EciesAeadHkdfPrivateKeyManager privateManager =
+      new EciesAeadHkdfPrivateKeyManager();
+  private final EciesAeadHkdfPrivateKeyManager.KeyFactory<
+          EciesAeadHkdfKeyFormat, EciesAeadHkdfPrivateKey>
+      factory = privateManager.keyFactory();
+  private final EciesAeadHkdfPublicKeyManager publicManager = new EciesAeadHkdfPublicKeyManager();
+
+  @BeforeClass
+  public static void setUp() throws Exception {
+    AeadConfig.register();
+  }
+
+  @Test
+  public void basics() throws Exception {
+    assertThat(publicManager.getKeyType())
+        .isEqualTo("type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey");
+    assertThat(publicManager.getVersion()).isEqualTo(0);
+    assertThat(publicManager.keyMaterialType()).isEqualTo(KeyMaterialType.ASYMMETRIC_PUBLIC);
+  }
+
+  @Test
+  public void validateKey_empty_throws() throws Exception {
+    try {
+      publicManager.validateKey(EciesAeadHkdfPublicKey.getDefaultInstance());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  private EciesAeadHkdfKeyFormat createKeyFormat(
+      EllipticCurveType curve,
+      HashType hashType,
+      EcPointFormat ecPointFormat,
+      KeyTemplate demKeyTemplate,
+      byte[] salt) {
+    EciesHkdfKemParams kemParams =
+        EciesHkdfKemParams.newBuilder()
+            .setCurveType(curve)
+            .setHkdfHashType(hashType)
+            .setHkdfSalt(ByteString.copyFrom(salt))
+            .build();
+    EciesAeadDemParams demParams =
+        EciesAeadDemParams.newBuilder().setAeadDem(demKeyTemplate).build();
+    EciesAeadHkdfParams params =
+        EciesAeadHkdfParams.newBuilder()
+            .setKemParams(kemParams)
+            .setDemParams(demParams)
+            .setEcPointFormat(ecPointFormat)
+            .build();
+
+    return EciesAeadHkdfKeyFormat.newBuilder().setParams(params).build();
+  }
+
+  private EciesAeadHkdfPrivateKey createValidPrivateKey() throws Exception {
+    EciesAeadHkdfKeyFormat format =
+        createKeyFormat(
+            EllipticCurveType.NIST_P256,
+            HashType.SHA256,
+            EcPointFormat.UNCOMPRESSED,
+            AeadKeyTemplates.AES128_CTR_HMAC_SHA256,
+            "some salt".getBytes("UTF-8"));
+    return factory.createKey(format);
+  }
+
+  @Test
+  public void validateKey_valid() throws Exception {
+    EciesAeadHkdfPrivateKey privateKey = createValidPrivateKey();
+    publicManager.validateKey(privateManager.getPublicKey(privateKey));
+  }
+
+  @Test
+  public void validateKey_invalidWrongVersion_throws() throws Exception {
+    EciesAeadHkdfPrivateKey privateKey = createValidPrivateKey();
+    EciesAeadHkdfPublicKey publicKey = privateManager.getPublicKey(privateKey);
+    EciesAeadHkdfPublicKey invalidKey = EciesAeadHkdfPublicKey.newBuilder().setVersion(1).build();
+    try {
+      publicManager.validateKey(invalidKey);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKey_invalidPointFormat_throws() throws Exception {
+    EciesAeadHkdfPrivateKey privateKey = createValidPrivateKey();
+    EciesAeadHkdfPublicKey publicKey = privateManager.getPublicKey(privateKey);
+    EciesAeadHkdfPublicKey invalidKey =
+        EciesAeadHkdfPublicKey.newBuilder()
+            .setParams(
+                createKeyFormat(
+                        EllipticCurveType.NIST_P256,
+                        HashType.SHA256,
+                        EcPointFormat.UNKNOWN_FORMAT,
+                        AeadKeyTemplates.AES128_CTR_HMAC_SHA256,
+                        "some salt".getBytes("UTF-8"))
+                    .getParams()).build();
+    try {
+      publicManager.validateKey(invalidKey);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void createPrimitive() throws Exception {
+    EciesAeadHkdfPrivateKey privateKey = createValidPrivateKey();
+    HybridDecrypt hybridDecrypt = privateManager.getPrimitive(privateKey, HybridDecrypt.class);
+
+    EciesAeadHkdfPublicKey publicKey = privateManager.getPublicKey(privateKey);
+    HybridEncrypt hybridEncrypt = publicManager.getPrimitive(publicKey, HybridEncrypt.class);
+
+    byte[] message = Random.randBytes(20);
+    byte[] contextInfo = Random.randBytes(20);
+    assertThat(hybridDecrypt.decrypt(hybridEncrypt.encrypt(message, contextInfo), contextInfo))
+        .isEqualTo(message);
+  }
+
+}
diff --git a/java/src/test/java/com/google/crypto/tink/hybrid/HybridConfigTest.java b/java/src/test/java/com/google/crypto/tink/hybrid/HybridConfigTest.java
index c98eaab..4b2d844 100644
--- a/java/src/test/java/com/google/crypto/tink/hybrid/HybridConfigTest.java
+++ b/java/src/test/java/com/google/crypto/tink/hybrid/HybridConfigTest.java
@@ -17,12 +17,10 @@
 package com.google.crypto.tink.hybrid;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
+import com.google.crypto.tink.HybridDecrypt;
 import com.google.crypto.tink.Registry;
-import com.google.crypto.tink.TestUtil;
-import com.google.crypto.tink.proto.RegistryConfig;
 import java.security.GeneralSecurityException;
 import org.junit.FixMethodOrder;
 import org.junit.Test;
@@ -65,7 +63,7 @@
 
     String typeUrl = "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey";
     try {
-      Registry.getKeyManager(typeUrl);
+      Registry.getUntypedKeyManager(typeUrl);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
       assertThat(e.toString()).contains("No key manager found");
@@ -74,234 +72,9 @@
     // Initialize the config.
     HybridConfig.register();
 
-    // Now the catalogues should be present.
-    Registry.getCatalogue("tinkmac");
-    Registry.getCatalogue("tinkhybriddecrypt");
-    Registry.getCatalogue("tinkhybridencrypt");
-
-    Registry.getKeyManager(typeUrl);
+    Registry.getKeyManager(typeUrl, HybridDecrypt.class);
 
     // Running init() manually again should succeed.
     HybridConfig.register();
   }
-
-  @Test
-  public void testConfigContents1_0_0() throws Exception {
-    RegistryConfig config = HybridConfig.TINK_1_0_0;
-    assertEquals(9, config.getEntryCount());
-    assertEquals("TINK_HYBRID_1_0_0", config.getConfigName());
-
-    TestUtil.verifyConfigEntry(
-        config.getEntry(0),
-        "TinkMac",
-        "Mac",
-        "type.googleapis.com/google.crypto.tink.HmacKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(1),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(2),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesEaxKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(3),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesGcmKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(4),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.ChaCha20Poly1305Key",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(5),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.KmsAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(6),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.KmsEnvelopeAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(7),
-        "TinkHybridDecrypt",
-        "HybridDecrypt",
-        "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(8),
-        "TinkHybridEncrypt",
-        "HybridEncrypt",
-        "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey",
-        true,
-        0);
-  }
-
-  @Test
-  public void testConfigContents1_1_0() throws Exception {
-    RegistryConfig config = HybridConfig.TINK_1_1_0;
-    assertEquals(9, config.getEntryCount());
-    assertEquals("TINK_HYBRID_1_1_0", config.getConfigName());
-
-    TestUtil.verifyConfigEntry(
-        config.getEntry(0),
-        "TinkMac",
-        "Mac",
-        "type.googleapis.com/google.crypto.tink.HmacKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(1),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(2),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesEaxKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(3),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesGcmKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(4),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.ChaCha20Poly1305Key",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(5),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.KmsAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(6),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.KmsEnvelopeAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(7),
-        "TinkHybridDecrypt",
-        "HybridDecrypt",
-        "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(8),
-        "TinkHybridEncrypt",
-        "HybridEncrypt",
-        "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey",
-        true,
-        0);
-  }
-
-  @Test
-  public void testConfigContents_LATEST() throws Exception {
-    RegistryConfig config = HybridConfig.LATEST;
-    assertEquals(10, config.getEntryCount());
-    assertEquals("TINK_HYBRID", config.getConfigName());
-
-    TestUtil.verifyConfigEntry(
-        config.getEntry(0),
-        "TinkMac",
-        "Mac",
-        "type.googleapis.com/google.crypto.tink.HmacKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(1),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(2),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesEaxKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(3),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.AesGcmKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(4),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.ChaCha20Poly1305Key",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(5),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.KmsAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(6),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.KmsEnvelopeAeadKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(7),
-        "TinkAead",
-        "Aead",
-        "type.googleapis.com/google.crypto.tink.XChaCha20Poly1305Key",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(8),
-        "TinkHybridDecrypt",
-        "HybridDecrypt",
-        "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(9),
-        "TinkHybridEncrypt",
-        "HybridEncrypt",
-        "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey",
-        true,
-        0);
-  }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/hybrid/HybridDecryptCatalogueTest.java b/java/src/test/java/com/google/crypto/tink/hybrid/HybridDecryptCatalogueTest.java
deleted file mode 100644
index 6e6f71d..0000000
--- a/java/src/test/java/com/google/crypto/tink/hybrid/HybridDecryptCatalogueTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package com.google.crypto.tink.hybrid;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import com.google.crypto.tink.HybridDecrypt;
-import com.google.crypto.tink.KeyManager;
-import com.google.crypto.tink.proto.KeyTypeEntry;
-import com.google.crypto.tink.proto.RegistryConfig;
-import java.security.GeneralSecurityException;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for HybridDecryptCatalogue. */
-@RunWith(JUnit4.class)
-public class HybridDecryptCatalogueTest {
-
-  @Test
-  public void testBasic() throws Exception {
-    HybridDecryptCatalogue catalogue = new HybridDecryptCatalogue();
-
-    // Check a single key type for decryption, incl. case-insensitve primitive name.
-    String keyType = "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey";
-    {
-      KeyManager<HybridDecrypt> manager = catalogue.getKeyManager(keyType, "HybridDecrypt", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-    {
-      KeyManager<HybridDecrypt> manager = catalogue.getKeyManager(keyType, "HyBRidDeCRYPt", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-    {
-      KeyManager<HybridDecrypt> manager = catalogue.getKeyManager(keyType, "HYBRIDDecRYPT", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-
-    // Check all entries from the current HybridConfig.
-    RegistryConfig config = HybridConfig.TINK_1_0_0;
-    int count = 0;
-    for (KeyTypeEntry entry : config.getEntryList()) {
-      if ("HybridDecrypt".equals(entry.getPrimitiveName())) {
-        count = count + 1;
-        KeyManager<HybridDecrypt> manager =
-            catalogue.getKeyManager(
-                entry.getTypeUrl(), "hybriddecrypt", entry.getKeyManagerVersion());
-        assertThat(manager.doesSupport(entry.getTypeUrl())).isTrue();
-      }
-    }
-    assertEquals(1, count);
-  }
-
-  @Test
-  public void testErrors() throws Exception {
-    HybridDecryptCatalogue catalogue = new HybridDecryptCatalogue();
-    String keyType = "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey";
-
-    // Wrong primitive name.
-    try {
-      catalogue.getKeyManager(keyType, "aead", 0);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No support for primitive");
-    }
-
-    // Wrong key manager version.
-    try {
-      catalogue.getKeyManager(keyType, "hybriddecrypt", 1);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No key manager");
-      assertThat(e.toString()).contains("version at least");
-    }
-
-    // Wrong key type.
-    try {
-      catalogue.getKeyManager("some.unknown.key.type", "hybriddecrypt", 0);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No support for primitive");
-      assertThat(e.toString()).contains("with key type");
-    }
-  }
-}
diff --git a/java/src/test/java/com/google/crypto/tink/hybrid/HybridEncryptCatalogueTest.java b/java/src/test/java/com/google/crypto/tink/hybrid/HybridEncryptCatalogueTest.java
deleted file mode 100644
index 7520d5a..0000000
--- a/java/src/test/java/com/google/crypto/tink/hybrid/HybridEncryptCatalogueTest.java
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package com.google.crypto.tink.hybrid;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import com.google.crypto.tink.HybridEncrypt;
-import com.google.crypto.tink.KeyManager;
-import com.google.crypto.tink.proto.KeyTypeEntry;
-import com.google.crypto.tink.proto.RegistryConfig;
-import java.security.GeneralSecurityException;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for HybridEncryptCatalogue. */
-@RunWith(JUnit4.class)
-public class HybridEncryptCatalogueTest {
-
-  @Test
-  public void testBasic() throws Exception {
-    HybridEncryptCatalogue catalogue = new HybridEncryptCatalogue();
-
-    // Check a single key type for encryption, incl. case-insensitve primitive name.
-    String keyType = "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey";
-    {
-      KeyManager<HybridEncrypt> manager = catalogue.getKeyManager(keyType, "HybridEncrypt", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-    {
-      KeyManager<HybridEncrypt> manager = catalogue.getKeyManager(keyType, "HybRIdEncRYPt", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-    {
-      KeyManager<HybridEncrypt> manager = catalogue.getKeyManager(keyType, "HYBRIdeNCRYPT", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-
-    // Check all entries from the current HybridConfig.
-    RegistryConfig config = HybridConfig.TINK_1_0_0;
-    int count = 0;
-    for (KeyTypeEntry entry : config.getEntryList()) {
-      if ("HybridEncrypt".equals(entry.getPrimitiveName())) {
-        count = count + 1;
-        KeyManager<HybridEncrypt> manager = catalogue.getKeyManager(
-            entry.getTypeUrl(), "hybridencrypt", entry.getKeyManagerVersion());
-        assertThat(manager.doesSupport(entry.getTypeUrl())).isTrue();
-      }
-    }
-    assertEquals(1, count);
-  }
-
-  @Test
-  public void testErrors() throws Exception {
-    HybridEncryptCatalogue catalogue = new HybridEncryptCatalogue();
-    String keyType = "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey";
-
-    // Wrong primitive name.
-    try {
-      catalogue.getKeyManager(keyType, "aead", 0);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No support for primitive");
-    }
-
-    // Wrong key manager version.
-    try {
-      catalogue.getKeyManager(keyType, "hybridencrypt", 1);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No key manager");
-      assertThat(e.toString()).contains("version at least");
-    }
-
-    // Wrong key type.
-    try {
-      catalogue.getKeyManager("some.unknown.key.type", "hybridencrypt", 0);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No support for primitive");
-      assertThat(e.toString()).contains("with key type");
-    }
-  }
-}
diff --git a/java/src/test/java/com/google/crypto/tink/hybrid/HybridEncryptFactoryTest.java b/java/src/test/java/com/google/crypto/tink/hybrid/HybridEncryptFactoryTest.java
index 02d1d65..4e9607a 100644
--- a/java/src/test/java/com/google/crypto/tink/hybrid/HybridEncryptFactoryTest.java
+++ b/java/src/test/java/com/google/crypto/tink/hybrid/HybridEncryptFactoryTest.java
@@ -68,7 +68,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 primaryPrivProto,
-                EciesAeadHkdfPrivateKeyManager.TYPE_URL,
+                new EciesAeadHkdfPrivateKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
             8,
             KeyStatusType.ENABLED,
@@ -77,7 +77,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 primaryPrivProto.getPublicKey(),
-                EciesAeadHkdfPublicKeyManager.TYPE_URL,
+                new EciesAeadHkdfPublicKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
             42,
             KeyStatusType.ENABLED,
@@ -91,7 +91,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 rawPrivProto,
-                EciesAeadHkdfPrivateKeyManager.TYPE_URL,
+                new EciesAeadHkdfPrivateKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
             11,
             KeyStatusType.ENABLED,
@@ -100,7 +100,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 rawPrivProto.getPublicKey(),
-                EciesAeadHkdfPublicKeyManager.TYPE_URL,
+                new EciesAeadHkdfPublicKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
             43,
             KeyStatusType.ENABLED,
diff --git a/java/src/test/java/com/google/crypto/tink/hybrid/HybridEncryptIntegrationTest.java b/java/src/test/java/com/google/crypto/tink/hybrid/HybridEncryptIntegrationTest.java
index f71fb21..904a74a 100644
--- a/java/src/test/java/com/google/crypto/tink/hybrid/HybridEncryptIntegrationTest.java
+++ b/java/src/test/java/com/google/crypto/tink/hybrid/HybridEncryptIntegrationTest.java
@@ -66,7 +66,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 primaryPrivProto,
-                EciesAeadHkdfPrivateKeyManager.TYPE_URL,
+                new EciesAeadHkdfPrivateKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
             8,
             KeyStatusType.ENABLED,
@@ -75,7 +75,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 primaryPrivProto.getPublicKey(),
-                EciesAeadHkdfPublicKeyManager.TYPE_URL,
+                new EciesAeadHkdfPublicKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
             42,
             KeyStatusType.ENABLED,
@@ -89,7 +89,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 rawPrivProto,
-                EciesAeadHkdfPrivateKeyManager.TYPE_URL,
+                new EciesAeadHkdfPrivateKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
             11,
             KeyStatusType.ENABLED,
@@ -98,7 +98,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 rawPrivProto.getPublicKey(),
-                EciesAeadHkdfPublicKeyManager.TYPE_URL,
+                new EciesAeadHkdfPublicKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
             43,
             KeyStatusType.ENABLED,
diff --git a/java/src/test/java/com/google/crypto/tink/hybrid/HybridEncryptWrapperTest.java b/java/src/test/java/com/google/crypto/tink/hybrid/HybridEncryptWrapperTest.java
index 908fe6d..d409b30 100644
--- a/java/src/test/java/com/google/crypto/tink/hybrid/HybridEncryptWrapperTest.java
+++ b/java/src/test/java/com/google/crypto/tink/hybrid/HybridEncryptWrapperTest.java
@@ -69,7 +69,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 primaryPrivProto,
-                EciesAeadHkdfPrivateKeyManager.TYPE_URL,
+                new EciesAeadHkdfPrivateKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
             8,
             KeyStatusType.ENABLED,
@@ -78,7 +78,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 primaryPrivProto.getPublicKey(),
-                EciesAeadHkdfPublicKeyManager.TYPE_URL,
+                new EciesAeadHkdfPublicKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
             42,
             KeyStatusType.ENABLED,
@@ -92,7 +92,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 rawPrivProto,
-                EciesAeadHkdfPrivateKeyManager.TYPE_URL,
+                new EciesAeadHkdfPrivateKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
             11,
             KeyStatusType.ENABLED,
@@ -101,7 +101,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 rawPrivProto.getPublicKey(),
-                EciesAeadHkdfPublicKeyManager.TYPE_URL,
+                new EciesAeadHkdfPublicKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
             43,
             KeyStatusType.ENABLED,
@@ -111,9 +111,11 @@
     KeysetHandle keysetHandlePriv =
         TestUtil.createKeysetHandle(TestUtil.createKeyset(primaryPriv, rawPriv));
     HybridEncrypt hybridEncrypt =
-        new HybridEncryptWrapper().wrap(Registry.getPrimitives(keysetHandlePub));
+        new HybridEncryptWrapper()
+            .wrap(Registry.getPrimitives(keysetHandlePub, HybridEncrypt.class));
     HybridDecrypt hybridDecrypt =
-        new HybridDecryptWrapper().wrap(Registry.getPrimitives(keysetHandlePriv));
+        new HybridDecryptWrapper()
+            .wrap(Registry.getPrimitives(keysetHandlePriv, HybridDecrypt.class));
     byte[] plaintext = Random.randBytes(20);
     byte[] contextInfo = Random.randBytes(20);
     byte[] ciphertext = hybridEncrypt.encrypt(plaintext, contextInfo);
diff --git a/java/src/test/java/com/google/crypto/tink/hybrid/HybridKeyTemplatesTest.java b/java/src/test/java/com/google/crypto/tink/hybrid/HybridKeyTemplatesTest.java
index d5831a1..54aebed 100644
--- a/java/src/test/java/com/google/crypto/tink/hybrid/HybridKeyTemplatesTest.java
+++ b/java/src/test/java/com/google/crypto/tink/hybrid/HybridKeyTemplatesTest.java
@@ -40,7 +40,7 @@
   @Test
   public void testECIES_P256_HKDF_HMAC_SHA256_AES128_GCM() throws Exception {
     KeyTemplate template = HybridKeyTemplates.ECIES_P256_HKDF_HMAC_SHA256_AES128_GCM;
-    assertEquals(EciesAeadHkdfPrivateKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new EciesAeadHkdfPrivateKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     EciesAeadHkdfKeyFormat format = EciesAeadHkdfKeyFormat.parseFrom(template.getValue());
 
@@ -60,7 +60,7 @@
   @Test
   public void testECIES_P256_HKDF_HMAC_SHA256_AES128_CTR_HMAC_SHA256() throws Exception {
     KeyTemplate template = HybridKeyTemplates.ECIES_P256_HKDF_HMAC_SHA256_AES128_CTR_HMAC_SHA256;
-    assertEquals(EciesAeadHkdfPrivateKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new EciesAeadHkdfPrivateKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     EciesAeadHkdfKeyFormat format = EciesAeadHkdfKeyFormat.parseFrom(template.getValue());
 
@@ -88,7 +88,7 @@
     String salt = "some salt";
     KeyTemplate template = HybridKeyTemplates.createEciesAeadHkdfKeyTemplate(
         curveType, hashType, ecPointFormat, demKeyTemplate, salt.getBytes(UTF_8));
-    assertEquals(EciesAeadHkdfPrivateKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new EciesAeadHkdfPrivateKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     EciesAeadHkdfKeyFormat format = EciesAeadHkdfKeyFormat.parseFrom(template.getValue());
 
diff --git a/java/src/test/java/com/google/crypto/tink/mac/AesCmacKeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/mac/AesCmacKeyManagerTest.java
new file mode 100644
index 0000000..a2448a3
--- /dev/null
+++ b/java/src/test/java/com/google/crypto/tink/mac/AesCmacKeyManagerTest.java
@@ -0,0 +1,222 @@
+// Copyright 2017 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.google.crypto.tink.mac;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.fail;
+
+import com.google.crypto.tink.Mac;
+import com.google.crypto.tink.proto.AesCmacKey;
+import com.google.crypto.tink.proto.AesCmacKeyFormat;
+import com.google.crypto.tink.proto.AesCmacParams;
+import com.google.crypto.tink.subtle.AesCmac;
+import com.google.crypto.tink.subtle.Random;
+import com.google.protobuf.ByteString;
+import java.security.GeneralSecurityException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Test for AesCmacKeyManager. */
+@RunWith(JUnit4.class)
+public class AesCmacKeyManagerTest {
+  @Test
+  public void validateKeyFormat_empty() throws Exception {
+    try {
+      new AesCmacKeyManager().keyFactory().validateKeyFormat(AesCmacKeyFormat.getDefaultInstance());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected.
+    }
+  }
+
+  private static AesCmacKeyFormat makeAesCmacKeyFormat(int keySize, int tagSize) {
+    return AesCmacKeyFormat.newBuilder()
+        .setKeySize(keySize)
+        .setParams(AesCmacParams.newBuilder().setTagSize(tagSize).build())
+        .build();
+  }
+
+  @Test
+  public void validateKeyFormat_valid() throws Exception {
+    AesCmacKeyManager manager = new AesCmacKeyManager();
+    manager.keyFactory().validateKeyFormat(makeAesCmacKeyFormat(32, 10));
+    manager.keyFactory().validateKeyFormat(makeAesCmacKeyFormat(32, 11));
+    manager.keyFactory().validateKeyFormat(makeAesCmacKeyFormat(32, 12));
+    manager.keyFactory().validateKeyFormat(makeAesCmacKeyFormat(32, 13));
+    manager.keyFactory().validateKeyFormat(makeAesCmacKeyFormat(32, 14));
+    manager.keyFactory().validateKeyFormat(makeAesCmacKeyFormat(32, 15));
+    manager.keyFactory().validateKeyFormat(makeAesCmacKeyFormat(32, 16));
+  }
+
+  @Test
+  public void validateKeyFormat_notValid_throws() throws Exception {
+    AesCmacKeyManager manager = new AesCmacKeyManager();
+    try {
+      manager.keyFactory().validateKeyFormat(makeAesCmacKeyFormat(32, 9));
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+    try {
+      manager.keyFactory().validateKeyFormat(makeAesCmacKeyFormat(32, 17));
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+    try {
+      manager.keyFactory().validateKeyFormat(makeAesCmacKeyFormat(32, 32));
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+    try {
+      manager.keyFactory().validateKeyFormat(makeAesCmacKeyFormat(16, 16));
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+    try {
+      manager.keyFactory().validateKeyFormat(makeAesCmacKeyFormat(64, 16));
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void createKey_valid() throws Exception {
+    AesCmacKeyManager manager = new AesCmacKeyManager();
+    manager.validateKey(manager.keyFactory().createKey(makeAesCmacKeyFormat(32, 16)));
+  }
+
+  @Test
+  public void createKey_checkValues() throws Exception {
+    AesCmacKeyFormat keyFormat = makeAesCmacKeyFormat(32, 16);
+    AesCmacKey key = new AesCmacKeyManager().keyFactory().createKey(keyFormat);
+    assertThat(key.getKeyValue()).hasSize(keyFormat.getKeySize());
+    assertThat(key.getParams().getTagSize()).isEqualTo(keyFormat.getParams().getTagSize());
+  }
+
+  @Test
+  public void createKey_multipleTimes() throws Exception {
+    AesCmacKeyManager manager = new AesCmacKeyManager();
+    AesCmacKeyFormat keyFormat = makeAesCmacKeyFormat(32, 16);
+    assertThat(manager.keyFactory().createKey(keyFormat).getKeyValue())
+        .isNotEqualTo(manager.keyFactory().createKey(keyFormat).getKeyValue());
+  }
+
+  @Test
+  public void validateKey_valid() throws Exception {
+    AesCmacKeyManager manager = new AesCmacKeyManager();
+    manager.validateKey(manager.keyFactory().createKey(makeAesCmacKeyFormat(32, 10)));
+    manager.validateKey(manager.keyFactory().createKey(makeAesCmacKeyFormat(32, 11)));
+    manager.validateKey(manager.keyFactory().createKey(makeAesCmacKeyFormat(32, 12)));
+    manager.validateKey(manager.keyFactory().createKey(makeAesCmacKeyFormat(32, 13)));
+    manager.validateKey(manager.keyFactory().createKey(makeAesCmacKeyFormat(32, 14)));
+    manager.validateKey(manager.keyFactory().createKey(makeAesCmacKeyFormat(32, 15)));
+    manager.validateKey(manager.keyFactory().createKey(makeAesCmacKeyFormat(32, 16)));
+  }
+
+  @Test
+  public void validateKey_wrongVersion_throws() throws Exception {
+    AesCmacKeyManager manager = new AesCmacKeyManager();
+    try {
+      AesCmacKey validKey = manager.keyFactory().createKey(makeAesCmacKeyFormat(32, 16));
+      manager.validateKey(AesCmacKey.newBuilder(validKey).setVersion(1).build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKey_notValid_throws() throws Exception {
+    AesCmacKeyManager manager = new AesCmacKeyManager();
+    AesCmacKey validKey = manager.keyFactory().createKey(makeAesCmacKeyFormat(32, 16));
+    try {
+      manager.validateKey(
+          AesCmacKey.newBuilder(validKey)
+              .setKeyValue(ByteString.copyFrom(Random.randBytes(16)))
+              .build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+    try {
+      manager.validateKey(
+          AesCmacKey.newBuilder(validKey)
+              .setKeyValue(ByteString.copyFrom(Random.randBytes(64)))
+              .build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+    try {
+      manager
+          .validateKey(
+              AesCmacKey.newBuilder(validKey)
+                  .setParams(AesCmacParams.newBuilder(validKey.getParams()).setTagSize(0).build())
+                  .build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+    try {
+      manager
+          .validateKey(
+              AesCmacKey.newBuilder(validKey)
+                  .setParams(AesCmacParams.newBuilder(validKey.getParams()).setTagSize(9).build())
+                  .build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+    try {
+      manager
+          .validateKey(
+              AesCmacKey.newBuilder(validKey)
+                  .setParams(AesCmacParams.newBuilder(validKey.getParams()).setTagSize(17).build())
+                  .build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+    try {
+      manager
+          .validateKey(
+              AesCmacKey.newBuilder(validKey)
+                  .setParams(AesCmacParams.newBuilder(validKey.getParams()).setTagSize(32).build())
+                  .build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+
+  @Test
+  public void getPrimitive_works() throws Exception {
+    AesCmacKeyManager manager = new AesCmacKeyManager();
+    AesCmacKey validKey = manager.keyFactory().createKey(makeAesCmacKeyFormat(32, 16));
+    Mac managerMac = manager.getPrimitive(validKey, Mac.class);
+    Mac directMac =
+        new AesCmac(validKey.getKeyValue().toByteArray(), validKey.getParams().getTagSize());
+    byte[] message = Random.randBytes(50);
+    managerMac.verifyMac(directMac.computeMac(message), message);
+  }
+}
diff --git a/java/src/test/java/com/google/crypto/tink/mac/HmacKeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/mac/HmacKeyManagerTest.java
index 69c7887..7656231 100644
--- a/java/src/test/java/com/google/crypto/tink/mac/HmacKeyManagerTest.java
+++ b/java/src/test/java/com/google/crypto/tink/mac/HmacKeyManagerTest.java
@@ -16,19 +16,22 @@
 
 package com.google.crypto.tink.mac;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
+import com.google.crypto.tink.Mac;
 import com.google.crypto.tink.TestUtil;
 import com.google.crypto.tink.proto.HashType;
 import com.google.crypto.tink.proto.HmacKey;
 import com.google.crypto.tink.proto.HmacKeyFormat;
 import com.google.crypto.tink.proto.HmacParams;
-import com.google.crypto.tink.proto.KeyTemplate;
+import com.google.crypto.tink.subtle.MacJce;
+import com.google.crypto.tink.subtle.Random;
 import com.google.protobuf.ByteString;
 import java.security.GeneralSecurityException;
 import java.util.Set;
 import java.util.TreeSet;
+import javax.crypto.spec.SecretKeySpec;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -37,55 +40,230 @@
 @RunWith(JUnit4.class)
 public class HmacKeyManagerTest {
   @Test
-  public void testNewKeyMultipleTimes() throws Exception {
-    HmacKeyManager keyManager = new HmacKeyManager();
-    HmacKeyFormat hmacKeyFormat = HmacKeyFormat.newBuilder()
-        .setParams(HmacParams.newBuilder().setHash(HashType.SHA256).setTagSize(16).build())
-        .setKeySize(32)
-        .build();
-    ByteString serialized = ByteString.copyFrom(hmacKeyFormat.toByteArray());
-    KeyTemplate keyTemplate = KeyTemplate.newBuilder()
-        .setTypeUrl(HmacKeyManager.TYPE_URL)
-        .setValue(serialized)
-        .build();
-    // Calls newKey multiple times and make sure that we get different HmacKey each time.
-    Set<String> keys = new TreeSet<String>();
-    int numTests = 27;
-    for (int i = 0; i < numTests / 3; i++) {
-      HmacKey key = (HmacKey) keyManager.newKey(hmacKeyFormat);
-      assertEquals(32, key.getKeyValue().toByteArray().length);
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-
-      key = (HmacKey) keyManager.newKey(serialized);
-      assertEquals(32, key.getKeyValue().toByteArray().length);
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-
-      key = HmacKey.parseFrom(keyManager.newKeyData(keyTemplate.getValue()).getValue());
-      assertEquals(32, key.getKeyValue().toByteArray().length);
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
+  public void validateKeyFormat_empty() throws Exception {
+    try {
+      new HmacKeyManager().keyFactory().validateKeyFormat(HmacKeyFormat.getDefaultInstance());
+      fail("At least the hash type needs to be set");
+    } catch (GeneralSecurityException e) {
+      // expected.
     }
-    assertEquals(numTests, keys.size());
+  }
+
+  private static HmacKeyFormat makeHmacKeyFormat(int keySize, int tagSize, HashType hashType) {
+    HmacParams params = HmacParams.newBuilder()
+        .setHash(hashType)
+        .setTagSize(tagSize)
+        .build();
+    return HmacKeyFormat.newBuilder()
+        .setParams(params)
+        .setKeySize(keySize)
+        .build();
   }
 
   @Test
-  public void testNewKeyCorruptedFormat() throws Exception {
-    HmacKeyManager keyManager = new HmacKeyManager();
-    ByteString serialized = ByteString.copyFrom(new byte[128]);
-    KeyTemplate keyTemplate = KeyTemplate.newBuilder()
-        .setTypeUrl(HmacKeyManager.TYPE_URL)
-        .setValue(serialized)
-        .build();
+  public void validateKeyFormat_tagSizesSha1() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 10, HashType.SHA1));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 11, HashType.SHA1));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 12, HashType.SHA1));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 13, HashType.SHA1));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 14, HashType.SHA1));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 15, HashType.SHA1));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 16, HashType.SHA1));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 17, HashType.SHA1));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 18, HashType.SHA1));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 19, HashType.SHA1));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 20, HashType.SHA1));
     try {
-      keyManager.newKey(serialized);
-      fail("Corrupted format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
+      manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 21, HashType.SHA1));
+      fail("SHA1 HMAC should not support tag size 21");
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_tagSizesSha256() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 10, HashType.SHA256));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 11, HashType.SHA256));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 12, HashType.SHA256));
+
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 30, HashType.SHA256));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 31, HashType.SHA256));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 32, HashType.SHA256));
+    try {
+      manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 33, HashType.SHA256));
+      fail("SHA256 HMAC should not support tag size 33");
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_tagSizesSha512() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 10, HashType.SHA512));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 11, HashType.SHA512));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 12, HashType.SHA512));
+
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 62, HashType.SHA512));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 63, HashType.SHA512));
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 64, HashType.SHA512));
+    try {
+      manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 65, HashType.SHA512));
+      fail("SHA256 HMAC should not support tag size 65");
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_keySizes() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(16, 10, HashType.SHA256));
+    try {
+      manager.keyFactory().validateKeyFormat(makeHmacKeyFormat(15, 10, HashType.SHA256));
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void createKey_valid() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    manager.validateKey(manager.keyFactory().createKey(makeHmacKeyFormat(16, 10, HashType.SHA1)));
+    manager.validateKey(manager.keyFactory().createKey(makeHmacKeyFormat(16, 20, HashType.SHA1)));
+    manager.validateKey(manager.keyFactory().createKey(makeHmacKeyFormat(16, 10, HashType.SHA256)));
+    manager.validateKey(manager.keyFactory().createKey(makeHmacKeyFormat(16, 32, HashType.SHA256)));
+    manager.validateKey(manager.keyFactory().createKey(makeHmacKeyFormat(16, 10, HashType.SHA512)));
+    manager.validateKey(manager.keyFactory().createKey(makeHmacKeyFormat(16, 64, HashType.SHA512)));
+  }
+
+  @Test
+  public void createKey_checkValues() throws Exception {
+    HmacKeyFormat keyFormat = makeHmacKeyFormat(16, 10, HashType.SHA256);
+    HmacKey key = new HmacKeyManager().keyFactory().createKey(keyFormat);
+    assertThat(key.getKeyValue()).hasSize(keyFormat.getKeySize());
+    assertThat(key.getParams().getTagSize()).isEqualTo(keyFormat.getParams().getTagSize());
+  }
+
+  @Test
+  public void createKey_multipleTimes() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    HmacKeyFormat keyFormat = makeHmacKeyFormat(16, 10, HashType.SHA256);
+    int numKeys = 100;
+    Set<String> keys = new TreeSet<String>();
+    for (int i = 0; i < numKeys; ++i) {
+      keys.add(
+          TestUtil.hexEncode(
+              manager.keyFactory().createKey(keyFormat).getKeyValue().toByteArray()));
+    }
+    assertThat(keys).hasSize(numKeys);
+  }
+
+  @Test
+  public void validateKey_wrongVersion_throws() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    HmacKey validKey = manager.keyFactory().createKey(makeHmacKeyFormat(16, 10, HashType.SHA1));
+    try {
+      manager.validateKey(HmacKey.newBuilder(validKey).setVersion(1).build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKey_notValid_throws() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    HmacKey validKey = manager.keyFactory().createKey(makeHmacKeyFormat(16, 10, HashType.SHA1));
+    try {
+      manager.validateKey(
+          HmacKey.newBuilder(validKey)
+              .setKeyValue(ByteString.copyFrom(Random.randBytes(15)))
+              .build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
     }
     try {
-      keyManager.newKeyData(keyTemplate.getValue());
-      fail("Corrupted format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
+      manager
+          .validateKey(
+              HmacKey.newBuilder(validKey)
+                  .setParams(HmacParams.newBuilder(validKey.getParams()).setTagSize(0).build())
+                  .build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
     }
+    try {
+      manager
+          .validateKey(
+              HmacKey.newBuilder(validKey)
+                  .setParams(HmacParams.newBuilder(validKey.getParams()).setTagSize(9).build())
+                  .build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+    try {
+      manager
+          .validateKey(
+              HmacKey.newBuilder(validKey)
+                  .setParams(HmacParams.newBuilder(validKey.getParams()).setTagSize(21).build())
+                  .build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+    try {
+      manager
+          .validateKey(
+              HmacKey.newBuilder(validKey)
+                  .setParams(HmacParams.newBuilder(validKey.getParams()).setTagSize(32).build())
+                  .build());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+
+  @Test
+  public void getPrimitive_worksForSha1() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    HmacKey validKey = manager.keyFactory().createKey(makeHmacKeyFormat(16, 19, HashType.SHA1));
+    Mac managerMac = manager.getPrimitive(validKey, Mac.class);
+    Mac directMac =
+        new MacJce(
+            "HMACSHA1", new SecretKeySpec(validKey.getKeyValue().toByteArray(), "HMAC"), 19);
+    byte[] message = Random.randBytes(50);
+    managerMac.verifyMac(directMac.computeMac(message), message);
+  }
+
+  @Test
+  public void getPrimitive_worksForSha256() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    HmacKey validKey = manager.keyFactory().createKey(makeHmacKeyFormat(16, 29, HashType.SHA256));
+    Mac managerMac = manager.getPrimitive(validKey, Mac.class);
+    Mac directMac =
+        new MacJce(
+            "HMACSHA256", new SecretKeySpec(validKey.getKeyValue().toByteArray(), "HMAC"), 29);
+    byte[] message = Random.randBytes(50);
+    managerMac.verifyMac(directMac.computeMac(message), message);
+  }
+
+  @Test
+  public void getPrimitive_worksForSha512() throws Exception {
+    HmacKeyManager manager = new HmacKeyManager();
+    HmacKey validKey = manager.keyFactory().createKey(makeHmacKeyFormat(16, 33, HashType.SHA512));
+    Mac managerMac = manager.getPrimitive(validKey, Mac.class);
+    Mac directMac =
+        new MacJce(
+            "HMACSHA512", new SecretKeySpec(validKey.getKeyValue().toByteArray(), "HMAC"), 33);
+    byte[] message = Random.randBytes(50);
+    managerMac.verifyMac(directMac.computeMac(message), message);
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/mac/MacCatalogueTest.java b/java/src/test/java/com/google/crypto/tink/mac/MacCatalogueTest.java
deleted file mode 100644
index 8da9e34..0000000
--- a/java/src/test/java/com/google/crypto/tink/mac/MacCatalogueTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package com.google.crypto.tink.mac;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import com.google.crypto.tink.KeyManager;
-import com.google.crypto.tink.Mac;
-import com.google.crypto.tink.proto.KeyTypeEntry;
-import com.google.crypto.tink.proto.RegistryConfig;
-import java.security.GeneralSecurityException;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for MacCatalogue.
- */
-@RunWith(JUnit4.class)
-public class MacCatalogueTest {
-
-  @Test
-  public void testBasic() throws Exception {
-    MacCatalogue catalogue = new MacCatalogue();
-
-    // Check a single key type, incl. case-insensitve primitive name.
-    String keyType = "type.googleapis.com/google.crypto.tink.HmacKey";
-    {
-      KeyManager<Mac> manager = catalogue.getKeyManager(keyType, "Mac", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-    {
-      KeyManager<Mac> manager = catalogue.getKeyManager(keyType, "MaC", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-    {
-      KeyManager<Mac> manager = catalogue.getKeyManager(keyType, "mAC", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-
-    // Check all entries from the current MacConfig.
-    RegistryConfig config = MacConfig.TINK_1_0_0;
-    int count = 0;
-    for (KeyTypeEntry entry : config.getEntryList()) {
-      if ("Mac".equals(entry.getPrimitiveName())) {
-        count = count + 1;
-        KeyManager<Mac> manager = catalogue.getKeyManager(
-            entry.getTypeUrl(), "mac", entry.getKeyManagerVersion());
-        assertThat(manager.doesSupport(entry.getTypeUrl())).isTrue();
-      }
-    }
-    assertEquals(1, count);
-  }
-
-  @Test
-  public void testErrors() throws Exception {
-    MacCatalogue catalogue = new MacCatalogue();
-    String keyType = "type.googleapis.com/google.crypto.tink.HmacKey";
-
-    // Wrong primitive name.
-    try {
-      catalogue.getKeyManager(keyType, "aead", 0);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No support for primitive");
-    }
-
-    // Wrong key manager version.
-    try {
-      catalogue.getKeyManager(keyType, "mac", 1);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No key manager");
-      assertThat(e.toString()).contains("version at least");
-    }
-
-    // Wrong key type.
-    try {
-      catalogue.getKeyManager("some.unknown.key.type", "mac", 0);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No support for primitive");
-      assertThat(e.toString()).contains("with key type");
-    }
-  }
-}
diff --git a/java/src/test/java/com/google/crypto/tink/mac/MacConfigTest.java b/java/src/test/java/com/google/crypto/tink/mac/MacConfigTest.java
index d7b7040..9d7f5a4 100644
--- a/java/src/test/java/com/google/crypto/tink/mac/MacConfigTest.java
+++ b/java/src/test/java/com/google/crypto/tink/mac/MacConfigTest.java
@@ -17,12 +17,9 @@
 package com.google.crypto.tink.mac;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 import com.google.crypto.tink.Registry;
-import com.google.crypto.tink.TestUtil;
-import com.google.crypto.tink.proto.RegistryConfig;
 import java.security.GeneralSecurityException;
 import org.junit.FixMethodOrder;
 import org.junit.Test;
@@ -60,59 +57,10 @@
     // Initialize the config.
     MacConfig.register();
 
-    // Now the catalogues should be present.
-    Registry.getCatalogue("tinkmac");
-    Registry.getCatalogue("tinkmac");
-
     // After registration the key manager should be present.
     Registry.getKeyManager(typeUrl);
 
     // Running init() manually again should succeed.
     MacConfig.register();
   }
-
-  @Test
-  public void testConfigContents1_0_0() throws Exception {
-    RegistryConfig config = MacConfig.TINK_1_0_0;
-    assertEquals(1, config.getEntryCount());
-    assertEquals("TINK_MAC_1_0_0", config.getConfigName());
-
-    TestUtil.verifyConfigEntry(
-        config.getEntry(0),
-        "TinkMac",
-        "Mac",
-        "type.googleapis.com/google.crypto.tink.HmacKey",
-        true,
-        0);
-  }
-
-  @Test
-  public void testConfigContents1_1_0() throws Exception {
-    RegistryConfig config = MacConfig.TINK_1_1_0;
-    assertEquals(1, config.getEntryCount());
-    assertEquals("TINK_MAC_1_1_0", config.getConfigName());
-
-    TestUtil.verifyConfigEntry(
-        config.getEntry(0),
-        "TinkMac",
-        "Mac",
-        "type.googleapis.com/google.crypto.tink.HmacKey",
-        true,
-        0);
-  }
-
-  @Test
-  public void testConfigContents_LATEST() throws Exception {
-    RegistryConfig config = MacConfig.LATEST;
-    assertEquals(1, config.getEntryCount());
-    assertEquals("TINK_MAC", config.getConfigName());
-
-    TestUtil.verifyConfigEntry(
-        config.getEntry(0),
-        "TinkMac",
-        "Mac",
-        "type.googleapis.com/google.crypto.tink.HmacKey",
-        true,
-        0);
-  }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/mac/MacFactoryTest.java b/java/src/test/java/com/google/crypto/tink/mac/MacFactoryTest.java
index cae2de0..c82c57d 100644
--- a/java/src/test/java/com/google/crypto/tink/mac/MacFactoryTest.java
+++ b/java/src/test/java/com/google/crypto/tink/mac/MacFactoryTest.java
@@ -182,7 +182,7 @@
       MacFactory.getPrimitive(keysetHandle);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertExceptionContains(e, "not match requested primitive type com.google.crypto.tink.Mac");
+      assertExceptionContains(e, "com.google.crypto.tink.Mac not supported");
     }
 
     // invalid as the primary key.
@@ -191,7 +191,7 @@
       MacFactory.getPrimitive(keysetHandle);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertExceptionContains(e, "not match requested primitive type com.google.crypto.tink.Mac");
+      assertExceptionContains(e, "com.google.crypto.tink.Mac not supported");
     }
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/mac/MacKeyTemplatesTest.java b/java/src/test/java/com/google/crypto/tink/mac/MacKeyTemplatesTest.java
index b6f4254..be69763 100644
--- a/java/src/test/java/com/google/crypto/tink/mac/MacKeyTemplatesTest.java
+++ b/java/src/test/java/com/google/crypto/tink/mac/MacKeyTemplatesTest.java
@@ -32,7 +32,7 @@
   @Test
   public void testHMAC_SHA256_128BITTAG() throws Exception {
     KeyTemplate template = MacKeyTemplates.HMAC_SHA256_128BITTAG;
-    assertEquals(HmacKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new HmacKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     HmacKeyFormat format = HmacKeyFormat.parseFrom(template.getValue());
 
@@ -44,7 +44,7 @@
   @Test
   public void testHMAC_SHA256_256BITTAG() throws Exception {
     KeyTemplate template = MacKeyTemplates.HMAC_SHA256_256BITTAG;
-    assertEquals(HmacKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new HmacKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     HmacKeyFormat format = HmacKeyFormat.parseFrom(template.getValue());
 
@@ -54,6 +54,30 @@
   }
 
   @Test
+  public void testHMAC_SHA512_256BITTAG() throws Exception {
+    KeyTemplate template = MacKeyTemplates.HMAC_SHA512_256BITTAG;
+    assertEquals(new HmacKeyManager().getKeyType(), template.getTypeUrl());
+    assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
+    HmacKeyFormat format = HmacKeyFormat.parseFrom(template.getValue());
+
+    assertEquals(64, format.getKeySize());
+    assertEquals(32, format.getParams().getTagSize());
+    assertEquals(HashType.SHA512, format.getParams().getHash());
+  }
+
+  @Test
+  public void testHMAC_SHA512_512BITTAG() throws Exception {
+    KeyTemplate template = MacKeyTemplates.HMAC_SHA512_512BITTAG;
+    assertEquals(new HmacKeyManager().getKeyType(), template.getTypeUrl());
+    assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
+    HmacKeyFormat format = HmacKeyFormat.parseFrom(template.getValue());
+
+    assertEquals(64, format.getKeySize());
+    assertEquals(64, format.getParams().getTagSize());
+    assertEquals(HashType.SHA512, format.getParams().getHash());
+  }
+
+  @Test
   public void testCreateHmacKeyTemplate() throws Exception {
     // Intentionally using "weird" or invalid values for parameters,
     // to test that the function correctly puts them in the resulting template.
@@ -61,7 +85,7 @@
     int tagSize = 24;
     HashType hashType = HashType.SHA512;
     KeyTemplate template = MacKeyTemplates.createHmacKeyTemplate(keySize, tagSize, hashType);
-    assertEquals(HmacKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new HmacKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
 
     HmacKeyFormat format = HmacKeyFormat.parseFrom(template.getValue());
diff --git a/java/src/test/java/com/google/crypto/tink/mac/MacWrapperTest.java b/java/src/test/java/com/google/crypto/tink/mac/MacWrapperTest.java
index 5838f5e..0887f8f 100644
--- a/java/src/test/java/com/google/crypto/tink/mac/MacWrapperTest.java
+++ b/java/src/test/java/com/google/crypto/tink/mac/MacWrapperTest.java
@@ -81,7 +81,7 @@
             keys[(i + 1) % j],
             keys[(i + 2) % j],
             keys[(i + 3) % j]));
-      Mac mac = new MacWrapper().wrap(Registry.getPrimitives(keysetHandle));
+      Mac mac = new MacWrapper().wrap(Registry.getPrimitives(keysetHandle, Mac.class));
       byte[] plaintext = "plaintext".getBytes("UTF-8");
       byte[] tag = mac.computeMac(plaintext);
       if (!keys[i].getOutputPrefixType().equals(OutputPrefixType.RAW)) {
@@ -113,7 +113,7 @@
       // mac with a non-primary RAW key, verify with the keyset
       KeysetHandle keysetHandle2 = TestUtil.createKeysetHandle(
           TestUtil.createKeyset(raw, legacy, tink, crunchy));
-      Mac mac2 = new MacWrapper().wrap(Registry.getPrimitives(keysetHandle2));
+      Mac mac2 = new MacWrapper().wrap(Registry.getPrimitives(keysetHandle2, Mac.class));
       tag = mac2.computeMac(plaintext);
       try {
         mac.verifyMac(tag, plaintext);
@@ -130,7 +130,7 @@
           OutputPrefixType.TINK);
       keysetHandle2 = TestUtil.createKeysetHandle(
           TestUtil.createKeyset(random));
-      mac2 = new MacWrapper().wrap(Registry.getPrimitives(keysetHandle2));
+      mac2 = new MacWrapper().wrap(Registry.getPrimitives(keysetHandle2, Mac.class));
       tag = mac2.computeMac(plaintext);
       try {
         mac.verifyMac(tag, plaintext);
@@ -151,7 +151,7 @@
         OutputPrefixType.RAW);
     KeysetHandle keysetHandle = TestUtil.createKeysetHandle(
         TestUtil.createKeyset(primary));
-    Mac mac = new MacWrapper().wrap(Registry.getPrimitives(keysetHandle));
+    Mac mac = new MacWrapper().wrap(Registry.getPrimitives(keysetHandle, Mac.class));
     byte[] plaintext = "blah".getBytes("UTF-8");
     byte[] tag = mac.computeMac(plaintext);
     // no prefix
diff --git a/java/src/test/java/com/google/crypto/tink/signature/EcdsaSignKeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/signature/EcdsaSignKeyManagerTest.java
index 8bd3cd0..4c50db2 100644
--- a/java/src/test/java/com/google/crypto/tink/signature/EcdsaSignKeyManagerTest.java
+++ b/java/src/test/java/com/google/crypto/tink/signature/EcdsaSignKeyManagerTest.java
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2017 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,15 +16,9 @@
 
 package com.google.crypto.tink.signature;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
-import com.google.crypto.tink.Config;
-import com.google.crypto.tink.KeysetHandle;
-import com.google.crypto.tink.PublicKeySign;
-import com.google.crypto.tink.PublicKeyVerify;
 import com.google.crypto.tink.TestUtil;
 import com.google.crypto.tink.proto.EcdsaKeyFormat;
 import com.google.crypto.tink.proto.EcdsaParams;
@@ -33,249 +27,265 @@
 import com.google.crypto.tink.proto.EcdsaSignatureEncoding;
 import com.google.crypto.tink.proto.EllipticCurveType;
 import com.google.crypto.tink.proto.HashType;
-import com.google.crypto.tink.proto.KeyData;
-import com.google.crypto.tink.proto.KeyTemplate;
-import com.google.crypto.tink.subtle.EllipticCurves;
-import com.google.crypto.tink.subtle.Random;
-import com.google.protobuf.ByteString;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import java.security.GeneralSecurityException;
-import java.security.KeyPair;
-import java.security.interfaces.ECPrivateKey;
-import java.security.interfaces.ECPublicKey;
-import java.security.spec.ECPoint;
 import java.util.Set;
 import java.util.TreeSet;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-/**
- * Unit tests for EcdsaSignKeyManager.
- *
- * <p>TODO(quannguyen): Add more tests.
- */
+/** Unit tests for EcdsaSignKeyManager. */
 @RunWith(JUnit4.class)
 public class EcdsaSignKeyManagerTest {
-  @BeforeClass
-  public static void setUp() throws Exception {
-    Config.register(SignatureConfig.TINK_1_0_0);
-    ;
+  private final EcdsaSignKeyManager manager = new EcdsaSignKeyManager();
+  private final EcdsaSignKeyManager.KeyFactory<EcdsaKeyFormat, EcdsaPrivateKey> factory =
+      manager.keyFactory();
+
+  private static EcdsaKeyFormat createKeyFormat(
+      HashType hashType, EllipticCurveType curveType, EcdsaSignatureEncoding encoding) {
+    return EcdsaKeyFormat.newBuilder()
+        .setParams(
+            EcdsaParams.newBuilder()
+                .setHashType(hashType)
+                .setCurve(curveType)
+                .setEncoding(encoding))
+        .build();
   }
 
-  private static class HashAndCurveType {
-    public HashType hashType;
-    public EllipticCurveType curveType;
-
-    public HashAndCurveType(HashType hashType, EllipticCurveType curveType) {
-      this.hashType = hashType;
-      this.curveType = curveType;
-    }
+  @Test
+  public void basics() throws Exception {
+    assertThat(manager.getKeyType())
+        .isEqualTo("type.googleapis.com/google.crypto.tink.EcdsaPrivateKey");
+    assertThat(manager.getVersion()).isEqualTo(0);
+    assertThat(manager.keyMaterialType())
+        .isEqualTo(KeyMaterialType.ASYMMETRIC_PRIVATE);
   }
 
-  final byte[] msg = Random.randBytes(20);
-
-  private void testNewKeyWithVerifier(KeyTemplate keyTemplate) throws Exception {
-    // Call newKey multiple times and make sure that it generates different keys.
-    int numTests = 9;
-    EcdsaPrivateKey[] privKeys = new EcdsaPrivateKey[numTests];
-    EcdsaSignKeyManager signManager = new EcdsaSignKeyManager();
-    Set<String> keys = new TreeSet<String>();
-    for (int j = 0; j < numTests / 3; j++) {
-      privKeys[3 * j] =
-          (EcdsaPrivateKey)
-              signManager.newKey(EcdsaKeyFormat.parseFrom(keyTemplate.getValue()));
-      keys.add(TestUtil.hexEncode(privKeys[3 * j].toByteArray()));
-
-      privKeys[3 * j + 1] = (EcdsaPrivateKey) signManager.newKey(keyTemplate.getValue());
-      keys.add(TestUtil.hexEncode(privKeys[3 * j + 1].toByteArray()));
-
-      privKeys[3 * j + 2] =
-          EcdsaPrivateKey.parseFrom(
-              signManager.newKeyData(keyTemplate.getValue()).getValue());
-      keys.add(TestUtil.hexEncode(privKeys[3 * j + 2].toByteArray()));
-    }
-    assertEquals(numTests, keys.size());
-
-    // Tests that generated keys have an adequate size. This is best-effort because keys might
-    // have leading zeros that are stripped off. These tests are flaky; the probability of
-    // failure is 2^-64 which happens when a key has 8 leading zeros.
-    for (int j = 0; j < numTests; j++) {
-      int keySize = privKeys[j].getKeyValue().toByteArray().length;
-      EcdsaKeyFormat ecdsaKeyFormat = EcdsaKeyFormat.parseFrom(keyTemplate.getValue());
-      switch (ecdsaKeyFormat.getParams().getCurve()) {
-        case NIST_P256:
-          assertTrue(256 / 8 - 8 <= keySize);
-          assertTrue(256 / 8 + 1 >= keySize);
-          break;
-        case NIST_P384:
-          assertTrue(384 / 8 - 8 <= keySize);
-          assertTrue(384 / 8 + 1 >= keySize);
-          break;
-        case NIST_P521:
-          assertTrue(521 / 8 - 8 <= keySize);
-          assertTrue(521 / 8 + 1 >= keySize);
-          break;
-        default:
-          break;
-      }
-    }
-
-    // Test whether signer works correctly with the corresponding verifier.
-    EcdsaVerifyKeyManager verifyManager = new EcdsaVerifyKeyManager();
-    for (int j = 0; j < numTests; j++) {
-      PublicKeySign signer = signManager.getPrimitive(privKeys[j]);
-      byte[] signature = signer.sign(msg);
-      for (int k = 0; k < numTests; k++) {
-        PublicKeyVerify verifier = verifyManager.getPrimitive(privKeys[k].getPublicKey());
-        if (j == k) { // The same key
-          try {
-            verifier.verify(signature, msg);
-          } catch (GeneralSecurityException ex) {
-            fail("Valid signature, should not throw exception");
-          }
-        } else { // Different keys
-          try {
-            verifier.verify(signature, msg);
-            fail("Invalid signature, should have thrown exception");
-          } catch (GeneralSecurityException expected) {
-            // Expected
-          }
-        }
-      }
+  @Test
+  public void validateKeyFormat_empty() throws Exception {
+    try {
+      factory.validateKeyFormat(EcdsaKeyFormat.getDefaultInstance());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
     }
   }
 
   @Test
-  public void testNewKeyWithVerifier() throws Exception {
-    testNewKeyWithVerifier(SignatureKeyTemplates.ECDSA_P256);
-    testNewKeyWithVerifier(SignatureKeyTemplates.ECDSA_P384);
-    testNewKeyWithVerifier(SignatureKeyTemplates.ECDSA_P521);
-    testNewKeyWithVerifier(SignatureKeyTemplates.ECDSA_P256_IEEE_P1363);
-    testNewKeyWithVerifier(SignatureKeyTemplates.ECDSA_P384_IEEE_P1363);
-    testNewKeyWithVerifier(SignatureKeyTemplates.ECDSA_P521_IEEE_P1363);
+  public void validateKeyFormat_valid() throws Exception {
+    // SHA256 NIST_P256 DER
+    factory.validateKeyFormat(
+        createKeyFormat(HashType.SHA256, EllipticCurveType.NIST_P256, EcdsaSignatureEncoding.DER));
+    // SHA256 NIST_P256 IEEE_P1363
+    factory.validateKeyFormat(
+        createKeyFormat(
+            HashType.SHA256, EllipticCurveType.NIST_P256, EcdsaSignatureEncoding.IEEE_P1363));
+    // SHA384 NIST_P384 DER
+    factory.validateKeyFormat(
+        createKeyFormat(HashType.SHA384, EllipticCurveType.NIST_P384, EcdsaSignatureEncoding.DER));
+    // SHA384 NIST_P384 IEEE_P1363
+    factory.validateKeyFormat(
+        createKeyFormat(
+            HashType.SHA384, EllipticCurveType.NIST_P384, EcdsaSignatureEncoding.IEEE_P1363));
+    // SHA512 NIST_P384 DER
+    factory.validateKeyFormat(
+        createKeyFormat(HashType.SHA512, EllipticCurveType.NIST_P384, EcdsaSignatureEncoding.DER));
+    // SHA512 NIST_P384 IEEE_P1363
+    factory.validateKeyFormat(
+        createKeyFormat(
+            HashType.SHA512, EllipticCurveType.NIST_P384, EcdsaSignatureEncoding.IEEE_P1363));
+    // SHA512 NIST_P521 DER
+    factory.validateKeyFormat(
+        createKeyFormat(HashType.SHA512, EllipticCurveType.NIST_P521, EcdsaSignatureEncoding.DER));
+    // SHA512 NIST_P521 IEEE_P1363
+    factory.validateKeyFormat(
+        createKeyFormat(
+            HashType.SHA512, EllipticCurveType.NIST_P521, EcdsaSignatureEncoding.IEEE_P1363));
   }
 
   @Test
-  public void testNewKeyWithCorruptedFormat() {
-    ByteString serialized = ByteString.copyFrom(new byte[128]);
-    KeyTemplate keyTemplate =
-        KeyTemplate.newBuilder()
-            .setTypeUrl(EcdsaSignKeyManager.TYPE_URL)
-            .setValue(serialized)
-            .build();
-    EcdsaSignKeyManager keyManager = new EcdsaSignKeyManager();
+  public void validateKeyFormat_noSha1() throws Exception {
     try {
-      keyManager.newKey(serialized);
-      fail("Corrupted format, should have thrown exception");
+      factory.validateKeyFormat(
+          createKeyFormat(HashType.SHA1, EllipticCurveType.NIST_P256, EcdsaSignatureEncoding.DER));
+      fail();
     } catch (GeneralSecurityException expected) {
       // Expected
     }
     try {
-      keyManager.newKeyData(keyTemplate.getValue());
-      fail("Corrupted format, should have thrown exception");
+      factory.validateKeyFormat(
+          createKeyFormat(HashType.SHA1, EllipticCurveType.NIST_P384, EcdsaSignatureEncoding.DER));
+      fail();
     } catch (GeneralSecurityException expected) {
       // Expected
     }
-  }
-
-  private void testNewKeyUnsupportedKeyFormat(HashAndCurveType hashAndCurve) throws Exception {
-    HashType hashType = hashAndCurve.hashType;
-    EllipticCurveType curveType = hashAndCurve.curveType;
-    EcdsaSignKeyManager signManager = new EcdsaSignKeyManager();
-    EcdsaParams ecdsaParams =
-        EcdsaParams.newBuilder()
-            .setHashType(hashType)
-            .setCurve(curveType)
-            .setEncoding(EcdsaSignatureEncoding.DER)
-            .build();
-    EcdsaKeyFormat ecdsaFormat = EcdsaKeyFormat.newBuilder().setParams(ecdsaParams).build();
     try {
-      EcdsaPrivateKey unusedPrivKey = (EcdsaPrivateKey) signManager.newKey(ecdsaFormat);
-      fail("Unsupported key format, should have thrown exception: " + hashType + " " + curveType);
+      factory.validateKeyFormat(
+          createKeyFormat(HashType.SHA1, EllipticCurveType.NIST_P521, EcdsaSignatureEncoding.DER));
+      fail();
     } catch (GeneralSecurityException expected) {
       // Expected
     }
   }
 
   @Test
-  public void testNewKeyUnsupportedKeyFormat() throws Exception {
-    HashAndCurveType[] hashAndCurves = {
-      new HashAndCurveType(HashType.SHA1, EllipticCurveType.NIST_P256),
-      new HashAndCurveType(HashType.SHA1, EllipticCurveType.NIST_P384),
-      new HashAndCurveType(HashType.SHA1, EllipticCurveType.NIST_P521),
-      new HashAndCurveType(HashType.SHA256, EllipticCurveType.NIST_P384),
-      new HashAndCurveType(HashType.SHA256, EllipticCurveType.NIST_P521),
-      new HashAndCurveType(HashType.SHA512, EllipticCurveType.NIST_P256),
-    };
-    for (int i = 0; i < hashAndCurves.length; i++) {
-      testNewKeyUnsupportedKeyFormat(hashAndCurves[i]);
-    }
-  }
-
-  private void testGetPrimitiveWithUnsupportedKey(HashAndCurveType hashAndCurve) throws Exception {
-    HashType hashType = hashAndCurve.hashType;
-    EllipticCurveType curveType = hashAndCurve.curveType;
-    KeyPair keyPair = EllipticCurves.generateKeyPair(SigUtil.toCurveType(curveType));
-    ECPublicKey pubKey = (ECPublicKey) keyPair.getPublic();
-    ECPrivateKey privKey = (ECPrivateKey) keyPair.getPrivate();
-
-    ECPoint w = pubKey.getW();
-    EcdsaPublicKey ecdsaPubKey =
-        TestUtil.createEcdsaPubKey(
-            hashType,
-            curveType,
-            EcdsaSignatureEncoding.DER,
-            w.getAffineX().toByteArray(),
-            w.getAffineY().toByteArray());
-    EcdsaPrivateKey ecdsaPrivKey =
-        TestUtil.createEcdsaPrivKey(ecdsaPubKey, privKey.getS().toByteArray());
-
-    EcdsaSignKeyManager signManager = new EcdsaSignKeyManager();
+  public void validateKeyFormat_p384NotWithSha256() throws Exception {
     try {
-      PublicKeySign unusedSigner = signManager.getPrimitive(ecdsaPrivKey);
-      fail("Unsupported key, should have thrown exception: " + hashType + " " + curveType);
+      factory.validateKeyFormat(
+          createKeyFormat(
+              HashType.SHA256, EllipticCurveType.NIST_P384, EcdsaSignatureEncoding.DER));
+      fail();
     } catch (GeneralSecurityException expected) {
       // Expected
     }
   }
 
   @Test
-  public void testGetPrimitiveWithUnsupportedKey() throws Exception {
-    HashAndCurveType[] hashAndCurves = {
-      new HashAndCurveType(HashType.SHA1, EllipticCurveType.NIST_P256),
-      new HashAndCurveType(HashType.SHA1, EllipticCurveType.NIST_P384),
-      new HashAndCurveType(HashType.SHA1, EllipticCurveType.NIST_P521),
-      new HashAndCurveType(HashType.SHA256, EllipticCurveType.NIST_P384),
-      new HashAndCurveType(HashType.SHA256, EllipticCurveType.NIST_P521),
-      new HashAndCurveType(HashType.SHA512, EllipticCurveType.NIST_P256),
-    };
-    for (int i = 0; i < hashAndCurves.length; i++) {
-      testGetPrimitiveWithUnsupportedKey(hashAndCurves[i]);
+  public void validateKeyFormat_p521OnlyWithSha512() throws Exception {
+    try {
+      factory.validateKeyFormat(
+          createKeyFormat(
+              HashType.SHA256, EllipticCurveType.NIST_P521, EcdsaSignatureEncoding.DER));
+      fail();
+    } catch (GeneralSecurityException expected) {
+      // Expected
+    }
+    try {
+      factory.validateKeyFormat(
+          createKeyFormat(
+              HashType.SHA384, EllipticCurveType.NIST_P521, EcdsaSignatureEncoding.DER));
+      fail();
+    } catch (GeneralSecurityException expected) {
+      // Expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_unkownsProhibited() throws Exception {
+    try {
+      factory.validateKeyFormat(
+          createKeyFormat(
+              HashType.UNKNOWN_HASH, EllipticCurveType.NIST_P256, EcdsaSignatureEncoding.DER));
+      fail();
+    } catch (GeneralSecurityException expected) {
+      // Expected
+    }
+    try {
+      factory.validateKeyFormat(
+          createKeyFormat(
+              HashType.SHA256, EllipticCurveType.UNKNOWN_CURVE, EcdsaSignatureEncoding.DER));
+      fail();
+    } catch (GeneralSecurityException expected) {
+      // Expected
+    }
+    try {
+      factory.validateKeyFormat(
+          createKeyFormat(
+              HashType.SHA256,
+              EllipticCurveType.NIST_P256,
+              EcdsaSignatureEncoding.UNKNOWN_ENCODING));
+      fail();
+    } catch (GeneralSecurityException expected) {
+      // Expected
+    }
+  }
+
+  @Test
+  public void validateKey_empty() throws Exception {
+    try {
+      manager.validateKey(EcdsaPrivateKey.getDefaultInstance());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
     }
   }
 
   /** Tests that a public key is extracted properly from a private key. */
   @Test
-  public void testGetPublicKeyData() throws Exception {
-    KeysetHandle privateHandle = KeysetHandle.generateNew(SignatureKeyTemplates.ECDSA_P256);
-    KeyData privateKeyData = TestUtil.getKeyset(privateHandle).getKey(0).getKeyData();
-    EcdsaSignKeyManager privateManager = new EcdsaSignKeyManager();
-    KeyData publicKeyData = privateManager.getPublicKeyData(privateKeyData.getValue());
-    assertEquals(EcdsaVerifyKeyManager.TYPE_URL, publicKeyData.getTypeUrl());
-    assertEquals(KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC, publicKeyData.getKeyMaterialType());
-    EcdsaPrivateKey privateKey = EcdsaPrivateKey.parseFrom(privateKeyData.getValue());
-    assertArrayEquals(
-        privateKey.getPublicKey().toByteArray(), publicKeyData.getValue().toByteArray());
+  public void getPublicKey_checkValues() throws Exception {
+    EcdsaPrivateKey privateKey =
+        factory.createKey(
+            createKeyFormat(
+                HashType.SHA256, EllipticCurveType.NIST_P256, EcdsaSignatureEncoding.DER));
+    EcdsaPublicKey publicKey = manager.getPublicKey(privateKey);
 
-    EcdsaVerifyKeyManager publicManager = new EcdsaVerifyKeyManager();
-    PublicKeySign signer = privateManager.getPrimitive(privateKeyData.getValue());
-    PublicKeyVerify verifier = publicManager.getPrimitive(publicKeyData.getValue());
-    byte[] message = Random.randBytes(20);
-    try {
-      verifier.verify(signer.sign(message), message);
-    } catch (GeneralSecurityException e) {
-      fail("Should not fail: " + e);
+    assertThat(publicKey).isEqualTo(privateKey.getPublicKey());
+  }
+
+  // Tests that generated keys have an adequate size. This is best-effort because keys might
+  // have leading zeros that are stripped off. These tests are flaky; the probability of
+  // failure is 2^-64 which happens when a key has 8 leading zeros.
+  @Test
+  public void createKey_NISTP256_keySize() throws Exception {
+    EcdsaPrivateKey privateKey =
+        factory.createKey(
+            createKeyFormat(
+                HashType.SHA256, EllipticCurveType.NIST_P256, EcdsaSignatureEncoding.DER));
+    assertThat(privateKey.getKeyValue().size()).isAtLeast(256 / 8 - 8);
+    assertThat(privateKey.getKeyValue().size()).isAtMost(256 / 8 + 1);
+  }
+
+  // Tests that generated keys have an adequate size. This is best-effort because keys might
+  // have leading zeros that are stripped off. These tests are flaky; the probability of
+  // failure is 2^-64 which happens when a key has 8 leading zeros.
+  @Test
+  public void createKey_NISTP384_keySize() throws Exception {
+    EcdsaPrivateKey privateKey =
+        factory.createKey(
+            createKeyFormat(
+                HashType.SHA384, EllipticCurveType.NIST_P384, EcdsaSignatureEncoding.DER));
+    assertThat(privateKey.getKeyValue().size()).isAtLeast(384 / 8 - 8);
+    assertThat(privateKey.getKeyValue().size()).isAtMost(384 / 8 + 1);
+  }
+
+  // Tests that generated keys have an adequate size. This is best-effort because keys might
+  // have leading zeros that are stripped off. These tests are flaky; the probability of
+  // failure is 2^-64 which happens when a key has 8 leading zeros.
+  @Test
+  public void createKey_NISTP521_keySize() throws Exception {
+    EcdsaPrivateKey privateKey =
+        factory.createKey(
+            createKeyFormat(
+                HashType.SHA512, EllipticCurveType.NIST_P521, EcdsaSignatureEncoding.DER));
+    assertThat(privateKey.getKeyValue().size()).isAtLeast(521 / 8 - 8);
+    assertThat(privateKey.getKeyValue().size()).isAtMost(521 / 8 + 1);
+  }
+
+  @Test
+  public void createKey_NISTP256_differentValues() throws Exception {
+    EcdsaKeyFormat format =
+        createKeyFormat(HashType.SHA256, EllipticCurveType.NIST_P256, EcdsaSignatureEncoding.DER);
+    Set<String> keys = new TreeSet<>();
+    int numTests = 100;
+    for (int i = 0; i < numTests; i++) {
+      keys.add(TestUtil.hexEncode(factory.createKey(format).getKeyValue().toByteArray()));
     }
+    assertThat(keys).hasSize(numTests);
+  }
+
+  @Test
+  public void createKey_NISTP384_differentValues() throws Exception {
+    EcdsaKeyFormat format =
+        createKeyFormat(HashType.SHA384, EllipticCurveType.NIST_P384, EcdsaSignatureEncoding.DER);
+    Set<String> keys = new TreeSet<>();
+    int numTests = 100;
+    for (int i = 0; i < numTests; i++) {
+      keys.add(TestUtil.hexEncode(factory.createKey(format).getKeyValue().toByteArray()));
+    }
+    assertThat(keys).hasSize(numTests);
+  }
+
+
+  @Test
+  public void createKey_NISTP521_differentValues() throws Exception {
+    EcdsaKeyFormat format =
+        createKeyFormat(HashType.SHA512, EllipticCurveType.NIST_P521, EcdsaSignatureEncoding.DER);
+    Set<String> keys = new TreeSet<>();
+    int numTests = 100;
+    for (int i = 0; i < numTests; i++) {
+      keys.add(TestUtil.hexEncode(factory.createKey(format).getKeyValue().toByteArray()));
+    }
+    assertThat(keys).hasSize(numTests);
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/signature/EcdsaVerifyKeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/signature/EcdsaVerifyKeyManagerTest.java
index 2bff0c5..ac15224 100644
--- a/java/src/test/java/com/google/crypto/tink/signature/EcdsaVerifyKeyManagerTest.java
+++ b/java/src/test/java/com/google/crypto/tink/signature/EcdsaVerifyKeyManagerTest.java
@@ -16,15 +16,20 @@
 
 package com.google.crypto.tink.signature;
 
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
 import com.google.crypto.tink.PublicKeyVerify;
 import com.google.crypto.tink.TestUtil;
 import com.google.crypto.tink.TestUtil.BytesMutation;
+import com.google.crypto.tink.proto.EcdsaKeyFormat;
+import com.google.crypto.tink.proto.EcdsaParams;
+import com.google.crypto.tink.proto.EcdsaPrivateKey;
 import com.google.crypto.tink.proto.EcdsaPublicKey;
 import com.google.crypto.tink.proto.EcdsaSignatureEncoding;
 import com.google.crypto.tink.proto.EllipticCurveType;
 import com.google.crypto.tink.proto.HashType;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.subtle.EllipticCurves;
 import com.google.crypto.tink.subtle.Hex;
 import com.google.crypto.tink.subtle.Random;
@@ -48,13 +53,97 @@
  */
 @RunWith(JUnit4.class)
 public class EcdsaVerifyKeyManagerTest {
-  private static class HashAndCurveType {
-    public HashType hashType;
-    public EllipticCurveType curveType;
+  private final EcdsaSignKeyManager signManager = new EcdsaSignKeyManager();
+  private final EcdsaVerifyKeyManager verifyManager = new EcdsaVerifyKeyManager();
+  private final EcdsaSignKeyManager.KeyFactory<EcdsaKeyFormat, EcdsaPrivateKey> factory =
+      signManager.keyFactory();
 
-    public HashAndCurveType(HashType hashType, EllipticCurveType curveType) {
-      this.hashType = hashType;
-      this.curveType = curveType;
+  private EcdsaPrivateKey createKey(
+      HashType hashType, EllipticCurveType curveType, EcdsaSignatureEncoding encoding)
+      throws GeneralSecurityException {
+    return factory.createKey(
+        EcdsaKeyFormat.newBuilder()
+            .setParams(
+                EcdsaParams.newBuilder()
+                    .setHashType(hashType)
+                    .setCurve(curveType)
+                    .setEncoding(encoding))
+            .build());
+  }
+
+  @Test
+  public void basics() throws Exception {
+    assertThat(verifyManager.getKeyType())
+        .isEqualTo("type.googleapis.com/google.crypto.tink.EcdsaPublicKey");
+    assertThat(verifyManager.getVersion()).isEqualTo(0);
+    assertThat(verifyManager.keyMaterialType()).isEqualTo(KeyMaterialType.ASYMMETRIC_PUBLIC);
+  }
+
+  @Test
+  public void validateKey_usualPublicKey() throws Exception {
+    verifyManager.validateKey(
+        signManager.getPublicKey(
+            createKey(HashType.SHA256, EllipticCurveType.NIST_P256, EcdsaSignatureEncoding.DER)));
+    verifyManager.validateKey(
+        signManager.getPublicKey(
+            createKey(
+                HashType.SHA256, EllipticCurveType.NIST_P256, EcdsaSignatureEncoding.IEEE_P1363)));
+    verifyManager.validateKey(
+        signManager.getPublicKey(
+            createKey(HashType.SHA384, EllipticCurveType.NIST_P384, EcdsaSignatureEncoding.DER)));
+    verifyManager.validateKey(
+        signManager.getPublicKey(
+            createKey(
+                HashType.SHA384, EllipticCurveType.NIST_P384, EcdsaSignatureEncoding.IEEE_P1363)));
+    verifyManager.validateKey(
+        signManager.getPublicKey(
+            createKey(HashType.SHA512, EllipticCurveType.NIST_P384, EcdsaSignatureEncoding.DER)));
+    verifyManager.validateKey(
+        signManager.getPublicKey(
+            createKey(
+                HashType.SHA512, EllipticCurveType.NIST_P384, EcdsaSignatureEncoding.IEEE_P1363)));
+    verifyManager.validateKey(
+        signManager.getPublicKey(
+            createKey(HashType.SHA512, EllipticCurveType.NIST_P521, EcdsaSignatureEncoding.DER)));
+    verifyManager.validateKey(
+        signManager.getPublicKey(
+            createKey(
+                HashType.SHA512, EllipticCurveType.NIST_P521, EcdsaSignatureEncoding.IEEE_P1363)));
+  }
+
+  private EcdsaPublicKey validPublicKey() throws Exception {
+    return signManager.getPublicKey(
+        createKey(HashType.SHA256, EllipticCurveType.NIST_P256, EcdsaSignatureEncoding.DER));
+  }
+
+  @Test
+  public void validateKey_wrongVersion_throws() throws Exception {
+    EcdsaPublicKey wrongVersionKey =
+        EcdsaPublicKey.newBuilder(validPublicKey()).setVersion(1).build();
+    try {
+      verifyManager.validateKey(wrongVersionKey);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected.
+    }
+  }
+
+  @Test
+  public void validateKey_badParams_throws() throws Exception {
+    EcdsaPublicKey validKey = validPublicKey();
+    EcdsaPublicKey wrongHashKey =
+        EcdsaPublicKey.newBuilder(validKey)
+            .setParams(
+                EcdsaParams.newBuilder(validKey.getParams())
+                    .setHashType(HashType.SHA256)
+                    .setCurve(EllipticCurveType.NIST_P521)
+                    .build())
+            .build();
+    try {
+      verifyManager.validateKey(wrongHashKey);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected.
     }
   }
 
@@ -132,11 +221,7 @@
     for (int i = 0; i < rfcTestVectors.length; i++) {
       RfcTestVector t = rfcTestVectors[i];
       PublicKeyVerify verifier = createVerifier(t);
-      try {
-        verifier.verify(t.sig, t.msg);
-      } catch (GeneralSecurityException e) {
-        fail("Valid signature, should not throw exception");
-      }
+      verifier.verify(t.sig, t.msg);
       for (BytesMutation mutation : TestUtil.generateMutations(t.sig)) {
         try {
           verifier.verify(mutation.value, t.msg);
@@ -152,6 +237,16 @@
     }
   }
 
+  private static class HashAndCurveType {
+    public HashType hashType;
+    public EllipticCurveType curveType;
+
+    public HashAndCurveType(HashType hashType, EllipticCurveType curveType) {
+      this.hashType = hashType;
+      this.curveType = curveType;
+    }
+  }
+
   @Test
   public void testGetPrimitiveWithJCE() throws Exception {
     HashAndCurveType[] hashAndCurves = {
@@ -186,11 +281,7 @@
               EcdsaSignatureEncoding.DER,
               w.getAffineX().toByteArray(),
               w.getAffineY().toByteArray());
-      try {
-        verifier.verify(signature, msg);
-      } catch (GeneralSecurityException e) {
-        fail("Valid signature, should not throw exception");
-      }
+      verifier.verify(signature, msg);
     }
   }
 
@@ -244,7 +335,8 @@
       byte[] pubY)
       throws Exception {
     EcdsaPublicKey ecdsaPubKey = TestUtil.createEcdsaPubKey(hashType, curve, encoding, pubX, pubY);
-    EcdsaVerifyKeyManager verifyManager = new EcdsaVerifyKeyManager();
-    return verifyManager.getPrimitive(ecdsaPubKey);
+    // Validating so that we throw exceptions when it is expected.
+    verifyManager.validateKey(ecdsaPubKey);
+    return verifyManager.getPrimitive(ecdsaPubKey, PublicKeyVerify.class);
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/signature/Ed25519PrivateKeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/signature/Ed25519PrivateKeyManagerTest.java
index 116e7a4..716fef9 100644
--- a/java/src/test/java/com/google/crypto/tink/signature/Ed25519PrivateKeyManagerTest.java
+++ b/java/src/test/java/com/google/crypto/tink/signature/Ed25519PrivateKeyManagerTest.java
@@ -16,25 +16,22 @@
 
 package com.google.crypto.tink.signature;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
-import com.google.crypto.tink.Config;
-import com.google.crypto.tink.KeysetHandle;
 import com.google.crypto.tink.PublicKeySign;
 import com.google.crypto.tink.PublicKeyVerify;
 import com.google.crypto.tink.TestUtil;
+import com.google.crypto.tink.proto.Ed25519KeyFormat;
 import com.google.crypto.tink.proto.Ed25519PrivateKey;
-import com.google.crypto.tink.proto.KeyData;
-import com.google.crypto.tink.proto.KeyTemplate;
-import com.google.crypto.tink.subtle.Ed25519Sign;
+import com.google.crypto.tink.proto.Ed25519PublicKey;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.subtle.Ed25519Verify;
 import com.google.crypto.tink.subtle.Random;
-import com.google.protobuf.MessageLite;
+import com.google.protobuf.ByteString;
 import java.security.GeneralSecurityException;
-import org.junit.BeforeClass;
+import java.util.Set;
+import java.util.TreeSet;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -42,59 +39,119 @@
 /** Unit tests for Ed25519PrivateKeyManager. */
 @RunWith(JUnit4.class)
 public class Ed25519PrivateKeyManagerTest {
-  @BeforeClass
-  public static void setUp() throws GeneralSecurityException {
-    Config.register(SignatureConfig.TINK_1_0_0);
-    ;
+  private final Ed25519PrivateKeyManager manager = new Ed25519PrivateKeyManager();
+  private final Ed25519PrivateKeyManager.KeyFactory<Ed25519KeyFormat, Ed25519PrivateKey> factory =
+      manager.keyFactory();
+
+  @Test
+  public void basics() throws Exception {
+    assertThat(manager.getKeyType())
+        .isEqualTo("type.googleapis.com/google.crypto.tink.Ed25519PrivateKey");
+    assertThat(manager.getVersion()).isEqualTo(0);
+    assertThat(manager.keyMaterialType()).isEqualTo(KeyMaterialType.ASYMMETRIC_PRIVATE);
   }
 
   @Test
-  public void testBasic() throws Exception {
-    Ed25519PrivateKeyManager manager = new Ed25519PrivateKeyManager();
-    KeyTemplate template = SignatureKeyTemplates.ED25519;
-    MessageLite key = manager.newKey(template.getValue());
-    assertTrue(key instanceof Ed25519PrivateKey);
+  public void validateKeyFormat_empty() throws Exception {
+    factory.validateKeyFormat(Ed25519KeyFormat.getDefaultInstance());
+  }
 
-    Ed25519PrivateKey keyProto = (Ed25519PrivateKey) key;
-    assertEquals(32, keyProto.getKeyValue().size());
+  @Test
+  public void createKey_checkValues() throws Exception {
+    Ed25519PrivateKey privateKey = factory.createKey(Ed25519KeyFormat.getDefaultInstance());
+    assertThat(privateKey.getVersion()).isEqualTo(0);
+    assertThat(privateKey.getPublicKey().getVersion()).isEqualTo(privateKey.getVersion());
+    assertThat(privateKey.getKeyValue()).hasSize(32);
+    assertThat(privateKey.getPublicKey().getKeyValue()).hasSize(32);
+  }
 
-    PublicKeySign signer = manager.getPrimitive(key);
-    assertTrue(signer instanceof Ed25519Sign);
-    byte[] message = Random.randBytes(20);
-    byte[] signature = signer.sign(message);
-    assertEquals(64, signature.length);
-
-    Ed25519PublicKeyManager publicKeyManager = new Ed25519PublicKeyManager();
-    PublicKeyVerify verifier = publicKeyManager.getPrimitive(keyProto.getPublicKey());
-    assertTrue(verifier instanceof Ed25519Verify);
+  @Test
+  public void validateKey_empty_throws() throws Exception {
     try {
-      verifier.verify(signature, message);
+      manager.validateKey(Ed25519PrivateKey.getDefaultInstance());
+      fail();
     } catch (GeneralSecurityException e) {
-      fail("Do not expect GeneralSecurityException: " + e);
+      // expected
+    }
+  }
+
+  // Tests that generated keys are different.
+  @Test
+  public void createKey_differentValues() throws Exception {
+    Ed25519KeyFormat format = Ed25519KeyFormat.getDefaultInstance();
+    Set<String> keys = new TreeSet<>();
+    int numTests = 100;
+    for (int i = 0; i < numTests; i++) {
+      keys.add(TestUtil.hexEncode(factory.createKey(format).getKeyValue().toByteArray()));
+    }
+    assertThat(keys).hasSize(numTests);
+  }
+
+  @Test
+  public void createKeyThenValidate() throws Exception {
+    manager.validateKey(factory.createKey(Ed25519KeyFormat.getDefaultInstance()));
+  }
+
+  @Test
+  public void validateKey_wrongVersion() throws Exception {
+    Ed25519PrivateKey validKey = factory.createKey(Ed25519KeyFormat.getDefaultInstance());
+    Ed25519PrivateKey invalidKey = Ed25519PrivateKey.newBuilder(validKey).setVersion(1).build();
+    try {
+      manager.validateKey(invalidKey);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKey_wrongLength64_throws() throws Exception {
+    Ed25519PrivateKey validKey = factory.createKey(Ed25519KeyFormat.getDefaultInstance());
+    Ed25519PrivateKey invalidKey =
+        Ed25519PrivateKey.newBuilder(validKey)
+            .setKeyValue(ByteString.copyFrom(Random.randBytes(64)))
+            .build();
+    try {
+      manager.validateKey(invalidKey);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKey_wrongLengthPublicKey64_throws() throws Exception {
+    Ed25519PrivateKey validKey = factory.createKey(Ed25519KeyFormat.getDefaultInstance());
+    Ed25519PrivateKey invalidKey =
+        Ed25519PrivateKey.newBuilder(validKey)
+            .setPublicKey(
+                Ed25519PublicKey.newBuilder(validKey.getPublicKey())
+                    .setKeyValue(ByteString.copyFrom(Random.randBytes(64))))
+            .build();
+    try {
+      manager.validateKey(invalidKey);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
     }
   }
 
   /** Tests that a public key is extracted properly from a private key. */
   @Test
-  public void testGetPublicKeyData() throws Exception {
-    KeysetHandle privateHandle = KeysetHandle.generateNew(SignatureKeyTemplates.ED25519);
-    KeyData privateKeyData = TestUtil.getKeyset(privateHandle).getKey(0).getKeyData();
-    Ed25519PrivateKeyManager privateManager = new Ed25519PrivateKeyManager();
-    KeyData publicKeyData = privateManager.getPublicKeyData(privateKeyData.getValue());
-    assertEquals(Ed25519PublicKeyManager.TYPE_URL, publicKeyData.getTypeUrl());
-    assertEquals(KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC, publicKeyData.getKeyMaterialType());
-    Ed25519PrivateKey privateKey = Ed25519PrivateKey.parseFrom(privateKeyData.getValue());
-    assertArrayEquals(
-        privateKey.getPublicKey().toByteArray(), publicKeyData.getValue().toByteArray());
+  public void getPublicKey_checkValues() throws Exception {
+    Ed25519PrivateKey privateKey = factory.createKey(Ed25519KeyFormat.getDefaultInstance());
+    Ed25519PublicKey publicKey = manager.getPublicKey(privateKey);
+    assertThat(publicKey).isEqualTo(privateKey.getPublicKey());
+  }
 
-    Ed25519PublicKeyManager publicManager = new Ed25519PublicKeyManager();
-    PublicKeySign signer = privateManager.getPrimitive(privateKeyData.getValue());
-    PublicKeyVerify verifier = publicManager.getPrimitive(publicKeyData.getValue());
-    byte[] message = Random.randBytes(20);
-    try {
-      verifier.verify(signer.sign(message), message);
-    } catch (GeneralSecurityException e) {
-      fail("Should not fail: " + e);
-    }
+  @Test
+  public void createPrimitive() throws Exception {
+    Ed25519PrivateKey privateKey = factory.createKey(Ed25519KeyFormat.getDefaultInstance());
+    PublicKeySign signer = manager.getPrimitive(privateKey, PublicKeySign.class);
+
+    PublicKeyVerify verifier =
+        new Ed25519Verify(privateKey.getPublicKey().getKeyValue().toByteArray());
+    byte[] message = Random.randBytes(135);
+    verifier.verify(signer.sign(message), message);
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/signature/Ed25519PublicKeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/signature/Ed25519PublicKeyManagerTest.java
index 0e0fdf0..74fe9fc 100644
--- a/java/src/test/java/com/google/crypto/tink/signature/Ed25519PublicKeyManagerTest.java
+++ b/java/src/test/java/com/google/crypto/tink/signature/Ed25519PublicKeyManagerTest.java
@@ -16,20 +16,18 @@
 
 package com.google.crypto.tink.signature;
 
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
-import com.google.crypto.tink.Config;
 import com.google.crypto.tink.PublicKeySign;
 import com.google.crypto.tink.PublicKeyVerify;
-import com.google.crypto.tink.TestUtil;
-import com.google.crypto.tink.TestUtil.BytesMutation;
+import com.google.crypto.tink.proto.Ed25519KeyFormat;
 import com.google.crypto.tink.proto.Ed25519PrivateKey;
-import com.google.crypto.tink.proto.KeyTemplate;
-import com.google.crypto.tink.subtle.Hex;
+import com.google.crypto.tink.proto.Ed25519PublicKey;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.subtle.Random;
-import com.google.protobuf.MessageLite;
+import com.google.protobuf.ByteString;
 import java.security.GeneralSecurityException;
-import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -37,53 +35,108 @@
 /** Unit tests for Ed25519PublicKeyManager. */
 @RunWith(JUnit4.class)
 public class Ed25519PublicKeyManagerTest {
-  @Before
-  public void setUp() throws GeneralSecurityException {
-    Config.register(SignatureConfig.TINK_1_0_0);
+  private final Ed25519PrivateKeyManager signManager = new Ed25519PrivateKeyManager();
+  private final Ed25519PrivateKeyManager.KeyFactory<Ed25519KeyFormat, Ed25519PrivateKey> factory =
+      signManager.keyFactory();
+
+  private final Ed25519PublicKeyManager verifyManager = new Ed25519PublicKeyManager();
+
+  @Test
+  public void basics() throws Exception {
+    assertThat(verifyManager.getKeyType())
+        .isEqualTo("type.googleapis.com/google.crypto.tink.Ed25519PublicKey");
+    assertThat(verifyManager.getVersion()).isEqualTo(0);
+    assertThat(verifyManager.keyMaterialType()).isEqualTo(KeyMaterialType.ASYMMETRIC_PUBLIC);
   }
 
   @Test
-  public void testModifiedSignature() throws Exception {
-    Ed25519PrivateKeyManager manager = new Ed25519PrivateKeyManager();
-    KeyTemplate template = SignatureKeyTemplates.ED25519;
-    MessageLite key = manager.newKey(template.getValue());
-    Ed25519PrivateKey keyProto = (Ed25519PrivateKey) key;
+  public void validateKey_empty_throws() throws Exception {
+    try {
+      verifyManager.validateKey(Ed25519PublicKey.getDefaultInstance());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
 
-    PublicKeySign signer = manager.getPrimitive(key);
-    byte[] message = Random.randBytes(20);
+  private Ed25519PrivateKey createPrivateKey() throws GeneralSecurityException {
+    return factory.createKey(Ed25519KeyFormat.getDefaultInstance());
+  }
+
+  @Test
+  public void validateKey() throws Exception {
+    Ed25519PublicKey publicKey = signManager.getPublicKey(createPrivateKey());
+    verifyManager.validateKey(publicKey);
+  }
+
+  @Test
+  public void validateKey_wrongVersion() throws Exception {
+    Ed25519PublicKey publicKey = signManager.getPublicKey(createPrivateKey());
+    Ed25519PublicKey invalidKey = Ed25519PublicKey.newBuilder(publicKey).setVersion(1).build();
+    try {
+      verifyManager.validateKey(invalidKey);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKey_wrongLength31_throws() throws Exception {
+    Ed25519PublicKey publicKey = signManager.getPublicKey(createPrivateKey());
+    Ed25519PublicKey invalidKey = Ed25519PublicKey.newBuilder(publicKey)
+              .setKeyValue(ByteString.copyFrom(Random.randBytes(31)))
+              .build();
+    try {
+      verifyManager.validateKey(invalidKey);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKey_wrongLength64_throws() throws Exception {
+    Ed25519PublicKey publicKey = signManager.getPublicKey(createPrivateKey());
+    Ed25519PublicKey invalidKey = Ed25519PublicKey.newBuilder(publicKey)
+              .setKeyValue(ByteString.copyFrom(Random.randBytes(64)))
+              .build();
+    try {
+      verifyManager.validateKey(invalidKey);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void createPrimitive() throws Exception {
+    Ed25519PrivateKey privateKey = createPrivateKey();
+    Ed25519PublicKey publicKey = signManager.getPublicKey(privateKey);
+
+    PublicKeySign signer = signManager.getPrimitive(privateKey, PublicKeySign.class);
+    PublicKeyVerify verifier = verifyManager.getPrimitive(publicKey, PublicKeyVerify.class);
+
+    byte[] message = Random.randBytes(135);
+    verifier.verify(signer.sign(message), message);
+  }
+
+  @Test
+  public void createPrimitive_anotherKey_throws() throws Exception {
+    Ed25519PrivateKey privateKey = createPrivateKey();
+    // Create a different key.
+    Ed25519PublicKey publicKey = signManager.getPublicKey(createPrivateKey());
+
+    PublicKeySign signer = signManager.getPrimitive(privateKey, PublicKeySign.class);
+    PublicKeyVerify verifier = verifyManager.getPrimitive(publicKey, PublicKeyVerify.class);
+
+    byte[] message = Random.randBytes(135);
     byte[] signature = signer.sign(message);
-    Ed25519PublicKeyManager publicKeyManager = new Ed25519PublicKeyManager();
-    PublicKeyVerify verifier = publicKeyManager.getPrimitive(keyProto.getPublicKey());
     try {
       verifier.verify(signature, message);
+      fail();
     } catch (GeneralSecurityException e) {
-      fail("Did not expect GeneralSecurityException: " + e);
-    }
-
-    for (BytesMutation mutation : TestUtil.generateMutations(message)) {
-      try {
-        verifier.verify(signature, mutation.value);
-        fail(
-            String.format(
-                "Invalid message, should have thrown exception: sig = %s, msg = %s,"
-                    + " description = %s",
-                Hex.encode(signature), Hex.encode(mutation.value), mutation.description));
-      } catch (GeneralSecurityException expected) {
-        // Expected.
-      }
-    }
-
-    for (BytesMutation mutation : TestUtil.generateMutations(signature)) {
-      try {
-        verifier.verify(mutation.value, message);
-        fail(
-            String.format(
-                "Invalid signature, should have thrown exception: signature = %s, msg = %s,"
-                    + " description = %s",
-                Hex.encode(mutation.value), Hex.encode(message), mutation.description));
-      } catch (GeneralSecurityException expected) {
-        // Expected.
-      }
+      // expected
     }
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/signature/PublicKeySignCatalogueTest.java b/java/src/test/java/com/google/crypto/tink/signature/PublicKeySignCatalogueTest.java
deleted file mode 100644
index f3874b4..0000000
--- a/java/src/test/java/com/google/crypto/tink/signature/PublicKeySignCatalogueTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package com.google.crypto.tink.signature;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import com.google.crypto.tink.KeyManager;
-import com.google.crypto.tink.PublicKeySign;
-import com.google.crypto.tink.proto.KeyTypeEntry;
-import com.google.crypto.tink.proto.RegistryConfig;
-import java.security.GeneralSecurityException;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for PublicKeySignCatalogue. */
-@RunWith(JUnit4.class)
-public class PublicKeySignCatalogueTest {
-
-  @Test
-  public void testBasic() throws Exception {
-    PublicKeySignCatalogue catalogue = new PublicKeySignCatalogue();
-
-    // Check a single key type for signing, incl. case-insensitve primitive name.
-    String keyType = "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey";
-    {
-      KeyManager<PublicKeySign> manager = catalogue.getKeyManager(keyType, "PublicKeySign", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-    {
-      KeyManager<PublicKeySign> manager = catalogue.getKeyManager(keyType, "PUBLicKeYSigN", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-    {
-      KeyManager<PublicKeySign> manager = catalogue.getKeyManager(keyType, "PUBLICKEYSIGN", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-
-    // Check all entries from the current SignatureConfig.
-    RegistryConfig config = SignatureConfig.TINK_1_0_0;
-    int count = 0;
-    for (KeyTypeEntry entry : config.getEntryList()) {
-      if ("PublicKeySign".equals(entry.getPrimitiveName())) {
-        count = count + 1;
-        KeyManager<PublicKeySign> manager =
-            catalogue.getKeyManager(
-                entry.getTypeUrl(), "publickeysign", entry.getKeyManagerVersion());
-        assertThat(manager.doesSupport(entry.getTypeUrl())).isTrue();
-      }
-    }
-    assertEquals(2, count);
-  }
-
-  @Test
-  public void testErrors() throws Exception {
-    PublicKeySignCatalogue catalogue = new PublicKeySignCatalogue();
-    String keyType = "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey";
-
-    // Wrong primitive name.
-    try {
-      catalogue.getKeyManager(keyType, "aead", 0);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No support for primitive");
-    }
-
-    // Wrong key manager version.
-    try {
-      catalogue.getKeyManager(keyType, "publickeysign", 1);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No key manager");
-      assertThat(e.toString()).contains("version at least");
-    }
-
-    // Wrong key type.
-    try {
-      catalogue.getKeyManager("some.unknown.key.type", "publickeysign", 0);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No support for primitive");
-      assertThat(e.toString()).contains("with key type");
-    }
-  }
-}
diff --git a/java/src/test/java/com/google/crypto/tink/signature/PublicKeySignFactoryTest.java b/java/src/test/java/com/google/crypto/tink/signature/PublicKeySignFactoryTest.java
index 3fbd16b..124d051 100644
--- a/java/src/test/java/com/google/crypto/tink/signature/PublicKeySignFactoryTest.java
+++ b/java/src/test/java/com/google/crypto/tink/signature/PublicKeySignFactoryTest.java
@@ -59,7 +59,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 tinkPrivateKey,
-                EcdsaSignKeyManager.TYPE_URL,
+                new EcdsaSignKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
             1,
             KeyStatusType.ENABLED,
@@ -72,7 +72,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 legacyPrivateKey,
-                EcdsaSignKeyManager.TYPE_URL,
+                new EcdsaSignKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
             2,
             KeyStatusType.ENABLED,
@@ -85,7 +85,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 rawPrivateKey,
-                EcdsaSignKeyManager.TYPE_URL,
+                new EcdsaSignKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
             3,
             KeyStatusType.ENABLED,
@@ -98,7 +98,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 crunchyPrivateKey,
-                EcdsaSignKeyManager.TYPE_URL,
+                new EcdsaSignKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
             4,
             KeyStatusType.ENABLED,
@@ -131,7 +131,7 @@
                       TestUtil.createKey(
                           TestUtil.createKeyData(
                               privateKeys[i].getPublicKey(),
-                              EcdsaVerifyKeyManager.TYPE_URL,
+                              new EcdsaVerifyKeyManager().getKeyType(),
                               KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
                           keys[i].getKeyId(),
                           KeyStatusType.ENABLED,
@@ -153,7 +153,7 @@
                       TestUtil.createKey(
                           TestUtil.createKeyData(
                               randomPrivKey.getPublicKey(),
-                              EcdsaVerifyKeyManager.TYPE_URL,
+                              new EcdsaVerifyKeyManager().getKeyType(),
                               KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
                           keys[i].getKeyId(),
                           KeyStatusType.ENABLED,
diff --git a/java/src/test/java/com/google/crypto/tink/signature/PublicKeySignIntegrationTest.java b/java/src/test/java/com/google/crypto/tink/signature/PublicKeySignIntegrationTest.java
index db52f46..71d696a 100644
--- a/java/src/test/java/com/google/crypto/tink/signature/PublicKeySignIntegrationTest.java
+++ b/java/src/test/java/com/google/crypto/tink/signature/PublicKeySignIntegrationTest.java
@@ -59,7 +59,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 tinkPrivateKey,
-                EcdsaSignKeyManager.TYPE_URL,
+                new EcdsaSignKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
             1,
             KeyStatusType.ENABLED,
@@ -72,7 +72,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 legacyPrivateKey,
-                EcdsaSignKeyManager.TYPE_URL,
+                new EcdsaSignKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
             2,
             KeyStatusType.ENABLED,
@@ -85,7 +85,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 rawPrivateKey,
-                EcdsaSignKeyManager.TYPE_URL,
+                new EcdsaSignKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
             3,
             KeyStatusType.ENABLED,
@@ -98,7 +98,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 crunchyPrivateKey,
-                EcdsaSignKeyManager.TYPE_URL,
+                new EcdsaSignKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
             4,
             KeyStatusType.ENABLED,
@@ -130,7 +130,7 @@
                       TestUtil.createKey(
                           TestUtil.createKeyData(
                               privateKeys[i].getPublicKey(),
-                              EcdsaVerifyKeyManager.TYPE_URL,
+                              new EcdsaVerifyKeyManager().getKeyType(),
                               KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
                           keys[i].getKeyId(),
                           KeyStatusType.ENABLED,
@@ -152,7 +152,7 @@
                       TestUtil.createKey(
                           TestUtil.createKeyData(
                               randomPrivKey.getPublicKey(),
-                              EcdsaVerifyKeyManager.TYPE_URL,
+                              new EcdsaVerifyKeyManager().getKeyType(),
                               KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
                           keys[i].getKeyId(),
                           KeyStatusType.ENABLED,
diff --git a/java/src/test/java/com/google/crypto/tink/signature/PublicKeySignWrapperTest.java b/java/src/test/java/com/google/crypto/tink/signature/PublicKeySignWrapperTest.java
index 3718402..db76c49 100644
--- a/java/src/test/java/com/google/crypto/tink/signature/PublicKeySignWrapperTest.java
+++ b/java/src/test/java/com/google/crypto/tink/signature/PublicKeySignWrapperTest.java
@@ -60,7 +60,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 tinkPrivateKey,
-                EcdsaSignKeyManager.TYPE_URL,
+                new EcdsaSignKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
             1,
             KeyStatusType.ENABLED,
@@ -73,7 +73,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 legacyPrivateKey,
-                EcdsaSignKeyManager.TYPE_URL,
+                new EcdsaSignKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
             2,
             KeyStatusType.ENABLED,
@@ -86,7 +86,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 rawPrivateKey,
-                EcdsaSignKeyManager.TYPE_URL,
+                new EcdsaSignKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
             3,
             KeyStatusType.ENABLED,
@@ -99,7 +99,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 crunchyPrivateKey,
-                EcdsaSignKeyManager.TYPE_URL,
+                new EcdsaSignKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
             4,
             KeyStatusType.ENABLED,
@@ -116,7 +116,9 @@
               TestUtil.createKeyset(
                   keys[i], keys[(i + 1) % j], keys[(i + 2) % j], keys[(i + 3) % j]));
       // Signs with the primary private key.
-      PublicKeySign signer = new PublicKeySignWrapper().wrap(Registry.getPrimitives(keysetHandle));
+      PublicKeySign signer =
+          new PublicKeySignWrapper()
+              .wrap(Registry.getPrimitives(keysetHandle, PublicKeySign.class));
       byte[] plaintext = Random.randBytes(1211);
       byte[] sig = signer.sign(plaintext);
       if (keys[i].getOutputPrefixType() != OutputPrefixType.RAW) {
@@ -132,7 +134,7 @@
                       TestUtil.createKey(
                           TestUtil.createKeyData(
                               privateKeys[i].getPublicKey(),
-                              EcdsaVerifyKeyManager.TYPE_URL,
+                              new EcdsaVerifyKeyManager().getKeyType(),
                               KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
                           keys[i].getKeyId(),
                           KeyStatusType.ENABLED,
@@ -154,7 +156,7 @@
                       TestUtil.createKey(
                           TestUtil.createKeyData(
                               randomPrivKey.getPublicKey(),
-                              EcdsaVerifyKeyManager.TYPE_URL,
+                              new EcdsaVerifyKeyManager().getKeyType(),
                               KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
                           keys[i].getKeyId(),
                           KeyStatusType.ENABLED,
diff --git a/java/src/test/java/com/google/crypto/tink/signature/PublicKeyVerifyCatalogueTest.java b/java/src/test/java/com/google/crypto/tink/signature/PublicKeyVerifyCatalogueTest.java
deleted file mode 100644
index aaf80eb..0000000
--- a/java/src/test/java/com/google/crypto/tink/signature/PublicKeyVerifyCatalogueTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package com.google.crypto.tink.signature;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import com.google.crypto.tink.KeyManager;
-import com.google.crypto.tink.PublicKeyVerify;
-import com.google.crypto.tink.proto.KeyTypeEntry;
-import com.google.crypto.tink.proto.RegistryConfig;
-import java.security.GeneralSecurityException;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/** Tests for PublicKeyVerifyCatalogue. */
-@RunWith(JUnit4.class)
-public class PublicKeyVerifyCatalogueTest {
-
-  @Test
-  public void testBasic() throws Exception {
-    PublicKeyVerifyCatalogue catalogue = new PublicKeyVerifyCatalogue();
-
-    // Check a single key type for verifying, incl. case-insensitve primitive name.
-    String keyType = "type.googleapis.com/google.crypto.tink.Ed25519PublicKey";
-    {
-      KeyManager<PublicKeyVerify> manager = catalogue.getKeyManager(keyType, "PublicKeyVerify", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-    {
-      KeyManager<PublicKeyVerify> manager = catalogue.getKeyManager(keyType, "PUBLicKeYVerIFY", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-    {
-      KeyManager<PublicKeyVerify> manager = catalogue.getKeyManager(keyType, "PUBLICKEYVERIFY", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-
-    // Check all entries from the current SignatureConfig.
-    RegistryConfig config = SignatureConfig.TINK_1_0_0;
-    int count = 0;
-    for (KeyTypeEntry entry : config.getEntryList()) {
-      if ("PublicKeyVerify".equals(entry.getPrimitiveName())) {
-        count = count + 1;
-        KeyManager<PublicKeyVerify> manager =
-            catalogue.getKeyManager(
-                entry.getTypeUrl(), "publickeyverify", entry.getKeyManagerVersion());
-        assertThat(manager.doesSupport(entry.getTypeUrl())).isTrue();
-      }
-    }
-    assertEquals(2, count);
-  }
-
-  @Test
-  public void testErrors() throws Exception {
-    PublicKeyVerifyCatalogue catalogue = new PublicKeyVerifyCatalogue();
-    String keyType = "type.googleapis.com/google.crypto.tink.EcdsaPublicKey";
-
-    // Wrong primitive name.
-    try {
-      catalogue.getKeyManager(keyType, "aead", 0);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No support for primitive");
-    }
-
-    // Wrong key manager version.
-    try {
-      catalogue.getKeyManager(keyType, "publickeyverify", 1);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No key manager");
-      assertThat(e.toString()).contains("version at least");
-    }
-
-    // Wrong key type.
-    try {
-      catalogue.getKeyManager("some.unknown.key.type", "publickeyverify", 0);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No support for primitive");
-      assertThat(e.toString()).contains("with key type");
-    }
-  }
-}
diff --git a/java/src/test/java/com/google/crypto/tink/signature/PublicKeyVerifyFactoryTest.java b/java/src/test/java/com/google/crypto/tink/signature/PublicKeyVerifyFactoryTest.java
index 6219fa1..8f0711e 100644
--- a/java/src/test/java/com/google/crypto/tink/signature/PublicKeyVerifyFactoryTest.java
+++ b/java/src/test/java/com/google/crypto/tink/signature/PublicKeyVerifyFactoryTest.java
@@ -56,7 +56,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 tinkPrivateKey.getPublicKey(),
-                EcdsaVerifyKeyManager.TYPE_URL,
+                new EcdsaVerifyKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
             1,
             KeyStatusType.ENABLED,
@@ -69,7 +69,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 legacyPrivateKey.getPublicKey(),
-                EcdsaVerifyKeyManager.TYPE_URL,
+                new EcdsaVerifyKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
             2,
             KeyStatusType.ENABLED,
@@ -82,7 +82,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 rawPrivateKey.getPublicKey(),
-                EcdsaVerifyKeyManager.TYPE_URL,
+                new EcdsaVerifyKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
             3,
             KeyStatusType.ENABLED,
@@ -95,7 +95,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 crunchyPrivateKey.getPublicKey(),
-                EcdsaVerifyKeyManager.TYPE_URL,
+                new EcdsaVerifyKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
             4,
             KeyStatusType.ENABLED,
@@ -121,7 +121,7 @@
                         TestUtil.createKey(
                             TestUtil.createKeyData(
                                 privateKeys[k],
-                                EcdsaSignKeyManager.TYPE_URL,
+                                new EcdsaSignKeyManager().getKeyType(),
                                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
                             keys[k].getKeyId(),
                             KeyStatusType.ENABLED,
@@ -146,7 +146,7 @@
                       TestUtil.createKey(
                           TestUtil.createKeyData(
                               randomPrivKey,
-                              EcdsaSignKeyManager.TYPE_URL,
+                              new EcdsaSignKeyManager().getKeyType(),
                               KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
                           1,
                           KeyStatusType.ENABLED,
diff --git a/java/src/test/java/com/google/crypto/tink/signature/PublicKeyVerifyIntegrationTest.java b/java/src/test/java/com/google/crypto/tink/signature/PublicKeyVerifyIntegrationTest.java
index c0b40d9..7fac2aa 100644
--- a/java/src/test/java/com/google/crypto/tink/signature/PublicKeyVerifyIntegrationTest.java
+++ b/java/src/test/java/com/google/crypto/tink/signature/PublicKeyVerifyIntegrationTest.java
@@ -56,7 +56,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 tinkPrivateKey.getPublicKey(),
-                EcdsaVerifyKeyManager.TYPE_URL,
+                new EcdsaVerifyKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
             1,
             KeyStatusType.ENABLED,
@@ -69,7 +69,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 legacyPrivateKey.getPublicKey(),
-                EcdsaVerifyKeyManager.TYPE_URL,
+                new EcdsaVerifyKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
             2,
             KeyStatusType.ENABLED,
@@ -82,7 +82,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 rawPrivateKey.getPublicKey(),
-                EcdsaVerifyKeyManager.TYPE_URL,
+                new EcdsaVerifyKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
             3,
             KeyStatusType.ENABLED,
@@ -95,7 +95,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 crunchyPrivateKey.getPublicKey(),
-                EcdsaVerifyKeyManager.TYPE_URL,
+                new EcdsaVerifyKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
             4,
             KeyStatusType.ENABLED,
@@ -120,7 +120,7 @@
                         TestUtil.createKey(
                             TestUtil.createKeyData(
                                 privateKeys[k],
-                                EcdsaSignKeyManager.TYPE_URL,
+                                new EcdsaSignKeyManager().getKeyType(),
                                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
                             keys[k].getKeyId(),
                             KeyStatusType.ENABLED,
@@ -145,7 +145,7 @@
                       TestUtil.createKey(
                           TestUtil.createKeyData(
                               randomPrivKey,
-                              EcdsaSignKeyManager.TYPE_URL,
+                              new EcdsaSignKeyManager().getKeyType(),
                               KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
                           1,
                           KeyStatusType.ENABLED,
diff --git a/java/src/test/java/com/google/crypto/tink/signature/PublicKeyVerifyWrapperTest.java b/java/src/test/java/com/google/crypto/tink/signature/PublicKeyVerifyWrapperTest.java
index 1abdd02..3a99100 100644
--- a/java/src/test/java/com/google/crypto/tink/signature/PublicKeyVerifyWrapperTest.java
+++ b/java/src/test/java/com/google/crypto/tink/signature/PublicKeyVerifyWrapperTest.java
@@ -57,7 +57,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 tinkPrivateKey.getPublicKey(),
-                EcdsaVerifyKeyManager.TYPE_URL,
+                new EcdsaVerifyKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
             1,
             KeyStatusType.ENABLED,
@@ -70,7 +70,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 legacyPrivateKey.getPublicKey(),
-                EcdsaVerifyKeyManager.TYPE_URL,
+                new EcdsaVerifyKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
             2,
             KeyStatusType.ENABLED,
@@ -83,7 +83,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 rawPrivateKey.getPublicKey(),
-                EcdsaVerifyKeyManager.TYPE_URL,
+                new EcdsaVerifyKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
             3,
             KeyStatusType.ENABLED,
@@ -96,7 +96,7 @@
         TestUtil.createKey(
             TestUtil.createKeyData(
                 crunchyPrivateKey.getPublicKey(),
-                EcdsaVerifyKeyManager.TYPE_URL,
+                new EcdsaVerifyKeyManager().getKeyType(),
                 KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC),
             4,
             KeyStatusType.ENABLED,
@@ -113,7 +113,8 @@
               TestUtil.createKeyset(
                   keys[i], keys[(i + 1) % j], keys[(i + 2) % j], keys[(i + 3) % j]));
       PublicKeyVerify verifier =
-          new PublicKeyVerifyWrapper().wrap(Registry.getPrimitives(keysetHandle));
+          new PublicKeyVerifyWrapper()
+              .wrap(Registry.getPrimitives(keysetHandle, PublicKeyVerify.class));
       // Signature from any keys in the keyset should be valid.
       for (int k = 0; k < j; k++) {
         PublicKeySign signer =
@@ -123,7 +124,7 @@
                         TestUtil.createKey(
                             TestUtil.createKeyData(
                                 privateKeys[k],
-                                EcdsaSignKeyManager.TYPE_URL,
+                                new EcdsaSignKeyManager().getKeyType(),
                                 KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
                             keys[k].getKeyId(),
                             KeyStatusType.ENABLED,
@@ -148,7 +149,7 @@
                       TestUtil.createKey(
                           TestUtil.createKeyData(
                               randomPrivKey,
-                              EcdsaSignKeyManager.TYPE_URL,
+                              new EcdsaSignKeyManager().getKeyType(),
                               KeyData.KeyMaterialType.ASYMMETRIC_PRIVATE),
                           1,
                           KeyStatusType.ENABLED,
diff --git a/java/src/test/java/com/google/crypto/tink/signature/RsaSsaPkcs1SignKeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/signature/RsaSsaPkcs1SignKeyManagerTest.java
index 7371320..d182522 100644
--- a/java/src/test/java/com/google/crypto/tink/signature/RsaSsaPkcs1SignKeyManagerTest.java
+++ b/java/src/test/java/com/google/crypto/tink/signature/RsaSsaPkcs1SignKeyManagerTest.java
@@ -16,25 +16,31 @@
 
 package com.google.crypto.tink.signature;
 
-import static org.junit.Assert.assertArrayEquals;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
-import com.google.crypto.tink.KeysetHandle;
 import com.google.crypto.tink.PublicKeySign;
 import com.google.crypto.tink.PublicKeyVerify;
 import com.google.crypto.tink.TestUtil;
-import com.google.crypto.tink.proto.KeyData;
-import com.google.crypto.tink.proto.KeyTemplate;
+import com.google.crypto.tink.proto.HashType;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.proto.RsaSsaPkcs1KeyFormat;
+import com.google.crypto.tink.proto.RsaSsaPkcs1Params;
 import com.google.crypto.tink.proto.RsaSsaPkcs1PrivateKey;
+import com.google.crypto.tink.proto.RsaSsaPkcs1PublicKey;
+import com.google.crypto.tink.subtle.EngineFactory;
 import com.google.crypto.tink.subtle.Random;
+import com.google.crypto.tink.subtle.RsaSsaPkcs1VerifyJce;
 import com.google.protobuf.ByteString;
 import java.math.BigInteger;
 import java.security.GeneralSecurityException;
+import java.security.KeyFactory;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.RSAKeyGenParameterSpec;
+import java.security.spec.RSAPublicKeySpec;
 import java.util.Set;
 import java.util.TreeSet;
-import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -42,14 +48,107 @@
 /** Unit tests for RsaSsaPkcs1SignKeyManager. */
 @RunWith(JUnit4.class)
 public class RsaSsaPkcs1SignKeyManagerTest {
-  @Before
-  public void setUp() throws Exception {
-    SignatureConfig.register();
+  private final RsaSsaPkcs1SignKeyManager manager = new RsaSsaPkcs1SignKeyManager();
+  private final RsaSsaPkcs1SignKeyManager.KeyFactory<RsaSsaPkcs1KeyFormat, RsaSsaPkcs1PrivateKey>
+      factory = manager.keyFactory();
+
+  private static RsaSsaPkcs1KeyFormat createKeyFormat(
+      HashType hashType, int modulusSizeInBits, BigInteger publicExponent) {
+    return RsaSsaPkcs1KeyFormat.newBuilder()
+        .setParams(RsaSsaPkcs1Params.newBuilder().setHashType(hashType))
+        .setModulusSizeInBits(modulusSizeInBits)
+        .setPublicExponent(ByteString.copyFrom(publicExponent.toByteArray()))
+        .build();
   }
 
-  final byte[] msg = Random.randBytes(20);
+  private static RsaSsaPkcs1KeyFormat validKeyFormat() {
+    return createKeyFormat(HashType.SHA256, 3072, RSAKeyGenParameterSpec.F4);
+  }
+
+  @Test
+  public void basics() throws Exception {
+    assertThat(manager.getKeyType())
+        .isEqualTo("type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PrivateKey");
+    assertThat(manager.getVersion()).isEqualTo(0);
+    assertThat(manager.keyMaterialType()).isEqualTo(KeyMaterialType.ASYMMETRIC_PRIVATE);
+  }
+
+  @Test
+  public void validateKeyFormat_empty() throws Exception {
+    try {
+      factory.validateKeyFormat(RsaSsaPkcs1KeyFormat.getDefaultInstance());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_valid() throws Exception {
+    RsaSsaPkcs1KeyFormat format = validKeyFormat();
+    factory.validateKeyFormat(format);
+  }
+
+  @Test
+  public void validateKeyFormat_Sha512Allowed() throws Exception {
+    RsaSsaPkcs1KeyFormat format = createKeyFormat(HashType.SHA512, 3072, RSAKeyGenParameterSpec.F4);
+    factory.validateKeyFormat(format);
+  }
+
+  @Test
+  public void validateKeyFormat_Sha384Allowed() throws Exception {
+    // TODO(b/140410067): Check if SHA384 should be allowed.
+    RsaSsaPkcs1KeyFormat format = createKeyFormat(HashType.SHA384, 3072, RSAKeyGenParameterSpec.F4);
+    factory.validateKeyFormat(format);
+  }
+
+  @Test
+  public void validateKeyFormat_Sha1Disallowed() throws Exception {
+    RsaSsaPkcs1KeyFormat format = createKeyFormat(HashType.SHA1, 3072, RSAKeyGenParameterSpec.F4);
+    try {
+      factory.validateKeyFormat(format);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_UnknownHashDisallowed() throws Exception {
+    RsaSsaPkcs1KeyFormat format =
+        createKeyFormat(HashType.UNKNOWN_HASH, 3072, RSAKeyGenParameterSpec.F4);
+    try {
+      factory.validateKeyFormat(format);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_smallModulusDisallowed_throws() throws Exception {
+    RsaSsaPkcs1KeyFormat format = createKeyFormat(HashType.SHA512, 1024, RSAKeyGenParameterSpec.F4);
+    try {
+      factory.validateKeyFormat(format);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  private static void checkConsistency(
+      RsaSsaPkcs1PrivateKey privateKey, RsaSsaPkcs1KeyFormat keyFormat) {
+    assertThat(privateKey.getPublicKey().getParams()).isEqualTo(keyFormat.getParams());
+    assertThat(privateKey.getPublicKey().getE()).isEqualTo(keyFormat.getPublicExponent());
+    assertThat(privateKey.getPublicKey().getN().toByteArray().length)
+        .isGreaterThan(keyFormat.getModulusSizeInBits() / 8);
+  }
 
   private void checkKey(RsaSsaPkcs1PrivateKey privateKey) throws Exception {
+    RsaSsaPkcs1PublicKey publicKey = privateKey.getPublicKey();
+    assertThat(privateKey.getVersion()).isEqualTo(0);
+    assertThat(publicKey.getVersion()).isEqualTo(privateKey.getVersion());
+
     BigInteger p = new BigInteger(1, privateKey.getP().toByteArray());
     BigInteger q = new BigInteger(1, privateKey.getQ().toByteArray());
     BigInteger n = new BigInteger(1, privateKey.getPublicKey().getN().toByteArray());
@@ -57,120 +156,91 @@
     BigInteger dp = new BigInteger(1, privateKey.getDp().toByteArray());
     BigInteger dq = new BigInteger(1, privateKey.getDq().toByteArray());
     BigInteger crt = new BigInteger(1, privateKey.getCrt().toByteArray());
+    assertThat(p).isGreaterThan(BigInteger.ONE);
+    assertThat(q).isGreaterThan(BigInteger.ONE);
     assertEquals(n, p.multiply(q));
     assertEquals(dp, d.mod(p.subtract(BigInteger.ONE)));
     assertEquals(dq, d.mod(q.subtract(BigInteger.ONE)));
     assertEquals(crt, q.modInverse(p));
   }
 
-  private void testNewKeyWithVerifier(KeyTemplate keyTemplate) throws Exception {
-    // Call newKey multiple times and make sure that it generates different keys.
-    int numTests = 3;
-    RsaSsaPkcs1PrivateKey[] privKeys = new RsaSsaPkcs1PrivateKey[numTests];
-    RsaSsaPkcs1SignKeyManager signManager = new RsaSsaPkcs1SignKeyManager();
-    Set<String> keys = new TreeSet<String>();
+  @Test
+  public void createKey_smallKey() throws Exception {
+    if (TestUtil.isTsan()) {
+      // factory.createKey is too slow in Tsan.
+      return;
+    }
+    RsaSsaPkcs1KeyFormat format = createKeyFormat(HashType.SHA256, 3072, RSAKeyGenParameterSpec.F4);
+    RsaSsaPkcs1PrivateKey key = factory.createKey(format);
+    checkConsistency(key, format);
+    checkKey(key);
+  }
 
-    privKeys[0] =
-        (RsaSsaPkcs1PrivateKey)
-            signManager.newKey(RsaSsaPkcs1KeyFormat.parseFrom(keyTemplate.getValue()));
-    keys.add(TestUtil.hexEncode(privKeys[0].toByteArray()));
+  @Test
+  public void createKey_largeKey() throws Exception {
+    if (TestUtil.isTsan()) {
+      // factory.createKey is too slow in Tsan.
+      return;
+    }
 
-    privKeys[1] = (RsaSsaPkcs1PrivateKey) signManager.newKey(keyTemplate.getValue());
-    keys.add(TestUtil.hexEncode(privKeys[1].toByteArray()));
+    RsaSsaPkcs1KeyFormat format = createKeyFormat(HashType.SHA512, 4096, RSAKeyGenParameterSpec.F4);
+    RsaSsaPkcs1PrivateKey key = factory.createKey(format);
+    checkConsistency(key, format);
+    checkKey(key);
+  }
 
-    privKeys[2] =
-        RsaSsaPkcs1PrivateKey.parseFrom(signManager.newKeyData(keyTemplate.getValue()).getValue());
-    keys.add(TestUtil.hexEncode(privKeys[2].toByteArray()));
-    assertEquals(numTests, keys.size());
+  @Test
+  public void createKey_alwaysNewElement() throws Exception {
+    if (TestUtil.isTsan()) {
+      // factory.createKey is too slow in Tsan.
+      return;
+    }
 
-    // Check key.
+    RsaSsaPkcs1KeyFormat format = createKeyFormat(HashType.SHA256, 3072, RSAKeyGenParameterSpec.F4);
+    Set<String> keys = new TreeSet<>();
+    // Calls newKey multiple times and make sure that they generate different keys -- takes about a
+    // second per key.
+    int numTests = 5;
     for (int i = 0; i < numTests; i++) {
-      checkKey(privKeys[i]);
+      RsaSsaPkcs1PrivateKey key = factory.createKey(format);
+      keys.add(TestUtil.hexEncode(key.getQ().toByteArray()));
+      keys.add(TestUtil.hexEncode(key.getP().toByteArray()));
     }
-
-    // Test whether signer works correctly with the corresponding verifier.
-    RsaSsaPkcs1VerifyKeyManager verifyManager = new RsaSsaPkcs1VerifyKeyManager();
-    for (int j = 0; j < numTests; j++) {
-      PublicKeySign signer = signManager.getPrimitive(privKeys[j]);
-      byte[] signature = signer.sign(msg);
-      for (int k = 0; k < numTests; k++) {
-        PublicKeyVerify verifier = verifyManager.getPrimitive(privKeys[k].getPublicKey());
-        if (j == k) { // The same key
-          try {
-            verifier.verify(signature, msg);
-          } catch (GeneralSecurityException ex) {
-            throw new AssertionError("Valid signature, should not throw exception", ex);
-          }
-        } else { // Different keys
-          try {
-            verifier.verify(signature, msg);
-            fail("Invalid signature, should have thrown exception");
-          } catch (GeneralSecurityException expected) {
-            // Expected
-          }
-        }
-      }
-    }
+    assertThat(keys).hasSize(2 * numTests);
   }
 
   @Test
-  public void testNewKeyWithVerifier() throws Exception {
+  public void getPublicKey_correctValues() throws Exception {
     if (TestUtil.isTsan()) {
-      // This test times out when running under thread sanitizer, so we just skip.
+      // factory.createKey is too slow in Tsan.
       return;
     }
-    testNewKeyWithVerifier(SignatureKeyTemplates.RSA_SSA_PKCS1_3072_SHA256_F4);
-    testNewKeyWithVerifier(SignatureKeyTemplates.RSA_SSA_PKCS1_4096_SHA512_F4);
+
+    RsaSsaPkcs1KeyFormat format = createKeyFormat(HashType.SHA256, 3072, RSAKeyGenParameterSpec.F4);
+    RsaSsaPkcs1PrivateKey key = factory.createKey(format);
+    assertThat(manager.getPublicKey(key)).isEqualTo(key.getPublicKey());
   }
 
   @Test
-  public void testNewKeyWithCorruptedFormat() {
-    ByteString serialized = ByteString.copyFrom(new byte[128]);
-    KeyTemplate keyTemplate =
-        KeyTemplate.newBuilder()
-            .setTypeUrl(RsaSsaPkcs1SignKeyManager.TYPE_URL)
-            .setValue(serialized)
-            .build();
-    RsaSsaPkcs1SignKeyManager keyManager = new RsaSsaPkcs1SignKeyManager();
-    try {
-      keyManager.newKey(serialized);
-      fail("Corrupted format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
-    }
-    try {
-      keyManager.newKeyData(keyTemplate.getValue());
-      fail("Corrupted format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
-    }
-  }
-
-  /** Tests that a public key is extracted properly from a private key. */
-  @Test
-  public void testGetPublicKeyData() throws Exception {
+  public void createPrimitive() throws Exception {
     if (TestUtil.isTsan()) {
-      // This test takes over a minute in successful tsan runs and sometimes times out.
+      // factory.createKey is too slow in Tsan.
       return;
     }
-    KeysetHandle privateHandle =
-        KeysetHandle.generateNew(SignatureKeyTemplates.RSA_SSA_PKCS1_3072_SHA256_F4);
-    KeyData privateKeyData = TestUtil.getKeyset(privateHandle).getKey(0).getKeyData();
-    RsaSsaPkcs1SignKeyManager privateManager = new RsaSsaPkcs1SignKeyManager();
-    KeyData publicKeyData = privateManager.getPublicKeyData(privateKeyData.getValue());
-    assertEquals(RsaSsaPkcs1VerifyKeyManager.TYPE_URL, publicKeyData.getTypeUrl());
-    assertEquals(KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC, publicKeyData.getKeyMaterialType());
-    RsaSsaPkcs1PrivateKey privateKey = RsaSsaPkcs1PrivateKey.parseFrom(privateKeyData.getValue());
-    assertArrayEquals(
-        privateKey.getPublicKey().toByteArray(), publicKeyData.getValue().toByteArray());
-    RsaSsaPkcs1VerifyKeyManager publicManager = new RsaSsaPkcs1VerifyKeyManager();
-    PublicKeySign signer = privateManager.getPrimitive(privateKeyData.getValue());
-    PublicKeyVerify verifier = publicManager.getPrimitive(publicKeyData.getValue());
-    byte[] message = Random.randBytes(20);
-    try {
-      verifier.verify(signer.sign(message), message);
-    } catch (GeneralSecurityException e) {
-      fail("Should not fail: " + e);
-    }
+
+    RsaSsaPkcs1KeyFormat format = createKeyFormat(HashType.SHA256, 3072, RSAKeyGenParameterSpec.F4);
+    RsaSsaPkcs1PrivateKey key = factory.createKey(format);
+    PublicKeySign signer = manager.getPrimitive(key, PublicKeySign.class);
+
+    KeyFactory kf = EngineFactory.KEY_FACTORY.getInstance("RSA");
+    BigInteger modulus = new BigInteger(1, key.getPublicKey().getN().toByteArray());
+    BigInteger exponent = new BigInteger(1, key.getPublicKey().getE().toByteArray());
+    RSAPublicKey publicKey =
+        (RSAPublicKey) kf.generatePublic(new RSAPublicKeySpec(modulus, exponent));
+    PublicKeyVerify verifier = new RsaSsaPkcs1VerifyJce(
+        publicKey, SigUtil.toHashType(key.getPublicKey().getParams().getHashType()));
+
+    byte[] message = Random.randBytes(135);
+    verifier.verify(signer.sign(message), message);
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/signature/RsaSsaPkcs1VerifyKeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/signature/RsaSsaPkcs1VerifyKeyManagerTest.java
index d62a656..dd4101b 100644
--- a/java/src/test/java/com/google/crypto/tink/signature/RsaSsaPkcs1VerifyKeyManagerTest.java
+++ b/java/src/test/java/com/google/crypto/tink/signature/RsaSsaPkcs1VerifyKeyManagerTest.java
@@ -15,16 +15,23 @@
 ////////////////////////////////////////////////////////////////////////////////
 package com.google.crypto.tink.signature;
 
-import static com.google.crypto.tink.TestUtil.assertExceptionContains;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
+import com.google.crypto.tink.PublicKeySign;
 import com.google.crypto.tink.PublicKeyVerify;
 import com.google.crypto.tink.TestUtil;
-import com.google.crypto.tink.TestUtil.BytesMutation;
 import com.google.crypto.tink.proto.HashType;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
+import com.google.crypto.tink.proto.RsaSsaPkcs1KeyFormat;
+import com.google.crypto.tink.proto.RsaSsaPkcs1Params;
+import com.google.crypto.tink.proto.RsaSsaPkcs1PrivateKey;
 import com.google.crypto.tink.proto.RsaSsaPkcs1PublicKey;
-import com.google.crypto.tink.subtle.Hex;
+import com.google.crypto.tink.subtle.Random;
+import com.google.protobuf.ByteString;
 import java.security.GeneralSecurityException;
+import java.security.spec.RSAKeyGenParameterSpec;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -32,97 +39,188 @@
 /** Unit tests for RsaSsaPkcs1VerifyKeyManager. */
 @RunWith(JUnit4.class)
 public final class RsaSsaPkcs1VerifyKeyManagerTest {
+  private final RsaSsaPkcs1SignKeyManager signManager = new RsaSsaPkcs1SignKeyManager();
+  private final RsaSsaPkcs1SignKeyManager.KeyFactory<RsaSsaPkcs1KeyFormat, RsaSsaPkcs1PrivateKey>
+      factory = signManager.keyFactory();
+
+  private final RsaSsaPkcs1VerifyKeyManager verifyManager = new RsaSsaPkcs1VerifyKeyManager();
+
 
   static class NistTestVector {
-    byte[] modulus;
-    byte[] exponent;
     byte[] msg;
     byte[] sig;
-    HashType hashType;
+    RsaSsaPkcs1PublicKey publicKeyProto;
 
     public NistTestVector(
-        String modulus, String exponent, String msg, String sig, HashType hashType) {
-      this.modulus = TestUtil.hexDecode(modulus);
-      this.exponent = TestUtil.hexDecode(exponent);
+        String modulus, String exponent, String msg, String sig, HashType hashType)
+        throws Exception {
+      publicKeyProto = TestUtil.createRsaSsaPkcs1PubKey(TestUtil.hexDecode(modulus),
+          TestUtil.hexDecode(exponent), hashType);
       this.msg = TestUtil.hexDecode(msg);
       this.sig = TestUtil.hexDecode(sig);
-      this.hashType = hashType;
     }
   }
 
   // Test vector from
   // https://csrc.nist.gov/Projects/Cryptographic-Algorithm-Validation-Program/Digital-Signatures
-  final NistTestVector[] nistTestVectors = {
-    new NistTestVector(
-        "c47abacc2a84d56f3614d92fd62ed36ddde459664b9301dcd1d61781cfcc026bcb2399bee7e75681a80b7bf500e2d08ceae1c42ec0b707927f2b2fe92ae852087d25f1d260cc74905ee5f9b254ed05494a9fe06732c3680992dd6f0dc634568d11542a705f83ae96d2a49763d5fbb24398edf3702bc94bc168190166492b8671de874bb9cecb058c6c8344aa8c93754d6effcd44a41ed7de0a9dcd9144437f212b18881d042d331a4618a9e630ef9bb66305e4fdf8f0391b3b2313fe549f0189ff968b92f33c266a4bc2cffc897d1937eeb9e406f5d0eaa7a14782e76af3fce98f54ed237b4a04a4159a5f6250a296a902880204e61d891c4da29f2d65f34cbb",
-        "49d2a1",
-        "95123c8d1b236540b86976a11cea31f8bd4e6c54c235147d20ce722b03a6ad756fbd918c27df8ea9ce3104444c0bbe877305bc02e35535a02a58dcda306e632ad30b3dc3ce0ba97fdf46ec192965dd9cd7f4a71b02b8cba3d442646eeec4af590824ca98d74fbca934d0b6867aa1991f3040b707e806de6e66b5934f05509bea",
-        "51265d96f11ab338762891cb29bf3f1d2b3305107063f5f3245af376dfcc7027d39365de70a31db05e9e10eb6148cb7f6425f0c93c4fb0e2291adbd22c77656afc196858a11e1c670d9eeb592613e69eb4f3aa501730743ac4464486c7ae68fd509e896f63884e9424f69c1c5397959f1e52a368667a598a1fc90125273d9341295d2f8e1cc4969bf228c860e07a3546be2eeda1cde48ee94d062801fe666e4a7ae8cb9cd79262c017b081af874ff00453ca43e34efdb43fffb0bb42a4e2d32a5e5cc9e8546a221fe930250e5f5333e0efe58ffebf19369a3b8ae5a67f6a048bc9ef915bda25160729b508667ada84a0c27e7e26cf2abca413e5e4693f4a9405",
-        HashType.SHA256),
-    new NistTestVector(
-        "9689eb163a617c0abbf01ddc0e6d88c37f8a6b0baec0f6cab8f8a683f372a53d028253a6ba502da462adaf4fd87c8dc2b03b6c07c2b6aacab1d8c8bd043d89f4effe72ea2547c73c6366a2efab9c916945820fb880890bc085564e57ee76f7107a008f71e941e9fd631aec78f82e410ea9c893faa3d553cd1ca628af1087ca1b0c6aef3b66edcee14d1d7dc48293ddd7deed1ccbe487c957585abb9509151038d53f46b068e3e139c7689bf8e8d38669896b8d082e65e458e1f82b8e8ec926e7aa0f97d08526e9636f2c00af4c2bd3d8bffc4bb93cd47b09af18883e11b639d47938d036f7cfeb77db74a2c09a6dee9df98b18eff2fda7d3f4135083bb3b59e2172244ec37bdbdcfe6e199d36dc949cda1cca123fb2be07803d003d76af3d7164453df77d44c7f2599636ca44d0b7a46218326b0c814ed322b9c4279b060f1b9e14b70f55a3751c4343763cdbf9c14637d2210c59fbd037be17ea6706846fdc7b9ab90278c01c458e64442f9256f3ad1cbceb22959d495063aaca1a3959eae03",
-        "fa3751",
-        "6459ea1d443df706907ffdd3ca2f193f93f5a349b50357d26748b767cde6ab5cbfe76b1acb2b9eb97da5c4d2ddc8d18e3a3b1a0326d475c1c2c49ca73c0fd3fc9540cbbba85ac52d6811fabd693a3b09a281d535715ab784df3ad7292606d15a70ccd1a7e2b1b48ad92a6a3f736f9fd5522d9a869c7b654446102e9493b3ed9f",
-        "2b72942573b825cd1f0172119c23440a2b384b7f2a3c5582bb02f764e2b159ea9ad880ca61b3df7ca249134f4bec285083c7ebf984b192808e916af687ef6c6a9a6722a4fa9189fac1521d03853f3dd5a95ff4b9dbdbf3c7077f720650ead01945ab5bfee582ac1643526fbf68efe1bb3b6f7d2b4b01f2155aaea38a2c7ed29add23ee791a703d11e3b1b7c500d9a6b647c1337bf537c071e5bada6faa025bcaf5e5d1196998909c3d64758826939ae7fe1466dc6efc10a2b25e21186c2d135ceace33cdf490b13a0d10c2527e04200aa70bc1d4f3cfb04b5d2bc17aee881d3a788401f45443470bc639232088a9553c8d792aa5707654f075476a66b86368d5a92b4c84a3b4baba1b0b98bdebb85b48b82b8409f2e9c1aa500670329ff3b6e83e25c561110d47b2fe93ea2946a74f9730da9b7d126f8d7c3fa4a51fc30144a827831c186390998d552a1b677afe5afee46e9d4a5774a56355a4d1967677e75d176aef71c3fa061644d7a9582385877de67f87724b0a6e868f3a2eeafb68c53b",
-        HashType.SHA512),
-  };
+  static NistTestVector[] nistTestVectors;
+
+  @BeforeClass
+  public static void setUpNistTestVectors() throws Exception {
+    nistTestVectors =
+        new NistTestVector[] {
+          new NistTestVector(
+              "c47abacc2a84d56f3614d92fd62ed36ddde459664b9301dcd1d61781cfcc026bcb2399bee7e75681a80b7bf500e2d08ceae1c42ec0b707927f2b2fe92ae852087d25f1d260cc74905ee5f9b254ed05494a9fe06732c3680992dd6f0dc634568d11542a705f83ae96d2a49763d5fbb24398edf3702bc94bc168190166492b8671de874bb9cecb058c6c8344aa8c93754d6effcd44a41ed7de0a9dcd9144437f212b18881d042d331a4618a9e630ef9bb66305e4fdf8f0391b3b2313fe549f0189ff968b92f33c266a4bc2cffc897d1937eeb9e406f5d0eaa7a14782e76af3fce98f54ed237b4a04a4159a5f6250a296a902880204e61d891c4da29f2d65f34cbb",
+              "49d2a1",
+              "95123c8d1b236540b86976a11cea31f8bd4e6c54c235147d20ce722b03a6ad756fbd918c27df8ea9ce3104444c0bbe877305bc02e35535a02a58dcda306e632ad30b3dc3ce0ba97fdf46ec192965dd9cd7f4a71b02b8cba3d442646eeec4af590824ca98d74fbca934d0b6867aa1991f3040b707e806de6e66b5934f05509bea",
+              "51265d96f11ab338762891cb29bf3f1d2b3305107063f5f3245af376dfcc7027d39365de70a31db05e9e10eb6148cb7f6425f0c93c4fb0e2291adbd22c77656afc196858a11e1c670d9eeb592613e69eb4f3aa501730743ac4464486c7ae68fd509e896f63884e9424f69c1c5397959f1e52a368667a598a1fc90125273d9341295d2f8e1cc4969bf228c860e07a3546be2eeda1cde48ee94d062801fe666e4a7ae8cb9cd79262c017b081af874ff00453ca43e34efdb43fffb0bb42a4e2d32a5e5cc9e8546a221fe930250e5f5333e0efe58ffebf19369a3b8ae5a67f6a048bc9ef915bda25160729b508667ada84a0c27e7e26cf2abca413e5e4693f4a9405",
+              HashType.SHA256),
+          new NistTestVector(
+              "9689eb163a617c0abbf01ddc0e6d88c37f8a6b0baec0f6cab8f8a683f372a53d028253a6ba502da462adaf4fd87c8dc2b03b6c07c2b6aacab1d8c8bd043d89f4effe72ea2547c73c6366a2efab9c916945820fb880890bc085564e57ee76f7107a008f71e941e9fd631aec78f82e410ea9c893faa3d553cd1ca628af1087ca1b0c6aef3b66edcee14d1d7dc48293ddd7deed1ccbe487c957585abb9509151038d53f46b068e3e139c7689bf8e8d38669896b8d082e65e458e1f82b8e8ec926e7aa0f97d08526e9636f2c00af4c2bd3d8bffc4bb93cd47b09af18883e11b639d47938d036f7cfeb77db74a2c09a6dee9df98b18eff2fda7d3f4135083bb3b59e2172244ec37bdbdcfe6e199d36dc949cda1cca123fb2be07803d003d76af3d7164453df77d44c7f2599636ca44d0b7a46218326b0c814ed322b9c4279b060f1b9e14b70f55a3751c4343763cdbf9c14637d2210c59fbd037be17ea6706846fdc7b9ab90278c01c458e64442f9256f3ad1cbceb22959d495063aaca1a3959eae03",
+              "fa3751",
+              "6459ea1d443df706907ffdd3ca2f193f93f5a349b50357d26748b767cde6ab5cbfe76b1acb2b9eb97da5c4d2ddc8d18e3a3b1a0326d475c1c2c49ca73c0fd3fc9540cbbba85ac52d6811fabd693a3b09a281d535715ab784df3ad7292606d15a70ccd1a7e2b1b48ad92a6a3f736f9fd5522d9a869c7b654446102e9493b3ed9f",
+              "2b72942573b825cd1f0172119c23440a2b384b7f2a3c5582bb02f764e2b159ea9ad880ca61b3df7ca249134f4bec285083c7ebf984b192808e916af687ef6c6a9a6722a4fa9189fac1521d03853f3dd5a95ff4b9dbdbf3c7077f720650ead01945ab5bfee582ac1643526fbf68efe1bb3b6f7d2b4b01f2155aaea38a2c7ed29add23ee791a703d11e3b1b7c500d9a6b647c1337bf537c071e5bada6faa025bcaf5e5d1196998909c3d64758826939ae7fe1466dc6efc10a2b25e21186c2d135ceace33cdf490b13a0d10c2527e04200aa70bc1d4f3cfb04b5d2bc17aee881d3a788401f45443470bc639232088a9553c8d792aa5707654f075476a66b86368d5a92b4c84a3b4baba1b0b98bdebb85b48b82b8409f2e9c1aa500670329ff3b6e83e25c561110d47b2fe93ea2946a74f9730da9b7d126f8d7c3fa4a51fc30144a827831c186390998d552a1b677afe5afee46e9d4a5774a56355a4d1967677e75d176aef71c3fa061644d7a9582385877de67f87724b0a6e868f3a2eeafb68c53b",
+              HashType.SHA512),
+        };
+  }
+
+  @Test
+  public void basics() throws Exception {
+    assertThat(verifyManager.getKeyType())
+        .isEqualTo("type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PublicKey");
+    assertThat(verifyManager.getVersion()).isEqualTo(0);
+    assertThat(verifyManager.keyMaterialType()).isEqualTo(KeyMaterialType.ASYMMETRIC_PUBLIC);
+  }
+
+  @Test
+  public void validateKey_empty_throws() throws Exception {
+    try {
+      verifyManager.validateKey(RsaSsaPkcs1PublicKey.getDefaultInstance());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKey_generated() throws Exception {
+    if (TestUtil.isTsan()) {
+      // factory.createKey is too slow in Tsan.
+      return;
+    }
+
+    RsaSsaPkcs1KeyFormat keyFormat =
+        RsaSsaPkcs1KeyFormat.newBuilder()
+            .setParams(RsaSsaPkcs1Params.newBuilder().setHashType(HashType.SHA256))
+            .setModulusSizeInBits(3072)
+            .setPublicExponent(ByteString.copyFrom(RSAKeyGenParameterSpec.F4.toByteArray()))
+            .build();
+    RsaSsaPkcs1PrivateKey privateKey = factory.createKey(keyFormat);
+    RsaSsaPkcs1PublicKey publicKey = signManager.getPublicKey(privateKey);
+    verifyManager.validateKey(publicKey);
+  }
+
+  @Test
+  public void validateKey_testVector() throws Exception {
+    RsaSsaPkcs1PublicKey publicKey = nistTestVectors[0].publicKeyProto;
+    verifyManager.validateKey(publicKey);
+  }
+
+  @Test
+  public void validateKey_wrongVersion() throws Exception {
+    RsaSsaPkcs1PublicKey publicKey = nistTestVectors[0].publicKeyProto;
+
+    RsaSsaPkcs1PublicKey invalidKey =
+        RsaSsaPkcs1PublicKey.newBuilder(publicKey).setVersion(1).build();
+    try {
+      verifyManager.validateKey(invalidKey);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKey_smallModulus() throws Exception {
+    RsaSsaPkcs1PublicKey publicKey = nistTestVectors[0].publicKeyProto;
+
+    RsaSsaPkcs1PublicKey invalidKey =
+        RsaSsaPkcs1PublicKey.newBuilder(publicKey)
+            .setN(ByteString.copyFrom(TestUtil.hexDecode("23")))
+            .setE(ByteString.copyFrom(TestUtil.hexDecode("03")))
+            .build();
+    try {
+      verifyManager.validateKey(invalidKey);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void createPrimitive() throws Exception {
+    if (TestUtil.isTsan()) {
+      // factory.createKey is too slow in Tsan.
+      return;
+    }
+
+    RsaSsaPkcs1KeyFormat keyFormat =
+        RsaSsaPkcs1KeyFormat.newBuilder()
+            .setParams(RsaSsaPkcs1Params.newBuilder().setHashType(HashType.SHA256))
+            .setModulusSizeInBits(3072)
+            .setPublicExponent(ByteString.copyFrom(RSAKeyGenParameterSpec.F4.toByteArray()))
+            .build();
+    RsaSsaPkcs1PrivateKey privateKey = factory.createKey(keyFormat);
+    RsaSsaPkcs1PublicKey publicKey = signManager.getPublicKey(privateKey);
+
+    PublicKeySign signer = signManager.getPrimitive(privateKey, PublicKeySign.class);
+    PublicKeyVerify verifier = verifyManager.getPrimitive(publicKey, PublicKeyVerify.class);
+
+    byte[] message = Random.randBytes(135);
+    verifier.verify(signer.sign(message), message);
+  }
+
+  @Test
+  public void createPrimitive_anotherKey_throws() throws Exception {
+    if (TestUtil.isTsan()) {
+      // factory.createKey is too slow in Tsan.
+      return;
+    }
+
+    RsaSsaPkcs1KeyFormat keyFormat =
+        RsaSsaPkcs1KeyFormat.newBuilder()
+            .setParams(RsaSsaPkcs1Params.newBuilder().setHashType(HashType.SHA256))
+            .setModulusSizeInBits(3072)
+            .setPublicExponent(ByteString.copyFrom(RSAKeyGenParameterSpec.F4.toByteArray()))
+            .build();
+    RsaSsaPkcs1PrivateKey privateKey = factory.createKey(keyFormat);
+    // Create a different key.
+    RsaSsaPkcs1PublicKey publicKey = signManager.getPublicKey(factory.createKey(keyFormat));
+
+    PublicKeySign signer = signManager.getPrimitive(privateKey, PublicKeySign.class);
+    PublicKeyVerify verifier = verifyManager.getPrimitive(publicKey, PublicKeyVerify.class);
+
+    byte[] message = Random.randBytes(135);
+    byte[] signature = signer.sign(message);
+    try {
+      verifier.verify(signature, message);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
 
   @Test
   public void testNistTestVector() throws Exception {
-    if (TestUtil.isTsan()) {
-      // This test times out when running under thread sanitizer, so we just skip.
-      return;
-    }
     for (NistTestVector t : nistTestVectors) {
-      RsaSsaPkcs1PublicKey pubKey =
-          TestUtil.createRsaSsaPkcs1PubKey(t.modulus, t.exponent, t.hashType);
-      RsaSsaPkcs1VerifyKeyManager keyManager = new RsaSsaPkcs1VerifyKeyManager();
-      PublicKeyVerify verifier = keyManager.getPrimitive(pubKey);
+      PublicKeyVerify verifier =
+          verifyManager.getPrimitive(t.publicKeyProto, PublicKeyVerify.class);
       try {
         verifier.verify(t.sig, t.msg);
       } catch (GeneralSecurityException e) {
         fail("Valid signature, should not throw exception" + e);
       }
-      for (BytesMutation mutation : TestUtil.generateMutations(t.sig)) {
-        try {
-          verifier.verify(mutation.value, t.msg);
-          fail(
-              String.format(
-                  "Invalid signature, should have thrown exception : sig = %s, msg = %s,"
-                      + " description = %s",
-                  Hex.encode(mutation.value), Hex.encode(t.msg), mutation.description));
-        } catch (GeneralSecurityException expected) {
-          // Expected.
-        }
-      }
-    }
-  }
-
-  @Test
-  public void testSmallModulus() throws Exception {
-    try {
-      RsaSsaPkcs1PublicKey pubKey =
-          TestUtil.createRsaSsaPkcs1PubKey(
-              TestUtil.hexDecode("23"), TestUtil.hexDecode("03"), HashType.SHA256);
-      RsaSsaPkcs1VerifyKeyManager keyManager = new RsaSsaPkcs1VerifyKeyManager();
-      keyManager.getPrimitive(pubKey);
-      fail("Invalid modulus, should have thrown exception");
-    } catch (GeneralSecurityException e) {
-      assertExceptionContains(e, "2048-bit");
-    }
-  }
-
-  @Test
-  public void testInvalidHash() throws Exception {
-    NistTestVector t = nistTestVectors[0];
-    try {
-      RsaSsaPkcs1PublicKey pubKey =
-          TestUtil.createRsaSsaPkcs1PubKey(t.modulus, t.exponent, HashType.SHA1);
-      RsaSsaPkcs1VerifyKeyManager keyManager = new RsaSsaPkcs1VerifyKeyManager();
-      keyManager.getPrimitive(pubKey);
-      fail("Invalid hash, should have thrown exception");
-    } catch (GeneralSecurityException e) {
-      assertExceptionContains(e, "SHA1");
     }
   }
 }
+
diff --git a/java/src/test/java/com/google/crypto/tink/signature/RsaSsaPssSignKeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/signature/RsaSsaPssSignKeyManagerTest.java
index 853da66..657ab27 100644
--- a/java/src/test/java/com/google/crypto/tink/signature/RsaSsaPssSignKeyManagerTest.java
+++ b/java/src/test/java/com/google/crypto/tink/signature/RsaSsaPssSignKeyManagerTest.java
@@ -16,25 +16,31 @@
 
 package com.google.crypto.tink.signature;
 
-import static org.junit.Assert.assertArrayEquals;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
-import com.google.crypto.tink.KeysetHandle;
 import com.google.crypto.tink.PublicKeySign;
 import com.google.crypto.tink.PublicKeyVerify;
 import com.google.crypto.tink.TestUtil;
-import com.google.crypto.tink.proto.KeyData;
-import com.google.crypto.tink.proto.KeyTemplate;
+import com.google.crypto.tink.proto.HashType;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import com.google.crypto.tink.proto.RsaSsaPssKeyFormat;
+import com.google.crypto.tink.proto.RsaSsaPssParams;
 import com.google.crypto.tink.proto.RsaSsaPssPrivateKey;
+import com.google.crypto.tink.proto.RsaSsaPssPublicKey;
+import com.google.crypto.tink.subtle.EngineFactory;
 import com.google.crypto.tink.subtle.Random;
+import com.google.crypto.tink.subtle.RsaSsaPssVerifyJce;
 import com.google.protobuf.ByteString;
 import java.math.BigInteger;
 import java.security.GeneralSecurityException;
+import java.security.KeyFactory;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.RSAKeyGenParameterSpec;
+import java.security.spec.RSAPublicKeySpec;
 import java.util.Set;
 import java.util.TreeSet;
-import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -42,14 +48,136 @@
 /** Unit tests for RsaSsaPssSignKeyManager. */
 @RunWith(JUnit4.class)
 public class RsaSsaPssSignKeyManagerTest {
-  @Before
-  public void setUp() throws Exception {
-    SignatureConfig.register();
+  private final RsaSsaPssSignKeyManager manager = new RsaSsaPssSignKeyManager();
+  private final RsaSsaPssSignKeyManager.KeyFactory<RsaSsaPssKeyFormat, RsaSsaPssPrivateKey>
+      factory = manager.keyFactory();
+
+  private static RsaSsaPssKeyFormat createKeyFormat(
+      HashType sigHash,
+      HashType mgf1Hash,
+      int saltLength,
+      int modulusSizeInBits,
+      BigInteger publicExponent) {
+    return RsaSsaPssKeyFormat.newBuilder()
+        .setParams(
+            RsaSsaPssParams.newBuilder()
+                .setSigHash(sigHash)
+                .setMgf1Hash(mgf1Hash)
+                .setSaltLength(saltLength))
+        .setModulusSizeInBits(modulusSizeInBits)
+        .setPublicExponent(ByteString.copyFrom(publicExponent.toByteArray()))
+        .build();
   }
 
-  final byte[] msg = Random.randBytes(20);
+  private static RsaSsaPssKeyFormat validKeyFormat() {
+    return createKeyFormat(HashType.SHA256, HashType.SHA256, 32, 3072, RSAKeyGenParameterSpec.F4);
+  }
+
+  @Test
+  public void basics() throws Exception {
+    assertThat(manager.getKeyType())
+        .isEqualTo("type.googleapis.com/google.crypto.tink.RsaSsaPssPrivateKey");
+    assertThat(manager.getVersion()).isEqualTo(0);
+    assertThat(manager.keyMaterialType()).isEqualTo(KeyMaterialType.ASYMMETRIC_PRIVATE);
+  }
+
+  @Test
+  public void validateKeyFormat_empty() throws Exception {
+    try {
+      factory.validateKeyFormat(RsaSsaPssKeyFormat.getDefaultInstance());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_valid() throws Exception {
+    RsaSsaPssKeyFormat format = validKeyFormat();
+    factory.validateKeyFormat(format);
+  }
+
+  @Test
+  public void validateKeyFormat_Sha512Allowed() throws Exception {
+    RsaSsaPssKeyFormat format =
+        createKeyFormat(HashType.SHA512, HashType.SHA512, 32, 3072, RSAKeyGenParameterSpec.F4);
+    factory.validateKeyFormat(format);
+  }
+
+  @Test
+  public void validateKeyFormat_Sha1Disallowed_throws() throws Exception {
+    RsaSsaPssKeyFormat format =
+        createKeyFormat(HashType.SHA1, HashType.SHA1, 32, 3072, RSAKeyGenParameterSpec.F4);
+    try {
+      factory.validateKeyFormat(format);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_smallModulusDisallowed_throws() throws Exception {
+    RsaSsaPssKeyFormat format =
+        createKeyFormat(HashType.SHA256, HashType.SHA256, 32, 512, RSAKeyGenParameterSpec.F4);
+    try {
+      factory.validateKeyFormat(format);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_hashMismatchDisallowed1_throws() throws Exception {
+    RsaSsaPssKeyFormat format =
+        createKeyFormat(HashType.SHA512, HashType.SHA256, 32, 3072, RSAKeyGenParameterSpec.F4);
+    try {
+      factory.validateKeyFormat(format);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_hashMismatchDisallowed2_throws() throws Exception {
+    RsaSsaPssKeyFormat format =
+        createKeyFormat(HashType.SHA256, HashType.SHA512, 32, 3072, RSAKeyGenParameterSpec.F4);
+    try {
+      factory.validateKeyFormat(format);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_unkownHashDisallowed_throws() throws Exception {
+    RsaSsaPssKeyFormat format =
+        createKeyFormat(
+            HashType.UNKNOWN_HASH, HashType.UNKNOWN_HASH, 32, 3072, RSAKeyGenParameterSpec.F4);
+    try {
+      factory.validateKeyFormat(format);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  private static void checkConsistency(RsaSsaPssPrivateKey privateKey,
+      RsaSsaPssKeyFormat keyFormat) {
+    assertThat(privateKey.getPublicKey().getParams()).isEqualTo(keyFormat.getParams());
+    assertThat(privateKey.getPublicKey().getE()).isEqualTo(keyFormat.getPublicExponent());
+    assertThat(privateKey.getPublicKey().getN().toByteArray().length)
+        .isGreaterThan(keyFormat.getModulusSizeInBits() / 8);
+  }
 
   private void checkKey(RsaSsaPssPrivateKey privateKey) throws Exception {
+    RsaSsaPssPublicKey publicKey = privateKey.getPublicKey();
+    assertThat(privateKey.getVersion()).isEqualTo(0);
+    assertThat(publicKey.getVersion()).isEqualTo(privateKey.getVersion());
+
     BigInteger p = new BigInteger(1, privateKey.getP().toByteArray());
     BigInteger q = new BigInteger(1, privateKey.getQ().toByteArray());
     BigInteger n = new BigInteger(1, privateKey.getPublicKey().getN().toByteArray());
@@ -57,120 +185,97 @@
     BigInteger dp = new BigInteger(1, privateKey.getDp().toByteArray());
     BigInteger dq = new BigInteger(1, privateKey.getDq().toByteArray());
     BigInteger crt = new BigInteger(1, privateKey.getCrt().toByteArray());
+    assertThat(p).isGreaterThan(BigInteger.ONE);
+    assertThat(q).isGreaterThan(BigInteger.ONE);
     assertEquals(n, p.multiply(q));
     assertEquals(dp, d.mod(p.subtract(BigInteger.ONE)));
     assertEquals(dq, d.mod(q.subtract(BigInteger.ONE)));
     assertEquals(crt, q.modInverse(p));
   }
 
-  private void testNewKeyWithVerifier(KeyTemplate keyTemplate) throws Exception {
+  @Test
+  public void createKey_smallKey() throws Exception {
     if (TestUtil.isTsan()) {
-      // This test times out in tsan mode.
+      // factory.createKey is too slow in Tsan.
       return;
     }
-    // Call newKey multiple times and make sure that it generates different keys.
-    int numTests = 3;
-    RsaSsaPssPrivateKey[] privKeys = new RsaSsaPssPrivateKey[numTests];
-    RsaSsaPssSignKeyManager signManager = new RsaSsaPssSignKeyManager();
-    Set<String> keys = new TreeSet<String>();
+    RsaSsaPssKeyFormat format =
+        createKeyFormat(HashType.SHA256, HashType.SHA256, 32, 3072, RSAKeyGenParameterSpec.F4);
+    RsaSsaPssPrivateKey key = factory.createKey(format);
+    checkConsistency(key, format);
+    checkKey(key);
+  }
 
-    privKeys[0] =
-        (RsaSsaPssPrivateKey)
-            signManager.newKey(RsaSsaPssKeyFormat.parseFrom(keyTemplate.getValue()));
-    keys.add(TestUtil.hexEncode(privKeys[0].toByteArray()));
+  @Test
+  public void createKey_largeKey() throws Exception {
+    if (TestUtil.isTsan()) {
+      // factory.createKey is too slow in Tsan.
+      return;
+    }
+    RsaSsaPssKeyFormat format =
+        createKeyFormat(HashType.SHA512, HashType.SHA512, 64, 4096, RSAKeyGenParameterSpec.F4);
+    RsaSsaPssPrivateKey key = factory.createKey(format);
+    checkConsistency(key, format);
+    checkKey(key);
+  }
 
-    privKeys[1] = (RsaSsaPssPrivateKey) signManager.newKey(keyTemplate.getValue());
-    keys.add(TestUtil.hexEncode(privKeys[1].toByteArray()));
-
-    privKeys[2] =
-        RsaSsaPssPrivateKey.parseFrom(signManager.newKeyData(keyTemplate.getValue()).getValue());
-    keys.add(TestUtil.hexEncode(privKeys[2].toByteArray()));
-
-    assertEquals(numTests, keys.size());
-    // Check key.
+  @Test
+  public void createKey_alwaysNewElement() throws Exception {
+    if (TestUtil.isTsan()) {
+      // factory.createKey is too slow in Tsan.
+      return;
+    }
+    RsaSsaPssKeyFormat format =
+        createKeyFormat(HashType.SHA256, HashType.SHA256, 32, 3072, RSAKeyGenParameterSpec.F4);
+    Set<String> keys = new TreeSet<>();
+    // Calls newKey multiple times and make sure that they generate different keys -- takes about a
+    // second per key.
+    int numTests = 5;
     for (int i = 0; i < numTests; i++) {
-      checkKey(privKeys[i]);
+      RsaSsaPssPrivateKey key = factory.createKey(format);
+      keys.add(TestUtil.hexEncode(key.getQ().toByteArray()));
+      keys.add(TestUtil.hexEncode(key.getP().toByteArray()));
     }
-
-    // Test whether signer works correctly with the corresponding verifier.
-    RsaSsaPssVerifyKeyManager verifyManager = new RsaSsaPssVerifyKeyManager();
-    for (int j = 0; j < numTests; j++) {
-      PublicKeySign signer = signManager.getPrimitive(privKeys[j]);
-      byte[] signature = signer.sign(msg);
-      for (int k = 0; k < numTests; k++) {
-        PublicKeyVerify verifier = verifyManager.getPrimitive(privKeys[k].getPublicKey());
-        if (j == k) { // The same key
-          try {
-            verifier.verify(signature, msg);
-          } catch (GeneralSecurityException ex) {
-            throw new AssertionError("Valid signature, should not throw exception", ex);
-          }
-        } else { // Different keys
-          try {
-            verifier.verify(signature, msg);
-            fail("Invalid signature, should have thrown exception");
-          } catch (GeneralSecurityException expected) {
-            // Expected
-          }
-        }
-      }
-    }
+    assertThat(keys).hasSize(2 * numTests);
   }
 
   @Test
-  public void testNewKeyWithVerifier() throws Exception {
-    testNewKeyWithVerifier(SignatureKeyTemplates.RSA_SSA_PSS_3072_SHA256_SHA256_32_F4);
-    testNewKeyWithVerifier(SignatureKeyTemplates.RSA_SSA_PSS_4096_SHA512_SHA512_64_F4);
-  }
-
-  @Test
-  public void testNewKeyWithCorruptedFormat() {
-    ByteString serialized = ByteString.copyFrom(new byte[128]);
-    KeyTemplate keyTemplate =
-        KeyTemplate.newBuilder()
-            .setTypeUrl(RsaSsaPssSignKeyManager.TYPE_URL)
-            .setValue(serialized)
-            .build();
-    RsaSsaPssSignKeyManager keyManager = new RsaSsaPssSignKeyManager();
-    try {
-      keyManager.newKey(serialized);
-      fail("Corrupted format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
-    }
-    try {
-      keyManager.newKeyData(keyTemplate.getValue());
-      fail("Corrupted format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
-    }
-  }
-
-  /** Tests that a public key is extracted properly from a private key. */
-  @Test
-  public void testGetPublicKeyData() throws Exception {
+  public void getPublicKey_correctValues() throws Exception {
     if (TestUtil.isTsan()) {
-      // This test times out in tsan mode.
+      // factory.createKey is too slow in Tsan.
       return;
     }
-    KeysetHandle privateHandle =
-        KeysetHandle.generateNew(SignatureKeyTemplates.RSA_SSA_PSS_4096_SHA512_SHA512_64_F4);
-    KeyData privateKeyData = TestUtil.getKeyset(privateHandle).getKey(0).getKeyData();
-    RsaSsaPssSignKeyManager privateManager = new RsaSsaPssSignKeyManager();
-    KeyData publicKeyData = privateManager.getPublicKeyData(privateKeyData.getValue());
-    assertEquals(RsaSsaPssVerifyKeyManager.TYPE_URL, publicKeyData.getTypeUrl());
-    assertEquals(KeyData.KeyMaterialType.ASYMMETRIC_PUBLIC, publicKeyData.getKeyMaterialType());
-    RsaSsaPssPrivateKey privateKey = RsaSsaPssPrivateKey.parseFrom(privateKeyData.getValue());
-    assertArrayEquals(
-        privateKey.getPublicKey().toByteArray(), publicKeyData.getValue().toByteArray());
-    RsaSsaPssVerifyKeyManager publicManager = new RsaSsaPssVerifyKeyManager();
-    PublicKeySign signer = privateManager.getPrimitive(privateKeyData.getValue());
-    PublicKeyVerify verifier = publicManager.getPrimitive(publicKeyData.getValue());
-    byte[] message = Random.randBytes(20);
-    try {
-      verifier.verify(signer.sign(message), message);
-    } catch (GeneralSecurityException e) {
-      fail("Should not fail: " + e);
+    RsaSsaPssKeyFormat format =
+        createKeyFormat(HashType.SHA512, HashType.SHA512, 64, 4096, RSAKeyGenParameterSpec.F4);
+    RsaSsaPssPrivateKey key = factory.createKey(format);
+    assertThat(manager.getPublicKey(key)).isEqualTo(key.getPublicKey());
+  }
+
+  @Test
+  public void createPrimitive() throws Exception {
+    if (TestUtil.isTsan()) {
+      // factory.createKey is too slow in Tsan.
+      return;
     }
+
+    RsaSsaPssKeyFormat format =
+        createKeyFormat(HashType.SHA512, HashType.SHA512, 64, 4096, RSAKeyGenParameterSpec.F4);
+    RsaSsaPssPrivateKey key = factory.createKey(format);
+    PublicKeySign signer = manager.getPrimitive(key, PublicKeySign.class);
+
+    KeyFactory kf = EngineFactory.KEY_FACTORY.getInstance("RSA");
+    BigInteger modulus = new BigInteger(1, key.getPublicKey().getN().toByteArray());
+    BigInteger exponent = new BigInteger(1, key.getPublicKey().getE().toByteArray());
+    RSAPublicKey publicKey =
+        (RSAPublicKey) kf.generatePublic(new RSAPublicKeySpec(modulus, exponent));
+    RsaSsaPssParams params = key.getPublicKey().getParams();
+    PublicKeyVerify verifier = new RsaSsaPssVerifyJce(
+        publicKey,
+        SigUtil.toHashType(params.getSigHash()),
+        SigUtil.toHashType(params.getMgf1Hash()),
+        params.getSaltLength());
+
+    byte[] message = Random.randBytes(135);
+    verifier.verify(signer.sign(message), message);
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/signature/RsaSsaPssVerifyKeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/signature/RsaSsaPssVerifyKeyManagerTest.java
index 91fa7ae..6d3d268 100644
--- a/java/src/test/java/com/google/crypto/tink/signature/RsaSsaPssVerifyKeyManagerTest.java
+++ b/java/src/test/java/com/google/crypto/tink/signature/RsaSsaPssVerifyKeyManagerTest.java
@@ -15,30 +15,40 @@
 ////////////////////////////////////////////////////////////////////////////////
 package com.google.crypto.tink.signature;
 
-import static com.google.crypto.tink.TestUtil.assertExceptionContains;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
+import com.google.crypto.tink.PublicKeySign;
 import com.google.crypto.tink.PublicKeyVerify;
 import com.google.crypto.tink.TestUtil;
 import com.google.crypto.tink.proto.HashType;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
+import com.google.crypto.tink.proto.RsaSsaPssKeyFormat;
+import com.google.crypto.tink.proto.RsaSsaPssParams;
+import com.google.crypto.tink.proto.RsaSsaPssPrivateKey;
 import com.google.crypto.tink.proto.RsaSsaPssPublicKey;
+import com.google.crypto.tink.subtle.Random;
+import com.google.protobuf.ByteString;
 import java.security.GeneralSecurityException;
+import java.security.spec.RSAKeyGenParameterSpec;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
 /** Unit tests for RsaSsaPssVerifyKeyManager. */
 @RunWith(JUnit4.class)
-public final class RsaSsaPssVerifyKeyManagerTest {
+public class RsaSsaPssVerifyKeyManagerTest {
+  private final RsaSsaPssSignKeyManager signManager = new RsaSsaPssSignKeyManager();
+  private final RsaSsaPssSignKeyManager.KeyFactory<RsaSsaPssKeyFormat, RsaSsaPssPrivateKey>
+      factory = signManager.keyFactory();
+
+  private final RsaSsaPssVerifyKeyManager verifyManager = new RsaSsaPssVerifyKeyManager();
 
   static class NistTestVector {
-    byte[] modulus;
-    byte[] exponent;
     byte[] msg;
     byte[] sig;
-    HashType sigHash;
-    HashType mgf1Hash;
-    int saltLength;
+    RsaSsaPssPublicKey publicKeyProto;
 
     public NistTestVector(
         String modulus,
@@ -47,46 +57,194 @@
         String sig,
         HashType sigHash,
         HashType mgf1Hash,
-        int saltLength) {
-      this.modulus = TestUtil.hexDecode(modulus);
-      this.exponent = TestUtil.hexDecode(exponent);
+        int saltLength)
+        throws Exception {
       this.msg = TestUtil.hexDecode(msg);
       this.sig = TestUtil.hexDecode(sig);
-      this.sigHash = sigHash;
-      this.mgf1Hash = mgf1Hash;
-      this.saltLength = saltLength;
+      this.publicKeyProto =
+          TestUtil.createRsaSsaPssPubKey(
+              TestUtil.hexDecode(modulus),
+              TestUtil.hexDecode(exponent),
+              sigHash,
+              mgf1Hash,
+              saltLength);
     }
   }
 
   // Test vector from
   // https://csrc.nist.gov/Projects/Cryptographic-Algorithm-Validation-Program/Digital-Signatures
-  final NistTestVector[] nistTestVectors = {
-    new NistTestVector(
-        "a47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d81e3aee99468887a15288afbb7acb845b7c522b5c64e678fcd3d22feb84b44272700be527d2b2025a3f83c2383bf6a39cf5b4e48b3cf2f56eef0dfff18555e31037b915248694876f3047814415164f2c660881e694b58c28038a032ad25634aad7b39171dee368e3d59bfb7299e4601d4587e68caaf8db457b75af42fc0cf1ae7caced286d77fac6cedb03ad94f1433d2c94d08e60bc1fdef0543cd2951e765b38230fdd18de5d2ca627ddc032fe05bbd2ff21e2db1c2f94d8b",
-        "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e43f",
-        "e002377affb04f0fe4598de9d92d31d6c786040d5776976556a2cfc55e54a1dcb3cb1b126bd6a4bed2a184990ccea773fcc79d246553e6c64f686d21ad4152673cafec22aeb40f6a084e8a5b4991f4c64cf8a927effd0fd775e71e8329e41fdd4457b3911173187b4f09a817d79ea2397fc12dfe3d9c9a0290c8ead31b6690a6",
-        "4f9b425c2058460e4ab2f5c96384da2327fd29150f01955a76b4efe956af06dc08779a374ee4607eab61a93adc5608f4ec36e47f2a0f754e8ff839a8a19b1db1e884ea4cf348cd455069eb87afd53645b44e28a0a56808f5031da5ba9112768dfbfca44ebe63a0c0572b731d66122fb71609be1480faa4e4f75e43955159d70f081e2a32fbb19a48b9f162cf6b2fb445d2d6994bc58910a26b5943477803cdaaa1bd74b0da0a5d053d8b1dc593091db5388383c26079f344e2aea600d0e324164b450f7b9b465111b7265f3b1b063089ae7e2623fc0fda8052cf4bf3379102fbf71d7c98e8258664ceed637d20f95ff0111881e650ce61f251d9c3a629ef222d",
-        HashType.SHA256,
-        HashType.SHA256,
-        32),
-    new NistTestVector(
-        "99a5c8d094a5f917034667a0408b7ecfcaacc3f9784444e21773c3461ec355f0d0f52a5db0568a71d388696788ef66ae7340c6b28dbf925fe83557986575f79cca69217221397ed5808a26f7e7e714c93235f914d45c4a9af4619b20f511ad644bd3412dfdf0ff717f7aac746f310bfa9a141ac3dbf01c1fc74febd197938419c262293505c35f402f9053ad13c51a5960ecde55ec829e953f941af733e58705913767e7a7200d1d09e7e7e2d269fa29a558bb16304b059f13f4ca560a8101fe3720b4a779ec126427326caa132a3d3611d7dbc50336fac789ec406b397e1e36d7daf9b624bf639c82b859288747690c730c980b2f5a239dd95ad5389a2ec90c5778604713710383ae55d4d28c06d4ac26f0d1231f1d6762c8e0d918118156bc637760daea184746b8dcf6f61db274a7ddceaa074937ababad4549b97ab992494a807208abd789823f5d75c4b994089c8072cfc254e0d8202fd896476e96ad9d309a0e8e7301282f07eb2ae8edefb7dbbe13b96e8b4024c6b84de0a05e150285",
-        "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a649",
-        "cc21593a6a0f737e2970b7c07984b070d761726296a07e24e056e68ff846b29cc1548179843d74dcee86479858b2c16e4cb84f2544b4ecdcb4dd43a04bb7183a768ae44a2712bf9ad47883acc2812f958306890ebea408c92eb4f001ed7dbf55f3a9c8d6d9f61e5fe32eb3253e59c18e863169478cd69b9155c335db66016f96",
-        "0aa572a6845b870b8909a683bb7e6e7616f77beff28746116d8bc4b7335546b51e8006ed0fc9a0d66f63ce0b9ebf792d7efd4305d7624d545400a5fd6a06b78f174b86803f7cd1cc93e3a97286f0ea590e40ff26195aa219fe1510a016785223606d9311a16c59a8fe4a6da6ecd0c1d7775039290c2aaa17ed1eb1b54374f7e572db13cca3a638575f8004aa54a2fa98422fc07e43ad3a20dd93001493442677d883914dc74ec1cbebbbd3d2b6bad4666d91457b69b46a1a61f21298f1a67942ec86c876322dd366ed167814e9c8fc9040c5b4b7a859bbd880cb6bc241b9e327ce779e0783b1cf445e0b2f5771b3f5822a1364391c154dc506fff1fb9d9a35f80199a6b30b4b92b92619a40e21aea19284015863c44866c61ed904a7ad19ee04d966c0aae390636243565581ff20bd6e3cfb6e31f5afba964b311dc2d023a21998c8dd50ca453699190bd467429e2f88ace29c4d1da4da61aac1eda2380230aa8dbb63c75a3c1ec04da3a1f880c9c747acdb74a8395af58f5f044015ccaf6e94",
-        HashType.SHA512,
-        HashType.SHA512,
-        0),
-  };
+  static NistTestVector[] nistTestVectors;
+
+  @BeforeClass
+  public static void setUpNistTestVectors() throws Exception {
+    nistTestVectors =
+        new NistTestVector[] {
+          new NistTestVector(
+              "a47d04e7cacdba4ea26eca8a4c6e14563c2ce03b623b768c0d49868a57121301dbf783d82f4c055e73960e70550187d0af62ac3496f0a3d9103c2eb7919a72752fa7ce8c688d81e3aee99468887a15288afbb7acb845b7c522b5c64e678fcd3d22feb84b44272700be527d2b2025a3f83c2383bf6a39cf5b4e48b3cf2f56eef0dfff18555e31037b915248694876f3047814415164f2c660881e694b58c28038a032ad25634aad7b39171dee368e3d59bfb7299e4601d4587e68caaf8db457b75af42fc0cf1ae7caced286d77fac6cedb03ad94f1433d2c94d08e60bc1fdef0543cd2951e765b38230fdd18de5d2ca627ddc032fe05bbd2ff21e2db1c2f94d8b",
+              "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e43f",
+              "e002377affb04f0fe4598de9d92d31d6c786040d5776976556a2cfc55e54a1dcb3cb1b126bd6a4bed2a184990ccea773fcc79d246553e6c64f686d21ad4152673cafec22aeb40f6a084e8a5b4991f4c64cf8a927effd0fd775e71e8329e41fdd4457b3911173187b4f09a817d79ea2397fc12dfe3d9c9a0290c8ead31b6690a6",
+              "4f9b425c2058460e4ab2f5c96384da2327fd29150f01955a76b4efe956af06dc08779a374ee4607eab61a93adc5608f4ec36e47f2a0f754e8ff839a8a19b1db1e884ea4cf348cd455069eb87afd53645b44e28a0a56808f5031da5ba9112768dfbfca44ebe63a0c0572b731d66122fb71609be1480faa4e4f75e43955159d70f081e2a32fbb19a48b9f162cf6b2fb445d2d6994bc58910a26b5943477803cdaaa1bd74b0da0a5d053d8b1dc593091db5388383c26079f344e2aea600d0e324164b450f7b9b465111b7265f3b1b063089ae7e2623fc0fda8052cf4bf3379102fbf71d7c98e8258664ceed637d20f95ff0111881e650ce61f251d9c3a629ef222d",
+              HashType.SHA256,
+              HashType.SHA256,
+              32),
+          new NistTestVector(
+              "99a5c8d094a5f917034667a0408b7ecfcaacc3f9784444e21773c3461ec355f0d0f52a5db0568a71d388696788ef66ae7340c6b28dbf925fe83557986575f79cca69217221397ed5808a26f7e7e714c93235f914d45c4a9af4619b20f511ad644bd3412dfdf0ff717f7aac746f310bfa9a141ac3dbf01c1fc74febd197938419c262293505c35f402f9053ad13c51a5960ecde55ec829e953f941af733e58705913767e7a7200d1d09e7e7e2d269fa29a558bb16304b059f13f4ca560a8101fe3720b4a779ec126427326caa132a3d3611d7dbc50336fac789ec406b397e1e36d7daf9b624bf639c82b859288747690c730c980b2f5a239dd95ad5389a2ec90c5778604713710383ae55d4d28c06d4ac26f0d1231f1d6762c8e0d918118156bc637760daea184746b8dcf6f61db274a7ddceaa074937ababad4549b97ab992494a807208abd789823f5d75c4b994089c8072cfc254e0d8202fd896476e96ad9d309a0e8e7301282f07eb2ae8edefb7dbbe13b96e8b4024c6b84de0a05e150285",
+              "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a649",
+              "cc21593a6a0f737e2970b7c07984b070d761726296a07e24e056e68ff846b29cc1548179843d74dcee86479858b2c16e4cb84f2544b4ecdcb4dd43a04bb7183a768ae44a2712bf9ad47883acc2812f958306890ebea408c92eb4f001ed7dbf55f3a9c8d6d9f61e5fe32eb3253e59c18e863169478cd69b9155c335db66016f96",
+              "0aa572a6845b870b8909a683bb7e6e7616f77beff28746116d8bc4b7335546b51e8006ed0fc9a0d66f63ce0b9ebf792d7efd4305d7624d545400a5fd6a06b78f174b86803f7cd1cc93e3a97286f0ea590e40ff26195aa219fe1510a016785223606d9311a16c59a8fe4a6da6ecd0c1d7775039290c2aaa17ed1eb1b54374f7e572db13cca3a638575f8004aa54a2fa98422fc07e43ad3a20dd93001493442677d883914dc74ec1cbebbbd3d2b6bad4666d91457b69b46a1a61f21298f1a67942ec86c876322dd366ed167814e9c8fc9040c5b4b7a859bbd880cb6bc241b9e327ce779e0783b1cf445e0b2f5771b3f5822a1364391c154dc506fff1fb9d9a35f80199a6b30b4b92b92619a40e21aea19284015863c44866c61ed904a7ad19ee04d966c0aae390636243565581ff20bd6e3cfb6e31f5afba964b311dc2d023a21998c8dd50ca453699190bd467429e2f88ace29c4d1da4da61aac1eda2380230aa8dbb63c75a3c1ec04da3a1f880c9c747acdb74a8395af58f5f044015ccaf6e94",
+              HashType.SHA512,
+              HashType.SHA512,
+              0),
+        };
+  }
+
+  @Test
+  public void basics() throws Exception {
+    assertThat(verifyManager.getKeyType())
+        .isEqualTo("type.googleapis.com/google.crypto.tink.RsaSsaPssPublicKey");
+    assertThat(verifyManager.getVersion()).isEqualTo(0);
+    assertThat(verifyManager.keyMaterialType()).isEqualTo(KeyMaterialType.ASYMMETRIC_PUBLIC);
+  }
+
+  @Test
+  public void validateKey_empty_throws() throws Exception {
+    try {
+      verifyManager.validateKey(RsaSsaPssPublicKey.getDefaultInstance());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKey_generated() throws Exception {
+    if (TestUtil.isTsan()) {
+      // factory.createKey is too slow in Tsan.
+      return;
+    }
+
+    RsaSsaPssKeyFormat keyFormat =
+        RsaSsaPssKeyFormat.newBuilder()
+            .setParams(
+                RsaSsaPssParams.newBuilder()
+                    .setSigHash(HashType.SHA256)
+                    .setMgf1Hash(HashType.SHA256)
+                    .setSaltLength(32))
+            .setModulusSizeInBits(3072)
+            .setPublicExponent(ByteString.copyFrom(RSAKeyGenParameterSpec.F4.toByteArray()))
+            .build();
+    RsaSsaPssPrivateKey privateKey = factory.createKey(keyFormat);
+    RsaSsaPssPublicKey publicKey = signManager.getPublicKey(privateKey);
+    verifyManager.validateKey(publicKey);
+  }
+
+  @Test
+  public void validateKey_testVector() throws Exception {
+    if (TestUtil.isTsan()) {
+      // factory.createKey is too slow in Tsan.
+      return;
+    }
+    
+    RsaSsaPssPublicKey publicKey = nistTestVectors[0].publicKeyProto;
+    verifyManager.validateKey(publicKey);
+  }
+
+  @Test
+  public void validateKey_wrongVersion() throws Exception {
+    RsaSsaPssPublicKey publicKey = nistTestVectors[0].publicKeyProto;
+
+    RsaSsaPssPublicKey invalidKey = RsaSsaPssPublicKey.newBuilder(publicKey).setVersion(1).build();
+    try {
+      verifyManager.validateKey(invalidKey);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKey_smallModulus() throws Exception {
+    RsaSsaPssPublicKey publicKey = nistTestVectors[0].publicKeyProto;
+
+    RsaSsaPssPublicKey invalidKey =
+        RsaSsaPssPublicKey.newBuilder(publicKey)
+            .setN(ByteString.copyFrom(TestUtil.hexDecode("23")))
+            .setE(ByteString.copyFrom(TestUtil.hexDecode("03")))
+            .build();
+    try {
+      verifyManager.validateKey(invalidKey);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void createPrimitive() throws Exception {
+    if (TestUtil.isTsan()) {
+      // factory.createKey is too slow in Tsan.
+      return;
+    }
+
+    RsaSsaPssKeyFormat keyFormat =
+        RsaSsaPssKeyFormat.newBuilder()
+            .setParams(
+                RsaSsaPssParams.newBuilder()
+                    .setSigHash(HashType.SHA256)
+                    .setMgf1Hash(HashType.SHA256)
+                    .setSaltLength(32))
+            .setModulusSizeInBits(3072)
+            .setPublicExponent(ByteString.copyFrom(RSAKeyGenParameterSpec.F4.toByteArray()))
+            .build();
+    RsaSsaPssPrivateKey privateKey = factory.createKey(keyFormat);
+    RsaSsaPssPublicKey publicKey = signManager.getPublicKey(privateKey);
+
+    PublicKeySign signer = signManager.getPrimitive(privateKey, PublicKeySign.class);
+    PublicKeyVerify verifier = verifyManager.getPrimitive(publicKey, PublicKeyVerify.class);
+
+    byte[] message = Random.randBytes(135);
+    verifier.verify(signer.sign(message), message);
+  }
+
+  @Test
+  public void createPrimitive_anotherKey_throws() throws Exception {
+    if (TestUtil.isTsan()) {
+      // factory.createKey is too slow in Tsan.
+      return;
+    }
+
+    RsaSsaPssKeyFormat keyFormat =
+        RsaSsaPssKeyFormat.newBuilder()
+            .setParams(
+                RsaSsaPssParams.newBuilder()
+                    .setSigHash(HashType.SHA256)
+                    .setMgf1Hash(HashType.SHA256)
+                    .setSaltLength(32))
+            .setModulusSizeInBits(3072)
+            .setPublicExponent(ByteString.copyFrom(RSAKeyGenParameterSpec.F4.toByteArray()))
+            .build();
+    RsaSsaPssPrivateKey privateKey = factory.createKey(keyFormat);
+    // Create a different key.
+    RsaSsaPssPublicKey publicKey = signManager.getPublicKey(factory.createKey(keyFormat));
+
+    PublicKeySign signer = signManager.getPrimitive(privateKey, PublicKeySign.class);
+    PublicKeyVerify verifier = verifyManager.getPrimitive(publicKey, PublicKeyVerify.class);
+
+    byte[] message = Random.randBytes(135);
+    byte[] signature = signer.sign(message);
+    try {
+      verifier.verify(signature, message);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
 
   @Test
   public void testNistTestVector() throws Exception {
     for (NistTestVector t : nistTestVectors) {
-      RsaSsaPssPublicKey pubKey =
-          TestUtil.createRsaSsaPssPubKey(
-              t.modulus, t.exponent, t.sigHash, t.mgf1Hash, t.saltLength);
-      RsaSsaPssVerifyKeyManager keyManager = new RsaSsaPssVerifyKeyManager();
-      PublicKeyVerify verifier = keyManager.getPrimitive(pubKey);
+      PublicKeyVerify verifier =
+          verifyManager.getPrimitive(t.publicKeyProto, PublicKeyVerify.class);
       try {
         verifier.verify(t.sig, t.msg);
       } catch (GeneralSecurityException e) {
@@ -94,36 +252,4 @@
       }
     }
   }
-
-  @Test
-  public void testSmallModulus() throws Exception {
-    try {
-      RsaSsaPssPublicKey pubKey =
-          TestUtil.createRsaSsaPssPubKey(
-              TestUtil.hexDecode("23"),
-              TestUtil.hexDecode("03"),
-              HashType.SHA256,
-              HashType.SHA256,
-              32);
-      RsaSsaPssVerifyKeyManager keyManager = new RsaSsaPssVerifyKeyManager();
-      keyManager.getPrimitive(pubKey);
-      fail("Invalid modulus, should have thrown exception");
-    } catch (GeneralSecurityException e) {
-      assertExceptionContains(e, "2048-bit");
-    }
-  }
-
-  @Test
-  public void testInvalidHash() throws Exception {
-    NistTestVector t = nistTestVectors[0];
-    try {
-      RsaSsaPssPublicKey pubKey =
-          TestUtil.createRsaSsaPssPubKey(t.modulus, t.exponent, HashType.SHA1, HashType.SHA256, 20);
-      RsaSsaPssVerifyKeyManager keyManager = new RsaSsaPssVerifyKeyManager();
-      keyManager.getPrimitive(pubKey);
-      fail("Invalid hash, should have thrown exception");
-    } catch (GeneralSecurityException e) {
-      assertExceptionContains(e, "SHA1");
-    }
-  }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/signature/SigUtilTest.java b/java/src/test/java/com/google/crypto/tink/signature/SigUtilTest.java
index 58291f2..61f3f2c 100644
--- a/java/src/test/java/com/google/crypto/tink/signature/SigUtilTest.java
+++ b/java/src/test/java/com/google/crypto/tink/signature/SigUtilTest.java
@@ -31,8 +31,8 @@
 public final class SigUtilTest {
   @Test
   public void testToHashType() throws Exception {
-    assertEquals(Enums.HashType.SHA1, SigUtil.toHashType(HashType.SHA1));
     assertEquals(Enums.HashType.SHA256, SigUtil.toHashType(HashType.SHA256));
+    assertEquals(Enums.HashType.SHA384, SigUtil.toHashType(HashType.SHA384));
     assertEquals(Enums.HashType.SHA512, SigUtil.toHashType(HashType.SHA512));
     try {
       SigUtil.toHashType(HashType.UNKNOWN_HASH);
diff --git a/java/src/test/java/com/google/crypto/tink/signature/SignatureConfigTest.java b/java/src/test/java/com/google/crypto/tink/signature/SignatureConfigTest.java
index 0d3993f..f253150 100644
--- a/java/src/test/java/com/google/crypto/tink/signature/SignatureConfigTest.java
+++ b/java/src/test/java/com/google/crypto/tink/signature/SignatureConfigTest.java
@@ -17,12 +17,10 @@
 package com.google.crypto.tink.signature;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
+import com.google.crypto.tink.PublicKeySign;
 import com.google.crypto.tink.Registry;
-import com.google.crypto.tink.TestUtil;
-import com.google.crypto.tink.proto.RegistryConfig;
 import java.security.GeneralSecurityException;
 import org.junit.FixMethodOrder;
 import org.junit.Test;
@@ -57,7 +55,7 @@
     }
     String typeUrl = "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey";
     try {
-      Registry.getKeyManager(typeUrl);
+      Registry.getUntypedKeyManager(typeUrl);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
       assertThat(e.toString()).contains("No key manager found");
@@ -66,150 +64,10 @@
     // Initialize the config.
     SignatureConfig.register();
 
-    // Now the catalogues should be present.
-    Registry.getCatalogue("tinkpublickeysign");
-    Registry.getCatalogue("tinkpublickeyverify");
-
     // After registration the key manager should be present.
-    Registry.getKeyManager(typeUrl);
+    Registry.getKeyManager(typeUrl, PublicKeySign.class);
 
     // Running init() manually again should succeed.
     SignatureConfig.register();
   }
-
-  @Test
-  public void testConfigContents() throws Exception {
-    RegistryConfig config = SignatureConfig.TINK_1_0_0;
-    assertEquals(4, config.getEntryCount());
-    assertEquals("TINK_SIGNATURE_1_0_0", config.getConfigName());
-
-    TestUtil.verifyConfigEntry(
-        config.getEntry(0),
-        "TinkPublicKeySign",
-        "PublicKeySign",
-        "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(1),
-        "TinkPublicKeySign",
-        "PublicKeySign",
-        "type.googleapis.com/google.crypto.tink.Ed25519PrivateKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(2),
-        "TinkPublicKeyVerify",
-        "PublicKeyVerify",
-        "type.googleapis.com/google.crypto.tink.EcdsaPublicKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(3),
-        "TinkPublicKeyVerify",
-        "PublicKeyVerify",
-        "type.googleapis.com/google.crypto.tink.Ed25519PublicKey",
-        true,
-        0);
-  }
-
-  @Test
-  public void testConfigContents1_1_0() throws Exception {
-    RegistryConfig config = SignatureConfig.TINK_1_1_0;
-    assertEquals(4, config.getEntryCount());
-    assertEquals("TINK_SIGNATURE_1_1_0", config.getConfigName());
-
-    TestUtil.verifyConfigEntry(
-        config.getEntry(0),
-        "TinkPublicKeySign",
-        "PublicKeySign",
-        "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(1),
-        "TinkPublicKeySign",
-        "PublicKeySign",
-        "type.googleapis.com/google.crypto.tink.Ed25519PrivateKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(2),
-        "TinkPublicKeyVerify",
-        "PublicKeyVerify",
-        "type.googleapis.com/google.crypto.tink.EcdsaPublicKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(3),
-        "TinkPublicKeyVerify",
-        "PublicKeyVerify",
-        "type.googleapis.com/google.crypto.tink.Ed25519PublicKey",
-        true,
-        0);
-  }
-
-  @Test
-  public void testConfigContents_LATEST() throws Exception {
-    RegistryConfig config = SignatureConfig.LATEST;
-    assertEquals(8, config.getEntryCount());
-    assertEquals("TINK_SIGNATURE", config.getConfigName());
-
-    TestUtil.verifyConfigEntry(
-        config.getEntry(0),
-        "TinkPublicKeySign",
-        "PublicKeySign",
-        "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(1),
-        "TinkPublicKeySign",
-        "PublicKeySign",
-        "type.googleapis.com/google.crypto.tink.Ed25519PrivateKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(2),
-        "TinkPublicKeySign",
-        "PublicKeySign",
-        "type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PrivateKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(3),
-        "TinkPublicKeySign",
-        "PublicKeySign",
-        "type.googleapis.com/google.crypto.tink.RsaSsaPssPrivateKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(4),
-        "TinkPublicKeyVerify",
-        "PublicKeyVerify",
-        "type.googleapis.com/google.crypto.tink.EcdsaPublicKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(5),
-        "TinkPublicKeyVerify",
-        "PublicKeyVerify",
-        "type.googleapis.com/google.crypto.tink.Ed25519PublicKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(6),
-        "TinkPublicKeyVerify",
-        "PublicKeyVerify",
-        "type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PublicKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(7),
-        "TinkPublicKeyVerify",
-        "PublicKeyVerify",
-        "type.googleapis.com/google.crypto.tink.RsaSsaPssPublicKey",
-        true,
-        0);
-  }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/signature/SignatureKeyTemplatesTest.java b/java/src/test/java/com/google/crypto/tink/signature/SignatureKeyTemplatesTest.java
index 3fc2750..06b9f1a 100644
--- a/java/src/test/java/com/google/crypto/tink/signature/SignatureKeyTemplatesTest.java
+++ b/java/src/test/java/com/google/crypto/tink/signature/SignatureKeyTemplatesTest.java
@@ -38,7 +38,7 @@
   @Test
   public void testECDSA_P256() throws Exception {
     KeyTemplate template = SignatureKeyTemplates.ECDSA_P256;
-    assertEquals(EcdsaSignKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new EcdsaSignKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     EcdsaKeyFormat format = EcdsaKeyFormat.parseFrom(template.getValue());
 
@@ -51,7 +51,7 @@
   @Test
   public void testECDSA_P256_IEEE_P1363() throws Exception {
     KeyTemplate template = SignatureKeyTemplates.ECDSA_P256_IEEE_P1363;
-    assertEquals(EcdsaSignKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new EcdsaSignKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     EcdsaKeyFormat format = EcdsaKeyFormat.parseFrom(template.getValue());
 
@@ -64,7 +64,7 @@
   @Test
   public void testECDSA_P384() throws Exception {
     KeyTemplate template = SignatureKeyTemplates.ECDSA_P384;
-    assertEquals(EcdsaSignKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new EcdsaSignKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     EcdsaKeyFormat format = EcdsaKeyFormat.parseFrom(template.getValue());
 
@@ -77,7 +77,7 @@
   @Test
   public void testECDSA_P384_IEEE_P1363() throws Exception {
     KeyTemplate template = SignatureKeyTemplates.ECDSA_P384_IEEE_P1363;
-    assertEquals(EcdsaSignKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new EcdsaSignKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     EcdsaKeyFormat format = EcdsaKeyFormat.parseFrom(template.getValue());
 
@@ -90,7 +90,7 @@
   @Test
   public void testECDSA_P521_IEEE_P1363() throws Exception {
     KeyTemplate template = SignatureKeyTemplates.ECDSA_P521_IEEE_P1363;
-    assertEquals(EcdsaSignKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new EcdsaSignKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     EcdsaKeyFormat format = EcdsaKeyFormat.parseFrom(template.getValue());
 
@@ -108,7 +108,7 @@
     EllipticCurveType curve = EllipticCurveType.UNKNOWN_CURVE;
     EcdsaSignatureEncoding encoding = EcdsaSignatureEncoding.IEEE_P1363;
     KeyTemplate template = SignatureKeyTemplates.createEcdsaKeyTemplate(hashType, curve, encoding);
-    assertEquals(EcdsaSignKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new EcdsaSignKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
 
     EcdsaKeyFormat format = EcdsaKeyFormat.parseFrom(template.getValue());
@@ -120,7 +120,7 @@
   @Test
   public void testED25519() throws Exception {
     KeyTemplate template = SignatureKeyTemplates.ED25519;
-    assertEquals(Ed25519PrivateKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new Ed25519PrivateKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     assertTrue(template.getValue().isEmpty()); // Empty format.
   }
@@ -128,7 +128,7 @@
   @Test
   public void testRSA_SSA_PKCS1_3072_SHA256_F4() throws Exception {
     KeyTemplate template = SignatureKeyTemplates.RSA_SSA_PKCS1_3072_SHA256_F4;
-    assertEquals(RsaSsaPkcs1SignKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new RsaSsaPkcs1SignKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     RsaSsaPkcs1KeyFormat format = RsaSsaPkcs1KeyFormat.parseFrom(template.getValue());
 
@@ -142,7 +142,7 @@
   @Test
   public void testRSA_SSA_PKCS1_4096_SHA512_F4() throws Exception {
     KeyTemplate template = SignatureKeyTemplates.RSA_SSA_PKCS1_4096_SHA512_F4;
-    assertEquals(RsaSsaPkcs1SignKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new RsaSsaPkcs1SignKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     RsaSsaPkcs1KeyFormat format = RsaSsaPkcs1KeyFormat.parseFrom(template.getValue());
 
@@ -156,7 +156,7 @@
   @Test
   public void testRSA_SSA_PSS_3072_SHA256_SHA256_32_F4() throws Exception {
     KeyTemplate template = SignatureKeyTemplates.RSA_SSA_PSS_3072_SHA256_SHA256_32_F4;
-    assertEquals(RsaSsaPssSignKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new RsaSsaPssSignKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     RsaSsaPssKeyFormat format = RsaSsaPssKeyFormat.parseFrom(template.getValue());
 
@@ -172,7 +172,7 @@
   @Test
   public void testRSA_SSA_PSS_4096_SHA512_SHA512_64_F4() throws Exception {
     KeyTemplate template = SignatureKeyTemplates.RSA_SSA_PSS_4096_SHA512_SHA512_64_F4;
-    assertEquals(RsaSsaPssSignKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new RsaSsaPssSignKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.TINK, template.getOutputPrefixType());
     RsaSsaPssKeyFormat format = RsaSsaPssKeyFormat.parseFrom(template.getValue());
 
diff --git a/java/src/test/java/com/google/crypto/tink/signature/SignaturePemKeysetReaderTest.java b/java/src/test/java/com/google/crypto/tink/signature/SignaturePemKeysetReaderTest.java
new file mode 100644
index 0000000..2b67e0d
--- /dev/null
+++ b/java/src/test/java/com/google/crypto/tink/signature/SignaturePemKeysetReaderTest.java
@@ -0,0 +1,277 @@
+// Copyright 2017 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.google.crypto.tink.signature;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.crypto.tink.KeysetReader;
+import com.google.crypto.tink.proto.EcdsaPublicKey;
+import com.google.crypto.tink.proto.EcdsaSignatureEncoding;
+import com.google.crypto.tink.proto.EllipticCurveType;
+import com.google.crypto.tink.proto.HashType;
+import com.google.crypto.tink.proto.KeyData;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
+import com.google.crypto.tink.proto.KeyStatusType;
+import com.google.crypto.tink.proto.Keyset;
+import com.google.crypto.tink.proto.OutputPrefixType;
+import com.google.crypto.tink.proto.RsaSsaPssPublicKey;
+import com.google.crypto.tink.subtle.PemKeyType;
+import java.io.BufferedReader;
+import java.io.StringReader;
+import java.security.interfaces.ECPublicKey;
+import java.security.interfaces.RSAPublicKey;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Unit tests for SignaturePemKeysetReader */
+@RunWith(JUnit4.class)
+public final class SignaturePemKeysetReaderTest {
+
+  @Before
+  public void setUp() {}
+
+  @Test
+  public void read_oneRSAPublicKey_shouldWork() throws Exception {
+    String pem =
+        "-----BEGIN PUBLIC KEY-----\n"
+            + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv90Xf/NN1lRGBofJQzJf\n"
+            + "lHvo6GAf25GGQGaMmD9T1ZP71CCbJ69lGIS/6akFBg6ECEHGM2EZ4WFLCdr5byUq\n"
+            + "GCf4mY4WuOn+AcwzwAoDz9ASIFcQOoPclO7JYdfo2SOaumumdb5S/7FkKJ70TGYW\n"
+            + "j9aTOYWsCcaojbjGDY/JEXz3BSRIngcgOvXBmV1JokcJ/LsrJD263WE9iUknZDhB\n"
+            + "K7y4ChjHNqL8yJcw/D8xLNiJtIyuxiZ00p/lOVUInr8C/a2C1UGCgEGuXZAEGAdO\n"
+            + "NVez52n5TLvQP3hRd4MTi7YvfhezRcA4aXyIDOv+TYi4p+OVTYQ+FMbkgoWBm5bq\n"
+            + "wQIDAQAB\n"
+            + "-----END PUBLIC KEY-----\n";
+    KeysetReader keysetReader =
+        SignaturePemKeysetReader.newBuilder().addPem(pem, PemKeyType.RSA_PSS_2048_SHA256).build();
+    Keyset ks = keysetReader.read();
+    Keyset.Key key = ks.getKey(0);
+    KeyData keyData = key.getKeyData();
+    RsaSsaPssPublicKey publicKeyProto = RsaSsaPssPublicKey.parseFrom(keyData.getValue());
+    RSAPublicKey publicKey =
+        (RSAPublicKey)
+            PemKeyType.RSA_PSS_2048_SHA256.readKey(new BufferedReader(new StringReader(pem)));
+
+    assertThat(ks.getKeyCount()).isEqualTo(1);
+    assertThat(ks.getPrimaryKeyId()).isEqualTo(key.getKeyId());
+    assertThat(key.getStatus()).isEqualTo(KeyStatusType.ENABLED);
+    assertThat(key.getOutputPrefixType()).isEqualTo(OutputPrefixType.RAW);
+    assertThat(keyData.getTypeUrl()).isEqualTo(new RsaSsaPssVerifyKeyManager().getKeyType());
+    assertThat(keyData.getKeyMaterialType()).isEqualTo(KeyMaterialType.ASYMMETRIC_PUBLIC);
+    assertThat(publicKeyProto.getParams().getSigHash()).isEqualTo(HashType.SHA256);
+    assertThat(publicKeyProto.getParams().getMgf1Hash()).isEqualTo(HashType.SHA256);
+    assertThat(publicKeyProto.getParams().getSaltLength()).isEqualTo(32);
+    assertThat(publicKeyProto.getN().toByteArray()).isEqualTo(publicKey.getModulus().toByteArray());
+    assertThat(publicKeyProto.getE().toByteArray())
+        .isEqualTo(publicKey.getPublicExponent().toByteArray());
+  }
+
+  @Test
+  public void read_oneECPublicKey_shouldWork() throws Exception {
+    String pem =
+        "-----BEGIN PUBLIC KEY-----\n"
+            + "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE7BiT5K5pivl4Qfrt9hRhRREMUzj/\n"
+            + "8suEJ7GlMxZfvdcpbi/GhYPuJi8Gn2H1NaMJZcLZo5MLPKyyGT5u3u1VBQ==\n"
+            + "-----END PUBLIC KEY-----\n";
+    KeysetReader keysetReader =
+        SignaturePemKeysetReader.newBuilder().addPem(pem, PemKeyType.ECDSA_P256_SHA256).build();
+    Keyset ks = keysetReader.read();
+    Keyset.Key key = ks.getKey(0);
+    KeyData keyData = key.getKeyData();
+    EcdsaPublicKey publicKeyProto = EcdsaPublicKey.parseFrom(keyData.getValue());
+    ECPublicKey publicKey =
+        (ECPublicKey)
+            PemKeyType.ECDSA_P256_SHA256.readKey(new BufferedReader(new StringReader(pem)));
+
+    assertThat(ks.getKeyCount()).isEqualTo(1);
+    assertThat(ks.getPrimaryKeyId()).isEqualTo(key.getKeyId());
+    assertThat(key.getStatus()).isEqualTo(KeyStatusType.ENABLED);
+    assertThat(key.getOutputPrefixType()).isEqualTo(OutputPrefixType.RAW);
+    assertThat(keyData.getTypeUrl()).isEqualTo(new EcdsaVerifyKeyManager().getKeyType());
+    assertThat(keyData.getKeyMaterialType()).isEqualTo(KeyMaterialType.ASYMMETRIC_PUBLIC);
+    assertThat(publicKeyProto.getParams().getHashType()).isEqualTo(HashType.SHA256);
+    assertThat(publicKeyProto.getParams().getCurve()).isEqualTo(EllipticCurveType.NIST_P256);
+    assertThat(publicKeyProto.getParams().getEncoding()).isEqualTo(EcdsaSignatureEncoding.DER);
+    assertThat(publicKeyProto.getX().toByteArray())
+        .isEqualTo(publicKey.getW().getAffineX().toByteArray());
+    assertThat(publicKeyProto.getY().toByteArray())
+        .isEqualTo(publicKey.getW().getAffineY().toByteArray());
+  }
+
+  @Test
+  public void read_onePEM_twoRSAPublicKeys_shouldWork() throws Exception {
+    String pem =
+        "-----BEGIN PUBLIC KEY-----\n"
+            + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv90Xf/NN1lRGBofJQzJf\n"
+            + "lHvo6GAf25GGQGaMmD9T1ZP71CCbJ69lGIS/6akFBg6ECEHGM2EZ4WFLCdr5byUq\n"
+            + "GCf4mY4WuOn+AcwzwAoDz9ASIFcQOoPclO7JYdfo2SOaumumdb5S/7FkKJ70TGYW\n"
+            + "j9aTOYWsCcaojbjGDY/JEXz3BSRIngcgOvXBmV1JokcJ/LsrJD263WE9iUknZDhB\n"
+            + "K7y4ChjHNqL8yJcw/D8xLNiJtIyuxiZ00p/lOVUInr8C/a2C1UGCgEGuXZAEGAdO\n"
+            + "NVez52n5TLvQP3hRd4MTi7YvfhezRcA4aXyIDOv+TYi4p+OVTYQ+FMbkgoWBm5bq\n"
+            + "wQIDAQAB\n"
+            + "-----END PUBLIC KEY-----\n"
+            + "-----BEGIN PUBLIC KEY-----\n"
+            + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkHT+woDZHckRv316VyUw\n"
+            + "WnQ8lR7C1rOj+KPuBnAPMQTW8htNG0gfjYEb01ZRvZM8ezOunDnpBqvYPeATKTGu\n"
+            + "YD7/Tq1gkcFGf59aG2vgi8I/+0OkYNyWwuYLKm34t50TKMvQwiIBr0IZfaGnzF/5\n"
+            + "43wqtE6rvcZTavlR0q3ftJQ6OEFXnOzShRctQf7nIn2Mi2mks3cLoWpqLJe0rSiM\n"
+            + "TYqas+fiLd5K5p55H2woBpoRPBmNEBMd2r+P0caGNRd3XuO2OwOx/2XezZ0Lj9ms\n"
+            + "u7BDXM/No6dxLmrgwzokuRg0N/mF+PUCnNakbT1nyn/1uMopialAMDhYUEtZdFjw\n"
+            + "gwIDAQAB\n"
+            + "-----END PUBLIC KEY-----\n";
+    KeysetReader keysetReader =
+        SignaturePemKeysetReader.newBuilder().addPem(pem, PemKeyType.RSA_PSS_2048_SHA256).build();
+    Keyset ks = keysetReader.read();
+    Keyset.Key firstKey = ks.getKey(0);
+    Keyset.Key secondKey = ks.getKey(1);
+    assertThat(ks.getKeyCount()).isEqualTo(2);
+    assertThat(ks.getPrimaryKeyId()).isEqualTo(firstKey.getKeyId());
+
+    KeyData keyData = firstKey.getKeyData();
+    RsaSsaPssPublicKey publicKeyProto = RsaSsaPssPublicKey.parseFrom(keyData.getValue());
+    RSAPublicKey publicKey =
+        (RSAPublicKey)
+            PemKeyType.RSA_PSS_2048_SHA256.readKey(new BufferedReader(new StringReader(pem)));
+    assertThat(firstKey.getStatus()).isEqualTo(KeyStatusType.ENABLED);
+    assertThat(firstKey.getOutputPrefixType()).isEqualTo(OutputPrefixType.RAW);
+    assertThat(keyData.getTypeUrl()).isEqualTo(new RsaSsaPssVerifyKeyManager().getKeyType());
+    assertThat(keyData.getKeyMaterialType()).isEqualTo(KeyMaterialType.ASYMMETRIC_PUBLIC);
+    assertThat(publicKeyProto.getParams().getSigHash()).isEqualTo(HashType.SHA256);
+    assertThat(publicKeyProto.getParams().getMgf1Hash()).isEqualTo(HashType.SHA256);
+    assertThat(publicKeyProto.getParams().getSaltLength()).isEqualTo(32);
+    assertThat(publicKeyProto.getN().toByteArray()).isEqualTo(publicKey.getModulus().toByteArray());
+    assertThat(publicKeyProto.getE().toByteArray())
+        .isEqualTo(publicKey.getPublicExponent().toByteArray());
+
+    keyData = secondKey.getKeyData();
+    publicKeyProto = RsaSsaPssPublicKey.parseFrom(keyData.getValue());
+    assertThat(secondKey.getStatus()).isEqualTo(KeyStatusType.ENABLED);
+    assertThat(secondKey.getOutputPrefixType()).isEqualTo(OutputPrefixType.RAW);
+    assertThat(keyData.getTypeUrl()).isEqualTo(new RsaSsaPssVerifyKeyManager().getKeyType());
+    assertThat(keyData.getKeyMaterialType()).isEqualTo(KeyMaterialType.ASYMMETRIC_PUBLIC);
+    assertThat(publicKeyProto.getParams().getSigHash()).isEqualTo(HashType.SHA256);
+    assertThat(publicKeyProto.getParams().getMgf1Hash()).isEqualTo(HashType.SHA256);
+    assertThat(publicKeyProto.getParams().getSaltLength()).isEqualTo(32);
+  }
+
+  @Test
+  public void read_onePEM_oneRSAPublicKey_oneECPublicKey_ECPublicKeyShouldBeIgnored()
+      throws Exception {
+    String pem =
+        "-----BEGIN PUBLIC KEY-----\n"
+            + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv90Xf/NN1lRGBofJQzJf\n"
+            + "lHvo6GAf25GGQGaMmD9T1ZP71CCbJ69lGIS/6akFBg6ECEHGM2EZ4WFLCdr5byUq\n"
+            + "GCf4mY4WuOn+AcwzwAoDz9ASIFcQOoPclO7JYdfo2SOaumumdb5S/7FkKJ70TGYW\n"
+            + "j9aTOYWsCcaojbjGDY/JEXz3BSRIngcgOvXBmV1JokcJ/LsrJD263WE9iUknZDhB\n"
+            + "K7y4ChjHNqL8yJcw/D8xLNiJtIyuxiZ00p/lOVUInr8C/a2C1UGCgEGuXZAEGAdO\n"
+            + "NVez52n5TLvQP3hRd4MTi7YvfhezRcA4aXyIDOv+TYi4p+OVTYQ+FMbkgoWBm5bq\n"
+            + "wQIDAQAB\n"
+            + "-----END PUBLIC KEY-----\n"
+            + "-----BEGIN PUBLIC KEY-----\n"
+            + "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE7BiT5K5pivl4Qfrt9hRhRREMUzj/\n"
+            + "8suEJ7GlMxZfvdcpbi/GhYPuJi8Gn2H1NaMJZcLZo5MLPKyyGT5u3u1VBQ==\n"
+            + "-----END PUBLIC KEY-----\n";
+    KeysetReader keysetReader =
+        SignaturePemKeysetReader.newBuilder().addPem(pem, PemKeyType.RSA_PSS_2048_SHA256).build();
+    Keyset ks = keysetReader.read();
+    Keyset.Key key = ks.getKey(0);
+    KeyData keyData = key.getKeyData();
+    RsaSsaPssPublicKey publicKeyProto = RsaSsaPssPublicKey.parseFrom(keyData.getValue());
+    RSAPublicKey publicKey =
+        (RSAPublicKey)
+            PemKeyType.RSA_PSS_2048_SHA256.readKey(new BufferedReader(new StringReader(pem)));
+
+    assertThat(ks.getKeyCount()).isEqualTo(1);
+    assertThat(ks.getPrimaryKeyId()).isEqualTo(key.getKeyId());
+    assertThat(key.getStatus()).isEqualTo(KeyStatusType.ENABLED);
+    assertThat(key.getOutputPrefixType()).isEqualTo(OutputPrefixType.RAW);
+    assertThat(keyData.getTypeUrl()).isEqualTo(new RsaSsaPssVerifyKeyManager().getKeyType());
+    assertThat(keyData.getKeyMaterialType()).isEqualTo(KeyMaterialType.ASYMMETRIC_PUBLIC);
+    assertThat(publicKeyProto.getParams().getSigHash()).isEqualTo(HashType.SHA256);
+    assertThat(publicKeyProto.getParams().getMgf1Hash()).isEqualTo(HashType.SHA256);
+    assertThat(publicKeyProto.getParams().getSaltLength()).isEqualTo(32);
+    assertThat(publicKeyProto.getN().toByteArray()).isEqualTo(publicKey.getModulus().toByteArray());
+    assertThat(publicKeyProto.getE().toByteArray())
+        .isEqualTo(publicKey.getPublicExponent().toByteArray());
+  }
+
+  @Test
+  public void read_twoPEMs_oneRSAPublicKey_oneECPublicKey_shouldWork() throws Exception {
+    String rsaPem =
+        "-----BEGIN PUBLIC KEY-----\n"
+            + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv90Xf/NN1lRGBofJQzJf\n"
+            + "lHvo6GAf25GGQGaMmD9T1ZP71CCbJ69lGIS/6akFBg6ECEHGM2EZ4WFLCdr5byUq\n"
+            + "GCf4mY4WuOn+AcwzwAoDz9ASIFcQOoPclO7JYdfo2SOaumumdb5S/7FkKJ70TGYW\n"
+            + "j9aTOYWsCcaojbjGDY/JEXz3BSRIngcgOvXBmV1JokcJ/LsrJD263WE9iUknZDhB\n"
+            + "K7y4ChjHNqL8yJcw/D8xLNiJtIyuxiZ00p/lOVUInr8C/a2C1UGCgEGuXZAEGAdO\n"
+            + "NVez52n5TLvQP3hRd4MTi7YvfhezRcA4aXyIDOv+TYi4p+OVTYQ+FMbkgoWBm5bq\n"
+            + "wQIDAQAB\n"
+            + "-----END PUBLIC KEY-----\n";
+    String ecPem =
+        "-----BEGIN PUBLIC KEY-----\n"
+            + "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE7BiT5K5pivl4Qfrt9hRhRREMUzj/\n"
+            + "8suEJ7GlMxZfvdcpbi/GhYPuJi8Gn2H1NaMJZcLZo5MLPKyyGT5u3u1VBQ==\n"
+            + "-----END PUBLIC KEY-----\n";
+    KeysetReader keysetReader =
+        SignaturePemKeysetReader.newBuilder()
+            .addPem(rsaPem, PemKeyType.RSA_PSS_2048_SHA256)
+            .addPem(ecPem, PemKeyType.ECDSA_P256_SHA256)
+            .build();
+
+    Keyset ks = keysetReader.read();
+    assertThat(ks.getKeyCount()).isEqualTo(2);
+
+    Keyset.Key firstKey = ks.getKey(0);
+    assertThat(ks.getPrimaryKeyId()).isEqualTo(firstKey.getKeyId());
+    KeyData keyData = firstKey.getKeyData();
+    RsaSsaPssPublicKey rsaPublicKeyProto = RsaSsaPssPublicKey.parseFrom(keyData.getValue());
+    RSAPublicKey rsaPublicKey =
+        (RSAPublicKey)
+            PemKeyType.RSA_PSS_2048_SHA256.readKey(new BufferedReader(new StringReader(rsaPem)));
+    assertThat(firstKey.getStatus()).isEqualTo(KeyStatusType.ENABLED);
+    assertThat(firstKey.getOutputPrefixType()).isEqualTo(OutputPrefixType.RAW);
+    assertThat(keyData.getTypeUrl()).isEqualTo(new RsaSsaPssVerifyKeyManager().getKeyType());
+    assertThat(keyData.getKeyMaterialType()).isEqualTo(KeyMaterialType.ASYMMETRIC_PUBLIC);
+    assertThat(rsaPublicKeyProto.getParams().getSigHash()).isEqualTo(HashType.SHA256);
+    assertThat(rsaPublicKeyProto.getParams().getMgf1Hash()).isEqualTo(HashType.SHA256);
+    assertThat(rsaPublicKeyProto.getParams().getSaltLength()).isEqualTo(32);
+    assertThat(rsaPublicKeyProto.getN().toByteArray())
+        .isEqualTo(rsaPublicKey.getModulus().toByteArray());
+    assertThat(rsaPublicKeyProto.getE().toByteArray())
+        .isEqualTo(rsaPublicKey.getPublicExponent().toByteArray());
+
+    Keyset.Key secondKey = ks.getKey(1);
+    keyData = secondKey.getKeyData();
+    EcdsaPublicKey ecPublicKeyProto = EcdsaPublicKey.parseFrom(keyData.getValue());
+    ECPublicKey ecPublicKey =
+        (ECPublicKey)
+            PemKeyType.ECDSA_P256_SHA256.readKey(new BufferedReader(new StringReader(ecPem)));
+    assertThat(secondKey.getStatus()).isEqualTo(KeyStatusType.ENABLED);
+    assertThat(secondKey.getOutputPrefixType()).isEqualTo(OutputPrefixType.RAW);
+    assertThat(keyData.getTypeUrl()).isEqualTo(new EcdsaVerifyKeyManager().getKeyType());
+    assertThat(keyData.getKeyMaterialType()).isEqualTo(KeyMaterialType.ASYMMETRIC_PUBLIC);
+    assertThat(ecPublicKeyProto.getParams().getHashType()).isEqualTo(HashType.SHA256);
+    assertThat(ecPublicKeyProto.getParams().getCurve()).isEqualTo(EllipticCurveType.NIST_P256);
+    assertThat(ecPublicKeyProto.getParams().getEncoding()).isEqualTo(EcdsaSignatureEncoding.DER);
+    assertThat(ecPublicKeyProto.getX().toByteArray())
+        .isEqualTo(ecPublicKey.getW().getAffineX().toByteArray());
+    assertThat(ecPublicKeyProto.getY().toByteArray())
+        .isEqualTo(ecPublicKey.getW().getAffineY().toByteArray());
+  }
+}
diff --git a/java/src/test/java/com/google/crypto/tink/streamingaead/AesCtrHmacStreamingKeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/streamingaead/AesCtrHmacStreamingKeyManagerTest.java
index bdb8ac5..bf98589 100644
--- a/java/src/test/java/com/google/crypto/tink/streamingaead/AesCtrHmacStreamingKeyManagerTest.java
+++ b/java/src/test/java/com/google/crypto/tink/streamingaead/AesCtrHmacStreamingKeyManagerTest.java
@@ -16,7 +16,7 @@
 
 package com.google.crypto.tink.streamingaead;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
 import com.google.crypto.tink.StreamingAead;
@@ -27,13 +27,10 @@
 import com.google.crypto.tink.proto.AesCtrHmacStreamingParams;
 import com.google.crypto.tink.proto.HashType;
 import com.google.crypto.tink.proto.HmacParams;
-import com.google.crypto.tink.proto.KeyData;
-import com.google.crypto.tink.subtle.Random;
-import com.google.protobuf.ByteString;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import java.security.GeneralSecurityException;
 import java.util.Set;
 import java.util.TreeSet;
-import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -41,54 +38,190 @@
 /** Test for AesCtrHmacStreamingKeyManager. */
 @RunWith(JUnit4.class)
 public class AesCtrHmacStreamingKeyManagerTest {
-  private static final int AES_KEY_SIZE = 16;
-  private HmacParams hmacParams;
-  private AesCtrHmacStreamingParams keyParams;
-  private AesCtrHmacStreamingKeyManager keyManager;
+  private final AesCtrHmacStreamingKeyManager manager = new AesCtrHmacStreamingKeyManager();
+  private final AesCtrHmacStreamingKeyManager.KeyFactory<
+          AesCtrHmacStreamingKeyFormat, AesCtrHmacStreamingKey>
+      factory = manager.keyFactory();
 
-  @Before
-  public void setUp() throws GeneralSecurityException {
-    hmacParams = HmacParams.newBuilder().setHash(HashType.SHA256).setTagSize(16).build();
-    keyParams =
-        AesCtrHmacStreamingParams.newBuilder()
-            .setCiphertextSegmentSize(128)
-            .setDerivedKeySize(AES_KEY_SIZE)
-            .setHkdfHashType(HashType.SHA256)
-            .setHmacParams(hmacParams)
-            .build();
-    keyManager = new AesCtrHmacStreamingKeyManager();
+  // Returns an HmacParams.Builder with valid parameters
+  private static HmacParams.Builder createHmacParams() {
+    return HmacParams.newBuilder().setHash(HashType.SHA256).setTagSize(32);
+  }
+
+  // Returns an AesCtrHmacStreamingParams.Builder with valid parameters
+  private static AesCtrHmacStreamingParams.Builder createParams() {
+    return AesCtrHmacStreamingParams.newBuilder()
+        .setCiphertextSegmentSize(1024)
+        .setDerivedKeySize(32)
+        .setHkdfHashType(HashType.SHA256)
+        .setHmacParams(createHmacParams());
+  }
+
+  // Returns an AesCtrHmacStreamingKeyFormat.Builder with valid parameters
+  private static AesCtrHmacStreamingKeyFormat.Builder createKeyFormat() {
+    return AesCtrHmacStreamingKeyFormat.newBuilder().setKeySize(32).setParams(createParams());
   }
 
   @Test
-  public void testBasic() throws Exception {
-    // Create primitive from a given key.
-    AesCtrHmacStreamingKey key =
-        AesCtrHmacStreamingKey.newBuilder()
-            .setVersion(0)
-            .setKeyValue(ByteString.copyFrom(Random.randBytes(20)))
-            .setParams(keyParams)
-            .build();
-    StreamingAead streamingAead = keyManager.getPrimitive(key);
-    StreamingTestUtil.testEncryptionAndDecryption(streamingAead);
+  public void basics() throws Exception {
+    assertThat(manager.getKeyType())
+        .isEqualTo("type.googleapis.com/google.crypto.tink.AesCtrHmacStreamingKey");
+    assertThat(manager.getVersion()).isEqualTo(0);
+    assertThat(manager.keyMaterialType()).isEqualTo(KeyMaterialType.SYMMETRIC);
+  }
 
-    // Create a key from KeyFormat, and use the key.
-    AesCtrHmacStreamingKeyFormat keyFormat =
-        AesCtrHmacStreamingKeyFormat.newBuilder().setParams(keyParams).setKeySize(16).build();
-    ByteString serializedKeyFormat = ByteString.copyFrom(keyFormat.toByteArray());
-    key = (AesCtrHmacStreamingKey) keyManager.newKey(serializedKeyFormat);
-    streamingAead = keyManager.getPrimitive(key);
-    StreamingTestUtil.testEncryptionAndDecryption(streamingAead);
+  @Test
+  public void validateKeyFormat_empty_throws() throws Exception {
+    try {
+      factory.validateKeyFormat(AesCtrHmacStreamingKeyFormat.getDefaultInstance());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_valid() throws Exception {
+    AesCtrHmacStreamingKeyFormat format = createKeyFormat().build();
+
+    factory.validateKeyFormat(format);
+  }
+
+  @Test
+  public void validateKeyFormat_derivedKeySizes() throws Exception {
+    for (int derivedKeySize = 0; derivedKeySize < 42; ++derivedKeySize) {
+      AesCtrHmacStreamingKeyFormat format =
+          createKeyFormat().setParams(createParams().setDerivedKeySize(derivedKeySize)).build();
+      if (derivedKeySize == 16 || derivedKeySize == 32) {
+        factory.validateKeyFormat(format);
+      } else {
+        try {
+          factory.validateKeyFormat(format);
+          fail();
+        } catch (GeneralSecurityException e) {
+          // expected
+        }
+      }
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_smallKey_throws() throws Exception {
+    // TODO(b/140161847): Also check for key size 16.
+    AesCtrHmacStreamingKeyFormat format = createKeyFormat().setKeySize(15).build();
+    try {
+      factory.validateKeyFormat(format);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_unkownHash_throws() throws Exception {
+    AesCtrHmacStreamingKeyFormat format =
+        createKeyFormat().setParams(createParams().setHkdfHashType(HashType.UNKNOWN_HASH)).build();
+    try {
+      factory.validateKeyFormat(format);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_unkownHmacHash_throws() throws Exception {
+    AesCtrHmacStreamingKeyFormat format =
+        createKeyFormat()
+            .setParams(
+                createParams().setHmacParams(createHmacParams().setHash(HashType.UNKNOWN_HASH)))
+            .build();
+    try {
+      factory.validateKeyFormat(format);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_smallSegment_throws() throws Exception {
+    AesCtrHmacStreamingKeyFormat format =
+        createKeyFormat().setParams(createParams().setCiphertextSegmentSize(45)).build();
+
+    try {
+      factory.validateKeyFormat(format);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_tagSizeTooBigSha1_throws() throws Exception {
+    AesCtrHmacStreamingKeyFormat format =
+        createKeyFormat()
+            .setParams(
+                createParams()
+                    .setHmacParams(createHmacParams().setHash(HashType.SHA1).setTagSize(21)))
+            .build();
+
+    try {
+      factory.validateKeyFormat(format);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_tagSizeTooBigSha256_throws() throws Exception {
+    AesCtrHmacStreamingKeyFormat format =
+        createKeyFormat()
+            .setParams(
+                createParams()
+                    .setHmacParams(createHmacParams().setHash(HashType.SHA256).setTagSize(33)))
+            .build();
+
+    try {
+      factory.validateKeyFormat(format);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_tagSizeTooBigSha512_throws() throws Exception {
+    AesCtrHmacStreamingKeyFormat format =
+        createKeyFormat()
+            .setParams(
+                createParams()
+                    .setHmacParams(createHmacParams().setHash(HashType.SHA512).setTagSize(65)))
+            .build();
+
+    try {
+      factory.validateKeyFormat(format);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void createKey_values() throws Exception {
+    AesCtrHmacStreamingKeyFormat format = createKeyFormat().build();
+    AesCtrHmacStreamingKey key = factory.createKey(format);
+    assertThat(key.getVersion()).isEqualTo(0);
+    assertThat(key.getKeyValue()).hasSize(format.getKeySize());
+    assertThat(key.getParams()).isEqualTo(format.getParams());
   }
 
   @Test
   public void testSkip() throws Exception {
-    AesCtrHmacStreamingKey key =
-        AesCtrHmacStreamingKey.newBuilder()
-            .setVersion(0)
-            .setKeyValue(ByteString.copyFrom(Random.randBytes(20)))
-            .setParams(keyParams)
-            .build();
-    StreamingAead streamingAead = keyManager.getPrimitive(key);
+    AesCtrHmacStreamingKeyFormat format = createKeyFormat().build();
+    AesCtrHmacStreamingKey key = factory.createKey(format);
+    StreamingAead streamingAead = manager.getPrimitive(key, StreamingAead.class);
     int offset = 0;
     int plaintextSize = 1 << 16;
     // Runs the test with different sizes for the chunks to skip.
@@ -98,144 +231,14 @@
   }
 
   @Test
-  public void testNewKeyMultipleTimes() throws Exception {
-    AesCtrHmacStreamingKeyFormat keyFormat =
-        AesCtrHmacStreamingKeyFormat.newBuilder().setParams(keyParams).setKeySize(16).build();
-    ByteString serializedKeyFormat = ByteString.copyFrom(keyFormat.toByteArray());
-    Set<String> keys = new TreeSet<String>();
+  public void createKey_multipleTimes_differentValues() throws Exception {
+    AesCtrHmacStreamingKeyFormat keyFormat = createKeyFormat().build();
+    Set<String> keys = new TreeSet<>();
     // Calls newKey multiple times and make sure that they generate different keys.
-    int numTests = 27;
-    for (int i = 0; i < numTests / 3; i++) {
-      AesCtrHmacStreamingKey key = (AesCtrHmacStreamingKey) keyManager.newKey(keyFormat);
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-      assertEquals(16, key.getKeyValue().toByteArray().length);
-
-      key = (AesCtrHmacStreamingKey) keyManager.newKey(serializedKeyFormat);
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-      assertEquals(16, key.getKeyValue().toByteArray().length);
-
-      KeyData keyData = keyManager.newKeyData(serializedKeyFormat);
-      key = AesCtrHmacStreamingKey.parseFrom(keyData.getValue());
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-      assertEquals(16, key.getKeyValue().toByteArray().length);
+    int numTests = 100;
+    for (int i = 0; i < numTests; i++) {
+      keys.add(TestUtil.hexEncode(factory.createKey(keyFormat).getKeyValue().toByteArray()));
     }
-    assertEquals(numTests, keys.size());
-  }
-
-  private void testNewKeyWithBadFormat(AesCtrHmacStreamingParams badKeyParams) throws Exception {
-    AesCtrHmacStreamingKeyFormat keyFormat =
-        AesCtrHmacStreamingKeyFormat.newBuilder().setParams(badKeyParams).setKeySize(16).build();
-    testNewKeyWithBadFormat(keyFormat);
-  }
-
-  private void testNewKeyWithBadFormat(AesCtrHmacStreamingKeyFormat keyFormat) throws Exception {
-    ByteString serializedKeyFormat = ByteString.copyFrom(keyFormat.toByteArray());
-    try {
-      keyManager.newKey(keyFormat);
-      fail("Bad format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
-    }
-    try {
-      keyManager.newKeyData(serializedKeyFormat);
-      fail("Bad format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
-    }
-  }
-
-  @Test
-  public void testNewKeyWithBadFormat() throws Exception {
-    // key_size too small.
-    AesCtrHmacStreamingKeyFormat keyFormat =
-        AesCtrHmacStreamingKeyFormat.newBuilder().setParams(keyParams).setKeySize(15).build();
-    testNewKeyWithBadFormat(keyFormat);
-
-    // Unknown HKDF HashType.
-    AesCtrHmacStreamingParams badKeyParams =
-        AesCtrHmacStreamingParams.newBuilder()
-            .setCiphertextSegmentSize(128)
-            .setDerivedKeySize(AES_KEY_SIZE)
-            .build();
-    testNewKeyWithBadFormat(badKeyParams);
-
-    // derived_key_size too small.
-    badKeyParams =
-        AesCtrHmacStreamingParams.newBuilder()
-            .setCiphertextSegmentSize(128)
-            .setDerivedKeySize(10)
-            .setHkdfHashType(HashType.SHA256)
-            .build();
-    testNewKeyWithBadFormat(badKeyParams);
-
-    // ciphertext_segment_size too small.
-    badKeyParams =
-        AesCtrHmacStreamingParams.newBuilder()
-            .setCiphertextSegmentSize(15)
-            .setDerivedKeySize(AES_KEY_SIZE)
-            .setHkdfHashType(HashType.SHA256)
-            .build();
-    testNewKeyWithBadFormat(badKeyParams);
-
-    // No HmacParams.
-    badKeyParams =
-        AesCtrHmacStreamingParams.newBuilder()
-            .setCiphertextSegmentSize(130)
-            .setDerivedKeySize(AES_KEY_SIZE)
-            .setHkdfHashType(HashType.SHA256)
-            .build();
-    testNewKeyWithBadFormat(badKeyParams);
-
-    // Unknown HmacParams.hash.
-    badKeyParams =
-        AesCtrHmacStreamingParams.newBuilder()
-            .setCiphertextSegmentSize(130)
-            .setDerivedKeySize(AES_KEY_SIZE)
-            .setHkdfHashType(HashType.SHA256)
-            .setHmacParams(HmacParams.newBuilder().build())
-            .build();
-    testNewKeyWithBadFormat(badKeyParams);
-
-    // tag size too small.
-    badKeyParams =
-        AesCtrHmacStreamingParams.newBuilder()
-            .setCiphertextSegmentSize(130)
-            .setDerivedKeySize(AES_KEY_SIZE)
-            .setHkdfHashType(HashType.SHA256)
-            .setHmacParams(
-                HmacParams.newBuilder()
-                    .setHash(HashType.SHA256)
-                    .setTagSize(9)
-                    .build())
-            .build();
-    testNewKeyWithBadFormat(badKeyParams);
-
-    // tag size too big.
-    badKeyParams =
-        AesCtrHmacStreamingParams.newBuilder()
-            .setCiphertextSegmentSize(130)
-            .setDerivedKeySize(AES_KEY_SIZE)
-            .setHkdfHashType(HashType.SHA256)
-            .setHmacParams(
-                HmacParams.newBuilder()
-                    .setHash(HashType.SHA256)
-                    .setTagSize(33)
-                    .build())
-            .build();
-    testNewKeyWithBadFormat(badKeyParams);
-
-    // All params good.
-    AesCtrHmacStreamingParams goodKeyParams =
-        AesCtrHmacStreamingParams.newBuilder()
-            .setCiphertextSegmentSize(130)
-            .setDerivedKeySize(AES_KEY_SIZE)
-            .setHkdfHashType(HashType.SHA256)
-            .setHmacParams(hmacParams)
-            .build();
-    keyFormat =
-        AesCtrHmacStreamingKeyFormat.newBuilder().setParams(goodKeyParams).setKeySize(16).build();
-    ByteString serializedKeyFormat = ByteString.copyFrom(keyFormat.toByteArray());
-    AesCtrHmacStreamingKey unusedKey = (AesCtrHmacStreamingKey) keyManager.newKey(keyFormat);
-    unusedKey = (AesCtrHmacStreamingKey) keyManager.newKey(serializedKeyFormat);
+    assertThat(keys).hasSize(numTests);
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/streamingaead/AesGcmHkdfStreamingKeyManagerTest.java b/java/src/test/java/com/google/crypto/tink/streamingaead/AesGcmHkdfStreamingKeyManagerTest.java
index 915ff97..1d73fa8 100644
--- a/java/src/test/java/com/google/crypto/tink/streamingaead/AesGcmHkdfStreamingKeyManagerTest.java
+++ b/java/src/test/java/com/google/crypto/tink/streamingaead/AesGcmHkdfStreamingKeyManagerTest.java
@@ -16,7 +16,7 @@
 
 package com.google.crypto.tink.streamingaead;
 
-import static org.junit.Assert.assertEquals;
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
 
 import com.google.crypto.tink.StreamingAead;
@@ -26,13 +26,10 @@
 import com.google.crypto.tink.proto.AesGcmHkdfStreamingKeyFormat;
 import com.google.crypto.tink.proto.AesGcmHkdfStreamingParams;
 import com.google.crypto.tink.proto.HashType;
-import com.google.crypto.tink.proto.KeyData;
-import com.google.crypto.tink.subtle.Random;
-import com.google.protobuf.ByteString;
+import com.google.crypto.tink.proto.KeyData.KeyMaterialType;
 import java.security.GeneralSecurityException;
 import java.util.Set;
 import java.util.TreeSet;
-import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -40,51 +37,92 @@
 /** Test for AesGcmHkdfStreamingKeyManager. */
 @RunWith(JUnit4.class)
 public class AesGcmHkdfStreamingKeyManagerTest {
-  private static final int AES_KEY_SIZE = 16;
-  private AesGcmHkdfStreamingParams keyParams;
-  private AesGcmHkdfStreamingKeyManager keyManager;
+  private final AesGcmHkdfStreamingKeyManager manager = new AesGcmHkdfStreamingKeyManager();
+  private final AesGcmHkdfStreamingKeyManager.KeyFactory<
+          AesGcmHkdfStreamingKeyFormat, AesGcmHkdfStreamingKey>
+      factory = manager.keyFactory();
 
-  @Before
-  public void setUp() throws GeneralSecurityException {
-    keyParams =
-        AesGcmHkdfStreamingParams.newBuilder()
-            .setCiphertextSegmentSize(128)
-            .setDerivedKeySize(AES_KEY_SIZE)
-            .setHkdfHashType(HashType.SHA256)
-            .build();
-    keyManager = new AesGcmHkdfStreamingKeyManager();
+  private static AesGcmHkdfStreamingKeyFormat createKeyFormat(
+      int keySize, int derivedKeySize, HashType hashType, int segmentSize) {
+    return AesGcmHkdfStreamingKeyFormat.newBuilder()
+        .setKeySize(keySize)
+        .setParams(
+            AesGcmHkdfStreamingParams.newBuilder()
+                .setDerivedKeySize(derivedKeySize)
+                .setHkdfHashType(hashType)
+                .setCiphertextSegmentSize(segmentSize))
+        .build();
   }
 
   @Test
-  public void testBasic() throws Exception {
-    // Create primitive from a given key.
-    AesGcmHkdfStreamingKey key =
-        AesGcmHkdfStreamingKey.newBuilder()
-            .setVersion(0)
-            .setKeyValue(ByteString.copyFrom(Random.randBytes(20)))
-            .setParams(keyParams)
-            .build();
-    StreamingAead streamingAead = keyManager.getPrimitive(key);
-    StreamingTestUtil.testEncryptionAndDecryption(streamingAead);
+  public void basics() throws Exception {
+    assertThat(manager.getKeyType())
+        .isEqualTo("type.googleapis.com/google.crypto.tink.AesGcmHkdfStreamingKey");
+    assertThat(manager.getVersion()).isEqualTo(0);
+    assertThat(manager.keyMaterialType()).isEqualTo(KeyMaterialType.SYMMETRIC);
+  }
 
-    // Create a key from KeyFormat, and use the key.
-    AesGcmHkdfStreamingKeyFormat keyFormat =
-        AesGcmHkdfStreamingKeyFormat.newBuilder().setParams(keyParams).setKeySize(16).build();
-    ByteString serializedKeyFormat = ByteString.copyFrom(keyFormat.toByteArray());
-    key = (AesGcmHkdfStreamingKey) keyManager.newKey(serializedKeyFormat);
-    streamingAead = keyManager.getPrimitive(key);
-    StreamingTestUtil.testEncryptionAndDecryption(streamingAead);
+  @Test
+  public void validateKeyFormat_empty_throws() throws Exception {
+    try {
+      factory.validateKeyFormat(AesGcmHkdfStreamingKeyFormat.getDefaultInstance());
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_valid() throws Exception {
+    factory.validateKeyFormat(createKeyFormat(32, 32, HashType.SHA256, 1024));
+  }
+
+  @Test
+  public void validateKeyFormat_unkownHash_throws() throws Exception {
+    try {
+      factory.validateKeyFormat(createKeyFormat(32, 32, HashType.UNKNOWN_HASH, 1024));
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_smallKey_throws() throws Exception {
+    try {
+      // TODO(b/140161847): Also check (16,32,SHA256,1024)
+      factory.validateKeyFormat(createKeyFormat(15, 32, HashType.SHA256, 1024));
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void validateKeyFormat_smallSegment_throws() throws Exception {
+    try {
+      factory.validateKeyFormat(createKeyFormat(16, 32, HashType.SHA256, 45));
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void createKey_checkValues() throws Exception {
+    AesGcmHkdfStreamingKeyFormat format = createKeyFormat(32, 32, HashType.SHA256, 1024);
+
+    AesGcmHkdfStreamingKey key = factory.createKey(format);
+
+    assertThat(key.getParams()).isEqualTo(format.getParams());
+    assertThat(key.getVersion()).isEqualTo(0);
+    assertThat(key.getKeyValue()).hasSize(format.getKeySize());
   }
 
   @Test
   public void testSkip() throws Exception {
-    AesGcmHkdfStreamingKey key =
-        AesGcmHkdfStreamingKey.newBuilder()
-            .setVersion(0)
-            .setKeyValue(ByteString.copyFrom(Random.randBytes(20)))
-            .setParams(keyParams)
-            .build();
-    StreamingAead streamingAead = keyManager.getPrimitive(key);
+    AesGcmHkdfStreamingKey key = factory.createKey(createKeyFormat(32, 32, HashType.SHA256, 1024));
+    StreamingAead streamingAead = manager.getPrimitive(key, StreamingAead.class);
     int offset = 0;
     int plaintextSize = 1 << 16;
     // Runs the test with different sizes for the chunks to skip.
@@ -95,127 +133,13 @@
 
   @Test
   public void testNewKeyMultipleTimes() throws Exception {
-    AesGcmHkdfStreamingKeyFormat keyFormat =
-        AesGcmHkdfStreamingKeyFormat.newBuilder().setParams(keyParams).setKeySize(16).build();
-    ByteString serializedKeyFormat = ByteString.copyFrom(keyFormat.toByteArray());
-    Set<String> keys = new TreeSet<String>();
+    AesGcmHkdfStreamingKeyFormat keyFormat = createKeyFormat(32, 32, HashType.SHA256, 1024);
+    Set<String> keys = new TreeSet<>();
     // Calls newKey multiple times and make sure that they generate different keys.
-    int numTests = 27;
-    for (int i = 0; i < numTests / 3; i++) {
-      AesGcmHkdfStreamingKey key = (AesGcmHkdfStreamingKey) keyManager.newKey(keyFormat);
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-      assertEquals(16, key.getKeyValue().toByteArray().length);
-
-      key = (AesGcmHkdfStreamingKey) keyManager.newKey(serializedKeyFormat);
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-      assertEquals(16, key.getKeyValue().toByteArray().length);
-
-      KeyData keyData = keyManager.newKeyData(serializedKeyFormat);
-      key = AesGcmHkdfStreamingKey.parseFrom(keyData.getValue());
-      keys.add(TestUtil.hexEncode(key.getKeyValue().toByteArray()));
-      assertEquals(16, key.getKeyValue().toByteArray().length);
+    int numTests = 100;
+    for (int i = 0; i < numTests; i++) {
+      keys.add(TestUtil.hexEncode(factory.createKey(keyFormat).getKeyValue().toByteArray()));
     }
-    assertEquals(numTests, keys.size());
-  }
-
-  @Test
-  public void testNewKeyWithBadFormat() throws Exception {
-    // key_size too small.
-    AesGcmHkdfStreamingKeyFormat keyFormat =
-        AesGcmHkdfStreamingKeyFormat.newBuilder().setParams(keyParams).setKeySize(15).build();
-    ByteString serializedKeyFormat = ByteString.copyFrom(keyFormat.toByteArray());
-    try {
-      keyManager.newKey(keyFormat);
-      fail("Bad format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
-    }
-    try {
-      keyManager.newKeyData(serializedKeyFormat);
-      fail("Bad format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
-    }
-
-    // Unknown HKDF HashType.
-    AesGcmHkdfStreamingParams badKeyParams =
-        AesGcmHkdfStreamingParams.newBuilder()
-            .setCiphertextSegmentSize(128)
-            .setDerivedKeySize(AES_KEY_SIZE)
-            .build();
-    keyFormat =
-        AesGcmHkdfStreamingKeyFormat.newBuilder().setParams(badKeyParams).setKeySize(16).build();
-    serializedKeyFormat = ByteString.copyFrom(keyFormat.toByteArray());
-    try {
-      keyManager.newKey(keyFormat);
-      fail("Bad format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
-    }
-    try {
-      keyManager.newKeyData(serializedKeyFormat);
-      fail("Bad format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
-    }
-
-    // derived_key_size too small.
-    badKeyParams =
-        AesGcmHkdfStreamingParams.newBuilder()
-            .setCiphertextSegmentSize(128)
-            .setDerivedKeySize(10)
-            .setHkdfHashType(HashType.SHA256)
-            .build();
-    keyFormat =
-        AesGcmHkdfStreamingKeyFormat.newBuilder().setParams(badKeyParams).setKeySize(16).build();
-    serializedKeyFormat = ByteString.copyFrom(keyFormat.toByteArray());
-    try {
-      keyManager.newKey(keyFormat);
-      fail("Bad format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
-    }
-    try {
-      keyManager.newKeyData(serializedKeyFormat);
-      fail("Bad format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
-    }
-
-    // ciphertext_segment_size too small.
-    badKeyParams =
-        AesGcmHkdfStreamingParams.newBuilder()
-            .setCiphertextSegmentSize(15)
-            .setDerivedKeySize(AES_KEY_SIZE)
-            .setHkdfHashType(HashType.SHA256)
-            .build();
-    keyFormat =
-        AesGcmHkdfStreamingKeyFormat.newBuilder().setParams(badKeyParams).setKeySize(16).build();
-    serializedKeyFormat = ByteString.copyFrom(keyFormat.toByteArray());
-    try {
-      keyManager.newKey(keyFormat);
-      fail("Bad format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
-    }
-    try {
-      keyManager.newKeyData(serializedKeyFormat);
-      fail("Bad format, should have thrown exception");
-    } catch (GeneralSecurityException expected) {
-      // Expected
-    }
-
-    // All params good.
-    AesGcmHkdfStreamingParams goodKeyParams =
-        AesGcmHkdfStreamingParams.newBuilder()
-            .setCiphertextSegmentSize(130)
-            .setDerivedKeySize(AES_KEY_SIZE)
-            .setHkdfHashType(HashType.SHA256)
-            .build();
-    keyFormat =
-        AesGcmHkdfStreamingKeyFormat.newBuilder().setParams(goodKeyParams).setKeySize(16).build();
-    serializedKeyFormat = ByteString.copyFrom(keyFormat.toByteArray());
-    AesGcmHkdfStreamingKey unusedKey = (AesGcmHkdfStreamingKey) keyManager.newKey(keyFormat);
-    unusedKey = (AesGcmHkdfStreamingKey) keyManager.newKey(serializedKeyFormat);
+    assertThat(keys).hasSize(numTests);
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/streamingaead/StreamingAeadCatalogueTest.java b/java/src/test/java/com/google/crypto/tink/streamingaead/StreamingAeadCatalogueTest.java
deleted file mode 100644
index a9bc373..0000000
--- a/java/src/test/java/com/google/crypto/tink/streamingaead/StreamingAeadCatalogueTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2017 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-
-package com.google.crypto.tink.streamingaead;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import com.google.crypto.tink.KeyManager;
-import com.google.crypto.tink.StreamingAead;
-import com.google.crypto.tink.proto.KeyTypeEntry;
-import com.google.crypto.tink.proto.RegistryConfig;
-import java.security.GeneralSecurityException;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for StreamingAeadCatalogue.
- */
-@RunWith(JUnit4.class)
-public class StreamingAeadCatalogueTest {
-
-  @Test
-  public void testBasic() throws Exception {
-    StreamingAeadCatalogue catalogue = new StreamingAeadCatalogue();
-
-    // Check a single key type, incl. case-insensitve primitive name.
-    String keyType = "type.googleapis.com/google.crypto.tink.AesGcmHkdfStreamingKey";
-    {
-      KeyManager<StreamingAead> manager = catalogue.getKeyManager(keyType, "StreamingAead", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-    {
-      KeyManager<StreamingAead> manager = catalogue.getKeyManager(keyType, "STReaMIngAeAD", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-    {
-      KeyManager<StreamingAead> manager = catalogue.getKeyManager(keyType, "STREAMINgaEAD", 0);
-      assertThat(manager.doesSupport(keyType)).isTrue();
-    }
-
-    // Check all entries from the current StreamingAeadConfig.
-    RegistryConfig config = StreamingAeadConfig.TINK_1_1_0;
-    int count = 0;
-    for (KeyTypeEntry entry : config.getEntryList()) {
-      if ("StreamingAead".equals(entry.getPrimitiveName())) {
-        count = count + 1;
-        KeyManager<StreamingAead> manager = catalogue.getKeyManager(
-            entry.getTypeUrl(), "streamingaead", entry.getKeyManagerVersion());
-        assertThat(manager.doesSupport(entry.getTypeUrl())).isTrue();
-      }
-    }
-    assertEquals(2, count);
-  }
-
-  @Test
-  public void testErrors() throws Exception {
-    StreamingAeadCatalogue catalogue = new StreamingAeadCatalogue();
-    String keyType = "type.googleapis.com/google.crypto.tink.AesGcmHkdfStreamingKey";
-
-    // Wrong primitive name.
-    try {
-      catalogue.getKeyManager(keyType, "aead", 0);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No support for primitive");
-    }
-
-    // Wrong key manager version.
-    try {
-      catalogue.getKeyManager(keyType, "StreamingAead", 1);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No key manager");
-      assertThat(e.toString()).contains("version at least");
-    }
-
-    // Wrong key type.
-    try {
-      catalogue.getKeyManager("some.unknown.key.type", "streamingAead", 0);
-      fail("Expected GeneralSecurityException");
-    } catch (GeneralSecurityException e) {
-      assertThat(e.toString()).contains("No support for primitive");
-      assertThat(e.toString()).contains("with key type");
-    }
-  }
-}
diff --git a/java/src/test/java/com/google/crypto/tink/streamingaead/StreamingAeadConfigTest.java b/java/src/test/java/com/google/crypto/tink/streamingaead/StreamingAeadConfigTest.java
index eea87a2..59119d5 100644
--- a/java/src/test/java/com/google/crypto/tink/streamingaead/StreamingAeadConfigTest.java
+++ b/java/src/test/java/com/google/crypto/tink/streamingaead/StreamingAeadConfigTest.java
@@ -17,12 +17,10 @@
 package com.google.crypto.tink.streamingaead;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 import com.google.crypto.tink.Registry;
-import com.google.crypto.tink.TestUtil;
-import com.google.crypto.tink.proto.RegistryConfig;
+import com.google.crypto.tink.StreamingAead;
 import java.security.GeneralSecurityException;
 import org.junit.FixMethodOrder;
 import org.junit.Test;
@@ -57,7 +55,7 @@
     }
     String typeUrl = "type.googleapis.com/google.crypto.tink.AesCtrHmacStreamingKey";
     try {
-      Registry.getKeyManager(typeUrl);
+      Registry.getUntypedKeyManager(typeUrl);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
       assertThat(e.toString()).contains("No key manager found");
@@ -66,57 +64,10 @@
     // Initialize the config.
     StreamingAeadConfig.register();
 
-    // Now the catalogues should be present.
-    Registry.getCatalogue("TinkStreamingAead");
-
     // After registration the key manager should be present.
-    Registry.getKeyManager(typeUrl);
+    Registry.getKeyManager(typeUrl, StreamingAead.class);
 
     // Running init() manually again should succeed.
     StreamingAeadConfig.register();
   }
-
-  @Test
-  public void testConfigContents_1_1_0() throws Exception {
-    RegistryConfig config = StreamingAeadConfig.TINK_1_1_0;
-    assertEquals(2, config.getEntryCount());
-    assertEquals("TINK_STREAMINGAEAD_1_1_0", config.getConfigName());
-
-    TestUtil.verifyConfigEntry(
-        config.getEntry(0),
-        "TinkStreamingAead",
-        "StreamingAead",
-        "type.googleapis.com/google.crypto.tink.AesCtrHmacStreamingKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(1),
-        "TinkStreamingAead",
-        "StreamingAead",
-        "type.googleapis.com/google.crypto.tink.AesGcmHkdfStreamingKey",
-        true,
-        0);
-  }
-
-  @Test
-  public void testConfigContents_LATEST() throws Exception {
-    RegistryConfig config = StreamingAeadConfig.LATEST;
-    assertEquals(2, config.getEntryCount());
-    assertEquals("TINK_STREAMINGAEAD", config.getConfigName());
-
-    TestUtil.verifyConfigEntry(
-        config.getEntry(0),
-        "TinkStreamingAead",
-        "StreamingAead",
-        "type.googleapis.com/google.crypto.tink.AesCtrHmacStreamingKey",
-        true,
-        0);
-    TestUtil.verifyConfigEntry(
-        config.getEntry(1),
-        "TinkStreamingAead",
-        "StreamingAead",
-        "type.googleapis.com/google.crypto.tink.AesGcmHkdfStreamingKey",
-        true,
-        0);
-  }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/streamingaead/StreamingAeadFactoryTest.java b/java/src/test/java/com/google/crypto/tink/streamingaead/StreamingAeadFactoryTest.java
index 658e0c6..792774f 100644
--- a/java/src/test/java/com/google/crypto/tink/streamingaead/StreamingAeadFactoryTest.java
+++ b/java/src/test/java/com/google/crypto/tink/streamingaead/StreamingAeadFactoryTest.java
@@ -163,8 +163,7 @@
       StreamingAeadFactory.getPrimitive(keysetHandle);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertExceptionContains(
-          e, "not match requested primitive type com.google.crypto.tink.StreamingAead");
+      assertExceptionContains(e, "com.google.crypto.tink.StreamingAead not supported");
     }
 
     // invalid as the primary key.
@@ -173,8 +172,7 @@
       StreamingAeadFactory.getPrimitive(keysetHandle);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      assertExceptionContains(
-          e, "not match requested primitive type com.google.crypto.tink.StreamingAead");
+      assertExceptionContains(e, "com.google.crypto.tink.StreamingAead not supported");
     }
   }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/streamingaead/StreamingAeadKeyTemplatesTest.java b/java/src/test/java/com/google/crypto/tink/streamingaead/StreamingAeadKeyTemplatesTest.java
index 08344ee..0200daf 100644
--- a/java/src/test/java/com/google/crypto/tink/streamingaead/StreamingAeadKeyTemplatesTest.java
+++ b/java/src/test/java/com/google/crypto/tink/streamingaead/StreamingAeadKeyTemplatesTest.java
@@ -33,7 +33,7 @@
   @Test
   public void testAES128_CTR_HMAC_SHA256_4KB() throws Exception {
     KeyTemplate template = StreamingAeadKeyTemplates.AES128_CTR_HMAC_SHA256_4KB;
-    assertEquals(AesCtrHmacStreamingKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new AesCtrHmacStreamingKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.RAW, template.getOutputPrefixType());
     AesCtrHmacStreamingKeyFormat format = AesCtrHmacStreamingKeyFormat.parseFrom(
         template.getValue());
@@ -49,7 +49,7 @@
   @Test
   public void testAES256_CTR_HMAC_SHA256_4KB() throws Exception {
     KeyTemplate template = StreamingAeadKeyTemplates.AES256_CTR_HMAC_SHA256_4KB;
-    assertEquals(AesCtrHmacStreamingKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new AesCtrHmacStreamingKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.RAW, template.getOutputPrefixType());
     AesCtrHmacStreamingKeyFormat format = AesCtrHmacStreamingKeyFormat.parseFrom(
         template.getValue());
@@ -65,7 +65,7 @@
   @Test
   public void testAES128_GCM_HKDF_4KB() throws Exception {
     KeyTemplate template = StreamingAeadKeyTemplates.AES128_GCM_HKDF_4KB;
-    assertEquals(AesGcmHkdfStreamingKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new AesGcmHkdfStreamingKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.RAW, template.getOutputPrefixType());
     AesGcmHkdfStreamingKeyFormat format = AesGcmHkdfStreamingKeyFormat.parseFrom(
         template.getValue());
@@ -79,7 +79,7 @@
   @Test
   public void testAES256_GCM_HKDF_4KB() throws Exception {
     KeyTemplate template = StreamingAeadKeyTemplates.AES256_GCM_HKDF_4KB;
-    assertEquals(AesGcmHkdfStreamingKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new AesGcmHkdfStreamingKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.RAW, template.getOutputPrefixType());
     AesGcmHkdfStreamingKeyFormat format = AesGcmHkdfStreamingKeyFormat.parseFrom(
         template.getValue());
@@ -103,7 +103,7 @@
     KeyTemplate template = StreamingAeadKeyTemplates.createAesCtrHmacStreamingKeyTemplate(
         mainKeySize, hkdfHashType, derivedKeySize,
         macHashType, tagSize, ciphertextSegmentSize);
-    assertEquals(AesCtrHmacStreamingKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new AesCtrHmacStreamingKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.RAW, template.getOutputPrefixType());
     AesCtrHmacStreamingKeyFormat format = AesCtrHmacStreamingKeyFormat.parseFrom(
         template.getValue());
@@ -126,7 +126,7 @@
     HashType hkdfHashType = HashType.SHA512;
     KeyTemplate template = StreamingAeadKeyTemplates.createAesGcmHkdfStreamingKeyTemplate(
         mainKeySize, hkdfHashType, derivedKeySize, ciphertextSegmentSize);
-    assertEquals(AesGcmHkdfStreamingKeyManager.TYPE_URL, template.getTypeUrl());
+    assertEquals(new AesGcmHkdfStreamingKeyManager().getKeyType(), template.getTypeUrl());
     assertEquals(OutputPrefixType.RAW, template.getOutputPrefixType());
     AesGcmHkdfStreamingKeyFormat format = AesGcmHkdfStreamingKeyFormat.parseFrom(
         template.getValue());
diff --git a/java/src/test/java/com/google/crypto/tink/streamingaead/StreamingAeadWrapperTest.java b/java/src/test/java/com/google/crypto/tink/streamingaead/StreamingAeadWrapperTest.java
index 7fd657f..4ed6a3e 100644
--- a/java/src/test/java/com/google/crypto/tink/streamingaead/StreamingAeadWrapperTest.java
+++ b/java/src/test/java/com/google/crypto/tink/streamingaead/StreamingAeadWrapperTest.java
@@ -62,7 +62,7 @@
                     KeyStatusType.ENABLED,
                     OutputPrefixType.RAW)));
     StreamingAead streamingAead =
-        new StreamingAeadWrapper().wrap(Registry.getPrimitives(keysetHandle));
+        new StreamingAeadWrapper().wrap(Registry.getPrimitives(keysetHandle, StreamingAead.class));
     StreamingTestUtil.testEncryptionAndDecryption(streamingAead);
   }
 
@@ -81,7 +81,7 @@
                     KeyStatusType.ENABLED,
                     OutputPrefixType.RAW)));
     StreamingAead streamingAead =
-        new StreamingAeadWrapper().wrap(Registry.getPrimitives(keysetHandle));
+        new StreamingAeadWrapper().wrap(Registry.getPrimitives(keysetHandle, StreamingAead.class));
     StreamingTestUtil.testEncryptionAndDecryption(streamingAead);
   }
 
@@ -116,23 +116,26 @@
     KeysetHandle keysetHandle =
         TestUtil.createKeysetHandle(TestUtil.createKeyset(primaryKey, otherKey, anotherKey));
     StreamingAead streamingAead =
-        new StreamingAeadWrapper().wrap(Registry.getPrimitives(keysetHandle));
+        new StreamingAeadWrapper().wrap(Registry.getPrimitives(keysetHandle, StreamingAead.class));
 
     StreamingAead primaryAead =
         new StreamingAeadWrapper()
             .wrap(
                 Registry.getPrimitives(
-                    TestUtil.createKeysetHandle(TestUtil.createKeyset(primaryKey))));
+                    TestUtil.createKeysetHandle(TestUtil.createKeyset(primaryKey)),
+                    StreamingAead.class));
     StreamingAead otherAead =
         new StreamingAeadWrapper()
             .wrap(
                 Registry.getPrimitives(
-                    TestUtil.createKeysetHandle(TestUtil.createKeyset(otherKey))));
+                    TestUtil.createKeysetHandle(TestUtil.createKeyset(otherKey)),
+                    StreamingAead.class));
     StreamingAead anotherAead =
         new StreamingAeadWrapper()
             .wrap(
                 Registry.getPrimitives(
-                    TestUtil.createKeysetHandle(TestUtil.createKeyset(anotherKey))));
+                    TestUtil.createKeysetHandle(TestUtil.createKeyset(anotherKey)),
+                    StreamingAead.class));
 
     StreamingTestUtil.testEncryptionAndDecryption(streamingAead, streamingAead);
     StreamingTestUtil.testEncryptionAndDecryption(streamingAead, primaryAead);
diff --git a/java/src/test/java/com/google/crypto/tink/subtle/EcdsaSignJceTest.java b/java/src/test/java/com/google/crypto/tink/subtle/EcdsaSignJceTest.java
index d7089f3..215b6f6 100644
--- a/java/src/test/java/com/google/crypto/tink/subtle/EcdsaSignJceTest.java
+++ b/java/src/test/java/com/google/crypto/tink/subtle/EcdsaSignJceTest.java
@@ -75,7 +75,7 @@
       fail("Unsafe hash, should have thrown exception.");
     } catch (GeneralSecurityException e) {
       // Expected.
-      TestUtil.assertExceptionContains(e, "SHA1 is not safe");
+      TestUtil.assertExceptionContains(e, "Unsupported hash: SHA1");
     }
   }
 
diff --git a/java/src/test/java/com/google/crypto/tink/subtle/EcdsaVerifyJceTest.java b/java/src/test/java/com/google/crypto/tink/subtle/EcdsaVerifyJceTest.java
index 87d781e..ac3df5d 100644
--- a/java/src/test/java/com/google/crypto/tink/subtle/EcdsaVerifyJceTest.java
+++ b/java/src/test/java/com/google/crypto/tink/subtle/EcdsaVerifyJceTest.java
@@ -51,8 +51,6 @@
         "../wycheproof/testvectors/ecdsa_secp384r1_sha512_test.json", EcdsaEncoding.DER);
     testWycheproofVectors(
         "../wycheproof/testvectors/ecdsa_secp521r1_sha512_test.json", EcdsaEncoding.DER);
-    testWycheproofVectors(
-        "../wycheproof/testvectors/ecdsa_webcrypto_test.json", EcdsaEncoding.IEEE_P1363);
   }
 
   private static void testWycheproofVectors(String fileName, EcdsaEncoding encoding)
@@ -137,7 +135,7 @@
       fail("Unsafe hash, should have thrown exception.");
     } catch (GeneralSecurityException e) {
       // Expected.
-      TestUtil.assertExceptionContains(e, "SHA1 is not safe");
+      TestUtil.assertExceptionContains(e, "Unsupported hash: SHA1");
     }
   }
 
diff --git a/java/src/test/java/com/google/crypto/tink/subtle/Ed25519Test.java b/java/src/test/java/com/google/crypto/tink/subtle/Ed25519Test.java
index b8d83b6..e8f7393 100644
--- a/java/src/test/java/com/google/crypto/tink/subtle/Ed25519Test.java
+++ b/java/src/test/java/com/google/crypto/tink/subtle/Ed25519Test.java
@@ -55,4 +55,11 @@
       assertArrayEquals(originalPublicKey, publicKey);
     }
   }
+
+  /** Test for https://github.com/google/tink/issues/224. */
+  @Test
+  public void testScalarMultWithBase() throws Exception {
+    byte[] scalar = Hex.decode("521784c403e6fb32d48e0da85969a82f5952856bde4471a42b3fa56fd8b96c0d");
+    Ed25519.scalarMultWithBaseToBytes(scalar);
+  }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/subtle/MacJceTest.java b/java/src/test/java/com/google/crypto/tink/subtle/MacJceTest.java
index 970056c..724e25e 100644
--- a/java/src/test/java/com/google/crypto/tink/subtle/MacJceTest.java
+++ b/java/src/test/java/com/google/crypto/tink/subtle/MacJceTest.java
@@ -185,6 +185,16 @@
   }
 
   @Test
+  public void testThrowExceptionIfKeySizeIsTooSmall() throws Exception {
+    try {
+      new MacJce("HMACSHA1", new SecretKeySpec(Random.randBytes(15), "HMAC"), 16);
+      fail("Expected InvalidAlgorithmParameterException");
+    } catch (InvalidAlgorithmParameterException ex) {
+      // expected.
+    }
+  }
+
+  @Test
   public void testThrowExceptionIfTagSizeIsTooSmall() throws Exception {
     testThrowExceptionIfTagSizeIsTooSmall("HMACSHA1");
     testThrowExceptionIfTagSizeIsTooSmall("HMACSHA256");
diff --git a/java/src/test/java/com/google/crypto/tink/subtle/PemKeyTypeTest.java b/java/src/test/java/com/google/crypto/tink/subtle/PemKeyTypeTest.java
new file mode 100644
index 0000000..264fa15
--- /dev/null
+++ b/java/src/test/java/com/google/crypto/tink/subtle/PemKeyTypeTest.java
@@ -0,0 +1,214 @@
+// Copyright 2017 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.google.crypto.tink.subtle;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import java.io.BufferedReader;
+import java.io.StringReader;
+import java.security.Key;
+import java.security.interfaces.ECPrivateKey;
+import java.security.interfaces.ECPublicKey;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.interfaces.RSAPublicKey;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Tests for PemKeyType */
+@RunWith(JUnit4.class)
+public final class PemKeyTypeTest {
+  @Before
+  public void setUp() {}
+
+  @Test
+  public void readKey_RsaPublicKey_shouldWork() throws Exception {
+    String pem =
+        "-----BEGIN PUBLIC KEY-----\n"
+            + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv90Xf/NN1lRGBofJQzJf\n"
+            + "lHvo6GAf25GGQGaMmD9T1ZP71CCbJ69lGIS/6akFBg6ECEHGM2EZ4WFLCdr5byUq\n"
+            + "GCf4mY4WuOn+AcwzwAoDz9ASIFcQOoPclO7JYdfo2SOaumumdb5S/7FkKJ70TGYW\n"
+            + "j9aTOYWsCcaojbjGDY/JEXz3BSRIngcgOvXBmV1JokcJ/LsrJD263WE9iUknZDhB\n"
+            + "K7y4ChjHNqL8yJcw/D8xLNiJtIyuxiZ00p/lOVUInr8C/a2C1UGCgEGuXZAEGAdO\n"
+            + "NVez52n5TLvQP3hRd4MTi7YvfhezRcA4aXyIDOv+TYi4p+OVTYQ+FMbkgoWBm5bq\n"
+            + "wQIDAQAB\n"
+            + "-----END PUBLIC KEY-----\n";
+    BufferedReader reader = new BufferedReader(new StringReader(pem));
+    Key key = PemKeyType.RSA_PSS_2048_SHA256.readKey(reader);
+    assertThat(key).isNotNull();
+    assertThat(key).isInstanceOf(RSAPublicKey.class);
+    RSAPublicKey rsa = (RSAPublicKey) key;
+    assertThat(rsa.getModulus()).isNotNull();
+    assertThat(rsa.getPublicExponent()).isNotNull();
+  }
+
+  @Test
+  public void readKey_RsaPrivateKey_shouldWork() throws Exception {
+    String pem =
+        "-----BEGIN PRIVATE KEY-----\n"
+            + "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC8Bn6pA4wksGPK\n"
+            + "xhRrJnk0mcyKk5hSCFlrlwCs1OUaWAQTMWzFrMW0mdR4FCG6mw2K91rla2F51af8\n"
+            + "IJjy/E02ampBZrFfIlTbHLPOXdSrgL2L1a213zS2AsMZ1NAEKZwG5eJDf9Ym4oTC\n"
+            + "nut50YILgwtwYHLvov0ciJjR6q85+59UznZx6itVEqQpDT7Fi7QWOaGb5mMLHCcF\n"
+            + "m5oyUFvrxvQrMB+fss8rYkwbZZhwK76u04tf2ZQdZh/2rcpl/7JR0fMUvO0IYfow\n"
+            + "7GduISnlrLoDpst1lPk8YM75sq7uRe3Gqt0x+EHuHzf9Y8z/POu7AYo9Yxs9SYp5\n"
+            + "NIcEu0GfAgMBAAECggEAcYsagcX6o01BdfoX6nzZRMJ7mlN28FLKbQZLChOmJjpw\n"
+            + "e4alQNoMqfsbK0g89gscKoclBNXLj19OihrFQjbKCcpJUCVLhz+cLpUun7hZ7RdZ\n"
+            + "X1AyDloz4pXYa4jv9ROLfT7lXA2erOytbzm4yV+TQJBqH/qebcfnQYvbfShTmJcp\n"
+            + "fH2lNYhn5g3+jHb79aakwGTg9q8b88lkDL7gB66jvoEBe3JtCItplXuET5UfrDI/\n"
+            + "8+ef1n2vMqPc6GIyCrD0p4JV90D3OBOWq41V+AwbOKFJ8kGKJ0d5W0SxQJL6F9IV\n"
+            + "rg4zx4mXRxq5cWKLiXd2qAu97n7d9g7KbOy6UPMigQKBgQDj8VJGeEn0wth/WmUG\n"
+            + "RTh4t1R5lrFAZ5ZuM2OZ4r5qjC6o8GUlHwXovc3kcz1whFI0MvOq1rdZkO+tvtvO\n"
+            + "kcsJfOK4Xfoi/TyhKoYZjXbTEAlTE1HwckaTfNex2B02dfiv11nRJ57bEwbhL3V7\n"
+            + "rzaOJl+0KXdbG00W2Ip7AJ8AxwKBgQDTK1fz0p90HDPM+V2YuTtO/VavD5vJj5CJ\n"
+            + "2HYezM9l4Lp/7r+++PzjuzikpflhTUeijxNyOFGKtH8KEpEtyVGx1UBjK8VwM4sX\n"
+            + "7k+GZ2e3upisagV/GisnEB7lhOnoLUqD8x7xTRHx2RBdw44wUqUGmC/zZ552DHrR\n"
+            + "hvNhKEyQaQKBgQDFNr+WlPB3wjUKSq1pdW5ck1GVOVn2fSlcAz5DoDhbexnLtOHt\n"
+            + "8h9stPt0kngv52wwGX1U7B0KcynLy3vmB6IBfXmzRivrJerVDjOj3A9YoWFP7UFR\n"
+            + "pa2GYddE2dS8j+kwSkQ9f+gjZxzmq+cbsgajinP3LoFD5CUYhRWbQnhPdQKBgDZw\n"
+            + "IxFhR+gH6Ta7Rmy7u9VmK/WfYXr5vro6imDwTbsmzw1yAA58Y71Vo4mWnA6AfKok\n"
+            + "lk/IwwSt+V4gYTrbfmsI3btzKkf9kasOrYOpnqxXt0ojXt1gYqWEW2Kx/Bb1rhMM\n"
+            + "Fvr/8lNVsQlrA3njpFVp4FqwaMJn/zWKw61VVT+ZAoGAOkcDDz6GihRX8CkK5ejh\n"
+            + "qV/vI/m42Qsg2OddE4yUvAHpki1gEmqK9scULrsyztCGtSzx+l3TibzmG/bGbsTJ\n"
+            + "1HzQiotarX2fSCAgA8wZvc4F0eQbVo5gxDrsRKIwMSgr1GrEfqd93yuKMDp4TifH\n"
+            + "P54N1bX5PnvnE2HC22dRMNQ=\n"
+            + "-----END PRIVATE KEY-----\n";
+    BufferedReader reader = new BufferedReader(new StringReader(pem));
+    Key key = PemKeyType.RSA_PSS_2048_SHA256.readKey(reader);
+    assertThat(key).isNotNull();
+    assertThat(key).isInstanceOf(RSAPrivateKey.class);
+    RSAPrivateKey rsa = (RSAPrivateKey) key;
+    assertThat(rsa.getModulus()).isNotNull();
+    assertThat(rsa.getPrivateExponent()).isNotNull();
+  }
+
+  @Test
+  public void readKey_EcPublicKey_shouldWork() throws Exception {
+    String pem =
+        "-----BEGIN PUBLIC KEY-----\n"
+            + "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE7BiT5K5pivl4Qfrt9hRhRREMUzj/\n"
+            + "8suEJ7GlMxZfvdcpbi/GhYPuJi8Gn2H1NaMJZcLZo5MLPKyyGT5u3u1VBQ==\n"
+            + "-----END PUBLIC KEY-----\n";
+    BufferedReader reader = new BufferedReader(new StringReader(pem));
+    Key key = PemKeyType.ECDSA_P256_SHA256.readKey(reader);
+    assertThat(key).isNotNull();
+    assertThat(key).isInstanceOf(ECPublicKey.class);
+  }
+
+  @Test
+  public void readKey_EcPrivateKey_shouldWork() throws Exception {
+    String pem =
+        "-----BEGIN PRIVATE KEY-----\n"
+            + "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQghpeIjMYdV40aVFTt\n"
+            + "u8kJPLduSnj6HBamgrrZwAhKLrahRANCAAThRzShRQmj7MChwiZWH6k6PpksS5HM\n"
+            + "8xP2XD/CiUeWCLR8g30Zh9K7NvufcfZxyJ3I6NTilbGcEM5/VgqAt8z3\n"
+            + "-----END PRIVATE KEY-----\n";
+    BufferedReader reader = new BufferedReader(new StringReader(pem));
+    Key key = PemKeyType.ECDSA_P256_SHA256.readKey(reader);
+    assertThat(key).isNotNull();
+    assertThat(key).isInstanceOf(ECPrivateKey.class);
+  }
+
+  @Test
+  public void readKey_withCommentHeader_shouldWork() throws Exception {
+    String pem =
+        "-----BEGIN PUBLIC KEY-----\n"
+            + "Version: 1.0.0\n"
+            + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv90Xf/NN1lRGBofJQzJf\n"
+            + "lHvo6GAf25GGQGaMmD9T1ZP71CCbJ69lGIS/6akFBg6ECEHGM2EZ4WFLCdr5byUq\n"
+            + "GCf4mY4WuOn+AcwzwAoDz9ASIFcQOoPclO7JYdfo2SOaumumdb5S/7FkKJ70TGYW\n"
+            + "j9aTOYWsCcaojbjGDY/JEXz3BSRIngcgOvXBmV1JokcJ/LsrJD263WE9iUknZDhB\n"
+            + "K7y4ChjHNqL8yJcw/D8xLNiJtIyuxiZ00p/lOVUInr8C/a2C1UGCgEGuXZAEGAdO\n"
+            + "NVez52n5TLvQP3hRd4MTi7YvfhezRcA4aXyIDOv+TYi4p+OVTYQ+FMbkgoWBm5bq\n"
+            + "wQIDAQAB\n"
+            + "-----END PUBLIC KEY-----\n";
+    BufferedReader reader = new BufferedReader(new StringReader(pem));
+    Key key = PemKeyType.RSA_PSS_2048_SHA256.readKey(reader);
+    assertThat(key).isNotNull();
+    assertThat(key).isInstanceOf(RSAPublicKey.class);
+    RSAPublicKey rsa = (RSAPublicKey) key;
+    assertThat(rsa.getModulus()).isNotNull();
+    assertThat(rsa.getPublicExponent()).isNotNull();
+  }
+
+  @Test
+  public void readKey_withCommentHeaderOutsideMarkers_shouldWork() throws Exception {
+    String pem =
+        "-----BEGIN PUBLIC KEY-----\n"
+            + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv90Xf/NN1lRGBofJQzJf\n"
+            + "lHvo6GAf25GGQGaMmD9T1ZP71CCbJ69lGIS/6akFBg6ECEHGM2EZ4WFLCdr5byUq\n"
+            + "GCf4mY4WuOn+AcwzwAoDz9ASIFcQOoPclO7JYdfo2SOaumumdb5S/7FkKJ70TGYW\n"
+            + "j9aTOYWsCcaojbjGDY/JEXz3BSRIngcgOvXBmV1JokcJ/LsrJD263WE9iUknZDhB\n"
+            + "K7y4ChjHNqL8yJcw/D8xLNiJtIyuxiZ00p/lOVUInr8C/a2C1UGCgEGuXZAEGAdO\n"
+            + "NVez52n5TLvQP3hRd4MTi7YvfhezRcA4aXyIDOv+TYi4p+OVTYQ+FMbkgoWBm5bq\n"
+            + "wQIDAQAB\n"
+            + "-----END PUBLIC KEY-----\n"
+            + "Version: 1.0.0\n";
+    BufferedReader reader = new BufferedReader(new StringReader(pem));
+    Key key = PemKeyType.RSA_PSS_2048_SHA256.readKey(reader);
+    assertThat(key).isNotNull();
+    assertThat(key).isInstanceOf(RSAPublicKey.class);
+    RSAPublicKey rsa = (RSAPublicKey) key;
+    assertThat(rsa.getModulus()).isNotNull();
+    assertThat(rsa.getPublicExponent()).isNotNull();
+  }
+
+  @Test
+  public void readKey_withBEGIN_RSA_PUBLIC_KEY_shouldWork() throws Exception {
+    String pem =
+        "-----BEGIN RSA PUBLIC KEY-----\n"
+            + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv90Xf/NN1lRGBofJQzJf\n"
+            + "lHvo6GAf25GGQGaMmD9T1ZP71CCbJ69lGIS/6akFBg6ECEHGM2EZ4WFLCdr5byUq\n"
+            + "GCf4mY4WuOn+AcwzwAoDz9ASIFcQOoPclO7JYdfo2SOaumumdb5S/7FkKJ70TGYW\n"
+            + "j9aTOYWsCcaojbjGDY/JEXz3BSRIngcgOvXBmV1JokcJ/LsrJD263WE9iUknZDhB\n"
+            + "K7y4ChjHNqL8yJcw/D8xLNiJtIyuxiZ00p/lOVUInr8C/a2C1UGCgEGuXZAEGAdO\n"
+            + "NVez52n5TLvQP3hRd4MTi7YvfhezRcA4aXyIDOv+TYi4p+OVTYQ+FMbkgoWBm5bq\n"
+            + "wQIDAQAB\n"
+            + "-----END RSA PUBLIC KEY-----\n";
+    BufferedReader reader = new BufferedReader(new StringReader(pem));
+    Key key = PemKeyType.RSA_PSS_2048_SHA256.readKey(reader);
+    assertThat(key).isNotNull();
+    assertThat(key).isInstanceOf(RSAPublicKey.class);
+    RSAPublicKey rsa = (RSAPublicKey) key;
+    assertThat(rsa.getModulus()).isNotNull();
+    assertThat(rsa.getPublicExponent()).isNotNull();
+  }
+
+  @Test
+  public void readKey_withEd25519_shouldFail() throws Exception {
+    String pem =
+        "-----BEGIN PUBLIC KEY-----\n"
+            + "MCowBQYDK2VwAyEAfU0Of2FTpptiQrUiq77mhf2kQg+INLEIw72uNp71Sfo=\n"
+            + "-----END PUBLIC KEY-----\n";
+    BufferedReader reader = new BufferedReader(new StringReader(pem));
+    Key key = PemKeyType.ECDSA_P256_SHA256.readKey(reader);
+    assertThat(key).isNull();
+  }
+
+  @Test
+  public void readKey_withSecp256k1_shouldFail() throws Exception {
+    String pem =
+        "-----BEGIN PUBLIC KEY-----\n"
+            + "MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEuDj/ROW8F3vyEYnQdmCC/J2EMiaIf8l2\n"
+            + "A3EQC37iCm/wyddb+6ezGmvKGXRJbutW3jVwcZVdg8Sxutqgshgy6Q==\n"
+            + "-----END PUBLIC KEY-----";
+    BufferedReader reader = new BufferedReader(new StringReader(pem));
+    Key key = PemKeyType.ECDSA_P256_SHA256.readKey(reader);
+    assertThat(key).isNull();
+  }
+}
diff --git a/java/src/test/java/com/google/crypto/tink/subtle/RsaSsaPkcs1SignJceTest.java b/java/src/test/java/com/google/crypto/tink/subtle/RsaSsaPkcs1SignJceTest.java
index 2c4de17..69d621e 100644
--- a/java/src/test/java/com/google/crypto/tink/subtle/RsaSsaPkcs1SignJceTest.java
+++ b/java/src/test/java/com/google/crypto/tink/subtle/RsaSsaPkcs1SignJceTest.java
@@ -48,7 +48,7 @@
       fail("Unsafe hash, should have thrown exception.");
     } catch (GeneralSecurityException e) {
       // Expected.
-      TestUtil.assertExceptionContains(e, "SHA1 is not safe");
+      TestUtil.assertExceptionContains(e, "Unsupported hash: SHA1");
     }
   }
 
diff --git a/java/src/test/java/com/google/crypto/tink/subtle/RsaSsaPkcs1VerifyJceTest.java b/java/src/test/java/com/google/crypto/tink/subtle/RsaSsaPkcs1VerifyJceTest.java
index 2ba7959..a3df816 100644
--- a/java/src/test/java/com/google/crypto/tink/subtle/RsaSsaPkcs1VerifyJceTest.java
+++ b/java/src/test/java/com/google/crypto/tink/subtle/RsaSsaPkcs1VerifyJceTest.java
@@ -48,7 +48,7 @@
       fail("Unsafe hash, should have thrown exception.");
     } catch (GeneralSecurityException e) {
       // Expected.
-      TestUtil.assertExceptionContains(e, "SHA1 is not safe");
+      TestUtil.assertExceptionContains(e, "Unsupported hash: SHA1");
     }
   }
 
diff --git a/java/src/test/java/com/google/crypto/tink/subtle/RsaSsaPssSignJceTest.java b/java/src/test/java/com/google/crypto/tink/subtle/RsaSsaPssSignJceTest.java
index 6a9f1fa..b22612d 100644
--- a/java/src/test/java/com/google/crypto/tink/subtle/RsaSsaPssSignJceTest.java
+++ b/java/src/test/java/com/google/crypto/tink/subtle/RsaSsaPssSignJceTest.java
@@ -47,7 +47,7 @@
       fail("Unsafe hash, should have thrown exception.");
     } catch (GeneralSecurityException e) {
       // Expected.
-      TestUtil.assertExceptionContains(e, "SHA1 is not safe");
+      TestUtil.assertExceptionContains(e, "Unsupported hash: SHA1");
     }
   }
 
diff --git a/java/src/test/java/com/google/crypto/tink/subtle/RsaSsaPssVerifyJceTest.java b/java/src/test/java/com/google/crypto/tink/subtle/RsaSsaPssVerifyJceTest.java
index cfb6789..ed15e28 100644
--- a/java/src/test/java/com/google/crypto/tink/subtle/RsaSsaPssVerifyJceTest.java
+++ b/java/src/test/java/com/google/crypto/tink/subtle/RsaSsaPssVerifyJceTest.java
@@ -47,7 +47,7 @@
       fail("Unsafe hash, should have thrown exception.");
     } catch (GeneralSecurityException e) {
       // Expected.
-      TestUtil.assertExceptionContains(e, "SHA1 is not safe");
+      TestUtil.assertExceptionContains(e, "Unsupported hash: SHA1");
     }
   }
 
diff --git a/java/src/test/java/com/google/crypto/tink/subtle/SubtleUtilTest.java b/java/src/test/java/com/google/crypto/tink/subtle/SubtleUtilTest.java
index cba713f..4f0b0df 100644
--- a/java/src/test/java/com/google/crypto/tink/subtle/SubtleUtilTest.java
+++ b/java/src/test/java/com/google/crypto/tink/subtle/SubtleUtilTest.java
@@ -16,10 +16,12 @@
 
 package com.google.crypto.tink.subtle;
 
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 import com.google.crypto.tink.subtle.Enums.HashType;
+import java.nio.ByteBuffer;
 import java.security.GeneralSecurityException;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -49,4 +51,49 @@
     } catch (GeneralSecurityException expected) {
     }
   }
+
+  @Test
+  public void testPutAsUnsigedInt_smallNumber() throws Exception {
+    ByteBuffer buffer = ByteBuffer.allocate(4);
+    SubtleUtil.putAsUnsigedInt(buffer, 0x1122EEFFL);
+    assertThat(buffer.array()).isEqualTo(new byte[] {0x11, 0x22, (byte) 0xEE, (byte) 0xFF});
+  }
+
+  @Test
+  public void testPutAsUnsigedInt_largeNumber() throws Exception {
+    ByteBuffer buffer = ByteBuffer.allocate(4);
+    SubtleUtil.putAsUnsigedInt(buffer, 0xFFEEDDCCL);
+    assertThat(buffer.array())
+        .isEqualTo(new byte[] {(byte) 0xFF, (byte) 0xEE, (byte) 0xDD, (byte) 0xCC});
+  }
+
+  @Test
+  public void testPutAsUnsigedInt_max() throws Exception {
+    ByteBuffer buffer = ByteBuffer.allocate(4);
+    SubtleUtil.putAsUnsigedInt(buffer, 0xFFFFFFFFL);
+    assertThat(buffer.array())
+        .isEqualTo(new byte[] {(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF});
+  }
+
+  @Test
+  public void testPutAsUnsigedInt_tooLargeNumber_throws() throws Exception {
+    ByteBuffer buffer = ByteBuffer.allocate(4);
+    try {
+      SubtleUtil.putAsUnsigedInt(buffer, 0xFFFFFFFFL + 1L);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
+
+  @Test
+  public void testPutAsUnsigedInt_minusOne_throws() throws Exception {
+    ByteBuffer buffer = ByteBuffer.allocate(4);
+    try {
+      SubtleUtil.putAsUnsigedInt(buffer, -1);
+      fail();
+    } catch (GeneralSecurityException e) {
+      // expected
+    }
+  }
 }
diff --git a/java/src/test/java/com/google/crypto/tink/subtle/ValidatorsTest.java b/java/src/test/java/com/google/crypto/tink/subtle/ValidatorsTest.java
index 16d69a8..96b6d29 100644
--- a/java/src/test/java/com/google/crypto/tink/subtle/ValidatorsTest.java
+++ b/java/src/test/java/com/google/crypto/tink/subtle/ValidatorsTest.java
@@ -142,7 +142,7 @@
       Validators.validateSignatureHash(HashType.SHA1);
       fail("Expected GeneralSecurityException");
     } catch (GeneralSecurityException e) {
-      TestUtil.assertExceptionContains(e, "SHA1 is not safe");
+      TestUtil.assertExceptionContains(e, "Unsupported hash: SHA1");
     }
   }
 
diff --git a/javascript/BUILD.bazel b/javascript/BUILD.bazel
new file mode 100644
index 0000000..7a388cc
--- /dev/null
+++ b/javascript/BUILD.bazel
@@ -0,0 +1,193 @@
+package(
+    default_visibility = ["//tools/build_defs:internal_pkg"],
+)
+
+licenses(["notice"])
+
+load("@io_bazel_rules_closure//closure:defs.bzl", "closure_js_binary", "closure_js_library", "closure_js_test")
+
+closure_js_binary(
+    name = "javascript_bin",
+    visibility = ["//visibility:public"],
+    deps = [":javascript"],
+)
+
+closure_js_library(
+    name = "javascript",
+    visibility = ["//visibility:public"],
+    exports = [
+        ":binary_reader",
+        ":binary_writer",
+        ":key_manager",
+        ":keyset_handle",
+        ":primitives",
+        ":readers_writers",
+        ":registry",
+    ],
+)
+
+closure_js_library(
+    name = "primitives",
+    srcs = [
+        "aead.js",
+        "hybrid_decrypt.js",
+        "hybrid_encrypt.js",
+        "mac.js",
+        "public_key_sign.js",
+        "public_key_verify.js",
+    ],
+    deps = [
+        "//javascript/exception",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "binary_reader",
+    srcs = [
+        "binary_keyset_reader.js",
+    ],
+    deps = [
+        ":readers_writers",
+        "//javascript/exception",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "binary_writer",
+    srcs = [
+        "binary_keyset_writer.js",
+    ],
+    deps = [
+        ":readers_writers",
+        "//javascript/exception",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "readers_writers",
+    srcs = [
+        "keyset_reader.js",
+        "keyset_writer.js",
+    ],
+    deps = [
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "keyset_handle",
+    srcs = [
+        "keyset_handle.js",
+    ],
+    deps = [
+        ":key_manager",
+        ":primitive_set",
+        ":primitives",
+        ":readers_writers",
+        ":registry",
+        ":util",
+        "//javascript/exception",
+        "//javascript/subtle",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "cleartext_keyset_handle",
+    srcs = [
+        "cleartext_keyset_handle.js",
+    ],
+    deps = [
+        ":keyset_handle",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "primitive_set",
+    srcs = [
+        "primitive_set.js",
+    ],
+    deps = [
+        ":crypto_format",
+        "//javascript/exception",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "key_manager",
+    srcs = [
+        "key_manager.js",
+    ],
+    deps = [
+        "//javascript/exception",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+        "@io_bazel_rules_closure//closure/protobuf:jspb",
+    ],
+)
+
+closure_js_library(
+    name = "primitive_wrapper",
+    srcs = [
+        "primitive_wrapper.js",
+    ],
+    deps = [
+        ":primitive_set",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "registry",
+    srcs = [
+        "registry.js",
+    ],
+    deps = [
+        ":key_manager",
+        ":primitive_set",
+        ":primitive_wrapper",
+        ":util",
+        "//javascript/exception",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+        "@io_bazel_rules_closure//closure/protobuf:jspb",
+    ],
+)
+
+closure_js_library(
+    name = "crypto_format",
+    srcs = [
+        "crypto_format.js",
+    ],
+    deps = [
+        "//javascript/exception",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "util",
+    srcs = [
+        "util.js",
+    ],
+    deps = [
+        "//javascript/exception",
+        "//javascript/subtle",
+        "//proto:common_closure_proto",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+# test
diff --git a/javascript/aead.js b/javascript/aead.js
new file mode 100644
index 0000000..4a4e280
--- /dev/null
+++ b/javascript/aead.js
@@ -0,0 +1,62 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.Aead');
+
+/**
+ * Interface for Authenticated Encryption with Associated Data (AEAD).
+ *
+ * Security guarantees: Implementations of this interface are secure against
+ * adaptive chosen ciphertext attacks. Encryption with associated data ensures
+ * authenticity (who the sender is) and integrity (the data has not been
+ * tampered with) of that data, but not its secrecy.
+ *
+ * @see https://tools.ietf.org/html/rfc5116
+ * @record
+ */
+class Aead {
+  /**
+   * Encrypts `plaintext` with `opt_associatedData` as associated authenticated
+   * data. The resulting ciphertext allows for checking authenticity and
+   * integrity of associated data, but does not guarantee its secrecy.
+   *
+   * @param {!Uint8Array} plaintext the plaintext to be encrypted. It must be
+   *     non-null, but can also be an empty (zero-length) byte array.
+   * @param {?Uint8Array=} opt_associatedData  optional associated data to be
+   *     authenticated, but not encrypted. A null value is equivalent to an
+   *     empty (zero-length) byte array. For successful decryption the same
+   *     associated data must be provided along with the ciphertext.
+   * @return {!Promise.<!Uint8Array>} resulting ciphertext
+   *
+   */
+  encrypt(plaintext, opt_associatedData) {}
+
+  /**
+   * Decrypts ciphertext with associated authenticated data.
+   * The decryption verifies the authenticity and integrity of the associated
+   * data, but there are no guarantees wrt. secrecy of that data.
+   *
+   * @param {!Uint8Array} ciphertext the ciphertext to be decrypted, must be
+   *     non-null.
+   * @param {?Uint8Array=} opt_associatedData  optional associated data to be
+   *     authenticated. A null value is equivalent to an empty (zero-length)
+   *     byte array. For successful decryption the same associated data must be
+   *     provided along with the ciphertext.
+   * @return {!Promise.<!Uint8Array>} resulting plaintext
+   */
+  decrypt(ciphertext, opt_associatedData) {}
+}
+
+goog.exportSymbol('tink.Aead', Aead);
+exports = Aead;
diff --git a/javascript/aead/BUILD.bazel b/javascript/aead/BUILD.bazel
new file mode 100644
index 0000000..44b2903
--- /dev/null
+++ b/javascript/aead/BUILD.bazel
@@ -0,0 +1,157 @@
+package(
+    default_visibility = [
+        "//tools/build_defs:internal_pkg",
+    ],
+)
+
+licenses(["notice"])
+
+load("@io_bazel_rules_closure//closure:defs.bzl", "closure_js_library")
+
+closure_js_library(
+    name = "aead",
+    exports = [
+        ":aead_config",
+        ":aead_key_templates",
+        ":aead_wrapper",
+        ":aes_ctr_hmac_aead_key_manager",
+        ":aes_ctr_hmac_aead_key_templates",
+        ":aes_gcm_key_manager",
+        ":aes_gcm_key_templates",
+    ],
+)
+
+closure_js_library(
+    name = "aes_ctr_hmac_aead_key_manager",
+    srcs = [
+        "aes_ctr_hmac_aead_key_manager.js",
+    ],
+    deps = [
+        "//javascript:key_manager",
+        "//javascript:primitives",
+        "//javascript:registry",
+        "//javascript/exception",
+        "//javascript/subtle",
+        "//javascript/subtle:aead",
+        "//proto:aes_ctr_closure_proto",
+        "//proto:aes_ctr_hmac_aead_closure_proto",
+        "//proto:common_closure_proto",
+        "//proto:hmac_closure_proto",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "aes_gcm_key_manager",
+    srcs = [
+        "aes_gcm_key_manager.js",
+    ],
+    deps = [
+        "//javascript:key_manager",
+        "//javascript:primitives",
+        "//javascript:registry",
+        "//javascript/exception",
+        "//javascript/subtle",
+        "//javascript/subtle:aead",
+        "//proto:aes_gcm_closure_proto",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+        "@io_bazel_rules_closure//closure/protobuf:jspb",
+    ],
+)
+
+closure_js_library(
+    name = "aes_ctr_hmac_aead_key_templates",
+    srcs = [
+        "aes_ctr_hmac_aead_key_templates.js",
+    ],
+    deps = [
+        ":aes_ctr_hmac_aead_key_manager",
+        "//proto:aes_ctr_closure_proto",
+        "//proto:aes_ctr_hmac_aead_closure_proto",
+        "//proto:common_closure_proto",
+        "//proto:hmac_closure_proto",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "aes_gcm_key_templates",
+    srcs = [
+        "aes_gcm_key_templates.js",
+    ],
+    deps = [
+        ":aes_gcm_key_manager",
+        "//proto:aes_gcm_closure_proto",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "aead_key_templates",
+    srcs = [
+        "aead_key_templates.js",
+    ],
+    deps = [
+        ":aes_ctr_hmac_aead_key_templates",
+        ":aes_gcm_key_templates",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "aead_config",
+    srcs = [
+        "aead_config.js",
+    ],
+    deps = [
+        ":aead_wrapper",
+        ":aes_ctr_hmac_aead_key_manager",
+        ":aes_gcm_key_manager",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "aead_wrapper",
+    srcs = [
+        "aead_wrapper.js",
+    ],
+    deps = [
+        "//javascript:crypto_format",
+        "//javascript:primitive_set",
+        "//javascript:primitive_wrapper",
+        "//javascript:primitives",
+        "//javascript:registry",
+        "//javascript/exception",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+# test
+
+closure_js_library(
+    name = "test_lib",
+    testonly = 1,
+    srcs = glob([
+        "*_test.js",
+    ]),
+    deps = [
+        "//proto:aes_ctr_closure_proto",
+        "//proto:aes_ctr_hmac_aead_closure_proto",
+        "//proto:aes_gcm_closure_proto",
+        "//proto:common_closure_proto",
+        "//proto:hmac_closure_proto",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+        "@io_bazel_rules_closure//closure/library/testing:asserts",
+        "@io_bazel_rules_closure//closure/library/testing:jsunit",
+        "@io_bazel_rules_closure//closure/library/testing:testsuite",
+        "@io_bazel_rules_closure//closure/library/useragent",
+    ],
+)
diff --git a/javascript/aead/aead_config.js b/javascript/aead/aead_config.js
new file mode 100644
index 0000000..a79535f
--- /dev/null
+++ b/javascript/aead/aead_config.js
@@ -0,0 +1,57 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.aead.AeadConfig');
+
+const AeadWrapper = goog.require('tink.aead.AeadWrapper');
+const AesCtrHmacAeadKeyManager = goog.require('tink.aead.AesCtrHmacAeadKeyManager');
+const AesGcmKeyManager = goog.require('tink.aead.AesGcmKeyManager');
+
+
+/**
+ * Static methods and constants for registering with the Registry all instances
+ * of Aead key types supported in a particular release of Tink.
+ *
+ * To register all Aead key types from the current Tink release one can do:
+ *
+ * AeadConfig.register();
+ *
+ * For more information on creation and usage of Aead instances see AeadFactory.
+ *
+ * @final
+ */
+class AeadConfig {
+  /**
+   * Registers key managers for all Aead key types from the current Tink
+   * release.
+   */
+  static register() {
+    // TODO MacConfig.register() should be here.
+    AesGcmKeyManager.register();
+    AesCtrHmacAeadKeyManager.register();
+    AeadWrapper.register();
+  }
+}
+
+/** @const @private {string} */
+AeadConfig.CONFIG_NAME_ = 'TINK_AEAD';
+/** @const {string} */
+AeadConfig.PRIMITIVE_NAME = 'Aead';
+/** @const {string} */
+AeadConfig.AES_CTR_HMAC_AEAD_TYPE_URL = AesCtrHmacAeadKeyManager.KEY_TYPE;
+/** @const {string} */
+AeadConfig.AES_GCM_TYPE_URL = AesGcmKeyManager.KEY_TYPE;
+
+goog.exportSymbol('tink.aead.AeadConfig', AeadConfig);
+exports = AeadConfig;
diff --git a/javascript/aead/aead_config_test.js b/javascript/aead/aead_config_test.js
new file mode 100644
index 0000000..d4144d0
--- /dev/null
+++ b/javascript/aead/aead_config_test.js
@@ -0,0 +1,153 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.aead.AeadConfigTest');
+goog.setTestOnly('tink.aead.AeadConfigTest');
+
+const Aead = goog.require('tink.Aead');
+const AeadConfig = goog.require('tink.aead.AeadConfig');
+const AeadKeyTemplates = goog.require('tink.aead.AeadKeyTemplates');
+const AesCtrHmacAeadKeyManager = goog.require('tink.aead.AesCtrHmacAeadKeyManager');
+const AesGcmKeyManager = goog.require('tink.aead.AesGcmKeyManager');
+const KeysetHandle = goog.require('tink.KeysetHandle');
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const PbKeyStatusType = goog.require('proto.google.crypto.tink.KeyStatusType');
+const PbKeyTemplate = goog.require('proto.google.crypto.tink.KeyTemplate');
+const PbKeyset = goog.require('proto.google.crypto.tink.Keyset');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+const Random = goog.require('tink.subtle.Random');
+const Registry = goog.require('tink.Registry');
+
+const TestCase = goog.require('goog.testing.TestCase');
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+  setUp() {
+    // Use a generous promise timeout for running continuously.
+    TestCase.getActiveTestCase().promiseTimeout = 1000 * 1000;  // 1000s
+  },
+
+  tearDown() {
+    Registry.reset();
+    // Reset the promise timeout to default value.
+    TestCase.getActiveTestCase().promiseTimeout = 1000;  // 1s
+  },
+
+  testConstants() {
+    assertEquals(PRIMITIVE_NAME, AeadConfig.PRIMITIVE_NAME);
+
+    assertEquals(
+        AES_CTR_HMAC_AEAD_KEY_TYPE, AeadConfig.AES_CTR_HMAC_AEAD_TYPE_URL);
+    assertEquals(AES_GCM_KEY_TYPE, AeadConfig.AES_GCM_TYPE_URL);
+  },
+
+  testRegister_correspondingKeyManagersWereRegistered() {
+    AeadConfig.register();
+
+    // Test that the corresponding key managers were registered.
+    const aesCtrHmacKeyManager =
+        Registry.getKeyManager(AES_CTR_HMAC_AEAD_KEY_TYPE);
+    assertTrue(aesCtrHmacKeyManager instanceof AesCtrHmacAeadKeyManager);
+
+    const aesGcmKeyManager = Registry.getKeyManager(AES_GCM_KEY_TYPE);
+    assertTrue(aesGcmKeyManager instanceof AesGcmKeyManager);
+
+    // TODO add tests for other key types here, whenever they are available in
+    // Tink.
+  },
+
+  async testRegister_predefinedTemplatesShouldWork() {
+    AeadConfig.register();
+    let templates = [
+      AeadKeyTemplates.aes128Gcm(), AeadKeyTemplates.aes256Gcm(),
+      AeadKeyTemplates.aes128CtrHmacSha256(),
+      AeadKeyTemplates.aes256CtrHmacSha256()
+    ];
+    // The following function adds all templates in uncompiled tests, thus if
+    // a new template is added without updating AeadConfig or AeadCatalogue
+    // correctly then at least the uncompiled tests should fail.
+    // But the templates are included also above as the following function does
+    // not add anything to the list in compiled code.
+    templates = templates.concat(getListOfTemplatesFromAeadKeyTemplatesClass());
+    for (let template of templates) {
+      const keyData = await Registry.newKeyData(template);
+      const keysetHandle = createKeysetHandleFromKeyData(keyData);
+
+      const aead = await keysetHandle.getPrimitive(Aead);
+      const plaintext = Random.randBytes(10);
+      const aad = Random.randBytes(8);
+      const ciphertext = await aead.encrypt(plaintext, aad);
+      const decryptedCiphertext = await aead.decrypt(ciphertext, aad);
+
+      assertObjectEquals(plaintext, decryptedCiphertext);
+    }
+  },
+});
+
+// Constants used in tests.
+const PRIMITIVE_NAME = 'Aead';
+const AES_CTR_HMAC_AEAD_KEY_TYPE =
+    'type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey';
+const AES_GCM_KEY_TYPE = 'type.googleapis.com/google.crypto.tink.AesGcmKey';
+
+/**
+ * Creates a keyset containing only the key given by keyData and returns it
+ * wrapped in a KeysetHandle.
+ *
+ * @param {!PbKeyData} keyData
+ * @return {!KeysetHandle}
+ */
+const createKeysetHandleFromKeyData = function(keyData) {
+  const keyId = 1;
+  const key = new PbKeyset.Key()
+                  .setKeyData(keyData)
+                  .setStatus(PbKeyStatusType.ENABLED)
+                  .setKeyId(keyId)
+                  .setOutputPrefixType(PbOutputPrefixType.TINK);
+
+  const keyset = new PbKeyset();
+  keyset.addKey(key);
+  keyset.setPrimaryKeyId(keyId);
+  return new KeysetHandle(keyset);
+};
+
+/**
+ * Returns all templates from AeadKeyTemplates class.
+ *
+ * WARNING: This function works only in uncompiled code. Once the code is
+ * compiled it returns only empty set due to optimizations which are run.
+ * Namely
+ *   - after compilation the methods are no longer methods of AeadKeyTemplates
+ *       class, and
+ *   - every method which is not referenced in this file or in the code used by
+ *       these tests are considered as dead code and removed.
+ *
+ * @return {!Array<!PbKeyTemplate>}
+ */
+const getListOfTemplatesFromAeadKeyTemplatesClass = function() {
+  let templates = [];
+  for (let propertyName of Object.getOwnPropertyNames(AeadKeyTemplates)) {
+    // Only public methods (i.e. not ending with '_') without arguments (i.e.
+    // function.length == 0) generate key templates.
+    const property = AeadKeyTemplates[propertyName];
+    if (typeof property === 'function' && property.length === 0 &&
+        propertyName[propertyName.length - 1] != '_') {
+      const template = property();
+      if (template instanceof PbKeyTemplate) {
+        templates = templates.concat([template]);
+      }
+    }
+  }
+  return templates;
+};
diff --git a/javascript/aead/aead_key_templates.js b/javascript/aead/aead_key_templates.js
new file mode 100644
index 0000000..cc4c23c
--- /dev/null
+++ b/javascript/aead/aead_key_templates.js
@@ -0,0 +1,115 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.aead.AeadKeyTemplates');
+
+const AesCtrHmacAeadKeyTemplates = goog.require('tink.aead.AesCtrHmacAeadKeyTemplates');
+const AesGcmKeyTemplates = goog.require('tink.aead.AesGcmKeyTemplates');
+const PbKeyTemplate = goog.require('proto.google.crypto.tink.KeyTemplate');
+
+/**
+ * Pre-generated KeyTemplates for Aead keys.
+ *
+ * One can use these templates to generate new Keyset with
+ * KeysetHandle.generateNew method. To generate a new keyset that contains a
+ * single AesCtrHmacAeadKey, one can do:
+ *
+ * AeadConfig.Register();
+ * KeysetHandle handle =
+ *     KeysetHandle.generateNew(AeadKeyTemplates.aes128CtrHmacSha256());
+ *
+ * @final
+ */
+class AeadKeyTemplates {
+  /**
+   * Returns a KeyTemplate that generates new instances of AesCtrHmacAeadKey
+   * with the following parameters:
+   *    AES key size: 16 bytes
+   *    AES IV size: 16 bytes
+   *    HMAC key size: 32 bytes
+   *    HMAC tag size: 16 bytes
+   *    HMAC hash function: SHA256
+   *    OutputPrefixType: TINK
+   *
+   * @return {!PbKeyTemplate}
+   */
+  static aes128CtrHmacSha256() {
+    return AesCtrHmacAeadKeyTemplates.aes128CtrHmacSha256();
+  }
+
+  /**
+   * Returns a KeyTemplate that generates new instances of AesCtrHmacAeadKey
+   * with the following parameters:
+   *    AES key size: 32 bytes
+   *    AES IV size: 16 bytes
+   *    HMAC key size: 32 bytes
+   *    HMAC tag size: 32 bytes
+   *    HMAC hash function: SHA256
+   *    OutputPrefixType: TINK
+   *
+   * @return {!PbKeyTemplate}
+   */
+  static aes256CtrHmacSha256() {
+    return AesCtrHmacAeadKeyTemplates.aes256CtrHmacSha256();
+  }
+
+  /**
+   * Returns a KeyTemplate that generates new instances of AesGcmKey
+   * with the following parameters:
+   *    key size: 16 bytes
+   *    OutputPrefixType: TINK
+   *
+   * @return {!PbKeyTemplate}
+   */
+  static aes128Gcm() {
+    return AesGcmKeyTemplates.aes128Gcm();
+  }
+
+  /**
+   * Returns a KeyTemplate that generates new instances of AesGcmKey
+   * with the following parameters:
+   *    key size: 32 bytes
+   *    OutputPrefixType: TINK
+   *
+   * @return {!PbKeyTemplate}
+   */
+  static aes256Gcm() {
+    return AesGcmKeyTemplates.aes256Gcm();
+  }
+
+  /**
+   * Returns a KeyTemplate that generates new instances of AesGcmKey
+   * with the following parameters:
+   *     key size: 32 bytes
+   *     OutputPrefixType: RAW
+   *
+   * @return {!PbKeyTemplate}
+   */
+  static aes256GcmNoPrefix() {
+    return AesGcmKeyTemplates.aes256GcmNoPrefix();
+  }
+}
+
+goog.exportProperty(
+    AeadKeyTemplates, 'aes128CtrHmacSha256',
+    AeadKeyTemplates.aes128CtrHmacSha256);
+goog.exportProperty(
+    AeadKeyTemplates, 'aes256CtrHmacSha256',
+    AeadKeyTemplates.aes256CtrHmacSha256);
+goog.exportProperty(AeadKeyTemplates, 'aes128Gcm', AeadKeyTemplates.aes128Gcm);
+goog.exportProperty(AeadKeyTemplates, 'aes256Gcm', AeadKeyTemplates.aes256Gcm);
+goog.exportProperty(
+    AeadKeyTemplates, 'aes256GcmNoPrefix', AeadKeyTemplates.aes256GcmNoPrefix);
+goog.exportSymbol('tink.aead.AeadKeyTemplates', AeadKeyTemplates);
+exports = AeadKeyTemplates;
diff --git a/javascript/aead/aead_key_templates_test.js b/javascript/aead/aead_key_templates_test.js
new file mode 100644
index 0000000..f83de45
--- /dev/null
+++ b/javascript/aead/aead_key_templates_test.js
@@ -0,0 +1,49 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.aead.AeadKeyTemplatesTest');
+goog.setTestOnly('tink.aead.AeadKeyTemplatesTest');
+
+const AeadKeyTemplates = goog.require('tink.aead.AeadKeyTemplates');
+const PbKeyTemplate = goog.require('proto.google.crypto.tink.KeyTemplate');
+
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+
+  testAes128CtrHmacSha256() {
+    const keyTemplate = AeadKeyTemplates.aes128CtrHmacSha256();
+    assertTrue(keyTemplate instanceof PbKeyTemplate);
+  },
+
+  testAes256CtrHmacSha256() {
+    const keyTemplate = AeadKeyTemplates.aes256CtrHmacSha256();
+    assertTrue(keyTemplate instanceof PbKeyTemplate);
+  },
+
+  testAes128Gcm() {
+    const keyTemplate = AeadKeyTemplates.aes128Gcm();
+    assertTrue(keyTemplate instanceof PbKeyTemplate);
+  },
+
+  testAes256Gcm() {
+    const keyTemplate = AeadKeyTemplates.aes256Gcm();
+    assertTrue(keyTemplate instanceof PbKeyTemplate);
+  },
+
+  testAes256GcmNoPrefix() {
+    const keyTemplate = AeadKeyTemplates.aes256GcmNoPrefix();
+    assertTrue(keyTemplate instanceof PbKeyTemplate);
+  }
+});
diff --git a/javascript/aead/aead_wrapper.js b/javascript/aead/aead_wrapper.js
new file mode 100644
index 0000000..43e09c2
--- /dev/null
+++ b/javascript/aead/aead_wrapper.js
@@ -0,0 +1,166 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.aead.AeadWrapper');
+
+const Aead = goog.require('tink.Aead');
+const CryptoFormat = goog.require('tink.CryptoFormat');
+const PbKeyStatusType = goog.require('proto.google.crypto.tink.KeyStatusType');
+const PrimitiveSet = goog.require('tink.PrimitiveSet');
+const PrimitiveWrapper = goog.require('tink.PrimitiveWrapper');
+const Registry = goog.require('tink.Registry');
+const SecurityException = goog.require('tink.exception.SecurityException');
+
+/**
+ * @implements {Aead}
+ * @final
+ */
+class WrappedAead {
+  /**
+   * @param {!PrimitiveSet.PrimitiveSet} aeadSet
+   */
+  // The constructor should be @private, but it is not supported by Closure
+  // (see https://github.com/google/closure-compiler/issues/2761).
+  constructor(aeadSet) {
+    /** @private @const {!PrimitiveSet.PrimitiveSet} */
+    this.aeadSet_ = aeadSet;
+  }
+
+  /**
+   * @param {!PrimitiveSet.PrimitiveSet} aeadSet
+   *
+   * @return {!Aead}
+   */
+  static newAead(aeadSet) {
+    if (!aeadSet) {
+      throw new SecurityException('Primitive set has to be non-null.');
+    }
+    if (!aeadSet.getPrimary()) {
+      throw new SecurityException('Primary has to be non-null.');
+    }
+    return new WrappedAead(aeadSet);
+  }
+
+  /**
+   * @override
+   */
+  async encrypt(plaintext, opt_associatedData) {
+    if (!plaintext) {
+      throw new SecurityException('Plaintext has to be non-null.');
+    }
+    const primitive = this.aeadSet_.getPrimary().getPrimitive();
+    const encryptedText =
+        await primitive.encrypt(plaintext, opt_associatedData);
+    const keyId = this.aeadSet_.getPrimary().getIdentifier();
+
+    const ciphertext = new Uint8Array(keyId.length + encryptedText.length);
+    ciphertext.set(keyId, 0);
+    ciphertext.set(encryptedText, keyId.length);
+    return ciphertext;
+  }
+
+  /**
+   * @override
+   */
+  async decrypt(ciphertext, opt_associatedData) {
+    if (!ciphertext) {
+      throw new SecurityException('Ciphertext has to be non-null.');
+    }
+
+    if (ciphertext.length > CryptoFormat.NON_RAW_PREFIX_SIZE) {
+      const keyId = ciphertext.subarray(0, CryptoFormat.NON_RAW_PREFIX_SIZE);
+      const entries = await this.aeadSet_.getPrimitives(keyId);
+
+      const rawCiphertext = ciphertext.subarray(
+          CryptoFormat.NON_RAW_PREFIX_SIZE, ciphertext.length);
+      let /** @type {!Uint8Array} */ decryptedText;
+      try {
+        decryptedText = await this.tryDecryption_(
+            entries, rawCiphertext, opt_associatedData);
+      } catch (e) {
+      }
+
+      if (decryptedText) {
+        return decryptedText;
+      }
+    }
+
+    const entries = await this.aeadSet_.getRawPrimitives();
+    const decryptedText =
+        await this.tryDecryption_(entries, ciphertext, opt_associatedData);
+    return decryptedText;
+  }
+
+  /**
+   * Tries to decrypt the ciphertext using each entry in entriesArray and
+   * returns the ciphertext decrypted by first primitive which succeed. It
+   * throws an exception if no entry succeeds.
+   *
+   * @private
+   * @param {!Array<!PrimitiveSet.Entry>} entriesArray
+   * @param {!Uint8Array} ciphertext
+   * @param {?Uint8Array=} opt_associatedData
+   *
+   * @return {!Promise<!Uint8Array>}
+   */
+  async tryDecryption_(entriesArray, ciphertext, opt_associatedData) {
+    const entriesArrayLength = entriesArray.length;
+    for (let i = 0; i < entriesArrayLength; i++) {
+      if (entriesArray[i].getKeyStatus() != PbKeyStatusType.ENABLED) {
+        continue;
+      }
+      const primitive = entriesArray[i].getPrimitive();
+      let decryptionResult;
+      try {
+        decryptionResult =
+            await primitive.decrypt(ciphertext, opt_associatedData);
+      } catch (e) {
+        continue;
+      }
+      return decryptionResult;
+    }
+    throw new SecurityException('Decryption failed for the given ciphertext.');
+  }
+}
+
+/**
+ * @implements {PrimitiveWrapper<Aead>}
+ */
+class AeadWrapper {
+  /**
+   * @private
+   */
+  constructor() {}
+
+  /**
+   * @override
+   */
+  wrap(primitiveSet) {
+    return WrappedAead.newAead(primitiveSet);
+  }
+
+  /**
+   * @override
+   */
+  getPrimitiveType() {
+    return Aead;
+  }
+
+  static register() {
+    Registry.registerPrimitiveWrapper(new AeadWrapper());
+  }
+}
+
+goog.exportSymbol('tink.aead.AeadWrapper', AeadWrapper);
+exports = AeadWrapper;
diff --git a/javascript/aead/aead_wrapper_test.js b/javascript/aead/aead_wrapper_test.js
new file mode 100644
index 0000000..2d647b5
--- /dev/null
+++ b/javascript/aead/aead_wrapper_test.js
@@ -0,0 +1,326 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.aead.AeadWrapperTest');
+goog.setTestOnly('tink.aead.AeadWrapperTest');
+
+const Aead = goog.require('tink.Aead');
+const AeadWrapper = goog.require('tink.aead.AeadWrapper');
+const Bytes = goog.require('tink.subtle.Bytes');
+const CryptoFormat = goog.require('tink.CryptoFormat');
+const PbKeyStatusType = goog.require('proto.google.crypto.tink.KeyStatusType');
+const PbKeysetKey = goog.require('proto.google.crypto.tink.Keyset.Key');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+const PrimitiveSet = goog.require('tink.PrimitiveSet');
+const SecurityException = goog.require('tink.exception.SecurityException');
+
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+  async testNewAeadNullPrimitiveSet() {
+    try {
+      new AeadWrapper().wrap(null);
+    } catch (e) {
+      assertEquals(ExceptionText.nullPrimitiveSet(), e.toString());
+      return;
+    }
+    fail('Should throw an exception.');
+  },
+
+  async testNewAeadPrimitiveSetWithoutPrimary() {
+    const primitiveSet = createPrimitiveSet(/* opt_withPrimary = */ false);
+    try {
+      new AeadWrapper().wrap(primitiveSet);
+    } catch (e) {
+      assertEquals(ExceptionText.primitiveSetWithoutPrimary(), e.toString());
+      return;
+    }
+    fail('Should throw an exception.');
+  },
+
+  async testNewAeadPrimitiveShouldWork() {
+    const primitiveSet = createPrimitiveSet();
+    const aead = new AeadWrapper().wrap(primitiveSet);
+    assertTrue(aead != null && aead != undefined);
+  },
+
+  async testEncrypt() {
+    const primitiveSet = createPrimitiveSet();
+    const aead = new AeadWrapper().wrap(primitiveSet);
+
+    const plaintext = new Uint8Array([0, 1, 2, 3]);
+
+    const ciphertext = await aead.encrypt(plaintext);
+    assertTrue(ciphertext != null);
+
+    // Ciphertext should begin with primary key output prefix.
+    assertObjectEquals(
+        primitiveSet.getPrimary().getIdentifier(),
+        ciphertext.subarray(0, CryptoFormat.NON_RAW_PREFIX_SIZE));
+  },
+
+  async testDecryptBadCiphertext() {
+    const primitiveSet = createPrimitiveSet();
+    const aead = new AeadWrapper().wrap(primitiveSet);
+
+    const ciphertext = new Uint8Array([9, 8, 7, 6, 5, 4, 3]);
+
+    try {
+      await aead.decrypt(ciphertext);
+    } catch (e) {
+      assertEquals(ExceptionText.cannotBeDecrypted(), e.toString());
+      return;
+    }
+    fail('Should throw an exception');
+  },
+
+  async testDecryptWithCiphertextEncryptedByPrimaryKey() {
+    const primitiveSet = createPrimitiveSet();
+    const aead = new AeadWrapper().wrap(primitiveSet);
+
+    const plaintext = new Uint8Array([12, 51, 45, 200, 120, 111]);
+
+    const ciphertext = await aead.encrypt(plaintext);
+    const decryptResult = await aead.decrypt(ciphertext);
+
+    assertObjectEquals(plaintext, decryptResult);
+  },
+
+  async testDecryptCiphertextEncryptedByNonPrimaryKey() {
+    const primitiveSet = createPrimitiveSet();
+    const aead = new AeadWrapper().wrap(primitiveSet);
+
+    // Encrypt the plaintext with primary.
+    const plaintext = new Uint8Array([0xAA, 0xBB, 0xAB, 0xBA, 0xFF]);
+    const ciphertext = await aead.encrypt(plaintext);
+
+    // Add a new primary to primitive set and make new AeadSetWrapper with the
+    // updated primitive set.
+    const keyId = 0xFFFFFFFF;
+    const key =
+        createKey(keyId, PbOutputPrefixType.LEGACY, /* enabled = */ true);
+    const entry =
+        primitiveSet.addPrimitive(new DummyAead(Uint8Array[0xFF]), key);
+    primitiveSet.setPrimary(entry);
+    const aead2 = new AeadWrapper().wrap(primitiveSet);
+
+    // Check that the ciphertext can be decrypted by the setWrapper with new
+    // primary and that the decryption corresponds to the plaintext.
+    const decryptResult = await aead2.decrypt(ciphertext);
+
+    assertObjectEquals(plaintext, decryptResult);
+  },
+
+  async testDecryptCiphertextRawPrimitive() {
+    const primitiveSet = createPrimitiveSet();
+    // Create a RAW primitive and add it to primitiveSet.
+    const keyId = 0xFFFFFFFF;
+    const rawKey =
+        createKey(keyId, PbOutputPrefixType.RAW, /* enabled = */ true);
+    const rawKeyAead = new DummyAead(new Uint8Array([0xFF]));
+    primitiveSet.addPrimitive(rawKeyAead, rawKey);
+
+    // Encrypt the plaintext by aead corresponding to the rawKey.
+    const plaintext = new Uint8Array([0x11, 0x15, 0xAA, 0x54]);
+    const ciphertext = await rawKeyAead.encrypt(plaintext);
+
+    // Create aead which should be able to decrypt the ciphertext.
+    const aead = new AeadWrapper().wrap(primitiveSet);
+
+    // Try to decrypt the ciphertext by aead and check that the result
+    // corresponds to the plaintext.
+    const decryptResult = await aead.decrypt(ciphertext);
+    assertObjectEquals(plaintext, decryptResult);
+  },
+
+  async testDecryptCiphertextDisabledPrimitive() {
+    const primitiveSet = createPrimitiveSet();
+
+    // Create a primitive with disabled key and add it to primitiveSet.
+    const keyId = 0xFFFFFFFF;
+    const key = createKey(keyId, PbOutputPrefixType.RAW, /* enabled = */ false);
+    const disabledKeyAead = new DummyAead(new Uint8Array([0xFF]));
+    primitiveSet.addPrimitive(disabledKeyAead, key);
+
+    // Encrypt the plaintext by a primitive with disabled key.
+    const plaintext = new Uint8Array([0, 1, 2, 3]);
+    const ciphertext = await disabledKeyAead.encrypt(plaintext);
+
+    // Create aead containing the primitive with disabled key.
+    const aead = new AeadWrapper().wrap(primitiveSet);
+
+    // Check that the ciphertext cannot be decrypted as disabled keys cannot be
+    // used to neither encryption nor decryption.
+    try {
+      await aead.decrypt(ciphertext);
+    } catch (e) {
+      assertEquals(ExceptionText.cannotBeDecrypted(), e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testEncryptDecrypt_AssociatedDataShouldBePassed() {
+    const primitiveSet = createPrimitiveSet();
+    const aead = new AeadWrapper().wrap(primitiveSet);
+    const plaintext = new Uint8Array([0, 1, 2, 3, 4, 5, 6]);
+    const aad = new Uint8Array([8, 9, 10, 11, 12]);
+
+    // Encrypt the plaintext with aad. The ciphertext should end with aad if
+    // it was passed correctly.
+    const ciphertext = await aead.encrypt(plaintext, aad);
+    const ciphertextAad =
+        ciphertext.slice(ciphertext.length - aad.length, ciphertext.length);
+    assertObjectEquals(aad, ciphertextAad);
+
+    // Decrypt the ciphertext with aad. It is possible only if aad was passed
+    // correctly.
+    const decryptedCiphertext = await aead.decrypt(ciphertext, aad);
+    assertObjectEquals(plaintext, decryptedCiphertext);
+  },
+});
+
+/**
+ * Class holding texts for each type of exception.
+ * @final
+ */
+class ExceptionText {
+  /** @return {string} */
+  static nullPrimitiveSet() {
+    return 'CustomError: Primitive set has to be non-null.';
+  }
+
+  /** @return {string} */
+  static primitiveSetWithoutPrimary() {
+    return 'CustomError: Primary has to be non-null.';
+  }
+
+  /** @return {string} */
+  static cannotBeDecrypted() {
+    return 'CustomError: Decryption failed for the given ciphertext.';
+  }
+}
+
+/**
+ * Function for creating keys for testing purposes.
+ *
+ * @param {number} keyId
+ * @param {!PbOutputPrefixType} outputPrefix
+ * @param {boolean} enabled
+ *
+ * @return {!PbKeysetKey}
+ */
+const createKey = function(keyId, outputPrefix, enabled) {
+  let key = new PbKeysetKey();
+
+  if (enabled) {
+    key.setStatus(PbKeyStatusType.ENABLED);
+  } else {
+    key.setStatus(PbKeyStatusType.DISABLED);
+  }
+
+  key.setOutputPrefixType(outputPrefix);
+  key.setKeyId(keyId);
+
+  return key;
+};
+
+/**
+ * Creates a primitive set with 'numberOfPrimitives' primitives. The keys
+ * corresponding to the primitives have ids from the set
+ * [1, ..., numberOfPrimitives] and the primitive corresponding to key with id
+ * 'numberOfPrimitives' is set to be primary whenever opt_withPrimary is set to
+ * true (where true is the default value).
+ *
+ * @param {boolean=} opt_withPrimary
+ *
+ * @return {!PrimitiveSet.PrimitiveSet}
+ */
+const createPrimitiveSet = function(opt_withPrimary = true) {
+  const numberOfPrimitives = 5;
+
+  const primitiveSet = new PrimitiveSet.PrimitiveSet();
+  for (let i = 1; i < numberOfPrimitives; i++) {
+    let /** @type {PbOutputPrefixType} */ outputPrefix;
+    switch (i % 3) {
+      case 0:
+        outputPrefix = PbOutputPrefixType.TINK;
+        break;
+      case 1:
+        outputPrefix = PbOutputPrefixType.LEGACY;
+        break;
+      default:
+        outputPrefix = PbOutputPrefixType.RAW;
+    }
+    const key = createKey(i, outputPrefix, /* enabled = */ i % 4 < 2);
+    primitiveSet.addPrimitive(new DummyAead(new Uint8Array([i])), key);
+  }
+
+  const key = createKey(
+      numberOfPrimitives, PbOutputPrefixType.TINK, /* enabled = */ true);
+  const aead = new DummyAead(new Uint8Array([numberOfPrimitives]));
+  const entry = primitiveSet.addPrimitive(aead, key);
+  if (opt_withPrimary) {
+    primitiveSet.setPrimary(entry);
+  }
+
+  return primitiveSet;
+};
+
+/**
+ * @implements {Aead}
+ * @final
+ */
+class DummyAead {
+  /**
+   * @param {!Uint8Array} primitiveIdentifier
+   */
+  constructor(primitiveIdentifier) {
+    /** @private @const {!Uint8Array} */
+    this.primitiveIdentifier_ = primitiveIdentifier;
+  }
+
+  /** @override*/
+  async encrypt(plaintext, opt_associatedData) {
+    const result = Bytes.concat(plaintext, this.primitiveIdentifier_);
+    if (opt_associatedData) {
+      return Bytes.concat(result, opt_associatedData);
+    }
+    return result;
+  }
+
+  /** @override*/
+  async decrypt(ciphertext, opt_associatedData) {
+    if (opt_associatedData) {
+      const aad = ciphertext.subarray(
+          ciphertext.length - opt_associatedData.length, ciphertext.length);
+
+      if ([...aad].toString() != [...opt_associatedData].toString()) {
+        throw new SecurityException(ExceptionText.cannotBeDecrypted());
+      }
+      ciphertext = ciphertext.subarray(0, ciphertext.length - aad.length);
+    }
+
+    const primitiveIdentifier = ciphertext.subarray(
+        ciphertext.length - this.primitiveIdentifier_.length,
+        ciphertext.length);
+    if ([...primitiveIdentifier].toString() !=
+        [...this.primitiveIdentifier_].toString()) {
+      throw new SecurityException(ExceptionText.cannotBeDecrypted());
+    }
+
+    return ciphertext.subarray(
+        0, ciphertext.length - this.primitiveIdentifier_.length);
+  }
+}
diff --git a/javascript/aead/aes_ctr_hmac_aead_key_manager.js b/javascript/aead/aes_ctr_hmac_aead_key_manager.js
new file mode 100644
index 0000000..1895134
--- /dev/null
+++ b/javascript/aead/aes_ctr_hmac_aead_key_manager.js
@@ -0,0 +1,361 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.aead.AesCtrHmacAeadKeyManager');
+
+const Aead = goog.require('tink.Aead');
+const EncryptThenAuthenticate = goog.require('tink.subtle.EncryptThenAuthenticate');
+const KeyManager = goog.require('tink.KeyManager');
+const PbAesCtrHmacAeadKey = goog.require('proto.google.crypto.tink.AesCtrHmacAeadKey');
+const PbAesCtrHmacAeadKeyFormat = goog.require('proto.google.crypto.tink.AesCtrHmacAeadKeyFormat');
+const PbAesCtrKey = goog.require('proto.google.crypto.tink.AesCtrKey');
+const PbAesCtrKeyFormat = goog.require('proto.google.crypto.tink.AesCtrKeyFormat');
+const PbHashType = goog.require('proto.google.crypto.tink.HashType');
+const PbHmacKey = goog.require('proto.google.crypto.tink.HmacKey');
+const PbHmacKeyFormat = goog.require('proto.google.crypto.tink.HmacKeyFormat');
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const Random = goog.require('tink.subtle.Random');
+const Registry = goog.require('tink.Registry');
+const SecurityException = goog.require('tink.exception.SecurityException');
+const Validators = goog.require('tink.subtle.Validators');
+
+/**
+ * @final
+ * @implements {KeyManager.KeyFactory}
+ */
+class AesCtrHmacAeadKeyFactory {
+  /**
+   * @override
+   */
+  newKey(keyFormat) {
+    let /** PbAesCtrHmacAeadKeyFormat */ keyFormatProto;
+    if (keyFormat instanceof Uint8Array) {
+      try {
+        keyFormatProto = PbAesCtrHmacAeadKeyFormat.deserializeBinary(keyFormat);
+      } catch (e) {
+        throw new SecurityException(
+            'Could not parse the given Uint8Array as a serialized proto of ' +
+            AesCtrHmacAeadKeyManager.KEY_TYPE);
+      }
+      if (!keyFormatProto || !keyFormatProto.getAesCtrKeyFormat() ||
+          !keyFormatProto.getHmacKeyFormat()) {
+        throw new SecurityException(
+            'Could not parse the given Uint8Array as a serialized proto of ' +
+            AesCtrHmacAeadKeyManager.KEY_TYPE);
+      }
+    } else {
+      if (keyFormat instanceof PbAesCtrHmacAeadKeyFormat) {
+        keyFormatProto = keyFormat;
+      } else {
+        throw new SecurityException('Expected AesCtrHmacAeadKeyFormat-proto');
+      }
+    }
+
+    this.validateAesCtrKeyFormat(keyFormatProto.getAesCtrKeyFormat());
+    let aesCtrKey =
+        new PbAesCtrKey()
+            .setVersion(AesCtrHmacAeadKeyFactory.VERSION_)
+            .setParams(keyFormatProto.getAesCtrKeyFormat().getParams())
+            .setKeyValue(Random.randBytes(
+                keyFormatProto.getAesCtrKeyFormat().getKeySize()));
+
+    this.validateHmacKeyFormat(keyFormatProto.getHmacKeyFormat());
+    let hmacKey = new PbHmacKey()
+                      .setVersion(AesCtrHmacAeadKeyFactory.VERSION_)
+                      .setParams(keyFormatProto.getHmacKeyFormat().getParams())
+                      .setKeyValue(Random.randBytes(
+                          keyFormatProto.getHmacKeyFormat().getKeySize()));
+
+
+    let aesCtrHmacAeadKey =
+        new PbAesCtrHmacAeadKey().setAesCtrKey(aesCtrKey).setHmacKey(hmacKey);
+
+    return aesCtrHmacAeadKey;
+  }
+
+  /**
+   * @override
+   */
+  newKeyData(serializedKeyFormat) {
+    const key =
+        /** @type {!PbAesCtrHmacAeadKey} */ (this.newKey(serializedKeyFormat));
+    let keyData = new PbKeyData()
+                      .setTypeUrl(AesCtrHmacAeadKeyManager.KEY_TYPE)
+                      .setValue(key.serializeBinary())
+                      .setKeyMaterialType(PbKeyData.KeyMaterialType.SYMMETRIC);
+
+    return keyData;
+  }
+
+  // helper functions
+  /**
+   * Checks the parameters and size of a given keyFormat.
+   *
+   * @param {null|!PbAesCtrKeyFormat} keyFormat
+   */
+  validateAesCtrKeyFormat(keyFormat) {
+    if (!keyFormat) {
+      throw new SecurityException(
+          'Invalid AES CTR HMAC key format: key format undefined');
+    }
+    Validators.validateAesKeySize(keyFormat.getKeySize());
+    const ivSize = keyFormat.getParams().getIvSize();
+    if (ivSize < AesCtrHmacAeadKeyFactory.MIN_IV_SIZE_ ||
+        ivSize > AesCtrHmacAeadKeyFactory.MAX_IV_SIZE_) {
+      throw new SecurityException(
+          'Invalid AES CTR HMAC key format: IV size is out of range: ' +
+          ivSize);
+    }
+  }
+
+  /**
+   * Checks the parameters and size of a given keyFormat.
+   *
+   * @param {null|!PbHmacKeyFormat} keyFormat
+   */
+  validateHmacKeyFormat(keyFormat) {
+    if (!keyFormat) {
+      throw new SecurityException(
+          'Invalid AES CTR HMAC key format: key format undefined');
+    }
+    if (keyFormat.getKeySize() < AesCtrHmacAeadKeyFactory.MIN_KEY_SIZE_) {
+      throw new SecurityException(
+          'Invalid AES CTR HMAC key format: HMAC key is too small: ' +
+          keyFormat.getKeySize());
+    }
+    const hmacParams = keyFormat.getParams();
+    if (hmacParams.getTagSize() < AesCtrHmacAeadKeyFactory.MIN_TAG_SIZE_) {
+      throw new SecurityException(
+          'Invalid HMAC params: tag size ' + hmacParams.getTagSize() +
+          ' is too small.');
+    }
+    if (!AesCtrHmacAeadKeyFactory.MAX_TAG_SIZE_.has(hmacParams.getHash())) {
+      throw new SecurityException('Unknown hash type.');
+    } else {
+      if (hmacParams.getTagSize() >
+          AesCtrHmacAeadKeyFactory.MAX_TAG_SIZE_.get(hmacParams.getHash())) {
+        throw new SecurityException(
+            'Invalid HMAC params: tag size ' + hmacParams.getTagSize() +
+            ' is out of range.');
+      }
+    }
+  }
+}
+/**
+ * @const @private {number}
+ */
+AesCtrHmacAeadKeyFactory.VERSION_ = 0;
+
+/**
+ * @const @private {number}
+ */
+AesCtrHmacAeadKeyFactory.MIN_KEY_SIZE_ = 16;
+/**
+ * @const @private {number}
+ */
+AesCtrHmacAeadKeyFactory.MIN_IV_SIZE_ = 12;
+/**
+ * @const @private {number}
+ */
+AesCtrHmacAeadKeyFactory.MAX_IV_SIZE_ = 16;
+/**
+ * @const @private {number}
+ */
+AesCtrHmacAeadKeyFactory.MIN_TAG_SIZE_ = 10;
+/**
+ * @const @private {!Map<!PbHashType, number>}
+ */
+AesCtrHmacAeadKeyFactory.MAX_TAG_SIZE_ = new Map(
+    [[PbHashType.SHA1, 20], [PbHashType.SHA256, 32], [PbHashType.SHA512, 64]]);
+
+/**
+ * @implements {KeyManager.KeyManager<Aead>}
+ * @final
+ */
+class AesCtrHmacAeadKeyManager {
+  /**
+   * @private
+   */
+  constructor() {
+    /**
+     * @const @private {!AesCtrHmacAeadKeyFactory}
+     */
+    this.keyFactory_ = new AesCtrHmacAeadKeyFactory();
+  }
+
+  /**
+   * @override
+   */
+  async getPrimitive(primitiveType, key) {
+    if (primitiveType != this.getPrimitiveType()) {
+      throw new SecurityException(
+          'Requested primitive type which is not ' +
+          'supported by this key manager.');
+    }
+
+    let /** PbAesCtrHmacAeadKey */ deserializedKey;
+    if (key instanceof PbKeyData) {
+      if (!this.doesSupport(key.getTypeUrl())) {
+        throw new SecurityException('Key type ' + key.getTypeUrl() +
+            ' is not supported. This key manager supports ' +
+            this.getKeyType() + '.');
+      }
+      try {
+        deserializedKey = PbAesCtrHmacAeadKey.deserializeBinary(key.getValue());
+      } catch (e) {
+        throw new SecurityException(
+            'Could not parse the key in key data as a serialized proto of ' +
+            AesCtrHmacAeadKeyManager.KEY_TYPE);
+      }
+      if (deserializedKey === null || deserializedKey === undefined) {
+        throw new SecurityException(
+            'Could not parse the key in key data as a serialized proto of ' +
+            AesCtrHmacAeadKeyManager.KEY_TYPE);
+      }
+    } else {
+      if (key instanceof PbAesCtrHmacAeadKey) {
+        deserializedKey = key;
+      } else {
+        throw new SecurityException('Given key type is not supported. ' +
+          'This key manager supports ' + this.getKeyType() + '.');
+      }
+    }
+
+    const aesCtrKey = deserializedKey.getAesCtrKey();
+    this.validateAesCtrKey_(aesCtrKey);
+    const hmacKey = deserializedKey.getHmacKey();
+    this.validateHmacKey_(hmacKey);
+
+    let /** string */ hashType;
+    switch (hmacKey.getParams().getHash()) {
+      case PbHashType.SHA1:
+        hashType = 'SHA-1';
+        break;
+      case PbHashType.SHA256:
+        hashType = 'SHA-256';
+        break;
+      case PbHashType.SHA512:
+        hashType = 'SHA-512';
+        break;
+      default:
+        hashType = 'UNKNOWN HASH';
+    }
+
+    const aead = await EncryptThenAuthenticate.newAesCtrHmac(
+        aesCtrKey.getKeyValue_asU8(), aesCtrKey.getParams().getIvSize(),
+        hashType, hmacKey.getKeyValue_asU8(), hmacKey.getParams().getTagSize());
+
+    return aead;
+  }
+
+  /**
+   * @override
+   */
+  doesSupport(keyType) {
+    return keyType === this.getKeyType();
+  }
+
+  /**
+   * @override
+   */
+  getKeyType() {
+    return AesCtrHmacAeadKeyManager.KEY_TYPE;
+  }
+
+  /**
+   * @override
+   */
+  getPrimitiveType() {
+    return AesCtrHmacAeadKeyManager.SUPPORTED_PRIMITIVE_;
+  }
+
+  /**
+   * @override
+   */
+  getVersion() {
+    return AesCtrHmacAeadKeyManager.VERSION_;
+  }
+
+  /**
+   * @override
+   */
+  getKeyFactory() {
+    return this.keyFactory_;
+  }
+
+  // helper functions
+  /**
+   * Checks the parameters and size of a given AES-CTR key.
+   *
+   * @param {null|!PbAesCtrKey} key
+   * @private
+   */
+  validateAesCtrKey_(key) {
+    if (!key) {
+      throw new SecurityException(
+          'Invalid AES CTR HMAC key format: key undefined');
+    }
+
+    Validators.validateVersion(key.getVersion(), this.getVersion());
+
+    let keyFormat = new PbAesCtrKeyFormat()
+                        .setParams(key.getParams())
+                        .setKeySize(key.getKeyValue_asU8().length);
+    this.keyFactory_.validateAesCtrKeyFormat(keyFormat);
+  }
+
+
+  /**
+   * Checks the parameters and size of a given HMAC key.
+   *
+   * @param {null|!PbHmacKey} key
+   * @private
+   */
+  validateHmacKey_(key) {
+    if (!key) {
+      throw new SecurityException(
+          'Invalid AES CTR HMAC key format: key undefined');
+    }
+
+    Validators.validateVersion(key.getVersion(), this.getVersion());
+
+    let keyFormat = new PbHmacKeyFormat()
+                        .setParams(key.getParams())
+                        .setKeySize(key.getKeyValue_asU8().length);
+    this.keyFactory_.validateHmacKeyFormat(keyFormat);
+  }
+
+  static register() {
+    Registry.registerKeyManager(new AesCtrHmacAeadKeyManager());
+  }
+}
+
+/**
+ * @const @private {!Object}
+ */
+AesCtrHmacAeadKeyManager.SUPPORTED_PRIMITIVE_ = Aead;
+
+/**
+ * @const @public {string}
+ */
+AesCtrHmacAeadKeyManager.KEY_TYPE =
+    'type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey';
+/**
+ * @const @private {number}
+ */
+AesCtrHmacAeadKeyManager.VERSION_ = 0;
+
+goog.exportSymbol(
+    'tink.aead.AesCtrHmacAeadKeyManager', AesCtrHmacAeadKeyManager);
+exports = AesCtrHmacAeadKeyManager;
diff --git a/javascript/aead/aes_ctr_hmac_aead_key_manager_test.js b/javascript/aead/aes_ctr_hmac_aead_key_manager_test.js
new file mode 100644
index 0000000..75bd7d6
--- /dev/null
+++ b/javascript/aead/aes_ctr_hmac_aead_key_manager_test.js
@@ -0,0 +1,614 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.aead.AesCtrHmacAeadKeyManagerTest');
+goog.setTestOnly('tink.aead.AesCtrHmacAeadKeyManagerTest');
+
+const Aead = goog.require('tink.Aead');
+const AesCtrHmacAeadKeyManager = goog.require('tink.aead.AesCtrHmacAeadKeyManager');
+const Mac = goog.require('tink.Mac');
+const PbAesCtrHmacAeadKey = goog.require('proto.google.crypto.tink.AesCtrHmacAeadKey');
+const PbAesCtrHmacAeadKeyFormat = goog.require('proto.google.crypto.tink.AesCtrHmacAeadKeyFormat');
+const PbAesCtrKey = goog.require('proto.google.crypto.tink.AesCtrKey');
+const PbAesCtrKeyFormat = goog.require('proto.google.crypto.tink.AesCtrKeyFormat');
+const PbAesCtrParams = goog.require('proto.google.crypto.tink.AesCtrParams');
+const PbHashType = goog.require('proto.google.crypto.tink.HashType');
+const PbHmacKey = goog.require('proto.google.crypto.tink.HmacKey');
+const PbHmacKeyFormat = goog.require('proto.google.crypto.tink.HmacKeyFormat');
+const PbHmacParams = goog.require('proto.google.crypto.tink.HmacParams');
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const Random = goog.require('tink.subtle.Random');
+const testSuite = goog.require('goog.testing.testSuite');
+
+const KEY_TYPE = 'type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey';
+const VERSION = 0;
+
+/////////////////////////////////////////////////////////////////////////////
+// Helper functions for tests
+
+/**
+ * creates new AesCtrHmacAeadKeyFormat with allowed parameters
+ * @return {!PbAesCtrHmacAeadKeyFormat}
+ */
+const createTestKeyFormat = function() {
+  const KEY_SIZE = 16;
+  const IV_SIZE = 12;
+  const TAG_SIZE = 16;
+
+
+  let keyFormat = new PbAesCtrHmacAeadKeyFormat().setAesCtrKeyFormat(
+      new PbAesCtrKeyFormat());
+  keyFormat.getAesCtrKeyFormat().setKeySize(KEY_SIZE);
+  keyFormat.getAesCtrKeyFormat().setParams(new PbAesCtrParams());
+  keyFormat.getAesCtrKeyFormat().getParams().setIvSize(IV_SIZE);
+
+  // set HMAC key
+  keyFormat.setHmacKeyFormat(new PbHmacKeyFormat());
+  keyFormat.getHmacKeyFormat().setKeySize(KEY_SIZE);
+  keyFormat.getHmacKeyFormat().setParams(new PbHmacParams());
+  keyFormat.getHmacKeyFormat().getParams().setHash(PbHashType.SHA1);
+  keyFormat.getHmacKeyFormat().getParams().setTagSize(TAG_SIZE);
+
+  return keyFormat;
+};
+
+/**
+ * creates new AesCtrHmacAeadKey with allowed parameters
+ * @return {!PbAesCtrHmacAeadKey}
+ */
+const createTestKey = function() {
+  const KEY_SIZE = 16;
+  const IV_SIZE = 12;
+  const TAG_SIZE = 16;
+
+
+  let key =
+      new PbAesCtrHmacAeadKey().setVersion(0).setAesCtrKey(new PbAesCtrKey());
+  key.getAesCtrKey().setVersion(0);
+  key.getAesCtrKey().setParams(new PbAesCtrParams());
+  key.getAesCtrKey().getParams().setIvSize(IV_SIZE);
+  key.getAesCtrKey().setKeyValue(Random.randBytes(KEY_SIZE));
+
+  // set HMAC key
+  key.setHmacKey(new PbHmacKey());
+  key.getHmacKey().setVersion(0);
+  key.getHmacKey().setParams(new PbHmacParams());
+  key.getHmacKey().getParams().setHash(PbHashType.SHA1);
+  key.getHmacKey().getParams().setTagSize(TAG_SIZE);
+  key.getHmacKey().setKeyValue(Random.randBytes(KEY_SIZE));
+
+  return key;
+};
+
+/**
+ * creates new PbKeyData with allowed parameters
+ * @return {!PbKeyData}
+ */
+const createTestKeyData = function() {
+  let keyData = new PbKeyData()
+                    .setTypeUrl(KEY_TYPE)
+                    .setValue(createTestKey().serializeBinary())
+                    .setKeyMaterialType(PbKeyData.KeyMaterialType.SYMMETRIC);
+
+  return keyData;
+};
+
+testSuite({
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for newKey method
+
+  // newKey method -- key formats
+  async testNewKeyBadKeyFormat() {
+    const keyFormat = new PbAesCtrKeyFormat();
+    const manager = new AesCtrHmacAeadKeyManager();
+
+    try {
+      manager.getKeyFactory().newKey(keyFormat);
+    } catch (e) {
+      assertEquals(
+          'CustomError: Expected AesCtrHmacAeadKeyFormat-proto', e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testNewKeyBadSerializedKey() {
+    // this is not a serialized key format
+    const serializedKeyFormat = new Uint8Array(4);
+    const manager = new AesCtrHmacAeadKeyManager();
+
+    try {
+      manager.getKeyFactory().newKey(serializedKeyFormat);
+    } catch (e) {
+      assertEquals(
+          'CustomError: Could not parse the given Uint8Array as a serialized' +
+              ' proto of ' + KEY_TYPE,
+          e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  // newKey method -- bad parametrs of AES CTR KEY format
+  async testNewKeyNotSupportedAesCtrKeySize() {
+    const /** number */ keySize = 11;
+    const manager = new AesCtrHmacAeadKeyManager();
+
+    let keyFormat = createTestKeyFormat();
+    keyFormat.getAesCtrKeyFormat().setKeySize(keySize);
+
+    try {
+      manager.getKeyFactory().newKey(keyFormat);
+    } catch (e) {
+      assertEquals(
+          'CustomError: unsupported AES key size: ' + keySize, e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testNewKeyIvSizeOutOfRange() {
+    const /** Array<number> */ ivSizeOutOfRange = [10, 18];
+    const manager = new AesCtrHmacAeadKeyManager();
+
+    let keyFormat = createTestKeyFormat();
+
+    const ivSizeOutOfRangeLength = ivSizeOutOfRange.length;
+    for (let i = 0; i < ivSizeOutOfRangeLength; i++) {
+      keyFormat.getAesCtrKeyFormat().getParams().setIvSize(ivSizeOutOfRange[i]);
+      try {
+        manager.getKeyFactory().newKey(keyFormat);
+      } catch (e) {
+        assertEquals(
+            'CustomError: Invalid AES CTR HMAC key format: IV size is ' +
+                'out of range: ' + ivSizeOutOfRange[i],
+            e.toString());
+        continue;
+      }
+      fail('An exception should be thrown.');
+    }
+  },
+
+
+  // newKey method -- bad parametrs of HMAC KEY format
+  async testNewKeySmallHmacKeySize() {
+    const /** number */ keySize = 11;
+    const manager = new AesCtrHmacAeadKeyManager();
+
+    let keyFormat = createTestKeyFormat();
+    keyFormat.getHmacKeyFormat().setKeySize(keySize);
+
+    try {
+      manager.getKeyFactory().newKey(keyFormat);
+    } catch (e) {
+      assertEquals(
+          'CustomError: Invalid AES CTR HMAC key format: HMAC key is' +
+              ' too small: ' + keySize,
+          e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testNewKeyHashTypeUnsupported() {
+    const manager = new AesCtrHmacAeadKeyManager();
+
+    let keyFormat = createTestKeyFormat();
+    keyFormat.getHmacKeyFormat().getParams().setHash(PbHashType.UNKNOWN_HASH);
+
+    try {
+      manager.getKeyFactory().newKey(keyFormat);
+    } catch (e) {
+      assertEquals('CustomError: Unknown hash type.', e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testNewKeySmallTagSize() {
+    const SMALL_TAG_SIZE = 8;
+    const manager = new AesCtrHmacAeadKeyManager();
+
+    let keyFormat = createTestKeyFormat();
+    keyFormat.getHmacKeyFormat().getParams().setTagSize(SMALL_TAG_SIZE);
+
+    try {
+      manager.getKeyFactory().newKey(keyFormat);
+    } catch (e) {
+      assertEquals(
+          'CustomError: Invalid HMAC params: tag size ' + SMALL_TAG_SIZE +
+              ' is too small.',
+          e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testNewKeyBigTagSizeForHashType() {
+    const tagSizes = [
+      {'hashType': PbHashType.SHA1, 'tagSize': 22},
+      {'hashType': PbHashType.SHA256, 'tagSize': 34},
+      {'hashType': PbHashType.SHA512, 'tagSize': 66},
+    ];
+    const manager = new AesCtrHmacAeadKeyManager();
+
+    let keyFormat = createTestKeyFormat();
+
+    const tagSizesLength = tagSizes.length;
+    for (let i = 0; i < tagSizesLength; i++) {
+      keyFormat.getHmacKeyFormat().getParams().setHash(tagSizes[i]['hashType']);
+      keyFormat.getHmacKeyFormat().getParams().setTagSize(
+          tagSizes[i]['tagSize']);
+      try {
+        manager.getKeyFactory().newKey(keyFormat);
+      } catch (e) {
+        assertEquals(
+            'CustomError: Invalid HMAC params: tag size ' +
+                tagSizes[i]['tagSize'] + ' is out of range.',
+            e.toString());
+        continue;
+      }
+      fail('An exception should be thrown.');
+    }
+  },
+
+  async testNewKeyViaFormatProto() {
+    const manager = new AesCtrHmacAeadKeyManager();
+
+    const keyFormat = createTestKeyFormat();
+
+    const key = /** @type {!PbAesCtrHmacAeadKey}*/ (
+        manager.getKeyFactory().newKey(keyFormat));
+
+    // testing AES CTR key
+    assertEquals(
+        keyFormat.getAesCtrKeyFormat().getKeySize(),
+        key.getAesCtrKey().getKeyValue().length);
+    assertEquals(0, key.getAesCtrKey().getVersion());
+    assertEquals(
+        keyFormat.getAesCtrKeyFormat().getParams().getIvSize(),
+        key.getAesCtrKey().getParams().getIvSize());
+
+
+    // testing HMAC key
+    assertEquals(
+        keyFormat.getHmacKeyFormat().getKeySize(),
+        key.getHmacKey().getKeyValue().length);
+    assertEquals(0, key.getHmacKey().getVersion());
+    assertEquals(
+        keyFormat.getHmacKeyFormat().getParams().getHash(),
+        key.getHmacKey().getParams().getHash());
+    assertEquals(
+        keyFormat.getHmacKeyFormat().getParams().getTagSize(),
+        key.getHmacKey().getParams().getTagSize());
+  },
+
+  async testNewKeyViaSerializedFormatProto() {
+    const manager = new AesCtrHmacAeadKeyManager();
+
+    const keyFormat = createTestKeyFormat();
+    const serializedKeyFormat = keyFormat.serializeBinary();
+
+    const key = /** @type {!PbAesCtrHmacAeadKey} */ (
+        manager.getKeyFactory().newKey(serializedKeyFormat));
+
+    // testing AES CTR key
+    assertEquals(
+        keyFormat.getAesCtrKeyFormat().getKeySize(),
+        key.getAesCtrKey().getKeyValue().length);
+    assertEquals(0, key.getAesCtrKey().getVersion());
+    assertEquals(
+        keyFormat.getAesCtrKeyFormat().getParams().getIvSize(),
+        key.getAesCtrKey().getParams().getIvSize());
+
+
+    // testing HMAC key
+    assertEquals(
+        keyFormat.getHmacKeyFormat().getKeySize(),
+        key.getHmacKey().getKeyValue().length);
+    assertEquals(0, key.getHmacKey().getVersion());
+    assertEquals(
+        keyFormat.getHmacKeyFormat().getParams().getHash(),
+        key.getHmacKey().getParams().getHash());
+    assertEquals(
+        keyFormat.getHmacKeyFormat().getParams().getTagSize(),
+        key.getHmacKey().getParams().getTagSize());
+  },
+
+
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for NewKeyData method
+
+  async testNewKeyDataBadSerializedKey() {
+    const serializedKeyFormats = [new Uint8Array(1), new Uint8Array(0)];
+    const aeadKeyManager = new AesCtrHmacAeadKeyManager();
+
+    const serializedKeyFormatsLength = serializedKeyFormats.length;
+    for (let i = 0; i < serializedKeyFormatsLength; i++) {
+      try {
+        aeadKeyManager.getKeyFactory().newKeyData(serializedKeyFormats[i]);
+      } catch (e) {
+        assertEquals(
+            'CustomError: Could not parse the given Uint8Array as a ' +
+                'serialized proto of ' + KEY_TYPE,
+            e.toString());
+        continue;
+      }
+      fail(
+          'An exception should be thrown for the string: ' +
+          serializedKeyFormats[i]);
+    }
+  },
+
+  async testNewKeyDataFromValidKey() {
+    const keyFormat = createTestKeyFormat();
+    const serializedKeyFormat = keyFormat.serializeBinary();
+    const manager = new AesCtrHmacAeadKeyManager();
+
+    const keyData = manager.getKeyFactory().newKeyData(serializedKeyFormat);
+
+    assertEquals(KEY_TYPE, keyData.getTypeUrl());
+    assertEquals(
+        PbKeyData.KeyMaterialType.SYMMETRIC, keyData.getKeyMaterialType());
+
+    const key = PbAesCtrHmacAeadKey.deserializeBinary(keyData.getValue());
+
+    assertEquals(
+        keyFormat.getAesCtrKeyFormat().getKeySize(),
+        key.getAesCtrKey().getKeyValue().length);
+    assertEquals(
+        keyFormat.getHmacKeyFormat().getKeySize(),
+        key.getHmacKey().getKeyValue().length);
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for getPrimitive method
+
+  async testGetPrimitiveUnsupportedKeyDataType() {
+    const aeadKeyManager = new AesCtrHmacAeadKeyManager();
+    let keyData = createTestKeyData().setTypeUrl('bad type url');
+
+    try {
+      await aeadKeyManager.getPrimitive(Aead, keyData);
+    } catch (e) {
+      assertEquals(
+          'CustomError: Key type ' + keyData.getTypeUrl() +
+          ' is not supported. This key manager supports ' +
+          KEY_TYPE + '.', e.toString());
+      return;
+    }
+    fail('An exception should be thrown');
+  },
+
+  async testGetPrimitiveUnsupportedKeyType() {
+    const aeadKeyManager = new AesCtrHmacAeadKeyManager();
+    let key = new PbAesCtrKey();
+
+    try {
+      await aeadKeyManager.getPrimitive(Aead, key);
+    } catch (e) {
+      assertEquals(
+          'CustomError: Given key type is not supported. ' +
+          'This key manager supports ' + KEY_TYPE + '.', e.toString());
+      return;
+    }
+    fail('An exception should be thrown');
+  },
+
+  async testGetPrimitiveBadVersion() {
+    const version = 1;
+    const aeadKeyManager = new AesCtrHmacAeadKeyManager();
+    let /** PbAesCtrHmacAeadKey */ key = createTestKey();
+
+    key.getAesCtrKey().setVersion(version);
+
+    try {
+      await aeadKeyManager.getPrimitive(Aead, key);
+    } catch (e) {
+      assertEquals(
+          'CustomError: Version is out of bound, must be between 0 ' +
+              'and ' + VERSION + '.',
+          e.toString());
+      return;
+    }
+    fail('An exception should be thrown');
+  },
+
+  async testGetPrimitiveShortAesCtrKey() {
+    const keySize = 5;
+    const aeadKeyManager = new AesCtrHmacAeadKeyManager();
+    let /** PbAesCtrHmacAeadKey */ key = createTestKey();
+
+    key.getAesCtrKey().setKeyValue(new Uint8Array(keySize));
+
+    try {
+      await aeadKeyManager.getPrimitive(Aead, key);
+    } catch (e) {
+      assertEquals(
+          'CustomError: unsupported AES key size: ' + keySize, e.toString());
+      return;
+    }
+    fail('An exception should be thrown');
+  },
+
+  async testGetPrimitiveAesCtrKeySmallIvSize() {
+    const /** Array<number> */ ivSizeOutOfRange = [9, 19];
+    const manager = new AesCtrHmacAeadKeyManager();
+    let /** PbAesCtrHmacAeadKey */ key = createTestKey();
+
+    const ivSizeOutOfRangeLength = ivSizeOutOfRange.length;
+    for (let i = 0; i < ivSizeOutOfRangeLength; i++) {
+      key.getAesCtrKey().getParams().setIvSize(ivSizeOutOfRange[i]);
+      try {
+        await manager.getPrimitive(Aead, key);
+      } catch (e) {
+        assertEquals(
+            'CustomError: Invalid AES CTR HMAC key format: IV size is ' +
+                'out of range: ' + ivSizeOutOfRange[i],
+            e.toString());
+        continue;
+      }
+      fail('An exception should be thrown.');
+    }
+  },
+
+  async testGetPrimitiveShortHmacKey() {
+    const keySize = 5;
+    const aeadKeyManager = new AesCtrHmacAeadKeyManager();
+    let /** PbAesCtrHmacAeadKey */ key = createTestKey();
+
+    key.getHmacKey().setKeyValue(new Uint8Array(keySize));
+
+    try {
+      await aeadKeyManager.getPrimitive(Aead, key);
+    } catch (e) {
+      assertEquals(
+          'CustomError: Invalid AES CTR HMAC key format: HMAC key is' +
+              ' too small: ' + keySize,
+          e.toString());
+      return;
+    }
+    fail('An exception should be thrown');
+  },
+
+  async testGetPrimitiveHmacKeyUnsupportedHashType() {
+    const aeadKeyManager = new AesCtrHmacAeadKeyManager();
+    let /** PbAesCtrHmacAeadKey */ key = createTestKey();
+
+    key.getHmacKey().getParams().setHash(PbHashType.UNKNOWN_HASH);
+
+    try {
+      await aeadKeyManager.getPrimitive(Aead, key);
+    } catch (e) {
+      assertEquals('CustomError: Unknown hash type.', e.toString());
+      return;
+    }
+    fail('An exception should be thrown');
+  },
+
+  async testGetPrimitiveHmacKeySmallTagSize() {
+    const SMALL_TAG_SIZE = 9;
+    const aeadKeyManager = new AesCtrHmacAeadKeyManager();
+    let /** PbAesCtrHmacAeadKey */ key = createTestKey();
+
+    key.getHmacKey().getParams().setTagSize(SMALL_TAG_SIZE);
+
+    try {
+      await aeadKeyManager.getPrimitive(Aead, key);
+    } catch (e) {
+      assertEquals(
+          'CustomError: Invalid HMAC params: tag size ' + SMALL_TAG_SIZE +
+              ' is too small.',
+          e.toString());
+      return;
+    }
+    fail('An exception should be thrown');
+  },
+
+  async testGetPrimitiveHmacBigTagSize() {
+    const tagSizes = [
+      {'hashType': PbHashType.SHA1, 'tagSize': 22},
+      {'hashType': PbHashType.SHA256, 'tagSize': 34},
+      {'hashType': PbHashType.SHA512, 'tagSize': 66},
+    ];
+    const manager = new AesCtrHmacAeadKeyManager();
+
+    let /** PbAesCtrHmacAeadKey */ key = createTestKey();
+
+    const tagSizesLength = tagSizes.length;
+    for (let i = 0; i < tagSizesLength; i++) {
+      key.getHmacKey().getParams().setHash(tagSizes[i]['hashType']);
+      key.getHmacKey().getParams().setTagSize(tagSizes[i]['tagSize']);
+      try {
+        await manager.getPrimitive(Aead, key);
+      } catch (e) {
+        assertEquals(
+            'CustomError: Invalid HMAC params: tag size ' +
+                tagSizes[i]['tagSize'] + ' is out of range.',
+            e.toString());
+        continue;
+      }
+      fail('An exception should be thrown.');
+    }
+  },
+
+  // tests for getting primitive from valid key/keyData
+  async testGetPrimitiveFromKey() {
+    const aeadKeyManager = new AesCtrHmacAeadKeyManager();
+    const key = createTestKey();
+    const plaintext = Random.randBytes(8);
+    const aad = Random.randBytes(8);
+
+    const /** Aead */ primitive = await aeadKeyManager.getPrimitive(Aead, key);
+    const ciphertext = await primitive.encrypt(plaintext, aad);
+    const decryptedCiphertext = await primitive.decrypt(ciphertext, aad);
+
+    assertObjectEquals(plaintext, decryptedCiphertext);
+  },
+
+  async testGetPrimitiveFromKeyData() {
+    const aeadKeyManager = new AesCtrHmacAeadKeyManager();
+    const keyData = createTestKeyData();
+    const plaintext = Random.randBytes(8);
+    const aad = Random.randBytes(8);
+
+    const /** Aead */ primitive =
+        await aeadKeyManager.getPrimitive(Aead, keyData);
+    const ciphertext = await primitive.encrypt(plaintext, aad);
+    const decryptedCiphertext = await primitive.decrypt(ciphertext, aad);
+
+    assertObjectEquals(plaintext, decryptedCiphertext);
+  },
+
+  async testGetPrimitiveUnsupportedPrimitive() {
+    const manager = new AesCtrHmacAeadKeyManager();
+    const keyData = createTestKeyData();
+
+    try {
+      await manager.getPrimitive(Mac, keyData);
+    } catch (e) {
+      assertEquals(
+          'CustomError: Requested primitive type which is not ' +
+              'supported by this key manager.',
+          e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for getVersion, getKeyType and doesSupport methods
+
+  async testGetVersionShouldBeZero() {
+    const manager = new AesCtrHmacAeadKeyManager();
+    assertEquals(0, manager.getVersion());
+  },
+
+  async testGetKeyTypeShouldBeAesCtrHmacAeadKey() {
+    const manager = new AesCtrHmacAeadKeyManager();
+    assertEquals(KEY_TYPE, manager.getKeyType());
+  },
+
+  async testDoesSupportShouldSupportAesCtrHmacAeadKey() {
+    const manager = new AesCtrHmacAeadKeyManager();
+    assertTrue(manager.doesSupport(KEY_TYPE));
+  },
+
+  async testGetPrimitiveTypeShouldBeAead() {
+    const manager = new AesCtrHmacAeadKeyManager();
+    assertEquals(Aead, manager.getPrimitiveType());
+  },
+});
diff --git a/javascript/aead/aes_ctr_hmac_aead_key_templates.js b/javascript/aead/aes_ctr_hmac_aead_key_templates.js
new file mode 100644
index 0000000..8f165dd
--- /dev/null
+++ b/javascript/aead/aes_ctr_hmac_aead_key_templates.js
@@ -0,0 +1,121 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.aead.AesCtrHmacAeadKeyTemplates');
+
+const AesCtrHmacAeadKeyManager = goog.require('tink.aead.AesCtrHmacAeadKeyManager');
+const PbAesCtrHmacAeadKeyFormat = goog.require('proto.google.crypto.tink.AesCtrHmacAeadKeyFormat');
+const PbAesCtrKeyFormat = goog.require('proto.google.crypto.tink.AesCtrKeyFormat');
+const PbAesCtrParams = goog.require('proto.google.crypto.tink.AesCtrParams');
+const PbHashType = goog.require('proto.google.crypto.tink.HashType');
+const PbHmacKeyFormat = goog.require('proto.google.crypto.tink.HmacKeyFormat');
+const PbHmacParams = goog.require('proto.google.crypto.tink.HmacParams');
+const PbKeyTemplate = goog.require('proto.google.crypto.tink.KeyTemplate');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+
+/**
+ * Pre-generated KeyTemplates for AES CTR HMAC AEAD keys.
+ *
+ * @final
+ */
+class AesCtrHmacAeadKeyTemplates {
+  /**
+   * Returns a KeyTemplate that generates new instances of AesCtrHmacAeadKey
+   * with the following parameters:
+   *    AES key size: 16 bytes
+   *    AES IV size: 16 bytes
+   *    HMAC key size: 32 bytes
+   *    HMAC tag size: 16 bytes
+   *    HMAC hash function: SHA256
+   *    OutputPrefixType: TINK
+   *
+   * @return {!PbKeyTemplate}
+   */
+  static aes128CtrHmacSha256() {
+    return AesCtrHmacAeadKeyTemplates.newAesCtrHmacSha256KeyTemplate_(
+        /* aesKeySize = */ 16,
+        /* ivSize = */ 16,
+        /* hmacKeySize = */ 32,
+        /* tagSize = */ 16);
+  }
+
+  /**
+   * Returns a KeyTemplate that generates new instances of AesCtrHmacAeadKey
+   * with the following parameters:
+   *    AES key size: 32 bytes
+   *    AES IV size: 16 bytes
+   *    HMAC key size: 32 bytes
+   *    HMAC tag size: 32 bytes
+   *    HMAC hash function: SHA256
+   *    OutputPrefixType: TINK
+   *
+   * @return {!PbKeyTemplate}
+   */
+  static aes256CtrHmacSha256() {
+    return AesCtrHmacAeadKeyTemplates.newAesCtrHmacSha256KeyTemplate_(
+        /* aesKeySize = */ 32,
+        /* ivSize = */ 16,
+        /* hmacKeySize = */ 32,
+        /* tagSize = */ 32);
+  }
+
+  /**
+   * @private
+   *
+   * @param {number} aesKeySize
+   * @param {number} ivSize
+   * @param {number} hmacKeySize
+   * @param {number} tagSize
+   *
+   * @return {!PbKeyTemplate}
+   */
+  static newAesCtrHmacSha256KeyTemplate_(
+      aesKeySize, ivSize, hmacKeySize, tagSize) {
+    // Define AES CTR key format.
+    const aesCtrKeyFormat = new PbAesCtrKeyFormat()
+                                .setKeySize(aesKeySize)
+                                .setParams(new PbAesCtrParams());
+    aesCtrKeyFormat.getParams().setIvSize(ivSize);
+
+    // Define HMAC key format.
+    const hmacKeyFormat = new PbHmacKeyFormat()
+                              .setKeySize(hmacKeySize)
+                              .setParams(new PbHmacParams());
+    hmacKeyFormat.getParams().setTagSize(tagSize);
+    hmacKeyFormat.getParams().setHash(PbHashType.SHA256);
+
+    // Define AES CTR HMAC AEAD key format.
+    const keyFormat = new PbAesCtrHmacAeadKeyFormat()
+                          .setAesCtrKeyFormat(aesCtrKeyFormat)
+                          .setHmacKeyFormat(hmacKeyFormat);
+
+    // Define key template.
+    const keyTemplate = new PbKeyTemplate()
+                            .setTypeUrl(AesCtrHmacAeadKeyManager.KEY_TYPE)
+                            .setOutputPrefixType(PbOutputPrefixType.TINK)
+                            .setValue(keyFormat.serializeBinary());
+
+    return keyTemplate;
+  }
+}
+
+goog.exportProperty(
+    AesCtrHmacAeadKeyTemplates, 'aes128CtrHmacSha256',
+    AesCtrHmacAeadKeyTemplates.aes128CtrHmacSha256);
+goog.exportProperty(
+    AesCtrHmacAeadKeyTemplates, 'aes256CtrHmacSha256',
+    AesCtrHmacAeadKeyTemplates.aes256CtrHmacSha256);
+goog.exportSymbol(
+    'tink.aead.AesCtrHmacAeadKeyTemplates', AesCtrHmacAeadKeyTemplates);
+exports = AesCtrHmacAeadKeyTemplates;
diff --git a/javascript/aead/aes_ctr_hmac_aead_key_templates_test.js b/javascript/aead/aes_ctr_hmac_aead_key_templates_test.js
new file mode 100644
index 0000000..901c8da
--- /dev/null
+++ b/javascript/aead/aes_ctr_hmac_aead_key_templates_test.js
@@ -0,0 +1,101 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.aead.AesCtrHmacAeadKeyTemplatesTest');
+goog.setTestOnly('tink.aead.AesCtrHmacAeadKeyTemplatesTest');
+
+const AesCtrHmacAeadKeyManager = goog.require('tink.aead.AesCtrHmacAeadKeyManager');
+const AesCtrHmacAeadKeyTemplates = goog.require('tink.aead.AesCtrHmacAeadKeyTemplates');
+const PbAesCtrHmacAeadKeyFormat = goog.require('proto.google.crypto.tink.AesCtrHmacAeadKeyFormat');
+const PbHashType = goog.require('proto.google.crypto.tink.HashType');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+
+  testAes128CtrHmacSha256() {
+    // Expects function to create key with following parameters.
+    const expectedAesKeySize = 16;
+    const expectedIvSize = 16;
+    const expectedHmacKeySize = 32;
+    const expectedTagSize = 16;
+    const expectedHashFunction = PbHashType.SHA256;
+    const expectedOutputPrefix = PbOutputPrefixType.TINK;
+
+    // Expected type URL is the one supported by AesCtrHmacAeadKeyManager.
+    const manager = new AesCtrHmacAeadKeyManager();
+    const expectedTypeUrl = manager.getKeyType();
+
+    const keyTemplate = AesCtrHmacAeadKeyTemplates.aes128CtrHmacSha256();
+
+    assertEquals(expectedTypeUrl, keyTemplate.getTypeUrl());
+    assertEquals(expectedOutputPrefix, keyTemplate.getOutputPrefixType());
+
+    // Test values in key format.
+    const keyFormat = PbAesCtrHmacAeadKeyFormat.deserializeBinary(
+        keyTemplate.getValue_asU8());
+
+    // Test AesCtrKeyFormat.
+    const aesCtrKeyFormat = keyFormat.getAesCtrKeyFormat();
+    assertEquals(expectedAesKeySize, aesCtrKeyFormat.getKeySize());
+    assertEquals(expectedIvSize, aesCtrKeyFormat.getParams().getIvSize());
+
+    // Test HmacKeyFormat.
+    const hmacKeyFormat = keyFormat.getHmacKeyFormat();
+    assertEquals(expectedHmacKeySize, hmacKeyFormat.getKeySize());
+    assertEquals(expectedTagSize, hmacKeyFormat.getParams().getTagSize());
+    assertEquals(expectedHashFunction, hmacKeyFormat.getParams().getHash());
+
+    // Test that the template works with AesCtrHmacAeadKeyManager.
+    manager.getKeyFactory().newKey(keyTemplate.getValue_asU8());
+  },
+
+  testAes256CtrHmacSha256() {
+    // Expects function to create key with following parameters.
+    const expectedAesKeySize = 32;
+    const expectedIvSize = 16;
+    const expectedHmacKeySize = 32;
+    const expectedTagSize = 32;
+    const expectedHashFunction = PbHashType.SHA256;
+    const expectedOutputPrefix = PbOutputPrefixType.TINK;
+
+    // Expected type URL is the one supported by AesCtrHmacAeadKeyManager.
+    const manager = new AesCtrHmacAeadKeyManager();
+    const expectedTypeUrl = manager.getKeyType();
+
+    const keyTemplate = AesCtrHmacAeadKeyTemplates.aes256CtrHmacSha256();
+
+    assertEquals(expectedTypeUrl, keyTemplate.getTypeUrl());
+    assertEquals(expectedOutputPrefix, keyTemplate.getOutputPrefixType());
+
+    // Test values in key format.
+    const keyFormat = PbAesCtrHmacAeadKeyFormat.deserializeBinary(
+        keyTemplate.getValue_asU8());
+
+    // Test AesCtrKeyFormat.
+    const aesCtrKeyFormat = keyFormat.getAesCtrKeyFormat();
+    assertEquals(expectedAesKeySize, aesCtrKeyFormat.getKeySize());
+    assertEquals(expectedIvSize, aesCtrKeyFormat.getParams().getIvSize());
+
+    // Test HmacKeyFormat.
+    const hmacKeyFormat = keyFormat.getHmacKeyFormat();
+    assertEquals(expectedHmacKeySize, hmacKeyFormat.getKeySize());
+    assertEquals(expectedTagSize, hmacKeyFormat.getParams().getTagSize());
+    assertEquals(expectedHashFunction, hmacKeyFormat.getParams().getHash());
+
+    // Test that the template works with AesCtrHmacAeadKeyManager.
+    manager.getKeyFactory().newKey(keyTemplate.getValue_asU8());
+  },
+});
diff --git a/javascript/aead/aes_gcm_key_manager.js b/javascript/aead/aes_gcm_key_manager.js
new file mode 100644
index 0000000..d1b3619
--- /dev/null
+++ b/javascript/aead/aes_gcm_key_manager.js
@@ -0,0 +1,238 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.aead.AesGcmKeyManager');
+
+const Aead = goog.require('tink.Aead');
+const AesGcm = goog.require('tink.subtle.AesGcm');
+const KeyManager = goog.require('tink.KeyManager');
+const PbAesGcmKey = goog.require('proto.google.crypto.tink.AesGcmKey');
+const PbAesGcmKeyFormat = goog.require('proto.google.crypto.tink.AesGcmKeyFormat');
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const PbMessage = goog.require('jspb.Message');
+const Random = goog.require('tink.subtle.Random');
+const Registry = goog.require('tink.Registry');
+const SecurityException = goog.require('tink.exception.SecurityException');
+const Validators = goog.require('tink.subtle.Validators');
+
+/**
+ * @final
+ * @implements {KeyManager.KeyFactory}
+ */
+class AesGcmKeyFactory {
+  /** @override */
+  newKey(keyFormat) {
+    const keyFormatProto = AesGcmKeyFactory.getKeyFormatProto_(keyFormat);
+
+    AesGcmKeyFactory.validateKeyFormat_(keyFormatProto);
+
+    const key = new PbAesGcmKey()
+                    .setKeyValue(Random.randBytes(keyFormatProto.getKeySize()))
+                    .setVersion(AesGcmKeyManager.VERSION_);
+
+    return key;
+  }
+
+  /** @override */
+  newKeyData(serializedKeyFormat) {
+    const key = /** @type {!PbAesGcmKey} */ (this.newKey(serializedKeyFormat));
+    const keyData =
+        new PbKeyData()
+            .setTypeUrl(AesGcmKeyManager.KEY_TYPE)
+            .setValue(key.serializeBinary())
+            .setKeyMaterialType(PbKeyData.KeyMaterialType.SYMMETRIC);
+
+    return keyData;
+  }
+
+  /**
+   * @private
+   * @param {!PbAesGcmKeyFormat} keyFormat
+   */
+  static validateKeyFormat_(keyFormat) {
+    Validators.validateAesKeySize(keyFormat.getKeySize());
+  }
+
+  /**
+   * The input keyFormat is either deserialized (in case that the input is
+   * Uint8Array) or checked to be an AesGcmKeyFormat-proto (otherwise).
+   *
+   * @private
+   * @param {!PbMessage|!Uint8Array} keyFormat
+   * @return {!PbAesGcmKeyFormat}
+   */
+  static getKeyFormatProto_(keyFormat) {
+    if (keyFormat instanceof Uint8Array) {
+      return AesGcmKeyFactory.deserializeKeyFormat_(keyFormat);
+    } else {
+      if (keyFormat instanceof PbAesGcmKeyFormat) {
+        return keyFormat;
+      } else {
+        throw new SecurityException('Expected AesGcmKeyFormat-proto');
+      }
+    }
+  }
+
+  /**
+   * @private
+   * @param {!Uint8Array} keyFormat
+   * @return {!PbAesGcmKeyFormat}
+   */
+  static deserializeKeyFormat_(keyFormat) {
+    let /** !PbAesGcmKeyFormat */ keyFormatProto;
+    try {
+      keyFormatProto = PbAesGcmKeyFormat.deserializeBinary(keyFormat);
+    } catch (e) {
+      throw new SecurityException(
+          'Could not parse the input as a serialized proto of ' +
+          AesGcmKeyManager.KEY_TYPE + ' key format.');
+    }
+    if (!keyFormatProto.getKeySize()) {
+      throw new SecurityException(
+          'Could not parse the input as a serialized proto of ' +
+          AesGcmKeyManager.KEY_TYPE + ' key format.');
+    }
+    return keyFormatProto;
+  }
+}
+
+/**
+ * @implements {KeyManager.KeyManager<Aead>}
+ * @final
+ */
+class AesGcmKeyManager {
+  /** @private */
+  constructor() {
+    /** @const @private {!AesGcmKeyFactory} */
+    this.keyFactory_ = new AesGcmKeyFactory();
+  }
+
+  /** @override */
+  async getPrimitive(primitiveType, key) {
+    if (primitiveType != this.getPrimitiveType()) {
+      throw new SecurityException(
+          'Requested primitive type which is not ' +
+          'supported by this key manager.');
+    }
+
+    const keyProto = AesGcmKeyManager.getKeyProto_(key);
+    AesGcmKeyManager.validateKey_(keyProto);
+
+    return await AesGcm.newInstance(keyProto.getKeyValue_asU8());
+  }
+
+  /** @override */
+  doesSupport(keyType) {
+    return keyType === this.getKeyType();
+  }
+
+  /** @override */
+  getKeyType() {
+    return AesGcmKeyManager.KEY_TYPE;
+  }
+
+  /** @override */
+  getPrimitiveType() {
+    return AesGcmKeyManager.SUPPORTED_PRIMITIVE_;
+  }
+
+  /** @override */
+  getVersion() {
+    return AesGcmKeyManager.VERSION_;
+  }
+
+  /** @override */
+  getKeyFactory() {
+    return this.keyFactory_;
+  }
+
+  /**
+   * @private
+   * @param {!PbAesGcmKey} key
+   */
+  static validateKey_(key) {
+    Validators.validateAesKeySize(key.getKeyValue().length);
+    Validators.validateVersion(key.getVersion(), AesGcmKeyManager.VERSION_);
+  }
+
+  /**
+   * The input key is either deserialized (in case that the input is
+   * KeyData-proto) or checked to be an AesGcmKey-proto (otherwise).
+   *
+   * @private
+   * @param {!PbMessage|!PbKeyData} keyMaterial
+   * @return {!PbAesGcmKey}
+   */
+  static getKeyProto_(keyMaterial) {
+    if (keyMaterial instanceof PbKeyData) {
+      return AesGcmKeyManager.getKeyProtoFromKeyData_(keyMaterial);
+    } else {
+      if (keyMaterial instanceof PbAesGcmKey) {
+        return keyMaterial;
+      } else {
+        throw new SecurityException(
+            'Key type is not supported. ' +
+            'This key manager supports ' + AesGcmKeyManager.KEY_TYPE + '.');
+      }
+    }
+  }
+
+  /**
+   * It validates the key type and returns a deserialized AesGcmKey-proto.
+   *
+   * @private
+   * @param {!PbKeyData} keyData
+   * @return {!PbAesGcmKey}
+   */
+  static getKeyProtoFromKeyData_(keyData) {
+    if (keyData.getTypeUrl() != AesGcmKeyManager.KEY_TYPE) {
+      throw new SecurityException(
+          'Key type ' + keyData.getTypeUrl() +
+          ' is not supported. This key manager supports ' +
+          AesGcmKeyManager.KEY_TYPE + '.');
+    }
+
+    let /** PbAesGcmKey */ deserializedKey;
+    try {
+      deserializedKey = PbAesGcmKey.deserializeBinary(keyData.getValue());
+    } catch (e) {
+      throw new SecurityException(
+          'Could not parse the input as a ' +
+          'serialized proto of ' + AesGcmKeyManager.KEY_TYPE + ' key.');
+    }
+    if (!deserializedKey.getKeyValue()) {
+      throw new SecurityException(
+          'Could not parse the input as a ' +
+          'serialized proto of ' + AesGcmKeyManager.KEY_TYPE + ' key.');
+    }
+
+    return deserializedKey;
+  }
+
+  static register() {
+    Registry.registerKeyManager(new AesGcmKeyManager());
+  }
+}
+
+/** @const @private {!Object} */
+AesGcmKeyManager.SUPPORTED_PRIMITIVE_ = Aead;
+
+/** @const @public {string} */
+AesGcmKeyManager.KEY_TYPE = 'type.googleapis.com/google.crypto.tink.AesGcmKey';
+
+/** @const @private {number} */
+AesGcmKeyManager.VERSION_ = 0;
+
+goog.exportSymbol('tink.aead.AesGcmKeyManager', AesGcmKeyManager);
+exports = AesGcmKeyManager;
diff --git a/javascript/aead/aes_gcm_key_manager_test.js b/javascript/aead/aes_gcm_key_manager_test.js
new file mode 100644
index 0000000..1a68746
--- /dev/null
+++ b/javascript/aead/aes_gcm_key_manager_test.js
@@ -0,0 +1,362 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.aead.AesGcmKeyManagerTest');
+goog.setTestOnly('tink.aead.AesGcmKeyManagerTest');
+
+const Aead = goog.require('tink.Aead');
+const AesGcmKeyManager = goog.require('tink.aead.AesGcmKeyManager');
+const Mac = goog.require('tink.Mac');
+const PbAesCtrKey = goog.require('proto.google.crypto.tink.AesCtrKey');
+const PbAesCtrKeyFormat = goog.require('proto.google.crypto.tink.AesCtrKeyFormat');
+const PbAesGcmKey = goog.require('proto.google.crypto.tink.AesGcmKey');
+const PbAesGcmKeyFormat = goog.require('proto.google.crypto.tink.AesGcmKeyFormat');
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const Random = goog.require('tink.subtle.Random');
+const testSuite = goog.require('goog.testing.testSuite');
+
+const KEY_TYPE = 'type.googleapis.com/google.crypto.tink.AesGcmKey';
+const VERSION = 0;
+const PRIMITIVE = Aead;
+
+testSuite({
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for newKey method
+
+  // newKey method -- key formats
+  testNewKey_invalidKeyFormat() {
+    const keyFormat = new PbAesCtrKeyFormat();
+    const manager = new AesGcmKeyManager();
+
+    try {
+      manager.getKeyFactory().newKey(keyFormat);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.invalidKeyFormat(), e.toString());
+    }
+  },
+
+  testNewKey_invalidSerializedKeyFormat() {
+    const keyFormat = new Uint8Array(0);
+    const manager = new AesGcmKeyManager();
+
+    try {
+      manager.getKeyFactory().newKey(keyFormat);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.invalidSerializedKeyFormat(), e.toString());
+    }
+  },
+
+
+  testNewKey_unsupportedKeySizes() {
+    const manager = new AesGcmKeyManager();
+
+    for (let keySize = 0; keySize < 40; keySize++) {
+      if (keySize === 16 || keySize === 32) {
+        // Keys of size 16 and 32 bytes are supported.
+        continue;
+      }
+      const keyFormat = createTestKeyFormat(keySize);
+
+      try {
+        manager.getKeyFactory().newKey(keyFormat);
+        fail('An exception should be thrown.');
+      } catch (e) {
+        assertEquals(ExceptionText.unsupportedKeySize(keySize), e.toString());
+      }
+    }
+  },
+
+  testNewKey_viaFormatProto() {
+    const manager = new AesGcmKeyManager();
+
+    const keyFormat = createTestKeyFormat();
+
+    const key =
+        /** @type {!PbAesGcmKey}*/ (manager.getKeyFactory().newKey(keyFormat));
+
+    assertEquals(keyFormat.getKeySize(), key.getKeyValue().length);
+  },
+
+  testNewKey_viaSerializedFormatProto() {
+    const manager = new AesGcmKeyManager();
+
+    const keyFormat = createTestKeyFormat();
+    const serializedKeyFormat = keyFormat.serializeBinary();
+
+    const key = /** @type {!PbAesGcmKey} */ (
+        manager.getKeyFactory().newKey(serializedKeyFormat));
+
+    assertEquals(keyFormat.getKeySize(), key.getKeyValue().length);
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for NewKeyData method
+
+  testNewKeyData_shouldWork() {
+    const keyFormat = createTestKeyFormat();
+    const serializedKeyFormat = keyFormat.serializeBinary();
+    const manager = new AesGcmKeyManager();
+
+    const keyData = manager.getKeyFactory().newKeyData(serializedKeyFormat);
+
+    assertEquals(KEY_TYPE, keyData.getTypeUrl());
+    assertEquals(
+        PbKeyData.KeyMaterialType.SYMMETRIC, keyData.getKeyMaterialType());
+
+    const key = PbAesGcmKey.deserializeBinary(keyData.getValue());
+
+    assertEquals(keyFormat.getKeySize(), key.getKeyValue().length);
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for getPrimitive method
+
+  async testGetPrimitive_unsupportedKeyDataType() {
+    const manager = new AesGcmKeyManager();
+    const keyData = createTestKeyData().setTypeUrl('bad_type_url');
+
+    try {
+      await manager.getPrimitive(PRIMITIVE, keyData);
+      fail('An exception should be thrown');
+    } catch (e) {
+      assertEquals(
+          ExceptionText.unsupportedKeyType(keyData.getTypeUrl()), e.toString());
+    }
+  },
+
+  async testGetPrimitive_unsupportedKeyType() {
+    const manager = new AesGcmKeyManager();
+    const key = new PbAesCtrKey();
+
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown');
+    } catch (e) {
+      assertEquals(ExceptionText.unsupportedKeyType(), e.toString());
+    }
+  },
+
+  async testGetPrimitive_badVersion() {
+    const version = 1;
+    const manager = new AesGcmKeyManager();
+    const key = createTestKey().setVersion(version);
+
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown');
+    } catch (e) {
+      assertEquals(ExceptionText.versionOutOfBounds(), e.toString());
+    }
+  },
+
+  async testGetPrimitive_unsupportedKeySizes() {
+    const manager = new AesGcmKeyManager();
+
+    for (let keySize = 0; keySize < 40; keySize++) {
+      if (keySize === 16 || keySize === 32) {
+        // Keys of sizes 16 and 32 bytes are supported.
+        continue;
+      }
+
+      const /** !PbAesGcmKey */ key = createTestKey(keySize);
+      try {
+        await manager.getPrimitive(PRIMITIVE, key);
+        fail('An exception should be thrown');
+      } catch (e) {
+        assertEquals(ExceptionText.unsupportedKeySize(keySize), e.toString());
+      }
+    }
+  },
+
+  async testGetPrimitive_badSerialization() {
+    const manager = new AesGcmKeyManager();
+    const keyData = createTestKeyData().setValue(new Uint8Array([]));
+
+    try {
+      await manager.getPrimitive(PRIMITIVE, keyData);
+      fail('An exception should be thrown');
+    } catch (e) {
+      assertEquals(ExceptionText.invalidSerializedKey(), e.toString());
+    }
+  },
+
+  async testGetPrimitive_unsupportedPrimitive() {
+    const manager = new AesGcmKeyManager();
+    const keyData = createTestKeyData();
+
+    try {
+      await manager.getPrimitive(Mac, keyData);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unsupportedPrimitive(), e.toString());
+    }
+  },
+
+
+  // Tests for getting primitive from valid key/keyData.
+  async testGetPrimitive_fromKey() {
+    const manager = new AesGcmKeyManager();
+    const key = createTestKey();
+
+    // Get the primitive from key manager.
+    const /** Aead */ primitive = await manager.getPrimitive(PRIMITIVE, key);
+
+    // Test the returned primitive.
+    const plaintext = Random.randBytes(8);
+    const aad = Random.randBytes(8);
+    const ciphertext = await primitive.encrypt(plaintext, aad);
+    const decryptedCiphertext = await primitive.decrypt(ciphertext, aad);
+
+    assertObjectEquals(plaintext, decryptedCiphertext);
+  },
+
+  async testGetPrimitive_fromKeyData() {
+    const manager = new AesGcmKeyManager();
+    const keyData = createTestKeyData();
+
+    // Get primitive.
+    const /** Aead */ primitive =
+        await manager.getPrimitive(PRIMITIVE, keyData);
+
+    // Test the returned primitive.
+    const plaintext = Random.randBytes(8);
+    const aad = Random.randBytes(8);
+    const ciphertext = await primitive.encrypt(plaintext, aad);
+    const decryptedCiphertext = await primitive.decrypt(ciphertext, aad);
+
+    assertObjectEquals(plaintext, decryptedCiphertext);
+  },
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for getVersion, getKeyType and doesSupport methods
+
+  testGetVersion_shouldBeZero() {
+    const manager = new AesGcmKeyManager();
+    assertEquals(0, manager.getVersion());
+  },
+
+  testGetKeyType_shouldBeAesGcmKeyType() {
+    const manager = new AesGcmKeyManager();
+    assertEquals(KEY_TYPE, manager.getKeyType());
+  },
+
+  testDoesSupport_shouldSupportAesGcmKeyType() {
+    const manager = new AesGcmKeyManager();
+    assertTrue(manager.doesSupport(KEY_TYPE));
+  },
+
+  testGetPrimitiveType_shouldBeAead() {
+    const manager = new AesGcmKeyManager();
+    assertEquals(PRIMITIVE, manager.getPrimitiveType());
+  },
+});
+
+/////////////////////////////////////////////////////////////////////////////
+// Helper functions for tests
+
+class ExceptionText {
+  /** @return {string} */
+  static unsupportedPrimitive() {
+    return 'CustomError: Requested primitive type which is not supported ' +
+        'by this key manager.';
+  }
+
+  /**
+   * @param {number} keySize
+   * @return {string}
+   */
+  static unsupportedKeySize(keySize) {
+    return 'CustomError: unsupported AES key size: ' + keySize;
+  }
+
+  /**
+   * @return {string}
+   */
+  static versionOutOfBounds() {
+    return 'CustomError: Version is out of bound, must be between 0 and ' +
+        VERSION + '.';
+  }
+
+  /**
+   * @param {string=} opt_unsupportedKeyType
+   * @return {string}
+   */
+  static unsupportedKeyType(opt_unsupportedKeyType) {
+    const prefix = 'CustomError: Key type';
+    const suffix =
+        'is not supported. This key manager supports ' + KEY_TYPE + '.';
+
+    if (opt_unsupportedKeyType) {
+      return prefix + ' ' + opt_unsupportedKeyType + ' ' + suffix;
+    } else {
+      return prefix + ' ' + suffix;
+    }
+  }
+
+  /**
+   * @return {string}
+   */
+  static invalidSerializedKey() {
+    return 'CustomError: Could not parse the input as a serialized proto of ' +
+        KEY_TYPE + ' key.';
+  }
+
+  static invalidSerializedKeyFormat() {
+    return 'CustomError: Could not parse the input as a serialized proto of ' +
+        KEY_TYPE + ' key format.';
+  }
+
+  /**
+   * @return {string}
+   */
+  static invalidKeyFormat() {
+    return 'CustomError: Expected AesGcmKeyFormat-proto';
+  }
+}
+
+
+/**
+ * @param {number=} opt_keySize
+ *
+ * @return {!PbAesGcmKeyFormat}
+ */
+const createTestKeyFormat = function(opt_keySize = 16) {
+  const keyFormat = new PbAesGcmKeyFormat().setKeySize(opt_keySize);
+  return keyFormat;
+};
+
+/**
+ * @param {number=} opt_keySize
+ * @return {!PbAesGcmKey}
+ */
+const createTestKey = function(opt_keySize = 16) {
+  const key = new PbAesGcmKey().setVersion(0).setKeyValue(
+      Random.randBytes(opt_keySize));
+
+  return key;
+};
+
+/**
+ * @param {number=} opt_keySize
+ * @return {!PbKeyData}
+ */
+const createTestKeyData = function(opt_keySize) {
+  const keyData = new PbKeyData()
+                      .setTypeUrl(KEY_TYPE)
+                      .setValue(createTestKey(opt_keySize).serializeBinary())
+                      .setKeyMaterialType(PbKeyData.KeyMaterialType.SYMMETRIC);
+
+  return keyData;
+};
diff --git a/javascript/aead/aes_gcm_key_templates.js b/javascript/aead/aes_gcm_key_templates.js
new file mode 100644
index 0000000..9f157e2
--- /dev/null
+++ b/javascript/aead/aes_gcm_key_templates.js
@@ -0,0 +1,100 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.aead.AesGcmKeyTemplates');
+
+const AesGcmKeyManager = goog.require('tink.aead.AesGcmKeyManager');
+const PbAesGcmKeyFormat = goog.require('proto.google.crypto.tink.AesGcmKeyFormat');
+const PbKeyTemplate = goog.require('proto.google.crypto.tink.KeyTemplate');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+
+/**
+ * Pre-generated KeyTemplates for AES GCM keys.
+ *
+ * @final
+ */
+class AesGcmKeyTemplates {
+  /**
+   * Returns a KeyTemplate that generates new instances of AesGcmKey
+   * with the following parameters:
+   *    key size: 16 bytes
+   *    OutputPrefixType: TINK
+   *
+   * @return {!PbKeyTemplate}
+   */
+  static aes128Gcm() {
+    return AesGcmKeyTemplates.newAesGcmKeyTemplate_(
+        /* keySize = */ 16,
+        /* outputPrefixType = */ PbOutputPrefixType.TINK);
+  }
+
+  /**
+   * Returns a KeyTemplate that generates new instances of AesGcmKey
+   * with the following parameters:
+   *    key size: 32 bytes
+   *    OutputPrefixType: TINK
+   *
+   * @return {!PbKeyTemplate}
+   */
+  static aes256Gcm() {
+    return AesGcmKeyTemplates.newAesGcmKeyTemplate_(
+        /* keySize = */ 32,
+        /* outputPrefixType = */ PbOutputPrefixType.TINK);
+  }
+
+  /**
+   * Returns a KeyTemplate that generates new instances of AesGcmKey
+   * with the following parameters:
+   *     key size: 32 bytes
+   *     OutputPrefixType: RAW
+   *
+   * @return {!PbKeyTemplate}
+   */
+  static aes256GcmNoPrefix() {
+    return AesGcmKeyTemplates.newAesGcmKeyTemplate_(
+        /* keySize = */ 32,
+        /* outputPrefixType = */ PbOutputPrefixType.RAW);
+  }
+
+  /**
+   * @private
+   *
+   * @param {number} keySize
+   * @param {!PbOutputPrefixType} outputPrefixType
+   *
+   * @return {!PbKeyTemplate}
+   */
+  static newAesGcmKeyTemplate_(keySize, outputPrefixType) {
+    // Define AES GCM key format.
+    const keyFormat = new PbAesGcmKeyFormat().setKeySize(keySize);
+
+    // Define key template.
+    const keyTemplate = new PbKeyTemplate()
+                            .setTypeUrl(AesGcmKeyManager.KEY_TYPE)
+                            .setOutputPrefixType(outputPrefixType)
+                            .setValue(keyFormat.serializeBinary());
+
+    return keyTemplate;
+  }
+}
+
+goog.exportProperty(
+    AesGcmKeyTemplates, 'aes128Gcm', AesGcmKeyTemplates.aes128Gcm);
+goog.exportProperty(
+    AesGcmKeyTemplates, 'aes256Gcm', AesGcmKeyTemplates.aes256Gcm);
+goog.exportProperty(
+    AesGcmKeyTemplates, 'aes256GcmNoPrefix',
+    AesGcmKeyTemplates.aes256GcmNoPrefix);
+goog.exportSymbol('tink.aead.AesGcmKeyTemplates', AesGcmKeyTemplates);
+exports = AesGcmKeyTemplates;
diff --git a/javascript/aead/aes_gcm_key_templates_test.js b/javascript/aead/aes_gcm_key_templates_test.js
new file mode 100644
index 0000000..ac71fa7
--- /dev/null
+++ b/javascript/aead/aes_gcm_key_templates_test.js
@@ -0,0 +1,92 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.aead.AesGcmKeyTemplatesTest');
+goog.setTestOnly('tink.aead.AesGcmKeyTemplatesTest');
+
+const AesGcmKeyManager = goog.require('tink.aead.AesGcmKeyManager');
+const AesGcmKeyTemplates = goog.require('tink.aead.AesGcmKeyTemplates');
+const PbAesGcmKeyFormat = goog.require('proto.google.crypto.tink.AesGcmKeyFormat');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+
+  testAes128Gcm() {
+    // The created key should have the following parameters.
+    const expectedKeySize = 16;
+    const expectedOutputPrefix = PbOutputPrefixType.TINK;
+    // Expected type URL is the one supported by AesGcmKeyManager.
+    const manager = new AesGcmKeyManager();
+    const expectedTypeUrl = manager.getKeyType();
+
+    const keyTemplate = AesGcmKeyTemplates.aes128Gcm();
+
+    assertEquals(expectedTypeUrl, keyTemplate.getTypeUrl());
+    assertEquals(expectedOutputPrefix, keyTemplate.getOutputPrefixType());
+
+    // Test key size value in key format.
+    const keyFormat =
+        PbAesGcmKeyFormat.deserializeBinary(keyTemplate.getValue_asU8());
+    assertEquals(expectedKeySize, keyFormat.getKeySize());
+
+    // Test that the template works with AesCtrHmacAeadKeyManager.
+    manager.getKeyFactory().newKey(keyTemplate.getValue_asU8());
+  },
+
+  testAes256Gcm() {
+    // The created key should have the following parameters.
+    const expectedKeySize = 32;
+    const expectedOutputPrefix = PbOutputPrefixType.TINK;
+    // Expected type URL is the one supported by AesGcmKeyManager.
+    const manager = new AesGcmKeyManager();
+    const expectedTypeUrl = manager.getKeyType();
+
+    const keyTemplate = AesGcmKeyTemplates.aes256Gcm();
+
+    assertEquals(expectedTypeUrl, keyTemplate.getTypeUrl());
+    assertEquals(expectedOutputPrefix, keyTemplate.getOutputPrefixType());
+
+    // Test key size value in key format.
+    const keyFormat =
+        PbAesGcmKeyFormat.deserializeBinary(keyTemplate.getValue_asU8());
+    assertEquals(expectedKeySize, keyFormat.getKeySize());
+
+    // Test that the template works with AesCtrHmacAeadKeyManager.
+    manager.getKeyFactory().newKey(keyTemplate.getValue_asU8());
+  },
+
+  testAes256GcmNoPrefix() {
+    // The created key should have the following parameters.
+    const expectedKeySize = 32;
+    const expectedOutputPrefix = PbOutputPrefixType.RAW;
+    // Expected type URL is the one supported by AesGcmKeyManager.
+    const manager = new AesGcmKeyManager();
+    const expectedTypeUrl = manager.getKeyType();
+
+    const keyTemplate = AesGcmKeyTemplates.aes256GcmNoPrefix();
+
+    assertEquals(expectedTypeUrl, keyTemplate.getTypeUrl());
+    assertEquals(expectedOutputPrefix, keyTemplate.getOutputPrefixType());
+
+    // Test key size value in key format.
+    const keyFormat =
+        PbAesGcmKeyFormat.deserializeBinary(keyTemplate.getValue_asU8());
+    assertEquals(expectedKeySize, keyFormat.getKeySize());
+
+    // Test that the template works with AesCtrHmacAeadKeyManager.
+    manager.getKeyFactory().newKey(keyTemplate.getValue_asU8());
+  }
+});
diff --git a/javascript/binary_keyset_reader.js b/javascript/binary_keyset_reader.js
new file mode 100644
index 0000000..ee93691
--- /dev/null
+++ b/javascript/binary_keyset_reader.js
@@ -0,0 +1,69 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.BinaryKeysetReader');
+
+const KeysetReader = goog.require('tink.KeysetReader');
+const PbKeyset = goog.require('proto.google.crypto.tink.Keyset');
+const SecurityException = goog.require('tink.exception.SecurityException');
+
+/**
+ * BinaryKeysetReader knows how to read a keyset or an encrypted keyset
+ * serialized to binary format.
+ *
+ * @implements {KeysetReader}
+ * @final
+ */
+class BinaryKeysetReader {
+  /** @param {!Uint8Array} serializedKeyset */
+  constructor(serializedKeyset) {
+    /** @const @private {!Uint8Array} */
+    this.serializedKeyset_ = serializedKeyset;
+  }
+
+  /**
+   * @param {!Uint8Array} serializedKeyset
+   * @return {!BinaryKeysetReader}
+   */
+  static withUint8Array(serializedKeyset) {
+    if (!serializedKeyset) {
+      throw new SecurityException('Serialized keyset has to be non-null.');
+    }
+    return new BinaryKeysetReader(serializedKeyset);
+  }
+
+  /** @override */
+  read() {
+    let /** !PbKeyset */ keyset;
+    try {
+      keyset = PbKeyset.deserializeBinary(this.serializedKeyset_);
+    } catch (e) {
+      throw new SecurityException(
+          'Could not parse the given serialized proto as a keyset proto.');
+    }
+    if (keyset.getKeyList().length === 0) {
+      throw new SecurityException(
+          'Could not parse the given serialized proto as a keyset proto.');
+    }
+    return keyset;
+  }
+
+  /** @override */
+  readEncrypted() {
+    throw new SecurityException('Not implemented yet.');
+  }
+}
+
+goog.exportSymbol('tink.BinaryKeysetReader', BinaryKeysetReader);
+exports = BinaryKeysetReader;
diff --git a/javascript/binary_keyset_reader_test.js b/javascript/binary_keyset_reader_test.js
new file mode 100644
index 0000000..3ca1cfc
--- /dev/null
+++ b/javascript/binary_keyset_reader_test.js
@@ -0,0 +1,149 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.BinaryKeysetReaderTest');
+goog.setTestOnly('tink.BinaryKeysetReaderTest');
+
+const BinaryKeysetReader = goog.require('tink.BinaryKeysetReader');
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const PbKeyStatusType = goog.require('proto.google.crypto.tink.KeyStatusType');
+const PbKeyset = goog.require('proto.google.crypto.tink.Keyset');
+const PbKeysetKey = goog.require('proto.google.crypto.tink.Keyset.Key');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+const Random = goog.require('tink.subtle.Random');
+
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+  testWithSerializedKeyset_nullSerializedProto() {
+    try {
+      BinaryKeysetReader.withUint8Array(null);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.nullKeyset(), e.toString());
+    }
+  },
+
+  testRead_invalidSerializedKeysetProto() {
+    for (let i = 0; i < 2; i++) {
+      // The Uint8Array is not a serialized keyset.
+      const reader = BinaryKeysetReader.withUint8Array(new Uint8Array(i));
+
+      try {
+        reader.read();
+        fail('An exception should be thrown.');
+      } catch (e) {
+        assertEquals(ExceptionText.invalidSerialization(), e.toString());
+      }
+    }
+  },
+
+  testRead() {
+    // Create keyset proto and serialize it.
+    const keyset = new PbKeyset();
+    // The for cycle starts from 1 as setting any proto value to 0 sets it to
+    // null and after serialization and deserialization null is changed to
+    // undefined and the assertion at the end fails (unless you compare the
+    // keyset and newly created keyset value by value).
+    for (let i = 1; i < 20; i++) {
+      let outputPrefix;
+      switch (i % 3) {
+        case 0:
+          outputPrefix = PbOutputPrefixType.TINK;
+          break;
+        case 1:
+          outputPrefix = PbOutputPrefixType.RAW;
+          break;
+        default:
+          outputPrefix = PbOutputPrefixType.LEGACY;
+      }
+      keyset.addKey(createDummyKeysetKey(
+          /* keyId = */ i, outputPrefix, /* enabled = */ i % 4 < 3));
+    }
+    keyset.setPrimaryKeyId(1);
+
+    const serializedKeyset = keyset.serializeBinary();
+
+    // Read the keyset proto serialization.
+    const reader = BinaryKeysetReader.withUint8Array(serializedKeyset);
+    const keysetFromReader = reader.read();
+
+    // Test that it returns the same object as was created.
+    assertObjectEquals(keyset, keysetFromReader);
+  },
+
+  testReadEncrypted_notImplementedYet() {
+    const reader = BinaryKeysetReader.withUint8Array(new Uint8Array(10));
+
+    try {
+      reader.readEncrypted();
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.notImplemented(), e.toString());
+    }
+  },
+});
+
+////////////////////////////////////////////////////////////////////////////////
+// helper functions and classes for tests
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Class which holds texts for each type of exception.
+ * @final
+ */
+class ExceptionText {
+  /** @return {string} */
+  static notImplemented() {
+    return 'CustomError: Not implemented yet.';
+  }
+  /** @return {string} */
+  static nullKeyset() {
+    return 'CustomError: Serialized keyset has to be non-null.';
+  }
+  /** @return {string} */
+  static invalidSerialization() {
+    return 'CustomError: Could not parse the given serialized proto as ' +
+        'a keyset proto.';
+  }
+}
+
+/**
+ * Function for creating keys for testing purposes.
+ *
+ * @param {number} keyId
+ * @param {PbOutputPrefixType} outputPrefix
+ * @param {boolean} enabled
+ *
+ * @return {!PbKeysetKey}
+ */
+const createDummyKeysetKey = function(keyId, outputPrefix, enabled) {
+  let key = new PbKeysetKey();
+
+  if (enabled) {
+    key.setStatus(PbKeyStatusType.ENABLED);
+  } else {
+    key.setStatus(PbKeyStatusType.DISABLED);
+  }
+  key.setOutputPrefixType(outputPrefix);
+  key.setKeyId(keyId);
+
+  // Set some key data.
+  key.setKeyData(new PbKeyData());
+  key.getKeyData().setTypeUrl('SOME_KEY_TYPE_URL_' + keyId.toString());
+  key.getKeyData().setKeyMaterialType(PbKeyData.KeyMaterialType.SYMMETRIC);
+  key.getKeyData().setValue(Random.randBytes(10));
+
+  return key;
+};
diff --git a/javascript/binary_keyset_writer.js b/javascript/binary_keyset_writer.js
new file mode 100644
index 0000000..d274cb7
--- /dev/null
+++ b/javascript/binary_keyset_writer.js
@@ -0,0 +1,38 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.BinaryKeysetWriter');
+
+const KeysetWriter = goog.require('tink.KeysetWriter');
+const SecurityException = goog.require('tink.exception.SecurityException');
+
+
+/**
+ * KeysetWriter knows how to write a keyset or an encrypted keyset.
+ *
+ * @implements {KeysetWriter}
+ * @final
+ */
+class BinaryKeysetWriter {
+  /** @override */
+  write(keyset) {
+    if (!keyset) {
+      throw new SecurityException('keyset has to be non-null.');
+    }
+    return keyset.serializeBinary();
+  }
+}
+
+goog.exportSymbol('tink.BinaryKeysetWriter', BinaryKeysetWriter);
+exports = BinaryKeysetWriter;
diff --git a/javascript/binary_keyset_writer_test.js b/javascript/binary_keyset_writer_test.js
new file mode 100644
index 0000000..73426ab
--- /dev/null
+++ b/javascript/binary_keyset_writer_test.js
@@ -0,0 +1,48 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.BinaryKeysetWriterTest');
+goog.setTestOnly('tink.BinaryKeysetWriterTest');
+
+const BinaryKeysetReader = goog.require('tink.BinaryKeysetReader');
+const BinaryKeysetWriter = goog.require('tink.BinaryKeysetWriter');
+const testSuite = goog.require('goog.testing.testSuite');
+const {createKeyset} = goog.require('tink.testUtils');
+
+testSuite({
+  testWrite_nullProto() {
+    try {
+      const writer = new BinaryKeysetWriter();
+      writer.write(null);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals('CustomError: keyset has to be non-null.', e.toString());
+    }
+  },
+
+  testGetSerializedKeySet() {
+    const dummyKeyset = createKeyset();
+
+    // Write the keyset.
+    const writer = new BinaryKeysetWriter();
+    const serializedKeyset = writer.write(dummyKeyset);
+
+    // Read the keyset proto serialization.
+    const reader = BinaryKeysetReader.withUint8Array(serializedKeyset);
+    const keysetFromReader = reader.read();
+
+    // Test that it returns the same object as was created.
+    assertObjectEquals(dummyKeyset, keysetFromReader);
+  },
+});
diff --git a/javascript/catalogue.js b/javascript/catalogue.js
new file mode 100644
index 0000000..9e4f4a5
--- /dev/null
+++ b/javascript/catalogue.js
@@ -0,0 +1,51 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.Catalogue');
+
+const KeyManager = goog.require('tink.KeyManager');
+
+/**
+ * A catalogue of KeyManager objects.
+ *
+ * It is a map from a tuple (key type, primitive name) to KeyManager objects,
+ * that determines the key manager that handles the keys of the given key type.
+ *
+ * Tink includes default per-primitive catalogues, but it also supports custom
+ * catalogues to enable user-defined configuration of run-time environment via
+ * Registry.
+ *
+ * The template parameter P denotes the primitive which is handled by this
+ * catalogue.
+ *
+ * @template P
+ * @record
+ */
+class Catalogue {
+  /**
+   * Return a KeyManager which handles given key type and primitive name such
+   * that its version is at least minimum version.
+   *
+   * If there is no such primitive throws SecurityException
+   *
+   * @param {string} typeUrl -- key type
+   * @param {string} primitiveName
+   * @param {number} minVersion
+   *
+   * @return {!KeyManager.KeyManager<P>}
+   */
+  getKeyManager(typeUrl, primitiveName, minVersion) {}
+}
+
+exports = Catalogue;
diff --git a/javascript/cleartext_keyset_handle.js b/javascript/cleartext_keyset_handle.js
new file mode 100644
index 0000000..dcf9297
--- /dev/null
+++ b/javascript/cleartext_keyset_handle.js
@@ -0,0 +1,95 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.CleartextKeysetHandle');
+
+const BinaryKeysetReader = goog.require('tink.BinaryKeysetReader');
+const BinaryKeysetWriter = goog.require('tink.BinaryKeysetWriter');
+const KeysetHandle = goog.require('tink.KeysetHandle');
+const PbKeyset = goog.require('proto.google.crypto.tink.Keyset');
+
+/** @type {!BinaryKeysetWriter} */
+const binaryKeysetWriter = new BinaryKeysetWriter();
+
+/**
+ * Static methods for reading or writing cleartext keysets.
+ *
+ * @final
+ */
+class CleartextKeysetHandle {
+  /**
+   * Creates a KeysetHandle from a JSPB array representation of a keyset. The
+   * array is used in place and not cloned.
+   *
+   * Note that JSPB is currently not open source, so this method can't be
+   * either.
+   *
+   * @param {!Array<*>} keysetJspbArray
+   * @return {!KeysetHandle}
+   */
+  static fromJspbArray(keysetJspbArray) {
+    return new KeysetHandle(new PbKeyset(keysetJspbArray));
+  }
+
+  /**
+   * Creates a KeysetHandle from a JSPB string representation of a keyset.
+   *
+   * Note that JSPB is currently not open source, so this method can't be
+   * either.
+   *
+   * @param {string} keysetJspbString
+   * @return {!KeysetHandle}
+   */
+  static deserializeFromJspb(keysetJspbString) {
+    return new KeysetHandle(PbKeyset.deserialize(keysetJspbString));
+  }
+
+  /**
+   * Serializes a KeysetHandle to string.
+   *
+   * Note that JSPB is currently not open source, so this method can't be
+   * either.
+   *
+   * @param {!KeysetHandle} keysetHandle
+   * @return {string}
+   */
+  static serializeToJspb(keysetHandle) {
+    return keysetHandle.getKeyset().serialize();
+  }
+
+  /**
+   * Serializes a KeysetHandle to binary.
+   *
+   * @param {!KeysetHandle} keysetHandle
+   * @return {!Uint8Array}
+   */
+  static serializeToBinary(keysetHandle) {
+    return binaryKeysetWriter.write(keysetHandle.getKeyset());
+  }
+
+  /**
+   * Creates a KeysetHandle from a binary representation of a keyset.
+   *
+   * @param {!Uint8Array} keysetBinary
+   * @return {!KeysetHandle}
+   */
+  static deserializeFromBinary(keysetBinary) {
+    const reader = BinaryKeysetReader.withUint8Array(keysetBinary);
+    const keysetFromReader = reader.read();
+    return new KeysetHandle(keysetFromReader);
+  }
+}
+
+goog.exportSymbol('tink.CleartextKeysetHandle', CleartextKeysetHandle);
+exports = CleartextKeysetHandle;
diff --git a/javascript/cleartext_keyset_handle_test.js b/javascript/cleartext_keyset_handle_test.js
new file mode 100644
index 0000000..6f40574
--- /dev/null
+++ b/javascript/cleartext_keyset_handle_test.js
@@ -0,0 +1,74 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.CleartextKeysetHandleTest');
+goog.setTestOnly();
+
+const CleartextKeysetHandle = goog.require('tink.CleartextKeysetHandle');
+const KeysetHandle = goog.require('tink.KeysetHandle');
+const PbKeyset = goog.require('proto.google.crypto.tink.Keyset');
+const testSuite = goog.require('goog.testing.testSuite');
+const {createKeyset} = goog.require('tink.testUtils');
+
+testSuite({
+  testParseFromLightweightShouldWork() {
+    assertTrue(
+        CleartextKeysetHandle.fromJspbArray(createKeyset().toArray()) instanceof
+        KeysetHandle);
+  },
+
+  testParseFromLightweightEmptyKeyset() {
+    const keysetJspbArray = new PbKeyset().toArray();
+    assertEquals(
+        'CustomError: ' +
+            'Keyset should be non null and must contain at least one key.',
+        assertThrows(() => {
+          CleartextKeysetHandle.fromJspbArray(keysetJspbArray);
+        }).toString());
+  },
+
+  testDeserializeFromJspb() {
+    const keyset1 = createKeyset();
+    const keysetHandle =
+        CleartextKeysetHandle.deserializeFromJspb(keyset1.serialize());
+    const keyset2 = keysetHandle.getKeyset();
+    assertEquals(keyset1.getPrimaryKeyId(), keyset2.getPrimaryKeyId());
+    assertObjectEquals(keyset2.getKeyList(), keyset2.getKeyList());
+  },
+
+  testSerializeToJspb() {
+    const keyset = createKeyset();
+    const keysetHandle = new KeysetHandle(keyset);
+
+    const keysetString = CleartextKeysetHandle.serializeToJspb(keysetHandle);
+    assertEquals(keysetString, keyset.serialize());
+  },
+
+  testDeserializeFromBinary() {
+    const keyset1 = createKeyset();
+    const keysetHandle =
+        CleartextKeysetHandle.deserializeFromBinary(keyset1.serializeBinary());
+    const keyset2 = keysetHandle.getKeyset();
+    assertEquals(keyset1.getPrimaryKeyId(), keyset2.getPrimaryKeyId());
+    assertObjectEquals(keyset2.getKeyList(), keyset2.getKeyList());
+  },
+
+  testSerializeToBinary() {
+    const keyset = createKeyset();
+    const keysetHandle = new KeysetHandle(keyset);
+
+    const keysetBinary = CleartextKeysetHandle.serializeToBinary(keysetHandle);
+    assertObjectEquals(keysetBinary, keyset.serializeBinary());
+  },
+});
diff --git a/javascript/crypto_format.js b/javascript/crypto_format.js
new file mode 100644
index 0000000..73737e2
--- /dev/null
+++ b/javascript/crypto_format.js
@@ -0,0 +1,138 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.CryptoFormat');
+
+const InvalidArgumentsException = goog.require('tink.exception.InvalidArgumentsException');
+const PbKeyset = goog.require('proto.google.crypto.tink.Keyset');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+const SecurityException = goog.require('tink.exception.SecurityException');
+
+/**
+ * Constants and methods that deal with the format of the outputs handled by
+ * Tink.
+ *
+ * @static
+ * @final
+ */
+class CryptoFormat {
+  /**
+   * Generates the prefix for the outputs handled by the given 'key'.
+   * Throws an exception if the prefix type of 'key' is invalid.
+   *
+   * @param {PbKeyset.Key} key
+   *
+   * @return {!Uint8Array}
+   */
+  static getOutputPrefix(key) {
+    switch (key.getOutputPrefixType()) {
+      case PbOutputPrefixType.LEGACY: // fall through
+      case PbOutputPrefixType.CRUNCHY:
+        return CryptoFormat.makeOutputPrefix_(
+            key.getKeyId(), CryptoFormat.LEGACY_START_BYTE);
+      case PbOutputPrefixType.TINK:
+        return CryptoFormat.makeOutputPrefix_(
+            key.getKeyId(), CryptoFormat.TINK_START_BYTE);
+      case PbOutputPrefixType.RAW:
+        return CryptoFormat.RAW_PREFIX;
+      default:
+        throw new SecurityException('Unsupported key prefix type.');
+    }
+  }
+
+  /**
+   * Makes output prefix which consits of 4 bytes of key id in Big Endian
+   * representation followed by 1 byte of key type identifier.
+   *
+   * @static
+   * @private
+   * @param {number} keyId
+   * @param {number} keyTypeIdentifier
+   *
+   * @return {!Uint8Array}
+   */
+  static makeOutputPrefix_(keyId, keyTypeIdentifier) {
+    let /** Array */ res = [keyTypeIdentifier];
+    res = res.concat(CryptoFormat.numberAsBigEndian_(keyId));
+    return new Uint8Array(res);
+  }
+
+
+  /**
+   * Returns the given number as Uint8Array in Big Endian format.
+   *
+   * Given number has to be a non-negative integer smaller than 2^32.
+   *
+   * @static
+   * @private
+   * @param {number} n
+   *
+   * @return {!Array}
+   */
+  static numberAsBigEndian_(n) {
+    if (!Number.isInteger(n) || n < 0 || n >= 2**32) {
+      throw new InvalidArgumentsException(
+          'Number has to be unsigned 32-bit integer.');
+    }
+    const numberOfBytes = 4;
+    let res = new Array(numberOfBytes);
+    for (let i = 0; i < numberOfBytes; i++) {
+      res[i] = 0xFF & (n >> 8 * (numberOfBytes - i - 1));
+    }
+    return res;
+  }
+}
+
+/**
+ * Prefix size of Tink and Legacy key types.
+ * @const @static {number}
+ */
+CryptoFormat.NON_RAW_PREFIX_SIZE = 5;
+
+/**
+ * Prefix size of Legacy key types.
+ * @const @static {number}
+ */
+CryptoFormat.LEGACY_PREFIX_SIZE = CryptoFormat.NON_RAW_PREFIX_SIZE;
+/**
+ * Legacy starts with 0 and is followed by 4-byte key id.
+ * @const @static {number}
+ */
+CryptoFormat.LEGACY_START_BYTE = 0x00;
+
+/**
+ * Prefix size of Tink key types.
+ * @const @static {number}
+ */
+CryptoFormat.TINK_PREFIX_SIZE = CryptoFormat.NON_RAW_PREFIX_SIZE;
+/**
+ * Tink starts with 1 and is followed by 4-byte key id.
+ * @const @static {number}
+ */
+CryptoFormat.TINK_START_BYTE = 0x01;
+
+/**
+ * Raw prefix should have length 0.
+ * @const @static {number}
+ */
+CryptoFormat.RAW_PREFIX_SIZE = 0;
+/**
+ * Raw prefix is empty Uint8Array.
+ * @const @static
+ * @type {!Uint8Array}
+ */
+CryptoFormat.RAW_PREFIX = new Uint8Array(0);
+
+goog.exportSymbol('tink.CryptoFormat', CryptoFormat);
+exports = CryptoFormat;
diff --git a/javascript/crypto_format_test.js b/javascript/crypto_format_test.js
new file mode 100644
index 0000000..463a197
--- /dev/null
+++ b/javascript/crypto_format_test.js
@@ -0,0 +1,99 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.CryptoFormatTest');
+goog.setTestOnly('tink.CryptoFormatTest');
+
+const CryptoFormat = goog.require('tink.CryptoFormat');
+const PbKey = goog.require('proto.google.crypto.tink.Keyset.Key');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+  async testConstants() {
+    assertEquals(0, CryptoFormat.RAW_PREFIX_SIZE);
+    assertEquals(5, CryptoFormat.NON_RAW_PREFIX_SIZE);
+    assertEquals(5, CryptoFormat.LEGACY_PREFIX_SIZE);
+    assertEquals(5, CryptoFormat.TINK_PREFIX_SIZE);
+
+    assertEquals(0x00, CryptoFormat.LEGACY_START_BYTE);
+    assertEquals(0x01, CryptoFormat.TINK_START_BYTE);
+  },
+
+  async testGetOutputPrefixUnknownPrefixType() {
+    let key = new PbKey()
+                  .setOutputPrefixType(PbOutputPrefixType.UNKNOWN_PREFIX)
+                  .setKeyId(2864434397);
+
+    try {
+      CryptoFormat.getOutputPrefix(key);
+    } catch (e) {
+      assertEquals('CustomError: Unsupported key prefix type.', e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testGetOutputPrefixInvalidKeyId() {
+    // Key id has to be an unsigned 32-bit integer.
+    const invalidKeyIds = [0.2, -10, 2**32];
+    let key = new PbKey().setOutputPrefixType(PbOutputPrefixType.TINK);
+
+    const invalidKeyIdsLength = invalidKeyIds.length;
+    for (let i = 0; i < invalidKeyIdsLength; i++) {
+      key.setKeyId(invalidKeyIds[i]);
+      try {
+        CryptoFormat.getOutputPrefix(key);
+      } catch (e) {
+        assertEquals('CustomError: Number has to be unsigned 32-bit integer.',
+            e.toString());
+        continue;
+      }
+      fail('An exception should be thrown for i: ' + i + '.');
+    }
+  },
+
+  async testGetOutputPrefixTink() {
+    let key = new PbKey()
+                  .setOutputPrefixType(PbOutputPrefixType.TINK)
+                  .setKeyId(2864434397);
+    const expectedResult =
+        new Uint8Array([CryptoFormat.TINK_START_BYTE, 0xAA, 0xBB, 0xCC, 0xDD]);
+
+    const actualResult = CryptoFormat.getOutputPrefix(key);
+    assertObjectEquals(expectedResult, actualResult);
+  },
+
+  async testGetOutputPrefixLegacy() {
+    let key = new PbKey()
+                  .setOutputPrefixType(PbOutputPrefixType.LEGACY)
+                  .setKeyId(16909060);
+    const expectedResult = new Uint8Array(
+        [CryptoFormat.LEGACY_START_BYTE, 0x01, 0x02, 0x03, 0x04]);
+
+    const actualResult = CryptoFormat.getOutputPrefix(key);
+    assertObjectEquals(expectedResult, actualResult);
+  },
+
+  async testGetOutputPrefixRaw() {
+    let key = new PbKey()
+                  .setOutputPrefixType(PbOutputPrefixType.RAW)
+                  .setKeyId(370491921);
+    const expectedResult = new Uint8Array(0);
+
+    const actualResult = CryptoFormat.getOutputPrefix(key);
+    assertObjectEquals(expectedResult, actualResult);
+  },
+});
diff --git a/javascript/exception/BUILD.bazel b/javascript/exception/BUILD.bazel
new file mode 100644
index 0000000..3c6de86
--- /dev/null
+++ b/javascript/exception/BUILD.bazel
@@ -0,0 +1,18 @@
+package(
+    default_visibility = ["//tools/build_defs:internal_pkg"],
+)
+
+licenses(["notice"])
+
+load("@io_bazel_rules_closure//closure:defs.bzl", "closure_js_library")
+
+closure_js_library(
+    name = "exception",
+    srcs = glob([
+        "*.js",
+    ]),
+    deps = [
+        "@io_bazel_rules_closure//closure/library",
+        "@io_bazel_rules_closure//closure/library/debug:error",
+    ],
+)
diff --git a/javascript/exception/invalidargumentsexception.js b/javascript/exception/invalidargumentsexception.js
new file mode 100644
index 0000000..fbf83dc
--- /dev/null
+++ b/javascript/exception/invalidargumentsexception.js
@@ -0,0 +1,31 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.exception.InvalidArgumentsException');
+
+const Error = goog.require('goog.debug.Error');
+
+/**
+ * Exception used when a function receives an invalid argument.
+ *
+ * @extends {Error}
+ */
+class InvalidArgumentsException extends Error {
+  /** @param {*=} opt_msg The custom error message. */
+  constructor(opt_msg) {
+    super(opt_msg);
+  }
+}
+
+exports = InvalidArgumentsException;
diff --git a/javascript/exception/securityexception.js b/javascript/exception/securityexception.js
new file mode 100644
index 0000000..0a66495
--- /dev/null
+++ b/javascript/exception/securityexception.js
@@ -0,0 +1,31 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.exception.SecurityException');
+
+const Error = goog.require('goog.debug.Error');
+
+/**
+ * The base class for all security exceptions.
+ *
+ * @extends {Error}
+ */
+class SecurityException extends Error {
+  /** @param {*=} opt_msg The custom error message. */
+  constructor(opt_msg) {
+    super(opt_msg);
+  }
+}
+
+exports = SecurityException;
diff --git a/javascript/exception/unsupportedexception.js b/javascript/exception/unsupportedexception.js
new file mode 100644
index 0000000..fa15009
--- /dev/null
+++ b/javascript/exception/unsupportedexception.js
@@ -0,0 +1,30 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.exception.UnsupportedException');
+
+const Error = goog.require('goog.debug.Error');
+
+/**
+ * Exception used when the client requests an unimplemented feature.
+ *
+ * @extends {Error}
+ */
+class UnsupportedException extends Error {
+  /** @param {*=} opt_msg The custom error message. */
+  constructor(opt_msg) {
+    super(opt_msg);
+  }
+}
+exports = UnsupportedException;
diff --git a/javascript/hybrid/BUILD.bazel b/javascript/hybrid/BUILD.bazel
new file mode 100644
index 0000000..4614ea0
--- /dev/null
+++ b/javascript/hybrid/BUILD.bazel
@@ -0,0 +1,146 @@
+package(
+    default_visibility = [
+        "//tools/build_defs:internal_pkg",
+    ],
+)
+
+licenses(["notice"])
+
+load("@io_bazel_rules_closure//closure:defs.bzl", "closure_js_library")
+
+closure_js_library(
+    name = "hybrid",
+    exports = [
+        ":ecies_aead_hkdf_key_managers",
+        ":hybrid_config",
+        ":hybrid_key_templates",
+        ":hybrid_wrappers",
+        ":registry_ecies_aead_hkdf_dem_helper",
+        ":util_and_validators",
+    ],
+)
+
+closure_js_library(
+    name = "util_and_validators",
+    srcs = [
+        "ecies_aead_hkdf_util.js",
+        "ecies_aead_hkdf_validators.js",
+    ],
+    deps = [
+        "//javascript:util",
+        "//javascript/aead:aead_config",
+        "//javascript/exception",
+        "//javascript/subtle",
+        "//proto:common_closure_proto",
+        "//proto:ecies_aead_hkdf_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "registry_ecies_aead_hkdf_dem_helper",
+    srcs = [
+        "registry_ecies_aead_hkdf_dem_helper.js",
+    ],
+    deps = [
+        "//javascript:primitives",
+        "//javascript:registry",
+        "//javascript/aead:aead_config",
+        "//javascript/exception",
+        "//javascript/subtle",
+        "//proto:aes_ctr_hmac_aead_closure_proto",
+        "//proto:aes_gcm_closure_proto",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "ecies_aead_hkdf_key_managers",
+    srcs = [
+        "ecies_aead_hkdf_private_key_manager.js",
+        "ecies_aead_hkdf_public_key_manager.js",
+    ],
+    deps = [
+        ":registry_ecies_aead_hkdf_dem_helper",
+        ":util_and_validators",
+        "//javascript:key_manager",
+        "//javascript:primitives",
+        "//javascript:util",
+        "//javascript/exception",
+        "//javascript/subtle",
+        "//javascript/subtle:hybrid",
+        "//proto:ecies_aead_hkdf_closure_proto",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+        "@io_bazel_rules_closure//closure/protobuf:jspb",
+    ],
+)
+
+closure_js_library(
+    name = "hybrid_config",
+    srcs = [
+        "hybrid_config.js",
+    ],
+    deps = [
+        ":ecies_aead_hkdf_key_managers",
+        ":hybrid_wrappers",
+        "//javascript:registry",
+        "//javascript/aead:aead_config",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "hybrid_key_templates",
+    srcs = [
+        "hybrid_key_templates.js",
+    ],
+    deps = [
+        ":hybrid_config",
+        "//javascript/aead:aead_key_templates",
+        "//proto:common_closure_proto",
+        "//proto:ecies_aead_hkdf_closure_proto",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "hybrid_wrappers",
+    srcs = [
+        "hybrid_decrypt_wrapper.js",
+        "hybrid_encrypt_wrapper.js",
+    ],
+    deps = [
+        "//javascript:crypto_format",
+        "//javascript:primitive_set",
+        "//javascript:primitive_wrapper",
+        "//javascript:primitives",
+        "//javascript/exception",
+        "//javascript/subtle",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+# test
+
+closure_js_library(
+    name = "test_lib",
+    testonly = 1,
+    srcs = glob([
+        "*_test.js",
+    ]),
+    deps = [
+        "//proto:aes_ctr_closure_proto",
+        "//proto:common_closure_proto",
+        "//proto:ecies_aead_hkdf_closure_proto",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+        "@io_bazel_rules_closure//closure/library/testing:asserts",
+        "@io_bazel_rules_closure//closure/library/testing:jsunit",
+        "@io_bazel_rules_closure//closure/library/testing:testsuite",
+        "@io_bazel_rules_closure//closure/library/useragent",
+    ],
+)
diff --git a/javascript/hybrid/ecies_aead_hkdf_private_key_manager.js b/javascript/hybrid/ecies_aead_hkdf_private_key_manager.js
new file mode 100644
index 0000000..b61c055
--- /dev/null
+++ b/javascript/hybrid/ecies_aead_hkdf_private_key_manager.js
@@ -0,0 +1,307 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.hybrid.EciesAeadHkdfPrivateKeyManager');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const EciesAeadHkdfHybridDecrypt = goog.require('tink.subtle.EciesAeadHkdfHybridDecrypt');
+const EciesAeadHkdfPublicKeyManager = goog.require('tink.hybrid.EciesAeadHkdfPublicKeyManager');
+const EciesAeadHkdfUtil = goog.require('tink.hybrid.EciesAeadHkdfUtil');
+const EciesAeadHkdfValidators = goog.require('tink.hybrid.EciesAeadHkdfValidators');
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const HybridDecrypt = goog.require('tink.HybridDecrypt');
+const KeyManager = goog.require('tink.KeyManager');
+const PbEciesAeadHkdfKeyFormat = goog.require('proto.google.crypto.tink.EciesAeadHkdfKeyFormat');
+const PbEciesAeadHkdfParams = goog.require('proto.google.crypto.tink.EciesAeadHkdfParams');
+const PbEciesAeadHkdfPrivateKey = goog.require('proto.google.crypto.tink.EciesAeadHkdfPrivateKey');
+const PbEciesAeadHkdfPublicKey = goog.require('proto.google.crypto.tink.EciesAeadHkdfPublicKey');
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const PbKeyTemplate = goog.require('proto.google.crypto.tink.KeyTemplate');
+const PbMessage = goog.require('jspb.Message');
+const RegistryEciesAeadHkdfDemHelper = goog.require('tink.hybrid.RegistryEciesAeadHkdfDemHelper');
+const SecurityException = goog.require('tink.exception.SecurityException');
+const Util = goog.require('tink.Util');
+
+/**
+ * @implements {KeyManager.PrivateKeyFactory}
+ * @final
+ */
+class EciesAeadHkdfPrivateKeyFactory {
+  /**
+   * @override
+   * @return {!Promise<!PbEciesAeadHkdfPrivateKey>}
+   */
+  async newKey(keyFormat) {
+    if (!keyFormat) {
+      throw new SecurityException('Key format has to be non-null.');
+    }
+    const keyFormatProto =
+        EciesAeadHkdfPrivateKeyFactory.getKeyFormatProto_(keyFormat);
+    EciesAeadHkdfValidators.validateKeyFormat(keyFormatProto);
+    return await EciesAeadHkdfPrivateKeyFactory.newKeyImpl_(keyFormatProto);
+  }
+
+  /**
+   * @override
+   * @return {!Promise<!PbKeyData>}
+   */
+  async newKeyData(serializedKeyFormat) {
+    const key = await this.newKey(serializedKeyFormat);
+
+    const keyData =
+        new PbKeyData()
+            .setTypeUrl(EciesAeadHkdfPrivateKeyManager.KEY_TYPE)
+            .setValue(key.serializeBinary())
+            .setKeyMaterialType(PbKeyData.KeyMaterialType.ASYMMETRIC_PRIVATE);
+    return keyData;
+  }
+
+  /** @override */
+  getPublicKeyData(serializedPrivateKey) {
+    const privateKey = EciesAeadHkdfPrivateKeyManager.deserializePrivateKey_(
+        serializedPrivateKey);
+
+    const publicKeyData =
+        new PbKeyData()
+            .setValue(privateKey.getPublicKey().serializeBinary())
+            .setTypeUrl(EciesAeadHkdfPublicKeyManager.KEY_TYPE)
+            .setKeyMaterialType(PbKeyData.KeyMaterialType.ASYMMETRIC_PUBLIC);
+    return publicKeyData;
+  }
+
+  /**
+   * Generates key corresponding to the given key format.
+   * WARNING: This function assume that the keyFormat has been validated.
+   *
+   * @private
+   * @param {!PbEciesAeadHkdfKeyFormat} keyFormat
+   * @return {!Promise<!PbEciesAeadHkdfPrivateKey>}
+   */
+  static async newKeyImpl_(keyFormat) {
+    const params =
+        /** @type {!PbEciesAeadHkdfParams} */ (keyFormat.getParams());
+    const curveTypeProto = params.getKemParams().getCurveType();
+    const curveTypeSubtle = Util.curveTypeProtoToSubtle(curveTypeProto);
+    const curveName = EllipticCurves.curveToString(curveTypeSubtle);
+    const keyPair = await EllipticCurves.generateKeyPair('ECDH', curveName);
+
+    const jsonPublicKey =
+        await EllipticCurves.exportCryptoKey(/** @type {?} */ (keyPair).publicKey);
+    const jsonPrivateKey =
+        await EllipticCurves.exportCryptoKey(/** @type {?} */ (keyPair).privateKey);
+    return EciesAeadHkdfPrivateKeyFactory.jsonToProtoKey_(
+        jsonPrivateKey, jsonPublicKey, params);
+  }
+
+  /**
+   * Creates a private key proto corresponding to given JSON key pair and with
+   * the given params.
+   *
+   * @private
+   * @param {!webCrypto.JsonWebKey} jsonPrivateKey
+   * @param {!webCrypto.JsonWebKey} jsonPublicKey
+   * @param {!PbEciesAeadHkdfParams} params
+   * @return {!PbEciesAeadHkdfPrivateKey}
+   */
+  static jsonToProtoKey_(jsonPrivateKey, jsonPublicKey, params) {
+    const publicKeyProto =
+        new PbEciesAeadHkdfPublicKey()
+            .setVersion(EciesAeadHkdfPublicKeyManager.VERSION)
+            .setParams(params)
+            .setX(Bytes.fromBase64(jsonPublicKey['x'], true))
+            .setY(Bytes.fromBase64(jsonPublicKey['y'], true));
+
+    const privateKeyProto =
+        new PbEciesAeadHkdfPrivateKey()
+            .setVersion(EciesAeadHkdfPrivateKeyManager.VERSION_)
+            .setPublicKey(publicKeyProto)
+            .setKeyValue(Bytes.fromBase64(jsonPrivateKey['d'], true));
+    return privateKeyProto;
+  }
+
+  /**
+   * The input keyFormat is either deserialized (in case that the input is
+   * Uint8Array) or checked to be an EciesAeadHkdfKeyFormat-proto (otherwise).
+   *
+   * @private
+   * @param {!PbMessage|!Uint8Array} keyFormat
+   * @return {!PbEciesAeadHkdfKeyFormat}
+   */
+  static getKeyFormatProto_(keyFormat) {
+    if (keyFormat instanceof Uint8Array) {
+      return EciesAeadHkdfPrivateKeyFactory.deserializeKeyFormat_(keyFormat);
+    } else {
+      if (keyFormat instanceof PbEciesAeadHkdfKeyFormat) {
+        return keyFormat;
+      } else {
+        throw new SecurityException(
+            'Expected ' + EciesAeadHkdfPrivateKeyManager.KEY_TYPE +
+            ' key format proto.');
+      }
+    }
+  }
+
+  /**
+   * @private
+   * @param {!Uint8Array} keyFormat
+   * @return {!PbEciesAeadHkdfKeyFormat}
+   */
+  static deserializeKeyFormat_(keyFormat) {
+    let /** !PbEciesAeadHkdfKeyFormat */ keyFormatProto;
+    try {
+      keyFormatProto = PbEciesAeadHkdfKeyFormat.deserializeBinary(keyFormat);
+    } catch (e) {
+      throw new SecurityException(
+          'Input cannot be parsed as ' +
+          EciesAeadHkdfPrivateKeyManager.KEY_TYPE + ' key format proto.');
+    }
+    if (!keyFormatProto.getParams()) {
+      throw new SecurityException(
+          'Input cannot be parsed as ' +
+          EciesAeadHkdfPrivateKeyManager.KEY_TYPE + ' key format proto.');
+    }
+    return keyFormatProto;
+  }
+}
+
+
+/**
+ * @implements {KeyManager.KeyManager<HybridDecrypt>}
+ * @final
+ */
+class EciesAeadHkdfPrivateKeyManager {
+  constructor() {
+    this.keyFactory = new EciesAeadHkdfPrivateKeyFactory();
+  }
+
+  /** @override */
+  async getPrimitive(primitiveType, key) {
+    if (primitiveType !== this.getPrimitiveType()) {
+      throw new SecurityException(
+          'Requested primitive type which is not ' +
+          'supported by this key manager.');
+    }
+
+    const keyProto = EciesAeadHkdfPrivateKeyManager.getKeyProto_(key);
+    EciesAeadHkdfValidators.validatePrivateKey(
+        keyProto, EciesAeadHkdfPrivateKeyManager.VERSION_,
+        EciesAeadHkdfPublicKeyManager.VERSION);
+
+    const recepientPrivateKey = EciesAeadHkdfUtil.getJsonWebKeyFromProto(keyProto);
+    const params = /** @type {!PbEciesAeadHkdfParams} */ (
+        keyProto.getPublicKey().getParams());
+    const keyTemplate =
+        /** @type {!PbKeyTemplate} */ (params.getDemParams().getAeadDem());
+    const demHelper = new RegistryEciesAeadHkdfDemHelper(keyTemplate);
+    const pointFormat =
+        Util.pointFormatProtoToSubtle(params.getEcPointFormat());
+    const hkdfHash =
+        Util.hashTypeProtoToString(params.getKemParams().getHkdfHashType());
+    const hkdfSalt = params.getKemParams().getHkdfSalt_asU8();
+
+    return await EciesAeadHkdfHybridDecrypt.newInstance(
+        recepientPrivateKey, hkdfHash, pointFormat, demHelper, hkdfSalt);
+  }
+
+  /** @override */
+  doesSupport(keyType) {
+    return keyType === this.getKeyType();
+  }
+
+  /** @override */
+  getKeyType() {
+    return EciesAeadHkdfPrivateKeyManager.KEY_TYPE;
+  }
+
+  /** @override */
+  getPrimitiveType() {
+    return EciesAeadHkdfPrivateKeyManager.SUPPORTED_PRIMITIVE_;
+  }
+
+  /** @override */
+  getVersion() {
+    return EciesAeadHkdfPrivateKeyManager.VERSION_;
+  }
+
+  /** @override */
+  getKeyFactory() {
+    return this.keyFactory;
+  }
+
+  /**
+   * @private
+   * @param {!PbKeyData|!PbMessage} keyMaterial
+   * @return {!PbEciesAeadHkdfPrivateKey}
+   */
+  static getKeyProto_(keyMaterial) {
+    if (keyMaterial instanceof PbKeyData) {
+      return EciesAeadHkdfPrivateKeyManager.getKeyProtoFromKeyData_(
+          keyMaterial);
+    }
+    if (keyMaterial instanceof PbEciesAeadHkdfPrivateKey) {
+      return keyMaterial;
+    }
+    throw new SecurityException(
+        'Key type is not supported. This key ' +
+        'manager supports ' + EciesAeadHkdfPrivateKeyManager.KEY_TYPE + '.');
+  }
+
+  /**
+   * @private
+   * @param {!PbKeyData} keyData
+   * @return {!PbEciesAeadHkdfPrivateKey}
+   */
+  static getKeyProtoFromKeyData_(keyData) {
+    if (keyData.getTypeUrl() !== EciesAeadHkdfPrivateKeyManager.KEY_TYPE) {
+      throw new SecurityException(
+          'Key type ' + keyData.getTypeUrl() +
+          ' is not supported. This key manager supports ' +
+          EciesAeadHkdfPrivateKeyManager.KEY_TYPE + '.');
+    }
+    return EciesAeadHkdfPrivateKeyManager.deserializePrivateKey_(
+        keyData.getValue_asU8());
+  }
+
+  /**
+   * @private
+   * @param {!Uint8Array} serializedPrivateKey
+   * @return {!PbEciesAeadHkdfPrivateKey}
+   */
+  static deserializePrivateKey_(serializedPrivateKey) {
+    let /** PbEciesAeadHkdfPrivateKey */ key;
+    try {
+      key = PbEciesAeadHkdfPrivateKey.deserializeBinary(serializedPrivateKey);
+    } catch (e) {
+      throw new SecurityException(
+          'Input cannot be parsed as ' +
+          EciesAeadHkdfPrivateKeyManager.KEY_TYPE + ' key-proto.');
+    }
+    if (!key.getPublicKey() || !key.getKeyValue()) {
+      throw new SecurityException(
+          'Input cannot be parsed as ' +
+          EciesAeadHkdfPrivateKeyManager.KEY_TYPE + ' key-proto.');
+    }
+    return key;
+  }
+}
+
+/** @const @private {!Object} */
+EciesAeadHkdfPrivateKeyManager.SUPPORTED_PRIMITIVE_ = HybridDecrypt;
+/** @const @public {string} */
+EciesAeadHkdfPrivateKeyManager.KEY_TYPE =
+    'type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey';
+/** @const @private {number} */
+EciesAeadHkdfPrivateKeyManager.VERSION_ = 0;
+
+exports = EciesAeadHkdfPrivateKeyManager;
diff --git a/javascript/hybrid/ecies_aead_hkdf_private_key_manager_test.js b/javascript/hybrid/ecies_aead_hkdf_private_key_manager_test.js
new file mode 100644
index 0000000..7a4350f
--- /dev/null
+++ b/javascript/hybrid/ecies_aead_hkdf_private_key_manager_test.js
@@ -0,0 +1,586 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.hybrid.EciesAeadHkdfPrivateKeyManagerTest');
+goog.setTestOnly('tink.hybrid.EciesAeadHkdfPrivateKeyManagerTest');
+
+const AeadConfig = goog.require('tink.aead.AeadConfig');
+const AeadKeyTemplates = goog.require('tink.aead.AeadKeyTemplates');
+const EciesAeadHkdfPrivateKeyManager = goog.require('tink.hybrid.EciesAeadHkdfPrivateKeyManager');
+const EciesAeadHkdfPublicKeyManager = goog.require('tink.hybrid.EciesAeadHkdfPublicKeyManager');
+const HybridDecrypt = goog.require('tink.HybridDecrypt');
+const HybridEncrypt = goog.require('tink.HybridEncrypt');
+const KeyManager = goog.require('tink.KeyManager');
+const PbAesCtrKeyFormat = goog.require('proto.google.crypto.tink.AesCtrKeyFormat');
+const PbEciesAeadDemParams = goog.require('proto.google.crypto.tink.EciesAeadDemParams');
+const PbEciesAeadHkdfKeyFormat = goog.require('proto.google.crypto.tink.EciesAeadHkdfKeyFormat');
+const PbEciesAeadHkdfParams = goog.require('proto.google.crypto.tink.EciesAeadHkdfParams');
+const PbEciesAeadHkdfPrivateKey = goog.require('proto.google.crypto.tink.EciesAeadHkdfPrivateKey');
+const PbEciesAeadHkdfPublicKey = goog.require('proto.google.crypto.tink.EciesAeadHkdfPublicKey');
+const PbEciesHkdfKemParams = goog.require('proto.google.crypto.tink.EciesHkdfKemParams');
+const PbEllipticCurveType = goog.require('proto.google.crypto.tink.EllipticCurveType');
+const PbHashType = goog.require('proto.google.crypto.tink.HashType');
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const PbKeyTemplate = goog.require('proto.google.crypto.tink.KeyTemplate');
+const PbPointFormat = goog.require('proto.google.crypto.tink.EcPointFormat');
+const Random = goog.require('tink.subtle.Random');
+const Registry = goog.require('tink.Registry');
+const TestCase = goog.require('goog.testing.TestCase');
+const testSuite = goog.require('goog.testing.testSuite');
+const userAgent = goog.require('goog.userAgent');
+
+const PRIVATE_KEY_TYPE =
+    'type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey';
+const PRIVATE_KEY_MATERIAL_TYPE = PbKeyData.KeyMaterialType.ASYMMETRIC_PRIVATE;
+const VERSION = 0;
+const PRIVATE_KEY_MANAGER_PRIMITIVE = HybridDecrypt;
+
+const PUBLIC_KEY_TYPE =
+    'type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey';
+const PUBLIC_KEY_MATERIAL_TYPE = PbKeyData.KeyMaterialType.ASYMMETRIC_PUBLIC;
+const PUBLIC_KEY_MANAGER_PRIMITIVE = HybridEncrypt;
+
+testSuite({
+  shouldRunTests() {
+    return !userAgent.EDGE;  // b/120286783
+  },
+
+  setUp() {
+    AeadConfig.register();
+    // Use a generous promise timeout for running continuously.
+    TestCase.getActiveTestCase().promiseTimeout = 1000 * 1000;  // 1000s
+  },
+
+  tearDown() {
+    Registry.reset();
+    // Reset the promise timeout to default value.
+    TestCase.getActiveTestCase().promiseTimeout = 1000;  // 1s
+  },
+
+  async testNewKey_nullKeyFormat() {
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+
+    try {
+      await manager.getKeyFactory().newKey(null);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.nullKeyFormat(), e.toString());
+    }
+  },
+
+  async testNewKey_invalidSerializedKeyFormat() {
+    const invalidSerializedKeyFormat = new Uint8Array(0);
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+
+    try {
+      await manager.getKeyFactory().newKey(invalidSerializedKeyFormat);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.invalidSerializedKeyFormat(), e.toString());
+    }
+  },
+
+  async testNewKey_unsupportedKeyFormatProto() {
+    const unsupportedKeyFormatProto = new PbAesCtrKeyFormat();
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+
+    try {
+      await manager.getKeyFactory().newKey(unsupportedKeyFormatProto);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unsupportedKeyFormat(), e.toString());
+    }
+  },
+
+  async testNewKey_invalidFormat_missingParams() {
+    const invalidFormat = new PbEciesAeadHkdfKeyFormat();
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+
+    try {
+      await manager.getKeyFactory().newKey(invalidFormat);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.invalidKeyFormatMissingParams(), e.toString());
+    }
+  },
+
+  async testNewKey_invalidFormat_invalidParams() {
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+
+    // unknown point format
+    const invalidFormat = createKeyFormat();
+    invalidFormat.getParams().setEcPointFormat(PbPointFormat.UNKNOWN_FORMAT);
+    try {
+      await manager.getKeyFactory().newKey(invalidFormat);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unknownPointFormat(), e.toString());
+    }
+    invalidFormat.getParams().setEcPointFormat(PbPointFormat.UNCOMPRESSED);
+
+    // missing KEM params
+    invalidFormat.getParams().setKemParams(null);
+    try {
+      await manager.getKeyFactory().newKey(invalidFormat);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingKemParams(), e.toString());
+    }
+    invalidFormat.getParams().setKemParams(createKemParams());
+
+    // unsupported AEAD template
+    const templateTypeUrl = 'UNSUPPORTED_KEY_TYPE_URL';
+    invalidFormat.getParams().getDemParams().getAeadDem().setTypeUrl(
+        templateTypeUrl);
+    try {
+      await manager.getKeyFactory().newKey(invalidFormat);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          ExceptionText.unsupportedKeyTemplate(templateTypeUrl), e.toString());
+    }
+  },
+
+  async testNewKey_viaKeyFormat() {
+    const keyFormats = createTestSetOfKeyFormats();
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+
+    for (let keyFormat of keyFormats) {
+      const key = /** @type{!PbEciesAeadHkdfPrivateKey} */ (
+          await manager.getKeyFactory().newKey(keyFormat));
+
+      assertObjectEquals(keyFormat.getParams(), key.getPublicKey().getParams());
+      // The keys are tested more in tests for getPrimitive method below, where
+      // the primitive based on the created key is tested.
+    }
+  },
+
+  async testNewKeyData_invalidSerializedKeyFormat() {
+    const serializedKeyFormats = [new Uint8Array(1), new Uint8Array(0)];
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+
+    const serializedKeyFormatsLength = serializedKeyFormats.length;
+    for (let i = 0; i < serializedKeyFormatsLength; i++) {
+      try {
+        await manager.getKeyFactory().newKeyData(serializedKeyFormats[i]);
+        fail(
+            'An exception should be thrown for the string: ' +
+            serializedKeyFormats[i]);
+      } catch (e) {
+        assertEquals(ExceptionText.invalidSerializedKeyFormat(), e.toString());
+        continue;
+      }
+    }
+  },
+
+  async testNewKeyData_fromValidKeyFormat() {
+    const keyFormats = createTestSetOfKeyFormats();
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+
+    for (let keyFormat of keyFormats) {
+      const serializedKeyFormat = keyFormat.serializeBinary();
+      const keyData = /** @type{!PbKeyData} */ (
+          await manager.getKeyFactory().newKeyData(serializedKeyFormat));
+
+      assertEquals(PRIVATE_KEY_TYPE, keyData.getTypeUrl());
+      assertEquals(PRIVATE_KEY_MATERIAL_TYPE, keyData.getKeyMaterialType());
+
+      const key =
+          PbEciesAeadHkdfPrivateKey.deserializeBinary(keyData.getValue());
+      assertObjectEquals(keyFormat.getParams(), key.getPublicKey().getParams());
+      // The keys are tested more in tests for getPrimitive method below, where
+      // the primitive based on the created key is tested.
+    }
+  },
+
+  testGetPublicKeyData_invalidPrivateKeySerialization() {
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+
+    const privateKey = new Uint8Array([0, 1]);  // not a serialized private key
+    try {
+      const factory = /** @type {!KeyManager.PrivateKeyFactory} */ (
+          manager.getKeyFactory());
+      factory.getPublicKeyData(privateKey);
+    } catch (e) {
+      assertEquals(ExceptionText.invalidSerializedKey(), e.toString());
+    }
+  },
+
+  async testGetPublicKeyData_shouldWork() {
+    const keyFormat = createKeyFormat();
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+
+    const privateKey = /** @type{!PbEciesAeadHkdfPrivateKey} */ (
+        await manager.getKeyFactory().newKey(keyFormat));
+    const factory =
+        /** @type {!KeyManager.PrivateKeyFactory} */ (manager.getKeyFactory());
+    const publicKeyData =
+        factory.getPublicKeyData(privateKey.serializeBinary());
+
+    assertEquals(PUBLIC_KEY_TYPE, publicKeyData.getTypeUrl());
+    assertEquals(PUBLIC_KEY_MATERIAL_TYPE, publicKeyData.getKeyMaterialType());
+    const publicKey =
+        PbEciesAeadHkdfPublicKey.deserializeBinary(publicKeyData.getValue());
+    assertObjectEquals(
+        privateKey.getPublicKey().getVersion(), publicKey.getVersion());
+    assertObjectEquals(
+        privateKey.getPublicKey().getParams(), publicKey.getParams());
+    assertObjectEquals(privateKey.getPublicKey().getX(), publicKey.getX());
+    assertObjectEquals(privateKey.getPublicKey().getY(), publicKey.getY());
+  },
+
+  async testGetPrimitive_unsupportedPrimitiveType() {
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+    const keyFormat = createKeyFormat();
+    const key = await manager.getKeyFactory().newKey(keyFormat);
+
+    try {
+      await manager.getPrimitive(HybridEncrypt, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unsupportedPrimitive(), e.toString());
+    }
+  },
+
+  async testGetPrimitive_unsupportedKeyDataType() {
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+    const keyFormat = createKeyFormat();
+    const keyData =
+        (await manager.getKeyFactory().newKeyData(keyFormat.serializeBinary()))
+            .setTypeUrl('unsupported_key_type_url');
+
+    try {
+      await manager.getPrimitive(PRIVATE_KEY_MANAGER_PRIMITIVE, keyData);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          ExceptionText.unsupportedKeyType(keyData.getTypeUrl()), e.toString());
+    }
+  },
+
+  async testGetPrimitive_unsupportedKeyType() {
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+    let key = new PbEciesAeadHkdfPublicKey();
+
+    try {
+      await manager.getPrimitive(PRIVATE_KEY_MANAGER_PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unsupportedKeyType(), e.toString());
+    }
+  },
+
+  async testGetPrimitive_highVersion() {
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+    const version = manager.getVersion() + 1;
+    const keyFormat = createKeyFormat();
+    const key =
+        (await manager.getKeyFactory().newKey(keyFormat)).setVersion(version);
+    try {
+      await manager.getPrimitive(PRIVATE_KEY_MANAGER_PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.versionOutOfBounds(), e.toString());
+    }
+  },
+
+
+  async testGetPrimitive_invalidParams() {
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+    const keyFormat = createKeyFormat();
+    const key = await manager.getKeyFactory().newKey(keyFormat);
+
+    // missing KEM params
+    key.getPublicKey().getParams().setKemParams(null);
+    try {
+      await manager.getPrimitive(PRIVATE_KEY_MANAGER_PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingKemParams(), e.toString());
+    }
+    key.getPublicKey().getParams().setKemParams(createKemParams());
+
+    // unsupported AEAD key template type URL
+    const templateTypeUrl = 'UNSUPPORTED_KEY_TYPE_URL';
+    key.getPublicKey().getParams().getDemParams().getAeadDem().setTypeUrl(
+        templateTypeUrl);
+    try {
+      await manager.getPrimitive(PRIVATE_KEY_MANAGER_PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          ExceptionText.unsupportedKeyTemplate(templateTypeUrl), e.toString());
+    }
+  },
+
+  async testGetPrimitive_invalidSerializedKey() {
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+    const keyFormat = createKeyFormat();
+    const keyData =
+        await manager.getKeyFactory().newKeyData(keyFormat.serializeBinary());
+
+
+    for (let i = 0; i < 2; ++i) {
+      // Set the value of keyData to something which is not a serialization of a
+      // proper key.
+      keyData.setValue(new Uint8Array(i));
+      try {
+        await manager.getPrimitive(PRIVATE_KEY_MANAGER_PRIMITIVE, keyData);
+        fail('An exception should be thrown ' + i.toString());
+      } catch (e) {
+        assertEquals(ExceptionText.invalidSerializedKey(), e.toString());
+      }
+    }
+  },
+
+  async testGetPrimitive_fromKey() {
+    const keyFormats = createTestSetOfKeyFormats();
+    const privateKeyManager = new EciesAeadHkdfPrivateKeyManager();
+    const publicKeyManager = new EciesAeadHkdfPublicKeyManager();
+
+    for (let keyFormat of keyFormats) {
+      const key = await privateKeyManager.getKeyFactory().newKey(keyFormat);
+
+      const /** HybridEncrypt */ hybridEncrypt =
+          await publicKeyManager.getPrimitive(
+              PUBLIC_KEY_MANAGER_PRIMITIVE, key.getPublicKey());
+      const /** HybridDecrypt */ hybridDecrypt =
+          await privateKeyManager.getPrimitive(
+              PRIVATE_KEY_MANAGER_PRIMITIVE, key);
+
+      const plaintext = Random.randBytes(10);
+      const ciphertext = await hybridEncrypt.encrypt(plaintext);
+      const decryptedCiphertext = await hybridDecrypt.decrypt(ciphertext);
+
+      assertObjectEquals(plaintext, decryptedCiphertext);
+    }
+  },
+
+  async testGetPrimitive_fromKeyData() {
+    const keyFormats = createTestSetOfKeyFormats();
+    const privateKeyManager = new EciesAeadHkdfPrivateKeyManager();
+    const publicKeyManager = new EciesAeadHkdfPublicKeyManager();
+
+    for (let keyFormat of keyFormats) {
+      const serializedKeyFormat = keyFormat.serializeBinary();
+      const keyData = await privateKeyManager.getKeyFactory().newKeyData(
+          serializedKeyFormat);
+      const factory = /** @type {!KeyManager.PrivateKeyFactory} */ (
+          privateKeyManager.getKeyFactory());
+      const publicKeyData = factory.getPublicKeyData(keyData.getValue_asU8());
+
+      const /** HybridEncrypt */ hybridEncrypt =
+          await publicKeyManager.getPrimitive(
+              PUBLIC_KEY_MANAGER_PRIMITIVE, publicKeyData);
+      const /** HybridDecrypt */ hybridDecrypt =
+          await privateKeyManager.getPrimitive(
+              PRIVATE_KEY_MANAGER_PRIMITIVE, keyData);
+
+      const plaintext = Random.randBytes(10);
+      const ciphertext = await hybridEncrypt.encrypt(plaintext);
+      const decryptedCiphertext = await hybridDecrypt.decrypt(ciphertext);
+
+      assertObjectEquals(plaintext, decryptedCiphertext);
+    }
+  },
+
+  testDoesSupport() {
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+    assertTrue(manager.doesSupport(PRIVATE_KEY_TYPE));
+  },
+
+  testGetKeyType() {
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+    assertEquals(PRIVATE_KEY_TYPE, manager.getKeyType());
+  },
+
+  testGetPrimitiveType() {
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+    assertEquals(PRIVATE_KEY_MANAGER_PRIMITIVE, manager.getPrimitiveType());
+  },
+
+  testGetVersion() {
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+    assertEquals(VERSION, manager.getVersion());
+  },
+});
+
+// Helper classes and functions
+class ExceptionText {
+  /** @return {string} */
+  static nullKeyFormat() {
+    return 'CustomError: Key format has to be non-null.';
+  }
+
+  /** @return {string} */
+  static invalidSerializedKeyFormat() {
+    return 'CustomError: Input cannot be parsed as ' + PRIVATE_KEY_TYPE +
+        ' key format proto.';
+  }
+
+  /** @return {string} */
+  static unsupportedPrimitive() {
+    return 'CustomError: Requested primitive type which is not supported by ' +
+        'this key manager.';
+  }
+
+  /** @return {string} */
+  static unsupportedKeyFormat() {
+    return 'CustomError: Expected ' + PRIVATE_KEY_TYPE + ' key format proto.';
+  }
+
+  /**
+   * @param {string=} opt_requestedKeyType
+   * @return {string}
+   */
+  static unsupportedKeyType(opt_requestedKeyType) {
+    const prefix = 'CustomError: Key type';
+    const suffix =
+        'is not supported. This key manager supports ' + PRIVATE_KEY_TYPE + '.';
+    if (opt_requestedKeyType) {
+      return prefix + ' ' + opt_requestedKeyType + ' ' + suffix;
+    } else {
+      return prefix + ' ' + suffix;
+    }
+  }
+
+  /** @return {string} */
+  static versionOutOfBounds() {
+    return 'CustomError: Version is out of bound, must be between 0 and ' +
+        VERSION + '.';
+  }
+
+  /** @return {string} */
+  static invalidKeyFormatMissingParams() {
+    return 'CustomError: Invalid key format - missing key params.';
+  }
+
+  /** @return {string} */
+  static unknownPointFormat() {
+    return 'CustomError: Invalid key params - unknown EC point format.';
+  }
+
+  /** @return {string} */
+  static missingKemParams() {
+    return 'CustomError: Invalid params - missing KEM params.';
+  }
+
+  /**
+   * @param {string} templateTypeUrl
+   * @return {string}
+   */
+  static unsupportedKeyTemplate(templateTypeUrl) {
+    return 'CustomError: Invalid DEM params - ' + templateTypeUrl +
+        ' template is not supported by ECIES AEAD HKDF.';
+  }
+
+  /** @return {string} */
+  static invalidSerializedKey() {
+    return 'CustomError: Input cannot be parsed as ' + PRIVATE_KEY_TYPE +
+        ' key-proto.';
+  }
+}
+
+/**
+ * @param {PbEllipticCurveType=} opt_curveType (default: NIST_P256)
+ * @param {PbHashType=} opt_hashType (default: SHA256)
+ *
+ * @return {!PbEciesHkdfKemParams}
+ */
+const createKemParams = function(
+    opt_curveType = PbEllipticCurveType.NIST_P256,
+    opt_hashType = PbHashType.SHA256) {
+  const kemParams = new PbEciesHkdfKemParams()
+                        .setCurveType(opt_curveType)
+                        .setHkdfHashType(opt_hashType);
+
+  return kemParams;
+};
+
+/**
+ * @param {!PbKeyTemplate=} opt_keyTemplate (default: aes128CtrHmac256)
+ * @return {!PbEciesAeadDemParams}
+ */
+const createDemParams = function(opt_keyTemplate) {
+  if (!opt_keyTemplate) {
+    opt_keyTemplate = AeadKeyTemplates.aes128CtrHmacSha256();
+  }
+
+  const demParams = new PbEciesAeadDemParams().setAeadDem(opt_keyTemplate);
+
+  return demParams;
+};
+
+/**
+ * @param {PbEllipticCurveType=} opt_curveType (default: NIST_P256)
+ * @param {PbHashType=} opt_hashType (default: SHA256)
+ * @param {!PbKeyTemplate=} opt_keyTemplate (default: aes128CtrHmac256)
+ * @param {PbPointFormat=} opt_pointFormat (default: UNCOMPRESSED)
+ *
+ * @return {!PbEciesAeadHkdfParams}
+ */
+const createKeyParams = function(
+    opt_curveType, opt_hashType, opt_keyTemplate,
+    opt_pointFormat = PbPointFormat.UNCOMPRESSED) {
+  const params = new PbEciesAeadHkdfParams()
+                     .setKemParams(createKemParams(opt_curveType, opt_hashType))
+                     .setDemParams(createDemParams(opt_keyTemplate))
+                     .setEcPointFormat(opt_pointFormat);
+
+  return params;
+};
+
+/**
+ * @param {PbEllipticCurveType=} opt_curveType (default: NIST_P256)
+ * @param {PbHashType=} opt_hashType (default: SHA256)
+ * @param {!PbKeyTemplate=} opt_keyTemplate (default: aes128CtrHmac256)
+ * @param {PbPointFormat=} opt_pointFormat (default: UNCOMPRESSED)
+ *
+ * @return {!PbEciesAeadHkdfKeyFormat}
+ */
+const createKeyFormat = function(
+    opt_curveType, opt_hashType, opt_keyTemplate, opt_pointFormat) {
+  const keyFormat = new PbEciesAeadHkdfKeyFormat().setParams(createKeyParams(
+      opt_curveType, opt_hashType, opt_keyTemplate, opt_pointFormat));
+  return keyFormat;
+};
+
+// Create set of key formats with all possible predefined/supported parameters.
+/** @return {!Array<!PbEciesAeadHkdfKeyFormat>} */
+const createTestSetOfKeyFormats = function() {
+  const curveTypes = [
+    PbEllipticCurveType.NIST_P256, PbEllipticCurveType.NIST_P384,
+    PbEllipticCurveType.NIST_P521
+  ];
+  const hashTypes = [PbHashType.SHA1, PbHashType.SHA256, PbHashType.SHA512];
+  const keyTemplates = [
+    AeadKeyTemplates.aes128CtrHmacSha256(),
+    AeadKeyTemplates.aes256CtrHmacSha256()
+  ];
+  const pointFormats = [PbPointFormat.UNCOMPRESSED];
+
+  const /** !Array<!PbEciesAeadHkdfKeyFormat> */ keyFormats = [];
+  for (let curve of curveTypes) {
+    for (let hkdfHash of hashTypes) {
+      for (let keyTemplate of keyTemplates) {
+        for (let pointFormat of pointFormats) {
+          const keyFormat =
+              createKeyFormat(curve, hkdfHash, keyTemplate, pointFormat);
+          keyFormats.push(keyFormat);
+        }
+      }
+    }
+  }
+  return keyFormats;
+};
diff --git a/javascript/hybrid/ecies_aead_hkdf_public_key_manager.js b/javascript/hybrid/ecies_aead_hkdf_public_key_manager.js
new file mode 100644
index 0000000..d2c4778
--- /dev/null
+++ b/javascript/hybrid/ecies_aead_hkdf_public_key_manager.js
@@ -0,0 +1,166 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.hybrid.EciesAeadHkdfPublicKeyManager');
+
+const EciesAeadHkdfHybridEncrypt = goog.require('tink.subtle.EciesAeadHkdfHybridEncrypt');
+const EciesAeadHkdfUtil = goog.require('tink.hybrid.EciesAeadHkdfUtil');
+const EciesAeadHkdfValidators = goog.require('tink.hybrid.EciesAeadHkdfValidators');
+const HybridEncrypt = goog.require('tink.HybridEncrypt');
+const KeyManager = goog.require('tink.KeyManager');
+const PbEciesAeadHkdfParams = goog.require('proto.google.crypto.tink.EciesAeadHkdfParams');
+const PbEciesAeadHkdfPublicKey = goog.require('proto.google.crypto.tink.EciesAeadHkdfPublicKey');
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const PbKeyTemplate = goog.require('proto.google.crypto.tink.KeyTemplate');
+const PbMessage = goog.require('jspb.Message');
+const RegistryEciesAeadHkdfDemHelper = goog.require('tink.hybrid.RegistryEciesAeadHkdfDemHelper');
+const SecurityException = goog.require('tink.exception.SecurityException');
+const Util = goog.require('tink.Util');
+
+/**
+ * @implements {KeyManager.KeyFactory}
+ * @final
+ */
+class EciesAeadHkdfPublicKeyFactory {
+  /** @override */
+  newKey(keyFormat) {
+    throw new SecurityException(
+        'This operation is not supported for public keys. ' +
+        'Use EciesAeadHkdfPrivateKeyManager to generate new keys.');
+  }
+
+  /** @override */
+  newKeyData(serializedKeyFormat) {
+    throw new SecurityException(
+        'This operation is not supported for public keys. ' +
+        'Use EciesAeadHkdfPrivateKeyManager to generate new keys.');
+  }
+}
+
+
+/**
+ * @implements {KeyManager.KeyManager<HybridEncrypt>}
+ * @final
+ */
+class EciesAeadHkdfPublicKeyManager {
+  constructor() {
+    this.keyFactory = new EciesAeadHkdfPublicKeyFactory();
+  }
+
+  /** @override */
+  async getPrimitive(primitiveType, key) {
+    if (primitiveType !== this.getPrimitiveType()) {
+      throw new SecurityException(
+          'Requested primitive type which is not ' +
+          'supported by this key manager.');
+    }
+
+    const keyProto = EciesAeadHkdfPublicKeyManager.getKeyProto_(key);
+    EciesAeadHkdfValidators.validatePublicKey(keyProto, this.getVersion());
+
+    const recepientPublicKey = EciesAeadHkdfUtil.getJsonWebKeyFromProto(keyProto);
+    const params = /** @type{!PbEciesAeadHkdfParams} */ (keyProto.getParams());
+    const keyTemplate =
+        /** @type {!PbKeyTemplate} */ (params.getDemParams().getAeadDem());
+    const demHelper = new RegistryEciesAeadHkdfDemHelper(keyTemplate);
+    const pointFormat =
+        Util.pointFormatProtoToSubtle(params.getEcPointFormat());
+    const hkdfHash =
+        Util.hashTypeProtoToString(params.getKemParams().getHkdfHashType());
+    const hkdfSalt = params.getKemParams().getHkdfSalt_asU8();
+
+    return await EciesAeadHkdfHybridEncrypt.newInstance(
+        recepientPublicKey, hkdfHash, pointFormat, demHelper, hkdfSalt);
+  }
+
+  /** @override */
+  doesSupport(keyType) {
+    return keyType === this.getKeyType();
+  }
+
+  /** @override */
+  getKeyType() {
+    return EciesAeadHkdfPublicKeyManager.KEY_TYPE;
+  }
+
+  /** @override */
+  getPrimitiveType() {
+    return EciesAeadHkdfPublicKeyManager.SUPPORTED_PRIMITIVE_;
+  }
+
+  /** @override */
+  getVersion() {
+    return EciesAeadHkdfPublicKeyManager.VERSION;
+  }
+
+  /** @override */
+  getKeyFactory() {
+    return this.keyFactory;
+  }
+
+  /**
+   * @private
+   * @param {!PbKeyData|!PbMessage} keyMaterial
+   * @return {!PbEciesAeadHkdfPublicKey}
+   */
+  static getKeyProto_(keyMaterial) {
+    if (keyMaterial instanceof PbKeyData) {
+      return EciesAeadHkdfPublicKeyManager.getKeyProtoFromKeyData_(keyMaterial);
+    }
+    if (keyMaterial instanceof PbEciesAeadHkdfPublicKey) {
+      return keyMaterial;
+    }
+    throw new SecurityException(
+        'Key type is not supported. This key manager supports ' +
+        EciesAeadHkdfPublicKeyManager.KEY_TYPE + '.');
+  }
+
+  /**
+   * @private
+   * @param {!PbKeyData} keyData
+   * @return {!PbEciesAeadHkdfPublicKey}
+   */
+  static getKeyProtoFromKeyData_(keyData) {
+    if (keyData.getTypeUrl() !== EciesAeadHkdfPublicKeyManager.KEY_TYPE) {
+      throw new SecurityException(
+          'Key type ' + keyData.getTypeUrl() + ' is not supported. This key ' +
+          'manager supports ' + EciesAeadHkdfPublicKeyManager.KEY_TYPE + '.');
+    }
+
+    let /** PbEciesAeadHkdfPublicKey */ key;
+    try {
+      key = PbEciesAeadHkdfPublicKey.deserializeBinary(keyData.getValue());
+    } catch (e) {
+      throw new SecurityException(
+          'Input cannot be parsed as ' +
+          EciesAeadHkdfPublicKeyManager.KEY_TYPE + ' key-proto.');
+    }
+    if (!key.getParams() || !key.getX() || !key.getY()) {
+      throw new SecurityException(
+          'Input cannot be parsed as ' +
+          EciesAeadHkdfPublicKeyManager.KEY_TYPE + ' key-proto.');
+    }
+    return key;
+  }
+}
+
+/** @const @public {string} */
+EciesAeadHkdfPublicKeyManager.KEY_TYPE =
+    'type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey';
+/** @const @private {!Object} */
+EciesAeadHkdfPublicKeyManager.SUPPORTED_PRIMITIVE_ = HybridEncrypt;
+/** @const @package {number} */
+EciesAeadHkdfPublicKeyManager.VERSION = 0;
+
+exports = EciesAeadHkdfPublicKeyManager;
diff --git a/javascript/hybrid/ecies_aead_hkdf_public_key_manager_test.js b/javascript/hybrid/ecies_aead_hkdf_public_key_manager_test.js
new file mode 100644
index 0000000..7b0a849
--- /dev/null
+++ b/javascript/hybrid/ecies_aead_hkdf_public_key_manager_test.js
@@ -0,0 +1,509 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.hybrid.EciesAeadHkdfPublicKeyManagerTest');
+goog.setTestOnly('tink.hybrid.EciesAeadHkdfPublicKeyManagerTest');
+
+const AeadConfig = goog.require('tink.aead.AeadConfig');
+const AeadKeyTemplates = goog.require('tink.aead.AeadKeyTemplates');
+const Bytes = goog.require('tink.subtle.Bytes');
+const EciesAeadHkdfPublicKeyManager = goog.require('tink.hybrid.EciesAeadHkdfPublicKeyManager');
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const HybridEncrypt = goog.require('tink.HybridEncrypt');
+const Mac = goog.require('tink.Mac');
+const PbAesCtrKey = goog.require('proto.google.crypto.tink.AesCtrKey');
+const PbEciesAeadDemParams = goog.require('proto.google.crypto.tink.EciesAeadDemParams');
+const PbEciesAeadHkdfParams = goog.require('proto.google.crypto.tink.EciesAeadHkdfParams');
+const PbEciesAeadHkdfPublicKey = goog.require('proto.google.crypto.tink.EciesAeadHkdfPublicKey');
+const PbEciesHkdfKemParams = goog.require('proto.google.crypto.tink.EciesHkdfKemParams');
+const PbEllipticCurveType = goog.require('proto.google.crypto.tink.EllipticCurveType');
+const PbHashType = goog.require('proto.google.crypto.tink.HashType');
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const PbKeyTemplate = goog.require('proto.google.crypto.tink.KeyTemplate');
+const PbPointFormat = goog.require('proto.google.crypto.tink.EcPointFormat');
+const Random = goog.require('tink.subtle.Random');
+const Registry = goog.require('tink.Registry');
+const TestCase = goog.require('goog.testing.TestCase');
+const Util = goog.require('tink.Util');
+const testSuite = goog.require('goog.testing.testSuite');
+const userAgent = goog.require('goog.userAgent');
+
+const KEY_TYPE =
+    'type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey';
+const VERSION = 0;
+const PRIMITIVE = HybridEncrypt;
+
+testSuite({
+  shouldRunTests() {
+    return !userAgent.EDGE;  // b/120286783
+  },
+
+  setUp() {
+    AeadConfig.register();
+    // Use a generous promise timeout for running continuously.
+    TestCase.getActiveTestCase().promiseTimeout = 1000 * 1000;  // 1000s
+  },
+
+  tearDown() {
+    Registry.reset();
+    // Reset the promise timeout to default value.
+    TestCase.getActiveTestCase().promiseTimeout = 1000;  // 1s
+  },
+
+  testNewKey() {
+    const manager = new EciesAeadHkdfPublicKeyManager();
+
+    try {
+      manager.getKeyFactory().newKey();
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.notSupported(), e.toString());
+    }
+  },
+
+  testNewKeyData() {
+    const manager = new EciesAeadHkdfPublicKeyManager();
+
+    try {
+      manager.getKeyFactory().newKeyData();
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.notSupported(), e.toString());
+    }
+  },
+
+  async testGetPrimitive_unsupportedPrimitiveType() {
+    const manager = new EciesAeadHkdfPublicKeyManager();
+    const key = await createKey();
+
+    try {
+      await manager.getPrimitive(Mac, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unsupportedPrimitive(), e.toString());
+    }
+  },
+
+  async testGetPrimitive_unsupportedKeyDataType() {
+    const manager = new EciesAeadHkdfPublicKeyManager();
+    const keyData =
+        (await createKeyData()).setTypeUrl('unsupported_key_type_url');
+
+    try {
+      await manager.getPrimitive(PRIMITIVE, keyData);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          ExceptionText.unsupportedKeyType(keyData.getTypeUrl()), e.toString());
+    }
+  },
+
+  async testGetPrimitive_unsupportedKeyType() {
+    const manager = new EciesAeadHkdfPublicKeyManager();
+    let key = new PbAesCtrKey();
+
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unsupportedKeyType(), e.toString());
+    }
+  },
+
+  async testGetPrimitive_highVersion() {
+    const version = 1;
+    const manager = new EciesAeadHkdfPublicKeyManager();
+    const key = (await createKey()).setVersion(version);
+
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.versionOutOfBounds(), e.toString());
+    }
+  },
+
+  async testGetPrimitive_missingParams() {
+    const manager = new EciesAeadHkdfPublicKeyManager();
+    const key = (await createKey()).setParams(null);
+
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingParams(), e.toString());
+    }
+  },
+
+  async testGetPrimitive_invalidParams() {
+    const manager = new EciesAeadHkdfPublicKeyManager();
+    const key = await createKey();
+
+    // unknown point format
+    key.getParams().setEcPointFormat(PbPointFormat.UNKNOWN_FORMAT);
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unknownPointFormat(), e.toString());
+    }
+    key.getParams().setEcPointFormat(PbPointFormat.UNCOMPRESSED);
+
+    // missing KEM params
+    key.getParams().setKemParams(null);
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingKemParams(), e.toString());
+    }
+    key.getParams().setKemParams(createKemParams());
+
+    // unsupported AEAD key template
+    const typeUrl = 'UNSUPPORTED_KEY_TYPE_URL';
+    key.getParams().getDemParams().getAeadDem().setTypeUrl(typeUrl);
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unsupportedKeyTemplate(typeUrl), e.toString());
+    }
+  },
+
+  async testGetPrimitive_invalidKey() {
+    const manager = new EciesAeadHkdfPublicKeyManager();
+    const key = (await createKey()).setX(null);
+
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingXY(), e.toString());
+    }
+    key.getParams().setEcPointFormat(PbPointFormat.UNCOMPRESSED);
+
+    // missing KEM params
+    key.getParams().setKemParams(null);
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingKemParams(), e.toString());
+    }
+    key.getParams().setKemParams(createKemParams());
+
+    // unsupported AEAD key template
+    const typeUrl = 'UNSUPPORTED_KEY_TYPE_URL';
+    key.getParams().getDemParams().getAeadDem().setTypeUrl(typeUrl);
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unsupportedKeyTemplate(typeUrl), e.toString());
+    }
+  },
+
+  async testGetPrimitive_invalidSerializedKey() {
+    const manager = new EciesAeadHkdfPublicKeyManager();
+    const keyData = await createKeyData();
+
+    for (let i = 0; i < 2; ++i) {
+      // Set the value of keyData to something which is not a serialization of a
+      // proper key.
+      keyData.setValue(new Uint8Array(i));
+      try {
+        await manager.getPrimitive(PRIMITIVE, keyData);
+        fail('An exception should be thrown ' + i.toString());
+      } catch (e) {
+        assertEquals(ExceptionText.invalidSerializedKey(), e.toString());
+      }
+    }
+  },
+
+  // tests for getting primitive from valid key/keyData
+  async testGetPrimitive_fromKey() {
+    const manager = new EciesAeadHkdfPublicKeyManager();
+    const keys = await createTestSetOfKeys();
+
+    for (let key of keys) {
+      const /** HybridEncrypt */ primitive =
+          await manager.getPrimitive(PRIMITIVE, key);
+
+      const plaintext = Random.randBytes(10);
+      const ciphertext = await primitive.encrypt(plaintext);
+
+      assertObjectNotEquals(plaintext, ciphertext);
+    }
+  },
+
+  async testGetPrimitive_fromKeyData() {
+    const manager = new EciesAeadHkdfPublicKeyManager();
+    const keyDatas = await createTestSetOfKeyDatas();
+
+    for (let key of keyDatas) {
+      const /** HybridEncrypt */ primitive =
+          await manager.getPrimitive(PRIMITIVE, key);
+
+      const plaintext = Random.randBytes(10);
+      const ciphertext = await primitive.encrypt(plaintext);
+
+      assertObjectNotEquals(plaintext, ciphertext);
+    }
+  },
+
+  testDoesSupport() {
+    const manager = new EciesAeadHkdfPublicKeyManager();
+
+    assertTrue(manager.doesSupport(KEY_TYPE));
+  },
+
+  testGetKeyType() {
+    const manager = new EciesAeadHkdfPublicKeyManager();
+
+    assertEquals(KEY_TYPE, manager.getKeyType());
+  },
+
+  testGetPrimitiveType() {
+    const manager = new EciesAeadHkdfPublicKeyManager();
+
+    assertEquals(PRIMITIVE, manager.getPrimitiveType());
+  },
+
+  testGetVersion() {
+    const manager = new EciesAeadHkdfPublicKeyManager();
+
+    assertEquals(VERSION, manager.getVersion());
+  },
+});
+
+// Helper classes and functions
+class ExceptionText {
+  /** @return {string} */
+  static notSupported() {
+    return 'CustomError: This operation is not supported for public keys. ' +
+        'Use EciesAeadHkdfPrivateKeyManager to generate new keys.';
+  }
+
+  /** @return {string} */
+  static unsupportedPrimitive() {
+    return 'CustomError: Requested primitive type which is not supported by ' +
+        'this key manager.';
+  }
+
+  /**
+   * @param {string=} opt_requestedKeyType
+   * @return {string}
+   */
+  static unsupportedKeyType(opt_requestedKeyType) {
+    const prefix = 'CustomError: Key type';
+    const suffix =
+        'is not supported. This key manager supports ' + KEY_TYPE + '.';
+    if (opt_requestedKeyType) {
+      return prefix + ' ' + opt_requestedKeyType + ' ' + suffix;
+    } else {
+      return prefix + ' ' + suffix;
+    }
+  }
+
+  /** @return {string} */
+  static versionOutOfBounds() {
+    return 'CustomError: Version is out of bound, must be between 0 and ' +
+        VERSION + '.';
+  }
+
+  /** @return {string} */
+  static missingParams() {
+    return 'CustomError: Invalid public key - missing key params.';
+  }
+
+  /** @return {string} */
+  static unknownPointFormat() {
+    return 'CustomError: Invalid key params - unknown EC point format.';
+  }
+
+  /** @return {string} */
+  static missingKemParams() {
+    return 'CustomError: Invalid params - missing KEM params.';
+  }
+
+  /**
+   * @param {string} templateTypeUrl
+   * @return {string}
+   */
+  static unsupportedKeyTemplate(templateTypeUrl) {
+    return 'CustomError: Invalid DEM params - ' + templateTypeUrl +
+        ' template is not supported by ECIES AEAD HKDF.';
+  }
+
+  /** @return {string} */
+  static missingXY() {
+    return 'CustomError: Invalid public key - missing value of X or Y.';
+  }
+
+  /** @return {string} */
+  static invalidSerializedKey() {
+    return 'CustomError: Input cannot be parsed as ' + KEY_TYPE + ' key-proto.';
+  }
+}
+
+/**
+ * @param {PbEllipticCurveType=} opt_curveType (default: NIST_P256)
+ * @param {PbHashType=} opt_hashType (default: SHA256)
+ *
+ * @return {!PbEciesHkdfKemParams}
+ */
+const createKemParams = function(
+    opt_curveType = PbEllipticCurveType.NIST_P256,
+    opt_hashType = PbHashType.SHA256) {
+  const kemParams = new PbEciesHkdfKemParams()
+                        .setCurveType(opt_curveType)
+                        .setHkdfHashType(opt_hashType);
+
+  return kemParams;
+};
+
+/**
+ * @param {!PbKeyTemplate=} opt_keyTemplate (default: aes128CtrHmac256)
+ *
+ * @return {!PbEciesAeadDemParams}
+ */
+const createDemParams = function(opt_keyTemplate) {
+  if (!opt_keyTemplate) {
+    opt_keyTemplate = AeadKeyTemplates.aes128CtrHmacSha256();
+  }
+
+  const demParams = new PbEciesAeadDemParams().setAeadDem(opt_keyTemplate);
+
+  return demParams;
+};
+
+/**
+ * @param {PbEllipticCurveType=} opt_curveType (default: NIST_P256)
+ * @param {PbHashType=} opt_hashType (default: SHA256)
+ * @param {!PbKeyTemplate=} opt_keyTemplate (default: aes128CtrHmac256)
+ * @param {PbPointFormat=} opt_pointFormat (default: UNCOMPRESSED)
+ *
+ * @return {!PbEciesAeadHkdfParams}
+ */
+const createKeyParams = function(
+    opt_curveType, opt_hashType, opt_keyTemplate,
+    opt_pointFormat = PbPointFormat.UNCOMPRESSED) {
+  const params = new PbEciesAeadHkdfParams()
+                     .setKemParams(createKemParams(opt_curveType, opt_hashType))
+                     .setDemParams(createDemParams(opt_keyTemplate))
+                     .setEcPointFormat(opt_pointFormat);
+
+  return params;
+};
+
+
+/**
+ * @param {PbEllipticCurveType=} opt_curveType (default: NIST_P256)
+ * @param {PbHashType=} opt_hashType (default: SHA256)
+ * @param {!PbKeyTemplate=} opt_keyTemplate (default: aes128CtrHmac256)
+ * @param {PbPointFormat=} opt_pointFormat (default: UNCOMPRESSED)
+ *
+ * @return {!Promise<!PbEciesAeadHkdfPublicKey>}
+ */
+const createKey = async function(
+    opt_curveType = PbEllipticCurveType.NIST_P256, opt_hashType,
+    opt_keyTemplate, opt_pointFormat) {
+  const curveSubtleType = Util.curveTypeProtoToSubtle(opt_curveType);
+  const curveName = EllipticCurves.curveToString(curveSubtleType);
+
+  const key =
+      new PbEciesAeadHkdfPublicKey().setVersion(0).setParams(createKeyParams(
+          opt_curveType, opt_hashType, opt_keyTemplate, opt_pointFormat));
+
+
+  const keyPair = await EllipticCurves.generateKeyPair('ECDH', curveName);
+  const publicKey = await EllipticCurves.exportCryptoKey(keyPair.publicKey);
+  key.setX(Bytes.fromBase64(publicKey['x'], /* opt_webSafe = */ true));
+  key.setY(Bytes.fromBase64(publicKey['y'], /* opt_webSafe = */ true));
+
+  return key;
+};
+
+/**
+ * @param {!PbEciesAeadHkdfPublicKey} key
+ *
+ * @return {!PbKeyData}
+ */
+const createKeyDataFromKey = function(key) {
+  const keyData =
+      new PbKeyData()
+          .setTypeUrl(KEY_TYPE)
+          .setValue(key.serializeBinary())
+          .setKeyMaterialType(PbKeyData.KeyMaterialType.ASYMMETRIC_PUBLIC);
+
+  return keyData;
+};
+
+/**
+ * @param {PbEllipticCurveType=} opt_curveType (default: NIST_P256)
+ * @param {PbHashType=} opt_hashType (default: SHA256)
+ * @param {!PbKeyTemplate=} opt_keyTemplate (default: aes128CtrHmac256)
+ * @param {PbPointFormat=} opt_pointFormat (default: UNCOMPRESSED)
+ *
+ * @return {!Promise<!PbKeyData>}
+ */
+const createKeyData = async function(
+    opt_curveType, opt_hashType, opt_keyTemplate, opt_pointFormat) {
+  const key = await createKey(
+      opt_curveType, opt_hashType, opt_keyTemplate, opt_pointFormat);
+  return createKeyDataFromKey(key);
+};
+
+
+// Create set of keys with all possible predefined/supported parameters.
+/** @return {!Promise<!Array<!PbEciesAeadHkdfPublicKey>>} */
+const createTestSetOfKeys = async function() {
+  const curveTypes = [
+    PbEllipticCurveType.NIST_P256, PbEllipticCurveType.NIST_P384,
+    PbEllipticCurveType.NIST_P521
+  ];
+  const hashTypes = [PbHashType.SHA1, PbHashType.SHA256, PbHashType.SHA512];
+  const keyTemplates =
+      [AeadKeyTemplates.aes128CtrHmacSha256(), AeadKeyTemplates.aes256Gcm()];
+  const pointFormats = [PbPointFormat.UNCOMPRESSED];
+
+  const /** Array<!PbEciesAeadHkdfPublicKey> */ keys = [];
+  for (let curve of curveTypes) {
+    for (let hkdfHash of hashTypes) {
+      for (let keyTemplate of keyTemplates) {
+        for (let pointFormat of pointFormats) {
+          const key =
+              await createKey(curve, hkdfHash, keyTemplate, pointFormat);
+          keys.push(key);
+        }
+      }
+    }
+  }
+  return keys;
+};
+
+// Create set of keyData protos with keys of all possible predefined/supported
+// parameters.
+/** @return {!Promise<!Array<!PbKeyData>>} */
+const createTestSetOfKeyDatas = async function() {
+  const keys = await createTestSetOfKeys();
+
+  const /** Array<!PbKeyData> */ keyDatas = [];
+  for (let key of keys) {
+    const keyData = await createKeyDataFromKey(key);
+    keyDatas.push(keyData);
+  }
+
+  return keyDatas;
+};
diff --git a/javascript/hybrid/ecies_aead_hkdf_util.js b/javascript/hybrid/ecies_aead_hkdf_util.js
new file mode 100644
index 0000000..54d9b04
--- /dev/null
+++ b/javascript/hybrid/ecies_aead_hkdf_util.js
@@ -0,0 +1,57 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.hybrid.EciesAeadHkdfUtil');
+
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const PbEciesAeadHkdfPrivateKey = goog.require('proto.google.crypto.tink.EciesAeadHkdfPrivateKey');
+const PbEciesAeadHkdfPublicKey = goog.require('proto.google.crypto.tink.EciesAeadHkdfPublicKey');
+const Util = goog.require('tink.Util');
+
+// This file contains only functions which are useful for implementation of
+// private and public ECIES AEAD HKDF key manager.
+
+/**
+ * WARNING: This method assumes that the given key proto is valid.
+ *
+ * @package
+ * @param {!PbEciesAeadHkdfPrivateKey|!PbEciesAeadHkdfPublicKey} key
+ * @return {!webCrypto.JsonWebKey}
+ */
+const getJsonWebKeyFromProto = function(key) {
+  let /** @type {!PbEciesAeadHkdfPublicKey} */ publicKey;
+  let /** @type {!Uint8Array} */ d;
+  if (key instanceof PbEciesAeadHkdfPrivateKey) {
+    publicKey = /** @type{!PbEciesAeadHkdfPublicKey} */ (key.getPublicKey());
+  } else {
+    publicKey = key;
+  }
+
+  const curveType = Util.curveTypeProtoToSubtle(
+      publicKey.getParams().getKemParams().getCurveType());
+  const expectedLength = EllipticCurves.fieldSizeInBytes(curveType);
+  let x = Util.bigEndianNumberToCorrectLength(
+      publicKey.getX_asU8(), expectedLength);
+  let y = Util.bigEndianNumberToCorrectLength(
+      publicKey.getY_asU8(), expectedLength);
+  if (key instanceof PbEciesAeadHkdfPrivateKey) {
+    d = Util.bigEndianNumberToCorrectLength(
+        key.getKeyValue_asU8(), expectedLength);
+  }
+  return EllipticCurves.getJsonWebKey(curveType, x, y, d);
+};
+
+exports = {
+  getJsonWebKeyFromProto,
+};
diff --git a/javascript/hybrid/ecies_aead_hkdf_util_test.js b/javascript/hybrid/ecies_aead_hkdf_util_test.js
new file mode 100644
index 0000000..fb2b9f1
--- /dev/null
+++ b/javascript/hybrid/ecies_aead_hkdf_util_test.js
@@ -0,0 +1,274 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.hybrid.EciesAeadHkdfUtilTest');
+goog.setTestOnly('tink.hybrid.EciesAeadHkdfUtilTest');
+
+const AeadKeyTemplates = goog.require('tink.aead.AeadKeyTemplates');
+const Bytes = goog.require('tink.subtle.Bytes');
+const EciesAeadHkdfUtil = goog.require('tink.hybrid.EciesAeadHkdfUtil');
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const PbEciesAeadDemParams = goog.require('proto.google.crypto.tink.EciesAeadDemParams');
+const PbEciesAeadHkdfParams = goog.require('proto.google.crypto.tink.EciesAeadHkdfParams');
+const PbEciesAeadHkdfPrivateKey = goog.require('proto.google.crypto.tink.EciesAeadHkdfPrivateKey');
+const PbEciesAeadHkdfPublicKey = goog.require('proto.google.crypto.tink.EciesAeadHkdfPublicKey');
+const PbEciesHkdfKemParams = goog.require('proto.google.crypto.tink.EciesHkdfKemParams');
+const PbEllipticCurveType = goog.require('proto.google.crypto.tink.EllipticCurveType');
+const PbHashType = goog.require('proto.google.crypto.tink.HashType');
+const PbKeyTemplate = goog.require('proto.google.crypto.tink.KeyTemplate');
+const PbPointFormat = goog.require('proto.google.crypto.tink.EcPointFormat');
+const TestCase = goog.require('goog.testing.TestCase');
+const Util = goog.require('tink.Util');
+const testSuite = goog.require('goog.testing.testSuite');
+const userAgent = goog.require('goog.userAgent');
+
+testSuite({
+  shouldRunTests() {
+    return !userAgent.EDGE;  // b/120286783
+  },
+
+  setUp() {
+    // Use a generous promise timeout for running continuously.
+    TestCase.getActiveTestCase().promiseTimeout = 1000 * 1000;  // 1000s
+  },
+
+  tearDown() {
+    // Reset the promise timeout to default value.
+    TestCase.getActiveTestCase().promiseTimeout = 1000;  // 1s
+  },
+
+  async testGetJsonWebKeyFromProto_publicKey() {
+    const curves = Object.keys(PbEllipticCurveType);
+    for (let curveId of curves) {
+      const curve = PbEllipticCurveType[curveId];
+      if (curve === PbEllipticCurveType.UNKNOWN_CURVE ||
+          curve === PbEllipticCurveType.CURVE25519) {
+        continue;
+      }
+      const key = await createKey(curve);
+      const jwk = EciesAeadHkdfUtil.getJsonWebKeyFromProto(key.getPublicKey());
+
+      // Test the returned jwk.
+      const curveTypeSubtle = Util.curveTypeProtoToSubtle(curve);
+      const curveTypeString = EllipticCurves.curveToString(curveTypeSubtle);
+
+      assertEquals('EC', jwk['kty']);
+      assertEquals(curveTypeString, jwk['crv']);
+      assertObjectEquals(
+          key.getPublicKey().getX_asU8(),
+          Bytes.fromBase64(jwk['x'], /* opt_webSafe = */ true));
+      assertObjectEquals(
+          key.getPublicKey().getY_asU8(),
+          Bytes.fromBase64(jwk['y'], /* opt_webSafe = */ true));
+      assertObjectEquals(undefined, jwk['d']);
+      assertTrue(jwk['ext']);
+    }
+  },
+
+  async testGetJsonWebKeyFromProto_publicKey_withLeadingZeros() {
+    const curves = Object.keys(PbEllipticCurveType);
+    for (let curveId of curves) {
+      const curve = PbEllipticCurveType[curveId];
+      if (curve === PbEllipticCurveType.UNKNOWN_CURVE ||
+          curve === PbEllipticCurveType.CURVE25519) {
+        continue;
+      }
+      const key = await createKey(curve);
+      // Add leading zeros to x and y value of key.
+      const x = key.getPublicKey().getX();
+      const y = key.getPublicKey().getY();
+      key.getPublicKey().setX(Bytes.concat(new Uint8Array([0, 0, 0, 0, 0]), x));
+      key.getPublicKey().setY(Bytes.concat(new Uint8Array([0, 0, 0]), y));
+      const jwk = EciesAeadHkdfUtil.getJsonWebKeyFromProto(key.getPublicKey());
+
+      // Test the returned jwk.
+      const curveTypeSubtle = Util.curveTypeProtoToSubtle(curve);
+      const curveTypeString = EllipticCurves.curveToString(curveTypeSubtle);
+
+      assertEquals('EC', jwk['kty']);
+      assertEquals(curveTypeString, jwk['crv']);
+      assertObjectEquals(
+          x, Bytes.fromBase64(jwk['x'], /* opt_webSafe = */ true));
+      assertObjectEquals(
+          y, Bytes.fromBase64(jwk['y'], /* opt_webSafe = */ true));
+      assertObjectEquals(undefined, jwk['d']);
+      assertTrue(jwk['ext']);
+    }
+  },
+
+  async testGetJsonWebKeyFromProto_publicKey_leadingNonzero() {
+    const curve = PbEllipticCurveType.NIST_P256;
+    const key = await createKey(curve);
+    const x = key.getPublicKey().getX();
+    key.getPublicKey().setX(Bytes.concat(new Uint8Array([1, 0]), x));
+    try {
+      EciesAeadHkdfUtil.getJsonWebKeyFromProto(key.getPublicKey());
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: Number needs more bytes to be represented.',
+          e.toString());
+    }
+  },
+
+  async testGetJsonWebKeyFromProto_privateKey() {
+    const curves = Object.keys(PbEllipticCurveType);
+    for (let curveId of curves) {
+      const curve = PbEllipticCurveType[curveId];
+      if (curve === PbEllipticCurveType.UNKNOWN_CURVE ||
+          curve === PbEllipticCurveType.CURVE25519) {
+        continue;
+      }
+      const key = await createKey(curve);
+      const jwk = EciesAeadHkdfUtil.getJsonWebKeyFromProto(key);
+
+      // Test the returned jwk.
+      const curveTypeSubtle = Util.curveTypeProtoToSubtle(curve);
+      const curveTypeString = EllipticCurves.curveToString(curveTypeSubtle);
+
+      assertEquals('EC', jwk['kty']);
+      assertEquals(curveTypeString, jwk['crv']);
+      assertObjectEquals(
+          key.getPublicKey().getX_asU8(),
+          Bytes.fromBase64(jwk['x'], /* opt_webSafe = */ true));
+      assertObjectEquals(
+          key.getPublicKey().getY_asU8(),
+          Bytes.fromBase64(jwk['y'], /* opt_webSafe = */ true));
+      assertObjectEquals(
+          key.getKeyValue_asU8(),
+          Bytes.fromBase64(jwk['d'], /* opt_webSafe = */ true));
+      assertTrue(jwk['ext']);
+    }
+  },
+
+  async testGetJsonWebKeyFromProto_privateKey_leadingZeros() {
+    const curves = Object.keys(PbEllipticCurveType);
+    for (let curveId of curves) {
+      const curve = PbEllipticCurveType[curveId];
+      if (curve === PbEllipticCurveType.UNKNOWN_CURVE ||
+          curve === PbEllipticCurveType.CURVE25519) {
+        continue;
+      }
+      const key = await createKey(curve);
+      const d = key.getKeyValue_asU8();
+      key.setKeyValue(Bytes.concat(new Uint8Array([0, 0, 0]), d));
+      const jwk = EciesAeadHkdfUtil.getJsonWebKeyFromProto(key);
+
+      // Test the returned jwk.
+      const curveTypeSubtle = Util.curveTypeProtoToSubtle(curve);
+      const curveTypeString = EllipticCurves.curveToString(curveTypeSubtle);
+
+      assertEquals('EC', jwk['kty']);
+      assertEquals(curveTypeString, jwk['crv']);
+      assertObjectEquals(
+          key.getPublicKey().getX_asU8(),
+          Bytes.fromBase64(jwk['x'], /* opt_webSafe = */ true));
+      assertObjectEquals(
+          key.getPublicKey().getY_asU8(),
+          Bytes.fromBase64(jwk['y'], /* opt_webSafe = */ true));
+      assertObjectEquals(
+          d, Bytes.fromBase64(jwk['d'], /* opt_webSafe = */ true));
+      assertTrue(jwk['ext']);
+    }
+  },
+});
+
+/**
+ * @param {!PbEllipticCurveType=} opt_curveType (default: NIST_P256)
+ * @param {!PbHashType=} opt_hashType (default: SHA256)
+ *
+ * @return {!PbEciesHkdfKemParams}
+ */
+const createKemParams = function(
+    opt_curveType = PbEllipticCurveType.NIST_P256,
+    opt_hashType = PbHashType.SHA256) {
+  const kemParams = new PbEciesHkdfKemParams()
+                        .setCurveType(opt_curveType)
+                        .setHkdfHashType(opt_hashType);
+
+  return kemParams;
+};
+
+/**
+ * @param {!PbKeyTemplate=} opt_keyTemplate (default: aes128CtrHmac256)
+ *
+ * @return {!PbEciesAeadDemParams}
+ */
+const createDemParams = function(opt_keyTemplate) {
+  if (!opt_keyTemplate) {
+    opt_keyTemplate = AeadKeyTemplates.aes128CtrHmacSha256();
+  }
+
+  const demParams = new PbEciesAeadDemParams().setAeadDem(opt_keyTemplate);
+
+  return demParams;
+};
+
+/**
+ * @param {!PbEllipticCurveType=} opt_curveType (default: NIST_P256)
+ * @param {!PbHashType=} opt_hashType (default: SHA256)
+ * @param {!PbKeyTemplate=} opt_keyTemplate (default: aes128CtrHmac256)
+ * @param {!PbPointFormat=} opt_pointFormat (default: UNCOMPRESSED)
+ *
+ * @return {!PbEciesAeadHkdfParams}
+ */
+const createKeyParams = function(
+    opt_curveType, opt_hashType, opt_keyTemplate,
+    opt_pointFormat = PbPointFormat.UNCOMPRESSED) {
+  const params = new PbEciesAeadHkdfParams()
+                     .setKemParams(createKemParams(opt_curveType, opt_hashType))
+                     .setDemParams(createDemParams(opt_keyTemplate))
+                     .setEcPointFormat(opt_pointFormat);
+
+  return params;
+};
+
+
+/**
+ * @param {!PbEllipticCurveType=} opt_curveType (default: NIST_P256)
+ * @param {!PbHashType=} opt_hashType (default: SHA256)
+ * @param {!PbKeyTemplate=} opt_keyTemplate (default: aes128CtrHmac256)
+ * @param {!PbPointFormat=} opt_pointFormat (default: UNCOMPRESSED)
+ *
+ * @return {!Promise<!PbEciesAeadHkdfPrivateKey>}
+ */
+const createKey = async function(
+    opt_curveType = PbEllipticCurveType.NIST_P256, opt_hashType,
+    opt_keyTemplate, opt_pointFormat) {
+  const curveTypeSubtle = Util.curveTypeProtoToSubtle(
+      /** @type {!PbEllipticCurveType} */ (opt_curveType));
+  const curveName = EllipticCurves.curveToString(curveTypeSubtle);
+
+  const publicKeyProto =
+      new PbEciesAeadHkdfPublicKey().setVersion(0).setParams(createKeyParams(
+          opt_curveType, opt_hashType, opt_keyTemplate, opt_pointFormat));
+
+
+  const keyPair = await EllipticCurves.generateKeyPair('ECDH', curveName);
+  const publicKeyJson = await EllipticCurves.exportCryptoKey(keyPair.publicKey);
+  publicKeyProto.setX(
+      Bytes.fromBase64(publicKeyJson['x'], /* opt_webSafe = */ true));
+  publicKeyProto.setY(
+      Bytes.fromBase64(publicKeyJson['y'], /* opt_webSafe = */ true));
+
+  const privateKeyProto = new PbEciesAeadHkdfPrivateKey();
+  const privateKeyJson =
+      await EllipticCurves.exportCryptoKey(keyPair.privateKey);
+  privateKeyProto.setKeyValue(
+      Bytes.fromBase64(privateKeyJson['d'], /* opt_webSafe = */ true));
+  privateKeyProto.setVersion(0);
+  privateKeyProto.setPublicKey(publicKeyProto);
+
+  return privateKeyProto;
+};
diff --git a/javascript/hybrid/ecies_aead_hkdf_validators.js b/javascript/hybrid/ecies_aead_hkdf_validators.js
new file mode 100644
index 0000000..ea4bd24
--- /dev/null
+++ b/javascript/hybrid/ecies_aead_hkdf_validators.js
@@ -0,0 +1,162 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.hybrid.EciesAeadHkdfValidators');
+
+const AeadConfig = goog.require('tink.aead.AeadConfig');
+const PbEciesAeadDemParams = goog.require('proto.google.crypto.tink.EciesAeadDemParams');
+const PbEciesAeadHkdfKeyFormat = goog.require('proto.google.crypto.tink.EciesAeadHkdfKeyFormat');
+const PbEciesAeadHkdfParams = goog.require('proto.google.crypto.tink.EciesAeadHkdfParams');
+const PbEciesAeadHkdfPrivateKey = goog.require('proto.google.crypto.tink.EciesAeadHkdfPrivateKey');
+const PbEciesAeadHkdfPublicKey = goog.require('proto.google.crypto.tink.EciesAeadHkdfPublicKey');
+const PbEciesHkdfKemParams = goog.require('proto.google.crypto.tink.EciesHkdfKemParams');
+const PbEllipticCurveType = goog.require('proto.google.crypto.tink.EllipticCurveType');
+const PbHashType = goog.require('proto.google.crypto.tink.HashType');
+const PbPointFormat = goog.require('proto.google.crypto.tink.EcPointFormat');
+const SecurityException = goog.require('tink.exception.SecurityException');
+const Validators = goog.require('tink.subtle.Validators');
+
+
+/**
+ * @private
+ * @param {!PbEciesHkdfKemParams} kemParams
+ */
+const validateKemParams = function(kemParams) {
+  const curve = kemParams.getCurveType();
+  if (curve !== PbEllipticCurveType.NIST_P256 &&
+      curve !== PbEllipticCurveType.NIST_P384 &&
+      curve !== PbEllipticCurveType.NIST_P521) {
+    throw new SecurityException('Invalid KEM params - unknown curve type.');
+  }
+
+  const hashType = kemParams.getHkdfHashType();
+  if (hashType !== PbHashType.SHA1 && hashType !== PbHashType.SHA256 &&
+      hashType !== PbHashType.SHA384 && hashType !== PbHashType.SHA512) {
+    throw new SecurityException('Invalid KEM params - unknown hash type.');
+  }
+};
+
+/**
+ * @private
+ * @param {!PbEciesAeadDemParams} demParams
+ */
+const validateDemParams = function(demParams) {
+  if (!demParams.getAeadDem()) {
+    throw new SecurityException(
+        'Invalid DEM params - missing AEAD key template.');
+  }
+  // It is checked also here due to methods for creating new keys. We do not
+  // allow creating new keys from formats which contains key templates of
+  // not supported key types.
+  const aeadKeyType = demParams.getAeadDem().getTypeUrl();
+  if (aeadKeyType != AeadConfig.AES_CTR_HMAC_AEAD_TYPE_URL &&
+      aeadKeyType != AeadConfig.AES_GCM_TYPE_URL) {
+    throw new SecurityException(
+        'Invalid DEM params - ' + aeadKeyType +
+        ' template is not supported by ECIES AEAD HKDF.');
+  }
+};
+
+/**
+ * @package
+ * @param {!PbEciesAeadHkdfParams} params
+ */
+const validateParams = function(params) {
+  const kemParams = params.getKemParams();
+  if (!kemParams) {
+    throw new SecurityException('Invalid params - missing KEM params.');
+  }
+  validateKemParams(kemParams);
+
+  const demParams = params.getDemParams();
+  if (!demParams) {
+    throw new SecurityException('Invalid params - missing DEM params.');
+  }
+  validateDemParams(demParams);
+
+  const pointFormat = params.getEcPointFormat();
+  if (pointFormat !== PbPointFormat.UNCOMPRESSED &&
+      pointFormat !== PbPointFormat.COMPRESSED &&
+      pointFormat !== PbPointFormat.DO_NOT_USE_CRUNCHY_UNCOMPRESSED) {
+    throw new SecurityException(
+        'Invalid key params - unknown EC point format.');
+  }
+};
+
+/**
+ * @package
+ * @param {!PbEciesAeadHkdfKeyFormat} keyFormat
+ */
+const validateKeyFormat = function(keyFormat) {
+  const params = keyFormat.getParams();
+  if (!params) {
+    throw new SecurityException('Invalid key format - missing key params.');
+  }
+  validateParams(params);
+};
+
+/**
+ * @package
+ * @param {!PbEciesAeadHkdfPublicKey} key
+ * @param {number} publicKeyManagerVersion
+ */
+const validatePublicKey = function(key, publicKeyManagerVersion) {
+  Validators.validateVersion(key.getVersion(), publicKeyManagerVersion);
+
+  const params = key.getParams();
+
+  if (!params) {
+    throw new SecurityException('Invalid public key - missing key params.');
+  }
+  validateParams(params);
+
+  if (!key.getX() || !key.getY()) {
+    throw new SecurityException(
+        'Invalid public key - missing value of X or Y.');
+  }
+
+  // TODO Should we add more checks here?
+};
+
+/**
+ * @package
+ * @param {!PbEciesAeadHkdfPrivateKey} key
+ * @param {number} privateKeyManagerVersion
+ * @param {number} publicKeyManagerVersion
+ */
+const validatePrivateKey = function(
+    key, privateKeyManagerVersion, publicKeyManagerVersion) {
+  Validators.validateVersion(key.getVersion(), privateKeyManagerVersion);
+
+  if (!key.getKeyValue()) {
+    throw new SecurityException(
+        'Invalid private key - missing private key value.');
+  }
+
+  const publicKey = key.getPublicKey();
+  if (!publicKey) {
+    throw new SecurityException(
+        'Invalid private key - missing public key information.');
+  }
+  validatePublicKey(publicKey, publicKeyManagerVersion);
+
+  // TODO Should we add more checks here?
+};
+
+exports = {
+  validateKeyFormat,
+  validateParams,
+  validatePublicKey,
+  validatePrivateKey,
+};
diff --git a/javascript/hybrid/ecies_aead_hkdf_validators_test.js b/javascript/hybrid/ecies_aead_hkdf_validators_test.js
new file mode 100644
index 0000000..fe73d6d
--- /dev/null
+++ b/javascript/hybrid/ecies_aead_hkdf_validators_test.js
@@ -0,0 +1,515 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.hybrid.EciesAeadHkdfValidatorsTest');
+goog.setTestOnly('tink.hybrid.EciesAeadHkdfValidatorsTest');
+
+const AeadKeyTemplates = goog.require('tink.aead.AeadKeyTemplates');
+const Bytes = goog.require('tink.subtle.Bytes');
+const EciesAeadHkdfValidators = goog.require('tink.hybrid.EciesAeadHkdfValidators');
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const PbEciesAeadDemParams = goog.require('proto.google.crypto.tink.EciesAeadDemParams');
+const PbEciesAeadHkdfKeyFormat = goog.require('proto.google.crypto.tink.EciesAeadHkdfKeyFormat');
+const PbEciesAeadHkdfParams = goog.require('proto.google.crypto.tink.EciesAeadHkdfParams');
+const PbEciesAeadHkdfPrivateKey = goog.require('proto.google.crypto.tink.EciesAeadHkdfPrivateKey');
+const PbEciesAeadHkdfPublicKey = goog.require('proto.google.crypto.tink.EciesAeadHkdfPublicKey');
+const PbEciesHkdfKemParams = goog.require('proto.google.crypto.tink.EciesHkdfKemParams');
+const PbEllipticCurveType = goog.require('proto.google.crypto.tink.EllipticCurveType');
+const PbHashType = goog.require('proto.google.crypto.tink.HashType');
+const PbKeyTemplate = goog.require('proto.google.crypto.tink.KeyTemplate');
+const PbPointFormat = goog.require('proto.google.crypto.tink.EcPointFormat');
+const TestCase = goog.require('goog.testing.TestCase');
+const Util = goog.require('tink.Util');
+const testSuite = goog.require('goog.testing.testSuite');
+const userAgent = goog.require('goog.userAgent');
+
+
+testSuite({
+  shouldRunTests() {
+    return !userAgent.EDGE;  // b/120286783
+  },
+
+  setUp() {
+    // Use a generous promise timeout for running continuously.
+    TestCase.getActiveTestCase().promiseTimeout = 1000 * 1000;  // 1000s
+  },
+
+  tearDown() {
+    // Reset the promise timeout to default value.
+    TestCase.getActiveTestCase().promiseTimeout = 1000;  // 1s
+  },
+
+  testValidateParams_missingKemParams() {
+    const invalidParams = createParams().setKemParams(null);
+
+    try {
+      EciesAeadHkdfValidators.validateParams(invalidParams);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingKemParams(), e.toString());
+    }
+  },
+
+  testValidateParams_invalidKemParams_unknownHashType() {
+    const invalidParams = createParams();
+    invalidParams.getKemParams().setHkdfHashType(PbHashType.UNKNOWN_HASH);
+
+    try {
+      EciesAeadHkdfValidators.validateParams(invalidParams);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unknownHashType(), e.toString());
+    }
+  },
+
+  testValidateParams_invalidKemParams_unknownCurveType() {
+    const invalidParams = createParams();
+    invalidParams.getKemParams().setCurveType(
+        PbEllipticCurveType.UNKNOWN_CURVE);
+
+    try {
+      EciesAeadHkdfValidators.validateParams(invalidParams);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unknownCurveType(), e.toString());
+    }
+  },
+
+  testValidateParams_missingDemParams() {
+    const invalidParams = createParams().setDemParams(null);
+
+    try {
+      EciesAeadHkdfValidators.validateParams(invalidParams);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingDemParams(), e.toString());
+    }
+  },
+
+  testValidateParams_invalidDemParams_missingAeadTemplate() {
+    const invalidParams = createParams();
+    invalidParams.getDemParams().setAeadDem(null);
+
+    try {
+      EciesAeadHkdfValidators.validateParams(invalidParams);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingAeadTemplate(), e.toString());
+    }
+  },
+
+  testValidateParams_invalidDemParams_unsupportedAeadTemplate() {
+    const unsupportedTypeUrl = 'UNSUPPORTED_KEY_TYPE_URL';
+    const invalidParams = createParams();
+    invalidParams.getDemParams().getAeadDem().setTypeUrl(unsupportedTypeUrl);
+
+    try {
+      EciesAeadHkdfValidators.validateParams(invalidParams);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          ExceptionText.unsupportedKeyTemplate(unsupportedTypeUrl),
+          e.toString());
+    }
+  },
+
+  testValidateParams_unknownPointFormat() {
+    const invalidParams =
+        createParams().setEcPointFormat(PbPointFormat.UNKNOWN_FORMAT);
+
+    try {
+      EciesAeadHkdfValidators.validateParams(invalidParams);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unknownPointFormat(), e.toString());
+    }
+  },
+
+  testValidateParams_differentValidValues() {
+    const curves = Object.keys(PbEllipticCurveType);
+    const hashTypes = Object.keys(PbHashType);
+    const keyTemplates =
+        [AeadKeyTemplates.aes128CtrHmacSha256(), AeadKeyTemplates.aes128Gcm()];
+    const pointFormats = Object.keys(PbPointFormat);
+
+    for (let curveId of curves) {
+      const curve = PbEllipticCurveType[curveId];
+      if (curve === PbEllipticCurveType.UNKNOWN_CURVE ||
+          curve === PbEllipticCurveType.CURVE25519) {
+        continue;
+      }
+      for (let hashTypeId of hashTypes) {
+        const hashType = PbHashType[hashTypeId];
+        if (hashType === PbHashType.UNKNOWN_HASH) {
+          continue;
+        }
+        for (let keyTemplate of keyTemplates) {
+          for (let pointFormatId of pointFormats) {
+            const pointFormat = PbPointFormat[pointFormatId];
+            if (pointFormat === PbPointFormat.UNKNOWN_FORMAT) {
+              continue;
+            }
+            const params =
+                createParams(curve, hashType, keyTemplate, pointFormat);
+            EciesAeadHkdfValidators.validateParams(params);
+          }
+        }
+      }
+    }
+  },
+
+  testValidateKeyFormat_missingParams() {
+    const invalidKeyFormat = new PbEciesAeadHkdfKeyFormat();
+
+    try {
+      EciesAeadHkdfValidators.validateKeyFormat(invalidKeyFormat);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingFormatParams(), e.toString());
+    }
+  },
+
+  testValidateKeyFormat_invalidParams() {
+    const invalidKeyFormat =
+        new PbEciesAeadHkdfKeyFormat().setParams(createParams());
+
+    // Check that also params were checked.
+    // Test missing DEM params.
+    invalidKeyFormat.getParams().setDemParams(null);
+    try {
+      EciesAeadHkdfValidators.validateKeyFormat(invalidKeyFormat);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingDemParams(), e.toString());
+    }
+    invalidKeyFormat.getParams().setDemParams(createDemParams());
+
+    // Test UNKNOWN_HASH in KEM params.
+    invalidKeyFormat.getParams().getKemParams().setHkdfHashType(
+        PbHashType.UNKNOWN_HASH);
+    try {
+      EciesAeadHkdfValidators.validateKeyFormat(invalidKeyFormat);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unknownHashType(), e.toString());
+    }
+  },
+
+  testValidatePublicKey_missingParams() {
+    const invalidPublicKey = new PbEciesAeadHkdfPublicKey();
+
+    try {
+      EciesAeadHkdfValidators.validatePublicKey(invalidPublicKey, 0);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingKeyParams(), e.toString());
+    }
+  },
+
+  testValidatePublicKey_missingValuesXY() {
+    const invalidPublicKey =
+        new PbEciesAeadHkdfPublicKey().setParams(createParams());
+
+    // Both X and Y are set to null.
+    try {
+      EciesAeadHkdfValidators.validatePublicKey(invalidPublicKey, 0);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingXY(), e.toString());
+    }
+
+    // The key with only Y set to null is also invalid.
+    invalidPublicKey.setX(new Uint8Array(10));
+    try {
+      EciesAeadHkdfValidators.validatePublicKey(invalidPublicKey, 0);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingXY(), e.toString());
+    }
+
+    // The key with only X set to null is also invalid.
+    invalidPublicKey.setY(new Uint8Array(10));
+    invalidPublicKey.setX(null);
+    try {
+      EciesAeadHkdfValidators.validatePublicKey(invalidPublicKey, 0);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingXY(), e.toString());
+    }
+  },
+
+  async testValidatePublicKey_invalidParams() {
+    const invalidPublicKey = await createPublicKey();
+
+    // Check that also params were checked.
+    // Test missing DEM params.
+    invalidPublicKey.getParams().setDemParams(null);
+    try {
+      EciesAeadHkdfValidators.validatePublicKey(invalidPublicKey, 0);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingDemParams(), e.toString());
+    }
+    invalidPublicKey.getParams().setDemParams(createDemParams());
+
+    // Test UNKNOWN_HASH in KEM params.
+    invalidPublicKey.getParams().getKemParams().setHkdfHashType(
+        PbHashType.UNKNOWN_HASH);
+    try {
+      EciesAeadHkdfValidators.validatePublicKey(invalidPublicKey, 0);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unknownHashType(), e.toString());
+    }
+  },
+
+  async testValidatePublicKey_versionOutOfBounds() {
+    const managerVersion = 0;
+    const invalidPublicKey = (await createPublicKey()).setVersion(1);
+    try {
+      EciesAeadHkdfValidators.validatePublicKey(
+          invalidPublicKey, managerVersion);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          ExceptionText.versionOutOfBounds(managerVersion), e.toString());
+    }
+  },
+
+  async testValidatePrivateKey_missingPublicKey() {
+    const invalidPrivateKey = (await createPrivateKey()).setPublicKey(null);
+    try {
+      EciesAeadHkdfValidators.validatePrivateKey(invalidPrivateKey, 0, 0);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingPublicKey(), e.toString());
+    }
+  },
+
+  async testValidatePrivateKey_invalidPublicKey() {
+    const invalidPrivateKey = await createPrivateKey();
+    invalidPrivateKey.getPublicKey().setParams(null);
+    try {
+      EciesAeadHkdfValidators.validatePrivateKey(invalidPrivateKey, 0, 0);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingKeyParams(), e.toString());
+    }
+  },
+
+  async testValidatePrivateKey_missingPrivateKeyValue() {
+    const invalidPrivateKey = (await createPrivateKey()).setKeyValue(null);
+    try {
+      EciesAeadHkdfValidators.validatePrivateKey(invalidPrivateKey, 0, 0);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingPrivateKeyValue(), e.toString());
+    }
+  },
+
+  async testValidatePrivateKey_shouldWork() {
+    const privateKey = await createPrivateKey();
+    EciesAeadHkdfValidators.validatePrivateKey(privateKey, 0, 0);
+  },
+
+  async testValidatePrivateKey_versionOutOfBounds() {
+    const managerVersion = 0;
+    const invalidPrivateKey = (await createPrivateKey()).setVersion(1);
+    try {
+      EciesAeadHkdfValidators.validatePrivateKey(
+          invalidPrivateKey, managerVersion, managerVersion);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          ExceptionText.versionOutOfBounds(managerVersion), e.toString());
+    }
+  },
+});
+
+// Helper classes and functions
+class ExceptionText {
+  /** @return {string} */
+  static missingFormatParams() {
+    return 'CustomError: Invalid key format - missing key params.';
+  }
+
+  /** @return {string} */
+  static missingKeyParams() {
+    return 'CustomError: Invalid public key - missing key params.';
+  }
+
+  /** @return {string} */
+  static unknownPointFormat() {
+    return 'CustomError: Invalid key params - unknown EC point format.';
+  }
+
+  /** @return {string} */
+  static missingKemParams() {
+    return 'CustomError: Invalid params - missing KEM params.';
+  }
+
+  /** @return {string} */
+  static unknownHashType() {
+    return 'CustomError: Invalid KEM params - unknown hash type.';
+  }
+
+  /** @return {string} */
+  static unknownCurveType() {
+    return 'CustomError: Invalid KEM params - unknown curve type.';
+  }
+
+  /** @return {string} */
+  static missingDemParams() {
+    return 'CustomError: Invalid params - missing DEM params.';
+  }
+
+  /** @return {string} */
+  static missingAeadTemplate() {
+    return 'CustomError: Invalid DEM params - missing AEAD key template.';
+  }
+
+  /**
+   * @param {string} templateTypeUrl
+   * @return {string}
+   */
+  static unsupportedKeyTemplate(templateTypeUrl) {
+    return 'CustomError: Invalid DEM params - ' + templateTypeUrl +
+        ' template is not supported by ECIES AEAD HKDF.';
+  }
+
+  /** @return {string} */
+  static missingXY() {
+    return 'CustomError: Invalid public key - missing value of X or Y.';
+  }
+
+  /** @return {string} */
+  static missingPublicKey() {
+    return 'CustomError: Invalid private key - missing public key information.';
+  }
+
+  /** @return {string} */
+  static missingPrivateKeyValue() {
+    return 'CustomError: Invalid private key - missing private key value.';
+  }
+
+  /**
+   * @param {number} version
+   * @return {string}
+   */
+  static versionOutOfBounds(version) {
+    return 'CustomError: Version is out of bound, must be between 0 and ' +
+        version + '.';
+  }
+}
+
+/**
+ * @param {PbEllipticCurveType=} opt_curveType (default: NIST_P256)
+ * @param {PbHashType=} opt_hashType (default: SHA256)
+ *
+ * @return {!PbEciesHkdfKemParams}
+ */
+const createKemParams = function(
+    opt_curveType = PbEllipticCurveType.NIST_P256,
+    opt_hashType = PbHashType.SHA256) {
+  const kemParams = new PbEciesHkdfKemParams()
+                        .setCurveType(opt_curveType)
+                        .setHkdfHashType(opt_hashType);
+
+  return kemParams;
+};
+
+/**
+ * @param {!PbKeyTemplate=} opt_keyTemplate (default: aes128CtrHmac256)
+ *
+ * @return {!PbEciesAeadDemParams}
+ */
+const createDemParams = function(opt_keyTemplate) {
+  if (!opt_keyTemplate) {
+    opt_keyTemplate = AeadKeyTemplates.aes128CtrHmacSha256();
+  }
+
+  const demParams = new PbEciesAeadDemParams().setAeadDem(opt_keyTemplate);
+
+  return demParams;
+};
+
+/**
+ * @param {PbEllipticCurveType=} opt_curveType (default: NIST_P256)
+ * @param {PbHashType=} opt_hashType (default: SHA256)
+ * @param {!PbKeyTemplate=} opt_keyTemplate (default: aes128CtrHmac256)
+ * @param {PbPointFormat=} opt_pointFormat (default: UNCOMPRESSED)
+ *
+ * @return {!PbEciesAeadHkdfParams}
+ */
+const createParams = function(
+    opt_curveType, opt_hashType, opt_keyTemplate,
+    opt_pointFormat = PbPointFormat.UNCOMPRESSED) {
+  const params = new PbEciesAeadHkdfParams()
+                     .setKemParams(createKemParams(opt_curveType, opt_hashType))
+                     .setDemParams(createDemParams(opt_keyTemplate))
+                     .setEcPointFormat(opt_pointFormat);
+
+  return params;
+};
+
+/**
+ * @param {PbEllipticCurveType=} opt_curveType (default: NIST_P256)
+ * @param {PbHashType=} opt_hashType (default: SHA256)
+ * @param {!PbKeyTemplate=} opt_keyTemplate (default: aes128CtrHmac256)
+ * @param {PbPointFormat=} opt_pointFormat (default: UNCOMPRESSED)
+ *
+ * @return {!Promise<!PbEciesAeadHkdfPrivateKey>}
+ */
+const createPrivateKey = async function(
+    opt_curveType = PbEllipticCurveType.NIST_P256, opt_hashType,
+    opt_keyTemplate, opt_pointFormat) {
+  const curveSubtleType = Util.curveTypeProtoToSubtle(opt_curveType);
+  const curveName = EllipticCurves.curveToString(curveSubtleType);
+
+  const publicKeyProto =
+      new PbEciesAeadHkdfPublicKey().setVersion(0).setParams(createParams(
+          opt_curveType, opt_hashType, opt_keyTemplate, opt_pointFormat));
+  const keyPair = await EllipticCurves.generateKeyPair('ECDH', curveName);
+  const jsonPublicKey = await EllipticCurves.exportCryptoKey(keyPair.publicKey);
+  publicKeyProto.setX(
+      Bytes.fromBase64(jsonPublicKey['x'], /* opt_webSafe = */ true));
+  publicKeyProto.setY(
+      Bytes.fromBase64(jsonPublicKey['y'], /* opt_webSafe = */ true));
+
+
+  const privateKeyProto =
+      new PbEciesAeadHkdfPrivateKey().setVersion(0).setPublicKey(
+          publicKeyProto);
+  const jsonPrivateKey =
+      await EllipticCurves.exportCryptoKey(keyPair.privateKey);
+  privateKeyProto.setKeyValue(
+      Bytes.fromBase64(jsonPrivateKey['d'], /* opt_webSafe = */ true));
+
+  return privateKeyProto;
+};
+
+/**
+ * @param {PbEllipticCurveType=} opt_curveType (default: NIST_P256)
+ * @param {PbHashType=} opt_hashType (default: SHA256)
+ * @param {!PbKeyTemplate=} opt_keyTemplate (default: aes128CtrHmac256)
+ * @param {PbPointFormat=} opt_pointFormat (default: UNCOMPRESSED)
+ *
+ * @return {!Promise<!PbEciesAeadHkdfPublicKey>}
+ */
+const createPublicKey = async function(
+    opt_curveType, opt_hashType, opt_keyTemplate, opt_pointFormat) {
+  const key = await createPrivateKey(
+      opt_curveType, opt_hashType, opt_keyTemplate, opt_pointFormat);
+  return key.getPublicKey();
+};
diff --git a/javascript/hybrid/hybrid_config.js b/javascript/hybrid/hybrid_config.js
new file mode 100644
index 0000000..1a2a0f5
--- /dev/null
+++ b/javascript/hybrid/hybrid_config.js
@@ -0,0 +1,66 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.hybrid.HybridConfig');
+
+const AeadConfig = goog.require('tink.aead.AeadConfig');
+const EciesAeadHkdfPrivateKeyManager = goog.require('tink.hybrid.EciesAeadHkdfPrivateKeyManager');
+const EciesAeadHkdfPublicKeyManager = goog.require('tink.hybrid.EciesAeadHkdfPublicKeyManager');
+const HybridDecryptWrapper = goog.require('tink.hybrid.HybridDecryptWrapper');
+const HybridEncryptWrapper = goog.require('tink.hybrid.HybridEncryptWrapper');
+const Registry = goog.require('tink.Registry');
+
+// Static methods and constants for registering with the Registry all instances
+// of key types for hybrid encryption and decryption supported in a particular
+// release of Tink.
+//
+// To register all key types from the current Tink release one can do:
+//
+// HybridConfig.register();
+//
+// For more information on creation and usage of hybrid encryption instances
+// see HybridEncryptFactory (for encryption) and HybridDecryptFactory (for
+// decryption).
+
+/**
+ * Registers key managers for all HybridEncrypt and HybridDecrypt key types
+ * from the current Tink release.
+ */
+const register = function() {
+  AeadConfig.register();
+  Registry.registerKeyManager(new EciesAeadHkdfPrivateKeyManager());
+  Registry.registerKeyManager(new EciesAeadHkdfPublicKeyManager());
+  Registry.registerPrimitiveWrapper(new HybridEncryptWrapper());
+  Registry.registerPrimitiveWrapper(new HybridDecryptWrapper());
+};
+
+/** @const {string} */
+const ENCRYPT_PRIMITIVE_NAME = 'HybridEncrypt';
+/** @const {string} */
+const ECIES_AEAD_HKDF_PUBLIC_KEY_TYPE = EciesAeadHkdfPublicKeyManager.KEY_TYPE;
+
+/** @const {string} */
+const DECRYPT_PRIMITIVE_NAME = 'HybridDecrypt';
+/** @const {string} */
+const ECIES_AEAD_HKDF_PRIVATE_KEY_TYPE =
+    EciesAeadHkdfPrivateKeyManager.KEY_TYPE;
+
+goog.exportSymbol('tink.hybrid.HybridConfig.register', register);
+exports = {
+  register,
+  ENCRYPT_PRIMITIVE_NAME,
+  ECIES_AEAD_HKDF_PUBLIC_KEY_TYPE,
+  DECRYPT_PRIMITIVE_NAME,
+  ECIES_AEAD_HKDF_PRIVATE_KEY_TYPE,
+};
diff --git a/javascript/hybrid/hybrid_config_test.js b/javascript/hybrid/hybrid_config_test.js
new file mode 100644
index 0000000..54bfacd
--- /dev/null
+++ b/javascript/hybrid/hybrid_config_test.js
@@ -0,0 +1,174 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.hybrid.HybridConfigTest');
+goog.setTestOnly('tink.hybrid.HybridConfigTest');
+
+const EciesAeadHkdfPrivateKeyManager = goog.require('tink.hybrid.EciesAeadHkdfPrivateKeyManager');
+const EciesAeadHkdfPublicKeyManager = goog.require('tink.hybrid.EciesAeadHkdfPublicKeyManager');
+const HybridConfig = goog.require('tink.hybrid.HybridConfig');
+const HybridDecrypt = goog.require('tink.HybridDecrypt');
+const HybridEncrypt = goog.require('tink.HybridEncrypt');
+const HybridKeyTemplates = goog.require('tink.hybrid.HybridKeyTemplates');
+const KeysetHandle = goog.require('tink.KeysetHandle');
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const PbKeyStatusType = goog.require('proto.google.crypto.tink.KeyStatusType');
+const PbKeyTemplate = goog.require('proto.google.crypto.tink.KeyTemplate');
+const PbKeyset = goog.require('proto.google.crypto.tink.Keyset');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+const Random = goog.require('tink.subtle.Random');
+const Registry = goog.require('tink.Registry');
+const TestCase = goog.require('goog.testing.TestCase');
+const testSuite = goog.require('goog.testing.testSuite');
+const userAgent = goog.require('goog.userAgent');
+
+testSuite({
+  shouldRunTests() {
+    return !userAgent.EDGE;  // b/120286783
+  },
+
+  setUp() {
+    // Use a generous promise timeout for running continuously.
+    TestCase.getActiveTestCase().promiseTimeout = 1000 * 1000;  // 1000s
+  },
+
+  tearDown() {
+    Registry.reset();
+    // Reset the promise timeout to default value.
+    TestCase.getActiveTestCase().promiseTimeout = 1000;  // 1s
+  },
+
+  testConstants() {
+    assertEquals(ENCRYPT_PRIMITIVE_NAME, HybridConfig.ENCRYPT_PRIMITIVE_NAME);
+    assertEquals(DECRYPT_PRIMITIVE_NAME, HybridConfig.DECRYPT_PRIMITIVE_NAME);
+
+    assertEquals(
+        ECIES_AEAD_HKDF_PUBLIC_KEY_TYPE,
+        HybridConfig.ECIES_AEAD_HKDF_PUBLIC_KEY_TYPE);
+    assertEquals(
+        ECIES_AEAD_HKDF_PRIVATE_KEY_TYPE,
+        HybridConfig.ECIES_AEAD_HKDF_PRIVATE_KEY_TYPE);
+  },
+
+  testRegister_correctKeyManagersWereRegistered() {
+    HybridConfig.register();
+
+    // Test that the corresponding key managers were registered.
+    const publicKeyManager =
+        Registry.getKeyManager(ECIES_AEAD_HKDF_PUBLIC_KEY_TYPE);
+    assertTrue(publicKeyManager instanceof EciesAeadHkdfPublicKeyManager);
+
+    const privateKeyManager =
+        Registry.getKeyManager(ECIES_AEAD_HKDF_PRIVATE_KEY_TYPE);
+    assertTrue(privateKeyManager instanceof EciesAeadHkdfPrivateKeyManager);
+  },
+
+  // Check that everything was registered correctly and thus new keys may be
+  // generated using the predefined key templates and then they may be used for
+  // encryption and decryption.
+  async testRegister_predefinedTemplatesShouldWork() {
+    HybridConfig.register();
+    let templates = [
+      HybridKeyTemplates.eciesP256HkdfHmacSha256Aes128Gcm(),
+      HybridKeyTemplates.eciesP256HkdfHmacSha256Aes128CtrHmacSha256()
+    ];
+    // The following function adds all templates in uncompiled tests, thus if
+    // a new template is added without updating HybridConfig correctly then at
+    // least the uncompiled tests should fail.
+    // But the templates are included also above as the following function does
+    // not add anything to the list in compiled code.
+    templates =
+        templates.concat(getListOfTemplatesFromHybridKeyTemplatesClass());
+
+    for (let template of templates) {
+      const privateKeyData = await Registry.newKeyData(template);
+      const privateKeysetHandle = createKeysetHandleFromKeyData(privateKeyData);
+      const hybridDecrypt =
+          await privateKeysetHandle.getPrimitive(HybridDecrypt);
+
+      const publicKeyData = Registry.getPublicKeyData(
+          privateKeyData.getTypeUrl(), privateKeyData.getValue_asU8());
+      const publicKeysetHandle = createKeysetHandleFromKeyData(publicKeyData);
+      const hybridEncrypt =
+          await publicKeysetHandle.getPrimitive(HybridEncrypt);
+
+      const plaintext = new Uint8Array(Random.randBytes(10));
+      const contextInfo = new Uint8Array(Random.randBytes(8));
+      const ciphertext = await hybridEncrypt.encrypt(plaintext, contextInfo);
+      const decryptedCiphertext =
+          await hybridDecrypt.decrypt(ciphertext, contextInfo);
+
+      assertObjectEquals(plaintext, decryptedCiphertext);
+    }
+  },
+});
+
+// Constants used in tests.
+const ENCRYPT_PRIMITIVE_NAME = 'HybridEncrypt';
+const DECRYPT_PRIMITIVE_NAME = 'HybridDecrypt';
+const ECIES_AEAD_HKDF_PUBLIC_KEY_TYPE =
+    'type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey';
+const ECIES_AEAD_HKDF_PRIVATE_KEY_TYPE =
+    'type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey';
+
+/**
+ * Creates a keyset containing only the key given by keyData and returns it
+ * wrapped in a KeysetHandle.
+ *
+ * @param {!PbKeyData} keyData
+ * @return {!KeysetHandle}
+ */
+const createKeysetHandleFromKeyData = function(keyData) {
+  const keyId = 1;
+  const key = new PbKeyset.Key()
+                  .setKeyData(keyData)
+                  .setStatus(PbKeyStatusType.ENABLED)
+                  .setKeyId(keyId)
+                  .setOutputPrefixType(PbOutputPrefixType.TINK);
+
+  const keyset = new PbKeyset();
+  keyset.addKey(key);
+  keyset.setPrimaryKeyId(keyId);
+  return new KeysetHandle(keyset);
+};
+
+/**
+ * Returns all templates from HybridKeyTemplates class.
+ *
+ * WARNING: This function works only in uncompiled code. Once the code is
+ * compiled it returns only empty set due to optimizations which are run.
+ * Namely
+ *   - after compilation the methods are no longer methods of HybridKeyTemplates
+ *       class, and
+ *   - every method which is not referenced in this file or in the code used by
+ *       these tests are considered as dead code and removed.
+ *
+ * @return {!Array<!PbKeyTemplate>}
+ */
+const getListOfTemplatesFromHybridKeyTemplatesClass = function() {
+  let templates = [];
+  for (let propertyName of Object.getOwnPropertyNames(HybridKeyTemplates)) {
+    // Only public methods (i.e. not ending with '_') without arguments (i.e.
+    // function.length == 0) generate key templates.
+    const property = HybridKeyTemplates[propertyName];
+    if (typeof property === 'function' && property.length === 0 &&
+        propertyName[propertyName.length - 1] != '_') {
+      const template = property();
+      if (template instanceof PbKeyTemplate) {
+        templates = templates.concat([template]);
+      }
+    }
+  }
+  return templates;
+};
diff --git a/javascript/hybrid/hybrid_decrypt_wrapper.js b/javascript/hybrid/hybrid_decrypt_wrapper.js
new file mode 100644
index 0000000..5fd8bbc
--- /dev/null
+++ b/javascript/hybrid/hybrid_decrypt_wrapper.js
@@ -0,0 +1,132 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.hybrid.HybridDecryptWrapper');
+
+const CryptoFormat = goog.require('tink.CryptoFormat');
+const HybridDecrypt = goog.require('tink.HybridDecrypt');
+const PbKeyStatusType = goog.require('proto.google.crypto.tink.KeyStatusType');
+const PrimitiveSet = goog.require('tink.PrimitiveSet');
+const PrimitiveWrapper = goog.require('tink.PrimitiveWrapper');
+const SecurityException = goog.require('tink.exception.SecurityException');
+
+/**
+ * @implements {HybridDecrypt}
+ * @final
+ */
+class WrappedHybridDecrypt {
+  // The constructor should be @private, but it is not supported by Closure
+  // (see https://github.com/google/closure-compiler/issues/2761).
+  /** @param {!PrimitiveSet.PrimitiveSet} hybridDecryptPrimitiveSet */
+  constructor(hybridDecryptPrimitiveSet) {
+    /** @private @const {!PrimitiveSet.PrimitiveSet} */
+    this.primitiveSet_ = hybridDecryptPrimitiveSet;
+  }
+
+  /**
+   * @param {!PrimitiveSet.PrimitiveSet} hybridDecryptPrimitiveSet
+   * @return {!HybridDecrypt}
+   */
+  static newHybridDecrypt(hybridDecryptPrimitiveSet) {
+    if (!hybridDecryptPrimitiveSet) {
+      throw new SecurityException('Primitive set has to be non-null.');
+    }
+    return new WrappedHybridDecrypt(hybridDecryptPrimitiveSet);
+  }
+
+  /** @override */
+  async decrypt(ciphertext, opt_contextInfo) {
+    if (!ciphertext) {
+      throw new SecurityException('Ciphertext has to be non-null.');
+    }
+
+    if (ciphertext.length > CryptoFormat.NON_RAW_PREFIX_SIZE) {
+      const keyId = ciphertext.subarray(0, CryptoFormat.NON_RAW_PREFIX_SIZE);
+      const primitives = await this.primitiveSet_.getPrimitives(keyId);
+
+      const rawCiphertext = ciphertext.subarray(
+          CryptoFormat.NON_RAW_PREFIX_SIZE, ciphertext.length);
+      let /** @type {!Uint8Array} */ decryptedText;
+      try {
+        decryptedText = await this.tryDecryption_(
+            primitives, rawCiphertext, opt_contextInfo);
+      } catch (e) {
+      }
+
+      if (decryptedText) {
+        return decryptedText;
+      }
+    }
+
+    const primitives = await this.primitiveSet_.getRawPrimitives();
+    return await this.tryDecryption_(primitives, ciphertext, opt_contextInfo);
+  }
+
+  /**
+   * Tries to decrypt the ciphertext using each entry in primitives and
+   * returns the ciphertext decrypted by first primitive which succeed. It
+   * throws an exception if no entry succeeds.
+   *
+   * @param {!Array<!PrimitiveSet.Entry>} primitives
+   * @param {!Uint8Array} ciphertext
+   * @param {?Uint8Array=} opt_contextInfo
+   *
+   * @return {!Promise<!Uint8Array>}
+   * @private
+   */
+  async tryDecryption_(primitives, ciphertext, opt_contextInfo) {
+    const primitivesLength = primitives.length;
+    for (let i = 0; i < primitivesLength; i++) {
+      if (primitives[i].getKeyStatus() != PbKeyStatusType.ENABLED) {
+        continue;
+      }
+      const primitive = primitives[i].getPrimitive();
+
+      let decryptionResult;
+      try {
+        decryptionResult = await primitive.decrypt(ciphertext, opt_contextInfo);
+      } catch (e) {
+        continue;
+      }
+      return decryptionResult;
+    }
+    throw new SecurityException('Decryption failed for the given ciphertext.');
+  }
+}
+
+/**
+ * @implements {PrimitiveWrapper<HybridDecrypt>}
+ */
+class HybridDecryptWrapper {
+  // The constructor should be @private, but it is not supported by Closure
+  // (see https://github.com/google/closure-compiler/issues/2761).
+  constructor() {}
+
+  /**
+   * @override
+   */
+  wrap(primitiveSet) {
+    return WrappedHybridDecrypt.newHybridDecrypt(primitiveSet);
+  }
+
+  /**
+   * @override
+   */
+  getPrimitiveType() {
+    return HybridDecrypt;
+  }
+}
+
+goog.exportSymbol('tink.hybrid.HybridDecryptWrapper', HybridDecryptWrapper);
+exports = HybridDecryptWrapper;
diff --git a/javascript/hybrid/hybrid_decrypt_wrapper_test.js b/javascript/hybrid/hybrid_decrypt_wrapper_test.js
new file mode 100644
index 0000000..4894081
--- /dev/null
+++ b/javascript/hybrid/hybrid_decrypt_wrapper_test.js
@@ -0,0 +1,341 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.hybrid.HybridDecryptWrapperTest');
+goog.setTestOnly('tink.hybrid.HybridDecryptWrapperTest');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const HybridDecrypt = goog.require('tink.HybridDecrypt');
+const HybridDecryptWrapper = goog.require('tink.hybrid.HybridDecryptWrapper');
+const HybridEncrypt = goog.require('tink.HybridEncrypt');
+const HybridEncryptWrapper = goog.require('tink.hybrid.HybridEncryptWrapper');
+const PbKeyStatusType = goog.require('proto.google.crypto.tink.KeyStatusType');
+const PbKeysetKey = goog.require('proto.google.crypto.tink.Keyset.Key');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+const PrimitiveSet = goog.require('tink.PrimitiveSet');
+const Random = goog.require('tink.subtle.Random');
+const SecurityException = goog.require('tink.exception.SecurityException');
+
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+  async testNewHybridDecrypt_nullPrimitiveSet() {
+    try {
+      new HybridDecryptWrapper().wrap(null);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(ExceptionText.nullPrimitiveSet(), e.toString());
+    }
+  },
+
+  async testDecrypt_invalidCiphertext() {
+    const primitiveSets = createDummyPrimitiveSets();
+    const decryptPrimitiveSet = primitiveSets['decryptPrimitiveSet'];
+    const hybridDecrypt = new HybridDecryptWrapper().wrap(decryptPrimitiveSet);
+    // Ciphertext which cannot be decrypted by any primitive in the primitive
+    // set.
+    const ciphertext = new Uint8Array([9, 8, 7, 6, 5, 4, 3]);
+
+    try {
+      await hybridDecrypt.decrypt(ciphertext);
+      fail('Should throw an exception');
+    } catch (e) {
+      assertEquals(ExceptionText.cannotBeDecrypted(), e.toString());
+    }
+  },
+
+  async testDecrypt_shouldWork() {
+    const primitiveSets = createDummyPrimitiveSets();
+    const plaintext = Random.randBytes(10);
+    // As keys are just dummy keys which do not contain key data, the same key
+    // is used for both encrypt and decrypt.
+    const key = createDummyKeysetKey(
+        /** keyId = */ 0xFFFFFFFF, PbOutputPrefixType.TINK,
+        /** enabled = */ true);
+    const ciphertextSuffix = new Uint8Array([0, 0, 0, 0xFF]);
+
+    // Get the ciphertext.
+    const encryptPrimitiveSet = primitiveSets['encryptPrimitiveSet'];
+    const encryptPrimitive = new DummyHybridEncrypt(ciphertextSuffix);
+    const entry = encryptPrimitiveSet.addPrimitive(encryptPrimitive, key);
+    // Has to be set to primary as then it is used in encryption.
+    encryptPrimitiveSet.setPrimary(entry);
+    const hybridEncrypt = new HybridEncryptWrapper().wrap(encryptPrimitiveSet);
+    const ciphertext = await hybridEncrypt.encrypt(plaintext);
+
+    // Create a primitive set containing the primitive which can be used for
+    // encryption. Add also few more primitives with the same key as the
+    // primitive set should decrypt the ciphertext whenever there is at least
+    // one primitive which does not fail to decrypt the ciphertext.
+    const decryptPrimitiveSet = primitiveSets['decryptPrimitiveSet'];
+    const decryptPrimitive = new DummyHybridDecrypt(ciphertextSuffix);
+    decryptPrimitiveSet.addPrimitive(
+        new DummyHybridDecrypt(Random.randBytes(5)), key);
+    decryptPrimitiveSet.addPrimitive(decryptPrimitive, key);
+    decryptPrimitiveSet.addPrimitive(
+        new DummyHybridDecrypt(Random.randBytes(5)), key);
+
+    // Decrypt the ciphertext.
+    const hybridDecrypt = new HybridDecryptWrapper().wrap(decryptPrimitiveSet);
+    const decryptedCiphertext = await hybridDecrypt.decrypt(ciphertext);
+
+    // Test that the result is the original plaintext.
+    assertObjectEquals(plaintext, decryptedCiphertext);
+  },
+
+  async testDecrypt_ciphertextEncryptedByRawPrimitive() {
+    const primitiveSets = createDummyPrimitiveSets();
+    const plaintext = Random.randBytes(10);
+    // As keys are just dummy keys which do not contain key data, the same key
+    // is used for both encrypt and decrypt.
+    const key = createDummyKeysetKey(
+        /** keyId = */ 0xFFFFFFFF, PbOutputPrefixType.RAW,
+        /** enabled = */ true);
+    const ciphertextSuffix = new Uint8Array([0, 0, 0, 0xFF]);
+
+    // Get the ciphertext.
+    const encryptPrimitive = new DummyHybridEncrypt(ciphertextSuffix);
+    const ciphertext = await encryptPrimitive.encrypt(plaintext);
+
+    // Decrypt the ciphertext.
+    const decryptPrimitiveSet = primitiveSets['decryptPrimitiveSet'];
+    const decryptPrimitive = new DummyHybridDecrypt(ciphertextSuffix);
+    decryptPrimitiveSet.addPrimitive(decryptPrimitive, key);
+    const hybridDecrypt = new HybridDecryptWrapper().wrap(decryptPrimitiveSet);
+    const decryptedCiphertext = await hybridDecrypt.decrypt(ciphertext);
+
+    // Test that the result is the original plaintext.
+    assertObjectEquals(plaintext, decryptedCiphertext);
+  },
+
+  async testDecrypt_withContextInfo() {
+    const primitiveSets = createDummyPrimitiveSets();
+    const plaintext = Random.randBytes(10);
+    const contextInfo = Random.randBytes(10);
+    // As keys are just dummy keys which do not contain key data, the same key
+    // is used for both encrypt and decrypt.
+    const key = createDummyKeysetKey(
+        /** keyId = */ 0xFFFFFFFF, PbOutputPrefixType.RAW,
+        /** enabled = */ true);
+    const ciphertextSuffix = new Uint8Array([0, 0, 0, 0xFF]);
+
+    // Get the ciphertext.
+    const encryptPrimitive = new DummyHybridEncrypt(ciphertextSuffix);
+    const ciphertext = await encryptPrimitive.encrypt(plaintext, contextInfo);
+
+    // Get primitive for decryption.
+    const decryptPrimitiveSet = primitiveSets['decryptPrimitiveSet'];
+    const decryptPrimitive = new DummyHybridDecrypt(ciphertextSuffix);
+    decryptPrimitiveSet.addPrimitive(decryptPrimitive, key);
+    const hybridDecrypt = new HybridDecryptWrapper().wrap(decryptPrimitiveSet);
+
+    // Check that contextInfo was passed correctly (decryption without
+    // contextInfo argument should not work, but with contextInfo it should work
+    // properly).
+    try {
+      await hybridDecrypt.decrypt(ciphertext);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.cannotBeDecrypted(), e.toString());
+    }
+    const decryptedCiphertext =
+        await hybridDecrypt.decrypt(ciphertext, contextInfo);
+
+    // Test that the result is the original plaintext.
+    assertObjectEquals(plaintext, decryptedCiphertext);
+  },
+
+  async testDecrypt_withDisabledPrimitive() {
+    const primitiveSets = createDummyPrimitiveSets();
+    const plaintext = Random.randBytes(10);
+    const key = createDummyKeysetKey(
+        /** keyId = */ 0xFFFFFFFF, PbOutputPrefixType.RAW,
+        /** enabled = */ false);
+    const ciphertextSuffix = new Uint8Array([0, 0, 0, 0xFF]);
+
+    const encryptPrimitive = new DummyHybridEncrypt(ciphertextSuffix);
+    const ciphertext = await encryptPrimitive.encrypt(plaintext);
+
+    const decryptPrimitiveSet = primitiveSets['decryptPrimitiveSet'];
+    const decryptPrimitive = new DummyHybridDecrypt(ciphertextSuffix);
+    decryptPrimitiveSet.addPrimitive(decryptPrimitive, key);
+    const hybridDecrypt = new HybridDecryptWrapper().wrap(decryptPrimitiveSet);
+
+    try {
+      await hybridDecrypt.decrypt(ciphertext);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.cannotBeDecrypted(), e.toString());
+    }
+  },
+
+  async testDecrypt_withNullCiphertext() {
+    const primitiveSets = createDummyPrimitiveSets();
+    const decryptPrimitiveSet = primitiveSets['decryptPrimitiveSet'];
+    const hybridDecrypt = new HybridDecryptWrapper().wrap(decryptPrimitiveSet);
+
+    try {
+      await hybridDecrypt.decrypt(null);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.nullCiphertext(), e.toString());
+    }
+  },
+});
+
+/** @final */
+class ExceptionText {
+  /** @return {string} */
+  static nullPrimitiveSet() {
+    return 'CustomError: Primitive set has to be non-null.';
+  }
+  /** @return {string} */
+  static cannotBeDecrypted() {
+    return 'CustomError: Decryption failed for the given ciphertext.';
+  }
+  /** @return {string} */
+  static nullCiphertext() {
+    return 'CustomError: Ciphertext has to be non-null.';
+  }
+}
+
+/**
+ * Function for creating keys for testing purposes.
+ *
+ * @param {number} keyId
+ * @param {PbOutputPrefixType} outputPrefix
+ * @param {boolean} enabled
+ *
+ * @return {!PbKeysetKey}
+ */
+const createDummyKeysetKey = function(keyId, outputPrefix, enabled) {
+  let key = new PbKeysetKey();
+
+  if (enabled) {
+    key.setStatus(PbKeyStatusType.ENABLED);
+  } else {
+    key.setStatus(PbKeyStatusType.DISABLED);
+  }
+
+  key.setOutputPrefixType(outputPrefix);
+  key.setKeyId(keyId);
+
+  return key;
+};
+
+/**
+ * Creates a primitive sets for HybridEncrypt and HybridDecrypt with
+ * 'numberOfPrimitives' primitives. The keys corresponding to the primitives
+ * have ids from the set [1, ..., numberOfPrimitives] and the primitive
+ * corresponding to key with id 'numberOfPrimitives' is set to be primary
+ * whenever opt_withPrimary is set to true (where true is the default value).
+ *
+ * @param {boolean=} opt_withPrimary
+ * @return {{encryptPrimitiveSet:!PrimitiveSet.PrimitiveSet,
+ *     decryptPrimitiveSet:!PrimitiveSet.PrimitiveSet}}
+ */
+const createDummyPrimitiveSets = function(opt_withPrimary = true) {
+  const numberOfPrimitives = 5;
+
+  const encryptPrimitiveSet = new PrimitiveSet.PrimitiveSet();
+  const decryptPrimitiveSet = new PrimitiveSet.PrimitiveSet();
+  for (let i = 1; i < numberOfPrimitives; i++) {
+    let /** @type {PbOutputPrefixType} */ outputPrefix;
+    switch (i % 3) {
+      case 0:
+        outputPrefix = PbOutputPrefixType.TINK;
+        break;
+      case 1:
+        outputPrefix = PbOutputPrefixType.LEGACY;
+        break;
+      default:
+        outputPrefix = PbOutputPrefixType.RAW;
+    }
+    const key =
+        createDummyKeysetKey(i, outputPrefix, /* enabled = */ i % 4 < 2);
+    const ciphertextSuffix = new Uint8Array([0, 0, i]);
+    const hybridEncrypt = new DummyHybridEncrypt(ciphertextSuffix);
+    encryptPrimitiveSet.addPrimitive(hybridEncrypt, key);
+    const hybridDecrypt = new DummyHybridDecrypt(ciphertextSuffix);
+    decryptPrimitiveSet.addPrimitive(hybridDecrypt, key);
+  }
+
+  const key = createDummyKeysetKey(
+      numberOfPrimitives, PbOutputPrefixType.TINK, /* enabled = */ true);
+  const ciphertextSuffix = new Uint8Array([0, 0, numberOfPrimitives]);
+  const hybridEncrypt = new DummyHybridEncrypt(ciphertextSuffix);
+  const encryptEntry = encryptPrimitiveSet.addPrimitive(hybridEncrypt, key);
+  const hybridDecrypt = new DummyHybridDecrypt(ciphertextSuffix);
+  const decryptEntry = decryptPrimitiveSet.addPrimitive(hybridDecrypt, key);
+  if (opt_withPrimary) {
+    encryptPrimitiveSet.setPrimary(encryptEntry);
+    decryptPrimitiveSet.setPrimary(decryptEntry);
+  }
+
+  return {
+    'encryptPrimitiveSet': encryptPrimitiveSet,
+    'decryptPrimitiveSet': decryptPrimitiveSet
+  };
+};
+
+/**
+ * @implements {HybridEncrypt}
+ * @final
+ */
+class DummyHybridEncrypt {
+  /** @param {!Uint8Array} ciphertextSuffix */
+  constructor(ciphertextSuffix) {
+    this.ciphertextSuffix_ = ciphertextSuffix;
+  }
+  /** @override */
+  async encrypt(plaintext, opt_contextInfo) {
+    const ciphertext = Bytes.concat(plaintext, this.ciphertextSuffix_);
+    if (opt_contextInfo) {
+      return Bytes.concat(ciphertext, opt_contextInfo);
+    }
+    return ciphertext;
+  }
+}
+
+/**
+ * @implements {HybridDecrypt}
+ * @final
+ */
+class DummyHybridDecrypt {
+  /** @param {!Uint8Array} ciphertextSuffix */
+  constructor(ciphertextSuffix) {
+    this.ciphertextSuffix_ = ciphertextSuffix;
+  }
+
+  /** @override */
+  async decrypt(ciphertext, opt_contextInfo) {
+    if (opt_contextInfo) {
+      const infoLength = opt_contextInfo.length;
+      const contextInfo =
+          ciphertext.slice(ciphertext.length - infoLength, ciphertext.length);
+      if ([...contextInfo].toString() !== [...opt_contextInfo].toString()) {
+        throw new SecurityException('Context info does not match.');
+      }
+      ciphertext = ciphertext.slice(0, ciphertext.length - infoLength);
+    }
+    const plaintext =
+        ciphertext.slice(0, ciphertext.length - this.ciphertextSuffix_.length);
+    const suffix = ciphertext.slice(
+        ciphertext.length - this.ciphertextSuffix_.length, ciphertext.length);
+    if ([...suffix].toString() === [...this.ciphertextSuffix_].toString()) {
+      return plaintext;
+    }
+    throw new SecurityException(ExceptionText.cannotBeDecrypted());
+  }
+}
diff --git a/javascript/hybrid/hybrid_encrypt_wrapper.js b/javascript/hybrid/hybrid_encrypt_wrapper.js
new file mode 100644
index 0000000..d1aab4a
--- /dev/null
+++ b/javascript/hybrid/hybrid_encrypt_wrapper.js
@@ -0,0 +1,88 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.hybrid.HybridEncryptWrapper');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const HybridEncrypt = goog.require('tink.HybridEncrypt');
+const PrimitiveSet = goog.require('tink.PrimitiveSet');
+const PrimitiveWrapper = goog.require('tink.PrimitiveWrapper');
+const SecurityException = goog.require('tink.exception.SecurityException');
+
+/**
+ * @implements {HybridEncrypt}
+ * @final
+ */
+class WrappedHybridEncrypt {
+  // The constructor should be @private, but it is not supported by Closure
+  // (see https://github.com/google/closure-compiler/issues/2761).
+  /** @param {!PrimitiveSet.PrimitiveSet} hybridEncryptPrimitiveSet */
+  constructor(hybridEncryptPrimitiveSet) {
+    /** @private @const {!PrimitiveSet.PrimitiveSet} */
+    this.hybridEncryptPrimitiveSet_ = hybridEncryptPrimitiveSet;
+  }
+
+  /**
+   * @param {!PrimitiveSet.PrimitiveSet} hybridEncryptPrimitiveSet
+   * @return {!HybridEncrypt}
+   */
+  static newHybridEncrypt(hybridEncryptPrimitiveSet) {
+    if (!hybridEncryptPrimitiveSet) {
+      throw new SecurityException('Primitive set has to be non-null.');
+    }
+    if (!hybridEncryptPrimitiveSet.getPrimary()) {
+      throw new SecurityException('Primary has to be non-null.');
+    }
+    return new WrappedHybridEncrypt(hybridEncryptPrimitiveSet);
+  }
+
+  /** @override */
+  async encrypt(plaintext, opt_contextInfo) {
+    if (!plaintext) {
+      throw new SecurityException('Plaintext has to be non-null.');
+    }
+    const primitive =
+        this.hybridEncryptPrimitiveSet_.getPrimary().getPrimitive();
+    const ciphertext = await primitive.encrypt(plaintext, opt_contextInfo);
+    const keyId = this.hybridEncryptPrimitiveSet_.getPrimary().getIdentifier();
+
+    return Bytes.concat(keyId, ciphertext);
+  }
+}
+
+/**
+ * @implements {PrimitiveWrapper<HybridEncrypt>}
+ */
+class HybridEncryptWrapper {
+  // The constructor should be @private, but it is not supported by Closure
+  // (see https://github.com/google/closure-compiler/issues/2761).
+  constructor() {}
+
+  /**
+   * @override
+   */
+  wrap(primitiveSet) {
+    return WrappedHybridEncrypt.newHybridEncrypt(primitiveSet);
+  }
+
+  /**
+   * @override
+   */
+  getPrimitiveType() {
+    return HybridEncrypt;
+  }
+}
+
+goog.exportSymbol('tink.hybrid.HybridEncryptWrapper', HybridEncryptWrapper);
+exports = HybridEncryptWrapper;
diff --git a/javascript/hybrid/hybrid_encrypt_wrapper_test.js b/javascript/hybrid/hybrid_encrypt_wrapper_test.js
new file mode 100644
index 0000000..2e11df2
--- /dev/null
+++ b/javascript/hybrid/hybrid_encrypt_wrapper_test.js
@@ -0,0 +1,178 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.hybrid.HybridEncryptWrapperTest');
+goog.setTestOnly('tink.hybrid.HybridEncryptWrapperTest');
+
+const CryptoFormat = goog.require('tink.CryptoFormat');
+const HybridEncrypt = goog.require('tink.HybridEncrypt');
+const HybridEncryptWrapper = goog.require('tink.hybrid.HybridEncryptWrapper');
+const PbKeyStatusType = goog.require('proto.google.crypto.tink.KeyStatusType');
+const PbKeysetKey = goog.require('proto.google.crypto.tink.Keyset.Key');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+const PrimitiveSet = goog.require('tink.PrimitiveSet');
+const Random = goog.require('tink.subtle.Random');
+
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+  testNewHybridEncrypt_nullPrimitiveSet() {
+    try {
+      new HybridEncryptWrapper().wrap(null);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(ExceptionText.nullPrimitiveSet(), e.toString());
+    }
+  },
+
+  testNewHybridEncrypt_primitiveSetWithoutPrimary() {
+    const primitiveSet = createDummyPrimitiveSet(/* opt_withPrimary = */ false);
+    try {
+      new HybridEncryptWrapper().wrap(primitiveSet);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(ExceptionText.primitiveSetWithoutPrimary(), e.toString());
+    }
+  },
+
+  testNewHybridEncrypt_shouldWork() {
+    const primitiveSet = createDummyPrimitiveSet();
+    const hybridEncrypt = new HybridEncryptWrapper().wrap(primitiveSet);
+    assertTrue(hybridEncrypt != null && hybridEncrypt != undefined);
+  },
+
+  async testEncrypt_nullPlaintext() {
+    const primitiveSet = createDummyPrimitiveSet();
+    const hybridEncrypt = new HybridEncryptWrapper().wrap(primitiveSet);
+
+    try {
+      await hybridEncrypt.encrypt(null);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(ExceptionText.nullPlaintext(), e.toString());
+    }
+  },
+
+  async testEncrypt_shouldWork() {
+    const primitiveSet = createDummyPrimitiveSet();
+    const hybridEncrypt = new HybridEncryptWrapper().wrap(primitiveSet);
+
+    const plaintext = Random.randBytes(10);
+
+    const ciphertext = await hybridEncrypt.encrypt(plaintext);
+    assertTrue(ciphertext != null);
+
+    // Ciphertext should begin with primary key output prefix.
+    assertObjectEquals(
+        primitiveSet.getPrimary().getIdentifier(),
+        ciphertext.subarray(0, CryptoFormat.NON_RAW_PREFIX_SIZE));
+  },
+});
+
+/**
+ * Class holding texts for each type of exception.
+ * @final
+ */
+class ExceptionText {
+  /** @return {string} */
+  static nullPrimitiveSet() {
+    return 'CustomError: Primitive set has to be non-null.';
+  }
+  /** @return {string} */
+  static primitiveSetWithoutPrimary() {
+    return 'CustomError: Primary has to be non-null.';
+  }
+  /** @return {string} */
+  static nullPlaintext() {
+    return 'CustomError: Plaintext has to be non-null.';
+  }
+}
+
+/**
+ * Function for creating keys for testing purposes.
+ *
+ * @param {number} keyId
+ * @param {PbOutputPrefixType} outputPrefix
+ * @param {boolean} enabled
+ *
+ * @return {!PbKeysetKey}
+ */
+const createDummyKeysetKey = function(keyId, outputPrefix, enabled) {
+  let key = new PbKeysetKey();
+
+  if (enabled) {
+    key.setStatus(PbKeyStatusType.ENABLED);
+  } else {
+    key.setStatus(PbKeyStatusType.DISABLED);
+  }
+
+  key.setOutputPrefixType(outputPrefix);
+  key.setKeyId(keyId);
+
+  return key;
+};
+
+/**
+ * Creates a primitive set with 'numberOfPrimitives' primitives. The keys
+ * corresponding to the primitives have ids from the set
+ * [1, ..., numberOfPrimitives] and the primitive corresponding to key with id
+ * 'numberOfPrimitives' is set to be primary whenever opt_withPrimary is set to
+ * true (where true is the default value).
+ *
+ * @param {boolean=} opt_withPrimary (default: true)
+ * @return {!PrimitiveSet.PrimitiveSet}
+ */
+const createDummyPrimitiveSet = function(opt_withPrimary = true) {
+  const numberOfPrimitives = 5;
+
+  const primitiveSet = new PrimitiveSet.PrimitiveSet();
+  for (let i = 1; i < numberOfPrimitives; i++) {
+    let /** @type {PbOutputPrefixType} */ outputPrefix;
+    switch (i % 3) {
+      case 0:
+        outputPrefix = PbOutputPrefixType.TINK;
+        break;
+      case 1:
+        outputPrefix = PbOutputPrefixType.LEGACY;
+        break;
+      default:
+        outputPrefix = PbOutputPrefixType.RAW;
+    }
+    const key =
+        createDummyKeysetKey(i, outputPrefix, /* enabled = */ i % 4 < 2);
+    const hybridEncrypt = new DummyHybridEncrypt();
+    primitiveSet.addPrimitive(hybridEncrypt, key);
+  }
+
+  const key = createDummyKeysetKey(
+      numberOfPrimitives, PbOutputPrefixType.TINK, /* enabled = */ true);
+  const hybridEncrypt = new DummyHybridEncrypt();
+  const entry = primitiveSet.addPrimitive(hybridEncrypt, key);
+  if (opt_withPrimary) {
+    primitiveSet.setPrimary(entry);
+  }
+
+  return primitiveSet;
+};
+
+/**
+ * @implements {HybridEncrypt}
+ * @final
+ */
+class DummyHybridEncrypt {
+  /** @override */
+  async encrypt(plaintext, opt_contextInfo) {
+    return plaintext;
+  }
+}
diff --git a/javascript/hybrid/hybrid_key_templates.js b/javascript/hybrid/hybrid_key_templates.js
new file mode 100644
index 0000000..94b064b
--- /dev/null
+++ b/javascript/hybrid/hybrid_key_templates.js
@@ -0,0 +1,146 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.hybrid.HybridKeyTemplates');
+
+const AeadKeyTemplates = goog.require('tink.aead.AeadKeyTemplates');
+const HybridConfig = goog.require('tink.hybrid.HybridConfig');
+const PbEciesAeadDemParams = goog.require('proto.google.crypto.tink.EciesAeadDemParams');
+const PbEciesAeadHkdfKeyFormat = goog.require('proto.google.crypto.tink.EciesAeadHkdfKeyFormat');
+const PbEciesAeadHkdfParams = goog.require('proto.google.crypto.tink.EciesAeadHkdfParams');
+const PbEciesHkdfKemParams = goog.require('proto.google.crypto.tink.EciesHkdfKemParams');
+const PbEllipticCurveType = goog.require('proto.google.crypto.tink.EllipticCurveType');
+const PbHashType = goog.require('proto.google.crypto.tink.HashType');
+const PbKeyTemplate = goog.require('proto.google.crypto.tink.KeyTemplate');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+const PbPointFormat = goog.require('proto.google.crypto.tink.EcPointFormat');
+
+/**
+ * Pre-generated KeyTemplates for keys for hybrid encryption.
+ *
+ * One can use these templates to generate new Keyset with
+ * KeysetHandle.generateNew method. To generate a new keyset that contains a
+ * single EciesAeadHkdfKey, one can do:
+ *
+ * HybridConfig.Register();
+ * KeysetHandle handle = KeysetHandle.generateNew(
+ *     HybridKeyTemplates.eciesP256HkdfHmacSha256Aes128Gcm());
+ *
+ * @final
+ */
+class HybridKeyTemplates {
+  /**
+   * Returns a KeyTemplate that generates new instances of
+   * EciesAeadHkdfPrivateKey with the following parameters:
+   *
+   *   KEM: ECDH over NIST P-256
+   *   DEM: AES128-GCM
+   *   KDF: HKDF-HMAC-SHA256 with an empty salt
+   *   OutputPrefixType: TINK
+   *
+   * @return {!PbKeyTemplate}
+   */
+  static eciesP256HkdfHmacSha256Aes128Gcm() {
+    return createEciesAeadHkdfKeyTemplate_(
+        /* curveType = */ PbEllipticCurveType.NIST_P256,
+        /* hkdfHash = */ PbHashType.SHA256,
+        /* pointFormat = */ PbPointFormat.UNCOMPRESSED,
+        /* demKeyTemplate = */ AeadKeyTemplates.aes128Gcm(),
+        /* hkdfSalt = */ new Uint8Array(0));
+  }
+
+  /**
+   * Returns a KeyTemplate that generates new instances of
+   * EciesAeadHkdfPrivateKey with the following parameters:
+   *
+   *   KEM: ECDH over NIST P-256
+   *   DEM: AES128-CTR-HMAC-SHA256 with
+   *        - AES key size: 16 bytes
+   *        - AES CTR IV size: 16 bytes
+   *        - HMAC key size: 32 bytes
+   *        - HMAC tag size: 16 bytes
+   *   KDF: HKDF-HMAC-SHA256 with an empty salt
+   *   OutputPrefixType: TINK
+   *
+   * @return {!PbKeyTemplate}
+   */
+  static eciesP256HkdfHmacSha256Aes128CtrHmacSha256() {
+    return createEciesAeadHkdfKeyTemplate_(
+        /* curveType = */ PbEllipticCurveType.NIST_P256,
+        /* hkdfHash = */ PbHashType.SHA256,
+        /* pointFormat = */ PbPointFormat.UNCOMPRESSED,
+        /* demKeyTemplate = */ AeadKeyTemplates.aes128CtrHmacSha256(),
+        /* hkdfSalt = */ new Uint8Array(0));
+  }
+}
+
+/**
+ * @param {PbEllipticCurveType} curveType
+ * @param {PbHashType} hkdfHash
+ * @param {PbPointFormat} pointFormat
+ * @param {PbKeyTemplate} demKeyTemplate
+ * @param {!Uint8Array} hkdfSalt
+ *
+ * @return {!PbKeyTemplate}
+ * @private
+ */
+const createEciesAeadHkdfKeyTemplate_ = function(
+    curveType, hkdfHash, pointFormat, demKeyTemplate, hkdfSalt) {
+  // key format
+  const keyFormat =
+      new PbEciesAeadHkdfKeyFormat().setParams(createEciesAeadHkdfParams_(
+          curveType, hkdfHash, pointFormat, demKeyTemplate, hkdfSalt));
+
+  // key template
+  const keyTemplate =
+      new PbKeyTemplate()
+          .setTypeUrl(HybridConfig.ECIES_AEAD_HKDF_PRIVATE_KEY_TYPE)
+          .setValue(keyFormat.serializeBinary())
+          .setOutputPrefixType(PbOutputPrefixType.TINK);
+
+  return keyTemplate;
+};
+
+/**
+ * @param {PbEllipticCurveType} curveType
+ * @param {PbHashType} hkdfHash
+ * @param {PbPointFormat} pointFormat
+ * @param {PbKeyTemplate} demKeyTemplate
+ * @param {!Uint8Array} hkdfSalt
+ *
+ * @return {!PbEciesAeadHkdfParams}
+ * @private
+ */
+const createEciesAeadHkdfParams_ = function(
+    curveType, hkdfHash, pointFormat, demKeyTemplate, hkdfSalt) {
+  // KEM params
+  const kemParams = new PbEciesHkdfKemParams()
+                        .setCurveType(curveType)
+                        .setHkdfHashType(hkdfHash)
+                        .setHkdfSalt(hkdfSalt);
+
+  // DEM params
+  const demParams = new PbEciesAeadDemParams().setAeadDem(demKeyTemplate);
+
+  // params
+  const params = new PbEciesAeadHkdfParams()
+                     .setKemParams(kemParams)
+                     .setDemParams(demParams)
+                     .setEcPointFormat(pointFormat);
+
+  return params;
+};
+
+goog.exportSymbol('tink.hybrid.HybridKeyTemplates', HybridKeyTemplates);
+exports = HybridKeyTemplates;
diff --git a/javascript/hybrid/hybrid_key_templates_test.js b/javascript/hybrid/hybrid_key_templates_test.js
new file mode 100644
index 0000000..31e57df
--- /dev/null
+++ b/javascript/hybrid/hybrid_key_templates_test.js
@@ -0,0 +1,102 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.hybrid.HybridKeyTemplatesTest');
+goog.setTestOnly('tink.hybrid.HybridKeyTemplatesTest');
+
+const AeadKeyTemplates = goog.require('tink.aead.AeadKeyTemplates');
+const EciesAeadHkdfPrivateKeyManager = goog.require('tink.hybrid.EciesAeadHkdfPrivateKeyManager');
+const HybridKeyTemplates = goog.require('tink.hybrid.HybridKeyTemplates');
+const PbEciesAeadHkdfKeyFormat = goog.require('proto.google.crypto.tink.EciesAeadHkdfKeyFormat');
+const PbEllipticCurveType = goog.require('proto.google.crypto.tink.EllipticCurveType');
+const PbHashType = goog.require('proto.google.crypto.tink.HashType');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+const PbPointFormat = goog.require('proto.google.crypto.tink.EcPointFormat');
+
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+  testEciesP256HkdfHmacSha256Aes128Gcm() {
+    // Expects function to create a key with following parameters.
+    const expectedCurve = PbEllipticCurveType.NIST_P256;
+    const expectedHkdfHashFunction = PbHashType.SHA256;
+    const expectedAeadTemplate = AeadKeyTemplates.aes128Gcm();
+    const expectedPointFormat = PbPointFormat.UNCOMPRESSED;
+    const expectedOutputPrefix = PbOutputPrefixType.TINK;
+
+    // Expected type URL is the one supported by EciesAeadHkdfPrivateKeyManager.
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+    const expectedTypeUrl = manager.getKeyType();
+
+    const keyTemplate = HybridKeyTemplates.eciesP256HkdfHmacSha256Aes128Gcm();
+
+    assertEquals(expectedTypeUrl, keyTemplate.getTypeUrl());
+    assertEquals(expectedOutputPrefix, keyTemplate.getOutputPrefixType());
+
+    // Test values in key format.
+    const keyFormat =
+        PbEciesAeadHkdfKeyFormat.deserializeBinary(keyTemplate.getValue());
+    const params = keyFormat.getParams();
+    assertEquals(expectedPointFormat, params.getEcPointFormat());
+
+    // Test KEM params.
+    const kemParams = params.getKemParams();
+    assertEquals(expectedCurve, kemParams.getCurveType());
+    assertEquals(expectedHkdfHashFunction, kemParams.getHkdfHashType());
+
+    // Test DEM params.
+    const demParams = params.getDemParams();
+    assertObjectEquals(expectedAeadTemplate, demParams.getAeadDem());
+
+    // Test that the template works with EciesAeadHkdfPrivateKeyManager.
+    manager.getKeyFactory().newKey(keyTemplate.getValue_asU8());
+  },
+
+  testEciesP256HkdfHmacSha256Aes128CtrHmacSha256() {
+    // Expects function to create a key with following parameters.
+    const expectedCurve = PbEllipticCurveType.NIST_P256;
+    const expectedHkdfHashFunction = PbHashType.SHA256;
+    const expectedAeadTemplate = AeadKeyTemplates.aes128CtrHmacSha256();
+    const expectedPointFormat = PbPointFormat.UNCOMPRESSED;
+    const expectedOutputPrefix = PbOutputPrefixType.TINK;
+
+    // Expected type URL is the one supported by EciesAeadHkdfPrivateKeyManager.
+    const manager = new EciesAeadHkdfPrivateKeyManager();
+    const expectedTypeUrl = manager.getKeyType();
+
+    const keyTemplate =
+        HybridKeyTemplates.eciesP256HkdfHmacSha256Aes128CtrHmacSha256();
+
+    assertEquals(expectedTypeUrl, keyTemplate.getTypeUrl());
+    assertEquals(expectedOutputPrefix, keyTemplate.getOutputPrefixType());
+
+    // Test values in key format.
+    const keyFormat =
+        PbEciesAeadHkdfKeyFormat.deserializeBinary(keyTemplate.getValue());
+    const params = keyFormat.getParams();
+    assertEquals(expectedPointFormat, params.getEcPointFormat());
+
+    // Test KEM params.
+    const kemParams = params.getKemParams();
+    assertEquals(expectedCurve, kemParams.getCurveType());
+    assertEquals(expectedHkdfHashFunction, kemParams.getHkdfHashType());
+
+    // Test DEM params.
+    const demParams = params.getDemParams();
+    assertObjectEquals(expectedAeadTemplate, demParams.getAeadDem());
+
+    // Test that the template works with EciesAeadHkdfPrivateKeyManager.
+    manager.getKeyFactory().newKey(keyTemplate.getValue_asU8());
+  },
+});
diff --git a/javascript/hybrid/registry_ecies_aead_hkdf_dem_helper.js b/javascript/hybrid/registry_ecies_aead_hkdf_dem_helper.js
new file mode 100644
index 0000000..f3b99cb
--- /dev/null
+++ b/javascript/hybrid/registry_ecies_aead_hkdf_dem_helper.js
@@ -0,0 +1,188 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.hybrid.RegistryEciesAeadHkdfDemHelper');
+
+const Aead = goog.require('tink.Aead');
+const AeadConfig = goog.require('tink.aead.AeadConfig');
+const EciesAeadHkdfDemHelper = goog.require('tink.subtle.EciesAeadHkdfDemHelper');
+const PbAesCtrHmacAeadKey = goog.require('proto.google.crypto.tink.AesCtrHmacAeadKey');
+const PbAesCtrHmacAeadKeyFormat = goog.require('proto.google.crypto.tink.AesCtrHmacAeadKeyFormat');
+const PbAesGcmKey = goog.require('proto.google.crypto.tink.AesGcmKey');
+const PbAesGcmKeyFormat = goog.require('proto.google.crypto.tink.AesGcmKeyFormat');
+const PbKeyTemplate = goog.require('proto.google.crypto.tink.KeyTemplate');
+const Registry = goog.require('tink.Registry');
+const SecurityException = goog.require('tink.exception.SecurityException');
+
+
+/**
+ * @implements {EciesAeadHkdfDemHelper}
+ * @final
+ */
+class RegistryEciesAeadHkdfDemHelper {
+  /**
+   * @param {!PbKeyTemplate} keyTemplate
+   */
+  constructor(keyTemplate) {
+    let /** @type {number} */ demKeySize;
+    let /** @type {number} */ aesCtrKeySize;
+    let /** @type {!PbAesCtrHmacAeadKeyFormat|!PbAesGcmKeyFormat} */ keyFormat;
+    const keyTypeUrl = keyTemplate.getTypeUrl();
+
+    switch (keyTypeUrl) {
+      case AeadConfig.AES_CTR_HMAC_AEAD_TYPE_URL:
+        keyFormat =
+            RegistryEciesAeadHkdfDemHelper.getAesCtrHmacKeyFormat_(keyTemplate);
+        aesCtrKeySize = keyFormat.getAesCtrKeyFormat().getKeySize();
+        const hmacKeySize = keyFormat.getHmacKeyFormat().getKeySize();
+        demKeySize = aesCtrKeySize + hmacKeySize;
+        break;
+
+      case AeadConfig.AES_GCM_TYPE_URL:
+        keyFormat =
+            RegistryEciesAeadHkdfDemHelper.getAesGcmKeyFormat_(keyTemplate);
+        demKeySize = keyFormat.getKeySize();
+        break;
+
+      default:
+        throw new SecurityException(
+            'Key type URL ' + keyTypeUrl + ' is not supported.');
+    }
+
+    const keyFactory = Registry.getKeyManager(keyTypeUrl).getKeyFactory();
+    /** @const @private {!PbAesCtrHmacAeadKey|!PbAesGcmKey} */
+    this.key_ = /** @type {!PbAesCtrHmacAeadKey|!PbAesGcmKey} */ (
+        keyFactory.newKey(keyFormat));
+    /** @const @private {string} */
+    this.demKeyTypeUrl_ = keyTypeUrl;
+    /** @const @private {number} */
+    this.demKeySize_ = demKeySize;
+    /** @const @private {number} */
+    this.aesCtrKeySize_ = aesCtrKeySize;
+  }
+
+  /**
+   * @override
+   */
+  getDemKeySizeInBytes() {
+    return this.demKeySize_;
+  }
+
+  /**
+   * @override
+   */
+  async getAead(symmetricKey) {
+    if (symmetricKey.length != this.demKeySize_) {
+      throw new SecurityException(
+          'Key is not of the correct length, expected length: ' +
+          this.demKeySize_ + ', but got key of length: ' + symmetricKey.length +
+          '.');
+    }
+
+    let /** @type {!PbAesCtrHmacAeadKey|!PbAesGcmKey} */ key;
+    if (this.demKeyTypeUrl_ === AeadConfig.AES_CTR_HMAC_AEAD_TYPE_URL) {
+      key = this.replaceAesCtrHmacKeyValue_(symmetricKey);
+    } else {
+      key = this.replaceAesGcmKeyValue_(symmetricKey);
+    }
+
+    return await Registry.getPrimitive(Aead, key, this.demKeyTypeUrl_);
+  }
+
+  /**
+   * @private
+   *
+   * @param {!PbKeyTemplate} keyTemplate
+   *
+   * @return {!PbAesGcmKeyFormat}
+   */
+  static getAesGcmKeyFormat_(keyTemplate) {
+    let /** @type{!PbAesGcmKeyFormat} */ keyFormat;
+    try {
+      keyFormat = PbAesGcmKeyFormat.deserializeBinary(keyTemplate.getValue());
+    } catch (e) {
+      throw new SecurityException(
+          'Could not parse the given Uint8Array as a serialized proto of ' +
+          AeadConfig.AES_GCM_TYPE_URL + '.');
+    }
+    if (!keyFormat.getKeySize()) {
+      throw new SecurityException(
+          'Could not parse the given Uint8Array as a serialized proto of ' +
+          AeadConfig.AES_GCM_TYPE_URL + '.');
+    }
+    return keyFormat;
+  }
+
+  /**
+   * @private
+   *
+   * @param {!PbKeyTemplate} keyTemplate
+   *
+   * @return {!PbAesCtrHmacAeadKeyFormat}
+   */
+  static getAesCtrHmacKeyFormat_(keyTemplate) {
+    let /** @type{!PbAesCtrHmacAeadKeyFormat} */ keyFormat;
+    try {
+      keyFormat =
+          PbAesCtrHmacAeadKeyFormat.deserializeBinary(keyTemplate.getValue());
+    } catch (e) {
+      throw new SecurityException(
+          'Could not parse the given Uint8Array ' +
+          'as a serialized proto of ' + AeadConfig.AES_CTR_HMAC_AEAD_TYPE_URL +
+          '.');
+    }
+    if (!keyFormat.getAesCtrKeyFormat() || !keyFormat.getHmacKeyFormat()) {
+      throw new SecurityException(
+          'Could not parse the given Uint8Array as a serialized proto of ' +
+          AeadConfig.AES_CTR_HMAC_AEAD_TYPE_URL + '.');
+    }
+    return keyFormat;
+  }
+
+
+  /**
+   * @private
+   *
+   * @param {!Uint8Array} symmetricKey
+   *
+   * @return {!PbAesGcmKey}
+   */
+  replaceAesGcmKeyValue_(symmetricKey) {
+    const key = this.key_.setKeyValue(symmetricKey);
+    return key;
+  }
+
+  /**
+   * @private
+   *
+   * @param {!Uint8Array} symmetricKey
+   *
+   * @return {!PbAesCtrHmacAeadKey}
+   */
+  replaceAesCtrHmacKeyValue_(symmetricKey) {
+    const key = /** @type {!PbAesCtrHmacAeadKey} */ (this.key_);
+
+    const aesCtrKeyValue = symmetricKey.slice(0, this.aesCtrKeySize_);
+    key.getAesCtrKey().setKeyValue(aesCtrKeyValue);
+
+    const hmacKeyValue =
+        symmetricKey.slice(this.aesCtrKeySize_, this.demKeySize_);
+    key.getHmacKey().setKeyValue(hmacKeyValue);
+
+    return key;
+  }
+}
+
+goog.exportSymbol('tink.hybrid.RegistryEciesAeadHkdfDemHelper', RegistryEciesAeadHkdfDemHelper);
+exports = RegistryEciesAeadHkdfDemHelper;
diff --git a/javascript/hybrid/registry_ecies_aead_hkdf_dem_helper_test.js b/javascript/hybrid/registry_ecies_aead_hkdf_dem_helper_test.js
new file mode 100644
index 0000000..84f970a
--- /dev/null
+++ b/javascript/hybrid/registry_ecies_aead_hkdf_dem_helper_test.js
@@ -0,0 +1,190 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.hybrid.RegistryEciesAeadHkdfDemHelperTest');
+goog.setTestOnly('tink.hybrid.RegistryEciesAeadHkdfDemHelperTest');
+
+const AeadConfig = goog.require('tink.aead.AeadConfig');
+const AeadKeyTemplates = goog.require('tink.aead.AeadKeyTemplates');
+const Random = goog.require('tink.subtle.Random');
+const Registry = goog.require('tink.Registry');
+const RegistryEciesAeadHkdfDemHelper = goog.require('tink.hybrid.RegistryEciesAeadHkdfDemHelper');
+
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+  setUp() {
+    AeadConfig.register();
+  },
+
+  tearDown() {
+    Registry.reset();
+  },
+
+  //////////////////////////////////////////////////////////////////////////////
+  // Tests for constructor
+  //////////////////////////////////////////////////////////////////////////////
+
+  testConstructor_unsupportedKeyType() {
+    const template = AeadKeyTemplates.aes128CtrHmacSha256().setTypeUrl(
+        'some_unsupported_type_url');
+
+    try {
+      new RegistryEciesAeadHkdfDemHelper(template);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          ExceptionText.unsupportedTypeUrl(template.getTypeUrl()),
+          e.toString());
+    }
+  },
+
+  testConstructor_invalidKeyFormats() {
+    // Some valid AES-GCM and AES-CTR-HMAC key templates.
+    const templates =
+        [AeadKeyTemplates.aes128CtrHmacSha256(), AeadKeyTemplates.aes128Gcm()];
+    const invalidKeyFormats = [new Uint8Array(0), new Uint8Array([0, 1, 2])];
+
+    // Test that if the value is changed to invalid key format than the DEM
+    // helper throws an exception.
+    for (let template of templates) {
+      for (let invalidKeyFormat of invalidKeyFormats) {
+        template.setValue(invalidKeyFormat);
+
+        try {
+          new RegistryEciesAeadHkdfDemHelper(template);
+          fail('An exception should be thrown.');
+        } catch (e) {
+          assertEquals(
+              ExceptionText.invalidKeyFormat(template.getTypeUrl()),
+              e.toString());
+        }
+      }
+    }
+  },
+
+  testConstructor_aes128CtrHmacSha256KeyTemplate() {
+    const template = AeadKeyTemplates.aes128CtrHmacSha256();
+    const helper = new RegistryEciesAeadHkdfDemHelper(template);
+
+    // Expected size is a sum of AES CTR key length and HMAC key length.
+    const expectedSize = 16 + 32;
+    assertEquals(expectedSize, helper.getDemKeySizeInBytes());
+  },
+
+  testConstructor_aes256CtrHmacSha256KeyTemplate() {
+    const template = AeadKeyTemplates.aes256CtrHmacSha256();
+    const helper = new RegistryEciesAeadHkdfDemHelper(template);
+
+    // Expected size is a sum of AES CTR key length and HMAC key length.
+    const expectedSize = 32 + 32;
+    assertEquals(expectedSize, helper.getDemKeySizeInBytes());
+  },
+
+  testConstructor_aes128Gcm() {
+    const template = AeadKeyTemplates.aes128Gcm();
+    const helper = new RegistryEciesAeadHkdfDemHelper(template);
+
+    // Expected size is equal to the size of key.
+    const expectedSize = 16;
+    assertEquals(expectedSize, helper.getDemKeySizeInBytes());
+  },
+
+  testConstructor_aes256Gcm() {
+    const template = AeadKeyTemplates.aes256Gcm();
+    const helper = new RegistryEciesAeadHkdfDemHelper(template);
+
+    // Expected size is equal to the size of key.
+    const expectedSize = 32;
+    assertEquals(expectedSize, helper.getDemKeySizeInBytes());
+  },
+
+  //////////////////////////////////////////////////////////////////////////////
+  // Tests for getAead method
+  //////////////////////////////////////////////////////////////////////////////
+
+  async testGetAead_invalidKeyLength() {
+    const template = AeadKeyTemplates.aes128CtrHmacSha256();
+    // Expected size is a sum of AES CTR key length and HMAC key length.
+    const expectedKeyLength = 16 + 32;
+    const helper = new RegistryEciesAeadHkdfDemHelper(template);
+    const keyLength = 2;
+
+    try {
+      await helper.getAead(new Uint8Array(keyLength));
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          ExceptionText.invalidKeyLength(expectedKeyLength, keyLength),
+          e.toString());
+    }
+  },
+
+  async testGetAead_differentTemplates() {
+    const templates = [
+      AeadKeyTemplates.aes128CtrHmacSha256(), AeadKeyTemplates.aes128Gcm(),
+      AeadKeyTemplates.aes256CtrHmacSha256(), AeadKeyTemplates.aes256Gcm()
+    ];
+
+    for (let template of templates) {
+      const helper = new RegistryEciesAeadHkdfDemHelper(template);
+      // Compute some demKey of size corresponding to the template.
+      // The result of getDemKeySizeInBytes is the expected one for the given
+      // templates as it was tested for these templates in previous tests.
+      const demKey = Random.randBytes(helper.getDemKeySizeInBytes());
+
+      // Get Aead from helper.
+      const aead = await helper.getAead(demKey);
+      assertTrue(aead != null);
+
+      // Test the Aead instance.
+      const plaintext = Random.randBytes(10);
+      const aad = Random.randBytes(10);
+      const ciphertext = await aead.encrypt(plaintext, aad);
+      const decryptedCiphertext = await aead.decrypt(ciphertext, aad);
+
+      assertObjectEquals(plaintext, decryptedCiphertext);
+    }
+  },
+});
+
+// Helper classes and functions
+class ExceptionText {
+  /**
+   * @param {string} typeUrl
+   * @return {string}
+   */
+  static unsupportedTypeUrl(typeUrl) {
+    return 'CustomError: Key type URL ' + typeUrl + ' is not supported.';
+  }
+
+  /**
+   * @param {string} keyType
+   * @return {string}
+   */
+  static invalidKeyFormat(keyType) {
+    return 'CustomError: Could not parse the given Uint8Array as ' +
+        'a serialized proto of ' + keyType + '.';
+  }
+
+  /**
+   * @param {number} expectedKeyLength
+   * @param {number} actualKeyLength
+   * @return {string}
+   */
+  static invalidKeyLength(expectedKeyLength, actualKeyLength) {
+    return 'CustomError: Key is not of the correct length, expected length: ' +
+        expectedKeyLength + ', but got key of length: ' + actualKeyLength + '.';
+  }
+}
diff --git a/javascript/hybrid_decrypt.js b/javascript/hybrid_decrypt.js
new file mode 100644
index 0000000..e99652d
--- /dev/null
+++ b/javascript/hybrid_decrypt.js
@@ -0,0 +1,76 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.HybridDecrypt');
+
+/**
+ * Interface for hybrid encryption.
+ *
+ * Hybrid Encryption combines the efficiency of symmetric encryption with the
+ * convenience of public-key encryption: to encrypt a message a fresh symmetric
+ * key is generated and used to encrypt the actual plaintext data, while the
+ * recipient’s public key is used to encrypt the symmetric key only, and the
+ * final ciphertext consists of the symmetric ciphertext and the encrypted
+ * symmetric key.
+ *
+ * WARNING: Hybrid Encryption does not provide authenticity, that is the
+ * recipient of an encrypted message does not know the identity of the sender.
+ * Similar to general public-key encryption schemes the security goal of Hybrid
+ * Encryption is to provide privacy only. In other words, Hybrid Encryption is
+ * secure if and only if the recipient can accept anonymous messages or can rely
+ * on other mechanisms to authenticate the sender.
+ *
+ * Security guarantees: The functionality of Hybrid Encryption is represented as
+ * a pair of primitives (interfaces): `HybridEncrypt` for encryption of data,
+ * and `HybridDecrypt` for decryption. Implementations of these interfaces are
+ * secure against adaptive chosen ciphertext attacks.
+ *
+ * In addition to `plaintext` the encryption takes an extra, optional parameter
+ * `opt_contextInfo`, which usually is public data implicit from the context,
+ * but should be bound to the resulting ciphertext, i.e. the ciphertext allows
+ * for checking the integrity of `opt_contextInfo` (but there are no guarantees
+ * wrt. the secrecy or authenticity of `opt_contextInfo`).
+ *
+ * `opt_contextInfo` can be empty or null, but to ensure the correct
+ * decryption of a ciphertext the same value must be provided for the decryption
+ * operation as was used during encryption (cf. `HybridEncrypt`}).
+ *
+ * A concrete instantiation of this interface can implement the binding of
+ * contextInfo to the ciphertext in various ways, for example:
+ *     * use `opt_contextInfo` as "associated data"-input for the employed
+ *     AEAD symmetric encryption (cf. https://tools.ietf.org/html/rfc5116).
+ *     * use `opt_contextInfo` as "CtxInfo"-input for HKDF (if the
+ * implementation uses HKDF as key derivation function, cf.
+ *      https://tools.ietf.org/html/rfc5869).
+ *
+ * @record
+ */
+class HybridDecrypt {
+  /**
+   * Decryption operation: decrypts ciphertext verifying the integrity of
+   * `opt_contextInfo`.
+   *
+   * @param {!Uint8Array} ciphertext the ciphertext to be decrypted, must be
+   *     non-null.
+   * @param {?Uint8Array=} opt_contextInfo optional the context info to be
+   *     authenticated. For successful decryption it must be the same as used
+   *     during encryption. It can be null, which is equivalent to an empty
+   *     (zero-length) byte array.
+   * @return {!Promise<!Uint8Array>} resulting plaintext
+   */
+  decrypt(ciphertext, opt_contextInfo) {}
+}
+
+goog.exportSymbol('tink.HybridDecrypt', HybridDecrypt);
+exports = HybridDecrypt;
diff --git a/javascript/hybrid_encrypt.js b/javascript/hybrid_encrypt.js
new file mode 100644
index 0000000..9d5423f
--- /dev/null
+++ b/javascript/hybrid_encrypt.js
@@ -0,0 +1,75 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.HybridEncrypt');
+
+/**
+ * Interface for hybrid encryption.
+ *
+ * Hybrid Encryption combines the efficiency of symmetric encryption with the
+ * convenience of public-key encryption: to encrypt a message a fresh symmetric
+ * key is generated and used to encrypt the actual plaintext data, while the
+ * recipient’s public key is used to encrypt the symmetric key only, and the
+ * final ciphertext consists of the symmetric ciphertext and the encrypted
+ * symmetric key.
+ *
+ * WARNING: Hybrid Encryption does not provide authenticity, that is the
+ * recipient of an encrypted message does not know the identity of the sender.
+ * Similar to general public-key encryption schemes the security goal of Hybrid
+ * Encryption is to provide privacy only. In other words, Hybrid Encryption is
+ * secure if and only if the recipient can accept anonymous messages or can rely
+ * on other mechanisms to authenticate the sender.
+ *
+ * Security guarantees: The functionality of Hybrid Encryption is represented as
+ * a pair of primitives (interfaces): `HybridEncrypt` for encryption of data,
+ * and `HybridDecrypt` for decryption. Implementations of these interfaces are
+ * secure against adaptive chosen ciphertext attacks.
+ *
+ * In addition to `plaintext` the encryption takes an extra, optional parameter
+ * `opt_contextInfo`, which usually is public data implicit from the context,
+ * but should be bound to the resulting ciphertext, i.e. the ciphertext allows
+ * for checking the integrity of `opt_contextInfo` (but there are no guarantees
+ * wrt. the secrecy or authenticity of `opt_contextInfo`).
+ *
+ * `opt_contextInfo` can be empty or null, but to ensure the correct
+ * decryption of a ciphertext the same value must be provided for the decryption
+ * operation as was used during encryption (cf. `HybridEncrypt`}).
+ *
+ * A concrete instantiation of this interface can implement the binding of
+ * contextInfo to the ciphertext in various ways, for example:
+ *     * use `opt_contextInfo` as "associated data"-input for the employed
+ *     AEAD symmetric encryption (cf. https://tools.ietf.org/html/rfc5116).
+ *     * use `opt_contextInfo` as "CtxInfo"-input for HKDF (if the
+ * implementation uses HKDF as key derivation function, cf.
+ *      https://tools.ietf.org/html/rfc5869).
+ *
+ * @record
+ */
+class HybridEncrypt {
+  /**
+   * Encryption operation: encrypts `plaintext` binding `opt_contextInfo` to the
+   * resulting ciphertext.
+   *
+   * @param {!Uint8Array} plaintext the plaintext to be encrypted, must be
+   *     non-null.
+   * @param {?Uint8Array=} opt_contextInfo optional context info to be
+   *     authenticated. It can be null, which is equivalent to an empty
+   *     (zero-length) byte array.
+   * @return {!Promise<!Uint8Array>} resulting ciphertext
+   */
+  encrypt(plaintext, opt_contextInfo) {}
+}
+
+goog.exportSymbol('tink.HybridEncrypt', HybridEncrypt);
+exports = HybridEncrypt;
diff --git a/javascript/key_manager.js b/javascript/key_manager.js
new file mode 100644
index 0000000..a28b17f
--- /dev/null
+++ b/javascript/key_manager.js
@@ -0,0 +1,134 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.KeyManager');
+
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const PbMessage = goog.require('jspb.Message');
+
+/**
+ * An auxiliary container for methods that generate new keys.
+ * Those methods are separate from KeyManager as their functionality is
+ * independent of the primitive of the corresponding KeyManager.
+ *
+ * @record
+ */
+class KeyFactory {
+  /**
+   * Generates a new random key according to 'keyFormat'.
+   *
+   * @param {!PbMessage|!Uint8Array} keyFormat is either a KeyFormat
+   *     proto or a serialized KeyFormat proto
+   * @return {!PbMessage|!Promise<!PbMessage>} the new generated key
+   */
+  newKey(keyFormat) {}
+
+  /**
+   * Generates a new random key based on the "serialized_key_format" and returns
+   * it as a KeyData proto.
+   *
+   * @param {!Uint8Array} serializedKeyFormat
+   * @return {!PbKeyData|!Promise<!PbKeyData>}
+   */
+  newKeyData(serializedKeyFormat) {}
+}
+
+/**
+ * @record
+ * @extends {KeyFactory}
+ */
+class PrivateKeyFactory {
+  /**
+   * Returns a public key data extracted from the given serialized private key.
+   *
+   * @param {!Uint8Array} serializedPrivateKey
+   * @return {!PbKeyData}
+   */
+  getPublicKeyData(serializedPrivateKey) {}
+}
+
+/**
+ * A KeyManager "understands" keys of a specific key type: it can generate keys
+ * of the supported type and create primitives for supported keys.
+ * A key type is identified by the global name of the protocol buffer that holds
+ * the corresponding key material, and is given by typeUrl-field of
+ * KeyData-protocol buffer.
+ *
+ * The template parameter P denotes the primitive corresponding to the keys
+ * handled by this manager.
+ *
+ * @template P
+ * @record
+ */
+class KeyManager {
+  /**
+   * Constructs an instance of primitive P for a given key.
+   *
+   * @param {!Object} primitiveType
+   * @param {!PbKeyData|!PbMessage} key is either a KeyData proto or a supported
+   *     key proto
+   * @return {!Promise.<!P>}
+   */
+  getPrimitive(primitiveType, key) {}
+
+  /**
+   * Returns true if this KeyManager supports keyType.
+   *
+   * @param {string} keyType
+   * @return {boolean}
+   */
+  doesSupport(keyType) {}
+
+  /**
+   * Returns the URL which identifies the keys managed by this KeyManager.
+   *
+   * @return {string}
+   */
+  getKeyType() {}
+
+  /**
+   * Returns the type of primitive which can be generated by this KeyManager.
+   *
+   * This function is specific for javascript to allow verifying that
+   * the primitive returned by getPrimitive function implements certain
+   * primitive interface (e.g. that the primitive is AEAD).
+   *
+   * @return {!Object}
+   */
+  getPrimitiveType() {}
+
+  /**
+   * Returns the version of this KeyManager.
+   *
+   * @return {number}
+   */
+  getVersion() {}
+
+  /**
+   * Returns a factory that generates keys of the key type handled by this
+   * manager.
+   *
+   * @return {!KeyFactory}
+   */
+  getKeyFactory() {}
+}
+
+goog.exportSymbol('tink.KeyManager', KeyManager);
+goog.exportSymbol('tink.KeyFactory', KeyFactory);
+goog.exportSymbol('tink.PrivateKeyFactory', PrivateKeyFactory);
+exports = {
+  KeyManager,
+  KeyFactory,
+  PrivateKeyFactory
+};
diff --git a/javascript/keyset_handle.js b/javascript/keyset_handle.js
new file mode 100644
index 0000000..1a9596b
--- /dev/null
+++ b/javascript/keyset_handle.js
@@ -0,0 +1,233 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.KeysetHandle');
+
+const Aead = goog.require('tink.Aead');
+const InvalidArgumentsException = goog.require('tink.exception.InvalidArgumentsException');
+const KeyManager = goog.require('tink.KeyManager');
+const KeysetReader = goog.require('tink.KeysetReader');
+const KeysetWriter = goog.require('tink.KeysetWriter');
+const PbKeyMaterialType = goog.require('proto.google.crypto.tink.KeyData.KeyMaterialType');
+const PbKeyStatusType = goog.require('proto.google.crypto.tink.KeyStatusType');
+const PbKeyTemplate = goog.require('proto.google.crypto.tink.KeyTemplate');
+const PbKeyset = goog.require('proto.google.crypto.tink.Keyset');
+const PrimitiveSet = goog.require('tink.PrimitiveSet');
+const Random = goog.require('tink.subtle.Random');
+const Registry = goog.require('tink.Registry');
+const SecurityException = goog.require('tink.exception.SecurityException');
+const Util = goog.require('tink.Util');
+
+/**
+ * Keyset handle provide abstracted access to Keysets, to limit the exposure of
+ * actual protocol buffers that hold sensitive key material.
+ *
+ * @final
+ */
+class KeysetHandle {
+  /**
+   * @param {!PbKeyset} keyset
+   */
+  constructor(keyset) {
+    Util.validateKeyset(keyset);
+
+    /** @const @private {!PbKeyset} */
+    this.keyset_ = keyset;
+  }
+
+  /**
+   * Creates a KeysetHandle from an encrypted keyset obtained via reader, using
+   * masterKeyAead to decrypt the keyset.
+   *
+   * @param {!KeysetReader} reader
+   * @param {!Aead} masterKeyAead
+   *
+   * @return {!Promise<!KeysetHandle>}
+   */
+  static async read(reader, masterKeyAead) {
+    // TODO implement
+    throw new SecurityException('KeysetHandle -- read: Not implemented yet.');
+  }
+
+  /**
+   * Creates a KeysetHandle from a keyset, obtained via reader, which
+   * must contain no secret key material.
+   *
+   * This can be used to load public keysets or envelope encryption keysets.
+   * Users that need to load cleartext keysets can use CleartextKeysetHandle.
+   *
+   * @param {!KeysetReader} reader
+   * @return {!KeysetHandle}
+   */
+  static readNoSecret(reader) {
+    if (reader === null) {
+      throw new SecurityException('Reader has to be non-null.');
+    }
+    const keyset = reader.read();
+    const keyList = keyset.getKeyList();
+    for (let key of keyList) {
+      switch (key.getKeyData().getKeyMaterialType()) {
+        case PbKeyMaterialType.ASYMMETRIC_PUBLIC:  // fall through
+        case PbKeyMaterialType.REMOTE:
+          continue;
+      }
+      throw new SecurityException('Keyset contains secret key material.');
+    }
+    return new KeysetHandle(keyset);
+  }
+
+  /**
+   * Returns a new KeysetHandle that contains a single new key generated
+   * according to keyTemplate.
+   *
+   * @param {!PbKeyTemplate} keyTemplate
+   *
+   * @return {!Promise<!KeysetHandle>}
+   */
+  static async generateNew(keyTemplate) {
+    // TODO(thaidn): move this to a key manager.
+    const keyset = await KeysetHandle.generateNewKeyset_(keyTemplate);
+    return new KeysetHandle(keyset);
+  }
+
+  /**
+   * Generates a new Keyset that contains a single new key generated
+   * according to keyTemplate.
+   *
+   * @param {!PbKeyTemplate} keyTemplate
+   * @private
+   * @return {!Promise<!PbKeyset>}
+   */
+  static async generateNewKeyset_(keyTemplate) {
+    const key = new PbKeyset.Key()
+                    .setStatus(PbKeyStatusType.ENABLED)
+                    .setOutputPrefixType(keyTemplate.getOutputPrefixType());
+    const keyId = KeysetHandle.generateNewKeyId_();
+    key.setKeyId(keyId);
+    const keyData = await Registry.newKeyData(keyTemplate);
+    key.setKeyData(keyData);
+    const keyset = new PbKeyset();
+    keyset.addKey(key);
+    keyset.setPrimaryKeyId(keyId);
+    return keyset;
+  }
+
+  /**
+   * Generates a new random key ID.
+   *
+   * @private
+   * @return {number} The key ID.
+   */
+  static generateNewKeyId_() {
+    const bytes = Random.randBytes(4);
+    let value = 0;
+    for (let i = 0; i < bytes.length; i++) {
+      value += (bytes[i] & 0xFF) << (i * 8);
+    }
+    // Make sure the key ID is a positive integer smaller than 2^32.
+    return Math.abs(value) % 2 ** 32;
+  };
+
+
+  /**
+   * Returns a primitive that uses key material from this keyset handle. If
+   * opt_customKeyManager is defined then the provided key manager is used to
+   * instantiate primitives. Otherwise key manager from Registry is used.
+   *
+   * @template P
+   *
+   * @param {!Object} primitiveType
+   * @param {?KeyManager.KeyManager<P>=} opt_customKeyManager
+   *
+   * @return {!Promise<!P>}
+   */
+  async getPrimitive(primitiveType, opt_customKeyManager) {
+    if (!primitiveType) {
+      throw new InvalidArgumentsException('primitive type must be non-null');
+    }
+    const primitiveSet =
+        await this.getPrimitiveSet_(primitiveType, opt_customKeyManager);
+    return Registry.wrap(primitiveSet);
+  }
+
+  /**
+   * Creates a set of primitives corresponding to the keys with status Enabled
+   * in the given keysetHandle, assuming all the correspoding key managers are
+   * present (keys with status different from Enabled are skipped). If provided
+   * uses customKeyManager instead of registered key managers for keys supported
+   * by the customKeyManager.
+   *
+   * @template P
+   * @private
+   *
+   * @param {!Object} primitiveType
+   * @param {?KeyManager.KeyManager<P>=} opt_customKeyManager
+   *
+   * @return {!Promise.<!PrimitiveSet.PrimitiveSet<P>>}
+   */
+  async getPrimitiveSet_(primitiveType, opt_customKeyManager) {
+    const primitiveSet = new PrimitiveSet.PrimitiveSet(primitiveType);
+    const keys = this.keyset_.getKeyList();
+    const keysLength = keys.length;
+    for (let i = 0; i < keysLength; i++) {
+      const key = keys[i];
+      if (key.getStatus() === PbKeyStatusType.ENABLED) {
+        const keyData = key.getKeyData();
+        if (!keyData) {
+          throw new SecurityException('Key data has to be non null.');
+        }
+        let primitive;
+        if (opt_customKeyManager &&
+            opt_customKeyManager.getKeyType() === keyData.getTypeUrl()) {
+          primitive =
+              await opt_customKeyManager.getPrimitive(primitiveType, keyData);
+        } else {
+          primitive = await Registry.getPrimitive(primitiveType, keyData);
+        }
+        const entry = primitiveSet.addPrimitive(primitive, key);
+        if (key.getKeyId() === this.keyset_.getPrimaryKeyId()) {
+          primitiveSet.setPrimary(entry);
+        }
+      }
+    }
+    return primitiveSet;
+  }
+
+
+  /**
+   * Encrypts the underlying keyset with the provided masterKeyAead wnd writes
+   * the resulting encryptedKeyset to the given writer which must be non-null.
+   *
+   * @param {!KeysetWriter} writer
+   * @param {!Aead} masterKeyAead
+   *
+   */
+  async write(writer, masterKeyAead) {
+    // TODO implement
+    throw new SecurityException('KeysetHandle -- write: Not implemented yet.');
+  }
+
+  /**
+   * Returns the keyset held by this KeysetHandle.
+   *
+   * @package
+   * @return {!PbKeyset}
+   */
+  getKeyset() {
+    return this.keyset_;
+  }
+}
+
+goog.exportSymbol('tink.KeysetHandle', KeysetHandle);
+exports = KeysetHandle;
diff --git a/javascript/keyset_handle_test.js b/javascript/keyset_handle_test.js
new file mode 100644
index 0000000..dd9194d
--- /dev/null
+++ b/javascript/keyset_handle_test.js
@@ -0,0 +1,843 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.KeysetHandleTest');
+goog.setTestOnly('tink.KeysetHandleTest');
+
+const Aead = goog.require('tink.Aead');
+const AeadKeyTemplates = goog.require('tink.aead.AeadKeyTemplates');
+const BinaryKeysetReader = goog.require('tink.BinaryKeysetReader');
+const Bytes = goog.require('tink.subtle.Bytes');
+const HybridConfig = goog.require('tink.hybrid.HybridConfig');
+const HybridDecrypt = goog.require('tink.HybridDecrypt');
+const HybridEncrypt = goog.require('tink.HybridEncrypt');
+const KeyManager = goog.require('tink.KeyManager');
+const KeysetHandle = goog.require('tink.KeysetHandle');
+const Mac = goog.require('tink.Mac');
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const PbKeyMaterialType = goog.require('proto.google.crypto.tink.KeyData.KeyMaterialType');
+const PbKeyStatusType = goog.require('proto.google.crypto.tink.KeyStatusType');
+const PbKeyset = goog.require('proto.google.crypto.tink.Keyset');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+const Random = goog.require('tink.subtle.Random');
+const Registry = goog.require('tink.Registry');
+const SecurityException = goog.require('tink.exception.SecurityException');
+const TestCase = goog.require('goog.testing.TestCase');
+const testSuite = goog.require('goog.testing.testSuite');
+const {createKeyset} = goog.require('tink.testUtils');
+
+testSuite({
+  setUp() {
+    // Use a generous promise timeout for running continuously.
+    TestCase.getActiveTestCase().promiseTimeout = 1000 * 1000;  // 1000s
+
+    HybridConfig.register();
+  },
+
+  async tearDown() {
+    await Registry.reset();
+
+    // Reset the promise timeout to default value.
+    TestCase.getActiveTestCase().promiseTimeout = 1000;  // 1s
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for constructor
+  async testConstructorNullKeyset() {
+    try {
+      new KeysetHandle(null);
+    } catch (e) {
+      assertEquals(
+          'CustomError: Keyset should be non null and must contain at least one key.',
+          e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testConstructorKeysetWithEmptyListOfKeys() {
+    const keyset = new PbKeyset().setKeyList([]);
+    try {
+      new KeysetHandle(keyset);
+    } catch (e) {
+      assertEquals(
+          'CustomError: Keyset should be non null and must contain at least one key.',
+          e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testConstructorShouldWork() {
+    const keyset = createKeyset();
+    new KeysetHandle(keyset);
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for getKeyset method
+
+  async testGetKeyset() {
+    const keyset = createKeyset();
+    const keysetHandle = new KeysetHandle(keyset);
+
+    const result = keysetHandle.getKeyset();
+    assertObjectEquals(keyset, result);
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for read method
+  async testRead() {
+    try {
+      await KeysetHandle.read(null, null);
+    } catch (e) {
+      assertEquals(
+          'CustomError: KeysetHandle -- read: Not implemented yet.',
+          e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for generateNew method
+  async testGenerateNew() {
+    const keyTemplate = AeadKeyTemplates.aes128CtrHmacSha256();
+    const keysetHandle = await KeysetHandle.generateNew(keyTemplate);
+    const keyset = keysetHandle.getKeyset();
+    assertEquals(keyset.getKeyList().length, 1);
+
+    const key = keyset.getKeyList()[0];
+    assertEquals(key.getKeyId(), keyset.getPrimaryKeyId());
+    assertEquals(key.getOutputPrefixType(), keyTemplate.getOutputPrefixType());
+    assertEquals(key.getStatus(), PbKeyStatusType.ENABLED);
+
+    const keyData = key.getKeyData();
+    assertEquals(keyData.getTypeUrl(), keyTemplate.getTypeUrl());
+
+    const aead = await keysetHandle.getPrimitive(Aead);
+    const plaintext = Random.randBytes(20);
+    const ciphertext = await aead.encrypt(plaintext);
+    assertObjectEquals(plaintext, await aead.decrypt(ciphertext));
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for write method
+  async testWrite() {
+    const keyset = createKeyset();
+    const keysetHandle = new KeysetHandle(keyset);
+
+    try {
+      await keysetHandle.write(null, null);
+    } catch (e) {
+      assertEquals(
+          'CustomError: KeysetHandle -- write: Not implemented yet.',
+          e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for getPrimitive method
+
+  async testGetPrimitive_nullKPrimitiveType() {
+    const keyset = createKeyset();
+    const keysetHandle = new KeysetHandle(keyset);
+
+    try {
+      await keysetHandle.getPrimitive(null);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: primitive type must be non-null', e.toString());
+    }
+  },
+
+  async testGetPrimitive_Aead() {
+    const keyset = createKeysetAndInitializeRegistry(Aead);
+    const keysetHandle = new KeysetHandle(keyset);
+
+    const aead = await keysetHandle.getPrimitive(Aead);
+
+    // Test the aead primitive returned by getPrimitive method.
+    const plaintext = new Uint8Array([1, 2, 3, 4, 5, 6]);
+    const ciphertext = await aead.encrypt(plaintext);
+    const decryptedText = await aead.decrypt(ciphertext);
+
+    assertObjectEquals(plaintext, decryptedText);
+  },
+
+  async testGetPrimitive_HybridEncrypt() {
+    const keyset = createKeysetAndInitializeRegistry(HybridEncrypt);
+    const keysetHandle = new KeysetHandle(keyset);
+
+    // Test the HybridEncrypt primitive returned by getPrimitive method.
+    const hybridEncrypt = await keysetHandle.getPrimitive(HybridEncrypt);
+    const plaintext = Random.randBytes(10);
+    const ciphertext = await hybridEncrypt.encrypt(plaintext);
+    // DummyHybridEncrypt just appends a ciphertext suffix to the plaintext.
+    // Since the primary key id is 1, the ciphertext prefix should also be 1.
+    assertObjectEquals(
+        Bytes.concat(
+            new Uint8Array([
+              0, 0, 0, 0, 1
+            ]) /* prefix which is 1-byte version + 4-byte primary key id*/,
+            plaintext,
+            new Uint8Array([1]) /* suffix which is 1-byte primary key id */),
+        ciphertext);
+  },
+
+  async testGetPrimitive_HybridDecrypt() {
+    const decryptKeysetHandle =
+        new KeysetHandle(createKeysetAndInitializeRegistry(HybridDecrypt));
+    const hybridDecrypt = await decryptKeysetHandle.getPrimitive(HybridDecrypt);
+
+    const encryptKeysetHandle =
+        new KeysetHandle(createKeysetAndInitializeRegistry(HybridEncrypt));
+    const hybridEncrypt = await encryptKeysetHandle.getPrimitive(HybridEncrypt);
+
+    const plaintext = Random.randBytes(10);
+    const ciphertext = await hybridEncrypt.encrypt(plaintext);
+    const decrypted = await hybridDecrypt.decrypt(ciphertext);
+
+    assertObjectEquals(plaintext, decrypted);
+  },
+
+  async testGetPrimitive_Aead_customKeyManager() {
+    const keyset = new PbKeyset();
+
+    // Add a new key with a new key type associated to custom key manager
+    // to the keyset.
+    const keyTypeUrl = 'new_custom_aead_key_type';
+    const keyId = 0xFFFFFFFF;
+    const key = createKey(
+        keyId, PbOutputPrefixType.TINK, keyTypeUrl,
+        /* enabled = */ true);
+    keyset.addKey(key);
+    keyset.setPrimaryKeyId(keyId);
+    const keysetHandle = new KeysetHandle(keyset);
+
+    // Create a custom key manager.
+    const customKeyManager = new DummyKeyManager(
+        keyTypeUrl, new DummyAead(Random.randBytes(10)), Aead);
+
+    // Encrypt with the primitive returned by customKeyManager.
+    const aead = await keysetHandle.getPrimitive(Aead, customKeyManager);
+    const plaintext = Random.randBytes(20);
+    const ciphertext = await aead.encrypt(plaintext);
+
+    // Register another key manager with the custom key type.
+    const managerInRegistry = new DummyKeyManager(
+        keyTypeUrl, new DummyAead(Random.randBytes(10)), Aead);
+    Registry.registerKeyManager(managerInRegistry);
+
+    // Check that the primitive returned by getPrimitive cannot decrypt the
+    // ciphertext. This is because managerInRegistry is different from
+    // customKeyManager.
+    const aeadFromRegistry = await keysetHandle.getPrimitive(Aead);
+    try {
+      await aeadFromRegistry.decrypt(ciphertext);
+      fail('An exception should be thrown here.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: Decryption failed for the given ciphertext.',
+          e.toString());
+    }
+
+    // Check that the primitive returned by getPrimitive with customKeyManager
+    // decrypts correctly.
+    const aeadFromCustomKeyManager =
+        await keysetHandle.getPrimitive(Aead, customKeyManager);
+    const decryptedText = await aeadFromCustomKeyManager.decrypt(ciphertext);
+    assertObjectEquals(plaintext, decryptedText);
+  },
+
+  async testGetPrimitive_HybridEncrypt_customKeyManager() {
+    const keyset = new PbKeyset();
+
+    // Add a new key with a new key type associated to custom key manager
+    // to the keyset.
+    const keyTypeUrl = 'new_custom_hybrid_encrypt_key_type';
+    const keyId = 0xFFFFFFFF;
+    const key = createKey(
+        keyId, PbOutputPrefixType.TINK, keyTypeUrl,
+        /* enabled = */ true);
+    keyset.addKey(key);
+    keyset.setPrimaryKeyId(keyId);
+    const keysetHandle = new KeysetHandle(keyset);
+
+    // Create a custom key manager.
+    const customKeyManager = new DummyKeyManager(
+        keyTypeUrl, new DummyHybridEncrypt(Random.randBytes(10)),
+        HybridEncrypt);
+
+    // Encrypt with the primitive returned by customKeyManager.
+    const customHybridEncrypt =
+        await keysetHandle.getPrimitive(HybridEncrypt, customKeyManager);
+    const plaintext = Random.randBytes(20);
+    const ciphertext = await customHybridEncrypt.encrypt(plaintext);
+
+    // Register another key manager with the custom key type.
+    const managerInRegistry = new DummyKeyManager(
+        keyTypeUrl, new DummyHybridEncrypt(Random.randBytes(10)),
+        HybridEncrypt);
+    Registry.registerKeyManager(managerInRegistry);
+
+    // Check that the primitive returned by getPrimitive is not the same as
+    // customHybridEncrypt. This is because managerInRegistry is different from
+    // customKeyManager.
+    const hybridFromRegistry = await keysetHandle.getPrimitive(HybridEncrypt);
+    const ciphertext2 = await hybridFromRegistry.encrypt(plaintext);
+    assertObjectNotEquals(ciphertext, ciphertext2);
+
+    // Check that the primitive returned by getPrimitive with customKeyManager
+    // is the same as customHybridEncrypt.
+    const hybridEncryptFromCustomKeyManager =
+        await keysetHandle.getPrimitive(HybridEncrypt, customKeyManager);
+    const ciphertext3 =
+        await hybridEncryptFromCustomKeyManager.encrypt(plaintext);
+    assertObjectEquals(ciphertext, ciphertext3);
+  },
+
+  async testGetPrimitive_HybridDecrypt_customKeyManager() {
+    // Both private and public keys have the same key id.
+    const keyId = 0xFFFFFFFF;
+
+    // Create a public keyset.
+
+    const publicKeyset = new PbKeyset();
+    // Add a new key with a new key type associated to custom key manager
+    // to the keyset.
+    const publicKeyTypeUrl = 'new_custom_hybrid_encrypt_key_type';
+    const publicKey = createKey(
+        keyId, PbOutputPrefixType.TINK, publicKeyTypeUrl,
+        /* enabled = */ true);
+    publicKeyset.addKey(publicKey);
+    publicKeyset.setPrimaryKeyId(keyId);
+    const publicKeysetHandle = new KeysetHandle(publicKeyset);
+
+    // Create a corresponding private keyset.
+
+    const privateKeyset = new PbKeyset();
+    // Add a new key with a new key type associated to custom key manager
+    // to the keyset.
+    const privateKeyTypeUrl = 'new_custom_hybrid_decrypt_key_type';
+    const privateKey = createKey(
+        keyId, PbOutputPrefixType.TINK, privateKeyTypeUrl,
+        /* enabled = */ true);
+    privateKeyset.addKey(privateKey);
+    privateKeyset.setPrimaryKeyId(keyId);
+    const privateKeysetHandle = new KeysetHandle(privateKeyset);
+
+    // DummyHybridEncrypt (and DummyHybridDecrypt) just appends (and removes)
+    // a suffix to the plaintext. Create a random suffix that allows to
+    // determine which HybridDecrypt object is valid.
+    const ciphertextSuffix = Random.randBytes(10);
+
+    // Register a public key manager that uses the legit ciphertext suffix.
+    const publicKeyManagerInRegistry = new DummyKeyManager(
+        publicKeyTypeUrl, new DummyHybridEncrypt(ciphertextSuffix),
+        HybridEncrypt);
+    Registry.registerKeyManager(publicKeyManagerInRegistry);
+
+    // Encrypt with the primitive returned by getPrimitive.
+    const hybridEncrypt = await publicKeysetHandle.getPrimitive(HybridEncrypt);
+    const plaintext = Random.randBytes(20);
+    const ciphertext = await hybridEncrypt.encrypt(plaintext);
+
+    // Register a private key manager that uses a random ciphertext suffix.
+    const keyManagerWithRandomSuffix = new DummyKeyManager(
+        privateKeyTypeUrl, new DummyHybridDecrypt(Random.randBytes(10)),
+        HybridDecrypt);
+    Registry.registerKeyManager(keyManagerWithRandomSuffix);
+
+    // Check that the primitive returned by getPrimitive cannot decrypt. This is
+    // because the ciphertext suffix is different.
+    const hybridDecryptFromRegistry =
+        await privateKeysetHandle.getPrimitive(HybridDecrypt);
+    try {
+      await hybridDecryptFromRegistry.decrypt(ciphertext);
+      fail('An exception should be thrown here.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: Decryption failed for the given ciphertext.',
+          e.toString());
+    }
+
+    // Create a custom private key manager with the correct ciphertext suffix.
+    const customHybridDecryptKeyManager = new DummyKeyManager(
+        privateKeyTypeUrl, new DummyHybridDecrypt(ciphertextSuffix),
+        HybridDecrypt);
+
+    // Check that the primitive returned by getPrimitive with
+    // customHybridDecryptKeyManager can decrypt.
+    const customHybridDecrypt = await privateKeysetHandle.getPrimitive(
+        HybridDecrypt, customHybridDecryptKeyManager);
+    const decrypted = await customHybridDecrypt.decrypt(ciphertext);
+    assertObjectEquals(plaintext, decrypted);
+  },
+
+  async testGetPrimitive_keysetContainsKeyCorrespondingToDifferentPrimitive() {
+    const keyset = createKeysetAndInitializeRegistry(Aead);
+
+    // Add new key with new key type url to the keyset and register a key
+    // manager providing Mac primitives with this key.
+    const macKeyTypeUrl = 'mac_key_type_1';
+    const macKeyId = 0xFFFFFFFF;
+    const macKey = createKey(
+        macKeyId, PbOutputPrefixType.TINK, macKeyTypeUrl, /* enabled = */ true);
+    keyset.addKey(macKey);
+    const primitive = new DummyAead(new Uint8Array([0xFF]));
+    Registry.registerKeyManager(
+        new DummyKeyManager(macKeyTypeUrl, primitive, Mac));
+
+    const keysetHandle = new KeysetHandle(keyset);
+
+    try {
+      await keysetHandle.getPrimitive(Aead);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: Requested primitive type which is not supported by ' +
+              'this key manager.',
+          e.toString());
+    }
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for getPrimitiveSet_ method
+
+  async testGetPrimitiveSet_primaryKeyIsTheEnabledKeyWithGivenId() {
+    const id = 1;
+    const primaryUrl = 'key_type_url_for_primary_key';
+    const disabledUrl = 'key_type_url_for_disabled_key';
+
+    const keyset = new PbKeyset();
+    keyset.addKey(createKey(
+        id, PbOutputPrefixType.TINK, disabledUrl, /* enabled = */ false));
+    keyset.addKey(createKey(
+        id, PbOutputPrefixType.LEGACY, disabledUrl, /* enabled = */ false));
+    keyset.addKey(createKey(
+        id, PbOutputPrefixType.RAW, disabledUrl, /* enabled = */ false));
+    keyset.addKey(createKey(
+        id, PbOutputPrefixType.TINK, primaryUrl, /* enabled = */ true));
+    keyset.setPrimaryKeyId(id);
+
+    const keysetHandle = new KeysetHandle(keyset);
+
+    Registry.registerKeyManager(
+        new DummyKeyManager(primaryUrl, primaryUrl + 'primitive', Aead));
+    Registry.registerKeyManager(
+        new DummyKeyManager(disabledUrl, disabledUrl + 'primitive', Aead));
+
+    const primitiveSet = await keysetHandle.getPrimitiveSet_(Aead);
+    const primary = primitiveSet.getPrimary();
+
+    // Result of getPrimitive is string which is the same as typeUrl +
+    // 'primitive'.
+    assertEquals(primaryUrl + 'primitive', primary.getPrimitive());
+  },
+
+  async testGetPrimitiveSet_disabledKeysShouldBeIgnored() {
+    const enabledRawKeysCount = 10;
+    const enabledUrl = 'enabled_key_type_url';
+    const disabledUrl = 'disabled_key_type_url';
+
+    // Create keyset with both enabled and disabled RAW keys.
+    const keyset = new PbKeyset();
+    // Add RAW keys with different ids from [1, ENABLED_RAW_KEYS_COUNT].
+    for (let i = 0; i < enabledRawKeysCount; i++) {
+      keyset.addKey(createKey(
+          1 + i, PbOutputPrefixType.RAW, enabledUrl, /* enabled = */ true));
+      keyset.addKey(createKey(
+          1 + i, PbOutputPrefixType.RAW, disabledUrl, /* enabled = */ false));
+    }
+    keyset.setPrimaryKeyId(1);
+    const keysetHandle = new KeysetHandle(keyset);
+
+    // Register KeyManager (the key manager for enabled keys should be enough).
+    Registry.registerKeyManager(
+        new DummyKeyManager(enabledUrl, enabledUrl + 'primitive', Aead));
+
+    // Get primitives and get all raw primitives.
+    const primitiveSet = await keysetHandle.getPrimitiveSet_(Aead);
+    const rawPrimitives = primitiveSet.getRawPrimitives();
+
+    // Should return all enabled RAW primitives and nothing else (disabled
+    // primitives should not be added into primitive set).
+    assertEquals(enabledRawKeysCount, rawPrimitives.length);
+
+    // Test that it returns the correct RAW primitives by using getPrimitive
+    // which is set to the string same as typeUrl + 'primitive'.
+    for (let i = 0; i < enabledRawKeysCount; ++i) {
+      assertEquals(enabledUrl + 'primitive', rawPrimitives[i].getPrimitive());
+    }
+  },
+
+  async testGetPrimitiveSet_withCustomKeyManager() {
+    // Create keyset handle.
+    const keyTypeUrl = 'some_key_type_url';
+    const keyId = 1;
+    const key = createKey(
+        keyId, PbOutputPrefixType.TINK, keyTypeUrl, true /* enabled */);
+
+    const keyset = new PbKeyset();
+    keyset.addKey(key);
+    keyset.setPrimaryKeyId(keyId);
+
+    const keysetHandle = new KeysetHandle(keyset);
+
+    // Register key manager for the given keyType.
+    Registry.registerKeyManager(
+        new DummyKeyManager(keyTypeUrl, keyTypeUrl + 'primitive', Aead));
+
+    // Use getPrimitives with custom key manager for the keyType.
+    const customPrimitive = 'type_url_corresponding_to_custom_key_manager';
+    const customKeyManager =
+        new DummyKeyManager(keyTypeUrl, customPrimitive, Aead);
+    const primitiveSet =
+        await keysetHandle.getPrimitiveSet_(Aead, customKeyManager);
+
+    // Primary should be the entry corresponding to the keyTypeUrl and thus
+    // getPrimitive should return customPrimitive.
+    const primary = primitiveSet.getPrimary();
+    assertEquals(customPrimitive, primary.getPrimitive());
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for readNoSecret method
+
+  testReadNoSecret_keysetContainingSecretKeyMaterial() {
+    const secretKeyMaterialTypes = [
+      PbKeyMaterialType.SYMMETRIC, PbKeyMaterialType.ASYMMETRIC_PRIVATE,
+      PbKeyMaterialType.UNKNOWN_KEYMATERIAL
+    ];
+    for (let secretKeyMaterialType of secretKeyMaterialTypes) {
+      // Create a public keyset.
+      const keyset = new PbKeyset();
+      for (let i = 0; i < 3; i++) {
+        const key = createKey(
+            /* keyId = */ i + 1,
+            /* outputPrefix = */ PbOutputPrefixType.TINK,
+            /* keyTypeUrl = */ 'someType',
+            /* enabled = */ (i % 4) < 2,
+            /* opt_keyMaterialType */ PbKeyMaterialType.ASYMMETRIC_PUBLIC);
+        keyset.addKey(key);
+      }
+      keyset.setPrimaryKeyId(1);
+      const key = createKey(
+          /* keyId = */ 0xFFFFFFFF,
+          /* outputPrefix = */ PbOutputPrefixType.RAW,
+          /* keyTypeUrl = */ 'someType',
+          /* enabled = */ true,
+          /* opt_keyMaterialType = */ secretKeyMaterialType);
+      keyset.addKey(key);
+      const reader =
+          BinaryKeysetReader.withUint8Array(keyset.serializeBinary());
+      try {
+        KeysetHandle.readNoSecret(reader);
+        fail('An exception should be thrown.');
+      } catch (e) {
+        assertEquals(
+            'CustomError: Keyset contains secret key material.', e.toString());
+      }
+    }
+  },
+
+  testReadNoSecret_shouldWork() {
+    // Create a public keyset.
+    const keyset = new PbKeyset();
+    for (let i = 0; i < 3; i++) {
+      const key = createKey(
+          /* keyId = */ i + 1,
+          /* outputPrefix = */ PbOutputPrefixType.TINK,
+          /* keyTypeUrl = */ 'someType',
+          /* enabled = */ (i % 4) < 2,
+          /* opt_keyMaterialType = */ PbKeyMaterialType.ASYMMETRIC_PUBLIC);
+      keyset.addKey(key);
+    }
+    keyset.setPrimaryKeyId(1);
+
+    const reader = BinaryKeysetReader.withUint8Array(keyset.serializeBinary());
+    const keysetHandle = KeysetHandle.readNoSecret(reader);
+
+    assertObjectEquals(keyset, keysetHandle.getKeyset());
+  },
+});
+
+/**
+ * Function for creating keys for testing purposes.
+ *
+ * @param {number} keyId
+ * @param {!PbOutputPrefixType} outputPrefix
+ * @param {string} keyTypeUrl
+ * @param {boolean} enabled
+ * @param {?PbKeyMaterialType=} opt_keyMaterialType (default: SYMMETRIC)
+ *
+ * @return {!PbKeyset.Key}
+ */
+const createKey = function(
+    keyId, outputPrefix, keyTypeUrl, enabled,
+    opt_keyMaterialType = PbKeyMaterialType.SYMMETRIC) {
+  let key = new PbKeyset.Key();
+
+  if (enabled) {
+    key.setStatus(PbKeyStatusType.ENABLED);
+  } else {
+    key.setStatus(PbKeyStatusType.DISABLED);
+  }
+
+  key.setOutputPrefixType(outputPrefix);
+  key.setKeyId(keyId);
+
+  const keyData = new PbKeyData()
+                      .setTypeUrl(keyTypeUrl)
+                      .setValue(new Uint8Array([1]))
+                      .setKeyMaterialType(opt_keyMaterialType);
+  key.setKeyData(keyData);
+
+  return key;
+};
+
+/**
+ * Function for creating keysets for testing purposes.
+ * Primary has id 1.
+ *
+ * The function also register DummyKeyManager providing primitives for each
+ * keyType added to the Keyset.
+ *
+ * @param {!Object} primitiveType
+ * @param {?number=} opt_numberOfKeys
+ *
+ * @return {!PbKeyset}
+ */
+const createKeysetAndInitializeRegistry = function(
+    primitiveType, opt_numberOfKeys = 15) {
+  const numberOfKeyTypes = 5;
+  const keyTypePrefix = 'key_type_';
+
+  for (let i = 0; i < numberOfKeyTypes; i++) {
+    const typeUrl = keyTypePrefix + i.toString();
+    let primitive;
+    switch (primitiveType) {
+      case HybridDecrypt:
+        primitive = new DummyHybridDecrypt(new Uint8Array([i]));
+        break;
+      case HybridEncrypt:
+        primitive = new DummyHybridEncrypt(new Uint8Array([i]));
+        break;
+      default:
+        primitive = new DummyAead(new Uint8Array([i]));
+        break;
+    }
+    Registry.registerKeyManager(
+        new DummyKeyManager(typeUrl, primitive, primitiveType));
+  }
+
+  const keyset = new PbKeyset();
+
+  for (let i = 1; i < opt_numberOfKeys; i++) {
+    const keyType = keyTypePrefix + (i % numberOfKeyTypes).toString();
+    let /** @type{!PbOutputPrefixType} */ outputPrefix;
+    switch (i % 3) {
+      case 0:
+        outputPrefix = PbOutputPrefixType.TINK;
+        break;
+      case 1:
+        outputPrefix = PbOutputPrefixType.LEGACY;
+        break;
+      default:
+        outputPrefix = PbOutputPrefixType.RAW;
+    }
+    // There are no primitives added to PrimitiveSet for disabled keys, thus
+    // they are quite rarely added into the Keyset.
+    const key = createKey(i, outputPrefix, keyType, /* enabled = */ i % 7 < 6);
+    keyset.addKey(key);
+
+    keyset.setPrimaryKeyId(1);
+    return keyset;
+  }
+};
+
+/**
+ * @implements {Aead}
+ * @final
+ */
+class DummyAead {
+  /**
+   * @param {!Uint8Array} ciphertextSuffix
+   */
+  constructor(ciphertextSuffix) {
+    /** @private @const {!Uint8Array} */
+    this.ciphertextSuffix_ = ciphertextSuffix;
+  }
+
+  /** @override*/
+  // Encrypt method just append the primitive identifier to plaintext.
+  async encrypt(plaintext, opt_associatedData) {
+    const result =
+        new Uint8Array(plaintext.length + this.ciphertextSuffix_.length);
+    result.set(plaintext, 0);
+    result.set(this.ciphertextSuffix_, plaintext.length);
+    return result;
+  }
+
+  /** @override*/
+  // Decrypt method throws an exception whenever ciphertext does not end with
+  // ciphertext suffix, otherwise it returns the first part (without
+  // ciphertext suffix).
+  async decrypt(ciphertext, opt_associatedData) {
+    const plaintext = ciphertext.subarray(
+        0, ciphertext.length - this.ciphertextSuffix_.length);
+    const ciphertextSuffix = ciphertext.subarray(
+        ciphertext.length - this.ciphertextSuffix_.length, ciphertext.length);
+
+    if ([...ciphertextSuffix].toString() !=
+        [...this.ciphertextSuffix_].toString()) {
+      throw new SecurityException('Ciphertext decryption failed.');
+    }
+
+    return plaintext;
+  }
+}
+
+/**
+ * @implements {HybridEncrypt}
+ * @final
+ */
+class DummyHybridEncrypt {
+  /** @param {!Uint8Array} ciphertextSuffix */
+  constructor(ciphertextSuffix) {
+    /** @const @private {!Uint8Array} */
+    this.ciphertextSuffix_ = ciphertextSuffix;
+  }
+  // Async is used here just because real primitives returns Promise.
+  /** @override*/
+  async encrypt(plaintext, opt_associatedData) {
+    return Bytes.concat(plaintext, this.ciphertextSuffix_);
+  }
+}
+
+/**
+ * @implements {HybridDecrypt}
+ * @final
+ */
+class DummyHybridDecrypt {
+  /** @param {!Uint8Array} ciphertextSuffix */
+  constructor(ciphertextSuffix) {
+    /** @const @private {!Uint8Array} */
+    this.ciphertextSuffix_ = ciphertextSuffix;
+  }
+  /** @override*/
+  async decrypt(ciphertext, opt_associatedData) {
+    const cipherLen = ciphertext.length;
+    const suffixLen = this.ciphertextSuffix_.length;
+    const plaintext = ciphertext.subarray(0, cipherLen - suffixLen);
+    const suffix = ciphertext.subarray(cipherLen - suffixLen, cipherLen);
+
+    if (!Bytes.isEqual(this.ciphertextSuffix_, suffix)) {
+      throw new SecurityException('Ciphertext decryption failed.');
+    }
+    return plaintext;
+  }
+}
+
+// Key factory and key manager classes used in tests.
+/**
+ * @final
+ * @implements {KeyManager.KeyFactory}
+ */
+class DummyKeyFactory {
+  /**
+   * @override
+   */
+  newKey(keyFormat) {
+    throw new SecurityException('Not implemented, function is not needed.');
+  }
+
+  /**
+   * @override
+   */
+  newKeyData(serializedKeyFormat) {
+    throw new SecurityException('Not implemented, function is not needed.');
+  }
+}
+
+/**
+ * @final
+ * @implements {KeyManager.KeyManager<!Object>}
+ */
+class DummyKeyManager {
+  /**
+   * @param {string} keyType
+   * @param {!Object} primitive
+   * @param {!Object} primitiveType
+   */
+  constructor(keyType, primitive, primitiveType) {
+    /**
+     * @private @const {string}
+     */
+    this.KEY_TYPE_ = keyType;
+
+    /**
+     * @private @const {!Object}
+     */
+    this.PRIMITIVE_ = primitive;
+
+    /**
+     * @private @const {!KeyManager.KeyFactory}
+     */
+    this.KEY_FACTORY_ = new DummyKeyFactory();
+
+    /**
+     * @private @const {!Object}
+     */
+    this.PRIMITIVE_TYPE_ = primitiveType;
+  }
+
+  /** @override */
+  async getPrimitive(primitiveType, key) {
+    if (primitiveType != this.getPrimitiveType()) {
+      throw new SecurityException(
+          'Requested primitive type which is not ' +
+          'supported by this key manager.');
+    }
+    return this.PRIMITIVE_;
+  }
+
+  /** @override */
+  doesSupport(keyType) {
+    return keyType === this.getKeyType();
+  }
+
+  /** @override */
+  getKeyType() {
+    return this.KEY_TYPE_;
+  }
+
+  /** @override */
+  getPrimitiveType() {
+    return this.PRIMITIVE_TYPE_;
+  }
+
+  /** @override */
+  getVersion() {
+    throw new SecurityException('Not implemented, function is not needed.');
+  }
+
+  /** @override */
+  getKeyFactory() {
+    throw new SecurityException('Not implemented, function is not needed.');
+  }
+}
diff --git a/javascript/keyset_reader.js b/javascript/keyset_reader.js
new file mode 100644
index 0000000..e48f01e
--- /dev/null
+++ b/javascript/keyset_reader.js
@@ -0,0 +1,43 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.KeysetReader');
+
+const PbEncryptedKeyset = goog.require('proto.google.crypto.tink.EncryptedKeyset');
+const PbKeyset = goog.require('proto.google.crypto.tink.Keyset');
+
+/**
+ * KeysetReader knows how to read a keyset or an encrypted keyset from some
+ * source.
+ *
+ * @record
+ */
+class KeysetReader {
+  /**
+   * Reads and returns a (cleartext) Keyset object from the underlying source.
+   *
+   * @return {!PbKeyset}
+   */
+  read() {}
+
+  /**
+   * Reads and returns an EncryptedKeyset from the underlying source.
+   *
+   * @return {!PbEncryptedKeyset}
+   */
+  readEncrypted() {}
+}
+
+goog.exportSymbol('tink.KeysetReader', KeysetReader);
+exports = KeysetReader;
diff --git a/javascript/keyset_writer.js b/javascript/keyset_writer.js
new file mode 100644
index 0000000..416064a
--- /dev/null
+++ b/javascript/keyset_writer.js
@@ -0,0 +1,35 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.KeysetWriter');
+
+const PbEncryptedKeyset = goog.require('proto.google.crypto.tink.EncryptedKeyset');
+const PbKeyset = goog.require('proto.google.crypto.tink.Keyset');
+
+/**
+ * KeysetWriter knows how to write a keyset or an encrypted keyset to some
+ * storage system.
+ *
+ * @record
+ */
+class KeysetWriter {
+  /**
+   * @param {!PbKeyset|!PbEncryptedKeyset} keyset
+   * @return {!Uint8Array}
+   */
+  write(keyset) {}
+}
+
+goog.exportSymbol('tink.KeysetWriter', KeysetWriter);
+exports = KeysetWriter;
diff --git a/javascript/mac.js b/javascript/mac.js
new file mode 100644
index 0000000..771c73b
--- /dev/null
+++ b/javascript/mac.js
@@ -0,0 +1,48 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.Mac');
+
+/**
+ * Interface for Message Authentication Codes (MAC).
+ *
+ * Security guarantees: Message Authentication Codes provide symmetric message
+ * authentication. Instances implementing this interface are secure against
+ * existential forgery under chosen plaintext attack, and can be deterministic
+ * or randomized. This interface should be used for authentication only, and not
+ * for other purposes like generation of pseudorandom bytes.
+ *
+ * @record
+ */
+class Mac {
+  /**
+   * Computes message authentication code (MAC) for `data`.
+   *
+   * @param {!Uint8Array} data the data to compute MAC
+   * @return {!Promise.<!Uint8Array>} the MAC tag
+   */
+  computeMac(data) {}
+
+  /**
+   * Verifies whether `tag` is a correct authentication code for `data`.
+   *
+   * @param {!Uint8Array} tag  the MAC tag
+   * @param {!Uint8Array} data the data to compute MAC
+   * @return {!Promise.<boolean>}
+   */
+  verifyMac(tag, data) {}
+}
+
+goog.exportSymbol('tink.Mac', Mac);
+exports = Mac;
diff --git a/javascript/primitive_set.js b/javascript/primitive_set.js
new file mode 100644
index 0000000..51d6fd9
--- /dev/null
+++ b/javascript/primitive_set.js
@@ -0,0 +1,262 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.PrimitiveSet');
+
+const CryptoFormat = goog.require('tink.CryptoFormat');
+const PbKeyStatusType = goog.require('proto.google.crypto.tink.KeyStatusType');
+const PbKeyset = goog.require('proto.google.crypto.tink.Keyset');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+const SecurityException = goog.require('tink.exception.SecurityException');
+
+/**
+ * Auxiliary class for PrimitiveSet
+ * Entry-objects hold individual instances of primitives in the set.
+ *
+ * @template P
+ * @final
+ */
+class Entry {
+  /**
+   * @param {!P} primitive
+   * @param {!Uint8Array} identifier
+   * @param {!PbKeyStatusType} keyStatus
+   * @param {!PbOutputPrefixType} outputPrefixType
+   */
+  constructor(primitive, identifier, keyStatus, outputPrefixType) {
+    /** @const @private {!P} */
+    this.primitive_ = primitive;
+    /** @const @private {!Uint8Array} */
+    this.identifier_ = identifier;
+    /** @const @private {!PbKeyStatusType} */
+    this.status_ = keyStatus;
+    /** @const @private {!PbOutputPrefixType} */
+    this.outputPrefixType_ = outputPrefixType;
+  }
+
+  /**
+   * @return {!P}
+   */
+  getPrimitive() {
+    return this.primitive_;
+  }
+
+  /**
+   * @return {!Uint8Array}
+   */
+  getIdentifier() {
+    return this.identifier_;
+  }
+
+  /**
+   * @return {!PbKeyStatusType}
+   */
+  getKeyStatus() {
+    return this.status_;
+  }
+
+  /**
+   * @return {!PbOutputPrefixType}
+   */
+  getOutputPrefixType() {
+    return this.outputPrefixType_;
+  }
+}
+
+/**
+ * A container class for a set of primitives (i.e. implementations of
+ * cryptographic primitives offered by Tink). It provides also additional
+ * properties for the primitives it holds. In particular, one of the primitives
+ * in the set can be distinguished as "the primary" one.
+ *
+ * PrimitiveSet is an auxiliary class used for supporting key rotation:
+ * primitives in a set correspond to keys in a keyset. Users will usually work
+ * with primitive instances which essentially wrap primitive sets. For example
+ * an instance of an Aead-primitive for a given keyset holds a set of
+ * Aead-primitives corresponding to the keys in the keyset, and uses the set
+ * members to do the actual crypto operations: to encrypt data the primary
+ * Aead-primitive from the set is used, and upon decryption the ciphertext's
+ * prefix determines the identifier of the primitive from the set.
+ *
+ * PrimitiveSet is a public class to allow its use in implementations of custom
+ * primitives.
+ *
+ * @template P
+ * @final
+ */
+class PrimitiveSet {
+  /**
+   * @param {!Object} primitiveType
+   */
+  constructor(primitiveType) {
+    /**
+     * @private {!Object}
+     */
+    this.primitiveType_ = primitiveType;
+    /**
+     * @private {?Entry<P>}
+     */
+    this.primary_ = null;
+    // Keys have to be stored as strings as two Uint8Arrays holding the same
+    // digits are still different objects.
+    /**
+     * @private {!Map<string, !Array<!Entry<P>>>}
+     */
+    this.identifierToPrimitivesMap_ = new Map();
+  }
+
+  /**
+   * Returns the type of primitives contained in this set.
+   *
+   * @return {!Object}
+   */
+  getPrimitiveType() {
+    return this.primitiveType_;
+  }
+
+  /**
+   * Creates an entry in the primitive table and returns it.
+   *
+   * @param {!P} primitive
+   * @param {!PbKeyset.Key} key
+   *
+   * @return {!Entry<P>}
+   */
+  addPrimitive(primitive, key) {
+    if (!primitive) {
+      throw new SecurityException('Primitive has to be non null.');
+    }
+    if (!key) {
+      throw new SecurityException('Key has to be non null.');
+    }
+
+    const identifier = CryptoFormat.getOutputPrefix(key);
+    const entry = new Entry(primitive, identifier, key.getStatus(),
+        key.getOutputPrefixType());
+
+    this.addPrimitiveToMap_(entry);
+
+    return entry;
+  }
+
+  /**
+   * Returns the entry with the primary primitive.
+   *
+   * @return {?Entry<P>}
+   */
+  getPrimary() {
+    return this.primary_;
+  }
+
+  /**
+   * Sets given Entry as the primary one.
+   *
+   * @param {!Entry<P>} primitive
+   */
+  setPrimary(primitive) {
+    if (!primitive) {
+      throw new SecurityException('Primary cannot be set to null.');
+    }
+
+    if (primitive.getKeyStatus() != PbKeyStatusType.ENABLED) {
+      throw new SecurityException('Primary has to be enabled.');
+    }
+
+    // There has to be exactly one key enabled with this identifier.
+    const entries = this.getPrimitives(primitive.getIdentifier());
+    let entryFound = false;
+    const entriesLength = entries.length;
+    for (let i = 0; i < entriesLength; i++) {
+      if (entries[i].getKeyStatus() === PbKeyStatusType.ENABLED) {
+        entryFound = true;
+        break;
+      }
+    }
+    if (!entryFound) {
+      throw new SecurityException(
+          'Primary cannot be set to an entry which is ' +
+          'not held by this primitive set.');
+    }
+
+    this.primary_ = primitive;
+  }
+
+  /**
+   * Returns all primitives using RAW prefix.
+   *
+   * @return {!Array<!Entry<P>>}
+   */
+  getRawPrimitives() {
+    return this.getPrimitives(CryptoFormat.RAW_PREFIX);
+  }
+
+  /**
+   * Returns the entries with primitive identified with identifier.
+   *
+   * @param {!Uint8Array} identifier
+   *
+   * @return {!Array<!Entry<P>>}
+   */
+  getPrimitives(identifier) {
+    const result = this.getPrimitivesFromMap_(identifier);
+
+    if (!result) {
+      return [];
+    } else {
+      return result;
+    }
+  }
+
+  /**
+   * Returns a set of primitives which corresponds to the given identifier.
+   *
+   * @private
+   * @param {!Uint8Array|string} identifier
+   *
+   * @return {!Array<!Entry<P>>|undefined}
+   */
+  getPrimitivesFromMap_(identifier) {
+    if (identifier instanceof Uint8Array) {
+      identifier = [...identifier].toString();
+    }
+    return this.identifierToPrimitivesMap_.get(identifier);
+  }
+
+  /**
+   * Add primitive to map.
+   *
+   * @private
+   * @param {!Entry<P>} entry
+   */
+  addPrimitiveToMap_(entry) {
+    const identifier = entry.getIdentifier();
+    const id = [...identifier].toString();
+
+    let existing = this.getPrimitivesFromMap_(id);
+
+    if (!existing) {
+      this.identifierToPrimitivesMap_.set(id, [entry]);
+    } else {
+      existing.push(entry);
+      this.identifierToPrimitivesMap_.set(id, existing);
+    }
+  }
+}
+
+goog.exportSymbol('tink.Entry', Entry);
+goog.exportSymbol('tink.PrimitiveSet', PrimitiveSet);
+exports = {
+  Entry,
+  PrimitiveSet,
+};
diff --git a/javascript/primitive_set_test.js b/javascript/primitive_set_test.js
new file mode 100644
index 0000000..c22c888
--- /dev/null
+++ b/javascript/primitive_set_test.js
@@ -0,0 +1,432 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.PrimitiveSetTest');
+goog.setTestOnly('tink.PrimitiveSetTest');
+
+const Aead = goog.require('tink.Aead');
+const CryptoFormat = goog.require('tink.CryptoFormat');
+const PbKeyStatusType = goog.require('proto.google.crypto.tink.KeyStatusType');
+const PbKeysetKey = goog.require('proto.google.crypto.tink.Keyset.Key');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+const PrimitiveSet = goog.require('tink.PrimitiveSet');
+const SecurityException = goog.require('tink.exception.SecurityException');
+
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for addPrimitive method
+  testAddPrimitiveUnknownCryptoFormat() {
+    const primitive = new DummyAead1();
+    const key =
+        createKey().setOutputPrefixType(PbOutputPrefixType.UNKNOWN_PREFIX);
+    const primitiveSet = new PrimitiveSet.PrimitiveSet(Aead);
+
+    try {
+      primitiveSet.addPrimitive(primitive, key);
+    } catch (e) {
+      assertEquals(ExceptionText.unknownPrefixType(), e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  testAddPrimitiveNullPrimitive() {
+    const primitive = null;
+    const key = createKey();
+    const primitiveSet = new PrimitiveSet.PrimitiveSet(Aead);
+
+    try {
+      primitiveSet.addPrimitive(primitive, key);
+    } catch (e) {
+      assertEquals(ExceptionText.addingNullPrimitive(), e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  testAddPrimitiveNullKey() {
+    const primitive = new DummyAead1();
+    const primitiveSet = new PrimitiveSet.PrimitiveSet(Aead);
+
+    try {
+      primitiveSet.addPrimitive(primitive, null);
+    } catch (e) {
+      assertEquals(ExceptionText.addingNullKey(), e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  testAddPrimitiveMultipleTimesShouldWork() {
+    const key = createKey();
+    const primitiveSet = new PrimitiveSet.PrimitiveSet(Aead);
+
+    for (let i = 0; i < 4; i++) {
+      let primitive;
+      if (i % 2 === 0) {
+        primitive = new DummyAead1();
+      } else {
+        primitive = new DummyAead2();
+      }
+      const result = primitiveSet.addPrimitive(primitive, key);
+
+      assertObjectEquals(primitive, result.getPrimitive());
+      assertEquals(key.getStatus(), result.getKeyStatus());
+      assertEquals(key.getOutputPrefixType(), result.getOutputPrefixType());
+      assertObjectEquals(
+          CryptoFormat.getOutputPrefix(key), result.getIdentifier());
+    }
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for getPrimitives method
+  testGetPrimitivesWhichWereNotAdded() {
+    // Fill in the structure with some primitives.
+    const numberOfAddedPrimitives = 12;
+    const primitiveSet = initPrimitiveSet(numberOfAddedPrimitives);
+
+    const key = createKey(/* opt_keyId = */ numberOfAddedPrimitives + 1);
+    const identifier = CryptoFormat.getOutputPrefix(key);
+    const result = primitiveSet.getPrimitives(identifier);
+
+    assertObjectEquals([], result);
+  },
+
+  testGetPrimitivesDifferentIdentifiers() {
+    // Fill in the structure with some primitives.
+    const n = 100;
+    const primitiveSet = new PrimitiveSet.PrimitiveSet(Aead);
+
+    let added = [];
+    for (let id = 0; id < n; id++) {
+      const legacyKeyType = ((id % 2) < 1);
+      const enabledKey = ((id % 4) < 2);
+      const key = createKey(id, legacyKeyType, enabledKey);
+
+      let primitive;
+      if  ((id % 8) < 4) {
+        primitive = new DummyAead1();
+      } else {
+        primitive = new DummyAead2();
+      }
+
+      const res = primitiveSet.addPrimitive(primitive, key);
+      added.push({key: key, entry: res});
+    }
+
+    // Test that getPrimitives return correct value for them.
+    const addedLength = added.length;
+    for (let i = 0; i < addedLength; i++) {
+      const identifier = CryptoFormat.getOutputPrefix(added[i].key);
+      // Should return a set containing only one primitive as each added
+      // primitive has different identifier.
+      const expectedResult = [added[i].entry];
+      const result = primitiveSet.getPrimitives(identifier);
+
+      assertObjectEquals(expectedResult, result);
+    }
+  },
+
+  testGetPrimitivesSameIdentifiers() {
+    // Fill in the structure with some primitives.
+    const numberOfAddedPrimitives = 50;
+    const primitiveSet = initPrimitiveSet(numberOfAddedPrimitives);
+
+    // Add a group of primitives with same identifier.
+    const n = 12;
+    const keyId = 0xABCDEF98;
+    const legacyKeyType = false;
+
+    let expectedResult = [];
+    for (let i = 0; i < n; i++) {
+      const enabledKey = ((i % 2) < 1);
+      const key = createKey(keyId, legacyKeyType, enabledKey);
+
+      let primitive;
+      if  ((i % 4) < 2) {
+        primitive = new DummyAead1();
+      } else {
+        primitive = new DummyAead2();
+      }
+
+      const res = primitiveSet.addPrimitive(primitive, key);
+      expectedResult.push(res);
+    }
+
+    const identifier =
+        CryptoFormat.getOutputPrefix(createKey(keyId, legacyKeyType));
+    const result = primitiveSet.getPrimitives(identifier);
+
+    assertObjectEquals(expectedResult, result);
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for getRawPrimitives method
+  testGetRawPrimitives() {
+    const numberOfAddedPrimitives = 20;
+    const primitiveSet = initPrimitiveSet(numberOfAddedPrimitives);
+
+    // No RAW primitives were added.
+    let expectedResult = [];
+    let result = primitiveSet.getRawPrimitives();
+    assertObjectEquals(expectedResult, result);
+
+    // Add RAW primitives and check the result again after each adding.
+    let key = createKey().setOutputPrefixType(PbOutputPrefixType.RAW);
+
+    let addResult = primitiveSet.addPrimitive(new DummyAead1(), key);
+    expectedResult.push(addResult);
+    result = primitiveSet.getRawPrimitives();
+    assertObjectEquals(expectedResult, result);
+
+    key.setStatus(PbKeyStatusType.DISABLED);
+    addResult = primitiveSet.addPrimitive(new DummyAead2(), key);
+    expectedResult.push(addResult);
+    result = primitiveSet.getRawPrimitives();
+    assertObjectEquals(expectedResult, result);
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for setPrimary and getPrimary methods
+  testSetPrimaryToNull() {
+    const primitiveSet = new PrimitiveSet.PrimitiveSet(Aead);
+    try {
+      primitiveSet.setPrimary(null);
+    } catch (e) {
+      assertEquals(ExceptionText.setPrimaryToNull(), e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  testSetPrimaryToNonholdedEntry() {
+    const primitiveSet = new PrimitiveSet.PrimitiveSet(Aead);
+    const entry = new PrimitiveSet.Entry(
+        new DummyAead1(), new Uint8Array(10), PbKeyStatusType.ENABLED,
+        PbOutputPrefixType.TINK);
+
+    try {
+      primitiveSet.setPrimary(entry);
+    } catch (e) {
+      assertEquals(ExceptionText.setPrimaryToMissingEntry(), e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  testSetPrimaryToEntryWithDisabledKeyStatus() {
+    const key = createKey(/* opt_keyId = */ 0x12345678,
+        /* opt_legacy = */ false, /* opt_enabled = */ false);
+    const primitiveSet = new PrimitiveSet.PrimitiveSet(Aead);
+
+    const primary = primitiveSet.addPrimitive(new DummyAead1(), key);
+
+    try {
+      primitiveSet.setPrimary(primary);
+    } catch (e) {
+      assertEquals(ExceptionText.setPrimaryToDisabled(), e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  testSetAndGetPrimary() {
+    const primitiveSet = new PrimitiveSet.PrimitiveSet(Aead);
+    assertEquals(null, primitiveSet.getPrimary());
+
+    const key1 = createKey(/* opt_keyId = */ 0xBBBCCC);
+
+    const result = primitiveSet.addPrimitive(new DummyAead1(), key1);
+    // Check that primary remains unset, set it to newly added and verify that
+    // it was set.
+    assertEquals(null, primitiveSet.getPrimary());
+    primitiveSet.setPrimary(result);
+    assertObjectEquals(result, primitiveSet.getPrimary());
+
+    const key2 = createKey(/* opt_keyId = */ 0xAAABBB);
+    // Add new primitive, check that it does not change primary.
+    const result2 = primitiveSet.addPrimitive(new DummyAead2(), key2);
+    assertObjectEquals(result, primitiveSet.getPrimary());
+
+    // Change the primary and verify the change.
+    primitiveSet.setPrimary(result2);
+    assertObjectEquals(result2, primitiveSet.getPrimary());
+  },
+
+  testSetPrimary_rawPrimitives() {
+    const primitiveSet = new PrimitiveSet.PrimitiveSet(Aead);
+    for (let i = 0; i < 3; i++) {
+      const key = createKey(i).setOutputPrefixType(PbOutputPrefixType.RAW);
+      primitiveSet.addPrimitive(new DummyAead1(), key);
+    }
+    const primaryKey =
+        createKey(255).setOutputPrefixType(PbOutputPrefixType.RAW);
+    const primaryEntry =
+        primitiveSet.addPrimitive(new DummyAead1(), primaryKey);
+    primitiveSet.setPrimary(primaryEntry);
+  },
+
+  testGetPrimaryType() {
+    const primitiveSet = new PrimitiveSet.PrimitiveSet(Aead);
+    assertObjectEquals(Aead, primitiveSet.getPrimitiveType());
+  },
+
+});
+
+// Helper classes and functions used for testing purposes.
+class ExceptionText {
+  /** @return {string} */
+  static unknownPrefixType() {
+    return 'CustomError: Unsupported key prefix type.';
+  }
+
+  /** @return {string} */
+  static addingNullPrimitive() {
+    return 'CustomError: Primitive has to be non null.';
+  }
+
+  /** @return {string} */
+  static addingNullKey() {
+    return 'CustomError: Key has to be non null.';
+  }
+
+  /** @return {string} */
+  static setPrimaryToNull() {
+    return 'CustomError: Primary cannot be set to null.';
+  }
+
+  /** @return {string} */
+  static setPrimaryToMissingEntry() {
+    return 'CustomError: Primary cannot be set to an entry which is ' +
+        'not held by this primitive set.';
+  }
+
+  /** @return {string} */
+  static setPrimaryToDisabled() {
+    return 'CustomError: Primary has to be enabled.';
+  }
+}
+
+/**
+ * @implements {Aead}
+ * @final
+ */
+class DummyAead1 {
+  constructor() {}
+
+  /** @override */
+  encrypt(plaintext, aad) {
+    throw new SecurityException(
+        'Not implemented, intentended just for testing.');
+  }
+
+  /** @override */
+  decrypt(ciphertext, aad) {
+    throw new SecurityException(
+        'Not implemented, intentended just for testing.');
+  }
+}
+
+/**
+ * @implements {Aead}
+ * @final
+ */
+class DummyAead2 {
+  constructor() {}
+
+  /** @override */
+  encrypt(plaintext, aad) {
+    throw new SecurityException(
+        'Not implemented, intentended just for testing.');
+  }
+
+  /** @override */
+  decrypt(ciphertext, aad) {
+    throw new SecurityException(
+        'Not implemented, intentended just for testing.');
+  }
+}
+
+/**
+ * Function for creating primitive sets for testing purposes.
+ * Returns a primitive set containing n values with keyIds from {0, .. , n-1}.
+ * There are different combinations of
+ *    primitive types ({DummyAead1, DummyAead2}),
+ *    key status (enabled, disabled),
+ *    and key types (legacy, tink).
+ *
+ * @param {number} n
+ * @return {!PrimitiveSet.PrimitiveSet}
+ */
+const initPrimitiveSet = function(n) {
+  let primitiveSet = new PrimitiveSet.PrimitiveSet(Aead);
+
+  // Set primary.
+  const primaryKey = createKey(/* opt_id = */ 0, /* opt_legacy = */ false,
+      /* opt_enabled = */ true);
+  const primary = primitiveSet.addPrimitive(new DummyAead1(), primaryKey);
+  primitiveSet.setPrimary(primary);
+
+  // Add n-1 other keys to primitive set.
+  for (let id = 1; id < n; id++) {
+    const legacyKeyType = ((id % 2) < 1);
+    const enabledKey = ((id % 4) < 2);
+    const key = createKey(id, legacyKeyType, enabledKey);
+
+    let primitive;
+    if ((id % 8) < 4) {
+      primitive = new DummyAead1();
+    } else {
+      primitive = new DummyAead2();
+    }
+
+    primitiveSet.addPrimitive(primitive, key);
+  }
+
+  return primitiveSet;
+};
+
+/**
+ * Function for creating keys for testing purposes.
+ * If doesn't set otherwise it generates a key with id 0x12345678, which is
+ * ENABLED and with prefix type TINK.
+ *
+ * @param {number=} opt_keyId
+ * @param {boolean=} opt_legacy
+ * @param {boolean=} opt_enabled
+ *
+ * @return{!PbKeysetKey}
+ */
+const createKey = function(opt_keyId = 0x12345678, opt_legacy = false,
+    opt_enabled = true) {
+  let key = new PbKeysetKey();
+
+  if (opt_enabled) {
+    key.setStatus(PbKeyStatusType.ENABLED);
+  } else {
+    key.setStatus(PbKeyStatusType.DISABLED);
+  }
+
+  if (opt_legacy) {
+    key.setOutputPrefixType(PbOutputPrefixType.LEGACY);
+  } else {
+    key.setOutputPrefixType(PbOutputPrefixType.TINK);
+  }
+
+  key.setKeyId(opt_keyId);
+
+  return key;
+};
diff --git a/javascript/primitive_wrapper.js b/javascript/primitive_wrapper.js
new file mode 100644
index 0000000..b06adda
--- /dev/null
+++ b/javascript/primitive_wrapper.js
@@ -0,0 +1,48 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.PrimitiveWrapper');
+
+const PrimitiveSet = goog.require('tink.PrimitiveSet');
+
+/**
+ * Basic interface for wrapping a primitive.
+ *
+ * A PrimitiveSet can be wrapped by a single primitive in order to fulfil a
+ * cryptographic task. This is done by the PrimitiveWrapper. Whenever a new
+ * primitive type is added to Tink, the user should define a new
+ * PrimitiveWrapper and register it with the Registry.
+ *
+ * @template P
+ * @record
+ */
+class PrimitiveWrapper {
+  /**
+   * Wraps a PrimitiveSet and returns a single instance.
+   *
+   * @param {!PrimitiveSet.PrimitiveSet<P>} primitiveSet
+   * @return {!P}
+   */
+  wrap(primitiveSet) {}
+
+  /**
+   * Returns the type of the managed primitive. Used for internal management.
+   *
+   * @return {!Object}
+   */
+  getPrimitiveType() {}
+}
+
+goog.exportSymbol('tink.PrimitiveWrapper', PrimitiveWrapper);
+exports = PrimitiveWrapper;
diff --git a/javascript/proto_test.js b/javascript/proto_test.js
new file mode 100644
index 0000000..578e0a7
--- /dev/null
+++ b/javascript/proto_test.js
@@ -0,0 +1,26 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.ProtoTest');
+goog.setTestOnly('tink.ProtoTest');
+
+const PbKeyset = goog.require('proto.google.crypto.tink.Keyset');
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+  testField() {
+    const keyset = new PbKeyset().setPrimaryKeyId(1);
+    assertEquals(1, keyset.getPrimaryKeyId());
+  },
+});
diff --git a/javascript/public_key_sign.js b/javascript/public_key_sign.js
new file mode 100644
index 0000000..0ef480c
--- /dev/null
+++ b/javascript/public_key_sign.js
@@ -0,0 +1,39 @@
+// Copyright 2018 Google LLC.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.PublicKeySign');
+
+/**
+ * Interface for creating digital signatures.
+ *
+ * Security guarantees: Implementations of these interfaces are secure
+ * against adaptive chosen-message attacks. Signing data ensures the
+ * authenticity and the integrity of that data, but not its secrecy.
+ *
+ * @record
+ */
+class PublicKeySign {
+  /**
+   * Computes the digital signature of `message`.
+   *
+   * @param {!Uint8Array} message the message to be signed, must be non-null.
+   * @return {!Promise.<!Uint8Array>} resulting digital signature
+   */
+  sign(message) {}
+}
+
+goog.exportSymbol('tink.PublicKeySign', PublicKeySign);
+exports = PublicKeySign;
diff --git a/javascript/public_key_verify.js b/javascript/public_key_verify.js
new file mode 100644
index 0000000..fc8f548
--- /dev/null
+++ b/javascript/public_key_verify.js
@@ -0,0 +1,41 @@
+// Copyright 2018 Google LLC.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.PublicKeyVerify');
+
+/**
+ * Interface for verifying digital signatures.
+ *
+ * Security guarantees: Implementations of these interfaces are secure
+ * against adaptive chosen-message attacks. Signing data ensures the
+ * authenticity and the integrity of that data, but not its secrecy.
+ *
+ * @record
+ */
+class PublicKeyVerify {
+  /**
+   * Verifies the `signature` of `message`.
+   *
+   * @param {!Uint8Array} signature the signature, must be non-null.
+   * @param {!Uint8Array} message the message, must be non-null.
+   * @return {!Promise.<boolean>} true iff the signature is valid, false
+   *     otherwise.
+   */
+  verify(signature, message) {}
+}
+
+goog.exportSymbol('tink.PublicKeyVerify', PublicKeyVerify);
+exports = PublicKeyVerify;
diff --git a/javascript/registry.js b/javascript/registry.js
new file mode 100644
index 0000000..fe92c13
--- /dev/null
+++ b/javascript/registry.js
@@ -0,0 +1,299 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.Registry');
+
+const KeyManager = goog.require('tink.KeyManager');
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const PbKeyTemplate = goog.require('proto.google.crypto.tink.KeyTemplate');
+const PbMessage = goog.require('jspb.Message');
+const PrimitiveSet = goog.require('tink.PrimitiveSet');
+const PrimitiveWrapper = goog.require('tink.PrimitiveWrapper');
+const SecurityException = goog.require('tink.exception.SecurityException');
+
+/**
+ * Registry for KeyManagers.
+ *
+ * Registry maps supported key types to corresponding KeyManager objects (i.e.
+ * the KeyManagers which may instantiate the primitive corresponding to the
+ * given key or generate new key of the given type). Keeping KeyManagers for all
+ * primitives in a single Registry (rather than having a separate keyManager per
+ * primitive) enables modular construction of compound primitives from "simple"
+ * ones (e.g. AES-CTR-HMAC AEAD encryption from IND-CPA encryption and MAC).
+ *
+ * Regular users will not usually work with Registry directly, but via primitive
+ * factories, which query Registry for the specific KeyManagers in the
+ * background.
+ *
+ * @final
+ */
+class Registry {
+  /**
+   * Register the given manager for the given key type. Manager must be
+   * non-nullptr. New keys are allowed if not specified.
+   *
+   * @template P
+   * @static
+   *
+   * @param {!KeyManager.KeyManager<P>} manager
+   * @param {boolean=} opt_newKeyAllowed
+   */
+  static registerKeyManager(manager, opt_newKeyAllowed) {
+    if (opt_newKeyAllowed === undefined) {
+      opt_newKeyAllowed = true;
+    }
+    if (!manager) {
+      throw new SecurityException('Key manager cannot be null.');
+    }
+    const typeUrl = manager.getKeyType();
+
+    if (Registry.typeToManagerMap_.has(typeUrl)) {
+      // Cannot overwrite the existing key manager by a new one.
+      if (!(Registry.typeToManagerMap_.get(typeUrl) instanceof
+            manager.constructor)) {
+        throw new SecurityException(
+            'Key manager for key type ' + typeUrl +
+            ' has already been registered and cannot be overwritten.');
+      }
+
+      // It is forbidden to change new_key_allowed from false to true.
+      if (!(Registry.typeToNewKeyAllowedMap_.get(typeUrl)) &&
+          opt_newKeyAllowed) {
+        throw new SecurityException(
+            'Key manager for key type ' + typeUrl +
+            ' has already been registered with forbidden new key operation.');
+      }
+      Registry.typeToNewKeyAllowedMap_.set(typeUrl, opt_newKeyAllowed);
+    }
+
+    Registry.typeToManagerMap_.set(typeUrl, manager);
+    Registry.typeToNewKeyAllowedMap_.set(typeUrl, opt_newKeyAllowed);
+  }
+
+  /**
+   * Returns a key manager for the given key type or throws an exception if no
+   * such manager found.
+   *
+   * @template P
+   * @static
+   *
+   * @param {string} typeUrl -- key type
+   *
+   * @return {!KeyManager.KeyManager<P>}
+   */
+  static getKeyManager(typeUrl) {
+    const res = Registry.typeToManagerMap_.get(typeUrl);
+    if (!res) {
+      throw new SecurityException(
+          'Key manager for key type ' + typeUrl + ' has not been registered.');
+    }
+    return res;
+  }
+
+  /**
+   * It finds KeyManager according to key type (which is either given by
+   * PbKeyData or given by opt_typeUrl), than calls the corresponding
+   * manager's getPrimitive method.
+   *
+   * Either key is of type PbKeyData or opt_typeUrl must be provided.
+   *
+   * @template P
+   * @static
+   *
+   * @param {!Object} primitiveType
+   * @param {!PbKeyData|!PbMessage} key -- key is either a proto of some key
+   *     or key data.
+   * @param {?string=} opt_typeUrl -- key type
+   *
+   * @return {!Promise.<!P>}
+   */
+  static async getPrimitive(primitiveType, key, opt_typeUrl) {
+    if (key instanceof PbKeyData) {
+      if (opt_typeUrl && key.getTypeUrl() != opt_typeUrl) {
+        throw new SecurityException(
+            'Key type is ' + opt_typeUrl + ', but it is expected to be ' +
+            key.getTypeUrl() + ' or undefined.');
+      }
+      opt_typeUrl = key.getTypeUrl();
+    }
+
+    if (!opt_typeUrl) {
+      throw new SecurityException('Key type has to be specified.');
+    }
+
+    const manager = Registry.getKeyManager(opt_typeUrl);
+    return await manager.getPrimitive(primitiveType, key);
+  }
+
+  /**
+   * Generates a new PbKeyData for the specified keyTemplate. It finds a
+   * KeyManager given by keyTemplate.typeUrl and calls the newKeyData method of
+   * that manager.
+   *
+   * @static
+   *
+   * @param {!PbKeyTemplate} keyTemplate
+   *
+   * @return {!Promise<!PbKeyData>}
+   */
+  static async newKeyData(keyTemplate) {
+    const manager = Registry.getKeyManagerWithNewKeyAllowedCheck_(keyTemplate);
+    return await manager.getKeyFactory().newKeyData(
+        keyTemplate.getValue_asU8());
+  }
+
+  /**
+   * Generates a new key for the specified keyTemplate using the
+   * KeyManager determined by typeUrl field of the keyTemplate.
+   *
+   * @static
+   *
+   * @param {!PbKeyTemplate} keyTemplate
+   *
+   * @return {!Promise<!PbMessage>} returns a key proto
+   */
+  static async newKey(keyTemplate) {
+    const manager = Registry.getKeyManagerWithNewKeyAllowedCheck_(keyTemplate);
+    return await manager.getKeyFactory().newKey(keyTemplate.getValue_asU8());
+  }
+
+  /**
+   * Convenience method for extracting the public key data from the private key
+   * given by serializedPrivateKey.
+   * It looks up a KeyManager identified by typeUrl, which must hold
+   * PrivateKeyFactory, and calls getPublicKeyData method of that factory.
+   *
+   * @param {string} typeUrl
+   * @param {!Uint8Array} serializedPrivateKey
+   * @return {!PbKeyData}
+   */
+  static getPublicKeyData(typeUrl, serializedPrivateKey) {
+    const manager = Registry.getKeyManager(typeUrl);
+    // This solution might cause some problems in the future due to Closure
+    // compiler optimizations, which may map factory.getPublicKeyData to
+    // concrete function.
+    const factory = /** @type{?} */ (manager.getKeyFactory());
+    if (!factory.getPublicKeyData) {
+      throw new SecurityException(
+          'Key manager for key type ' + typeUrl +
+          ' does not have a private key factory.');
+    }
+    return factory.getPublicKeyData(serializedPrivateKey);
+  }
+
+  /**
+   * Resets the registry.
+   * After reset the registry is empty, i.e. it contains no key managers.
+   *
+   * This method is only for testing.
+   *
+   * @static
+   */
+  static reset() {
+    Registry.typeToManagerMap_.clear();
+    Registry.typeToNewKeyAllowedMap_.clear();
+  }
+
+  /**
+   * It finds a KeyManager given by keyTemplate.typeUrl and returns it if it
+   * allows creating new keys.
+   *
+   * @private
+   * @param {!PbKeyTemplate} keyTemplate
+   *
+   * @return {!KeyManager.KeyManager}
+   */
+  static getKeyManagerWithNewKeyAllowedCheck_(keyTemplate) {
+    const keyType = keyTemplate.getTypeUrl();
+    const manager = Registry.getKeyManager(keyType);
+    if (!Registry.typeToNewKeyAllowedMap_.get(keyType)) {
+      throw new SecurityException(
+          'New key operation is forbidden for ' +
+          'key type: ' + keyType + '.');
+    }
+
+    return manager;
+  }
+
+  /**
+   * Tries to register a primitive wrapper.
+   *
+   * @template P
+   * @static
+   *
+   * @param {!PrimitiveWrapper<P>} wrapper
+   */
+  static registerPrimitiveWrapper(wrapper) {
+    if (!wrapper) {
+      throw new SecurityException('primitive wrapper cannot be null');
+    }
+    const primitiveType = wrapper.getPrimitiveType();
+    if (!primitiveType) {
+      throw new SecurityException('primitive wrapper cannot be undefined');
+    }
+
+    if (Registry.primitiveTypeToWrapper_.has(primitiveType)) {
+      // Cannot overwrite the existing key manager by a new one.
+      if (!(Registry.primitiveTypeToWrapper_.get(primitiveType) instanceof
+            wrapper.constructor)) {
+        throw new SecurityException(
+            'primitive wrapper for type ' + primitiveType +
+            ' has already been registered and cannot be overwritten');
+      }
+    }
+
+    Registry.primitiveTypeToWrapper_.set(primitiveType, wrapper);
+  }
+
+  /**
+   * Wraps a PrimitiveSet and returns a single instance.
+   *
+   * @template P
+   * @static
+   *
+   * @param {!PrimitiveSet.PrimitiveSet<P>} primitiveSet
+   * @return {!P}
+   */
+  static wrap(primitiveSet) {
+    if (!primitiveSet) {
+      throw new SecurityException('primitive set cannot be null.');
+    }
+    const primitiveType = primitiveSet.getPrimitiveType();
+    const wrapper = Registry.primitiveTypeToWrapper_.get(primitiveType);
+    if (!wrapper) {
+      throw new SecurityException(
+          'no primitive wrapper found for type ' + primitiveType);
+    }
+    return wrapper.wrap(primitiveSet);
+  }
+}
+// key managers maps
+/**
+ * @static @private {!Map<string,!KeyManager.KeyManager>}
+ *
+ */
+Registry.typeToManagerMap_ = new Map();
+/**
+ * @static @private {!Map<string,boolean>}
+ */
+Registry.typeToNewKeyAllowedMap_ = new Map();
+
+// primitive wrappers map
+/**
+ * @static @private {!Map<!Object,!PrimitiveWrapper>}
+ */
+Registry.primitiveTypeToWrapper_ = new Map();
+
+goog.exportSymbol('tink.Registry', Registry);
+exports = Registry;
diff --git a/javascript/registry_test.js b/javascript/registry_test.js
new file mode 100644
index 0000000..a0273aa
--- /dev/null
+++ b/javascript/registry_test.js
@@ -0,0 +1,1035 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.RegistryTest');
+goog.setTestOnly('tink.RegistryTest');
+
+const Aead = goog.require('tink.Aead');
+const AeadConfig = goog.require('tink.aead.AeadConfig');
+const AeadKeyTemplates = goog.require('tink.aead.AeadKeyTemplates');
+const AesCtrHmacAeadKeyManager = goog.require('tink.aead.AesCtrHmacAeadKeyManager');
+const EncryptThenAuthenticate = goog.require('tink.subtle.EncryptThenAuthenticate');
+const HybridConfig = goog.require('tink.hybrid.HybridConfig');
+const HybridKeyTemplates = goog.require('tink.hybrid.HybridKeyTemplates');
+const KeyManager = goog.require('tink.KeyManager');
+const Mac = goog.require('tink.Mac');
+const PbAesCtrHmacAeadKey = goog.require('proto.google.crypto.tink.AesCtrHmacAeadKey');
+const PbAesCtrHmacAeadKeyFormat = goog.require('proto.google.crypto.tink.AesCtrHmacAeadKeyFormat');
+const PbAesCtrKey = goog.require('proto.google.crypto.tink.AesCtrKey');
+const PbAesCtrKeyFormat = goog.require('proto.google.crypto.tink.AesCtrKeyFormat');
+const PbAesCtrParams = goog.require('proto.google.crypto.tink.AesCtrParams');
+const PbEciesAeadHkdfPrivateKey = goog.require('proto.google.crypto.tink.EciesAeadHkdfPrivateKey');
+const PbEciesAeadHkdfPublicKey = goog.require('proto.google.crypto.tink.EciesAeadHkdfPublicKey');
+const PbHashType = goog.require('proto.google.crypto.tink.HashType');
+const PbHmacKeyFormat = goog.require('proto.google.crypto.tink.HmacKeyFormat');
+const PbHmacParams = goog.require('proto.google.crypto.tink.HmacParams');
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const PbKeyTemplate = goog.require('proto.google.crypto.tink.KeyTemplate');
+const PbMessage = goog.require('jspb.Message');
+const PrimitiveSet = goog.require('tink.PrimitiveSet');
+const Registry = goog.require('tink.Registry');
+const SecurityException = goog.require('tink.exception.SecurityException');
+const testSuite = goog.require('goog.testing.testSuite');
+const userAgent = goog.require('goog.userAgent');
+
+////////////////////////////////////////////////////////////////////////////////
+// tests
+////////////////////////////////////////////////////////////////////////////////
+
+testSuite({
+  async tearDown() {
+    Registry.reset();
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for registerPrimitiveWrapper method
+  testRegisterPrimitiveWrapper_emptyManager() {
+    try {
+      Registry.registerPrimitiveWrapper(null);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: primitive wrapper cannot be null', e.toString());
+    }
+  },
+
+  testRegisterPrimitiveWrapper_overwritingWithSameClass() {
+    const primitive = 'somePrimitive';
+    const primitiveType = 'somePrimitiveType';
+    Registry.registerPrimitiveWrapper(
+        new DummyPrimitiveWrapper1(primitive, primitiveType));
+    Registry.registerPrimitiveWrapper(
+        new DummyPrimitiveWrapper1(primitive, primitiveType));
+  },
+
+  testRegisterPrimitiveWrapper_overwritingWithDifferentClass() {
+    const primitive = 'somePrimitive';
+    const primitiveType = 'somePrimitiveType';
+    Registry.registerPrimitiveWrapper(
+        new DummyPrimitiveWrapper1(primitive, primitiveType));
+    try {
+      Registry.registerPrimitiveWrapper(
+          new DummyPrimitiveWrapper2(primitive, primitiveType));
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: primitive wrapper for type ' + primitiveType +
+              ' has already been registered and cannot be overwritten',
+          e.toString());
+    }
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for wrap method
+  testWrap_shouldWork() {
+    const primitive = 'somePrimitive';
+    const primitiveType = 'somePrimitiveType';
+    const numberOfKeyManagers = 10;
+
+    for (let i = 0; i < numberOfKeyManagers; i++) {
+      Registry.registerPrimitiveWrapper(new DummyPrimitiveWrapper1(
+          primitive + i.toString(), primitiveType + i.toString()));
+    }
+
+    let result;
+    for (let i = 0; i < numberOfKeyManagers; i++) {
+      result = Registry.wrap(
+          new PrimitiveSet.PrimitiveSet(primitiveType + i.toString()));
+      assertObjectEquals(primitive + i.toString(), result);
+    }
+  },
+
+  testWrap_notRegisteredPrimitiveType() {
+    const primitiveType = 'does not exist';
+
+    try {
+      Registry.wrap(new PrimitiveSet.PrimitiveSet(primitiveType));
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: no primitive wrapper found for type ' + primitiveType,
+          e.toString());
+    }
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for registerKeyManager  method
+  testRegisterKeyManager_emptyManager() {
+    try {
+      Registry.registerKeyManager(null);
+    } catch (e) {
+      assertEquals(ExceptionText.nullKeyManager(), e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  testRegisterKeyManager_overwritingAttempt() {
+    const keyType = 'someKeyType';
+
+    try {
+      Registry.registerKeyManager(new DummyKeyManager1(keyType));
+      Registry.registerKeyManager(new DummyKeyManager2(keyType));
+    } catch (e) {
+      assertEquals(
+          ExceptionText.keyManagerOverwrittingAttempt(keyType), e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  // Testing newKeyAllowed behavior -- should hold the most restrictive setting.
+  async testRegisterKeyManager_moreRestrictiveNewKeyAllowed() {
+    const keyType = 'someTypeUrl';
+    const keyManager1 = new DummyKeyManager1(keyType);
+    const keyTemplate = new PbKeyTemplate().setTypeUrl(keyType);
+
+    //Register the key manager with new_key_allowed and test that it is possible
+    //to create a new key data.
+    Registry.registerKeyManager(keyManager1);
+    await Registry.newKeyData(keyTemplate);
+
+    //Restrict the key manager and test that new key data cannot be created.
+    Registry.registerKeyManager(keyManager1, false);
+    try {
+      await Registry.newKeyData(keyTemplate);
+    } catch (e) {
+      assertEquals(ExceptionText.newKeyForbidden(keyType), e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testRegisterKeyManager_lessRestrictiveNewKeyAllowed() {
+    const keyType = 'someTypeUrl';
+    const keyManager1 = new DummyKeyManager1(keyType);
+    const keyTemplate = new PbKeyTemplate().setTypeUrl(keyType);
+
+    Registry.registerKeyManager(keyManager1, false);
+
+    // Re-registering key manager with less restrictive setting should not be
+    // possible and the restriction has to be still true (i.e. new key data
+    // cannot be created).
+    try {
+      Registry.registerKeyManager(keyManager1);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          ExceptionText.prohibitedChangeToLessRestricted(
+              keyManager1.getKeyType()),
+          e.toString());
+    }
+    try {
+      await Registry.newKeyData(keyTemplate);
+    } catch (e) {
+      assertEquals(ExceptionText.newKeyForbidden(keyType), e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for getKeyManager method
+  testGetKeyManager_shouldWork() {
+    const numberOfKeyManagers = 10;
+    let keyManagers1 = [];
+    let keyManagers2 = [];
+
+    for (let i = 0; i < numberOfKeyManagers; i++) {
+      keyManagers1.push(new DummyKeyManager1('someKeyType' + i.toString()));
+      keyManagers2.push(new DummyKeyManager2('otherKeyType' + i.toString()));
+
+      Registry.registerKeyManager(keyManagers1[i]);
+      Registry.registerKeyManager(keyManagers2[i]);
+    }
+
+    let result;
+    for (let i = 0; i < numberOfKeyManagers; i++) {
+      result = Registry.getKeyManager(keyManagers1[i].getKeyType());
+      assertObjectEquals(keyManagers1[i], result);
+
+      result = Registry.getKeyManager(keyManagers2[i].getKeyType());
+      assertObjectEquals(keyManagers2[i], result);
+    }
+  },
+
+  testGetKeyManager_notRegisteredKeyType() {
+    const keyType = 'some_key_type';
+
+    try {
+      Registry.getKeyManager(keyType);
+    } catch (e) {
+      assertEquals(
+          ExceptionText.notRegisteredKeyType(keyType), e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for newKeyData method
+  async testNewKeyData_noManagerForGivenKeyType() {
+    const keyManager1 = new DummyKeyManager1('someKeyType');
+    const differentKeyType = 'otherKeyType';
+    const keyTemplate = new PbKeyTemplate().setTypeUrl(differentKeyType);
+
+    Registry.registerKeyManager(keyManager1);
+    try {
+      await Registry.newKeyData(keyTemplate);
+    } catch (e) {
+      assertEquals(
+          ExceptionText.notRegisteredKeyType(differentKeyType),
+          e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testNewKeyData_newKeyDisallowed() {
+    const keyManager1 = new DummyKeyManager1('someKeyType');
+    const keyTemplate =
+        new PbKeyTemplate().setTypeUrl(keyManager1.getKeyType());
+
+    Registry.registerKeyManager(keyManager1, false);
+    try {
+      await Registry.newKeyData(keyTemplate);
+    } catch (e) {
+      assertEquals(
+          ExceptionText.newKeyForbidden(keyManager1.getKeyType()),
+          e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testNewKeyData_newKeyAllowed() {
+    const /** Array<string> */ keyTypes = [];
+    for (let i = 0; i < 10; i++) {
+      keyTypes.push('someKeyType' + i.toString());
+    }
+
+    const keyTypesLength = keyTypes.length;
+    for (let i = 0; i < keyTypesLength; i++) {
+      Registry.registerKeyManager(new DummyKeyManager1(keyTypes[i]), true);
+    }
+
+    for (let i = 0; i < keyTypesLength; i++) {
+      const keyTemplate = new PbKeyTemplate().setTypeUrl(keyTypes[i]);
+      const result = await Registry.newKeyData(keyTemplate);
+      assertEquals(keyTypes[i], result.getTypeUrl());
+    }
+  },
+
+  async testNewKeyData_newKeyIsAllowedAutomatically() {
+    const /** Array<string> */ keyTypes = [];
+    for (let i = 0; i < 10; i++) {
+      keyTypes.push('someKeyType' + i.toString());
+    }
+
+    const keyTypesLength = keyTypes.length;
+    for (let i = 0; i < keyTypesLength; i++) {
+      Registry.registerKeyManager(new DummyKeyManager1(keyTypes[i]));
+    }
+
+    for (let i = 0; i < keyTypesLength; i++) {
+      const keyTemplate = new PbKeyTemplate().setTypeUrl(keyTypes[i]);
+      const result = await Registry.newKeyData(keyTemplate);
+      assertEquals(keyTypes[i], result.getTypeUrl());
+    }
+  },
+
+  async testNewKeyData_withAesCtrHmacAeadKey() {
+    const manager = new AesCtrHmacAeadKeyManager();
+    Registry.registerKeyManager(manager);
+    const keyTemplate = createAesCtrHmacAeadTestKeyTemplate();
+    const keyData = await Registry.newKeyData(keyTemplate);
+
+    // Checks that correct AES CTR HMAC AEAD key was returned.
+    const keyFormat =
+        PbAesCtrHmacAeadKeyFormat.deserializeBinary(keyTemplate.getValue());
+    const key = PbAesCtrHmacAeadKey.deserializeBinary(keyData.getValue());
+    // Check AES CTR key.
+    assertEquals(
+        key.getAesCtrKey().getKeyValue().length,
+        keyFormat.getAesCtrKeyFormat().getKeySize());
+    assertObjectEquals(
+        key.getAesCtrKey().getParams(),
+        keyFormat.getAesCtrKeyFormat().getParams());
+    // Check HMAC key.
+    assertEquals(
+        key.getHmacKey().getKeyValue().length,
+        keyFormat.getHmacKeyFormat().getKeySize());
+    assertObjectEquals(
+        key.getHmacKey().getParams(), keyFormat.getHmacKeyFormat().getParams());
+  },
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for newKey method
+  async testNewKey_noManagerForGivenKeyType() {
+    const notRegisteredKeyType = 'not_registered_key_type';
+    const keyTemplate = new PbKeyTemplate().setTypeUrl(notRegisteredKeyType);
+
+    try {
+      await Registry.newKey(keyTemplate);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          ExceptionText.notRegisteredKeyType(notRegisteredKeyType),
+          e.toString());
+    }
+  },
+
+  async testNewKey_newKeyDisallowed() {
+    const keyManager = new DummyKeyManagerForNewKeyTests('someKeyType');
+    const keyTemplate = new PbKeyTemplate().setTypeUrl(keyManager.getKeyType());
+    Registry.registerKeyManager(keyManager, /* opt_newKeyAllowed = */ false);
+
+    try {
+      await Registry.newKey(keyTemplate);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          ExceptionText.newKeyForbidden(keyManager.getKeyType()), e.toString());
+    }
+  },
+
+  async testNewKey_shouldWork() {
+    const /** Array<string> */ keyTypes = [];
+    const /** Array<Uint8Array> */ newKeyMethodResult = [];
+    const keyTypesLength = 10;
+
+    // Add some keys to Registry.
+    for (let i = 0; i < keyTypesLength; i++) {
+      keyTypes.push('someKeyType' + i.toString());
+      newKeyMethodResult.push(new Uint8Array([i + 1]));
+
+      Registry.registerKeyManager(
+          new DummyKeyManagerForNewKeyTests(keyTypes[i], newKeyMethodResult[i]),
+          /* newKeyAllowed = */ true);
+    }
+
+    // For every keyType verify that it calls new key method of the
+    // corresponding KeyManager (KeyFactory).
+    for (let i = 0; i < keyTypesLength; i++) {
+      const keyTemplate = new PbKeyTemplate().setTypeUrl(keyTypes[i]);
+
+      const key =
+          /** @type {!PbAesCtrKey} */ (await Registry.newKey(keyTemplate));
+
+      // The new key method of DummyKeyFactory returns an AesCtrKey which
+      // KeyValue is set to corresponding value in newKeyMethodResult.
+      assertEquals(newKeyMethodResult[i], key.getKeyValue());
+    }
+  },
+
+  async testNewKey_withAesCtrHmacAeadKey() {
+    const manager = new AesCtrHmacAeadKeyManager();
+    Registry.registerKeyManager(manager);
+    const keyTemplate = AeadKeyTemplates.aes256CtrHmacSha256();
+
+    const key =
+        /** @type{!PbAesCtrHmacAeadKey} */ (await Registry.newKey(keyTemplate));
+
+    // Checks that correct AES CTR HMAC AEAD key was returned.
+    const keyFormat =
+        PbAesCtrHmacAeadKeyFormat.deserializeBinary(keyTemplate.getValue());
+    // Check AES CTR key.
+    assertEquals(
+        key.getAesCtrKey().getKeyValue().length,
+        keyFormat.getAesCtrKeyFormat().getKeySize());
+    assertObjectEquals(
+        key.getAesCtrKey().getParams(),
+        keyFormat.getAesCtrKeyFormat().getParams());
+    // Check HMAC key.
+    assertEquals(
+        key.getHmacKey().getKeyValue().length,
+        keyFormat.getHmacKeyFormat().getKeySize());
+    assertObjectEquals(
+        key.getHmacKey().getParams(), keyFormat.getHmacKeyFormat().getParams());
+  },
+
+
+  /////////////////////////////////////////////////////////////////////////////
+  // tests for getPrimitive method
+  async testGetPrimitive_differentKeyTypes() {
+    const keyDataType = 'key_data_key_type_url';
+    const anotherType = 'another_key_type_url';
+    const keyData = new PbKeyData().setTypeUrl(keyDataType);
+
+    try {
+      await Registry.getPrimitive(null, keyData, anotherType);
+    } catch (e) {
+      assertEquals(
+          ExceptionText.keyTypesAreNotMatching(keyDataType, anotherType),
+          e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testGetPrimitive_withoutDefiningKeyType() {
+    // Get primitive from key proto without key type.
+    try {
+      await Registry.getPrimitive(null, new PbMessage);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.keyTypeNotDefined(), e.toString());
+    }
+  },
+
+  async testGetPrimitive_missingKeyManager() {
+    const keyDataType = 'key_data_key_type_url';
+    const keyData = new PbKeyData().setTypeUrl(keyDataType);
+
+    try {
+      await Registry.getPrimitive(null, keyData);
+    } catch (e) {
+      assertEquals(
+          ExceptionText.notRegisteredKeyType(keyDataType), e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testGetPrimitive_fromAesCtrHmacAeadKeyData() {
+    const manager = new AesCtrHmacAeadKeyManager();
+    Registry.registerKeyManager(manager);
+    let keyTemplate = createAesCtrHmacAeadTestKeyTemplate();
+    const keyData = await Registry.newKeyData(keyTemplate);
+
+    const primitive =
+        await Registry.getPrimitive(manager.getPrimitiveType(), keyData);
+    assertTrue(primitive instanceof EncryptThenAuthenticate);
+  },
+
+  async testGetPrimitive_fromAesCtrHmacAeadKey() {
+    const manager = new AesCtrHmacAeadKeyManager();
+    Registry.registerKeyManager(manager);
+    let keyTemplate = createAesCtrHmacAeadTestKeyTemplate();
+    const keyData = await Registry.newKeyData(keyTemplate);
+    const key = PbAesCtrHmacAeadKey.deserializeBinary(keyData.getValue());
+
+    const primitive = await Registry.getPrimitive(
+        manager.getPrimitiveType(), key, keyData.getTypeUrl());
+    assertTrue(primitive instanceof EncryptThenAuthenticate);
+  },
+
+  async testGetPrimitive_macFromAesCtrHmacAeadKey() {
+    const manager = new AesCtrHmacAeadKeyManager();
+    Registry.registerKeyManager(manager);
+    let keyTemplate = createAesCtrHmacAeadTestKeyTemplate();
+    const keyData = await Registry.newKeyData(keyTemplate);
+    const key = PbAesCtrHmacAeadKey.deserializeBinary(keyData.getValue());
+
+    try {
+      await Registry.getPrimitive(Mac, key, keyData.getTypeUrl());
+    } catch (e) {
+      assertTrue(
+          e.toString().includes(ExceptionText.getPrimitiveBadPrimitive()));
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  testGetPublicKeyData: {
+    shouldRunTests() {
+      return !userAgent.EDGE;  // b/120286783
+    },
+
+    testNotPrivateKeyFactory() {
+      AeadConfig.register();
+      const notPrivateTypeUrl = AeadConfig.AES_GCM_TYPE_URL;
+      try {
+        Registry.getPublicKeyData(notPrivateTypeUrl, new Uint8Array(8));
+        fail('An exception should be thrown.');
+      } catch (e) {
+        assertEquals(
+            ExceptionText.notPrivateKeyFactory(notPrivateTypeUrl),
+            e.toString());
+      }
+    },
+
+    testInvalidPrivateKeyProtoSerialization() {
+      HybridConfig.register();
+      const typeUrl = HybridConfig.ECIES_AEAD_HKDF_PRIVATE_KEY_TYPE;
+      try {
+        Registry.getPublicKeyData(typeUrl, new Uint8Array(10));
+        fail('An exception should be thrown.');
+      } catch (e) {
+        assertEquals(ExceptionText.couldNotParse(typeUrl), e.toString());
+      }
+    },
+
+    async testShouldWork() {
+      HybridConfig.register();
+      const privateKeyData = await Registry.newKeyData(
+          HybridKeyTemplates.eciesP256HkdfHmacSha256Aes128Gcm());
+      const privateKey = PbEciesAeadHkdfPrivateKey.deserializeBinary(
+          privateKeyData.getValue());
+
+      const publicKeyData = Registry.getPublicKeyData(
+          privateKeyData.getTypeUrl(), privateKeyData.getValue_asU8());
+      assertEquals(
+          publicKeyData.getTypeUrl(),
+          HybridConfig.ECIES_AEAD_HKDF_PUBLIC_KEY_TYPE);
+      assertEquals(
+          publicKeyData.getKeyMaterialType(),
+          PbKeyData.KeyMaterialType.ASYMMETRIC_PUBLIC);
+
+      const expectedPublicKey = privateKey.getPublicKey();
+      const publicKey = PbEciesAeadHkdfPublicKey.deserializeBinary(
+          publicKeyData.getValue_asU8());
+      assertObjectEquals(expectedPublicKey, publicKey);
+    },
+  },
+});
+
+////////////////////////////////////////////////////////////////////////////////
+// helper functions and classes for tests
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Class which holds texts for each type of exception.
+ * @final
+ */
+class ExceptionText {
+  /** @return {string} */
+  static notImplemented() {
+    return 'CustomError: Not implemented yet.';
+  }
+
+  /**
+   * @param {string} keyType
+   *
+   * @return {string}
+   */
+  static newKeyForbidden(keyType) {
+    return 'CustomError: New key operation is forbidden for key type: ' +
+        keyType + '.';
+  }
+
+  /**
+   * @param {string} keyType
+   *
+   * @return {string}
+   */
+  static notRegisteredKeyType(keyType) {
+    return 'CustomError: Key manager for key type ' + keyType +
+        ' has not been registered.';
+  }
+
+  /**
+   * @return {string}
+   */
+  static nullKeyManager() {
+    return 'CustomError: Key manager cannot be null.';
+  }
+
+  /**
+   * @return {string}
+   */
+  static undefinedKeyType() {
+    return 'CustomError: Key type has to be defined.';
+  }
+
+  /**
+   * @param {string} keyType
+   *
+   * @return {string}
+   */
+  static keyManagerOverwrittingAttempt(keyType) {
+    return 'CustomError: Key manager for key type ' + keyType +
+        ' has already been registered and cannot be overwritten.';
+  }
+
+  /**
+   * @param {string} givenKeyType
+   *
+   * @return {string}
+   */
+  static notSupportedKey(givenKeyType) {
+    return 'CustomError: The provided key manager does not support '
+          + 'key type ' + givenKeyType + '.';
+  }
+
+  /**
+   * @param {string} keyType
+   *
+   * @return {string}
+   */
+  static prohibitedChangeToLessRestricted(keyType) {
+    return 'CustomError: Key manager for key type ' + keyType +
+        ' has already been registered with forbidden new key operation.';
+  }
+
+  /**
+   * @param {string} keyTypeFromKeyData
+   * @param {string} keyTypeParam
+   *
+   * @return {string}
+   */
+  static keyTypesAreNotMatching(keyTypeFromKeyData, keyTypeParam) {
+    return 'CustomError: Key type is ' + keyTypeParam +
+        ', but it is expected to be ' + keyTypeFromKeyData + ' or undefined.';
+  }
+
+  /** @return {string} */
+  static keyTypeNotDefined() {
+    return 'CustomError: Key type has to be specified.';
+  }
+
+  /** @return {string} */
+  static nullKeysetHandle() {
+    return 'CustomError: Keyset handle has to be non-null.';
+  }
+
+  /**
+   * @return {string}
+   */
+  static getPrimitiveBadPrimitive() {
+    return 'Requested primitive type which is not supported by this ' +
+        'key manager.';
+  }
+
+  /**
+   * @param {string} typeUrl
+   * @return {string}
+   */
+  static notPrivateKeyFactory(typeUrl) {
+    return 'CustomError: Key manager for key type ' + typeUrl +
+        ' does not have a private key factory.';
+  }
+
+  /**
+   * @param {string} typeUrl
+   * @return {string}
+   */
+  static couldNotParse(typeUrl) {
+    return 'CustomError: Input cannot be parsed as ' + typeUrl + ' key-proto.';
+  }
+}
+
+/**
+ * Creates AES CTR HMAC AEAD key format which can be used in tests
+ *
+ * @return {!PbKeyTemplate}
+ */
+const createAesCtrHmacAeadTestKeyTemplate = function() {
+  const KEY_SIZE = 16;
+  const IV_SIZE = 12;
+  const TAG_SIZE = 16;
+
+  let keyFormat = new PbAesCtrHmacAeadKeyFormat().setAesCtrKeyFormat(
+      new PbAesCtrKeyFormat());
+  keyFormat.getAesCtrKeyFormat().setKeySize(KEY_SIZE);
+  keyFormat.getAesCtrKeyFormat().setParams(new PbAesCtrParams());
+  keyFormat.getAesCtrKeyFormat().getParams().setIvSize(IV_SIZE);
+
+  // set HMAC key
+  keyFormat.setHmacKeyFormat(new PbHmacKeyFormat());
+  keyFormat.getHmacKeyFormat().setKeySize(KEY_SIZE);
+  keyFormat.getHmacKeyFormat().setParams(new PbHmacParams());
+  keyFormat.getHmacKeyFormat().getParams().setHash(PbHashType.SHA1);
+  keyFormat.getHmacKeyFormat().getParams().setTagSize(TAG_SIZE);
+
+  let keyTemplate =
+      new PbKeyTemplate()
+          .setTypeUrl(
+              'type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey')
+          .setValue(keyFormat.serializeBinary());
+  return keyTemplate;
+};
+
+// Key factory and key manager classes used in tests
+/**
+ * @final
+ * @implements {KeyManager.KeyFactory}
+ */
+class DummyKeyFactory {
+  /**
+   * @param {string} keyType
+   * @param {?Uint8Array=} opt_newKeyMethodResult
+   */
+  constructor(keyType, opt_newKeyMethodResult) {
+    /**
+     * @const @private {string}
+     */
+    this.KEY_TYPE_ = keyType;
+
+    if (!opt_newKeyMethodResult) {
+      opt_newKeyMethodResult = new Uint8Array(10);
+    }
+
+    /**
+     * @const @private {!Uint8Array}
+     */
+    this.NEW_KEY_METHOD_RESULT_ = opt_newKeyMethodResult;
+  }
+
+  /**
+   * @override
+   */
+  newKey(keyFormat) {
+    const key = new PbAesCtrKey().setKeyValue(this.NEW_KEY_METHOD_RESULT_);
+
+    return key;
+  }
+
+  /**
+   * @override
+   */
+  newKeyData(serializedKeyFormat) {
+    let keyData =
+        new PbKeyData()
+            .setTypeUrl(this.KEY_TYPE_)
+            .setValue(this.NEW_KEY_METHOD_RESULT_)
+            .setKeyMaterialType(PbKeyData.KeyMaterialType.UNKNOWN_KEYMATERIAL);
+
+    return keyData;
+  }
+}
+
+const DEFAULT_PRIMITIVE_TYPE = Aead;
+
+/**
+ * @final
+ * @implements {KeyManager.KeyManager<string>}
+ */
+class DummyKeyManager1 {
+  /**
+   * @param {string} keyType
+   * @param {?string=} opt_primitive
+   * @param {?Object=} opt_primitiveType
+   */
+  constructor(keyType, opt_primitive, opt_primitiveType) {
+    /**
+     * @private @const {string}
+     */
+    this.KEY_TYPE_ = keyType;
+
+    if (!opt_primitive) {
+      opt_primitive = keyType;
+    }
+    /**
+     * @private @const {string}
+     */
+    this.PRIMITIVE_ = opt_primitive;
+    /**
+     * @private @const {!KeyManager.KeyFactory}
+     */
+    this.KEY_FACTORY_ = new DummyKeyFactory(keyType);
+
+    if (!opt_primitiveType) {
+      opt_primitiveType = DEFAULT_PRIMITIVE_TYPE;
+    }
+    /**
+     * @private @const {!Object}
+     */
+    this.PRIMITIVE_TYPE_ = opt_primitiveType;
+  }
+
+  /** @override */
+  async getPrimitive(primitiveType, key) {
+    if (primitiveType !== this.PRIMITIVE_TYPE_) {
+      throw new SecurityException(
+          'Requested primitive type which is not ' +
+          'supported by this key manager.');
+    }
+    return this.PRIMITIVE_;
+  }
+
+  /** @override */
+  doesSupport(keyType) {
+    return keyType === this.getKeyType();
+  }
+
+  /** @override */
+  getKeyType() {
+    return this.KEY_TYPE_;
+  }
+
+  /** @override */
+  getPrimitiveType() {
+    return this.PRIMITIVE_TYPE_;
+  }
+
+  /** @override */
+  getVersion() {
+    throw new SecurityException('Not implemented, only for testing purposes.');
+  }
+
+  /** @override */
+  getKeyFactory() {
+    return this.KEY_FACTORY_;
+  }
+}
+
+/**
+ * @final
+ * @implements {KeyManager.KeyManager<string>}
+ */
+class DummyKeyManager2 {
+  /**
+   * @param {string} keyType
+   * @param {string=} opt_primitive
+   * @param {?Object=} opt_primitiveType
+   */
+  constructor(keyType, opt_primitive, opt_primitiveType) {
+    /**
+     * @private @const {string}
+     */
+    this.KEY_TYPE_ = keyType;
+
+    if (!opt_primitive) {
+      opt_primitive = keyType;
+    }
+    /**
+     * @private @const {string}
+     */
+    this.PRIMITIVE_ = opt_primitive;
+    /**
+     * @private @const {!KeyManager.KeyFactory}
+     */
+    this.KEY_FACTORY_ = new DummyKeyFactory(keyType);
+
+    if (!opt_primitiveType) {
+      opt_primitiveType = DEFAULT_PRIMITIVE_TYPE;
+    }
+    /**
+     * @private @const {!Object}
+     */
+    this.PRIMITIVE_TYPE_ = opt_primitiveType;
+  }
+
+  /** @override */
+  async getPrimitive(primitiveType, key) {
+    if (primitiveType !== this.PRIMITIVE_TYPE_) {
+      throw new SecurityException(
+          'Requested primitive type which is not ' +
+          'supported by this key manager.');
+    }
+    return this.PRIMITIVE_;
+  }
+
+  /** @override */
+  doesSupport(keyType) {
+    return keyType === this.getKeyType();
+  }
+
+  /** @override */
+  getKeyType() {
+    return this.KEY_TYPE_;
+  }
+
+  /** @override */
+  getPrimitiveType() {
+    return this.PRIMITIVE_TYPE_;
+  }
+
+  /** @override */
+  getVersion() {
+    throw new SecurityException('Not implemented, only for testing purposes.');
+  }
+
+  /** @override */
+  getKeyFactory() {
+    return this.KEY_FACTORY_;
+  }
+}
+
+/**
+ * @final
+ * @implements {KeyManager.KeyManager<string>}
+ */
+class DummyKeyManagerForNewKeyTests {
+  /**
+   * @param {string} keyType
+   * @param {?Uint8Array=} opt_newKeyMethodResult
+   */
+  constructor(keyType, opt_newKeyMethodResult) {
+    /**
+     * @private @const {string}
+     */
+    this.KEY_TYPE_ = keyType;
+
+    /**
+     * @private @const {!KeyManager.KeyFactory}
+     */
+    this.KEY_FACTORY_ = new DummyKeyFactory(keyType, opt_newKeyMethodResult);
+  }
+
+  /** @override */
+  async getPrimitive(primitiveType, key) {
+    throw new SecurityException('Not implemented, function is not needed.');
+  }
+
+  /** @override */
+  doesSupport(keyType) {
+    return keyType === this.getKeyType();
+  }
+
+  /** @override */
+  getKeyType() {
+    return this.KEY_TYPE_;
+  }
+
+  /** @override */
+  getPrimitiveType() {
+    throw new SecurityException('Not implemented, function is not needed.');
+  }
+
+  /** @override */
+  getVersion() {
+    throw new SecurityException('Not implemented, function is not needed.');
+  }
+
+  /** @override */
+  getKeyFactory() {
+    return this.KEY_FACTORY_;
+  }
+}
+
+// PrimitiveWrapper classes for testing purposes
+/**
+ * @final
+ * @implements {PrimitiveWrapper<string>}
+ */
+class DummyPrimitiveWrapper1 {
+  /**
+   * @param {string} primitive
+   * @param {!Object} primitiveType
+   */
+  constructor(primitive, primitiveType) {
+    /**
+     * @private @const {string}
+     */
+    this.PRIMITIVE_ = primitive;
+
+    /**
+     * @private @const {!Object}
+     */
+    this.PRIMITIVE_TYPE_ = primitiveType;
+  }
+
+  /**
+   * @override
+   */
+  wrap(primitiveSet) {
+    return this.PRIMITIVE_;
+  }
+
+  /**
+   * @override
+   */
+  getPrimitiveType() {
+    return this.PRIMITIVE_TYPE_;
+  }
+}
+
+// PrimitiveWrapper classes for testing purposes
+/**
+ * @final
+ * @implements {PrimitiveWrapper<string>}
+ */
+class DummyPrimitiveWrapper2 {
+  /**
+   * @param {string} primitive
+   * @param {!Object} primitiveType
+   */
+  constructor(primitive, primitiveType) {
+    /**
+     * @private @const {string}
+     */
+    this.PRIMITIVE_ = primitive;
+
+    /**
+     * @private @const {!Object}
+     */
+    this.PRIMITIVE_TYPE_ = primitiveType;
+  }
+
+  /**
+   * @override
+   */
+  wrap(primitiveSet) {
+    return this.PRIMITIVE_;
+  }
+
+  /**
+   * @override
+   */
+  getPrimitiveType() {
+    return this.PRIMITIVE_TYPE_;
+  }
+}
diff --git a/javascript/signature/BUILD.bazel b/javascript/signature/BUILD.bazel
new file mode 100644
index 0000000..58600d2
--- /dev/null
+++ b/javascript/signature/BUILD.bazel
@@ -0,0 +1,122 @@
+package(
+    default_visibility = [
+        "//tools/build_defs:internal_pkg",
+    ],
+)
+
+licenses(["notice"])
+
+load("@io_bazel_rules_closure//closure:defs.bzl", "closure_js_library")
+
+closure_js_library(
+    name = "signature",
+    exports = [
+        ":config",
+        ":ecdsa_key_managers",
+        ":key_templates",
+        ":utils",
+        ":wrappers",
+    ],
+)
+
+closure_js_library(
+    name = "utils",
+    srcs = [
+        "ecdsa_util.js",
+    ],
+    deps = [
+        "//javascript:util",
+        "//javascript/exception",
+        "//javascript/subtle",
+        "//proto:common_closure_proto",
+        "//proto:ecdsa_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "ecdsa_key_managers",
+    srcs = [
+        "ecdsa_private_key_manager.js",
+        "ecdsa_public_key_manager.js",
+    ],
+    deps = [
+        ":utils",
+        "//javascript:key_manager",
+        "//javascript:primitives",
+        "//javascript:util",
+        "//javascript/exception",
+        "//javascript/subtle",
+        "//javascript/subtle:signature",
+        "//proto:ecdsa_closure_proto",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+        "@io_bazel_rules_closure//closure/protobuf:jspb",
+    ],
+)
+
+closure_js_library(
+    name = "wrappers",
+    srcs = [
+        "public_key_sign_wrapper.js",
+        "public_key_verify_wrapper.js",
+    ],
+    deps = [
+        "//javascript:crypto_format",
+        "//javascript:primitive_set",
+        "//javascript:primitive_wrapper",
+        "//javascript:primitives",
+        "//javascript/exception",
+        "//javascript/subtle",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "config",
+    srcs = [
+        "signature_config.js",
+    ],
+    deps = [
+        ":ecdsa_key_managers",
+        ":wrappers",
+        "//javascript:registry",
+        "//javascript/aead:aead_config",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "key_templates",
+    srcs = [
+        "signature_key_templates.js",
+    ],
+    deps = [
+        ":config",
+        "//proto:common_closure_proto",
+        "//proto:ecdsa_closure_proto",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+# test
+
+closure_js_library(
+    name = "test_lib",
+    testonly = 1,
+    srcs = glob([
+        "*_test.js",
+    ]),
+    deps = [
+        "//proto:common_closure_proto",
+        "//proto:ecdsa_closure_proto",
+        "//proto:tink_closure_proto",
+        "@io_bazel_rules_closure//closure/library",
+        "@io_bazel_rules_closure//closure/library/testing:asserts",
+        "@io_bazel_rules_closure//closure/library/testing:jsunit",
+        "@io_bazel_rules_closure//closure/library/testing:testsuite",
+        "@io_bazel_rules_closure//closure/library/useragent",
+    ],
+)
diff --git a/javascript/signature/ecdsa_private_key_manager.js b/javascript/signature/ecdsa_private_key_manager.js
new file mode 100644
index 0000000..65489ed
--- /dev/null
+++ b/javascript/signature/ecdsa_private_key_manager.js
@@ -0,0 +1,294 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.signature.EcdsaPrivateKeyManager');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const EcdsaPublicKeyManager = goog.require('tink.signature.EcdsaPublicKeyManager');
+const EcdsaSign = goog.require('tink.subtle.EcdsaSign');
+const EcdsaUtil = goog.require('tink.signature.EcdsaUtil');
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const KeyManager = goog.require('tink.KeyManager');
+const PbEcdsaKeyFormat = goog.require('proto.google.crypto.tink.EcdsaKeyFormat');
+const PbEcdsaParams = goog.require('proto.google.crypto.tink.EcdsaParams');
+const PbEcdsaPrivateKey = goog.require('proto.google.crypto.tink.EcdsaPrivateKey');
+const PbEcdsaPublicKey = goog.require('proto.google.crypto.tink.EcdsaPublicKey');
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const PbMessage = goog.require('jspb.Message');
+const PublicKeySign = goog.require('tink.PublicKeySign');
+const SecurityException = goog.require('tink.exception.SecurityException');
+const Util = goog.require('tink.Util');
+
+/**
+ * @implements {KeyManager.PrivateKeyFactory}
+ * @final
+ */
+class EcdsaPrivateKeyFactory {
+  /**
+   * @override
+   * @return {!Promise<!PbEcdsaPrivateKey>}
+   */
+  async newKey(keyFormat) {
+    if (!keyFormat) {
+      throw new SecurityException('Key format has to be non-null.');
+    }
+    const keyFormatProto = EcdsaPrivateKeyFactory.getKeyFormatProto_(keyFormat);
+    EcdsaUtil.validateKeyFormat(keyFormatProto);
+    return await EcdsaPrivateKeyFactory.newKeyImpl_(keyFormatProto);
+  }
+
+  /**
+   * @override
+   * @return {!Promise<!PbKeyData>}
+   */
+  async newKeyData(serializedKeyFormat) {
+    const key = await this.newKey(serializedKeyFormat);
+
+    const keyData =
+        new PbKeyData()
+            .setTypeUrl(EcdsaPrivateKeyManager.KEY_TYPE)
+            .setValue(key.serializeBinary())
+            .setKeyMaterialType(PbKeyData.KeyMaterialType.ASYMMETRIC_PRIVATE);
+    return keyData;
+  }
+
+  /** @override */
+  getPublicKeyData(serializedPrivateKey) {
+    const privateKey =
+        EcdsaPrivateKeyManager.deserializePrivateKey_(serializedPrivateKey);
+
+    const publicKeyData =
+        new PbKeyData()
+            .setValue(privateKey.getPublicKey().serializeBinary())
+            .setTypeUrl(EcdsaPublicKeyManager.KEY_TYPE)
+            .setKeyMaterialType(PbKeyData.KeyMaterialType.ASYMMETRIC_PUBLIC);
+    return publicKeyData;
+  }
+
+  /**
+   * Generates key corresponding to the given key format.
+   * WARNING: This function assumes that the keyFormat has been validated.
+   *
+   * @private
+   * @param {!PbEcdsaKeyFormat} keyFormat
+   * @return {!Promise<!PbEcdsaPrivateKey>}
+   */
+  static async newKeyImpl_(keyFormat) {
+    const params =
+        /** @type {!PbEcdsaParams} */ (keyFormat.getParams());
+    const curveTypeProto = params.getCurve();
+    const curveTypeSubtle = Util.curveTypeProtoToSubtle(curveTypeProto);
+    const curveName = EllipticCurves.curveToString(curveTypeSubtle);
+    const keyPair = await EllipticCurves.generateKeyPair('ECDSA', curveName);
+
+    const jsonPublicKey =
+        await EllipticCurves.exportCryptoKey(/** @type {?} */ (keyPair).publicKey);
+    const jsonPrivateKey =
+        await EllipticCurves.exportCryptoKey(/** @type {?} */ (keyPair).privateKey);
+    return EcdsaPrivateKeyFactory.jsonToProtoKey_(
+        jsonPrivateKey, jsonPublicKey, params);
+  }
+
+  /**
+   * Creates a private key proto corresponding to given JSON key pair and with
+   * the given params.
+   *
+   * @private
+   * @param {!webCrypto.JsonWebKey} jsonPrivateKey
+   * @param {!webCrypto.JsonWebKey} jsonPublicKey
+   * @param {!PbEcdsaParams} params
+   * @return {!PbEcdsaPrivateKey}
+   */
+  static jsonToProtoKey_(jsonPrivateKey, jsonPublicKey, params) {
+    const publicKeyProto =
+        new PbEcdsaPublicKey()
+            .setVersion(EcdsaPublicKeyManager.VERSION)
+            .setParams(params)
+            .setX(Bytes.fromBase64(jsonPublicKey['x'], true))
+            .setY(Bytes.fromBase64(jsonPublicKey['y'], true));
+
+    const privateKeyProto =
+        new PbEcdsaPrivateKey()
+            .setVersion(EcdsaPrivateKeyManager.VERSION_)
+            .setPublicKey(publicKeyProto)
+            .setKeyValue(Bytes.fromBase64(jsonPrivateKey['d'], true));
+    return privateKeyProto;
+  }
+
+  /**
+   * The input keyFormat is either deserialized (in case that the input is
+   * Uint8Array) or checked to be an EcdsaKeyFormat-proto (otherwise).
+   *
+   * @private
+   * @param {!PbMessage|!Uint8Array} keyFormat
+   * @return {!PbEcdsaKeyFormat}
+   */
+  static getKeyFormatProto_(keyFormat) {
+    if (keyFormat instanceof Uint8Array) {
+      return EcdsaPrivateKeyFactory.deserializeKeyFormat_(keyFormat);
+    } else {
+      if (keyFormat instanceof PbEcdsaKeyFormat) {
+        return keyFormat;
+      } else {
+        throw new SecurityException(
+            'Expected ' + EcdsaPrivateKeyManager.KEY_TYPE +
+            ' key format proto.');
+      }
+    }
+  }
+
+  /**
+   * @private
+   * @param {!Uint8Array} keyFormat
+   * @return {!PbEcdsaKeyFormat}
+   */
+  static deserializeKeyFormat_(keyFormat) {
+    let /** !PbEcdsaKeyFormat */ keyFormatProto;
+    try {
+      keyFormatProto = PbEcdsaKeyFormat.deserializeBinary(keyFormat);
+    } catch (e) {
+      throw new SecurityException(
+          'Input cannot be parsed as ' + EcdsaPrivateKeyManager.KEY_TYPE +
+          ' key format proto.');
+    }
+    if (!keyFormatProto.getParams()) {
+      throw new SecurityException(
+          'Input cannot be parsed as ' + EcdsaPrivateKeyManager.KEY_TYPE +
+          ' key format proto.');
+    }
+    return keyFormatProto;
+  }
+}
+
+
+/**
+ * @implements {KeyManager.KeyManager<PublicKeySign>}
+ * @final
+ */
+class EcdsaPrivateKeyManager {
+  constructor() {
+    this.keyFactory = new EcdsaPrivateKeyFactory();
+  }
+
+  /** @override */
+  async getPrimitive(primitiveType, key) {
+    if (primitiveType !== this.getPrimitiveType()) {
+      throw new SecurityException(
+          'Requested primitive type which is not ' +
+          'supported by this key manager.');
+    }
+
+    const keyProto = EcdsaPrivateKeyManager.getKeyProto_(key);
+    EcdsaUtil.validatePrivateKey(
+        keyProto, EcdsaPrivateKeyManager.VERSION_,
+        EcdsaPublicKeyManager.VERSION);
+
+    const recepientPrivateKey = EcdsaUtil.getJsonWebKeyFromProto(keyProto);
+    const params =
+        /** @type {!PbEcdsaParams} */ (keyProto.getPublicKey().getParams());
+    const hash = Util.hashTypeProtoToString(params.getHashType());
+    const encoding = EcdsaUtil.encodingTypeProtoToEnum(params.getEncoding());
+    return await EcdsaSign.newInstance(recepientPrivateKey, hash, encoding);
+  }
+
+  /** @override */
+  doesSupport(keyType) {
+    return keyType === this.getKeyType();
+  }
+
+  /** @override */
+  getKeyType() {
+    return EcdsaPrivateKeyManager.KEY_TYPE;
+  }
+
+  /** @override */
+  getPrimitiveType() {
+    return EcdsaPrivateKeyManager.SUPPORTED_PRIMITIVE_;
+  }
+
+  /** @override */
+  getVersion() {
+    return EcdsaPrivateKeyManager.VERSION_;
+  }
+
+  /** @override */
+  getKeyFactory() {
+    return this.keyFactory;
+  }
+
+  /**
+   * @private
+   * @param {!PbKeyData|!PbMessage} keyMaterial
+   * @return {!PbEcdsaPrivateKey}
+   */
+  static getKeyProto_(keyMaterial) {
+    if (keyMaterial instanceof PbKeyData) {
+      return EcdsaPrivateKeyManager.getKeyProtoFromKeyData_(keyMaterial);
+    }
+    if (keyMaterial instanceof PbEcdsaPrivateKey) {
+      return keyMaterial;
+    }
+    throw new SecurityException(
+        'Key type is not supported. This key ' +
+        'manager supports ' + EcdsaPrivateKeyManager.KEY_TYPE + '.');
+  }
+
+  /**
+   * @private
+   * @param {!PbKeyData} keyData
+   * @return {!PbEcdsaPrivateKey}
+   */
+  static getKeyProtoFromKeyData_(keyData) {
+    if (keyData.getTypeUrl() !== EcdsaPrivateKeyManager.KEY_TYPE) {
+      throw new SecurityException(
+          'Key type ' + keyData.getTypeUrl() +
+          ' is not supported. This key manager supports ' +
+          EcdsaPrivateKeyManager.KEY_TYPE + '.');
+    }
+    return EcdsaPrivateKeyManager.deserializePrivateKey_(
+        keyData.getValue_asU8());
+  }
+
+  /**
+   * @private
+   * @param {!Uint8Array} serializedPrivateKey
+   * @return {!PbEcdsaPrivateKey}
+   */
+  static deserializePrivateKey_(serializedPrivateKey) {
+    let /** !PbEcdsaPrivateKey */ key;
+    try {
+      key = PbEcdsaPrivateKey.deserializeBinary(serializedPrivateKey);
+    } catch (e) {
+      throw new SecurityException(
+          'Input cannot be parsed as ' + EcdsaPrivateKeyManager.KEY_TYPE +
+          ' key-proto.');
+    }
+    if (!key.getPublicKey() || !key.getKeyValue()) {
+      throw new SecurityException(
+          'Input cannot be parsed as ' + EcdsaPrivateKeyManager.KEY_TYPE +
+          ' key-proto.');
+    }
+    return key;
+  }
+}
+
+/** @const @private {!Object} */
+EcdsaPrivateKeyManager.SUPPORTED_PRIMITIVE_ = PublicKeySign;
+/** @const @public {string} */
+EcdsaPrivateKeyManager.KEY_TYPE =
+    'type.googleapis.com/google.crypto.tink.EcdsaPrivateKey';
+/** @const @private {number} */
+EcdsaPrivateKeyManager.VERSION_ = 0;
+
+exports = EcdsaPrivateKeyManager;
diff --git a/javascript/signature/ecdsa_private_key_manager_test.js b/javascript/signature/ecdsa_private_key_manager_test.js
new file mode 100644
index 0000000..1dcfda1
--- /dev/null
+++ b/javascript/signature/ecdsa_private_key_manager_test.js
@@ -0,0 +1,583 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.signature.EcdsaPrivateKeyManagerTest');
+goog.setTestOnly('tink.signature.EcdsaPrivateKeyManagerTest');
+
+const EcdsaPrivateKeyManager = goog.require('tink.signature.EcdsaPrivateKeyManager');
+const EcdsaPublicKeyManager = goog.require('tink.signature.EcdsaPublicKeyManager');
+const KeyManager = goog.require('tink.KeyManager');
+const PbEcdsaKeyFormat = goog.require('proto.google.crypto.tink.EcdsaKeyFormat');
+const PbEcdsaParams = goog.require('proto.google.crypto.tink.EcdsaParams');
+const PbEcdsaPrivateKey = goog.require('proto.google.crypto.tink.EcdsaPrivateKey');
+const PbEcdsaPublicKey = goog.require('proto.google.crypto.tink.EcdsaPublicKey');
+const PbEcdsaSignatureEncoding = goog.require('proto.google.crypto.tink.EcdsaSignatureEncoding');
+const PbEllipticCurveType = goog.require('proto.google.crypto.tink.EllipticCurveType');
+const PbHashType = goog.require('proto.google.crypto.tink.HashType');
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const PublicKeySign = goog.require('tink.PublicKeySign');
+const PublicKeyVerify = goog.require('tink.PublicKeyVerify');
+const Random = goog.require('tink.subtle.Random');
+const Registry = goog.require('tink.Registry');
+const TestCase = goog.require('goog.testing.TestCase');
+const testSuite = goog.require('goog.testing.testSuite');
+const userAgent = goog.require('goog.userAgent');
+
+const PRIVATE_KEY_TYPE =
+    'type.googleapis.com/google.crypto.tink.EcdsaPrivateKey';
+const PRIVATE_KEY_MATERIAL_TYPE = PbKeyData.KeyMaterialType.ASYMMETRIC_PRIVATE;
+const VERSION = 0;
+const PRIVATE_KEY_MANAGER_PRIMITIVE = PublicKeySign;
+
+const PUBLIC_KEY_TYPE = 'type.googleapis.com/google.crypto.tink.EcdsaPublicKey';
+const PUBLIC_KEY_MATERIAL_TYPE = PbKeyData.KeyMaterialType.ASYMMETRIC_PUBLIC;
+const PUBLIC_KEY_MANAGER_PRIMITIVE = PublicKeyVerify;
+
+testSuite({
+  shouldRunTests() {
+    return !userAgent.EDGE;  // b/120286783
+  },
+
+  setUp() {
+    // Use a generous promise timeout for running continuously.
+    TestCase.getActiveTestCase().promiseTimeout = 1000 * 1000;  // 1000s
+  },
+
+  tearDown() {
+    Registry.reset();
+    // Reset the promise timeout to default value.
+    TestCase.getActiveTestCase().promiseTimeout = 1000;  // 1s
+  },
+
+  async testNewKey_nullKeyFormat() {
+    const manager = new EcdsaPrivateKeyManager();
+
+    try {
+      await manager.getKeyFactory().newKey(null);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.nullKeyFormat(), e.toString());
+    }
+  },
+
+  async testNewKey_invalidSerializedKeyFormat() {
+    const invalidSerializedKeyFormat = new Uint8Array(0);
+    const manager = new EcdsaPrivateKeyManager();
+
+    try {
+      await manager.getKeyFactory().newKey(invalidSerializedKeyFormat);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.invalidSerializedKeyFormat(), e.toString());
+    }
+  },
+
+  async testNewKey_unsupportedKeyFormatProto() {
+    const unsupportedKeyFormatProto = new PbEcdsaParams();
+    const manager = new EcdsaPrivateKeyManager();
+
+    try {
+      await manager.getKeyFactory().newKey(unsupportedKeyFormatProto);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unsupportedKeyFormat(), e.toString());
+    }
+  },
+
+  async testNewKey_invalidFormat_missingParams() {
+    const invalidFormat = new PbEcdsaKeyFormat();
+    const manager = new EcdsaPrivateKeyManager();
+
+    try {
+      await manager.getKeyFactory().newKey(invalidFormat);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.invalidKeyFormatMissingParams(), e.toString());
+    }
+  },
+
+  async testNewKey_invalidFormat_invalidParams() {
+    const manager = new EcdsaPrivateKeyManager();
+
+    // Unknown encoding.
+    const invalidFormat = createKeyFormat();
+    invalidFormat.getParams().setEncoding(
+        PbEcdsaSignatureEncoding.UNKNOWN_ENCODING);
+    try {
+      await manager.getKeyFactory().newKey(invalidFormat);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unknownEncoding(), e.toString());
+    }
+    invalidFormat.getParams().setEncoding(PbEcdsaSignatureEncoding.DER);
+
+    // Unknown hash.
+    invalidFormat.getParams().setHashType(PbHashType.UNKNOWN_HASH);
+    try {
+      await manager.getKeyFactory().newKey(invalidFormat);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unknownHash(), e.toString());
+    }
+    invalidFormat.getParams().setHashType(PbHashType.SHA256);
+
+    // Unknown curve.
+    invalidFormat.getParams().setCurve(PbEllipticCurveType.UNKNOWN_CURVE);
+    try {
+      await manager.getKeyFactory().newKey(invalidFormat);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unknownCurve(), e.toString());
+    }
+
+    // Bad hash + curve combinations.
+    invalidFormat.getParams().setCurve(PbEllipticCurveType.NIST_P384);
+    try {
+      await manager.getKeyFactory().newKey(invalidFormat);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: expected SHA-384 or SHA-512 (because curve is P-384) but got SHA-256',
+          e.toString());
+    }
+
+    invalidFormat.getParams().setCurve(PbEllipticCurveType.NIST_P521);
+    try {
+      await manager.getKeyFactory().newKey(invalidFormat);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: expected SHA-512 (because curve is P-521) but got SHA-256',
+          e.toString());
+    }
+  },
+
+  async testNewKey_viaKeyFormat() {
+    const keyFormats = createTestSetOfKeyFormats();
+    const manager = new EcdsaPrivateKeyManager();
+
+    for (let keyFormat of keyFormats) {
+      const key = /** @type{!PbEcdsaPrivateKey} */ (
+          await manager.getKeyFactory().newKey(keyFormat));
+
+      assertObjectEquals(keyFormat.getParams(), key.getPublicKey().getParams());
+      // The keys are tested more in tests for getPrimitive method below, where
+      // the primitive based on the created key is tested.
+    }
+  },
+
+  async testNewKeyData_invalidSerializedKeyFormat() {
+    const serializedKeyFormats = [new Uint8Array(1), new Uint8Array(0)];
+    const manager = new EcdsaPrivateKeyManager();
+
+    const serializedKeyFormatsLength = serializedKeyFormats.length;
+    for (let i = 0; i < serializedKeyFormatsLength; i++) {
+      try {
+        await manager.getKeyFactory().newKeyData(serializedKeyFormats[i]);
+        fail(
+            'An exception should be thrown for the string: ' +
+            serializedKeyFormats[i]);
+      } catch (e) {
+        assertEquals(ExceptionText.invalidSerializedKeyFormat(), e.toString());
+        continue;
+      }
+    }
+  },
+
+  async testNewKeyData_fromValidKeyFormat() {
+    const keyFormats = createTestSetOfKeyFormats();
+    const manager = new EcdsaPrivateKeyManager();
+
+    for (let keyFormat of keyFormats) {
+      const serializedKeyFormat = keyFormat.serializeBinary();
+      const keyData = /** @type{!PbKeyData} */ (
+          await manager.getKeyFactory().newKeyData(serializedKeyFormat));
+
+      assertEquals(PRIVATE_KEY_TYPE, keyData.getTypeUrl());
+      assertEquals(PRIVATE_KEY_MATERIAL_TYPE, keyData.getKeyMaterialType());
+
+      const key = PbEcdsaPrivateKey.deserializeBinary(keyData.getValue());
+      assertObjectEquals(keyFormat.getParams(), key.getPublicKey().getParams());
+      // The keys are tested more in tests for getPrimitive method below, where
+      // the primitive based on the created key is tested.
+    }
+  },
+
+  testGetPublicKeyData_invalidPrivateKeySerialization() {
+    const manager = new EcdsaPrivateKeyManager();
+
+    const privateKey = new Uint8Array([0, 1]);  // not a serialized private key
+    try {
+      const factory = /** @type {!KeyManager.PrivateKeyFactory} */ (
+          manager.getKeyFactory());
+      factory.getPublicKeyData(privateKey);
+    } catch (e) {
+      assertEquals(ExceptionText.invalidSerializedKey(), e.toString());
+    }
+  },
+
+  async testGetPublicKeyData_shouldWork() {
+    const keyFormat = createKeyFormat();
+    const manager = new EcdsaPrivateKeyManager();
+
+    const privateKey = /** @type{!PbEcdsaPrivateKey} */ (
+        await manager.getKeyFactory().newKey(keyFormat));
+    const factory =
+        /** @type {!KeyManager.PrivateKeyFactory} */ (manager.getKeyFactory());
+    const publicKeyData =
+        factory.getPublicKeyData(privateKey.serializeBinary());
+
+    assertEquals(PUBLIC_KEY_TYPE, publicKeyData.getTypeUrl());
+    assertEquals(PUBLIC_KEY_MATERIAL_TYPE, publicKeyData.getKeyMaterialType());
+    const publicKey =
+        PbEcdsaPublicKey.deserializeBinary(publicKeyData.getValue());
+    assertObjectEquals(
+        privateKey.getPublicKey().getVersion(), publicKey.getVersion());
+    assertObjectEquals(
+        privateKey.getPublicKey().getParams(), publicKey.getParams());
+    assertObjectEquals(privateKey.getPublicKey().getX(), publicKey.getX());
+    assertObjectEquals(privateKey.getPublicKey().getY(), publicKey.getY());
+  },
+
+  async testGetPrimitive_unsupportedPrimitiveType() {
+    const manager = new EcdsaPrivateKeyManager();
+    const keyFormat = createKeyFormat();
+    const key = await manager.getKeyFactory().newKey(keyFormat);
+
+    try {
+      await manager.getPrimitive(PublicKeyVerify, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unsupportedPrimitive(), e.toString());
+    }
+  },
+
+  async testGetPrimitive_unsupportedKeyDataType() {
+    const manager = new EcdsaPrivateKeyManager();
+    const keyFormat = createKeyFormat();
+    const keyData =
+        (await manager.getKeyFactory().newKeyData(keyFormat.serializeBinary()))
+            .setTypeUrl('unsupported_key_type_url');
+
+    try {
+      await manager.getPrimitive(PRIVATE_KEY_MANAGER_PRIMITIVE, keyData);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          ExceptionText.unsupportedKeyType(keyData.getTypeUrl()), e.toString());
+    }
+  },
+
+  async testGetPrimitive_unsupportedKeyType() {
+    const manager = new EcdsaPrivateKeyManager();
+    let key = new PbEcdsaPublicKey();
+
+    try {
+      await manager.getPrimitive(PRIVATE_KEY_MANAGER_PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unsupportedKeyType(), e.toString());
+    }
+  },
+
+  async testGetPrimitive_highVersion() {
+    const manager = new EcdsaPrivateKeyManager();
+    const version = manager.getVersion() + 1;
+    const keyFormat = createKeyFormat();
+    const key =
+        (await manager.getKeyFactory().newKey(keyFormat)).setVersion(version);
+    try {
+      await manager.getPrimitive(PRIVATE_KEY_MANAGER_PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.versionOutOfBounds(), e.toString());
+    }
+  },
+
+  async testGetPrimitive_invalidParams() {
+    const manager = new EcdsaPrivateKeyManager();
+    const keyFormat = createKeyFormat();
+    const key = await manager.getKeyFactory().newKey(keyFormat);
+
+    // Unknown encoding.
+    key.getPublicKey().getParams().setEncoding(
+        PbEcdsaSignatureEncoding.UNKNOWN_ENCODING);
+    try {
+      await manager.getPrimitive(PRIVATE_KEY_MANAGER_PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unknownEncoding(), e.toString());
+    }
+    key.getPublicKey().getParams().setEncoding(PbEcdsaSignatureEncoding.DER);
+
+    // Unknown hash.
+    key.getPublicKey().getParams().setHashType(PbHashType.UNKNOWN_HASH);
+    try {
+      await manager.getPrimitive(PRIVATE_KEY_MANAGER_PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unknownHash(), e.toString());
+    }
+    key.getPublicKey().getParams().setHashType(PbHashType.SHA256);
+
+    // Unknown curve.
+    key.getPublicKey().getParams().setCurve(PbEllipticCurveType.UNKNOWN_CURVE);
+    try {
+      await manager.getPrimitive(PRIVATE_KEY_MANAGER_PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unknownCurve(), e.toString());
+    }
+
+    // Bad hash + curve combinations.
+    key.getPublicKey().getParams().setCurve(PbEllipticCurveType.NIST_P384);
+    try {
+      await manager.getPrimitive(PRIVATE_KEY_MANAGER_PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: expected SHA-384 or SHA-512 (because curve is P-384) but got SHA-256',
+          e.toString());
+    }
+
+    key.getPublicKey().getParams().setCurve(PbEllipticCurveType.NIST_P521);
+    try {
+      await manager.getPrimitive(PRIVATE_KEY_MANAGER_PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: expected SHA-512 (because curve is P-521) but got SHA-256',
+          e.toString());
+    }
+  },
+
+  async testGetPrimitive_invalidSerializedKey() {
+    const manager = new EcdsaPrivateKeyManager();
+    const keyFormat = createKeyFormat();
+    const keyData =
+        await manager.getKeyFactory().newKeyData(keyFormat.serializeBinary());
+
+
+    for (let i = 0; i < 2; ++i) {
+      // Set the value of keyData to something which is not a serialization of a
+      // proper key.
+      keyData.setValue(new Uint8Array(i));
+      try {
+        await manager.getPrimitive(PRIVATE_KEY_MANAGER_PRIMITIVE, keyData);
+        fail('An exception should be thrown ' + i.toString());
+      } catch (e) {
+        assertEquals(ExceptionText.invalidSerializedKey(), e.toString());
+      }
+    }
+  },
+
+  async testGetPrimitive_fromKey() {
+    const keyFormats = createTestSetOfKeyFormats();
+    const privateKeyManager = new EcdsaPrivateKeyManager();
+    const publicKeyManager = new EcdsaPublicKeyManager();
+
+    for (let keyFormat of keyFormats) {
+      const key = await privateKeyManager.getKeyFactory().newKey(keyFormat);
+
+      const /** !PublicKeyVerify */ publicKeyVerify =
+          await publicKeyManager.getPrimitive(
+              PUBLIC_KEY_MANAGER_PRIMITIVE, key.getPublicKey());
+      const /** !PublicKeySign */ publicKeySign =
+          await privateKeyManager.getPrimitive(
+              PRIVATE_KEY_MANAGER_PRIMITIVE, key);
+
+      const data = Random.randBytes(10);
+      const signature = await publicKeySign.sign(data);
+      const isValid = await publicKeyVerify.verify(signature, data);
+
+      assertTrue(isValid);
+    }
+  },
+
+  async testGetPrimitive_fromKeyData() {
+    const keyFormats = createTestSetOfKeyFormats();
+    const privateKeyManager = new EcdsaPrivateKeyManager();
+    const publicKeyManager = new EcdsaPublicKeyManager();
+
+    for (let keyFormat of keyFormats) {
+      const serializedKeyFormat = keyFormat.serializeBinary();
+      const keyData = await privateKeyManager.getKeyFactory().newKeyData(
+          serializedKeyFormat);
+      const factory = /** @type {!KeyManager.PrivateKeyFactory} */ (
+          privateKeyManager.getKeyFactory());
+      const publicKeyData = factory.getPublicKeyData(keyData.getValue_asU8());
+
+      const /** !PublicKeyVerify */ publicKeyVerify =
+          await publicKeyManager.getPrimitive(
+              PUBLIC_KEY_MANAGER_PRIMITIVE, publicKeyData);
+      const /** !PublicKeySign */ publicKeySign =
+          await privateKeyManager.getPrimitive(
+              PRIVATE_KEY_MANAGER_PRIMITIVE, keyData);
+
+      const data = Random.randBytes(10);
+      const signature = await publicKeySign.sign(data);
+      const isValid = await publicKeyVerify.verify(signature, data);
+
+      assertTrue(isValid);
+    }
+  },
+
+  testDoesSupport() {
+    const manager = new EcdsaPrivateKeyManager();
+    assertTrue(manager.doesSupport(PRIVATE_KEY_TYPE));
+  },
+
+  testGetKeyType() {
+    const manager = new EcdsaPrivateKeyManager();
+    assertEquals(PRIVATE_KEY_TYPE, manager.getKeyType());
+  },
+
+  testGetPrimitiveType() {
+    const manager = new EcdsaPrivateKeyManager();
+    assertEquals(PRIVATE_KEY_MANAGER_PRIMITIVE, manager.getPrimitiveType());
+  },
+
+  testGetVersion() {
+    const manager = new EcdsaPrivateKeyManager();
+    assertEquals(VERSION, manager.getVersion());
+  },
+});
+
+// Helper classes and functions
+class ExceptionText {
+  /** @return {string} */
+  static nullKeyFormat() {
+    return 'CustomError: Key format has to be non-null.';
+  }
+
+  /** @return {string} */
+  static invalidSerializedKeyFormat() {
+    return 'CustomError: Input cannot be parsed as ' + PRIVATE_KEY_TYPE +
+        ' key format proto.';
+  }
+
+  /** @return {string} */
+  static unsupportedPrimitive() {
+    return 'CustomError: Requested primitive type which is not supported by ' +
+        'this key manager.';
+  }
+
+  /** @return {string} */
+  static unsupportedKeyFormat() {
+    return 'CustomError: Expected ' + PRIVATE_KEY_TYPE + ' key format proto.';
+  }
+
+  /**
+   * @param {string=} opt_requestedKeyType
+   * @return {string}
+   */
+  static unsupportedKeyType(opt_requestedKeyType) {
+    const prefix = 'CustomError: Key type';
+    const suffix =
+        'is not supported. This key manager supports ' + PRIVATE_KEY_TYPE + '.';
+    if (opt_requestedKeyType) {
+      return prefix + ' ' + opt_requestedKeyType + ' ' + suffix;
+    } else {
+      return prefix + ' ' + suffix;
+    }
+  }
+
+  /** @return {string} */
+  static unknownEncoding() {
+    return 'CustomError: Invalid public key - missing signature encoding.';
+  }
+
+  /** @return {string} */
+  static unknownHash() {
+    return 'CustomError: Unknown hash type.';
+  }
+
+  /** @return {string} */
+  static unknownCurve() {
+    return 'CustomError: Unknown curve type.';
+  }
+
+  /** @return {string} */
+  static versionOutOfBounds() {
+    return 'CustomError: Version is out of bound, must be between 0 and ' +
+        VERSION + '.';
+  }
+
+  /** @return {string} */
+  static invalidKeyFormatMissingParams() {
+    return 'CustomError: Invalid key format - missing params.';
+  }
+
+  /** @return {string} */
+  static invalidSerializedKey() {
+    return 'CustomError: Input cannot be parsed as ' + PRIVATE_KEY_TYPE +
+        ' key-proto.';
+  }
+}
+
+/**
+ * @param {?PbEllipticCurveType} curveType
+ * @param {?PbHashType} hashType
+ * @param {?PbEcdsaSignatureEncoding} encoding
+ *
+ * @return {!PbEcdsaParams}
+ */
+const createParams = function(curveType, hashType, encoding) {
+  const params =
+      new PbEcdsaParams().setCurve(curveType).setHashType(hashType).setEncoding(
+          encoding);
+
+  return params;
+};
+
+/**
+ * @param {?PbEllipticCurveType=} opt_curveType (default: NIST_P256)
+ * @param {?PbHashType=} opt_hashType (default: SHA256)
+ * @param {?PbEcdsaSignatureEncoding=} opt_encodingType (default: DER)
+ *
+ * @return {!PbEcdsaKeyFormat}
+ */
+const createKeyFormat = function(
+    opt_curveType = PbEllipticCurveType.NIST_P256,
+    opt_hashType = PbHashType.SHA256,
+    opt_encodingType = PbEcdsaSignatureEncoding.DER) {
+  const keyFormat = new PbEcdsaKeyFormat().setParams(
+      createParams(opt_curveType, opt_hashType, opt_encodingType));
+  return keyFormat;
+};
+
+// Create set of key formats with all possible predefined/supported parameters.
+/** @return {!Array<!PbEcdsaKeyFormat>} */
+const createTestSetOfKeyFormats = function() {
+  const /** !Array<!PbEcdsaKeyFormat> */ keyFormats = [];
+  keyFormats.push(createKeyFormat(
+      PbEllipticCurveType.NIST_P256, PbHashType.SHA256,
+      PbEcdsaSignatureEncoding.DER));
+  keyFormats.push(createKeyFormat(
+      PbEllipticCurveType.NIST_P256, PbHashType.SHA256,
+      PbEcdsaSignatureEncoding.IEEE_P1363));
+  keyFormats.push(createKeyFormat(
+      PbEllipticCurveType.NIST_P384, PbHashType.SHA512,
+      PbEcdsaSignatureEncoding.DER));
+  keyFormats.push(createKeyFormat(
+      PbEllipticCurveType.NIST_P384, PbHashType.SHA512,
+      PbEcdsaSignatureEncoding.IEEE_P1363));
+  keyFormats.push(createKeyFormat(
+      PbEllipticCurveType.NIST_P521, PbHashType.SHA512,
+      PbEcdsaSignatureEncoding.DER));
+  keyFormats.push(createKeyFormat(
+      PbEllipticCurveType.NIST_P521, PbHashType.SHA512,
+      PbEcdsaSignatureEncoding.IEEE_P1363));
+  return keyFormats;
+};
diff --git a/javascript/signature/ecdsa_public_key_manager.js b/javascript/signature/ecdsa_public_key_manager.js
new file mode 100644
index 0000000..00ccb8d
--- /dev/null
+++ b/javascript/signature/ecdsa_public_key_manager.js
@@ -0,0 +1,155 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.signature.EcdsaPublicKeyManager');
+
+const EcdsaUtil = goog.require('tink.signature.EcdsaUtil');
+const EcdsaVerify = goog.require('tink.subtle.EcdsaVerify');
+const KeyManager = goog.require('tink.KeyManager');
+const PbEcdsaParams = goog.require('proto.google.crypto.tink.EcdsaParams');
+const PbEcdsaPublicKey = goog.require('proto.google.crypto.tink.EcdsaPublicKey');
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const PbMessage = goog.require('jspb.Message');
+const PublicKeyVerify = goog.require('tink.PublicKeyVerify');
+const SecurityException = goog.require('tink.exception.SecurityException');
+const Util = goog.require('tink.Util');
+
+/**
+ * @implements {KeyManager.KeyFactory}
+ * @final
+ */
+class EcdsaPublicKeyFactory {
+  /** @override */
+  newKey(keyFormat) {
+    throw new SecurityException(
+        'This operation is not supported for public keys. ' +
+        'Use EcdsaPrivateKeyManager to generate new keys.');
+  }
+
+  /** @override */
+  newKeyData(serializedKeyFormat) {
+    throw new SecurityException(
+        'This operation is not supported for public keys. ' +
+        'Use EcdsaPrivateKeyManager to generate new keys.');
+  }
+}
+
+
+/**
+ * @implements {KeyManager.KeyManager<PublicKeyVerify>}
+ * @final
+ */
+class EcdsaPublicKeyManager {
+  constructor() {
+    this.keyFactory = new EcdsaPublicKeyFactory();
+  }
+
+  /** @override */
+  async getPrimitive(primitiveType, key) {
+    if (primitiveType !== this.getPrimitiveType()) {
+      throw new SecurityException(
+          'Requested primitive type which is not ' +
+          'supported by this key manager.');
+    }
+
+    const keyProto = EcdsaPublicKeyManager.getKeyProto_(key);
+    EcdsaUtil.validatePublicKey(keyProto, this.getVersion());
+
+    const jwk = EcdsaUtil.getJsonWebKeyFromProto(keyProto);
+    const params = /** @type{!PbEcdsaParams} */ (keyProto.getParams());
+    const hash = Util.hashTypeProtoToString(params.getHashType());
+    const encoding = EcdsaUtil.encodingTypeProtoToEnum(params.getEncoding());
+    return await EcdsaVerify.newInstance(jwk, hash, encoding);
+  }
+
+  /** @override */
+  doesSupport(keyType) {
+    return keyType === this.getKeyType();
+  }
+
+  /** @override */
+  getKeyType() {
+    return EcdsaPublicKeyManager.KEY_TYPE;
+  }
+
+  /** @override */
+  getPrimitiveType() {
+    return EcdsaPublicKeyManager.SUPPORTED_PRIMITIVE_;
+  }
+
+  /** @override */
+  getVersion() {
+    return EcdsaPublicKeyManager.VERSION;
+  }
+
+  /** @override */
+  getKeyFactory() {
+    return this.keyFactory;
+  }
+
+  /**
+   * @private
+   * @param {!PbKeyData|!PbMessage} keyMaterial
+   * @return {!PbEcdsaPublicKey}
+   */
+  static getKeyProto_(keyMaterial) {
+    if (keyMaterial instanceof PbKeyData) {
+      return EcdsaPublicKeyManager.getKeyProtoFromKeyData_(keyMaterial);
+    }
+    if (keyMaterial instanceof PbEcdsaPublicKey) {
+      return keyMaterial;
+    }
+    throw new SecurityException(
+        'Key type is not supported. This key manager supports ' +
+        EcdsaPublicKeyManager.KEY_TYPE + '.');
+  }
+
+  /**
+   * @private
+   * @param {!PbKeyData} keyData
+   * @return {!PbEcdsaPublicKey}
+   */
+  static getKeyProtoFromKeyData_(keyData) {
+    if (keyData.getTypeUrl() !== EcdsaPublicKeyManager.KEY_TYPE) {
+      throw new SecurityException(
+          'Key type ' + keyData.getTypeUrl() + ' is not supported. This key ' +
+          'manager supports ' + EcdsaPublicKeyManager.KEY_TYPE + '.');
+    }
+
+    let /** !PbEcdsaPublicKey */ key;
+    try {
+      key = PbEcdsaPublicKey.deserializeBinary(keyData.getValue());
+    } catch (e) {
+      throw new SecurityException(
+          'Input cannot be parsed as ' + EcdsaPublicKeyManager.KEY_TYPE +
+          ' key-proto.');
+    }
+    if (!key.getParams() || !key.getX() || !key.getY()) {
+      throw new SecurityException(
+          'Input cannot be parsed as ' + EcdsaPublicKeyManager.KEY_TYPE +
+          ' key-proto.');
+    }
+    return key;
+  }
+}
+
+/** @const @public {string} */
+EcdsaPublicKeyManager.KEY_TYPE =
+    'type.googleapis.com/google.crypto.tink.EcdsaPublicKey';
+/** @const @private {!Object} */
+EcdsaPublicKeyManager.SUPPORTED_PRIMITIVE_ = PublicKeyVerify;
+/** @const @package {number} */
+EcdsaPublicKeyManager.VERSION = 0;
+
+exports = EcdsaPublicKeyManager;
diff --git a/javascript/signature/ecdsa_public_key_manager_test.js b/javascript/signature/ecdsa_public_key_manager_test.js
new file mode 100644
index 0000000..e9a5a05
--- /dev/null
+++ b/javascript/signature/ecdsa_public_key_manager_test.js
@@ -0,0 +1,453 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.signature.EcdsaPublicKeyManagerTest');
+goog.setTestOnly('tink.signature.EcdsaPublicKeyManagerTest');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const EcdsaPublicKeyManager = goog.require('tink.signature.EcdsaPublicKeyManager');
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const Mac = goog.require('tink.Mac');
+const PbEcdsaParams = goog.require('proto.google.crypto.tink.EcdsaParams');
+const PbEcdsaPublicKey = goog.require('proto.google.crypto.tink.EcdsaPublicKey');
+const PbEcdsaSignatureEncoding = goog.require('proto.google.crypto.tink.EcdsaSignatureEncoding');
+const PbEllipticCurveType = goog.require('proto.google.crypto.tink.EllipticCurveType');
+const PbHashType = goog.require('proto.google.crypto.tink.HashType');
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const PublicKeyVerify = goog.require('tink.PublicKeyVerify');
+const Registry = goog.require('tink.Registry');
+const TestCase = goog.require('goog.testing.TestCase');
+const Util = goog.require('tink.Util');
+const testSuite = goog.require('goog.testing.testSuite');
+const userAgent = goog.require('goog.userAgent');
+
+const KEY_TYPE = 'type.googleapis.com/google.crypto.tink.EcdsaPublicKey';
+const VERSION = 0;
+const PRIMITIVE = PublicKeyVerify;
+
+testSuite({
+  shouldRunTests() {
+    return !userAgent.EDGE;  // b/120286783
+  },
+
+  setUp() {
+    // Use a generous promise timeout for running continuously.
+    TestCase.getActiveTestCase().promiseTimeout = 1000 * 1000;  // 1000s
+  },
+
+  tearDown() {
+    Registry.reset();
+    // Reset the promise timeout to default value.
+    TestCase.getActiveTestCase().promiseTimeout = 1000;  // 1s
+  },
+
+  testNewKey() {
+    const manager = new EcdsaPublicKeyManager();
+
+    try {
+      manager.getKeyFactory().newKey();
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.notSupported(), e.toString());
+    }
+  },
+
+  testNewKeyData() {
+    const manager = new EcdsaPublicKeyManager();
+
+    try {
+      manager.getKeyFactory().newKeyData();
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.notSupported(), e.toString());
+    }
+  },
+
+  async testGetPrimitive_unsupportedPrimitiveType() {
+    const manager = new EcdsaPublicKeyManager();
+    const key = await createKey();
+
+    try {
+      await manager.getPrimitive(Mac, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unsupportedPrimitive(), e.toString());
+    }
+  },
+
+  async testGetPrimitive_unsupportedKeyDataType() {
+    const manager = new EcdsaPublicKeyManager();
+    const keyData =
+        (await createKeyData()).setTypeUrl('unsupported_key_type_url');
+
+    try {
+      await manager.getPrimitive(PRIMITIVE, keyData);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          ExceptionText.unsupportedKeyType(keyData.getTypeUrl()), e.toString());
+    }
+  },
+
+  async testGetPrimitive_unsupportedKeyType() {
+    const manager = new EcdsaPublicKeyManager();
+    let key = new PbEcdsaParams();
+
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unsupportedKeyType(), e.toString());
+    }
+  },
+
+  async testGetPrimitive_highVersion() {
+    const version = 1;
+    const manager = new EcdsaPublicKeyManager();
+    const key = (await createKey()).setVersion(version);
+
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.versionOutOfBounds(), e.toString());
+    }
+  },
+
+  async testGetPrimitive_missingParams() {
+    const manager = new EcdsaPublicKeyManager();
+    const key = (await createKey()).setParams(null);
+
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingParams(), e.toString());
+    }
+  },
+
+  async testGetPrimitive_invalidParams() {
+    const manager = new EcdsaPublicKeyManager();
+    const key = await createKey();
+
+    // Unknown encoding.
+    key.getParams().setEncoding(PbEcdsaSignatureEncoding.UNKNOWN_ENCODING);
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unknownEncoding(), e.toString());
+    }
+    key.getParams().setEncoding(PbEcdsaSignatureEncoding.DER);
+
+    // Unknown hash.
+    key.getParams().setHashType(PbHashType.UNKNOWN_HASH);
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unknownHash(), e.toString());
+    }
+    key.getParams().setHashType(PbHashType.SHA256);
+
+    // Unknown curve.
+    key.getParams().setCurve(PbEllipticCurveType.UNKNOWN_CURVE);
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.unknownCurve(), e.toString());
+    }
+
+    // Bad hash + curve combinations.
+    key.getParams().setCurve(PbEllipticCurveType.NIST_P384);
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: expected SHA-384 or SHA-512 (because curve is P-384) but got SHA-256',
+          e.toString());
+    }
+
+    key.getParams().setCurve(PbEllipticCurveType.NIST_P521);
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: expected SHA-512 (because curve is P-521) but got SHA-256',
+          e.toString());
+    }
+  },
+
+  async testGetPrimitive_invalidKey() {
+    const manager = new EcdsaPublicKeyManager();
+    const key = await createKey();
+    const x = key.getX();
+    key.setX(null);
+
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingXY(), e.toString());
+    }
+
+    key.setX(x);
+    key.setY(null);
+    try {
+      await manager.getPrimitive(PRIMITIVE, key);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(ExceptionText.missingXY(), e.toString());
+    }
+  },
+
+  async testGetPrimitive_invalidSerializedKey() {
+    const manager = new EcdsaPublicKeyManager();
+    const keyData = await createKeyData();
+
+    for (let i = 0; i < 2; ++i) {
+      // Set the value of keyData to something which is not a serialization of a
+      // proper key.
+      keyData.setValue(new Uint8Array(i));
+      try {
+        await manager.getPrimitive(PRIMITIVE, keyData);
+        fail('An exception should be thrown ' + i.toString());
+      } catch (e) {
+        assertEquals(ExceptionText.invalidSerializedKey(), e.toString());
+      }
+    }
+  },
+
+  // tests for getting primitive from valid key/keyData
+  async testGetPrimitive_fromKey() {
+    const manager = new EcdsaPublicKeyManager();
+    const keys = await createTestSetOfKeys();
+
+    for (let key of keys) {
+      await manager.getPrimitive(PRIMITIVE, key);
+    }
+  },
+
+  async testGetPrimitive_fromKeyData() {
+    const manager = new EcdsaPublicKeyManager();
+    const keyDatas = await createTestSetOfKeyDatas();
+
+    for (let key of keyDatas) {
+      await manager.getPrimitive(PRIMITIVE, key);
+    }
+  },
+
+  testDoesSupport() {
+    const manager = new EcdsaPublicKeyManager();
+
+    assertTrue(manager.doesSupport(KEY_TYPE));
+  },
+
+  testGetKeyType() {
+    const manager = new EcdsaPublicKeyManager();
+
+    assertEquals(KEY_TYPE, manager.getKeyType());
+  },
+
+  testGetPrimitiveType() {
+    const manager = new EcdsaPublicKeyManager();
+
+    assertEquals(PRIMITIVE, manager.getPrimitiveType());
+  },
+
+  testGetVersion() {
+    const manager = new EcdsaPublicKeyManager();
+
+    assertEquals(VERSION, manager.getVersion());
+  },
+});
+
+// Helper classes and functions
+class ExceptionText {
+  /** @return {string} */
+  static notSupported() {
+    return 'CustomError: This operation is not supported for public keys. ' +
+        'Use EcdsaPrivateKeyManager to generate new keys.';
+  }
+
+  /** @return {string} */
+  static unsupportedPrimitive() {
+    return 'CustomError: Requested primitive type which is not supported by ' +
+        'this key manager.';
+  }
+
+  /**
+   * @param {string=} opt_requestedKeyType
+   * @return {string}
+   */
+  static unsupportedKeyType(opt_requestedKeyType) {
+    const prefix = 'CustomError: Key type';
+    const suffix =
+        'is not supported. This key manager supports ' + KEY_TYPE + '.';
+    if (opt_requestedKeyType) {
+      return prefix + ' ' + opt_requestedKeyType + ' ' + suffix;
+    } else {
+      return prefix + ' ' + suffix;
+    }
+  }
+
+  /** @return {string} */
+  static versionOutOfBounds() {
+    return 'CustomError: Version is out of bound, must be between 0 and ' +
+        VERSION + '.';
+  }
+
+  /** @return {string} */
+  static unknownEncoding() {
+    return 'CustomError: Invalid public key - missing signature encoding.';
+  }
+
+  /** @return {string} */
+  static unknownHash() {
+    return 'CustomError: Unknown hash type.';
+  }
+
+  /** @return {string} */
+  static unknownCurve() {
+    return 'CustomError: Unknown curve type.';
+  }
+
+  /** @return {string} */
+  static missingParams() {
+    return 'CustomError: Invalid public key - missing params.';
+  }
+
+  /** @return {string} */
+  static missingXY() {
+    return 'CustomError: Invalid public key - missing value of X or Y.';
+  }
+
+  /** @return {string} */
+  static invalidSerializedKey() {
+    return 'CustomError: Input cannot be parsed as ' + KEY_TYPE + ' key-proto.';
+  }
+}
+
+/**
+ * @param {?PbEllipticCurveType} curveType
+ * @param {?PbHashType} hashType
+ * @param {?PbEcdsaSignatureEncoding} encoding
+ *
+ * @return {!PbEcdsaParams}
+ */
+const createParams = function(curveType, hashType, encoding) {
+  const params =
+      new PbEcdsaParams().setCurve(curveType).setHashType(hashType).setEncoding(
+          encoding);
+
+  return params;
+};
+
+
+/**
+ * @param {?PbEllipticCurveType=} opt_curveType (default: NIST_P256)
+ * @param {?PbHashType=} opt_hashType (default: SHA256)
+ * @param {?PbEcdsaSignatureEncoding=} opt_encoding (default: DER)
+ *
+ * @return {!Promise<!PbEcdsaPublicKey>}
+ */
+const createKey = async function(
+    opt_curveType = PbEllipticCurveType.NIST_P256,
+    opt_hashType = PbHashType.SHA256,
+    opt_encoding = PbEcdsaSignatureEncoding.DER) {
+  const curveSubtleType = Util.curveTypeProtoToSubtle(opt_curveType);
+  const curveName = EllipticCurves.curveToString(curveSubtleType);
+
+  const key = new PbEcdsaPublicKey().setVersion(0).setParams(
+      createParams(opt_curveType, opt_hashType, opt_encoding));
+
+  const keyPair = await EllipticCurves.generateKeyPair('ECDSA', curveName);
+  const publicKey = await EllipticCurves.exportCryptoKey(keyPair.publicKey);
+  key.setX(Bytes.fromBase64(publicKey['x'], /* opt_webSafe = */ true));
+  key.setY(Bytes.fromBase64(publicKey['y'], /* opt_webSafe = */ true));
+
+  return key;
+};
+
+/**
+ * @param {!PbEcdsaPublicKey} key
+ *
+ * @return {!PbKeyData}
+ */
+const createKeyDataFromKey = function(key) {
+  const keyData =
+      new PbKeyData()
+          .setTypeUrl(KEY_TYPE)
+          .setValue(key.serializeBinary())
+          .setKeyMaterialType(PbKeyData.KeyMaterialType.ASYMMETRIC_PUBLIC);
+
+  return keyData;
+};
+
+/**
+ * @param {?PbEllipticCurveType=} opt_curveType (default: NIST_P256)
+ * @param {?PbHashType=} opt_hashType (default: SHA256)
+ * @param {?PbEcdsaSignatureEncoding=} opt_encoding (default: DER)
+ *
+ * @return {!Promise<!PbKeyData>}
+ */
+const createKeyData =
+    async function(opt_curveType, opt_hashType, opt_encoding) {
+  const key = await createKey(opt_curveType, opt_hashType, opt_encoding);
+  return createKeyDataFromKey(key);
+};
+
+
+// Create set of keys with all possible predefined/supported parameters.
+/** @return {!Promise<!Array<!PbEcdsaPublicKey>>} */
+const createTestSetOfKeys = async function() {
+  const /** !Array<!PbEcdsaPublicKey> */ keys = [];
+  keys.push(await createKey(
+      PbEllipticCurveType.NIST_P256, PbHashType.SHA256,
+      PbEcdsaSignatureEncoding.DER));
+  keys.push(await createKey(
+      PbEllipticCurveType.NIST_P256, PbHashType.SHA256,
+      PbEcdsaSignatureEncoding.IEEE_P1363));
+  keys.push(await createKey(
+      PbEllipticCurveType.NIST_P384, PbHashType.SHA512,
+      PbEcdsaSignatureEncoding.DER));
+  keys.push(await createKey(
+      PbEllipticCurveType.NIST_P384, PbHashType.SHA512,
+      PbEcdsaSignatureEncoding.IEEE_P1363));
+  keys.push(await createKey(
+      PbEllipticCurveType.NIST_P521, PbHashType.SHA512,
+      PbEcdsaSignatureEncoding.DER));
+  keys.push(await createKey(
+      PbEllipticCurveType.NIST_P521, PbHashType.SHA512,
+      PbEcdsaSignatureEncoding.IEEE_P1363));
+  return keys;
+};
+
+// Create set of keyData protos with keys of all possible predefined/supported
+// parameters.
+/** @return {!Promise<!Array<!PbKeyData>>} */
+const createTestSetOfKeyDatas = async function() {
+  const keys = await createTestSetOfKeys();
+
+  const /** !Array<!PbKeyData> */ keyDatas = [];
+  for (let key of keys) {
+    const keyData = await createKeyDataFromKey(key);
+    keyDatas.push(keyData);
+  }
+
+  return keyDatas;
+};
diff --git a/javascript/signature/ecdsa_util.js b/javascript/signature/ecdsa_util.js
new file mode 100644
index 0000000..ae4beeb
--- /dev/null
+++ b/javascript/signature/ecdsa_util.js
@@ -0,0 +1,150 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.signature.EcdsaUtil');
+
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const PbEcdsaKeyFormat = goog.require('proto.google.crypto.tink.EcdsaKeyFormat');
+const PbEcdsaParams = goog.require('proto.google.crypto.tink.EcdsaParams');
+const PbEcdsaPrivateKey = goog.require('proto.google.crypto.tink.EcdsaPrivateKey');
+const PbEcdsaPublicKey = goog.require('proto.google.crypto.tink.EcdsaPublicKey');
+const PbEcdsaSignatureEncodingType = goog.require('proto.google.crypto.tink.EcdsaSignatureEncoding');
+const SecurityException = goog.require('tink.exception.SecurityException');
+const Util = goog.require('tink.Util');
+const Validators = goog.require('tink.subtle.Validators');
+
+/**
+ * @package
+ * @param {!PbEcdsaKeyFormat} keyFormat
+ */
+const validateKeyFormat = function(keyFormat) {
+  const params = keyFormat.getParams();
+  if (!params) {
+    throw new SecurityException('Invalid key format - missing params.');
+  }
+  validateParams(params);
+};
+
+/**
+ * @package
+ * @param {!PbEcdsaPrivateKey} key
+ * @param {number} privateKeyManagerVersion
+ * @param {number} publicKeyManagerVersion
+ */
+const validatePrivateKey = function(
+    key, privateKeyManagerVersion, publicKeyManagerVersion) {
+  Validators.validateVersion(key.getVersion(), privateKeyManagerVersion);
+
+  if (!key.getKeyValue()) {
+    throw new SecurityException(
+        'Invalid private key - missing private key value.');
+  }
+
+  const publicKey = key.getPublicKey();
+  if (!publicKey) {
+    throw new SecurityException(
+        'Invalid private key - missing public key information.');
+  }
+  validatePublicKey(publicKey, publicKeyManagerVersion);
+};
+
+/**
+ * @package
+ * @param {!PbEcdsaPublicKey} key
+ * @param {number} publicKeyManagerVersion
+ */
+const validatePublicKey = function(key, publicKeyManagerVersion) {
+  Validators.validateVersion(key.getVersion(), publicKeyManagerVersion);
+
+  const params = key.getParams();
+  if (!params) {
+    throw new SecurityException('Invalid public key - missing params.');
+  }
+  validateParams(params);
+
+  if (!key.getX() || !key.getY()) {
+    throw new SecurityException(
+        'Invalid public key - missing value of X or Y.');
+  }
+};
+
+/**
+ * @package
+ * @param {!PbEcdsaParams} params
+ */
+const validateParams = function(params) {
+  if (params.getEncoding() === PbEcdsaSignatureEncodingType.UNKNOWN_ENCODING) {
+    throw new SecurityException(
+        'Invalid public key - missing signature encoding.');
+  }
+
+  const hash = Util.hashTypeProtoToString(params.getHashType());
+  const curve = EllipticCurves.curveToString(
+      Util.curveTypeProtoToSubtle(params.getCurve()));
+  Validators.validateEcdsaParams(curve, hash);
+};
+
+/**
+ * @param {!PbEcdsaSignatureEncodingType} encodingTypeProto
+ * @return {!EllipticCurves.EcdsaSignatureEncodingType}
+ */
+const encodingTypeProtoToEnum = function(encodingTypeProto) {
+  switch (encodingTypeProto) {
+    case PbEcdsaSignatureEncodingType.DER:
+      return EllipticCurves.EcdsaSignatureEncodingType.DER;
+    case PbEcdsaSignatureEncodingType.IEEE_P1363:
+      return EllipticCurves.EcdsaSignatureEncodingType.IEEE_P1363;
+    default:
+      throw new SecurityException('Unknown ECDSA signature encoding type.');
+  }
+};
+
+/**
+ * WARNING: This method assumes that the given key proto is valid.
+ *
+ * @package
+ * @param {!PbEcdsaPrivateKey|!PbEcdsaPublicKey} key
+ * @return {!webCrypto.JsonWebKey}
+ */
+const getJsonWebKeyFromProto = function(key) {
+  let /** @type {!PbEcdsaPublicKey} */ publicKey;
+  let /** @type {!Uint8Array} */ d;
+  if (key instanceof PbEcdsaPrivateKey) {
+    publicKey = /** @type{!PbEcdsaPublicKey} */ (key.getPublicKey());
+  } else {
+    publicKey = key;
+  }
+
+  const curveType =
+      Util.curveTypeProtoToSubtle(publicKey.getParams().getCurve());
+  const expectedLength = EllipticCurves.fieldSizeInBytes(curveType);
+  let x = Util.bigEndianNumberToCorrectLength(
+      publicKey.getX_asU8(), expectedLength);
+  let y = Util.bigEndianNumberToCorrectLength(
+      publicKey.getY_asU8(), expectedLength);
+  if (key instanceof PbEcdsaPrivateKey) {
+    d = Util.bigEndianNumberToCorrectLength(
+        key.getKeyValue_asU8(), expectedLength);
+  }
+  return EllipticCurves.getJsonWebKey(curveType, x, y, d);
+};
+
+exports = {
+  encodingTypeProtoToEnum,
+  validateKeyFormat,
+  validateParams,
+  validatePublicKey,
+  validatePrivateKey,
+  getJsonWebKeyFromProto,
+};
diff --git a/javascript/signature/public_key_sign_wrapper.js b/javascript/signature/public_key_sign_wrapper.js
new file mode 100644
index 0000000..f3304a8
--- /dev/null
+++ b/javascript/signature/public_key_sign_wrapper.js
@@ -0,0 +1,86 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.signature.PublicKeySignWrapper');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const PrimitiveSet = goog.require('tink.PrimitiveSet');
+const PrimitiveWrapper = goog.require('tink.PrimitiveWrapper');
+const PublicKeySign = goog.require('tink.PublicKeySign');
+const SecurityException = goog.require('tink.exception.SecurityException');
+const Validators = goog.require('tink.subtle.Validators');
+
+/**
+ * @implements {PublicKeySign}
+ * @final
+ */
+class WrappedPublicKeySign {
+  // The constructor should be @private, but it is not supported by Closure
+  // (see https://github.com/google/closure-compiler/issues/2761).
+  /** @param {!PrimitiveSet.PrimitiveSet} primitiveSet */
+  constructor(primitiveSet) {
+    /** @private @const {!PrimitiveSet.PrimitiveSet} */
+    this.primitiveSet_ = primitiveSet;
+  }
+
+  /**
+   * @param {!PrimitiveSet.PrimitiveSet} primitiveSet
+   * @return {!PublicKeySign}
+   */
+  static newPublicKeySign(primitiveSet) {
+    if (!primitiveSet) {
+      throw new SecurityException('Primitive set has to be non-null.');
+    }
+    if (!primitiveSet.getPrimary()) {
+      throw new SecurityException('Primary has to be non-null.');
+    }
+    return new WrappedPublicKeySign(primitiveSet);
+  }
+
+  /** @override */
+  async sign(data) {
+    Validators.requireUint8Array(data);
+
+    const primitive = this.primitiveSet_.getPrimary().getPrimitive();
+    const signature = await primitive.sign(data);
+    const keyId = this.primitiveSet_.getPrimary().getIdentifier();
+
+    return Bytes.concat(keyId, signature);
+  }
+}
+
+/**
+ * @implements {PrimitiveWrapper<PublicKeySign>}
+ */
+class PublicKeySignWrapper {
+  // The constructor should be @private, but it is not supported by Closure
+  // (see https://github.com/google/closure-compiler/issues/2761).
+  constructor() {}
+
+  /**
+   * @override
+   */
+  wrap(primitiveSet) {
+    return WrappedPublicKeySign.newPublicKeySign(primitiveSet);
+  }
+
+  /**
+   * @override
+   */
+  getPrimitiveType() {
+    return PublicKeySign;
+  }
+}
+
+exports = PublicKeySignWrapper;
diff --git a/javascript/signature/public_key_sign_wrapper_test.js b/javascript/signature/public_key_sign_wrapper_test.js
new file mode 100644
index 0000000..a603d0b
--- /dev/null
+++ b/javascript/signature/public_key_sign_wrapper_test.js
@@ -0,0 +1,179 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.signature.PublicKeySignWrapperTest');
+goog.setTestOnly('tink.signature.PublicKeySignWrapperTest');
+
+const CryptoFormat = goog.require('tink.CryptoFormat');
+const PbKeyStatusType = goog.require('proto.google.crypto.tink.KeyStatusType');
+const PbKeysetKey = goog.require('proto.google.crypto.tink.Keyset.Key');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+const PrimitiveSet = goog.require('tink.PrimitiveSet');
+const PublicKeySign = goog.require('tink.PublicKeySign');
+const PublicKeySignWrapper = goog.require('tink.signature.PublicKeySignWrapper');
+const Random = goog.require('tink.subtle.Random');
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+  testNewPublicKeySign_nullPrimitiveSet() {
+    try {
+      new PublicKeySignWrapper().wrap(null);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: Primitive set has to be non-null.', e.toString());
+    }
+  },
+
+  testNewPublicKeySign_primitiveSetWithoutPrimary() {
+    const primitiveSet = createDummyPrimitiveSet(/* opt_withPrimary = */ false);
+    try {
+      new PublicKeySignWrapper().wrap(primitiveSet);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals('CustomError: Primary has to be non-null.', e.toString());
+    }
+  },
+
+  testNewPublicKeySign_shouldWork() {
+    const primitiveSet = createDummyPrimitiveSet();
+    const publicKeySign = new PublicKeySignWrapper().wrap(primitiveSet);
+    assertTrue(publicKeySign != null && publicKeySign != undefined);
+  },
+
+  async testEncrypt_nullPlaintext() {
+    const primitiveSet = createDummyPrimitiveSet();
+    const publicKeySign = new PublicKeySignWrapper().wrap(primitiveSet);
+
+    try {
+      await publicKeySign.sign(null);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+  },
+
+  async testSign_shouldWork() {
+    const primitiveSet = createDummyPrimitiveSet();
+    const publicKeySign = new PublicKeySignWrapper().wrap(primitiveSet);
+
+    const data = Random.randBytes(10);
+
+    const signature = await publicKeySign.sign(data);
+    assertTrue(signature != null);
+
+    // Signature should begin with primary key output prefix.
+    assertObjectEquals(
+        primitiveSet.getPrimary().getIdentifier(),
+        signature.subarray(0, CryptoFormat.NON_RAW_PREFIX_SIZE));
+  },
+});
+
+/**
+ * Class holding texts for each type of exception.
+ * @final
+ */
+class ExceptionText {
+  /** @return {string} */
+  static nullPrimitiveSet() {
+    return 'CustomError: Primitive set has to be non-null.';
+  }
+  /** @return {string} */
+  static primitiveSetWithoutPrimary() {
+    return 'CustomError: Primary has to be non-null.';
+  }
+  /** @return {string} */
+  static nullPlaintext() {
+    return 'CustomError: Plaintext has to be non-null.';
+  }
+}
+
+/**
+ * Function for creating keys for testing purposes.
+ *
+ * @param {number} keyId
+ * @param {!PbOutputPrefixType} outputPrefix
+ * @param {boolean} enabled
+ *
+ * @return {!PbKeysetKey}
+ */
+const createDummyKeysetKey = function(keyId, outputPrefix, enabled) {
+  let key = new PbKeysetKey();
+
+  if (enabled) {
+    key.setStatus(PbKeyStatusType.ENABLED);
+  } else {
+    key.setStatus(PbKeyStatusType.DISABLED);
+  }
+
+  key.setOutputPrefixType(outputPrefix);
+  key.setKeyId(keyId);
+
+  return key;
+};
+
+/**
+ * Creates a primitive set with 'numberOfPrimitives' primitives. The keys
+ * corresponding to the primitives have ids from the set
+ * [1, ..., numberOfPrimitives] and the primitive corresponding to key with id
+ * 'numberOfPrimitives' is set to be primary whenever opt_withPrimary is set to
+ * true (where true is the default value).
+ *
+ * @param {boolean=} opt_withPrimary (default: true)
+ * @return {!PrimitiveSet.PrimitiveSet}
+ */
+const createDummyPrimitiveSet = function(opt_withPrimary = true) {
+  const numberOfPrimitives = 5;
+
+  const primitiveSet = new PrimitiveSet.PrimitiveSet();
+  for (let i = 1; i < numberOfPrimitives; i++) {
+    let /** @type {!PbOutputPrefixType} */ outputPrefix;
+    switch (i % 3) {
+      case 0:
+        outputPrefix = PbOutputPrefixType.TINK;
+        break;
+      case 1:
+        outputPrefix = PbOutputPrefixType.LEGACY;
+        break;
+      default:
+        outputPrefix = PbOutputPrefixType.RAW;
+    }
+    const key =
+        createDummyKeysetKey(i, outputPrefix, /* enabled = */ i % 4 < 2);
+    const publicKeySign = new DummyPublicKeySign();
+    primitiveSet.addPrimitive(publicKeySign, key);
+  }
+
+  const key = createDummyKeysetKey(
+      numberOfPrimitives, PbOutputPrefixType.TINK, /* enabled = */ true);
+  const publicKeySign = new DummyPublicKeySign();
+  const entry = primitiveSet.addPrimitive(publicKeySign, key);
+  if (opt_withPrimary) {
+    primitiveSet.setPrimary(entry);
+  }
+
+  return primitiveSet;
+};
+
+/**
+ * @implements {PublicKeySign}
+ * @final
+ */
+class DummyPublicKeySign {
+  /** @override */
+  async sign(data) {
+    return data;
+  }
+}
diff --git a/javascript/signature/public_key_verify_wrapper.js b/javascript/signature/public_key_verify_wrapper.js
new file mode 100644
index 0000000..b1d6cb4
--- /dev/null
+++ b/javascript/signature/public_key_verify_wrapper.js
@@ -0,0 +1,132 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.signature.PublicKeyVerifyWrapper');
+
+const CryptoFormat = goog.require('tink.CryptoFormat');
+const PbKeyStatusType = goog.require('proto.google.crypto.tink.KeyStatusType');
+const PrimitiveSet = goog.require('tink.PrimitiveSet');
+const PrimitiveWrapper = goog.require('tink.PrimitiveWrapper');
+const PublicKeyVerify = goog.require('tink.PublicKeyVerify');
+const SecurityException = goog.require('tink.exception.SecurityException');
+const Validators = goog.require('tink.subtle.Validators');
+
+/**
+ * @implements {PublicKeyVerify}
+ * @final
+ */
+class WrappedPublicKeyVerify {
+  // The constructor should be @private, but it is not supported by Closure
+  // (see https://github.com/google/closure-compiler/issues/2761).
+  /** @param {!PrimitiveSet.PrimitiveSet} primitiveSet */
+  constructor(primitiveSet) {
+    /** @private @const {!PrimitiveSet.PrimitiveSet} */
+    this.primitiveSet_ = primitiveSet;
+  }
+
+  /**
+   * @param {!PrimitiveSet.PrimitiveSet} primitiveSet
+   * @return {!PublicKeyVerify}
+   */
+  static newPublicKeyVerify(primitiveSet) {
+    if (!primitiveSet) {
+      throw new SecurityException('Primitive set has to be non-null.');
+    }
+    return new WrappedPublicKeyVerify(primitiveSet);
+  }
+
+  /** @override */
+  async verify(signature, data) {
+    Validators.requireUint8Array(signature);
+    Validators.requireUint8Array(data);
+
+    if (signature.length > CryptoFormat.NON_RAW_PREFIX_SIZE) {
+      const keyId = signature.subarray(0, CryptoFormat.NON_RAW_PREFIX_SIZE);
+      const primitives = await this.primitiveSet_.getPrimitives(keyId);
+
+      const rawSignature = signature.subarray(
+          CryptoFormat.NON_RAW_PREFIX_SIZE, signature.length);
+      let /** @type {boolean} */ isValid;
+      try {
+        isValid = await this.tryVerification_(primitives, rawSignature, data);
+      } catch (e) {
+        // Ignored.
+      }
+
+      if (isValid) {
+        return isValid;
+      }
+    }
+
+    const primitives = await this.primitiveSet_.getRawPrimitives();
+    return await this.tryVerification_(primitives, signature, data);
+  }
+
+  /**
+   * Tries to verify the signature using each entry in primitives. It
+   * returns false if no entry succeeds.
+   *
+   * @param {!Array<!PrimitiveSet.Entry>} primitives
+   * @param {!Uint8Array} signature
+   * @param {!Uint8Array} data
+   *
+   * @return {!Promise<boolean>}
+   * @private
+   */
+  async tryVerification_(primitives, signature, data) {
+    const primitivesLength = primitives.length;
+    for (let i = 0; i < primitivesLength; i++) {
+      if (primitives[i].getKeyStatus() != PbKeyStatusType.ENABLED) {
+        continue;
+      }
+      const primitive = primitives[i].getPrimitive();
+
+      let /** @type {boolean} */ isValid;
+      try {
+        isValid = await primitive.verify(signature, data);
+      } catch (e) {
+        continue;
+      }
+      if (isValid) {
+        return isValid;
+      }
+    }
+    return false;
+  }
+}
+
+/**
+ * @implements {PrimitiveWrapper<PublicKeyVerify>}
+ */
+class PublicKeyVerifyWrapper {
+  // The constructor should be @private, but it is not supported by Closure
+  // (see https://github.com/google/closure-compiler/issues/2761).
+  constructor() {}
+
+  /**
+   * @override
+   */
+  wrap(primitiveSet) {
+    return WrappedPublicKeyVerify.newPublicKeyVerify(primitiveSet);
+  }
+
+  /**
+   * @override
+   */
+  getPrimitiveType() {
+    return PublicKeyVerify;
+  }
+}
+
+exports = PublicKeyVerifyWrapper;
diff --git a/javascript/signature/public_key_verify_wrapper_test.js b/javascript/signature/public_key_verify_wrapper_test.js
new file mode 100644
index 0000000..5531026
--- /dev/null
+++ b/javascript/signature/public_key_verify_wrapper_test.js
@@ -0,0 +1,259 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.signature.PublicKeyVerifyWrapperTest');
+goog.setTestOnly('tink.signature.PublicKeyVerifyWrapperTest');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const PbKeyStatusType = goog.require('proto.google.crypto.tink.KeyStatusType');
+const PbKeysetKey = goog.require('proto.google.crypto.tink.Keyset.Key');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+const PrimitiveSet = goog.require('tink.PrimitiveSet');
+const PublicKeySign = goog.require('tink.PublicKeySign');
+const PublicKeySignWrapper = goog.require('tink.signature.PublicKeySignWrapper');
+const PublicKeyVerify = goog.require('tink.PublicKeyVerify');
+const PublicKeyVerifyWrapper = goog.require('tink.signature.PublicKeyVerifyWrapper');
+const Random = goog.require('tink.subtle.Random');
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+  async testNewPublicKeyVerify_nullPrimitiveSet() {
+    try {
+      new PublicKeyVerifyWrapper().wrap(null);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: Primitive set has to be non-null.', e.toString());
+    }
+  },
+
+  async testVerify_withNullSignature() {
+    const primitiveSets = createDummyPrimitiveSets();
+    const primitiveSet = primitiveSets['publicPrimitiveSet'];
+    const publicKeyVerify = new PublicKeyVerifyWrapper().wrap(primitiveSet);
+
+    try {
+      await publicKeyVerify.verify(null, Random.randBytes(10));
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+  },
+
+  async testVerify_withNullData() {
+    const primitiveSets = createDummyPrimitiveSets();
+    const primitiveSet = primitiveSets['publicPrimitiveSet'];
+    const publicKeyVerify = new PublicKeyVerifyWrapper().wrap(primitiveSet);
+
+    try {
+      await publicKeyVerify.verify(Random.randBytes(10), null);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+  },
+
+  async testVerify_shouldWork() {
+    const primitiveSets = createDummyPrimitiveSets();
+    const data = Random.randBytes(10);
+    // As keys are just dummy keys which do not contain key data, the same key
+    // is used for both sign and verify.
+    const key = createDummyKeysetKey(
+        /** keyId = */ 0xFFFFFFFF, PbOutputPrefixType.TINK,
+        /** enabled = */ true);
+    const signatureSuffix = Random.randBytes(10);
+
+    // Get the signature
+    const privatePrimitiveSet = primitiveSets['privatePrimitiveSet'];
+    const signPrimitive = new DummyPublicKeySign(signatureSuffix);
+    const entry = privatePrimitiveSet.addPrimitive(signPrimitive, key);
+    // Has to be set to primary as then it is used in signing.
+    privatePrimitiveSet.setPrimary(entry);
+    const publicKeySign = new PublicKeySignWrapper().wrap(privatePrimitiveSet);
+    const signature = await publicKeySign.sign(data);
+
+    // Create a primitive set containing the primitives which can be used for
+    // verification. Add also few more primitives with the same key as the
+    // primitive set should verify the signature whenever there is at least
+    // one primitive which does not fail to verify the signature.
+    const publicPrimitiveSet = primitiveSets['publicPrimitiveSet'];
+    const verifyPrimitive = new DummyPublicKeyVerify(signatureSuffix);
+    publicPrimitiveSet.addPrimitive(
+        new DummyPublicKeyVerify(Random.randBytes(5)), key);
+    publicPrimitiveSet.addPrimitive(verifyPrimitive, key);
+    publicPrimitiveSet.addPrimitive(
+        new DummyPublicKeyVerify(Random.randBytes(5)), key);
+
+    // Verify the signature.
+    const publicKeyVerify =
+        new PublicKeyVerifyWrapper().wrap(publicPrimitiveSet);
+
+    const isValid = await publicKeyVerify.verify(signature, data);
+    assertTrue(isValid);
+  },
+
+  async testVerify_rawPrimitive() {
+    const primitiveSets = createDummyPrimitiveSets();
+    const data = Random.randBytes(10);
+    const key = createDummyKeysetKey(
+        /** keyId = */ 0xFFFFFFFF, PbOutputPrefixType.RAW,
+        /** enabled = */ true);
+    const signatureSuffix = Random.randBytes(10);
+
+    // Get the signature.
+    const signPrimitive = new DummyPublicKeySign(signatureSuffix);
+    const signature = await signPrimitive.sign(data);
+
+    // Verify the signature.
+    const primitiveSet = primitiveSets['publicPrimitiveSet'];
+    const verifyPrimitive = new DummyPublicKeyVerify(signatureSuffix);
+    primitiveSet.addPrimitive(verifyPrimitive, key);
+    const publicKeyVerify = new PublicKeyVerifyWrapper().wrap(primitiveSet);
+
+    const isValid = await publicKeyVerify.verify(signature, data);
+    assertTrue(isValid);
+  },
+
+  async testVerify_withDisabledPrimitive() {
+    const primitiveSets = createDummyPrimitiveSets();
+    const data = Random.randBytes(10);
+    const key = createDummyKeysetKey(
+        /** keyId = */ 0xFFFFFFFF, PbOutputPrefixType.RAW,
+        /** enabled = */ false);
+    const signatureSuffix = new Uint8Array([0, 0, 0, 0xFF]);
+
+    const signPrimitive = new DummyPublicKeySign(signatureSuffix);
+    const signature = await signPrimitive.sign(data);
+
+    const primitiveSet = primitiveSets['publicPrimitiveSet'];
+    const verifyPrimitive = new DummyPublicKeyVerify(signatureSuffix);
+    primitiveSet.addPrimitive(verifyPrimitive, key);
+    const publicKeyVerify = new PublicKeyVerifyWrapper().wrap(primitiveSet);
+
+    const isValid = await publicKeyVerify.verify(signature, data);
+    assertFalse(isValid);
+  },
+});
+
+/**
+ * Function for creating keys for testing purposes.
+ *
+ * @param {number} keyId
+ * @param {!PbOutputPrefixType} outputPrefix
+ * @param {boolean} enabled
+ *
+ * @return {!PbKeysetKey}
+ */
+const createDummyKeysetKey = function(keyId, outputPrefix, enabled) {
+  let key = new PbKeysetKey();
+
+  if (enabled) {
+    key.setStatus(PbKeyStatusType.ENABLED);
+  } else {
+    key.setStatus(PbKeyStatusType.DISABLED);
+  }
+
+  key.setOutputPrefixType(outputPrefix);
+  key.setKeyId(keyId);
+
+  return key;
+};
+
+/**
+ * Creates a primitive sets for PublicKeySign and PublicKeyVerify with
+ * 'numberOfPrimitives' primitives. The keys corresponding to the primitives
+ * have ids from the set [1, ..., numberOfPrimitives] and the primitive
+ * corresponding to key with id 'numberOfPrimitives' is set to be primary
+ * whenever opt_withPrimary is set to true (where true is the default value).
+ *
+ * @param {boolean=} opt_withPrimary
+ * @return {{publicPrimitiveSet:!PrimitiveSet.PrimitiveSet,
+ *     privatePrimitiveSet:!PrimitiveSet.PrimitiveSet}}
+ */
+const createDummyPrimitiveSets = function(opt_withPrimary = true) {
+  const numberOfPrimitives = 5;
+
+  const publicPrimitiveSet = new PrimitiveSet.PrimitiveSet();
+  const privatePrimitiveSet = new PrimitiveSet.PrimitiveSet();
+  for (let i = 1; i < numberOfPrimitives; i++) {
+    let /** @type {!PbOutputPrefixType} */ outputPrefix;
+    switch (i % 3) {
+      case 0:
+        outputPrefix = PbOutputPrefixType.TINK;
+        break;
+      case 1:
+        outputPrefix = PbOutputPrefixType.LEGACY;
+        break;
+      default:
+        outputPrefix = PbOutputPrefixType.RAW;
+    }
+    const key =
+        createDummyKeysetKey(i, outputPrefix, /* enabled = */ i % 4 < 2);
+    const signatureSuffix = new Uint8Array([0, 0, i]);
+    const publicKeySign = new DummyPublicKeySign(signatureSuffix);
+    privatePrimitiveSet.addPrimitive(publicKeySign, key);
+    const publicKeyVerify = new DummyPublicKeyVerify(signatureSuffix);
+    publicPrimitiveSet.addPrimitive(publicKeyVerify, key);
+  }
+
+  const key = createDummyKeysetKey(
+      numberOfPrimitives, PbOutputPrefixType.TINK, /* enabled = */ true);
+  const signatureSuffix = new Uint8Array([0, 0, numberOfPrimitives]);
+  const publicKeySign = new DummyPublicKeySign(signatureSuffix);
+  const signEntry = privatePrimitiveSet.addPrimitive(publicKeySign, key);
+  const publicKeyVerify = new DummyPublicKeyVerify(signatureSuffix);
+  const verifyEntry = publicPrimitiveSet.addPrimitive(publicKeyVerify, key);
+  if (opt_withPrimary) {
+    publicPrimitiveSet.setPrimary(verifyEntry);
+    privatePrimitiveSet.setPrimary(signEntry);
+  }
+
+  return {
+    'publicPrimitiveSet': publicPrimitiveSet,
+    'privatePrimitiveSet': privatePrimitiveSet
+  };
+};
+
+/**
+ * @implements {PublicKeySign}
+ * @final
+ */
+class DummyPublicKeySign {
+  /** @param {!Uint8Array} signatureSuffix */
+  constructor(signatureSuffix) {
+    this.signatureSuffix_ = signatureSuffix;
+  }
+  /** @override */
+  async sign(data) {
+    return Bytes.concat(data, this.signatureSuffix_);
+  }
+}
+
+/**
+ * @implements {PublicKeyVerify}
+ * @final
+ */
+class DummyPublicKeyVerify {
+  /** @param {!Uint8Array} signatureSuffix */
+  constructor(signatureSuffix) {
+    this.signatureSuffix_ = signatureSuffix;
+  }
+
+  /** @override */
+  async verify(signature, data) {
+    return Bytes.isEqual(Bytes.concat(data, this.signatureSuffix_), signature);
+  }
+}
diff --git a/javascript/signature/signature_config.js b/javascript/signature/signature_config.js
new file mode 100644
index 0000000..3f987b2
--- /dev/null
+++ b/javascript/signature/signature_config.js
@@ -0,0 +1,58 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.signature.SignatureConfig');
+
+const EcdsaPrivateKeyManager = goog.require('tink.signature.EcdsaPrivateKeyManager');
+const EcdsaPublicKeyManager = goog.require('tink.signature.EcdsaPublicKeyManager');
+const PublicKeySignWrapper = goog.require('tink.signature.PublicKeySignWrapper');
+const PublicKeyVerifyWrapper = goog.require('tink.signature.PublicKeyVerifyWrapper');
+const Registry = goog.require('tink.Registry');
+
+// Static methods and constants for registering with the Registry all instances
+// of key types for digital signature supported in a particular release of Tink.
+//
+// To register all key types from the current Tink release one can do:
+//
+// SignatureConfig.register();
+//
+
+/**
+ * Registers key managers for all PublicKeyVerify and PublicKeySign key types
+ * from the current Tink release.
+ */
+const register = function() {
+  Registry.registerKeyManager(new EcdsaPrivateKeyManager());
+  Registry.registerKeyManager(new EcdsaPublicKeyManager());
+  Registry.registerPrimitiveWrapper(new PublicKeySignWrapper());
+  Registry.registerPrimitiveWrapper(new PublicKeyVerifyWrapper());
+};
+
+/** @const {string} */
+const VERIFY_PRIMITIVE_NAME = 'PublicKeyVerify';
+/** @const {string} */
+const ECDSA_PUBLIC_KEY_TYPE = EcdsaPublicKeyManager.KEY_TYPE;
+
+/** @const {string} */
+const SIGN_PRIMITIVE_NAME = 'PublicKeySign';
+/** @const {string} */
+const ECDSA_PRIVATE_KEY_TYPE = EcdsaPrivateKeyManager.KEY_TYPE;
+
+exports = {
+  register,
+  VERIFY_PRIMITIVE_NAME,
+  ECDSA_PUBLIC_KEY_TYPE,
+  SIGN_PRIMITIVE_NAME,
+  ECDSA_PRIVATE_KEY_TYPE,
+};
diff --git a/javascript/signature/signature_config_test.js b/javascript/signature/signature_config_test.js
new file mode 100644
index 0000000..b444808
--- /dev/null
+++ b/javascript/signature/signature_config_test.js
@@ -0,0 +1,173 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.signature.SignatureConfigTest');
+goog.setTestOnly('tink.signature.SignatureConfigTest');
+
+const EcdsaPrivateKeyManager = goog.require('tink.signature.EcdsaPrivateKeyManager');
+const EcdsaPublicKeyManager = goog.require('tink.signature.EcdsaPublicKeyManager');
+const KeysetHandle = goog.require('tink.KeysetHandle');
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const PbKeyStatusType = goog.require('proto.google.crypto.tink.KeyStatusType');
+const PbKeyTemplate = goog.require('proto.google.crypto.tink.KeyTemplate');
+const PbKeyset = goog.require('proto.google.crypto.tink.Keyset');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+const PublicKeySign = goog.require('tink.PublicKeySign');
+const PublicKeyVerify = goog.require('tink.PublicKeyVerify');
+const Random = goog.require('tink.subtle.Random');
+const Registry = goog.require('tink.Registry');
+const SignatureConfig = goog.require('tink.signature.SignatureConfig');
+const SignatureKeyTemplates = goog.require('tink.signature.SignatureKeyTemplates');
+const TestCase = goog.require('goog.testing.TestCase');
+const testSuite = goog.require('goog.testing.testSuite');
+const userAgent = goog.require('goog.userAgent');
+
+testSuite({
+  shouldRunTests() {
+    return !userAgent.EDGE;  // b/120286783
+  },
+
+  setUp() {
+    // Use a generous promise timeout for running continuously.
+    TestCase.getActiveTestCase().promiseTimeout = 1000 * 1000;  // 1000s
+  },
+
+  tearDown() {
+    Registry.reset();
+    // Reset the promise timeout to default value.
+    TestCase.getActiveTestCase().promiseTimeout = 1000;  // 1s
+  },
+
+  testConstants() {
+    assertEquals(VERIFY_PRIMITIVE_NAME, SignatureConfig.VERIFY_PRIMITIVE_NAME);
+    assertEquals(SIGN_PRIMITIVE_NAME, SignatureConfig.SIGN_PRIMITIVE_NAME);
+
+    assertEquals(ECDSA_PUBLIC_KEY_TYPE, SignatureConfig.ECDSA_PUBLIC_KEY_TYPE);
+    assertEquals(
+        ECDSA_PRIVATE_KEY_TYPE, SignatureConfig.ECDSA_PRIVATE_KEY_TYPE);
+  },
+
+
+  testRegister_correctKeyManagersWereRegistered() {
+    SignatureConfig.register();
+
+    // Test that the corresponding key managers were registered.
+    const publicKeyManager = Registry.getKeyManager(ECDSA_PUBLIC_KEY_TYPE);
+    assertTrue(publicKeyManager instanceof EcdsaPublicKeyManager);
+
+    const privateKeyManager = Registry.getKeyManager(ECDSA_PRIVATE_KEY_TYPE);
+    assertTrue(privateKeyManager instanceof EcdsaPrivateKeyManager);
+  },
+
+  // Check that everything was registered correctly and thus new keys may be
+  // generated using the predefined key templates and then they may be used for
+  // encryption and decryption.
+  async testRegister_predefinedTemplatesShouldWork() {
+    SignatureConfig.register();
+    let templates = [
+      SignatureKeyTemplates.ecdsaP256(),
+      SignatureKeyTemplates.ecdsaP256IeeeEncoding(),
+      SignatureKeyTemplates.ecdsaP384(),
+      SignatureKeyTemplates.ecdsaP384IeeeEncoding(),
+      SignatureKeyTemplates.ecdsaP521(),
+      SignatureKeyTemplates.ecdsaP521IeeeEncoding(),
+
+    ];
+    // The following function adds all templates in uncompiled tests, thus if
+    // a new template is added without updating SignatureConfig correctly then
+    // at least the uncompiled tests should fail. But the templates are included
+    // also above as the following function does not add anything to the list in
+    // compiled code.
+    templates =
+        templates.concat(getListOfTemplatesFromSignatureKeyTemplatesClass());
+
+    for (let template of templates) {
+      const privateKeyData = await Registry.newKeyData(template);
+      const privateKeysetHandle = createKeysetHandleFromKeyData(privateKeyData);
+      const publicKeySign =
+          await privateKeysetHandle.getPrimitive(PublicKeySign);
+
+      const publicKeyData = Registry.getPublicKeyData(
+          privateKeyData.getTypeUrl(), privateKeyData.getValue_asU8());
+      const publicKeysetHandle = createKeysetHandleFromKeyData(publicKeyData);
+      const publicKeyVerify =
+          await publicKeysetHandle.getPrimitive(PublicKeyVerify);
+
+      const data = Random.randBytes(10);
+      const signature = await publicKeySign.sign(data);
+      const isValid = await publicKeyVerify.verify(signature, data);
+
+      assertTrue(isValid);
+    }
+  },
+});
+
+// Constants used in tests.
+const VERIFY_PRIMITIVE_NAME = 'PublicKeyVerify';
+const SIGN_PRIMITIVE_NAME = 'PublicKeySign';
+const ECDSA_PUBLIC_KEY_TYPE =
+    'type.googleapis.com/google.crypto.tink.EcdsaPublicKey';
+const ECDSA_PRIVATE_KEY_TYPE =
+    'type.googleapis.com/google.crypto.tink.EcdsaPrivateKey';
+
+/**
+ * Creates a keyset containing only the key given by keyData and returns it
+ * wrapped in a KeysetHandle.
+ *
+ * @param {!PbKeyData} keyData
+ * @return {!KeysetHandle}
+ */
+const createKeysetHandleFromKeyData = function(keyData) {
+  const keyId = 1;
+  const key = new PbKeyset.Key()
+                  .setKeyData(keyData)
+                  .setStatus(PbKeyStatusType.ENABLED)
+                  .setKeyId(keyId)
+                  .setOutputPrefixType(PbOutputPrefixType.TINK);
+
+  const keyset = new PbKeyset();
+  keyset.addKey(key);
+  keyset.setPrimaryKeyId(keyId);
+  return new KeysetHandle(keyset);
+};
+
+/**
+ * Returns all templates from SignatureKeyTemplates class.
+ *
+ * WARNING: This function works only in uncompiled code. Once the code is
+ * compiled it returns only empty set due to optimizations which are run.
+ * Namely
+ *   - after compilation the methods are no longer methods of
+ *     SignatureKeyTemplates class, and
+ *   - every method which is not referenced in this file or in the code used by
+ *       these tests are considered as dead code and removed.
+ *
+ * @return {!Array<!PbKeyTemplate>}
+ */
+const getListOfTemplatesFromSignatureKeyTemplatesClass = function() {
+  let templates = [];
+  for (let propertyName of Object.getOwnPropertyNames(SignatureKeyTemplates)) {
+    // Only public methods (i.e. not ending with '_') without arguments (i.e.
+    // function.length == 0) generate key templates.
+    const property = SignatureKeyTemplates[propertyName];
+    if (typeof property === 'function' && property.length === 0 &&
+        propertyName[propertyName.length - 1] != '_') {
+      const template = property();
+      if (template instanceof PbKeyTemplate) {
+        templates = templates.concat([template]);
+      }
+    }
+  }
+  return templates;
+};
diff --git a/javascript/signature/signature_key_templates.js b/javascript/signature/signature_key_templates.js
new file mode 100644
index 0000000..d958d60
--- /dev/null
+++ b/javascript/signature/signature_key_templates.js
@@ -0,0 +1,175 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.signature.SignatureKeyTemplates');
+
+const PbEcdsaKeyFormat = goog.require('proto.google.crypto.tink.EcdsaKeyFormat');
+const PbEcdsaParams = goog.require('proto.google.crypto.tink.EcdsaParams');
+const PbEcdsaSignatureEncoding = goog.require('proto.google.crypto.tink.EcdsaSignatureEncoding');
+const PbEllipticCurveType = goog.require('proto.google.crypto.tink.EllipticCurveType');
+const PbHashType = goog.require('proto.google.crypto.tink.HashType');
+const PbKeyTemplate = goog.require('proto.google.crypto.tink.KeyTemplate');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+const SignatureConfig = goog.require('tink.signature.SignatureConfig');
+
+/**
+ * Pre-generated KeyTemplates for keys for digital signatures.
+ *
+ * One can use these templates to generate new Keyset with
+ * KeysetHandle.generateNew method. To generate a new keyset that contains a
+ * single EcdsaKey, one can do:
+ *
+ * SignatureConfig.Register();
+ * KeysetHandle handle = KeysetHandle.generateNew(
+ *     SignatureKeyTemplates.ecdsaP256());
+ *
+ * @final
+ */
+class SignatureKeyTemplates {
+  /**
+   * Returns a KeyTemplate that generates new instances of
+   * EcdsaPrivateKey with the following parameters:
+   *  Hash function: SHA256
+   *  Curve: NIST P-256
+   *  Signature encoding: DER (this is the encoding that Java uses)
+   *  OutputPrefixType: TINK
+   *
+   * @return {!PbKeyTemplate}
+   */
+  static ecdsaP256() {
+    return createEcdsaKeyTemplate(
+        /* curveType = */ PbEllipticCurveType.NIST_P256,
+        /* hashType = */ PbHashType.SHA256,
+        /* encoding = */ PbEcdsaSignatureEncoding.DER,
+        /* outputPrefixType = */ PbOutputPrefixType.TINK);
+  }
+
+  /**
+   * Returns a KeyTemplate that generates new instances of
+   * EcdsaPrivateKey with the following parameters:
+   *  Hash function: SHA512
+   *  Curve: NIST P-384
+   *  Signature encoding: DER (this is the encoding that Java uses)
+   *  OutputPrefixType: TINK
+   *
+   * @return {!PbKeyTemplate}
+   */
+  static ecdsaP384() {
+    return createEcdsaKeyTemplate(
+        /* curveType = */ PbEllipticCurveType.NIST_P384,
+        /* hashType = */ PbHashType.SHA512,
+        /* encoding = */ PbEcdsaSignatureEncoding.DER,
+        /* outputPrefixType = */ PbOutputPrefixType.TINK);
+  }
+
+  /**
+   * Returns a KeyTemplate that generates new instances of
+   * EcdsaPrivateKey with the following parameters:
+   *  Hash function: SHA512
+   *  Curve: NIST P-521
+   *  Signature encoding: DER (this is the encoding that Java uses).
+   *  OutputPrefixType: TINK
+   *
+   * @return {!PbKeyTemplate}
+   */
+  static ecdsaP521() {
+    return createEcdsaKeyTemplate(
+        /* curveType = */ PbEllipticCurveType.NIST_P521,
+        /* hashType = */ PbHashType.SHA512,
+        /* encoding = */ PbEcdsaSignatureEncoding.DER,
+        /* outputPrefixType = */ PbOutputPrefixType.TINK);
+  }
+
+  /**
+   * Returns a KeyTemplate that generates new instances of
+   * EcdsaPrivateKey with the following parameters:
+   *  Hash function: SHA256
+   *  Curve: NIST P-256
+   *  Signature encoding: IEEE_P1363 (this is the encoding that WebCrypto uses)
+   *  OutputPrefixType: TINK
+   *
+   * @return {!PbKeyTemplate}
+   */
+  static ecdsaP256IeeeEncoding() {
+    return createEcdsaKeyTemplate(
+        /* curveType = */ PbEllipticCurveType.NIST_P256,
+        /* hashType = */ PbHashType.SHA256,
+        /* encoding = */ PbEcdsaSignatureEncoding.IEEE_P1363,
+        /* outputPrefixType = */ PbOutputPrefixType.TINK);
+  }
+
+  /**
+   * Returns a KeyTemplate that generates new instances of
+   * EcdsaPrivateKey with the following parameters:
+   *  Hash function: SHA512
+   *  Curve: NIST P-384
+   *  Signature encoding: IEEE_P1363 (this is the encoding that WebCrypto uses)
+   *  OutputPrefixType: TINK
+   *
+   * @return {!PbKeyTemplate}
+   */
+  static ecdsaP384IeeeEncoding() {
+    return createEcdsaKeyTemplate(
+        /* curveType = */ PbEllipticCurveType.NIST_P384,
+        /* hashType = */ PbHashType.SHA512,
+        /* encoding = */ PbEcdsaSignatureEncoding.IEEE_P1363,
+        /* outputPrefixType = */ PbOutputPrefixType.TINK);
+  }
+
+  /**
+   * Returns a KeyTemplate that generates new instances of
+   * EcdsaPrivateKey with the following parameters:
+   *  Hash function: SHA512
+   *  Curve: NIST P-521
+   *  Signature encoding: IEEE_P1363 (this is the encoding that WebCrypto uses)
+   *  OutputPrefixType: TINK
+   *
+   * @return {!PbKeyTemplate}
+   */
+  static ecdsaP521IeeeEncoding() {
+    return createEcdsaKeyTemplate(
+        /* curveType = */ PbEllipticCurveType.NIST_P521,
+        /* hashType = */ PbHashType.SHA512,
+        /* encoding = */ PbEcdsaSignatureEncoding.IEEE_P1363,
+        /* outputPrefixType = */ PbOutputPrefixType.TINK);
+  }
+}
+
+/**
+ * @param {!PbEllipticCurveType} curveType
+ * @param {!PbHashType} hashType
+ * @param {!PbEcdsaSignatureEncoding} encoding
+ * @param {!PbOutputPrefixType} outputPrefixType
+ *
+ * @return {!PbKeyTemplate}
+ */
+const createEcdsaKeyTemplate = function(
+    curveType, hashType, encoding, outputPrefixType) {
+  // key format
+  const keyFormat = new PbEcdsaKeyFormat();
+  const params =
+      new PbEcdsaParams().setCurve(curveType).setHashType(hashType).setEncoding(
+          encoding);
+  keyFormat.setParams(params);
+
+  // key template
+  const keyTemplate = new PbKeyTemplate()
+                          .setTypeUrl(SignatureConfig.ECDSA_PRIVATE_KEY_TYPE)
+                          .setValue(keyFormat.serializeBinary())
+                          .setOutputPrefixType(outputPrefixType);
+
+  return keyTemplate;
+};
+
+exports = SignatureKeyTemplates;
diff --git a/javascript/signature/signature_key_templates_test.js b/javascript/signature/signature_key_templates_test.js
new file mode 100644
index 0000000..c3e456e
--- /dev/null
+++ b/javascript/signature/signature_key_templates_test.js
@@ -0,0 +1,57 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.signature.SignatureKeyTemplatesTest');
+goog.setTestOnly('tink.signature.SignatureKeyTemplatesTest');
+
+const EcdsaPrivateKeyManager = goog.require('tink.signature.EcdsaPrivateKeyManager');
+const PbEcdsaKeyFormat = goog.require('proto.google.crypto.tink.EcdsaKeyFormat');
+const PbEcdsaSignatureEncoding = goog.require('proto.google.crypto.tink.EcdsaSignatureEncoding');
+const PbEllipticCurveType = goog.require('proto.google.crypto.tink.EllipticCurveType');
+const PbHashType = goog.require('proto.google.crypto.tink.HashType');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+const SignatureKeyTemplates = goog.require('tink.signature.SignatureKeyTemplates');
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+  testEcdsaP256() {
+    // Expects function to create a key with following parameters.
+    const expectedCurve = PbEllipticCurveType.NIST_P256;
+    const expectedHashFunction = PbHashType.SHA256;
+    const expectedEncoding = PbEcdsaSignatureEncoding.DER;
+    const expectedOutputPrefix = PbOutputPrefixType.TINK;
+
+    // Expected type URL is the one supported by EcdsaPrivateKeyManager.
+    const manager = new EcdsaPrivateKeyManager();
+    const expectedTypeUrl = manager.getKeyType();
+
+    const keyTemplate = SignatureKeyTemplates.ecdsaP256();
+
+    assertEquals(expectedTypeUrl, keyTemplate.getTypeUrl());
+    assertEquals(expectedOutputPrefix, keyTemplate.getOutputPrefixType());
+
+    // Test values in key format.
+    const keyFormat =
+        PbEcdsaKeyFormat.deserializeBinary(keyTemplate.getValue());
+    const params = keyFormat.getParams();
+    assertEquals(expectedEncoding, params.getEncoding());
+
+    // Test key params.
+    assertEquals(expectedCurve, params.getCurve());
+    assertEquals(expectedHashFunction, params.getHashType());
+
+    // Test that the template works with EcdsaPrivateKeyManager.
+    manager.getKeyFactory().newKey(keyTemplate.getValue_asU8());
+  },
+});
diff --git a/javascript/subtle/BUILD.bazel b/javascript/subtle/BUILD.bazel
new file mode 100644
index 0000000..133c1bd
--- /dev/null
+++ b/javascript/subtle/BUILD.bazel
@@ -0,0 +1,136 @@
+package(
+    default_visibility = ["//tools/build_defs:internal_pkg"],
+)
+
+licenses(["notice"])
+
+load("@io_bazel_rules_closure//closure:defs.bzl", "closure_js_library")
+
+closure_js_library(
+    name = "subtle",
+    srcs = [
+        "bytes.js",
+        "ecies_aead_hkdf_dem_helper.js",
+        "elliptic_curves.js",
+        "environment.js",
+        "ind_cpa_cipher.js",
+        "random.js",
+        "validators.js",
+    ],
+    deps = [
+        "//javascript:primitives",
+        "//javascript/exception",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "aead",
+    srcs = [
+        "aes_ctr.js",
+        "aes_gcm.js",
+        "encrypt_then_authenticate.js",
+    ],
+    deps = [
+        ":mac",
+        ":subtle",
+        "//javascript:primitives",
+        "//javascript/exception",
+        "//javascript/subtle/purejs:aead",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "mac",
+    srcs = [
+        "hmac.js",
+    ],
+    deps = [
+        ":subtle",
+        "//javascript:primitives",
+        "//javascript/exception",
+        "//javascript/subtle/purejs:mac",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "hkdf",
+    srcs = [
+        "hkdf.js",
+    ],
+    deps = [
+        ":mac",
+        ":subtle",
+        "//javascript/exception",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "hybrid",
+    srcs = [
+        "ecies_aead_hkdf_hybrid_decrypt.js",
+        "ecies_aead_hkdf_hybrid_encrypt.js",
+        "ecies_hkdf_kem_recipient.js",
+        "ecies_hkdf_kem_sender.js",
+    ],
+    deps = [
+        ":hkdf",
+        ":subtle",
+        "//javascript:primitives",
+        "//javascript/exception",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+closure_js_library(
+    name = "signature",
+    srcs = [
+        "ecdsa_sign.js",
+        "ecdsa_verify.js",
+    ],
+    deps = [
+        ":subtle",
+        "//javascript:primitives",
+        "//javascript/exception",
+        "@io_bazel_rules_closure//closure/library",
+    ],
+)
+
+# test
+
+closure_js_library(
+    name = "test_lib",
+    testonly = 1,
+    srcs = glob([
+        "*_test.js",
+    ]) + [
+        ":wycheproof_ecdh_testvectors",
+        ":wycheproof_ecdsa_testvectors",
+    ],
+    deps = [
+        "@io_bazel_rules_closure//closure/library",
+        "@io_bazel_rules_closure//closure/library/testing:asserts",
+        "@io_bazel_rules_closure//closure/library/testing:jsunit",
+        "@io_bazel_rules_closure//closure/library/testing:testsuite",
+        "@io_bazel_rules_closure//closure/library/useragent",
+    ],
+)
+
+genrule(
+    name = "wycheproof_ecdh_testvectors",
+    testonly = 1,
+    srcs = ["@wycheproof//testvectors:ecdh_webcrypto"],
+    outs = [":wycheproof_ecdh_testvectors.js"],
+    cmd = 'cat - $< <<<"goog.module(\'tink.subtle.wycheproofEcdhTestVectors\'); exports =" >$@',
+)
+
+genrule(
+    name = "wycheproof_ecdsa_testvectors",
+    testonly = 1,
+    srcs = ["@wycheproof//testvectors:ecdsa_webcrypto"],
+    outs = [":wycheproof_ecdsa_testvectors.js"],
+    cmd = 'cat - $< <<<"goog.module(\'tink.subtle.wycheproofEcdsaTestVectors\'); exports =" >$@',
+)
diff --git a/javascript/subtle/aes_ctr.js b/javascript/subtle/aes_ctr.js
new file mode 100644
index 0000000..a9b1ab9
--- /dev/null
+++ b/javascript/subtle/aes_ctr.js
@@ -0,0 +1,122 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.AesCtr');
+
+const AesCtrPureJs = goog.require('tink.subtle.purejs.AesCtr');
+const Bytes = goog.require('tink.subtle.Bytes');
+const Environment = goog.require('tink.subtle.Environment');
+const IndCpaCipher = goog.require('tink.subtle.IndCpaCipher');
+const Random = goog.require('tink.subtle.Random');
+const SecurityException = goog.require('tink.exception.SecurityException');
+const Validators = goog.require('tink.subtle.Validators');
+
+/**
+ * The minimum IV size.
+ *
+ * @const {number}
+ */
+const MIN_IV_SIZE_IN_BYTES = 12;
+
+/**
+ * AES block size.
+ *
+ * @const {number}
+ */
+const AES_BLOCK_SIZE_IN_BYTES = 16;
+
+/**
+ * Implementation of AES-CTR.
+ *
+ * @implements {IndCpaCipher}
+ * @protected
+ * @final
+ */
+class AesCtr {
+  /**
+   * @param {!webCrypto.CryptoKey} key
+   * @param {number} ivSize the size of the IV
+   */
+  constructor(key, ivSize) {
+    /** @const @private {!webCrypto.CryptoKey} */
+    this.key_ = key;
+
+    /** @const @private {number} */
+    this.ivSize_ = ivSize;
+  }
+
+  /**
+   * @param {!Uint8Array} key
+   * @param {number} ivSize the size of the IV, must be larger than or equal to
+   *     {@link MIN_IV_SIZE_IN_BYTES}
+   * @return {!Promise.<!IndCpaCipher>}
+   * @static
+   */
+  static async newInstance(key, ivSize) {
+    if (!Number.isInteger(ivSize)) {
+      throw new SecurityException('invalid IV length, must be an integer');
+    }
+    if (ivSize < MIN_IV_SIZE_IN_BYTES || ivSize > AES_BLOCK_SIZE_IN_BYTES) {
+      throw new SecurityException(
+          'invalid IV length, must be at least ' + MIN_IV_SIZE_IN_BYTES +
+          ' and at most ' + AES_BLOCK_SIZE_IN_BYTES);
+    }
+    Validators.requireUint8Array(key);
+    Validators.validateAesKeySize(key.length);
+
+    if (Environment.IS_WEBCRYPTO_AVAILABLE) {
+      try {
+        const cryptoKey = await self.crypto.subtle.importKey(
+            'raw', key, {'name': 'AES-CTR', 'length': key.length}, false,
+            ['encrypt', 'decrypt']);
+
+        return new AesCtr(cryptoKey, ivSize);
+      } catch (error) {
+        // CTR might be unsupported in this browser. Fall back to Pure JS.
+      }
+    }
+    return new AesCtrPureJs(key, ivSize);
+  }
+
+  /**
+   * @override
+   */
+  async encrypt(plaintext) {
+    Validators.requireUint8Array(plaintext);
+    const iv = Random.randBytes(this.ivSize_);
+    const counter = new Uint8Array(AES_BLOCK_SIZE_IN_BYTES);
+    counter.set(iv);
+    const alg = {'name': 'AES-CTR', 'counter': counter, 'length': 128};
+    const ciphertext =
+        await self.crypto.subtle.encrypt(alg, this.key_, plaintext);
+    return Bytes.concat(iv, new Uint8Array(ciphertext));
+  }
+
+  /**
+   * @override
+   */
+  async decrypt(ciphertext) {
+    Validators.requireUint8Array(ciphertext);
+    if (ciphertext.length < this.ivSize_) {
+      throw new SecurityException('ciphertext too short');
+    }
+    const counter = new Uint8Array(AES_BLOCK_SIZE_IN_BYTES);
+    counter.set(ciphertext.subarray(0, this.ivSize_));
+    const alg = {'name': 'AES-CTR', 'counter': counter, 'length': 128};
+    return new Uint8Array(await self.crypto.subtle.decrypt(
+        alg, this.key_, new Uint8Array(ciphertext.subarray(this.ivSize_))));
+  }
+}
+
+exports = AesCtr;
diff --git a/javascript/subtle/aes_ctr_test.js b/javascript/subtle/aes_ctr_test.js
new file mode 100644
index 0000000..71283fb
--- /dev/null
+++ b/javascript/subtle/aes_ctr_test.js
@@ -0,0 +1,194 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.AesCtrTest');
+goog.setTestOnly('tink.subtle.AesCtrTest');
+
+const AesCtr = goog.require('tink.subtle.AesCtr');
+const Bytes = goog.require('tink.subtle.Bytes');
+const Random = goog.require('tink.subtle.Random');
+const TestCase = goog.require('goog.testing.TestCase');
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+
+  setUp() {
+    // Use a generous promise timeout for running continuously.
+    TestCase.getActiveTestCase().promiseTimeout = 1000 * 1000;  // 1000s
+  },
+
+  tearDown() {
+    // Reset the timeout.
+    TestCase.getActiveTestCase().promiseTimeout = 1000;  // 1s
+  },
+
+  async testBasic() {
+    // Set longer time for promiseTimout as the test sometimes takes longer than
+    // 1 second in Firefox.
+    const key = Random.randBytes(16);
+    for (let i = 0; i < 100; i++) {
+      const msg = Random.randBytes(20);
+      const cipher = await AesCtr.newInstance(key, 16);
+      let ciphertext = await cipher.encrypt(msg);
+      let plaintext = await cipher.decrypt(ciphertext);
+      assertEquals(Bytes.toHex(msg), Bytes.toHex(plaintext));
+    }
+  },
+
+  async testProbabilisticEncryption() {
+    const cipher = await AesCtr.newInstance(Random.randBytes(16), 16);
+    const msg = Random.randBytes(20);
+    const aad = Random.randBytes(20);
+    const results = new Set();
+    for (let i = 0; i < 100; i++) {
+      const ciphertext = await cipher.encrypt(msg, aad);
+      results.add(Bytes.toHex(ciphertext));
+    }
+    assertEquals(100, results.size);
+  },
+
+  async testConstructor() {
+    try {
+      await AesCtr.newInstance(123, 16);  // IV size too short
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+    try {
+      await AesCtr.newInstance(Random.randBytes(16), 11);  // IV size too short
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: invalid IV length, must be at least 12 and at most 16',
+          e.toString());
+    }
+    try {
+      await AesCtr.newInstance(Random.randBytes(16), 17);  // IV size too long
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: invalid IV length, must be at least 12 and at most 16',
+          e.toString());
+    }
+    try {
+      await AesCtr.newInstance(
+          Random.randBytes(24), 12);  // 192-bit keys not supported
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals('CustomError: unsupported AES key size: 24', e.toString());
+    }
+  },
+
+  async testConstructor_invalidIvSizes() {
+    try {
+      await AesCtr.newInstance(Random.randBytes(16), NaN);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: invalid IV length, must be an integer', e.toString());
+    }
+
+    try {
+      await AesCtr.newInstance(Random.randBytes(16), undefined);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: invalid IV length, must be an integer', e.toString());
+    }
+
+    try {
+      await AesCtr.newInstance(Random.randBytes(16), 12.5);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: invalid IV length, must be an integer', e.toString());
+    }
+
+    try {
+      await AesCtr.newInstance(Random.randBytes(16), 0);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: invalid IV length, must be at least 12 and at most 16',
+          e.toString());
+    }
+  },
+
+  async testType() {
+    try {
+      await AesCtr.newInstance('blah', 12);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+
+    const cipher = await AesCtr.newInstance(Random.randBytes(16), 12);
+    try {
+      await cipher.encrypt('blah');
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+    try {
+      await cipher.encrypt(123);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+    try {
+      await cipher.decrypt('blah');
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+    try {
+      await cipher.decrypt(123);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+  },
+
+  async testWithTestVectors() {
+    // Test data from NIST SP 800-38A pp 55.
+    const NIST_TEST_VECTORS = [
+      {
+        'key': '2b7e151628aed2a6abf7158809cf4f3c',
+        'message':
+            '6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51' +
+            '30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710',
+        'ciphertext':
+            '874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff' +
+            '5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee',
+        'iv': 'f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff'
+      },
+    ];
+    for (let i = 0; i < NIST_TEST_VECTORS.length; i++) {
+      const testVector = NIST_TEST_VECTORS[i];
+      const key = Bytes.fromHex(testVector['key']);
+      const iv = Bytes.fromHex(testVector['iv']);
+      const msg = Bytes.fromHex(testVector['message']);
+      const ciphertext = Bytes.fromHex(testVector['ciphertext']);
+      const aesctr = await AesCtr.newInstance(key, iv.length);
+      const plaintext = await aesctr.decrypt(Bytes.concat(iv, ciphertext));
+      assertEquals(Bytes.toHex(msg), Bytes.toHex(plaintext));
+    }
+  },
+});
diff --git a/javascript/subtle/aes_gcm.js b/javascript/subtle/aes_gcm.js
new file mode 100644
index 0000000..3d80ba9
--- /dev/null
+++ b/javascript/subtle/aes_gcm.js
@@ -0,0 +1,124 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.AesGcm');
+
+const Aead = goog.require('tink.Aead');
+const Bytes = goog.require('tink.subtle.Bytes');
+const Random = goog.require('tink.subtle.Random');
+const SecurityException = goog.require('tink.exception.SecurityException');
+const Validators = goog.require('tink.subtle.Validators');
+
+/**
+ * The only supported IV size.
+ *
+ * @const {number}
+ */
+const IV_SIZE_IN_BYTES = 12;
+
+/**
+ * The only supported tag size.
+ *
+ * @const {number}
+ */
+const TAG_SIZE_IN_BITS = 128;
+
+/**
+ * Implementation of AES-GCM.
+ *
+ * @implements {Aead}
+ * @public
+ * @final
+ */
+class AesGcm {
+  /**
+   * @param {!webCrypto.CryptoKey} key
+   */
+  constructor(key) {
+    /** @const @private {!webCrypto.CryptoKey} */
+    this.key_ = key;
+  }
+
+  /**
+   * @param {!Uint8Array} key
+   * @return {!Promise.<!Aead>}
+   * @static
+   */
+  static async newInstance(key) {
+    Validators.requireUint8Array(key);
+    Validators.validateAesKeySize(key.length);
+
+    const webCryptoKey = await self.crypto.subtle.importKey(
+        'raw' /* format */, key /* keyData */,
+        {'name': 'AES-GCM', 'length': key.length} /* algo */,
+        false /* extractable*/, ['encrypt', 'decrypt'] /* usage */);
+    return new AesGcm(webCryptoKey);
+  }
+
+  /**
+   * @override
+   */
+  async encrypt(plaintext, opt_associatedData) {
+    Validators.requireUint8Array(plaintext);
+    if (opt_associatedData != null) {
+      Validators.requireUint8Array(opt_associatedData);
+    }
+    const iv = Random.randBytes(IV_SIZE_IN_BYTES);
+    const alg = {
+      'name': 'AES-GCM',
+      'iv': iv,
+      'tagLength': TAG_SIZE_IN_BITS,
+    };
+    // Edge can't handle an empty array
+    if (opt_associatedData != null && opt_associatedData.length) {
+      alg['additionalData'] = opt_associatedData;
+    }
+    const ciphertext =
+        await self.crypto.subtle.encrypt(alg, this.key_, plaintext);
+    return Bytes.concat(iv, new Uint8Array(ciphertext));
+  }
+
+  /**
+   * @override
+   */
+  async decrypt(ciphertext, opt_associatedData) {
+    Validators.requireUint8Array(ciphertext);
+    if (ciphertext.length < IV_SIZE_IN_BYTES + TAG_SIZE_IN_BITS / 8) {
+      throw new SecurityException('ciphertext too short');
+    }
+    if (opt_associatedData != null) {
+      Validators.requireUint8Array(opt_associatedData);
+    }
+    const iv = new Uint8Array(IV_SIZE_IN_BYTES);
+    iv.set(ciphertext.subarray(0, IV_SIZE_IN_BYTES));
+    const alg = {
+      'name': 'AES-GCM',
+      'iv': iv,
+      'tagLength': TAG_SIZE_IN_BITS,
+    };
+    // Edge can't handle an empty array
+    if (opt_associatedData != null && opt_associatedData.length) {
+      alg['additionalData'] = opt_associatedData;
+    }
+    try {
+      return new Uint8Array(await self.crypto.subtle.decrypt(
+          alg, this.key_,
+          new Uint8Array(ciphertext.subarray(IV_SIZE_IN_BYTES))));
+    } catch (e) {
+      throw new SecurityException(e.toString());
+    }
+  }
+}
+
+exports = AesGcm;
diff --git a/javascript/subtle/aes_gcm_test.js b/javascript/subtle/aes_gcm_test.js
new file mode 100644
index 0000000..85113fb
--- /dev/null
+++ b/javascript/subtle/aes_gcm_test.js
@@ -0,0 +1,693 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.AesGcmTest');
+goog.setTestOnly('tink.subtle.AesGcmTest');
+
+const AesGcm = goog.require('tink.subtle.AesGcm');
+const Bytes = goog.require('tink.subtle.Bytes');
+const Random = goog.require('tink.subtle.Random');
+const TestCase = goog.require('goog.testing.TestCase');
+const testSuite = goog.require('goog.testing.testSuite');
+const userAgent = goog.require('goog.userAgent');
+
+/**
+ * Asserts that an exception is the result of a Web Crypto error.
+ *
+ * @param {*} exception A thrown exception.
+ */
+function assertCryptoError(exception) {
+  const message = exception.toString();
+  assertTrue(
+      message.startsWith('CustomError: OperationError') ||
+      // Edge uses a nonstandard error message.
+      message ===
+          'CustomError: Error: ' +
+              'Could not complete the operation due to error 8070000b.');
+}
+
+testSuite({
+  setUp() {
+    // Use a generous promise timeout for running continuously.
+    TestCase.getActiveTestCase().promiseTimeout = 1000 * 1000;  // 1000s
+  },
+
+  tearDown() {
+    // Reset the timeout.
+    TestCase.getActiveTestCase().promiseTimeout = 1000;  // 1s
+  },
+
+  async testBasic() {
+    const aead = await AesGcm.newInstance(Random.randBytes(16));
+    const minLength = userAgent.EDGE ? 1 : 0;  // b/120299887
+    for (let i = minLength; i < 100; i++) {
+      const msg = Random.randBytes(i);
+      let ciphertext = await aead.encrypt(msg);
+      let plaintext = await aead.decrypt(ciphertext);
+      assertEquals(12 /* iv */ + msg.length + 16 /* tag */, ciphertext.length);
+      assertEquals(Bytes.toHex(msg), Bytes.toHex(plaintext));
+
+      let aad = null;
+      ciphertext = await aead.encrypt(msg, aad);
+      plaintext = await aead.decrypt(ciphertext, aad);
+      assertEquals(12 /* iv */ + msg.length + 16 /* tag */, ciphertext.length);
+      assertEquals(Bytes.toHex(msg), Bytes.toHex(plaintext));
+
+      aad = Random.randBytes(20);
+      ciphertext = await aead.encrypt(msg, aad);
+      plaintext = await aead.decrypt(ciphertext, aad);
+      assertEquals(12 /* iv */ + msg.length + 16 /* tag */, ciphertext.length);
+      assertEquals(Bytes.toHex(msg), Bytes.toHex(plaintext));
+    }
+  },
+
+  async testProbabilisticEncryption() {
+    const aead = await AesGcm.newInstance(Random.randBytes(16));
+    const msg = Random.randBytes(20);
+    const aad = Random.randBytes(20);
+    const results = new Set();
+    for (let i = 0; i < 100; i++) {
+      const ciphertext = await aead.encrypt(msg, aad);
+      results.add(Bytes.toHex(ciphertext));
+    }
+    assertEquals(100, results.size);
+  },
+
+  async testType() {
+    try {
+      await AesGcm.newInstance('blah');
+      fail('expected AesGcm.newInstance to fail');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+
+    const aead = await AesGcm.newInstance(Random.randBytes(16));
+    try {
+      await aead.encrypt('blah');
+      fail('expected aead.encrypt to fail');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+    try {
+      await aead.encrypt(Random.randBytes(20), 'blah');
+      fail('expected aead.encrypt to fail');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+    try {
+      await aead.decrypt('blah');
+      fail('expected aead.decrypt to fail');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+    try {
+      await aead.decrypt(Random.randBytes(32), 'blah');
+      fail('expected aead.decrypt to fail');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+  },
+
+  async testBitFlipCiphertext() {
+    const aead = await AesGcm.newInstance(Random.randBytes(16));
+    const plaintext = Random.randBytes(8);
+    const aad = Random.randBytes(8);
+    const ciphertext = await aead.encrypt(plaintext, aad);
+    for (let i = 0; i < ciphertext.length; i++) {
+      for (let j = 0; j < 8; j++) {
+        const c1 = new Uint8Array(ciphertext);
+        c1[i] = (c1[i] ^ (1 << j));
+        try {
+          await aead.decrypt(c1, aad);
+          fail('expected aead.decrypt to fail');
+        } catch (e) {
+          assertCryptoError(e);
+        }
+      }
+    }
+  },
+
+  async testBitFlipAad() {
+    const aead = await AesGcm.newInstance(Random.randBytes(16));
+    const plaintext = Random.randBytes(8);
+    const aad = Random.randBytes(8);
+    const ciphertext = await aead.encrypt(plaintext, aad);
+    for (let i = 0; i < aad.length; i++) {
+      for (let j = 0; j < 8; j++) {
+        const aad1 = new Uint8Array(aad);
+        aad1[i] = (aad1[i] ^ (1 << j));
+        try {
+          await aead.decrypt(ciphertext, aad1);
+          fail('expected aead.decrypt to fail');
+        } catch (e) {
+          assertCryptoError(e);
+        }
+      }
+    }
+  },
+
+  async testTruncation() {
+    const aead = await AesGcm.newInstance(Random.randBytes(16));
+    const plaintext = Random.randBytes(8);
+    const aad = Random.randBytes(8);
+    const ciphertext = await aead.encrypt(plaintext, aad);
+    for (let i = 1; i <= ciphertext.length; i++) {
+      const c1 = new Uint8Array(ciphertext.buffer, 0, ciphertext.length - i);
+      try {
+        await aead.decrypt(c1, aad);
+        fail('expected aead.decrypt to fail');
+      } catch (e) {
+        if (c1.length < 12 /* iv */ + 16 /* tag */) {
+          assertEquals('CustomError: ciphertext too short', e.toString());
+        } else {
+          assertCryptoError(e);
+        }
+      }
+    }
+  },
+
+  async testWithNistTestVectors() {
+    // Download from
+    // https://csrc.nist.gov/Projects/Cryptographic-Algorithm-Validation-Program/CAVP-TESTING-BLOCK-CIPHER-MODES.
+    const NIST_TEST_VECTORS =
+        [
+          {
+            'Key':
+                'b52c505a37d78eda5dd34f20c22540ea1b58963cf8e5bf8ffa85f9f2492505b4',
+            'IV': '516c33929df5a3284ff463d7',
+            'PT': '',
+            'AAD': '',
+            'CT': '',
+            'Tag': 'bdc1ac884d332457a1d2664f168c76f0',
+          },
+          {
+            'Key':
+                '78dc4e0aaf52d935c3c01eea57428f00ca1fd475f5da86a49c8dd73d68c8e223',
+            'IV': 'd79cf22d504cc793c3fb6c8a',
+            'PT': '',
+            'AAD': 'b96baa8c1c75a671bfb2d08d06be5f36',
+            'CT': '',
+            'Tag': '3e5d486aa2e30b22e040b85723a06e76',
+          },
+          {
+            'Key':
+                '886cff5f3e6b8d0e1ad0a38fcdb26de97e8acbe79f6bed66959a598fa5047d65',
+            'IV': '3a8efa1cd74bbab5448f9945',
+            'PT': '',
+            'AAD': '519fee519d25c7a304d6c6aa1897ee1eb8c59655',
+            'CT': '',
+            'Tag': 'f6d47505ec96c98a42dc3ae719877b87',
+          },
+          {
+            'Key':
+                'f4069bb739d07d0cafdcbc609ca01597f985c43db63bbaaa0debbb04d384e49c',
+            'IV': 'd25ff30fdc3d464fe173e805',
+            'PT': '',
+            'AAD':
+                '3e1449c4837f0892f9d55127c75c4b25d69be334baf5f19394d2d8bb460cbf2120e14736d0f634aa792feca20e455f11',
+            'CT': '',
+            'Tag': '805ec2931c2181e5bfb74fa0a975f0cf',
+          },
+          {
+            'Key':
+                '03ccb7dbc7b8425465c2c3fc39ed0593929ffd02a45ff583bd89b79c6f646fe9',
+            'IV': 'fd119985533bd5520b301d12',
+            'PT': '',
+            'AAD':
+                '98e68c10bf4b5ae62d434928fc6405147c6301417303ef3a703dcfd2c0c339a4d0a89bd29fe61fecf1066ab06d7a5c31a48ffbfed22f749b17e9bd0dc1c6f8fbd6fd4587184db964d5456132106d782338c3f117ec05229b0899',
+            'CT': '',
+            'Tag': 'cf54e7141349b66f248154427810c87a',
+          },
+          {
+            'Key':
+                '31bdadd96698c204aa9ce1448ea94ae1fb4a9a0b3c9d773b51bb1822666b8f22',
+            'IV': '0d18e06c7c725ac9e362e1ce',
+            'PT': '2db5168e932556f8089a0622981d017d',
+            'AAD': '',
+            'CT': 'fa4362189661d163fcd6a56d8bf0405a',
+            'Tag': 'd636ac1bbedd5cc3ee727dc2ab4a9489',
+          },
+          {
+            'Key':
+                '92e11dcdaa866f5ce790fd24501f92509aacf4cb8b1339d50c9c1240935dd08b',
+            'IV': 'ac93a1a6145299bde902f21a',
+            'PT': '2d71bcfa914e4ac045b2aa60955fad24',
+            'AAD': '1e0889016f67601c8ebea4943bc23ad6',
+            'CT': '8995ae2e6df3dbf96fac7b7137bae67f',
+            'Tag': 'eca5aa77d51d4a0a14d9c51e1da474ab',
+          },
+          {
+            'Key':
+                '83688deb4af8007f9b713b47cfa6c73e35ea7a3aa4ecdb414dded03bf7a0fd3a',
+            'IV': '0b459724904e010a46901cf3',
+            'PT': '33d893a2114ce06fc15d55e454cf90c3',
+            'AAD': '794a14ccd178c8ebfd1379dc704c5e208f9d8424',
+            'CT': 'cc66bee423e3fcd4c0865715e9586696',
+            'Tag': '0fb291bd3dba94a1dfd8b286cfb97ac5',
+          },
+          {
+            'Key':
+                'e4fed339c7b0cd267305d11ab0d5c3273632e8872d35bdc367a1363438239a35',
+            'IV': '0365882cf75432cfd23cbd42',
+            'PT': 'fff39a087de39a03919fbd2f2fa5f513',
+            'AAD':
+                '8a97d2af5d41160ac2ff7dd8ba098e7aa4d618f0f455957d6a6d0801796747ba57c32dfbaaaf15176528fe3a0e4550c9',
+            'CT': '8d9e68f03f7e5f4a0ffaa7650d026d08',
+            'Tag': '3554542c478c0635285a61d1b51f6afa',
+          },
+          {
+            'Key':
+                '80d755e24d129e68a5259ec2cf618e39317074a83c8961d3768ceb2ed8d5c3d7',
+            'IV': '7598c07ba7b16cd12cf50813',
+            'PT': '5e7fd1298c4f15aa0f1c1e47217aa7a9',
+            'AAD':
+                '0e94f4c48fd0c9690c853ad2a5e197c5de262137b69ed0cdfa28d8d12413e4ffff15374e1cccb0423e8ed829a954a335ed705a272ad7f9abd1057c849bb0d54b768e9d79879ec552461cc04adb6ca0040c5dd5bc733d21a93702',
+            'CT': '5762a38cf3f2fdf3645d2f6696a7eead',
+            'Tag': '8a6708e69468915c5367573924fe1ae3',
+          },
+          {
+            'Key':
+                '82c4f12eeec3b2d3d157b0f992d292b237478d2cecc1d5f161389b97f999057a',
+            'IV': '7b40b20f5f397177990ef2d1',
+            'PT': '982a296ee1cd7086afad976945',
+            'AAD': '',
+            'CT': 'ec8e05a0471d6b43a59ca5335f',
+            'Tag': '113ddeafc62373cac2f5951bb9165249',
+          },
+          {
+            'Key':
+                'dad89d9be9bba138cdcf8752c45b579d7e27c3dbb40f53e771dd8cfd500aa2d5',
+            'IV': 'cfb2aec82cfa6c7d89ee72ff',
+            'PT': 'b526ba1050177d05b0f72f8d67',
+            'AAD': '6e43784a91851a77667a02198e28dc32',
+            'CT': '8b29e66e924ecae84f6d8f7d68',
+            'Tag': '1e365805c8f28b2ed8a5cadfd9079158',
+          },
+          {
+            'Key':
+                '69b458f2644af9020463b40ee503cdf083d693815e2659051ae0d039e606a970',
+            'IV': '8d1da8ab5f91ccd09205944b',
+            'PT': 'f3e0e09224256bf21a83a5de8d',
+            'AAD': '036ad5e5494ef817a8af2f5828784a4bfedd1653',
+            'CT': 'c0a62d77e6031bfdc6b13ae217',
+            'Tag': 'a794a9aaee48cd92e47761bf1baff0af',
+          },
+          {
+            'Key':
+                '5f671466378f470ba5f5160e2209f3d95a48b7e560625d5a08654414de23aee2',
+            'IV': '6b3c08a663d04132243dd96c',
+            'PT': 'c428592d9f8a7f107ec4d0df05',
+            'AAD':
+                '12965559c31d538f937bda6eee9c93b0387318dc5d9496fb1c3a0b9b978dbfebff2a5823974ee9d679834dbe59f7ec51',
+            'CT': '1d8d7fe4357080c817303ce19c',
+            'Tag': 'e88d6b566fdc7b4fd62106bd2eb806ec',
+          },
+          {
+            'Key':
+                'ff9506b4d46ba54128876fadfcc673a4c927c618ea7d95cfcaa508cbc8f7fc66',
+            'IV': '3742ad2208a0484345eee1be',
+            'PT': '7fd0d6cadc92cad27bb2d7d8c8',
+            'AAD':
+                'f1360a27fdc244be8739d85af6491c762a693aafe668c449515fdeeedb6a90aeee3891bbc8b69adc6a6426cb12fcdebc32c9f58c5259d128b91efa28620a3a9a0168b0ff5e76951cb41647ba4aa1f87fac0d97ac580e42cffc7e',
+            'CT': 'bdb8346b28eb4d7226493611a6',
+            'Tag': '7484d827b767647f44c7f94a39f8175c',
+          },
+          {
+            'Key':
+                '268ed1b5d7c9c7304f9cae5fc437b4cd3aebe2ec65f0d85c3918d3d3b5bba89b',
+            'IV': '9ed9d8180564e0e945f5e5d4',
+            'PT':
+                'fe29a40d8ebf57262bdb87191d01843f4ca4b2de97d88273154a0b7d9e2fdb80',
+            'AAD': '',
+            'CT':
+                '791a4a026f16f3a5ea06274bf02baab469860abde5e645f3dd473a5acddeecfc',
+            'Tag': '05b2b74db0662550435ef1900e136b15',
+          },
+          {
+            'Key':
+                '37ccdba1d929d6436c16bba5b5ff34deec88ed7df3d15d0f4ddf80c0c731ee1f',
+            'IV': '5c1b21c8998ed6299006d3f9',
+            'PT':
+                'ad4260e3cdc76bcc10c7b2c06b80b3be948258e5ef20c508a81f51e96a518388',
+            'AAD': '22ed235946235a85a45bc5fad7140bfa',
+            'CT':
+                '3b335f8b08d33ccdcad228a74700f1007542a4d1e7fc1ebe3f447fe71af29816',
+            'Tag': '1fbf49cc46f458bf6e88f6370975e6d4',
+          },
+          {
+            'Key':
+                '5853c020946b35f2c58ec427152b840420c40029636adcbb027471378cfdde0f',
+            'IV': 'eec313dd07cc1b3e6b068a47',
+            'PT':
+                'ce7458e56aef9061cb0c42ec2315565e6168f5a6249ffd31610b6d17ab64935e',
+            'AAD': '1389b522c24a774181700553f0246bbabdd38d6f',
+            'CT':
+                'eadc3b8766a77ded1a58cb727eca2a9790496c298654cda78febf0da16b6903b',
+            'Tag': '3d49a5b32fde7eafcce90079217ffb57',
+          },
+          {
+            'Key':
+                'dc776f0156c15d032623854b625c61868e5db84b7b6f9fbd3672f12f0025e0f6',
+            'IV': '67130951c4a57f6ae7f13241',
+            'PT':
+                '9378a727a5119595ad631b12a5a6bc8a91756ef09c8d6eaa2b718fe86876da20',
+            'AAD':
+                'fd0920faeb7b212932280a009bac969145e5c316cf3922622c3705c3457c4e9f124b2076994323fbcfb523f8ed16d241',
+            'CT':
+                '6d958c20870d401a3c1f7a0ac092c97774d451c09f7aae992a8841ff0ab9d60d',
+            'Tag': 'b876831b4ecd7242963b040aa45c4114',
+          },
+          {
+            'Key':
+                '26bf255bee60ef0f653769e7034db95b8c791752754e575c761059e9ee8dcf78',
+            'IV': 'cecd97ab07ce57c1612744f5',
+            'PT':
+                '96983917a036650763aca2b4e927d95ffc74339519ed40c4336dba91edfbf9ad',
+            'AAD':
+                'afebbe9f260f8c118e52b84d8880a34622675faef334cdb41be9385b7d059b79c0f8a432d25f8b71e781b177fce4d4c57ac5734543e85d7513f96382ff4b2d4b95b2f1fdbaf9e78bbd1db13a7dd26e8a4ac83a3e8ab42d1d545f',
+            'CT':
+                'e34b1540a769f7913331d66796e00bdc3ee0f258cf244eb7663375cc5ad6c658',
+            'Tag': '3841f02beb7a7fca7e578922d0a2f80c',
+          },
+          {
+            'Key':
+                '1fded32d5999de4a76e0f8082108823aef60417e1896cf4218a2fa90f632ec8a',
+            'IV': '1f3afa4711e9474f32e70462',
+            'PT':
+                '06b2c75853df9aeb17befd33cea81c630b0fc53667ff45199c629c8e15dce41e530aa792f796b8138eeab2e86c7b7bee1d40b0',
+            'AAD': '',
+            'CT':
+                '91fbd061ddc5a7fcc9513fcdfdc9c3a7c5d4d64cedf6a9c24ab8a77c36eefbf1c5dc00bc50121b96456c8cd8b6ff1f8b3e480f',
+            'Tag': '30096d340f3d5c42d82a6f475def23eb',
+          },
+          {
+            'Key':
+                '5fe01c4baf01cbe07796d5aaef6ec1f45193a98a223594ae4f0ef4952e82e330',
+            'IV': 'bd587321566c7f1a5dd8652d',
+            'PT':
+                '881dc6c7a5d4509f3c4bd2daab08f165ddc204489aa8134562a4eac3d0bcad7965847b102733bb63d1e5c598ece0c3e5dadddd',
+            'AAD': '9013617817dda947e135ee6dd3653382',
+            'CT':
+                '16e375b4973b339d3f746c1c5a568bc7526e909ddff1e19c95c94a6ccff210c9a4a40679de5760c396ac0e2ceb1234f9f5fe26',
+            'Tag': 'abd3d26d65a6275f7a4f56b422acab49',
+          },
+          {
+            'Key':
+                '24501ad384e473963d476edcfe08205237acfd49b5b8f33857f8114e863fec7f',
+            'IV': '9ff18563b978ec281b3f2794',
+            'PT':
+                '27f348f9cdc0c5bd5e66b1ccb63ad920ff2219d14e8d631b3872265cf117ee86757accb158bd9abb3868fdc0d0b074b5f01b2c',
+            'AAD': 'adb5ec720ccf9898500028bf34afccbcaca126ef',
+            'CT':
+                'eb7cb754c824e8d96f7c6d9b76c7d26fb874ffbf1d65c6f64a698d839b0b06145dae82057ad55994cf59ad7f67c0fa5e85fab8',
+            'Tag': 'bc95c532fecc594c36d1550286a7a3f0',
+          },
+          {
+            'Key':
+                '463b412911767d57a0b33969e674ffe7845d313b88c6fe312f3d724be68e1fca',
+            'IV': '611ce6f9a6880750de7da6cb',
+            'PT':
+                'e7d1dcf668e2876861940e012fe52a98dacbd78ab63c08842cc9801ea581682ad54af0c34d0d7f6f59e8ee0bf4900e0fd85042',
+            'AAD':
+                '0a682fbc6192e1b47a5e0868787ffdafe5a50cead3575849990cdd2ea9b3597749403efb4a56684f0c6bde352d4aeec5',
+            'CT':
+                '8886e196010cb3849d9c1a182abe1eeab0a5f3ca423c3669a4a8703c0f146e8e956fb122e0d721b869d2b6fcd4216d7d4d3758',
+            'Tag': '2469cecd70fd98fec9264f71df1aee9a',
+          },
+          {
+            'Key':
+                '148579a3cbca86d5520d66c0ec71ca5f7e41ba78e56dc6eebd566fed547fe691',
+            'IV': 'b08a5ea1927499c6ecbfd4e0',
+            'PT':
+                '9d0b15fdf1bd595f91f8b3abc0f7dec927dfd4799935a1795d9ce00c9b879434420fe42c275a7cd7b39d638fb81ca52b49dc41',
+            'AAD':
+                'e4f963f015ffbb99ee3349bbaf7e8e8e6c2a71c230a48f9d59860a29091d2747e01a5ca572347e247d25f56ba7ae8e05cde2be3c97931292c02370208ecd097ef692687fecf2f419d3200162a6480a57dad408a0dfeb492e2c5d',
+            'CT':
+                '2097e372950a5e9383c675e89eea1c314f999159f5611344b298cda45e62843716f215f82ee663919c64002a5c198d7878fd3f',
+            'Tag': 'adbecdb0d5c2224d804d2886ff9a5760',
+          },
+          {
+            'Key': '11754cd72aec309bf52f7687212e8957',
+            'IV': '3c819d9a9bed087615030b65',
+            'PT': '',
+            'AAD': '',
+            'CT': '',
+            'Tag': '250327c674aaf477aef2675748cf6971',
+          },
+          {
+            'Key': '77be63708971c4e240d1cb79e8d77feb',
+            'IV': 'e0e00f19fed7ba0136a797f3',
+            'PT': '',
+            'AAD': '7a43ec1d9c0a5a78a0b16533a6213cab',
+            'CT': '',
+            'Tag': '209fcc8d3675ed938e9c7166709dd946',
+          },
+          {
+            'Key': '2fb45e5b8f993a2bfebc4b15b533e0b4',
+            'IV': '5b05755f984d2b90f94b8027',
+            'PT': '',
+            'AAD': 'e85491b2202caf1d7dce03b97e09331c32473941',
+            'CT': '',
+            'Tag': 'c75b7832b2a2d9bd827412b6ef5769db',
+          },
+          {
+            'Key': '99e3e8793e686e571d8285c564f75e2b',
+            'IV': 'c2dd0ab868da6aa8ad9c0d23',
+            'PT': '',
+            'AAD':
+                'b668e42d4e444ca8b23cfdd95a9fedd5178aa521144890b093733cf5cf22526c5917ee476541809ac6867a8c399309fc',
+            'CT': '',
+            'Tag': '3f4fba100eaf1f34b0baadaae9995d85',
+          },
+          {
+            'Key': '20b5b6b854e187b058a84d57bc1538b6',
+            'IV': '94c1935afc061cbf254b936f',
+            'PT': '',
+            'AAD':
+                'ca418e71dbf810038174eaa3719b3fcb80531c7110ad9192d105eeaafa15b819ac005668752b344ed1b22faf77048baf03dbddb3b47d6b00e95c4f005e0cc9b7627ccafd3f21b3312aa8d91d3fa0893fe5bff7d44ca46f23afe0',
+            'CT': '',
+            'Tag': 'b37286ebaf4a54e0ffc2a1deafc9f6db',
+          },
+          {
+            'Key': '7fddb57453c241d03efbed3ac44e371c',
+            'IV': 'ee283a3fc75575e33efd4887',
+            'PT': 'd5de42b461646c255c87bd2962d3b9a2',
+            'AAD': '',
+            'CT': '2ccda4a5415cb91e135c2a0f78c9b2fd',
+            'Tag': 'b36d1df9b9d5e596f83e8b7f52971cb3',
+          },
+          {
+            'Key': 'c939cc13397c1d37de6ae0e1cb7c423c',
+            'IV': 'b3d8cc017cbb89b39e0f67e2',
+            'PT': 'c3b3c41f113a31b73d9a5cd432103069',
+            'AAD': '24825602bd12a984e0092d3e448eda5f',
+            'CT': '93fe7d9e9bfd10348a5606e5cafa7354',
+            'Tag': '0032a1dc85f1c9786925a2e71d8272dd',
+          },
+          {
+            'Key': 'd4a22488f8dd1d5c6c19a7d6ca17964c',
+            'IV': 'f3d5837f22ac1a0425e0d1d5',
+            'PT': '7b43016a16896497fb457be6d2a54122',
+            'AAD': 'f1c5d424b83f96c6ad8cb28ca0d20e475e023b5a',
+            'CT': 'c2bd67eef5e95cac27e3b06e3031d0a8',
+            'Tag': 'f23eacf9d1cdf8737726c58648826e9c',
+          },
+          {
+            'Key': '89850dd398e1f1e28443a33d40162664',
+            'IV': 'e462c58482fe8264aeeb7231',
+            'PT': '2805cdefb3ef6cc35cd1f169f98da81a',
+            'AAD':
+                'd74e99d1bdaa712864eec422ac507bddbe2b0d4633cd3dff29ce5059b49fe868526c59a2a3a604457bc2afea866e7606',
+            'CT': 'ba80e244b7fc9025cd031d0f63677e06',
+            'Tag': 'd84a8c3eac57d1bb0e890a8f461d1065',
+          },
+          {
+            'Key': 'bd7c5c63b7542b56a00ebe71336a1588',
+            'IV': '87721f23ba9c3c8ea5571abc',
+            'PT': 'de15ddbb1e202161e8a79af6a55ac6f3',
+            'AAD':
+                'a6ec8075a0d3370eb7598918f3b93e48444751624997b899a87fa6a9939f844e008aa8b70e9f4c3b1a19d3286bf543e7127bfecba1ad17a5ec53fccc26faecacc4c75369498eaa7d706aef634d0009279b11e4ba6c993e5e9ed9',
+            'CT': '41eb28c0fee4d762de972361c863bc80',
+            'Tag': '9cb567220d0b252eb97bff46e4b00ff8',
+          },
+          {
+            'Key': 'fe9bb47deb3a61e423c2231841cfd1fb',
+            'IV': '4d328eb776f500a2f7fb47aa',
+            'PT': 'f1cc3818e421876bb6b8bbd6c9',
+            'AAD': '',
+            'CT': 'b88c5c1977b35b517b0aeae967',
+            'Tag': '43fd4727fe5cdb4b5b42818dea7ef8c9',
+          },
+          {
+            'Key': 'dfefde23c6122bf0370ab5890e804b73',
+            'IV': '92d6a8029990670f16de79e2',
+            'PT': '64260a8c287de978e96c7521d0',
+            'AAD': 'a2b16d78251de6c191ce350e5c5ef242',
+            'CT': 'bf78de948a847c173649d4b4d0',
+            'Tag': '9da3829968cdc50794d1c30d41cd4515',
+          },
+          {
+            'Key': 'fe0121f42e599f88ff02a985403e19bb',
+            'IV': '3bb9eb7724cbe1943d43de21',
+            'PT': 'fd331ca8646091c29f21e5f0a1',
+            'AAD': '2662d895035b6519f3510eae0faa3900ad23cfdf',
+            'CT': '59fe29b07b0de8d869efbbd9b4',
+            'Tag': 'd24c3e9c1c73c0af1097e26061c857de',
+          },
+          {
+            'Key': 'cbd3b8dbfcfb11ce345706e6cd73881a',
+            'IV': 'dc62bb68d0ec9a5d759d6741',
+            'PT': '85f83bf598dfd55bc8bfde2a64',
+            'AAD':
+                '0944b661fe6294f3c92abb087ec1b259b032dc4e0c5f28681cbe6e63c2178f474326f35ad3ca80c28e3485e7e5b252c8',
+            'CT': '206f6b3bb032dfecd39f8340b1',
+            'Tag': '425a21b2ea90580c889134032b914bb5',
+          },
+          {
+            'Key': 'e5b1e7a94e9e1fda0873571eec713429',
+            'IV': '5ddde829a81713346af8e5b7',
+            'PT': '850069e5ed768b5dc9ed7ad485',
+            'AAD':
+                'b0ce75da427fba93da6d3455b2b440a877599a6d8d6d2d66ee90b5cf9a33baaa8329a9ffaac290e8e33f2af2548c2a8a181b3d4d9f8fac860cc26b0d26b9cc53bc9f405afa73605ebeb376f2d1d7fcb065bab92f20f295556ade',
+            'CT': 'c211d9079d5562659db01e17d1',
+            'Tag': '884893fb035d3d7237d47c363de62bb3',
+          },
+          {
+            'Key': '9971071059abc009e4f2bd69869db338',
+            'IV': '07a9a95ea3821e9c13c63251',
+            'PT':
+                'f54bc3501fed4f6f6dfb5ea80106df0bd836e6826225b75c0222f6e859b35983',
+            'AAD': '',
+            'CT':
+                '0556c159f84ef36cb1602b4526b12009c775611bffb64dc0d9ca9297cd2c6a01',
+            'Tag': '7870d9117f54811a346970f1de090c41',
+          },
+          {
+            'Key': '298efa1ccf29cf62ae6824bfc19557fc',
+            'IV': '6f58a93fe1d207fae4ed2f6d',
+            'PT':
+                'cc38bccd6bc536ad919b1395f5d63801f99f8068d65ca5ac63872daf16b93901',
+            'AAD': '021fafd238463973ffe80256e5b1c6b1',
+            'CT':
+                'dfce4e9cd291103d7fe4e63351d9e79d3dfd391e3267104658212da96521b7db',
+            'Tag': '542465ef599316f73a7a560509a2d9f2',
+          },
+          {
+            'Key': 'fedc7155192d00b23cdd98750db9ebba',
+            'IV': 'a76b74f55c1a1756a08338b1',
+            'PT':
+                '6831435b8857daf1c513b148820d13b5a72cc490bda79a98a6f520d8763c39d1',
+            'AAD': '2ad206c4176e7e552aa08836886816fafa77e759',
+            'CT':
+                '15823805da89a1923bfc1d6f87784d56bad1128b4dffdbdeefbb2fa562c35e68',
+            'Tag': 'd23dc455ced49887c717e8eabeec2984',
+          },
+          {
+            'Key': '48b7f337cdf9252687ecc760bd8ec184',
+            'IV': '3e894ebb16ce82a53c3e05b2',
+            'PT':
+                'bb2bac67a4709430c39c2eb9acfabc0d456c80d30aa1734e57997d548a8f0603',
+            'AAD':
+                '7d924cfd37b3d046a96eb5e132042405c8731e06509787bbeb41f258275746495e884d69871f77634c584bb007312234',
+            'CT':
+                'd263228b8ce051f67e9baf1ce7df97d10cd5f3bc972362055130c7d13c3ab2e7',
+            'Tag': '71446737ca1fa92e6d026d7d2ed1aa9c',
+          },
+          {
+            'Key': '8fbf7ca12fd525dde91e625873fe51c2',
+            'IV': '200bea517b9790a1cfadaf5e',
+            'PT':
+                '39d3e6277c4b4963840d1642e6faae0a5be2da97f61c4e55bb57ce021903d4c4',
+            'AAD':
+                'a414c07fe2e60bec9ccc409e9e899c6fe60580bb2607c861f7f08523e69cda1b9c3a711d1d9c35091771e4c950b9996d0ad04f2e00d1b3105853542a96e09ffffc2ec80f8cf88728f594f0aeb14f98a688234e8bfbf70327b364',
+            'CT':
+                'fe678ef76f69ac95db553b6dadd5a07a9dc8e151fe6a9fa3a1cd621636b87868',
+            'Tag': '7c860774f88332b9a7ce6bbd0272a727',
+          },
+          {
+            'Key': '594157ec4693202b030f33798b07176d',
+            'IV': '49b12054082660803a1df3df',
+            'PT':
+                '3feef98a976a1bd634f364ac428bb59cd51fb159ec1789946918dbd50ea6c9d594a3a31a5269b0da6936c29d063a5fa2cc8a1c',
+            'AAD': '',
+            'CT':
+                'c1b7a46a335f23d65b8db4008a49796906e225474f4fe7d39e55bf2efd97fd82d4167de082ae30fa01e465a601235d8d68bc69',
+            'Tag': 'ba92d3661ce8b04687e8788d55417dc2',
+          },
+          {
+            'Key': 'b61553bb854895b929751cd0c5f80384',
+            'IV': '8863f999ae64e55d0bbd7457',
+            'PT':
+                '9b1b113217d0c4ea7943cf123c69c6ad2e3c97368c51c9754145d155dde1ee8640c8cafff17a5c9737d26a137eee4bf369096d',
+            'AAD': 'd914b5f2d1b08ce53ea59cb310587245',
+            'CT':
+                'acfab4632b8a25805112f13d85e082bc89dc49bd92164fa8a2dad242c3a1b2f2696f2fdff579025f3f146ea97da3e47dc34b65',
+            'Tag': '5d9b5f4a9868c1c69cbd6fd851f01340',
+          },
+          {
+            'Key': 'fe47fcce5fc32665d2ae399e4eec72ba',
+            'IV': '5adb9609dbaeb58cbd6e7275',
+            'PT':
+                '7c0e88c88899a779228465074797cd4c2e1498d259b54390b85e3eef1c02df60e743f1b840382c4bccaf3bafb4ca8429bea063',
+            'AAD': '88319d6e1d3ffa5f987199166c8a9b56c2aeba5a',
+            'CT':
+                '98f4826f05a265e6dd2be82db241c0fbbbf9ffb1c173aa83964b7cf5393043736365253ddbc5db8778371495da76d269e5db3e',
+            'Tag': '291ef1982e4defedaa2249f898556b47',
+          },
+          {
+            'Key': '3c50622868f450aa0928990c15e1eb36',
+            'IV': '811d5290768d57e7d87bb6c7',
+            'PT':
+                'edd0a8f82833e919740fe2bf9edecf4ac86c72dc89490cef7b6983aaaf99fc856c5cc87d63f98a7c861bf3271fea6da86a15ab',
+            'AAD':
+                'dae2c7e0a3d3fd2bc04eca19b15178a003b5cf84890c28c2a615f20f8adb427f70698c12b2ef87780c1193fbb8cd1674',
+            'CT':
+                'a51425b0608d3b4b46d4ec05ca1ddaf02bdd2089ae0554ecfb2a1c84c63d82dc71ddb9ab1b1f0b49de2ad27c2b5173e7000aa6',
+            'Tag': 'bd9b5efca48008cd973a4f7d2c723844',
+          },
+          {
+            'Key': '2c1f21cf0f6fb3661943155c3e3d8492',
+            'IV': '23cb5ff362e22426984d1907',
+            'PT':
+                '42f758836986954db44bf37c6ef5e4ac0adaf38f27252a1b82d02ea949c8a1a2dbc0d68b5615ba7c1220ff6510e259f06655d8',
+            'AAD':
+                '5d3624879d35e46849953e45a32a624d6a6c536ed9857c613b572b0333e701557a713e3f010ecdf9a6bd6c9e3e44b065208645aff4aabee611b391528514170084ccf587177f4488f33cfb5e979e42b6e1cfc0a60238982a7aec',
+            'CT':
+                '81824f0e0d523db30d3da369fdc0d60894c7a0a20646dd015073ad2732bd989b14a222b6ad57af43e1895df9dca2a5344a62cc',
+            'Tag': '57a3ee28136e94c74838997ae9823f3a',
+          },
+        ];
+    for (let i = 0; i < NIST_TEST_VECTORS.length; i++) {
+      const testVector = NIST_TEST_VECTORS[i];
+      if (userAgent.EDGE && !testVector['PT']) {
+        continue;  // b/120299887
+      }
+      const aead = await AesGcm.newInstance(Bytes.fromHex(testVector['Key']));
+      const ciphertext = Bytes.fromHex(
+          testVector['IV'] + testVector['CT'] + testVector['Tag']);
+      const aad = Bytes.fromHex(testVector['AAD']);
+      try {
+        const plaintext = await aead.decrypt(ciphertext, aad);
+        assertEquals(Bytes.toHex(plaintext), testVector['PT']);
+      } catch (e) {
+        fail(e);
+      }
+    }
+  },
+});
diff --git a/javascript/subtle/bytes.js b/javascript/subtle/bytes.js
new file mode 100644
index 0000000..c748eab
--- /dev/null
+++ b/javascript/subtle/bytes.js
@@ -0,0 +1,205 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.Bytes');
+
+const InvalidArgumentsException = goog.require('tink.exception.InvalidArgumentsException');
+
+/**
+ * Does near constant time byte array comparison.
+ * @param {!Uint8Array} ba1 The first bytearray to check.
+ * @param {!Uint8Array} ba2 The second bytearray to check.
+ * @return {boolean} If the array are equal.
+ */
+const isEqual = function(ba1, ba2) {
+  if (ba1.length !== ba2.length) {
+    return false;
+  }
+  let result = 0;
+  for (let i = 0; i < ba1.length; i++) {
+    result |= ba1[i] ^ ba2[i];
+  }
+  return result == 0;
+};
+
+
+/**
+ * Returns a new array that is the result of joining the arguments.
+ * @param {...!Uint8Array} var_args
+ * @return {!Uint8Array}
+ */
+const concat = function(var_args) {
+  let length = 0;
+  for (let i = 0; i < arguments.length; i++) {
+    length += arguments[i].length;
+  }
+  let result = new Uint8Array(length);
+  let curOffset = 0;
+  for (let i = 0; i < arguments.length; i++) {
+    result.set(arguments[i], curOffset);
+    curOffset += arguments[i].length;
+  }
+  return result;
+};
+
+/**
+ * Converts a non-negative integer number to a 64-bit big-endian byte array.
+ * @param {number} value The number to convert.
+ * @return {!Uint8Array} The number as a big-endian byte array.
+ * @throws {InvalidArgumentsException}
+ * @static
+ */
+const fromNumber = function(value) {
+  if (isNaN(value) || value % 1 !== 0) {
+    throw new InvalidArgumentsException('cannot convert non-integer value');
+  }
+  if (value < 0) {
+    throw new InvalidArgumentsException('cannot convert negative number');
+  }
+  if (value > Number.MAX_SAFE_INTEGER) {
+    throw new InvalidArgumentsException(
+        'cannot convert number larger than ' + Number.MAX_SAFE_INTEGER);
+  }
+  const two_power_32 = 2**32;
+  let low = value % two_power_32;
+  let high = value / two_power_32;
+  const result = new Uint8Array(8);
+  for (let i = 7; i >= 4; i--) {
+    result[i] = low & 0xff;
+    low >>>= 8;
+  }
+  for (let i = 3; i >= 0; i--) {
+    result[i] = high & 0xff;
+    high >>>= 8;
+  }
+  return result;
+};
+
+/**
+ * Converts the hex string to a byte array.
+ *
+ * @param {string} hex the input
+ * @return {!Uint8Array} the byte array output
+ * @throws {!InvalidArgumentsException}
+ * @static
+ */
+const fromHex = function(hex) {
+  if (hex.length % 2 != 0) {
+    throw new InvalidArgumentsException(
+        'Hex string length must be multiple of 2');
+  }
+  var arr = new Uint8Array(hex.length / 2);
+  for (var i = 0; i < hex.length; i += 2) {
+    arr[i / 2] = parseInt(hex.substring(i, i + 2), 16);
+  }
+  return arr;
+};
+
+/**
+ * Converts a byte array to hex.
+ *
+ * @param {!Uint8Array} bytes the byte array input
+ * @return {string} hex the output
+ * @static
+ */
+const toHex = function(bytes) {
+  let result = '';
+  for (let i = 0; i < bytes.length; i++) {
+    let hexByte = bytes[i].toString(16);
+    result += hexByte.length > 1 ? hexByte : '0' + hexByte;
+  }
+  return result;
+};
+
+/**
+ * Converts the Base64 string to a byte array.
+ *
+ * @param {string} encoded the base64 string
+ * @param {boolean=} opt_webSafe True indicates we should use the alternative
+ *     alphabet, which does not require escaping for use in URLs.
+ * @return {!Uint8Array} the byte array output
+ * @static
+ */
+const fromBase64 = function(encoded, opt_webSafe) {
+  if (opt_webSafe) {
+    const normalBase64 = encoded.replace(/-/g, '+').replace(/_/g, '/');
+    return fromByteString(window.atob(normalBase64));
+  }
+  return fromByteString(window.atob(encoded));
+};
+
+/**
+ * Base64 encode a byte array.
+ *
+ * @param {!Uint8Array} bytes the byte array input
+ * @param {boolean=} opt_webSafe True indicates we should use the alternative
+ *     alphabet, which does not require escaping for use in URLs.
+ * @return {string} base64 output
+ * @static
+ */
+const toBase64 = function(bytes, opt_webSafe) {
+  let encoded =
+      window.btoa(toByteString(bytes)).replace(/=/g, '') /* padding */;
+  if (opt_webSafe) {
+    return encoded.replace(/\+/g, '-').replace(/\//g, '_');
+  }
+  return encoded;
+};
+
+/**
+ * Converts a byte string to a byte array. Only support ASCII and Latin-1
+ * strings, does not support multi-byte characters.
+ *
+ * @param {string} str the input
+ * @return {!Uint8Array} the byte array output
+ * @static
+ */
+const fromByteString = function(str) {
+  let output = [];
+  let p = 0;
+  for (let i = 0; i < str.length; i++) {
+    let c = str.charCodeAt(i);
+    output[p++] = c;
+  }
+  return new Uint8Array(output);
+};
+
+/**
+ * Turns a byte array into the string given by the concatenation of the
+ * characters to which the numbers correspond. Each byte is corresponding to a
+ * character. Does not support multi-byte characters.
+ *
+ * @param {!Uint8Array} bytes Array of numbers representing
+ *     characters.
+ * @return {string} Stringification of the array.
+ */
+const toByteString = function(bytes) {
+  var str = '';
+  for (var i = 0; i < bytes.length; i += 1) {
+    str += String.fromCharCode(bytes[i]);
+  }
+  return str;
+};
+
+exports = {
+  concat,
+  fromBase64,
+  fromHex,
+  fromNumber,
+  fromByteString,
+  isEqual,
+  toBase64,
+  toHex,
+  toByteString,
+};
diff --git a/javascript/subtle/bytes_test.js b/javascript/subtle/bytes_test.js
new file mode 100644
index 0000000..8a0266b
--- /dev/null
+++ b/javascript/subtle/bytes_test.js
@@ -0,0 +1,145 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.BytesTest');
+goog.setTestOnly('tink.subtle.BytesTest');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const Random = goog.require('tink.subtle.Random');
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+  testConcat: function() {
+    let ba1 = new Uint8Array(0);
+    let ba2 = new Uint8Array(0);
+    let ba3 = new Uint8Array(0);
+    let result = Bytes.concat(ba1, ba2, ba3);
+    assertEquals(0, result.length);
+
+    ba1 = Random.randBytes(10);
+    result = Bytes.concat(ba1, ba2, ba3);
+    assertEquals(ba1.length, result.length);
+    assertEquals(Bytes.toHex(ba1), Bytes.toHex(result));
+
+    result = Bytes.concat(ba2, ba1, ba3);
+    assertEquals(ba1.length, result.length);
+    assertEquals(Bytes.toHex(ba1), Bytes.toHex(result));
+
+    result = Bytes.concat(ba3, ba2, ba1);
+    assertEquals(ba1.length, result.length);
+    assertEquals(Bytes.toHex(ba1), Bytes.toHex(result));
+
+    ba2 = Random.randBytes(11);
+    result = Bytes.concat(ba1, ba2, ba3);
+    assertEquals(ba1.length + ba2.length, result.length);
+    assertEquals(Bytes.toHex(ba1) + Bytes.toHex(ba2), Bytes.toHex(result));
+
+    result = Bytes.concat(ba1, ba3, ba2);
+    assertEquals(ba1.length + ba2.length, result.length);
+    assertEquals(Bytes.toHex(ba1) + Bytes.toHex(ba2), Bytes.toHex(result));
+
+    result = Bytes.concat(ba3, ba1, ba2);
+    assertEquals(ba1.length + ba2.length, result.length);
+    assertEquals(Bytes.toHex(ba1) + Bytes.toHex(ba2), Bytes.toHex(result));
+
+    ba3 = Random.randBytes(12);
+    result = Bytes.concat(ba1, ba2, ba3);
+    assertEquals(ba1.length + ba2.length + ba3.length, result.length);
+    assertEquals(
+        Bytes.toHex(ba1) + Bytes.toHex(ba2) + Bytes.toHex(ba3),
+        Bytes.toHex(result));
+  },
+
+  testFromNumber: function() {
+    let number = 0;
+    assertArrayEquals(
+        [0, 0, 0, 0, 0, 0, 0, 0], Array.from(Bytes.fromNumber(number)));
+    number = 1;
+    assertArrayEquals(
+        [0, 0, 0, 0, 0, 0, 0, 1], Array.from(Bytes.fromNumber(number)));
+    number = 4294967296;  // 2^32
+    assertArrayEquals(
+        [0, 0, 0, 1, 0, 0, 0, 0], Array.from(Bytes.fromNumber(number)));
+    number = 4294967297;  // 2^32 + 1
+    assertArrayEquals(
+        [0, 0, 0, 1, 0, 0, 0, 1], Array.from(Bytes.fromNumber(number)));
+    number = Number.MAX_SAFE_INTEGER; // 2^53 - 1
+    assertArrayEquals(
+        [0, 31, 255, 255, 255, 255, 255, 255],
+        Array.from(Bytes.fromNumber(number)));
+
+    assertThrows(function() {
+      Bytes.fromNumber('blah');  // not a number
+    });
+    assertThrows(function() {
+      Bytes.fromNumber(3.14);
+    });
+    assertThrows(function() {
+      Bytes.fromNumber(-1);
+    });
+    assertThrows(function() {
+      Bytes.fromNumber(Number.MAX_SAFE_INTEGER + 1);
+    });
+  },
+
+  testToBase64_removeAllPadding() {
+    for (let i = 0; i < 10; i++) {
+      const array = new Uint8Array(i);
+      const base64Representation = Bytes.toBase64(array, true);
+      assertNotEquals(
+          '=', base64Representation[base64Representation.length - 1]);
+    }
+  },
+
+  testToBase64_fromBase64() {
+    for (let i = 0; i < 100; i++) {
+      const array = Random.randBytes(i);
+      const base64Representation = Bytes.toBase64(array, true);
+      const arrayRepresentation = Bytes.fromBase64(base64Representation, true);
+      assertObjectEquals(array, arrayRepresentation);
+    }
+  },
+
+  testFromByteString() {
+    assertObjectEquals(
+        'empty string', new Uint8Array(), Bytes.fromByteString(''));
+
+    let arr = new Uint8Array(
+        [72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100]);
+    assertObjectEquals('ASCII', arr, Bytes.fromByteString('Hello, world'));
+
+    arr = new Uint8Array([83, 99, 104, 246, 110]);
+    assertObjectEquals('Latin', arr, Bytes.fromByteString('Sch\u00f6n'));
+  },
+
+  testToByteString() {
+    assertEquals('empty string', '', Bytes.toByteString(new Uint8Array()));
+
+    let arr = new Uint8Array(
+        [72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100]);
+    assertEquals('ASCII', 'Hello, world', Bytes.toByteString(arr));
+
+    arr = new Uint8Array([83, 99, 104, 246, 110]);
+    assertEquals('Latin', 'Sch\u00f6n', Bytes.toByteString(arr));
+  },
+
+  testToString_fromString() {
+    for (let i = 0; i < 100; i++) {
+      const array = Random.randBytes(i);
+      const str = Bytes.toByteString(array);
+      const arrayRepresentation = Bytes.fromByteString(str);
+      assertObjectEquals(array, arrayRepresentation);
+    }
+  },
+});
diff --git a/javascript/subtle/ecdsa_sign.js b/javascript/subtle/ecdsa_sign.js
new file mode 100644
index 0000000..882d50d
--- /dev/null
+++ b/javascript/subtle/ecdsa_sign.js
@@ -0,0 +1,90 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.EcdsaSign');
+
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const PublicKeySign = goog.require('tink.PublicKeySign');
+const SecurityException = goog.require('tink.exception.SecurityException');
+const Validators = goog.require('tink.subtle.Validators');
+
+/**
+ * Implementation of ECDSA signing.
+ *
+ * @implements {PublicKeySign}
+ * @public
+ * @final
+ */
+class EcdsaSign {
+  /**
+   * @param {!webCrypto.CryptoKey} key
+   * @param {string} hash
+   * @param {?EllipticCurves.EcdsaSignatureEncodingType=} opt_encoding The
+   *     optional encoding of the signature. If absent, default is IEEE P1363.
+   */
+  constructor(key, hash, opt_encoding) {
+    /** @const @private {!webCrypto.CryptoKey} */
+    this.key_ = key;
+
+    /** @const @private {string} */
+    this.hash_ = hash;
+
+    if (!opt_encoding) {
+      opt_encoding = EllipticCurves.EcdsaSignatureEncodingType.IEEE_P1363;
+    }
+
+    /** @const @private {!EllipticCurves.EcdsaSignatureEncodingType} */
+    this.encoding_ = opt_encoding;
+  }
+
+  /**
+   * @param {!webCrypto.JsonWebKey} jwk
+   * @param {string} hash
+   * @param {?EllipticCurves.EcdsaSignatureEncodingType=} opt_encoding The
+   *     optional encoding of the signature. If absent, default is IEEE P1363.
+   *
+   * @return {!Promise<!PublicKeySign>}
+   * @static
+   */
+  static async newInstance(jwk, hash, opt_encoding) {
+    if (!jwk) {
+      throw new SecurityException('private key has to be non-null');
+    }
+    Validators.validateEcdsaParams(jwk.crv, hash);
+    const cryptoKey = await EllipticCurves.importPrivateKey('ECDSA', jwk);
+    return new EcdsaSign(cryptoKey, hash, opt_encoding);
+  }
+
+  /**
+   * @override
+   */
+  async sign(data) {
+    Validators.requireUint8Array(data);
+    const signature = await window.crypto.subtle.sign(
+        {
+          name: 'ECDSA',
+          hash: {
+            name: this.hash_,
+          },
+        },
+        this.key_, data);
+
+    if (this.encoding_ == EllipticCurves.EcdsaSignatureEncodingType.DER) {
+      return EllipticCurves.ecdsaIeee2Der(new Uint8Array(signature));
+    }
+    return new Uint8Array(signature);
+  }
+}
+
+exports = EcdsaSign;
diff --git a/javascript/subtle/ecdsa_sign_test.js b/javascript/subtle/ecdsa_sign_test.js
new file mode 100644
index 0000000..06915b6
--- /dev/null
+++ b/javascript/subtle/ecdsa_sign_test.js
@@ -0,0 +1,162 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.EcdsaSignTest');
+goog.setTestOnly('tink.subtle.EcdsaSignTest');
+
+const EcdsaSign = goog.require('tink.subtle.EcdsaSign');
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const Environment = goog.require('tink.subtle.Environment');
+const Random = goog.require('tink.subtle.Random');
+const TestCase = goog.require('goog.testing.TestCase');
+const testSuite = goog.require('goog.testing.testSuite');
+const userAgent = goog.require('goog.userAgent');
+
+testSuite({
+  shouldRunTests() {
+    return Environment.IS_WEBCRYPTO_AVAILABLE &&
+        !userAgent.EDGE;  // b/120286783
+  },
+
+  setUp() {
+    // Use a generous promise timeout for running continuously.
+    TestCase.getActiveTestCase().promiseTimeout = 1000 * 1000;  // 1000s
+  },
+
+  tearDown() {
+    // Reset the promise timeout to default value.
+    TestCase.getActiveTestCase().promiseTimeout = 1000;  // 1s
+  },
+
+  async testSign() {
+    const keyPair = await EllipticCurves.generateKeyPair('ECDSA', 'P-256');
+    const signer = await EcdsaSign.newInstance(
+        await EllipticCurves.exportCryptoKey(keyPair.privateKey), 'SHA-256');
+    for (let i = 0; i < 100; i++) {
+      const data = Random.randBytes(i);
+      const signature = await signer.sign(data);
+      const isValid = await window.crypto.subtle.verify(
+          {
+            name: 'ECDSA',
+            hash: {
+              name: 'SHA-256',
+            },
+          },
+          keyPair.publicKey, signature, data);
+      assertTrue(isValid);
+    }
+  },
+
+  async testSignWithDerEncoding() {
+    const keyPair = await EllipticCurves.generateKeyPair('ECDSA', 'P-256');
+    const signer = await EcdsaSign.newInstance(
+        await EllipticCurves.exportCryptoKey(keyPair.privateKey), 'SHA-256',
+        EllipticCurves.EcdsaSignatureEncodingType.DER);
+    for (let i = 0; i < 100; i++) {
+      const data = Random.randBytes(i);
+      let signature = await signer.sign(data);
+      // Should fail WebCrypto only accepts IEEE encoding.
+      let isValid = await window.crypto.subtle.verify(
+          {
+            name: 'ECDSA',
+            hash: {
+              name: 'SHA-256',
+            },
+          },
+          keyPair.publicKey, signature, data);
+      assertFalse(isValid);
+      // Convert the signature to IEEE encoding.
+      signature = EllipticCurves.ecdsaDer2Ieee(signature, 64);
+      isValid = await window.crypto.subtle.verify(
+          {
+            name: 'ECDSA',
+            hash: {
+              name: 'SHA-256',
+            },
+          },
+          keyPair.publicKey, signature, data);
+      assertTrue(isValid);
+    }
+  },
+
+  async testSignAlwaysGenerateNewSignatures() {
+    const keyPair = await EllipticCurves.generateKeyPair('ECDSA', 'P-256');
+    const signer = await EcdsaSign.newInstance(
+        await EllipticCurves.exportCryptoKey(keyPair.privateKey), 'SHA-256');
+    const signatures = new Set();
+    for (let i = 0; i < 100; i++) {
+      const data = Random.randBytes(i);
+      const signature = await signer.sign(data);
+      signatures.add(signature);
+    }
+    assertEquals(100, signatures.size);
+  },
+
+  async testConstructorWithNullPrivateKey() {
+    try {
+      await EcdsaSign.newInstance(null, 'SHA-256');
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals('CustomError: private key has to be non-null', e.toString());
+    }
+  },
+
+  async testConstructorWithInvalidHash() {
+    try {
+      const keyPair = await EllipticCurves.generateKeyPair('ECDSA', 'P-256');
+      await EcdsaSign.newInstance(
+          await EllipticCurves.exportCryptoKey(keyPair.privateKey), 'SHA-1');
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: expected SHA-256 (because curve is P-256) but ' +
+              'got SHA-1',
+          e.toString());
+    }
+
+    try {
+      const keyPair = await EllipticCurves.generateKeyPair('ECDSA', 'P-384');
+      await EcdsaSign.newInstance(
+          await EllipticCurves.exportCryptoKey(keyPair.privateKey), 'SHA-256');
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: expected SHA-384 or SHA-512 (because curve is P-384) but got SHA-256',
+          e.toString());
+    }
+
+    try {
+      const keyPair = await EllipticCurves.generateKeyPair('ECDSA', 'P-521');
+      await EcdsaSign.newInstance(
+          await EllipticCurves.exportCryptoKey(keyPair.privateKey), 'SHA-256');
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: expected SHA-512 (because curve is P-521) but got SHA-256',
+          e.toString());
+    }
+  },
+
+  async testConstructorWithInvalidCurve() {
+    try {
+      const keyPair = await EllipticCurves.generateKeyPair('ECDSA', 'P-256');
+      const jwk = await EllipticCurves.exportCryptoKey(keyPair.privateKey);
+      jwk.crv = 'blah';
+      await EcdsaSign.newInstance(jwk, 'SHA-256');
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals('CustomError: unsupported curve: blah', e.toString());
+    }
+  },
+});
diff --git a/javascript/subtle/ecdsa_verify.js b/javascript/subtle/ecdsa_verify.js
new file mode 100644
index 0000000..9581f1d
--- /dev/null
+++ b/javascript/subtle/ecdsa_verify.js
@@ -0,0 +1,94 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.EcdsaVerify');
+
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const PublicKeyVerify = goog.require('tink.PublicKeyVerify');
+const SecurityException = goog.require('tink.exception.SecurityException');
+const Validators = goog.require('tink.subtle.Validators');
+
+/**
+ * Implementation of ECDSA verifying.
+ *
+ * @implements {PublicKeyVerify}
+ * @public
+ * @final
+ */
+class EcdsaVerify {
+  /**
+   * @param {!webCrypto.CryptoKey} key
+   * @param {string} hash
+   * @param {!EllipticCurves.EcdsaSignatureEncodingType} encoding The
+   *     encoding of the signature.
+   */
+  constructor(key, hash, encoding) {
+    /** @const @private {!webCrypto.CryptoKey} */
+    this.key_ = key;
+
+    /** @const @private {string} */
+    this.hash_ = hash;
+
+    /** @const @private {!EllipticCurves.EcdsaSignatureEncodingType} */
+    this.encoding_ = encoding;
+
+    /** @const @private {number} */
+    this.ieeeSignatureLength_ = 2 *
+        EllipticCurves.fieldSizeInBytes(
+            EllipticCurves.curveFromString(key.algorithm['namedCurve']));
+  }
+
+  /**
+   * @param {!webCrypto.JsonWebKey} jwk
+   * @param {string} hash
+   * @param {?EllipticCurves.EcdsaSignatureEncodingType=} opt_encoding The
+   *     optional encoding of the signature. If absent, default is IEEE P1363.
+   *
+   * @return {!Promise<!PublicKeyVerify>}
+   * @static
+   */
+  static async newInstance(jwk, hash, opt_encoding) {
+    if (!jwk) {
+      throw new SecurityException('public key has to be non-null');
+    }
+    Validators.validateEcdsaParams(jwk.crv, hash);
+    const cryptoKey = await EllipticCurves.importPublicKey('ECDSA', jwk);
+    if (!opt_encoding) {
+      opt_encoding = EllipticCurves.EcdsaSignatureEncodingType.IEEE_P1363;
+    }
+    return new EcdsaVerify(cryptoKey, hash, opt_encoding);
+  }
+
+  /**
+   * @override
+   */
+  async verify(signature, data) {
+    Validators.requireUint8Array(signature);
+    Validators.requireUint8Array(data);
+    if (this.encoding_ == EllipticCurves.EcdsaSignatureEncodingType.DER) {
+      signature =
+          EllipticCurves.ecdsaDer2Ieee(signature, this.ieeeSignatureLength_);
+    }
+    return await window.crypto.subtle.verify(
+        {
+          name: 'ECDSA',
+          hash: {
+            name: this.hash_,
+          },
+        },
+        this.key_, signature, data);
+  }
+}
+
+exports = EcdsaVerify;
diff --git a/javascript/subtle/ecdsa_verify_test.js b/javascript/subtle/ecdsa_verify_test.js
new file mode 100644
index 0000000..5ffae66
--- /dev/null
+++ b/javascript/subtle/ecdsa_verify_test.js
@@ -0,0 +1,222 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.EcdsaVerifyTest');
+goog.setTestOnly('tink.subtle.EcdsaVerifyTest');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const EcdsaSign = goog.require('tink.subtle.EcdsaSign');
+const EcdsaVerify = goog.require('tink.subtle.EcdsaVerify');
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const Environment = goog.require('tink.subtle.Environment');
+const Random = goog.require('tink.subtle.Random');
+const TestCase = goog.require('goog.testing.TestCase');
+const Validators = goog.require('tink.subtle.Validators');
+const testSuite = goog.require('goog.testing.testSuite');
+const userAgent = goog.require('goog.userAgent');
+const wycheproofEcdsaTestVectors = goog.require('tink.subtle.wycheproofEcdsaTestVectors');
+
+testSuite({
+  shouldRunTests() {
+    return Environment.IS_WEBCRYPTO_AVAILABLE &&
+        !userAgent.EDGE;  // b/120286783
+  },
+
+  setUp() {
+    // Use a generous promise timeout for running continuously.
+    TestCase.getActiveTestCase().promiseTimeout = 1000 * 1000;  // 1000s
+  },
+
+  tearDown() {
+    // Reset the promise timeout to default value.
+    TestCase.getActiveTestCase().promiseTimeout = 1000;  // 1s
+  },
+
+  async testVerify() {
+    const keyPair = await EllipticCurves.generateKeyPair('ECDSA', 'P-256');
+    const signer = await EcdsaSign.newInstance(
+        await EllipticCurves.exportCryptoKey(keyPair.privateKey), 'SHA-256');
+    const verifier = await EcdsaVerify.newInstance(
+        await EllipticCurves.exportCryptoKey(keyPair.publicKey), 'SHA-256');
+    for (let i = 0; i < 100; i++) {
+      const data = Random.randBytes(i);
+      const signature = await signer.sign(data);
+      assertTrue(await verifier.verify(signature, data));
+    }
+  },
+
+  async testVerifyWithDerEncoding() {
+    const keyPair = await EllipticCurves.generateKeyPair('ECDSA', 'P-256');
+    const signer = await EcdsaSign.newInstance(
+        await EllipticCurves.exportCryptoKey(keyPair.privateKey), 'SHA-256',
+        EllipticCurves.EcdsaSignatureEncodingType.DER);
+    const verifier = await EcdsaVerify.newInstance(
+        await EllipticCurves.exportCryptoKey(keyPair.publicKey), 'SHA-256');
+    const verifierDer = await EcdsaVerify.newInstance(
+        await EllipticCurves.exportCryptoKey(keyPair.publicKey), 'SHA-256',
+        EllipticCurves.EcdsaSignatureEncodingType.DER);
+    for (let i = 0; i < 100; i++) {
+      const data = Random.randBytes(i);
+      const signature = await signer.sign(data);
+      assertFalse(await verifier.verify(signature, data));
+      assertTrue(await verifierDer.verify(signature, data));
+    }
+  },
+
+  async testConstructorWithNullPublicKey() {
+    try {
+      await EcdsaVerify.newInstance(null, 'SHA-256');
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals('CustomError: public key has to be non-null', e.toString());
+    }
+  },
+
+  async testConstructorWithInvalidHash() {
+    try {
+      const keyPair = await EllipticCurves.generateKeyPair('ECDSA', 'P-256');
+      await EcdsaVerify.newInstance(
+          await EllipticCurves.exportCryptoKey(keyPair.publicKey), 'SHA-1');
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: expected SHA-256 (because curve is P-256) but got SHA-1',
+          e.toString());
+    }
+
+    try {
+      const keyPair = await EllipticCurves.generateKeyPair('ECDSA', 'P-384');
+      await EcdsaVerify.newInstance(
+          await EllipticCurves.exportCryptoKey(keyPair.publicKey), 'SHA-256');
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: expected SHA-384 or SHA-512 (because curve is P-384) but got SHA-256',
+          e.toString());
+    }
+
+    try {
+      const keyPair = await EllipticCurves.generateKeyPair('ECDSA', 'P-521');
+      await EcdsaVerify.newInstance(
+          await EllipticCurves.exportCryptoKey(keyPair.publicKey), 'SHA-256');
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: expected SHA-512 (because curve is P-521) but got SHA-256',
+          e.toString());
+    }
+  },
+
+  async testConstructorWithInvalidCurve() {
+    try {
+      const keyPair = await EllipticCurves.generateKeyPair('ECDSA', 'P-256');
+      const jwk = await EllipticCurves.exportCryptoKey(keyPair.publicKey);
+      jwk.crv = 'blah';
+      await EcdsaVerify.newInstance(jwk, 'SHA-256');
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals('CustomError: unsupported curve: blah', e.toString());
+    }
+  },
+
+  async testVerifyModifiedSignature() {
+    const keyPair = await EllipticCurves.generateKeyPair('ECDSA', 'P-256');
+    const signer = await EcdsaSign.newInstance(
+        await EllipticCurves.exportCryptoKey(keyPair.privateKey), 'SHA-256');
+    const verifier = await EcdsaVerify.newInstance(
+        await EllipticCurves.exportCryptoKey(keyPair.publicKey), 'SHA-256');
+    const data = Random.randBytes(20);
+    const signature = await signer.sign(data);
+
+    for (let i = 0; i < signature.length; i++) {
+      for (let j = 0; j < 8; j++) {
+        const s1 = new Uint8Array(signature);
+        s1[i] = (s1[i] ^ (1 << j));
+        assertFalse(await verifier.verify(s1, data));
+      }
+    }
+  },
+
+  async testVerifyModifiedData() {
+    const keyPair = await EllipticCurves.generateKeyPair('ECDSA', 'P-256');
+    const signer = await EcdsaSign.newInstance(
+        await EllipticCurves.exportCryptoKey(keyPair.privateKey), 'SHA-256');
+    const verifier = await EcdsaVerify.newInstance(
+        await EllipticCurves.exportCryptoKey(keyPair.publicKey), 'SHA-256');
+    const data = Random.randBytes(20);
+    const signature = await signer.sign(data);
+
+    for (let i = 0; i < data.length; i++) {
+      for (let j = 0; j < 8; j++) {
+        const data1 = new Uint8Array(data);
+        data1[i] = (data1[i] ^ (1 << j));
+        assertFalse(await verifier.verify(signature, data1));
+      }
+    }
+  },
+
+  async testWycheproof() {
+    for (let testGroup of wycheproofEcdsaTestVectors['testGroups']) {
+      try {
+        Validators.validateEcdsaParams(
+            testGroup['jwk']['crv'], testGroup['sha']);
+      } catch (e) {
+        // Tink does not support this config.
+        continue;
+      }
+      const verifier =
+          await EcdsaVerify.newInstance(testGroup['jwk'], testGroup['sha']);
+      let errors = '';
+      for (let test of testGroup['tests']) {
+        errors += await runWycheproofTest(verifier, test);
+      }
+      if (errors !== '') {
+        fail(errors);
+      }
+    }
+  },
+
+});
+
+/**
+ * Runs the test with test vector given as an input and returns either empty
+ * string or a text describing the failure.
+ *
+ * @param {!EcdsaVerify} verifier
+ * @param {!Object} test - JSON object with test data
+ * @return {!Promise<string>}
+ */
+const runWycheproofTest = async function(verifier, test) {
+  try {
+    const sig = Bytes.fromHex(test['sig']);
+    const msg = Bytes.fromHex(test['msg']);
+    const isValid = await verifier.verify(sig, msg);
+    if (isValid) {
+      if (test['result'] === 'invalid') {
+        return 'invalid signature accepted on test ' + test['tcId'] + '\n';
+      }
+    } else {
+      if (test['result'] === 'valid') {
+        return 'valid signature rejected on test ' + test['tcId'] + '\n';
+      }
+    }
+  } catch (e) {
+    if (test['result'] === 'valid') {
+      return 'valid signature rejected on test ' + test['tcId'] +
+          ': unexpected exception \"' + e.toString() + '\".\n';
+    }
+  }
+  // If the test passes return an empty string.
+  return '';
+};
diff --git a/javascript/subtle/ecies_aead_hkdf_dem_helper.js b/javascript/subtle/ecies_aead_hkdf_dem_helper.js
new file mode 100644
index 0000000..b70dff7
--- /dev/null
+++ b/javascript/subtle/ecies_aead_hkdf_dem_helper.js
@@ -0,0 +1,39 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.EciesAeadHkdfDemHelper');
+
+const Aead = goog.require('tink.Aead');
+
+/**
+ * A helper for DEM (data encapsulation mechanism) of ECIES-AEAD-HKDF.
+ * @record
+ */
+class EciesAeadHkdfDemHelper {
+  /**
+   * @return {number} the size of the DEM key in bytes
+   */
+  getDemKeySizeInBytes() {}
+
+  /**
+   * Creates a new `Aead` primitive that uses the key material given in
+   * `demKey`, which must be of length `getDemKeySizeInBytes()`.
+   *
+   * @param {!Uint8Array} demKey the DEM key.
+   * @return {!Promise.<!Aead>} the newly created `Aead` primitive.
+   */
+  getAead(demKey) {}
+}
+
+exports = EciesAeadHkdfDemHelper;
diff --git a/javascript/subtle/ecies_aead_hkdf_hybrid_decrypt.js b/javascript/subtle/ecies_aead_hkdf_hybrid_decrypt.js
new file mode 100644
index 0000000..def6f83
--- /dev/null
+++ b/javascript/subtle/ecies_aead_hkdf_hybrid_decrypt.js
@@ -0,0 +1,157 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+//
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.EciesAeadHkdfHybridDecrypt');
+
+const Aead = goog.require('tink.Aead');
+const EciesAeadHkdfDemHelper = goog.require('tink.subtle.EciesAeadHkdfDemHelper');
+const EciesHkdfKemRecipient = goog.require('tink.subtle.EciesHkdfKemRecipient');
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const HybridDecrypt = goog.require('tink.HybridDecrypt');
+const SecurityException = goog.require('tink.exception.SecurityException');
+
+/**
+ * Implementation of ECIES AEAD HKDF hybrid decryption.
+ *
+ * @implements {HybridDecrypt}
+ * @protected
+ * @final
+ */
+class EciesAeadHkdfHybridDecrypt {
+  /**
+   * @param {!webCrypto.JsonWebKey} recipientPrivateKey
+   * @param {!EciesHkdfKemRecipient} kemRecipient
+   * @param {string} hkdfHash the name of the HMAC algorithm, accepted names
+   *     are: SHA-1, SHA-256 and SHA-512.
+   * @param {!EllipticCurves.PointFormatType} pointFormat
+   * @param {!EciesAeadHkdfDemHelper} demHelper
+   * @param {!Uint8Array=} opt_hkdfSalt
+   */
+  constructor(
+      recipientPrivateKey, kemRecipient, hkdfHash, pointFormat, demHelper,
+      opt_hkdfSalt) {
+    if (!recipientPrivateKey) {
+      throw new SecurityException('Recipient private key has to be non-null.');
+    }
+    if (!kemRecipient) {
+      throw new SecurityException('KEM recipient has to be non-null.');
+    }
+    if (!hkdfHash) {
+      throw new SecurityException('HKDF hash algorithm has to be non-null.');
+    }
+    if (!pointFormat) {
+      throw new SecurityException('Point format has to be non-null.');
+    }
+    if (!demHelper) {
+      throw new SecurityException('DEM helper has to be non-null.');
+    }
+
+    const curveType =
+        EllipticCurves.curveFromString(recipientPrivateKey['crv']);
+    const headerSize =
+        EllipticCurves.encodingSizeInBytes(curveType, pointFormat);
+
+    /** @private @const {!EciesHkdfKemRecipient} */
+    this.kemRecipient_ = kemRecipient;
+    /** @private @const {string} */
+    this.hkdfHash_ = hkdfHash;
+    /** @private @const {!EllipticCurves.PointFormatType} */
+    this.pointFormat_ = pointFormat;
+    /** @private @const {!EciesAeadHkdfDemHelper} */
+    this.demHelper_ = demHelper;
+    /** @private @const {number} */
+    this.headerSize_ = headerSize;
+    /** @private @const {!Uint8Array|undefined} */
+    this.hkdfSalt_ = opt_hkdfSalt;
+  }
+
+  /**
+   * @param {!webCrypto.JsonWebKey} recipientPrivateKey
+   * @param {string} hkdfHash the name of the HMAC algorithm, accepted names
+   *     are: SHA-1, SHA-256 and SHA-512.
+   * @param {!EllipticCurves.PointFormatType} pointFormat
+   * @param {!EciesAeadHkdfDemHelper} demHelper
+   * @param {!Uint8Array=} opt_hkdfSalt
+   *
+   * @return {!Promise.<!HybridDecrypt>}
+   */
+  static async newInstance(
+      recipientPrivateKey, hkdfHash, pointFormat, demHelper, opt_hkdfSalt) {
+    if (!recipientPrivateKey) {
+      throw new SecurityException('Recipient private key has to be non-null.');
+    }
+    if (!hkdfHash) {
+      throw new SecurityException('HKDF hash algorithm has to be non-null.');
+    }
+    if (!pointFormat) {
+      throw new SecurityException('Point format has to be non-null.');
+    }
+    if (!demHelper) {
+      throw new SecurityException('DEM helper has to be non-null.');
+    }
+
+    if (!recipientPrivateKey) {
+      throw new SecurityException('Recipient private key has to be non-null.');
+    }
+    const kemRecipient =
+        await EciesHkdfKemRecipient.newInstance(recipientPrivateKey);
+
+    return new EciesAeadHkdfHybridDecrypt(
+        recipientPrivateKey, kemRecipient, hkdfHash, pointFormat, demHelper,
+        opt_hkdfSalt);
+  }
+
+  /**
+   * Decrypts ciphertext using opt_contextInfo as info parameter of the
+   * underlying HKDF.
+   *
+   * @override
+   */
+  async decrypt(ciphertext, opt_contextInfo) {
+    if (ciphertext.length < this.headerSize_) {
+      throw new SecurityException('Ciphertext is too short.');
+    }
+
+    // Split the ciphertext to KEM token and AEAD ciphertext.
+    const kemToken = ciphertext.slice(0, this.headerSize_);
+    const ciphertextBody =
+        ciphertext.slice(this.headerSize_, ciphertext.length);
+
+    const aead = await this.getAead_(kemToken, opt_contextInfo);
+    return await aead.decrypt(ciphertextBody);
+  }
+
+  /**
+   * @private
+   * @param {!Uint8Array} kemToken
+   * @param {?Uint8Array=} opt_contextInfo
+   * @return {!Promise<!Aead>}
+   */
+  async getAead_(kemToken, opt_contextInfo) {
+    // Variable hkdfInfo is not optional for decapsulate method. Thus it should
+    // be an empty array in case that it is not defined by the caller of decrypt
+    // method.
+    if (!opt_contextInfo) {
+      opt_contextInfo = new Uint8Array(0);
+    }
+
+    const symmetricKey = await this.kemRecipient_.decapsulate(
+        kemToken, this.demHelper_.getDemKeySizeInBytes(), this.pointFormat_,
+        this.hkdfHash_, opt_contextInfo, this.hkdfSalt_);
+    return await this.demHelper_.getAead(symmetricKey);
+  }
+}
+
+exports = EciesAeadHkdfHybridDecrypt;
diff --git a/javascript/subtle/ecies_aead_hkdf_hybrid_decrypt_test.js b/javascript/subtle/ecies_aead_hkdf_hybrid_decrypt_test.js
new file mode 100644
index 0000000..c3275dc
--- /dev/null
+++ b/javascript/subtle/ecies_aead_hkdf_hybrid_decrypt_test.js
@@ -0,0 +1,246 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.EciesAeadHkdfHybridDecryptTest');
+goog.setTestOnly('tink.subtle.EciesAeadHkdfHybridDecryptTest');
+
+const AeadConfig = goog.require('tink.aead.AeadConfig');
+const AeadKeyTemplates = goog.require('tink.aead.AeadKeyTemplates');
+const DemHelper = goog.require('tink.hybrid.RegistryEciesAeadHkdfDemHelper');
+const EciesAeadHkdfHybridDecrypt = goog.require('tink.subtle.EciesAeadHkdfHybridDecrypt');
+const EciesAeadHkdfHybridEncrypt = goog.require('tink.subtle.EciesAeadHkdfHybridEncrypt');
+const EciesHkdfKemRecipient = goog.require('tink.subtle.EciesHkdfKemRecipient');
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const Random = goog.require('tink.subtle.Random');
+const Registry = goog.require('tink.Registry');
+const TestCase = goog.require('goog.testing.TestCase');
+const testSuite = goog.require('goog.testing.testSuite');
+const userAgent = goog.require('goog.userAgent');
+
+testSuite({
+  shouldRunTests() {
+    // https://msdn.microsoft.com/en-us/library/mt801195(v=vs.85).aspx
+    return !userAgent.EDGE;  // b/120286783
+  },
+
+  setUp() {
+    AeadConfig.register();
+    // Use a generous promise timeout for running continuously.
+    TestCase.getActiveTestCase().promiseTimeout = 1000 * 1000;  // 1000s
+  },
+
+  tearDown() {
+    Registry.reset();
+    // Reset the promise timeout to default value.
+    TestCase.getActiveTestCase().promiseTimeout = 1000;  // 1s
+  },
+
+  async testConstructor_nullParameters() {
+    const keyPair = await EllipticCurves.generateKeyPair('ECDH', 'P-256');
+    const privateKey = await EllipticCurves.exportCryptoKey(keyPair.privateKey);
+    const recipient = new EciesHkdfKemRecipient(keyPair.privateKey);
+    const hkdfHash = 'SHA-256';
+    const pointFormat = EllipticCurves.PointFormatType.UNCOMPRESSED;
+    const demHelper = new DemHelper(AeadKeyTemplates.aes128CtrHmacSha256());
+
+    try {
+      new EciesAeadHkdfHybridDecrypt(
+          null, recipient, hkdfHash, pointFormat, demHelper);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: Recipient private key has to be non-null.',
+          e.toString());
+    }
+
+    try {
+      new EciesAeadHkdfHybridDecrypt(
+          privateKey, null, hkdfHash, pointFormat, demHelper);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: KEM recipient has to be non-null.', e.toString());
+    }
+
+    try {
+      new EciesAeadHkdfHybridDecrypt(
+          privateKey, recipient, null, pointFormat, demHelper);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: HKDF hash algorithm has to be non-null.', e.toString());
+    }
+
+    try {
+      new EciesAeadHkdfHybridDecrypt(
+          privateKey, recipient, hkdfHash, null, demHelper);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: Point format has to be non-null.', e.toString());
+    }
+
+    try {
+      new EciesAeadHkdfHybridDecrypt(
+          privateKey, recipient, hkdfHash, pointFormat, null);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals('CustomError: DEM helper has to be non-null.', e.toString());
+    }
+  },
+
+  async testNewInstance_shouldWork() {
+    const keyPair = await EllipticCurves.generateKeyPair('ECDH', 'P-256');
+    const privateKey = await EllipticCurves.exportCryptoKey(keyPair.privateKey);
+    const hkdfSalt = new Uint8Array(0);
+    const hkdfHash = 'SHA-256';
+    const pointFormat = EllipticCurves.PointFormatType.UNCOMPRESSED;
+    const demHelper = new DemHelper(AeadKeyTemplates.aes128CtrHmacSha256());
+
+    await EciesAeadHkdfHybridDecrypt.newInstance(
+        privateKey, hkdfHash, pointFormat, demHelper, hkdfSalt);
+  },
+
+  async testNewInstance_nullParameters() {
+    const keyPair = await EllipticCurves.generateKeyPair('ECDH', 'P-256');
+    const privateKey = await EllipticCurves.exportCryptoKey(keyPair.privateKey);
+    const hkdfHash = 'SHA-256';
+    const pointFormat = EllipticCurves.PointFormatType.UNCOMPRESSED;
+    const demHelper = new DemHelper(AeadKeyTemplates.aes128CtrHmacSha256());
+
+    try {
+      await EciesAeadHkdfHybridDecrypt.newInstance(
+          null, hkdfHash, pointFormat, demHelper);
+    } catch (e) {
+      assertEquals(
+          'CustomError: Recipient private key has to be non-null.',
+          e.toString());
+    }
+
+    try {
+      await EciesAeadHkdfHybridDecrypt.newInstance(
+          privateKey, null, pointFormat, demHelper);
+    } catch (e) {
+      assertEquals(
+          'CustomError: HKDF hash algorithm has to be non-null.', e.toString());
+    }
+
+    try {
+      await EciesAeadHkdfHybridDecrypt.newInstance(
+          privateKey, hkdfHash, null, demHelper);
+    } catch (e) {
+      assertEquals(
+          'CustomError: Point format has to be non-null.', e.toString());
+    }
+
+    try {
+      await EciesAeadHkdfHybridDecrypt.newInstance(
+          privateKey, hkdfHash, pointFormat, null);
+    } catch (e) {
+      assertEquals('CustomError: DEM helper has to be non-null.', e.toString());
+    }
+  },
+
+  async testDecrypt_shortCiphertext_shouldNotWork() {
+    const pointFormat = EllipticCurves.PointFormatType.UNCOMPRESSED;
+    const demHelper = new DemHelper(AeadKeyTemplates.aes128CtrHmacSha256());
+    const hkdfHash = 'SHA-512';
+    const curve = EllipticCurves.CurveType.P256;
+
+    const curveName = EllipticCurves.curveToString(curve);
+    const curveEncodingSize =
+        EllipticCurves.encodingSizeInBytes(curve, pointFormat);
+
+    const keyPair = await EllipticCurves.generateKeyPair('ECDH', curveName);
+    const privateKey = await EllipticCurves.exportCryptoKey(keyPair.privateKey);
+    const publicKey = await EllipticCurves.exportCryptoKey(keyPair.publicKey);
+
+    const hybridEncrypt = await EciesAeadHkdfHybridEncrypt.newInstance(
+        publicKey, hkdfHash, pointFormat, demHelper);
+    const hybridDecrypt = await EciesAeadHkdfHybridDecrypt.newInstance(
+        privateKey, hkdfHash, pointFormat, demHelper);
+
+    const plaintext = Random.randBytes(10);
+    const ciphertext = await hybridEncrypt.encrypt(plaintext);
+    try {
+      await hybridDecrypt.decrypt(ciphertext.slice(0, curveEncodingSize - 1));
+      fail('Should throw an exception');
+    } catch (e) {
+      assertEquals('CustomError: Ciphertext is too short.', e.toString());
+    }
+  },
+
+  async testDecrypt_differentDemHelpersFromOneTemplate_shouldWork() {
+    const keyPair = await EllipticCurves.generateKeyPair('ECDH', 'P-256');
+    const privateKey = await EllipticCurves.exportCryptoKey(keyPair.privateKey);
+    const publicKey = await EllipticCurves.exportCryptoKey(keyPair.publicKey);
+    const pointFormat = EllipticCurves.PointFormatType.UNCOMPRESSED;
+    const hkdfHash = 'SHA-256';
+    const keyTemplate = AeadKeyTemplates.aes256CtrHmacSha256();
+
+    const demHelperEncrypt = new DemHelper(keyTemplate);
+    const hybridEncrypt = await EciesAeadHkdfHybridEncrypt.newInstance(
+        publicKey, hkdfHash, pointFormat, demHelperEncrypt);
+
+    const demHelperDecrypt = new DemHelper(keyTemplate);
+    const hybridDecrypt = await EciesAeadHkdfHybridDecrypt.newInstance(
+        privateKey, hkdfHash, pointFormat, demHelperDecrypt);
+
+    const plaintext = Random.randBytes(15);
+
+    const ciphertext = await hybridEncrypt.encrypt(plaintext);
+    const decryptedCipher = await hybridDecrypt.decrypt(ciphertext);
+    assertObjectEquals(plaintext, decryptedCipher);
+  },
+
+  async testDecrypt_differentPamarameters_shouldWork() {
+    const repetitions = 5;
+    const hkdfSalt = new Uint8Array(0);
+
+    const pointFormat = EllipticCurves.PointFormatType.UNCOMPRESSED;
+    const hmacAlgorithms = ['SHA-1', 'SHA-256', 'SHA-512'];
+    const demHelper = new DemHelper(AeadKeyTemplates.aes256CtrHmacSha256());
+    const curves = Object.keys(EllipticCurves.CurveType);
+
+    // Test the encryption for different HMAC algorithms and different types of
+    // curves.
+    for (let hkdfHash of hmacAlgorithms) {
+      for (let curve of curves) {
+        const curveName =
+            EllipticCurves.curveToString(EllipticCurves.CurveType[curve]);
+        const keyPair = await EllipticCurves.generateKeyPair('ECDH', curveName);
+        const privateKey =
+            await EllipticCurves.exportCryptoKey(keyPair.privateKey);
+        const publicKey =
+            await EllipticCurves.exportCryptoKey(keyPair.publicKey);
+
+        const hybridEncrypt = await EciesAeadHkdfHybridEncrypt.newInstance(
+            publicKey, hkdfHash, pointFormat, demHelper, hkdfSalt);
+        const hybridDecrypt = await EciesAeadHkdfHybridDecrypt.newInstance(
+            privateKey, hkdfHash, pointFormat, demHelper, hkdfSalt);
+
+        for (let i = 0; i < repetitions; ++i) {
+          const plaintext = Random.randBytes(15);
+          const contextInfo = Random.randBytes(i);
+          const ciphertext =
+              await hybridEncrypt.encrypt(plaintext, contextInfo);
+          const decryptedCiphertext =
+              await hybridDecrypt.decrypt(ciphertext, contextInfo);
+
+          assertObjectEquals(plaintext, decryptedCiphertext);
+        }
+      }
+    }
+  },
+});
diff --git a/javascript/subtle/ecies_aead_hkdf_hybrid_encrypt.js b/javascript/subtle/ecies_aead_hkdf_hybrid_encrypt.js
new file mode 100644
index 0000000..9964fe8
--- /dev/null
+++ b/javascript/subtle/ecies_aead_hkdf_hybrid_encrypt.js
@@ -0,0 +1,125 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+//
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.EciesAeadHkdfHybridEncrypt');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const EciesAeadHkdfDemHelper = goog.require('tink.subtle.EciesAeadHkdfDemHelper');
+const EciesHkdfKemSender = goog.require('tink.subtle.EciesHkdfKemSender');
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const HybridEncrypt = goog.require('tink.HybridEncrypt');
+const SecurityException = goog.require('tink.exception.SecurityException');
+
+/**
+ * Implementation of ECIES AEAD HKDF hybrid encryption.
+ *
+ * @implements {HybridEncrypt}
+ * @protected
+ * @final
+ */
+class EciesAeadHkdfHybridEncrypt {
+  /**
+   * @param {!EciesHkdfKemSender} kemSender
+   * @param {string} hkdfHash the name of the HMAC algorithm, accepted names
+   *     are: SHA-1, SHA-256 and SHA-512.
+   * @param {!EllipticCurves.PointFormatType} pointFormat
+   * @param {!EciesAeadHkdfDemHelper} demHelper
+   * @param {!Uint8Array=} opt_hkdfSalt
+   */
+  constructor(kemSender, hkdfHash, pointFormat, demHelper, opt_hkdfSalt) {
+    // TODO(thaidn): do we actually need these null checks?
+    if (!kemSender) {
+      throw new SecurityException('KEM sender has to be non-null.');
+    }
+    if (!hkdfHash) {
+      throw new SecurityException('HMAC algorithm has to be non-null.');
+    }
+    if (!pointFormat) {
+      throw new SecurityException('Point format has to be non-null.');
+    }
+    if (!demHelper) {
+      throw new SecurityException('DEM helper has to be non-null.');
+    }
+
+    /** @private @const {!EciesHkdfKemSender} */
+    this.kemSender_ = kemSender;
+    /** @private @const {string} */
+    this.hkdfHash_ = hkdfHash;
+    /** @private @const {!EllipticCurves.PointFormatType} */
+    this.pointFormat_ = pointFormat;
+    /** @private @const {!EciesAeadHkdfDemHelper} */
+    this.demHelper_ = demHelper;
+    /** @private @const {!Uint8Array|undefined} */
+    this.hkdfSalt_ = opt_hkdfSalt;
+  }
+
+  /**
+   * @param {!webCrypto.JsonWebKey} recipientPublicKey
+   * @param {string} hkdfHash the name of the HMAC algorithm, accepted names
+   *     are: SHA-1, SHA-256 and SHA-512.
+   * @param {!EllipticCurves.PointFormatType} pointFormat
+   * @param {!EciesAeadHkdfDemHelper} demHelper
+   * @param {!Uint8Array=} opt_hkdfSalt
+   *
+   * @return {!Promise.<!HybridEncrypt>}
+   */
+  static async newInstance(
+      recipientPublicKey, hkdfHash, pointFormat, demHelper, opt_hkdfSalt) {
+    if (!recipientPublicKey) {
+      throw new SecurityException('Recipient public key has to be non-null.');
+    }
+    if (!hkdfHash) {
+      throw new SecurityException('HMAC algorithm has to be non-null.');
+    }
+    if (!pointFormat) {
+      throw new SecurityException('Point format has to be non-null.');
+    }
+    if (!demHelper) {
+      throw new SecurityException('DEM helper has to be non-null.');
+    }
+
+    const kemSender = await EciesHkdfKemSender.newInstance(recipientPublicKey);
+    return new EciesAeadHkdfHybridEncrypt(
+        kemSender, hkdfHash, pointFormat, demHelper, opt_hkdfSalt);
+  }
+
+  /**
+   * Encrypts plaintext using opt_contextInfo as info parameter of the
+   * underlying HKDF.
+   *
+   * @override
+   */
+  async encrypt(plaintext, opt_contextInfo) {
+    // Variable hkdfInfo is not optional for encapsulate method. Thus it
+    // should be an empty array in case that it is not defined by caller of this
+    // method.
+    if (!opt_contextInfo) {
+      opt_contextInfo = new Uint8Array(0);
+    }
+
+    const keySizeInBytes = this.demHelper_.getDemKeySizeInBytes();
+    const kemKey = await this.kemSender_.encapsulate(
+        keySizeInBytes, this.pointFormat_, this.hkdfHash_, opt_contextInfo,
+        this.hkdfSalt_);
+    const aead = await this.demHelper_.getAead(kemKey['key']);
+
+    const ciphertextBody = await aead.encrypt(plaintext);
+    const header = kemKey['token'];
+
+    return Bytes.concat(header, ciphertextBody);
+  }
+}
+
+exports = EciesAeadHkdfHybridEncrypt;
diff --git a/javascript/subtle/ecies_aead_hkdf_hybrid_encrypt_test.js b/javascript/subtle/ecies_aead_hkdf_hybrid_encrypt_test.js
new file mode 100644
index 0000000..1fe3c38
--- /dev/null
+++ b/javascript/subtle/ecies_aead_hkdf_hybrid_encrypt_test.js
@@ -0,0 +1,130 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.EciesAeadHkdfHybridEncryptTest');
+goog.setTestOnly('tink.subtle.EciesAeadHkdfHybridEncryptTest');
+
+const AeadConfig = goog.require('tink.aead.AeadConfig');
+const AeadKeyTemplates = goog.require('tink.aead.AeadKeyTemplates');
+const EciesAeadHkdfHybridEncrypt = goog.require('tink.subtle.EciesAeadHkdfHybridEncrypt');
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const Random = goog.require('tink.subtle.Random');
+const Registry = goog.require('tink.Registry');
+const RegistryEciesAeadHkdfDemHelper = goog.require('tink.hybrid.RegistryEciesAeadHkdfDemHelper');
+const TestCase = goog.require('goog.testing.TestCase');
+const testSuite = goog.require('goog.testing.testSuite');
+const userAgent = goog.require('goog.userAgent');
+
+testSuite({
+  shouldRunTests() {
+    return !userAgent.EDGE;  // b/120286783
+  },
+
+  setUp() {
+    AeadConfig.register();
+    // Use a generous promise timeout for running continuously.
+    TestCase.getActiveTestCase().promiseTimeout = 1000 * 1000;  // 1000s
+  },
+
+  tearDown() {
+    Registry.reset();
+    // Reset the timeout.
+    TestCase.getActiveTestCase().promiseTimeout = 1000;  // 1s
+  },
+
+  async testNewInstance_shouldWork() {
+    const keyPair = await EllipticCurves.generateKeyPair('ECDH', 'P-256');
+    const publicKey = await EllipticCurves.exportCryptoKey(keyPair.publicKey);
+    const hkdfHash = 'SHA-256';
+    const pointFormat = EllipticCurves.PointFormatType.UNCOMPRESSED;
+    const demHelper = new RegistryEciesAeadHkdfDemHelper(
+        AeadKeyTemplates.aes128CtrHmacSha256());
+
+    await EciesAeadHkdfHybridEncrypt.newInstance(
+        publicKey, hkdfHash, pointFormat, demHelper);
+  },
+
+  async testNewInstance_nullParameters() {
+    const keyPair = await EllipticCurves.generateKeyPair('ECDH', 'P-256');
+    const publicKey = await EllipticCurves.exportCryptoKey(keyPair.publicKey);
+    const hkdfHash = 'SHA-256';
+    const pointFormat = EllipticCurves.PointFormatType.UNCOMPRESSED;
+    const demHelper = new RegistryEciesAeadHkdfDemHelper(
+        AeadKeyTemplates.aes128CtrHmacSha256());
+
+    try {
+      await EciesAeadHkdfHybridEncrypt.newInstance(
+          null, hkdfHash, pointFormat, demHelper);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: Recipient public key has to be non-null.',
+          e.toString());
+    }
+
+    try {
+      await EciesAeadHkdfHybridEncrypt.newInstance(
+          publicKey, null, pointFormat, demHelper);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: HMAC algorithm has to be non-null.', e.toString());
+    }
+
+    try {
+      await EciesAeadHkdfHybridEncrypt.newInstance(
+          publicKey, hkdfHash, null, demHelper);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: Point format has to be non-null.', e.toString());
+    }
+
+    try {
+      await EciesAeadHkdfHybridEncrypt.newInstance(
+          publicKey, hkdfHash, pointFormat, null);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals('CustomError: DEM helper has to be non-null.', e.toString());
+    }
+  },
+
+  async testEncrypt_differentArguments() {
+    const hkdfSalt = new Uint8Array(0);
+    const pointFormat = EllipticCurves.PointFormatType.UNCOMPRESSED;
+    const demHelper = new RegistryEciesAeadHkdfDemHelper(
+        AeadKeyTemplates.aes256CtrHmacSha256());
+    const hmacAlgorithms = ['SHA-1', 'SHA-256', 'SHA-512'];
+
+    // Test the encryption for different HMAC algorithms and different types of
+    // curves.
+    for (let hkdfHash of hmacAlgorithms) {
+      for (let curve of Object.keys(EllipticCurves.CurveType)) {
+        const curveName =
+            EllipticCurves.curveToString(EllipticCurves.CurveType[curve]);
+        const keyPair = await EllipticCurves.generateKeyPair('ECDH', curveName);
+        const publicKey =
+            await EllipticCurves.exportCryptoKey(keyPair.publicKey);
+
+        const hybridEncrypt = await EciesAeadHkdfHybridEncrypt.newInstance(
+            publicKey, hkdfHash, pointFormat, demHelper, hkdfSalt);
+
+        const plaintext = Random.randBytes(15);
+        const ciphertext = await hybridEncrypt.encrypt(plaintext);
+
+        assertObjectNotEquals(plaintext, ciphertext);
+      }
+    }
+  },
+});
diff --git a/javascript/subtle/ecies_hkdf_kem_recipient.js b/javascript/subtle/ecies_hkdf_kem_recipient.js
new file mode 100644
index 0000000..262e9bb
--- /dev/null
+++ b/javascript/subtle/ecies_hkdf_kem_recipient.js
@@ -0,0 +1,80 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.EciesHkdfKemRecipient');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const Hkdf = goog.require('tink.subtle.Hkdf');
+const SecurityException = goog.require('tink.exception.SecurityException');
+
+/**
+ * HKDF-based ECIES-KEM (key encapsulation mechanism) for ECIES recipient.
+ */
+class EciesHkdfKemRecipient {
+  /**
+   * @param {!webCrypto.CryptoKey} privateKey
+   */
+  constructor(privateKey) {
+    if (!privateKey) {
+      throw new SecurityException('Private key has to be non-null.');
+    }
+    // CryptoKey should have the properties type and algorithm.
+    if (privateKey.type !== 'private' || !privateKey.algorithm) {
+      throw new SecurityException('Expected crypto key of type: private.');
+    }
+    /** @const @private {!webCrypto.CryptoKey} */
+    this.privateKey_ = privateKey;
+  }
+
+  /**
+   * @param {!webCrypto.JsonWebKey} jwk
+   * @return {!Promise.<!EciesHkdfKemRecipient>}
+   * @static
+   */
+  static async newInstance(jwk) {
+    const privateKey = await EllipticCurves.importPrivateKey('ECDH', jwk);
+    return new EciesHkdfKemRecipient(privateKey);
+  }
+
+  /**
+   * @param {!Uint8Array} kemToken the public ephemeral point.
+   * @param {number} keySizeInBytes The length of the generated pseudorandom
+   *     string in bytes. The maximal size is 255 * DigestSize, where DigestSize
+   *     is the size of the underlying HMAC.
+   * @param {!EllipticCurves.PointFormatType} pointFormat The format of the
+   *     public ephemeral point.
+   * @param {string} hkdfHash the name of the hash function. Accepted names are
+   *     SHA-1, SHA-256 and SHA-512.
+   * @param {!Uint8Array} hkdfInfo Context and application specific
+   *     information (can be a zero-length array).
+   * @param {!Uint8Array=} opt_hkdfSalt Salt value (a non-secret random
+   *     value). If not provided, it is set to a string of hash length zeros.
+   * @return {!Promise.<!Uint8Array>} The KEM key and token.
+   */
+  async decapsulate(
+      kemToken, keySizeInBytes, pointFormat, hkdfHash, hkdfInfo, opt_hkdfSalt) {
+    const jwk = EllipticCurves.pointDecode(
+        this.privateKey_.algorithm['namedCurve'], pointFormat, kemToken);
+    const publicKey = await EllipticCurves.importPublicKey('ECDH', jwk);
+    const sharedSecret = await EllipticCurves.computeEcdhSharedSecret(
+        this.privateKey_, publicKey);
+    const hkdfIkm = Bytes.concat(kemToken, sharedSecret);
+    const kemKey = await Hkdf.compute(
+        keySizeInBytes, hkdfHash, hkdfIkm, hkdfInfo, opt_hkdfSalt);
+    return kemKey;
+  }
+}
+
+exports = EciesHkdfKemRecipient;
diff --git a/javascript/subtle/ecies_hkdf_kem_recipient_test.js b/javascript/subtle/ecies_hkdf_kem_recipient_test.js
new file mode 100644
index 0000000..4f0d15a
--- /dev/null
+++ b/javascript/subtle/ecies_hkdf_kem_recipient_test.js
@@ -0,0 +1,374 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.EciesHkdfKemRecipientTest');
+goog.setTestOnly('tink.subtle.EciesHkdfKemRecipientTest');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const EciesHkdfKemRecipient = goog.require('tink.subtle.EciesHkdfKemRecipient');
+const EciesHkdfKemSender = goog.require('tink.subtle.EciesHkdfKemSender');
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const Random = goog.require('tink.subtle.Random');
+const TestCase = goog.require('goog.testing.TestCase');
+const testSuite = goog.require('goog.testing.testSuite');
+const userAgent = goog.require('goog.userAgent');
+
+
+testSuite({
+  shouldRunTests() {
+    // https://msdn.microsoft.com/en-us/library/mt801195(v=vs.85).aspx
+    return !userAgent.EDGE;  // b/120286783
+  },
+
+  setUp() {
+    // Use a generous promise timeout for running continuously.
+    TestCase.getActiveTestCase().promiseTimeout = 1000 * 1000;  // 1000s
+  },
+
+  tearDown() {
+    // Reset the promise timeout to default value.
+    TestCase.getActiveTestCase().promiseTimeout = 1000;  // 1s
+  },
+
+  async testEncapDecap() {
+    const keyPair = await EllipticCurves.generateKeyPair('ECDH', 'P-256');
+    const publicKey = await EllipticCurves.exportCryptoKey(keyPair.publicKey);
+    const privateKey = await EllipticCurves.exportCryptoKey(keyPair.privateKey);
+    const sender = await EciesHkdfKemSender.newInstance(publicKey);
+    const recipient = await EciesHkdfKemRecipient.newInstance(privateKey);
+    for (let i = 1; i < 20; i++) {
+      const keySizeInBytes = i;
+      const pointFormat = EllipticCurves.PointFormatType.UNCOMPRESSED;
+      const hkdfHash = 'SHA-256';
+      const hkdfInfo = Random.randBytes(i);
+      const hkdfSalt = Random.randBytes(i);
+
+      const kemKeyToken = await sender.encapsulate(
+          keySizeInBytes, pointFormat, hkdfHash, hkdfInfo, hkdfSalt);
+      const key = await recipient.decapsulate(
+          kemKeyToken['token'], keySizeInBytes, pointFormat, hkdfHash, hkdfInfo,
+          hkdfSalt);
+
+      assertEquals(keySizeInBytes, kemKeyToken['key'].length);
+      assertEquals(Bytes.toHex(key), Bytes.toHex(kemKeyToken['key']));
+    }
+  },
+
+  async testDecap_nonIntegerKeySize() {
+    const keyPair = await EllipticCurves.generateKeyPair('ECDH', 'P-256');
+    const publicKey = await EllipticCurves.exportCryptoKey(keyPair.publicKey);
+    const privateKey = await EllipticCurves.exportCryptoKey(keyPair.privateKey);
+    const sender = await EciesHkdfKemSender.newInstance(publicKey);
+    const recipient = await EciesHkdfKemRecipient.newInstance(privateKey);
+    const keySizeInBytes = 16;
+    const pointFormat = EllipticCurves.PointFormatType.UNCOMPRESSED;
+    const hkdfHash = 'SHA-256';
+    const hkdfInfo = Random.randBytes(16);
+    const hkdfSalt = Random.randBytes(16);
+    const kemKeyToken = await sender.encapsulate(
+        keySizeInBytes, pointFormat, hkdfHash, hkdfInfo, hkdfSalt);
+
+    try {
+      await recipient.decapsulate(
+          kemKeyToken['token'], NaN, pointFormat, hkdfHash, hkdfInfo, hkdfSalt);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals('CustomError: size must be an integer', e.toString());
+    }
+
+    try {
+      await recipient.decapsulate(
+          kemKeyToken['token'], undefined, pointFormat, hkdfHash, hkdfInfo,
+          hkdfSalt);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals('CustomError: size must be an integer', e.toString());
+    }
+
+    try {
+      await recipient.decapsulate(
+          kemKeyToken['token'], 1.8, pointFormat, hkdfHash, hkdfInfo, hkdfSalt);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals('CustomError: size must be an integer', e.toString());
+    }
+  },
+
+
+  async testNewInstance_invalidParameters() {
+    // Test newInstance without key.
+    try {
+      await EciesHkdfKemRecipient.newInstance(null);
+      fail('An exception should be thrown.');
+    } catch (e) {
+    }
+
+    // Test newInstance with public key instead private key.
+    const keyPair = await EllipticCurves.generateKeyPair('ECDH', 'P-256');
+    const publicKey = await EllipticCurves.exportCryptoKey(keyPair.publicKey);
+    try {
+      await EciesHkdfKemRecipient.newInstance(publicKey);
+      fail('An exception should be thrown.');
+    } catch (e) {
+    }
+
+    // Test newInstance with CryptoKey instead of JSON key.
+    try {
+      await EciesHkdfKemRecipient.newInstance(keyPair.publicKey);
+      fail('An exception should be thrown.');
+    } catch (e) {
+    }
+  },
+
+  async testNewInstance_invalidPrivateKey() {
+    for (let testVector of TEST_VECTORS) {
+      const ellipticCurveString = EllipticCurves.curveToString(testVector.crv);
+      const privateJwk = EllipticCurves.pointDecode(
+          ellipticCurveString, testVector.pointFormat,
+          Bytes.fromHex(testVector.privateKeyPoint));
+      privateJwk['d'] = Bytes.toBase64(
+          Bytes.fromHex(testVector.privateKeyValue), /* opt_webSafe = */ true);
+
+      // Change the x value such that the key si no more valid. Recipient should
+      // either throw an exception or ignore the x value and compute the same
+      // output value.
+      const xLength = EllipticCurves.fieldSizeInBytes(testVector.crv);
+      privateJwk['x'] =
+          Bytes.toBase64(new Uint8Array(xLength), /* opt_webSafe = */ true);
+      let output;
+      try {
+        const recipient = await EciesHkdfKemRecipient.newInstance(privateJwk);
+        const hkdfInfo = Bytes.fromHex(testVector.hkdfInfo);
+        const salt = Bytes.fromHex(testVector.salt);
+        output = await recipient.decapsulate(
+            Bytes.fromHex(testVector.token), testVector.outputLength,
+            testVector.pointFormat, testVector.hashType, hkdfInfo, salt);
+      } catch (e) {
+        // Everything works properly if exception was thrown.
+        return;
+      }
+      // If there was no exception, the output should be still correct (x value
+      // should be ignored during the computation).
+      assertEquals(testVector.expectedOutput, Bytes.toHex(output));
+    }
+  },
+
+  async testConstructor_invalidParameters() {
+    // Test constructor without key.
+    try {
+      new EciesHkdfKemRecipient(null);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: Private key has to be non-null.', e.toString());
+    }
+
+    // Test public key instead of private key.
+    const keyPair = await EllipticCurves.generateKeyPair('ECDH', 'P-256');
+    try {
+      new EciesHkdfKemRecipient(keyPair.publicKey);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: Expected crypto key of type: private.', e.toString());
+    }
+
+    // Test that JSON key cannot be used instead of CryptoKey.
+    const privateKey = await EllipticCurves.exportCryptoKey(keyPair.privateKey);
+    try {
+      new EciesHkdfKemRecipient(privateKey);
+      fail('An exception should be thrown.');
+    } catch (e) {
+    }
+  },
+
+  async testEncapDecap_differentParams() {
+    const curveTypes = Object.keys(EllipticCurves.CurveType);
+    const hashTypes = ['SHA-1', 'SHA-256', 'SHA-512'];
+    for (let curve of curveTypes) {
+      const curveString =
+          EllipticCurves.curveToString(EllipticCurves.CurveType[curve]);
+      for (let hashType of hashTypes) {
+        const keyPair =
+            await EllipticCurves.generateKeyPair('ECDH', curveString);
+        const keySizeInBytes = 32;
+        const pointFormat = EllipticCurves.PointFormatType.UNCOMPRESSED;
+        const hkdfInfo = Random.randBytes(8);
+        const hkdfSalt = Random.randBytes(16);
+
+        const publicKey =
+            await EllipticCurves.exportCryptoKey(keyPair.publicKey);
+        const sender = await EciesHkdfKemSender.newInstance(publicKey);
+        const kemKeyToken = await sender.encapsulate(
+            keySizeInBytes, pointFormat, hashType, hkdfInfo, hkdfSalt);
+
+        const privateKey =
+            await EllipticCurves.exportCryptoKey(keyPair.privateKey);
+        const recipient = await EciesHkdfKemRecipient.newInstance(privateKey);
+        const key = await recipient.decapsulate(
+            kemKeyToken['token'], keySizeInBytes, pointFormat, hashType,
+            hkdfInfo, hkdfSalt);
+
+        assertEquals(keySizeInBytes, kemKeyToken['key'].length);
+        assertEquals(Bytes.toHex(key), Bytes.toHex(kemKeyToken['key']));
+      }
+    }
+  },
+
+  async testEncapDecap_modifiedToken() {
+    const curveTypes = Object.keys(EllipticCurves.CurveType);
+    const hashTypes = ['SHA-1', 'SHA-256', 'SHA-512'];
+    for (let crvId of curveTypes) {
+      const curve = EllipticCurves.CurveType[crvId];
+      const curveString = EllipticCurves.curveToString(curve);
+      for (let hashType of hashTypes) {
+        const keyPair =
+            await EllipticCurves.generateKeyPair('ECDH', curveString);
+        const privateKey =
+            await EllipticCurves.exportCryptoKey(keyPair.privateKey);
+        const recipient = await EciesHkdfKemRecipient.newInstance(privateKey);
+        const keySizeInBytes = 32;
+        const pointFormat = EllipticCurves.PointFormatType.UNCOMPRESSED;
+        const hkdfInfo = Random.randBytes(8);
+        const hkdfSalt = Random.randBytes(16);
+
+        // Create invalid token (EC point), while preserving the 0x04 prefix
+        // byte.
+        const token = Random.randBytes(
+            EllipticCurves.encodingSizeInBytes(curve, pointFormat));
+        token[0] = 0x04;
+        try {
+          await recipient.decapsulate(
+              token, keySizeInBytes, pointFormat, hashType, hkdfInfo, hkdfSalt);
+          fail('Should throw an exception');
+        } catch (e) {
+        }
+      }
+    }
+  },
+
+  async testDecapsulate_testVectorsGeneratedByJava() {
+    for (let testVector of TEST_VECTORS) {
+      const ellipticCurveString = EllipticCurves.curveToString(testVector.crv);
+      const privateJwk = EllipticCurves.pointDecode(
+          ellipticCurveString, testVector.pointFormat,
+          Bytes.fromHex(testVector.privateKeyPoint));
+      privateJwk['d'] = Bytes.toBase64(
+          Bytes.fromHex(testVector.privateKeyValue), /* opt_webSafe = */ true);
+      const recipient = await EciesHkdfKemRecipient.newInstance(privateJwk);
+      const hkdfInfo = Bytes.fromHex(testVector.hkdfInfo);
+      const salt = Bytes.fromHex(testVector.salt);
+      const output = await recipient.decapsulate(
+          Bytes.fromHex(testVector.token), testVector.outputLength,
+          testVector.pointFormat, testVector.hashType, hkdfInfo, salt);
+      assertEquals(testVector.expectedOutput, Bytes.toHex(output));
+    }
+  },
+});
+
+
+class TestVector {
+  /**
+   * @param {!EllipticCurves.CurveType} crv
+   * @param {string} hashType
+   * @param {!EllipticCurves.PointFormatType} pointFormat
+   * @param {string} token
+   * @param {string} privateKeyPoint
+   * @param {string} privateKeyValue
+   * @param {string} salt
+   * @param {string} hkdfInfo
+   * @param {number} outputLength
+   * @param {string} expectedOutput
+   */
+  constructor(
+      crv, hashType, pointFormat, token, privateKeyPoint, privateKeyValue, salt,
+      hkdfInfo, outputLength, expectedOutput) {
+    /** @const {!EllipticCurves.CurveType} */
+    this.crv = crv;
+    /** @const {string} */
+    this.hashType = hashType;
+    /** @const {!EllipticCurves.PointFormatType} */
+    this.pointFormat = pointFormat;
+    /** @const {string} */
+    this.token = token;
+    /** @const {string} */
+    this.privateKeyPoint = privateKeyPoint;
+    /** @const {string} */
+    this.privateKeyValue = privateKeyValue;
+    /** @const {string} */
+    this.salt = salt;
+    /** @const {string} */
+    this.hkdfInfo = hkdfInfo;
+    /** @const {number} */
+    this.outputLength = outputLength;
+    /** @const {string} */
+    this.expectedOutput = expectedOutput;
+  }
+}
+
+// Test vectors generated by Java version of Tink.
+//
+// Token (i.e. sender public key) and privateKeyPoint values are in UNCOMPRESSED
+// EcPoint encoding (i.e. it has prefix '04' followed by x and y values).
+/** {!Array<!TestVector>} */
+const TEST_VECTORS = [
+  new TestVector(
+      EllipticCurves.CurveType.P256, 'SHA-256',
+      EllipticCurves.PointFormatType.UNCOMPRESSED,
+      /* token = */ '04' +
+          '5cdd8e426d11970a610f0e5f9b27f247a421c477b379f2ff3fd3bac50dfff9ff' +
+          '7cada79ab1de9ce4aeaff45fcd2628d1b6d7ecac99d4c26409d4ab8a362c8e7a',
+      /* privateKeyPoint = */ '04' +
+          '4adf0fff84b995bb97af250128a3d779c86ba3cd7e5c0fa2c10895d0b995aaee' +
+          'cdced57616ebb04c808f191c2bf3848c495dcfddcdd1bb73d8ea7a15c642af05',
+      /* privateKeyValue = */
+      'da73e10f7d81483daa63438b982c879706bcf8fef8c7c4d3071c3ef2367714f3',
+      /* salt = */ 'abcdef',
+      /* hkdfInfo = */ 'aaaaaaaaaaaaaaaa',
+      /* outputLength = */ 32,
+      /* expectedOutput = */
+      'aeeee35a14967310798f037e2f126e2e326369115eb9e2d1a34d9c6761f60511'),
+  new TestVector(
+      EllipticCurves.CurveType.P384, 'SHA-1',
+      EllipticCurves.PointFormatType.UNCOMPRESSED,
+      /* token = */ '04' +
+          '75bc8a2e6cf80ce2e0a1cd60ab3d68e4d357b58ff69f0de14b7ec13c58a79750496e07db3f933167148d80730b96f000' +
+          '9389967de410535ca3e103e7ce73dae9525f934589a6cd1fca37e61411985788dcedc71b35ef63b7365e391f6e2a945f',
+      /* privateKeyPoint = */ '04' +
+          '5f81886c4202897355b1da79348d53abd9e9119a7de6f5f10dfe751f7ca9c807035c029bac59499337c4af185fe61728' +
+          'f132bfb234365a9c61e1e56c11acca3bee6621961c7c38eb9dcbd39b332fd35006876dccdb206a7b2d43cf70589c3356',
+      /* privateKeyValue = */
+      '544b5f32731d6277fa71e756f0b2d6840f62e6b744a8b8cdf91f8cf29e6d8562f6237369721f756ab044711e0d42c53c',
+      /* salt = */ 'ababcdcd',
+      /* hkdfInfo = */ '100000000000000001',
+      /* outputLength = */ 32,
+      /* expectedOutput = */
+      '7a25c525eabaa0d994c27f7661a208b5ea25c2a778198237de6e4f235cd64a33'),
+  new TestVector(
+      EllipticCurves.CurveType.P521, 'SHA-512',
+      EllipticCurves.PointFormatType.UNCOMPRESSED,
+      /* token = */ '04' +
+          '0075192f8decddf7a0371b2c859aad738cc5424fa70e74b560070ed8309ae8a6064b06f9aaad8020ac8620e62a6c1196efa44180d325a36a54945743b9382bd49bc1' +
+          '000dfa1e30b228e975998b7afeaaf30235ec505960e58bf3269b69fffcbce9f15fc1441fab2ed97f554ae4bde8b956efb2372c5b330cb1aa0ab81b99e792acd7f5a8',
+      /* privateKeyPoint = */ '04' +
+          '00e57037a96bcbca532ef2f75646d825304ea716bbc9c4bf953455074347158f4818122c76e26a4cf94b39f451b7f5960b9cda43d49999ddc401c1be7f082052b387' +
+          '0147197ba83ec55c8b02e6cbe7b49ce6d6c238edb89561bde6b4574a585c684379d8040888117866823258216344a7268dc696c3a2d192824a1e693609b44661fc2c',
+      /* privateKeyValue = */
+      '001e5410117d22e95c5768b82a786dd66fa8c326b938a3a81fdd6113499437ae9f74e9f876adf085c187c6a147abc13460b8ed3050a6b228005426b61f2b616a79c6',
+      /* salt = */ '00001111',
+      /* hkdfInfo = */ '1234123412341234',
+      /* outputLength = */ 32,
+      /* expectedOutput = */
+      '3f7f64c7aba2cb012c9b5a952385290604b3b5843ec6e6714647a9c9d6ac87be')
+];
diff --git a/javascript/subtle/ecies_hkdf_kem_sender.js b/javascript/subtle/ecies_hkdf_kem_sender.js
new file mode 100644
index 0000000..caf4bf5
--- /dev/null
+++ b/javascript/subtle/ecies_hkdf_kem_sender.js
@@ -0,0 +1,82 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.EciesHkdfKemSender');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const Hkdf = goog.require('tink.subtle.Hkdf');
+const SecurityException = goog.require('tink.exception.SecurityException');
+
+/**
+ * HKDF-based ECIES-KEM (key encapsulation mechanism) for ECIES sender.
+ */
+class EciesHkdfKemSender {
+  /**
+   * @param {!webCrypto.CryptoKey} recipientPublicKey
+   */
+  constructor(recipientPublicKey) {
+    if (!recipientPublicKey) {
+      throw new SecurityException('Recipient public key has to be non-null.');
+    }
+    // CryptoKey should have the properties type and algorithm.
+    if (recipientPublicKey.type !== 'public' || !recipientPublicKey.algorithm) {
+      throw new SecurityException('Expected Crypto key of type: public.');
+    }
+    /** @const @private {!webCrypto.CryptoKey} */
+    this.publicKey_ = recipientPublicKey;
+  }
+
+  /**
+   * @param {!webCrypto.JsonWebKey} jwk
+   * @return {!Promise.<!EciesHkdfKemSender>}
+   * @static
+   */
+  static async newInstance(jwk) {
+    const publicKey = await EllipticCurves.importPublicKey('ECDH', jwk);
+    return new EciesHkdfKemSender(publicKey);
+  }
+
+  /**
+   * @param {number} keySizeInBytes The length of the generated pseudorandom
+   *     string in bytes. The maximal size is 255 * DigestSize, where DigestSize
+   *     is the size of the underlying HMAC.
+   * @param {!EllipticCurves.PointFormatType} pointFormat The format of the
+   *     public ephemeral point.
+   * @param {string} hkdfHash the name of the hash function. Accepted names are
+   *     SHA-1, SHA-256 and SHA-512.
+   * @param {!Uint8Array} hkdfInfo Context and application specific
+   *     information (can be a zero-length array).
+   * @param {!Uint8Array=} opt_hkdfSalt Salt value (a non-secret random
+   *     value). If not provided, it is set to a string of hash length zeros.
+   * @return {!Promise.<{key:!Uint8Array, token:!Uint8Array}>} The KEM key and
+   *     token.
+   */
+  async encapsulate(
+      keySizeInBytes, pointFormat, hkdfHash, hkdfInfo, opt_hkdfSalt) {
+    const ephemeralKeyPair = await EllipticCurves.generateKeyPair(
+        'ECDH', this.publicKey_.algorithm['namedCurve']);
+    const sharedSecret = await EllipticCurves.computeEcdhSharedSecret(
+        /** @type {?} */ (ephemeralKeyPair).privateKey, this.publicKey_);
+    const jwk = await EllipticCurves.exportCryptoKey(
+        /** @type {?} */ (ephemeralKeyPair).publicKey);
+    const kemToken = EllipticCurves.pointEncode(jwk.crv, pointFormat, jwk);
+    const hkdfIkm = Bytes.concat(kemToken, sharedSecret);
+    const kemKey = await Hkdf.compute(
+        keySizeInBytes, hkdfHash, hkdfIkm, hkdfInfo, opt_hkdfSalt);
+    return {'key': kemKey, 'token': kemToken};
+  }
+}
+
+exports = EciesHkdfKemSender;
diff --git a/javascript/subtle/ecies_hkdf_kem_sender_test.js b/javascript/subtle/ecies_hkdf_kem_sender_test.js
new file mode 100644
index 0000000..ec38ac9
--- /dev/null
+++ b/javascript/subtle/ecies_hkdf_kem_sender_test.js
@@ -0,0 +1,164 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.EciesHkdfKemSenderTest');
+goog.setTestOnly('tink.subtle.EciesHkdfKemSenderTest');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const EciesHkdfKemSender = goog.require('tink.subtle.EciesHkdfKemSender');
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const Random = goog.require('tink.subtle.Random');
+const testSuite = goog.require('goog.testing.testSuite');
+const userAgent = goog.require('goog.userAgent');
+
+
+testSuite({
+  shouldRunTests() {
+    // https://msdn.microsoft.com/en-us/library/mt801195(v=vs.85).aspx
+    return !userAgent.EDGE;  // b/120286783
+  },
+
+  async testEncapsulate_alwaysGenerateRandomKey() {
+    const keyPair = await EllipticCurves.generateKeyPair('ECDH', 'P-256');
+    const publicKey = await EllipticCurves.exportCryptoKey(keyPair.publicKey);
+    const sender = await EciesHkdfKemSender.newInstance(publicKey);
+    const keySizeInBytes = 32;
+    const pointFormat = EllipticCurves.PointFormatType.UNCOMPRESSED;
+    const hkdfHash = 'SHA-256';
+    const hkdfInfo = Random.randBytes(32);
+    const hkdfSalt = Random.randBytes(32);
+    const keys = new Set();
+    const tokens = new Set();
+    for (let i = 0; i < 20; i++) {
+      const kemKeyToken = await sender.encapsulate(
+          keySizeInBytes, pointFormat, hkdfHash, hkdfInfo, hkdfSalt);
+      keys.add(Bytes.toHex(kemKeyToken['key']));
+      tokens.add(Bytes.toHex(kemKeyToken['token']));
+    }
+    assertEquals(20, keys.size);
+    assertEquals(20, tokens.size);
+  },
+
+  async testEncapsulate_nonIntegerKeySize() {
+    const keyPair = await EllipticCurves.generateKeyPair('ECDH', 'P-256');
+    const publicKey = await EllipticCurves.exportCryptoKey(keyPair.publicKey);
+    const sender = await EciesHkdfKemSender.newInstance(publicKey);
+    const pointFormat = EllipticCurves.PointFormatType.UNCOMPRESSED;
+    const hkdfHash = 'SHA-256';
+    const hkdfInfo = Random.randBytes(32);
+    const hkdfSalt = Random.randBytes(32);
+    try {
+      await sender.encapsulate(NaN, pointFormat, hkdfHash, hkdfInfo, hkdfSalt);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals('CustomError: size must be an integer', e.toString());
+    }
+    try {
+      await sender.encapsulate(
+          undefined, pointFormat, hkdfHash, hkdfInfo, hkdfSalt);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals('CustomError: size must be an integer', e.toString());
+    }
+    try {
+      await sender.encapsulate(0, pointFormat, hkdfHash, hkdfInfo, hkdfSalt);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals('CustomError: size must be positive', e.toString());
+    }
+  },
+
+  async testNewInstance_invalidParameters() {
+    // Test newInstance without key.
+    try {
+      await EciesHkdfKemSender.newInstance(null);
+      fail('An exception should be thrown.');
+    } catch (e) {
+    }
+
+    // Test newInstance with public key instead private key.
+    const keyPair = await EllipticCurves.generateKeyPair('ECDH', 'P-256');
+    const privateKey = await EllipticCurves.exportCryptoKey(keyPair.privateKey);
+    try {
+      await EciesHkdfKemSender.newInstance(privateKey);
+      fail('An exception should be thrown.');
+    } catch (e) {
+    }
+
+    // Test newInstance with CryptoKey instead of JSON key.
+    try {
+      await EciesHkdfKemSender.newInstance(keyPair.publicKey);
+      fail('An exception should be thrown.');
+    } catch (e) {
+    }
+  },
+
+  async testNewInstance_invalidPublicKey() {
+    for (let crv of Object.keys(EllipticCurves.CurveType)) {
+      const curve = EllipticCurves.CurveType[crv];
+      const crvString = EllipticCurves.curveToString(curve);
+      const keyPair = await EllipticCurves.generateKeyPair('ECDH', crvString);
+      const publicJwk = await EllipticCurves.exportCryptoKey(keyPair.publicKey);
+      // Change the 'x' value to make the public key invalid. Either getting new
+      // recipient with corrupted public key or trying to encapsulate with this
+      // recipient should fail.
+      const xLength = EllipticCurves.fieldSizeInBytes(curve);
+      publicJwk['x'] =
+          Bytes.toBase64(new Uint8Array(xLength), /* opt_webSafe = */ true);
+      const hkdfInfo = Random.randBytes(10);
+      const salt = Random.randBytes(8);
+      try {
+        const sender = await EciesHkdfKemSender.newInstance(publicJwk);
+        await sender.encapsulate(
+            /* keySizeInBytes = */ 32,
+            EllipticCurves.PointFormatType.UNCOMPRESSED,
+            /* hkdfHash = */ 'SHA-256', hkdfInfo, salt);
+        fail('Should throw an exception.');
+      } catch (e) {
+      }
+    }
+  },
+
+  async testConstructor_invalidParameters() {
+    // Test constructor without key.
+    try {
+      new EciesHkdfKemSender(null);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: Recipient public key has to be non-null.',
+          e.toString());
+    }
+
+    // Test constructor with public key instead private key.
+    const keyPair = await EllipticCurves.generateKeyPair('ECDH', 'P-256');
+    try {
+      new EciesHkdfKemSender(keyPair.privateKey);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: Expected Crypto key of type: public.', e.toString());
+    }
+
+    // Test that JSON key cannot be used instead of CryptoKey.
+    const publicKey = await EllipticCurves.exportCryptoKey(keyPair.publicKey);
+    try {
+      new EciesHkdfKemSender(publicKey);
+      fail('An exception should be thrown.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: Expected Crypto key of type: public.', e.toString());
+    }
+  },
+});
diff --git a/javascript/subtle/elliptic_curves.js b/javascript/subtle/elliptic_curves.js
new file mode 100644
index 0000000..b7f728f
--- /dev/null
+++ b/javascript/subtle/elliptic_curves.js
@@ -0,0 +1,532 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * @fileoverview Common enums.
+ */
+
+goog.module('tink.subtle.EllipticCurves');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const InvalidArgumentsException = goog.require('tink.exception.InvalidArgumentsException');
+
+/**
+ * Supported elliptic curves.
+ * @enum {number}
+ */
+const CurveType = {
+  P256: 1,
+  P384: 2,
+  P521: 3,
+};
+
+/**
+ * Supported point format.
+ * @enum {number}
+ */
+const PointFormatType = {
+  UNCOMPRESSED: 1,
+  COMPRESSED: 2,
+  // Like UNCOMPRESSED but without the \x04 prefix. Crunchy uses this format.
+  // DO NOT USE unless you are a Crunchy user moving to Tink.
+  DO_NOT_USE_CRUNCHY_UNCOMPRESSED: 3,
+};
+
+/**
+ * Supported ECDSA signature encoding.
+ * @enum {number}
+ */
+const EcdsaSignatureEncodingType = {
+  // The DER signature is encoded using ASN.1
+  // (https://tools.ietf.org/html/rfc5480#appendix-A):
+  // ECDSA-Sig-Value :: = SEQUENCE { r INTEGER, s INTEGER }. In particular, the
+  // encoding is:
+  // 0x30 || totalLength || 0x02 || r's length || r || 0x02 || s's length || s.
+  DER: 1,
+  // The IEEE_P1363 signature's format is r || s, where r and s are zero-padded
+  // and have the same size in bytes as the order of the curve. For example, for
+  // NIST P-256 curve, r and s are zero-padded to 32 bytes.
+  IEEE_P1363: 2,
+};
+
+/**
+ * Transform an ECDSA signature in DER encoding to IEEE P1363 encoding.
+ *
+ * @param {!Uint8Array} der the ECDSA signature in DER encoding
+ * @param {number} ieeeLength the length of the ECDSA signature in IEEE
+ *     encoding. This is usually 2 * size of the elliptic curve field.
+ * @return {!Uint8Array} ECDSA signature in IEEE encoding
+ */
+const ecdsaDer2Ieee = function(der, ieeeLength) {
+  if (!isValidDerEcdsaSignature(der)) {
+    throw new InvalidArgumentsException('invalid DER signature');
+  }
+  if (!Number.isInteger(ieeeLength) || ieeeLength < 0) {
+    throw new InvalidArgumentsException(
+        'ieeeLength must be a nonnegative integer');
+  }
+  const ieee = new Uint8Array(ieeeLength);
+  const length = der[1] & 0xff;
+  let offset = 1 /* 0x30 */ + 1 /* totalLength */;
+  if (length >= 128) {
+    offset++;  // Long form length
+  }
+  offset++;  // 0x02
+  const rLength = der[offset++];
+  let extraZero = 0;
+  if (der[offset] === 0) {
+    extraZero = 1;
+  }
+  const rOffset = ieeeLength / 2 - rLength + extraZero;
+  ieee.set(der.subarray(offset + extraZero, offset + rLength), rOffset);
+  offset += rLength /* r byte array */ + 1 /* 0x02 */;
+  const sLength = der[offset++];
+  extraZero = 0;
+  if (der[offset] === 0) {
+    extraZero = 1;
+  }
+  const sOffset = ieeeLength - sLength + extraZero;
+  ieee.set(der.subarray(offset + extraZero, offset + sLength), sOffset);
+  return ieee;
+};
+
+/**
+ * Transform an ECDSA signature in IEEE 1363 encoding to DER encoding.
+ *
+ * @param {!Uint8Array} ieee the ECDSA signature in IEEE encoding
+ * @return {!Uint8Array} ECDSA signature in DER encoding
+ */
+const ecdsaIeee2Der = function(ieee) {
+  if (ieee.length % 2 != 0 || ieee.length == 0 || ieee.length > 132) {
+    throw new InvalidArgumentsException(
+        'Invalid IEEE P1363 signature encoding. Length: ' + ieee.length);
+  }
+  const r = toUnsignedBigNum(ieee.subarray(0, ieee.length / 2));
+  const s = toUnsignedBigNum(ieee.subarray(ieee.length / 2, ieee.length));
+
+  let offset = 0;
+  const length = 1 + 1 + r.length + 1 + 1 + s.length;
+  let der;
+  if (length >= 128) {
+    der = new Uint8Array(length + 3);
+    der[offset++] = 0x30;
+    der[offset++] = 0x80 + 0x01;
+    der[offset++] = length;
+  } else {
+    der = new Uint8Array(length + 2);
+    der[offset++] = 0x30;
+    der[offset++] = length;
+  }
+  der[offset++] = 0x02;
+  der[offset++] = r.length;
+  der.set(r, offset);
+  offset += r.length;
+  der[offset++] = 0x02;
+  der[offset++] = s.length;
+  der.set(s, offset);
+  return der;
+};
+
+/**
+ * Validate that the ECDSA signature is in DER encoding, based on
+ * https://github.com/bitcoin/bips/blob/master/bip-0066.mediawiki.
+ *
+ * @param {!Uint8Array} sig an ECDSA siganture
+ * @return {boolean}
+ */
+const isValidDerEcdsaSignature = function(sig) {
+  // Format: 0x30 [total-length] 0x02 [R-length] [R] 0x02 [S-length] [S]
+  // * total-length: 1-byte or 2-byte length descriptor of everything that
+  // follows.
+  // * R-length: 1-byte length descriptor of the R value that follows.
+  // * R: arbitrary-length big-endian encoded R value. It must use the shortest
+  //   possible encoding for a positive integers (which means no null bytes at
+  //   the start, except a single one when the next byte has its highest bit
+  //   set).
+  // * S-length: 1-byte length descriptor of the S value that follows.
+  // * S: arbitrary-length big-endian encoded S value. The same rules apply.
+  if (sig.length < 1 /* 0x30 */
+          + 1        /* total-length */
+          + 1        /* 0x02 */
+          + 1        /* R-length */
+          + 1        /* R */
+          + 1        /* 0x02 */
+          + 1        /* S-length */
+          + 1 /* S */) {
+    // Signature is too short.
+    return false;
+  }
+
+  // Checking bytes from left to right.
+
+  // byte #1: a signature is of type 0x30 (compound).
+  if (sig[0] != 0x30) {
+    return false;
+  }
+
+  // byte #2 and maybe #3: the total length of the signature.
+  let totalLen = sig[1] & 0xff;
+  let totalLenLen =
+      1;  // the length of the total length field, could be 2-byte.
+  if (totalLen == 129) {
+    // The signature is >= 128 bytes thus total length field is in long-form
+    // encoding and occupies 2 bytes.
+    totalLenLen = 2;
+    // byte #3 is the total length.
+    totalLen = sig[2] & 0xff;
+    if (totalLen < 128) {
+      // Length in long-form encoding must be >= 128.
+      return false;
+    }
+  } else if (totalLen == 128 || totalLen > 129) {
+    // Impossible values for the second byte.
+    return false;
+  }
+
+  // Make sure the length covers the entire sig.
+  if (totalLen != sig.length - 1 - totalLenLen) {
+    return false;
+  }
+
+  // Start checking R.
+  // Check whether the R element is an integer.
+  if (sig[1 + totalLenLen] != 0x02) {
+    return false;
+  }
+  // Extract the length of the R element.
+  const rLen = sig[1 /* 0x30 */ + totalLenLen + 1 /* 0x02 */] & 0xff;
+  // Make sure the length of the S element is still inside the signature.
+  if (1 /* 0x30 */ + totalLenLen + 1 /* 0x02 */ + 1 /* rLen */ + rLen +
+          1 /* 0x02 */
+      >= sig.length) {
+    return false;
+  }
+  // Zero-length integers are not allowed for R.
+  if (rLen == 0) {
+    return false;
+  }
+  // Negative numbers are not allowed for R.
+  if ((sig[3 + totalLenLen] & 0xff) >= 128) {
+    return false;
+  }
+  // Null bytes at the start of R are not allowed, unless R would
+  // otherwise be interpreted as a negative number.
+  if (rLen > 1 && (sig[3 + totalLenLen] == 0x00) &&
+      ((sig[4 + totalLenLen] & 0xff) < 128)) {
+    return false;
+  }
+
+  // Start checking S.
+  // Check whether the S element is an integer.
+  if (sig[3 + totalLenLen + rLen] != 0x02) {
+    return false;
+  }
+  // Extract the length of the S element.
+  const sLen = sig[1 /* 0x30 */ + totalLenLen + 1 /* 0x02 */ + 1 /* rLen */ +
+                   rLen + 1 /* 0x02 */] &
+      0xff;
+  // Verify that the length of the signature matches the sum of the length of
+  // the elements.
+  if (1                     /* 0x30 */
+          + totalLenLen + 1 /* 0x02 */
+          + 1               /* rLen */
+          + rLen + 1        /* 0x02 */
+          + 1               /* sLen */
+          + sLen !=
+      sig.length) {
+    return false;
+  }
+  // Zero-length integers are not allowed for S.
+  if (sLen == 0) {
+    return false;
+  }
+  // Negative numbers are not allowed for S.
+  if ((sig[5 + totalLenLen + rLen] & 0xff) >= 128) {
+    return false;
+  }
+  // Null bytes at the start of S are not allowed, unless S would
+  // otherwise be interpreted as a negative number.
+  if (sLen > 1 && (sig[5 + totalLenLen + rLen] == 0x00) &&
+      ((sig[6 + totalLenLen + rLen] & 0xff) < 128)) {
+    return false;
+  }
+
+  return true;
+};
+
+/**
+ * Transform a big integer in big endian to minimal unsigned form which has
+ * no extra zero at the beginning except when the highest bit is set.
+ *
+ * @param {!Uint8Array} bytes
+ * @return {!Uint8Array}
+ */
+const toUnsignedBigNum = function(bytes) {
+  // Remove zero prefixes.
+  let start = 0;
+  while (start < bytes.length && bytes[start] == 0) {
+    start++;
+  }
+  if (start == bytes.length) {
+    start = bytes.length - 1;
+  }
+
+  let extraZero = 0;
+  // If the 1st bit is not zero, add 1 zero byte.
+  if ((bytes[start] & 0x80) == 0x80) {
+    // Add extra zero.
+    extraZero = 1;
+  }
+  const res = new Uint8Array(bytes.length - start + extraZero);
+  res.set(bytes.subarray(start), extraZero);
+  return res;
+};
+
+/**
+ * @param {!CurveType} curve
+ * @return {string}
+ */
+const curveToString = function(curve) {
+  switch (curve) {
+    case CurveType.P256:
+      return 'P-256';
+    case CurveType.P384:
+      return 'P-384';
+    case CurveType.P521:
+      return 'P-521';
+  }
+  throw new InvalidArgumentsException('unknown curve: ' + curve);
+};
+
+/**
+ * @param {string} curve
+ * @return {!CurveType}
+ */
+const curveFromString = function(curve) {
+  switch (curve) {
+    case 'P-256':
+      return CurveType.P256;
+    case 'P-384':
+      return CurveType.P384;
+    case 'P-521':
+      return CurveType.P521;
+  }
+  throw new InvalidArgumentsException('unknown curve: ' + curve);
+};
+
+/**
+ * @param {string} curve
+ * @param {!PointFormatType} format
+ * @param {!webCrypto.JsonWebKey} point
+ * @return {!Uint8Array}
+ */
+const pointEncode = function(curve, format, point) {
+  const fieldSize = fieldSizeInBytes(curveFromString(curve));
+  switch (format) {
+    case PointFormatType.UNCOMPRESSED:
+      let result = new Uint8Array(1 + 2 * fieldSize);
+      result[0] = 0x04;
+      result.set(Bytes.fromBase64(point.x, /* opt_webSafe = */ true), 1);
+      result.set(
+          Bytes.fromBase64(point.y, /* opt_webSafe = */ true), 1 + fieldSize);
+      return result;
+  }
+  throw new InvalidArgumentsException('invalid format');
+};
+
+/**
+ * @param {string} curve
+ * @param {!PointFormatType} format
+ * @param {!Uint8Array} point
+ * @return {!webCrypto.JsonWebKey}
+ */
+const pointDecode = function(curve, format, point) {
+  const fieldSize = fieldSizeInBytes(curveFromString(curve));
+  switch (format) {
+    case PointFormatType.UNCOMPRESSED:
+      if (point.length != 1 + 2 * fieldSize || point[0] != 0x04) {
+        throw new InvalidArgumentsException('invalid point');
+      }
+      let result = /** @type {!webCrypto.JsonWebKey} */ ({
+        'kty': 'EC',
+        'crv': curve,
+        'x': Bytes.toBase64(
+            new Uint8Array(point.subarray(1, 1 + fieldSize)),
+            true /* websafe */),
+        'y': Bytes.toBase64(
+            new Uint8Array(point.subarray(1 + fieldSize, point.length)),
+            true /* websafe */),
+        'ext': true,
+      });
+      return result;
+  }
+  throw new InvalidArgumentsException('invalid format');
+};
+
+/**
+ * @param {!CurveType} curve
+ * @param {!Uint8Array} x
+ * @param {!Uint8Array} y
+ * @param {?Uint8Array=} d
+ *
+ * @return {!webCrypto.JsonWebKey}
+ */
+const getJsonWebKey = function(curve, x, y, d) {
+  const key = /** @type {!webCrypto.JsonWebKey} */ ({
+    'kty': 'EC',
+    'crv': curveToString(curve),
+    'x': Bytes.toBase64(x, true /* websafe */),
+    'y': Bytes.toBase64(y, true /* websafe */),
+    'ext': true,
+  });
+  if (d) {
+    key['d'] = Bytes.toBase64(d, true /* websafe */);
+  }
+  return key;
+};
+
+/**
+ * @param {!CurveType} curve
+ * @return {number}
+ */
+const fieldSizeInBytes = function(curve) {
+  switch (curve) {
+    case CurveType.P256:
+      return 32;
+    case CurveType.P384:
+      return 48;
+    case CurveType.P521:
+      return 66;
+  }
+  throw new InvalidArgumentsException('unknown curve: ' + curve);
+};
+
+/**
+ * @param {!CurveType} curve
+ * @param {!PointFormatType} pointFormat
+ *
+ * @return {number}
+ */
+const encodingSizeInBytes = function(curve, pointFormat) {
+  switch (pointFormat) {
+    case PointFormatType.UNCOMPRESSED:
+      return 2 * fieldSizeInBytes(curve) + 1;
+    case PointFormatType.COMPRESSED:
+      return fieldSizeInBytes(curve) + 1;
+    case PointFormatType.DO_NOT_USE_CRUNCHY_UNCOMPRESSED:
+      return 2 * fieldSizeInBytes(curve);
+  }
+  throw new InvalidArgumentsException('invalid format');
+};
+
+/**
+ * @param {!webCrypto.CryptoKey} privateKey
+ * @param {!webCrypto.CryptoKey} publicKey
+ * @return {!Promise<!Uint8Array>}
+ */
+const computeEcdhSharedSecret = async function(privateKey, publicKey) {
+  const ecdhParams =
+      /** @type {!webCrypto.AlgorithmIdentifier} */ (privateKey.algorithm);
+  ecdhParams['public'] = publicKey;
+  const fieldSizeInBits =
+      8 * fieldSizeInBytes(curveFromString(ecdhParams['namedCurve']));
+  const sharedSecret = await window.crypto.subtle.deriveBits(
+      ecdhParams, privateKey, fieldSizeInBits);
+  return new Uint8Array(sharedSecret);
+};
+
+/**
+ * @param {string} algorithm
+ * @param {string} curve
+ * @return {!Promise<!webCrypto.CryptoKeyPair>}
+ */
+const generateKeyPair = async function(algorithm, curve) {
+  if (algorithm != 'ECDH' && algorithm != 'ECDSA') {
+    throw new InvalidArgumentsException(
+        'algorithm must be either ECDH or ECDSA');
+  }
+  const params = /** @type {!webCrypto.AlgorithmIdentifier} */ (
+      {'name': algorithm, 'namedCurve': curve});
+  const ephemeralKeyPair = await window.crypto.subtle.generateKey(
+      params, true /* extractable */,
+      algorithm == 'ECDH' ? ['deriveKey', 'deriveBits'] :
+                            ['sign', 'verify'] /* usage */);
+  return /** @type {!webCrypto.CryptoKeyPair} */ (ephemeralKeyPair);
+};
+
+/**
+ * @param {!webCrypto.CryptoKey} cryptoKey
+ * @return {!Promise<!webCrypto.JsonWebKey>}
+ */
+const exportCryptoKey = async function(cryptoKey) {
+  const jwk = await window.crypto.subtle.exportKey('jwk', cryptoKey);
+  return /** @type {!webCrypto.JsonWebKey} */ (jwk);
+};
+
+/**
+ * @param {string} algorithm
+ * @param {!webCrypto.JsonWebKey} jwk
+ * @return {!Promise<!webCrypto.CryptoKey>}
+ */
+const importPublicKey = async function(algorithm, jwk) {
+  if (algorithm != 'ECDH' && algorithm != 'ECDSA') {
+    throw new InvalidArgumentsException(
+        'algorithm must be either ECDH or ECDSA');
+  }
+  const publicKey = await window.crypto.subtle.importKey(
+      'jwk' /* format */, jwk,
+      {'name': algorithm, 'namedCurve': jwk.crv} /* algorithm */,
+      true /* extractable */,
+      algorithm == 'ECDH' ? [] : ['verify'] /* usage */);
+  return publicKey;
+};
+
+/**
+ * @param {string} algorithm
+ * @param {!webCrypto.JsonWebKey} jwk
+ * @return {!Promise<!webCrypto.CryptoKey>}
+ */
+const importPrivateKey = async function(algorithm, jwk) {
+  if (algorithm != 'ECDH' && algorithm != 'ECDSA') {
+    throw new InvalidArgumentsException(
+        'algorithm must be either ECDH or ECDSA');
+  }
+  const privateKey = await window.crypto.subtle.importKey(
+      'jwk' /* format */, jwk /* key material */,
+      {'name': algorithm, 'namedCurve': jwk.crv} /* algorithm */,
+      true /* extractable */,
+      algorithm == 'ECDH' ? ['deriveKey', 'deriveBits'] : ['sign'] /* usage */);
+  return privateKey;
+};
+
+exports = {
+  CurveType,
+  EcdsaSignatureEncodingType,
+  PointFormatType,
+  computeEcdhSharedSecret,
+  curveToString,
+  curveFromString,
+  ecdsaDer2Ieee,
+  ecdsaIeee2Der,
+  getJsonWebKey,
+  isValidDerEcdsaSignature,
+  encodingSizeInBytes,
+  exportCryptoKey,
+  fieldSizeInBytes,
+  generateKeyPair,
+  importPrivateKey,
+  importPublicKey,
+  pointDecode,
+  pointEncode,
+};
diff --git a/javascript/subtle/elliptic_curves_test.js b/javascript/subtle/elliptic_curves_test.js
new file mode 100644
index 0000000..99e1961
--- /dev/null
+++ b/javascript/subtle/elliptic_curves_test.js
@@ -0,0 +1,561 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.EllipticCurvesTest');
+goog.setTestOnly('tink.subtle.EllipticCurvesTest');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const Environment = goog.require('tink.subtle.Environment');
+const Random = goog.require('tink.subtle.Random');
+const TestCase = goog.require('goog.testing.TestCase');
+const testSuite = goog.require('goog.testing.testSuite');
+const userAgent = goog.require('goog.userAgent');
+const wycheproofEcdhTestVectors = goog.require('tink.subtle.wycheproofEcdhTestVectors');
+
+testSuite({
+  shouldRunTests() {
+    return Environment.IS_WEBCRYPTO_AVAILABLE &&
+        !userAgent.EDGE;  // b/120286783
+  },
+
+  setUp() {
+    // Use a generous promise timeout for running continuously.
+    TestCase.getActiveTestCase().promiseTimeout = 1000 * 1000;  // 1000s
+  },
+
+  tearDown() {
+    // Reset the promise timeout to default value.
+    TestCase.getActiveTestCase().promiseTimeout = 1000;  // 1s
+  },
+
+  async testcomputeEcdhSharedSecret() {
+    const aliceKeyPair = await EllipticCurves.generateKeyPair('ECDH', 'P-256');
+    const bobKeyPair = await EllipticCurves.generateKeyPair('ECDH', 'P-256');
+    const sharedSecret1 = await EllipticCurves.computeEcdhSharedSecret(
+        aliceKeyPair.privateKey, bobKeyPair.publicKey);
+    const sharedSecret2 = await EllipticCurves.computeEcdhSharedSecret(
+        bobKeyPair.privateKey, aliceKeyPair.publicKey);
+    assertEquals(Bytes.toHex(sharedSecret1), Bytes.toHex(sharedSecret2));
+  },
+
+  async testWycheproof_wycheproofWebcrypto() {
+    for (let testGroup of wycheproofEcdhTestVectors['testGroups']) {
+      let errors = '';
+      for (let test of testGroup['tests']) {
+        errors += await runWycheproofTest(test);
+      }
+      if (errors !== '') {
+        fail(errors);
+      }
+    }
+  },
+
+  // Test that both ECDH public and private key are defined in the result.
+  async testGenerateKeyPairECDH() {
+    const curveTypes = Object.keys(EllipticCurves.CurveType);
+    for (let curve of curveTypes) {
+      const curveTypeString =
+          EllipticCurves.curveToString(EllipticCurves.CurveType[curve]);
+      const keyPair =
+          await EllipticCurves.generateKeyPair('ECDH', curveTypeString);
+      assertTrue(keyPair.privateKey != null);
+      assertTrue(keyPair.publicKey != null);
+    }
+  },
+
+  // Test that both ECDSA public and private key are defined in the result.
+  async testGenerateKeyPairECDSA() {
+    const curveTypes = Object.keys(EllipticCurves.CurveType);
+    for (let curve of curveTypes) {
+      const curveTypeString =
+          EllipticCurves.curveToString(EllipticCurves.CurveType[curve]);
+      const keyPair =
+          await EllipticCurves.generateKeyPair('ECDSA', curveTypeString);
+      assertTrue(keyPair.privateKey != null);
+      assertTrue(keyPair.publicKey != null);
+    }
+  },
+
+  // Test that when ECDH crypto key is exported and imported it gives the same
+  // key as the original one.
+  async testImportExportCryptoKeyECDH() {
+    const curveTypes = Object.keys(EllipticCurves.CurveType);
+    for (let curve of curveTypes) {
+      const curveTypeString =
+          EllipticCurves.curveToString(EllipticCurves.CurveType[curve]);
+      const keyPair =
+          await EllipticCurves.generateKeyPair('ECDH', curveTypeString);
+
+      const publicKey = keyPair.publicKey;
+      const publicCryptoKey = await EllipticCurves.exportCryptoKey(publicKey);
+      const importedPublicKey =
+          await EllipticCurves.importPublicKey('ECDH', publicCryptoKey);
+      assertObjectEquals(publicKey, importedPublicKey);
+
+      const privateKey = keyPair.privateKey;
+      const privateCryptoKey = await EllipticCurves.exportCryptoKey(privateKey);
+      const importedPrivateKey =
+          await EllipticCurves.importPrivateKey('ECDH', privateCryptoKey);
+      assertObjectEquals(privateKey, importedPrivateKey);
+    }
+  },
+
+  // Test that when ECDSA crypto key is exported and imported it gives the same
+  // key as the original one.
+  async testImportExportCryptoKeyECDSA() {
+    const curveTypes = Object.keys(EllipticCurves.CurveType);
+    for (let curve of curveTypes) {
+      const curveTypeString =
+          EllipticCurves.curveToString(EllipticCurves.CurveType[curve]);
+      const keyPair =
+          await EllipticCurves.generateKeyPair('ECDSA', curveTypeString);
+
+      const publicKey = keyPair.publicKey;
+      const publicCryptoKey = await EllipticCurves.exportCryptoKey(publicKey);
+      const importedPublicKey =
+          await EllipticCurves.importPublicKey('ECDSA', publicCryptoKey);
+      assertObjectEquals(publicKey, importedPublicKey);
+
+      const privateKey = keyPair.privateKey;
+      const privateCryptoKey = await EllipticCurves.exportCryptoKey(privateKey);
+      const importedPrivateKey =
+          await EllipticCurves.importPrivateKey('ECDSA', privateCryptoKey);
+      assertObjectEquals(privateKey, importedPrivateKey);
+    }
+  },
+
+  // Test that when JSON ECDH web key is imported and exported it gives the same
+  // key as the original one.
+  async testImportExportJsonKeyECDH() {
+    for (let testKey of TEST_KEYS) {
+      const jwk = /** @type{!webCrypto.JsonWebKey} */ ({
+        'kty': 'EC',
+        'crv': testKey.curve,
+        'x': Bytes.toBase64(Bytes.fromHex(testKey.x), true),
+        'y': Bytes.toBase64(Bytes.fromHex(testKey.y), true),
+        'ext': true,
+      });
+
+      let importedKey;
+      if (!testKey.d) {
+        jwk['key_ops'] = [];
+        importedKey = await EllipticCurves.importPublicKey('ECDH', jwk);
+      } else {
+        jwk['key_ops'] = ['deriveKey', 'deriveBits'];
+        jwk['d'] = Bytes.toBase64(Bytes.fromHex(testKey.d), true);
+        importedKey = await EllipticCurves.importPrivateKey('ECDH', jwk);
+      }
+
+      const exportedKey = await EllipticCurves.exportCryptoKey(importedKey);
+      assertObjectEquals(jwk, exportedKey);
+    }
+  },
+
+  // Test that when JSON ECDSA web key is imported and exported it gives the
+  // same key as the original one.
+  async testImportExportJsonKeyECDSA() {
+    for (let testKey of TEST_KEYS) {
+      const jwk = /** @type{!webCrypto.JsonWebKey} */ ({
+        'kty': 'EC',
+        'crv': testKey.curve,
+        'x': Bytes.toBase64(Bytes.fromHex(testKey.x), true),
+        'y': Bytes.toBase64(Bytes.fromHex(testKey.y), true),
+        'ext': true,
+      });
+
+      let importedKey;
+      if (!testKey.d) {
+        jwk['key_ops'] = ['verify'];
+        importedKey = await EllipticCurves.importPublicKey('ECDSA', jwk);
+      } else {
+        jwk['key_ops'] = ['sign'];
+        jwk['d'] = Bytes.toBase64(Bytes.fromHex(testKey.d), true);
+        importedKey = await EllipticCurves.importPrivateKey('ECDSA', jwk);
+      }
+
+      const exportedKey = await EllipticCurves.exportCryptoKey(importedKey);
+      assertObjectEquals(jwk, exportedKey);
+    }
+  },
+
+  testCurveToString() {
+    assertEquals(
+        'P-256', EllipticCurves.curveToString(EllipticCurves.CurveType.P256));
+    assertEquals(
+        'P-384', EllipticCurves.curveToString(EllipticCurves.CurveType.P384));
+    assertEquals(
+        'P-521', EllipticCurves.curveToString(EllipticCurves.CurveType.P521));
+  },
+
+  testCurveFromString() {
+    assertEquals(
+        EllipticCurves.CurveType.P256, EllipticCurves.curveFromString('P-256'));
+    assertEquals(
+        EllipticCurves.CurveType.P384, EllipticCurves.curveFromString('P-384'));
+    assertEquals(
+        EllipticCurves.CurveType.P521, EllipticCurves.curveFromString('P-521'));
+  },
+
+  testFieldSizeInBytes() {
+    assertEquals(
+        256 / 8,
+        EllipticCurves.fieldSizeInBytes(EllipticCurves.CurveType.P256));
+    assertEquals(
+        384 / 8,
+        EllipticCurves.fieldSizeInBytes(EllipticCurves.CurveType.P384));
+    assertEquals(
+        (521 + 7) / 8,
+        EllipticCurves.fieldSizeInBytes(EllipticCurves.CurveType.P521));
+  },
+
+  testEncodingSizeInBytes_uncompressedPointFormatType() {
+    assertEquals(
+        2 * (256 / 8) + 1,
+        EllipticCurves.encodingSizeInBytes(
+            EllipticCurves.CurveType.P256,
+            EllipticCurves.PointFormatType.UNCOMPRESSED));
+    assertEquals(
+        2 * (384 / 8) + 1,
+        EllipticCurves.encodingSizeInBytes(
+            EllipticCurves.CurveType.P384,
+            EllipticCurves.PointFormatType.UNCOMPRESSED));
+    assertEquals(
+        2 * ((521 + 7) / 8) + 1,
+        EllipticCurves.encodingSizeInBytes(
+            EllipticCurves.CurveType.P521,
+            EllipticCurves.PointFormatType.UNCOMPRESSED));
+  },
+
+  testEncodingSizeInBytes_compressedPointFormatType() {
+    assertEquals(
+        (256 / 8) + 1,
+        EllipticCurves.encodingSizeInBytes(
+            EllipticCurves.CurveType.P256,
+            EllipticCurves.PointFormatType.COMPRESSED));
+    assertEquals(
+        (384 / 8) + 1,
+        EllipticCurves.encodingSizeInBytes(
+            EllipticCurves.CurveType.P384,
+            EllipticCurves.PointFormatType.COMPRESSED));
+    assertEquals(
+        ((521 + 7) / 8) + 1,
+        EllipticCurves.encodingSizeInBytes(
+            EllipticCurves.CurveType.P521,
+            EllipticCurves.PointFormatType.COMPRESSED));
+  },
+
+  testEncodingSizeInBytes_crunchyUncompressedPointFormatType() {
+    assertEquals(
+        2 * (256 / 8),
+        EllipticCurves.encodingSizeInBytes(
+            EllipticCurves.CurveType.P256,
+            EllipticCurves.PointFormatType.DO_NOT_USE_CRUNCHY_UNCOMPRESSED));
+    assertEquals(
+        2 * (384 / 8),
+        EllipticCurves.encodingSizeInBytes(
+            EllipticCurves.CurveType.P384,
+            EllipticCurves.PointFormatType.DO_NOT_USE_CRUNCHY_UNCOMPRESSED));
+    assertEquals(
+        2 * ((521 + 7) / 8),
+        EllipticCurves.encodingSizeInBytes(
+            EllipticCurves.CurveType.P521,
+            EllipticCurves.PointFormatType.DO_NOT_USE_CRUNCHY_UNCOMPRESSED));
+  },
+
+  testPointEncode_unknownPointFormat() {
+    const format = 10;
+
+    const curveType = EllipticCurves.CurveType.P256;
+    const curveTypeString = EllipticCurves.curveToString(curveType);
+    const x = Random.randBytes(EllipticCurves.fieldSizeInBytes(curveType));
+    const y = Random.randBytes(EllipticCurves.fieldSizeInBytes(curveType));
+    const point = /** @type {!webCrypto.JsonWebKey} */ ({
+      'kty': 'EC',
+      'crv': curveTypeString,
+      'x': Bytes.toBase64(x),
+      'y': Bytes.toBase64(y),
+      'ext': true,
+      'key_ops': ['deriveKey', 'deriveBits'],
+    });
+
+    try {
+      EllipticCurves.pointEncode(point['crv'], format, point);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals('CustomError: invalid format', e.toString());
+    }
+  },
+
+  testPointDecode_wrongPointSize() {
+    const point = new Uint8Array(10);
+    const format = EllipticCurves.PointFormatType.UNCOMPRESSED;
+
+    for (let curve of Object.keys(EllipticCurves.CurveType)) {
+      const curveTypeString =
+          EllipticCurves.curveToString(EllipticCurves.CurveType[curve]);
+
+      // It should throw an exception as the point array is too short.
+      try {
+        EllipticCurves.pointDecode(curveTypeString, format, point);
+        fail('Should throw an exception.');
+      } catch (e) {
+        assertEquals('CustomError: invalid point', e.toString());
+      }
+    }
+  },
+
+  testPointDecode_unknownPointFormat() {
+    const point = new Uint8Array(10);
+    const format = 10;
+    const curve = EllipticCurves.curveToString(EllipticCurves.CurveType.P256);
+
+    try {
+      EllipticCurves.pointDecode(curve, format, point);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals('CustomError: invalid format', e.toString());
+    }
+  },
+
+  testPointDecode_unknownCurve() {
+    const point = new Uint8Array(10);
+    const format = EllipticCurves.PointFormatType.UNCOMPRESSED;
+    const curve = 'some-unknown-curve';
+
+    try {
+      EllipticCurves.pointDecode(curve, format, point);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertTrue(e.toString().includes('unknown curve'));
+    }
+  },
+
+  testPointEncodeDecode() {
+    const format = EllipticCurves.PointFormatType.UNCOMPRESSED;
+    for (let curve of Object.keys(EllipticCurves.CurveType)) {
+      const curveType = EllipticCurves.CurveType[curve];
+      const curveTypeString = EllipticCurves.curveToString(curveType);
+      const x = Random.randBytes(EllipticCurves.fieldSizeInBytes(curveType));
+      const y = Random.randBytes(EllipticCurves.fieldSizeInBytes(curveType));
+
+      const point = /** @type {!webCrypto.JsonWebKey} */ ({
+        'kty': 'EC',
+        'crv': curveTypeString,
+        'x': Bytes.toBase64(x, /* websafe = */ true),
+        'y': Bytes.toBase64(y, /* websafe = */ true),
+        'ext': true,
+      });
+
+      const encodedPoint =
+          EllipticCurves.pointEncode(point['crv'], format, point);
+      const decodedPoint =
+          EllipticCurves.pointDecode(curveTypeString, format, encodedPoint);
+
+      assertObjectEquals(point, decodedPoint);
+    }
+  },
+
+  testEcdsaDer2Ieee() {
+    for (let test of ECDSA_IEEE_DER_TEST_VECTORS) {
+      assertObjectEquals(
+          test.ieee, EllipticCurves.ecdsaDer2Ieee(test.der, test.ieee.length));
+    }
+  },
+
+  testEcdsaDer2IeeeWithInvalidSignatures() {
+    for (let test of INVALID_DER_ECDSA_SIGNATURES) {
+      try {
+        EllipticCurves.ecdsaDer2Ieee(
+            Bytes.fromHex(test), 1 /* ieeeLength, ignored */);
+      } catch (e) {
+        assertEquals('CustomError: invalid DER signature', e.toString());
+      }
+    }
+  },
+
+  testEcdsaIeee2Der() {
+    for (let test of ECDSA_IEEE_DER_TEST_VECTORS) {
+      assertObjectEquals(test.der, EllipticCurves.ecdsaIeee2Der(test.ieee));
+    }
+  },
+
+  testIsValidDerEcdsaSignature() {
+    for (let test of INVALID_DER_ECDSA_SIGNATURES) {
+      assertFalse(EllipticCurves.isValidDerEcdsaSignature(Bytes.fromHex(test)));
+    }
+  },
+});
+
+/**
+ * Runs the test with test vector given as an input and returns either empty
+ * string or a text describing the failure.
+ *
+ * @param {!Object} test - JSON object with test data
+ * @return {!Promise<string>}
+ */
+const runWycheproofTest = async function(test) {
+  try {
+    const privateKey =
+        await EllipticCurves.importPrivateKey('ECDH', test['private']);
+    try {
+      const publicKey =
+          await EllipticCurves.importPublicKey('ECDH', test['public']);
+      const sharedSecret =
+          await EllipticCurves.computeEcdhSharedSecret(privateKey, publicKey);
+      if (test['result'] === 'invalid') {
+        return 'Fail on test ' + test['tcId'] + ': No exception thrown.\n';
+      }
+      const sharedSecretHex = Bytes.toHex(sharedSecret);
+      if (sharedSecretHex !== test['shared']) {
+        return 'Fail on test ' + test['tcId'] + ': unexpected result was \"' +
+            sharedSecretHex + '\".\n';
+      }
+    } catch (e) {
+      if (test['result'] === 'valid') {
+        return 'Fail on test ' + test['tcId'] + ': unexpected exception \"' +
+            e.toString() + '\".\n';
+      }
+    }
+  } catch (e) {
+    if (test['result'] === 'valid') {
+      if (test['private']['crv'] == "P-256K") {
+        // P-256K doesn't have to be supported. Hence failing to import the
+        // key is OK.
+        return '';
+      }
+      return 'Fail on test ' + test['tcId'] +
+          ': unexpected exception trying to import private key \"' +
+          e.toString() + '\".\n';
+    }
+  }
+  // If the test passes return an empty string.
+  return '';
+};
+
+class TestKey {
+  /**
+   * @param {string} curve
+   * @param {string} x
+   * @param {string} y
+   * @param {string=} opt_d
+   */
+  constructor(curve, x, y, opt_d) {
+    /** @const {string} */
+    this.curve = curve;
+    /** @const {string} */
+    this.x = x;
+    /** @const {string} */
+    this.y = y;
+    /** @const {string|undefined} */
+    this.d = opt_d;
+  }
+}
+
+// This set of keys was generated by Java version of Tink.
+// It contains one private and one public key for each curve type supported by
+// Tink.
+/** {!Array<!TestKey>} */
+const TEST_KEYS = [
+  new TestKey(
+      /* curve = */ 'P-256',
+      /* x = */
+      '2eab800e5d8e9b15d0f87c55324b477ffc9382d7137599e0203113a4e41b50d0',
+      /* y = */
+      '50bb2c11cfb72f3c380c2f93ea088d6938b91bcf581cd94a73ed0a3f623a6b8b'),
+  new TestKey(
+      /* curve = */ 'P-256',
+      /* x = */
+      '844c085cc4450297b681126356e10da074dea817f69bc2b1f3d6b1fc82593c7d',
+      /* y = */
+      '3cdb41fc89867d2066cc9c4f9ad7e890152bad24de20621abfe608234cbe40f1',
+      /* opt_d = */
+      'f96796cc28b36038817cc5d7db01c52ee0411dd848dc0833e9e26e989e4a64db'),
+  new TestKey(
+      /* curve = */ 'P-384',
+      /* x = */
+      'f3290cc80faa65e8821b0bf835f51e3431a4d78dcebd81b74c53b9b704bd995df93b648d51057a9a96a654fb8332391e',
+      /* y = */
+      '7e52bb9f654781a6894ef5ae77869207fa32ddbcec4a02d27ba1ead5472b3b9f39b09e9bca7d936809c143e99c655401'),
+  new TestKey(
+      /* curve = */ 'P-384',
+      /* x = */
+      'be9df79abedb82fc0e527630955f63f2f74b4984f0a4ac063a089565393ed20ac7a784f4efa434f5b1fa1837c76c8472',
+      /* y = */
+      'cf34ad0d4f3f2cbd546780509ec7073bb26fa0547d09ed10b83bf9b90903037ac956dbd661d02ce3e397e0547356b331',
+      /* opt_d = */
+      '34d86595280a8bdca23ccd60eeac9581016e895c2bc867c26dc2f99f6d0f627ce586ad36d1d2981968d8852dc9276d12'),
+  new TestKey(
+      /* curve = */ 'P-521',
+      /* x = */
+      '012f2211ec7e634919857be3066becf20c438b84ff24501712c91c98f527b44c7b001f8611935cb1179541c2b3cc3a1fc9259d50cd4842a847ea0cafe22cd75fe788',
+      /* y = */
+      '016b5d3f5480122643a26ef9e7c7e36875f53c28167d6afc35777d32ea76127d34287325bf14779f2e4cf3864fcc951ba601cec92b03291e34db2e815d4bd6fc2045'),
+  new TestKey(
+      /* curve = */ 'P-521',
+      /* x = */
+      '01ee3aabecef323cb4581e044be21914b567c426eae18d71720a71a0b236f5324ef9666fe855f5d7986d3e33a9250396f63c780572b3ad9417d69c2a87773ce39194',
+      /* y = */
+      '0036bea90db019304719d269e5335f9790e730e241a1b02cfdab8bdcfd0bcff8bdcb3ddeb9c3a94ecff1ab6abb80b0c1655f871c6089d3a4bf8625cf6bd182897f1b',
+      /* opt_d = */
+      '00b9f9f5d91cbfa9b7f92b041b137ac9822ca4a38f71ce227f624cac6178ca8351fab24bc2cc3f85d7ab72f54a0f9d1bb11a888a79a9c7b1ca267ddc82043585e437')
+];
+
+class EcdsaIeeeDerTestVector {
+  /**
+   * @param {string} ieee
+   * @param {string} der
+   */
+  constructor(ieee, der) {
+    /** @const {!Uint8Array} */
+    this.ieee = Bytes.fromHex(ieee);
+    /** @const {!Uint8Array} */
+    this.der = Bytes.fromHex(der);
+  }
+}
+
+/** {!Array<!EcdsaIeeeDerTestVector>} */
+const ECDSA_IEEE_DER_TEST_VECTORS = [
+  new EcdsaIeeeDerTestVector(  // normal case, short-form length
+      '0102030405060708090a0b0c0d0e0f100102030405060708090a0b0c0d0e0f10',
+      '302402100102030405060708090a0b0c0d0e0f1002100102030405060708090a0b0c0d0e0f10'),
+  new EcdsaIeeeDerTestVector(  // normal case, long-form length
+      '010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000010000000203010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000010000000203',
+      '30818802420100000001000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000002030242010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000010000000203'),
+  new EcdsaIeeeDerTestVector(  // zero prefix.
+      '0002030405060708090a0b0c0d0e0f100002030405060708090a0b0c0d0e0f10',
+      '3022020f02030405060708090a0b0c0d0e0f10020f02030405060708090a0b0c0d0e0f10'),
+  new EcdsaIeeeDerTestVector(  // highest bit is set.
+      '00ff030405060708090a0b0c0d0e0f1000ff030405060708090a0b0c0d0e0f10',
+      '3024021000ff030405060708090a0b0c0d0e0f10021000ff030405060708090a0b0c0d0e0f10'),
+  new EcdsaIeeeDerTestVector(  // highest bit is set, full length.
+      'ff02030405060708090a0b0c0d0e0f10ff02030405060708090a0b0c0d0e0f10',
+      '3026021100ff02030405060708090a0b0c0d0e0f10021100ff02030405060708090a0b0c0d0e0f10'),
+  new EcdsaIeeeDerTestVector(  // all zeros.
+      '0000000000000000000000000000000000000000000000000000000000000000',
+      '3006020100020100'),
+];
+
+/** {!Array<string>} */
+const INVALID_DER_ECDSA_SIGNATURES = [
+  '2006020101020101',    // 1st byte is not 0x30 (SEQUENCE tag)
+  '3006050101020101',    // 3rd byte is not 0x02 (INTEGER tag)
+  '3006020101050101',    // 6th byte is not 0x02 (INTEGER tag)
+  '308206020101020101',  // long form length is not 0x81
+  '30ff020101020101',    // invalid total length
+  '3006020201020101',    // invalid rLength
+  '3006020101020201',    // invalid sLength
+  '30060201ff020101',    // no extra zero when highest bit of r is set
+  '30060201010201ff',    // no extra zero when highest bit of s is set
+];
diff --git a/javascript/subtle/encrypt_then_authenticate.js b/javascript/subtle/encrypt_then_authenticate.js
new file mode 100644
index 0000000..972dbcc
--- /dev/null
+++ b/javascript/subtle/encrypt_then_authenticate.js
@@ -0,0 +1,135 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.EncryptThenAuthenticate');
+
+const Aead = goog.require('tink.Aead');
+const AesCtr = goog.require('tink.subtle.AesCtr');
+const Bytes = goog.require('tink.subtle.Bytes');
+const Hmac = goog.require('tink.subtle.Hmac');
+const IndCpaCipher = goog.require('tink.subtle.IndCpaCipher');
+const InvalidArgumentsException = goog.require('tink.exception.InvalidArgumentsException');
+const Mac = goog.require('tink.Mac');
+const SecurityException = goog.require('tink.exception.SecurityException');
+const Validators = goog.require('tink.subtle.Validators');
+
+/**
+ * This primitive performs an encrypt-then-Mac operation on plaintext and
+ * additional authenticated data (aad).
+ *
+ * The Mac is computed over `aad || ciphertext || size of aad`, thus it
+ * doesn't violate https://en.wikipedia.org/wiki/Horton_Principle.
+ *
+ * This implementation is based on
+ * http://tools.ietf.org/html/draft-mcgrew-aead-aes-cbc-hmac-sha2-05.
+ *
+ * @implements {Aead}
+ * @public
+ * @final
+ */
+class EncryptThenAuthenticate {
+  /**
+   * @param {!IndCpaCipher} cipher
+   * @param {number} ivSize the IV size in bytes
+   * @param {!Mac} mac
+   * @param {number} tagSize the MAC tag size in bytes
+   * @throws {InvalidArgumentsException}
+   */
+  constructor(cipher, ivSize, mac, tagSize) {
+    /** @const @private {IndCpaCipher} */
+    this.cipher_ = cipher;
+
+    /** @const @private {number} */
+    this.ivSize_ = ivSize;
+
+    /** @const @private {Mac} */
+    this.mac_ = mac;
+
+    /** @const @private {number} */
+    this.tagSize_ = tagSize;
+  }
+
+  /**
+   * @param {!Uint8Array} aesKey
+   * @param {number} ivSize the size of the IV
+   * @param {string} hmacHashAlgo accepted names are SHA-1, SHA-256 and SHA-512
+   * @param {!Uint8Array} hmacKey
+   * @param {number} tagSize the size of the tag
+   * @return {!Promise.<!EncryptThenAuthenticate>}
+   * @throws {InvalidArgumentsException}
+   * @static
+   */
+  static async newAesCtrHmac(aesKey, ivSize, hmacHashAlgo, hmacKey, tagSize) {
+    Validators.requireUint8Array(aesKey);
+    Validators.requireUint8Array(hmacKey);
+
+    const cipher = await AesCtr.newInstance(aesKey, ivSize);
+    const mac = await Hmac.newInstance(hmacHashAlgo, hmacKey, tagSize);
+    return new EncryptThenAuthenticate(cipher, ivSize, mac, tagSize);
+  }
+
+  /**
+   * The plaintext is encrypted with an {@link IndCpaCipher}, then MAC
+   * is computed over `aad || ciphertext || t` where t is aad's length in bits
+   * represented as 64-bit bigendian unsigned integer. The final ciphertext
+   * format is `ind-cpa ciphertext || mac`.
+   *
+   * @override
+   */
+  async encrypt(plaintext, opt_associatedData) {
+    Validators.requireUint8Array(plaintext);
+    const payload = await this.cipher_.encrypt(plaintext);
+    let aad = new Uint8Array(0);
+    if (opt_associatedData != null) {
+      aad = opt_associatedData;
+      Validators.requireUint8Array(opt_associatedData);
+    }
+    const aadLength = Bytes.fromNumber(aad.length * 8);
+    const mac =
+        await this.mac_.computeMac(Bytes.concat(aad, payload, aadLength));
+    if (this.tagSize_ != mac.length) {
+      throw new SecurityException(
+          'invalid tag size, expected ' + this.tagSize_ + ' but got ' +
+          mac.length);
+    }
+    return Bytes.concat(payload, mac);
+  }
+
+  /**
+   * @override
+   */
+  async decrypt(ciphertext, opt_associatedData) {
+    Validators.requireUint8Array(ciphertext);
+    if (ciphertext.length < this.ivSize_ + this.tagSize_) {
+      throw new SecurityException('ciphertext too short');
+    }
+    const payload = new Uint8Array(
+        ciphertext.subarray(0, ciphertext.length - this.tagSize_));
+    let aad = new Uint8Array(0);
+    if (opt_associatedData != null) {
+      aad = opt_associatedData;
+      Validators.requireUint8Array(opt_associatedData);
+    }
+    const aadLength = Bytes.fromNumber(aad.length * 8);
+    const input = Bytes.concat(aad, payload, aadLength);
+    const tag = new Uint8Array(ciphertext.subarray(payload.length));
+    const isValidMac = await this.mac_.verifyMac(tag, input);
+    if (!isValidMac) {
+      throw new SecurityException('invalid MAC');
+    }
+    return await this.cipher_.decrypt(payload);
+  }
+}
+
+exports = EncryptThenAuthenticate;
diff --git a/javascript/subtle/encrypt_then_authenticate_test.js b/javascript/subtle/encrypt_then_authenticate_test.js
new file mode 100644
index 0000000..31f2d7d
--- /dev/null
+++ b/javascript/subtle/encrypt_then_authenticate_test.js
@@ -0,0 +1,255 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.EncryptThenAuthenticateTest');
+goog.setTestOnly('tink.subtle.EncryptThenAuthenticateTest');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const EncryptThenAuthenticate = goog.require('tink.subtle.EncryptThenAuthenticate');
+const Random = goog.require('tink.subtle.Random');
+const TestCase = goog.require('goog.testing.TestCase');
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+  setUp() {
+    // Use a generous promise timeout for running continuously.
+    TestCase.getActiveTestCase().promiseTimeout = 1000 * 1000;  // 1000s
+  },
+
+  tearDown() {
+    // Reset the promise timeout to default value.
+    TestCase.getActiveTestCase().promiseTimeout = 1000;  // 1s
+  },
+
+  async testBasic() {
+    const aead = await EncryptThenAuthenticate.newAesCtrHmac(
+        Random.randBytes(16) /* aesKey */, 12 /* ivSize */, 'SHA-256',
+        Random.randBytes(16) /* hmacKey */, 10 /* tagSize */);
+    for (let i = 0; i < 100; i++) {
+      const msg = Random.randBytes(20);
+      let ciphertext = await aead.encrypt(msg);
+      let plaintext = await aead.decrypt(ciphertext);
+      assertEquals(Bytes.toHex(msg), Bytes.toHex(plaintext));
+
+      let aad = null;
+      ciphertext = await aead.encrypt(msg, aad);
+      plaintext = await aead.decrypt(ciphertext, aad);
+      assertEquals(Bytes.toHex(msg), Bytes.toHex(plaintext));
+
+      aad = Random.randBytes(20);
+      ciphertext = await aead.encrypt(msg, aad);
+      plaintext = await aead.decrypt(ciphertext, aad);
+      assertEquals(Bytes.toHex(msg), Bytes.toHex(plaintext));
+    }
+  },
+
+  async testProbabilisticEncryption() {
+    const aead = await EncryptThenAuthenticate.newAesCtrHmac(
+        Random.randBytes(16) /* aesKey */, 12 /* ivSize */, 'SHA-256',
+        Random.randBytes(16) /* hmacKey */, 10 /* tagSize */);
+    const msg = Random.randBytes(20);
+    const aad = Random.randBytes(20);
+    const results = new Set();
+    for (let i = 0; i < 100; i++) {
+      const ciphertext = await aead.encrypt(msg, aad);
+      results.add(Bytes.toHex(ciphertext));
+    }
+    assertEquals(100, results.size);
+  },
+
+  async testType() {
+    try {
+      await EncryptThenAuthenticate.newAesCtrHmac(
+          'blah' /* aesKey */, 12 /* ivSize */, 'SHA-256',
+          Random.randBytes(16) /* hmacKey */, 10 /* tagSize */);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+    try {
+      await EncryptThenAuthenticate.newAesCtrHmac(
+          Random.randBytes(16) /* aesKey */, 12 /* ivSize */, 'SHA-256',
+          'blah' /* hmacKey */, 10 /* tagSize */);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+
+    const aead = await EncryptThenAuthenticate.newAesCtrHmac(
+        Random.randBytes(16) /* aesKey */, 12 /* ivSize */, 'SHA-256',
+        Random.randBytes(16) /* hmacKey */, 10 /* tagSize */);
+    try {
+      await aead.encrypt('blah');
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+    try {
+      await aead.encrypt(Random.randBytes(20), 'blah');
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+    try {
+      await aead.decrypt('blah');
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+    try {
+      await aead.decrypt(Random.randBytes(32), 'blah');
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+  },
+
+  async testBitFlipCiphertext() {
+    const aead = await EncryptThenAuthenticate.newAesCtrHmac(
+        Random.randBytes(16) /* aesKey */, 16 /* ivSize */, 'SHA-256',
+        Random.randBytes(16) /* hmacKey */, 16 /* tagSize */);
+    const plaintext = Random.randBytes(8);
+    const aad = Random.randBytes(8);
+    const ciphertext = await aead.encrypt(plaintext, aad);
+    for (let i = 0; i < ciphertext.length; i++) {
+      for (let j = 0; j < 8; j++) {
+        const c1 = new Uint8Array(ciphertext);
+        c1[i] = (c1[i] ^ (1 << j));
+        try {
+          await aead.decrypt(c1, aad);
+          fail('Should throw an exception.');
+        } catch (e) {
+          assertEquals('CustomError: invalid MAC', e.toString());
+        }
+      }
+    }
+  },
+
+  async testBitFlipAad() {
+    const aead = await EncryptThenAuthenticate.newAesCtrHmac(
+        Random.randBytes(16) /* aesKey */, 16 /* ivSize */, 'SHA-256',
+        Random.randBytes(16) /* hmacKey */, 16 /* tagSize */);
+    const plaintext = Random.randBytes(8);
+    const aad = Random.randBytes(8);
+    const ciphertext = await aead.encrypt(plaintext, aad);
+    for (let i = 0; i < aad.length; i++) {
+      for (let j = 0; j < 8; j++) {
+        const aad1 = new Uint8Array(aad);
+        aad1[i] = (aad1[i] ^ (1 << j));
+        try {
+          await aead.decrypt(ciphertext, aad1);
+          fail('Should throw an exception.');
+        } catch (e) {
+          assertEquals('CustomError: invalid MAC', e.toString());
+        }
+      }
+    }
+  },
+
+  async testTruncation() {
+    const aead = await EncryptThenAuthenticate.newAesCtrHmac(
+        Random.randBytes(16) /* aesKey */, 16 /* ivSize */, 'SHA-256',
+        Random.randBytes(16) /* hmacKey */, 16 /* tagSize */);
+    const plaintext = Random.randBytes(8);
+    const aad = Random.randBytes(8);
+    const ciphertext = await aead.encrypt(plaintext, aad);
+    for (let i = 1; i <= ciphertext.length; i++) {
+      const c1 = new Uint8Array(ciphertext.buffer, 0, ciphertext.length - i);
+      try {
+        await aead.decrypt(c1, aad);
+        fail('Should throw an exception.');
+      } catch (e) {
+        if (c1.length < 32) {
+          assertEquals('CustomError: ciphertext too short', e.toString());
+        } else {
+          assertEquals('CustomError: invalid MAC', e.toString());
+        }
+      }
+    }
+  },
+
+  async testWithRfcTestVectors() {
+    // Test data from
+    // https://tools.ietf.org/html/draft-mcgrew-aead-aes-cbc-hmac-sha2-05. As we
+    // use CTR while RFC uses CBC mode, it's not possible to compare plaintexts.
+    // However, the test is still valueable to make sure that we correcly
+    // compute HMAC over ciphertext and aad.
+    const RFC_TEST_VECTORS = [
+      {
+        'macKey': '000102030405060708090a0b0c0d0e0f',
+        'encryptionKey': '101112131415161718191a1b1c1d1e1f',
+        'ciphertext': '1af38c2dc2b96ffdd86694092341bc04' +
+            'c80edfa32ddf39d5ef00c0b468834279' +
+            'a2e46a1b8049f792f76bfe54b903a9c9' +
+            'a94ac9b47ad2655c5f10f9aef71427e2' +
+            'fc6f9b3f399a221489f16362c7032336' +
+            '09d45ac69864e3321cf82935ac4096c8' +
+            '6e133314c54019e8ca7980dfa4b9cf1b' +
+            '384c486f3a54c51078158ee5d79de59f' +
+            'bd34d848b3d69550a67646344427ade5' +
+            '4b8851ffb598f7f80074b9473c82e2db' +
+            '652c3fa36b0a7c5b3219fab3a30bc1c4',
+        'aad': '546865207365636f6e64207072696e63' +
+            '69706c65206f66204175677573746520' +
+            '4b6572636b686f666673',
+        'hashAlgoName': 'SHA-256',
+        'ivSize': 16,
+        'tagSize': 16
+      },
+      {
+        'macKey':
+            '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f',
+        'encryptionKey':
+            '202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f',
+        'ciphertext': '1af38c2dc2b96ffdd86694092341bc04' +
+            '4affaaadb78c31c5da4b1b590d10ffbd' +
+            '3dd8d5d302423526912da037ecbcc7bd' +
+            '822c301dd67c373bccb584ad3e9279c2' +
+            'e6d12a1374b77f077553df829410446b' +
+            '36ebd97066296ae6427ea75c2e0846a1' +
+            '1a09ccf5370dc80bfecbad28c73f09b3' +
+            'a3b75e662a2594410ae496b2e2e6609e' +
+            '31e6e02cc837f053d21f37ff4f51950b' +
+            'be2638d09dd7a4930930806d0703b1f6' +
+            '4dd3b4c088a7f45c216839645b2012bf' +
+            '2e6269a8c56a816dbc1b267761955bc5',
+        'aad':
+            '546865207365636f6e64207072696e6369706c65206f662041756775737465204b6572636b686f666673',
+        'hashAlgoName': 'SHA-512',
+        'ivSize': 16,
+        'tagSize': 32
+      },
+    ];
+    for (let i = 0; i < RFC_TEST_VECTORS.length; i++) {
+      const testVector = RFC_TEST_VECTORS[i];
+      const aead = await EncryptThenAuthenticate.newAesCtrHmac(
+          Bytes.fromHex(testVector['encryptionKey']), testVector['ivSize'],
+          testVector['hashAlgoName'], Bytes.fromHex(testVector['macKey']),
+          testVector['tagSize']);
+      const ciphertext = Bytes.fromHex(testVector['ciphertext']);
+      const aad = Bytes.fromHex(testVector['aad']);
+      try {
+        await aead.decrypt(ciphertext, aad);
+      } catch (e) {
+        fail(e);
+      }
+    }
+  },
+});
diff --git a/javascript/subtle/environment.js b/javascript/subtle/environment.js
new file mode 100644
index 0000000..6e62aec
--- /dev/null
+++ b/javascript/subtle/environment.js
@@ -0,0 +1,23 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.Environment');
+
+/** @const {boolean} */
+const IS_WEBCRYPTO_AVAILABLE = typeof goog.global['crypto'] !== 'undefined' &&
+    typeof goog.global['crypto']['subtle'] !== 'undefined';
+
+exports = {
+  IS_WEBCRYPTO_AVAILABLE,
+};
diff --git a/javascript/subtle/hkdf.js b/javascript/subtle/hkdf.js
new file mode 100644
index 0000000..5fdc6b6
--- /dev/null
+++ b/javascript/subtle/hkdf.js
@@ -0,0 +1,110 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * @fileoverview An implementation of HKDF, RFC 5869.
+ */
+
+goog.module('tink.subtle.Hkdf');
+
+const Hmac = goog.require('tink.subtle.Hmac');
+const InvalidArgumentsException = goog.require('tink.exception.InvalidArgumentsException');
+const Validators = goog.require('tink.subtle.Validators');
+
+/**
+ * Computes an HKDF.
+ *
+ * @param {number} size The length of the generated pseudorandom string in
+ *     bytes. The maximal size is 255 * DigestSize, where DigestSize is the size
+ *     of the underlying HMAC.
+ * @param {string} hash the name of the hash function. Accepted names are SHA-1,
+ *     SHA-256 and SHA-512
+ * @param {!Uint8Array} ikm Input keying material.
+ * @param {!Uint8Array} info Context and application specific
+ *     information (can be a zero-length array).
+ * @param {!Uint8Array=} opt_salt Salt value (a non-secret random
+ *     value). If not provided, it is set to a string of hash length zeros.
+ * @return {!Promise.<!Uint8Array>} Output keying material (okm).
+ */
+const compute = async function(size, hash, ikm, info, opt_salt) {
+  let digestSize;
+  if (!Number.isInteger(size)) {
+    throw new InvalidArgumentsException('size must be an integer');
+  }
+  if (size <= 0) {
+    throw new InvalidArgumentsException('size must be positive');
+  }
+  switch (hash) {
+    case 'SHA-1':
+      digestSize = 20;
+      if (size > 255 * 20) {
+        throw new InvalidArgumentsException('size too large');
+      }
+      break;
+    case 'SHA-256':
+      digestSize = 32;
+      if (size > 255 * 32) {
+        throw new InvalidArgumentsException('size too large');
+      }
+      break;
+    case 'SHA-512':
+      digestSize = 64;
+      if (size > 255 * 64) {
+        throw new InvalidArgumentsException('size too large');
+      }
+      break;
+    default:
+      throw new InvalidArgumentsException(hash + ' is not supported');
+  }
+
+  Validators.requireUint8Array(ikm);
+  Validators.requireUint8Array(info);
+
+  let salt = opt_salt;
+  if (opt_salt == null || salt === undefined || salt.length == 0) {
+    salt = new Uint8Array(digestSize);
+  }
+  Validators.requireUint8Array(salt);
+
+  // Extract.
+  let hmac = await Hmac.newInstance(hash, salt, digestSize);
+  const prk = await hmac.computeMac(ikm);  // Pseudorandom Key
+
+  // Expand
+  hmac = await Hmac.newInstance(hash, prk, digestSize);
+  let ctr = 1;
+  let pos = 0;
+  let digest = new Uint8Array(0);
+  let result = new Uint8Array(size);
+  while (true) {
+    let input = new Uint8Array(digest.length + info.length + 1);
+    input.set(digest, 0);
+    input.set(info, digest.length);
+    input[input.length - 1] = ctr;
+    digest = await hmac.computeMac(input);
+    if (pos + digest.length < size) {
+      result.set(digest, pos);
+      pos += digest.length;
+      ctr++;
+    } else {
+      result.set(digest.subarray(0, size - pos), pos);
+      break;
+    }
+  }
+  return result;
+};
+
+exports = {
+  compute,
+};
diff --git a/javascript/subtle/hkdf_test.js b/javascript/subtle/hkdf_test.js
new file mode 100644
index 0000000..f732d9d
--- /dev/null
+++ b/javascript/subtle/hkdf_test.js
@@ -0,0 +1,223 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.HkdfTest');
+goog.setTestOnly('tink.subtle.HkdfTest');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const Hkdf = goog.require('tink.subtle.Hkdf');
+const Random = goog.require('tink.subtle.Random');
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+  async testConstructor() {
+    const ikm = Random.randBytes(16);
+    const info = Random.randBytes(16);
+    try {
+      await Hkdf.compute(0, 'SHA-256', ikm, info);  // 0 output size
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals('CustomError: size must be positive', e.toString());
+    }
+
+    try {
+      await Hkdf.compute(-1, 'SHA-256', ikm, info);  // negative output size
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals('CustomError: size must be positive', e.toString());
+    }
+
+    try {
+      await Hkdf.compute(
+          /** 255 * digestSize + 1 */ (255 * 20) + 1, 'SHA-1', ikm,
+          info);  // size too large
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals('CustomError: size too large', e.toString());
+    }
+
+    try {
+      await Hkdf.compute(
+          /** 255 * digestSize + 1 */ (255 * 32) + 1, 'SHA-256', ikm,
+          info);  // size too large
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals('CustomError: size too large', e.toString());
+    }
+
+    try {
+      await Hkdf.compute(
+          /** 255 * digestSize + 1 */ (255 * 64) + 1, 'SHA-512', ikm,
+          info);  // size too large
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals('CustomError: size too large', e.toString());
+    }
+
+    try {
+      await Hkdf.compute(1, 'SHA-256', 'blah', info);  // wrong type
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+
+    try {
+      await Hkdf.compute(1, 'SHA-256', ikm, 'blah');  // wrong type
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+
+    try {
+      await Hkdf.compute(1, 'SHA-256', ikm, info, 'blah');  // size too large
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+  },
+
+  async testConstructor_nonIntegerOutputSize() {
+    const ikm = Random.randBytes(16);
+    const info = Random.randBytes(16);
+    try {
+      await Hkdf.compute(NaN, 'SHA-256', ikm, info);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals('CustomError: size must be an integer', e.toString());
+    }
+
+    try {
+      await Hkdf.compute(undefined, 'SHA-256', ikm, info);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals('CustomError: size must be an integer', e.toString());
+    }
+
+    try {
+      await Hkdf.compute(1.5, 'SHA-256', ikm, info);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals('CustomError: size must be an integer', e.toString());
+    }
+  },
+
+  async testWithTestVectors() {
+    // Test cases are specified in Appendix A of RFC 5869.
+    const TEST_VECTORS = [
+      {
+        'hash': 'SHA-256',
+        'output':
+            '3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865',
+        'outputSize': 42,
+        'ikm': '0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b',
+        'salt': '000102030405060708090a0b0c',
+        'info': 'f0f1f2f3f4f5f6f7f8f9',
+      },
+      {
+        'hash': 'SHA-256',
+        'output':
+            'b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c' +
+            '59045a99cac7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71' +
+            'cc30c58179ec3e87c14c01d5c1f3434f1d87',
+        'outputSize': 82,
+        'ikm':
+            '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f' +
+            '202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f' +
+            '404142434445464748494a4b4c4d4e4f',
+        'salt':
+            '606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f' +
+            '808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f' +
+            'a0a1a2a3a4a5a6a7a8a9aaabacadaeaf',
+        'info':
+            'b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecf' +
+            'd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeef' +
+            'f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff',
+      },
+      // Salt is empty
+      {
+        'hash': 'SHA-256',
+        'output':
+            '8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d' +
+            '9d201395faa4b61a96c8',
+        'outputSize': 42,
+        'ikm': '0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b',
+        'salt': '',
+        'info': '',
+      },
+      {
+        'hash': 'SHA-1',
+        'output':
+            '085a01ea1b10f36933068b56efa5ad81a4f14b822f5b091568a9cdd4f155fda2c22e422478d305f3f896',
+        'outputSize': 42,
+        'ikm': '0b0b0b0b0b0b0b0b0b0b0b',
+        'salt': '000102030405060708090a0b0c',
+        'info': 'f0f1f2f3f4f5f6f7f8f9',
+      },
+      {
+        'hash': 'SHA-1',
+        'output':
+            '0bd770a74d1160f7c9f12cd5912a06ebff6adcae899d92191fe4305673ba2ffe' +
+            '8fa3f1a4e5ad79f3f334b3b202b2173c486ea37ce3d397ed034c7f9dfeb15c5e' +
+            '927336d0441f4c4300e2cff0d0900b52d3b4',
+        'outputSize': 82,
+        'ikm':
+            '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f' +
+            '202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f' +
+            '404142434445464748494a4b4c4d4e4f',
+        'salt':
+            '606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f' +
+            '808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f' +
+            'a0a1a2a3a4a5a6a7a8a9aaabacadaeaf',
+        'info':
+            'b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecf' +
+            'd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeef' +
+            'f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff',
+      },
+      // Salt is empty
+      {
+        'hash': 'SHA-1',
+        'output':
+            '0ac1af7002b3d761d1e55298da9d0506b9ae52057220a306e07b6b87e8df21d0' +
+            'ea00033de03984d34918',
+        'outputSize': 42,
+        'ikm': '0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b',
+        'salt': '',
+        'info': '',
+      },
+      // Salt is empty
+      {
+        'hash': 'SHA-1',
+        'output':
+            '2c91117204d745f3500d636a62f64f0ab3bae548aa53d423b0d1f27ebba6f5e5' +
+            '673a081d70cce7acfc48',
+        'outputSize': 42,
+        'ikm': '0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c',
+        'salt': '',
+        'info': '',
+      },
+    ];
+    for (let i = 0; i < TEST_VECTORS.length; i++) {
+      const testVector = TEST_VECTORS[i];
+      const ikm = Bytes.fromHex(testVector['ikm']);
+      const salt = Bytes.fromHex(testVector['salt']);
+      const info = Bytes.fromHex(testVector['info']);
+      const hkdf = await Hkdf.compute(
+          testVector['outputSize'], testVector['hash'], ikm, info, salt);
+      assertEquals(Bytes.toHex(hkdf), testVector['output']);
+    }
+  },
+});
diff --git a/javascript/subtle/hmac.js b/javascript/subtle/hmac.js
new file mode 100644
index 0000000..28738a9
--- /dev/null
+++ b/javascript/subtle/hmac.js
@@ -0,0 +1,130 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.Hmac');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const Environment = goog.require('tink.subtle.Environment');
+const HmacPureJs = goog.require('tink.subtle.purejs.Hmac');
+const InvalidArgumentsException = goog.require('tink.exception.InvalidArgumentsException');
+const Mac = goog.require('tink.Mac');
+const Validators = goog.require('tink.subtle.Validators');
+
+/**
+ * The minimum tag size.
+ *
+ * @const {number}
+ */
+const MIN_TAG_SIZE_IN_BYTES = 10;
+
+/**
+ * Implementation of HMAC.
+ *
+ * @implements {Mac}
+ * @public
+ * @final
+ */
+class Hmac {
+  /**
+   * @param {string} hash accepted names are SHA-1, SHA-256 and SHA-512
+   * @param {!webCrypto.CryptoKey} key
+   * @param {number} tagSize the size of the tag
+   */
+  constructor(hash, key, tagSize) {
+    /** @const @private {string} */
+    this.hash_ = hash;
+
+    /** @const @private {number} */
+    this.tagSize_ = tagSize;
+
+    /** @const @private {!webCrypto.CryptoKey} */
+    this.key_ = key;
+  }
+
+  /**
+   * @param {string} hash accepted names are SHA-1, SHA-256 and SHA-512
+   * @param {!Uint8Array} key
+   * @param {number} tagSize the size of the tag
+   * @return {!Promise.<!Mac>}
+   * @static
+   */
+  static async newInstance(hash, key, tagSize) {
+    Validators.requireUint8Array(key);
+    if (!Number.isInteger(tagSize)) {
+      throw new InvalidArgumentsException(
+          'invalid tag size, must be an integer');
+    }
+    if (tagSize < MIN_TAG_SIZE_IN_BYTES) {
+      throw new InvalidArgumentsException(
+          'tag too short, must be at least ' + MIN_TAG_SIZE_IN_BYTES +
+          ' bytes');
+    }
+    switch (hash) {
+      case 'SHA-1':
+        if (tagSize > 20) {
+          throw new InvalidArgumentsException(
+              'tag too long, must not be larger than 20 bytes');
+        }
+        break;
+      case 'SHA-256':
+        if (tagSize > 32) {
+          throw new InvalidArgumentsException(
+              'tag too long, must not be larger than 32 bytes');
+        }
+        break;
+      case 'SHA-512':
+        if (tagSize > 64) {
+          throw new InvalidArgumentsException(
+              'tag too long, must not be larger than 64 bytes');
+        }
+        break;
+      default:
+        throw new InvalidArgumentsException(hash + ' is not supported');
+    }
+
+    // TODO(b/115974209): Add check that key.length > 16.
+
+    if (Environment.IS_WEBCRYPTO_AVAILABLE) {
+      const cryptoKey = await self.crypto.subtle.importKey(
+          'raw', key,
+          {'name': 'HMAC', 'hash': {'name': hash}, 'length': key.length * 8},
+          false, ['sign', 'verify']);
+      return new Hmac(hash, cryptoKey, tagSize);
+    }
+
+    return new HmacPureJs(hash, key, tagSize);
+  }
+
+  /**
+   * @override
+   */
+  async computeMac(data) {
+    Validators.requireUint8Array(data);
+    const tag = await self.crypto.subtle.sign(
+        {'name': 'HMAC', 'hash': {'name': this.hash_}}, this.key_, data);
+    return new Uint8Array(tag.slice(0, this.tagSize_));
+  }
+
+  /**
+   * @override
+   */
+  async verifyMac(tag, data) {
+    Validators.requireUint8Array(tag);
+    Validators.requireUint8Array(data);
+    const computedTag = await this.computeMac(data);
+    return Bytes.isEqual(tag, computedTag);
+  }
+}
+
+exports = Hmac;
diff --git a/javascript/subtle/hmac_test.js b/javascript/subtle/hmac_test.js
new file mode 100644
index 0000000..b48a9e6
--- /dev/null
+++ b/javascript/subtle/hmac_test.js
@@ -0,0 +1,294 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.HmacTest');
+goog.setTestOnly('tink.subtle.HmacTest');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const Hmac = goog.require('tink.subtle.Hmac');
+const Random = goog.require('tink.subtle.Random');
+const testSuite = goog.require('goog.testing.testSuite');
+
+testSuite({
+  async testBasic() {
+    const key = Random.randBytes(16);
+    const msg = Random.randBytes(4);
+    const hmac = await Hmac.newInstance('SHA-1', key, 10);
+    const tag = await hmac.computeMac(msg);
+    assertEquals(10, tag.length);
+    assertTrue(await hmac.verifyMac(tag, msg));
+  },
+
+  async testConstructor() {
+    try {
+      await Hmac.newInstance(
+          'blah', Random.randBytes(16), 16);  // invalid HMAC algo name
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals('CustomError: blah is not supported', e.toString());
+    }
+
+    try {
+      await Hmac.newInstance(
+          'SHA-1', Random.randBytes(15), 16);  // invalid key size
+      // TODO(b/115974209): This case does not throw an exception.
+    } catch (e) {
+      assertEquals(
+          'CustomError: key too short, must be at least 16 bytes',
+          e.toString());
+    }
+
+    try {
+      await Hmac.newInstance(
+          'SHA-1', Random.randBytes(16), 9);  // tag size too short
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: tag too short, must be at least 10 bytes',
+          e.toString());
+    }
+    try {
+      await Hmac.newInstance(
+          'SHA-1', Random.randBytes(16), 21);  // tag size too long
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: tag too long, must not be larger than 20 bytes',
+          e.toString());
+    }
+
+    try {
+      await Hmac.newInstance(
+          'SHA-256', Random.randBytes(15), 16);  // invalid key size
+      // TODO(b/115974209): This case does not throw an exception.
+    } catch (e) {
+      assertEquals(
+          'CustomError: key too short, must be at least 16 bytes',
+          e.toString());
+    }
+
+    try {
+      await Hmac.newInstance(
+          'SHA-256', Random.randBytes(16), 9);  // tag size too short
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: tag too short, must be at least 10 bytes',
+          e.toString());
+    }
+
+    try {
+      await Hmac.newInstance(
+          'SHA-256', Random.randBytes(16), 33);  // tag size too long
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: tag too long, must not be larger than 32 bytes',
+          e.toString());
+    }
+
+    try {
+      await Hmac.newInstance(
+          'SHA-512', Random.randBytes(15), 16);  // invalid key size
+      // TODO(b/115974209): This case does not throw an exception.
+    } catch (e) {
+      assertEquals(
+          'CustomError: key too short, must be at least 16 bytes',
+          e.toString());
+    }
+
+    try {
+      await Hmac.newInstance(
+          'SHA-512', Random.randBytes(16), 9);  // tag size too short
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: tag too short, must be at least 10 bytes',
+          e.toString());
+    }
+
+    try {
+      await Hmac.newInstance(
+          'SHA-512', Random.randBytes(16), 65);  // tag size too long
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: tag too long, must not be larger than 64 bytes',
+          e.toString());
+    }
+  },
+
+  async testConstructor_invalidTagSizes() {
+    try {
+      await Hmac.newInstance('SHA-512', Random.randBytes(16), NaN);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: invalid tag size, must be an integer', e.toString());
+    }
+
+    try {
+      await Hmac.newInstance('SHA-512', Random.randBytes(16), undefined);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: invalid tag size, must be an integer', e.toString());
+    }
+
+    try {
+      await Hmac.newInstance('SHA-512', Random.randBytes(16), 12.5);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: invalid tag size, must be an integer', e.toString());
+    }
+  },
+
+  async testType() {
+    try {
+      await Hmac.newInstance('SHA-1', 'blah', 10);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+    try {
+      await Hmac.newInstance('SHA-1', 123, 10);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+
+    const hmac = await Hmac.newInstance('SHA-1', Random.randBytes(16), 10);
+    try {
+      await hmac.computeMac('blah');
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+    try {
+      await hmac.computeMac('123');
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+    try {
+      await hmac.verifyMac('blah', Random.randBytes(20));
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+    try {
+      await hmac.verifyMac(123, Random.randBytes(20));
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+    try {
+      await hmac.verifyMac(Random.randBytes(20), 'blah');
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+    try {
+      await hmac.verifyMac(Random.randBytes(20), 123);
+      fail('Should throw an exception.');
+    } catch (e) {
+      assertEquals(
+          'CustomError: input must be a non null Uint8Array', e.toString());
+    }
+  },
+
+
+  async testModify() {
+    const key = Random.randBytes(16);
+    const msg = Random.randBytes(8);
+    const hmac = await Hmac.newInstance('SHA-1', key, 20);
+    const tag = await hmac.computeMac(msg);
+
+    // Modify tag.
+    for (let i = 0; i < tag.length; i++) {
+      const tag1 = new Uint8Array(tag);
+      tag1[i] = tag[i] ^ 0xff;
+      assertFalse(await hmac.verifyMac(tag1, msg));
+    }
+
+    // Modify msg.
+    for (let i = 0; i < msg.length; i++) {
+      const msg1 = new Uint8Array(msg);
+      msg1[i] = msg1[i] ^ 0xff;
+      assertFalse(await hmac.verifyMac(tag, msg1));
+    }
+  },
+
+  async testWithTestVectors() {
+    // Test data from
+    // http://csrc.nist.gov/groups/STM/cavp/message-authentication.html#testing.
+    const NIST_TEST_VECTORS = [
+      {
+        'algo': 'SHA-1',
+        'key':
+            '816aa4c3ee066310ac1e6666cf830c375355c3c8ba18cfe1f50a48c988b46272',
+        'message':
+            '220248f5e6d7a49335b3f91374f18bb8b0ff5e8b9a5853f3cfb293855d78301d' +
+            '837a0a2eb9e4f056f06c08361bd07180ee802651e69726c28910d2baef379606' +
+            '815dcbab01d0dc7acb0ba8e65a2928130da0522f2b2b3d05260885cf1c64f14c' +
+            'a3145313c685b0274bf6a1cb38e4f99895c6a8cc72fbe0e52c01766fede78a1a',
+        'tag': '17cb2e9e98b748b5ae0f7078ea5519e5'
+      },
+      {
+        'algo': 'SHA-256',
+        'key':
+            '6f35628d65813435534b5d67fbdb54cb33403d04e843103e6399f806cb5df95' +
+            'febbdd61236f33245',
+        'message':
+            '752cff52e4b90768558e5369e75d97c69643509a5e5904e0a386cbe4d0970ef7' +
+            '3f918f675945a9aefe26daea27587e8dc909dd56fd0468805f834039b345f855' +
+            'cfe19c44b55af241fff3ffcd8045cd5c288e6c4e284c3720570b58e4d47b8fee' +
+            'edc52fd1401f698a209fccfa3b4c0d9a797b046a2759f82a54c41ccd7b5f592b',
+        'tag': '05d1243e6465ed9620c9aec1c351a186'
+      },
+      {
+        'algo': 'SHA-512',
+        'key':
+            '726374c4b8df517510db9159b730f93431e0cd468d4f3821eab0edb93abd0fba' +
+            '46ab4f1ef35d54fec3d85fa89ef72ff3d35f22cf5ab69e205c10afcdf4aaf113' +
+            '38dbb12073474fddb556e60b8ee52f91163ba314303ee0c910e64e87fbf30221' +
+            '4edbe3f2',
+        'message':
+            'ac939659dc5f668c9969c0530422e3417a462c8b665e8db25a883a625f7aa59b' +
+            '89c5ad0ece5712ca17442d1798c6dea25d82c5db260cb59c75ae650be56569c1' +
+            'bd2d612cc57e71315917f116bbfa65a0aeb8af7840ee83d3e7101c52cf652d27' +
+            '73531b7a6bdd690b846a741816c860819270522a5b0cdfa1d736c501c583d916',
+
+        'tag':
+            'bd3d2df6f9d284b421a43e5f9cb94bc4ff88a88243f1f0133bad0fb1791f6569'
+      },
+    ];
+    for (let i = 0; i < NIST_TEST_VECTORS.length; i++) {
+      const testVector = NIST_TEST_VECTORS[i];
+      const key = Bytes.fromHex(testVector['key']);
+      const message = Bytes.fromHex(testVector['message']);
+      const tag = Bytes.fromHex(testVector['tag']);
+      const hmac = await Hmac.newInstance(testVector['algo'], key, tag.length);
+      assertTrue(await hmac.verifyMac(tag, message));
+    }
+  },
+});
diff --git a/javascript/subtle/ind_cpa_cipher.js b/javascript/subtle/ind_cpa_cipher.js
new file mode 100644
index 0000000..d43f971
--- /dev/null
+++ b/javascript/subtle/ind_cpa_cipher.js
@@ -0,0 +1,52 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.IndCpaCipher');
+
+const SecurityException = goog.require('tink.exception.SecurityException');
+
+/**
+ * Interface for symmetric key ciphers that are indistinguishable against
+ * chosen-plaintext attacks.
+ *
+ * Security guarantees: implementation of this interface do not provide
+ * authentication, thus should not be used directly, but only to construct safer
+ * primitives such as {@link tink.Aead}.
+ *
+ * @protected
+ * @record
+ */
+class IndCpaCipher {
+  /**
+   * Encrypts `plaintext`.
+   *
+   * @param {!Uint8Array} plaintext the plaintext to be encrypted. It must be
+   *     non-null, but can also be an empty (zero-length) byte array.
+   * @return {!Promise.<!Uint8Array>} resulting ciphertext
+   * @throws {SecurityException}
+   */
+  encrypt(plaintext) {}
+
+  /**
+   * Decrypts ciphertext with associated authenticated data.
+   *
+   * @param {!Uint8Array} ciphertext the ciphertext to be decrypted, must be
+   *     non-null.
+   * @return {!Promise.<!Uint8Array>} resulting plaintext
+   * @throws {SecurityException}
+   */
+  decrypt(ciphertext) {}
+}
+
+exports = IndCpaCipher;
diff --git a/javascript/subtle/purejs/BUILD.bazel b/javascript/subtle/purejs/BUILD.bazel
new file mode 100644
index 0000000..38cd9d3
--- /dev/null
+++ b/javascript/subtle/purejs/BUILD.bazel
@@ -0,0 +1,40 @@
+package(
+    default_visibility = ["//tools/build_defs:internal_pkg"],
+)
+
+licenses(["notice"])
+
+load("@io_bazel_rules_closure//closure:defs.bzl", "closure_js_library", "closure_js_test")
+
+closure_js_library(
+    name = "aead",
+    srcs = [
+        "aes_ctr.js",
+    ],
+    deps = [
+        "//javascript:primitives",
+        "//javascript/exception",
+        "//javascript/subtle",
+        "@io_bazel_rules_closure//closure/library",
+        "@io_bazel_rules_closure//closure/library/crypt:aes",
+        "@io_bazel_rules_closure//closure/library/crypt:ctr",
+    ],
+)
+
+closure_js_library(
+    name = "mac",
+    srcs = [
+        "hmac.js",
+    ],
+    deps = [
+        "//javascript:primitives",
+        "//javascript/exception",
+        "//javascript/subtle",
+        "@io_bazel_rules_closure//closure/library",
+        "@io_bazel_rules_closure//closure/library/array",
+        "@io_bazel_rules_closure//closure/library/crypt:hmac",
+        "@io_bazel_rules_closure//closure/library/crypt:sha1",
+        "@io_bazel_rules_closure//closure/library/crypt:sha256",
+        "@io_bazel_rules_closure//closure/library/crypt:sha512",
+    ],
+)
diff --git a/javascript/subtle/purejs/aes_ctr.js b/javascript/subtle/purejs/aes_ctr.js
new file mode 100644
index 0000000..bcc4911
--- /dev/null
+++ b/javascript/subtle/purejs/aes_ctr.js
@@ -0,0 +1,79 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.purejs.AesCtr');
+
+const Aes = goog.require('goog.crypt.Aes');
+const Bytes = goog.require('tink.subtle.Bytes');
+const Ctr = goog.require('goog.crypt.Ctr');
+const IndCpaCipher = goog.require('tink.subtle.IndCpaCipher');
+const Random = goog.require('tink.subtle.Random');
+const SecurityException = goog.require('tink.exception.SecurityException');
+const Validators = goog.require('tink.subtle.Validators');
+
+/**
+ * AES block size.
+ *
+ * @const {number}
+ */
+const AES_BLOCK_SIZE_IN_BYTES = 16;
+
+/**
+ * Implementation of AES-CTR.
+ *
+ * @implements {IndCpaCipher}
+ * @protected
+ * @final
+ */
+class AesCtr {
+  /**
+   * @param {!Uint8Array} key
+   * @param {number} ivSize the size of the IV
+   */
+  constructor(key, ivSize) {
+    /** @const @private {number} */
+    this.ivSize_ = ivSize;
+
+    /** @const @private {Ctr} */
+    this.ctr_ = new Ctr(new Aes(Array.from(key)));
+  }
+
+  /**
+   * @override
+   */
+  async encrypt(plaintext) {
+    Validators.requireUint8Array(plaintext);
+    const iv = Random.randBytes(this.ivSize_);
+    const counter = new Uint8Array(AES_BLOCK_SIZE_IN_BYTES);
+    counter.set(iv);
+    return Bytes.concat(
+        iv, new Uint8Array(this.ctr_.encrypt(plaintext, counter)));
+  }
+
+  /**
+   * @override
+   */
+  async decrypt(ciphertext) {
+    Validators.requireUint8Array(ciphertext);
+    if (ciphertext.length < this.ivSize_) {
+      throw new SecurityException('ciphertext too short');
+    }
+    const counter = new Uint8Array(AES_BLOCK_SIZE_IN_BYTES);
+    counter.set(ciphertext.subarray(0, this.ivSize_));
+    return new Uint8Array(
+        this.ctr_.decrypt(ciphertext.subarray(this.ivSize_), counter));
+  }
+}
+
+exports = AesCtr;
diff --git a/javascript/subtle/purejs/hmac.js b/javascript/subtle/purejs/hmac.js
new file mode 100644
index 0000000..38dce94
--- /dev/null
+++ b/javascript/subtle/purejs/hmac.js
@@ -0,0 +1,82 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.purejs.Hmac');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const GoogHmac = goog.require('goog.crypt.Hmac');
+const InvalidArgumentsException = goog.require('tink.exception.InvalidArgumentsException');
+const Mac = goog.require('tink.Mac');
+const Sha1 = goog.require('goog.crypt.Sha1');
+const Sha256 = goog.require('goog.crypt.Sha256');
+const Sha512 = goog.require('goog.crypt.Sha512');
+const Validators = goog.require('tink.subtle.Validators');
+
+/**
+ * Implementation of HMAC.
+ *
+ * @implements {Mac}
+ * @public
+ * @final
+ */
+class Hmac {
+  /**
+   * @param {string} hash name of the hash function, accepted names are SHA-1,
+   *     SHA-256 and SHA-512
+   * @param {!Uint8Array} key
+   * @param {number} tagSize the size of the tag
+   */
+  constructor(hash, key, tagSize) {
+    /** @const @private {number} */
+    this.tagSize_ = tagSize;
+
+    /** @private {GoogHmac} */
+    this.hmac_;
+
+    switch (hash) {
+      case 'SHA-1':
+        this.hmac_ = new GoogHmac(new Sha1(), Array.from(key));
+        break;
+      case 'SHA-256':
+        this.hmac_ = new GoogHmac(new Sha256(), Array.from(key));
+        break;
+      case 'SHA-512':
+        this.hmac_ = new GoogHmac(new Sha512(), Array.from(key));
+        break;
+      default:
+        throw new InvalidArgumentsException(hash + ' is not supported');
+    }
+  }
+
+  /**
+   * @override
+   */
+  async computeMac(data) {
+    Validators.requireUint8Array(data);
+    const tag = this.hmac_.getHmac(data);
+    return new Uint8Array(tag.slice(0, this.tagSize_));
+  }
+
+  /**
+   * @override
+   */
+  async verifyMac(tag, data) {
+    Validators.requireUint8Array(tag);
+    Validators.requireUint8Array(data);
+    const computedTag = await this.computeMac(data);
+    return Bytes.isEqual(tag, computedTag);
+  }
+}
+
+exports = Hmac;
diff --git a/javascript/subtle/random.js b/javascript/subtle/random.js
new file mode 100644
index 0000000..5a04f77
--- /dev/null
+++ b/javascript/subtle/random.js
@@ -0,0 +1,43 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * @fileoverview Several simple wrappers of crypto.getRandomValues.
+ * @public
+ */
+
+goog.module('tink.subtle.Random');
+
+const InvalidArgumentsException = goog.require('tink.exception.InvalidArgumentsException');
+
+/**
+ * Randomly generates `n` bytes.
+ *
+ * @param {number} n number of bytes to generate
+ * @return {!Uint8Array} the random bytes
+ * @static
+ */
+const randBytes = function(n) {
+  if (!Number.isInteger(n) || n < 0) {
+    throw new InvalidArgumentsException('n must be a nonnegative integer');
+  }
+  const result = new Uint8Array(n);
+  if (n) {  // Edge can't handle an empty array
+    const crypto = goog.global['crypto'] || goog.global['msCrypto'];
+    crypto.getRandomValues(result);
+  }
+  return result;
+};
+
+exports = {randBytes};
diff --git a/javascript/subtle/validators.js b/javascript/subtle/validators.js
new file mode 100644
index 0000000..f4cc179
--- /dev/null
+++ b/javascript/subtle/validators.js
@@ -0,0 +1,107 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.subtle.Validators');
+
+const InvalidArgumentsException = goog.require('tink.exception.InvalidArgumentsException');
+const SecurityException = goog.require('tink.exception.SecurityException');
+
+/**
+ * @const @public {!Array.<number>}
+ */
+const SUPPORTED_AES_KEY_SIZES = [16, 32];
+
+/**
+ * Validates AES key sizes, at the moment only 128-bit and 256-bit keys are
+ * supported.
+ *
+ * @param {number} n the key size in bytes
+ * @throws {!InvalidArgumentsException}
+ * @static
+ */
+const validateAesKeySize = function(n) {
+  if (!SUPPORTED_AES_KEY_SIZES.includes(n)) {
+    throw new InvalidArgumentsException('unsupported AES key size: ' + n);
+  }
+};
+
+/**
+ * Validates that the input is a non null Uint8Array.
+ *
+ * @param {!Uint8Array} input
+ * @throws {!InvalidArgumentsException}
+ * @static
+ */
+const requireUint8Array = function(input) {
+  if (input == null || !(input instanceof Uint8Array)) {
+    throw new InvalidArgumentsException('input must be a non null Uint8Array');
+  }
+};
+
+/**
+ * Validates version, throws exception if candidate version is negative or
+ * bigger than expected.
+ *
+ * @param {number} candidate - version to be validated
+ * @param {number} maxVersion - upper bound on version
+ * @throws {!SecurityException}
+ * @static
+ */
+const validateVersion = function(candidate, maxVersion) {
+  if (candidate < 0 || candidate > maxVersion) {
+    throw new SecurityException(
+        'Version is out of bound, must be ' +
+        'between 0 and ' + maxVersion + '.');
+  }
+};
+
+/**
+ * Validates ECDSA parameters.
+ *
+ * @param {string} curve
+ * @param {string} hash
+ * @throws {!SecurityException}
+ */
+const validateEcdsaParams = function(curve, hash) {
+  switch (curve) {
+    case 'P-256':
+      if (hash != 'SHA-256') {
+        throw new SecurityException(
+            'expected SHA-256 (because curve is P-256) but got ' + hash);
+      }
+      break;
+    case 'P-384':
+      if (hash != 'SHA-384' && hash != 'SHA-512') {
+        throw new SecurityException(
+            'expected SHA-384 or SHA-512 (because curve is P-384) but got ' +
+            hash);
+      }
+      break;
+    case 'P-521':
+      if (hash != 'SHA-512') {
+        throw new SecurityException(
+            'expected SHA-512 (because curve is P-521) but got ' + hash);
+      }
+      break;
+    default:
+      throw new SecurityException('unsupported curve: ' + curve);
+  }
+};
+
+exports = {
+  validateAesKeySize,
+  validateEcdsaParams,
+  requireUint8Array,
+  validateVersion
+};
diff --git a/javascript/test_utils.js b/javascript/test_utils.js
new file mode 100644
index 0000000..5d475cc
--- /dev/null
+++ b/javascript/test_utils.js
@@ -0,0 +1,84 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.testUtils');
+goog.setTestOnly();
+
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const PbKeyStatusType = goog.require('proto.google.crypto.tink.KeyStatusType');
+const PbKeyset = goog.require('proto.google.crypto.tink.Keyset');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+
+/**
+ * Creates a key for testing purposes. Generates a new key with id, output
+ * prefix type and status given by optional arguments. The default values are
+ * the following: id = 0x12345678, output prefix type = TINK, and status =
+ * ENABLED.
+ *
+ * @param {number=} keyId
+ * @param {boolean=} legacy
+ * @param {boolean=} enabled
+ *
+ * @return{!PbKeyset.Key}
+ */
+const createKey = function(keyId = 0x12345678, legacy = false, enabled = true) {
+  const key = new PbKeyset.Key();
+
+  if (enabled) {
+    key.setStatus(PbKeyStatusType.ENABLED);
+  } else {
+    key.setStatus(PbKeyStatusType.DISABLED);
+  }
+
+  if (legacy) {
+    key.setOutputPrefixType(PbOutputPrefixType.LEGACY);
+  } else {
+    key.setOutputPrefixType(PbOutputPrefixType.TINK);
+  }
+
+  key.setKeyId(keyId);
+
+  const keyData = new PbKeyData()
+                      .setTypeUrl('someTypeUrl')
+                      .setValue(new Uint8Array(10))
+                      .setKeyMaterialType(PbKeyData.KeyMaterialType.SYMMETRIC);
+  key.setKeyData(keyData);
+
+  return key;
+};
+
+/**
+ * Returns a valid PbKeyset whose primary key has id equal to 1.
+ *
+ * @param {number=} keysetSize
+ *
+ * @return {!PbKeyset}
+ */
+const createKeyset = function(keysetSize = 20) {
+  const keyset = new PbKeyset();
+  for (let i = 0; i < keysetSize; i++) {
+    const key = createKey(
+        i + 1, /* legacy = */ (i % 2) < 1,
+        /* enabled = */ (i % 4) < 2);
+    keyset.addKey(key);
+  }
+
+  keyset.setPrimaryKeyId(1);
+  return keyset;
+};
+
+exports = {
+  createKey,
+  createKeyset,
+};
diff --git a/javascript/util.js b/javascript/util.js
new file mode 100644
index 0000000..c5a7a48
--- /dev/null
+++ b/javascript/util.js
@@ -0,0 +1,171 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.Util');
+
+const Bytes = goog.require('tink.subtle.Bytes');
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const PbEllipticCurveType = goog.require('proto.google.crypto.tink.EllipticCurveType');
+const PbHashType = goog.require('proto.google.crypto.tink.HashType');
+const PbKeyStatusType = goog.require('proto.google.crypto.tink.KeyStatusType');
+const PbKeyset = goog.require('proto.google.crypto.tink.Keyset');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+const PbPointFormat = goog.require('proto.google.crypto.tink.EcPointFormat');
+const SecurityException = goog.require('tink.exception.SecurityException');
+
+/**
+ * Validates the given key and throws SecurityException if it is invalid.
+ *
+ * @param {!PbKeyset.Key} key
+ */
+const validateKey = function(key) {
+  if (!key) {
+    throw new SecurityException('Key should be non null.');
+  }
+  if (!key.getKeyData()) {
+    throw new SecurityException('Key data are missing for key '
+        + key.getKeyId() + '.');
+  }
+  if (key.getOutputPrefixType() === PbOutputPrefixType.UNKNOWN_PREFIX) {
+    throw new SecurityException('Key ' + key.getKeyId() +
+        ' has unknown output prefix type.');
+  }
+  if (key.getStatus() === PbKeyStatusType.UNKNOWN_STATUS) {
+    throw new SecurityException('Key ' + key.getKeyId() +
+        ' has unknown status.');
+  }
+};
+
+/**
+ * Validates the given keyset and throws SecurityException if it is invalid.
+ *
+ * @param {!PbKeyset} keyset
+ */
+const validateKeyset = function(keyset) {
+  if (!keyset || !keyset.getKeyList() || keyset.getKeyList().length < 1) {
+    throw new SecurityException(
+        'Keyset should be non null and must contain at least one key.');
+  }
+
+  let hasPrimary = false;
+  const numberOfKeys = keyset.getKeyList().length;
+  for (let i = 0; i < numberOfKeys; i++) {
+    const key = keyset.getKeyList()[i];
+    validateKey(key);
+    if (keyset.getPrimaryKeyId() === key.getKeyId() &&
+        key.getStatus() === PbKeyStatusType.ENABLED) {
+      if (hasPrimary) {
+        throw new SecurityException('Primary key has to be unique.');
+      }
+      hasPrimary = true;
+    }
+  }
+
+  if (!hasPrimary) {
+    throw new SecurityException('Primary key has to be in the keyset and ' +
+        'has to be enabled.');
+  }
+};
+
+// Functions which are useful for implementation of
+// private and public EC keys.
+
+/**
+ * Either prolong or shrinks the array representing number in BigEndian encoding
+ * to have the specified size. As webcrypto API assumes that x, y and d values
+ * has exactly the supposed number of bytes, whereas corresponding x, y and
+ * keyValue values in proto might either have some leading zeros or the leading
+ * zeros might be missing.
+ *
+ * @param {!Uint8Array} bigEndianNumber
+ * @param {number} sizeInBytes
+ * @return {!Uint8Array}
+ */
+const bigEndianNumberToCorrectLength = function(bigEndianNumber, sizeInBytes) {
+  const numberLen = bigEndianNumber.length;
+  if (numberLen < sizeInBytes) {
+    const zeros = new Uint8Array(sizeInBytes - numberLen);
+    return Bytes.concat(zeros, bigEndianNumber);
+  }
+  if (numberLen > sizeInBytes) {
+    for (let i = 0; i < numberLen - sizeInBytes; i++) {
+      if (bigEndianNumber[i] != 0) {
+        throw new SecurityException(
+            'Number needs more bytes to be represented.');
+      }
+    }
+    return bigEndianNumber.slice(numberLen - sizeInBytes, numberLen);
+  }
+  return bigEndianNumber;
+};
+
+/**
+ * @param {!PbEllipticCurveType} curveTypeProto
+ * @return {!EllipticCurves.CurveType}
+ */
+const curveTypeProtoToSubtle = function(curveTypeProto) {
+  switch (curveTypeProto) {
+    case PbEllipticCurveType.NIST_P256:
+      return EllipticCurves.CurveType.P256;
+    case PbEllipticCurveType.NIST_P384:
+      return EllipticCurves.CurveType.P384;
+    case PbEllipticCurveType.NIST_P521:
+      return EllipticCurves.CurveType.P521;
+    default:
+      throw new SecurityException('Unknown curve type.');
+  }
+};
+
+/**
+ * @param {!PbHashType} hashTypeProto
+ * @return {string}
+ */
+const hashTypeProtoToString = function(hashTypeProto) {
+  switch (hashTypeProto) {
+    case PbHashType.SHA1:
+      return 'SHA-1';
+    case PbHashType.SHA256:
+      return 'SHA-256';
+    case PbHashType.SHA512:
+      return 'SHA-512';
+    default:
+      throw new SecurityException('Unknown hash type.');
+  }
+};
+
+/**
+ * @param {!PbPointFormat} pointFormatProto
+ * @return {!EllipticCurves.PointFormatType}
+ */
+const pointFormatProtoToSubtle = function(pointFormatProto) {
+  switch (pointFormatProto) {
+    case PbPointFormat.UNCOMPRESSED:
+      return EllipticCurves.PointFormatType.UNCOMPRESSED;
+    case PbPointFormat.COMPRESSED:
+      return EllipticCurves.PointFormatType.COMPRESSED;
+    case PbPointFormat.DO_NOT_USE_CRUNCHY_UNCOMPRESSED:
+      return EllipticCurves.PointFormatType.DO_NOT_USE_CRUNCHY_UNCOMPRESSED;
+    default:
+      throw new SecurityException('Unknown point format.');
+  }
+};
+
+exports = {
+  bigEndianNumberToCorrectLength,
+  curveTypeProtoToSubtle,
+  hashTypeProtoToString,
+  pointFormatProtoToSubtle,
+  validateKey,
+  validateKeyset,
+};
diff --git a/javascript/util_test.js b/javascript/util_test.js
new file mode 100644
index 0000000..9f1a88f
--- /dev/null
+++ b/javascript/util_test.js
@@ -0,0 +1,282 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+goog.module('tink.UtilTest');
+goog.setTestOnly('tink.UtilTest');
+
+const EllipticCurves = goog.require('tink.subtle.EllipticCurves');
+const PbEllipticCurveType = goog.require('proto.google.crypto.tink.EllipticCurveType');
+const PbHashType = goog.require('proto.google.crypto.tink.HashType');
+const PbKeyData = goog.require('proto.google.crypto.tink.KeyData');
+const PbKeyStatusType = goog.require('proto.google.crypto.tink.KeyStatusType');
+const PbKeyset = goog.require('proto.google.crypto.tink.Keyset');
+const PbOutputPrefixType = goog.require('proto.google.crypto.tink.OutputPrefixType');
+const PbPointFormat = goog.require('proto.google.crypto.tink.EcPointFormat');
+const Util = goog.require('tink.Util');
+
+const testSuite = goog.require('goog.testing.testSuite');
+
+////////////////////////////////////////////////////////////////////////////////
+// tests
+////////////////////////////////////////////////////////////////////////////////
+
+testSuite({
+  // tests for validateKey method
+  async testValidateKeyMissingKeyData() {
+    const key = createKey().setKeyData(null);
+
+    try {
+      await Util.validateKey(key);
+    } catch (e) {
+      assertEquals(
+          ExceptionText.InvalidKeyMissingKeyData(key.getKeyId()), e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testValidateKeyUnknownPrefix() {
+    const key =
+        createKey().setOutputPrefixType(PbOutputPrefixType.UNKNOWN_PREFIX);
+
+    try {
+      await Util.validateKey(key);
+    } catch (e) {
+      assertEquals(
+          ExceptionText.InvalidKeyUnknownPrefix(key.getKeyId()), e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testValidateKeyUnknownStatus() {
+    const key = createKey().setStatus(PbKeyStatusType.UNKNOWN_STATUS);
+
+    try {
+      await Util.validateKey(key);
+    } catch (e) {
+      assertEquals(
+          ExceptionText.InvalidKeyUnknownStatus(key.getKeyId()), e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testValidateKeyValidKeys() {
+    await Util.validateKey(createKey());
+    await Util.validateKey(
+        createKey(/* opt_keyId = */ 0xAABBCCDD, /* opt_enabled = */ true));
+    await Util.validateKey(
+        createKey(/* opt_keyId = */ 0xABCDABCD, /* opt_enabled = */ false));
+  },
+
+  // tests for validateKeyset method
+  async testValidateKeysetWithoutKeys() {
+    const keyset = new PbKeyset();
+
+    try {
+      await Util.validateKeyset(keyset);
+    } catch (e) {
+      assertEquals(ExceptionText.InvalidKeysetMissingKeys(), e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testValidateKeysetDisabledPrimary() {
+    const keyset = createKeyset();
+    keyset.addKey(
+        createKey(/* opt_id = */ 0xFFFFFFFF, /* opt_enabled = */ false));
+    keyset.setPrimaryKeyId(0xFFFFFFFF);
+
+    try {
+      await Util.validateKeyset(keyset);
+    } catch (e) {
+      assertEquals(ExceptionText.InvalidKeysetDisabledPrimary(), e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testValidateKeysetMultiplePrimaries() {
+    const keyset = createKeyset();
+    const key =
+        createKey(/* opt_id = */ 0xFFFFFFFF, /* opt_enabled = */ true);
+    keyset.addKey(key);
+    keyset.addKey(key);
+    keyset.setPrimaryKeyId(0xFFFFFFFF);
+
+    try {
+      await Util.validateKeyset(keyset);
+    } catch (e) {
+      assertEquals(
+          ExceptionText.InvalidKeysetMultiplePrimaries(), e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testValidateKeysetWithInvalidKey() {
+    const keyset = createKeyset();
+    const key =
+        createKey(4294967295, true).setStatus(PbKeyStatusType.UNKNOWN_STATUS);
+    keyset.addKey(key);
+
+    try {
+      await Util.validateKeyset(keyset);
+    } catch (e) {
+      assertEquals(
+          ExceptionText.InvalidKeyUnknownStatus(key.getKeyId()), e.toString());
+      return;
+    }
+    fail('An exception should be thrown.');
+  },
+
+  async testValidateKeysetWithValidKeyset() {
+    const keyset = createKeyset();
+
+    await Util.validateKeyset(keyset);
+  },
+
+  // tests for protoToSubtle methods
+  testCurveTypeProtoToSubtle() {
+    assertEquals(
+        EllipticCurves.CurveType.P256,
+        Util.curveTypeProtoToSubtle(PbEllipticCurveType.NIST_P256));
+    assertEquals(
+        EllipticCurves.CurveType.P384,
+        Util.curveTypeProtoToSubtle(PbEllipticCurveType.NIST_P384));
+    assertEquals(
+        EllipticCurves.CurveType.P521,
+        Util.curveTypeProtoToSubtle(PbEllipticCurveType.NIST_P521));
+  },
+
+  testPointFormatProtoToSubtle() {
+    assertEquals(
+        EllipticCurves.PointFormatType.UNCOMPRESSED,
+        Util.pointFormatProtoToSubtle(PbPointFormat.UNCOMPRESSED));
+    assertEquals(
+        EllipticCurves.PointFormatType.COMPRESSED,
+        Util.pointFormatProtoToSubtle(PbPointFormat.COMPRESSED));
+    assertEquals(
+        EllipticCurves.PointFormatType.DO_NOT_USE_CRUNCHY_UNCOMPRESSED,
+        Util.pointFormatProtoToSubtle(
+            PbPointFormat.DO_NOT_USE_CRUNCHY_UNCOMPRESSED));
+  },
+
+  testHashTypeProtoToString() {
+    assertEquals('SHA-1', Util.hashTypeProtoToString(PbHashType.SHA1));
+    assertEquals('SHA-256', Util.hashTypeProtoToString(PbHashType.SHA256));
+    assertEquals('SHA-512', Util.hashTypeProtoToString(PbHashType.SHA512));
+  },
+});
+
+
+/**
+ * Class which holds texts for each type of exception.
+ * @final
+ */
+class ExceptionText {
+  // Exceptions for invalid keys.
+  /**
+   * @param {number} keyId
+   *
+   * @return {string}
+   */
+  static InvalidKeyMissingKeyData(keyId) {
+    return 'CustomError: Key data are missing for key ' + keyId + '.';
+  }
+  /**
+   * @param {number} keyId
+   *
+   * @return {string}
+   */
+  static InvalidKeyUnknownPrefix(keyId) {
+    return 'CustomError: Key ' + keyId + ' has unknown output prefix type.';
+  }
+  /**
+   * @param {number} keyId
+   *
+   * @return {string}
+   */
+  static InvalidKeyUnknownStatus(keyId) {
+    return 'CustomError: Key ' + keyId + ' has unknown status.';
+  }
+
+  // Exceptions for invalid keysets.
+  /** @return {string} */
+  static InvalidKeysetMissingKeys() {
+    return 'CustomError: Keyset should be non null and ' +
+        'must contain at least one key.';
+  }
+  /** @return {string} */
+  static InvalidKeysetDisabledPrimary() {
+    return 'CustomError: Primary key has to be in the keyset and ' +
+        'has to be enabled.';
+  }
+  /** @return {string} */
+  static InvalidKeysetMultiplePrimaries() {
+    return 'CustomError: Primary key has to be unique.';
+  }
+}
+
+/**
+ * Returns a valid PbKeyset.Key.
+ *
+ * @param {number=} opt_id
+ * @param {boolean=} opt_enabled
+ * @param {boolean=} opt_publicKey
+ *
+ * @return {!PbKeyset.Key}
+ */
+const createKey = function(
+    opt_id = 0x12345678, opt_enabled = true, opt_publicKey = false) {
+  const keyData =
+      new PbKeyData().setTypeUrl('someTypeUrl').setValue(new Uint8Array(10));
+  if (opt_publicKey) {
+    keyData.setKeyMaterialType(PbKeyData.KeyMaterialType.ASYMMETRIC_PUBLIC);
+  } else {
+    keyData.setKeyMaterialType(PbKeyData.KeyMaterialType.SYMMETRIC);
+  }
+
+  const key = new PbKeyset.Key().setKeyData(keyData);
+  if (opt_enabled) {
+    key.setStatus(PbKeyStatusType.ENABLED);
+  } else {
+    key.setStatus(PbKeyStatusType.DISABLED);
+  }
+  key.setKeyId(opt_id);
+  key.setOutputPrefixType(PbOutputPrefixType.TINK);
+
+  return key;
+};
+
+/**
+ * Returns a valid PbKeyset which primary has id equal to 1.
+ *
+ * @return {!PbKeyset}
+ */
+const createKeyset = function() {
+  const numberOfKeys = 20;
+
+  const keyset = new PbKeyset();
+  for (let i = 0; i < numberOfKeys; i++) {
+    // Key id is never set to 0 as primaryKeyId = 0 if it is unset.
+    const key = createKey(i + 1, /* opt_enabled = */ (i % 2) < 1, (i % 4) < 2);
+    keyset.addKey(key);
+  }
+
+  keyset.setPrimaryKeyId(1);
+  return keyset;
+};
diff --git a/kokoro/presubmit.sh b/kokoro/presubmit.sh
index 7a017c1..6f6135b 100755
--- a/kokoro/presubmit.sh
+++ b/kokoro/presubmit.sh
@@ -24,4 +24,7 @@
 # Change to repo root
 cd git*/tink
 
+# Test that Tink can be installed with the standard Go tooling.
+go get github.com/google/tink/go/...
+
 ./kokoro/run_tests.sh
diff --git a/kokoro/remote.sh b/kokoro/remote.sh
new file mode 100755
index 0000000..afbe4e5
--- /dev/null
+++ b/kokoro/remote.sh
@@ -0,0 +1,93 @@
+#!/bin/bash
+#
+# Copyright 2017 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+####################################################################################
+
+# Fail on any error.
+set -e
+
+# Display commands to stderr.
+set -x
+
+# Change to repo root
+cd git*/tink
+
+# Only in Kokoro environments.
+if [[ -n "${KOKORO_ROOT}" ]]; then
+  # TODO(b/73748835): Workaround on Kokoro.
+  rm -f ~/.bazelrc
+
+  use_bazel.sh latest || exit 1
+fi
+
+echo "Using bazel binary: $(which bazel)"
+bazel version
+
+# Create an invocation ID for the bazel, and write it as an artifact.
+# Kokoro will use that later to post the bazel invocation details.
+INVOCATION_ID=$(uuidgen)
+echo "Invocation ID = ${INVOCATION_ID}"
+ID_OUT="${KOKORO_ARTIFACTS_DIR}/bazel_invocation_ids"
+echo "${INVOCATION_ID}" >> "${ID_OUT}"
+
+# Setup all the RBE args needed by bazel.
+# The kokoro env variables are set in tink/kokoro/presubmit-remote.cfg.
+declare -a RBE_ARGS
+RBE_ARGS=(
+  --invocation_id="${INVOCATION_ID}"
+  --auth_enabled=true
+  --auth_credentials="${KOKORO_BAZEL_AUTH_CREDENTIAL}"
+  --auth_scope=https://www.googleapis.com/auth/cloud-source-tools
+  --bes_backend="${KOKORO_BES_BACKEND_ADDRESS}"
+  --bes_timeout=600s
+  --project_id="${KOKORO_BES_PROJECT_ID}"
+  --remote_cache="${KOKORO_FOUNDRY_BACKEND_ADDRESS}"
+  --remote_executor="${KOKORO_FOUNDRY_BACKEND_ADDRESS}"
+  --test_env=USER=anon
+  --remote_instance_name="${KOKORO_FOUNDRY_PROJECT_ID}/instances/default_instance"
+)
+readonly RBE_ARGS
+
+# TODO(b/141297103): reenable python
+# Build all targets, except objc, python, and proto.
+time bazel \
+  --bazelrc="tools/remote_build_execution/bazel-rbe.bazelrc" \
+  build "${RBE_ARGS[@]}" \
+  --config=remote \
+  --build_tag_filters=-no_rbe \
+  --incompatible_disable_deprecated_attr_params=false \
+  --incompatible_depset_is_not_iterable=false \
+  -- \
+  //... \
+  -//objc/... \
+  -//proto/... \
+  -//python/...
+
+# TODO(b/141297103): reenable python
+# Run all the tests except objc and python.
+time bazel \
+  --bazelrc="tools/remote_build_execution/bazel-rbe.bazelrc" \
+  test "${RBE_ARGS[@]}" \
+  --config=remote \
+  --test_output=errors \
+  --test_tag_filters=-no_rbe \
+  --jvmopt=-Drbe=1 \
+  --incompatible_disable_deprecated_attr_params=false \
+  --incompatible_depset_is_not_iterable=false \
+  -- \
+  //... \
+  -//objc/... \
+  -//proto/... \
+  -//python/...
diff --git a/kokoro/run_tests.sh b/kokoro/run_tests.sh
index 6517072..f5ce849 100755
--- a/kokoro/run_tests.sh
+++ b/kokoro/run_tests.sh
@@ -21,6 +21,22 @@
 # Display commands to stderr.
 set -x
 
+readonly PLATFORM="$(uname | tr '[:upper:]' '[:lower:]')"
+
+# Only in Kokoro environments.
+if [[ -n "${KOKORO_ROOT}" ]]; then
+  # TODO(b/73748835): Workaround on Kokoro.
+  rm -f ~/.bazelrc
+
+  # TODO(b/131821833) Use the latest version of Bazel.
+  use_bazel.sh 0.26.1
+
+  if [[ "${PLATFORM}" == 'darwin' ]]; then
+    export DEVELOPER_DIR="/Applications/Xcode_${XCODE_VERSION}.app/Contents/Developer"
+    export ANDROID_HOME="/Users/kbuilder/Library/Android/sdk"
+  fi
+fi
+
 # Verify required environment variables.
 
 # Required for building Java binaries.
@@ -34,8 +50,6 @@
   exit 4
 fi
 
-PLATFORM=`uname | tr '[:upper:]' '[:lower:]'`
-
 declare -a DISABLE_SANDBOX_ARGS
 DISABLE_SANDBOX_ARGS=(
   --strategy=GenRule=standalone
@@ -48,15 +62,16 @@
 )
 readonly DISABLE_SANDBOX_ARGS
 
-# Workaround b/73748835#comment5 on Kokoro.
-if ! [ -z "${KOKORO_ROOT}" ]; then
-  rm -f ~/.bazelrc
-  # Install the latest version of Bazel.
-  use_bazel.sh latest
-  if [[ "$PLATFORM" == 'darwin' ]]; then
-    export DEVELOPER_DIR="/Applications/Xcode_${XCODE_VERSION}.app/Contents/Developer"
-    export ANDROID_HOME="/Users/kbuilder/Library/Android/sdk"
-  fi
+# TODO(b/140615798)
+DISABLE_GRPC_ON_MAC_OS=""
+if [[ "${PLATFORM}" == 'darwin' ]]; then
+  DISABLE_GRPC_ON_MAC_OS="-//cc/integration/gcpkms/..."
+fi
+
+# TODO(b/141297103)
+DISABLE_PYTHON_ON_MAC_OS=""
+if [[ "${PLATFORM}" == 'darwin' ]]; then
+  DISABLE_PYTHON_ON_MAC_OS="-//python/..."
 fi
 
 echo "using bazel binary: $(which bazel)"
@@ -74,19 +89,23 @@
   # Build all targets, except objc.
   time bazel build "${DISABLE_SANDBOX_ARGS[@]}" \
   -- //... \
+  ${DISABLE_GRPC_ON_MAC_OS} \
+  ${DISABLE_PYTHON_ON_MAC_OS} \
   -//objc/... || ( ls -l ; df -h / ; exit 1 )
 
   # Run all tests, except manual and objc tests.
   time bazel test \
   --strategy=TestRunner=standalone --test_output=all \
   -- //... \
+  ${DISABLE_GRPC_ON_MAC_OS} \
+  ${DISABLE_PYTHON_ON_MAC_OS} \
   -//objc/... || ( ls -l ; df -h / ; exit 1 )
 }
 
 run_macos_tests() {
   # Default values for iOS SDK and Xcode. Can be overriden by another script.
-  : "${IOS_SDK_VERSION:=11.2}"
-  : "${XCODE_VERSION:=9.2}"
+  : "${IOS_SDK_VERSION:=12.2}"
+  : "${XCODE_VERSION:=10.2}"
 
   time bazel fetch ...
 
@@ -122,4 +141,3 @@
 if [[ "${PLATFORM}" == 'darwin' ]]; then
   run_macos_tests
 fi
-
diff --git a/kokoro/run_tests_cmake_continuous.sh b/kokoro/run_tests_cmake_continuous.sh
new file mode 100644
index 0000000..8585256
--- /dev/null
+++ b/kokoro/run_tests_cmake_continuous.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+################################################################################
+
+set -e
+
+cd git*/tink
+
+echo "========================================================= Running cmake"
+cmake --version
+cmake . -DTINK_BUILD_TESTS=ON
+echo "==================================================== Building with make"
+make -j8 all
+echo "===================================================== Testing with make"
+CTEST_OUTPUT_ON_FAILURE=1 make test
+echo "================================================ Done testing with make"
+
+export TINK_SRC_DIR=$(pwd)
+export TEST_TMPDIR=$(mktemp -d)
+export TEST_SRCDIR=$(cd ..; pwd)
+cd examples/helloworld/cc
+./cmake_build_test.sh
diff --git a/kokoro/run_tests_cmake_presubmit.sh b/kokoro/run_tests_cmake_presubmit.sh
new file mode 100644
index 0000000..27e0a1d
--- /dev/null
+++ b/kokoro/run_tests_cmake_presubmit.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+################################################################################
+
+set -e
+
+cd git*/tink
+
+echo "========================================================= Running cmake"
+cmake --version
+cmake . -DTINK_BUILD_TESTS=ON
+echo "==================================================== Building with make"
+make -j8 all
+echo "===================================================== Testing with make"
+CTEST_OUTPUT_ON_FAILURE=1 make test
+echo "================================================ Done testing with make"
diff --git a/maven/README.md b/maven/README.md
index 4d6e12a..9085fdf 100644
--- a/maven/README.md
+++ b/maven/README.md
@@ -1,4 +1,17 @@
-# To publish snapshots of Tink and apps
+# Tink Java on Maven
+
+Tink Java has 4 Maven artifacts, all are in the `com.google.crypto.tink` group.
+
+-   `tink`: this is the core of Tink built for server side apps. It only depends
+    on `org.json:json` and `com.google.protobuf:protobuf-java`.
+-   `tink-android`: this is similar to `tink` but is built for Android apps. It
+    only depends on `com.google.protobuf:protobuf-lite`.
+-   `tink-awskms`: this is a plugin for the `tink` artifact that integrates Tink
+    with AWS KMS.
+-   `tink-gcpkms`: this is a plugin for the `tink` artifact that integrates Tink
+    with GCP KMS.
+
+## Publishing snapshots
 
 ```shell
 ./maven/publish-snapshot.sh
@@ -9,3 +22,38 @@
 
 Snapshots are also automatically published for every new commit to
 the master branch of https://github.com/google/tink.
+
+## Testing snapshots
+
+```shell
+./maven/test-snapshot.sh
+```
+
+New snapshots are also automatically tested for every new commit to the master
+branch of https://github.com/google/tink.
+
+## Adding a dependency
+
+This should be considered only when there is no other option, 'cause adding
+dependency makes Tink bloated and less secure. If a dependency got tampered
+with, Tink would also be affected.
+
+This process consists of 3 steps:
+
+1.  To add a dependency for an artifact, you add it to the artifact's `pom.xml`.
+    For example, the `com.google.crypto.tink:tink` artifact uses `tink.pom.xml`.
+    You should always depend on the latest version of the dependency on Maven
+    Central.
+
+2.  Next, you want to publish a new snapshot of the artifact with the new
+    dependency.
+
+3.  Then you want to test the new snapshot.
+
+You want to repeat these steps until there is no error.
+
+If you encounter `Dependency convergence` error, it means that the artifact has
+already, usually indirectly, depended on another version of the new dependency.
+You want to exclude that version.
+
+See the history of the POM files for examples.
diff --git a/maven/execute-deploy.sh b/maven/execute-deploy.sh
index 16619c4..0bb8c28 100755
--- a/maven/execute-deploy.sh
+++ b/maven/execute-deploy.sh
@@ -16,6 +16,9 @@
 # Fail on any error.
 set -e
 
+# Display commands to stderr.
+set -x
+
 readonly MVN_GOAL="$1"
 readonly VERSION="$2"
 shift 2
@@ -110,16 +113,30 @@
 
 deploy_library \
   tink \
-  java/maven.jar \
-  java/maven-src.jar \
-  java/maven-javadoc.jar \
+  java/tink.jar \
+  java/tink-src.jar \
+  java/tink-javadoc.jar \
   $(dirname $0)/tink.pom.xml
 
 deploy_library \
+  tink-awskms \
+  java/tink-awskms.jar \
+  java/tink-awskms-src.jar \
+  java/tink-awskms-javadoc.jar \
+  $(dirname $0)/tink-awskms.pom.xml
+
+deploy_library \
+  tink-gcpkms \
+  java/tink-gcpkms.jar \
+  java/tink-gcpkms-src.jar \
+  java/tink-gcpkms-javadoc.jar \
+  $(dirname $0)/tink-gcpkms.pom.xml
+
+deploy_library \
   tink-android \
-  java/maven-android.jar \
-  java/maven-android-src.jar \
-  java/maven-android-javadoc.jar \
+  java/tink-android.jar \
+  java/tink-android-src.jar \
+  java/tink-android-javadoc.jar \
   $(dirname $0)/tink-android.pom.xml
 
 deploy_library \
diff --git a/maven/tink-awskms.pom.xml b/maven/tink-awskms.pom.xml
new file mode 100644
index 0000000..893071f
--- /dev/null
+++ b/maven/tink-awskms.pom.xml
@@ -0,0 +1,194 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <name>Tink Cryptography API with AWS KMS</name>
+  <description>This is a plugin that integrates Tink with AWS KMS.</description>
+
+  <groupId>com.google.crypto.tink</groupId>
+  <artifactId>tink-awskms</artifactId>
+  <version>VERSION_PLACEHOLDER</version>
+  <packaging>jar</packaging>
+  <url>http://github.com/google/tink</url>
+
+  <licenses>
+    <license>
+      <name>Apache License, Version 2.0</name>
+      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
+
+  <distributionManagement>
+    <snapshotRepository>
+      <id>ossrh</id>
+      <url>https://oss.sonatype.org/content/repositories/snapshots</url>
+    </snapshotRepository>
+    <repository>
+      <id>ossrh</id>
+      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
+    </repository>
+  </distributionManagement>
+
+  <issueManagement>
+    <system>GitHub</system>
+    <url>https://github.com/google/tink/issues</url>
+  </issueManagement>
+
+  <mailingLists>
+    <mailingList>
+      <name>tink-users</name>
+      <subscribe>tink-users+subscribe@googlegroups.com</subscribe>
+      <unsubscribe>tink-users+unsubscribe@googlegroups.com</unsubscribe>
+      <post>tink-users@googlegroups.com</post>
+      <archive>https://groups.google.com/group/tink-users</archive>
+    </mailingList>
+  </mailingLists>
+
+  <developers>
+    <developer>
+      <organization>Google Inc.</organization>
+      <organizationUrl>https://www.google.com</organizationUrl>
+    </developer>
+  </developers>
+
+  <scm>
+    <connection>scm:git:git@github.com:google/tink.git</connection>
+    <developerConnection>scm:git:git@github.com:google/tink.git</developerConnection>
+    <url>https://github.com/google/tink.git</url>
+    <tag>HEAD</tag>
+  </scm>
+
+  <properties>
+    <java.version>1.7</java.version>
+
+    <aws-java-sdk-core.version>1.11.563</aws-java-sdk-core.version>
+    <aws-java-sdk-kms.version>1.11.563</aws-java-sdk-kms.version>
+    <commons-logging.version>1.2</commons-logging.version>
+    <google-auto-service.version>1.0-rc5</google-auto-service.version>
+    <google-guava.version>27.1-jre</google-guava.version>
+    <httpclient.version>4.5.8</httpclient.version>
+    <jackson.version>2.9.9</jackson.version>
+    <tink.version>VERSION_PLACEHOLDER</tink.version>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>com.amazonaws</groupId>
+      <artifactId>aws-java-sdk-core</artifactId>
+      <version>${aws-java-sdk-core.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>com.fasterxml.jackson.core</groupId>
+          <artifactId>jackson-databind</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.fasterxml.jackson.dataformat</groupId>
+          <artifactId>jackson-dataformat-cbor</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.google.guava</groupId>
+          <artifactId>guava</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.httpcomponents</groupId>
+          <artifactId>httpclient</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>commons-logging</groupId>
+          <artifactId>commons-logging</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <dependency>
+      <groupId>com.amazonaws</groupId>
+      <artifactId>aws-java-sdk-kms</artifactId>
+      <version>${aws-java-sdk-kms.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>com.fasterxml.jackson.core</groupId>
+          <artifactId>jackson-databind</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.google.guava</groupId>
+          <artifactId>guava</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-core</artifactId>
+      <version>${jackson.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+      <version>${jackson.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>com.fasterxml.jackson.core</groupId>
+          <artifactId>jackson-core</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <dependency>
+      <groupId>com.fasterxml.jackson.dataformat</groupId>
+      <artifactId>jackson-dataformat-cbor</artifactId>
+      <version>${jackson.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>com.fasterxml.jackson.core</groupId>
+          <artifactId>jackson-core</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+      <version>${google-guava.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.google.auto.service</groupId>
+      <artifactId>auto-service</artifactId>
+      <version>${google-auto-service.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>com.google.guava</groupId>
+          <artifactId>guava</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <dependency>
+      <groupId>com.google.crypto.tink</groupId>
+      <artifactId>tink</artifactId>
+      <version>${tink.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>commons-logging</groupId>
+      <artifactId>commons-logging</artifactId>
+      <version>${commons-logging.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
+      <version>${httpclient.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>commons-logging</groupId>
+          <artifactId>commons-logging</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+  </dependencies>
+</project>
diff --git a/maven/tink-gcpkms.pom.xml b/maven/tink-gcpkms.pom.xml
new file mode 100644
index 0000000..b7672c2
--- /dev/null
+++ b/maven/tink-gcpkms.pom.xml
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <name>Tink Cryptography API with Google Cloud KMS</name>
+  <description>This is a plugin that integrates Tink with Google Cloud KMS.</description>
+
+  <groupId>com.google.crypto.tink</groupId>
+  <artifactId>tink-gcpkms</artifactId>
+  <version>VERSION_PLACEHOLDER</version>
+  <packaging>jar</packaging>
+  <url>http://github.com/google/tink</url>
+
+  <licenses>
+    <license>
+      <name>Apache License, Version 2.0</name>
+      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
+
+  <distributionManagement>
+    <snapshotRepository>
+      <id>ossrh</id>
+      <url>https://oss.sonatype.org/content/repositories/snapshots</url>
+    </snapshotRepository>
+    <repository>
+      <id>ossrh</id>
+      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
+    </repository>
+  </distributionManagement>
+
+  <issueManagement>
+    <system>GitHub</system>
+    <url>https://github.com/google/tink/issues</url>
+  </issueManagement>
+
+  <mailingLists>
+    <mailingList>
+      <name>tink-users</name>
+      <subscribe>tink-users+subscribe@googlegroups.com</subscribe>
+      <unsubscribe>tink-users+unsubscribe@googlegroups.com</unsubscribe>
+      <post>tink-users@googlegroups.com</post>
+      <archive>https://groups.google.com/group/tink-users</archive>
+    </mailingList>
+  </mailingLists>
+
+  <developers>
+    <developer>
+      <organization>Google Inc.</organization>
+      <organizationUrl>https://www.google.com</organizationUrl>
+    </developer>
+  </developers>
+
+  <scm>
+    <connection>scm:git:git@github.com:google/tink.git</connection>
+    <developerConnection>scm:git:git@github.com:google/tink.git</developerConnection>
+    <url>https://github.com/google/tink.git</url>
+    <tag>HEAD</tag>
+  </scm>
+
+  <properties>
+    <java.version>1.7</java.version>
+
+    <google-api-client.version>1.29.0</google-api-client.version>
+    <google-api-services-cloudkms.version>v1-rev88-1.25.0</google-api-services-cloudkms.version>
+    <google-auto-service.version>1.0-rc5</google-auto-service.version>
+    <google-guava.version>27.1-jre</google-guava.version>
+    <httpclient.version>4.5.8</httpclient.version>
+    <jackson.version>2.9.9</jackson.version>
+    <tink.version>VERSION_PLACEHOLDER</tink.version>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-core</artifactId>
+      <version>${jackson.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+      <version>${jackson.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>com.fasterxml.jackson.core</groupId>
+          <artifactId>jackson-core</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <dependency>
+      <groupId>com.fasterxml.jackson.dataformat</groupId>
+      <artifactId>jackson-dataformat-cbor</artifactId>
+      <version>${jackson.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>com.fasterxml.jackson.core</groupId>
+          <artifactId>jackson-core</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <dependency>
+      <groupId>com.google.api-client</groupId>
+      <artifactId>google-api-client</artifactId>
+      <version>${google-api-client.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>com.fasterxml.jackson.core</groupId>
+          <artifactId>jackson-core</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.google.guava</groupId>
+          <artifactId>guava-jdk5</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.google.guava</groupId>
+          <artifactId>guava</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.httpcomponents</groupId>
+          <artifactId>httpclient</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <dependency>
+      <groupId>com.google.apis</groupId>
+      <artifactId>google-api-services-cloudkms</artifactId>
+      <version>${google-api-services-cloudkms.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>com.google.api-client</groupId>
+          <artifactId>google-api-client</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.google.guava</groupId>
+          <artifactId>guava</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+      <version>${google-guava.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.google.auto.service</groupId>
+      <artifactId>auto-service</artifactId>
+      <version>${google-auto-service.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>com.google.guava</groupId>
+          <artifactId>guava</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <dependency>
+      <groupId>com.google.crypto.tink</groupId>
+      <artifactId>tink</artifactId>
+      <version>${tink.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
+      <version>${httpclient.version}</version>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/maven/tink.pom.xml b/maven/tink.pom.xml
index c89e6af..d5dc7a7 100644
--- a/maven/tink.pom.xml
+++ b/maven/tink.pom.xml
@@ -64,110 +64,12 @@
   <properties>
     <java.version>1.7</java.version>
 
-    <aws-java-sdk-core.version>1.11.166</aws-java-sdk-core.version>
-    <aws-java-sdk-kms.version>1.11.166</aws-java-sdk-kms.version>
-    <google-api-client.version>1.22.0</google-api-client.version>
-    <google-api-services-cloudkms.version>v1-rev9-1.22.0</google-api-services-cloudkms.version>
-    <google-auto-service.version>1.0-rc4</google-auto-service.version>
-    <google-guava.version>25.0-jre</google-guava.version>
-    <json.version>20170516</json.version>
-    <protobuf.version>3.6.0</protobuf.version>
-    <protobuf-lite.version>3.0.1</protobuf-lite.version>
+    <json.version>20180813</json.version>
+    <protobuf.version>3.8.0</protobuf.version>
   </properties>
 
   <dependencies>
     <dependency>
-      <groupId>com.amazonaws</groupId>
-      <artifactId>aws-java-sdk-core</artifactId>
-      <version>${aws-java-sdk-core.version}</version>
-      <exclusions>
-        <!-- already included in com.google.api-client -->
-        <exclusion>
-          <groupId>org.apache.httpcomponents</groupId>
-          <artifactId>httpclient</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.fasterxml.jackson.core</groupId>
-          <artifactId>jackson-core</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.fasterxml.jackson.core</groupId>
-          <artifactId>jackson-databind</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-logging</groupId>
-          <artifactId>commons-logging</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.google.guava</groupId>
-          <artifactId>guava</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-
-    <dependency>
-      <groupId>com.amazonaws</groupId>
-      <artifactId>aws-java-sdk-kms</artifactId>
-      <version>${aws-java-sdk-kms.version}</version>
-      <exclusions>
-        <exclusion>
-          <groupId>com.fasterxml.jackson.core</groupId>
-          <artifactId>jackson-core</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.google.guava</groupId>
-          <artifactId>guava</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-
-    <dependency>
-      <groupId>com.google.api-client</groupId>
-      <artifactId>google-api-client</artifactId>
-      <version>${google-api-client.version}</version>
-      <exclusions>
-        <exclusion>
-          <groupId>com.google.guava</groupId>
-          <artifactId>guava-jdk5</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.google.guava</groupId>
-          <artifactId>guava</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-
-    <dependency>
-      <groupId>com.google.apis</groupId>
-      <artifactId>google-api-services-cloudkms</artifactId>
-      <version>${google-api-services-cloudkms.version}</version>
-      <exclusions>
-        <exclusion>
-          <groupId>com.google.guava</groupId>
-          <artifactId>guava</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-      <version>${google-guava.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>com.google.auto.service</groupId>
-      <artifactId>auto-service</artifactId>
-      <version>${google-auto-service.version}</version>
-      <exclusions>
-        <exclusion>
-          <groupId>com.google.guava</groupId>
-          <artifactId>guava</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-
-    <dependency>
       <groupId>com.google.protobuf</groupId>
       <artifactId>protobuf-java</artifactId>
       <version>${protobuf.version}</version>
diff --git a/objc/BUILD.bazel b/objc/BUILD.bazel
index a04432a..563476f 100644
--- a/objc/BUILD.bazel
+++ b/objc/BUILD.bazel
@@ -1,4 +1,4 @@
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
@@ -124,6 +124,7 @@
     hdrs = [
         "TINKAllConfig.h",
     ],
+    visibility = ["//visibility:public"],
     deps = [
         ":registry_config",
         "//cc/config:tink_config",
@@ -138,6 +139,7 @@
     hdrs = [
         "TINKBinaryKeysetReader.h",
     ],
+    visibility = ["//visibility:public"],
     deps = [
         ":keyset_reader",
         ":tink_cc_pb",
@@ -168,6 +170,7 @@
     hdrs = [
         "TINKConfig.h",
     ],
+    visibility = ["//visibility:public"],
     deps = [
         ":registry_config",
         "//cc:config",
@@ -181,6 +184,7 @@
     hdrs = [
         "TINKJSONKeysetReader.h",
     ],
+    visibility = ["//visibility:public"],
     deps = [
         ":keyset_reader",
         ":tink_cc_pb",
@@ -198,6 +202,7 @@
         "TINKKeyTemplate.h",
         "core/TINKKeyTemplate_Internal.h",
     ],
+    visibility = ["//visibility:public"],
     deps = [
         ":tink_cc_pb",
         "//cc/util:status",
@@ -215,6 +220,7 @@
     sdk_frameworks = [
         "Security",
     ],
+    visibility = ["//visibility:public"],
     deps = [
         ":aead",
         ":aead_internal",
@@ -223,7 +229,6 @@
         "//cc:binary_keyset_reader",
         "//cc:cleartext_keyset_handle",
         "//cc:keyset_handle",
-        "//cc/util:keyset_util",
         "//cc/util:status",
         "//objc/util:errors",
         "//objc/util:strings",
@@ -238,6 +243,7 @@
         "TINKKeysetReader.h",
         "core/TINKKeysetReader_Internal.h",
     ],
+    visibility = ["//visibility:public"],
     deps = [
         "//cc:keyset_reader",
     ],
@@ -250,6 +256,7 @@
         "TINKRegistryConfig.h",
         "core/TINKRegistryConfig_Internal.h",
     ],
+    visibility = ["//visibility:public"],
     deps = [
         ":config_cc_pb",
     ],
@@ -268,6 +275,7 @@
     name = "version",
     srcs = [":version_m"],
     hdrs = ["TINKVersion.h"],
+    visibility = ["//visibility:public"],
 )
 
 ############################
@@ -277,6 +285,7 @@
 objc_library(
     name = "aead",
     hdrs = ["TINKAead.h"],
+    visibility = ["//visibility:public"],
 )
 
 objc_library(
@@ -296,6 +305,7 @@
     name = "aead_config",
     srcs = ["aead/TINKAeadConfig.mm"],
     hdrs = ["TINKAeadConfig.h"],
+    visibility = ["//visibility:public"],
     deps = [
         ":registry_config",
         "//cc/aead:aead_config",
@@ -309,6 +319,7 @@
     name = "aead_factory",
     srcs = ["aead/TINKAeadFactory.mm"],
     hdrs = ["TINKAeadFactory.h"],
+    visibility = ["//visibility:public"],
     deps = [
         ":aead",
         ":aead_internal",
@@ -324,6 +335,7 @@
     name = "aead_key_template",
     srcs = ["aead/TINKAeadKeyTemplate.mm"],
     hdrs = ["TINKAeadKeyTemplate.h"],
+    visibility = ["//visibility:public"],
     deps = [
         ":key_template",
         ":tink_cc_pb",
@@ -340,6 +352,7 @@
 objc_library(
     name = "deterministic_aead",
     hdrs = ["TINKDeterministicAead.h"],
+    visibility = ["//visibility:public"],
 )
 
 objc_library(
@@ -360,6 +373,7 @@
     name = "deterministic_aead_config",
     srcs = ["daead/TINKDeterministicAeadConfig.mm"],
     hdrs = ["TINKDeterministicAeadConfig.h"],
+    visibility = ["//visibility:public"],
     deps = [
         ":registry_config",
         "//cc/daead:deterministic_aead_config",
@@ -373,6 +387,7 @@
     name = "deterministic_aead_factory",
     srcs = ["daead/TINKDeterministicAeadFactory.mm"],
     hdrs = ["TINKDeterministicAeadFactory.h"],
+    visibility = ["//visibility:public"],
     deps = [
         ":deterministic_aead",
         ":deterministic_aead_internal",
@@ -388,6 +403,7 @@
     name = "deterministic_aead_key_template",
     srcs = ["daead/TINKDeterministicAeadKeyTemplate.mm"],
     hdrs = ["TINKDeterministicAeadKeyTemplate.h"],
+    visibility = ["//visibility:public"],
     deps = [
         ":key_template",
         ":tink_cc_pb",
@@ -406,6 +422,7 @@
     hdrs = [
         "TINKHybridDecrypt.h",
     ],
+    visibility = ["//visibility:public"],
 )
 
 objc_library(
@@ -413,12 +430,14 @@
     hdrs = [
         "TINKHybridEncrypt.h",
     ],
+    visibility = ["//visibility:public"],
 )
 
 objc_library(
     name = "hybrid_decrypt_factory",
     srcs = ["hybrid/TINKHybridDecryptFactory.mm"],
     hdrs = ["TINKHybridDecryptFactory.h"],
+    visibility = ["//visibility:public"],
     deps = [
         ":hybrid_decrypt",
         ":hybrid_decrypt_internal",
@@ -447,6 +466,7 @@
     name = "hybrid_encrypt_factory",
     srcs = ["hybrid/TINKHybridEncryptFactory.mm"],
     hdrs = ["TINKHybridEncryptFactory.h"],
+    visibility = ["//visibility:public"],
     deps = [
         ":hybrid_encrypt",
         ":hybrid_encrypt_internal",
@@ -475,6 +495,7 @@
     name = "hybrid_config",
     srcs = ["hybrid/TINKHybridConfig.mm"],
     hdrs = ["TINKHybridConfig.h"],
+    visibility = ["//visibility:public"],
     deps = [
         ":registry_config",
         "//cc/hybrid:hybrid_config",
@@ -488,6 +509,7 @@
     name = "hybrid_key_template",
     srcs = ["hybrid/TINKHybridKeyTemplate.mm"],
     hdrs = ["TINKHybridKeyTemplate.h"],
+    visibility = ["//visibility:public"],
     deps = [
         ":key_template",
         ":tink_cc_pb",
@@ -506,12 +528,14 @@
     hdrs = [
         "TINKMac.h",
     ],
+    visibility = ["//visibility:public"],
 )
 
 objc_library(
     name = "mac_config",
     srcs = ["mac/TINKMacConfig.mm"],
     hdrs = ["TINKMacConfig.h"],
+    visibility = ["//visibility:public"],
     deps = [
         ":registry_config",
         "//cc/mac:mac_config",
@@ -525,6 +549,7 @@
     name = "mac_factory",
     srcs = ["mac/TINKMacFactory.mm"],
     hdrs = ["TINKMacFactory.h"],
+    visibility = ["//visibility:public"],
     deps = [
         ":keyset_handle",
         ":mac",
@@ -553,6 +578,7 @@
     name = "mac_key_template",
     srcs = ["mac/TINKMacKeyTemplate.mm"],
     hdrs = ["TINKMacKeyTemplate.h"],
+    visibility = ["//visibility:public"],
     deps = [
         ":key_template",
         ":tink_cc_pb",
@@ -588,6 +614,7 @@
     hdrs = [
         "TINKPublicKeySign.h",
     ],
+    visibility = ["//visibility:public"],
 )
 
 objc_library(
@@ -595,12 +622,14 @@
     hdrs = [
         "TINKPublicKeyVerify.h",
     ],
+    visibility = ["//visibility:public"],
 )
 
 objc_library(
     name = "signature_config",
     srcs = ["signature/TINKSignatureConfig.mm"],
     hdrs = ["TINKSignatureConfig.h"],
+    visibility = ["//visibility:public"],
     deps = [
         ":registry_config",
         "//cc/signature:signature_config",
@@ -613,6 +642,7 @@
     name = "signature_key_template",
     srcs = ["signature/TINKSignatureKeyTemplate.mm"],
     hdrs = ["TINKSignatureKeyTemplate.h"],
+    visibility = ["//visibility:public"],
     deps = [
         ":key_template",
         ":tink_cc_pb",
@@ -652,6 +682,7 @@
     name = "public_key_sign_factory",
     srcs = ["signature/TINKPublicKeySignFactory.mm"],
     hdrs = ["TINKPublicKeySignFactory.h"],
+    visibility = ["//visibility:public"],
     deps = [
         ":keyset_handle",
         ":public_key_sign",
@@ -667,6 +698,7 @@
     name = "public_key_verify_factory",
     srcs = ["signature/TINKPublicKeyVerifyFactory.mm"],
     hdrs = ["TINKPublicKeyVerifyFactory.h"],
+    visibility = ["//visibility:public"],
     deps = [
         ":keyset_handle",
         ":public_key_verify",
@@ -714,8 +746,8 @@
         "//cc:keyset_handle",
         "//cc/aead:aead_config",
         "//cc/aead:aead_factory",
-        "//cc/util:keyset_util",
         "//cc/util:status",
+        "//cc/util:test_keyset_handle",
         "//cc/util:test_util",
         "//objc/util:proto_helpers",
         "//objc/util:test_helpers",
diff --git a/objc/CHANGELOG b/objc/CHANGELOG
index 272aee2..1f98596 100644
--- a/objc/CHANGELOG
+++ b/objc/CHANGELOG
@@ -1,3 +1,13 @@
+Version 1.3.0-rc2
+=================================
+This is a pre-release version.
+
+Version 1.3.0-rc1
+==================================
+Added RSA signatures (RSA-SSA-PKCS1, RSA-PSS), ED25519 signatures,
+deterministic AEAD (AES-SIV), and XCHACHA20-POLY1305 AEAD.
+This is a pre-release version.
+
 Version 1.2.2
 ==================================
 Staticly linking BoringSSL in the CocoaPod build to prevent namespace clashes
diff --git a/objc/TINKKeysetHandle+Cleartext.h b/objc/TINKKeysetHandle+Cleartext.h
index 053859a..84e91a2 100644
--- a/objc/TINKKeysetHandle+Cleartext.h
+++ b/objc/TINKKeysetHandle+Cleartext.h
@@ -40,6 +40,11 @@
 - (nullable instancetype)initCleartextKeysetHandleWithKeysetReader:(TINKKeysetReader *)reader
                                                              error:(NSError **)error;
 
+/**
+ * Returns the serialized Keyset-proto for this TINKKeysetHandle.
+ */
+- (NSData *)serializedKeyset;
+
 @end
 
 NS_ASSUME_NONNULL_END
diff --git a/objc/TINKMacKeyTemplate.h b/objc/TINKMacKeyTemplate.h
index c3ad57a..66e3a8b 100644
--- a/objc/TINKMacKeyTemplate.h
+++ b/objc/TINKMacKeyTemplate.h
@@ -38,6 +38,24 @@
    *   - OutputPrefixType: TINK
    */
   TINKHmacSha256 = 2,
+
+  /**
+   * HmacKey with the following parameters:
+   *   - key size: 64 bytes
+   *   - tag size: 32 bytes
+   *   - hash function: SHA512
+   *   - OutputPrefixType: TINK
+   */
+  TINKHmacSha512HalfSizeTag = 3,
+
+  /**
+   * HmacKey with the following parameters:
+   *   - key size: 64 bytes
+   *   - tag size: 64 bytes
+   *   - hash function: SHA512
+   *   - OutputPrefixType: TINK
+   */
+  TINKHmacSha512 = 4,
 };
 
 NS_ASSUME_NONNULL_BEGIN
diff --git a/objc/Tests/UnitTests/aead/TINKAeadConfigTest.mm b/objc/Tests/UnitTests/aead/TINKAeadConfigTest.mm
deleted file mode 100644
index 064ecdd..0000000
--- a/objc/Tests/UnitTests/aead/TINKAeadConfigTest.mm
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * Copyright 2017 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- **************************************************************************
- */
-
-#import "objc/TINKAeadConfig.h"
-
-#import <XCTest/XCTest.h>
-
-#import "objc/TINKConfig.h"
-#import "objc/TINKRegistryConfig.h"
-#import "objc/core/TINKRegistryConfig_Internal.h"
-
-#include "tink/aead/aead_config.h"
-#include "proto/config.pb.h"
-
-@interface TINKAeadConfigTest : XCTestCase
-@end
-
-@implementation TINKAeadConfigTest
-
-- (void)testConfigContents {
-  std::string aes_ctr_hmac_aead_key_type =
-      "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey";
-  std::string aes_gcm_key_type = "type.googleapis.com/google.crypto.tink.AesGcmKey";
-  std::string aes_eax_key_type = "type.googleapis.com/google.crypto.tink.AesEaxKey";
-  std::string xchacha20_poly1305_key_type =
-      "type.googleapis.com/google.crypto.tink.XChaCha20Poly1305Key";
-  std::string hmac_key_type = "type.googleapis.com/google.crypto.tink.HmacKey";
-
-  NSError *error = nil;
-  TINKAeadConfig *aeadConfig = [[TINKAeadConfig alloc] initWithError:&error];
-  XCTAssertNotNil(aeadConfig);
-  XCTAssertNil(error);
-
-  google::crypto::tink::RegistryConfig config = aeadConfig.ccConfig;
-  XCTAssertTrue(config.entry_size() == 5);
-
-  XCTAssertTrue("TinkMac" == config.entry(0).catalogue_name());
-  XCTAssertTrue("Mac" == config.entry(0).primitive_name());
-  XCTAssertTrue(hmac_key_type == config.entry(0).type_url());
-  XCTAssertTrue(config.entry(0).new_key_allowed());
-  XCTAssertTrue(0 == config.entry(0).key_manager_version());
-
-  XCTAssertTrue("TinkAead" == config.entry(1).catalogue_name());
-  XCTAssertTrue("Aead" == config.entry(1).primitive_name());
-  XCTAssertTrue(aes_ctr_hmac_aead_key_type == config.entry(1).type_url());
-  XCTAssertTrue(config.entry(1).new_key_allowed());
-  XCTAssertTrue(0 == config.entry(1).key_manager_version());
-
-  XCTAssertTrue("TinkAead" == config.entry(2).catalogue_name());
-  XCTAssertTrue("Aead" == config.entry(2).primitive_name());
-  XCTAssertTrue(aes_gcm_key_type == config.entry(2).type_url());
-  XCTAssertTrue(config.entry(2).new_key_allowed());
-  XCTAssertTrue(0 == config.entry(2).key_manager_version());
-
-  XCTAssertTrue("TinkAead" == config.entry(3).catalogue_name());
-  XCTAssertTrue("Aead" == config.entry(3).primitive_name());
-  XCTAssertTrue(aes_eax_key_type == config.entry(3).type_url());
-  XCTAssertTrue(config.entry(3).new_key_allowed());
-  XCTAssertTrue(0 == config.entry(3).key_manager_version());
-
-  XCTAssertTrue("TinkAead" == config.entry(4).catalogue_name());
-  XCTAssertTrue("Aead" == config.entry(4).primitive_name());
-  XCTAssertTrue(xchacha20_poly1305_key_type == config.entry(4).type_url());
-  XCTAssertTrue(config.entry(4).new_key_allowed());
-  XCTAssertTrue(0 == config.entry(4).key_manager_version());
-
-  // Registration of standard key types works.
-  error = nil;
-  XCTAssertTrue([TINKConfig registerConfig:aeadConfig error:&error]);
-  XCTAssertNil(error);
-}
-
-@end
diff --git a/objc/Tests/UnitTests/aead/TINKAeadFactoryTest.mm b/objc/Tests/UnitTests/aead/TINKAeadFactoryTest.mm
index 9a50569..3e2a6d7 100644
--- a/objc/Tests/UnitTests/aead/TINKAeadFactoryTest.mm
+++ b/objc/Tests/UnitTests/aead/TINKAeadFactoryTest.mm
@@ -33,16 +33,17 @@
 #include "tink/crypto_format.h"
 #include "tink/keyset_handle.h"
 #include "tink/util/status.h"
-#include "tink/util/keyset_util.h"
+#include "tink/util/test_keyset_handle.h"
 #include "tink/util/test_util.h"
 #include "proto/aes_gcm.pb.h"
 #include "proto/tink.pb.h"
 
 using crypto::tink::AesGcmKeyManager;
 using crypto::tink::KeyFactory;
-using crypto::tink::KeysetUtil;
+using crypto::tink::TestKeysetHandle;
 using crypto::tink::test::AddRawKey;
 using crypto::tink::test::AddTinkKey;
+using google::crypto::tink::AesGcmKey;
 using google::crypto::tink::AesGcmKeyFormat;
 using google::crypto::tink::KeyData;
 using google::crypto::tink::Keyset;
@@ -56,7 +57,7 @@
 - (void)testEmptyKeyset {
   Keyset keyset;
   TINKKeysetHandle *handle =
-      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:KeysetUtil::GetKeysetHandle(keyset)];
+      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:TestKeysetHandle::GetKeysetHandle(keyset)];
   XCTAssertNotNil(handle);
 
   NSError *error = nil;
@@ -69,9 +70,7 @@
 
 - (void)testPrimitive {
   // Prepare a template for generating keys for a Keyset.
-  AesGcmKeyManager key_manager;
-  const KeyFactory &key_factory = key_manager.get_key_factory();
-  std::string key_type = key_manager.get_key_type();
+  std::string key_type = AesGcmKeyManager().get_key_type();
 
   AesGcmKeyFormat key_format;
   key_format.set_key_size(16);
@@ -79,16 +78,16 @@
   // Prepare a Keyset.
   Keyset keyset;
   uint32_t key_id_1 = 1234543;
-  auto new_key = std::move(key_factory.NewKey(key_format).ValueOrDie());
-  AddTinkKey(key_type, key_id_1, *new_key, KeyStatusType::ENABLED, KeyData::SYMMETRIC, &keyset);
+  AesGcmKey new_key = AesGcmKeyManager().CreateKey(key_format).ValueOrDie();
+  AddTinkKey(key_type, key_id_1, new_key, KeyStatusType::ENABLED, KeyData::SYMMETRIC, &keyset);
 
   uint32_t key_id_2 = 726329;
-  new_key = std::move(key_factory.NewKey(key_format).ValueOrDie());
-  AddRawKey(key_type, key_id_2, *new_key, KeyStatusType::ENABLED, KeyData::SYMMETRIC, &keyset);
+  new_key = AesGcmKeyManager().CreateKey(key_format).ValueOrDie();
+  AddRawKey(key_type, key_id_2, new_key, KeyStatusType::ENABLED, KeyData::SYMMETRIC, &keyset);
 
   uint32_t key_id_3 = 7213743;
-  new_key = std::move(key_factory.NewKey(key_format).ValueOrDie());
-  AddTinkKey(key_type, key_id_3, *new_key, KeyStatusType::ENABLED, KeyData::SYMMETRIC, &keyset);
+  new_key = AesGcmKeyManager().CreateKey(key_format).ValueOrDie();
+  AddTinkKey(key_type, key_id_3, new_key, KeyStatusType::ENABLED, KeyData::SYMMETRIC, &keyset);
 
   keyset.set_primary_key_id(key_id_3);
 
@@ -98,7 +97,7 @@
   XCTAssertNil(error);
 
   TINKKeysetHandle *handle =
-      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:KeysetUtil::GetKeysetHandle(keyset)];
+      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:TestKeysetHandle::GetKeysetHandle(keyset)];
   XCTAssertNotNil(handle);
 
   id<TINKAead> aead = [TINKAeadFactory primitiveWithKeysetHandle:handle error:&error];
@@ -117,7 +116,10 @@
   XCTAssertTrue([plaintext isEqual:decrypted]);
 
   // Create raw ciphertext with 2nd key, and decrypt with Aead-instance.
-  auto raw_aead = std::move(key_manager.GetPrimitive(keyset.key(1).key_data()).ValueOrDie());
+  AesGcmKey raw_key;
+  XCTAssertTrue(raw_key.ParseFromString(keyset.key(1).key_data().value()));
+  auto raw_aead =
+      std::move(AesGcmKeyManager().GetPrimitive<crypto::tink::Aead>(raw_key).ValueOrDie());
   std::string raw_ciphertext =
       raw_aead->Encrypt(absl::string_view("some_plaintext"), absl::string_view("some_aad"))
           .ValueOrDie();
diff --git a/objc/Tests/UnitTests/aead/TINKAeadKeyTemplateTest.mm b/objc/Tests/UnitTests/aead/TINKAeadKeyTemplateTest.mm
index 2f979eb..c764491 100644
--- a/objc/Tests/UnitTests/aead/TINKAeadKeyTemplateTest.mm
+++ b/objc/Tests/UnitTests/aead/TINKAeadKeyTemplateTest.mm
@@ -32,6 +32,8 @@
 #import "proto/Hmac.pbobjc.h"
 #import "proto/Tink.pbobjc.h"
 
+using google::crypto::tink::XChaCha20Poly1305KeyFormat;
+
 @interface TINKAeadKeyTemplatesTest : XCTestCase
 @end
 
@@ -195,8 +197,10 @@
   // Check that the template works with the key manager.
   crypto::tink::XChaCha20Poly1305KeyManager key_manager;
   XCTAssertTrue(key_manager.get_key_type() == tpl.ccKeyTemplate->type_url());
-  auto new_key_result = key_manager.get_key_factory().NewKey(tpl.ccKeyTemplate->value());
-  XCTAssertTrue(new_key_result.ok());
+  XChaCha20Poly1305KeyFormat key_format;
+  XCTAssertTrue(key_format.ParseFromString(tpl.ccKeyTemplate->value()));
+  auto validation = key_manager.ValidateKeyFormat(key_format);
+  XCTAssertTrue(validation.ok());
 }
 
 @end
diff --git a/objc/Tests/UnitTests/core/TINKAllConfigTest.mm b/objc/Tests/UnitTests/core/TINKAllConfigTest.mm
deleted file mode 100644
index 0ba4503..0000000
--- a/objc/Tests/UnitTests/core/TINKAllConfigTest.mm
+++ /dev/null
@@ -1,175 +0,0 @@
-/**
- * Copyright 2017 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- **************************************************************************
- */
-
-#import "objc/TINKAllConfig.h"
-
-#import <XCTest/XCTest.h>
-
-#include "proto/config.pb.h"
-
-#import "objc/TINKConfig.h"
-#import "objc/TINKRegistryConfig.h"
-#import "objc/core/TINKRegistryConfig_Internal.h"
-#import "objc/util/TINKStrings.h"
-
-@interface TINKAllConfigTest : XCTestCase
-@end
-
-@implementation TINKAllConfigTest
-
-- (void)test110Config {
-  NSError *error = nil;
-  TINKAllConfig *allConfig = [[TINKAllConfig alloc] initWithError:&error];
-  XCTAssertNotNil(allConfig);
-  XCTAssertNil(error);
-  google::crypto::tink::RegistryConfig config = allConfig.ccConfig;
-
-  XCTAssertEqual(config.entry_size(), 16);
-
-  std::string hmac_key_type = "type.googleapis.com/google.crypto.tink.HmacKey";
-  XCTAssertTrue("TinkMac" == config.entry(0).catalogue_name());
-  XCTAssertTrue("Mac" == config.entry(0).primitive_name());
-  XCTAssertTrue(hmac_key_type == config.entry(0).type_url());
-  XCTAssertTrue(config.entry(0).new_key_allowed());
-  XCTAssertEqual(config.entry(0).key_manager_version(), 0);
-
-  std::string aes_ctr_hmac_aead_key_type =
-      "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey";
-  XCTAssertTrue("TinkAead" == config.entry(1).catalogue_name());
-  XCTAssertTrue("Aead" == config.entry(1).primitive_name());
-  XCTAssertTrue(aes_ctr_hmac_aead_key_type == config.entry(1).type_url());
-  XCTAssertTrue(config.entry(1).new_key_allowed());
-  XCTAssertEqual(config.entry(1).key_manager_version(), 0);
-
-  std::string aes_gcm_key_type = "type.googleapis.com/google.crypto.tink.AesGcmKey";
-  XCTAssertTrue("TinkAead" == config.entry(2).catalogue_name());
-  XCTAssertTrue("Aead" == config.entry(2).primitive_name());
-  XCTAssertTrue(aes_gcm_key_type == config.entry(2).type_url());
-  XCTAssertTrue(config.entry(2).new_key_allowed());
-  XCTAssertEqual(config.entry(2).key_manager_version(), 0);
-
-  std::string aes_eax_key_type = "type.googleapis.com/google.crypto.tink.AesEaxKey";
-  XCTAssertTrue("TinkAead" == config.entry(3).catalogue_name());
-  XCTAssertTrue("Aead" == config.entry(3).primitive_name());
-  XCTAssertTrue(aes_eax_key_type == config.entry(3).type_url());
-  XCTAssertTrue(config.entry(3).new_key_allowed());
-  XCTAssertEqual(config.entry(3).key_manager_version(), 0);
-
-  std::string xchacha20_poly1305_key_type =
-      "type.googleapis.com/google.crypto.tink.XChaCha20Poly1305Key";
-  XCTAssertTrue("TinkAead" == config.entry(4).catalogue_name());
-  XCTAssertTrue("Aead" == config.entry(4).primitive_name());
-  XCTAssertTrue(xchacha20_poly1305_key_type == config.entry(4).type_url());
-  XCTAssertTrue(config.entry(4).new_key_allowed());
-  XCTAssertEqual(config.entry(4).key_manager_version(), 0);
-
-  std::string ecies_hybrid_decrypt_key_type =
-      "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey";
-  XCTAssertTrue("TinkHybridDecrypt" == config.entry(5).catalogue_name());
-  XCTAssertTrue("HybridDecrypt" == config.entry(5).primitive_name());
-  XCTAssertTrue(ecies_hybrid_decrypt_key_type == config.entry(5).type_url());
-  XCTAssertTrue(config.entry(5).new_key_allowed());
-  XCTAssertEqual(config.entry(5).key_manager_version(), 0);
-
-  std::string ecies_hybrid_encrypt_key_type =
-      "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey";
-  XCTAssertTrue("TinkHybridEncrypt" == config.entry(6).catalogue_name());
-  XCTAssertTrue("HybridEncrypt" == config.entry(6).primitive_name());
-  XCTAssertTrue(ecies_hybrid_encrypt_key_type == config.entry(6).type_url());
-  XCTAssertTrue(config.entry(6).new_key_allowed());
-  XCTAssertEqual(config.entry(6).key_manager_version(), 0);
-
-  std::string ecdsa_sign_key_type = "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey";
-  XCTAssertTrue("TinkPublicKeySign" == config.entry(7).catalogue_name());
-  XCTAssertTrue("PublicKeySign" == config.entry(7).primitive_name());
-  XCTAssertTrue(ecdsa_sign_key_type == config.entry(7).type_url());
-  XCTAssertTrue(config.entry(7).new_key_allowed());
-  XCTAssertEqual(config.entry(7).key_manager_version(), 0);
-
-  std::string ecdsa_verify_key_type = "type.googleapis.com/google.crypto.tink.EcdsaPublicKey";
-  XCTAssertTrue("TinkPublicKeyVerify" == config.entry(8).catalogue_name());
-  XCTAssertTrue("PublicKeyVerify" == config.entry(8).primitive_name());
-  XCTAssertTrue(ecdsa_verify_key_type == config.entry(8).type_url());
-  XCTAssertTrue(config.entry(8).new_key_allowed());
-  XCTAssertEqual(config.entry(8).key_manager_version(), 0);
-
-  std::string ed25519_sign_key_type = "type.googleapis.com/google.crypto.tink.Ed25519PrivateKey";
-  XCTAssertTrue("TinkPublicKeySign" == config.entry(9).catalogue_name());
-  XCTAssertTrue("PublicKeySign" == config.entry(9).primitive_name());
-  XCTAssertTrue(ed25519_sign_key_type == config.entry(9).type_url());
-  XCTAssertTrue(config.entry(9).new_key_allowed());
-  XCTAssertEqual(config.entry(9).key_manager_version(), 0);
-
-  std::string ed25519_verify_key_type = "type.googleapis.com/google.crypto.tink.Ed25519PublicKey";
-  XCTAssertTrue("TinkPublicKeyVerify" == config.entry(10).catalogue_name());
-  XCTAssertTrue("PublicKeyVerify" == config.entry(10).primitive_name());
-  XCTAssertTrue(ed25519_verify_key_type == config.entry(10).type_url());
-  XCTAssertTrue(config.entry(10).new_key_allowed());
-  XCTAssertEqual(config.entry(10).key_manager_version(), 0);
-
-  std::string rsa_ssa_pss_sign_key_type =
-      "type.googleapis.com/google.crypto.tink.RsaSsaPssPrivateKey";
-  XCTAssertTrue("TinkPublicKeySign" == config.entry(11).catalogue_name());
-  XCTAssertTrue("PublicKeySign" == config.entry(11).primitive_name());
-  XCTAssertTrue(rsa_ssa_pss_sign_key_type == config.entry(11).type_url());
-  XCTAssertTrue(config.entry(11).new_key_allowed());
-  XCTAssertEqual(config.entry(11).key_manager_version(), 0);
-
-  std::string rsa_ssa_pss_verify_key_type =
-      "type.googleapis.com/google.crypto.tink.RsaSsaPssPublicKey";
-  XCTAssertTrue("TinkPublicKeyVerify" == config.entry(12).catalogue_name());
-  XCTAssertTrue("PublicKeyVerify" == config.entry(12).primitive_name());
-  XCTAssertTrue(rsa_ssa_pss_verify_key_type == config.entry(12).type_url());
-  XCTAssertTrue(config.entry(12).new_key_allowed());
-  XCTAssertEqual(config.entry(12).key_manager_version(), 0);
-
-  std::string rsa_ssa_pkcs1_sign_key_type =
-      "type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PrivateKey";
-  XCTAssertTrue("TinkPublicKeySign" == config.entry(13).catalogue_name());
-  XCTAssertTrue("PublicKeySign" == config.entry(13).primitive_name());
-  XCTAssertTrue(rsa_ssa_pkcs1_sign_key_type == config.entry(13).type_url());
-  XCTAssertTrue(config.entry(13).new_key_allowed());
-  XCTAssertEqual(config.entry(13).key_manager_version(), 0);
-
-  std::string rsa_ssa_pkcs1_verify_key_type =
-      "type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PublicKey";
-  XCTAssertTrue("TinkPublicKeyVerify" == config.entry(14).catalogue_name());
-  XCTAssertTrue("PublicKeyVerify" == config.entry(14).primitive_name());
-  XCTAssertTrue(rsa_ssa_pkcs1_verify_key_type == config.entry(14).type_url());
-  XCTAssertTrue(config.entry(14).new_key_allowed());
-  XCTAssertEqual(config.entry(14).key_manager_version(), 0);
-
-  std::string aes_siv_key_type = "type.googleapis.com/google.crypto.tink.AesSivKey";
-  XCTAssertTrue("TinkDeterministicAead" == config.entry(15).catalogue_name());
-  XCTAssertTrue("DeterministicAead" == config.entry(15).primitive_name());
-  XCTAssertTrue(aes_siv_key_type == config.entry(15).type_url());
-  XCTAssertTrue(config.entry(15).new_key_allowed());
-  XCTAssertEqual(config.entry(15).key_manager_version(), 0);
-}
-
-- (void)testConfigRegistration {
-  NSError *error = nil;
-  TINKAllConfig *config = [[TINKAllConfig alloc] initWithError:&error];
-  XCTAssertNotNil(config);
-  XCTAssertNil(error);
-
-  XCTAssertTrue([TINKConfig registerConfig:config error:&error]);
-  XCTAssertNil(error);
-}
-
-@end
diff --git a/objc/Tests/UnitTests/core/TINKCleartextKeysetHandleTest.mm b/objc/Tests/UnitTests/core/TINKCleartextKeysetHandleTest.mm
index fe1f597..9d746f6 100644
--- a/objc/Tests/UnitTests/core/TINKCleartextKeysetHandleTest.mm
+++ b/objc/Tests/UnitTests/core/TINKCleartextKeysetHandleTest.mm
@@ -25,7 +25,7 @@
 #import "objc/core/TINKKeysetHandle_Internal.h"
 #import "objc/util/TINKStrings.h"
 
-#include "tink/util/keyset_util.h"
+#include "tink/util/test_keyset_handle.h"
 #include "tink/util/test_util.h"
 #include "proto/tink.pb.h"
 
@@ -58,8 +58,9 @@
       [[TINKKeysetHandle alloc] initCleartextKeysetHandleWithKeysetReader:reader error:&error];
 
   XCTAssertNotNil(handle);
-  XCTAssertTrue(crypto::tink::KeysetUtil::GetKeyset(*handle.ccKeysetHandle).SerializeAsString() ==
-                keyset.SerializeAsString());
+  XCTAssertTrue(
+      crypto::tink::TestKeysetHandle::GetKeyset(*handle.ccKeysetHandle).SerializeAsString() ==
+      keyset.SerializeAsString());
 
   // Trying to use the same reader again must fail.
   error = nil;
@@ -86,4 +87,32 @@
   XCTAssertTrue(error.code == crypto::tink::util::error::INVALID_ARGUMENT);
 }
 
+- (void)testSerializeKeyset {
+  google::crypto::tink::Keyset keyset;
+  google::crypto::tink::Keyset::Key key;
+  crypto::tink::test::AddTinkKey("some key type", 42, key,
+                                 google::crypto::tink::KeyStatusType::ENABLED,
+                                 google::crypto::tink::KeyData::SYMMETRIC, &keyset);
+  crypto::tink::test::AddRawKey("some other key type", 711, key,
+                                google::crypto::tink::KeyStatusType::ENABLED,
+                                google::crypto::tink::KeyData::SYMMETRIC, &keyset);
+  keyset.set_primary_key_id(42);
+
+  NSData *serializedKeyset = TINKStringToNSData(keyset.SerializeAsString());
+
+  NSError *error = nil;
+  TINKBinaryKeysetReader *reader =
+      [[TINKBinaryKeysetReader alloc] initWithSerializedKeyset:serializedKeyset error:&error];
+
+  XCTAssertNil(error);
+  XCTAssertNotNil(reader);
+
+  TINKKeysetHandle *handle =
+      [[TINKKeysetHandle alloc] initCleartextKeysetHandleWithKeysetReader:reader error:&error];
+
+  XCTAssertNotNil(handle);
+  XCTAssertTrue([serializedKeyset isEqualToData:handle.serializedKeyset]);
+}
+
+
 @end
diff --git a/objc/Tests/UnitTests/core/TINKKeysetHandleTest.mm b/objc/Tests/UnitTests/core/TINKKeysetHandleTest.mm
index 54dc639..32c2abe 100644
--- a/objc/Tests/UnitTests/core/TINKKeysetHandleTest.mm
+++ b/objc/Tests/UnitTests/core/TINKKeysetHandleTest.mm
@@ -35,7 +35,7 @@
 
 #include "tink/binary_keyset_reader.h"
 #include "tink/util/status.h"
-#include "tink/util/keyset_util.h"
+#include "tink/util/test_keyset_handle.h"
 #include "tink/util/test_util.h"
 #include "proto/tink.pb.h"
 
@@ -144,7 +144,7 @@
       [[TINKKeysetHandle alloc] initWithKeysetReader:reader andKey:aead error:nil];
   XCTAssertNotNil(handle);
   std::string output;
-  crypto::tink::KeysetUtil::GetKeyset(*handle.ccKeysetHandle).SerializeToString(&output);
+  crypto::tink::TestKeysetHandle::GetKeyset(*handle.ccKeysetHandle).SerializeToString(&output);
 
   XCTAssertTrue(
       [gKeyset.data isEqualToData:[NSData dataWithBytes:output.data() length:output.size()]]);
@@ -261,7 +261,7 @@
   XCTAssertNil(error);
 
   // Verify the contents of the keyset.
-  auto ccKeyset = crypto::tink::KeysetUtil::GetKeyset(*handle.ccKeysetHandle);
+  auto ccKeyset = crypto::tink::TestKeysetHandle::GetKeyset(*handle.ccKeysetHandle);
   std::string serializedCCKeyset;
   XCTAssertTrue(ccKeyset.SerializeToString(&serializedCCKeyset));
   XCTAssertTrue(
@@ -327,11 +327,11 @@
   XCTAssertNil(error);
 
   // Compare the two keysets, verify that they are identical.
-  auto keyset1 = crypto::tink::KeysetUtil::GetKeyset(*handle1.ccKeysetHandle);
+  auto keyset1 = crypto::tink::TestKeysetHandle::GetKeyset(*handle1.ccKeysetHandle);
   std::string serializedKeyset1;
   XCTAssertTrue(keyset1.SerializeToString(&serializedKeyset1));
 
-  auto keyset2 = crypto::tink::KeysetUtil::GetKeyset(*handle2.ccKeysetHandle);
+  auto keyset2 = crypto::tink::TestKeysetHandle::GetKeyset(*handle2.ccKeysetHandle);
   std::string serializedKeyset2;
   XCTAssertTrue(keyset2.SerializeToString(&serializedKeyset2));
 
@@ -381,8 +381,8 @@
   XCTAssertNotNil(publicHandle);
   XCTAssertNil(error);
 
-  auto keyset = crypto::tink::KeysetUtil::GetKeyset(*handle.ccKeysetHandle);
-  auto public_keyset = crypto::tink::KeysetUtil::GetKeyset(*publicHandle.ccKeysetHandle);
+  auto keyset = crypto::tink::TestKeysetHandle::GetKeyset(*handle.ccKeysetHandle);
+  auto public_keyset = crypto::tink::TestKeysetHandle::GetKeyset(*publicHandle.ccKeysetHandle);
   XCTAssertEqual(keyset.primary_key_id(), public_keyset.primary_key_id());
   XCTAssertEqual(keyset.key_size(), public_keyset.key_size());
   XCTAssertEqual(keyset.key(0).status(), public_keyset.key(0).status());
@@ -426,8 +426,9 @@
 
   XCTAssertNil(error);
   XCTAssertNotNil(handle);
-  XCTAssertTrue(crypto::tink::KeysetUtil::GetKeyset(*handle.ccKeysetHandle).SerializeAsString() ==
-                keyset->SerializeAsString());
+  XCTAssertTrue(
+      crypto::tink::TestKeysetHandle::GetKeyset(*handle.ccKeysetHandle).SerializeAsString() ==
+      keyset->SerializeAsString());
 }
 
 - (void)testReadNoSecretFailForTypeUnknown {
diff --git a/objc/Tests/UnitTests/daead/TINKDeterministicAeadConfigTest.mm b/objc/Tests/UnitTests/daead/TINKDeterministicAeadConfigTest.mm
deleted file mode 100644
index 1a24097..0000000
--- a/objc/Tests/UnitTests/daead/TINKDeterministicAeadConfigTest.mm
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * Copyright 2017 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- **************************************************************************
- */
-
-#import "objc/TINKDeterministicAeadConfig.h"
-
-#import <XCTest/XCTest.h>
-
-#import "objc/TINKConfig.h"
-#import "objc/TINKRegistryConfig.h"
-#import "objc/core/TINKRegistryConfig_Internal.h"
-
-#include "tink/daead/deterministic_aead_config.h"
-#include "proto/config.pb.h"
-
-@interface TINKDeterministicAeadConfigTest : XCTestCase
-@end
-
-@implementation TINKDeterministicAeadConfigTest
-
-- (void)testConfigContents {
-  std::string aes_siv_key_type = "type.googleapis.com/google.crypto.tink.AesSivKey";
-
-  NSError *error = nil;
-  TINKDeterministicAeadConfig *aeadConfig =
-      [[TINKDeterministicAeadConfig alloc] initWithError:&error];
-  XCTAssertNotNil(aeadConfig);
-  XCTAssertNil(error);
-
-  google::crypto::tink::RegistryConfig config = aeadConfig.ccConfig;
-  XCTAssertEqual(config.entry_size(), 1);
-
-  XCTAssertTrue("TinkDeterministicAead" == config.entry(0).catalogue_name());
-  XCTAssertTrue("DeterministicAead" == config.entry(0).primitive_name());
-  XCTAssertTrue(aes_siv_key_type == config.entry(0).type_url());
-  XCTAssertTrue(config.entry(0).new_key_allowed());
-  XCTAssertEqual(config.entry(0).key_manager_version(), 0);
-
-  // Registration of standard key types works.
-  error = nil;
-  XCTAssertTrue([TINKConfig registerConfig:aeadConfig error:&error]);
-  XCTAssertNil(error);
-}
-
-@end
diff --git a/objc/Tests/UnitTests/daead/TINKDeterministicAeadFactoryTest.mm b/objc/Tests/UnitTests/daead/TINKDeterministicAeadFactoryTest.mm
index 2050392..3c9b21b 100644
--- a/objc/Tests/UnitTests/daead/TINKDeterministicAeadFactoryTest.mm
+++ b/objc/Tests/UnitTests/daead/TINKDeterministicAeadFactoryTest.mm
@@ -32,7 +32,7 @@
 #include "tink/daead/deterministic_aead_config.h"
 #include "tink/deterministic_aead.h"
 #include "tink/keyset_handle.h"
-#include "tink/util/keyset_util.h"
+#include "tink/util/test_keyset_handle.h"
 #include "tink/util/status.h"
 #include "tink/util/test_util.h"
 #include "proto/aes_siv.pb.h"
@@ -40,9 +40,10 @@
 
 using crypto::tink::AesSivKeyManager;
 using crypto::tink::KeyFactory;
-using crypto::tink::KeysetUtil;
+using crypto::tink::TestKeysetHandle;
 using crypto::tink::test::AddRawKey;
 using crypto::tink::test::AddTinkKey;
+using google::crypto::tink::AesSivKey;
 using google::crypto::tink::AesSivKeyFormat;
 using google::crypto::tink::KeyData;
 using google::crypto::tink::Keyset;
@@ -56,7 +57,7 @@
 - (void)testEmptyKeyset {
   Keyset keyset;
   TINKKeysetHandle *handle =
-      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:KeysetUtil::GetKeysetHandle(keyset)];
+      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:TestKeysetHandle::GetKeysetHandle(keyset)];
   XCTAssertNotNil(handle);
 
   NSError *error = nil;
@@ -69,10 +70,7 @@
 }
 
 - (void)testPrimitive {
-  // Prepare a template for generating keys for a Keyset.
-  AesSivKeyManager key_manager;
-  const KeyFactory &key_factory = key_manager.get_key_factory();
-  std::string key_type = key_manager.get_key_type();
+  std::string key_type = AesSivKeyManager().get_key_type();
 
   AesSivKeyFormat key_format;
   key_format.set_key_size(64);
@@ -80,16 +78,16 @@
   // Prepare a Keyset.
   Keyset keyset;
   uint32_t key_id_1 = 1234543;
-  auto new_key = std::move(key_factory.NewKey(key_format).ValueOrDie());
-  AddTinkKey(key_type, key_id_1, *new_key, KeyStatusType::ENABLED, KeyData::SYMMETRIC, &keyset);
+  auto new_key = AesSivKeyManager().CreateKey(key_format).ValueOrDie();
+  AddTinkKey(key_type, key_id_1, new_key, KeyStatusType::ENABLED, KeyData::SYMMETRIC, &keyset);
 
   uint32_t key_id_2 = 726329;
-  new_key = std::move(key_factory.NewKey(key_format).ValueOrDie());
-  AddRawKey(key_type, key_id_2, *new_key, KeyStatusType::ENABLED, KeyData::SYMMETRIC, &keyset);
+  new_key = AesSivKeyManager().CreateKey(key_format).ValueOrDie();
+  AddRawKey(key_type, key_id_2, new_key, KeyStatusType::ENABLED, KeyData::SYMMETRIC, &keyset);
 
   uint32_t key_id_3 = 7213743;
-  new_key = std::move(key_factory.NewKey(key_format).ValueOrDie());
-  AddTinkKey(key_type, key_id_3, *new_key, KeyStatusType::ENABLED, KeyData::SYMMETRIC, &keyset);
+  new_key = AesSivKeyManager().CreateKey(key_format).ValueOrDie();
+  AddTinkKey(key_type, key_id_3, new_key, KeyStatusType::ENABLED, KeyData::SYMMETRIC, &keyset);
 
   keyset.set_primary_key_id(key_id_3);
 
@@ -100,7 +98,7 @@
   XCTAssertNil(error);
 
   TINKKeysetHandle *handle =
-      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:KeysetUtil::GetKeysetHandle(keyset)];
+      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:TestKeysetHandle::GetKeysetHandle(keyset)];
   XCTAssertNotNil(handle);
 
   id<TINKDeterministicAead> aead = [TINKDeterministicAeadFactory primitiveWithKeysetHandle:handle
@@ -124,7 +122,10 @@
   XCTAssertTrue([plaintext isEqual:decrypted]);
 
   // Create raw ciphertext with 2nd key, and decrypt with Aead-instance.
-  auto raw_aead = std::move(key_manager.GetPrimitive(keyset.key(1).key_data()).ValueOrDie());
+  AesSivKey raw_key;
+  XCTAssertTrue(raw_key.ParseFromString(keyset.key(1).key_data().value()));
+  auto raw_aead = std::move(AesSivKeyManager()
+                            .GetPrimitive<crypto::tink::DeterministicAead>(raw_key).ValueOrDie());
   std::string raw_ciphertext = raw_aead
                                    ->EncryptDeterministically(absl::string_view("some_plaintext"),
                                                               absl::string_view("some_aad"))
diff --git a/objc/Tests/UnitTests/hybrid/TINKHybridConfigTest.mm b/objc/Tests/UnitTests/hybrid/TINKHybridConfigTest.mm
deleted file mode 100644
index 9b549fd..0000000
--- a/objc/Tests/UnitTests/hybrid/TINKHybridConfigTest.mm
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * Copyright 2017 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- **************************************************************************
- */
-
-#import "objc/TINKHybridConfig.h"
-
-#import <XCTest/XCTest.h>
-
-#import "objc/TINKConfig.h"
-#import "objc/TINKRegistryConfig.h"
-#import "objc/core/TINKRegistryConfig_Internal.h"
-
-#include "tink/hybrid/hybrid_config.h"
-#include "proto/config.pb.h"
-
-@interface TINKHybridConfigTest : XCTestCase
-@end
-
-@implementation TINKHybridConfigTest
-
-- (void)testConfigContents {
-  std::string encrypt_key_type = "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey";
-  std::string decrypt_key_type = "type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey";
-  std::string aes_ctr_hmac_aead_key_type =
-      "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey";
-  std::string aes_gcm_key_type = "type.googleapis.com/google.crypto.tink.AesGcmKey";
-  std::string aes_eax_key_type = "type.googleapis.com/google.crypto.tink.AesEaxKey";
-  std::string xchacha20_poly1305_key_type =
-      "type.googleapis.com/google.crypto.tink.XChaCha20Poly1305Key";
-  std::string hmac_key_type = "type.googleapis.com/google.crypto.tink.HmacKey";
-
-  NSError *error = nil;
-  TINKHybridConfig *hybridConfig = [[TINKHybridConfig alloc] initWithError:&error];
-  XCTAssertNotNil(hybridConfig);
-  XCTAssertNil(error);
-
-  google::crypto::tink::RegistryConfig config = hybridConfig.ccConfig;
-  XCTAssertTrue(config.entry_size() == 7);
-
-  XCTAssertTrue("TinkMac" == config.entry(0).catalogue_name());
-  XCTAssertTrue("Mac" == config.entry(0).primitive_name());
-  XCTAssertTrue(hmac_key_type == config.entry(0).type_url());
-  XCTAssertTrue(config.entry(0).new_key_allowed());
-  XCTAssertTrue(0 == config.entry(0).key_manager_version());
-
-  XCTAssertTrue("TinkAead" == config.entry(1).catalogue_name());
-  XCTAssertTrue("Aead" == config.entry(1).primitive_name());
-  XCTAssertTrue(aes_ctr_hmac_aead_key_type == config.entry(1).type_url());
-  XCTAssertTrue(config.entry(1).new_key_allowed());
-  XCTAssertTrue(0 == config.entry(1).key_manager_version());
-
-  XCTAssertTrue("TinkAead" == config.entry(2).catalogue_name());
-  XCTAssertTrue("Aead" == config.entry(2).primitive_name());
-  XCTAssertTrue(aes_gcm_key_type == config.entry(2).type_url());
-  XCTAssertTrue(config.entry(2).new_key_allowed());
-  XCTAssertTrue(0 == config.entry(2).key_manager_version());
-
-  XCTAssertTrue("TinkAead" == config.entry(3).catalogue_name());
-  XCTAssertTrue("Aead" == config.entry(3).primitive_name());
-  XCTAssertTrue(aes_eax_key_type == config.entry(3).type_url());
-  XCTAssertTrue(config.entry(3).new_key_allowed());
-  XCTAssertTrue(0 == config.entry(3).key_manager_version());
-
-  XCTAssertTrue("TinkAead" == config.entry(4).catalogue_name());
-  XCTAssertTrue("Aead" == config.entry(4).primitive_name());
-  XCTAssertTrue(xchacha20_poly1305_key_type == config.entry(4).type_url());
-  XCTAssertTrue(config.entry(4).new_key_allowed());
-  XCTAssertTrue(0 == config.entry(4).key_manager_version());
-
-  XCTAssertTrue("TinkHybridDecrypt" == config.entry(5).catalogue_name());
-  XCTAssertTrue("HybridDecrypt" == config.entry(5).primitive_name());
-  XCTAssertTrue(decrypt_key_type == config.entry(5).type_url());
-  XCTAssertTrue(config.entry(5).new_key_allowed());
-  XCTAssertTrue(0 == config.entry(5).key_manager_version());
-
-  XCTAssertTrue("TinkHybridEncrypt" == config.entry(6).catalogue_name());
-  XCTAssertTrue("HybridEncrypt" == config.entry(6).primitive_name());
-  XCTAssertTrue(encrypt_key_type == config.entry(6).type_url());
-  XCTAssertTrue(config.entry(6).new_key_allowed());
-  XCTAssertTrue(0 == config.entry(6).key_manager_version());
-
-  // Registration of standard key types works.
-  error = nil;
-  XCTAssertTrue([TINKConfig registerConfig:hybridConfig error:&error]);
-  XCTAssertNil(error);
-}
-
-@end
diff --git a/objc/Tests/UnitTests/hybrid/TINKHybridDecryptFactoryTest.mm b/objc/Tests/UnitTests/hybrid/TINKHybridDecryptFactoryTest.mm
index 7137cb3..0caa583 100644
--- a/objc/Tests/UnitTests/hybrid/TINKHybridDecryptFactoryTest.mm
+++ b/objc/Tests/UnitTests/hybrid/TINKHybridDecryptFactoryTest.mm
@@ -20,7 +20,7 @@
 
 #include "tink/crypto_format.h"
 #include "tink/util/status.h"
-#include "tink/util/keyset_util.h"
+#include "tink/util/test_keyset_handle.h"
 
 #import "proto/EciesAeadHkdf.pbobjc.h"
 #import "proto/Tink.pbobjc.h"
@@ -36,7 +36,7 @@
 #import "objc/util/TINKStrings.h"
 #import "objc/util/TINKTestHelpers.h"
 
-using crypto::tink::KeysetUtil;
+using crypto::tink::TestKeysetHandle;
 
 @interface TINKHybridDecryptFactoryTest : XCTestCase
 @end
@@ -55,7 +55,7 @@
   google::crypto::tink::Keyset ccPrivateKeyset;
   XCTAssertTrue(ccPrivateKeyset.ParseFromString(serializedKeyset));
   TINKKeysetHandle *privateKeysetHandle = [[TINKKeysetHandle alloc]
-      initWithCCKeysetHandle:KeysetUtil::GetKeysetHandle(ccPrivateKeyset)];
+      initWithCCKeysetHandle:TestKeysetHandle::GetKeysetHandle(ccPrivateKeyset)];
 
   error = nil;
   serializedKeyset = TINKPBSerializeToString(publicKeyset, &error);
@@ -63,7 +63,7 @@
   google::crypto::tink::Keyset ccPublicKeyset;
   XCTAssertTrue(ccPublicKeyset.ParseFromString(serializedKeyset));
   TINKKeysetHandle *publicKeysetHandle = [[TINKKeysetHandle alloc]
-      initWithCCKeysetHandle:KeysetUtil::GetKeysetHandle(ccPublicKeyset)];
+      initWithCCKeysetHandle:TestKeysetHandle::GetKeysetHandle(ccPublicKeyset)];
 
   // Get a HybridDecrypt primitive.
   error = nil;
@@ -99,7 +99,7 @@
 - (void)testPrimitiveWithEmptyKeyset {
   google::crypto::tink::Keyset keyset;
   TINKKeysetHandle *keysetHandle =
-      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:KeysetUtil::GetKeysetHandle(keyset)];
+      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:TestKeysetHandle::GetKeysetHandle(keyset)];
   XCTAssertNotNil(keysetHandle);
 
   NSError *error = nil;
diff --git a/objc/Tests/UnitTests/hybrid/TINKHybridEncryptFactoryTest.mm b/objc/Tests/UnitTests/hybrid/TINKHybridEncryptFactoryTest.mm
index cb6874a..2c58b5d 100644
--- a/objc/Tests/UnitTests/hybrid/TINKHybridEncryptFactoryTest.mm
+++ b/objc/Tests/UnitTests/hybrid/TINKHybridEncryptFactoryTest.mm
@@ -19,7 +19,7 @@
 #import <XCTest/XCTest.h>
 
 #include "tink/util/status.h"
-#include "tink/util/keyset_util.h"
+#include "tink/util/test_keyset_handle.h"
 #include "proto/tink.pb.h"
 
 #import "proto/Common.pbobjc.h"
@@ -35,7 +35,7 @@
 #import "objc/util/TINKStrings.h"
 #import "objc/util/TINKTestHelpers.h"
 
-using crypto::tink::KeysetUtil;
+using crypto::tink::TestKeysetHandle;
 
 @interface TINKHybridEncryptFactoryTest : XCTestCase
 @end
@@ -52,7 +52,7 @@
 - (void)testPrimitiveWithEmptyKeyset {
   google::crypto::tink::Keyset keyset;
   TINKKeysetHandle *keysetHandle =
-      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:KeysetUtil::GetKeysetHandle(keyset)];
+      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:TestKeysetHandle::GetKeysetHandle(keyset)];
 
   NSError *error = nil;
   id<TINKHybridEncrypt> primitive =
@@ -103,7 +103,7 @@
 
   // Create a KeysetHandle and use it with the factory.
   TINKKeysetHandle *keysetHandle = [[TINKKeysetHandle alloc]
-      initWithCCKeysetHandle:KeysetUtil::GetKeysetHandle(ccKeyset)];
+      initWithCCKeysetHandle:TestKeysetHandle::GetKeysetHandle(ccKeyset)];
   XCTAssertNotNil(keysetHandle);
 
   // Get a HybridEncrypt primitive.
diff --git a/objc/Tests/UnitTests/mac/TINKMacConfigTest.mm b/objc/Tests/UnitTests/mac/TINKMacConfigTest.mm
deleted file mode 100644
index 6b39c5a..0000000
--- a/objc/Tests/UnitTests/mac/TINKMacConfigTest.mm
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * Copyright 2017 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- **************************************************************************
- */
-
-#import "objc/TINKMacConfig.h"
-
-#import <XCTest/XCTest.h>
-
-#import "objc/TINKConfig.h"
-#import "objc/TINKRegistryConfig.h"
-#import "objc/core/TINKRegistryConfig_Internal.h"
-
-#include "tink/mac/mac_config.h"
-#include "proto/config.pb.h"
-
-@interface TINKMacConfigTest : XCTestCase
-@end
-
-@implementation TINKMacConfigTest
-
-- (void)testConfigContents {
-  std::string hmac_key_type = "type.googleapis.com/google.crypto.tink.HmacKey";
-
-  NSError *error = nil;
-  TINKMacConfig *macConfig = [[TINKMacConfig alloc] initWithError:&error];
-  XCTAssertNotNil(macConfig);
-  XCTAssertNil(error);
-
-  google::crypto::tink::RegistryConfig config = macConfig.ccConfig;
-  XCTAssertTrue(config.entry_size() == 1);
-
-  XCTAssertEqual("TinkMac", config.entry(0).catalogue_name());
-  XCTAssertEqual("Mac", config.entry(0).primitive_name());
-  XCTAssertEqual(hmac_key_type, config.entry(0).type_url());
-  XCTAssertTrue(config.entry(0).new_key_allowed());
-  XCTAssertEqual(config.entry(0).key_manager_version(), 0);
-
-  // Registration of standard key types works.
-  error = nil;
-  XCTAssertTrue([TINKConfig registerConfig:macConfig error:&error]);
-  XCTAssertNil(error);
-}
-
-@end
diff --git a/objc/Tests/UnitTests/mac/TINKMacFactoryTest.mm b/objc/Tests/UnitTests/mac/TINKMacFactoryTest.mm
index 1766f37..2a4de19 100644
--- a/objc/Tests/UnitTests/mac/TINKMacFactoryTest.mm
+++ b/objc/Tests/UnitTests/mac/TINKMacFactoryTest.mm
@@ -33,17 +33,18 @@
 #include "tink/mac/hmac_key_manager.h"
 #include "tink/mac/mac_config.h"
 #include "tink/util/status.h"
-#include "tink/util/keyset_util.h"
+#include "tink/util/test_keyset_handle.h"
 #include "tink/util/test_util.h"
 #include "proto/hmac.pb.h"
 #include "proto/tink.pb.h"
 
 using crypto::tink::HmacKeyManager;
 using crypto::tink::KeyFactory;
-using crypto::tink::KeysetUtil;
+using crypto::tink::TestKeysetHandle;
 using crypto::tink::test::AddRawKey;
 using crypto::tink::test::AddTinkKey;
 using google::crypto::tink::HashType;
+using google::crypto::tink::HmacKey;
 using google::crypto::tink::HmacKeyFormat;
 using google::crypto::tink::KeyData;
 using google::crypto::tink::Keyset;
@@ -57,7 +58,7 @@
 - (void)testEmptyKeyset {
   Keyset keyset;
   TINKKeysetHandle *handle =
-      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:KeysetUtil::GetKeysetHandle(keyset)];
+      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:TestKeysetHandle::GetKeysetHandle(keyset)];
   XCTAssertNotNil(handle);
 
   NSError *error = nil;
@@ -70,9 +71,8 @@
 
 - (void)testPrimitive {
   // Prepare a template for generating keys for a Keyset.
+  std::string key_type = HmacKeyManager().get_key_type();
   HmacKeyManager key_manager;
-  const KeyFactory &key_factory = key_manager.get_key_factory();
-  std::string key_type = key_manager.get_key_type();
 
   HmacKeyFormat key_format;
   key_format.set_key_size(16);
@@ -82,16 +82,16 @@
   // Prepare a Keyset.
   Keyset keyset;
   uint32_t key_id_1 = 1234543;
-  auto new_key = std::move(key_factory.NewKey(key_format).ValueOrDie());
-  AddTinkKey(key_type, key_id_1, *new_key, KeyStatusType::ENABLED, KeyData::SYMMETRIC, &keyset);
+  HmacKey new_key = HmacKeyManager().CreateKey(key_format).ValueOrDie();
+  AddTinkKey(key_type, key_id_1, new_key, KeyStatusType::ENABLED, KeyData::SYMMETRIC, &keyset);
 
   uint32_t key_id_2 = 726329;
-  new_key = std::move(key_factory.NewKey(key_format).ValueOrDie());
-  AddRawKey(key_type, key_id_2, *new_key, KeyStatusType::ENABLED, KeyData::SYMMETRIC, &keyset);
+  new_key = HmacKeyManager().CreateKey(key_format).ValueOrDie();
+  AddRawKey(key_type, key_id_2, new_key, KeyStatusType::ENABLED, KeyData::SYMMETRIC, &keyset);
 
   uint32_t key_id_3 = 7213743;
-  new_key = std::move(key_factory.NewKey(key_format).ValueOrDie());
-  AddTinkKey(key_type, key_id_3, *new_key, KeyStatusType::ENABLED, KeyData::SYMMETRIC, &keyset);
+  new_key = HmacKeyManager().CreateKey(key_format).ValueOrDie();
+  AddTinkKey(key_type, key_id_3, new_key, KeyStatusType::ENABLED, KeyData::SYMMETRIC, &keyset);
 
   keyset.set_primary_key_id(key_id_3);
 
@@ -101,7 +101,7 @@
   XCTAssertNil(error);
 
   TINKKeysetHandle *handle =
-      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:KeysetUtil::GetKeysetHandle(keyset)];
+      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:TestKeysetHandle::GetKeysetHandle(keyset)];
   XCTAssertNotNil(handle);
 
   id<TINKMac> mac = [TINKMacFactory primitiveWithKeysetHandle:handle error:&error];
diff --git a/objc/Tests/UnitTests/mac/TINKMacKeyTemplateTest.mm b/objc/Tests/UnitTests/mac/TINKMacKeyTemplateTest.mm
index 78e0505..72beafd 100644
--- a/objc/Tests/UnitTests/mac/TINKMacKeyTemplateTest.mm
+++ b/objc/Tests/UnitTests/mac/TINKMacKeyTemplateTest.mm
@@ -99,4 +99,54 @@
   XCTAssertEqual(keyFormat.params.hash_p, TINKPBHashType_Sha256);
 }
 
+- (void)testHmac256BittagSha512 {
+  // Get a HmacSha512HalfSizeTag key template.
+  NSError *error = nil;
+  TINKMacKeyTemplate *keyTemplate =
+      [[TINKMacKeyTemplate alloc] initWithKeyTemplate:TINKHmacSha512HalfSizeTag error:&error];
+  XCTAssertNil(error);
+  XCTAssertNotNil(keyTemplate);
+
+  TINKPBKeyTemplate *objcKeyTemplate = TINKKeyTemplateToObjc(keyTemplate.ccKeyTemplate, &error);
+  XCTAssertNil(error);
+  XCTAssertNotNil(objcKeyTemplate);
+
+  XCTAssertTrue([kTypeURL isEqualToString:objcKeyTemplate.typeURL]);
+  XCTAssertEqual(objcKeyTemplate.outputPrefixType, TINKPBOutputPrefixType_Tink);
+  error = nil;
+  TINKPBHmacKeyFormat *keyFormat = [TINKPBHmacKeyFormat parseFromData:objcKeyTemplate.value
+                                                                error:&error];
+  XCTAssertNil(error);
+  XCTAssertNotNil(keyFormat);
+
+  XCTAssertEqual(keyFormat.keySize, 64);
+  XCTAssertEqual(keyFormat.params.tagSize, 32);
+  XCTAssertEqual(keyFormat.params.hash_p, TINKPBHashType_Sha512);
+}
+
+- (void)testHmac512BittagSha512 {
+  // Get a HmacSha512 key template.
+  NSError *error = nil;
+  TINKMacKeyTemplate *keyTemplate = [[TINKMacKeyTemplate alloc] initWithKeyTemplate:TINKHmacSha512
+                                                                              error:&error];
+  XCTAssertNil(error);
+  XCTAssertNotNil(keyTemplate);
+
+  TINKPBKeyTemplate *objcKeyTemplate = TINKKeyTemplateToObjc(keyTemplate.ccKeyTemplate, &error);
+  XCTAssertNil(error);
+  XCTAssertNotNil(objcKeyTemplate);
+
+  XCTAssertTrue([kTypeURL isEqualToString:objcKeyTemplate.typeURL]);
+  XCTAssertEqual(objcKeyTemplate.outputPrefixType, TINKPBOutputPrefixType_Tink);
+  error = nil;
+  TINKPBHmacKeyFormat *keyFormat = [TINKPBHmacKeyFormat parseFromData:objcKeyTemplate.value
+                                                                error:&error];
+  XCTAssertNil(error);
+  XCTAssertNotNil(keyFormat);
+
+  XCTAssertEqual(keyFormat.keySize, 64);
+  XCTAssertEqual(keyFormat.params.tagSize, 64);
+  XCTAssertEqual(keyFormat.params.hash_p, TINKPBHashType_Sha512);
+}
+
 @end
diff --git a/objc/Tests/UnitTests/signature/TINKPublicKeySignFactory.mm b/objc/Tests/UnitTests/signature/TINKPublicKeySignFactory.mm
index 1892dae..cba7ef0 100644
--- a/objc/Tests/UnitTests/signature/TINKPublicKeySignFactory.mm
+++ b/objc/Tests/UnitTests/signature/TINKPublicKeySignFactory.mm
@@ -33,14 +33,14 @@
 #include "tink/signature/ecdsa_sign_key_manager.h"
 #include "tink/signature/signature_config.h"
 #include "tink/util/status.h"
-#include "tink/util/keyset_util.h"
+#include "tink/util/test_keyset_handle.h"
 #include "tink/util/test_util.h"
 #include "proto/ecdsa.pb.h"
 #include "proto/tink.pb.h"
 
 using crypto::tink::EcdsaSignKeyManager;
 using crypto::tink::KeyFactory;
-using crypto::tink::KeysetUtil;
+using crypto::tink::TestKeysetHandle;
 using crypto::tink::test::AddRawKey;
 using crypto::tink::test::AddTinkKey;
 using google::crypto::tink::EcdsaPrivateKey;
@@ -64,7 +64,7 @@
 - (void)testEmptyKeyset {
   Keyset keyset;
   TINKKeysetHandle *handle =
-      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:KeysetUtil::GetKeysetHandle(keyset)];
+      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:TestKeysetHandle::GetKeysetHandle(keyset)];
   XCTAssertNotNil(handle);
 
   NSError *error = nil;
@@ -101,7 +101,7 @@
   XCTAssertNil(error);
 
   TINKKeysetHandle *handle =
-      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:KeysetUtil::GetKeysetHandle(keyset)];
+      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:TestKeysetHandle::GetKeysetHandle(keyset)];
   XCTAssertNotNil(handle);
 
   id<TINKPublicKeySign> publicKeySign =
diff --git a/objc/Tests/UnitTests/signature/TINKPublicKeyVerifyFactory.mm b/objc/Tests/UnitTests/signature/TINKPublicKeyVerifyFactory.mm
index 732acfa..1ff0505 100644
--- a/objc/Tests/UnitTests/signature/TINKPublicKeyVerifyFactory.mm
+++ b/objc/Tests/UnitTests/signature/TINKPublicKeyVerifyFactory.mm
@@ -36,7 +36,7 @@
 #include "tink/signature/ecdsa_sign_key_manager.h"
 #include "tink/signature/signature_config.h"
 #include "tink/util/status.h"
-#include "tink/util/keyset_util.h"
+#include "tink/util/test_keyset_handle.h"
 #include "tink/util/test_util.h"
 #include "proto/ecdsa.pb.h"
 #include "proto/tink.pb.h"
@@ -44,7 +44,7 @@
 using crypto::tink::EcdsaSignKeyManager;
 using google::crypto::tink::EcdsaSignatureEncoding;
 using crypto::tink::KeyFactory;
-using crypto::tink::KeysetUtil;
+using crypto::tink::TestKeysetHandle;
 using crypto::tink::test::AddRawKey;
 using crypto::tink::test::AddTinkKey;
 using google::crypto::tink::EcdsaPublicKey;
@@ -113,7 +113,7 @@
 - (void)testEmptyKeyset {
   Keyset keyset;
   TINKKeysetHandle *handle =
-      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:KeysetUtil::GetKeysetHandle(keyset)];
+      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:TestKeysetHandle::GetKeysetHandle(keyset)];
   XCTAssertNotNil(handle);
 
   NSError *error = nil;
@@ -131,12 +131,12 @@
   XCTAssertNotNil(signatureConfig);
   XCTAssertNil(error);
 
-  TINKKeysetHandle *handlePrivate =
-      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:KeysetUtil::GetKeysetHandle(privateKeyset)];
+  TINKKeysetHandle *handlePrivate = [[TINKKeysetHandle alloc]
+      initWithCCKeysetHandle:TestKeysetHandle::GetKeysetHandle(privateKeyset)];
   XCTAssertNotNil(handlePrivate);
 
-  TINKKeysetHandle *handlePublic =
-      [[TINKKeysetHandle alloc] initWithCCKeysetHandle:KeysetUtil::GetKeysetHandle(publicKeyset)];
+  TINKKeysetHandle *handlePublic = [[TINKKeysetHandle alloc]
+      initWithCCKeysetHandle:TestKeysetHandle::GetKeysetHandle(publicKeyset)];
   XCTAssertNotNil(handlePublic);
 
   id<TINKPublicKeySign> publicKeySign =
diff --git a/objc/Tests/UnitTests/signature/TINKSignatureConfigTest.mm b/objc/Tests/UnitTests/signature/TINKSignatureConfigTest.mm
deleted file mode 100644
index c82bc98..0000000
--- a/objc/Tests/UnitTests/signature/TINKSignatureConfigTest.mm
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- * Copyright 2018 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- **************************************************************************
- */
-
-#import "objc/TINKSignatureConfig.h"
-
-#import <XCTest/XCTest.h>
-
-#import "objc/TINKConfig.h"
-#import "objc/TINKRegistryConfig.h"
-#import "objc/core/TINKRegistryConfig_Internal.h"
-
-#include "tink/signature/signature_config.h"
-#include "proto/config.pb.h"
-
-@interface TINKSignatureConfigTest : XCTestCase
-@end
-
-@implementation TINKSignatureConfigTest
-
-- (void)testConfigContents {
-  NSError *error = nil;
-  TINKSignatureConfig *signatureConfig = [[TINKSignatureConfig alloc] initWithError:&error];
-  XCTAssertNotNil(signatureConfig);
-  XCTAssertNil(error);
-
-  google::crypto::tink::RegistryConfig config = signatureConfig.ccConfig;
-  XCTAssertEqual(config.entry_size(), 8);
-
-  std::string sign_key_type = "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey";
-  std::string verify_key_type = "type.googleapis.com/google.crypto.tink.EcdsaPublicKey";
-  XCTAssertTrue("TinkPublicKeySign" == config.entry(0).catalogue_name());
-  XCTAssertTrue("PublicKeySign" == config.entry(0).primitive_name());
-  XCTAssertTrue(sign_key_type == config.entry(0).type_url());
-  XCTAssertTrue(config.entry(0).new_key_allowed());
-  XCTAssertEqual(config.entry(0).key_manager_version(), 0);
-
-  XCTAssertTrue("TinkPublicKeyVerify" == config.entry(1).catalogue_name());
-  XCTAssertTrue("PublicKeyVerify" == config.entry(1).primitive_name());
-  XCTAssertTrue(verify_key_type == config.entry(1).type_url());
-  XCTAssertTrue(config.entry(1).new_key_allowed());
-  XCTAssertEqual(config.entry(1).key_manager_version(), 0);
-
-  sign_key_type = "type.googleapis.com/google.crypto.tink.Ed25519PrivateKey";
-  verify_key_type = "type.googleapis.com/google.crypto.tink.Ed25519PublicKey";
-  XCTAssertTrue("TinkPublicKeySign" == config.entry(2).catalogue_name());
-  XCTAssertTrue("PublicKeySign" == config.entry(2).primitive_name());
-  XCTAssertTrue(sign_key_type == config.entry(2).type_url());
-  XCTAssertTrue(config.entry(2).new_key_allowed());
-  XCTAssertEqual(config.entry(2).key_manager_version(), 0);
-
-  XCTAssertTrue("TinkPublicKeyVerify" == config.entry(3).catalogue_name());
-  XCTAssertTrue("PublicKeyVerify" == config.entry(3).primitive_name());
-  XCTAssertTrue(verify_key_type == config.entry(3).type_url());
-  XCTAssertTrue(config.entry(3).new_key_allowed());
-  XCTAssertEqual(config.entry(3).key_manager_version(), 0);
-
-  sign_key_type = "type.googleapis.com/google.crypto.tink.RsaSsaPssPrivateKey";
-  verify_key_type = "type.googleapis.com/google.crypto.tink.RsaSsaPssPublicKey";
-  XCTAssertTrue("TinkPublicKeySign" == config.entry(4).catalogue_name());
-  XCTAssertTrue("PublicKeySign" == config.entry(4).primitive_name());
-  XCTAssertTrue(sign_key_type == config.entry(4).type_url());
-  XCTAssertTrue(config.entry(4).new_key_allowed());
-  XCTAssertEqual(config.entry(4).key_manager_version(), 0);
-
-  XCTAssertTrue("TinkPublicKeyVerify" == config.entry(5).catalogue_name());
-  XCTAssertTrue("PublicKeyVerify" == config.entry(5).primitive_name());
-  XCTAssertTrue(verify_key_type == config.entry(5).type_url());
-  XCTAssertTrue(config.entry(5).new_key_allowed());
-  XCTAssertEqual(config.entry(5).key_manager_version(), 0);
-
-  sign_key_type = "type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PrivateKey";
-  verify_key_type = "type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PublicKey";
-  XCTAssertTrue("TinkPublicKeySign" == config.entry(6).catalogue_name());
-  XCTAssertTrue("PublicKeySign" == config.entry(6).primitive_name());
-  XCTAssertTrue(sign_key_type == config.entry(6).type_url());
-  XCTAssertTrue(config.entry(6).new_key_allowed());
-  XCTAssertEqual(config.entry(6).key_manager_version(), 0);
-
-  XCTAssertTrue("TinkPublicKeyVerify" == config.entry(7).catalogue_name());
-  XCTAssertTrue("PublicKeyVerify" == config.entry(7).primitive_name());
-  XCTAssertTrue(verify_key_type == config.entry(7).type_url());
-  XCTAssertTrue(config.entry(7).new_key_allowed());
-  XCTAssertEqual(config.entry(7).key_manager_version(), 0);
-
-  // Registration of standard key types works.
-  error = nil;
-  XCTAssertTrue([TINKConfig registerConfig:signatureConfig error:&error]);
-  XCTAssertNil(error);
-}
-
-@end
diff --git a/objc/aead/TINKAeadFactory.mm b/objc/aead/TINKAeadFactory.mm
index cb16f2f..94e2e0b 100644
--- a/objc/aead/TINKAeadFactory.mm
+++ b/objc/aead/TINKAeadFactory.mm
@@ -35,7 +35,7 @@
 + (id<TINKAead>)primitiveWithKeysetHandle:(TINKKeysetHandle *)keysetHandle error:(NSError **)error {
   crypto::tink::KeysetHandle *handle = [keysetHandle ccKeysetHandle];
 
-  auto st = crypto::tink::AeadFactory::GetPrimitive(*handle);
+  auto st = handle->GetPrimitive<crypto::tink::Aead>();
   if (!st.ok()) {
     if (error) {
       *error = TINKStatusToError(st.status());
diff --git a/objc/core/TINKKeysetHandle+Cleartext.mm b/objc/core/TINKKeysetHandle+Cleartext.mm
index 0adde45..c740e78 100644
--- a/objc/core/TINKKeysetHandle+Cleartext.mm
+++ b/objc/core/TINKKeysetHandle+Cleartext.mm
@@ -24,6 +24,7 @@
 #import "objc/core/TINKKeysetHandle_Internal.h"
 #import "objc/core/TINKKeysetReader_Internal.h"
 #import "objc/util/TINKErrors.h"
+#import "objc/util/TINKStrings.h"
 
 @implementation TINKKeysetHandle (Cleartext)
 
@@ -52,4 +53,9 @@
   return [[TINKKeysetHandle alloc] initWithCCKeysetHandle:std::move(st.ValueOrDie())];
 }
 
+- (NSData *)serializedKeyset {
+  auto keyset = crypto::tink::CleartextKeysetHandle::GetKeyset(*self.ccKeysetHandle);
+  return TINKStringToNSData(keyset.SerializeAsString());
+}
+
 @end
diff --git a/objc/core/TINKKeysetHandle.mm b/objc/core/TINKKeysetHandle.mm
index 354a16b..837a178 100644
--- a/objc/core/TINKKeysetHandle.mm
+++ b/objc/core/TINKKeysetHandle.mm
@@ -36,7 +36,6 @@
 #include "tink/binary_keyset_reader.h"
 #include "tink/cleartext_keyset_handle.h"
 #include "tink/keyset_handle.h"
-#include "tink/util/keyset_util.h"
 #include "tink/util/status.h"
 #include "proto/tink.pb.h"
 
@@ -154,7 +153,7 @@
         break;
       default:
         std::ostringstream oss;
-        oss << "An error occured while trying to retrieve the keyset from the keychain.";
+        oss << "An error occurred while trying to retrieve the keyset from the keychain.";
         oss << " Error code: " << status;
         errorMessage = oss.str();
         errorCode = crypto::tink::util::error::UNKNOWN;
@@ -209,7 +208,7 @@
   if (status != errSecSuccess && status != errSecItemNotFound) {
     if (error) {
       std::ostringstream oss;
-      oss << "An error occured while trying to delete the keyset from the keychain.";
+      oss << "An error occurred while trying to delete the keyset from the keychain.";
       oss << " Keychain error code: " << status;
       std::string errorMessage = oss.str();
       *error = TINKStatusToError(
@@ -232,7 +231,7 @@
     return NO;
   }
 
-  auto keyset = crypto::tink::KeysetUtil::GetKeyset(*self.ccKeysetHandle);
+  auto keyset = crypto::tink::CleartextKeysetHandle::GetKeyset(*self.ccKeysetHandle);
 
   std::string serializedKeyset;
   if (!keyset.SerializeToString(&serializedKeyset)) {
@@ -277,7 +276,7 @@
     default:
       if (error) {
         std::ostringstream oss;
-        oss << "An error occured while trying to store the keyset in the keychain.";
+        oss << "An error occurred while trying to store the keyset in the keychain.";
         oss << " Error code: " << status;
         std::string errorMessage = oss.str();
         *error = TINKStatusToError(
diff --git a/objc/hybrid/TINKHybridDecryptFactory.mm b/objc/hybrid/TINKHybridDecryptFactory.mm
index 08bb051..aae9d97 100644
--- a/objc/hybrid/TINKHybridDecryptFactory.mm
+++ b/objc/hybrid/TINKHybridDecryptFactory.mm
@@ -36,7 +36,7 @@
                                              error:(NSError **)error {
   crypto::tink::KeysetHandle *handle = [keysetHandle ccKeysetHandle];
 
-  auto st = crypto::tink::HybridDecryptFactory::GetPrimitive(*handle);
+  auto st = handle->GetPrimitive<crypto::tink::HybridDecrypt>();
   if (!st.ok()) {
     if (error) {
       *error = TINKStatusToError(st.status());
diff --git a/objc/hybrid/TINKHybridEncryptFactory.mm b/objc/hybrid/TINKHybridEncryptFactory.mm
index 0138e31..c8837cc 100644
--- a/objc/hybrid/TINKHybridEncryptFactory.mm
+++ b/objc/hybrid/TINKHybridEncryptFactory.mm
@@ -36,7 +36,7 @@
                                              error:(NSError **)error {
   crypto::tink::KeysetHandle *handle = [keysetHandle ccKeysetHandle];
 
-  auto st = crypto::tink::HybridEncryptFactory::GetPrimitive(*handle);
+  auto st = handle->GetPrimitive<crypto::tink::HybridEncrypt>();
   if (!st.ok()) {
     if (error) {
       *error = TINKStatusToError(st.status());
diff --git a/objc/mac/TINKMacFactory.mm b/objc/mac/TINKMacFactory.mm
index e162d48..ca4d2a4 100644
--- a/objc/mac/TINKMacFactory.mm
+++ b/objc/mac/TINKMacFactory.mm
@@ -35,7 +35,7 @@
 + (id<TINKMac>)primitiveWithKeysetHandle:(TINKKeysetHandle *)keysetHandle error:(NSError **)error {
   crypto::tink::KeysetHandle *handle = [keysetHandle ccKeysetHandle];
 
-  auto st = crypto::tink::MacFactory::GetPrimitive(*handle);
+  auto st = handle->GetPrimitive<crypto::tink::Mac>();
   if (!st.ok()) {
     if (error) {
       *error = TINKStatusToError(st.status());
diff --git a/objc/mac/TINKMacKeyTemplate.mm b/objc/mac/TINKMacKeyTemplate.mm
index cc075e5..7f3e232 100644
--- a/objc/mac/TINKMacKeyTemplate.mm
+++ b/objc/mac/TINKMacKeyTemplate.mm
@@ -40,6 +40,14 @@
       ccKeyTemplate = const_cast<google::crypto::tink::KeyTemplate *>(
           &crypto::tink::MacKeyTemplates::HmacSha256());
       break;
+    case TINKHmacSha512HalfSizeTag:
+      ccKeyTemplate = const_cast<google::crypto::tink::KeyTemplate *>(
+          &crypto::tink::MacKeyTemplates::HmacSha512HalfSizeTag());
+      break;
+    case TINKHmacSha512:
+      ccKeyTemplate = const_cast<google::crypto::tink::KeyTemplate *>(
+          &crypto::tink::MacKeyTemplates::HmacSha512());
+      break;
     default:
       if (error) {
         *error = TINKStatusToError(crypto::tink::util::Status(
diff --git a/objc/signature/TINKPublicKeySignFactory.mm b/objc/signature/TINKPublicKeySignFactory.mm
index 3b2ff52..d1796bd 100644
--- a/objc/signature/TINKPublicKeySignFactory.mm
+++ b/objc/signature/TINKPublicKeySignFactory.mm
@@ -36,7 +36,7 @@
                                              error:(NSError **)error {
   crypto::tink::KeysetHandle *handle = [keysetHandle ccKeysetHandle];
 
-  auto st = crypto::tink::PublicKeySignFactory::GetPrimitive(*handle);
+  auto st = handle->GetPrimitive<crypto::tink::PublicKeySign>();
   if (!st.ok()) {
     if (error) {
       *error = TINKStatusToError(st.status());
diff --git a/objc/signature/TINKPublicKeyVerifyFactory.mm b/objc/signature/TINKPublicKeyVerifyFactory.mm
index e2a06df..dd5e9e0 100644
--- a/objc/signature/TINKPublicKeyVerifyFactory.mm
+++ b/objc/signature/TINKPublicKeyVerifyFactory.mm
@@ -36,7 +36,7 @@
                                                error:(NSError **)error {
   crypto::tink::KeysetHandle *handle = [keysetHandle ccKeysetHandle];
 
-  auto st = crypto::tink::PublicKeyVerifyFactory::GetPrimitive(*handle);
+  auto st = handle->GetPrimitive<crypto::tink::PublicKeyVerify>();
   if (!st.ok()) {
     if (error) {
       *error = TINKStatusToError(st.status());
diff --git a/objc/util/BUILD.bazel b/objc/util/BUILD.bazel
index 3fb052f..a067b5d 100644
--- a/objc/util/BUILD.bazel
+++ b/objc/util/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 objc_library(
     name = "errors",
diff --git a/proto/BUILD.bazel b/proto/BUILD.bazel
index c227b96..a3aa7c0 100644
--- a/proto/BUILD.bazel
+++ b/proto/BUILD.bazel
@@ -2,8 +2,9 @@
 
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
+load("@io_bazel_rules_closure//closure:defs.bzl", "closure_proto_library")
 load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
 load("//third_party/rules_protobuf/objc:rules.bzl", "objc_proto_compile")
 load("//tools:objc.bzl", "tink_objc_proto_library")
@@ -33,6 +34,11 @@
     deps = [":common_proto"],
 )
 
+closure_proto_library(
+    name = "common_closure_proto",
+    deps = [":common_proto"],
+)
+
 go_proto_library(
     name = "common_go_proto",
     importpath = "github.com/google/tink/proto/common_go_proto",
@@ -73,6 +79,11 @@
     deps = [":tink_proto"],
 )
 
+closure_proto_library(
+    name = "tink_closure_proto",
+    deps = [":tink_proto"],
+)
+
 go_proto_library(
     name = "tink_go_proto",
     importpath = "github.com/google/tink/proto/tink_go_proto",
@@ -280,6 +291,11 @@
     deps = [":ecdsa_proto"],
 )
 
+closure_proto_library(
+    name = "ecdsa_closure_proto",
+    deps = [":ecdsa_proto"],
+)
+
 go_proto_library(
     name = "ecdsa_go_proto",
     importpath = "github.com/google/tink/proto/ecdsa_go_proto",
@@ -332,6 +348,51 @@
 )
 
 # -----------------------------------------------
+# aes_cmac
+# -----------------------------------------------
+proto_library(
+    name = "aes_cmac_proto",
+    srcs = [
+        "aes_cmac.proto",
+    ],
+    deps = [],
+)
+
+cc_proto_library(
+    name = "aes_cmac_cc_proto",
+    deps = [":aes_cmac_proto"],
+)
+
+java_proto_library(
+    name = "aes_cmac_java_proto",
+    deps = [":aes_cmac_proto"],
+)
+
+java_lite_proto_library(
+    name = "aes_cmac_java_proto_lite",
+    deps = [":aes_cmac_proto"],
+)
+
+closure_proto_library(
+    name = "aes_cmac_closure_proto",
+    deps = [":aes_cmac_proto"],
+)
+
+go_proto_library(
+    name = "aes_cmac_go_proto",
+    importpath = "github.com/google/tink/proto/aes_cmac_go_proto",
+    proto = ":aes_cmac_proto",
+    deps = [],
+)
+
+objc_proto_compile(
+    name = "aes_cmac_objc_pb",
+    protos = ["aes_cmac.proto"],
+    tags = ["manual"],
+    deps = [],
+)
+
+# -----------------------------------------------
 # hmac
 # -----------------------------------------------
 proto_library(
@@ -357,6 +418,11 @@
     deps = [":hmac_proto"],
 )
 
+closure_proto_library(
+    name = "hmac_closure_proto",
+    deps = [":hmac_proto"],
+)
+
 go_proto_library(
     name = "hmac_go_proto",
     importpath = "github.com/google/tink/proto/hmac_go_proto",
@@ -396,6 +462,11 @@
     deps = [":aes_ctr_proto"],
 )
 
+closure_proto_library(
+    name = "aes_ctr_closure_proto",
+    deps = [":aes_ctr_proto"],
+)
+
 go_proto_library(
     name = "aes_ctr_go_proto",
     importpath = "github.com/google/tink/proto/aes_ctr_go_proto",
@@ -437,6 +508,11 @@
     deps = [":aes_ctr_hmac_aead_proto"],
 )
 
+closure_proto_library(
+    name = "aes_ctr_hmac_aead_closure_proto",
+    deps = [":aes_ctr_hmac_aead_proto"],
+)
+
 go_proto_library(
     name = "aes_ctr_hmac_aead_go_proto",
     importpath = "github.com/google/tink/proto/aes_ctr_hmac_aead_go_proto",
@@ -482,6 +558,11 @@
     deps = [":aes_gcm_proto"],
 )
 
+closure_proto_library(
+    name = "aes_gcm_closure_proto",
+    deps = [":aes_gcm_proto"],
+)
+
 go_proto_library(
     name = "aes_gcm_go_proto",
     importpath = "github.com/google/tink/proto/aes_gcm_go_proto",
@@ -495,6 +576,48 @@
 )
 
 # -----------------------------------------------
+# aes_gcm_siv
+# -----------------------------------------------
+proto_library(
+    name = "aes_gcm_siv_proto",
+    srcs = [
+        "aes_gcm_siv.proto",
+    ],
+)
+
+cc_proto_library(
+    name = "aes_gcm_siv_cc_proto",
+    deps = [":aes_gcm_siv_proto"],
+)
+
+java_proto_library(
+    name = "aes_gcm_siv_java_proto",
+    deps = [":aes_gcm_siv_proto"],
+)
+
+java_lite_proto_library(
+    name = "aes_gcm_siv_java_proto_lite",
+    deps = [":aes_gcm_siv_proto"],
+)
+
+closure_proto_library(
+    name = "aes_gcm_siv_closure_proto",
+    deps = [":aes_gcm_siv_proto"],
+)
+
+go_proto_library(
+    name = "aes_gcm_siv_go_proto",
+    importpath = "github.com/google/tink/proto/aes_gcm_siv_go_proto",
+    proto = ":aes_gcm_siv_proto",
+)
+
+objc_proto_compile(
+    name = "aes_gcm_siv_objc_pb",
+    protos = ["aes_gcm_siv.proto"],
+    tags = ["manual"],
+)
+
+# -----------------------------------------------
 # aes_ctr_hmac_streaming
 # -----------------------------------------------
 proto_library(
@@ -763,6 +886,11 @@
     deps = [":ecies_aead_hkdf_proto"],
 )
 
+closure_proto_library(
+    name = "ecies_aead_hkdf_closure_proto",
+    deps = [":ecies_aead_hkdf_proto"],
+)
+
 go_proto_library(
     name = "ecies_aead_hkdf_go_proto",
     importpath = "github.com/google/tink/proto/ecies_aead_hkdf_go_proto",
@@ -845,6 +973,11 @@
     deps = [":empty_proto"],
 )
 
+closure_proto_library(
+    name = "empty_closure_proto",
+    deps = [":empty_proto"],
+)
+
 go_proto_library(
     name = "empty_go_proto",
     importpath = "github.com/google/tink/proto/empty_go_proto",
diff --git a/proto/BUILD.gn b/proto/BUILD.gn
index ebe4564..2dd0e76 100644
--- a/proto/BUILD.gn
+++ b/proto/BUILD.gn
@@ -38,6 +38,14 @@
   deps = [ ":common_proto" ]
 }
 
+# Proto Library : aes_cmac_proto
+proto_library("aes_cmac_proto") {
+  cc_generator_options = "lite"
+  proto_in_dir = "//third_party/tink"
+  extra_configs = [ "//third_party/tink:tink_config" ]
+  sources = [ "aes_cmac.proto" ]
+}
+
 # Proto Library : hmac_proto
 proto_library("hmac_proto") {
   cc_generator_options = "lite"
@@ -75,6 +83,14 @@
   sources = [ "aes_gcm.proto" ]
 }
 
+# Proto Library : aes_gcm_siv_proto
+proto_library("aes_gcm_siv_proto") {
+  cc_generator_options = "lite"
+  proto_in_dir = "//third_party/tink"
+  extra_configs = [ "//third_party/tink:tink_config" ]
+  sources = [ "aes_gcm_siv.proto" ]
+}
+
 # Proto Library : aes_eax_proto
 proto_library("aes_eax_proto") {
   cc_generator_options = "lite"
@@ -83,6 +99,23 @@
   sources = [ "aes_eax.proto" ]
 }
 
+# Proto Library : kms_aead_proto
+proto_library("kms_aead_proto") {
+  cc_generator_options = "lite"
+  proto_in_dir = "//third_party/tink"
+  extra_configs = [ "//third_party/tink:tink_config" ]
+  sources = [ "kms_aead.proto" ]
+}
+
+# Proto Library : kms_envelope_proto
+proto_library("kms_envelope_proto") {
+  cc_generator_options = "lite"
+  proto_in_dir = "//third_party/tink"
+  extra_configs = [ "//third_party/tink:tink_config" ]
+  sources = [ "kms_envelope.proto" ]
+  deps = [ ":tink_proto" ]
+}
+
 # Proto Library : ecies_aead_hkdf_proto
 proto_library("ecies_aead_hkdf_proto") {
   cc_generator_options = "lite"
@@ -103,11 +136,3 @@
   sources = [ "xchacha20_poly1305.proto" ]
 }
 
-# Proto Library : empty_proto
-proto_library("empty_proto") {
-  cc_generator_options = "lite"
-  proto_in_dir = "//third_party/tink"
-  extra_configs = [ "//third_party/tink:tink_config" ]
-  sources = [ "empty.proto" ]
-}
-
diff --git a/proto/CMakeLists.txt b/proto/CMakeLists.txt
new file mode 100644
index 0000000..0b1c179
--- /dev/null
+++ b/proto/CMakeLists.txt
@@ -0,0 +1,139 @@
+tink_module(proto)
+
+tink_cc_proto(
+  NAME common_cc_proto
+  SRCS common.proto
+)
+
+tink_cc_proto(
+  NAME tink_cc_proto
+  SRCS tink.proto
+  DEPS tink::proto::common_cc_proto
+)
+
+tink_cc_proto(
+  NAME config_cc_proto
+  SRCS config.proto
+)
+
+tink_cc_proto(
+  NAME aes_siv_cc_proto
+  SRCS aes_siv.proto
+)
+
+tink_cc_proto(
+  NAME rsa_ssa_pkcs1_cc_proto
+  SRCS rsa_ssa_pkcs1.proto
+  DEPS tink::proto::common_cc_proto
+)
+
+tink_cc_proto(
+  NAME rsa_ssa_pss_cc_proto
+  SRCS rsa_ssa_pss.proto
+  DEPS tink::proto::common_cc_proto
+)
+
+tink_cc_proto(
+  NAME ecdsa_cc_proto
+  SRCS ecdsa.proto
+  DEPS tink::proto::common_cc_proto
+)
+
+tink_cc_proto(
+  NAME ed25519_cc_proto
+  SRCS ed25519.proto
+)
+
+tink_cc_proto(
+  NAME aes_cmac_cc_proto
+  SRCS aes_cmac.proto
+)
+
+tink_cc_proto(
+  NAME hmac_cc_proto
+  SRCS hmac.proto
+  DEPS tink::proto::common_cc_proto
+)
+
+tink_cc_proto(
+  NAME aes_ctr_cc_proto
+  SRCS aes_ctr.proto
+)
+
+tink_cc_proto(
+  NAME aes_ctr_hmac_aead_cc_proto
+  SRCS aes_ctr_hmac_aead.proto
+  DEPS
+    tink::proto::aes_ctr_cc_proto
+    tink::proto::hmac_cc_proto
+)
+
+tink_cc_proto(
+  NAME aes_gcm_cc_proto
+  SRCS aes_gcm.proto
+)
+
+tink_cc_proto(
+  NAME aes_gcm_siv_cc_proto
+  SRCS aes_gcm_siv.proto
+)
+
+tink_cc_proto(
+  NAME aes_ctr_hmac_streaming_cc_proto
+  SRCS aes_ctr_hmac_streaming.proto
+  DEPS
+    tink::proto::common_cc_proto
+    tink::proto::hmac_cc_proto
+)
+
+tink_cc_proto(
+  NAME aes_gcm_hkdf_streaming_cc_proto
+  SRCS aes_gcm_hkdf_streaming.proto
+  DEPS tink::proto::common_cc_proto
+)
+
+tink_cc_proto(
+  NAME aes_eax_cc_proto
+  SRCS aes_eax.proto
+)
+
+tink_cc_proto(
+  NAME chacha20_poly1305_cc_proto
+  SRCS chacha20_poly1305.proto
+)
+
+tink_cc_proto(
+  NAME kms_aead_cc_proto
+  SRCS kms_aead.proto
+)
+
+tink_cc_proto(
+  NAME kms_envelope_cc_proto
+  SRCS kms_envelope.proto
+  DEPS tink::proto::tink_cc_proto
+)
+
+tink_cc_proto(
+  NAME ecies_aead_hkdf_cc_proto
+  SRCS ecies_aead_hkdf.proto
+  DEPS
+    tink::proto::common_cc_proto
+    tink::proto::tink_cc_proto
+)
+
+tink_cc_proto(
+  NAME xchacha20_poly1305_cc_proto
+  SRCS xchacha20_poly1305.proto
+)
+
+tink_cc_proto(
+  NAME empty_cc_proto
+  SRCS empty.proto
+)
+
+tink_target_group(
+  NAME public_protos_cc_proto
+  DEPS
+    tink::proto::config_cc_proto
+    tink::proto::tink_cc_proto
+)
diff --git a/proto/README.md b/proto/README.md
deleted file mode 100644
index 17b6d08..0000000
--- a/proto/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-This folder contains protobuf definitions.
-
-The subfolders (e.g., aes_gcm_go_proto) contain Go auto-generated code of the
-protobuf definitions. These files facilitate using `go get` to install the Tink
-library. This is only applicable outside of google3. To update them, execute the
-following script:
-
-```shell
-$ g4d tink
-$ ./third_party/tink/tools/gen_pb_go.sh
-```
-
-The script performs a Blaze query for the current Go proto dependencies,
-generates the required files.
diff --git a/proto/aes_cmac.proto b/proto/aes_cmac.proto
new file mode 100644
index 0000000..ee150c4
--- /dev/null
+++ b/proto/aes_cmac.proto
@@ -0,0 +1,40 @@
+// Copyright 2017 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+syntax = "proto3";
+
+package google.crypto.tink;
+
+option java_package = "com.google.crypto.tink.proto";
+option java_multiple_files = true;
+option objc_class_prefix = "TINKPB";
+option go_package = "github.com/google/tink/proto/aes_cmac_go_proto";
+
+message AesCmacParams {
+  uint32 tag_size = 1;
+}
+
+// key_type: type.googleapis.com/google.crypto.tink.AesCmacKey
+message AesCmacKey {
+  uint32 version = 1;
+  bytes key_value = 2;
+  AesCmacParams params = 3;
+}
+
+message AesCmacKeyFormat {
+  uint32 key_size = 1;
+  AesCmacParams params = 2;
+}
diff --git a/proto/aes_ctr_go_proto/aes_ctr.pb.go b/proto/aes_ctr_go_proto/aes_ctr.pb.go
index 30518d7..42e125e 100644
--- a/proto/aes_ctr_go_proto/aes_ctr.pb.go
+++ b/proto/aes_ctr_go_proto/aes_ctr.pb.go
@@ -34,7 +34,7 @@
 // is compatible with the proto package it is being compiled against.
 // A compilation error at this line likely means your copy of the
 // proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
 
 type AesCtrParams struct {
 	IvSize               uint32   `protobuf:"varint,1,opt,name=iv_size,json=ivSize,proto3" json:"iv_size,omitempty"`
diff --git a/proto/aes_ctr_hmac_aead_go_proto/aes_ctr_hmac_aead.pb.go b/proto/aes_ctr_hmac_aead_go_proto/aes_ctr_hmac_aead.pb.go
index a8c74e7..8609672 100644
--- a/proto/aes_ctr_hmac_aead_go_proto/aes_ctr_hmac_aead.pb.go
+++ b/proto/aes_ctr_hmac_aead_go_proto/aes_ctr_hmac_aead.pb.go
@@ -36,7 +36,7 @@
 // is compatible with the proto package it is being compiled against.
 // A compilation error at this line likely means your copy of the
 // proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
 
 type AesCtrHmacAeadKeyFormat struct {
 	AesCtrKeyFormat      *aes_ctr_go_proto.AesCtrKeyFormat `protobuf:"bytes,1,opt,name=aes_ctr_key_format,json=aesCtrKeyFormat,proto3" json:"aes_ctr_key_format,omitempty"`
diff --git a/proto/aes_gcm_siv.proto b/proto/aes_gcm_siv.proto
new file mode 100644
index 0000000..2824a54
--- /dev/null
+++ b/proto/aes_gcm_siv.proto
@@ -0,0 +1,36 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+syntax = "proto3";
+
+package google.crypto.tink;
+
+option java_package = "com.google.crypto.tink.proto";
+option java_multiple_files = true;
+option objc_class_prefix = "TINKPB";
+option go_package = "github.com/google/tink/proto/aes_gcm_siv_go_proto";
+
+// The only allowed IV size is 12 bytes and tag size is 16 bytes.
+// Thus, accept no params.
+message AesGcmSivKeyFormat {
+  uint32 key_size = 2;
+}
+
+// key_type: type.googleapis.com/google.crypto.tink.AesGcmSivKey
+message AesGcmSivKey {
+  uint32 version = 1;
+  bytes key_value = 3;
+}
diff --git a/proto/aes_siv_go_proto/aes_siv.pb.go b/proto/aes_siv_go_proto/aes_siv.pb.go
index 2159fa9..f3bcd3e 100644
--- a/proto/aes_siv_go_proto/aes_siv.pb.go
+++ b/proto/aes_siv_go_proto/aes_siv.pb.go
@@ -34,7 +34,7 @@
 // is compatible with the proto package it is being compiled against.
 // A compilation error at this line likely means your copy of the
 // proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
 
 type AesSivKeyFormat struct {
 	// Only valid value is: 64.
diff --git a/proto/chacha20_poly1305.proto b/proto/chacha20_poly1305.proto
index 4b3e86e..57ec1ca 100644
--- a/proto/chacha20_poly1305.proto
+++ b/proto/chacha20_poly1305.proto
@@ -23,6 +23,8 @@
 option objc_class_prefix = "TINKPB";
 option go_package = "github.com/google/tink/proto/chacha20_poly1305_go_proto";
 
+message ChaCha20Poly1305KeyFormat {}
+
 // key_type: type.googleapis.com/google.crypto.tink.ChaCha20Poly1305.
 // This key type actually implements ChaCha20Poly1305 as described
 // at https://tools.ietf.org/html/rfc7539#section-2.8.
diff --git a/proto/common.proto b/proto/common.proto
index 393e415..2c640a9 100644
--- a/proto/common.proto
+++ b/proto/common.proto
@@ -29,7 +29,8 @@
   NIST_P256 = 2;
   NIST_P384 = 3;
   NIST_P521 = 4;
-};
+  CURVE25519 = 5;
+}
 
 enum EcPointFormat {
   UNKNOWN_FORMAT = 0;
@@ -42,7 +43,9 @@
 
 enum HashType {
   UNKNOWN_HASH = 0;
-  SHA1 = 1; // Using SHA1 for digital signature is deprecated but HMAC-SHA1 is fine.
+  SHA1 = 1;  // Using SHA1 for digital signature is deprecated but HMAC-SHA1 is
+             // fine.
+  SHA384 = 2;
   SHA256 = 3;
   SHA512 = 4;
-};
+}
diff --git a/proto/common_go_proto/common.pb.go b/proto/common_go_proto/common.pb.go
index cea8886..5cac6a4 100644
--- a/proto/common_go_proto/common.pb.go
+++ b/proto/common_go_proto/common.pb.go
@@ -105,6 +105,7 @@
 const (
 	HashType_UNKNOWN_HASH HashType = 0
 	HashType_SHA1         HashType = 1
+	HashType_SHA384       HashType = 2
 	HashType_SHA256       HashType = 3
 	HashType_SHA512       HashType = 4
 )
@@ -112,6 +113,7 @@
 var HashType_name = map[int32]string{
 	0: "UNKNOWN_HASH",
 	1: "SHA1",
+	2: "SHA384",
 	3: "SHA256",
 	4: "SHA512",
 }
@@ -119,6 +121,7 @@
 var HashType_value = map[string]int32{
 	"UNKNOWN_HASH": 0,
 	"SHA1":         1,
+	"SHA384":       2,
 	"SHA256":       3,
 	"SHA512":       4,
 }
@@ -142,25 +145,25 @@
 }
 
 var fileDescriptor_51c37496ff2054f5 = []byte{
-	// 311 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x90, 0x4d, 0x6b, 0xf2, 0x40,
-	0x14, 0x85, 0xfd, 0x42, 0x7c, 0x2f, 0xaf, 0x32, 0xce, 0xba, 0xd0, 0x85, 0x3b, 0x29, 0x09, 0x6a,
-	0x2d, 0x5d, 0x15, 0x62, 0x8c, 0x44, 0xc4, 0x49, 0xc8, 0x24, 0x95, 0x76, 0x33, 0xe8, 0x54, 0xe2,
-	0xb4, 0xc6, 0x1b, 0xa6, 0x63, 0xc1, 0xbf, 0xd3, 0x5f, 0x5a, 0x8c, 0x2d, 0xb6, 0xb8, 0x9b, 0x07,
-	0xce, 0x9c, 0x7b, 0x78, 0xa0, 0x63, 0x36, 0x4a, 0xbf, 0x88, 0x7c, 0xa9, 0xcd, 0xc1, 0x36, 0x6a,
-	0xf7, 0x66, 0xe7, 0x1a, 0x0d, 0xda, 0x12, 0xb3, 0x0c, 0x77, 0x56, 0x01, 0x94, 0xa6, 0x88, 0xe9,
-	0x76, 0x6d, 0x49, 0x7d, 0xc8, 0x0d, 0x5a, 0xc7, 0x58, 0x97, 0x43, 0xdb, 0xdb, 0x6e, 0x55, 0x6e,
-	0x94, 0x74, 0xf7, 0xfa, 0x63, 0x1d, 0x1f, 0xf2, 0x35, 0x6d, 0x43, 0x33, 0x61, 0x33, 0x16, 0x2c,
-	0x98, 0x70, 0x93, 0xe8, 0xd1, 0x23, 0x25, 0xda, 0x84, 0x7f, 0x6c, 0xca, 0x63, 0x11, 0xf6, 0x87,
-	0x77, 0xa4, 0x72, 0xc6, 0xc1, 0xfd, 0x2d, 0xa9, 0x9e, 0x71, 0xd8, 0xef, 0x91, 0x5a, 0xf7, 0x15,
-	0x9a, 0x9e, 0x0c, 0x51, 0xed, 0xcc, 0x04, 0x75, 0xb6, 0x34, 0x94, 0x42, 0xeb, 0xa7, 0x70, 0x12,
-	0x44, 0x73, 0x27, 0x26, 0x25, 0x4a, 0xe0, 0x7f, 0xc2, 0xdc, 0x60, 0x1e, 0x46, 0x1e, 0xe7, 0xde,
-	0x98, 0x94, 0x69, 0x0b, 0xe0, 0x17, 0x57, 0x68, 0x07, 0xae, 0xc7, 0x81, 0x60, 0x41, 0x2c, 0x12,
-	0xee, 0x09, 0x37, 0x4a, 0x98, 0xeb, 0x3f, 0x89, 0x3f, 0x9f, 0xaa, 0xdd, 0x07, 0x68, 0xf8, 0xcb,
-	0xf7, 0x4d, 0xb1, 0xbb, 0xa8, 0x3c, 0x9d, 0xf1, 0x1d, 0xee, 0x93, 0x12, 0x6d, 0x40, 0x8d, 0xfb,
-	0x4e, 0x8f, 0x94, 0x29, 0x40, 0x9d, 0xfb, 0xce, 0x71, 0x7d, 0xf5, 0xfb, 0x3d, 0xec, 0xf5, 0x49,
-	0x6d, 0xb4, 0x80, 0x2b, 0x89, 0x99, 0x75, 0xa9, 0xe6, 0x24, 0x2d, 0x2c, 0x3f, 0xdf, 0xa4, 0xca,
-	0x6c, 0xf6, 0x2b, 0x4b, 0x62, 0x66, 0x9f, 0x62, 0x97, 0x86, 0x45, 0x8a, 0xa2, 0xe0, 0xcf, 0x4a,
-	0x3d, 0x9e, 0xb2, 0x59, 0x38, 0x5a, 0xd5, 0x0b, 0x1e, 0x7c, 0x05, 0x00, 0x00, 0xff, 0xff, 0xd6,
-	0x07, 0x9b, 0xdc, 0x9b, 0x01, 0x00, 0x00,
+	// 314 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x90, 0x41, 0x6b, 0xc2, 0x40,
+	0x14, 0x84, 0x35, 0x8a, 0xd8, 0x47, 0x95, 0x75, 0xcf, 0x85, 0x1e, 0xbc, 0x49, 0x49, 0x50, 0x6b,
+	0xe9, 0x35, 0xc6, 0x48, 0xac, 0xb8, 0x09, 0xd9, 0xa4, 0xd2, 0x5e, 0x16, 0x4d, 0x25, 0x6e, 0x6b,
+	0x7c, 0x61, 0xbb, 0x16, 0xfc, 0x3b, 0xfd, 0xa5, 0xc5, 0x68, 0xb1, 0xc5, 0xdb, 0x7c, 0x30, 0x3b,
+	0x3b, 0x6f, 0xa0, 0xad, 0xd7, 0x52, 0xbd, 0x89, 0x7c, 0xa1, 0xf4, 0xde, 0xd2, 0x72, 0xfb, 0x61,
+	0xe5, 0x0a, 0x35, 0x5a, 0x09, 0x66, 0x19, 0x6e, 0xcd, 0x02, 0x28, 0x4d, 0x11, 0xd3, 0xcd, 0xca,
+	0x4c, 0xd4, 0x3e, 0xd7, 0x68, 0x1e, 0x6c, 0x1d, 0x0e, 0x2d, 0x77, 0xb3, 0x91, 0xb9, 0x96, 0x89,
+	0xb3, 0x53, 0x5f, 0xab, 0x68, 0x9f, 0xaf, 0x68, 0x0b, 0x1a, 0x31, 0x9b, 0x32, 0x7f, 0xce, 0x84,
+	0x13, 0x87, 0xcf, 0x2e, 0x29, 0xd1, 0x06, 0x5c, 0xb1, 0x09, 0x8f, 0x44, 0xd0, 0x1b, 0x3c, 0x10,
+	0xe3, 0x8c, 0xfd, 0xc7, 0x7b, 0x52, 0x39, 0xe3, 0xa0, 0xd7, 0x25, 0xd5, 0xce, 0x3b, 0x34, 0xdc,
+	0x24, 0x40, 0xb9, 0xd5, 0x63, 0x54, 0xd9, 0x42, 0x53, 0x0a, 0xcd, 0xdf, 0xc0, 0xb1, 0x1f, 0xce,
+	0xec, 0x88, 0x94, 0x28, 0x81, 0xeb, 0x98, 0x39, 0xfe, 0x2c, 0x08, 0x5d, 0xce, 0xdd, 0x11, 0x29,
+	0xd3, 0x26, 0xc0, 0x1f, 0x36, 0x68, 0x1b, 0x6e, 0x47, 0xbe, 0x60, 0x7e, 0x24, 0x62, 0xee, 0x0a,
+	0x27, 0x8c, 0x99, 0xe3, 0xbd, 0x88, 0x7f, 0x8f, 0x2a, 0x9d, 0x27, 0xa8, 0x7b, 0x8b, 0xcf, 0x75,
+	0xd1, 0xbb, 0x88, 0x3c, 0x7e, 0xe3, 0xd9, 0xdc, 0x23, 0x25, 0x5a, 0x87, 0x2a, 0xf7, 0xec, 0x2e,
+	0x29, 0x53, 0x80, 0x1a, 0xf7, 0xec, 0x43, 0x5d, 0xe3, 0xa4, 0x0f, 0x97, 0x54, 0x4e, 0x7a, 0xd0,
+	0xed, 0x91, 0xea, 0x70, 0x0e, 0x37, 0x09, 0x66, 0xe6, 0xe5, 0x4c, 0xc7, 0x01, 0x83, 0xf2, 0xeb,
+	0x5d, 0x2a, 0xf5, 0x7a, 0xb7, 0x34, 0x13, 0xcc, 0xac, 0xa3, 0xed, 0x72, 0x6d, 0x91, 0xa2, 0x28,
+	0xf8, 0xdb, 0xa8, 0x45, 0x13, 0x36, 0x0d, 0x86, 0xcb, 0x5a, 0xc1, 0xfd, 0x9f, 0x00, 0x00, 0x00,
+	0xff, 0xff, 0x7a, 0x9b, 0x0f, 0x8e, 0xa7, 0x01, 0x00, 0x00,
 }
diff --git a/proto/config.proto b/proto/config.proto
index ebd3b46..4017053 100644
--- a/proto/config.proto
+++ b/proto/config.proto
@@ -28,6 +28,9 @@
 // specifying the corresponding primitive, key manager, and deprecation status.
 // All fields are required.
 message KeyTypeEntry {
+  // KeyTypeEntry is no longer supported.
+  option deprecated = true;
+
   string primitive_name = 1;       // E.g. “Aead”, “Mac”, ... (case-insensitive)
   string type_url = 2;             // Name of the key type.
   uint32 key_manager_version = 3;  // Minimum required version of key manager.
@@ -40,6 +43,9 @@
 // to be available via the Registry after initialization.
 // All fields are required.
 message RegistryConfig {
+  // RegistryConfig is no longer supported.
+  option deprecated = true;
+
   string config_name = 1;
   repeated KeyTypeEntry entry = 2;
 }
diff --git a/proto/ecies_aead_hkdf_go_proto/ecies_aead_hkdf.pb.go b/proto/ecies_aead_hkdf_go_proto/ecies_aead_hkdf.pb.go
new file mode 100644
index 0000000..80db5b9
--- /dev/null
+++ b/proto/ecies_aead_hkdf_go_proto/ecies_aead_hkdf.pb.go
@@ -0,0 +1,421 @@
+// Copyright 2018 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: third_party/tink/proto/ecies_aead_hkdf.proto
+
+package ecies_aead_hkdf_go_proto
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	common_go_proto "github.com/google/tink/proto/common_go_proto"
+	tink_go_proto "github.com/google/tink/proto/tink_go_proto"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Parameters of KEM (Key Encapsulation Mechanism)
+type EciesHkdfKemParams struct {
+	// Required.
+	CurveType common_go_proto.EllipticCurveType `protobuf:"varint,1,opt,name=curve_type,json=curveType,proto3,enum=google.crypto.tink.EllipticCurveType" json:"curve_type,omitempty"`
+	// Required.
+	HkdfHashType common_go_proto.HashType `protobuf:"varint,2,opt,name=hkdf_hash_type,json=hkdfHashType,proto3,enum=google.crypto.tink.HashType" json:"hkdf_hash_type,omitempty"`
+	// Optional.
+	HkdfSalt             []byte   `protobuf:"bytes,11,opt,name=hkdf_salt,json=hkdfSalt,proto3" json:"hkdf_salt,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *EciesHkdfKemParams) Reset()         { *m = EciesHkdfKemParams{} }
+func (m *EciesHkdfKemParams) String() string { return proto.CompactTextString(m) }
+func (*EciesHkdfKemParams) ProtoMessage()    {}
+func (*EciesHkdfKemParams) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a8ddf7d5f8978761, []int{0}
+}
+
+func (m *EciesHkdfKemParams) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EciesHkdfKemParams.Unmarshal(m, b)
+}
+func (m *EciesHkdfKemParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EciesHkdfKemParams.Marshal(b, m, deterministic)
+}
+func (m *EciesHkdfKemParams) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EciesHkdfKemParams.Merge(m, src)
+}
+func (m *EciesHkdfKemParams) XXX_Size() int {
+	return xxx_messageInfo_EciesHkdfKemParams.Size(m)
+}
+func (m *EciesHkdfKemParams) XXX_DiscardUnknown() {
+	xxx_messageInfo_EciesHkdfKemParams.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EciesHkdfKemParams proto.InternalMessageInfo
+
+func (m *EciesHkdfKemParams) GetCurveType() common_go_proto.EllipticCurveType {
+	if m != nil {
+		return m.CurveType
+	}
+	return common_go_proto.EllipticCurveType_UNKNOWN_CURVE
+}
+
+func (m *EciesHkdfKemParams) GetHkdfHashType() common_go_proto.HashType {
+	if m != nil {
+		return m.HkdfHashType
+	}
+	return common_go_proto.HashType_UNKNOWN_HASH
+}
+
+func (m *EciesHkdfKemParams) GetHkdfSalt() []byte {
+	if m != nil {
+		return m.HkdfSalt
+	}
+	return nil
+}
+
+// Parameters of AEAD DEM (Data Encapsulation Mechanism).
+type EciesAeadDemParams struct {
+	// Required.
+	AeadDem              *tink_go_proto.KeyTemplate `protobuf:"bytes,2,opt,name=aead_dem,json=aeadDem,proto3" json:"aead_dem,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
+	XXX_unrecognized     []byte                     `json:"-"`
+	XXX_sizecache        int32                      `json:"-"`
+}
+
+func (m *EciesAeadDemParams) Reset()         { *m = EciesAeadDemParams{} }
+func (m *EciesAeadDemParams) String() string { return proto.CompactTextString(m) }
+func (*EciesAeadDemParams) ProtoMessage()    {}
+func (*EciesAeadDemParams) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a8ddf7d5f8978761, []int{1}
+}
+
+func (m *EciesAeadDemParams) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EciesAeadDemParams.Unmarshal(m, b)
+}
+func (m *EciesAeadDemParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EciesAeadDemParams.Marshal(b, m, deterministic)
+}
+func (m *EciesAeadDemParams) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EciesAeadDemParams.Merge(m, src)
+}
+func (m *EciesAeadDemParams) XXX_Size() int {
+	return xxx_messageInfo_EciesAeadDemParams.Size(m)
+}
+func (m *EciesAeadDemParams) XXX_DiscardUnknown() {
+	xxx_messageInfo_EciesAeadDemParams.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EciesAeadDemParams proto.InternalMessageInfo
+
+func (m *EciesAeadDemParams) GetAeadDem() *tink_go_proto.KeyTemplate {
+	if m != nil {
+		return m.AeadDem
+	}
+	return nil
+}
+
+type EciesAeadHkdfParams struct {
+	// Key Encapsulation Mechanism.
+	// Required.
+	KemParams *EciesHkdfKemParams `protobuf:"bytes,1,opt,name=kem_params,json=kemParams,proto3" json:"kem_params,omitempty"`
+	// Data Encapsulation Mechanism.
+	// Required.
+	DemParams *EciesAeadDemParams `protobuf:"bytes,2,opt,name=dem_params,json=demParams,proto3" json:"dem_params,omitempty"`
+	// EC point format.
+	// Required.
+	EcPointFormat        common_go_proto.EcPointFormat `protobuf:"varint,3,opt,name=ec_point_format,json=ecPointFormat,proto3,enum=google.crypto.tink.EcPointFormat" json:"ec_point_format,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *EciesAeadHkdfParams) Reset()         { *m = EciesAeadHkdfParams{} }
+func (m *EciesAeadHkdfParams) String() string { return proto.CompactTextString(m) }
+func (*EciesAeadHkdfParams) ProtoMessage()    {}
+func (*EciesAeadHkdfParams) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a8ddf7d5f8978761, []int{2}
+}
+
+func (m *EciesAeadHkdfParams) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EciesAeadHkdfParams.Unmarshal(m, b)
+}
+func (m *EciesAeadHkdfParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EciesAeadHkdfParams.Marshal(b, m, deterministic)
+}
+func (m *EciesAeadHkdfParams) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EciesAeadHkdfParams.Merge(m, src)
+}
+func (m *EciesAeadHkdfParams) XXX_Size() int {
+	return xxx_messageInfo_EciesAeadHkdfParams.Size(m)
+}
+func (m *EciesAeadHkdfParams) XXX_DiscardUnknown() {
+	xxx_messageInfo_EciesAeadHkdfParams.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EciesAeadHkdfParams proto.InternalMessageInfo
+
+func (m *EciesAeadHkdfParams) GetKemParams() *EciesHkdfKemParams {
+	if m != nil {
+		return m.KemParams
+	}
+	return nil
+}
+
+func (m *EciesAeadHkdfParams) GetDemParams() *EciesAeadDemParams {
+	if m != nil {
+		return m.DemParams
+	}
+	return nil
+}
+
+func (m *EciesAeadHkdfParams) GetEcPointFormat() common_go_proto.EcPointFormat {
+	if m != nil {
+		return m.EcPointFormat
+	}
+	return common_go_proto.EcPointFormat_UNKNOWN_FORMAT
+}
+
+// EciesAeadHkdfPublicKey represents HybridEncryption primitive.
+// key_type: type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey
+type EciesAeadHkdfPublicKey struct {
+	// Required.
+	Version uint32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"`
+	// Required.
+	Params *EciesAeadHkdfParams `protobuf:"bytes,2,opt,name=params,proto3" json:"params,omitempty"`
+	// Affine coordinates of the public key in bigendian representation.
+	// The public key is a point (x, y) on the curve defined by params.kem_params.curve.
+	// Required.
+	X []byte `protobuf:"bytes,3,opt,name=x,proto3" json:"x,omitempty"`
+	// Required.
+	Y                    []byte   `protobuf:"bytes,4,opt,name=y,proto3" json:"y,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *EciesAeadHkdfPublicKey) Reset()         { *m = EciesAeadHkdfPublicKey{} }
+func (m *EciesAeadHkdfPublicKey) String() string { return proto.CompactTextString(m) }
+func (*EciesAeadHkdfPublicKey) ProtoMessage()    {}
+func (*EciesAeadHkdfPublicKey) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a8ddf7d5f8978761, []int{3}
+}
+
+func (m *EciesAeadHkdfPublicKey) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EciesAeadHkdfPublicKey.Unmarshal(m, b)
+}
+func (m *EciesAeadHkdfPublicKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EciesAeadHkdfPublicKey.Marshal(b, m, deterministic)
+}
+func (m *EciesAeadHkdfPublicKey) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EciesAeadHkdfPublicKey.Merge(m, src)
+}
+func (m *EciesAeadHkdfPublicKey) XXX_Size() int {
+	return xxx_messageInfo_EciesAeadHkdfPublicKey.Size(m)
+}
+func (m *EciesAeadHkdfPublicKey) XXX_DiscardUnknown() {
+	xxx_messageInfo_EciesAeadHkdfPublicKey.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EciesAeadHkdfPublicKey proto.InternalMessageInfo
+
+func (m *EciesAeadHkdfPublicKey) GetVersion() uint32 {
+	if m != nil {
+		return m.Version
+	}
+	return 0
+}
+
+func (m *EciesAeadHkdfPublicKey) GetParams() *EciesAeadHkdfParams {
+	if m != nil {
+		return m.Params
+	}
+	return nil
+}
+
+func (m *EciesAeadHkdfPublicKey) GetX() []byte {
+	if m != nil {
+		return m.X
+	}
+	return nil
+}
+
+func (m *EciesAeadHkdfPublicKey) GetY() []byte {
+	if m != nil {
+		return m.Y
+	}
+	return nil
+}
+
+// EciesKdfAeadPrivateKey represents HybridDecryption primitive.
+// key_type: type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey
+type EciesAeadHkdfPrivateKey struct {
+	// Required.
+	Version uint32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"`
+	// Required.
+	PublicKey *EciesAeadHkdfPublicKey `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"`
+	// Required.
+	KeyValue             []byte   `protobuf:"bytes,3,opt,name=key_value,json=keyValue,proto3" json:"key_value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *EciesAeadHkdfPrivateKey) Reset()         { *m = EciesAeadHkdfPrivateKey{} }
+func (m *EciesAeadHkdfPrivateKey) String() string { return proto.CompactTextString(m) }
+func (*EciesAeadHkdfPrivateKey) ProtoMessage()    {}
+func (*EciesAeadHkdfPrivateKey) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a8ddf7d5f8978761, []int{4}
+}
+
+func (m *EciesAeadHkdfPrivateKey) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EciesAeadHkdfPrivateKey.Unmarshal(m, b)
+}
+func (m *EciesAeadHkdfPrivateKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EciesAeadHkdfPrivateKey.Marshal(b, m, deterministic)
+}
+func (m *EciesAeadHkdfPrivateKey) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EciesAeadHkdfPrivateKey.Merge(m, src)
+}
+func (m *EciesAeadHkdfPrivateKey) XXX_Size() int {
+	return xxx_messageInfo_EciesAeadHkdfPrivateKey.Size(m)
+}
+func (m *EciesAeadHkdfPrivateKey) XXX_DiscardUnknown() {
+	xxx_messageInfo_EciesAeadHkdfPrivateKey.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EciesAeadHkdfPrivateKey proto.InternalMessageInfo
+
+func (m *EciesAeadHkdfPrivateKey) GetVersion() uint32 {
+	if m != nil {
+		return m.Version
+	}
+	return 0
+}
+
+func (m *EciesAeadHkdfPrivateKey) GetPublicKey() *EciesAeadHkdfPublicKey {
+	if m != nil {
+		return m.PublicKey
+	}
+	return nil
+}
+
+func (m *EciesAeadHkdfPrivateKey) GetKeyValue() []byte {
+	if m != nil {
+		return m.KeyValue
+	}
+	return nil
+}
+
+type EciesAeadHkdfKeyFormat struct {
+	// Required.
+	Params               *EciesAeadHkdfParams `protobuf:"bytes,1,opt,name=params,proto3" json:"params,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *EciesAeadHkdfKeyFormat) Reset()         { *m = EciesAeadHkdfKeyFormat{} }
+func (m *EciesAeadHkdfKeyFormat) String() string { return proto.CompactTextString(m) }
+func (*EciesAeadHkdfKeyFormat) ProtoMessage()    {}
+func (*EciesAeadHkdfKeyFormat) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a8ddf7d5f8978761, []int{5}
+}
+
+func (m *EciesAeadHkdfKeyFormat) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EciesAeadHkdfKeyFormat.Unmarshal(m, b)
+}
+func (m *EciesAeadHkdfKeyFormat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EciesAeadHkdfKeyFormat.Marshal(b, m, deterministic)
+}
+func (m *EciesAeadHkdfKeyFormat) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EciesAeadHkdfKeyFormat.Merge(m, src)
+}
+func (m *EciesAeadHkdfKeyFormat) XXX_Size() int {
+	return xxx_messageInfo_EciesAeadHkdfKeyFormat.Size(m)
+}
+func (m *EciesAeadHkdfKeyFormat) XXX_DiscardUnknown() {
+	xxx_messageInfo_EciesAeadHkdfKeyFormat.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EciesAeadHkdfKeyFormat proto.InternalMessageInfo
+
+func (m *EciesAeadHkdfKeyFormat) GetParams() *EciesAeadHkdfParams {
+	if m != nil {
+		return m.Params
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*EciesHkdfKemParams)(nil), "google.crypto.tink.EciesHkdfKemParams")
+	proto.RegisterType((*EciesAeadDemParams)(nil), "google.crypto.tink.EciesAeadDemParams")
+	proto.RegisterType((*EciesAeadHkdfParams)(nil), "google.crypto.tink.EciesAeadHkdfParams")
+	proto.RegisterType((*EciesAeadHkdfPublicKey)(nil), "google.crypto.tink.EciesAeadHkdfPublicKey")
+	proto.RegisterType((*EciesAeadHkdfPrivateKey)(nil), "google.crypto.tink.EciesAeadHkdfPrivateKey")
+	proto.RegisterType((*EciesAeadHkdfKeyFormat)(nil), "google.crypto.tink.EciesAeadHkdfKeyFormat")
+}
+
+func init() {
+	proto.RegisterFile("proto/ecies_aead_hkdf.proto", fileDescriptor_a8ddf7d5f8978761)
+}
+
+var fileDescriptor_a8ddf7d5f8978761 = []byte{
+	// 520 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0xd1, 0x6a, 0x13, 0x41,
+	0x14, 0x86, 0x99, 0x28, 0x69, 0xf6, 0x24, 0xad, 0xb0, 0x82, 0x86, 0xb6, 0x60, 0xbb, 0xa2, 0x16,
+	0x91, 0x0d, 0x44, 0xbc, 0xf1, 0x46, 0x8c, 0x8d, 0x34, 0x04, 0x24, 0xac, 0x41, 0xd0, 0x9b, 0x71,
+	0xb2, 0x7b, 0x92, 0x5d, 0x76, 0x27, 0x33, 0xec, 0x4e, 0x42, 0xe7, 0x29, 0x7c, 0x00, 0xef, 0x7c,
+	0x0d, 0xdf, 0xc9, 0x67, 0x90, 0x99, 0x4d, 0xd2, 0xc6, 0x6e, 0x53, 0xf0, 0x6e, 0xce, 0xe4, 0x3f,
+	0xdf, 0xfc, 0xff, 0x0f, 0x59, 0x78, 0xa5, 0xe2, 0x24, 0x8f, 0xa8, 0x64, 0xb9, 0xd2, 0x1d, 0x95,
+	0xcc, 0xd3, 0x8e, 0xcc, 0x85, 0x12, 0x1d, 0x0c, 0x13, 0x2c, 0x28, 0x43, 0x16, 0xd1, 0x38, 0x8d,
+	0xa6, 0xbe, 0xbd, 0x75, 0xdd, 0x99, 0x10, 0xb3, 0x0c, 0xfd, 0x30, 0xd7, 0x52, 0x09, 0xdf, 0xe8,
+	0x0f, 0x9f, 0xde, 0x42, 0x08, 0x05, 0xe7, 0x62, 0x5e, 0x2e, 0x1e, 0x9e, 0xde, 0x22, 0x32, 0xc7,
+	0x52, 0xe2, 0xfd, 0x26, 0xe0, 0xf6, 0xcd, 0xab, 0x17, 0x69, 0x34, 0x1d, 0x22, 0x1f, 0xb1, 0x9c,
+	0xf1, 0xc2, 0x3d, 0x07, 0x08, 0x17, 0xf9, 0x12, 0xa9, 0xd2, 0x12, 0xdb, 0xe4, 0x84, 0x9c, 0x1d,
+	0x74, 0x9f, 0xf9, 0x37, 0x7d, 0xf8, 0xfd, 0x2c, 0x4b, 0xa4, 0x4a, 0xc2, 0x0f, 0x46, 0x3d, 0xd6,
+	0x12, 0x03, 0x27, 0x5c, 0x1f, 0xdd, 0x1e, 0x1c, 0x98, 0x18, 0x34, 0x66, 0x45, 0x5c, 0x92, 0x6a,
+	0x96, 0x74, 0x5c, 0x45, 0xba, 0x60, 0x45, 0x6c, 0x01, 0x2d, 0xb3, 0xb3, 0x9e, 0xdc, 0x23, 0x70,
+	0x2c, 0xa3, 0x60, 0x99, 0x6a, 0x37, 0x4f, 0xc8, 0x59, 0x2b, 0x68, 0x98, 0x8b, 0xcf, 0x2c, 0x53,
+	0xde, 0x68, 0x65, 0xfe, 0x3d, 0xb2, 0xe8, 0x7c, 0x63, 0xfe, 0x2d, 0x34, 0x6c, 0x85, 0x11, 0x72,
+	0xfb, 0x60, 0xb3, 0xfb, 0xa4, 0xea, 0xc1, 0x21, 0xea, 0x31, 0x72, 0x99, 0x31, 0x85, 0xc1, 0x1e,
+	0x2b, 0x09, 0xde, 0x1f, 0x02, 0x0f, 0x37, 0x48, 0xd3, 0xc9, 0x8a, 0xd9, 0x07, 0x48, 0x91, 0x9b,
+	0x2a, 0x19, 0x2f, 0x6c, 0x21, 0xcd, 0xee, 0xf3, 0xca, 0x42, 0x6e, 0x94, 0x19, 0x38, 0xe9, 0xc6,
+	0x5a, 0x1f, 0x20, 0xba, 0xc2, 0xd4, 0xee, 0xc0, 0x6c, 0xc5, 0x0a, 0x9c, 0x68, 0x83, 0x19, 0xc0,
+	0x03, 0x0c, 0xa9, 0x14, 0xc9, 0x5c, 0xd1, 0xa9, 0xc8, 0x39, 0x53, 0xed, 0x7b, 0xb6, 0xd9, 0xd3,
+	0x6a, 0xd6, 0xc8, 0x28, 0x3f, 0x5a, 0x61, 0xb0, 0x8f, 0xd7, 0x47, 0xef, 0x07, 0x81, 0x47, 0xdb,
+	0x81, 0x17, 0x93, 0x2c, 0x09, 0x87, 0xa8, 0xdd, 0x36, 0xec, 0x2d, 0x31, 0x2f, 0x12, 0x31, 0xb7,
+	0x81, 0xf7, 0x83, 0xf5, 0xe8, 0xbe, 0x83, 0xfa, 0x56, 0x84, 0x17, 0x3b, 0x23, 0x5c, 0xd5, 0x18,
+	0xac, 0xd6, 0xdc, 0x16, 0x90, 0x4b, 0x6b, 0xb9, 0x15, 0x90, 0x4b, 0x33, 0xe9, 0xf6, 0xfd, 0x72,
+	0xd2, 0xde, 0x4f, 0x02, 0x8f, 0xb7, 0x77, 0xf3, 0x64, 0xc9, 0x14, 0xee, 0xb6, 0x34, 0x00, 0x90,
+	0xd6, 0x39, 0x4d, 0x51, 0xaf, 0x6c, 0xbd, 0xbc, 0xdb, 0xd6, 0x3a, 0x6c, 0xe0, 0xc8, 0x4d, 0xee,
+	0x23, 0x70, 0x52, 0xd4, 0x74, 0xc9, 0xb2, 0x05, 0xae, 0x4c, 0x36, 0x52, 0xd4, 0x5f, 0xcc, 0xec,
+	0x7d, 0xfd, 0xa7, 0xae, 0x21, 0xea, 0xb2, 0xc9, 0x6b, 0xa5, 0x90, 0xff, 0x2a, 0xa5, 0xf7, 0x1d,
+	0x8e, 0x43, 0xc1, 0xab, 0xb6, 0xec, 0x7f, 0x75, 0x44, 0xbe, 0xbd, 0x99, 0x25, 0x2a, 0x5e, 0x4c,
+	0xfc, 0x50, 0xf0, 0x4e, 0x29, 0xdb, 0xf1, 0xf5, 0xa0, 0x33, 0x41, 0xed, 0x0f, 0xbf, 0x6a, 0xf5,
+	0xf1, 0xe0, 0xd3, 0x70, 0xd4, 0x9b, 0xd4, 0xed, 0xfc, 0xfa, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0x80, 0x6f, 0xd1, 0xc8, 0x80, 0x04, 0x00, 0x00,
+}
diff --git a/proto/ed25519.proto b/proto/ed25519.proto
index 52a7b9f..19b8789 100644
--- a/proto/ed25519.proto
+++ b/proto/ed25519.proto
@@ -26,6 +26,8 @@
 option objc_class_prefix = "TINKPB";
 option go_package = "github.com/google/tink/proto/ed25519_go_proto";
 
+message Ed25519KeyFormat {}
+
 // key_type: type.googleapis.com/google.crypto.tink.Ed25519PublicKey
 message Ed25519PublicKey {
   // Required.
diff --git a/proto/xchacha20_poly1305.proto b/proto/xchacha20_poly1305.proto
index 89d66ed..353814c 100644
--- a/proto/xchacha20_poly1305.proto
+++ b/proto/xchacha20_poly1305.proto
@@ -23,6 +23,8 @@
 option objc_class_prefix = "TINKPB";
 option go_package = "github.com/google/tink/proto/xchacha20_poly1305_go_proto";
 
+message XChaCha20Poly1305KeyFormat {}
+
 // key_type: type.googleapis.com/google.crypto.tink.XChaCha20Poly1305Key
 message XChaCha20Poly1305Key {
   uint32 version = 1;
diff --git a/python/aead/__init__.py b/python/aead/__init__.py
new file mode 100644
index 0000000..e90b56a
--- /dev/null
+++ b/python/aead/__init__.py
@@ -0,0 +1,28 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Aead package."""
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from tink.python.aead import aead
+from tink.python.aead import aead_key_manager
+from tink.python.aead import aead_key_templates
+from tink.python.aead import aead_wrapper
+
+
+Aead = aead.Aead
+AeadWrapper = aead_wrapper.AeadWrapper
diff --git a/python/aead/aead.py b/python/aead/aead.py
new file mode 100644
index 0000000..7d7336e
--- /dev/null
+++ b/python/aead/aead.py
@@ -0,0 +1,68 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""This module defines the interface for AEAD."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import abc
+
+
+class Aead(object):
+  """The interface for authenticated encryption with associated data.
+
+  Implementations of this interface are secure against adaptive
+  chosen ciphertext attacks.  Encryption with associated data ensures
+  authenticity and integrity of that data, but not its secrecy.
+  (see RFC 5116, https://tools.ietf.org/html/rfc5116)
+  """
+
+  __metaclass__ = abc.ABCMeta
+
+  @abc.abstractmethod
+  def encrypt(self, plaintext: bytes, associated_data: bytes) -> bytes:
+    """Encrypts plaintext with associated_data.
+
+    The ciphertext allows for checking authenticity and integrity of the
+    associated data, but does not guarantee its secrecy.
+
+    Args:
+      plaintext: bytes. The data to be encrypted.
+      associated_data: bytes. The associated data, that will be authenticated.
+    Returns:
+      the resulting ciphertext as bytes.
+    Raises:
+      tink.TinkError if the encryption fails.
+    """
+    raise NotImplementedError()
+
+  @abc.abstractmethod
+  def decrypt(self, ciphertext: bytes, associated_data: bytes) -> bytes:
+    """Decrypts ciphertext with associated_data.
+
+    The decryption verifies the authenticity and integrity of the associated
+    data, but there are no guarantees with respect to secrecy of that data.
+
+    Args:
+      ciphertext: bytes. The data to be decrypted.
+      associated_data: bytes. The associated data.
+    Returns:
+      the resulting plaintext as bytes.
+    Raises:
+      tink.TinkError if the decryption fails.
+    """
+    raise NotImplementedError()
diff --git a/python/aead/aead_key_manager.py b/python/aead/aead_key_manager.py
new file mode 100644
index 0000000..08f6764
--- /dev/null
+++ b/python/aead/aead_key_manager.py
@@ -0,0 +1,49 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Python wrapper of the CLIF-wrapped C++ AEAD key manager."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from typing import Text
+
+from tink.cc.python import aead as cc_aead
+from tink.python.aead import aead
+from tink.python.cc.clif import cc_key_manager
+from tink.python.core import key_manager
+from tink.python.core import tink_error
+
+
+class _AeadCcToPyWrapper(aead.Aead):
+  """Transforms cliffed C++ Aead primitive into a Python primitive."""
+
+  def __init__(self, cc_primitive: cc_aead.Aead):
+    self._aead = cc_primitive
+
+  @tink_error.use_tink_errors
+  def encrypt(self, plaintext: bytes, associated_data: bytes) -> bytes:
+    return self._aead.encrypt(plaintext, associated_data)
+
+  @tink_error.use_tink_errors
+  def decrypt(self, plaintext: bytes, associated_data: bytes) -> bytes:
+    return self._aead.decrypt(plaintext, associated_data)
+
+
+def from_cc_registry(type_url: Text) -> key_manager.KeyManager[aead.Aead]:
+  return key_manager.KeyManagerCcToPyWrapper(
+      cc_key_manager.AeadKeyManager.from_cc_registry(type_url), aead.Aead,
+      _AeadCcToPyWrapper)
diff --git a/python/aead/aead_key_manager_test.py b/python/aead/aead_key_manager_test.py
new file mode 100644
index 0000000..c7e43cc
--- /dev/null
+++ b/python/aead/aead_key_manager_test.py
@@ -0,0 +1,131 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.aead_key_manager."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+from tink.proto import aes_eax_pb2
+from tink.proto import aes_gcm_pb2
+from tink.proto import tink_pb2
+from tink.python import tink_config
+from tink.python.aead import aead
+from tink.python.aead import aead_key_manager
+from tink.python.core import tink_error
+
+
+def setUpModule():
+  tink_config.register()
+
+
+class AeadKeyManagerTest(absltest.TestCase):
+
+  def setUp(self):
+    super(AeadKeyManagerTest, self).setUp()
+    self.key_manager_eax = aead_key_manager.from_cc_registry(
+        'type.googleapis.com/google.crypto.tink.AesEaxKey')
+    self.key_manager_gcm = aead_key_manager.from_cc_registry(
+        'type.googleapis.com/google.crypto.tink.AesGcmKey')
+
+  def new_aes_eax_key_template(self, iv_size, key_size):
+    key_format = aes_eax_pb2.AesEaxKeyFormat()
+    key_format.params.iv_size = iv_size
+    key_format.key_size = key_size
+    key_template = tink_pb2.KeyTemplate()
+    key_template.type_url = ('type.googleapis.com/google.crypto.tink.AesEaxKey')
+    key_template.value = key_format.SerializeToString()
+    return key_template
+
+  def new_aes_gcm_key_template(self, key_size):
+    key_format = aes_gcm_pb2.AesGcmKeyFormat()
+    key_format.key_size = key_size
+    key_template = tink_pb2.KeyTemplate()
+    key_template.type_url = ('type.googleapis.com/google.crypto.tink.AesGcmKey')
+    key_template.value = key_format.SerializeToString()
+    return key_template
+
+  def test_primitive_class(self):
+    self.assertEqual(self.key_manager_eax.primitive_class(), aead.Aead)
+    self.assertEqual(self.key_manager_gcm.primitive_class(), aead.Aead)
+
+  def test_key_type(self):
+    self.assertEqual(self.key_manager_eax.key_type(),
+                     'type.googleapis.com/google.crypto.tink.AesEaxKey')
+    self.assertEqual(self.key_manager_gcm.key_type(),
+                     'type.googleapis.com/google.crypto.tink.AesGcmKey')
+
+  def test_new_key_data(self):
+    # AES EAX
+    key_template = self.new_aes_eax_key_template(12, 16)
+    key_data = self.key_manager_eax.new_key_data(key_template)
+    self.assertEqual(key_data.type_url, self.key_manager_eax.key_type())
+    self.assertEqual(key_data.key_material_type, tink_pb2.KeyData.SYMMETRIC)
+    key = aes_eax_pb2.AesEaxKey()
+    key.ParseFromString(key_data.value)
+    self.assertEqual(key.version, 0)
+    self.assertEqual(key.params.iv_size, 12)
+    self.assertLen(key.key_value, 16)
+
+    # AES GCM
+    key_template = self.new_aes_gcm_key_template(16)
+    key_data = self.key_manager_gcm.new_key_data(key_template)
+    self.assertEqual(key_data.type_url, self.key_manager_gcm.key_type())
+    self.assertEqual(key_data.key_material_type, tink_pb2.KeyData.SYMMETRIC)
+    key = aes_gcm_pb2.AesGcmKey()
+    key.ParseFromString(key_data.value)
+    self.assertEqual(key.version, 0)
+    self.assertLen(key.key_value, 16)
+
+  def test_invalid_params_throw_exception(self):
+    key_template = self.new_aes_eax_key_template(9, 16)
+    with self.assertRaisesRegex(tink_error.TinkError,
+                                'Invalid IV size'):
+      self.key_manager_eax.new_key_data(key_template)
+
+    key_template = self.new_aes_gcm_key_template(17)
+    with self.assertRaisesRegex(tink_error.TinkError,
+                                'supported sizes: 16 or 32 bytes'):
+      self.key_manager_gcm.new_key_data(key_template)
+
+  def test_encrypt_decrypt(self):
+    # AES EAX
+    primitive = self.key_manager_eax.primitive(
+        self.key_manager_eax.new_key_data(
+            self.new_aes_eax_key_template(12, 16)))
+    plaintext = b'plaintext'
+    associated_data = b'associated_data'
+    ciphertext = primitive.encrypt(plaintext, associated_data)
+    self.assertEqual(primitive.decrypt(ciphertext, associated_data), plaintext)
+
+    # AES GCM
+    primitive = self.key_manager_gcm.primitive(
+        self.key_manager_gcm.new_key_data(self.new_aes_gcm_key_template(16)))
+    plaintext = b'plaintext'
+    associated_data = b'associated_data'
+    ciphertext = primitive.encrypt(plaintext, associated_data)
+    self.assertEqual(primitive.decrypt(ciphertext, associated_data), plaintext)
+
+  def test_invalid_decrypt_raises_error(self):
+    primitive = self.key_manager_eax.primitive(
+        self.key_manager_eax.new_key_data(
+            self.new_aes_eax_key_template(12, 16)))
+    with self.assertRaisesRegex(tink_error.TinkError, 'Ciphertext too short'):
+      primitive.decrypt(b'invalid ciphertext', 'ad')
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/aead/aead_key_templates.py b/python/aead/aead_key_templates.py
new file mode 100644
index 0000000..3c46950
--- /dev/null
+++ b/python/aead/aead_key_templates.py
@@ -0,0 +1,103 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Pre-generated KeyTemplate for Aead.
+
+One can use these templates to generate a new tink_pb2.Keyset with
+tink_pb2.KeysetHandle. To generate a new keyset that contains a single
+aes_eax_pb2.AesEaxKey, one can do:
+handle = keyset_handle.KeysetHandle(aead_key_templates.AES128_EAX).
+"""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from tink.proto import aes_ctr_hmac_aead_pb2
+from tink.proto import aes_eax_pb2
+from tink.proto import aes_gcm_pb2
+from tink.proto import common_pb2
+from tink.proto import tink_pb2
+
+_AES_EAX_KEY_TYPE_URL = 'type.googleapis.com/google.crypto.tink.AesEaxKey'
+_AES_GCM_KEY_TYPE_URL = 'type.googleapis.com/google.crypto.tink.AesGcmKey'
+_AES_CTR_HMAC_AEAD_KEY_TYPE_URL = (
+    'type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey')
+_CHACHA20_POLY1305_KEY_TYPE_URL = (
+    'type.googleapis.com/google.crypto.tink.ChaCha20Poly1305Key')
+_XCHACHA20_POLY1305_KEY_TYPE_URL = (
+    'type.googleapis.com/google.crypto.tink.XChaCha20Poly1305Key')
+
+
+def create_aes_eax_key_template(key_size: int,
+                                iv_size: int) -> tink_pb2.KeyTemplate:
+  """Creates an AES EAX KeyTemplate, and fills in its values."""
+  key_format = aes_eax_pb2.AesEaxKeyFormat()
+  key_format.params.iv_size = iv_size
+  key_format.key_size = key_size
+  key_template = tink_pb2.KeyTemplate()
+  key_template.value = key_format.SerializeToString()
+  key_template.type_url = _AES_EAX_KEY_TYPE_URL
+  key_template.output_prefix_type = tink_pb2.TINK
+  return key_template
+
+
+def create_aes_gcm_key_template(key_size: int) -> tink_pb2.KeyTemplate:
+  """Creates an AES GCM KeyTemplate, and fills in its values."""
+  key_format = aes_gcm_pb2.AesGcmKeyFormat()
+  key_format.key_size = key_size
+  key_template = tink_pb2.KeyTemplate()
+  key_template.value = key_format.SerializeToString()
+  key_template.type_url = _AES_GCM_KEY_TYPE_URL
+  key_template.output_prefix_type = tink_pb2.TINK
+  return key_template
+
+
+def create_aes_ctr_hmac_aead_key_template(
+    aes_key_size: int, iv_size: int, hmac_key_size: int, tag_size: int,
+    hash_type: common_pb2.HashType) -> tink_pb2.KeyTemplate:
+  """Creates an AES CTR HMAC AEAD KeyTemplate, and fills in its values."""
+  key_format = aes_ctr_hmac_aead_pb2.AesCtrHmacAeadKeyFormat()
+  key_format.aes_ctr_key_format.params.iv_size = iv_size
+  key_format.aes_ctr_key_format.key_size = aes_key_size
+  key_format.hmac_key_format.params.hash = hash_type
+  key_format.hmac_key_format.params.tag_size = tag_size
+  key_format.hmac_key_format.key_size = hmac_key_size
+  key_template = tink_pb2.KeyTemplate()
+  key_template.value = key_format.SerializeToString()
+  key_template.type_url = _AES_CTR_HMAC_AEAD_KEY_TYPE_URL
+  key_template.output_prefix_type = tink_pb2.TINK
+  return key_template
+
+
+AES128_EAX = create_aes_eax_key_template(key_size=16, iv_size=16)
+AES256_EAX = create_aes_eax_key_template(key_size=32, iv_size=16)
+AES128_GCM = create_aes_gcm_key_template(key_size=16)
+AES256_GCM = create_aes_gcm_key_template(key_size=32)
+AES128_CTR_HMAC_SHA256 = create_aes_ctr_hmac_aead_key_template(
+    aes_key_size=16,
+    iv_size=16,
+    hmac_key_size=32,
+    tag_size=16,
+    hash_type=common_pb2.SHA256)
+AES256_CTR_HMAC_SHA256 = create_aes_ctr_hmac_aead_key_template(
+    aes_key_size=32,
+    iv_size=16,
+    hmac_key_size=32,
+    tag_size=32,
+    hash_type=common_pb2.SHA256)
+XCHACHA20_POLY1305 = tink_pb2.KeyTemplate(
+    type_url=_XCHACHA20_POLY1305_KEY_TYPE_URL,
+    output_prefix_type=tink_pb2.TINK)
diff --git a/python/aead/aead_key_templates_test.py b/python/aead/aead_key_templates_test.py
new file mode 100644
index 0000000..6ca3bb4
--- /dev/null
+++ b/python/aead/aead_key_templates_test.py
@@ -0,0 +1,148 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.aead_key_templates."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+from tink.proto import aes_ctr_hmac_aead_pb2
+from tink.proto import aes_eax_pb2
+from tink.proto import aes_gcm_pb2
+from tink.proto import common_pb2
+from tink.proto import tink_pb2
+from tink.python.aead import aead_key_templates
+
+
+class AeadKeyTemplatesTest(absltest.TestCase):
+
+  def test_aes128_eax(self):
+    template = aead_key_templates.AES128_EAX
+    self.assertEqual('type.googleapis.com/google.crypto.tink.AesEaxKey',
+                     template.type_url)
+    self.assertEqual(tink_pb2.TINK, template.output_prefix_type)
+    key_format = aes_eax_pb2.AesEaxKeyFormat()
+    key_format.ParseFromString(template.value)
+    self.assertEqual(16, key_format.key_size)
+    self.assertEqual(16, key_format.params.iv_size)
+
+  def test_aes256_eax(self):
+    template = aead_key_templates.AES256_EAX
+    self.assertEqual('type.googleapis.com/google.crypto.tink.AesEaxKey',
+                     template.type_url)
+    self.assertEqual(tink_pb2.TINK, template.output_prefix_type)
+    key_format = aes_eax_pb2.AesEaxKeyFormat()
+    key_format.ParseFromString(template.value)
+    self.assertEqual(32, key_format.key_size)
+    self.assertEqual(16, key_format.params.iv_size)
+
+  def test_create_aes_eax_key_template(self):
+    # Intentionally using 'weird' or invalid values for parameters,
+    # to test that the function correctly puts them in the resulting template.
+    template = aead_key_templates.create_aes_eax_key_template(
+        key_size=42, iv_size=72)
+    self.assertEqual('type.googleapis.com/google.crypto.tink.AesEaxKey',
+                     template.type_url)
+    self.assertEqual(tink_pb2.TINK, template.output_prefix_type)
+    key_format = aes_eax_pb2.AesEaxKeyFormat()
+    key_format.ParseFromString(template.value)
+    self.assertEqual(42, key_format.key_size)
+    self.assertEqual(72, key_format.params.iv_size)
+
+  def test_aes128_gcm(self):
+    template = aead_key_templates.AES128_GCM
+    self.assertEqual('type.googleapis.com/google.crypto.tink.AesGcmKey',
+                     template.type_url)
+    self.assertEqual(tink_pb2.TINK, template.output_prefix_type)
+    key_format = aes_gcm_pb2.AesGcmKeyFormat()
+    key_format.ParseFromString(template.value)
+    self.assertEqual(16, key_format.key_size)
+
+  def test_aes256_gcm(self):
+    template = aead_key_templates.AES256_GCM
+    self.assertEqual('type.googleapis.com/google.crypto.tink.AesGcmKey',
+                     template.type_url)
+    self.assertEqual(tink_pb2.TINK, template.output_prefix_type)
+    key_format = aes_gcm_pb2.AesGcmKeyFormat()
+    key_format.ParseFromString(template.value)
+    self.assertEqual(32, key_format.key_size)
+
+  def test_create_aes_gcm_key_template(self):
+    # Intentionally using 'weird' or invalid values for parameters,
+    # to test that the function correctly puts them in the resulting template.
+    template = aead_key_templates.create_aes_gcm_key_template(key_size=42)
+    self.assertEqual('type.googleapis.com/google.crypto.tink.AesGcmKey',
+                     template.type_url)
+    self.assertEqual(tink_pb2.TINK, template.output_prefix_type)
+    key_format = aes_gcm_pb2.AesGcmKeyFormat()
+    key_format.ParseFromString(template.value)
+    self.assertEqual(42, key_format.key_size)
+
+  def test_aes256_ctr_hmac_sha256(self):
+    template = aead_key_templates.AES128_CTR_HMAC_SHA256
+    self.assertEqual('type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey',
+                     template.type_url)
+    self.assertEqual(tink_pb2.TINK, template.output_prefix_type)
+    key_format = aes_ctr_hmac_aead_pb2.AesCtrHmacAeadKeyFormat()
+    key_format.ParseFromString(template.value)
+    self.assertEqual(16, key_format.aes_ctr_key_format.params.iv_size)
+    self.assertEqual(16, key_format.aes_ctr_key_format.key_size)
+    self.assertEqual(common_pb2.SHA256, key_format.hmac_key_format.params.hash)
+    self.assertEqual(16, key_format.hmac_key_format.params.tag_size)
+    self.assertEqual(32, key_format.hmac_key_format.key_size)
+
+  def test_aes128_ctr_hmac_sha256(self):
+    template = aead_key_templates.AES256_CTR_HMAC_SHA256
+    self.assertEqual('type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey',
+                     template.type_url)
+    self.assertEqual(tink_pb2.TINK, template.output_prefix_type)
+    key_format = aes_ctr_hmac_aead_pb2.AesCtrHmacAeadKeyFormat()
+    key_format.ParseFromString(template.value)
+    self.assertEqual(16, key_format.aes_ctr_key_format.params.iv_size)
+    self.assertEqual(32, key_format.aes_ctr_key_format.key_size)
+    self.assertEqual(common_pb2.SHA256, key_format.hmac_key_format.params.hash)
+    self.assertEqual(32, key_format.hmac_key_format.params.tag_size)
+    self.assertEqual(32, key_format.hmac_key_format.key_size)
+
+  def test_create_aes_ctr_hmac_aead_key_template(self):
+    # Intentionally using 'weird' or invalid values for parameters,
+    # to test that the function correctly puts them in the resulting template.
+    template = aead_key_templates.create_aes_ctr_hmac_aead_key_template(
+        aes_key_size=34,
+        iv_size=93,
+        hmac_key_size=46,
+        tag_size=99,
+        hash_type=common_pb2.SHA1)
+    self.assertEqual('type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey',
+                     template.type_url)
+    self.assertEqual(tink_pb2.TINK, template.output_prefix_type)
+    key_format = aes_ctr_hmac_aead_pb2.AesCtrHmacAeadKeyFormat()
+    key_format.ParseFromString(template.value)
+    self.assertEqual(93, key_format.aes_ctr_key_format.params.iv_size)
+    self.assertEqual(34, key_format.aes_ctr_key_format.key_size)
+    self.assertEqual(common_pb2.SHA1, key_format.hmac_key_format.params.hash)
+    self.assertEqual(99, key_format.hmac_key_format.params.tag_size)
+    self.assertEqual(46, key_format.hmac_key_format.key_size)
+
+  def test_xchacha20_poly1305(self):
+    template = aead_key_templates.XCHACHA20_POLY1305
+    self.assertEqual(
+        'type.googleapis.com/google.crypto.tink.XChaCha20Poly1305Key',
+        template.type_url)
+    self.assertEqual(tink_pb2.TINK, template.output_prefix_type)
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/aead/aead_wrapper.py b/python/aead/aead_wrapper.py
new file mode 100644
index 0000000..a51a3d1
--- /dev/null
+++ b/python/aead/aead_wrapper.py
@@ -0,0 +1,79 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""AEAD wrapper."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from absl import logging
+
+from typing import Type
+
+from tink.python.aead import aead
+from tink.python.core import crypto_format
+from tink.python.core import primitive_set
+from tink.python.core import primitive_wrapper
+from tink.python.core import tink_error
+
+
+class _WrappedAead(aead.Aead):
+  """Implements Aead for a set of Aead primitives."""
+
+  def __init__(self, pset: primitive_set.PrimitiveSet):
+    self._primitive_set = pset
+
+  def encrypt(self, plaintext: bytes, associated_data: bytes) -> bytes:
+    primary = self._primitive_set.primary()
+    return primary.identifier + primary.primitive.encrypt(
+        plaintext, associated_data)
+
+  def decrypt(self, ciphertext: bytes, associated_data: bytes) -> bytes:
+    if len(ciphertext) > crypto_format.NON_RAW_PREFIX_SIZE:
+      prefix = ciphertext[:crypto_format.NON_RAW_PREFIX_SIZE]
+      ciphertext_no_prefix = ciphertext[crypto_format.NON_RAW_PREFIX_SIZE:]
+      for entry in self._primitive_set.primitive_from_identifier(prefix):
+        try:
+          return entry.primitive.decrypt(ciphertext_no_prefix,
+                                         associated_data)
+        except tink_error.TinkError as e:
+          logging.info(
+              'ciphertext prefix matches a key, but cannot decrypt: %s', e)
+    # Let's try all RAW keys.
+    for entry in self._primitive_set.raw_primitives():
+      try:
+        return entry.primitive.decrypt(ciphertext, associated_data)
+      except tink_error.TinkError as e:
+        pass
+    # nothing works.
+    raise tink_error.TinkError('Decryption failed.')
+
+
+class AeadWrapper(primitive_wrapper.PrimitiveWrapper[aead.Aead]):
+  """AeadWrapper is the implementation of PrimitiveWrapper for Aead.
+
+  Key rotation works as follows: each ciphertext is prefixed with the keyId.
+  When decrypting, we first try all primitives whose keyId starts with the
+  prefix of the ciphertext. If none of these succeed, we try the raw primitives.
+  If any succeeds, we return the ciphertext, otherwise we simply raise a
+  TinkError.
+  """
+
+  def wrap(self, pset: primitive_set.PrimitiveSet) -> aead.Aead:
+    return _WrappedAead(pset)
+
+  def primitive_class(self) -> Type[aead.Aead]:
+    return aead.Aead
diff --git a/python/aead/aead_wrapper_test.py b/python/aead/aead_wrapper_test.py
new file mode 100644
index 0000000..8f6d68b
--- /dev/null
+++ b/python/aead/aead_wrapper_test.py
@@ -0,0 +1,146 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.aead_wrapper."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+from tink.proto import tink_pb2
+from tink.python.aead import aead
+from tink.python.aead import aead_wrapper
+from tink.python.core import primitive_set
+from tink.python.core import tink_error
+from tink.python.testing import helper
+
+
+class AeadWrapperTest(absltest.TestCase):
+
+  def new_primitive_key_pair(self, key_id, output_prefix_type):
+    fake_key = helper.fake_key(key_id=key_id,
+                               output_prefix_type=output_prefix_type)
+    fake_aead = helper.FakeAead('fakeAead {}'.format(key_id))
+    return fake_aead, fake_key
+
+  def test_encrypt_decrypt(self):
+    primitive, key = self.new_primitive_key_pair(1234, tink_pb2.TINK)
+    pset = primitive_set.new_primitive_set(aead.Aead)
+    entry = pset.add_primitive(primitive, key)
+    pset.set_primary(entry)
+
+    wrapped_aead = aead_wrapper.AeadWrapper().wrap(pset)
+
+    plaintext = b'plaintext'
+    associated_data = b'associated_data'
+    ciphertext = wrapped_aead.encrypt(plaintext, associated_data)
+    self.assertEqual(
+        wrapped_aead.decrypt(ciphertext, associated_data), plaintext)
+
+  def test_encrypt_decrypt_with_key_rotation(self):
+    primitive, key = self.new_primitive_key_pair(1234, tink_pb2.TINK)
+    pset = primitive_set.new_primitive_set(aead.Aead)
+    entry = pset.add_primitive(primitive, key)
+    pset.set_primary(entry)
+    wrapped_aead = aead_wrapper.AeadWrapper().wrap(pset)
+    ciphertext = wrapped_aead.encrypt(b'plaintext', b'associated_data')
+
+    new_primitive, new_key = self.new_primitive_key_pair(5678, tink_pb2.TINK)
+    new_entry = pset.add_primitive(new_primitive, new_key)
+    pset.set_primary(new_entry)
+    new_ciphertext = wrapped_aead.encrypt(b'new_plaintext',
+                                          b'new_associated_data')
+
+    self.assertEqual(
+        wrapped_aead.decrypt(ciphertext, b'associated_data'),
+        b'plaintext')
+    self.assertEqual(
+        wrapped_aead.decrypt(new_ciphertext, b'new_associated_data'),
+        b'new_plaintext')
+
+  def test_encrypt_decrypt_with_key_rotation_from_raw(self):
+    primitive, raw_key = self.new_primitive_key_pair(1234, tink_pb2.RAW)
+    old_raw_ciphertext = primitive.encrypt(b'plaintext', b'associated_data')
+
+    pset = primitive_set.new_primitive_set(aead.Aead)
+    pset.add_primitive(primitive, raw_key)
+    new_primitive, new_key = self.new_primitive_key_pair(5678, tink_pb2.TINK)
+    new_entry = pset.add_primitive(new_primitive, new_key)
+    pset.set_primary(new_entry)
+    wrapped_aead = aead_wrapper.AeadWrapper().wrap(pset)
+    new_ciphertext = wrapped_aead.encrypt(b'new_plaintext',
+                                          b'new_associated_data')
+
+    self.assertEqual(
+        wrapped_aead.decrypt(old_raw_ciphertext, b'associated_data'),
+        b'plaintext')
+    self.assertEqual(
+        wrapped_aead.decrypt(new_ciphertext, b'new_associated_data'),
+        b'new_plaintext')
+
+  def test_encrypt_decrypt_two_raw_keys(self):
+    primitive1, raw_key1 = self.new_primitive_key_pair(1234, tink_pb2.RAW)
+    primitive2, raw_key2 = self.new_primitive_key_pair(5678, tink_pb2.RAW)
+    raw_ciphertext1 = primitive1.encrypt(b'plaintext1', b'associated_data1')
+    raw_ciphertext2 = primitive2.encrypt(b'plaintext2', b'associated_data2')
+
+    pset = primitive_set.new_primitive_set(aead.Aead)
+    pset.add_primitive(primitive1, raw_key1)
+    pset.set_primary(
+        pset.add_primitive(primitive2, raw_key2))
+    wrapped_aead = aead_wrapper.AeadWrapper().wrap(pset)
+
+    self.assertEqual(
+        wrapped_aead.decrypt(raw_ciphertext1, b'associated_data1'),
+        b'plaintext1')
+    self.assertEqual(
+        wrapped_aead.decrypt(raw_ciphertext2, b'associated_data2'),
+        b'plaintext2')
+    self.assertEqual(
+        wrapped_aead.decrypt(
+            wrapped_aead.encrypt(b'plaintext', b'associated_data'),
+            b'associated_data'),
+        b'plaintext')
+
+  def test_decrypt_unknown_ciphertext_fails(self):
+    unknown_primitive = helper.FakeAead('unknownFakeAead')
+    unknown_ciphertext = unknown_primitive.encrypt(b'plaintext',
+                                                   b'associated_data')
+
+    pset = primitive_set.new_primitive_set(aead.Aead)
+    primitive, raw_key = self.new_primitive_key_pair(1234, tink_pb2.RAW)
+    new_primitive, new_key = self.new_primitive_key_pair(5678, tink_pb2.TINK)
+    pset.add_primitive(primitive, raw_key)
+    new_entry = pset.add_primitive(new_primitive, new_key)
+    pset.set_primary(new_entry)
+    wrapped_aead = aead_wrapper.AeadWrapper().wrap(pset)
+
+    with self.assertRaisesRegex(tink_error.TinkError, 'Decryption failed'):
+      wrapped_aead.decrypt(unknown_ciphertext, b'associated_data')
+
+  def test_decrypt_wrong_associated_data_fails(self):
+    primitive, key = self.new_primitive_key_pair(1234, tink_pb2.TINK)
+    pset = primitive_set.new_primitive_set(aead.Aead)
+    entry = pset.add_primitive(primitive, key)
+    pset.set_primary(entry)
+    wrapped_aead = aead_wrapper.AeadWrapper().wrap(pset)
+
+    ciphertext = wrapped_aead.encrypt(b'plaintext', b'associated_data')
+    with self.assertRaisesRegex(tink_error.TinkError, 'Decryption failed'):
+      wrapped_aead.decrypt(ciphertext, b'wrong_associated_data')
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/cc/BUILD.bazel b/python/cc/BUILD.bazel
new file mode 100644
index 0000000..84d4fc7
--- /dev/null
+++ b/python/cc/BUILD.bazel
@@ -0,0 +1,198 @@
+package(default_visibility = ["//tools/build_defs:internal_pkg"])
+
+licenses(["notice"])
+
+cc_library(
+    name = "cc_key_manager",
+    hdrs = ["cc_key_manager.h"],
+    include_prefix = "tink/",
+    deps = [
+        "//cc",
+        "//cc/util:errors",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "//proto:tink_cc_proto",
+    ],
+)
+
+cc_library(
+    name = "python_file_object_adapter",
+    hdrs = ["python_file_object_adapter.h"],
+    include_prefix = "tink/python",
+    strip_include_prefix = "/python",
+    deps = [
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
+cc_library(
+    name = "python_output_stream",
+    srcs = ["python_output_stream.cc"],
+    hdrs = ["python_output_stream.h"],
+    include_prefix = "tink/python",
+    strip_include_prefix = "/python",
+    deps = [
+        ":python_file_object_adapter",
+        "//cc:output_stream",
+        "//cc/subtle:subtle_util",
+        "//cc/util:errors",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@com_google_absl//absl/base:core_headers",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
+cc_test(
+    name = "python_output_stream_test",
+    size = "medium",
+    srcs = ["python_output_stream_test.cc"],
+    linkopts = ["-lpthread"],
+    deps = [
+        ":python_output_stream",
+        ":test_util",
+        "//cc/subtle:random",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_library(
+    name = "output_stream_adapter",
+    srcs = ["output_stream_adapter.cc"],
+    hdrs = ["output_stream_adapter.h"],
+    include_prefix = "tink/python",
+    strip_include_prefix = "/python",
+    deps = [
+        "//cc:output_stream",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
+cc_test(
+    name = "output_stream_adapter_test",
+    size = "small",
+    srcs = ["output_stream_adapter_test.cc"],
+    deps = [
+        ":output_stream_adapter",
+        "//cc:output_stream",
+        "//cc/subtle:random",
+        "//cc/util:ostream_output_stream",
+        "//cc/util:test_matchers",
+        "@com_google_absl//absl/memory",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_library(
+    name = "test_util",
+    hdrs = ["test_util.h"],
+    include_prefix = "tink/python",
+    strip_include_prefix = "/python",
+    deps = [
+        ":python_file_object_adapter",
+    ],
+)
+
+cc_library(
+    name = "cc_streaming_aead_wrappers",
+    srcs = ["cc_streaming_aead_wrappers.cc"],
+    hdrs = ["cc_streaming_aead_wrappers.h"],
+    include_prefix = "tink/python",
+    strip_include_prefix = "/python",
+    deps = [
+        ":input_stream_adapter",
+        ":output_stream_adapter",
+        ":python_file_object_adapter",
+        ":python_input_stream",
+        ":python_output_stream",
+        "//cc:input_stream",
+        "//cc:output_stream",
+        "//cc:streaming_aead",
+        "//cc/util:statusor",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
+cc_test(
+    name = "cc_streaming_aead_wrappers_test",
+    size = "small",
+    srcs = ["cc_streaming_aead_wrappers_test.cc"],
+    deps = [
+        ":cc_streaming_aead_wrappers",
+        ":test_util",
+        "//cc/util:test_matchers",
+        "//cc/util:test_util",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_library(
+    name = "python_input_stream",
+    srcs = ["python_input_stream.cc"],
+    hdrs = ["python_input_stream.h"],
+    include_prefix = "tink/python",
+    strip_include_prefix = "/python",
+    deps = [
+        ":python_file_object_adapter",
+        "//cc:input_stream",
+        "//cc/subtle:subtle_util",
+        "//cc/util:errors",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@com_google_absl//absl/base:core_headers",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
+cc_test(
+    name = "python_input_stream_test",
+    size = "medium",
+    srcs = ["python_input_stream_test.cc"],
+    deps = [
+        ":python_input_stream",
+        ":test_util",
+        "//cc/subtle:random",
+        "//cc/util:test_util",
+        "@com_google_absl//absl/memory",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
+
+cc_library(
+    name = "input_stream_adapter",
+    srcs = ["input_stream_adapter.cc"],
+    hdrs = ["input_stream_adapter.h"],
+    include_prefix = "tink/python",
+    strip_include_prefix = "/python",
+    deps = [
+        "//cc:input_stream",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@com_google_absl//absl/strings",
+    ],
+)
+
+cc_test(
+    name = "input_stream_adapter_test",
+    size = "small",
+    srcs = ["input_stream_adapter_test.cc"],
+    deps = [
+        ":input_stream_adapter",
+        "//cc:input_stream",
+        "//cc/subtle:random",
+        "//cc/util:istream_input_stream",
+        "//cc/util:test_matchers",
+        "@com_google_absl//absl/memory",
+        "@com_google_googletest//:gtest_main",
+    ],
+)
diff --git a/python/cc/cc_key_manager.h b/python/cc/cc_key_manager.h
new file mode 100644
index 0000000..a1ceb54
--- /dev/null
+++ b/python/cc/cc_key_manager.h
@@ -0,0 +1,102 @@
+// Copyright 2019 Google LLC.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_PYTHON_CC_CC_KEY_MANAGER_H_
+#define TINK_PYTHON_CC_CC_KEY_MANAGER_H_
+
+#include <algorithm>
+#include <vector>
+
+#include "tink/key_manager.h"
+#include "tink/util/errors.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "proto/tink.pb.h"
+#include "tink/registry.h"
+
+namespace crypto {
+namespace tink {
+
+/**
+ * CcKeyManager is a thin wrapper of KeyManager in
+ * third_party/tink/cc/key_manager.h
+ * It only implements the methods currently needed in Python, and slightly
+ * changes the interface to ease usage of CLIF.
+ */
+template<class P>
+class CcKeyManager {
+ public:
+  // Returns a key manager from the registry.
+  static util::StatusOr<std::unique_ptr<CcKeyManager<P>>>
+  GetFromCcRegistry(const std::string& type_url) {
+    auto key_manager_result = Registry::get_key_manager<P>(type_url);
+    if (!key_manager_result.ok()) {
+      return ToStatusF(util::error::FAILED_PRECONDITION,
+                       "No manager for key type '%s' found in the registry.",
+                       type_url.c_str());
+    }
+    return absl::make_unique<CcKeyManager<P>>(
+        key_manager_result.ValueOrDie());
+  }
+
+  explicit CcKeyManager(const KeyManager<P>* key_manager)
+      : key_manager_(key_manager) {}
+
+  // Constructs an instance of P for the given 'key_data'.
+  crypto::tink::util::StatusOr<std::unique_ptr<P>> GetPrimitive(
+      const google::crypto::tink::KeyData& key_data) {
+    return key_manager_->GetPrimitive(key_data);
+  }
+
+  // Creates a new random key, based on the specified 'key_format'.
+  crypto::tink::util::StatusOr<std::unique_ptr<google::crypto::tink::KeyData>>
+      NewKeyData(const google::crypto::tink::KeyTemplate& key_template) {
+    if (key_manager_->get_key_type() != key_template.type_url()) {
+      return ToStatusF(util::error::INVALID_ARGUMENT,
+                       "Key type '%s' is not supported by this manager.",
+                       key_template.type_url().c_str());
+    }
+    return key_manager_->get_key_factory().NewKeyData(key_template.value());
+  }
+
+  // Returns public key data extracted from the given private_key_data.
+  crypto::tink::util::StatusOr<std::unique_ptr<google::crypto::tink::KeyData>>
+  GetPublicKeyData(
+      const google::crypto::tink::KeyData& private_key_data) const {
+    const PrivateKeyFactory* factory = dynamic_cast<const PrivateKeyFactory*>(
+        &key_manager_->get_key_factory());
+    if (factory == nullptr) {
+      return ToStatusF(util::error::INVALID_ARGUMENT,
+                       "KeyManager for type '%s' does not have "
+                       "a PrivateKeyFactory.",
+                       key_manager_->get_key_type().c_str());
+    }
+    auto result = factory->GetPublicKeyData(private_key_data.value());
+    return result;
+  }
+
+  // Returns the type_url identifying the key type handled by this manager.
+  std::string KeyType() {
+    return key_manager_->get_key_type();
+  }
+
+ private:
+  const KeyManager<P>* key_manager_;
+};
+
+}  // namespace tink
+}  // namespace crypto
+#endif  // TINK_PYTHON_CC_CC_KEY_MANAGER_H_
diff --git a/python/cc/cc_streaming_aead_wrappers.cc b/python/cc/cc_streaming_aead_wrappers.cc
new file mode 100644
index 0000000..59e5b7e
--- /dev/null
+++ b/python/cc/cc_streaming_aead_wrappers.cc
@@ -0,0 +1,60 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/python/cc/cc_streaming_aead_wrappers.h"
+
+#include "tink/input_stream.h"
+#include "tink/output_stream.h"
+
+namespace crypto {
+namespace tink {
+
+util::StatusOr<std::unique_ptr<OutputStreamAdapter>> NewCcEncryptingStream(
+    StreamingAead* streaming_aead, absl::string_view aad,
+    std::unique_ptr<PythonFileObjectAdapter> ciphertext_destination) {
+  // Get a destination OutputStream from the destination
+  // PythonFileObjectAdapter.
+  std::unique_ptr<OutputStream> destination_os =
+      absl::make_unique<PythonOutputStream>(std::move(ciphertext_destination));
+
+  // Get an EncryptingStream from the destination OutputStream.
+  auto result =
+      streaming_aead->NewEncryptingStream(std::move(destination_os), aad);
+  if (!result.ok()) {
+    return result.status();
+  }
+
+  // Get an OutputStreamAdapter from the EncryptingStream
+  return absl::make_unique<OutputStreamAdapter>(std::move(result.ValueOrDie()));
+}
+
+util::StatusOr<std::unique_ptr<InputStreamAdapter>> NewCcDecryptingStream(
+    StreamingAead* streaming_aead, absl::string_view aad,
+    std::unique_ptr<PythonFileObjectAdapter> ciphertext_source) {
+  // Get a source InputStream from the source PythonFileObjectAdapter.
+  std::unique_ptr<InputStream> source_os =
+      absl::make_unique<PythonInputStream>(std::move(ciphertext_source));
+
+  // Get a DecryptingStream from the source InputStream.
+  auto result = streaming_aead->NewDecryptingStream(std::move(source_os), aad);
+  if (!result.ok()) {
+    return result.status();
+  }
+
+  // Get an InputStreamAdapter from the DecryptingStream
+  return absl::make_unique<InputStreamAdapter>(std::move(result.ValueOrDie()));
+}
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/python/cc/cc_streaming_aead_wrappers.h b/python/cc/cc_streaming_aead_wrappers.h
new file mode 100644
index 0000000..b3171e1
--- /dev/null
+++ b/python/cc/cc_streaming_aead_wrappers.h
@@ -0,0 +1,57 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_PYTHON_CC_CC_STREAMING_AEAD_WRAPPERS_H_
+#define TINK_PYTHON_CC_CC_STREAMING_AEAD_WRAPPERS_H_
+
+#include <memory>
+
+#include "absl/strings/string_view.h"
+#include "tink/streaming_aead.h"
+#include "tink/util/statusor.h"
+#include "tink/python/cc/input_stream_adapter.h"
+#include "tink/python/cc/output_stream_adapter.h"
+#include "tink/python/cc/python_file_object_adapter.h"
+#include "tink/python/cc/python_input_stream.h"
+#include "tink/python/cc/python_output_stream.h"
+
+namespace crypto {
+namespace tink {
+
+// Wrapper function for StreamingAead.NewEncryptingStream
+//
+// It uses 'streaming_aead' to create an EncryptingStream that writes the
+// ciphertext to 'ciphertext_destination' through a PythonOutputStream, and
+// returns an OutputStreamAdapter that wraps this EncryptingStream.
+// Taking a raw pointer signals to CLIF that the object is borrowed - ownership
+// is not taken, and the value is not copied.
+util::StatusOr<std::unique_ptr<OutputStreamAdapter>> NewCcEncryptingStream(
+    StreamingAead* streaming_aead, const absl::string_view aad,
+    std::unique_ptr<PythonFileObjectAdapter> ciphertext_destination);
+
+// Wrapper function for StreamingAead.NewDecryptingStream
+//
+// It uses 'streaming_aead' to create a DecryptingStream that reads the
+// ciphertext from 'ciphertext_source' through a PythonInputStream, and
+// returns an InputStreamAdapter that wraps this DecryptingStream.
+// Taking a raw pointer signals to CLIF that the object is borrowed - ownership
+// is not taken, and the value is not copied.
+util::StatusOr<std::unique_ptr<InputStreamAdapter>> NewCcDecryptingStream(
+    StreamingAead* streaming_aead, const absl::string_view aad,
+    std::unique_ptr<PythonFileObjectAdapter> ciphertext_source);
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_PYTHON_CC_CC_STREAMING_AEAD_WRAPPERS_H_
diff --git a/python/cc/cc_streaming_aead_wrappers_test.cc b/python/cc/cc_streaming_aead_wrappers_test.cc
new file mode 100644
index 0000000..06e56b4
--- /dev/null
+++ b/python/cc/cc_streaming_aead_wrappers_test.cc
@@ -0,0 +1,53 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/python/cc/cc_streaming_aead_wrappers.h"
+
+#include "gtest/gtest.h"
+#include "tink/util/test_matchers.h"
+#include "tink/util/test_util.h"
+#include "tink/python/cc/test_util.h"
+
+namespace crypto {
+namespace tink {
+namespace {
+
+using crypto::tink::test::DummyStreamingAead;
+using crypto::tink::test::IsOk;
+
+TEST(CcStreamingAeadWrappersTest, BasicNewCcEncryptingStream) {
+  DummyStreamingAead dummy_saead = DummyStreamingAead("Some streaming AEAD");
+  std::unique_ptr<PythonFileObjectAdapter> output =
+      absl::make_unique<test::TestWritableObject>();
+
+  auto result =
+      NewCcEncryptingStream(&dummy_saead, "associated data", std::move(output));
+
+  EXPECT_THAT(result.status(), IsOk());
+}
+
+TEST(CcStreamingAeadWrappersTest, BasicNewCcDecryptingStream) {
+  DummyStreamingAead dummy_saead = DummyStreamingAead("Some streaming AEAD");
+  std::unique_ptr<PythonFileObjectAdapter> input =
+      absl::make_unique<test::TestReadableObject>("data");
+
+  auto result =
+      NewCcDecryptingStream(&dummy_saead, "associated data", std::move(input));
+
+  EXPECT_THAT(result.status(), IsOk());
+}
+
+}  // namespace
+}  // namespace tink
+}  // namespace crypto
diff --git a/python/cc/cc_tink_config.cc b/python/cc/cc_tink_config.cc
new file mode 100644
index 0000000..6110186
--- /dev/null
+++ b/python/cc/cc_tink_config.cc
@@ -0,0 +1,33 @@
+// Copyright 2019 Google LLC.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/python/cc/cc_tink_config.h"
+
+#include "tink/config/tink_config.h"
+
+namespace crypto {
+namespace tink {
+
+util::Status CcTinkConfigRegister() {
+  return TinkConfig::Register();
+}
+
+const google::crypto::tink::RegistryConfig& CcTinkConfigLatest() {
+  return TinkConfig::Latest();
+}
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/python/cc/cc_tink_config.h b/python/cc/cc_tink_config.h
new file mode 100644
index 0000000..16eeb22
--- /dev/null
+++ b/python/cc/cc_tink_config.h
@@ -0,0 +1,34 @@
+// Copyright 2019 Google LLC.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_PYTHON_CC_CC_TINK_CONFIG_H_
+#define TINK_PYTHON_CC_CC_TINK_CONFIG_H_
+
+#include "tink/util/status.h"
+#include "tink/registry.h"
+#include "proto/config.pb.h"
+
+namespace crypto {
+namespace tink {
+
+crypto::tink::util::Status CcTinkConfigRegister();
+
+const google::crypto::tink::RegistryConfig& CcTinkConfigLatest();
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_PYTHON_CC_CC_TINK_CONFIG_H_
diff --git a/python/cc/clif/cc_key_manager.clif b/python/cc/clif/cc_key_manager.clif
new file mode 100644
index 0000000..8036715
--- /dev/null
+++ b/python/cc/clif/cc_key_manager.clif
@@ -0,0 +1,133 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from "tink/proto/tink_pyclif.h" import *  # KeyTemplate, KeyData
+from "tink/python/util/clif.h" import *  # StatusOr
+from "tink/cc/python/aead.h" import *  # Aead
+from "tink/cc/python/deterministic_aead.h" import *  # DeterministicAead
+from "tink/cc/python/hybrid_decrypt.h" import *  # HybridDecrypt
+from "tink/cc/python/streaming_aead.h" import *  # StreamingAead
+from "tink/cc/python/hybrid_encrypt.h" import *  # HybridEncrypt
+from "tink/cc/python/mac.h" import *  # Mac
+from "tink/cc/python/public_key_sign.h" import *  # PublicKeySign
+from "tink/cc/python/public_key_verify.h" import *  # PublicKeyVerify
+
+from tink.cc.python.aead import Aead
+from tink.cc.python.deterministic_aead import DeterministicAead
+from tink.cc.python.streaming_aead import StreamingAead
+from tink.cc.python.hybrid_decrypt import HybridDecrypt
+from tink.cc.python.hybrid_encrypt import HybridEncrypt
+from tink.cc.python.mac import Mac
+
+from "tink/python/cc/cc_key_manager.h":
+  namespace `crypto::tink`:
+    # Key Manager for AEAD (authenticated encryption with associated data).
+    class `CcKeyManager<Aead>` as AeadKeyManager:
+      @classmethod
+      def `GetFromCcRegistry`as from_cc_registry(cls, type_url: str)
+      -> StatusOr<AeadKeyManager>
+
+      def `GetPrimitive` as primitive(self, key_data:KeyData)
+        -> StatusOr<Aead>
+      def `KeyType` as key_type(self) -> str
+      def `NewKeyData` as new_key_data(self, key_template:KeyTemplate)
+        -> StatusOr<KeyData>
+
+    # Key Manager for Deterministic AEAD.
+    class `CcKeyManager<DeterministicAead>` as DeterministicAeadKeyManager:
+      @classmethod
+      def `GetFromCcRegistry`as from_cc_registry(cls, type_url: str)
+      -> StatusOr<DeterministicAeadKeyManager>
+
+      def `GetPrimitive` as primitive(self, key_data:KeyData)
+        -> StatusOr<DeterministicAead>
+      def `KeyType` as key_type(self) -> str
+      def `NewKeyData` as new_key_data(self, key_template:KeyTemplate)
+        -> StatusOr<KeyData>
+
+    # Key Manager for Streaming AEAD.
+    class `CcKeyManager<StreamingAead>` as StreamingAeadKeyManager:
+      @classmethod
+      def `GetFromCcRegistry`as from_cc_registry(cls, type_url: str)
+      -> StatusOr<StreamingAeadKeyManager>
+
+      def `GetPrimitive` as primitive(self, key_data:KeyData)
+        -> StatusOr<StreamingAead>
+      def `KeyType` as key_type(self) -> str
+      def `NewKeyData` as new_key_data(self, key_template:KeyTemplate)
+        -> StatusOr<KeyData>
+
+    # Key Manager for HybridDecrypt.
+    class `CcKeyManager<HybridDecrypt>` as HybridDecryptKeyManager:
+      @classmethod
+      def `GetFromCcRegistry`as from_cc_registry(cls, type_url: str)
+      -> StatusOr<HybridDecryptKeyManager>
+
+      def `GetPrimitive` as primitive(self, key_data:KeyData)
+        -> StatusOr<HybridDecrypt>
+      def `KeyType` as key_type(self) -> str
+      def `NewKeyData` as new_key_data(self, key_template:KeyTemplate)
+        -> StatusOr<KeyData>
+      def `GetPublicKeyData` as public_key_data(self, key_data:KeyData)
+        -> StatusOr<KeyData>
+
+    # Key Manager for HybridEncrypt.
+    class `CcKeyManager<HybridEncrypt>` as HybridEncryptKeyManager:
+      @classmethod
+      def `GetFromCcRegistry`as from_cc_registry(cls, type_url: str)
+      -> StatusOr<HybridEncryptKeyManager>
+
+      def `GetPrimitive` as primitive(self, key_data:KeyData)
+        -> StatusOr<HybridEncrypt>
+      def `KeyType` as key_type(self) -> str
+      def `NewKeyData` as new_key_data(self, key_template:KeyTemplate)
+        -> StatusOr<KeyData>
+
+    # Key Manager for MAC (message authentication code).
+    class `CcKeyManager<Mac>` as MacKeyManager:
+      @classmethod
+      def `GetFromCcRegistry`as from_cc_registry(cls, type_url: str)
+      -> StatusOr<MacKeyManager>
+
+      def `GetPrimitive` as primitive(self, key_data:KeyData)
+        -> StatusOr<Mac>
+      def `KeyType` as key_type(self) -> str
+      def `NewKeyData` as new_key_data(self, key_template:KeyTemplate)
+        -> StatusOr<KeyData>
+
+    # Key Manager for Public Key signing.
+    class `CcKeyManager<PublicKeySign>` as PublicKeySignKeyManager:
+      @classmethod
+      def `GetFromCcRegistry`as from_cc_registry(cls, type_url: str)
+      -> StatusOr<PublicKeySignKeyManager>
+
+      def `GetPrimitive` as primitive(self, key_data: KeyData)
+        -> StatusOr<PublicKeySign>
+      def `KeyType` as key_type(self) -> str
+      def `NewKeyData` as new_key_data(self, key_template: KeyTemplate)
+        -> StatusOr<KeyData>
+      def `GetPublicKeyData` as public_key_data(self, key_data:KeyData)
+        -> StatusOr<KeyData>
+
+    # Key Manager for Public Key verification.
+    class `CcKeyManager<PublicKeyVerify>` as PublicKeyVerifyKeyManager:
+      @classmethod
+      def `GetFromCcRegistry`as from_cc_registry(cls, type_url: str)
+      -> StatusOr<PublicKeyVerifyKeyManager>
+
+      def `GetPrimitive` as primitive(self, key_data: KeyData)
+        -> StatusOr<PublicKeyVerify>
+      def `KeyType` as key_type(self) -> str
+      def `NewKeyData` as new_key_data(self, key_template: KeyTemplate)
+        -> StatusOr<KeyData>
diff --git a/python/cc/clif/cc_key_manager_test.py b/python/cc/clif/cc_key_manager_test.py
new file mode 100644
index 0000000..64a3885
--- /dev/null
+++ b/python/cc/clif/cc_key_manager_test.py
@@ -0,0 +1,331 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.cc.clif.py_key_manager."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+from tink.proto import aes_eax_pb2
+from tink.proto import aes_siv_pb2
+from tink.proto import common_pb2
+from tink.proto import ecdsa_pb2
+from tink.proto import ecies_aead_hkdf_pb2
+from tink.proto import hmac_pb2
+from tink.proto import tink_pb2
+from tink.python.aead import aead_key_templates
+from tink.python.cc.clif import cc_key_manager
+from tink.python.cc.clif import cc_tink_config
+from tink.python.hybrid import hybrid_key_templates
+from tink.util import error
+
+
+def setUpModule():
+  cc_tink_config.register()
+
+
+class AeadKeyManagerTest(absltest.TestCase):
+
+  def setUp(self):
+    super(AeadKeyManagerTest, self).setUp()
+    self.key_manager = cc_key_manager.AeadKeyManager.from_cc_registry(
+        'type.googleapis.com/google.crypto.tink.AesEaxKey')
+
+  def new_aes_eax_key_template(self, iv_size, key_size):
+    key_format = aes_eax_pb2.AesEaxKeyFormat()
+    key_format.params.iv_size = iv_size
+    key_format.key_size = key_size
+    key_template = tink_pb2.KeyTemplate()
+    key_template.type_url = 'type.googleapis.com/google.crypto.tink.AesEaxKey'
+    key_template.value = key_format.SerializeToString()
+    return key_template
+
+  def test_key_type(self):
+    self.assertEqual(self.key_manager.key_type(),
+                     'type.googleapis.com/google.crypto.tink.AesEaxKey')
+
+  def test_new_key_data(self):
+    key_template = self.new_aes_eax_key_template(12, 16)
+    key_data = self.key_manager.new_key_data(key_template)
+    self.assertEqual(key_data.type_url, self.key_manager.key_type())
+    self.assertEqual(key_data.key_material_type, tink_pb2.KeyData.SYMMETRIC)
+    key = aes_eax_pb2.AesEaxKey()
+    key.ParseFromString(key_data.value)
+    self.assertEqual(key.version, 0)
+    self.assertEqual(key.params.iv_size, 12)
+    self.assertLen(key.key_value, 16)
+
+  def test_invalid_params_throw_exception(self):
+    key_template = self.new_aes_eax_key_template(9, 16)
+    with self.assertRaises(error.StatusNotOk):
+      self.key_manager.new_key_data(key_template)
+
+  def test_encrypt_decrypt(self):
+    aead = self.key_manager.primitive(
+        self.key_manager.new_key_data(self.new_aes_eax_key_template(12, 16)))
+    plaintext = b'plaintext'
+    associated_data = b'associated_data'
+    ciphertext = aead.encrypt(plaintext, associated_data)
+    self.assertEqual(aead.decrypt(ciphertext, associated_data), plaintext)
+
+
+class DeterministicAeadKeyManagerTest(absltest.TestCase):
+
+  def setUp(self):
+    super(DeterministicAeadKeyManagerTest, self).setUp()
+    daead_key_manager = cc_key_manager.DeterministicAeadKeyManager
+    self.key_manager = daead_key_manager.from_cc_registry(
+        'type.googleapis.com/google.crypto.tink.AesSivKey')
+
+  def new_aes_siv_key_template(self, key_size):
+    key_format = aes_siv_pb2.AesSivKeyFormat()
+    key_format.key_size = key_size
+    key_template = tink_pb2.KeyTemplate()
+    key_template.type_url = 'type.googleapis.com/google.crypto.tink.AesSivKey'
+    key_template.value = key_format.SerializeToString()
+    return key_template
+
+  def test_key_type(self):
+    self.assertEqual(self.key_manager.key_type(),
+                     'type.googleapis.com/google.crypto.tink.AesSivKey')
+
+  def test_new_key_data(self):
+    key_template = self.new_aes_siv_key_template(64)
+    key_data = self.key_manager.new_key_data(key_template)
+    self.assertEqual(key_data.type_url, self.key_manager.key_type())
+    self.assertEqual(key_data.key_material_type, tink_pb2.KeyData.SYMMETRIC)
+    key = aes_siv_pb2.AesSivKey()
+    key.ParseFromString(key_data.value)
+    self.assertEqual(key.version, 0)
+    self.assertLen(key.key_value, 64)
+
+  def test_invalid_params_throw_exception(self):
+    key_template = self.new_aes_siv_key_template(65)
+    with self.assertRaises(error.StatusNotOk):
+      self.key_manager.new_key_data(key_template)
+
+  def test_encrypt_decrypt(self):
+    aead = self.key_manager.primitive(
+        self.key_manager.new_key_data(self.new_aes_siv_key_template(64)))
+    plaintext = b'plaintext'
+    associated_data = b'associated_data'
+    ciphertext = aead.encrypt_deterministically(plaintext, associated_data)
+    self.assertEqual(
+        aead.decrypt_deterministically(ciphertext, associated_data), plaintext)
+
+
+class HybridKeyManagerTest(absltest.TestCase):
+
+  def hybrid_decrypt_key_manager(self):
+    return cc_key_manager.HybridDecryptKeyManager.from_cc_registry(
+        'type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey')
+
+  def hybrid_encrypt_key_manager(self):
+    return cc_key_manager.HybridEncryptKeyManager.from_cc_registry(
+        'type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey')
+
+  def test_new_key_data(self):
+    key_manager = self.hybrid_decrypt_key_manager()
+    key_data = key_manager.new_key_data(
+        hybrid_key_templates.ECIES_P256_HKDF_HMAC_SHA256_AES128_GCM)
+    self.assertEqual(key_data.type_url, key_manager.key_type())
+    self.assertEqual(key_data.key_material_type,
+                     tink_pb2.KeyData.ASYMMETRIC_PRIVATE)
+    key = ecies_aead_hkdf_pb2.EciesAeadHkdfPrivateKey()
+    key.ParseFromString(key_data.value)
+    self.assertLen(key.key_value, 32)
+    self.assertEqual(key.public_key.params.kem_params.curve_type,
+                     common_pb2.NIST_P256)
+
+  def test_new_key_data_invalid_params_throw_exception(self):
+    with self.assertRaisesRegex(error.StatusNotOk,
+                                'Unsupported elliptic curve'):
+      self.hybrid_decrypt_key_manager().new_key_data(
+          hybrid_key_templates.create_ecies_aead_hkdf_key_template(
+              curve_type=100,
+              ec_point_format=common_pb2.UNCOMPRESSED,
+              hash_type=common_pb2.SHA256,
+              dem_key_template=aead_key_templates.AES128_GCM))
+
+  def test_encrypt_decrypt(self):
+    decrypt_key_manager = self.hybrid_decrypt_key_manager()
+    encrypt_key_manager = self.hybrid_encrypt_key_manager()
+    key_data = decrypt_key_manager.new_key_data(
+        hybrid_key_templates.ECIES_P256_HKDF_HMAC_SHA256_AES128_GCM)
+    public_key_data = decrypt_key_manager.public_key_data(key_data)
+    hybrid_encrypt = encrypt_key_manager.primitive(public_key_data)
+    ciphertext = hybrid_encrypt.encrypt(b'some plaintext', b'some context info')
+    hybrid_decrypt = decrypt_key_manager.primitive(key_data)
+    self.assertEqual(hybrid_decrypt.decrypt(ciphertext, b'some context info'),
+                     b'some plaintext')
+
+  def test_decrypt_fails(self):
+    decrypt_key_manager = self.hybrid_decrypt_key_manager()
+    key_data = decrypt_key_manager.new_key_data(
+        hybrid_key_templates.ECIES_P256_HKDF_HMAC_SHA256_AES128_GCM)
+    hybrid_decrypt = decrypt_key_manager.primitive(key_data)
+    with self.assertRaisesRegex(error.StatusNotOk, 'ciphertext too short'):
+      hybrid_decrypt.decrypt(b'bad ciphertext', b'some context info')
+
+
+class MacKeyManagerTest(absltest.TestCase):
+
+  def setUp(self):
+    super(MacKeyManagerTest, self).setUp()
+    self.key_manager = cc_key_manager.MacKeyManager.from_cc_registry(
+        'type.googleapis.com/google.crypto.tink.HmacKey')
+
+  def new_hmac_key_template(self, hash_type, tag_size, key_size):
+    key_format = hmac_pb2.HmacKeyFormat()
+    key_format.params.hash = hash_type
+    key_format.params.tag_size = tag_size
+    key_format.key_size = key_size
+    key_template = tink_pb2.KeyTemplate()
+    key_template.type_url = 'type.googleapis.com/google.crypto.tink.HmacKey'
+    key_template.value = key_format.SerializeToString()
+    return key_template
+
+  def test_key_type(self):
+    self.assertEqual(self.key_manager.key_type(),
+                     'type.googleapis.com/google.crypto.tink.HmacKey')
+
+  def test_new_key_data(self):
+    key_template = self.new_hmac_key_template(common_pb2.SHA256, 24, 16)
+    key_data = self.key_manager.new_key_data(key_template)
+    self.assertEqual(key_data.type_url, self.key_manager.key_type())
+    key = hmac_pb2.HmacKey()
+    key.ParseFromString(key_data.value)
+    self.assertEqual(key.version, 0)
+    self.assertEqual(key.params.hash, common_pb2.SHA256)
+    self.assertEqual(key.params.tag_size, 24)
+    self.assertLen(key.key_value, 16)
+
+  def test_invalid_params_throw_exception(self):
+    key_template = self.new_hmac_key_template(common_pb2.SHA256, 9, 16)
+    with self.assertRaises(error.StatusNotOk):
+      self.key_manager.new_key_data(key_template)
+
+  def test_mac_success(self):
+    mac = self.key_manager.primitive(
+        self.key_manager.new_key_data(
+            self.new_hmac_key_template(common_pb2.SHA256, 24, 16)))
+    data = b'data'
+    tag = mac.compute_mac(data)
+    self.assertLen(tag, 24)
+    # No exception raised.
+    mac.verify_mac(tag, data)
+
+  def test_mac_wrong(self):
+    mac = self.key_manager.primitive(
+        self.key_manager.new_key_data(
+            self.new_hmac_key_template(common_pb2.SHA256, 16, 16)))
+    with self.assertRaisesRegex(error.StatusNotOk, 'verification failed'):
+      mac.verify_mac(b'0123456789ABCDEF', b'data')
+
+
+class PublicKeySignVerifyKeyManagerTest(absltest.TestCase):
+
+  def setUp(self):
+    super(PublicKeySignVerifyKeyManagerTest, self).setUp()
+    public_key_verify_manager = cc_key_manager.PublicKeyVerifyKeyManager
+    self.key_manager_verify = public_key_verify_manager.from_cc_registry(
+        'type.googleapis.com/google.crypto.tink.EcdsaPublicKey')
+    public_key_sign_manager = cc_key_manager.PublicKeySignKeyManager
+    self.key_manager_sign = public_key_sign_manager.from_cc_registry(
+        'type.googleapis.com/google.crypto.tink.EcdsaPrivateKey')
+
+  def new_ecdsa_key_template(self, hash_type, curve_type, encoding,
+                             public=False):
+    params = ecdsa_pb2.EcdsaParams(
+        hash_type=hash_type, curve=curve_type, encoding=encoding)
+    key_format = ecdsa_pb2.EcdsaKeyFormat(params=params)
+    key_template = tink_pb2.KeyTemplate()
+    if public:
+      append = 'EcdsaPublicKey'
+    else:
+      append = 'EcdsaPrivateKey'
+    key_template.type_url = 'type.googleapis.com/google.crypto.tink.' + append
+
+    key_template.value = key_format.SerializeToString()
+    return key_template
+
+  def test_key_type_sign(self):
+    self.assertEqual(self.key_manager_sign.key_type(),
+                     'type.googleapis.com/google.crypto.tink.EcdsaPrivateKey')
+
+  def test_key_type_verify(self):
+    self.assertEqual(self.key_manager_verify.key_type(),
+                     'type.googleapis.com/google.crypto.tink.EcdsaPublicKey')
+
+  def test_new_key_data_sign(self):
+    key_template = self.new_ecdsa_key_template(
+        common_pb2.SHA256, common_pb2.NIST_P256, ecdsa_pb2.DER)
+    key_data = self.key_manager_sign.new_key_data(key_template)
+    self.assertEqual(key_data.type_url, self.key_manager_sign.key_type())
+    key = ecdsa_pb2.EcdsaPrivateKey()
+    key.ParseFromString(key_data.value)
+    public_key = key.public_key
+    self.assertEqual(key.version, 0)
+    self.assertEqual(public_key.version, 0)
+    self.assertEqual(public_key.params.hash_type, common_pb2.SHA256)
+    self.assertEqual(public_key.params.curve, common_pb2.NIST_P256)
+    self.assertEqual(public_key.params.encoding, ecdsa_pb2.DER)
+    self.assertLen(key.key_value, 32)
+
+  def test_new_key_data_verify(self):
+    key_template = self.new_ecdsa_key_template(
+        common_pb2.SHA256, common_pb2.NIST_P256, ecdsa_pb2.DER, True)
+    with self.assertRaisesRegex(error.StatusNotOk, 'not supported'):
+      self.key_manager_verify.new_key_data(key_template)
+
+  def test_signature_success(self):
+    priv_key = self.key_manager_sign.new_key_data(
+        self.new_ecdsa_key_template(common_pb2.SHA256, common_pb2.NIST_P256,
+                                    ecdsa_pb2.DER))
+    pub_key = self.key_manager_sign.public_key_data(priv_key)
+
+    verifier = self.key_manager_verify.primitive(pub_key)
+    signer = self.key_manager_sign.primitive(priv_key)
+
+    data = b'data'
+    signature = signer.sign(data)
+
+    # Starts with a DER sequence
+    self.assertEqual(bytearray(signature)[0], 0x30)
+
+    verifier.verify(signature, data)
+
+  def test_signature_fails(self):
+    key_template = self.new_ecdsa_key_template(
+        common_pb2.SHA256, common_pb2.NIST_P256, ecdsa_pb2.DER, False)
+    priv_key = self.key_manager_sign.new_key_data(key_template)
+    pub_key = self.key_manager_sign.public_key_data(priv_key)
+
+    signer = self.key_manager_sign.primitive(priv_key)
+    verifier = self.key_manager_verify.primitive(pub_key)
+
+    data = b'data'
+    signature = signer.sign(data)
+
+    with self.assertRaisesRegex(error.StatusNotOk, 'Signature is not valid'):
+      verifier.verify(signature, 'wrongdata')
+
+    with self.assertRaisesRegex(error.StatusNotOk, 'Signature is not valid'):
+      verifier.verify('wrongsignature', data)
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/cc/clif/cc_streaming_aead_wrappers.clif b/python/cc/clif/cc_streaming_aead_wrappers.clif
new file mode 100644
index 0000000..15de46c
--- /dev/null
+++ b/python/cc/clif/cc_streaming_aead_wrappers.clif
@@ -0,0 +1,31 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from "tink/python/util/clif.h" import *  # Status, StatusOr
+from "tink/cc/python/streaming_aead.h" import *  # StreamingAead
+from "tink/python/cc/clif/python_file_object_adapter.h" import *  # PythonFileObjectAdapter
+from "tink/python/cc/clif/input_stream_adapter.h" import *  # InputStreamAdapter
+from "tink/python/cc/clif/output_stream_adapter.h" import *  # OutputStreamAdapter
+
+from "tink/python/cc/cc_streaming_aead_wrappers.h":
+  namespace `crypto::tink`:
+    def `NewCcEncryptingStream` as new_cc_encrypting_stream(
+      primitive: StreamingAead,
+      aad: bytes,
+      destination: PythonFileObjectAdapter
+    ) -> StatusOr<OutputStreamAdapter>
+
+    def `NewCcDecryptingStream` as new_cc_decrypting_stream(
+      primitive: StreamingAead,
+      aad: bytes,
+      source: PythonFileObjectAdapter
+    ) -> StatusOr<InputStreamAdapter>
diff --git a/python/cc/clif/cc_tink_config.clif b/python/cc/clif/cc_tink_config.clif
new file mode 100644
index 0000000..3170c0e
--- /dev/null
+++ b/python/cc/clif/cc_tink_config.clif
@@ -0,0 +1,20 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from "tink/proto/config_pyclif.h" import *  # RegistryConfig
+from "tink/python/util/clif.h" import *  # StatusOr
+
+from "tink/python/cc/cc_tink_config.h":
+  namespace `crypto::tink`:
+    def `CcTinkConfigRegister` as register() -> Status
diff --git a/python/cc/clif/cc_tink_config_test.py b/python/cc/clif/cc_tink_config_test.py
new file mode 100644
index 0000000..2c45164
--- /dev/null
+++ b/python/cc/clif/cc_tink_config_test.py
@@ -0,0 +1,32 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.cc.clif.cc_tink_config."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+from tink.python.cc.clif import cc_tink_config
+
+
+class CcTinkConfigTest(absltest.TestCase):
+
+  def test_register(self):
+    cc_tink_config.register()
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/cc/clif/input_stream_adapter.clif b/python/cc/clif/input_stream_adapter.clif
new file mode 100644
index 0000000..3f82f5c
--- /dev/null
+++ b/python/cc/clif/input_stream_adapter.clif
@@ -0,0 +1,21 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from "tink/python/util/clif.h" import *  # StatusOr
+
+from "tink/python/cc/input_stream_adapter.h":
+  namespace `crypto::tink`:
+    class InputStreamAdapter:
+      def `Read1` as read1(self, size: int) -> StatusOr<bytes>
+
+      def `Read` as read(self, size: int) -> StatusOr<bytes>
+
diff --git a/python/cc/clif/output_stream_adapter.clif b/python/cc/clif/output_stream_adapter.clif
new file mode 100644
index 0000000..40fdc03
--- /dev/null
+++ b/python/cc/clif/output_stream_adapter.clif
@@ -0,0 +1,20 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from "tink/python/util/clif.h" import *  # Status, StatusOr
+
+from "tink/python/cc/output_stream_adapter.h":
+  namespace `crypto::tink`:
+    class OutputStreamAdapter:
+      def `Write` as write(self, data: bytes) -> StatusOr<int>
+
+      def `Close` as close(self) -> Status
diff --git a/python/cc/clif/python_file_object_adapter.clif b/python/cc/clif/python_file_object_adapter.clif
new file mode 100644
index 0000000..00d931e
--- /dev/null
+++ b/python/cc/clif/python_file_object_adapter.clif
@@ -0,0 +1,25 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from "tink/python/util/clif.h" import *  # Status, StatusOr
+
+from "tink/python/cc/python_file_object_adapter.h":
+  namespace `crypto::tink`:
+    class PythonFileObjectAdapter:
+      @virtual
+      def `Write` as write(self, data: bytes) -> StatusOr<int>
+
+      @virtual
+      def `Close` as close(self) -> Status
+
+      @virtual
+      def `Read` as read(self, size: int) -> StatusOr<bytes>
diff --git a/python/cc/input_stream_adapter.cc b/python/cc/input_stream_adapter.cc
new file mode 100644
index 0000000..5345bae
--- /dev/null
+++ b/python/cc/input_stream_adapter.cc
@@ -0,0 +1,69 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/python/cc/input_stream_adapter.h"
+
+#include <algorithm>
+
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+
+namespace {
+
+util::StatusOr<absl::string_view> Read1NoCopy(InputStream* stream,
+                                              int64_t size) {
+  const void* buffer;
+  auto next_result = stream->Next(&buffer);
+  if (!next_result.ok()) return next_result.status();
+  int available = next_result.ValueOrDie();
+  int read_count =
+      size < 0 ? available : std::min(static_cast<int64_t>(available), size);
+  if (read_count < available) stream->BackUp(available - read_count);
+  return absl::string_view(static_cast<const char*>(buffer), read_count);
+}
+
+}  // namespace
+
+util::StatusOr<std::string> InputStreamAdapter::Read1(int64_t size) {
+  auto result = Read1NoCopy(stream_.get(), size);
+  if (!result.ok()) return result.status();
+  return std::string(result.ValueOrDie());
+}
+
+util::StatusOr<std::string> InputStreamAdapter::Read(int64_t size) {
+  std::string buffer;
+  while (buffer.size() < size || size < 0) {
+    auto result =
+        Read1NoCopy(stream_.get(), size < 0 ? -1 : size - buffer.size());
+    if (!result.ok()) {
+      if (buffer.empty()) {
+        return result.status();
+      } else {
+        break;
+      }
+    }
+    auto data = result.ValueOrDie();
+    if (data.empty()) break;
+    absl::StrAppend(&buffer, data);
+  }
+  return buffer;
+}
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/python/cc/input_stream_adapter.h b/python/cc/input_stream_adapter.h
new file mode 100644
index 0000000..5ada14b
--- /dev/null
+++ b/python/cc/input_stream_adapter.h
@@ -0,0 +1,51 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_PYTHON_CC_INPUT_STREAM_ADAPTER_H_
+#define TINK_PYTHON_CC_INPUT_STREAM_ADAPTER_H_
+
+#include <memory>
+
+#include "tink/input_stream.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+
+// Adapts an InputStream for use in Python.
+class InputStreamAdapter {
+ public:
+  explicit InputStreamAdapter(std::unique_ptr<InputStream> stream)
+      : stream_(std::move(stream)) {}
+
+  // Reads at most 'size' bytes from the underlying InputStream using only one
+  // call to Next().
+  // If size is negative, all bytes that Next() gives are returned.
+  // Returns OUT_OF_RANGE status if the stream is already at EOF.
+  util::StatusOr<std::string> Read1(int64_t size);
+
+  // Reads at most 'size' bytes from the underlying InputStream.
+  // It repeatedly calls Next() as long as it returns positive values.
+  // If size is negative, it reads until EOF is reached or Next() returns 0.
+  // Returns OUT_OF_RANGE status if the stream is already at EOF.
+  util::StatusOr<std::string> Read(int64_t size);
+
+ private:
+  std::unique_ptr<InputStream> stream_;
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_PYTHON_CC_INPUT_STREAM_ADAPTER_H_
diff --git a/python/cc/input_stream_adapter_test.cc b/python/cc/input_stream_adapter_test.cc
new file mode 100644
index 0000000..c3bc67f
--- /dev/null
+++ b/python/cc/input_stream_adapter_test.cc
@@ -0,0 +1,119 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/python/cc/input_stream_adapter.h"
+
+#include <algorithm>
+#include <sstream>
+
+#include "gtest/gtest.h"
+#include "absl/memory/memory.h"
+#include "tink/input_stream.h"
+#include "tink/subtle/random.h"
+#include "tink/util/istream_input_stream.h"
+#include "tink/util/test_matchers.h"
+
+using crypto::tink::test::IsOk;
+using crypto::tink::test::StatusIs;
+
+namespace crypto {
+namespace tink {
+namespace {
+
+std::unique_ptr<InputStreamAdapter> GetInputStreamAdapter(
+    int buffer_size, const std::string& data) {
+  auto string_stream = absl::make_unique<std::stringstream>();
+  string_stream->write(data.data(), data.size());
+  auto input_stream = absl::make_unique<util::IstreamInputStream>(
+      std::move(string_stream), buffer_size);
+  return absl::make_unique<InputStreamAdapter>(std::move(input_stream));
+}
+
+TEST(InputStreamAdapterTest, BasicRead) {
+  std::string data = subtle::Random::GetRandomBytes(10);
+  auto adapter = GetInputStreamAdapter(-1, data);
+  auto read_result = adapter->Read(10);
+  ASSERT_THAT(read_result.status(), IsOk());
+  EXPECT_EQ(read_result.ValueOrDie(), data);
+}
+
+TEST(InputStreamAdapterTest, ReadEOFError) {
+  std::string data = subtle::Random::GetRandomBytes(10);
+  auto adapter = GetInputStreamAdapter(-1, data);
+  auto read_result = adapter->Read(10);
+  ASSERT_THAT(read_result.status(), IsOk());
+  EXPECT_EQ(read_result.ValueOrDie(), data);
+  read_result = adapter->Read(10);
+  EXPECT_THAT(read_result.status(), StatusIs(util::error::OUT_OF_RANGE));
+}
+
+TEST(InputStreamAdapterTest, MultipleRead) {
+  std::string data = subtle::Random::GetRandomBytes(15);
+  auto adapter = GetInputStreamAdapter(-1, data);
+  auto read_result = adapter->Read(5);
+  ASSERT_THAT(read_result.status(), IsOk());
+  EXPECT_EQ(read_result.ValueOrDie(), data.substr(0, 5));
+  read_result = adapter->Read(5);
+  ASSERT_THAT(read_result.status(), IsOk());
+  EXPECT_EQ(read_result.ValueOrDie(), data.substr(5, 5));
+  read_result = adapter->Read(5);
+  ASSERT_THAT(read_result.status(), IsOk());
+  EXPECT_EQ(read_result.ValueOrDie(), data.substr(10, 5));
+}
+
+TEST(InputStreamAdapterTest, BasicRead1) {
+  std::string data = subtle::Random::GetRandomBytes(10);
+  auto adapter = GetInputStreamAdapter(-1, data);
+  auto read_result = adapter->Read1(10);
+  ASSERT_THAT(read_result.status(), IsOk());
+  EXPECT_EQ(read_result.ValueOrDie(), data);
+}
+
+// In this test size of the IstreamInputStream buffer is smaller than the
+// size of data to be read, so multiple calls to Next() will be needed.
+TEST(InputStreamAdapterTest, MultipleNext) {
+  std::string data = subtle::Random::GetRandomBytes(40);
+  auto adapter = GetInputStreamAdapter(10, data);
+  auto read_result = adapter->Read(35);
+  ASSERT_THAT(read_result.status(), IsOk());
+  EXPECT_EQ(read_result.ValueOrDie(), data.substr(0, 35));
+}
+
+TEST(InputStreamAdapterTest, ReadUntilEOF) {
+  std::string data = subtle::Random::GetRandomBytes(35);
+  auto adapter = GetInputStreamAdapter(10, data);
+  auto read_result = adapter->Read(-1);
+  ASSERT_THAT(read_result.status(), IsOk());
+  EXPECT_EQ(read_result.ValueOrDie(), data);
+}
+
+TEST(InputStreamAdapterTest, ReadLessThanAvailable) {
+  std::string data = subtle::Random::GetRandomBytes(20);
+  auto adapter = GetInputStreamAdapter(-1, data);
+  auto read_result = adapter->Read(10);
+  ASSERT_THAT(read_result.status(), IsOk());
+  EXPECT_EQ(read_result.ValueOrDie(), data.substr(0, 10));
+}
+
+TEST(InputStreamAdapterTest, ReadMoreThanAvailable) {
+  std::string data = subtle::Random::GetRandomBytes(20);
+  auto adapter = GetInputStreamAdapter(-1, data);
+  auto read_result = adapter->Read(30);
+  ASSERT_THAT(read_result.status(), IsOk());
+  EXPECT_EQ(read_result.ValueOrDie(), data);
+}
+
+}  // namespace
+}  // namespace tink
+}  // namespace crypto
diff --git a/python/cc/output_stream_adapter.cc b/python/cc/output_stream_adapter.cc
new file mode 100644
index 0000000..8ed3bd8
--- /dev/null
+++ b/python/cc/output_stream_adapter.cc
@@ -0,0 +1,45 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/python/cc/output_stream_adapter.h"
+
+#include <algorithm>
+
+#include "absl/strings/string_view.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+
+util::StatusOr<int64_t> OutputStreamAdapter::Write(absl::string_view data) {
+  void* buffer;
+  int64_t written = 0;
+  while (written < data.size()) {
+    auto next_result = stream_->Next(&buffer);
+    if (!next_result.ok()) return next_result.status();
+    int available = next_result.ValueOrDie();
+    int write_count =
+        std::min(available, static_cast<int>(data.size() - written));
+    memcpy(buffer, data.data() + written, write_count);
+    if (write_count < available) stream_->BackUp(available - write_count);
+    written += write_count;
+  }
+  return written;
+}
+
+util::Status OutputStreamAdapter::Close() { return stream_->Close(); }
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/python/cc/output_stream_adapter.h b/python/cc/output_stream_adapter.h
new file mode 100644
index 0000000..6ba8e61
--- /dev/null
+++ b/python/cc/output_stream_adapter.h
@@ -0,0 +1,51 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_PYTHON_CC_OUTPUT_STREAM_ADAPTER_H_
+#define TINK_PYTHON_CC_OUTPUT_STREAM_ADAPTER_H_
+
+#include <memory>
+
+#include "absl/strings/string_view.h"
+#include "tink/output_stream.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+
+// Adapts an OutputStream for use in Python.
+class OutputStreamAdapter {
+ public:
+  explicit OutputStreamAdapter(std::unique_ptr<OutputStream> stream)
+      : stream_(std::move(stream)) {}
+
+  // Writes 'data' to the underlying OutputStream and returns the number of
+  // bytes written, which may be less than size of 'data'.
+  // It repeatedly calls Next() as long as it returns positive values. This
+  // ensures that in the usual case when we can write all of 'data' the user can
+  // call Write() once and no unnecessary copies are made.
+  util::StatusOr<int64_t> Write(absl::string_view data);
+
+  // Closes the underlying OutputStream.
+  util::Status Close();
+
+ private:
+  std::unique_ptr<OutputStream> stream_;
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_PYTHON_CC_OUTPUT_STREAM_ADAPTER_H_
diff --git a/python/cc/output_stream_adapter_test.cc b/python/cc/output_stream_adapter_test.cc
new file mode 100644
index 0000000..8894fa2
--- /dev/null
+++ b/python/cc/output_stream_adapter_test.cc
@@ -0,0 +1,91 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/python/cc/output_stream_adapter.h"
+
+#include <algorithm>
+#include <sstream>
+
+#include "gtest/gtest.h"
+#include "absl/memory/memory.h"
+#include "tink/output_stream.h"
+#include "tink/subtle/random.h"
+#include "tink/util/ostream_output_stream.h"
+#include "tink/util/test_matchers.h"
+
+namespace crypto {
+namespace tink {
+namespace {
+
+std::unique_ptr<OutputStreamAdapter> GetOutputStreamAdapter(
+    int buffer_size, std::stringbuf** buffer_ref) {
+  auto string_stream = absl::make_unique<std::stringstream>();
+  // Reference to the stringstream buffer used for later validation.
+  *buffer_ref = string_stream->rdbuf();
+  auto output_stream = absl::make_unique<util::OstreamOutputStream>(
+      std::move(string_stream), buffer_size);
+  return absl::make_unique<OutputStreamAdapter>(std::move(output_stream));
+}
+
+TEST(OutputStreamAdapterTest, Basic) {
+  std::stringbuf* buffer_ref;
+  auto adapter = GetOutputStreamAdapter(-1, &buffer_ref);
+  auto write_result = adapter->Write("something");
+  ASSERT_THAT(write_result.status(), test::IsOk());
+  EXPECT_EQ(write_result.ValueOrDie(), 9);
+  EXPECT_THAT(adapter->Close(), test::IsOk());
+  EXPECT_EQ(buffer_ref->str(), "something");
+}
+
+TEST(OutputStreamAdapterTest, MultipleWrite) {
+  std::stringbuf* buffer_ref;
+  auto adapter = GetOutputStreamAdapter(-1, &buffer_ref);
+  auto write_result = adapter->Write("something");
+  ASSERT_THAT(write_result.status(), test::IsOk());
+  EXPECT_EQ(write_result.ValueOrDie(), 9);
+  write_result = adapter->Write("123");
+  ASSERT_THAT(write_result.status(), test::IsOk());
+  EXPECT_EQ(write_result.ValueOrDie(), 3);
+  write_result = adapter->Write("456");
+  ASSERT_THAT(write_result.status(), test::IsOk());
+  EXPECT_EQ(write_result.ValueOrDie(), 3);
+  EXPECT_THAT(adapter->Close(), test::IsOk());
+  EXPECT_EQ(buffer_ref->str(), "something123456");
+}
+
+TEST(OutputStreamAdapterTest, WriteAfterClose) {
+  std::stringbuf* buffer_ref;
+  auto adapter = GetOutputStreamAdapter(-1, &buffer_ref);
+  ASSERT_THAT(adapter->Close(), test::IsOk());
+  EXPECT_THAT(adapter->Write("something").status(),
+              test::StatusIs(util::error::FAILED_PRECONDITION,
+                             testing::HasSubstr("Stream closed")));
+}
+
+// In this test size of the OstreamOutputStream buffer is smaller than the
+// size of data to be written, so multiple calls to Next() will be needed.
+TEST(OutputStreamAdapterTest, MultipleNext) {
+  std::stringbuf* buffer_ref;
+  auto adapter = GetOutputStreamAdapter(10, &buffer_ref);
+  std::string data = subtle::Random::GetRandomBytes(35);
+  auto write_result = adapter->Write(data);
+  ASSERT_THAT(write_result.status(), test::IsOk());
+  EXPECT_EQ(write_result.ValueOrDie(), 35);
+  EXPECT_THAT(adapter->Close(), test::IsOk());
+  EXPECT_EQ(buffer_ref->str(), data);
+}
+
+}  // namespace
+}  // namespace tink
+}  // namespace crypto
diff --git a/python/cc/python_file_object_adapter.h b/python/cc/python_file_object_adapter.h
new file mode 100644
index 0000000..586dabe
--- /dev/null
+++ b/python/cc/python_file_object_adapter.h
@@ -0,0 +1,47 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_PYTHON_CC_PYTHON_FILE_OBJECT_ADAPTER_H_
+#define TINK_PYTHON_CC_PYTHON_FILE_OBJECT_ADAPTER_H_
+
+#include "absl/strings/string_view.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+
+namespace crypto {
+namespace tink {
+
+// Adapts a Python file object for use in C++.
+// This is CLIFed and implemented in Python.
+class PythonFileObjectAdapter {
+ public:
+  // Writes 'data' to the underlying Python file object and returns the number
+  // of bytes written, which can be less than the size of 'data'.
+  virtual util::StatusOr<int> Write(absl::string_view data) = 0;
+
+  // Closes the underlying Python file object.
+  virtual util::Status Close() = 0;
+
+  // Reads at most 'size' bytes from the underlying Python file object. Returns
+  // UNKNOWN status with error message that contains "EOFError" if the file
+  // object is alreday at EOF.
+  virtual util::StatusOr<std::string> Read(int size) = 0;
+
+  virtual ~PythonFileObjectAdapter() {}
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_PYTHON_CC_PYTHON_FILE_OBJECT_ADAPTER_H_
diff --git a/python/cc/python_input_stream.cc b/python/cc/python_input_stream.cc
new file mode 100644
index 0000000..a23f253
--- /dev/null
+++ b/python/cc/python_input_stream.cc
@@ -0,0 +1,100 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/python/cc/python_input_stream.h"
+
+#include <algorithm>
+#include <memory>
+#include <string>
+
+#include "absl/memory/memory.h"
+#include "tink/input_stream.h"
+#include "tink/subtle/subtle_util.h"
+#include "tink/util/errors.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/python/cc/python_file_object_adapter.h"
+
+namespace crypto {
+namespace tink {
+
+namespace {
+
+bool is_eof(const util::Status& status) {
+  return status.error_code() == util::error::UNKNOWN &&
+         status.error_message().find("EOFError") != std::string::npos;
+}
+
+}  // namespace
+
+PythonInputStream::PythonInputStream(
+    std::unique_ptr<PythonFileObjectAdapter> adapter, int buffer_size) {
+  if (buffer_size <= 0) buffer_size = 128 * 1024;  // 128 KB
+  adapter_ = std::move(adapter);
+  count_in_buffer_ = 0;
+  count_backedup_ = 0;
+  position_ = 0;
+  subtle::ResizeStringUninitialized(&buffer_, buffer_size);
+  buffer_offset_ = 0;
+  status_ = util::OkStatus();
+}
+
+util::StatusOr<int> PythonInputStream::Next(const void** data) {
+  if (!status_.ok()) return status_;
+
+  if (count_backedup_ > 0) {  // Return the backed-up bytes.
+    buffer_offset_ += count_in_buffer_ - count_backedup_;
+    count_in_buffer_ = count_backedup_;
+    count_backedup_ = 0;
+    position_ += count_in_buffer_;
+    *data = &buffer_[buffer_offset_];
+    return count_in_buffer_;
+  }
+
+  // Read new bytes to buffer_.
+  auto read_result = adapter_->Read(buffer_.size());
+  if (is_eof(read_result.status())) {
+    return status_ = util::Status(util::error::OUT_OF_RANGE, "EOF");
+  } else if (read_result.status().error_code() == util::error::OUT_OF_RANGE) {
+    // We need to change the error code because for InputStream OUT_OF_RANGE
+    // status always means EOF.
+    return status_ = util::Status(util::error::UNKNOWN,
+                                  read_result.status().error_message());
+  } else if (!read_result.ok()) {
+    return status_ = read_result.status();
+  }
+  std::string read_string = read_result.ValueOrDie();
+  int count_read = read_string.length();
+  buffer_.replace(0, count_read, read_string);
+  buffer_offset_ = 0;
+  count_backedup_ = 0;
+  count_in_buffer_ = count_read;
+  position_ += count_in_buffer_;
+  *data = &buffer_[0];
+  return count_in_buffer_;
+}
+
+void PythonInputStream::BackUp(int count) {
+  if (!status_.ok() || count < 1 || count_backedup_ == count_in_buffer_) return;
+  int actual_count = std::min(count, count_in_buffer_ - count_backedup_);
+  count_backedup_ += actual_count;
+  position_ -= actual_count;
+}
+
+PythonInputStream::~PythonInputStream() {}
+
+int64_t PythonInputStream::Position() const { return position_; }
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/python/cc/python_input_stream.h b/python/cc/python_input_stream.h
new file mode 100644
index 0000000..4894480
--- /dev/null
+++ b/python/cc/python_input_stream.h
@@ -0,0 +1,61 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_PYTHON_CC_PYTHON_INPUT_STREAM_H_
+#define TINK_PYTHON_CC_PYTHON_INPUT_STREAM_H_
+
+#include <memory>
+
+#include "tink/input_stream.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/python/cc/python_file_object_adapter.h"
+
+namespace crypto {
+namespace tink {
+
+// An InputStream that reads from a PythonFileObjectAdapter.
+class PythonInputStream : public InputStream {
+ public:
+  // Constructs an InputStream that will read from the PythonFileObjectAdapter
+  // specified via 'adapter', using a buffer of the specified size, if any
+  // (if 'buffer_size' <= 0, a reasonable default will be used).
+  explicit PythonInputStream(std::unique_ptr<PythonFileObjectAdapter> adapter,
+                             int buffer_size = 0);
+
+  ~PythonInputStream() override;
+
+  util::StatusOr<int> Next(const void** data) override;
+
+  void BackUp(int count) override;
+
+  int64_t Position() const override;
+
+ private:
+  util::Status status_;
+  std::unique_ptr<PythonFileObjectAdapter> adapter_;
+  std::string buffer_;
+  int64_t position_;  // current position in the file object (from the
+                      // beginning)
+
+  // Counters that describe the state of the data in buffer_.
+  int count_in_buffer_;  // # of bytes available in buffer_
+  int count_backedup_;   // # of bytes available in buffer_ that were backed up
+  int buffer_offset_;    // offset at which the returned bytes start in buffer_
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_PYTHON_CC_PYTHON_INPUT_STREAM_H_
diff --git a/python/cc/python_input_stream_test.cc b/python/cc/python_input_stream_test.cc
new file mode 100644
index 0000000..97f9230
--- /dev/null
+++ b/python/cc/python_input_stream_test.cc
@@ -0,0 +1,152 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/python/cc/python_input_stream.h"
+
+#include "gtest/gtest.h"
+#include "absl/memory/memory.h"
+#include "tink/subtle/random.h"
+#include "tink/util/test_util.h"
+#include "tink/python/cc/test_util.h"
+
+namespace crypto {
+namespace tink {
+namespace {
+
+// Reads the specified 'input_stream' until no more bytes can be read,
+// and puts the read bytes into 'contents'.
+// Returns the status of the last input_stream->Next()-operation.
+util::Status ReadTillEnd(PythonInputStream* input_stream, std::string* contents) {
+  contents->clear();
+  const void* buffer;
+  auto next_result = input_stream->Next(&buffer);
+  while (next_result.ok()) {
+    contents->append(static_cast<const char*>(buffer),
+                     next_result.ValueOrDie());
+    next_result = input_stream->Next(&buffer);
+  }
+  return next_result.status();
+}
+
+TEST(PythonInputStreamTest, testReadingStreams) {
+  for (int stream_size : {0, 10, 100, 1000, 10000, 100000, 1000000}) {
+    std::string contents = subtle::Random::GetRandomBytes(stream_size);
+    auto input = absl::make_unique<test::TestReadableObject>(contents);
+    EXPECT_EQ(stream_size, contents.size());
+    auto input_stream = absl::make_unique<PythonInputStream>(std::move(input));
+    std::string stream_contents;
+    auto status = ReadTillEnd(input_stream.get(), &stream_contents);
+    EXPECT_EQ(util::error::OUT_OF_RANGE, status.error_code());
+    EXPECT_EQ("EOF", status.error_message());
+    EXPECT_EQ(contents, stream_contents);
+  }
+}
+
+TEST(PythonInputStreamTest, testCustomBufferSizes) {
+  int stream_size = 100000;
+  for (int buffer_size : {1, 10, 100, 1000, 10000}) {
+    std::string contents = subtle::Random::GetRandomBytes(stream_size);
+    auto input = absl::make_unique<test::TestReadableObject>(contents);
+    EXPECT_EQ(stream_size, contents.size());
+    auto input_stream =
+        absl::make_unique<PythonInputStream>(std::move(input), buffer_size);
+    const void* buffer;
+    auto next_result = input_stream->Next(&buffer);
+    EXPECT_TRUE(next_result.ok()) << next_result.status();
+    EXPECT_EQ(buffer_size, next_result.ValueOrDie());
+    EXPECT_EQ(contents.substr(0, buffer_size),
+              std::string(static_cast<const char*>(buffer), buffer_size));
+  }
+}
+
+TEST(PythonInputStreamTest, testBackupAndPosition) {
+  int stream_size = 100000;
+  int buffer_size = 1234;
+  const void* buffer;
+  std::string contents = subtle::Random::GetRandomBytes(stream_size);
+  auto input = absl::make_unique<test::TestReadableObject>(contents);
+  EXPECT_EQ(stream_size, contents.size());
+
+  // Prepare the stream and do the first call to Next().
+  auto input_stream =
+      absl::make_unique<PythonInputStream>(std::move(input), buffer_size);
+  EXPECT_EQ(0, input_stream->Position());
+  auto next_result = input_stream->Next(&buffer);
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(buffer_size, next_result.ValueOrDie());
+  EXPECT_EQ(buffer_size, input_stream->Position());
+  EXPECT_EQ(contents.substr(0, buffer_size),
+            std::string(static_cast<const char*>(buffer), buffer_size));
+
+  // BackUp several times, but in total fewer bytes than returned by Next().
+  int total_backup_size = 0;
+  for (auto backup_size : {0, 1, 5, 0, 10, 100, -42, 400, 20, -100}) {
+    input_stream->BackUp(backup_size);
+    total_backup_size += std::max(0, backup_size);
+    EXPECT_EQ(buffer_size - total_backup_size, input_stream->Position());
+  }
+  // Call Next(), it should return exactly the backed up bytes.
+  next_result = input_stream->Next(&buffer);
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(total_backup_size, next_result.ValueOrDie());
+  EXPECT_EQ(buffer_size, input_stream->Position());
+  EXPECT_EQ(contents.substr(buffer_size - total_backup_size, total_backup_size),
+            std::string(static_cast<const char*>(buffer), total_backup_size));
+
+  // BackUp() some bytes, again fewer than returned by Next().
+  total_backup_size = 0;
+  for (int backup_size : {0, 72, -94, 37, 82}) {
+    input_stream->BackUp(backup_size);
+    total_backup_size += std::max(0, backup_size);
+    EXPECT_EQ(buffer_size - total_backup_size, input_stream->Position());
+  }
+
+  // Call Next(), it should return exactly the backed up bytes.
+  next_result = input_stream->Next(&buffer);
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(total_backup_size, next_result.ValueOrDie());
+  EXPECT_EQ(buffer_size, input_stream->Position());
+  EXPECT_EQ(contents.substr(buffer_size - total_backup_size, total_backup_size),
+            std::string(static_cast<const char*>(buffer), total_backup_size));
+
+  // Call Next() again, it should return the second block.
+  next_result = input_stream->Next(&buffer);
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(buffer_size, next_result.ValueOrDie());
+  EXPECT_EQ(2 * buffer_size, input_stream->Position());
+  EXPECT_EQ(contents.substr(buffer_size, buffer_size),
+            std::string(static_cast<const char*>(buffer), buffer_size));
+
+  // BackUp a few times, with total over the returned buffer_size.
+  total_backup_size = 0;
+  for (int backup_size :
+           {0, 72, -100, buffer_size/2, 200, -25, buffer_size, 42}) {
+    input_stream->BackUp(backup_size);
+    total_backup_size = std::min(buffer_size,
+                                 total_backup_size + std::max(0, backup_size));
+    EXPECT_EQ(2 * buffer_size - total_backup_size, input_stream->Position());
+  }
+
+  // Call Next() again, it should return the second block.
+  next_result = input_stream->Next(&buffer);
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(buffer_size, next_result.ValueOrDie());
+  EXPECT_EQ(2 * buffer_size, input_stream->Position());
+  EXPECT_EQ(contents.substr(buffer_size, buffer_size),
+            std::string(static_cast<const char*>(buffer), buffer_size));
+}
+
+}  // namespace
+}  // namespace tink
+}  // namespace crypto
diff --git a/python/cc/python_output_stream.cc b/python/cc/python_output_stream.cc
new file mode 100644
index 0000000..23449df
--- /dev/null
+++ b/python/cc/python_output_stream.cc
@@ -0,0 +1,117 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/python/cc/python_output_stream.h"
+
+#include <algorithm>
+#include <memory>
+
+#include "absl/memory/memory.h"
+#include "absl/strings/string_view.h"
+#include "tink/output_stream.h"
+#include "tink/subtle/subtle_util.h"
+#include "tink/util/errors.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/python/cc/python_file_object_adapter.h"
+
+namespace crypto {
+namespace tink {
+
+PythonOutputStream::PythonOutputStream(
+    std::unique_ptr<PythonFileObjectAdapter> adapter, int buffer_size) {
+  if (buffer_size <= 0) buffer_size = 128 * 1024;  // 128 KB
+  adapter_ = std::move(adapter);
+  subtle::ResizeStringUninitialized(&buffer_, buffer_size);
+  is_first_call_ = true;
+  position_ = 0;
+  count_in_buffer_ = 0;
+  buffer_offset_ = 0;
+  status_ = util::OkStatus();
+}
+
+crypto::tink::util::StatusOr<int> PythonOutputStream::Next(void** data) {
+  if (!status_.ok()) return status_;
+
+  // This is the first call to Next(), so we return the whole buffer.
+  if (is_first_call_) {
+    is_first_call_ = false;
+    count_in_buffer_ = buffer_.size();
+    position_ = buffer_.size();
+    *data = &buffer_[0];
+    return buffer_.size();
+  }
+
+  // If some space was backed up, return it first.
+  if (count_in_buffer_ < buffer_.size()) {
+    int count_backedup = buffer_.size() - count_in_buffer_;
+    position_ += count_backedup;
+    buffer_offset_ = count_in_buffer_;
+    count_in_buffer_ = buffer_.size();
+    *data = &buffer_[buffer_offset_];
+    return count_backedup;
+  }
+
+  // Write the data from the buffer and return available space in the buffer.
+  // The available space might not span the entire buffer, as writing
+  // may succeed only for a prefix of the buffer -- in this case the data still
+  // to be written is shifted in the buffer and the remaining space is returned.
+  auto write_result = adapter_->Write(buffer_);
+  if (!write_result.ok()) return status_ = write_result.status();
+
+  // Some data was written, so we can return some portion of buffer_.
+  int written = write_result.ValueOrDie();
+  position_ += written;
+  count_in_buffer_ = buffer_.size();
+  buffer_offset_ = buffer_.size() - written;
+  if (written < buffer_.size()) {
+    // Only part of the data was written, shift the remaining data in buffer_.
+    // Using memmove, as source and destination may overlap.
+    std::memmove(&buffer_[0], &buffer_[written], buffer_offset_);
+  }
+  *data = &buffer_[buffer_offset_];
+  return written;
+}
+
+void PythonOutputStream::BackUp(int count) {
+  if (!status_.ok() || count < 1 || count_in_buffer_ == 0) return;
+  int actual_count = std::min(count, count_in_buffer_ - buffer_offset_);
+  count_in_buffer_ -= actual_count;
+  position_ -= actual_count;
+}
+
+PythonOutputStream::~PythonOutputStream() { Close().IgnoreError(); }
+
+util::Status PythonOutputStream::Close() {
+  if (!status_.ok()) return status_;
+  if (count_in_buffer_ > 0) {
+    // Try to write the remaining bytes.
+    int written = 0;
+    while (written < count_in_buffer_) {
+      auto write_result = adapter_->Write(absl::string_view(buffer_).substr(
+          written, count_in_buffer_ - written));
+      if (!write_result.ok()) return write_result.status();
+      written += write_result.ValueOrDie();
+    }
+  }
+  status_ = adapter_->Close();
+  if (!status_.ok()) return status_;
+  status_ = util::Status(util::error::FAILED_PRECONDITION, "Stream closed");
+  return util::OkStatus();
+}
+
+int64_t PythonOutputStream::Position() const { return position_; }
+
+}  // namespace tink
+}  // namespace crypto
diff --git a/python/cc/python_output_stream.h b/python/cc/python_output_stream.h
new file mode 100644
index 0000000..f289ddb
--- /dev/null
+++ b/python/cc/python_output_stream.h
@@ -0,0 +1,63 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_PYTHON_CC_PYTHON_OUTPUT_STREAM_H_
+#define TINK_PYTHON_CC_PYTHON_OUTPUT_STREAM_H_
+
+#include <memory>
+
+#include "tink/output_stream.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/python/cc/python_file_object_adapter.h"
+
+namespace crypto {
+namespace tink {
+
+// An OutputStream that writes to a PythonFileObjectAdapter.
+class PythonOutputStream : public OutputStream {
+ public:
+  // Constructs an OutputStream that will write to the PythonFileObjectAdapter
+  // specified via 'adapter', using a buffer of the specified size, if any
+  // (if 'buffer_size' <= 0, a reasonable default will be used).
+  explicit PythonOutputStream(std::unique_ptr<PythonFileObjectAdapter> adapter,
+                              int buffer_size = 0);
+
+  ~PythonOutputStream() override;
+
+  crypto::tink::util::StatusOr<int> Next(void** data) override;
+
+  void BackUp(int count) override;
+
+  crypto::tink::util::Status Close() override;
+
+  int64_t Position() const override;
+
+ private:
+  util::Status status_;
+  std::unique_ptr<PythonFileObjectAdapter> adapter_;
+  std::string buffer_;
+  bool is_first_call_;
+  int64_t position_;  // current position in the underlying stream (from the
+                      // beginning)
+
+  // Counters that describe the state of the data in buffer_.
+  int count_in_buffer_;  // # bytes in buffer_ that will be eventually written
+  int buffer_offset_;    // offset where the returned *data starts in buffer_
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_PYTHON_CC_PYTHON_OUTPUT_STREAM_H_
diff --git a/python/cc/python_output_stream_test.cc b/python/cc/python_output_stream_test.cc
new file mode 100644
index 0000000..1b277b0
--- /dev/null
+++ b/python/cc/python_output_stream_test.cc
@@ -0,0 +1,178 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/python/cc/python_output_stream.h"
+
+#include <memory>
+
+#include "gtest/gtest.h"
+#include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "tink/subtle/random.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tink/python/cc/test_util.h"
+
+namespace crypto {
+namespace tink {
+namespace {
+
+// Writes 'contents' to the specified 'output_stream', and closes the stream.
+// Returns the status of output_stream->Close()-operation, or a non-OK status
+// of a prior output_stream->Next()-operation, if any.
+util::Status WriteToStream(PythonOutputStream* output_stream,
+                           absl::string_view contents) {
+  void* buffer;
+  int pos = 0;
+  int remaining = contents.length();
+  int available_space = 0;
+  int available_bytes = 0;
+  while (remaining > 0) {
+    auto next_result = output_stream->Next(&buffer);
+    if (!next_result.ok()) return next_result.status();
+    available_space = next_result.ValueOrDie();
+    available_bytes = std::min(available_space, remaining);
+    memcpy(buffer, contents.data() + pos, available_bytes);
+    remaining -= available_bytes;
+    pos += available_bytes;
+  }
+  if (available_space > available_bytes) {
+    output_stream->BackUp(available_space - available_bytes);
+  }
+  return output_stream->Close();
+}
+
+TEST(PythonOutputStreamTest, WritingStreams) {
+  for (size_t stream_size : {0, 10, 100, 1000, 10000, 100000, 1000000}) {
+    SCOPED_TRACE(absl::StrCat("stream_size = ", stream_size));
+    std::string stream_contents = subtle::Random::GetRandomBytes(stream_size);
+    auto output = absl::make_unique<test::TestWritableObject>();
+    std::string* output_buffer = output->GetBuffer();
+    auto output_stream =
+        absl::make_unique<PythonOutputStream>(std::move(output));
+    auto status = WriteToStream(output_stream.get(), stream_contents);
+    EXPECT_TRUE(status.ok()) << status;
+    EXPECT_EQ(stream_size, output_buffer->size());
+    EXPECT_EQ(stream_contents, *output_buffer);
+  }
+}
+
+TEST(PythonOutputStreamTest, CustomBufferSizes) {
+  int stream_size = 1024 * 1024;
+  std::string stream_contents = subtle::Random::GetRandomBytes(stream_size);
+  for (int buffer_size : {1, 10, 100, 1000, 10000, 100000, 1000000}) {
+    SCOPED_TRACE(absl::StrCat("buffer_size = ", buffer_size));
+    auto output = absl::make_unique<test::TestWritableObject>();
+    std::string* output_buffer = output->GetBuffer();
+    auto output_stream =
+        absl::make_unique<PythonOutputStream>(std::move(output), buffer_size);
+    void* buffer;
+    auto next_result = output_stream->Next(&buffer);
+    EXPECT_TRUE(next_result.ok()) << next_result.status();
+    EXPECT_EQ(buffer_size, next_result.ValueOrDie());
+    output_stream->BackUp(buffer_size);
+    auto status = WriteToStream(output_stream.get(), stream_contents);
+    EXPECT_TRUE(status.ok()) << status;
+    EXPECT_EQ(stream_size, output_buffer->size());
+    EXPECT_EQ(stream_contents, *output_buffer);
+  }
+}
+
+TEST(PythonOutputStreamTest, BackupAndPosition) {
+  int stream_size = 1024 * 1024;
+  int buffer_size = 1234;
+  void* buffer;
+  std::string stream_contents = subtle::Random::GetRandomBytes(stream_size);
+  auto output = absl::make_unique<test::TestWritableObject>();
+  std::string* output_buffer = output->GetBuffer();
+
+  // Prepare the stream and do the first call to Next().
+  auto output_stream =
+      absl::make_unique<PythonOutputStream>(std::move(output), buffer_size);
+  EXPECT_EQ(0, output_stream->Position());
+  auto next_result = output_stream->Next(&buffer);
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(buffer_size, next_result.ValueOrDie());
+  EXPECT_EQ(buffer_size, output_stream->Position());
+  std::memcpy(buffer, stream_contents.data(), buffer_size);
+
+  // BackUp several times, but in total fewer bytes than returned by Next().
+  int total_backup_size = 0;
+  for (int backup_size : {0, 1, 5, 0, 10, 100, -42, 400, 20, -100}) {
+    SCOPED_TRACE(absl::StrCat("backup_size = ", backup_size));
+    output_stream->BackUp(backup_size);
+    total_backup_size += std::max(backup_size, 0);
+    EXPECT_EQ(buffer_size - total_backup_size, output_stream->Position());
+  }
+  EXPECT_LT(total_backup_size, next_result.ValueOrDie());
+
+  // Call Next(), it should succeed.
+  next_result = output_stream->Next(&buffer);
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+
+  // BackUp() some bytes, again fewer than returned by Next().
+  total_backup_size = 0;
+  for (int backup_size : {0, 72, -94, 37, 82}) {
+    SCOPED_TRACE(absl::StrCat("backup_size = ", backup_size));
+    output_stream->BackUp(backup_size);
+    total_backup_size += std::max(0, backup_size);
+    EXPECT_EQ(buffer_size - total_backup_size, output_stream->Position());
+  }
+  EXPECT_LT(total_backup_size, next_result.ValueOrDie());
+
+  // Call Next(), it should succeed;
+  next_result = output_stream->Next(&buffer);
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+
+  // Call Next() again, it should return a full block.
+  auto prev_position = output_stream->Position();
+  next_result = output_stream->Next(&buffer);
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(buffer_size, next_result.ValueOrDie());
+  EXPECT_EQ(prev_position + buffer_size, output_stream->Position());
+  std::memcpy(buffer, stream_contents.data() + buffer_size, buffer_size);
+
+  // BackUp a few times, with total over the returned buffer_size.
+  total_backup_size = 0;
+  for (int backup_size :
+           {0, 72, -100, buffer_size / 2, 200, -25, buffer_size / 2, 42}) {
+    SCOPED_TRACE(absl::StrCat("backup_size = ", backup_size));
+    output_stream->BackUp(backup_size);
+    total_backup_size = std::min(buffer_size,
+                                 total_backup_size + std::max(backup_size, 0));
+    EXPECT_EQ(prev_position + buffer_size - total_backup_size,
+              output_stream->Position());
+  }
+  EXPECT_EQ(total_backup_size, buffer_size);
+  EXPECT_EQ(prev_position, output_stream->Position());
+
+  // Call Next() again, it should return a full block.
+  next_result = output_stream->Next(&buffer);
+  EXPECT_TRUE(next_result.ok()) << next_result.status();
+  EXPECT_EQ(buffer_size, next_result.ValueOrDie());
+  EXPECT_EQ(prev_position + buffer_size, output_stream->Position());
+  std::memcpy(buffer, stream_contents.data() + buffer_size, buffer_size);
+
+  // Write the remaining stream contents to stream.
+  auto status = WriteToStream(
+      output_stream.get(), stream_contents.substr(output_stream->Position()));
+  EXPECT_TRUE(status.ok()) << status;
+  EXPECT_EQ(stream_size, output_buffer->size());
+  EXPECT_EQ(stream_contents, *output_buffer);
+}
+
+}  // namespace
+}  // namespace tink
+}  // namespace crypto
diff --git a/python/cc/test_util.h b/python/cc/test_util.h
new file mode 100644
index 0000000..eb003f1
--- /dev/null
+++ b/python/cc/test_util.h
@@ -0,0 +1,79 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_PYTHON_CC_TEST_UTIL_H_
+#define TINK_PYTHON_CC_TEST_UTIL_H_
+
+#include "tink/python/cc/python_file_object_adapter.h"
+
+
+namespace crypto {
+namespace tink {
+namespace test {
+
+// Writable PythonFileObjectAdapter for testing.
+class TestWritableObject : public PythonFileObjectAdapter {
+ public:
+  util::StatusOr<int> Write(absl::string_view data) override {
+    buffer_ += std::string(data);
+    return data.size();
+  }
+
+  util::Status Close() override { return util::OkStatus(); }
+
+  util::StatusOr<std::string> Read(int size) override {
+    return util::Status(util::error::UNIMPLEMENTED, "not readable");
+  }
+
+  std::string* GetBuffer() { return &buffer_; }
+
+ private:
+  std::string buffer_;
+};
+
+// Readable PythonFileObjectAdapter for testing.
+class TestReadableObject : public PythonFileObjectAdapter {
+ public:
+  explicit TestReadableObject(const std::string& data) {
+    buffer_ = data;
+    position_ = 0;
+  }
+
+  util::StatusOr<int> Write(absl::string_view data) override {
+    return util::Status(util::error::UNIMPLEMENTED, "not writable");
+  }
+
+  util::Status Close() override { return util::OkStatus(); }
+
+  util::StatusOr<std::string> Read(int size) override {
+    if (position_ == buffer_.size() && size > 0) {
+      return util::Status(util::error::UNKNOWN, "EOFError");
+    }
+    int actual = std::min(size, static_cast<int>(buffer_.size() - position_));
+    std::string to_return = buffer_.substr(position_, actual);
+    position_ += actual;
+    return to_return;
+  }
+
+ private:
+  std::string buffer_;
+  int position_;
+};
+
+}  // namespace test
+}  // namespace tink
+}  // namespace crypto
+
+
+#endif  // TINK_PYTHON_CC_TEST_UTIL_H_
diff --git a/python/core/__init__.py b/python/core/__init__.py
new file mode 100644
index 0000000..ffb418a
--- /dev/null
+++ b/python/core/__init__.py
@@ -0,0 +1,54 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Core package."""
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from tink.python.core import crypto_format as _crypto_format
+from tink.python.core import key_manager
+from tink.python.core import keyset_handle
+from tink.python.core import keyset_reader
+from tink.python.core import keyset_writer
+from tink.python.core import primitive_set
+from tink.python.core import primitive_wrapper
+from tink.python.core import registry
+from tink.python.core import tink_error
+
+
+KeyManager = key_manager.KeyManager
+PrivateKeyManager = key_manager.PrivateKeyManager
+
+KeysetHandle = keyset_handle.KeysetHandle
+new_keyset_handle = KeysetHandle.generate_new
+read_keyset_handle = KeysetHandle.read
+
+KeysetReader = keyset_reader.KeysetReader
+JsonKeysetReader = keyset_reader.JsonKeysetReader
+BinaryKeysetReader = keyset_reader.BinaryKeysetReader
+
+KeysetWriter = keyset_writer.KeysetWriter
+JsonKeysetWriter = keyset_writer.JsonKeysetWriter
+BinaryKeysetWriter = keyset_writer.BinaryKeysetWriter
+
+Registry = registry.Registry
+
+TinkError = tink_error.TinkError
+
+new_primitive_set = primitive_set.new_primitive_set
+PrimitiveSet = primitive_set.PrimitiveSet
+PrimitiveWrapper = primitive_wrapper.PrimitiveWrapper
+
+crypto_format = _crypto_format
diff --git a/python/core/cleartext_keyset_handle.py b/python/core/cleartext_keyset_handle.py
new file mode 100644
index 0000000..8bec6bd
--- /dev/null
+++ b/python/core/cleartext_keyset_handle.py
@@ -0,0 +1,47 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""CleartextKeysetHandle module.
+
+WARNING
+
+Reading or writing cleartext keysets is a bad practice, usage of this API
+should be restricted. Users can read encrypted keysets using KeysetHandle.read.
+"""
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from tink.proto import tink_pb2
+from tink.python.core import keyset_handle
+from tink.python.core import keyset_reader as reader
+from tink.python.core import keyset_writer as writer
+
+
+class CleartextKeysetHandle(keyset_handle.KeysetHandle):
+  """CleartextKeysetHandle creates KeysetHandle from a Tink Keyset."""
+
+  def __new__(cls, keyset: tink_pb2.Keyset):
+    return cls._create(keyset)
+
+  @classmethod
+  def read(cls,
+           keyset_reader: reader.KeysetReader) -> keyset_handle.KeysetHandle:
+    """Create a KeysetHandle from a keyset read with keyset_reader."""
+    keyset = keyset_reader.read()
+    return cls._create(keyset)
+
+  def write(self, keyset_writer: writer.KeysetWriter) -> None:
+    """Serializes and writes the keyset."""
+    keyset_writer.write(self._keyset)
diff --git a/python/core/cleartext_keyset_handle_test.py b/python/core/cleartext_keyset_handle_test.py
new file mode 100644
index 0000000..47c55b2
--- /dev/null
+++ b/python/core/cleartext_keyset_handle_test.py
@@ -0,0 +1,55 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Tests for tink.python.core.cleartext_keyset_handle."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+import io
+
+from absl.testing import absltest
+
+from tink.python import core
+from tink.python import mac
+from tink.python import tink_config
+from tink.python.core import cleartext_keyset_handle
+
+
+def setUpModule():
+  tink_config.register()
+
+
+class CleartextKeysetHandleTest(absltest.TestCase):
+
+  def test_write(self):
+    handle = cleartext_keyset_handle.CleartextKeysetHandle.generate_new(
+        mac.mac_key_templates.HMAC_SHA256_128BITTAG)
+    output_stream = io.BytesIO()
+    writer = core.BinaryKeysetWriter(output_stream)
+    handle.write(writer)
+    reader = core.BinaryKeysetReader(output_stream.getvalue())
+    handle2 = cleartext_keyset_handle.CleartextKeysetHandle.read(reader)
+    # Check that handle2 has the same primitive as handle.
+    handle2.primitive(mac.Mac).verify_mac(
+        handle.primitive(mac.Mac).compute_mac(b'data'), b'data')
+
+  def test_read_empty_keyset_fails(self):
+    with self.assertRaisesRegex(core.TinkError, 'No keyset found'):
+      cleartext_keyset_handle.CleartextKeysetHandle.read(
+          core.BinaryKeysetReader(b''))
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/core/crypto_format.py b/python/core/crypto_format.py
new file mode 100644
index 0000000..35fb768
--- /dev/null
+++ b/python/core/crypto_format.py
@@ -0,0 +1,47 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Constants and convenience methods for the outputs handled by Tink."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import struct
+
+from tink.proto import tink_pb2
+from tink.python.core import tink_error
+
+TINK_START_BYTE = b'\x01'
+LEGACY_START_BYTE = b'\x00'
+RAW_PREFIX_SIZE = 0
+NON_RAW_PREFIX_SIZE = 5
+TINK_PREFIX_SIZE = NON_RAW_PREFIX_SIZE
+RAW_PREFIX = b''
+
+
+def output_prefix(key: tink_pb2.Keyset.Key) -> bytes:
+  """Generates the prefix for the outputs handled by the specified key."""
+  if key.output_prefix_type == tink_pb2.TINK:
+    return struct.pack('>cL', TINK_START_BYTE, key.key_id)
+  elif (key.output_prefix_type == tink_pb2.CRUNCHY or
+        key.output_prefix_type == tink_pb2.LEGACY):
+    return struct.pack('>cL', LEGACY_START_BYTE, key.key_id)
+  elif key.output_prefix_type == tink_pb2.RAW:
+    return b''
+  else:
+    raise tink_error.TinkError(
+        'The given key has invalid OutputPrefixType {}.'.format(
+            key.output_prefix_type))
diff --git a/python/core/crypto_format_test.py b/python/core/crypto_format_test.py
new file mode 100644
index 0000000..3bcb9f9
--- /dev/null
+++ b/python/core/crypto_format_test.py
@@ -0,0 +1,84 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.crypto_format."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+from tink.proto import tink_pb2
+from tink.python import core
+
+
+def to_byte(c):
+  # items in byte strings are of type str in Python v2.7 and int in v3.5
+  if isinstance(c, str):
+    return c.encode()
+  else:
+    return chr(c).encode()
+
+
+class CryptoFormatTest(absltest.TestCase):
+
+  def test_tink_prefix(self):
+    key = tink_pb2.Keyset.Key()
+    key.output_prefix_type = tink_pb2.TINK
+    key.key_id = 0x00040695
+    prefix = core.crypto_format.output_prefix(key)
+    self.assertLen(prefix, core.crypto_format.TINK_PREFIX_SIZE)
+    self.assertEqual(
+        to_byte(prefix[0]), bytes(core.crypto_format.TINK_START_BYTE))
+    # key_id in big-endian format.
+    self.assertEqual(prefix[1:5], b'\x00\x04\x06\x95')
+
+  def test_legacy_prefix(self):
+    key = tink_pb2.Keyset.Key()
+    key.output_prefix_type = tink_pb2.LEGACY
+    key.key_id = 0xFF7F1058
+    prefix = core.crypto_format.output_prefix(key)
+    self.assertLen(prefix, core.crypto_format.NON_RAW_PREFIX_SIZE)
+    self.assertEqual(to_byte(prefix[0]), core.crypto_format.LEGACY_START_BYTE)
+    # key_id in big-endian format.
+    self.assertEqual(prefix[1:5], b'\xFF\x7F\x10\x58')
+
+  def test_crunchy_prefix(self):
+    key = tink_pb2.Keyset.Key()
+    key.output_prefix_type = tink_pb2.CRUNCHY
+    key.key_id = 0x12AAB1
+    prefix = core.crypto_format.output_prefix(key)
+    self.assertLen(prefix, core.crypto_format.NON_RAW_PREFIX_SIZE)
+    self.assertEqual(to_byte(prefix[0]), core.crypto_format.LEGACY_START_BYTE)
+    # key_id in big-endian format.
+    self.assertEqual(prefix[1:5], b'\x00\x12\xAA\xB1')
+
+  def test_raw_prefix(self):
+    key = tink_pb2.Keyset.Key()
+    key.output_prefix_type = tink_pb2.RAW
+    key.key_id = 0x74EB33
+    prefix = core.crypto_format.output_prefix(key)
+    self.assertLen(prefix, core.crypto_format.RAW_PREFIX_SIZE)
+
+  def test_invalid_output_prefix(self):
+    with self.assertRaisesRegex(
+        core.TinkError, 'The given key has invalid OutputPrefixType 42.'):
+      key = tink_pb2.Keyset.Key()
+      key.output_prefix_type = 42
+      key.key_id = 0x11223344
+      _ = core.crypto_format.output_prefix(key)
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/core/key_manager.py b/python/core/key_manager.py
new file mode 100644
index 0000000..c069d86
--- /dev/null
+++ b/python/core/key_manager.py
@@ -0,0 +1,157 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""This module defines the basic types and abstract classes in Tink."""
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import abc
+from typing import Any, Generic, Text, Type, TypeVar
+
+from tink.proto import tink_pb2
+from tink.python.core import tink_error
+
+
+P = TypeVar('P')
+
+
+class KeyManager(Generic[P]):
+  """Generates keys and provides primitives for the keys.
+
+  A KeyManager "understands" keys of a specific key types: it can generate keys
+  of a supported type and create primitives for supported keys.  A key type is
+  identified by the global name of the protocol buffer that holds the
+  corresponding key material, and is given by type_url-field of KeyData-protocol
+  buffer.
+  """
+
+  __metaclass__ = abc.ABCMeta
+
+  @abc.abstractmethod
+  def primitive_class(self) -> Type[P]:
+    """The class of the primitive it uses. Used for internal management."""
+    pass
+
+  @abc.abstractmethod
+  def primitive(self, key_data: tink_pb2.KeyData) -> P:
+    """Constructs an primitive for the given key.
+
+    Args:
+      key_data: KeyData protocol buffer
+    Returns:
+      A primitive, for example an instance of Aead or Mac.
+    Raises:
+      tink.TinkError if getting the primitive fails.
+    """
+    pass
+
+  @abc.abstractmethod
+  def key_type(self) -> Text:
+    """Returns the type_url identifying the key type handled by this manager."""
+    pass
+
+  @abc.abstractmethod
+  def new_key_data(self,
+                   key_template: tink_pb2.KeyTemplate) -> tink_pb2.KeyData:
+    """Generates a new random key, based on the specified key_template.
+
+    Args:
+      key_template: KeyTemplate protocol buffer
+    Returns:
+      A KeyData protocol buffer that contains the key.
+    Raises:
+      tink.TinkError if the key generation fails.
+    """
+    pass
+
+  def does_support(self, type_url: Text) -> bool:
+    return self.key_type() == type_url
+
+
+class PrivateKeyManager(KeyManager[P]):
+  """Generates keys and provides primitives for the keys."""
+
+  @abc.abstractmethod
+  def public_key_data(
+      self, private_key_data: tink_pb2.KeyData) -> tink_pb2.KeyData:
+    """Generates a new random key, based on the specified key_template.
+
+    Args:
+      private_key_data: KeyData protocol buffer
+    Returns:
+      A KeyData protocol buffer that contains the public key.
+    Raises:
+      tink.TinkError if the key generation fails.
+    """
+    pass
+
+
+class KeyManagerCcToPyWrapper(KeyManager[P]):
+  """Transforms cliffed C++ KeyManager into a Python KeyManager."""
+
+  def __init__(self,
+               cc_key_manager: Any,  # A cliffed CcKeyManager<P> instance
+               primitive_class: Type[P],
+               primitive_py_wrapper: Type[P]):
+    self._cc_key_manager = cc_key_manager
+    self._primitive_class = primitive_class
+    self._primitive_py_wrapper = primitive_py_wrapper
+
+  def primitive_class(self) -> Type[P]:
+    return self._primitive_class
+
+  @tink_error.use_tink_errors
+  def primitive(self, key_data: tink_pb2.KeyData) -> P:
+    return self._primitive_py_wrapper(self._cc_key_manager.primitive(key_data))
+
+  def key_type(self) -> Text:
+    return self._cc_key_manager.key_type()
+
+  @tink_error.use_tink_errors
+  def new_key_data(self,
+                   key_template: tink_pb2.KeyTemplate) -> tink_pb2.KeyData:
+    return self._cc_key_manager.new_key_data(key_template)
+
+
+class PrivateKeyManagerCcToPyWrapper(PrivateKeyManager[P]):
+  """Transforms cliffed C++ KeyManager into a Python KeyManager."""
+
+  def __init__(self,
+               cc_key_manager: Any,  # A cliffed CcKeyManager<P> instance
+               primitive_class: Type[P],
+               primitive_py_wrapper: Type[P]):
+    self._cc_key_manager = cc_key_manager
+    self._primitive_class = primitive_class
+    self._primitive_py_wrapper = primitive_py_wrapper
+
+  def primitive_class(self) -> Type[P]:
+    return self._primitive_class
+
+  @tink_error.use_tink_errors
+  def primitive(self, key_data: tink_pb2.KeyData) -> P:
+    return self._primitive_py_wrapper(self._cc_key_manager.primitive(key_data))
+
+  def key_type(self) -> Text:
+    return self._cc_key_manager.key_type()
+
+  @tink_error.use_tink_errors
+  def new_key_data(self,
+                   key_template: tink_pb2.KeyTemplate) -> tink_pb2.KeyData:
+    return self._cc_key_manager.new_key_data(key_template)
+
+  @tink_error.use_tink_errors
+  def public_key_data(self, key_data: tink_pb2.KeyData) -> tink_pb2.KeyData:
+    return self._cc_key_manager.public_key_data(key_data)
diff --git a/python/core/keyset_handle.py b/python/core/keyset_handle.py
new file mode 100644
index 0000000..daaedcd
--- /dev/null
+++ b/python/core/keyset_handle.py
@@ -0,0 +1,237 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""This module defines KeysetHandle."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import random
+
+from typing import Type, TypeVar
+
+from google.protobuf import message
+from tink.proto import tink_pb2
+from tink.python.aead import aead
+from tink.python.core import keyset_reader as reader
+from tink.python.core import keyset_writer as writer
+from tink.python.core import primitive_set
+from tink.python.core import registry
+from tink.python.core import tink_error
+
+P = TypeVar('P')
+
+MAX_INT32 = 2147483647  # = 2^31 - 1
+
+
+class KeysetHandle(object):
+  """A KeysetHandle provides abstracted access to Keyset.
+
+  KeysetHandle limits the exposure of actual protocol buffers that hold
+  sensitive key material. This class allows reading and writing encrypted
+  keysets.
+  """
+
+  def __new__(cls):
+    raise tink_error.TinkError(
+        ('KeysetHandle cannot be instantiated directly.'))
+
+  def __init__(self, keyset: tink_pb2.Keyset):
+    self._keyset = keyset
+
+  @classmethod
+  def generate_new(cls, key_template: tink_pb2.KeyTemplate) -> 'KeysetHandle':
+    """Return a new KeysetHandle.
+
+    It contains a single fresh key generated according to key_template.
+
+    Args:
+      key_template: A tink_pb2.KeyTemplate object.
+
+    Returns:
+      A new KeysetHandle.
+    """
+    keyset = tink_pb2.Keyset()
+    key_data = registry.Registry.new_key_data(key_template)
+    key_id = _generate_unused_key_id(keyset)
+    key = keyset.key.add()
+    key.key_data.CopyFrom(key_data)
+    key.status = tink_pb2.ENABLED
+    key.key_id = key_id
+    key.output_prefix_type = key_template.output_prefix_type
+    keyset.primary_key_id = key_id
+    return cls._create(keyset)
+
+  @classmethod
+  def read(cls, keyset_reader: reader.KeysetReader,
+           master_key_aead: aead.Aead) -> 'KeysetHandle':
+    """Tries to create a KeysetHandle from an encrypted keyset."""
+    encrypted_keyset = keyset_reader.read_encrypted()
+    _assert_enough_encrypted_key_material(encrypted_keyset)
+    return cls._create(_decrypt(encrypted_keyset, master_key_aead))
+
+  @classmethod
+  def _create(cls, keyset: tink_pb2.Keyset):
+    o = object.__new__(cls)
+    o.__init__(keyset)
+    return o
+
+  def keyset_info(self) -> tink_pb2.KeysetInfo:
+    """Returns the KeysetInfo that doesn't contain actual key material."""
+    return _keyset_info(self._keyset)
+
+  def write(self, keyset_writer: writer.KeysetWriter,
+            master_key_primitive: aead.Aead) -> None:
+    """Serializes, encrypts with master_key_primitive and writes the keyset."""
+    encrypted_keyset = _encrypt(self._keyset, master_key_primitive)
+    keyset_writer.write_encrypted(encrypted_keyset)
+
+  def public_keyset_handle(self) -> 'KeysetHandle':
+    """Returns a new KeysetHandle for the corresponding public keys."""
+    public_keyset = tink_pb2.Keyset()
+    for key in self._keyset.key:
+      public_key = public_keyset.key.add()
+      public_key.CopyFrom(key)
+      public_key.key_data.CopyFrom(
+          registry.Registry.public_key_data(key.key_data))
+      _validate_key(public_key)
+    public_keyset.primary_key_id = self._keyset.primary_key_id
+    return self._create(public_keyset)
+
+  def primitive(self, primitive_class: Type[P]) -> P:
+    """Returns a wrapped primitive from this KeysetHandle.
+
+    Uses the KeyManager and the PrimitiveWrapper objects in the global
+    registry.Registry
+    to create the primitive. This function is the most common way of creating a
+    primitive.
+
+    Args:
+      primitive_class: The class of the primitive.
+
+    Returns:
+      The primitive.
+    Raises:
+      tink.TinkError if creation of the primitive fails, for example if
+      primitive_class cannot be used with this KeysetHandle.
+    """
+    _validate_keyset(self._keyset)
+    pset = primitive_set.PrimitiveSet(primitive_class)
+    for key in self._keyset.key:
+      if key.status == tink_pb2.ENABLED:
+        primitive = registry.Registry.primitive(key.key_data, primitive_class)
+        entry = pset.add_primitive(primitive, key)
+        if key.key_id == self._keyset.primary_key_id:
+          pset.set_primary(entry)
+    return registry.Registry.wrap(pset)
+
+
+def _keyset_info(keyset: tink_pb2.Keyset) -> tink_pb2.KeysetInfo:
+  keyset_info = tink_pb2.KeysetInfo(primary_key_id=keyset.primary_key_id)
+  for key in keyset.key:
+    key_info = keyset_info.key_info.add()
+    key_info.type_url = key.key_data.type_url
+    key_info.status = key.status
+    key_info.output_prefix_type = key.output_prefix_type
+    key_info.key_id = key.key_id
+  return keyset_info
+
+
+def _encrypt(keyset: tink_pb2.Keyset,
+             master_key_primitive: aead.Aead) -> tink_pb2.EncryptedKeyset:
+  """Encrypts a Keyset and returns an EncryptedKeyset."""
+  encrypted_keyset = master_key_primitive.encrypt(keyset.SerializeToString(),
+                                                  b'')
+  # Check if we can decrypt, to detect errors
+  try:
+    keyset2 = tink_pb2.Keyset.FromString(
+        master_key_primitive.decrypt(encrypted_keyset, b''))
+    if keyset != keyset2:
+      raise tink_error.TinkError('cannot encrypt keyset: %s != %s' %
+                                 (keyset, keyset2))
+  except message.DecodeError:
+    raise tink_error.TinkError('invalid keyset, corrupted key material')
+  return tink_pb2.EncryptedKeyset(
+      encrypted_keyset=encrypted_keyset, keyset_info=_keyset_info(keyset))
+
+
+def _decrypt(encrypted_keyset: tink_pb2.EncryptedKeyset,
+             master_key_aead: aead.Aead) -> tink_pb2.Keyset:
+  """Decrypts an EncryptedKeyset and returns a Keyset."""
+  try:
+    keyset = tink_pb2.Keyset.FromString(
+        master_key_aead.decrypt(encrypted_keyset.encrypted_keyset, b''))
+    # Check emptiness here too, in case the encrypted keys unwrapped to nothing?
+    _assert_enough_key_material(keyset)
+    return keyset
+  except message.DecodeError:
+    raise tink_error.TinkError('invalid keyset, corrupted key material')
+
+
+def _validate_keyset(keyset: tink_pb2.Keyset):
+  """Raises tink_error.TinkError if keyset is not valid."""
+  for key in keyset.key:
+    if key.status != tink_pb2.DESTROYED:
+      _validate_key(key)
+  num_non_destroyed_keys = sum(
+      1 for key in keyset.key if key.status != tink_pb2.DESTROYED)
+  num_non_public_key_material = sum(
+      1 for key in keyset.key
+      if key.key_data.key_material_type != tink_pb2.KeyData.ASYMMETRIC_PUBLIC)
+  num_primary_keys = sum(
+      1 for key in keyset.key
+      if key.status == tink_pb2.ENABLED and key.key_id == keyset.primary_key_id)
+  if num_non_destroyed_keys == 0:
+    raise tink_error.TinkError('empty keyset')
+  if num_primary_keys > 1:
+    raise tink_error.TinkError('keyset contains multiple primary keys')
+  if num_primary_keys == 0 and num_non_public_key_material > 0:
+    raise tink_error.TinkError('keyset does not contain a valid primary key')
+
+
+def _validate_key(key: tink_pb2.Keyset.Key):
+  """Raises tink_error.TinkError if key is not valid."""
+  if not key.HasField('key_data'):
+    raise tink_error.TinkError('key {} has no key data'.format(key.key_id))
+  if key.output_prefix_type == tink_pb2.UNKNOWN_PREFIX:
+    raise tink_error.TinkError('key {} has unknown prefix'.format(key.key_id))
+  if key.status == tink_pb2.UNKNOWN_STATUS:
+    raise tink_error.TinkError('key {} has unknown status'.format(key.key_id))
+
+
+def _assert_no_secret_key_material(keyset: tink_pb2.Keyset):
+  for key in keyset.key:
+    if (key.key_data.key_material_type == tink_pb2.KeyData.UNKNOWN_KEYMATERIAL
+        or key.key_data.key_material_type == tink_pb2.KeyData.SYMMETRIC or
+        key.key_data.key_material_type == tink_pb2.KeyData.ASYMMETRIC_PRIVATE):
+      raise tink_error.TinkError('keyset contains secret key material')
+
+
+def _assert_enough_key_material(keyset: tink_pb2.Keyset):
+  if not keyset or not keyset.key:
+    raise tink_error.TinkError('empty keyset')
+
+
+def _assert_enough_encrypted_key_material(
+    encrypted_keyset: tink_pb2.EncryptedKeyset):
+  if not encrypted_keyset or not encrypted_keyset.encrypted_keyset:
+    raise tink_error.TinkError('empty keyset')
+
+
+def _generate_unused_key_id(keyset: tink_pb2.Keyset) -> int:
+  while True:
+    key_id = random.randint(1, MAX_INT32)
+    if key_id not in {key.key_id for key in keyset.key}:
+      return key_id
diff --git a/python/core/keyset_handle_test.py b/python/core/keyset_handle_test.py
new file mode 100644
index 0000000..9378496
--- /dev/null
+++ b/python/core/keyset_handle_test.py
@@ -0,0 +1,298 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Tests for tink.python.keyset_handle."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import io
+
+from absl.testing import absltest
+from tink.proto import tink_pb2
+from tink.python import aead
+from tink.python import core
+from tink.python import hybrid
+from tink.python import mac
+from tink.python import tink_config
+from tink.python.testing import helper
+
+
+def setUpModule():
+  tink_config.register()
+
+
+class FaultyAead(aead.Aead):
+
+  def encrypt(self, plaintext: bytes, associated_data: bytes) -> bytes:
+    raise core.TinkError('encrypt failed.')
+
+  def decrypt(self, plaintext: bytes, associated_data: bytes) -> bytes:
+    raise core.TinkError('decrypt failed.')
+
+
+class BadAead1(aead.Aead):
+
+  def encrypt(self, plaintext: bytes, associated_data: bytes) -> bytes:
+    return b'ciphertext'
+
+  def decrypt(self, plaintext: bytes, associated_data: bytes) -> bytes:
+    return b'plaintext'
+
+
+class BadAead2(aead.Aead):
+
+  def encrypt(self, plaintext: bytes, associated_data: bytes) -> bytes:
+    return b'ciphertext'
+
+  def decrypt(self, plaintext: bytes, associated_data: bytes) -> bytes:
+    return tink_pb2.Keyset(primary_key_id=42).SerializeToString()
+
+
+def _master_key_aead():
+  return core.Registry.primitive(
+      core.Registry.new_key_data(aead.aead_key_templates.AES128_EAX), aead.Aead)
+
+
+def _keyset_handle(keyset):
+  # CleartextKeysetHandle is encouraged but we want to avoid that dependency
+  # in the test
+  return core.KeysetHandle._create(keyset)
+
+
+class KeysetHandleTest(absltest.TestCase):
+
+  def test_instantiation(self):
+    with self.assertRaisesRegex(core.TinkError, 'cannot be instantiated'):
+      core.KeysetHandle()
+
+  def test_generate_new(self):
+    keyset_info = core.new_keyset_handle(
+        mac.mac_key_templates.HMAC_SHA256_128BITTAG).keyset_info()
+    self.assertLen(keyset_info.key_info, 1)
+    key_info = keyset_info.key_info[0]
+    self.assertEqual(key_info.status, tink_pb2.ENABLED)
+    self.assertEqual(
+        key_info.output_prefix_type,
+        mac.mac_key_templates.HMAC_SHA256_128BITTAG.output_prefix_type)
+    self.assertEqual(keyset_info.primary_key_id, key_info.key_id)
+
+  def test_generate_new_key_id_is_randomized(self):
+    handle1 = core.new_keyset_handle(
+        mac.mac_key_templates.HMAC_SHA256_128BITTAG)
+    handle2 = core.new_keyset_handle(
+        mac.mac_key_templates.HMAC_SHA256_128BITTAG)
+    self.assertNotEqual(handle1.keyset_info().key_info[0].key_id,
+                        handle2.keyset_info().key_info[0].key_id)
+
+  def test_write_encrypted(self):
+    handle = core.new_keyset_handle(mac.mac_key_templates.HMAC_SHA256_128BITTAG)
+    # Encrypt the keyset with Aead.
+    master_key_aead = _master_key_aead()
+    output_stream = io.BytesIO()
+    writer = core.BinaryKeysetWriter(output_stream)
+    handle.write(writer, master_key_aead)
+    reader = core.BinaryKeysetReader(output_stream.getvalue())
+    handle2 = core.read_keyset_handle(reader, master_key_aead)
+    # Check that handle2 has the same primitive as handle.
+    handle2.primitive(mac.Mac).verify_mac(
+        handle.primitive(mac.Mac).compute_mac(b'data'), b'data')
+
+  def test_write_raises_error_when_encrypt_failed(self):
+    handle = core.new_keyset_handle(mac.mac_key_templates.HMAC_SHA256_128BITTAG)
+    writer = core.BinaryKeysetWriter(io.BytesIO())
+    with self.assertRaisesRegex(core.TinkError, 'encrypt failed'):
+      handle.write(writer, FaultyAead())
+
+  def test_write_raises_error_when_decrypt_not_possible(self):
+    handle = core.new_keyset_handle(mac.mac_key_templates.HMAC_SHA256_128BITTAG)
+    writer = core.BinaryKeysetWriter(io.BytesIO())
+    with self.assertRaisesRegex(core.TinkError,
+                                'invalid keyset, corrupted key material'):
+      handle.write(writer, BadAead1())
+
+  def test_write_raises_error_when_decrypt_to_wrong_keyset(self):
+    handle = core.new_keyset_handle(mac.mac_key_templates.HMAC_SHA256_128BITTAG)
+    writer = core.BinaryKeysetWriter(io.BytesIO())
+    with self.assertRaisesRegex(core.TinkError, 'cannot encrypt keyset:'):
+      handle.write(writer, BadAead2())
+
+  def test_read_empty_keyset_fails(self):
+    with self.assertRaisesRegex(core.TinkError, 'No keyset found'):
+      core.read_keyset_handle(core.BinaryKeysetReader(b''), _master_key_aead())
+
+  def test_public_keyset_handle(self):
+    private_handle = core.new_keyset_handle(
+        hybrid.hybrid_key_templates.ECIES_P256_HKDF_HMAC_SHA256_AES128_GCM)
+    public_handle = private_handle.public_keyset_handle()
+    hybrid_dec = private_handle.primitive(hybrid.HybridDecrypt)
+    hybrid_enc = public_handle.primitive(hybrid.HybridEncrypt)
+
+    self.assertEqual(public_handle.keyset_info().primary_key_id,
+                     private_handle.keyset_info().primary_key_id)
+    self.assertLen(public_handle.keyset_info().key_info, 1)
+    self.assertEqual(
+        public_handle.keyset_info().key_info[0].type_url,
+        'type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey')
+
+    ciphertext = hybrid_enc.encrypt(b'some plaintext', b'some context info')
+    self.assertEqual(
+        hybrid_dec.decrypt(ciphertext, b'some context info'), b'some plaintext')
+
+  def test_primitive_success(self):
+    keyset = tink_pb2.Keyset()
+    key = keyset.key.add()
+    key.key_data.CopyFrom(
+        core.Registry.new_key_data(aead.aead_key_templates.AES128_EAX))
+    key.output_prefix_type = tink_pb2.TINK
+    key.key_id = 1
+    key.status = tink_pb2.ENABLED
+    keyset.primary_key_id = 1
+    handle = _keyset_handle(keyset)
+    aead_primitive = handle.primitive(aead.Aead)
+    self.assertEqual(
+        aead_primitive.decrypt(
+            aead_primitive.encrypt(b'message', b'aad'), b'aad'), b'message')
+
+  def test_primitive_fails_on_empty_keyset(self):
+    keyset = tink_pb2.Keyset()
+    keyset.key.extend([helper.fake_key(key_id=1, status=tink_pb2.DESTROYED)])
+    keyset.primary_key_id = 1
+    handle = _keyset_handle(keyset)
+    with self.assertRaisesRegex(core.TinkError, 'empty keyset'):
+      handle.primitive(aead.Aead)
+
+  def test_primitive_fails_on_key_without_keydata(self):
+    keyset = tink_pb2.Keyset()
+    key = helper.fake_key(key_id=123)
+    key.ClearField('key_data')
+    keyset.key.extend([key])
+    keyset.primary_key_id = 123
+    handle = _keyset_handle(keyset)
+    with self.assertRaisesRegex(core.TinkError, 'key 123 has no key data'):
+      handle.primitive(aead.Aead)
+
+  def test_primitive_fails_on_key_with_unknown_prefix(self):
+    keyset = tink_pb2.Keyset()
+    keyset.key.extend([
+        helper.fake_key(key_id=12, output_prefix_type=tink_pb2.UNKNOWN_PREFIX)
+    ])
+    keyset.primary_key_id = 12
+    handle = _keyset_handle(keyset)
+    with self.assertRaisesRegex(core.TinkError, 'key 12 has unknown prefix'):
+      handle.primitive(aead.Aead)
+
+  def test_primitive_fails_on_key_with_unknown_status(self):
+    keyset = tink_pb2.Keyset()
+    keyset.key.extend(
+        [helper.fake_key(key_id=1234, status=tink_pb2.UNKNOWN_STATUS)])
+    keyset.primary_key_id = 1234
+    handle = _keyset_handle(keyset)
+    with self.assertRaisesRegex(core.TinkError, 'key 1234 has unknown status'):
+      handle.primitive(aead.Aead)
+
+  def test_primitive_fails_on_multiple_primary_keys(self):
+    keyset = tink_pb2.Keyset()
+    keyset.key.extend(
+        [helper.fake_key(key_id=12345),
+         helper.fake_key(key_id=12345)])
+    keyset.primary_key_id = 12345
+    handle = _keyset_handle(keyset)
+    with self.assertRaisesRegex(core.TinkError,
+                                'keyset contains multiple primary keys'):
+      handle.primitive(aead.Aead)
+
+  def test_primitive_fails_without_primary_key_present(self):
+    keyset = tink_pb2.Keyset()
+    key = keyset.key.add()
+    key.key_data.CopyFrom(
+        core.Registry.new_key_data(aead.aead_key_templates.AES128_EAX))
+    key.output_prefix_type = tink_pb2.TINK
+    key.key_id = 2
+    key.status = tink_pb2.ENABLED
+    keyset.primary_key_id = 1
+    handle = _keyset_handle(keyset)
+    with self.assertRaisesRegex(core.TinkError,
+                                'keyset does not contain a valid primary key'):
+      handle.primitive(aead.Aead)
+
+  def test_primitive_fails_on_wrong_primitive_class(self):
+    keyset = tink_pb2.Keyset()
+    key = keyset.key.add()
+    key.key_data.CopyFrom(
+        core.Registry.new_key_data(aead.aead_key_templates.AES128_EAX))
+    key.output_prefix_type = tink_pb2.TINK
+    key.key_id = 1
+    key.status = tink_pb2.ENABLED
+    keyset.primary_key_id = 1
+    handle = _keyset_handle(keyset)
+    with self.assertRaisesRegex(core.TinkError, 'Wrong primitive class'):
+      handle.primitive(mac.Mac)
+
+  def test_primitive_wrapped_correctly(self):
+    keydata2 = core.Registry.new_key_data(aead.aead_key_templates.AES128_EAX)
+    keyset = tink_pb2.Keyset()
+    key = keyset.key.add()
+    key.key_data.CopyFrom(
+        core.Registry.new_key_data(aead.aead_key_templates.AES128_EAX))
+    key.output_prefix_type = tink_pb2.TINK
+    key.key_id = 1
+    key.status = tink_pb2.ENABLED
+    key = keyset.key.add()
+    key.key_data.CopyFrom(keydata2)
+    key.output_prefix_type = tink_pb2.RAW
+    key.key_id = 2
+    key.status = tink_pb2.ENABLED
+    keyset.primary_key_id = 1
+    handle = _keyset_handle(keyset)
+    aead_primitive = handle.primitive(aead.Aead)
+    aead_primitive2 = core.Registry.primitive(keydata2, aead.Aead)
+    self.assertEqual(
+        aead_primitive.decrypt(
+            aead_primitive2.encrypt(b'message', b'aad'), b'aad'), b'message')
+
+  def test_keyset_info(self):
+    keyset = tink_pb2.Keyset(primary_key_id=2)
+    keyset.key.extend([
+        helper.fake_key(
+            value=b'v1',
+            type_url='t1',
+            key_id=1,
+            status=tink_pb2.ENABLED,
+            output_prefix_type=tink_pb2.TINK),
+        helper.fake_key(
+            value=b'v2',
+            type_url='t2',
+            key_id=2,
+            status=tink_pb2.DESTROYED,
+            output_prefix_type=tink_pb2.RAW)
+    ])
+    handle = _keyset_handle(keyset)
+    expected_keyset_info = tink_pb2.KeysetInfo(primary_key_id=2)
+    info1 = expected_keyset_info.key_info.add()
+    info1.type_url = 't1'
+    info1.status = tink_pb2.ENABLED
+    info1.output_prefix_type = tink_pb2.TINK
+    info1.key_id = 1
+    info2 = expected_keyset_info.key_info.add()
+    info2.type_url = 't2'
+    info2.status = tink_pb2.DESTROYED
+    info2.output_prefix_type = tink_pb2.RAW
+    info2.key_id = 2
+    self.assertEqual(expected_keyset_info, handle.keyset_info())
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/core/keyset_reader.py b/python/core/keyset_reader.py
new file mode 100644
index 0000000..4d67ef1
--- /dev/null
+++ b/python/core/keyset_reader.py
@@ -0,0 +1,92 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Reads Keysets from file."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import abc
+
+from typing import Text
+
+from tink.proto import tink_pb2
+from tink.python.core import tink_error
+from google.protobuf import json_format
+from google.protobuf import message
+
+
+class KeysetReader(object):
+  """Reads a Keyset."""
+
+  __metaclass__ = abc.ABCMeta
+
+  @abc.abstractmethod
+  def read(self) -> tink_pb2.Keyset:
+    """Reads and returns a (cleartext) tink_pb2.Keyset from its source."""
+    pass
+
+  @abc.abstractmethod
+  def read_encrypted(self) -> tink_pb2.EncryptedKeyset:
+    """Reads and returns an tink_pb2.EncryptedKeyset from its source."""
+    pass
+
+
+class JsonKeysetReader(KeysetReader):
+  """Reads a JSON Keyset."""
+
+  def __init__(self, serialized_keyset: Text):
+    self._serialized_keyset = serialized_keyset
+
+  def read(self) -> tink_pb2.Keyset:
+    try:
+      return json_format.Parse(self._serialized_keyset, tink_pb2.Keyset())
+    except json_format.ParseError as e:
+      raise tink_error.TinkError(e)
+
+  def read_encrypted(self) -> tink_pb2.EncryptedKeyset:
+    try:
+      return json_format.Parse(self._serialized_keyset,
+                               tink_pb2.EncryptedKeyset())
+    except json_format.ParseError as e:
+      raise tink_error.TinkError(e)
+
+
+class BinaryKeysetReader(KeysetReader):
+  """Reads a binary Keyset."""
+
+  def __init__(self, serialized_keyset: bytes):
+    self._serialized_keyset = serialized_keyset
+
+  def read(self) -> tink_pb2.Keyset:
+    if not self._serialized_keyset:
+      raise tink_error.TinkError('No keyset found')
+    try:
+      keyset = tink_pb2.Keyset()
+      keyset.ParseFromString(self._serialized_keyset)
+      return keyset
+    except message.DecodeError as e:
+      raise tink_error.TinkError(e)
+
+  def read_encrypted(self) -> tink_pb2.EncryptedKeyset:
+    if not self._serialized_keyset:
+      raise tink_error.TinkError('No keyset found')
+    try:
+      encrypted_keyset = tink_pb2.EncryptedKeyset()
+      encrypted_keyset.ParseFromString(self._serialized_keyset)
+      return encrypted_keyset
+    except message.DecodeError as e:
+      raise tink_error.TinkError(e)
diff --git a/python/core/keyset_reader_test.py b/python/core/keyset_reader_test.py
new file mode 100644
index 0000000..93f62d9
--- /dev/null
+++ b/python/core/keyset_reader_test.py
@@ -0,0 +1,146 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.keyset_reader."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+from tink.proto import tink_pb2
+from tink.python import core
+
+
+class JsonKeysetReaderTest(absltest.TestCase):
+
+  def test_read(self):
+    json_keyset = """
+        {
+          "primaryKeyId": 42,
+          "key": [
+            {
+              "keyData": {
+                "typeUrl": "type.googleapis.com/google.crypto.tink.AesGcmKey",
+                "keyMaterialType": "SYMMETRIC",
+                "value": "GhCS/1+ejWpx68NfGt6ziYHd"
+              },
+              "outputPrefixType": "TINK",
+              "keyId": 42,
+              "status": "ENABLED"
+            }
+          ]
+        }"""
+    reader = core.JsonKeysetReader(json_keyset)
+    keyset = reader.read()
+    self.assertEqual(keyset.primary_key_id, 42)
+    self.assertLen(keyset.key, 1)
+
+  def test_read_invalid(self):
+    with self.assertRaisesRegex(core.TinkError, 'Failed to load JSON'):
+      reader = core.JsonKeysetReader('not json')
+      reader.read()
+
+  def test_read_encrypted(self):
+    # encryptedKeyset is a base64-encoding of 'some ciphertext with keyset'
+    json_encrypted_keyset = """
+        {
+          "encryptedKeyset": "c29tZSBjaXBoZXJ0ZXh0IHdpdGgga2V5c2V0",
+          "keysetInfo": {
+            "primaryKeyId": 42,
+            "keyInfo": [
+              {
+                "typeUrl": "type.googleapis.com/google.crypto.tink.AesGcmKey",
+                "outputPrefixType": "TINK",
+                "keyId": 42,
+                "status": "ENABLED"
+              }
+            ]
+          }
+        }"""
+    reader = core.JsonKeysetReader(json_encrypted_keyset)
+    enc_keyset = reader.read_encrypted()
+    self.assertEqual(enc_keyset.encrypted_keyset,
+                     b'some ciphertext with keyset')
+    self.assertLen(enc_keyset.keyset_info.key_info, 1)
+    self.assertEqual(enc_keyset.keyset_info.key_info[0].type_url,
+                     'type.googleapis.com/google.crypto.tink.AesGcmKey')
+
+  def test_read_encrypted_invalid(self):
+    with self.assertRaisesRegex(core.TinkError, 'Failed to load JSON'):
+      reader = core.JsonKeysetReader('not json')
+      reader.read_encrypted()
+
+
+class BinaryKeysetReaderTest(absltest.TestCase):
+
+  def test_read(self):
+    keyset = tink_pb2.Keyset()
+    keyset.primary_key_id = 42
+    key = keyset.key.add()
+    key.key_data.type_url = 'type.googleapis.com/google.crypto.tink.AesGcmKey'
+    key.key_data.key_material_type = tink_pb2.KeyData.SYMMETRIC
+    key.key_data.value = b'GhCS/1+ejWpx68NfGt6ziYHd'
+    key.output_prefix_type = tink_pb2.TINK
+    key.key_id = 42
+    key.status = tink_pb2.ENABLED
+    reader = core.BinaryKeysetReader(keyset.SerializeToString())
+    self.assertEqual(keyset, reader.read())
+
+  def test_read_none(self):
+    with self.assertRaisesRegex(core.TinkError, 'No keyset found'):
+      reader = core.BinaryKeysetReader(None)
+      reader.read()
+
+  def test_read_empty(self):
+    with self.assertRaisesRegex(core.TinkError, 'No keyset found'):
+      reader = core.BinaryKeysetReader('')
+      reader.read()
+
+  def test_read_invalid(self):
+    with self.assertRaisesRegex(core.TinkError, 'Wrong wire type'):
+      reader = core.BinaryKeysetReader(b'some weird data')
+      reader.read()
+
+  def test_read_encrypted(self):
+    encrypted_keyset = tink_pb2.EncryptedKeyset()
+    encrypted_keyset.encrypted_keyset = b'c29tZSBjaXBoZXJ0ZXh0IHdpdGgga2V5c2V0'
+    encrypted_keyset.keyset_info.primary_key_id = 42
+    key_info = encrypted_keyset.keyset_info.key_info.add()
+    key_info.type_url = 'type.googleapis.com/google.crypto.tink.AesGcmKey'
+    key_info.output_prefix_type = tink_pb2.TINK
+    key_info.key_id = 42
+    key_info.status = tink_pb2.ENABLED
+    reader = core.BinaryKeysetReader(
+        encrypted_keyset.SerializeToString())
+    self.assertEqual(encrypted_keyset, reader.read_encrypted())
+
+  def test_read_encrypted_none(self):
+    with self.assertRaisesRegex(core.TinkError, 'No keyset found'):
+      reader = core.BinaryKeysetReader(None)
+      reader.read_encrypted()
+
+  def test_read_encrypted_empty(self):
+    with self.assertRaisesRegex(core.TinkError, 'No keyset found'):
+      reader = core.BinaryKeysetReader('')
+      reader.read_encrypted()
+
+  def test_read_encrypted_invalid(self):
+    with self.assertRaisesRegex(core.TinkError, 'Wrong wire type'):
+      reader = core.BinaryKeysetReader(b'some weird data')
+      reader.read_encrypted()
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/core/keyset_writer.py b/python/core/keyset_writer.py
new file mode 100644
index 0000000..4e417f4
--- /dev/null
+++ b/python/core/keyset_writer.py
@@ -0,0 +1,97 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Writes Keysets to file."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import abc
+import io
+
+from google.protobuf import json_format
+from tink.proto import tink_pb2
+from tink.python.core import tink_error
+
+
+class KeysetWriter(object):
+  """Knows how to write keysets to some storage system."""
+
+  __metaclass__ = abc.ABCMeta
+
+  @abc.abstractmethod
+  def write(self, keyset: tink_pb2.Keyset) -> None:
+    """Tries to write a tink_pb2.Keyset to some storage system."""
+    pass
+
+  @abc.abstractmethod
+  def write_encrypted(self, encrypted_keyset: tink_pb2.EncryptedKeyset) -> None:
+    """Tries to write an tink_pb2.EncryptedKeyset to some storage system."""
+    pass
+
+
+class JsonKeysetWriter(KeysetWriter):
+  """Writes keysets in proto JSON wire format to some storage system.
+
+  cf. https://developers.google.com/protocol-buffers/docs/encoding
+  """
+
+  def __init__(self, text_io_stream: io.TextIOBase):
+    self._io_stream = text_io_stream
+
+  def write(self, keyset: tink_pb2.Keyset) -> None:
+    if not isinstance(keyset, tink_pb2.Keyset):
+      raise tink_error.TinkError('invalid keyset.')
+    json_keyset = json_format.MessageToJson(keyset)
+    # TODO(b/141106504) Needed for python 2.7 compatibility. StringIO expects
+    # unicode, but MessageToJson outputs UTF-8.
+    if isinstance(json_keyset, bytes):
+      json_keyset = json_keyset.decode('utf-8')
+    self._io_stream.write(json_keyset)
+    self._io_stream.flush()
+
+  def write_encrypted(self, encrypted_keyset: tink_pb2.EncryptedKeyset) -> None:
+    if not isinstance(encrypted_keyset, tink_pb2.EncryptedKeyset):
+      raise tink_error.TinkError('invalid encrypted keyset.')
+    json_keyset = json_format.MessageToJson(encrypted_keyset)
+    # TODO(b/141106504) Needed for python 2.7 compatibility. StringIO expects
+    # unicode, but MessageToJson outputs UTF-8.
+    if isinstance(json_keyset, bytes):
+      json_keyset = json_keyset.decode('utf-8')
+    self._io_stream.write(json_keyset)
+    self._io_stream.flush()
+
+
+class BinaryKeysetWriter(KeysetWriter):
+  """Writes keysets in proto binary wire format to some storage system.
+
+  cf. https://developers.google.com/protocol-buffers/docs/encoding
+  """
+
+  def __init__(self, binary_io_stream: io.BufferedIOBase):
+    self._io_stream = binary_io_stream
+
+  def write(self, keyset: tink_pb2.Keyset) -> None:
+    if not isinstance(keyset, tink_pb2.Keyset):
+      raise tink_error.TinkError('invalid keyset.')
+    self._io_stream.write(keyset.SerializeToString())
+    self._io_stream.flush()
+
+  def write_encrypted(self, encrypted_keyset: tink_pb2.EncryptedKeyset) -> None:
+    if not isinstance(encrypted_keyset, tink_pb2.EncryptedKeyset):
+      raise tink_error.TinkError('invalid encrypted keyset.')
+    self._io_stream.write(encrypted_keyset.SerializeToString())
+    self._io_stream.flush()
diff --git a/python/core/keyset_writer_test.py b/python/core/keyset_writer_test.py
new file mode 100644
index 0000000..be3a3b7
--- /dev/null
+++ b/python/core/keyset_writer_test.py
@@ -0,0 +1,128 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.core.keyset_writer."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import io
+
+from absl.testing import absltest
+from tink.proto import tink_pb2
+from tink.python import core
+
+
+def example_keyset():
+  keyset = tink_pb2.Keyset()
+  keyset.primary_key_id = 42
+  key = keyset.key.add()
+  key.key_data.type_url = u'type.googleapis.com/google.crypto.tink.AesGcmKey'
+  key.key_data.key_material_type = tink_pb2.KeyData.SYMMETRIC
+  key.key_data.value = b'GhCS/1+ejWpx68NfGt6ziYHd'
+  key.output_prefix_type = tink_pb2.TINK
+  key.key_id = 42
+  key.status = tink_pb2.ENABLED
+  return keyset
+
+
+def example_encrypted_keyset():
+  encrypted_keyset = tink_pb2.EncryptedKeyset()
+  encrypted_keyset.encrypted_keyset = b'c29tZSBjaXBoZXJ0ZXh0IHdpdGgga2V5c2V0'
+  encrypted_keyset.keyset_info.primary_key_id = 42
+  key_info = encrypted_keyset.keyset_info.key_info.add()
+  key_info.type_url = 'type.googleapis.com/google.crypto.tink.AesGcmKey'
+  key_info.output_prefix_type = tink_pb2.TINK
+  key_info.key_id = 42
+  key_info.status = tink_pb2.ENABLED
+  return encrypted_keyset
+
+
+class JsonKeysetWriterTest(absltest.TestCase):
+
+  def test_write_read(self):
+    keyset = example_keyset()
+    stream = io.StringIO()
+    writer = core.JsonKeysetWriter(stream)
+    writer.write(keyset)
+    reader = core.JsonKeysetReader(stream.getvalue())
+    self.assertEqual(keyset, reader.read())
+
+  def test_write_encrypted_read_encrypted(self):
+    encrypted_keyset = example_encrypted_keyset()
+    stream = io.StringIO()
+    writer = core.JsonKeysetWriter(stream)
+    writer.write_encrypted(encrypted_keyset)
+    reader = core.JsonKeysetReader(stream.getvalue())
+    self.assertEqual(encrypted_keyset, reader.read_encrypted())
+
+  def test_write_read_with_unicode_chars(self):
+    keyset = tink_pb2.Keyset()
+    key = keyset.key.add()
+    key.key_data.type_url = (
+        u'\xe3\x82\xb3\xe3\x83\xb3\xe3\x83\x8b\xe3\x83\x81\xe3\x83\x8f')
+    stream = io.StringIO()
+    writer = core.JsonKeysetWriter(stream)
+    writer.write(keyset)
+    reader = core.JsonKeysetReader(stream.getvalue())
+    self.assertEqual(keyset, reader.read())
+
+  def test_write_invalid_fails(self):
+    with self.assertRaisesRegex(core.TinkError, 'invalid keyset'):
+      stream = io.StringIO()
+      writer = core.JsonKeysetWriter(stream)
+      writer.write(example_encrypted_keyset())
+
+  def test_write_encrypted_invalid_fails(self):
+    with self.assertRaisesRegex(core.TinkError, 'invalid encrypted keyset'):
+      stream = io.StringIO()
+      writer = core.JsonKeysetWriter(stream)
+      writer.write_encrypted(example_keyset())
+
+
+class BinaryKeysetReaderTest(absltest.TestCase):
+
+  def test_write_read(self):
+    keyset = example_keyset()
+    stream = io.BytesIO()
+    writer = core.BinaryKeysetWriter(stream)
+    writer.write(keyset)
+    reader = core.BinaryKeysetReader(stream.getvalue())
+    self.assertEqual(keyset, reader.read())
+
+  def test_write_encrypted_read_encrypted(self):
+    encrypted_keyset = example_encrypted_keyset()
+    stream = io.BytesIO()
+    writer = core.BinaryKeysetWriter(stream)
+    writer.write_encrypted(encrypted_keyset)
+    reader = core.BinaryKeysetReader(stream.getvalue())
+    self.assertEqual(encrypted_keyset, reader.read_encrypted())
+
+  def test_write_invalid_fails(self):
+    with self.assertRaisesRegex(core.TinkError, 'invalid keyset'):
+      stream = io.BytesIO()
+      writer = core.BinaryKeysetWriter(stream)
+      writer.write(example_encrypted_keyset())
+
+  def test_write_encrypted_invalid_fails(self):
+    with self.assertRaisesRegex(core.TinkError, 'invalid encrypted keyset'):
+      stream = io.BytesIO()
+      writer = core.BinaryKeysetWriter(stream)
+      writer.write_encrypted(example_keyset())
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/core/primitive_set.py b/python/core/primitive_set.py
new file mode 100644
index 0000000..69a15a6
--- /dev/null
+++ b/python/core/primitive_set.py
@@ -0,0 +1,92 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""A container class for a set of primitives."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import collections
+from typing import Generic, List, Type, TypeVar
+
+from tink.proto import tink_pb2
+from tink.python.core import crypto_format
+from tink.python.core import tink_error
+
+P = TypeVar('P')
+Entry = collections.namedtuple(
+    'Entry', 'primitive, identifier, status, output_prefix_type')
+
+
+def new_primitive_set(primitive_class):
+  return PrimitiveSet(primitive_class)
+
+
+class PrimitiveSet(Generic[P]):
+  """A container class for a set of primitives.
+
+  PrimitiveSet is an auxiliary class used for supporting key rotation:
+  primitives in a set correspond to keys in a keyset. Users will usually work
+  with primitive instances, which essentially wrap primitive sets. For example
+  an instance of an Aead-primitive for a given keyset holds a set of
+  Aead-primitives corresponding to the keys in the keyset, and uses the set
+  members to do the actual crypto operations: to encrypt data the primary
+  Aead-primitive from the set is used, and upon decryption the ciphertext's
+  prefix determines the id of the primitive from the set.
+  """
+
+  def __init__(self, primitive_class: Type[P]):
+    # map from identifier to a list of Entry
+    self._primitives = {}
+    self._primary = None
+    self._primitive_class = primitive_class
+
+  def primitive_class(self) -> Type[P]:
+    return self._primitive_class
+
+  def primitive_from_identifier(self, identifier: bytes) -> List[P]:
+    """Returns a copy of the list of entries for a given identifier."""
+    # Copy the list so that if the user modifies the list, it does not affect
+    # the internal data structure.
+    return self._primitives.get(identifier, [])[:]
+
+  def primitive(self, key: tink_pb2.Keyset.Key) -> List[P]:
+    """Returns a copy of the list of primitives for a given identifier."""
+    return self.primitive_from_identifier(crypto_format.output_prefix(key))
+
+  def raw_primitives(self) -> List[P]:
+    """Returns a copy of the list of primitives for a given identifier."""
+    # All raw keys have the same identifier, which is just b''.
+    return self.primitive_from_identifier(crypto_format.RAW_PREFIX)
+
+  def add_primitive(self, primitive: P, key: tink_pb2.Keyset.Key) -> Entry:
+    """Adds a new primitive and key entry to the set, and returns the entry."""
+    if not isinstance(primitive, self._primitive_class):
+      raise tink_error.TinkError(
+          'The primitive is not an instance of {}'.format(
+              self._primitive_class))
+    identifier = crypto_format.output_prefix(key)
+
+    entry = Entry(primitive, identifier, key.status, key.output_prefix_type)
+    entries = self._primitives.setdefault(identifier, [])
+    entries.append(entry)
+    return entry
+
+  def set_primary(self, entry: Entry) -> None:
+    self._primary = entry
+
+  def primary(self) -> Entry:
+    return self._primary
diff --git a/python/core/primitive_set_test.py b/python/core/primitive_set_test.py
new file mode 100644
index 0000000..7bd8136
--- /dev/null
+++ b/python/core/primitive_set_test.py
@@ -0,0 +1,170 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.core.primitive_set."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+from tink.proto import tink_pb2
+from tink.python import aead
+from tink.python import core
+from tink.python import mac
+from tink.python.core import crypto_format
+from tink.python.testing import helper
+
+
+class PrimitiveSetTest(absltest.TestCase):
+
+  def test_primitive_returns_entry(self):
+    key = helper.fake_key(key_id=1)
+    fake_mac = helper.FakeMac('FakeMac')
+    primitive_set = core.new_primitive_set(mac.Mac)
+    primitive_set.add_primitive(fake_mac, key)
+    entries = primitive_set.primitive(key)
+    self.assertLen(entries, 1)
+    entry = entries[0]
+    self.assertEqual(fake_mac, entry.primitive)
+    self.assertEqual(tink_pb2.ENABLED, entry.status)
+    self.assertEqual(crypto_format.output_prefix(key), entry.identifier)
+
+  def test_unknown_key_returns_empty_list(self):
+    primitive_set = core.new_primitive_set(mac.Mac)
+    unknown_key = helper.fake_key(key_id=1)
+    self.assertEqual(primitive_set.primitive(unknown_key), [])
+
+  def test_primitive_from_identifier_returns_entry(self):
+    primitive_set = core.new_primitive_set(mac.Mac)
+    key = helper.fake_key(key_id=1)
+    fake_mac = helper.FakeMac('FakeMac')
+    primitive_set.add_primitive(fake_mac, key)
+
+    ident = crypto_format.output_prefix(key)
+    entries = primitive_set.primitive_from_identifier(ident)
+    self.assertLen(entries, 1)
+    entry = entries[0]
+    self.assertEqual(fake_mac, entry.primitive)
+    self.assertEqual(tink_pb2.ENABLED, entry.status)
+    self.assertEqual(ident, entry.identifier)
+
+  def test_list_of_entries_can_be_modified(self):
+    primitive_set = core.new_primitive_set(mac.Mac)
+    key = helper.fake_key(key_id=1)
+    primitive_set.add_primitive(helper.FakeMac('FakeMac'), key)
+    entries = primitive_set.primitive(key)
+    entries.append('Something')
+    self.assertLen(primitive_set.primitive(key), 1)
+
+  def test_primary_returns_primary(self):
+    primitive_set = core.new_primitive_set(mac.Mac)
+    key = helper.fake_key(key_id=1)
+    fake_mac = helper.FakeMac('FakeMac')
+    entry = primitive_set.add_primitive(fake_mac, key)
+    primitive_set.set_primary(entry)
+
+    entry = primitive_set.primary()
+    self.assertEqual(fake_mac, entry.primitive)
+    self.assertEqual(tink_pb2.ENABLED, entry.status)
+    self.assertEqual(crypto_format.output_prefix(key), entry.identifier)
+
+  def test_primary_returns_none(self):
+    primitive_set = core.new_primitive_set(mac.Mac)
+    primitive_set.add_primitive(
+        helper.FakeMac('FakeMac'), helper.fake_key(key_id=1))
+    self.assertEqual(primitive_set.primary(), None)
+
+  def test_same_key_id_and_prefix_type(self):
+    primitive_set = core.new_primitive_set(mac.Mac)
+    key1 = helper.fake_key(key_id=1, status=tink_pb2.ENABLED)
+    fake_mac1 = helper.FakeMac('FakeMac1')
+    primitive_set.add_primitive(fake_mac1, key1)
+    key2 = helper.fake_key(key_id=1, status=tink_pb2.DISABLED)
+    fake_mac2 = helper.FakeMac('FakeMac2')
+    primitive_set.add_primitive(fake_mac2, key2)
+
+    expected_ident = crypto_format.output_prefix(key1)
+    entries = primitive_set.primitive(key1)
+    self.assertLen(entries, 2)
+    self.assertEqual(fake_mac1, entries[0].primitive)
+    self.assertEqual(fake_mac2, entries[1].primitive)
+    self.assertEqual(tink_pb2.ENABLED, entries[0].status)
+    self.assertEqual(tink_pb2.DISABLED, entries[1].status)
+    self.assertEqual(expected_ident, entries[0].identifier)
+    self.assertEqual(expected_ident, entries[1].identifier)
+    self.assertLen(primitive_set.primitive(key2), 2)
+
+  def test_same_key_id_but_different_prefix_type(self):
+    primitive_set = core.new_primitive_set(mac.Mac)
+    key1 = helper.fake_key(key_id=1, output_prefix_type=tink_pb2.TINK)
+    fake_mac1 = helper.FakeMac('FakeMac1')
+    primitive_set.add_primitive(fake_mac1, key1)
+    key2 = helper.fake_key(key_id=1, output_prefix_type=tink_pb2.LEGACY)
+    fake_mac2 = helper.FakeMac('FakeMac2')
+    primitive_set.add_primitive(fake_mac2, key2)
+
+    entries1 = primitive_set.primitive(key1)
+    self.assertLen(entries1, 1)
+    self.assertEqual(fake_mac1, entries1[0].primitive)
+    self.assertEqual(tink_pb2.ENABLED, entries1[0].status)
+    self.assertEqual(crypto_format.output_prefix(key1), entries1[0].identifier)
+
+    entries2 = primitive_set.primitive(key2)
+    self.assertLen(entries2, 1)
+    self.assertEqual(fake_mac2, entries2[0].primitive)
+    self.assertEqual(tink_pb2.ENABLED, entries2[0].status)
+    self.assertEqual(crypto_format.output_prefix(key2), entries2[0].identifier)
+
+  def test_add_invalid_key_fails(self):
+    primitive_set = core.new_primitive_set(mac.Mac)
+    key = helper.fake_key()
+    key.ClearField('output_prefix_type')
+    with self.assertRaisesRegex(core.TinkError, 'invalid OutputPrefixType'):
+      primitive_set.add_primitive(helper.FakeMac(), key)
+
+  def test_add_wrong_primitive_fails(self):
+    primitive_set = core.new_primitive_set(aead.Aead)
+    with self.assertRaisesRegex(core.TinkError,
+                                'The primitive is not an instance of '):
+      primitive_set.add_primitive(helper.FakeMac(), helper.fake_key())
+
+  def test_primitive_class(self):
+    primitive_set = core.new_primitive_set(mac.Mac)
+    self.assertEqual(primitive_set.primitive_class(), mac.Mac)
+
+  def test_raw_primitives(self):
+    primitive_set = core.new_primitive_set(mac.Mac)
+    primitive_set.add_primitive(
+        helper.FakeMac('FakeMac1'), helper.fake_key(key_id=1))
+    key2 = helper.fake_key(key_id=1, output_prefix_type=tink_pb2.RAW)
+    fake_mac2 = helper.FakeMac('FakeMac2')
+    primitive_set.add_primitive(fake_mac2, key2)
+    key3 = helper.fake_key(
+        key_id=3, status=tink_pb2.DISABLED, output_prefix_type=tink_pb2.RAW)
+    fake_mac3 = helper.FakeMac('FakeMac3')
+    primitive_set.add_primitive(fake_mac3, key3)
+
+    entries = primitive_set.raw_primitives()
+    self.assertLen(entries, 2)
+    self.assertEqual(fake_mac2, entries[0].primitive)
+    self.assertEqual(tink_pb2.ENABLED, entries[0].status)
+    self.assertEqual(crypto_format.RAW_PREFIX, entries[0].identifier)
+    self.assertEqual(fake_mac3, entries[1].primitive)
+    self.assertEqual(tink_pb2.DISABLED, entries[1].status)
+    self.assertEqual(crypto_format.RAW_PREFIX, entries[1].identifier)
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/core/primitive_wrapper.py b/python/core/primitive_wrapper.py
new file mode 100644
index 0000000..f19a1f9
--- /dev/null
+++ b/python/core/primitive_wrapper.py
@@ -0,0 +1,49 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Basic interface for wrapping a primitive."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import abc
+from typing import Generic, Type, TypeVar
+
+from tink.python.core import primitive_set
+
+P = TypeVar('P')
+
+
+class PrimitiveWrapper(Generic[P]):
+  """Basic interface for wrapping a primitive.
+
+  A PrimitiveSet can be wrapped by a single primitive in order to fulfill a
+  cryptographic task. This is done by the PrimitiveWrapper. Whenever a new
+  primitive type is added to Tink, the user should define a new PrimitiveWrapper
+  and register it by calling registry.registerPrimitiveWrapper().
+  """
+
+  __metaclass__ = abc.ABCMeta
+
+  @abc.abstractmethod
+  def wrap(self, pset: primitive_set.PrimitiveSet) -> P:
+    """Wraps a PrimitiveSet and returns a single primitive instance."""
+    pass
+
+  @abc.abstractmethod
+  def primitive_class(self) -> Type[P]:
+    """Returns the primitive class of the primitive managed."""
+    pass
diff --git a/python/core/registry.py b/python/core/registry.py
new file mode 100644
index 0000000..1f020f3
--- /dev/null
+++ b/python/core/registry.py
@@ -0,0 +1,207 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tink Registry."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from typing import Any, Text, Tuple, Type, TypeVar
+
+from tink.proto import tink_pb2
+from tink.python.core import key_manager as km_module
+from tink.python.core import primitive_set as pset_module
+from tink.python.core import primitive_wrapper
+from tink.python.core import tink_error
+
+P = TypeVar('P')
+
+
+class Registry(object):
+  """A global container of key managers.
+
+  Registry maps supported key types to a corresponding KeyManager object,
+  which 'understands' the key type (i.e., the KeyManager can instantiate the
+  primitive corresponding to given key, or can generate new keys of the
+  supported key type). Keeping KeyManagers for all primitives in a single
+  Registry (rather than having a separate KeyManager per primitive) enables
+  modular construction of compound primitives from 'simple' ones,
+  e.g., AES-CTR-HMAC AEAD encryption uses IND-CPA encryption and a MAC.
+
+  Registry is initialized at startup, and is later used to instantiate
+  primitives for given keys or keysets.
+  """
+
+  _key_managers = {}  # type: dict[Text, Tuple[km_module.KeyManager, bool]]
+  _wrappers = {}  # type: dict[Type, primitive_wrapper.PrimitiveWrapper]
+
+  @classmethod
+  def reset(cls) -> None:
+    """Resets the registry."""
+    cls._key_managers = {}
+    cls._wrappers = {}
+
+  @classmethod
+  def _key_manager_internal(
+      cls, type_url: Text) -> Tuple[km_module.KeyManager, bool]:
+    """Returns a key manager, new_key_allowed pair for the given type_url."""
+    if type_url not in cls._key_managers:
+      raise tink_error.TinkError(
+          'No manager for type {} has been registered.'.format(type_url))
+    return cls._key_managers[type_url]
+
+  @classmethod
+  def key_manager(cls, type_url: Text) -> km_module.KeyManager:
+    """Returns a key manager for the given type_url and primitive_class.
+
+    Args:
+      type_url: Key type string
+
+    Returns:
+      A KeyManager object
+    """
+    key_mgr, _ = cls._key_manager_internal(type_url)
+    return key_mgr
+
+  @classmethod
+  def register_key_manager(cls,
+                           key_manager: km_module.KeyManager,
+                           new_key_allowed: bool = True) -> None:
+    """Tries to register a key_manager for the given key_manager.key_type().
+
+    Args:
+      key_manager: A KeyManager object
+      new_key_allowed: If new_key_allowed is true, users can generate new keys
+        with this manager using Registry.new_key()
+    """
+    key_managers = cls._key_managers
+    type_url = key_manager.key_type()
+    primitive_class = key_manager.primitive_class()
+
+    if not key_manager.does_support(type_url):
+      raise tink_error.TinkError(
+          'The manager does not support its own type {}.'.format(type_url))
+
+    if type_url in key_managers:
+      existing, existing_new_key = key_managers[type_url]
+      if (type(existing) != type(key_manager) or  # pylint: disable=unidiomatic-typecheck
+          existing.primitive_class() != primitive_class):
+        raise tink_error.TinkError(
+            'A manager for type {} has been already registered.'.format(
+                type_url))
+      else:
+        if not existing_new_key and new_key_allowed:
+          raise tink_error.TinkError(
+              ('A manager for type {} has been already registered '
+               'with forbidden new key operation.').format(type_url))
+        key_managers[type_url] = (existing, new_key_allowed)
+    else:
+      key_managers[type_url] = (key_manager, new_key_allowed)
+
+  @classmethod
+  def primitive(cls, key_data: tink_pb2.KeyData, primitive_class: Type[P]) -> P:
+    """Creates a new primitive for the key given in key_data.
+
+    It looks up a KeyManager identified by key_data.type_url,
+    and calls manager's primitive(key_data) method.
+
+    Args:
+      key_data: KeyData object
+      primitive_class: The expected primitive class
+
+    Returns:
+      A primitive for the given key_data
+    Raises:
+      Error if primitive_class does not match the registered primitive class.
+    """
+    key_mgr = cls.key_manager(key_data.type_url)
+    if key_mgr.primitive_class() != primitive_class:
+      raise tink_error.TinkError(
+          'Wrong primitive class: type {} uses primitive {}, and not {}.'
+          .format(key_data.type_url, key_mgr.primitive_class().__name__,
+                  primitive_class.__name__))
+    return key_mgr.primitive(key_data)
+
+  @classmethod
+  def new_key_data(cls, key_template: tink_pb2.KeyTemplate) -> tink_pb2.KeyData:
+    """Generates a new key for the specified key_template."""
+    key_mgr, new_key_allowed = cls._key_manager_internal(
+        key_template.type_url)
+
+    if not new_key_allowed:
+      raise tink_error.TinkError(
+          'KeyManager for type {} does not allow for creation of new keys.'
+          .format(key_template.type_url))
+
+    return key_mgr.new_key_data(key_template)
+
+  @classmethod
+  def public_key_data(cls,
+                      private_key_data: tink_pb2.KeyData) -> tink_pb2.KeyData:
+    """Generates a new key for the specified key_template."""
+    if (private_key_data.key_material_type !=
+        tink_pb2.KeyData.ASYMMETRIC_PRIVATE):
+      raise tink_error.TinkError('The keyset contains a non-private key')
+    key_mgr = cls.key_manager(private_key_data.type_url)
+    if not isinstance(key_mgr, km_module.PrivateKeyManager):
+      raise tink_error.TinkError(
+          'manager for key type {} is not a PrivateKeyManager'
+          .format(private_key_data.type_url))
+    return key_mgr.public_key_data(private_key_data)
+
+  @classmethod
+  def register_primitive_wrapper(
+      cls, wrapper: primitive_wrapper.PrimitiveWrapper) -> None:
+    """Tries to register a PrimitiveWrapper.
+
+    Args:
+      wrapper: A PrimitiveWrapper object.
+    Raises:
+      Error if a different wrapper has already been registered for the same
+      Primitive.
+    """
+    if (wrapper.primitive_class() in cls._wrappers and
+        type(cls._wrappers[wrapper.primitive_class()]) != type(wrapper)):  # pylint: disable=unidiomatic-typecheck
+      raise tink_error.TinkError(
+          'A wrapper for primitive {} has already been added.'.format(
+              wrapper.primitive_class().__name__))
+    wrapped = wrapper.wrap(
+        pset_module.PrimitiveSet(wrapper.primitive_class()))
+    if not isinstance(wrapped, wrapper.primitive_class()):
+      raise tink_error.TinkError(
+          'Wrapper for primitive {} generates incompatible primitive of type {}'
+          .format(wrapper.primitive_class().__name__,
+                  type(wrapped).__name__))
+    cls._wrappers[wrapper.primitive_class()] = wrapper
+
+  @classmethod
+  def wrap(
+      cls, primitive_set: pset_module.PrimitiveSet) -> Any:  # -> Primitive
+    """Tries to register a PrimitiveWrapper.
+
+    Args:
+      primitive_set: A PrimitiveSet object.
+    Returns:
+      A primitive that wraps the primitives in primitive_set.
+    Raises:
+      Error if no wrapper for this primitive class is registered.
+    """
+    if primitive_set.primitive_class() not in cls._wrappers:
+      raise tink_error.TinkError(
+          'No PrimitiveWrapper registered for primitive {}.'
+          .format(primitive_set.primitive_class() .__name__))
+    wrapper = cls._wrappers[primitive_set.primitive_class()]
+    return wrapper.wrap(primitive_set)
diff --git a/python/core/registry_test.py b/python/core/registry_test.py
new file mode 100644
index 0000000..7c01fcd
--- /dev/null
+++ b/python/core/registry_test.py
@@ -0,0 +1,247 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.registry."""
+from absl.testing import absltest
+
+from tink.proto import tink_pb2
+
+from tink.python import aead
+from tink.python import core
+from tink.python import mac
+from tink.python.testing import helper
+
+
+class DummyKeyManager(core.KeyManager):
+
+  def __init__(self, type_url, primitive_class=aead.Aead):
+    self._type_url = type_url
+    self._primitive_class = primitive_class
+
+  def primitive_class(self):
+    return self._primitive_class
+
+  def primitive(self, key_data):
+    return helper.FakeAead()
+
+  def key_type(self):
+    return self._type_url
+
+  def new_key_data(self, key_template):
+    return tink_pb2.KeyData(type_url=key_template.type_url)
+
+
+class DummyPrivateKeyManager(core.PrivateKeyManager):
+
+  def __init__(self, type_url):
+    self._type_url = type_url
+
+  def primitive_class(self):
+    return None
+
+  def primitive(self, key_data):
+    return None
+
+  def key_type(self):
+    return self._type_url
+
+  def new_key_data(self, key_template):
+    return None
+
+  def public_key_data(self, private_key_data):
+    return tink_pb2.KeyData(type_url='public_' + private_key_data.type_url)
+
+
+class DummyMacWrapper(core.PrimitiveWrapper):
+
+  def wrap(self, _):
+    return helper.FakeMac()
+
+  def primitive_class(self):
+    return mac.Mac
+
+
+class InconsistentWrapper(core.PrimitiveWrapper):
+
+  def wrap(self, _):
+    return helper.FakeAead()
+
+  def primitive_class(self):
+    return mac.Mac
+
+
+def _mac_set(mac_list):
+  """Converts a List of Mac in a PrimitiveSet and sets the last primary."""
+  mac_set = core.new_primitive_set(mac.Mac)
+  for i, primitive in enumerate(mac_list):
+    mac_set.set_primary(
+        mac_set.add_primitive(
+            primitive,
+            helper.fake_key(key_id=i, output_prefix_type=tink_pb2.RAW)))
+  return mac_set
+
+
+class RegistryTest(absltest.TestCase):
+
+  def setUp(self):
+    super(RegistryTest, self).setUp()
+    self.reg = core.Registry()
+    self.reg.reset()
+
+  def test_key_manager_no_exist(self):
+    with self.assertRaises(core.TinkError):
+      self.reg.key_manager('invalid')
+
+  def test_key_manager_register(self):
+    dummy_key_manager = DummyKeyManager('dummy_type_url')
+    self.reg.register_key_manager(dummy_key_manager)
+    self.assertEqual(dummy_key_manager, self.reg.key_manager('dummy_type_url'))
+
+  def test_key_manager_reset(self):
+    dummy_key_manager = DummyKeyManager('dummy_type_url')
+    self.reg.register_key_manager(dummy_key_manager)
+    self.reg.reset()
+    with self.assertRaises(core.TinkError):
+      self.reg.key_manager('dummy_type_url')
+
+  def test_register_same_key_manager_twice(self):
+    self.reg.register_key_manager(DummyKeyManager('dummy_type_url', aead.Aead))
+    self.reg.register_key_manager(DummyKeyManager('dummy_type_url', aead.Aead))
+
+  def test_key_manager_replace_fails(self):
+    self.reg.register_key_manager(DummyKeyManager('dummy_type_url', aead.Aead))
+    # Replacing the primitive_class for a type_url not allowed.
+    with self.assertRaises(core.TinkError):
+      self.reg.register_key_manager(
+          DummyKeyManager('dummy_type_url', mac.Mac), new_key_allowed=False)
+
+  def test_key_manager_disable_new_key_enable_fails(self):
+    self.reg.register_key_manager(DummyKeyManager('dummy_type_url'))
+    # Disable new keys.
+    self.reg.register_key_manager(
+        DummyKeyManager('dummy_type_url'), new_key_allowed=False)
+    # Check new keys can't be enabled again.
+    with self.assertRaises(core.TinkError):
+      self.reg.register_key_manager(
+          DummyKeyManager('dummy_type_url'), new_key_allowed=True)
+
+  def test_primitive_ok(self):
+    self.reg.register_key_manager(DummyKeyManager('dummy_type_url', aead.Aead))
+    primitive = self.reg.primitive(
+        tink_pb2.KeyData(type_url='dummy_type_url'), aead.Aead)
+    self.assertIsInstance(primitive, helper.FakeAead)
+
+  def test_primitive_fails_on_wrong_primitive(self):
+    self.reg.register_key_manager(DummyKeyManager('dummy_type_url', aead.Aead))
+    with self.assertRaisesRegex(core.TinkError,
+                                'uses primitive Aead, and not Mac'):
+      self.reg.primitive(tink_pb2.KeyData(type_url='dummy_type_url'), mac.Mac)
+
+  def test_primitive_fails_on_subclass(self):
+    self.reg.register_key_manager(
+        DummyKeyManager('dummy_type_url', helper.FakeAead))
+    with self.assertRaisesRegex(core.TinkError,
+                                'uses primitive FakeAead, and not Aead'):
+      self.reg.primitive(tink_pb2.KeyData(type_url='dummy_type_url'), aead.Aead)
+
+  def test_new_key_data_success(self):
+    self.reg.register_key_manager(DummyKeyManager('dummy_type_url'))
+    key_template = tink_pb2.KeyTemplate(type_url='dummy_type_url')
+    key_data = self.reg.new_key_data(key_template)
+    self.assertEqual(key_data.type_url, 'dummy_type_url')
+
+  def test_new_key_data_wrong_type_url(self):
+    self.reg.register_key_manager(DummyKeyManager('dummy_type_url'))
+    unknown_key_template = tink_pb2.KeyTemplate(type_url='unknown_type_url')
+    with self.assertRaisesRegex(core.TinkError,
+                                'No manager for type unknown_type_url'):
+      self.reg.new_key_data(unknown_key_template)
+
+  def test_new_key_data_no_new_key_allowed(self):
+    self.reg.register_key_manager(
+        DummyKeyManager('dummy_type_url'), new_key_allowed=False)
+    key_template = tink_pb2.KeyTemplate(type_url='dummy_type_url')
+    with self.assertRaisesRegex(core.TinkError,
+                                'does not allow for creation of new keys'):
+      self.reg.new_key_data(key_template)
+
+  def test_public_key_data_success(self):
+    self.reg.register_key_manager(DummyPrivateKeyManager('dummy_type_url'))
+    key_data = tink_pb2.KeyData(
+        type_url='dummy_type_url',
+        key_material_type=tink_pb2.KeyData.ASYMMETRIC_PRIVATE)
+    public_key_data = self.reg.public_key_data(key_data)
+    self.assertEqual(public_key_data.type_url, 'public_dummy_type_url')
+
+  def test_public_key_data_fails_for_non_asymmetric_private_key(self):
+    self.reg.register_key_manager(DummyPrivateKeyManager('dummy_type_url'))
+    key_data = tink_pb2.KeyData(
+        type_url='dummy_type_url',
+        key_material_type=tink_pb2.KeyData.ASYMMETRIC_PUBLIC)
+    with self.assertRaisesRegex(core.TinkError,
+                                'contains a non-private key'):
+      self.reg.public_key_data(key_data)
+
+  def test_public_key_data_fails_for_non_private_key_manager(self):
+    self.reg.register_key_manager(DummyKeyManager('dummy_type_url'))
+    key_data = tink_pb2.KeyData(
+        type_url='dummy_type_url',
+        key_material_type=tink_pb2.KeyData.ASYMMETRIC_PRIVATE)
+    with self.assertRaisesRegex(core.TinkError,
+                                'is not a PrivateKeyManager'):
+      self.reg.public_key_data(key_data)
+
+  def test_wrap_success(self):
+    self.reg.register_primitive_wrapper(mac.MacWrapper())
+    mac1 = helper.FakeMac('FakeMac1')
+    mac2 = helper.FakeMac('FakeMac2')
+    wrapped_mac = self.reg.wrap(_mac_set([mac1, mac2]))
+    wrapped_mac.verify_mac(mac1.compute_mac(b'data1'), b'data1')
+    wrapped_mac.verify_mac(mac2.compute_mac(b'data2'), b'data2')
+    wrapped_mac.verify_mac(wrapped_mac.compute_mac(b'data'), b'data')
+
+  def test_wrap_unknown_primitive(self):
+    with self.assertRaisesRegex(
+        core.TinkError,
+        'No PrimitiveWrapper registered for primitive Mac.'):
+      self.reg.wrap(_mac_set([helper.FakeMac()]))
+
+  def test_primitive_wrapper_reset(self):
+    self.reg.register_primitive_wrapper(mac.MacWrapper())
+    self.reg.reset()
+    with self.assertRaisesRegex(
+        core.TinkError,
+        'No PrimitiveWrapper registered for primitive Mac.'):
+      self.reg.wrap(_mac_set([helper.FakeMac()]))
+
+  def test_register_same_primitive_wrapper_twice(self):
+    self.reg.register_primitive_wrapper(mac.MacWrapper())
+    self.reg.register_primitive_wrapper(mac.MacWrapper())
+
+  def test_register_different_primitive_wrappers_twice_fails(self):
+    self.reg.register_primitive_wrapper(mac.MacWrapper())
+    with self.assertRaisesRegex(
+        core.TinkError,
+        'A wrapper for primitive Mac has already been added.'):
+      self.reg.register_primitive_wrapper(DummyMacWrapper())
+
+  def test_register_inconsistent_wrapper_fails(self):
+    with self.assertRaisesRegex(
+        core.TinkError,
+        'Wrapper for primitive Mac generates incompatible primitive'):
+      self.reg.register_primitive_wrapper(InconsistentWrapper())
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/core/tink_error.py b/python/core/tink_error.py
new file mode 100644
index 0000000..7e310aa
--- /dev/null
+++ b/python/core/tink_error.py
@@ -0,0 +1,35 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""This module defines basic exceptions in Tink."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from tink.util import error as clif_error
+
+
+def use_tink_errors(func):
+  """Transforms StatusNotOk errors into TinkErrors."""
+  def wrapper(*args):
+    try:
+      return func(*args)
+    except clif_error.StatusNotOk as e:
+      raise TinkError(e)
+  return wrapper
+
+
+class TinkError(Exception):
+  """Common exception in Tink."""
diff --git a/python/daead/__init__.py b/python/daead/__init__.py
new file mode 100644
index 0000000..eed46925
--- /dev/null
+++ b/python/daead/__init__.py
@@ -0,0 +1,28 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Deterministic aead package."""
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from tink.python.daead import deterministic_aead
+from tink.python.daead import deterministic_aead_key_manager
+from tink.python.daead import deterministic_aead_key_templates
+from tink.python.daead import deterministic_aead_wrapper
+
+
+DeterministicAead = deterministic_aead.DeterministicAead
+DeterministicAeadWrapper = deterministic_aead_wrapper.DeterministicAeadWrapper
diff --git a/python/daead/deterministic_aead.py b/python/daead/deterministic_aead.py
new file mode 100644
index 0000000..3ad0667
--- /dev/null
+++ b/python/daead/deterministic_aead.py
@@ -0,0 +1,59 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""This module defines the interface for Deterministic AEAD."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import abc
+
+
+class DeterministicAead(object):
+  """Interface for Deterministic Authenticated Encryption with Associated Data.
+
+  For why this interface is desirable and some of its use cases, see for
+  example https://tools.ietf.org/html/rfc5297#section-1.3.
+
+  Warning!
+
+  Unlike Aead, implementations of this interface are not semantically
+  secure, because encrypting the same plaintex always yields the same
+  ciphertext.
+
+  Security guarantees
+
+  Implementations of this interface provide 128-bit security level against
+  multi-user attacks with up to 2^32 keys. That means if an adversary
+  obtains 2^32 ciphertexts of the same message encrypted under 2^32 keys,
+  they need to do 2^128 computations to obtain a single key.
+
+  Encryption with associated data ensures authenticity (who the sender is)
+  and integrity (the data has not been tampered with) of that data, but not
+  its secrecy. (see https://tools.ietf.org/html/rfc5116)
+  """
+
+  __metaclass__ = abc.ABCMeta
+
+  @abc.abstractmethod
+  def encrypt_deterministically(self, plaintext: bytes,
+                                associated_data: bytes) -> bytes:
+    raise NotImplementedError()
+
+  @abc.abstractmethod
+  def decrypt_deterministically(self, ciphertext: bytes,
+                                associated_data: bytes) -> bytes:
+    raise NotImplementedError()
diff --git a/python/daead/deterministic_aead_key_manager.py b/python/daead/deterministic_aead_key_manager.py
new file mode 100644
index 0000000..bb27376
--- /dev/null
+++ b/python/daead/deterministic_aead_key_manager.py
@@ -0,0 +1,54 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Python wrapper of the CLIF-wrapped C++ Deterministic AEAD key manager."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from typing import Text
+
+from tink.python.cc.clif import cc_key_manager
+from tink.python.core import key_manager
+from tink.python.core import tink_error
+from tink.python.daead import deterministic_aead
+
+
+class _DeterministicAeadCcToPyWrapper(deterministic_aead.DeterministicAead):
+  """Transforms cliffed C++ DeterministicAead into a Python primitive."""
+
+  def __init__(self, cc_deterministic_aead):
+    self._deterministic_aead = cc_deterministic_aead
+
+  @tink_error.use_tink_errors
+  def encrypt_deterministically(self, plaintext: bytes,
+                                associated_data: bytes) -> bytes:
+    return self._deterministic_aead.encrypt_deterministically(
+        plaintext, associated_data)
+
+  @tink_error.use_tink_errors
+  def decrypt_deterministically(self, ciphertext: bytes,
+                                associated_data: bytes) -> bytes:
+    return self._deterministic_aead.decrypt_deterministically(
+        ciphertext, associated_data)
+
+
+def from_cc_registry(
+    type_url: Text
+) -> key_manager.KeyManager[deterministic_aead.DeterministicAead]:
+  return key_manager.KeyManagerCcToPyWrapper(
+      cc_key_manager.DeterministicAeadKeyManager.from_cc_registry(type_url),
+      deterministic_aead.DeterministicAead, _DeterministicAeadCcToPyWrapper)
diff --git a/python/daead/deterministic_aead_key_manager_test.py b/python/daead/deterministic_aead_key_manager_test.py
new file mode 100644
index 0000000..fb6cffb
--- /dev/null
+++ b/python/daead/deterministic_aead_key_manager_test.py
@@ -0,0 +1,81 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.deterministic_aead_key_manager."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+from tink.proto import aes_siv_pb2
+from tink.proto import tink_pb2
+from tink.python import tink_config
+from tink.python.core import tink_error
+from tink.python.daead import deterministic_aead
+from tink.python.daead import deterministic_aead_key_manager
+from tink.python.daead import deterministic_aead_key_templates
+
+
+def setUpModule():
+  tink_config.register()
+
+
+class DeterministicAeadKeyManagerTest(absltest.TestCase):
+
+  def setUp(self):
+    super(DeterministicAeadKeyManagerTest, self).setUp()
+    self.key_manager = deterministic_aead_key_manager.from_cc_registry(
+        'type.googleapis.com/google.crypto.tink.AesSivKey')
+
+  def test_primitive_class(self):
+    self.assertEqual(self.key_manager.primitive_class(),
+                     deterministic_aead.DeterministicAead)
+
+  def test_key_type(self):
+    self.assertEqual(self.key_manager.key_type(),
+                     'type.googleapis.com/google.crypto.tink.AesSivKey')
+
+  def test_new_key_data(self):
+    key_template = deterministic_aead_key_templates.AES256_SIV
+    key_data = self.key_manager.new_key_data(key_template)
+    self.assertEqual(key_data.type_url, self.key_manager.key_type())
+    self.assertEqual(key_data.key_material_type, tink_pb2.KeyData.SYMMETRIC)
+    key = aes_siv_pb2.AesSivKey()
+    key.ParseFromString(key_data.value)
+    self.assertEqual(key.version, 0)
+    self.assertLen(key.key_value, 64)
+
+  def test_invalid_params_throw_exception(self):
+    key_template = deterministic_aead_key_templates.create_aes_siv_key_template(
+        63)
+    with self.assertRaisesRegex(tink_error.TinkError,
+                                'Invalid key size'):
+      self.key_manager.new_key_data(key_template)
+
+  def test_encrypt_decrypt(self):
+    daead_primitive = self.key_manager.primitive(
+        self.key_manager.new_key_data(
+            deterministic_aead_key_templates.AES256_SIV))
+    plaintext = b'plaintext'
+    associated_data = b'associated_data'
+    ciphertext = daead_primitive.encrypt_deterministically(
+        plaintext, associated_data)
+    self.assertEqual(
+        daead_primitive.decrypt_deterministically(ciphertext, associated_data),
+        plaintext)
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/daead/deterministic_aead_key_templates.py b/python/daead/deterministic_aead_key_templates.py
new file mode 100644
index 0000000..1f68bed
--- /dev/null
+++ b/python/daead/deterministic_aead_key_templates.py
@@ -0,0 +1,46 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Pre-generated KeyTemplate for DeterministicAead.
+
+One can use these templates to generate a new tink_pb2.Keyset with
+tink_pb2.KeysetHandle. To generate a new keyset that contains a single
+tink_pb2.HmacKey, one can do:
+handle = keyset_handle.KeysetHandle(aead_key_templates.AES128_EAX).
+"""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from tink.proto import aes_siv_pb2
+from tink.proto import tink_pb2
+
+
+_AES_SIV_KEY_TYPE_URL = 'type.googleapis.com/google.crypto.tink.AesSivKey'
+
+
+def create_aes_siv_key_template(key_size: int) -> tink_pb2.KeyTemplate:
+  """Creates an AES EAX KeyTemplate, and fills in its values."""
+  key_format = aes_siv_pb2.AesSivKeyFormat()
+  key_format.key_size = key_size
+  key_template = tink_pb2.KeyTemplate()
+  key_template.type_url = _AES_SIV_KEY_TYPE_URL
+  key_template.output_prefix_type = tink_pb2.TINK
+  key_template.value = key_format.SerializeToString()
+  return key_template
+
+
+AES256_SIV = create_aes_siv_key_template(key_size=64)
diff --git a/python/daead/deterministic_aead_key_templates_test.py b/python/daead/deterministic_aead_key_templates_test.py
new file mode 100644
index 0000000..ac2de05
--- /dev/null
+++ b/python/daead/deterministic_aead_key_templates_test.py
@@ -0,0 +1,51 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.deterministic_aead_key_templates."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+from tink.proto import aes_siv_pb2
+from tink.proto import tink_pb2
+from tink.python.daead import deterministic_aead_key_templates
+
+
+class DeterministicAeadKeyTemplatesTest(absltest.TestCase):
+
+  def test_aes256_siv(self):
+    template = deterministic_aead_key_templates.AES256_SIV
+    self.assertEqual('type.googleapis.com/google.crypto.tink.AesSivKey',
+                     template.type_url)
+    self.assertEqual(tink_pb2.TINK, template.output_prefix_type)
+    key_format = aes_siv_pb2.AesSivKeyFormat()
+    key_format.ParseFromString(template.value)
+    self.assertEqual(64, key_format.key_size)
+
+  def test_create_aes_siv_key_template(self):
+    # Intentionally using 'weird' or invalid values for parameters,
+    # to test that the function correctly puts them in the resulting template.
+    template = deterministic_aead_key_templates.create_aes_siv_key_template(
+        key_size=42)
+    self.assertEqual('type.googleapis.com/google.crypto.tink.AesSivKey',
+                     template.type_url)
+    self.assertEqual(tink_pb2.TINK, template.output_prefix_type)
+    key_format = aes_siv_pb2.AesSivKeyFormat()
+    key_format.ParseFromString(template.value)
+    self.assertEqual(42, key_format.key_size)
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/daead/deterministic_aead_wrapper.py b/python/daead/deterministic_aead_wrapper.py
new file mode 100644
index 0000000..b29e052
--- /dev/null
+++ b/python/daead/deterministic_aead_wrapper.py
@@ -0,0 +1,84 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Deterministic AEAD wrapper."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from absl import logging
+from typing import Type
+
+from tink.python.core import crypto_format
+from tink.python.core import primitive_set
+from tink.python.core import primitive_wrapper
+from tink.python.core import tink_error
+from tink.python.daead import deterministic_aead
+
+
+class _WrappedDeterministicAead(deterministic_aead.DeterministicAead):
+  """Implements DeterministicAead for a set of DeterministicAead primitives."""
+
+  def __init__(self, pset: primitive_set.PrimitiveSet):
+    self._primitive_set = pset
+
+  def encrypt_deterministically(self, plaintext: bytes,
+                                associated_data: bytes) -> bytes:
+    primary = self._primitive_set.primary()
+    return primary.identifier + primary.primitive.encrypt_deterministically(
+        plaintext, associated_data)
+
+  def decrypt_deterministically(self, ciphertext: bytes,
+                                associated_data: bytes) -> bytes:
+    if len(ciphertext) > crypto_format.NON_RAW_PREFIX_SIZE:
+      prefix = ciphertext[:crypto_format.NON_RAW_PREFIX_SIZE]
+      ciphertext_no_prefix = ciphertext[crypto_format.NON_RAW_PREFIX_SIZE:]
+      for entry in self._primitive_set.primitive_from_identifier(prefix):
+        try:
+          return entry.primitive.decrypt_deterministically(ciphertext_no_prefix,
+                                                           associated_data)
+        except tink_error.TinkError as e:
+          logging.info(
+              'ciphertext prefix matches a key, but cannot decrypt: %s', e)
+    # Let's try all RAW keys.
+    for entry in self._primitive_set.raw_primitives():
+      try:
+        return entry.primitive.decrypt_deterministically(ciphertext,
+                                                         associated_data)
+      except tink_error.TinkError as e:
+        pass
+    # nothing works.
+    raise tink_error.TinkError('Decryption failed.')
+
+
+class DeterministicAeadWrapper(
+    primitive_wrapper.PrimitiveWrapper[deterministic_aead.DeterministicAead]):
+  """DeterministicAeadWrapper is a PrimitiveWrapper for DeterministicAead.
+
+  The created primitive works with a keyset (rather than a single key). To
+  encrypt a plaintext, it uses the primary key in the keyset, and prepends to
+  the ciphertext a certain prefix associated with the primary key. To decrypt,
+  the primitive uses the prefix of the ciphertext to efficiently select the
+  right key in the set. If the keys associated with the prefix do not work, the
+  primitive tries all keys with OutputPrefixType RAW.
+  """
+
+  def wrap(self, pset: primitive_set.PrimitiveSet
+          ) -> deterministic_aead.DeterministicAead:
+    return _WrappedDeterministicAead(pset)
+
+  def primitive_class(self) -> Type[deterministic_aead.DeterministicAead]:
+    return deterministic_aead.DeterministicAead
diff --git a/python/daead/deterministic_aead_wrapper_test.py b/python/daead/deterministic_aead_wrapper_test.py
new file mode 100644
index 0000000..6eeb584
--- /dev/null
+++ b/python/daead/deterministic_aead_wrapper_test.py
@@ -0,0 +1,167 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.aead_wrapper."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+from tink.proto import tink_pb2
+from tink.python.core import primitive_set
+from tink.python.core import tink_error
+from tink.python.daead import deterministic_aead
+from tink.python.daead import deterministic_aead_wrapper
+from tink.python.testing import helper
+
+
+class AeadWrapperTest(absltest.TestCase):
+
+  def new_primitive_key_pair(self, key_id, output_prefix_type):
+    fake_key = helper.fake_key(
+        key_id=key_id, output_prefix_type=output_prefix_type)
+    fake_aead = helper.FakeDeterministicAead(
+        'fakeDeterministicAead {}'.format(key_id))
+    return fake_aead, fake_key
+
+  def test_encrypt_decrypt(self):
+    primitive, key = self.new_primitive_key_pair(1234, tink_pb2.TINK)
+    pset = primitive_set.new_primitive_set(deterministic_aead.DeterministicAead)
+    entry = pset.add_primitive(primitive, key)
+    pset.set_primary(entry)
+
+    wrapped_daead = deterministic_aead_wrapper.DeterministicAeadWrapper().wrap(
+        pset)
+
+    plaintext = b'plaintext'
+    associated_data = b'associated_data'
+    ciphertext = wrapped_daead.encrypt_deterministically(
+        plaintext, associated_data)
+    self.assertEqual(
+        wrapped_daead.decrypt_deterministically(ciphertext, associated_data),
+        plaintext)
+
+  def test_encrypt_decrypt_with_key_rotation(self):
+    primitive, key = self.new_primitive_key_pair(1234, tink_pb2.TINK)
+    pset = primitive_set.new_primitive_set(deterministic_aead.DeterministicAead)
+    entry = pset.add_primitive(primitive, key)
+    pset.set_primary(entry)
+    wrapped_daead = deterministic_aead_wrapper.DeterministicAeadWrapper().wrap(
+        pset)
+    ciphertext = wrapped_daead.encrypt_deterministically(
+        b'plaintext', b'associated_data')
+
+    new_primitive, new_key = self.new_primitive_key_pair(5678, tink_pb2.TINK)
+    new_entry = pset.add_primitive(new_primitive, new_key)
+    pset.set_primary(new_entry)
+    new_ciphertext = wrapped_daead.encrypt_deterministically(
+        b'new_plaintext', b'new_associated_data')
+
+    self.assertEqual(
+        wrapped_daead.decrypt_deterministically(ciphertext, b'associated_data'),
+        b'plaintext')
+    self.assertEqual(
+        wrapped_daead.decrypt_deterministically(new_ciphertext,
+                                                b'new_associated_data'),
+        b'new_plaintext')
+
+  def test_encrypt_decrypt_with_key_rotation_from_raw(self):
+    primitive, raw_key = self.new_primitive_key_pair(1234, tink_pb2.RAW)
+    old_raw_ciphertext = primitive.encrypt_deterministically(
+        b'plaintext', b'associated_data')
+
+    pset = primitive_set.new_primitive_set(deterministic_aead.DeterministicAead)
+    pset.add_primitive(primitive, raw_key)
+    new_primitive, new_key = self.new_primitive_key_pair(5678, tink_pb2.TINK)
+    new_entry = pset.add_primitive(new_primitive, new_key)
+    pset.set_primary(new_entry)
+    wrapped_daead = deterministic_aead_wrapper.DeterministicAeadWrapper().wrap(
+        pset)
+    new_ciphertext = wrapped_daead.encrypt_deterministically(
+        b'new_plaintext', b'new_associated_data')
+
+    self.assertEqual(
+        wrapped_daead.decrypt_deterministically(old_raw_ciphertext,
+                                                b'associated_data'),
+        b'plaintext')
+    self.assertEqual(
+        wrapped_daead.decrypt_deterministically(new_ciphertext,
+                                                b'new_associated_data'),
+        b'new_plaintext')
+
+  def test_encrypt_decrypt_two_raw_keys(self):
+    primitive1, raw_key1 = self.new_primitive_key_pair(1234, tink_pb2.RAW)
+    primitive2, raw_key2 = self.new_primitive_key_pair(5678, tink_pb2.RAW)
+    raw_ciphertext1 = primitive1.encrypt_deterministically(
+        b'plaintext1', b'associated_data1')
+    raw_ciphertext2 = primitive2.encrypt_deterministically(
+        b'plaintext2', b'associated_data2')
+
+    pset = primitive_set.new_primitive_set(deterministic_aead.DeterministicAead)
+    pset.add_primitive(primitive1, raw_key1)
+    pset.set_primary(pset.add_primitive(primitive2, raw_key2))
+    wrapped_daead = deterministic_aead_wrapper.DeterministicAeadWrapper().wrap(
+        pset)
+
+    self.assertEqual(
+        wrapped_daead.decrypt_deterministically(raw_ciphertext1,
+                                                b'associated_data1'),
+        b'plaintext1')
+    self.assertEqual(
+        wrapped_daead.decrypt_deterministically(raw_ciphertext2,
+                                                b'associated_data2'),
+        b'plaintext2')
+    self.assertEqual(
+        wrapped_daead.decrypt_deterministically(
+            wrapped_daead.encrypt_deterministically(b'plaintext',
+                                                    b'associated_data'),
+            b'associated_data'), b'plaintext')
+
+  def test_decrypt_unknown_ciphertext_fails(self):
+    unknown_primitive = helper.FakeDeterministicAead(
+        'unknownFakeDeterministicAead')
+    unknown_ciphertext = unknown_primitive.encrypt_deterministically(
+        b'plaintext', b'associated_data')
+
+    pset = primitive_set.new_primitive_set(deterministic_aead.DeterministicAead)
+    primitive, raw_key = self.new_primitive_key_pair(1234, tink_pb2.RAW)
+    new_primitive, new_key = self.new_primitive_key_pair(5678, tink_pb2.TINK)
+    pset.add_primitive(primitive, raw_key)
+    new_entry = pset.add_primitive(new_primitive, new_key)
+    pset.set_primary(new_entry)
+    wrapped_daead = deterministic_aead_wrapper.DeterministicAeadWrapper().wrap(
+        pset)
+
+    with self.assertRaisesRegex(tink_error.TinkError, 'Decryption failed'):
+      wrapped_daead.decrypt_deterministically(unknown_ciphertext,
+                                              b'associated_data')
+
+  def test_decrypt_wrong_associated_data_fails(self):
+    primitive, key = self.new_primitive_key_pair(1234, tink_pb2.TINK)
+    pset = primitive_set.new_primitive_set(deterministic_aead.DeterministicAead)
+    entry = pset.add_primitive(primitive, key)
+    pset.set_primary(entry)
+    wrapped_daead = deterministic_aead_wrapper.DeterministicAeadWrapper().wrap(
+        pset)
+
+    ciphertext = wrapped_daead.encrypt_deterministically(
+        b'plaintext', b'associated_data')
+    with self.assertRaisesRegex(tink_error.TinkError, 'Decryption failed'):
+      wrapped_daead.decrypt_deterministically(ciphertext,
+                                              b'wrong_associated_data')
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/hybrid/__init__.py b/python/hybrid/__init__.py
new file mode 100644
index 0000000..53c71a9
--- /dev/null
+++ b/python/hybrid/__init__.py
@@ -0,0 +1,33 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Hybrid package."""
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from tink.python.hybrid import hybrid_decrypt
+from tink.python.hybrid import hybrid_decrypt_key_manager
+from tink.python.hybrid import hybrid_decrypt_wrapper
+from tink.python.hybrid import hybrid_encrypt
+from tink.python.hybrid import hybrid_encrypt_key_manager
+from tink.python.hybrid import hybrid_encrypt_wrapper
+from tink.python.hybrid import hybrid_key_templates
+
+
+HybridDecrypt = hybrid_decrypt.HybridDecrypt
+HybridEncrypt = hybrid_encrypt.HybridEncrypt
+HybridDecryptWrapper = hybrid_decrypt_wrapper.HybridDecryptWrapper
+HybridEncryptWrapper = hybrid_encrypt_wrapper.HybridEncryptWrapper
diff --git a/python/hybrid/hybrid_decrypt.py b/python/hybrid/hybrid_decrypt.py
new file mode 100644
index 0000000..cfb3ead
--- /dev/null
+++ b/python/hybrid/hybrid_decrypt.py
@@ -0,0 +1,62 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""This module defines the interface for HybridDecrypt."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import abc
+
+
+class HybridDecrypt(object):
+  """The interface for hybrid decryption.
+
+  Implementations of this interface are secure against adaptive
+  chosen ciphertext attacks.  In addition to 'plaintext' the
+  encryption takes an extra parameter 'context_info', which usually
+  is public data implicit from the context, but should be bound to
+  the resulting ciphertext: upon decryption the ciphertext allows for
+  checking the integrity of 'context_info' (but there are no
+  guarantees wrt. to secrecy or authenticity of 'context_info').
+
+  WARNING: hybrid encryption does not provide authenticity, that is the
+  recipient of an encrypted message does not know the identity of the sender.
+  Similar to general public-key encryption schemes the security goal of
+  hybrid encryption is to provide privacy only. In other words, hybrid
+  encryption is secure if and only if the recipient can accept anonymous
+  messages or can rely on other mechanisms to authenticate the sender.
+
+  'context_info' can be empty or null, but to ensure the correct
+  decryption of the resulting ciphertext the same value must be
+  provided for decryption operation (cf. HybridDecrypt-interface).
+
+  A concrete instantiation of this interface can implement the
+  binding of 'context_info' to the ciphertext in various ways, for
+  example:
+
+  - use 'context_info' as "associated data"-input for the employed
+    AEAD symmetric encryption (cf. https://tools.ietf.org/html/rfc5116).
+  - use 'context_info' as "CtxInfo"-input for HKDF (if the implementation uses
+    HKDF as key derivation function, cf. https://tools.ietf.org/html/rfc5869).
+  """
+
+  __metaclass__ = abc.ABCMeta
+
+  @abc.abstractmethod
+  def decrypt(self, ciphertext: bytes, context_info: bytes) -> bytes:
+    """Decrypts ciphertext verifying the integrity of context_info."""
+    raise NotImplementedError()
diff --git a/python/hybrid/hybrid_decrypt_key_manager.py b/python/hybrid/hybrid_decrypt_key_manager.py
new file mode 100644
index 0000000..fea3500
--- /dev/null
+++ b/python/hybrid/hybrid_decrypt_key_manager.py
@@ -0,0 +1,46 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Python wrapper of the CLIF-wrapped C++ Hybrid En- and Decryption key manager."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from typing import Text
+
+from tink.cc.python import hybrid_decrypt as cc_hybrid_decrypt
+from tink.python.cc.clif import cc_key_manager
+from tink.python.core import key_manager
+from tink.python.core import tink_error
+from tink.python.hybrid import hybrid_decrypt
+
+
+class _HybridDecryptCcToPyWrapper(hybrid_decrypt.HybridDecrypt):
+  """Transforms cliffed C++ HybridDecrypt primitive into a Python primitive."""
+
+  def __init__(self, cc_primitive: cc_hybrid_decrypt.HybridDecrypt):
+    self._hybrid_decrypt = cc_primitive
+
+  @tink_error.use_tink_errors
+  def decrypt(self, ciphertext: bytes, context_info: bytes) -> bytes:
+    return self._hybrid_decrypt.decrypt(ciphertext, context_info)
+
+
+def from_cc_registry(
+    type_url: Text) -> key_manager.KeyManager[hybrid_decrypt.HybridDecrypt]:
+  return key_manager.PrivateKeyManagerCcToPyWrapper(
+      cc_key_manager.HybridDecryptKeyManager.from_cc_registry(type_url),
+      hybrid_decrypt.HybridDecrypt, _HybridDecryptCcToPyWrapper)
diff --git a/python/hybrid/hybrid_decrypt_wrapper.py b/python/hybrid/hybrid_decrypt_wrapper.py
new file mode 100644
index 0000000..461a426
--- /dev/null
+++ b/python/hybrid/hybrid_decrypt_wrapper.py
@@ -0,0 +1,74 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""HybridDecrypt wrapper."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from absl import logging
+from typing import Type
+
+from tink.python.core import crypto_format
+from tink.python.core import primitive_set
+from tink.python.core import primitive_wrapper
+from tink.python.core import tink_error
+from tink.python.hybrid import hybrid_decrypt
+
+
+class _WrappedHybridDecrypt(hybrid_decrypt.HybridDecrypt):
+  """Implements HybridDecrypt for a set of HybridDecrypt primitives."""
+
+  def __init__(self, pset: primitive_set.PrimitiveSet):
+    self._primitive_set = pset
+
+  def decrypt(self, ciphertext: bytes, context_info: bytes) -> bytes:
+    if len(ciphertext) > crypto_format.NON_RAW_PREFIX_SIZE:
+      prefix = ciphertext[:crypto_format.NON_RAW_PREFIX_SIZE]
+      ciphertext_no_prefix = ciphertext[crypto_format.NON_RAW_PREFIX_SIZE:]
+      for entry in self._primitive_set.primitive_from_identifier(prefix):
+        try:
+          return entry.primitive.decrypt(ciphertext_no_prefix,
+                                         context_info)
+        except tink_error.TinkError as e:
+          logging.info(
+              'ciphertext prefix matches a key, but cannot decrypt: %s', e)
+    # Let's try all RAW keys.
+    for entry in self._primitive_set.raw_primitives():
+      try:
+        return entry.primitive.decrypt(ciphertext, context_info)
+      except tink_error.TinkError as e:
+        pass
+    # nothing works.
+    raise tink_error.TinkError('Decryption failed.')
+
+
+class HybridDecryptWrapper(
+    primitive_wrapper.PrimitiveWrapper[hybrid_decrypt.HybridDecrypt]):
+  """HybridDecryptWrapper is the PrimitiveWrapper for HybridDecrypt.
+
+  The returned primitive works with a keyset (rather than a single key). To
+  decrypt, the primitive uses the prefix of the ciphertext to efficiently select
+  the right key in the set. If the keys associated with the prefix do not work,
+  the primitive tries all keys with OutputPrefixType RAW.
+  """
+
+  def wrap(self,
+           pset: primitive_set.PrimitiveSet) -> hybrid_decrypt.HybridDecrypt:
+    return _WrappedHybridDecrypt(pset)
+
+  def primitive_class(self) -> Type[hybrid_decrypt.HybridDecrypt]:
+    return hybrid_decrypt.HybridDecrypt
diff --git a/python/hybrid/hybrid_encrypt.py b/python/hybrid/hybrid_encrypt.py
new file mode 100644
index 0000000..584259f
--- /dev/null
+++ b/python/hybrid/hybrid_encrypt.py
@@ -0,0 +1,62 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""This module defines the interface for HybridEncrypt."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import abc
+
+
+class HybridEncrypt(object):
+  """The interface for hybrid encryption.
+
+  Implementations of this interface are secure against adaptive
+  chosen ciphertext attacks.  In addition to 'plaintext' the
+  encryption takes an extra parameter 'context_info', which usually
+  is public data implicit from the context, but should be bound to
+  the resulting ciphertext: upon decryption the ciphertext allows for
+  checking the integrity of 'context_info' (but there are no
+  guarantees wrt. to secrecy or authenticity of 'context_info').
+
+  WARNING: hybrid encryption does not provide authenticity, that is the
+  recipient of an encrypted message does not know the identity of the sender.
+  Similar to general public-key encryption schemes the security goal of
+  hybrid encryption is to provide privacy only. In other words, hybrid
+  encryption is secure if and only if the recipient can accept anonymous
+  messages or can rely on other mechanisms to authenticate the sender.
+
+  'context_info' can be empty or null, but to ensure the correct
+  decryption of the resulting ciphertext the same value must be
+  provided for decryption operation (cf. HybridDecrypt-interface).
+
+  A concrete instantiation of this interface can implement the
+  binding of 'context_info' to the ciphertext in various ways, for
+  example:
+
+  - use 'context_info' as "associated data"-input for the employed
+    AEAD symmetric encryption (cf. https://tools.ietf.org/html/rfc5116).
+  - use 'context_info' as "CtxInfo"-input for HKDF (if the implementation uses
+    HKDF as key derivation function, cf. https://tools.ietf.org/html/rfc5869).
+  """
+
+  __metaclass__ = abc.ABCMeta
+
+  @abc.abstractmethod
+  def encrypt(self, plaintext: bytes, context_info: bytes) -> bytes:
+    """Encrypts plaintext binding context_info to the resulting ciphertext."""
+    raise NotImplementedError()
diff --git a/python/hybrid/hybrid_encrypt_key_manager.py b/python/hybrid/hybrid_encrypt_key_manager.py
new file mode 100644
index 0000000..a336321
--- /dev/null
+++ b/python/hybrid/hybrid_encrypt_key_manager.py
@@ -0,0 +1,47 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Python wrapper of the CLIF-wrapped C++ Hybrid En- and Decryption key manager."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from typing import Text
+
+
+from tink.cc.python import hybrid_encrypt as cc_hybrid_encrypt
+from tink.python.cc.clif import cc_key_manager
+from tink.python.core import key_manager
+from tink.python.core import tink_error
+from tink.python.hybrid import hybrid_encrypt
+
+
+class _HybridEncryptCcToPyWrapper(hybrid_encrypt.HybridEncrypt):
+  """Transforms cliffed C++ HybridEncrypt primitive into a Python primitive."""
+
+  def __init__(self, cc_primitive: cc_hybrid_encrypt.HybridEncrypt):
+    self._hybrid_encrypt = cc_primitive
+
+  @tink_error.use_tink_errors
+  def encrypt(self, plaintext: bytes, context_info: bytes) -> bytes:
+    return self._hybrid_encrypt.encrypt(plaintext, context_info)
+
+
+def from_cc_registry(
+    type_url: Text) -> key_manager.KeyManager[hybrid_encrypt.HybridEncrypt]:
+  return key_manager.KeyManagerCcToPyWrapper(
+      cc_key_manager.HybridEncryptKeyManager.from_cc_registry(type_url),
+      hybrid_encrypt.HybridEncrypt, _HybridEncryptCcToPyWrapper)
diff --git a/python/hybrid/hybrid_encrypt_wrapper.py b/python/hybrid/hybrid_encrypt_wrapper.py
new file mode 100644
index 0000000..99ee383
--- /dev/null
+++ b/python/hybrid/hybrid_encrypt_wrapper.py
@@ -0,0 +1,55 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""HybridEncrypt wrapper."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from typing import Type
+
+from tink.python.core import primitive_set
+from tink.python.core import primitive_wrapper
+from tink.python.hybrid import hybrid_encrypt
+
+
+class _WrappedHybridEncrypt(hybrid_encrypt.HybridEncrypt):
+  """Implements HybridEncrypt for a set of HybridEncrypt primitives."""
+
+  def __init__(self, pset: primitive_set.PrimitiveSet):
+    self._primitive_set = pset
+
+  def encrypt(self, plaintext: bytes, context_info: bytes) -> bytes:
+    primary = self._primitive_set.primary()
+    return primary.identifier + primary.primitive.encrypt(
+        plaintext, context_info)
+
+
+class HybridEncryptWrapper(
+    primitive_wrapper.PrimitiveWrapper[hybrid_encrypt.HybridEncrypt]):
+  """HybridEncryptWrapper is the PrimitiveWrapper for HybridEncrypt.
+
+  The returned primitive works with a keyset (rather than a single key). To
+  encrypt a plaintext, it uses the primary key in the keyset, and prepends to
+  the ciphertext a certain prefix associated with the primary key.
+  """
+
+  def wrap(self,
+           pset: primitive_set.PrimitiveSet) -> hybrid_encrypt.HybridEncrypt:
+    return _WrappedHybridEncrypt(pset)
+
+  def primitive_class(self) -> Type[hybrid_encrypt.HybridEncrypt]:
+    return hybrid_encrypt.HybridEncrypt
diff --git a/python/hybrid/hybrid_key_manager_test.py b/python/hybrid/hybrid_key_manager_test.py
new file mode 100644
index 0000000..add2976
--- /dev/null
+++ b/python/hybrid/hybrid_key_manager_test.py
@@ -0,0 +1,126 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.hybrid_key_manager."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+from tink.proto import common_pb2
+from tink.proto import ecies_aead_hkdf_pb2
+from tink.proto import tink_pb2
+from tink.python import tink_config
+from tink.python.aead import aead_key_templates
+from tink.python.core import tink_error
+from tink.python.hybrid import hybrid_decrypt
+from tink.python.hybrid import hybrid_decrypt_key_manager
+from tink.python.hybrid import hybrid_encrypt
+from tink.python.hybrid import hybrid_encrypt_key_manager
+from tink.python.hybrid import hybrid_key_templates
+
+
+def setUpModule():
+  tink_config.register()
+
+
+def _hybrid_decrypt_key_manager():
+  return hybrid_decrypt_key_manager.from_cc_registry(
+      'type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey')
+
+
+def _hybrid_encrypt_key_manager():
+  return hybrid_encrypt_key_manager.from_cc_registry(
+      'type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey')
+
+
+class HybridKeyManagerTest(absltest.TestCase):
+
+  def test_hybrid_decrypt_primitive_class(self):
+    self.assertEqual(_hybrid_decrypt_key_manager().primitive_class(),
+                     hybrid_decrypt.HybridDecrypt)
+
+  def test_hybrid_encrypt_primitive_class(self):
+    self.assertEqual(_hybrid_encrypt_key_manager().primitive_class(),
+                     hybrid_encrypt.HybridEncrypt)
+
+  def test_hybrid_decrypt_key_type(self):
+    self.assertEqual(
+        _hybrid_decrypt_key_manager().key_type(),
+        'type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey')
+
+  def test_hybrid_encrypt_key_type(self):
+    self.assertEqual(
+        _hybrid_encrypt_key_manager().key_type(),
+        'type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey')
+
+  def test_new_key_data(self):
+    key_manager = _hybrid_decrypt_key_manager()
+    key_data = key_manager.new_key_data(
+        hybrid_key_templates.ECIES_P256_HKDF_HMAC_SHA256_AES128_GCM)
+    self.assertEqual(key_data.type_url, key_manager.key_type())
+    self.assertEqual(key_data.key_material_type,
+                     tink_pb2.KeyData.ASYMMETRIC_PRIVATE)
+    key = ecies_aead_hkdf_pb2.EciesAeadHkdfPrivateKey()
+    key.ParseFromString(key_data.value)
+    self.assertLen(key.key_value, 32)
+    self.assertEqual(key.public_key.params.kem_params.curve_type,
+                     common_pb2.NIST_P256)
+
+  def test_new_key_data_invalid_params_throw_exception(self):
+    with self.assertRaisesRegex(tink_error.TinkError,
+                                'Unsupported elliptic curve'):
+      _hybrid_decrypt_key_manager().new_key_data(
+          hybrid_key_templates.create_ecies_aead_hkdf_key_template(
+              curve_type=100,
+              ec_point_format=common_pb2.UNCOMPRESSED,
+              hash_type=common_pb2.SHA256,
+              dem_key_template=aead_key_templates.AES128_GCM))
+
+  def test_new_key_data_on_public_key_manager_fails(self):
+    key_format = ecies_aead_hkdf_pb2.EciesAeadHkdfKeyFormat()
+    key_template = tink_pb2.KeyTemplate()
+    key_template.type_url = (
+        'type.googleapis.com/google.crypto.tink.EciesAeadHkdfPublicKey')
+    key_template.value = key_format.SerializeToString()
+    key_template.output_prefix_type = tink_pb2.TINK
+    with self.assertRaisesRegex(
+        tink_error.TinkError,
+        'Creating new keys is not supported for this key manager'):
+      key_manager = _hybrid_encrypt_key_manager()
+      key_manager.new_key_data(key_template)
+
+  def test_encrypt_decrypt(self):
+    decrypt_key_manager = _hybrid_decrypt_key_manager()
+    encrypt_key_manager = _hybrid_encrypt_key_manager()
+    key_data = decrypt_key_manager.new_key_data(
+        hybrid_key_templates.ECIES_P256_HKDF_HMAC_SHA256_AES128_GCM)
+    public_key_data = decrypt_key_manager.public_key_data(key_data)
+    hybrid_enc = encrypt_key_manager.primitive(public_key_data)
+    ciphertext = hybrid_enc.encrypt(b'some plaintext', b'some context info')
+    hybrid_dec = decrypt_key_manager.primitive(key_data)
+    self.assertEqual(hybrid_dec.decrypt(ciphertext, b'some context info'),
+                     b'some plaintext')
+
+  def test_decrypt_fails(self):
+    decrypt_key_manager = _hybrid_decrypt_key_manager()
+    key_data = decrypt_key_manager.new_key_data(
+        hybrid_key_templates.ECIES_P256_HKDF_HMAC_SHA256_AES128_GCM)
+    hybrid_dec = decrypt_key_manager.primitive(key_data)
+    with self.assertRaisesRegex(tink_error.TinkError, 'ciphertext too short'):
+      hybrid_dec.decrypt(b'bad ciphertext', b'some context info')
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/hybrid/hybrid_key_templates.py b/python/hybrid/hybrid_key_templates.py
new file mode 100644
index 0000000..11afb19
--- /dev/null
+++ b/python/hybrid/hybrid_key_templates.py
@@ -0,0 +1,65 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Pre-generated KeyTemplate for HybridEncryption.
+
+One can use these templates to generate a new tink_pb2.Keyset with
+tink_pb2.KeysetHandle. To generate a new keyset that contains a single
+tink_pb2.HmacKey, one can do:
+handle = keyset_handle.KeysetHandle(mac_key_templates.HMAC_SHA256_128BITTAG).
+"""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from tink.proto import common_pb2
+from tink.proto import ecies_aead_hkdf_pb2
+from tink.proto import tink_pb2
+from tink.python.aead import aead_key_templates
+
+
+def create_ecies_aead_hkdf_key_template(
+    curve_type: common_pb2.EllipticCurveType,
+    ec_point_format: common_pb2.EcPointFormat,
+    hash_type: common_pb2.HashType,
+    dem_key_template: tink_pb2.KeyTemplate) -> tink_pb2.KeyTemplate:
+  """Creates a HMAC KeyTemplate, and fills in its values."""
+  key_format = ecies_aead_hkdf_pb2.EciesAeadHkdfKeyFormat()
+  key_format.params.kem_params.curve_type = curve_type
+  key_format.params.kem_params.hkdf_hash_type = hash_type
+  key_format.params.dem_params.aead_dem.CopyFrom(dem_key_template)
+  key_format.params.ec_point_format = ec_point_format
+
+  key_template = tink_pb2.KeyTemplate()
+  key_template.type_url = (
+      'type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey')
+  key_template.value = key_format.SerializeToString()
+  key_template.output_prefix_type = tink_pb2.TINK
+  return key_template
+
+
+ECIES_P256_HKDF_HMAC_SHA256_AES128_GCM = create_ecies_aead_hkdf_key_template(
+    curve_type=common_pb2.NIST_P256,
+    ec_point_format=common_pb2.UNCOMPRESSED,
+    hash_type=common_pb2.SHA256,
+    dem_key_template=aead_key_templates.AES128_GCM)
+
+ECIES_P256_HKDF_HMAC_SHA256_AES128_CTR_HMAC_SHA256 = (
+    create_ecies_aead_hkdf_key_template(
+        curve_type=common_pb2.NIST_P256,
+        ec_point_format=common_pb2.UNCOMPRESSED,
+        hash_type=common_pb2.SHA256,
+        dem_key_template=aead_key_templates.AES128_CTR_HMAC_SHA256))
diff --git a/python/hybrid/hybrid_key_templates_test.py b/python/hybrid/hybrid_key_templates_test.py
new file mode 100644
index 0000000..1c98bf5
--- /dev/null
+++ b/python/hybrid/hybrid_key_templates_test.py
@@ -0,0 +1,83 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.hybrid_key_templates."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+from tink.proto import common_pb2
+from tink.proto import ecies_aead_hkdf_pb2
+from tink.proto import tink_pb2
+from tink.python.aead import aead_key_templates
+from tink.python.hybrid import hybrid_key_templates
+
+
+class HybridKeyTemplatesTest(absltest.TestCase):
+
+  def test_ecies_p256_hkdf_hmac_sha256_aes128_gcm(self):
+    template = hybrid_key_templates.ECIES_P256_HKDF_HMAC_SHA256_AES128_GCM
+    self.assertEqual(
+        'type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey',
+        template.type_url)
+    self.assertEqual(tink_pb2.TINK, template.output_prefix_type)
+    key_format = ecies_aead_hkdf_pb2.EciesAeadHkdfKeyFormat()
+    key_format.ParseFromString(template.value)
+    self.assertEqual(key_format.params.kem_params.curve_type,
+                     common_pb2.NIST_P256)
+    self.assertEqual(key_format.params.dem_params.aead_dem,
+                     aead_key_templates.AES128_GCM)
+
+  def test_ecies_p256_hkdf_hmac_sha256_aes128_ctr_hmac_sha256(self):
+    template = (
+        hybrid_key_templates.ECIES_P256_HKDF_HMAC_SHA256_AES128_CTR_HMAC_SHA256)
+    self.assertEqual(
+        'type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey',
+        template.type_url)
+    self.assertEqual(tink_pb2.TINK, template.output_prefix_type)
+    key_format = ecies_aead_hkdf_pb2.EciesAeadHkdfKeyFormat()
+    key_format.ParseFromString(template.value)
+    self.assertEqual(key_format.params.kem_params.curve_type,
+                     common_pb2.NIST_P256)
+    self.assertEqual(key_format.params.dem_params.aead_dem,
+                     aead_key_templates.AES128_CTR_HMAC_SHA256)
+
+  def test_create_aes_eax_key_template(self):
+    # Intentionally using 'weird' or invalid values for parameters,
+    # to test that the function correctly puts them in the resulting template.
+    template = hybrid_key_templates.create_ecies_aead_hkdf_key_template(
+        curve_type=common_pb2.NIST_P521,
+        ec_point_format=common_pb2.DO_NOT_USE_CRUNCHY_UNCOMPRESSED,
+        hash_type=common_pb2.SHA1,
+        dem_key_template=aead_key_templates.AES256_EAX)
+    self.assertEqual(
+        'type.googleapis.com/google.crypto.tink.EciesAeadHkdfPrivateKey',
+        template.type_url)
+    self.assertEqual(tink_pb2.TINK, template.output_prefix_type)
+    key_format = ecies_aead_hkdf_pb2.EciesAeadHkdfKeyFormat()
+    key_format.ParseFromString(template.value)
+    self.assertEqual(key_format.params.kem_params.curve_type,
+                     common_pb2.NIST_P521)
+    self.assertEqual(key_format.params.kem_params.hkdf_hash_type,
+                     common_pb2.SHA1)
+    self.assertEqual(key_format.params.ec_point_format,
+                     common_pb2.DO_NOT_USE_CRUNCHY_UNCOMPRESSED)
+    self.assertEqual(key_format.params.dem_params.aead_dem,
+                     aead_key_templates.AES256_EAX)
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/hybrid/hybrid_wrapper_test.py b/python/hybrid/hybrid_wrapper_test.py
new file mode 100644
index 0000000..1be7b4c
--- /dev/null
+++ b/python/hybrid/hybrid_wrapper_test.py
@@ -0,0 +1,171 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.aead_wrapper."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+from tink.proto import tink_pb2
+from tink.python import core
+from tink.python.hybrid import hybrid_decrypt
+from tink.python.hybrid import hybrid_decrypt_wrapper
+from tink.python.hybrid import hybrid_encrypt
+from tink.python.hybrid import hybrid_encrypt_wrapper
+from tink.python.testing import helper
+
+
+def new_primitives_and_keys(key_id, output_prefix_type):
+  fake_dec_key = helper.fake_key(
+      key_material_type=tink_pb2.KeyData.ASYMMETRIC_PRIVATE,
+      key_id=key_id,
+      output_prefix_type=output_prefix_type)
+  fake_enc_key = helper.fake_key(
+      key_material_type=tink_pb2.KeyData.ASYMMETRIC_PUBLIC,
+      key_id=key_id, output_prefix_type=output_prefix_type)
+  fake_hybrid_decrypt = helper.FakeHybridDecrypt(
+      'fakeHybrid {}'.format(key_id))
+  fake_hybrid_encrypt = helper.FakeHybridEncrypt(
+      'fakeHybrid {}'.format(key_id))
+  return fake_hybrid_decrypt, fake_hybrid_encrypt, fake_dec_key, fake_enc_key
+
+
+class HybridWrapperTest(absltest.TestCase):
+
+  def test_encrypt_decrypt(self):
+    dec, enc, dec_key, enc_key = new_primitives_and_keys(1234, tink_pb2.TINK)
+    dec_pset = core.new_primitive_set(hybrid_decrypt.HybridDecrypt)
+    dec_pset.set_primary(dec_pset.add_primitive(dec, dec_key))
+    wrapped_dec = hybrid_decrypt_wrapper.HybridDecryptWrapper().wrap(dec_pset)
+
+    enc_pset = core.new_primitive_set(hybrid_encrypt.HybridEncrypt)
+    enc_pset.set_primary(enc_pset.add_primitive(enc, enc_key))
+    wrapped_enc = hybrid_encrypt_wrapper.HybridEncryptWrapper().wrap(enc_pset)
+
+    ciphertext = wrapped_enc.encrypt(b'plaintext', b'context_info')
+    self.assertEqual(
+        wrapped_dec.decrypt(ciphertext, b'context_info'), b'plaintext')
+
+  def test_encrypt_decrypt_with_key_rotation(self):
+    dec, enc, dec_key, enc_key = new_primitives_and_keys(1234, tink_pb2.TINK)
+    enc_pset = core.new_primitive_set(hybrid_encrypt.HybridEncrypt)
+    enc_pset.set_primary(enc_pset.add_primitive(enc, enc_key))
+    wrapped_enc = hybrid_encrypt_wrapper.HybridEncryptWrapper().wrap(enc_pset)
+    ciphertext = wrapped_enc.encrypt(b'plaintext', b'context_info')
+
+    new_dec, new_enc, new_dec_key, new_enc_key = new_primitives_and_keys(
+        5678, tink_pb2.TINK)
+    new_enc_pset = core.new_primitive_set(hybrid_encrypt.HybridEncrypt)
+    new_enc_pset.set_primary(new_enc_pset.add_primitive(new_enc, new_enc_key))
+    new_wrapped_enc = hybrid_encrypt_wrapper.HybridEncryptWrapper().wrap(
+        new_enc_pset)
+
+    new_dec, new_enc, new_dec_key, new_enc_key = new_primitives_and_keys(
+        5678, tink_pb2.TINK)
+    new_dec_pset = core.new_primitive_set(hybrid_decrypt.HybridDecrypt)
+    new_dec_pset.add_primitive(dec, dec_key)
+    new_dec_pset.set_primary(new_dec_pset.add_primitive(new_dec, new_dec_key))
+    new_wrapped_dec = hybrid_decrypt_wrapper.HybridDecryptWrapper().wrap(
+        new_dec_pset)
+
+    new_ciphertext = new_wrapped_enc.encrypt(b'new_plaintext',
+                                             b'new_context_info')
+    self.assertEqual(
+        new_wrapped_dec.decrypt(ciphertext, b'context_info'),
+        b'plaintext')
+    self.assertEqual(
+        new_wrapped_dec.decrypt(new_ciphertext, b'new_context_info'),
+        b'new_plaintext')
+
+  def test_encrypt_decrypt_with_key_rotation_from_raw(self):
+    raw_dec, raw_enc, raw_dec_key, raw_enc_key = new_primitives_and_keys(
+        1234, tink_pb2.RAW)
+    old_raw_ciphertext = raw_enc.encrypt(b'old_raw_ciphertext', b'context_info')
+
+    new_dec, new_enc, new_dec_key, new_enc_key = new_primitives_and_keys(
+        5678, tink_pb2.TINK)
+    enc_pset = core.new_primitive_set(hybrid_encrypt.HybridEncrypt)
+    enc_pset.add_primitive(raw_enc, raw_enc_key)
+    enc_pset.set_primary(enc_pset.add_primitive(new_enc, new_enc_key))
+    wrapped_enc = hybrid_encrypt_wrapper.HybridEncryptWrapper().wrap(
+        enc_pset)
+
+    dec_pset = core.new_primitive_set(hybrid_decrypt.HybridDecrypt)
+    dec_pset.add_primitive(raw_dec, raw_dec_key)
+    dec_pset.set_primary(dec_pset.add_primitive(new_dec, new_dec_key))
+    wrapped_dec = hybrid_decrypt_wrapper.HybridDecryptWrapper().wrap(dec_pset)
+
+    new_ciphertext = wrapped_enc.encrypt(b'new_plaintext', b'new_context_info')
+    self.assertEqual(
+        wrapped_dec.decrypt(old_raw_ciphertext, b'context_info'),
+        b'old_raw_ciphertext')
+    self.assertEqual(
+        wrapped_dec.decrypt(new_ciphertext, b'new_context_info'),
+        b'new_plaintext')
+
+  def test_encrypt_decrypt_two_raw_keys(self):
+    dec1, enc1, dec1_key, _ = new_primitives_and_keys(
+        1234, tink_pb2.RAW)
+    raw_ciphertext1 = enc1.encrypt(b'plaintext1', b'context_info1')
+    dec2, enc2, dec2_key, _ = new_primitives_and_keys(
+        1234, tink_pb2.RAW)
+    raw_ciphertext2 = enc2.encrypt(b'plaintext2', b'context_info2')
+
+    dec_pset = core.new_primitive_set(hybrid_decrypt.HybridDecrypt)
+    dec_pset.add_primitive(dec1, dec1_key)
+    dec_pset.set_primary(dec_pset.add_primitive(dec2, dec2_key))
+    wrapped_dec = hybrid_decrypt_wrapper.HybridDecryptWrapper().wrap(dec_pset)
+
+    self.assertEqual(
+        wrapped_dec.decrypt(raw_ciphertext1, b'context_info1'),
+        b'plaintext1')
+    self.assertEqual(
+        wrapped_dec.decrypt(raw_ciphertext2, b'context_info2'),
+        b'plaintext2')
+
+  def test_decrypt_unknown_ciphertext_fails(self):
+    unknown_enc = helper.FakeHybridEncrypt('unknownHybrid')
+    unknown_ciphertext = unknown_enc.encrypt(b'plaintext', b'context_info')
+
+    dec_pset = core.new_primitive_set(hybrid_decrypt.HybridDecrypt)
+
+    dec1, _, dec1_key, _ = new_primitives_and_keys(1234, tink_pb2.RAW)
+    dec2, _, dec2_key, _ = new_primitives_and_keys(5678, tink_pb2.TINK)
+    dec_pset.add_primitive(dec1, dec1_key)
+    dec_pset.set_primary(dec_pset.add_primitive(dec2, dec2_key))
+
+    wrapped_dec = hybrid_decrypt_wrapper.HybridDecryptWrapper().wrap(dec_pset)
+
+    with self.assertRaisesRegex(core.TinkError, 'Decryption failed'):
+      wrapped_dec.decrypt(unknown_ciphertext, b'context_info')
+
+  def test_decrypt_wrong_associated_data_fails(self):
+    dec, enc, dec_key, enc_key = new_primitives_and_keys(1234, tink_pb2.TINK)
+    dec_pset = core.new_primitive_set(hybrid_decrypt.HybridDecrypt)
+    dec_pset.set_primary(dec_pset.add_primitive(dec, dec_key))
+    wrapped_dec = hybrid_decrypt_wrapper.HybridDecryptWrapper().wrap(dec_pset)
+
+    enc_pset = core.new_primitive_set(hybrid_encrypt.HybridEncrypt)
+    enc_pset.set_primary(enc_pset.add_primitive(enc, enc_key))
+    wrapped_enc = hybrid_encrypt_wrapper.HybridEncryptWrapper().wrap(enc_pset)
+
+    ciphertext = wrapped_enc.encrypt(b'plaintext', b'context_info')
+    with self.assertRaisesRegex(core.TinkError, 'Decryption failed'):
+      wrapped_dec.decrypt(ciphertext, b'wrong_context_info')
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/signature/__init__.py b/python/signature/__init__.py
new file mode 100644
index 0000000..75424f7
--- /dev/null
+++ b/python/signature/__init__.py
@@ -0,0 +1,33 @@
+# Copyright 2019 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Signature package."""
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from tink.python.signature import public_key_sign
+from tink.python.signature import public_key_sign_key_manager
+from tink.python.signature import public_key_sign_wrapper
+from tink.python.signature import public_key_verify
+from tink.python.signature import public_key_verify_key_manager
+from tink.python.signature import public_key_verify_wrapper
+from tink.python.signature import signature_key_templates
+
+
+PublicKeySign = public_key_sign.PublicKeySign
+PublicKeyVerify = public_key_verify.PublicKeyVerify
+PublicKeySignWrapper = public_key_sign_wrapper.PublicKeySignWrapper
+PublicKeyVerifyWrapper = public_key_verify_wrapper.PublicKeyVerifyWrapper
diff --git a/python/signature/public_key_sign.py b/python/signature/public_key_sign.py
new file mode 100644
index 0000000..b7ce112
--- /dev/null
+++ b/python/signature/public_key_sign.py
@@ -0,0 +1,47 @@
+# Copyright 2019 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Interface for PublicKeySign."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import abc
+
+
+class PublicKeySign(object):
+  """Interface for public key signing.
+
+  Digital Signatures provide functionality of signing data and verification of
+  the signatures. They are represented by a pair of primitives (interfaces)
+  'PublicKeySign' for signing of data, and 'PublicKeyVerify' for verification
+  of signatures. Implementations of these interfaces are secure against
+  adaptive chosen-message attacks. Signing data ensures the authenticity and
+  the integrity of that data, but not its secrecy.
+  """
+
+  __metaclass__ = abc.ABCMeta
+
+  @abc.abstractmethod
+  def sign(self, data: bytes) -> bytes:
+    """Computes the signature for data.
+
+    Args:
+      data: bytes, the input data.
+    Returns:
+      The signature as bytes.
+    """
+    raise NotImplementedError()
diff --git a/python/signature/public_key_sign_key_manager.py b/python/signature/public_key_sign_key_manager.py
new file mode 100644
index 0000000..befd621
--- /dev/null
+++ b/python/signature/public_key_sign_key_manager.py
@@ -0,0 +1,47 @@
+# Copyright 2019 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Python wrapper of the CLIF-wrapped C++ Public Key Signature key manager."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from typing import Text
+
+from tink.cc.python import public_key_sign as cc_public_key_sign
+from tink.python.cc.clif import cc_key_manager
+from tink.python.core import key_manager
+from tink.python.core import tink_error
+from tink.python.signature import public_key_sign
+
+
+class _PublicKeySignCcToPyWrapper(public_key_sign.PublicKeySign):
+  """Transforms cliffed C++ PublicKeySign into a Python primitive."""
+
+  def __init__(self, cc_primitive: cc_public_key_sign.PublicKeySign):
+    self._public_key_sign = cc_primitive
+
+  @tink_error.use_tink_errors
+  def sign(self, data: bytes) -> bytes:
+    return self._public_key_sign.sign(data)
+
+
+def from_cc_registry(
+    type_url: Text
+) -> key_manager.PrivateKeyManager[public_key_sign.PublicKeySign]:
+  return key_manager.PrivateKeyManagerCcToPyWrapper(
+      cc_key_manager.PublicKeySignKeyManager.from_cc_registry(type_url),
+      public_key_sign.PublicKeySign, _PublicKeySignCcToPyWrapper)
diff --git a/python/signature/public_key_sign_key_manager_test.py b/python/signature/public_key_sign_key_manager_test.py
new file mode 100644
index 0000000..896df2f
--- /dev/null
+++ b/python/signature/public_key_sign_key_manager_test.py
@@ -0,0 +1,100 @@
+# Copyright 2019 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.public_key_sign_key_manager."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+
+from tink.proto import common_pb2
+from tink.proto import ecdsa_pb2
+from tink.proto import tink_pb2
+from tink.python import tink_config
+from tink.python.signature import public_key_sign
+from tink.python.signature import public_key_sign_key_manager
+from tink.python.signature import public_key_verify_key_manager
+
+
+def setUpModule():
+  tink_config.register()
+
+
+def new_ecdsa_key_template(hash_type, curve_type, encoding):
+  key_format = ecdsa_pb2.EcdsaKeyFormat()
+  key_format.params.hash_type = hash_type
+  key_format.params.curve = curve_type
+  key_format.params.encoding = encoding
+  key_template = tink_pb2.KeyTemplate()
+  key_template.type_url = (
+      'type.googleapis.com/google.crypto.tink.EcdsaPrivateKey')
+  key_template.value = key_format.SerializeToString()
+  return key_template
+
+
+class PublicKeySignKeyManagerTest(absltest.TestCase):
+
+  def setUp(self):
+    super(PublicKeySignKeyManagerTest, self).setUp()
+    self.key_manager = public_key_sign_key_manager.from_cc_registry(
+        'type.googleapis.com/google.crypto.tink.EcdsaPrivateKey')
+    self.key_manager_verify = public_key_verify_key_manager.from_cc_registry(
+        'type.googleapis.com/google.crypto.tink.EcdsaPublicKey')
+
+  def test_primitive_class(self):
+    self.assertEqual(self.key_manager.primitive_class(),
+                     public_key_sign.PublicKeySign)
+
+  def test_key_type(self):
+    self.assertEqual(self.key_manager.key_type(),
+                     'type.googleapis.com/google.crypto.tink.EcdsaPrivateKey')
+
+  def test_new_key_data(self):
+    key_template = new_ecdsa_key_template(common_pb2.SHA256,
+                                          common_pb2.NIST_P256, ecdsa_pb2.DER)
+    key_data = self.key_manager.new_key_data(key_template)
+    self.assertEqual(key_data.type_url, self.key_manager.key_type())
+    key = ecdsa_pb2.EcdsaPrivateKey()
+    key.ParseFromString(key_data.value)
+    public_key = key.public_key
+    self.assertEqual(key.version, 0)
+    self.assertEqual(public_key.version, 0)
+    self.assertEqual(public_key.params.hash_type, common_pb2.SHA256)
+    self.assertEqual(public_key.params.curve, common_pb2.NIST_P256)
+    self.assertEqual(public_key.params.encoding, ecdsa_pb2.DER)
+    self.assertLen(key.key_value, 32)
+
+  def test_signature_success(self):
+
+    priv_key = self.key_manager.new_key_data(
+        new_ecdsa_key_template(common_pb2.SHA256, common_pb2.NIST_P256,
+                               ecdsa_pb2.DER))
+    pub_key = self.key_manager.public_key_data(priv_key)
+
+    verifier = self.key_manager_verify.primitive(pub_key)
+    signer = self.key_manager.primitive(priv_key)
+
+    data = b'data'
+    signature = signer.sign(data)
+
+    # Starts with a DER sequence
+    self.assertEqual(bytearray(signature)[0], 0x30)
+
+    verifier.verify(signature, data)
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/signature/public_key_sign_wrapper.py b/python/signature/public_key_sign_wrapper.py
new file mode 100644
index 0000000..b90d802
--- /dev/null
+++ b/python/signature/public_key_sign_wrapper.py
@@ -0,0 +1,73 @@
+# Copyright 2019 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Public Key Sign wrapper."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from typing import Type
+
+from tink.proto import tink_pb2
+from tink.python.core import crypto_format
+from tink.python.core import primitive_set
+from tink.python.core import primitive_wrapper
+from tink.python.core import tink_error
+from tink.python.signature import public_key_sign
+
+
+class _WrappedPublicKeySign(public_key_sign.PublicKeySign):
+  """Implements PublicKeySign for a set of PublicKeySign primitives."""
+
+  def __init__(self, primitives_set: primitive_set.PrimitiveSet):
+    self._primitive_set = primitives_set
+
+  def sign(self, data: bytes) -> bytes:
+    """Computes the signature for data using the primary primitive.
+
+    Args:
+      data: The input data.
+
+    Returns:
+      The signature.
+    """
+    primary = self._primitive_set.primary()
+
+    if not primary:
+      raise tink_error.TinkError('primary primitive not set')
+
+    sign_data = data
+    if primary.output_prefix_type == tink_pb2.LEGACY:
+      sign_data = sign_data + crypto_format.LEGACY_START_BYTE
+
+    return primary.identifier + primary.primitive.sign(sign_data)
+
+
+class PublicKeySignWrapper(
+    primitive_wrapper.PrimitiveWrapper[public_key_sign.PublicKeySign]):
+  """A PrimitiveWrapper for the PublicKeySign primitive.
+
+  The returned primitive works with a keyset (rather than a single key). To sign
+  a message, it uses the primary key in the keyset, and prepends to the
+  signature a certain prefix associated with the primary key.
+  """
+
+  def wrap(self, primitives_set: primitive_set.PrimitiveSet
+          ) -> _WrappedPublicKeySign:
+    return _WrappedPublicKeySign(primitives_set)
+
+  def primitive_class(self) -> Type[public_key_sign.PublicKeySign]:
+    return public_key_sign.PublicKeySign
diff --git a/python/signature/public_key_sign_wrapper_test.py b/python/signature/public_key_sign_wrapper_test.py
new file mode 100644
index 0000000..34f2e56
--- /dev/null
+++ b/python/signature/public_key_sign_wrapper_test.py
@@ -0,0 +1,79 @@
+# Copyright 2019 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.public_key_sign_wrapper."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+from absl.testing import parameterized
+
+from tink.proto import tink_pb2
+from tink.python.core import primitive_set
+from tink.python.core import tink_error
+from tink.python.signature import public_key_sign
+from tink.python.signature import public_key_sign_wrapper
+from tink.python.signature import public_key_verify
+from tink.python.signature import public_key_verify_wrapper
+from tink.python.testing import helper
+
+
+def new_primitive_key_pair(key_id, output_prefix_type):
+  fake_key = helper.fake_key(
+      key_id=key_id,
+      key_material_type=tink_pb2.KeyData.ASYMMETRIC_PRIVATE,
+      output_prefix_type=output_prefix_type)
+  fake_sign = helper.FakePublicKeySign('fakePublicKeySign {}'.format(key_id))
+  return fake_sign, fake_key,
+
+
+def to_verify_key_pair(key):
+  fake_verify = helper.FakePublicKeyVerify('fakePublicKeySign {}'.format(
+      key.key_id))
+  return fake_verify, key,
+
+
+class PublicKeySignWrapperTest(parameterized.TestCase):
+
+  @parameterized.named_parameters(('tink', tink_pb2.TINK),
+                                  ('legacy', tink_pb2.LEGACY))
+  def test_signature(self, output_prefix_type):
+    pair0 = new_primitive_key_pair(1234, output_prefix_type)
+    pair1 = new_primitive_key_pair(5678, output_prefix_type)
+    pset = primitive_set.new_primitive_set(public_key_sign.PublicKeySign)
+    pset_verify = primitive_set.new_primitive_set(
+        public_key_verify.PublicKeyVerify)
+
+    pset.add_primitive(*pair0)
+    pset.set_primary(pset.add_primitive(*pair1))
+
+    pset_verify.add_primitive(*to_verify_key_pair(pair0[1]))
+    entry = pset_verify.add_primitive(*to_verify_key_pair(pair1[1]))
+    pset_verify.set_primary(entry)
+
+    wrapped_pk_sign = public_key_sign_wrapper.PublicKeySignWrapper().wrap(pset)
+    wrapped_pk_verify = public_key_verify_wrapper.PublicKeyVerifyWrapper().wrap(
+        pset_verify)
+    signature = wrapped_pk_sign.sign(b'data')
+
+    wrapped_pk_verify.verify(signature, b'data')
+
+    with self.assertRaisesRegex(tink_error.TinkError, 'invalid signature'):
+      wrapped_pk_verify.verify(signature, b'invalid')
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/signature/public_key_verify.py b/python/signature/public_key_verify.py
new file mode 100644
index 0000000..440b292
--- /dev/null
+++ b/python/signature/public_key_verify.py
@@ -0,0 +1,49 @@
+# Copyright 2019 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Interface for PublicKeyVerify."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import abc
+
+
+class PublicKeyVerify(object):
+  """Interface for public key verifying.
+
+  Digital Signatures provide functionality of signing data and verification of
+  the signatures. They are represented by a pair of primitives (interfaces)
+  'PublicKeySign' for signing of data, and 'PublicKeyVerify' for verification
+  of signatures. Implementations of these interfaces are secure against
+  adaptive chosen-message attacks. Signing data ensures the authenticity and
+  the integrity of that data, but not its secrecy.
+  """
+
+  __metaclass__ = abc.ABCMeta
+
+  @abc.abstractmethod
+  def verify(self, signature: bytes, data: bytes) -> bytes:
+    """Verifies that signature is a digital signature for data.
+
+    Args:
+      signature: The signature bytes to be checked.
+      data: The data bytes to be checked.
+
+    Raises:
+      tink.TinkError if the verification fails.
+    """
+    raise NotImplementedError()
diff --git a/python/signature/public_key_verify_key_manager.py b/python/signature/public_key_verify_key_manager.py
new file mode 100644
index 0000000..39e100e
--- /dev/null
+++ b/python/signature/public_key_verify_key_manager.py
@@ -0,0 +1,47 @@
+# Copyright 2019 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Python wrapper of the CLIF-wrapped C++ Public Key Verify key manager."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from typing import Text
+
+from tink.cc.python import public_key_verify as cc_public_key_verify
+from tink.python.cc.clif import cc_key_manager
+from tink.python.core import key_manager
+from tink.python.core import tink_error
+from tink.python.signature import public_key_verify
+
+
+class _PublicKeyVerifyCcToPyWrapper(public_key_verify.PublicKeyVerify):
+  """Transforms cliffed C++ PublicKeyVerify into a Python primitive."""
+
+  def __init__(self, cc_primitive: cc_public_key_verify.PublicKeyVerify):
+    self._public_key_verify = cc_primitive
+
+  @tink_error.use_tink_errors
+  def verify(self, signature: bytes, data: bytes) -> None:
+    self._public_key_verify.verify(signature, data)
+
+
+def from_cc_registry(
+    type_url: Text
+) -> key_manager.KeyManager[public_key_verify.PublicKeyVerify]:
+  return key_manager.KeyManagerCcToPyWrapper(
+      cc_key_manager.PublicKeyVerifyKeyManager.from_cc_registry(type_url),
+      public_key_verify.PublicKeyVerify, _PublicKeyVerifyCcToPyWrapper)
diff --git a/python/signature/public_key_verify_key_manager_test.py b/python/signature/public_key_verify_key_manager_test.py
new file mode 100644
index 0000000..0d936d8
--- /dev/null
+++ b/python/signature/public_key_verify_key_manager_test.py
@@ -0,0 +1,104 @@
+# Copyright 2019 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.public_key_verify_key_manager."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+
+from tink.proto import common_pb2
+from tink.proto import ecdsa_pb2
+from tink.proto import tink_pb2
+from tink.python import tink_config
+from tink.python.core import tink_error
+from tink.python.signature import public_key_sign_key_manager
+from tink.python.signature import public_key_verify_key_manager
+
+
+def setUpModule():
+  tink_config.register()
+
+
+def new_ecdsa_key_template(hash_type, curve_type, encoding, public=True):
+  params = ecdsa_pb2.EcdsaParams(
+      hash_type=hash_type, curve=curve_type, encoding=encoding)
+  key_format = ecdsa_pb2.EcdsaKeyFormat(params=params)
+  key_template = tink_pb2.KeyTemplate()
+  if public:
+    append = 'EcdsaPublicKey'
+  else:
+    append = 'EcdsaPrivateKey'
+  key_template.type_url = 'type.googleapis.com/google.crypto.tink.' + append
+  key_template.value = key_format.SerializeToString()
+
+  return key_template
+
+
+class PublicKeyVerifyKeyManagerTest(absltest.TestCase):
+
+  def setUp(self):
+    super(PublicKeyVerifyKeyManagerTest, self).setUp()
+    self.key_manager = public_key_verify_key_manager.from_cc_registry(
+        'type.googleapis.com/google.crypto.tink.EcdsaPublicKey')
+    self.key_manager_sign = public_key_sign_key_manager.from_cc_registry(
+        'type.googleapis.com/google.crypto.tink.EcdsaPrivateKey')
+
+  def test_key_type(self):
+    self.assertEqual(self.key_manager.key_type(),
+                     'type.googleapis.com/google.crypto.tink.EcdsaPublicKey')
+
+  def test_new_key_data(self):
+    key_template = new_ecdsa_key_template(
+        common_pb2.SHA256, common_pb2.NIST_P256, ecdsa_pb2.DER, True)
+    with self.assertRaisesRegex(tink_error.TinkError, 'not supported'):
+      self.key_manager.new_key_data(key_template)
+
+  def test_verify_success(self):
+    key_template = new_ecdsa_key_template(
+        common_pb2.SHA256, common_pb2.NIST_P256, ecdsa_pb2.DER, False)
+    priv_key = self.key_manager_sign.new_key_data(key_template)
+    pub_key = self.key_manager_sign.public_key_data(priv_key)
+
+    signer = self.key_manager_sign.primitive(priv_key)
+    verifier = self.key_manager.primitive(pub_key)
+
+    data = b'data'
+    signature = signer.sign(data)
+
+    verifier.verify(signature, data)
+
+  def test_verify_wrong(self):
+    key_template = new_ecdsa_key_template(
+        common_pb2.SHA256, common_pb2.NIST_P256, ecdsa_pb2.DER, False)
+    priv_key = self.key_manager_sign.new_key_data(key_template)
+    pub_key = self.key_manager_sign.public_key_data(priv_key)
+
+    signer = self.key_manager_sign.primitive(priv_key)
+    verifier = self.key_manager.primitive(pub_key)
+
+    data = b'data'
+    signature = signer.sign(data)
+
+    with self.assertRaisesRegex(tink_error.TinkError, 'Signature is not valid'):
+      verifier.verify(signature, 'wrongdata')
+
+    with self.assertRaisesRegex(tink_error.TinkError, 'Signature is not valid'):
+      verifier.verify('wrongsignature', data)
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/signature/public_key_verify_wrapper.py b/python/signature/public_key_verify_wrapper.py
new file mode 100644
index 0000000..f384e29
--- /dev/null
+++ b/python/signature/public_key_verify_wrapper.py
@@ -0,0 +1,102 @@
+# Copyright 2019 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Public Key Verify wrapper."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from absl import logging
+from typing import Type
+
+from tink.proto import tink_pb2
+from tink.python.core import crypto_format
+from tink.python.core import primitive_set
+from tink.python.core import primitive_wrapper
+from tink.python.core import tink_error
+from tink.python.signature import public_key_verify
+
+
+class _WrappedPublicKeyVerify(public_key_verify.PublicKeyVerify):
+  """Implements PublicKeyVerify for a set of PublicKeyVerify primitives."""
+
+  def __init__(self, primitives_set: primitive_set.PrimitiveSet):
+    self._primitive_set = primitives_set
+
+  def verify(self, signature: bytes, data: bytes):
+    """Verifies that signature is a digital signature for data.
+
+    Args:
+      signature: The signature bytes to be checked.
+      data: The data bytes to be checked.
+
+    Raises:
+      tink_error.TinkError if the verification fails.
+    """
+    if len(signature) <= crypto_format.NON_RAW_PREFIX_SIZE:
+      # This also rejects raw signatures with size of 4 bytes or fewer.
+      # We're not aware of any schemes that output signatures that small.
+      raise tink_error.TinkError('signature too short')
+
+    key_id = signature[:crypto_format.NON_RAW_PREFIX_SIZE]
+    raw_sig = signature[crypto_format.NON_RAW_PREFIX_SIZE:]
+
+    for entry in self._primitive_set.primitive_from_identifier(key_id):
+      try:
+        if entry.output_prefix_type == tink_pb2.LEGACY:
+          entry.primitive.verify(raw_sig,
+                                 data + crypto_format.LEGACY_START_BYTE)
+        else:
+          entry.primitive.verify(raw_sig, data)
+        # Signature is valid, we can return
+        return
+      except tink_error.TinkError as err:
+        logging.info('signature prefix matches a key, but cannot verify: %s',
+                     err)
+
+    # No matching key succeeded with verification, try all RAW keys
+    for entry in self._primitive_set.raw_primitives():
+      try:
+        entry.primitive.verify(signature, data)
+        # Signature is valid, we can return
+        return
+      except tink_error.TinkError:
+        pass
+
+    raise tink_error.TinkError('invalid signature')
+
+
+class PublicKeyVerifyWrapper(
+    primitive_wrapper.PrimitiveWrapper[public_key_verify.PublicKeyVerify]):
+  """WrappedPublicKeyVerify is the PrimitiveWrapper for PublicKeyVerify.
+
+  The returned primitive works with a keyset (rather than a single key). To sign
+  a message, it uses the primary key in the keyset, and prepends to the
+  signature a certain prefix associated with the primary key.
+
+  The returned primitive works with a keyset (rather than a single key). To
+  verify a signature, the primitive uses the prefix of the signature to
+  efficiently select the right key in the set. If there is no key associated
+  with the prefix or if the keys associated with the prefix do not work, the
+  primitive tries all keys with tink_pb2.OutputPrefixType = tink_pb2.RAW.
+  """
+
+  def wrap(self, primitives_set: primitive_set.PrimitiveSet
+          ) -> _WrappedPublicKeyVerify:
+    return _WrappedPublicKeyVerify(primitives_set)
+
+  def primitive_class(self) -> Type[public_key_verify.PublicKeyVerify]:
+    return public_key_verify.PublicKeyVerify
diff --git a/python/signature/public_key_verify_wrapper_test.py b/python/signature/public_key_verify_wrapper_test.py
new file mode 100644
index 0000000..c68f594
--- /dev/null
+++ b/python/signature/public_key_verify_wrapper_test.py
@@ -0,0 +1,70 @@
+# Copyright 2019 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.public_key_verify_wrapper."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+
+from tink.proto import tink_pb2
+from tink.python.core import primitive_set
+from tink.python.signature import public_key_sign
+from tink.python.signature import public_key_sign_wrapper
+from tink.python.signature import public_key_verify
+from tink.python.signature import public_key_verify_wrapper
+from tink.python.testing import helper
+
+
+def new_primitive_key_pair(key_id, output_prefix_type):
+  fake_key = helper.fake_key(
+      key_id=key_id,
+      key_material_type=tink_pb2.KeyData.ASYMMETRIC_PRIVATE,
+      output_prefix_type=output_prefix_type)
+  fake_sign = helper.FakePublicKeyVerify('fakePublicKeySign {}'.format(key_id))
+  return fake_sign, fake_key,
+
+
+class PublicKeyVerifyWrapperTest(absltest.TestCase):
+
+  def test_verify_signature(self):
+    pair0 = new_primitive_key_pair(1234, tink_pb2.RAW)
+    pair1 = new_primitive_key_pair(5678, tink_pb2.TINK)
+    pair2 = new_primitive_key_pair(9012, tink_pb2.LEGACY)
+    pset = primitive_set.new_primitive_set(public_key_verify.PublicKeyVerify)
+
+    pset.add_primitive(*pair0)
+    pset.add_primitive(*pair1)
+    pset.set_primary(pset.add_primitive(*pair2))
+
+    # Check all keys work
+    for unused_primitive, key in (pair0, pair1, pair2):
+      pset_sign = primitive_set.new_primitive_set(public_key_sign.PublicKeySign)
+      pset_sign.set_primary(
+          pset_sign.add_primitive(
+              helper.FakePublicKeySign('fakePublicKeySign {}'.format(
+                  key.key_id)), key))
+
+      wrapped_pk_verify = public_key_verify_wrapper.PublicKeyVerifyWrapper(
+      ).wrap(pset)
+      wrapped_pk_sign = public_key_sign_wrapper.PublicKeySignWrapper().wrap(
+          pset_sign)
+
+      wrapped_pk_verify.verify(wrapped_pk_sign.sign(b'data'), b'data')
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/signature/signature_key_templates.py b/python/signature/signature_key_templates.py
new file mode 100644
index 0000000..9ddd747
--- /dev/null
+++ b/python/signature/signature_key_templates.py
@@ -0,0 +1,141 @@
+# Copyright 2019 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Pre-generated KeyTemplate for PublicKeySign and PublicKeyVerify.
+
+One can use these templates to generate a new tink_pb2.Keyset with
+tink_pb2.KeysetHandle. To generate a new keyset that contains a single
+EcdsaPrivateKey, one can do:
+
+handle = keyset_handle.KeysetHandle(signature_key_templates.ECDSA_P256);
+"""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from tink.proto import common_pb2
+from tink.proto import ecdsa_pb2
+from tink.proto import rsa_ssa_pkcs1_pb2
+from tink.proto import rsa_ssa_pss_pb2
+from tink.proto import tink_pb2
+
+_prefix = 'type.googleapis.com/google.crypto.tink.'
+_ECDSA_KEY_TYPE_URL = _prefix + 'EcdsaPrivateKey'
+_ED25519_KEY_TYPE_URL = _prefix + 'Ed25519PrivateKey'
+_RSA_PKCS1_KEY_TYPE_URL = _prefix + 'RsaSsaPkcs1PrivateKey'
+_RSA_PSS_KEY_TYPE_URL = _prefix + 'RsaSsaPssPrivateKey'
+_RSA_F4 = 65537
+
+
+def _num_to_bytes(n: int) -> bytes:
+  """Converts a number to bytes."""
+  if n < 0:
+    raise OverflowError("number can't be negative")
+
+  if n == 0:
+    return b'\x00'
+
+  octets = bytearray()
+  while n:
+    octets.append(n % 256)
+    n //= 256
+
+  return bytes(octets[::-1])
+
+
+def create_ecdsa_key_template(hash_type: common_pb2.HashType,
+                              curve: common_pb2.EllipticCurveType,
+                              encoding: ecdsa_pb2.EcdsaSignatureEncoding
+                             ) -> tink_pb2.KeyTemplate:
+  """Creates a KeyTemplate containing an EcdsaKeyFormat."""
+  params = ecdsa_pb2.EcdsaParams(
+      hash_type=hash_type, curve=curve, encoding=encoding)
+  key_format = ecdsa_pb2.EcdsaKeyFormat(params=params)
+  key_template = tink_pb2.KeyTemplate(
+      value=key_format.SerializeToString(),
+      type_url=_ECDSA_KEY_TYPE_URL,
+      output_prefix_type=tink_pb2.TINK)
+
+  return key_template
+
+
+def create_rsa_ssa_pkcs1_key_template(hash_type: common_pb2.HashType,
+                                      modulus_size: int, public_exponent: int
+                                     ) -> tink_pb2.KeyTemplate:
+  """Creates a KeyTemplate containing an RsaSsaPkcs1KeyFormat."""
+
+  params = rsa_ssa_pkcs1_pb2.RsaSsaPkcs1Params(hash_type=hash_type)
+  key_format = rsa_ssa_pkcs1_pb2.RsaSsaPkcs1KeyFormat(
+      params=params,
+      modulus_size_in_bits=modulus_size,
+      public_exponent=_num_to_bytes(public_exponent))
+  key_template = tink_pb2.KeyTemplate(
+      value=key_format.SerializeToString(),
+      type_url=_RSA_PKCS1_KEY_TYPE_URL,
+      output_prefix_type=tink_pb2.TINK)
+
+  return key_template
+
+
+def create_rsa_ssa_pss_key_template(sig_hash: common_pb2.HashType,
+                                    mgf1_hash: common_pb2.HashType,
+                                    salt_length: int, modulus_size: int,
+                                    public_exponent: int
+                                   ) -> tink_pb2.KeyTemplate:
+  """Creates a KeyTemplate containing an RsaSsaPssKeyFormat."""
+  params = rsa_ssa_pss_pb2.RsaSsaPssParams(
+      sig_hash=sig_hash, mgf1_hash=mgf1_hash, salt_length=salt_length)
+  key_format = rsa_ssa_pss_pb2.RsaSsaPssKeyFormat(
+      params=params,
+      modulus_size_in_bits=modulus_size,
+      public_exponent=_num_to_bytes(public_exponent))
+  key_template = tink_pb2.KeyTemplate(
+      value=key_format.SerializeToString(),
+      type_url=_RSA_PSS_KEY_TYPE_URL,
+      output_prefix_type=tink_pb2.TINK)
+
+  return key_template
+
+
+ECDSA_P256 = create_ecdsa_key_template(common_pb2.SHA256, common_pb2.NIST_P256,
+                                       ecdsa_pb2.DER)
+ECDSA_P384 = create_ecdsa_key_template(common_pb2.SHA512, common_pb2.NIST_P384,
+                                       ecdsa_pb2.DER)
+ECDSA_P521 = create_ecdsa_key_template(common_pb2.SHA512, common_pb2.NIST_P521,
+                                       ecdsa_pb2.DER)
+
+ECDSA_P256_IEEE_P1363 = create_ecdsa_key_template(common_pb2.SHA256,
+                                                  common_pb2.NIST_P256,
+                                                  ecdsa_pb2.IEEE_P1363)
+ECDSA_P384_IEEE_P1363 = create_ecdsa_key_template(common_pb2.SHA512,
+                                                  common_pb2.NIST_P384,
+                                                  ecdsa_pb2.IEEE_P1363)
+ECDSA_P521_IEEE_P1363 = create_ecdsa_key_template(common_pb2.SHA512,
+                                                  common_pb2.NIST_P521,
+                                                  ecdsa_pb2.IEEE_P1363)
+
+ED25519 = tink_pb2.KeyTemplate(
+    type_url=_ED25519_KEY_TYPE_URL, output_prefix_type=tink_pb2.TINK)
+
+RSA_SSA_PKCS1_3072_SHA256_F4 = create_rsa_ssa_pkcs1_key_template(
+    common_pb2.SHA256, 3072, _RSA_F4)
+RSA_SSA_PKCS1_4096_SHA512_F4 = create_rsa_ssa_pkcs1_key_template(
+    common_pb2.SHA512, 4096, _RSA_F4)
+
+RSA_SSA_PSS_3072_SHA256_SHA256_32_F4 = create_rsa_ssa_pss_key_template(
+    common_pb2.SHA256, common_pb2.SHA256, 32, 3072, _RSA_F4)
+RSA_SSA_PSS_4096_SHA512_SHA512_64_F4 = create_rsa_ssa_pss_key_template(
+    common_pb2.SHA512, common_pb2.SHA512, 64, 4096, _RSA_F4)
diff --git a/python/signature/signature_key_templates_test.py b/python/signature/signature_key_templates_test.py
new file mode 100644
index 0000000..e560668
--- /dev/null
+++ b/python/signature/signature_key_templates_test.py
@@ -0,0 +1,204 @@
+# Copyright 2019 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.signature_key_templates."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+from absl.testing import parameterized
+
+from tink.proto import common_pb2
+from tink.proto import ecdsa_pb2
+from tink.proto import rsa_ssa_pkcs1_pb2
+from tink.proto import rsa_ssa_pss_pb2
+from tink.proto import tink_pb2
+from tink.python import tink_config
+from tink.python.signature import public_key_sign_key_manager
+from tink.python.signature import signature_key_templates
+
+
+ECDSA_DER_PARAMS_P256 = [
+    signature_key_templates.ECDSA_P256, common_pb2.SHA256, common_pb2.NIST_P256
+]
+ECDSA_DER_PARAMS_P384 = [
+    signature_key_templates.ECDSA_P384, common_pb2.SHA512, common_pb2.NIST_P384
+]
+ECDSA_DER_PARAMS_P521 = [
+    signature_key_templates.ECDSA_P521, common_pb2.SHA512, common_pb2.NIST_P521
+]
+
+ECDSA_IEEE_PARAMS_P256 = [
+    signature_key_templates.ECDSA_P256_IEEE_P1363, common_pb2.SHA256,
+    common_pb2.NIST_P256
+]
+ECDSA_IEEE_PARAMS_P384 = [
+    signature_key_templates.ECDSA_P384_IEEE_P1363, common_pb2.SHA512,
+    common_pb2.NIST_P384
+]
+ECDSA_IEEE_PARAMS_P521 = [
+    signature_key_templates.ECDSA_P521_IEEE_P1363, common_pb2.SHA512,
+    common_pb2.NIST_P521
+]
+
+RSA_PKCS1_PARAMS_3072 = [
+    signature_key_templates.RSA_SSA_PKCS1_3072_SHA256_F4, common_pb2.SHA256,
+    3072, 65537
+]
+RSA_PKCS1_PARAMS_4096 = [
+    signature_key_templates.RSA_SSA_PKCS1_4096_SHA512_F4, common_pb2.SHA512,
+    4096, 65537
+]
+
+RSA_PSS_PARAMS_3072 = [
+    signature_key_templates.RSA_SSA_PSS_3072_SHA256_SHA256_32_F4,
+    common_pb2.SHA256, 3072, 65537
+]
+RSA_PSS_PARAMS_4096 = [
+    signature_key_templates.RSA_SSA_PSS_4096_SHA512_SHA512_64_F4,
+    common_pb2.SHA512, 4096, 65537
+]
+
+
+def bytes_to_num(data):
+  res = 0
+
+  for b in bytearray(data):
+    res <<= 8
+    res |= b
+
+  return res
+
+
+def setUpModule():
+  tink_config.register()
+
+
+class SignatureKeyTemplatesTest(parameterized.TestCase):
+
+  def test_bytes_to_num(self):
+    for i in range(100000):
+      res = bytes_to_num(signature_key_templates._num_to_bytes(i))
+      self.assertEqual(res, i)
+
+  @parameterized.named_parameters(('0', 0, b'\x00'), ('256', 256, b'\x01\x00'),
+                                  ('65537', 65537, b'\x01\x00\x01'))
+  def test_num_to_bytes(self, number, expected):
+    self.assertEqual(signature_key_templates._num_to_bytes(number), expected)
+
+    with self.assertRaises(OverflowError):
+      signature_key_templates._num_to_bytes(-1)
+
+  @parameterized.named_parameters(
+      ['ecdsa_p256'] + ECDSA_DER_PARAMS_P256,
+      ['ecdsa_p384'] + ECDSA_DER_PARAMS_P384,
+      ['ecdsa_p521'] + ECDSA_DER_PARAMS_P521,
+  )
+  def test_ecdsa_der(self, key_template, hash_type, curve):
+    self.assertEqual(key_template.type_url,
+                     'type.googleapis.com/google.crypto.tink.EcdsaPrivateKey')
+    self.assertEqual(key_template.output_prefix_type, tink_pb2.TINK)
+
+    key_format = ecdsa_pb2.EcdsaKeyFormat()
+    key_format.ParseFromString(key_template.value)
+    self.assertEqual(key_format.params.hash_type, hash_type)
+    self.assertEqual(key_format.params.curve, curve)
+    self.assertEqual(key_format.params.encoding, ecdsa_pb2.DER)
+
+    # Check that the template works with the key manager
+    key_manager = public_key_sign_key_manager.from_cc_registry(
+        key_template.type_url)
+    key_manager.new_key_data(key_template)
+
+  @parameterized.named_parameters(
+      ['ecdsa_p256'] + ECDSA_IEEE_PARAMS_P256,
+      ['ecdsa_p384'] + ECDSA_IEEE_PARAMS_P384,
+      ['ecdsa_p521'] + ECDSA_IEEE_PARAMS_P521,
+  )
+  def test_ecdsa_ieee(self, key_template, hash_type, curve):
+    self.assertEqual(key_template.type_url,
+                     'type.googleapis.com/google.crypto.tink.EcdsaPrivateKey')
+    self.assertEqual(key_template.output_prefix_type, tink_pb2.TINK)
+
+    key_format = ecdsa_pb2.EcdsaKeyFormat()
+    key_format.ParseFromString(key_template.value)
+    self.assertEqual(key_format.params.hash_type, hash_type)
+    self.assertEqual(key_format.params.curve, curve)
+    self.assertEqual(key_format.params.encoding, ecdsa_pb2.IEEE_P1363)
+
+    # Check that the template works with the key manager
+    key_manager = public_key_sign_key_manager.from_cc_registry(
+        key_template.type_url)
+    key_manager.new_key_data(key_template)
+
+  def test_ed25519(self):
+    key_template = signature_key_templates.ED25519
+    self.assertEqual(
+        key_template.type_url,
+        'type.googleapis.com/google.crypto.tink.Ed25519PrivateKey')
+    self.assertEqual(key_template.output_prefix_type, tink_pb2.TINK)
+
+    # Check that the template works with the key manager
+    key_manager = public_key_sign_key_manager.from_cc_registry(
+        key_template.type_url)
+    key_manager.new_key_data(key_template)
+
+  @parameterized.named_parameters(
+      ['rsa_pkcs1_3072'] + RSA_PKCS1_PARAMS_3072,
+      ['rsa_pkcs1_4096'] + RSA_PKCS1_PARAMS_4096,
+  )
+  def test_rsa_pkcs1(self, key_template, hash_algo, modulus_size, exponent):
+    self.assertEqual(
+        key_template.type_url,
+        'type.googleapis.com/google.crypto.tink.RsaSsaPkcs1PrivateKey')
+    self.assertEqual(key_template.output_prefix_type, tink_pb2.TINK)
+
+    key_format = rsa_ssa_pkcs1_pb2.RsaSsaPkcs1KeyFormat()
+    key_format.ParseFromString(key_template.value)
+    self.assertEqual(key_format.modulus_size_in_bits, modulus_size)
+    self.assertEqual(key_format.params.hash_type, hash_algo)
+    self.assertEqual(bytes_to_num(key_format.public_exponent), exponent)
+
+    # Check that the template works with the key manager
+    key_manager = public_key_sign_key_manager.from_cc_registry(
+        key_template.type_url)
+    key_manager.new_key_data(key_template)
+
+  @parameterized.named_parameters(
+      ['rsa_pss_3072'] + RSA_PSS_PARAMS_3072,
+      ['rsa_pss_4096'] + RSA_PSS_PARAMS_4096,
+  )
+  def test_rsa_pss(self, key_template, hash_algo, modulus_size, exponent):
+    self.assertEqual(
+        key_template.type_url,
+        'type.googleapis.com/google.crypto.tink.RsaSsaPssPrivateKey')
+    self.assertEqual(key_template.output_prefix_type, tink_pb2.TINK)
+
+    key_format = rsa_ssa_pss_pb2.RsaSsaPssKeyFormat()
+    key_format.ParseFromString(key_template.value)
+    self.assertEqual(key_format.modulus_size_in_bits, modulus_size)
+    self.assertEqual(key_format.params.sig_hash, hash_algo)
+    self.assertEqual(key_format.params.mgf1_hash, hash_algo)
+    self.assertEqual(bytes_to_num(key_format.public_exponent), exponent)
+
+    # Check that the template works with the key manager
+    key_manager = public_key_sign_key_manager.from_cc_registry(
+        key_template.type_url)
+    key_manager.new_key_data(key_template)
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/streaming_aead/__init__.py b/python/streaming_aead/__init__.py
new file mode 100644
index 0000000..45782f2
--- /dev/null
+++ b/python/streaming_aead/__init__.py
@@ -0,0 +1,24 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""StreamingAead package."""
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from tink.python.streaming_aead import streaming_aead
+from tink.python.streaming_aead import streaming_aead_key_manager
+from tink.python.streaming_aead import streaming_aead_key_templates
+
+
+StreamingAead = streaming_aead.StreamingAead
diff --git a/python/streaming_aead/decrypting_stream.py b/python/streaming_aead/decrypting_stream.py
new file mode 100644
index 0000000..215249d
--- /dev/null
+++ b/python/streaming_aead/decrypting_stream.py
@@ -0,0 +1,244 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""A file-like object that decrypts the data it reads.
+
+It reads the ciphertext from a given other file-like object, and decrypts it.
+"""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import errno
+import io
+from typing import BinaryIO
+
+from tink.python.cc.clif import cc_streaming_aead_wrappers
+from tink.python.core import tink_error
+from tink.python.util import file_object_adapter
+
+_OUT_OF_RANGE_ERROR_CODE = 11
+
+
+class DecryptingStream(io.BufferedIOBase):
+  """A file-like object which decrypts reads from an underlying object.
+
+  It reads the ciphertext from the wrapped file-like object, and decrypts it.
+
+  The additional method position() returns the number of read plaintext bytes.
+
+  Closing this wrapper also closes the underlying object.
+  """
+
+  def __init__(self, stream_aead, ciphertext_source: BinaryIO,
+               associated_data: bytes):
+    """Create a new DecryptingStream.
+
+    Args:
+      stream_aead: C++ StreamingAead primitive from which a C++ DecryptingStream
+        will be obtained.
+      ciphertext_source: A readable file-like object from which ciphertext bytes
+        will be read.
+      associated_data: The associated data to use for decryption.
+    """
+    super(DecryptingStream, self).__init__()
+    self._closed = False
+    self._bytes_read = 0
+    self._ciphertext_source = ciphertext_source
+
+    # Create FileObjectAdapter
+    if not ciphertext_source.readable():
+      raise ValueError('ciphertext_source must be readable')
+    cc_ciphertext_source = file_object_adapter.FileObjectAdapter(
+        ciphertext_source)
+    # Get InputStreamAdapter of C++ DecryptingStream
+    self._input_stream_adapter = self._get_input_stream_adapter(
+        stream_aead, associated_data, cc_ciphertext_source)
+
+  @staticmethod
+  @tink_error.use_tink_errors
+  def _get_input_stream_adapter(cc_primitive, aad, source):
+    """Implemented as a separate method to ensure correct error transform."""
+    return cc_streaming_aead_wrappers.new_cc_decrypting_stream(
+        cc_primitive, aad, source)
+
+  ### Reading ###
+
+  def read(self, size: int = -1) -> bytes:
+    """Read and return up to size bytes.
+
+    Multiple reads may be issued to the underlying object.
+
+    Args:
+      size: Maximum number of bytes to read. If the argument is omitted, None,
+        or negative, data is read and returned until EOF or if the read call
+        would block in non-blocking mode.
+
+    Returns:
+      Bytes read. An empty bytes object is returned if the stream is already at
+      EOF.
+
+    Raises:
+      BlockingIOError if no data is available at the moment.
+      TinkError if there was a permanent error.
+    """
+    return self._read(size, read1=False)
+
+  def read1(self, size: int = -1) -> bytes:
+    """Read and return up to size bytes.
+
+    At most one read will be issued to the underlying object.
+
+    Args:
+      size: Maximum number of bytes to read. If the argument is omitted, None,
+        or negative, an arbitrary number of bytes are returned.
+
+    Returns:
+      Bytes read. An empty bytes object is returned if the stream is already at
+      EOF.
+
+    Raises:
+      BlockingIOError if no data is available at the moment.
+      TinkError if there was a permanent error.
+    """
+    return self._read(size, read1=True)
+
+  def readinto(self, b: bytearray) -> int:
+    """Read bytes into a pre-allocated bytes-like object b.
+
+    Multiple reads may be issued to the underlying object.
+
+    Args:
+      b: Bytes-like object to which data will be read.
+
+    Returns:
+      Number of bytes read. If 0 is returned it means EOF is reached.
+
+    Raises:
+      BlockingIOError if no data is available at the moment.
+      TinkError if there was a permanent error.
+    """
+    return self._readinto(b, read1=False)
+
+  def readinto1(self, b: bytearray) -> int:
+    """Read bytes into a pre-allocated bytes-like object b.
+
+    At most one read will be issued to the underlying object.
+
+    Args:
+      b: Bytes-like object to which data will be read.
+
+    Returns:
+      Number of bytes read. If 0 is returned it means EOF is reached.
+
+    Raises:
+      BlockingIOError if no data is available at the moment.
+      TinkError if there was a permanent error.
+    """
+    return self._readinto(b, read1=True)
+
+  def _read(self, size: int, read1: bool) -> bytes:
+    self._check_not_closed()
+
+    if size is None:
+      size = -1
+
+    try:
+      if read1:
+        data = self._read1_with_tink_error(size)
+      else:
+        data = self._read_with_tink_error(size)
+
+      if not data:
+        raise io.BlockingIOError(errno.EAGAIN,
+                                 'No data available at the moment.')
+      else:
+        self._bytes_read += len(data)
+        return data
+    except tink_error.TinkError as e:
+      # We are checking if the exception was raised because of C++
+      # OUT_OF_RANGE status, which signals EOF.
+      if e.args[0].code == _OUT_OF_RANGE_ERROR_CODE:
+        return b''
+      else:
+        raise e
+
+  # TODO(b/141344377) use the implementation in parent class
+  def _readinto(self, b: bytearray, read1: bool) -> int:
+    data = self._read(len(b), read1)
+    n = len(data)
+    b[:n] = data
+    return n
+
+  @tink_error.use_tink_errors
+  def _read_with_tink_error(self, size: int) -> bytes:
+    """Implemented as a separate method to ensure correct error transform."""
+    return self._input_stream_adapter.read(size)
+
+  @tink_error.use_tink_errors
+  def _read1_with_tink_error(self, size: int) -> bytes:
+    """Implemented as a separate method to ensure correct error transform."""
+    return self._input_stream_adapter.read1(size)
+
+  ### Internal ###
+
+  # TODO(b/141344377) use parent class _checkClosed() instead
+  def _check_not_closed(self, msg=None):
+    """Internal: raise a ValueError if file is closed."""
+    if self.closed:
+      raise ValueError('I/O operation on closed file.' if msg is None else msg)
+
+  ### Positioning ###
+
+  def position(self) -> int:
+    """Returns total number of read plaintext bytes."""
+    return self._bytes_read
+
+  ### Flush and close ###
+
+  def flush(self) -> None:
+    """This has no effect because the stream is read-only."""
+    self._check_not_closed()
+
+  def close(self) -> None:
+    """Close the stream.
+
+    This has no effect on a closed stream.
+    """
+    if self.closed:
+      return
+    self._ciphertext_source.close()
+    self._closed = True
+
+  ### Inquiries ###
+
+  def readable(self) -> bool:
+    """Indicates whether object was opened for reading.
+
+    Returns:
+      Whether object was opened for reading.
+
+    If False, read() will raise UnsupportedOperation.
+    """
+    return True
+
+  @property
+  def closed(self) -> bool:
+    """Indicates if the file has been closed.
+
+    Returns:
+      True if and only if the file has been closed.
+
+    For backwards compatibility, this is a property, not a predicate.
+    """
+    return self._closed
diff --git a/python/streaming_aead/decrypting_stream_test.py b/python/streaming_aead/decrypting_stream_test.py
new file mode 100644
index 0000000..08852cf
--- /dev/null
+++ b/python/streaming_aead/decrypting_stream_test.py
@@ -0,0 +1,245 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Tests for tink.python.streaming_aead.decrypting_stream."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+import io
+
+from absl.testing import absltest
+# TODO(b/141106504) Replace this with unittest.mock
+import mock
+
+from tink.python.core import tink_error
+from tink.python.streaming_aead import decrypting_stream
+from tink.util import error as clif_error
+
+
+class FakeInputStreamAdapter(object):
+
+  def __init__(self, file_object_adapter):
+    self._adapter = file_object_adapter
+
+  @tink_error.use_tink_errors
+  def read(self, size=-1):
+    try:
+      if size < 0:
+        size = 100
+      return self._adapter.read(size)
+    except EOFError:
+      raise clif_error.StatusNotOk(11, 'EOF')
+
+  def read1(self, size=-1):
+    del size  # unused
+    return self.read(4)
+
+
+def fake_get_input_stream_adapter(self, cc_primitive, aad, source):
+  del cc_primitive, aad, self  # unused
+  return FakeInputStreamAdapter(source)
+
+
+def get_decrypting_stream(ciphertext_source, aad):
+  return decrypting_stream.DecryptingStream(None, ciphertext_source, aad)
+
+
+class DecryptingStreamTest(absltest.TestCase):
+
+  def setUp(self):
+    super(DecryptingStreamTest, self).setUp()
+    # Replace the DecryptingStream's staticmethod with a custom function to
+    # avoid the need for a Streaming AEAD primitive.
+    self.addCleanup(mock.patch.stopall)
+    mock.patch.object(
+        decrypting_stream.DecryptingStream,
+        '_get_input_stream_adapter',
+        new=fake_get_input_stream_adapter).start()
+
+  def test_non_readable_object(self):
+    f = mock.Mock()
+    f.readable = mock.Mock(return_value=False)
+
+    with self.assertRaisesRegex(ValueError, 'readable'):
+      get_decrypting_stream(f, b'aad')
+
+  def test_read(self):
+    f = io.BytesIO(b'something')
+    ds = get_decrypting_stream(f, b'aad')
+
+    self.assertEqual(ds.read(9), b'something')
+
+  def test_read1(self):
+    f = io.BytesIO(b'something')
+    ds = get_decrypting_stream(f, b'aad')
+
+    self.assertEqual(ds.read1(9), b'some')
+
+  def test_readinto(self):
+    f = io.BytesIO(b'something')
+    ds = get_decrypting_stream(f, b'aad')
+
+    b = bytearray(9)
+    self.assertEqual(ds.readinto(b), 9)
+    self.assertEqual(bytes(b), b'something')
+
+  def test_readinto1(self):
+    f = io.BytesIO(b'something')
+    ds = get_decrypting_stream(f, b'aad')
+
+    b = bytearray(9)
+    self.assertEqual(ds.readinto1(b), 4)
+    self.assertEqual(bytes(b[:4]), b'some')
+
+  def test_read_until_eof(self):
+    f = io.BytesIO(b'something')
+    ds = get_decrypting_stream(f, b'aad')
+
+    self.assertEqual(ds.read(), b'something')
+
+  def test_read_eof_reached(self):
+    f = io.BytesIO()
+    ds = get_decrypting_stream(f, b'aad')
+
+    self.assertEqual(ds.read(), b'')
+
+  def test_read_no_data_available(self):
+    f = mock.Mock()
+    f.read = mock.Mock(return_value=None)
+    f.readable = mock.Mock(return_value=True)
+    ds = get_decrypting_stream(f, b'aad')
+
+    self.assertRaises(io.BlockingIOError, ds.read, 5)
+
+  def test_unsupported_operation(self):
+    f = io.BytesIO(b'something')
+    ds = get_decrypting_stream(f, b'aad')
+
+    with self.assertRaises(io.UnsupportedOperation):
+      ds.seek(0, 0)
+    self.assertRaises(io.UnsupportedOperation, ds.tell)
+    self.assertRaises(io.UnsupportedOperation, ds.truncate)
+    with self.assertRaises(io.UnsupportedOperation):
+      ds.write(b'data')
+    with self.assertRaises(io.UnsupportedOperation):
+      ds.writelines([b'data'])
+    self.assertRaises(io.UnsupportedOperation, ds.fileno)
+    self.assertRaises(io.UnsupportedOperation, ds.detach)
+
+  def test_closed(self):
+    f = io.BytesIO(b'something')
+    ds = get_decrypting_stream(f, b'aad')
+
+    self.assertFalse(ds.closed)
+    self.assertFalse(f.closed)
+    ds.close()
+    self.assertTrue(ds.closed)
+    self.assertTrue(f.closed)
+    ds.close()
+
+  def test_closed_methods_raise(self):
+    f = io.BytesIO(b'something')
+    ds = get_decrypting_stream(f, b'aad')
+
+    ds.close()
+    self.assertRaisesRegex(ValueError, 'closed', ds.read)
+    self.assertRaisesRegex(ValueError, 'closed', ds.flush)
+    self.assertRaisesRegex(ValueError, 'closed', ds.__enter__)
+    self.assertRaisesRegex(ValueError, 'closed', ds.__iter__)
+    self.assertRaisesRegex(ValueError, 'closed', ds.isatty)
+
+  def test_position(self):
+    f = io.BytesIO(b'something')
+    ds = get_decrypting_stream(f, b'aad')
+
+    self.assertEqual(ds.position(), 0)
+    ds.read(4)
+    self.assertEqual(ds.position(), 4)
+    ds.read(4)
+    self.assertEqual(ds.position(), 8)
+    ds.close()
+    self.assertEqual(ds.position(), 8)
+
+  def test_inquiries(self):
+    f = io.BytesIO(b'something')
+    ds = get_decrypting_stream(f, b'aad')
+
+    self.assertTrue(ds.readable())
+    self.assertFalse(ds.writable())
+    self.assertFalse(ds.seekable())
+    self.assertFalse(ds.isatty())
+
+  def test_context_manager(self):
+    f = io.BytesIO(b'something')
+
+    with get_decrypting_stream(f, b'aad') as ds:
+      self.assertEqual(ds.read(), b'something')
+    self.assertTrue(ds.closed)
+
+  def test_readline(self):
+    f = io.BytesIO(b'hello\nworld\n')
+    ds = get_decrypting_stream(f, b'aad')
+
+    self.assertEqual(ds.readline(), b'hello\n')
+    self.assertEqual(ds.readline(), b'world\n')
+
+  def test_readline_with_size(self):
+    f = io.BytesIO(b'hello\nworld\n')
+    ds = get_decrypting_stream(f, b'aad')
+
+    self.assertEqual(ds.readline(4), b'hell')
+    self.assertEqual(ds.readline(4), b'o\n')
+
+  def test_readlines(self):
+    f = io.BytesIO(b'hello\nworld\n')
+    ds = get_decrypting_stream(f, b'aad')
+
+    self.assertEqual(ds.readlines(), [b'hello\n', b'world\n'])
+
+  def test_readlines_with_hint(self):
+    f = io.BytesIO(b'hello\nworld\n!!!\n')
+    ds = get_decrypting_stream(f, b'aad')
+
+    self.assertEqual(ds.readlines(10), [b'hello\n', b'world\n'])
+
+  def test_iterator(self):
+    f = io.BytesIO(b'hello\nworld\n')
+
+    result = []
+    for line in get_decrypting_stream(f, b'aad'):
+      result.append(line)
+
+    self.assertEqual(result, [b'hello\n', b'world\n'])
+
+  def test_textiowrapper_compatibility(self):
+    """A test that checks the TextIOWrapper works as expected.
+
+    It decrypts the same ciphertext twice - once directly from bytes, and once
+    through TextIOWrapper's encoding. The two plaintexts should have the same
+    length.
+    """
+    file_1 = io.BytesIO(b'something')
+    file_2 = io.BytesIO(b'something')
+
+    with get_decrypting_stream(file_1, b'aad') as ds:
+      with io.TextIOWrapper(ds) as wrapper:
+        data_1 = wrapper.read()
+
+    with get_decrypting_stream(file_2, b'aad') as ds:
+      data_2 = ds.read()
+
+    self.assertEqual(len(data_1), len(data_2))
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/streaming_aead/encrypting_stream.py b/python/streaming_aead/encrypting_stream.py
new file mode 100644
index 0000000..0639579
--- /dev/null
+++ b/python/streaming_aead/encrypting_stream.py
@@ -0,0 +1,226 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""A file-like object that encrypts data written to it.
+
+It writes the ciphertext to a given other file-like object, which can later be
+decrypted and read using a DecryptingStream wrapper.
+"""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import errno
+import io
+from typing import Iterable, BinaryIO
+
+from tink.python.cc.clif import cc_streaming_aead_wrappers
+from tink.python.core import tink_error
+from tink.python.util import file_object_adapter
+
+
+class EncryptingStream(io.BufferedIOBase):
+  """A file-like object which wraps writes to an underlying file-like object.
+
+  It encrypts any data written to it, and writes the ciphertext to the wrapped
+  object.
+
+  The additional method position() returns the number of written plaintext
+  bytes.
+
+  Writes to an EncryptingStream may be partial - it is important to check the
+  return value of write().
+
+  The close() method indicates that the message is complete, and will write a
+  final ciphertext block to signify end of message. The context manager will
+  only call this close() method on a normal exit - if an exception is raised
+  inside the context manager which causes it to exit early, the close() method
+  will not be called, and the ciphertext will not be complete.
+  """
+
+  def __init__(self, stream_aead, ciphertext_destination: BinaryIO,
+               associated_data: bytes):
+    """Create a new EncryptingStream.
+
+    Args:
+      stream_aead: C++ StreamingAead primitive from which a C++ EncryptingStream
+        will be obtained.
+      ciphertext_destination: A writable file-like object to which ciphertext
+        bytes will be written.
+      associated_data: The associated data to use for encryption. This must
+        match the associated_data used for decryption.
+    """
+    super(EncryptingStream, self).__init__()
+    self._closed = False
+    self._bytes_written = 0
+
+    # Create FileObjectAdapter
+    if not ciphertext_destination.writable():
+      raise ValueError('ciphertext_destination must be writable')
+    cc_ciphertext_destination = file_object_adapter.FileObjectAdapter(
+        ciphertext_destination)
+    # Get OutputStreamAdapter of C++ EncryptingStream
+    self._output_stream_adapter = self._get_output_stream_adapter(
+        stream_aead, associated_data, cc_ciphertext_destination)
+
+  @staticmethod
+  @tink_error.use_tink_errors
+  def _get_output_stream_adapter(cc_primitive, aad, destination):
+    """Implemented as a separate method to ensure correct error transform."""
+    return cc_streaming_aead_wrappers.new_cc_encrypting_stream(
+        cc_primitive, aad, destination)
+
+  @tink_error.use_tink_errors
+  def write(self, b: bytes) -> int:
+    """Write the given buffer to the stream.
+
+    May use multiple calls to the underlying file object's write() method.
+
+    Returns:
+      The number of bytes written, which will always be the length of b in
+      bytes.
+
+    Raises:
+      BlockingIOError: if the write could not be fully completed, with
+        characters_written set to the number of bytes successfully written.
+      TinkError: if there was a permanent error.
+
+    Args:
+      b: The buffer to write.
+    """
+    self._check_not_closed()
+
+    if not isinstance(b, (bytes, memoryview, bytearray)):
+      raise TypeError('a bytes-like object is required, not {}'.format(
+          type(b).__name__))
+
+    # One call to OutputStreamAdapter.write() may call next() multiple times
+    # on the C++ EncryptingStream, but will perform a partial write if there is
+    # a temporary write error. Permanent write errors will bubble up as
+    # exceptions.
+    written = self._output_stream_adapter.write(b)
+    if written < 0:
+      raise tink_error.TinkError('Number of written bytes was negative')
+
+    self._bytes_written += written
+
+    if written < len(b):
+      raise io.BlockingIOError(errno.EAGAIN,
+                               'Write could not complete without blocking.',
+                               written)
+    elif written > len(b):
+      raise tink_error.TinkError(
+          'Number of written bytes was greater than length of bytes given')
+
+    return written
+
+  def writelines(self, lines: Iterable[bytes]) -> None:
+    """Write a list of lines to the stream.
+
+    Line separators are not added, so it is usual for each of the lines
+    provided to have a line separator at the end.
+
+    Args:
+      lines: An iterable of buffers to write to the stream.
+    """
+    self._check_not_closed()
+    for line in lines:
+      self.write(line)
+
+  ### Internal ###
+
+  # TODO(b/141344377) Use parent class _checkClosed() instead
+  def _check_not_closed(self, msg=None):
+    """Internal: raise a ValueError if file is closed."""
+    if self.closed:
+      raise ValueError('I/O operation on closed file.' if msg is None else msg)
+
+  ### Positioning ###
+
+  def position(self) -> int:
+    """Returns total number of written plaintext bytes."""
+    return self._bytes_written
+
+  ### Flush and close ###
+
+  def flush(self) -> None:
+    """Flush write buffers.
+
+    This method has no effect.
+    """
+    self._check_not_closed()
+    return
+
+  @tink_error.use_tink_errors
+  def close(self) -> None:
+    """Flush and close the stream.
+
+    This has no effect on a closed stream.
+    """
+    if self.closed:
+      return
+    self.flush()
+    self._output_stream_adapter.close()
+    self._closed = True
+
+  def __del__(self):
+    """Destructor.  Calls flush()."""
+    try:
+      # We deliberately don't close the file here, since we don't know if the
+      # user was really done writing or if there was an error.
+      self.flush()
+    except:  # pylint: disable=bare-except
+      pass
+
+  ### Inquiries ###
+
+  def writable(self) -> bool:
+    """Indicates whether object was opened for writing.
+
+    Returns:
+      Whether object was opened for writing.
+
+    If False, write() and truncate() will raise UnsupportedOperation.
+    """
+    return True
+
+  @property
+  def closed(self) -> bool:
+    """Indicates if the file has been closed.
+
+    Returns:
+      True if and only if the file has been closed.
+
+    For backwards compatibility, this is a property, not a predicate.
+    """
+    return self._closed
+
+  def __exit__(self, exc_type, exc_val, exc_tb) -> None:
+    """Context management protocol.  Calls close() if there was no exception."""
+    # Calling close() signifies that the message is complete - we should not
+    # do this if there was an exception.
+    # Instead, we let the destructors be called, which should lead to sufficient
+    # cleanup on the other end, and if ciphertext_destination calls close() in
+    # __del__ (as IOBase does) then the underlying file descriptor should also
+    # be closed eventually.
+    if exc_type is None:
+      self.close()
+
+  ### Iterator ###
+  def __iter__(self):
+    """Iterator API."""
+    raise io.UnsupportedOperation('Cannot iterate an EncryptingStream')
+
+  def __next__(self):
+    """Iterator API."""
+    raise io.UnsupportedOperation('Cannot iterate an EncryptingStream')
diff --git a/python/streaming_aead/encrypting_stream_test.py b/python/streaming_aead/encrypting_stream_test.py
new file mode 100644
index 0000000..576e4b1
--- /dev/null
+++ b/python/streaming_aead/encrypting_stream_test.py
@@ -0,0 +1,186 @@
+# Lint as: python3
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Tests for tink.python.streaming_aead.encrypting_stream."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+import io
+import sys
+
+from absl.testing import absltest
+# TODO(b/141106504) Replace this with unittest.mock
+import mock
+
+from tink.python.streaming_aead import encrypting_stream
+
+
+def fake_get_output_stream_adapter(self, cc_primitive, aad, destination):
+  del cc_primitive, aad, self  # unused
+  return destination
+
+
+class TestBytesObject(io.BytesIO):
+  """A BytesIO object that does not close."""
+
+  def close(self):
+    pass
+
+
+def get_encrypting_stream(ciphertext_destination, aad):
+  return encrypting_stream.EncryptingStream(None, ciphertext_destination, aad)
+
+
+class EncryptingStreamTest(absltest.TestCase):
+
+  def setUp(self):
+    super(EncryptingStreamTest, self).setUp()
+    # Replace the EncryptingStream's staticmethod with a custom function to
+    # avoid the need for a Streaming AEAD primitive.
+    self.addCleanup(mock.patch.stopall)
+    mock.patch.object(
+        encrypting_stream.EncryptingStream,
+        '_get_output_stream_adapter',
+        new=fake_get_output_stream_adapter).start()
+
+  def test_non_writable_object(self):
+    f = mock.Mock()
+    f.writable = mock.Mock(return_value=False)
+    with self.assertRaisesRegex(ValueError, 'writable'):
+      get_encrypting_stream(f, b'aad')
+
+  def test_write(self):
+    f = TestBytesObject()
+    with get_encrypting_stream(f, b'aad') as es:
+      es.write(b'Hello world!')
+
+    self.assertEqual(b'Hello world!', f.getvalue())
+
+  @absltest.skipIf(sys.version_info[0] == 2, 'Python 2 strings are bytes')
+  def test_write_non_bytes(self):
+    with io.BytesIO() as f, get_encrypting_stream(f, b'aad') as es:
+      with self.assertRaisesRegex(TypeError, 'bytes-like object is required'):
+        es.write('This is a string, not a bytes object')
+
+  def test_textiowrapper_compatibility(self):
+    """A test that checks the TextIOWrapper works as expected.
+
+    It encrypts the same plaintext twice - once directly from bytes, and once
+    through TextIOWrapper's encoding. The two ciphertexts should have the same
+    length.
+    """
+    file_1 = TestBytesObject()
+    file_2 = TestBytesObject()
+
+    with get_encrypting_stream(file_1, b'aad') as es:
+      with io.TextIOWrapper(es) as wrapper:
+        # Need to specify this is a unicode string for Python 2.
+        wrapper.write(u'some data')
+
+    with get_encrypting_stream(file_2, b'aad') as es:
+      es.write(b'some data')
+
+    self.assertEqual(len(file_1.getvalue()), len(file_2.getvalue()))
+
+  def test_flush(self):
+    with io.BytesIO() as f, get_encrypting_stream(f, b'assoc') as es:
+      es.write(b'Hello world!')
+      es.flush()
+
+  def test_closed(self):
+    f = io.BytesIO()
+    es = get_encrypting_stream(f, b'assoc')
+    es.write(b'Hello world!')
+    es.close()
+
+    self.assertTrue(es.closed)
+    self.assertTrue(f.closed)
+
+  def test_closed_methods_raise(self):
+    f = io.BytesIO()
+    es = get_encrypting_stream(f, b'assoc')
+    es.write(b'Hello world!')
+    es.close()
+
+    with self.assertRaisesRegex(ValueError, 'closed'):
+      es.write(b'Goodbye world.')
+    with self.assertRaisesRegex(ValueError, 'closed'):
+      with es:
+        pass
+    with self.assertRaisesRegex(ValueError, 'closed'):
+      es.flush()
+
+  def test_unsupported_operation(self):
+    with io.BytesIO() as f, get_encrypting_stream(f, b'assoc') as es:
+      with self.assertRaisesRegex(io.UnsupportedOperation, 'seek'):
+        es.seek(0, 2)
+      with self.assertRaisesRegex(io.UnsupportedOperation, 'truncate'):
+        es.truncate(0)
+      with self.assertRaisesRegex(io.UnsupportedOperation, 'read'):
+        es.read(-1)
+
+  def test_inquiries(self):
+    with io.BytesIO() as f, get_encrypting_stream(f, b'assoc') as es:
+      self.assertTrue(es.writable())
+      self.assertFalse(es.readable())
+      self.assertFalse(es.seekable())
+
+  def test_position(self):
+    with io.BytesIO() as f:
+      with get_encrypting_stream(f, b'assoc') as es:
+        es.write(b'Hello world!')
+        self.assertEqual(es.position(), 12)
+
+  def test_position_works_closed(self):
+    with io.BytesIO() as f:
+      es = get_encrypting_stream(f, b'assoc')
+
+      es.write(b'Hello world!')
+      es.close()
+
+      self.assertTrue(es.closed)
+      self.assertEqual(es.position(), 12)
+
+  def test_blocking_io(self):
+
+    class OnlyWritesFirstFiveBytes(io.BytesIO):
+
+      def write(self, buffer):
+        buffer = buffer[:5]
+        n = super(OnlyWritesFirstFiveBytes, self).write(buffer)
+        return n
+
+    with OnlyWritesFirstFiveBytes() as f:
+      with get_encrypting_stream(f, b'assoc') as es:
+        with self.assertRaisesRegex(io.BlockingIOError, 'could not complete'):
+          es.write(b'Hello world!')
+
+  def test_context_manager_exception_close(self):
+    """Tests that exceptional exits do not trigger normal file closure.
+
+    Instead, the file will be closed without a proper final ciphertext block,
+    and will result in an invalid ciphertext. The ciphertext_destination file
+    object itself should in most cases still be closed when garbage collected.
+    """
+    f = io.BytesIO()
+    with self.assertRaisesRegex(ValueError, 'raised inside'):
+      with get_encrypting_stream(f, b'assoc') as es:
+        es.write(b'some message')
+        raise ValueError('Error raised inside context manager')
+
+    self.assertFalse(f.closed)
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/streaming_aead/streaming_aead.py b/python/streaming_aead/streaming_aead.py
new file mode 100644
index 0000000..f6b9f14
--- /dev/null
+++ b/python/streaming_aead/streaming_aead.py
@@ -0,0 +1,137 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""This module defines the interface for Streaming AEAD."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import abc
+from typing import BinaryIO
+
+
+class StreamingAead(object):
+  """The interface for streaming authenticated encryption with associated data.
+
+  Streaming encryption is typically used for encrypting large plaintexts such
+  as large files. This interface supports a streaming interface for symmetric
+  encryption with authentication. The underlying encryption modes are selected
+  so that partial plaintext can be obtained fast by decrypting and
+  authenticating just a part of the ciphertext.
+  """
+
+  __metaclass__ = abc.ABCMeta
+
+  @abc.abstractmethod
+  def new_encrypting_stream(self, ciphertext_destination: BinaryIO,
+                            associated_data: bytes) -> BinaryIO:
+    # pyformat: disable
+    """Get a new encrypting stream that writes to ciphertext_destination.
+
+    Args:
+      ciphertext_destination: A writable binary file object to which ciphertext
+        will be written. It must support write(), close(), closed, and
+        writable().
+      associated_data: Associated data to be used by the AEAD encryption. It is
+        not included in the ciphertext and must be passed in as a parameter for
+        decryption.
+
+    The ciphertext_destination's write() method is expected to present one of
+    the following three behaviours in the case of a partial or failed write():
+      - return a non-negative integer number of bytes written
+      - return None (equivalent to returning 0)
+      - raise BlockingIOError with characters_written set correctly to a
+        non-negative integer (equivalent to returning that integer)
+    In the case of a full write, the number of bytes written should be returned.
+
+    The standard BufferedIOBase and RawIOBase base classes exhibit these
+    behaviours and are hence supported.
+
+    Returns:
+      An encrypting file object wrapper around 'ciphertext_destination', such
+      that any bytes written to the wrapper are AEAD-encrypted using
+      'associated_data' as associated authenticated data.
+
+      It supports the following:
+        write()
+        close()
+        closed
+        isatty()
+        flush() (no-op)
+        writable()
+        readable()
+        seekable()
+        __enter__() and __exit__()
+      Other methods, including read() and seek(), raise io.UnsupportedOperation.
+      Closing the wrapper also closes the ciphertext_destination.
+
+      The wrapper also supports the position() method, which returns the number
+      of written plaintext bytes.
+    Raises:
+      tink.TinkError if the creation fails.
+    """
+    # pyformat: enable
+    raise NotImplementedError()
+
+  @abc.abstractmethod
+  def new_decrypting_stream(self, ciphertext_source: BinaryIO,
+                            associated_data: bytes) -> BinaryIO:
+    """Get a new decrypting stream that reads from ciphertext_source.
+
+    Args:
+      ciphertext_source: A readable binary file object from which ciphertext
+        will be read.
+      associated_data: Associated data to be used by the AEAD decryption. It
+        must match the associated_data supplied for the encryption.
+
+    The cipertext_source's read() method is expected to return an empty bytes
+    object if the stream is already at EOF. In the case where the stream is not
+    at EOF yet but no data is available at the moment, it is expected to either
+    return None or raise BlockingIOError.
+
+    The standard BufferedIOBase and RawIOBase base classes exhibit these
+    behaviours and are hence supported.
+
+    Returns:
+      A decrypting file object wrapper around 'ciphertext_source', such that
+      any bytes read from the wrapper are AEAD-decrypted using 'associated_data'
+      as associated authenticated data.
+
+      It supports the following:
+        read()
+        read1()
+        readinto()
+        readinto1()
+        readline()
+        readlines()
+        close()
+        closed
+        isatty()
+        flush() (no-op)
+        readable()
+        writable()
+        seekable()
+        __enter__() and __exit__()
+        __iter__() and __next__()
+      Other methods, including write() and seek(), raise
+      io.UnsupportedOperation.
+      Closing the wrapper also closes the ciphertext_source.
+
+      The wrapper also supports the position() method, which returns the number
+      of plaintext bytes read.
+
+    Raises:
+      tink.TinkError if the creation fails.
+
+    """
+    raise NotImplementedError()
diff --git a/python/streaming_aead/streaming_aead_key_manager.py b/python/streaming_aead/streaming_aead_key_manager.py
new file mode 100644
index 0000000..0379f29
--- /dev/null
+++ b/python/streaming_aead/streaming_aead_key_manager.py
@@ -0,0 +1,57 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Python wrapper of the CLIF-wrapped C++ Streaming AEAD key manager."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import typing
+from typing import Text, BinaryIO
+
+from tink.python.cc.clif import cc_key_manager
+from tink.python.core import key_manager
+from tink.python.core import tink_error
+from tink.python.streaming_aead import decrypting_stream
+from tink.python.streaming_aead import encrypting_stream
+from tink.python.streaming_aead import streaming_aead
+
+
+class _StreamingAeadCcToPyWrapper(streaming_aead.StreamingAead):
+  """Transforms cliffed C++ StreamingAead into a Python primitive."""
+
+  def __init__(self, cc_streaming_aead):
+    self._streaming_aead = cc_streaming_aead
+
+  @tink_error.use_tink_errors
+  def new_encrypting_stream(self, ciphertext_destination: BinaryIO,
+                            associated_data: bytes) -> BinaryIO:
+    stream = encrypting_stream.EncryptingStream(self._streaming_aead,
+                                                ciphertext_destination,
+                                                associated_data)
+    return typing.cast(BinaryIO, stream)
+
+  @tink_error.use_tink_errors
+  def new_decrypting_stream(self, ciphertext_source: BinaryIO,
+                            associated_data: bytes) -> BinaryIO:
+    stream = decrypting_stream.DecryptingStream(self._streaming_aead,
+                                                ciphertext_source,
+                                                associated_data)
+    return typing.cast(BinaryIO, stream)
+
+
+def from_cc_registry(
+    type_url: Text) -> key_manager.KeyManager[streaming_aead.StreamingAead]:
+  return key_manager.KeyManagerCcToPyWrapper(
+      cc_key_manager.StreamingAeadKeyManager.from_cc_registry(type_url),
+      streaming_aead.StreamingAead, _StreamingAeadCcToPyWrapper)
diff --git a/python/streaming_aead/streaming_aead_key_manager_test.py b/python/streaming_aead/streaming_aead_key_manager_test.py
new file mode 100644
index 0000000..ab054bd
--- /dev/null
+++ b/python/streaming_aead/streaming_aead_key_manager_test.py
@@ -0,0 +1,149 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Tests for tink.python.streaming_aead_key_manager."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+import io
+
+from absl.testing import absltest
+from tink.proto import aes_ctr_hmac_streaming_pb2
+from tink.proto import aes_gcm_hkdf_streaming_pb2
+from tink.proto import common_pb2
+from tink.proto import tink_pb2
+from tink.python import tink_config
+from tink.python.core import tink_error
+from tink.python.streaming_aead import streaming_aead
+from tink.python.streaming_aead import streaming_aead_key_manager
+from tink.python.streaming_aead import streaming_aead_key_templates
+
+
+class TestBytesObject(io.BytesIO):
+  """A BytesIO object that does not close."""
+
+  def close(self):
+    pass
+
+
+def setUpModule():
+  tink_config.register()
+
+
+class StreamingAeadKeyManagerTest(absltest.TestCase):
+
+  def setUp(self):
+    super(StreamingAeadKeyManagerTest, self).setUp()
+    self.key_manager_gcm = streaming_aead_key_manager.from_cc_registry(
+        'type.googleapis.com/google.crypto.tink.AesGcmHkdfStreamingKey')
+    self.key_manager_ctr = streaming_aead_key_manager.from_cc_registry(
+        'type.googleapis.com/google.crypto.tink.AesCtrHmacStreamingKey')
+
+  def test_primitive_class(self):
+    self.assertEqual(self.key_manager_gcm.primitive_class(),
+                     streaming_aead.StreamingAead)
+    self.assertEqual(self.key_manager_ctr.primitive_class(),
+                     streaming_aead.StreamingAead)
+
+  def test_key_type(self):
+    self.assertEqual(
+        self.key_manager_gcm.key_type(),
+        'type.googleapis.com/google.crypto.tink.AesGcmHkdfStreamingKey')
+    self.assertEqual(
+        self.key_manager_ctr.key_type(),
+        'type.googleapis.com/google.crypto.tink.AesCtrHmacStreamingKey')
+
+  def test_new_key_data(self):
+    # AES GCM HKDF
+    key_template = streaming_aead_key_templates.AES128_GCM_HKDF_4KB
+    key_data = self.key_manager_gcm.new_key_data(key_template)
+    self.assertEqual(key_data.type_url, self.key_manager_gcm.key_type())
+    self.assertEqual(key_data.key_material_type, tink_pb2.KeyData.SYMMETRIC)
+    key = aes_gcm_hkdf_streaming_pb2.AesGcmHkdfStreamingKey()
+    key.ParseFromString(key_data.value)
+    self.assertEqual(key.version, 0)
+    self.assertLen(key.key_value, 16)
+    self.assertEqual(key.params.hkdf_hash_type, common_pb2.HashType.SHA256)
+    self.assertEqual(key.params.derived_key_size, 16)
+    self.assertEqual(key.params.ciphertext_segment_size, 4096)
+
+    # AES CTR HMAC
+    key_template = streaming_aead_key_templates.AES128_CTR_HMAC_SHA256_4KB
+    key_data = self.key_manager_ctr.new_key_data(key_template)
+    self.assertEqual(key_data.type_url, self.key_manager_ctr.key_type())
+    self.assertEqual(key_data.key_material_type, tink_pb2.KeyData.SYMMETRIC)
+    key = aes_ctr_hmac_streaming_pb2.AesCtrHmacStreamingKey()
+    key.ParseFromString(key_data.value)
+    self.assertEqual(key.version, 0)
+    self.assertLen(key.key_value, 16)
+    self.assertEqual(key.params.hkdf_hash_type, common_pb2.HashType.SHA256)
+    self.assertEqual(key.params.derived_key_size, 16)
+    self.assertEqual(key.params.hmac_params.hash, common_pb2.HashType.SHA256)
+    self.assertEqual(key.params.hmac_params.tag_size, 32)
+    self.assertEqual(key.params.ciphertext_segment_size, 4096)
+
+  def test_invalid_params_throw_exception(self):
+    # AES GCM HKDF
+    key_template = streaming_aead_key_templates.create_aes_gcm_hkdf_streaming_key_template(
+        63, common_pb2.HashType.SHA1, 65, 55)
+    with self.assertRaisesRegex(tink_error.TinkError,
+                                'key_size must not be smaller than'):
+      self.key_manager_gcm.new_key_data(key_template)
+
+    # AES CTR HKDF
+    key_template = streaming_aead_key_templates.create_aes_ctr_hmac_streaming_key_template(
+        63, common_pb2.HashType.SHA1, 65, common_pb2.HashType.SHA256, 55, 2)
+    with self.assertRaisesRegex(tink_error.TinkError,
+                                'key_size must not be smaller than'):
+      self.key_manager_ctr.new_key_data(key_template)
+
+  def test_encrypt_decrypt(self):
+    saead_primitive = self.key_manager_ctr.primitive(
+        self.key_manager_ctr.new_key_data(
+            streaming_aead_key_templates.AES128_CTR_HMAC_SHA256_4KB))
+    plaintext = b'plaintext'
+    aad = b'associated_data'
+
+    # Encrypt
+    ct_destination = TestBytesObject()
+    with saead_primitive.new_encrypting_stream(ct_destination, aad) as es:
+      self.assertLen(plaintext, es.write(plaintext))
+    self.assertNotEqual(ct_destination.getvalue(), plaintext)
+
+    # Decrypt
+    ct_source = TestBytesObject(ct_destination.getvalue())
+    with saead_primitive.new_decrypting_stream(ct_source, aad) as ds:
+      self.assertEqual(ds.read(), plaintext)
+
+  def test_encrypt_decrypt_wrong_aad(self):
+    saead_primitive = self.key_manager_ctr.primitive(
+        self.key_manager_ctr.new_key_data(
+            streaming_aead_key_templates.AES128_CTR_HMAC_SHA256_4KB))
+    plaintext = b'plaintext'
+    aad = b'associated_data'
+
+    # Encrypt
+    ct_destination = TestBytesObject()
+    with saead_primitive.new_encrypting_stream(ct_destination, aad) as es:
+      self.assertLen(plaintext, es.write(plaintext))
+    self.assertNotEqual(ct_destination.getvalue(), plaintext)
+
+    # Decrypt
+    ct_source = TestBytesObject(ct_destination.getvalue())
+    with saead_primitive.new_decrypting_stream(ct_source, b'bad ' + aad) as ds:
+      with self.assertRaises(tink_error.TinkError):
+        ds.read()
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/streaming_aead/streaming_aead_key_templates.py b/python/streaming_aead/streaming_aead_key_templates.py
new file mode 100644
index 0000000..1576ab9
--- /dev/null
+++ b/python/streaming_aead/streaming_aead_key_templates.py
@@ -0,0 +1,105 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Pre-generated KeyTemplates for StreamingAead.
+
+
+Currently, these templates cannot be used to generate keysets, but they can be
+used to generate individual keys.
+In the future, it will be possible to use these templates to generate a new
+tink_pb2.Keyset with tink_pb2.KeysetHandle. To generate a new keyset that
+contains a single aes_ctr_hmac_streaming_pb2.AesCtrHmacStreamingKey, one can do:
+handle = keyset_handle.KeysetHandle(
+  streaming_aead_key_templates.AES256_CTR_HMAC_SHA256_4KB).
+"""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from tink.proto import aes_ctr_hmac_streaming_pb2
+from tink.proto import aes_gcm_hkdf_streaming_pb2
+from tink.proto import common_pb2
+from tink.proto import tink_pb2
+
+_AES_GCM_HKDF_STREAMING_KEY_TYPE_URL = (
+    'type.googleapis.com/google.crypto.tink.AesGcmHkdfStreamingKey')
+_AES_CTR_HMAC_STREAMING_KEY_TYPE_URL = (
+    'type.googleapis.com/google.crypto.tink.AesCtrHmacStreamingKey')
+
+
+def create_aes_gcm_hkdf_streaming_key_template(
+    aes_key_size: int, hash_type: common_pb2.HashType, derived_key_size: int,
+    ciphertext_segment_size: int) -> tink_pb2.KeyTemplate:
+  """Creates an AES GCM HKDF Streaming KeyTemplate, and fills in its values."""
+  key_format = aes_gcm_hkdf_streaming_pb2.AesGcmHkdfStreamingKeyFormat()
+  key_format.key_size = aes_key_size
+  key_format.params.hkdf_hash_type = hash_type
+  key_format.params.derived_key_size = derived_key_size
+  key_format.params.ciphertext_segment_size = ciphertext_segment_size
+
+  key_template = tink_pb2.KeyTemplate()
+  key_template.value = key_format.SerializeToString()
+  key_template.type_url = _AES_GCM_HKDF_STREAMING_KEY_TYPE_URL
+  key_template.output_prefix_type = tink_pb2.RAW
+  return key_template
+
+
+def create_aes_ctr_hmac_streaming_key_template(
+    aes_key_size: int, hkdf_hash_type: common_pb2.HashType,
+    derived_key_size: int, mac_hash_type: common_pb2.HashType, tag_size: int,
+    ciphertext_segment_size: int) -> tink_pb2.KeyTemplate:
+  """Creates an AES CTR HMAC Streaming KeyTemplate, and fills in its values."""
+  key_format = aes_ctr_hmac_streaming_pb2.AesCtrHmacStreamingKeyFormat()
+  key_format.key_size = aes_key_size
+
+  key_format.params.ciphertext_segment_size = ciphertext_segment_size
+  key_format.params.derived_key_size = derived_key_size
+  key_format.params.hkdf_hash_type = hkdf_hash_type
+
+  key_format.params.hmac_params.hash = mac_hash_type
+  key_format.params.hmac_params.tag_size = tag_size
+
+  key_template = tink_pb2.KeyTemplate()
+  key_template.value = key_format.SerializeToString()
+  key_template.type_url = _AES_CTR_HMAC_STREAMING_KEY_TYPE_URL
+  key_template.output_prefix_type = tink_pb2.RAW
+  return key_template
+
+
+AES128_GCM_HKDF_4KB = create_aes_gcm_hkdf_streaming_key_template(
+    aes_key_size=16,
+    hash_type=common_pb2.HashType.SHA256,
+    derived_key_size=16,
+    ciphertext_segment_size=4096)
+
+AES256_GCM_HKDF_4KB = create_aes_gcm_hkdf_streaming_key_template(
+    aes_key_size=32,
+    hash_type=common_pb2.HashType.SHA256,
+    derived_key_size=32,
+    ciphertext_segment_size=4096)
+
+AES128_CTR_HMAC_SHA256_4KB = create_aes_ctr_hmac_streaming_key_template(
+    aes_key_size=16,
+    hkdf_hash_type=common_pb2.HashType.SHA256,
+    derived_key_size=16,
+    mac_hash_type=common_pb2.HashType.SHA256,
+    tag_size=32,
+    ciphertext_segment_size=4096)
+
+AES256_CTR_HMAC_SHA256_4KB = create_aes_ctr_hmac_streaming_key_template(
+    aes_key_size=32,
+    hkdf_hash_type=common_pb2.HashType.SHA256,
+    derived_key_size=32,
+    mac_hash_type=common_pb2.HashType.SHA256,
+    tag_size=32,
+    ciphertext_segment_size=4096)
diff --git a/python/streaming_aead/streaming_aead_key_templates_test.py b/python/streaming_aead/streaming_aead_key_templates_test.py
new file mode 100644
index 0000000..14e031f
--- /dev/null
+++ b/python/streaming_aead/streaming_aead_key_templates_test.py
@@ -0,0 +1,141 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Tests for tink.python.streaming_aead_key_templates."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+from tink.proto import aes_ctr_hmac_streaming_pb2
+from tink.proto import aes_gcm_hkdf_streaming_pb2
+from tink.proto import common_pb2
+from tink.proto import tink_pb2
+from tink.python.streaming_aead import streaming_aead_key_templates
+
+
+class StreamingAeadKeyTemplatesTest(absltest.TestCase):
+
+  def test_aes128_gcm_hkdf_4kb(self):
+    template = streaming_aead_key_templates.AES128_GCM_HKDF_4KB
+    self.assertEqual(
+        'type.googleapis.com/google.crypto.tink.AesGcmHkdfStreamingKey',
+        template.type_url)
+    self.assertEqual(tink_pb2.RAW, template.output_prefix_type)
+    key_format = aes_gcm_hkdf_streaming_pb2.AesGcmHkdfStreamingKeyFormat()
+    key_format.ParseFromString(template.value)
+
+    self.assertEqual(16, key_format.key_size)
+    self.assertEqual(common_pb2.HashType.SHA256,
+                     key_format.params.hkdf_hash_type)
+    self.assertEqual(16, key_format.params.derived_key_size)
+    self.assertEqual(4096, key_format.params.ciphertext_segment_size)
+
+  def test_aes256_gcm_hkdf_4kb(self):
+    template = streaming_aead_key_templates.AES256_GCM_HKDF_4KB
+    self.assertEqual(
+        'type.googleapis.com/google.crypto.tink.AesGcmHkdfStreamingKey',
+        template.type_url)
+    self.assertEqual(tink_pb2.RAW, template.output_prefix_type)
+    key_format = aes_gcm_hkdf_streaming_pb2.AesGcmHkdfStreamingKeyFormat()
+    key_format.ParseFromString(template.value)
+
+    self.assertEqual(32, key_format.key_size)
+    self.assertEqual(common_pb2.HashType.SHA256,
+                     key_format.params.hkdf_hash_type)
+    self.assertEqual(32, key_format.params.derived_key_size)
+    self.assertEqual(4096, key_format.params.ciphertext_segment_size)
+
+  def test_aes128_ctr_hmac_sha256_4kb(self):
+    template = streaming_aead_key_templates.AES128_CTR_HMAC_SHA256_4KB
+    self.assertEqual(
+        'type.googleapis.com/google.crypto.tink.AesCtrHmacStreamingKey',
+        template.type_url)
+    self.assertEqual(tink_pb2.RAW, template.output_prefix_type)
+    key_format = aes_ctr_hmac_streaming_pb2.AesCtrHmacStreamingKeyFormat()
+    key_format.ParseFromString(template.value)
+
+    self.assertEqual(16, key_format.key_size)
+    self.assertEqual(common_pb2.HashType.SHA256,
+                     key_format.params.hkdf_hash_type)
+    self.assertEqual(16, key_format.params.derived_key_size)
+    self.assertEqual(common_pb2.HashType.SHA256,
+                     key_format.params.hmac_params.hash)
+    self.assertEqual(32, key_format.params.hmac_params.tag_size)
+    self.assertEqual(4096, key_format.params.ciphertext_segment_size)
+
+  def test_aes256_ctr_hmac_sha256_4kb(self):
+    template = streaming_aead_key_templates.AES256_CTR_HMAC_SHA256_4KB
+    self.assertEqual(
+        'type.googleapis.com/google.crypto.tink.AesCtrHmacStreamingKey',
+        template.type_url)
+    self.assertEqual(tink_pb2.RAW, template.output_prefix_type)
+    key_format = aes_ctr_hmac_streaming_pb2.AesCtrHmacStreamingKeyFormat()
+    key_format.ParseFromString(template.value)
+
+    self.assertEqual(32, key_format.key_size)
+    self.assertEqual(common_pb2.HashType.SHA256,
+                     key_format.params.hkdf_hash_type)
+    self.assertEqual(32, key_format.params.derived_key_size)
+    self.assertEqual(common_pb2.HashType.SHA256,
+                     key_format.params.hmac_params.hash)
+    self.assertEqual(32, key_format.params.hmac_params.tag_size)
+    self.assertEqual(4096, key_format.params.ciphertext_segment_size)
+
+  def test_create_aes_gcm_hkdf_streaming_key_template(self):
+    # Intentionally using 'weird' or invalid values for parameters,
+    # to test that the function correctly puts them in the resulting template.
+    template = streaming_aead_key_templates.create_aes_gcm_hkdf_streaming_key_template(
+        aes_key_size=42,
+        hash_type=common_pb2.HashType.SHA1,
+        derived_key_size=76,
+        ciphertext_segment_size=64,
+    )
+    self.assertEqual(
+        'type.googleapis.com/google.crypto.tink.AesGcmHkdfStreamingKey',
+        template.type_url)
+    self.assertEqual(tink_pb2.RAW, template.output_prefix_type)
+    key_format = aes_gcm_hkdf_streaming_pb2.AesGcmHkdfStreamingKeyFormat()
+    key_format.ParseFromString(template.value)
+    self.assertEqual(42, key_format.key_size)
+    self.assertEqual(common_pb2.HashType.SHA1, key_format.params.hkdf_hash_type)
+    self.assertEqual(76, key_format.params.derived_key_size)
+    self.assertEqual(64, key_format.params.ciphertext_segment_size)
+
+  def test_create_aes_ctr_hmac_streaming_key_template(self):
+    # Intentionally using 'weird' or invalid values for parameters,
+    # to test that the function correctly puts them in the resulting template.
+    template = streaming_aead_key_templates.create_aes_ctr_hmac_streaming_key_template(
+        aes_key_size=42,
+        hkdf_hash_type=common_pb2.HashType.SHA1,
+        derived_key_size=76,
+        mac_hash_type=common_pb2.HashType.UNKNOWN_HASH,
+        tag_size=39,
+        ciphertext_segment_size=64,
+    )
+    self.assertEqual(
+        'type.googleapis.com/google.crypto.tink.AesCtrHmacStreamingKey',
+        template.type_url)
+    self.assertEqual(tink_pb2.RAW, template.output_prefix_type)
+    key_format = aes_ctr_hmac_streaming_pb2.AesCtrHmacStreamingKeyFormat()
+    key_format.ParseFromString(template.value)
+    self.assertEqual(42, key_format.key_size)
+    self.assertEqual(common_pb2.HashType.SHA1, key_format.params.hkdf_hash_type)
+    self.assertEqual(76, key_format.params.derived_key_size)
+    self.assertEqual(common_pb2.HashType.UNKNOWN_HASH,
+                     key_format.params.hmac_params.hash)
+    self.assertEqual(39, key_format.params.hmac_params.tag_size)
+    self.assertEqual(64, key_format.params.ciphertext_segment_size)
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/streaming_aead/streaming_aead_test.py b/python/streaming_aead/streaming_aead_test.py
new file mode 100644
index 0000000..747e0a6
--- /dev/null
+++ b/python/streaming_aead/streaming_aead_test.py
@@ -0,0 +1,196 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Tests for tink.python.streaming_aead.streaming_aead."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import io
+
+from absl.testing import absltest
+
+from tink.python import tink_config
+from tink.python.streaming_aead import streaming_aead_key_manager
+from tink.python.streaming_aead import streaming_aead_key_templates
+
+
+def setUpModule():
+  tink_config.register()
+
+
+class TestBytesObject(io.BytesIO):
+  """A BytesIO object that does not close."""
+
+  def close(self):
+    pass
+
+
+class StreamingAeadTest(absltest.TestCase):
+  """End-to-end test of Streaming AEAD Encrypting/Decrypting Streams."""
+
+  @staticmethod
+  def get_primitive():
+    key_manager = streaming_aead_key_manager.from_cc_registry(
+        'type.googleapis.com/google.crypto.tink.AesGcmHkdfStreamingKey')
+
+    # Generate the key data.
+    key_template = streaming_aead_key_templates.AES128_GCM_HKDF_4KB
+    key_data = key_manager.new_key_data(key_template)
+
+    return key_manager.primitive(key_data)
+
+  def test_get_encrypting_stream(self):
+    primitive = self.get_primitive()
+
+    # Use the primitive to get an encrypting stream.
+    with TestBytesObject() as f:
+      with primitive.new_encrypting_stream(f, b'aad') as es:
+        es.write(b'some data')
+
+      ciphertext = f.getvalue()
+      self.assertNotEmpty(ciphertext)
+
+  def test_get_two_encrypting_streams(self):
+    """Test that multiple EncryptingStreams can be obtained from a primitive."""
+    primitive = self.get_primitive()
+
+    f1 = TestBytesObject()
+    f2 = TestBytesObject()
+
+    with primitive.new_encrypting_stream(f1, b'aad') as es:
+      es.write(b'some data')
+
+    with primitive.new_encrypting_stream(f2, b'another aad') as es:
+      es.write(b'some other data')
+
+    self.assertNotEmpty(f1.getvalue())
+    self.assertNotEmpty(f2.getvalue())
+
+  def test_encrypting_textiowrapper(self):
+    """A test that checks the TextIOWrapper works as expected.
+
+    It encrypts the same plaintext twice - once directly from bytes, and once
+    through TextIOWrapper's encoding. The two ciphertexts should have the same
+    length.
+    """
+    primitive = self.get_primitive()
+
+    file_1 = TestBytesObject()
+    file_2 = TestBytesObject()
+
+    with primitive.new_encrypting_stream(file_1, b'aad') as es:
+      with io.TextIOWrapper(es) as wrapper:
+        # Need to specify this is a unicode string for Python 2 (b/141106504).
+        wrapper.write(u'some data')
+
+    with primitive.new_encrypting_stream(file_2, b'aad') as es:
+      es.write(b'some data')
+
+    self.assertEqual(len(file_1.getvalue()), len(file_2.getvalue()))
+
+  def test_round_trip(self):
+    primitive = self.get_primitive()
+
+    f = TestBytesObject()
+
+    original_plaintext = b'some data'
+
+    with primitive.new_encrypting_stream(f, b'test aad') as es:
+      es.write(original_plaintext)
+
+    f.seek(0)
+
+    with primitive.new_decrypting_stream(f, b'test aad') as ds:
+      read_plaintext = ds.read()
+
+    self.assertEqual(read_plaintext, original_plaintext)
+
+  def test_round_trip_textiowrapper_single_line(self):
+    """Read and write a single line through a TextIOWrapper."""
+    primitive = self.get_primitive()
+    f = TestBytesObject()
+
+    # Mark this as unicode for Python 2 (b/141106504)
+    original_plaintext = u'One-line string.'
+    with primitive.new_encrypting_stream(f, b'test aad') as es:
+      with io.TextIOWrapper(es) as wrapper:
+        wrapper.write(original_plaintext)
+
+    f.seek(0)
+
+    with primitive.new_decrypting_stream(f, b'test aad') as ds:
+      with io.TextIOWrapper(ds) as wrapper:
+        read_plaintext = wrapper.read()
+
+    self.assertEqual(original_plaintext, read_plaintext)
+
+  def test_round_trip_decrypt_textiowrapper(self):
+    """Write bytes to EncryptingStream, then decrypt through TextIOWrapper."""
+    primitive = self.get_primitive()
+    f = TestBytesObject()
+    original_plaintext = '''some
+    data
+    on multiple lines.'''
+
+    with primitive.new_encrypting_stream(f, b'test aad') as es:
+      es.write(original_plaintext.encode('utf-8'))
+
+    f.seek(0)
+    with primitive.new_decrypting_stream(f, b'test aad') as ds:
+      with io.TextIOWrapper(ds) as wrapper:
+        data = wrapper.read()
+
+    self.assertEqual(data, original_plaintext)
+
+  def test_round_trip_encrypt_textiowrapper(self):
+    """Encrypt with TextIOWrapper, then decrypt direct bytes."""
+    primitive = self.get_primitive()
+    f = TestBytesObject()
+    # Mark this as unicode for Python 2 (b/141106504)
+    original_plaintext = u'''some
+    data
+    on multiple lines.'''
+
+    with primitive.new_encrypting_stream(f, b'test aad') as es:
+      with io.TextIOWrapper(es) as wrapper:
+        wrapper.write(original_plaintext)
+
+    f.seek(0)
+    with primitive.new_decrypting_stream(f, b'test aad') as ds:
+      data = ds.read().decode('utf-8')
+
+    self.assertEqual(data, original_plaintext)
+
+  def test_round_trip_encrypt_decrypt_textiowrapper(self):
+    """Use TextIOWrapper for both encryption and decryption."""
+    primitive = self.get_primitive()
+    f = TestBytesObject()
+    # Mark this as unicode for Python 2 (b/141106504)
+    original_plaintext = u'''some
+    data
+    on multiple lines.'''
+
+    with primitive.new_encrypting_stream(f, b'test aad') as es:
+      with io.TextIOWrapper(es) as wrapper:
+        wrapper.write(original_plaintext)
+
+    f.seek(0)
+    with primitive.new_decrypting_stream(f, b'test aad') as ds:
+      with io.TextIOWrapper(ds) as wrapper:
+        data = wrapper.read()
+
+    self.assertEqual(data, original_plaintext)
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/testing/helper.py b/python/testing/helper.py
new file mode 100644
index 0000000..2bd7234
--- /dev/null
+++ b/python/testing/helper.py
@@ -0,0 +1,149 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""This class implements helper functions for testing."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+from typing import Text
+
+from tink.proto import tink_pb2
+from tink.python import aead
+from tink.python import daead
+from tink.python import hybrid
+from tink.python import mac
+from tink.python import signature as pk_signature
+from tink.python.core import tink_error
+
+
+def fake_key(value: bytes = b'fakevalue',
+             type_url: Text = 'fakeurl',
+             key_material_type: tink_pb2.KeyData.KeyMaterialType = tink_pb2
+             .KeyData.SYMMETRIC,
+             key_id: int = 1234,
+             status: tink_pb2.KeyStatusType = tink_pb2.ENABLED,
+             output_prefix_type: tink_pb2.OutputPrefixType = tink_pb2.TINK
+            ) -> tink_pb2.Keyset.Key:
+  """Returns a fake but valid key."""
+  key = tink_pb2.Keyset.Key(
+      key_id=key_id,
+      status=status,
+      output_prefix_type=output_prefix_type)
+  key.key_data.type_url = type_url
+  key.key_data.value = value
+  key.key_data.key_material_type = key_material_type
+  return key
+
+
+class FakeMac(mac.Mac):
+  """A fake MAC implementation."""
+
+  def __init__(self, name: Text = 'FakeMac'):
+    self._name = name
+
+  def compute_mac(self, data: bytes) -> bytes:
+    return data + b'|' + self._name.encode()
+
+  def verify_mac(self, mac_value: bytes, data: bytes) -> None:
+    if mac_value != data + b'|' + self._name.encode():
+      raise tink_error.TinkError('invalid mac ' + mac_value.decode())
+
+
+class FakeAead(aead.Aead):
+  """A fake AEAD implementation."""
+
+  def __init__(self, name: Text = 'FakeAead'):
+    self._name = name
+
+  def encrypt(self, plaintext: bytes, associated_data: bytes) -> bytes:
+    return plaintext + b'|' + associated_data + b'|' + self._name.encode()
+
+  def decrypt(self, ciphertext: bytes, associated_data: bytes) -> bytes:
+    data = ciphertext.split(b'|')
+    if (len(data) < 3 or data[1] != associated_data or
+        data[2] != self._name.encode()):
+      raise tink_error.TinkError('failed to decrypt ciphertext ' +
+                                 ciphertext.decode())
+    return data[0]
+
+
+class FakeDeterministicAead(daead.DeterministicAead):
+  """A fake Deterministic AEAD implementation."""
+
+  def __init__(self, name: Text = 'FakeDeterministicAead'):
+    self._name = name
+
+  def encrypt_deterministically(self, plaintext: bytes,
+                                associated_data: bytes) -> bytes:
+    return plaintext + b'|' + associated_data + b'|' + self._name.encode()
+
+  def decrypt_deterministically(self, ciphertext: bytes,
+                                associated_data: bytes) -> bytes:
+    data = ciphertext.split(b'|')
+    if (len(data) < 3 or
+        data[1] != associated_data or
+        data[2] != self._name.encode()):
+      raise tink_error.TinkError('failed to decrypt ciphertext ' +
+                                 ciphertext.decode())
+    return data[0]
+
+
+class FakeHybridDecrypt(hybrid.HybridDecrypt):
+  """A fake HybridEncrypt implementation."""
+
+  def __init__(self, name: Text = 'Hybrid'):
+    self._name = name
+
+  def decrypt(self, ciphertext: bytes, context_info: bytes) -> bytes:
+    data = ciphertext.split(b'|')
+    if (len(data) < 3 or
+        data[1] != context_info or
+        data[2] != self._name.encode()):
+      raise tink_error.TinkError('failed to decrypt ciphertext ' +
+                                 ciphertext.decode())
+    return data[0]
+
+
+class FakeHybridEncrypt(hybrid.HybridEncrypt):
+  """A fake HybridEncrypt implementation."""
+
+  def __init__(self, name: Text = 'Hybrid'):
+    self._name = name
+
+  def encrypt(self, plaintext: bytes, context_info: bytes) -> bytes:
+    return plaintext + b'|' + context_info + b'|' + self._name.encode()
+
+
+class FakePublicKeySign(pk_signature.PublicKeySign):
+  """A fake PublicKeySign implementation."""
+
+  def __init__(self, name: Text = 'FakePublicKeySign'):
+    self._name = name
+
+  def sign(self, data: bytes) -> bytes:
+    return data + b'|' + self._name.encode()
+
+
+class FakePublicKeyVerify(pk_signature.PublicKeyVerify):
+  """A fake PublicKeyVerify implementation."""
+
+  def __init__(self, name: Text = 'FakePublicKeyVerify'):
+    self._name = name
+
+  def verify(self, signature: bytes, data: bytes):
+    if signature != data + b'|' + self._name.encode():
+      raise tink_error.TinkError('invalid signature ' + signature.decode())
diff --git a/python/testing/helper_test.py b/python/testing/helper_test.py
new file mode 100644
index 0000000..4535f5e
--- /dev/null
+++ b/python/testing/helper_test.py
@@ -0,0 +1,139 @@
+# Copyright 2019 Google LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Tests for tink.python.testing.helper."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+from absl.testing import absltest
+from tink.python.core import tink_error
+from tink.python.testing import helper
+
+
+class HelperTest(absltest.TestCase):
+
+  def test_fake_mac_success(self):
+    mac = helper.FakeMac('Name')
+    mac_value = mac.compute_mac(b'data')
+    mac.verify_mac(mac_value, b'data')
+
+  def test_fake_mac_fail_wrong_data(self):
+    mac = helper.FakeMac('Name')
+    mac_value = mac.compute_mac(b'data')
+    with self.assertRaisesRegex(tink_error.TinkError,
+                                'invalid mac'):
+      mac.verify_mac(mac_value, b'wrong data')
+
+  def test_fake_mac_fail_wrong_primitive(self):
+    mac = helper.FakeMac('Name')
+    mac_value = mac.compute_mac(b'data')
+    wrong_mac = helper.FakeMac('Wrong Name')
+    with self.assertRaisesRegex(tink_error.TinkError,
+                                'invalid mac'):
+      wrong_mac.verify_mac(mac_value, b'data')
+
+  def test_fake_aead_success(self):
+    aead = helper.FakeAead('Name')
+    ciphertext = aead.encrypt(b'plaintext', b'associated_data')
+    self.assertEqual(
+        aead.decrypt(ciphertext, b'associated_data'),
+        b'plaintext')
+
+  def test_fake_aead_fail_wrong_cipertext(self):
+    aead = helper.FakeAead('Name')
+    with self.assertRaisesRegex(tink_error.TinkError,
+                                'failed to decrypt ciphertext'):
+      aead.decrypt(b'wrong ciphertext', b'associated_data')
+
+  def test_fake_aead_fail_wrong_associated_data(self):
+    aead = helper.FakeAead('Name')
+    ciphertext = aead.encrypt(b'plaintext', b'associated_data')
+    with self.assertRaisesRegex(tink_error.TinkError,
+                                'failed to decrypt ciphertext'):
+      aead.decrypt(ciphertext, b'wrong_associated_data')
+
+  def test_fake_aead_fail_wrong_primitive(self):
+    aead = helper.FakeAead('Name')
+    ciphertext = aead.encrypt(b'plaintext', b'associated_data')
+    wrong_aead = helper.FakeAead('Wrong Name')
+    with self.assertRaisesRegex(tink_error.TinkError,
+                                'failed to decrypt ciphertext'):
+      wrong_aead.decrypt(ciphertext, b'associated_data')
+
+  def test_fake_deterministic_aead_success(self):
+    daead = helper.FakeDeterministicAead('Name')
+    ciphertext = daead.encrypt_deterministically(b'plaintext',
+                                                 b'associated_data')
+    self.assertEqual(
+        daead.decrypt_deterministically(ciphertext, b'associated_data'),
+        b'plaintext')
+
+  def test_fake_deterministic_aead_fail_wrong_cipertext(self):
+    daead = helper.FakeDeterministicAead('Name')
+    with self.assertRaisesRegex(tink_error.TinkError,
+                                'failed to decrypt ciphertext'):
+      daead.decrypt_deterministically(b'wrong ciphertext', b'associated_data')
+
+  def test_fake_deterministic_aead_fail_wrong_associated_data(self):
+    daead = helper.FakeDeterministicAead('Name')
+    ciphertext = daead.encrypt_deterministically(b'plaintext',
+                                                 b'associated_data')
+    with self.assertRaisesRegex(tink_error.TinkError,
+                                'failed to decrypt ciphertext'):
+      daead.decrypt_deterministically(ciphertext, b'wrong_associated_data')
+
+  def test_fake_deterministic_aead_fail_wrong_primitive(self):
+    daead = helper.FakeDeterministicAead('Name')
+    ciphertext = daead.encrypt_deterministically(b'plaintext',
+                                                 b'associated_data')
+    wrong_daead = helper.FakeDeterministicAead('Wrong Name')
+    with self.assertRaisesRegex(tink_error.TinkError,
+                                'failed to decrypt ciphertext'):
+      wrong_daead.decrypt_deterministically(ciphertext, b'associated_data')
+
+  def test_fake_hybrid_success(self):
+    enc = helper.FakeHybridEncrypt('Name')
+    dec = helper.FakeHybridDecrypt('Name')
+    ciphertext = enc.encrypt(b'plaintext', b'context_info')
+    self.assertEqual(
+        dec.decrypt(ciphertext, b'context_info'),
+        b'plaintext')
+
+  def test_fake_hybrid_fail_wrong_context(self):
+    enc = helper.FakeHybridEncrypt('Name')
+    dec = helper.FakeHybridDecrypt('Name')
+    ciphertext = enc.encrypt(b'plaintext', b'context_info')
+    with self.assertRaisesRegex(tink_error.TinkError,
+                                'failed to decrypt ciphertext'):
+      dec.decrypt(ciphertext, b'other_context_info')
+
+  def test_fake_hybrid_fail_wrong_dec(self):
+    enc = helper.FakeHybridEncrypt('Name')
+    dec = helper.FakeHybridDecrypt('Wrong Name')
+    ciphertext = enc.encrypt(b'plaintext', b'context_info')
+    with self.assertRaisesRegex(tink_error.TinkError,
+                                'failed to decrypt ciphertext'):
+      dec.decrypt(ciphertext, b'context_info')
+
+  def test_fake_hybrid_fail_wrong_ciphertext(self):
+    dec = helper.FakeHybridDecrypt('Name')
+    with self.assertRaisesRegex(tink_error.TinkError,
+                                'failed to decrypt ciphertext'):
+      dec.decrypt(b'wrong ciphertext', b'context_info')
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/python/util/BUILD.bazel b/python/util/BUILD.bazel
new file mode 100644
index 0000000..959b217
--- /dev/null
+++ b/python/util/BUILD.bazel
@@ -0,0 +1,19 @@
+licenses(["notice"])
+
+package(default_visibility = ["//tools/build_defs:internal_pkg"])
+
+cc_library(
+    name = "clif",
+    srcs = ["clif.cc"],
+    hdrs = ["clif.h"],
+    include_prefix = "tink/python",
+    strip_include_prefix = "/python",
+    deps = [
+        "//cc/util:errors",
+        "//cc/util:status",
+        "//cc/util:statusor",
+        "@clif//:cpp_runtime",
+        "@com_google_absl//absl/strings",
+        "@com_google_protobuf//:protobuf",
+    ],
+)
diff --git a/python/util/clif.cc b/python/util/clif.cc
new file mode 100644
index 0000000..d5dbe83
--- /dev/null
+++ b/python/util/clif.cc
@@ -0,0 +1,129 @@
+// Copyright 2019 Google LLC.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "tink/python/util/clif.h"
+
+#include <assert.h>
+#include "absl/strings/str_cat.h"
+#include "tink/util/status.h"
+
+
+
+namespace crypto {
+namespace tink {
+namespace util {
+
+PyObject* Get_UtilStatusOk() {
+  static PyObject* const kUtilStatusOk = _PyObject_New(&PyBaseObject_Type);
+  // TODO(mrovner): The following return is sligthly wrong:
+  // In the (unlikely) case where the allocation failed, subsequent calls to
+  // this function will return null without setting a Python exception.
+  Py_XINCREF(kUtilStatusOk);
+  return kUtilStatusOk;
+}
+
+void ErrorFromStatus(const Status& status) {
+  /* Can't just do this
+       static PyObject* const kUtilStatusError = ImportFQName(...
+     because static creates a C++ lock around the whole statement and GIL can be
+     elsewhere due to Python import. */
+  static PyObject* kUtilStatusError = nullptr;
+  if (kUtilStatusError == nullptr) {
+    // Worst case it will do ImportFQName K times (K==number of threads)
+    // which is OK.
+    kUtilStatusError =
+        clif::ImportFQName("google3.util.task.python.error.StatusNotOk");
+    assert(kUtilStatusError != nullptr);
+  }
+  PyObject* message_set_object;
+  message_set_object = Py_None;
+  Py_INCREF(message_set_object);
+  PyObject* err = Py_BuildValue(
+      "is#siN", status.error_code(), status.error_message().data(),
+      status.error_message().size(), "Not implemented!",
+      status.CanonicalCode(), message_set_object);
+  if (err != nullptr) {
+    PyErr_SetObject(kUtilStatusError, err);
+    Py_DECREF(err);
+  }  // otherwise error is already set
+}
+
+Status StatusFromPyException() {
+  if (!PyErr_Occurred()) {
+    return OkStatus();
+  }
+
+  if (PyErr_ExceptionMatches(PyExc_MemoryError)) {
+    return Status(util::error::RESOURCE_EXHAUSTED, PyExcFetch());
+  }
+  if (PyErr_ExceptionMatches(PyExc_NotImplementedError)) {
+    return Status(util::error::UNIMPLEMENTED, PyExcFetch());
+  }
+  if (PyErr_ExceptionMatches(PyExc_KeyboardInterrupt)) {
+    return Status(util::error::ABORTED, PyExcFetch());
+  }
+  if (PyErr_ExceptionMatches(PyExc_SystemError) ||
+      PyErr_ExceptionMatches(PyExc_SyntaxError)) {
+    return Status(util::error::INTERNAL, PyExcFetch());
+  }
+  if (PyErr_ExceptionMatches(PyExc_TypeError)) {
+    return Status(util::error::INVALID_ARGUMENT, PyExcFetch());
+  }
+  if (PyErr_ExceptionMatches(PyExc_ValueError)) {
+    return Status(util::error::OUT_OF_RANGE, PyExcFetch());
+  }
+  if (PyErr_ExceptionMatches(PyExc_LookupError)) {
+    return Status(util::error::NOT_FOUND, PyExcFetch());
+  }
+
+  return Status(util::error::UNKNOWN, PyExcFetch());
+}
+
+PyObject* Clif_PyObjFrom(const Status& c, const clif::py::PostConv& unused) {
+  if (!c.ok()) {
+    ErrorFromStatus(c);
+    return nullptr;
+  }
+  return Get_UtilStatusOk();
+}
+
+std::string PyExcFetch() {
+  assert(PyErr_Occurred());  // Must only call PyExcFetch after an exception.
+  PyObject* ptype;
+  PyObject* pvalue;
+  PyObject* ptraceback;
+  PyErr_Fetch(&ptype, &pvalue, &ptraceback);
+  std::string err = clif::ClassName(ptype);
+  if (pvalue) {
+    PyObject* str = PyObject_Str(pvalue);
+    if (str) {
+#if PY_MAJOR_VERSION < 3
+      absl::StrAppend(&err, ": ", PyString_AS_STRING(str));
+#else
+      absl::StrAppend(&err, ": ", PyUnicode_AsUTF8(str));
+#endif
+      Py_DECREF(str);
+    }
+    Py_DECREF(pvalue);
+  }
+  Py_DECREF(ptype);
+  Py_XDECREF(ptraceback);
+  return err;
+}
+
+}  // namespace util
+}  // namespace tink
+}  // namespace crypto
diff --git a/python/util/clif.h b/python/util/clif.h
new file mode 100644
index 0000000..11a7bb7
--- /dev/null
+++ b/python/util/clif.h
@@ -0,0 +1,126 @@
+// Copyright 2019 Google LLC.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TINK_PYTHON_UTIL_CLIF_H_
+#define TINK_PYTHON_UTIL_CLIF_H_
+
+#include <assert.h>
+#include "clif/python/types.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+// placeholder_pyobject_h, please ignore
+
+// CLIF use `::crypto::tink::util::Status` as Status
+// CLIF use `::crypto::tink::util::StatusOr` as StatusOr
+
+namespace crypto {
+namespace tink {
+namespace util {
+
+PyObject* Get_UtilStatusOk();
+void ErrorFromStatus(const Status& status);
+Status StatusFromPyException();
+std::string PyExcFetch();
+
+PyObject* Clif_PyObjFrom(const Status& c, const ::clif::py::PostConv&);
+
+// Note: there is no corresponding PyObjAs for util::Status, as this class is
+// represented on the Python side by an exception. This implies that it is not
+// possible to hand a util::Status to C++. Pass a code and message instead.
+
+template <typename T>
+PyObject* Clif_PyObjFrom(const StatusOr<T>& c, const ::clif::py::PostConv& pc) {
+  if (!c.ok()) {
+    ErrorFromStatus(c.status());
+    return nullptr;
+  } else {
+    using ::clif::Clif_PyObjFrom;
+    return Clif_PyObjFrom(c.ValueOrDie(), pc.Get(0));
+  }
+}
+
+template <typename T>
+PyObject* Clif_PyObjFrom(StatusOr<T>&& c,  // NOLINT:c++11
+                         const ::clif::py::PostConv& pc) {
+  if (!c.ok()) {
+    ErrorFromStatus(c.status());
+    return nullptr;
+  } else {
+    using ::clif::Clif_PyObjFrom;
+    return Clif_PyObjFrom(std::move(c).ValueOrDie(), pc.Get(0));
+  }
+}
+
+template<typename T>
+bool Clif_PyObjAs(PyObject* p, StatusOr<T>* c) {
+  assert(c != nullptr);
+
+  if (PyErr_Occurred()) {
+    *c = StatusFromPyException();
+    return true;
+  }
+
+  T val;
+  using ::clif::Clif_PyObjAs;
+  if (Clif_PyObjAs(p, &val)) {
+    *c = std::move(val);
+    return true;
+  }
+
+  return false;
+}
+
+}  // namespace util
+}  // namespace tink
+}  // namespace crypto
+
+namespace clif {
+namespace callback {
+
+// Specialization of a generic Clif Python callback handling for a
+// function returning util::StatusOr.
+template <typename T>
+class ReturnValue<::crypto::tink::util::StatusOr<T>> {
+ public:
+  ::crypto::tink::util::StatusOr<T> FromPyValue(PyObject* result) {
+    ::crypto::tink::util::StatusOr<T> v;
+    bool ok = Clif_PyObjAs(result, &v);
+    Py_XDECREF(result);
+    if (!ok) {
+      v = ::crypto::tink::util::StatusFromPyException();
+    }
+    return v;
+  }
+};
+
+// Specialization of a generic Clif Python callback handling for a
+// function returning a util::Status.
+template <>
+class ReturnValue<::crypto::tink::util::Status> {
+ public:
+  ::crypto::tink::util::Status FromPyValue(PyObject* result) {
+    Py_XDECREF(result);
+    if (PyErr_Occurred()) {
+      return ::crypto::tink::util::StatusFromPyException();
+    }
+    return ::crypto::tink::util::OkStatus();
+  }
+};
+
+}  // namespace callback
+}  // namespace clif
+
+#endif  // TINK_PYTHON_UTIL_CLIF_H_
diff --git a/python/util/file_object_adapter.py b/python/util/file_object_adapter.py
new file mode 100644
index 0000000..194f7ca
--- /dev/null
+++ b/python/util/file_object_adapter.py
@@ -0,0 +1,72 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""FileObjectAdapter class.
+
+Used in conjunction with PythonOutputStream/PythonInputStream to allow a C++
+OutputStream/InputStream to interact with a Python file-like object.
+"""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import io
+from typing import BinaryIO
+
+from tink.python.cc.clif import python_file_object_adapter
+
+
+class FileObjectAdapter(python_file_object_adapter.PythonFileObjectAdapter):
+  """Adapts a Python file object for use in C++."""
+
+  def __init__(self, file_object: BinaryIO):
+    # Required to fix CLIF "Value invalidated due to capture by std::unique_ptr"
+    super(FileObjectAdapter, self).__init__()
+    self._file_object = file_object
+
+  def write(self, data: bytes) -> int:
+    """Writes to underlying file object and returns number of bytes written."""
+    try:
+      written = self._file_object.write(data)
+      return 0 if written is None else written
+    except io.BlockingIOError as e:
+      return e.characters_written
+
+  def close(self) -> None:
+    self._file_object.close()
+
+  def read(self, size: int) -> bytes:
+    """Reads at most 'size' bytes from the underlying file object.
+
+    Args:
+      size: A non-negative integer, maximum number of bytes to read.
+
+    Returns:
+      Bytes that were read. An empty bytes object is returned if no bytes are
+      available at the moment.
+
+    Raises:
+      EOFError if the file object is already at EOF.
+    """
+    if size < 0:
+      raise ValueError('size must be non-negative')
+
+    try:
+      data = self._file_object.read(size)
+      if data is None:
+        return b''
+      elif not data and size > 0:
+        raise EOFError('EOF')
+      return data
+    except io.BlockingIOError:
+      return b''
diff --git a/python/util/file_object_adapter_test.py b/python/util/file_object_adapter_test.py
new file mode 100644
index 0000000..6cf4086
--- /dev/null
+++ b/python/util/file_object_adapter_test.py
@@ -0,0 +1,116 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Tests for tink.python.util.file_object_adapter."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+import io
+
+from absl.testing import absltest
+# TODO(b/141106504) Replace this with unittest.mock
+import mock
+from tink.python.util import file_object_adapter
+
+
+class FileObjectAdapterTest(absltest.TestCase):
+
+  def test_basic_write(self):
+    file_object = io.BytesIO()
+    adapter = file_object_adapter.FileObjectAdapter(file_object)
+
+    self.assertEqual(9, adapter.write(b'something'))
+    self.assertEqual(b'something', file_object.getvalue())
+    adapter.close()
+
+  def test_multiple_write(self):
+    file_object = io.BytesIO()
+    adapter = file_object_adapter.FileObjectAdapter(file_object)
+
+    self.assertEqual(9, adapter.write(b'something'))
+    self.assertEqual(3, adapter.write(b'123'))
+    self.assertEqual(3, adapter.write(b'456'))
+    self.assertEqual(b'something123456', file_object.getvalue())
+
+  def test_write_after_close(self):
+    file_object = io.BytesIO()
+    adapter = file_object_adapter.FileObjectAdapter(file_object)
+
+    adapter.close()
+    self.assertRaises(ValueError, adapter.write, b'something')
+
+  def test_write_returns_none(self):
+    file_object = mock.Mock()
+    file_object.write = mock.Mock(return_value=None)
+    adapter = file_object_adapter.FileObjectAdapter(file_object)
+
+    self.assertEqual(0, adapter.write(b'something'))
+
+  def test_write_raises_blocking_error(self):
+    file_object = mock.Mock()
+    file_object.write = mock.Mock(side_effect=io.BlockingIOError(None, None, 5))
+    adapter = file_object_adapter.FileObjectAdapter(file_object)
+
+    self.assertEqual(5, adapter.write(b'something'))
+
+  def test_partial_write(self):
+    file_object = mock.Mock()
+    file_object.write = mock.Mock(wraps=lambda data: len(data) - 1)
+    adapter = file_object_adapter.FileObjectAdapter(file_object)
+
+    self.assertEqual(8, adapter.write(b'something'))
+
+  def test_basic_read(self):
+    file_object = io.BytesIO(b'something')
+    adapter = file_object_adapter.FileObjectAdapter(file_object)
+
+    self.assertEqual(adapter.read(9), b'something')
+
+  def test_multiple_read(self):
+    file_object = io.BytesIO(b'something')
+    adapter = file_object_adapter.FileObjectAdapter(file_object)
+
+    self.assertEqual(adapter.read(3), b'som')
+    self.assertEqual(adapter.read(3), b'eth')
+    self.assertEqual(adapter.read(3), b'ing')
+
+  def test_read_returns_none(self):
+    file_object = mock.Mock()
+    file_object.read = mock.Mock(return_value=None)
+    adapter = file_object_adapter.FileObjectAdapter(file_object)
+
+    self.assertEqual(adapter.read(10), b'')
+
+  def test_read_eof(self):
+    file_object = mock.Mock()
+    file_object.read = mock.Mock(return_value=b'')
+    adapter = file_object_adapter.FileObjectAdapter(file_object)
+
+    self.assertRaises(EOFError, adapter.read, 10)
+
+  def test_read_size_0(self):
+    file_object = io.BytesIO(b'something')
+    adapter = file_object_adapter.FileObjectAdapter(file_object)
+
+    self.assertEqual(adapter.read(0), b'')
+
+  def test_read_raises_blocking_error(self):
+    file_object = mock.Mock()
+    file_object.read = mock.Mock(side_effect=io.BlockingIOError(None, None))
+    adapter = file_object_adapter.FileObjectAdapter(file_object)
+
+    self.assertEqual(adapter.read(10), b'')
+
+
+if __name__ == '__main__':
+  absltest.main()
diff --git a/testdata/BUILD.bazel b/testdata/BUILD.bazel
index b489cd4..907f4c5 100644
--- a/testdata/BUILD.bazel
+++ b/testdata/BUILD.bazel
@@ -1,13 +1,25 @@
 package(default_visibility = ["//visibility:public"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 filegroup(
     name = "credentials",
     testonly = 1,
     srcs = [
+        "aws_credentials_cc.txt",
+        "aws_key_arn.txt",
+        "bad_access_keys_aws.csv",
+        "bad_aws_key_arn.txt",
+        "bad_aws_credentials_cc.txt",
+        "bad_credentials_aws.csv",
+        "bad_gcp_credentials.json",
+        "bad_gcp_key_name.txt",
+        "gcp_key_name.txt",
         "credential.json",
-    ],
+        "credentials_aws.csv",
+        "credentials_aws.cred",
+        "README_AWS.txt",
+],
 )
 
 filegroup(
diff --git a/testdata/README_AWS.txt b/testdata/README_AWS.txt
new file mode 100644
index 0000000..7cd3017
--- /dev/null
+++ b/testdata/README_AWS.txt
@@ -0,0 +1,4 @@
+The AWS Credentials in this folder are used to access only a single Test key.
+Access is also limited to where source IP address is from Google.
+
+Java also expects the credentials as a properties file as documented @ https://docs.aws.amazon.com/AmazonS3/latest/dev/AuthUsingAcctOrUserCredentials.html
diff --git a/testdata/aws_credentials_cc.txt b/testdata/aws_credentials_cc.txt
new file mode 100644
index 0000000..1f96397
--- /dev/null
+++ b/testdata/aws_credentials_cc.txt
@@ -0,0 +1,3 @@
+[default]
+aws_access_key_id = AKIAIIK5X7P3NAHNSNUQ
+aws_secret_access_key = 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
diff --git a/testdata/aws_key_arn.txt b/testdata/aws_key_arn.txt
new file mode 100644
index 0000000..a62cbd9
--- /dev/null
+++ b/testdata/aws_key_arn.txt
@@ -0,0 +1 @@
+arn:aws:kms:us-east-2:235739564943:key/3ee50705-5a82-4f5b-9753-05c4f473922f
diff --git a/tools/testing/cc/bad_aws_access_key.csv b/testdata/bad_access_keys_aws.csv
similarity index 100%
rename from tools/testing/cc/bad_aws_access_key.csv
rename to testdata/bad_access_keys_aws.csv
diff --git a/testdata/bad_aws_credentials_cc.txt b/testdata/bad_aws_credentials_cc.txt
new file mode 100644
index 0000000..6f491d7
--- /dev/null
+++ b/testdata/bad_aws_credentials_cc.txt
@@ -0,0 +1,3 @@
+[default]
+aws_access_key_id = AKIAIOSFODNN7EXAMPLE
+aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
diff --git a/testdata/bad_aws_key_arn.txt b/testdata/bad_aws_key_arn.txt
new file mode 100644
index 0000000..96d4187
--- /dev/null
+++ b/testdata/bad_aws_key_arn.txt
@@ -0,0 +1 @@
+arn:aws:kms:us-east-2:123456789012:key/12345678-1234-1234-1234-123456789012
diff --git a/testdata/bad_credentials_aws.csv b/testdata/bad_credentials_aws.csv
new file mode 100644
index 0000000..9a2e0c4
--- /dev/null
+++ b/testdata/bad_credentials_aws.csv
@@ -0,0 +1,2 @@
+User name,Password,Access key ID,Secret access key
+,,AKIAIOSFODNN7EXAMPLE,wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
diff --git a/testdata/bad_gcp_credentials.json b/testdata/bad_gcp_credentials.json
new file mode 100644
index 0000000..2b84cec
--- /dev/null
+++ b/testdata/bad_gcp_credentials.json
@@ -0,0 +1,12 @@
+{
+  "type": "service_account",
+  "project_id": "tink-test-infrastructure",
+  "private_key_id": "some_bad_private_key_id",
+  "private_key": "-----BEGIN PRIVATE KEY-----\nMIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMtJlaQD79xGIC28\nowTpj7wkdi34piSubtDKttgC3lL00ioyQf/WMqLnyDWySNufCjhavQ7/sxXQAUCL\n5B3WDwM8+mFqQM2wJB18NBWBSfGOFSMwVQyWv7Y/1AFr+PvNKVlw4RZ4G8VuJzXZ\n9v/+5zyKv8py66sGVoHPI+LGfIprAgMBAAECgYEAxcgX8PVrnrITiKwpJxReJbyL\nxnpOmw2i/zza3BseVzOebjNrhw/NQDWl0qhcvmBjvyR5IGiiwiwXq8bu8CBdhRiE\nw3vKf1iuVOKhH07RB2wvCaGbVlB/p15gYau3sTRn5nej0tjYHX7xa/St/DwPk2H/\nxYGTRhyYtNL6wdtMjYECQQD+LVVJf0rLnxyPADTcz7Wdb+FUX79nWtMlzQOEB09+\nJj4ie0kD0cIvTQFjV3pOsg3uW2khFpjg110TXpJJfPjhAkEAzL7RhhfDdL7Dn2zl\n1orUthcGa2pzEAmg1tGBNb1pOg7LbVHKSa3GOOwyPRsActoyrPw18/fXaJdEfByY\ne9kwywJAB7rHMjH9y01uZ+bgtKpYYo5JcvBqeLEpZKfkaHp0b2ioURIguU4Csr+L\nwEKjxIrjo5ECFHCEe6nw+arRlgyH4QJBAIfQmEn733LEzB0n7npXU2yKb363eSYN\nTPzSsoREZdXWVIjqtWYUeKXvwA+apryJEw5+qwdvwxslJI+zpE6bLusCQE6M1lO9\nN6A3PtQv7Z3XwrEE/sPEVv4M4VHj0YHLs/32UuSXq5taMizKILfis1Stry4WjRHp\nQxEqdLrIkb13NH8=\n-----END PRIVATE KEY-----",
+  "client_email": "unit-and-integration-testing@tink-test-infrastructure.iam.gserviceaccount.com",
+  "client_id": "111876397550362269561",
+  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
+  "token_uri": "https://accounts.google.com/o/oauth2/token",
+  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
+  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/unit-and-integration-testing%40tink-test-infrastructure.iam.gserviceaccount.com"
+}
diff --git a/testdata/bad_gcp_key_name.txt b/testdata/bad_gcp_key_name.txt
new file mode 100644
index 0000000..5bd7826
--- /dev/null
+++ b/testdata/bad_gcp_key_name.txt
@@ -0,0 +1,2 @@
+projects/non-existing-project/locations/global/keyRings/some-key-ring/cryptoKeys/aead-key
+
diff --git a/testdata/credentials_aws.cred b/testdata/credentials_aws.cred
new file mode 100644
index 0000000..dff4bec
--- /dev/null
+++ b/testdata/credentials_aws.cred
@@ -0,0 +1,3 @@
+[default]
+accessKey = AKIAIIK5X7P3NAHNSNUQ
+secretKey = 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
diff --git a/testdata/credentials_aws.csv b/testdata/credentials_aws.csv
new file mode 100644
index 0000000..6d21110
--- /dev/null
+++ b/testdata/credentials_aws.csv
@@ -0,0 +1,3 @@
+User name,Password,Access key ID,Secret access key,Console login link
+tink-user1,,AKIAIIK5X7P3NAHNSNUQ,c7k55Gw83QlN1gYBhVPEEn1pKV909sxbll8JOvHF,https://235739564943.signin.aws.amazon.com/console
+
diff --git a/testdata/gcp_key_name.txt b/testdata/gcp_key_name.txt
new file mode 100644
index 0000000..60f69de
--- /dev/null
+++ b/testdata/gcp_key_name.txt
@@ -0,0 +1,2 @@
+projects/tink-test-infrastructure/locations/global/keyRings/unit-and-integration-testing/cryptoKeys/aead-key
+
diff --git a/third_party/aws_sdk_cpp.BUILD.bazel b/third_party/aws_sdk_cpp.BUILD.bazel
index 8cf8aa9..b9cd2a6 100644
--- a/third_party/aws_sdk_cpp.BUILD.bazel
+++ b/third_party/aws_sdk_cpp.BUILD.bazel
@@ -29,7 +29,7 @@
         "aws-cpp-sdk-core/source/utils/crypto/factory/**/*.cpp",
         "aws-cpp-sdk-kms/include/**/*.h",
         "aws-cpp-sdk-kms/source/**/*.cpp",
-        ]),
+    ]),
     hdrs = [
         "aws-cpp-sdk-core/include/aws/core/SDKConfig.h",
     ],
diff --git a/third_party/clif.BUILD.bazel b/third_party/clif.BUILD.bazel
new file mode 100644
index 0000000..7186f63
--- /dev/null
+++ b/third_party/clif.BUILD.bazel
@@ -0,0 +1,25 @@
+sh_binary(
+    name = "pyclif",
+    srcs = ["clif/bin/pyclif"],
+    visibility = ["//visibility:public"],
+)
+
+sh_binary(
+    name = "proto",
+    srcs = ["clif/bin/pyclif_proto"],
+    visibility = ["//visibility:public"],
+)
+
+cc_library(
+    name = "cpp_runtime",
+    srcs = glob(
+        ["clif/python/*.cc"],
+        exclude = ["clif/python/*_test.cc"],
+    ),
+    hdrs = glob(["clif/python/*.h"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "@local_config_python//:python_headers",
+        "@com_google_protobuf//:protobuf",
+    ],
+)
diff --git a/third_party/clif.bzl b/third_party/clif.bzl
new file mode 100644
index 0000000..d836613
--- /dev/null
+++ b/third_party/clif.bzl
@@ -0,0 +1,438 @@
+"""Provide bazel rules for OSS CLIF."""
+
+# Label for our OSS CLIF binary pyclif.
+CLIF_PYCLIF = "@clif//:pyclif"
+
+# Label for our OSS CLIF protobuf compiler.
+CLIF_PROTO = "@clif//:proto"
+
+# Label for our OSS CLIF C++ runtime headers and sources.
+CLIF_CPP_RUNTIME = "@clif//:cpp_runtime"
+
+# Additional CC compilation flags, if any.
+EXTRA_CC_FLAGS = []
+
+_PROTO_LIBRARY_SUFFIX = "_pyclif"
+
+PYCLIF_PYEXT_SUFFIX = ".so"
+
+PYCLIF_CC_LIB_SUFFIX = "_cclib"
+
+PYCLIF_WRAP_SUFFIX = "_clif_wrap"
+
+def _clif_wrap_cc_impl(ctx):
+    """Executes CLIF cmdline tool to produce C++ python model from a CLIF spec."""
+    if len(ctx.files.srcs) != 1:
+        fail("Exactly one CLIF source file label must be specified.", "srcs")
+
+    clif_spec_file = ctx.files.srcs[0]
+
+    # Inputs is a set of all of the things we depend on, not inputs to the CLIF
+    # program itself.
+    inputs = depset([clif_spec_file])
+    for dep in ctx.attr.deps:
+        inputs += dep.cc.transitive_headers
+    inputs += ctx.files._cliflib
+    inputs += ctx.files.clif_deps
+    inputs += ctx.files.toolchain_deps
+
+    # Compute the set of include directories for CLIF so it can find header files
+    # used in the CLIF specification. These are the repo roots for all of our
+    # inputs (aka deps) plus all of the quote and system includes for our C++
+    # deps.
+    include_dirs = depset(_get_repository_roots(ctx, inputs))
+    for dep in ctx.attr.deps:
+        include_dirs += dep.cc.quote_include_directories
+        include_dirs += dep.cc.system_include_directories
+
+    # Construct our arguments for CLIF.
+    args = [
+        "--py3output",
+        "--modname",
+        ctx.attr.package_name + "." + ctx.attr.module_name,
+        "-c",
+        ctx.outputs.cc_out.path,
+        "-g",
+        ctx.outputs.h_out.path,
+        "-i",
+        ctx.outputs.ccinit_out.path,
+        "--prepend",
+        "clif/python/types.h",
+    ]
+    include_args = ["-I" + i for i in include_dirs.to_list()]
+
+    # Add these includes to CLIF itself.
+    args += include_args
+
+    # Add these includes to those passed through by CLIF to its C++ matcher.
+    args += ["-f" + " ".join(include_args + EXTRA_CC_FLAGS)]
+
+    # The last argument is the actual CLIF specification file.
+    args += [clif_spec_file.path]
+
+    outputs = [ctx.outputs.cc_out, ctx.outputs.h_out, ctx.outputs.ccinit_out]
+    ctx.actions.run(
+        executable = ctx.executable._clif,
+        arguments = args,
+        inputs = inputs.to_list(),
+        outputs = outputs,
+        mnemonic = "CLIF",
+        progress_message = "CLIF wrapping " + clif_spec_file.path,
+    )
+
+_clif_wrap_cc = rule(
+    attrs = {
+        "srcs": attr.label_list(
+            mandatory = True,
+            allow_files = True,
+        ),
+        "deps": attr.label_list(
+            allow_files = True,
+            providers = ["cc"],
+        ),
+        "toolchain_deps": attr.label_list(
+            allow_files = True,
+        ),
+        # For rule "//foo/python:bar_clif" this should be "bar".
+        "module_name": attr.string(mandatory = True),
+        # For rule "//foo/python:bar_clif" this should be "foo/python".
+        "package_name": attr.string(mandatory = True),
+        "clif_deps": attr.label_list(allow_files = True),
+        # Hidden attribute: the Label for our PYCLIF binary itself.
+        "_clif": attr.label(
+            default = Label(CLIF_PYCLIF),
+            executable = True,
+            cfg = "host",
+        ),
+        # Hidden attribute: The label to the C++ CLIF header files.
+        "_cliflib": attr.label(
+            default = Label(CLIF_CPP_RUNTIME),
+            allow_files = True,
+        ),
+    },
+    output_to_genfiles = True,
+    outputs = {
+        "cc_out": "%{module_name}.cc",
+        "h_out": "%{module_name}.h",
+        "ccinit_out": "%{module_name}_init.cc",
+    },
+    implementation = _clif_wrap_cc_impl,
+)
+
+def _get_repository_roots(ctx, files):
+    """Returns abnormal root directories under which files reside.
+
+    When running a ctx.action, source files within the main repository are all
+    relative to the current directory; however, files that are generated or exist
+    in remote repositories will have their root directory be a subdirectory,
+    e.g. bazel-out/local-fastbuild/genfiles/external/jpeg_archive. This function
+    returns the set of these devious directories, ranked and sorted by popularity
+    in order to hopefully minimize the number of I/O system calls within the
+    compiler, because includes have quadratic complexity.
+
+    Args:
+      ctx: context
+      files: list of paths
+    Returns:
+      list of directories
+    """
+    ctx = ctx  # unused
+    result = {}
+    for f in files:
+        root = f.root.path
+        if root:
+            if root not in result:
+                result[root] = 0
+            result[root] -= 1
+        work = f.owner.workspace_root
+        if work:
+            if root:
+                root += "/"
+            root += work
+        if root:
+            if root not in result:
+                result[root] = 0
+            result[root] -= 1
+    return [k for v, k in sorted([(v, k) for k, v in result.items()])]
+
+def _clif_to_lib(label, extension):
+    """Gets a C++/python/etc library corresponding to a CLIF library rule.
+
+    Args:
+      label: string. The name of a clif_rule. If the name is of the
+        form <target>_pyclif we will stripe off the `_pyclif` ending.
+      extension: string. The expected extension of our name library.
+
+    Returns:
+      <target>_extension.
+    """
+    if label.endswith(_PROTO_LIBRARY_SUFFIX):
+        basename = label[:-len(_PROTO_LIBRARY_SUFFIX)]
+    else:
+        basename = label
+    return basename + extension
+
+def pyclifs_to_pyproto_libs(labels):
+    """Gets the py protobuf label for each of pyclif label as a list."""
+    return [_clif_to_lib(name, "_py_pb2") for name in labels]
+
+def pyclifs_to_ccproto_libs(labels):
+    """Gets the cc protobuf label for each of pyclif label as a list."""
+    return [_clif_to_lib(name, "_cc_pb2") for name in labels]
+
+def clif_deps_to_cclibs(labels):
+    """Gets the cc_library name for each of label as a list."""
+    return [_clif_to_lib(name, PYCLIF_CC_LIB_SUFFIX) for name in labels]
+
+def _symlink_impl(ctx):
+    """Creates a symbolic link between src and out."""
+    out = ctx.outputs.out
+    src = ctx.attr.src.files.to_list()[0]
+    cmd = "ln -f -r -s %s %s" % (src.path, out.path)
+    ctx.actions.run_shell(
+        inputs = [src],
+        outputs = [out],
+        command = cmd,
+    )
+
+symlink = rule(
+    implementation = _symlink_impl,
+    attrs = {
+        "src": attr.label(
+            mandatory = True,
+            allow_files = True,
+            single_file = True,
+        ),
+        "out": attr.output(mandatory = True),
+    },
+)
+
+def py_clif_cc(
+        name,
+        srcs,
+        clif_deps = [],
+        pyclif_deps = [],
+        deps = [],
+        copts = [],
+        py_deps = [],
+        **kwargs):
+    """Defines a CLIF wrapper rule making C++ libraries accessible to Python.
+
+    Here are two example working py_clif_cc rules:
+
+    py_clif_cc(
+        name = "proto_cpp",
+        srcs = ["proto_cpp.clif"],
+        pyclif_deps = ["//oss_clif:oss_pyclif"],
+        deps = ["//oss_clif:proto_cpp_lib"],
+    )
+
+    py_clif_cc(
+        name = "pyclif_dep",
+        srcs = ["pyclif_dep.clif"],
+        deps = ["//oss_clif:pyclif_dep_lib"],
+    )
+
+    Args:
+      name: The name of the rule. This name becomes a suitable target for Python
+        libraries to access the C++ code.
+      srcs: A list that must contain a single file named <name>.clif containing
+        our CLIF specification.
+      clif_deps: A list of other CLIF rules included by this one.
+      pyclif_deps: A potentially empty list of pyclif_proto_library rules
+      deps: A list of C++ dependencies.
+      copts: List of copts to provide to our native.cc_library when building our
+        python extension module.
+      py_deps: List of dependencies to provide to our the native.py_library
+        created by this rule.
+      **kwargs: kwargs passed to py_library rule created by this rule.
+    """
+    pyext_so = name + PYCLIF_PYEXT_SUFFIX
+    cc_library_name = name + PYCLIF_CC_LIB_SUFFIX
+    extended_cc_deps = deps + [CLIF_CPP_RUNTIME] + pyclif_deps
+
+    # Here's a rough outline of how we build our pyclif library:
+    #
+    # Suppose we have a module named 'foo'.
+    #
+    # _clif_wrap_cc runs pyclif to produce foo.cc, foo.h, and foo_init.cc which
+    # C++ python extension module.
+    #
+    # native.cc_library is a normal C++ library with those sources, effectively
+    # our "python module" as a bazel C++ library allowing other rules to depend
+    # on that C++ code.
+    #
+    # native.cc_binary depends on foo's cc_library to create a shared python
+    # extension module (.so) which python will load via its dlopen mechanism.
+    # This .so library is also used by the _clif_wrap_cc rule to get include paths
+    # when building CLIF specs depending on other clif specs.
+    #
+    # native.py_library named `name` which provides a python bazel target that
+    # loads the cc_binary, as data, producing a py extension module. This also
+    # allows client python code to depend on this module.
+
+    # This _clif_wrap_cc handles clif_deps differently than most clif.bzl's
+    # do.  That is because we are doing something quite different than the
+    # standard clif.bzl does -- we are replacing the generated extension module
+    # with a symbolic link to protobuf's _message.so.  That file, in turn, is
+    # a dependency of every single Python protocol buffer target.  And it needs
+    # to depend on all of the _cclibs generated by the cc_library rule below.
+    #
+    # So because of all this, the normal strategy of having this rule depend
+    # on clif_deps or clif_deps_to_pyexts(clif_deps) would create circular
+    # dependencies.  Our strategy to avoid those circular dependencies is to
+    # have anything the cc_library rule depends on be only C++ and not Python.
+    # The raw clif_deps are a mixture of C++ and Python, so we have to very
+    # carefully depend on only their C++ part (given by the
+    # clif_deps_to_cclibs).
+    _clif_wrap_cc(
+        name = name + PYCLIF_WRAP_SUFFIX,
+        srcs = srcs,
+        deps = extended_cc_deps + clif_deps_to_cclibs(clif_deps),
+        clif_deps = clif_deps_to_cclibs(clif_deps),
+        toolchain_deps = ["@bazel_tools//tools/cpp:current_cc_toolchain"],
+        module_name = name,
+        # Turns //foo/bar:baz_pyclif into foo.bar to create our fully-qualified
+        # python package name.
+        package_name = native.package_name().replace("/", "."),
+    )
+
+    native.cc_library(
+        name = cc_library_name,
+        hdrs = [
+            name + ".h",
+        ],
+        srcs = [
+            name + ".cc",
+            name + "_init.cc",
+        ],
+        copts = copts + EXTRA_CC_FLAGS,
+        deps = extended_cc_deps + clif_deps_to_cclibs(clif_deps),
+    )
+
+    # To prevent ODR violations, all of the extensions must live in one
+    # extension module.  And to be compatible with existing protobuf
+    # generated code, that module must be _message.so.
+    symlink(
+        name = name + "_symlink",
+        out = pyext_so,
+        src = "@protobuf_archive//:python/google/protobuf/pyext/_message.so",
+    )
+
+    # We create our python module which is just a thin wrapper around our real
+    # python module pyext_so (producing name.so for python to load). This
+    # rule allows python code to depend on this module, even through its written
+    # in C++.
+    native.py_library(
+        name = name,
+        srcs = [],
+        srcs_version = "PY2AND3",
+        deps = pyclifs_to_pyproto_libs(pyclif_deps) + clif_deps + py_deps,
+        data = [pyext_so],
+        **kwargs
+    )
+
+# Copied from: devtools/clif/python/clif_build_rule.bzl with heavy
+# modifications.
+
+def _clif_proto_parser_rule_impl(ctx):
+    """Implementation of _run_clif_proto_parser_rule."""
+    proto_file = ctx.files.src[0]
+    args = [
+        "-c",
+        ctx.outputs.cc.path,
+        "-h",
+        ctx.outputs.hdr.path,
+        "--strip_dir=%s" % ctx.configuration.genfiles_dir.path,
+        "--source_dir='.'",
+        "%s" % proto_file.path,
+    ]
+    inputs = []
+    for d in ctx.attr.deps:
+        if "proto" in dir(d):
+            inputs += list(d[ProtoInfo].transitive_sources)
+    ctx.actions.run(
+        mnemonic = "ClifProtoLibraryGeneration",
+        arguments = args,
+        executable = ctx.executable.parser,
+        inputs = inputs,
+        outputs = [ctx.outputs.hdr, ctx.outputs.cc],
+    )
+
+_run_clif_proto_parser_rule = rule(
+    attrs = {
+        "src": attr.label(allow_files = [".proto"]),
+        "hdr": attr.output(),
+        "cc": attr.output(),
+        "deps": attr.label_list(),
+        "parser": attr.label(
+            executable = True,
+            default = Label(CLIF_PROTO),
+            cfg = "host",
+        ),
+    },
+    output_to_genfiles = True,
+    implementation = _clif_proto_parser_rule_impl,
+)
+
+def pyclif_proto_library(
+        name,
+        proto_lib,
+        proto_srcfile = "",
+        deps = [],
+        visibility = None,
+        compatible_with = None,
+        testonly = None):
+    """Generate C++ CLIF extension for using a proto and dependent py_proto_lib.
+
+    Args:
+      name: generated cc_library (name.h) to use in py_clif_cc clif_deps
+      proto_lib: name of a proto_library rule
+      proto_srcfile: the proto name if it does not match proto_lib rule name
+      deps: passed to cc_library
+      visibility: passed to all generated "files": name.h name.a name_pb2.py
+      compatible_with: compatibility list
+      testonly: available for test rules only flag (default from package)
+    """
+    if not name.endswith(_PROTO_LIBRARY_SUFFIX):
+        fail("The name of the 'pyclif_proto_library' target should be of the " +
+             "form '<PROTO_FILE>%s' where the proto " % _PROTO_LIBRARY_SUFFIX +
+             "file being wrapped has the name '<PROTO_FILE>.proto'.")
+    if proto_srcfile:
+        required_name = proto_srcfile[:-len(".proto")] + _PROTO_LIBRARY_SUFFIX
+        if name != required_name:
+            fail("The name of the 'pyclif_proto_library' target should be " +
+                 "'%s' as it is wrapping %s." % (required_name, proto_srcfile))
+
+    hdr_file = name + ".h"
+    cpp_file = name + ".cc"
+    clifrule = name + "_clif_rule"
+    src = name[:-len(_PROTO_LIBRARY_SUFFIX)] + ".proto"
+
+    _run_clif_proto_parser_rule(
+        name = clifrule,
+        src = src,
+        hdr = hdr_file,
+        cc = cpp_file,
+        deps = deps + [proto_lib],
+        testonly = testonly,
+    )
+
+    # In OSS world, we cannot provide proto_lib as a direct dependency to our
+    # cc_library as it doesn't provide a cc file:
+    #   in deps attribute of cc_library rule //oss_clif:oss_pyclif: proto_library
+    #   rule '//oss_clif:oss_proto' is misplaced here (expected cc_inc_library,
+    #   cc_library, objc_library, experimental_objc_library or cc_proto_library).
+    # So we need to synthesize our protobuf cc library name from our name as
+    #   pyclif_name  = proto_pyclif
+    #   cc_proto_lib = proto_cc_pb2
+    native.cc_library(
+        name = name,
+        srcs = [cpp_file],
+        hdrs = [hdr_file],
+        deps = deps + [CLIF_CPP_RUNTIME] + pyclifs_to_ccproto_libs([name]),
+        visibility = visibility,
+        compatible_with = compatible_with,
+        testonly = testonly,
+        copts = EXTRA_CC_FLAGS,
+    )
diff --git a/third_party/curl.BUILD.bazel b/third_party/curl.BUILD.bazel
index 55a1f45..be09335 100644
--- a/third_party/curl.BUILD.bazel
+++ b/third_party/curl.BUILD.bazel
@@ -220,7 +220,6 @@
             "lib/vtls/openssl.c",
         ],
     }),
-
     hdrs = [
         ":configure",
         "include/curl/curl.h",
@@ -266,7 +265,7 @@
     visibility = ["//visibility:public"],
     deps = [
         "@boringssl//:ssl",
-        "@zlib_archive//:zlib",
+        "@zlib//:zlib",
     ],
 )
 
diff --git a/third_party/nanopb.BUILD.bazel b/third_party/nanopb.BUILD.bazel
new file mode 100644
index 0000000..402b215
--- /dev/null
+++ b/third_party/nanopb.BUILD.bazel
@@ -0,0 +1,26 @@
+# Description:
+#   Nanopb, a tiny ANSI C protobuf implementation for use on embedded devices.
+# Nanopb project provides its own BUILD file, but without defined PB_FIELD_16BIT,
+# which makes the compiler unhappy.
+
+licenses(["notice"])  # Apache 2.0
+
+cc_library(
+    name = "nanopb",
+    srcs = [
+        "pb_common.c",
+        "pb_decode.c",
+        "pb_encode.c",
+    ],
+    hdrs = [
+        "pb.h",
+        "pb_common.h",
+        "pb_decode.h",
+        "pb_encode.h",
+    ],
+    defines = [
+        "PB_FIELD_16BIT",
+    ],
+    includes = ["."],
+    visibility = ["//visibility:public"],
+)
diff --git a/third_party/py/BUILD.bazel b/third_party/py/BUILD.bazel
new file mode 100644
index 0000000..75f17d4
--- /dev/null
+++ b/third_party/py/BUILD.bazel
@@ -0,0 +1 @@
+# This file is intentionally empty.
diff --git a/third_party/py/BUILD.tpl b/third_party/py/BUILD.tpl
new file mode 100644
index 0000000..19ff2ca
--- /dev/null
+++ b/third_party/py/BUILD.tpl
@@ -0,0 +1,12 @@
+licenses(["restricted"])
+
+package(default_visibility = ["//visibility:public"])
+
+cc_library(
+    name = "python_headers",
+    hdrs = [":python_include"],
+    includes = ["python_include"],
+)
+
+%{PYTHON_INCLUDE_GENRULE}
+%{PYTHON_IMPORT_LIB_GENRULE}
diff --git a/third_party/py/python_configure.bzl b/third_party/py/python_configure.bzl
new file mode 100644
index 0000000..c55e641
--- /dev/null
+++ b/third_party/py/python_configure.bzl
@@ -0,0 +1,309 @@
+"""Repository rule for Python autoconfiguration.
+
+`python_configure` depends on the following environment variables:
+
+  * `PYTHON_BIN_PATH`: location of python binary.
+  * `PYTHON_LIB_PATH`: Location of python libraries.
+"""
+
+_BAZEL_SH = "BAZEL_SH"
+_PYTHON_BIN_PATH = "PYTHON_BIN_PATH"
+_PYTHON_LIB_PATH = "PYTHON_LIB_PATH"
+_TF_PYTHON_CONFIG_REPO = "TF_PYTHON_CONFIG_REPO"
+
+def _tpl(repository_ctx, tpl, substitutions = {}, out = None):
+    if not out:
+        out = tpl
+    repository_ctx.template(
+        out,
+        Label("//third_party/py:%s.tpl" % tpl),
+        substitutions,
+    )
+
+def _fail(msg):
+    """Output failure message when auto configuration fails."""
+    red = "\033[0;31m"
+    no_color = "\033[0m"
+    fail("%sPython Configuration Error:%s %s\n" % (red, no_color, msg))
+
+def _execute(
+        repository_ctx,
+        cmdline,
+        error_msg = None,
+        error_details = None,
+        empty_stdout_fine = False):
+    """Executes an arbitrary shell command.
+
+    Args:
+      repository_ctx: the repository_ctx object
+      cmdline: list of strings, the command to execute
+      error_msg: string, a summary of the error if the command fails
+      error_details: string, details about the error or steps to fix it
+      empty_stdout_fine: bool, if True, an empty stdout result is fine, otherwise
+        it's an error
+    Return:
+      the result of repository_ctx.execute(cmdline)
+    """
+    result = repository_ctx.execute(cmdline)
+    if result.stderr or not (empty_stdout_fine or result.stdout):
+        _fail("\n".join([
+            error_msg.strip() if error_msg else "Repository command failed",
+            result.stderr.strip(),
+            error_details if error_details else "",
+        ]))
+    return result
+
+def _read_dir(repository_ctx, src_dir):
+    """Returns a string with all files in a directory.
+
+    Finds all files inside a directory, traversing subfolders and following
+    symlinks. The returned string contains the full path of all files
+    separated by line breaks.
+    """
+    find_result = _execute(
+        repository_ctx,
+        ["find", src_dir, "-follow", "-type", "f"],
+        empty_stdout_fine = True,
+    )
+    result = find_result.stdout
+    return result
+
+def _genrule(src_dir, genrule_name, command, outs):
+    """Returns a string with a genrule.
+
+    Genrule executes the given command and produces the given outputs.
+    """
+    return (
+        "genrule(\n" +
+        '    name = "' +
+        genrule_name + '",\n' +
+        "    outs = [\n" +
+        outs +
+        "\n    ],\n" +
+        '    cmd = """\n' +
+        command +
+        '\n   """,\n' +
+        ")\n"
+    )
+
+def _norm_path(path):
+    """Returns a path with '/' and remove the trailing slash."""
+    path = path.replace("\\", "/")
+    if path[-1] == "/":
+        path = path[:-1]
+    return path
+
+def _symlink_genrule_for_dir(
+        repository_ctx,
+        src_dir,
+        dest_dir,
+        genrule_name,
+        src_files = [],
+        dest_files = []):
+    """Returns a genrule to symlink(or copy if on Windows) a set of files.
+
+    If src_dir is passed, files will be read from the given directory; otherwise
+    we assume files are in src_files and dest_files
+    """
+    if src_dir != None:
+        src_dir = _norm_path(src_dir)
+        dest_dir = _norm_path(dest_dir)
+        files = "\n".join(sorted(_read_dir(repository_ctx, src_dir).splitlines()))
+
+        # Create a list with the src_dir stripped to use for outputs.
+        dest_files = files.replace(src_dir, "").splitlines()
+        src_files = files.splitlines()
+    command = []
+    outs = []
+    for i in range(len(dest_files)):
+        if dest_files[i] != "":
+            # If we have only one file to link we do not want to use the dest_dir, as
+            # $(@D) will include the full path to the file.
+            dest = "$(@D)/" + dest_dir + dest_files[i] if len(dest_files) != 1 else "$(@D)/" + dest_files[i]
+
+            # Copy the headers to create a sandboxable setup.
+            cmd = "cp -f"
+            command.append(cmd + ' "%s" "%s"' % (src_files[i], dest))
+            outs.append('        "' + dest_dir + dest_files[i] + '",')
+    genrule = _genrule(
+        src_dir,
+        genrule_name,
+        " && ".join(command),
+        "\n".join(outs),
+    )
+    return genrule
+
+def _get_python_bin(repository_ctx):
+    """Gets the python bin path."""
+    python_bin = repository_ctx.os.environ.get(_PYTHON_BIN_PATH)
+    if python_bin != None:
+        return python_bin
+    python_bin_path = repository_ctx.which("python")
+    if python_bin_path != None:
+        return str(python_bin_path)
+    _fail("Cannot find python in PATH, please make sure " +
+          "python is installed and add its directory in PATH, or --define " +
+          "%s='/something/else'.\nPATH=%s" % (
+              _PYTHON_BIN_PATH,
+              repository_ctx.os.environ.get("PATH", ""),
+          ))
+
+def _get_bash_bin(repository_ctx):
+    """Gets the bash bin path."""
+    bash_bin = repository_ctx.os.environ.get(_BAZEL_SH)
+    if bash_bin != None:
+        return bash_bin
+    else:
+        bash_bin_path = repository_ctx.which("bash")
+        if bash_bin_path != None:
+            return str(bash_bin_path)
+        else:
+            _fail("Cannot find bash in PATH, please make sure " +
+                  "bash is installed and add its directory in PATH, or --define " +
+                  "%s='/path/to/bash'.\nPATH=%s" % (
+                      _BAZEL_SH,
+                      repository_ctx.os.environ.get("PATH", ""),
+                  ))
+
+def _get_python_lib(repository_ctx, python_bin):
+    """Gets the python lib path."""
+    python_lib = repository_ctx.os.environ.get(_PYTHON_LIB_PATH)
+    if python_lib != None:
+        return python_lib
+    print_lib = ("<<END\n" +
+                 "from __future__ import print_function\n" +
+                 "import site\n" +
+                 "import os\n" +
+                 "\n" +
+                 "try:\n" +
+                 "  input = raw_input\n" +
+                 "except NameError:\n" +
+                 "  pass\n" +
+                 "\n" +
+                 "python_paths = []\n" +
+                 "if os.getenv('PYTHONPATH') is not None:\n" +
+                 "  python_paths = os.getenv('PYTHONPATH').split(':')\n" +
+                 "try:\n" +
+                 "  library_paths = site.getsitepackages()\n" +
+                 "except AttributeError:\n" +
+                 " from distutils.sysconfig import get_python_lib\n" +
+                 " library_paths = [get_python_lib()]\n" +
+                 "all_paths = set(python_paths + library_paths)\n" +
+                 "paths = []\n" +
+                 "for path in all_paths:\n" +
+                 "  if os.path.isdir(path):\n" +
+                 "    paths.append(path)\n" +
+                 "if len(paths) >=1:\n" +
+                 "  print(paths[0])\n" +
+                 "END")
+    cmd = "%s - %s" % (python_bin, print_lib)
+    result = repository_ctx.execute([_get_bash_bin(repository_ctx), "-c", cmd])
+    return result.stdout.strip("\n")
+
+def _check_python_lib(repository_ctx, python_lib):
+    """Checks the python lib path."""
+    cmd = 'test -d "%s" -a -x "%s"' % (python_lib, python_lib)
+    result = repository_ctx.execute([_get_bash_bin(repository_ctx), "-c", cmd])
+    if result.return_code == 1:
+        _fail("Invalid python library path: %s" % python_lib)
+
+def _check_python_bin(repository_ctx, python_bin):
+    """Checks the python bin path."""
+    cmd = '[[ -x "%s" ]] && [[ ! -d "%s" ]]' % (python_bin, python_bin)
+    result = repository_ctx.execute([_get_bash_bin(repository_ctx), "-c", cmd])
+    if result.return_code == 1:
+        _fail("--define %s='%s' is not executable. Is it the python binary?" % (
+            _PYTHON_BIN_PATH,
+            python_bin,
+        ))
+
+def _get_python_include(repository_ctx, python_bin):
+    """Gets the python include path."""
+    result = _execute(
+        repository_ctx,
+        [
+            python_bin,
+            "-c",
+            "from __future__ import print_function;" +
+            "from distutils import sysconfig;" +
+            "print(sysconfig.get_python_inc())",
+        ],
+        error_msg = "Problem getting python include path.",
+        error_details = ("Is the Python binary path set up right? " +
+                         "(See ./configure or " + _PYTHON_BIN_PATH + ".) " +
+                         "Is distutils installed?"),
+    )
+    return result.stdout.splitlines()[0]
+
+def _get_python_import_lib_name(repository_ctx, python_bin):
+    """Get Python import library name (pythonXY.lib) on Windows."""
+    result = _execute(
+        repository_ctx,
+        [
+            python_bin,
+            "-c",
+            "import sys;" +
+            'print("python" + str(sys.version_info[0]) + ' +
+            '      str(sys.version_info[1]) + ".lib")',
+        ],
+        error_msg = "Problem getting python import library.",
+        error_details = ("Is the Python binary path set up right? " +
+                         "(See ./configure or " + _PYTHON_BIN_PATH + ".) "),
+    )
+    return result.stdout.splitlines()[0]
+
+def _create_local_python_repository(repository_ctx):
+    """Creates the repository containing files set up to build with Python."""
+    python_bin = _get_python_bin(repository_ctx)
+    _check_python_bin(repository_ctx, python_bin)
+    python_lib = _get_python_lib(repository_ctx, python_bin)
+    _check_python_lib(repository_ctx, python_lib)
+    python_include = _get_python_include(repository_ctx, python_bin)
+    python_include_rule = _symlink_genrule_for_dir(
+        repository_ctx,
+        python_include,
+        "python_include",
+        "python_include",
+    )
+    python_import_lib_genrule = ""
+
+    _tpl(repository_ctx, "BUILD", {
+        "%{PYTHON_INCLUDE_GENRULE}": python_include_rule,
+        "%{PYTHON_IMPORT_LIB_GENRULE}": python_import_lib_genrule,
+    })
+
+def _create_remote_python_repository(repository_ctx, remote_config_repo):
+    """Creates pointers to a remotely configured repo set up to build with Python.
+    """
+    repository_ctx.template("BUILD", Label(remote_config_repo + ":BUILD"), {})
+
+def _python_autoconf_impl(repository_ctx):
+    """Implementation of the python_autoconf repository rule."""
+    if _TF_PYTHON_CONFIG_REPO in repository_ctx.os.environ:
+        _create_remote_python_repository(
+            repository_ctx,
+            repository_ctx.os.environ[_TF_PYTHON_CONFIG_REPO],
+        )
+    else:
+        _create_local_python_repository(repository_ctx)
+
+python_configure = repository_rule(
+    implementation = _python_autoconf_impl,
+    environ = [
+        _BAZEL_SH,
+        _PYTHON_BIN_PATH,
+        _PYTHON_LIB_PATH,
+        _TF_PYTHON_CONFIG_REPO,
+    ],
+)
+"""Detects and configures the local Python.
+
+Add the following to your WORKSPACE FILE:
+
+```python
+python_configure(name = "local_config_python")
+```
+
+Args:
+  name: A unique name for this workspace rule.
+"""
diff --git a/third_party/rules_protobuf/BUILD.bazel b/third_party/rules_protobuf/BUILD.bazel
index 0988550..001dcb9 100644
--- a/third_party/rules_protobuf/BUILD.bazel
+++ b/third_party/rules_protobuf/BUILD.bazel
@@ -1,5 +1,5 @@
 package(default_visibility = ["//visibility:public"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 exports_files(["LICENSE"])
diff --git a/third_party/rules_protobuf/objc/BUILD.bazel b/third_party/rules_protobuf/objc/BUILD.bazel
index f56423e..dbee277 100644
--- a/third_party/rules_protobuf/objc/BUILD.bazel
+++ b/third_party/rules_protobuf/objc/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//visibility:public"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 load("//third_party/rules_protobuf/protobuf:rules.bzl", "proto_language")
 
diff --git a/third_party/rules_protobuf/protobuf/BUILD.bazel b/third_party/rules_protobuf/protobuf/BUILD.bazel
index f631b6d..e6d05e7 100644
--- a/third_party/rules_protobuf/protobuf/BUILD.bazel
+++ b/third_party/rules_protobuf/protobuf/BUILD.bazel
@@ -1,3 +1,3 @@
 package(default_visibility = ["//visibility:public"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
diff --git a/third_party/rules_protobuf/protobuf/internal/proto_compile.bzl b/third_party/rules_protobuf/protobuf/internal/proto_compile.bzl
index 975667a..cd64373 100644
--- a/third_party/rules_protobuf/protobuf/internal/proto_compile.bzl
+++ b/third_party/rules_protobuf/protobuf/internal/proto_compile.bzl
@@ -20,10 +20,10 @@
     """
     filename = "%s.%sFile.params" % (path, mnemonic)
     f = ctx.new_file(ctx.configuration.bin_dir, filename)
-    ctx.file_action(
+    ctx.actions.write(
         output = f,
         content = "\n".join(["set -e"] + cmds),
-        executable = True,
+        is_executable = True,
     )
     return f
 
@@ -73,7 +73,7 @@
     return "../" * depth + path
 
 def _get_import_mappings_for(files, prefix, label):
-    """For a set of files that belong the the given context label, create a mapping to the given prefix."""
+    """For a set of files that belong to the given context label, create a mapping to the given prefix."""
 
     mappings = {}
     for file in files:
@@ -100,7 +100,7 @@
     ctx = run.ctx
     execdir = run.data.execdir
     name = run.lang.name
-    protojar = ctx.new_file("%s_%s.jar" % (run.data.label.name, name))
+    protojar = ctx.actions.declare_file("%s_%s.jar" % (run.data.label.name, name))
     builder["outputs"] += [protojar]
     builder[name + "_jar"] = protojar
     builder[name + "_outdir"] = _get_offset_path(execdir, protojar.path)
@@ -110,7 +110,7 @@
     ctx = run.ctx
     execdir = run.data.execdir
     name = run.lang.name
-    jslib = ctx.new_file(run.data.label.name + run.lang.pb_file_extensions[0])
+    jslib = ctx.actions.declare_file(run.data.label.name + run.lang.pb_file_extensions[0])
     builder["jslib"] = [jslib]
     builder["outputs"] += [jslib]
 
@@ -124,7 +124,7 @@
     name = run.lang.name
     protojar = builder[name + "_jar"]
     srcjar_name = "%s_%s.srcjar" % (run.data.label.name, name)
-    srcjar = ctx.new_file("%s_%s.srcjar" % (run.data.label.name, name))
+    srcjar = ctx.actions.declare_file("%s_%s.srcjar" % (run.data.label.name, name))
     run.ctx.action(
         mnemonic = "CpJarToSrcJar",
         inputs = [protojar],
@@ -159,7 +159,7 @@
         for ext in exts:
             path = _get_relative_dirname(ctx.label.package, file)
             path.append(base + ext)
-            pbfile = ctx.new_file("/".join(path))
+            pbfile = ctx.actions.declare_file("/".join(path))
             builder["outputs"] += [pbfile]
 
 def _build_output_libdir(run, builder):
@@ -313,9 +313,7 @@
     protoc_cmd = [protoc] + list(unit.args) + imports + srcs
     manifest = [f.short_path for f in unit.outputs]
 
-    transitive_units = depset()
-    for u in unit.data.transitive_units:
-        transitive_units = transitive_units | u.inputs
+    transitive_units = depset(transitive = [u.inputs for u in unit.data.transitive_units])
     inputs = depset(transitive = [unit.inputs, transitive_units]).to_list() + [unit.compiler]
     outputs = list(unit.outputs)
 
@@ -363,7 +361,7 @@
         for i in range(len(outputs)):
             print(" > output%s: %s" % (i, outputs[i]))
 
-    ctx.action(
+    ctx.actions.run_shell(
         mnemonic = "ProtoCompile",
         command = " && ".join(cmds),
         inputs = inputs,
diff --git a/third_party/rules_protobuf/protobuf/rules.bzl b/third_party/rules_protobuf/protobuf/rules.bzl
index 80f6f72..ecaaf19 100644
--- a/third_party/rules_protobuf/protobuf/rules.bzl
+++ b/third_party/rules_protobuf/protobuf/rules.bzl
@@ -2,5 +2,16 @@
 
 """
 
-load("//third_party/rules_protobuf/protobuf:internal/proto_compile.bzl", "proto_compile")
-load("//third_party/rules_protobuf/protobuf:internal/proto_language.bzl", "proto_language", "proto_language_deps")
+load(
+    "//third_party/rules_protobuf/protobuf:internal/proto_compile.bzl",
+    _proto_compile = "proto_compile",
+)
+load(
+    "//third_party/rules_protobuf/protobuf:internal/proto_language.bzl",
+    _proto_language = "proto_language",
+    _proto_language_deps = "proto_language_deps",
+)
+
+proto_compile = _proto_compile
+proto_language = _proto_language
+proto_language_deps = _proto_language_deps
diff --git a/third_party/wycheproof/BUILD.bazel b/third_party/wycheproof/BUILD.bazel
new file mode 100644
index 0000000..36a1a6b
--- /dev/null
+++ b/third_party/wycheproof/BUILD.bazel
@@ -0,0 +1,10 @@
+package(default_visibility = ["//tools/build_defs:internal_pkg"])
+
+licenses(["notice"])
+
+filegroup(
+    name = "testvectors",
+    srcs = glob([
+        "testvectors/*.json",
+    ]),
+)
diff --git a/third_party/wycheproof/README.md b/third_party/wycheproof/README.md
new file mode 100644
index 0000000..af0832d
--- /dev/null
+++ b/third_party/wycheproof/README.md
@@ -0,0 +1,4 @@
+Imported wycheproof test vectors from https://github.com/google/wycheproof
+
+Commit: c313761979d74b0417230eddd0f87d0cfab2b46b
+
diff --git a/third_party/wycheproof/testvectors/aes_cbc_pkcs5_test.json b/third_party/wycheproof/testvectors/aes_cbc_pkcs5_test.json
new file mode 100644
index 0000000..711978c
--- /dev/null
+++ b/third_party/wycheproof/testvectors/aes_cbc_pkcs5_test.json
@@ -0,0 +1,2084 @@
+{
+  "algorithm" : "AES-CBC-PKCS5",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "BadPadding" : "The ciphertext in this test vector is the message encrypted with an invalid or unexpected padding. This allows to find implementations that are not properly checking the padding during decryption."
+  },
+  "numberOfTests" : 183,
+  "header" : [],
+  "testGroups" : [
+    {
+      "ivSize" : 128,
+      "keySize" : 128,
+      "type" : "IndCpaTest",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "empty message",
+          "key" : "e34f15c7bd819930fe9d66e0c166e61c",
+          "iv" : "da9520f7d3520277035173299388bee2",
+          "msg" : "",
+          "ct" : "b10ab60153276941361000414aed0a9d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "message size divisible by block size",
+          "key" : "e09eaa5a3f5e56d279d5e7a03373f6ea",
+          "iv" : "c9ee3cd746bf208c65ca9e72a266d54f",
+          "msg" : "ef4eab37181f98423e53e947e7050fd0",
+          "ct" : "d1fa697f3e2e04d64f1a0da203813ca5bc226a0b1d42287b2a5b994a66eaf14a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "message size divisible by block size",
+          "key" : "9bd3902ed0996c869b572272e76f3889",
+          "iv" : "8b2e86a9a185cfa6f51c7cc595b822bc",
+          "msg" : "a7ba19d49ee1ea02f098aa8e30c740d893a4456ccc294040484ed8a00a55f93e",
+          "ct" : "514cbc69aced506926deacdeb0cc0a5a07d540f65d825b65c7db0075cf930a06e0124ae598461cab0b3251baa853e377",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "message size divisible by block size",
+          "key" : "75ce184447cada672e02290310d224f7",
+          "iv" : "2717d10eb2eea3b39ec257e43307a260",
+          "msg" : "c774810a31a6421ad8eaafd5c22fa2455e2c167fee4a0b73ff927b2d96c69da1e939407b86b1c19bcfc69c434c3cf8a2",
+          "ct" : "137c824d7f7dc36f24216dde37c2e1c10cee533f6453de92e44b898fc3037d2e9e19d67a96387136dd9717a56e28614a5c177158f402ce2936fd98d1feb6a817",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "small plaintext size",
+          "key" : "e1e726677f4893890f8c027f9d8ef80d",
+          "iv" : "155fd397579b0b5d991d42607f2cc9ad",
+          "msg" : "3f",
+          "ct" : "599d77aca16910b42d8b4ac9560efe1b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "small plaintext size",
+          "key" : "b151f491c4c006d1f28214aa3da9a985",
+          "iv" : "4eb836be6808db264cb1111a3283b394",
+          "msg" : "27d9",
+          "ct" : "74e20bf03a0ad4b49edc86a1b19c3d1d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "small plaintext size",
+          "key" : "c36ff15f72777ee21deec07b63c1a0cd",
+          "iv" : "a8446c27ea9068d8d924d5c4eac91157",
+          "msg" : "50b428",
+          "ct" : "3f7a26558ba51cf352219d34c46907ae",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "small plaintext size",
+          "key" : "32b9c5c78c3a0689a86052420fa1e8fc",
+          "iv" : "ef026d27da3702d7bb72e5e364a8f8f2",
+          "msg" : "0b9262ec",
+          "ct" : "c29d1463baccc558fd720c897da5bb98",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "small plaintext size",
+          "key" : "43151bbaef367277ebfc97509d0aa49c",
+          "iv" : "c9defd3929dcd6c355c144e9750dd869",
+          "msg" : "eaa91273e7",
+          "ct" : "e24a717914f9cc8eaa1dc96f7840d6af",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "small plaintext size",
+          "key" : "481440298525cc261f8159159aedf62d",
+          "iv" : "ce91e0454b0123f1ead0f158826459e9",
+          "msg" : "6123c556c5cc",
+          "ct" : "f080e487f4e5b7aed793ea95ffe4bb30",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "small plaintext size",
+          "key" : "9ca26eb88731efbf7f810d5d95e196ac",
+          "iv" : "1cb7bc8fe00523e7743d3cd9f483d6fe",
+          "msg" : "7e48f06183aa40",
+          "ct" : "27cadee413ed901f51c9366d731d95f6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "small plaintext size",
+          "key" : "48f0d03e41cc55c4b58f737b5acdea32",
+          "iv" : "a345f084229dbfe0ceab6c6939571532",
+          "msg" : "f4a133aa6d5985a0",
+          "ct" : "59bf12427b51a3aee0c9d3c540d04d24",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "small plaintext size",
+          "key" : "1c958849f31996b28939ce513087d1be",
+          "iv" : "e5b6f73f132355b7be7d977bea068dfc",
+          "msg" : "b0d2fee11b8e2f86b7",
+          "ct" : "1a0a18355f8ca4e6e2cf31da18d070da",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "small plaintext size",
+          "key" : "39de0ebea97c09b2301a90009a423253",
+          "iv" : "c7cd10ca949ea03e7d4ba204b69e09b8",
+          "msg" : "81e5c33b4c620852f044",
+          "ct" : "cef498ea61715a27f400418d1d5bfbf0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "small plaintext size",
+          "key" : "91656d8fc0aced60ddb1c4006d0dde53",
+          "iv" : "bb8c9af30821dfeb7124392a554d9f01",
+          "msg" : "7b3e440fe566790064b2ec",
+          "ct" : "7ab43ddc45835ce40d2280bcea6a63f2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "small plaintext size",
+          "key" : "af7d5134720b5386158d51ea126e7cf9",
+          "iv" : "54c3b90ca6e933f9094334d0263d3775",
+          "msg" : "7cc6fcc925c20f3c83b5567c",
+          "ct" : "c70b457c945ad40895cf4c8be3ce7c66",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "small plaintext size",
+          "key" : "4ed56753de6f75a032ebabca3ce27971",
+          "iv" : "9a2c5e91d4f0b9b9da64b46c5c2c8cb2",
+          "msg" : "0c8c0f5619d9f8da5339281285",
+          "ct" : "f9900afee2acfe63f8f15d81bbf64c39",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "small plaintext size",
+          "key" : "beba50c936b696c15e25046dffb23a64",
+          "iv" : "cf7951501104e1434309e6b936ec1742",
+          "msg" : "821ea8532fbabffb6e3d212e9b46",
+          "ct" : "da4137bd8ac78e75a700b3de806f2d6f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "small plaintext size",
+          "key" : "501d81ebf912ddb87fbe3b7aac1437bc",
+          "iv" : "90f5cf4fbfd2e2a1ab8eef402617bd5c",
+          "msg" : "2368e3c3636b5e8e94d2081adbf798",
+          "ct" : "fed05321d11d978e2ec32527ecfce06c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "plaintext size > 16",
+          "key" : "831e664c9e3f0c3094c0b27b9d908eb2",
+          "iv" : "54f2459e40e002763144f4752cde2fb5",
+          "msg" : "26603bb76dd0a0180791c4ed4d3b058807",
+          "ct" : "8d55dc10584e243f55d2bdbb5758b7fabcd58c8d3785f01c7e3640b2a1dadcd9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "plaintext size > 16",
+          "key" : "cbffc6c8c7f76f46349c32d666f4efb0",
+          "iv" : "088e01c2c65b26e7ad6af7b92ea09d73",
+          "msg" : "6df067add738195fd55ac2e76b476971b9a0e6d8",
+          "ct" : "e9199842355ea0c3dbf1b2a94fef1c802a95d024df9e407883cf5bf1f02c3cdc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "plaintext size > 16",
+          "key" : "fda6a01194beb462953d7e6c49b32dac",
+          "iv" : "d9c9468796a2f5741b84d2d41430c5d3",
+          "msg" : "f60ae3b036abcab78c98fc1d4b67970c0955cb6fe24483f8907fd73319679b",
+          "ct" : "19beb4db2be0f3aff0083583038b2281a77c85b5f345ba4d2bc7f742a14f9247",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "plaintext size > 16",
+          "key" : "efd9caa8ac68e9e29acdae57e93bcea8",
+          "iv" : "c98b47808add45c0c891983ec4b09846",
+          "msg" : "3e1d2001f1e475b972738936443a5f51eedaf802a66fadf2406cfaadb0549149fcb9f485e534dc2d",
+          "ct" : "84904fc92bd2e7590aa268e667370327b9446f41067dd40d3e5091a63a0d5687e4926e00cc3cb461c3b85d80ee2da818",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "plaintext size > 16",
+          "key" : "37e4dbdc436258d5a9adb9f205c77cf3",
+          "iv" : "08e9410de244d3f40607ebae38fa74e7",
+          "msg" : "24a874aec067116ad22eb55846ded3f5e86919a135585c929a86d92b2958fed110e52e33804887243584a6a94402cc9a105e0c940ec335bd2890f16dcce3fc8bd02873c80ade6f1ac08683130bcca454",
+          "ct" : "1d1391593a336be4b207295ad0542bc4ef2f39053066e12c38f71603f377fd42f4f0b2b5a42cdfeaee2af039f06fcf347abe171af3157ff07f3cdd3b33e11a60caecf9890325c132eeb66ab847278d165c26bca7c30486bb2fd83b63c5ff7ae0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "zero padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "",
+          "ct" : "aa62606a287476777b92d8e4c4e53028",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 26,
+          "comment" : "zero padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "6162636465666768",
+          "ct" : "ada437b682c92384b6c23ec10a21b3d8",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 27,
+          "comment" : "zero padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "303132333435363738396162636465",
+          "ct" : "26c5b3e540ee3dd6b52d14afd01a44f8",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 28,
+          "comment" : "zero padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "fbcbdfdaaf17980be939c0b243266ecbc0deb417e98aba3ee12fea2921f8ae51",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 29,
+          "comment" : "zero padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "fbcbdfdaaf17980be939c0b243266ecb1188ff22f6563f6173440547d1e0dfd8",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 30,
+          "comment" : "padding with 0xff",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "",
+          "ct" : "726570a34cea08139d9f836579102a0e",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 31,
+          "comment" : "padding with 0xff",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "6162636465666768",
+          "ct" : "c8ef7ac3fd659ce7157d72a25f0a5048",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 32,
+          "comment" : "padding with 0xff",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "303132333435363738396162636465",
+          "ct" : "6123c889bbc766acd4bca4cb982f9978",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 33,
+          "comment" : "padding with 0xff",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "fbcbdfdaaf17980be939c0b243266ecb442cd16f7410fca70924b573f7967e84",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 34,
+          "comment" : "padding with 0xff",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "fbcbdfdaaf17980be939c0b243266ecbb20f899b0e7c1d65b931af94b5c44c25",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 35,
+          "comment" : "bit padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "",
+          "ct" : "50aeed98a820c5a037a5aa4d4ef3090b",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 36,
+          "comment" : "bit padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "6162636465666768",
+          "ct" : "25ee339006f948f42713543c62467ef9",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 37,
+          "comment" : "bit padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "303132333435363738396162636465",
+          "ct" : "97914574676ed5b8db0b6f3931195b3f",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 38,
+          "comment" : "bit padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "fbcbdfdaaf17980be939c0b243266ecb2874a1e2d28dd18e5573df9fd59fd789",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 39,
+          "comment" : "bit padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "fbcbdfdaaf17980be939c0b243266ecbb547c4fddbdcd3e02f438a2e48587594",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 40,
+          "comment" : "padding longer than 1 block",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "",
+          "ct" : "d17ccbb26f0aa95f397b20063547349bac24c5429cbea591e96595cccc11451b",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 41,
+          "comment" : "padding longer than 1 block",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "6162636465666768",
+          "ct" : "fc07025e81d43efa85f92afdf8781b1e88598e12d6812df43733e93414b9e901",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 42,
+          "comment" : "padding longer than 1 block",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "303132333435363738396162636465",
+          "ct" : "deb1746f4e9e0be4a21825b071b6e93303031651e0c59091e2ae0fbcce11b987",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 43,
+          "comment" : "padding longer than 1 block",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "fbcbdfdaaf17980be939c0b243266ecb563d35096fde10ccb6f768438c9eb4ec90f399b76924c716e9f94143263306c6",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 44,
+          "comment" : "padding longer than 1 block",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "fbcbdfdaaf17980be939c0b243266ecbc8fd2e2c5362acf5212bd47859aa827d8469b87b0e6adafe3dba98c1885b6345",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 45,
+          "comment" : "ANSI X.923 padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "",
+          "ct" : "ca5dd2d09bd56eec9e8acaeca20af68e",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 46,
+          "comment" : "ANSI X.923 padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "6162636465666768",
+          "ct" : "01e53a5ec9b0957c45f79ed0f4b2b982",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 47,
+          "comment" : "ANSI X.923 padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "fbcbdfdaaf17980be939c0b243266ecbd3909bb3457e5b946ff709be9a2ed84d",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 48,
+          "comment" : "ANSI X.923 padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "fbcbdfdaaf17980be939c0b243266ecbc5ab3ab637166a6a067b82b5672c08f8",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 49,
+          "comment" : "ISO 10126 padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "",
+          "ct" : "ba0726bd6dea11382b19c842e2ddead2",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 50,
+          "comment" : "ISO 10126 padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "6162636465666768",
+          "ct" : "22f18b85c729903744fb8db5ed2840d4",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 51,
+          "comment" : "ISO 10126 padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "fbcbdfdaaf17980be939c0b243266ecb6b103fbe43519a18880b7e6d9153e1c2",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 52,
+          "comment" : "ISO 10126 padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "fbcbdfdaaf17980be939c0b243266ecbe00bdb15b8a61285447498700d35e0c6",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 53,
+          "comment" : "padding longer than message",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "",
+          "ct" : "d17ccbb26f0aa95f397b20063547349b",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 54,
+          "comment" : "padding longer than message",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "6162636465666768",
+          "ct" : "2056dfa339fa00be6836999411a98c76",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 55,
+          "comment" : "padding longer than message",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "303132333435363738396162636465",
+          "ct" : "f92628f6418d8d9c9afac233861b3835",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 56,
+          "comment" : "padding longer than message",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "fbcbdfdaaf17980be939c0b243266ecbc0c41093b495a7d5a080d976493fd0e7",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 57,
+          "comment" : "padding longer than message",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "fbcbdfdaaf17980be939c0b243266ecb6770446a5ccaa26f7d4f970cc5834eba",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 58,
+          "comment" : " invalid padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "",
+          "ct" : "4ff3e623fdd432608c183f40864177af",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 59,
+          "comment" : " invalid padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "6162636465666768",
+          "ct" : "6a1ef1e6ae6a788777aabd9ccf3cf43a",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 60,
+          "comment" : " invalid padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "fbcbdfdaaf17980be939c0b243266ecbee1345cd513161b241f4ae2799b0327f",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 61,
+          "comment" : " invalid padding",
+          "key" : "db4f3e5e3795cc09a073fa6a81e5a6bc",
+          "iv" : "23468aa734f5f0f19827316ff168e94f",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "fbcbdfdaaf17980be939c0b243266ecbe0d539beef6f2d4f7cda4fd9f4f05570",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        }
+      ]
+    },
+    {
+      "ivSize" : 128,
+      "keySize" : 192,
+      "type" : "IndCpaTest",
+      "tests" : [
+        {
+          "tcId" : 62,
+          "comment" : "empty message",
+          "key" : "3d6bf9edae6d881eade0ff8c7076a4835b71320c1f36b631",
+          "iv" : "db20f9a6f4d6b4e478f1a4b9d4051d34",
+          "msg" : "",
+          "ct" : "ff0c315873b4b1872abef2353b792ef0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "message size divisible by block size",
+          "key" : "f4bfa5aa4f0f4d62cf736cd2969c43d580fdb92f2753bedb",
+          "iv" : "69a76dc4da64d89c580eb75ae975ec39",
+          "msg" : "0e239f239705b282ce2200fe20de1165",
+          "ct" : "7dbd573e4db58a318edfe29f199d8cda538a49f36486337c2711163e55fd5d0b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "message size divisible by block size",
+          "key" : "9d11abc1fcb248a436598e695be12c3c2ed90a18ba09d62c",
+          "iv" : "6525667350930fb945dd1895a3abfcd1",
+          "msg" : "aa5182cae2a8fb068c0b3fb2be3e57ae523d13dffd1a944587707c2b67447f3f",
+          "ct" : "bd0258909e5b72438d95ca4b29c8a79c6228fd06a3b2fa06f7659654c7b24610f23f2fb16313b7d3614cb0cd16fabb8e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "message size divisible by block size",
+          "key" : "7e41d83181659a2c38da5ead353cdb04c2b4d4a3cfe58e25",
+          "iv" : "3943d8fddd5bb2a59772df31a31a8fff",
+          "msg" : "8a32d11c7a11aa72e13381632b1310f4fd90fc209a6a350e61c069a561871214f9c04fc1df7354cbe4d8d639c525d324",
+          "ct" : "6cbeacf8de25d7dd9dcdc087bf2f80873b1eb335400589076f8d2bf81e294c5d72b85eb8ac9558b0de9e9fbee4b18716e5220c507fbb9d319a08f67816765ca6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "small plaintext size",
+          "key" : "915429743435c28997a33b33b6574a953d81dae0e7032e6a",
+          "iv" : "1379d48493f743e6a149deb3b9bab31e",
+          "msg" : "58",
+          "ct" : "519925956d32e4fa350b1144f088e4e8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "small plaintext size",
+          "key" : "f0c288ba26b284f9fb321b444a6517b3cdda1a799d55fdff",
+          "iv" : "48c7f44b43a1279d820733e6cb30617a",
+          "msg" : "0f7e",
+          "ct" : "bfb90aa7de1bdeed5bdc5703bdfd9630",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "small plaintext size",
+          "key" : "6b55e4d4fd6847a80a6bfb0dcc0aa93f9fd797fc5c50292e",
+          "iv" : "2c287b38cc30c8c351b087b91a6a97ba",
+          "msg" : "33f530",
+          "ct" : "b1a25816908c086f26037d10b7be9ad9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "small plaintext size",
+          "key" : "1eb21a9e995a8e45c9e71ecbd6fe615b3e0318007c64b644",
+          "iv" : "61f6060919c9c09ef06be28f39c344aa",
+          "msg" : "3aa73c48",
+          "ct" : "74dbdecbfa94b71d2d6ef03200c7d095",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "small plaintext size",
+          "key" : "710e2d5d4a9f0bc7e50796655e046a18cc5769d7764355da",
+          "iv" : "7682005907bfef3ce00196a17ad2246d",
+          "msg" : "7e4c690a88",
+          "ct" : "10c860aaee23c3c3c1b9306b189dd80d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "small plaintext size",
+          "key" : "d8c09ea400779b63e774bdacd0cb7b5dd6f736ca23d52acf",
+          "iv" : "1f6c912997ce007701e5fdf407c6b421",
+          "msg" : "e9520280973b",
+          "ct" : "673dcd444386930a0cc577fab4501e5c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "small plaintext size",
+          "key" : "8e67e9a0863b55bed408866f1cbc05357abe3f9d79f406f2",
+          "iv" : "5854033ae50de090678432781a168b6c",
+          "msg" : "4880b412287a0b",
+          "ct" : "059e5f72a81d8820add8eae8fabcdd42",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "small plaintext size",
+          "key" : "28d8da67806410e5565bcc5a9d7ab9fb357413fa0158378c",
+          "iv" : "003b2d86d8b636c58cf664565572d5e6",
+          "msg" : "004e3f4a4e6db955",
+          "ct" : "c412159fd5ae20d771b7d2e734124d6a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "small plaintext size",
+          "key" : "dc968dd89fd602bb7eca6f3a8a13e4f59c08d02a514b1934",
+          "iv" : "3f22b50f888ab9424ba871d15aac55b7",
+          "msg" : "41a25354efeb1bc3b8",
+          "ct" : "4aba571c2c5ab9a6140f16efc68c8ec1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "small plaintext size",
+          "key" : "7658951c0f620d82afd92756cc2d7983b79da3e56fdd1b78",
+          "iv" : "e4b8dde04b49fa6b88bfccd8d70c21d1",
+          "msg" : "f0e82fb5c5666f4af49f",
+          "ct" : "66d1b9152a8cd1a88eab341c775070b4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "small plaintext size",
+          "key" : "d9574c3a221b986690931faac5258d9d3c52362b2cb9b054",
+          "iv" : "7753f616cd8796c9b8a3bbfbe6cb1e7f",
+          "msg" : "178ea8404ba54ee4e4522c",
+          "ct" : "d9377788e2881a48f9347786db7df51f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "small plaintext size",
+          "key" : "704409bab28085c44981f28f75dd143a4f747106f63f262e",
+          "iv" : "eae9ee19ccb7f8b087675709c4d35f73",
+          "msg" : "cda5709e7f115624e74ab031",
+          "ct" : "db825f4434ea3bb53576fa7385fb7dfe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "small plaintext size",
+          "key" : "d8d06ef6a53bbff5c8f12d791b8f4c67e574bf440736d1cc",
+          "iv" : "a6aaff339a729d30a7ec1328db36d23e",
+          "msg" : "a1171eae1979f48345dd9485a0",
+          "ct" : "3e7287df2a5ed9de4d817e352bd47ea7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "small plaintext size",
+          "key" : "71129e781613f39d9ac39fbde2628b44c250c14deb5ef9e2",
+          "iv" : "92fda71e88c70d18ed71b992735a2150",
+          "msg" : "967593cc64bcbf7f3c58d04cb82b",
+          "ct" : "17c3ade4b469ae614760039a8fa6250e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "small plaintext size",
+          "key" : "850fc859e9f7b89a367611dee6698f33962d8245ca8dc331",
+          "iv" : "ed6596c86b98123ad2f3c573e974d051",
+          "msg" : "586f4f171af116519061a8e0e77940",
+          "ct" : "9cafecff2a28d02f732573f65a2cadca",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "plaintext size > 16",
+          "key" : "cfd3f68873d81a27d2bfce876c79f6e609074dec39e34614",
+          "iv" : "c45b52a240eba3bdde5dfd57f3d474fb",
+          "msg" : "b1973cb25aa87ef9d1a8888b0a0f5c04c6",
+          "ct" : "401ad889bdb9d38816c782e00b168ccccde9bf75f4be868ceb91237e8b37b750",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "plaintext size > 16",
+          "key" : "b7f165bced1613da5e747fdf9255832d30c07f2deeb5a326",
+          "iv" : "07ece5fe02266e073499fd4d66929034",
+          "msg" : "289647ea8d0ff31375a82aa1c620903048bb1d0e",
+          "ct" : "455d516e87851e6c894578a0f7126e0acbc7cfbb1d80296647ab89a79dfa6f71",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "plaintext size > 16",
+          "key" : "9bbe6e004fb260dadb02b68b78954f1da5e6a2d02e0aeefe",
+          "iv" : "d799157bc1f77c182027be918b30783a",
+          "msg" : "665423092ce95b927e98b8082030f58e33f3ec1b0c29532c2f421855f00f97",
+          "ct" : "cbf541330a5a9bda24984976b0cf96ba08ef521fa2cdb3df839128570e222ac4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "plaintext size > 16",
+          "key" : "1381fbd5e79045d40f29790fc1a436c95b040a046ebf0b0f",
+          "iv" : "fdf97645e4192ba84728bbf6683f79de",
+          "msg" : "d575dce596dd0a2cd1c18dab7eb0948fafb8669969a48b6314493bfb8daf8acacd51382f9bb5b357",
+          "ct" : "03225f08592efca14ad8ecf822465e8be4157465d0be150dd3d645b6fef1b19ca7bbaa5940b2a7895fa2b0ee55b0d4ec",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "plaintext size > 16",
+          "key" : "1bb4ed0e8435e20729f48c1b7e3af6e69e4cebf0731131cf",
+          "iv" : "059685f59247eea5d3f2a1532cb9d6b2",
+          "msg" : "6d29dab6a0568c961ab3c825e0d89940cef06c63ade7e557cd3e92792eaf23c8cd5a0f029c63b1cdce4754ccfad7a73c7c9e50ffe081e9136f5e9a424077339de12ea43572afe1b034e833e5887763aa",
+          "ct" : "27ad00313f328f0d3e6c3238ab560cb7243a9f54f7dff79b5a7a879439993d458017f09e8d3f694098bc19e61fe54085138664abb51a5b328cf2c9ce5d59726fff5e1b7553c143d9e0493c51cab23ff2ecdad91bd72bb12b32f3b611f9a4225d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "zero padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "",
+          "ct" : "2c010faa25c68c3b30b8c1491c316d5f",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 87,
+          "comment" : "zero padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "6162636465666768",
+          "ct" : "818454d433154a8e00e8f590b8a1c38c",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 88,
+          "comment" : "zero padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "303132333435363738396162636465",
+          "ct" : "0a7423fae3f4c8d4633f839d36f2e9ff",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 89,
+          "comment" : "zero padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "a7cfcdabcc5a2736a2708c1cb0b61432e83f6e522c371e6e71bde539595b70b7",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 90,
+          "comment" : "zero padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "a7cfcdabcc5a2736a2708c1cb0b6143254d15f47701fa54f5957828f386e1d97",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 91,
+          "comment" : "padding with 0xff",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "",
+          "ct" : "6ded36cc7603e514014dfb7199900676",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 92,
+          "comment" : "padding with 0xff",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "6162636465666768",
+          "ct" : "839f772f8e5f50afdc02f954094869fe",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 93,
+          "comment" : "padding with 0xff",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "303132333435363738396162636465",
+          "ct" : "eefe3553c099c187929b287e54f95726",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 94,
+          "comment" : "padding with 0xff",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "a7cfcdabcc5a2736a2708c1cb0b61432d0531a2641d40467353542d79ce20ea8",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 95,
+          "comment" : "padding with 0xff",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "a7cfcdabcc5a2736a2708c1cb0b61432aaf08a090ecf66167ba5958100be7950",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 96,
+          "comment" : "bit padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "",
+          "ct" : "c0e402c8bbdda18c8ddd86470bd4b244",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 97,
+          "comment" : "bit padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "6162636465666768",
+          "ct" : "dc185d4572565e01131e471ec4c48125",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 98,
+          "comment" : "bit padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "303132333435363738396162636465",
+          "ct" : "3ad1ddf3c3b320398785e6ec6544e9a2",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 99,
+          "comment" : "bit padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "a7cfcdabcc5a2736a2708c1cb0b614325876f90cfbbdbcd85e8252d37c44c638",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 100,
+          "comment" : "bit padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "a7cfcdabcc5a2736a2708c1cb0b61432d18f57216b0e6426d911998a0e44156b",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 101,
+          "comment" : "padding longer than 1 block",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "",
+          "ct" : "f1605abb4e6628347c616da350fe243043a8d7b6aea244ca013f45241d802213",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 102,
+          "comment" : "padding longer than 1 block",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "6162636465666768",
+          "ct" : "a5f027fb9514ec8844534d452c940feb2c1807f57ed628156cf753f2ab698356",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 103,
+          "comment" : "padding longer than 1 block",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "303132333435363738396162636465",
+          "ct" : "f346fbc9744d723c42bbb2a4c934cdd4f1019e58c226cb2491fed621271a38f3",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 104,
+          "comment" : "padding longer than 1 block",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "a7cfcdabcc5a2736a2708c1cb0b6143263eb325d36e13aa1d3dd1d7e071700104c7eb3e22e0859aa06296bc3194bb909",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 105,
+          "comment" : "padding longer than 1 block",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "a7cfcdabcc5a2736a2708c1cb0b61432219485d41584bd110a6d7a9cad472815d93921c48d4bcb509fdf2e63d7627c37",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 106,
+          "comment" : "ANSI X.923 padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "",
+          "ct" : "215571a18a70140f3a0fd4c1b2dd6316",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 107,
+          "comment" : "ANSI X.923 padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "6162636465666768",
+          "ct" : "2529985ec0ec3cf4bd22746e00d7bdc6",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 108,
+          "comment" : "ANSI X.923 padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "a7cfcdabcc5a2736a2708c1cb0b614329a8058657ac4a150e995cf83efccf051",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 109,
+          "comment" : "ANSI X.923 padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "a7cfcdabcc5a2736a2708c1cb0b614328a068626780ba600f880bd5323f8ac15",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 110,
+          "comment" : "ISO 10126 padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "",
+          "ct" : "13e75f9ffe2afa81b9a2e7faf74aab6d",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 111,
+          "comment" : "ISO 10126 padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "6162636465666768",
+          "ct" : "a382197fe491f5c3f91b629dc47c3d58",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 112,
+          "comment" : "ISO 10126 padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "a7cfcdabcc5a2736a2708c1cb0b614320b842e5d6e32660263ff814a0277659f",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 113,
+          "comment" : "ISO 10126 padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "a7cfcdabcc5a2736a2708c1cb0b614321d2f736515cfe17921800eb392e0139d",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 114,
+          "comment" : "padding longer than message",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "",
+          "ct" : "f1605abb4e6628347c616da350fe2430",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 115,
+          "comment" : "padding longer than message",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "6162636465666768",
+          "ct" : "b3602ff0f797cbbdde35105d27e55b94",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 116,
+          "comment" : "padding longer than message",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "303132333435363738396162636465",
+          "ct" : "0334c1bc34b597f60a639e74d8b45c4e",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 117,
+          "comment" : "padding longer than message",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "a7cfcdabcc5a2736a2708c1cb0b61432c3f9fe42d9715035bcda97d27405ced7",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 118,
+          "comment" : "padding longer than message",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "a7cfcdabcc5a2736a2708c1cb0b61432362b014a9abdaf25ae1f6dfb99d03d9d",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 119,
+          "comment" : " invalid padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "",
+          "ct" : "97ab405b86c388f144cf74fbb9358493",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 120,
+          "comment" : " invalid padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "6162636465666768",
+          "ct" : "691f6009802f0fb4920928db7eca1349",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 121,
+          "comment" : " invalid padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "a7cfcdabcc5a2736a2708c1cb0b61432a99fc96a6fa0c9fcb18de1672d74914d",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 122,
+          "comment" : " invalid padding",
+          "key" : "9e20311eaf2eaf3e3a04bc52564e67313c84940a2996e3f2",
+          "iv" : "a3fe6f76e8f582830bbe83574a7bb729",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "a7cfcdabcc5a2736a2708c1cb0b61432dd1bb2e98102322fb1aa92c979d4c7c3",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        }
+      ]
+    },
+    {
+      "ivSize" : 128,
+      "keySize" : 256,
+      "type" : "IndCpaTest",
+      "tests" : [
+        {
+          "tcId" : 123,
+          "comment" : "empty message",
+          "key" : "7bf9e536b66a215c22233fe2daaa743a898b9acb9f7802de70b40e3d6e43ef97",
+          "iv" : "eb38ef61717e1324ae064e86f1c3e797",
+          "msg" : "",
+          "ct" : "e7c166554d1bb32792c981fa674cc4d8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "message size divisible by block size",
+          "key" : "612e837843ceae7f61d49625faa7e7494f9253e20cb3adcea686512b043936cd",
+          "iv" : "9ec7b863ac845cad5e4673da21f5b6a9",
+          "msg" : "cc37fae15f745a2f40e2c8b192f2b38d",
+          "ct" : "299295be47e9f5441fe83a7a811c4aeb2650333e681e69fa6b767d28a6ccf282",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "message size divisible by block size",
+          "key" : "96e1e4896fb2cd05f133a6a100bc5609a7ac3ca6d81721e922dadd69ad07a892",
+          "iv" : "e70d83a77a2ce722ac214c00837acedf",
+          "msg" : "91a17e4dfcc3166a1add26ff0e7c12056e8a654f28a6de24f4ba739ceb5b5b18",
+          "ct" : "a615a39ff8f59f82cf72ed13e1b01e32459700561be112412961365c7a0b58aa7a16d68c065e77ebe504999051476bd7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "message size divisible by block size",
+          "key" : "649e373e681ef52e3c10ac265484750932a9918f28fb824f7cb50adab39781fe",
+          "iv" : "bd003c0a9d804c29f053a77cb380cb47",
+          "msg" : "39b447bd3a01983c1cb761b456d69000948ceb870562a536126a0d18a8e7e49b16de8fe672f13d0808d8b7d957899917",
+          "ct" : "ed3ed8ecdbabc0a8c06259e913f3ab9a1f1dc6d05e5dfdd9c80e1008f3423064d540681291bbd3e159820fee3ff190a68fe506d8ab9e62c8e7b3816093336dbc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "small plaintext size",
+          "key" : "e754076ceab3fdaf4f9bcab7d4f0df0cbbafbc87731b8f9b7cd2166472e8eebc",
+          "iv" : "014d2e13dfbcb969ba3bb91442d52eca",
+          "msg" : "40",
+          "ct" : "42c0b89a706ed2606cd94f9cb361fa51",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "small plaintext size",
+          "key" : "ea3b016bdd387dd64d837c71683808f335dbdc53598a4ea8c5f952473fafaf5f",
+          "iv" : "fae3e2054113f6b3b904aadbfe59655c",
+          "msg" : "6601",
+          "ct" : "b90c326b72eb222ddb4dae47f2bc223c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "small plaintext size",
+          "key" : "73d4709637857dafab6ad8b2b0a51b06524717fedf100296644f7cfdaae1805b",
+          "iv" : "203cd3e0068e43d38b6f2e48a188f252",
+          "msg" : "f1d300",
+          "ct" : "567c45c5e6d570bef583d21cac43757d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "small plaintext size",
+          "key" : "d5c81b399d4c0d1583a13da56de6d2dc45a66e7b47c24ab1192e246dc961dd77",
+          "iv" : "abcf220eede012279c3a2d33295ff273",
+          "msg" : "2ae63cbf",
+          "ct" : "c45afe62fc9351ad0fc9b03bc2f3a91f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "small plaintext size",
+          "key" : "2521203fa0dddf59d837b2830f87b1aa61f958155df3ca4d1df2457cb4284dc8",
+          "iv" : "01373953578902909ae4f6cb0a72587c",
+          "msg" : "af3a015ea1",
+          "ct" : "281fa533d0740cc6cdf94dd1a5f7402d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "small plaintext size",
+          "key" : "665a02bc265a66d01775091da56726b6668bfd903cb7af66fb1b78a8a062e43c",
+          "iv" : "3fb0d5ecd06c71150748b599595833cb",
+          "msg" : "3f56935def3f",
+          "ct" : "3f3f39697bd7e88d85a14132be1cbc48",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "small plaintext size",
+          "key" : "facd75b22221380047305bc981f570e2a1af38928ea7e2059e3af5fc6b82b493",
+          "iv" : "27a2db6114ece34fb6c23302d9ba07c6",
+          "msg" : "57bb86beed156f",
+          "ct" : "379990d91557614836381d5026fa04a0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "small plaintext size",
+          "key" : "505aa98819809ef63b9a368a1e8bc2e922da45b03ce02d9a7966b15006dba2d5",
+          "iv" : "9b2b631e3f24bdc814a14abb3416059e",
+          "msg" : "2e4e7ef728fe11af",
+          "ct" : "7ecefe24caa78a68f4031d40fdb9a43a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "small plaintext size",
+          "key" : "f942093842808ba47f64e427f7351dde6b9546e66de4e7d60aa6f328182712cf",
+          "iv" : "92cfc4eb146b18b73fc76483fc5e1229",
+          "msg" : "852a21d92848e627c7",
+          "ct" : "ffe4ec8baf4af40ab2e7f4d6193fae9c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "small plaintext size",
+          "key" : "64be162b39c6e5f1fed9c32d9f674d9a8cde6eaa2443214d86bd4a1fb53b81b4",
+          "iv" : "4ceed8dcb75b6259dad737bdef96f099",
+          "msg" : "195a3b292f93baff0a2c",
+          "ct" : "ef96215e7950e7be8aae78b9ec8aaf39",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "small plaintext size",
+          "key" : "b259a555d44b8a20c5489e2f38392ddaa6be9e35b9833b67e1b5fdf6cb3e4c6c",
+          "iv" : "2d4cead3f1120a2b4b59419d04951e20",
+          "msg" : "afd73117330c6e8528a6e4",
+          "ct" : "4ed0eac75b05868078303875f82fb4f0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "small plaintext size",
+          "key" : "2c6fc62daa77ba8c6881b3dd6989898fef646663cc7b0a3db8228a707b85f2dc",
+          "iv" : "a10392634143c2a3332fa0fb3f72200a",
+          "msg" : "0ff54d6b6759120c2e8a51e3",
+          "ct" : "f4d298caea7c390fc8c7f558f584f852",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "small plaintext size",
+          "key" : "abab815d51df29f740e4e2079fb798e0152836e6ab57d1536ae8929e52c06eb8",
+          "iv" : "38b916a7ad3a9251ae3bd8865ca3a688",
+          "msg" : "f0058d412a104e53d820b95a7f",
+          "ct" : "5e1c00e2ec829f92b87c6adf5c25262d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "small plaintext size",
+          "key" : "3d5da1af83f7287458bff7a7651ea5d8db72259401333f6b82096996dd7eaf19",
+          "iv" : "bfcc3ac44d12e42d780c1188ac64b57f",
+          "msg" : "aacc36972f183057919ff57b49e1",
+          "ct" : "bf3a04ddb2dbfe7c6dc9e15aa67be25d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "small plaintext size",
+          "key" : "c19bdf314c6cf64381425467f42aefa17c1cc9358be16ce31b1d214859ce86aa",
+          "iv" : "35bc82e3503b95044c6406a8b2c2ecff",
+          "msg" : "5d066a92c300e9b6ddd63a7c13ae33",
+          "ct" : "fdcfa77f5bd09326b4c11f9281b72474",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "plaintext size > 16",
+          "key" : "73216fafd0022d0d6ee27198b2272578fa8f04dd9f44467fbb6437aa45641bf7",
+          "iv" : "4b74bd981ea9d074757c3e2ef515e5fb",
+          "msg" : "d5247b8f6c3edcbfb1d591d13ece23d2f5",
+          "ct" : "fbea776fb1653635f88e2937ed2450ba4e9063e96d7cdba04928f01cb85492fe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "plaintext size > 16",
+          "key" : "c2039f0d05951aa8d9fbdf68be58a37cf99bd1afcedda286a9db470c3729ca92",
+          "iv" : "9a1d8ccc24c5e4d3995480af236be103",
+          "msg" : "ed5b5e28e9703bdf5c7b3b080f2690a605fcd0d9",
+          "ct" : "3a79bb6084c7116b58afe52d7181a0aacee1caa11df959090e2e7b0073d74817",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "plaintext size > 16",
+          "key" : "4f097858a1aec62cf18f0966b2b120783aa4ae9149d3213109740506ae47adfe",
+          "iv" : "400aab92803bcbb44a96ef789655b34e",
+          "msg" : "ee53d8e5039e82d9fcca114e375a014febfea117a7e709d9008d43858e3660",
+          "ct" : "642b11efb79b49e5d038bc7aa29b8c6c3ce0bf11c3a69670eb565799908be66d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 145,
+          "comment" : "plaintext size > 16",
+          "key" : "5f99f7d60653d79f088dd07ef306b65e057d36e053fa1c9f6854425c019fd4df",
+          "iv" : "6eedf45753ffe38f2407fbc28ab5959c",
+          "msg" : "fcc9212c23675c5d69a1266c77389bc955e453daba20034aabbcd502a1b73e05af30f8b7622abdbc",
+          "ct" : "a9b051354f0cf61f11921b330e60f996de796aeb68140a0f9c5962e1f48e4805262fb6f53b26d9bb2fa0e359efe14734",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 146,
+          "comment" : "plaintext size > 16",
+          "key" : "95aaa5df4ccb529e9b2dc929e770c1f419f8e8933bfb36f632f532b3dcad2ba6",
+          "iv" : "f88551c6aa197f9ad80251c2e32d7663",
+          "msg" : "f5735567b7c8312f116517788b091cc6cb1d474b010a77910154fd11c3b2f0cd19f713b63d66492e8cc7ee8ad714783f46c305a26416e11ff4b99ec5ce2550593cc5ec1b86ba6a66d10f82bdff827055",
+          "ct" : "5074f46f1a6d0eeff070d623172eb15bbfc83e7d16466a00c9da5f4545eecf44adbf60cf9ac9aa1a3ec5eca22d4a34a7b21ca44d214c9d04ab1cb0b2c07001de9adb46f3c12f8f48436b516a409bf6cbdf1871dee3115d5cbb7943558b68867e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 147,
+          "comment" : "zero padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "",
+          "ct" : "e07558d746574528fb813f34e3fb7719",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "zero padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "6162636465666768",
+          "ct" : "c01af61276368818a8295f7d4b5bb2fd",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "zero padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "303132333435363738396162636465",
+          "ct" : "97dd9716f06be49160399a5b212250ae",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "zero padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "8881e9e02fa9e3037b397957ba1fb7ce783bb4b4e18d7c646f38e0bb8ff92896",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "zero padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "8881e9e02fa9e3037b397957ba1fb7ce64679a46621b792f643542a735f0bbbf",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "padding with 0xff",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "",
+          "ct" : "c007ddffb76b95208505fe7f3be96172",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "padding with 0xff",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "6162636465666768",
+          "ct" : "e9b7719c4c2b9fa6b94cb50e87b28156",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "padding with 0xff",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "303132333435363738396162636465",
+          "ct" : "77b31f474c4bd489dbadd532643d1fa5",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "padding with 0xff",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "8881e9e02fa9e3037b397957ba1fb7cea0166e9e1c0122cb2e2983fc0fac7176",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "padding with 0xff",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "8881e9e02fa9e3037b397957ba1fb7ce6f0effa789cbb0b875cc53cc8f7b3caf",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "bit padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "",
+          "ct" : "4dd5f910c94700235c9ed239160e34e2",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "bit padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "6162636465666768",
+          "ct" : "94d18b5923f8f3608ae7ad494fbb517e",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "bit padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "303132333435363738396162636465",
+          "ct" : "0c92886dbcb030b873123a25d224da42",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "bit padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "8881e9e02fa9e3037b397957ba1fb7ce851be67798a2937cd6681165da6dce03",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "bit padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "8881e9e02fa9e3037b397957ba1fb7ce45658a37aaebc51098866b0894007e8e",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "padding longer than 1 block",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "",
+          "ct" : "524236e25956e950713bec0d3d579068f34e4d18c4ccab081317dae526fe7fca",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "padding longer than 1 block",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "6162636465666768",
+          "ct" : "d29eb845640c3a8878f51bc50e290aa4a65a34a93728fe8f82fdb8d3d2b7c648",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "padding longer than 1 block",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "303132333435363738396162636465",
+          "ct" : "c34563be2952277c0f5c67ae1d6f847118730dd7f6a502ceef3c4bce5999f7aa",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "padding longer than 1 block",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "8881e9e02fa9e3037b397957ba1fb7cec0f74a1aa92fd9c96f9d15d193d1695c1eb33486e269277612f90f509f0535c2",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "padding longer than 1 block",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "8881e9e02fa9e3037b397957ba1fb7ce151ade309ec5200bacdd83b57ce794cd2b3bf9f8957def829e8465f7db266f9e",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "ANSI X.923 padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "",
+          "ct" : "fb38cbef13f1d5be9c0ac7ed9cbe023c",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "ANSI X.923 padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "6162636465666768",
+          "ct" : "18cf8988abe9a2463a3a75db1fac8bcc",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "ANSI X.923 padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "8881e9e02fa9e3037b397957ba1fb7cee16d6fc4b4d3cdf6f915996e437fd4cc",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "ANSI X.923 padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "8881e9e02fa9e3037b397957ba1fb7cea8f41f61ead6e9936cbe7ee5a1163b9b",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "ISO 10126 padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "",
+          "ct" : "a05c14da0109093c195b4998812fe150",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "ISO 10126 padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "6162636465666768",
+          "ct" : "c477877250c8e4ca2869f35c4757cdb4",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "ISO 10126 padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "8881e9e02fa9e3037b397957ba1fb7ce69f57c6e99c7b9df7d4879ccd15caf3d",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "ISO 10126 padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "8881e9e02fa9e3037b397957ba1fb7ce77f89a247c928f147748ce6bc8fc4b67",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "padding longer than message",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "",
+          "ct" : "524236e25956e950713bec0d3d579068",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "padding longer than message",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "6162636465666768",
+          "ct" : "e03b6f2ae1c963b6dfa40b42d34314b7",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "padding longer than message",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "303132333435363738396162636465",
+          "ct" : "df14f4cbbccca57b9727d68270a1b6c1",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "padding longer than message",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "8881e9e02fa9e3037b397957ba1fb7ceea228bf1edd41c390e2eef140142bc00",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "padding longer than message",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "8881e9e02fa9e3037b397957ba1fb7ce3937e0e9abf7f672a34a500ba8e9099a",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : " invalid padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "",
+          "ct" : "32ac6057df2a5d1e2e5131348c6ebc4e",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : " invalid padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "6162636465666768",
+          "ct" : "df4a7c3b9f4756d30fca0d18e9b28960",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : " invalid padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "30313233343536373839414243444546",
+          "ct" : "8881e9e02fa9e3037b397957ba1fb7ceae2855c47c7988873d57f901e049494b",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : " invalid padding",
+          "key" : "7c78f34dbce8f0557d43630266f59babd1cb92ba624bd1a8f45a2a91c84a804a",
+          "iv" : "f010f61c31c9aa8fa0d5be5f6b0f2f70",
+          "msg" : "3031323334353637383941424344454647",
+          "ct" : "8881e9e02fa9e3037b397957ba1fb7ce0714c8de200b27ac91d9257fc93c13be",
+          "result" : "invalid",
+          "flags" : [
+            "BadPadding"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/aes_ccm_test.json b/third_party/wycheproof/testvectors/aes_ccm_test.json
new file mode 100644
index 0000000..81a5d1b
--- /dev/null
+++ b/third_party/wycheproof/testvectors/aes_ccm_test.json
@@ -0,0 +1,6764 @@
+{
+  "algorithm" : "AES-CCM",
+  "generatorVersion" : "0.4.12",
+  "numberOfTests" : 501,
+  "header" : [],
+  "testGroups" : [
+    {
+      "ivSize" : 96,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "key" : "bedcfb5a011ebc84600fcb296c15af0d",
+          "iv" : "438a547a94ea88dce46c6c85",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "25d1a38495a7dea45bda049705627d10",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "key" : "384ea416ac3c2f51a76e7d8226346d4e",
+          "iv" : "b30c084727ad1c592ac21d12",
+          "aad" : "",
+          "msg" : "35",
+          "ct" : "d7",
+          "tag" : "6be3fd13b7065afc19e3b8a3b96b39fb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "key" : "cae31cd9f55526eb038241fc44cac1e5",
+          "iv" : "b5e006ded553110e6dc56529",
+          "aad" : "",
+          "msg" : "d10989f2c52e94ad",
+          "ct" : "e64d0b64ebb381ec",
+          "tag" : "25409c795d491d804e583917227b73c7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "",
+          "key" : "ffdf4228361ea1f8165852136b3480f7",
+          "iv" : "0e1666f2dc652f7708fb8f0d",
+          "aad" : "",
+          "msg" : "25b12e28ac0ef6ead0226a3b2288c800",
+          "ct" : "aaf596fa5b00aaac27700146aec932a9",
+          "tag" : "848b6735d32c96e4a0532bcdfaf33582",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "",
+          "key" : "c15ed227dd2e237ecd087eaaaad19ea4",
+          "iv" : "965ff6643116ac1443a2dec7",
+          "aad" : "",
+          "msg" : "fee62fde973fe025ad6b322dcdf3c63fc7",
+          "ct" : "0333df2a86d7f094dd8bce75da6c38c5c1",
+          "tag" : "417da29df85a1d134feee8aa35569081",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "",
+          "key" : "a8ee11b26d7ceb7f17eaa1e4b83a2cf6",
+          "iv" : "fbbc04fd6e025b7193eb57f6",
+          "aad" : "",
+          "msg" : "c08f085e6a9e0ef3636280c11ecfadf0c1e72919ffc17eaf",
+          "ct" : "fcaaa38feda3aca975ac76553c3e7ef36b887a8c4d8241f9",
+          "tag" : "c2c6dcaeaeb9f38a3a42d2f4e8a17de4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "",
+          "key" : "1655bf662f7ee685615701fd3779d628",
+          "iv" : "42b51388f6f9047a2a994575",
+          "aad" : "",
+          "msg" : "857b2f6cd608c9cea0246c740caa4ca19c5f1c7d71cb9273f0d8c8bb65b70a",
+          "ct" : "b3fb66d3f2cb7590ad5ef5604813c125020ee3d791cb0ec67eb5eb86709b6b",
+          "tag" : "155577b98a811e45324616043997bc03",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "",
+          "key" : "3fd50741ec47ddbfc2fc090975d154f0",
+          "iv" : "eef1a6e651321852f0b25a31",
+          "aad" : "",
+          "msg" : "d6f6a9a24db6a7a6176d4362639c4fd77f70f3e089dd940086e12a9becbaf97f82",
+          "ct" : "532694bb2851ea7f3bdd37c4e806be5b953ea79d08100e74af3fa67eca8890db28",
+          "tag" : "9e1acee688848bca454c6d04753d3c7d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "",
+          "key" : "42e38abef2dd7573248c5aefb3ecca54",
+          "iv" : "064b3cfbe04d94d4d5c19b30",
+          "aad" : "",
+          "msg" : "2c763b9ec84903bcbb8aec15e678a3a955e4870edbf62d9d3c81c4f9ed6154877875779ca33cce8f73a55ca7af1d8d817fc6baac00ef962c5a0da339ce81427a3d59",
+          "ct" : "4ca01b5b2a5e57bcc1a4b7f63f049dc477e3ee2e5c268efb346ff95b7dcd67f86ed0f11bb17c1dd7fb511d2f37b9684550c0d84be0f10030ccc4e0de5b74ef92ea54",
+          "tag" : "c5a57dd6fa16aa9de8de20e6bd321396",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "",
+          "key" : "59ab7ec1c02bb206af5a9131f1134311",
+          "iv" : "5508f5cea197386986d92dbe",
+          "aad" : "a43d39f78a2e9a8a",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "09ec70faae333537a7314929ddfb525b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "",
+          "key" : "9415f925bcb41dc25e86c826dbc8bf68",
+          "iv" : "bdffaa763b916ff0ee3f3ce4",
+          "aad" : "705d676cd8a94451",
+          "msg" : "feb36167eafc02c8e2bd6e13817686ba",
+          "ct" : "08db327a88be7b48f430fd7bfccdf502",
+          "tag" : "b7c249f810adacf99abded1f3b9130f2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "",
+          "key" : "d97c9b043bdccfd59491a995e78f1696",
+          "iv" : "ef423240358830df915506a3",
+          "aad" : "3ddba7b3ab69c8b2",
+          "msg" : "f047594a5cffda64303a80b2fa6a957169",
+          "ct" : "e0caf2a9d50f70ecaa43b4a287c3b34a99",
+          "tag" : "cff4c61882b413b686ff35b63a3a73de",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "",
+          "key" : "16be38c05c7bc5c68ee6203871799240",
+          "iv" : "acca8ae916119e49d87c33a7",
+          "aad" : "28",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "217d40efd972701fcc33df5362e1ea9c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "",
+          "key" : "7c89680b4bca11a64314f4cac57a95df",
+          "iv" : "07c8ef981bea995257d3d65a",
+          "aad" : "b8e8",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "dea636ded8b9ef2a08ffdf58a05b7871",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "",
+          "key" : "439fd5c3b76587d5a601ba6ef8fad214",
+          "iv" : "ed1d316d0834d174c1b5b438",
+          "aad" : "eae252f42d2c71",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "e8530426cbabf63633ff373159247e38",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "",
+          "key" : "1a44f3550688fddbc1e5041dc98952c0",
+          "iv" : "5d2904298f668ba95eaa1797",
+          "aad" : "d55908958b70abee81054cdf3d3df5",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "5c71b4f069cfa13b7634db4b13e7be7d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "",
+          "key" : "7db6d8e58e3c552a644520aa805e2f48",
+          "iv" : "e98693e9f6632d115b5d5a74",
+          "aad" : "6fc1ca24e69786aa26bfb5d46ef8cb56",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "b9a8a6d461a441fbd5bb6a8ac0d47e9d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "",
+          "key" : "de6ed169d396cfb7378e892c7faf1d5d",
+          "iv" : "efc1870282e77ca8063f1beb",
+          "aad" : "eedf6e776ad37dc610825a6168e21356c2",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "0d650a974ebea22fed077d229e0c9e65",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "",
+          "key" : "6cf09599181c07aeb21d7820bf706595",
+          "iv" : "4c4c525a8c7ee6879aefa79e",
+          "aad" : "bd913967db07b9eb5907f0be71ce886c41ff923c296c0ef3f704e98f649e59",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "806e48e7d452b63b6126f576efbdf4c4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "",
+          "key" : "ef35b5c797bb6beedb513ba3d8aebd25",
+          "iv" : "0576a1017ac00e49110c4cac",
+          "aad" : "a386d5c44de8c6a5063adf5ba9f0b75e9ad1f239a530dd76d797554d7b037d7d",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "6966a1cf5729332b26fd3e3850b74865",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "",
+          "key" : "649f3dfddbf1af6087674568e2e6d7c3",
+          "iv" : "6ca6f87b7a8584df4f4687b9",
+          "aad" : "35312ca23e4eb36cb0a66c6f386b8ec29f6d11e82fbfcaadfd6cbc9b59d51a6c0270868274d91f60978d1f0f37280930d3fdcb3e90ea461eccc83fa0d975548816",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "3daa0003de384d78443ffd3a5ea48179",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "",
+          "key" : "a5b5b6bae45b741fe4663890098f326a",
+          "iv" : "4bad10c6d84fd43fd13ad36f",
+          "aad" : "30",
+          "msg" : "127b150080ec0bc7704e26f4ab11abb6",
+          "ct" : "75e6ffcb6114833b67cd93bdf2c22b55",
+          "tag" : "c90e18eaf810b7bcefe7a526b1783b20",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "",
+          "key" : "0cecb9f512932d68e2c7c0bc4bd621c8",
+          "iv" : "2186a3091237adae83540e24",
+          "aad" : "743e",
+          "msg" : "437aeb94d842283ba57bb758e3d229f0",
+          "ct" : "646cef72906e2b8f69ac3134b496598e",
+          "tag" : "9dab1ee9314a0430abf54c37c88c790f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "",
+          "key" : "a3fd2fdcce8a63bfe4eb2db7e42adbe1",
+          "iv" : "690e7ad1e05d0d4ab4552cf7",
+          "aad" : "ab91ec8cc73373",
+          "msg" : "be0231b5c7861f0af7b6381479d25b77",
+          "ct" : "a884f769fcc727839d59711fa3cb5ee0",
+          "tag" : "f2017e3bd10bb1b43fdcc0feeffc9c68",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "",
+          "key" : "55e04c122780be52ed9328928039008c",
+          "iv" : "0c908e58cddad69dea1a32c3",
+          "aad" : "25591707c004f506f4b51e85e29f6a",
+          "msg" : "26eb70672eef03667b34cc7d0df05872",
+          "ct" : "89166dcd7d74a445dfd3526c5180d825",
+          "tag" : "8b8ed5f97a168881c3b6efe91cfe7043",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "",
+          "key" : "5f0a1b5f8f8673d566ec7f54e7dca4f2",
+          "iv" : "c30968c967e53505621628db",
+          "aad" : "c07092d799dac2b4c05fbddd04743c34",
+          "msg" : "f6538476daf04524cf134309dd84e187",
+          "ct" : "2315110f7ec64e7a23e5a762822f71ab",
+          "tag" : "dc7b12fa2dbfbdc6d85faa77a2eb767e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "",
+          "key" : "671a70e883fb0611dffd0b1dd9b8cca2",
+          "iv" : "a51c37f467893c1608e56274",
+          "aad" : "3ea12d80f40f34f812479d2ecc13d2d6df",
+          "msg" : "3baf3edf04dc0c97aae081cdeb08021d",
+          "ct" : "5d5630fc728ffb08ce693f7299e6728b",
+          "tag" : "00023f11a023c0786c105fe4c003af6e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "",
+          "key" : "20bbf74c1e63982c472c4743569e4c84",
+          "iv" : "459fc7c004bf46323a02d846",
+          "aad" : "4f2285ce3dafa528c694a5272d3b7b929097db398772653bd9bbbdb3b2c8e1",
+          "msg" : "6db50992e8fbbee15d4979d3e322dacd",
+          "ct" : "8703e44697138c58532d97ee99231d94",
+          "tag" : "f14c2f39a4871a4a16c42f6fe878deef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "",
+          "key" : "63f03172505d90e94900125cb8a4b0dd",
+          "iv" : "52c20979cdaaade573dba650",
+          "aad" : "5189ea6f39b2a78c0202fdff146c5cc6bdc7491d4786f80c6c6aef65634c05da",
+          "msg" : "602c98997ee03fd11ce00e92de193977",
+          "ct" : "5590155f3e701b4a960989d0251bac65",
+          "tag" : "fd6a2c9273d124b5553be42e78931465",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "",
+          "key" : "5bf008f6f27cc21f5ae82fb7907b1d92",
+          "iv" : "580af48bc1108604d5551343",
+          "aad" : "482da24bb4fb9eaa0dbf403733597f5b3ee8338b5d09a1d6f9070bb069264abbcacc5657aa6353f179d1bb4c7fa00526789eaf08e0da258cbdb39e9877c68b4a75",
+          "msg" : "ca89d6ae284afb6792cd894e07aa8336",
+          "ct" : "1b89c6bcddefbe9233ee4093468a5f61",
+          "tag" : "a49c7747dad42df6d729a01f4c50cf34",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "",
+          "key" : "30d8692eb3b62db6144f74ee9dec5296",
+          "iv" : "fe9f6fb4415cfb4189f9c76d",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "804f915fc7fea2ca7d8baf1350c5227b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "",
+          "key" : "21517fd9ebfd387dff2a0c0518ab8267",
+          "iv" : "61f6c4ec9e2091d4a031804a",
+          "aad" : "76d332ba081b3d3cfba271167ba108cd",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "2cc4b905a4d39e35d4beaebded9b5966",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "",
+          "key" : "a716f931c8f9d977f7da8573bc65f2bf",
+          "iv" : "91773659adac8f12e5526316",
+          "aad" : "",
+          "msg" : "9c98038c5e8d1af597b3b9188b3624fb",
+          "ct" : "99ae76cfff552ce37b210e26e810787c",
+          "tag" : "2bdab5e6f008b0cc751d5b067487eb2b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "",
+          "key" : "875b0b4a84150524eb1f50f9d8de1388",
+          "iv" : "fdc5014ed1ad706129d57322",
+          "aad" : "35a6d9829c8449c4402e385cc5c6fe98",
+          "msg" : "2f575dfb2dbe9d238de576fc63e4ac32",
+          "ct" : "3469c3ff738aa32aacc1ac48d89b1d75",
+          "tag" : "fa68720a3171a54c4b3690bffde7b610",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "",
+          "key" : "d6298fff67dba1ec250308e0bc5f4fae",
+          "iv" : "d96f9bbbfa14e9616c458df5",
+          "aad" : "",
+          "msg" : "8eeb4445a34c81fdbc478b83df71116ce6",
+          "ct" : "476869a3ddb386bf42478d0c84179045be",
+          "tag" : "9136d994daa22ead4d0827e5825001ac",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "",
+          "key" : "e3d3ec41f28eb35fb53f5fa91804e051",
+          "iv" : "89d270fc8b583bc631cefd39",
+          "aad" : "3d2f458c67c5b6c794b1f12dad409e0f",
+          "msg" : "847acf521995b33f8bc474c8befbca3bb2",
+          "ct" : "28aaec53493cd6252cf6410ed141bdafb7",
+          "tag" : "47bf3e16c227ca11fd68a16d407c2cc3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "",
+          "key" : "faf36a66f8e54f2fb2a02f3a30f0180b",
+          "iv" : "2ffa982a4784797cf46b07ab",
+          "aad" : "",
+          "msg" : "50a59edc01b7bd0db6ec43fe23f72e70ed4d42337ab1926cc6956aa44dbebf",
+          "ct" : "a789907aeb2344f025b1b426c9dee52b106ff2110cb200cfb85aea60fddf6a",
+          "tag" : "722e5c450c5ed9492859a3236a220f76",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "",
+          "key" : "2c9b9ff47d742c4ab224e9ca1ed57c4c",
+          "iv" : "917962caf3932441c259282f",
+          "aad" : "72175bdfdb4a23e97fdcbd263baf4316",
+          "msg" : "b542c2f3f81670ddf74f15184ab7de17e057cde9eef92babdb837500774c19",
+          "ct" : "320ae0c11e92d10d5bf5485c854b2d8f6318e33f16b520cffd35ada381c967",
+          "tag" : "a4866908e664ee140c6ae2b9d2ab8416",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3d6d5f66430ad65bb034077297f0929a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3e6d5f66430ad65bb034077297f0929a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "bc6d5f66430ad65bb034077297f0929a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3c6c5f66430ad65bb034077297f0929a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3c6d5fe6430ad65bb034077297f0929a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3c6d5f66420ad65bb034077297f0929a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3c6d5f66410ad65bb034077297f0929a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3c6d5f66430ad6dbb034077297f0929a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3c6d5f66430ad65bb134077297f0929a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3c6d5f66430ad65b3034077297f0929a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3c6d5f66430ad65bb014077297f0929a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3c6d5f66430ad65bb034067297f0929a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3c6d5f66430ad65bb034077296f0929a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3c6d5f66430ad65bb034077295f0929a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3c6d5f66430ad65bb034077217f0929a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3c6d5f66430ad65bb034077297f0929b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3c6d5f66430ad65bb034077297f09298",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3c6d5f66430ad65bb034077297f092da",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3c6d5f66430ad65bb034077297f0921a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3d6d5f66430ad65bb134077297f0929a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3c6d5fe6430ad6dbb034077297f0929a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3c6d5f66430ad6dbb034077297f0921a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "c392a099bcf529a44fcbf88d680f6d65",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "bceddfe6c38a56db30b487f21770121a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3ee9f3430f3e803c0a46b7a84cd803de",
+          "tag" : "3d6c5e67420bd75ab135067396f1939b",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 66,
+          "comment" : "",
+          "key" : "5019eb9fef82e5750b631758f0213e3e5fcca12748b40eb4",
+          "iv" : "ff0ddb0a0d7b36d219da12b5",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "2d03f5e8c2e5a1b43c7708dd0cbf0acd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "",
+          "key" : "21218af790428f8024d3e7e1428c9fcf578c216636d60e73",
+          "iv" : "34047bc39b9c608384dff5b8",
+          "aad" : "",
+          "msg" : "e3",
+          "ct" : "39",
+          "tag" : "7450f55a21e717a1106ea0c11871f5ff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "",
+          "key" : "3a8bf543c480925632118245bcbf5d01522b987a31a33da3",
+          "iv" : "4ebc13cf4636cc7c45e560a7",
+          "aad" : "",
+          "msg" : "53fc72e71b59eeb3",
+          "ct" : "5d24d0e1a2ee9fce",
+          "tag" : "e770f91a51f5b587a44cd9d3634b9706",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "",
+          "key" : "bcb6bc5ee6743df1396a34639327b25809ec9c81dd6a0c0e",
+          "iv" : "be0326d23bdc2c64648d13f4",
+          "aad" : "",
+          "msg" : "80474a3a3b809560eee2ce7a7a33ea07",
+          "ct" : "db5893dc8da336614aa0ff768d469535",
+          "tag" : "902c2a8325cb55bc95f0e13cafe9aa8d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "",
+          "key" : "5e1d28213e092536525bbae09e214af4c891e202b2b4fa4f",
+          "iv" : "b6be6cd0681235d826aa28ea",
+          "aad" : "",
+          "msg" : "53d59433a7db7f41b31ccb6d4a2d789965",
+          "ct" : "20ebc1f5a2c9f88d1cdb182e81329cc03e",
+          "tag" : "bc545e91c974a744baeab2dd8ce60960",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "",
+          "key" : "7f672d85e151aa490bc0eec8f66b5e5bee74af11642be3ff",
+          "iv" : "b022067048505b20946216ef",
+          "aad" : "",
+          "msg" : "ef6412c72b03c643fa02565a0ae2378a9311c11a84065f80",
+          "ct" : "1bc99029a09c080140608a62c33bc7ae69ff811fefb20b2d",
+          "tag" : "80f09103485f95f86ad1f072a214c55e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "",
+          "key" : "f7ace6c3c10c3ff977febe7dc882b8e779ef3a17ef9324a8",
+          "iv" : "6e2ba2833c5dce6becc4f6d8",
+          "aad" : "",
+          "msg" : "2e11e41951c20460c768b0d71ad56e77bec05e0478f99d5b62e799f732e467",
+          "ct" : "b3cec777f807d16b697163d0c6a45d002936714d600a156d7e5365d1aacad0",
+          "tag" : "11a56edbe2fbbbb2b011c43a62000830",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "",
+          "key" : "a9541a96b86d32b452092e8b92099ea3f45f98ca05ce692b",
+          "iv" : "9015b4bcd6989083046be86d",
+          "aad" : "",
+          "msg" : "9d359aad3ff5ce3735a8cffe4f087114d4d6c5e01dceb1969f40c8e0db6bb90281",
+          "ct" : "0a6b84de44cce14255a9cb19169695cf4660489f1e3f605334355828c5c09fb30e",
+          "tag" : "a19a60105fc7a03be1783f558ea23e9c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "",
+          "key" : "239195b58668eb89636b1ec2b331336946369fc6c87b8849",
+          "iv" : "14a6281a43b4eb056a67b9e6",
+          "aad" : "",
+          "msg" : "39d873d4cad71cb252784bd14648a494ceb517eb9e3e6f32d19bd18dfaf877c7aec22103d242993ed7bab123326110dfdb7229143a0c601e16aa4ecdde808cd83bb2",
+          "ct" : "8fcea9e2faa523298472b5583e356d1875393ea3bc1b4f8ea4aad597147a7ca94e2609fe6bf0ab861e0631a3124eb15d0de265ef11a33e4507e30770ce37bbb4b6c3",
+          "tag" : "a4456828b49cdbf8f3c200429c339a89",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "",
+          "key" : "03b4675851b78b69fb7b5589882e718b075e9a5402b520fb",
+          "iv" : "c4ca2d678e51742ec5e560ab",
+          "aad" : "91e10ac5636fe99b",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "937f15ffd1ccd645d9c7cdd6677311cd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "",
+          "key" : "400eec9b06a80a8403d45dae5d58cc917bc854f51cd3ce0d",
+          "iv" : "447dd09a23708f3b6664e15b",
+          "aad" : "7320367d5b070559",
+          "msg" : "b784925a695f0ed14ca40249c1fd5d1a",
+          "ct" : "912d05c402383950e1c5a5188e6241d8",
+          "tag" : "ab309be2c05c941fbfb338ba064b19a1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "",
+          "key" : "e258b117c2fdd75587f07b400ae4af3e673a51dcf761e4ca",
+          "iv" : "5ead03aa8c720d21b77075db",
+          "aad" : "27702950960b9c79",
+          "msg" : "afe96113a684bc52a6d962cf2724f6791d",
+          "ct" : "7830446f333057d996a1a79b21c68d8b43",
+          "tag" : "72ac478a66f5637563f1f12c1d0267ca",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "",
+          "key" : "6c2a03e9ed8e421e07dfc36b99c0d0dc9bb874ea3af8a8b7",
+          "iv" : "8f015ece4e0338e782fa3a2f",
+          "aad" : "f1",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "9226c4c39166df5af4e0c91b64b463a2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "",
+          "key" : "1486b5f150524cc601b2ea7da47d7c8afb06d6420dd33f8d",
+          "iv" : "9307317d2f423b57b3720f8f",
+          "aad" : "3c09",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "3600e06def585e2012350efe047826e9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "",
+          "key" : "e09c83ff0fc0b6a30f938e50e26685247e9ded2e7d6dbc7c",
+          "iv" : "3ec61e9c166d678399239152",
+          "aad" : "c1a13c74c11cb8",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "9f5b3e48ddda9af3751501509c940ac1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "",
+          "key" : "d0c688c52580d8f800aca34fa74cec487b671aaf85027b9b",
+          "iv" : "9c460abf56292dcb1b35b3b4",
+          "aad" : "3596ce989ff975f3250e6c9eced25b",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "cda434c229e54bf9bfd54c8d8ce4730c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "",
+          "key" : "1892dbd7e6b3fe18ebdc81bb271ab03a8f32af04f13300d2",
+          "iv" : "0e872de58ad10da248403f21",
+          "aad" : "e8b1c6cc6c45105e0c32587a0de369e3",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "0c7e14dc49a81e6be123b9cfbb281787",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "",
+          "key" : "ef7992b0f8ec7a101d34000100eb7d9b2eaee333d0aa2ff8",
+          "iv" : "316d38a90019b9a37ad080b7",
+          "aad" : "1014ed7889694cff767876c069ae1f9185",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "17ff8e799760558f1d4cf8927d5ec699",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "",
+          "key" : "e4570815a149599d13bd8dcaadbec93cf09019baa2d4070b",
+          "iv" : "5a31a3a026786c49db9d0958",
+          "aad" : "90a7357519e35e8dbd8976d4b36710ffc1eb0d9a4ae7d5315ae7324eb1d18c",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "06ccbf767e0a63c89d50b8141187a555",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "",
+          "key" : "9f0c076b0630caa10e7bdc07dcdc89a270f03930997ade0b",
+          "iv" : "3f5def0880b889db0b3f2bf0",
+          "aad" : "f5368b9d8fdc1efab2b17a45f4604245983572f8c167aa31fa3f530f1c5e1781",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "334c1325fa969a07179011d2f8613636",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "",
+          "key" : "803f4ebbed8b1a4f348713461c0eb0bd30caec55a1e71628",
+          "iv" : "b05ec49bc405eb7e97294f19",
+          "aad" : "dfb71f25e7f11cca17702eb89a184e57f22e4ea4741ff603abc901fa026bde7ce1107e2ffba0a0a0f24f47ee627832ee5bc2192c18845630009910c07f8d0ab451",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "2b71d2a81f4c6ea267a9865094fe20e9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "",
+          "key" : "da6e3df6735f632e035ab8f10c37b5f00a40e18b17778a85",
+          "iv" : "80765eac2281969cba569ce7",
+          "aad" : "6d",
+          "msg" : "3d8765df3a06f5248b1aaa54123b86bd",
+          "ct" : "a42863b95abea391940adac7fe0c4143",
+          "tag" : "122b46f81a0b6e92cda1950ce6fe026e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "",
+          "key" : "54e171cf90729c77d500e1d2533360e841e260894576b129",
+          "iv" : "8b1e57f98ea4e77deae4576c",
+          "aad" : "27ff",
+          "msg" : "2d716366f2873860d5043700f1e9a9d8",
+          "ct" : "3418154afc95d05569ee6fe4db82eb6e",
+          "tag" : "0a734bac17843b8573fbfeba4a5fc5d4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "",
+          "key" : "992cabb64f12210c8b0b14d73d39317ddb2b8a628ac35106",
+          "iv" : "57c8786e66d8b0bec33604b0",
+          "aad" : "068d940e26b678",
+          "msg" : "9e7692f12132cdd53f50531651417bd2",
+          "ct" : "ba340926de500d01ae3dff2e90560816",
+          "tag" : "db9dba31a03019ce88ce741c03940660",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "",
+          "key" : "89be6495c917bd7af0a3b7a6c8a4c6b5cade766d32de3604",
+          "iv" : "f47f6b65d660f10c043ea641",
+          "aad" : "f6a28d27686adcbf9ff8ab80ecc1c1",
+          "msg" : "c3c50f4b38aa3751f4910a44675d37e5",
+          "ct" : "b19be8ba6ebcdb74d33c2dbdfdc02074",
+          "tag" : "93bb717061330accc718b4a8ef05ab20",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "",
+          "key" : "8ea954552417516c972e4311692d658dd7ac9a7fd6f3d02c",
+          "iv" : "ea16c104bce5b7edd5a25a46",
+          "aad" : "7d4d7c273a9aa0f35d1f91570141db54",
+          "msg" : "0fc6cc800a5786e63a4546fb33887af9",
+          "ct" : "eb45ae2980d996f5023593f762d37051",
+          "tag" : "4acc06242cc4ec4ba36e8bfbe84f3d5d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "",
+          "key" : "dfa7ef72302dfbcd2648b88958fe0f049f1d60143d86e395",
+          "iv" : "f3723b9ab728c99bbd6f2304",
+          "aad" : "cf75dd4536d00f11eda40db4d252e172e3",
+          "msg" : "20b3883244300a82094ddb9b3d1efb81",
+          "ct" : "5a8374391adc22e8c066557d9ff586cf",
+          "tag" : "d4a111d611efa63f0c3f08b2fbb3b0ac",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "",
+          "key" : "b63b52d1d159a17596dfbd9be5c5088699d94b9c5d95c22d",
+          "iv" : "b1beee8afb00e01a9cbf5973",
+          "aad" : "9020b56256bcb02c690720e3239d325d259f1898ea05170e315c144960d263",
+          "msg" : "dfb417903c6d4827500a3eca2184fe1c",
+          "ct" : "e84471601fb8b4dbbdc80d56e37f69b8",
+          "tag" : "52089cb4e6c11bd764ae7d4438cfd1f8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "",
+          "key" : "aaf64023f5762c4a54c3eb0ef3bb2ebd23ceaf38b3e0285f",
+          "iv" : "2a56235f079d53a3100702d4",
+          "aad" : "2d688b3b3311770579dd064614a7d11b17a16953bd9700759b35a5031a2d8bd0",
+          "msg" : "34aec5a65795cbeedac2ee6fd7765c6f",
+          "ct" : "d13cceb8376eb423f5b2ea257c118fb5",
+          "tag" : "7b6a3c76fd52930a989f034e5dfe074b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "",
+          "key" : "b521e4fa92eb46fd4916c71e3f999027aaf21466fad5f96e",
+          "iv" : "b2b42fa60a2a80412eecc7fc",
+          "aad" : "b497221c7fad55a06ea9f56f39b3609330edc467b79cbf3353636bceb784b60ec63a836074ceb48624a4a41ac0496d5adfe2989313d7412b9c2d89cafd9cd5a734",
+          "msg" : "a3a80ac0f5b46597a7f4a583dda02124",
+          "ct" : "994bb34470d4ddb7bb7a3c3abb5da3c5",
+          "tag" : "02550e2b278c723672a01e4b6a46afc7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "",
+          "key" : "7757754aeccf85c91e48e4d4970d4d62dae94cf44f9ff026",
+          "iv" : "3d9281c4acfc72387346fd92",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "da9ae60a12aa6f926cf46d2a335faac7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "",
+          "key" : "a0cac7e83c7eba22365256cb8f237039b94f1a269263648e",
+          "iv" : "2d2a5c8b17212d4c44ced459",
+          "aad" : "8b388e2e7225c087300042f6024a111f",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "84043498ce07d8742330c605d96d966c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "",
+          "key" : "fa07aa3932b901696269c8f8bf56662f82dff2957a4aca35",
+          "iv" : "ec1b6d7f097a2cad8cbc9fe9",
+          "aad" : "",
+          "msg" : "d9a689793c947968f07d4ba2eb1c25eb",
+          "ct" : "a322f75800fcaff691251762ed39fb39",
+          "tag" : "8a734892213383ac54dc2c1f48841938",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "",
+          "key" : "f997a79b63b1cf641483706097ff4abeeba13962db056206",
+          "iv" : "ba9538ad1575a1df7879782b",
+          "aad" : "aa13c109b2f57f700a89931de75b7080",
+          "msg" : "f376943459b6041ed5232d7b9fb5e9e6",
+          "ct" : "982b14f66482d0c98371e08078efa012",
+          "tag" : "14f1b2b24575a1a33206acdf500e9d46",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "",
+          "key" : "d7c6ea0a285a5d8c5964773080488967e7e65935890c3265",
+          "iv" : "f511d16e972e138d5ae8ddac",
+          "aad" : "",
+          "msg" : "5034fa6da3a9ee380be7e8d02605ac2023",
+          "ct" : "3450a992a6fbce9ce29f6c4f9f41c36ef6",
+          "tag" : "ed6ca1ff3ea1a7ca8819501139f8a0b8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "",
+          "key" : "b29346a95c3b653c9bed023df2e03b6de45b8de1a4067d86",
+          "iv" : "c5b45df3a5bf4ef539c3dbd8",
+          "aad" : "404059189f1eaf31b2e505fec08c7053",
+          "msg" : "22e6281fba3e5b056871a98dd2ef0e164d",
+          "ct" : "6c26392899e365450054bf0ab33f983f27",
+          "tag" : "c47240bb8d1dbb687fab777f72adbd2a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "",
+          "key" : "a61ed3b81d78560602777407759b1f2ca34cd70c6b57791b",
+          "iv" : "07b82497b815d16182481045",
+          "aad" : "",
+          "msg" : "ddc1862e3531622e698322f0b1ca6d222231ef14dbeea33679d31c48777c88",
+          "ct" : "a0c1526c88dcc265f75d4ef9b2a000fb3cce9e5d994c472c46bfac3821d611",
+          "tag" : "9aa6cdb85b126e1f21d066a3c05e82f6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "",
+          "key" : "49f33bc3c1a40e1ca3b56a499e4c9137c148d1256155fdb6",
+          "iv" : "47bc33d91349056838b62474",
+          "aad" : "449c8cbb9a67adb03f60646e5b904620",
+          "msg" : "a920b4fea908b1771d58d4c108838f3af7b8415497063dd9691a552344d642",
+          "ct" : "67adef99611f341d14ea27e72da9b658c9a79e3b328e79758c9d34db0bed06",
+          "tag" : "b2a44d0fc94606c4e2b6c39b242b3aca",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7455dfe5b5e6f2b67abe9575be8e4784",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7755dfe5b5e6f2b67abe9575be8e4784",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "f555dfe5b5e6f2b67abe9575be8e4784",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7554dfe5b5e6f2b67abe9575be8e4784",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7555df65b5e6f2b67abe9575be8e4784",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7555dfe5b4e6f2b67abe9575be8e4784",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7555dfe5b7e6f2b67abe9575be8e4784",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7555dfe5b5e6f2367abe9575be8e4784",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7555dfe5b5e6f2b67bbe9575be8e4784",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7555dfe5b5e6f2b6fabe9575be8e4784",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7555dfe5b5e6f2b67a9e9575be8e4784",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7555dfe5b5e6f2b67abe9475be8e4784",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7555dfe5b5e6f2b67abe9575bf8e4784",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7555dfe5b5e6f2b67abe9575bc8e4784",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7555dfe5b5e6f2b67abe95753e8e4784",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7555dfe5b5e6f2b67abe9575be8e4785",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7555dfe5b5e6f2b67abe9575be8e4786",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7555dfe5b5e6f2b67abe9575be8e47c4",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7555dfe5b5e6f2b67abe9575be8e4704",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7455dfe5b5e6f2b67bbe9575be8e4784",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7555df65b5e6f2367abe9575be8e4784",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7555dfe5b5e6f2367abe9575be8e4704",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "8aaa201a4a190d4985416a8a4171b87b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "f5d55f6535667236fa3e15f53e0ec704",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ef6720509035750ecafac4b3e4fac356",
+          "tag" : "7454dee4b4e7f3b77bbf9474bf8f4685",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 131,
+          "comment" : "",
+          "key" : "80ba3192c803ce965ea371d5ff073cf0f43b6a2ab576b208426e11409c09b9b0",
+          "iv" : "4da5bf8dfd5852c1ea12379d",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "6dc4ef59a73ebcabb5e34c0d34d9f2d7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "",
+          "key" : "cc56b680552eb75008f5484b4cb803fa5063ebd6eab91f6ab6aef4916a766273",
+          "iv" : "99e23ec48985bccdeeab60f1",
+          "aad" : "",
+          "msg" : "2a",
+          "ct" : "06",
+          "tag" : "85ca1f6c46283cb5dd5960bd34a8dc36",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "",
+          "key" : "51e4bf2bad92b7aff1a4bc05550ba81df4b96fabf41c12c7b00e60e48db7e152",
+          "iv" : "4f07afedfdc3b6c2361823d3",
+          "aad" : "",
+          "msg" : "be3308f72a2c6aed",
+          "ct" : "7fd4b5d3095235a3",
+          "tag" : "f64d10b41e3d6928741947c50ca0391f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "",
+          "key" : "59d4eafb4de0cfc7d3db99a8f54b15d7b39f0acc8da69763b019c1699f87674a",
+          "iv" : "2fcb1b38a99e71b84740ad9b",
+          "aad" : "",
+          "msg" : "549b365af913f3b081131ccb6b825588",
+          "ct" : "48dd9589a47e638bbbc2aa3e232fa529",
+          "tag" : "df69fbe1f099f0134fe2869156ab07db",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "",
+          "key" : "3b2458d8176e1621c0cc24c0c0e24c1e80d72f7ee9149a4b166176629616d011",
+          "iv" : "45aaa3e5d16d2d42dc03445d",
+          "aad" : "",
+          "msg" : "3ff1514b1c503915918f0c0c31094a6e1f",
+          "ct" : "202297d36ca62c5a1d4437fafc7b50e764",
+          "tag" : "665f05a96bf8de45361dbf33c98b0905",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "",
+          "key" : "0212a8de5007ed87b33f1a7090b6114f9e08cefd9607f2c276bdcfdbc5ce9cd7",
+          "iv" : "e6b1adf2fd58a8762c65f31b",
+          "aad" : "",
+          "msg" : "10f1ecf9c60584665d9ae5efe279e7f7377eea6916d2b111",
+          "ct" : "3c0a0b3494d75ccbcffaa917d6159294fd93e8a2ee66447a",
+          "tag" : "b0b07ba05167e88c24e54824a07061b9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "",
+          "key" : "2eb51c469aa8eb9e6c54a8349bae50a20f0e382711bba1152c424f03b6671d71",
+          "iv" : "04a9be03508a5f31371a6fd2",
+          "aad" : "",
+          "msg" : "b053999286a2824f42cc8c203ab24e2c97a685adcc2ad32662558e55a5c729",
+          "ct" : "0e29b2335b900758fad278aefb9b3afa07fd42b5d2f7d387e3ea0e0ca416e0",
+          "tag" : "6ed7e1e1278c40ce2e781d1005de88dd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "",
+          "key" : "5155dee9aade1cc61ee7e3f92660f7590f5e5ba82f1b59b850e3fa453d2fa6b3",
+          "iv" : "c26c4b3bfdb97ee6b0f63ca1",
+          "aad" : "",
+          "msg" : "2734e08eff8f5c4f84fa0c207f49c7fd78af1ad5123ff81f83f500edf4eda09edf",
+          "ct" : "aed24e0082e13ee15ba0506a836c78b97ef2faa3c6e8eb378dc64dd4adc998ad68",
+          "tag" : "5ba1b48a701684d940be244c3de938d2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "",
+          "key" : "95e87eda64d0dc2d4e851030c3e1b27cca2265b3464c2c572bd8fc8cfb282d1b",
+          "iv" : "ce03bbb56778f25d4528350b",
+          "aad" : "",
+          "msg" : "2e5acc19acb9940bb74d414b45e71386a409b641490b139493d7d632cbf1674fdf2511c3fad6c27359e6137b4cd52efc4bf871e6623451517d6a3c68240f2a79916a",
+          "ct" : "2fa0bd2cdfe9e8d7919b97ba05d59e3389fdcba728ec124d0f2849484f635a000e734c8c80941b3da32d23eea51edce8d6617b16ebb43ac8113a092e9ddaa3721ae9",
+          "tag" : "a9252a50ddbbf18cd3e43adc0ba1a481",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "",
+          "key" : "7a4cd759172e02eb204db2c3f5c746227df584fc1345196391dbb9577a250742",
+          "iv" : "a92ef0ac991dd516a3c6f689",
+          "aad" : "bd506764f2d2c410",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "569d82691892e103e627407c95f08a0e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "",
+          "key" : "b907a45075513fe8a8019edee3f2591487b2a030b03c6e1d771c862571d2ea1e",
+          "iv" : "118a6964c2d3e380071f5266",
+          "aad" : "034585621af8d7ff",
+          "msg" : "55a465644f5b650928cbee7c063214d6",
+          "ct" : "ab01f92db4f210bdb5edaf0a1bd19eba",
+          "tag" : "621630c505d24e3b29294977d8ffa4b4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "",
+          "key" : "f60c6a1b625725f76c7037b48fe3577fa7f7b87b1bd5a982176d182306ffb870",
+          "iv" : "f0384fb876121410633d993d",
+          "aad" : "9aaf299eeea78f79",
+          "msg" : "63858ca3e2ce69887b578a3c167b421c9c",
+          "ct" : "f05e290bbbc61927fa65760648dcca88b0",
+          "tag" : "b721be96a6b95c0931fb243dd1287c70",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "",
+          "key" : "af1ac19b3b84eaaf2603379cdd1dc1aee4a484fdc2c190691afcc5b762f9b526",
+          "iv" : "daf98f1bd4c071c6b100f9c4",
+          "aad" : "14",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "e772cc7714efcefbd11508de489f7c61",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "",
+          "key" : "95fb7861f8c75e1424d8401ca3b3452c563b99b002c24afad4cf5e828f2353ed",
+          "iv" : "c1ac608d1fda28eb4034079c",
+          "aad" : "fbc8",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "54f2d2a54cbe6e959d51ba4ffa8e0e9e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 145,
+          "comment" : "",
+          "key" : "d30e682b584d416088a81bd6f85551ec1f2e1189388a7a9c0521e25b725f7dbe",
+          "iv" : "927214f64336701a3b4db603",
+          "aad" : "5cdb707008b065",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "2c6b6bef6ba082baa72415aaaa883c75",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 146,
+          "comment" : "",
+          "key" : "ac5a038caea8475e71ca41039388b861f008b60c62ff2e914ff08339862fb850",
+          "iv" : "ac38117b396aa0684331fe74",
+          "aad" : "02d1d00a8f1f052c083575eb0c2a09",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "d2e3aadf9ed60d91da5a1dc121dbfd24",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 147,
+          "comment" : "",
+          "key" : "efa5c5053b452002fc345312a3be650e9ff4244a1e44557d8a415570d2dbe902",
+          "iv" : "1abfb6e318995ea022b1d369",
+          "aad" : "01a10bc71a88c94a3ff924fe74cca229",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "8e9780cca86d3ca402e1dfaa03a72d77",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 148,
+          "comment" : "",
+          "key" : "bdf2994dd0feb3c870b39f52bcc76d28eed712d911d956c042e4701c4b20e5d5",
+          "iv" : "0a823c801d057e843af7ca55",
+          "aad" : "03f3d0fc23dd8f3e20884d3c6fff2608b1",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "36886d89cdcce157497fd09dcd67f329",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 149,
+          "comment" : "",
+          "key" : "5ae3c3ff78cedc192ca7044b3f41a242432b0ea7d3488c680cd422515b093b5b",
+          "iv" : "7c62042869a2e59701481614",
+          "aad" : "7ba3f3bbba5dff637488064b6a5249d2ad461717278719fe71febf7100828e",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "3f8b8f904ceb304505f942f36ccac5f8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 150,
+          "comment" : "",
+          "key" : "a8108c33da059fedf6022a6ec49527be0ab64002472cb2f703b97e0179a34312",
+          "iv" : "bce636ca401a88fac2361ed1",
+          "aad" : "35eac16526c2f10a1271b3a8f810bbf239eeb961e1a7e9205beae60045f008e6",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "430ccbb1f75de06b71637d1a76b35cf5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 151,
+          "comment" : "",
+          "key" : "4c8e95a7361bb37849b16f0e5f9a6eab87391339d951d7404ff5cd829c087a6b",
+          "iv" : "b4a8de71fb0fe172ff6d89b6",
+          "aad" : "94d06edcfa5ae3d27b9953fe5df0cca6194ff6dfa94d82b7359cb387dd5e80c6186fbf1748c192bb0c688ebb471b9020fe8fbfaee3dee8787ace3c20dd50be083e",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "da7fe2a4469e391c205b6de8e182a914",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 152,
+          "comment" : "",
+          "key" : "7d00b48095adfa3272050607b264185002ba99957c498be022770f2ce2f3143c",
+          "iv" : "87345f1055fd9e2102d50656",
+          "aad" : "02",
+          "msg" : "e5ccaa441bc814688f8f6e8f28b500b2",
+          "ct" : "6fe87884b94eac041cb4c78c23f283a3",
+          "tag" : "7eeb30082549637224e926e527b69aea",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 153,
+          "comment" : "",
+          "key" : "6432717f1db85e41ac7836bce25185a080d5762b9e2b18444b6ec72c3bd8e4dc",
+          "iv" : "87a3163ec0598ad95b3aa713",
+          "aad" : "b648",
+          "msg" : "02cde168fba3f544bbd0332f7adeada8",
+          "ct" : "e017bf1ddd279886f7545365f1465cc7",
+          "tag" : "6dcab79d1ddab4f3ad8b4af72318eb1b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 154,
+          "comment" : "",
+          "key" : "dacd51a8a8e4d5905b4cbb947ef4013eb296889353f3c9ee35f5577b26737a51",
+          "iv" : "3fa378a1befdddd61ae68cf4",
+          "aad" : "bb5a3812f0aefd",
+          "msg" : "e148313883a77da121124d06b1c77dca",
+          "ct" : "ddf8ade13d69f3649e36c669d25b4d81",
+          "tag" : "01861557d43ab014c4ede19fcd7548ea",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 155,
+          "comment" : "",
+          "key" : "8e34cf73d245a1082a920b86364eb896c4946467bcb3d58929fcb36690e6394f",
+          "iv" : "6f573aa86baa492ba46596df",
+          "aad" : "bd4cd02fc7502bbdbdf6c9a3cbe8f0",
+          "msg" : "16ddd23ff53f3d23c06334487040eb47",
+          "ct" : "c60d2a92e60a1a73a9ce4b2269e13a45",
+          "tag" : "71fa665b611fed6ef5e67ee827ac206d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 156,
+          "comment" : "",
+          "key" : "cb5575f5c7c45c91cf320b139fb594237560d0a3e6f865a67d4f633f2c08f016",
+          "iv" : "1a6518f02ede1da6809266d9",
+          "aad" : "89cce9fb47441d07e0245a66fe8b778b",
+          "msg" : "623b7850c321e2cf0c6fbcc8dfd1aff2",
+          "ct" : "722ac6a226f49c90ab22527a5138b401",
+          "tag" : "2e4ee997c752783e743b366bb6b350a5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 157,
+          "comment" : "",
+          "key" : "a5569e729a69b24ba6e0ff15c4627897436824c941e9d00b2e93fddc4ba77657",
+          "iv" : "564dee49ab00d240fc1068c3",
+          "aad" : "d19f2d989095f7ab03a5fde84416e00c0e",
+          "msg" : "87b3a4d7b26d8d3203a0de1d64ef82e3",
+          "ct" : "2fadf16ad16a21c317af9d0bc187f136",
+          "tag" : "88caf70f6b5d8f3ef6a39d1ae413772b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 158,
+          "comment" : "",
+          "key" : "077433022ab34d380fc192fc24c2edc6301fec6f24442f572a1087ff2e05b39a",
+          "iv" : "28adcbc74364f26dd4b3108b",
+          "aad" : "e0100eb116cdc5e22a3b9f9b4126c149595e75107f6e237c69e82960052270",
+          "msg" : "03c874eeaaa6fa9f0da62c758fb0ad04",
+          "ct" : "136f049ea851c6dfd2e87312d82f0882",
+          "tag" : "fdf9bc0412cfca2b035c5ae68ac6da79",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 159,
+          "comment" : "",
+          "key" : "3937986af86dafc1ba0c4672d8abc46c207062682d9c264ab06d6c5807205130",
+          "iv" : "8df4b15a888c33286a7b7651",
+          "aad" : "ba446f6f9a0ced22450feb10737d9007fd69abc19b1d4d9049a5551e86ec2b37",
+          "msg" : "dc9e9eaf11e314182df6a4eba17aec9c",
+          "ct" : "2ced0d04323db20aa8b8b9000d2c33a5",
+          "tag" : "48b81cb70d555b7c38492ba2c0a3b1b8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 160,
+          "comment" : "",
+          "key" : "3f494fd8f1b50692de9ce33f6d451ef0c58c6b2c6ffba3b41710ff63e67eda68",
+          "iv" : "9e628e5803519290e6b2c68a",
+          "aad" : "d02ec892d3b03eacb2f1d8a60a028485776af0fd6665cb6f74fba5ef897e2cf54b32e80bddeec938ab530b45ed971234804fa84a191dc11ae660f5a8662a4651e9",
+          "msg" : "f2c41a26a438e9ff733b7828f24a2449",
+          "ct" : "1d9f4256e08466560ab271de3621a03f",
+          "tag" : "81dbe38ac751127efc11caedeca9c93b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 161,
+          "comment" : "",
+          "key" : "c180c12e6af8cc0719049efe99d4df2de241efec5a013145b2b75e15dba16fe5",
+          "iv" : "126fbbd699beb374f67baa7b",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "15dc4b8122b0e5ad13dbea7096e81868",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 162,
+          "comment" : "",
+          "key" : "8003e6547a964cd5c28441c9b1a3c083ccb96c7e138385a5294a1c306b05f9f4",
+          "iv" : "f251c4a2625c612f86ec1650",
+          "aad" : "8c6eea9756155d6ea9595cc49e8a74e1",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "e6e91bfe5518b76e0a2dca79c64d232b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 163,
+          "comment" : "",
+          "key" : "a420e4f9a616bf631a949b324ae9016a77d943a0fd1da2b3e9742e2ee50fa097",
+          "iv" : "77f67199ab7b96f6f4832c01",
+          "aad" : "",
+          "msg" : "fcaf04e333d876ae34fcab93afd7baa7",
+          "ct" : "1355cd0e1b42b1788183009a11cad538",
+          "tag" : "59d35f9a12bed5b5ca870b28badb27f4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 164,
+          "comment" : "",
+          "key" : "6905f2c4d63a7ba7e9366ba6c3bbf6e3552d569eb55321beba3f8d98a182b97d",
+          "iv" : "49e08c06dbae3ff5cb7d9ecd",
+          "aad" : "aba0c44e9f9399748f4a7e919ceb8a62",
+          "msg" : "b56254e221cf558ea7d9194eecd63ed5",
+          "ct" : "68e66f433c3cf9e4247225682f4c73a4",
+          "tag" : "07f53a76b84460ecf4aa1813e5170b2f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 165,
+          "comment" : "",
+          "key" : "770b39741c56d46700a9f3cc231d1acb174498702c0f2d0eec20db57494bb49e",
+          "iv" : "9384a1ecbee1de2b5ae70684",
+          "aad" : "",
+          "msg" : "ea0b3228b83ca66150a79aba159e506b75",
+          "ct" : "4052c0fc816346c86921db57646feb2943",
+          "tag" : "a19a585310ceb2df767ec1724d52e39d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 166,
+          "comment" : "",
+          "key" : "41d6c6babb7241539ac1664748dd1cf29ce7940e29153cd8180ed197dab5c73f",
+          "iv" : "0005dea12eb69850647c7ad9",
+          "aad" : "675f31d76bf483d2d2ab57cbe93cf2f1",
+          "msg" : "e5c444a0458dcaf789c8f35666f15bccb4",
+          "ct" : "99a49bde03728c479daf4c67d307f1285e",
+          "tag" : "f0f3859d12cd4148b9e84d22ba7ad966",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 167,
+          "comment" : "",
+          "key" : "bc536d8d9b4340cd14147fca7ca36573ba45bff5b0a7cb8091a550cf2b4bb945",
+          "iv" : "178694eb62d7773b0f0fbe8b",
+          "aad" : "",
+          "msg" : "fb822033c4437680301f72ffc74ba3bd467a9ab7465ae45ec87ab4befd7cc9",
+          "ct" : "b6ce6d86ab7eee1fdd7dcb955b8324360839eb2bddd821ecc1efe129182689",
+          "tag" : "72fd997bf0589aa2d60721654f552e3a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 168,
+          "comment" : "",
+          "key" : "f59abcbf4218bd5c7601f080b5fbd3ae088733702c8fbef0c5296a406f563827",
+          "iv" : "a5eb0e6fe669e68239ace550",
+          "aad" : "d603491fbf0950d36489abb40dd8d42b",
+          "msg" : "97dcbacd70a678cfaed13c942cf920e851ec3e6fb1f6c6eb95f1c965fb1a13",
+          "ct" : "c0b27edd6533cfba81323ac78d0aeb0371b1d7b89938e04c319148961513fb",
+          "tag" : "56aabbde47ab2c53db48703033f8ca68",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 169,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8ac2dd770de58f0b92802fdcb9d7d410",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 170,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "89c2dd770de58f0b92802fdcb9d7d410",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 171,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "0bc2dd770de58f0b92802fdcb9d7d410",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 172,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8bc3dd770de58f0b92802fdcb9d7d410",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 173,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8bc2ddf70de58f0b92802fdcb9d7d410",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8bc2dd770ce58f0b92802fdcb9d7d410",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8bc2dd770fe58f0b92802fdcb9d7d410",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 176,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8bc2dd770de58f8b92802fdcb9d7d410",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 177,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8bc2dd770de58f0b93802fdcb9d7d410",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 178,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8bc2dd770de58f0b12802fdcb9d7d410",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 179,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8bc2dd770de58f0b92a02fdcb9d7d410",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 180,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8bc2dd770de58f0b92802edcb9d7d410",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 181,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8bc2dd770de58f0b92802fdcb8d7d410",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 182,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8bc2dd770de58f0b92802fdcbbd7d410",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 183,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8bc2dd770de58f0b92802fdc39d7d410",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 184,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8bc2dd770de58f0b92802fdcb9d7d411",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 185,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8bc2dd770de58f0b92802fdcb9d7d412",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 186,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8bc2dd770de58f0b92802fdcb9d7d450",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 187,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8bc2dd770de58f0b92802fdcb9d7d490",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 188,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8ac2dd770de58f0b93802fdcb9d7d410",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 189,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8bc2ddf70de58f8b92802fdcb9d7d410",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 190,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8bc2dd770de58f8b92802fdcb9d7d490",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 191,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "743d2288f21a70f46d7fd02346282bef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 192,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 193,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 194,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "0b425df78d650f8b1200af5c39575490",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 195,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "9d2a30abc5e178f7c6317ec9498dac39",
+          "tag" : "8ac3dc760ce48e0a93812eddb8d6d511",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 56,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 196,
+          "comment" : "",
+          "key" : "19d532dbcc934a009ce1b94a0b31ddc7",
+          "iv" : "f0bf6a9bcf6c0d",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "7b12263aaf1e4cb6e4b406e026698209",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 197,
+          "comment" : "",
+          "key" : "8cdb7f6789271a6ef3e06461e90eaa0e",
+          "iv" : "7c0d6bceba282e",
+          "aad" : "fbc4f4a52ecb4caa",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "50b12c1fa4dc4b2dc4dd0eb152db419e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 198,
+          "comment" : "",
+          "key" : "6bd7363be81b3f803c7faee607050274",
+          "iv" : "303da678d1679e",
+          "aad" : "",
+          "msg" : "539c7d6fcc0a691bd39bc43422d4e13c",
+          "ct" : "38338e924bf2ecc3ae0f5f75f2af2d30",
+          "tag" : "e40bbba6734955223fab6ddb3c7bba83",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 199,
+          "comment" : "",
+          "key" : "5b49d67b0a74e3f39e8d0bac6a005040",
+          "iv" : "b9bbb9ae003b08",
+          "aad" : "aadceda44e5d2323",
+          "msg" : "fe66e359d340ec00241736c2a6789002",
+          "ct" : "a441e2eb458f8a6f2ac75627ab1085ef",
+          "tag" : "5c545181685279652187819aa6d15b86",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 200,
+          "comment" : "",
+          "key" : "6a5b3b57f83cac23ebbb97a60f9c13c3",
+          "iv" : "64c01842e73e74",
+          "aad" : "",
+          "msg" : "7dab0c473473df8d3012c3fdf093f00709",
+          "ct" : "fb8f964065718f939010ea5e5da327cddb",
+          "tag" : "edd349c374c3d0db1ac36f11b1506d2c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 201,
+          "comment" : "",
+          "key" : "eb263b3a87fcf232327a05b2079292ab",
+          "iv" : "9554023badf3e2",
+          "aad" : "be0dd7002e2fe358",
+          "msg" : "0cac1afd5708ab03c8d3fe1d7cc83b26ff",
+          "ct" : "81860e45cb009f5728f80fd1df214f8449",
+          "tag" : "a2cb6454a2a49e96edca89b94e49c50c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 64,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 202,
+          "comment" : "",
+          "key" : "f3434725c82a7f8bb07df1f8122fb6c9",
+          "iv" : "28e9b7851724bae3",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "1c645830e6ee05589b70f02347e11c93",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 203,
+          "comment" : "",
+          "key" : "eaf5c7e35b61c64fd899bf26506cb83c",
+          "iv" : "071ffed7585eb0b7",
+          "aad" : "f0af4431f33e7e15",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "e5e154d43f3298896b34bb4f76b7399f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 204,
+          "comment" : "",
+          "key" : "deb62233559b57476602b5adac57c77f",
+          "iv" : "d084547de55bbc15",
+          "aad" : "",
+          "msg" : "d8986df0241ed3297582c0c239c724cb",
+          "ct" : "97bc3c09d5e37178e7fdd35d53239180",
+          "tag" : "3a2dc0bfde10247029f5c489e306a396",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 205,
+          "comment" : "",
+          "key" : "9ebe10ef15ebcc6000ed72d974219b97",
+          "iv" : "28a84039f2dae651",
+          "aad" : "1bab916d21bcbb35",
+          "msg" : "d073a88d45364151408718786930edfb",
+          "ct" : "6adf7f96a3202271b03787372f4cf3ce",
+          "tag" : "50bcdd152ae331554878f9a2b8140e72",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 206,
+          "comment" : "",
+          "key" : "74dfd2963bc8148338094414e3fc2b8d",
+          "iv" : "d1ef66ef2eb765b8",
+          "aad" : "",
+          "msg" : "179c1865e2bc0f702487c4e54f8374457e",
+          "ct" : "a4b7b9c9c902eddb02fb64873140256e94",
+          "tag" : "4bc1e99148f6a4722d4b92734b088d43",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 207,
+          "comment" : "",
+          "key" : "5bf0965f1439ed83eedeaad9467f5f60",
+          "iv" : "b9268feca729680f",
+          "aad" : "31fb02a7f4ebe9aa",
+          "msg" : "c844b6c457e1e5f43f82b4e484b4709ef1",
+          "ct" : "611ee7df91b062b75df86b10a4ceeb0134",
+          "tag" : "9a567c2065d7832c35f6143a41414662",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 72,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 208,
+          "comment" : "",
+          "key" : "2ec7a468e3649186e1f9deccdf95a229",
+          "iv" : "99fdb158fb8ebcce64",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "658f01f90c35331cdd6986f736cc37da",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 209,
+          "comment" : "",
+          "key" : "c6bc0987b5dc9432da66bdb153859fda",
+          "iv" : "d768d1b80a094506b4",
+          "aad" : "4713f86a53cedd50",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "4ec31dfebff4a90d5efbdb8504cd8c79",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 210,
+          "comment" : "",
+          "key" : "6a1c98e4d20bc6ad594833d6e9aa4794",
+          "iv" : "3de29d92d3018eaafc",
+          "aad" : "",
+          "msg" : "f623322fef6d49cf7abfa16b5fd83951",
+          "ct" : "afcbf0385f26895bcd61266006dc1d98",
+          "tag" : "7914e32d181043321234dc16d79b3576",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 211,
+          "comment" : "",
+          "key" : "022b669b7d391f0ff5fab123c2ba8817",
+          "iv" : "2e02b04ce6b348ef86",
+          "aad" : "f9c862291705519b",
+          "msg" : "abb18f4662c1bfa7984560deac4a415a",
+          "ct" : "45c3ab70b1c883c98b53fc9c0be77ecb",
+          "tag" : "2eced5eb7d60431c09d3ba49230b23d0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 212,
+          "comment" : "",
+          "key" : "8965e641f46dbbb16aa83f9459370dc9",
+          "iv" : "310c4ee082c4870fc2",
+          "aad" : "",
+          "msg" : "5d2278c8b4ed8a37c95488935c1db06e68",
+          "ct" : "db91b98da578d8e4ebf18f65f244579eb7",
+          "tag" : "2125ef21fcba471039c131786c99e74e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 213,
+          "comment" : "",
+          "key" : "22c942b1212a3cfa196e9ad06b03fb2b",
+          "iv" : "71a2b87540b11d76a6",
+          "aad" : "c0e05960b831e875",
+          "msg" : "4e3b6e3e2ba5663eebc5d83dc249eabce1",
+          "ct" : "6ffa875b853cc4f6a41afd430bd7c3ceee",
+          "tag" : "0b4964856bb2b27eda3826ae128f67b3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 80,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 214,
+          "comment" : "",
+          "key" : "1e6c6214a6a5dd5b628c71de07788137",
+          "iv" : "40bcc315dec88bf326cc",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "dfd70e3e5a13166b460613abab928f26",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 215,
+          "comment" : "",
+          "key" : "e41343e5ffe20fe48ff010b146ceaead",
+          "iv" : "5f172fbe9f8eec0fbf79",
+          "aad" : "9b46675901a4be0f",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "2104bc9ecb79b71f32f27c9ee4fec640",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 216,
+          "comment" : "",
+          "key" : "fc93582fa1f8b58cc9e80dd583e9bf8b",
+          "iv" : "5d4bf58798fac351a399",
+          "aad" : "",
+          "msg" : "866d5e1b0aa29004e51ea87de86e3c05",
+          "ct" : "b64650b6935fb04b9742f5729f286e03",
+          "tag" : "b9d3947c1605a2d58ec3f3221846c7da",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "",
+          "key" : "df2db48b1944fd9e24589d14357d0f80",
+          "iv" : "f9a1bb32f579b5f02728",
+          "aad" : "03922600d7d033dd",
+          "msg" : "eafb69e40238a34e398523fb35bd6612",
+          "ct" : "9de6ac37f52b8135047af8d5e57fb36e",
+          "tag" : "0543351aa86ff8ca5825bd7bb7c0254e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "",
+          "key" : "3bf8c3c301190d23f71ac82c0c5b0f9b",
+          "iv" : "d5274406a4f5a2e2d101",
+          "aad" : "",
+          "msg" : "03ca74e58b8b38500e1e65b8332f41f06c",
+          "ct" : "999f476b51ce686af59b0bbe221ce4e8a4",
+          "tag" : "2ac48377d239fa7ffbe3c503e0278f98",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "",
+          "key" : "16942eb89d4f7fe65bf9b49c16f830ab",
+          "iv" : "2ba76d03995c62dc7ed2",
+          "aad" : "32c7c6072dbd735f",
+          "msg" : "b2380e9eb596d5af697c0ba1d301a833d9",
+          "ct" : "f563cab1f5e56f237a60c2c2950ab7a5c2",
+          "tag" : "25c89e410c0a535b94a383ad3c014464",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 88,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 220,
+          "comment" : "",
+          "key" : "9d2fa75929612e1213460f998946dcec",
+          "iv" : "0e948a03dbfa10817e8826",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "2f1fa3585b9a11ff47bd486f95572246",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "",
+          "key" : "7a970406a747c2327ecbc8b107a190cd",
+          "iv" : "99b079de952d60da0d034b",
+          "aad" : "2f080b2deb6644ef",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "9dca9ba441013ce9fc0ac3dbf414626d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "",
+          "key" : "acab31483d9de4ad77f4e63fe41b57ae",
+          "iv" : "5c0939e71bae1a9de167d4",
+          "aad" : "",
+          "msg" : "e4d72b2f7cb69bc54a49f4d5cea4f23a",
+          "ct" : "0c506843ba7bd2dc4578e6bb83fd0c8d",
+          "tag" : "c275373037635bae294f99c8e46964b3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "",
+          "key" : "82841ef7fbae35546525fbbebf4718fb",
+          "iv" : "b5cd818f73a36ed025b6cf",
+          "aad" : "44f48c2a20456358",
+          "msg" : "8c2c823bb39941b1c6b75bbc82f05ba4",
+          "ct" : "b287c637a7554362c80d6b24d50ddfb3",
+          "tag" : "3967277da0f856f8f0ad49282894d2bb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "",
+          "key" : "f9c6d9627fd2e731e2f115b3d0a53bfd",
+          "iv" : "084558ebfb6582f3d1879a",
+          "aad" : "",
+          "msg" : "7463af94626279ce0112f670c3115099fd",
+          "ct" : "d46b6e962b6b7a2352fc437914d9c0d9c0",
+          "tag" : "ebe336176e27041ae78791aca34548c8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "",
+          "key" : "1d286e525ec2864d9ea6e7adfbdc4970",
+          "iv" : "1ad44879f1947abd503dce",
+          "aad" : "1db0eaaaa1e2c848",
+          "msg" : "7b40e6c987692d0202cb6f44b423c267dd",
+          "ct" : "84f91f9d35b998598e50feb34dcaa0d260",
+          "tag" : "ae4e38cc4b730944bc459df85a536f4e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 104,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 226,
+          "comment" : "",
+          "key" : "694a2ae94cc2fc6c82dcd16c58a34195",
+          "iv" : "8b4de9497e78d9c73bdcb374de",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "36b20bcb064609cbc03ae32786f72eb5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "",
+          "key" : "268c961a4fa54c214a2af8fe76a277cc",
+          "iv" : "f13443da0e412f1cc7a90165c6",
+          "aad" : "4fad12b402c58029",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "be58071342c9348baf78104e2258e616",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "",
+          "key" : "7c5aa1cd2fc171d5bb91ee74f31e1a63",
+          "iv" : "70a2a5303734517827faa7ee78",
+          "aad" : "",
+          "msg" : "4bd1d3427e0735a08f475bc73ec3648c",
+          "ct" : "9ab61214ea6611510706315f0fc9bd65",
+          "tag" : "a2b3fc3c1349cbfd9ded7cc32effb389",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "",
+          "key" : "e74b73c2ad93d38dd4432d6e51d3e3ec",
+          "iv" : "06ee28ea532ff5aae6b0f6a28a",
+          "aad" : "10bc9864f1332e41",
+          "msg" : "aad5d758041e5443ede7e9bbac1db490",
+          "ct" : "d3ed6bb55d98b00e1b76938a1c6bd5ed",
+          "tag" : "22201e4eb2a42291a7d57e357082d77e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "",
+          "key" : "be707774d9eab370db4e8250297a7437",
+          "iv" : "7944b487d59b6ffcc96c9df62d",
+          "aad" : "",
+          "msg" : "28eab56885e1e12bd72def1138237f0dbc",
+          "ct" : "ee05ffeaab17bb4de94527e0297058c48b",
+          "tag" : "ff899f929b371639d48c3c447f51c577",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 231,
+          "comment" : "",
+          "key" : "30829416d80d4b6dd91a16c4694c5acd",
+          "iv" : "8bc7ecd5bde196b72319de6b77",
+          "aad" : "970fe65b7789a555",
+          "msg" : "4a3122f801d6638228fa0e30af3f36627a",
+          "ct" : "5125ed68afbd34bc00c73171ada31ee84a",
+          "tag" : "1da320c8bab525e375f37a3bba3e0eb9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 56,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 232,
+          "comment" : "",
+          "key" : "b4544cae6b60b7720f3ade71e90e58c21d6e487183d4666a",
+          "iv" : "2ba3da112cf5e6",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "341551f2c05ee9314f0eb552939e5486",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 233,
+          "comment" : "",
+          "key" : "26bddb2eb2a727e2910df94ad3e12ac130a49a8f7f41951c",
+          "iv" : "c6c0ef48151b32",
+          "aad" : "7443b91e73475de1",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "fd7aab595dfeb3c8a1660eab043b3d01",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 234,
+          "comment" : "",
+          "key" : "806ed9cf33a1c2fa6a8bffad7937c3ea226408ebf248d176",
+          "iv" : "2bebcc0af672bf",
+          "aad" : "",
+          "msg" : "be1702414868c94aeb99c1a088ba8c48",
+          "ct" : "6e6f3d3b36482c39a99d597ea582f430",
+          "tag" : "7d11f5549d87dda7b0762202270a7e28",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 235,
+          "comment" : "",
+          "key" : "095fa678a104e9c3d246304c5dddee045ddab3d79ea8a726",
+          "iv" : "febf6bf7dd16a7",
+          "aad" : "6a4490ba9f61db88",
+          "msg" : "d25ecfa877896030058dcacab3159cb3",
+          "ct" : "f3578aca6d3ccbc916f5c1d71a45878e",
+          "tag" : "8c732f4a571bf105c6ed1cef6fab2876",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 236,
+          "comment" : "",
+          "key" : "98988da462a46ab3dd613bd37069f4f429a9a81841e76dd3",
+          "iv" : "ebad9af5f869f5",
+          "aad" : "",
+          "msg" : "aa3fc05574ee101ed7527de5da4ac37860",
+          "ct" : "9b7bb35db723718c7f9fd8cd5c83124e78",
+          "tag" : "a59567307577c8e831c23ac09a92c6a1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 237,
+          "comment" : "",
+          "key" : "71de008cd820fc033974b6b1308f662874259b19562e70f3",
+          "iv" : "e725d31dbf5b99",
+          "aad" : "d767f40e91c4f15c",
+          "msg" : "831a38cbeaa9f22edf918e971956c15fa3",
+          "ct" : "c8eaf9546af72261723ceb3ae3bbb7303c",
+          "tag" : "68d728744e5977342d93af81445857ed",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 64,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 238,
+          "comment" : "",
+          "key" : "d74599b3d2db81653de43b52fc994c50d0be759fab87c33a",
+          "iv" : "d1c61cf8532531b5",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "bd78dfc804a420c19fb13b2f58d82c5c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 239,
+          "comment" : "",
+          "key" : "8fc269ef34d2c2127c89493c0960ee0849fadf76667885d5",
+          "iv" : "626bf00acb930480",
+          "aad" : "13aa1748aec41042",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "9c453275afb006c78f6f29079c7c3ef1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 240,
+          "comment" : "",
+          "key" : "0b177198c8b419bf74acc3bc65b5fb3d09a915ff71add754",
+          "iv" : "8f075cbcda9831c3",
+          "aad" : "",
+          "msg" : "c4b1e05ca3d591f9543e64de3fc682ac",
+          "ct" : "0148cdf90d566a8eb651409956c3695e",
+          "tag" : "b10d57df83c4c79b9f590e3e5aa9e9b6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 241,
+          "comment" : "",
+          "key" : "db869e55576f57c8f92649659e3cb8be10656bbff4b69460",
+          "iv" : "67c0305332e1317b",
+          "aad" : "93f53ab36f45cba3",
+          "msg" : "002fbd2e0f39d49f258b3f7398391e2c",
+          "ct" : "0ce4b1f53922ea148f26a638d1c9e785",
+          "tag" : "9be9417b3ff9e8d5b24e041439b02c86",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 242,
+          "comment" : "",
+          "key" : "2af96f8cca1b563d17e7969e01645ee7b9f5413ac93ea570",
+          "iv" : "958d1faf8c1267d8",
+          "aad" : "",
+          "msg" : "c71ed8027c745626ea03bd25628b99e1dd",
+          "ct" : "fd66cd926beadbee33cdae43824fbacfc0",
+          "tag" : "8c8dafb2027f2b0c03f62b5f9fcc0ad8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 243,
+          "comment" : "",
+          "key" : "5ed77086ec0da8f6ac00563ad6fcb85005ac40f39211b0e4",
+          "iv" : "4e70dfd49cc2ac76",
+          "aad" : "29bf756a2f77066b",
+          "msg" : "c049dcf15af3f975987d5f1250fef5414f",
+          "ct" : "36960da029e67aeeb145d57dc0da68ac27",
+          "tag" : "09505baddf28cd842fd7fa7c544d0c48",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 72,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 244,
+          "comment" : "",
+          "key" : "f162a1094012f6bfb10270cd5609a20dc24dec3727f8e598",
+          "iv" : "0562f03f5124642f40",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a9eef8c9f9460006b73f2da2317c7b7d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 245,
+          "comment" : "",
+          "key" : "0fa5861ef439184265112ca6ea785d214a5bb12dd108e434",
+          "iv" : "041ffcd955eb4939ff",
+          "aad" : "beed0c763b56c582",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "39fd1a2107540f9e6d33ad23b425ddef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 246,
+          "comment" : "",
+          "key" : "4f589aaf03e1219585f411631a2b287f20e9cca93304d004",
+          "iv" : "f0bd7863d34b6c963f",
+          "aad" : "",
+          "msg" : "ca80f91329f1cfd8784bdb97dc0d5b01",
+          "ct" : "0c3f7b1e0585deaa800a7105fc141364",
+          "tag" : "9427fd74870e29db527f7df247477939",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 247,
+          "comment" : "",
+          "key" : "07879e22e8c3cb5b5fc2057c3985906c39aff4e40aae4e20",
+          "iv" : "4ede0c3af9c0debb8a",
+          "aad" : "cb333d66bde2475d",
+          "msg" : "b9ac42c5d3169087a721879c19865908",
+          "ct" : "6cf2cd3a1061d9b6fbe3623377c6b443",
+          "tag" : "f7297a7266d2f7f7aa7ec05e0f9bf9a9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 248,
+          "comment" : "",
+          "key" : "0b144f0668ffd1a97ff2d2bf9344ef0e2848964aecb2850f",
+          "iv" : "3b7f06b4ba5b0b71ec",
+          "aad" : "",
+          "msg" : "600b5ca3e8cf20a09ff752ec2e7378ac1f",
+          "ct" : "58d5762317cf5024627159ace6b48f797f",
+          "tag" : "16ee7c4aadf258458030e5af1bdbed2d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 249,
+          "comment" : "",
+          "key" : "a3bdd065fe6475df94a2092c3f72b1dcd3d0f0413b4f34dc",
+          "iv" : "feeb53f7cd16adc8e4",
+          "aad" : "6ba7082e398bab61",
+          "msg" : "d1e7616472ca17015eeaeac30b5b22f007",
+          "ct" : "9538e5a70ac33ad0924f038b34d1995b7b",
+          "tag" : "cb459d32bbfd2093eb4d7933d50ffa27",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 80,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 250,
+          "comment" : "",
+          "key" : "172f22f2e59364dc418cd751dfa8444ae18644c0f9a2be84",
+          "iv" : "bf9026d3ddaa37e7f180",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "b077ff4fad9ff4a94b6de8a66ba5b16c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 251,
+          "comment" : "",
+          "key" : "143efbf8e0293dd4c13159cf260ec591f5f92bb3af8dd863",
+          "iv" : "111a95bbb60f9a3bba53",
+          "aad" : "51c14678c4544777",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "099a7c5090443cd4000f970d42bcd1d5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 252,
+          "comment" : "",
+          "key" : "4c41104d3f40265f9e35c320a01e7876c31400a0bd4d7092",
+          "iv" : "85fdc81afd9f4828177e",
+          "aad" : "",
+          "msg" : "ba7cd07dfd8b5cf6ffd3ddb7635612c6",
+          "ct" : "386b634a5def89dc7302724ad11921fe",
+          "tag" : "4d792201a998889457b4c83cab0e5c35",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 253,
+          "comment" : "",
+          "key" : "8bcde517ddc63fedcce8e34181f23530f471d6858c48dbf9",
+          "iv" : "bc6d51de0c0be7c45911",
+          "aad" : "e0b3fb36c7b16341",
+          "msg" : "1b42198b4ac08224e1e761a77205e392",
+          "ct" : "e8739972e4180e2e520121d8e9aad7c5",
+          "tag" : "6ceebc4d202945383e511b7cadde5695",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 254,
+          "comment" : "",
+          "key" : "37f0b2d53d52407eb9ff33530e74b4edf5825a7bb37c3dc5",
+          "iv" : "303c766753011b635544",
+          "aad" : "",
+          "msg" : "1ed6abb2f283ca7fde5de662bd7058a1ea",
+          "ct" : "75a60df0778eb93a34072e74fa3d6b0224",
+          "tag" : "f27b8cfc5bf5d2b4b4d93fb584d719ff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 255,
+          "comment" : "",
+          "key" : "10a779b245741f1ab3124e0e504fdcd315784c67d0136fcb",
+          "iv" : "75a44616ee96b30c9eca",
+          "aad" : "4c5d6471ac20df18",
+          "msg" : "57d758f924a6eaefe4d2625931fc847107",
+          "ct" : "ab7b01ba57edc0a41b190fb0f1d5186cd5",
+          "tag" : "3e93a45f5cc5eaca2150db3534a8903e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 88,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 256,
+          "comment" : "",
+          "key" : "87c55b2f185f177faaf4b16d93af6dad477146345d0ea992",
+          "iv" : "0946c69953f4b952bc7c23",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "257b3c597ecd1d67c3dd35dc70c68e48",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 257,
+          "comment" : "",
+          "key" : "8207e8d57dccdf5480f702c1fa72d0c6d02f1badc6fc08c5",
+          "iv" : "c18e46a70c592980a2ccc2",
+          "aad" : "bd2e2a9da32a9d67",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "1145c20b7f31d57d458afc650a6d4590",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 258,
+          "comment" : "",
+          "key" : "2c2f7e8bb75ba931a711eca4d319e19ad89767248fee5360",
+          "iv" : "21a10456470d083ca7bd7c",
+          "aad" : "",
+          "msg" : "1e9f467441e487bf68d10be853b24479",
+          "ct" : "186b50f0edf7b523021384f5d8c09049",
+          "tag" : "8db01236b715a76432fcb02cff2f6ba6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 259,
+          "comment" : "",
+          "key" : "0a3bf0a926fb14a3b716bfa021a208da0330e57bed36828a",
+          "iv" : "a0ba36edc43d935ee94213",
+          "aad" : "3fcd93ccb8e97956",
+          "msg" : "9ab6c109c8069d054ccbb5c33c6e70d0",
+          "ct" : "27d1e353233755a2fe28231637739c46",
+          "tag" : "b9b74765ed3d53031bf3c7349e74340e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 260,
+          "comment" : "",
+          "key" : "a68dfe22cef2bff0f28d4b68c2a6938b16dc2109bab09c38",
+          "iv" : "fe76a03b770b431dc6872b",
+          "aad" : "",
+          "msg" : "f5569155305800bc94184b1ef1c152e197",
+          "ct" : "34282b16489e7bc7136a2498328bd22e76",
+          "tag" : "e9b7ae57e2b7f60d09f50bed23b93438",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 261,
+          "comment" : "",
+          "key" : "ffe5d2ad71d432d6cd5f1072ec2acb7d7cde9c5c615d0eb9",
+          "iv" : "ea2198307402a106ea4293",
+          "aad" : "f93db4f4aec8afe8",
+          "msg" : "c9db4d10d42340ac736271edf9f6581ce8",
+          "ct" : "bd960c7f60392e8d0afb28ba16ea63afd3",
+          "tag" : "f2ca88d549dff207d979756d13e865d9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 104,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 262,
+          "comment" : "",
+          "key" : "d465544b5db9eb1c495cafaf5d9ac7e10faae74541a0a718",
+          "iv" : "9582afc30556ca12d154c42f03",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "37f618f8bb7ff85ec644b1cbcca4c28a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 263,
+          "comment" : "",
+          "key" : "6f1cce6a353aa45f926facbb6865d3598260db5390e937ad",
+          "iv" : "ae0fe077398587747a642e5422",
+          "aad" : "326699f56ac28def",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "07520b384cccbb80b9679a0ef48cb6a8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 264,
+          "comment" : "",
+          "key" : "36f97a97d1dd67e5f83ccb529da25a604b68b8da904fe3f6",
+          "iv" : "2393a0a0e0b8efdd59db3436dc",
+          "aad" : "",
+          "msg" : "c02f28773233ffca812eaf1c946cd8d1",
+          "ct" : "d41286c461fb65d41066a10388eb69c8",
+          "tag" : "073696dffa2071440014dfac4c6cadb2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 265,
+          "comment" : "",
+          "key" : "f258d33f1f1f3aade5103d56c4357b7a4f8dd205e460658e",
+          "iv" : "14a9ed9539525f540d9a46af69",
+          "aad" : "b67196ee87890f55",
+          "msg" : "f222fdfd343b57a70d002d14a39cae59",
+          "ct" : "d27cda7ada5638db59945a31d93ef243",
+          "tag" : "c2c64dd8b08e7b4b1ce60d5b96832989",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 266,
+          "comment" : "",
+          "key" : "ee794197f20e643c3877ad085f031c750ff232568e53d7c3",
+          "iv" : "31eaaced4a0142b6455cf716e9",
+          "aad" : "",
+          "msg" : "772c05b2377be0b3bdfd9a357c276608b0",
+          "ct" : "e06e98bf612f1344fac0c3ef8d3a656ba0",
+          "tag" : "fc26a26f2314e5a279c2c7d07c044585",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 267,
+          "comment" : "",
+          "key" : "b1bbeae5fba30441e12b1ad2f74e272bc205221fe34a3495",
+          "iv" : "996cf4b0eded6af66ceffbe8b7",
+          "aad" : "b3c337b658596f4c",
+          "msg" : "39113900d287d90c5401d219aa5282b91e",
+          "ct" : "d1928ce85877f1d1fd5696e56bb50591e7",
+          "tag" : "7b8527e98192d7111dafff551782f701",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 56,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 268,
+          "comment" : "",
+          "key" : "491828f2dddcff5f966e6627f4b6a85a2ea76fd1e0b6117a13e94d0e81c063a5",
+          "iv" : "4feedf9d9c07e0",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "1ca0a418f337a4c04f2123fefd31796d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 269,
+          "comment" : "",
+          "key" : "a57905b9eb31fbb1cc539639e670b2f1d12e277139b51a098cfebc1820fba1a4",
+          "iv" : "27cff76e28c613",
+          "aad" : "dcd2f84ed0eafad0",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "0b21f50e206c0721c6c059f9207e6d3a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 270,
+          "comment" : "",
+          "key" : "55fa96eb3c945cab676c42b8caac34a1717d4337f4c90806b226d568121ec5e0",
+          "iv" : "209798006d012c",
+          "aad" : "",
+          "msg" : "34ef603e3c8f93a0e4a4773f7b57acea",
+          "ct" : "797ca05b20a149d42e5ab33835855b5c",
+          "tag" : "8191bd254a6e986e3c22e8106894d64f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 271,
+          "comment" : "",
+          "key" : "e0d82f6088ec675d92ec6b44a67dc6eb6600f1b742bdd5a851b036af02eef825",
+          "iv" : "06edf6ab0c7a92",
+          "aad" : "e98fdd292291dd01",
+          "msg" : "5bb3639265c8563e6fb738bed8c8532c",
+          "ct" : "cb2513417f9cb546d73830b919b2cb33",
+          "tag" : "d3c06c1614f7ca3b0952d67a5bd0d017",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 272,
+          "comment" : "",
+          "key" : "123680a35c43cf618c69f281298199e54e40080e16577f310f096e367ee3cd40",
+          "iv" : "feea3f0f2d0eca",
+          "aad" : "",
+          "msg" : "33ee630f34588dc68f8f439fa319f4ef1e",
+          "ct" : "0b9f38dea9dd82656fc1c2e1651b12e1c1",
+          "tag" : "03798b2baaf5af45e67a716c7b2a2a17",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 273,
+          "comment" : "",
+          "key" : "7beb1e06b585fada875fc610c3cbfb9788fea291436410487d8a844c217dfbb7",
+          "iv" : "37af0974ce2851",
+          "aad" : "233013d917f3ad76",
+          "msg" : "e0396376c6e74aaf27f933b6d59f1bcf8c",
+          "ct" : "81f8499c64ed65e4d996f8b2c6484de1e2",
+          "tag" : "6db4b7c55fcca5fedee971a4a122bbfe",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 64,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 274,
+          "comment" : "",
+          "key" : "61ba694897925d1b4174d40401469c3ef267cdb9f829edb1a10618c16d666059",
+          "iv" : "0d10c5c84b88d688",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "8ec71f7daf935edfac9de968f1d76477",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 275,
+          "comment" : "",
+          "key" : "30b784511193555f161123acad2f18ae3bde912ea9cc4a9e55316d822ece9652",
+          "iv" : "0f1d38c6f30b4475",
+          "aad" : "d2cdd62280888fe5",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "02fca41f06b8c5438084440ff4cea5c8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 276,
+          "comment" : "",
+          "key" : "115884f693b155563e9bfb3b07cacb2f7f7caa9bfe51f89e23feb5a9468bfdd0",
+          "iv" : "04102199ef21e1df",
+          "aad" : "",
+          "msg" : "82e3e604d2be8fcab74f638d1e70f24c",
+          "ct" : "74c3b00322c091608037d4a8eb5afbec",
+          "tag" : "a098b67a2c79dd939472a18502632701",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 277,
+          "comment" : "",
+          "key" : "a6742dd3387b1e11dc0048347120f9176dff30295c0341d69bc2deace1933fd8",
+          "iv" : "bd3abd101a6c625e",
+          "aad" : "61515463b68495bd",
+          "msg" : "b9be89ba08c55ac044b6109bc4a1eb6b",
+          "ct" : "2fbba1ef8855545c67cfc53ed49b3724",
+          "tag" : "1a82cc390501d29915c2c19af0b5ae53",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 278,
+          "comment" : "",
+          "key" : "c43a2fa6d37117c1ad70cf07cd5d607c913ca8fa558480aa0a2413e3d6e8b1af",
+          "iv" : "839ae24f13f2eaba",
+          "aad" : "",
+          "msg" : "2cf8405946bb723d406662a31dfffd5141",
+          "ct" : "db8c02d3798760bb4038d370ab6a93e451",
+          "tag" : "3dd424a617502b64484a88957ff094a7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 279,
+          "comment" : "",
+          "key" : "f9489dda8a08ab833f2a658f3e425ad67707b0a52911081622e0e7ef90a33e84",
+          "iv" : "6a1b557a0f470822",
+          "aad" : "ec6c76bcee1ebc6b",
+          "msg" : "a5d397bebe7ac570d2399390e8f0ecb2b6",
+          "ct" : "a4e3e095a20041ae217acffd455a742db5",
+          "tag" : "317bc9f1b520e98ed8820dd24029ab52",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 72,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 280,
+          "comment" : "",
+          "key" : "66f6d79b723ccd3136d2cf788fc5b1c2f4b98463a57ae4dd29f3888aba37d086",
+          "iv" : "0a0aab4230fc3ee8ca",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "2e59d7b1d1ada4c5f4c74b3539668799",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 281,
+          "comment" : "",
+          "key" : "df89e94e1979576eb86b4819c902aa5cddfd14e0224548c03531eaa79e9a2264",
+          "iv" : "39d912cc1cd3de7f18",
+          "aad" : "fb1308e9082dba57",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "dd8b284b1ba718ff149b29c0be62e708",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 282,
+          "comment" : "",
+          "key" : "3e678307509ea31ed5f3be532ba61a4f03bc8e1375113641d10998b50d1e42e3",
+          "iv" : "c0636667b331a08113",
+          "aad" : "",
+          "msg" : "320d0328d2164afcfb899265938bae67",
+          "ct" : "7c56071600b1a3c6d87a4ed8be56187a",
+          "tag" : "58c85126d5a5291b48a939556ca8f3d6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 283,
+          "comment" : "",
+          "key" : "7c9b18435f5563e03505a6f5edfcb104deda40ec89998f6816e108da9704cdda",
+          "iv" : "9863ce1379a06a5def",
+          "aad" : "f00dc05bd000fc70",
+          "msg" : "b0376845c02697935f914398555ec427",
+          "ct" : "49d7d0b796d16dff6d0f7aab8c022776",
+          "tag" : "6a2590aec13a765ed773f4ded0f12186",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 284,
+          "comment" : "",
+          "key" : "943311d4a1f7d21108cccee94035dd717fc3ab41d73c36c2ffbc017f8222e857",
+          "iv" : "82339e7761513c74a7",
+          "aad" : "",
+          "msg" : "b68f033c45c672b696c03207674b395b89",
+          "ct" : "c7a2fe3a9fcf3b0b5ad8dcc300c49ba485",
+          "tag" : "26a6c3714386a97056020d4bf24f7aa4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 285,
+          "comment" : "",
+          "key" : "b36a3380f9bfce992d155e18473eef8c7eeed8c4fe8f5447a55ffe88ddf3bb9e",
+          "iv" : "a2159849b39d862852",
+          "aad" : "bd75192fbacbefe6",
+          "msg" : "3e273260924355f59489646080870f19da",
+          "ct" : "195bcb64ad9474f83dd1659d47c22a0282",
+          "tag" : "80a83e5a8cc744bcb322ab0717395293",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 80,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 286,
+          "comment" : "",
+          "key" : "44ab204d150adb17f83d1e5205b6e1419673fadee610fb9a38185a96741021eb",
+          "iv" : "ff3914982be30b3b2112",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "f500cef310410d8940cf3490f5f3b5d7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 287,
+          "comment" : "",
+          "key" : "ddee6a7b131d31275ec1cb35654f9d25c394980a1dda37f70af0fb62dd77a9de",
+          "iv" : "06d84bae11708c428023",
+          "aad" : "04c1271ef52c041b",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "bac436ba985fdf3f14446b92ddf35dd1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 288,
+          "comment" : "",
+          "key" : "d3b44b8dfc3530404a63b3ca04cc71cfc71a5538448b2625c981856cb7daed0f",
+          "iv" : "7c3c42fa17347e1df797",
+          "aad" : "",
+          "msg" : "1d1775579656f7f6c6891401d733e2ab",
+          "ct" : "61d6deba72b41e9da6259fa805d77eb9",
+          "tag" : "513f5731bd000ce68a6eaadf3c92535a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 289,
+          "comment" : "",
+          "key" : "feecec225fcf20093818880994fedad53dc0c1743aa99671cefe2929a503e0c6",
+          "iv" : "ab8d23830b91dc6a898e",
+          "aad" : "24889b2ef12a318a",
+          "msg" : "7b70e1bfe1a776e8f44ca432dd9ef999",
+          "ct" : "46f60730db041336cc051d4ef4de029d",
+          "tag" : "7717adcf7d3ed0f7878e1ac33a35cb47",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 290,
+          "comment" : "",
+          "key" : "cfb73308a83090161fed743368f5480872eaa62df5a8ea077dee540fd5a2ef15",
+          "iv" : "1d375b8e07c3c4de82f8",
+          "aad" : "",
+          "msg" : "fa0bc3e2cb70183cd56f47fa1291301f47",
+          "ct" : "d92c0375a4dcb184bc90251585061db036",
+          "tag" : "a0ddef0c6bd94fcdec39a7f07f0a2c13",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 291,
+          "comment" : "",
+          "key" : "815bdaab3c187ad73b127c8d39a133b41b66e299ba24fb446e35e3b112db8e66",
+          "iv" : "0cd0551f0c741760b747",
+          "aad" : "c1d01e4731f36066",
+          "msg" : "558769c6d4f50a0db620c23fe107a7fbe4",
+          "ct" : "c1ce192fb671892bb83bd22dbc82d64082",
+          "tag" : "4e0a0be1aa0e75cd7bb1dcb27a010910",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 88,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 292,
+          "comment" : "",
+          "key" : "46948c6d69845499104d5dc2fae44880cfe7d0bcbcee57efc0133c266b6d2621",
+          "iv" : "05f715fd0a5603dd84af76",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "11e678c0b260c5a3ea70f6a46e4ef436",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 293,
+          "comment" : "",
+          "key" : "e689eb77a578399fa17a75083d25018ffbb68f24d77a029757541d6539bffbdf",
+          "iv" : "4a419618b2832de7a4f99b",
+          "aad" : "ecf46eaca841769f",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "4a2615d2d5f8e97b92743b0ef2f486ab",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 294,
+          "comment" : "",
+          "key" : "aacb1336d6ee4d96a9a12e5b8f25f04800d4aaba55f379218d64edb3460fe215",
+          "iv" : "994c191e7a29c0efc1eb4d",
+          "aad" : "",
+          "msg" : "7bead5abccc876efb0109e412f06c751",
+          "ct" : "5aa31aa5eb103655b78c4f7bcf08c917",
+          "tag" : "64e41d31eb0df80adcee328f081c4aeb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 295,
+          "comment" : "",
+          "key" : "60d6841e9e6218a2c8605a7794e74fb215dcf3a70a0015d497ed16564f2a83a0",
+          "iv" : "4c93f591af92f16596554e",
+          "aad" : "7cb0eb9aa21fe859",
+          "msg" : "c0d1e635586b0ef835c01479a32175a3",
+          "ct" : "0c266113544d7a901ce721e1ead6d8f9",
+          "tag" : "8a149eaa05c8722b2663c345a6a5418c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 296,
+          "comment" : "",
+          "key" : "9dcde57cec27de6b584db4bd810935bd3b3c4ea8f22a16a7b2a62ef51679a13b",
+          "iv" : "5c3439bdca457b02b04925",
+          "aad" : "",
+          "msg" : "402cb1fd3b0796200d888f7b399235f5b5",
+          "ct" : "43f7d99c1a0e504aadd8f8b2981b4aea52",
+          "tag" : "958e19b5c14eebd2d25509336aa6d4c2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 297,
+          "comment" : "",
+          "key" : "b3a06e00100ffc42dbdd5317f43d2b48f8c11e4bd6e9e3edab58e9944c559278",
+          "iv" : "f3d24b362bf12b84b8a66a",
+          "aad" : "0242b5e804a79188",
+          "msg" : "03b03b45f6f320b99d8158ff8b00f0ad92",
+          "ct" : "d127fd42b2ca4beca9f9ac86b63a1622ef",
+          "tag" : "8a499aab9e8f4096da603c6ccfb9ac4a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 104,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 298,
+          "comment" : "",
+          "key" : "a4994b65143536707b151ee6e79e69ab9c6d73000819fd2991dd28abede6b3e8",
+          "iv" : "ac64444972d778d52f5531ae88",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "8f3530c8adf86ebc6c4497cede15ccd9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 299,
+          "comment" : "",
+          "key" : "f99f2720f03ec3a9d0dad37e3a915bea3a11cba4bb0f60cd8f542b330163bcd0",
+          "iv" : "7e0f99a048b6e2879720fe4318",
+          "aad" : "94ba977e74455ed8",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "cdc3bef39ea53af680199e362609dc29",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 300,
+          "comment" : "",
+          "key" : "505b26d166a6ebd3db69cf12bee25b73651d0d332d0fb248b50ce9a1fb3a13f1",
+          "iv" : "fb04f7bb3cd382cbc0893719aa",
+          "aad" : "",
+          "msg" : "ae8bb1cbc92c73e73e59a0d7a9d7f528",
+          "ct" : "4335b708f27d1c1b4d6e985f18aba7c5",
+          "tag" : "069ee6f5279dab73593e11440d239eb8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 301,
+          "comment" : "",
+          "key" : "a6938b2e56d5dc55665956840ac690c8ac9ff421cc062fc34209f7715f2d526e",
+          "iv" : "ad37de72d3521546d5ff51462b",
+          "aad" : "0a3809bc563c6675",
+          "msg" : "9d286bcc115f10b2caa8c5d8daa91ec7",
+          "ct" : "4ed4dbc8aa8cf6375021d15e43c1f6c3",
+          "tag" : "bfba9c41ec63aa296b1446b888b6251c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 302,
+          "comment" : "",
+          "key" : "45e59f4429087360b1b240fb9b591d861ad493688b0a5e8f85ffea2acff8393a",
+          "iv" : "20e893f4562bc1c56c32c00cc3",
+          "aad" : "",
+          "msg" : "3fbc338ad7bbd6778cabe134a02c68e53c",
+          "ct" : "67637f9c9f7da41d4b3637e3a054362b30",
+          "tag" : "b346d700cfec0f2d8e176d3eb9c5bec9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 303,
+          "comment" : "",
+          "key" : "004c6ca04078bdfd557f915025a8ec93b5368b86caf3d657432a5e1d1cef9917",
+          "iv" : "999d95edb925e7744e32874009",
+          "aad" : "082c1433bb64e110",
+          "msg" : "0552fcb52c498d91b89897ae6f640e1f5a",
+          "ct" : "5b4708b72b68466639e4b5f3d3da1d1e84",
+          "tag" : "f7f0c0e0c01bf772cbd90cb98093dfb8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 128,
+      "tagSize" : 32,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 304,
+          "comment" : "",
+          "key" : "103e859d3a238724bf85b2100f442f1d",
+          "iv" : "f91d64784161fabd6c962e50",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "2b31c21b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 305,
+          "comment" : "",
+          "key" : "71466dc3046b1e6c0838ba6c9ef41e79",
+          "iv" : "2928095bd7962e9e6024a2b9",
+          "aad" : "a617cce74d0439900597cb3ddcfc25fb",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "383f8abc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 306,
+          "comment" : "",
+          "key" : "3cc93804e2d699619278a941389cec3c",
+          "iv" : "c775dda314af64c310a7c1d3",
+          "aad" : "",
+          "msg" : "124ce71e08c1324f916570d533032919",
+          "ct" : "f246754cd32a9960d3d5e5352f1d73c7",
+          "tag" : "60dbd676",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 307,
+          "comment" : "",
+          "key" : "9089e178f3f90bfc0f68e559d338c39d",
+          "iv" : "8b2bfca64775b50935b48221",
+          "aad" : "ca9b4050b6bd0f0ebaeffb78f24a411f",
+          "msg" : "33d902093ba5216933236c08fa5c0cb2",
+          "ct" : "e0571808bf389c1a07ca7e5bbf49a1ff",
+          "tag" : "cc346e6d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 308,
+          "comment" : "",
+          "key" : "33cff68061e3f5f941c8c20c89608b77",
+          "iv" : "eb581f66ccc7f1daa235bf27",
+          "aad" : "",
+          "msg" : "24a9d895f6046b9368b0b6b0fb396cd10e",
+          "ct" : "121f88e81d27da5c5d5c9ab397c7b205f7",
+          "tag" : "2fa4516d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 309,
+          "comment" : "",
+          "key" : "c01b915d2d2112288ed04d2cdd389bd7",
+          "iv" : "98aced4674faebe3fd4881cc",
+          "aad" : "2090bd5934b20e26c704af9f85c9c410",
+          "msg" : "63dab2e2a22a63a7e5504667634555934d",
+          "ct" : "13efaba63913e7a9d8a4fd89e349c4a0a0",
+          "tag" : "6553c647",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 310,
+          "comment" : "",
+          "key" : "a968cfd7f63f3a276871e30383077de8",
+          "iv" : "54bfc82e1cb5c0b9a65b252c",
+          "aad" : "",
+          "msg" : "030fa6b0edde45cb658813d0d797aedf1ba27f435df4f443a3469ea0e41e63",
+          "ct" : "60d5645560b0fa0b29570bafd2b6e18d839ceaf88242cb6c7c608d3001b7cd",
+          "tag" : "a92b60f6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 311,
+          "comment" : "",
+          "key" : "7645874cc7a9f0e7443203abec23455b",
+          "iv" : "ce566b866ef0fd3b096f3e9e",
+          "aad" : "1e00469ad45b2c24cddba52985169aab",
+          "msg" : "b6b05021ae99e4afe0ec92c009d06c4286020fabca1c1ac768faf184506191",
+          "ct" : "ea62f42831709424f8a8138302477d516b05e31f23b45ef377033b7923292f",
+          "tag" : "774aae96",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 128,
+      "tagSize" : 48,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 312,
+          "comment" : "",
+          "key" : "1a852b3456353cfd21726d1122109f1d",
+          "iv" : "bde9165d65f301a2e4ff1d4a",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "bd22f7195c49",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 313,
+          "comment" : "",
+          "key" : "44b5298a677baff5c3a65d512a651992",
+          "iv" : "cbb250283f75a66082f1a785",
+          "aad" : "19031c688ceee84e2d25253accbae68e",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "9310ab0e0d1c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 314,
+          "comment" : "",
+          "key" : "63c747be2f3069d50015f69dbae09876",
+          "iv" : "bc2c940525e514409815ab19",
+          "aad" : "",
+          "msg" : "ad5ca70a325363c34b2f3d5a8576b964",
+          "ct" : "acb62f8c4781279d5c81ccaee4f61ebe",
+          "tag" : "cbbca0326950",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 315,
+          "comment" : "",
+          "key" : "a465be21f5b420cd39009b0ef89dbec2",
+          "iv" : "d8b287caee5af69bc89545e9",
+          "aad" : "b452e6c112647de674249d1eec109ffc",
+          "msg" : "c190d1270334016daeeb12f0ddd55905",
+          "ct" : "cd9e9cb01e7737cf87a736a50a40694b",
+          "tag" : "ae86c7005183",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 316,
+          "comment" : "",
+          "key" : "1cb173ba4785bc6b728c862929daea5f",
+          "iv" : "d76cdfb595c3fe3d7cc0654f",
+          "aad" : "",
+          "msg" : "eef6691ba8e228b7bda4b26fd353950757",
+          "ct" : "e8ad83311584d4b4bdb21ba0f62fbb13d2",
+          "tag" : "0f8f6395413d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 317,
+          "comment" : "",
+          "key" : "a4a107ff7a4c0978aa17c551ff9f8a04",
+          "iv" : "502d4bc440c3f66db39a09f4",
+          "aad" : "20d643e0af5c673be454e531d92995c1",
+          "msg" : "510d64551a78ca2cd8d322f82f6e2cd617",
+          "ct" : "5785876e6fd045a0cea185ecb075102f97",
+          "tag" : "6c21046657d9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 318,
+          "comment" : "",
+          "key" : "b78dd75d16ece49bfd01e8f4bcd0d52e",
+          "iv" : "1fff0b5a566f3d1b252e5166",
+          "aad" : "",
+          "msg" : "f438000359448ed5d791beab637299a18c9df45e6a030428cca6cc05b2c25e",
+          "ct" : "65c363a0cf88f9ea74c47f46981fc9a845402c5205b1d0c1bdb4249c7887fb",
+          "tag" : "39a832ac3b9f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 319,
+          "comment" : "",
+          "key" : "228bf786a9371d9875189678a40f55a0",
+          "iv" : "4148ce9b647228751f313c2d",
+          "aad" : "3390a65d1ace02bf67265254be9c34d7",
+          "msg" : "a60a555ba48a065da2999a4526cece66e8600fe12096db766771e40fcf40d9",
+          "ct" : "fd06737f695ad87d70354b67c240cc80e41eea60f35834fa1c86439a3a2693",
+          "tag" : "222851c96fc9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 128,
+      "tagSize" : 64,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 320,
+          "comment" : "",
+          "key" : "5afb73f37d05147566a7ac9734eba3ff",
+          "iv" : "026dd125c98ef1507f6d1d15",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a4c4b136625f0243",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 321,
+          "comment" : "",
+          "key" : "3cf938733cb76e433a5b5ccb06be3421",
+          "iv" : "a5bc5bd383ce1108102c3c7b",
+          "aad" : "befdff7313d33ca6398f84b32ef77c65",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "d665a6ea1ac4649a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 322,
+          "comment" : "",
+          "key" : "22ed64b5b94a3c4116d02b4fbd4e5881",
+          "iv" : "f498fd65dab234520de52920",
+          "aad" : "",
+          "msg" : "94b03b07772b70562bc729505b4ad426",
+          "ct" : "4c4dfe9711b320264f3a57ecdcd59850",
+          "tag" : "b13aea2980767fd7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 323,
+          "comment" : "",
+          "key" : "ea5a915fd7be0aaf14b88f5dc4fd719a",
+          "iv" : "aeecf19f7d3379ee55ba6468",
+          "aad" : "13791aad5812a362291a4f6d63687d33",
+          "msg" : "d313e09cd48b06f16ef9178e42624bd0",
+          "ct" : "f9bc9a66186b6a60035d144dfb34c4af",
+          "tag" : "2fb637ff91d6fd9e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 324,
+          "comment" : "",
+          "key" : "89121103c350e29f7cd580f05bbfeaac",
+          "iv" : "f6d6e802abdf43230030a896",
+          "aad" : "",
+          "msg" : "636840ffbc66191bc37bf2e6bddf28bda9",
+          "ct" : "c6912062548dba55e6184e8f507d7f9c7d",
+          "tag" : "1b300de35538c252",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 325,
+          "comment" : "",
+          "key" : "03ad5f472b978c5f72b7b1c29080374c",
+          "iv" : "770dcc2ea1c2d9f6c904947d",
+          "aad" : "972c90e387f0af936b1c9db0ebfebbe9",
+          "msg" : "78470511caf12cb882628092bb573bde8c",
+          "ct" : "3fb22c2c366c0a46ba1640eccb544dbdd2",
+          "tag" : "3ec7c4888a1288fc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 326,
+          "comment" : "",
+          "key" : "4856b107dbbce702c7cdaa7ec1740f35",
+          "iv" : "6f41acabda1e0348c4290f0f",
+          "aad" : "",
+          "msg" : "d32decc55dbd0c08916c9a9e3d0846ae2cacaeb1ba0e04eb02772cf6a50e46",
+          "ct" : "2f3f133ca544eaa515a16f8b1cf12e174aa80db608268ead25ace1ca4eefed",
+          "tag" : "2ffa786adc94ae2a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 327,
+          "comment" : "",
+          "key" : "c08339a6f80b84e201e3d6030cdb3f02",
+          "iv" : "1cbf2ca31330abe749db588b",
+          "aad" : "b535a847dfc962012d913a4076f58f9f",
+          "msg" : "4f9fd6ad1656cce99af7469960073a241569ce32dad558111b50306053a0b6",
+          "ct" : "c91d4c8bf7fdba49b87001fc3ec95f455ba32bc05ba336bc3d58f4ad08b5bc",
+          "tag" : "34d622fe4ba3cac5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 128,
+      "tagSize" : 80,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 328,
+          "comment" : "",
+          "key" : "1faf8005f77553f5ee26865e31f5087b",
+          "iv" : "40df77e537c895ab71464acc",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "22ffed9c2dca19fa32ef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 329,
+          "comment" : "",
+          "key" : "f20c79f845bed406469cf1cd3f7daac5",
+          "iv" : "f7bca66eccd7d494dec758f5",
+          "aad" : "6e4536575883925a929ced31ad8fb6dd",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "2f25a1d00261589f3f00",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 330,
+          "comment" : "",
+          "key" : "b8bae01260ced6194ef8df722d659be6",
+          "iv" : "71d10b7cbbbecb843e678ab5",
+          "aad" : "",
+          "msg" : "387c0324cd47d3f22cc9d968a72e434d",
+          "ct" : "0c36e303e295a289bb134740e21a6664",
+          "tag" : "d3587e2186553fd9d409",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 331,
+          "comment" : "",
+          "key" : "b80030b83c4bcafd1b7ec9c70ab9224c",
+          "iv" : "a789457f80bdc5b8f15fea91",
+          "aad" : "1230977b9a5b12c8ee10a3b4abb4f06e",
+          "msg" : "197a27edfc49953b6dadfbe7170fc750",
+          "ct" : "2bc4763ba5b424a1f26bb625d9f6d515",
+          "tag" : "d5bd4fa23a45395c716f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 332,
+          "comment" : "",
+          "key" : "95e5179eb197f1a515e199bd937948cd",
+          "iv" : "49d4077ad5d8bb84eeccf711",
+          "aad" : "",
+          "msg" : "45d9095cf320c582c897f0abb53e3aedec",
+          "ct" : "36b3c9e7c25439f205ff0e38ff467961b8",
+          "tag" : "c6b839ab6ee9978eaedb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 333,
+          "comment" : "",
+          "key" : "fac8d98a8af93239b0d9551657c5951d",
+          "iv" : "ff1f419bed64bf4a02c357e5",
+          "aad" : "2e3f102de445b4ec117b63fba7089de8",
+          "msg" : "1197d76a469c17438201ef4000fa05f0a9",
+          "ct" : "96e23910daa864eb1268dbf2339ed4bb62",
+          "tag" : "ebd152d5f2d00c60ecd4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 334,
+          "comment" : "",
+          "key" : "de545044b814f313c23b5cb854f739a2",
+          "iv" : "99fcace8e59bdd6b88dd960c",
+          "aad" : "",
+          "msg" : "83525dbbb54de0fc1d248749a716d9debc65fe44c79b163b3614fb8d62ee2e",
+          "ct" : "a0e6e3d531b863b9e6f38cf03d60f1d6930cb17aa41a78a66d5b949c5f7ec7",
+          "tag" : "0138c4339bfed818964b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 335,
+          "comment" : "",
+          "key" : "bbbfa9444493dd2fbf72baf387a40900",
+          "iv" : "2935567aa572908e49917130",
+          "aad" : "c0db666f3814fdc2cf7cb3d4cefaf2d3",
+          "msg" : "59fc37654b0a5e3b8687a3d85b32644dc7a156b60dd7a64d2298373e158f21",
+          "ct" : "464f1d0417280f22f06053cbea16e28eb0f79082a682b58cb719423693e66c",
+          "tag" : "198701520323f4613b59",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 128,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 336,
+          "comment" : "",
+          "key" : "0ad9da994db2ed7b9e35e98895194c4b",
+          "iv" : "57e364c16b3689bc156b3115",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "73586eab8ced7540620fea72",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 337,
+          "comment" : "",
+          "key" : "970495f70dc64f0fe4e8c10946df2ed1",
+          "iv" : "69b1a3195c165517fed66595",
+          "aad" : "bfe8736a2113f774c6828e5b930f1cb9",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "18d7c54f8fcbec442b313987",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 338,
+          "comment" : "",
+          "key" : "f363f1a7d33c96949fd08f440cfba000",
+          "iv" : "67b92007f57b83fd9f3ee6fa",
+          "aad" : "",
+          "msg" : "a651d2ca4b16980b0e4a7a10c75c47ed",
+          "ct" : "20c2a2f18d0753acd36e204985149528",
+          "tag" : "4a4422d3b99c8d77dbde2ab2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 339,
+          "comment" : "",
+          "key" : "6b7489d158f377e6692d84a97727ff41",
+          "iv" : "9ac091ef05d0ce7428827ed3",
+          "aad" : "38469f1049a7ea3da0551cfb34010bf6",
+          "msg" : "352dbd5bb8abf0a097b929160b8f8cec",
+          "ct" : "00d3948bac8572ed1ed59c2655b769f7",
+          "tag" : "323ba1c806f3eac673015a88",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 340,
+          "comment" : "",
+          "key" : "38d4d27c30834968b5285b99ac18734a",
+          "iv" : "183ae352d9c340ee6167c3b6",
+          "aad" : "",
+          "msg" : "f153d01c5b9ab202455687537e8352d294",
+          "ct" : "3ca262d92db8404d5db0e55cccddff065b",
+          "tag" : "d27ad6866ea92ba2680dceef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 341,
+          "comment" : "",
+          "key" : "74b9756cb2ac6361ce9d684477b8d0c9",
+          "iv" : "c2606fc964b613a0b153fc0f",
+          "aad" : "dce9309cf71ced35eb220c709fddc414",
+          "msg" : "66f3216911748038f91432344914ee8a35",
+          "ct" : "c8aee8330a37ca706f476f774ff35700ca",
+          "tag" : "b37e7e62d0b1aeab2678bcf3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 342,
+          "comment" : "",
+          "key" : "e1e45f3500a405df5abdcb3b86bea14d",
+          "iv" : "59289da2d5f13eea4995611f",
+          "aad" : "",
+          "msg" : "5cda6060a7e105cc57c775a02af921757350c9692bc4fa404ace98eb1e6171",
+          "ct" : "f267014ac26466058b80d28c0d82521d69b2302c3656740c237831859a0f24",
+          "tag" : "9edc28317436d66d752ad9b7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 343,
+          "comment" : "",
+          "key" : "bce599cb75a2271070e6199cb096656b",
+          "iv" : "f9a8333f4673689e3959c9e0",
+          "aad" : "f61e1035171c92b022ae559e8657930e",
+          "msg" : "41894acc838d4a8f62e6cc9271f1d65df7f365a38e9a94110f4c8d57b8be18",
+          "ct" : "0eb5c03d69153dbe794c53cb293b25d38cafa13672c9156068a4026db0d708",
+          "tag" : "d406389ce2228ebbbc400bbf",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 128,
+      "tagSize" : 112,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 344,
+          "comment" : "",
+          "key" : "f21f0700f16aa098d6617cc3683012c1",
+          "iv" : "42394a30fcd252556bf2cb36",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "39d0703dcf7d0c316222d716afec",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 345,
+          "comment" : "",
+          "key" : "7d2827739ad3ce2dc7f27e35f6cd837f",
+          "iv" : "09a249077db1f84e984a9829",
+          "aad" : "b5e59d8c3f81dae7789a826a0d3200f9",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "45553d58839d45a377be85e95a41",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 346,
+          "comment" : "",
+          "key" : "1e70de0cba8f8848dbc8dd9cfa53c161",
+          "iv" : "d4e677bdb04bf935d130ce15",
+          "aad" : "",
+          "msg" : "7102b7710b1db1a0748474f8e37b6dd8",
+          "ct" : "55dfe0e88c81bfc561975dfabaa21a12",
+          "tag" : "024e3bf1985a7f7eccdaa0ee2a18",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 347,
+          "comment" : "",
+          "key" : "0bb380f72573e6d497172381f5f4eb6a",
+          "iv" : "e79f20840e4182ac6bf0f848",
+          "aad" : "449dcea27cd61031f9bfaf87d3bcf9c4",
+          "msg" : "4abfe60ed6bf24190e416e6809718fa0",
+          "ct" : "12e63d6d51c14a2ee7810a240ffebc13",
+          "tag" : "5cfc7df5f70a81f93a8f4714e143",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 348,
+          "comment" : "",
+          "key" : "c48de4c91efdf7b24c8f80073f6f17d2",
+          "iv" : "dda7453601d516e087320ebf",
+          "aad" : "",
+          "msg" : "01be640cafc9eb728827fcf1c9cba5e0cc",
+          "ct" : "235b7edd4b3df03c4ad8ff1112ccb3d928",
+          "tag" : "7b95bc0420ce86ac2f2a375d5fe0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 349,
+          "comment" : "",
+          "key" : "21f84c57b6d4a2d2d30d4c37ecf11030",
+          "iv" : "d3ce63a1af0bef6c9e0bbd81",
+          "aad" : "0f78dd2b4e566c9d15d052b01f6f85ba",
+          "msg" : "3358543c39c10025e01ce89006ba004326",
+          "ct" : "cbb921406ce9e44c19b019ca269a6b7b13",
+          "tag" : "f6ba3a6a433a50c4abe00da2411f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 350,
+          "comment" : "",
+          "key" : "a08be68d044e76e47d04d093ee548e59",
+          "iv" : "f17b6f94a8864205c757a635",
+          "aad" : "",
+          "msg" : "05e4542055fa84e2d349837def402353fea7ec56d3fd81a44831403f1f7f72",
+          "ct" : "60198bdf8b378dbe5532db7329aacc58ba325b827965d469b4ec7d0698b9df",
+          "tag" : "0599ec3c8c56ae5d1ee6eac6ca05",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 351,
+          "comment" : "",
+          "key" : "d95f7f6a07530ee3f967fd1ff9908afe",
+          "iv" : "babe0281f3cba80667c365af",
+          "aad" : "f49c18d65a197b973d26fd29a1437460",
+          "msg" : "e02fec4c118bcc9667015872d896c8868c1590f84734cec65ce90b3dc076d3",
+          "ct" : "bcd379de4bd6ea47f293a25c411d14d01f5de73a99c5e2e2e5930fd3bb3b23",
+          "tag" : "43b94df57df5f76ac5a01f525138",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 192,
+      "tagSize" : 32,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 352,
+          "comment" : "",
+          "key" : "85e017fbc86056c8c18915b369c0c92dd3af3fc677782f8c",
+          "iv" : "3d57511eaffbe4e9e90d6ec3",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "4fc4192c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 353,
+          "comment" : "",
+          "key" : "0df97ba40e5f24cd5f1bd0ecf474ac9a4a8b4cf138806549",
+          "iv" : "705bc1a6cb54c143d4fa1002",
+          "aad" : "dff5cad8f5b6cc65df4e4e12802bd0e6",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "48ded01f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 354,
+          "comment" : "",
+          "key" : "795063248c619c9ce61b56c17db6c023fab12ca61031925c",
+          "iv" : "d3aa2dfb019b56467fdb368b",
+          "aad" : "",
+          "msg" : "017e690c0069bf92d69f270d32af15ef",
+          "ct" : "3bf24b2ada604ad0ad9fa538e3b4e38a",
+          "tag" : "84d2cf30",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 355,
+          "comment" : "",
+          "key" : "a7acdc89a86ada3190da954e029bd3d58e05bbee0272cc94",
+          "iv" : "4aca5938a88a698ec745b443",
+          "aad" : "9cfcfd284ed35fa11104e52856fa3d08",
+          "msg" : "64187387c7cf3b562063ab3545ca71aa",
+          "ct" : "9702e5119a1b3a09e7c80e65e82bb8c8",
+          "tag" : "4612d0bf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 356,
+          "comment" : "",
+          "key" : "6369c428162cd7c861aaf28c4c36b8e538895e469e0d1f48",
+          "iv" : "c5f09cb9d0308a13fc731912",
+          "aad" : "",
+          "msg" : "b198a9ce4823d7477936f5cf9c739a830c",
+          "ct" : "1a39ea1becc694116566987a67d8ff3ed7",
+          "tag" : "3c3193c5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 357,
+          "comment" : "",
+          "key" : "1240f2455c1ef9a7e76fe93f6179d9bd6a249b66ba26bb0a",
+          "iv" : "c4f3a072f20fc22a9feb74c8",
+          "aad" : "41da67ad5737cd4d601b378d312f8740",
+          "msg" : "b4f3a029076a1bce99e8365b1b12705f17",
+          "ct" : "aad2fac798f0f43c7030aaa3aee1fa508f",
+          "tag" : "09733697",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 358,
+          "comment" : "",
+          "key" : "c335b76ea597d444a1e66350bdcefe5c9684af17ee9e39a4",
+          "iv" : "abd4d1251f481dfee35cfc71",
+          "aad" : "",
+          "msg" : "a8caad10e1602041a0a292763ce5f90323ecfd3c931705333f3b00e6fbe262",
+          "ct" : "6eafdeedbe5b367baf14064368e6f32e2ed07b0ea62218cf50569f796bb6b4",
+          "tag" : "45166497",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 359,
+          "comment" : "",
+          "key" : "6accd4bd6b18b9f65936d87f5b3f8339d8ae08a2a86b6705",
+          "iv" : "a39dd2e2c2e215cebda00e13",
+          "aad" : "df0144cb65ec35299d30458bd61a60cd",
+          "msg" : "97e6ba8a7e717f8c160b9b4bf52e5ba03989d1fb17e08078d77f7c26a65300",
+          "ct" : "3a663f7897c8f774ac8d74bbf05304e4d7fef92bb5961d0c88e413aeb47f36",
+          "tag" : "04d50714",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 192,
+      "tagSize" : 48,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 360,
+          "comment" : "",
+          "key" : "21acb09bb48dc6417e4d87a3168fcb84e31950519331db93",
+          "iv" : "5d3e03633746d3729b609dd1",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "40d04296cf7e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 361,
+          "comment" : "",
+          "key" : "eb470c2be6b32575c42cf90853bdbed1e6412cae1615330f",
+          "iv" : "9ed746015ad72f1f4a868837",
+          "aad" : "e8154fb503cba66491a7a9ad2f310282",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "8d8f8d3946b8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 362,
+          "comment" : "",
+          "key" : "b7858c86b35519e9c428624c41f4da8379d0f855b3dcd622",
+          "iv" : "d6cba35f0278d667d93d43e3",
+          "aad" : "",
+          "msg" : "77ae655c3d5f9a6ec06ccec714827d87",
+          "ct" : "d674d83e1121be226bd73355dd33657e",
+          "tag" : "5782105b45bd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 363,
+          "comment" : "",
+          "key" : "a9988df0c001132dee87306daa4a48062ca0a73a61d38b2e",
+          "iv" : "d02d4c036d75b4c2bd038605",
+          "aad" : "6d9df53dc71e447661b5d64b31c2a66d",
+          "msg" : "66da05e7d6dd8fb999827fd5cce8a1e8",
+          "ct" : "65704e760760fdcbed428a29ef604884",
+          "tag" : "e89d18b439c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 364,
+          "comment" : "",
+          "key" : "50a022e8d85641337e86d14d75f5377478af297d2091f5cc",
+          "iv" : "ad596afb6549098162ca53ed",
+          "aad" : "",
+          "msg" : "0d7de76af77e8d118e9719d5429b3be45b",
+          "ct" : "f20d2da745eb30c51663a84e9e1e002784",
+          "tag" : "90e8418f113d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 365,
+          "comment" : "",
+          "key" : "97c5af8e0f0ca69d77137fec21db36c9dea6c836a92a29d2",
+          "iv" : "7b4e8a9a66f682bd9a2fd5e1",
+          "aad" : "bda1ceb63c2c5f54ee926a832094e887",
+          "msg" : "cf14e1fd8c857c3ba274afd423ecc1d8d9",
+          "ct" : "6721310fca312d9614e4e29dffc73fdfdb",
+          "tag" : "80ab898190dd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 366,
+          "comment" : "",
+          "key" : "4433a44038995749fc7b84f3764f9fc9f8f91d20ed1900a6",
+          "iv" : "6aac37284093ec859b3c0af4",
+          "aad" : "",
+          "msg" : "33d5967e20ad5c2d988c6cd26a9215b52e0fb4dfbb37530ad44f4b0ec41e12",
+          "ct" : "cbe37d72b0c3eaf281ab34ac47b639f440d218e09b14808bc3a8e2f6484ba5",
+          "tag" : "69e19baa18e3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 367,
+          "comment" : "",
+          "key" : "2b0507b16fa49e088b184eb0d3e1d3f053ea3f8eaaf3e53d",
+          "iv" : "b0accf6f28262e0e1fce23fd",
+          "aad" : "a4bd9da3ad1f44f5dc19718f678de5bf",
+          "msg" : "3e8320fe8abfbcbf29d724dc3307156e6be53b21e9bcc3cda91b380ad580da",
+          "ct" : "44517614128925efdb7fb13a6c4a759b737c82d30986d2afde973c88d6013c",
+          "tag" : "ea19ecad5716",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 192,
+      "tagSize" : 64,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 368,
+          "comment" : "",
+          "key" : "5c049b3edd2b926fcd3434c421532b7e7908712a85057226",
+          "iv" : "b2b793469d4ac1dfc3756c8f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "c27816bb97e98d11",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 369,
+          "comment" : "",
+          "key" : "5b04c342efd5e89aa5d38ef32eedeaf2ac035f43b9b4201d",
+          "iv" : "14d4781e21592efc4409b944",
+          "aad" : "3fd3b691d0511d71f5dbec4f1320fc8c",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "2f84ac2d50bef75e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 370,
+          "comment" : "",
+          "key" : "1a2f9213e66c969306b98ce33d32ca9126e76578355a67ab",
+          "iv" : "6edae628133c510f0096585a",
+          "aad" : "",
+          "msg" : "d4a9427012403f9c518c7b2360ce0ab3",
+          "ct" : "92bd38e1fdfa1175dc230be5f541760b",
+          "tag" : "9902e9da26908295",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 371,
+          "comment" : "",
+          "key" : "a5937468ddde3c312b6fcec7d5d19a92853d2c66ada97a18",
+          "iv" : "5bf9547b2753dd712a5d8f95",
+          "aad" : "e56bc3356cbddb3ef099cad589bbe684",
+          "msg" : "5813c3c756a8f2721a08be97c4439269",
+          "ct" : "1b77aa30340189fe4fbbd7ea1c96d5c4",
+          "tag" : "ee2f195b667aa267",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 372,
+          "comment" : "",
+          "key" : "4d8576ff635ec7d99c47be7412a2846fc638c9f9fb0f5531",
+          "iv" : "8a5340f4a85e3a9cf7430feb",
+          "aad" : "",
+          "msg" : "0b896337a59af8e9ca15f33cd6daaae0ac",
+          "ct" : "5fdf4a0fce8be9cf740b61d120883bcc1e",
+          "tag" : "566321b12ecec687",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 373,
+          "comment" : "",
+          "key" : "9ca467af0c2729f43fbd866373ef4b8f2bcabe43f5a10f97",
+          "iv" : "e3ec439d334b9fc07d65dff5",
+          "aad" : "60d9be32c562666a190142847404e804",
+          "msg" : "f061110e43636eb525cd2f94f631f1282d",
+          "ct" : "5f8dd30cb70f495eb5777730b0c7dade30",
+          "tag" : "b01feedd3ed3640b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 374,
+          "comment" : "",
+          "key" : "e923bbfbbdb81cec8632634940c924bc9a230f1587f0ed63",
+          "iv" : "4190004bf966af35e049445d",
+          "aad" : "",
+          "msg" : "a38f8e64a391a09b8a298d4feb0113e308cbfc6edbc3cd59a25a31a3f0d534",
+          "ct" : "01c7765b1396fc6d362c0077a3a1ef9c3fe54b87688b7a64120d8a202de39c",
+          "tag" : "8990a6b1f386cc7c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 375,
+          "comment" : "",
+          "key" : "7bcccd494460a755cf82eedccae6b141b3c5b8360f09dcfd",
+          "iv" : "3ab4798ad9c05cc793f5c33d",
+          "aad" : "9055300f9af44b8c4a7fddbdd8e24972",
+          "msg" : "e1eb07d797f5fe2a31c28c0382b521612cbb0a6fdc6e53e27b2914087882d0",
+          "ct" : "6a7cb67d395897d5ce8c597309d51020149b1feb131361dc1a236ee92b40a8",
+          "tag" : "1ffc13f74d3c0776",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 192,
+      "tagSize" : 80,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 376,
+          "comment" : "",
+          "key" : "89c4e797062e49ad02d2bcf2eb0ff65fc17cd29cd55c8bbf",
+          "iv" : "68de7404e6d137a583890b0f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "ba50e04ef887145562f1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 377,
+          "comment" : "",
+          "key" : "c9b9280380276a99c7e8b00b03a0ac359366a925532c4b08",
+          "iv" : "3d697592a78007ee3fc9f871",
+          "aad" : "566fced9a24e20ae055f034de89f762a",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "7e43c945a8826a9f7164",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 378,
+          "comment" : "",
+          "key" : "19904bd0b544a29e2c0a305a124323a1de6faeb71bdd0f87",
+          "iv" : "1d15b87dfe88c831b10545aa",
+          "aad" : "",
+          "msg" : "a6896e2578689e31d305f3ce21415ffd",
+          "ct" : "bcbd194382f521498c930f052f81f5c5",
+          "tag" : "ca50c7a2d0e39a642e92",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 379,
+          "comment" : "",
+          "key" : "fd1095285c2d1d6a654500453e1241f13ada1364234d166c",
+          "iv" : "95487cb53c6fae13290052dc",
+          "aad" : "7d97f4b861a8336ce9b4c7250cbd825b",
+          "msg" : "fe05d5fd3a3d4a707b4a63097c483c9c",
+          "ct" : "498519002ff3266d8584e56417a85511",
+          "tag" : "824efaaf7b1198be4d3e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 380,
+          "comment" : "",
+          "key" : "b2fb991a1abcfdbafa87b415c8fa0f0395e32f23d78a1a88",
+          "iv" : "0bbb610c4fb755180efee9cb",
+          "aad" : "",
+          "msg" : "173abdf0e84a4d6bce7f849c50ee5480c5",
+          "ct" : "195ce4aa74d99fd8e5444e296e6a5d139e",
+          "tag" : "2908e7b3a0072ab8646d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 381,
+          "comment" : "",
+          "key" : "001ccaa85ed7da56fa3f1e9b47e3a2042c18f21c19e6e964",
+          "iv" : "8c16a944b80eef9d325e1b71",
+          "aad" : "218ad9db9c2392148758ec3cc48f9c12",
+          "msg" : "ed0799eba504595e80a7325d134c5de39a",
+          "ct" : "2e3e78ff00e583a63945dc2cb728a284fb",
+          "tag" : "3c893164f1456d54b9dd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 382,
+          "comment" : "",
+          "key" : "1d757f84c647a42ce395b54db5d921798627ba1bcfcc7f64",
+          "iv" : "c0a2a0fcf5c200e17c32c394",
+          "aad" : "",
+          "msg" : "51a2a8d995844e4e78f9b20b1af67320b180903cbbf4efbc601b99b41f07f8",
+          "ct" : "6b8bc93cb348d842f3236b6658de7ee3f557e93469253e8afc7feea87f78f4",
+          "tag" : "81d596e377a3a301640e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 383,
+          "comment" : "",
+          "key" : "54f10baeb7564e947bb6e1e2a837c16ddae0646a8b7eb338",
+          "iv" : "8ec4d8544fd21e6a5132abc9",
+          "aad" : "8796ea336218d2a0991b4cb42301f65d",
+          "msg" : "1d8aab0108d72990928b9d1a8a480b93af27634b166077e3134e2e8791ca13",
+          "ct" : "00f649a1fb321a48fc1dacd5b9fc19779d7fb494cad60e2c2d727713cde93f",
+          "tag" : "7fc919a92bf3577bd0b0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 192,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 384,
+          "comment" : "",
+          "key" : "08711372dbacacbb68ef12e5ef59b69fd46c9be4c2fb8324",
+          "iv" : "8321748412380b0e7b14a7ef",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "6c1ee8d9718f724ce8d96beb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 385,
+          "comment" : "",
+          "key" : "0a12326b7efac179421fdbced80d52f2407e993ef50477f9",
+          "iv" : "34472131547840263d9e9fd3",
+          "aad" : "17be4bb1e4a40fac706879381a2d6f47",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "6fb72e3768832a7bab907a75",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 386,
+          "comment" : "",
+          "key" : "56d5f5eb697d96fa9c11528b191eafc4159c2cb2902f0695",
+          "iv" : "8e04df7913429299cf2f2337",
+          "aad" : "",
+          "msg" : "9f6edafc71ef1561d7005a533a5cdeb5",
+          "ct" : "536142d27a0312b80e53ff32be189e29",
+          "tag" : "f16a364c64229fab13908761",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 387,
+          "comment" : "",
+          "key" : "25943007a4497839bc13386945b4bc46bf105eaf6e6bec2c",
+          "iv" : "56ada6e559c268755092bd6f",
+          "aad" : "25fe12a528d126b4ccbf6810170dc28c",
+          "msg" : "20211e52ebbd1bba7838d402e8ebba93",
+          "ct" : "4c412ac41ec522825a8844f7d5f8f607",
+          "tag" : "817742f2a01b9dbe9a7f3902",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 388,
+          "comment" : "",
+          "key" : "eb3ca296888a762898e5103f0d54d53874fc7f4e4b9d215d",
+          "iv" : "f6a164a55cbe0644723971b2",
+          "aad" : "",
+          "msg" : "96da5441e88312536d2892b1e27b41e641",
+          "ct" : "358c85d83dce345cc5a15660adb016a9f8",
+          "tag" : "f93d305c3cf69293289e09d6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 389,
+          "comment" : "",
+          "key" : "afe12bcd5ef35490713d20fed48f6b942b081b9f24444183",
+          "iv" : "953e944beaa76fd2463c278b",
+          "aad" : "c90281efb0b9489b61722f1fc7de5ba6",
+          "msg" : "949f81ce36dbe85eac14a72b8b7758ea47",
+          "ct" : "697c99eee5056dec985160ab2afcbf0c3f",
+          "tag" : "03bb58facde9af2908b52e55",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 390,
+          "comment" : "",
+          "key" : "738e95e889dc793e29f33b9e35ee3c1030d753e5e99bddbd",
+          "iv" : "c32971816c7d84342ff76488",
+          "aad" : "",
+          "msg" : "7f642c9e9d91571b87450d59a9be2be6b45c5b8a0eeb326932c3e875118485",
+          "ct" : "4aeff5a7ca46a8804eab6f23cbeb240272408af06447b7a6738f91c4a90f20",
+          "tag" : "c7eedf4f033329a512504455",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 391,
+          "comment" : "",
+          "key" : "70bc9c8a60dac5f253ecf32c7d1e6de131eab79faa831e76",
+          "iv" : "45ebabe2b6a03fbb15978531",
+          "aad" : "abd09ae3178491ea28982bc839e39721",
+          "msg" : "ee8c1a65e1c2491ee725a285ad1f3a2275c2ec4af82ba32a66cd7e87dbffea",
+          "ct" : "f42c5beb2af7a9715d535cb721badd421d472fabee434c77f42d0e4b163e4c",
+          "tag" : "b50f8c070e1170b10b9a9932",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 192,
+      "tagSize" : 112,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 392,
+          "comment" : "",
+          "key" : "cd2adc91b19d564babc97e12037c8bc91af687f959dae1d4",
+          "iv" : "678b89fdf4e135dd67e3f28f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a75407b62989f1be04131a43ce16",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 393,
+          "comment" : "",
+          "key" : "59b4b1816f2a9fb6266a39af3e497e2b89b1fa51fcb965ef",
+          "iv" : "9905979f5b03a50d5440aa08",
+          "aad" : "e82cb113397277e220052ac55304d793",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "67f6e8c4465bb647c03ef4fc5f1d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 394,
+          "comment" : "",
+          "key" : "2de7b9837d63f531db2705c5e2c800afbf5ccef73b80f79d",
+          "iv" : "1a0ce3a2e9283d069285416c",
+          "aad" : "",
+          "msg" : "c1265183d4095fbea0bfa35b2781d52a",
+          "ct" : "340b2fd7c39bba1a1a9391b6010ef8b4",
+          "tag" : "99b19c91eb2312ff5c42bd889068",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 395,
+          "comment" : "",
+          "key" : "7fda003931c5ea09afa3c93bcaa9cd33affa55061df3c4da",
+          "iv" : "c7a7afe9d8d9da3ac81c7b58",
+          "aad" : "32092c8dc62ff2570fae6ecccfd92be2",
+          "msg" : "c5bda3c86f31160c9623984df885f92a",
+          "ct" : "50224bff26b6b96669325037f1294a2a",
+          "tag" : "f1fe371a3974cd2380dab2c7db62",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 396,
+          "comment" : "",
+          "key" : "0bb89ee666cc143c89583ce3055d0280a3ff65dd5b0ac9a8",
+          "iv" : "ca9e52c9f75ae626256d210d",
+          "aad" : "",
+          "msg" : "4c8cdd0f6c9e8a0091b730704298b90eaa",
+          "ct" : "93185de98b9b95a11855096440027ff5d5",
+          "tag" : "8edf2a34083cd4fc82ee34904d55",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 397,
+          "comment" : "",
+          "key" : "44def02b19d8b74b25801ec25273b68f50dea126ec4a3666",
+          "iv" : "215dbc072f698ba96f855048",
+          "aad" : "202829927e08e40aed3696ffdedd107d",
+          "msg" : "4925d7f70c12a6b8487d0c9f16f48e8e8d",
+          "ct" : "c54fb9e555fbcb5e1e70aaaaefbc122500",
+          "tag" : "1b5984538beafa71142f0c0ec42a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 398,
+          "comment" : "",
+          "key" : "a29a0c3f1e2e3ee88dfd3f019b425a5f647526d3f368a1be",
+          "iv" : "f2ba8a6620d4e53487b8d66d",
+          "aad" : "",
+          "msg" : "23598789d7a7a248d17ec0c6aa3132b4102c0df2fdaba43e4e4581439bdfdb",
+          "ct" : "b080130f95e46d79ed5f67f0dc88a23c34dcf74f6e61b65621b6ef53758279",
+          "tag" : "67856e344453cab335a8f07b1f63",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 399,
+          "comment" : "",
+          "key" : "90954fb22aa84860dd7c3fadb319dd1d16857723bd1badb1",
+          "iv" : "7ca5178d4279adb8d22b4870",
+          "aad" : "fc77e3c50103c5860882e8ced3402933",
+          "msg" : "ea6e7aa010e19a7c76a4d7d3440dc61eeda44a5a6fb7fa824417185d4a55ce",
+          "ct" : "87b753fa7ce3e7d162925946e85719933a0dd10eaf72b5259cbace8c41c53b",
+          "tag" : "2b556455a657ee6171f4ede643b5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 256,
+      "tagSize" : 32,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 400,
+          "comment" : "",
+          "key" : "9948edf5cfb2f53363ed83bfb15e7cb502f0628dc9f2b87223f22334c40b8923",
+          "iv" : "44e154e9b3f7fd47a97fc7be",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "92a59922",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 401,
+          "comment" : "",
+          "key" : "93b75ac129ec195f8c180e9b91dfedaae2b2facdc15593b3e4258c78d2ff94d7",
+          "iv" : "db535fe723ba650b66d230fb",
+          "aad" : "7b3dd420607139c19c6db7a4efe09a0b",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "50e42c1f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 402,
+          "comment" : "",
+          "key" : "c7679145a15e53db5cd6166143a9fefe6746715f5d84d9dfa604f1d3dc337e6c",
+          "iv" : "6ac0d6aa446e86ff32f8fc76",
+          "aad" : "",
+          "msg" : "83b08305526fbcbcdeebb3d7a8ac44f5",
+          "ct" : "dcb5250559a03c8e70e5c0107121cf58",
+          "tag" : "0081c1fd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 403,
+          "comment" : "",
+          "key" : "bc5caa306c423e6f850cd5644b09dd4ba776b30171c72e0050e5a60afe9cb77c",
+          "iv" : "f956d41422d8eb63231b3826",
+          "aad" : "fa6e34463318237e985dd2f72b0dd014",
+          "msg" : "46c9da602a54fe8037cf0bee72affc72",
+          "ct" : "dbb6b4ec70f9324f4bc22b592409d4ac",
+          "tag" : "803a6948",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 404,
+          "comment" : "",
+          "key" : "a959c610a8ef468bb8e866a09b2627a6c39ee2ed510d22e872afa63ebab7cfb0",
+          "iv" : "f648002ffd7cff0bd26d1c45",
+          "aad" : "",
+          "msg" : "3465e9b835c21695bfd9a520a9e0f079d1",
+          "ct" : "bca338dc06ccf03cbf30251cceac648aaa",
+          "tag" : "976ed731",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 405,
+          "comment" : "",
+          "key" : "e261314c540aef81145ac223ffc7bde01165679357e786cd2f8815e23f1d69df",
+          "iv" : "fd69f4b939e3bb09006f2d2b",
+          "aad" : "ae205a7acc945716f752f09542b78c5a",
+          "msg" : "90648b56d35bf1ca990ea25950354ff1a3",
+          "ct" : "666de414b3389081d07028d5a6a3f85d5b",
+          "tag" : "495a498b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 406,
+          "comment" : "",
+          "key" : "0479817afb26c2ce77b715bbb0d64302fb09ff925d349835cd1dd3279fbb7238",
+          "iv" : "4fa90e2d99c7a6d25d38bcb4",
+          "aad" : "",
+          "msg" : "ddebd4e2af2efe9720c9e272e401b93ac11b0b8ff976ad2dea0cbb3e8c5a7f",
+          "ct" : "6e2073faa680e05885a59b7a75dde2d30fd6333233fc9d03e99c490f8c94ef",
+          "tag" : "be0237f8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 407,
+          "comment" : "",
+          "key" : "228edffb103524835907723f7af9ec18023cb82c719697b3a1c5df0f2c30ab18",
+          "iv" : "44f7cbcbf25c4c0fafea93f2",
+          "aad" : "2d7018203f678338efb6b3411497941f",
+          "msg" : "10647fb1e5040fa00909d3fe5171f04c1ce94540835e19e625355b813d81e7",
+          "ct" : "2e1581ea474d6707a694bbabb26efbade1eb8d8e8c063f7c058209eb1b33b5",
+          "tag" : "b06b64b5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 256,
+      "tagSize" : 48,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 408,
+          "comment" : "",
+          "key" : "f162c319c6cff093d5956aeede3701181942888211087824817827a432f86d9f",
+          "iv" : "69d742d94fee251140e6d779",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "fcdc5aa33914",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 409,
+          "comment" : "",
+          "key" : "eddccd5eda6eaf421bbf87d919549c1f3ac2045c0ac2bcc2efa50ec84050b36e",
+          "iv" : "30f3db312e76d29345edde59",
+          "aad" : "078e76ef2deebdd8f2d549089f4a93e3",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "0df6d2dc83df",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 410,
+          "comment" : "",
+          "key" : "1c9b20e64ad783bf04f801be532f6b088e004d3aa2d72d77f39ec8fe9ddc5189",
+          "iv" : "497fa41df30858e3fbb36a68",
+          "aad" : "",
+          "msg" : "03d33c0a11a6cda99d76e98f75059fbf",
+          "ct" : "deea99437d385b211f3debda65869daa",
+          "tag" : "818ea963042c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 411,
+          "comment" : "",
+          "key" : "5c8b7287017656c3108d7eb61437104b411fd2d615245bf23c827d3dabe430a5",
+          "iv" : "996a93e47c2dab38c93529ae",
+          "aad" : "2333e2c95802883fb3cf98734dcf9c64",
+          "msg" : "d1a22a8da220072c49d8aa1e283334a6",
+          "ct" : "d6c3e9291813d39ad919487903c6a7a5",
+          "tag" : "e639540416fd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 412,
+          "comment" : "",
+          "key" : "964c2d69f7b53c4062884101d562f52316ccbc814a29b0fe6efe7f1ec7f7ddfe",
+          "iv" : "63e4d44f41f3ce4514b73700",
+          "aad" : "",
+          "msg" : "5236ea0820e83745212cdcd7c10a5f3529",
+          "ct" : "05675fa42a07d43fe91b53397f74609cff",
+          "tag" : "54534114415d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 413,
+          "comment" : "",
+          "key" : "c0a9d335f329966a5bc8cdef38609080b85a2e6e96f6ac82036794966e7c82c1",
+          "iv" : "5829fb77bbdfb38721a59100",
+          "aad" : "49a3ed9cd30968fdb7ff73d12d30e155",
+          "msg" : "ff00f8c6ccbc90a84f94fc988cbab82ca1",
+          "ct" : "299b30e3d3c6060bf5d21f7fc013896968",
+          "tag" : "a5965c20fdc0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 414,
+          "comment" : "",
+          "key" : "4871b91e5e7f3cf9cc1b01d50bc620361075ada3edc423398d4740de721f8ce1",
+          "iv" : "7bd8cf2fc24a3a835cf91bf7",
+          "aad" : "",
+          "msg" : "e43936c2d05a3a35f7c2ddd165d397e5d3c2ec2b482360d3f2e6217ce00037",
+          "ct" : "43b66599dd9782becf884f044f0c85b4ae6f7fd0f6ce2afbba842e6b594b3a",
+          "tag" : "55d8f76ea7e6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 415,
+          "comment" : "",
+          "key" : "7170ed6dbf434bfd0bcb6bd692a369365251fa31909b4a2e3bee10663a01e00f",
+          "iv" : "d13ee39b842f860a5f4d78e3",
+          "aad" : "f87d8871a8951c39857321e320b8b836",
+          "msg" : "145be0a78bdb38014ee6193145131ec8a3fd7c89793a3005364ff1e793f67b",
+          "ct" : "6b91e67992f870306f242470c51131873e2a6c076cda259c3349c9494c3904",
+          "tag" : "c8cb360f80c5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 256,
+      "tagSize" : 64,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 416,
+          "comment" : "",
+          "key" : "d2a41cd9ce5e917d16b9ab55819ef8501e06aa78ef132fd3ebe6fecd91beb39b",
+          "iv" : "f71bf6bc21c6d6354e4b4cdf",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "23928a009d21a10f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 417,
+          "comment" : "",
+          "key" : "882107ab29053d4b44c87b5bb94937211c20528da9ac490f6c574caecdcd2f17",
+          "iv" : "e6a13537bb7f2af749b31823",
+          "aad" : "e9ee32e6f197e40204682dac42dd4c75",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "5773c725f2f94617",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 418,
+          "comment" : "",
+          "key" : "b967091c98bb64922430833d1b553326b8e91b6ef7141971cc8e8cc5f6ef6170",
+          "iv" : "a5dd076d8a9dc3d7ec43d04f",
+          "aad" : "",
+          "msg" : "c8a331b554e6c7b0783c53fee6f1618e",
+          "ct" : "99b5c22225e5325f9aa9599a34deec59",
+          "tag" : "e9c93619d33d268d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 419,
+          "comment" : "",
+          "key" : "7160434720504dce28845625a3423166d9b5025d975c6ee47299bb5bd677dbeb",
+          "iv" : "0296c95b44c17463434c7e19",
+          "aad" : "19082bf57b6c4130eac58c0526a044ee",
+          "msg" : "c66a48615b62d2d85ea82ee4d528a03a",
+          "ct" : "8934ea7afb44fdca4027ed9bbb247358",
+          "tag" : "b333f0e1383cf3e8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 420,
+          "comment" : "",
+          "key" : "1dd5a092949b67635db0c48a03740da806dbe97aad5b8412300d685cecfe8407",
+          "iv" : "3f9ea39362c8d8e492ea8b41",
+          "aad" : "",
+          "msg" : "84408d8bccb4288e622bf7c631401d9908",
+          "ct" : "4f19d27e0a40e4835ebc3b89ce8b51941b",
+          "tag" : "44d9e50dca915c2e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 421,
+          "comment" : "",
+          "key" : "47f664e6790f3e25bc410d847f38662f045f0aa3641429edf8099f4b4df32f06",
+          "iv" : "f092a357b5ef0c975ee169c4",
+          "aad" : "338b4cc60ec151fa283c1cb10e722d9d",
+          "msg" : "b01dfe724166a2bc98cbb96cf540028a0e",
+          "ct" : "d7746f186aabfa36685481ec8a7f0022e8",
+          "tag" : "41158292a1d87cfd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 422,
+          "comment" : "",
+          "key" : "a47abe6e867fbc16c46a6fd7f10b77929baa129369c898d25265b0170056f9d0",
+          "iv" : "650b12687ca85a50e6509884",
+          "aad" : "",
+          "msg" : "200914571dd03827f07c2bd9382e7d19d62f1ea4a7c7269d86733e43e45a4d",
+          "ct" : "bc2314a589dbdd95b358cdad30b15e867dcd8dbde428b47e390ac43762f634",
+          "tag" : "881fa5fecb514ccf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 423,
+          "comment" : "",
+          "key" : "110480ea9c9f4c5e6b5be01a2aafc861d1370c243aff9faafd0a92a9d18e5845",
+          "iv" : "0e5cf683e13204cf91a2d4b6",
+          "aad" : "c490a5fa19b97c3e3adf20bc4df51140",
+          "msg" : "c92ec3d6a2c2fa19c45be7107a48a9ea0fe46a92978b5dabb3f94b457b5fbd",
+          "ct" : "bb5110dd12bd3d12144c8de55b3b2677fc7084d56afcc6a76a5228fff8dbd3",
+          "tag" : "e39b0d1174f7609b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 256,
+      "tagSize" : 80,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 424,
+          "comment" : "",
+          "key" : "a0917ebe151778cb88bb2e356169ad1a4b9ebe2bcc2a352bc789a50b4f312d3e",
+          "iv" : "32811354382608bd076d8a87",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "b41d1dafd0d25931d285",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 425,
+          "comment" : "",
+          "key" : "aa8a48f8b6d18634ec96338e820f7eb9f0fea8864bb927a57c65f8344990199b",
+          "iv" : "a0f7304648f97a3034916d35",
+          "aad" : "f4abe30815ce6ae9cf2f4eaa8bd004cb",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "f7605f5201936da16d39",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 426,
+          "comment" : "",
+          "key" : "8ab50516b053a3ed51b9f84f76dbf930bde2b55aa499a016194350461ff0c708",
+          "iv" : "140a72ad89b2fa23c385e804",
+          "aad" : "",
+          "msg" : "536b9006a41febbe7a10d16ae2b64488",
+          "ct" : "f1ed6667a21887a394d816a45ae06a5d",
+          "tag" : "4555c71614a765c6a8fc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 427,
+          "comment" : "",
+          "key" : "1450b9d43661c27dbd0800d6616cacf4e28310990e744f8a896654ae43872bcb",
+          "iv" : "91b8a708be02cb6335c28583",
+          "aad" : "a4a3e0ca165bffcc305205667c38686b",
+          "msg" : "6c0301326a6133f5d5fa8717dae4e190",
+          "ct" : "37d8f38e204c36c029cf15f7ff3ac5da",
+          "tag" : "fd942918f7aaf308e56e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 428,
+          "comment" : "",
+          "key" : "1b05cba587247213a0d959d64a29a59ee2d0eea2d97efa296861434db8e52754",
+          "iv" : "b83b0e7a52dd507a8d673661",
+          "aad" : "",
+          "msg" : "d0763c3060b7f9eb2d42758ccb3ebb0311",
+          "ct" : "27b44a64bcd0a073d770a71d382bd4ec99",
+          "tag" : "9a1cff81026669db70d1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 429,
+          "comment" : "",
+          "key" : "e25411838a5a8dc7fa866ea74347ab003f2a8662275b693ae8a6ddba979e1887",
+          "iv" : "bdad47517bb9b66b5e64c219",
+          "aad" : "9a1b3cdac0767cb234e5e468786ce327",
+          "msg" : "889829a2b4a886d39f1f7f68c2cdb4f365",
+          "ct" : "8066e4a8cdf7ac2f70e2f5ba5126d5e347",
+          "tag" : "3929248c358bdcf362f1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 430,
+          "comment" : "",
+          "key" : "de1c7d3784b98250422e6fffed88577154c193f72d4a9796d4ff4dfc88235a17",
+          "iv" : "9d14a6b79332ee97c48f07e1",
+          "aad" : "",
+          "msg" : "55dc1179cdad38d45ed439395c67a8724d7513a9a4c62fb59a788b0ac67b7d",
+          "ct" : "9482b60066c999cc895cf980e81a29237f809e9b80b32490e60ac85730cafc",
+          "tag" : "675eb8197e605bddf2e5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 431,
+          "comment" : "",
+          "key" : "bd025552c34a552f07de3a348bf7dfb308bec36c47893ad29f3fe441e24fb255",
+          "iv" : "185140aac83f261a8c0dcea4",
+          "aad" : "a721a69f3a24ddbc2e16015228c8483a",
+          "msg" : "05babe1d63f812069dfcd0f59262fe05bd45b3c11a3d6bdfea5a0c80d13220",
+          "ct" : "74c9700fb3c7bd4d65bdcd0df8cc73a414ad9cd787b05cc9ffbfb63c848d1a",
+          "tag" : "4dd43dc32b301673f404",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 256,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 432,
+          "comment" : "",
+          "key" : "0737424e0c2f4048638133a18d676dc1d83a233877613acc0eb5a681305366c0",
+          "iv" : "f028d0ecf26c312b9f623395",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "d37f07c4ecef1fcaf0fe444a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 433,
+          "comment" : "",
+          "key" : "8e4c13c982a06f3a982959eb7c2e9f0e41a8e054360e5b93111bc6d93970ee8d",
+          "iv" : "8c081eb60fa0903595713a73",
+          "aad" : "24f1ed7cad53546802e2e5f5ed516247",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "97fed410c9fdb06bcdb38585",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 434,
+          "comment" : "",
+          "key" : "627ffd55176d6555da82b4eb87e6519044b881334c95789d670729af0584128b",
+          "iv" : "c15cb8abce008f015e2715ae",
+          "aad" : "",
+          "msg" : "000224e63d99e8b1a0a2abb4b45bca15",
+          "ct" : "59a1b95522e96a5fea0ae77d179223ec",
+          "tag" : "aab2f34de6e5bac7ccf93618",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 435,
+          "comment" : "",
+          "key" : "bb65d80b7a4782e05ffcb777e59528bab87e20aa84dbe4588e2a1703f88c68ca",
+          "iv" : "56410bb82bb054234b5e62c1",
+          "aad" : "ffe09fb34f17b517956fbbb58a62623a",
+          "msg" : "3af8c049a193b1ca3952eed0f58f09dd",
+          "ct" : "54ee654f5c44b8587643d4c58de40267",
+          "tag" : "3237b2fa6ad785a882a38e72",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 436,
+          "comment" : "",
+          "key" : "de59c6daa210ca6bedd9db7b30e88603049b180f6e3196b4c33d8c5189b5c450",
+          "iv" : "1fc9684e4d968bfe27775000",
+          "aad" : "",
+          "msg" : "cd42fb94b107a8891b159bf3bdb3eda844",
+          "ct" : "fb48f571633d67d534cd20b6c8817e9633",
+          "tag" : "551d3bb686eedfdff776ef19",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 437,
+          "comment" : "",
+          "key" : "22234e831409b5fbec252c785d694b004a59ffda156cff62f5702b72fbf100ad",
+          "iv" : "5b38b953115e8088430ebbd8",
+          "aad" : "0dfbea34bebb2ccdeb1277e0b44accfb",
+          "msg" : "600418cbef856439e40d839f7b57c5e32e",
+          "ct" : "daaab3cca5ab11f9e1f44cdbfe82b60c8f",
+          "tag" : "aef2f1a90ffa6e96892f3728",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 438,
+          "comment" : "",
+          "key" : "b874b869d00450514fa1f8fb947cc087e8732ed0760b41b221c69cda049cba02",
+          "iv" : "41012a5f5c6b70acee93bba1",
+          "aad" : "",
+          "msg" : "1be4613bb9a8a124606650de3262f257fd6bae4b7c27b4f0ff36baee97bcb8",
+          "ct" : "83cc85a013c82fe07d24b38480f30d6e09274af880f114e08b5628547a042b",
+          "tag" : "b78d7f57e5a6ad5d77083876",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 439,
+          "comment" : "",
+          "key" : "10f9d390d9e89fdd3bded9cbcb6c985f9cfae00749fe7cd40c83a6eb95b4dceb",
+          "iv" : "21a2286feee97386ec1d2a49",
+          "aad" : "2dee72e89b039793f6a28c9202d62659",
+          "msg" : "2ca370d14c09a5aba5327b4de30a983f6e5021eaa7b57450891eaf386b7ae9",
+          "ct" : "a751ee9093081807b524075919fc64ca806b3f5a29cab26b0657e163042f96",
+          "tag" : "743df3e01f34496345735715",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 256,
+      "tagSize" : 112,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 440,
+          "comment" : "",
+          "key" : "08f5fe4c8f6393accdcb560a3c271096ff0d9d67438fffd34df718652c6b8efe",
+          "iv" : "25c5f84fe6ec3c2f7c1b7cc5",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "66b23023e608cd9391567aa85f5a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 441,
+          "comment" : "",
+          "key" : "8495298b9c208e6c5b234e856eecff6a114cd8b3aeeeb745a160ffa3305cf5ef",
+          "iv" : "cce02635c3771fb5b673f88c",
+          "aad" : "cc9af3cca9f3c2c1211b23581ec5fdd1",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "0d34896c64b6787da0ac7c03fa93",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 442,
+          "comment" : "",
+          "key" : "4f49655c76a629e58cfb94c851a91510c2f128dc4bce1f1f11c3dc99436d268c",
+          "iv" : "967fde29671d4654f9f670c0",
+          "aad" : "",
+          "msg" : "b4d12c3edf3802e21f624b718b63fd6c",
+          "ct" : "3ba4e2a4507c0b6f5ae1be29c30b25e9",
+          "tag" : "8cefa2495473eee1b22c3fa6ef12",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 443,
+          "comment" : "",
+          "key" : "4dac9a0cbfc3dd291d406e683889fc10e2a0dd25d4d0b43b11111aa8282739e9",
+          "iv" : "864aa8c865588c9a21aea7fd",
+          "aad" : "5db8e09697d1ff79a886395e40fb1a1d",
+          "msg" : "5d2c632960f823cf7242bf61f9391317",
+          "ct" : "fd80a3827db17242b2df0cd8ca96d997",
+          "tag" : "dfb58a6be4e7e0010f7c7404b467",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 444,
+          "comment" : "",
+          "key" : "3776a84b869ec4a71ed84a74e6a98c42c0ffa23f6eb2e2970f131121c5ba69fe",
+          "iv" : "72cda6efb0825c740d19f485",
+          "aad" : "",
+          "msg" : "0505d288908d5c28e4723d9d4b8b0fc0ba",
+          "ct" : "dcd62bdc23ee8bdb7afdecd449cdb4994a",
+          "tag" : "9aa0f8f032be1342ad5d4099c3ae",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 445,
+          "comment" : "",
+          "key" : "01fcbc4a3b2ee32109cd0f27d829e20d1d9203d6ff812ed9841ef908904d74a8",
+          "iv" : "ae9ee7f9f52878215838f5cb",
+          "aad" : "1be177d6e88651c40f6a1b533817c279",
+          "msg" : "268a75fb890e8af7c24b63cfb87080e028",
+          "ct" : "e1440c495562f6c856288183234e0ad22e",
+          "tag" : "d93e1c12bcc76660127dfd8c28a0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 446,
+          "comment" : "",
+          "key" : "a01745f52f1f3564da0adf845fdbd47a5bd1865092579558f67f67ba07f238a0",
+          "iv" : "87d7cec6301b81e3e0666e27",
+          "aad" : "",
+          "msg" : "d5c01280acf0afe77df767ff3c028f52e3d3786a84cc7cc0070661a81c1fbd",
+          "ct" : "cb07fc5962f7d3268606f1d224fd92b3c2302620f03320784a71180d726501",
+          "tag" : "7f64ebeb84bcad46347ff1f27447",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 447,
+          "comment" : "",
+          "key" : "240ef4ec0a7b24017c13e461227d11f608c41698457e948f657d82a19d970544",
+          "iv" : "52ec46f52781bb7cd00fbfd3",
+          "aad" : "899c64abbec1468ec5b8427e61b990ab",
+          "msg" : "2b25882f824b41eaf4b2150eb1fe8dc0f9c7156a41881b39d13daec1f9b0b1",
+          "ct" : "e94e44b5e7bb26b249b48caaf2a9ab5a7506ff39668ffea6f62bb030fe5c87",
+          "tag" : "1a859aa806260472a53979cc4eaa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 0,
+      "keySize" : 128,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 448,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "be1722a5817195c503814be1bd093110",
+          "tag" : "6f79a8cf92c856b8f16dee92",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 8,
+      "keySize" : 128,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 449,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "40",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "210389226958def4b44f1e168632113c",
+          "tag" : "d4e97a100800a5c16bea4fdf",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 16,
+      "keySize" : 128,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 450,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "4041",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "95bf208e8673b9f9a38f9609b5e78f2a",
+          "tag" : "df814191696cf3129fb40dc0",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 32,
+      "keySize" : 128,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 451,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "40414243",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "a7dab4bfcf3e2afa4b319cfdc17f15f1",
+          "tag" : "c4e8b1fa0d791777417ce52c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 48,
+      "keySize" : 128,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 452,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "404142434445",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "a89a23f4f32ba009c3aa8fa0191f84c5",
+          "tag" : "659621c2ad5bc61de2ce8046",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 112,
+      "keySize" : 128,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 453,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "404142434445464748494a4b4c4d",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "f9d0078bcd568bf97924e6d71f406087",
+          "tag" : "095c0da2ea6dda5a87121c2a",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 120,
+      "keySize" : 128,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 454,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "404142434445464748494a4b4c4d4e",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "670cd068e65b08fcefb9c0afa7bb5c33",
+          "tag" : "daa02810e997e797dda9755d",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 128,
+      "keySize" : 128,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 455,
+          "comment" : "Nonce is too long",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "5edbebec6c533dac8ca89faf60d8c137",
+          "tag" : "9453d6a8ff91b714f32c0b71",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 160,
+      "keySize" : 128,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 456,
+          "comment" : "Nonce is too long",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "202122232425262728292a2b2c2d2e2f30313233",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "5edbebec6c533dac8ca89faf60d8c137",
+          "tag" : "9453d6a8ff91b714f32c0b71",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 256,
+      "keySize" : 128,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 457,
+          "comment" : "Nonce is too long",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "5edbebec6c533dac8ca89faf60d8c137",
+          "tag" : "9453d6a8ff91b714f32c0b71",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 0,
+      "keySize" : 192,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 458,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "15699c20198688b9e4882a6542811ada",
+          "tag" : "c69317b99b43086b621eb14a",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 8,
+      "keySize" : 192,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 459,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "40",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "7e84b5aa41d2212b3a5d730df5b20eaa",
+          "tag" : "5924d8bd85318b033bf4f2fd",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 16,
+      "keySize" : 192,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 460,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "4041",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb813367e3d1fa4ee4c402450f2946d1",
+          "tag" : "cf6eee495f94c08fef7ce5b5",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 32,
+      "keySize" : 192,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 461,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "40414243",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3be9c621dbe057b86acaef8ad0e38ee0",
+          "tag" : "6dd33d42278bb2f27eab7a0b",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 48,
+      "keySize" : 192,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 462,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "404142434445",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "41bd6e626ef1d4fa33e3e62b6b71b247",
+          "tag" : "b03506df38085e4f93ee9ea4",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 112,
+      "keySize" : 192,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 463,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "404142434445464748494a4b4c4d",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "390f24acc113b433e4b785e9183d4838",
+          "tag" : "9bc0397fee59e6990c3bbc81",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 120,
+      "keySize" : 192,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 464,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "404142434445464748494a4b4c4d4e",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2d108590625ee4af66b7cb663df50c1",
+          "tag" : "cfeabe252650d12584478bd0",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 128,
+      "keySize" : 192,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 465,
+          "comment" : "Nonce is too long",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "17ef53d925bba4e1f335d00186b7c38e",
+          "tag" : "8f6477da94ef6f63c4d1a071",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 160,
+      "keySize" : 192,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 466,
+          "comment" : "Nonce is too long",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "202122232425262728292a2b2c2d2e2f30313233",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "17ef53d925bba4e1f335d00186b7c38e",
+          "tag" : "8f6477da94ef6f63c4d1a071",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 256,
+      "keySize" : 192,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 467,
+          "comment" : "Nonce is too long",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "17ef53d925bba4e1f335d00186b7c38e",
+          "tag" : "8f6477da94ef6f63c4d1a071",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 0,
+      "keySize" : 256,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 468,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3cd9bace5f5dc77c89c2bc139065e797",
+          "tag" : "99f6058eeb8e3a8036aadab8",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 8,
+      "keySize" : 256,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 469,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "40",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b5f044211e18b13572e2ea70ed178353",
+          "tag" : "24cf3f3f369b692fe730970c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 16,
+      "keySize" : 256,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 470,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "4041",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "c000746ed8246d20edda90c04f380ba8",
+          "tag" : "af82093487d3a5d4872ff9e2",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 32,
+      "keySize" : 256,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 471,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "40414243",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b00bd7b8cd031c168e37407eb09f062e",
+          "tag" : "bfcae110c737bbe757967f4e",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 48,
+      "keySize" : 256,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 472,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "404142434445",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "ae2865f86ba6328ce131a49cd499f936",
+          "tag" : "4390b54f3b7cbf9e54a22048",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 112,
+      "keySize" : 256,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 473,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "404142434445464748494a4b4c4d",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "5680ebd16ae446e9e2d07fbaac7abd0b",
+          "tag" : "d72d015782fd94d76d2f682f",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 120,
+      "keySize" : 256,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 474,
+          "comment" : "Invalid nonce size",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "404142434445464748494a4b4c4d4e",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "6a611e6fb67d831b4b096169f2e86647",
+          "tag" : "0c39bb2462bbaff71939ee1f",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 128,
+      "keySize" : 256,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 475,
+          "comment" : "Nonce is too long",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "681841a0a013923907c669efd3ffd069",
+          "tag" : "054cd6f1cda1b1bf91e0100f",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 160,
+      "keySize" : 256,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 476,
+          "comment" : "Nonce is too long",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "202122232425262728292a2b2c2d2e2f30313233",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "681841a0a013923907c669efd3ffd069",
+          "tag" : "054cd6f1cda1b1bf91e0100f",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 256,
+      "keySize" : 256,
+      "tagSize" : 96,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 477,
+          "comment" : "Nonce is too long",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "681841a0a013923907c669efd3ffd069",
+          "tag" : "054cd6f1cda1b1bf91e0100f",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 128,
+      "tagSize" : 16,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 478,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "d3dab1ee494cc229099d6cac7df14add",
+          "tag" : "198c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 128,
+      "tagSize" : 24,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 479,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "d3dab1ee494cc229099d6cac7df14add",
+          "tag" : "198c08",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 128,
+      "tagSize" : 40,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 480,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "d3dab1ee494cc229099d6cac7df14add",
+          "tag" : "231a2d8f6a",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 128,
+      "tagSize" : 56,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 481,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "d3dab1ee494cc229099d6cac7df14add",
+          "tag" : "b1bbf3883507cd",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 128,
+      "tagSize" : 72,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 482,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "d3dab1ee494cc229099d6cac7df14add",
+          "tag" : "cd0ae63f3a30f7fb5b",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 128,
+      "tagSize" : 88,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 483,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "d3dab1ee494cc229099d6cac7df14add",
+          "tag" : "535e32ac416816615e5a20",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 128,
+      "tagSize" : 104,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 484,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "d3dab1ee494cc229099d6cac7df14add",
+          "tag" : "a6c58458d3969da9cb0849f95e",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 128,
+      "tagSize" : 120,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 485,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "d3dab1ee494cc229099d6cac7df14add",
+          "tag" : "f7879fb7fe88dd74cb8e96fda1d2eb",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 192,
+      "tagSize" : 16,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 486,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "1c49324515a346d424eed6fed9bddc17",
+          "tag" : "95eb",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 192,
+      "tagSize" : 24,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 487,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "1c49324515a346d424eed6fed9bddc17",
+          "tag" : "95eb98",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 192,
+      "tagSize" : 40,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 488,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "1c49324515a346d424eed6fed9bddc17",
+          "tag" : "3fd40dd8e0",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 192,
+      "tagSize" : 56,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 489,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "1c49324515a346d424eed6fed9bddc17",
+          "tag" : "793ca5d351e68c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 192,
+      "tagSize" : 72,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 490,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "1c49324515a346d424eed6fed9bddc17",
+          "tag" : "63a0987ffff1313caa",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 192,
+      "tagSize" : 88,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 491,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "1c49324515a346d424eed6fed9bddc17",
+          "tag" : "0ee40f14475b7e28752983",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 192,
+      "tagSize" : 104,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 492,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "1c49324515a346d424eed6fed9bddc17",
+          "tag" : "40a4fc82d429a0091c962d7152",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 192,
+      "tagSize" : 120,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 493,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "1c49324515a346d424eed6fed9bddc17",
+          "tag" : "f8f9bdc6b8506afd3ae54a0a67e185",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 256,
+      "tagSize" : 16,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 494,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3b6829d5deb47ca9f10abf481564aee1",
+          "tag" : "8f8b",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 256,
+      "tagSize" : 24,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 495,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3b6829d5deb47ca9f10abf481564aee1",
+          "tag" : "8f8b32",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 256,
+      "tagSize" : 40,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 496,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3b6829d5deb47ca9f10abf481564aee1",
+          "tag" : "a94e19f34c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 256,
+      "tagSize" : 56,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 497,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3b6829d5deb47ca9f10abf481564aee1",
+          "tag" : "5e90218caca470",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 256,
+      "tagSize" : 72,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 498,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3b6829d5deb47ca9f10abf481564aee1",
+          "tag" : "385cef2c2599faa960",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 256,
+      "tagSize" : 88,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 499,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3b6829d5deb47ca9f10abf481564aee1",
+          "tag" : "e81c270020edd93ba7e564",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 256,
+      "tagSize" : 104,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 500,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3b6829d5deb47ca9f10abf481564aee1",
+          "tag" : "c5d5f29af5c0db444ac2618b9d",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 256,
+      "tagSize" : 120,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 501,
+          "comment" : "Invalid tag size",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "464748494a4b4c4d4e4f5051",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "3b6829d5deb47ca9f10abf481564aee1",
+          "tag" : "f2f6d8b6ab69c8e10039b5754f5537",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/aes_cmac_test.json b/third_party/wycheproof/testvectors/aes_cmac_test.json
new file mode 100644
index 0000000..9210210
--- /dev/null
+++ b/third_party/wycheproof/testvectors/aes_cmac_test.json
@@ -0,0 +1,2695 @@
+{
+  "algorithm" : "AES-CMAC",
+  "generatorVersion" : "0.4.12",
+  "numberOfTests" : 290,
+  "header" : [],
+  "testGroups" : [
+    {
+      "keySize" : 128,
+      "tagSize" : 96,
+      "type" : "MacTest",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "empty message",
+          "key" : "1607559459d30d33548a635ab1eeab9d",
+          "msg" : "",
+          "tag" : "6a8974470fddb0a47e2b6e7d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "truncated mac",
+          "key" : "994275465065fdc96ae37b5d2feb8726",
+          "msg" : "c6",
+          "tag" : "3bfa9ec0fb0cc2b8509e7b1f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "truncated mac",
+          "key" : "ddc31fc7751a2bf5c8d2d815035622e8",
+          "msg" : "c81598f30b3e8ca8",
+          "tag" : "323c2fd67f1bc85108f391e1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "truncated mac",
+          "key" : "acef13560296fdc6b09398ae04196f2b",
+          "msg" : "25d99a552339745e24a0cb6a9669c4",
+          "tag" : "cdff8af899f61a70a97d967a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "truncated mac",
+          "key" : "33defac4ec7c7b69aa72edb23119e619",
+          "msg" : "ceabee3f13d0718779ba86acccd6d5a9",
+          "tag" : "e0b19f7e0316f276a846115f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "truncated mac",
+          "key" : "d1c61c251def47b39deb1a77a8b188d9",
+          "msg" : "0d68e86cf139677cb461a0fa76690e4afc",
+          "tag" : "2c5f2629fa41555e84c0ef0c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "truncated mac",
+          "key" : "3f71e3875f234fc569433cafa3a36330",
+          "msg" : "a3e01e9a597e57502fd849908aa7a19407cbfdc74bc5c485",
+          "tag" : "eb8e0bb4937e4a4f9fd55465",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "MacTest",
+      "tests" : [
+        {
+          "tcId" : 8,
+          "comment" : "empty message",
+          "key" : "e34f15c7bd819930fe9d66e0c166e61c",
+          "msg" : "",
+          "tag" : "d47afca1d857a5933405b1eb7a5cb7af",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "full length mac",
+          "key" : "e1e726677f4893890f8c027f9d8ef80d",
+          "msg" : "3f",
+          "tag" : "15f856bbed3b321952a584b3c4437a63",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "full length mac",
+          "key" : "48f0d03e41cc55c4b58f737b5acdea32",
+          "msg" : "f4a133aa6d5985a0",
+          "tag" : "1f1cd0327c02e6d00086915937dd61d9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "full length mac",
+          "key" : "501d81ebf912ddb87fbe3b7aac1437bc",
+          "msg" : "2368e3c3636b5e8e94d2081adbf798",
+          "tag" : "aeb784a3825168ddd61f72d0202125e6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "full length mac",
+          "key" : "e09eaa5a3f5e56d279d5e7a03373f6ea",
+          "msg" : "ef4eab37181f98423e53e947e7050fd0",
+          "tag" : "40facf0e2fb51b73a7472681b033d6dc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "full length mac",
+          "key" : "831e664c9e3f0c3094c0b27b9d908eb2",
+          "msg" : "26603bb76dd0a0180791c4ed4d3b058807",
+          "tag" : "a8144c8b24f2aa47d9c160cff4ab1716",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "full length mac",
+          "key" : "549bd282ee21b4d7c3b1d02e3ee20ef7",
+          "msg" : "d84bf73c5eecbd38444f1a73556e2fa3253f4c54d6916545",
+          "tag" : "7ed458afe02f4a513f59715b664b1bbe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "96dd6e5a882cbd564c39ae7d1c5a31aa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "43802eb1931f0032afe984443738cd31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7acfbbca7a2ea68b966fc5399f74809e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "95dd6e5a882cbd564c39ae7d1c5a31aa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "40802eb1931f0032afe984443738cd31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "79cfbbca7a2ea68b966fc5399f74809e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "17dd6e5a882cbd564c39ae7d1c5a31aa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "c2802eb1931f0032afe984443738cd31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "fbcfbbca7a2ea68b966fc5399f74809e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "97dc6e5a882cbd564c39ae7d1c5a31aa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "42812eb1931f0032afe984443738cd31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7bcebbca7a2ea68b966fc5399f74809e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "97dd6eda882cbd564c39ae7d1c5a31aa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "42802e31931f0032afe984443738cd31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7bcfbb4a7a2ea68b966fc5399f74809e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "97dd6e5a892cbd564c39ae7d1c5a31aa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "42802eb1921f0032afe984443738cd31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7bcfbbca7b2ea68b966fc5399f74809e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "97dd6e5a8a2cbd564c39ae7d1c5a31aa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "42802eb1911f0032afe984443738cd31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7bcfbbca782ea68b966fc5399f74809e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "97dd6e5a882cbdd64c39ae7d1c5a31aa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "42802eb1931f00b2afe984443738cd31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7bcfbbca7a2ea60b966fc5399f74809e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "97dd6e5a882cbd564d39ae7d1c5a31aa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "42802eb1931f0032aee984443738cd31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7bcfbbca7a2ea68b976fc5399f74809e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "97dd6e5a882cbd56cc39ae7d1c5a31aa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "42802eb1931f00322fe984443738cd31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7bcfbbca7a2ea68b166fc5399f74809e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "97dd6e5a882cbd564c19ae7d1c5a31aa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "42802eb1931f0032afc984443738cd31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7bcfbbca7a2ea68b964fc5399f74809e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "97dd6e5a882cbd564c39af7d1c5a31aa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "42802eb1931f0032afe985443738cd31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7bcfbbca7a2ea68b966fc4399f74809e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "97dd6e5a882cbd564c39ae7d1d5a31aa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "42802eb1931f0032afe984443638cd31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7bcfbbca7a2ea68b966fc5399e74809e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "97dd6e5a882cbd564c39ae7d1e5a31aa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "42802eb1931f0032afe984443538cd31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7bcfbbca7a2ea68b966fc5399d74809e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "97dd6e5a882cbd564c39ae7d9c5a31aa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "42802eb1931f0032afe98444b738cd31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7bcfbbca7a2ea68b966fc5391f74809e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "97dd6e5a882cbd564c39ae7d1c5a31ab",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "42802eb1931f0032afe984443738cd30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7bcfbbca7a2ea68b966fc5399f74809f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "97dd6e5a882cbd564c39ae7d1c5a31a8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "42802eb1931f0032afe984443738cd33",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7bcfbbca7a2ea68b966fc5399f74809c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "97dd6e5a882cbd564c39ae7d1c5a31ea",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "42802eb1931f0032afe984443738cd71",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7bcfbbca7a2ea68b966fc5399f7480de",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "97dd6e5a882cbd564c39ae7d1c5a312a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "42802eb1931f0032afe984443738cdb1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7bcfbbca7a2ea68b966fc5399f74801e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "96dd6e5a882cbd564d39ae7d1c5a31aa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "43802eb1931f0032aee984443738cd31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7acfbbca7a2ea68b976fc5399f74809e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "97dd6eda882cbdd64c39ae7d1c5a31aa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "42802e31931f00b2afe984443738cd31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7bcfbb4a7a2ea60b966fc5399f74809e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "97dd6e5a882cbdd64c39ae7d1c5a312a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "42802eb1931f00b2afe984443738cdb1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7bcfbbca7a2ea60b966fc5399f74801e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "682291a577d342a9b3c65182e3a5ce55",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "bd7fd14e6ce0ffcd50167bbbc8c732ce",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "8430443585d1597469903ac6608b7f61",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "175deeda08ac3dd6ccb92efd9cdab12a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "c200ae31139f80b22f6904c4b7b84db1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "fb4f3b4afaae260b16ef45b91ff4001e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "",
+          "tag" : "96dc6f5b892dbc574d38af7c1d5b30ab",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "0001020304050607",
+          "tag" : "43812fb0921e0133aee885453639cc30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "7acebacb7b2fa78a976ec4389e75819f",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "keySize" : 192,
+      "tagSize" : 96,
+      "type" : "MacTest",
+      "tests" : [
+        {
+          "tcId" : 96,
+          "comment" : "empty message",
+          "key" : "78fe7087bc810abf08f15fc69804f888435a6442677c8c79",
+          "msg" : "",
+          "tag" : "48d92d311f60d51a23e56d8c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "truncated mac",
+          "key" : "7ab6fb0e3456e40c3a6c5db57a3d0548d4c8c3cfd8849dba",
+          "msg" : "c6",
+          "tag" : "d904a70715bd0ad9468f37b2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "truncated mac",
+          "key" : "f095a5d39f0b499cef0130b4eb3bfae90253a1f30270efb5",
+          "msg" : "738e196c2cb0206b",
+          "tag" : "7a3b8de1c57e7c5f7babbe42",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "truncated mac",
+          "key" : "6fee9e028a35d168ffe2062338f753d3930597b341210f0c",
+          "msg" : "a1518bb8cb88f305935b91f64f2479",
+          "tag" : "7ba264b276a0849bc76a2a29",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "truncated mac",
+          "key" : "304b9077a8f36fd949e38bbfb6dd71e313530ba0a34d3e77",
+          "msg" : "87e60924ae7f2ae1567cbcb07f7ae2aa",
+          "tag" : "725e51ac5b10338d940c0236",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "truncated mac",
+          "key" : "fec7f37de35365c415701ba2eec2d94cb20e3e2a0c21cfcf",
+          "msg" : "cf24271e0acebd3249f996da1fe9d13e3f",
+          "tag" : "7636cec43b5b7a40787580fa",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "truncated mac",
+          "key" : "5f4df68a45a5edde95907b5b002fcf3ba6747f9194536dd3",
+          "msg" : "4cc781faaa8decb281afab7dc69f380921d04c54414bb65f",
+          "tag" : "bb2de41c514dd64ebc5f5a99",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "MacTest",
+      "tests" : [
+        {
+          "tcId" : 103,
+          "comment" : "empty message",
+          "key" : "3d6bf9edae6d881eade0ff8c7076a4835b71320c1f36b631",
+          "msg" : "",
+          "tag" : "a8dd15fe2ce3495ec5b666744ec29220",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "full length mac",
+          "key" : "915429743435c28997a33b33b6574a953d81dae0e7032e6a",
+          "msg" : "58",
+          "tag" : "e13b3f7f7f510c3a059df7a68c7e2ad5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "full length mac",
+          "key" : "28d8da67806410e5565bcc5a9d7ab9fb357413fa0158378c",
+          "msg" : "004e3f4a4e6db955",
+          "tag" : "c4c2c0876be9eabeb5a956da53846b08",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "full length mac",
+          "key" : "850fc859e9f7b89a367611dee6698f33962d8245ca8dc331",
+          "msg" : "586f4f171af116519061a8e0e77940",
+          "tag" : "fb11a360c9776991d73d6e41d07710a2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "full length mac",
+          "key" : "f4bfa5aa4f0f4d62cf736cd2969c43d580fdb92f2753bedb",
+          "msg" : "0e239f239705b282ce2200fe20de1165",
+          "tag" : "ab20a6cf60873665b1d6999b05c7f9c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "full length mac",
+          "key" : "cfd3f68873d81a27d2bfce876c79f6e609074dec39e34614",
+          "msg" : "b1973cb25aa87ef9d1a8888b0a0f5c04c6",
+          "tag" : "b95a016b83a0ae4194023333c8a7345a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "full length mac",
+          "key" : "648a44468d67bb6744b235ee7a3fcd6ed4bdc29ec5b5fa1a",
+          "msg" : "c59d0d6981cca1be1d5519fc7881e6d230f39f6c12a9e827",
+          "tag" : "a1b96272ae7f9aef567271795f21d1d3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ed12390ea0a7ed15d9d37a6eca1fc990",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c81307df60859acb911c7be61be7ca90",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f91bde0069a6e389573bf04e7cde688c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ee12390ea0a7ed15d9d37a6eca1fc990",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "cb1307df60859acb911c7be61be7ca90",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "fa1bde0069a6e389573bf04e7cde688c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "6c12390ea0a7ed15d9d37a6eca1fc990",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "491307df60859acb911c7be61be7ca90",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "781bde0069a6e389573bf04e7cde688c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ec13390ea0a7ed15d9d37a6eca1fc990",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c91207df60859acb911c7be61be7ca90",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f81ade0069a6e389573bf04e7cde688c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ec12398ea0a7ed15d9d37a6eca1fc990",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c913075f60859acb911c7be61be7ca90",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f81bde8069a6e389573bf04e7cde688c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ec12390ea1a7ed15d9d37a6eca1fc990",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c91307df61859acb911c7be61be7ca90",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f81bde0068a6e389573bf04e7cde688c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ec12390ea2a7ed15d9d37a6eca1fc990",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c91307df62859acb911c7be61be7ca90",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f81bde006ba6e389573bf04e7cde688c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ec12390ea0a7ed95d9d37a6eca1fc990",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c91307df60859a4b911c7be61be7ca90",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f81bde0069a6e309573bf04e7cde688c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ec12390ea0a7ed15d8d37a6eca1fc990",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c91307df60859acb901c7be61be7ca90",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f81bde0069a6e389563bf04e7cde688c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ec12390ea0a7ed1559d37a6eca1fc990",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c91307df60859acb111c7be61be7ca90",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f81bde0069a6e389d73bf04e7cde688c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ec12390ea0a7ed15d9f37a6eca1fc990",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c91307df60859acb913c7be61be7ca90",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f81bde0069a6e389571bf04e7cde688c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ec12390ea0a7ed15d9d37b6eca1fc990",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c91307df60859acb911c7ae61be7ca90",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 145,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f81bde0069a6e389573bf14e7cde688c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 146,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ec12390ea0a7ed15d9d37a6ecb1fc990",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 147,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c91307df60859acb911c7be61ae7ca90",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 148,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f81bde0069a6e389573bf04e7dde688c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 149,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ec12390ea0a7ed15d9d37a6ec81fc990",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 150,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c91307df60859acb911c7be619e7ca90",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 151,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f81bde0069a6e389573bf04e7ede688c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ec12390ea0a7ed15d9d37a6e4a1fc990",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 153,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c91307df60859acb911c7be69be7ca90",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 154,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f81bde0069a6e389573bf04efcde688c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 155,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ec12390ea0a7ed15d9d37a6eca1fc991",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 156,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c91307df60859acb911c7be61be7ca91",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 157,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f81bde0069a6e389573bf04e7cde688d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 158,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ec12390ea0a7ed15d9d37a6eca1fc992",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 159,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c91307df60859acb911c7be61be7ca92",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 160,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f81bde0069a6e389573bf04e7cde688e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 161,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ec12390ea0a7ed15d9d37a6eca1fc9d0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 162,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c91307df60859acb911c7be61be7cad0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 163,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f81bde0069a6e389573bf04e7cde68cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ec12390ea0a7ed15d9d37a6eca1fc910",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 165,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c91307df60859acb911c7be61be7ca10",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 166,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f81bde0069a6e389573bf04e7cde680c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 167,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ed12390ea0a7ed15d8d37a6eca1fc990",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 168,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c81307df60859acb901c7be61be7ca90",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 169,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f91bde0069a6e389563bf04e7cde688c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 170,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ec12398ea0a7ed95d9d37a6eca1fc990",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 171,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c913075f60859a4b911c7be61be7ca90",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 172,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f81bde8069a6e309573bf04e7cde688c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 173,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ec12390ea0a7ed95d9d37a6eca1fc910",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c91307df60859a4b911c7be61be7ca10",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f81bde0069a6e309573bf04e7cde680c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 176,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "13edc6f15f5812ea262c859135e0366f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 177,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "36ecf8209f7a65346ee38419e418356f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 178,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "07e421ff96591c76a8c40fb183219773",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 179,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 180,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 181,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 182,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 183,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 184,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 185,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "6c92b98e20276d955953faee4a9f4910",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 186,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "4993875fe0051a4b119cfb669b674a10",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 187,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "789b5e80e9266309d7bb70cefc5ee80c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 188,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "",
+          "tag" : "ed13380fa1a6ec14d8d27b6fcb1ec891",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 189,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "0001020304050607",
+          "tag" : "c81206de61849bca901d7ae71ae6cb91",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 190,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "f91adf0168a7e288563af14f7ddf698d",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "keySize" : 256,
+      "tagSize" : 96,
+      "type" : "MacTest",
+      "tests" : [
+        {
+          "tcId" : 191,
+          "comment" : "empty message",
+          "key" : "e40992eb4f649e5d49134652aecc24bafa6b45ce8dd9e9d371ede7d5de84fa72",
+          "msg" : "",
+          "tag" : "034762bd9014d642f7f08af7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 192,
+          "comment" : "truncated mac",
+          "key" : "298962335a075e9eacb7a7627beafa4ee5a02242423cdfb0b4f106eb61cf5663",
+          "msg" : "49",
+          "tag" : "4545f042beb65af2b7b74808",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 193,
+          "comment" : "truncated mac",
+          "key" : "2e94a84c78be80cd598366058d4f6cdf8095666dcac7a00ad832d9f33e20d13c",
+          "msg" : "b978587bf028558d",
+          "tag" : "6703f99ac094ed0e9d9973b5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 194,
+          "comment" : "truncated mac",
+          "key" : "95b330aa5fffa6c0e29fd6fa0debdcb9cf6b448820bea24875089ec8ca5a2387",
+          "msg" : "c96596ebba6f89761b9d14dfcc8fb4",
+          "tag" : "2fc3ce831f693912d33f3fde",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 195,
+          "comment" : "truncated mac",
+          "key" : "319cd78b51a689a66b232005d66ad1962d11e52faf6aaad4ce7dc30777cd9ecc",
+          "msg" : "82ce94904b110635a8604c4f7afc786b",
+          "tag" : "a7685d0f2049015e6f3229ee",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 196,
+          "comment" : "truncated mac",
+          "key" : "b3b7c2c6d3d80918218afcd8bf2a71cf0220e2e8084ead8ba1abfb893ae36d40",
+          "msg" : "dbcf98254157727c35f367fe6e15a2d089",
+          "tag" : "09a60999f8848d19be5242c8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 197,
+          "comment" : "truncated mac",
+          "key" : "8588a6f1fb8ccc0fed3fdb3f8a39d389fb9260748f3b45bd74ad42a60c9caf2b",
+          "msg" : "020cc9dd7f06f514bd3baf939f376b8b0083ff1b35ac90d0",
+          "tag" : "50649ef2b87c22d2731ace23",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "MacTest",
+      "tests" : [
+        {
+          "tcId" : 198,
+          "comment" : "empty message",
+          "key" : "7bf9e536b66a215c22233fe2daaa743a898b9acb9f7802de70b40e3d6e43ef97",
+          "msg" : "",
+          "tag" : "736c7b56957db774c5ddf7c7a70ba8a8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 199,
+          "comment" : "full length mac",
+          "key" : "e754076ceab3fdaf4f9bcab7d4f0df0cbbafbc87731b8f9b7cd2166472e8eebc",
+          "msg" : "40",
+          "tag" : "9d47482c2d9252bace43a75a8335b8b8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 200,
+          "comment" : "full length mac",
+          "key" : "505aa98819809ef63b9a368a1e8bc2e922da45b03ce02d9a7966b15006dba2d5",
+          "msg" : "2e4e7ef728fe11af",
+          "tag" : "f79606b83a7706a2a19e068bce818898",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 201,
+          "comment" : "full length mac",
+          "key" : "c19bdf314c6cf64381425467f42aefa17c1cc9358be16ce31b1d214859ce86aa",
+          "msg" : "5d066a92c300e9b6ddd63a7c13ae33",
+          "tag" : "b96818b7acaf879c7a7f8271375a6914",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 202,
+          "comment" : "full length mac",
+          "key" : "612e837843ceae7f61d49625faa7e7494f9253e20cb3adcea686512b043936cd",
+          "msg" : "cc37fae15f745a2f40e2c8b192f2b38d",
+          "tag" : "4b88e193000c5a4b23e95c7f2b26530b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 203,
+          "comment" : "full length mac",
+          "key" : "73216fafd0022d0d6ee27198b2272578fa8f04dd9f44467fbb6437aa45641bf7",
+          "msg" : "d5247b8f6c3edcbfb1d591d13ece23d2f5",
+          "tag" : "86911c7da51dc0823d6e93d4290d1ad4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 204,
+          "comment" : "full length mac",
+          "key" : "0427a70e257528f3ab70640bba1a5de12cf3885dd4c8e284fbbb55feb35294a5",
+          "msg" : "13937f8544f44270d01175a011f7670e93fa6ba7ef02336e",
+          "tag" : "ccb2c51bfbe2598f9109fc70ed07f0eb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 205,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6af0a293d8cba0101f0089727691b7fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 206,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d709717c3a4ef8a2ea200b297d2accec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 207,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "58ee3f3b5f83e290cae26dad29bba32d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "69f0a293d8cba0101f0089727691b7fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d409717c3a4ef8a2ea200b297d2accec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "5bee3f3b5f83e290cae26dad29bba32d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "ebf0a293d8cba0101f0089727691b7fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "5609717c3a4ef8a2ea200b297d2accec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 213,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "d9ee3f3b5f83e290cae26dad29bba32d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6bf1a293d8cba0101f0089727691b7fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 215,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d608717c3a4ef8a2ea200b297d2accec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 216,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "59ef3f3b5f83e290cae26dad29bba32d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6bf0a213d8cba0101f0089727691b7fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d60971fc3a4ef8a2ea200b297d2accec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "59ee3fbb5f83e290cae26dad29bba32d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6bf0a293d9cba0101f0089727691b7fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d609717c3b4ef8a2ea200b297d2accec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "59ee3f3b5e83e290cae26dad29bba32d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6bf0a293dacba0101f0089727691b7fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d609717c384ef8a2ea200b297d2accec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "59ee3f3b5d83e290cae26dad29bba32d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6bf0a293d8cba0901f0089727691b7fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d609717c3a4ef822ea200b297d2accec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "59ee3f3b5f83e210cae26dad29bba32d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6bf0a293d8cba0101e0089727691b7fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d609717c3a4ef8a2eb200b297d2accec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 231,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "59ee3f3b5f83e290cbe26dad29bba32d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 232,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6bf0a293d8cba0109f0089727691b7fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 233,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d609717c3a4ef8a26a200b297d2accec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 234,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "59ee3f3b5f83e2904ae26dad29bba32d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 235,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6bf0a293d8cba0101f2089727691b7fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 236,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d609717c3a4ef8a2ea000b297d2accec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 237,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "59ee3f3b5f83e290cac26dad29bba32d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 238,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6bf0a293d8cba0101f0088727691b7fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 239,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d609717c3a4ef8a2ea200a297d2accec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 240,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "59ee3f3b5f83e290cae26cad29bba32d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 241,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6bf0a293d8cba0101f0089727791b7fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 242,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d609717c3a4ef8a2ea200b297c2accec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 243,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "59ee3f3b5f83e290cae26dad28bba32d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 244,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6bf0a293d8cba0101f0089727491b7fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 245,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d609717c3a4ef8a2ea200b297f2accec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 246,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "59ee3f3b5f83e290cae26dad2bbba32d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 247,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6bf0a293d8cba0101f008972f691b7fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 248,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d609717c3a4ef8a2ea200b29fd2accec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 249,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "59ee3f3b5f83e290cae26dada9bba32d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 250,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6bf0a293d8cba0101f0089727691b7fa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 251,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d609717c3a4ef8a2ea200b297d2acced",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 252,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "59ee3f3b5f83e290cae26dad29bba32c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 253,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6bf0a293d8cba0101f0089727691b7f9",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 254,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d609717c3a4ef8a2ea200b297d2accee",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 255,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "59ee3f3b5f83e290cae26dad29bba32f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 256,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6bf0a293d8cba0101f0089727691b7bb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 257,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d609717c3a4ef8a2ea200b297d2accac",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 258,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "59ee3f3b5f83e290cae26dad29bba36d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 259,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6bf0a293d8cba0101f0089727691b77b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 260,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d609717c3a4ef8a2ea200b297d2acc6c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 261,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "59ee3f3b5f83e290cae26dad29bba3ad",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 262,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6af0a293d8cba0101e0089727691b7fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 263,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d709717c3a4ef8a2eb200b297d2accec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 264,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "58ee3f3b5f83e290cbe26dad29bba32d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 265,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6bf0a213d8cba0901f0089727691b7fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 266,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d60971fc3a4ef822ea200b297d2accec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 267,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "59ee3fbb5f83e210cae26dad29bba32d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 268,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6bf0a293d8cba0901f0089727691b77b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 269,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d609717c3a4ef822ea200b297d2acc6c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 270,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "59ee3f3b5f83e210cae26dad29bba3ad",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 271,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "940f5d6c27345fefe0ff768d896e4804",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 272,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "29f68e83c5b1075d15dff4d682d53313",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 273,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "a611c0c4a07c1d6f351d9252d6445cd2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 274,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 275,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 276,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 277,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 278,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 279,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 280,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "eb702213584b20909f8009f2f611377b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 281,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "5689f1fcbace78226aa08ba9fdaa4c6c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 282,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "d96ebfbbdf0362104a62ed2da93b23ad",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 283,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "",
+          "tag" : "6af1a392d9caa1111e0188737790b6fa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 284,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "0001020304050607",
+          "tag" : "d708707d3b4ff9a3eb210a287c2bcded",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 285,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "tag" : "58ef3e3a5e82e391cbe36cac28baa22c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "keySize" : 0,
+      "tagSize" : 128,
+      "type" : "MacTest",
+      "tests" : [
+        {
+          "tcId" : 286,
+          "comment" : "invalid key size",
+          "key" : "",
+          "msg" : "00b9449326d39416",
+          "tag" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "keySize" : 8,
+      "tagSize" : 128,
+      "type" : "MacTest",
+      "tests" : [
+        {
+          "tcId" : 287,
+          "comment" : "invalid key size",
+          "key" : "0f",
+          "msg" : "4538b79a1397e2aa",
+          "tag" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "keySize" : 64,
+      "tagSize" : 128,
+      "type" : "MacTest",
+      "tests" : [
+        {
+          "tcId" : 288,
+          "comment" : "invalid key size",
+          "key" : "a88e385af7185148",
+          "msg" : "dc63b7ef08096e4f",
+          "tag" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "keySize" : 160,
+      "tagSize" : 128,
+      "type" : "MacTest",
+      "tests" : [
+        {
+          "tcId" : 289,
+          "comment" : "invalid key size",
+          "key" : "003a228008d390b645929df73a2b2bdd8298918d",
+          "msg" : "ad1d3c3122ab7ac6",
+          "tag" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "keySize" : 320,
+      "tagSize" : 128,
+      "type" : "MacTest",
+      "tests" : [
+        {
+          "tcId" : 290,
+          "comment" : "invalid key size",
+          "key" : "94baaac150e2645ae1ec1939c7bcefb73f6edb146fae02289b6c6326ff39bc265d612bef2727fa72",
+          "msg" : "e3f75a886c4a5591",
+          "tag" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/aes_eax_test.json b/third_party/wycheproof/testvectors/aes_eax_test.json
new file mode 100644
index 0000000..ebabeaf
--- /dev/null
+++ b/third_party/wycheproof/testvectors/aes_eax_test.json
@@ -0,0 +1,2139 @@
+{
+  "algorithm" : "AES-EAX",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "CounterWrap" : "AES-EAX reduces the counter value modulo 2**128. This test vector was constructed for testing the wrapping of the counter value."
+  },
+  "numberOfTests" : 162,
+  "header" : [],
+  "testGroups" : [
+    {
+      "ivSize" : 128,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "eprint.iacr.org/2003/069",
+          "key" : "233952dee4d5ed5f9b9c6d6ff80ff478",
+          "iv" : "62ec67f9c3a4a407fcb2a8c49031a8b3",
+          "aad" : "6bfb914fd07eae6b",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "e037830e8389f27b025a2d6527e79d01",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "eprint.iacr.org/2003/069",
+          "key" : "91945d3f4dcbee0bf45ef52255f095a4",
+          "iv" : "becaf043b0a23d843194ba972c66debd",
+          "aad" : "fa3bfd4806eb53fa",
+          "msg" : "f7fb",
+          "ct" : "19dd",
+          "tag" : "5c4c9331049d0bdab0277408f67967e5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "eprint.iacr.org/2003/069",
+          "key" : "01f74ad64077f2e704c0f60ada3dd523",
+          "iv" : "70c3db4f0d26368400a10ed05d2bff5e",
+          "aad" : "234a3463c1264ac6",
+          "msg" : "1a47cb4933",
+          "ct" : "d851d5bae0",
+          "tag" : "3a59f238a23e39199dc9266626c40f80",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "eprint.iacr.org/2003/069",
+          "key" : "d07cf6cbb7f313bdde66b727afd3c5e8",
+          "iv" : "8408dfff3c1a2b1292dc199e46b7d617",
+          "aad" : "33cce2eabff5a79d",
+          "msg" : "481c9e39b1",
+          "ct" : "632a9d131a",
+          "tag" : "d4c168a4225d8e1ff755939974a7bede",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "eprint.iacr.org/2003/069",
+          "key" : "35b6d0580005bbc12b0587124557d2c2",
+          "iv" : "fdb6b06676eedc5c61d74276e1f8e816",
+          "aad" : "aeb96eaebe2970e9",
+          "msg" : "40d0c07da5e4",
+          "ct" : "071dfe16c675",
+          "tag" : "cb0677e536f73afe6a14b74ee49844dd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "eprint.iacr.org/2003/069",
+          "key" : "bd8e6e11475e60b268784c38c62feb22",
+          "iv" : "6eac5c93072d8e8513f750935e46da1b",
+          "aad" : "d4482d1ca78dce0f",
+          "msg" : "4de3b35c3fc039245bd1fb7d",
+          "ct" : "835bb4f15d743e350e728414",
+          "tag" : "abb8644fd6ccb86947c5e10590210a4f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "eprint.iacr.org/2003/069",
+          "key" : "7c77d6e813bed5ac98baa417477a2e7d",
+          "iv" : "1a8c98dcd73d38393b2bf1569deefc19",
+          "aad" : "65d2017990d62528",
+          "msg" : "8b0a79306c9ce7ed99dae4f87f8dd61636",
+          "ct" : "02083e3979da014812f59f11d52630da30",
+          "tag" : "137327d10649b0aa6e1c181db617d7f2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "eprint.iacr.org/2003/069",
+          "key" : "5fff20cafab119ca2fc73549e20f5b0d",
+          "iv" : "dde59b97d722156d4d9aff2bc7559826",
+          "aad" : "54b9f04e6a09189a",
+          "msg" : "1bda122bce8a8dbaf1877d962b8592dd2d56",
+          "ct" : "2ec47b2c4954a489afc7ba4897edcdae8cc3",
+          "tag" : "3b60450599bd02c96382902aef7f832a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "eprint.iacr.org/2003/069",
+          "key" : "a4a4782bcffd3ec5e7ef6d8c34a56123",
+          "iv" : "b781fcf2f75fa5a8de97a9ca48e522ec",
+          "aad" : "899a175897561d7e",
+          "msg" : "6cf36720872b8513f6eab1a8a44438d5ef11",
+          "ct" : "0de18fd0fdd91e7af19f1d8ee8733938b1e8",
+          "tag" : "e7f6d2231618102fdb7fe55ff1991700",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "eprint.iacr.org/2003/069",
+          "key" : "8395fcf1e95bebd697bd010bc766aac3",
+          "iv" : "22e7add93cfc6393c57ec0b3c17d6b44",
+          "aad" : "126735fcc320d25a",
+          "msg" : "ca40d7446e545ffaed3bd12a740a659ffbbb3ceab7",
+          "ct" : "cb8920f87a6c75cff39627b56e3ed197c552d295a7",
+          "tag" : "cfc46afc253b4652b1af3795b124ab6e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "Initial counter value == 2^128-1",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "3c8cc2970a008f75cc5beae2847258c2",
+          "aad" : "",
+          "msg" : "0000000000000000000000000000000011111111111111111111111111111111",
+          "ct" : "3c441f32ce07822364d7a2990e50bb13d7b02a26969e4a937e5e9073b0d9c968",
+          "tag" : "db90bdb3da3d00afd0fc6a83551da95e",
+          "result" : "valid",
+          "flags" : [
+            "CounterWrap"
+          ]
+        },
+        {
+          "tcId" : 12,
+          "comment" : "counter value overflows at 64-bit boundary",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "aef03d00598494e9fb03cd7d8b590866",
+          "aad" : "",
+          "msg" : "0000000000000000000000000000000011111111111111111111111111111111",
+          "ct" : "d19ac59849026a91aa1b9aec29b11a202a4d739fd86c28e3ae3d588ea21d70c6",
+          "tag" : "c30f6cd9202074ed6e2a2a360eac8c47",
+          "result" : "valid",
+          "flags" : [
+            "CounterWrap"
+          ]
+        },
+        {
+          "tcId" : 13,
+          "comment" : "no counter overflow, but the 64 most significant bits are set.",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "55d12511c696a80d0514d1ffba49cada",
+          "aad" : "",
+          "msg" : "0000000000000000000000000000000011111111111111111111111111111111",
+          "ct" : "2108558ac4b2c2d5cc66cea51d6210e046177a67631cd2dd8f09469733acb517",
+          "tag" : "fc355e87a267be3ae3e44c0bf3f99b2b",
+          "result" : "valid",
+          "flags" : [
+            "CounterWrap"
+          ]
+        },
+        {
+          "tcId" : 14,
+          "comment" : "counter value overflows at 32-bit boundary",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "79422ddd91c4eee2deaef1f968305304",
+          "aad" : "",
+          "msg" : "0000000000000000000000000000000011111111111111111111111111111111",
+          "ct" : "4d2c1524ca4baa4eefcce6b91b227ee83abaff8105dcafa2ab191f5df2575035",
+          "tag" : "e2c865ce2d7abdac024c6f991a848390",
+          "result" : "valid",
+          "flags" : [
+            "CounterWrap"
+          ]
+        },
+        {
+          "tcId" : 15,
+          "comment" : "bits 32-64 and 96-128 of counter are set",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "0af5aa7a7676e28306306bcd9bf2003a",
+          "aad" : "",
+          "msg" : "0000000000000000000000000000000011111111111111111111111111111111",
+          "ct" : "8eb01e62185d782eb9287a341a6862ac5257d6f9adc99ee0a24d9c22b3e9b38a",
+          "tag" : "39c339bc8a74c75e2c65c6119544d61e",
+          "result" : "valid",
+          "flags" : [
+            "CounterWrap"
+          ]
+        },
+        {
+          "tcId" : 16,
+          "comment" : "lower bits of initial counter are 2^63-1",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "af5a03ae7edd73471bdcdfac5e194a60",
+          "aad" : "",
+          "msg" : "0000000000000000000000000000000011111111111111111111111111111111",
+          "ct" : "94c5d2aca6dbbce8c24513a25e095c0e54a942860d327a222a815cc713b163b4",
+          "tag" : "f50b30304e45c9d411e8df4508a98612",
+          "result" : "valid",
+          "flags" : [
+            "CounterWrap"
+          ]
+        },
+        {
+          "tcId" : 17,
+          "comment" : "counter overflow",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "b37087680f0edd5a52228b8c7aaea664",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000111111111111111111111111111111112222222222222222222222222222222233333333333333333333333333333333",
+          "ct" : "3bb6173e3772d4b62eef37f9ef0781f360b6c74be3bf6b371067bc1b090d9d6622a1fbec6ac471b3349cd4277a101d40890fbf27dfdcd0b4e3781f9806daabb6",
+          "tag" : "a0498745e59999ddc32d5b140241124e",
+          "result" : "valid",
+          "flags" : [
+            "CounterWrap"
+          ]
+        },
+        {
+          "tcId" : 18,
+          "comment" : "lower 64 bits of initial counter are 2^63-4",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "4f802da62a384555a19bc2b382eb25af",
+          "aad" : "",
+          "msg" : "0000000000000000000000000000000011111111111111111111111111111111222222222222222222222222222222223333333333333333333333333333333344444444444444444444444444444444",
+          "ct" : "e9b0bb8857818ce3201c3690d21daa7f264fb8ee93cc7a4674ea2fc32bf182fb2a7e8ad51507ad4f31cefc2356fe7936a7f6e19f95e88fdbf17620916d3a6f3d01fc17d358672f777fd4099246e436e1",
+          "tag" : "67910be744b8315ae0eb6124590c5d8b",
+          "result" : "valid",
+          "flags" : [
+            "CounterWrap"
+          ]
+        },
+        {
+          "tcId" : 19,
+          "comment" : "",
+          "key" : "b67b1a6efdd40d37080fbe8f8047aeb9",
+          "iv" : "fa294b129972f7fc5bbd5b96bba837c9",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "b14b64fb589899699570cc9160e39896",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "",
+          "key" : "209e6dbf2ad26a105445fc0207cd9e9a",
+          "iv" : "9477849d6ccdfca112d92e53fae4a7ca",
+          "aad" : "",
+          "msg" : "01",
+          "ct" : "1d",
+          "tag" : "52a5f600fe5338026a7cb09c11640082",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "",
+          "key" : "a549442e35154032d07c8666006aa6a2",
+          "iv" : "5171524568e81d97e8c4de4ba56c10a0",
+          "aad" : "",
+          "msg" : "1182e93596cac5608946400bc73f3a",
+          "ct" : "d7b8a6b43d2e9f98c2b44ce5e3cfdb",
+          "tag" : "1bdd52fc987daf0ee19234c905ea645f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "",
+          "key" : "958bcdb66a3952b53701582a68a0e474",
+          "iv" : "0e6ec879b02c6f516976e35898428da7",
+          "aad" : "",
+          "msg" : "140415823ecc8932a058384b738ea6ea6d4dfe3bbeee",
+          "ct" : "73e5c6f0e703a52d02f7f7faeb1b77fd4fd0cb421eaf",
+          "tag" : "6c154a85968edd74776575a4450bd897",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "",
+          "key" : "965b757ba5018a8d66edc78e0ceee86b",
+          "iv" : "2e35901ae7d491eecc8838fedd631405",
+          "aad" : "df10d0d212242450",
+          "msg" : "36e57a763958b02cea9d6a676ebce81f",
+          "ct" : "936b69b6c955adfd15539b9be4989cb6",
+          "tag" : "ee15a1454e88faad8e48a8df2983b425",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "",
+          "key" : "88d02033781c7b4164711a05420f256e",
+          "iv" : "7f2985296315507aa4c0a93d5c12bd77",
+          "aad" : "7c571d2fbb5f62523c0eb338bef9a9",
+          "msg" : "d98adc03d9d582732eb07df23d7b9f74",
+          "ct" : "67caac35443a3138d2cb811f0ce04dd2",
+          "tag" : "b7968e0b5640e3b236569653208b9deb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "",
+          "key" : "515840cf67d2e40eb65e54a24c72cbf2",
+          "iv" : "bf47afdfd492137a24236bc36797a88e",
+          "aad" : "16843c091d43b0a191d0c73d15601be9",
+          "msg" : "c834588cb6daf9f06dd23519f4be9f56",
+          "ct" : "200ac451fbeb0f6151d61583a43b7343",
+          "tag" : "2ad43e4caa51983a9d4d24481bf4c839",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "",
+          "key" : "2e4492d444e5b6f4cec8c2d3615ac858",
+          "iv" : "d02bf0763a9fefbf70c33aee1e9da1d6",
+          "aad" : "904d86f133cec15a0c3caf14d7e029c82a07705a23f0d080",
+          "msg" : "9e62d6511b0bda7dd7740b614d97bae0",
+          "ct" : "27c6e9a653c5253ca1c5673f97b9b33e",
+          "tag" : "2d581271e1fa9e3686136caa8f4d6c8e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e70e7c5013a6dbf25298b1929bc356a7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e40e7c5013a6dbf25298b1929bc356a7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "660e7c5013a6dbf25298b1929bc356a7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e60f7c5013a6dbf25298b1929bc356a7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e60e7cd013a6dbf25298b1929bc356a7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e60e7c5012a6dbf25298b1929bc356a7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e60e7c5011a6dbf25298b1929bc356a7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e60e7c5013a6db725298b1929bc356a7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e60e7c5013a6dbf25398b1929bc356a7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e60e7c5013a6dbf2d298b1929bc356a7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e60e7c5013a6dbf252b8b1929bc356a7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e60e7c5013a6dbf25298b0929bc356a7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e60e7c5013a6dbf25298b1929ac356a7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e60e7c5013a6dbf25298b19299c356a7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e60e7c5013a6dbf25298b1921bc356a7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e60e7c5013a6dbf25298b1929bc356a6",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e60e7c5013a6dbf25298b1929bc356a5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e60e7c5013a6dbf25298b1929bc356e7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e60e7c5013a6dbf25298b1929bc35627",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e70e7c5013a6dbf25398b1929bc356a7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e60e7cd013a6db725298b1929bc356a7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e60e7c5013a6db725298b1929bc35627",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "19f183afec59240dad674e6d643ca958",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "668efcd093265b72d21831121b43d627",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "29a0914fec4bef54babf6613a9f9cd70",
+          "tag" : "e70f7d5112a7daf35399b0939ac257a6",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 54,
+          "comment" : "",
+          "key" : "bedcfb5a011ebc84600fcb296c15af0d",
+          "iv" : "438a547a94ea88dce46c6c85",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "9607977cd7556b1dfedf0c73a35a5197",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "",
+          "key" : "384ea416ac3c2f51a76e7d8226346d4e",
+          "iv" : "b30c084727ad1c592ac21d12",
+          "aad" : "",
+          "msg" : "35",
+          "ct" : "98",
+          "tag" : "f5d7930952e275beecb998d804c241f0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "",
+          "key" : "cae31cd9f55526eb038241fc44cac1e5",
+          "iv" : "b5e006ded553110e6dc56529",
+          "aad" : "",
+          "msg" : "d10989f2c52e94ad",
+          "ct" : "7fd2878318ab0f2b",
+          "tag" : "ab184ffde523565529a9be111b0c2d6d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "",
+          "key" : "ffdf4228361ea1f8165852136b3480f7",
+          "iv" : "0e1666f2dc652f7708fb8f0d",
+          "aad" : "",
+          "msg" : "25b12e28ac0ef6ead0226a3b2288c800",
+          "ct" : "e928622d1e6e798d8665ae732c4c1e5f",
+          "tag" : "33ab476757ffa42c0f6c276391a46eac",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "",
+          "key" : "a8ee11b26d7ceb7f17eaa1e4b83a2cf6",
+          "iv" : "fbbc04fd6e025b7193eb57f6",
+          "aad" : "",
+          "msg" : "c08f085e6a9e0ef3636280c11ecfadf0c1e72919ffc17eaf",
+          "ct" : "efd299a43b25ce8cc31b80e5489ef9ce7356ececa91bc7bd",
+          "tag" : "3c33fc0bcd256b0a8a34ecc8b01e52a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "",
+          "key" : "1655bf662f7ee685615701fd3779d628",
+          "iv" : "42b51388f6f9047a2a994575",
+          "aad" : "",
+          "msg" : "857b2f6cd608c9cea0246c740caa4ca19c5f1c7d71cb9273f0d8c8bb65b70a",
+          "ct" : "356bca9cddd39efd393278e43b4e80266071608036e81d6e924d4e4800fb27",
+          "tag" : "71f02ba7c6cf3a579e56245025420071",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "",
+          "key" : "42e38abef2dd7573248c5aefb3ecca54",
+          "iv" : "064b3cfbe04d94d4d5c19b30",
+          "aad" : "",
+          "msg" : "2c763b9ec84903bcbb8aec15e678a3a955e4870edbf62d9d3c81c4f9ed6154877875779ca33cce8f73a55ca7af1d8d817fc6baac00ef962c5a0da339ce81427a3d59",
+          "ct" : "9d911b934a68ce7db322410028bd31bd81bcbdadf26f15676be472bc3821fb68e4728db76930bc0958aeed6faf3e333da7af3d48c480b424ff3d6600cc56a507c8ad",
+          "tag" : "d679eb9e5d744b62d91dcf6fb6284f41",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 61,
+          "comment" : "",
+          "key" : "5019eb9fef82e5750b631758f0213e3e5fcca12748b40eb4",
+          "iv" : "ff0ddb0a0d7b36d219da12b5",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "bce273d0e68112371745e665ececa823",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "",
+          "key" : "21218af790428f8024d3e7e1428c9fcf578c216636d60e73",
+          "iv" : "34047bc39b9c608384dff5b8",
+          "aad" : "",
+          "msg" : "e3",
+          "ct" : "a3",
+          "tag" : "54a0b780af21eb4714feeecfafbb2226",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "",
+          "key" : "3a8bf543c480925632118245bcbf5d01522b987a31a33da3",
+          "iv" : "4ebc13cf4636cc7c45e560a7",
+          "aad" : "",
+          "msg" : "53fc72e71b59eeb3",
+          "ct" : "58a3891bbda8d0ed",
+          "tag" : "af4e86d045c2397ee273fe9d3a324656",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "",
+          "key" : "bcb6bc5ee6743df1396a34639327b25809ec9c81dd6a0c0e",
+          "iv" : "be0326d23bdc2c64648d13f4",
+          "aad" : "",
+          "msg" : "80474a3a3b809560eee2ce7a7a33ea07",
+          "ct" : "586e1aa844e2fa3749e44a0aa4cb745d",
+          "tag" : "96f41c15cddf13c4032cfdaccf1c414a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "",
+          "key" : "7f672d85e151aa490bc0eec8f66b5e5bee74af11642be3ff",
+          "iv" : "b022067048505b20946216ef",
+          "aad" : "",
+          "msg" : "ef6412c72b03c643fa02565a0ae2378a9311c11a84065f80",
+          "ct" : "e271d068193af63e3c604659ad0268525f78dcb8a67b0c22",
+          "tag" : "e345fba42d860b1c1886d0cc4c5db134",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "",
+          "key" : "f7ace6c3c10c3ff977febe7dc882b8e779ef3a17ef9324a8",
+          "iv" : "6e2ba2833c5dce6becc4f6d8",
+          "aad" : "",
+          "msg" : "2e11e41951c20460c768b0d71ad56e77bec05e0478f99d5b62e799f732e467",
+          "ct" : "282317a4b3dab218ab8a691d20b3849f90eed541fd28c0d575b5dc767e8fb4",
+          "tag" : "33d8ec06ea9751eb0ac4f8a08bbde648",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "",
+          "key" : "239195b58668eb89636b1ec2b331336946369fc6c87b8849",
+          "iv" : "14a6281a43b4eb056a67b9e6",
+          "aad" : "",
+          "msg" : "39d873d4cad71cb252784bd14648a494ceb517eb9e3e6f32d19bd18dfaf877c7aec22103d242993ed7bab123326110dfdb7229143a0c601e16aa4ecdde808cd83bb2",
+          "ct" : "e8325d16185109f5ebde020dd4219a5c1554ee83a82c60ae3d2a018e795730ed8ef404d8ba4aba95cc8fa6e435bf8ec9e405b3525dfd66c2be91812f0008c02fceed",
+          "tag" : "72418f7d6c3770d603f5762d666af049",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 68,
+          "comment" : "",
+          "key" : "80ba3192c803ce965ea371d5ff073cf0f43b6a2ab576b208426e11409c09b9b0",
+          "iv" : "4da5bf8dfd5852c1ea12379d",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "4d293af9a8fe4ac034f14b14334c16ae",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "",
+          "key" : "cc56b680552eb75008f5484b4cb803fa5063ebd6eab91f6ab6aef4916a766273",
+          "iv" : "99e23ec48985bccdeeab60f1",
+          "aad" : "",
+          "msg" : "2a",
+          "ct" : "8c",
+          "tag" : "c460d5ff45235c3c2491c7e6a32491d6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "",
+          "key" : "51e4bf2bad92b7aff1a4bc05550ba81df4b96fabf41c12c7b00e60e48db7e152",
+          "iv" : "4f07afedfdc3b6c2361823d3",
+          "aad" : "",
+          "msg" : "be3308f72a2c6aed",
+          "ct" : "6038296421fb5007",
+          "tag" : "0a91c72219c0b9ad716accd910e04e13",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "",
+          "key" : "59d4eafb4de0cfc7d3db99a8f54b15d7b39f0acc8da69763b019c1699f87674a",
+          "iv" : "2fcb1b38a99e71b84740ad9b",
+          "aad" : "",
+          "msg" : "549b365af913f3b081131ccb6b825588",
+          "ct" : "c4066e265a948f40e05e37fa400fde1b",
+          "tag" : "611de27128955c54edd7a4d6d23e78ee",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "",
+          "key" : "0212a8de5007ed87b33f1a7090b6114f9e08cefd9607f2c276bdcfdbc5ce9cd7",
+          "iv" : "e6b1adf2fd58a8762c65f31b",
+          "aad" : "",
+          "msg" : "10f1ecf9c60584665d9ae5efe279e7f7377eea6916d2b111",
+          "ct" : "f64ffe52cd838cea89dd500662a2ee4b4b450eee68218e84",
+          "tag" : "ae1e2eda96bed82182240aae08f9fe9c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "",
+          "key" : "2eb51c469aa8eb9e6c54a8349bae50a20f0e382711bba1152c424f03b6671d71",
+          "iv" : "04a9be03508a5f31371a6fd2",
+          "aad" : "",
+          "msg" : "b053999286a2824f42cc8c203ab24e2c97a685adcc2ad32662558e55a5c729",
+          "ct" : "01f09a6a136909c158e13502ee5488f592ee24059d6da734acba8c11e9815f",
+          "tag" : "79e57b518fa6dabe94e0e89cae89976b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "",
+          "key" : "95e87eda64d0dc2d4e851030c3e1b27cca2265b3464c2c572bd8fc8cfb282d1b",
+          "iv" : "ce03bbb56778f25d4528350b",
+          "aad" : "",
+          "msg" : "2e5acc19acb9940bb74d414b45e71386a409b641490b139493d7d632cbf1674fdf2511c3fad6c27359e6137b4cd52efc4bf871e6623451517d6a3c68240f2a79916a",
+          "ct" : "72356ce9f1822e30809817a3b91ea13700ab3275b6f3718a845ad0b132bf4bbbb61ee466c1b0a1cb5a26424dbcc8d1b649f22785907a9c0164a2a41a9fc477d6c4dd",
+          "tag" : "872861d71412e15732f60a83d4b47ee1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 128,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 75,
+          "comment" : "",
+          "key" : "fae2a14197c7d1140061fe7c3d11d9f77c79562e3593a99b",
+          "iv" : "bc28433953772d57bbd933100cd47a56",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "b8c26823cb288d2ddc93ea1f3c91248b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "",
+          "key" : "cee9abbc26b63e169f0ced621fe21d95904e75b881d93e6b",
+          "iv" : "1e8259e0a43e571068f701cd2064fc0c",
+          "aad" : "",
+          "msg" : "46",
+          "ct" : "1d",
+          "tag" : "902249b563e6a8a63bb3bb6ee7696951",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "",
+          "key" : "189f0bd390ba40632586a45c39735c2b87113329c800f394",
+          "iv" : "c84442d6975f0359737de0fa828f958e",
+          "aad" : "",
+          "msg" : "b4bcd7b8eeca3050dd17682c6a914e",
+          "ct" : "89071306b9c39befaf1b76b5bcaeb8",
+          "tag" : "76feba04f1fbe3d564728b07184e0911",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "",
+          "key" : "2bc95c03e9c5b4b95e30fb597f7ea6dd1e8eaa68940da236",
+          "iv" : "a2357e33ef9992be34144d2e7e043275",
+          "aad" : "",
+          "msg" : "3aa230f4526b82ff6ebc0b3b54e61016ad459ca86899",
+          "ct" : "a4d87792b61883322716b345f9c29b5a12a10441d5e4",
+          "tag" : "1cda87ea66dfc34a8d2558c001992863",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "",
+          "key" : "2ac418c329bce760b9928bb3d9e3171e4b95a9490bff0563",
+          "iv" : "e9b33cbe2cf00e3df7a9757c26887236",
+          "aad" : "6293808cc471bfac",
+          "msg" : "230e0d77a23c35be592aa6c612ebfe8c",
+          "ct" : "3998fa4f34537f4f1af95cea04832254",
+          "tag" : "bef5f02f0272e26effeefca831d33d0b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "",
+          "key" : "bfe0945395ca57a1c2368f56bb6054755f1f16e6d6dce5dc",
+          "iv" : "ea8bc8bde29e057ebaa67e3516295d22",
+          "aad" : "922dc6f1ed0da9d25500a0b7157a10",
+          "msg" : "212b0b1f685300651eb43b2ec0779126",
+          "ct" : "7342838539ec975f2b4e3cf9a08c860e",
+          "tag" : "1ab9c92a3a2b2c0c7996c8a25738959c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "",
+          "key" : "b08b98d7b077662a1f6224ba91c22b95b13d0a75e54d609c",
+          "iv" : "6900b2667811f60b1170542b6d44b913",
+          "aad" : "0f1a3473ff20352972b395a2dec89d1a",
+          "msg" : "28ccf9f4f3cb429f75144275b907d19d",
+          "ct" : "b9143fec99d73850ca15adc7313dc00c",
+          "tag" : "28dee7cedb311961f868697c91ef0729",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "",
+          "key" : "a90bd7b87c03803fe77291483954578c07849fb273a52243",
+          "iv" : "0c300db1fbf94c6ae9a36e5ae4bbb906",
+          "aad" : "8cdec329f05a3e2964ea9426430dfe40ce7f40a6fc429b33",
+          "msg" : "644b8ee3162e81b0d59792d3386cc30c",
+          "ct" : "e286ad3f23d2d5742b043ba2c18a73d1",
+          "tag" : "9252f1b2ea6946fa42b2e86cc7bd5114",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "99c338570bb58a2ca8f3ecaba85e9a22",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "9ac338570bb58a2ca8f3ecaba85e9a22",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "18c338570bb58a2ca8f3ecaba85e9a22",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "98c238570bb58a2ca8f3ecaba85e9a22",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "98c338d70bb58a2ca8f3ecaba85e9a22",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "98c338570ab58a2ca8f3ecaba85e9a22",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "98c3385709b58a2ca8f3ecaba85e9a22",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "98c338570bb58aaca8f3ecaba85e9a22",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "98c338570bb58a2ca9f3ecaba85e9a22",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "98c338570bb58a2c28f3ecaba85e9a22",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "98c338570bb58a2ca8d3ecaba85e9a22",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "98c338570bb58a2ca8f3edaba85e9a22",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "98c338570bb58a2ca8f3ecaba95e9a22",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "98c338570bb58a2ca8f3ecabaa5e9a22",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "98c338570bb58a2ca8f3ecab285e9a22",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "98c338570bb58a2ca8f3ecaba85e9a23",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "98c338570bb58a2ca8f3ecaba85e9a20",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "98c338570bb58a2ca8f3ecaba85e9a62",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "98c338570bb58a2ca8f3ecaba85e9aa2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "99c338570bb58a2ca9f3ecaba85e9a22",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "98c338d70bb58aaca8f3ecaba85e9a22",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "98c338570bb58aaca8f3ecaba85e9aa2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "673cc7a8f44a75d3570c135457a165dd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "1843b8d78b350aac28736c2b28de1aa2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "8bec36e347b5df50a5fb5c6b25189fdc",
+          "tag" : "99c239560ab48b2da9f2edaaa95f9b23",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 128,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 110,
+          "comment" : "",
+          "key" : "b4cd11db0b3e0b9b34eafd9fe027746976379155e76116afde1b96d21298e34f",
+          "iv" : "00c49f4ebb07393f07ebc3825f7b0830",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "80d821cde2d6c523b718597b11dd0fa8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "",
+          "key" : "b7797eb0c1a6089ad5452d81fdb14828c040ddc4589c32b565aad8cb4de3e4a0",
+          "iv" : "0ad570d8863918fe89124e09d125a271",
+          "aad" : "",
+          "msg" : "ed",
+          "ct" : "25",
+          "tag" : "4fef9ec45255dbba5631105d00a55767",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "",
+          "key" : "4c010d9561c7234c308c01cea3040c925a9f324dc958ff904ae39b37e60e1e03",
+          "iv" : "2a55caa137c5b0b66cf3809eb8f730c4",
+          "aad" : "",
+          "msg" : "2a093c9ed72b8ff4994201e9f9e010",
+          "ct" : "cbfcaa3634d6cff5656bc6bda6ab5f",
+          "tag" : "0144be0643b036a8147e19f4ea9e7af2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "",
+          "key" : "2f6cfb7a215a7bafb607c273f7e66f9a6d51d57f9c29422ec64699bad0c6f33b",
+          "iv" : "21cbeff0b123799da74f4daff2e279c5",
+          "aad" : "",
+          "msg" : "39dbc71f6838ed6c6e582137436e1c61bbbfb80531f4",
+          "ct" : "f531097aa1bb35d9f401d459340afbd27f9bdf72c537",
+          "tag" : "e4e18170dce4e1af90b15eae64355331",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "",
+          "key" : "7517c973a9de3614431e3198f4ddc0f8dc33862654649e9ff7838635bb278231",
+          "iv" : "42f82085c08afd5b19a9491a79cd8119",
+          "aad" : "e9ee894ad5b0781d",
+          "msg" : "d17fbed25ad5f72477580b9e82a7b883",
+          "ct" : "0b70b24253b2e1c3ef1165925b5c5e57",
+          "tag" : "45009a2a101877ed70e58f2e5910004f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "",
+          "key" : "9f5c60fb5df5cf2b1b39254c3fa80e51d30d64e344b3aba59574305b4d2212ad",
+          "iv" : "d4df79c69f73b26a13598af07eed6a77",
+          "aad" : "813399ff1e1ef0b58bb2be130ce5d4",
+          "msg" : "a3ca2ef9bd1fdbaa83db4c7eae6de94e",
+          "ct" : "65019212ccbbd4cd2f995cc59d46fd27",
+          "tag" : "4026c486430a1ae2a5fc4081cd665468",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "",
+          "key" : "38f3d880ed6cd605f2eab88027c9a1c21d13e3de1af50ac884723bcf2b70f495",
+          "iv" : "7078c9239650b8a1a8cf031d460e51c1",
+          "aad" : "d1544013b885a7083abece9e31d98ebc",
+          "msg" : "52609620d7f572aa9267565e459ae419",
+          "ct" : "91b9f4424b68b4af839ce553d10b7dbc",
+          "tag" : "0541b1a518f4bb585a594f3eab5535c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "",
+          "key" : "ec88cec13d8ebae7d62f60197e5486d61c33ee5a50b19f197c1348fbc9e27e8e",
+          "iv" : "1ec1d18c96ca6cad66690e60b91cf222",
+          "aad" : "d28d5811d4168a08da54b97831b59200041adb0e2891ea91",
+          "msg" : "658c6c7d8ea64a48375d69d9a405095a",
+          "ct" : "e42b53912ce21a3ee7a1fb51194d6fe3",
+          "tag" : "2bc8cc7f42cac1a121fd9ddff4f2073c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e976fdd461c0a0a49971db8d9678acb8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "ea76fdd461c0a0a49971db8d9678acb8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "6876fdd461c0a0a49971db8d9678acb8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e877fdd461c0a0a49971db8d9678acb8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e876fd5461c0a0a49971db8d9678acb8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e876fdd460c0a0a49971db8d9678acb8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e876fdd463c0a0a49971db8d9678acb8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e876fdd461c0a0249971db8d9678acb8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e876fdd461c0a0a49871db8d9678acb8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e876fdd461c0a0a41971db8d9678acb8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e876fdd461c0a0a49951db8d9678acb8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e876fdd461c0a0a49971da8d9678acb8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e876fdd461c0a0a49971db8d9778acb8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e876fdd461c0a0a49971db8d9478acb8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e876fdd461c0a0a49971db8d1678acb8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e876fdd461c0a0a49971db8d9678acb9",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e876fdd461c0a0a49971db8d9678acba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e876fdd461c0a0a49971db8d9678acf8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e876fdd461c0a0a49971db8d9678ac38",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e976fdd461c0a0a49871db8d9678acb8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e876fd5461c0a0249971db8d9678acb8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e876fdd461c0a0249971db8d9678ac38",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "1789022b9e3f5f5b668e247269875347",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "68f67d54e140202419f15b0d16f82c38",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b5c5d5e5f",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "059e01599f94b38f2435b47a0c7b5c59",
+          "tag" : "e977fcd560c1a1a59870da8c9779adb9",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 160,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 145,
+          "comment" : "large IV size",
+          "key" : "7edabee31897bf9b29394aeca84c4dcc",
+          "iv" : "ef4886c4fe8b26f045e09ac925ccbbad42d70347",
+          "aad" : "",
+          "msg" : "52583c7b11de051c2e5c2114ee20527b",
+          "ct" : "298e86436ead703a38f869690f020d4c",
+          "tag" : "f20d2f2d170ebbe1d0ec718eefe632e4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 256,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 146,
+          "comment" : "large IV size",
+          "key" : "e071a62bcde9ee648118ed3b1c629c20",
+          "iv" : "f23a924d75c57fee8e75defd97be48e8cf3202cd658add0a4f50b24b5af9f013",
+          "aad" : "",
+          "msg" : "a0650c4299cf63ec5e28104e9064247f",
+          "ct" : "487e94228d338acee8e9f5c07e22fb06",
+          "tag" : "72c99b644664378c88fd1f4ecfd80f76",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 160,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 147,
+          "comment" : "large IV size",
+          "key" : "f9aced074bde719edba80bc8ad475f7ebd3ba6e98a4c0f96",
+          "iv" : "d6b33e2be9eeb8bcb33f1291c728699276781f29",
+          "aad" : "",
+          "msg" : "4487fc05e84d49e94d38b733ce063a75",
+          "ct" : "3ac1c21a7d7d60973c6c12d58c59ec1e",
+          "tag" : "3ff9167a5afb0bb09fc5c10136a6d37c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 256,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 148,
+          "comment" : "large IV size",
+          "key" : "94ffb2d57189012cbbe314e4e36dec0dd9e2b9c88b53bbae",
+          "iv" : "4683f07aafca7f952acedc57c45315307593f52a7b405bf2ebcd19d18098ac04",
+          "aad" : "",
+          "msg" : "10e1e492691ebb658324f1982168073e",
+          "ct" : "199f609949240ce2a65bf1b492f17afe",
+          "tag" : "7cd958a59d5706b396d219a2936be571",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 160,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 149,
+          "comment" : "large IV size",
+          "key" : "1739fd2876258457e3e4c323dbabd85edda8ecad83a7496d8feb0b88aeab2e74",
+          "iv" : "989f015e6ab79d5e43eca8364a38c9f6b381dda1",
+          "aad" : "",
+          "msg" : "d1b13ceacedad362851dc876d8b1dd20",
+          "ct" : "5cceb0253bcbd6800d3b316af3a56937",
+          "tag" : "15186910a0f2a2bc41d32e7fe687f17c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 256,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 150,
+          "comment" : "large IV size",
+          "key" : "aa5429fd3f178b3885f2c696975e88890102455b5d9e42766429e80d4889672a",
+          "iv" : "e1ed38af5753851b79175e4ae11fd6cf80033f81aec484ecd0448c5e7cc0a27e",
+          "aad" : "",
+          "msg" : "7aa8919ebb950f34690acb98651854cb",
+          "ct" : "1a288496f909036b35f3604b3ecd3493",
+          "tag" : "62eb49550cbee8c3cf88302c826690a2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 32,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 151,
+          "comment" : "small IV size",
+          "key" : "d83c1d7a97c43f182409a4aa5609c1b1",
+          "iv" : "7b5faeb2",
+          "aad" : "",
+          "msg" : "c8f07ba1d65554a9bd40390c30c5529c",
+          "ct" : "d324ca1530c68ed86c775ed9bb1d8490",
+          "tag" : "30062eb9cedbaddf36f93e4219620afa",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 64,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 152,
+          "comment" : "small IV size",
+          "key" : "deb62233559b57476602b5adac57c77f",
+          "iv" : "d084547de55bbc15",
+          "aad" : "",
+          "msg" : "d8986df0241ed3297582c0c239c724cb",
+          "ct" : "3064cf4883703f170bf01e6c2d67259f",
+          "tag" : "09471c09f897d46216fbb52436e3c4fc",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 32,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 153,
+          "comment" : "small IV size",
+          "key" : "834d0bb601170865a78139428a1503695a6a291ebd747cd1",
+          "iv" : "bb9d2aa3",
+          "aad" : "",
+          "msg" : "6f79e18b4acd5a03d3a5f7e1a8d0f183",
+          "ct" : "bc3c8eb10b6cfa8fa1758ce9358753fe",
+          "tag" : "db1ae0ef0315046b5358bff4629880c5",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 64,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 154,
+          "comment" : "small IV size",
+          "key" : "0b177198c8b419bf74acc3bc65b5fb3d09a915ff71add754",
+          "iv" : "8f075cbcda9831c3",
+          "aad" : "",
+          "msg" : "c4b1e05ca3d591f9543e64de3fc682ac",
+          "ct" : "33ca3171ec118e72cc29950f6c129227",
+          "tag" : "737967a2501f14ce84d9981c89be1785",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 32,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 155,
+          "comment" : "small IV size",
+          "key" : "093eb12343537ee8e91c1f715b862603f8daf9d4e1d7d67212a9d68e5aac9358",
+          "iv" : "5110604c",
+          "aad" : "",
+          "msg" : "33efb58c91e8c70271870ec00fe2e202",
+          "ct" : "5aca28621e2bd92d7f182ff653b1e8eb",
+          "tag" : "8a89a0db74a55f907f8ba115e2e15853",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 64,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 156,
+          "comment" : "small IV size",
+          "key" : "115884f693b155563e9bfb3b07cacb2f7f7caa9bfe51f89e23feb5a9468bfdd0",
+          "iv" : "04102199ef21e1df",
+          "aad" : "",
+          "msg" : "82e3e604d2be8fcab74f638d1e70f24c",
+          "ct" : "df32c13a2278326a3c966dee321a42f6",
+          "tag" : "b1798b8e4b95df6c620a5cbcbe1238d1",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 0,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 157,
+          "comment" : "IV size = 0",
+          "key" : "8f3f52e3c75c58f5cb261f518f4ad30a",
+          "iv" : "",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "5adbeefc8fa9cae2b9a6db3f5f6c82e9",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 158,
+          "comment" : "IV size = 0",
+          "key" : "2a4bf90e56b70fdd8649d775c089de3b",
+          "iv" : "",
+          "aad" : "",
+          "msg" : "324ced6cd15ecc5b3741541e22c18ad9",
+          "ct" : "73b4716f7e44f3bb22a2648069ebbc1e",
+          "tag" : "3f6ac9672db499324ead0c234b544054",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 0,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 159,
+          "comment" : "IV size = 0",
+          "key" : "0b18d21337035c7baa08211b702fa780ac7c09be8f9ed11f",
+          "iv" : "",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "1bd7ab03a24e07b57f9d173c8e6d57a1",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 160,
+          "comment" : "IV size = 0",
+          "key" : "ba76d594a6df915bb7ab7e6d1a8d024b2796336c1b8328a9",
+          "iv" : "",
+          "aad" : "",
+          "msg" : "d62f302742d61d823ea991b93430d589",
+          "ct" : "87ac7db89a1f4bf772534003ad82d75d",
+          "tag" : "b6974b88fb44fabe8c10c693f788a068",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 0,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 161,
+          "comment" : "IV size = 0",
+          "key" : "3f8ca47b9a940582644e8ecf9c2d44e8138377a8379c5c11aafe7fec19856cf1",
+          "iv" : "",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "b17f6100882e6b419d9fed0c8b7c8d9a",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 162,
+          "comment" : "IV size = 0",
+          "key" : "7660d10966c6503903a552dde2a809ede9da490e5e5cc3e349da999671809883",
+          "iv" : "",
+          "aad" : "",
+          "msg" : "c314235341debfafa1526bb61044a7f1",
+          "ct" : "8187621069d3c07b7861bb40e8a56b3a",
+          "tag" : "c1f0897558300e979ba29b36336a0d06",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/aes_gcm_siv_test.json b/third_party/wycheproof/testvectors/aes_gcm_siv_test.json
new file mode 100644
index 0000000..851fec8
--- /dev/null
+++ b/third_party/wycheproof/testvectors/aes_gcm_siv_test.json
@@ -0,0 +1,1763 @@
+{
+  "algorithm" : "AES-GCM",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "ConstructedIv" : "The counter for AES-GCM-SIV is reduced modulo 2**32. This test vector was constructed to test for correct wrapping of the counter."
+  },
+  "numberOfTests" : 143,
+  "header" : [],
+  "testGroups" : [
+    {
+      "ivSize" : 96,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "01000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "dc20e2d83f25705bb49e439eca56de25",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "01000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "",
+          "msg" : "0100000000000000",
+          "ct" : "b5d839330ac7b786",
+          "tag" : "578782fff6013b815b287c22493a364c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "01000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "",
+          "msg" : "010000000000000000000000",
+          "ct" : "7323ea61d05932260047d942",
+          "tag" : "a4978db357391a0bc4fdec8b0d106639",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "01000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "",
+          "msg" : "01000000000000000000000000000000",
+          "ct" : "743f7c8077ab25f8624e2e948579cf77",
+          "tag" : "303aaf90f6fe21199c6068577437a0c4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "01000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "",
+          "msg" : "0100000000000000000000000000000002000000000000000000000000000000",
+          "ct" : "84e07e62ba83a6585417245d7ec413a9fe427d6315c09b57ce45f2e3936a9445",
+          "tag" : "1a8e45dcd4578c667cd86847bf6155ff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "01000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "",
+          "msg" : "010000000000000000000000000000000200000000000000000000000000000003000000000000000000000000000000",
+          "ct" : "3fd24ce1f5a67b75bf2351f181a475c7b800a5b4d3dcf70106b1eea82fa1d64df42bf7226122fa92e17a40eeaac1201b",
+          "tag" : "5e6e311dbf395d35b0fe39c2714388f8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "01000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "",
+          "msg" : "01000000000000000000000000000000020000000000000000000000000000000300000000000000000000000000000004000000000000000000000000000000",
+          "ct" : "2433668f1058190f6d43e360f4f35cd8e475127cfca7028ea8ab5c20f7ab2af02516a2bdcbc08d521be37ff28c152bba36697f25b4cd169c6590d1dd39566d3f",
+          "tag" : "8a263dd317aa88d56bdf3936dba75bb8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "01000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "01",
+          "msg" : "0200000000000000",
+          "ct" : "1e6daba35669f427",
+          "tag" : "3b0a1a2560969cdf790d99759abd1508",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "01000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "01",
+          "msg" : "020000000000000000000000",
+          "ct" : "296c7889fd99f41917f44620",
+          "tag" : "08299c5102745aaa3a0c469fad9e075a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "01000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "01",
+          "msg" : "02000000000000000000000000000000",
+          "ct" : "e2b0c5da79a901c1745f700525cb335b",
+          "tag" : "8f8936ec039e4e4bb97ebd8c4457441f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "01000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "01",
+          "msg" : "0200000000000000000000000000000003000000000000000000000000000000",
+          "ct" : "620048ef3c1e73e57e02bb8562c416a319e73e4caac8e96a1ecb2933145a1d71",
+          "tag" : "e6af6a7f87287da059a71684ed3498e1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "01000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "01",
+          "msg" : "020000000000000000000000000000000300000000000000000000000000000004000000000000000000000000000000",
+          "ct" : "50c8303ea93925d64090d07bd109dfd9515a5a33431019c17d93465999a8b0053201d723120a8562b838cdff25bf9d1e",
+          "tag" : "6a8cc3865f76897c2e4b245cf31c51f2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "01000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "01",
+          "msg" : "02000000000000000000000000000000030000000000000000000000000000000400000000000000000000000000000005000000000000000000000000000000",
+          "ct" : "2f5c64059db55ee0fb847ed513003746aca4e61c711b5de2e7a77ffd02da42feec601910d3467bb8b36ebbaebce5fba30d36c95f48a3e7980f0e7ac299332a80",
+          "tag" : "cdc46ae475563de037001ef84ae21744",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "01000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "010000000000000000000000",
+          "msg" : "02000000",
+          "ct" : "a8fe3e87",
+          "tag" : "07eb1f84fb28f8cb73de8e99e2f48a14",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "01000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "010000000000000000000000000000000200",
+          "msg" : "0300000000000000000000000000000004000000",
+          "ct" : "6bb0fecf5ded9b77f902c7d5da236a4391dd0297",
+          "tag" : "24afc9805e976f451e6d87f6fe106514",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "01000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "0100000000000000000000000000000002000000",
+          "msg" : "030000000000000000000000000000000400",
+          "ct" : "44d0aaf6fb2f1f34add5e8064e83e12a2ada",
+          "tag" : "bff9b2ef00fb47920cc72a0c0f13b9fd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "e66021d5eb8e4f4066d4adb9c33560e4",
+          "iv" : "f46e44bb3da0015c94f70887",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a4194b79071b01a87d65f706e3949578",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "36864200e0eaf5284d884a0e77d31646",
+          "iv" : "bae8e37fc83441b16034566b",
+          "aad" : "46bb91c3c5",
+          "msg" : "7a806c",
+          "ct" : "af60eb",
+          "tag" : "711bd85bc1e4d3e0a462e074eea428a8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "aedb64a6c590bc84d1a5e269e4b47801",
+          "iv" : "afc0577e34699b9e671fdd4f",
+          "aad" : "fc880c94a95198874296",
+          "msg" : "bdc66f146545",
+          "ct" : "bb93a3e34d3c",
+          "tag" : "d6a9c45545cfc11f03ad743dba20f966",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "d5cc1fd161320b6920ce07787f86743b",
+          "iv" : "275d1ab32f6d1f0434d8848c",
+          "aad" : "046787f3ea22c127aaf195d1894728",
+          "msg" : "1177441f195495860f",
+          "ct" : "4f37281f7ad12949d0",
+          "tag" : "1d02fd0cd174c84fc5dae2f60f52fd2b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "b3fed1473c528b8426a582995929a149",
+          "iv" : "9e9ad8780c8d63d0ab4149c0",
+          "aad" : "c9882e5386fd9f92ec489c8fde2be2cf97e74e93",
+          "msg" : "9f572c614b4745914474e7c7",
+          "ct" : "f54673c5ddf710c745641c8b",
+          "tag" : "c1dc2f871fb7561da1286e655e24b7b0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "2d4ed87da44102952ef94b02b805249b",
+          "iv" : "ac80e6f61455bfac8308a2d4",
+          "aad" : "2950a70d5a1db2316fd568378da107b52b0da55210cc1c1b0a",
+          "msg" : "0d8c8451178082355c9e940fea2f58",
+          "ct" : "c9ff545e07b88a015f05b274540aa1",
+          "tag" : "83b3449b9f39552de99dc214a1190b0b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "bde3b2f204d1e9f8b06bc47f9745b3d1",
+          "iv" : "ae06556fb6aa7890bebc18fe",
+          "aad" : "1860f762ebfbd08284e421702de0de18baa9c9596291b08466f37de21c7f",
+          "msg" : "6b3db4da3d57aa94842b9803a96e07fb6de7",
+          "ct" : "6298b296e24e8cc35dce0bed484b7f30d580",
+          "tag" : "3e377094f04709f64d7b985310a4db84",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "f901cfe8a69615a93fdf7a98cad48179",
+          "iv" : "6245709fb18853f68d833640",
+          "aad" : "7576f7028ec6eb5ea7e298342a94d4b202b370ef9768ec6561c4fe6b7e7296fa859c21",
+          "msg" : "e42a3c02c25b64869e146d7b233987bddfc240871d",
+          "ct" : "391cc328d484a4f46406181bcd62efd9b3ee197d05",
+          "tag" : "2d15506c84a9edd65e13e9d24a2a6e70",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "",
+          "key" : "bedcfb5a011ebc84600fcb296c15af0d",
+          "iv" : "438a547a94ea88dce46c6c85",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "596d0538e48526be1c991e40cc031073",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "",
+          "key" : "384ea416ac3c2f51a76e7d8226346d4e",
+          "iv" : "b30c084727ad1c592ac21d12",
+          "aad" : "",
+          "msg" : "35",
+          "ct" : "4f",
+          "tag" : "8b2b805fc0885e2b470d9dbe6cb15ed3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "",
+          "key" : "cae31cd9f55526eb038241fc44cac1e5",
+          "iv" : "b5e006ded553110e6dc56529",
+          "aad" : "",
+          "msg" : "d10989f2c52e94ad",
+          "ct" : "04c7a55f97846e54",
+          "tag" : "48168ff846356c33032c719b518f18a8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "",
+          "key" : "dd6197cd63c963919cf0c273ef6b28bf",
+          "iv" : "ecb0c42f7000ef0e6f95f24d",
+          "aad" : "",
+          "msg" : "4dcc1485365866e25ac3f2ca6aba97",
+          "ct" : "fd9521041b0397a15b0070b93f48a9",
+          "tag" : "09df91414578f7faf757d04ee26ab901",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "",
+          "key" : "ffdf4228361ea1f8165852136b3480f7",
+          "iv" : "0e1666f2dc652f7708fb8f0d",
+          "aad" : "",
+          "msg" : "25b12e28ac0ef6ead0226a3b2288c800",
+          "ct" : "6eb905287ddfafc32f6b1c10046c089f",
+          "tag" : "4ff9f939a77c34b0cb1ee75fcb0dd29a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "",
+          "key" : "c15ed227dd2e237ecd087eaaaad19ea4",
+          "iv" : "965ff6643116ac1443a2dec7",
+          "aad" : "",
+          "msg" : "fee62fde973fe025ad6b322dcdf3c63fc7",
+          "ct" : "6f62bd09d4f36f73e289ab6dd114727fe3",
+          "tag" : "ea727c084db2bc948de0928edddd7fcf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "",
+          "key" : "a8ee11b26d7ceb7f17eaa1e4b83a2cf6",
+          "iv" : "fbbc04fd6e025b7193eb57f6",
+          "aad" : "",
+          "msg" : "c08f085e6a9e0ef3636280c11ecfadf0c1e72919ffc17eaf",
+          "ct" : "80133a4bea7311f0d3c9835144c37c4ef0ef20c8f2e36be1",
+          "tag" : "b92f47c1af6713e14fbdf60efebb50c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "",
+          "key" : "7519588f30f7f08ff98e1beee6a2a783",
+          "iv" : "a2dbe708db51c68ef02994a6",
+          "aad" : "",
+          "msg" : "1851956319256ebb0f9ccaf325a24abfc5c3e90b055e57cdc0c7ab2165ae03b1",
+          "ct" : "778b308e4ca17607df36c0b94695bc64603173b814701a9f69147b42478a0b1f",
+          "tag" : "b75c98952c0aa11958a55c9c2ecf33f5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "",
+          "key" : "a5b5b6bae45b741fe4663890098f326a",
+          "iv" : "4bad10c6d84fd43fd13ad36f",
+          "aad" : "30",
+          "msg" : "127b150080ec0bc7704e26f4ab11abb6",
+          "ct" : "173ba6370171be47dbb6163a63a3b725",
+          "tag" : "53aefed6e971d5a1f435f0730a6dd0fd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "",
+          "key" : "0cecb9f512932d68e2c7c0bc4bd621c8",
+          "iv" : "2186a3091237adae83540e24",
+          "aad" : "743e",
+          "msg" : "437aeb94d842283ba57bb758e3d229f0",
+          "ct" : "959f0ff12481dedc4302ad7a904f9486",
+          "tag" : "0215be2ab9b0672a7b82893891057c9c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "",
+          "key" : "55e04c122780be52ed9328928039008c",
+          "iv" : "0c908e58cddad69dea1a32c3",
+          "aad" : "25591707c004f506f4b51e85e29f6a",
+          "msg" : "26eb70672eef03667b34cc7d0df05872",
+          "ct" : "8ae3a16a237f1358ac8cfeb5f4cc2818",
+          "tag" : "28f5aa8a34a9f7c01c17759d142b1bae",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "",
+          "key" : "5f0a1b5f8f8673d566ec7f54e7dca4f2",
+          "iv" : "c30968c967e53505621628db",
+          "aad" : "c07092d799dac2b4c05fbddd04743c34",
+          "msg" : "f6538476daf04524cf134309dd84e187",
+          "ct" : "d5220f6a49d1e4c10d38c77c8156ebd0",
+          "tag" : "80b50f526286dad22d40984636f0e9ce",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "",
+          "key" : "671a70e883fb0611dffd0b1dd9b8cca2",
+          "iv" : "a51c37f467893c1608e56274",
+          "aad" : "3ea12d80f40f34f812479d2ecc13d2d6df",
+          "msg" : "3baf3edf04dc0c97aae081cdeb08021d",
+          "ct" : "3e771b9376e1d1cde3d9b73349c958bc",
+          "tag" : "ebd3ea678a1e87839a4356584ea89bac",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "",
+          "key" : "63f03172505d90e94900125cb8a4b0dd",
+          "iv" : "52c20979cdaaade573dba650",
+          "aad" : "5189ea6f39b2a78c0202fdff146c5cc6bdc7491d4786f80c6c6aef65634c05da",
+          "msg" : "602c98997ee03fd11ce00e92de193977",
+          "ct" : "05b568a589d0a77a8ee9c6f06415c6b6",
+          "tag" : "91ba5089dffb7538199c441728d5f84a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "Testing for ctr overflow",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "010101010101010101010101",
+          "aad" : "395f4091b410c373073bcdc79e02d3af",
+          "msg" : "43488548d88e6f774bcd2d52c18fbcc933a4e9a9613ff3edbe959ec59522adc098b3133b8d17b9e9dad631ad33752c95",
+          "ct" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 40,
+          "comment" : "Testing for ctr overflow",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "616b2dff4d665e5f7ab890723dd981b1",
+          "msg" : "f012c6a7eb0e8af5bc45e015e7680a693dc709b95383f6a94babec1bc36e4be3cf4f55a31a94f11c6c3f90eed99682bc",
+          "ct" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 41,
+          "comment" : "Testing for ctr overflow",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "030303030303030303030303",
+          "aad" : "387a8997605fd04ae8951c4759087864",
+          "msg" : "71ceee58179d6fb968521e9594dbf98cc0040f6aa38fe873c32a9b122d6cbfd51aa4778b3f4f37be7348690d97e2468b",
+          "ct" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "tag" : "fefffffffefffffffefffffffeffffff",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 42,
+          "comment" : "Testing for ctr overflow",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "060606060606060606060606",
+          "aad" : "6783b0d5e9d8a2a7274065797097d1ae",
+          "msg" : "2e14f9e9a09ea204557367898a80dcad117af3666bea25762b70633a9f3614fbe631ba617c371fd5566d5e613496e69f",
+          "ct" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "tag" : "ffffff7f00112233445566778899aabb",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 43,
+          "comment" : "Testing for ctr overflow",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "010101010101010101010101",
+          "aad" : "2933810c146f4f7dd146dd43f35199c6",
+          "msg" : "27fac75879c9d87cd52a0793137ba792f6f145148158eb538f2081e09cd0315986a7025045ecbb2ca1bb18a17bfcd567",
+          "ct" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "tag" : "ffffffffffffff7f0011223344556677",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 44,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "27dd62060507dae87c4f93f391ba15f9",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "0987e35e40981a2730c1740c7201731f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "9ea3371e258288d5a01b15384e2c99ee",
+          "msg" : "03c0e39b77bd62d32568f4c86c90bfdb",
+          "ct" : "00000000000000000000000000000000",
+          "tag" : "13a1883272188b4c8d2727178198fe95",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "ce24e3ec0fe7b8550d621b71fdb5d0eb",
+          "msg" : "63995888995b338c",
+          "ct" : "0000000000000000",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "1471f354b359c235117febba854a823b",
+          "msg" : "03c0e39b77bd62d32568f4c86c90bfdb",
+          "ct" : "00000000000000000000000000000000",
+          "tag" : "13a1883272188b4c8d2727178198fe95",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "11f820294fc9d13f1895d2fb5509913b",
+          "msg" : "63995888995b338c",
+          "ct" : "0000000000000000",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "45e7257b814f09de44177b27b914822f",
+          "msg" : "03c0e39b77bd62d32568f4c86c90bfdb",
+          "ct" : "00000000000000000000000000000000",
+          "tag" : "13a1883272188b4c8d2727178198fe95",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "4c49780b5438c4a7ea9795b9856fdae1",
+          "msg" : "63995888995b338c",
+          "ct" : "0000000000000000",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "ecc2f2f4142837a34f9cd1fa030a5d7f",
+          "msg" : "0fed395814f1750a",
+          "ct" : "ffffffffffffffff",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "69c7f5605da8e0684990b087411f8cf5",
+          "msg" : "63995888995b338c",
+          "ct" : "0000000000000000",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "20b346be60e7e97588bf504ce707ce0b",
+          "msg" : "0fed395814f1750a",
+          "ct" : "ffffffffffffffff",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "19b298f3a061a73cb774da927ce11ca2",
+          "msg" : "63995888995b338c",
+          "ct" : "0000000000000000",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "bff8c631e61c18a050a523ad4a750a20",
+          "msg" : "0fed395814f1750a",
+          "ct" : "ffffffffffffffff",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "7b6171302b689c926852163e310f08d4",
+          "msg" : "03c0e39b77bd62d32568f4c86c90bfdb",
+          "ct" : "00000000000000000000000000000000",
+          "tag" : "13a1883272188b4c8d2727178198fe95",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "555036128fa18ecadd090cb772ac0bf3",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "0987e35e40981a2730c1740c7201731f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "a5b43b8e1dbb2bfbda1b625fee4064a7",
+          "msg" : "63995888995b338c",
+          "ct" : "0000000000000000",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "ae47cc5d7681dd480c23469c5519b647",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "0987e35e40981a2730c1740c7201731f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "d53dd677184702eaa660f1349195fc04",
+          "msg" : "03c0e39b77bd62d32568f4c86c90bfdb",
+          "ct" : "00000000000000000000000000000000",
+          "tag" : "13a1883272188b4c8d2727178198fe95",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "dc78584e4599dd4b2fb333db2f9ccb95",
+          "msg" : "0fed395814f1750a",
+          "ct" : "ffffffffffffffff",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "0bfd9271e79153a8afdb7f3d96fe446f",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "0987e35e40981a2730c1740c7201731f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "1e0537a95b7200134d0b440657d50fd1",
+          "msg" : "63995888995b338c",
+          "ct" : "0000000000000000",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "7633155df35857258d23b0651d60847c",
+          "msg" : "0fed395814f1750a",
+          "ct" : "ffffffffffffffff",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "ab0a064b473de43598adf81ee297d856",
+          "msg" : "0fed395814f1750a",
+          "ct" : "ffffffffffffffff",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "f62bdc3f4fcb699ee12f6e87dcc704cb",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "0987e35e40981a2730c1740c7201731f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "1320051031807b8f44e9d2cb1ec6aa92",
+          "msg" : "03c0e39b77bd62d32568f4c86c90bfdb",
+          "ct" : "00000000000000000000000000000000",
+          "tag" : "13a1883272188b4c8d2727178198fe95",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "329b813d3ae2225d3e15f97a28037bcc",
+          "msg" : "63995888995b338c",
+          "ct" : "0000000000000000",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "Flipped bit 0..127 in tag",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "edc723bedd0078696acdea005c74b841",
+          "msg" : "63995888995b338c",
+          "ct" : "0000000000000000",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 70,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "0100000000000000000000000000000000000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "07f5f4169bbf55a8400cd47ea6fd400f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "0100000000000000000000000000000000000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "",
+          "msg" : "0100000000000000",
+          "ct" : "c2ef328e5c71c83b",
+          "tag" : "843122130f7364b761e0b97427e3df28",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "0100000000000000000000000000000000000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "",
+          "msg" : "010000000000000000000000",
+          "ct" : "9aab2aeb3faa0a34aea8e2b1",
+          "tag" : "8ca50da9ae6559e48fd10f6e5c9ca17e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "0100000000000000000000000000000000000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "",
+          "msg" : "01000000000000000000000000000000",
+          "ct" : "85a01b63025ba19b7fd3ddfc033b3e76",
+          "tag" : "c9eac6fa700942702e90862383c6c366",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "0100000000000000000000000000000000000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "",
+          "msg" : "0100000000000000000000000000000002000000000000000000000000000000",
+          "ct" : "4a6a9db4c8c6549201b9edb53006cba821ec9cf850948a7c86c68ac7539d027f",
+          "tag" : "e819e63abcd020b006a976397632eb5d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "0100000000000000000000000000000000000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "",
+          "msg" : "010000000000000000000000000000000200000000000000000000000000000003000000000000000000000000000000",
+          "ct" : "c00d121893a9fa603f48ccc1ca3c57ce7499245ea0046db16c53c7c66fe717e39cf6c748837b61f6ee3adcee17534ed5",
+          "tag" : "790bc96880a99ba804bd12c0e6a22cc4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "0100000000000000000000000000000000000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "",
+          "msg" : "01000000000000000000000000000000020000000000000000000000000000000300000000000000000000000000000004000000000000000000000000000000",
+          "ct" : "c2d5160a1f8683834910acdafc41fbb1632d4a353e8b905ec9a5499ac34f96c7e1049eb080883891a4db8caaa1f99dd004d80487540735234e3744512c6f90ce",
+          "tag" : "112864c269fc0d9d88c61fa47e39aa08",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "0100000000000000000000000000000000000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "01",
+          "msg" : "0200000000000000",
+          "ct" : "1de22967237a8132",
+          "tag" : "91213f267e3b452f02d01ae33e4ec854",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "0100000000000000000000000000000000000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "01",
+          "msg" : "020000000000000000000000",
+          "ct" : "163d6f9cc1b346cd453a2e4c",
+          "tag" : "c1a4a19ae800941ccdc57cc8413c277f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "0100000000000000000000000000000000000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "01",
+          "msg" : "02000000000000000000000000000000",
+          "ct" : "c91545823cc24f17dbb0e9e807d5ec17",
+          "tag" : "b292d28ff61189e8e49f3875ef91aff7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "0100000000000000000000000000000000000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "01",
+          "msg" : "0200000000000000000000000000000003000000000000000000000000000000",
+          "ct" : "07dad364bfc2b9da89116d7bef6daaaf6f255510aa654f920ac81b94e8bad365",
+          "tag" : "aea1bad12702e1965604374aab96dbbc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "0100000000000000000000000000000000000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "01",
+          "msg" : "020000000000000000000000000000000300000000000000000000000000000004000000000000000000000000000000",
+          "ct" : "c67a1f0f567a5198aa1fcc8e3f21314336f7f51ca8b1af61feac35a86416fa47fbca3b5f749cdf564527f2314f42fe25",
+          "tag" : "03332742b228c647173616cfd44c54eb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "0100000000000000000000000000000000000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "01",
+          "msg" : "02000000000000000000000000000000030000000000000000000000000000000400000000000000000000000000000005000000000000000000000000000000",
+          "ct" : "67fd45e126bfb9a79930c43aad2d36967d3f0e4d217c1e551f59727870beefc98cb933a8fce9de887b1e40799988db1fc3f91880ed405b2dd298318858467c89",
+          "tag" : "5bde0285037c5de81e5b570a049b62a0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "0100000000000000000000000000000000000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "010000000000000000000000",
+          "msg" : "02000000",
+          "ct" : "22b3f4cd",
+          "tag" : "1835e517741dfddccfa07fa4661b74cf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "0100000000000000000000000000000000000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "010000000000000000000000000000000200",
+          "msg" : "0300000000000000000000000000000004000000",
+          "ct" : "43dd0163cdb48f9fe3212bf61b201976067f342b",
+          "tag" : "b879ad976d8242acc188ab59cabfe307",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "0100000000000000000000000000000000000000000000000000000000000000",
+          "iv" : "030000000000000000000000",
+          "aad" : "0100000000000000000000000000000002000000",
+          "msg" : "030000000000000000000000000000000400",
+          "ct" : "462401724b5ce6588d5a54aae5375513a075",
+          "tag" : "cfcdf5042112aa29685c912fc2056543",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "e66021d5eb8e4f4066d4adb9c33560e4f46e44bb3da0015c94f7088736864200",
+          "iv" : "e0eaf5284d884a0e77d31646",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "169fbb2fbf389a995f6390af22228a62",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "bae8e37fc83441b16034566b7a806c46bb91c3c5aedb64a6c590bc84d1a5e269",
+          "iv" : "e4b47801afc0577e34699b9e",
+          "aad" : "4fbdc66f14",
+          "msg" : "671fdd",
+          "ct" : "0eaccb",
+          "tag" : "93da9bb81333aee0c785b240d319719d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "6545fc880c94a95198874296d5cc1fd161320b6920ce07787f86743b275d1ab3",
+          "iv" : "2f6d1f0434d8848c1177441f",
+          "aad" : "6787f3ea22c127aaf195",
+          "msg" : "195495860f04",
+          "ct" : "a254dad4f3f9",
+          "tag" : "6b62b84dc40c84636a5ec12020ec8c2c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "d1894728b3fed1473c528b8426a582995929a1499e9ad8780c8d63d0ab4149c0",
+          "iv" : "9f572c614b4745914474e7c7",
+          "aad" : "489c8fde2be2cf97e74e932d4ed87d",
+          "msg" : "c9882e5386fd9f92ec",
+          "ct" : "0df9e308678244c44b",
+          "tag" : "c0fd3dc6628dfe55ebb0b9fb2295c8c2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "a44102952ef94b02b805249bac80e6f61455bfac8308a2d40d8c845117808235",
+          "iv" : "5c9e940fea2f582950a70d5a",
+          "aad" : "0da55210cc1c1b0abde3b2f204d1e9f8b06bc47f",
+          "msg" : "1db2316fd568378da107b52b",
+          "ct" : "8dbeb9f7255bf5769dd56692",
+          "tag" : "404099c2587f64979f21826706d497d5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "9745b3d1ae06556fb6aa7890bebc18fe6b3db4da3d57aa94842b9803a96e07fb",
+          "iv" : "6de71860f762ebfbd08284e4",
+          "aad" : "f37de21c7ff901cfe8a69615a93fdf7a98cad481796245709f",
+          "msg" : "21702de0de18baa9c9596291b08466",
+          "ct" : "793576dfa5c0f88729a7ed3c2f1bff",
+          "tag" : "b3080d28f6ebb5d3648ce97bd5ba67fd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "b18853f68d833640e42a3c02c25b64869e146d7b233987bddfc240871d7576f7",
+          "iv" : "028ec6eb5ea7e298342a94d4",
+          "aad" : "9c2159058b1f0fe91433a5bdc20e214eab7fecef4454a10ef0657df21ac7",
+          "msg" : "b202b370ef9768ec6561c4fe6b7e7296fa85",
+          "ct" : "857e16a64915a787637687db4a9519635cdd",
+          "tag" : "454fc2a154fea91f8363a39fec7d0a49",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "3c535de192eaed3822a2fbbe2ca9dfc88255e14a661b8aa82cc54236093bbc23",
+          "iv" : "688089e55540db1872504e1c",
+          "aad" : "734320ccc9d9bbbb19cb81b2af4ecbc3e72834321f7aa0f70b7282b4f33df23f167541",
+          "msg" : "ced532ce4159b035277d4dfbb7db62968b13cd4eec",
+          "ct" : "626660c26ea6612fb17ad91e8e767639edd6c9faee",
+          "tag" : "9d6c7029675b89eaf4ba1ded1a286594",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "iv" : "000000000000000000000000",
+          "aad" : "",
+          "msg" : "000000000000000000000000000000004db923dc793ee6497c76dcc03a98e108",
+          "ct" : "f3f80f2cf0cb2dd9c5984fcda908456cc537703b5ba70324a6793a7bf218d3ea",
+          "tag" : "ffffffff000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "draft-irtf-cfrg-gcmsiv-06",
+          "key" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "iv" : "000000000000000000000000",
+          "aad" : "",
+          "msg" : "eb3640277c7ffd1303c7a542d02d3e4c0000000000000000",
+          "ct" : "18ce4f0b8cb4d0cac65fea8f79257b20888e53e72299e56d",
+          "tag" : "ffffffff000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "",
+          "key" : "80ba3192c803ce965ea371d5ff073cf0f43b6a2ab576b208426e11409c09b9b0",
+          "iv" : "4da5bf8dfd5852c1ea12379d",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "181720f6ecdcdd332c89d20e09f11b0f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "",
+          "key" : "cc56b680552eb75008f5484b4cb803fa5063ebd6eab91f6ab6aef4916a766273",
+          "iv" : "99e23ec48985bccdeeab60f1",
+          "aad" : "",
+          "msg" : "2a",
+          "ct" : "fa",
+          "tag" : "868ee11a7fe13996ac26962a7e861962",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "",
+          "key" : "51e4bf2bad92b7aff1a4bc05550ba81df4b96fabf41c12c7b00e60e48db7e152",
+          "iv" : "4f07afedfdc3b6c2361823d3",
+          "aad" : "",
+          "msg" : "be3308f72a2c6aed",
+          "ct" : "c32210c306fac7dc",
+          "tag" : "da60d8ff4d550e6801b0ce488ed1b6fe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "",
+          "key" : "67119627bd988eda906219e08c0d0d779a07d208ce8a4fe0709af755eeec6dcb",
+          "iv" : "68ab7fdbf61901dad461d23c",
+          "aad" : "",
+          "msg" : "51f8c1f731ea14acdb210a6d973e07",
+          "ct" : "0180029193bbb29e326b5817e8ea01",
+          "tag" : "4dd43e861c5f141a693ebc056ed0f0f9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "",
+          "key" : "59d4eafb4de0cfc7d3db99a8f54b15d7b39f0acc8da69763b019c1699f87674a",
+          "iv" : "2fcb1b38a99e71b84740ad9b",
+          "aad" : "",
+          "msg" : "549b365af913f3b081131ccb6b825588",
+          "ct" : "31cb136074adcd00cf75e9587d7e8424",
+          "tag" : "567871b7aaaf3c00f42fd9d5962df514",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "",
+          "key" : "3b2458d8176e1621c0cc24c0c0e24c1e80d72f7ee9149a4b166176629616d011",
+          "iv" : "45aaa3e5d16d2d42dc03445d",
+          "aad" : "",
+          "msg" : "3ff1514b1c503915918f0c0c31094a6e1f",
+          "ct" : "c97e58e8730a567e8bdf5eb981cdd5f323",
+          "tag" : "4b2dc825fef9dc6bf234f2b8ff798f9e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "",
+          "key" : "0212a8de5007ed87b33f1a7090b6114f9e08cefd9607f2c276bdcfdbc5ce9cd7",
+          "iv" : "e6b1adf2fd58a8762c65f31b",
+          "aad" : "",
+          "msg" : "10f1ecf9c60584665d9ae5efe279e7f7377eea6916d2b111",
+          "ct" : "c2669f9fc8fe6013c4dd22468d43c2af73647b7018531d29",
+          "tag" : "06a58c8d44e99b3262cad0e920df1f85",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "",
+          "key" : "e1731d5854e1b70cb3ffe8b786a2b3ebf0994370954757b9dc8c7bc5354634a3",
+          "iv" : "72cfd90ef3026ca22b7e6e6a",
+          "aad" : "",
+          "msg" : "b9c554cbc36ac18ae897df7beecac1dbeb4eafa156bb60ce2e5d48f05715e678",
+          "ct" : "faaef557c31a231115f393c4b3c1a1413fb40b4204458d5f9ef8a9f2f12486ae",
+          "tag" : "72fc457255aadf708719c46986caefad",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "",
+          "key" : "7d00b48095adfa3272050607b264185002ba99957c498be022770f2ce2f3143c",
+          "iv" : "87345f1055fd9e2102d50656",
+          "aad" : "02",
+          "msg" : "e5ccaa441bc814688f8f6e8f28b500b2",
+          "ct" : "12fffdccd1e5a9708fa30ccf99137067",
+          "tag" : "688e0b634f51c4f6d983629c8a63c1c0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "",
+          "key" : "6432717f1db85e41ac7836bce25185a080d5762b9e2b18444b6ec72c3bd8e4dc",
+          "iv" : "87a3163ec0598ad95b3aa713",
+          "aad" : "b648",
+          "msg" : "02cde168fba3f544bbd0332f7adeada8",
+          "ct" : "b75b8e96de2ef9704ade5c64cab59671",
+          "tag" : "dec00ceb899c4a6a29be67f1b30435e0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "",
+          "key" : "8e34cf73d245a1082a920b86364eb896c4946467bcb3d58929fcb36690e6394f",
+          "iv" : "6f573aa86baa492ba46596df",
+          "aad" : "bd4cd02fc7502bbdbdf6c9a3cbe8f0",
+          "msg" : "16ddd23ff53f3d23c06334487040eb47",
+          "ct" : "8e67034384170a646e9eea1606a8e899",
+          "tag" : "fe7a3dd42beb5ff70bb471ff76f0d341",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "",
+          "key" : "cb5575f5c7c45c91cf320b139fb594237560d0a3e6f865a67d4f633f2c08f016",
+          "iv" : "1a6518f02ede1da6809266d9",
+          "aad" : "89cce9fb47441d07e0245a66fe8b778b",
+          "msg" : "623b7850c321e2cf0c6fbcc8dfd1aff2",
+          "ct" : "7eeb00c65fe7e0c79255e3cd90013588",
+          "tag" : "957d35fb25fdc17f00db33756967fd02",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "",
+          "key" : "a5569e729a69b24ba6e0ff15c4627897436824c941e9d00b2e93fddc4ba77657",
+          "iv" : "564dee49ab00d240fc1068c3",
+          "aad" : "d19f2d989095f7ab03a5fde84416e00c0e",
+          "msg" : "87b3a4d7b26d8d3203a0de1d64ef82e3",
+          "ct" : "f83e3b4333400d6393d085fe947057c4",
+          "tag" : "7a30291bb506ae3961f61d683c9d94d1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "",
+          "key" : "3937986af86dafc1ba0c4672d8abc46c207062682d9c264ab06d6c5807205130",
+          "iv" : "8df4b15a888c33286a7b7651",
+          "aad" : "ba446f6f9a0ced22450feb10737d9007fd69abc19b1d4d9049a5551e86ec2b37",
+          "msg" : "dc9e9eaf11e314182df6a4eba17aec9c",
+          "ct" : "97db4d850442eb33e6089af6f3cadf7b",
+          "tag" : "3ccbb125b2835754c1409d227e374d0b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "Testing for ctr overflow",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "010101010101010101010101",
+          "aad" : "40c32e00c2fdab59c1a1c573b46b5068",
+          "msg" : "bdd411814564c4218d224d50591c818855a862a0a519ac0b3d71a2edb12aa71eb81959bcc6b84c45aa424c9aca0b7bdd",
+          "ct" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 111,
+          "comment" : "Testing for ctr overflow",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "000000000000000000000000",
+          "aad" : "2cc3a1973e0560f7224a394e52fa8488",
+          "msg" : "d04846a01f472262e60a1cb4cfcbdcb05c3f819628a3a49395c5dae96c434b2417ce071699afa74a60c32c0bafd9c01a",
+          "ct" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 112,
+          "comment" : "Testing for ctr overflow",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "010101010101010101010101",
+          "aad" : "2e34d12622a441b557eeb1d647c6cb73",
+          "msg" : "79637cee9decf33e3080de3d2c55bd21cd529ba8080b583edb6cfe13cda04bd00debe58b8cd48d6e02a1ecfc4d87923a",
+          "ct" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "tag" : "fefffffffefffffffefffffffeffffff",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 113,
+          "comment" : "Testing for ctr overflow",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "000000000000000000000000",
+          "aad" : "0814a95481bf915a4097949e3525c7e7",
+          "msg" : "6492a73880dac7f36743715b0fc7063d3e46a25044310bba5849ed88bfcb54b0adbe3978040bda849906e1aa09d1a8e3",
+          "ct" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "tag" : "ffffff7f00112233445566778899aabb",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 114,
+          "comment" : "Testing for ctr overflow",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "010101010101010101010101",
+          "aad" : "b691ef42f2ab8d1b4a581bb08394b13a",
+          "msg" : "7848d9e872f40bca1b82a4e7185fb75193b3496cc1dc2a72b86ed156ab8389e71687ed25eb6485e66561fa8c39853368",
+          "ct" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "tag" : "ffffffffffffff7f0011223344556677",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 115,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "e144878b0bbbf01b75231277e1e0d114",
+          "msg" : "f663044a4e7dd822aba0b7de2d869981",
+          "ct" : "00000000000000000000000000000000",
+          "tag" : "13a1883272188b4c8d2727178198fe95",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "0289eaa93eb084107d2088435ef2a0cd",
+          "msg" : "49861b1fb6bcf8e4",
+          "ct" : "ffffffffffffffff",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "f3bd6013669b7d9371727fcb1aafea75",
+          "msg" : "49861b1fb6bcf8e4",
+          "ct" : "ffffffffffffffff",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "922e91b2c5016e4303c737d1608ca25f",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "0987e35e40981a2730c1740c7201731f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "7195dd0addce5dd7014bfddb2f23206f",
+          "msg" : "759dfbbb8a251ccc",
+          "ct" : "0000000000000000",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "32fc2a53e9678f1fc6d63081c36c6f2c",
+          "msg" : "49861b1fb6bcf8e4",
+          "ct" : "ffffffffffffffff",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "c55ba71ee250216f8ecfe822d712dd38",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "0987e35e40981a2730c1740c7201731f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "5546acf865fc305fbd7ff1092cb9c2c3",
+          "msg" : "759dfbbb8a251ccc",
+          "ct" : "0000000000000000",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "6b060eebe1843b409a4dfd0be8f86a2b",
+          "msg" : "f663044a4e7dd822aba0b7de2d869981",
+          "ct" : "00000000000000000000000000000000",
+          "tag" : "13a1883272188b4c8d2727178198fe95",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "c4adb92f1a60eb2faff88675f62a7276",
+          "msg" : "759dfbbb8a251ccc",
+          "ct" : "0000000000000000",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "70c5a8591f52f869c6415a6d7000e253",
+          "msg" : "f663044a4e7dd822aba0b7de2d869981",
+          "ct" : "00000000000000000000000000000000",
+          "tag" : "13a1883272188b4c8d2727178198fe95",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "b5fe79f182cb9f2945208e29513928d1",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "0987e35e40981a2730c1740c7201731f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "c1dbf87e4a586b040c53f6dd9063b4cd",
+          "msg" : "49861b1fb6bcf8e4",
+          "ct" : "ffffffffffffffff",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "845466e603ca85a224693d150ae13ba3",
+          "msg" : "759dfbbb8a251ccc",
+          "ct" : "0000000000000000",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "18cb9f5eede6224fa3fcd525cf9f958b",
+          "msg" : "f663044a4e7dd822aba0b7de2d869981",
+          "ct" : "00000000000000000000000000000000",
+          "tag" : "13a1883272188b4c8d2727178198fe95",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "8c4fbca37d2e361856b9f80adf455fa0",
+          "msg" : "759dfbbb8a251ccc",
+          "ct" : "0000000000000000",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "bc517fe140abf2b42eb1cafe8c0715a9",
+          "msg" : "49861b1fb6bcf8e4",
+          "ct" : "ffffffffffffffff",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "617e1c5ef62ed35cf678e670f116ff2f",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "0987e35e40981a2730c1740c7201731f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "e71802b7a37e8ef1f001ef0c52c636f2",
+          "msg" : "f663044a4e7dd822aba0b7de2d869981",
+          "ct" : "00000000000000000000000000000000",
+          "tag" : "13a1883272188b4c8d2727178198fe95",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "be647e37f154d4a8edca5a29ca221cc5",
+          "msg" : "759dfbbb8a251ccc",
+          "ct" : "0000000000000000",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "b3caa01f49c7cbc56c7c92547257957e",
+          "msg" : "f663044a4e7dd822aba0b7de2d869981",
+          "ct" : "00000000000000000000000000000000",
+          "tag" : "13a1883272188b4c8d2727178198fe95",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "ab0347a2aec4cc4c366583062442ba07",
+          "msg" : "759dfbbb8a251ccc",
+          "ct" : "0000000000000000",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "62573ef39a27f77b37fb7bfc84e46cee",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "0987e35e40981a2730c1740c7201731f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "28e3cadfb16834e824642e965588c200",
+          "msg" : "759dfbbb8a251ccc",
+          "ct" : "0000000000000000",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "7edd2fc15bed224a46dc8608e1766080",
+          "msg" : "49861b1fb6bcf8e4",
+          "ct" : "ffffffffffffffff",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "7e0e03104e2c0ff20ba4c35742180c5b",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "0987e35e40981a2730c1740c7201731f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "9a24dc75c5ddd3bab57ff532eb86d224",
+          "msg" : "f663044a4e7dd822aba0b7de2d869981",
+          "ct" : "00000000000000000000000000000000",
+          "tag" : "13a1883272188b4c8d2727178198fe95",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "3196aec499c15bc043b6866ba0df6e6b",
+          "msg" : "49861b1fb6bcf8e4",
+          "ct" : "ffffffffffffffff",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Flipped bit 0..127 in tag",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "55a2987aa94bf46ad1b6d253a44c1622",
+          "msg" : "49861b1fb6bcf8e4",
+          "ct" : "ffffffffffffffff",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/aes_gcm_test.json b/third_party/wycheproof/testvectors/aes_gcm_test.json
new file mode 100644
index 0000000..f2f3279
--- /dev/null
+++ b/third_party/wycheproof/testvectors/aes_gcm_test.json
@@ -0,0 +1,2940 @@
+{
+  "algorithm" : "AES-GCM",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "ConstructedIv" : "The counter for AES-GCM is reduced modulo 2**32. This test vector was constructed to test for correct wrapping of the counter.",
+    "ZeroLengthIv" : "AES-GCM does not allow an IV of length 0. Encrypting with such an IV leaks the authentication key. Hence using an IV of length 0 is insecure even if the key itself is only used for a single encryption."
+  },
+  "numberOfTests" : 217,
+  "header" : [],
+  "testGroups" : [
+    {
+      "ivSize" : 96,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "key" : "5b9604fe14eadba931b0ccf34843dab9",
+          "iv" : "028318abc1824029138141a2",
+          "aad" : "",
+          "msg" : "001d0c231287c1182784554ca3a21908",
+          "ct" : "26073cc1d851beff176384dc9896d5ff",
+          "tag" : "0a3ea7a5487cb5f7d70fb6c58d038554",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "key" : "5b9604fe14eadba931b0ccf34843dab9",
+          "iv" : "921d2507fa8007b7bd067d34",
+          "aad" : "00112233445566778899aabbccddeeff",
+          "msg" : "001d0c231287c1182784554ca3a21908",
+          "ct" : "49d8b9783e911913d87094d1f63cc765",
+          "tag" : "1e348ba07cca2cf04c618cb4d43a5b92",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "key" : "aa023d0478dcb2b2312498293d9a9129",
+          "iv" : "0432bc49ac34412081288127",
+          "aad" : "aac39231129872a2",
+          "msg" : "2035af313d1346ab00154fea78322105",
+          "ct" : "eea945f3d0f98cc0fbab472a0cf24e87",
+          "tag" : "4bb9b4812519dadf9e1232016d068133",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "",
+          "key" : "384ea416ac3c2f51a76e7d8226346d4e",
+          "iv" : "b30c084727ad1c592ac21d12",
+          "aad" : "",
+          "msg" : "35",
+          "ct" : "54",
+          "tag" : "7c1e4ae88bb27e5638343cb9fd3f6337",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "",
+          "key" : "cae31cd9f55526eb038241fc44cac1e5",
+          "iv" : "b5e006ded553110e6dc56529",
+          "aad" : "",
+          "msg" : "d10989f2c52e94ad",
+          "ct" : "a036ead03193903f",
+          "tag" : "3b626940e0e9f0cbea8e18c437fd6011",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "",
+          "key" : "dd6197cd63c963919cf0c273ef6b28bf",
+          "iv" : "ecb0c42f7000ef0e6f95f24d",
+          "aad" : "",
+          "msg" : "4dcc1485365866e25ac3f2ca6aba97",
+          "ct" : "8a9992388e735f80ee18f4a63c10ad",
+          "tag" : "1486a91cccf92c9a5b00f7b0e034891c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "",
+          "key" : "ffdf4228361ea1f8165852136b3480f7",
+          "iv" : "0e1666f2dc652f7708fb8f0d",
+          "aad" : "",
+          "msg" : "25b12e28ac0ef6ead0226a3b2288c800",
+          "ct" : "f7bd379d130477176b8bb3cb23dbbbaa",
+          "tag" : "1ee6513ce30c7873f59dd4350a588f42",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "",
+          "key" : "c15ed227dd2e237ecd087eaaaad19ea4",
+          "iv" : "965ff6643116ac1443a2dec7",
+          "aad" : "",
+          "msg" : "fee62fde973fe025ad6b322dcdf3c63fc7",
+          "ct" : "0de51fe4f7f2d1f0f917569f5c6d1b009c",
+          "tag" : "6cd8521422c0177e83ef1b7a845d97db",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "",
+          "key" : "a8ee11b26d7ceb7f17eaa1e4b83a2cf6",
+          "iv" : "fbbc04fd6e025b7193eb57f6",
+          "aad" : "",
+          "msg" : "c08f085e6a9e0ef3636280c11ecfadf0c1e72919ffc17eaf",
+          "ct" : "7cd9f4e4f365704fff3b9900aa93ba54b672bac554275650",
+          "tag" : "f4eb193241226db017b32ec38ca47217",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "",
+          "key" : "28ff3def08179311e2734c6d1c4e2871",
+          "iv" : "32bcb9b569e3b852d37c766a",
+          "aad" : "c3",
+          "msg" : "dfc61a20df8505b53e3cd59f25770d5018add3d6",
+          "ct" : "f58d453212c2c8a436e9283672f579f119122978",
+          "tag" : "5901131d0760c8715901d881fdfd3bc0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "",
+          "key" : "e63a43216c08867210e248859eb5e99c",
+          "iv" : "9c3a4263d983456658aad4b1",
+          "aad" : "834afdc5c737186b",
+          "msg" : "b14da56b0462dc05b871fc815273ff4810f92f4b",
+          "ct" : "bf864616c2347509ca9b10446379b9bdbb3b8f64",
+          "tag" : "a97d25b490390b53c5db91f6ee2a15b8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "",
+          "key" : "38449890234eb8afab0bbf82e2385454",
+          "iv" : "33e90658416e7c1a7c005f11",
+          "aad" : "4020855c66ac4595058395f367201c4c",
+          "msg" : "f762776bf83163b323ca63a6b3adeac1e1357262",
+          "ct" : "a6f2ef3c7ef74a126dd2d5f6673964e27d5b34b6",
+          "tag" : "b8bbdc4f5014bc752c8b4e9b87f650a3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "",
+          "key" : "6a68671dfe323d419894381f85eb63fd",
+          "iv" : "9f0d85b605711f34cd2a35ba",
+          "aad" : "76eb5f147250fa3c12bff0a6e3934a0b16860cf11646773b",
+          "msg" : "0fc67899c3f1bbe196d90f1eca3797389230aa37",
+          "ct" : "bd64802cfebaeb487d3a8f76ce943a37b3472dd5",
+          "tag" : "fce9a5b530c7d7af718be1ec0ae9ed4d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "special case",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "000000000000000000000000",
+          "aad" : "",
+          "msg" : "ebd4a3e10cf6d41c50aeae007563b072",
+          "ct" : "f62d84d649e56bc8cfedc5d74a51e2f7",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "special case",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "ffffffffffffffffffffffff",
+          "aad" : "",
+          "msg" : "d593c4d8224f1b100c35e4f6c4006543",
+          "ct" : "431f31e6840931fd95f94bf88296ff69",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d9847dbc326a06e988c77ad3863e6083",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "da847dbc326a06e988c77ad3863e6083",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "58847dbc326a06e988c77ad3863e6083",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d8857dbc326a06e988c77ad3863e6083",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d8847d3c326a06e988c77ad3863e6083",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d8847dbc336a06e988c77ad3863e6083",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d8847dbc306a06e988c77ad3863e6083",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d8847dbc326a066988c77ad3863e6083",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d8847dbc326a06e989c77ad3863e6083",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d8847dbc326a06e908c77ad3863e6083",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d8847dbc326a06e988e77ad3863e6083",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d8847dbc326a06e988c77bd3863e6083",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d8847dbc326a06e988c77ad3873e6083",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d8847dbc326a06e988c77ad3843e6083",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d8847dbc326a06e988c77ad3063e6083",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d8847dbc326a06e988c77ad3863e6082",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d8847dbc326a06e988c77ad3863e6081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d8847dbc326a06e988c77ad3863e60c3",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d8847dbc326a06e988c77ad3863e6003",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d9847dbc326a06e989c77ad3863e6083",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d8847d3c326a066988c77ad3863e6083",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d8847dbc326a066988c77ad3863e6003",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "277b8243cd95f9167738852c79c19f7c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "5804fd3cb2ea86690847fa5306bee003",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "eb156d081ed6b6b55f4612f021d87b39",
+          "tag" : "d9857cbd336b07e889c67bd2873f6182",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 64,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 43,
+          "comment" : "",
+          "key" : "aa023d0478dcb2b2312498293d9a9129",
+          "iv" : "0432bc49ac344120",
+          "aad" : "aac39231129872a2",
+          "msg" : "2035af313d1346ab00154fea78322105",
+          "ct" : "64c36bb3b732034e3a7d04efc5197785",
+          "tag" : "b7d0dd70b00d65b97cfd080ff4b819d1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "unusual IV size",
+          "key" : "25dd4d6cad5a4604957847c8c6d3fc4e",
+          "iv" : "68cbeafe8f9e8a66",
+          "aad" : "",
+          "msg" : "5c347835b3fa61c2ce253e5a",
+          "ct" : "9a078a04d14938918e004358",
+          "tag" : "5452843e32c13c3e35ed8230fe3446c0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 128,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 45,
+          "comment" : "",
+          "key" : "2034a82547276c83dd3212a813572bce",
+          "iv" : "3254202d854734812398127a3d134421",
+          "aad" : "1a0293d8f90219058902139013908190bc490890d3ff12a3",
+          "msg" : "02efd2e5782312827ed5d230189a2a342b277ce048462193",
+          "ct" : "64069c2d58690561f27ee199e6b479b6369eec688672bde9",
+          "tag" : "9b7abadd6e69c1d9ec925786534f5075",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "",
+          "key" : "209e6dbf2ad26a105445fc0207cd9e9a",
+          "iv" : "9477849d6ccdfca112d92e53fae4a7ca",
+          "aad" : "",
+          "msg" : "01",
+          "ct" : "fd",
+          "tag" : "032df7bba5d8ea1a14f16f70bd0e14ec",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "",
+          "key" : "a549442e35154032d07c8666006aa6a2",
+          "iv" : "5171524568e81d97e8c4de4ba56c10a0",
+          "aad" : "",
+          "msg" : "1182e93596cac5608946400bc73f3a",
+          "ct" : "2f333087bdca58219f9bfc273e45cc",
+          "tag" : "e06d1ef473132957ad37eaef29733ca0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "",
+          "key" : "cfb4c26f126f6a0acb8e4e220f6c56cd",
+          "iv" : "1275115499ae722268515bf0c164b49c",
+          "aad" : "",
+          "msg" : "09dfd7f080275257cf97e76f966b1ad9",
+          "ct" : "a780bd01c80885156c88a973264c8ee5",
+          "tag" : "2adeffa682c8d8a81fada7d9fcdd2ee2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "",
+          "key" : "0b11ef3a08c02970f74281c860691c75",
+          "iv" : "95c1dd8c0f1705ece68937901f7add7b",
+          "aad" : "",
+          "msg" : "f693d4edd825dbb0618d91113128880dbebb23e25d00ed1f077d870be9cc7536",
+          "ct" : "7e47e10fe3c6fbfa381770eaf5d48d1482e71e0c44dff1e30ca6f95d92052084",
+          "tag" : "d01444fa5d9c499629d174ff3927a1ac",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "J0:000102030405060708090a0b0c0d0e0f",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "f95fde4a751913202aeeee32a0b55753",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "00078d109d92143fcd5df56721b884fac64ac7762cc09eea2a3c68e92a17bdb575f87bda18be564e",
+          "tag" : "152a65045fe674f97627427af5be22da",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 51,
+          "comment" : "J0:00000000000000000000000000000000",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "7b95b8c356810a84711d68150a1b7750",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "84d4c9c08b4f482861e3a9c6c35bc4d91df927374513bfd49f436bd73f325285daef4ff7e13d46a6",
+          "tag" : "213a3cb93855d18e69337eee66aeec07",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 52,
+          "comment" : "J0:ffffffffffffffffffffffffffffffff",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "1a552e67cdc4dc1a33b824874ebf0bed",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "948ca37a8e6649e88aeffb1c598f3607007702417ea0e0bc3c60ad5a949886de968cf53ea6462aed",
+          "tag" : "99b381bfa2af9751c39d1b6e86d1be6a",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 53,
+          "comment" : "J0:fffffffffffffffffffffffffffffffe",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "dd9d0b4a0c3d681524bffca31d907661",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "64b19314c31af45accdf7e3c4db79f0d948ca37a8e6649e88aeffb1c598f3607007702417ea0e0bc",
+          "tag" : "5281efc7f13ac8e14ccf5dca7bfbfdd1",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 54,
+          "comment" : "J0:fffffffffffffffffffffffffffffffd",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "57c5643c4e37b4041db794cfe8e1f0f4",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "2bb69c3e5d1f91815c6b87a0d5bbea7164b19314c31af45accdf7e3c4db79f0d948ca37a8e6649e8",
+          "tag" : "a3ea2c09ee4f8c8a12f45cddf9aeff81",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 55,
+          "comment" : "J0:000102030405060708090a0bffffffff",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "99821c2dd5daecded07300f577f7aff1",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "127af9b39ecdfc57bb11a2847c7c2d3d8f938f40f877e0c4af37d0fe9af033052bd537c4ae978f60",
+          "tag" : "07eb2fe4a958f8434d40684899507c7c",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 56,
+          "comment" : "J0:000102030405060708090a0bfffffffe",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "5e4a3900142358d1c774d8d124d8d27d",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "0cf6ae47156b14dce03c8a07a2e172b1127af9b39ecdfc57bb11a2847c7c2d3d8f938f40f877e0c4",
+          "tag" : "f145c2dcaf339eede427be934357eac0",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 57,
+          "comment" : "J0:000102030405060708090a0bfffffffd",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "d4125676562984c0fe7cb0bdd1a954e8",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "f0c6ffc18bd46df5569185a9afd169eb0cf6ae47156b14dce03c8a07a2e172b1127af9b39ecdfc57",
+          "tag" : "facd0bfe8701b7b4a2ba96d98af52bd9",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 58,
+          "comment" : "J0:000102030405060708090a0b7fffffff",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "b97ec62a5e5900ccf9e4be332e336091",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "d6928e094c06e0a7c4db42184cf7529e95de88b767edebe9b343000be3dab47ea08b744293eed698",
+          "tag" : "a03e729dcfd7a03155655fece8affd7e",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 59,
+          "comment" : "J0:000102030405060708090a0b7ffffffe",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "7eb6e3079fa0b4c3eee366177d1c1d1d",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "d82ce58771bf6487116bf8e96421877ed6928e094c06e0a7c4db42184cf7529e95de88b767edebe9",
+          "tag" : "1e43926828bc9a1614c7b1639096c195",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 60,
+          "comment" : "J0:000102030405060708090a0bffff7fff",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "0314fcd10fdd675d3c612962c931f635",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "a197a37a5d79697078536bc27fe46cd8d475526d9044aa94f088a054f8e380c64f79414795c61480",
+          "tag" : "f08baddf0b5285c91fc06a67fe4708ca",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 61,
+          "comment" : "J0:000102030405060708090a0bffff7ffe",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "c4dcd9fcce24d3522b66f1469a1e8bb9",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "149fde9abbd3a43c2548575e0db9fb84a197a37a5d79697078536bc27fe46cd8d475526d9044aa94",
+          "tag" : "62a4b6875c288345d6a454399eac1afa",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 62,
+          "comment" : "special case",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "00000000000000000000000000000000",
+          "aad" : "",
+          "msg" : "bec6fa05c1718b9b84c47345bbed7dcb",
+          "ct" : "45a3f89d02918bfd0c8161658ccc9795",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "special case",
+          "key" : "00112233445566778899aabbccddeeff",
+          "iv" : "ffffffffffffffffffffffffffffffff",
+          "aad" : "",
+          "msg" : "4d82639c39d3f3490ee903dd0be7afcf",
+          "ct" : "1cd5a06214235ceb044d4bad7b047312",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 64,
+          "comment" : "",
+          "key" : "92ace3e348cd821092cd921aa3546374299ab46209691bc28b8752d17f123c20",
+          "iv" : "00112233445566778899aabb",
+          "aad" : "00000000ffffffff",
+          "msg" : "00010203040506070809",
+          "ct" : "e27abdd2d2a53d2f136b",
+          "tag" : "9a4a2579529301bcfb71c78d4060f52c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "",
+          "key" : "29d3a44f8723dc640239100c365423a312934ac80239212ac3df3421a2098123",
+          "iv" : "00112233445566778899aabb",
+          "aad" : "aabbccddeeff",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "2a7d77fa526b8250cb296078926b5020",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "",
+          "key" : "cc56b680552eb75008f5484b4cb803fa5063ebd6eab91f6ab6aef4916a766273",
+          "iv" : "99e23ec48985bccdeeab60f1",
+          "aad" : "",
+          "msg" : "2a",
+          "ct" : "06",
+          "tag" : "633c1e9703ef744ffffb40edf9d14355",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "",
+          "key" : "51e4bf2bad92b7aff1a4bc05550ba81df4b96fabf41c12c7b00e60e48db7e152",
+          "iv" : "4f07afedfdc3b6c2361823d3",
+          "aad" : "",
+          "msg" : "be3308f72a2c6aed",
+          "ct" : "cf332a12fdee800b",
+          "tag" : "602e8d7c4799d62c140c9bb834876b09",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "",
+          "key" : "67119627bd988eda906219e08c0d0d779a07d208ce8a4fe0709af755eeec6dcb",
+          "iv" : "68ab7fdbf61901dad461d23c",
+          "aad" : "",
+          "msg" : "51f8c1f731ea14acdb210a6d973e07",
+          "ct" : "43fc101bff4b32bfadd3daf57a590e",
+          "tag" : "ec04aacb7148a8b8be44cb7eaf4efa69",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "",
+          "key" : "59d4eafb4de0cfc7d3db99a8f54b15d7b39f0acc8da69763b019c1699f87674a",
+          "iv" : "2fcb1b38a99e71b84740ad9b",
+          "aad" : "",
+          "msg" : "549b365af913f3b081131ccb6b825588",
+          "ct" : "f58c16690122d75356907fd96b570fca",
+          "tag" : "28752c20153092818faba2a334640d6e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "",
+          "key" : "3b2458d8176e1621c0cc24c0c0e24c1e80d72f7ee9149a4b166176629616d011",
+          "iv" : "45aaa3e5d16d2d42dc03445d",
+          "aad" : "",
+          "msg" : "3ff1514b1c503915918f0c0c31094a6e1f",
+          "ct" : "73a6b6f45f6ccc5131e07f2caa1f2e2f56",
+          "tag" : "2d7379ec1db5952d4e95d30c340b1b1d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "",
+          "key" : "0212a8de5007ed87b33f1a7090b6114f9e08cefd9607f2c276bdcfdbc5ce9cd7",
+          "iv" : "e6b1adf2fd58a8762c65f31b",
+          "aad" : "",
+          "msg" : "10f1ecf9c60584665d9ae5efe279e7f7377eea6916d2b111",
+          "ct" : "0843fff52d934fc7a071ea62c0bd351ce85678cde3ea2c9e",
+          "tag" : "7355fde599006715053813ce696237a8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "",
+          "key" : "b279f57e19c8f53f2f963f5f2519fdb7c1779be2ca2b3ae8e1128b7d6c627fc4",
+          "iv" : "98bc2c7438d5cd7665d76f6e",
+          "aad" : "c0",
+          "msg" : "fcc515b294408c8645c9183e3f4ecee5127846d1",
+          "ct" : "eb5500e3825952866d911253f8de860c00831c81",
+          "tag" : "ecb660e1fb0541ec41e8d68a64141b3a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "",
+          "key" : "cdccfe3f46d782ef47df4e72f0c02d9c7f774def970d23486f11a57f54247f17",
+          "iv" : "376187894605a8d45e30de51",
+          "aad" : "956846a209e087ed",
+          "msg" : "e28e0e9f9d22463ac0e42639b530f42102fded75",
+          "ct" : "feca44952447015b5df1f456df8ca4bb4eee2ce2",
+          "tag" : "082e91924deeb77880e1b1c84f9b8d30",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "",
+          "key" : "f32364b1d339d82e4f132d8f4a0ec1ff7e746517fa07ef1a7f422f4e25a48194",
+          "iv" : "5a86a50a0e8a179c734b996d",
+          "aad" : "ab2ac7c44c60bdf8228c7884adb20184",
+          "msg" : "43891bccb522b1e72a6b53cf31c074e9d6c2df8e",
+          "ct" : "43dda832e942e286da314daa99bef5071d9d2c78",
+          "tag" : "c3922583476ced575404ddb85dd8cd44",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "",
+          "key" : "ff0089ee870a4a39f645b0a5da774f7a5911e9696fc9cad646452c2aa8595a12",
+          "iv" : "bc2a7757d0ce2d8b1f14ccd9",
+          "aad" : "972ab4e06390caae8f99dd6e2187be6c7ff2c08a24be16ef",
+          "msg" : "748b28031621d95ee61812b4b4f47d04c6fc2ff3",
+          "ct" : "a929ee7e67c7a2f91bbcec6389a3caf43ab49305",
+          "tag" : "ebec6774b955e789591c822dab739e12",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "special case",
+          "key" : "00112233445566778899aabbccddeeff102132435465768798a9bacbdcedfe0f",
+          "iv" : "000000000000000000000000",
+          "aad" : "",
+          "msg" : "561008fa07a68f5c61285cd013464eaf",
+          "ct" : "23293e9b07ca7d1b0cae7cc489a973b3",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "special case",
+          "key" : "00112233445566778899aabbccddeeff102132435465768798a9bacbdcedfe0f",
+          "iv" : "ffffffffffffffffffffffff",
+          "aad" : "",
+          "msg" : "c6152244cea1978d3e0bc274cf8c0b3b",
+          "ct" : "7cb6fc7c6abc009efe9551a99f36a421",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9de8fef6d8ab1bf1bf887232eab590dd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9ee8fef6d8ab1bf1bf887232eab590dd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "1ce8fef6d8ab1bf1bf887232eab590dd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9ce9fef6d8ab1bf1bf887232eab590dd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9ce8fe76d8ab1bf1bf887232eab590dd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9ce8fef6d9ab1bf1bf887232eab590dd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9ce8fef6daab1bf1bf887232eab590dd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9ce8fef6d8ab1b71bf887232eab590dd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9ce8fef6d8ab1bf1be887232eab590dd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9ce8fef6d8ab1bf13f887232eab590dd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9ce8fef6d8ab1bf1bfa87232eab590dd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9ce8fef6d8ab1bf1bf887332eab590dd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9ce8fef6d8ab1bf1bf887232ebb590dd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9ce8fef6d8ab1bf1bf887232e8b590dd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9ce8fef6d8ab1bf1bf8872326ab590dd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9ce8fef6d8ab1bf1bf887232eab590dc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9ce8fef6d8ab1bf1bf887232eab590df",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9ce8fef6d8ab1bf1bf887232eab5909d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9ce8fef6d8ab1bf1bf887232eab5905d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9de8fef6d8ab1bf1be887232eab590dd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9ce8fe76d8ab1b71bf887232eab590dd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9ce8fef6d8ab1b71bf887232eab5905d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "631701092754e40e40778dcd154a6f22",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "1c687e76582b9b713f08f2b26a35105d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "b2061457c0759fc1749f174ee1ccadfa",
+          "tag" : "9de9fff7d9aa1af0be897333ebb491dc",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 128,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 105,
+          "comment" : "J0:000102030405060708090a0b0c0d0e0f",
+          "key" : "00112233445566778899aabbccddeeff1021324354657687",
+          "iv" : "029e0e777db092b12535d043012f09ba",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "f83cee467336e1a09b75f24e9b4385c99c13e6af722256a66129ece961fe803b167bad206f5017fb",
+          "tag" : "09338a42f0acc14f97c064f52f5f1688",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 106,
+          "comment" : "J0:00000000000000000000000000000000",
+          "key" : "00112233445566778899aabbccddeeff1021324354657687",
+          "iv" : "f1be3b06b7feac07e7eab629f556047b",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "0b32b648a2c28e9edd7cee08eeeb900034cae7215e5ab1e201bd2eed1032c5a97866ba582a3458a4",
+          "tag" : "90be3606de58bd778fa5beff4a4102bd",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 107,
+          "comment" : "J0:ffffffffffffffffffffffffffffffff",
+          "key" : "00112233445566778899aabbccddeeff1021324354657687",
+          "iv" : "de9eb63b1daed321a11b7547cc9e223c",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "575e2ecec2b3c72d4e80830d0d859ad9e42c29c4a68d8d9d8d23434de2cd07733be49d62ac1ae085",
+          "tag" : "6e4d6396125a10df5443bd0cbc8566d1",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 108,
+          "comment" : "J0:fffffffffffffffffffffffffffffffe",
+          "key" : "00112233445566778899aabbccddeeff1021324354657687",
+          "iv" : "40bb0abebc483ff6d5671241ff5d66c6",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "2a818888d1f09f32aa7beedd2869b446575e2ecec2b3c72d4e80830d0d859ad9e42c29c4a68d8d9d",
+          "tag" : "dc481f172545268eff63ab0490403dc3",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 109,
+          "comment" : "J0:fffffffffffffffffffffffffffffffd",
+          "key" : "00112233445566778899aabbccddeeff1021324354657687",
+          "iv" : "20d5cf305e630a8f49e3bb4bab18abc9",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "96d36b795f8e7edf6a8e0dbcd20d6c072a818888d1f09f32aa7beedd2869b446575e2ecec2b3c72d",
+          "tag" : "8a3a22bf2592958b930292aa47f590e8",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 110,
+          "comment" : "J0:000102030405060708090a0bffffffff",
+          "key" : "00112233445566778899aabbccddeeff1021324354657687",
+          "iv" : "255358a71a0e5731f6dd6ce28e158ae6",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "cfce3d920f0e01f0bb49a751955b236d1b887baefd25c47f41303c46d5c7bf9ca4c2c45a8f1e6656",
+          "tag" : "2db9dc1b7fd315df1c95432432fcf474",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 111,
+          "comment" : "J0:000102030405060708090a0bfffffffe",
+          "key" : "00112233445566778899aabbccddeeff1021324354657687",
+          "iv" : "bb76e422bbe8bbe682a10be4bdd6ce1c",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "69a24169792e9a07f6e6f4736fa972dccfce3d920f0e01f0bb49a751955b236d1b887baefd25c47f",
+          "tag" : "82ad967f7ac19084354f69a751443fb2",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 112,
+          "comment" : "J0:000102030405060708090a0bfffffffd",
+          "key" : "00112233445566778899aabbccddeeff1021324354657687",
+          "iv" : "db1821ac59c38e9f1e25a2eee9930313",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "4e4417a83beac1eb7e24456a05f6ba5569a24169792e9a07f6e6f4736fa972dccfce3d920f0e01f0",
+          "tag" : "472d5dd582dc05ef5fc496b612023cb2",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 113,
+          "comment" : "J0:000102030405060708090a0b7fffffff",
+          "key" : "00112233445566778899aabbccddeeff1021324354657687",
+          "iv" : "f7a02ecca03064b2ef3cce9feab79f07",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "6f8e174efca3097299f784efd4caff0bf168c3e5165b9ad3d20062009848044eef8f31f7d2fead05",
+          "tag" : "caff723826df150934aee3201ba175e7",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 114,
+          "comment" : "J0:000102030405060708090a0b7ffffffe",
+          "key" : "00112233445566778899aabbccddeeff1021324354657687",
+          "iv" : "6985924901d688659b40a999d974dbfd",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "af193090ce3d43a388a1d294a09616906f8e174efca3097299f784efd4caff0bf168c3e5165b9ad3",
+          "tag" : "3b08958be1286c2b4acba02b3674adb2",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 115,
+          "comment" : "J0:000102030405060708090a0bffff7fff",
+          "key" : "00112233445566778899aabbccddeeff1021324354657687",
+          "iv" : "3f1188546c65ed0fc55e75032c68ee44",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "5deccf838b2cf5f869c90d2a611160b1e578ab8121b93735cba4a1930647b8c4c84bf776333ee45a",
+          "tag" : "c14d52208f0f51b816a48971eaf8ff7e",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 116,
+          "comment" : "J0:000102030405060708090a0bffff7ffe",
+          "key" : "00112233445566778899aabbccddeeff1021324354657687",
+          "iv" : "a13434d1cd8301d8b12212051fabaabe",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "d2cae1684aa407a13a2e2da5357e29f55deccf838b2cf5f869c90d2a611160b1e578ab8121b93735",
+          "tag" : "ea2d018099cd7925c507cef0ceddb0ae",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 117,
+          "comment" : "special case",
+          "key" : "00112233445566778899aabbccddeeff1021324354657687",
+          "iv" : "00000000000000000000000000000000",
+          "aad" : "",
+          "msg" : "5c7d3f81d4b5055ed6f8db53614587a4",
+          "ct" : "541b835dc828d541073f7d7d7504ebf5",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "special case",
+          "key" : "00112233445566778899aabbccddeeff1021324354657687",
+          "iv" : "ffffffffffffffffffffffffffffffff",
+          "aad" : "",
+          "msg" : "6a347ad1190e72ede611044e7475f0eb",
+          "ct" : "a3f36154331c196624564bc395e49c3b",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "",
+          "key" : "cee9abbc26b63e169f0ced621fe21d95904e75b881d93e6b",
+          "iv" : "1e8259e0a43e571068f701cd2064fc0c",
+          "aad" : "",
+          "msg" : "46",
+          "ct" : "dc",
+          "tag" : "af1f5535b125b34fc466902ea40cb3a2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "",
+          "key" : "189f0bd390ba40632586a45c39735c2b87113329c800f394",
+          "iv" : "c84442d6975f0359737de0fa828f958e",
+          "aad" : "",
+          "msg" : "b4bcd7b8eeca3050dd17682c6a914e",
+          "ct" : "2aab5c87dcb4a4dae4e975ddb65aab",
+          "tag" : "6b03b7557c7131e2352e495d54e61aef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "",
+          "key" : "b0724f15df5b792c2f49bc51df0ac5aad69be0030981613c",
+          "iv" : "13cd526ec77b58f62d48d03f8b88f2b8",
+          "aad" : "",
+          "msg" : "8da3ab9c3d195b04df452ad23953da4d",
+          "ct" : "d127fd2e67c0887d90eb92b91f357d97",
+          "tag" : "eb05bda937faeed27f8833295d4ba559",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "",
+          "key" : "998750ba784841e40a7c5b03985732b6397e5459a3843954",
+          "iv" : "1d3d62eccd8ac5e896f2654a7f606fc9",
+          "aad" : "",
+          "msg" : "2f60ca3494a958dc3e6ebeb5d0b4e6dda0d0c4331ab9c957f6422a5100878ebf",
+          "ct" : "344c2cea17b06cb3da272e22a22a3a71ee0eaa1959a7facfff464660ddccedd1",
+          "tag" : "bab7fbf499ff06aad5f757b1c1a4fcc0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 96,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 123,
+          "comment" : "special case",
+          "key" : "00112233445566778899aabbccddeeff1021324354657687",
+          "iv" : "000000000000000000000000",
+          "aad" : "",
+          "msg" : "0b4dbbba8982e0f649f8ba85f3aa061b",
+          "ct" : "3f875c9bd7d8511448459468e398c3b2",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "special case",
+          "key" : "00112233445566778899aabbccddeeff1021324354657687",
+          "iv" : "ffffffffffffffffffffffff",
+          "aad" : "",
+          "msg" : "1ae93688ef7e2650a9342ad4718b2780",
+          "ct" : "210dabea4364c6d5b3429e7743322936",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "",
+          "key" : "21218af790428f8024d3e7e1428c9fcf578c216636d60e73",
+          "iv" : "34047bc39b9c608384dff5b8",
+          "aad" : "",
+          "msg" : "e3",
+          "ct" : "fe",
+          "tag" : "2e982e24b81cd120d35a70fe6935e665",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "",
+          "key" : "3a8bf543c480925632118245bcbf5d01522b987a31a33da3",
+          "iv" : "4ebc13cf4636cc7c45e560a7",
+          "aad" : "",
+          "msg" : "53fc72e71b59eeb3",
+          "ct" : "99f2ff1c8a44e5f2",
+          "tag" : "6870f104ddc514477b400336fb01860e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "",
+          "key" : "92f4d2672fceec43963ccffb17e6ea7578b11418b06a3b82",
+          "iv" : "6e7ff7f0797685cfc44b05ff",
+          "aad" : "",
+          "msg" : "c3ec16adb184affa8ae9738bffb916",
+          "ct" : "afe8ef41591bfcc00db3c880ceb186",
+          "tag" : "29fff7f285768645c9c8bf7a471c9393",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "",
+          "key" : "bcb6bc5ee6743df1396a34639327b25809ec9c81dd6a0c0e",
+          "iv" : "be0326d23bdc2c64648d13f4",
+          "aad" : "",
+          "msg" : "80474a3a3b809560eee2ce7a7a33ea07",
+          "ct" : "90339dca02ef717f1603994aee6cf6d2",
+          "tag" : "e3d33e01ce64f271783147de226228bc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "",
+          "key" : "5e1d28213e092536525bbae09e214af4c891e202b2b4fa4f",
+          "iv" : "b6be6cd0681235d826aa28ea",
+          "aad" : "",
+          "msg" : "53d59433a7db7f41b31ccb6d4a2d789965",
+          "ct" : "b98ed6321679941a3e521834296686ad98",
+          "tag" : "9f50c03e055e519712c582ec9db3235b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "",
+          "key" : "7f672d85e151aa490bc0eec8f66b5e5bee74af11642be3ff",
+          "iv" : "b022067048505b20946216ef",
+          "aad" : "",
+          "msg" : "ef6412c72b03c643fa02565a0ae2378a9311c11a84065f80",
+          "ct" : "addd303651119e52f6170dfc7a915064253d57532987b9ab",
+          "tag" : "fa0484f8baa95f5b7a31c56d1b34c58b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "",
+          "key" : "969fed5068541d65418c2c1de8fe1f845e036030496e1272",
+          "iv" : "817fe51c31f2879141a34335",
+          "aad" : "cb",
+          "msg" : "3d8233191a2823bf767e99167b1d4af4f4848458",
+          "ct" : "0d2c3a3c0cc4b40e70ed45e188e356a0e1533b31",
+          "tag" : "92909a80e90540e1878ab59ef300072b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "",
+          "key" : "fa5b9b41f93f8b682c04ba816c3fecc24eec095b04dd7497",
+          "iv" : "62b9cf1e923bc1138d05d205",
+          "aad" : "2ed8487153e21b12",
+          "msg" : "18159841813a69fc0f8f4229e1678da7c9016711",
+          "ct" : "c7c1cbb85ce2a0a3f32cb9ef01ad45ec1118b66d",
+          "tag" : "253317f98bdab87531ece20475cd9ebb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "",
+          "key" : "fbfb395662787e2d25a2e7510f818e825936a35114e237c9",
+          "iv" : "3f1a1e02e90a4ba7a1db9df2",
+          "aad" : "74318d8876528243f1944b73eb77e96e",
+          "msg" : "2952a3d64107d5cbb9602239d05a5c5c222cf72b",
+          "ct" : "ecf5e403f19c007c8da7a456caf0a6d75762829b",
+          "tag" : "e0877a100f9dd9d6795f0e74c56a9fab",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "",
+          "key" : "5d8e9c2222316c9ed5ff94513cc957436ae447a6e1a73a29",
+          "iv" : "0802ae86c75a73bf79561521",
+          "aad" : "5ca354a4cb8e4fc9798aa209ad4f739dc7c232fdd1f22584",
+          "msg" : "42b4439e1d2116f834b91c516a26299df279956b",
+          "ct" : "94d844d98b9467daa7e8dde7f4290037354d7fb2",
+          "tag" : "62196638590cef429d6b1d1a59839c02",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b5e44c5b2fe90e4c78f358da0d99cb64",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b6e44c5b2fe90e4c78f358da0d99cb64",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "34e44c5b2fe90e4c78f358da0d99cb64",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b4e54c5b2fe90e4c78f358da0d99cb64",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b4e44cdb2fe90e4c78f358da0d99cb64",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b4e44c5b2ee90e4c78f358da0d99cb64",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b4e44c5b2de90e4c78f358da0d99cb64",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b4e44c5b2fe90ecc78f358da0d99cb64",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b4e44c5b2fe90e4c79f358da0d99cb64",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b4e44c5b2fe90e4cf8f358da0d99cb64",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 145,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b4e44c5b2fe90e4c78d358da0d99cb64",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 146,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b4e44c5b2fe90e4c78f359da0d99cb64",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 147,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b4e44c5b2fe90e4c78f358da0c99cb64",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 148,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b4e44c5b2fe90e4c78f358da0f99cb64",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 149,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b4e44c5b2fe90e4c78f358da8d99cb64",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 150,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b4e44c5b2fe90e4c78f358da0d99cb65",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 151,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b4e44c5b2fe90e4c78f358da0d99cb66",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b4e44c5b2fe90e4c78f358da0d99cb24",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 153,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b4e44c5b2fe90e4c78f358da0d99cbe4",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 154,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b5e44c5b2fe90e4c79f358da0d99cb64",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 155,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b4e44cdb2fe90ecc78f358da0d99cb64",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 156,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b4e44c5b2fe90ecc78f358da0d99cbe4",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 157,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "4b1bb3a4d016f1b3870ca725f266349b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 158,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 159,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 160,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "3464ccdbaf698eccf873d85a8d194be4",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 161,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "iv" : "505152535455565758595a5b",
+          "aad" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f",
+          "ct" : "458256842dfd297f30bd2f8f15c92db0",
+          "tag" : "b5e54d5a2ee80f4d79f259db0c98ca65",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 128,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 162,
+          "comment" : "J0:000102030405060708090a0b0c0d0e0f",
+          "key" : "00112233445566778899aabbccddeeff102132435465768798a9bacbdcedfe0f",
+          "iv" : "5c2ea9b695fcf6e264b96074d6bfa572",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "28e1c5232f4ee8161dbe4c036309e0b3254e9212bef0a93431ce5e5604c8f6a73c18a3183018b770",
+          "tag" : "d5808a1bd11a01129bf3c6919aff2339",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "J0:00000000000000000000000000000000",
+          "key" : "00112233445566778899aabbccddeeff102132435465768798a9bacbdcedfe0f",
+          "iv" : "57b3a81f2c36b6b06577ca0fbab8fa8e",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "cceebeb4fe4cd90c514e52d2327a2ecd75393661006cf2476d8620149aef3d1cdce491fff3e7a7a3",
+          "tag" : "8132e865b69d64ef37db261f80cbbe24",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "J0:ffffffffffffffffffffffffffffffff",
+          "key" : "00112233445566778899aabbccddeeff102132435465768798a9bacbdcedfe0f",
+          "iv" : "ce20a7e870696a5e68533c465bad2ba1",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "4f4350565d91d9aa8c5f4048550492ad6d6fdabf66da5d1e2af7bfe1a8aadaa0baa3de38a41d9713",
+          "tag" : "155da6441ec071ef2d8e6cffbacc1c7c",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "J0:fffffffffffffffffffffffffffffffe",
+          "key" : "00112233445566778899aabbccddeeff102132435465768798a9bacbdcedfe0f",
+          "iv" : "918e3c19dbdfee2db18156c5b93f3d75",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "8316a53167b6de1a7575700693ffef274f4350565d91d9aa8c5f4048550492ad6d6fdabf66da5d1e",
+          "tag" : "6c574aa6a2490cc3b2f2f8f0ffbc56c4",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "J0:fffffffffffffffffffffffffffffffd",
+          "key" : "00112233445566778899aabbccddeeff102132435465768798a9bacbdcedfe0f",
+          "iv" : "717d900b270462b9dbf7e9419e890609",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "5175927513e751eb309f45bc2ef225f28316a53167b6de1a7575700693ffef274f4350565d91d9aa",
+          "tag" : "8082a761e1d755344bf29622144e7d39",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "J0:000102030405060708090a0bffffffff",
+          "key" : "00112233445566778899aabbccddeeff102132435465768798a9bacbdcedfe0f",
+          "iv" : "ecd52120af240e9b4bf3b9d1eeb49434",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "36b3fbecd09178d04527fb37544f5579d20d60a41266f685c48098e1a52804ca387d90709d3268dd",
+          "tag" : "033e0ef2953ebfd8425737c7d393f89a",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "J0:000102030405060708090a0bfffffffe",
+          "key" : "00112233445566778899aabbccddeeff102132435465768798a9bacbdcedfe0f",
+          "iv" : "b37bbad104928ae89221d3520c2682e0",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "16929b773051f12b0adac95f65e21a7f36b3fbecd09178d04527fb37544f5579d20d60a41266f685",
+          "tag" : "ca448bb7e52e897eca234ef343d057d0",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "J0:000102030405060708090a0bfffffffd",
+          "key" : "00112233445566778899aabbccddeeff102132435465768798a9bacbdcedfe0f",
+          "iv" : "538816c3f849067cf8576cd62b90b99c",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "6d3faefaf691d58163846f8d4b9ffd5916929b773051f12b0adac95f65e21a7f36b3fbecd09178d0",
+          "tag" : "84f49740e6757f63dd0df7cb7656d0ef",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "J0:000102030405060708090a0b7fffffff",
+          "key" : "00112233445566778899aabbccddeeff102132435465768798a9bacbdcedfe0f",
+          "iv" : "d10e631943cd3bdababab2bbd13951c0",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "d60196c2d14fcf30c0991d2721ddc52d385f407a16691dade82c9023c855fd8e2e8fbb562102f018",
+          "tag" : "877e15d9889e69a99fcc6d727465c391",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "J0:000102030405060708090a0b7ffffffe",
+          "key" : "00112233445566778899aabbccddeeff102132435465768798a9bacbdcedfe0f",
+          "iv" : "8ea0f8e8e87bbfa96368d83833ab4714",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "948fbceca12a6e4fabb79b6d965e336fd60196c2d14fcf30c0991d2721ddc52d385f407a16691dad",
+          "tag" : "cd5757626945976ba9f0264bd6bee894",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "J0:000102030405060708090a0bffff7fff",
+          "key" : "00112233445566778899aabbccddeeff102132435465768798a9bacbdcedfe0f",
+          "iv" : "7b2df4fbed1de2727eb24898e5deabb9",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "a1a0120660ff52e6b1700b12c54d2d33b94b00cd7882d8857d84e6e183a1dea6ee85a7da84fbc35d",
+          "tag" : "b015d72da62c81cb4d267253b20db9e5",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "J0:000102030405060708090a0bffff7ffe",
+          "key" : "00112233445566778899aabbccddeeff102132435465768798a9bacbdcedfe0f",
+          "iv" : "24836f0a46ab6601a760221b074cbd6d",
+          "aad" : "",
+          "msg" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "5e3434b45edbf0d1f6e02d1144dbf867a1a0120660ff52e6b1700b12c54d2d33b94b00cd7882d885",
+          "tag" : "ee74ccb30d649ebf6916d05a7dbe5696",
+          "result" : "valid",
+          "flags" : [
+            "ConstructedIv"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "special case",
+          "key" : "00112233445566778899aabbccddeeff102132435465768798a9bacbdcedfe0f",
+          "iv" : "00000000000000000000000000000000",
+          "aad" : "",
+          "msg" : "8d74f1c97243d362577ff376c393d2dc",
+          "ct" : "265c42e2b96ea1de9c24f7182e337390",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 175,
+          "comment" : "special case",
+          "key" : "00112233445566778899aabbccddeeff102132435465768798a9bacbdcedfe0f",
+          "iv" : "ffffffffffffffffffffffffffffffff",
+          "aad" : "",
+          "msg" : "884df0e76f3ce227bf9595d103825a46",
+          "ct" : "988f47668ea650cbaa6714711abe268d",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 176,
+          "comment" : "",
+          "key" : "b7797eb0c1a6089ad5452d81fdb14828c040ddc4589c32b565aad8cb4de3e4a0",
+          "iv" : "0ad570d8863918fe89124e09d125a271",
+          "aad" : "",
+          "msg" : "ed",
+          "ct" : "3f",
+          "tag" : "fd8f593b83314e33c5a72efbeb7095e8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 177,
+          "comment" : "",
+          "key" : "4c010d9561c7234c308c01cea3040c925a9f324dc958ff904ae39b37e60e1e03",
+          "iv" : "2a55caa137c5b0b66cf3809eb8f730c4",
+          "aad" : "",
+          "msg" : "2a093c9ed72b8ff4994201e9f9e010",
+          "ct" : "041341078f0439e50b43c991635117",
+          "tag" : "5b8a2f2da20ef657c903da88ef5f57bb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 178,
+          "comment" : "",
+          "key" : "e7f7a48df99edd92b81f508618aa96526b279debd9ddb292d385ddbae80b2259",
+          "iv" : "7ee376910f08f497aa6c3aa7113697fd",
+          "aad" : "",
+          "msg" : "5e51dbbb861b5ec60751c0996e00527f",
+          "ct" : "469478d448f7e97d755541aa09ad95b0",
+          "tag" : "254ada5cf662d90c5e11b2bd9c4db4c4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 179,
+          "comment" : "",
+          "key" : "4f84782bfbb64a973c3de3dcfa3430367fd68bc0b4c3b31e5d7c8141ba3e6a67",
+          "iv" : "5d1bde6fa0994b33efd8f23f531248a7",
+          "aad" : "",
+          "msg" : "78cb6650a1908a842101ea85804fed00cc56fbdafafba0ef4d1ca607dcae57b6",
+          "ct" : "cb960201fa5ad41d41d1c2c8037c71d52b72e76b16b589d71b976627c9734c9d",
+          "tag" : "8dfce16467c3a6ebb3e7242c9a551962",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 120,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 180,
+          "comment" : "unusual IV size",
+          "key" : "34c74e28182948e03af02a01f46eb4f7",
+          "iv" : "b0a73119a97d623806b49d45ddf4c7",
+          "aad" : "",
+          "msg" : "fe82ba66cf2e265741f2c86c",
+          "ct" : "2bc3ef8e7402b4631f48e9be",
+          "tag" : "4b6f6f5be291a90b9e93a8a82ddbc8d8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 160,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 181,
+          "comment" : "unusual IV size",
+          "key" : "55cb7cac77efe18a1ea3b30c65f3f346",
+          "iv" : "e22b6b144ab26b5781316e7a42a76202ac4b2278",
+          "aad" : "",
+          "msg" : "2f3d11ea32bf5bc72cbe2b8d",
+          "ct" : "4fe13ef29f118f85a63188f8",
+          "tag" : "05975b175316df8045889f43e0c857e0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 64,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 182,
+          "comment" : "unusual IV size",
+          "key" : "f6a4bf8c4e15034699ce5801cbbac7509cd3f94cf28d8307",
+          "iv" : "60d6bfca67f5d810",
+          "aad" : "",
+          "msg" : "de8eaa41e5e6a590c3cfbf61",
+          "ct" : "a2966fb189f8d9d391503857",
+          "tag" : "e370e7dd328655929bd4691f396a1033",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 120,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 183,
+          "comment" : "unusual IV size",
+          "key" : "66f75acbd8d3acf7af47d13e8384c2809d6b91503a7f294b",
+          "iv" : "edf93e16294f15eded83808f09320e",
+          "aad" : "",
+          "msg" : "a900c86b6b7e0e5563f8f826",
+          "ct" : "9af1a022c61c4315aa0e923e",
+          "tag" : "20529bff3c59222ec33353af337b1d40",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 160,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 184,
+          "comment" : "unusual IV size",
+          "key" : "ef2e299dd4ecd7e3b9cc62780922cc2c89f78840564d1276",
+          "iv" : "130c14c839e35b7d56b3350b194b0da342e6b65d",
+          "aad" : "",
+          "msg" : "03f59579b14437199583270e",
+          "ct" : "073a5291b11df379f31b4f16",
+          "tag" : "17205999491bd4c1d6c7ec3e56779c32",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 64,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 185,
+          "comment" : "unusual IV size",
+          "key" : "df64c84ae52d9ca820a47421bed6e96f7165369fc4c1b65f8f6307b17ce1006c",
+          "iv" : "c0c568a400b7194f",
+          "aad" : "",
+          "msg" : "f5fafdded54a86a4edab44bd",
+          "ct" : "99313a220d1fcb6658876283",
+          "tag" : "00955d7d27f66868cfec734bf59c5e6d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 120,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 186,
+          "comment" : "unusual IV size",
+          "key" : "e98b0669a645eb14cd06df6968fc5f10edc9f54feed264e3d410cdc61b72ef51",
+          "iv" : "17ca250fb733877556263223eadde1",
+          "aad" : "",
+          "msg" : "f384b3ed7b274641f5db60cf",
+          "ct" : "fc213602aa423b87d7c2a874",
+          "tag" : "36b15bab6923b17218fe1c24048e2391",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 160,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 187,
+          "comment" : "unusual IV size",
+          "key" : "849b3e6b8cdd85bdcfb8eb701aa5522ae2340fbe5214e389622cef76979225c4",
+          "iv" : "0f9d6ed7eef362dfa4a7dfa5c0f74c5b27bd4ebf",
+          "aad" : "",
+          "msg" : "8c5564e53051c0de273199b4",
+          "ct" : "c1d76233e8c5042e92bf8d32",
+          "tag" : "7cf036d235d3b2dd349a8c804b65144a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 0,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 188,
+          "comment" : "0 size IV is not valid",
+          "key" : "8f3f52e3c75c58f5cb261f518f4ad30a",
+          "iv" : "",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "cf71978ffcc778f3c85ac9c31b6fe191",
+          "result" : "invalid",
+          "flags" : [
+            "ZeroLengthIv"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "0 size IV is not valid",
+          "key" : "2a4bf90e56b70fdd8649d775c089de3b",
+          "iv" : "",
+          "aad" : "",
+          "msg" : "324ced6cd15ecc5b3741541e22c18ad9",
+          "ct" : "00a29f0a5e2e7490279d1faf8b881c7b",
+          "tag" : "a2c7e8d7a19b884f742dfec3e76c75ee",
+          "result" : "invalid",
+          "flags" : [
+            "ZeroLengthIv"
+          ]
+        }
+      ]
+    },
+    {
+      "ivSize" : 0,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 190,
+          "comment" : "0 size IV is not valid",
+          "key" : "0b18d21337035c7baa08211b702fa780ac7c09be8f9ed11f",
+          "iv" : "",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "ca69a2eb3a096ea36b1015d5dffff532",
+          "result" : "invalid",
+          "flags" : [
+            "ZeroLengthIv"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "0 size IV is not valid",
+          "key" : "ba76d594a6df915bb7ab7e6d1a8d024b2796336c1b8328a9",
+          "iv" : "",
+          "aad" : "",
+          "msg" : "d62f302742d61d823ea991b93430d589",
+          "ct" : "509b0658d09f7a5bb9db43b70c8387f7",
+          "tag" : "2c9488d53a0b2b5308c2757dfac7219f",
+          "result" : "invalid",
+          "flags" : [
+            "ZeroLengthIv"
+          ]
+        }
+      ]
+    },
+    {
+      "ivSize" : 0,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 192,
+          "comment" : "0 size IV is not valid",
+          "key" : "3f8ca47b9a940582644e8ecf9c2d44e8138377a8379c5c11aafe7fec19856cf1",
+          "iv" : "",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "1726aa695fbaa21a1db88455c670a4b0",
+          "result" : "invalid",
+          "flags" : [
+            "ZeroLengthIv"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "0 size IV is not valid",
+          "key" : "7660d10966c6503903a552dde2a809ede9da490e5e5cc3e349da999671809883",
+          "iv" : "",
+          "aad" : "",
+          "msg" : "c314235341debfafa1526bb61044a7f1",
+          "ct" : "7772ea358901f571d3d35c19497639d9",
+          "tag" : "8fe0520ad744a11f0ccfd228454363fa",
+          "result" : "invalid",
+          "flags" : [
+            "ZeroLengthIv"
+          ]
+        }
+      ]
+    },
+    {
+      "ivSize" : 8,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 194,
+          "comment" : "small IV sizes",
+          "key" : "59a284f50aedd8d3e2a91637d3815579",
+          "iv" : "80",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "af498f701d2470695f6e7c8327a2398b",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 195,
+          "comment" : "small IV sizes",
+          "key" : "fec58aa8cf06bfe05de829f27ec77693",
+          "iv" : "9d",
+          "aad" : "",
+          "msg" : "f2d99a9f893378e0757d27c2e3a3101b",
+          "ct" : "0a24612a9d1cbe967dbfe804bf8440e5",
+          "tag" : "96e6fd2cdc707e3ee0a1c90d34c9c36c",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 16,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 196,
+          "comment" : "small IV sizes",
+          "key" : "88a972cce9eaf5a7813ce8149d0c1d0e",
+          "iv" : "0f2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "4ccf1efb4da05b4ae4452aea42f5424b",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 197,
+          "comment" : "small IV sizes",
+          "key" : "b43967ee933e4632bd6562ba1201bf83",
+          "iv" : "8760",
+          "aad" : "",
+          "msg" : "5a6ad6db70591d1e520b0122f05021a0",
+          "ct" : "ba3e7f8b2999995c7fc4006ca4f475ff",
+          "tag" : "98f47a5279cebbcac214515710f6cd8a",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 32,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 198,
+          "comment" : "small IV sizes",
+          "key" : "4e9a97d3ed54c7b54610793ab05052e1",
+          "iv" : "cc851957",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "e574b355bda2980e047e584feb1676ca",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 199,
+          "comment" : "small IV sizes",
+          "key" : "d83c1d7a97c43f182409a4aa5609c1b1",
+          "iv" : "7b5faeb2",
+          "aad" : "",
+          "msg" : "c8f07ba1d65554a9bd40390c30c5529c",
+          "ct" : "1b84baea9df1e65bee7b49e4a8cda1ec",
+          "tag" : "5c0bb79d8240041edce0f94bd4bb384f",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 48,
+      "keySize" : 128,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 200,
+          "comment" : "small IV sizes",
+          "key" : "c6a705677affb49e276d9511caa46145",
+          "iv" : "4ad80c2854fb",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "1e2ed72af590cafb8647d185865f5463",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 201,
+          "comment" : "small IV sizes",
+          "key" : "eba7699b56cc0aa2f66a2a5be9944413",
+          "iv" : "d1dafc8de3e3",
+          "aad" : "",
+          "msg" : "d021e53d9098a2df3d6b903cdad0cd9c",
+          "ct" : "18291aa8dc7b07448aa8f71bb8e380bf",
+          "tag" : "9c0e22e5c41b1039ff5661ffaefa8e0f",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 8,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 202,
+          "comment" : "small IV sizes",
+          "key" : "c70ce38e84e5f53ed41c3f0d2ca493412ad32cb04c6e2efa",
+          "iv" : "cb",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "08d96edb5e22874cd10cb2256ca04bc6",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 203,
+          "comment" : "small IV sizes",
+          "key" : "74c816b83dfd287210a3e2c6da8d3053bbfbd9b156d3fdd8",
+          "iv" : "0f",
+          "aad" : "",
+          "msg" : "f2b7b2c9b312cf2af78f003df15c8e19",
+          "ct" : "6c5e796ba9a3ddc64f401e68d135101d",
+          "tag" : "96a132ed43924e98feb888ff682bdaef",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 16,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 204,
+          "comment" : "small IV sizes",
+          "key" : "cbf45ba488932aea1a10e5862f92e4a7e277bda9f34af6d0",
+          "iv" : "75e5",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "1f0d23070fcd748e25bf6454f5c9136e",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 205,
+          "comment" : "small IV sizes",
+          "key" : "e1c0446f11ae6aa4fa254f9a846fc6e13e45e537e47f2042",
+          "iv" : "8989",
+          "aad" : "",
+          "msg" : "3a2f5ad0eb216e546e0bcaa377b6cbc7",
+          "ct" : "550b48a43e821fd76f49f0f1a897aead",
+          "tag" : "f6e0a979481f9957ddad0f21a777a73a",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 32,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 206,
+          "comment" : "small IV sizes",
+          "key" : "567563bf4cf154902275a53bc57cd6dd7b370d27011bdac8",
+          "iv" : "68d7fc38",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "1475563e3212f3b5e40062569afd71e3",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 207,
+          "comment" : "small IV sizes",
+          "key" : "834d0bb601170865a78139428a1503695a6a291ebd747cd1",
+          "iv" : "bb9d2aa3",
+          "aad" : "",
+          "msg" : "6f79e18b4acd5a03d3a5f7e1a8d0f183",
+          "ct" : "309133e76159fe8a41b20843486511ab",
+          "tag" : "03ab26993b701910a2e8ecccd2ba9e52",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 48,
+      "keySize" : 192,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 208,
+          "comment" : "small IV sizes",
+          "key" : "99fb18f5ba430bb9ea942968ecb799b43406e1af4b6425a1",
+          "iv" : "a984bdcdcae2",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "d7b9a6b58a97982916e83219fbf71b1e",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 209,
+          "comment" : "small IV sizes",
+          "key" : "b77b242aa0d51c92fda013e0cb0ef2437399ace5d3f507e4",
+          "iv" : "52aa01e0d0d6",
+          "aad" : "",
+          "msg" : "4ba541a9914729216153801340ab1779",
+          "ct" : "e08261e46eaf90d978ea8f7889bccd4f",
+          "tag" : "c052a55df3926a50990a532efe3d80ec",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 8,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 210,
+          "comment" : "small IV sizes",
+          "key" : "8f9a38c1014966e4d9ae736139c5e79b99345874f42d4c7d2c81aa6797c417c0",
+          "iv" : "a9",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "2a268bf3a75fd7b00ba230b904bbb014",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 211,
+          "comment" : "small IV sizes",
+          "key" : "144cd8279229e8bb2de99d24e615306663913fe9177fcd270fafec493d43bca1",
+          "iv" : "b3",
+          "aad" : "",
+          "msg" : "976229f5538f9636476d69f0c328e29d",
+          "ct" : "7bea30ecc2f73f8e121263b37966954c",
+          "tag" : "8bbad4adc54b37a2b2f0f6e8617548c9",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 16,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 212,
+          "comment" : "small IV sizes",
+          "key" : "7d31861f9d3536e14016a3216b1042e0d2f7d4614314268b6f834ec7f38bbb65",
+          "iv" : "c332",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "1d978a693120c11f6d51a3ed88cd4ace",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 213,
+          "comment" : "small IV sizes",
+          "key" : "22b35fe9623ee11f8b60b6d22db3765b666ed972fa7ccd92b45f22deee02cab1",
+          "iv" : "da6c",
+          "aad" : "",
+          "msg" : "5341c78e4ce5bf8fbc3e077d1990dd5d",
+          "ct" : "9c39f5b110361e9a770cc5e8b0f444bb",
+          "tag" : "b63ff43c12073ec5572b1be70f17e231",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 32,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 214,
+          "comment" : "small IV sizes",
+          "key" : "c224e0bba3d7a99165f7996b67a0fce3e12f2c01179b197b69b7e628bca92096",
+          "iv" : "6b30145e",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "ae6f7c9a29f0d8204ca50b14a1e0dcf2",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 215,
+          "comment" : "small IV sizes",
+          "key" : "093eb12343537ee8e91c1f715b862603f8daf9d4e1d7d67212a9d68e5aac9358",
+          "iv" : "5110604c",
+          "aad" : "",
+          "msg" : "33efb58c91e8c70271870ec00fe2e202",
+          "ct" : "f73f72f976a296ba3ca94bc6eb08cd46",
+          "tag" : "b824c33c13f289429659aa017c632f71",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 48,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 216,
+          "comment" : "small IV sizes",
+          "key" : "98e6f8ab673e804e865e32403a6551bf807a959343c60d34559360bc295ecb5b",
+          "iv" : "d4d857510888",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "3db16725fafc828d414ab61c16a6c38f",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "small IV sizes",
+          "key" : "0bd0e8e7781166e1d876dec8fad34ba95b032a27cac0551595116091005947b7",
+          "iv" : "1bdcd44b663e",
+          "aad" : "",
+          "msg" : "91222263b12cf5616a049cbe29ab9b5b",
+          "ct" : "ed463f4f43336af3f4d7e08770201145",
+          "tag" : "c8fc39906aca0c64e14a43ff750abd8a",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/aes_siv_cmac_test.json b/third_party/wycheproof/testvectors/aes_siv_cmac_test.json
new file mode 100644
index 0000000..9797fe4
--- /dev/null
+++ b/third_party/wycheproof/testvectors/aes_siv_cmac_test.json
@@ -0,0 +1,4184 @@
+{
+  "algorithm" : "AES-SIV-CMAC",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "EdgeCaseSiv" : "The SIV of this test vector has an edge case value. One purpose of these test vectors is to detect implementations where integer overflows of the counter is incorrectly implemented. AES-SIV itself prevents such overflow problems by clearing some msbs in the IV."
+  },
+  "numberOfTests" : 442,
+  "header" : [],
+  "testGroups" : [
+    {
+      "keySize" : 256,
+      "type" : "DaeadTest",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "RFC 5297",
+          "key" : "fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "aad" : "101112131415161718191a1b1c1d1e1f2021222324252627",
+          "msg" : "112233445566778899aabbccddee",
+          "ct" : "85632d07c6e8f37f950acd320a2ecc9340c02b9690c4dc04daef7f6afe5c",
+          "result" : "valid"
+        },
+        {
+          "tcId" : 2,
+          "comment" : "empty message",
+          "key" : "2b27e429fb6c02678e589ccc4437c5adfb44b331ab6d21ea321727e6ec03d354",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "b2b2354e3724dcdaa85ecf029b49a90c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "empty message",
+          "key" : "e40992eb4f649e5d49134652aecc24bafa6b45ce8dd9e9d371ede7d5de84fa72",
+          "aad" : "8268c5194a71aed0fc1dafe3",
+          "msg" : "",
+          "ct" : "92bc07ee200fbd488b7f70a10da26a21",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "empty message",
+          "key" : "99037935e620da1d67faf1e26d5a0e2c5ac2eae5eec7cbb7b7a613056f6719e3",
+          "aad" : "24ab40e7966c5bfe8a5d2b0a6a9765",
+          "msg" : "",
+          "ct" : "f44934d6f5ba77122f198599cd0e5e52",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "empty message",
+          "key" : "7bf9e536b66a215c22233fe2daaa743a898b9acb9f7802de70b40e3d6e43ef97",
+          "aad" : "9ffff196befb5ffba01afa9235418d57",
+          "msg" : "",
+          "ct" : "c11ab0ae193018d2c9c7985aec3f8a5b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "empty message",
+          "key" : "ea7081db53ce49559f9fd2b53e00f91b68c2bdba946961da1a5bc70918297a43",
+          "aad" : "a9efd155159b533f2b649b2e5fbf87e6a2c11ee8",
+          "msg" : "",
+          "ct" : "cf52a3c9e2d3d99a66f74135f39e28bb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "empty message",
+          "key" : "1e225cafb90339bba1b24076d4206c3e79c355805d851682bc818baa4f5a7779",
+          "aad" : "896dcdb367f3c76d60093dc5ae09bc4f30e5cb88e3434e6eb0f0700ac752cd97",
+          "msg" : "",
+          "ct" : "8f603b65e767ef178b4dd11db6c114c1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "message size divisible by block size",
+          "key" : "612e837843ceae7f61d49625faa7e7494f9253e20cb3adcea686512b043936cd",
+          "aad" : "865d39ae9b5e9ff8d6308e00208745bc",
+          "msg" : "cc37fae15f745a2f40e2c8b192f2b38d",
+          "ct" : "c79c86cd7509e60a16ca8cec6bcaa1c58fbd6099718991fe775bf5a659d30a24",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "message size divisible by block size",
+          "key" : "96e1e4896fb2cd05f133a6a100bc5609a7ac3ca6d81721e922dadd69ad07a892",
+          "aad" : "8ee21f1a5e2b3f8b8f2064e5cecac81d",
+          "msg" : "91a17e4dfcc3166a1add26ff0e7c12056e8a654f28a6de24f4ba739ceb5b5b18",
+          "ct" : "849195031e8927a1af4f64cbdd8048461c03598bfba441312776a4e8ac959bee44c521801287a2fd95e2329b1c694441",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "message size divisible by block size",
+          "key" : "649e373e681ef52e3c10ac265484750932a9918f28fb824f7cb50adab39781fe",
+          "aad" : "3a8363f51bce891eba7bcc0aa4311e10",
+          "msg" : "39b447bd3a01983c1cb761b456d69000948ceb870562a536126a0d18a8e7e49b16de8fe672f13d0808d8b7d957899917",
+          "ct" : "9f66765a019277a7a7acb92e80f8300baa724c92560951eb09d855f471fe1b589928e51f7a8a4bbc6cc9f55fabb2eca2ebb4faca14d1ae20cfdc31b9602e9891",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "small plaintext size",
+          "key" : "298962335a075e9eacb7a7627beafa4ee5a02242423cdfb0b4f106eb61cf5663",
+          "aad" : "4c375fd3c4d45c5cfff16d55",
+          "msg" : "49",
+          "ct" : "f5c8155c7dd7f47c61d980ccd2175beb9b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "small plaintext size",
+          "key" : "ea1a7831e6fd080456507a996b6d71668c2cec43c757539c3b5342fadbe64dc4",
+          "aad" : "599f61c649e7cc5cbbd7a78f",
+          "msg" : "7c0c",
+          "ct" : "130e8de11080a3b27cc1ef1272586c24717c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "small plaintext size",
+          "key" : "009e8288da0a3d22aeaa231fbbfde9ed901d22df9f3ab707e15aa2fc390d0679",
+          "aad" : "9a582245b46c6170e3f5ca53",
+          "msg" : "2f5c53",
+          "ct" : "b98902dc89e6811dfba5eafb1561186dc1849e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "small plaintext size",
+          "key" : "b6202ef3dad5a42667f020f0e4bd89d845711da77f98c747eb914de869638bcf",
+          "aad" : "eab41f3417c79bc7262c7b64",
+          "msg" : "41ec7178",
+          "ct" : "cd824717886f3363622937bcd118960a0e2605fe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "small plaintext size",
+          "key" : "fa82aef8c8d6e3cd8f8d053ea6b1b07ca3bc0152506d464926630d6fd83e8a72",
+          "aad" : "e9a4b08a8e2ebbb13f82f870",
+          "msg" : "ebe656a97b",
+          "ct" : "85288834b25f27e96083e2f360d3c7e7486519b4f5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "small plaintext size",
+          "key" : "4ed237ae3d066df766bea923116bf9d2ce6f63d34a4f56ed8631baccabd70647",
+          "aad" : "fca537f50d5fce3cdc994b70",
+          "msg" : "82f0d49b77a5",
+          "ct" : "9acd6ee8a827c2c5d0da7bf7815dbd8511bd8c5a79c1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "small plaintext size",
+          "key" : "56df5d41a110a63acc7b7c045be9f35a8f2faf16d83fb559268eb8963484f552",
+          "aad" : "95dceafcd426a9bcbe99b842",
+          "msg" : "1d635248014c3b",
+          "ct" : "f7c739f6a0e20e94265ecbbdaec36cd597088967917d47",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "small plaintext size",
+          "key" : "2e94a84c78be80cd598366058d4f6cdf8095666dcac7a00ad832d9f33e20d13c",
+          "aad" : "0c784125715b7f9b1067b077",
+          "msg" : "b978587bf028558d",
+          "ct" : "163833ac904d30589cad9a002bd702f5c7809b04693fd8fb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "small plaintext size",
+          "key" : "60bf711a162cf6a1b108d1351f9fd2ee5022a9df3c5e494268226b17518a93b7",
+          "aad" : "53353976f18ae8c8cbc7e066",
+          "msg" : "078a6a3d7d1d312004",
+          "ct" : "87a37e3de3690b11fba089c068e1c1ea17a4d05ecfb0a97631",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "small plaintext size",
+          "key" : "5aadf8dd380e4287582155f11165b31dc8ed76946889a2bb8633990fb62fc46f",
+          "aad" : "0baed8c06718697b4e845acb",
+          "msg" : "435e101a1a4416abe5ce",
+          "ct" : "1ee7891afbc92d52282eb3fdada6f886ae613f6d60e5d8c1a3a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "small plaintext size",
+          "key" : "b099c4a613f5efda82b069d9a76c02a4049c12310e25f272dbd9d155aedd8d52",
+          "aad" : "30699dc6f497215acda15441",
+          "msg" : "ccb3e3e1bbf6c3b03c257b",
+          "ct" : "a78a01331bb6da90967319859434dbfdd2f9b9c68265c190e28ba3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "small plaintext size",
+          "key" : "dd0655b5099c4acb60c8afacede1b6ac04283c4fcdd1fee2f5aaa6d86bf6c025",
+          "aad" : "164400936032de67a4660b87",
+          "msg" : "6c9a0029bfc98973676d4208",
+          "ct" : "1a104a2de459a3aa9f7b501438b120602de27a8d259ae4f58ef50294",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "small plaintext size",
+          "key" : "aa6285693fc40a59ebc2bdab16f1e9111ec794ce5ec63b8f89fafe1b7fedfacf",
+          "aad" : "009002fcf132820ad3838938",
+          "msg" : "9e9813cd498166220bd0d49da9",
+          "ct" : "3d8175b843301690089b8aa54136d698ccd3d88a5d02a3a65f2b115b00",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "small plaintext size",
+          "key" : "18a4688da2ad1e112ea56ef6da9107e0f1094eeed3f6b868202952d56e0f8239",
+          "aad" : "52dfc32bab8bc1502d18a334",
+          "msg" : "2e7a1b4c808c1cf4e64e8c5ce54f",
+          "ct" : "9fc042a08918741e2b7beab9cd79d7626214d8960091cf305256e549ee36",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "small plaintext size",
+          "key" : "95b330aa5fffa6c0e29fd6fa0debdcb9cf6b448820bea24875089ec8ca5a2387",
+          "aad" : "4dbf5c20ce4caeedfefcae1d",
+          "msg" : "c96596ebba6f89761b9d14dfcc8fb4",
+          "ct" : "91a7f5c4585351b8b76d4a4836a3199aa761e5f9ee1cdd84258a6a3696f7e9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "plaintext size > 16",
+          "key" : "b3b7c2c6d3d80918218afcd8bf2a71cf0220e2e8084ead8ba1abfb893ae36d40",
+          "aad" : "a5c2f6cf309f29c25f5ce35d",
+          "msg" : "dbcf98254157727c35f367fe6e15a2d089",
+          "ct" : "96bf5dd0c28dbd6072b70e2b5b72d3eb9f41adc6d5d877e808fbf15ed4117b5007",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "plaintext size > 16",
+          "key" : "2700a20ef5c3eb4df123568d0df042c35d32b42437efb1032a6a1fe5359767cc",
+          "aad" : "e40e09fea86442dcf2cd176d",
+          "msg" : "3de21865217c94c4f82208ccd62ad57f13ba1f5e",
+          "ct" : "be366ca76d9afe36c7d017c1221e1be41a594e1d853574c06d235775b71cc0b56a7da631",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "plaintext size > 16",
+          "key" : "cc5d599aecbed35bb4e13a2f79586dfe42e6382e8fa8326b674f34716d6376f2",
+          "aad" : "34eafb781863d85649f8c9b0",
+          "msg" : "8a69fb2ab53b995daf2cd43fc316690f71e171ffc5ab84f68bae3c038a9fd7",
+          "ct" : "73fb501f903d90c35039c065563a0b8f274610f05b8d988a193460658d325a255e808847f3faf937e0354a93201ab0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "plaintext size > 16",
+          "key" : "71a7adc7222f471c28f682c12d45feed45556000a986035922924ad154ba5fa5",
+          "aad" : "46a65672d2699267ab27da82",
+          "msg" : "227e714e3efa84e48049142edaa311dab285407f9b628b146f1d6132c2500ca28497fbd6e386679c",
+          "ct" : "b30ec3b9c85402c356728391acf04fcc0d02ba85b6a9e90cf846155d4ab3158952bd1791885370bf23ba26d8d23359637b6e24e8763ed107",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "plaintext size > 16",
+          "key" : "83bc39bf7b5faaf0f9223ed2aa761ab32c04993e3fbccd34ee616ffd28ce5766",
+          "aad" : "ed9ec561ecf5e289a1516c9f",
+          "msg" : "f70ef1598f403902dcab4cc23bb1265f34e825b99abc61b26a22b9bbf478c3c1e61e67e98201bc564d022b87b4106aad0c4ca2d30e8927fba5b52a76971ef79a92a1eb6cf4ef87aea6b551567a2c4c41",
+          "ct" : "fafea55bba0680a510ce095d5c8a40a84a76071b8938dcfe99c8c73b049230ac52df7e09769852a6057353a7df7b8d18882ce5369c6bb855f271d88108719a1b5ea5765f549c282639c8bfacc34b5b10991b8fbdae2e42429fb7f0554e0e5611",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "1d7f9cc81b316c518efcd7927e8f7b88",
+          "ct" : "00000000000000000000000000000000f0dcac3115ddbd3d8ec28822e54088d0",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 32,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "f16d4958e933778c54aabcd6fda1cabc",
+          "ct" : "000000000000000000000000000000001cce79a1e7dfa6e05494e366666e39e4",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 33,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "110d3aa6f558c30977870672804064e0",
+          "ct" : "ffffffffffffffffffffffffffffffff01f74b8e43a262001d8357f95489432e",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 34,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "fd1fef36075ad8d4add16d36036ed5d4",
+          "ct" : "ffffffffffffffffffffffffffffffffede59e1eb1a079ddc7d53cbdd7a7f21a",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 35,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "c83e256ba8baec0938e51a60bd819cc1",
+          "ct" : "ffffffffffffffffffffffff7fffffffd8c454431e404d0052e14beb6948bb0f",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 36,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "242cf0fb5ab8f7d4e2b371243eaf2df5",
+          "ct" : "ffffffffffffffffffffffff7fffffff34d681d3ec4256dd88b720afea660a3b",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 37,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "d8c89e8ece83de437eac13ca7b1ebb2c",
+          "ct" : "ffffffffffffffff7fffffffffffffffc832efa678797f4a14a84241afd79ce2",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 38,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "34da4b1e3c81c59ea4fa788ef8300a18",
+          "ct" : "ffffffffffffffff7fffffffffffffff24203a368a7b6497cefe29052cf92dd6",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 39,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "b076687f33460af32b7f0edc3304bfff",
+          "ct" : "fffffffffffffffffffffffffffffffee2149531223f5703d3cce887d0dfe544",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 40,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "5c64bdefc144112ef1296598b02a0ecb",
+          "ct" : "fffffffffffffffffffffffffffffffe0e0640a1d03d4cde099a83c353f15470",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 41,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "656a1c3efeb7d2589bfdd0892cc86923",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 42,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "45c0cc09b8cc0c37f8626b36dab95df32aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 43,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "61e80297b0ba41c54eda58c468502b32da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 44,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "10ecf972c00209652ea6ef4a3b46ea2359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 45,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "666a1c3efeb7d2589bfdd0892cc86923",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 46,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "46c0cc09b8cc0c37f8626b36dab95df32aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 47,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "62e80297b0ba41c54eda58c468502b32da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 48,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "13ecf972c00209652ea6ef4a3b46ea2359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 49,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e46a1c3efeb7d2589bfdd0892cc86923",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 50,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "c4c0cc09b8cc0c37f8626b36dab95df32aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 51,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e0e80297b0ba41c54eda58c468502b32da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 52,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "91ecf972c00209652ea6ef4a3b46ea2359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 53,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "646b1c3efeb7d2589bfdd0892cc86923",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 54,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "44c1cc09b8cc0c37f8626b36dab95df32aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 55,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "60e90297b0ba41c54eda58c468502b32da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 56,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "11edf972c00209652ea6ef4a3b46ea2359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 57,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "646a1cbefeb7d2589bfdd0892cc86923",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 58,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "44c0cc89b8cc0c37f8626b36dab95df32aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 59,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "60e80217b0ba41c54eda58c468502b32da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 60,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "11ecf9f2c00209652ea6ef4a3b46ea2359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 61,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "646a1c3effb7d2589bfdd0892cc86923",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 62,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "44c0cc09b9cc0c37f8626b36dab95df32aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 63,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "60e80297b1ba41c54eda58c468502b32da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 64,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "11ecf972c10209652ea6ef4a3b46ea2359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 65,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "646a1c3efcb7d2589bfdd0892cc86923",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 66,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "44c0cc09bacc0c37f8626b36dab95df32aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 67,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "60e80297b2ba41c54eda58c468502b32da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 68,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "11ecf972c20209652ea6ef4a3b46ea2359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 69,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "646a1c3efeb7d2d89bfdd0892cc86923",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 70,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "44c0cc09b8cc0cb7f8626b36dab95df32aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 71,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "60e80297b0ba41454eda58c468502b32da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 72,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "11ecf972c00209e52ea6ef4a3b46ea2359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 73,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "646a1c3efeb7d2589afdd0892cc86923",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 74,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "44c0cc09b8cc0c37f9626b36dab95df32aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 75,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "60e80297b0ba41c54fda58c468502b32da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 76,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "11ecf972c00209652fa6ef4a3b46ea2359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 77,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "646a1c3efeb7d2581bfdd0892cc86923",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 78,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "44c0cc09b8cc0c3778626b36dab95df32aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 79,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "60e80297b0ba41c5ceda58c468502b32da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 80,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "11ecf972c0020965aea6ef4a3b46ea2359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 81,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "646a1c3efeb7d2589bddd0892cc86923",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 82,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "44c0cc09b8cc0c37f8426b36dab95df32aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 83,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "60e80297b0ba41c54efa58c468502b32da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 84,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "11ecf972c00209652e86ef4a3b46ea2359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 85,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "646a1c3efeb7d2589bfdd1892cc86923",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 86,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "44c0cc09b8cc0c37f8626a36dab95df32aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 87,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "60e80297b0ba41c54eda59c468502b32da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 88,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "11ecf972c00209652ea6ee4a3b46ea2359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 89,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "646a1c3efeb7d2589bfdd0892dc86923",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 90,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "44c0cc09b8cc0c37f8626b36dbb95df32aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 91,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "60e80297b0ba41c54eda58c469502b32da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 92,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "11ecf972c00209652ea6ef4a3a46ea2359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 93,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "646a1c3efeb7d2589bfdd0892ec86923",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 94,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "44c0cc09b8cc0c37f8626b36d8b95df32aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 95,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "60e80297b0ba41c54eda58c46a502b32da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 96,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "11ecf972c00209652ea6ef4a3946ea2359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 97,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "646a1c3efeb7d2589bfdd089acc86923",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 98,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "44c0cc09b8cc0c37f8626b365ab95df32aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 99,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "60e80297b0ba41c54eda58c4e8502b32da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 100,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "11ecf972c00209652ea6ef4abb46ea2359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "646a1c3efeb7d2589bfdd0892cc86922",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "44c0cc09b8cc0c37f8626b36dab95df22aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 103,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "60e80297b0ba41c54eda58c468502b33da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 104,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "11ecf972c00209652ea6ef4a3b46ea2259e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 105,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "646a1c3efeb7d2589bfdd0892cc86921",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 106,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "44c0cc09b8cc0c37f8626b36dab95df12aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 107,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "60e80297b0ba41c54eda58c468502b30da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 108,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "11ecf972c00209652ea6ef4a3b46ea2159e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 109,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "646a1c3efeb7d2589bfdd0892cc86963",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 110,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "44c0cc09b8cc0c37f8626b36dab95db32aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 111,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "60e80297b0ba41c54eda58c468502b72da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 112,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "11ecf972c00209652ea6ef4a3b46ea6359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 113,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "646a1c3efeb7d2589bfdd0892cc869a3",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 114,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "44c0cc09b8cc0c37f8626b36dab95d732aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 115,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "60e80297b0ba41c54eda58c468502bb2da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 116,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "11ecf972c00209652ea6ef4a3b46eaa359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 117,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "656a1c3efeb7d2589afdd0892cc86923",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 118,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "45c0cc09b8cc0c37f9626b36dab95df32aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 119,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "61e80297b0ba41c54fda58c468502b32da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 120,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "10ecf972c00209652fa6ef4a3b46ea2359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 121,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "646a1cbefeb7d2d89bfdd0892cc86923",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 122,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "44c0cc89b8cc0cb7f8626b36dab95df32aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 123,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "60e80217b0ba41454eda58c468502b32da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 124,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "11ecf9f2c00209e52ea6ef4a3b46ea2359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 125,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "646a1c3efeb7d2d89bfdd0892cc869a3",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 126,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "44c0cc09b8cc0cb7f8626b36dab95d732aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 127,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "60e80297b0ba41454eda58c468502bb2da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 128,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "11ecf972c00209e52ea6ef4a3b46eaa359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 129,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "9b95e3c101482da764022f76d33796dc",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 130,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "bb3f33f64733f3c8079d94c92546a20c2aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 131,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "9f17fd684f45be3ab125a73b97afd4cdda4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 132,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "ee13068d3ffdf69ad15910b5c4b915dc59e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "00000000000000000000000000000000",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "000000000000000000000000000000002aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "00000000000000000000000000000000da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "0000000000000000000000000000000059e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 137,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 138,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "ffffffffffffffffffffffffffffffff2aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 139,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "ffffffffffffffffffffffffffffffffda4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 140,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "ffffffffffffffffffffffffffffffff59e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 141,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e4ea9cbe7e3752d81b7d5009ac48e9a3",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 142,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "c4404c89384c8cb778e2ebb65a39dd732aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 143,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e0688217303ac145ce5ad844e8d0abb2da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 144,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "916c79f2408289e5ae266fcabbc66aa359e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 145,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "656b1d3fffb6d3599afcd1882dc96822",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 146,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "45c1cd08b9cd0d36f9636a37dbb85cf22aa03ceafa0e45e6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 147,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "61e90396b1bb40c44fdb59c569512a33da4e0efa57352f1a114e4b3f0cb234c6",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 148,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "10edf873c10308642fa7ee4b3a47eb2259e6faebd6af7063c8660362866f1b2af53a989e",
+          "result" : "invalid"
+        }
+      ]
+    },
+    {
+      "keySize" : 384,
+      "type" : "DaeadTest",
+      "tests" : [
+        {
+          "tcId" : 149,
+          "comment" : "empty message",
+          "key" : "d3d58a2f21e62f5095542e618168ef040922ab7d80b3840055eb9caf5726a8d4a7f071dc40ddb320effc094211735090",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "59e0a9a04cdb1d9d7bee6be8bb06fd61",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 150,
+          "comment" : "empty message",
+          "key" : "ad0f7862386c35fee128ae7ff18db084a0f457fcfc7fe1c5370b145f7fa645a97ba3eb4f90e18941b18e8d89494ec796",
+          "aad" : "b402ae880487cfaa9314549b",
+          "msg" : "",
+          "ct" : "b50be5e46a3912dcacff27115e209e24",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 151,
+          "comment" : "empty message",
+          "key" : "278e770ca600bb23f5d8725bfd0cfc05b91057e79c890a697d41e9ff687c6a14ea48fb228d7f95ab4a93c5ba9d966262",
+          "aad" : "3f33c781ea57ec1c298f402cbbd27e",
+          "msg" : "",
+          "ct" : "2aec07db61e8e403fa04659921ccaf65",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 152,
+          "comment" : "empty message",
+          "key" : "5ad985b9bcb461f9115937b6bde7073fbed9e8bf32245afe5836e8c2f67b3999266ba0d8d9eba6fa978c47ea9ef4690a",
+          "aad" : "bd2aa07a70aca69c4621d91a6686f42a",
+          "msg" : "",
+          "ct" : "863161c67e86648340fc5eab9fb728a7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 153,
+          "comment" : "empty message",
+          "key" : "b65c2a4f88f733142cc66ed9aff47e77f3a6339d30e030290d34be40dfa7b33e37bc2f48ea8617f4e7d60c28c0c01a0d",
+          "aad" : "9ce588daa79d6825305a97572d27674a9602bfeb",
+          "msg" : "",
+          "ct" : "4c9cb52e91ee8fd784e9901b2bbfd07e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 154,
+          "comment" : "empty message",
+          "key" : "4cd9d4d729792e6a599bd59c330ae8a4df4077225c9c633cb59190f3a5d1150fdc38a7fbc687516f82d6354e57281c1a",
+          "aad" : "960dbaaff375101529f193a5b7adc2cd95a36b7222df7e9f6fbf3110e16462a1",
+          "msg" : "",
+          "ct" : "fffc486f0299703902926186e43932d0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 155,
+          "comment" : "message size divisible by block size",
+          "key" : "ca9db62214c3afab385b9086f1cb90d17195d495ef47642dbad06f4e7d0bab136c77885029ad442b30c34c8b5290e7d0",
+          "aad" : "d4dbfdce11f1147e29dd062ea3bbbd17",
+          "msg" : "ded5a13d759903ecd36cb238527776c6",
+          "ct" : "a4e08bdd8ab8cbef46e0fdb8a7ca1097a8f963e45e554a5882496270f9fd6de8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 156,
+          "comment" : "message size divisible by block size",
+          "key" : "c4bb58d73a61eeef0ec23490dc3c3a3e140244c9be88209658cc5654a996db2372c2212ffdc260bbdb92a520c86f96d8",
+          "aad" : "2e4b50221284bc07d7e30b1a6621676d",
+          "msg" : "d0535403fed2c1dec9f858eebd688afe4d0010b2823275d1bacfd564c074415f",
+          "ct" : "0131705a9a6c645f13fe4679bd03daac234bc11db1f0941be0788c1c14bbf95ef1dbfbdf5af786a5a5a3a7d4f35fd169",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 157,
+          "comment" : "message size divisible by block size",
+          "key" : "9eae72a3964bdf14adef8616aa5441577b7bbc324652516b4c29a7b0f3bfa719be49e3d2ae6297588ada652eb45b0a00",
+          "aad" : "999a35705530c2f6a7f2427d6b258836",
+          "msg" : "cd9bfe9821b1a5895737a827b41e0ee271ab2687128bb87f173709b73bf18c7c25822f32282895ca8935db00a1d171db",
+          "ct" : "d237a9dd9ea0f70ebc5526fd5e414f318c8a016bc6ecbcb3de5f0aff9330259e67b4984f13fb7e904ae8ac91d8e35faf41ad860bc9423d2ef596c13e15025cdf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 158,
+          "comment" : "small plaintext size",
+          "key" : "ba783a715ff6ee6d71e3a4a7adb6356687db12cc2954807099f97471c951c7f0c33571d3334d111c4ea33a12365c0061",
+          "aad" : "06b2cd261a3508a7bfd1c049",
+          "msg" : "7e",
+          "ct" : "002abeac978f66d934b9ed06f215c4951d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 159,
+          "comment" : "small plaintext size",
+          "key" : "b5ba35a597be37f8f8168a40e9f47b96077ceced6ac0968a4e5ffabc402199267bcd4f740640c6877441c63e8015d86c",
+          "aad" : "90f605a2cf3ff6e79d6ad4b9",
+          "msg" : "5bff",
+          "ct" : "ae43eb59494a5fe7a7cac8d5d20f7d40177f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 160,
+          "comment" : "small plaintext size",
+          "key" : "17a44937a1f8b8029a7f64137eaa2d7de950b49b0ef2d83994151c7b9dde2e87c5aa3debfa0ad9f028260c6dc2fc7e01",
+          "aad" : "80235b12c840e3fd50dc62fd",
+          "msg" : "8b2a68",
+          "ct" : "6b8c54cd6d99f5470a2461aef614012cee7341",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 161,
+          "comment" : "small plaintext size",
+          "key" : "bff684f086ef3314211ba782a2e7e75a60a9a3df9fc505057f54e2b264fbe2e5eae299879fccd26ca39d1e33b883966e",
+          "aad" : "43634a3668f78c0b00597166",
+          "msg" : "41a1241d",
+          "ct" : "ad0d302a322ca73b5514d8cfd6d40478fc60aee6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 162,
+          "comment" : "small plaintext size",
+          "key" : "379c425581ca8094e47d1ee49fe9a5dd3dd8d68c6c85f8b4cb56849e99698ee73332c8b0cc6da0627c95f2de9ddd0871",
+          "aad" : "26306f1d6a4316522a928715",
+          "msg" : "22faba3076",
+          "ct" : "717e9e25286ac7eb4d5aa50e613046c4296f693bf4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 163,
+          "comment" : "small plaintext size",
+          "key" : "0f11a54e9f03071828944e39a3f5a5538c4c94122e757aa7062afdb90d5e8b4aeb41e681818a149831ab7b25e2ca3b96",
+          "aad" : "8ff666163c2af99f3e653b38",
+          "msg" : "2ef90d77c725",
+          "ct" : "c11178fb46a4334df8044ca1746ddd129ca6185d21e1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 164,
+          "comment" : "small plaintext size",
+          "key" : "e959e0c14f3e0d8dd44162d27f4c333a337332550167731949c6732b23a5dbd9aa3dd801b66543755474f44774e5d823",
+          "aad" : "e5cb907e8df42f0e568e588a",
+          "msg" : "8f1dbfb8c9dd6a",
+          "ct" : "533fa1781af3a3679e5779c9c7c727fa5a1d20d7a89f6c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 165,
+          "comment" : "small plaintext size",
+          "key" : "fe6412c43463c22b98992f8c319b662718255d12277ce62e56ba258ccc7a4694121e6912ed745b4a6e12ff9d38c86ef2",
+          "aad" : "825d771373d6e019043dd2a0",
+          "msg" : "3da09c275906835f",
+          "ct" : "0528c021158609e07d3c71fd363365a644ca61b932c161ba",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 166,
+          "comment" : "small plaintext size",
+          "key" : "71002b321b1e924a45d97302a08f2361af1d2093faf661f04ab47ecca9f5ec9a35be3ccff8a4aed1ff658d195c05aed7",
+          "aad" : "987604cee29b9ee32f26f332",
+          "msg" : "cf1e93a067ed6b4f26",
+          "ct" : "4f4d3533c0a6d2302cc3ce547ca78f1d6dce6f333cca0fe889",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 167,
+          "comment" : "small plaintext size",
+          "key" : "dff1d025a8b62dfbe8fd7d0480e572f1c5e125c1ab4c148e37ff9a8ec5d8a4cf35bc304445be3bc45ed37f92e032af14",
+          "aad" : "80b9534f1e83598235c85690",
+          "msg" : "b81cc3a382a1ad29c1dd",
+          "ct" : "c4c97f0c3530981bcade42a174a65038d8925ed8a5decee8a7c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 168,
+          "comment" : "small plaintext size",
+          "key" : "dae6920703b80500b4197269faf5d74de8e610415e194b423080ebaf6d99873dc307dc4f6d9f32ad0ebad8ad7852690c",
+          "aad" : "1b7a5ce2ff405b019125910b",
+          "msg" : "962c7c7ca5bdfcbcb3eba4",
+          "ct" : "2d60ae19a38f400e0ed78b65db3df852f41f0d1e22c917b42e7c5a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 169,
+          "comment" : "small plaintext size",
+          "key" : "e69ea366fd385e0ed8b9cbb01700654fa28add8e56b7ea683e1fd718511ab0fb22dcd710c530e00fb66f4584fa21e9e6",
+          "aad" : "b55d19772f2776772c04078a",
+          "msg" : "3c32cafeedcce54108e39588",
+          "ct" : "b97290f5f225d05b40704c53ee8fdfcffd972185aa96d4db4b8ddb16",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 170,
+          "comment" : "small plaintext size",
+          "key" : "b60b83856f56cdf89027460a76993fdbde0f2ab01e9dde2fa7c27ef47155ec7caba892b27fd9a31e8923bfc44794cd71",
+          "aad" : "b60c69a4befed39eac27790b",
+          "msg" : "550d0e8b8373a27e4072a5b76c",
+          "ct" : "0afe675b5b92febddc6bd6d450715ad4da97711bfbf3465da408517401",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 171,
+          "comment" : "small plaintext size",
+          "key" : "859698a852a131a3804838f3d012d6088e135b6db160b2ac68e6dfa6ec330dc0d682e406c87c15b9a74affe441749495",
+          "aad" : "29d834bc7bdd2a3e95ae8308",
+          "msg" : "c969bd4b5acf1f7b500f8f21f3c9",
+          "ct" : "92e143e457be47a18ca6827811320ce9c70a1b4e0ef64cf3658b25cd8f51",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 172,
+          "comment" : "small plaintext size",
+          "key" : "ebe1c273ba54b877b937e9906c4063e188efd57bd3a32be825369380f1b9f6b8b6a0c2ab1390e589f6101c5ffb7460c7",
+          "aad" : "c3f0f5c438de5fd85b7a21af",
+          "msg" : "e8d7ac78d2805bfd656634d19b5834",
+          "ct" : "2eea0115c34a461d4de5de4a41b9654b8aa87b4cc944c05057f5b306942a0f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 173,
+          "comment" : "plaintext size > 16",
+          "key" : "80d50fafb3ede5ddbb5058827303a098bf213e47dcff12ea5338a2a0f914d84bff58c8c69c3b151d6dc380fd8f3e4178",
+          "aad" : "b49b12ba140fa8d794a31738",
+          "msg" : "340612da2d2dbbd25d7fa05c775a6ecfa8",
+          "ct" : "adc724b7fabbad1036ded152b968e557a4a1b3f5014f42f84a21ca45727f4b4339",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 174,
+          "comment" : "plaintext size > 16",
+          "key" : "5f6bfe19987d5bf6471dd9e436094f7fe33f8acca3b8a41e277861e202bd7262fc2b0bd3df9b35fa2fc3c579620f00eb",
+          "aad" : "b96c8682cd3ce676b0d79865",
+          "msg" : "1485126d0476bb4b86d087d1892632b53cb4f8a2",
+          "ct" : "8fd1214e80782d7c14007d037feb1ab181fdcb20985887b5ee8d4acf5589924be644947d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 175,
+          "comment" : "plaintext size > 16",
+          "key" : "9ea37352e41b57d61ed837b2ace481870d2413d92bf00f30dbb8fe8d250b3cebd0f64d714cf61a0533d02d372284c6c3",
+          "aad" : "0f1eb4eee461615bc0be8474",
+          "msg" : "80d977965a880bc6bb5e1cc92f234771adb61e7ae7198844623c6b1d1b54ec",
+          "ct" : "0da4c7885ffc4125878efe1d14eb5f64740bcaed915088806c89fb2efdde2a5b0d89aeef6a2324ba2626b42113ee27",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 176,
+          "comment" : "plaintext size > 16",
+          "key" : "25b0b404bb1f78446d0e5cde012ee5832cb403398a3e66e9b5a244b59d8994ee10184a5776f3578faab830e865f8133c",
+          "aad" : "7fe497bacf30af3a85662aa1",
+          "msg" : "b1b197cd7ff68b62e274f5d1046f42f9817163f0a105a0fb7736fa9e5e8f76944a22282af480ee79",
+          "ct" : "b44039f1e5ba808ca055aea6bc2d819d388e3c271cd97c046061e57223bbc2a17aa9b368d5cf281de46f48b34d179c16cc9e9d4600a87af4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 177,
+          "comment" : "plaintext size > 16",
+          "key" : "7e225cf2004a28a091986f131fd43ed111c0693e63433ffc9dad9029c535096397636e13296eb62143162643b13c7546",
+          "aad" : "01685c58b14805d636541179",
+          "msg" : "81c8a10fcd668100dc762125e03627ac4e68d34c72568be438a7a068c27e2f12e2f17823e41fdd13e53616c622d4f320a38f97c2edead9800ed1091c303f10d172a284284d86708e53dedc82f6a7366b",
+          "ct" : "aa3d2cd732974b733597a369d47a680132dd5a944431231e6f77122d40ae70c5d032cc7d62208f428e6a931c7da6e88364d5ce1a4d9403436740b9e714a2c3b239febe6a6a7b42f78894442c912e6a9c22ea9548ef85540ca76d7c6df42b6534",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 178,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "05ae1ded78b927e7bf5560571e177760",
+          "ct" : "0000000000000000000000000000000081460aba44a680fc6c776c00a1e94b6b",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "11a7fae3b1b8297b31bdea77a8d6d67c",
+          "ct" : "00000000000000000000000000000000954fedb48da78e60e29fe6201728ea77",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3de1fd2ff8d5260005edbf9b59b6cf06",
+          "ct" : "ffffffffffffffffffffffffffffffffe8a56dbae884e990cc0df180d5e456ba",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "29e81a2131d4289c8b0535bbef776e1a",
+          "ct" : "fffffffffffffffffffffffffffffffffcac8ab42185e70c42e57ba06325f7a6",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "b3c75b1d29b3d5d09501c429c3b8faf2",
+          "ct" : "ffffffffffffffffffffffff7fffffff6683cb8839e21a405ce18a324fea634e",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "a7cebc13e0b2db4c1be94e0975795bee",
+          "ct" : "ffffffffffffffffffffffff7fffffff728a2c86f0e314dcd2090012f92bc252",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "6a142a8909ed51e7b2d77fd071f230df",
+          "ct" : "ffffffffffffffff7fffffffffffffffbf50ba1c19bc9e777b3731cbfda0a963",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "7e1dcd87c0ec5f7b3c3ff5f0c73391c3",
+          "ct" : "ffffffffffffffff7fffffffffffffffab595d12d0bd90ebf5dfbbeb4b61087f",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "e7202abbfe6fcffa7887a7ef06840040",
+          "ct" : "fffffffffffffffffffffffffffffffea0d032efc9533bf7bb8ac7af5c9c7cdc",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "f329cdb5376ec166f66f2dcfb045a15c",
+          "ct" : "fffffffffffffffffffffffffffffffeb4d9d5e10052356b35624d8fea5dddc0",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e94dda18e98cc8139cbdfd2271d8bae0",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 189,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a359304879d74e14fdf520588d3888f07ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 190,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e98ecb00ac9a462cdce6242b1b4951e4738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 191,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c259760003211319acd9d2d8fa2608448b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 192,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "ea4dda18e98cc8139cbdfd2271d8bae0",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 193,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a059304879d74e14fdf520588d3888f07ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 194,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "ea8ecb00ac9a462cdce6242b1b4951e4738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 195,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c159760003211319acd9d2d8fa2608448b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 196,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "684dda18e98cc8139cbdfd2271d8bae0",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 197,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "2259304879d74e14fdf520588d3888f07ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "688ecb00ac9a462cdce6242b1b4951e4738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 199,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "4359760003211319acd9d2d8fa2608448b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 200,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e84cda18e98cc8139cbdfd2271d8bae0",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 201,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a258304879d74e14fdf520588d3888f07ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 202,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e88fcb00ac9a462cdce6242b1b4951e4738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 203,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c358760003211319acd9d2d8fa2608448b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 204,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e84dda98e98cc8139cbdfd2271d8bae0",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 205,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a25930c879d74e14fdf520588d3888f07ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 206,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e88ecb80ac9a462cdce6242b1b4951e4738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 207,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c359768003211319acd9d2d8fa2608448b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e84dda18e88cc8139cbdfd2271d8bae0",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a259304878d74e14fdf520588d3888f07ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e88ecb00ad9a462cdce6242b1b4951e4738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c359760002211319acd9d2d8fa2608448b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e84dda18eb8cc8139cbdfd2271d8bae0",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 213,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a25930487bd74e14fdf520588d3888f07ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e88ecb00ae9a462cdce6242b1b4951e4738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 215,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c359760001211319acd9d2d8fa2608448b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 216,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e84dda18e98cc8939cbdfd2271d8bae0",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 217,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a259304879d74e94fdf520588d3888f07ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 218,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e88ecb00ac9a46acdce6242b1b4951e4738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 219,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c359760003211399acd9d2d8fa2608448b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 220,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e84dda18e98cc8139dbdfd2271d8bae0",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 221,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a259304879d74e14fcf520588d3888f07ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 222,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e88ecb00ac9a462cdde6242b1b4951e4738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 223,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c359760003211319add9d2d8fa2608448b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 224,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e84dda18e98cc8131cbdfd2271d8bae0",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 225,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a259304879d74e147df520588d3888f07ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 226,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e88ecb00ac9a462c5ce6242b1b4951e4738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 227,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c3597600032113192cd9d2d8fa2608448b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 228,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e84dda18e98cc8139c9dfd2271d8bae0",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 229,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a259304879d74e14fdd520588d3888f07ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 230,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e88ecb00ac9a462cdcc6242b1b4951e4738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 231,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c359760003211319acf9d2d8fa2608448b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 232,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e84dda18e98cc8139cbdfc2271d8bae0",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 233,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a259304879d74e14fdf521588d3888f07ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 234,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e88ecb00ac9a462cdce6252b1b4951e4738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 235,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c359760003211319acd9d3d8fa2608448b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 236,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e84dda18e98cc8139cbdfd2270d8bae0",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 237,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a259304879d74e14fdf520588c3888f07ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 238,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e88ecb00ac9a462cdce6242b1a4951e4738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 239,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c359760003211319acd9d2d8fb2608448b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 240,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e84dda18e98cc8139cbdfd2273d8bae0",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 241,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a259304879d74e14fdf520588f3888f07ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 242,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e88ecb00ac9a462cdce6242b194951e4738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 243,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c359760003211319acd9d2d8f82608448b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 244,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e84dda18e98cc8139cbdfd22f1d8bae0",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 245,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a259304879d74e14fdf520580d3888f07ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 246,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e88ecb00ac9a462cdce6242b9b4951e4738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 247,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c359760003211319acd9d2d87a2608448b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 248,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e84dda18e98cc8139cbdfd2271d8bae1",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 249,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a259304879d74e14fdf520588d3888f17ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 250,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e88ecb00ac9a462cdce6242b1b4951e5738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 251,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c359760003211319acd9d2d8fa2608458b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 252,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e84dda18e98cc8139cbdfd2271d8bae2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 253,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a259304879d74e14fdf520588d3888f27ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 254,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e88ecb00ac9a462cdce6242b1b4951e6738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 255,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c359760003211319acd9d2d8fa2608468b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 256,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e84dda18e98cc8139cbdfd2271d8baa0",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 257,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a259304879d74e14fdf520588d3888b07ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 258,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e88ecb00ac9a462cdce6242b1b4951a4738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 259,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c359760003211319acd9d2d8fa2608048b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 260,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e84dda18e98cc8139cbdfd2271d8ba60",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 261,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a259304879d74e14fdf520588d3888707ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 262,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e88ecb00ac9a462cdce6242b1b495164738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 263,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c359760003211319acd9d2d8fa2608c48b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 264,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e94dda18e98cc8139dbdfd2271d8bae0",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 265,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a359304879d74e14fcf520588d3888f07ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 266,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e98ecb00ac9a462cdde6242b1b4951e4738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 267,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c259760003211319add9d2d8fa2608448b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 268,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e84dda98e98cc8939cbdfd2271d8bae0",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 269,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a25930c879d74e94fdf520588d3888f07ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 270,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e88ecb80ac9a46acdce6242b1b4951e4738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 271,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c359768003211399acd9d2d8fa2608448b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 272,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e84dda18e98cc8939cbdfd2271d8ba60",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 273,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a259304879d74e94fdf520588d3888707ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 274,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e88ecb00ac9a46acdce6242b1b495164738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 275,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c359760003211399acd9d2d8fa2608c48b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 276,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "17b225e7167337ec634202dd8e27451f",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 277,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "5da6cfb78628b1eb020adfa772c7770f7ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 278,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "177134ff5365b9d32319dbd4e4b6ae1b738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 279,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "3ca689fffcdeece653262d2705d9f7bb8b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 280,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "00000000000000000000000000000000",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 281,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "000000000000000000000000000000007ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 282,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "00000000000000000000000000000000738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 283,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "000000000000000000000000000000008b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 284,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 285,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "ffffffffffffffffffffffffffffffff7ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 286,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "ffffffffffffffffffffffffffffffff738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 287,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "ffffffffffffffffffffffffffffffff8b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 288,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "68cd5a98690c48931c3d7da2f1583a60",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 289,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "22d9b0c8f957ce947d75a0d80db808707ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 290,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "680e4b802c1ac6ac5c66a4ab9bc9d164738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 291,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "43d9f68083a193992c5952587aa688c48b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 292,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "e94cdb19e88dc9129dbcfc2370d9bbe1",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 293,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a358314978d64f15fcf421598c3989f17ab3dd3c6c31a386",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 294,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "e98fca01ad9b472ddde7252a1a4850e5738b595aebf6ee3e7be424bfb51bfdee",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 295,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "c258770102201218add8d3d9fb2709458b0b5df8332150ff0877d85471d540c4cff1e183",
+          "result" : "invalid"
+        }
+      ]
+    },
+    {
+      "keySize" : 512,
+      "type" : "DaeadTest",
+      "tests" : [
+        {
+          "tcId" : 296,
+          "comment" : "empty message",
+          "key" : "bc7635c1fd566aa8357fd103714bfaee1c9e5b3c578b3980401a981030254a54b1756a8c96e600b7252fd0aab12f39d115d256b3f3e7c2c41a7fece72ba7c3c4",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "44b1c6fe8a8c07dee5377b161f283c31",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 297,
+          "comment" : "empty message",
+          "key" : "aff6388fdd2908e0c3b610e3dcd410c8146a268d6befd5c45ffdd23508b5b311cc3a9d8f838f456436b289018682151dd57d8d65d1a823c06eca8ab8ee01da01",
+          "aad" : "d0bb2949a411e22d32964526",
+          "msg" : "",
+          "ct" : "e288d802a0e56ed7544a2e5775459389",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 298,
+          "comment" : "empty message",
+          "key" : "484261ebf7e1fb66e0bcafe8f4ccf9c5accc908fdb23eb7c5254d614072f26e106b34501d13c1dad1f14648c6a142132dd7f2f1268dd6b70fbcde2fe98f03245",
+          "aad" : "1d5ce9288627a12f8f5d809167a3b2",
+          "msg" : "",
+          "ct" : "f8083e55307932d971bfc2a8913c1951",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 299,
+          "comment" : "empty message",
+          "key" : "0b6aaf05f9b5221e539940cd83cb29d2bcc7a0aa472d8fc67bedd0108869394e33c9f233d4b2cc9c6a59e8ce9cd268a0f3f2857e08fe1eb329ef347dace1557d",
+          "aad" : "76aade95964f074c693886f245fa57f9",
+          "msg" : "",
+          "ct" : "f1ad6ea998a2a438acaf90bad0cb9f9f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 300,
+          "comment" : "empty message",
+          "key" : "d47ab6d51f99f4249da56c93d1f09e856231f3fed777b303111ad31079270839e4bc4b5d8623162d4738d70803934a75f457fdbf4a277b828cb6e2753e88702a",
+          "aad" : "41257da6108bedbb150d4e290b6b9a76d11092c6",
+          "msg" : "",
+          "ct" : "a8d27944a84317098eed170631f4c867",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 301,
+          "comment" : "empty message",
+          "key" : "eef6bcf16ef7ae17326a33f22d1406ec1bd3f866505f4b2e4fe8b45bd62ccbd85032a9899facf2db0c93a2345cb8892afb74db549781211dd8881a8c8e25c171",
+          "aad" : "e941d15fadebaf4671e0e3d6d835f87bfb1cc7028f149930daa69c3de446c423",
+          "msg" : "",
+          "ct" : "b754ecb55c1e124de0c8a973d033bd7f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 302,
+          "comment" : "message size divisible by block size",
+          "key" : "c25cafc6018b98dfbb79a40ec89c575a4f88c4116489bba27707479800c0130235334a45dbe8d8dae3da8dcb45bbe5dce031b0f68ded544fda7eca30d6749442",
+          "aad" : "deeb0ccf3aef47a296ed1ca8f4ae5907",
+          "msg" : "beec61030fa3d670337196beade6aeaa",
+          "ct" : "5865208eab9163db85cab9f96d846234a2626aae22f5c17c9aad4b501f4416e4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 303,
+          "comment" : "message size divisible by block size",
+          "key" : "27faf97fb303aa4f2f364edd23997f4c77b8e51ebb8293c59dfb1d24f0fb629f6c820fc2d91bf48f0035eeec347e37ec4fb0cb36102bcdc5a248c47a2f97eab9",
+          "aad" : "cc94f64e14df90265f7f12a8a0386d0a",
+          "msg" : "6b1db0f5a43376885002dc98bd556f1dac9b66b66213a9fa6069df995a123384",
+          "ct" : "d0016d675b49f11ea873707412d45709b7703a028a0cfc312cf61cbe22b91e3cf20b7d4c9308ee15f18b4eba00889284",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 304,
+          "comment" : "message size divisible by block size",
+          "key" : "97bfd0f3e9bb8167bbb55f4cdc14529d8307c0ec2c3fe8bc88522d05c1261ba460c9cb4116f630edd74d413ec417324c6e29b566fb2dd3df18e07b53b1f9f83b",
+          "aad" : "1cda342c166ea208df5c56bcf995a59b",
+          "msg" : "48ef10ccb1978b53ae73167abe1cc538fa80da3f5df93e3d5c4e9a9ad1f213504f22a694b98a35ad67620af9d8a29fc7",
+          "ct" : "d55c5d0af0260dc1123adb5d7869201f8ccee46deb66dd695c593cde1d7645c72796e42a1733b6705753631b9b626991ddbd28473ce75cfdc4c14d20e66f212d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 305,
+          "comment" : "small plaintext size",
+          "key" : "e2c5662bb18fbb411d0304e4241db073fe60a4704fee290073513038a22b4cd542580b2b4edbc37e3de01c0cb61abcad46986cdc491ce9e5ae5af223ff58b953",
+          "aad" : "fab912dec29a34aabfaef176",
+          "msg" : "0d",
+          "ct" : "1c6969ecb15741a9959b7a8492250e391a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 306,
+          "comment" : "small plaintext size",
+          "key" : "3ab062dbdd38b951a9fb0d8bb185959a93dab3496b850a3062b93003036c8bd2aabbf37d5d3f6a399d4cedefb70c1b8a7b45639fe118c10e39f36fa58618a84d",
+          "aad" : "e8605f13db8c482d48bdba2d",
+          "msg" : "5c6f",
+          "ct" : "fddea9ac778b978a968033ce52ec61162588",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 307,
+          "comment" : "small plaintext size",
+          "key" : "9e575cd8991b32f06fbaf55ad79eb74822349e07fa77c409848c86820011569f26dcb49afaea19a52a96b27e67f780ac7a00da9a3054d1678d60417cf34996b1",
+          "aad" : "7f89a3f648c1c7c23edbd5ca",
+          "msg" : "35ac33",
+          "ct" : "3834fbedc3502227e3c91a861f2e3195fbb344",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 308,
+          "comment" : "small plaintext size",
+          "key" : "6d43cfc930a1e0051f607d0c4a76ad5bec77d9f98bbd9ae5e56a1d65fcf1bf68c7780f727bfe690497bae478afbc4ebf7a89943ee146f72d352940794ff202f4",
+          "aad" : "c2b75c998f4cac28b4b69dfb",
+          "msg" : "1d25f833",
+          "ct" : "0d1e1981da44a7d9eda60e48e7ae4f8505d8ba98",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 309,
+          "comment" : "small plaintext size",
+          "key" : "673cea582bf3982ce3fba5304de8fe46e316d6804749d6db58b7ab7d64bd4e0af641997975234f8b918cca3247d67cfeac9230d15ed28f8071a85e84fa9ef211",
+          "aad" : "f5042d5a5b68b262274974a8",
+          "msg" : "9e99912c7b",
+          "ct" : "655ef7f09f4cff47b427e9df7fcc642664715ad14c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 310,
+          "comment" : "small plaintext size",
+          "key" : "8f13f2bf02d72360d9958eb8aa90634ae48331e7dfdbf16fc51c7238ae9f9d50d4495d196676ef5259b64a616305ffaae517c587d4e7afba40e4a2c5b0989182",
+          "aad" : "755f50cfdfc849654ad98cc7",
+          "msg" : "ac598720b96e",
+          "ct" : "adee2a373a7f6bbaf4f00e5f3f93435a09091b5221ae",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 311,
+          "comment" : "small plaintext size",
+          "key" : "67b3ab00075a0e3d07f3fe73fabea5d0373206a0aafa9397981924ddaf2cb283c66af61166815dffbe8fafa688b793fd259fad4a1f75a259342e58814448a4b4",
+          "aad" : "f8799bc732cbf6a39ae2268e",
+          "msg" : "8f6b2b21a6dc73",
+          "ct" : "ff6173a70dee05ddbde75a960f84523e01b30adcac5275",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 312,
+          "comment" : "small plaintext size",
+          "key" : "a661c6a90fd40d8a734873d66afd4477c5041cdc2b31a3cd0ac3604cac4f74411219e544615b56e17f5774b5085129f6dd69893bb7216b539cf42b79f0068278",
+          "aad" : "7a5dbdbf803b2593d3e17097",
+          "msg" : "deb2c7c6204496e5",
+          "ct" : "2f8b7583773ae03ba7b3952453c81431780bfcc9d7df9a43",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 313,
+          "comment" : "small plaintext size",
+          "key" : "a40b1cc110e1aa28ab86f714abd6d313016989a1c8cfcb62063e2c396ca12a246de3b9bd82994e5f1cb1323f78a9a0ed02fe841976a659423603d91ccf71d58e",
+          "aad" : "e482e942ce26d244d4962acf",
+          "msg" : "122d1ba394afad1fe3",
+          "ct" : "8185d14ee87cc891bb9bcf3fafde4ed246599626211fe04d23",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 314,
+          "comment" : "small plaintext size",
+          "key" : "8af0e57998dd68b0f45b58e708405d0ad8269397249295fd336096e065db2bb1e4110d5507c04d73c150f6e7d87ced029ab38661f201ec77874e43953373b38a",
+          "aad" : "89f95250fb66b2cda70b8854",
+          "msg" : "9cab7bde926307386505",
+          "ct" : "c4deca5c53bcfa6208b337474212418541e44d0fbf2de7b48c6f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 315,
+          "comment" : "small plaintext size",
+          "key" : "6e063240d83d4a90e44e56e631fefe9f6c7c7d56518eff3a902ddd5ca9b837a2044b3727571d1ca56a68abfd997da945e4d14f71dc86b0149a19a93d1e5fec85",
+          "aad" : "5c3661f4047454bac445f1ac",
+          "msg" : "08eb0a196e8f3cb6428b0a",
+          "ct" : "67673064fc540ae128232ba87ba2e9bbe7d3569dd419bcc52796ec",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 316,
+          "comment" : "small plaintext size",
+          "key" : "9593f0d6679e8e18b43cb4d26a7ea9da9d6037fd5a82db0b091a682b6547a77298e4fd1d1481f3603d0b1e7e6dcf27200105af0f844f2aaacd98540ab2b6c8a8",
+          "aad" : "7b3f9591076e32a21766e2bb",
+          "msg" : "0628d19cc94c4b4f3d703e1f",
+          "ct" : "56e6fd5a7f449a8e6bafa38f945c70cf8a534179b3b1f26266fb6b56",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 317,
+          "comment" : "small plaintext size",
+          "key" : "77f7dd662a8f0aaf7f19c6614584e4acf5c774d19e10d2070eaa977e9c6ba21ba82f0bc84939cf70283dcac9c645b7423ca0cc94bac827ea378f1ca0c9da0eee",
+          "aad" : "a3c4e387bfc005402acd20bb",
+          "msg" : "a171376f2a66dbdf17f32961e8",
+          "ct" : "4e7b642dcc3cbd935d4cda8193982ef7240fa47f951ec8b3fd37204a73",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 318,
+          "comment" : "small plaintext size",
+          "key" : "8916d0342001561922e674b0cc51c05a935e5dc45a6d6284f34a4c5c79e92062dc3091217584607e9cf9056aa495ca4cd53fd3d4c6a94c4b384007e62174506b",
+          "aad" : "890dcea871da1caff4766d32",
+          "msg" : "6ad348470891d1babb13f3bf0e8c",
+          "ct" : "fbb68324b8c5b3e55ebc1feb4b98761521f4aac7eb7b6c0fb0505a08457b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 319,
+          "comment" : "small plaintext size",
+          "key" : "2a93a0c37797bee0c344b9ceed1a609813d8c5ee686d260f3aa6fc2f66dc59f400479d1dfe04e89e6df608a3f699ff1cb4e9bf24a78fb2dfddaa0011a2e40208",
+          "aad" : "6ae54f41ac52baf2f89abe8e",
+          "msg" : "3fc3bf53bb485c9edcb1d25adb4ca0",
+          "ct" : "2d344a54038a857f47e0c77eb0834538aaf01e61a8ac82c0012f9dac6f15ef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 320,
+          "comment" : "plaintext size > 16",
+          "key" : "139383f3f82dc78e0b380027f9e5fcd2ed23716404be5c554452e4dc73d237026594491820c6b8297185cc1fa84f49a5c7d7cd05c5de090ff1c3397bc2740437",
+          "aad" : "d39da73ffc03ad0a9213ffc7",
+          "msg" : "48604944a80fadf50d55b87727934458c8",
+          "ct" : "a9cf73951cb39823777f35c96c845169476e2ec2317cb6b8dd8b6172fdceabff9d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 321,
+          "comment" : "plaintext size > 16",
+          "key" : "eac96a89b8e0c928a85c91396346efe8287730595064554cd13574f8b340f541c5f0bb55e654e51b05e21ba007942cabab5ee1020922f0dd002196a39d7fda1d",
+          "aad" : "29d614f908593f6a5ab03cea",
+          "msg" : "0c22e4875dcd23de89a6d32f2082dd40e1848fc2",
+          "ct" : "bce886623d11320d22dfdc1defb04d17bd001d9370a3d8c83aabe4494d16ca75ce534f7c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 322,
+          "comment" : "plaintext size > 16",
+          "key" : "c0f4bede68c6ed5ad14918e2ddeced692dfd5419c04204d5b96f4ca47078b07028c6fb87b1b490d875f070bbe4d790f65e5df19947f02c9d3a4e493b542d0291",
+          "aad" : "b411e4d2facca67ea4a9f2a1",
+          "msg" : "2f358d4534559ac99dd71798b7925705d6f013f6b848ffe01cc86cef09d88f",
+          "ct" : "d27ae26dfe02e3eedf544e1b452cb0f0c9303a4e4819318315ae08839bcce558e4741817ec08dae406bbfc09f59aa9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 323,
+          "comment" : "plaintext size > 16",
+          "key" : "cd8689f821817f59bfaa755131f2565161c7f4489f89b657ac9fa127a9768535a702d001b9b99cc11c3976467b1b45865ff417dc256ebb5079b7f1b3e08307b5",
+          "aad" : "b3edffbb89b373fe04da244b",
+          "msg" : "ebcfb2ffb681cc5dfa0c5c524c1b1cc87cc6b2bfa35dc36d15e80505118b84a072a78a157b4d1837",
+          "ct" : "1ac78aae2ede04eb47924d8f9f99fe75deb61bf693da7f3a2147c05f6d29d17392356fe00f82b24cdbce774fd864561548f33dd3192d806f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 324,
+          "comment" : "plaintext size > 16",
+          "key" : "72a76714e0171e8213de624f00e273bc900050e69d25c454cc42b61e8b3fbc92d4942e1ae14421e164046c1479a7b9c9f4b50b382cb62dfeaa210b98dec7d937",
+          "aad" : "6a8aaf2c84003e0e6f409658",
+          "msg" : "92d8f4dc7d41e8b180d66e8994022db79249cdc76fd7f3ea12d9925b51925250cd75a15fcfd78ea85c57fe6196f8d7545086f99ea796a0ea69170db9944200435d9d3d551943892400ce787f703c1105",
+          "ct" : "69f720f36b0da86ec8cc0f46d62835dcb35ac23f5b891152d861c4e0f0018f19d272ee8b12d83300bfd46aeec0124d5d23b3cb849c1cab1fdf64b70947ebf79f5442e209076dfa9a3f36ab0a6d3cf4a75ddfcdc21837743b20885db4c803ac27",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 325,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "8dbfee9580e7e2bc66100a674497f4e1",
+          "ct" : "000000000000000000000000000000007ef8aa7e4dd49d9cfa09e9cb574fd90d",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 326,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "bfa1733d07afa03cb3f2eeb81bbde037",
+          "ct" : "000000000000000000000000000000004ce637d6ca9cdf1c2feb0d140865cddb",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 327,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "72543a9a07a3c18a280060653432c05c",
+          "ct" : "ffffffffffffffffffffffffffffffff3db09cc48f2780859351901d1014ae06",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 328,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "404aa73280eb830afde284ba6b18d48a",
+          "ct" : "ffffffffffffffffffffffffffffffff0fae016c086fc20546b374c24f3ebad0",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 329,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "ff4d7cdeb8f3c4e37a05a91ee26e2a84",
+          "ct" : "ffffffffffffffffffffffff7fffffffb0a9da80307785ecc1545966c64844de",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 330,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "cd53e1763fbb8663afe74dc1bd443e52",
+          "ct" : "ffffffffffffffffffffffff7fffffff82b74728b73fc76c14b6bdb999625008",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 331,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "6eb52fc95a5185a3bd2a30d3058414ab",
+          "ct" : "ffffffffffffffff7fffffffffffffff21518997d2d5c4ac067bc0ab21a27af1",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 332,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "5cabb261dd19c72368c8d40c5aae007d",
+          "ct" : "ffffffffffffffff7fffffffffffffff134f143f559d862cd39924747e886e27",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 333,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "114cc36e58faceb2e6a2344a679ea4c3",
+          "ct" : "fffffffffffffffffffffffffffffffe2f849650d6e89e2668e990219195719c",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 334,
+          "comment" : "edge case SIV",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "23525ec6dfb28c323340d09538b4b015",
+          "ct" : "fffffffffffffffffffffffffffffffe1d9a0bf851a0dca6bd0b74fecebf654a",
+          "result" : "valid",
+          "flags" : [
+            "EdgeCaseSiv"
+          ]
+        },
+        {
+          "tcId" : 335,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ef5b8ef53fc365606cd3ea047374885",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 336,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "202e4a8f8b4c66788f3af230fb1c3ada5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 337,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "05b4e8166f28082987a32cdaf53deb61211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 338,
+          "comment" : "Flipped bit 0 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "315d6cf8eeb36a37849710e7d1f72940adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 339,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6df5b8ef53fc365606cd3ea047374885",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 340,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "232e4a8f8b4c66788f3af230fb1c3ada5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 341,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "06b4e8166f28082987a32cdaf53deb61211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 342,
+          "comment" : "Flipped bit 1 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "325d6cf8eeb36a37849710e7d1f72940adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 343,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "eff5b8ef53fc365606cd3ea047374885",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 344,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a12e4a8f8b4c66788f3af230fb1c3ada5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 345,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "84b4e8166f28082987a32cdaf53deb61211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 346,
+          "comment" : "Flipped bit 7 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "b05d6cf8eeb36a37849710e7d1f72940adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 347,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ff4b8ef53fc365606cd3ea047374885",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 348,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "212f4a8f8b4c66788f3af230fb1c3ada5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 349,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "04b5e8166f28082987a32cdaf53deb61211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 350,
+          "comment" : "Flipped bit 8 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "305c6cf8eeb36a37849710e7d1f72940adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 351,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ff5b86f53fc365606cd3ea047374885",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 352,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "212e4a0f8b4c66788f3af230fb1c3ada5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 353,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "04b4e8966f28082987a32cdaf53deb61211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 354,
+          "comment" : "Flipped bit 31 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "305d6c78eeb36a37849710e7d1f72940adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 355,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ff5b8ef52fc365606cd3ea047374885",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 356,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "212e4a8f8a4c66788f3af230fb1c3ada5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 357,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "04b4e8166e28082987a32cdaf53deb61211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 358,
+          "comment" : "Flipped bit 32 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "305d6cf8efb36a37849710e7d1f72940adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 359,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ff5b8ef51fc365606cd3ea047374885",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 360,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "212e4a8f894c66788f3af230fb1c3ada5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 361,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "04b4e8166d28082987a32cdaf53deb61211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 362,
+          "comment" : "Flipped bit 33 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "305d6cf8ecb36a37849710e7d1f72940adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 363,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ff5b8ef53fc36d606cd3ea047374885",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 364,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "212e4a8f8b4c66f88f3af230fb1c3ada5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 365,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "04b4e8166f2808a987a32cdaf53deb61211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 366,
+          "comment" : "Flipped bit 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "305d6cf8eeb36ab7849710e7d1f72940adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 367,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ff5b8ef53fc365607cd3ea047374885",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 368,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "212e4a8f8b4c66788e3af230fb1c3ada5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 369,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "04b4e8166f28082986a32cdaf53deb61211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 370,
+          "comment" : "Flipped bit 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "305d6cf8eeb36a37859710e7d1f72940adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 371,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ff5b8ef53fc365686cd3ea047374885",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 372,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "212e4a8f8b4c66780f3af230fb1c3ada5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 373,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "04b4e8166f28082907a32cdaf53deb61211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 374,
+          "comment" : "Flipped bit 71 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "305d6cf8eeb36a37049710e7d1f72940adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 375,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ff5b8ef53fc365606ed3ea047374885",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 376,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "212e4a8f8b4c66788f1af230fb1c3ada5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 377,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "04b4e8166f28082987832cdaf53deb61211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 378,
+          "comment" : "Flipped bit 77 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "305d6cf8eeb36a3784b710e7d1f72940adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 379,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ff5b8ef53fc365606cd3fa047374885",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 380,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "212e4a8f8b4c66788f3af330fb1c3ada5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 381,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "04b4e8166f28082987a32ddaf53deb61211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 382,
+          "comment" : "Flipped bit 80 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "305d6cf8eeb36a37849711e7d1f72940adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 383,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ff5b8ef53fc365606cd3ea046374885",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 384,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "212e4a8f8b4c66788f3af230fa1c3ada5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 385,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "04b4e8166f28082987a32cdaf43deb61211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 386,
+          "comment" : "Flipped bit 96 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "305d6cf8eeb36a37849710e7d0f72940adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 387,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ff5b8ef53fc365606cd3ea045374885",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 388,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "212e4a8f8b4c66788f3af230f91c3ada5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 389,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "04b4e8166f28082987a32cdaf73deb61211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 390,
+          "comment" : "Flipped bit 97 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "305d6cf8eeb36a37849710e7d3f72940adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 391,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ff5b8ef53fc365606cd3ea0c7374885",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 392,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "212e4a8f8b4c66788f3af2307b1c3ada5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 393,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "04b4e8166f28082987a32cda753deb61211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 394,
+          "comment" : "Flipped bit 103 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "305d6cf8eeb36a37849710e751f72940adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 395,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ff5b8ef53fc365606cd3ea047374884",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 396,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "212e4a8f8b4c66788f3af230fb1c3adb5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 397,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "04b4e8166f28082987a32cdaf53deb60211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 398,
+          "comment" : "Flipped bit 120 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "305d6cf8eeb36a37849710e7d1f72941adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 399,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ff5b8ef53fc365606cd3ea047374887",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 400,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "212e4a8f8b4c66788f3af230fb1c3ad85ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 401,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "04b4e8166f28082987a32cdaf53deb63211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 402,
+          "comment" : "Flipped bit 121 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "305d6cf8eeb36a37849710e7d1f72942adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 403,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ff5b8ef53fc365606cd3ea0473748c5",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 404,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "212e4a8f8b4c66788f3af230fb1c3a9a5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 405,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "04b4e8166f28082987a32cdaf53deb21211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 406,
+          "comment" : "Flipped bit 126 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "305d6cf8eeb36a37849710e7d1f72900adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 407,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ff5b8ef53fc365606cd3ea047374805",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 408,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "212e4a8f8b4c66788f3af230fb1c3a5a5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 409,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "04b4e8166f28082987a32cdaf53debe1211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 410,
+          "comment" : "Flipped bit 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "305d6cf8eeb36a37849710e7d1f729c0adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 411,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ef5b8ef53fc365607cd3ea047374885",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 412,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "202e4a8f8b4c66788e3af230fb1c3ada5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 413,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "05b4e8166f28082986a32cdaf53deb61211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 414,
+          "comment" : "Flipped bits 0 and 64 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "315d6cf8eeb36a37859710e7d1f72940adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 415,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ff5b86f53fc36d606cd3ea047374885",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 416,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "212e4a0f8b4c66f88f3af230fb1c3ada5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 417,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "04b4e8966f2808a987a32cdaf53deb61211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 418,
+          "comment" : "Flipped bits 31 and 63 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "305d6c78eeb36ab7849710e7d1f72940adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 419,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ff5b8ef53fc36d606cd3ea047374805",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 420,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "212e4a8f8b4c66f88f3af230fb1c3a5a5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 421,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "04b4e8166f2808a987a32cdaf53debe1211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 422,
+          "comment" : "Flipped bits 63 and 127 in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "305d6cf8eeb36ab7849710e7d1f729c0adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 423,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "900a4710ac03c9a9f932c15fb8c8b77a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 424,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "ded1b57074b3998770c50dcf04e3c5255ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 425,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "fb4b17e990d7f7d6785cd3250ac2149e211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 426,
+          "comment" : "all bits of tag flipped",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "cfa29307114c95c87b68ef182e08d6bfadfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 427,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "00000000000000000000000000000000",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 428,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "000000000000000000000000000000005ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 429,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "00000000000000000000000000000000211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 430,
+          "comment" : "Tag changed to all zero",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "00000000000000000000000000000000adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 431,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 432,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "ffffffffffffffffffffffffffffffff5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 433,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "ffffffffffffffffffffffffffffffff211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 434,
+          "comment" : "tag changed to all 1",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "ffffffffffffffffffffffffffffffffadfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 435,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "ef75386fd37cb6d6864dbe20c7b7c805",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 436,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "a1aeca0f0bcce6f80fba72b07b9cba5a5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 437,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "84346896efa888a90723ac5a75bd6be1211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 438,
+          "comment" : "msbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "b0ddec786e33eab7041790675177a9c0adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 439,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "6ef4b9ee52fd375707cc3fa146364984",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 440,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "3031323334353637",
+          "ct" : "202f4b8e8a4d67798e3bf331fa1d3bdb5ead70c7f066d4df",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 441,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f",
+          "ct" : "05b5e9176e29092886a22ddbf43cea60211dffad7562c4b924bb79fed73d9ce2",
+          "result" : "invalid"
+        },
+        {
+          "tcId" : 442,
+          "comment" : "lsbs changed in tag",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f",
+          "aad" : "",
+          "msg" : "303132333435363738393a3b3c3d3e3f40414243",
+          "ct" : "315c6df9efb26b36859611e6d0f62841adfd10a7615d6515b999dbfc5a10f3ae9df5f19a",
+          "result" : "invalid"
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/chacha20_poly1305_test.json b/third_party/wycheproof/testvectors/chacha20_poly1305_test.json
new file mode 100644
index 0000000..f4d72ec
--- /dev/null
+++ b/third_party/wycheproof/testvectors/chacha20_poly1305_test.json
@@ -0,0 +1,1868 @@
+{
+  "algorithm" : "CHACHA20-POLY1305",
+  "generatorVersion" : "0.4.12",
+  "numberOfTests" : 151,
+  "header" : [],
+  "testGroups" : [
+    {
+      "ivSize" : 96,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "rfc7539",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "070000004041424344454647",
+          "aad" : "50515253c0c1c2c3c4c5c6c7",
+          "msg" : "4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e",
+          "ct" : "d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b6116",
+          "tag" : "1ae10b594f09e26a7e902ecbd0600691",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "key" : "80ba3192c803ce965ea371d5ff073cf0f43b6a2ab576b208426e11409c09b9b0",
+          "iv" : "4da5bf8dfd5852c1ea12379d",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "76acb342cf3166a5b63c0c0ea1383c8d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "key" : "7a4cd759172e02eb204db2c3f5c746227df584fc1345196391dbb9577a250742",
+          "iv" : "a92ef0ac991dd516a3c6f689",
+          "aad" : "bd506764f2d2c410",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "906fa6284b52f87b7359cbaa7563c709",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "",
+          "key" : "cc56b680552eb75008f5484b4cb803fa5063ebd6eab91f6ab6aef4916a766273",
+          "iv" : "99e23ec48985bccdeeab60f1",
+          "aad" : "",
+          "msg" : "2a",
+          "ct" : "3a",
+          "tag" : "cac27dec0968801e9f6eded69d807522",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "",
+          "key" : "46f0254965f769d52bdb4a70b443199f8ef207520d1220c55e4b70f0fda620ee",
+          "iv" : "ab0dca716ee051d2782f4403",
+          "aad" : "91ca6c592cbcca53",
+          "msg" : "51",
+          "ct" : "c4",
+          "tag" : "168310ca45b1f7c66cad4e99e43f72b9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "",
+          "key" : "2f7f7e4f592bb389194989743507bf3ee9cbde1786b6695fe6c025fd9ba4c100",
+          "iv" : "461af122e9f2e0347e03f2db",
+          "aad" : "",
+          "msg" : "5c60",
+          "ct" : "4d13",
+          "tag" : "91e8b61efb39c122195453077b22e5e2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "",
+          "key" : "c8833dce5ea9f248aa2030eacfe72bffe69a620caf793344e5718fe0d7ab1a58",
+          "iv" : "61546ba5f1720590b6040ac6",
+          "aad" : "88364fc8060518bf",
+          "msg" : "ddf2",
+          "ct" : "b60d",
+          "tag" : "ead0fd4697ec2e5558237719d02437a2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "",
+          "key" : "55568158d3a6483f1f7021eab69b703f614251cadc1af5d34a374fdbfc5adac7",
+          "iv" : "3c4e654d663fa4596dc55bb7",
+          "aad" : "",
+          "msg" : "ab85e9c1571731",
+          "ct" : "5dfe3440dbb3c3",
+          "tag" : "ed7a434e2602d394281e0afa9fb7aa42",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "",
+          "key" : "e3c09e7fab1aefb516da6a33022a1dd4eb272c80d540c5da52a730f34d840d7f",
+          "iv" : "58389375c69ee398de948396",
+          "aad" : "84e46be8c0919053",
+          "msg" : "4ee5cda20d4290",
+          "ct" : "4bd47212941ce3",
+          "tag" : "185f1408ee7fbf18f5abad6e2253a1ba",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "",
+          "key" : "51e4bf2bad92b7aff1a4bc05550ba81df4b96fabf41c12c7b00e60e48db7e152",
+          "iv" : "4f07afedfdc3b6c2361823d3",
+          "aad" : "",
+          "msg" : "be3308f72a2c6aed",
+          "ct" : "8e9439a56eeec817",
+          "tag" : "fbe8a6ed8fabb1937539dd6c00e90021",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "",
+          "key" : "1131c1418577a054de7a4ac551950f1a053f9ae46e5b75fe4abd5608d7cddadd",
+          "iv" : "b4ea666ee119563366484a78",
+          "aad" : "66c0ae70076cb14d",
+          "msg" : "a4c9c2801b71f7df",
+          "ct" : "b9b910433af052b0",
+          "tag" : "4530f51aeee024e0a445a6328fa67a18",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "",
+          "key" : "99b62bd5afbe3fb015bde93f0abf483957a1c3eb3ca59cb50b39f7f8a9cc51be",
+          "iv" : "9a59fce26df0005e07538656",
+          "aad" : "",
+          "msg" : "42baae5978feaf5c368d14e0",
+          "ct" : "ff7dc203b26c467a6b50db33",
+          "tag" : "578c0f2758c2e14e36d4fc106dcb29b4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "",
+          "key" : "85f35b6282cff440bc1020c8136ff27031110fa63ec16f1e825118b006b91257",
+          "iv" : "58dbd4ad2c4ad35dd906e9ce",
+          "aad" : "a506e1a5c69093f9",
+          "msg" : "fdc85b94a4b2a6b759b1a0da",
+          "ct" : "9f8816de0994e938d9e53f95",
+          "tag" : "d086fc6c9d8fa915fd8423a7cf05072f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "",
+          "key" : "67119627bd988eda906219e08c0d0d779a07d208ce8a4fe0709af755eeec6dcb",
+          "iv" : "68ab7fdbf61901dad461d23c",
+          "aad" : "",
+          "msg" : "51f8c1f731ea14acdb210a6d973e07",
+          "ct" : "0b29638e1fbdd6df53970be2210042",
+          "tag" : "2a9134087d67a46e79178d0a93f5e1d2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "",
+          "key" : "e6f1118d41e4b43fb58221b7ed79673834e0d8ac5c4fa60bbc8bc4893a58894d",
+          "iv" : "d95b3243afaef714c5035b6a",
+          "aad" : "6453a53384632212",
+          "msg" : "97469da667d6110f9cbda1d1a20673",
+          "ct" : "32db66c4a3819d81557455e5980fed",
+          "tag" : "feae30dec94e6ad3a9eea06a0d703917",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "",
+          "key" : "59d4eafb4de0cfc7d3db99a8f54b15d7b39f0acc8da69763b019c1699f87674a",
+          "iv" : "2fcb1b38a99e71b84740ad9b",
+          "aad" : "",
+          "msg" : "549b365af913f3b081131ccb6b825588",
+          "ct" : "e9110e9f56ab3ca483500ceabab67a13",
+          "tag" : "836ccabf15a6a22a51c1071cfa68fa0c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "",
+          "key" : "b907a45075513fe8a8019edee3f2591487b2a030b03c6e1d771c862571d2ea1e",
+          "iv" : "118a6964c2d3e380071f5266",
+          "aad" : "034585621af8d7ff",
+          "msg" : "55a465644f5b650928cbee7c063214d6",
+          "ct" : "e4b113cb775945f3d3a8ae9ec141c00c",
+          "tag" : "7c43f16ce096d0dc27c95849dc383b7d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "",
+          "key" : "3b2458d8176e1621c0cc24c0c0e24c1e80d72f7ee9149a4b166176629616d011",
+          "iv" : "45aaa3e5d16d2d42dc03445d",
+          "aad" : "",
+          "msg" : "3ff1514b1c503915918f0c0c31094a6e1f",
+          "ct" : "02cc3acb5ee1fcdd12a03bb857976474d3",
+          "tag" : "d83b7463a2c3800fe958c28eaa290813",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "",
+          "key" : "f60c6a1b625725f76c7037b48fe3577fa7f7b87b1bd5a982176d182306ffb870",
+          "iv" : "f0384fb876121410633d993d",
+          "aad" : "9aaf299eeea78f79",
+          "msg" : "63858ca3e2ce69887b578a3c167b421c9c",
+          "ct" : "35766488d2bc7c2b8d17cbbb9abfad9e6d",
+          "tag" : "1f391e657b2738dda08448cba2811ceb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "",
+          "key" : "0212a8de5007ed87b33f1a7090b6114f9e08cefd9607f2c276bdcfdbc5ce9cd7",
+          "iv" : "e6b1adf2fd58a8762c65f31b",
+          "aad" : "",
+          "msg" : "10f1ecf9c60584665d9ae5efe279e7f7377eea6916d2b111",
+          "ct" : "42f26c56cb4be21d9d8d0c80fc99dde00d75f38074bfe764",
+          "tag" : "54aa7e13d48fff7d7557039457040a3a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "",
+          "key" : "c5bc09565646e7edda954f1f739223dada20b95c44ab033d0fae4b0283d18be3",
+          "iv" : "6b282ebecc541bcd7834ed55",
+          "aad" : "3e8bc5ade182ff08",
+          "msg" : "9222f9018e54fd6de1200806a9ee8e4cc904d29f25cba193",
+          "ct" : "123032437b4bfd6920e8f7e7e0087ae4889ebe7a0ad0e900",
+          "tag" : "3cf68f179550da63d3b96c2d55411865",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "",
+          "key" : "2eb51c469aa8eb9e6c54a8349bae50a20f0e382711bba1152c424f03b6671d71",
+          "iv" : "04a9be03508a5f31371a6fd2",
+          "aad" : "",
+          "msg" : "b053999286a2824f42cc8c203ab24e2c97a685adcc2ad32662558e55a5c729",
+          "ct" : "45c7d6b53acad4abb68876a6e96a48fb59524d2c92c9d8a189c9fd2db91746",
+          "tag" : "566d3ca10e311b695f3eae1551652493",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "",
+          "key" : "7f5b74c07ed1b40fd14358fe2ff2a740c116c7706510e6a437f19ea49911cec4",
+          "iv" : "470a339ecb3219b8b81a1f8b",
+          "aad" : "374618a06ea98a48",
+          "msg" : "f45206abc25552b2abc9ab7fa243035fedaaddc3b2293956f1ea6e7156e7eb",
+          "ct" : "46a80c4187024720084627580080dde5a3f4a11093a7076ed6f3d326bc7b70",
+          "tag" : "534d4aa2835a52e72d14df0e4f47f25f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "",
+          "key" : "e1731d5854e1b70cb3ffe8b786a2b3ebf0994370954757b9dc8c7bc5354634a3",
+          "iv" : "72cfd90ef3026ca22b7e6e6a",
+          "aad" : "",
+          "msg" : "b9c554cbc36ac18ae897df7beecac1dbeb4eafa156bb60ce2e5d48f05715e678",
+          "ct" : "ea29afa49d36e8760f5fe19723b9811ed5d519934a440f5081ac430b953b0e21",
+          "tag" : "222541af46b86533c6b68d2ff108a7ea",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "",
+          "key" : "27d860631b0485a410702fea61bc873f3442260caded4abde25b786a2d97f145",
+          "iv" : "262880d475f3dac5340dd1b8",
+          "aad" : "2333e5ce0f93b059",
+          "msg" : "6b2604996cd30c14a13a5257ed6cffd3bc5e29d6b97eb1799eb335e281ea451e",
+          "ct" : "6dad637897544d8bf6be9507ed4d1bb2e954bc427e5de729daf50762846ff2f4",
+          "tag" : "7b997d93c982189d7095dc794c746232",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "",
+          "key" : "cf0d40a4644e5f51815165d5301b22631f4544c49a1878e3a0a5e8e1aae0f264",
+          "iv" : "e74a515e7e2102b90bef55d2",
+          "aad" : "",
+          "msg" : "973d0c753826bae466cf9abb3493152e9de7819e2bd0c71171346b4d2cebf8041aa3cedc0dfd7b467e26228bc86c9a",
+          "ct" : "fba78ae4f9d808a62e3da40be2cb7700c3613d9eb2c529c652e76a432c658d27095f0eb8f940c324981ea935e507f9",
+          "tag" : "8f046956db3a512908bd7afc8f2ab0a9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "",
+          "key" : "6cbfd71c645d184cf5d23c402bdb0d25ec54898c8a0273d42eb5be109fdcb2ac",
+          "iv" : "d4d807341683825b31cd4d95",
+          "aad" : "b3e4064683b02d84",
+          "msg" : "a98995504df16f748bfb7785ff91eeb3b660ea9ed3450c3d5e7b0e79ef653659a9978d75542ef91c456762215640b9",
+          "ct" : "a1ffed80761829ecce242e0e88b138049016bca018da2b6e19986b3e318cae8d806198fb4c527cc39350ebddeac573",
+          "tag" : "c4cbf0befda0b70242c640d7cd02d7a3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "",
+          "key" : "5b1d1035c0b17ee0b0444767f80a25b8c1b741f4b50a4d3052226baa1c6fb701",
+          "iv" : "d61040a313ed492823cc065b",
+          "aad" : "",
+          "msg" : "d096803181beef9e008ff85d5ddc38ddacf0f09ee5f7e07f1e4079cb64d0dc8f5e6711cd4921a7887de76e2678fdc67618f1185586bfea9d4c685d50e4bb9a82",
+          "ct" : "9a4ef22b181677b5755c08f747c0f8d8e8d4c18a9cc2405c12bb51bb1872c8e8b877678bec442cfcbb0ff464a64b74332cf072898c7e0eddf6232ea6e27efe50",
+          "tag" : "9ff3427a0f32fa566d9ca0a78aefc013",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "",
+          "key" : "97d635c4f47574d9998a90875da1d3a284b755b2d39297a5725235190e10a97e",
+          "iv" : "d31c21aba175b70de4ebb19c",
+          "aad" : "7193f623663321a2",
+          "msg" : "94ee166d6d6ecf8832437136b4ae805d428864359586d9193a25016293edba443c58e07e7b7195ec5bd84582a9d56c8d4a108c7d7ce34e6c6f8ea1bec0567317",
+          "ct" : "5fbbdecc34be201614f636031eeb42f1cace3c79a12cffd871ee8e73820c829749f1abb4294367849fb6c2aa56bda8a3078f723d7c1c852024b017b58973fb1e",
+          "tag" : "09263da7b4cb921452f97dca40f580ec",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "",
+          "key" : "fe6e55bdaed1f7284ca5fc0f8c5f2b8df56dc0f49e8ca66a41995e783351f901",
+          "iv" : "17c86a8abbb7e003acde2799",
+          "aad" : "",
+          "msg" : "b429eb80fb8fe8baeda0c85b9c333458e7c2992e558475069d12d45c22217564121588032297eff56783742a5fc22d7410ffb29d66098661d76f126c3c27689e43b37267cac5a3a6d3ab49e391da29cd3054a5692e2807e4c3ea46c8761d50f592",
+          "ct" : "d0102f6c258bf49742cec34cf2d0fedf23d105fb4c84cf98515e1bc9a64f8ad5be8f0721bde50645d00083c3a263a31053b760245f52ae2866a5ec83b19f61be1d30d5c5d9fecc4cbbe08fd385813a2aa39a00ff9c10f7f23702add1e4b2ffa31c",
+          "tag" : "41865fc71de12b19612127ce49993bb0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "",
+          "key" : "aabc063474e65c4c3e9bdc480dea97b45110c8618846ff6b15bdd2a4a5682c4e",
+          "iv" : "46362f45d6379e63e5229460",
+          "aad" : "a11c40b603767330",
+          "msg" : "ceb534ce50dc23ff638ace3ef63ab2cc2973eeada80785fc165d06c2f5100ff5e8ab2882c475afcd05ccd49f2e7d8f55ef3a72e3dc51d6852b8e6b9e7aece57be6556b0b6d9413e33fc5fc24a9a205ad59574bb39d944a92dc47970d84a6ad3176",
+          "ct" : "7545391b51de01d5c53dfaca777909063e58edee4bb1227e7110ac4d2620c2aec2f848f56deeb037a8dced75afa8a6c890e2dee42f950bb33d9e2424d08a505d899563973ed38870f3de6ee2adc7fe072c366c14e2cf7ca62fb3d36bee11685461",
+          "tag" : "b70d44ef8c66c5c7bbf10dcadd7facf6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "",
+          "key" : "7d00b48095adfa3272050607b264185002ba99957c498be022770f2ce2f3143c",
+          "iv" : "87345f1055fd9e2102d50656",
+          "aad" : "02",
+          "msg" : "e5ccaa441bc814688f8f6e8f28b500b2",
+          "ct" : "7e72f5a185af16a611921b438f749f0b",
+          "tag" : "1242c670732334029adfe1c5001651e4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "",
+          "key" : "6432717f1db85e41ac7836bce25185a080d5762b9e2b18444b6ec72c3bd8e4dc",
+          "iv" : "87a3163ec0598ad95b3aa713",
+          "aad" : "b648",
+          "msg" : "02cde168fba3f544bbd0332f7adeada8",
+          "ct" : "85f29a719557cdd14d1f8fffab6d9e60",
+          "tag" : "732ca32becd515a1ed353f542e999858",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "",
+          "key" : "8e34cf73d245a1082a920b86364eb896c4946467bcb3d58929fcb36690e6394f",
+          "iv" : "6f573aa86baa492ba46596df",
+          "aad" : "bd4cd02fc7502bbdbdf6c9a3cbe8f0",
+          "msg" : "16ddd23ff53f3d23c06334487040eb47",
+          "ct" : "c1b295936d56fadac03e5f742bff73a1",
+          "tag" : "39c457dbab66382babb3b55800cda5b8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "",
+          "key" : "cb5575f5c7c45c91cf320b139fb594237560d0a3e6f865a67d4f633f2c08f016",
+          "iv" : "1a6518f02ede1da6809266d9",
+          "aad" : "89cce9fb47441d07e0245a66fe8b778b",
+          "msg" : "623b7850c321e2cf0c6fbcc8dfd1aff2",
+          "ct" : "c84c9bb7c61c1bcb17772a1c500c5095",
+          "tag" : "dbadf7a5138ca03459a2cd65831e092f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "",
+          "key" : "a5569e729a69b24ba6e0ff15c4627897436824c941e9d00b2e93fddc4ba77657",
+          "iv" : "564dee49ab00d240fc1068c3",
+          "aad" : "d19f2d989095f7ab03a5fde84416e00c0e",
+          "msg" : "87b3a4d7b26d8d3203a0de1d64ef82e3",
+          "ct" : "94bc80621ed1e71b1fd2b5c3a15e3568",
+          "tag" : "333511861796978401598b963722f5b3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "",
+          "key" : "56207465b4e48e6d04630f4a42f35cfc163ab289c22a2b4784f6f9290330bee0",
+          "iv" : "df8713e87ec3dbcfad14d53e",
+          "aad" : "5e6470facd99c1d81e37cd44015fe19480a2a4d3352a4ff560c0640fdbda",
+          "msg" : "e601b38557797da2f8a4106a089d1da6",
+          "ct" : "299b5d3f3d03c087209a16e285143111",
+          "tag" : "4b454ed198de117e83ec49fa8d8508d6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "",
+          "key" : "3937986af86dafc1ba0c4672d8abc46c207062682d9c264ab06d6c5807205130",
+          "iv" : "8df4b15a888c33286a7b7651",
+          "aad" : "ba446f6f9a0ced22450feb10737d9007fd69abc19b1d4d9049a5551e86ec2b37",
+          "msg" : "dc9e9eaf11e314182df6a4eba17aec9c",
+          "ct" : "605bbf90aeb974f6602bc778056f0dca",
+          "tag" : "38ea23d99054b46b42ffe004129d2204",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "",
+          "key" : "36372abcdb78e0279646ac3d176b9674e9154eecf0d5469c651ec7e16b4c1199",
+          "iv" : "be40e5f1a11817a0a8fa8949",
+          "aad" : "d41a828d5e71829247021905402ea257dccbc3b80fcd5675056b68bb59e62e8873",
+          "msg" : "81ce84ede9b35859cc8c49a8f6be7dc6",
+          "ct" : "7b7ce0d824809a70de32562ccf2c2bbd",
+          "tag" : "15d44a00ce0d19b4231f921e22bc0a43",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "",
+          "key" : "9f1479ed097d7fe529c11f2f5add9aaff4a1ca0b68997a2cb7f79749bd90aaf4",
+          "iv" : "84c87dae4eee27730ec35d12",
+          "aad" : "3f2dd49bbf09d69a78a3d80ea2566614fc379474196c1aae84583da73d7ff85c6f42ca42056a9792cc1b9fb3c7d261",
+          "msg" : "a66747c89e857af3a18e2c79500087ed",
+          "ct" : "ca82bff3e2f310ccc976672c4415e69b",
+          "tag" : "57638c62a5d85ded774f913c813ea032",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "00000000000000000000000000000000",
+          "msg" : "256d40888094178355d304846443fee8df99470303fb3b7b80e030beebd329be",
+          "ct" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "tag" : "e6d3d7324a1cbba777bbb0ecdda37807",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "00000000000000000000000000000000",
+          "msg" : "256d40888094178355d304846443fee8df99470303fb3b7b80e030beebd329bee3bcdb5b1edefcfe8bcda1b6a15c8c2b0869ffd2ec5e26e553b7b227fe87fdbd",
+          "ct" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "tag" : "062de6795f274fd2a305d76980bc9cce",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "00000000000000000000000000000000",
+          "msg" : "256d40888094178355d304846443fee8df99470303fb3b7b80e030beebd329bee3bcdb5b1edefcfe8bcda1b6a15c8c2b0869ffd2ec5e26e553b7b227fe87fdbd7ada44424269bffa5527f270acf68502b74c5ae2e60c0580981a4938459392c49bb2f284b646efc7f3f0b1361dc348ed77d30bc57692ed38fbac0188380488c7",
+          "ct" : "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "tag" : "d8b47902baaeafb34203051529af282e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "ffffffffffffffffffffffffffffffff",
+          "msg" : "da92bf777f6be87caa2cfb7b9bbc01172066b8fcfc04c4847f1fcf41142cd641",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "b3891c849cb52c27747edfcf31213bb6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "ffffffffffffffffffffffffffffffff",
+          "msg" : "da92bf777f6be87caa2cfb7b9bbc01172066b8fcfc04c4847f1fcf41142cd6411c4324a4e121030174325e495ea373d4f796002d13a1d91aac484dd801780242",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "f0c12d26ef03029b62c008da27c5dc68",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "ffffffffffffffffffffffffffffffff",
+          "msg" : "da92bf777f6be87caa2cfb7b9bbc01172066b8fcfc04c4847f1fcf41142cd6411c4324a4e121030174325e495ea373d4f796002d13a1d91aac484dd8017802428525bbbdbd964005aad80d8f53097afd48b3a51d19f3fa7f67e5b6c7ba6c6d3b644d0d7b49b910380c0f4ec9e23cb712882cf43a896d12c70453fe77c7fb7738",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "ee65783001c25691fa28d0f5f1c1d762",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "00000080000000800000008000000080",
+          "msg" : "256d40088094170355d304046443fe68df99478303fb3bfb80e0303eebd3293e",
+          "ct" : "0000008000000080000000800000008000000080000000800000008000000080",
+          "tag" : "79ba7a29f5a7bb75797af87a610129a4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "00000080000000800000008000000080",
+          "msg" : "256d40088094170355d304046443fe68df99478303fb3bfb80e0303eebd3293ee3bcdbdb1edefc7e8bcda136a15c8cab0869ff52ec5e266553b7b2a7fe87fd3d",
+          "ct" : "00000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080",
+          "tag" : "36b1743819e1b9ba1551e8ed922a959a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "00000080000000800000008000000080",
+          "msg" : "256d40088094170355d304046443fe68df99478303fb3bfb80e0303eebd3293ee3bcdbdb1edefc7e8bcda136a15c8cab0869ff52ec5e266553b7b2a7fe87fd3d7ada44c24269bf7a5527f2f0acf68582b74c5a62e60c0500981a49b8459392449bb2f204b646ef47f3f0b1b61dc3486d77d30b457692edb8fbac010838048847",
+          "ct" : "0000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080000000800000008000000080",
+          "tag" : "feac4955554e806f3a1902e24432c08a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "ffffff7fffffff7fffffff7fffffff7f",
+          "msg" : "da92bff77f6be8fcaa2cfbfb9bbc01972066b87cfc04c4047f1fcfc1142cd6c1",
+          "ct" : "ffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7f",
+          "tag" : "20a3798df1292c5972bf9741aec38a19",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "ffffff7fffffff7fffffff7fffffff7f",
+          "msg" : "da92bff77f6be8fcaa2cfbfb9bbc01972066b87cfc04c4047f1fcfc1142cd6c11c432424e121038174325ec95ea37354f79600ad13a1d99aac484d58017802c2",
+          "ct" : "ffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7f",
+          "tag" : "c03d9f67354a97b2f074f7551557e49c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "ffffff7fffffff7fffffff7fffffff7f",
+          "msg" : "da92bff77f6be8fcaa2cfbfb9bbc01972066b87cfc04c4047f1fcfc1142cd6c11c432424e121038174325ec95ea37354f79600ad13a1d99aac484d58017802c28525bb3dbd964085aad80d0f53097a7d48b3a59d19f3faff67e5b647ba6c6dbb644d0dfb49b910b80c0f4e49e23cb792882cf4ba896d12470453fef7c7fb77b8",
+          "ct" : "ffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7f",
+          "tag" : "c86da8dd652286d50213d328d63e4006",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "7fffffff7fffffff7fffffff7fffffff",
+          "msg" : "5a92bf77ff6be87c2a2cfb7b1bbc0117a066b8fc7c04c484ff1fcf41942cd641",
+          "ct" : "7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff",
+          "tag" : "bede9083ceb36ddfe5fa811f95471c67",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "7fffffff7fffffff7fffffff7fffffff",
+          "msg" : "5a92bf77ff6be87c2a2cfb7b1bbc0117a066b8fc7c04c484ff1fcf41942cd6419c4324a461210301f4325e49dea373d47796002d93a1d91a2c484dd881780242",
+          "ct" : "7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff",
+          "tag" : "300874bb0692b689dead9ae15b067390",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "7fffffff7fffffff7fffffff7fffffff",
+          "msg" : "5a92bf77ff6be87c2a2cfb7b1bbc0117a066b8fc7c04c484ff1fcf41942cd6419c4324a461210301f4325e49dea373d47796002d93a1d91a2c484dd8817802420525bbbd3d9640052ad80d8fd3097afdc8b3a51d99f3fa7fe7e5b6c73a6c6d3be44d0d7bc9b910388c0f4ec9623cb712082cf43a096d12c78453fe7747fb7738",
+          "ct" : "7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff7fffffff",
+          "tag" : "99cad85f45ca40942d0d4d5e950ade22",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "00000000ffffffff00000000ffffffff",
+          "msg" : "256d40887f6be87c55d304849bbc0117df994703fc04c48480e030be142cd641",
+          "ct" : "00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "tag" : "8bbe145272e7c2d9a1891a3ab0983d9d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "00000000ffffffff00000000ffffffff",
+          "msg" : "256d40887f6be87c55d304849bbc0117df994703fc04c48480e030be142cd641e3bcdb5be12103018bcda1b65ea373d40869ffd213a1d91a53b7b22701780242",
+          "ct" : "00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "tag" : "3b41861913a8f6de7f61e225631bc382",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "00000000ffffffff00000000ffffffff",
+          "msg" : "256d40887f6be87c55d304849bbc0117df994703fc04c48480e030be142cd641e3bcdb5be12103018bcda1b65ea373d40869ffd213a1d91a53b7b227017802427ada4442bd9640055527f27053097afdb74c5ae219f3fa7f981a4938ba6c6d3b9bb2f28449b91038f3f0b136e23cb71277d30bc5896d12c7fbac0188c7fb7738",
+          "ct" : "00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "tag" : "8428bcf023ec6bf31fd9efb203ff0871",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "ffffffff00000000ffffffff00000000",
+          "msg" : "da92bf7780941783aa2cfb7b6443fee82066b8fc03fb3b7b7f1fcf41ebd329be",
+          "ct" : "ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000",
+          "tag" : "139fdf6474ea24f549b075825f2c7620",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "ffffffff00000000ffffffff00000000",
+          "msg" : "da92bf7780941783aa2cfb7b6443fee82066b8fc03fb3b7b7f1fcf41ebd329be1c4324a41edefcfe74325e49a15c8c2bf796002dec5e26e5ac484dd8fe87fdbd",
+          "ct" : "ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000",
+          "tag" : "bbad8d863b835a8e8664fd1d4566b6b4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000000000000000001ee3200",
+          "aad" : "ffffffff00000000ffffffff00000000",
+          "msg" : "da92bf7780941783aa2cfb7b6443fee82066b8fc03fb3b7b7f1fcf41ebd329be1c4324a41edefcfe74325e49a15c8c2bf796002dec5e26e5ac484dd8fe87fdbd8525bbbd4269bffaaad80d8facf6850248b3a51de60c058067e5b6c7459392c4644d0d7bb646efc70c0f4ec91dc348ed882cf43a7692ed380453fe77380488c7",
+          "ct" : "ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000",
+          "tag" : "42f2354297849a511d53e5571772f71f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "Flipped bit 0 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a2e3fdf9fba6861b5ad2607f40b7f447",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "Flipped bit 1 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a1e3fdf9fba6861b5ad2607f40b7f447",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "Flipped bit 7 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "23e3fdf9fba6861b5ad2607f40b7f447",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "Flipped bit 8 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a3e2fdf9fba6861b5ad2607f40b7f447",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "Flipped bit 31 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a3e3fd79fba6861b5ad2607f40b7f447",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "Flipped bit 32 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a3e3fdf9faa6861b5ad2607f40b7f447",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "Flipped bit 33 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a3e3fdf9f9a6861b5ad2607f40b7f447",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "Flipped bit 63 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a3e3fdf9fba6869b5ad2607f40b7f447",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "Flipped bit 64 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a3e3fdf9fba6861b5bd2607f40b7f447",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "Flipped bit 77 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a3e3fdf9fba6861b5af2607f40b7f447",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "Flipped bit 80 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a3e3fdf9fba6861b5ad2617f40b7f447",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "Flipped bit 96 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a3e3fdf9fba6861b5ad2607f41b7f447",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "Flipped bit 97 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a3e3fdf9fba6861b5ad2607f42b7f447",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "Flipped bit 120 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a3e3fdf9fba6861b5ad2607f40b7f446",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "Flipped bit 121 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a3e3fdf9fba6861b5ad2607f40b7f445",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "Flipped bit 126 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a3e3fdf9fba6861b5ad2607f40b7f407",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "Flipped bit 127 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a3e3fdf9fba6861b5ad2607f40b7f4c7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "Flipped bit 63 and 127 in tag expected tag:a3e3fdf9fba6861b5ad2607f40b7f447",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "a3e3fdf9fba6869b5ad2607f40b7f4c7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "Tag changed to all zero expected tag:a3e3fdf9fba6861b5ad2607f40b7f447",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "tag change to all 1 expected tag:a3e3fdf9fba6861b5ad2607f40b7f447",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "Flipped bit 0 in tag expected tag:27da374f17b7f1b23844a5490bfc4001",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "2cf8ae525fc86025268a4e1d88bead19",
+          "tag" : "26da374f17b7f1b23844a5490bfc4001",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "Flipped bit 1 in tag expected tag:27da374f17b7f1b23844a5490bfc4001",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "2cf8ae525fc86025268a4e1d88bead19",
+          "tag" : "25da374f17b7f1b23844a5490bfc4001",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "Flipped bit 7 in tag expected tag:27da374f17b7f1b23844a5490bfc4001",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "2cf8ae525fc86025268a4e1d88bead19",
+          "tag" : "a7da374f17b7f1b23844a5490bfc4001",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "Flipped bit 8 in tag expected tag:27da374f17b7f1b23844a5490bfc4001",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "2cf8ae525fc86025268a4e1d88bead19",
+          "tag" : "27db374f17b7f1b23844a5490bfc4001",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "Flipped bit 31 in tag expected tag:27da374f17b7f1b23844a5490bfc4001",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "2cf8ae525fc86025268a4e1d88bead19",
+          "tag" : "27da37cf17b7f1b23844a5490bfc4001",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "Flipped bit 32 in tag expected tag:27da374f17b7f1b23844a5490bfc4001",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "2cf8ae525fc86025268a4e1d88bead19",
+          "tag" : "27da374f16b7f1b23844a5490bfc4001",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "Flipped bit 33 in tag expected tag:27da374f17b7f1b23844a5490bfc4001",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "2cf8ae525fc86025268a4e1d88bead19",
+          "tag" : "27da374f15b7f1b23844a5490bfc4001",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "Flipped bit 63 in tag expected tag:27da374f17b7f1b23844a5490bfc4001",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "2cf8ae525fc86025268a4e1d88bead19",
+          "tag" : "27da374f17b7f1323844a5490bfc4001",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "Flipped bit 64 in tag expected tag:27da374f17b7f1b23844a5490bfc4001",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "2cf8ae525fc86025268a4e1d88bead19",
+          "tag" : "27da374f17b7f1b23944a5490bfc4001",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "Flipped bit 77 in tag expected tag:27da374f17b7f1b23844a5490bfc4001",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "2cf8ae525fc86025268a4e1d88bead19",
+          "tag" : "27da374f17b7f1b23864a5490bfc4001",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "Flipped bit 80 in tag expected tag:27da374f17b7f1b23844a5490bfc4001",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "2cf8ae525fc86025268a4e1d88bead19",
+          "tag" : "27da374f17b7f1b23844a4490bfc4001",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "Flipped bit 96 in tag expected tag:27da374f17b7f1b23844a5490bfc4001",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "2cf8ae525fc86025268a4e1d88bead19",
+          "tag" : "27da374f17b7f1b23844a5490afc4001",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "Flipped bit 97 in tag expected tag:27da374f17b7f1b23844a5490bfc4001",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "2cf8ae525fc86025268a4e1d88bead19",
+          "tag" : "27da374f17b7f1b23844a54909fc4001",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "Flipped bit 120 in tag expected tag:27da374f17b7f1b23844a5490bfc4001",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "2cf8ae525fc86025268a4e1d88bead19",
+          "tag" : "27da374f17b7f1b23844a5490bfc4000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "Flipped bit 121 in tag expected tag:27da374f17b7f1b23844a5490bfc4001",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "2cf8ae525fc86025268a4e1d88bead19",
+          "tag" : "27da374f17b7f1b23844a5490bfc4003",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "Flipped bit 126 in tag expected tag:27da374f17b7f1b23844a5490bfc4001",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "2cf8ae525fc86025268a4e1d88bead19",
+          "tag" : "27da374f17b7f1b23844a5490bfc4041",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "Flipped bit 127 in tag expected tag:27da374f17b7f1b23844a5490bfc4001",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "2cf8ae525fc86025268a4e1d88bead19",
+          "tag" : "27da374f17b7f1b23844a5490bfc4081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "Flipped bit 63 and 127 in tag expected tag:27da374f17b7f1b23844a5490bfc4001",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "2cf8ae525fc86025268a4e1d88bead19",
+          "tag" : "27da374f17b7f1323844a5490bfc4081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "Tag changed to all zero expected tag:27da374f17b7f1b23844a5490bfc4001",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "2cf8ae525fc86025268a4e1d88bead19",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "tag change to all 1 expected tag:27da374f17b7f1b23844a5490bfc4001",
+          "key" : "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "616164",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "2cf8ae525fc86025268a4e1d88bead19",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "checking for int overflows",
+          "key" : "3030303030303030303030303030303030303030303030303030303030303030",
+          "iv" : "30303030303030300002506e",
+          "aad" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "msg" : "d4500bf009493551c380adf52c573a69df7e8b762463330facc16a5726be7190c63c5a1c926584a096756828dcdc64acdf963d931bf1dae238f3f157224ac4b542d785b0dd84db6be3bc5a3663e84149ffbed09e54f78f16a8223b24cb019f58b21b0e551e7aa07327629551376ccbc3937671a0629bd95c9915c78555771e7a",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "0b300d8da56c2185755279553c4c82ca",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "checking for int overflows",
+          "key" : "3030303030303030303030303030303030303030303030303030303030303030",
+          "iv" : "3030303030303030000318a5",
+          "aad" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "msg" : "7de87f6729945275d0655da4c7fde4569e16f111b5eb26c22d859e3ff822eced3a6dd9a60f22957f7b7c857e8822eb9fe0b8d7022141f2d0b48f4b5612d322a88dd0fe0b4d9179324f7c6c9e990efbd80e5ed6775826498b1efe0f71a0f3ec5b29cb28c2540a7dcd51b7daaee0ff4a7f3ac1ee54c29ee4c170de408f66692194",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "c578e2aa44d309b7b6a5193bdc6118f5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "checking for int overflows",
+          "key" : "3030303030303030303030303030303030303030303030303030303030303030",
+          "iv" : "00000000000000000007b4f0",
+          "aad" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "msg" : "1b996f9a3ccc6785de22ff5b8add9502ce03a0faf5992a09522cdd1206d220b8f8bd07d1f1f5a1bd9a71d11c7f579b855818c08d4de036393183b7f590b335aed8de5b57b13c5fede2441c3e184aa9d46e61598506b3e11c43c62cbcaceced33190875b012218b1930fb7c38ec45ac11c353d0cf938dccb9efad8fedbe46daa5",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "4b0bda8ad043830d8319ab82c50c7663",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "checking for int overflows",
+          "key" : "3030303030303030303030303030303030303030303030303030303030303030",
+          "iv" : "00000000000000000020fb66",
+          "aad" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "msg" : "86cbacae4d3f74ae01213e0551cc15160ea1be8408e3d5d74f01464995a69e6176cb9e02b2247ed299892f9182a45caf4c69405611766edfafdc285519ea30480c44f05e781eacf8fcecc7090abb28fa5fd585ac8cda7e8772e594e4ce6c883281932e0f89f877a1f04d9c32b06cf90b0e762b430c4d517c97107068f498ef7f",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "4bc98f72c494c2a43c2b15a1043f1cfa",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "checking for int overflows",
+          "key" : "3030303030303030303030303030303030303030303030303030303030303030",
+          "iv" : "00000000000000000038bb90",
+          "aad" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "msg" : "fab1cddf4fe198ef63add881d6ead6c57637bbe92018ca7c0b96fba0871e932db1fbf90761be25df8dfaf931ce5757e617b3d7a9f0bf0ffe5d591a33c143b8f53fd0b5a19609fd62e5c251a4281a200cfdc34f281710406f4e37625446ff6ef224913deb0d89af337128e3d155d16d3ec3246041432143e9ab3a6d2ccc2f4d62",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "f7e9e151b02533c74658bfc7737c680d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "checking for int overflows",
+          "key" : "3030303030303030303030303030303030303030303030303030303030303030",
+          "iv" : "00000000000000000070484a",
+          "aad" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "msg" : "227202be7f3515e9d1c02eea2f1950b6481b048a4c91506cb40d504e6c949f82d197c25ad17dc721651125782ac7a71247feaef32f1f250ce4bb8f79acaa179d45a7b0545f0924325efa87d5e441d28478c61f2223ee67c3b41f4394535e2a24369a2e16613c459490c14fb1d755fe53fbe1ee45b1b21f7162e2fcaa742abefd",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "795bcff647c553c2e4eb6e0eafd9e04e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "checking for int overflows",
+          "key" : "3030303030303030303030303030303030303030303030303030303030303030",
+          "iv" : "000000000000000000932f40",
+          "aad" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "msg" : "fae58345c16cb0f5cc537f2b1b3469c969463b3ea71bcf6b98d669a8e60e04fc08d5fd069c362638e3400ef4cb242e27e2245e68cb9ec583da5340b12edf423b7326ad20feeb57daca2e0467a32899b42df8e56d84e006bc8a7acc731e7c1f6becb5719f7077f0d4f4c61ab11ebac1001801ce33c4e4a77d831d3ce34e8410e1",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "1946d653960f947a74d3e8093cf48502",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "checking for int overflows",
+          "key" : "3030303030303030303030303030303030303030303030303030303030303030",
+          "iv" : "000000000000000000e29335",
+          "aad" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "msg" : "ebb216ddd7ca709215f503df9ce63c5cd2194e7d9099e8a90b2afaad5eba35069925a603fdbc341aaed41505b10941fa3856a7e247b1040709746cfc2096caa631b2fff41c250506d889c1c90671ade853ee6394c19192a5cf3710d1073099e5bc946582fc0fab9f543c716ae2486a8683fdca39d2e14f23d00a582664f4ecb1",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "36c3002985dd21baf895d633573f12c0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "checking for int overflows",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000000ef7d5",
+          "aad" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "msg" : "408ae6ef1c7ef0fb2c2d610816fc7849efa58f78273f5f166ea65f81b575747d035b3040fede1eb9459788669788408e00413b3e376d152d204aa2b7a83558fcd48a0ef7a26b1cd6d35d23b3f5dfe0ca77a4ce32b94abf83da2aefcaf068380879e89fb0a3829595cf44c3852ae2cc662b689f9355d9c183801f6acc313f8907",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "6514518e0a264142e0b7351f967fc2ae",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "checking for int overflows",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000003dfce4",
+          "aad" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "msg" : "0a0a24499bcade58cf1576c312aca984718cb4cc7e0153f5a9015810859644dfc021174e0b060a397448de8b484a8603be680a6934c0906f30dd17eae2d4c5faa777f8ca53370e08331b88c342bac959787bbb33930e3b56be86da7f2a6eb1f94089d1d181074d4302f8e0552d0de1fab306a21b42d4c3ba6e6f0cbcc81e877a",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "4c194da6a99fd65b40e9cad798f44b19",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "checking for int overflows",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000018486a8",
+          "aad" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "msg" : "4a0aaff8494729188691701340f3ce2b8a78eed3a0f065994b72484e7991d25c29aa075eb1fc16de93fe069058112ab284a3ed18780326d1258a47222fa633d8b29f3bd9150b239b1546c2bb9b9f410febead396000ee477701532c3d0f5fbf895d280196d2f737c5e9fec50d92bb0df5d7e513be5b8ea971310d5bf16ba7aee",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "c8ae7788cd2874abc138541e11fd0587",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "checking for int overflows",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "msg" : "ff9428d079351f665cd001354319875c783d35f613e6d9093d38e975c38fe3b89f7aed35cb5a2fcaa0346efb936554649cf6378171eae4396ea15dc240d1abf4472d9096524fa1b2b023b8b288222773d4d206616f9293f65b45dbbc74e7c2edfbcbbf1cfb679bb739a5862de2bcb937f74d5bf8671c5a8a5092f61d54c9aa5b",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "933a5163c7f62368327b3fbc1036c943",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "special case tag",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "85ffffffffffffffffffffffffffffffa6902fcbc883bbc180b256ae34ad7f00",
+          "msg" : "9a49c40f8b48d7c66d1db4e53f20f2dd4aaa241ddab26b5bc0e218b72c3390f2df3ebd0176704419972bcdbc6bbcb3e4e74a71528ef51263ce24e0d575e0e44d",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "000102030405060708090a0b0c0d0e0f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "special case tag",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "ffffffffffffffffffffffffffffffff247e50642a1c0a2f8f77219609dba958",
+          "msg" : "9a49c40f8b48d7c66d1db4e53f20f2dd4aaa241ddab26b5bc0e218b72c3390f2df3ebd0176704419972bcdbc6bbcb3e4e74a71528ef51263ce24e0d575e0e44d",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "special case tag",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "7cffffffffffffffffffffffffffffffd9e72c064ac8961f3fa585e0e2abd600",
+          "msg" : "9a49c40f8b48d7c66d1db4e53f20f2dd4aaa241ddab26b5bc0e218b72c3390f2df3ebd0176704419972bcdbc6bbcb3e4e74a71528ef51263ce24e0d575e0e44d",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "special case tag",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "65ffffffffffffffffffffffffffffff95af0f4d0b686eaeccca4307d596f502",
+          "msg" : "9a49c40f8b48d7c66d1db4e53f20f2dd4aaa241ddab26b5bc0e218b72c3390f2df3ebd0176704419972bcdbc6bbcb3e4e74a71528ef51263ce24e0d575e0e44d",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "00000080000000800000008000000080",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "special case tag",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "ffffffffffffffffffffffffffffffff8540b464357707be3a39d55c34f8bcb3",
+          "msg" : "9a49c40f8b48d7c66d1db4e53f20f2dd4aaa241ddab26b5bc0e218b72c3390f2df3ebd0176704419972bcdbc6bbcb3e4e74a71528ef51263ce24e0d575e0e44d",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "ffffff7fffffff7fffffff7fffffff7f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "special case tag",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "4fffffffffffffffffffffffffffffff6623d990b898d830d212af2383330701",
+          "msg" : "9a49c40f8b48d7c66d1db4e53f20f2dd4aaa241ddab26b5bc0e218b72c3390f2df3ebd0176704419972bcdbc6bbcb3e4e74a71528ef51263ce24e0d575e0e44d",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "01000000010000000100000001000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "special case tag",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "000102030405060708090a0b",
+          "aad" : "83ffffffffffffffffffffffffffffff5f16d09f17787211b7d484e024f89701",
+          "msg" : "9a49c40f8b48d7c66d1db4e53f20f2dd4aaa241ddab26b5bc0e218b72c3390f2df3ebd0176704419972bcdbc6bbcb3e4e74a71528ef51263ce24e0d575e0e44d",
+          "ct" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "tag" : "ffffffff000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "005235d2a919f28d3db7664a34ae6b444d3d35f613e6d9093d38e975c38fe3b85b8b94509e2b74a36d346e33d572659ba9f6378171eae4396ea15dc240d1abf483dce9f3073efadb7d23b87ace35168c",
+          "ct" : "0039e2fd2fd312149e989880884813e7caffffffffffffffffffffffffffffff3b0e869aaa8ea49632ffff37b9e8ce00caffffffffffffffffffffffffffffff3b0e869aaa8ea49632ffff37b9e8ce00",
+          "tag" : "a519ac1a35b4a57787510af78d8d200a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "d39428d079351f665cd001354319875ce5da78766fa19290c031f75208506745ae7aed35cb5a2fcaa0346efb93655464496ddeb05509c6efffab75eb2df4ab09762d9096524fa1b2b023b8b2882227730149ef504b71b120ca4ff39519c2c210",
+          "ct" : "d3ffffffffffffffffffffffffffffff6218b27f83b8b46602f6e1d834207b02ceffffffffffffffffffffffffffffff2a6416cedb1cdd296ef5d7d692daff02ceffffffffffffffffffffffffffffff2a6416cedb1cdd296ef5d7d692daff02",
+          "tag" : "302fe82ab0a09af64400d015ae83d9cc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "e99428d079351f665cd001354319875c6df1394edc539b5b3a0957be0fb85946807aed35cb5a2fcaa0346efb93655464d1769fe806bbfeb6f590950f2eac9e0a582d9096524fa1b2b023b8b2882227739952ae0818c38979c07413711a9af713",
+          "ct" : "e9ffffffffffffffffffffffffffffffea33f347304abdadf8ce413433c84501e0ffffffffffffffffffffffffffffffb27f579688aee57064ce37329182ca01e0ffffffffffffffffffffffffffffffb27f579688aee57064ce37329182ca01",
+          "tag" : "98a7e836e0ee4d023500d0557ec2cbe0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "ff9428d079351f665cd001354319875c64f90f5b2692b860d4596ff4b3402c5c00b9bb53707aa667d356fe50c7199694033561e7caca6d941dc3cd6914ad6904",
+          "ct" : "ffffffffffffffffffffffffffffffffe33bc552ca8b9e96169e797e8f30301b603ca99944df76528c9d6f54ab833d0f603ca99944df76528c9d6f54ab833d0f",
+          "tag" : "6ab8dce2c59da4737130b0252f68a8d8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "689428d079351f665cd001354319875cb08f25675b9bcbf6e38407de2ec75a479f7aed35cb5a2fcaa0346efb936554642d2af7cd6b080501d31ba54fb2eb7596472d9096524fa1b2b023b8b288222773650ec62d757072cee6ff233186dd1c8f",
+          "ct" : "68ffffffffffffffffffffffffffffff374def6eb782ed002143115412b74600ffffffffffffffffffffffffffffffff4e233fb3e51d1ec7424507720dc5219dffffffffffffffffffffffffffffffff4e233fb3e51d1ec7424507720dc5219d",
+          "tag" : "044dea608880412bfdffcf35579e9b26",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "6d9428d079351f665cd001354319875ca161b5ab040900629efeff78d7d86b459f7aed35cb5a2fcaa0346efb93655464c6f8078cc8ef12a0ff657d6d08db10b8472d9096524fa1b2b023b8b2882227738edc366cd697656fca81fb133ced79a1",
+          "ct" : "6dffffffffffffffffffffffffffffff26a37fa2e81026945c39e9f2eba87702ffffffffffffffffffffffffffffffffa5f1cff246fa09666e3bdf50b7f544b3ffffffffffffffffffffffffffffffffa5f1cff246fa09666e3bdf50b7f544b3",
+          "tag" : "1e6bea6314542e2ef9ffcf450b2e982b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "ff9428d079351f665cd001354319875cfc01b891e5f0f9128d7d1c579192b69863414415b69968959a7291b7a5af134860cd9ea10c29a36654e7a28e761becd8",
+          "ct" : "ffffffffffffffffffffffffffffffff7bc3729809e9dfe44fba0addade2aadf03c456df823cb8a0c5b900b3c935b8d303c456df823cb8a0c5b900b3c935b8d3",
+          "tag" : "ed2017c8dba4775629049d786e3bceb1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "ff9428d079351f665cd001354319875c6b6dc9d21a819e70b577f44137d3d6bd1335f5eb44494077b26449a54b6c7c7510b92f5ffef98b847cf17a9c98d883e5",
+          "ct" : "ffffffffffffffffffffffffffffffffecaf03dbf698b88677b0e2cb0ba3cafa73b0e72170ec9042edafd8a127f6d7ee73b0e72170ec9042edafd8a127f6d7ee",
+          "tag" : "073f17cb6778645925049d8822cbcab6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "ffcb2b1106f8234c5e99d4db4c7048de323d35f613e6d9093d38e975c38fe3b816e9884a114f0e9266cea3885fe36b9fd6f6378171eae4396ea15dc240d1abf4cebef5e9885a80ea76d975c144a41888",
+          "ct" : "ffa0fc3e8032c3d5fdb62a11f096307db5ffffffffffffffffffffffffffffff766c9a8025eadea73905328c3379c004b5ffffffffffffffffffffffffffffff766c9a8025eadea73905328c3379c004",
+          "tag" : "8b9bb4b4861289658c696a8340150405",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "6f9e70ed3b8baca026e46a5a0943158d213d35f613e6d9093d38e975c38fe3b80c612c5e8d89a873dbcaad5b7346429bc5f6378171eae4396ea15dc240d1abf4d43651fd149c260bcbdd7b126801318c",
+          "ct" : "6ff5a7c2bd414c3985cb9490b5a56d2ea6ffffffffffffffffffffffffffffff6ce43e94b92c784684013c5f1fdce900a6ffffffffffffffffffffffffffffff6ce43e94b92c784684013c5f1fdce900",
+          "tag" : "8b3bbd51644459568d81ca1fa72ce404",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "412b080a3e19c10d44a1af1eabdeb4ce353d35f613e6d9093d38e975c38fe3b86b8394330921486ca11d291c3e97ee9ad1f6378171eae4396ea15dc240d1abf4b3d4e9909034c614b10aff5525d09d8d",
+          "ct" : "4140df25b8d32194e78e51d41738cc6db2ffffffffffffffffffffffffffffff0b0686f93d849859fed6b818520d4501b2ffffffffffffffffffffffffffffff0b0686f93d849859fed6b818520d4501",
+          "tag" : "86fbab2b4a94f47aa56f0aea65d11008",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "b247a74723491aacacaad709c91e932b313d35f613e6d9093d38e975c38fe3b89ade04e75bb701d9660601b34765de98d5f6378171eae4396ea15dc240d1abf442897944c2a28fa17611d7fa5c22ad8f",
+          "ct" : "b22c7068a583fa350f8529c375f8eb88b6fffffffffffffffffffffffffffffffa5b162d6f12d1ec39cd90b72bff7503b6fffffffffffffffffffffffffffffffa5b162d6f12d1ec39cd90b72bff7503",
+          "tag" : "a019ac2ed667e17da16f0afa19610d0d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "740f9e49f610efa585b659ca6ed8b4992d3d35f613e6d9093d38e975c38fe3b8412d96afbe80ec3e79d451b00a2db29ac9f6378171eae4396ea15dc240d1abf4997aeb0c2795624669c387f9116ac18d",
+          "ct" : "7464496670da0f3c2699a700d23ecc3aaaffffffffffffffffffffffffffffff21a884658a253c0b261fc0b466b71901aaffffffffffffffffffffffffffffff21a884658a253c0b261fc0b466b71901",
+          "tag" : "736e18181696a5889c3159faabab20fd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "adba5d105bc8aa062c2336cb889ddbd5373d35f613e6d9093d38e975c38fe3b8177c5ffe2875f468f6c2965748f3599ad3f6378171eae4396ea15dc240d1abf4cf2b225db1607a10e6d5401e53b42a8d",
+          "ct" : "add18a3fdd024a9f8f0cc801347ba376b0ffffffffffffffffffffffffffffff77f94d341cd0245da90907532469f201b0ffffffffffffffffffffffffffffff77f94d341cd0245da90907532469f201",
+          "tag" : "bad58f10a91e6a889aba32fd17d8331a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "fe9428d079351f665cd001354319875cc001edc5da442e719bce9abe273af144b47aed35cb5a2fcaa0346efb9365546448025f41fa4e336c786957a2a7c4930a6c2d9096524fa1b2b023b8b28822277300266ea1e43644a34d8dd1dc93f2fa13",
+          "ct" : "feffffffffffffffffffffffffffffff47c327cc365d088759098c341b4aed03d4ffffffffffffffffffffffffffffff2b0b973f745b28aae937f59f18eac701d4ffffffffffffffffffffffffffffff2b0b973f745b28aae937f59f18eac701",
+          "tag" : "d68ce174079add028dd05cf814630488",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "b513b06ab9ac14435acb8aa3a37afdb6543d35f613e6d9093d38e975c38fe3b861950193b1bf0311ff117989aed9a999b0f6378171eae4396ea15dc240d1abf4b9c27c3028aa8d69ef06afc0b59eda8e",
+          "ct" : "b57867453f66f4daf9e474691f9c8515d3ffffffffffffffffffffffffffffff01101359851ad324a0dae88dc2430202d3ffffffffffffffffffffffffffffff01101359851ad324a0dae88dc2430202",
+          "tag" : "aa48a3887d4b059699c2fdf9c6787e0a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "ff9428d079351f665cd001354319875cd4f109e814cea85a08c011d850dd1dcbcf7aed35cb5a2fcaa0346efb936554645340b85a9aa08296b77a5fc3961f660f172d9096524fa1b2b023b8b2882227731b6489ba84d8f559829ed9bda2290f16",
+          "ct" : "ffffffffffffffffffffffffffffffff5333c3e1f8d78eacca0707526cad018cafffffffffffffffffffffffffffffff3049702414b599502624fdfe29313204afffffffffffffffffffffffffffffff3049702414b599502624fdfe29313204",
+          "tag" : "b936a817f2211af129e2cf160fd42bcb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "ff9428d079351f665cd001354319875cdf4c62032d4119b588477e99925a56d9d67aed35cb5a2fcaa0346efb93655464fa84f0645536421b2bb9246ec219ed0b0e2d9096524fa1b2b023b8b288222773b2a0c1844b4e35d41e5da210f62f8412",
+          "ct" : "ffffffffffffffffffffffffffffffff588ea80ac1583f434a806813ae2a4a9eb6ffffffffffffffffffffffffffffff998d381adb2359ddbae786537d37b900b6ffffffffffffffffffffffffffffff998d381adb2359ddbae786537d37b900",
+          "tag" : "9f7ac4351f6b91e63097a713115d05be",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "ff9428d079351f665cd001354319875c13f80a006dc1bbdad639a92fc7eca655f77aed35cb5a2fcaa0346efb936554646348b8fd29bf96d563a517e27d7bfc0f2f2d9096524fa1b2b023b8b2882227732b6c891d37c7e11a5641919c494d9516",
+          "ct" : "ffffffffffffffffffffffffffffffff943ac00981d89d2c14febfa5fb9cba1297ffffffffffffffffffffffffffffff00417083a7aa8d13f2fbb5dfc255a80497ffffffffffffffffffffffffffffff00417083a7aa8d13f2fbb5dfc255a804",
+          "tag" : "9a18a828070269f44700d009e7171cc9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "ff9428d079351f665cd001354319875c82e59b4582915038f933811e652dc66afc7aed35cb5a2fcaa0346efb93655464b671c8cac270c265a0ac2f535799880a242d9096524fa1b2b023b8b288222773fe55f92adc08b5aa9548a92d63afe113",
+          "ct" : "ffffffffffffffffffffffffffffffff0527514c6e8876ce3bf49794595dda2d9cffffffffffffffffffffffffffffffd57800b44c65d9a331f28d6ee8b7dc019cffffffffffffffffffffffffffffffd57800b44c65d9a331f28d6ee8b7dc01",
+          "tag" : "b436a82b93d555f74300d0199ba718ce",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "ff9428d079351f665cd001354319875cf1d12887b7216986a12d79098b6de60fc07aed35cb5a2fcaa0346efb93655464a7c75899f3e60af1fcb6c7307d87590f182d9096524fa1b2b023b8b288222773efe36979ed9e7d3ec952414e49b13016",
+          "ct" : "ffffffffffffffffffffffffffffffff7613e28e5b384f7063ea6f83b71dfa48a0ffffffffffffffffffffffffffffffc4ce90e77df311376de8650dc2a90d04a0ffffffffffffffffffffffffffffffc4ce90e77df311376de8650dc2a90d04",
+          "tag" : "ce54a82e1fa942fa3f00d0294f3715d3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "cbf1da9e0ba9377374e69e1c0e600cfc343d35f613e6d9093d38e975c38fe3b8be3fa66b6ce7808aa3e45949f944649fd0f6378171eae4396ea15dc240d1abf46668dbc8f5f20ef2b3f38f00e2031788",
+          "ct" : "cb9a0db18d63d7ead7c960d6b286745fb3ffffffffffffffffffffffffffffffdebab4a1584250bffc2fc84d95decf04b3ffffffffffffffffffffffffffffffdebab4a1584250bffc2fc84d95decf04",
+          "tag" : "2383ab0b799205699b510aa709bf31f1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "8f278694c4e9daebd58d3e5b966e8b68423d35f613e6d9093d38e975c38fe3b80653e7a331718833acc3b9adff1c3198a6f6378171eae4396ea15dc240d1abf4de049a00a864064bbcd46fe4e45b428f",
+          "ct" : "8f4c51bb42233a7276a2c0912a88f3cbc5ffffffffffffffffffffffffffffff66d6f56905d45806f30828a993869a03c5ffffffffffffffffffffffffffffff66d6f56905d45806f30828a993869a03",
+          "tag" : "8bfbab17a9e0b8748b510ae7d9fd2305",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "d59428d079351f665cd001354319875c9a22d70a48e24fddcdd4419de64c8f44fc7aed35cb5a2fcaa0346efb9365546477b5c907d9c9e1ea51851a204aad9f0a242d9096524fa1b2b023b8b2882227733f91f8e7c7b1962564619c5e7e9bf613",
+          "ct" : "d5ffffffffffffffffffffffffffffff1de01d03a4fb692b0f135717da3c93039cffffffffffffffffffffffffffffff14bc017957dcfa2cc0dbb81df583cb019cffffffffffffffffffffffffffffff14bc017957dcfa2cc0dbb81df583cb01",
+          "tag" : "49bc6e9fc51c4d503036644d842773d2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 145,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "db9428d079351f665cd001354319875c75d5643aa5af934d8cce392cc3eedb47c07aed35cb5a2fcaa0346efb93655464601b5ad2067f28066a8f3281715ba808182d9096524fa1b2b023b8b288222773283f6b3218075fc95f6bb4ff456dc111",
+          "ct" : "dbfffffffffffffffffffffffffffffff217ae3349b6b5bb4e092fa6ff9ec700a0ffffffffffffffffffffffffffffff031292ac886a33c0fbd190bcce75fc03a0ffffffffffffffffffffffffffffff031292ac886a33c0fbd190bcce75fc03",
+          "tag" : "63da6ea251f039532c36645d38b76fd7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 146,
+          "comment" : "edge case intermediate sums in poly1305",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "0000000000000000064c2d52",
+          "aad" : "ffffffff",
+          "msg" : "939428d079351f665cd001354319875c624839604216e403ebcc6af559ec8b43977aed35cb5a2fcaa0346efb93655464d8c8c3fa1a9e474abe52d02c8187e90f4f2d9096524fa1b2b023b8b28822277390ecf21a04e630858bb65652b5b18016",
+          "ct" : "93ffffffffffffffffffffffffffffffe58af369ae0fc2f5290b7c7f659c9704f7ffffffffffffffffffffffffffffffbbc10b84948b5c8c2f0c72113ea9bd04f7ffffffffffffffffffffffffffffffbbc10b84948b5c8c2f0c72113ea9bd04",
+          "tag" : "73eb2724b5c405f04d00d0f15840a1c1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 64,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 147,
+          "comment" : "invalid nonce size",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "5f5f5f5f5f5f5f5f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 80,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 148,
+          "comment" : "invalid nonce size",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "5f5f5f5f5f5f5f5f5f5f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 88,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 149,
+          "comment" : "invalid nonce size",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "5f5f5f5f5f5f5f5f5f5f5f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 112,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 150,
+          "comment" : "invalid nonce size",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "5f5f5f5f5f5f5f5f5f5f5f5f5f5f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "ivSize" : 128,
+      "keySize" : 256,
+      "tagSize" : 128,
+      "type" : "AeadTest",
+      "tests" : [
+        {
+          "tcId" : 151,
+          "comment" : "invalid nonce size",
+          "key" : "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f",
+          "iv" : "5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f",
+          "aad" : "",
+          "msg" : "",
+          "ct" : "",
+          "tag" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/dsa_test.json b/third_party/wycheproof/testvectors/dsa_test.json
new file mode 100644
index 0000000..144e98e
--- /dev/null
+++ b/third_party/wycheproof/testvectors/dsa_test.json
@@ -0,0 +1,7795 @@
+{
+  "algorithm" : "DSA",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "BER" : "This is a signature with correct values for (r, s) but using some alternative BER encoding instead of DER encoding. Implementations should not accept such signatures to limit signature malleability.",
+    "EdgeCase" : "Some implementations of DSA do not properly check for boundaries. In some cases the modular inverse of 0 is simply 0. As a result there are implementations where values such as r=1, s=0 lead to forgeries.",
+    "NoLeadingZero" : "ASN encoded integers with a leading hex-digit in the range 8 .. F are negative. If the first hex-digit of a positive integer is 8 .. F then a leading 0 must be added. Some libraries forgot to do this an therefore generated invalid DSA signatures. Some providers, accept such legacy signatures for compatibility."
+  },
+  "numberOfTests" : 855,
+  "header" : [],
+  "testGroups" : [
+    {
+      "key" : {
+        "g" : "0835aa8c358bbf01a1846d1206323fabe408b0e98789fcc6239da14d4b3f86c276a8f48aa85a59507e620ad1bc745f0f1cbf63ec98c229c2610d77c634d1642e404354771655b2d5662f7a45227178ce3430af0f6b3bb94b52f7f51e97bad659b1ba0684e208be624c28d82fb1162f18dd9dce45216461654cf3374624d15a8d",
+        "keySize" : 1024,
+        "p" : "0b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f",
+        "q" : "0b90b38ba0a50a43ec6898d3f9b68049777f489b1",
+        "type" : "DSAPublicKey",
+        "y" : "173931dda31eff32f24b383091bf77eacdc6efd557624911d8e9b9debf0f256d0cffac5567b33f6eaae9d3275bbed7ef9f5f94c4003c959e49a1ed3f58c31b21baccc0ed8840b46145f121b8906d072129bae01f071947997e8ef760d2d9ea21d08a5eb7e89390b21a85664713c549e25feda6e9e6c31970866bdfbc8fa981f6"
+      },
+      "keyDer" : "308201b63082012b06072a8648ce3804013082011e02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f021500b90b38ba0a50a43ec6898d3f9b68049777f489b10281800835aa8c358bbf01a1846d1206323fabe408b0e98789fcc6239da14d4b3f86c276a8f48aa85a59507e620ad1bc745f0f1cbf63ec98c229c2610d77c634d1642e404354771655b2d5662f7a45227178ce3430af0f6b3bb94b52f7f51e97bad659b1ba0684e208be624c28d82fb1162f18dd9dce45216461654cf3374624d15a8d03818400028180173931dda31eff32f24b383091bf77eacdc6efd557624911d8e9b9debf0f256d0cffac5567b33f6eaae9d3275bbed7ef9f5f94c4003c959e49a1ed3f58c31b21baccc0ed8840b46145f121b8906d072129bae01f071947997e8ef760d2d9ea21d08a5eb7e89390b21a85664713c549e25feda6e9e6c31970866bdfbc8fa981f6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBtjCCASsGByqGSM44BAEwggEeAoGBALNM6cHngpTTJYRzhCAF0qSMjFZs/Kj4\nTAYG8lKbWabTiq4HG1O7IWfqpPw7Af4Xbnh+SBtgN6rGLLw9CJeZU2qGn6jN/qHo\nsf0tHNOjA1CFmizWs+wvm/u2i7EbS74q2qGNZKk2OVQ65eFik+MRwM+MjW4YDfBd\nCML9LZPVcHUfAhUAuQs4ugpQpD7GiY0/m2gEl3f0ibECgYAINaqMNYu/AaGEbRIG\nMj+r5Aiw6YeJ/MYjnaFNSz+Gwnao9IqoWllQfmIK0bx0Xw8cv2PsmMIpwmENd8Y0\n0WQuQENUdxZVstVmL3pFInF4zjQwrw9rO7lLUvf1Hpe61lmxugaE4gi+Ykwo2C+x\nFi8Y3Z3ORSFkYWVM8zdGJNFajQOBhAACgYAXOTHdox7/MvJLODCRv3fqzcbv1Vdi\nSRHY6bnevw8lbQz/rFVnsz9uqunTJ1u+1++fX5TEADyVnkmh7T9YwxshuszA7YhA\ntGFF8SG4kG0HISm64B8HGUeZfo73YNLZ6iHQil636JOQshqFZkcTxUniX+2m6ebD\nGXCGa9+8j6mB9g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-1",
+      "type" : "DSAVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "Legacy:ASN encoding of r misses leading 0",
+          "msg" : "313233343030",
+          "sig" : "302c0214aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "acceptable",
+          "flags" : [
+            "NoLeadingZero"
+          ]
+        },
+        {
+          "tcId" : 2,
+          "comment" : "valid",
+          "msg" : "313233343030",
+          "sig" : "302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30812d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "302e02811500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "302e021500aa6a258fbf7d90e15614676d377df8b10e38db4a028114496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3082002d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "302f0282001500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a02820014496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "302e021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "302c021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "302d021600aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "302d021400aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0215496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0213496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3085010000002d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "30320285010000001500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3032021500aa6a258fbf7d90e15614676d377df8b10e38db4a02850100000014496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "308901000000000000002d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3036028901000000000000001500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3036021500aa6a258fbf7d90e15614676d377df8b10e38db4a0289010000000000000014496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30847fffffff021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "303102847fffffff00aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "3031021500aa6a258fbf7d90e15614676d377df8b10e38db4a02847fffffff496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3084ffffffff021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "30310284ffffffff00aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3031021500aa6a258fbf7d90e15614676d377df8b10e38db4a0284ffffffff496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3085ffffffffff021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "30320285ffffffffff00aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3032021500aa6a258fbf7d90e15614676d377df8b10e38db4a0285ffffffffff496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3088ffffffffffffffff021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "30350288ffffffffffffffff00aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3035021500aa6a258fbf7d90e15614676d377df8b10e38db4a0288ffffffffffffffff496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30ff021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "302d02ff00aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a02ff496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "302d028000aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0280496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "302f0000021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3032498177302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30312500302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "302f302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3032221a498177021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "303122192500021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30352217021500aa6a258fbf7d90e15614676d377df8b10e38db4a0004deadbeef0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3032021500aa6a258fbf7d90e15614676d377df8b10e38db4a22194981770214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3031021500aa6a258fbf7d90e15614676d377df8b10e38db4a221825000214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3035021500aa6a258fbf7d90e15614676d377df8b10e38db4a22160214496d5220b5f67d3532d1f991203bc3523b964c3b0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3035aa00bb00cd00302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3033aa02aabb302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3035221daa00bb00cd00021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3033221baa02aabb021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3035021500aa6a258fbf7d90e15614676d377df8b10e38db4a221caa00bb00cd000214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3033021500aa6a258fbf7d90e15614676d377df8b10e38db4a221aaa02aabb0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "30312280021500aa6a258fbf7d90e15614676d377df8b10e38db4a00000214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3031021500aa6a258fbf7d90e15614676d377df8b10e38db4a22800214496d5220b5f67d3532d1f991203bc3523b964c3b0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3080312d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "30312280031500aa6a258fbf7d90e15614676d377df8b10e38db4a00000214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3031021500aa6a258fbf7d90e15614676d377df8b10e38db4a22800314496d5220b5f67d3532d1f991203bc3523b964c3b0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2e2d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2f2d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "312d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "322d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "ff2d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "3031300102302c1500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "302c021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "302c1500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b05000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "3080021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "302f3000021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "302f302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "3017021500aa6a258fbf7d90e15614676d377df8b10e38db4a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "3043021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "removing integer",
+          "msg" : "313233343030",
+          "sig" : "30160214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "3017020214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "3018021500aa6a258fbf7d90e15614676d377df8b10e38db4a02",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "302f021700aa6a258fbf7d90e15614676d377df8b10e38db4a00000214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a0216496d5220b5f67d3532d1f991203bc3523b964c3b0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "302f0217000000aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a02160000496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "appending unused 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a00000214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "302f021700aa6a258fbf7d90e15614676d377df8b10e38db4a05000214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "302f021500aa6a258fbf7d90e15614676d377df8b10e38db4a0216496d5220b5f67d3532d1f991203bc3523b964c3b0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "301802810214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "3019021500aa6a258fbf7d90e15614676d377df8b10e38db4a0281",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "301805000214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "3019021500aa6a258fbf7d90e15614676d377df8b10e38db4a0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "302d001500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "302d011500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "302d031500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "302d041500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "302dff1500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0014496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0114496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0314496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0414496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "302d021500aa6a258fbf7d90e15614676d377df8b10e38db4aff14496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "301802000214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "3019021500aa6a258fbf7d90e15614676d377df8b10e38db4a0200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "303122190201000214aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "3031021500aa6a258fbf7d90e15614676d377df8b10e38db4a221802014902136d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "302d021502aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a02144b6d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "302d021500aa6a258fbf7d90e15614676d377df8b10e38dbca0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964cbb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "302c021400aa6a258fbf7d90e15614676d377df8b10e38db0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "302c0214aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "302c021500aa6a258fbf7d90e15614676d377df8b10e38db4a0213496d5220b5f67d3532d1f991203bc3523b964c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "302c021500aa6a258fbf7d90e15614676d377df8b10e38db4a02136d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "302e0216ff00aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "302e021500aa6a258fbf7d90e15614676d377df8b10e38db4a0215ff496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "30190901800214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "301a021500aa6a258fbf7d90e15614676d377df8b10e38db4a090180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "30190201000214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "301a021500aa6a258fbf7d90e15614676d377df8b10e38db4a020100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "313233343030",
+          "sig" : "302d02150163755e49c9ce35201c9df4acd2e5fd48862d64fb0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "313233343030",
+          "sig" : "302c0214f15eecd5b52ceca28f8ada2d9c15f419964451990214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "313233343030",
+          "sig" : "302d0215ff5595da7040826f1ea9eb9892c882074ef1c724b60214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "313233343030",
+          "sig" : "302c02140ea1132a4ad3135d707525d263ea0be669bbae670214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "313233343030",
+          "sig" : "302d0215fe9c8aa1b63631cadfe3620b532d1a02b779d29b050214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "313233343030",
+          "sig" : "302d021501aa6a258fbf7d90e15614676d377df8b10e38db4a0214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "313233343030",
+          "sig" : "302c02145595da7040826f1ea9eb9892c882074ef1c724b60214496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "313233343030",
+          "sig" : "302e021500aa6a258fbf7d90e15614676d377df8b10e38db4a02150102788adac0472173f95b86d0bba3c7e9b38ad5ec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "313233343030",
+          "sig" : "302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a021490621966aba5d8f66c486c5184d3bebac3a1c28a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "313233343030",
+          "sig" : "302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a0214b692addf4a0982cacd2e066edfc43cadc469b3c5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "313233343030",
+          "sig" : "302d021500aa6a258fbf7d90e15614676d377df8b10e38db4a02146f9de699545a270993b793ae7b2c41453c5e3d76",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "313233343030",
+          "sig" : "302e021500aa6a258fbf7d90e15614676d377df8b10e38db4a0215fefd8775253fb8de8c06a4792f445c38164c752a14",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "313233343030",
+          "sig" : "302e021500aa6a258fbf7d90e15614676d377df8b10e38db4a021501496d5220b5f67d3532d1f991203bc3523b964c3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "313233343030",
+          "sig" : "302e021500aa6a258fbf7d90e15614676d377df8b10e38db4a021500b692addf4a0982cacd2e066edfc43cadc469b3c5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a0201000215ff46f4c745f5af5bc1397672c06497fb68880b764f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "3006020100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "3006020100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30060201000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301902010002145c859c5d0528521f6344c69fcdb4024bbbfa44d8",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301902010002145c859c5d0528521f6344c69fcdb4024bbbfa44d9",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a020100021500b90b38ba0a50a43ec6898d3f9b68049777f489b0",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a020100021500b90b38ba0a50a43ec6898d3f9b68049777f489b1",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a020100021500b90b38ba0a50a43ec6898d3f9b68049777f489b2",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a0201000215010000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30818702010002818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "3008020100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a0201010215ff46f4c745f5af5bc1397672c06497fb68880b764f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "3006020101020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30060201010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301902010102145c859c5d0528521f6344c69fcdb4024bbbfa44d8",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301902010102145c859c5d0528521f6344c69fcdb4024bbbfa44d9",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a020101021500b90b38ba0a50a43ec6898d3f9b68049777f489b0",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a020101021500b90b38ba0a50a43ec6898d3f9b68049777f489b1",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a020101021500b90b38ba0a50a43ec6898d3f9b68049777f489b2",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a0201010215010000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30818702010102818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "3008020101090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a0201ff0215ff46f4c745f5af5bc1397672c06497fb68880b764f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30060201ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30190201ff02145c859c5d0528521f6344c69fcdb4024bbbfa44d8",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30190201ff02145c859c5d0528521f6344c69fcdb4024bbbfa44d9",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a0201ff021500b90b38ba0a50a43ec6898d3f9b68049777f489b0",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a0201ff021500b90b38ba0a50a43ec6898d3f9b68049777f489b1",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a0201ff021500b90b38ba0a50a43ec6898d3f9b68049777f489b2",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a0201ff0215010000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "3081870201ff02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30080201ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302d02145c859c5d0528521f6344c69fcdb4024bbbfa44d80215ff46f4c745f5af5bc1397672c06497fb68880b764f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301902145c859c5d0528521f6344c69fcdb4024bbbfa44d8020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301902145c859c5d0528521f6344c69fcdb4024bbbfa44d8020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301902145c859c5d0528521f6344c69fcdb4024bbbfa44d80201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302c02145c859c5d0528521f6344c69fcdb4024bbbfa44d802145c859c5d0528521f6344c69fcdb4024bbbfa44d8",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302c02145c859c5d0528521f6344c69fcdb4024bbbfa44d802145c859c5d0528521f6344c69fcdb4024bbbfa44d9",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302d02145c859c5d0528521f6344c69fcdb4024bbbfa44d8021500b90b38ba0a50a43ec6898d3f9b68049777f489b0",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302d02145c859c5d0528521f6344c69fcdb4024bbbfa44d8021500b90b38ba0a50a43ec6898d3f9b68049777f489b1",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302d02145c859c5d0528521f6344c69fcdb4024bbbfa44d8021500b90b38ba0a50a43ec6898d3f9b68049777f489b2",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302d02145c859c5d0528521f6344c69fcdb4024bbbfa44d80215010000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30819a02145c859c5d0528521f6344c69fcdb4024bbbfa44d802818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301b02145c859c5d0528521f6344c69fcdb4024bbbfa44d8090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302d02145c859c5d0528521f6344c69fcdb4024bbbfa44d90215ff46f4c745f5af5bc1397672c06497fb68880b764f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301902145c859c5d0528521f6344c69fcdb4024bbbfa44d9020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301902145c859c5d0528521f6344c69fcdb4024bbbfa44d9020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301902145c859c5d0528521f6344c69fcdb4024bbbfa44d90201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302c02145c859c5d0528521f6344c69fcdb4024bbbfa44d902145c859c5d0528521f6344c69fcdb4024bbbfa44d8",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302c02145c859c5d0528521f6344c69fcdb4024bbbfa44d902145c859c5d0528521f6344c69fcdb4024bbbfa44d9",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302d02145c859c5d0528521f6344c69fcdb4024bbbfa44d9021500b90b38ba0a50a43ec6898d3f9b68049777f489b0",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302d02145c859c5d0528521f6344c69fcdb4024bbbfa44d9021500b90b38ba0a50a43ec6898d3f9b68049777f489b1",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302d02145c859c5d0528521f6344c69fcdb4024bbbfa44d9021500b90b38ba0a50a43ec6898d3f9b68049777f489b2",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302d02145c859c5d0528521f6344c69fcdb4024bbbfa44d90215010000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30819a02145c859c5d0528521f6344c69fcdb4024bbbfa44d902818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301b02145c859c5d0528521f6344c69fcdb4024bbbfa44d9090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b00215ff46f4c745f5af5bc1397672c06497fb68880b764f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a021500b90b38ba0a50a43ec6898d3f9b68049777f489b0020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a021500b90b38ba0a50a43ec6898d3f9b68049777f489b0020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a021500b90b38ba0a50a43ec6898d3f9b68049777f489b00201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302d021500b90b38ba0a50a43ec6898d3f9b68049777f489b002145c859c5d0528521f6344c69fcdb4024bbbfa44d8",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302d021500b90b38ba0a50a43ec6898d3f9b68049777f489b002145c859c5d0528521f6344c69fcdb4024bbbfa44d9",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b0021500b90b38ba0a50a43ec6898d3f9b68049777f489b0",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b0021500b90b38ba0a50a43ec6898d3f9b68049777f489b1",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b0021500b90b38ba0a50a43ec6898d3f9b68049777f489b2",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b00215010000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30819b021500b90b38ba0a50a43ec6898d3f9b68049777f489b002818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301c021500b90b38ba0a50a43ec6898d3f9b68049777f489b0090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b10215ff46f4c745f5af5bc1397672c06497fb68880b764f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 217,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a021500b90b38ba0a50a43ec6898d3f9b68049777f489b1020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 218,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a021500b90b38ba0a50a43ec6898d3f9b68049777f489b1020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 219,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a021500b90b38ba0a50a43ec6898d3f9b68049777f489b10201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 220,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302d021500b90b38ba0a50a43ec6898d3f9b68049777f489b102145c859c5d0528521f6344c69fcdb4024bbbfa44d8",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 221,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302d021500b90b38ba0a50a43ec6898d3f9b68049777f489b102145c859c5d0528521f6344c69fcdb4024bbbfa44d9",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 222,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b1021500b90b38ba0a50a43ec6898d3f9b68049777f489b0",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 223,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b1021500b90b38ba0a50a43ec6898d3f9b68049777f489b1",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 224,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b1021500b90b38ba0a50a43ec6898d3f9b68049777f489b2",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 225,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b10215010000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 226,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30819b021500b90b38ba0a50a43ec6898d3f9b68049777f489b102818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 227,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301c021500b90b38ba0a50a43ec6898d3f9b68049777f489b1090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 228,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b20215ff46f4c745f5af5bc1397672c06497fb68880b764f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 229,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a021500b90b38ba0a50a43ec6898d3f9b68049777f489b2020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 230,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a021500b90b38ba0a50a43ec6898d3f9b68049777f489b2020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 231,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a021500b90b38ba0a50a43ec6898d3f9b68049777f489b20201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 232,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302d021500b90b38ba0a50a43ec6898d3f9b68049777f489b202145c859c5d0528521f6344c69fcdb4024bbbfa44d8",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 233,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302d021500b90b38ba0a50a43ec6898d3f9b68049777f489b202145c859c5d0528521f6344c69fcdb4024bbbfa44d9",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 234,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b2021500b90b38ba0a50a43ec6898d3f9b68049777f489b0",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 235,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b2021500b90b38ba0a50a43ec6898d3f9b68049777f489b1",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 236,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b2021500b90b38ba0a50a43ec6898d3f9b68049777f489b2",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 237,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302e021500b90b38ba0a50a43ec6898d3f9b68049777f489b20215010000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 238,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30819b021500b90b38ba0a50a43ec6898d3f9b68049777f489b202818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 239,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301c021500b90b38ba0a50a43ec6898d3f9b68049777f489b2090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 240,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302e02150100000000000000000000000000000000000000000215ff46f4c745f5af5bc1397672c06497fb68880b764f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 241,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a0215010000000000000000000000000000000000000000020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 242,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a0215010000000000000000000000000000000000000000020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 243,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301a02150100000000000000000000000000000000000000000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 244,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302d021501000000000000000000000000000000000000000002145c859c5d0528521f6344c69fcdb4024bbbfa44d8",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 245,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302d021501000000000000000000000000000000000000000002145c859c5d0528521f6344c69fcdb4024bbbfa44d9",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 246,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302e0215010000000000000000000000000000000000000000021500b90b38ba0a50a43ec6898d3f9b68049777f489b0",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 247,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302e0215010000000000000000000000000000000000000000021500b90b38ba0a50a43ec6898d3f9b68049777f489b1",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 248,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302e0215010000000000000000000000000000000000000000021500b90b38ba0a50a43ec6898d3f9b68049777f489b2",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 249,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "302e02150100000000000000000000000000000000000000000215010000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 250,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30819b021501000000000000000000000000000000000000000002818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 251,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301c0215010000000000000000000000000000000000000000090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 252,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30819b02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f0215ff46f4c745f5af5bc1397672c06497fb68880b764f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 253,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30818702818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 254,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30818702818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 255,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30818702818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 256,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30819a02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f02145c859c5d0528521f6344c69fcdb4024bbbfa44d8",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 257,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30819a02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f02145c859c5d0528521f6344c69fcdb4024bbbfa44d9",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 258,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30819b02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f021500b90b38ba0a50a43ec6898d3f9b68049777f489b0",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 259,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30819b02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f021500b90b38ba0a50a43ec6898d3f9b68049777f489b1",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 260,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30819b02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f021500b90b38ba0a50a43ec6898d3f9b68049777f489b2",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 261,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30819b02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f0215010000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 262,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "3082010802818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 263,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "30818902818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 264,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301c090380fe010215ff46f4c745f5af5bc1397672c06497fb68880b764f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 265,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "3008090380fe01020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 266,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "3008090380fe01020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 267,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "3008090380fe010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 268,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301b090380fe0102145c859c5d0528521f6344c69fcdb4024bbbfa44d8",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 269,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301b090380fe0102145c859c5d0528521f6344c69fcdb4024bbbfa44d9",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 270,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301c090380fe01021500b90b38ba0a50a43ec6898d3f9b68049777f489b0",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 271,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301c090380fe01021500b90b38ba0a50a43ec6898d3f9b68049777f489b1",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 272,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301c090380fe01021500b90b38ba0a50a43ec6898d3f9b68049777f489b2",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 273,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "301c090380fe010215010000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 274,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "308189090380fe0102818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 275,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "313233343030",
+          "sig" : "300a090380fe01090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 276,
+          "comment" : "random signature",
+          "msg" : "313233343030",
+          "sig" : "302d0215008a5f67f95721189431b8bd78f145a0144bfe8cbf0214727808e1428ea9aa7fe1e62ce41e14de1f0441b0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 277,
+          "comment" : "random signature",
+          "msg" : "313233343030",
+          "sig" : "302d02140631c067b0b9272ebf1873d51213687b5b66e388021500938e3c5cd5ce3decb2c7a1d4c95408d3058d260a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 278,
+          "comment" : "random signature",
+          "msg" : "313233343030",
+          "sig" : "302d021500847d9264c3723d8c19eb890e5a5018e606e006a502144c59ad9e76c731a6c9dd70160eebd6186ee8b7f6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 279,
+          "comment" : "random signature",
+          "msg" : "313233343030",
+          "sig" : "302c021422ac1f8da14b7b28b0d12911a50622865408378502144b95e54a6cf4679c60d94aa04766a9367b86fd48",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 280,
+          "comment" : "random signature",
+          "msg" : "313233343030",
+          "sig" : "302c0214312efe6ed6cc2786a069ab45af12fdd57554cea402145a2adbe9edd8c81e8fe4e703094bf9734f17ed1c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "g" : "0835aa8c358bbf01a1846d1206323fabe408b0e98789fcc6239da14d4b3f86c276a8f48aa85a59507e620ad1bc745f0f1cbf63ec98c229c2610d77c634d1642e404354771655b2d5662f7a45227178ce3430af0f6b3bb94b52f7f51e97bad659b1ba0684e208be624c28d82fb1162f18dd9dce45216461654cf3374624d15a8d",
+        "keySize" : 1024,
+        "p" : "0b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f",
+        "q" : "0b90b38ba0a50a43ec6898d3f9b68049777f489b1",
+        "type" : "DSAPublicKey",
+        "y" : "713e9f8108a6a7075485a37ce1a3b040cce563a0445614fe099fb1bffd68acb36f9e04d8ad17ace3c136da66f730eb7ff18936424ffa4e5ae5b1e7dac375d8d164697254b8b7e848f5e79da25c79df5c0727d5da3498405cd0f4e46d136c351d703cc4bf0d3f4fbb165392888684964a93ad30fa179488cad4a6655dd4fa9754"
+      },
+      "keyDer" : "308201b63082012b06072a8648ce3804013082011e02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f021500b90b38ba0a50a43ec6898d3f9b68049777f489b10281800835aa8c358bbf01a1846d1206323fabe408b0e98789fcc6239da14d4b3f86c276a8f48aa85a59507e620ad1bc745f0f1cbf63ec98c229c2610d77c634d1642e404354771655b2d5662f7a45227178ce3430af0f6b3bb94b52f7f51e97bad659b1ba0684e208be624c28d82fb1162f18dd9dce45216461654cf3374624d15a8d03818400028180713e9f8108a6a7075485a37ce1a3b040cce563a0445614fe099fb1bffd68acb36f9e04d8ad17ace3c136da66f730eb7ff18936424ffa4e5ae5b1e7dac375d8d164697254b8b7e848f5e79da25c79df5c0727d5da3498405cd0f4e46d136c351d703cc4bf0d3f4fbb165392888684964a93ad30fa179488cad4a6655dd4fa9754",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBtjCCASsGByqGSM44BAEwggEeAoGBALNM6cHngpTTJYRzhCAF0qSMjFZs/Kj4\nTAYG8lKbWabTiq4HG1O7IWfqpPw7Af4Xbnh+SBtgN6rGLLw9CJeZU2qGn6jN/qHo\nsf0tHNOjA1CFmizWs+wvm/u2i7EbS74q2qGNZKk2OVQ65eFik+MRwM+MjW4YDfBd\nCML9LZPVcHUfAhUAuQs4ugpQpD7GiY0/m2gEl3f0ibECgYAINaqMNYu/AaGEbRIG\nMj+r5Aiw6YeJ/MYjnaFNSz+Gwnao9IqoWllQfmIK0bx0Xw8cv2PsmMIpwmENd8Y0\n0WQuQENUdxZVstVmL3pFInF4zjQwrw9rO7lLUvf1Hpe61lmxugaE4gi+Ykwo2C+x\nFi8Y3Z3ORSFkYWVM8zdGJNFajQOBhAACgYBxPp+BCKanB1SFo3zho7BAzOVjoERW\nFP4Jn7G//Wiss2+eBNitF6zjwTbaZvcw63/xiTZCT/pOWuWx59rDddjRZGlyVLi3\n6Ej1552iXHnfXAcn1do0mEBc0PTkbRNsNR1wPMS/DT9PuxZTkoiGhJZKk60w+heU\niMrUpmVd1PqXVA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-1",
+      "type" : "DSAVer",
+      "tests" : [
+        {
+          "tcId" : 281,
+          "comment" : "r,s = 1,1",
+          "msg" : "54657374",
+          "sig" : "3006020101020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 282,
+          "comment" : "r,s = 1,5",
+          "msg" : "54657374",
+          "sig" : "3006020101020105",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 283,
+          "comment" : "u2 small",
+          "msg" : "54657374",
+          "sig" : "3019020101021425023e8b9ba9ba72f481e90cb8ae67517e641b8a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 284,
+          "comment" : "s == q-1",
+          "msg" : "54657374",
+          "sig" : "301a020101021500b90b38ba0a50a43ec6898d3f9b68049777f489b0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "g" : "0835aa8c358bbf01a1846d1206323fabe408b0e98789fcc6239da14d4b3f86c276a8f48aa85a59507e620ad1bc745f0f1cbf63ec98c229c2610d77c634d1642e404354771655b2d5662f7a45227178ce3430af0f6b3bb94b52f7f51e97bad659b1ba0684e208be624c28d82fb1162f18dd9dce45216461654cf3374624d15a8d",
+        "keySize" : 1024,
+        "p" : "0b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f",
+        "q" : "0b90b38ba0a50a43ec6898d3f9b68049777f489b1",
+        "type" : "DSAPublicKey",
+        "y" : "61fe5b61f6d555ada7dc0ebac3459fccd8dfbad18ba94dbea52437cd7fb431df404d4738c594e720a6d786275acd02259ca613a08a2de118d0150d2ccae602102aca0cd03666a53f67c0b9943df5046c15baeaf496a9f018b7c939de1509de71ce47dd6f44c57f4e01e569be46932773190c154470cefbd1f4af82d28e4b31"
+      },
+      "keyDer" : "308201b43082012b06072a8648ce3804013082011e02818100b34ce9c1e78294d3258473842005d2a48c8c566cfca8f84c0606f2529b59a6d38aae071b53bb2167eaa4fc3b01fe176e787e481b6037aac62cbc3d089799536a869fa8cdfea1e8b1fd2d1cd3a30350859a2cd6b3ec2f9bfbb68bb11b4bbe2adaa18d64a93639543ae5e16293e311c0cf8c8d6e180df05d08c2fd2d93d570751f021500b90b38ba0a50a43ec6898d3f9b68049777f489b10281800835aa8c358bbf01a1846d1206323fabe408b0e98789fcc6239da14d4b3f86c276a8f48aa85a59507e620ad1bc745f0f1cbf63ec98c229c2610d77c634d1642e404354771655b2d5662f7a45227178ce3430af0f6b3bb94b52f7f51e97bad659b1ba0684e208be624c28d82fb1162f18dd9dce45216461654cf3374624d15a8d03818200027f61fe5b61f6d555ada7dc0ebac3459fccd8dfbad18ba94dbea52437cd7fb431df404d4738c594e720a6d786275acd02259ca613a08a2de118d0150d2ccae602102aca0cd03666a53f67c0b9943df5046c15baeaf496a9f018b7c939de1509de71ce47dd6f44c57f4e01e569be46932773190c154470cefbd1f4af82d28e4b31",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBtDCCASsGByqGSM44BAEwggEeAoGBALNM6cHngpTTJYRzhCAF0qSMjFZs/Kj4\nTAYG8lKbWabTiq4HG1O7IWfqpPw7Af4Xbnh+SBtgN6rGLLw9CJeZU2qGn6jN/qHo\nsf0tHNOjA1CFmizWs+wvm/u2i7EbS74q2qGNZKk2OVQ65eFik+MRwM+MjW4YDfBd\nCML9LZPVcHUfAhUAuQs4ugpQpD7GiY0/m2gEl3f0ibECgYAINaqMNYu/AaGEbRIG\nMj+r5Aiw6YeJ/MYjnaFNSz+Gwnao9IqoWllQfmIK0bx0Xw8cv2PsmMIpwmENd8Y0\n0WQuQENUdxZVstVmL3pFInF4zjQwrw9rO7lLUvf1Hpe61lmxugaE4gi+Ykwo2C+x\nFi8Y3Z3ORSFkYWVM8zdGJNFajQOBggACf2H+W2H21VWtp9wOusNFn8zY37rRi6lN\nvqUkN81/tDHfQE1HOMWU5yCm14YnWs0CJZymE6CKLeEY0BUNLMrmAhAqygzQNmal\nP2fAuZQ99QRsFbrq9Jap8Bi3yTneFQnecc5H3W9ExX9OAeVpvkaTJ3MZDBVEcM77\n0fSvgtKOSzE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-1",
+      "type" : "DSAVer",
+      "tests" : [
+        {
+          "tcId" : 285,
+          "comment" : "s == 1",
+          "msg" : "54657374",
+          "sig" : "3019021462ba827381396dc44facc66c344f91788f11c6fc020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "g" : "16a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde",
+        "keySize" : 2048,
+        "p" : "08f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+        "q" : "0baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+        "type" : "DSAPublicKey",
+        "y" : "1e77f842b1ae0fcd9929d394161d41e14614ff7507a9a31f4a1f14d22e2a627a1f4e596624883f1a5b168e9425146f22d5f6ee28757414714bb994ba1129f015d6e04a717edf9b530a5d5cab94f14631e8b4cf79aeb358cc741845553841e8ac461630e804a62f43676ba6794af66899c377b869ea612a7b9fe6611aa96be52eb8b62c979117bbbcca8a7ec1e1ffab1c7dfcfc7048700d3ae3858136e897701d7c2921b5dfef1d1f897f50d96ca1b5c2edc58cada18919e35642f0807eebfa00c99a32f4d095c3188f78ed54711be0325c4b532aeccd6540a567c327225440ea15319bde06510479a1861799e25b57decc73c036d75a0702bd373ca231349931"
+      },
+      "keyDer" : "308203423082023506072a8648ce3804013082022802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d0282010016a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde0382010500028201001e77f842b1ae0fcd9929d394161d41e14614ff7507a9a31f4a1f14d22e2a627a1f4e596624883f1a5b168e9425146f22d5f6ee28757414714bb994ba1129f015d6e04a717edf9b530a5d5cab94f14631e8b4cf79aeb358cc741845553841e8ac461630e804a62f43676ba6794af66899c377b869ea612a7b9fe6611aa96be52eb8b62c979117bbbcca8a7ec1e1ffab1c7dfcfc7048700d3ae3858136e897701d7c2921b5dfef1d1f897f50d96ca1b5c2edc58cada18919e35642f0807eebfa00c99a32f4d095c3188f78ed54711be0325c4b532aeccd6540a567c327225440ea15319bde06510479a1861799e25b57decc73c036d75a0702bd373ca231349931",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIDQjCCAjUGByqGSM44BAEwggIoAoIBAQCPeTXZuarpv6vtiHrPSVG28y7Fnjuv\nNxjo6sSWHz79NgbnQ1GpxBgzObgJ58KuHFObp0dbhdARrbi0eYd1SYRpXKwOjxSz\nNggooi/6JxEKPWKpk0U0CaD+aWxGWPhL3SCBnDcJoBBXsZWtzQAjPbpUhLYpH51k\njviDRIZ3l5zsBLQ0pqwudemYXeI9sCkvwRGMn/qdgYHnM423krcw17njSVkvaAmY\nchU5Feo9a4tGU8YzRY+AOzKkwuDycpAlbk4/ijsIOKHEUOThjBopo33fXqFD3ktm\n/wSQPtXPFiPhWNSHxgjpfyEc2B3KI8tuOAdl+CLjQr5ITAV2OTlgHNZnAh0AuvaW\npoV499/e5/pnyXfHhe8ysjO65YDAvNVpXQKCAQAWplxYIEhQcE51AqOXVwQNNNo6\nNHjBVNTkpcAtJC7gT5bmHkvQkEq9rI837rHgnzGC0jyQQ8tkL4gAQWDt+coJsyB2\np5wypifyRz6Rh5uixOdEvSCBVEy1W4AsNo0fqD7UielOD6BojjJCilx4xHjGjQUn\ntxyaOrsLC+EsRGiWOefTznTbEBplqiuH9kxoJts+xy9LVZmDS7TtsC98kOmkltOl\nXVNb6/xF1PYZ9j897buHOSXC8iTgdzEpbaiH7B5HSPh++1/et1SEMWsiMt7lU92v\nAhErDR8C2jCXMiT+J67ai51LKSLZuovjntnhA6Y8UoELxoi34u1DFuHvF9veA4IB\nBQACggEAHnf4QrGuD82ZKdOUFh1B4UYU/3UHqaMfSh8U0i4qYnofTllmJIg/GlsW\njpQlFG8i1fbuKHV0FHFLuZS6ESnwFdbgSnF+35tTCl1cq5TxRjHotM95rrNYzHQY\nRVU4QeisRhYw6ASmL0Nna6Z5SvZomcN3uGnqYSp7n+ZhGqlr5S64tiyXkRe7vMqK\nfsHh/6scffz8cEhwDTrjhYE26JdwHXwpIbXf7x0fiX9Q2WyhtcLtxYytoYkZ41ZC\n8IB+6/oAyZoy9NCVwxiPeO1UcRvgMlxLUyrszWVApWfDJyJUQOoVMZveBlEEeaGG\nF5niW1fezHPANtdaBwK9NzyiMTSZMQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "DSAVer",
+      "tests" : [
+        {
+          "tcId" : 286,
+          "comment" : "Legacy:ASN encoding of s misses leading 0",
+          "msg" : "48656c6c6f",
+          "sig" : "303c021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021cade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "acceptable",
+          "flags" : [
+            "NoLeadingZero"
+          ]
+        },
+        {
+          "tcId" : 287,
+          "comment" : "valid",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 288,
+          "comment" : "long form encoding of length",
+          "msg" : "48656c6c6f",
+          "sig" : "30813d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 289,
+          "comment" : "long form encoding of length",
+          "msg" : "48656c6c6f",
+          "sig" : "303e02811c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 290,
+          "comment" : "long form encoding of length",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd02811d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 291,
+          "comment" : "length contains leading 0",
+          "msg" : "48656c6c6f",
+          "sig" : "3082003d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 292,
+          "comment" : "length contains leading 0",
+          "msg" : "48656c6c6f",
+          "sig" : "303f0282001c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 293,
+          "comment" : "length contains leading 0",
+          "msg" : "48656c6c6f",
+          "sig" : "303f021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0282001d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 294,
+          "comment" : "wrong length",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 295,
+          "comment" : "wrong length",
+          "msg" : "48656c6c6f",
+          "sig" : "303c021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 296,
+          "comment" : "wrong length",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021d1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 297,
+          "comment" : "wrong length",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021b1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 298,
+          "comment" : "wrong length",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021e00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 299,
+          "comment" : "wrong length",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021c00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 300,
+          "comment" : "uint32 overflow in length",
+          "msg" : "48656c6c6f",
+          "sig" : "3085010000003d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 301,
+          "comment" : "uint32 overflow in length",
+          "msg" : "48656c6c6f",
+          "sig" : "30420285010000001c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 302,
+          "comment" : "uint32 overflow in length",
+          "msg" : "48656c6c6f",
+          "sig" : "3042021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0285010000001d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 303,
+          "comment" : "uint64 overflow in length",
+          "msg" : "48656c6c6f",
+          "sig" : "308901000000000000003d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 304,
+          "comment" : "uint64 overflow in length",
+          "msg" : "48656c6c6f",
+          "sig" : "3046028901000000000000001c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 305,
+          "comment" : "uint64 overflow in length",
+          "msg" : "48656c6c6f",
+          "sig" : "3046021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd028901000000000000001d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 306,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "48656c6c6f",
+          "sig" : "30847fffffff021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 307,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "48656c6c6f",
+          "sig" : "304102847fffffff1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 308,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "48656c6c6f",
+          "sig" : "3041021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd02847fffffff00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 309,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "48656c6c6f",
+          "sig" : "3084ffffffff021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 310,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "48656c6c6f",
+          "sig" : "30410284ffffffff1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 311,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "48656c6c6f",
+          "sig" : "3041021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0284ffffffff00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 312,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "48656c6c6f",
+          "sig" : "3085ffffffffff021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 313,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "48656c6c6f",
+          "sig" : "30420285ffffffffff1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 314,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "48656c6c6f",
+          "sig" : "3042021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0285ffffffffff00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 315,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "48656c6c6f",
+          "sig" : "3088ffffffffffffffff021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 316,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "48656c6c6f",
+          "sig" : "30450288ffffffffffffffff1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 317,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "48656c6c6f",
+          "sig" : "3045021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0288ffffffffffffffff00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 318,
+          "comment" : "incorrect length",
+          "msg" : "48656c6c6f",
+          "sig" : "30ff021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 319,
+          "comment" : "incorrect length",
+          "msg" : "48656c6c6f",
+          "sig" : "303d02ff1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 320,
+          "comment" : "incorrect length",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd02ff00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 321,
+          "comment" : "indefinite length without termination",
+          "msg" : "48656c6c6f",
+          "sig" : "3080021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 322,
+          "comment" : "indefinite length without termination",
+          "msg" : "48656c6c6f",
+          "sig" : "303d02801e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 323,
+          "comment" : "indefinite length without termination",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd028000ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 324,
+          "comment" : "removing sequence",
+          "msg" : "48656c6c6f",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 325,
+          "comment" : "lonely sequence tag",
+          "msg" : "48656c6c6f",
+          "sig" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 326,
+          "comment" : "appending 0's to sequence",
+          "msg" : "48656c6c6f",
+          "sig" : "303f021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 327,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "48656c6c6f",
+          "sig" : "303f0000021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 328,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 329,
+          "comment" : "appending null value to sequence",
+          "msg" : "48656c6c6f",
+          "sig" : "303f021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 330,
+          "comment" : "including garbage",
+          "msg" : "48656c6c6f",
+          "sig" : "3042498177303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 331,
+          "comment" : "including garbage",
+          "msg" : "48656c6c6f",
+          "sig" : "30412500303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 332,
+          "comment" : "including garbage",
+          "msg" : "48656c6c6f",
+          "sig" : "303f303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 333,
+          "comment" : "including garbage",
+          "msg" : "48656c6c6f",
+          "sig" : "30422221498177021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 334,
+          "comment" : "including garbage",
+          "msg" : "48656c6c6f",
+          "sig" : "304122202500021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 335,
+          "comment" : "including garbage",
+          "msg" : "48656c6c6f",
+          "sig" : "3045221e021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0004deadbeef021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 336,
+          "comment" : "including garbage",
+          "msg" : "48656c6c6f",
+          "sig" : "3042021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd2222498177021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 337,
+          "comment" : "including garbage",
+          "msg" : "48656c6c6f",
+          "sig" : "3041021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd22212500021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 338,
+          "comment" : "including garbage",
+          "msg" : "48656c6c6f",
+          "sig" : "3045021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd221f021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 339,
+          "comment" : "including undefined tags",
+          "msg" : "48656c6c6f",
+          "sig" : "3045aa00bb00cd00303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 340,
+          "comment" : "including undefined tags",
+          "msg" : "48656c6c6f",
+          "sig" : "3043aa02aabb303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 341,
+          "comment" : "including undefined tags",
+          "msg" : "48656c6c6f",
+          "sig" : "30452224aa00bb00cd00021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 342,
+          "comment" : "including undefined tags",
+          "msg" : "48656c6c6f",
+          "sig" : "30432222aa02aabb021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 343,
+          "comment" : "including undefined tags",
+          "msg" : "48656c6c6f",
+          "sig" : "3045021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd2225aa00bb00cd00021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 344,
+          "comment" : "including undefined tags",
+          "msg" : "48656c6c6f",
+          "sig" : "3043021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd2223aa02aabb021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 345,
+          "comment" : "truncated length of sequence",
+          "msg" : "48656c6c6f",
+          "sig" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 346,
+          "comment" : "using composition with indefinite length",
+          "msg" : "48656c6c6f",
+          "sig" : "3080303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 347,
+          "comment" : "using composition with indefinite length",
+          "msg" : "48656c6c6f",
+          "sig" : "30412280021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0000021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 348,
+          "comment" : "using composition with indefinite length",
+          "msg" : "48656c6c6f",
+          "sig" : "3041021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd2280021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 349,
+          "comment" : "using composition with wrong tag",
+          "msg" : "48656c6c6f",
+          "sig" : "3080313d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 350,
+          "comment" : "using composition with wrong tag",
+          "msg" : "48656c6c6f",
+          "sig" : "30412280031c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0000021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 351,
+          "comment" : "using composition with wrong tag",
+          "msg" : "48656c6c6f",
+          "sig" : "3041021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd2280031d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 352,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "48656c6c6f",
+          "sig" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 353,
+          "comment" : "changing tag value of sequence",
+          "msg" : "48656c6c6f",
+          "sig" : "2e3d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 354,
+          "comment" : "changing tag value of sequence",
+          "msg" : "48656c6c6f",
+          "sig" : "2f3d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 355,
+          "comment" : "changing tag value of sequence",
+          "msg" : "48656c6c6f",
+          "sig" : "313d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 356,
+          "comment" : "changing tag value of sequence",
+          "msg" : "48656c6c6f",
+          "sig" : "323d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 357,
+          "comment" : "changing tag value of sequence",
+          "msg" : "48656c6c6f",
+          "sig" : "ff3d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 358,
+          "comment" : "dropping value of sequence",
+          "msg" : "48656c6c6f",
+          "sig" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 359,
+          "comment" : "using composition for sequence",
+          "msg" : "48656c6c6f",
+          "sig" : "3041300102303c1c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 360,
+          "comment" : "truncate sequence",
+          "msg" : "48656c6c6f",
+          "sig" : "303c021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 361,
+          "comment" : "truncate sequence",
+          "msg" : "48656c6c6f",
+          "sig" : "303c1c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 362,
+          "comment" : "indefinite length",
+          "msg" : "48656c6c6f",
+          "sig" : "3080021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 363,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "48656c6c6f",
+          "sig" : "3080021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe878623600",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 364,
+          "comment" : "indefinite length with additional element",
+          "msg" : "48656c6c6f",
+          "sig" : "3080021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe878623605000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 365,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "48656c6c6f",
+          "sig" : "3080021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 366,
+          "comment" : "indefinite length with garbage",
+          "msg" : "48656c6c6f",
+          "sig" : "3080021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 367,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "48656c6c6f",
+          "sig" : "3080021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 368,
+          "comment" : "prepend empty sequence",
+          "msg" : "48656c6c6f",
+          "sig" : "303f3000021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 369,
+          "comment" : "append empty sequence",
+          "msg" : "48656c6c6f",
+          "sig" : "303f021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862363000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 370,
+          "comment" : "sequence of sequence",
+          "msg" : "48656c6c6f",
+          "sig" : "303f303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 371,
+          "comment" : "truncated sequence",
+          "msg" : "48656c6c6f",
+          "sig" : "301e021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 372,
+          "comment" : "repeat element in sequence",
+          "msg" : "48656c6c6f",
+          "sig" : "305c021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 373,
+          "comment" : "removing integer",
+          "msg" : "48656c6c6f",
+          "sig" : "301f021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 374,
+          "comment" : "lonely integer tag",
+          "msg" : "48656c6c6f",
+          "sig" : "302002021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 375,
+          "comment" : "lonely integer tag",
+          "msg" : "48656c6c6f",
+          "sig" : "301f021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd02",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 376,
+          "comment" : "appending 0's to integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303f021e1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0000021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 377,
+          "comment" : "appending 0's to integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303f021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021f00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 378,
+          "comment" : "prepending 0's to integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303f021e00001e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 379,
+          "comment" : "prepending 0's to integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303f021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021f000000ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 380,
+          "comment" : "appending unused 0's to integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303f021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0000021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 381,
+          "comment" : "appending null value to integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303f021e1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0500021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 382,
+          "comment" : "appending null value to integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303f021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021f00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862360500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 383,
+          "comment" : "truncated length of integer",
+          "msg" : "48656c6c6f",
+          "sig" : "30210281021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 384,
+          "comment" : "truncated length of integer",
+          "msg" : "48656c6c6f",
+          "sig" : "3020021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0281",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 385,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "48656c6c6f",
+          "sig" : "30210500021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 386,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "48656c6c6f",
+          "sig" : "3020021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 387,
+          "comment" : "changing tag value of integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303d001c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 388,
+          "comment" : "changing tag value of integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303d011c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 389,
+          "comment" : "changing tag value of integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303d031c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 390,
+          "comment" : "changing tag value of integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303d041c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 391,
+          "comment" : "changing tag value of integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303dff1c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 392,
+          "comment" : "changing tag value of integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd001d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 393,
+          "comment" : "changing tag value of integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd011d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 394,
+          "comment" : "changing tag value of integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd031d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 395,
+          "comment" : "changing tag value of integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd041d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 396,
+          "comment" : "changing tag value of integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cdff1d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 397,
+          "comment" : "dropping value of integer",
+          "msg" : "48656c6c6f",
+          "sig" : "30210200021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 398,
+          "comment" : "dropping value of integer",
+          "msg" : "48656c6c6f",
+          "sig" : "3020021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd0200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 399,
+          "comment" : "using composition for integer",
+          "msg" : "48656c6c6f",
+          "sig" : "3041222002011e021b41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 400,
+          "comment" : "using composition for integer",
+          "msg" : "48656c6c6f",
+          "sig" : "3041021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd2221020100021cade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 401,
+          "comment" : "modify first byte of integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c1c41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 402,
+          "comment" : "modify first byte of integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d02ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 403,
+          "comment" : "modify last byte of integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c94d021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 404,
+          "comment" : "modify last byte of integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862b6",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 405,
+          "comment" : "truncate integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303c021b1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 406,
+          "comment" : "truncate integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303c021b41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 407,
+          "comment" : "truncate integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303c021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021c00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe87862",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 408,
+          "comment" : "truncate integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303c021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021cade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 409,
+          "comment" : "leading ff in integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021dff1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 410,
+          "comment" : "leading ff in integer",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021eff00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 411,
+          "comment" : "infinity",
+          "msg" : "48656c6c6f",
+          "sig" : "3022090180021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 412,
+          "comment" : "infinity",
+          "msg" : "48656c6c6f",
+          "sig" : "3021021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd090180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 413,
+          "comment" : "replacing integer with zero",
+          "msg" : "48656c6c6f",
+          "sig" : "3022020100021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 414,
+          "comment" : "replacing integer with zero",
+          "msg" : "48656c6c6f",
+          "sig" : "3021021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd020100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 415,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d00d9384b2032d060e59848f87cb4535936bc25fa77959e96d7f88e332a021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 416,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021dff634b1dd327de7125da7903ad2163ca2addc096101fd395567ee36070021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 417,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021ce1be4b8652a896fa469f01eb15246e4f330cb7bc2546e9e8c4473633021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 418,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d009cb4e22cd8218eda2586fc52de9c35d5223f69efe02c6aa9811c9f90021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 419,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021dff26c7b4dfcd2f9f1a67b707834baca6c943da05886a6169280771ccd6021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 420,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d011e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 421,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d00e1be4b8652a896fa469f01eb15246e4f330cb7bc2546e9e8c4473633021d00ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 422,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d0168dcf02f57b0caef7ddc183bee1ca94ee09c1a02ee4b0200a54dcb93",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 423,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "48656c6c6f",
+          "sig" : "303c021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021cf2efc2e24cbedb2fc00c236c5b2d1a430236b59b7880007f2ba2f8d9",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 424,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021dff5219a6772dc82cf0610be22bdb5b1e370e969830cc9a7ec017879dca",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 425,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "48656c6c6f",
+          "sig" : "303c021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021c0d103d1db34124d03ff3dc93a4d2e5bcfdc94a64877fff80d45d0727",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 426,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021dfe97230fd0a84f35108223e7c411e356b11f63e5fd11b4fdff5ab2346d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 427,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021d01ade65988d237d30f9ef41dd424a4e1c8f16967cf3365813fe8786236",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 428,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "48656c6c6f",
+          "sig" : "303c021c1e41b479ad576905b960fe14eadb91b0ccf34843dab916173bb8c9cd021c5219a6772dc82cf0610be22bdb5b1e370e969830cc9a7ec017879dca",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 429,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022020100021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 430,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3006020100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 431,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3006020100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 432,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "30060201000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 433,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3021020100021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 434,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3021020100021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 435,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022020100021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 436,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022020100021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 437,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022020100021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 438,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022020100021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 439,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3082010802010002820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 440,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3008020100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 441,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022020101021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 442,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3006020101020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 443,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3006020101020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 444,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "30060201010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 445,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3021020101021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 446,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3021020101021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 447,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022020101021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 448,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022020101021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 449,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022020101021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 450,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022020101021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 451,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3082010802010102820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 452,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3008020101090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 453,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "30220201ff021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 454,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "30060201ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 455,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "30060201ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 456,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "30060201ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 457,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "30210201ff021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 458,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "30210201ff021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 459,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "30220201ff021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 460,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "30220201ff021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 461,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "30220201ff021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 462,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "30220201ff021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 463,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "308201080201ff02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 464,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "30080201ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 465,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 466,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3021021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 467,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3021021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 468,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3021021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 469,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303c021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 470,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303c021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 471,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 472,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 473,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 474,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 475,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "30820123021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 476,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3023021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 477,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 478,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3021021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 479,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3021021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 480,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3021021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 481,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303c021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 482,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303c021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 483,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 484,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 485,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 486,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 487,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "30820123021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 488,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3023021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 489,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 490,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 491,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 492,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 493,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 494,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 495,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 496,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 497,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 498,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 499,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "30820124021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 500,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3024021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 501,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 502,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 503,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 504,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 505,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 506,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 507,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 508,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 509,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 510,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 511,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "30820124021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 512,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3024021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 513,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 514,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 515,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 516,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 517,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 518,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 519,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 520,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 521,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 522,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 523,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "30820124021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 524,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3024021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 525,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d0100000000000000000000000000000000000000000000000000000000021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 526,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022021d0100000000000000000000000000000000000000000000000000000000020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 527,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022021d0100000000000000000000000000000000000000000000000000000000020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 528,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3022021d01000000000000000000000000000000000000000000000000000000000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 529,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021d0100000000000000000000000000000000000000000000000000000000021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 530,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021d0100000000000000000000000000000000000000000000000000000000021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 531,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d0100000000000000000000000000000000000000000000000000000000021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 532,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d0100000000000000000000000000000000000000000000000000000000021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 533,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d0100000000000000000000000000000000000000000000000000000000021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 534,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "303e021d0100000000000000000000000000000000000000000000000000000000021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 535,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "30820124021d010000000000000000000000000000000000000000000000000000000002820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 536,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3024021d0100000000000000000000000000000000000000000000000000000000090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 537,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3082012402820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 538,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3082010802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 539,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3082010802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 540,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3082010802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd6670201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 541,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3082012302820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 542,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3082012302820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 543,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3082012402820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 544,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3082012402820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 545,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3082012402820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 546,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3082012402820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 547,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3082020a02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd66702820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 548,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3082010a02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 549,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3024090380fe01021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 550,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3008090380fe01020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 551,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3008090380fe01020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 552,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3008090380fe010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 553,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3023090380fe01021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 554,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3023090380fe01021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 555,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3024090380fe01021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 556,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3024090380fe01021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 557,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3024090380fe01021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 558,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3024090380fe01021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 559,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "3082010a090380fe0102820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 560,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "48656c6c6f",
+          "sig" : "300a090380fe01090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 561,
+          "comment" : "random signature",
+          "msg" : "48656c6c6f",
+          "sig" : "303c021c36f3dba9761a64a37e82b12321b2a9dfd7d33b52876cc0afc069fdfb021c2b4d30ae183b67f5f89268ae71c466d8d9b80c1877fab23e822f7f00",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 562,
+          "comment" : "random signature",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c57d273ae3782e51af0be789e409159428af91face3071ae9423474ed021d00b7385bfcd3c9eb35a4b5cbfaeaefc67a26c75a8612ebc482eef96033",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 563,
+          "comment" : "random signature",
+          "msg" : "48656c6c6f",
+          "sig" : "303d021c2dfa059fbea2500f7db7edb9c4b5d17c844604870f47c43554d07ca6021d00975684ce7938e43e82015d1e1ff9488cce372c11929b605fd7041645",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 564,
+          "comment" : "random signature",
+          "msg" : "48656c6c6f",
+          "sig" : "303c021c57e06bc849dc1f43acc9eef55da7edd36ae15029d2e6fd9778f116b4021c7171a6bd9ea904d0cfb290feb28e42404c3da8ce8844c85c12ddd65f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 565,
+          "comment" : "random signature",
+          "msg" : "48656c6c6f",
+          "sig" : "303c021c56e35470a8d753a3eebdc96c8dfbea13198e8e12dd215afc0fdeaad6021c6022e76ad5b2d5a0cfbfec0b80d7d40c73de361d1caa91992414555b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "g" : "16a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde",
+        "keySize" : 2048,
+        "p" : "08f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+        "q" : "0baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+        "type" : "DSAPublicKey",
+        "y" : "6978b68d31334ee5bc7b3e91ab6c2336fab45c64836bd92cb5337b734db9e8e44f889f8869829f4fe174dc9344c164a0ba5b0126259ba8a43f607564fa4a1d0d49645e1d5886a1fc485e2fe91e56eae330da05e17b0b3d018c290285b249bc409e7af54300fc7c3eb34911457e2371931ad9302e8450cd95df3d561ea0ad94d0a2eabcafe0dd6728fb280029b556d9f4fa7c0f46a7804329936708e97e11fc22b2a50761a890c65b5fea2a1a4172f6be9eaa60e738cdf60c015142e2e562bb62a11e810ccdf0bf633307382f2d9a9769b115dfcdab4bacae73feca289db209dce34cbe126e8c7f9d9e4f8f711349a608d567b48c050e9dfb32bc184ecaa4f0f0"
+      },
+      "keyDer" : "308203423082023506072a8648ce3804013082022802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d0282010016a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde0382010500028201006978b68d31334ee5bc7b3e91ab6c2336fab45c64836bd92cb5337b734db9e8e44f889f8869829f4fe174dc9344c164a0ba5b0126259ba8a43f607564fa4a1d0d49645e1d5886a1fc485e2fe91e56eae330da05e17b0b3d018c290285b249bc409e7af54300fc7c3eb34911457e2371931ad9302e8450cd95df3d561ea0ad94d0a2eabcafe0dd6728fb280029b556d9f4fa7c0f46a7804329936708e97e11fc22b2a50761a890c65b5fea2a1a4172f6be9eaa60e738cdf60c015142e2e562bb62a11e810ccdf0bf633307382f2d9a9769b115dfcdab4bacae73feca289db209dce34cbe126e8c7f9d9e4f8f711349a608d567b48c050e9dfb32bc184ecaa4f0f0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIDQjCCAjUGByqGSM44BAEwggIoAoIBAQCPeTXZuarpv6vtiHrPSVG28y7Fnjuv\nNxjo6sSWHz79NgbnQ1GpxBgzObgJ58KuHFObp0dbhdARrbi0eYd1SYRpXKwOjxSz\nNggooi/6JxEKPWKpk0U0CaD+aWxGWPhL3SCBnDcJoBBXsZWtzQAjPbpUhLYpH51k\njviDRIZ3l5zsBLQ0pqwudemYXeI9sCkvwRGMn/qdgYHnM423krcw17njSVkvaAmY\nchU5Feo9a4tGU8YzRY+AOzKkwuDycpAlbk4/ijsIOKHEUOThjBopo33fXqFD3ktm\n/wSQPtXPFiPhWNSHxgjpfyEc2B3KI8tuOAdl+CLjQr5ITAV2OTlgHNZnAh0AuvaW\npoV499/e5/pnyXfHhe8ysjO65YDAvNVpXQKCAQAWplxYIEhQcE51AqOXVwQNNNo6\nNHjBVNTkpcAtJC7gT5bmHkvQkEq9rI837rHgnzGC0jyQQ8tkL4gAQWDt+coJsyB2\np5wypifyRz6Rh5uixOdEvSCBVEy1W4AsNo0fqD7UielOD6BojjJCilx4xHjGjQUn\ntxyaOrsLC+EsRGiWOefTznTbEBplqiuH9kxoJts+xy9LVZmDS7TtsC98kOmkltOl\nXVNb6/xF1PYZ9j897buHOSXC8iTgdzEpbaiH7B5HSPh++1/et1SEMWsiMt7lU92v\nAhErDR8C2jCXMiT+J67ai51LKSLZuovjntnhA6Y8UoELxoi34u1DFuHvF9veA4IB\nBQACggEAaXi2jTEzTuW8ez6Rq2wjNvq0XGSDa9kstTN7c0256ORPiJ+IaYKfT+F0\n3JNEwWSgulsBJiWbqKQ/YHVk+kodDUlkXh1YhqH8SF4v6R5W6uMw2gXhews9AYwp\nAoWySbxAnnr1QwD8fD6zSRFFfiNxkxrZMC6EUM2V3z1WHqCtlNCi6ryv4N1nKPso\nACm1Vtn0+nwPRqeAQymTZwjpfhH8IrKlB2GokMZbX+oqGkFy9r6eqmDnOM32DAFR\nQuLlYrtioR6BDM3wv2MzBzgvLZqXabEV382rS6yuc/7KKJ2yCdzjTL4Sbox/nZ5P\nj3ETSaYI1We0jAUOnfsyvBhOyqTw8A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "DSAVer",
+      "tests" : [
+        {
+          "tcId" : 566,
+          "comment" : "r,s = 1,1",
+          "msg" : "54657374",
+          "sig" : "3006020101020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 567,
+          "comment" : "r,s = 1,5",
+          "msg" : "54657374",
+          "sig" : "3006020101020105",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 568,
+          "comment" : "u2 small",
+          "msg" : "54657374",
+          "sig" : "3022020101021d009592121ed12d93197f1ffb863ac63937f28ef4f62f1e009a30aabab1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 569,
+          "comment" : "s == q-1",
+          "msg" : "54657374",
+          "sig" : "3022020101021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "g" : "16a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde",
+        "keySize" : 2048,
+        "p" : "08f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+        "q" : "0baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+        "type" : "DSAPublicKey",
+        "y" : "2a64953bde40789f80ed8227192286115b92d09d5de96904e803ec4ecfbd73e0f08e82910febf19fa3cdc55ff20eb970d9c712f44785c0fd592c17fb43f4625357a4ac8a1a628f72040ae5360839c7c1f6b214e7a15530fe22887139ea0f05a9daf9d95bd6b7467abf9107c9fbe31e36330276eeccce3d59635206d60ca256f9af60627626b0594984b5a075c42c42067fa8c330f258bcf145df27a97da8ee419b54e3ab296c7ce9ef6a0113389b3cac7885b44b3722d27cad60e4e5a924a1ed0342cea9e99256f6bc1308d4af2c0af9379b1cf2119ce113c085705f5519ccc1ba8562a2236190d3f0c0a10f01466ad79a48127c28433f6b34e24a539af60f3d"
+      },
+      "keyDer" : "308203423082023506072a8648ce3804013082022802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d0282010016a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde0382010500028201002a64953bde40789f80ed8227192286115b92d09d5de96904e803ec4ecfbd73e0f08e82910febf19fa3cdc55ff20eb970d9c712f44785c0fd592c17fb43f4625357a4ac8a1a628f72040ae5360839c7c1f6b214e7a15530fe22887139ea0f05a9daf9d95bd6b7467abf9107c9fbe31e36330276eeccce3d59635206d60ca256f9af60627626b0594984b5a075c42c42067fa8c330f258bcf145df27a97da8ee419b54e3ab296c7ce9ef6a0113389b3cac7885b44b3722d27cad60e4e5a924a1ed0342cea9e99256f6bc1308d4af2c0af9379b1cf2119ce113c085705f5519ccc1ba8562a2236190d3f0c0a10f01466ad79a48127c28433f6b34e24a539af60f3d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIDQjCCAjUGByqGSM44BAEwggIoAoIBAQCPeTXZuarpv6vtiHrPSVG28y7Fnjuv\nNxjo6sSWHz79NgbnQ1GpxBgzObgJ58KuHFObp0dbhdARrbi0eYd1SYRpXKwOjxSz\nNggooi/6JxEKPWKpk0U0CaD+aWxGWPhL3SCBnDcJoBBXsZWtzQAjPbpUhLYpH51k\njviDRIZ3l5zsBLQ0pqwudemYXeI9sCkvwRGMn/qdgYHnM423krcw17njSVkvaAmY\nchU5Feo9a4tGU8YzRY+AOzKkwuDycpAlbk4/ijsIOKHEUOThjBopo33fXqFD3ktm\n/wSQPtXPFiPhWNSHxgjpfyEc2B3KI8tuOAdl+CLjQr5ITAV2OTlgHNZnAh0AuvaW\npoV499/e5/pnyXfHhe8ysjO65YDAvNVpXQKCAQAWplxYIEhQcE51AqOXVwQNNNo6\nNHjBVNTkpcAtJC7gT5bmHkvQkEq9rI837rHgnzGC0jyQQ8tkL4gAQWDt+coJsyB2\np5wypifyRz6Rh5uixOdEvSCBVEy1W4AsNo0fqD7UielOD6BojjJCilx4xHjGjQUn\ntxyaOrsLC+EsRGiWOefTznTbEBplqiuH9kxoJts+xy9LVZmDS7TtsC98kOmkltOl\nXVNb6/xF1PYZ9j897buHOSXC8iTgdzEpbaiH7B5HSPh++1/et1SEMWsiMt7lU92v\nAhErDR8C2jCXMiT+J67ai51LKSLZuovjntnhA6Y8UoELxoi34u1DFuHvF9veA4IB\nBQACggEAKmSVO95AeJ+A7YInGSKGEVuS0J1d6WkE6APsTs+9c+DwjoKRD+vxn6PN\nxV/yDrlw2ccS9EeFwP1ZLBf7Q/RiU1ekrIoaYo9yBArlNgg5x8H2shTnoVUw/iKI\ncTnqDwWp2vnZW9a3Rnq/kQfJ++MeNjMCdu7Mzj1ZY1IG1gyiVvmvYGJ2JrBZSYS1\noHXELEIGf6jDMPJYvPFF3yepfajuQZtU46spbHzp72oBEzibPKx4hbRLNyLSfK1g\n5OWpJKHtA0LOqemSVva8EwjUrywK+TebHPIRnOETwIVwX1UZzMG6hWKiI2GQ0/DA\noQ8BRmrXmkgSfChDP2s04kpTmvYPPQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "DSAVer",
+      "tests" : [
+        {
+          "tcId" : 570,
+          "comment" : "s == 1",
+          "msg" : "54657374",
+          "sig" : "3021021c5a252f4fc55618747fd94b13c9bee62bb958d85777cb07dd90710d24020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "g" : "16a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde",
+        "keySize" : 2048,
+        "p" : "08f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+        "q" : "0baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+        "type" : "DSAPublicKey",
+        "y" : "1e77f842b1ae0fcd9929d394161d41e14614ff7507a9a31f4a1f14d22e2a627a1f4e596624883f1a5b168e9425146f22d5f6ee28757414714bb994ba1129f015d6e04a717edf9b530a5d5cab94f14631e8b4cf79aeb358cc741845553841e8ac461630e804a62f43676ba6794af66899c377b869ea612a7b9fe6611aa96be52eb8b62c979117bbbcca8a7ec1e1ffab1c7dfcfc7048700d3ae3858136e897701d7c2921b5dfef1d1f897f50d96ca1b5c2edc58cada18919e35642f0807eebfa00c99a32f4d095c3188f78ed54711be0325c4b532aeccd6540a567c327225440ea15319bde06510479a1861799e25b57decc73c036d75a0702bd373ca231349931"
+      },
+      "keyDer" : "308203423082023506072a8648ce3804013082022802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d0282010016a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde0382010500028201001e77f842b1ae0fcd9929d394161d41e14614ff7507a9a31f4a1f14d22e2a627a1f4e596624883f1a5b168e9425146f22d5f6ee28757414714bb994ba1129f015d6e04a717edf9b530a5d5cab94f14631e8b4cf79aeb358cc741845553841e8ac461630e804a62f43676ba6794af66899c377b869ea612a7b9fe6611aa96be52eb8b62c979117bbbcca8a7ec1e1ffab1c7dfcfc7048700d3ae3858136e897701d7c2921b5dfef1d1f897f50d96ca1b5c2edc58cada18919e35642f0807eebfa00c99a32f4d095c3188f78ed54711be0325c4b532aeccd6540a567c327225440ea15319bde06510479a1861799e25b57decc73c036d75a0702bd373ca231349931",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIDQjCCAjUGByqGSM44BAEwggIoAoIBAQCPeTXZuarpv6vtiHrPSVG28y7Fnjuv\nNxjo6sSWHz79NgbnQ1GpxBgzObgJ58KuHFObp0dbhdARrbi0eYd1SYRpXKwOjxSz\nNggooi/6JxEKPWKpk0U0CaD+aWxGWPhL3SCBnDcJoBBXsZWtzQAjPbpUhLYpH51k\njviDRIZ3l5zsBLQ0pqwudemYXeI9sCkvwRGMn/qdgYHnM423krcw17njSVkvaAmY\nchU5Feo9a4tGU8YzRY+AOzKkwuDycpAlbk4/ijsIOKHEUOThjBopo33fXqFD3ktm\n/wSQPtXPFiPhWNSHxgjpfyEc2B3KI8tuOAdl+CLjQr5ITAV2OTlgHNZnAh0AuvaW\npoV499/e5/pnyXfHhe8ysjO65YDAvNVpXQKCAQAWplxYIEhQcE51AqOXVwQNNNo6\nNHjBVNTkpcAtJC7gT5bmHkvQkEq9rI837rHgnzGC0jyQQ8tkL4gAQWDt+coJsyB2\np5wypifyRz6Rh5uixOdEvSCBVEy1W4AsNo0fqD7UielOD6BojjJCilx4xHjGjQUn\ntxyaOrsLC+EsRGiWOefTznTbEBplqiuH9kxoJts+xy9LVZmDS7TtsC98kOmkltOl\nXVNb6/xF1PYZ9j897buHOSXC8iTgdzEpbaiH7B5HSPh++1/et1SEMWsiMt7lU92v\nAhErDR8C2jCXMiT+J67ai51LKSLZuovjntnhA6Y8UoELxoi34u1DFuHvF9veA4IB\nBQACggEAHnf4QrGuD82ZKdOUFh1B4UYU/3UHqaMfSh8U0i4qYnofTllmJIg/GlsW\njpQlFG8i1fbuKHV0FHFLuZS6ESnwFdbgSnF+35tTCl1cq5TxRjHotM95rrNYzHQY\nRVU4QeisRhYw6ASmL0Nna6Z5SvZomcN3uGnqYSp7n+ZhGqlr5S64tiyXkRe7vMqK\nfsHh/6scffz8cEhwDTrjhYE26JdwHXwpIbXf7x0fiX9Q2WyhtcLtxYytoYkZ41ZC\n8IB+6/oAyZoy9NCVwxiPeO1UcRvgMlxLUyrszWVApWfDJyJUQOoVMZveBlEEeaGG\nF5niW1fezHPANtdaBwK9NzyiMTSZMQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "DSAVer",
+      "tests" : [
+        {
+          "tcId" : 571,
+          "comment" : "Legacy:ASN encoding of r misses leading 0",
+          "msg" : "54657374",
+          "sig" : "303c021c9b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "acceptable",
+          "flags" : [
+            "NoLeadingZero"
+          ]
+        },
+        {
+          "tcId" : 572,
+          "comment" : "valid",
+          "msg" : "54657374",
+          "sig" : "303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 573,
+          "comment" : "long form encoding of length",
+          "msg" : "54657374",
+          "sig" : "30813d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 574,
+          "comment" : "long form encoding of length",
+          "msg" : "54657374",
+          "sig" : "303e02811d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 575,
+          "comment" : "long form encoding of length",
+          "msg" : "54657374",
+          "sig" : "303e021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee9302811c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 576,
+          "comment" : "length contains leading 0",
+          "msg" : "54657374",
+          "sig" : "3082003d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 577,
+          "comment" : "length contains leading 0",
+          "msg" : "54657374",
+          "sig" : "303f0282001d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 578,
+          "comment" : "length contains leading 0",
+          "msg" : "54657374",
+          "sig" : "303f021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930282001c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 579,
+          "comment" : "wrong length",
+          "msg" : "54657374",
+          "sig" : "303e021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 580,
+          "comment" : "wrong length",
+          "msg" : "54657374",
+          "sig" : "303c021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 581,
+          "comment" : "wrong length",
+          "msg" : "54657374",
+          "sig" : "303d021e009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 582,
+          "comment" : "wrong length",
+          "msg" : "54657374",
+          "sig" : "303d021c009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 583,
+          "comment" : "wrong length",
+          "msg" : "54657374",
+          "sig" : "303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021d5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 584,
+          "comment" : "wrong length",
+          "msg" : "54657374",
+          "sig" : "303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021b5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 585,
+          "comment" : "uint32 overflow in length",
+          "msg" : "54657374",
+          "sig" : "3085010000003d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 586,
+          "comment" : "uint32 overflow in length",
+          "msg" : "54657374",
+          "sig" : "30420285010000001d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 587,
+          "comment" : "uint32 overflow in length",
+          "msg" : "54657374",
+          "sig" : "3042021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930285010000001c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 588,
+          "comment" : "uint64 overflow in length",
+          "msg" : "54657374",
+          "sig" : "308901000000000000003d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 589,
+          "comment" : "uint64 overflow in length",
+          "msg" : "54657374",
+          "sig" : "3046028901000000000000001d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 590,
+          "comment" : "uint64 overflow in length",
+          "msg" : "54657374",
+          "sig" : "3046021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93028901000000000000001c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 591,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "54657374",
+          "sig" : "30847fffffff021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 592,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "54657374",
+          "sig" : "304102847fffffff009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 593,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "54657374",
+          "sig" : "3041021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee9302847fffffff5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 594,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "54657374",
+          "sig" : "3084ffffffff021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 595,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "54657374",
+          "sig" : "30410284ffffffff009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 596,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "54657374",
+          "sig" : "3041021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930284ffffffff5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 597,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "54657374",
+          "sig" : "3085ffffffffff021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 598,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "54657374",
+          "sig" : "30420285ffffffffff009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 599,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "54657374",
+          "sig" : "3042021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930285ffffffffff5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 600,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "54657374",
+          "sig" : "3088ffffffffffffffff021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 601,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "54657374",
+          "sig" : "30450288ffffffffffffffff009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 602,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "54657374",
+          "sig" : "3045021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930288ffffffffffffffff5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 603,
+          "comment" : "incorrect length",
+          "msg" : "54657374",
+          "sig" : "30ff021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 604,
+          "comment" : "incorrect length",
+          "msg" : "54657374",
+          "sig" : "303d02ff009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 605,
+          "comment" : "incorrect length",
+          "msg" : "54657374",
+          "sig" : "303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee9302ff5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 606,
+          "comment" : "indefinite length without termination",
+          "msg" : "54657374",
+          "sig" : "3080021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 607,
+          "comment" : "indefinite length without termination",
+          "msg" : "54657374",
+          "sig" : "303d0280009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 608,
+          "comment" : "indefinite length without termination",
+          "msg" : "54657374",
+          "sig" : "303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee9302805fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 609,
+          "comment" : "removing sequence",
+          "msg" : "54657374",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 610,
+          "comment" : "lonely sequence tag",
+          "msg" : "54657374",
+          "sig" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 611,
+          "comment" : "appending 0's to sequence",
+          "msg" : "54657374",
+          "sig" : "303f021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 612,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "54657374",
+          "sig" : "303f0000021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 613,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "54657374",
+          "sig" : "303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 614,
+          "comment" : "appending null value to sequence",
+          "msg" : "54657374",
+          "sig" : "303f021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 615,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "3042498177303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 616,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "30412500303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 617,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "303f303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 618,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "30422222498177021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 619,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "304122212500021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 620,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "3045221f021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930004deadbeef021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 621,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "3042021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee932221498177021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 622,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "3041021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee9322202500021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 623,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "3045021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93221e021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 624,
+          "comment" : "including undefined tags",
+          "msg" : "54657374",
+          "sig" : "3045aa00bb00cd00303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 625,
+          "comment" : "including undefined tags",
+          "msg" : "54657374",
+          "sig" : "3043aa02aabb303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 626,
+          "comment" : "including undefined tags",
+          "msg" : "54657374",
+          "sig" : "30452225aa00bb00cd00021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 627,
+          "comment" : "including undefined tags",
+          "msg" : "54657374",
+          "sig" : "30432223aa02aabb021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 628,
+          "comment" : "including undefined tags",
+          "msg" : "54657374",
+          "sig" : "3045021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee932224aa00bb00cd00021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 629,
+          "comment" : "including undefined tags",
+          "msg" : "54657374",
+          "sig" : "3043021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee932222aa02aabb021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 630,
+          "comment" : "truncated length of sequence",
+          "msg" : "54657374",
+          "sig" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 631,
+          "comment" : "using composition with indefinite length",
+          "msg" : "54657374",
+          "sig" : "3080303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 632,
+          "comment" : "using composition with indefinite length",
+          "msg" : "54657374",
+          "sig" : "30412280021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930000021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 633,
+          "comment" : "using composition with indefinite length",
+          "msg" : "54657374",
+          "sig" : "3041021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee932280021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 634,
+          "comment" : "using composition with wrong tag",
+          "msg" : "54657374",
+          "sig" : "3080313d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 635,
+          "comment" : "using composition with wrong tag",
+          "msg" : "54657374",
+          "sig" : "30412280031d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930000021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 636,
+          "comment" : "using composition with wrong tag",
+          "msg" : "54657374",
+          "sig" : "3041021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee932280031c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 637,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "54657374",
+          "sig" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 638,
+          "comment" : "changing tag value of sequence",
+          "msg" : "54657374",
+          "sig" : "2e3d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 639,
+          "comment" : "changing tag value of sequence",
+          "msg" : "54657374",
+          "sig" : "2f3d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 640,
+          "comment" : "changing tag value of sequence",
+          "msg" : "54657374",
+          "sig" : "313d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 641,
+          "comment" : "changing tag value of sequence",
+          "msg" : "54657374",
+          "sig" : "323d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 642,
+          "comment" : "changing tag value of sequence",
+          "msg" : "54657374",
+          "sig" : "ff3d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 643,
+          "comment" : "dropping value of sequence",
+          "msg" : "54657374",
+          "sig" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 644,
+          "comment" : "using composition for sequence",
+          "msg" : "54657374",
+          "sig" : "3041300102303c1d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 645,
+          "comment" : "truncate sequence",
+          "msg" : "54657374",
+          "sig" : "303c021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 646,
+          "comment" : "truncate sequence",
+          "msg" : "54657374",
+          "sig" : "303c1d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 647,
+          "comment" : "indefinite length",
+          "msg" : "54657374",
+          "sig" : "3080021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 648,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "54657374",
+          "sig" : "3080021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b11600",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 649,
+          "comment" : "indefinite length with additional element",
+          "msg" : "54657374",
+          "sig" : "3080021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b11605000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 650,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "54657374",
+          "sig" : "3080021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 651,
+          "comment" : "indefinite length with garbage",
+          "msg" : "54657374",
+          "sig" : "3080021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 652,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "54657374",
+          "sig" : "3080021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 653,
+          "comment" : "prepend empty sequence",
+          "msg" : "54657374",
+          "sig" : "303f3000021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 654,
+          "comment" : "append empty sequence",
+          "msg" : "54657374",
+          "sig" : "303f021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1163000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 655,
+          "comment" : "sequence of sequence",
+          "msg" : "54657374",
+          "sig" : "303f303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 656,
+          "comment" : "truncated sequence",
+          "msg" : "54657374",
+          "sig" : "301f021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 657,
+          "comment" : "repeat element in sequence",
+          "msg" : "54657374",
+          "sig" : "305b021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 658,
+          "comment" : "removing integer",
+          "msg" : "54657374",
+          "sig" : "301e021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 659,
+          "comment" : "lonely integer tag",
+          "msg" : "54657374",
+          "sig" : "301f02021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 660,
+          "comment" : "lonely integer tag",
+          "msg" : "54657374",
+          "sig" : "3020021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee9302",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 661,
+          "comment" : "appending 0's to integer",
+          "msg" : "54657374",
+          "sig" : "303f021f009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930000021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 662,
+          "comment" : "appending 0's to integer",
+          "msg" : "54657374",
+          "sig" : "303f021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021e5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 663,
+          "comment" : "prepending 0's to integer",
+          "msg" : "54657374",
+          "sig" : "303f021f0000009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 664,
+          "comment" : "prepending 0's to integer",
+          "msg" : "54657374",
+          "sig" : "303f021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021e00005fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 665,
+          "comment" : "appending unused 0's to integer",
+          "msg" : "54657374",
+          "sig" : "303f021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930000021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 666,
+          "comment" : "appending null value to integer",
+          "msg" : "54657374",
+          "sig" : "303f021f009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930500021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 667,
+          "comment" : "appending null value to integer",
+          "msg" : "54657374",
+          "sig" : "303f021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021e5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1160500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 668,
+          "comment" : "truncated length of integer",
+          "msg" : "54657374",
+          "sig" : "30200281021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 669,
+          "comment" : "truncated length of integer",
+          "msg" : "54657374",
+          "sig" : "3021021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930281",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 670,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "54657374",
+          "sig" : "30200500021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 671,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "54657374",
+          "sig" : "3021021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 672,
+          "comment" : "changing tag value of integer",
+          "msg" : "54657374",
+          "sig" : "303d001d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 673,
+          "comment" : "changing tag value of integer",
+          "msg" : "54657374",
+          "sig" : "303d011d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 674,
+          "comment" : "changing tag value of integer",
+          "msg" : "54657374",
+          "sig" : "303d031d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 675,
+          "comment" : "changing tag value of integer",
+          "msg" : "54657374",
+          "sig" : "303d041d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 676,
+          "comment" : "changing tag value of integer",
+          "msg" : "54657374",
+          "sig" : "303dff1d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 677,
+          "comment" : "changing tag value of integer",
+          "msg" : "54657374",
+          "sig" : "303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93001c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 678,
+          "comment" : "changing tag value of integer",
+          "msg" : "54657374",
+          "sig" : "303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93011c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 679,
+          "comment" : "changing tag value of integer",
+          "msg" : "54657374",
+          "sig" : "303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93031c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 680,
+          "comment" : "changing tag value of integer",
+          "msg" : "54657374",
+          "sig" : "303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93041c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 681,
+          "comment" : "changing tag value of integer",
+          "msg" : "54657374",
+          "sig" : "303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93ff1c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 682,
+          "comment" : "dropping value of integer",
+          "msg" : "54657374",
+          "sig" : "30200200021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 683,
+          "comment" : "dropping value of integer",
+          "msg" : "54657374",
+          "sig" : "3021021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee930200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 684,
+          "comment" : "using composition for integer",
+          "msg" : "54657374",
+          "sig" : "30412221020100021c9b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 685,
+          "comment" : "using composition for integer",
+          "msg" : "54657374",
+          "sig" : "3041021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93222002015f021be8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 686,
+          "comment" : "modify first byte of integer",
+          "msg" : "54657374",
+          "sig" : "303d021d029b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 687,
+          "comment" : "modify first byte of integer",
+          "msg" : "54657374",
+          "sig" : "303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5de8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 688,
+          "comment" : "modify last byte of integer",
+          "msg" : "54657374",
+          "sig" : "303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee13021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 689,
+          "comment" : "modify last byte of integer",
+          "msg" : "54657374",
+          "sig" : "303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b196",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 690,
+          "comment" : "truncate integer",
+          "msg" : "54657374",
+          "sig" : "303c021c009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 691,
+          "comment" : "truncate integer",
+          "msg" : "54657374",
+          "sig" : "303c021c9b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 692,
+          "comment" : "truncate integer",
+          "msg" : "54657374",
+          "sig" : "303c021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021b5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 693,
+          "comment" : "truncate integer",
+          "msg" : "54657374",
+          "sig" : "303c021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021be8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 694,
+          "comment" : "leading ff in integer",
+          "msg" : "54657374",
+          "sig" : "303e021eff009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 695,
+          "comment" : "leading ff in integer",
+          "msg" : "54657374",
+          "sig" : "303e021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021dff5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 696,
+          "comment" : "infinity",
+          "msg" : "54657374",
+          "sig" : "3021090180021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 697,
+          "comment" : "infinity",
+          "msg" : "54657374",
+          "sig" : "3022021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93090180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 698,
+          "comment" : "replacing integer with zero",
+          "msg" : "54657374",
+          "sig" : "3021020100021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 699,
+          "comment" : "replacing integer with zero",
+          "msg" : "54657374",
+          "sig" : "3022021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93020100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 700,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "54657374",
+          "sig" : "303d021d0156667b48514d3e5d546ca89ff45ada90474113ed248b873430ab57f0021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 701,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "54657374",
+          "sig" : "303c021ce0794dfb465b4e9d969cb3d0616b4b8468dbaf85aec085b2b7008536021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 702,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "54657374",
+          "sig" : "303d021dff64901b5e342bb9828a7b51c7d51cecf5a7f19e469659f98c8c2a116d021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 703,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "54657374",
+          "sig" : "303c021c1f86b204b9a4b16269634c2f9e94b47b9724507a513f7a4d48ff7aca021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 704,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "54657374",
+          "sig" : "303d021dfea99984b7aeb2c1a2ab9357600ba5256fb8beec12db7478cbcf54a810021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 705,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "54657374",
+          "sig" : "303d021d019b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 706,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "54657374",
+          "sig" : "303c021c64901b5e342bb9828a7b51c7d51cecf5a7f19e469659f98c8c2a116d021c5fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 707,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "54657374",
+          "sig" : "303e021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021d011adeb9ed974f878dc2fc26f4bf86ffda5f7abe6c26ebabf9b8181a73",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 708,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "54657374",
+          "sig" : "303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021ca4f18ca08c5d97ce052c32252c9770ce81155a04b120aa783e6d47b9",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 709,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "54657374",
+          "sig" : "303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021ca017dcb8ee2970521bebd37309f0c7ab8fb7f3c793f9d4c704bd4eea",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 710,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "54657374",
+          "sig" : "303d021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021c5b0e735f73a26831fad3cddad3688f317eeaa5fb4edf5587c192b847",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 711,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "54657374",
+          "sig" : "303e021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021dfee521461268b078723d03d90b40790025a0854193d914540647e7e58d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 712,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "54657374",
+          "sig" : "303e021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021d015fe8234711d68fade4142c8cf60f385470480c386c062b38fb42b116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 713,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the group order",
+          "msg" : "54657374",
+          "sig" : "303e021d009b6fe4a1cbd4467d7584ae382ae3130a580e61b969a6067373d5ee93021d00a017dcb8ee2970521bebd37309f0c7ab8fb7f3c793f9d4c704bd4eea",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 714,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022020100021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 715,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3006020100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 716,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3006020100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 717,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "30060201000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 718,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3021020100021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 719,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3021020100021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 720,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022020100021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 721,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022020100021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 722,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022020100021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 723,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022020100021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 724,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3082010802010002820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 725,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3008020100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 726,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022020101021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 727,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3006020101020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 728,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3006020101020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 729,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "30060201010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 730,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3021020101021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 731,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3021020101021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 732,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022020101021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 733,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022020101021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 734,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022020101021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 735,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022020101021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 736,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3082010802010102820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 737,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3008020101090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 738,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "30220201ff021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 739,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "30060201ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 740,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "30060201ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 741,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "30060201ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 742,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "30210201ff021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 743,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "30210201ff021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 744,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "30220201ff021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 745,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "30220201ff021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 746,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "30220201ff021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 747,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "30220201ff021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 748,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "308201080201ff02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 749,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "30080201ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 750,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 751,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3021021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 752,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3021021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 753,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3021021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 754,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303c021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 755,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303c021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 756,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 757,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 758,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 759,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 760,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "30820123021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 761,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3023021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 762,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 763,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3021021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 764,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3021021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 765,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3021021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 766,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303c021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 767,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303c021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 768,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 769,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 770,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 771,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 772,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "30820123021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 773,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3023021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 774,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 775,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 776,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 777,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 778,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 779,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 780,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 781,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 782,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 783,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 784,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "30820124021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 785,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3024021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 786,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 787,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 788,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 789,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 790,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 791,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 792,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 793,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 794,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 795,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 796,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "30820124021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 797,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3024021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 798,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 799,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 800,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 801,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 802,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 803,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303d021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 804,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 805,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 806,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 807,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303e021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 808,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "30820124021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 809,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3024021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 810,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303e021d0100000000000000000000000000000000000000000000000000000000021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 811,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022021d0100000000000000000000000000000000000000000000000000000000020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 812,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022021d0100000000000000000000000000000000000000000000000000000000020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 813,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3022021d01000000000000000000000000000000000000000000000000000000000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 814,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303d021d0100000000000000000000000000000000000000000000000000000000021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 815,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303d021d0100000000000000000000000000000000000000000000000000000000021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 816,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303e021d0100000000000000000000000000000000000000000000000000000000021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 817,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303e021d0100000000000000000000000000000000000000000000000000000000021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 818,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303e021d0100000000000000000000000000000000000000000000000000000000021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 819,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "303e021d0100000000000000000000000000000000000000000000000000000000021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 820,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "30820124021d010000000000000000000000000000000000000000000000000000000002820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 821,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3024021d0100000000000000000000000000000000000000000000000000000000090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 822,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3082012402820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 823,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3082010802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 824,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3082010802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 825,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3082010802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd6670201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 826,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3082012302820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 827,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3082012302820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 828,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3082012402820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 829,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3082012402820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 830,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3082012402820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 831,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3082012402820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 832,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3082020a02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd66702820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 833,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3082010a02820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 834,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3024090380fe01021dff450969597a870820211805983688387a10cd4dcc451a7f3f432a96a3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 835,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3008090380fe01020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 836,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3008090380fe01020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 837,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3008090380fe010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 838,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3023090380fe01021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4ae",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 839,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3023090380fe01021c5d7b4b5342bc7befef73fd33e4bbe3c2f7995919dd72c0605e6ab4af",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 840,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3024090380fe01021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 841,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3024090380fe01021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 842,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3024090380fe01021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 843,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3024090380fe01021d0100000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 844,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "3082010a090380fe0102820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 845,
+          "comment" : "Signatures with special case values for r and s.",
+          "msg" : "54657374",
+          "sig" : "300a090380fe01090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 846,
+          "comment" : "random signature",
+          "msg" : "54657374",
+          "sig" : "303d021d00a771ef48c2916d48ba9ece53cafb9acb3cf317a78216fae144c88fb3021c65663b70365747f4392d480aaf12b50b162d2ce58b61ccbee88a8df9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 847,
+          "comment" : "random signature",
+          "msg" : "54657374",
+          "sig" : "303e021d00946645d757f0adfbd301c9ee2c08bf0e059a5602de9525dbde789f81021d00a30eb7f2a5d9870c360315bf6d70d83e7b206bbc5ed7d2ded4bacb24",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 848,
+          "comment" : "random signature",
+          "msg" : "54657374",
+          "sig" : "303d021c70d3d4efc14853acf33f1060fee06a072773b4c9350d205e618646ab021d00b51e853022ff4922f955458e6b22f9454207a982927db32c76ee3344",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 849,
+          "comment" : "random signature",
+          "msg" : "54657374",
+          "sig" : "303c021c6ce7d91e02a62558e8dacd3cf180f81952a091845bbf47bf8fb9f48d021c1e6e4769bbbebc2fa9f819796e7b968c8b699c5f72ee517441c20359",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 850,
+          "comment" : "random signature",
+          "msg" : "54657374",
+          "sig" : "303d021c04aa8a8b3f9e1c3f2304070fd797634cec352bfda916bb7a7f20a174021d00a0bb9b091b921951241fae650aab087ac896ed190a3f7cf7aaa2300d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "g" : "16a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde",
+        "keySize" : 2048,
+        "p" : "08f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+        "q" : "0baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+        "type" : "DSAPublicKey",
+        "y" : "0848177b9bcff136c52caef2a4a9bcb64dbefbac69e18aae499696b5ec7b270e90478b413bb8ad8f8eee8ad32107d7ba492c36b007f9ef30ebe1ee484d0ea7cb0ff4afaa8c705ad5e16576975414f1bc0efed25c2190a3ed0068bffa1f03bf6f21056c9bb383350851997cbc89cf8729b394527f08ab93ce9b360aa055a47177e82a4ce6fe76c8dffddbd6ee20fa08d0085d3983edd2c8d9a366ad2245b4ed28d6754769f5f3a798be4be19cf469399865d464e3f640438bce03c962c2344d0d550542aed3db55c153833bea44b4146878ba347c8614436c6aac4fd1a60f25c62b3f869a7d55cab4b7122d5e9af4322a3fc8214fa55dc1ee021459fb2c4595827"
+      },
+      "keyDer" : "308203433082023506072a8648ce3804013082022802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d0282010016a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde03820106000282010100848177b9bcff136c52caef2a4a9bcb64dbefbac69e18aae499696b5ec7b270e90478b413bb8ad8f8eee8ad32107d7ba492c36b007f9ef30ebe1ee484d0ea7cb0ff4afaa8c705ad5e16576975414f1bc0efed25c2190a3ed0068bffa1f03bf6f21056c9bb383350851997cbc89cf8729b394527f08ab93ce9b360aa055a47177e82a4ce6fe76c8dffddbd6ee20fa08d0085d3983edd2c8d9a366ad2245b4ed28d6754769f5f3a798be4be19cf469399865d464e3f640438bce03c962c2344d0d550542aed3db55c153833bea44b4146878ba347c8614436c6aac4fd1a60f25c62b3f869a7d55cab4b7122d5e9af4322a3fc8214fa55dc1ee021459fb2c4595827",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIDQzCCAjUGByqGSM44BAEwggIoAoIBAQCPeTXZuarpv6vtiHrPSVG28y7Fnjuv\nNxjo6sSWHz79NgbnQ1GpxBgzObgJ58KuHFObp0dbhdARrbi0eYd1SYRpXKwOjxSz\nNggooi/6JxEKPWKpk0U0CaD+aWxGWPhL3SCBnDcJoBBXsZWtzQAjPbpUhLYpH51k\njviDRIZ3l5zsBLQ0pqwudemYXeI9sCkvwRGMn/qdgYHnM423krcw17njSVkvaAmY\nchU5Feo9a4tGU8YzRY+AOzKkwuDycpAlbk4/ijsIOKHEUOThjBopo33fXqFD3ktm\n/wSQPtXPFiPhWNSHxgjpfyEc2B3KI8tuOAdl+CLjQr5ITAV2OTlgHNZnAh0AuvaW\npoV499/e5/pnyXfHhe8ysjO65YDAvNVpXQKCAQAWplxYIEhQcE51AqOXVwQNNNo6\nNHjBVNTkpcAtJC7gT5bmHkvQkEq9rI837rHgnzGC0jyQQ8tkL4gAQWDt+coJsyB2\np5wypifyRz6Rh5uixOdEvSCBVEy1W4AsNo0fqD7UielOD6BojjJCilx4xHjGjQUn\ntxyaOrsLC+EsRGiWOefTznTbEBplqiuH9kxoJts+xy9LVZmDS7TtsC98kOmkltOl\nXVNb6/xF1PYZ9j897buHOSXC8iTgdzEpbaiH7B5HSPh++1/et1SEMWsiMt7lU92v\nAhErDR8C2jCXMiT+J67ai51LKSLZuovjntnhA6Y8UoELxoi34u1DFuHvF9veA4IB\nBgACggEBAISBd7m8/xNsUsrvKkqby2Tb77rGnhiq5Jlpa17HsnDpBHi0E7uK2Pju\n6K0yEH17pJLDawB/nvMOvh7khNDqfLD/SvqoxwWtXhZXaXVBTxvA7+0lwhkKPtAG\ni/+h8Dv28hBWybs4M1CFGZfLyJz4cps5RSfwirk86bNgqgVaRxd+gqTOb+dsjf/d\nvW7iD6CNAIXTmD7dLI2aNmrSJFtO0o1nVHafXzp5i+S+Gc9Gk5mGXUZOP2QEOLzg\nPJYsI0TQ1VBUKu09tVwVODO+pEtBRoeLo0fIYUQ2xqrE/Rpg8lxis/hpp9Vcq0tx\nItXpr0Mio/yCFPpV3B7gIUWfssRZWCc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "DSAVer",
+      "tests" : [
+        {
+          "tcId" : 851,
+          "comment" : "r,s = 1,1",
+          "msg" : "54657374",
+          "sig" : "3006020101020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 852,
+          "comment" : "r,s = 1,5",
+          "msg" : "54657374",
+          "sig" : "3006020101020105",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 853,
+          "comment" : "u2 small",
+          "msg" : "54657374",
+          "sig" : "3022020101021d009592121ed12d93197f1ffb863ac63937f28ef4f62f1e009a30aabab1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 854,
+          "comment" : "s == q-1",
+          "msg" : "54657374",
+          "sig" : "3022020101021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "g" : "16a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde",
+        "keySize" : 2048,
+        "p" : "08f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667",
+        "q" : "0baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d",
+        "type" : "DSAPublicKey",
+        "y" : "629374929537e2c3b09f30d881554ca7357f89e25105474dbbce06e4001efd61481a457aa0d7d7e565e90b7a3d9c688005fb404bf3b6d3e61e402300beee7c58ceeaf00b112ddfeef3cbc2020ba2206dd4ef0563d7fa52c321b4ee6280eb8585041d03cadb9244dff21dc90417bbe6f06b91c2ca6484437c3846926b18ee22275081b60726e7a26a29a947eabd035ede83d65927b3ceb0d4d8c2f34e94a3de0f57e4ea99af059657529f6954b1ac9bb4484ca76b4083e1cf4264eff028662137761e4d7f35b1eda3cf516856f25553840e43ae38379d234b06c891822132081d19f0d5db9f23b4bbd5f5667dd78f3dd7f1fe5f25ca48515f6335ce1c9fd0a64b"
+      },
+      "keyDer" : "308203423082023506072a8648ce3804013082022802820101008f7935d9b9aae9bfabed887acf4951b6f32ec59e3baf3718e8eac4961f3efd3606e74351a9c4183339b809e7c2ae1c539ba7475b85d011adb8b47987754984695cac0e8f14b3360828a22ffa27110a3d62a993453409a0fe696c4658f84bdd20819c3709a01057b195adcd00233dba5484b6291f9d648ef883448677979cec04b434a6ac2e75e9985de23db0292fc1118c9ffa9d8181e7338db792b730d7b9e349592f68099872153915ea3d6b8b4653c633458f803b32a4c2e0f27290256e4e3f8a3b0838a1c450e4e18c1a29a37ddf5ea143de4b66ff04903ed5cf1623e158d487c608e97f211cd81dca23cb6e380765f822e342be484c05763939601cd667021d00baf696a68578f7dfdee7fa67c977c785ef32b233bae580c0bcd5695d0282010016a65c58204850704e7502a39757040d34da3a3478c154d4e4a5c02d242ee04f96e61e4bd0904abdac8f37eeb1e09f3182d23c9043cb642f88004160edf9ca09b32076a79c32a627f2473e91879ba2c4e744bd2081544cb55b802c368d1fa83ed489e94e0fa0688e32428a5c78c478c68d0527b71c9a3abb0b0be12c44689639e7d3ce74db101a65aa2b87f64c6826db3ec72f4b5599834bb4edb02f7c90e9a496d3a55d535bebfc45d4f619f63f3dedbb873925c2f224e07731296da887ec1e4748f87efb5fdeb75484316b2232dee553ddaf02112b0d1f02da30973224fe27aeda8b9d4b2922d9ba8be39ed9e103a63c52810bc688b7e2ed4316e1ef17dbde038201050002820100629374929537e2c3b09f30d881554ca7357f89e25105474dbbce06e4001efd61481a457aa0d7d7e565e90b7a3d9c688005fb404bf3b6d3e61e402300beee7c58ceeaf00b112ddfeef3cbc2020ba2206dd4ef0563d7fa52c321b4ee6280eb8585041d03cadb9244dff21dc90417bbe6f06b91c2ca6484437c3846926b18ee22275081b60726e7a26a29a947eabd035ede83d65927b3ceb0d4d8c2f34e94a3de0f57e4ea99af059657529f6954b1ac9bb4484ca76b4083e1cf4264eff028662137761e4d7f35b1eda3cf516856f25553840e43ae38379d234b06c891822132081d19f0d5db9f23b4bbd5f5667dd78f3dd7f1fe5f25ca48515f6335ce1c9fd0a64b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIDQjCCAjUGByqGSM44BAEwggIoAoIBAQCPeTXZuarpv6vtiHrPSVG28y7Fnjuv\nNxjo6sSWHz79NgbnQ1GpxBgzObgJ58KuHFObp0dbhdARrbi0eYd1SYRpXKwOjxSz\nNggooi/6JxEKPWKpk0U0CaD+aWxGWPhL3SCBnDcJoBBXsZWtzQAjPbpUhLYpH51k\njviDRIZ3l5zsBLQ0pqwudemYXeI9sCkvwRGMn/qdgYHnM423krcw17njSVkvaAmY\nchU5Feo9a4tGU8YzRY+AOzKkwuDycpAlbk4/ijsIOKHEUOThjBopo33fXqFD3ktm\n/wSQPtXPFiPhWNSHxgjpfyEc2B3KI8tuOAdl+CLjQr5ITAV2OTlgHNZnAh0AuvaW\npoV499/e5/pnyXfHhe8ysjO65YDAvNVpXQKCAQAWplxYIEhQcE51AqOXVwQNNNo6\nNHjBVNTkpcAtJC7gT5bmHkvQkEq9rI837rHgnzGC0jyQQ8tkL4gAQWDt+coJsyB2\np5wypifyRz6Rh5uixOdEvSCBVEy1W4AsNo0fqD7UielOD6BojjJCilx4xHjGjQUn\ntxyaOrsLC+EsRGiWOefTznTbEBplqiuH9kxoJts+xy9LVZmDS7TtsC98kOmkltOl\nXVNb6/xF1PYZ9j897buHOSXC8iTgdzEpbaiH7B5HSPh++1/et1SEMWsiMt7lU92v\nAhErDR8C2jCXMiT+J67ai51LKSLZuovjntnhA6Y8UoELxoi34u1DFuHvF9veA4IB\nBQACggEAYpN0kpU34sOwnzDYgVVMpzV/ieJRBUdNu84G5AAe/WFIGkV6oNfX5WXp\nC3o9nGiABftAS/O20+YeQCMAvu58WM7q8AsRLd/u88vCAguiIG3U7wVj1/pSwyG0\n7mKA64WFBB0DytuSRN/yHckEF7vm8GuRwspkhEN8OEaSaxjuIidQgbYHJueiaimp\nR+q9A17eg9ZZJ7POsNTYwvNOlKPeD1fk6pmvBZZXUp9pVLGsm7RITKdrQIPhz0Jk\n7/AoZiE3dh5NfzWx7aPPUWhW8lVThA5Drjg3nSNLBsiRgiEyCB0Z8NXbnyO0u9X1\nZn3Xjz3X8f5fJcpIUV9jNc4cn9CmSw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "DSAVer",
+      "tests" : [
+        {
+          "tcId" : 855,
+          "comment" : "s == 1",
+          "msg" : "54657374",
+          "sig" : "3021021c5a252f4fc55618747fd94b13c9bee62bb958d85777cb07dd90710d24020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdh_brainpoolP224r1_test.json b/third_party/wycheproof/testvectors/ecdh_brainpoolP224r1_test.json
new file mode 100644
index 0000000..0a234ae
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdh_brainpoolP224r1_test.json
@@ -0,0 +1,3390 @@
+{
+  "algorithm" : "ECDH",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "AddSubChain" : "The private key has a special value. Implementations using addition subtraction chains for the point multiplication may get the point at infinity as an intermediate result. See CVE_2017_10176",
+    "CompressedPoint" : "The point in the public key is compressed. Not every library supports points in compressed format.",
+    "InvalidAsn" : "The public key in this test uses an invalid ASN encoding. Some cases where the ASN parser is not strictly checking the ASN format are benign as long as the ECDH computation still returns the correct shared value.",
+    "InvalidPublic" : "The public key has been modified and is invalid. An implementation should always check whether the public key is valid and on the same curve as the private key. The test vector includes the shared secret computed with the original public key if the public point is on the curve of the private key. Generating a shared secret other than the one with the original key likely indicates that the bug is exploitable.",
+    "IsomorphicPublicKey" : "The public key in this test vector uses an isomorphic curve. Such isomorphisms are sometimes used to speed up implementations. For example the brainpool curves are using this.",
+    "ModifiedPrime" : "The modulus of the public key has been modified. The public point of the public key has been chosen so that it is both a point on both the curve of the modified public key and the private key.",
+    "UnnamedCurve" : "The public key does not use a named curve. RFC 3279 allows to encode such curves by explicitly encoding, the parameters of the curve equation, modulus, generator, order and cofactor. However, many crypto libraries only support named curves. Modifying some of the EC parameters and encoding the corresponding public key as an unnamed curve is a potential attack vector.",
+    "UnusedParam" : "A parameter that is typically not used for ECDH has been modified. Sometimes libraries ignore small differences between public and private key. For example, a library might ignore an incorrect cofactor in the public key. We consider ignoring such changes as acceptable as long as these differences do not change the outcome of the ECDH computation, i.e. as long as the computation is done on the curve from the private key.",
+    "WeakPublicKey" : "The vector contains a weak public key. The curve is not a named curve, the public key point has order 3 and has been chosen to be on the same curve as the private key. This test vector is used to check ECC implementations for missing steps in the verification of the public key.",
+    "WrongOrder" : "The order of the public key has been modified. If this order is used in a cryptographic primitive instead of the correct order then private keys may leak. E.g. ECDHC in BC 1.52 suffered from this."
+  },
+  "numberOfTests" : 318,
+  "header" : [],
+  "testGroups" : [
+    {
+      "curve" : "brainpoolP224r1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "normal case",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000447a927daafd7282afd721c141c268be12312066c1d62fe047dcef272958e02a2b81c89d7b81004eda65cb6e1df8da330be2d563221862b81",
+          "private" : "08cff3b0b5c1b3220043759320c6cc6392e19e554f180f3df1e44c7fc",
+          "shared" : "4f7afb302c699bd56db0bdac550172bac94b73b0f2b60eee91b6a420",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "compressed public key",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010105031e000347a927daafd7282afd721c141c268be12312066c1d62fe047dcef272",
+          "private" : "08cff3b0b5c1b3220043759320c6cc6392e19e554f180f3df1e44c7fc",
+          "shared" : "4f7afb302c699bd56db0bdac550172bac94b73b0f2b60eee91b6a420",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00045f9a3dd8daebed9583d91dd75c6ef089d325ffafb3639fb97a7a2dea04e811b5cb44e171a5ded25c22f37fd10e1860416e4edb8aa8081c0e",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "00000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00045c753c63b9cb9b79ebbd8d4e3fc3ae8de3ed6a16d12e38b1fc23e9e5aa6d815ecdf607246745e02982919a91a4cf8f1443fa90dd8f70a57b",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "00000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00045d8de5d817d49856a9ae870b5c84824f1a19745e963c820fdebb553c06f87a56e4d0019f1192f904285f5538c1d3eedc059e77344e7d4b8b",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "000000000000000000000000ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004539b0566588e16505e2d39323c07799a6aa288e7d2aa03db8a392a388aad13ac01879d1cde648dc8ad70c2dec49cb67961b2493ddad8724e",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "00000000000000ffffffffffffff0000000000000100000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000426287f17f2554aaf1e49c5594fbc35059a5c7c037994bfff9cb437f33d0e5fa3400163c4a0ec513e7049edeac43f7463b99f1c9144d454d9",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "00000000ffffffffffffffff0000000000000000ffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00043ac67c437f5cd2b4bc78218b01f64130c8b217070f6e1eef5ad4b600242505741417f79fd28596192538a9438126a49f44f98ed2642aab1b",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00048ab3fa0ccf52a661ea3a1d50219c0cbf809bcbf63745f4e0b94a890c01c166c6392c3690f7ec28684857ea05f5fd4b8b4e7b8b05a9e94265",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "0003fffffff00000003fffffff00000003fffffff000000040000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00045a6ecb1ba881bf4df559980cc940e66e430bb22b6dd0e6ea1842e90caa0c8cd725f93c45985695fc3a78c42ef72c190b083db57ff85c3db2",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "01fffffffc00000007fffffff00000001fffffffc00000007fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00041076cc0201b3399137184b1731028ba2bebdcba1548ad5ed1af1df9cd2f4abb6d76591efe7712bc3544a76ef53bed9f186a2c2d12105e7ad",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "30975f626ebd46b09e413513a897f6b74de5707bbbeb7a3d8c60d0b9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00045216d31c450635af6d6c7327d3fe0514a8abb972b16d3084164c9ac761817518c5f4e78e277e009c7028ad7e59a3a87e13295ef1777119cc",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "373bbcf4231b53083d36adb3f56485603b19b4b77251abd9b8683c12",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004b1121e4cafa5ee5cca2a9b661dadb37a819c0bb32dc0f01680c8192913981ac1c68e6d410cda305b0be46ef1422a70354199d0f544176195",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "41478d4c207e3fe1aef7fbcc34223f39b86f634d978921ecb40a5136",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00046e22eb98da25e639954eb2987a1fc71605b287abe4a9e7fe4cd79c4bc759b111ce37a17fda313b17393c08c750ecf1d38a9e0f72c0c1705f",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "5394eaa3dbc30feac5eb7d88e69cf068315ccb6dedf787dbf933f823",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004a60d25227568b2486b402af66d9212fe923a37873a8a5613ef813d91c88aa84b15b7cae6ab6478f0bf42c464f3f50ec27d339e85a4908841",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "7ffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000499b409afecf5e544d0477a8a43d6f4805ca19d0b24b89d6a372556060695d60a6c4c321043cb40a501a2781c77fb9c8f370c8af801069e85",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "7fff0000003ffffff0000003ffffff0000003ffffff0000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004772b186ddd36192f7a73f10372c86d6a7e05200e0dabffe07e02bc9ea13a2429f0a30ab26de39bfafd44e37f14c79acee2ca7fbf2bd8f55c",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "7ffff0000007fffffe000000ffffffc000001ffffff8000004000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d54fbb07c8c0482600908178438fd572eca1ebafdcd101071afcb247a0561e4e2201447d30db350510f0f8afffa228515de9289516855d2f",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "7fffffff00000000ffffffff00000000ffffffff0000000100000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004baeaa482e45fb4b932c945eeade8644f980e50f4150fc4ce1d02ecf6a883c9da5dc24c149b9b4510da27db8df3b3afbeaa629e19d99be628",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d63331a28bd6f82dcbe3de0ea807431012e954fd9febcc7a3687dbabca532329351b6a7a0648ab34c6aac123f8dd4ec8a44fb88df0ec45ae",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004000000000000000000000000000000000000000000000000000000014ebc9078ad8ad07562cd41b374827192aa88ce3c718a014405eed475",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "609042ac307c7d75ee58690d36d1f0ba2cb70f1a77ca43bc7bb70067",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004000000000000000000000000000000000000000000000000000000034f735bbff1a54db7995b03c4e43c17bc3e0f30bda4b2eaf85189615f",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "9d5cff406488bae680f1747d8f5ef070f3a7d451205a1ba9a6cd19fc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004000000000000000000000000ffffffffffffffffffffffffffffffff541d4608f6b28dcc77f02d94b1e25428a22e64fa9b3354beed97af99",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "a55b6ca4b1e135cf1df413a50861917b3d10ffef98a29a874ba9563f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000400000000000000ffffffffffffff00000000000001000000000000004946136fcdd34a5225b09a844d9f482e56a13c46b4ef294e9c049f5b",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "9240e268b133e25b39b36cb7bc9e91a535ce622b48d3b0701d31b2c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000400000000ffffffffffffffff0000000000000000ffffffffffffffff4bdc280b52c98b4bd52bfd4fd2676a97610c4946a66abef9bad0adaa",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "b552615bd4ea7eef4fef3e39aa4fc511d8cbaf40da099e47a611e512",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0001000060916626da518ee8f6bad287e697307084e191ca79398148141e57db",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "5701c9c1c1e59e93a0e57addf676c0d7646ff8407de630e5ec7255cc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00040003fffffff00000003fffffff00000003fffffff0000000400000005b5f99e5ee14baa1c4fa21adf0a6557416c603f933a592dd8dd16d66",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "07c0ae0f2e52e4657fcd5dcf95c5d925b0534da4d6a113e1406580ad",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000401fffffffc00000007fffffff00000001fffffffc00000007fffffff572544766fb80fb67365c9292c5f70bc285388d705155b361eee3a31",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "2d4f54d23c12ee51456f8047bc9c9bf3829192beef85bc6160029915",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000430975f626ebd46b09e413513a897f6b74de5707bbbeb7a3d8c60d0b95fb0ba1f08e4e15dfe79c1b2f6614b9df6bbdd57112f52ada01d4f3e",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "466d58ed8630d222335899a419deb03b9f3ddacb314f1ea8ad0ce2c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004373bbcf4231b53083d36adb3f56485603b19b4b77251abd9b8683c1230c5f383bea0bf35359a47ebd97417b93e24f3d2e78badd6561893aa",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "c0c682a0745b197dcedf8362decf70c0b5135e16c4f7c63b10468501",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000441478d4c207e3fe1aef7fbcc34223f39b86f634d978921ecb40a51361e9f6a7174b801cedaa4d4bcd772a2884d0a2bd27356295c88573203",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "72e9c06decee8133bb05c483c97a5144351d3a7fde2fc88be6eefd7d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00045394eaa3dbc30feac5eb7d88e69cf068315ccb6dedf787dbf933f823661267e8aefb70da15181fbf7390e72a4680b78883bea3a09087ac50",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "42e46a0df978b3362a4e546ea65f889f101b4e0270cb99b5ed046554",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00047ffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff65d425acdceb1b04862ea9df634fcad6f1af3b70ca0000015b943550",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "4d51293480c1208a093504c4c96a4c33466c918d300a8566e69d4afb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00047fff0000003ffffff0000003ffffff0000003ffffff000000400000002ab72fec57251d40ab8f358a291933878b14635671f9e0a8088dc73",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "7bedf280c9880edf26fe8dbd7afa356a54a67a93a2bf7043d2f497ee",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00047ffff0000007fffffe000000ffffffc000001ffffff80000040000011f4ecfad07f9a9656935f536a8b06e0db0acf5d54a939436ea844480",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "c56360d832e7d3854f60e0f3d362e58eb8026e27b6161fb2217ce57c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00047fffffff00000000ffffffff00000000ffffffff00000001000000003532d972042e05e13fe9d8f44800502161c9c5ffa30f5caf151d600d",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "5a0e6ab7b41c61b1cb098449c707f74f55548b92c78af27d3f33c084",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00047fffffffffffffffffffffffffffffffffffffffffffffffffffffff515853ec16a985fbde8da662e47299e86ee30ad464acb849f5132922",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "b4e21f2403d826439e4d94985cebbc724a85a3e405aeb8f610892ec3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe51bd78396f681cbf535b3951d0b7edf91abd3b10e1cb5cdeb7ba8f9a",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "92d2a63b7788e0d704ecda5dc59321dc30264445763da792f7035832",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "3",
+          "shared" : "0c52cf1e5e3f3da21b6040644e0e9eeca2e020f5872c430cccef8b98",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "ba92ad99f14a0ee915aecf776c4fc5fdecbbc8fd8e13a7610a44d2b9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "1000000000000000000000000000000000000000000000000000000",
+          "shared" : "2b8dfc433327f665f04f2929084412000f1b2249f98b277784b334dd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "b70058644ff94dea13a4f3fea5bb80579152095ba9d3cf637f937737",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "080000000000000000000000000000000000000000000000000000000",
+          "shared" : "27bdac60e05ba7ac0f904050247e653c896bafd45b50d0938589718a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4a6ddebca3a5a7939f",
+          "shared" : "00b6b04347120ddc5228530ef7075824fbb745945edd75e73f637a40",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6dcebca3a5a7939f",
+          "shared" : "d5b319d0f3143095c6bd1aa880c9df6a492caa6d6d275eb104a7aba3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6dd6bca3a5a7939f",
+          "shared" : "a0e1f7a142aafb0856616d46b5f76c2244010c9d46cec07ab33bb4a8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6ddebca2a5a7939f",
+          "shared" : "6f1baf2ed42e35d71b705f5dbfb7f51a8ab661be91d8b2614769fa01",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a792dd",
+          "shared" : "1be0d59d1f0f3a743ae19c5246099391098f71444223831e16cfa0c5",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 49,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7935d",
+          "shared" : "7e00a9267243cea4ba7617860b6fcf404e0357d1202d8c85dc5e07d3",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 50,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939c",
+          "shared" : "0c52cf1e5e3f3da21b6040644e0e9eeca2e020f5872c430cccef8b98",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939d",
+          "shared" : "aac6a805f4ce1b6dcc13ec4ed16a889dc4d708f7f6f1e23471338324",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 52,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000400000000000000000000000000000000000000000000000000000000d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000400000000000000000000000000000000000000000000000000000000d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00040000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00040000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000400000000000000000000000000000000000000000000000000000001d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000400000000000000000000000000000000000000000000000000000001d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe00000000000000000000000000000000000000000000000000000000",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe00000000000000000000000000000000000000000000000000000001",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fed7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fed7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff00000000000000000000000000000000000000000000000000000000",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff00000000000000000000000000000000000000000000000000000001",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ffd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ffd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "",
+          "public" : "3019301406072a8648ce3d020106092b2403030208010105030100",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "public point not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b3",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 70,
+          "comment" : "public point = (0,0)",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 71,
+          "comment" : "order = -22721622932454352787552537995910923612567546342330757191396560966559",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd021dff283ecb55d9bc9979d5e7cfda8a2f04672ee943b49221435c5a586c61020101033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 72,
+          "comment" : "order = 0",
+          "public" : "3081f73081b806072a8648ce3d02013081ac020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd020100020101033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 73,
+          "comment" : "order = 1",
+          "public" : "3081f73081b806072a8648ce3d02013081ac020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd020101020101033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 74,
+          "comment" : "order = 5290290092223871682666367384584369978999613398297400491171",
+          "public" : "3082010f3081d006072a8648ce3d02013081c4020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd021900d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3020101033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 75,
+          "comment" : "generator = (0,0)",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020101033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 76,
+          "comment" : "generator not on curve",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cf021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020101033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 77,
+          "comment" : "cofactor = -1",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f0201ff033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 78,
+          "comment" : "cofactor = 0",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020100033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 79,
+          "comment" : "cofactor = 2",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020102033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 80,
+          "comment" : "cofactor = 22721622932454352787552537995910923612567546342330757191396560966559",
+          "public" : "3082012f3081f006072a8648ce3d02013081e4020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 81,
+          "comment" : "cofactor = None",
+          "public" : "308201103081d106072a8648ce3d02013081c5020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 82,
+          "comment" : "modified prime",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00b352e92e2b56ca58f5e37acdc34af65ec6145e27c14bce42bef26235303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b04390400000000000000000023f905836e050000000000000000000000024058a847e339e15fdfa24f6f1876ce8b7a763a02e23cc17016e2c89c20021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020101033a000400000000000000000023f905836e050000000000000000000000024058a847e339e15fdfa24f6f1876ce8b7a763a02e23cc17016e2c89c20",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "74aa41dd243d700a0e5fd27262a98927bad607b8a5f43f9994a5540f",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 83,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 84,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 85,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 86,
+          "comment" : "a = 0",
+          "public" : "3081f83081b906072a8648ce3d02013081ad020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff3021040100041c7ca82b1a7918992ef42c3deef04c4862d9e15b11e4c036e5c7389c94043904a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020101033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 87,
+          "comment" : "public key of order 3",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041cccd6976766e00c75710242952703e499570da6b05ebe3b5993ec3342041cd2de26b2487026e61c18d0e7bc3bc2a4f7e5615f16c399dd2386f0ca043904d1bd2e45c80e5df8e76c9075ca900df7326f5f560330ef332075c0b6b908103ece9a2d2802658535a4257e429cab9ab273d11b73b9ed7d3f021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020101033a0004d1bd2e45c80e5df8e76c9075ca900df7326f5f560330ef332075c0b61eb9246b57a9395e27b2aaefd1ac594513f36ca524096e81c4db43c0",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "114e8af91f219c19a1bc89d8b529f4f27249d31d893d7d7fd0d0b75a",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 88,
+          "comment" : "public key on isomorphic curve brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004002718942d4d3f883dffbdbea18a5b9af73ac85e648076b2c0b333de4cc8c1d9c6127ab6880b903ac44e50730c5ce1d4b52b3b02689c7f0b",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "IsomorphicPublicKey",
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 89,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004992f4a20b0e54d674737b79da8e31ca6c6b3f86d5fed22a8861cfc1a3a57f7a9592ec7b70afa981399d30b9cc7f7dd31b6200f33a7d4b696",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000415cc8782ffaca34a954d055b906afdfffe1e3e2c08202cab9f2b31a18e6545cb52509e9a3ce64208d2cae9af9f366bc0053a210ef117376a4df1c43d54944f90",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200044d5a019d890fb4a512d6e84c1738ce2ec66b942b17f28bba75341a6dda2ae2acf94ff30bad8205d013382bec105ce2a2287482fb50a9e273d934d5302a74845c21f75c493deaf571ee4df5619d7bc77638a530bebd6bcacf31bd550241b9b81e",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004009cccaf2f3737187608ee4cd4bca434909fa84976e95bbf7e7517c07739625f5b2d52431c7e744930daac43a8997048ac82d082d37161a3b2a0c4d238d9140d6cf90159320fff6a710b506881b3b772747678dfd73bf7e870b516039c6008d44491e23789b57ad0c43b3fd27565ed703019aa036b60ff84ac866b653e368b47374c557f",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000422ae2126ae12a38cc771c1c8576a9b983aadcdd65f48f9d201192a488b0ff4a1d6d14ad981aac3fcfa2156b6340012197db2a4f6b6f7324ac8a7c4015861a1eb",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000467de48ceec36eccd05eb47bf815b784a51723667fe1008e700cd197cf3d50fc577444217f2a1976fb3faf6db0d08e8c6d645785ab66f3e5686c5572093bb6646",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044ece661f5ba97078659744dde9c8b2ad87ddf952fa76fa31ad3d04ee898aff363690885479efc69d0ddd21a35e0de809b95a183944e43c9653450ee4a03d5c3b714476482f0a84248b14efada7b6a5d9",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200047aeb413f2efd160ecca59106870bd37ebaaf5e3ff576a6b5125de002dc3031f6000889ec211d8f40ee4c0a085b6011868319cd075c7a5d6dbf24a24eec40ed34ff03618f5548fc3a10d06f168a190723632e5d7979261f048e7da8e8dd564d2e",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000496f2336f70fc7b831650e40834c0a425cd343b98ddb15d25c849f5951addcdd12dc956ddd6f90bb8ac29e185bcc2098974016dd5e760024bcba4f35adee681fd158c98fc462b2538595157538b299ac638ba6709d968a0e37a4ede0939ba6c1c54675c49c9f0d23c1576fd2c89727f7e50e63406d47612a0c5dc20f7688c1fa5",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000474ec4011cf976c7151f8ccaa8b753b34c08e31cabf3efcc5bb997cd262c3273750abfcb8f76bc785c056a924e760d3d155bc5a7281a5b345",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200040b42aeb62fc7e1295f9ce8f5bc5a66aecc4de289f73d05b672e7dd3ca85f34785e2e11f7cb6c7e4b48d458c2e2a613a81af11334ebd2627b0666f0d3628edbaa",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a0352000472e9530f37de4b1d19d53789b02a5bda6e2124f71c58e8cd0e080047f0ca66aa69d4ff2e31b14901746487c71dfffb8a1368e45a56f482fcb5c635a80a1ad2ef56573ffd5fad242c823516eac42f1c7c",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c0362000427cd77274564e4cc0b8284eaac5373fe2cbc731d95c01a781a6b6c4c94983a88df69f47cfe38cc04895673b56a4739377cac72600ac72743a72c025fbbc2c20e7b82474dcc3e98ba671fcb10e8aaff3d4791309f7a5d36d0b68c2d0fb703cced",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e038182000466d53b70bcc33f779eddc473774f0a01f762f88df36199b80ef23123551bfe411a639600466da455b77317aa2f43d130258e7a1e86cd65e19a7e684c61896bcb40a0996fb5a897341f7c53a3486fb0aaf9e3281d31d366929eb608b5ed9e13693384dccb9f51f73a2d195949f1453e063e90287f5cb478322c5f03e9a05ab538",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "invalid public key",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010105031e0002cfa2455a3fc3491d24291de3588e0eb46063c04430d7975ba71df01d",
+          "private" : "545f59601297fcc8d734f43bebc2d73866b16a3adb885211ae1a608f",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 104,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010105031e00039f98bba2a331e3a334c5ea7f8937a85580e557b353e06f3ed8dcd195",
+          "private" : "7abde5e6ce42081afc6194930710bfd108b91a7fc34d2caf52cdc54f",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 105,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010105031e00029f98bba2a331e3a334c5ea7f8937a85580e557b353e06f3ed8dcd195",
+          "private" : "7abde5e6ce42081afc6194930710bfd108b91a7fc34d2caf52cdc550",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 106,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010105031e0002128849d9e5731a42465e35aebd7b6db3f24e1366f0ade29e821e1c71",
+          "private" : "720c41bbb15e5247ed81e269b421771e6be5134b11f3542ee8059176",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 107,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010105031e0003abefd2cfd3faf77666c7e1ad81414d6336fea6a6b45179eccffcc95a",
+          "private" : "72adf44f808419549de69d89d37b7508ff528c439580e5d0031e842b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 108,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010105031e0002abefd2cfd3faf77666c7e1ad81414d6336fea6a6b45179eccffcc95a",
+          "private" : "72adf44f808419549de69d89d37b7508ff528c439580e5d0031e842c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 109,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010105031e0003128849d9e5731a42465e35aebd7b6db3f24e1366f0ade29e821e1c71",
+          "private" : "720c41bbb15e5247ed81e269b421771e6be5134b11f3542ee8059175",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 110,
+          "comment" : "long form encoding of length",
+          "public" : "308152301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 111,
+          "comment" : "long form encoding of length",
+          "public" : "305330811406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 112,
+          "comment" : "long form encoding of length",
+          "public" : "305330150681072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 113,
+          "comment" : "long form encoding of length",
+          "public" : "3053301506072a8648ce3d02010681092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 114,
+          "comment" : "long form encoding of length",
+          "public" : "3053301406072a8648ce3d020106092b240303020801010503813a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 115,
+          "comment" : "length contains leading 0",
+          "public" : "30820052301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 116,
+          "comment" : "length contains leading 0",
+          "public" : "30543082001406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 117,
+          "comment" : "length contains leading 0",
+          "public" : "30543016068200072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 118,
+          "comment" : "length contains leading 0",
+          "public" : "3054301606072a8648ce3d0201068200092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 119,
+          "comment" : "length contains leading 0",
+          "public" : "3054301406072a8648ce3d020106092b24030302080101050382003a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 120,
+          "comment" : "wrong length",
+          "public" : "3053301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 121,
+          "comment" : "wrong length",
+          "public" : "3051301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 122,
+          "comment" : "wrong length",
+          "public" : "3052301506072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 123,
+          "comment" : "wrong length",
+          "public" : "3052301306072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 124,
+          "comment" : "wrong length",
+          "public" : "3052301406082a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 125,
+          "comment" : "wrong length",
+          "public" : "3052301406062a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 126,
+          "comment" : "wrong length",
+          "public" : "3052301406072a8648ce3d0201060a2b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 127,
+          "comment" : "wrong length",
+          "public" : "3052301406072a8648ce3d020106082b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 128,
+          "comment" : "wrong length",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033b0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 129,
+          "comment" : "wrong length",
+          "public" : "3052301406072a8648ce3d020106092b240303020801010503390004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 130,
+          "comment" : "uint32 overflow in length",
+          "public" : "30850100000052301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 131,
+          "comment" : "uint32 overflow in length",
+          "public" : "30573085010000001406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 132,
+          "comment" : "uint32 overflow in length",
+          "public" : "30573019068501000000072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 133,
+          "comment" : "uint32 overflow in length",
+          "public" : "3057301906072a8648ce3d0201068501000000092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 134,
+          "comment" : "uint32 overflow in length",
+          "public" : "3057301406072a8648ce3d020106092b24030302080101050385010000003a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 135,
+          "comment" : "uint64 overflow in length",
+          "public" : "3089010000000000000052301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 136,
+          "comment" : "uint64 overflow in length",
+          "public" : "305b308901000000000000001406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 137,
+          "comment" : "uint64 overflow in length",
+          "public" : "305b301d06890100000000000000072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 138,
+          "comment" : "uint64 overflow in length",
+          "public" : "305b301d06072a8648ce3d020106890100000000000000092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 139,
+          "comment" : "uint64 overflow in length",
+          "public" : "305b301406072a8648ce3d020106092b2403030208010105038901000000000000003a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 140,
+          "comment" : "length = 2**31 - 1",
+          "public" : "30847fffffff301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 141,
+          "comment" : "length = 2**31 - 1",
+          "public" : "305630847fffffff06072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 142,
+          "comment" : "length = 2**31 - 1",
+          "public" : "3056301806847fffffff2a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 143,
+          "comment" : "length = 2**31 - 1",
+          "public" : "3056301806072a8648ce3d020106847fffffff2b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 144,
+          "comment" : "length = 2**31 - 1",
+          "public" : "3056301406072a8648ce3d020106092b240303020801010503847fffffff0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "length = 2**32 - 1",
+          "public" : "3084ffffffff301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "length = 2**32 - 1",
+          "public" : "30563084ffffffff06072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "length = 2**32 - 1",
+          "public" : "305630180684ffffffff2a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "length = 2**32 - 1",
+          "public" : "3056301806072a8648ce3d02010684ffffffff2b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "length = 2**32 - 1",
+          "public" : "3056301406072a8648ce3d020106092b24030302080101050384ffffffff0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "length = 2**40 - 1",
+          "public" : "3085ffffffffff301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "length = 2**40 - 1",
+          "public" : "30573085ffffffffff06072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "length = 2**40 - 1",
+          "public" : "305730190685ffffffffff2a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "length = 2**40 - 1",
+          "public" : "3057301906072a8648ce3d02010685ffffffffff2b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "length = 2**40 - 1",
+          "public" : "3057301406072a8648ce3d020106092b24030302080101050385ffffffffff0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3088ffffffffffffffff301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "length = 2**64 - 1",
+          "public" : "305a3088ffffffffffffffff06072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "length = 2**64 - 1",
+          "public" : "305a301c0688ffffffffffffffff2a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "length = 2**64 - 1",
+          "public" : "305a301c06072a8648ce3d02010688ffffffffffffffff2b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "length = 2**64 - 1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101050388ffffffffffffffff0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "incorrect length",
+          "public" : "30ff301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "incorrect length",
+          "public" : "305230ff06072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "incorrect length",
+          "public" : "3052301406ff2a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "incorrect length",
+          "public" : "3052301406072a8648ce3d020106ff2b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "incorrect length",
+          "public" : "3052301406072a8648ce3d020106092b240303020801010503ff0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "indefinite length without termination",
+          "public" : "3080301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "indefinite length without termination",
+          "public" : "3052308006072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "indefinite length without termination",
+          "public" : "3052301406802a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "indefinite length without termination",
+          "public" : "3052301406072a8648ce3d020106802b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "indefinite length without termination",
+          "public" : "3052301406072a8648ce3d020106092b240303020801010503800004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "removing sequence",
+          "public" : "",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "removing sequence",
+          "public" : "303c033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "lonely sequence tag",
+          "public" : "30",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "lonely sequence tag",
+          "public" : "303d30033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "appending 0's to sequence",
+          "public" : "3054301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b710000",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "appending 0's to sequence",
+          "public" : "3054301606072a8648ce3d020106092b24030302080101050000033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "prepending 0's to sequence",
+          "public" : "30540000301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "prepending 0's to sequence",
+          "public" : "30543016000006072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "appending unused 0's to sequence",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b710000",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "appending unused 0's to sequence",
+          "public" : "3054301406072a8648ce3d020106092b24030302080101050000033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "appending null value to sequence",
+          "public" : "3054301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b710500",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "appending null value to sequence",
+          "public" : "3054301606072a8648ce3d020106092b24030302080101050500033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "including garbage",
+          "public" : "30574981773052301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "including garbage",
+          "public" : "305625003052301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "including garbage",
+          "public" : "30543052301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b710004deadbeef",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "including garbage",
+          "public" : "30573019498177301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "including garbage",
+          "public" : "305630182500301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "including garbage",
+          "public" : "305a3016301406072a8648ce3d020106092b24030302080101050004deadbeef033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "including garbage",
+          "public" : "30573019260c49817706072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "including garbage",
+          "public" : "30563018260b250006072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "including garbage",
+          "public" : "305a301c260906072a8648ce3d02010004deadbeef06092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "including garbage",
+          "public" : "3057301906072a8648ce3d0201260e49817706092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "including garbage",
+          "public" : "3056301806072a8648ce3d0201260d250006092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "including garbage",
+          "public" : "305a301c06072a8648ce3d0201260b06092b24030302080101050004deadbeef033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "including garbage",
+          "public" : "3057301406072a8648ce3d020106092b2403030208010105233f498177033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "including garbage",
+          "public" : "3056301406072a8648ce3d020106092b2403030208010105233e2500033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "including garbage",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010105233c033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b710004deadbeef",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "including undefined tags",
+          "public" : "305aaa00bb00cd003052301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "including undefined tags",
+          "public" : "3058aa02aabb3052301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "including undefined tags",
+          "public" : "305a301caa00bb00cd00301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "including undefined tags",
+          "public" : "3058301aaa02aabb301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "including undefined tags",
+          "public" : "305a301c260faa00bb00cd0006072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "including undefined tags",
+          "public" : "3058301a260daa02aabb06072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "including undefined tags",
+          "public" : "305a301c06072a8648ce3d02012611aa00bb00cd0006092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "including undefined tags",
+          "public" : "3058301a06072a8648ce3d0201260faa02aabb06092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "including undefined tags",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101052342aa00bb00cd00033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "including undefined tags",
+          "public" : "3058301406072a8648ce3d020106092b24030302080101052340aa02aabb033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "truncated length of sequence",
+          "public" : "3081",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "truncated length of sequence",
+          "public" : "303e3081033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Replacing sequence with NULL",
+          "public" : "0500",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Replacing sequence with NULL",
+          "public" : "303e0500033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "changing tag value of sequence",
+          "public" : "2e52301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "changing tag value of sequence",
+          "public" : "2f52301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "changing tag value of sequence",
+          "public" : "3152301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "changing tag value of sequence",
+          "public" : "3252301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "changing tag value of sequence",
+          "public" : "ff52301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "changing tag value of sequence",
+          "public" : "30522e1406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 217,
+          "comment" : "changing tag value of sequence",
+          "public" : "30522f1406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 218,
+          "comment" : "changing tag value of sequence",
+          "public" : "3052311406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 219,
+          "comment" : "changing tag value of sequence",
+          "public" : "3052321406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 220,
+          "comment" : "changing tag value of sequence",
+          "public" : "3052ff1406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 221,
+          "comment" : "dropping value of sequence",
+          "public" : "3000",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 222,
+          "comment" : "dropping value of sequence",
+          "public" : "303e3000033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 223,
+          "comment" : "truncate sequence",
+          "public" : "3051301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 224,
+          "comment" : "truncate sequence",
+          "public" : "30511406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 225,
+          "comment" : "truncate sequence",
+          "public" : "3051301306072a8648ce3d020106092b24030302080101033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 226,
+          "comment" : "truncate sequence",
+          "public" : "30513013072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 227,
+          "comment" : "indefinite length",
+          "public" : "3080301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b710000",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 228,
+          "comment" : "indefinite length",
+          "public" : "3054308006072a8648ce3d020106092b24030302080101050000033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 229,
+          "comment" : "indefinite length with truncated delimiter",
+          "public" : "3080301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b7100",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 230,
+          "comment" : "indefinite length with truncated delimiter",
+          "public" : "3053308006072a8648ce3d020106092b240303020801010500033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 231,
+          "comment" : "indefinite length with additional element",
+          "public" : "3080301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b7105000000",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 232,
+          "comment" : "indefinite length with additional element",
+          "public" : "3056308006072a8648ce3d020106092b240303020801010505000000033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 233,
+          "comment" : "indefinite length with truncated element",
+          "public" : "3080301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71060811220000",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 234,
+          "comment" : "indefinite length with truncated element",
+          "public" : "3058308006072a8648ce3d020106092b2403030208010105060811220000033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 235,
+          "comment" : "indefinite length with garbage",
+          "public" : "3080301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b710000fe02beef",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 236,
+          "comment" : "indefinite length with garbage",
+          "public" : "3058308006072a8648ce3d020106092b24030302080101050000fe02beef033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 237,
+          "comment" : "indefinite length with nonempty EOC",
+          "public" : "3080301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b710002beef",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 238,
+          "comment" : "indefinite length with nonempty EOC",
+          "public" : "3056308006072a8648ce3d020106092b24030302080101050002beef033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 239,
+          "comment" : "prepend empty sequence",
+          "public" : "30543000301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 240,
+          "comment" : "prepend empty sequence",
+          "public" : "30543016300006072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 241,
+          "comment" : "append empty sequence",
+          "public" : "3054301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b713000",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 242,
+          "comment" : "append empty sequence",
+          "public" : "3054301606072a8648ce3d020106092b24030302080101053000033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 243,
+          "comment" : "sequence of sequence",
+          "public" : "30543052301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 244,
+          "comment" : "sequence of sequence",
+          "public" : "30543016301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 245,
+          "comment" : "truncated sequence",
+          "public" : "3016301406072a8648ce3d020106092b2403030208010105",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 246,
+          "comment" : "truncated sequence",
+          "public" : "3047300906072a8648ce3d0201033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 247,
+          "comment" : "repeat element in sequence",
+          "public" : "30818e301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 248,
+          "comment" : "repeat element in sequence",
+          "public" : "305d301f06072a8648ce3d020106092b240303020801010506092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 249,
+          "comment" : "removing oid",
+          "public" : "3049300b06092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 250,
+          "comment" : "lonely oid tag",
+          "public" : "304a300c0606092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 251,
+          "comment" : "lonely oid tag",
+          "public" : "3048300a06072a8648ce3d020106033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 252,
+          "comment" : "appending 0's to oid",
+          "public" : "3054301606092a8648ce3d0201000006092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 253,
+          "comment" : "appending 0's to oid",
+          "public" : "3054301606072a8648ce3d0201060b2b24030302080101050000033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 254,
+          "comment" : "prepending 0's to oid",
+          "public" : "30543016060900002a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 255,
+          "comment" : "prepending 0's to oid",
+          "public" : "3054301606072a8648ce3d0201060b00002b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 256,
+          "comment" : "appending unused 0's to oid",
+          "public" : "3054301606072a8648ce3d0201000006092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 257,
+          "comment" : "appending null value to oid",
+          "public" : "3054301606092a8648ce3d0201050006092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 258,
+          "comment" : "appending null value to oid",
+          "public" : "3054301606072a8648ce3d0201060b2b24030302080101050500033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 259,
+          "comment" : "truncated length of oid",
+          "public" : "304b300d068106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 260,
+          "comment" : "truncated length of oid",
+          "public" : "3049300b06072a8648ce3d02010681033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 261,
+          "comment" : "Replacing oid with NULL",
+          "public" : "304b300d050006092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 262,
+          "comment" : "Replacing oid with NULL",
+          "public" : "3049300b06072a8648ce3d02010500033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 263,
+          "comment" : "changing tag value of oid",
+          "public" : "3052301404072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 264,
+          "comment" : "changing tag value of oid",
+          "public" : "3052301405072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 265,
+          "comment" : "changing tag value of oid",
+          "public" : "3052301407072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 266,
+          "comment" : "changing tag value of oid",
+          "public" : "3052301408072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 267,
+          "comment" : "changing tag value of oid",
+          "public" : "30523014ff072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 268,
+          "comment" : "changing tag value of oid",
+          "public" : "3052301406072a8648ce3d020104092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 269,
+          "comment" : "changing tag value of oid",
+          "public" : "3052301406072a8648ce3d020105092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 270,
+          "comment" : "changing tag value of oid",
+          "public" : "3052301406072a8648ce3d020107092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 271,
+          "comment" : "changing tag value of oid",
+          "public" : "3052301406072a8648ce3d020108092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 272,
+          "comment" : "changing tag value of oid",
+          "public" : "3052301406072a8648ce3d0201ff092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 273,
+          "comment" : "dropping value of oid",
+          "public" : "304b300d060006092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 274,
+          "comment" : "dropping value of oid",
+          "public" : "3049300b06072a8648ce3d02010600033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 275,
+          "comment" : "modify first byte of oid",
+          "public" : "305230140607288648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 276,
+          "comment" : "modify first byte of oid",
+          "public" : "3052301406072a8648ce3d02010609292403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 277,
+          "comment" : "modify last byte of oid",
+          "public" : "3052301406072a8648ce3d028106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 278,
+          "comment" : "modify last byte of oid",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010185033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 279,
+          "comment" : "truncate oid",
+          "public" : "3051301306062a8648ce3d0206092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 280,
+          "comment" : "truncate oid",
+          "public" : "3051301306068648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 281,
+          "comment" : "truncate oid",
+          "public" : "3051301306072a8648ce3d020106082b24030302080101033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 282,
+          "comment" : "truncate oid",
+          "public" : "3051301306072a8648ce3d020106082403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 283,
+          "comment" : "wrong oid",
+          "public" : "30553017060a3262306530333032316106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 284,
+          "comment" : "wrong oid",
+          "public" : "305d301f061236303836343830313635303330343032303106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 285,
+          "comment" : "wrong oid",
+          "public" : "3053301506072a8648ce3d0201060a32623065303330323161033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 286,
+          "comment" : "wrong oid",
+          "public" : "305b301d06072a8648ce3d02010612363038363438303136353033303430323031033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 287,
+          "comment" : "longer oid",
+          "public" : "305b301d06103261383634386365336430323031303106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 288,
+          "comment" : "longer oid",
+          "public" : "305d301f06072a8648ce3d020106143262323430333033303230383031303130353031033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 289,
+          "comment" : "oid with modified node",
+          "public" : "3059301b060e326138363438636533643032313106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 290,
+          "comment" : "oid with modified node",
+          "public" : "3061302306163261383634386365336430323838383038303830303106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 291,
+          "comment" : "oid with modified node",
+          "public" : "305b301d06072a8648ce3d02010612326232343033303330323038303130313135033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 292,
+          "comment" : "oid with modified node",
+          "public" : "3063302506072a8648ce3d0201061a3262323430333033303230383031303138383830383038303035033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 293,
+          "comment" : "large integer in oid",
+          "public" : "306b302d0620326138363438636533643032383238303830383038303830383038303830303106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 294,
+          "comment" : "large integer in oid",
+          "public" : "306d302f06072a8648ce3d02010624326232343033303330323038303130313832383038303830383038303830383038303035033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 295,
+          "comment" : "oid with invalid node",
+          "public" : "305c301e0611326138363438636533643032303165303306092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 296,
+          "comment" : "oid with invalid node",
+          "public" : "3053301506082a808648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 297,
+          "comment" : "oid with invalid node",
+          "public" : "305e302006072a8648ce3d02010615326232343033303330323038303130313035653033033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 298,
+          "comment" : "oid with invalid node",
+          "public" : "3053301506072a8648ce3d0201060a2b802403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 299,
+          "comment" : "lonely bit string tag",
+          "public" : "3017301406072a8648ce3d020106092b240303020801010503",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 300,
+          "comment" : "appending 0's to bit string",
+          "public" : "3054301406072a8648ce3d020106092b2403030208010105033c0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b710000",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 301,
+          "comment" : "prepending 0's to bit string",
+          "public" : "3054301406072a8648ce3d020106092b2403030208010105033c00000004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 302,
+          "comment" : "appending null value to bit string",
+          "public" : "3054301406072a8648ce3d020106092b2403030208010105033c0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b710500",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 303,
+          "comment" : "truncated length of bit string",
+          "public" : "3018301406072a8648ce3d020106092b24030302080101050381",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 304,
+          "comment" : "Replacing bit string with NULL",
+          "public" : "3018301406072a8648ce3d020106092b24030302080101050500",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 305,
+          "comment" : "changing tag value of bit string",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105013a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 306,
+          "comment" : "changing tag value of bit string",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105023a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 307,
+          "comment" : "changing tag value of bit string",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105043a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 308,
+          "comment" : "changing tag value of bit string",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105053a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 309,
+          "comment" : "changing tag value of bit string",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105ff3a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 310,
+          "comment" : "dropping value of bit string",
+          "public" : "3018301406072a8648ce3d020106092b24030302080101050300",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 311,
+          "comment" : "modify first byte of bit string",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0204d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 312,
+          "comment" : "modify last byte of bit string",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27bf1",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 313,
+          "comment" : "truncate bit string",
+          "public" : "3051301406072a8648ce3d020106092b240303020801010503390004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 314,
+          "comment" : "truncate bit string",
+          "public" : "3051301406072a8648ce3d020106092b2403030208010105033904d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 315,
+          "comment" : "declaring bits as unused in a bit-string",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0104d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 316,
+          "comment" : "unused bits in a bit-string",
+          "public" : "3056301406072a8648ce3d020106092b2403030208010105033e2004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b7101020304",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 317,
+          "comment" : "unused bits in empty bit-string",
+          "public" : "3019301406072a8648ce3d020106092b2403030208010105030103",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 318,
+          "comment" : "128 unused bits",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a8004d7ba2df581b454d83c6bb8650fc3a1f13521881fa2ea52061d9e3af54e820e75fb8622183b699d868789bf3682889d7021798a3e4ba27b71",
+          "private" : "4dee4d6c6c9a8bf8b5e3c2fc001fe4918da586aaceb2a1ee78a293c4",
+          "shared" : "cd46b85ec2e2f06ecce31fefc71aa29256476b2ef0dd04ac0eaed597",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdh_brainpoolP256r1_test.json b/third_party/wycheproof/testvectors/ecdh_brainpoolP256r1_test.json
new file mode 100644
index 0000000..3b23087
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdh_brainpoolP256r1_test.json
@@ -0,0 +1,3522 @@
+{
+  "algorithm" : "ECDH",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "AddSubChain" : "The private key has a special value. Implementations using addition subtraction chains for the point multiplication may get the point at infinity as an intermediate result. See CVE_2017_10176",
+    "CompressedPoint" : "The point in the public key is compressed. Not every library supports points in compressed format.",
+    "GroupIsomorphism" : "Some EC groups have isomorphic groups that allow an efficient implementation. This is a test vector that contains values that are edge cases on such an isomorphic group.",
+    "InvalidAsn" : "The public key in this test uses an invalid ASN encoding. Some cases where the ASN parser is not strictly checking the ASN format are benign as long as the ECDH computation still returns the correct shared value.",
+    "InvalidPublic" : "The public key has been modified and is invalid. An implementation should always check whether the public key is valid and on the same curve as the private key. The test vector includes the shared secret computed with the original public key if the public point is on the curve of the private key. Generating a shared secret other than the one with the original key likely indicates that the bug is exploitable.",
+    "IsomorphicPublicKey" : "The public key in this test vector uses an isomorphic curve. Such isomorphisms are sometimes used to speed up implementations. For example the brainpool curves are using this.",
+    "ModifiedPrime" : "The modulus of the public key has been modified. The public point of the public key has been chosen so that it is both a point on both the curve of the modified public key and the private key.",
+    "UnnamedCurve" : "The public key does not use a named curve. RFC 3279 allows to encode such curves by explicitly encoding, the parameters of the curve equation, modulus, generator, order and cofactor. However, many crypto libraries only support named curves. Modifying some of the EC parameters and encoding the corresponding public key as an unnamed curve is a potential attack vector.",
+    "UnusedParam" : "A parameter that is typically not used for ECDH has been modified. Sometimes libraries ignore small differences between public and private key. For example, a library might ignore an incorrect cofactor in the public key. We consider ignoring such changes as acceptable as long as these differences do not change the outcome of the ECDH computation, i.e. as long as the computation is done on the curve from the private key.",
+    "WeakPublicKey" : "The vector contains a weak public key. The curve is not a named curve, the public key point has order 3 and has been chosen to be on the same curve as the private key. This test vector is used to check ECC implementations for missing steps in the verification of the public key.",
+    "WrongOrder" : "The order of the public key has been modified. If this order is used in a cryptographic primitive instead of the correct order then private keys may leak. E.g. ECDHC in BC 1.52 suffered from this."
+  },
+  "numberOfTests" : 331,
+  "header" : [],
+  "testGroups" : [
+    {
+      "curve" : "brainpoolP256r1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "normal case",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200044cee5e1072b30d64f70bf01958e22c044a2127ddd744ce3060c15990ff0fe1148c6ee56559829a5a84dd5c8646ee0c43d0b7c50181f234ec09eba43bc86b169e",
+          "private" : "113db979e07d9c8fdbea5b06a682c0d2ad67170ffcb65d7547d8c442d3ac237",
+          "shared" : "3f00d9af7607fd32809ef7a4a30b396e3da9f465adf20597c9e2046f16a7b1be",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "compressed public key",
+          "public" : "303a301406072a8648ce3d020106092b2403030208010107032200024cee5e1072b30d64f70bf01958e22c044a2127ddd744ce3060c15990ff0fe114",
+          "private" : "113db979e07d9c8fdbea5b06a682c0d2ad67170ffcb65d7547d8c442d3ac237",
+          "shared" : "3f00d9af7607fd32809ef7a4a30b396e3da9f465adf20597c9e2046f16a7b1be",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200041284e50ecda6c7c3a15ae79c318dec591da197fc32b7a046b168774013e54687156d96fe0765ea03404ecf5f6efc74b0792c05c11f9a683b97f5c7ca74f8a8c2",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000498577499d7a42f4dfe44c2757fd9932ec7e45a0d902e0bf1fe4ac09e705eb8e12d9b9a0092c9c92a661e24b2138b6a778324c9db815eb05621c54cd4d4b2e887",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200045760aa78cfb0df84fcc2c442321a5c278fca245aa90a4fcb33ad8bbbe6e847df8b8f102d948a52b3c21f70067e106daf10626113b8ddc08e50fad4df13f90bed",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200040b3e56747ee2a81edc487f7b257afc5886f3d80e9848472a944590eacf71172f5786410b71ce226824cd3f0ef462185b2557c9e8e1f02c654e8423488331b600",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "0000000000000000000000000000000100000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004854a72d5fbeacfc57a5aea2e386e549bab87b8ee313ee6c1f12cf267826940769f1c56486b0ac2dcd96bc018f5f42729cc073c6291bde8c3e7c169329c798142",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a7043cb065916e173837bc1a109526e946b66008398e697b40438a3e0a2b0d9d56c6faa83d8a4c4b9e2a9b4a6917a45aeee61491f4f4e47efebccb71bef8defe",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff0000000100000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000494b231b2189576b84aa5911e80da3074a4d16988041f908e6b6a199c16e1f7ed26fb9184971bc6f71cbced6836b3107bb17061a440abca27e5b44252bf39c6dc",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "000003ffffff0000003ffffff0000003ffffff0000003ffffff0000004000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200047dc0f29a5542c7d67793f52dc1de986bcee45d7571395cab102893aa2a5bf8cf7d4b8443793b137491736b26061ebd705d194405cf108b741cd1c5b42f44f6ab",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004834777212988ed962bc9d57e98f20bcfa34d9c6587381db48e48ce20a1ce961d6985ed4f21bb019791a6f08c36c42924cd72fe653c90882b9747059b0cc1ea17",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "2310a87dfe5fc25d0c0f51f0d379ef19be687bef34795dc2fd3fcc2d1cfdf189",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a67cccc5e7b64889f5a8e5c52cb875258f525754ccb6ae2c75c8b9de821c780c7f38e6d238e55725250fc53f67514a9852ff5dd2ee1acf582254cba7deb72267",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "3367a0bb5a87072418334cead5227aedfc063f1a7340dc1c7c8e576eb4118ebf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200044fe39fe909da0a3e5a05d4f9717661c8f9af24071d711df15de225e98d5edce462aca0b1ffb66a09b769a2c23314d5116fb30b71456ca798370abad10097d453",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7f00000001fffffffc00000007fffffff00000001fffffffc000000080000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000496c13e3b6f626cc2dd89992ec34b39851938a6c6015c1ee4889795dc536c1415330888344ffe63e0d54e4f9365dd209013933a0a84d5e30424f516b87189b835",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000406d3939c4c916da103a5f15438ee2b0863cf18b269d3d1a66ccf684f2fd568cf7235f3bac71d7d0f1eb6db9ef7aff385f020991db678e5124ffb0667745b3e03",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000429f6ba59fbe18c3ed99bc7da638ae419ee7d7853ff6732f5172dea1f085e8fb5071439411bba430d2b8bc8f58c955e94ae167fc9ca06fb262c7c93d710fd62ba",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fffffff00000000000000ffffffffffffff0000000000000100000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000485d4f416552f4e51f92d80b4d6e71c6487c6fb0a106ed48395393d63528e6e782ba4c5228e60191a762dc02ccdaadb63364eee8e5008b9b25e0577f81903cb53",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200043b072da3dee819aba673abc3b1acebff18e4a6a20af8d817af97c2b4a8c5350a68e3bfb1d035fdfdb876b2adf85d9af1ad32e57399ca903a2d3fa4902124d194",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000463e92d05cfcde1179188bff8ba2043beff5a30a1a6b8ec1dfcd8273ce2c330540607392bdd311a313e3ae53196b14480b1967a235ebdbf1827165477884b5be2",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004292175f490fa8aead813bc9b4923233d999ea61e7f1f9d0b0a02f0f64bcd2a72795a299e368fa3b93ba25193147ad35cb013f8bce669086759f70a56d4083ae0",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7ffffffffffffffffffffffffa1c6646ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000415e8d9efabc51033eb4d7ab63b46f2b94d942c1abb9c430eda6079036eaed76e024f0f5436b94b6470ff9365849a86b40c14d5588f3dd5264bcf0ba344d9fbfb",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fffffffffffffffffffffffe966ec89ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000415e8d9efabc51033eb4d7ab63b46f2b94d942c1abb9c430eda6079036eaed76ea7ac48876b355e57cd66772b18e906be622720cb45e84b01d4443c79da94577c",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fffffffffffffffffffffffe966ec89ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200043704a3e3047e3c56e8c0d8c028ee1ce3ceef5ba1008bae069acae0f7df5d0f4e3940cddb1b2ee9a7839fc798a0f52925832b1da398c7dcb11e9faf36720ff60a",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fffffffffffffffffffffffe8e61519ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200040a7f86bbfb3a6010d9a8fe72aa0f0fafecb0bf2c18fc9b2937a7b13faa286be3a093055a187b9e90bbcae8a77bf19fa4dd11bce1bbc0b5d7549653c4e7aaa13b",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "23484789fec2f42fdefb0c4ec656217c4f53074616300f86325958b709e3ffc0",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 25,
+          "comment" : "y-coordinate of the public key is small on brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000462c15670202cd9a0cdf881a0ec622d2b39b5e3e6f2f955301210f15da98acadf99faae96994530ff39dddb09f0ee722d6a6a4cfb51eee6508ca4df05b24606b4",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "3d607b612ed1fb6d2b6ae4fbb7024b9ccc379170c121f49f8fb6185ebf937635",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 26,
+          "comment" : "y-coordinate of the public key is large on brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000462c15670202cd9a0cdf881a0ec622d2b39b5e3e6f2f955301210f15da98acadf1000a94508a978bd04882f86ac951b4503d1a928833739d7936e69176d284cc3",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "3d607b612ed1fb6d2b6ae4fbb7024b9ccc379170c121f49f8fb6185ebf937635",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 27,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200043d88f3a636fa94d06d5fb35314d34c51403b72361931bd3586fec2af98ba62a9973d2da83cfba4eb3c995f2bbf177f5051fff9ddb3862845b70da138628eef60",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "770c84309d95d813415d36b8127143d7c97dc5eecb764049631f1d8e6c6e3ce4",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 28,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004000000000000000000000000000000000000000000000000000000000000000109e0e9e8d98fb89da2a32b2c7618b26bb99b920f02a5e831a142e6c8673110cd",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "599cde22070e96a88658c4a5a83f3723542a402ed506639ff9016fe4a26d4c25",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004000000000000000000000000000000000000000000000000000000000000000226ccfda8234fa9b70316b5ec4da222972b34a970cfe6dd9983a05e2fa746b902",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "4b35a3caa10cd77034e0737e18bc52071f64b8a2e14d7a02df8a36886aa467e5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000400000000000000000000000000000000000000000000000000000000000000031e8d9392fba7ad1f3ed5b5746cd930370a81d7483fe32003e31264829c9fec8d",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "1d1d5a6ee25b5fe41e015f19cb434936323eb24da09bab873e3c25bea7af8749",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004000000000000000000000000000000010000000000000000000000000000000001ef5fa5ab0cebc18b64113eb8c040dd743184e7c8ac68f123f3c3d945585524",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "111fbae46ba6389c5879d02e1863301ffa9e1961d721a57c6d88847154398812",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200040000000000000000ffffffffffffffff0000000000000000ffffffffffffffff2e65afc115d0fe1a86f314629014d6856716a4d9a0114c713051dd700dcc1ade",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "23b36c78c27076e23d6ab56c2e9653d272922c9fc1a176b8b6c2e70ab7c883fb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000400000000ffffffff00000000ffffffff00000000ffffffff000000010000000131625916fc4e157b1cf93f3c80352ba4dbf26effbd87d31a2a808d001081f06a",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "27dffb62a6ec9ffb3d0480c45ba00c748193afcc0879d76b47f8ee356785dee9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004000003ffffff0000003ffffff0000003ffffff0000003ffffff0000004000002330b902c4f6a2486744f36adc6000e116a2cbcb14ff9f47aa36319fef93ad5ea",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "9bffd451ceadc27df88a13829852ddab0b2938952f5c58fdae7dd22248840bb0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff2c6fb3302dd93dc25d2c6792c2ac6f86247c4d39637ee11d9267658017f0055a",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "267a69f4b3945f8d323ff1a526bca566e7ed9806d6a6dc8f4587ab229a5f3ab2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200042310a87dfe5fc25d0c0f51f0d379ef19be687bef34795dc2fd3fcc2d1cfdf1892fb244825651a94d4d93ff90b74130f77483e5699d68a7a43ae693bca85688da",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "4d3d61bf26573a2ec1d9ae6be62d1a30b71aa963660a4ff309557e616742114b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200043367a0bb5a87072418334cead5227aedfc063f1a7340dc1c7c8e576eb4118ebf4648a7b0639656227ba7c4b346354b2465099f8422d1be92f0f45ee23b7e2d1a",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "799c4821e92815b9335e77741a9bca2333053886a3777ae637d02e4420d82a66",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200047f00000001fffffffc00000007fffffff00000001fffffffc0000000800000020cf9ab5899c59216d6d1bc786ddf6221e374cd37a8b745e826c6495bed0a56b0",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "a4a2d3bcc69380396089e719ab8c77e5437ee589e39d98eae7bd17ce5c1d5b03",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200047fff00000003fffffff00000003fffffff00000003fffffff00000003fffffff01a1ad42b3ff22ba6bf3c94b55cfa4d13c6e140d3c44963198f496ebbc50439a",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "3a6ff3c1d490f652f5178a794b8cf825b5044948f6ebda67310c11fec1ad2b53",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200047fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008000369a4e24f010260d7c2560f7dc19c41cde6b5c503b6563678580f0d22c74dda4",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "2d59b895062c13d4e5b5e0b77ef273e94e558e724f6241af5bb11bf23acbf851",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200047fffffff00000000000000ffffffffffffff00000000000001000000000000004677b043dfe54f78c735543b752b3aec043f656e5f22dd6d956cd642e3390881",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "83640be428f7a4f80ae2671799b5ba1881241fd054a7f2dce0254c07531abe40",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff178945df488779235a2637c39a4a85ab707bd56e7c22b9ad41b652560123b6af",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "801e5f5d61c666bc089a4265c40d2a3fee0db20a0f78e329bbf2793330ab0412",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200048000003ffffff0000007fffffe000000ffffffc000001ffffff80000040000000424bbe5b0b8702258d2462a8bda59a343b97c3fb1d4005416802bebd628e7d0",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "a409a85067dd63e5eab3aec3d74cb7f071839247dbf97b6de592988095509d0b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e537613a0346db14d55d1bcc27079b68864ac32885b5bdfc3c9db6f85a35d3df4c39b",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "66d757884634861f28bbe45b502f895233b0ba1c69bf45802f80eac5c837750f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200047ffffffffffffffffffffffffa1c6646ffffffffffffffffffffffffffffffff5407f4a41e7904d3e7a9e6e6d70b093361dc5ea097c3767e1013f5868fffffff",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "94456bf9e33c392315c5bc350a5d48e39fc7a9ff5ea6fe309e24a89292690dc9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200047fffffffffffffffffffffffe966ec89ffffffffffffffffffffffffffffffff000000093b3d1910bada32f99c20977cff951d97072fea058e879c4bfeefd404",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "41e2153f9411102965a2f63f8874aa7db33571466b160ea33e9af6721ce5bbfd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200047fffffffffffffffffffffffe966ec89ffffffffffffffffffffffffffffffffa9fb57d266b190ab838bd7970162f5f56ea6d88ccdf63622918babd1207e7f73",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "41e2153f9411102965a2f63f8874aa7db33571466b160ea33e9af6721ce5bbfd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200047fffffffffffffffffffffffe8e61519ffffffffffffffffffffffffffffffff8a3af7f7a8a00701cfee7f390f84ed21d374623c20e5c822760d9de3b0000000",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "79c4bdada76d7219c0d65bf220b714440f838a2a1b36efd6276de35b79bee16d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000423484789fec2f42fdefb0c4ec656217c4f53074616300f86325958b709e3ffc099d1c0c49a359a0c6251b8653b65311a288b99ee6fcf2f22df7886eaec947aee",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "31219d91b716c4897dece400f35cb7103df610bffdfdb90bf76be274ff2bf9f6",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 50,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200043d607b612ed1fb6d2b6ae4fbb7024b9ccc379170c121f49f8fb6185ebf93763535f4a1001eea1bf1ebbfd643af146b990993e98e71af4414e736941c8e444716",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "703413b19d8f415989f70ae507b4afd9900504e3725264a121bef966a30f8922",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 51,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200043d607b612ed1fb6d2b6ae4fbb7024b9ccc379170c121f49f8fb6185ebf9376357406b6db83048dca52a6344cee6f21d964a80c956376dc1338dcb400912a0c61",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "703413b19d8f415989f70ae507b4afd9900504e3725264a121bef966a30f8922",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 52,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004770c84309d95d813415d36b8127143d7c97dc5eecb764049631f1d8e6c6e3ce492c0e8c5ca2371c082e9576485eef53d1536a27ff0d59ce5116a047df7f08ce0",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "86c401c681031d35991ebeaadf996a03b4b471951f6f647c155fc2d740254909",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 53,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "3",
+          "shared" : "a3e1a44851d0dee744378c5e495f3081dff2a0fefccdd08fdc2331687d5c4a80",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "1a68ab756ecae2853fcf6285974efae32ccdd01c58d05b4cc58f74d16c2661fc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "100000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "0bc5fea1dd6793664ea15dafba3e06c1524150d9fde32e17d7c6813fdc8c8fd3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "2d44ec4cbf228a4e32409e4de1ef8859c93996a9df73c317e5d04e64137f49dc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "08000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "9e1990fec2a345118aaa96a473fb921dfb5c3d69c528cf6fc0989d075552822e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f6901e0e82974856a7",
+          "shared" : "605641e1bd08b22a1a51022d8ef80f9b6c2f70b2562387db88c124ce60660834",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7900e0e82974856a7",
+          "shared" : "7db568a027cd6204457ce31e7859cd06fc76ddbc97d5bdefd57a65752fd79340",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f790160e82974856a7",
+          "shared" : "6878ca1bdd7c0353b505d5a60b2fbed422b5c37c7b54cbed3a22e0894e7b15b8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e81974856a7",
+          "shared" : "3bc54238c701df3e18c6395f35435059c54ff0d06d8ab19a3d179ab37c1fd8d8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974855f5",
+          "shared" : "1950b7ce510d4d8648e80c6385a42d005433fc5ca61e2022a1405fe18142c246",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 63,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e8297485675",
+          "shared" : "5c05c4d877a0e2af5ffa004c122630bb87157cf346dbeb8ae13017162da208f4",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 64,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e8297485695",
+          "shared" : "9639bbd4e22194ce3892a814c82eddbd21dde05cfac20e99396e3d6ef0841f7c",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 65,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a4",
+          "shared" : "a3e1a44851d0dee744378c5e495f3081dff2a0fefccdd08fdc2331687d5c4a80",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a5",
+          "shared" : "341cbdf61f9dd620ba6873a74804afe30a06b0a113a6916a4104d2d4cc196aec",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 67,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200040000000000000000000000000000000000000000000000000000000000000000a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200040000000000000000000000000000000000000000000000000000000000000000a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200040000000000000000000000000000000000000000000000000000000000000001a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200040000000000000000000000000000000000000000000000000000000000000001a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53760000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53760000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53770000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53770000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "",
+          "public" : "3019301406072a8648ce3d020106092b2403030208010107030100",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "public point not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e1a",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 85,
+          "comment" : "public point = (0,0)",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 86,
+          "comment" : "order = -76884956397045344220809746629001649092737531784414529538755519063063536359079",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f0469970221ff5604a8245e115643c199f56f627c728e73c6855c4a9e59086fe1f17d68b7a95902010103420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 87,
+          "comment" : "order = 0",
+          "public" : "308201133081cc06072a8648ce3d02013081c0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f04699702010002010103420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 88,
+          "comment" : "order = 1",
+          "public" : "308201133081cc06072a8648ce3d02013081c0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f04699702010102010103420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 89,
+          "comment" : "order = 17901173885223768702896718547912698493510841341785744190857633730178",
+          "public" : "3082012f3081e806072a8648ce3d02013081dc020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997021d00a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e8202010103420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 90,
+          "comment" : "generator = (0,0)",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b604410400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a702010103420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 91,
+          "comment" : "generator not on curve",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046999022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a702010103420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 92,
+          "comment" : "cofactor = -1",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a70201ff03420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 93,
+          "comment" : "cofactor = 0",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a702010003420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 94,
+          "comment" : "cofactor = 2",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a702010203420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 95,
+          "comment" : "cofactor = 76884956397045344220809746629001649092737531784414529538755519063063536359079",
+          "public" : "308201553082010d06072a8648ce3d020130820100020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a703420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 96,
+          "comment" : "cofactor = None",
+          "public" : "308201303081e906072a8648ce3d02013081dd020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a703420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 97,
+          "comment" : "modified prime",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d01010221009cc5080e320d05229fe633a03f5947a56ae6a469b258ad050ad2d32af932c171304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441040000000000000000000004d52ab6d699450000000000000000000000000000522f63e0ae9874b3327af5880fd557e161861d66e42d7ad495941804bdc861d30b022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7020101034200040000000000000000000004d52ab6d699450000000000000000000000000000522f63e0ae9874b3327af5880fd557e161861d66e42d7ad495941804bdc861d30b",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "a696db5b55e4e3aa5ada30aa4acc9b5ccc347e31a2d0b7bc3e7c320eaeaa8d01",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 98,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 99,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 100,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 101,
+          "comment" : "a = 0",
+          "public" : "308201143081cd06072a8648ce3d02013081c1020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377302504010004207ec47e457bfa6d6de5c0681c57f6b7c710a28e78eaab3f2d25ae2fb1cafae1ce044104751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a702010103420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 102,
+          "comment" : "public key of order 3",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404202a2388301ff5cd750e913ef6eaab643a55150d4aab149c53565b06e33c1daca20420a7bd331b77555770582816ac71b460adea68dbb10b39d6e9409e8540f99217700441041397136aed4b89eccb8ed4857a74e4eb486ff9a9967e041e5873416b9942168e615e21d89333c13dc507b979f4e1e1098d303312a9ed183ead3e04c0f572560f022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7020101034200041397136aed4b89eccb8ed4857a74e4eb486ff9a9967e041e5873416b9942168e489d36030ebae87e795e5116a8a1ac68e10bc3112b3907e972d5435c29fbfd68",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "9019745268dcb9223120ba3944cadc84eefaec8c18157990eed1fec595177d0c",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 103,
+          "comment" : "public key on isomorphic curve brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000481ac2aef36e3d128e4360e715d4885b4d5cdea3b1def7ca2865ff76800e538133be2e51584027d139f6059e254a037f86db12c390fdc3047d3bea6812f19c04d",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "IsomorphicPublicKey",
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 104,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004debff6a4a9297b3404bd112bb32f212df745b36c698d82f928fad9eb9a9ab56957e44409addfb8b3002f17987032dccecc3375ea8bbc8918",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042e0f441d258b51e9f02035b72dc92d19fd7f861b1dc22959c4525aaf7d923ea61fcbb7b5a4fff19b19c316fb2126b9e2325573df3c6886b1d87c8b7ce1e323b0",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200045889a117e567fdc7c23cd9a8fc4a87912c7394c76d0436e3ad7eba2c1cd52b4d354a79c2f1e96365e5a19475925f078546cb829455e7e5f09c2c707b962bfc1684581bcdbecc2764d75d98c8fb1f6c1a908d3d7225af157df5891140d30b6e0c",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401571fd75d7f8c5ebd5741f8b50575a469f6b429284793ba6dbd57df9f8cc1ae3efa23fd93b69af726cc3758d731c172b9d9db377f28a22ab3463145a3ca89b20d5301b36f5db20089cc7f261ae7fcc4fc0bcdd425e0c80c3d01be586f9092ec64e9c8eeaa4ebe1ede4d0d844a45528d280514ced8ee882348a76d30776b256683dd2a40",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004628cd86e0686a0f83900ea5650c950a241bcfb585b58591bbd60d474b330ee435d4e5bc111de4e07f4f2ffc40e009b9780a9565c1521da78547ef36192c54cf0",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004bcdd35ef1d7823cae92732fe1994eefa75e69bff629bf1a551f3e07360fd2f612d9631e62da7b82376b9605028768f114f830daeba7e3c22",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004947b72e0343407d82a0fdac7c7f6d410d0196caf9dd5108cced9eff722ab9e4431b0906ff15f3f9fb5ccea8e2c11bc12b8c3d98115f1f326e4594848bd8035bae0fe980ca7b13141f7c244e141c3e578",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200042e8b483b6008ed7d5bdd423ab8e39d68faab00b30c743af1444ef204888684eb6371c4ea9cc0ad803b56abc541f35e4634c48fb32ba6fb975844dfac838cc1bff1286c6ded1f4afe42d68477be54d1ce744cd1fc9cc2e4ddbc897b0dc67a661d",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000415172c036cb3cd779740fbdaf26930536c9303e0a8d717916abbb6f010058191e1ee0835b4117c2efe4cbeadd3df260aa34d2417734cc52fd4f22d6fd56a6850927f17c97fa71ee829219c7bfe205872d61eb319b7cfa369715e63c25dc739dc6236cc71779bd4fa61bc34e76290f47b47f2b5430984edf61f4c4325a235024f",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004ad19d0abbc921f2f1fb23eca6765b2ba41b9c51e6e90d22a532c6b8c0ce699f758347ea939e79da8a8289403a5f1f8983aa17a70bbc86ca2",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000459e7f5220b13269549d11a1052c9ea852eee4c98df598d0c43824aeaf45340fd5a5aa6950b94d6b055ef7b011a506a2b1277ee50e215efa16246a231f0be64df",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200041a5c93cebdcf7fa5e5c1aedbf463ca7fc7a5a318e7bc281a775aa325c0b2117060c148c4094358fa47b779b11ef3d4b38411cb0a414ace506aa2142f568e141b6a2938122f103d7f849d0763a340e6a0",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c0362000443e497389d1cc949a87b0bc81b27462b64e8cfe890e2b2d0fadf69c955a39c48d995be3f0597fafafda4719a40e156f761c85d8225dc504c81c6a380f099d82144038fe96bafe0d437d9f3a58a62fe10868aa364fd527f1606ce3c05ad24c653",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004903c2e5edd60b9831e78cb27c7eddedece338a8c82a9dbd31b1d1a78f8f5de37e4986adf56dfef5136fc30a97f675feeb75fc0488630bb32cf6be8a2cf917dfe589cf0ad661f53093e4a172b3cbbfabbc19a3c7a16f6379060eada96b050061d3bcd9577d5ae602456f6deb6fcb65684240ed6d6420630f07bb38be1cd60a339",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "invalid public key",
+          "public" : "303a301406072a8648ce3d020106092b2403030208010107032200029cf25745a7ec04b3c00e795c7e8f8d7da33f55732003be4fd4094d842ea82d8c",
+          "private" : "25d405a46ccd1e34658b9be7423e8fce7a997120db963933545d19762c71d8dd",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 119,
+          "comment" : "public key is a low order point on twist",
+          "public" : "303a301406072a8648ce3d020106092b2403030208010107032200020a8944f96de0fe0d82489cbc7e71f2f529cfcfea03ca593d91462278731e19a5",
+          "private" : "66008d35e34ab5f875c3fd8115c335cd9b5f764323dbe44570960155570e71db",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 120,
+          "comment" : "public key is a low order point on twist",
+          "public" : "303a301406072a8648ce3d020106092b240303020801010703220002575862a7c5fc68e9ffcd58ce9bd0ef78c0a26a3a22ee96b0be16b399adb3ac4a",
+          "private" : "622853938bb5dc82716cd8d6d076ae6955da307bb14534ae56fd6dfefd5ed270",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 121,
+          "comment" : "public key is a low order point on twist",
+          "public" : "303a301406072a8648ce3d020106092b240303020801010703220003575862a7c5fc68e9ffcd58ce9bd0ef78c0a26a3a22ee96b0be16b399adb3ac4a",
+          "private" : "622853938bb5dc82716cd8d6d076ae6955da307bb14534ae56fd6dfefd5ed26f",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 122,
+          "comment" : "public key is a low order point on twist",
+          "public" : "303a301406072a8648ce3d020106092b2403030208010107032200030a8944f96de0fe0d82489cbc7e71f2f529cfcfea03ca593d91462278731e19a5",
+          "private" : "66008d35e34ab5f875c3fd8115c335cd9b5f764323dbe44570960155570e71da",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 123,
+          "comment" : "long form encoding of length",
+          "public" : "30815a301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 124,
+          "comment" : "long form encoding of length",
+          "public" : "305b30811406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 125,
+          "comment" : "long form encoding of length",
+          "public" : "305b30150681072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 126,
+          "comment" : "long form encoding of length",
+          "public" : "305b301506072a8648ce3d02010681092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 127,
+          "comment" : "long form encoding of length",
+          "public" : "305b301406072a8648ce3d020106092b240303020801010703814200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 128,
+          "comment" : "length contains leading 0",
+          "public" : "3082005a301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 129,
+          "comment" : "length contains leading 0",
+          "public" : "305c3082001406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 130,
+          "comment" : "length contains leading 0",
+          "public" : "305c3016068200072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 131,
+          "comment" : "length contains leading 0",
+          "public" : "305c301606072a8648ce3d0201068200092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 132,
+          "comment" : "length contains leading 0",
+          "public" : "305c301406072a8648ce3d020106092b24030302080101070382004200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 133,
+          "comment" : "wrong length",
+          "public" : "305b301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 134,
+          "comment" : "wrong length",
+          "public" : "3059301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 135,
+          "comment" : "wrong length",
+          "public" : "305a301506072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 136,
+          "comment" : "wrong length",
+          "public" : "305a301306072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 137,
+          "comment" : "wrong length",
+          "public" : "305a301406082a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 138,
+          "comment" : "wrong length",
+          "public" : "305a301406062a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 139,
+          "comment" : "wrong length",
+          "public" : "305a301406072a8648ce3d0201060a2b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 140,
+          "comment" : "wrong length",
+          "public" : "305a301406072a8648ce3d020106082b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 141,
+          "comment" : "wrong length",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034300040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 142,
+          "comment" : "wrong length",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034100040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 143,
+          "comment" : "uint32 overflow in length",
+          "public" : "3085010000005a301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 144,
+          "comment" : "uint32 overflow in length",
+          "public" : "305f3085010000001406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "uint32 overflow in length",
+          "public" : "305f3019068501000000072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "uint32 overflow in length",
+          "public" : "305f301906072a8648ce3d0201068501000000092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "uint32 overflow in length",
+          "public" : "305f301406072a8648ce3d020106092b24030302080101070385010000004200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "uint64 overflow in length",
+          "public" : "308901000000000000005a301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "uint64 overflow in length",
+          "public" : "3063308901000000000000001406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "uint64 overflow in length",
+          "public" : "3063301d06890100000000000000072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "uint64 overflow in length",
+          "public" : "3063301d06072a8648ce3d020106890100000000000000092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "uint64 overflow in length",
+          "public" : "3063301406072a8648ce3d020106092b2403030208010107038901000000000000004200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "length = 2**31 - 1",
+          "public" : "30847fffffff301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "length = 2**31 - 1",
+          "public" : "305e30847fffffff06072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "length = 2**31 - 1",
+          "public" : "305e301806847fffffff2a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "length = 2**31 - 1",
+          "public" : "305e301806072a8648ce3d020106847fffffff2b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "length = 2**31 - 1",
+          "public" : "305e301406072a8648ce3d020106092b240303020801010703847fffffff00040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "length = 2**32 - 1",
+          "public" : "3084ffffffff301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "length = 2**32 - 1",
+          "public" : "305e3084ffffffff06072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "length = 2**32 - 1",
+          "public" : "305e30180684ffffffff2a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "length = 2**32 - 1",
+          "public" : "305e301806072a8648ce3d02010684ffffffff2b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "length = 2**32 - 1",
+          "public" : "305e301406072a8648ce3d020106092b24030302080101070384ffffffff00040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "length = 2**40 - 1",
+          "public" : "3085ffffffffff301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "length = 2**40 - 1",
+          "public" : "305f3085ffffffffff06072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "length = 2**40 - 1",
+          "public" : "305f30190685ffffffffff2a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "length = 2**40 - 1",
+          "public" : "305f301906072a8648ce3d02010685ffffffffff2b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "length = 2**40 - 1",
+          "public" : "305f301406072a8648ce3d020106092b24030302080101070385ffffffffff00040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3088ffffffffffffffff301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "length = 2**64 - 1",
+          "public" : "30623088ffffffffffffffff06072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3062301c0688ffffffffffffffff2a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3062301c06072a8648ce3d02010688ffffffffffffffff2b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3062301406072a8648ce3d020106092b24030302080101070388ffffffffffffffff00040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "incorrect length",
+          "public" : "30ff301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "incorrect length",
+          "public" : "305a30ff06072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "incorrect length",
+          "public" : "305a301406ff2a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "incorrect length",
+          "public" : "305a301406072a8648ce3d020106ff2b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "incorrect length",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703ff00040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "indefinite length without termination",
+          "public" : "3080301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "indefinite length without termination",
+          "public" : "305a308006072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "indefinite length without termination",
+          "public" : "305a301406802a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "indefinite length without termination",
+          "public" : "305a301406072a8648ce3d020106802b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "indefinite length without termination",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107038000040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "removing sequence",
+          "public" : "",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "removing sequence",
+          "public" : "3044034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "lonely sequence tag",
+          "public" : "30",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "lonely sequence tag",
+          "public" : "304530034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "appending 0's to sequence",
+          "public" : "305c301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b70000",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "appending 0's to sequence",
+          "public" : "305c301606072a8648ce3d020106092b24030302080101070000034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "prepending 0's to sequence",
+          "public" : "305c0000301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "prepending 0's to sequence",
+          "public" : "305c3016000006072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "appending unused 0's to sequence",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b70000",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "appending unused 0's to sequence",
+          "public" : "305c301406072a8648ce3d020106092b24030302080101070000034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "appending null value to sequence",
+          "public" : "305c301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b70500",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "appending null value to sequence",
+          "public" : "305c301606072a8648ce3d020106092b24030302080101070500034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "including garbage",
+          "public" : "305f498177305a301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "including garbage",
+          "public" : "305e2500305a301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "including garbage",
+          "public" : "305c305a301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b70004deadbeef",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "including garbage",
+          "public" : "305f3019498177301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "including garbage",
+          "public" : "305e30182500301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "including garbage",
+          "public" : "30623016301406072a8648ce3d020106092b24030302080101070004deadbeef034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "including garbage",
+          "public" : "305f3019260c49817706072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "including garbage",
+          "public" : "305e3018260b250006072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "including garbage",
+          "public" : "3062301c260906072a8648ce3d02010004deadbeef06092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "including garbage",
+          "public" : "305f301906072a8648ce3d0201260e49817706092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "including garbage",
+          "public" : "305e301806072a8648ce3d0201260d250006092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "including garbage",
+          "public" : "3062301c06072a8648ce3d0201260b06092b24030302080101070004deadbeef034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "including garbage",
+          "public" : "305f301406072a8648ce3d020106092b24030302080101072347498177034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "including garbage",
+          "public" : "305e301406072a8648ce3d020106092b240303020801010723462500034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "including garbage",
+          "public" : "3062301406072a8648ce3d020106092b24030302080101072344034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b70004deadbeef",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "including undefined tags",
+          "public" : "3062aa00bb00cd00305a301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "including undefined tags",
+          "public" : "3060aa02aabb305a301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "including undefined tags",
+          "public" : "3062301caa00bb00cd00301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "including undefined tags",
+          "public" : "3060301aaa02aabb301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "including undefined tags",
+          "public" : "3062301c260faa00bb00cd0006072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "including undefined tags",
+          "public" : "3060301a260daa02aabb06072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "including undefined tags",
+          "public" : "3062301c06072a8648ce3d02012611aa00bb00cd0006092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 217,
+          "comment" : "including undefined tags",
+          "public" : "3060301a06072a8648ce3d0201260faa02aabb06092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 218,
+          "comment" : "including undefined tags",
+          "public" : "3062301406072a8648ce3d020106092b2403030208010107234aaa00bb00cd00034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 219,
+          "comment" : "including undefined tags",
+          "public" : "3060301406072a8648ce3d020106092b24030302080101072348aa02aabb034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 220,
+          "comment" : "truncated length of sequence",
+          "public" : "3081",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 221,
+          "comment" : "truncated length of sequence",
+          "public" : "30463081034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 222,
+          "comment" : "Replacing sequence with NULL",
+          "public" : "0500",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 223,
+          "comment" : "Replacing sequence with NULL",
+          "public" : "30460500034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 224,
+          "comment" : "changing tag value of sequence",
+          "public" : "2e5a301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 225,
+          "comment" : "changing tag value of sequence",
+          "public" : "2f5a301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 226,
+          "comment" : "changing tag value of sequence",
+          "public" : "315a301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 227,
+          "comment" : "changing tag value of sequence",
+          "public" : "325a301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 228,
+          "comment" : "changing tag value of sequence",
+          "public" : "ff5a301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 229,
+          "comment" : "changing tag value of sequence",
+          "public" : "305a2e1406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 230,
+          "comment" : "changing tag value of sequence",
+          "public" : "305a2f1406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 231,
+          "comment" : "changing tag value of sequence",
+          "public" : "305a311406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 232,
+          "comment" : "changing tag value of sequence",
+          "public" : "305a321406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 233,
+          "comment" : "changing tag value of sequence",
+          "public" : "305aff1406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 234,
+          "comment" : "dropping value of sequence",
+          "public" : "3000",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 235,
+          "comment" : "dropping value of sequence",
+          "public" : "30463000034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 236,
+          "comment" : "truncate sequence",
+          "public" : "3059301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 237,
+          "comment" : "truncate sequence",
+          "public" : "30591406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 238,
+          "comment" : "truncate sequence",
+          "public" : "3059301306072a8648ce3d020106092b24030302080101034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 239,
+          "comment" : "truncate sequence",
+          "public" : "30593013072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 240,
+          "comment" : "indefinite length",
+          "public" : "3080301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b70000",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 241,
+          "comment" : "indefinite length",
+          "public" : "305c308006072a8648ce3d020106092b24030302080101070000034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 242,
+          "comment" : "indefinite length with truncated delimiter",
+          "public" : "3080301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b700",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 243,
+          "comment" : "indefinite length with truncated delimiter",
+          "public" : "305b308006072a8648ce3d020106092b240303020801010700034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 244,
+          "comment" : "indefinite length with additional element",
+          "public" : "3080301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b705000000",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 245,
+          "comment" : "indefinite length with additional element",
+          "public" : "305e308006072a8648ce3d020106092b240303020801010705000000034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 246,
+          "comment" : "indefinite length with truncated element",
+          "public" : "3080301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7060811220000",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 247,
+          "comment" : "indefinite length with truncated element",
+          "public" : "3060308006072a8648ce3d020106092b2403030208010107060811220000034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 248,
+          "comment" : "indefinite length with garbage",
+          "public" : "3080301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b70000fe02beef",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 249,
+          "comment" : "indefinite length with garbage",
+          "public" : "3060308006072a8648ce3d020106092b24030302080101070000fe02beef034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 250,
+          "comment" : "indefinite length with nonempty EOC",
+          "public" : "3080301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b70002beef",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 251,
+          "comment" : "indefinite length with nonempty EOC",
+          "public" : "305e308006072a8648ce3d020106092b24030302080101070002beef034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 252,
+          "comment" : "prepend empty sequence",
+          "public" : "305c3000301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 253,
+          "comment" : "prepend empty sequence",
+          "public" : "305c3016300006072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 254,
+          "comment" : "append empty sequence",
+          "public" : "305c301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b73000",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 255,
+          "comment" : "append empty sequence",
+          "public" : "305c301606072a8648ce3d020106092b24030302080101073000034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 256,
+          "comment" : "sequence of sequence",
+          "public" : "305c305a301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 257,
+          "comment" : "sequence of sequence",
+          "public" : "305c3016301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 258,
+          "comment" : "truncated sequence",
+          "public" : "3016301406072a8648ce3d020106092b2403030208010107",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 259,
+          "comment" : "truncated sequence",
+          "public" : "304f300906072a8648ce3d0201034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 260,
+          "comment" : "repeat element in sequence",
+          "public" : "30819e301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 261,
+          "comment" : "repeat element in sequence",
+          "public" : "3065301f06072a8648ce3d020106092b240303020801010706092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 262,
+          "comment" : "removing oid",
+          "public" : "3051300b06092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 263,
+          "comment" : "lonely oid tag",
+          "public" : "3052300c0606092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 264,
+          "comment" : "lonely oid tag",
+          "public" : "3050300a06072a8648ce3d020106034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 265,
+          "comment" : "appending 0's to oid",
+          "public" : "305c301606092a8648ce3d0201000006092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 266,
+          "comment" : "appending 0's to oid",
+          "public" : "305c301606072a8648ce3d0201060b2b24030302080101070000034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 267,
+          "comment" : "prepending 0's to oid",
+          "public" : "305c3016060900002a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 268,
+          "comment" : "prepending 0's to oid",
+          "public" : "305c301606072a8648ce3d0201060b00002b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 269,
+          "comment" : "appending unused 0's to oid",
+          "public" : "305c301606072a8648ce3d0201000006092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 270,
+          "comment" : "appending null value to oid",
+          "public" : "305c301606092a8648ce3d0201050006092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 271,
+          "comment" : "appending null value to oid",
+          "public" : "305c301606072a8648ce3d0201060b2b24030302080101070500034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 272,
+          "comment" : "truncated length of oid",
+          "public" : "3053300d068106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 273,
+          "comment" : "truncated length of oid",
+          "public" : "3051300b06072a8648ce3d02010681034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 274,
+          "comment" : "Replacing oid with NULL",
+          "public" : "3053300d050006092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 275,
+          "comment" : "Replacing oid with NULL",
+          "public" : "3051300b06072a8648ce3d02010500034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 276,
+          "comment" : "changing tag value of oid",
+          "public" : "305a301404072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 277,
+          "comment" : "changing tag value of oid",
+          "public" : "305a301405072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 278,
+          "comment" : "changing tag value of oid",
+          "public" : "305a301407072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 279,
+          "comment" : "changing tag value of oid",
+          "public" : "305a301408072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 280,
+          "comment" : "changing tag value of oid",
+          "public" : "305a3014ff072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 281,
+          "comment" : "changing tag value of oid",
+          "public" : "305a301406072a8648ce3d020104092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 282,
+          "comment" : "changing tag value of oid",
+          "public" : "305a301406072a8648ce3d020105092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 283,
+          "comment" : "changing tag value of oid",
+          "public" : "305a301406072a8648ce3d020107092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 284,
+          "comment" : "changing tag value of oid",
+          "public" : "305a301406072a8648ce3d020108092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 285,
+          "comment" : "changing tag value of oid",
+          "public" : "305a301406072a8648ce3d0201ff092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 286,
+          "comment" : "dropping value of oid",
+          "public" : "3053300d060006092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 287,
+          "comment" : "dropping value of oid",
+          "public" : "3051300b06072a8648ce3d02010600034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 288,
+          "comment" : "modify first byte of oid",
+          "public" : "305a30140607288648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 289,
+          "comment" : "modify first byte of oid",
+          "public" : "305a301406072a8648ce3d02010609292403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 290,
+          "comment" : "modify last byte of oid",
+          "public" : "305a301406072a8648ce3d028106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 291,
+          "comment" : "modify last byte of oid",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010187034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 292,
+          "comment" : "truncate oid",
+          "public" : "3059301306062a8648ce3d0206092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 293,
+          "comment" : "truncate oid",
+          "public" : "3059301306068648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 294,
+          "comment" : "truncate oid",
+          "public" : "3059301306072a8648ce3d020106082b24030302080101034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 295,
+          "comment" : "truncate oid",
+          "public" : "3059301306072a8648ce3d020106082403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 296,
+          "comment" : "wrong oid",
+          "public" : "305d3017060a3262306530333032316106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 297,
+          "comment" : "wrong oid",
+          "public" : "3065301f061236303836343830313635303330343032303106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 298,
+          "comment" : "wrong oid",
+          "public" : "305b301506072a8648ce3d0201060a32623065303330323161034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 299,
+          "comment" : "wrong oid",
+          "public" : "3063301d06072a8648ce3d02010612363038363438303136353033303430323031034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 300,
+          "comment" : "longer oid",
+          "public" : "3063301d06103261383634386365336430323031303106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 301,
+          "comment" : "longer oid",
+          "public" : "3065301f06072a8648ce3d020106143262323430333033303230383031303130373031034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 302,
+          "comment" : "oid with modified node",
+          "public" : "3061301b060e326138363438636533643032313106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 303,
+          "comment" : "oid with modified node",
+          "public" : "3069302306163261383634386365336430323838383038303830303106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 304,
+          "comment" : "oid with modified node",
+          "public" : "3063301d06072a8648ce3d02010612326232343033303330323038303130313137034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 305,
+          "comment" : "oid with modified node",
+          "public" : "306b302506072a8648ce3d0201061a3262323430333033303230383031303138383830383038303037034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 306,
+          "comment" : "large integer in oid",
+          "public" : "3073302d0620326138363438636533643032383238303830383038303830383038303830303106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 307,
+          "comment" : "large integer in oid",
+          "public" : "3075302f06072a8648ce3d02010624326232343033303330323038303130313832383038303830383038303830383038303037034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 308,
+          "comment" : "oid with invalid node",
+          "public" : "3064301e0611326138363438636533643032303165303306092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 309,
+          "comment" : "oid with invalid node",
+          "public" : "305b301506082a808648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 310,
+          "comment" : "oid with invalid node",
+          "public" : "3066302006072a8648ce3d02010615326232343033303330323038303130313037653033034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 311,
+          "comment" : "oid with invalid node",
+          "public" : "305b301506072a8648ce3d0201060a2b802403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 312,
+          "comment" : "lonely bit string tag",
+          "public" : "3017301406072a8648ce3d020106092b240303020801010703",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 313,
+          "comment" : "appending 0's to bit string",
+          "public" : "305c301406072a8648ce3d020106092b2403030208010107034400040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b70000",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 314,
+          "comment" : "prepending 0's to bit string",
+          "public" : "305c301406072a8648ce3d020106092b24030302080101070344000000040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 315,
+          "comment" : "appending null value to bit string",
+          "public" : "305c301406072a8648ce3d020106092b2403030208010107034400040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b70500",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 316,
+          "comment" : "truncated length of bit string",
+          "public" : "3018301406072a8648ce3d020106092b24030302080101070381",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 317,
+          "comment" : "Replacing bit string with NULL",
+          "public" : "3018301406072a8648ce3d020106092b24030302080101070500",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 318,
+          "comment" : "changing tag value of bit string",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107014200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 319,
+          "comment" : "changing tag value of bit string",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107024200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 320,
+          "comment" : "changing tag value of bit string",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107044200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 321,
+          "comment" : "changing tag value of bit string",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107054200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 322,
+          "comment" : "changing tag value of bit string",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107ff4200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 323,
+          "comment" : "dropping value of bit string",
+          "public" : "3018301406072a8648ce3d020106092b24030302080101070300",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 324,
+          "comment" : "modify first byte of bit string",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034202040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 325,
+          "comment" : "modify last byte of bit string",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e637",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 326,
+          "comment" : "truncate bit string",
+          "public" : "3059301406072a8648ce3d020106092b2403030208010107034100040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 327,
+          "comment" : "truncate bit string",
+          "public" : "3059301406072a8648ce3d020106092b24030302080101070341040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 328,
+          "comment" : "declaring bits as unused in a bit-string",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034201040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 329,
+          "comment" : "unused bits in a bit-string",
+          "public" : "305e301406072a8648ce3d020106092b2403030208010107034620040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b701020304",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 330,
+          "comment" : "unused bits in empty bit-string",
+          "public" : "3019301406072a8648ce3d020106092b2403030208010107030103",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 331,
+          "comment" : "128 unused bits",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034280040bc9c96c6a1a53a682d047de92f68503d8183dbfd0289a23f122328a02139eb470f35f5d9f0719466138c0f03af1832cae9faffdc57b23fdd323a4a1cd99e6b7",
+          "private" : "6886a22d99d63e4def932f8c050560452c110975f8cffee6482df732fd11696",
+          "shared" : "2b55ca46c52f0d48efc170194f6fccd38fe9505f2765f64232eef3af9ed42a83",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdh_brainpoolP320r1_test.json b/third_party/wycheproof/testvectors/ecdh_brainpoolP320r1_test.json
new file mode 100644
index 0000000..dabf952
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdh_brainpoolP320r1_test.json
@@ -0,0 +1,3406 @@
+{
+  "algorithm" : "ECDH",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "AddSubChain" : "The private key has a special value. Implementations using addition subtraction chains for the point multiplication may get the point at infinity as an intermediate result. See CVE_2017_10176",
+    "CompressedPoint" : "The point in the public key is compressed. Not every library supports points in compressed format.",
+    "InvalidAsn" : "The public key in this test uses an invalid ASN encoding. Some cases where the ASN parser is not strictly checking the ASN format are benign as long as the ECDH computation still returns the correct shared value.",
+    "InvalidPublic" : "The public key has been modified and is invalid. An implementation should always check whether the public key is valid and on the same curve as the private key. The test vector includes the shared secret computed with the original public key if the public point is on the curve of the private key. Generating a shared secret other than the one with the original key likely indicates that the bug is exploitable.",
+    "ModifiedPrime" : "The modulus of the public key has been modified. The public point of the public key has been chosen so that it is both a point on both the curve of the modified public key and the private key.",
+    "UnnamedCurve" : "The public key does not use a named curve. RFC 3279 allows to encode such curves by explicitly encoding, the parameters of the curve equation, modulus, generator, order and cofactor. However, many crypto libraries only support named curves. Modifying some of the EC parameters and encoding the corresponding public key as an unnamed curve is a potential attack vector.",
+    "UnusedParam" : "A parameter that is typically not used for ECDH has been modified. Sometimes libraries ignore small differences between public and private key. For example, a library might ignore an incorrect cofactor in the public key. We consider ignoring such changes as acceptable as long as these differences do not change the outcome of the ECDH computation, i.e. as long as the computation is done on the curve from the private key.",
+    "WeakPublicKey" : "The vector contains a weak public key. The curve is not a named curve, the public key point has order 3 and has been chosen to be on the same curve as the private key. This test vector is used to check ECC implementations for missing steps in the verification of the public key.",
+    "WrongOrder" : "The order of the public key has been modified. If this order is used in a cryptographic primitive instead of the correct order then private keys may leak. E.g. ECDHC in BC 1.52 suffered from this."
+  },
+  "numberOfTests" : 320,
+  "header" : [],
+  "testGroups" : [
+    {
+      "curve" : "brainpoolP320r1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "normal case",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004b7fc5720d4b325c0805cc213c1b9ccbd9e4f380a121fbc00784c821bcd7f0d618b70d39fbdceae553d9de4f90683eb9f000463c7bd1d32db8cfad2b40862ccac05030e93fc6694c071e8e1427b305006",
+          "private" : "12d06c51deda1595d8c43e7c146f898f7141c0836522931049afe61333ae2c03e350b61aeba540bf",
+          "shared" : "94982d50b29faedaa7ed0988fd57b90303b032ce398ec70af6d194bcfd7f9008d14e09425502b7e7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "compressed public key",
+          "public" : "3042301406072a8648ce3d020106092b2403030208010109032a0002b7fc5720d4b325c0805cc213c1b9ccbd9e4f380a121fbc00784c821bcd7f0d618b70d39fbdceae55",
+          "private" : "12d06c51deda1595d8c43e7c146f898f7141c0836522931049afe61333ae2c03e350b61aeba540bf",
+          "shared" : "94982d50b29faedaa7ed0988fd57b90303b032ce398ec70af6d194bcfd7f9008d14e09425502b7e7",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004430dd30b26350bc66c41c71769dd61b740d71008b59e455c1795ebbdc6bb1f0c8afaab415850142f1557feb7bef5fd3937f088ccb4d3ff8dc7431eecc9dce6f57c45035ca97dd0d7de9991742a39ad20",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "00000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200047bad53f50a369371b9742952b37f6a179ffb0f7f46894321f1b3485453b7bb58b9e61e1ad06913247287976110d22bbaf17dad584cd104bca6601daa0b6633ba889793f931ef61f889a491bfc3776256",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "00000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000439a0050ad1000627ffeb7bd1c4fa9fc336507c4d1c2a55f4e3672c15dabc8dc9567e326e740c54c799c1b05bcd6fc5b43c693569c0583a19e5a0aff1b4135df461e626e81fb098be2eefbf9ec1075a53",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "00000000000000000000000000000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004887c70eaddf1e67b2e05e0613154b61cac592568641c5332a218a87cebba63b2518e6c1cc1ca4036a4a62bbe99f7cab95eb1fd6b0acc85d495c9b82ed1ce047db89ab3c08f953c13ab35128638921b09",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "0000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000404d114977ae64cbca724fc517d6b7bafaf7c9eec36d682c1fd02e9f9bca302b149793582b301c8a95acab775a1f9c63d1eab8f1e67421c7d8de16f0128167a2f7ef8ae55fda1b83e97503b8323343a92",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000100000006",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200042e78935c77d5fc195928849d98b81c79c8dc407bf113bd1e3f49967d288d7bf8c1cd853a9a5fd80788e3e8ebdf07f70c44075b8ad217123e2ef44ae53f4306d0f1958f1311d0509e1c7754a68afdf7eb",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200048f93a6519729320805291a17925e6d42ba23dd25acb3eea29c18f1e550c7dfb41182a9fd75747df77191f150afa979031f546222bbdc1afc448c6613d219a109a018ad341b6bb5fff61939a242b42968",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "07fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000473a8101f2569337b61237b94105f02af62af56fe0364a8b06cfd0c65ad26898034828dbda03b90e7394b1a51f0c32effa86c58c28c5ae2efce2a147eb69580519f31a57a697d9c069b97ef9c02f4bbf4",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "2e5544fd7d843f5df87bad4422ee2f10139748eb004974c3858f8a7a689df792ae0af08dc43414d9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004a83df8e6d9326d0f6e399db9094f81ab8af846091f5d50f220d2dc94a268c6a8d11ade13e2484b253a77027983c3d8b2d0a4cb9ee9008cbd8d34c50fc65a5aad5c21f332788f719897c44447e0f11370",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "2e62b007e0e833a4fe3a6b527a4fe88f6bbd0ce20e6a374fb6474d56956b6a0f807f68652c8b0ded",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004bef54b0fe97b66cbfc62731645fe3c6fc1d582dfc18fe419fefb8cbdb0c5fa17a363f352ed7b6bfa37e24f93ec8da50062937823baab3c138cf1335e07bb50c8a05ed6a9bb9f82631c95f500aa9f3645",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "5caa89fafb087ebbf0f75a8845dc5e20272e91d60092e9870b1f14f4d13bef255c15e11b886829b2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004ab49dd4a73e9f8e0595bd8ca1655e2bca61fa2e1a3cc87635ae7a61fdb7c9bd5a8e4e34aa2b928c930732ccb23d3f512aeda1496a84e7e75303b0ee662d61107da8c67fe7193de7c29251423501df209",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "6166f3de8da8f6e286176276a03ac6dbb4a9f8b0154a1504caa5ba2bb12dde1be6eae89f3384123b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200048f5659116b4af2d03dd2b3e72c0d78d77677fefb4e277bee2a4966bba8354f85d83845b33a431a6907921555c1ac471e51e26a0cc67fb4146da0502fcee38f5ef502fcd4f9a380b086af5c403396c4f7",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "6946ec9bdddac30dc5060f5bdb41d2140d57066758e3b73f0c50b5590ac45e9c3a483016c97d409d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004243bd450e757a6a5308cb366f87c359b953cb42c6c61de923a24247217974d6ccb3f8869e832227c64035c2066f24423fee0041ab5ef361d1ca4bd19f34f9802f1fbcd2cc132087d8f4f3d5b32e1b046",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "7f0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000465677dff00f5899c5100c5ceaeef383de49012e005e8f73656caff3e95dd1254bbbffa840e206e962935d733930dbe0130714761a1a26bf9a59cd37db1311bae7ab2f9ae3f0827aa0ae240b34cefb97c",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "7fc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc000000080000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200046394defc20111cd8cddc2b8545b9200f080736bf6438f21c6fe0bc246e4bb0bdce1f1107d6dc55b536d025461efef8ec5dfa7f088fc03070efe56158050ac3042d1285aa9ea40215dfe5542e6d5590f4",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "7ffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200040c1142edacae66ffa6993bca134cd4450b5adf0d5f5c32e21479f2419a9000afe9226749f27bcad113bee319eac4e6c6927deef999d25017890e95a615bd222720ecbb22ebe2ed9aafb9610bfa7e77f9",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "7ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff000000040000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004770298807fbfc4f084210a361403c6dd3c3f2c31bbf20ec851e10144fc8340ae7a77cead742b5d1dc4a9a855df56a21362614044ae945739c707c0c89b65a43fb091069bd4f695b553c583f538206c35",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "7fffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004a719ed2e9ff2debac0713bc4806181736885736f183be24175ced514ebb76a0e49b20f7a47bec04477405570758bb4a1835f71338d394ac799d389a9a2b0aab561717a0642c668dd7e88521fc0884db9",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "7fffffffffffffff0000000000000000ffffffffffffffff00000000000000010000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000423c02591b8ee778c5780ed4c783974ddd5aa52117d68cdda1c375cb77dc36f5fbea9709e44612898c1f5fcb67bd6b2bcc6ff0b01003be7559c1cd0827847de5943d5adde9b8519a55675970051659a03",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200040000000000000000000000000000000000000000000000000000000000000000000000000000000129110253d52cf3c5fc3382fca93d18adf7b97999028767b9722381db68fe3a41793b7d9952c6177f",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "2bab467efa3adf782324563a4d8f19018ca44458f697318a11f3e3c2269275c7b1aec44ce83cce8a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004000000000000000000000000000000000000000000000000000000000000000000000000000000020d1a18c0b25d0d32d9c4249a523cfcc12a20c2ead596607d73260895676315a70ad098e8b51d25a8",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "829a5f7c664dce621ba1373c0758d3d2b2984d85c384cf0077930ae4909f6072731572ecc3e4a1aa",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000400000000000000000000000000000000000000000000000000000000000000000000000000000003638b53e2a2f41dc6d6dc7b3611a6dde54f7e8a7bb2681afa2060100074e51289d13d79251d168da2",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "8131f95388bd0c74d3fedc3077d750382e90f765c820e608292fe923c4f3c76ac77d6c2c05862c7a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200040000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff13b6599cb2e990a4fee490dff267362978a0e76f57c53b4ee85fc39c790f4c6969978fc462e5a847",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "203ab48d6e3a11afcb44140f0b6596cc85dfe39e589d64b699ddb5470ee2ac5cf61d6ec8534aacfe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000400000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000001000000063a91ee30c63eb15b1c0f2102c6cf3438dd75ca71636238f891e367c105f0b781d02de648399712a0",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "0f5a4a6607bfd93aa3d1ed5a4aa5ed3d973547cc978265649cc47dae0cd32bfeeef058e4e2ed4288",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff308f36ab8f37e97723b0aadd7ee4dd585b9e68dc00db4242f6c3cf7b0ec1497a26e629b24a613b3a",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "a6b0761c5fe60e1e4c63704ecb8a0da1a9b89cd502b2091eb37a414181af99c4b421f107865a3989",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000407fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff231f9aef9b1a7c143485f601980bfa4f7bc7b312b01400bd1d15669197e07f2edf39cd08c905e280",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "8ccfba752052d15c8cca181abd9fded4cb0c176dbadccafe44cf1cc1907fc9ba356c7e7c3289e19e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200042e5544fd7d843f5df87bad4422ee2f10139748eb004974c3858f8a7a689df792ae0af08dc43414d92c64eca76e2196d01899acac1824effa5a9b4b3167b2131477386006fc3a0f624d9684c900df7b78",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "5e7e6ba602aa2208b1607f879635d6e3c28568a7f754dae448cfc793a80600809ac13381bc800a8d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200042e62b007e0e833a4fe3a6b527a4fe88f6bbd0ce20e6a374fb6474d56956b6a0f807f68652c8b0ded5b0554bd701c2b9e6687e1b0135dff715d53dae858fa77df8e7e566ed638f9726ade9ea2db601079",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "9f6059cbada97ab9f0826b6a1bedfe79b9c75da51fc2fe2620436bff79b15ac416b9ed1a02513640",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200045caa89fafb087ebbf0f75a8845dc5e20272e91d60092e9870b1f14f4d13bef255c15e11b886829b213eff0c83008731468789c7865e5c17d5de2da065c8f039a7475cd7588e03e9a68ca0841f6f8429f",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "1a05058f316d94efa0829e12c65c32a01202b24a9cf97b9f64990a39f643456dfb5a89649a8f6832",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200046166f3de8da8f6e286176276a03ac6dbb4a9f8b0154a1504caa5ba2bb12dde1be6eae89f3384123b0e75f218e122dac1d46f0c09e49b92c167798a6b458e6660c8c10fb3858d89a5f546a301406d456f",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "1f9ae24d0082d8a103842086fae91da616c1b0d26007db2f755a8fb0dd1720205895a1ead88b2a30",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200046946ec9bdddac30dc5060f5bdb41d2140d57066758e3b73f0c50b5590ac45e9c3a483016c97d409d0ece7c2cf1c5a46c15c6ff814b1252593cb532621fe14c7f557762911a166e46b9b7a3d4b9aa9f7b",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "01980373c0a3a00be8b30b1afb8123b032a7054b16b51016be94f5d9f5dd8a5a5f19e0807f6c27cd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200047f0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff025368d44d7706408e18118e8338b5a8f65dcb4f7ac1884d97a44d235b8c89e5c240576680e6def6",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "8c14fa61be79ee096dcf6a2cd31aaab422b98161476c02e71a18168eaf3185ac515f6e451af5e27c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200047fc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc0000000800000011a2b8d3c67305de21501cd7c43ad4cd9a57459c42e6fdac1e2cb37952703ffdccd18fcb326a2e0c7",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "61482d667be2a2d7bfcbd75b9e8140ea37813ede1fd44eb046f436a4d672784643d0d84b1c82f55f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200047ffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff800000400000025a0dc389bcdc85d8434b2c615d1092b546d7808978f2d0cd3b3f17f57a2774c883fc5fad79ed32d",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "c586152d7416ca85eb55486ec2914a78a3d99a240d7d2657d54a2c8c1540b349380a151c9669a107",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200047ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff000000040000001030432044ddf1b1586c51deec0306d02d88e54bc2a2dc6c7e65895891633f866addb9de1ad32a8bc",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "c11b2dca6672802c8528af2c84b1a04e59c9a22bb271bd6d7568092babd2f23efc063ab248a2717d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200047fffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff65f89731c0263d13aaa8ca7b3dadea10c46d7243883d7cab726d463b254df6ef728b52d8bbfb06ee",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "aa2e1ba6b508026b967ab355b99318bc394fc0d3cfabbb246804ddb5f913e6ef6bc0a228311bedcc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200047fffffffffffffff0000000000000000ffffffffffffffff00000000000000010000000000000000138c04477f42d165e4d474248d091ad74220de2021d0ca8f9f7295c7cc19c787f94ec33a2e4d51ee",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "5397c3d5663f5fcc4705eceba8255e89cea1747ad0d08d40b7a1aee01193b5df9593f8013c5dfb96",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04f2455cdb035b0cd4422a3ca06bb19bf018d1a5cb84eb12446d47f7f7a16c035c70951b4b6bad7b",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "20c790cf41723c9d5757b1eec1ff88ef16cbb632879cdce47fcb583262a7a6775c4486df301df5f5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "3",
+          "shared" : "a3e86777a4263b4656733a65bf322d397199cda903588fc3754cb0e27901f5e29f115b511b94c831",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "93cd465d332e25bbec7b195b37f7e3a126f1d67cdb946cb9b2c45a36a5c4d7e9171f3d3fded20ef7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "1000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "6cc6520a3d34ec73bdc0648390a8be6736c104a6651c7a35face310fd0bf69b151aecf457ef584da",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "78b7d04861460cbf141f6d41648742adf459b5f3695ba2449ce76210494ce540069e1536c03100ff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "080000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "8f21e698a1e1bc66acc08adb5b923e4b2a012dfe8145637e702351f161688f0b572c57d4d1b6b4f7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e88691555b44c59311",
+          "shared" : "151b2e82d009a18b4b7e46df2ad0e30d151d321bd64ef2f1ff6a36781ae448b99ef443ac7d1b09cc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98681555b44c59311",
+          "shared" : "d04a5e44828163fcb66f9e601d933ba2f431cada91256861e36765f6098e234005f48bb039a288ef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98689555b44c59311",
+          "shared" : "94023419382fbdcacb99fc0c37b73be771bbcb8b2efdc6dd324f0328e16b755bb27a2ab440ed6c87",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555a44c59311",
+          "shared" : "aa464b779d451beb21ba7f63b65db0442c52b9ac32f0a2addcd0869c7ebddff479d47461b83225f8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59233",
+          "shared" : "c0038da858441f559a864dcd6c4558437f9ad091a67c3fda69a9e0cb6f446a8b47ae95edc2f4eade",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 51,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c592b3",
+          "shared" : "8258131a80bc9f2b8ba532ef1253ef39dce25e6deb85227c670273521c311dbb9bf1a56dd29107b3",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 52,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c592f3",
+          "shared" : "ae752e75684a9adfc6198e6c1ce9249d26743104e8b0bd0417998c62982622ea2fdf6917413d547c",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 53,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59303",
+          "shared" : "37bfbb637fce27ee80b3af326546303e0bd8af01b72f591830a548609055bda489d9a4e6b5e3f43e",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 54,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930b",
+          "shared" : "854ce9516e73c6cc8d0d6ce3cdf933541a719578712440f02a86829af1398fcab2bb0949c1d63106",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 55,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930e",
+          "shared" : "a3e86777a4263b4656733a65bf322d397199cda903588fc3754cb0e27901f5e29f115b511b94c831",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930f",
+          "shared" : "7dfd07c1cfe70db4772cf9f6bb6b58a10bbc9509e5ce86651d5c395f3544f62d6d8f8109edba441a",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 57,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000400000000000000000000000000000000000000000000000000000000000000000000000000000000d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e26",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000400000000000000000000000000000000000000000000000000000000000000000000000000000000d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200040000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200040000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000400000000000000000000000000000000000000000000000000000000000000000000000000000001d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e26",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000400000000000000000000000000000000000000000000000000000000000000000000000000000001d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2600000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2600000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e26d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e26",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e26d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2700000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2700000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e26",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "",
+          "public" : "3019301406072a8648ce3d020106092b2403030208010109030100",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "public point not on curve",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb28b",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 75,
+          "comment" : "public point = (0,0)",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 76,
+          "comment" : "order = -1763593322239166354161909842446019520889512772717686063760686124016784784845843468355685258203921",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee10229ff2ca1b8dfc943b0481ec387a12dfe1f9a0670305a4970ed5cd2b7d1381179a716796eaaa4bb3a6cef020101035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 77,
+          "comment" : "order = 0",
+          "public" : "3082014b3081f406072a8648ce3d02013081e8020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1020100020101035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 78,
+          "comment" : "order = 1",
+          "public" : "3082014b3081f406072a8648ce3d02013081e8020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1020101020101035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 79,
+          "comment" : "order = 410618568360611413177547474029944166748205379750040840301822434183392856467013123528027",
+          "public" : "308201713082011906072a8648ce3d02013082010c020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1022500d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b020101035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 80,
+          "comment" : "generator = (0,0)",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a60451040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311020101035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 81,
+          "comment" : "generator not on curve",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee3022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311020101035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 82,
+          "comment" : "cofactor = -1",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593110201ff035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 83,
+          "comment" : "cofactor = 0",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311020100035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 84,
+          "comment" : "cofactor = 2",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311020102035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 85,
+          "comment" : "cofactor = 1763593322239166354161909842446019520889512772717686063760686124016784784845843468355685258203921",
+          "public" : "3082019d3082014506072a8648ce3d020130820138020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 86,
+          "comment" : "cofactor = None",
+          "public" : "308201723082011a06072a8648ce3d02013082010d020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 87,
+          "comment" : "modified prime",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900bfd4cef07c157c860286264eb02a03e4bd57db899dfc714f55bcc71c32b829e7af670ba56e9c05d1305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510400000000000000000000000000237bc7178cc16000000000000000000000000000000000000001d54042dd00b5c5ebcbab5d16bfe9013cc20d177a3491ba0fd60ab4d1eafcb56a97a71827d8589de6c0022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593110201010352000400000000000000000000000000237bc7178cc16000000000000000000000000000000000000001d54042dd00b5c5ebcbab5d16bfe9013cc20d177a3491ba0fd60ab4d1eafcb56a97a71827d8589de6c0",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "98a5ab0e3aa9396e44e9a6cf836db0e622639dcead75c2b337487a303c1a100d6e9e8dc71c9c2162",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 88,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 89,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 90,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 91,
+          "comment" : "a = 0",
+          "public" : "3082014c3081f506072a8648ce3d02013081e9020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27302d04010004281c77c2abfaacfed15441047a89c6d600bb9a3c8aa864067cd4281901a411872412960f59881b9f010451044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311020101035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 92,
+          "comment" : "public key of order 3",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2730540428af4886c351055cf7c6fa21ca9e5dc359ba0c3f1e0ecbbcb92ffcf8fdbc41bdb16c6e664f3694bfed0428362f4d202fab54fd10a9625548eb00ab3208714a47f45e40fabed726cb8359b2e8006502917a08cc04510427b00b9931972240c947250be4f1be0fb5a4924fabb71cbd62c0fbb1d259c63231a910c351a06e3324f9ae52bf3eaae575faa8bf67396a5cb707a57f4098130d6ca1f09fc710545d5a94d861b1c58bf0022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593110201010352000427b00b9931972240c947250be4f1be0fb5a4924fabb71cbd62c0fbb1d259c63231a910c351a06e33ae6498cd777da4d26b41cf9f6ac8760942882a27b65bfae1e2f0c94cb18397cba23f3a503feda237",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "737c67f74a4f423480ba46d51e903dd18668491fd1ba6924143dfc45511e8be26c17fc3982a3052e",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 93,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004cbbced7d0d8fb5d17ed00a047fb60933d1716b5f120ca68abd92edc2eb4b22a1f8d0410966791ba8fc7a7558a3b220038d84088abbe19728",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b479d6c21efe1412dd59f04404ea05a8cd7fd74c41c4d2c1535bded83afb32b92c6105ac9ff9786bb20dce846922e69218ea79a89d73573add154272385ffe2b",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004788d64af48129627a1b87b999bc87c3a633321f6047f071587395dd7690fdd0b85c535c2d5ae157bf1a213b1ba452b38af8087cd933f3effa32c546948a7b79c9801399f5a5c7aeaedd6a8ba1355bb12152f01f060a9cfd32da747edd316417b",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400f3f8effa60bcf759f795e0fe77c6e5aa1014b78e92957f9de9ba5b4e7cb99c163c80db96cb28472d721d8f6f39aa738ffe55c7bbb78c54a8e465fc7c548353968700e2b278cb0688cbdae017de7bd98a73d04434058978a5bad558f20120cc230080762b717f5a9d17c1bb11ec6e80fec81f4775784ec9d17aa7e5b119dbec02233e92",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000486b290e29307ff43b3c81a48720c0e89a478b06d8c811b10c7ff3654aa33105244c37378866ef4920ef6099b596e95449788df3a2a8452ba922ba99e69346f54",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000459b150d0645424cf928844d1bbd532d8a8195960332da50cf9aa186480ffb0b58b64c4bd198525183852d127aa3742fe96df49bec7585aa4",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000489021ce82845fcefd942146ce35cad027ade8f821ddfad0ea831d1f6fe6980e60be917f848a4e7dbd3dea6035bbfa41d115fba98797862cbebf8087b7647fe89",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000437f59347ed0c8de4e888171eed280944742e5cd4246017c657a4daf94436f38f10a3076eac990493ea5ff93234662d9c3f7747a2fb2e14fb72bdc74d5d588cbacc0241cd7ac19fd8eead50526974e6ad56ac471cf7c21667b92ded8d714c79f6",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004a59f99993f8e3706eb6e104b638e8511c5b08e82344a6538528df723eb38ffe58c70197c8e88371f1d0c550e3bbbfe125c1123d5d0900c8164f9b19dc66fb34f45869a8aac9294587c6bfa261f401883a1844e71b83268e916ed6397c7df9542991437b705ac561cdcd0886409919b69cb12d36399df71e8e2414f1ff17111fb",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000471f4543326fb3cb36fe6471712c30b1e81e5d717bd1f2bf7136793728cba811d4bfdfa99dd5731911ee78d7010f6bc9e71a423d8d6823ec9",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200040b2ad117bdc9c839820852ff829d60cb51a6a10f0a72061ca27eead92113b1d98b98919105efdd2376669e8e8361571d3db8736777690a263f04dd2605a65225",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200042ddfda6a53e3aa3133a04c2ed9a3c36d3f390710ae781e2975c83701ea352f007b4f7a976ba322419d20d75300cdcf190a58942f9aab229a3dbfee185c3adb6ce9a4907b90cac0fa649c22cc2e17d48f",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200041768d368f882df7083b3d53987ba94d8720cbbc443e12700df5eb044d2f5621e8223a3ee3bd71b34f32e3afb5404e85a51cc7eaa1569ae4c555200a1b2df9c4adcdd6ec3d3de9abadf022da337b6f8873bb415e959e57b029850cdbbb38ab417",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200045ab89b3df599c3c1f1fbe4c15c0aac1ea95dd83f60623c2aaec3b9c31ba68d1f5a637758a7b8631d720f71d756a72c141e41afd508bf7ebcf9b6d1d4764768a66ffd7dd1d605daea2ba841d0a9106a22f1a630f272f906116c27fe3c3ff729d8516aaf0c3555e352ab69dc64f36e2d6320696b366bf0d07aac51ff9db3a480ec",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "invalid public key",
+          "public" : "3042301406072a8648ce3d020106092b2403030208010109032a000227f2f8f1cbc7ee440c167d52782f509b980e1da034c259f079fff653301ae28a88511e501836a7d6",
+          "private" : "0cdeaa01757954bf813fafec8356923518e410cc8778d88eac1a07f90b7fb4d20db28670e178b941c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 108,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3042301406072a8648ce3d020106092b2403030208010109032a0002cd873725ad5a0cb428ee170bbea7609f8e156a73c4ab18fd32bab9e41af3d36eaa5313a81f74e845",
+          "private" : "0b58eeb16a7f22f4562161ed8ea68ac86322d3db6e5d4fec50aae16d01129bf8c4d7530ff4d94a137",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 109,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3042301406072a8648ce3d020106092b2403030208010109032a00033fef766ef618b774a78e4d81e16e5a9afea06500eb0e366377d839bffceeed1c74e6caecdc9fbb21",
+          "private" : "0bdbee13a7eac096b33fe43b8adc4c0e5bab438faa6333570ffdeb05d2b3e95961f9d591f36882027",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 110,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3042301406072a8648ce3d020106092b2403030208010109032a00023fef766ef618b774a78e4d81e16e5a9afea06500eb0e366377d839bffceeed1c74e6caecdc9fbb21",
+          "private" : "0bdbee13a7eac096b33fe43b8adc4c0e5bab438faa6333570ffdeb05d2b3e95961f9d591f36882028",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 111,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3042301406072a8648ce3d020106092b2403030208010109032a0003cd873725ad5a0cb428ee170bbea7609f8e156a73c4ab18fd32bab9e41af3d36eaa5313a81f74e845",
+          "private" : "0b58eeb16a7f22f4562161ed8ea68ac86322d3db6e5d4fec50aae16d01129bf8c4d7530ff4d94a136",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 112,
+          "comment" : "long form encoding of length",
+          "public" : "30816a301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 113,
+          "comment" : "long form encoding of length",
+          "public" : "306b30811406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 114,
+          "comment" : "long form encoding of length",
+          "public" : "306b30150681072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 115,
+          "comment" : "long form encoding of length",
+          "public" : "306b301506072a8648ce3d02010681092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 116,
+          "comment" : "long form encoding of length",
+          "public" : "306b301406072a8648ce3d020106092b24030302080101090381520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 117,
+          "comment" : "length contains leading 0",
+          "public" : "3082006a301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 118,
+          "comment" : "length contains leading 0",
+          "public" : "306c3082001406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 119,
+          "comment" : "length contains leading 0",
+          "public" : "306c3016068200072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 120,
+          "comment" : "length contains leading 0",
+          "public" : "306c301606072a8648ce3d0201068200092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 121,
+          "comment" : "length contains leading 0",
+          "public" : "306c301406072a8648ce3d020106092b2403030208010109038200520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 122,
+          "comment" : "wrong length",
+          "public" : "306b301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 123,
+          "comment" : "wrong length",
+          "public" : "3069301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 124,
+          "comment" : "wrong length",
+          "public" : "306a301506072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 125,
+          "comment" : "wrong length",
+          "public" : "306a301306072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 126,
+          "comment" : "wrong length",
+          "public" : "306a301406082a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 127,
+          "comment" : "wrong length",
+          "public" : "306a301406062a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 128,
+          "comment" : "wrong length",
+          "public" : "306a301406072a8648ce3d0201060a2b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 129,
+          "comment" : "wrong length",
+          "public" : "306a301406072a8648ce3d020106082b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 130,
+          "comment" : "wrong length",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903530004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 131,
+          "comment" : "wrong length",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903510004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 132,
+          "comment" : "uint32 overflow in length",
+          "public" : "3085010000006a301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 133,
+          "comment" : "uint32 overflow in length",
+          "public" : "306f3085010000001406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 134,
+          "comment" : "uint32 overflow in length",
+          "public" : "306f3019068501000000072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 135,
+          "comment" : "uint32 overflow in length",
+          "public" : "306f301906072a8648ce3d0201068501000000092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 136,
+          "comment" : "uint32 overflow in length",
+          "public" : "306f301406072a8648ce3d020106092b2403030208010109038501000000520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 137,
+          "comment" : "uint64 overflow in length",
+          "public" : "308901000000000000006a301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 138,
+          "comment" : "uint64 overflow in length",
+          "public" : "3073308901000000000000001406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 139,
+          "comment" : "uint64 overflow in length",
+          "public" : "3073301d06890100000000000000072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 140,
+          "comment" : "uint64 overflow in length",
+          "public" : "3073301d06072a8648ce3d020106890100000000000000092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 141,
+          "comment" : "uint64 overflow in length",
+          "public" : "3073301406072a8648ce3d020106092b240303020801010903890100000000000000520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 142,
+          "comment" : "length = 2**31 - 1",
+          "public" : "30847fffffff301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 143,
+          "comment" : "length = 2**31 - 1",
+          "public" : "306e30847fffffff06072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 144,
+          "comment" : "length = 2**31 - 1",
+          "public" : "306e301806847fffffff2a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "length = 2**31 - 1",
+          "public" : "306e301806072a8648ce3d020106847fffffff2b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "length = 2**31 - 1",
+          "public" : "306e301406072a8648ce3d020106092b240303020801010903847fffffff0004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "length = 2**32 - 1",
+          "public" : "3084ffffffff301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "length = 2**32 - 1",
+          "public" : "306e3084ffffffff06072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "length = 2**32 - 1",
+          "public" : "306e30180684ffffffff2a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "length = 2**32 - 1",
+          "public" : "306e301806072a8648ce3d02010684ffffffff2b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "length = 2**32 - 1",
+          "public" : "306e301406072a8648ce3d020106092b24030302080101090384ffffffff0004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "length = 2**40 - 1",
+          "public" : "3085ffffffffff301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "length = 2**40 - 1",
+          "public" : "306f3085ffffffffff06072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "length = 2**40 - 1",
+          "public" : "306f30190685ffffffffff2a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "length = 2**40 - 1",
+          "public" : "306f301906072a8648ce3d02010685ffffffffff2b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "length = 2**40 - 1",
+          "public" : "306f301406072a8648ce3d020106092b24030302080101090385ffffffffff0004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3088ffffffffffffffff301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "length = 2**64 - 1",
+          "public" : "30723088ffffffffffffffff06072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3072301c0688ffffffffffffffff2a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3072301c06072a8648ce3d02010688ffffffffffffffff2b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3072301406072a8648ce3d020106092b24030302080101090388ffffffffffffffff0004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "incorrect length",
+          "public" : "30ff301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "incorrect length",
+          "public" : "306a30ff06072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "incorrect length",
+          "public" : "306a301406ff2a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "incorrect length",
+          "public" : "306a301406072a8648ce3d020106ff2b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "incorrect length",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903ff0004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "indefinite length without termination",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "indefinite length without termination",
+          "public" : "306a308006072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "indefinite length without termination",
+          "public" : "306a301406802a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "indefinite length without termination",
+          "public" : "306a301406072a8648ce3d020106802b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "indefinite length without termination",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903800004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "removing sequence",
+          "public" : "",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "removing sequence",
+          "public" : "305403520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "lonely sequence tag",
+          "public" : "30",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "lonely sequence tag",
+          "public" : "30553003520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "appending 0's to sequence",
+          "public" : "306c301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc90000",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "appending 0's to sequence",
+          "public" : "306c301606072a8648ce3d020106092b2403030208010109000003520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "prepending 0's to sequence",
+          "public" : "306c0000301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "prepending 0's to sequence",
+          "public" : "306c3016000006072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "appending unused 0's to sequence",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc90000",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "appending unused 0's to sequence",
+          "public" : "306c301406072a8648ce3d020106092b2403030208010109000003520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "appending null value to sequence",
+          "public" : "306c301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc90500",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "appending null value to sequence",
+          "public" : "306c301606072a8648ce3d020106092b2403030208010109050003520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "including garbage",
+          "public" : "306f498177306a301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "including garbage",
+          "public" : "306e2500306a301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "including garbage",
+          "public" : "306c306a301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc90004deadbeef",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "including garbage",
+          "public" : "306f3019498177301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "including garbage",
+          "public" : "306e30182500301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "including garbage",
+          "public" : "30723016301406072a8648ce3d020106092b24030302080101090004deadbeef03520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "including garbage",
+          "public" : "306f3019260c49817706072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "including garbage",
+          "public" : "306e3018260b250006072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "including garbage",
+          "public" : "3072301c260906072a8648ce3d02010004deadbeef06092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "including garbage",
+          "public" : "306f301906072a8648ce3d0201260e49817706092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "including garbage",
+          "public" : "306e301806072a8648ce3d0201260d250006092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "including garbage",
+          "public" : "3072301c06072a8648ce3d0201260b06092b24030302080101090004deadbeef03520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "including garbage",
+          "public" : "306f301406072a8648ce3d020106092b2403030208010109235749817703520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "including garbage",
+          "public" : "306e301406072a8648ce3d020106092b24030302080101092356250003520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "including garbage",
+          "public" : "3072301406072a8648ce3d020106092b2403030208010109235403520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc90004deadbeef",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "including undefined tags",
+          "public" : "3072aa00bb00cd00306a301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "including undefined tags",
+          "public" : "3070aa02aabb306a301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "including undefined tags",
+          "public" : "3072301caa00bb00cd00301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "including undefined tags",
+          "public" : "3070301aaa02aabb301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "including undefined tags",
+          "public" : "3072301c260faa00bb00cd0006072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "including undefined tags",
+          "public" : "3070301a260daa02aabb06072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "including undefined tags",
+          "public" : "3072301c06072a8648ce3d02012611aa00bb00cd0006092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "including undefined tags",
+          "public" : "3070301a06072a8648ce3d0201260faa02aabb06092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "including undefined tags",
+          "public" : "3072301406072a8648ce3d020106092b2403030208010109235aaa00bb00cd0003520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "including undefined tags",
+          "public" : "3070301406072a8648ce3d020106092b24030302080101092358aa02aabb03520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "truncated length of sequence",
+          "public" : "3081",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "truncated length of sequence",
+          "public" : "3056308103520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Replacing sequence with NULL",
+          "public" : "0500",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Replacing sequence with NULL",
+          "public" : "3056050003520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "changing tag value of sequence",
+          "public" : "2e6a301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "changing tag value of sequence",
+          "public" : "2f6a301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "changing tag value of sequence",
+          "public" : "316a301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "changing tag value of sequence",
+          "public" : "326a301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 217,
+          "comment" : "changing tag value of sequence",
+          "public" : "ff6a301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 218,
+          "comment" : "changing tag value of sequence",
+          "public" : "306a2e1406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 219,
+          "comment" : "changing tag value of sequence",
+          "public" : "306a2f1406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 220,
+          "comment" : "changing tag value of sequence",
+          "public" : "306a311406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 221,
+          "comment" : "changing tag value of sequence",
+          "public" : "306a321406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 222,
+          "comment" : "changing tag value of sequence",
+          "public" : "306aff1406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 223,
+          "comment" : "dropping value of sequence",
+          "public" : "3000",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 224,
+          "comment" : "dropping value of sequence",
+          "public" : "3056300003520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 225,
+          "comment" : "truncate sequence",
+          "public" : "3069301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadb",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 226,
+          "comment" : "truncate sequence",
+          "public" : "30691406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 227,
+          "comment" : "truncate sequence",
+          "public" : "3069301306072a8648ce3d020106092b2403030208010103520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 228,
+          "comment" : "truncate sequence",
+          "public" : "30693013072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 229,
+          "comment" : "indefinite length",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc90000",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 230,
+          "comment" : "indefinite length",
+          "public" : "306c308006072a8648ce3d020106092b2403030208010109000003520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 231,
+          "comment" : "indefinite length with truncated delimiter",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc900",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 232,
+          "comment" : "indefinite length with truncated delimiter",
+          "public" : "306b308006072a8648ce3d020106092b24030302080101090003520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 233,
+          "comment" : "indefinite length with additional element",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc905000000",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 234,
+          "comment" : "indefinite length with additional element",
+          "public" : "306e308006072a8648ce3d020106092b24030302080101090500000003520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 235,
+          "comment" : "indefinite length with truncated element",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9060811220000",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 236,
+          "comment" : "indefinite length with truncated element",
+          "public" : "3070308006072a8648ce3d020106092b240303020801010906081122000003520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 237,
+          "comment" : "indefinite length with garbage",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc90000fe02beef",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 238,
+          "comment" : "indefinite length with garbage",
+          "public" : "3070308006072a8648ce3d020106092b24030302080101090000fe02beef03520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 239,
+          "comment" : "indefinite length with nonempty EOC",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc90002beef",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 240,
+          "comment" : "indefinite length with nonempty EOC",
+          "public" : "306e308006072a8648ce3d020106092b24030302080101090002beef03520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 241,
+          "comment" : "prepend empty sequence",
+          "public" : "306c3000301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 242,
+          "comment" : "prepend empty sequence",
+          "public" : "306c3016300006072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 243,
+          "comment" : "append empty sequence",
+          "public" : "306c301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc93000",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 244,
+          "comment" : "append empty sequence",
+          "public" : "306c301606072a8648ce3d020106092b2403030208010109300003520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 245,
+          "comment" : "sequence of sequence",
+          "public" : "306c306a301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 246,
+          "comment" : "sequence of sequence",
+          "public" : "306c3016301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 247,
+          "comment" : "truncated sequence",
+          "public" : "3016301406072a8648ce3d020106092b2403030208010109",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 248,
+          "comment" : "truncated sequence",
+          "public" : "305f300906072a8648ce3d020103520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 249,
+          "comment" : "repeat element in sequence",
+          "public" : "3081be301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 250,
+          "comment" : "repeat element in sequence",
+          "public" : "3075301f06072a8648ce3d020106092b240303020801010906092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 251,
+          "comment" : "removing oid",
+          "public" : "3061300b06092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 252,
+          "comment" : "lonely oid tag",
+          "public" : "3062300c0606092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 253,
+          "comment" : "lonely oid tag",
+          "public" : "3060300a06072a8648ce3d02010603520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 254,
+          "comment" : "appending 0's to oid",
+          "public" : "306c301606092a8648ce3d0201000006092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 255,
+          "comment" : "appending 0's to oid",
+          "public" : "306c301606072a8648ce3d0201060b2b2403030208010109000003520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 256,
+          "comment" : "prepending 0's to oid",
+          "public" : "306c3016060900002a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 257,
+          "comment" : "prepending 0's to oid",
+          "public" : "306c301606072a8648ce3d0201060b00002b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 258,
+          "comment" : "appending unused 0's to oid",
+          "public" : "306c301606072a8648ce3d0201000006092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 259,
+          "comment" : "appending null value to oid",
+          "public" : "306c301606092a8648ce3d0201050006092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 260,
+          "comment" : "appending null value to oid",
+          "public" : "306c301606072a8648ce3d0201060b2b2403030208010109050003520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 261,
+          "comment" : "truncated length of oid",
+          "public" : "3063300d068106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 262,
+          "comment" : "truncated length of oid",
+          "public" : "3061300b06072a8648ce3d0201068103520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 263,
+          "comment" : "Replacing oid with NULL",
+          "public" : "3063300d050006092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 264,
+          "comment" : "Replacing oid with NULL",
+          "public" : "3061300b06072a8648ce3d0201050003520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 265,
+          "comment" : "changing tag value of oid",
+          "public" : "306a301404072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 266,
+          "comment" : "changing tag value of oid",
+          "public" : "306a301405072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 267,
+          "comment" : "changing tag value of oid",
+          "public" : "306a301407072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 268,
+          "comment" : "changing tag value of oid",
+          "public" : "306a301408072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 269,
+          "comment" : "changing tag value of oid",
+          "public" : "306a3014ff072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 270,
+          "comment" : "changing tag value of oid",
+          "public" : "306a301406072a8648ce3d020104092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 271,
+          "comment" : "changing tag value of oid",
+          "public" : "306a301406072a8648ce3d020105092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 272,
+          "comment" : "changing tag value of oid",
+          "public" : "306a301406072a8648ce3d020107092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 273,
+          "comment" : "changing tag value of oid",
+          "public" : "306a301406072a8648ce3d020108092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 274,
+          "comment" : "changing tag value of oid",
+          "public" : "306a301406072a8648ce3d0201ff092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 275,
+          "comment" : "dropping value of oid",
+          "public" : "3063300d060006092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 276,
+          "comment" : "dropping value of oid",
+          "public" : "3061300b06072a8648ce3d0201060003520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 277,
+          "comment" : "modify first byte of oid",
+          "public" : "306a30140607288648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 278,
+          "comment" : "modify first byte of oid",
+          "public" : "306a301406072a8648ce3d0201060929240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 279,
+          "comment" : "modify last byte of oid",
+          "public" : "306a301406072a8648ce3d028106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 280,
+          "comment" : "modify last byte of oid",
+          "public" : "306a301406072a8648ce3d020106092b240303020801018903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 281,
+          "comment" : "truncate oid",
+          "public" : "3069301306062a8648ce3d0206092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 282,
+          "comment" : "truncate oid",
+          "public" : "3069301306068648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 283,
+          "comment" : "truncate oid",
+          "public" : "3069301306072a8648ce3d020106082b2403030208010103520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 284,
+          "comment" : "truncate oid",
+          "public" : "3069301306072a8648ce3d02010608240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 285,
+          "comment" : "wrong oid",
+          "public" : "306d3017060a3262306530333032316106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 286,
+          "comment" : "wrong oid",
+          "public" : "3075301f061236303836343830313635303330343032303106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 287,
+          "comment" : "wrong oid",
+          "public" : "306b301506072a8648ce3d0201060a3262306530333032316103520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 288,
+          "comment" : "wrong oid",
+          "public" : "3073301d06072a8648ce3d0201061236303836343830313635303330343032303103520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 289,
+          "comment" : "longer oid",
+          "public" : "3073301d06103261383634386365336430323031303106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 290,
+          "comment" : "longer oid",
+          "public" : "3075301f06072a8648ce3d02010614326232343033303330323038303130313039303103520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 291,
+          "comment" : "oid with modified node",
+          "public" : "3071301b060e326138363438636533643032313106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 292,
+          "comment" : "oid with modified node",
+          "public" : "3079302306163261383634386365336430323838383038303830303106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 293,
+          "comment" : "oid with modified node",
+          "public" : "3073301d06072a8648ce3d0201061232623234303330333032303830313031313903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 294,
+          "comment" : "oid with modified node",
+          "public" : "307b302506072a8648ce3d0201061a326232343033303330323038303130313838383038303830303903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 295,
+          "comment" : "large integer in oid",
+          "public" : "308183302d0620326138363438636533643032383238303830383038303830383038303830303106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 296,
+          "comment" : "large integer in oid",
+          "public" : "308185302f06072a8648ce3d0201062432623234303330333032303830313031383238303830383038303830383038303830303903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 297,
+          "comment" : "oid with invalid node",
+          "public" : "3074301e0611326138363438636533643032303165303306092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 298,
+          "comment" : "oid with invalid node",
+          "public" : "306b301506082a808648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 299,
+          "comment" : "oid with invalid node",
+          "public" : "3076302006072a8648ce3d0201061532623234303330333032303830313031303965303303520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 300,
+          "comment" : "oid with invalid node",
+          "public" : "306b301506072a8648ce3d0201060a2b80240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 301,
+          "comment" : "lonely bit string tag",
+          "public" : "3017301406072a8648ce3d020106092b240303020801010903",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 302,
+          "comment" : "appending 0's to bit string",
+          "public" : "306c301406072a8648ce3d020106092b240303020801010903540004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc90000",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 303,
+          "comment" : "prepending 0's to bit string",
+          "public" : "306c301406072a8648ce3d020106092b2403030208010109035400000004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 304,
+          "comment" : "appending null value to bit string",
+          "public" : "306c301406072a8648ce3d020106092b240303020801010903540004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc90500",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 305,
+          "comment" : "truncated length of bit string",
+          "public" : "3018301406072a8648ce3d020106092b24030302080101090381",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 306,
+          "comment" : "Replacing bit string with NULL",
+          "public" : "3018301406072a8648ce3d020106092b24030302080101090500",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 307,
+          "comment" : "changing tag value of bit string",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010901520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 308,
+          "comment" : "changing tag value of bit string",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010902520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 309,
+          "comment" : "changing tag value of bit string",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010904520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 310,
+          "comment" : "changing tag value of bit string",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010905520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 311,
+          "comment" : "changing tag value of bit string",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109ff520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 312,
+          "comment" : "dropping value of bit string",
+          "public" : "3018301406072a8648ce3d020106092b24030302080101090300",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 313,
+          "comment" : "modify first byte of bit string",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520204ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 314,
+          "comment" : "modify last byte of bit string",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadb49",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 315,
+          "comment" : "truncate bit string",
+          "public" : "3069301406072a8648ce3d020106092b240303020801010903510004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadb",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 316,
+          "comment" : "truncate bit string",
+          "public" : "3069301406072a8648ce3d020106092b2403030208010109035104ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 317,
+          "comment" : "declaring bits as unused in a bit-string",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520104ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 318,
+          "comment" : "unused bits in a bit-string",
+          "public" : "306e301406072a8648ce3d020106092b240303020801010903562004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc901020304",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 319,
+          "comment" : "unused bits in empty bit-string",
+          "public" : "3019301406072a8648ce3d020106092b2403030208010109030103",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 320,
+          "comment" : "128 unused bits",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903528004ac311df3fe43c502239aad07f7db6a5ec622612069c225a626ed934f3e2b8be01b1153f2b30093b699fcbf3fd40498d79e3d43662c4971e5ffd7a5dae20393aead656246f11447920dcbdb8350fadbc9",
+          "private" : "0f1ba6ba3785be0466f050c17d4c935acd4694ed1d283c8df7a2cfb00f2e92d159213a5d5e5e25d2",
+          "shared" : "50e75ce38235c8052e159fb31421a486c9435207e36ac68da9e0ebf0df0b94aafdd57b25c6ee2fdf",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdh_brainpoolP384r1_test.json b/third_party/wycheproof/testvectors/ecdh_brainpoolP384r1_test.json
new file mode 100644
index 0000000..bee493a
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdh_brainpoolP384r1_test.json
@@ -0,0 +1,3511 @@
+{
+  "algorithm" : "ECDH",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "AddSubChain" : "The private key has a special value. Implementations using addition subtraction chains for the point multiplication may get the point at infinity as an intermediate result. See CVE_2017_10176",
+    "CompressedPoint" : "The point in the public key is compressed. Not every library supports points in compressed format.",
+    "InvalidAsn" : "The public key in this test uses an invalid ASN encoding. Some cases where the ASN parser is not strictly checking the ASN format are benign as long as the ECDH computation still returns the correct shared value.",
+    "InvalidPublic" : "The public key has been modified and is invalid. An implementation should always check whether the public key is valid and on the same curve as the private key. The test vector includes the shared secret computed with the original public key if the public point is on the curve of the private key. Generating a shared secret other than the one with the original key likely indicates that the bug is exploitable.",
+    "IsomorphicPublicKey" : "The public key in this test vector uses an isomorphic curve. Such isomorphisms are sometimes used to speed up implementations. For example the brainpool curves are using this.",
+    "ModifiedPrime" : "The modulus of the public key has been modified. The public point of the public key has been chosen so that it is both a point on both the curve of the modified public key and the private key.",
+    "UnnamedCurve" : "The public key does not use a named curve. RFC 3279 allows to encode such curves by explicitly encoding, the parameters of the curve equation, modulus, generator, order and cofactor. However, many crypto libraries only support named curves. Modifying some of the EC parameters and encoding the corresponding public key as an unnamed curve is a potential attack vector.",
+    "UnusedParam" : "A parameter that is typically not used for ECDH has been modified. Sometimes libraries ignore small differences between public and private key. For example, a library might ignore an incorrect cofactor in the public key. We consider ignoring such changes as acceptable as long as these differences do not change the outcome of the ECDH computation, i.e. as long as the computation is done on the curve from the private key.",
+    "WeakPublicKey" : "The vector contains a weak public key. The curve is not a named curve, the public key point has order 3 and has been chosen to be on the same curve as the private key. This test vector is used to check ECC implementations for missing steps in the verification of the public key.",
+    "WrongOrder" : "The order of the public key has been modified. If this order is used in a cryptographic primitive instead of the correct order then private keys may leak. E.g. ECDHC in BC 1.52 suffered from this."
+  },
+  "numberOfTests" : 329,
+  "header" : [],
+  "testGroups" : [
+    {
+      "curve" : "brainpoolP384r1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "normal case",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000470ffb350173256eb437b140365842397ebaf3611b6389596c1f17c5ff5ce5201f24f6985b8fe0890dcae54b2603dfb4087242aaf7b2d95b3199bfa03e8fce54ef680b57109847274db3b3a65512b7f832248e70b1030e95db6429589775c3346",
+          "private" : "24ddf0fbb41c28365d302dd9d26ff9c32c76c85fa8b9138a3ec621d0caff6de8a724b45d6fe0d9180044242b9f41c84b",
+          "shared" : "22522760edc39280ff3277b121e17e7539165e7c677a65c8d0dc8159111f8e5d3df7035fe8ce33ac0a0e047ed0842a92",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "compressed public key",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b0332000270ffb350173256eb437b140365842397ebaf3611b6389596c1f17c5ff5ce5201f24f6985b8fe0890dcae54b2603dfb40",
+          "private" : "24ddf0fbb41c28365d302dd9d26ff9c32c76c85fa8b9138a3ec621d0caff6de8a724b45d6fe0d9180044242b9f41c84b",
+          "shared" : "22522760edc39280ff3277b121e17e7539165e7c677a65c8d0dc8159111f8e5d3df7035fe8ce33ac0a0e047ed0842a92",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000456b0e00539a304e1dcaef00d90e1e851002c5cbb2e7a0cdde34700f242d52d607cd48498fe7668eeffadcf2418ea898e57677fe6703911e5de7c45f3e03eb179e3248008eff9f5ad5860c74d58a45b291c23bf8d5be285ec6e9fd67ece9b6692",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004038c59d90915563eb3fcb7f8f0b9b4cfcd279a2591695b5a3c64e3a1bda0eaa78e8f060727858fb074f2acc98efa48230e90a6199713cc07fc845d61744564cebfb1d157c39c4a01807bbf81a69caae69d6a9ef6c8547213ca98237f51406f90",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000427a570916684cea784b27082b31dcb149b40c9a0513794db6cc4951858d8b2d2a30c5bf09d590b2f17e5c1406e96e1cb047dba720e25f5729903e7164b2c73907db148bcf8aff649aa80715b067d88ce1bd2f380b55705cfc368d5a515bf6f91",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004279ffd6f54fe3847d3464b645a6f4243c49169b3494c61e20a0457ce93d6aa8535de70b5ca78fd7eff05fece3ac253c563e753d531fb070facb68418900016d66e1687e2daf8eb4b63b749a4283838694d3deeac3e79b9706e856fb7358fa0a2",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200047908c8d895ed9ef9a902951a3a45383d24d57e3beb47f84c58636abd646b905087b2a06e130428f59007866a2a638abd4af08091e7589dcfbe7e638f10b430a89ea26ad930019a227040ca43aa4d08651b7c0904c51a32f8d214b2f0f434e85d",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004402f58faf15b56dc448bb6eb752502d03783d7beccc3afdb5c44c0e305765109c95227e9d7e2e9c52177de0ed2f95baa062e400bfae4744a061199b3358030194e7f28d3ba748ff0260b1fee5d0844f8ce446dac263a54be950d389e0341b575",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000464a17ffb46ef3a321ba23f97740e489ed26e6f76b586344f69cc5c05656daea35719c8c6b4cb5d1c5d8eec6d6705efe477396a9265b9c71ad111855d879598ce31e9e95ce9395b751588c5d92a3aacb60d413c1bcc66e7b9cf663d30b8b00a2b",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "17cfae6c3851f2c5ca6badbbe2cf885662d6f7f09e74374f1c7c2245045c02443eeb57d8b43b463dabcc0221bc82abaa",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200045d86d2275f8e2c9d7c9232c48b41159b1e8e848d5e0986419c3b40b4a9b93d3d863efbad99c981c45bdd40bf3fd3e2b262ba8a5c36e3d948f2e9fbc4687fb5de4f4fb59e38bac3bca2e61179e08135e346e1febcf9bebe9bcd80768818806ac1",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "1b635895e1e2c809653471a1a1ce3460f76c7b06993c654ee2661011a5b88afecba16d6fff26a7709b7e59f93a9de703",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200045c1b9513766f017a401fed11a435a3ec55a8180dc280d7ccf7dab89f79499dba8e229361c2bc0f6406558db07218e2d361aa065e64cabb097b9da8ac73b568b4bcddb4e3d6acae8f681f68b02bbfe423c98a2d3e1d99eacedec4bf79bf278507",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "2d06d205cba6e20e97616b25730efc50433fb246da15642508f08dd4dc348e8379371588ac25fa39696968bfff4c76f6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000447ad5655229b6c8d3f328f00a10cb719c64c8a9942acaa6600da6f0da279d5e830fbe25c2891740b17dcbb22e5255a9314da410d402854ff72dd497ea0accbd367de04b2fc0c7b3378f2bb957e1638820f7ec3dd483fc80d7ee650ead7f0d06a",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "33a28df92842cc0a0d43e5d33e2d351e641258d505cbca1a686a2f8c513d7f945e78187eae188e65963270a075056e35",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200043673cc8f64b4f6651ce2b69e057db05f24c4c118e69665d8bf6e5774d0b2ba96ccc796f547cf2983b5d4c2055ecab75e51f4c4e99539747df8cb4ab36745fd3c60f16c7e83a1d3e15b44cfca1953929ead6af8398c43589e913ebc64753edb16",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "3bc08823776f7ee08b4f218f4bdb41e954e7e74abb2d319140c67b935706b1d1440b3da7000068ae55d56acb9746d4a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048c583d0413b24eaac4ec484348a3eb7059e37e8575dc2657ef2c0a1b03d320ee3638307022197eb40cfaa6c2465e7b272f027afad18da3d144091569110324707a8499902d327f97e3295feeb2752c0a6946dedf08e977d830c8e135f9ecc0bc",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "7ff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004349c8a1b4e986d3f814a0b14ebc416e58eb60c697af889d9eac3927e53791b589d1068b55902605c675ffbc1f11cefe576a8a077f4e5676b07a2e701adbdd15f78a3c04d365e654055ee88c4d007a97f5e6674e64750482c9dedcd24ae263e50",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "7ffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004572ed47e9ee31d2b2181f5c5562852c7f8ff7050f87dc688a64bc1ba0bf280fe55118f8f8c7f9c0db1e512680876e7ae87ddb0174be3d71ce5bda9cc024d04c8a82c002491b83415043bfbb1b372fbfaca27e0fbe9768fec5ec67c5fd7544817",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "7fffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200044ef2b05bf70e827c1fe64eddcc04cf1a416c032d155d3946bff2270701fece2ec1ae9725912cc4ed9a97f52b10a98ac12ae6e94bab916c5763812435f25a74be83aea508f537f9f8d67fe66f0e30ed3fc96ccba75d6ff46221816d8fca2b484c",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "7fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048c4ce75c1fb23e253d0fb0a1be67dde4b45a4e6763ae0794b5d24a37209b25ac2e95208ba397bdb01b459a11fc4cd89c07f43a664ea0fca116b66124a4fadc0b341cc3d7ec2da14bd5589642016f1076762a535145b6cda3f8bbce24c0ed9637",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "7fffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000470c6e0dceaf63c5b92c45b5f33f9ff049584b0b41ec1c476e50651d5ec56069490db561d97b1a2c2bebcb7b43c8001eb52b9feddb992f69e9e566ccabb69352cea294e1d2683d7046b9858569ab73576f2b42f11ad19cb41a96ea3d595fd0114",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "7fffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000471613b39cc9cad25b5c677dcf071de6308411a0f2c1066de803bfb68c5bff55c26e32afad0aacdbbc32af5dc5ff71b7e24684b4f59f7e82053d5c2eca45e1963d594cffe2829460659397e3e978b304daf785e81f1566bce2cadc49fdecaf37b",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144e54365091651eebe3aa1e13a14ec2c0dd1b1ad3778f69d586d078d7554c116a71e422add51cea477ce154ce873940e",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "55b4e89b8ca6cd3991c3578f8a970489d5fb1bd7b979cbfdadd1864b281afa73792c6e7baf938053fbaceeddaa5325f4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000316e6519bec6c43060842536dad3a68988e8427530b0f98765b9d0285eebdf461270a2ccbd4d0b352d4263b97281a15fa",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "87cc934265151b4fec1335793e6a7de98432d914b7321e2ba87bb215e4b8589e01d3d42707959c0f243474fe92305100",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200040000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0b8ce84c25219c7e4ff37a3728fbcdea683c45b156f4158423314fa879e9d49a02e1ec2e305d7f2f01162d2c60e2ad06",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "043edade91d4030be3409d8c989cf3aa79fb09efeb16877b18558dcaf46c1d2f7369f8583ca8350003e3836554af3ae2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000400000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff3e528e604dc03d7c658e1f5c4102e1d31ddeffafcc2f7d7a4816cec497a09a851f40ad616693013038c007697996de61",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "795ef5cc47dfbd544e1692809d7c853d8afa104d7d4438ede53bea15f6c60d23621e0ae248ea2a6c4e3a919e455c00a4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000200680b002d9adf1e053dbf04addddf8c58de920543e0614c976446db34269d5e218c121704a0acf35d776d0a14e294d",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "606dc06dcd00830bd42804dc43cb94ee78c1a5a35996ca4b49fb725433bd072e4b04e1c052d7340542cd08f1dbd79f31",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc000800204f1799aada7abdde3280f9638becb240be60123c91ad14cf1f7d77e83330519a68a9dd61a8d639e12a41ab930bc278b",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "82a6b7b9740a9e61a5f5d977dfcc655047eb415cbb98935fc24086b63fbc980b750eaecb5232ee97f770d1ede51ed81d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000417cfae6c3851f2c5ca6badbbe2cf885662d6f7f09e74374f1c7c2245045c02443eeb57d8b43b463dabcc0221bc82abaa206ce32ba9a9c83ec79f07a8e61a7a295486cb79c47942efd323cd9dbe140285bd0b064fcde0dc6e32036043e400cd61",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "40d2f675af9b7bcd5b8a7683f600e098b5dfc2681c0ce81a8c8d9ab0a15af157c4ebf3d04f52fa2242f05eb5cdb18894",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200041b635895e1e2c809653471a1a1ce3460f76c7b06993c654ee2661011a5b88afecba16d6fff26a7709b7e59f93a9de7031f4ea02c39fcbbbbfed4b88095f4dc0be21f360f5bbb6eebbe318c5667a2cae0db94a454db55578551616a2bdec461d7",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "858b9c88c4ceb57ea7195ca4fef5911de0b18c3bd6a46c23077c4dcb70c08534f50d44dfc1a2d2b805205e9d03382ab4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200042d06d205cba6e20e97616b25730efc50433fb246da15642508f08dd4dc348e8379371588ac25fa39696968bfff4c76f607eb107e35de143e39251c7fa593853952c55ac76c48899de9a6e03d984b24617fa89da4b60b8e8c70ad2ad50ea1d063",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "7817e822301ba68e0ce644acd45aba1b168ddd5995b97eb11fd1a22399bb8b84daf302f33ecfb87028dd8011eecbf95c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000433a28df92842cc0a0d43e5d33e2d351e641258d505cbca1a686a2f8c513d7f945e78187eae188e65963270a075056e3544e7e60cc04bcd8854cd27565eebe1c366081551800a3fee831d1493d4bae33e1c22dcbb9dc696603ded84a4318bea0a",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "64705403b5404883889cdafa366eb73797ae97bad283d2bddcd9bb2607eefee392cb9d04b4e99701fdbb0d27c1457a9c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200043bc08823776f7ee08b4f218f4bdb41e954e7e74abb2d319140c67b935706b1d1440b3da7000068ae55d56acb9746d4a600d0235df6f46e9fda7c162cdb7ed520224546e61469c011b6e8cfd70e179e85dd90449664cd8e79bd9fcff61bbe9bcd",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "4e5c219e6f94a524175415e6aa60d1757871d7b6cc6b2c501e053054f381b92dc4f5ac0adaf63e8f6739814e4302e824",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200047ff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff2b8c710e160b3fdacffca46bc22b0b7b58349ab2a4183931fdf9e0504685db3c40aa853607fbac52b3563e7c74516d61",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "714b4efbc12fe0460fd296c9868feac501d00b0536aa9269806208ba7fbd4f73ed0a26c89a0854e670e01db8088c3f6a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200047ffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff3e3943f5e92e4bff7f85ac915bdcc0865c97d0cce26f054df1b29c283a8f8e43d964b528dbcd88768b342995ff517f07",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "43da556c9e9e29940253310d94ca5707ca84a04e2cab890ca49f391747c5be283f0f4593247bce6f0027c2e2dfda8d30",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200047fffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff4214f53b46996183016065c615037a34f8bd346848d13c870e6f74a26e3cee631d4d689244a615983f6f8b9a4880f508",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "30229a314aa8ed9ceb2a9c3577558f6a9bd857747cb60a59815d2055bede53a570b461861229d832cf08642e9078d6ed",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200047fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff80000040000003c1234be1022b89c3a64f04102658fb8c319b6932edbce6b78b05f86841ede7eeccc2d091ed867c252f59a773c271e8f",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "2ccef9ba30b16e50663bb4e4006de04d5d687eb6f42d3dd821c8fcb2f57d67cf864c345fdf2de1fdc55fa486a16629f5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200047fffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff0587ff6f77b0abaf253ee363581e52b9aa55b50a59e2238414827e05c83861fd12356be4547b23443912acf07a02edc4",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "70382433ca7683741ba836dfb5983d3c80760bb7a985499d27ac7c715f8b7618877f651f8ff8d1bd7c1b1206f93754ac",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200047fffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff21510cae0c660490014dd608337b3f3afcd97aaa7d792e186375f12a7a1fca38126ec420034bd12da0cd051d2255f922",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "5bc26ebe1fdba661bd3125e2c681f591db5bfc63ca27e6ad49dd4f42e49561949046395c7b0fcb3e975689cc602dfbea",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012134018a6f7bb075ef67617abafd66a22ed8b5146408aa52fc17cf52510b85f08b73acd0b4301e9967b3cc20b914f805",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "170a1a6e3092ff8747b29d724bf794a839f2c06f3a71c323323f10cc48fadc5562101171f4f7a9e41638013c07a4fcc3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "3",
+          "shared" : "1a136db83c88ec1a705db70c310e685164acf6890c5628fb4004520739a30a015557d3d0fa8652d26af3621d8cfac529",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "4518e59c3325de9ff9ba5176cce02c2fdc5d47c4d71d7bc7f3ce1a860131f39a00b1c9806fe92feea4e15b505dbfa7ce",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "032ce3f060545bf89e05ef6cc03f04fdaf66ad01a93cc287675e2adcd6044eca1da4108d91e4c22df276d9ad7dc23548",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "5bf3778bd7335db843dcbf4fae46f184b18d95fce6afde98b47f62c89f61ee64bef7f7b273e4b391471d2c33e46bda32",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "2d5751d28414a73a5e2049ac38c01cbdb592e90ad4f1f2168c9ade2b8ca336bc965ee7b8cdd63207b3a8768c81fdae6d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc30f3b883202e9046565",
+          "shared" : "1ca753eb1a6f3a735f459a26c11c1c6f523d40918a41b1193b9342e0cd81c40a625c4c9cbb4d875b55db498b370b7b22",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b783202e9046565",
+          "shared" : "4be8f16ae1ff3cdb120f32c08e0a1c2c178e2dd7d9beba9fd17bab1994b44e2107aa248da4a18d45612891bd8a599b55",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b803202e9046565",
+          "shared" : "7b9679e9ef47700a484d65637a03834a2fa8557dafe5f470e4747bf5ac308ec53b16f83789ee63abd0ae7078422440a8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883201e9046565",
+          "shared" : "678fe10e74bcb45acc0146334418c1ff7512815f05146cccc147a73324de04c58cb87cbb00735cdc2695e7603998a0c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e904652f",
+          "shared" : "3729bcd215b41c658b832686c81362b3485d75b09478c6dde3b5e278564ef4162bdd6ff65afc6e8213bba9b6c54ba1eb",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 49,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e904654f",
+          "shared" : "12ba4622daf1f2f950aad6d54aaab821885a47a98573afea49bc1896041ee9501acef82810f3755ff284e16665bd0f62",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 50,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e904655f",
+          "shared" : "7fb5398519857f2c17cddd0a9d2c1660ac35b4723e4a049ba5c58c458b742dfa813a5c7175e1c0974b514bfaeb0039f8",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 51,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046562",
+          "shared" : "1a136db83c88ec1a705db70c310e685164acf6890c5628fb4004520739a30a015557d3d0fa8652d26af3621d8cfac529",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046563",
+          "shared" : "0f0a1d20ba6a7b2c48154b43870be4890979d9261950736de96c29f371233b1ef94a79c2ab698868f00cea7e912deb94",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 53,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec52",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec52",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec52000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec52000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec528cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec52",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec528cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec538cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec52",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec538cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "",
+          "public" : "3019301406072a8648ce3d020106092b240303020801010b030100",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "public point not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3ca",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 71,
+          "comment" : "public point = (0,0)",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 72,
+          "comment" : "order = -21659270770119316173069236842332604979796116387017648600075645274821611501358515537962695117368903252229601718723941",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c53150231ff7346e17d5cc792d7f0a29081af19be20ead08ef612aba94ce0e9919353fbda5830c5495094803cefc477cdfd16fb9a9b020101036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 73,
+          "comment" : "order = 0",
+          "public" : "308201853082011d06072a8648ce3d020130820110020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c5315020100020101036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 74,
+          "comment" : "order = 1",
+          "public" : "308201853082011d06072a8648ce3d020130820110020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c5315020101020101036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 75,
+          "comment" : "order = 5042941954480324912133914614639385831494842746066313376667826733277554507683616955290244686736004252971522",
+          "public" : "308201b13082014906072a8648ce3d02013082013c020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c5315022d008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202020101036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 76,
+          "comment" : "generator = (0,0)",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565020101036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 77,
+          "comment" : "generator not on curve",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c53170231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565020101036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 78,
+          "comment" : "cofactor = -1",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c53150231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650201ff036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 79,
+          "comment" : "cofactor = 0",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c53150231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565020100036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 80,
+          "comment" : "cofactor = 2",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c53150231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565020102036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 81,
+          "comment" : "cofactor = 21659270770119316173069236842332604979796116387017648600075645274821611501358515537962695117368903252229601718723941",
+          "public" : "308201e53082017d06072a8648ce3d020130820170020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c53150231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 82,
+          "comment" : "cofactor = None",
+          "public" : "308201b23082014a06072a8648ce3d02013082013d020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c53150231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 83,
+          "comment" : "modified prime",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d010102310086794027ec8b4fb52f3941d2981a6badcd5cba8307663d051fa6101f193ed726450df412ccfc38b593cc92eab76cfa4b306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c1104610400000000000000000000000000000000abc978d6d096000000000000000000000000000000000000000000000000007a1da7cd48cc78aa2aee262add59969c80d1d577d80c7a670aca818562da8fdda841f80ce27ba0138ddc986e41b23bb2420231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650201010362000400000000000000000000000000000000abc978d6d096000000000000000000000000000000000000000000000000007a1da7cd48cc78aa2aee262add59969c80d1d577d80c7a670aca818562da8fdda841f80ce27ba0138ddc986e41b23bb242",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "1292e4072996602fbc1877e2168c63da918a81a686f2d80aa6e2dad912b429945a02c456e3c85479a7129f43d53ecde8",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 84,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 85,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 86,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 87,
+          "comment" : "a = 0",
+          "public" : "308201863082011e06072a8648ce3d020130820111020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53303504010004306e2a04dd503c3e87cb98a8d5425f32579b0a5a9ad12ec3e33249c1692619d0c661f539c8c86210ea713d8f1538c64f600461042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c80231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565020101036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 88,
+          "comment" : "public key of order 3",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec5330640430686f89a6b49d9db793fa2c3c7add2830adfb312f2555431178230ff67b44c537786dd2965c5ee252d5dfb3172c5f92fd04307e8f5ac298879503d08d326fc844cfe08c7543bad19710925453fb92074729228c08c26b874b704a481c9635f26942080461044e5e0bfa0ff1b722079a7ee86b907ed3b0874ed1df5827c178cba5e08b67e33d14fbcba165114f041c5101fbf1082ff6736b684d8cf98b68f482940acf5e00140476f12699002de19f0d1af28661c5fed8b35127a866c592466a63d53c1b2d170231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565020101036200044e5e0bfa0ff1b722079a7ee86b907ed3b0874ed1df5827c178cba5e08b67e33d14fbcba165114f041c5101fbf1082ff6194db635163ee1bf1adadb73818841cb10b87fe3545428d273a4bf26f9554b24d4205601e7b654df40dc9c3df4ecbf3c",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "1a383437919f65cf625a04633cabbc1a7a0a42b55b00a22185bc723f4d5f516af84d0dc9e86a62e5e475660ed6037b12",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 89,
+          "comment" : "public key on isomorphic curve brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200046a2aac186356f68786c8ca5be5e56c951d2992561bbd094d6796730ff67b33249a93a53455f8291e112199a10fa7fd2d8c4b85d644688724dfd1726f1e368455e5eb300f479a2ffc556c53bce3ee3b7d522db81303ea97ff13f6e7f2812b1ebb",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "IsomorphicPublicKey",
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 90,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00041d8d7078f45444e91bca0c6cc778f1fe321d1ab171bb011aac8edfefea7d996a11d1bdfb073924f453148c38c6de594981b4d8bfe33c27af",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044e00275706e6ca58a0a7bc864b67df419408a9d8f5ade6527a1c50238891bc68617d1e8777d528e7561a1c1ed6ed2caf8e103858e76e391b42957d8287adb06f",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b810400220362000459e0d3a39a0251cc1bcde05e330e6ee8a24a2175b85f67eec54d2f4c82d9655013bd53d4b4aaf537749e623c194979504e6abba9547065ce759e95282edd690c569ddbdae460b607510715ba17dc4323144d9492d65d0c0fc1a93fc92b34af08",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040089e14bf28c88676902c1191f0a2ac25e5c71114ded6120b483e93d1d065ab29f8fb895a701862df5a72d922f48ce27ca8b642184e8076ab6b6b032d71a8839cd7901329967bf36ad29a7b6ac74d97c8f47c66e32f9b029964fbca95c992e76c37b6cd45f5dfa2d16f83e3ba6416c54298dbeb0fbf1e663c14cf22a5915d4fcff66b108",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200045ade136fefe3cdb4461461a47ae7eb366531ae5d7fc1bb994328f2345c151c0dfb46dab78c5ae0570d9032c59268e3603cfdce83c7fd347c5fc79dff10a755a4",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000474976e5c913333e7c095a8a6b66bd3c78abb0894ce5598fe00761d927cc78f555570a628ed26dbb2105e014ed23a19b12b162a1d19cee785",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200045b204fcb4b2f92310bc19e8d4951c7884de3962fefbbec16cc1e9758d7ccaa1da8a4f202076b5515e46f36a2c8a513f8e1e18c7e42007e6ad4dff5e0ab0737a5",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000423a0440fc8d87b1b799f4b91791f3f5175b5b103f5ed4ed352a92f6c2d5fdda8ea07e9a5592afd2f85557310983058b60f777a8b88632f7127a29d4e949a4834f34db5150023d819a2b5fd7a6ba1561f",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200043d5b219486463a71ff9296216bce6a7b0ab091447f61f96c98739ad6bccb42a9b74b384f07d3755ec54c58c00db9429ea5bc1691362f3c12bfe41f8c4a1d738d1fbdd1e9da8e3c783157052dbaef82b87829db3c90761de50e07910e773ad21b4ec81dee16dbb8bf50d7f64abb3451ecfb985cca4725ad66eb15fcbc28f31310",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004ca475ba8be87df96495320a6912ed35f3ae5b5a5dbe170a24aac2e6ea7febb3f1088082ec1fd1d4f5a509c7b05793b2d0f17e611e1579407",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004a91eb1462fbd71d6d4dde4bcfc5a80e53e61ade709b5eb384b6661f0dfa796f91a45b825213d3215b32fac6faf19506887f84fe933066e3e97c906feac9e41b2",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200046fd0e50e88a56f131daf8f7ec8e2b44ab796d0491f77c7db01e7a9d872dc7c54913ee8ec683efec969820e7ed431dcb1feded773d12f8c1a17d164e9873a69c0592f5df135f16534e69983199c472edf",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c0362000411144203a5580501cf2229967282251f35cc66ebb978c8c5df821b11e36f95d6bac1c6f97b8e8d026e88cc2a24fec16b43714b10baa062a06712898730548a9a2290a984ef9a85d2eff128901dc0f16bc57231d21de65e42f84e42a409428eeb",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200041daebcad055304d190eb662059f41e6e1eb11b7b73d69cd72f74c78756d1219498f667f43e6e0a7fe1dc57cb1a4fbbe8a57646924b8ede193f26b49d9db53c9a98ae0b30895690181d71459ab3c1f3b3f1add63a639edcfb549849a953be3f4bc9fa5d75fb889d49a2f25e8de94cfe714987aa2077ba7f2b2c084f05a6272ab7",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "invalid public key",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b0332000266b87a19f47d772130855c64f1c1e445b19de6f917bb1c74198ecda924714d8c48e0cbeaa717453408c31c220a677693",
+          "private" : "3c9f970f25e6951b2953dc37f5458d5e11176fb794bb443c677ab6638d008eb35acfe85d09fe70400cd52bb47da13e88",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 105,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b03320003878663e0db7b8f0bf1f6f24f15160f0589da8f8f92ec000a57657321c6e3c4ec845c97536fd10cad1adc6e1341968dd0",
+          "private" : "084a6fb1f3f3c583d09224965f5a96d7fb9b44bfdaa15d02a5cf7c90e321178018a5cdee93f614ead731692e71918dbf3",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 106,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b03320002867e44d486465a25b827992e1de40cd6eaa276abbcaa852db4234bb3c5fa9f1c6956daf846845fe4862c025882878783",
+          "private" : "58c9afa82e35c64357c13f5f2efc4f9cbd0e65f718e70a9c6c77e73bd7f905ab7dffc4c82316a887e1bd625fa4fb715f",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 107,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b03320002041849139e191747f15e6b8f92462e731ae0c57c408b1e12ab1bffe434081033780b92b5ac81862263117a0836d180f5",
+          "private" : "0c7b7597b1fc8f4f69b90cb164a4295dd5b8bb3d7fee4588fcee79f2fa62c07c2cc35ac68714389e17c3a4b8e8a07dbf",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 108,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b03320003041849139e191747f15e6b8f92462e731ae0c57c408b1e12ab1bffe434081033780b92b5ac81862263117a0836d180f5",
+          "private" : "0c7b7597b1fc8f4f69b90cb164a4295dd5b8bb3d7fee4588fcee79f2fa62c07c2cc35ac68714389e17c3a4b8e8a07dbe",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 109,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b03320003867e44d486465a25b827992e1de40cd6eaa276abbcaa852db4234bb3c5fa9f1c6956daf846845fe4862c025882878783",
+          "private" : "58c9afa82e35c64357c13f5f2efc4f9cbd0e65f718e70a9c6c77e73bd7f905ab7dffc4c82316a887e1bd625fa4fb715e",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 110,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b03320002878663e0db7b8f0bf1f6f24f15160f0589da8f8f92ec000a57657321c6e3c4ec845c97536fd10cad1adc6e1341968dd0",
+          "private" : "084a6fb1f3f3c583d09224965f5a96d7fb9b44bfdaa15d02a5cf7c90e321178018a5cdee93f614ead731692e71918dbf4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 111,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b033200027d965d604aad48774b0c68abb9febff3cab818ea4890bcb616938556828ab77dea4a0847ad8d61eb43d845c9ec241cbc",
+          "private" : "37fb984a7a821d5a3660a951b19f88b2a95dfc6884e029bc5d99251d9b2d1ff88c57e0f9dab94bd0fa13221a1540ca2d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 112,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b0332000311455b9d356978751548ed9ba361f672c40215fe873e5b27770ece7d60701fbf07e3f95ab38857eb8785de02b69c356c",
+          "private" : "5e7ba1f7812005953291c6e5a7236abf5dcb32addc97fa40d06a6fc7a2a1999a93b1d224ef85e3327d7d2b3f7d909e3e",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 113,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b033200035349860144ee64859a8b0174c95e5f91f357cd38b26d2bafeb49dbd912cd4804f1dc04c0707199e113089f1df253a629",
+          "private" : "6fc580974437283ea60899aa7d4c817ea81d5332a86bd9af5ba2fb0e0c7c41b7a523ccddca46dde61b1809c970f17221",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 114,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b03320003705965409ec374f74c51ead3609443cef7db7c879c41db0e28e1656e26b236b74b99f950689ffab717d24c8f979f5231",
+          "private" : "0806f6eb807a213930b60443ba0164d22985b70a2034edb59c35639f52d8e4dd93ec589a83ee9000e8813da131f59a46c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 115,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b033200028af704d3911fa5a7a5f6ce54856465cae4f2eac69c84d2dfb1ae160b8dcd3b577949c97239e2e420896481c76b5a4465",
+          "private" : "2e59b6c0ee75135d8df12b9537d6f00b5281585166a77075858c5e9058a8dbdc4a4b8d7cdb23cda2429e069ad19be3e5",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 116,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b033200038af704d3911fa5a7a5f6ce54856465cae4f2eac69c84d2dfb1ae160b8dcd3b577949c97239e2e420896481c76b5a4465",
+          "private" : "2e59b6c0ee75135d8df12b9537d6f00b5281585166a77075858c5e9058a8dbdc4a4b8d7cdb23cda2429e069ad19be3e4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 117,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b03320002705965409ec374f74c51ead3609443cef7db7c879c41db0e28e1656e26b236b74b99f950689ffab717d24c8f979f5231",
+          "private" : "0806f6eb807a213930b60443ba0164d22985b70a2034edb59c35639f52d8e4dd93ec589a83ee9000e8813da131f59a46d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 118,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b033200025349860144ee64859a8b0174c95e5f91f357cd38b26d2bafeb49dbd912cd4804f1dc04c0707199e113089f1df253a629",
+          "private" : "6fc580974437283ea60899aa7d4c817ea81d5332a86bd9af5ba2fb0e0c7c41b7a523ccddca46dde61b1809c970f17222",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 119,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b0332000211455b9d356978751548ed9ba361f672c40215fe873e5b27770ece7d60701fbf07e3f95ab38857eb8785de02b69c356c",
+          "private" : "5e7ba1f7812005953291c6e5a7236abf5dcb32addc97fa40d06a6fc7a2a1999a93b1d224ef85e3327d7d2b3f7d909e3f",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 120,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b033200037d965d604aad48774b0c68abb9febff3cab818ea4890bcb616938556828ab77dea4a0847ad8d61eb43d845c9ec241cbc",
+          "private" : "37fb984a7a821d5a3660a951b19f88b2a95dfc6884e029bc5d99251d9b2d1ff88c57e0f9dab94bd0fa13221a1540ca2c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 121,
+          "comment" : "long form encoding of length",
+          "public" : "30817a301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 122,
+          "comment" : "long form encoding of length",
+          "public" : "307b30811406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 123,
+          "comment" : "long form encoding of length",
+          "public" : "307b30150681072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 124,
+          "comment" : "long form encoding of length",
+          "public" : "307b301506072a8648ce3d02010681092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 125,
+          "comment" : "long form encoding of length",
+          "public" : "307b301406072a8648ce3d020106092b240303020801010b03816200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 126,
+          "comment" : "length contains leading 0",
+          "public" : "3082007a301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 127,
+          "comment" : "length contains leading 0",
+          "public" : "307c3082001406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 128,
+          "comment" : "length contains leading 0",
+          "public" : "307c3016068200072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 129,
+          "comment" : "length contains leading 0",
+          "public" : "307c301606072a8648ce3d0201068200092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 130,
+          "comment" : "length contains leading 0",
+          "public" : "307c301406072a8648ce3d020106092b240303020801010b0382006200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 131,
+          "comment" : "wrong length",
+          "public" : "307b301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 132,
+          "comment" : "wrong length",
+          "public" : "3079301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 133,
+          "comment" : "wrong length",
+          "public" : "307a301506072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 134,
+          "comment" : "wrong length",
+          "public" : "307a301306072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 135,
+          "comment" : "wrong length",
+          "public" : "307a301406082a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 136,
+          "comment" : "wrong length",
+          "public" : "307a301406062a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 137,
+          "comment" : "wrong length",
+          "public" : "307a301406072a8648ce3d0201060a2b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 138,
+          "comment" : "wrong length",
+          "public" : "307a301406072a8648ce3d020106082b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 139,
+          "comment" : "wrong length",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036300048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 140,
+          "comment" : "wrong length",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036100048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 141,
+          "comment" : "uint32 overflow in length",
+          "public" : "3085010000007a301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 142,
+          "comment" : "uint32 overflow in length",
+          "public" : "307f3085010000001406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 143,
+          "comment" : "uint32 overflow in length",
+          "public" : "307f3019068501000000072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 144,
+          "comment" : "uint32 overflow in length",
+          "public" : "307f301906072a8648ce3d0201068501000000092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "uint32 overflow in length",
+          "public" : "307f301406072a8648ce3d020106092b240303020801010b0385010000006200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "uint64 overflow in length",
+          "public" : "308901000000000000007a301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "uint64 overflow in length",
+          "public" : "308183308901000000000000001406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "uint64 overflow in length",
+          "public" : "308183301d06890100000000000000072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "uint64 overflow in length",
+          "public" : "308183301d06072a8648ce3d020106890100000000000000092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "uint64 overflow in length",
+          "public" : "308183301406072a8648ce3d020106092b240303020801010b038901000000000000006200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "length = 2**31 - 1",
+          "public" : "30847fffffff301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "length = 2**31 - 1",
+          "public" : "307e30847fffffff06072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "length = 2**31 - 1",
+          "public" : "307e301806847fffffff2a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "length = 2**31 - 1",
+          "public" : "307e301806072a8648ce3d020106847fffffff2b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "length = 2**31 - 1",
+          "public" : "307e301406072a8648ce3d020106092b240303020801010b03847fffffff00048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "length = 2**32 - 1",
+          "public" : "3084ffffffff301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "length = 2**32 - 1",
+          "public" : "307e3084ffffffff06072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "length = 2**32 - 1",
+          "public" : "307e30180684ffffffff2a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "length = 2**32 - 1",
+          "public" : "307e301806072a8648ce3d02010684ffffffff2b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "length = 2**32 - 1",
+          "public" : "307e301406072a8648ce3d020106092b240303020801010b0384ffffffff00048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "length = 2**40 - 1",
+          "public" : "3085ffffffffff301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "length = 2**40 - 1",
+          "public" : "307f3085ffffffffff06072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "length = 2**40 - 1",
+          "public" : "307f30190685ffffffffff2a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "length = 2**40 - 1",
+          "public" : "307f301906072a8648ce3d02010685ffffffffff2b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "length = 2**40 - 1",
+          "public" : "307f301406072a8648ce3d020106092b240303020801010b0385ffffffffff00048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3088ffffffffffffffff301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3081823088ffffffffffffffff06072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "length = 2**64 - 1",
+          "public" : "308182301c0688ffffffffffffffff2a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "length = 2**64 - 1",
+          "public" : "308182301c06072a8648ce3d02010688ffffffffffffffff2b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "length = 2**64 - 1",
+          "public" : "308182301406072a8648ce3d020106092b240303020801010b0388ffffffffffffffff00048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "incorrect length",
+          "public" : "30ff301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "incorrect length",
+          "public" : "307a30ff06072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "incorrect length",
+          "public" : "307a301406ff2a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "incorrect length",
+          "public" : "307a301406072a8648ce3d020106ff2b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "incorrect length",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03ff00048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "indefinite length without termination",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "indefinite length without termination",
+          "public" : "307a308006072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "indefinite length without termination",
+          "public" : "307a301406802a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "indefinite length without termination",
+          "public" : "307a301406072a8648ce3d020106802b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "indefinite length without termination",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b038000048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "removing sequence",
+          "public" : "",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "removing sequence",
+          "public" : "3064036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "lonely sequence tag",
+          "public" : "30",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "lonely sequence tag",
+          "public" : "306530036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "appending 0's to sequence",
+          "public" : "307c301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd0000",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "appending 0's to sequence",
+          "public" : "307c301606072a8648ce3d020106092b240303020801010b0000036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "prepending 0's to sequence",
+          "public" : "307c0000301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "prepending 0's to sequence",
+          "public" : "307c3016000006072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "appending unused 0's to sequence",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd0000",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "appending unused 0's to sequence",
+          "public" : "307c301406072a8648ce3d020106092b240303020801010b0000036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "appending null value to sequence",
+          "public" : "307c301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd0500",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "appending null value to sequence",
+          "public" : "307c301606072a8648ce3d020106092b240303020801010b0500036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "including garbage",
+          "public" : "307f498177307a301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "including garbage",
+          "public" : "307e2500307a301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "including garbage",
+          "public" : "307c307a301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd0004deadbeef",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "including garbage",
+          "public" : "307f3019498177301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "including garbage",
+          "public" : "307e30182500301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "including garbage",
+          "public" : "3081823016301406072a8648ce3d020106092b240303020801010b0004deadbeef036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "including garbage",
+          "public" : "307f3019260c49817706072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "including garbage",
+          "public" : "307e3018260b250006072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "including garbage",
+          "public" : "308182301c260906072a8648ce3d02010004deadbeef06092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "including garbage",
+          "public" : "307f301906072a8648ce3d0201260e49817706092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "including garbage",
+          "public" : "307e301806072a8648ce3d0201260d250006092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "including garbage",
+          "public" : "308182301c06072a8648ce3d0201260b06092b240303020801010b0004deadbeef036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "including garbage",
+          "public" : "307f301406072a8648ce3d020106092b240303020801010b2367498177036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "including garbage",
+          "public" : "307e301406072a8648ce3d020106092b240303020801010b23662500036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "including garbage",
+          "public" : "308182301406072a8648ce3d020106092b240303020801010b2364036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd0004deadbeef",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "including undefined tags",
+          "public" : "308182aa00bb00cd00307a301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "including undefined tags",
+          "public" : "308180aa02aabb307a301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "including undefined tags",
+          "public" : "308182301caa00bb00cd00301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "including undefined tags",
+          "public" : "308180301aaa02aabb301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "including undefined tags",
+          "public" : "308182301c260faa00bb00cd0006072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "including undefined tags",
+          "public" : "308180301a260daa02aabb06072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "including undefined tags",
+          "public" : "308182301c06072a8648ce3d02012611aa00bb00cd0006092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "including undefined tags",
+          "public" : "308180301a06072a8648ce3d0201260faa02aabb06092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "including undefined tags",
+          "public" : "308182301406072a8648ce3d020106092b240303020801010b236aaa00bb00cd00036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 217,
+          "comment" : "including undefined tags",
+          "public" : "308180301406072a8648ce3d020106092b240303020801010b2368aa02aabb036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 218,
+          "comment" : "truncated length of sequence",
+          "public" : "3081",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 219,
+          "comment" : "truncated length of sequence",
+          "public" : "30663081036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 220,
+          "comment" : "Replacing sequence with NULL",
+          "public" : "0500",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 221,
+          "comment" : "Replacing sequence with NULL",
+          "public" : "30660500036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 222,
+          "comment" : "changing tag value of sequence",
+          "public" : "2e7a301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 223,
+          "comment" : "changing tag value of sequence",
+          "public" : "2f7a301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 224,
+          "comment" : "changing tag value of sequence",
+          "public" : "317a301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 225,
+          "comment" : "changing tag value of sequence",
+          "public" : "327a301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 226,
+          "comment" : "changing tag value of sequence",
+          "public" : "ff7a301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 227,
+          "comment" : "changing tag value of sequence",
+          "public" : "307a2e1406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 228,
+          "comment" : "changing tag value of sequence",
+          "public" : "307a2f1406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 229,
+          "comment" : "changing tag value of sequence",
+          "public" : "307a311406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 230,
+          "comment" : "changing tag value of sequence",
+          "public" : "307a321406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 231,
+          "comment" : "changing tag value of sequence",
+          "public" : "307aff1406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 232,
+          "comment" : "dropping value of sequence",
+          "public" : "3000",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 233,
+          "comment" : "dropping value of sequence",
+          "public" : "30663000036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 234,
+          "comment" : "truncate sequence",
+          "public" : "3079301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 235,
+          "comment" : "truncate sequence",
+          "public" : "30791406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 236,
+          "comment" : "truncate sequence",
+          "public" : "3079301306072a8648ce3d020106092b24030302080101036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 237,
+          "comment" : "truncate sequence",
+          "public" : "30793013072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 238,
+          "comment" : "indefinite length",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd0000",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 239,
+          "comment" : "indefinite length",
+          "public" : "307c308006072a8648ce3d020106092b240303020801010b0000036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 240,
+          "comment" : "indefinite length with truncated delimiter",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd00",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 241,
+          "comment" : "indefinite length with truncated delimiter",
+          "public" : "307b308006072a8648ce3d020106092b240303020801010b00036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 242,
+          "comment" : "indefinite length with additional element",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd05000000",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 243,
+          "comment" : "indefinite length with additional element",
+          "public" : "307e308006072a8648ce3d020106092b240303020801010b05000000036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 244,
+          "comment" : "indefinite length with truncated element",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd060811220000",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 245,
+          "comment" : "indefinite length with truncated element",
+          "public" : "308180308006072a8648ce3d020106092b240303020801010b060811220000036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 246,
+          "comment" : "indefinite length with garbage",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd0000fe02beef",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 247,
+          "comment" : "indefinite length with garbage",
+          "public" : "308180308006072a8648ce3d020106092b240303020801010b0000fe02beef036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 248,
+          "comment" : "indefinite length with nonempty EOC",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd0002beef",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 249,
+          "comment" : "indefinite length with nonempty EOC",
+          "public" : "307e308006072a8648ce3d020106092b240303020801010b0002beef036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 250,
+          "comment" : "prepend empty sequence",
+          "public" : "307c3000301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 251,
+          "comment" : "prepend empty sequence",
+          "public" : "307c3016300006072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 252,
+          "comment" : "append empty sequence",
+          "public" : "307c301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd3000",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 253,
+          "comment" : "append empty sequence",
+          "public" : "307c301606072a8648ce3d020106092b240303020801010b3000036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 254,
+          "comment" : "sequence of sequence",
+          "public" : "307c307a301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 255,
+          "comment" : "sequence of sequence",
+          "public" : "307c3016301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 256,
+          "comment" : "truncated sequence",
+          "public" : "3016301406072a8648ce3d020106092b240303020801010b",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 257,
+          "comment" : "truncated sequence",
+          "public" : "306f300906072a8648ce3d0201036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 258,
+          "comment" : "repeat element in sequence",
+          "public" : "3081de301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 259,
+          "comment" : "repeat element in sequence",
+          "public" : "308185301f06072a8648ce3d020106092b240303020801010b06092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 260,
+          "comment" : "removing oid",
+          "public" : "3071300b06092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 261,
+          "comment" : "lonely oid tag",
+          "public" : "3072300c0606092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 262,
+          "comment" : "lonely oid tag",
+          "public" : "3070300a06072a8648ce3d020106036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 263,
+          "comment" : "appending 0's to oid",
+          "public" : "307c301606092a8648ce3d0201000006092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 264,
+          "comment" : "appending 0's to oid",
+          "public" : "307c301606072a8648ce3d0201060b2b240303020801010b0000036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 265,
+          "comment" : "prepending 0's to oid",
+          "public" : "307c3016060900002a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 266,
+          "comment" : "prepending 0's to oid",
+          "public" : "307c301606072a8648ce3d0201060b00002b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 267,
+          "comment" : "appending unused 0's to oid",
+          "public" : "307c301606072a8648ce3d0201000006092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 268,
+          "comment" : "appending null value to oid",
+          "public" : "307c301606092a8648ce3d0201050006092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 269,
+          "comment" : "appending null value to oid",
+          "public" : "307c301606072a8648ce3d0201060b2b240303020801010b0500036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 270,
+          "comment" : "truncated length of oid",
+          "public" : "3073300d068106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 271,
+          "comment" : "truncated length of oid",
+          "public" : "3071300b06072a8648ce3d02010681036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 272,
+          "comment" : "Replacing oid with NULL",
+          "public" : "3073300d050006092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 273,
+          "comment" : "Replacing oid with NULL",
+          "public" : "3071300b06072a8648ce3d02010500036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 274,
+          "comment" : "changing tag value of oid",
+          "public" : "307a301404072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 275,
+          "comment" : "changing tag value of oid",
+          "public" : "307a301405072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 276,
+          "comment" : "changing tag value of oid",
+          "public" : "307a301407072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 277,
+          "comment" : "changing tag value of oid",
+          "public" : "307a301408072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 278,
+          "comment" : "changing tag value of oid",
+          "public" : "307a3014ff072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 279,
+          "comment" : "changing tag value of oid",
+          "public" : "307a301406072a8648ce3d020104092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 280,
+          "comment" : "changing tag value of oid",
+          "public" : "307a301406072a8648ce3d020105092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 281,
+          "comment" : "changing tag value of oid",
+          "public" : "307a301406072a8648ce3d020107092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 282,
+          "comment" : "changing tag value of oid",
+          "public" : "307a301406072a8648ce3d020108092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 283,
+          "comment" : "changing tag value of oid",
+          "public" : "307a301406072a8648ce3d0201ff092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 284,
+          "comment" : "dropping value of oid",
+          "public" : "3073300d060006092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 285,
+          "comment" : "dropping value of oid",
+          "public" : "3071300b06072a8648ce3d02010600036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 286,
+          "comment" : "modify first byte of oid",
+          "public" : "307a30140607288648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 287,
+          "comment" : "modify first byte of oid",
+          "public" : "307a301406072a8648ce3d0201060929240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 288,
+          "comment" : "modify last byte of oid",
+          "public" : "307a301406072a8648ce3d028106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 289,
+          "comment" : "modify last byte of oid",
+          "public" : "307a301406072a8648ce3d020106092b240303020801018b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 290,
+          "comment" : "truncate oid",
+          "public" : "3079301306062a8648ce3d0206092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 291,
+          "comment" : "truncate oid",
+          "public" : "3079301306068648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 292,
+          "comment" : "truncate oid",
+          "public" : "3079301306072a8648ce3d020106082b24030302080101036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 293,
+          "comment" : "truncate oid",
+          "public" : "3079301306072a8648ce3d02010608240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 294,
+          "comment" : "wrong oid",
+          "public" : "307d3017060a3262306530333032316106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 295,
+          "comment" : "wrong oid",
+          "public" : "308185301f061236303836343830313635303330343032303106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 296,
+          "comment" : "wrong oid",
+          "public" : "307b301506072a8648ce3d0201060a32623065303330323161036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 297,
+          "comment" : "wrong oid",
+          "public" : "308183301d06072a8648ce3d02010612363038363438303136353033303430323031036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 298,
+          "comment" : "longer oid",
+          "public" : "308183301d06103261383634386365336430323031303106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 299,
+          "comment" : "longer oid",
+          "public" : "308185301f06072a8648ce3d020106143262323430333033303230383031303130623031036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 300,
+          "comment" : "oid with modified node",
+          "public" : "308181301b060e326138363438636533643032313106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 301,
+          "comment" : "oid with modified node",
+          "public" : "308189302306163261383634386365336430323838383038303830303106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 302,
+          "comment" : "oid with modified node",
+          "public" : "308183301d06072a8648ce3d02010612326232343033303330323038303130313162036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 303,
+          "comment" : "oid with modified node",
+          "public" : "30818b302506072a8648ce3d0201061a3262323430333033303230383031303138383830383038303062036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 304,
+          "comment" : "large integer in oid",
+          "public" : "308193302d0620326138363438636533643032383238303830383038303830383038303830303106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 305,
+          "comment" : "large integer in oid",
+          "public" : "308195302f06072a8648ce3d02010624326232343033303330323038303130313832383038303830383038303830383038303062036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 306,
+          "comment" : "oid with invalid node",
+          "public" : "308184301e0611326138363438636533643032303165303306092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 307,
+          "comment" : "oid with invalid node",
+          "public" : "307b301506082a808648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 308,
+          "comment" : "oid with invalid node",
+          "public" : "308186302006072a8648ce3d02010615326232343033303330323038303130313062653033036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 309,
+          "comment" : "oid with invalid node",
+          "public" : "307b301506072a8648ce3d0201060a2b80240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 310,
+          "comment" : "lonely bit string tag",
+          "public" : "3017301406072a8648ce3d020106092b240303020801010b03",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 311,
+          "comment" : "appending 0's to bit string",
+          "public" : "307c301406072a8648ce3d020106092b240303020801010b036400048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd0000",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 312,
+          "comment" : "prepending 0's to bit string",
+          "public" : "307c301406072a8648ce3d020106092b240303020801010b0364000000048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 313,
+          "comment" : "appending null value to bit string",
+          "public" : "307c301406072a8648ce3d020106092b240303020801010b036400048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd0500",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 314,
+          "comment" : "truncated length of bit string",
+          "public" : "3018301406072a8648ce3d020106092b240303020801010b0381",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 315,
+          "comment" : "Replacing bit string with NULL",
+          "public" : "3018301406072a8648ce3d020106092b240303020801010b0500",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 316,
+          "comment" : "changing tag value of bit string",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b016200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 317,
+          "comment" : "changing tag value of bit string",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b026200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 318,
+          "comment" : "changing tag value of bit string",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b046200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 319,
+          "comment" : "changing tag value of bit string",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b056200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 320,
+          "comment" : "changing tag value of bit string",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010bff6200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 321,
+          "comment" : "dropping value of bit string",
+          "public" : "3018301406072a8648ce3d020106092b240303020801010b0300",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 322,
+          "comment" : "modify first byte of bit string",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036202048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 323,
+          "comment" : "modify last byte of bit string",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a43637164d",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 324,
+          "comment" : "truncate bit string",
+          "public" : "3079301406072a8648ce3d020106092b240303020801010b036100048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 325,
+          "comment" : "truncate bit string",
+          "public" : "3079301406072a8648ce3d020106092b240303020801010b0361048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 326,
+          "comment" : "declaring bits as unused in a bit-string",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036201048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 327,
+          "comment" : "unused bits in a bit-string",
+          "public" : "307e301406072a8648ce3d020106092b240303020801010b036620048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd01020304",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 328,
+          "comment" : "unused bits in empty bit-string",
+          "public" : "3019301406072a8648ce3d020106092b240303020801010b030103",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 329,
+          "comment" : "128 unused bits",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036280048a9d9c6e3556ad8a5e9ae1e38ad4777e1ba27a48cba53e620d50e55dabe5f5ac35780e9babdb17c90c01cb3c7f43341161e784075144730dd206c883680a43940af666207a466c512436e53b5ca7f7713b9d97ed9b1a6cb0a4e559a4363716cd",
+          "private" : "14e38148320c86931a22f99e6bd5dd86d30e3ba937d3745df40d50fafb738125de9bed3384cecc32176924bb585874e6",
+          "shared" : "2767d762b1030a7875c8a08e8c3af126b2a98b46de1af2dca4587269db4cc6eba2a501360c4d5857cd0dcee829068fe4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdh_brainpoolP512r1_test.json b/third_party/wycheproof/testvectors/ecdh_brainpoolP512r1_test.json
new file mode 100644
index 0000000..7547502
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdh_brainpoolP512r1_test.json
@@ -0,0 +1,3259 @@
+{
+  "algorithm" : "ECDH",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "AddSubChain" : "The private key has a special value. Implementations using addition subtraction chains for the point multiplication may get the point at infinity as an intermediate result. See CVE_2017_10176",
+    "CompressedPoint" : "The point in the public key is compressed. Not every library supports points in compressed format.",
+    "InvalidAsn" : "The public key in this test uses an invalid ASN encoding. Some cases where the ASN parser is not strictly checking the ASN format are benign as long as the ECDH computation still returns the correct shared value.",
+    "InvalidPublic" : "The public key has been modified and is invalid. An implementation should always check whether the public key is valid and on the same curve as the private key. The test vector includes the shared secret computed with the original public key if the public point is on the curve of the private key. Generating a shared secret other than the one with the original key likely indicates that the bug is exploitable.",
+    "IsomorphicPublicKey" : "The public key in this test vector uses an isomorphic curve. Such isomorphisms are sometimes used to speed up implementations. For example the brainpool curves are using this.",
+    "ModifiedPrime" : "The modulus of the public key has been modified. The public point of the public key has been chosen so that it is both a point on both the curve of the modified public key and the private key.",
+    "UnnamedCurve" : "The public key does not use a named curve. RFC 3279 allows to encode such curves by explicitly encoding, the parameters of the curve equation, modulus, generator, order and cofactor. However, many crypto libraries only support named curves. Modifying some of the EC parameters and encoding the corresponding public key as an unnamed curve is a potential attack vector.",
+    "UnusedParam" : "A parameter that is typically not used for ECDH has been modified. Sometimes libraries ignore small differences between public and private key. For example, a library might ignore an incorrect cofactor in the public key. We consider ignoring such changes as acceptable as long as these differences do not change the outcome of the ECDH computation, i.e. as long as the computation is done on the curve from the private key.",
+    "WeakPublicKey" : "The vector contains a weak public key. The curve is not a named curve, the public key point has order 3 and has been chosen to be on the same curve as the private key. This test vector is used to check ECC implementations for missing steps in the verification of the public key.",
+    "WrongOrder" : "The order of the public key has been modified. If this order is used in a cryptographic primitive instead of the correct order then private keys may leak. E.g. ECDHC in BC 1.52 suffered from this."
+  },
+  "numberOfTests" : 305,
+  "header" : [],
+  "testGroups" : [
+    {
+      "curve" : "brainpoolP512r1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "normal case",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200048a73a66605a5db252ef418ff2c43969bd4128187ce431c36a33d3ff3034cf8910fb0021ce849723621199d0d7ea4805f3cdab82f6c909257762da2a97e26305b078c1fd791fa957e975e30df5b876054758267129e4974a083372b0ce071180d05e1978bd90b8407c0a7ff7f6651bd3ffcf1a574dfe95a2e8af3866cbb385d21",
+          "private" : "6280eb95405fa8c0e9d970547301bbefb152c8c8114abc730c89bf6db3f7d949fcfd7ebb82fd2dbd43d28d47bf4ed95de97baed19f7d087cf303d2b0cd413767",
+          "shared" : "9690120edf3c583f627774ac2837f792e1049b3768199e3cc68c75cc16f73d4eca828f87880de91e2fbe0671b7066fcc814cb2e190832adae3a6dc7d9d9e71d3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "compressed public key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010d034200038a73a66605a5db252ef418ff2c43969bd4128187ce431c36a33d3ff3034cf8910fb0021ce849723621199d0d7ea4805f3cdab82f6c909257762da2a97e26305b",
+          "private" : "6280eb95405fa8c0e9d970547301bbefb152c8c8114abc730c89bf6db3f7d949fcfd7ebb82fd2dbd43d28d47bf4ed95de97baed19f7d087cf303d2b0cd413767",
+          "shared" : "9690120edf3c583f627774ac2837f792e1049b3768199e3cc68c75cc16f73d4eca828f87880de91e2fbe0671b7066fcc814cb2e190832adae3a6dc7d9d9e71d3",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200041c323510258b858d9a996fe644e2d116ca360726c51a54e0aa69e88ef816f20577349ae1f2f202ff40c499bdae4274bcfd502f736cf82f43acfca55649e9faaa88263cd161a1a6555ee0249363b537c8f2e2ee80943f4b162893fc9640d54a8e7b997ad202a9b723c3a08929d572076e3c85adec089da1507861758d47e41ec2",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000438a0c765409100f0a831387ba46fbcda63956df0f00e77615b33249e1a73d1310bb22784e09e3faece0bfa6ed5c0fa077c8a62664221ccb596c9efa2aebeb3ea937dacea2ee4fc261e29af0b64ec5b4a8f0fbafe7470d715c1effd463eca68344ea7446a88e5874ebb1a0faab7ec0d36d203bece105a11edadb00e93ab0dd818",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "00000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000100000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200045f65b98616109b88fecb4cc1e639e98d2109bd696a14b921a245f265eead9c44eee4d19d162ebb972eecdbbae1c3b5d683e8a2163861267795840e79bd4e08fb25a472717d167587165060003c77f8d3339b908613063e5cd1abf0e20f4172fd3099f8bb96bc26a84137be2f341ed6c1d91c11ef3111b4cf75170d2db59bd790",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200044069f3a94ded3bc37d32cd2cbac29ecb33b3aad195d9ac57965128a5a8a4ec2728db23e85b4213c60db409a77661f60756abe7d9edd7057a12453a19202c54288ba58659b7b37d74a80109fc484efdf9168c2121b7aead8f5fe02d483b51f1f213384189924b63050fcdad57d2c4dbc5c31c4c15e1901b5192708410e160c356",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000100000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000428e7878a20a024121e36339bb0cc67e6e4caacd54e13ede6d7ad4c73385b6125bfefe8f8e1ce95d2d32b956132a91d7c2e09c399ab938228aa16fdd2d748752c0a87e583384d4531d16f5e59debb3691fcdc91e35e9a9a6c4adcd020f3def3931b539cbae2414bdcc4e35688379ffde07a0991730c5783141af7f87fddae070a",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "00003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042830ff4e16150ded7167833c6bdb7daf11de99448f4e60e0c775f46e3a44b85599148f944fb6ebd8609eb2342cc86524e989726ee6b9f0278ffc36804b775e85881aeea838831b2d0a702a887ba5b549b82ce5543857339fee3425368759cad41432129a187dc37e6a28743fd1dda1028fccd9b8f2c0d44f8f9146e48401b898",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000403d1fa2562f3b6c63a86731c2519956aab599d17003deedfd67b7f3eed749036aae5c0a110e9bc767463093e597e61e3bdc24078286e87e684da1c4a0514b16868da156d1122b47f01f63fad234f09460f8f36f31aca059991751ef7a553365842eae9814c263249c0093c919622a2d4f96b7f591495567888d10d0b1bb80f82",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "00ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200049a4ef296678f88e848a939e3b5e93f948e821cbe3c5ec2036d43578676212bc4997f479a2255139902f03a977e304282b06778e86ac5e3e5ea71e6fc43015974555de294d1227fa3165fcd839498dfc4a6dc73cab0313e9241a026a076823286acb95b3b4b29338448df31e9f91a969ae98449ffd871ba273442b6eec0c92193",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "3091819f599671a0d21d866eba2d540ae0a472be0252d3792bc5bb984d20a8dfaa1875e6d05264615545d2ae78b9b5acb696fdf1680a05cd382d83ecef252854",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200049e4b9145044111317c7bf1697b9428f716b022d1035b1c8781cbd7cd3527b136f0f95df1be0627721a4f6a56c004149f3400c8b0ccc142cd382d60ca250db1f0410b6975e5ea63358f5d1ea163f42ae3744e89ca9d22e24dbc4dc7a05ec4300466fb436a185807b33383484c562d5b65cd57f6f06fbff3eee8e832f816cae53d",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "339f77db58bb17afd4059555b059214889771982d96f1319c9951404c60909bc10bcec2f7dc6e56df44889c1924a304bdfa7aa19d562f49cfb3acd409100bae2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000436a0b22506a13c46fb9c8d52d112d904d6d93e260dfdd61f680d322d5ad6dc130d9df448eede20ff73ce94dbc7ca10a89a49f54c76c30e771851f0a41d6d525f18304137d791f223be088138636523bde5c136685ab6bb2bfaeacf9578410b3ba9e26083b80b36a23b7e27ed3070692995e45004d5d4bac4ed409cec36fca2ed",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "3fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004955069edb4b62dc48e0c41924f9644bf85af1801b21732a64cbfcf7cc3bfec914d0cd8bfc8fb334a94fd3488c44dfce0e5eee324da83cb903b71ed47acdd1365881ede882c978ec541f39f4b29d515ef836c77d04b512cdc45bdff505bffa39d39e2e9e3c4a6566b835c326106c7638e3d07e7dddb3331c5d37d7fdaaedfeb49",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "4000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200046ecd48b171548d97b368a778395b7484ec4c9710963a6fdb107322a936dfcfdeef2c5d1baab81e7da63a3f67a71389b8364aaddca6f65bfbe0d8887f8c5bb716811c8ffeae8cd39e3c6ac2a0d8ab9e511135c2343ab0e0fae8a07fd997926377bbd73c03088209d099cd33609a1707a3eb1ad0abdc68b9b82c659c2e51d2ecd1",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "40007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004116e13c13ad71c9f8528289553bb71f8feeb05d0b1b21dcad5b9e4c002639dd9d834f80d497eb2af643caeb28f9e82b6dbb1e2cd5a785aff8f144944b6abff188bf286aeba0457ea256e1dca332bbec2d46473519428d298002a518514d9c9eb8f0878f9afe0ff1bb2969449be2a7ebb115f6a753e5edead6d7e01514b718c36",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "7fff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200046387f14a6db2ec86d9dcf45618cede486187045a33fec85fe11cabeb93a61242682a939ba6c7821e4da3603a0ffb5e9d4f81ee9662fb3e62d865f10903c69eb55177cc263714f091511842b7715c434b8aad1b32273af574cfff44018ce78ad81e699c4403363ed5c392bd6af7d2c0a907b575893f8ead5ca9fbfb12627fb390",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004273895ea597fb330f9ef29c61679d57b494aba7a22ef54f8edbac8a8b65ad6f91b44c2a8c5f862f42fadf68b44fc7a086b12e8d4eb7a61d63f77108929f6abf42d69e73c49c1b4d8cba5fd200632391d7b33c686b2003581bc6568eae8d0d7b7fa6c69dc732494a5c16ea7605ff24bb6818a49caab161a4dd53876a646644f4d",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003045dd3ad1b6a380eff32bccd947957f3acd60d5a6df18ed9a4d676c1924123576c959ae8473de224ca262d456e8d51f6da36eaae8e3dfc0e914afdb1bc552796",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "a467eb14c46a4f70ea53aaf9e0b642acc38f2e3f264fedd84bdd082bab3b64e1c7cdaa521c9bcc66391a7b8839e62afeba3325c6d12386a4fd8fe05dc54247fd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000400000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000100000000000000000000000000000001035201526ac9ed34d51282df1a594a553bf6f07a90e3268fca9a9b3a774324b0e3ee55c351748ac18f7301bc560623ae7846f97f576cce3ca81698029c389562",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "1362fefdf9173162cae5e7a029e3774fbef0082c33b5d19959b2a4b5653acc9f615917058196f1c59c29ce054e4c2e5b035be727991e618604562e837a452fb2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff5106e912f8124a959dfc5ccbb99786d54af877fe539e664aa0362a4d417d1c4ae647ddf40c8c2cc6ac6b0f35164e24a1c64a5f230fc61e2318c9387fc1547c4c",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "60966e750bcc098107e6a66e8f5a0741e7eec2c7e76553df9569fbe0d28afd8cb1ba80a6aa8e7a84be668dc6e23463d08832b89bd092a4ae838fd228436c1415",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000400000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff000000010000000003c86f4fd8b138ac5509a4174bd4998e1b4d3d49de88d37e38dcaa74f9c42f3e37b7f7be77cf5322514a879984e44b4a3caed566ab6874b1a781292e7ef791a6",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "22694587ddf8e8c67a989ed4c1386f927897a6b9664aa4c939d74a597ec5e662f18a28c0d746a418361ccf95d8d502e0901b9465a6cf8226a4f730f166021a9d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000400003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff00000040000003aa5dbaaa057f9987e2e495a2da349f5d30b64499cf505e1a51be9a82db1b75cee639605d98f672c4295507e778b2ce16d229c5fb33da4f5a37c0c97a028fbde",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "4cbf67a6eeed2d8ba1db4f9ae2cffe04f195e4cac0015b694f228efbc4d6396dd21b75ea587426cf043f165aec505535e4b2125cdbf20f56b7e058cf971a6165",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff3e35ce50921fe7b45a53452690ea8398109e90b0985738e775ee45c5266b1385dc1998956ae6e927a062f99d3729012c14f552dc17267fccdf634d0d3eb3acf1",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "a9cd019aa08a874934c6fc28b0f34982e3d10e3a3a7ac52425c80db1d4705f0c2b733ac54baf1e56cfa6e757a5bc01f54ac39a83d42aa6e8bc5c654a60a7e56f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000400ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff1b4c363942583811e0bba8ed31540262b8be88f69b9fc4b1292fb68aebae1f9ac961fc40b85b5d09772143066d17c2259a8827691d817992c800c4a5a188e4c9",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "364e65735b2b2353b1b9ddfc4a5e233b30b0dd91e8019905bffacb6d594b32ca79dff593b6269ddc7e80278daaaba341c3c38f0634a1ae286037f1677db0a307",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200043091819f599671a0d21d866eba2d540ae0a472be0252d3792bc5bb984d20a8dfaa1875e6d05264615545d2ae78b9b5acb696fdf1680a05cd382d83ecef2528541f79f9f14141258d70e41c8a0a09cdbaf2ffac9fcf0d38f4aec24a5ec36ca792c4fb3e25dbd5c1aa1aa2de5786580f58d286683cd6fce157e180128dc0763234",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "496bab460c5a1e762dff6d9a7c7e4fd6b4973b921a60bf08192a9bf5fb1eb5ae993be0b4b6ff8c441d29f5918f6ff5738bb0ef7953f031dce49e766889ff7510",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004339f77db58bb17afd4059555b059214889771982d96f1319c9951404c60909bc10bcec2f7dc6e56df44889c1924a304bdfa7aa19d562f49cfb3acd409100bae22a19d298cd846cf9ce03a6d7d18c165b2b3c18b70514a4020dae6e3da679ae541df2fbcd20e865becb54d39c71f90284a50c2c7463a04351c4e0b01d6a077808",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "07a4f5d735a280940f6e57e6ac6a1f735ae4c4e25de6f54506c22c19e6a32fa9db5431586d4f442324eb696e5bc44f80a4a672d7b799c605450f1dd918dfa30e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200043fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff2854149062fd692eecc2302747cc08be854c64c4f9abe86c467f161496b19a52bbb5a4da84392573d7e9632a040e9dd737bc9089aedf5b0c15488e9f1b083a7a",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "6b3d87c962321bed12a867180b3dee7d4b31a0692d36e60e73648986742c42b187f96a22088b1539a8ad832cc532adc95470b47e623c65c61ff5da8ceffc100c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200044000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff80000040000004b9846887f8752427beb39fbad36f0a0170e3f225a7b0c1fc0528c9ee8f4957fb323faa8a5a329c03c0fe2b8df08209d3ad78f8b161745144b418c4e26f3b276",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "97d1caa3bb77456f5ea8142f85e5e22931b559c81947a0f2c9ce5b23980d9bde1a9f42c24b74e2266dbf265f8a6f949fc22b5d75b93bbb1c32557d9eacf7e279",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000440007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc000800009a37114d6a5c9ee64371c57bdd264e1764edda64f449cbd0ee1a72009890267fc1ae7d2ee5ddfbb5b1693bda1a0b5494c862e0ed1df03b702f2f2c206e4c52c",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "7ebb5024c36f9f249f164e6b8fcbbba3ec255d5f8e279765b9869cf97311411c359084fe6b76956efa55c1d608f013423397178617935ea110c936ffb73317be",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200047fff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff27cd77712e0db1978186e9d6feb6eaa034318fbfbab7fa3342a9e43eeea04c28ddde021916d5fcfe2d1b43743ca1ec2b5288cd553901825e4652cf4cf524bcb4",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "380986a2fbf3d5c6d38ac5ea191f7ef4681f068b475b61bfd909a6c3a30c731c30cfe9ac0e7dda521e574fbb6caf9dc52eb3ebe3106a457f5bda9698d252d827",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff026c17238034c8372217a8cd9a234ecb7debdec5659b7e3f0c6e70ba226824f56acce025ae65da8b0aebc2efe2ef73dd826cea151b201b2f5b4f7623f2fbe332",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "a502a7d0ee2077a3d4b484b02e2ed2d0d132ebd48c2c7d99f1461e1b4428ce97a317e26ef90462e70436789cbcc27986d644e7950650612d9fa2be50d07ea58f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f212780ae4d2fad1163e2a513d72ad6e3c2211f8079ccbddeb9b1e956b2ee36173abe84464b0c78dca8db21f6964e9a1398a5a0f6e1e717ddf4eac517032879266",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "7bd3f02e85464163815804eb8f5cdf3cea258b520ef564d813ee4102a39e93f604d1c537bb93ac7b9d0fffcf89177f4586ea690bfe93a9632c645038a47e82f7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "3",
+          "shared" : "47ed915ca64aac752724aa06b311d171dc14b9c55421ff61c6413b3fc7313ecda03c0addd0d6dbdacd5ea0619054614610d07cd78f9ed4d6df024c781af3efae",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "781a3bd7f99ae145698783495f1f4aac5189d54657c34f76c8847cd5177d6a08a2c837501351e098ba570a3f300cca47f2407ff9172b2954aef46fdbec8429b7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "33485176aa26cfd17a66e1da3c3973f468bc32a1528a67f9d33b7ca29bfd6fa536bac3112bb8f2c2ea198f2f7df5a56dda570931b7852b3224c403a1d08f3dc6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "9c4971c89a22da14abac1304b6228c5d647f8dd8a11b1348c419f430733e849957fb037865efa85f9585ed0ffe8c6ea2c7c39ac8bbeedc84717f8a6be9603f65",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "58be414307cd761143c49224f30ac475e6b8fdbf43be3f130b71ff8d89af5d3b91342898388d1628f56322d327f5f075ca3a766d94213f8ff67076caa253937d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddadcb58796829ca90069",
+          "shared" : "2e03302f2944b3bc902e5fe6b7d1ca3991bf9fd80bafa8df4d4e85a98f33d956280ba0078178b54ed1aa03571ffac2d476c7246ab68ebb9434fac564455f39b8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb57796829ca90069",
+          "shared" : "0dcd1e563a94fd8edc83e47ebbc9296d1c27d1aff37b02512c0337ca672ff84ac73a618fa54f2b963182ba141ae596c56f83d0ecb4deb78055cc8ea476d09bfd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb57f96829ca90069",
+          "shared" : "aa9ac6d3343fb7aad7128855a22cb25f6cd9b46ea02f2a15c7cdecdc681f3ca38f1860290971852de94cc68810d41d14607f558e3858394cef8b166abee023a2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796819ca90069",
+          "shared" : "5f155d9d14680aa5efb4ed59f670f6efc59c15bb03b59b3a2cf1a4a1546b7e35bfd99194cfe72e79216c1daebdcd247e934eab457ca90d4d2c38b64517e0cce0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9003b",
+          "shared" : "194871645bbfc309eba92c5613ca7c6aa566fdab45635f656148ec7122d71c825f36852f52722ea949c2572dbb6b894a21f96a05c9bee0df6c6b4faa3197079a",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 43,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9005b",
+          "shared" : "3a6e57858d4e61c7ed2cb93c124221210293a345b47f7644910543ac03117f48b0343ddebd2cf9925e3dc5e1ea590739ed2c2372e1146f84fd262ac7d8eebacd",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 44,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90063",
+          "shared" : "8e0a186a51eae08a86fdd476bcfd961d02be74966ce3c2d937c808db518f2ddc4760bfc924af72f85eb188ebc70edde6d12f402735f58b9006f8b8e283ef9fbe",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 45,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90066",
+          "shared" : "47ed915ca64aac752724aa06b311d171dc14b9c55421ff61c6413b3fc7313ecda03c0addd0d6dbdacd5ea0619054614610d07cd78f9ed4d6df024c781af3efae",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90067",
+          "shared" : "300b1d80d9dc5587076b7d850ccd00cf8961f389c4ded60bf910d98f196f67c3839d2197101607612b335871a818d50d8f4bb6163cc839cf41af0b742c7254f4",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 47,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "",
+          "public" : "3019301406072a8648ce3d020106092b240303020801010d030100",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "public point not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5695",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 65,
+          "comment" : "public point = (0,0)",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 66,
+          "comment" : "order = -8948962207650232551656602815159153422162609644098354511344597187200057010413418528378981730643524959857451398370029280583094215613882043973354392115544169",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f7230481810481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad808920241ff5522624724163b74c02b1951cc3603f834cf724c4c362df1299c63358fccf78faac1a3beb356d9e6be799ee68053efb8e24e2c7ef7a225224a78697d6356ff970201010381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 67,
+          "comment" : "order = 0",
+          "public" : "308201f83082016f06072a8648ce3d020130820162020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f7230481810481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad808920201000201010381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 68,
+          "comment" : "order = 1",
+          "public" : "308201f83082016f06072a8648ce3d020130820162020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f7230481810481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad808920201010201010381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 69,
+          "comment" : "order = 2083592630841357761914050861997332755048435564175796348448981807380927961881602771668457829077617488768289656930144243078095422967775269405300354",
+          "public" : "30820234308201ab06072a8648ce3d02013082019e020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f7230481810481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892023d00aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796820201010381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 70,
+          "comment" : "generator = (0,0)",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f723048181040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900690201010381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 71,
+          "comment" : "generator not on curve",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f7230481810481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80894024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900690201010381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 72,
+          "comment" : "cofactor = -1",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f7230481810481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900690201ff0381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 73,
+          "comment" : "cofactor = 0",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f7230481810481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900690201000381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 74,
+          "comment" : "cofactor = 2",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f7230481810481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900690201020381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 75,
+          "comment" : "cofactor = 8948962207650232551656602815159153422162609644098354511344597187200057010413418528378981730643524959857451398370029280583094215613882043973354392115544169",
+          "public" : "30820278308201ef06072a8648ce3d0201308201e2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f7230481810481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900690381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 76,
+          "comment" : "cofactor = None",
+          "public" : "30820235308201ac06072a8648ce3d02013082019f020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f7230481810481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900690381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 77,
+          "comment" : "modified prime",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100a9414de6e5ef176ff64384b554271ef34fde1d646094323012668174776efe4e23c39f2773860bb0bb7ad41d6cc5deef888974b529de7d1168d2a3cf6f6f4dcd30818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f723048181040000000000000000000000000000000000000000001ecaba5abfa4220000000000000000000000000000000000000000000000000000000000000000000000d61096c9018545277fa62c0af905d4d2e2500ecb6c7306b6508079532c53907b58e3a7ab89660147c556b10a8ad430325d7484da765aa00b8e007a343c233714f0024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006902010103818200040000000000000000000000000000000000000000001ecaba5abfa4220000000000000000000000000000000000000000000000000000000000000000000000d61096c9018545277fa62c0af905d4d2e2500ecb6c7306b6508079532c53907b58e3a7ab89660147c556b10a8ad430325d7484da765aa00b8e007a343c233714f0",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "3917638d8a0c6029dd5d7e7fdd5b798805f2544291277af5f5bcc84d4d665e347bf504a505ade7f365019e6f3aaa79c20a0956e40c8ac472a0cdc198bc99b6c1",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 78,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 79,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 80,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 81,
+          "comment" : "a = 0",
+          "public" : "308201f83082016f06072a8648ce3d020130820162020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f33045040100044044a9dfba839bd5e0edb3dbace1c8f201409f6d505e411f290d8af054fb492a0d0d246c63b2fad54f963f9ae5b3540ccf3417106652f29ce45cd6e41851d7109504818104933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900690201010381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 82,
+          "comment" : "public key of order 3",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f33081840440a00fb4b37739a60abb4656e10e4460f9a99785f877ea0682eb4fdf14e70d1f3607b3a44f74a12add457b3eaa28700067ebc86e7266ce4df642959ff2f57712aa04407a9c5564c913cace0a73e1a5270ec344629b93fce7cd265e1ad4ca6e9be90d5036a471053e9423ac5d3f8b9b3f4386e15e6c1101d380327a5d30457fce12269b04818104349b6fc619dc1feb9624c01d338f7c9c4efdddd88369dfd74c3c70bd272bf7fb9d0ab5dcc2693192b6759499dde60a3c58e674d1bb65256f9cec1af7d7c066b952e4287b72097eab781ff802d216dfc918541a968ff03b812627b9293d09b662257ab4eaea1f227fd952fc68328658135b16c6f3beb5487767bbf090a3ded562024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900690201010381820004349b6fc619dc1feb9624c01d338f7c9c4efdddd88369dfd74c3c70bd272bf7fb9d0ab5dcc2693192b6759499dde60a3c58e674d1bb65256f9cec1af7d7c066b957f9753d69e045dfc7b4eeab61b31c3eb2dc731d23d9968db03be3a13329520f57d2e615b1a745c2d57aa4c2b41d28d2cd6b383b6ecd7e0dc0ee6fc5b45b7391",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "56d8c31acc2ddbb2e99f9c0cc4e2074de29cf47ddc1f257d47045afe69fbac7b585dbc95f37bf79daf1ec5cd219e9e97a53827db19b5601960970bf499066f94",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 83,
+          "comment" : "public key on isomorphic curve brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004552e0f403a37a53cab048d6c6616973fb80ccbebb788a5d743f6bd48b27e819100acd53c86a95420e52cfa18d958bcb7844f05e40824b5eb38c827456e9b410c6787bafb0cf873f535c82381c81bbea8e7291b68f93e58f5657af40333aefc23cdacaedff7b3eefd8cba644bb72e9746c3bacaec3ff14a950dc6e1ffb03789ab",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "IsomorphicPublicKey",
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 84,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004f1ed1cb1ceb7eeef8f7044b8f3bf488604a1a226a697a202b9fe094b4ef15b2f33ddb17fa5447d65e2783f72821ea01268235d58e18bd14e",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004fa60a443999e02e693e83e198e6ae8d77c6d5b0fad9269ddcfbcf3fd7454ab551fcd8ec3145c902ac6f57112b1fe5415c0b974fc9cb15105c174f6c26503bb5d",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004aef982cb3c13ef417bbecfe65d4ac97c8b081f47311069fb63629e45440045c1cbb26cbc4e2c7139511b5cae95a9f79f0ee8ebffdd68e215f602ee98bd0d0acc180b7061e20f213f043915a246b492c214168bdaf8ff95b0ff68f9e3e7f43657",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040078f1bac16e586a15d828e92a2f35c0690f616a886223b70657639d130a04e58787f2ebb3eb880ea2f396e67e353e326822745959dbe51ee4f80562044c967e33b40018895b6e1370974595784c19b17f8208b900432940680d16367f05f0c1f5ffa607037473461c0a0651884dd35a58c9735d0bb6328c4b5b9d0ec792f0f6f8bc8769",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200046a4213777e31119f578b3e8be06ebf62502d7d10dfe5bf9341dea64525e0978f12cbbd6f17e4e932b4446c48bd3f1189a55b212d89c5194f689f297e3a27e8a6",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004b160ff66fc93480bef16ebb4a00b75f3805e884ea875dcfcc73e32a1d764c4dad373d89648afe449018ef5524633459bee47ff9529c5ae41",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004670c87dc73c6bd2291150ca80eb914924286ada22e50f5fe41079ab3f483c7271cf84db06d98a7e4382b528dfea4335a1bb4ada1f61c5030bdc479a2441dfb28",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200045f1de6cf461eecea01567345bdcec2ae56dd607ddd15c26b4ec095ca2afb17b1ffbdf61bd47010d16a92595554d297378212bbfaafb62c179960a4db69a7d3aaed57ba9edbcae9b05e3b905fa5eafff1",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004408d98134c7ff4519187d68da6cb6c7b5d257b98d1240985404d497682656a60e2d4abda818d20d2524af5357700aeff6ecc536169279a38c53bd5dbe49c240eb30cba040568b09ee65be595c25a090dd94ddc06b441f78de9e290fae01fbb11",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00049bd1aff3c1d564b390e8f9575b123cf2c47151fc1cf534e4c24c254382531d828902af3eaf1383410ffed334caa12697265024b764a8cc40",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004683cf7c313c9503ed4dab6b6a25463c5d682aac16ee5b33785321e77304201774c22f4703e5cac4891c56c1d8ac3d535f192c041ebfa78979ebbddeb87780607",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200040f31598d0b84972ae50be531e0ecf11b721b76d8e2843940de0397d7fffb62dc382ddce29ec2ce7baaed79f9144811e1ca8194c8046458fe3956550885315dfe0e29efd283be076ddc81e1a857705804",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c03620004483dae8e878eb44c217e0ba373ead244428398d83bd0ba1473747887c1c5a5de6e7d42b9f6fab658277f4046ebb6c6b43aa548690bbde6a2d77ec48c81da44183f7631c9ffbdead397d9ff6cf8ece2c21a2f989cede73bec5f461cbbbafd01b4",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200041bddcd407461d821e5879eb6b27736dc1112c3c9177fc3cf1a1bbd39654514d7c82950e9f674a4ce4c7fc9f9410c5ed9b194c926c1fb0c178940e46dc4fcf12c222d62b9c3f76ba459f8eae72d5b2c8df5a2cecf34dcc66108538a0f6aedd8e2e9c51515a290f244e3e40e352a6e86a58af41cd89f7dee16199bc84d2051c43e",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "invalid public key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010d034200022564ece76989d82265ea79fe5b41b2dfad2268e27df8ee7260d937435da3777a5106557dfbdb64d106c2ad46e64dc63e0eaa22e81a03d25b870578d86b0f1432",
+          "private" : "57087c2e66e2221d0618077207ced3fe31627f83afe4ea3d3999a26d9737fa8ace4f50b968930cae8bbf55b422335f22d85a23582b076c2836e060cd1157cffa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 99,
+          "comment" : "length contains leading 0",
+          "public" : "3082009b301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 100,
+          "comment" : "length contains leading 0",
+          "public" : "30819d3082001406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 101,
+          "comment" : "length contains leading 0",
+          "public" : "30819d3016068200072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 102,
+          "comment" : "length contains leading 0",
+          "public" : "30819d301606072a8648ce3d0201068200092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 103,
+          "comment" : "length contains leading 0",
+          "public" : "30819c301406072a8648ce3d020106092b240303020801010d038200820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 104,
+          "comment" : "wrong length",
+          "public" : "309c301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 105,
+          "comment" : "wrong length",
+          "public" : "309a301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 106,
+          "comment" : "wrong length",
+          "public" : "30819b301506072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 107,
+          "comment" : "wrong length",
+          "public" : "30819b301306072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 108,
+          "comment" : "wrong length",
+          "public" : "30819b301406082a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 109,
+          "comment" : "wrong length",
+          "public" : "30819b301406062a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 110,
+          "comment" : "wrong length",
+          "public" : "30819b301406072a8648ce3d0201060a2b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 111,
+          "comment" : "wrong length",
+          "public" : "30819b301406072a8648ce3d020106082b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 112,
+          "comment" : "wrong length",
+          "public" : "30819a301406072a8648ce3d020106092b240303020801010d03830004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 113,
+          "comment" : "wrong length",
+          "public" : "30819a301406072a8648ce3d020106092b240303020801010d03810004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 114,
+          "comment" : "uint32 overflow in length",
+          "public" : "3085010000009b301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 115,
+          "comment" : "uint32 overflow in length",
+          "public" : "3081a03085010000001406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 116,
+          "comment" : "uint32 overflow in length",
+          "public" : "3081a03019068501000000072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 117,
+          "comment" : "uint32 overflow in length",
+          "public" : "3081a0301906072a8648ce3d0201068501000000092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 118,
+          "comment" : "uint32 overflow in length",
+          "public" : "30819f301406072a8648ce3d020106092b240303020801010d038501000000820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 119,
+          "comment" : "uint64 overflow in length",
+          "public" : "308901000000000000009b301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 120,
+          "comment" : "uint64 overflow in length",
+          "public" : "3081a4308901000000000000001406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 121,
+          "comment" : "uint64 overflow in length",
+          "public" : "3081a4301d06890100000000000000072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 122,
+          "comment" : "uint64 overflow in length",
+          "public" : "3081a4301d06072a8648ce3d020106890100000000000000092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 123,
+          "comment" : "uint64 overflow in length",
+          "public" : "3081a3301406072a8648ce3d020106092b240303020801010d03890100000000000000820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 124,
+          "comment" : "length = 2**31 - 1",
+          "public" : "30847fffffff301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 125,
+          "comment" : "length = 2**31 - 1",
+          "public" : "30819f30847fffffff06072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 126,
+          "comment" : "length = 2**31 - 1",
+          "public" : "30819f301806847fffffff2a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 127,
+          "comment" : "length = 2**31 - 1",
+          "public" : "30819f301806072a8648ce3d020106847fffffff2b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 128,
+          "comment" : "length = 2**31 - 1",
+          "public" : "30819e301406072a8648ce3d020106092b240303020801010d03847fffffff0004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 129,
+          "comment" : "length = 2**32 - 1",
+          "public" : "3084ffffffff301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 130,
+          "comment" : "length = 2**32 - 1",
+          "public" : "30819f3084ffffffff06072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 131,
+          "comment" : "length = 2**32 - 1",
+          "public" : "30819f30180684ffffffff2a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 132,
+          "comment" : "length = 2**32 - 1",
+          "public" : "30819f301806072a8648ce3d02010684ffffffff2b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 133,
+          "comment" : "length = 2**32 - 1",
+          "public" : "30819e301406072a8648ce3d020106092b240303020801010d0384ffffffff0004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 134,
+          "comment" : "length = 2**40 - 1",
+          "public" : "3085ffffffffff301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 135,
+          "comment" : "length = 2**40 - 1",
+          "public" : "3081a03085ffffffffff06072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 136,
+          "comment" : "length = 2**40 - 1",
+          "public" : "3081a030190685ffffffffff2a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 137,
+          "comment" : "length = 2**40 - 1",
+          "public" : "3081a0301906072a8648ce3d02010685ffffffffff2b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 138,
+          "comment" : "length = 2**40 - 1",
+          "public" : "30819f301406072a8648ce3d020106092b240303020801010d0385ffffffffff0004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 139,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3088ffffffffffffffff301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 140,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3081a33088ffffffffffffffff06072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 141,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3081a3301c0688ffffffffffffffff2a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 142,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3081a3301c06072a8648ce3d02010688ffffffffffffffff2b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 143,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3081a2301406072a8648ce3d020106092b240303020801010d0388ffffffffffffffff0004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 144,
+          "comment" : "incorrect length",
+          "public" : "30ff301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "incorrect length",
+          "public" : "30819b30ff06072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "incorrect length",
+          "public" : "30819b301406ff2a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "incorrect length",
+          "public" : "30819b301406072a8648ce3d020106ff2b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "incorrect length",
+          "public" : "30819a301406072a8648ce3d020106092b240303020801010d03ff0004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "indefinite length without termination",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "indefinite length without termination",
+          "public" : "30819b308006072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "indefinite length without termination",
+          "public" : "30819b301406802a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "indefinite length without termination",
+          "public" : "30819b301406072a8648ce3d020106802b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "indefinite length without termination",
+          "public" : "30819a301406072a8648ce3d020106092b240303020801010d03800004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "removing sequence",
+          "public" : "",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "removing sequence",
+          "public" : "3081850381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "lonely sequence tag",
+          "public" : "30",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "lonely sequence tag",
+          "public" : "308186300381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "appending 0's to sequence",
+          "public" : "30819d301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f30000",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "appending 0's to sequence",
+          "public" : "30819d301606072a8648ce3d020106092b240303020801010d00000381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "prepending 0's to sequence",
+          "public" : "30819d0000301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "prepending 0's to sequence",
+          "public" : "30819d3016000006072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "appending unused 0's to sequence",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f30000",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "appending unused 0's to sequence",
+          "public" : "30819d301406072a8648ce3d020106092b240303020801010d00000381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "appending null value to sequence",
+          "public" : "30819d301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f30500",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "appending null value to sequence",
+          "public" : "30819d301606072a8648ce3d020106092b240303020801010d05000381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "including garbage",
+          "public" : "3081a149817730819b301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "including garbage",
+          "public" : "3081a0250030819b301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "including garbage",
+          "public" : "30819e30819b301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f30004deadbeef",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "including garbage",
+          "public" : "3081a03019498177301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "including garbage",
+          "public" : "30819f30182500301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "including garbage",
+          "public" : "3081a33016301406072a8648ce3d020106092b240303020801010d0004deadbeef0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "including garbage",
+          "public" : "3081a03019260c49817706072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "including garbage",
+          "public" : "30819f3018260b250006072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "including garbage",
+          "public" : "3081a3301c260906072a8648ce3d02010004deadbeef06092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "including garbage",
+          "public" : "3081a0301906072a8648ce3d0201260e49817706092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "including garbage",
+          "public" : "30819f301806072a8648ce3d0201260d250006092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "including garbage",
+          "public" : "3081a3301c06072a8648ce3d0201260b06092b240303020801010d0004deadbeef0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "including garbage",
+          "public" : "3081a1301406072a8648ce3d020106092b240303020801010d2381884981770381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "including garbage",
+          "public" : "3081a0301406072a8648ce3d020106092b240303020801010d23818725000381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "including garbage",
+          "public" : "3081a4301406072a8648ce3d020106092b240303020801010d2381850381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f30004deadbeef",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "including undefined tags",
+          "public" : "3081a4aa00bb00cd0030819b301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "including undefined tags",
+          "public" : "3081a2aa02aabb30819b301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "including undefined tags",
+          "public" : "3081a3301caa00bb00cd00301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "including undefined tags",
+          "public" : "3081a1301aaa02aabb301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "including undefined tags",
+          "public" : "3081a3301c260faa00bb00cd0006072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "including undefined tags",
+          "public" : "3081a1301a260daa02aabb06072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "including undefined tags",
+          "public" : "3081a3301c06072a8648ce3d02012611aa00bb00cd0006092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "including undefined tags",
+          "public" : "3081a1301a06072a8648ce3d0201260faa02aabb06092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "including undefined tags",
+          "public" : "3081a4301406072a8648ce3d020106092b240303020801010d23818baa00bb00cd000381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "including undefined tags",
+          "public" : "3081a2301406072a8648ce3d020106092b240303020801010d238189aa02aabb0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "truncated length of sequence",
+          "public" : "3081",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "truncated length of sequence",
+          "public" : "30818730810381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "Replacing sequence with NULL",
+          "public" : "0500",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "Replacing sequence with NULL",
+          "public" : "30818705000381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "changing tag value of sequence",
+          "public" : "2e819b301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "changing tag value of sequence",
+          "public" : "2f819b301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "changing tag value of sequence",
+          "public" : "31819b301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "changing tag value of sequence",
+          "public" : "32819b301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "changing tag value of sequence",
+          "public" : "ff819b301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "changing tag value of sequence",
+          "public" : "30819b2e1406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "changing tag value of sequence",
+          "public" : "30819b2f1406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "changing tag value of sequence",
+          "public" : "30819b311406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "changing tag value of sequence",
+          "public" : "30819b321406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "changing tag value of sequence",
+          "public" : "30819bff1406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "dropping value of sequence",
+          "public" : "3000",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "dropping value of sequence",
+          "public" : "30818730000381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "truncate sequence",
+          "public" : "30819a301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "truncate sequence",
+          "public" : "30819a1406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "truncate sequence",
+          "public" : "30819a301306072a8648ce3d020106092b240303020801010381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "truncate sequence",
+          "public" : "30819a3013072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "indefinite length",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f30000",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "indefinite length",
+          "public" : "30819d308006072a8648ce3d020106092b240303020801010d00000381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "indefinite length with truncated delimiter",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f300",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "indefinite length with truncated delimiter",
+          "public" : "30819c308006072a8648ce3d020106092b240303020801010d000381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "indefinite length with additional element",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f305000000",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "indefinite length with additional element",
+          "public" : "30819f308006072a8648ce3d020106092b240303020801010d050000000381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 217,
+          "comment" : "indefinite length with truncated element",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3060811220000",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 218,
+          "comment" : "indefinite length with truncated element",
+          "public" : "3081a1308006072a8648ce3d020106092b240303020801010d0608112200000381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 219,
+          "comment" : "indefinite length with garbage",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f30000fe02beef",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 220,
+          "comment" : "indefinite length with garbage",
+          "public" : "3081a1308006072a8648ce3d020106092b240303020801010d0000fe02beef0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 221,
+          "comment" : "indefinite length with nonempty EOC",
+          "public" : "3080301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f30002beef",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 222,
+          "comment" : "indefinite length with nonempty EOC",
+          "public" : "30819f308006072a8648ce3d020106092b240303020801010d0002beef0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 223,
+          "comment" : "prepend empty sequence",
+          "public" : "30819d3000301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 224,
+          "comment" : "prepend empty sequence",
+          "public" : "30819d3016300006072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 225,
+          "comment" : "append empty sequence",
+          "public" : "30819d301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f33000",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 226,
+          "comment" : "append empty sequence",
+          "public" : "30819d301606072a8648ce3d020106092b240303020801010d30000381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 227,
+          "comment" : "sequence of sequence",
+          "public" : "30819e30819b301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 228,
+          "comment" : "sequence of sequence",
+          "public" : "30819d3016301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 229,
+          "comment" : "truncated sequence",
+          "public" : "3016301406072a8648ce3d020106092b240303020801010d",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 230,
+          "comment" : "truncated sequence",
+          "public" : "308190300906072a8648ce3d02010381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 231,
+          "comment" : "repeat element in sequence",
+          "public" : "30820120301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f30381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 232,
+          "comment" : "repeat element in sequence",
+          "public" : "3081a6301f06072a8648ce3d020106092b240303020801010d06092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 233,
+          "comment" : "long form encoding of length",
+          "public" : "30819c30811406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 234,
+          "comment" : "long form encoding of length",
+          "public" : "30819c30150681072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 235,
+          "comment" : "long form encoding of length",
+          "public" : "30819c301506072a8648ce3d02010681092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 236,
+          "comment" : "removing oid",
+          "public" : "308192300b06092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 237,
+          "comment" : "lonely oid tag",
+          "public" : "308193300c0606092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 238,
+          "comment" : "lonely oid tag",
+          "public" : "308191300a06072a8648ce3d0201060381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 239,
+          "comment" : "appending 0's to oid",
+          "public" : "30819d301606092a8648ce3d0201000006092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 240,
+          "comment" : "appending 0's to oid",
+          "public" : "30819d301606072a8648ce3d0201060b2b240303020801010d00000381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 241,
+          "comment" : "prepending 0's to oid",
+          "public" : "30819d3016060900002a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 242,
+          "comment" : "prepending 0's to oid",
+          "public" : "30819d301606072a8648ce3d0201060b00002b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 243,
+          "comment" : "appending unused 0's to oid",
+          "public" : "30819d301606072a8648ce3d0201000006092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 244,
+          "comment" : "appending null value to oid",
+          "public" : "30819d301606092a8648ce3d0201050006092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 245,
+          "comment" : "appending null value to oid",
+          "public" : "30819d301606072a8648ce3d0201060b2b240303020801010d05000381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 246,
+          "comment" : "truncated length of oid",
+          "public" : "308194300d068106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 247,
+          "comment" : "truncated length of oid",
+          "public" : "308192300b06072a8648ce3d020106810381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 248,
+          "comment" : "Replacing oid with NULL",
+          "public" : "308194300d050006092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 249,
+          "comment" : "Replacing oid with NULL",
+          "public" : "308192300b06072a8648ce3d020105000381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 250,
+          "comment" : "changing tag value of oid",
+          "public" : "30819b301404072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 251,
+          "comment" : "changing tag value of oid",
+          "public" : "30819b301405072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 252,
+          "comment" : "changing tag value of oid",
+          "public" : "30819b301407072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 253,
+          "comment" : "changing tag value of oid",
+          "public" : "30819b301408072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 254,
+          "comment" : "changing tag value of oid",
+          "public" : "30819b3014ff072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 255,
+          "comment" : "changing tag value of oid",
+          "public" : "30819b301406072a8648ce3d020104092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 256,
+          "comment" : "changing tag value of oid",
+          "public" : "30819b301406072a8648ce3d020105092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 257,
+          "comment" : "changing tag value of oid",
+          "public" : "30819b301406072a8648ce3d020107092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 258,
+          "comment" : "changing tag value of oid",
+          "public" : "30819b301406072a8648ce3d020108092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 259,
+          "comment" : "changing tag value of oid",
+          "public" : "30819b301406072a8648ce3d0201ff092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 260,
+          "comment" : "dropping value of oid",
+          "public" : "308194300d060006092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 261,
+          "comment" : "dropping value of oid",
+          "public" : "308192300b06072a8648ce3d020106000381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 262,
+          "comment" : "modify first byte of oid",
+          "public" : "30819b30140607288648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 263,
+          "comment" : "modify first byte of oid",
+          "public" : "30819b301406072a8648ce3d0201060929240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 264,
+          "comment" : "modify last byte of oid",
+          "public" : "30819b301406072a8648ce3d028106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 265,
+          "comment" : "modify last byte of oid",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801018d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 266,
+          "comment" : "truncate oid",
+          "public" : "30819a301306062a8648ce3d0206092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 267,
+          "comment" : "truncate oid",
+          "public" : "30819a301306068648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 268,
+          "comment" : "truncate oid",
+          "public" : "30819a301306072a8648ce3d020106082b240303020801010381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 269,
+          "comment" : "truncate oid",
+          "public" : "30819a301306072a8648ce3d02010608240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 270,
+          "comment" : "wrong oid",
+          "public" : "30819e3017060a3262306530333032316106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 271,
+          "comment" : "wrong oid",
+          "public" : "3081a6301f061236303836343830313635303330343032303106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 272,
+          "comment" : "wrong oid",
+          "public" : "30819c301506072a8648ce3d0201060a326230653033303231610381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 273,
+          "comment" : "wrong oid",
+          "public" : "3081a4301d06072a8648ce3d020106123630383634383031363530333034303230310381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 274,
+          "comment" : "longer oid",
+          "public" : "3081a4301d06103261383634386365336430323031303106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 275,
+          "comment" : "longer oid",
+          "public" : "3081a6301f06072a8648ce3d0201061432623234303330333032303830313031306430310381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 276,
+          "comment" : "oid with modified node",
+          "public" : "3081a2301b060e326138363438636533643032313106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 277,
+          "comment" : "oid with modified node",
+          "public" : "3081aa302306163261383634386365336430323838383038303830303106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 278,
+          "comment" : "oid with modified node",
+          "public" : "3081a4301d06072a8648ce3d020106123262323430333033303230383031303131640381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 279,
+          "comment" : "oid with modified node",
+          "public" : "3081ac302506072a8648ce3d0201061a32623234303330333032303830313031383838303830383030640381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 280,
+          "comment" : "large integer in oid",
+          "public" : "3081b4302d0620326138363438636533643032383238303830383038303830383038303830303106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 281,
+          "comment" : "large integer in oid",
+          "public" : "3081b6302f06072a8648ce3d020106243262323430333033303230383031303138323830383038303830383038303830383030640381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 282,
+          "comment" : "oid with invalid node",
+          "public" : "3081a5301e0611326138363438636533643032303165303306092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 283,
+          "comment" : "oid with invalid node",
+          "public" : "30819c301506082a808648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 284,
+          "comment" : "oid with invalid node",
+          "public" : "3081a7302006072a8648ce3d020106153262323430333033303230383031303130646530330381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 285,
+          "comment" : "oid with invalid node",
+          "public" : "30819c301506072a8648ce3d0201060a2b80240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 286,
+          "comment" : "lonely bit string tag",
+          "public" : "3017301406072a8648ce3d020106092b240303020801010d03",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 287,
+          "comment" : "appending 0's to bit string",
+          "public" : "30819d301406072a8648ce3d020106092b240303020801010d0381840004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f30000",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 288,
+          "comment" : "prepending 0's to bit string",
+          "public" : "30819d301406072a8648ce3d020106092b240303020801010d03818400000004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 289,
+          "comment" : "appending null value to bit string",
+          "public" : "30819d301406072a8648ce3d020106092b240303020801010d0381840004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f30500",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 290,
+          "comment" : "truncated length of bit string",
+          "public" : "3018301406072a8648ce3d020106092b240303020801010d0381",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 291,
+          "comment" : "Replacing bit string with NULL",
+          "public" : "3018301406072a8648ce3d020106092b240303020801010d0500",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 292,
+          "comment" : "changing tag value of bit string",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0181820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 293,
+          "comment" : "changing tag value of bit string",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0281820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 294,
+          "comment" : "changing tag value of bit string",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0481820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 295,
+          "comment" : "changing tag value of bit string",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0581820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 296,
+          "comment" : "changing tag value of bit string",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010dff81820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 297,
+          "comment" : "dropping value of bit string",
+          "public" : "3018301406072a8648ce3d020106092b240303020801010d0300",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 298,
+          "comment" : "modify first byte of bit string",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820204770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 299,
+          "comment" : "modify last byte of bit string",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd39373",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 300,
+          "comment" : "truncate bit string",
+          "public" : "30819a301406072a8648ce3d020106092b240303020801010d0381810004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 301,
+          "comment" : "truncate bit string",
+          "public" : "30819a301406072a8648ce3d020106092b240303020801010d03818104770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 302,
+          "comment" : "declaring bits as unused in a bit-string",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820104770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 303,
+          "comment" : "unused bits in a bit-string",
+          "public" : "30819f301406072a8648ce3d020106092b240303020801010d0381862004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f301020304",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 304,
+          "comment" : "unused bits in empty bit-string",
+          "public" : "3019301406072a8648ce3d020106092b240303020801010d030103",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 305,
+          "comment" : "128 unused bits",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381828004770edae4349afd54ef98dec68972532ea29e32aea960bd5b56323c79951ff0889d1fa2dce7d283995bbc5a00eba20e89e26f2fe8d253090dc83238da249103497ccc96269734432df9c7ff8ec758fc1bbe95e94a97ad1ddfb339bc9c274c0b145eace75dae38773795002ea03bb109ac2123a2c045ef7c3bbfb735f57cd393f3",
+          "private" : "099d34308f0fc8f61d0009d4d7b28f50c02fdaaa26697b93ed0e33d0f99e8b96c9a06c810d2872b2373ed7dc6b5180bcaa63d8db6b49604895a94fddcf06cb219",
+          "shared" : "a9ab631eb81be9ad9661ae012c84719d87632bd623343f0f4a85004befafb5cafdc6fd33f5c408154645f458c541be320c7baa12155d9ed858cdc916f515d08d",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdh_secp224r1_ecpoint_test.json b/third_party/wycheproof/testvectors/ecdh_secp224r1_ecpoint_test.json
new file mode 100644
index 0000000..14f289e
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdh_secp224r1_ecpoint_test.json
@@ -0,0 +1,614 @@
+{
+  "algorithm" : "ECDH",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "AddSubChain" : "The private key has a special value. Implementations using addition subtraction chains for the point multiplication may get the point at infinity as an intermediate result. See CVE_2017_10176",
+    "CompressedPoint" : "The point in the public key is compressed. Not every library supports points in compressed format."
+  },
+  "numberOfTests" : 65,
+  "header" : [],
+  "testGroups" : [
+    {
+      "curve" : "secp224r1",
+      "encoding" : "ecpoint",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "normal case",
+          "public" : "047d8ac211e1228eb094e285a957d9912e93deee433ed777440ae9fc719b01d050dfbe653e72f39491be87fb1a2742daa6e0a2aada98bb1aca",
+          "private" : "565577a49415ca761a0322ad54e4ad0ae7625174baf372c2816f5328",
+          "shared" : "b8ecdb552d39228ee332bafe4886dbff272f7109edf933bc7542bd4f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "compressed public key",
+          "public" : "027d8ac211e1228eb094e285a957d9912e93deee433ed777440ae9fc71",
+          "private" : "565577a49415ca761a0322ad54e4ad0ae7625174baf372c2816f5328",
+          "shared" : "b8ecdb552d39228ee332bafe4886dbff272f7109edf933bc7542bd4f",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "edge case for shared secret",
+          "public" : "04e73a6ca72f3a2fae6e0a01a0ed03bfa3058b04576942eaf063095e62ca16fd31fa0f38eeb592cbeea1147751fdd2a5b6cc0ead404467a5b6",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "00000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "edge case for shared secret",
+          "public" : "045763fa2ae16367ad23d471cc9a52466f0d81d864e5640cefe384114594d9fecfbed4f254505ac8b41d2532055a07f0241c4818b552cbb636",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "00000000000000000000000100000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "edge case for shared secret",
+          "public" : "04142c1fd80fa2121a59aa898144084ec033f7a56a34eee0b499e29ae51c6d8c1bbb1ef2a76d565899fe44ffc1207d530d7f598fb77f4bb76b",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "00000000000000ffffffffffffff0000000000000100000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "edge case for shared secret",
+          "public" : "04ed6f793e10c80d12d871cf8988399c4898a9bf9ffd8f27399f63de25f0051cdf4eec7f368f922cfcd948893ceca0c92e540cc4367a99a66a",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "00000000ffffffffffffffff00000000000000010000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "edge case for shared secret",
+          "public" : "0408fcfc1a63c82860be12e4137433dfc40be9acdd245f9a8c4e56be61a385fc09f808383383f4b1d0d5365b6e5dcfacdc19bc7bcfed221274",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "edge case for shared secret",
+          "public" : "04d883ed77f1861e8712800d31df67888fe39f150c79a27aa88caeda6b180f3f623e2ff3ab5370cf8179165b085af3dd4502850c0104caed9a",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "0003fffffff00000003fffffff00000003fffffff000000040000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "edge case for shared secret",
+          "public" : "042b8b279b85ee3f3d2c0abeb36fdfc5aad6157d652d26489381a32cd73224bd757ef794acc92b0b3b9e7990618bb343a9a09bdb9d3616eff6",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "01fffffffc00000007fffffff00000001fffffffc000000080000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "edge case for shared secret",
+          "public" : "048bd5f03391eeeae1744e8fc53d314efffafa4d3fa4f1b95c3388a9cd7c86358b273119c537133eb55e79c6ac510b10980b379b919ccf2e2f",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "0a15c112ff784b1445e889f955be7e3ffdf451a2c0e76ab5cb32cf41",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "edge case for shared secret",
+          "public" : "04ce9631b6a16227778625c8e5421ae083cdd913abefde01dbe69f6c2b95386aff2b483b2c47151cfaabfd000614c683ce2e1778221ae42c1b",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "62989eaaa26a16f07330c3c51e0a4631fd016bfcede26552816aee39",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "edge case for shared secret",
+          "public" : "041f441c98eda956a6a7fdbfd8d21910860ab59d16c3e52f8e7fad6ca5df61a55fc508fc0499c55492f1e87bb2faa0cb4170b79f3a85ec2f3d",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "661ac958c0febbc718ccf39cefc6b66c4231fbb9a76f35228a3bf5c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "edge case for shared secret",
+          "public" : "04be74583cb9d3a05ae54923624e478a329a697d842dfae33141c844d7d9ba4fc96e0fe716ac0542e87368662fc2f0cb9b0ae57936ddec7190",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "6d7e41821abe1094d430237923d2a50de31768ab51b12dce8a09e34c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "edge case for shared secret",
+          "public" : "04a281ad992b363597ac93ff0de8ab1f7e51a6672dcbb58f9d739ba430ce0192874038daefc3130eec65811c7255da70fea65c1003f6892faa",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "edge case for shared secret",
+          "public" : "04be3e22133f51203f631b81dde8c020cdea5daa1f99cfc05c88fad2dc0f243798d6e72d1de9e3cdca4144e0a6c0f2a584d07589006972c197",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "edge case for shared secret",
+          "public" : "04af14547c20afbd91bfe64ea03d45a76a71241f23520ef897ff91eff1b54ca6ca8c25fd73852ec6654617434eff7f0225684d4dea7a4f8a97",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "ffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "edge case for shared secret",
+          "public" : "04b1e484925018729926acda56ff3e2f6c1e7e8f162b178d8e8afb45564fceaa6da5d998fe26b6b26a055169063a5ab6908852ca8b54e2de6c",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "fffff0000007fffffe000000ffffffc000001ffffff8000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "edge case for shared secret",
+          "public" : "04937eb09fb145c8829cb7df20a4cbeed396791373de277871d6c5f9cc3b5b4fd56464a71fc4a2a6af3bd251952bffa829489e68a8d06f96b6",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04000000000000000000000000000000000000000000000000000000037cac269c67bd55ea14efff4eadefe5e74978514af14c88fab46ec046",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "3fa0b9ff70b884f9f57bb84f7a9532d93f6ba803f89dd8ff008177d7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04000000000000000000000001000000000000000000000000000000012ea2f4917bdfdb008306cc10a18e2557633ba861001829dcbfb96fba",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "be1ded8cb7ff8a585181f96d681e31b332fe27dcae922dca2310300d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "0400000000000000ffffffffffffff000000000000010000000000000073ca5f8f104997a2399e0c7f25e72a75ec29fc4542533d3fea89a33a",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "a2e86a260e13515918a0cafdd87855f231b5624c560f976159e06a75",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "0400000000ffffffffffffffff000000000000000100000000000000006fe6805f59b19b0dd389452a1d4a420bfeb6c369cf6fed5b12e6e654",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "31ef7c8d10404a0046994f313a70574b027e87f9028eca242c1b5bf5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff77c5cfa4e2c384938d48bd8dd98f54c86b279f1df8c0a1f6692439c9",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "d1976a8ef5f54f24f5a269ad504fdca849fc9c28587ba294ef267396",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "040003fffffff00000003fffffff00000003fffffff00000004000000001f0828136016bb97445461bc59f2175d8d23557d6b9381f26136e3d",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "ce7890d108ddb2e5474e6417fcf7a9f2b3bd018816062f4835260dc8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "0401fffffffc00000007fffffff00000001fffffffc0000000800000012d8acca6f199d4a94b933ba1aa713a7debde8ac57b928f596ae66a66",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "30b6ff6e8051dae51e4fe34b2d9a0b1879153e007eb0b5bdf1791a9c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "040a15c112ff784b1445e889f955be7e3ffdf451a2c0e76ab5cb32cf413d4df973c563c6decdd435e4f864557e4c273096d9941ca4260a266e",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "77ec668a00f72d85aa527624abb16c039fe490d17dd6c455a1ed7fd8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "0462989eaaa26a16f07330c3c51e0a4631fd016bfcede26552816aee39389ee9436d616cab90032931aa7fbbfcfc13309f61e2423cc8dab93c",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "a3f432f6aba9a92f49a5ea64ffe7059a9d9b487a0b5223ddc988208b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04661ac958c0febbc718ccf39cefc6b66c4231fbb9a76f35228a3bf5c3103b8040e3cb41966fc64a68cacb0c14053f87d27e8ed7bf2d7fe51b",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "1530fd9caf03737af34a4ba716b558cbecbc35d18402535a0a142313",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "046d7e41821abe1094d430237923d2a50de31768ab51b12dce8a09e34c276cf273d75d367820dd556182def0957af0a314f48fed227c298dc0",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "cfc39ccacb94ad0e0552b2e47112f60fbbe7ae0dc32230b9273dd210",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "047fffffffffffffffffffffffffffffffffffffffffffffffffffffff7d8dbca36c56bcaae92e3475f799294f30768038e816a7d5f7f07d77",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "73bd63bd384a0faafb75cfed3e95d3892cbacf0db10f282c3b644771",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc000800174f1ff5ea7fbc72b92f61e06556c26bab84c0b082dd6400ca1c1eb6d",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "85b079c62e1f5b0fd6841dfa16026e15b641f65e13a14042567166bb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04ffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0126fdd5fccd0b5aa7fd5bb5b1308584b30556248cec80208a2fe962",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "8a834ff40e3fc9f9d412a481e18537ea799536c5520c6c7baaf12166",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04fffff0000007fffffe000000ffffffc000001ffffff8000003ffffff20cfa23077acc9fbcb71339c65880cd0b966b8a9497e65abed17f0b5",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "a0887269766e6efcbc81d2b38f2d4638663f12377468a23421044188",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04ffffffff00000000ffffffff00000000ffffffff00000000ffffffff1c05ac2d4f10b69877c3243d51f887277b7bf735c326ab2f0d70da8c",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "c65d1911bc076a74588d8793ce7a0dcabf5793460cd2ebb02754a1be",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "edge case private key",
+          "public" : "04478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "3",
+          "shared" : "e71f2157bfe37697ea5193d4732dcc6e5412fa9d38387eacd391c1c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "edge case private key",
+          "public" : "04478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "fa2664717c7fa0161ec2c669b2c0986cdc20456a6e5406302bb53c77",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "edge case private key",
+          "public" : "04478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "1000000000000000000000000000000000000000000000000000000",
+          "shared" : "af6e5ad34497bae0745f53ad78ce8b285d79f400d5c6e6a071f8e6bd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "edge case private key",
+          "public" : "04478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "12fd302ff8c13c55a9c111f8bb6b0a13ecf88299c0ae3032ce2bcaff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "edge case private key",
+          "public" : "04478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "080000000000000000000000000000000000000000000000000000000",
+          "shared" : "73f1a395b842f1a6752ae417e2c3dc90cafc4476d1d861b7e68ad030",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "edge case private key",
+          "public" : "04478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03d13dd29455c5c2a3d",
+          "shared" : "b329c20ddb7c78ee4e622bb23a984c0d273ba34b6269f3d9e8f89f8e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "edge case private key",
+          "public" : "04478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13cd29455c5c2a3d",
+          "shared" : "6f48345209b290ffc5abbe754a201479e5d667a209468080d06197b4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "edge case private key",
+          "public" : "04478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13d529455c5c2a3d",
+          "shared" : "9f6e30c1c9dad42a153aacd4b49a8e5c721d085cd07b5d5aec244fc1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "edge case private key",
+          "public" : "04478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13dd29445c5c2a3d",
+          "shared" : "8cadfb19a80949e61bd5b829ad0e76d18a5bb2eeb9ed7fe2b901cecd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "edge case private key",
+          "public" : "04478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c29b7",
+          "shared" : "475fd96e0eb8cb8f100a5d7fe043a7a6851d1d611da2643a3c6ae708",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 45,
+          "comment" : "edge case private key",
+          "public" : "04478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a37",
+          "shared" : "41ef931d669d1f57d8bb95a01a92321da74be8c6cbc3bbe0b2e73ebd",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 46,
+          "comment" : "edge case private key",
+          "public" : "04478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a",
+          "shared" : "e71f2157bfe37697ea5193d4732dcc6e5412fa9d38387eacd391c1c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "edge case private key",
+          "public" : "04478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3b",
+          "shared" : "11ff15126411299cbd49e2b7542e69e91ef132e2551a16ecfebb23a3",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 48,
+          "comment" : "point is not on curve",
+          "public" : "040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "point is not on curve",
+          "public" : "040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "point is not on curve",
+          "public" : "0400000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "point is not on curve",
+          "public" : "0400000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "point is not on curve",
+          "public" : "040000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "point is not on curve",
+          "public" : "040000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "point is not on curve",
+          "public" : "0400000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffff000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "point is not on curve",
+          "public" : "0400000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "point is not on curve",
+          "public" : "04ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "point is not on curve",
+          "public" : "04ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "point is not on curve",
+          "public" : "04ffffffffffffffffffffffffffffffff000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "point is not on curve",
+          "public" : "04ffffffffffffffffffffffffffffffff000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "point is not on curve",
+          "public" : "04ffffffffffffffffffffffffffffffff00000000000000000000000100000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "point is not on curve",
+          "public" : "04ffffffffffffffffffffffffffffffff00000000000000000000000100000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "point is not on curve",
+          "public" : "04ffffffffffffffffffffffffffffffff000000000000000000000001ffffffffffffffffffffffffffffffff000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "point is not on curve",
+          "public" : "04ffffffffffffffffffffffffffffffff000000000000000000000001ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "",
+          "public" : "",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "invalid public key",
+          "public" : "020ca753db5ddeca474241f8d2dafc0844343fd0e37eded2f0192d51b2",
+          "private" : "0fc28a0ca0f8e36b0d4f71421845135a22aef543b9fddf8c775b2d18f",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdh_secp224r1_test.json b/third_party/wycheproof/testvectors/ecdh_secp224r1_test.json
new file mode 100644
index 0000000..33f523e
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdh_secp224r1_test.json
@@ -0,0 +1,3264 @@
+{
+  "algorithm" : "ECDH",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "AddSubChain" : "The private key has a special value. Implementations using addition subtraction chains for the point multiplication may get the point at infinity as an intermediate result. See CVE_2017_10176",
+    "CompressedPoint" : "The point in the public key is compressed. Not every library supports points in compressed format.",
+    "InvalidAsn" : "The public key in this test uses an invalid ASN encoding. Some cases where the ASN parser is not strictly checking the ASN format are benign as long as the ECDH computation still returns the correct shared value.",
+    "InvalidPublic" : "The public key has been modified and is invalid. An implementation should always check whether the public key is valid and on the same curve as the private key. The test vector includes the shared secret computed with the original public key if the public point is on the curve of the private key. Generating a shared secret other than the one with the original key likely indicates that the bug is exploitable.",
+    "ModifiedPrime" : "The modulus of the public key has been modified. The public point of the public key has been chosen so that it is both a point on both the curve of the modified public key and the private key.",
+    "UnnamedCurve" : "The public key does not use a named curve. RFC 3279 allows to encode such curves by explicitly encoding, the parameters of the curve equation, modulus, generator, order and cofactor. However, many crypto libraries only support named curves. Modifying some of the EC parameters and encoding the corresponding public key as an unnamed curve is a potential attack vector.",
+    "UnusedParam" : "A parameter that is typically not used for ECDH has been modified. Sometimes libraries ignore small differences between public and private key. For example, a library might ignore an incorrect cofactor in the public key. We consider ignoring such changes as acceptable as long as these differences do not change the outcome of the ECDH computation, i.e. as long as the computation is done on the curve from the private key.",
+    "WeakPublicKey" : "The vector contains a weak public key. The curve is not a named curve, the public key point has order 3 and has been chosen to be on the same curve as the private key. This test vector is used to check ECC implementations for missing steps in the verification of the public key.",
+    "WrongOrder" : "The order of the public key has been modified. If this order is used in a cryptographic primitive instead of the correct order then private keys may leak. E.g. ECDHC in BC 1.52 suffered from this."
+  },
+  "numberOfTests" : 306,
+  "header" : [],
+  "testGroups" : [
+    {
+      "curve" : "secp224r1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "normal case",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00047d8ac211e1228eb094e285a957d9912e93deee433ed777440ae9fc719b01d050dfbe653e72f39491be87fb1a2742daa6e0a2aada98bb1aca",
+          "private" : "565577a49415ca761a0322ad54e4ad0ae7625174baf372c2816f5328",
+          "shared" : "b8ecdb552d39228ee332bafe4886dbff272f7109edf933bc7542bd4f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "compressed public key",
+          "public" : "3032301006072a8648ce3d020106052b81040021031e00027d8ac211e1228eb094e285a957d9912e93deee433ed777440ae9fc71",
+          "private" : "565577a49415ca761a0322ad54e4ad0ae7625174baf372c2816f5328",
+          "shared" : "b8ecdb552d39228ee332bafe4886dbff272f7109edf933bc7542bd4f",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004e73a6ca72f3a2fae6e0a01a0ed03bfa3058b04576942eaf063095e62ca16fd31fa0f38eeb592cbeea1147751fdd2a5b6cc0ead404467a5b6",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "00000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00045763fa2ae16367ad23d471cc9a52466f0d81d864e5640cefe384114594d9fecfbed4f254505ac8b41d2532055a07f0241c4818b552cbb636",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "00000000000000000000000100000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004142c1fd80fa2121a59aa898144084ec033f7a56a34eee0b499e29ae51c6d8c1bbb1ef2a76d565899fe44ffc1207d530d7f598fb77f4bb76b",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "00000000000000ffffffffffffff0000000000000100000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ed6f793e10c80d12d871cf8988399c4898a9bf9ffd8f27399f63de25f0051cdf4eec7f368f922cfcd948893ceca0c92e540cc4367a99a66a",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "00000000ffffffffffffffff00000000000000010000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000408fcfc1a63c82860be12e4137433dfc40be9acdd245f9a8c4e56be61a385fc09f808383383f4b1d0d5365b6e5dcfacdc19bc7bcfed221274",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004d883ed77f1861e8712800d31df67888fe39f150c79a27aa88caeda6b180f3f623e2ff3ab5370cf8179165b085af3dd4502850c0104caed9a",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "0003fffffff00000003fffffff00000003fffffff000000040000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00042b8b279b85ee3f3d2c0abeb36fdfc5aad6157d652d26489381a32cd73224bd757ef794acc92b0b3b9e7990618bb343a9a09bdb9d3616eff6",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "01fffffffc00000007fffffff00000001fffffffc000000080000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00048bd5f03391eeeae1744e8fc53d314efffafa4d3fa4f1b95c3388a9cd7c86358b273119c537133eb55e79c6ac510b10980b379b919ccf2e2f",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "0a15c112ff784b1445e889f955be7e3ffdf451a2c0e76ab5cb32cf41",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ce9631b6a16227778625c8e5421ae083cdd913abefde01dbe69f6c2b95386aff2b483b2c47151cfaabfd000614c683ce2e1778221ae42c1b",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "62989eaaa26a16f07330c3c51e0a4631fd016bfcede26552816aee39",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00041f441c98eda956a6a7fdbfd8d21910860ab59d16c3e52f8e7fad6ca5df61a55fc508fc0499c55492f1e87bb2faa0cb4170b79f3a85ec2f3d",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "661ac958c0febbc718ccf39cefc6b66c4231fbb9a76f35228a3bf5c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004be74583cb9d3a05ae54923624e478a329a697d842dfae33141c844d7d9ba4fc96e0fe716ac0542e87368662fc2f0cb9b0ae57936ddec7190",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "6d7e41821abe1094d430237923d2a50de31768ab51b12dce8a09e34c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004a281ad992b363597ac93ff0de8ab1f7e51a6672dcbb58f9d739ba430ce0192874038daefc3130eec65811c7255da70fea65c1003f6892faa",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004be3e22133f51203f631b81dde8c020cdea5daa1f99cfc05c88fad2dc0f243798d6e72d1de9e3cdca4144e0a6c0f2a584d07589006972c197",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004af14547c20afbd91bfe64ea03d45a76a71241f23520ef897ff91eff1b54ca6ca8c25fd73852ec6654617434eff7f0225684d4dea7a4f8a97",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "ffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004b1e484925018729926acda56ff3e2f6c1e7e8f162b178d8e8afb45564fceaa6da5d998fe26b6b26a055169063a5ab6908852ca8b54e2de6c",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "fffff0000007fffffe000000ffffffc000001ffffff8000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004937eb09fb145c8829cb7df20a4cbeed396791373de277871d6c5f9cc3b5b4fd56464a71fc4a2a6af3bd251952bffa829489e68a8d06f96b6",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004000000000000000000000000000000000000000000000000000000037cac269c67bd55ea14efff4eadefe5e74978514af14c88fab46ec046",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "3fa0b9ff70b884f9f57bb84f7a9532d93f6ba803f89dd8ff008177d7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004000000000000000000000001000000000000000000000000000000012ea2f4917bdfdb008306cc10a18e2557633ba861001829dcbfb96fba",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "be1ded8cb7ff8a585181f96d681e31b332fe27dcae922dca2310300d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000400000000000000ffffffffffffff000000000000010000000000000073ca5f8f104997a2399e0c7f25e72a75ec29fc4542533d3fea89a33a",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "a2e86a260e13515918a0cafdd87855f231b5624c560f976159e06a75",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000400000000ffffffffffffffff000000000000000100000000000000006fe6805f59b19b0dd389452a1d4a420bfeb6c369cf6fed5b12e6e654",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "31ef7c8d10404a0046994f313a70574b027e87f9028eca242c1b5bf5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff77c5cfa4e2c384938d48bd8dd98f54c86b279f1df8c0a1f6692439c9",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "d1976a8ef5f54f24f5a269ad504fdca849fc9c28587ba294ef267396",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00040003fffffff00000003fffffff00000003fffffff00000004000000001f0828136016bb97445461bc59f2175d8d23557d6b9381f26136e3d",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "ce7890d108ddb2e5474e6417fcf7a9f2b3bd018816062f4835260dc8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000401fffffffc00000007fffffff00000001fffffffc0000000800000012d8acca6f199d4a94b933ba1aa713a7debde8ac57b928f596ae66a66",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "30b6ff6e8051dae51e4fe34b2d9a0b1879153e007eb0b5bdf1791a9c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00040a15c112ff784b1445e889f955be7e3ffdf451a2c0e76ab5cb32cf413d4df973c563c6decdd435e4f864557e4c273096d9941ca4260a266e",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "77ec668a00f72d85aa527624abb16c039fe490d17dd6c455a1ed7fd8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000462989eaaa26a16f07330c3c51e0a4631fd016bfcede26552816aee39389ee9436d616cab90032931aa7fbbfcfc13309f61e2423cc8dab93c",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "a3f432f6aba9a92f49a5ea64ffe7059a9d9b487a0b5223ddc988208b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004661ac958c0febbc718ccf39cefc6b66c4231fbb9a76f35228a3bf5c3103b8040e3cb41966fc64a68cacb0c14053f87d27e8ed7bf2d7fe51b",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "1530fd9caf03737af34a4ba716b558cbecbc35d18402535a0a142313",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00046d7e41821abe1094d430237923d2a50de31768ab51b12dce8a09e34c276cf273d75d367820dd556182def0957af0a314f48fed227c298dc0",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "cfc39ccacb94ad0e0552b2e47112f60fbbe7ae0dc32230b9273dd210",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00047fffffffffffffffffffffffffffffffffffffffffffffffffffffff7d8dbca36c56bcaae92e3475f799294f30768038e816a7d5f7f07d77",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "73bd63bd384a0faafb75cfed3e95d3892cbacf0db10f282c3b644771",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc000800174f1ff5ea7fbc72b92f61e06556c26bab84c0b082dd6400ca1c1eb6d",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "85b079c62e1f5b0fd6841dfa16026e15b641f65e13a14042567166bb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0126fdd5fccd0b5aa7fd5bb5b1308584b30556248cec80208a2fe962",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "8a834ff40e3fc9f9d412a481e18537ea799536c5520c6c7baaf12166",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004fffff0000007fffffe000000ffffffc000001ffffff8000003ffffff20cfa23077acc9fbcb71339c65880cd0b966b8a9497e65abed17f0b5",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "a0887269766e6efcbc81d2b38f2d4638663f12377468a23421044188",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffff00000000ffffffff00000000ffffffff00000000ffffffff1c05ac2d4f10b69877c3243d51f887277b7bf735c326ab2f0d70da8c",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "c65d1911bc076a74588d8793ce7a0dcabf5793460cd2ebb02754a1be",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "3",
+          "shared" : "e71f2157bfe37697ea5193d4732dcc6e5412fa9d38387eacd391c1c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "fa2664717c7fa0161ec2c669b2c0986cdc20456a6e5406302bb53c77",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "1000000000000000000000000000000000000000000000000000000",
+          "shared" : "af6e5ad34497bae0745f53ad78ce8b285d79f400d5c6e6a071f8e6bd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "12fd302ff8c13c55a9c111f8bb6b0a13ecf88299c0ae3032ce2bcaff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "080000000000000000000000000000000000000000000000000000000",
+          "shared" : "73f1a395b842f1a6752ae417e2c3dc90cafc4476d1d861b7e68ad030",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03d13dd29455c5c2a3d",
+          "shared" : "b329c20ddb7c78ee4e622bb23a984c0d273ba34b6269f3d9e8f89f8e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13cd29455c5c2a3d",
+          "shared" : "6f48345209b290ffc5abbe754a201479e5d667a209468080d06197b4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13d529455c5c2a3d",
+          "shared" : "9f6e30c1c9dad42a153aacd4b49a8e5c721d085cd07b5d5aec244fc1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13dd29445c5c2a3d",
+          "shared" : "8cadfb19a80949e61bd5b829ad0e76d18a5bb2eeb9ed7fe2b901cecd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c29b7",
+          "shared" : "475fd96e0eb8cb8f100a5d7fe043a7a6851d1d611da2643a3c6ae708",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 45,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a37",
+          "shared" : "41ef931d669d1f57d8bb95a01a92321da74be8c6cbc3bbe0b2e73ebd",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 46,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a",
+          "shared" : "e71f2157bfe37697ea5193d4732dcc6e5412fa9d38387eacd391c1c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3b",
+          "shared" : "11ff15126411299cbd49e2b7542e69e91ef132e2551a16ecfebb23a3",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 48,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000400000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000400000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00040000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00040000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000400000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffff000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000400000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffffffffffffffffffffffffffff000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffffffffffffffffffffffffffff000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffffffffffffffffffffffffffff00000000000000000000000100000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffffffffffffffffffffffffffff00000000000000000000000100000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffffffffffffffffffffffffffff000000000000000000000001ffffffffffffffffffffffffffffffff000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffffffffffffffffffffffffffff000000000000000000000001ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "",
+          "public" : "3015301006072a8648ce3d020106052b81040021030100",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "public point not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5d",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 66,
+          "comment" : "public point = (0,0)",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 67,
+          "comment" : "order = -26959946667150639794667015087019625940457807714424391721682722368061",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021dff0000000000000000000000000000e95d1f470fc1ec22d6baa3a3d5c3020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 68,
+          "comment" : "order = 0",
+          "public" : "3081f73081b806072a8648ce3d02013081ac020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34020100020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 69,
+          "comment" : "order = 1",
+          "public" : "3081f73081b806072a8648ce3d02013081ac020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34020101020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 70,
+          "comment" : "order = 6277101735386680763835789423207665314073163949517624387909",
+          "public" : "3082010f3081d006072a8648ce3d02013081c4020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021900ffffffffffffffffffffffffffff16a2e0b8f03e13dd2945020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 71,
+          "comment" : "generator = (0,0)",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb40439040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 72,
+          "comment" : "generator not on curve",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e36021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 73,
+          "comment" : "cofactor = -1",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d0201ff033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 74,
+          "comment" : "cofactor = 0",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020100033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 75,
+          "comment" : "cofactor = 2",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020102033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 76,
+          "comment" : "cofactor = 26959946667150639794667015087019625940457807714424391721682722368061",
+          "public" : "3082012f3081f006072a8648ce3d02013081e4020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 77,
+          "comment" : "cofactor = None",
+          "public" : "308201103081d106072a8648ce3d02013081c5020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 78,
+          "comment" : "modified prime",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00c123da0a46a971da9468161e61a5c71a02e6c9bdb3392f4016fb457b303c041c3edc25f5b9568e256b97e9e19e5a38e4fd1936424cc6d0bfe904ba83041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904000000000000000000285145f31ae4d40000000000000000000003387edad63d1a600740ce66b6f04d67ed06ea1a75c16294336ed05b3fa3021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101033a0004000000000000000000285145f31ae4d40000000000000000000003387edad63d1a600740ce66b6f04d67ed06ea1a75c16294336ed05b3fa3",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "3de0a5036fcde544c72cbe33cedb8709549bc3b6a4d750ee0de4c80d",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 79,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 80,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 81,
+          "comment" : "a = 0",
+          "public" : "3081f83081b906072a8648ce3d02013081ad020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff0000000000000000000000013021040100041cd0d5e347a38ce5b6e1f47edddd8a223bca45d2015de76ec835a4df57043904a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 82,
+          "comment" : "public key of order 3",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041ce8f32429d997935dc5e2e6621cc0c130464d38c8cdf26454bb36080d041cdcc54f9c4dfd9b10d8c2cc735751d55b0ab7a7765cf9d49483bf6d8804390481020a9259fe8552f4aa794669b24033bc9283bc57715cc013e8ddc612cd1b9eb05e696610a5e8cae07a522a74eff150eb553adf98c01478021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101033a000481020a9259fe8552f4aa794669b24033bc9283bc57715cc013e8ddc6ed32e4614fa19699ef5a17351f85add48b100eaf14aac520673feb89",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "19845b25666b143d3f0f070781c1c595c66b9e854106a56b7db774cb",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 83,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ea36cf70fab75684eabe6569ce623db0deaa8c95f61c8be50b8b9f3eb7d4b9ec48d9e4814f4cb1c286589eaaa990d3f3238b2d6d6be964abfad964824b653376",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200044b2470ad3d13269c10a17d222ebdffbd61fb04488db1b1d7caef8d4988b7bb8ba6d81857a05b255232b9e37a30e328bb9d9c42d86096f2bcee3d258cfe208d2fd03cbd5ccc6a3bb8ce4b0efa5b059b4afbd0377aa6e274721a57efe8ee85d86a",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004012841a2260f0f1f424865fef275374779bf0355720223f8ec6a9ba767b1603b492f58a6bba1705d882257bc6be1935de4411c5f1fdad44ec65ba8b97ce0e73e1ac90006937832a602147e37c1a42ca2a63629ffc9a35b31bfacb38c6242b42916125f7446b45c718f797259bc3011cb71e868560b331cf7d01139a0643443f9fd7306c1",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004c2199fecf75648c0e952dff143821fa4012b28f90435ce6ee54653687f969a76092a3844e17d478a594f43b28cc10a5c553b4f64906121031c3a79299c70dbd6",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00046caa3d6d86f792df7b29e41eb4203150f60f4fca10f57d0b2454abfb201f9f7e6dcbb92bdcfb9240dc86bcaeaf157c77bca22b2ec86ee8d6",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200042750180012c3ba7489517d428e4826784e50b50ac42ef7991c61a396c03a52da5e74908ae8a89627a7c15e554b105b0ebaeebcfed10e3ea60223d0a8bc3b36ab",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200045b523d3a8f20f6a569c6951e0b8de48d89e7549a184e8506820421c3e404473692cd248d7480843b911d87a87e401112fce0d3d2c36978cf6dd7f1d93bfaebe0827d4bf4006006d3202e842126fe1b68",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004449607c76c6dc7334c269a0ebab5beec83b6c263377ce06ef5c276f45a9916eff85f50438f5f32ced0210a6c414fe5e242c7c1070823f5395b35965bda6758acf84725f11ea836dda7d391fee91342026645241853224a437a6fb74e4cdc871f",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000463e7a491240848e4f53ea5fb857d428c493053193e4b0b4f995ac8bf4c56276a507870131a384aa7e236c64cd7a049a1b37e40ad00c3b8a920dcbad6531616356ce1b6e6d96a7d1b693e25e5abd83ab560a3d764bcd49ec98a1b49421163bd5fc5a625f44c91eb4c2984d5a2e51e816ebdee8fbe08364bb14b7ac876990e64d9",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00047c592ecb8908355d1ebf8d59b3619275dbe3666209b72ced6a3c88740456ce61d6a84e0542d7cd10dd8804afb8c784d5dffd9480d8cfdc95",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004746226a3e005c37ede51828d3375ef91ebd0ff719a380af69d7dfd131b42a3e8917d4a4d573872935a74d1040f1c47d25d6b26f4156cccdcdc11833b9cde433a",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200043298b36825c7bd90ab5157b913d40bbfd732a0de0557e02a2c65a0c223e9a65d62c32462040dd6fe578103023c831caff122c1ed4b8ff7373fa2f08d11c9f4c7f85f81802262ffed9bb82cb6d92eed2d",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200043af2849b981f7e5e6ab936e6abb4f206c1fd5561998df8008bfe98d84173c9f2301cdbd5bffc569c0b5a57ce2a8f4d640f1816475fc6043baa8e5a3453bf327b54cb29c7e54a5f31348969aa94615094dbcd1a8e5c2d630465e45fc556c02194",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e038182000453d2506047e72af6d98558e1633ecb7e6a05c37861cd3289455cf41bfbf1703f2e9a83052b8eca7d84cba2f001abd8b978f68b69ed6bd874755c44d347fe302c5760b2078c56b24ebd0dcd99f26b8f8a23044b3767a3d2a306587687a7b00668974674edbf18c3db2f3473a97ee77065fdcdd1a9aa053716a4c504f3d18b9170",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "invalid public key",
+          "public" : "3032301006072a8648ce3d020106052b81040021031e00020ca753db5ddeca474241f8d2dafc0844343fd0e37eded2f0192d51b2",
+          "private" : "0fc28a0ca0f8e36b0d4f71421845135a22aef543b9fddf8c775b2d18f",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 98,
+          "comment" : "long form encoding of length",
+          "public" : "30814e301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 99,
+          "comment" : "long form encoding of length",
+          "public" : "304f30811006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 100,
+          "comment" : "long form encoding of length",
+          "public" : "304f30110681072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 101,
+          "comment" : "long form encoding of length",
+          "public" : "304f301106072a8648ce3d02010681052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 102,
+          "comment" : "long form encoding of length",
+          "public" : "304f301006072a8648ce3d020106052b8104002103813a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 103,
+          "comment" : "length contains leading 0",
+          "public" : "3082004e301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 104,
+          "comment" : "length contains leading 0",
+          "public" : "30503082001006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 105,
+          "comment" : "length contains leading 0",
+          "public" : "30503012068200072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 106,
+          "comment" : "length contains leading 0",
+          "public" : "3050301206072a8648ce3d0201068200052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 107,
+          "comment" : "length contains leading 0",
+          "public" : "3050301006072a8648ce3d020106052b810400210382003a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 108,
+          "comment" : "wrong length",
+          "public" : "304f301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 109,
+          "comment" : "wrong length",
+          "public" : "304d301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 110,
+          "comment" : "wrong length",
+          "public" : "304e301106072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 111,
+          "comment" : "wrong length",
+          "public" : "304e300f06072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 112,
+          "comment" : "wrong length",
+          "public" : "304e301006082a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 113,
+          "comment" : "wrong length",
+          "public" : "304e301006062a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 114,
+          "comment" : "wrong length",
+          "public" : "304e301006072a8648ce3d020106062b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 115,
+          "comment" : "wrong length",
+          "public" : "304e301006072a8648ce3d020106042b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 116,
+          "comment" : "wrong length",
+          "public" : "304e301006072a8648ce3d020106052b81040021033b000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 117,
+          "comment" : "wrong length",
+          "public" : "304e301006072a8648ce3d020106052b810400210339000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 118,
+          "comment" : "uint32 overflow in length",
+          "public" : "3085010000004e301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 119,
+          "comment" : "uint32 overflow in length",
+          "public" : "30533085010000001006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 120,
+          "comment" : "uint32 overflow in length",
+          "public" : "30533015068501000000072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 121,
+          "comment" : "uint32 overflow in length",
+          "public" : "3053301506072a8648ce3d0201068501000000052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 122,
+          "comment" : "uint32 overflow in length",
+          "public" : "3053301006072a8648ce3d020106052b810400210385010000003a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 123,
+          "comment" : "uint64 overflow in length",
+          "public" : "308901000000000000004e301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 124,
+          "comment" : "uint64 overflow in length",
+          "public" : "3057308901000000000000001006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 125,
+          "comment" : "uint64 overflow in length",
+          "public" : "3057301906890100000000000000072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 126,
+          "comment" : "uint64 overflow in length",
+          "public" : "3057301906072a8648ce3d020106890100000000000000052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 127,
+          "comment" : "uint64 overflow in length",
+          "public" : "3057301006072a8648ce3d020106052b81040021038901000000000000003a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 128,
+          "comment" : "length = 2**31 - 1",
+          "public" : "30847fffffff301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 129,
+          "comment" : "length = 2**31 - 1",
+          "public" : "305230847fffffff06072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 130,
+          "comment" : "length = 2**31 - 1",
+          "public" : "3052301406847fffffff2a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 131,
+          "comment" : "length = 2**31 - 1",
+          "public" : "3052301406072a8648ce3d020106847fffffff2b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 132,
+          "comment" : "length = 2**31 - 1",
+          "public" : "3052301006072a8648ce3d020106052b8104002103847fffffff000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 133,
+          "comment" : "length = 2**32 - 1",
+          "public" : "3084ffffffff301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 134,
+          "comment" : "length = 2**32 - 1",
+          "public" : "30523084ffffffff06072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 135,
+          "comment" : "length = 2**32 - 1",
+          "public" : "305230140684ffffffff2a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 136,
+          "comment" : "length = 2**32 - 1",
+          "public" : "3052301406072a8648ce3d02010684ffffffff2b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 137,
+          "comment" : "length = 2**32 - 1",
+          "public" : "3052301006072a8648ce3d020106052b810400210384ffffffff000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 138,
+          "comment" : "length = 2**40 - 1",
+          "public" : "3085ffffffffff301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 139,
+          "comment" : "length = 2**40 - 1",
+          "public" : "30533085ffffffffff06072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 140,
+          "comment" : "length = 2**40 - 1",
+          "public" : "305330150685ffffffffff2a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 141,
+          "comment" : "length = 2**40 - 1",
+          "public" : "3053301506072a8648ce3d02010685ffffffffff2b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 142,
+          "comment" : "length = 2**40 - 1",
+          "public" : "3053301006072a8648ce3d020106052b810400210385ffffffffff000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 143,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3088ffffffffffffffff301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 144,
+          "comment" : "length = 2**64 - 1",
+          "public" : "30563088ffffffffffffffff06072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "length = 2**64 - 1",
+          "public" : "305630180688ffffffffffffffff2a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3056301806072a8648ce3d02010688ffffffffffffffff2b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3056301006072a8648ce3d020106052b810400210388ffffffffffffffff000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "incorrect length",
+          "public" : "30ff301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "incorrect length",
+          "public" : "304e30ff06072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "incorrect length",
+          "public" : "304e301006ff2a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "incorrect length",
+          "public" : "304e301006072a8648ce3d020106ff2b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "incorrect length",
+          "public" : "304e301006072a8648ce3d020106052b8104002103ff000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "indefinite length without termination",
+          "public" : "3080301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "indefinite length without termination",
+          "public" : "304e308006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "indefinite length without termination",
+          "public" : "304e301006802a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "indefinite length without termination",
+          "public" : "304e301006072a8648ce3d020106802b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "indefinite length without termination",
+          "public" : "304e301006072a8648ce3d020106052b810400210380000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "removing sequence",
+          "public" : "",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "removing sequence",
+          "public" : "303c033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "lonely sequence tag",
+          "public" : "30",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "lonely sequence tag",
+          "public" : "303d30033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "appending 0's to sequence",
+          "public" : "3050301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da620000",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "appending 0's to sequence",
+          "public" : "3050301206072a8648ce3d020106052b810400210000033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "prepending 0's to sequence",
+          "public" : "30500000301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "prepending 0's to sequence",
+          "public" : "30503012000006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "appending unused 0's to sequence",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da620000",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "appending unused 0's to sequence",
+          "public" : "3050301006072a8648ce3d020106052b810400210000033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "appending null value to sequence",
+          "public" : "3050301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da620500",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "appending null value to sequence",
+          "public" : "3050301206072a8648ce3d020106052b810400210500033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "including garbage",
+          "public" : "3053498177304e301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "including garbage",
+          "public" : "30522500304e301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "including garbage",
+          "public" : "3050304e301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da620004deadbeef",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "including garbage",
+          "public" : "30533015498177301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "including garbage",
+          "public" : "305230142500301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "including garbage",
+          "public" : "30563012301006072a8648ce3d020106052b810400210004deadbeef033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "including garbage",
+          "public" : "30533015260c49817706072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "including garbage",
+          "public" : "30523014260b250006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "including garbage",
+          "public" : "30563018260906072a8648ce3d02010004deadbeef06052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "including garbage",
+          "public" : "3053301506072a8648ce3d0201260a49817706052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "including garbage",
+          "public" : "3052301406072a8648ce3d02012609250006052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "including garbage",
+          "public" : "3056301806072a8648ce3d0201260706052b810400210004deadbeef033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "including garbage",
+          "public" : "3053301006072a8648ce3d020106052b81040021233f498177033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "including garbage",
+          "public" : "3052301006072a8648ce3d020106052b81040021233e2500033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "including garbage",
+          "public" : "3056301006072a8648ce3d020106052b81040021233c033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da620004deadbeef",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "including undefined tags",
+          "public" : "3056aa00bb00cd00304e301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "including undefined tags",
+          "public" : "3054aa02aabb304e301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "including undefined tags",
+          "public" : "30563018aa00bb00cd00301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "including undefined tags",
+          "public" : "30543016aa02aabb301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "including undefined tags",
+          "public" : "30563018260faa00bb00cd0006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "including undefined tags",
+          "public" : "30543016260daa02aabb06072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "including undefined tags",
+          "public" : "3056301806072a8648ce3d0201260daa00bb00cd0006052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "including undefined tags",
+          "public" : "3054301606072a8648ce3d0201260baa02aabb06052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "including undefined tags",
+          "public" : "3056301006072a8648ce3d020106052b810400212342aa00bb00cd00033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "including undefined tags",
+          "public" : "3054301006072a8648ce3d020106052b810400212340aa02aabb033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "truncated length of sequence",
+          "public" : "3081",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "truncated length of sequence",
+          "public" : "303e3081033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "Replacing sequence with NULL",
+          "public" : "0500",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Replacing sequence with NULL",
+          "public" : "303e0500033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "changing tag value of sequence",
+          "public" : "2e4e301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "changing tag value of sequence",
+          "public" : "2f4e301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "changing tag value of sequence",
+          "public" : "314e301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "changing tag value of sequence",
+          "public" : "324e301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "changing tag value of sequence",
+          "public" : "ff4e301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "changing tag value of sequence",
+          "public" : "304e2e1006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "changing tag value of sequence",
+          "public" : "304e2f1006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "changing tag value of sequence",
+          "public" : "304e311006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "changing tag value of sequence",
+          "public" : "304e321006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "changing tag value of sequence",
+          "public" : "304eff1006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "dropping value of sequence",
+          "public" : "3000",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "dropping value of sequence",
+          "public" : "303e3000033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "truncate sequence",
+          "public" : "304d301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "truncate sequence",
+          "public" : "304d1006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "truncate sequence",
+          "public" : "304d300f06072a8648ce3d020106052b810400033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "truncate sequence",
+          "public" : "304d300f072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "indefinite length",
+          "public" : "3080301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da620000",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "indefinite length",
+          "public" : "3050308006072a8648ce3d020106052b810400210000033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 217,
+          "comment" : "indefinite length with truncated delimiter",
+          "public" : "3080301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da6200",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 218,
+          "comment" : "indefinite length with truncated delimiter",
+          "public" : "304f308006072a8648ce3d020106052b8104002100033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 219,
+          "comment" : "indefinite length with additional element",
+          "public" : "3080301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da6205000000",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 220,
+          "comment" : "indefinite length with additional element",
+          "public" : "3052308006072a8648ce3d020106052b8104002105000000033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 221,
+          "comment" : "indefinite length with truncated element",
+          "public" : "3080301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62060811220000",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 222,
+          "comment" : "indefinite length with truncated element",
+          "public" : "3054308006072a8648ce3d020106052b81040021060811220000033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 223,
+          "comment" : "indefinite length with garbage",
+          "public" : "3080301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da620000fe02beef",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 224,
+          "comment" : "indefinite length with garbage",
+          "public" : "3054308006072a8648ce3d020106052b810400210000fe02beef033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 225,
+          "comment" : "indefinite length with nonempty EOC",
+          "public" : "3080301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da620002beef",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 226,
+          "comment" : "indefinite length with nonempty EOC",
+          "public" : "3052308006072a8648ce3d020106052b810400210002beef033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 227,
+          "comment" : "prepend empty sequence",
+          "public" : "30503000301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 228,
+          "comment" : "prepend empty sequence",
+          "public" : "30503012300006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 229,
+          "comment" : "append empty sequence",
+          "public" : "3050301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da623000",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 230,
+          "comment" : "append empty sequence",
+          "public" : "3050301206072a8648ce3d020106052b810400213000033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 231,
+          "comment" : "sequence of sequence",
+          "public" : "3050304e301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 232,
+          "comment" : "sequence of sequence",
+          "public" : "30503012301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 233,
+          "comment" : "truncated sequence",
+          "public" : "3012301006072a8648ce3d020106052b81040021",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 234,
+          "comment" : "truncated sequence",
+          "public" : "3047300906072a8648ce3d0201033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 235,
+          "comment" : "repeat element in sequence",
+          "public" : "30818a301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 236,
+          "comment" : "repeat element in sequence",
+          "public" : "3055301706072a8648ce3d020106052b8104002106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 237,
+          "comment" : "removing oid",
+          "public" : "3045300706052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 238,
+          "comment" : "lonely oid tag",
+          "public" : "304630080606052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 239,
+          "comment" : "lonely oid tag",
+          "public" : "3048300a06072a8648ce3d020106033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 240,
+          "comment" : "appending 0's to oid",
+          "public" : "3050301206092a8648ce3d0201000006052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 241,
+          "comment" : "appending 0's to oid",
+          "public" : "3050301206072a8648ce3d020106072b810400210000033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 242,
+          "comment" : "prepending 0's to oid",
+          "public" : "30503012060900002a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 243,
+          "comment" : "prepending 0's to oid",
+          "public" : "3050301206072a8648ce3d0201060700002b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 244,
+          "comment" : "appending unused 0's to oid",
+          "public" : "3050301206072a8648ce3d0201000006052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 245,
+          "comment" : "appending null value to oid",
+          "public" : "3050301206092a8648ce3d0201050006052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 246,
+          "comment" : "appending null value to oid",
+          "public" : "3050301206072a8648ce3d020106072b810400210500033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 247,
+          "comment" : "truncated length of oid",
+          "public" : "30473009068106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 248,
+          "comment" : "truncated length of oid",
+          "public" : "3049300b06072a8648ce3d02010681033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 249,
+          "comment" : "Replacing oid with NULL",
+          "public" : "30473009050006052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 250,
+          "comment" : "Replacing oid with NULL",
+          "public" : "3049300b06072a8648ce3d02010500033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 251,
+          "comment" : "changing tag value of oid",
+          "public" : "304e301004072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 252,
+          "comment" : "changing tag value of oid",
+          "public" : "304e301005072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 253,
+          "comment" : "changing tag value of oid",
+          "public" : "304e301007072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 254,
+          "comment" : "changing tag value of oid",
+          "public" : "304e301008072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 255,
+          "comment" : "changing tag value of oid",
+          "public" : "304e3010ff072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 256,
+          "comment" : "changing tag value of oid",
+          "public" : "304e301006072a8648ce3d020104052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 257,
+          "comment" : "changing tag value of oid",
+          "public" : "304e301006072a8648ce3d020105052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 258,
+          "comment" : "changing tag value of oid",
+          "public" : "304e301006072a8648ce3d020107052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 259,
+          "comment" : "changing tag value of oid",
+          "public" : "304e301006072a8648ce3d020108052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 260,
+          "comment" : "changing tag value of oid",
+          "public" : "304e301006072a8648ce3d0201ff052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 261,
+          "comment" : "dropping value of oid",
+          "public" : "30473009060006052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 262,
+          "comment" : "dropping value of oid",
+          "public" : "3049300b06072a8648ce3d02010600033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 263,
+          "comment" : "modify first byte of oid",
+          "public" : "304e30100607288648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 264,
+          "comment" : "modify first byte of oid",
+          "public" : "304e301006072a8648ce3d020106052981040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 265,
+          "comment" : "modify last byte of oid",
+          "public" : "304e301006072a8648ce3d028106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 266,
+          "comment" : "modify last byte of oid",
+          "public" : "304e301006072a8648ce3d020106052b810400a1033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 267,
+          "comment" : "truncate oid",
+          "public" : "304d300f06062a8648ce3d0206052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 268,
+          "comment" : "truncate oid",
+          "public" : "304d300f06068648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 269,
+          "comment" : "truncate oid",
+          "public" : "304d300f06072a8648ce3d020106042b810400033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 270,
+          "comment" : "truncate oid",
+          "public" : "304d300f06072a8648ce3d0201060481040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 271,
+          "comment" : "wrong oid",
+          "public" : "30513013060a3262306530333032316106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 272,
+          "comment" : "wrong oid",
+          "public" : "3059301b061236303836343830313635303330343032303106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 273,
+          "comment" : "wrong oid",
+          "public" : "3053301506072a8648ce3d0201060a32623065303330323161033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 274,
+          "comment" : "wrong oid",
+          "public" : "305b301d06072a8648ce3d02010612363038363438303136353033303430323031033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 275,
+          "comment" : "longer oid",
+          "public" : "3057301906103261383634386365336430323031303106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 276,
+          "comment" : "longer oid",
+          "public" : "3055301706072a8648ce3d0201060c326238313034303032313031033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 277,
+          "comment" : "oid with modified node",
+          "public" : "30553017060e326138363438636533643032313106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 278,
+          "comment" : "oid with modified node",
+          "public" : "305d301f06163261383634386365336430323838383038303830303106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 279,
+          "comment" : "oid with modified node",
+          "public" : "3053301506072a8648ce3d0201060a32623831303430303331033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 280,
+          "comment" : "oid with modified node",
+          "public" : "305b301d06072a8648ce3d02010612326238313034303038383830383038303231033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 281,
+          "comment" : "large integer in oid",
+          "public" : "306730290620326138363438636533643032383238303830383038303830383038303830303106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 282,
+          "comment" : "large integer in oid",
+          "public" : "3065302706072a8648ce3d0201061c32623831303430303832383038303830383038303830383038303231033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 283,
+          "comment" : "oid with invalid node",
+          "public" : "3058301a0611326138363438636533643032303165303306052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 284,
+          "comment" : "oid with invalid node",
+          "public" : "304f301106082a808648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 285,
+          "comment" : "oid with invalid node",
+          "public" : "3056301806072a8648ce3d0201060d32623831303430303231653033033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 286,
+          "comment" : "oid with invalid node",
+          "public" : "304f301106072a8648ce3d020106062b8081040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 287,
+          "comment" : "lonely bit string tag",
+          "public" : "3013301006072a8648ce3d020106052b8104002103",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 288,
+          "comment" : "appending 0's to bit string",
+          "public" : "3050301006072a8648ce3d020106052b81040021033c000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da620000",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 289,
+          "comment" : "prepending 0's to bit string",
+          "public" : "3050301006072a8648ce3d020106052b81040021033c0000000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 290,
+          "comment" : "appending null value to bit string",
+          "public" : "3050301006072a8648ce3d020106052b81040021033c000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da620500",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 291,
+          "comment" : "truncated length of bit string",
+          "public" : "3014301006072a8648ce3d020106052b810400210381",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 292,
+          "comment" : "Replacing bit string with NULL",
+          "public" : "3014301006072a8648ce3d020106052b810400210500",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 293,
+          "comment" : "changing tag value of bit string",
+          "public" : "304e301006072a8648ce3d020106052b81040021013a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 294,
+          "comment" : "changing tag value of bit string",
+          "public" : "304e301006072a8648ce3d020106052b81040021023a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 295,
+          "comment" : "changing tag value of bit string",
+          "public" : "304e301006072a8648ce3d020106052b81040021043a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 296,
+          "comment" : "changing tag value of bit string",
+          "public" : "304e301006072a8648ce3d020106052b81040021053a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 297,
+          "comment" : "changing tag value of bit string",
+          "public" : "304e301006072a8648ce3d020106052b81040021ff3a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 298,
+          "comment" : "dropping value of bit string",
+          "public" : "3014301006072a8648ce3d020106052b810400210300",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 299,
+          "comment" : "modify first byte of bit string",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a020486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 300,
+          "comment" : "modify last byte of bit string",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3dae2",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 301,
+          "comment" : "truncate bit string",
+          "public" : "304d301006072a8648ce3d020106052b810400210339000486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 302,
+          "comment" : "truncate bit string",
+          "public" : "304d301006072a8648ce3d020106052b8104002103390486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 303,
+          "comment" : "declaring bits as unused in a bit-string",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a010486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 304,
+          "comment" : "unused bits in a bit-string",
+          "public" : "3052301006072a8648ce3d020106052b81040021033e200486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da6201020304",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 305,
+          "comment" : "unused bits in empty bit-string",
+          "public" : "3015301006072a8648ce3d020106052b81040021030103",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 306,
+          "comment" : "128 unused bits",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a800486e2f72bccd974a3f1a4fc2cdcf22043eaf8be047de6be726b62001fda6f50f6df0b51bee99195d8a1a1c97e59e72fa4fcf8c1d21cb3da62",
+          "private" : "0a1b9444f59642d428e2f299055004165a34c3b8796c5057ae8a1a572",
+          "shared" : "85a70fc4dfc8509fb9ba1cfcf1879443e2ce176d794228029b10da63",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdh_secp256k1_test.json b/third_party/wycheproof/testvectors/ecdh_secp256k1_test.json
new file mode 100644
index 0000000..af5208d
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdh_secp256k1_test.json
@@ -0,0 +1,3427 @@
+{
+  "algorithm" : "ECDH",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "AddSubChain" : "The private key has a special value. Implementations using addition subtraction chains for the point multiplication may get the point at infinity as an intermediate result. See CVE_2017_10176",
+    "CompressedPoint" : "The point in the public key is compressed. Not every library supports points in compressed format.",
+    "InvalidAsn" : "The public key in this test uses an invalid ASN encoding. Some cases where the ASN parser is not strictly checking the ASN format are benign as long as the ECDH computation still returns the correct shared value.",
+    "InvalidPublic" : "The public key has been modified and is invalid. An implementation should always check whether the public key is valid and on the same curve as the private key. The test vector includes the shared secret computed with the original public key if the public point is on the curve of the private key. Generating a shared secret other than the one with the original key likely indicates that the bug is exploitable.",
+    "ModifiedPrime" : "The modulus of the public key has been modified. The public point of the public key has been chosen so that it is both a point on both the curve of the modified public key and the private key.",
+    "UnnamedCurve" : "The public key does not use a named curve. RFC 3279 allows to encode such curves by explicitly encoding, the parameters of the curve equation, modulus, generator, order and cofactor. However, many crypto libraries only support named curves. Modifying some of the EC parameters and encoding the corresponding public key as an unnamed curve is a potential attack vector.",
+    "UnusedParam" : "A parameter that is typically not used for ECDH has been modified. Sometimes libraries ignore small differences between public and private key. For example, a library might ignore an incorrect cofactor in the public key. We consider ignoring such changes as acceptable as long as these differences do not change the outcome of the ECDH computation, i.e. as long as the computation is done on the curve from the private key.",
+    "WeakPublicKey" : "The vector contains a weak public key. The curve is not a named curve, the public key point has order 3 and has been chosen to be on the same curve as the private key. This test vector is used to check ECC implementations for missing steps in the verification of the public key.",
+    "WrongOrder" : "The order of the public key has been modified. If this order is used in a cryptographic primitive instead of the correct order then private keys may leak. E.g. ECDHC in BC 1.52 suffered from this."
+  },
+  "numberOfTests" : 323,
+  "header" : [],
+  "testGroups" : [
+    {
+      "curve" : "secp256k1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "normal case",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004d8096af8a11e0b80037e1ee68246b5dcbb0aeb1cf1244fd767db80f3fa27da2b396812ea1686e7472e9692eaf3e958e50e9500d3b4c77243db1f2acd67ba9cc4",
+          "private" : "0f4b7ff7cccc98813a69fae3df222bfe3f4e28f764bf91b4a10d8096ce446b254",
+          "shared" : "544dfae22af6af939042b1d85b71a1e49e9a5614123c4d6ad0c8af65baf87d65",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "compressed public key",
+          "public" : "3036301006072a8648ce3d020106052b8104000a03220002d8096af8a11e0b80037e1ee68246b5dcbb0aeb1cf1244fd767db80f3fa27da2b",
+          "private" : "0f4b7ff7cccc98813a69fae3df222bfe3f4e28f764bf91b4a10d8096ce446b254",
+          "shared" : "544dfae22af6af939042b1d85b71a1e49e9a5614123c4d6ad0c8af65baf87d65",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004965ff42d654e058ee7317cced7caf093fbb180d8d3a74b0dcd9d8cd47a39d5cb9c2aa4daac01a4be37c20467ede964662f12983e0b5272a47a5f2785685d8087",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000406c4b87ba76c6dcb101f54a050a086aa2cb0722f03137df5a922472f1bdc11b982e3c735c4b6c481d09269559f080ad08632f370a054af12c1fd1eced2ea9211",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004bba30eef7967a2f2f08a2ffadac0e41fd4db12a93cef0b045b5706f2853821e6d50b2bf8cbf530e619869e07c021ef16f693cfc0a4b0d4ed5a8f464692bf3d6e",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004166aed3bc281705444f933913f670957a118f8da2c71bd301a90929743e2ca583514a7972e33d6fea1e377ef4184937f67b37e41ef3099c228a88f5bfb67e5b9",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "00000000000000000000000000000000ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000436e1e76ffdbe8577520b0716eb88c18ea72a49e5a4e5680a7d290093f841cb6e7310728b59c7572c4b35fb6c29c36ebabfc53553c06ecf747fcfbefcf6114e1c",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004728e15d578212bc42287c0118c82c84b126f97d549223c10ad07f4e98af912385d23b1a6e716925855a247b16effe92773315241ac951cdfefdfac0ed16467f6",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004ca03ff8e99e269576cf7564545c89268eb415ff45778732529fa5997cc2b230950d6b84b729bc07f9b2d92754281cdc0d289d2453385aef77e4bdc69bf155c5f",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "000003ffffff0000003ffffff0000003ffffff0000003ffffff0000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000451be66137e39bbf35a91c6db5ba6919ff471d885ca94462eaaa65b1eac366baa5910de70b6e09e97aa00621ef18f2801719b199b3e7769fdab2bd909b2f340d7",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000423556564850c50fba51f1e64ef98378ef5c22feafa29499ca27600c473cace889d5679e917daa7f4c7899517d37826284f031de01a60bc813696414d04531a21",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "210c790573632359b1edb4302c117d8a132654692c3feeb7de3a86ac3f3b53f7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004ddbf807e22c56a19cf6c472829150350781034a5eddec365694d4bd5c865ead14e674127028c91d3394cac37293a866055d10f0f40a3706ad16b64fc9d5998bd",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "4218f20ae6c646b363db68605822fb14264ca8d2587fdd6fbc750d587e76a7ee",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004595e46ee7c2d7183ff2ea760ffd8472fb834ec89c08b6ef48ff92b44a13a6e1ae563e23953c97c26441323d2500c84e8cee04c15d4d5d2cc458703d1f2d02d31",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "7fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004e426e2f5108333117587975f18d8cc078d41e56b7d6b82f585d75b0d73479ffd75800fd41236a56034bed9abc55d82cf059a14d63c07cd0750931714731a1ca1",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "8000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004e1c7076caf26010b1767f1a9c4156b5b4236368d5d90dece3441b734e8684ee6b3534c3c54e614e594dce6ca438b87c424c8e80f8fae226bbdf50e4906c13f6b",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004663cea1063c9916b75e85fc815d8a2370ec0a02aceef3db022e395db8b03bf3f188787f4047dc106807526502c7ae880e471c929b92e2384489c8070b5bcc109",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "ff00000001fffffffc00000007fffffff00000001fffffffc000000080000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000424175c078e305d3139e5dab727a6ab8587b26daa470a529a23c10585cb56c038bf1f2b937ae074ff94b15f5cb5e60eb5d32afba2077539db794294bcaab71a81",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004008d71c712dd95881cd1400dbe7683acbd8e269d25261b08f1f491b45e3b5621778182a24198b0f23502d06e24c45122e1f420af48dc1e17b1ea923386a33062",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "ffffffff00000000000000ffffffffffffff0000000000000100000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000456baf1d72606c7af5a5fa108620b0839e2c7dd40b832ef847e5b64c86efe1aa563e586a667a65bbb5692500df1ff8403736838b30ea9791d9d390e3dc6689e2c",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "800000000000000000000000009fa2f1ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200045e4c2cf1320ec84ef8920867b409a9a91d2dd008216a282e36bd84e884726fa05a5e4af11cf63ceaaa42a6dc9e4ccb394852cf84284e8d2627572fbf22c0ba88",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "80000000000000000000000000a3037effffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000402a30c2fabc87e6730625dec2f0d03894387b7f743ce69c47351ebe5ee98a48307eb78d38770fea1a44f4da72c26f85b17f3501a4f9394fe29856ccbf15fd284",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "8000000000000000000000000124dcb0ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200045e4c2cf1320ec84ef8920867b409a9a91d2dd008216a282e36bd84e884726fa0a5a1b50ee309c31555bd592361b334c6b7ad307bd7b172d9d8a8d03fdd3f41a7",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "80000000000000000000000000a3037effffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000402a30c2fabc87e6730625dec2f0d03894387b7f743ce69c47351ebe5ee98a483f814872c788f015e5bb0b258d3d907a4e80cafe5b06c6b01d67a93330ea029ab",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "8000000000000000000000000124dcb0ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200045450cace04386adc54a14350793e83bdc5f265d6c29287ecd07f791ad2784c4cebd3c24451322334d8d51033e9d34b6bb592b1995d07867863d1044bd59d7501",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "80000000000000000000000001126b54ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000400000000000000000000000000000000000000000000000000000000000000014218f20ae6c646b363db68605822fb14264ca8d2587fdd6fbc750d587e76a7ee",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "12c2ad36a59fda5ac4f7e97ff611728d0748ac359fca9b12f6d4f43519516487",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004000000000000000000000000000000000000000000000000000000000000000266fbe727b2ba09e09f5a98d70a5efce8424c5fa425bbda1c511f860657b8535e",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "45aa9666757815e9974140d1b57191c92c588f6e5681131e0df9b3d241831ad4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000400000000000000000000000000000000000000000000000000000000000000032f233395c8b07a3834a0e59bda43944b5df378852e560ebc0f22877e9f49bb4b",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "b90964c05e464c23acb747a4c83511e93007f7499b065c8e8eccec955d8731f4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000400000000000000000000000000000000ffffffffffffffffffffffffffffffff3db772ad92db8699ceac1a3c30e126b866c4fefe292cf0c1790e55cee8414f18",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "8163c9dce8356f1df72b698f2f04a14db0263a8402905eee87941b00d8d677f5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200040000000000000000ffffffffffffffff0000000000000000ffffffffffffffff31cf13671b574e313c35217566f18bd2c5f758c140d24e94e6a4fda7f4c7b12b",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "1a32749dcf047a7e06194ccb34d7c9538a16ddabeeede74bea5f7ef04979f7f7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000400000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff73b0886496aed70db371e2e49db640abba547e5e0c2763b73a0a42f84348a6b1",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "ab43917a64c1b010159643c18e2eb06d25eedae5b78d02fa9b3debacbf31b777",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004000003ffffff0000003ffffff0000003ffffff0000003ffffff00000040000000f4d81575c8e328285633ccfd8623f04dd4ed61e187b3a6d7eac553aede7f850",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "1648321c706651adf06643fc4ae06041dce64a82632ad44128061216cc9827ff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0001000242217b7059b3ddebc68e95443f6c109369e1f9323dd24852ac7612996b6e5601",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "fb866b2e4b1f9ed6b37847fc80a19a52e1e91b75d713b0d4f6b995d2d3c75cfe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004210c790573632359b1edb4302c117d8a132654692c3feeb7de3a86ac3f3b53f75f450dbbf718a4f6582d7af83953170b3037fb81a450a5ca5acbec74ad6cac89",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "1908ae936f53b9a8a2d09707ae414084090b175365401425479b10b8c3e8d1ba",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200044218f20ae6c646b363db68605822fb14264ca8d2587fdd6fbc750d587e76a7ee37269a64bbcf3a3f227631c7a8ce532c77245a1c0db4343f16aa1d339fd2591a",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "5e13b3dc04e33f18d1286c606cb0191785f694e82e17796145c9e7b49bc2af58",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200047fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff4b66003c7482d0f2fd7b1cb2b0b7078cd199f2208fc37eb2ef286ccb2f1224e7",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "3135a6283b97e7537a8bc208a355c2a854b8ee6e4227206730e6d725da044dee",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004800000000000000000000000000000000000000000000000000000000000000069d3cd0c70f1484d4b3bbbd680679ef477a22a07df085634f117c41c08bf1230",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "62959089a7ed477c22cb4f1c7787327318fccca25e5aa3e44688a282931ab049",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200048000003ffffff0000007fffffe000000ffffffc000001ffffff800000400000130f69b6e95a3303214a73ad982a1f3ee169d7ecf958de7b0bca8a9ffa3b8e8b3",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "04fda5c00a396fad6b809a8843de573e86b0403d644995c83313da51fb1f5880",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004ff00000001fffffffc00000007fffffff00000001fffffffc00000008000000056951ead861aa8ec7a314fcd54f905bd92c910786375eb7ee5f3a55f8aa87884",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "bbd9937bb51d27f94ecaea29717df789afeac4414e3ef27bb2e6fa7259182e59",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff63a88b2e0c8987c6310cf81d0c935f00213f98a3dad2f43c8128fa313a90d55b",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "bbd9d305b99ff3db56f77fea9e89f32260ee7326040067ce05dd15e0dcc13ed8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004ffffffff00000000000000ffffffffffffff000000000000010000000000000066a4456ca6d4054d13b209f6d262e6057ad712566f46e9e238e894deebe3d3aa",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "4ffb2c7962e32d5365f98f66be6286724d40d5f0333ba4fc943c0f0f06cdbb1f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004800000000000000000000000009fa2f1ffffffffffffffffffffffffffffffff07ed353c9f1039edcc9cc5336c034dc131a4087692c2e56bc1dd1904e3ffffff",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "7c07b199b6a62e7ac646c7e1dee94aca55de1a97251ddf92fcd4fe0145b40f12",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000480000000000000000000000000a3037effffffffffffffffffffffffffffffff0000031a6bf344b86730ac5c54a7751aefdba135759b9d535ca64111f298a38d",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "5206c3de46949b9da160295ee0aa142fe3e6629cc25e2d671e582e30ff875082",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000480000000000000000000000000a3037efffffffffffffffffffffffffffffffffffffce5940cbb4798cf53a3ab588ae510245eca8a6462aca359beed0d6758a2",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "5206c3de46949b9da160295ee0aa142fe3e6629cc25e2d671e582e30ff875082",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000480000000000000000000000001126b54ffffffffffffffffffffffffffffffff4106a369068d454ea4b9c3ac6177f87fc8fd3aa240b2ccb4882bdccbd4000000",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "e59ddc7646e4aef0623c71c486f24d5d32f7257ef3dab8fa524b394eae19ebe1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200048000000000000000000000000124dcb0ffffffffffffffffffffffffffffffff0000013bc6f08431e729ed2863f2f4ac8a30279695c8109c340a39fa86f451cd",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "8a8c18b78e1b1fcfd22ee18b4a3a9f391a3fdf15408fb7f8c1dba33c271dbd2f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200048000000000000000000000000124dcb0fffffffffffffffffffffffffffffffffffffec4390f7bce18d612d79c0d0b5375cfd8696a37ef63cbf5c604790baa62",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "8a8c18b78e1b1fcfd22ee18b4a3a9f391a3fdf15408fb7f8c1dba33c271dbd2f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "3",
+          "shared" : "34005694e3cac09332aa42807e3afdc3b3b3bc7c7be887d1f98d76778c55cfd7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "5841acd3cff2d62861bbe11084738006d68ccf35acae615ee9524726e93d0da5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "100000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "4348e4cba371ead03982018abc9aacecaebfd636dda82e609fd298947f907de8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "e56221c2b0dc33b98b90dfd3239a2c0cb1e4ad0399a3aaef3f9d47fb103daef0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "08000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "5b34a29b1c4ddcb2101162d34bed9f0702361fe5af505df315eff7befd0e4719",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03abfd25e8cd0364141",
+          "shared" : "cece521b8b5a32bbee38936ba7d645824f238e561701a386fb888e010db54b2f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03bbfc25e8cd0364141",
+          "shared" : "829521b79d71f5011e079756b851a0d5c83557866189a6258c1e78a1700c6904",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03bbfca5e8cd0364141",
+          "shared" : "8c5934793505a6a1f84d41283341680c4923f1f4d562989a11cc626fea5eda5a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8bd0364141",
+          "shared" : "356caee7e7eee031a15e54c3a5c4e72f9c74bb287ce601619ef85eb96c289452",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03640c3",
+          "shared" : "09c7337df6c2b35edf3a21382511cc5add1a71a84cbf8d3396a5be548d92fa67",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 57,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364103",
+          "shared" : "d16caedd25793666f9e26f5331382106f54095b3d20d40c745b68ca76c0e6983",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 58,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364123",
+          "shared" : "b8ae1e21d8b34ce4caffed7167a26868ec80a7d4a6a98b639d4d05cd226504de",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 59,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364133",
+          "shared" : "02776315fe147a36a4b0987492b6503acdea60f926450e5eddb9f88fc82178d3",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 60,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413b",
+          "shared" : "3988c9c7050a28794934e5bd67629b556d97a4858d22812835f4a37dca351943",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 61,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e",
+          "shared" : "34005694e3cac09332aa42807e3afdc3b3b3bc7c7be887d1f98d76778c55cfd7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413f",
+          "shared" : "4b52257d8b3ba387797fdf7a752f195ddc4f7d76263de61d0d52a5ec14a36cbf",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 63,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200040000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200040000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200040000000000000000000000000000000000000000000000000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200040000000000000000000000000000000000000000000000000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e0000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e0000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "",
+          "public" : "3015301006072a8648ce3d020106052b8104000a030100",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "public point not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e4",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 81,
+          "comment" : "public point = (0,0)",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 82,
+          "comment" : "order = -115792089237316195423570985008687907852837564279074904382605163141518161494337",
+          "public" : "3081f53081ae06072a8648ce3d02013081a2020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b80221ff000000000000000000000000000000014551231950b75fc4402da1732fc9bebf0201010342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 83,
+          "comment" : "order = 0",
+          "public" : "3081d530818e06072a8648ce3d0201308182020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b80201000201010342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 84,
+          "comment" : "order = 1",
+          "public" : "3081d530818e06072a8648ce3d0201308182020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b80201010201010342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 85,
+          "comment" : "order = 26959946667150639794667015087019630673536463705607434823784316690060",
+          "public" : "3081f13081aa06072a8648ce3d020130819e020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8021d00fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8c0201010342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 86,
+          "comment" : "generator = (0,0)",
+          "public" : "3081f53081ae06072a8648ce3d02013081a2020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201010342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 87,
+          "comment" : "generator not on curve",
+          "public" : "3081f53081ae06072a8648ce3d02013081a2020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4ba022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201010342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 88,
+          "comment" : "cofactor = -1",
+          "public" : "3081f53081ae06072a8648ce3d02013081a2020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201ff0342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 89,
+          "comment" : "cofactor = 0",
+          "public" : "3081f53081ae06072a8648ce3d02013081a2020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201000342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 90,
+          "comment" : "cofactor = 2",
+          "public" : "3081f53081ae06072a8648ce3d02013081a2020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201020342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 91,
+          "comment" : "cofactor = 115792089237316195423570985008687907852837564279074904382605163141518161494337",
+          "public" : "308201153081ce06072a8648ce3d02013081c2020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 92,
+          "comment" : "cofactor = None",
+          "public" : "3081f23081ab06072a8648ce3d020130819f020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 93,
+          "comment" : "modified prime",
+          "public" : "3081f53081ae06072a8648ce3d02013081a2020101302c06072a8648ce3d0101022100fb524ac7055bebf603a4e216abaa6a9ef8eb2bbea2cd820e59d46d8501f6268b30060401000401070441040000000000000000000006597fa94f5b8380000000000000000000000000000f229ba06e5c03dbcba0eec01b4bcca549cda86e507e8813b5bb2b42df88f12f47022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020101034200040000000000000000000006597fa94f5b8380000000000000000000000000000f229ba06e5c03dbcba0eec01b4bcca549cda86e507e8813b5bb2b42df88f12f47",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "c5956b8cf7244e3c0457658a214210b358205cab12374d523ecf57895cecfeb0",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 94,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 95,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 96,
+          "comment" : "a = 0",
+          "public" : "3081f53081ae06072a8648ce3d02013081a2020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201010342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 97,
+          "comment" : "public key of order 3",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f30440420878d275ed392d346140c0e50fc739e4ef7d888bf6b029b52c7c4cbaf66a2684e0420d613823ed25a7cec3fec5f7bb05528420aeb52b53338f05b7bd8556f516d16f70441040f6c49429669c68baf5da3f3d0972ad16d2a02467163565dd998cd15c2b2882348f037c47c27a9acfd580996c087e2c95e9ac4e0abfaefbaa320f790239acbda022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020101034200040f6c49429669c68baf5da3f3d0972ad16d2a02467163565dd998cd15c2b28823b70fc83b83d8565302a7f6693f781d36a1653b1f540510455cdf086edc653055",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "e5bc54909cf74ca0a6fa76196171bd174b36dbc62c9a83ad6012b722e80a8a4c",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 98,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000450eb062b54940a455719d523e1ec106525dda34c2fd95ace62b9b16d315d323f089173d10c45dceff155942431750c00ca36f463828e9fab",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000406372852584037722a7f9bfaad5661acb623162d45f70a552c617f4080e873aa43609275dff6dcaaa122a745d0f154681f9c7726867b43e7523b7f5ab5ea963e",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200040ef5804731d918f037506ee00b8602b877c7d509ffa2c0847a86e7a2d358ba7c981c2a74b22401ac615307a6deb275402fa6c8218c3374f8a91752d2eff6bd14ad8cae596d2f37dae8aeec085760edf4fda9a7cf70253898a54183469072a561",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400921da57110db26c7838a69d574fc98588c5c07a792cb379f46664cc773c1e1f6fa16148667748ede232d1a1f1cea7f152c5d586172acbeaa48416bcbd70bb27f0f01b4477e1ae74bf4f093184a9f26f103712ccf6ceb45a0505b191606d897edaf872b37f0f90a933000a80fc3207048323c16883a3d67a90aa78bcc9c5e58d784b9b9",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00042c9fdd1914cacdb28e39e6fc24b4c3c666cc0d438acc4529a6cc297a2d0fdecb3028d9e4d84c711db352379c080c78659969bdc5d3218901",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004120e4db849e5d960741c7d221aa80fe6e4fcd578191b7f845a68a6fcb8647719a6fffb6165d8ec39389eecc530839c321b2e9040027fba5d9cb9311df7cd3d4d",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200040efb1c104938f59a931fe6bf69f7ead4036d2336075a708e66b020e1bc5bb6d9cdc86d4e8fa181d7c7ea1af28353044e8cec12eec75a6dd87a5dc902024d93f8c8d9bf43b453fd919151f9bd7bb955c7",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200043e96d75b79214e69a4550e25375478bdc9c2a9d0178a77b5700bd5f12e3ce142f50c93dc1ee7268456d7eae2d44b718d6f159e896ae14fbe3aba397801a95e2bb6a9a761e865b289dd9db64aa07c794cedf77328543b94c9b54ce0cf04c60ac8",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200044f191130740f1b75ae13402960eb22ea801db80ed51a461e06a7b3ba60c9bddd132a6465bbee8afd70cfb4495efbda4f1567b958e6e305bfcb4ac8f05172688e0f2f175aa12425be3ab7271b42f258639e868677d1163c12e641229f1e6427761c9e294de51db564151b21a051d2f7a13661852799557a556a5f3c51d36d083a",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00044964b948cefa39cd769e3480d4840a3c58e966161be80df02d9aab33b4a318a32f30130224edcefe0dd64342404e594aa334995b179f641f",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000411157979c08bcd175d34572209a85f3f5d602e35bdc3b553b0f19307672b31ba69d0556bce48c43e2e7e6177055221a4c4b7eb17ee9708f49216de76d6e92ab8",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200048bb517e198930eba57293419876a8793f711de37c27f200e6fb2c2b13e9fabd4fbc42ad61751ca583031ba76cbc6d745d115addc74eab63bf415c4fa20dbbecae98ac3c3da1a041705cf8959e2ccf453",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200045eb38d0261b744b03abef4ae7c17bc886b5b426bd910958f8a49ef62053048f869541b7a05d244315fc9cd74271ec3d518d94114b6006017f4ed5e3c06322baa1c75809a1057ba6fa46d1e1a9927a262e627940d5da538b5a3d1d794d9c866a4",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004035fc238e57d980beae0215fb89108f9c6c4afda5d920f9d0583ee7d65f8778ecfff24a31d4f32deb6ea5f7e3adb6affb9327a5e62e09cba07c88b119fd104a83b7811e958e393971a5c9417412070b9f18b03be37e81e0bca5d3ff0873ed1f3113ed0fc57a0344321fb4d6c43f2f6e630a3d3883efe4c21df3e0f0b1208226b",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "invalid public key",
+          "public" : "3036301006072a8648ce3d020106052b8104000a03220002977cb7fb9a0ec5b208e811d6a0795eb78d7642e3cac42a801bcc8fc0f06472d4",
+          "private" : "0d09182a4d0c94ba85f82eff9fc1bddb0b07d3f2af8632fc1c73a3604e8f0b335",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 113,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301006072a8648ce3d020106052b8104000a032200020000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "098b5c223cf9cc0920a5145ba1fd2f6afee7e1f66d0120b8536685fdf05ebb300",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 114,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301006072a8648ce3d020106052b8104000a032200030000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "098b5c223cf9cc0920a5145ba1fd2f6afee7e1f66d0120b8536685fdf05ebb2ff",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 115,
+          "comment" : "long form encoding of length",
+          "public" : "308156301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 116,
+          "comment" : "long form encoding of length",
+          "public" : "305730811006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 117,
+          "comment" : "long form encoding of length",
+          "public" : "305730110681072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 118,
+          "comment" : "long form encoding of length",
+          "public" : "3057301106072a8648ce3d02010681052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 119,
+          "comment" : "long form encoding of length",
+          "public" : "3057301006072a8648ce3d020106052b8104000a0381420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 120,
+          "comment" : "length contains leading 0",
+          "public" : "30820056301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 121,
+          "comment" : "length contains leading 0",
+          "public" : "30583082001006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 122,
+          "comment" : "length contains leading 0",
+          "public" : "30583012068200072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 123,
+          "comment" : "length contains leading 0",
+          "public" : "3058301206072a8648ce3d0201068200052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 124,
+          "comment" : "length contains leading 0",
+          "public" : "3058301006072a8648ce3d020106052b8104000a038200420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 125,
+          "comment" : "wrong length",
+          "public" : "3057301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 126,
+          "comment" : "wrong length",
+          "public" : "3055301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 127,
+          "comment" : "wrong length",
+          "public" : "3056301106072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 128,
+          "comment" : "wrong length",
+          "public" : "3056300f06072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 129,
+          "comment" : "wrong length",
+          "public" : "3056301006082a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 130,
+          "comment" : "wrong length",
+          "public" : "3056301006062a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 131,
+          "comment" : "wrong length",
+          "public" : "3056301006072a8648ce3d020106062b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 132,
+          "comment" : "wrong length",
+          "public" : "3056301006072a8648ce3d020106042b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 133,
+          "comment" : "wrong length",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03430004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 134,
+          "comment" : "wrong length",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03410004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 135,
+          "comment" : "uint32 overflow in length",
+          "public" : "30850100000056301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 136,
+          "comment" : "uint32 overflow in length",
+          "public" : "305b3085010000001006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 137,
+          "comment" : "uint32 overflow in length",
+          "public" : "305b3015068501000000072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 138,
+          "comment" : "uint32 overflow in length",
+          "public" : "305b301506072a8648ce3d0201068501000000052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 139,
+          "comment" : "uint32 overflow in length",
+          "public" : "305b301006072a8648ce3d020106052b8104000a038501000000420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 140,
+          "comment" : "uint64 overflow in length",
+          "public" : "3089010000000000000056301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 141,
+          "comment" : "uint64 overflow in length",
+          "public" : "305f308901000000000000001006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 142,
+          "comment" : "uint64 overflow in length",
+          "public" : "305f301906890100000000000000072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 143,
+          "comment" : "uint64 overflow in length",
+          "public" : "305f301906072a8648ce3d020106890100000000000000052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 144,
+          "comment" : "uint64 overflow in length",
+          "public" : "305f301006072a8648ce3d020106052b8104000a03890100000000000000420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "length = 2**31 - 1",
+          "public" : "30847fffffff301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "length = 2**31 - 1",
+          "public" : "305a30847fffffff06072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "length = 2**31 - 1",
+          "public" : "305a301406847fffffff2a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "length = 2**31 - 1",
+          "public" : "305a301406072a8648ce3d020106847fffffff2b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "length = 2**31 - 1",
+          "public" : "305a301006072a8648ce3d020106052b8104000a03847fffffff0004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "length = 2**32 - 1",
+          "public" : "3084ffffffff301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "length = 2**32 - 1",
+          "public" : "305a3084ffffffff06072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "length = 2**32 - 1",
+          "public" : "305a30140684ffffffff2a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "length = 2**32 - 1",
+          "public" : "305a301406072a8648ce3d02010684ffffffff2b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "length = 2**32 - 1",
+          "public" : "305a301006072a8648ce3d020106052b8104000a0384ffffffff0004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "length = 2**40 - 1",
+          "public" : "3085ffffffffff301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "length = 2**40 - 1",
+          "public" : "305b3085ffffffffff06072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "length = 2**40 - 1",
+          "public" : "305b30150685ffffffffff2a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "length = 2**40 - 1",
+          "public" : "305b301506072a8648ce3d02010685ffffffffff2b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "length = 2**40 - 1",
+          "public" : "305b301006072a8648ce3d020106052b8104000a0385ffffffffff0004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3088ffffffffffffffff301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "length = 2**64 - 1",
+          "public" : "305e3088ffffffffffffffff06072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "length = 2**64 - 1",
+          "public" : "305e30180688ffffffffffffffff2a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "length = 2**64 - 1",
+          "public" : "305e301806072a8648ce3d02010688ffffffffffffffff2b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "length = 2**64 - 1",
+          "public" : "305e301006072a8648ce3d020106052b8104000a0388ffffffffffffffff0004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "incorrect length",
+          "public" : "30ff301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "incorrect length",
+          "public" : "305630ff06072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "incorrect length",
+          "public" : "3056301006ff2a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "incorrect length",
+          "public" : "3056301006072a8648ce3d020106ff2b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "incorrect length",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03ff0004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "indefinite length without termination",
+          "public" : "3080301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "indefinite length without termination",
+          "public" : "3056308006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "indefinite length without termination",
+          "public" : "3056301006802a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "indefinite length without termination",
+          "public" : "3056301006072a8648ce3d020106802b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "indefinite length without termination",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03800004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "removing sequence",
+          "public" : "",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "removing sequence",
+          "public" : "304403420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "lonely sequence tag",
+          "public" : "30",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "lonely sequence tag",
+          "public" : "30453003420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "appending 0's to sequence",
+          "public" : "3058301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da32670000",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "appending 0's to sequence",
+          "public" : "3058301206072a8648ce3d020106052b8104000a000003420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "prepending 0's to sequence",
+          "public" : "30580000301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "prepending 0's to sequence",
+          "public" : "30583012000006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "appending unused 0's to sequence",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da32670000",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "appending unused 0's to sequence",
+          "public" : "3058301006072a8648ce3d020106052b8104000a000003420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "appending null value to sequence",
+          "public" : "3058301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da32670500",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "appending null value to sequence",
+          "public" : "3058301206072a8648ce3d020106052b8104000a050003420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "including garbage",
+          "public" : "305b4981773056301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "including garbage",
+          "public" : "305a25003056301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "including garbage",
+          "public" : "30583056301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da32670004deadbeef",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "including garbage",
+          "public" : "305b3015498177301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "including garbage",
+          "public" : "305a30142500301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "including garbage",
+          "public" : "305e3012301006072a8648ce3d020106052b8104000a0004deadbeef03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "including garbage",
+          "public" : "305b3015260c49817706072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "including garbage",
+          "public" : "305a3014260b250006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "including garbage",
+          "public" : "305e3018260906072a8648ce3d02010004deadbeef06052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "including garbage",
+          "public" : "305b301506072a8648ce3d0201260a49817706052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "including garbage",
+          "public" : "305a301406072a8648ce3d02012609250006052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "including garbage",
+          "public" : "305e301806072a8648ce3d0201260706052b8104000a0004deadbeef03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "including garbage",
+          "public" : "305b301006072a8648ce3d020106052b8104000a234749817703420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "including garbage",
+          "public" : "305a301006072a8648ce3d020106052b8104000a2346250003420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "including garbage",
+          "public" : "305e301006072a8648ce3d020106052b8104000a234403420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da32670004deadbeef",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "including undefined tags",
+          "public" : "305eaa00bb00cd003056301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "including undefined tags",
+          "public" : "305caa02aabb3056301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "including undefined tags",
+          "public" : "305e3018aa00bb00cd00301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "including undefined tags",
+          "public" : "305c3016aa02aabb301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "including undefined tags",
+          "public" : "305e3018260faa00bb00cd0006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "including undefined tags",
+          "public" : "305c3016260daa02aabb06072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "including undefined tags",
+          "public" : "305e301806072a8648ce3d0201260daa00bb00cd0006052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "including undefined tags",
+          "public" : "305c301606072a8648ce3d0201260baa02aabb06052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "including undefined tags",
+          "public" : "305e301006072a8648ce3d020106052b8104000a234aaa00bb00cd0003420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "including undefined tags",
+          "public" : "305c301006072a8648ce3d020106052b8104000a2348aa02aabb03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "truncated length of sequence",
+          "public" : "3081",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "truncated length of sequence",
+          "public" : "3046308103420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Replacing sequence with NULL",
+          "public" : "0500",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "Replacing sequence with NULL",
+          "public" : "3046050003420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "changing tag value of sequence",
+          "public" : "2e56301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 217,
+          "comment" : "changing tag value of sequence",
+          "public" : "2f56301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 218,
+          "comment" : "changing tag value of sequence",
+          "public" : "3156301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 219,
+          "comment" : "changing tag value of sequence",
+          "public" : "3256301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 220,
+          "comment" : "changing tag value of sequence",
+          "public" : "ff56301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 221,
+          "comment" : "changing tag value of sequence",
+          "public" : "30562e1006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 222,
+          "comment" : "changing tag value of sequence",
+          "public" : "30562f1006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 223,
+          "comment" : "changing tag value of sequence",
+          "public" : "3056311006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 224,
+          "comment" : "changing tag value of sequence",
+          "public" : "3056321006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 225,
+          "comment" : "changing tag value of sequence",
+          "public" : "3056ff1006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 226,
+          "comment" : "dropping value of sequence",
+          "public" : "3000",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 227,
+          "comment" : "dropping value of sequence",
+          "public" : "3046300003420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 228,
+          "comment" : "truncate sequence",
+          "public" : "3055301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da32",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 229,
+          "comment" : "truncate sequence",
+          "public" : "30551006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 230,
+          "comment" : "truncate sequence",
+          "public" : "3055300f06072a8648ce3d020106052b81040003420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 231,
+          "comment" : "truncate sequence",
+          "public" : "3055300f072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 232,
+          "comment" : "indefinite length",
+          "public" : "3080301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da32670000",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 233,
+          "comment" : "indefinite length",
+          "public" : "3058308006072a8648ce3d020106052b8104000a000003420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 234,
+          "comment" : "indefinite length with truncated delimiter",
+          "public" : "3080301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da326700",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 235,
+          "comment" : "indefinite length with truncated delimiter",
+          "public" : "3057308006072a8648ce3d020106052b8104000a0003420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 236,
+          "comment" : "indefinite length with additional element",
+          "public" : "3080301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da326705000000",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 237,
+          "comment" : "indefinite length with additional element",
+          "public" : "305a308006072a8648ce3d020106052b8104000a0500000003420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 238,
+          "comment" : "indefinite length with truncated element",
+          "public" : "3080301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267060811220000",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 239,
+          "comment" : "indefinite length with truncated element",
+          "public" : "305c308006072a8648ce3d020106052b8104000a06081122000003420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 240,
+          "comment" : "indefinite length with garbage",
+          "public" : "3080301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da32670000fe02beef",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 241,
+          "comment" : "indefinite length with garbage",
+          "public" : "305c308006072a8648ce3d020106052b8104000a0000fe02beef03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 242,
+          "comment" : "indefinite length with nonempty EOC",
+          "public" : "3080301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da32670002beef",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 243,
+          "comment" : "indefinite length with nonempty EOC",
+          "public" : "305a308006072a8648ce3d020106052b8104000a0002beef03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 244,
+          "comment" : "prepend empty sequence",
+          "public" : "30583000301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 245,
+          "comment" : "prepend empty sequence",
+          "public" : "30583012300006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 246,
+          "comment" : "append empty sequence",
+          "public" : "3058301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da32673000",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 247,
+          "comment" : "append empty sequence",
+          "public" : "3058301206072a8648ce3d020106052b8104000a300003420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 248,
+          "comment" : "sequence of sequence",
+          "public" : "30583056301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 249,
+          "comment" : "sequence of sequence",
+          "public" : "30583012301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 250,
+          "comment" : "truncated sequence",
+          "public" : "3012301006072a8648ce3d020106052b8104000a",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 251,
+          "comment" : "truncated sequence",
+          "public" : "304f300906072a8648ce3d020103420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 252,
+          "comment" : "repeat element in sequence",
+          "public" : "30819a301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da326703420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 253,
+          "comment" : "repeat element in sequence",
+          "public" : "305d301706072a8648ce3d020106052b8104000a06052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 254,
+          "comment" : "removing oid",
+          "public" : "304d300706052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 255,
+          "comment" : "lonely oid tag",
+          "public" : "304e30080606052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 256,
+          "comment" : "lonely oid tag",
+          "public" : "3050300a06072a8648ce3d02010603420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 257,
+          "comment" : "appending 0's to oid",
+          "public" : "3058301206092a8648ce3d0201000006052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 258,
+          "comment" : "appending 0's to oid",
+          "public" : "3058301206072a8648ce3d020106072b8104000a000003420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 259,
+          "comment" : "prepending 0's to oid",
+          "public" : "30583012060900002a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 260,
+          "comment" : "prepending 0's to oid",
+          "public" : "3058301206072a8648ce3d0201060700002b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 261,
+          "comment" : "appending unused 0's to oid",
+          "public" : "3058301206072a8648ce3d0201000006052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 262,
+          "comment" : "appending null value to oid",
+          "public" : "3058301206092a8648ce3d0201050006052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 263,
+          "comment" : "appending null value to oid",
+          "public" : "3058301206072a8648ce3d020106072b8104000a050003420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 264,
+          "comment" : "truncated length of oid",
+          "public" : "304f3009068106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 265,
+          "comment" : "truncated length of oid",
+          "public" : "3051300b06072a8648ce3d0201068103420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 266,
+          "comment" : "Replacing oid with NULL",
+          "public" : "304f3009050006052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 267,
+          "comment" : "Replacing oid with NULL",
+          "public" : "3051300b06072a8648ce3d0201050003420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 268,
+          "comment" : "changing tag value of oid",
+          "public" : "3056301004072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 269,
+          "comment" : "changing tag value of oid",
+          "public" : "3056301005072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 270,
+          "comment" : "changing tag value of oid",
+          "public" : "3056301007072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 271,
+          "comment" : "changing tag value of oid",
+          "public" : "3056301008072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 272,
+          "comment" : "changing tag value of oid",
+          "public" : "30563010ff072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 273,
+          "comment" : "changing tag value of oid",
+          "public" : "3056301006072a8648ce3d020104052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 274,
+          "comment" : "changing tag value of oid",
+          "public" : "3056301006072a8648ce3d020105052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 275,
+          "comment" : "changing tag value of oid",
+          "public" : "3056301006072a8648ce3d020107052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 276,
+          "comment" : "changing tag value of oid",
+          "public" : "3056301006072a8648ce3d020108052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 277,
+          "comment" : "changing tag value of oid",
+          "public" : "3056301006072a8648ce3d0201ff052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 278,
+          "comment" : "dropping value of oid",
+          "public" : "304f3009060006052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 279,
+          "comment" : "dropping value of oid",
+          "public" : "3051300b06072a8648ce3d0201060003420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 280,
+          "comment" : "modify first byte of oid",
+          "public" : "305630100607288648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 281,
+          "comment" : "modify first byte of oid",
+          "public" : "3056301006072a8648ce3d02010605298104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 282,
+          "comment" : "modify last byte of oid",
+          "public" : "3056301006072a8648ce3d028106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 283,
+          "comment" : "modify last byte of oid",
+          "public" : "3056301006072a8648ce3d020106052b8104008a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 284,
+          "comment" : "truncate oid",
+          "public" : "3055300f06062a8648ce3d0206052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 285,
+          "comment" : "truncate oid",
+          "public" : "3055300f06068648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 286,
+          "comment" : "truncate oid",
+          "public" : "3055300f06072a8648ce3d020106042b81040003420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 287,
+          "comment" : "truncate oid",
+          "public" : "3055300f06072a8648ce3d020106048104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 288,
+          "comment" : "wrong oid",
+          "public" : "30593013060a3262306530333032316106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 289,
+          "comment" : "wrong oid",
+          "public" : "3061301b061236303836343830313635303330343032303106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 290,
+          "comment" : "wrong oid",
+          "public" : "305b301506072a8648ce3d0201060a3262306530333032316103420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 291,
+          "comment" : "wrong oid",
+          "public" : "3063301d06072a8648ce3d0201061236303836343830313635303330343032303103420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 292,
+          "comment" : "longer oid",
+          "public" : "305f301906103261383634386365336430323031303106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 293,
+          "comment" : "longer oid",
+          "public" : "305d301706072a8648ce3d0201060c32623831303430303061303103420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 294,
+          "comment" : "oid with modified node",
+          "public" : "305d3017060e326138363438636533643032313106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 295,
+          "comment" : "oid with modified node",
+          "public" : "3065301f06163261383634386365336430323838383038303830303106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 296,
+          "comment" : "oid with modified node",
+          "public" : "305b301506072a8648ce3d0201060a3262383130343030316103420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 297,
+          "comment" : "oid with modified node",
+          "public" : "3063301d06072a8648ce3d0201061232623831303430303838383038303830306103420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 298,
+          "comment" : "large integer in oid",
+          "public" : "306f30290620326138363438636533643032383238303830383038303830383038303830303106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 299,
+          "comment" : "large integer in oid",
+          "public" : "306d302706072a8648ce3d0201061c3262383130343030383238303830383038303830383038303830306103420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 300,
+          "comment" : "oid with invalid node",
+          "public" : "3060301a0611326138363438636533643032303165303306052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 301,
+          "comment" : "oid with invalid node",
+          "public" : "3057301106082a808648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 302,
+          "comment" : "oid with invalid node",
+          "public" : "305e301806072a8648ce3d0201060d3262383130343030306165303303420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 303,
+          "comment" : "oid with invalid node",
+          "public" : "3057301106072a8648ce3d020106062b808104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 304,
+          "comment" : "lonely bit string tag",
+          "public" : "3013301006072a8648ce3d020106052b8104000a03",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 305,
+          "comment" : "appending 0's to bit string",
+          "public" : "3058301006072a8648ce3d020106052b8104000a03440004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da32670000",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 306,
+          "comment" : "prepending 0's to bit string",
+          "public" : "3058301006072a8648ce3d020106052b8104000a034400000004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 307,
+          "comment" : "appending null value to bit string",
+          "public" : "3058301006072a8648ce3d020106052b8104000a03440004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da32670500",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 308,
+          "comment" : "truncated length of bit string",
+          "public" : "3014301006072a8648ce3d020106052b8104000a0381",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 309,
+          "comment" : "Replacing bit string with NULL",
+          "public" : "3014301006072a8648ce3d020106052b8104000a0500",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 310,
+          "comment" : "changing tag value of bit string",
+          "public" : "3056301006072a8648ce3d020106052b8104000a01420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 311,
+          "comment" : "changing tag value of bit string",
+          "public" : "3056301006072a8648ce3d020106052b8104000a02420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 312,
+          "comment" : "changing tag value of bit string",
+          "public" : "3056301006072a8648ce3d020106052b8104000a04420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 313,
+          "comment" : "changing tag value of bit string",
+          "public" : "3056301006072a8648ce3d020106052b8104000a05420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 314,
+          "comment" : "changing tag value of bit string",
+          "public" : "3056301006072a8648ce3d020106052b8104000aff420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 315,
+          "comment" : "dropping value of bit string",
+          "public" : "3014301006072a8648ce3d020106052b8104000a0300",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 316,
+          "comment" : "modify first byte of bit string",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420204e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 317,
+          "comment" : "modify last byte of bit string",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da32e7",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 318,
+          "comment" : "truncate bit string",
+          "public" : "3055301006072a8648ce3d020106052b8104000a03410004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da32",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 319,
+          "comment" : "truncate bit string",
+          "public" : "3055301006072a8648ce3d020106052b8104000a034104e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 320,
+          "comment" : "declaring bits as unused in a bit-string",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420104e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 321,
+          "comment" : "unused bits in a bit-string",
+          "public" : "305a301006072a8648ce3d020106052b8104000a03462004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da326701020304",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 322,
+          "comment" : "unused bits in empty bit-string",
+          "public" : "3015301006072a8648ce3d020106052b8104000a030103",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 323,
+          "comment" : "128 unused bits",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03428004e03faca42a8b811759211d49b69dd0e0a686b28ff7b5817789a2f80050791335bf34cf495029075de25603fd56dd3cef36ee8503b9f3b0c1340c8e4012da3267",
+          "private" : "495800a83e6c1d61886d332e2613aa3f70df22865b0387ca6ca195cfcd2b2b1",
+          "shared" : "ebdca74dbf2c8ef63af8d86e0e0ee4511399bc08a395c4ea050bab43a29d2646",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdh_secp256r1_ecpoint_test.json b/third_party/wycheproof/testvectors/ecdh_secp256r1_ecpoint_test.json
new file mode 100644
index 0000000..e96e52b
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdh_secp256r1_ecpoint_test.json
@@ -0,0 +1,936 @@
+{
+  "algorithm" : "ECDH",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "AddSubChain" : "The private key has a special value. Implementations using addition subtraction chains for the point multiplication may get the point at infinity as an intermediate result. See CVE_2017_10176",
+    "CompressedPoint" : "The point in the public key is compressed. Not every library supports points in compressed format."
+  },
+  "numberOfTests" : 99,
+  "header" : [],
+  "testGroups" : [
+    {
+      "curve" : "secp256r1",
+      "encoding" : "ecpoint",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "normal case",
+          "public" : "0462d5bd3372af75fe85a040715d0f502428e07046868b0bfdfa61d731afe44f26ac333a93a9e70a81cd5a95b5bf8d13990eb741c8c38872b4a07d275a014e30cf",
+          "private" : "612465c89a023ab17855b0a6bcebfd3febb53aef84138647b5352e02c10c346",
+          "shared" : "53020d908b0219328b658b525f26780e3ae12bcd952bb25a93bc0895e1714285",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "compressed public key",
+          "public" : "0362d5bd3372af75fe85a040715d0f502428e07046868b0bfdfa61d731afe44f26",
+          "private" : "612465c89a023ab17855b0a6bcebfd3febb53aef84138647b5352e02c10c346",
+          "shared" : "53020d908b0219328b658b525f26780e3ae12bcd952bb25a93bc0895e1714285",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "edge case for shared secret",
+          "public" : "0458fd4168a87795603e2b04390285bdca6e57de6027fe211dd9d25e2212d29e62080d36bd224d7405509295eed02a17150e03b314f96da37445b0d1d29377d12c",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "edge case for shared secret",
+          "public" : "040f6d20c04261ecc3e92846acad48dc8ec5ee35ae0883f0d2ea71216906ee1c47c042689a996dd12830ae459382e94aac56b717af2e2080215f9e41949b1f52be",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "00000000000000000000000000000000ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "edge case for shared secret",
+          "public" : "0400c7defeb1a16236738e9a1123ba621bc8e9a3f2485b3f8ffde7f9ce98f5a8a1cb338c3912b1792f60c2b06ec5231e2d84b0e596e9b76d419ce105ece3791dbc",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "0000000000000000ffffffffffffffff00000000000000010000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "edge case for shared secret",
+          "public" : "04e9b98fb2c0ac045f8c76125ffd99eb8a5157be1d7db3e85d655ec1d8210288cf218df24fd2c2746be59df41262ef3a97d986744b2836748a7486230a319ffec0",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff0000000100000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "edge case for shared secret",
+          "public" : "04e9484e58f3331b66ffed6d90cb1c78065fa28cfba5c7dd4352013d3252ee4277bd7503b045a38b4b247b32c59593580f39e6abfa376c3dca20cf7f9cfb659e13",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "edge case for shared secret",
+          "public" : "04767d7fbb84aa6a4db1079372644e42ecb2fec200c178822392cb8b950ffdd0c91c86853cafd09b52ba2f287f0ebaa26415a3cfabaf92c6a617a19988563d9dea",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "edge case for shared secret",
+          "public" : "04c74d546f2fcc6dd392f85e5be167e358de908756b0c0bb01cb69d864ca083e1c93f959eece6e10ee11bd3934207d65ae28af68b092585a1509260eceb39b92ef",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "085ec5a4af40176b63189069aeffcb229c96d3e046e0283ed2f9dac21b15ad3c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "edge case for shared secret",
+          "public" : "0434fc9f1e7a094cd29598d1841fa9613dbe82313d633a51d63fb6eff074cc9b9a4ecfd9f258c5c4d4210b49751213a24c596982bd1d54e0445443f21ef15492a5",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "190c25f88ad9ae3a098e6cffe6fd0b1bea42114eb0cedd5868a45c5fe277dff3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "edge case for shared secret",
+          "public" : "04d5c96efd1907fd48de2ad715acf82eae5c6690fe3efe16a78d61c68d3bfd10df03eac816b9e7b776192a3f5075887c0e225617505833ca997cda32fd0f673c5e",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "507442007322aa895340cba4abc2d730bfd0b16c2c79a46815f8780d2c55a2dd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "edge case for shared secret",
+          "public" : "04f475f503a770df72c45aedfe42c008f59aa57e72b232f26600bdd0353957cb20bdb8f6405b4918050a3549f44c07a8eba820cdce4ece699888c638df66f54f7c",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "5f177bfe19baaaee597e68b6a87a519e805e9d28a70cb72fd40f0fe5a754ba45",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "edge case for shared secret",
+          "public" : "04f3cb6754b7e2a86d064dfb9f903185aaa4c92b481c2c1a1ff276303bbc4183e49c318599b0984c3563df339311fe143a7d921ee75b755a52c6f804f897b809f7",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "7fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "edge case for shared secret",
+          "public" : "04cce13fbdc96a946dfb8c6d9ed762dbd1731630455689f57a437fee124dd54cecaef78026c653030cf2f314a67064236b0a354defebc5e90c94124e9bf5c4fc24",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "8000000000000000000000000000000000000000000000000000000000000004",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "edge case for shared secret",
+          "public" : "047633dfd0ad06765097bc11bd5022b200df31f28c4ff0625421221ac7eeb6e6f4cb9c67693609ddd6f92343a5a1c635408240f4f8e27120c12554c7ff8c76e2fe",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "edge case for shared secret",
+          "public" : "04a386ace573f87558a68ead2a20088e3fe928bdae9e109446f93a078c15741f0421261e6db2bf12106e4c6bf85b9581b4c0302a526222f90abc5a549206b11011",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "ff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "edge case for shared secret",
+          "public" : "048e7b50f7d8c44d5d3496c43141a502f4a43f153d03ad43eda8e39597f1d477b8647f3da67969b7f989ff4addc393515af40c82085ce1f2ee195412c6f583774f",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "edge case for shared secret",
+          "public" : "04c827fb930fd51d926086191b502af83abb5f717debc8de29897a3934b2571ca05990c0597b0b7a2e42febd56b13235d1d408d76ed2c93b3facf514d902f6910a",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "ffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : "043cbc1b31b43f17dc200dd70c2944c04c6cb1b082820c234a300b05b7763844c74fde0a4ef93887469793270eb2ff148287da9265b0334f9e2609aac16e8ad503",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "7fffffffffffffffffffffffeecf2230ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : "042830d96489ae24b79cad425056e82746f9e3f419ab9aa21ca1fbb11c7325e7d318abe66f575ee8a2f1c4a80e35260ae82ad7d6f661d15f06967930a585097ef7",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000000000000000000000000111124f400000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : "04450b6b6e2097178e9d2850109518d28eb3b6ded2922a5452003bc2e4a4ec775c894e90f0df1b0e6cadb03b9de24f6a22d1bd0a4a58cd645c273cae1c619bfd61",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000000000000000000000001ea77d449ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : "043cbc1b31b43f17dc200dd70c2944c04c6cb1b082820c234a300b05b7763844c7b021f5b006c778ba686cd8f14d00eb7d78256d9b4fccb061d9f6553e91752afc",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "7fffffffffffffffffffffffeecf2230ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : "042830d96489ae24b79cad425056e82746f9e3f419ab9aa21ca1fbb11c7325e7d3e754198fa8a1175e0e3b57f1cad9f517d528290a9e2ea0f96986cf5a7af68108",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000000000000000000000000111124f400000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : "04450b6b6e2097178e9d2850109518d28eb3b6ded2922a5452003bc2e4a4ec775c76b16f0e20e4f194524fc4621db095dd2e42f5b6a7329ba3d8c351e39e64029e",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000000000000000000000001ea77d449ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : "049a0f0e3dd31417bbd9e298bc068ab6d5c36733af26ed67676f410c804b8b2ca1b02c82f3a61a376db795626e9400557112273a36cddb08caaa43953965454730",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "7fffffffffffffffffffffffca089011ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : "048e5d22d5e53ec797c55ecd68a08a7c3361cd99ca7fad1a68ea802a6a4cb58a918ea7a07023ef67677024bd3841e187c64b30a30a3750eb2ee873fbe58fa1357b",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "0000000000000000000000001f6bd1e500000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : "04293aa349b934ab2c839cf54b8a737df2304ef9b20fa494e31ad62b315dd6a53c118182b85ef466eb9a8e87f9661f7d017984c15ea82043f536d1ee6a6d95b509",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000000000000000000000002099f55d5ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : "049a0f0e3dd31417bbd9e298bc068ab6d5c36733af26ed67676f410c804b8b2ca14fd37d0b59e5c893486a9d916bffaa8eedd8c5ca3224f73555bc6ac69abab8cf",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "7fffffffffffffffffffffffca089011ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : "048e5d22d5e53ec797c55ecd68a08a7c3361cd99ca7fad1a68ea802a6a4cb58a9171585f8edc1098998fdb42c7be1e7839b4cf5cf6c8af14d1178c041a705eca84",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "0000000000000000000000001f6bd1e500000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : "04293aa349b934ab2c839cf54b8a737df2304ef9b20fa494e31ad62b315dd6a53cee7e7d46a10b99156571780699e082fe867b3ea257dfbc0ac92e1195926a4af6",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000000000000000000000002099f55d5ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04000000000000000000000000000000000000000000000000000000000000000066485c780e2f83d72433bd5d84a06bb6541c2af31dae871728bf856a174f93f4",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "cfe4077c8730b1c9384581d36bff5542bc417c9eff5c2afcb98cc8829b2ce848",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "0400000000000000000000000000000000ffffffffffffffffffffffffffffffff4f2b92b4c596a5a47f8b041d2dea6043021ac77b9a80b1343ac9d778f4f8f733",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "49ae50fe096a6cd26698b78356b2c8adf1f6a3490f14e364629f7a0639442509",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "040000000000000000ffffffffffffffff0000000000000001000000000000000138120be6ab31edfa34768c4387d2f84fb4b0be8a9a985864a1575f4436bb37b0",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "5a1334572b2a711ead8b4653eb310cd8d9fd114399379a8f6b872e3b8fdda2d9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "0400000000ffffffff00000000ffffffff00000000ffffffff0000000100000000462c0466e41802238d6c925ecbefc747cfe505ea196af9a2d11b62850fce946e",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "c73755133b6b9b4b2a00631cbc7940ecbe6ec08f20448071422e3362f2556888",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff1582fa32e2d4a89dfcfb3d0b149f667dba3329490f4d64ee2ad586c0c9e8c508",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "06fa1059935e47a9fd667e13f469614eb257cc9a7e3fc599bfb92780d59b146d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010001684c8a9586ed6f9cbe447058a7da2108bab1e5e0a60d1f73e4e2e713f0a3dfe0",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "f237df4c10bd3e357971bb2b16b293566b7e355bdc8141d6c92cabc682983c45",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04085ec5a4af40176b63189069aeffcb229c96d3e046e0283ed2f9dac21b15ad3c7859f97cb6e203f46bf3438f61282325e94e681b60b5669788aeb0655bf19d38",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "d874b55678d0a04d216c31b02f3ad1f30c92caaf168f34e3a743356d9276e993",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04190c25f88ad9ae3a098e6cffe6fd0b1bea42114eb0cedd5868a45c5fe277dff321b8342ef077bc6724112403eaee5a15b4c31a71589f02ded09cd99cc5db9c83",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "11a8582057463fc76fda3ab8087eb0a420b0d601bb3134165a369646931e52a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04507442007322aa895340cba4abc2d730bfd0b16c2c79a46815f8780d2c55a2dd4619d69f9940f51663aa12381bc7cf678bd1a72a49fbc11b0b69cb22d1af9f2d",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "4e173a80907f361fe5a5d335ba7685d5eba93e9dfc8d8fcdb1dcd2d2bde27507",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "045f177bfe19baaaee597e68b6a87a519e805e9d28a70cb72fd40f0fe5a754ba4562ca1103f70a2006cd1f67f5f6a3580b29dc446abc90e0e910c1e05a9aa788cd",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "73220471ec8bad99a297db488a34a259f9bc891ffaf09922e6b5001f5df67018",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "047fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff2e2213caf03033e0fd0f7951154f6e6c3a9244a72faca65e9ce9eeb5c8e1cea9",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "55d0a203e22ffb523c8d2705060cee9d28308b51f184beefc518cff690bad346",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "0480000000000000000000000000000000000000000000000000000000000000042be8789db81bb4870a9e60c5c18c80c83de464277281f1af1e640843a1a3148e",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "2518d846e577d95e9e7bc766cde7997cb887fb266d3a6cb598a839fd54aa2f4f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "048000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000722540f8a471c379083c600b58fde4d95c7dcad5095f4219fc5e9bdde3c5cd39",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "bdb49f4bdf42ac64504e9ce677b3ec5c0a03828c5b3efad726005692d35c0f26",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04ff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff5df80fc6cae26b6c1952fbd00ed174ee1209d069335f5b48588e29e80b9191ad",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "f503ac65637e0f17cb4408961cb882c875e4c6ef7a548d2d52d8c2f681838c55",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff2c63650e6a5d332e2987dd09a79008e8faabbd37e49cb016bfb92c8cd0f5da77",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "e3c18e7d7377dc540bc45c08d389bdbe255fa80ca8faf1ef6b94d52049987d21",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04ffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff7a116c964a4cd60668bf89cffe157714a3ce21b93b3ca607c8a5b93ac54ffc0a",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "516d6d329b095a7c7e93b4023d4d05020c1445ef1ddcb3347b3a27d7d7f57265",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "047fffffffffffffffffffffffeecf2230ffffffffffffffffffffffffffffffff00000001c7c30643abed0af0a49fe352cb483ff9b97dccdf427c658e8793240d",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "6fd26661851a8de3c6d06f834ef3acb8f2a5f9c136a985ffe10d5eeb51edcfa3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "047fffffffffffffffffffffffeecf2230fffffffffffffffffffffffffffffffffffffffd383cf9bd5412f50f5b601cad34b7c00746823320bd839a71786cdbf2",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "6fd26661851a8de3c6d06f834ef3acb8f2a5f9c136a985ffe10d5eeb51edcfa3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "047fffffffffffffffffffffffca089011ffffffffffffffffffffffffffffffff267bfdf8a61148decd80283732dd4c1095e4bb40b9658408208dc1147fffffff",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "44236c8b9505a19d48774a3903c0292759b0f826e6ac092ff898d87e53d353fc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "047fffffffffffffffffffffffca089011ffffffffffffffffffffffffffffffffd984020659eeb722327fd7c8cd22b3ef6a1b44c0469a7bf7df723eeb80000000",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "44236c8b9505a19d48774a3903c0292759b0f826e6ac092ff898d87e53d353fc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04000000000000000000000000111124f4000000000000000000000000000000000000000d12d381b0760b1c50be8acf859385052c7f53cde67ce13759de3123a0",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "f1f0e43b374feb7e7f96d4ffe7519fa8bb6c3cfd25f6f87dab2623d2a2d33851",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04000000000000000000000000111124f400000000000000000000000000000000fffffff1ed2c7e5089f4e3af4175307a6c7afad480ac3219831ec8a621cedc5f",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "f1f0e43b374feb7e7f96d4ffe7519fa8bb6c3cfd25f6f87dab2623d2a2d33851",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "040000000000000000000000001f6bd1e5000000000000000000000000000000004096edd6871c320cb8a9f4531751105c97b4c257811bbc32963eaf39ffffffff",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "3ebbace1098a81949d5605dd94a7aa88dc396c2c23e01a9c8cca5bb07bfbb6a1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "040000000000000000000000001f6bd1e500000000000000000000000000000000bf69122878e3cdf447560bace8aeefa3684b3da97ee443cd69c150c600000000",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "3ebbace1098a81949d5605dd94a7aa88dc396c2c23e01a9c8cca5bb07bfbb6a1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04000000000000000000000001ea77d449ffffffffffffffffffffffffffffffff000000007afbc0b325e820646dec622fb558a51c342aa257f4b6a8ec5ddf144f",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "1b085213a9c89d353e1111af078c38c502b7b4771efba51f589b5be243417bdc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04000000000000000000000001ea77d449fffffffffffffffffffffffffffffffffffffffe85043f4dda17df9b92139dd04aa75ae4cbd55da80b495713a220ebb0",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "1b085213a9c89d353e1111af078c38c502b7b4771efba51f589b5be243417bdc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04000000000000000000000002099f55d5ffffffffffffffffffffffffffffffff152c1a22d823a27855ed03f8e2ab5038bb1df4d87e43865f2daf6948ffffffff",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "67cb63566c7ceb12fdd85ce9d2f77c359242bbaa0ea1bf3cf510a4a26591d1f1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04000000000000000000000002099f55d5ffffffffffffffffffffffffffffffffead3e5dc27dc5d88aa12fc071d54afc744e20b2881bc79a0d25096b700000000",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "67cb63566c7ceb12fdd85ce9d2f77c359242bbaa0ea1bf3cf510a4a26591d1f1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "edge case private key",
+          "public" : "0431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "3",
+          "shared" : "85a0b58519b28e70a694ec5198f72c4bfdabaa30a70f7143b5b1cd7536f716ca",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "edge case private key",
+          "public" : "0431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "a329a7d80424ea2d6c904393808e510dfbb28155092f1bac284dceda1f13afe5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "edge case private key",
+          "public" : "0431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "100000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "bd26d0293e8851c51ebe0d426345683ae94026aca545282a4759faa85fde6687",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "edge case private key",
+          "public" : "0431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "ea9350b2490a2010c7abf43fb1a38be729a2de375ea7a6ac34ff58cc87e51b6c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "edge case private key",
+          "public" : "0431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "08000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "34eed3f6673d340b6f716913f6dfa36b5ac85fa667791e2d6a217b0c0b7ba807",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "edge case private key",
+          "public" : "0431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e83f3b9cac2fc632551",
+          "shared" : "1354ce6692c9df7b6fc3119d47c56338afbedccb62faa546c0fe6ed4959e41c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "edge case private key",
+          "public" : "0431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3a9cac2fc632551",
+          "shared" : "fe7496c30d534995f0bf428b5471c21585aaafc81733916f0165597a55d12cb4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "edge case private key",
+          "public" : "0431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b1cac2fc632551",
+          "shared" : "348bf8042e4edf1d03c8b36ab815156e77c201b764ed4562cfe2ee90638ffef5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "edge case private key",
+          "public" : "0431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac1fc632551",
+          "shared" : "6e4ec5479a7c20a537501700484f6f433a8a8fe53c288f7a25c8e8c92d39e8dc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "edge case private key",
+          "public" : "0431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f3",
+          "shared" : "f7407d61fdf581be4f564621d590ca9b7ba37f31396150f9922f1501da8c83ef",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 69,
+          "comment" : "edge case private key",
+          "public" : "0431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632533",
+          "shared" : "82236fd272208693e0574555ca465c6cc512163486084fa57f5e1bd2e2ccc0b3",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 70,
+          "comment" : "edge case private key",
+          "public" : "0431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632543",
+          "shared" : "06537149664dba1a9924654cb7f787ed224851b0df25ef53fcf54f8f26cd5f3f",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 71,
+          "comment" : "edge case private key",
+          "public" : "0431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254b",
+          "shared" : "f2b38539bce995d443c7bfeeefadc9e42cc2c89c60bf4e86eac95d51987bd112",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 72,
+          "comment" : "edge case private key",
+          "public" : "0431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e",
+          "shared" : "85a0b58519b28e70a694ec5198f72c4bfdabaa30a70f7143b5b1cd7536f716ca",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "edge case private key",
+          "public" : "0431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f",
+          "shared" : "027b013a6f166db655d69d643c127ef8ace175311e667dff2520f5b5c75b7659",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 74,
+          "comment" : "CVE-2017-8932",
+          "public" : "04023819813ac969847059028ea88a1f30dfbcde03fc791d3a252c6b41211882eaf93e4ae433cc12cf2a43fc0ef26400c0e125508224cdb649380f25479148a4ad",
+          "private" : "2a265f8bcbdcaf94d58519141e578124cb40d64a501fba9c11847b28965bc737",
+          "shared" : "4d4de80f1534850d261075997e3049321a0864082d24a917863366c0724f5ae3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "CVE-2017-8932",
+          "public" : "04cc11887b2d66cbae8f4d306627192522932146b42f01d3c6f92bd5c8ba739b06a2f08a029cd06b46183085bae9248b0ed15b70280c7ef13a457f5af382426031",
+          "private" : "313f72ff9fe811bf573176231b286a3bdb6f1b14e05c40146590727a71c3bccd",
+          "shared" : "831c3f6b5f762d2f461901577af41354ac5f228c2591f84f8a6e51e2e3f17991",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "point is not on curve",
+          "public" : "0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "point is not on curve",
+          "public" : "0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "point is not on curve",
+          "public" : "040000000000000000000000000000000000000000000000000000000000000000ffffffff00000001000000000000000000000000fffffffffffffffffffffffe",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "point is not on curve",
+          "public" : "040000000000000000000000000000000000000000000000000000000000000000ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "point is not on curve",
+          "public" : "0400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "point is not on curve",
+          "public" : "0400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "point is not on curve",
+          "public" : "040000000000000000000000000000000000000000000000000000000000000001ffffffff00000001000000000000000000000000fffffffffffffffffffffffe",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "point is not on curve",
+          "public" : "040000000000000000000000000000000000000000000000000000000000000001ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "point is not on curve",
+          "public" : "04ffffffff00000001000000000000000000000000fffffffffffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "point is not on curve",
+          "public" : "04ffffffff00000001000000000000000000000000fffffffffffffffffffffffe0000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "point is not on curve",
+          "public" : "04ffffffff00000001000000000000000000000000fffffffffffffffffffffffeffffffff00000001000000000000000000000000fffffffffffffffffffffffe",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "point is not on curve",
+          "public" : "04ffffffff00000001000000000000000000000000fffffffffffffffffffffffeffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "point is not on curve",
+          "public" : "04ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "point is not on curve",
+          "public" : "04ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "point is not on curve",
+          "public" : "04ffffffff00000001000000000000000000000000ffffffffffffffffffffffffffffffff00000001000000000000000000000000fffffffffffffffffffffffe",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "point is not on curve",
+          "public" : "04ffffffff00000001000000000000000000000000ffffffffffffffffffffffffffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "",
+          "public" : "",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "invalid public key",
+          "public" : "02fd4bf61763b46581fd9174d623516cf3c81edd40e29ffa2777fb6cb0ae3ce535",
+          "private" : "6f953faff3599e6c762d7f4cabfeed092de2add1df1bc5748c6cbb725cf35458",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 94,
+          "comment" : "public key is a low order point on twist",
+          "public" : "03efdde3b32872a9effcf3b94cbf73aa7b39f9683ece9121b9852167f4e3da609b",
+          "private" : "0d27edf0ff5b6b6b465753e7158370332c153b468a1be087ad0f490bdb99e5f02",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 95,
+          "comment" : "public key is a low order point on twist",
+          "public" : "02efdde3b32872a9effcf3b94cbf73aa7b39f9683ece9121b9852167f4e3da609b",
+          "private" : "0d27edf0ff5b6b6b465753e7158370332c153b468a1be087ad0f490bdb99e5f03",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 96,
+          "comment" : "public key is a low order point on twist",
+          "public" : "02c49524b2adfd8f5f972ef554652836e2efb2d306c6d3b0689234cec93ae73db5",
+          "private" : "095ead84540c2d027aa3130ff1b47888cc1ed67e8dda46156e71ce0991791e835",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 97,
+          "comment" : "public key is a low order point on twist",
+          "public" : "0318f9bae7747cd844e98525b7ccd0daf6e1d20a818b2175a9a91e4eae5343bc98",
+          "private" : "0a8681ef67fb1f189647d95e8db00c52ceef6d41a85ba0a5bd74c44e8e62c8aa4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 98,
+          "comment" : "public key is a low order point on twist",
+          "public" : "0218f9bae7747cd844e98525b7ccd0daf6e1d20a818b2175a9a91e4eae5343bc98",
+          "private" : "0a8681ef67fb1f189647d95e8db00c52ceef6d41a85ba0a5bd74c44e8e62c8aa5",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 99,
+          "comment" : "public key is a low order point on twist",
+          "public" : "03c49524b2adfd8f5f972ef554652836e2efb2d306c6d3b0689234cec93ae73db5",
+          "private" : "095ead84540c2d027aa3130ff1b47888cc1ed67e8dda46156e71ce0991791e834",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdh_secp256r1_test.json b/third_party/wycheproof/testvectors/ecdh_secp256r1_test.json
new file mode 100644
index 0000000..44d6e1e
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdh_secp256r1_test.json
@@ -0,0 +1,3586 @@
+{
+  "algorithm" : "ECDH",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "AddSubChain" : "The private key has a special value. Implementations using addition subtraction chains for the point multiplication may get the point at infinity as an intermediate result. See CVE_2017_10176",
+    "CompressedPoint" : "The point in the public key is compressed. Not every library supports points in compressed format.",
+    "InvalidAsn" : "The public key in this test uses an invalid ASN encoding. Some cases where the ASN parser is not strictly checking the ASN format are benign as long as the ECDH computation still returns the correct shared value.",
+    "InvalidPublic" : "The public key has been modified and is invalid. An implementation should always check whether the public key is valid and on the same curve as the private key. The test vector includes the shared secret computed with the original public key if the public point is on the curve of the private key. Generating a shared secret other than the one with the original key likely indicates that the bug is exploitable.",
+    "ModifiedPrime" : "The modulus of the public key has been modified. The public point of the public key has been chosen so that it is both a point on both the curve of the modified public key and the private key.",
+    "UnnamedCurve" : "The public key does not use a named curve. RFC 3279 allows to encode such curves by explicitly encoding, the parameters of the curve equation, modulus, generator, order and cofactor. However, many crypto libraries only support named curves. Modifying some of the EC parameters and encoding the corresponding public key as an unnamed curve is a potential attack vector.",
+    "UnusedParam" : "A parameter that is typically not used for ECDH has been modified. Sometimes libraries ignore small differences between public and private key. For example, a library might ignore an incorrect cofactor in the public key. We consider ignoring such changes as acceptable as long as these differences do not change the outcome of the ECDH computation, i.e. as long as the computation is done on the curve from the private key.",
+    "WeakPublicKey" : "The vector contains a weak public key. The curve is not a named curve, the public key point has order 3 and has been chosen to be on the same curve as the private key. This test vector is used to check ECC implementations for missing steps in the verification of the public key.",
+    "WrongOrder" : "The order of the public key has been modified. If this order is used in a cryptographic primitive instead of the correct order then private keys may leak. E.g. ECDHC in BC 1.52 suffered from this."
+  },
+  "numberOfTests" : 340,
+  "header" : [],
+  "testGroups" : [
+    {
+      "curve" : "secp256r1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "normal case",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000462d5bd3372af75fe85a040715d0f502428e07046868b0bfdfa61d731afe44f26ac333a93a9e70a81cd5a95b5bf8d13990eb741c8c38872b4a07d275a014e30cf",
+          "private" : "612465c89a023ab17855b0a6bcebfd3febb53aef84138647b5352e02c10c346",
+          "shared" : "53020d908b0219328b658b525f26780e3ae12bcd952bb25a93bc0895e1714285",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "compressed public key",
+          "public" : "3039301306072a8648ce3d020106082a8648ce3d0301070322000362d5bd3372af75fe85a040715d0f502428e07046868b0bfdfa61d731afe44f26",
+          "private" : "612465c89a023ab17855b0a6bcebfd3febb53aef84138647b5352e02c10c346",
+          "shared" : "53020d908b0219328b658b525f26780e3ae12bcd952bb25a93bc0895e1714285",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000458fd4168a87795603e2b04390285bdca6e57de6027fe211dd9d25e2212d29e62080d36bd224d7405509295eed02a17150e03b314f96da37445b0d1d29377d12c",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040f6d20c04261ecc3e92846acad48dc8ec5ee35ae0883f0d2ea71216906ee1c47c042689a996dd12830ae459382e94aac56b717af2e2080215f9e41949b1f52be",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "00000000000000000000000000000000ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400c7defeb1a16236738e9a1123ba621bc8e9a3f2485b3f8ffde7f9ce98f5a8a1cb338c3912b1792f60c2b06ec5231e2d84b0e596e9b76d419ce105ece3791dbc",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "0000000000000000ffffffffffffffff00000000000000010000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004e9b98fb2c0ac045f8c76125ffd99eb8a5157be1d7db3e85d655ec1d8210288cf218df24fd2c2746be59df41262ef3a97d986744b2836748a7486230a319ffec0",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff0000000100000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004e9484e58f3331b66ffed6d90cb1c78065fa28cfba5c7dd4352013d3252ee4277bd7503b045a38b4b247b32c59593580f39e6abfa376c3dca20cf7f9cfb659e13",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004767d7fbb84aa6a4db1079372644e42ecb2fec200c178822392cb8b950ffdd0c91c86853cafd09b52ba2f287f0ebaa26415a3cfabaf92c6a617a19988563d9dea",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c74d546f2fcc6dd392f85e5be167e358de908756b0c0bb01cb69d864ca083e1c93f959eece6e10ee11bd3934207d65ae28af68b092585a1509260eceb39b92ef",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "085ec5a4af40176b63189069aeffcb229c96d3e046e0283ed2f9dac21b15ad3c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000434fc9f1e7a094cd29598d1841fa9613dbe82313d633a51d63fb6eff074cc9b9a4ecfd9f258c5c4d4210b49751213a24c596982bd1d54e0445443f21ef15492a5",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "190c25f88ad9ae3a098e6cffe6fd0b1bea42114eb0cedd5868a45c5fe277dff3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d5c96efd1907fd48de2ad715acf82eae5c6690fe3efe16a78d61c68d3bfd10df03eac816b9e7b776192a3f5075887c0e225617505833ca997cda32fd0f673c5e",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "507442007322aa895340cba4abc2d730bfd0b16c2c79a46815f8780d2c55a2dd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f475f503a770df72c45aedfe42c008f59aa57e72b232f26600bdd0353957cb20bdb8f6405b4918050a3549f44c07a8eba820cdce4ece699888c638df66f54f7c",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "5f177bfe19baaaee597e68b6a87a519e805e9d28a70cb72fd40f0fe5a754ba45",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f3cb6754b7e2a86d064dfb9f903185aaa4c92b481c2c1a1ff276303bbc4183e49c318599b0984c3563df339311fe143a7d921ee75b755a52c6f804f897b809f7",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "7fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cce13fbdc96a946dfb8c6d9ed762dbd1731630455689f57a437fee124dd54cecaef78026c653030cf2f314a67064236b0a354defebc5e90c94124e9bf5c4fc24",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "8000000000000000000000000000000000000000000000000000000000000004",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047633dfd0ad06765097bc11bd5022b200df31f28c4ff0625421221ac7eeb6e6f4cb9c67693609ddd6f92343a5a1c635408240f4f8e27120c12554c7ff8c76e2fe",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a386ace573f87558a68ead2a20088e3fe928bdae9e109446f93a078c15741f0421261e6db2bf12106e4c6bf85b9581b4c0302a526222f90abc5a549206b11011",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "ff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048e7b50f7d8c44d5d3496c43141a502f4a43f153d03ad43eda8e39597f1d477b8647f3da67969b7f989ff4addc393515af40c82085ce1f2ee195412c6f583774f",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c827fb930fd51d926086191b502af83abb5f717debc8de29897a3934b2571ca05990c0597b0b7a2e42febd56b13235d1d408d76ed2c93b3facf514d902f6910a",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "ffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cbc1b31b43f17dc200dd70c2944c04c6cb1b082820c234a300b05b7763844c74fde0a4ef93887469793270eb2ff148287da9265b0334f9e2609aac16e8ad503",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "7fffffffffffffffffffffffeecf2230ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042830d96489ae24b79cad425056e82746f9e3f419ab9aa21ca1fbb11c7325e7d318abe66f575ee8a2f1c4a80e35260ae82ad7d6f661d15f06967930a585097ef7",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000000000000000000000000111124f400000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004450b6b6e2097178e9d2850109518d28eb3b6ded2922a5452003bc2e4a4ec775c894e90f0df1b0e6cadb03b9de24f6a22d1bd0a4a58cd645c273cae1c619bfd61",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000000000000000000000001ea77d449ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cbc1b31b43f17dc200dd70c2944c04c6cb1b082820c234a300b05b7763844c7b021f5b006c778ba686cd8f14d00eb7d78256d9b4fccb061d9f6553e91752afc",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "7fffffffffffffffffffffffeecf2230ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042830d96489ae24b79cad425056e82746f9e3f419ab9aa21ca1fbb11c7325e7d3e754198fa8a1175e0e3b57f1cad9f517d528290a9e2ea0f96986cf5a7af68108",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000000000000000000000000111124f400000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004450b6b6e2097178e9d2850109518d28eb3b6ded2922a5452003bc2e4a4ec775c76b16f0e20e4f194524fc4621db095dd2e42f5b6a7329ba3d8c351e39e64029e",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000000000000000000000001ea77d449ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200049a0f0e3dd31417bbd9e298bc068ab6d5c36733af26ed67676f410c804b8b2ca1b02c82f3a61a376db795626e9400557112273a36cddb08caaa43953965454730",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "7fffffffffffffffffffffffca089011ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048e5d22d5e53ec797c55ecd68a08a7c3361cd99ca7fad1a68ea802a6a4cb58a918ea7a07023ef67677024bd3841e187c64b30a30a3750eb2ee873fbe58fa1357b",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "0000000000000000000000001f6bd1e500000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004293aa349b934ab2c839cf54b8a737df2304ef9b20fa494e31ad62b315dd6a53c118182b85ef466eb9a8e87f9661f7d017984c15ea82043f536d1ee6a6d95b509",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000000000000000000000002099f55d5ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200049a0f0e3dd31417bbd9e298bc068ab6d5c36733af26ed67676f410c804b8b2ca14fd37d0b59e5c893486a9d916bffaa8eedd8c5ca3224f73555bc6ac69abab8cf",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "7fffffffffffffffffffffffca089011ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048e5d22d5e53ec797c55ecd68a08a7c3361cd99ca7fad1a68ea802a6a4cb58a9171585f8edc1098998fdb42c7be1e7839b4cf5cf6c8af14d1178c041a705eca84",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "0000000000000000000000001f6bd1e500000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004293aa349b934ab2c839cf54b8a737df2304ef9b20fa494e31ad62b315dd6a53cee7e7d46a10b99156571780699e082fe867b3ea257dfbc0ac92e1195926a4af6",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000000000000000000000002099f55d5ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000000000000000000000000000000000000000000000066485c780e2f83d72433bd5d84a06bb6541c2af31dae871728bf856a174f93f4",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "cfe4077c8730b1c9384581d36bff5542bc417c9eff5c2afcb98cc8829b2ce848",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000000000000000000000000000000ffffffffffffffffffffffffffffffff4f2b92b4c596a5a47f8b041d2dea6043021ac77b9a80b1343ac9d778f4f8f733",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "49ae50fe096a6cd26698b78356b2c8adf1f6a3490f14e364629f7a0639442509",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040000000000000000ffffffffffffffff0000000000000001000000000000000138120be6ab31edfa34768c4387d2f84fb4b0be8a9a985864a1575f4436bb37b0",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "5a1334572b2a711ead8b4653eb310cd8d9fd114399379a8f6b872e3b8fdda2d9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000000ffffffff00000000ffffffff00000000ffffffff0000000100000000462c0466e41802238d6c925ecbefc747cfe505ea196af9a2d11b62850fce946e",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "c73755133b6b9b4b2a00631cbc7940ecbe6ec08f20448071422e3362f2556888",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff1582fa32e2d4a89dfcfb3d0b149f667dba3329490f4d64ee2ad586c0c9e8c508",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "06fa1059935e47a9fd667e13f469614eb257cc9a7e3fc599bfb92780d59b146d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010001684c8a9586ed6f9cbe447058a7da2108bab1e5e0a60d1f73e4e2e713f0a3dfe0",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "f237df4c10bd3e357971bb2b16b293566b7e355bdc8141d6c92cabc682983c45",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004085ec5a4af40176b63189069aeffcb229c96d3e046e0283ed2f9dac21b15ad3c7859f97cb6e203f46bf3438f61282325e94e681b60b5669788aeb0655bf19d38",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "d874b55678d0a04d216c31b02f3ad1f30c92caaf168f34e3a743356d9276e993",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004190c25f88ad9ae3a098e6cffe6fd0b1bea42114eb0cedd5868a45c5fe277dff321b8342ef077bc6724112403eaee5a15b4c31a71589f02ded09cd99cc5db9c83",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "11a8582057463fc76fda3ab8087eb0a420b0d601bb3134165a369646931e52a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004507442007322aa895340cba4abc2d730bfd0b16c2c79a46815f8780d2c55a2dd4619d69f9940f51663aa12381bc7cf678bd1a72a49fbc11b0b69cb22d1af9f2d",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "4e173a80907f361fe5a5d335ba7685d5eba93e9dfc8d8fcdb1dcd2d2bde27507",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045f177bfe19baaaee597e68b6a87a519e805e9d28a70cb72fd40f0fe5a754ba4562ca1103f70a2006cd1f67f5f6a3580b29dc446abc90e0e910c1e05a9aa788cd",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "73220471ec8bad99a297db488a34a259f9bc891ffaf09922e6b5001f5df67018",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff2e2213caf03033e0fd0f7951154f6e6c3a9244a72faca65e9ce9eeb5c8e1cea9",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "55d0a203e22ffb523c8d2705060cee9d28308b51f184beefc518cff690bad346",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000480000000000000000000000000000000000000000000000000000000000000042be8789db81bb4870a9e60c5c18c80c83de464277281f1af1e640843a1a3148e",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "2518d846e577d95e9e7bc766cde7997cb887fb266d3a6cb598a839fd54aa2f4f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000722540f8a471c379083c600b58fde4d95c7dcad5095f4219fc5e9bdde3c5cd39",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "bdb49f4bdf42ac64504e9ce677b3ec5c0a03828c5b3efad726005692d35c0f26",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff5df80fc6cae26b6c1952fbd00ed174ee1209d069335f5b48588e29e80b9191ad",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "f503ac65637e0f17cb4408961cb882c875e4c6ef7a548d2d52d8c2f681838c55",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff2c63650e6a5d332e2987dd09a79008e8faabbd37e49cb016bfb92c8cd0f5da77",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "e3c18e7d7377dc540bc45c08d389bdbe255fa80ca8faf1ef6b94d52049987d21",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff7a116c964a4cd60668bf89cffe157714a3ce21b93b3ca607c8a5b93ac54ffc0a",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "516d6d329b095a7c7e93b4023d4d05020c1445ef1ddcb3347b3a27d7d7f57265",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047fffffffffffffffffffffffeecf2230ffffffffffffffffffffffffffffffff00000001c7c30643abed0af0a49fe352cb483ff9b97dccdf427c658e8793240d",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "6fd26661851a8de3c6d06f834ef3acb8f2a5f9c136a985ffe10d5eeb51edcfa3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047fffffffffffffffffffffffeecf2230fffffffffffffffffffffffffffffffffffffffd383cf9bd5412f50f5b601cad34b7c00746823320bd839a71786cdbf2",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "6fd26661851a8de3c6d06f834ef3acb8f2a5f9c136a985ffe10d5eeb51edcfa3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047fffffffffffffffffffffffca089011ffffffffffffffffffffffffffffffff267bfdf8a61148decd80283732dd4c1095e4bb40b9658408208dc1147fffffff",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "44236c8b9505a19d48774a3903c0292759b0f826e6ac092ff898d87e53d353fc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047fffffffffffffffffffffffca089011ffffffffffffffffffffffffffffffffd984020659eeb722327fd7c8cd22b3ef6a1b44c0469a7bf7df723eeb80000000",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "44236c8b9505a19d48774a3903c0292759b0f826e6ac092ff898d87e53d353fc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000000111124f4000000000000000000000000000000000000000d12d381b0760b1c50be8acf859385052c7f53cde67ce13759de3123a0",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "f1f0e43b374feb7e7f96d4ffe7519fa8bb6c3cfd25f6f87dab2623d2a2d33851",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000000111124f400000000000000000000000000000000fffffff1ed2c7e5089f4e3af4175307a6c7afad480ac3219831ec8a621cedc5f",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "f1f0e43b374feb7e7f96d4ffe7519fa8bb6c3cfd25f6f87dab2623d2a2d33851",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040000000000000000000000001f6bd1e5000000000000000000000000000000004096edd6871c320cb8a9f4531751105c97b4c257811bbc32963eaf39ffffffff",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "3ebbace1098a81949d5605dd94a7aa88dc396c2c23e01a9c8cca5bb07bfbb6a1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040000000000000000000000001f6bd1e500000000000000000000000000000000bf69122878e3cdf447560bace8aeefa3684b3da97ee443cd69c150c600000000",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "3ebbace1098a81949d5605dd94a7aa88dc396c2c23e01a9c8cca5bb07bfbb6a1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000001ea77d449ffffffffffffffffffffffffffffffff000000007afbc0b325e820646dec622fb558a51c342aa257f4b6a8ec5ddf144f",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "1b085213a9c89d353e1111af078c38c502b7b4771efba51f589b5be243417bdc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000001ea77d449fffffffffffffffffffffffffffffffffffffffe85043f4dda17df9b92139dd04aa75ae4cbd55da80b495713a220ebb0",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "1b085213a9c89d353e1111af078c38c502b7b4771efba51f589b5be243417bdc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000002099f55d5ffffffffffffffffffffffffffffffff152c1a22d823a27855ed03f8e2ab5038bb1df4d87e43865f2daf6948ffffffff",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "67cb63566c7ceb12fdd85ce9d2f77c359242bbaa0ea1bf3cf510a4a26591d1f1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000002099f55d5ffffffffffffffffffffffffffffffffead3e5dc27dc5d88aa12fc071d54afc744e20b2881bc79a0d25096b700000000",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "67cb63566c7ceb12fdd85ce9d2f77c359242bbaa0ea1bf3cf510a4a26591d1f1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "3",
+          "shared" : "85a0b58519b28e70a694ec5198f72c4bfdabaa30a70f7143b5b1cd7536f716ca",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "a329a7d80424ea2d6c904393808e510dfbb28155092f1bac284dceda1f13afe5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "100000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "bd26d0293e8851c51ebe0d426345683ae94026aca545282a4759faa85fde6687",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "ea9350b2490a2010c7abf43fb1a38be729a2de375ea7a6ac34ff58cc87e51b6c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "08000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "34eed3f6673d340b6f716913f6dfa36b5ac85fa667791e2d6a217b0c0b7ba807",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e83f3b9cac2fc632551",
+          "shared" : "1354ce6692c9df7b6fc3119d47c56338afbedccb62faa546c0fe6ed4959e41c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3a9cac2fc632551",
+          "shared" : "fe7496c30d534995f0bf428b5471c21585aaafc81733916f0165597a55d12cb4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b1cac2fc632551",
+          "shared" : "348bf8042e4edf1d03c8b36ab815156e77c201b764ed4562cfe2ee90638ffef5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac1fc632551",
+          "shared" : "6e4ec5479a7c20a537501700484f6f433a8a8fe53c288f7a25c8e8c92d39e8dc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f3",
+          "shared" : "f7407d61fdf581be4f564621d590ca9b7ba37f31396150f9922f1501da8c83ef",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 69,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632533",
+          "shared" : "82236fd272208693e0574555ca465c6cc512163486084fa57f5e1bd2e2ccc0b3",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 70,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632543",
+          "shared" : "06537149664dba1a9924654cb7f787ed224851b0df25ef53fcf54f8f26cd5f3f",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 71,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254b",
+          "shared" : "f2b38539bce995d443c7bfeeefadc9e42cc2c89c60bf4e86eac95d51987bd112",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 72,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e",
+          "shared" : "85a0b58519b28e70a694ec5198f72c4bfdabaa30a70f7143b5b1cd7536f716ca",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f",
+          "shared" : "027b013a6f166db655d69d643c127ef8ace175311e667dff2520f5b5c75b7659",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 74,
+          "comment" : "CVE-2017-8932",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004023819813ac969847059028ea88a1f30dfbcde03fc791d3a252c6b41211882eaf93e4ae433cc12cf2a43fc0ef26400c0e125508224cdb649380f25479148a4ad",
+          "private" : "2a265f8bcbdcaf94d58519141e578124cb40d64a501fba9c11847b28965bc737",
+          "shared" : "4d4de80f1534850d261075997e3049321a0864082d24a917863366c0724f5ae3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "CVE-2017-8932",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cc11887b2d66cbae8f4d306627192522932146b42f01d3c6f92bd5c8ba739b06a2f08a029cd06b46183085bae9248b0ed15b70280c7ef13a457f5af382426031",
+          "private" : "313f72ff9fe811bf573176231b286a3bdb6f1b14e05c40146590727a71c3bccd",
+          "shared" : "831c3f6b5f762d2f461901577af41354ac5f228c2591f84f8a6e51e2e3f17991",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040000000000000000000000000000000000000000000000000000000000000000ffffffff00000001000000000000000000000000fffffffffffffffffffffffe",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040000000000000000000000000000000000000000000000000000000000000000ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040000000000000000000000000000000000000000000000000000000000000001ffffffff00000001000000000000000000000000fffffffffffffffffffffffe",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040000000000000000000000000000000000000000000000000000000000000001ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffffffff00000001000000000000000000000000fffffffffffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffffffff00000001000000000000000000000000fffffffffffffffffffffffe0000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffffffff00000001000000000000000000000000fffffffffffffffffffffffeffffffff00000001000000000000000000000000fffffffffffffffffffffffe",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffffffff00000001000000000000000000000000fffffffffffffffffffffffeffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffffffff00000001000000000000000000000000ffffffffffffffffffffffffffffffff00000001000000000000000000000000fffffffffffffffffffffffe",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffffffff00000001000000000000000000000000ffffffffffffffffffffffffffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "",
+          "public" : "3018301306072a8648ce3d020106082a8648ce3d030107030100",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "public point not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764c",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 94,
+          "comment" : "public point = (0,0)",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 95,
+          "comment" : "order = -115792089210356248762697446949407573529996955224135760342422259061068512044369",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f50221ff00000000ffffffff00000000000000004319055258e8617b0c46353d039cdaaf020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 96,
+          "comment" : "order = 0",
+          "public" : "308201133081cc06072a8648ce3d02013081c0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5020100020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 97,
+          "comment" : "order = 1",
+          "public" : "308201133081cc06072a8648ce3d02013081c0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5020101020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 98,
+          "comment" : "order = 26959946660873538060741835960514744168612397095220107664918121663170",
+          "public" : "3082012f3081e806072a8648ce3d02013081dc020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5021d00ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 99,
+          "comment" : "generator = (0,0)",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b04410400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 100,
+          "comment" : "generator not on curve",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f7022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 101,
+          "comment" : "cofactor = -1",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510201ff034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 102,
+          "comment" : "cofactor = 0",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020100034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 103,
+          "comment" : "cofactor = 2",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020102034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 104,
+          "comment" : "cofactor = 115792089210356248762697446949407573529996955224135760342422259061068512044369",
+          "public" : "308201553082010d06072a8648ce3d020130820100020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 105,
+          "comment" : "cofactor = None",
+          "public" : "308201303081e906072a8648ce3d02013081dd020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 106,
+          "comment" : "modified prime",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100fd091059a6893635f900e9449d63f572b2aebc4cff7b4e5e33f1b200e8bbc1453044042002f6efa55976c9cb06ff16bb629c0a8d4d5143b40084b1a1cc0e4dff17443eb704205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441040000000000000000000006597fa94b1fd90000000000000000000000000000021b8c7dd77f9a95627922eceefea73f028f1ec95ba9b8fa95a3ad24bdf9fff414022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101034200040000000000000000000006597fa94b1fd90000000000000000000000000000021b8c7dd77f9a95627922eceefea73f028f1ec95ba9b8fa95a3ad24bdf9fff414",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "cea0fbd8f20abc8cf8127c132e29756d25ff1530a88bf5c9e22dc1c137c36be9",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 107,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 108,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 109,
+          "comment" : "a = 0",
+          "public" : "308201143081cd06072a8648ce3d02013081c1020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff302504010004201b95c2f46065dbf0f3ff09153e4748ed71595e0774ba8e25c364ff1e6be039b70441041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 110,
+          "comment" : "public key of order 3",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff304404205a715b6a9ef865f5058e21e20b575d9d585533bd588a9d5fb61cd69534b4e581042036a1a972d367abf9054cce4d54424592882c345283dc9cf0ec47231711f56b22044104d68a3dfbaeb2d277742e833c51625c2ded89b13ea1ec5d33b9cbca77334d79ec89c97eb4143dc3c88d1925fc4f30baba454bb201e5c0d3158ec98bb1fd045e12022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255102010103420004d68a3dfbaeb2d277742e833c51625c2ded89b13ea1ec5d33b9cbca77334d79ec7636814aebc23c3872e6da03b0cf4545bab44dff1a3f2cea7136744e02fba1ed",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "f0652d1cc135c763cd51e429d320a6101634d13b59790c3b1db0063f9f00dc99",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 111,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00042af270d2a6030e3dd38cc46e7d719f176c2ca4eb04d7e8b84290c8edbcaed964ebe226b2d7ce17251622804c0d3b7adce020a3cdc97cac6c",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200041f17901e731b06f349b6e9d7d17d45e8a2b46115a47485be16197932db87b39405b5c941b36fd61b9ef7dd20878e129e55a2277099c601dcdb3747f80ad6e166116378e1ebce2c95744a0986128cfeeaac7f90b71787d9a1cfe417cd4c8f6af5",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400ed76e5888428fad409ff203ab298b0f24827c091939ae0f9b1245d865ac5fbcd2749f9ae6c90fa8e29414d1bc7dc7b3c4aca904cd824484421cc66fe6af43bdfd200c1f790a0b3ae994937f91b6bdb9778b08c83ecadb8cba22a78c37bf565dac164f18e719be0ef890ee5cbf20e17fcfc9a5585e5416470b9862f82fb769339994f4e",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200048028d16082b07696d4aa4aab9d6b1f1463435ac097900631108f9888e13da67c4841fd8dd3ced6e7ad8c6fc656621c2f93d3db0eb29d48d1423154519865dbc1",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004a6bae3d155c1f9ca263928c986ede69acefd0dd9b3a19d2b9f4b0a3a66bea5d167318dcc028945fc1b40c60ce716ba2d414a743c6b856a6f",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200045d3ddbbb9bc071d8b59855c74bdf3541ae4cb6c1a24ec439034df7abde16a346523edf6a67896b304cb2cd2a083eec2b16935bbc910e85ec6eae38b50230bf70",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004a43c6ef2500723d54c1fc88f8844d83445ca5a0f585c10b8eb3f022d47d0e84862b7f5cbf97d352d4348ca730f600f2258d1d192da223f6ba83a7cc0d6da598d55c2b77824d326c8df000b8fff156d2c",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200042391c062833d1e6d89ec256cf4a3989534c1ead5e1e14ffae933a53f962857e4713087e1b3d65ac79634c71577af24698b5ce959183835551f7b08aef7853378c299930b360813fd58d5e4da8b37d5a7473e891ee11cb02881bd848b364fb7d5",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000484beae85096640953c1fd6ebbc32697263d53f89943cbaf14432061aea8c0318acbd9389ab1d2e904fa0e081d08cfabb614ed9bca618211142d94623c14b476a25e47abf98fd3b1da1417dfc2e2cfc8424b16ea14dd45e1422be7d4e0a5cc7f4d4ab5f198cdbaaa3f642ec6361842cbe869382ee78cd596ff5e740d9ec2c3ad6",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00042b0a1a858ffc44e7752940731d378f96570837e279ea3948fe00cff8b5f89adb4e2fe6f8781ba6426364f4590b34dd79fc80629de4a86084",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200043037c01b4a5ac53742e3f5528dffb0f010ab6ebeb08d792b32e19e9006ca331a024b67698d7cf4b575ccd9389441d5c640b77c63771cef1bd85675361c6602a4",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200040f0fd972a495a140124a4019291a20f5b39fb755c126bf268643bb3091eca44f2a3cda1dead6ab1f4fe08a4b3872423f71e5bf96b1c20bc0ca73b7e2c134cc14a5f77bc838ebcf01084da3bf15663536",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c0362000403b65faf5a6bf74bd5c166278a4b566c6c705ac6363e61f3b0699e116d3c5b19e8b7021b75b005f78a8cea8de34c49397f9b3b2bfc8706eb8163c802371eff7dfc825c40aa84dd9d1c4b34615ee5ae28c6c05d58d2a8ccc3786382b712d3bcda",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200047504d660943a69ab043378e44c034896534a346e0e95f35fcaad3503b490856bfb20a753ecabc6d7bfeec28d057f919923b7d3c086953eb16c5bd287b59788db72dbb7c273854294c927ea7eca205aae2f0830e5faaddad8316231bfc3572c85c33cb7054e04c8936e3ce059c907e59f40593444e590b31820bc1f514ed0ec8a",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "invalid public key",
+          "public" : "3039301306072a8648ce3d020106082a8648ce3d03010703220002fd4bf61763b46581fd9174d623516cf3c81edd40e29ffa2777fb6cb0ae3ce535",
+          "private" : "6f953faff3599e6c762d7f4cabfeed092de2add1df1bc5748c6cbb725cf35458",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 126,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3039301306072a8648ce3d020106082a8648ce3d03010703220003efdde3b32872a9effcf3b94cbf73aa7b39f9683ece9121b9852167f4e3da609b",
+          "private" : "0d27edf0ff5b6b6b465753e7158370332c153b468a1be087ad0f490bdb99e5f02",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 127,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3039301306072a8648ce3d020106082a8648ce3d03010703220002efdde3b32872a9effcf3b94cbf73aa7b39f9683ece9121b9852167f4e3da609b",
+          "private" : "0d27edf0ff5b6b6b465753e7158370332c153b468a1be087ad0f490bdb99e5f03",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 128,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3039301306072a8648ce3d020106082a8648ce3d03010703220002c49524b2adfd8f5f972ef554652836e2efb2d306c6d3b0689234cec93ae73db5",
+          "private" : "095ead84540c2d027aa3130ff1b47888cc1ed67e8dda46156e71ce0991791e835",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 129,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3039301306072a8648ce3d020106082a8648ce3d0301070322000318f9bae7747cd844e98525b7ccd0daf6e1d20a818b2175a9a91e4eae5343bc98",
+          "private" : "0a8681ef67fb1f189647d95e8db00c52ceef6d41a85ba0a5bd74c44e8e62c8aa4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 130,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3039301306072a8648ce3d020106082a8648ce3d0301070322000218f9bae7747cd844e98525b7ccd0daf6e1d20a818b2175a9a91e4eae5343bc98",
+          "private" : "0a8681ef67fb1f189647d95e8db00c52ceef6d41a85ba0a5bd74c44e8e62c8aa5",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 131,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3039301306072a8648ce3d020106082a8648ce3d03010703220003c49524b2adfd8f5f972ef554652836e2efb2d306c6d3b0689234cec93ae73db5",
+          "private" : "095ead84540c2d027aa3130ff1b47888cc1ed67e8dda46156e71ce0991791e834",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 132,
+          "comment" : "long form encoding of length",
+          "public" : "308159301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 133,
+          "comment" : "long form encoding of length",
+          "public" : "305a30811306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 134,
+          "comment" : "long form encoding of length",
+          "public" : "305a30140681072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 135,
+          "comment" : "long form encoding of length",
+          "public" : "305a301406072a8648ce3d02010681082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 136,
+          "comment" : "long form encoding of length",
+          "public" : "305a301306072a8648ce3d020106082a8648ce3d03010703814200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 137,
+          "comment" : "length contains leading 0",
+          "public" : "30820059301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 138,
+          "comment" : "length contains leading 0",
+          "public" : "305b3082001306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 139,
+          "comment" : "length contains leading 0",
+          "public" : "305b3015068200072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 140,
+          "comment" : "length contains leading 0",
+          "public" : "305b301506072a8648ce3d0201068200082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 141,
+          "comment" : "length contains leading 0",
+          "public" : "305b301306072a8648ce3d020106082a8648ce3d0301070382004200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 142,
+          "comment" : "wrong length",
+          "public" : "305a301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 143,
+          "comment" : "wrong length",
+          "public" : "3058301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 144,
+          "comment" : "wrong length",
+          "public" : "3059301406072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "wrong length",
+          "public" : "3059301206072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "wrong length",
+          "public" : "3059301306082a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "wrong length",
+          "public" : "3059301306062a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "wrong length",
+          "public" : "3059301306072a8648ce3d020106092a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "wrong length",
+          "public" : "3059301306072a8648ce3d020106072a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "wrong length",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034300042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "wrong length",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034100042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "uint32 overflow in length",
+          "public" : "30850100000059301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "uint32 overflow in length",
+          "public" : "305e3085010000001306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "uint32 overflow in length",
+          "public" : "305e3018068501000000072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "uint32 overflow in length",
+          "public" : "305e301806072a8648ce3d0201068501000000082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "uint32 overflow in length",
+          "public" : "305e301306072a8648ce3d020106082a8648ce3d0301070385010000004200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "uint64 overflow in length",
+          "public" : "3089010000000000000059301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "uint64 overflow in length",
+          "public" : "3062308901000000000000001306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "uint64 overflow in length",
+          "public" : "3062301c06890100000000000000072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "uint64 overflow in length",
+          "public" : "3062301c06072a8648ce3d020106890100000000000000082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "uint64 overflow in length",
+          "public" : "3062301306072a8648ce3d020106082a8648ce3d030107038901000000000000004200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "length = 2**31 - 1",
+          "public" : "30847fffffff301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "length = 2**31 - 1",
+          "public" : "305d30847fffffff06072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "length = 2**31 - 1",
+          "public" : "305d301706847fffffff2a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "length = 2**31 - 1",
+          "public" : "305d301706072a8648ce3d020106847fffffff2a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "length = 2**31 - 1",
+          "public" : "305d301306072a8648ce3d020106082a8648ce3d03010703847fffffff00042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "length = 2**32 - 1",
+          "public" : "3084ffffffff301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "length = 2**32 - 1",
+          "public" : "305d3084ffffffff06072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "length = 2**32 - 1",
+          "public" : "305d30170684ffffffff2a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "length = 2**32 - 1",
+          "public" : "305d301706072a8648ce3d02010684ffffffff2a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "length = 2**32 - 1",
+          "public" : "305d301306072a8648ce3d020106082a8648ce3d0301070384ffffffff00042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "length = 2**40 - 1",
+          "public" : "3085ffffffffff301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "length = 2**40 - 1",
+          "public" : "305e3085ffffffffff06072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "length = 2**40 - 1",
+          "public" : "305e30180685ffffffffff2a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "length = 2**40 - 1",
+          "public" : "305e301806072a8648ce3d02010685ffffffffff2a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "length = 2**40 - 1",
+          "public" : "305e301306072a8648ce3d020106082a8648ce3d0301070385ffffffffff00042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3088ffffffffffffffff301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "length = 2**64 - 1",
+          "public" : "30613088ffffffffffffffff06072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3061301b0688ffffffffffffffff2a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3061301b06072a8648ce3d02010688ffffffffffffffff2a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3061301306072a8648ce3d020106082a8648ce3d0301070388ffffffffffffffff00042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "incorrect length",
+          "public" : "30ff301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "incorrect length",
+          "public" : "305930ff06072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "incorrect length",
+          "public" : "3059301306ff2a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "incorrect length",
+          "public" : "3059301306072a8648ce3d020106ff2a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "incorrect length",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703ff00042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "indefinite length without termination",
+          "public" : "3080301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "indefinite length without termination",
+          "public" : "3059308006072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "indefinite length without termination",
+          "public" : "3059301306802a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "indefinite length without termination",
+          "public" : "3059301306072a8648ce3d020106802a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "indefinite length without termination",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107038000042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "removing sequence",
+          "public" : "",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "removing sequence",
+          "public" : "3044034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "lonely sequence tag",
+          "public" : "30",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "lonely sequence tag",
+          "public" : "304530034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "appending 0's to sequence",
+          "public" : "305b301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b0000",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "appending 0's to sequence",
+          "public" : "305b301506072a8648ce3d020106082a8648ce3d0301070000034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "prepending 0's to sequence",
+          "public" : "305b0000301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "prepending 0's to sequence",
+          "public" : "305b3015000006072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "appending unused 0's to sequence",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b0000",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "appending unused 0's to sequence",
+          "public" : "305b301306072a8648ce3d020106082a8648ce3d0301070000034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "appending null value to sequence",
+          "public" : "305b301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b0500",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "appending null value to sequence",
+          "public" : "305b301506072a8648ce3d020106082a8648ce3d0301070500034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "including garbage",
+          "public" : "305e4981773059301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "including garbage",
+          "public" : "305d25003059301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "including garbage",
+          "public" : "305b3059301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b0004deadbeef",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "including garbage",
+          "public" : "305e3018498177301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "including garbage",
+          "public" : "305d30172500301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "including garbage",
+          "public" : "30613015301306072a8648ce3d020106082a8648ce3d0301070004deadbeef034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "including garbage",
+          "public" : "305e3018260c49817706072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "including garbage",
+          "public" : "305d3017260b250006072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "including garbage",
+          "public" : "3061301b260906072a8648ce3d02010004deadbeef06082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "including garbage",
+          "public" : "305e301806072a8648ce3d0201260d49817706082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "including garbage",
+          "public" : "305d301706072a8648ce3d0201260c250006082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "including garbage",
+          "public" : "3061301b06072a8648ce3d0201260a06082a8648ce3d0301070004deadbeef034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "including garbage",
+          "public" : "305e301306072a8648ce3d020106082a8648ce3d0301072347498177034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 217,
+          "comment" : "including garbage",
+          "public" : "305d301306072a8648ce3d020106082a8648ce3d03010723462500034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 218,
+          "comment" : "including garbage",
+          "public" : "3061301306072a8648ce3d020106082a8648ce3d0301072344034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b0004deadbeef",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 219,
+          "comment" : "including undefined tags",
+          "public" : "3061aa00bb00cd003059301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 220,
+          "comment" : "including undefined tags",
+          "public" : "305faa02aabb3059301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 221,
+          "comment" : "including undefined tags",
+          "public" : "3061301baa00bb00cd00301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 222,
+          "comment" : "including undefined tags",
+          "public" : "305f3019aa02aabb301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 223,
+          "comment" : "including undefined tags",
+          "public" : "3061301b260faa00bb00cd0006072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 224,
+          "comment" : "including undefined tags",
+          "public" : "305f3019260daa02aabb06072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 225,
+          "comment" : "including undefined tags",
+          "public" : "3061301b06072a8648ce3d02012610aa00bb00cd0006082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 226,
+          "comment" : "including undefined tags",
+          "public" : "305f301906072a8648ce3d0201260eaa02aabb06082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 227,
+          "comment" : "including undefined tags",
+          "public" : "3061301306072a8648ce3d020106082a8648ce3d030107234aaa00bb00cd00034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 228,
+          "comment" : "including undefined tags",
+          "public" : "305f301306072a8648ce3d020106082a8648ce3d0301072348aa02aabb034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 229,
+          "comment" : "truncated length of sequence",
+          "public" : "3081",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 230,
+          "comment" : "truncated length of sequence",
+          "public" : "30463081034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 231,
+          "comment" : "Replacing sequence with NULL",
+          "public" : "0500",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 232,
+          "comment" : "Replacing sequence with NULL",
+          "public" : "30460500034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 233,
+          "comment" : "changing tag value of sequence",
+          "public" : "2e59301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 234,
+          "comment" : "changing tag value of sequence",
+          "public" : "2f59301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 235,
+          "comment" : "changing tag value of sequence",
+          "public" : "3159301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 236,
+          "comment" : "changing tag value of sequence",
+          "public" : "3259301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 237,
+          "comment" : "changing tag value of sequence",
+          "public" : "ff59301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 238,
+          "comment" : "changing tag value of sequence",
+          "public" : "30592e1306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 239,
+          "comment" : "changing tag value of sequence",
+          "public" : "30592f1306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 240,
+          "comment" : "changing tag value of sequence",
+          "public" : "3059311306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 241,
+          "comment" : "changing tag value of sequence",
+          "public" : "3059321306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 242,
+          "comment" : "changing tag value of sequence",
+          "public" : "3059ff1306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 243,
+          "comment" : "dropping value of sequence",
+          "public" : "3000",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 244,
+          "comment" : "dropping value of sequence",
+          "public" : "30463000034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 245,
+          "comment" : "truncate sequence",
+          "public" : "3058301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add6",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 246,
+          "comment" : "truncate sequence",
+          "public" : "30581306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 247,
+          "comment" : "truncate sequence",
+          "public" : "3058301206072a8648ce3d020106082a8648ce3d0301034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 248,
+          "comment" : "truncate sequence",
+          "public" : "30583012072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 249,
+          "comment" : "indefinite length",
+          "public" : "3080301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b0000",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 250,
+          "comment" : "indefinite length",
+          "public" : "305b308006072a8648ce3d020106082a8648ce3d0301070000034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 251,
+          "comment" : "indefinite length with truncated delimiter",
+          "public" : "3080301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b00",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 252,
+          "comment" : "indefinite length with truncated delimiter",
+          "public" : "305a308006072a8648ce3d020106082a8648ce3d03010700034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 253,
+          "comment" : "indefinite length with additional element",
+          "public" : "3080301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b05000000",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 254,
+          "comment" : "indefinite length with additional element",
+          "public" : "305d308006072a8648ce3d020106082a8648ce3d03010705000000034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 255,
+          "comment" : "indefinite length with truncated element",
+          "public" : "3080301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b060811220000",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 256,
+          "comment" : "indefinite length with truncated element",
+          "public" : "305f308006072a8648ce3d020106082a8648ce3d030107060811220000034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 257,
+          "comment" : "indefinite length with garbage",
+          "public" : "3080301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b0000fe02beef",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 258,
+          "comment" : "indefinite length with garbage",
+          "public" : "305f308006072a8648ce3d020106082a8648ce3d0301070000fe02beef034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 259,
+          "comment" : "indefinite length with nonempty EOC",
+          "public" : "3080301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b0002beef",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 260,
+          "comment" : "indefinite length with nonempty EOC",
+          "public" : "305d308006072a8648ce3d020106082a8648ce3d0301070002beef034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 261,
+          "comment" : "prepend empty sequence",
+          "public" : "305b3000301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 262,
+          "comment" : "prepend empty sequence",
+          "public" : "305b3015300006072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 263,
+          "comment" : "append empty sequence",
+          "public" : "305b301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b3000",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 264,
+          "comment" : "append empty sequence",
+          "public" : "305b301506072a8648ce3d020106082a8648ce3d0301073000034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 265,
+          "comment" : "sequence of sequence",
+          "public" : "305b3059301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 266,
+          "comment" : "sequence of sequence",
+          "public" : "305b3015301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 267,
+          "comment" : "truncated sequence",
+          "public" : "3015301306072a8648ce3d020106082a8648ce3d030107",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 268,
+          "comment" : "truncated sequence",
+          "public" : "304f300906072a8648ce3d0201034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 269,
+          "comment" : "repeat element in sequence",
+          "public" : "30819d301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 270,
+          "comment" : "repeat element in sequence",
+          "public" : "3063301d06072a8648ce3d020106082a8648ce3d03010706082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 271,
+          "comment" : "removing oid",
+          "public" : "3050300a06082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 272,
+          "comment" : "lonely oid tag",
+          "public" : "3051300b0606082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 273,
+          "comment" : "lonely oid tag",
+          "public" : "3050300a06072a8648ce3d020106034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 274,
+          "comment" : "appending 0's to oid",
+          "public" : "305b301506092a8648ce3d0201000006082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 275,
+          "comment" : "appending 0's to oid",
+          "public" : "305b301506072a8648ce3d0201060a2a8648ce3d0301070000034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 276,
+          "comment" : "prepending 0's to oid",
+          "public" : "305b3015060900002a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 277,
+          "comment" : "prepending 0's to oid",
+          "public" : "305b301506072a8648ce3d0201060a00002a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 278,
+          "comment" : "appending unused 0's to oid",
+          "public" : "305b301506072a8648ce3d0201000006082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 279,
+          "comment" : "appending null value to oid",
+          "public" : "305b301506092a8648ce3d0201050006082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 280,
+          "comment" : "appending null value to oid",
+          "public" : "305b301506072a8648ce3d0201060a2a8648ce3d0301070500034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 281,
+          "comment" : "truncated length of oid",
+          "public" : "3052300c068106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 282,
+          "comment" : "truncated length of oid",
+          "public" : "3051300b06072a8648ce3d02010681034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 283,
+          "comment" : "Replacing oid with NULL",
+          "public" : "3052300c050006082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 284,
+          "comment" : "Replacing oid with NULL",
+          "public" : "3051300b06072a8648ce3d02010500034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 285,
+          "comment" : "changing tag value of oid",
+          "public" : "3059301304072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 286,
+          "comment" : "changing tag value of oid",
+          "public" : "3059301305072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 287,
+          "comment" : "changing tag value of oid",
+          "public" : "3059301307072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 288,
+          "comment" : "changing tag value of oid",
+          "public" : "3059301308072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 289,
+          "comment" : "changing tag value of oid",
+          "public" : "30593013ff072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 290,
+          "comment" : "changing tag value of oid",
+          "public" : "3059301306072a8648ce3d020104082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 291,
+          "comment" : "changing tag value of oid",
+          "public" : "3059301306072a8648ce3d020105082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 292,
+          "comment" : "changing tag value of oid",
+          "public" : "3059301306072a8648ce3d020107082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 293,
+          "comment" : "changing tag value of oid",
+          "public" : "3059301306072a8648ce3d020108082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 294,
+          "comment" : "changing tag value of oid",
+          "public" : "3059301306072a8648ce3d0201ff082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 295,
+          "comment" : "dropping value of oid",
+          "public" : "3052300c060006082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 296,
+          "comment" : "dropping value of oid",
+          "public" : "3051300b06072a8648ce3d02010600034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 297,
+          "comment" : "modify first byte of oid",
+          "public" : "305930130607288648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 298,
+          "comment" : "modify first byte of oid",
+          "public" : "3059301306072a8648ce3d02010608288648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 299,
+          "comment" : "modify last byte of oid",
+          "public" : "3059301306072a8648ce3d028106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 300,
+          "comment" : "modify last byte of oid",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030187034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 301,
+          "comment" : "truncate oid",
+          "public" : "3058301206062a8648ce3d0206082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 302,
+          "comment" : "truncate oid",
+          "public" : "3058301206068648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 303,
+          "comment" : "truncate oid",
+          "public" : "3058301206072a8648ce3d020106072a8648ce3d0301034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 304,
+          "comment" : "truncate oid",
+          "public" : "3058301206072a8648ce3d020106078648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 305,
+          "comment" : "wrong oid",
+          "public" : "305c3016060a3262306530333032316106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 306,
+          "comment" : "wrong oid",
+          "public" : "3064301e061236303836343830313635303330343032303106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 307,
+          "comment" : "wrong oid",
+          "public" : "305b301506072a8648ce3d0201060a32623065303330323161034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 308,
+          "comment" : "wrong oid",
+          "public" : "3063301d06072a8648ce3d02010612363038363438303136353033303430323031034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 309,
+          "comment" : "longer oid",
+          "public" : "3062301c06103261383634386365336430323031303106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 310,
+          "comment" : "longer oid",
+          "public" : "3063301d06072a8648ce3d02010612326138363438636533643033303130373031034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 311,
+          "comment" : "oid with modified node",
+          "public" : "3060301a060e326138363438636533643032313106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 312,
+          "comment" : "oid with modified node",
+          "public" : "3068302206163261383634386365336430323838383038303830303106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 313,
+          "comment" : "oid with modified node",
+          "public" : "3061301b06072a8648ce3d0201061032613836343863653364303330313137034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 314,
+          "comment" : "oid with modified node",
+          "public" : "3069302306072a8648ce3d02010618326138363438636533643033303138383830383038303037034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 315,
+          "comment" : "large integer in oid",
+          "public" : "3072302c0620326138363438636533643032383238303830383038303830383038303830303106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 316,
+          "comment" : "large integer in oid",
+          "public" : "3073302d06072a8648ce3d0201062232613836343863653364303330313832383038303830383038303830383038303037034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 317,
+          "comment" : "oid with invalid node",
+          "public" : "3063301d0611326138363438636533643032303165303306082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 318,
+          "comment" : "oid with invalid node",
+          "public" : "305a301406082a808648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 319,
+          "comment" : "oid with invalid node",
+          "public" : "3064301e06072a8648ce3d0201061332613836343863653364303330313037653033034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 320,
+          "comment" : "oid with invalid node",
+          "public" : "305a301406072a8648ce3d020106092a808648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 321,
+          "comment" : "lonely bit string tag",
+          "public" : "3016301306072a8648ce3d020106082a8648ce3d03010703",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 322,
+          "comment" : "appending 0's to bit string",
+          "public" : "305b301306072a8648ce3d020106082a8648ce3d030107034400042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b0000",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 323,
+          "comment" : "prepending 0's to bit string",
+          "public" : "305b301306072a8648ce3d020106082a8648ce3d0301070344000000042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 324,
+          "comment" : "appending null value to bit string",
+          "public" : "305b301306072a8648ce3d020106082a8648ce3d030107034400042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b0500",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 325,
+          "comment" : "truncated length of bit string",
+          "public" : "3017301306072a8648ce3d020106082a8648ce3d0301070381",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 326,
+          "comment" : "Replacing bit string with NULL",
+          "public" : "3017301306072a8648ce3d020106082a8648ce3d0301070500",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 327,
+          "comment" : "changing tag value of bit string",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107014200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 328,
+          "comment" : "changing tag value of bit string",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107024200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 329,
+          "comment" : "changing tag value of bit string",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107044200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 330,
+          "comment" : "changing tag value of bit string",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107054200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 331,
+          "comment" : "changing tag value of bit string",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107ff4200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 332,
+          "comment" : "dropping value of bit string",
+          "public" : "3017301306072a8648ce3d020106082a8648ce3d0301070300",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 333,
+          "comment" : "modify first byte of bit string",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034202042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 334,
+          "comment" : "modify last byte of bit string",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add6eb",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 335,
+          "comment" : "truncate bit string",
+          "public" : "3058301306072a8648ce3d020106082a8648ce3d030107034100042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add6",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 336,
+          "comment" : "truncate bit string",
+          "public" : "3058301306072a8648ce3d020106082a8648ce3d0301070341042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 337,
+          "comment" : "declaring bits as unused in a bit-string",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034201042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 338,
+          "comment" : "unused bits in a bit-string",
+          "public" : "305d301306072a8648ce3d020106082a8648ce3d030107034620042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b01020304",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 339,
+          "comment" : "unused bits in empty bit-string",
+          "public" : "3018301306072a8648ce3d020106082a8648ce3d030107030103",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 340,
+          "comment" : "128 unused bits",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034280042998705a9a71c783e1cf4397dbed9375a44e4cb88053594b0ea982203b6363b063d0af4971d1c3813db3c7799f9f9324cbe1b90054c81b510ff6297160add66b",
+          "private" : "0c9551ffe53ce60d73cbf8af553d0cb5f7632ece499590182c28cb6db2e3978d2",
+          "shared" : "f0b6d851dcd8e9a8c474d695137962f082c4f2a1a2eefb182df58d88a72829e4",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdh_secp384r1_ecpoint_test.json b/third_party/wycheproof/testvectors/ecdh_secp384r1_ecpoint_test.json
new file mode 100644
index 0000000..56da9ba
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdh_secp384r1_ecpoint_test.json
@@ -0,0 +1,722 @@
+{
+  "algorithm" : "ECDH",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "AddSubChain" : "The private key has a special value. Implementations using addition subtraction chains for the point multiplication may get the point at infinity as an intermediate result. See CVE_2017_10176",
+    "CompressedPoint" : "The point in the public key is compressed. Not every library supports points in compressed format."
+  },
+  "numberOfTests" : 77,
+  "header" : [],
+  "testGroups" : [
+    {
+      "curve" : "secp384r1",
+      "encoding" : "ecpoint",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "normal case",
+          "public" : "04790a6e059ef9a5940163183d4a7809135d29791643fc43a2f17ee8bf677ab84f791b64a6be15969ffa012dd9185d8796d9b954baa8a75e82df711b3b56eadff6b0f668c3b26b4b1aeb308a1fcc1c680d329a6705025f1c98a0b5e5bfcb163caa",
+          "private" : "766e61425b2da9f846c09fc3564b93a6f8603b7392c785165bf20da948c49fd1fb1dee4edd64356b9f21c588b75dfd81",
+          "shared" : "6461defb95d996b24296f5a1832b34db05ed031114fbe7d98d098f93859866e4de1e229da71fef0c77fe49b249190135",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "compressed public key",
+          "public" : "02790a6e059ef9a5940163183d4a7809135d29791643fc43a2f17ee8bf677ab84f791b64a6be15969ffa012dd9185d8796",
+          "private" : "766e61425b2da9f846c09fc3564b93a6f8603b7392c785165bf20da948c49fd1fb1dee4edd64356b9f21c588b75dfd81",
+          "shared" : "6461defb95d996b24296f5a1832b34db05ed031114fbe7d98d098f93859866e4de1e229da71fef0c77fe49b249190135",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "edge case for shared secret",
+          "public" : "04490e96d17f4c6ceccd45def408cea33e9704a5f1b01a3de2eaaa3409fd160d78d395d6b3b003d71fd1f590fad95bf1c9d8665efc2070d059aa847125c2f707435955535c7c5df6d6c079ec806dce6b6849d337140db7ca50616f9456de1323c4",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "edge case for shared secret",
+          "public" : "040161328909675213e32098d35a6b8308a8d500cca39dcee5e804e73bdb8deaf06fe417291fd9793b231ef5fe86945444a97a01f3ae3a8310c4af49b592cb291ef70ee5bc7f5534d3c23dc9eefde2304842c7737ae937ccf9bd215c28103e9fe2",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "edge case for shared secret",
+          "public" : "04af4ae964e3bcbd923accda5da3175d411fd62d17dd3c3a1c410bef1730985a6265d90e950ac0fc50743b1ed771906ff33b68cf4d3d83a885a87097fdd329ce83b189f98cec5be44c31d1a3a2bba10f471963232b8ba7610fa8c72179050eb86d",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "edge case for shared secret",
+          "public" : "041478ab6e032b9545eda9ac2c264e57a11f08acbc76d16a0ab77b04dbdaf20f215c4183437b32afc471eaa603d14c7c5d8a4c84ee0e895bec5c37f0a1ca075e106ff6bf38801b5c697409d39675231108d33c4a5ea65aaa8c03e939c95d96c4c4",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff00000000000000010000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "edge case for shared secret",
+          "public" : "04f63208e34e7e90bb5fb036432467a89981444010663b8533b47bfa94bd2bc16f38aa516b930a4726e3876d3091bfb72ec783ed4da0cac06320817dc8bc64f59ccf06f48abc4386a150913fa95743a7b4601190e1c6ee8f8bf6354b254ecace45",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "edge case for shared secret",
+          "public" : "04033271ef42d92ad47b273b09ea2f45401161baa52696590d0e175ff2d1c0dfa3fea40e4266d446546c05e480d57fabec7889f16a8bcc176602f6d46561614a2f4284abe697b7cb9ce79f7e2e71b155cb1f155ce925d16391a680eda23152e6e1",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "edge case for shared secret",
+          "public" : "04737e8437e18683de2455b68945bba31daec3e754d72f0a0776d3192b2f9298bb95ca1464baa6687aabb679f804cf6ec6c2b4d47d61a60404df63b1e9ac0954b3419bbc2ad52a0409aeeb82f4703758588059165b20367dcb4b235b0caf71d727",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "edge case for shared secret",
+          "public" : "0437f9004983156bbd9c47891e75237bb13016bd7fe6f4e0f71cef0e63f16a672f0d3b0e20165c33407e146b6a4ae6962dd3b57ccb99e7aaf1303240516d0ebe08e585513e3695d42c467dcab5340ef761990cadc8d8840aacc944481415c07feb",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "3b5eed80727bcbc5113b8a9e4db1c81b1dddc2d99ff56d9c3c1054348913bde296311c4bd2fa899b4d0e66aaa1b6a0dd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "edge case for shared secret",
+          "public" : "049655d8e5622718b317cfbc09894357f75a6b13fa516bcd6630721b869a620196cf0c3dec8860b32d27ed9bac2cf263af17321698116d7d811ae8da9b9cbbf9382c1e36e2b67d6c6af9bcea7d9de00ca72b398606c098a0a0f0c4b8941943ed65",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "6a99a5acd4a7edb1c707d7f8be12e81140338e3e14ba563c703c681a319a3f9ce1f90f032bf840f3758e89cb852ceca6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "edge case for shared secret",
+          "public" : "04ccb13d427b3c4bb33dd4f20cddabc68600eaf97eeb2c81e8c218ae90743e74ff38ca56f0c0224379db464dcf4a40f04350cd7a659b2c4851a5dcf8c990fc920c07d4d5aa50a2185750e6b84c42e83cff635050482decb4780f812e4c49fc7404",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "7c25a4f57f76ab13b25cab3c265db9d9bd925fecbf7bf93bef1308778646628decab067ed988a9755cd88e88de367104",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "edge case for shared secret",
+          "public" : "042664624307c02ef487030a632162c515f841d15ea3152d98ff2364232d7aab39343d5f703a4d5a31092aa7356c3a2f671c1cd603addfd8b5477552a3b32a18edaf3e33bec22ee2167f9da729636002a7974eaeb5ff082b2aabf8c7056b84c3ab",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "7fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "edge case for shared secret",
+          "public" : "04665f1f320b6ab1c1b52d144e52d87a154c2b4489838c9119de622c2d1b52b65b0a3955e44e0d4859175360c0f63dee813f14f69972f18caed7916c94a4d20ec344591e7536a4a7a4d8c9832818c96d60b1a81fabe64ea02c5f647e361bf5b60f",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "edge case for shared secret",
+          "public" : "0491357ca87dbb08e85d7b1acecfd1e086078a82d19f81474da389364a39fe2543eb934b440173c38e61a1d9407855b5d89ef0d9e920764b6d7765b084cf9541dacc43d1dabaa390b0fb856097b0c00a8556f4e3848568ab4ae790c3d346ca01b6",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "fff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "edge case for shared secret",
+          "public" : "04d5a833bae33b2d10fdff6db7c5477adb614b191c70d97c6f130a14e93931cc1dc058053fee54a264a00fdd16d3166fdc42992276b79925bafcd183b03ed18235350980abfe67b814c6c11074c38f74cd4e734ad58cdb49d9fcd2181d1b8f1119",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "fffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "edge case for shared secret",
+          "public" : "0467547cda7fbe8f16be5a4477cbb02979f1af72fc0f39302773552fbcf4667a8e23abc0e12856ee6234deeca5f22ae0503a4df7c068e7432417260cb9fe0d68b9c7fcf7e16a2ada05687d8f8900b84723103edbff0a42b27517da2760b7d38843",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "ffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "edge case for shared secret",
+          "public" : "041363e3b99008e09bb3f085949b9b6ea26a318f496de568a96630fdb9d4c72c2814df3087a1741f32f24989b428167f93c653cb3ae8c3ecfaec57efd54bb8ce9d79c7bf6cc70fb1114f939be8f1a99bf1e42b97431124ef9fa33450faa4e76839",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "ffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff0000000000000100000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "edge case for shared secret",
+          "public" : "04ba2be8d7147e2417c2ec80b24b4c1aa94464ffd0aae1fa2e078b3afbc77c144489ca9d064acbb7a9cfa6196d0f467b7e65ee1ca1eb1351ff9968f553dfe2e4c59ff8ba34c22a42b3baa13a9a1adc7f13abd40f1fd25d46bc5330852b9371966a",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "edge case for shared secret",
+          "public" : "04d69850ccbacc4736ea200ff2f8488f26247945a2ab48dd3708f494b293d8cba83417f48974881c7fb03854089bbf66cc1c773ec03cb8cd5f007ec3b03bdd05a409b352103f0decf25b41673ab8ca3d04334babee01219f15701f2bca22d40b37",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : "046fcaf82d982d222d6096ba83e55b1c7dcb71a41e88f323333f44284d95c4bd3616da7a1bef928f31c26f885ba7adb487826fde2ed9f5649c11cf8465f8bf8ad50f68914936fc39666f68219d066506bea4001fdc816c9a90e7e2afb19bea085f",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "000000000000000000000000000000000000000000000000000000001f03123b00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : "046fcaf82d982d222d6096ba83e55b1c7dcb71a41e88f323333f44284d95c4bd3616da7a1bef928f31c26f885ba7adb4877d9021d1260a9b63ee307b9a0740752af0976eb6c903c6999097de62f99af9405bffe0227e93656f181d504f6415f7a0",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "000000000000000000000000000000000000000000000000000000001f03123b00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : "04bfeb47fb40a65878e6b642f40b8e15022ade9ecfa8cb618043063494e2bc5d2df10d36f37869b58ef12dcc35e3982835fd2e55ec41fdfe8cabbbb7bcd8163645a19e9dac59630f3fe93b208094ff87cd461b53cef53482e70e2e8ea87200cc3f",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "0000000000000000000000000000000000000000000000000000000036a2907c00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : "04bfeb47fb40a65878e6b642f40b8e15022ade9ecfa8cb618043063494e2bc5d2df10d36f37869b58ef12dcc35e398283502d1aa13be0201735444484327e9c9ba5e616253a69cf0c016c4df7f6b007831b9e4ac300acb7d18f1d171588dff33c0",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "0000000000000000000000000000000000000000000000000000000036a2907c00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003cf99ef04f51a5ea630ba3f9f960dd593a14c9be39fd2bd215d3b4b08aaaf86bbf927f2c46e52ab06fb742b8850e521e",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "6092a1757ddd43a04e185ff9472a0d18c7f7a7dc802f7e059e0c69ae16c802651719406e04de27652ff83da4a780ef2f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002732152442fb6ee5c3e6ce1d920c059bc623563814d79042b903ce60f1d4487fccd450a86da03f3e6ed525d02017bfdb3",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "89c804cb81443386b185bcd9e2e6c35ee6177c3b90298985c4e81a89d520cceb17d729540e56ecc343c26bf314f2d052",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036660041b1c7984620e8d7fd7ccdb50cc3ba816da14d41a4d8affaba8488867f0ca5a24f8d42dd7e44b530a27dc5b58da",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "35513157e804bd918d04de202778b81a6fc7ad8aa541ee94116a0f18466725d75e71c6942bf044b1b0ecba19db33e0de",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "040000000000000000ffffffffffffffff0000000000000000ffffffffffffffff00000000000000010000000000000001141b9ee5310ea8170131b604484a6d677ed42576045b7143c026710ae92b277afbbea0c4458c220d561e69404dc7d888",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "102080c047881d19aefb01c29c82a4fb328a8ea6e6d6c914af73100507c8ee499799aaa646de0ea8c2727c0b5ed2439b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "0400000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff70370385413d3eff6fa3407ba24f682c2b01b51445dbdf5ef7b0dd0979f17e713e09081571f1e94dfb66bf282002f39f",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "f689f6e475b4e15162521acab4637a3cdb9cb42aa92f9114b0ee300ddae89d5eafff3463a1f5004a2a1bd4aeffa47b78",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff112e191f1f78bbc54b6cc4f0b1e59ae8c6ff1a07f5128e41dfa2828e1b6538d4fa2ca2394c6aab3449dcb3fc4eb44c09",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "f3486244119b3632fd55be9e6951eb5d9c8c62f6a27042f94b924155ecfd4ff8744ba3d25bcf85a7b925bd28a12b897f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008000028a4c8da5a05112fe6025ef41908969de20d05d9668e5c852ef2d492172ddc2a0a622fc488164fcc1a076b872942af2",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "8171b7c80d4c90bb58ae54393921ab9c5c0b3196f045e9fe5c8b168f0e5f6a77e1aa34ecedc5481ce55ab34c14e0f2e8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "043b5eed80727bcbc5113b8a9e4db1c81b1dddc2d99ff56d9c3c1054348913bde296311c4bd2fa899b4d0e66aaa1b6a0dd7b7f0f28d55e2f3a50f1f1bef3976834a05b43418e979303bc0363ed16d2d0b4011cc37b3c06ad73154faeab7915cd87",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "1fe6fea5f00d3005abaae2267ff18e430915838d87909ab503885edf38be7618ecb321f0a4df71b0913fbf12c76fc1f0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "046a99a5acd4a7edb1c707d7f8be12e81140338e3e14ba563c703c681a319a3f9ce1f90f032bf840f3758e89cb852ceca63cf99ef04f51a5ea630ba3f9f960dd593a14c9be39fd2bd215d3b4b08aaaf86bbf927f2c46e52ab06fb742b8850e521e",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "f58adc13ff997d38383910db7befb17670393a33d95b049c2aa19d760c8e728ecedd32168476b90b26a3742dcc121b07",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "047c25a4f57f76ab13b25cab3c265db9d9bd925fecbf7bf93bef1308778646628decab067ed988a9755cd88e88de367104562ee0c57e71d96cefe31b4c4045bd4086a38e8ab9adf2d5567be318051d70f3aa68b753f271ab032b6abcce919e2962",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "56299684ec5ceb09ba4d94d1231005a826c9c08a5219c757e0136cbe8b6430badd4925172f2939891da7c7893850512f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "047fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff80000040000024480ab33cb4bf7cb79c024eeade3fd641e2f3003698400e8986a7343a5da59a3b26eea4b4176e53239371437d834a1a7",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "1911a0ee6aebe263fdcf3db073f2598cdafabec2123a2f24a28c3d9151c871f32d6dc2f31d25af9c498fd68da23e5bef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "048000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020797da4c0751ced16de80d16ab7c654a5dc27d092626d0865a192a1c5ea7c1b88c9fcab057946741e41cc28c80ec0b9a",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "15900643e2e0583976974b05f83c7a96611425f7c4a6eb51916ab958a037fd9cc172bdcfff4540a2ff3ce64e6505557e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04fff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff6c70898ae6fb31fa2f086562af2d10486ba4c6fd5e41dfe4aa61598b4707a3bc276a62feb1b98557e3b17c025f7adf4e",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "88a544a769d5c34a051416bd509dfac911863f604c83ea844bf0e4c5c272dec86d057a88b152a9274701938c705900c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04fffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff00000040000000eb1592858b6e6e3a199c0f3e7c5f0b4a92915936efb8bc0407680eb7274be7422156ce8cfc8b505b2d902c39992380f",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "b7db26b286e7527cb1f454782fe541862ff0f8d7eed960e22855deb7ac2a69611668c777c53bb74c2bcd40edfbf7944d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04ffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff4987abae412809c2fa48fd23b1bdf9e622f5a606c44117215ffa61b18ef46e54a7fbbf11f9a6ba59c991b4ae501fedce",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "b1e8aab1aa633d98dc6b768594e1e3edb801a9ef483f287c83e19744d2ad343ad3debdc4dc178213ad6876b52284f552",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04ffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000001000000000000013691fe493d4d28bf8ee1dfec812d6c306eae0842919eda6dc525f0d49ac2d26a992251912139a2936849f9d6fa949a68",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "b0de006f80f6f89e4eea6e46dfe305153005612d1e903171ec2886230971961b5202a9f3187bdac413ac24c836adf7a0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff615842aa06b06f78f0a66f7bea88d4b6ee59653eeaa00dc5e0a2b658f969b71af90c9b4e96bd3ca33846955bdccbd359",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "ca8cfa42c5e374914c14d6402b1a99208e47e02ec49818913694ea0822a2cc6c310259a8f3ab7559b9974bc4c2fa337e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe732152442fb6ee5c3e6ce1d920c059bc623563814d79042b903ce60f1d4487fccd450a86da03f3e6ed525d02017bfdb3",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "edf040bace18d90bf9ce720df2a3b31d76d95b7ed9530a159ac0b24e82a871033eada40552f9e606f7115e6a78927511",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04000000000000000000000000000000000000000000000000000000001f03123b0000000000000000000000000000000071bd1e700c34075c3cade8ce29d33724af68a7672b265a4e157055360440ab7c461b8e9ac8024e63a8b9c17c00000000",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "ea817dff44f1944a38444498f1b6c1a70a8b913aa326bc2acc5068805d8ddd7a5e41b8ee5b8371a1cf3f7a094258e3a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04000000000000000000000000000000000000000000000000000000001f03123b000000000000000000000000000000008e42e18ff3cbf8a3c3521731d62cc8db50975898d4d9a5b1ea8faac9fbbf5482b9e4716437fdb19c57463e84ffffffff",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "ea817dff44f1944a38444498f1b6c1a70a8b913aa326bc2acc5068805d8ddd7a5e41b8ee5b8371a1cf3f7a094258e3a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "040000000000000000000000000000000000000000000000000000000036a2907c00000000000000000000000000000000000000007f57b69a014783dbfa4967b2f9cfa678a6f0b6e9cfd41648cec5b3c498e72152da3f82d3da2e8e9f8ef37b11",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "bfa93e184f76279fd707d53ddcb3628855cfafb111bcbd0b4df6ef77aee624924d681626a153fa4e59c923b71fc090b3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "040000000000000000000000000000000000000000000000000000000036a2907c00000000000000000000000000000000ffffffff80a84965feb87c2405b6984d06305987590f4916302be9b7313a4c3a6718deac25c07d2c25d17161710c84ee",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "bfa93e184f76279fd707d53ddcb3628855cfafb111bcbd0b4df6ef77aee624924d681626a153fa4e59c923b71fc090b3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "edge case private key",
+          "public" : "04e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "3",
+          "shared" : "455aea9924330bd6d2d6403478327900e172e93598e254cf6d8eb13f0a3d21be51a46107333844e61dfa3d80df6928e9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "edge case private key",
+          "public" : "04e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "db1d8ef1117282870db8113aa4f58723c756ce598686eb8ea531aa4d39abb1b982b1e7bb2648a6c268d2d351204db8d5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "edge case private key",
+          "public" : "04e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "e98062df47ef884c9411e16466af84ad271d586008b1fbc50aeb3b36836a35a770dd42e0db84d39b26f4dcd2dc03d90b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "edge case private key",
+          "public" : "04e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "898aae0ebf1cb49fb6b1234d60f59006325421049a8a320820e1ad6af6593cdc2229a08c500aa55ca05999d12829db9c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "edge case private key",
+          "public" : "04e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "83f862f496ab8af12b82a8a0c047d836bdfa36281324b3a1eb2e9c1d46699d81cb125cbe4b93939fd84e1ae86d8a83cb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "edge case private key",
+          "public" : "04e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a779ecec196accc52973",
+          "shared" : "9a26894887a0342ca559a74a4d4a8e1d6b2084f02e1c65b3097121a9a9af047d8810fb945dc25bbf02222b3b625f1e0a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "edge case private key",
+          "public" : "04e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecdc196accc52973",
+          "shared" : "8a8d9dc194a26910cbdae7908d185b6ad04b620c94c5ee331e584ed804e495bebc2290a2d7006a06e65b9bcace86c6f6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "edge case private key",
+          "public" : "04e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aece4196accc52973",
+          "shared" : "d57f6aa12d3f07e8958499f249e52cfbe5be58482e146c5414dbbf984fc5333710350e2ce96b33beb7678381f40f1dcb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "edge case private key",
+          "public" : "04e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec1969ccc52973",
+          "shared" : "188e8041d9a5f0b6cfdad315ada4823beda0146774fad65b500e6ef94376ebf8af7a40ff6f6b45019a09dde7d7fb5552",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "edge case private key",
+          "public" : "04e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52959",
+          "shared" : "2ecf9dc47e8b07ae61ddbd1680ead02698e9e8469f78d5a28328e48d0c9d7a2ac787e50cba58cc44a32fb1235d2d7027",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 57,
+          "comment" : "edge case private key",
+          "public" : "04e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52969",
+          "shared" : "06ee9f55079d3d3c18c683ba33e0d2521be97c4fbf7917bf3b6287d58ffcde2df88842e3f5530b39549ac20974b1b60e",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 58,
+          "comment" : "edge case private key",
+          "public" : "04e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970",
+          "shared" : "455aea9924330bd6d2d6403478327900e172e93598e254cf6d8eb13f0a3d21be51a46107333844e61dfa3d80df6928e9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "edge case private key",
+          "public" : "04e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971",
+          "shared" : "024c5281487216058270cd1cfe259e948310e4adc263a9edaa4da0bc3f5f8ce8ffc88ae41b2c050bf6dd9c8c66857237",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 60,
+          "comment" : "point is not on curve",
+          "public" : "04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "point is not on curve",
+          "public" : "04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "point is not on curve",
+          "public" : "04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "point is not on curve",
+          "public" : "04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "point is not on curve",
+          "public" : "04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "point is not on curve",
+          "public" : "04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "point is not on curve",
+          "public" : "04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "point is not on curve",
+          "public" : "04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "point is not on curve",
+          "public" : "04fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "point is not on curve",
+          "public" : "04fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "point is not on curve",
+          "public" : "04fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "point is not on curve",
+          "public" : "04fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "point is not on curve",
+          "public" : "04fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "point is not on curve",
+          "public" : "04fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "point is not on curve",
+          "public" : "04fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "point is not on curve",
+          "public" : "04fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "",
+          "public" : "",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "invalid public key",
+          "public" : "024424530ea70bace90601f8d5869e4179a6cd689b6a18fdfec50cecf17cb836d24820211ada67815b42c2c2606303f69e",
+          "private" : "2b9e57572da6cf4fb58cb94eab8df19383a136f219f2a515776a8bf48e1538dd1d811946c16d9f0184c9ce5cdf1dac51",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdh_secp384r1_test.json b/third_party/wycheproof/testvectors/ecdh_secp384r1_test.json
new file mode 100644
index 0000000..b5c73a3
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdh_secp384r1_test.json
@@ -0,0 +1,3383 @@
+{
+  "algorithm" : "ECDH",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "AddSubChain" : "The private key has a special value. Implementations using addition subtraction chains for the point multiplication may get the point at infinity as an intermediate result. See CVE_2017_10176",
+    "CompressedPoint" : "The point in the public key is compressed. Not every library supports points in compressed format.",
+    "InvalidAsn" : "The public key in this test uses an invalid ASN encoding. Some cases where the ASN parser is not strictly checking the ASN format are benign as long as the ECDH computation still returns the correct shared value.",
+    "InvalidPublic" : "The public key has been modified and is invalid. An implementation should always check whether the public key is valid and on the same curve as the private key. The test vector includes the shared secret computed with the original public key if the public point is on the curve of the private key. Generating a shared secret other than the one with the original key likely indicates that the bug is exploitable.",
+    "ModifiedPrime" : "The modulus of the public key has been modified. The public point of the public key has been chosen so that it is both a point on both the curve of the modified public key and the private key.",
+    "UnnamedCurve" : "The public key does not use a named curve. RFC 3279 allows to encode such curves by explicitly encoding, the parameters of the curve equation, modulus, generator, order and cofactor. However, many crypto libraries only support named curves. Modifying some of the EC parameters and encoding the corresponding public key as an unnamed curve is a potential attack vector.",
+    "UnusedParam" : "A parameter that is typically not used for ECDH has been modified. Sometimes libraries ignore small differences between public and private key. For example, a library might ignore an incorrect cofactor in the public key. We consider ignoring such changes as acceptable as long as these differences do not change the outcome of the ECDH computation, i.e. as long as the computation is done on the curve from the private key.",
+    "WeakPublicKey" : "The vector contains a weak public key. The curve is not a named curve, the public key point has order 3 and has been chosen to be on the same curve as the private key. This test vector is used to check ECC implementations for missing steps in the verification of the public key.",
+    "WrongOrder" : "The order of the public key has been modified. If this order is used in a cryptographic primitive instead of the correct order then private keys may leak. E.g. ECDHC in BC 1.52 suffered from this."
+  },
+  "numberOfTests" : 319,
+  "header" : [],
+  "testGroups" : [
+    {
+      "curve" : "secp384r1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "normal case",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004790a6e059ef9a5940163183d4a7809135d29791643fc43a2f17ee8bf677ab84f791b64a6be15969ffa012dd9185d8796d9b954baa8a75e82df711b3b56eadff6b0f668c3b26b4b1aeb308a1fcc1c680d329a6705025f1c98a0b5e5bfcb163caa",
+          "private" : "766e61425b2da9f846c09fc3564b93a6f8603b7392c785165bf20da948c49fd1fb1dee4edd64356b9f21c588b75dfd81",
+          "shared" : "6461defb95d996b24296f5a1832b34db05ed031114fbe7d98d098f93859866e4de1e229da71fef0c77fe49b249190135",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "compressed public key",
+          "public" : "3046301006072a8648ce3d020106052b8104002203320002790a6e059ef9a5940163183d4a7809135d29791643fc43a2f17ee8bf677ab84f791b64a6be15969ffa012dd9185d8796",
+          "private" : "766e61425b2da9f846c09fc3564b93a6f8603b7392c785165bf20da948c49fd1fb1dee4edd64356b9f21c588b75dfd81",
+          "shared" : "6461defb95d996b24296f5a1832b34db05ed031114fbe7d98d098f93859866e4de1e229da71fef0c77fe49b249190135",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004490e96d17f4c6ceccd45def408cea33e9704a5f1b01a3de2eaaa3409fd160d78d395d6b3b003d71fd1f590fad95bf1c9d8665efc2070d059aa847125c2f707435955535c7c5df6d6c079ec806dce6b6849d337140db7ca50616f9456de1323c4",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200040161328909675213e32098d35a6b8308a8d500cca39dcee5e804e73bdb8deaf06fe417291fd9793b231ef5fe86945444a97a01f3ae3a8310c4af49b592cb291ef70ee5bc7f5534d3c23dc9eefde2304842c7737ae937ccf9bd215c28103e9fe2",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004af4ae964e3bcbd923accda5da3175d411fd62d17dd3c3a1c410bef1730985a6265d90e950ac0fc50743b1ed771906ff33b68cf4d3d83a885a87097fdd329ce83b189f98cec5be44c31d1a3a2bba10f471963232b8ba7610fa8c72179050eb86d",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200041478ab6e032b9545eda9ac2c264e57a11f08acbc76d16a0ab77b04dbdaf20f215c4183437b32afc471eaa603d14c7c5d8a4c84ee0e895bec5c37f0a1ca075e106ff6bf38801b5c697409d39675231108d33c4a5ea65aaa8c03e939c95d96c4c4",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff00000000000000010000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004f63208e34e7e90bb5fb036432467a89981444010663b8533b47bfa94bd2bc16f38aa516b930a4726e3876d3091bfb72ec783ed4da0cac06320817dc8bc64f59ccf06f48abc4386a150913fa95743a7b4601190e1c6ee8f8bf6354b254ecace45",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004033271ef42d92ad47b273b09ea2f45401161baa52696590d0e175ff2d1c0dfa3fea40e4266d446546c05e480d57fabec7889f16a8bcc176602f6d46561614a2f4284abe697b7cb9ce79f7e2e71b155cb1f155ce925d16391a680eda23152e6e1",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004737e8437e18683de2455b68945bba31daec3e754d72f0a0776d3192b2f9298bb95ca1464baa6687aabb679f804cf6ec6c2b4d47d61a60404df63b1e9ac0954b3419bbc2ad52a0409aeeb82f4703758588059165b20367dcb4b235b0caf71d727",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b810400220362000437f9004983156bbd9c47891e75237bb13016bd7fe6f4e0f71cef0e63f16a672f0d3b0e20165c33407e146b6a4ae6962dd3b57ccb99e7aaf1303240516d0ebe08e585513e3695d42c467dcab5340ef761990cadc8d8840aacc944481415c07feb",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "3b5eed80727bcbc5113b8a9e4db1c81b1dddc2d99ff56d9c3c1054348913bde296311c4bd2fa899b4d0e66aaa1b6a0dd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200049655d8e5622718b317cfbc09894357f75a6b13fa516bcd6630721b869a620196cf0c3dec8860b32d27ed9bac2cf263af17321698116d7d811ae8da9b9cbbf9382c1e36e2b67d6c6af9bcea7d9de00ca72b398606c098a0a0f0c4b8941943ed65",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "6a99a5acd4a7edb1c707d7f8be12e81140338e3e14ba563c703c681a319a3f9ce1f90f032bf840f3758e89cb852ceca6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004ccb13d427b3c4bb33dd4f20cddabc68600eaf97eeb2c81e8c218ae90743e74ff38ca56f0c0224379db464dcf4a40f04350cd7a659b2c4851a5dcf8c990fc920c07d4d5aa50a2185750e6b84c42e83cff635050482decb4780f812e4c49fc7404",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "7c25a4f57f76ab13b25cab3c265db9d9bd925fecbf7bf93bef1308778646628decab067ed988a9755cd88e88de367104",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200042664624307c02ef487030a632162c515f841d15ea3152d98ff2364232d7aab39343d5f703a4d5a31092aa7356c3a2f671c1cd603addfd8b5477552a3b32a18edaf3e33bec22ee2167f9da729636002a7974eaeb5ff082b2aabf8c7056b84c3ab",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "7fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004665f1f320b6ab1c1b52d144e52d87a154c2b4489838c9119de622c2d1b52b65b0a3955e44e0d4859175360c0f63dee813f14f69972f18caed7916c94a4d20ec344591e7536a4a7a4d8c9832818c96d60b1a81fabe64ea02c5f647e361bf5b60f",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b810400220362000491357ca87dbb08e85d7b1acecfd1e086078a82d19f81474da389364a39fe2543eb934b440173c38e61a1d9407855b5d89ef0d9e920764b6d7765b084cf9541dacc43d1dabaa390b0fb856097b0c00a8556f4e3848568ab4ae790c3d346ca01b6",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "fff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004d5a833bae33b2d10fdff6db7c5477adb614b191c70d97c6f130a14e93931cc1dc058053fee54a264a00fdd16d3166fdc42992276b79925bafcd183b03ed18235350980abfe67b814c6c11074c38f74cd4e734ad58cdb49d9fcd2181d1b8f1119",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "fffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b810400220362000467547cda7fbe8f16be5a4477cbb02979f1af72fc0f39302773552fbcf4667a8e23abc0e12856ee6234deeca5f22ae0503a4df7c068e7432417260cb9fe0d68b9c7fcf7e16a2ada05687d8f8900b84723103edbff0a42b27517da2760b7d38843",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "ffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200041363e3b99008e09bb3f085949b9b6ea26a318f496de568a96630fdb9d4c72c2814df3087a1741f32f24989b428167f93c653cb3ae8c3ecfaec57efd54bb8ce9d79c7bf6cc70fb1114f939be8f1a99bf1e42b97431124ef9fa33450faa4e76839",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "ffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff0000000000000100000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004ba2be8d7147e2417c2ec80b24b4c1aa94464ffd0aae1fa2e078b3afbc77c144489ca9d064acbb7a9cfa6196d0f467b7e65ee1ca1eb1351ff9968f553dfe2e4c59ff8ba34c22a42b3baa13a9a1adc7f13abd40f1fd25d46bc5330852b9371966a",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004d69850ccbacc4736ea200ff2f8488f26247945a2ab48dd3708f494b293d8cba83417f48974881c7fb03854089bbf66cc1c773ec03cb8cd5f007ec3b03bdd05a409b352103f0decf25b41673ab8ca3d04334babee01219f15701f2bca22d40b37",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200046fcaf82d982d222d6096ba83e55b1c7dcb71a41e88f323333f44284d95c4bd3616da7a1bef928f31c26f885ba7adb487826fde2ed9f5649c11cf8465f8bf8ad50f68914936fc39666f68219d066506bea4001fdc816c9a90e7e2afb19bea085f",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "000000000000000000000000000000000000000000000000000000001f03123b00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200046fcaf82d982d222d6096ba83e55b1c7dcb71a41e88f323333f44284d95c4bd3616da7a1bef928f31c26f885ba7adb4877d9021d1260a9b63ee307b9a0740752af0976eb6c903c6999097de62f99af9405bffe0227e93656f181d504f6415f7a0",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "000000000000000000000000000000000000000000000000000000001f03123b00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004bfeb47fb40a65878e6b642f40b8e15022ade9ecfa8cb618043063494e2bc5d2df10d36f37869b58ef12dcc35e3982835fd2e55ec41fdfe8cabbbb7bcd8163645a19e9dac59630f3fe93b208094ff87cd461b53cef53482e70e2e8ea87200cc3f",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "0000000000000000000000000000000000000000000000000000000036a2907c00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004bfeb47fb40a65878e6b642f40b8e15022ade9ecfa8cb618043063494e2bc5d2df10d36f37869b58ef12dcc35e398283502d1aa13be0201735444484327e9c9ba5e616253a69cf0c016c4df7f6b007831b9e4ac300acb7d18f1d171588dff33c0",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "0000000000000000000000000000000000000000000000000000000036a2907c00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003cf99ef04f51a5ea630ba3f9f960dd593a14c9be39fd2bd215d3b4b08aaaf86bbf927f2c46e52ab06fb742b8850e521e",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "6092a1757ddd43a04e185ff9472a0d18c7f7a7dc802f7e059e0c69ae16c802651719406e04de27652ff83da4a780ef2f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002732152442fb6ee5c3e6ce1d920c059bc623563814d79042b903ce60f1d4487fccd450a86da03f3e6ed525d02017bfdb3",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "89c804cb81443386b185bcd9e2e6c35ee6177c3b90298985c4e81a89d520cceb17d729540e56ecc343c26bf314f2d052",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036660041b1c7984620e8d7fd7ccdb50cc3ba816da14d41a4d8affaba8488867f0ca5a24f8d42dd7e44b530a27dc5b58da",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "35513157e804bd918d04de202778b81a6fc7ad8aa541ee94116a0f18466725d75e71c6942bf044b1b0ecba19db33e0de",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200040000000000000000ffffffffffffffff0000000000000000ffffffffffffffff00000000000000010000000000000001141b9ee5310ea8170131b604484a6d677ed42576045b7143c026710ae92b277afbbea0c4458c220d561e69404dc7d888",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "102080c047881d19aefb01c29c82a4fb328a8ea6e6d6c914af73100507c8ee499799aaa646de0ea8c2727c0b5ed2439b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b810400220362000400000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff70370385413d3eff6fa3407ba24f682c2b01b51445dbdf5ef7b0dd0979f17e713e09081571f1e94dfb66bf282002f39f",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "f689f6e475b4e15162521acab4637a3cdb9cb42aa92f9114b0ee300ddae89d5eafff3463a1f5004a2a1bd4aeffa47b78",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff112e191f1f78bbc54b6cc4f0b1e59ae8c6ff1a07f5128e41dfa2828e1b6538d4fa2ca2394c6aab3449dcb3fc4eb44c09",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "f3486244119b3632fd55be9e6951eb5d9c8c62f6a27042f94b924155ecfd4ff8744ba3d25bcf85a7b925bd28a12b897f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008000028a4c8da5a05112fe6025ef41908969de20d05d9668e5c852ef2d492172ddc2a0a622fc488164fcc1a076b872942af2",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "8171b7c80d4c90bb58ae54393921ab9c5c0b3196f045e9fe5c8b168f0e5f6a77e1aa34ecedc5481ce55ab34c14e0f2e8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200043b5eed80727bcbc5113b8a9e4db1c81b1dddc2d99ff56d9c3c1054348913bde296311c4bd2fa899b4d0e66aaa1b6a0dd7b7f0f28d55e2f3a50f1f1bef3976834a05b43418e979303bc0363ed16d2d0b4011cc37b3c06ad73154faeab7915cd87",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "1fe6fea5f00d3005abaae2267ff18e430915838d87909ab503885edf38be7618ecb321f0a4df71b0913fbf12c76fc1f0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200046a99a5acd4a7edb1c707d7f8be12e81140338e3e14ba563c703c681a319a3f9ce1f90f032bf840f3758e89cb852ceca63cf99ef04f51a5ea630ba3f9f960dd593a14c9be39fd2bd215d3b4b08aaaf86bbf927f2c46e52ab06fb742b8850e521e",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "f58adc13ff997d38383910db7befb17670393a33d95b049c2aa19d760c8e728ecedd32168476b90b26a3742dcc121b07",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200047c25a4f57f76ab13b25cab3c265db9d9bd925fecbf7bf93bef1308778646628decab067ed988a9755cd88e88de367104562ee0c57e71d96cefe31b4c4045bd4086a38e8ab9adf2d5567be318051d70f3aa68b753f271ab032b6abcce919e2962",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "56299684ec5ceb09ba4d94d1231005a826c9c08a5219c757e0136cbe8b6430badd4925172f2939891da7c7893850512f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200047fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff80000040000024480ab33cb4bf7cb79c024eeade3fd641e2f3003698400e8986a7343a5da59a3b26eea4b4176e53239371437d834a1a7",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "1911a0ee6aebe263fdcf3db073f2598cdafabec2123a2f24a28c3d9151c871f32d6dc2f31d25af9c498fd68da23e5bef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200048000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020797da4c0751ced16de80d16ab7c654a5dc27d092626d0865a192a1c5ea7c1b88c9fcab057946741e41cc28c80ec0b9a",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "15900643e2e0583976974b05f83c7a96611425f7c4a6eb51916ab958a037fd9cc172bdcfff4540a2ff3ce64e6505557e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff6c70898ae6fb31fa2f086562af2d10486ba4c6fd5e41dfe4aa61598b4707a3bc276a62feb1b98557e3b17c025f7adf4e",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "88a544a769d5c34a051416bd509dfac911863f604c83ea844bf0e4c5c272dec86d057a88b152a9274701938c705900c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff00000040000000eb1592858b6e6e3a199c0f3e7c5f0b4a92915936efb8bc0407680eb7274be7422156ce8cfc8b505b2d902c39992380f",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "b7db26b286e7527cb1f454782fe541862ff0f8d7eed960e22855deb7ac2a69611668c777c53bb74c2bcd40edfbf7944d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004ffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff4987abae412809c2fa48fd23b1bdf9e622f5a606c44117215ffa61b18ef46e54a7fbbf11f9a6ba59c991b4ae501fedce",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "b1e8aab1aa633d98dc6b768594e1e3edb801a9ef483f287c83e19744d2ad343ad3debdc4dc178213ad6876b52284f552",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004ffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000001000000000000013691fe493d4d28bf8ee1dfec812d6c306eae0842919eda6dc525f0d49ac2d26a992251912139a2936849f9d6fa949a68",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "b0de006f80f6f89e4eea6e46dfe305153005612d1e903171ec2886230971961b5202a9f3187bdac413ac24c836adf7a0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff615842aa06b06f78f0a66f7bea88d4b6ee59653eeaa00dc5e0a2b658f969b71af90c9b4e96bd3ca33846955bdccbd359",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "ca8cfa42c5e374914c14d6402b1a99208e47e02ec49818913694ea0822a2cc6c310259a8f3ab7559b9974bc4c2fa337e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe732152442fb6ee5c3e6ce1d920c059bc623563814d79042b903ce60f1d4487fccd450a86da03f3e6ed525d02017bfdb3",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "edf040bace18d90bf9ce720df2a3b31d76d95b7ed9530a159ac0b24e82a871033eada40552f9e606f7115e6a78927511",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000001f03123b0000000000000000000000000000000071bd1e700c34075c3cade8ce29d33724af68a7672b265a4e157055360440ab7c461b8e9ac8024e63a8b9c17c00000000",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "ea817dff44f1944a38444498f1b6c1a70a8b913aa326bc2acc5068805d8ddd7a5e41b8ee5b8371a1cf3f7a094258e3a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000001f03123b000000000000000000000000000000008e42e18ff3cbf8a3c3521731d62cc8db50975898d4d9a5b1ea8faac9fbbf5482b9e4716437fdb19c57463e84ffffffff",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "ea817dff44f1944a38444498f1b6c1a70a8b913aa326bc2acc5068805d8ddd7a5e41b8ee5b8371a1cf3f7a094258e3a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200040000000000000000000000000000000000000000000000000000000036a2907c00000000000000000000000000000000000000007f57b69a014783dbfa4967b2f9cfa678a6f0b6e9cfd41648cec5b3c498e72152da3f82d3da2e8e9f8ef37b11",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "bfa93e184f76279fd707d53ddcb3628855cfafb111bcbd0b4df6ef77aee624924d681626a153fa4e59c923b71fc090b3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200040000000000000000000000000000000000000000000000000000000036a2907c00000000000000000000000000000000ffffffff80a84965feb87c2405b6984d06305987590f4916302be9b7313a4c3a6718deac25c07d2c25d17161710c84ee",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "bfa93e184f76279fd707d53ddcb3628855cfafb111bcbd0b4df6ef77aee624924d681626a153fa4e59c923b71fc090b3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "3",
+          "shared" : "455aea9924330bd6d2d6403478327900e172e93598e254cf6d8eb13f0a3d21be51a46107333844e61dfa3d80df6928e9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "db1d8ef1117282870db8113aa4f58723c756ce598686eb8ea531aa4d39abb1b982b1e7bb2648a6c268d2d351204db8d5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "e98062df47ef884c9411e16466af84ad271d586008b1fbc50aeb3b36836a35a770dd42e0db84d39b26f4dcd2dc03d90b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "898aae0ebf1cb49fb6b1234d60f59006325421049a8a320820e1ad6af6593cdc2229a08c500aa55ca05999d12829db9c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "83f862f496ab8af12b82a8a0c047d836bdfa36281324b3a1eb2e9c1d46699d81cb125cbe4b93939fd84e1ae86d8a83cb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a779ecec196accc52973",
+          "shared" : "9a26894887a0342ca559a74a4d4a8e1d6b2084f02e1c65b3097121a9a9af047d8810fb945dc25bbf02222b3b625f1e0a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecdc196accc52973",
+          "shared" : "8a8d9dc194a26910cbdae7908d185b6ad04b620c94c5ee331e584ed804e495bebc2290a2d7006a06e65b9bcace86c6f6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aece4196accc52973",
+          "shared" : "d57f6aa12d3f07e8958499f249e52cfbe5be58482e146c5414dbbf984fc5333710350e2ce96b33beb7678381f40f1dcb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec1969ccc52973",
+          "shared" : "188e8041d9a5f0b6cfdad315ada4823beda0146774fad65b500e6ef94376ebf8af7a40ff6f6b45019a09dde7d7fb5552",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52959",
+          "shared" : "2ecf9dc47e8b07ae61ddbd1680ead02698e9e8469f78d5a28328e48d0c9d7a2ac787e50cba58cc44a32fb1235d2d7027",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 57,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52969",
+          "shared" : "06ee9f55079d3d3c18c683ba33e0d2521be97c4fbf7917bf3b6287d58ffcde2df88842e3f5530b39549ac20974b1b60e",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 58,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970",
+          "shared" : "455aea9924330bd6d2d6403478327900e172e93598e254cf6d8eb13f0a3d21be51a46107333844e61dfa3d80df6928e9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971",
+          "shared" : "024c5281487216058270cd1cfe259e948310e4adc263a9edaa4da0bc3f5f8ce8ffc88ae41b2c050bf6dd9c8c66857237",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 60,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "",
+          "public" : "3015301006072a8648ce3d020106052b81040022030100",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "public point not on curve",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c8",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 78,
+          "comment" : "public point = (0,0)",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 79,
+          "comment" : "order = -39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942643",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f0231ff000000000000000000000000000000000000000000000000389cb27e0bc8d220a7e5f24db74f58851313e695333ad68d020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 80,
+          "comment" : "order = 0",
+          "public" : "308201853082011d06072a8648ce3d020130820110020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f020100020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 81,
+          "comment" : "order = 1",
+          "public" : "308201853082011d06072a8648ce3d020130820110020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f020101020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 82,
+          "comment" : "order = 9173994463960286046443283581208347763186259956673124494950032159599396260248791326163093631191247821216106",
+          "public" : "308201b13082014906072a8648ce3d02013082013c020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f022d00ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196a020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 83,
+          "comment" : "generator = (0,0)",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 84,
+          "comment" : "generator not on curve",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e61023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 85,
+          "comment" : "cofactor = -1",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529730201ff036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 86,
+          "comment" : "cofactor = 0",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020100036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 87,
+          "comment" : "cofactor = 2",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020102036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 88,
+          "comment" : "cofactor = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942643",
+          "public" : "308201e53082017d06072a8648ce3d020130820170020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 89,
+          "comment" : "cofactor = None",
+          "public" : "308201b23082014a06072a8648ce3d02013082013d020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 90,
+          "comment" : "modified prime",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100f47e533e4e43e4bf04e901db0eea6efba14bbcdc3b1c5753a7c141487e4f43784e57a72310202323361f44760c8368bf306404300b81acc1b1bc1b40fb16fe24f11591045eb44323c4e3a8ac583ebeb781b0bc86b1a858dbefdfdcdcc9e0bb8af37c973d0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef04610400000000000000000000000000000000fffffffffffd38000000000000000000000000000000000000000000000001cf3646298bba2f24e84189cf0d1e75188fc4fcf5b0844281822e789e3d534b159f4c419342260197625ad924a2c72c4d0f023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529730201010362000400000000000000000000000000000000fffffffffffd38000000000000000000000000000000000000000000000001cf3646298bba2f24e84189cf0d1e75188fc4fcf5b0844281822e789e3d534b159f4c419342260197625ad924a2c72c4d0f",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "5df0762488bc0a7be1121508949382861f781c331676048c2d45d245be6f476c872113e6710bc746c3d06970510193ce",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 91,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 92,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 93,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 94,
+          "comment" : "a = 0",
+          "public" : "308201863082011e06072a8648ce3d020130820111020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff303504010004304fcc45ccf5e23ee407b9291d2e85523962a2a79a50da3facca04b7267ad316db202cb07c24905740d201ded3028881090461042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 95,
+          "comment" : "public key of order 3",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430d5d9a63564e6f51f051c1d8272d6d7b0c005f95ec949ab25c202e3392111ae93bac9c835802fa5ac20d1656d35a333fc0430b1fe2e222bf5a03e2e8a676a529a5583237dc76b25d747b9dc4c51159d51bef52456c83b927c64da7512aca99605480b04610471acb2a68e98de42473717a8873eb556e8a26237207605f16b96ff6511717f5b9e5d039fbb093c5e2c27af63c20cff3545867f2c325566f298770d2da6cc39f81e6ee5fb8c383e91771f962e5a60a63350d72793359f61f2da9493989eaa29a5023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529730201010362000471acb2a68e98de42473717a8873eb556e8a26237207605f16b96ff6511717f5b9e5d039fbb093c5e2c27af63c20cff35ba7980d3cdaa990d6788f2d25933c607e1911a0473c7c16e88e069d1a59f59cbaf28d86bca609e0d256b6c686155d65a",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "dca6f0f2efbc90881cbbcf53d09634e8af0909384113f236165d1c05cbda054394312114317b87d251cc176db3e3dcb6",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 96,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00040710b0c6f4675459f3df2bdf7ca02819f8086198d15c69b8abda37639e6031caca8a0121894d2491d8b3dce093703c70705bc5dbc8fa17c8",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045fa4fa0b235c21e5c9f3baea9303bf86eccb7d31d0b998e141bc54b5dc43b23eef7fc5cf56308ed595eee99ade6aaf74d591c3d00aa1b438abc59c9607c22c36",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004005bce61fe27c440fedbad47d88bccf645db9c1d30daa086e592e8b6a0a173b87991b619801907b420fa558c7953ab97badd9c6c1d85859d9ebef7441a088ff57ed5008d7638de703faabeb5a78e83e8fcd4eb786144a75d79bd4cc8cfa8be66612d756c7b65c67f72c6acbade6f0d59e9752e845205b2a560d4f8d6a9e84bf812f94d18",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a69ced11a8bf7a907bfa47cba3368f2498b465a2407c90649c8da224d2a85bf445ad2df3d0113e72aedccf92ba6b8529ed6faa154bc27aba25f49371981e3b38",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004a9b0f90e49a57fbe508847bf16e4a7b565dfe870a50164bc2862fe6e4d54bd8b109939f7dbbf800522722b9c0b309ace3884abb69c927ad0",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004512fe17172db1125a49f9dbb85e387869adf015e4899c06f66ef870d72092d4d195e1d21b4a4647bf734468bee802ddad5449202eba1041df2fd8cde04697237",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004c391dc7a817d47a3961ea1857895e101c0f5a8767d3a9c7cad49f7af8029f24c67309373cedd0831ccc0a0f45d344f3ab5923d2452507a980301a283848ae31574a57db51ce5e61d35aee483f1bb8e66",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000419d3c811c04c5c0990d0258386195b2e29fdaba58d3f12b0bac8d3d53828c66c7a35e3d1eb0bdf2c08f23d0e4ab6a3246e456bf0fb863d03423dbe431baf799657c7816a619662fe5b900b754107ba5cc06b1d62c9a927891efee1a1fd404d7e",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004216eb619457f1168ac873f5b560a75df80749f2bdf9abac31d6580e521ad70368013c3db74f663263b61eb12d4dcd597ad6c77cef6a5d6d2240b1e244d76403f693fb317ffc602a7ac313991b0a62f7bf469bbc95b3ff35003d972eb8ebcc8d4833e6c24ad52d49c1ce6244c7889ab67a8818232e192944542763fc667e5799d",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004691b24004380a599770214d0c60ab37cfc804cfaa7aedd11cbf0a05467ebec5e33322cda707b848086fd740244f62cdeb867fc057207fde2",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000422bf69f3a81dfa1ed8a97301943626e20377b78f7e7d714b880deb5a4a9c63a11591c2e47b777488990771855768b9a4050d61bf02d84cc6aa40447a07507285",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a0352000476568300e2b4c68861589b4966e67bc414811e4011260cb8be5f884869fa179ca8af40f80009e0a58b17ac3e551a772e76683c32e6e09112572542d7c1fe3d49abb56da56d669186e2623dc797129dc0",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200043345dffded3c33f7dcc19bb8997a39f2d6230abcb765d6142c30bf320c1fadff535feafd8505eb3e614db71826c1e258077a1e6057add7474f6d35dce68417812e7b919b1c673032b28c45d0a9251c43a2a73ab152f64ff8eba4eab312fa73bd",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004a3677c646cd887685940c28076f55cda7469032845f2cb2af51c61492dc435aaa5b771d8e1528417cdeb89b5f629e06b234e21236b9edf46c7025177ee65a8e940f670d10c722cea355bd3a5c8847a38324b9a06a50a95da4e70bb492cd00194a8830975dd1e115e19315575ff841b30fd4a3f8a44725dfe280d0af57fc80cc3",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "invalid public key",
+          "public" : "3046301006072a8648ce3d020106052b81040022033200024424530ea70bace90601f8d5869e4179a6cd689b6a18fdfec50cecf17cb836d24820211ada67815b42c2c2606303f69e",
+          "private" : "2b9e57572da6cf4fb58cb94eab8df19383a136f219f2a515776a8bf48e1538dd1d811946c16d9f0184c9ce5cdf1dac51",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 111,
+          "comment" : "long form encoding of length",
+          "public" : "308176301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 112,
+          "comment" : "long form encoding of length",
+          "public" : "307730811006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 113,
+          "comment" : "long form encoding of length",
+          "public" : "307730110681072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 114,
+          "comment" : "long form encoding of length",
+          "public" : "3077301106072a8648ce3d02010681052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 115,
+          "comment" : "long form encoding of length",
+          "public" : "3077301006072a8648ce3d020106052b810400220381620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 116,
+          "comment" : "length contains leading 0",
+          "public" : "30820076301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 117,
+          "comment" : "length contains leading 0",
+          "public" : "30783082001006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 118,
+          "comment" : "length contains leading 0",
+          "public" : "30783012068200072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 119,
+          "comment" : "length contains leading 0",
+          "public" : "3078301206072a8648ce3d0201068200052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 120,
+          "comment" : "length contains leading 0",
+          "public" : "3078301006072a8648ce3d020106052b81040022038200620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 121,
+          "comment" : "wrong length",
+          "public" : "3077301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 122,
+          "comment" : "wrong length",
+          "public" : "3075301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 123,
+          "comment" : "wrong length",
+          "public" : "3076301106072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 124,
+          "comment" : "wrong length",
+          "public" : "3076300f06072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 125,
+          "comment" : "wrong length",
+          "public" : "3076301006082a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 126,
+          "comment" : "wrong length",
+          "public" : "3076301006062a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 127,
+          "comment" : "wrong length",
+          "public" : "3076301006072a8648ce3d020106062b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 128,
+          "comment" : "wrong length",
+          "public" : "3076301006072a8648ce3d020106042b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 129,
+          "comment" : "wrong length",
+          "public" : "3076301006072a8648ce3d020106052b8104002203630004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 130,
+          "comment" : "wrong length",
+          "public" : "3076301006072a8648ce3d020106052b8104002203610004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 131,
+          "comment" : "uint32 overflow in length",
+          "public" : "30850100000076301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 132,
+          "comment" : "uint32 overflow in length",
+          "public" : "307b3085010000001006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 133,
+          "comment" : "uint32 overflow in length",
+          "public" : "307b3015068501000000072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 134,
+          "comment" : "uint32 overflow in length",
+          "public" : "307b301506072a8648ce3d0201068501000000052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 135,
+          "comment" : "uint32 overflow in length",
+          "public" : "307b301006072a8648ce3d020106052b81040022038501000000620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 136,
+          "comment" : "uint64 overflow in length",
+          "public" : "3089010000000000000076301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 137,
+          "comment" : "uint64 overflow in length",
+          "public" : "307f308901000000000000001006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 138,
+          "comment" : "uint64 overflow in length",
+          "public" : "307f301906890100000000000000072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 139,
+          "comment" : "uint64 overflow in length",
+          "public" : "307f301906072a8648ce3d020106890100000000000000052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 140,
+          "comment" : "uint64 overflow in length",
+          "public" : "307f301006072a8648ce3d020106052b8104002203890100000000000000620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 141,
+          "comment" : "length = 2**31 - 1",
+          "public" : "30847fffffff301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 142,
+          "comment" : "length = 2**31 - 1",
+          "public" : "307a30847fffffff06072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 143,
+          "comment" : "length = 2**31 - 1",
+          "public" : "307a301406847fffffff2a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 144,
+          "comment" : "length = 2**31 - 1",
+          "public" : "307a301406072a8648ce3d020106847fffffff2b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "length = 2**31 - 1",
+          "public" : "307a301006072a8648ce3d020106052b8104002203847fffffff0004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "length = 2**32 - 1",
+          "public" : "3084ffffffff301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "length = 2**32 - 1",
+          "public" : "307a3084ffffffff06072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "length = 2**32 - 1",
+          "public" : "307a30140684ffffffff2a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "length = 2**32 - 1",
+          "public" : "307a301406072a8648ce3d02010684ffffffff2b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "length = 2**32 - 1",
+          "public" : "307a301006072a8648ce3d020106052b810400220384ffffffff0004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "length = 2**40 - 1",
+          "public" : "3085ffffffffff301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "length = 2**40 - 1",
+          "public" : "307b3085ffffffffff06072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "length = 2**40 - 1",
+          "public" : "307b30150685ffffffffff2a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "length = 2**40 - 1",
+          "public" : "307b301506072a8648ce3d02010685ffffffffff2b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "length = 2**40 - 1",
+          "public" : "307b301006072a8648ce3d020106052b810400220385ffffffffff0004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3088ffffffffffffffff301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "length = 2**64 - 1",
+          "public" : "307e3088ffffffffffffffff06072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "length = 2**64 - 1",
+          "public" : "307e30180688ffffffffffffffff2a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "length = 2**64 - 1",
+          "public" : "307e301806072a8648ce3d02010688ffffffffffffffff2b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "length = 2**64 - 1",
+          "public" : "307e301006072a8648ce3d020106052b810400220388ffffffffffffffff0004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "incorrect length",
+          "public" : "30ff301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "incorrect length",
+          "public" : "307630ff06072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "incorrect length",
+          "public" : "3076301006ff2a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "incorrect length",
+          "public" : "3076301006072a8648ce3d020106ff2b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "incorrect length",
+          "public" : "3076301006072a8648ce3d020106052b8104002203ff0004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "indefinite length without termination",
+          "public" : "3080301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "indefinite length without termination",
+          "public" : "3076308006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "indefinite length without termination",
+          "public" : "3076301006802a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "indefinite length without termination",
+          "public" : "3076301006072a8648ce3d020106802b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "indefinite length without termination",
+          "public" : "3076301006072a8648ce3d020106052b8104002203800004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "removing sequence",
+          "public" : "",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "removing sequence",
+          "public" : "306403620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "lonely sequence tag",
+          "public" : "30",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "lonely sequence tag",
+          "public" : "30653003620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "appending 0's to sequence",
+          "public" : "3078301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed0312510000",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "appending 0's to sequence",
+          "public" : "3078301206072a8648ce3d020106052b81040022000003620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "prepending 0's to sequence",
+          "public" : "30780000301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "prepending 0's to sequence",
+          "public" : "30783012000006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "appending unused 0's to sequence",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed0312510000",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "appending unused 0's to sequence",
+          "public" : "3078301006072a8648ce3d020106052b81040022000003620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "appending null value to sequence",
+          "public" : "3078301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed0312510500",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "appending null value to sequence",
+          "public" : "3078301206072a8648ce3d020106052b81040022050003620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "including garbage",
+          "public" : "307b4981773076301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "including garbage",
+          "public" : "307a25003076301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "including garbage",
+          "public" : "30783076301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed0312510004deadbeef",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "including garbage",
+          "public" : "307b3015498177301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "including garbage",
+          "public" : "307a30142500301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "including garbage",
+          "public" : "307e3012301006072a8648ce3d020106052b810400220004deadbeef03620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "including garbage",
+          "public" : "307b3015260c49817706072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "including garbage",
+          "public" : "307a3014260b250006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "including garbage",
+          "public" : "307e3018260906072a8648ce3d02010004deadbeef06052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "including garbage",
+          "public" : "307b301506072a8648ce3d0201260a49817706052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "including garbage",
+          "public" : "307a301406072a8648ce3d02012609250006052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "including garbage",
+          "public" : "307e301806072a8648ce3d0201260706052b810400220004deadbeef03620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "including garbage",
+          "public" : "307b301006072a8648ce3d020106052b81040022236749817703620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "including garbage",
+          "public" : "307a301006072a8648ce3d020106052b810400222366250003620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "including garbage",
+          "public" : "307e301006072a8648ce3d020106052b81040022236403620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed0312510004deadbeef",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "including undefined tags",
+          "public" : "307eaa00bb00cd003076301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "including undefined tags",
+          "public" : "307caa02aabb3076301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "including undefined tags",
+          "public" : "307e3018aa00bb00cd00301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "including undefined tags",
+          "public" : "307c3016aa02aabb301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "including undefined tags",
+          "public" : "307e3018260faa00bb00cd0006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "including undefined tags",
+          "public" : "307c3016260daa02aabb06072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "including undefined tags",
+          "public" : "307e301806072a8648ce3d0201260daa00bb00cd0006052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "including undefined tags",
+          "public" : "307c301606072a8648ce3d0201260baa02aabb06052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "including undefined tags",
+          "public" : "307e301006072a8648ce3d020106052b81040022236aaa00bb00cd0003620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "including undefined tags",
+          "public" : "307c301006072a8648ce3d020106052b810400222368aa02aabb03620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "truncated length of sequence",
+          "public" : "3081",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "truncated length of sequence",
+          "public" : "3066308103620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Replacing sequence with NULL",
+          "public" : "0500",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Replacing sequence with NULL",
+          "public" : "3066050003620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "changing tag value of sequence",
+          "public" : "2e76301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "changing tag value of sequence",
+          "public" : "2f76301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "changing tag value of sequence",
+          "public" : "3176301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "changing tag value of sequence",
+          "public" : "3276301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "changing tag value of sequence",
+          "public" : "ff76301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 217,
+          "comment" : "changing tag value of sequence",
+          "public" : "30762e1006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 218,
+          "comment" : "changing tag value of sequence",
+          "public" : "30762f1006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 219,
+          "comment" : "changing tag value of sequence",
+          "public" : "3076311006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 220,
+          "comment" : "changing tag value of sequence",
+          "public" : "3076321006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 221,
+          "comment" : "changing tag value of sequence",
+          "public" : "3076ff1006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 222,
+          "comment" : "dropping value of sequence",
+          "public" : "3000",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 223,
+          "comment" : "dropping value of sequence",
+          "public" : "3066300003620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 224,
+          "comment" : "truncate sequence",
+          "public" : "3075301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed0312",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 225,
+          "comment" : "truncate sequence",
+          "public" : "30751006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 226,
+          "comment" : "truncate sequence",
+          "public" : "3075300f06072a8648ce3d020106052b81040003620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 227,
+          "comment" : "truncate sequence",
+          "public" : "3075300f072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 228,
+          "comment" : "indefinite length",
+          "public" : "3080301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed0312510000",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 229,
+          "comment" : "indefinite length",
+          "public" : "3078308006072a8648ce3d020106052b81040022000003620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 230,
+          "comment" : "indefinite length with truncated delimiter",
+          "public" : "3080301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed03125100",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 231,
+          "comment" : "indefinite length with truncated delimiter",
+          "public" : "3077308006072a8648ce3d020106052b810400220003620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 232,
+          "comment" : "indefinite length with additional element",
+          "public" : "3080301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed03125105000000",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 233,
+          "comment" : "indefinite length with additional element",
+          "public" : "307a308006072a8648ce3d020106052b810400220500000003620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 234,
+          "comment" : "indefinite length with truncated element",
+          "public" : "3080301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251060811220000",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 235,
+          "comment" : "indefinite length with truncated element",
+          "public" : "307c308006072a8648ce3d020106052b8104002206081122000003620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 236,
+          "comment" : "indefinite length with garbage",
+          "public" : "3080301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed0312510000fe02beef",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 237,
+          "comment" : "indefinite length with garbage",
+          "public" : "307c308006072a8648ce3d020106052b810400220000fe02beef03620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 238,
+          "comment" : "indefinite length with nonempty EOC",
+          "public" : "3080301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed0312510002beef",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 239,
+          "comment" : "indefinite length with nonempty EOC",
+          "public" : "307a308006072a8648ce3d020106052b810400220002beef03620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 240,
+          "comment" : "prepend empty sequence",
+          "public" : "30783000301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 241,
+          "comment" : "prepend empty sequence",
+          "public" : "30783012300006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 242,
+          "comment" : "append empty sequence",
+          "public" : "3078301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed0312513000",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 243,
+          "comment" : "append empty sequence",
+          "public" : "3078301206072a8648ce3d020106052b81040022300003620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 244,
+          "comment" : "sequence of sequence",
+          "public" : "30783076301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 245,
+          "comment" : "sequence of sequence",
+          "public" : "30783012301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 246,
+          "comment" : "truncated sequence",
+          "public" : "3012301006072a8648ce3d020106052b81040022",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 247,
+          "comment" : "truncated sequence",
+          "public" : "306f300906072a8648ce3d020103620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 248,
+          "comment" : "repeat element in sequence",
+          "public" : "3081da301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed03125103620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 249,
+          "comment" : "repeat element in sequence",
+          "public" : "307d301706072a8648ce3d020106052b8104002206052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 250,
+          "comment" : "removing oid",
+          "public" : "306d300706052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 251,
+          "comment" : "lonely oid tag",
+          "public" : "306e30080606052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 252,
+          "comment" : "lonely oid tag",
+          "public" : "3070300a06072a8648ce3d02010603620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 253,
+          "comment" : "appending 0's to oid",
+          "public" : "3078301206092a8648ce3d0201000006052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 254,
+          "comment" : "appending 0's to oid",
+          "public" : "3078301206072a8648ce3d020106072b81040022000003620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 255,
+          "comment" : "prepending 0's to oid",
+          "public" : "30783012060900002a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 256,
+          "comment" : "prepending 0's to oid",
+          "public" : "3078301206072a8648ce3d0201060700002b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 257,
+          "comment" : "appending unused 0's to oid",
+          "public" : "3078301206072a8648ce3d0201000006052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 258,
+          "comment" : "appending null value to oid",
+          "public" : "3078301206092a8648ce3d0201050006052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 259,
+          "comment" : "appending null value to oid",
+          "public" : "3078301206072a8648ce3d020106072b81040022050003620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 260,
+          "comment" : "truncated length of oid",
+          "public" : "306f3009068106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 261,
+          "comment" : "truncated length of oid",
+          "public" : "3071300b06072a8648ce3d0201068103620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 262,
+          "comment" : "Replacing oid with NULL",
+          "public" : "306f3009050006052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 263,
+          "comment" : "Replacing oid with NULL",
+          "public" : "3071300b06072a8648ce3d0201050003620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 264,
+          "comment" : "changing tag value of oid",
+          "public" : "3076301004072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 265,
+          "comment" : "changing tag value of oid",
+          "public" : "3076301005072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 266,
+          "comment" : "changing tag value of oid",
+          "public" : "3076301007072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 267,
+          "comment" : "changing tag value of oid",
+          "public" : "3076301008072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 268,
+          "comment" : "changing tag value of oid",
+          "public" : "30763010ff072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 269,
+          "comment" : "changing tag value of oid",
+          "public" : "3076301006072a8648ce3d020104052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 270,
+          "comment" : "changing tag value of oid",
+          "public" : "3076301006072a8648ce3d020105052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 271,
+          "comment" : "changing tag value of oid",
+          "public" : "3076301006072a8648ce3d020107052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 272,
+          "comment" : "changing tag value of oid",
+          "public" : "3076301006072a8648ce3d020108052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 273,
+          "comment" : "changing tag value of oid",
+          "public" : "3076301006072a8648ce3d0201ff052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 274,
+          "comment" : "dropping value of oid",
+          "public" : "306f3009060006052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 275,
+          "comment" : "dropping value of oid",
+          "public" : "3071300b06072a8648ce3d0201060003620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 276,
+          "comment" : "modify first byte of oid",
+          "public" : "307630100607288648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 277,
+          "comment" : "modify first byte of oid",
+          "public" : "3076301006072a8648ce3d02010605298104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 278,
+          "comment" : "modify last byte of oid",
+          "public" : "3076301006072a8648ce3d028106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 279,
+          "comment" : "modify last byte of oid",
+          "public" : "3076301006072a8648ce3d020106052b810400a203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 280,
+          "comment" : "truncate oid",
+          "public" : "3075300f06062a8648ce3d0206052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 281,
+          "comment" : "truncate oid",
+          "public" : "3075300f06068648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 282,
+          "comment" : "truncate oid",
+          "public" : "3075300f06072a8648ce3d020106042b81040003620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 283,
+          "comment" : "truncate oid",
+          "public" : "3075300f06072a8648ce3d020106048104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 284,
+          "comment" : "wrong oid",
+          "public" : "30793013060a3262306530333032316106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 285,
+          "comment" : "wrong oid",
+          "public" : "308181301b061236303836343830313635303330343032303106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 286,
+          "comment" : "wrong oid",
+          "public" : "307b301506072a8648ce3d0201060a3262306530333032316103620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 287,
+          "comment" : "wrong oid",
+          "public" : "308183301d06072a8648ce3d0201061236303836343830313635303330343032303103620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 288,
+          "comment" : "longer oid",
+          "public" : "307f301906103261383634386365336430323031303106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 289,
+          "comment" : "longer oid",
+          "public" : "307d301706072a8648ce3d0201060c32623831303430303232303103620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 290,
+          "comment" : "oid with modified node",
+          "public" : "307d3017060e326138363438636533643032313106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 291,
+          "comment" : "oid with modified node",
+          "public" : "308185301f06163261383634386365336430323838383038303830303106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 292,
+          "comment" : "oid with modified node",
+          "public" : "307b301506072a8648ce3d0201060a3262383130343030333203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 293,
+          "comment" : "oid with modified node",
+          "public" : "308183301d06072a8648ce3d0201061232623831303430303838383038303830323203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 294,
+          "comment" : "large integer in oid",
+          "public" : "30818f30290620326138363438636533643032383238303830383038303830383038303830303106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 295,
+          "comment" : "large integer in oid",
+          "public" : "30818d302706072a8648ce3d0201061c3262383130343030383238303830383038303830383038303830323203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 296,
+          "comment" : "oid with invalid node",
+          "public" : "308180301a0611326138363438636533643032303165303306052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 297,
+          "comment" : "oid with invalid node",
+          "public" : "3077301106082a808648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 298,
+          "comment" : "oid with invalid node",
+          "public" : "307e301806072a8648ce3d0201060d3262383130343030323265303303620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 299,
+          "comment" : "oid with invalid node",
+          "public" : "3077301106072a8648ce3d020106062b808104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 300,
+          "comment" : "lonely bit string tag",
+          "public" : "3013301006072a8648ce3d020106052b8104002203",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 301,
+          "comment" : "appending 0's to bit string",
+          "public" : "3078301006072a8648ce3d020106052b8104002203640004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed0312510000",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 302,
+          "comment" : "prepending 0's to bit string",
+          "public" : "3078301006072a8648ce3d020106052b81040022036400000004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 303,
+          "comment" : "appending null value to bit string",
+          "public" : "3078301006072a8648ce3d020106052b8104002203640004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed0312510500",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 304,
+          "comment" : "truncated length of bit string",
+          "public" : "3014301006072a8648ce3d020106052b810400220381",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 305,
+          "comment" : "Replacing bit string with NULL",
+          "public" : "3014301006072a8648ce3d020106052b810400220500",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 306,
+          "comment" : "changing tag value of bit string",
+          "public" : "3076301006072a8648ce3d020106052b8104002201620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 307,
+          "comment" : "changing tag value of bit string",
+          "public" : "3076301006072a8648ce3d020106052b8104002202620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 308,
+          "comment" : "changing tag value of bit string",
+          "public" : "3076301006072a8648ce3d020106052b8104002204620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 309,
+          "comment" : "changing tag value of bit string",
+          "public" : "3076301006072a8648ce3d020106052b8104002205620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 310,
+          "comment" : "changing tag value of bit string",
+          "public" : "3076301006072a8648ce3d020106052b81040022ff620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 311,
+          "comment" : "dropping value of bit string",
+          "public" : "3014301006072a8648ce3d020106052b810400220300",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 312,
+          "comment" : "modify first byte of bit string",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620204c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 313,
+          "comment" : "modify last byte of bit string",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed0312d1",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 314,
+          "comment" : "truncate bit string",
+          "public" : "3075301006072a8648ce3d020106052b8104002203610004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed0312",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 315,
+          "comment" : "truncate bit string",
+          "public" : "3075301006072a8648ce3d020106052b81040022036104c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 316,
+          "comment" : "declaring bits as unused in a bit-string",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620104c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 317,
+          "comment" : "unused bits in a bit-string",
+          "public" : "307a301006072a8648ce3d020106052b8104002203662004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed03125101020304",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 318,
+          "comment" : "unused bits in empty bit-string",
+          "public" : "3015301006072a8648ce3d020106052b81040022030103",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 319,
+          "comment" : "128 unused bits",
+          "public" : "3076301006072a8648ce3d020106052b8104002203628004c2bed48c5e15e8208411b1a14c77c440b9a8c3b6b2af6eef05e4fbae13cfe7ba5e9af208c54e3035e3b4559f97b0f2798dbe522a47ee950419b5faa273d24ff2748a8349c591cc80871acf3c6702cce129c68351a713207a69f02b5bed031251",
+          "private" : "4b065d2dbbad95d7eebed00a3e79f772ccddfd93101c1b1f393e8adc465d94bc21346d8f341907a3c27a2562dcb49a3a",
+          "shared" : "40c344fb1185a5a97dd00b114f1b9c5ce4009f90c593f236fe465518f9ff27326a421e05b5bc1bfe3768d5becb9ec797",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdh_secp521r1_ecpoint_test.json b/third_party/wycheproof/testvectors/ecdh_secp521r1_ecpoint_test.json
new file mode 100644
index 0000000..bb61149
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdh_secp521r1_ecpoint_test.json
@@ -0,0 +1,787 @@
+{
+  "algorithm" : "ECDH",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "AddSubChain" : "The private key has a special value. Implementations using addition subtraction chains for the point multiplication may get the point at infinity as an intermediate result. See CVE_2017_10176",
+    "CVE_2017_10176" : "This test vector leads to an EC point multiplication where an intermediate result can be the point at infinity, if addition-subtraction chains are used to speed up the point multiplication.",
+    "CompressedPoint" : "The point in the public key is compressed. Not every library supports points in compressed format."
+  },
+  "numberOfTests" : 81,
+  "header" : [],
+  "testGroups" : [
+    {
+      "curve" : "secp521r1",
+      "encoding" : "ecpoint",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "normal case",
+          "public" : "040064da3e94733db536a74a0d8a5cb2265a31c54a1da6529a198377fbd38575d9d79769ca2bdf2d4c972642926d444891a652e7f492337251adf1613cf3077999b5ce00e04ad19cf9fd4722b0c824c069f70c3c0e7ebc5288940dfa92422152ae4a4f79183ced375afb54db1409ddf338b85bb6dbfc5950163346bb63a90a70c5aba098f7",
+          "private" : "1939982b529596ce77a94bc6efd03e92c21a849eb4f87b8f619d506efc9bb22e7c61640c90d598f795b64566dc6df43992ae34a1341d458574440a7371f611c7dcd",
+          "shared" : "01f1e410f2c6262bce6879a3f46dfb7dd11d30eeee9ab49852102e1892201dd10f27266c2cf7cbccc7f6885099043dad80ff57f0df96acf283fb090de53df95f7d87",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "compressed public key",
+          "public" : "030064da3e94733db536a74a0d8a5cb2265a31c54a1da6529a198377fbd38575d9d79769ca2bdf2d4c972642926d444891a652e7f492337251adf1613cf3077999b5ce",
+          "private" : "1939982b529596ce77a94bc6efd03e92c21a849eb4f87b8f619d506efc9bb22e7c61640c90d598f795b64566dc6df43992ae34a1341d458574440a7371f611c7dcd",
+          "shared" : "01f1e410f2c6262bce6879a3f46dfb7dd11d30eeee9ab49852102e1892201dd10f27266c2cf7cbccc7f6885099043dad80ff57f0df96acf283fb090de53df95f7d87",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "edge case for shared secret",
+          "public" : "04014c643329691ba27459a40dfe7c4ce17b3ea14d0cd7aa47b01f1315404db51436fbbfe6de0842e0f7e1265f6ff3aca28750677d3370b2fb2a6ef497356f4b95811201051b14178639a09a41465c72d3743436ee1c191ff7388a40140b34d5317de5911ea03cdbb0329fdeb446695a3b92d437271a9f3c318b02dec4d473908158140e97",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "edge case for shared secret",
+          "public" : "040029cd32125c23a41af24fd4b729da0faacbc35516ef0ba59096602571693cd282e26d67e18ef4643d0f6f158d7370d3394ca9a8de7938032ac178c6fd34e3702b8d008649834e2b41be3a8b7510bfe570f4c67075943cd0cbb9d9e1d1da52618b5b96d6aec9b650daf1ca6624c13e5116302b9c79c8c4d3d351915d1e8e1ab6ad76098e",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "edge case for shared secret",
+          "public" : "040032c6f06ce6a15ea064464d35aa368d299c9a9e1e368f694aefb603876248f898f223ce0217bef37d61eb09b27c93187cf8e61ba7b14e3c9bee692b06ac6d95f836019fd19f8480e21c63211d48d45f96f6365cf55f958e1a0fe7ea6b6b9ff230a87b70bb1b14d3a5fb6669a91641c6acf4570c1d3a9e709913b7fe6b35ff81c394d6a7",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "edge case for shared secret",
+          "public" : "0401f7eb96e64b1a62daf9e0801bfd96a0b15b68e5f5cb3e90b434495a473907338e53098e1c2e493335d09c6aae6fdda0345b98aaed588f2abe82910713fb6c20252901396b17cf250bc018f4cead097e7e09863f14cf1239b065e57d884949eee141926f7e7c9f7f34cf0536368767bc0e1ab5142877293a4c722693a73fe14a5390af93",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "edge case for shared secret",
+          "public" : "04006ddf9b10965d5fc129e96f7a37667ccf66cc44384772906fedb21f9de4629e01aaa09ac7c9866112064bbc9bd58ebc123ab2fe19d8fed1a056d27bfef0630509c7001c441311ef20a16346332ea42d5c65788d68f6817b0267fcab11ea9c948ed108115dda8e823a380b601460742d3772d6424c67b240da24772ff0d2ccd9a1e0cea6",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff0000000000000100000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "edge case for shared secret",
+          "public" : "04007a8c547268c948b626da636cf54428ea2ab23861d499a84ad7be1cf691b92872a06e26c6dba08ca9ed386f83d396156d5fa023f57d5ea6440ec7401dad2c08ad70018c3815b1b9a2e42555419a6c19043fa2b0ddcc4b5a6e372fee9fcb227d85bad704687e7e1a818b612d5c046cd75972f7a2dd5c9a200ac5582cd59fec47ac525ecf",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "00003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "edge case for shared secret",
+          "public" : "040029153cf062f88f303e5d6f9aac968bd901076d5994ea7f831833b1e69b67e9e9fe20cf9c5623e00e0b9e3592fca2a03324b5df7c93186aff697aca864600d44ecc002801a62e2f4106f34106da23dc93d50e3e975a1d47510021835290649b7a4125109f656b6b0b5bd00b24d84ea1ba4e1ed49e61c526fb1011005131caee7ee0501e",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "edge case for shared secret",
+          "public" : "0400a61eb994e28722c59b3c6007dfdf8b37893f6350f461b26a00e1a45104314aae9989da87e4facb2c4ef721185b7d96d9a45a28a102756501a1acc5d329a21bbf73010e8d0e12f5a9a40e0d59c90ce73043d39730aeadd3788e31d7c2bb62a1166161994664afa658ce2e60a13f45f27f914307c8d6f8d4ed16ab041b8f69908a62782f",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "010000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "edge case for shared secret",
+          "public" : "04011dd497b30c73709906b164a9a79dc7f2a98c0148ed63016bb95243834fbcdf8eb74b0ff652d54f59f31aef51da6e8974d363655b1da138dc4de0f2a8d800f475ae0057bd4b84607400d863ffbf45a3cf58999ee24ba05e93eca7b0e4ae760eb1733559a45d15579d3370d716ffa3ec4bfdae418e32fb06138dfca213720a938577610e",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ff00000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000100000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "edge case for shared secret",
+          "public" : "0401283eb93fa369fe7012b647d21e0a97cf9950e5fbed819ef56158f20c8a9473a418eccbca4dc2b47f4cb6d322f917005859bf221e84ac9827cab82a801c627fb1ec0075c480cbafb352fcaf93baf23a1405fd81febe09729a908d1077e177dd8993d94b251a0d52652da3edb6fdf864e80cd51540e73d0b5107e3433576dcaa4e18db43",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "edge case for shared secret",
+          "public" : "0400173beefe35ee868d497ff6601628f65ce18a1591f7e4a3a406622f3f508e2da68f101ed02febc38418c6ddfc26a5ec9848c42792463b1e945f9e167db34bdf2d660053070647aba7cd60eb295ab81a268a3903f393c5d28bbc5e022351c377cd84f02c19deb36442372cae1332e92f95ba60b6c852e0de0718e89d24e43cd479c9fb11",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "edge case for shared secret",
+          "public" : "04009829cd5432687739ab6ae10af8ea73d2cb53b81ebb06b5961b7badc1676b3ef7b00454f7cde56774a01312d574a9193c1a5fe5336fbe62623ad9bf81143789f9f90012f955697ed578207197bf9aac3896521615dbacc8dc665d4f1715b08439f49c2aa6ed337023ffccc5075a85944936826db92f919737ca3afeadba1847084bdef7",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "edge case for shared secret",
+          "public" : "040126e3c959cd41120bb83693b1d6a034b385137c1bb3213b776122fed96056e329885718a73bee639c0ba4b68818682f498ce5496925002bd7652516405fcc4fecad0073a9c6e3b0c694bf7cc8ccbbd09800e81e3548ba44a0c2381cef0b07bf702a19054bb5d717a1b79294609cbdafd4e2018064f7b2c4c204d818eb7ce521c3268ce5",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "edge case for shared secret",
+          "public" : "040153dc481ab3c5dc8decd24ceaee1bec77f59f21f7f31c19538af047d281ac9e2567933fd3d21096b185d4098919571931bb9b0be7197995e2fbaf21c8a10007ade001ad69f08fcae164390be826256b50fae47502ce0e9ca46af0c490cb4033c886f88661a99ff2bd3c9c8e7da30faf2b4c769edc5831810ac05054c97e41063f496e1f",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "edge case for shared secret",
+          "public" : "0401f586611c87150288c3e86116c5db94a26718978829d701ddac05e9b0ce22dee4b18e95f60cba783ed3384da373deaefc57b8265d3a34eeb458bf24b9d82be32819008456e0f1d80492ef0078cc246d32fc7c7fb6720b4d458b51b2098d35746752b0ef0345bd0d342dfee6dd2f12ed12b34bd95d058c2811fd479d2dde32180e6c9ef2",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc000000080000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "edge case for shared secret",
+          "public" : "04015edc87fd499a73eabffd14d2b6a70a8fb69b6a39d0d9c4dda2337b53cc72e49a9e3d5a2d9e8930cfa11852dac33443227fba6684bd74732e6879884b6ef9dae98f010eeb8d2e3360ea9726628085268af3f2a05ad41235d0a892098bd661b636f7ef0a820282906eda3f1ff1980b98fb5937228e9edcd6332e3641216c7307e7f3f452",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "edge case for shared secret",
+          "public" : "040131b43002f7e687eec1ecf6a253c2ccc9e48f04d86fccd18fee0d2d22191f1ea539c40d521970b4709dc03986f647e0e8bb3340cf8a3e643a3541035437cf25f01500b27a55ac45f0296f8c9656bcfd52b5cea9f4115c06e4c64319609847d45e92418400e7868672c0d3e6e5e6e004a7190476ed77cfc33ad19a4bd2c615ad9950f374",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d20ec9fea6b577c10d26ca1bb446f40b299e648b1ad508aad068896fee3f8e614bc63054d5772bf01a65d412e0bcaa8e965d2f5d332d7f39f846d440ae001f4f87",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "0053bf137fee8922769f8d0fe279caa4dac9c6054ad0460995588a845d0a959e24bc0fc2391a2b92f7bd400f50a11a9db37f07bef7fa8dad2a903fcf534abc8736f7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010010e59be93c4f269c0269c79e2afd65d6aeaa9b701eacc194fb3ee03df47849bf550ec636ebee0ddd4a16f1cd9406605af38f584567770e3f272d688c832e843564",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "01c95ac417c90a520149b29105cdab36f528a23efb5621520dbdafea95a7d43499c4c8be02cd1c2de000da18104fa84a1e9ece6386f0e0efa5234a24595d7c4c96f4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200d9254fdf800496acb33790b103c5ee9fac12832fe546c632225b0f7fce3da4574b1a879b623d722fa8fc34d5fc2a8731aad691a9a8bb8b554c95a051d6aa505acf",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "01b47ec41e3a5abd9dd9808fc04d9078cbed72b9eba98d3c1ded70a29938f0efd5a27a7113ff721f122cb17411de307a355c685074f5766b6d1a033d2fa188c945b6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000005f880f50ec94bfac6658fa2fce05945c6a36b266407b6fbd5437a83e2f2f9b9c50a734872e48e70df65457f13e47d06c6b8b29f4735acf105ea63e051904d18aea",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "013aefe3245728a08c904fe7d61cd9c2fdac63f29cf664d8f161bebacb93f8a710e9692f9689480ad498de00f00061e40e46e76e4754c1130ef4217a58933e0b1dc6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff000000000000010000000000000000f33ffc45da3eac1baab727ab8fd355cfa134c42047d55262651654fb50df7e9a5a75f179c8c86c4388213b5687dc43dfebb37f30128703c44ccd5c3284833b8717",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "0168df272d53e3161926168c4aeab5f355b8d2a6689cfd567f2b6eb2011a18c775ac2a21f8dd497f6957217020b3b1afcb7021f24fccc2523be76a2bff44596e5a14",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "0400003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00cd2839d857b4699f5c8e8a0194786e26a862f086b4ba80746ae5225ed3aa68f96b7aaec55225830bb98f52d75221141897ba49d7a31ebbf0b6d7d31352e5266190",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "013db1b9241b23d33860d32dec37a79e4546a41afdfdd9c438d04e1f8b566ac8d9d3f572c293e96943722a4ee290e113fffaa82a61867d9ca28d349982354c9b256f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000813d9829119f42ffa95fea8ba9e81e4cd6a6ca97fb0778e12e5f5dfe35201dd4cca8eca0d2e395555997041381e6ac1f18ddf4c74e0b6e9041cfdca1d1c103091",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "01d2bbe9f754584ebbc7c7ad74136d1c8a144948948aa8be49989dd9b4c514db2e2ab1e0713ad1699f632dd2cea53da218ed549f030a113e282fd9e3be462d9aba84",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "04010000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff00878ad597d290db2cf660594aeed0f9b7c8dd68451d2d1b2cbc816b1ec4f35465b3964aff2edf1255163f5fca580132f85cade2887a017e7cd0b37196ad85221107",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "000f37a2e2caef54fff4126c0fa96e7c47f0cad74626ef91e589e12d2e1e8c221be7295be9dc2712b87bb0aa0f5880b738bc1242f2ba773bf9eb2a54e3c1ca4758d7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "0401ff00000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000000000010000000000000000000000000000000000b5e1191b449fa1ebdbd677daa48f90e2d1d6c058c877087cafd9364d99dbb283c68402e6e6c5f5411b2ed42824d8b280ceb910aba6847883a7e3780e2132af41c1",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "017aeb254d9c8c8ee06215ff33811357da73bf7f6dd6d7f8f176d62c065a88a9005f680c630e9f2763585ea2ee76b6e4ab45e673f814ebfa95947c0c63fb24fa6e9b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "0401ff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff00207513d615656a1cc7505c18aa21b08e2b1d5a841de0816cc29c004efdb2d902ac1a7bb05e20722b576b64a3ddf4d2486421ac706bf4a424f252386368a5340fb6",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "0061bed42248a37b4625ef04c4f9c7ef69ee3c6f9503378351fcab1b8ce1343206997eec1b88449eb6f7355711ea1a818a486ee30a24126241a7e2289267cf5dd61f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "0401ff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff001fe800c50e54012b75a33e4be7d07c8d60f29680a395e951a6a31c5096b0ea928fc2cbf327dd784dc0a7ca46ea73992b758b5641364b4aba39e93798a4d925a008",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "001067d9104e296ef42b944587de11b10df05d2d959ed44cac9e7ef1c7a05d90819c43bc79c7397918f957cc98db931763bbeb1bdfc35865e8a359a013f13d60c433",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "0401ff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000008dd18a1f5e482140be79bb65a21ad60c8987e532c84345f0135affd46ec71ef02b1ca3ad56f301d955fa306c122d441d6fedcf8b855ef256350bf69d23a7207ad9",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "00b779d83035cf7bb0bb04c7b2f46d08f6791f0d1542c9bcce7250e772b12ad8e38fce1d2b063a06f0fa3a1b072dd976f5f8542979903075162f1f5c6ba3b76cc45d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "0401ffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff800000400000100566203dd325a081c4441f001f780365874fd3d0c9bc47227481afe76a93ae1bfde63af972203abfe22c63b80e83f7cc2184c3cb8cfd0152c54324c4759fd1f9a50",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "01afe5d23733728b79c743933b9ba7dfec5ed19b7737e393908a1d000918aa795d1ce0ad533983d018f927b35d2af6463356573f387febd75911a49486202ca69d3a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "0401ffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff00b11c668fbd549f36889f7b63434051da26f15705839136b1b14a09152d7a182ea7806c35478a32d3aa3c9c1627a61519ebec71b36fa77449025b8829e27f307834",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "019612aeb386febb1a28096fe5b2f682dead02389785225b80a27df439510d08349a193839525f248b7f9bcabfd3dc8da8cc1724022299b7b5e72399d89464b82e44",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "0401ffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000008000000200aa75efc0a8daac1d73f32c9c552414bccf44af8e74331b47439e7dcc49a135b3ee61e9f69717d89b4bba3567a195aeda13fbec634bf2984b5ec6b6f80f5978ed5a",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "00570673f87adcef49c1f011e8b9f1e11f7fd3b3c93114d08d3f515aa4a895a6c701c523063bdc13ad1db0a54f6e7b476fe10db2070441befc58c8cff3c08ef76e59",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "0401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0010e59be93c4f269c0269c79e2afd65d6aeaa9b701eacc194fb3ee03df47849bf550ec636ebee0ddd4a16f1cd9406605af38f584567770e3f272d688c832e843564",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "0016aaf228b0aec190d4e4e5b8138ff9cc46d705da1bf002901c6ab420f59314d5b641712b14ef3e4fb125652c47888676804fb5575b741a8408c5625bfccff4fdda",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "0401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00d9254fdf800496acb33790b103c5ee9fac12832fe546c632225b0f7fce3da4574b1a879b623d722fa8fc34d5fc2a8731aad691a9a8bb8b554c95a051d6aa505acf",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "00a5d6dfda2b269f4ab895a41c3b71b6ba10d5c9f0d9b3e730275345e4721594abfd39464c227716ded8ef3e60bb1ca0b551716e3f6eebb48d5ce8e0ab58cb1b73c9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "edge case private key",
+          "public" : "0401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "3",
+          "shared" : "00f2246431b597930f2eae61e9aabbd39f8f6ae97c3cf2521a6aeecedda10b5ef5f3b2eb3a8906d02f51d244710aa9e19cc0be21db920132be1c91deb85e466c28df",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "edge case private key",
+          "public" : "0401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "00347c51f587c726070bdeb9173d0a547427ead3f2c8de62d9ecc3013285f645d220931520bcef85d08cfb6786045745fbfbfb1924c44a89d06676131a965677272a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "edge case private key",
+          "public" : "0401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "01c41dc4437c2f2b94a940711b3a691723397a1f83d6bc0c67ddc7a657160925c7f85bb4eb3842b60b2610ddb7c0b8676267710e58359a8750843c6d8e25d48d1cd9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "edge case private key",
+          "public" : "0401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "006a239cdb7a783840658d5f314bfe5c51e806a4bf1236f8421265bcc503c673eb16c5c2b38b5717fa04ee7dbcdeb15c871711507abb7557a8a8c7b3250141e854d5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "edge case private key",
+          "public" : "0401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "0112dbf9713aadd478e4f2ebcb058f05b512b1959c7da1994f851f373ce8c341d39c6843373f6fe559905953e1147640159437953c571961c09bad157a8e1a5bf476",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "edge case private key",
+          "public" : "0401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47adbb6fb71e91386409",
+          "shared" : "003eca2210c8623105085aa284d119f3d716730595c6291aa89bf32a95e8a5fdc64f3d76e92494a43a9dced12d05b6dca4ffe649b32ac12cb0202e702dc83a2cb277",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "edge case private key",
+          "public" : "0401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb5fb71e91386409",
+          "shared" : "01c4cae9fbfdd45de51d8525e8447a7553c35cf358f1346f1d79666887bb749a3ba0de62e1866b47a447d53b6f1ca5a33ec94507e2cfb65544f5a1195fc6b4dc5810",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "edge case private key",
+          "public" : "0401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb67b71e91386409",
+          "shared" : "008073b4796e748f3d0de5e85b22aed463f1a6aecdb336bc287b50d139e3591ef5f86b78c3f6051467755f059f295d758075347d657aaae02383838bb96071eacbd4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "edge case private key",
+          "public" : "0401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71d91386409",
+          "shared" : "01f11ff8983792d4a790d0de4b56d078b9033ad6318a440e8119342937cc48a39375150ab2cf98273b0fe35d5a3af5d84322a685e89f2cb378a99b9b7bac87e44952",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "edge case private key",
+          "public" : "0401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138631b",
+          "shared" : "00286cefaaf38ca4c6657eb9b187d8614d51775fd71c1a79b4c0ef1a0d4ce72b6f5b2bc854a4e78283530942a3f4fd2a8586d5ea51513c89d3d29de5de06321e118e",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 47,
+          "comment" : "edge case private key",
+          "public" : "0401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138639b",
+          "shared" : "014790de14c481f1336fcb7d33a8bf8e23eb594cc48608e9edfe0e326e106b67e7eaa3f04ec9985599178f632a5ee6419e11217060e9fcd5958a43882bf8cd3be6ba",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 48,
+          "comment" : "edge case private key",
+          "public" : "0401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863db",
+          "shared" : "01ae775dbc4096a3aea7977b1a0af4b2830ecf9ca927a6247fba4cccb46b3f71d0e7abb8dda72d1c1ee7bb5b875b4773cc8df40f732819c4147da330775d1742ea35",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 49,
+          "comment" : "edge case private key",
+          "public" : "0401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863fb",
+          "shared" : "01979fb05e068a12a3f20cfdfb9eaee9f22b356edcc7655383ed38124b86814f86a6f2216a34f3fc2299d403ee42408f95d08c5c6cd11db72cbf299a4a3c2545be25",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 50,
+          "comment" : "edge case private key",
+          "public" : "0401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386403",
+          "shared" : "0197ebe26798bf67f06ff0282773af75115531f41d94c093d87481b76bef707bc222f2d6672f84a00fa20c5ed27027ab4006b68d93ee2151016c9ddbe014346272e2",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 51,
+          "comment" : "edge case private key",
+          "public" : "0401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406",
+          "shared" : "00f2246431b597930f2eae61e9aabbd39f8f6ae97c3cf2521a6aeecedda10b5ef5f3b2eb3a8906d02f51d244710aa9e19cc0be21db920132be1c91deb85e466c28df",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "edge case private key",
+          "public" : "0401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386407",
+          "shared" : "01c168314cdc85757ade34a52a9e5379ffa5968f084b7e404939a8033a0fc698e26211754b9b2c04cf8a1420abe6e986ef1a238bbb91dd402b72e0ed50a876f1a83e",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 53,
+          "comment" : "CVE-2017-10176: Issue with elliptic curve addition",
+          "public" : "0400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863f7",
+          "shared" : "01bc33425e72a12779eacb2edcc5b63d1281f7e86dbc7bf99a7abd0cfe367de4666d6edbb8525bffe5222f0702c3096dec0884ce572f5a15c423fdf44d01dd99c61d",
+          "result" : "valid",
+          "flags" : [
+            "CVE_2017_10176"
+          ]
+        },
+        {
+          "tcId" : 54,
+          "comment" : "point is not on curve",
+          "public" : "04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "point is not on curve",
+          "public" : "04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "point is not on curve",
+          "public" : "0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "point is not on curve",
+          "public" : "0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "point is not on curve",
+          "public" : "04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "point is not on curve",
+          "public" : "04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "point is not on curve",
+          "public" : "0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "point is not on curve",
+          "public" : "0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "point is not on curve",
+          "public" : "0401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "point is not on curve",
+          "public" : "0401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "point is not on curve",
+          "public" : "0401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "point is not on curve",
+          "public" : "0401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "point is not on curve",
+          "public" : "0401ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "point is not on curve",
+          "public" : "0401ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "point is not on curve",
+          "public" : "0401ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "point is not on curve",
+          "public" : "0401ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "",
+          "public" : "",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "invalid public key",
+          "public" : "0200429cb431c18f5f4e4e502f74214e6ac5ec2c3f86b830bac24de95feae142ca7d9aa8aa5b34f55af4b2848f2e6ba6df4c3ecd401a1d7b2a8287a332b202196fadbb",
+          "private" : "1c1fb2cac9087a3397814b198a80e2ea5b437aac1b41e8a2bd8fef8700e4812aa817320e6e1e3865bd2cf75e43a78be5c27ff1c4b5f5019333cb37d0c9c4ff3ec61",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 72,
+          "comment" : "public key is a low order point on twist",
+          "public" : "020108cbf3c9bf8e42135d87127556831076d84d5e549e645afda8a099249231b59b6c508dee4e91c9a543e90ebc82613f86cb1290e29102a0f2fdeb57bf4193fb4639",
+          "private" : "6619644155c449758f65e2dfe7ba89dee1e090c1d68b6342f43cb1ac000090a7f0408138c1de217990bb015cd1d95f1d884cf659f7324f2fe21eeba63ea988aacd",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 73,
+          "comment" : "public key is a low order point on twist",
+          "public" : "03011f2dca6b686e2141c11822e2d5439261583ce98cd6c4041c6d1be9e17dee33ea4a65c3e8cca6de50a30a39c788a585f1188bef0680a9c0264b3c8dcf494d0eb948",
+          "private" : "0a257d97aa4e5195e2919c147c1639bb0da0cce479a036489006b7b8e7e885096066e5adc8fe7c45940c5a6b94d5065b966a45f099a0cecfe9cce1b3e99dca479f2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 74,
+          "comment" : "public key is a low order point on twist",
+          "public" : "02011f2dca6b686e2141c11822e2d5439261583ce98cd6c4041c6d1be9e17dee33ea4a65c3e8cca6de50a30a39c788a585f1188bef0680a9c0264b3c8dcf494d0eb948",
+          "private" : "0a257d97aa4e5195e2919c147c1639bb0da0cce479a036489006b7b8e7e885096066e5adc8fe7c45940c5a6b94d5065b966a45f099a0cecfe9cce1b3e99dca479f3",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 75,
+          "comment" : "public key is a low order point on twist",
+          "public" : "030108cbf3c9bf8e42135d87127556831076d84d5e549e645afda8a099249231b59b6c508dee4e91c9a543e90ebc82613f86cb1290e29102a0f2fdeb57bf4193fb4639",
+          "private" : "6619644155c449758f65e2dfe7ba89dee1e090c1d68b6342f43cb1ac000090a7f0408138c1de217990bb015cd1d95f1d884cf659f7324f2fe21eeba63ea988aacc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 76,
+          "comment" : "public key is a low order point on twist",
+          "public" : "020009cc73141cf1843d2b2c95dc5cbc4d615c6da4814c1c7208615d8e78c7a8666aba1852faaa45a45d32bd0fde6ea78f262a96bf1e02949cea48c33c695103683048",
+          "private" : "2a35258787f91ad0bd3432c3022e4d3ed349c8768a7e7caa1836022fc0c89a9073f6ce14d0990d5b7bb413061c7160e7bd566a5c89f14901b2cc19f1ad531f41e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 77,
+          "comment" : "public key is a low order point on twist",
+          "public" : "030047b9cf28e04b38796858545d60d6133fbdc20ede086e5d95111c982b8c276628235e536c075637a97c0a6c30d02b83b19e578203473eea16dfdeaeccb1dc0d9b19",
+          "private" : "1afe5c77a626161fb2c25964c7895b9fff787099db83f077f05a4bfa320fb61f9315bb44d3fb9dd72225d9d993a18df82ac53fb4a5f86b23cb650e5e4778066f677",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 78,
+          "comment" : "public key is a low order point on twist",
+          "public" : "0300c18410f5727ee0101a52ef95c0ac455cbc65bf9967f0a2c419aa0a291cabad569f2337e102d0a9128f4212dbf9fa9e5a8f14ca7f28e82977281facdd9ca7a92c78",
+          "private" : "24ae709e1644e3087b52470c565268becbdbf97de59916763507d109c2e5b7c21727c64e9b560aa248d7bc9fe0ac95720d507263b7b2859b056ea165301cd599d5",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 79,
+          "comment" : "public key is a low order point on twist",
+          "public" : "0200c18410f5727ee0101a52ef95c0ac455cbc65bf9967f0a2c419aa0a291cabad569f2337e102d0a9128f4212dbf9fa9e5a8f14ca7f28e82977281facdd9ca7a92c78",
+          "private" : "24ae709e1644e3087b52470c565268becbdbf97de59916763507d109c2e5b7c21727c64e9b560aa248d7bc9fe0ac95720d507263b7b2859b056ea165301cd599d6",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 80,
+          "comment" : "public key is a low order point on twist",
+          "public" : "020047b9cf28e04b38796858545d60d6133fbdc20ede086e5d95111c982b8c276628235e536c075637a97c0a6c30d02b83b19e578203473eea16dfdeaeccb1dc0d9b19",
+          "private" : "1afe5c77a626161fb2c25964c7895b9fff787099db83f077f05a4bfa320fb61f9315bb44d3fb9dd72225d9d993a18df82ac53fb4a5f86b23cb650e5e4778066f678",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 81,
+          "comment" : "public key is a low order point on twist",
+          "public" : "030009cc73141cf1843d2b2c95dc5cbc4d615c6da4814c1c7208615d8e78c7a8666aba1852faaa45a45d32bd0fde6ea78f262a96bf1e02949cea48c33c695103683048",
+          "private" : "2a35258787f91ad0bd3432c3022e4d3ed349c8768a7e7caa1836022fc0c89a9073f6ce14d0990d5b7bb413061c7160e7bd566a5c89f14901b2cc19f1ad531f41e1",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdh_secp521r1_test.json b/third_party/wycheproof/testvectors/ecdh_secp521r1_test.json
new file mode 100644
index 0000000..612de61
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdh_secp521r1_test.json
@@ -0,0 +1,3426 @@
+{
+  "algorithm" : "ECDH",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "AddSubChain" : "The private key has a special value. Implementations using addition subtraction chains for the point multiplication may get the point at infinity as an intermediate result. See CVE_2017_10176",
+    "CVE_2017_10176" : "This test vector leads to an EC point multiplication where an intermediate result can be the point at infinity, if addition-subtraction chains are used to speed up the point multiplication.",
+    "CompressedPoint" : "The point in the public key is compressed. Not every library supports points in compressed format.",
+    "InvalidAsn" : "The public key in this test uses an invalid ASN encoding. Some cases where the ASN parser is not strictly checking the ASN format are benign as long as the ECDH computation still returns the correct shared value.",
+    "InvalidPublic" : "The public key has been modified and is invalid. An implementation should always check whether the public key is valid and on the same curve as the private key. The test vector includes the shared secret computed with the original public key if the public point is on the curve of the private key. Generating a shared secret other than the one with the original key likely indicates that the bug is exploitable.",
+    "ModifiedPrime" : "The modulus of the public key has been modified. The public point of the public key has been chosen so that it is both a point on both the curve of the modified public key and the private key.",
+    "UnnamedCurve" : "The public key does not use a named curve. RFC 3279 allows to encode such curves by explicitly encoding, the parameters of the curve equation, modulus, generator, order and cofactor. However, many crypto libraries only support named curves. Modifying some of the EC parameters and encoding the corresponding public key as an unnamed curve is a potential attack vector.",
+    "UnusedParam" : "A parameter that is typically not used for ECDH has been modified. Sometimes libraries ignore small differences between public and private key. For example, a library might ignore an incorrect cofactor in the public key. We consider ignoring such changes as acceptable as long as these differences do not change the outcome of the ECDH computation, i.e. as long as the computation is done on the curve from the private key.",
+    "WeakPublicKey" : "The vector contains a weak public key. The curve is not a named curve, the public key point has order 3 and has been chosen to be on the same curve as the private key. This test vector is used to check ECC implementations for missing steps in the verification of the public key.",
+    "WrongOrder" : "The order of the public key has been modified. If this order is used in a cryptographic primitive instead of the correct order then private keys may leak. E.g. ECDHC in BC 1.52 suffered from this."
+  },
+  "numberOfTests" : 321,
+  "header" : [],
+  "testGroups" : [
+    {
+      "curve" : "secp521r1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "normal case",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040064da3e94733db536a74a0d8a5cb2265a31c54a1da6529a198377fbd38575d9d79769ca2bdf2d4c972642926d444891a652e7f492337251adf1613cf3077999b5ce00e04ad19cf9fd4722b0c824c069f70c3c0e7ebc5288940dfa92422152ae4a4f79183ced375afb54db1409ddf338b85bb6dbfc5950163346bb63a90a70c5aba098f7",
+          "private" : "1939982b529596ce77a94bc6efd03e92c21a849eb4f87b8f619d506efc9bb22e7c61640c90d598f795b64566dc6df43992ae34a1341d458574440a7371f611c7dcd",
+          "shared" : "01f1e410f2c6262bce6879a3f46dfb7dd11d30eeee9ab49852102e1892201dd10f27266c2cf7cbccc7f6885099043dad80ff57f0df96acf283fb090de53df95f7d87",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "compressed public key",
+          "public" : "3058301006072a8648ce3d020106052b81040023034400030064da3e94733db536a74a0d8a5cb2265a31c54a1da6529a198377fbd38575d9d79769ca2bdf2d4c972642926d444891a652e7f492337251adf1613cf3077999b5ce",
+          "private" : "1939982b529596ce77a94bc6efd03e92c21a849eb4f87b8f619d506efc9bb22e7c61640c90d598f795b64566dc6df43992ae34a1341d458574440a7371f611c7dcd",
+          "shared" : "01f1e410f2c6262bce6879a3f46dfb7dd11d30eeee9ab49852102e1892201dd10f27266c2cf7cbccc7f6885099043dad80ff57f0df96acf283fb090de53df95f7d87",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004014c643329691ba27459a40dfe7c4ce17b3ea14d0cd7aa47b01f1315404db51436fbbfe6de0842e0f7e1265f6ff3aca28750677d3370b2fb2a6ef497356f4b95811201051b14178639a09a41465c72d3743436ee1c191ff7388a40140b34d5317de5911ea03cdbb0329fdeb446695a3b92d437271a9f3c318b02dec4d473908158140e97",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040029cd32125c23a41af24fd4b729da0faacbc35516ef0ba59096602571693cd282e26d67e18ef4643d0f6f158d7370d3394ca9a8de7938032ac178c6fd34e3702b8d008649834e2b41be3a8b7510bfe570f4c67075943cd0cbb9d9e1d1da52618b5b96d6aec9b650daf1ca6624c13e5116302b9c79c8c4d3d351915d1e8e1ab6ad76098e",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040032c6f06ce6a15ea064464d35aa368d299c9a9e1e368f694aefb603876248f898f223ce0217bef37d61eb09b27c93187cf8e61ba7b14e3c9bee692b06ac6d95f836019fd19f8480e21c63211d48d45f96f6365cf55f958e1a0fe7ea6b6b9ff230a87b70bb1b14d3a5fb6669a91641c6acf4570c1d3a9e709913b7fe6b35ff81c394d6a7",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401f7eb96e64b1a62daf9e0801bfd96a0b15b68e5f5cb3e90b434495a473907338e53098e1c2e493335d09c6aae6fdda0345b98aaed588f2abe82910713fb6c20252901396b17cf250bc018f4cead097e7e09863f14cf1239b065e57d884949eee141926f7e7c9f7f34cf0536368767bc0e1ab5142877293a4c722693a73fe14a5390af93",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004006ddf9b10965d5fc129e96f7a37667ccf66cc44384772906fedb21f9de4629e01aaa09ac7c9866112064bbc9bd58ebc123ab2fe19d8fed1a056d27bfef0630509c7001c441311ef20a16346332ea42d5c65788d68f6817b0267fcab11ea9c948ed108115dda8e823a380b601460742d3772d6424c67b240da24772ff0d2ccd9a1e0cea6",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff0000000000000100000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004007a8c547268c948b626da636cf54428ea2ab23861d499a84ad7be1cf691b92872a06e26c6dba08ca9ed386f83d396156d5fa023f57d5ea6440ec7401dad2c08ad70018c3815b1b9a2e42555419a6c19043fa2b0ddcc4b5a6e372fee9fcb227d85bad704687e7e1a818b612d5c046cd75972f7a2dd5c9a200ac5582cd59fec47ac525ecf",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "00003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040029153cf062f88f303e5d6f9aac968bd901076d5994ea7f831833b1e69b67e9e9fe20cf9c5623e00e0b9e3592fca2a03324b5df7c93186aff697aca864600d44ecc002801a62e2f4106f34106da23dc93d50e3e975a1d47510021835290649b7a4125109f656b6b0b5bd00b24d84ea1ba4e1ed49e61c526fb1011005131caee7ee0501e",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400a61eb994e28722c59b3c6007dfdf8b37893f6350f461b26a00e1a45104314aae9989da87e4facb2c4ef721185b7d96d9a45a28a102756501a1acc5d329a21bbf73010e8d0e12f5a9a40e0d59c90ce73043d39730aeadd3788e31d7c2bb62a1166161994664afa658ce2e60a13f45f27f914307c8d6f8d4ed16ab041b8f69908a62782f",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "010000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004011dd497b30c73709906b164a9a79dc7f2a98c0148ed63016bb95243834fbcdf8eb74b0ff652d54f59f31aef51da6e8974d363655b1da138dc4de0f2a8d800f475ae0057bd4b84607400d863ffbf45a3cf58999ee24ba05e93eca7b0e4ae760eb1733559a45d15579d3370d716ffa3ec4bfdae418e32fb06138dfca213720a938577610e",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ff00000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000100000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401283eb93fa369fe7012b647d21e0a97cf9950e5fbed819ef56158f20c8a9473a418eccbca4dc2b47f4cb6d322f917005859bf221e84ac9827cab82a801c627fb1ec0075c480cbafb352fcaf93baf23a1405fd81febe09729a908d1077e177dd8993d94b251a0d52652da3edb6fdf864e80cd51540e73d0b5107e3433576dcaa4e18db43",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400173beefe35ee868d497ff6601628f65ce18a1591f7e4a3a406622f3f508e2da68f101ed02febc38418c6ddfc26a5ec9848c42792463b1e945f9e167db34bdf2d660053070647aba7cd60eb295ab81a268a3903f393c5d28bbc5e022351c377cd84f02c19deb36442372cae1332e92f95ba60b6c852e0de0718e89d24e43cd479c9fb11",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004009829cd5432687739ab6ae10af8ea73d2cb53b81ebb06b5961b7badc1676b3ef7b00454f7cde56774a01312d574a9193c1a5fe5336fbe62623ad9bf81143789f9f90012f955697ed578207197bf9aac3896521615dbacc8dc665d4f1715b08439f49c2aa6ed337023ffccc5075a85944936826db92f919737ca3afeadba1847084bdef7",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040126e3c959cd41120bb83693b1d6a034b385137c1bb3213b776122fed96056e329885718a73bee639c0ba4b68818682f498ce5496925002bd7652516405fcc4fecad0073a9c6e3b0c694bf7cc8ccbbd09800e81e3548ba44a0c2381cef0b07bf702a19054bb5d717a1b79294609cbdafd4e2018064f7b2c4c204d818eb7ce521c3268ce5",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040153dc481ab3c5dc8decd24ceaee1bec77f59f21f7f31c19538af047d281ac9e2567933fd3d21096b185d4098919571931bb9b0be7197995e2fbaf21c8a10007ade001ad69f08fcae164390be826256b50fae47502ce0e9ca46af0c490cb4033c886f88661a99ff2bd3c9c8e7da30faf2b4c769edc5831810ac05054c97e41063f496e1f",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401f586611c87150288c3e86116c5db94a26718978829d701ddac05e9b0ce22dee4b18e95f60cba783ed3384da373deaefc57b8265d3a34eeb458bf24b9d82be32819008456e0f1d80492ef0078cc246d32fc7c7fb6720b4d458b51b2098d35746752b0ef0345bd0d342dfee6dd2f12ed12b34bd95d058c2811fd479d2dde32180e6c9ef2",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc000000080000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004015edc87fd499a73eabffd14d2b6a70a8fb69b6a39d0d9c4dda2337b53cc72e49a9e3d5a2d9e8930cfa11852dac33443227fba6684bd74732e6879884b6ef9dae98f010eeb8d2e3360ea9726628085268af3f2a05ad41235d0a892098bd661b636f7ef0a820282906eda3f1ff1980b98fb5937228e9edcd6332e3641216c7307e7f3f452",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040131b43002f7e687eec1ecf6a253c2ccc9e48f04d86fccd18fee0d2d22191f1ea539c40d521970b4709dc03986f647e0e8bb3340cf8a3e643a3541035437cf25f01500b27a55ac45f0296f8c9656bcfd52b5cea9f4115c06e4c64319609847d45e92418400e7868672c0d3e6e5e6e004a7190476ed77cfc33ad19a4bd2c615ad9950f374",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d20ec9fea6b577c10d26ca1bb446f40b299e648b1ad508aad068896fee3f8e614bc63054d5772bf01a65d412e0bcaa8e965d2f5d332d7f39f846d440ae001f4f87",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "0053bf137fee8922769f8d0fe279caa4dac9c6054ad0460995588a845d0a959e24bc0fc2391a2b92f7bd400f50a11a9db37f07bef7fa8dad2a903fcf534abc8736f7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010010e59be93c4f269c0269c79e2afd65d6aeaa9b701eacc194fb3ee03df47849bf550ec636ebee0ddd4a16f1cd9406605af38f584567770e3f272d688c832e843564",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "01c95ac417c90a520149b29105cdab36f528a23efb5621520dbdafea95a7d43499c4c8be02cd1c2de000da18104fa84a1e9ece6386f0e0efa5234a24595d7c4c96f4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200d9254fdf800496acb33790b103c5ee9fac12832fe546c632225b0f7fce3da4574b1a879b623d722fa8fc34d5fc2a8731aad691a9a8bb8b554c95a051d6aa505acf",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "01b47ec41e3a5abd9dd9808fc04d9078cbed72b9eba98d3c1ded70a29938f0efd5a27a7113ff721f122cb17411de307a355c685074f5766b6d1a033d2fa188c945b6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000005f880f50ec94bfac6658fa2fce05945c6a36b266407b6fbd5437a83e2f2f9b9c50a734872e48e70df65457f13e47d06c6b8b29f4735acf105ea63e051904d18aea",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "013aefe3245728a08c904fe7d61cd9c2fdac63f29cf664d8f161bebacb93f8a710e9692f9689480ad498de00f00061e40e46e76e4754c1130ef4217a58933e0b1dc6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff000000000000010000000000000000f33ffc45da3eac1baab727ab8fd355cfa134c42047d55262651654fb50df7e9a5a75f179c8c86c4388213b5687dc43dfebb37f30128703c44ccd5c3284833b8717",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "0168df272d53e3161926168c4aeab5f355b8d2a6689cfd567f2b6eb2011a18c775ac2a21f8dd497f6957217020b3b1afcb7021f24fccc2523be76a2bff44596e5a14",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00cd2839d857b4699f5c8e8a0194786e26a862f086b4ba80746ae5225ed3aa68f96b7aaec55225830bb98f52d75221141897ba49d7a31ebbf0b6d7d31352e5266190",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "013db1b9241b23d33860d32dec37a79e4546a41afdfdd9c438d04e1f8b566ac8d9d3f572c293e96943722a4ee290e113fffaa82a61867d9ca28d349982354c9b256f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000813d9829119f42ffa95fea8ba9e81e4cd6a6ca97fb0778e12e5f5dfe35201dd4cca8eca0d2e395555997041381e6ac1f18ddf4c74e0b6e9041cfdca1d1c103091",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "01d2bbe9f754584ebbc7c7ad74136d1c8a144948948aa8be49989dd9b4c514db2e2ab1e0713ad1699f632dd2cea53da218ed549f030a113e282fd9e3be462d9aba84",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004010000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff00878ad597d290db2cf660594aeed0f9b7c8dd68451d2d1b2cbc816b1ec4f35465b3964aff2edf1255163f5fca580132f85cade2887a017e7cd0b37196ad85221107",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "000f37a2e2caef54fff4126c0fa96e7c47f0cad74626ef91e589e12d2e1e8c221be7295be9dc2712b87bb0aa0f5880b738bc1242f2ba773bf9eb2a54e3c1ca4758d7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ff00000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000000000010000000000000000000000000000000000b5e1191b449fa1ebdbd677daa48f90e2d1d6c058c877087cafd9364d99dbb283c68402e6e6c5f5411b2ed42824d8b280ceb910aba6847883a7e3780e2132af41c1",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "017aeb254d9c8c8ee06215ff33811357da73bf7f6dd6d7f8f176d62c065a88a9005f680c630e9f2763585ea2ee76b6e4ab45e673f814ebfa95947c0c63fb24fa6e9b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff00207513d615656a1cc7505c18aa21b08e2b1d5a841de0816cc29c004efdb2d902ac1a7bb05e20722b576b64a3ddf4d2486421ac706bf4a424f252386368a5340fb6",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "0061bed42248a37b4625ef04c4f9c7ef69ee3c6f9503378351fcab1b8ce1343206997eec1b88449eb6f7355711ea1a818a486ee30a24126241a7e2289267cf5dd61f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff001fe800c50e54012b75a33e4be7d07c8d60f29680a395e951a6a31c5096b0ea928fc2cbf327dd784dc0a7ca46ea73992b758b5641364b4aba39e93798a4d925a008",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "001067d9104e296ef42b944587de11b10df05d2d959ed44cac9e7ef1c7a05d90819c43bc79c7397918f957cc98db931763bbeb1bdfc35865e8a359a013f13d60c433",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000008dd18a1f5e482140be79bb65a21ad60c8987e532c84345f0135affd46ec71ef02b1ca3ad56f301d955fa306c122d441d6fedcf8b855ef256350bf69d23a7207ad9",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "00b779d83035cf7bb0bb04c7b2f46d08f6791f0d1542c9bcce7250e772b12ad8e38fce1d2b063a06f0fa3a1b072dd976f5f8542979903075162f1f5c6ba3b76cc45d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff800000400000100566203dd325a081c4441f001f780365874fd3d0c9bc47227481afe76a93ae1bfde63af972203abfe22c63b80e83f7cc2184c3cb8cfd0152c54324c4759fd1f9a50",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "01afe5d23733728b79c743933b9ba7dfec5ed19b7737e393908a1d000918aa795d1ce0ad533983d018f927b35d2af6463356573f387febd75911a49486202ca69d3a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff00b11c668fbd549f36889f7b63434051da26f15705839136b1b14a09152d7a182ea7806c35478a32d3aa3c9c1627a61519ebec71b36fa77449025b8829e27f307834",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "019612aeb386febb1a28096fe5b2f682dead02389785225b80a27df439510d08349a193839525f248b7f9bcabfd3dc8da8cc1724022299b7b5e72399d89464b82e44",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000008000000200aa75efc0a8daac1d73f32c9c552414bccf44af8e74331b47439e7dcc49a135b3ee61e9f69717d89b4bba3567a195aeda13fbec634bf2984b5ec6b6f80f5978ed5a",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "00570673f87adcef49c1f011e8b9f1e11f7fd3b3c93114d08d3f515aa4a895a6c701c523063bdc13ad1db0a54f6e7b476fe10db2070441befc58c8cff3c08ef76e59",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0010e59be93c4f269c0269c79e2afd65d6aeaa9b701eacc194fb3ee03df47849bf550ec636ebee0ddd4a16f1cd9406605af38f584567770e3f272d688c832e843564",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "0016aaf228b0aec190d4e4e5b8138ff9cc46d705da1bf002901c6ab420f59314d5b641712b14ef3e4fb125652c47888676804fb5575b741a8408c5625bfccff4fdda",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00d9254fdf800496acb33790b103c5ee9fac12832fe546c632225b0f7fce3da4574b1a879b623d722fa8fc34d5fc2a8731aad691a9a8bb8b554c95a051d6aa505acf",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "00a5d6dfda2b269f4ab895a41c3b71b6ba10d5c9f0d9b3e730275345e4721594abfd39464c227716ded8ef3e60bb1ca0b551716e3f6eebb48d5ce8e0ab58cb1b73c9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "3",
+          "shared" : "00f2246431b597930f2eae61e9aabbd39f8f6ae97c3cf2521a6aeecedda10b5ef5f3b2eb3a8906d02f51d244710aa9e19cc0be21db920132be1c91deb85e466c28df",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "00347c51f587c726070bdeb9173d0a547427ead3f2c8de62d9ecc3013285f645d220931520bcef85d08cfb6786045745fbfbfb1924c44a89d06676131a965677272a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "01c41dc4437c2f2b94a940711b3a691723397a1f83d6bc0c67ddc7a657160925c7f85bb4eb3842b60b2610ddb7c0b8676267710e58359a8750843c6d8e25d48d1cd9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "006a239cdb7a783840658d5f314bfe5c51e806a4bf1236f8421265bcc503c673eb16c5c2b38b5717fa04ee7dbcdeb15c871711507abb7557a8a8c7b3250141e854d5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "0112dbf9713aadd478e4f2ebcb058f05b512b1959c7da1994f851f373ce8c341d39c6843373f6fe559905953e1147640159437953c571961c09bad157a8e1a5bf476",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47adbb6fb71e91386409",
+          "shared" : "003eca2210c8623105085aa284d119f3d716730595c6291aa89bf32a95e8a5fdc64f3d76e92494a43a9dced12d05b6dca4ffe649b32ac12cb0202e702dc83a2cb277",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb5fb71e91386409",
+          "shared" : "01c4cae9fbfdd45de51d8525e8447a7553c35cf358f1346f1d79666887bb749a3ba0de62e1866b47a447d53b6f1ca5a33ec94507e2cfb65544f5a1195fc6b4dc5810",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb67b71e91386409",
+          "shared" : "008073b4796e748f3d0de5e85b22aed463f1a6aecdb336bc287b50d139e3591ef5f86b78c3f6051467755f059f295d758075347d657aaae02383838bb96071eacbd4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71d91386409",
+          "shared" : "01f11ff8983792d4a790d0de4b56d078b9033ad6318a440e8119342937cc48a39375150ab2cf98273b0fe35d5a3af5d84322a685e89f2cb378a99b9b7bac87e44952",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138631b",
+          "shared" : "00286cefaaf38ca4c6657eb9b187d8614d51775fd71c1a79b4c0ef1a0d4ce72b6f5b2bc854a4e78283530942a3f4fd2a8586d5ea51513c89d3d29de5de06321e118e",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 47,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138639b",
+          "shared" : "014790de14c481f1336fcb7d33a8bf8e23eb594cc48608e9edfe0e326e106b67e7eaa3f04ec9985599178f632a5ee6419e11217060e9fcd5958a43882bf8cd3be6ba",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 48,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863db",
+          "shared" : "01ae775dbc4096a3aea7977b1a0af4b2830ecf9ca927a6247fba4cccb46b3f71d0e7abb8dda72d1c1ee7bb5b875b4773cc8df40f732819c4147da330775d1742ea35",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 49,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863fb",
+          "shared" : "01979fb05e068a12a3f20cfdfb9eaee9f22b356edcc7655383ed38124b86814f86a6f2216a34f3fc2299d403ee42408f95d08c5c6cd11db72cbf299a4a3c2545be25",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 50,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386403",
+          "shared" : "0197ebe26798bf67f06ff0282773af75115531f41d94c093d87481b76bef707bc222f2d6672f84a00fa20c5ed27027ab4006b68d93ee2151016c9ddbe014346272e2",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 51,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406",
+          "shared" : "00f2246431b597930f2eae61e9aabbd39f8f6ae97c3cf2521a6aeecedda10b5ef5f3b2eb3a8906d02f51d244710aa9e19cc0be21db920132be1c91deb85e466c28df",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386407",
+          "shared" : "01c168314cdc85757ade34a52a9e5379ffa5968f084b7e404939a8033a0fc698e26211754b9b2c04cf8a1420abe6e986ef1a238bbb91dd402b72e0ed50a876f1a83e",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 53,
+          "comment" : "CVE-2017-10176: Issue with elliptic curve addition",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863f7",
+          "shared" : "01bc33425e72a12779eacb2edcc5b63d1281f7e86dbc7bf99a7abd0cfe367de4666d6edbb8525bffe5222f0702c3096dec0884ce572f5a15c423fdf44d01dd99c61d",
+          "result" : "valid",
+          "flags" : [
+            "CVE_2017_10176"
+          ]
+        },
+        {
+          "tcId" : 54,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "",
+          "public" : "3015301006072a8648ce3d020106052b81040023030100",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "public point not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fe1",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 72,
+          "comment" : "public point = (0,0)",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 73,
+          "comment" : "order = -6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005449",
+          "public" : "30820245308201b806072a8648ce3d0201308201ab020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd166500242fe000000000000000000000000000000000000000000000000000000000000000005ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf7020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 74,
+          "comment" : "order = 0",
+          "public" : "308202043082017706072a8648ce3d02013082016a020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650020100020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 75,
+          "comment" : "order = 1",
+          "public" : "308202043082017706072a8648ce3d02013082016a020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650020101020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 76,
+          "comment" : "order = 1598335257761788022467377781654101148543282249044465229239888363328190330275719844327554513312228302828260696579553960150541916632196023208175974174",
+          "public" : "30820241308201b406072a8648ce3d0201308201a7020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650023e01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 77,
+          "comment" : "generator = (0,0)",
+          "public" : "30820245308201b806072a8648ce3d0201308201ab020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f0004818504000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 78,
+          "comment" : "generator not on curve",
+          "public" : "30820245308201b806072a8648ce3d0201308201ab020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16652024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 79,
+          "comment" : "cofactor = -1",
+          "public" : "30820245308201b806072a8648ce3d0201308201ab020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913864090201ff038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 80,
+          "comment" : "cofactor = 0",
+          "public" : "30820245308201b806072a8648ce3d0201308201ab020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020100038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 81,
+          "comment" : "cofactor = 2",
+          "public" : "30820245308201b806072a8648ce3d0201308201ab020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020102038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 82,
+          "comment" : "cofactor = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005449",
+          "public" : "30820286308201f906072a8648ce3d0201308201ec020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 83,
+          "comment" : "cofactor = None",
+          "public" : "30820242308201b506072a8648ce3d0201308201a8020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 84,
+          "comment" : "modified prime",
+          "public" : "30820244308201b706072a8648ce3d0201308201aa020101304d06072a8648ce3d0101024201e99d17d498f3c68ed8e50430ec4f36c14dbeeaf7652e985636bf0548ffb981e9e011607fd0059cd4fe51e882f19a3839ebe7f1d7376cb761431b214ed76970cc0130818604411662e82b670c3971271afbcf13b0c93eb24115089ad167a9c940fab700467e161fee9f802ffa632b01ae177d0e65c7c614180e28c893489ebce4deb128968f33fb044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f0004818504000000000000000000000000000000000000000000000a14517cc6b91f8000000000000000000000000000000000000000000000000000000000000000000000032c006b0f530bec5bed532357d436727699f0e3c5b9366f1a435be640b97cd43d937655b1f157c7d0c7df25011fef7c3ab7d8e556e6125b59b847fcdd89a4051796a797024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913864090201010381860004000000000000000000000000000000000000000000000a14517cc6b91f8000000000000000000000000000000000000000000000000000000000000000000000032c006b0f530bec5bed532357d436727699f0e3c5b9366f1a435be640b97cd43d937655b1f157c7d0c7df25011fef7c3ab7d8e556e6125b59b847fcdd89a4051796a797",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00ebef6771455911ee573c183e990f7086650f9bafdb722c896751bd2c0f87959c78a39382d10fdfb46fd3515c8feb590943dd79778b13adbc7f670ba2a009753483",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 85,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 86,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 87,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 88,
+          "comment" : "a = 0",
+          "public" : "308202033082017606072a8648ce3d020130820169020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3046040100044109a88e6f050cfefa0b49fac45689b6b93ad4fa3b65db7d2f4cb31b67fe056a100066dd80dc5f785d27f82e3369eb22ab2c5729a9e5d9906a1dc31e02f84026484a0481850400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 89,
+          "comment" : "public key of order 3",
+          "public" : "30820244308201b706072a8648ce3d0201308201aa020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308186044163dd8adacb707513ee414c8ef43488d841c6dee055e7524338729de3f0f80d5a7f5a2f9451681187763175d5fa44b124a736c1e335ab2bc44e90afd9d73afdcf81044139acb17f9aea561444370f028fabe3abd6abc36dfaecd355019c030fc56571cb027a33c4ded31a03d257c8e05180a0199487dcc6bfa009db62b36021c7ca0767720481850401955425b4109a40c74ada7d7fb4fe7b160a9fc16955847666b6450b0905ca920866e52664275b0b3cf7b9e2628dde865ed6ce3c8596638c1acbb71608dd81005b1001197944c6bf8dd7b06144a5b7cd32746aac97c8a5bc6274acd571fece0c14c9e57122e8e6d7d70db21d55d0123f004fd9698067392de468abfeef8890103b954e51024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020101038186000401955425b4109a40c74ada7d7fb4fe7b160a9fc16955847666b6450b0905ca920866e52664275b0b3cf7b9e2628dde865ed6ce3c8596638c1acbb71608dd81005b1000e686bb394072284f9ebb5a4832cd8b955368375a439d8b532a8e0131f3eb361a8edd17192828f24de2aa2fedc0ffb026967f98c6d21b97540110776fefc46ab1ae",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "01f1f914da0c64135b9c4334c82393abf73d3112a1197581e9c8e97b2e3c02696f6d445400aefb87eda50aced68209f961e1af3fa37efbde303880a4371b776085ab",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 90,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004af6dd5b71a8c1cf921e36854ae091aaa589d337e740e8579f816eb9e36b03eec5cf956d0fdd2fc1687335507fc1c4a5717d3b5b8ea8340d1",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000453366db79b320781936df61bb55d4499949d813ee5abaa5dda70da4f97f68228ccc69d7cd0b7266cfc28d0dcafdf3e83738cc611acb08f8b896c4ecf82dd65ae",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004aa45c13ce3cfea8538422712903edc0ce56df74ede0776e843555a786f9738de1943dffd729addfd4772169751d7765a45b5bb540a47d198f4c8c7c21e67560c1e12f70b64520109bb8858a3f8d6bb4012003431db0778633313fdb9464c47ec",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000475e01a1555380be188d69aac340a4675e4a6f73d63976a1075249827d8ecc2a31e65ed1eb591954e33a38f68ef8aa6c930229d8755e53257602b3eaa87de6f02",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004905a06d5bc093697155aaff67305976a769b904d8db9573c4be361626def2ffe1d5ec14462c02e5ffb24fb3edb2b6c77a5cfee2492db757b",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200042b87df1b6a5cbc4c4a184b7eec9b6c0483f7b80e6477b29649630c37481876bb0e3423f7a00d469320b7e60c88370979064efb9ceb8b387aa87a7c6941ccd9ed",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000470df62394ee036eefbc8ef11a9a5f3a8af659016f29e7125e52cfda0a74e52c7b21d18ac4375f5e4164c5338fa2f545a3fb2022f0e0686d5b4882958f72b1bb626e37093e3f19673968c237823327fd6",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004808dc7b1c6d3ec470a7fe5d6144c9c3a8c92b116103aa2edbfce0b2c827312eebcd1350d09a739eac901af341487861b195270f671e0a758deb23222db4fe7983d42a785b35fd158344cd6483c4da5b409e77d0a284dfa9c3e0d91a4d275fce9",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aa11b560dc1e572f2374e5869210304d66d95b1d8ce40940157f5f5b4a7dc8a340f7c305d6bea289f5c430eb888e2a03528336aaf4680d9d153cd162e2229df330425025df2625b147568927f6acf704e4936f8989ff9d44f33ee22196e70dfd8711e8934d8d42abb4b67afcfee213c3ad5e5c83fcf4283d253d6c5c0e581970",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00048d7a746de095728a8d83219e587040cb6e794d088ab6eab426638202579850b0f235edcf4eb8adcb51bf41878f6b71a1f2d4101022964340",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000424ad316bf41e4102dd7ae16311b64464df2d13ea68a11dd27a4445ed900962180ff8c627ed73f0c667863ee3a671e6ed1fa2781b51a229ee2cd21fbf69437d60",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004548ce4997cc618800d3834dd4b3346e4559be066ab5d0cecd7123c4de940c168fecd3bae067fe3fc7aee875c9da0a86932f0779f42344470860c22dbc6f305eab792fc0874157e175c7d3c4d3bf54c4b",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200044fc2b35e3019a57a8ca6efe2ec1f72072c599a78c2725f7cfc2d9edf220b5f6abdb0c0d8d160182de451e26bcbb4e8c18726263e21ce56fb4bafaa1f186c745e2c8392ef8c5a1c03f5462ebbbcde0ffcc31e9a0b3e898ddb9c1c79e420fd7a35",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200047122f743122681ac73b0d611af86847d8bec654cf99e7eaf5d4f684e4078a8e61dc6d07e831ad02cd40d41dbdb6b0e877d960b78a5ac34c1e6ce7c483503d6de2eaddeffbfb3f144d29d13535a05815934186707146e45f64476bbdbc8645be973270a4c5e35d70ffd5eab2f08d1fb04762bc8aa80e999da14f744be9ff8c923",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "invalid public key",
+          "public" : "3058301006072a8648ce3d020106052b810400230344000200429cb431c18f5f4e4e502f74214e6ac5ec2c3f86b830bac24de95feae142ca7d9aa8aa5b34f55af4b2848f2e6ba6df4c3ecd401a1d7b2a8287a332b202196fadbb",
+          "private" : "1c1fb2cac9087a3397814b198a80e2ea5b437aac1b41e8a2bd8fef8700e4812aa817320e6e1e3865bd2cf75e43a78be5c27ff1c4b5f5019333cb37d0c9c4ff3ec61",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 105,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3058301006072a8648ce3d020106052b81040023034400020108cbf3c9bf8e42135d87127556831076d84d5e549e645afda8a099249231b59b6c508dee4e91c9a543e90ebc82613f86cb1290e29102a0f2fdeb57bf4193fb4639",
+          "private" : "6619644155c449758f65e2dfe7ba89dee1e090c1d68b6342f43cb1ac000090a7f0408138c1de217990bb015cd1d95f1d884cf659f7324f2fe21eeba63ea988aacd",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 106,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3058301006072a8648ce3d020106052b8104002303440003011f2dca6b686e2141c11822e2d5439261583ce98cd6c4041c6d1be9e17dee33ea4a65c3e8cca6de50a30a39c788a585f1188bef0680a9c0264b3c8dcf494d0eb948",
+          "private" : "0a257d97aa4e5195e2919c147c1639bb0da0cce479a036489006b7b8e7e885096066e5adc8fe7c45940c5a6b94d5065b966a45f099a0cecfe9cce1b3e99dca479f2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 107,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3058301006072a8648ce3d020106052b8104002303440002011f2dca6b686e2141c11822e2d5439261583ce98cd6c4041c6d1be9e17dee33ea4a65c3e8cca6de50a30a39c788a585f1188bef0680a9c0264b3c8dcf494d0eb948",
+          "private" : "0a257d97aa4e5195e2919c147c1639bb0da0cce479a036489006b7b8e7e885096066e5adc8fe7c45940c5a6b94d5065b966a45f099a0cecfe9cce1b3e99dca479f3",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 108,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3058301006072a8648ce3d020106052b81040023034400030108cbf3c9bf8e42135d87127556831076d84d5e549e645afda8a099249231b59b6c508dee4e91c9a543e90ebc82613f86cb1290e29102a0f2fdeb57bf4193fb4639",
+          "private" : "6619644155c449758f65e2dfe7ba89dee1e090c1d68b6342f43cb1ac000090a7f0408138c1de217990bb015cd1d95f1d884cf659f7324f2fe21eeba63ea988aacc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 109,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3058301006072a8648ce3d020106052b81040023034400020009cc73141cf1843d2b2c95dc5cbc4d615c6da4814c1c7208615d8e78c7a8666aba1852faaa45a45d32bd0fde6ea78f262a96bf1e02949cea48c33c695103683048",
+          "private" : "2a35258787f91ad0bd3432c3022e4d3ed349c8768a7e7caa1836022fc0c89a9073f6ce14d0990d5b7bb413061c7160e7bd566a5c89f14901b2cc19f1ad531f41e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 110,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3058301006072a8648ce3d020106052b81040023034400030047b9cf28e04b38796858545d60d6133fbdc20ede086e5d95111c982b8c276628235e536c075637a97c0a6c30d02b83b19e578203473eea16dfdeaeccb1dc0d9b19",
+          "private" : "1afe5c77a626161fb2c25964c7895b9fff787099db83f077f05a4bfa320fb61f9315bb44d3fb9dd72225d9d993a18df82ac53fb4a5f86b23cb650e5e4778066f677",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 111,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3058301006072a8648ce3d020106052b810400230344000300c18410f5727ee0101a52ef95c0ac455cbc65bf9967f0a2c419aa0a291cabad569f2337e102d0a9128f4212dbf9fa9e5a8f14ca7f28e82977281facdd9ca7a92c78",
+          "private" : "24ae709e1644e3087b52470c565268becbdbf97de59916763507d109c2e5b7c21727c64e9b560aa248d7bc9fe0ac95720d507263b7b2859b056ea165301cd599d5",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 112,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3058301006072a8648ce3d020106052b810400230344000200c18410f5727ee0101a52ef95c0ac455cbc65bf9967f0a2c419aa0a291cabad569f2337e102d0a9128f4212dbf9fa9e5a8f14ca7f28e82977281facdd9ca7a92c78",
+          "private" : "24ae709e1644e3087b52470c565268becbdbf97de59916763507d109c2e5b7c21727c64e9b560aa248d7bc9fe0ac95720d507263b7b2859b056ea165301cd599d6",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 113,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3058301006072a8648ce3d020106052b81040023034400020047b9cf28e04b38796858545d60d6133fbdc20ede086e5d95111c982b8c276628235e536c075637a97c0a6c30d02b83b19e578203473eea16dfdeaeccb1dc0d9b19",
+          "private" : "1afe5c77a626161fb2c25964c7895b9fff787099db83f077f05a4bfa320fb61f9315bb44d3fb9dd72225d9d993a18df82ac53fb4a5f86b23cb650e5e4778066f678",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 114,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3058301006072a8648ce3d020106052b81040023034400030009cc73141cf1843d2b2c95dc5cbc4d615c6da4814c1c7208615d8e78c7a8666aba1852faaa45a45d32bd0fde6ea78f262a96bf1e02949cea48c33c695103683048",
+          "private" : "2a35258787f91ad0bd3432c3022e4d3ed349c8768a7e7caa1836022fc0c89a9073f6ce14d0990d5b7bb413061c7160e7bd566a5c89f14901b2cc19f1ad531f41e1",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 115,
+          "comment" : "length contains leading 0",
+          "public" : "3082009b301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 116,
+          "comment" : "length contains leading 0",
+          "public" : "30819d3082001006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 117,
+          "comment" : "length contains leading 0",
+          "public" : "30819d3012068200072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 118,
+          "comment" : "length contains leading 0",
+          "public" : "30819d301206072a8648ce3d0201068200052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 119,
+          "comment" : "length contains leading 0",
+          "public" : "30819c301006072a8648ce3d020106052b81040023038200860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 120,
+          "comment" : "wrong length",
+          "public" : "309c301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 121,
+          "comment" : "wrong length",
+          "public" : "309a301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 122,
+          "comment" : "wrong length",
+          "public" : "30819b301106072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 123,
+          "comment" : "wrong length",
+          "public" : "30819b300f06072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 124,
+          "comment" : "wrong length",
+          "public" : "30819b301006082a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 125,
+          "comment" : "wrong length",
+          "public" : "30819b301006062a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 126,
+          "comment" : "wrong length",
+          "public" : "30819b301006072a8648ce3d020106062b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 127,
+          "comment" : "wrong length",
+          "public" : "30819b301006072a8648ce3d020106042b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 128,
+          "comment" : "wrong length",
+          "public" : "30819a301006072a8648ce3d020106052b8104002303870004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 129,
+          "comment" : "wrong length",
+          "public" : "30819a301006072a8648ce3d020106052b8104002303850004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 130,
+          "comment" : "uint32 overflow in length",
+          "public" : "3085010000009b301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 131,
+          "comment" : "uint32 overflow in length",
+          "public" : "3081a03085010000001006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 132,
+          "comment" : "uint32 overflow in length",
+          "public" : "3081a03015068501000000072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 133,
+          "comment" : "uint32 overflow in length",
+          "public" : "3081a0301506072a8648ce3d0201068501000000052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 134,
+          "comment" : "uint32 overflow in length",
+          "public" : "30819f301006072a8648ce3d020106052b81040023038501000000860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 135,
+          "comment" : "uint64 overflow in length",
+          "public" : "308901000000000000009b301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 136,
+          "comment" : "uint64 overflow in length",
+          "public" : "3081a4308901000000000000001006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 137,
+          "comment" : "uint64 overflow in length",
+          "public" : "3081a4301906890100000000000000072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 138,
+          "comment" : "uint64 overflow in length",
+          "public" : "3081a4301906072a8648ce3d020106890100000000000000052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 139,
+          "comment" : "uint64 overflow in length",
+          "public" : "3081a3301006072a8648ce3d020106052b8104002303890100000000000000860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 140,
+          "comment" : "length = 2**31 - 1",
+          "public" : "30847fffffff301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 141,
+          "comment" : "length = 2**31 - 1",
+          "public" : "30819f30847fffffff06072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 142,
+          "comment" : "length = 2**31 - 1",
+          "public" : "30819f301406847fffffff2a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 143,
+          "comment" : "length = 2**31 - 1",
+          "public" : "30819f301406072a8648ce3d020106847fffffff2b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 144,
+          "comment" : "length = 2**31 - 1",
+          "public" : "30819e301006072a8648ce3d020106052b8104002303847fffffff0004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "length = 2**32 - 1",
+          "public" : "3084ffffffff301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "length = 2**32 - 1",
+          "public" : "30819f3084ffffffff06072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "length = 2**32 - 1",
+          "public" : "30819f30140684ffffffff2a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "length = 2**32 - 1",
+          "public" : "30819f301406072a8648ce3d02010684ffffffff2b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "length = 2**32 - 1",
+          "public" : "30819e301006072a8648ce3d020106052b810400230384ffffffff0004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "length = 2**40 - 1",
+          "public" : "3085ffffffffff301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "length = 2**40 - 1",
+          "public" : "3081a03085ffffffffff06072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "length = 2**40 - 1",
+          "public" : "3081a030150685ffffffffff2a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "length = 2**40 - 1",
+          "public" : "3081a0301506072a8648ce3d02010685ffffffffff2b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "length = 2**40 - 1",
+          "public" : "30819f301006072a8648ce3d020106052b810400230385ffffffffff0004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3088ffffffffffffffff301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3081a33088ffffffffffffffff06072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3081a330180688ffffffffffffffff2a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3081a3301806072a8648ce3d02010688ffffffffffffffff2b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "length = 2**64 - 1",
+          "public" : "3081a2301006072a8648ce3d020106052b810400230388ffffffffffffffff0004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "incorrect length",
+          "public" : "30ff301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "incorrect length",
+          "public" : "30819b30ff06072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "incorrect length",
+          "public" : "30819b301006ff2a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "incorrect length",
+          "public" : "30819b301006072a8648ce3d020106ff2b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "incorrect length",
+          "public" : "30819a301006072a8648ce3d020106052b8104002303ff0004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "indefinite length without termination",
+          "public" : "3080301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "indefinite length without termination",
+          "public" : "30819b308006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "indefinite length without termination",
+          "public" : "30819b301006802a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "indefinite length without termination",
+          "public" : "30819b301006072a8648ce3d020106802b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "indefinite length without termination",
+          "public" : "30819a301006072a8648ce3d020106052b8104002303800004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "removing sequence",
+          "public" : "",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "removing sequence",
+          "public" : "3081890381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "lonely sequence tag",
+          "public" : "30",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "lonely sequence tag",
+          "public" : "30818a300381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "appending 0's to sequence",
+          "public" : "30819d301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d500000",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "appending 0's to sequence",
+          "public" : "30819d301206072a8648ce3d020106052b8104002300000381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "prepending 0's to sequence",
+          "public" : "30819d0000301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "prepending 0's to sequence",
+          "public" : "30819d3012000006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "appending unused 0's to sequence",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d500000",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "appending unused 0's to sequence",
+          "public" : "30819d301006072a8648ce3d020106052b8104002300000381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "appending null value to sequence",
+          "public" : "30819d301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d500500",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "appending null value to sequence",
+          "public" : "30819d301206072a8648ce3d020106052b8104002305000381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "including garbage",
+          "public" : "3081a149817730819b301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "including garbage",
+          "public" : "3081a0250030819b301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "including garbage",
+          "public" : "30819e30819b301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d500004deadbeef",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "including garbage",
+          "public" : "3081a03015498177301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "including garbage",
+          "public" : "30819f30142500301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "including garbage",
+          "public" : "3081a33012301006072a8648ce3d020106052b810400230004deadbeef0381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "including garbage",
+          "public" : "3081a03015260c49817706072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "including garbage",
+          "public" : "30819f3014260b250006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "including garbage",
+          "public" : "3081a33018260906072a8648ce3d02010004deadbeef06052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "including garbage",
+          "public" : "3081a0301506072a8648ce3d0201260a49817706052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "including garbage",
+          "public" : "30819f301406072a8648ce3d02012609250006052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "including garbage",
+          "public" : "3081a3301806072a8648ce3d0201260706052b810400230004deadbeef0381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "including garbage",
+          "public" : "3081a1301006072a8648ce3d020106052b8104002323818c4981770381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "including garbage",
+          "public" : "3081a0301006072a8648ce3d020106052b8104002323818b25000381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "including garbage",
+          "public" : "3081a4301006072a8648ce3d020106052b810400232381890381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d500004deadbeef",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "including undefined tags",
+          "public" : "3081a4aa00bb00cd0030819b301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "including undefined tags",
+          "public" : "3081a2aa02aabb30819b301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "including undefined tags",
+          "public" : "3081a33018aa00bb00cd00301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "including undefined tags",
+          "public" : "3081a13016aa02aabb301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "including undefined tags",
+          "public" : "3081a33018260faa00bb00cd0006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "including undefined tags",
+          "public" : "3081a13016260daa02aabb06072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "including undefined tags",
+          "public" : "3081a3301806072a8648ce3d0201260daa00bb00cd0006052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "including undefined tags",
+          "public" : "3081a1301606072a8648ce3d0201260baa02aabb06052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "including undefined tags",
+          "public" : "3081a4301006072a8648ce3d020106052b8104002323818faa00bb00cd000381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "including undefined tags",
+          "public" : "3081a2301006072a8648ce3d020106052b8104002323818daa02aabb0381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "truncated length of sequence",
+          "public" : "3081",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "truncated length of sequence",
+          "public" : "30818b30810381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Replacing sequence with NULL",
+          "public" : "0500",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Replacing sequence with NULL",
+          "public" : "30818b05000381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "changing tag value of sequence",
+          "public" : "2e819b301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "changing tag value of sequence",
+          "public" : "2f819b301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "changing tag value of sequence",
+          "public" : "31819b301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "changing tag value of sequence",
+          "public" : "32819b301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "changing tag value of sequence",
+          "public" : "ff819b301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "changing tag value of sequence",
+          "public" : "30819b2e1006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 217,
+          "comment" : "changing tag value of sequence",
+          "public" : "30819b2f1006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 218,
+          "comment" : "changing tag value of sequence",
+          "public" : "30819b311006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 219,
+          "comment" : "changing tag value of sequence",
+          "public" : "30819b321006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 220,
+          "comment" : "changing tag value of sequence",
+          "public" : "30819bff1006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 221,
+          "comment" : "dropping value of sequence",
+          "public" : "3000",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 222,
+          "comment" : "dropping value of sequence",
+          "public" : "30818b30000381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 223,
+          "comment" : "truncate sequence",
+          "public" : "30819a301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 224,
+          "comment" : "truncate sequence",
+          "public" : "30819a1006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 225,
+          "comment" : "truncate sequence",
+          "public" : "30819a300f06072a8648ce3d020106052b8104000381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 226,
+          "comment" : "truncate sequence",
+          "public" : "30819a300f072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 227,
+          "comment" : "indefinite length",
+          "public" : "3080301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d500000",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 228,
+          "comment" : "indefinite length",
+          "public" : "30819d308006072a8648ce3d020106052b8104002300000381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 229,
+          "comment" : "indefinite length with truncated delimiter",
+          "public" : "3080301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d5000",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 230,
+          "comment" : "indefinite length with truncated delimiter",
+          "public" : "30819c308006072a8648ce3d020106052b81040023000381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 231,
+          "comment" : "indefinite length with additional element",
+          "public" : "3080301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d5005000000",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 232,
+          "comment" : "indefinite length with additional element",
+          "public" : "30819f308006072a8648ce3d020106052b81040023050000000381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 233,
+          "comment" : "indefinite length with truncated element",
+          "public" : "3080301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50060811220000",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 234,
+          "comment" : "indefinite length with truncated element",
+          "public" : "3081a1308006072a8648ce3d020106052b810400230608112200000381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 235,
+          "comment" : "indefinite length with garbage",
+          "public" : "3080301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d500000fe02beef",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 236,
+          "comment" : "indefinite length with garbage",
+          "public" : "3081a1308006072a8648ce3d020106052b810400230000fe02beef0381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 237,
+          "comment" : "indefinite length with nonempty EOC",
+          "public" : "3080301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d500002beef",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 238,
+          "comment" : "indefinite length with nonempty EOC",
+          "public" : "30819f308006072a8648ce3d020106052b810400230002beef0381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 239,
+          "comment" : "prepend empty sequence",
+          "public" : "30819d3000301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 240,
+          "comment" : "prepend empty sequence",
+          "public" : "30819d3012300006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 241,
+          "comment" : "append empty sequence",
+          "public" : "30819d301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d503000",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 242,
+          "comment" : "append empty sequence",
+          "public" : "30819d301206072a8648ce3d020106052b8104002330000381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 243,
+          "comment" : "sequence of sequence",
+          "public" : "30819e30819b301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 244,
+          "comment" : "sequence of sequence",
+          "public" : "30819d3012301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 245,
+          "comment" : "truncated sequence",
+          "public" : "3012301006072a8648ce3d020106052b81040023",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 246,
+          "comment" : "truncated sequence",
+          "public" : "308194300906072a8648ce3d02010381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 247,
+          "comment" : "repeat element in sequence",
+          "public" : "30820124301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d500381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 248,
+          "comment" : "repeat element in sequence",
+          "public" : "3081a2301706072a8648ce3d020106052b8104002306052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 249,
+          "comment" : "long form encoding of length",
+          "public" : "30819c30811006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 250,
+          "comment" : "long form encoding of length",
+          "public" : "30819c30110681072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 251,
+          "comment" : "long form encoding of length",
+          "public" : "30819c301106072a8648ce3d02010681052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 252,
+          "comment" : "removing oid",
+          "public" : "308192300706052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 253,
+          "comment" : "lonely oid tag",
+          "public" : "30819330080606052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 254,
+          "comment" : "lonely oid tag",
+          "public" : "308195300a06072a8648ce3d0201060381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 255,
+          "comment" : "appending 0's to oid",
+          "public" : "30819d301206092a8648ce3d0201000006052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 256,
+          "comment" : "appending 0's to oid",
+          "public" : "30819d301206072a8648ce3d020106072b8104002300000381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 257,
+          "comment" : "prepending 0's to oid",
+          "public" : "30819d3012060900002a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 258,
+          "comment" : "prepending 0's to oid",
+          "public" : "30819d301206072a8648ce3d0201060700002b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 259,
+          "comment" : "appending unused 0's to oid",
+          "public" : "30819d301206072a8648ce3d0201000006052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 260,
+          "comment" : "appending null value to oid",
+          "public" : "30819d301206092a8648ce3d0201050006052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 261,
+          "comment" : "appending null value to oid",
+          "public" : "30819d301206072a8648ce3d020106072b8104002305000381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 262,
+          "comment" : "truncated length of oid",
+          "public" : "3081943009068106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 263,
+          "comment" : "truncated length of oid",
+          "public" : "308196300b06072a8648ce3d020106810381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 264,
+          "comment" : "Replacing oid with NULL",
+          "public" : "3081943009050006052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 265,
+          "comment" : "Replacing oid with NULL",
+          "public" : "308196300b06072a8648ce3d020105000381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 266,
+          "comment" : "changing tag value of oid",
+          "public" : "30819b301004072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 267,
+          "comment" : "changing tag value of oid",
+          "public" : "30819b301005072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 268,
+          "comment" : "changing tag value of oid",
+          "public" : "30819b301007072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 269,
+          "comment" : "changing tag value of oid",
+          "public" : "30819b301008072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 270,
+          "comment" : "changing tag value of oid",
+          "public" : "30819b3010ff072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 271,
+          "comment" : "changing tag value of oid",
+          "public" : "30819b301006072a8648ce3d020104052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 272,
+          "comment" : "changing tag value of oid",
+          "public" : "30819b301006072a8648ce3d020105052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 273,
+          "comment" : "changing tag value of oid",
+          "public" : "30819b301006072a8648ce3d020107052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 274,
+          "comment" : "changing tag value of oid",
+          "public" : "30819b301006072a8648ce3d020108052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 275,
+          "comment" : "changing tag value of oid",
+          "public" : "30819b301006072a8648ce3d0201ff052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 276,
+          "comment" : "dropping value of oid",
+          "public" : "3081943009060006052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 277,
+          "comment" : "dropping value of oid",
+          "public" : "308196300b06072a8648ce3d020106000381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 278,
+          "comment" : "modify first byte of oid",
+          "public" : "30819b30100607288648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 279,
+          "comment" : "modify first byte of oid",
+          "public" : "30819b301006072a8648ce3d0201060529810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 280,
+          "comment" : "modify last byte of oid",
+          "public" : "30819b301006072a8648ce3d028106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 281,
+          "comment" : "modify last byte of oid",
+          "public" : "30819b301006072a8648ce3d020106052b810400a30381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 282,
+          "comment" : "truncate oid",
+          "public" : "30819a300f06062a8648ce3d0206052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 283,
+          "comment" : "truncate oid",
+          "public" : "30819a300f06068648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 284,
+          "comment" : "truncate oid",
+          "public" : "30819a300f06072a8648ce3d020106042b8104000381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 285,
+          "comment" : "truncate oid",
+          "public" : "30819a300f06072a8648ce3d02010604810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 286,
+          "comment" : "wrong oid",
+          "public" : "30819e3013060a3262306530333032316106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 287,
+          "comment" : "wrong oid",
+          "public" : "3081a6301b061236303836343830313635303330343032303106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 288,
+          "comment" : "wrong oid",
+          "public" : "3081a0301506072a8648ce3d0201060a326230653033303231610381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 289,
+          "comment" : "wrong oid",
+          "public" : "3081a8301d06072a8648ce3d020106123630383634383031363530333034303230310381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 290,
+          "comment" : "longer oid",
+          "public" : "3081a4301906103261383634386365336430323031303106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 291,
+          "comment" : "longer oid",
+          "public" : "3081a2301706072a8648ce3d0201060c3262383130343030323330310381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 292,
+          "comment" : "oid with modified node",
+          "public" : "3081a23017060e326138363438636533643032313106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 293,
+          "comment" : "oid with modified node",
+          "public" : "3081aa301f06163261383634386365336430323838383038303830303106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 294,
+          "comment" : "oid with modified node",
+          "public" : "3081a0301506072a8648ce3d0201060a326238313034303033330381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 295,
+          "comment" : "oid with modified node",
+          "public" : "3081a8301d06072a8648ce3d020106123262383130343030383838303830383032330381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 296,
+          "comment" : "large integer in oid",
+          "public" : "3081b430290620326138363438636533643032383238303830383038303830383038303830303106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 297,
+          "comment" : "large integer in oid",
+          "public" : "3081b2302706072a8648ce3d0201061c326238313034303038323830383038303830383038303830383032330381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 298,
+          "comment" : "oid with invalid node",
+          "public" : "3081a5301a0611326138363438636533643032303165303306052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 299,
+          "comment" : "oid with invalid node",
+          "public" : "30819c301106082a808648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 300,
+          "comment" : "oid with invalid node",
+          "public" : "3081a3301806072a8648ce3d0201060d326238313034303032336530330381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 301,
+          "comment" : "oid with invalid node",
+          "public" : "30819c301106072a8648ce3d020106062b80810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 302,
+          "comment" : "lonely bit string tag",
+          "public" : "3013301006072a8648ce3d020106052b8104002303",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 303,
+          "comment" : "appending 0's to bit string",
+          "public" : "30819d301006072a8648ce3d020106052b810400230381880004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d500000",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 304,
+          "comment" : "prepending 0's to bit string",
+          "public" : "30819d301006072a8648ce3d020106052b8104002303818800000004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 305,
+          "comment" : "appending null value to bit string",
+          "public" : "30819d301006072a8648ce3d020106052b810400230381880004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d500500",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 306,
+          "comment" : "truncated length of bit string",
+          "public" : "3014301006072a8648ce3d020106052b810400230381",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 307,
+          "comment" : "Replacing bit string with NULL",
+          "public" : "3014301006072a8648ce3d020106052b810400230500",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 308,
+          "comment" : "changing tag value of bit string",
+          "public" : "30819b301006072a8648ce3d020106052b810400230181860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 309,
+          "comment" : "changing tag value of bit string",
+          "public" : "30819b301006072a8648ce3d020106052b810400230281860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 310,
+          "comment" : "changing tag value of bit string",
+          "public" : "30819b301006072a8648ce3d020106052b810400230481860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 311,
+          "comment" : "changing tag value of bit string",
+          "public" : "30819b301006072a8648ce3d020106052b810400230581860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 312,
+          "comment" : "changing tag value of bit string",
+          "public" : "30819b301006072a8648ce3d020106052b81040023ff81860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 313,
+          "comment" : "dropping value of bit string",
+          "public" : "3014301006072a8648ce3d020106052b810400230300",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 314,
+          "comment" : "modify first byte of bit string",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860204017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 315,
+          "comment" : "modify last byte of bit string",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32dd0",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 316,
+          "comment" : "truncate bit string",
+          "public" : "30819a301006072a8648ce3d020106052b810400230381850004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 317,
+          "comment" : "truncate bit string",
+          "public" : "30819a301006072a8648ce3d020106052b8104002303818504017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 318,
+          "comment" : "declaring bits as unused in a bit-string",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860104017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 319,
+          "comment" : "unused bits in a bit-string",
+          "public" : "30819f301006072a8648ce3d020106052b8104002303818a2004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d5001020304",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 320,
+          "comment" : "unused bits in empty bit-string",
+          "public" : "3015301006072a8648ce3d020106052b81040023030103",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        },
+        {
+          "tcId" : 321,
+          "comment" : "128 unused bits",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381868004017ee16985c3678234d272913682a7c122b35c1c5011d1933bb7b08c8b883afcf469453079e2ef02a724a6ddbe25ee3b2e63007dd2838c5bb00fa1ff8fd18cf81eaa01116ce049d63f22f71c7d11c0acd67cacd1b4ea0125bd48e872dc5cc9fc4073b7c844c4b42223483b4aa8402b198d981dc8b7aba048749b4a0496e2537d3cc32d50",
+          "private" : "18c3c384368133e46c99ad2421ff44eed459b5d209cb2aa70b09bd7d38cc6225164a9815dff6d69afbf49f80da22f6ea33454b6544b69b3330008c6a22259f9f9e5",
+          "shared" : "00d397252813d37329b9e277823e2dfccdd1ee519f0c32ccbb3f5fc62062e8c07dbf3fb86085736115b70f86f44ad852f3488ecbb5e7ec31e961e869b40b6add05f5",
+          "result" : "acceptable",
+          "flags" : [
+            "InvalidAsn"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdh_test.json b/third_party/wycheproof/testvectors/ecdh_test.json
new file mode 100644
index 0000000..e832016
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdh_test.json
@@ -0,0 +1,16478 @@
+{
+  "algorithm" : "ECDH",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "AddSubChain" : "The private key has a special value. Implementations using addition subtraction chains for the point multiplication may get the point at infinity as an intermediate result. See CVE_2017_10176",
+    "CVE_2017_10176" : "This test vector leads to an EC point multiplication where an intermediate result can be the point at infinity, if addition-subtraction chains are used to speed up the point multiplication.",
+    "CompressedPoint" : "The point in the public key is compressed. Not every library supports points in compressed format.",
+    "GroupIsomorphism" : "Some EC groups have isomorphic groups that allow an efficient implementation. This is a test vector that contains values that are edge cases on such an isomorphic group.",
+    "InvalidPublic" : "The public key has been modified and is invalid. An implementation should always check whether the public key is valid and on the same curve as the private key. The test vector includes the shared secret computed with the original public key if the public point is on the curve of the private key. Generating a shared secret other than the one with the original key likely indicates that the bug is exploitable.",
+    "IsomorphicPublicKey" : "The public key in this test vector uses an isomorphic curve. Such isomorphisms are sometimes used to speed up implementations. For example the brainpool curves are using this.",
+    "ModifiedPrime" : "The modulus of the public key has been modified. The public point of the public key has been chosen so that it is both a point on both the curve of the modified public key and the private key.",
+    "UnnamedCurve" : "The public key does not use a named curve. RFC 3279 allows to encode such curves by explicitly encoding, the parameters of the curve equation, modulus, generator, order and cofactor. However, many crypto libraries only support named curves. Modifying some of the EC parameters and encoding the corresponding public key as an unnamed curve is a potential attack vector.",
+    "UnusedParam" : "A parameter that is typically not used for ECDH has been modified. Sometimes libraries ignore small differences between public and private key. For example, a library might ignore an incorrect cofactor in the public key. We consider ignoring such changes as acceptable as long as these differences do not change the outcome of the ECDH computation, i.e. as long as the computation is done on the curve from the private key.",
+    "WeakPublicKey" : "The vector contains a weak public key. The curve is not a named curve, the public key point has order 3 and has been chosen to be on the same curve as the private key. This test vector is used to check ECC implementations for missing steps in the verification of the public key.",
+    "WrongOrder" : "The order of the public key has been modified. If this order is used in a cryptographic primitive instead of the correct order then private keys may leak. E.g. ECDHC in BC 1.52 suffered from this."
+  },
+  "numberOfTests" : 1676,
+  "header" : [],
+  "testGroups" : [
+    {
+      "curve" : "secp224r1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "normal case",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00047d8ac211e1228eb094e285a957d9912e93deee433ed777440ae9fc719b01d050dfbe653e72f39491be87fb1a2742daa6e0a2aada98bb1aca",
+          "private" : "565577a49415ca761a0322ad54e4ad0ae7625174baf372c2816f5328",
+          "shared" : "b8ecdb552d39228ee332bafe4886dbff272f7109edf933bc7542bd4f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "compressed public key",
+          "public" : "3032301006072a8648ce3d020106052b81040021031e00027d8ac211e1228eb094e285a957d9912e93deee433ed777440ae9fc71",
+          "private" : "565577a49415ca761a0322ad54e4ad0ae7625174baf372c2816f5328",
+          "shared" : "b8ecdb552d39228ee332bafe4886dbff272f7109edf933bc7542bd4f",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004e73a6ca72f3a2fae6e0a01a0ed03bfa3058b04576942eaf063095e62ca16fd31fa0f38eeb592cbeea1147751fdd2a5b6cc0ead404467a5b6",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "00000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00045763fa2ae16367ad23d471cc9a52466f0d81d864e5640cefe384114594d9fecfbed4f254505ac8b41d2532055a07f0241c4818b552cbb636",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "00000000000000000000000100000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004142c1fd80fa2121a59aa898144084ec033f7a56a34eee0b499e29ae51c6d8c1bbb1ef2a76d565899fe44ffc1207d530d7f598fb77f4bb76b",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "00000000000000ffffffffffffff0000000000000100000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ed6f793e10c80d12d871cf8988399c4898a9bf9ffd8f27399f63de25f0051cdf4eec7f368f922cfcd948893ceca0c92e540cc4367a99a66a",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "00000000ffffffffffffffff00000000000000010000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000408fcfc1a63c82860be12e4137433dfc40be9acdd245f9a8c4e56be61a385fc09f808383383f4b1d0d5365b6e5dcfacdc19bc7bcfed221274",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004d883ed77f1861e8712800d31df67888fe39f150c79a27aa88caeda6b180f3f623e2ff3ab5370cf8179165b085af3dd4502850c0104caed9a",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "0003fffffff00000003fffffff00000003fffffff000000040000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00042b8b279b85ee3f3d2c0abeb36fdfc5aad6157d652d26489381a32cd73224bd757ef794acc92b0b3b9e7990618bb343a9a09bdb9d3616eff6",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "01fffffffc00000007fffffff00000001fffffffc000000080000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00048bd5f03391eeeae1744e8fc53d314efffafa4d3fa4f1b95c3388a9cd7c86358b273119c537133eb55e79c6ac510b10980b379b919ccf2e2f",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "0a15c112ff784b1445e889f955be7e3ffdf451a2c0e76ab5cb32cf41",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ce9631b6a16227778625c8e5421ae083cdd913abefde01dbe69f6c2b95386aff2b483b2c47151cfaabfd000614c683ce2e1778221ae42c1b",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "62989eaaa26a16f07330c3c51e0a4631fd016bfcede26552816aee39",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00041f441c98eda956a6a7fdbfd8d21910860ab59d16c3e52f8e7fad6ca5df61a55fc508fc0499c55492f1e87bb2faa0cb4170b79f3a85ec2f3d",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "661ac958c0febbc718ccf39cefc6b66c4231fbb9a76f35228a3bf5c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004be74583cb9d3a05ae54923624e478a329a697d842dfae33141c844d7d9ba4fc96e0fe716ac0542e87368662fc2f0cb9b0ae57936ddec7190",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "6d7e41821abe1094d430237923d2a50de31768ab51b12dce8a09e34c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004a281ad992b363597ac93ff0de8ab1f7e51a6672dcbb58f9d739ba430ce0192874038daefc3130eec65811c7255da70fea65c1003f6892faa",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004be3e22133f51203f631b81dde8c020cdea5daa1f99cfc05c88fad2dc0f243798d6e72d1de9e3cdca4144e0a6c0f2a584d07589006972c197",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004af14547c20afbd91bfe64ea03d45a76a71241f23520ef897ff91eff1b54ca6ca8c25fd73852ec6654617434eff7f0225684d4dea7a4f8a97",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "ffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004b1e484925018729926acda56ff3e2f6c1e7e8f162b178d8e8afb45564fceaa6da5d998fe26b6b26a055169063a5ab6908852ca8b54e2de6c",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "fffff0000007fffffe000000ffffffc000001ffffff8000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "edge case for shared secret",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004937eb09fb145c8829cb7df20a4cbeed396791373de277871d6c5f9cc3b5b4fd56464a71fc4a2a6af3bd251952bffa829489e68a8d06f96b6",
+          "private" : "0a2b6442a37f9201b56758034d2009be64b0ab7c02d7e398cac9665d6",
+          "shared" : "ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004000000000000000000000000000000000000000000000000000000037cac269c67bd55ea14efff4eadefe5e74978514af14c88fab46ec046",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "3fa0b9ff70b884f9f57bb84f7a9532d93f6ba803f89dd8ff008177d7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004000000000000000000000001000000000000000000000000000000012ea2f4917bdfdb008306cc10a18e2557633ba861001829dcbfb96fba",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "be1ded8cb7ff8a585181f96d681e31b332fe27dcae922dca2310300d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000400000000000000ffffffffffffff000000000000010000000000000073ca5f8f104997a2399e0c7f25e72a75ec29fc4542533d3fea89a33a",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "a2e86a260e13515918a0cafdd87855f231b5624c560f976159e06a75",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000400000000ffffffffffffffff000000000000000100000000000000006fe6805f59b19b0dd389452a1d4a420bfeb6c369cf6fed5b12e6e654",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "31ef7c8d10404a0046994f313a70574b027e87f9028eca242c1b5bf5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff77c5cfa4e2c384938d48bd8dd98f54c86b279f1df8c0a1f6692439c9",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "d1976a8ef5f54f24f5a269ad504fdca849fc9c28587ba294ef267396",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00040003fffffff00000003fffffff00000003fffffff00000004000000001f0828136016bb97445461bc59f2175d8d23557d6b9381f26136e3d",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "ce7890d108ddb2e5474e6417fcf7a9f2b3bd018816062f4835260dc8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000401fffffffc00000007fffffff00000001fffffffc0000000800000012d8acca6f199d4a94b933ba1aa713a7debde8ac57b928f596ae66a66",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "30b6ff6e8051dae51e4fe34b2d9a0b1879153e007eb0b5bdf1791a9c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00040a15c112ff784b1445e889f955be7e3ffdf451a2c0e76ab5cb32cf413d4df973c563c6decdd435e4f864557e4c273096d9941ca4260a266e",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "77ec668a00f72d85aa527624abb16c039fe490d17dd6c455a1ed7fd8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000462989eaaa26a16f07330c3c51e0a4631fd016bfcede26552816aee39389ee9436d616cab90032931aa7fbbfcfc13309f61e2423cc8dab93c",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "a3f432f6aba9a92f49a5ea64ffe7059a9d9b487a0b5223ddc988208b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004661ac958c0febbc718ccf39cefc6b66c4231fbb9a76f35228a3bf5c3103b8040e3cb41966fc64a68cacb0c14053f87d27e8ed7bf2d7fe51b",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "1530fd9caf03737af34a4ba716b558cbecbc35d18402535a0a142313",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00046d7e41821abe1094d430237923d2a50de31768ab51b12dce8a09e34c276cf273d75d367820dd556182def0957af0a314f48fed227c298dc0",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "cfc39ccacb94ad0e0552b2e47112f60fbbe7ae0dc32230b9273dd210",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00047fffffffffffffffffffffffffffffffffffffffffffffffffffffff7d8dbca36c56bcaae92e3475f799294f30768038e816a7d5f7f07d77",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "73bd63bd384a0faafb75cfed3e95d3892cbacf0db10f282c3b644771",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc000800174f1ff5ea7fbc72b92f61e06556c26bab84c0b082dd6400ca1c1eb6d",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "85b079c62e1f5b0fd6841dfa16026e15b641f65e13a14042567166bb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0126fdd5fccd0b5aa7fd5bb5b1308584b30556248cec80208a2fe962",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "8a834ff40e3fc9f9d412a481e18537ea799536c5520c6c7baaf12166",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004fffff0000007fffffe000000ffffffc000001ffffff8000003ffffff20cfa23077acc9fbcb71339c65880cd0b966b8a9497e65abed17f0b5",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "a0887269766e6efcbc81d2b38f2d4638663f12377468a23421044188",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffff00000000ffffffff00000000ffffffff00000000ffffffff1c05ac2d4f10b69877c3243d51f887277b7bf735c326ab2f0d70da8c",
+          "private" : "2bc15cf3981f4e15bbad387b506df647989e5478160be862f8c26969",
+          "shared" : "c65d1911bc076a74588d8793ce7a0dcabf5793460cd2ebb02754a1be",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "3",
+          "shared" : "e71f2157bfe37697ea5193d4732dcc6e5412fa9d38387eacd391c1c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "fa2664717c7fa0161ec2c669b2c0986cdc20456a6e5406302bb53c77",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "1000000000000000000000000000000000000000000000000000000",
+          "shared" : "af6e5ad34497bae0745f53ad78ce8b285d79f400d5c6e6a071f8e6bd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "12fd302ff8c13c55a9c111f8bb6b0a13ecf88299c0ae3032ce2bcaff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "080000000000000000000000000000000000000000000000000000000",
+          "shared" : "73f1a395b842f1a6752ae417e2c3dc90cafc4476d1d861b7e68ad030",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03d13dd29455c5c2a3d",
+          "shared" : "b329c20ddb7c78ee4e622bb23a984c0d273ba34b6269f3d9e8f89f8e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13cd29455c5c2a3d",
+          "shared" : "6f48345209b290ffc5abbe754a201479e5d667a209468080d06197b4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13d529455c5c2a3d",
+          "shared" : "9f6e30c1c9dad42a153aacd4b49a8e5c721d085cd07b5d5aec244fc1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13dd29445c5c2a3d",
+          "shared" : "8cadfb19a80949e61bd5b829ad0e76d18a5bb2eeb9ed7fe2b901cecd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c29b7",
+          "shared" : "475fd96e0eb8cb8f100a5d7fe043a7a6851d1d611da2643a3c6ae708",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 45,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a37",
+          "shared" : "41ef931d669d1f57d8bb95a01a92321da74be8c6cbc3bbe0b2e73ebd",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 46,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a",
+          "shared" : "e71f2157bfe37697ea5193d4732dcc6e5412fa9d38387eacd391c1c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "edge case private key",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004478e73465bb1183583f4064e67e8b4343af4a05d29dfc04eb60ac2302e5b9a3a1b32e4208d4c284ff26822e09c3a9a4683443e4a35175504",
+          "private" : "0ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3b",
+          "shared" : "11ff15126411299cbd49e2b7542e69e91ef132e2551a16ecfebb23a3",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 48,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000400000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000400000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00040000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00040000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000400000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffff000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000400000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffffffffffffffffffffffffffff000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffffffffffffffffffffffffffff000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffffffffffffffffffffffffffff00000000000000000000000100000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffffffffffffffffffffffffffff00000000000000000000000100000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffffffffffffffffffffffffffff000000000000000000000001ffffffffffffffffffffffffffffffff000000000000000000000000",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "point is not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffffffffffffffffffffffffffff000000000000000000000001ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "",
+          "public" : "3015301006072a8648ce3d020106052b81040021030100",
+          "private" : "0c6cafb74e2a5b5ed4b991cbbfbc28c18f6df208b6d05e7a2e6668014",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "public point not on curve",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5d",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 66,
+          "comment" : "public point = (0,0)",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 67,
+          "comment" : "order = -26959946667150639794667015087019625940457807714424391721682722368061",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021dff0000000000000000000000000000e95d1f470fc1ec22d6baa3a3d5c3020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 68,
+          "comment" : "order = 0",
+          "public" : "3081f73081b806072a8648ce3d02013081ac020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34020100020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 69,
+          "comment" : "order = 1",
+          "public" : "3081f73081b806072a8648ce3d02013081ac020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34020101020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 70,
+          "comment" : "order = 6277101735386680763835789423207665314073163949517624387909",
+          "public" : "3082010f3081d006072a8648ce3d02013081c4020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021900ffffffffffffffffffffffffffff16a2e0b8f03e13dd2945020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 71,
+          "comment" : "generator = (0,0)",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb40439040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 72,
+          "comment" : "generator not on curve",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e36021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 73,
+          "comment" : "cofactor = -1",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d0201ff033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 74,
+          "comment" : "cofactor = 0",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020100033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 75,
+          "comment" : "cofactor = 2",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020102033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 76,
+          "comment" : "cofactor = 26959946667150639794667015087019625940457807714424391721682722368061",
+          "public" : "3082012f3081f006072a8648ce3d02013081e4020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 77,
+          "comment" : "cofactor = None",
+          "public" : "308201103081d106072a8648ce3d02013081c5020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 78,
+          "comment" : "modified prime",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00c123da0a46a971da9468161e61a5c71a02e6c9bdb3392f4016fb457b303c041c3edc25f5b9568e256b97e9e19e5a38e4fd1936424cc6d0bfe904ba83041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4043904000000000000000000285145f31ae4d40000000000000000000003387edad63d1a600740ce66b6f04d67ed06ea1a75c16294336ed05b3fa3021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101033a0004000000000000000000285145f31ae4d40000000000000000000003387edad63d1a600740ce66b6f04d67ed06ea1a75c16294336ed05b3fa3",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "3de0a5036fcde544c72cbe33cedb8709549bc3b6a4d750ee0de4c80d",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 79,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 80,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 81,
+          "comment" : "a = 0",
+          "public" : "3081f83081b906072a8648ce3d02013081ad020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff0000000000000000000000013021040100041cd0d5e347a38ce5b6e1f47edddd8a223bca45d2015de76ec835a4df57043904a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101033a0004a10fb7bf22d299fc5bc43bd2d0e8da28af28ace8430bee28f9e5b57554275c0615d8d9a3011d7bc4c1c4cf4a834c8dc46f25b98854401a5b",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "9b992dad1c2b5dadd3b5aeb84b7a91fb6fe5f46e02ab2c7fa32696a7",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 82,
+          "comment" : "public key of order 3",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff000000000000000000000001303c041ce7a362cacbe0cc77d95c4868c22f1ce547191f4636f26b9d2f25b07e041c95053dc7ca44618c27cb0f0e3b954a5019d10d9f08bce793755d8468043904800163296bbe35f54a8166d8452f80597d896f35afba33534b910bc63cea6f440a6d313fd31252dfe2190188e99481950dc117d9a1aed088021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101033a0004800163296bbe35f54a8166d8452f80597d896f35afba33534b910bc6c31590bbf592cec02cedad201de6fe76166b7e6af23ee8265e512f79",
+          "private" : "0d07629eb653a169ae3231ea1030faaf3e7f8ffe388030ee315d0a1d2",
+          "shared" : "67b3a42a01e4a4d6277d9348a280c0b5534c299908d9b10afb7365ab",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 83,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ea36cf70fab75684eabe6569ce623db0deaa8c95f61c8be50b8b9f3eb7d4b9ec48d9e4814f4cb1c286589eaaa990d3f3238b2d6d6be964abfad964824b653376",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200044b2470ad3d13269c10a17d222ebdffbd61fb04488db1b1d7caef8d4988b7bb8ba6d81857a05b255232b9e37a30e328bb9d9c42d86096f2bcee3d258cfe208d2fd03cbd5ccc6a3bb8ce4b0efa5b059b4afbd0377aa6e274721a57efe8ee85d86a",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004012841a2260f0f1f424865fef275374779bf0355720223f8ec6a9ba767b1603b492f58a6bba1705d882257bc6be1935de4411c5f1fdad44ec65ba8b97ce0e73e1ac90006937832a602147e37c1a42ca2a63629ffc9a35b31bfacb38c6242b42916125f7446b45c718f797259bc3011cb71e868560b331cf7d01139a0643443f9fd7306c1",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004c2199fecf75648c0e952dff143821fa4012b28f90435ce6ee54653687f969a76092a3844e17d478a594f43b28cc10a5c553b4f64906121031c3a79299c70dbd6",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00046caa3d6d86f792df7b29e41eb4203150f60f4fca10f57d0b2454abfb201f9f7e6dcbb92bdcfb9240dc86bcaeaf157c77bca22b2ec86ee8d6",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200042750180012c3ba7489517d428e4826784e50b50ac42ef7991c61a396c03a52da5e74908ae8a89627a7c15e554b105b0ebaeebcfed10e3ea60223d0a8bc3b36ab",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200045b523d3a8f20f6a569c6951e0b8de48d89e7549a184e8506820421c3e404473692cd248d7480843b911d87a87e401112fce0d3d2c36978cf6dd7f1d93bfaebe0827d4bf4006006d3202e842126fe1b68",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004449607c76c6dc7334c269a0ebab5beec83b6c263377ce06ef5c276f45a9916eff85f50438f5f32ced0210a6c414fe5e242c7c1070823f5395b35965bda6758acf84725f11ea836dda7d391fee91342026645241853224a437a6fb74e4cdc871f",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000463e7a491240848e4f53ea5fb857d428c493053193e4b0b4f995ac8bf4c56276a507870131a384aa7e236c64cd7a049a1b37e40ad00c3b8a920dcbad6531616356ce1b6e6d96a7d1b693e25e5abd83ab560a3d764bcd49ec98a1b49421163bd5fc5a625f44c91eb4c2984d5a2e51e816ebdee8fbe08364bb14b7ac876990e64d9",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00047c592ecb8908355d1ebf8d59b3619275dbe3666209b72ced6a3c88740456ce61d6a84e0542d7cd10dd8804afb8c784d5dffd9480d8cfdc95",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004746226a3e005c37ede51828d3375ef91ebd0ff719a380af69d7dfd131b42a3e8917d4a4d573872935a74d1040f1c47d25d6b26f4156cccdcdc11833b9cde433a",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200043298b36825c7bd90ab5157b913d40bbfd732a0de0557e02a2c65a0c223e9a65d62c32462040dd6fe578103023c831caff122c1ed4b8ff7373fa2f08d11c9f4c7f85f81802262ffed9bb82cb6d92eed2d",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200043af2849b981f7e5e6ab936e6abb4f206c1fd5561998df8008bfe98d84173c9f2301cdbd5bffc569c0b5a57ce2a8f4d640f1816475fc6043baa8e5a3453bf327b54cb29c7e54a5f31348969aa94615094dbcd1a8e5c2d630465e45fc556c02194",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e038182000453d2506047e72af6d98558e1633ecb7e6a05c37861cd3289455cf41bfbf1703f2e9a83052b8eca7d84cba2f001abd8b978f68b69ed6bd874755c44d347fe302c5760b2078c56b24ebd0dcd99f26b8f8a23044b3767a3d2a306587687a7b00668974674edbf18c3db2f3473a97ee77065fdcdd1a9aa053716a4c504f3d18b9170",
+          "private" : "2ddd06cb77ca2eae5266a34a107b49e56ffb4c2d3952112da2df90fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "invalid public key",
+          "public" : "3032301006072a8648ce3d020106052b81040021031e00020ca753db5ddeca474241f8d2dafc0844343fd0e37eded2f0192d51b2",
+          "private" : "0fc28a0ca0f8e36b0d4f71421845135a22aef543b9fddf8c775b2d18f",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        }
+      ]
+    },
+    {
+      "curve" : "secp256r1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 98,
+          "comment" : "normal case",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000462d5bd3372af75fe85a040715d0f502428e07046868b0bfdfa61d731afe44f26ac333a93a9e70a81cd5a95b5bf8d13990eb741c8c38872b4a07d275a014e30cf",
+          "private" : "612465c89a023ab17855b0a6bcebfd3febb53aef84138647b5352e02c10c346",
+          "shared" : "53020d908b0219328b658b525f26780e3ae12bcd952bb25a93bc0895e1714285",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "compressed public key",
+          "public" : "3039301306072a8648ce3d020106082a8648ce3d0301070322000362d5bd3372af75fe85a040715d0f502428e07046868b0bfdfa61d731afe44f26",
+          "private" : "612465c89a023ab17855b0a6bcebfd3febb53aef84138647b5352e02c10c346",
+          "shared" : "53020d908b0219328b658b525f26780e3ae12bcd952bb25a93bc0895e1714285",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 100,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000458fd4168a87795603e2b04390285bdca6e57de6027fe211dd9d25e2212d29e62080d36bd224d7405509295eed02a17150e03b314f96da37445b0d1d29377d12c",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040f6d20c04261ecc3e92846acad48dc8ec5ee35ae0883f0d2ea71216906ee1c47c042689a996dd12830ae459382e94aac56b717af2e2080215f9e41949b1f52be",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "00000000000000000000000000000000ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400c7defeb1a16236738e9a1123ba621bc8e9a3f2485b3f8ffde7f9ce98f5a8a1cb338c3912b1792f60c2b06ec5231e2d84b0e596e9b76d419ce105ece3791dbc",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "0000000000000000ffffffffffffffff00000000000000010000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004e9b98fb2c0ac045f8c76125ffd99eb8a5157be1d7db3e85d655ec1d8210288cf218df24fd2c2746be59df41262ef3a97d986744b2836748a7486230a319ffec0",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff0000000100000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004e9484e58f3331b66ffed6d90cb1c78065fa28cfba5c7dd4352013d3252ee4277bd7503b045a38b4b247b32c59593580f39e6abfa376c3dca20cf7f9cfb659e13",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004767d7fbb84aa6a4db1079372644e42ecb2fec200c178822392cb8b950ffdd0c91c86853cafd09b52ba2f287f0ebaa26415a3cfabaf92c6a617a19988563d9dea",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c74d546f2fcc6dd392f85e5be167e358de908756b0c0bb01cb69d864ca083e1c93f959eece6e10ee11bd3934207d65ae28af68b092585a1509260eceb39b92ef",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "085ec5a4af40176b63189069aeffcb229c96d3e046e0283ed2f9dac21b15ad3c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000434fc9f1e7a094cd29598d1841fa9613dbe82313d633a51d63fb6eff074cc9b9a4ecfd9f258c5c4d4210b49751213a24c596982bd1d54e0445443f21ef15492a5",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "190c25f88ad9ae3a098e6cffe6fd0b1bea42114eb0cedd5868a45c5fe277dff3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d5c96efd1907fd48de2ad715acf82eae5c6690fe3efe16a78d61c68d3bfd10df03eac816b9e7b776192a3f5075887c0e225617505833ca997cda32fd0f673c5e",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "507442007322aa895340cba4abc2d730bfd0b16c2c79a46815f8780d2c55a2dd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f475f503a770df72c45aedfe42c008f59aa57e72b232f26600bdd0353957cb20bdb8f6405b4918050a3549f44c07a8eba820cdce4ece699888c638df66f54f7c",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "5f177bfe19baaaee597e68b6a87a519e805e9d28a70cb72fd40f0fe5a754ba45",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f3cb6754b7e2a86d064dfb9f903185aaa4c92b481c2c1a1ff276303bbc4183e49c318599b0984c3563df339311fe143a7d921ee75b755a52c6f804f897b809f7",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "7fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cce13fbdc96a946dfb8c6d9ed762dbd1731630455689f57a437fee124dd54cecaef78026c653030cf2f314a67064236b0a354defebc5e90c94124e9bf5c4fc24",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "8000000000000000000000000000000000000000000000000000000000000004",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047633dfd0ad06765097bc11bd5022b200df31f28c4ff0625421221ac7eeb6e6f4cb9c67693609ddd6f92343a5a1c635408240f4f8e27120c12554c7ff8c76e2fe",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a386ace573f87558a68ead2a20088e3fe928bdae9e109446f93a078c15741f0421261e6db2bf12106e4c6bf85b9581b4c0302a526222f90abc5a549206b11011",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "ff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048e7b50f7d8c44d5d3496c43141a502f4a43f153d03ad43eda8e39597f1d477b8647f3da67969b7f989ff4addc393515af40c82085ce1f2ee195412c6f583774f",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "edge case for shared secret",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c827fb930fd51d926086191b502af83abb5f717debc8de29897a3934b2571ca05990c0597b0b7a2e42febd56b13235d1d408d76ed2c93b3facf514d902f6910a",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "ffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cbc1b31b43f17dc200dd70c2944c04c6cb1b082820c234a300b05b7763844c74fde0a4ef93887469793270eb2ff148287da9265b0334f9e2609aac16e8ad503",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "7fffffffffffffffffffffffeecf2230ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042830d96489ae24b79cad425056e82746f9e3f419ab9aa21ca1fbb11c7325e7d318abe66f575ee8a2f1c4a80e35260ae82ad7d6f661d15f06967930a585097ef7",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000000000000000000000000111124f400000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004450b6b6e2097178e9d2850109518d28eb3b6ded2922a5452003bc2e4a4ec775c894e90f0df1b0e6cadb03b9de24f6a22d1bd0a4a58cd645c273cae1c619bfd61",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000000000000000000000001ea77d449ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cbc1b31b43f17dc200dd70c2944c04c6cb1b082820c234a300b05b7763844c7b021f5b006c778ba686cd8f14d00eb7d78256d9b4fccb061d9f6553e91752afc",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "7fffffffffffffffffffffffeecf2230ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042830d96489ae24b79cad425056e82746f9e3f419ab9aa21ca1fbb11c7325e7d3e754198fa8a1175e0e3b57f1cad9f517d528290a9e2ea0f96986cf5a7af68108",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000000000000000000000000111124f400000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004450b6b6e2097178e9d2850109518d28eb3b6ded2922a5452003bc2e4a4ec775c76b16f0e20e4f194524fc4621db095dd2e42f5b6a7329ba3d8c351e39e64029e",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000000000000000000000001ea77d449ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200049a0f0e3dd31417bbd9e298bc068ab6d5c36733af26ed67676f410c804b8b2ca1b02c82f3a61a376db795626e9400557112273a36cddb08caaa43953965454730",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "7fffffffffffffffffffffffca089011ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048e5d22d5e53ec797c55ecd68a08a7c3361cd99ca7fad1a68ea802a6a4cb58a918ea7a07023ef67677024bd3841e187c64b30a30a3750eb2ee873fbe58fa1357b",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "0000000000000000000000001f6bd1e500000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004293aa349b934ab2c839cf54b8a737df2304ef9b20fa494e31ad62b315dd6a53c118182b85ef466eb9a8e87f9661f7d017984c15ea82043f536d1ee6a6d95b509",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000000000000000000000002099f55d5ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200049a0f0e3dd31417bbd9e298bc068ab6d5c36733af26ed67676f410c804b8b2ca14fd37d0b59e5c893486a9d916bffaa8eedd8c5ca3224f73555bc6ac69abab8cf",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "7fffffffffffffffffffffffca089011ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048e5d22d5e53ec797c55ecd68a08a7c3361cd99ca7fad1a68ea802a6a4cb58a9171585f8edc1098998fdb42c7be1e7839b4cf5cf6c8af14d1178c041a705eca84",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "0000000000000000000000001f6bd1e500000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004293aa349b934ab2c839cf54b8a737df2304ef9b20fa494e31ad62b315dd6a53cee7e7d46a10b99156571780699e082fe867b3ea257dfbc0ac92e1195926a4af6",
+          "private" : "0a0d622a47e48f6bc1038ace438c6f528aa00ad2bd1da5f13ee46bf5f633d71a",
+          "shared" : "000000000000000000000002099f55d5ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000000000000000000000000000000000000000000000066485c780e2f83d72433bd5d84a06bb6541c2af31dae871728bf856a174f93f4",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "cfe4077c8730b1c9384581d36bff5542bc417c9eff5c2afcb98cc8829b2ce848",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000000000000000000000000000000ffffffffffffffffffffffffffffffff4f2b92b4c596a5a47f8b041d2dea6043021ac77b9a80b1343ac9d778f4f8f733",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "49ae50fe096a6cd26698b78356b2c8adf1f6a3490f14e364629f7a0639442509",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040000000000000000ffffffffffffffff0000000000000001000000000000000138120be6ab31edfa34768c4387d2f84fb4b0be8a9a985864a1575f4436bb37b0",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "5a1334572b2a711ead8b4653eb310cd8d9fd114399379a8f6b872e3b8fdda2d9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000000ffffffff00000000ffffffff00000000ffffffff0000000100000000462c0466e41802238d6c925ecbefc747cfe505ea196af9a2d11b62850fce946e",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "c73755133b6b9b4b2a00631cbc7940ecbe6ec08f20448071422e3362f2556888",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff1582fa32e2d4a89dfcfb3d0b149f667dba3329490f4d64ee2ad586c0c9e8c508",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "06fa1059935e47a9fd667e13f469614eb257cc9a7e3fc599bfb92780d59b146d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010001684c8a9586ed6f9cbe447058a7da2108bab1e5e0a60d1f73e4e2e713f0a3dfe0",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "f237df4c10bd3e357971bb2b16b293566b7e355bdc8141d6c92cabc682983c45",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004085ec5a4af40176b63189069aeffcb229c96d3e046e0283ed2f9dac21b15ad3c7859f97cb6e203f46bf3438f61282325e94e681b60b5669788aeb0655bf19d38",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "d874b55678d0a04d216c31b02f3ad1f30c92caaf168f34e3a743356d9276e993",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004190c25f88ad9ae3a098e6cffe6fd0b1bea42114eb0cedd5868a45c5fe277dff321b8342ef077bc6724112403eaee5a15b4c31a71589f02ded09cd99cc5db9c83",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "11a8582057463fc76fda3ab8087eb0a420b0d601bb3134165a369646931e52a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004507442007322aa895340cba4abc2d730bfd0b16c2c79a46815f8780d2c55a2dd4619d69f9940f51663aa12381bc7cf678bd1a72a49fbc11b0b69cb22d1af9f2d",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "4e173a80907f361fe5a5d335ba7685d5eba93e9dfc8d8fcdb1dcd2d2bde27507",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045f177bfe19baaaee597e68b6a87a519e805e9d28a70cb72fd40f0fe5a754ba4562ca1103f70a2006cd1f67f5f6a3580b29dc446abc90e0e910c1e05a9aa788cd",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "73220471ec8bad99a297db488a34a259f9bc891ffaf09922e6b5001f5df67018",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff2e2213caf03033e0fd0f7951154f6e6c3a9244a72faca65e9ce9eeb5c8e1cea9",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "55d0a203e22ffb523c8d2705060cee9d28308b51f184beefc518cff690bad346",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000480000000000000000000000000000000000000000000000000000000000000042be8789db81bb4870a9e60c5c18c80c83de464277281f1af1e640843a1a3148e",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "2518d846e577d95e9e7bc766cde7997cb887fb266d3a6cb598a839fd54aa2f4f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000722540f8a471c379083c600b58fde4d95c7dcad5095f4219fc5e9bdde3c5cd39",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "bdb49f4bdf42ac64504e9ce677b3ec5c0a03828c5b3efad726005692d35c0f26",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff5df80fc6cae26b6c1952fbd00ed174ee1209d069335f5b48588e29e80b9191ad",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "f503ac65637e0f17cb4408961cb882c875e4c6ef7a548d2d52d8c2f681838c55",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff2c63650e6a5d332e2987dd09a79008e8faabbd37e49cb016bfb92c8cd0f5da77",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "e3c18e7d7377dc540bc45c08d389bdbe255fa80ca8faf1ef6b94d52049987d21",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff7a116c964a4cd60668bf89cffe157714a3ce21b93b3ca607c8a5b93ac54ffc0a",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "516d6d329b095a7c7e93b4023d4d05020c1445ef1ddcb3347b3a27d7d7f57265",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047fffffffffffffffffffffffeecf2230ffffffffffffffffffffffffffffffff00000001c7c30643abed0af0a49fe352cb483ff9b97dccdf427c658e8793240d",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "6fd26661851a8de3c6d06f834ef3acb8f2a5f9c136a985ffe10d5eeb51edcfa3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 145,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047fffffffffffffffffffffffeecf2230fffffffffffffffffffffffffffffffffffffffd383cf9bd5412f50f5b601cad34b7c00746823320bd839a71786cdbf2",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "6fd26661851a8de3c6d06f834ef3acb8f2a5f9c136a985ffe10d5eeb51edcfa3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 146,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047fffffffffffffffffffffffca089011ffffffffffffffffffffffffffffffff267bfdf8a61148decd80283732dd4c1095e4bb40b9658408208dc1147fffffff",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "44236c8b9505a19d48774a3903c0292759b0f826e6ac092ff898d87e53d353fc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 147,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047fffffffffffffffffffffffca089011ffffffffffffffffffffffffffffffffd984020659eeb722327fd7c8cd22b3ef6a1b44c0469a7bf7df723eeb80000000",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "44236c8b9505a19d48774a3903c0292759b0f826e6ac092ff898d87e53d353fc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 148,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000000111124f4000000000000000000000000000000000000000d12d381b0760b1c50be8acf859385052c7f53cde67ce13759de3123a0",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "f1f0e43b374feb7e7f96d4ffe7519fa8bb6c3cfd25f6f87dab2623d2a2d33851",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 149,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000000111124f400000000000000000000000000000000fffffff1ed2c7e5089f4e3af4175307a6c7afad480ac3219831ec8a621cedc5f",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "f1f0e43b374feb7e7f96d4ffe7519fa8bb6c3cfd25f6f87dab2623d2a2d33851",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 150,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040000000000000000000000001f6bd1e5000000000000000000000000000000004096edd6871c320cb8a9f4531751105c97b4c257811bbc32963eaf39ffffffff",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "3ebbace1098a81949d5605dd94a7aa88dc396c2c23e01a9c8cca5bb07bfbb6a1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 151,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040000000000000000000000001f6bd1e500000000000000000000000000000000bf69122878e3cdf447560bace8aeefa3684b3da97ee443cd69c150c600000000",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "3ebbace1098a81949d5605dd94a7aa88dc396c2c23e01a9c8cca5bb07bfbb6a1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 152,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000001ea77d449ffffffffffffffffffffffffffffffff000000007afbc0b325e820646dec622fb558a51c342aa257f4b6a8ec5ddf144f",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "1b085213a9c89d353e1111af078c38c502b7b4771efba51f589b5be243417bdc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 153,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000001ea77d449fffffffffffffffffffffffffffffffffffffffe85043f4dda17df9b92139dd04aa75ae4cbd55da80b495713a220ebb0",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "1b085213a9c89d353e1111af078c38c502b7b4771efba51f589b5be243417bdc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 154,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000002099f55d5ffffffffffffffffffffffffffffffff152c1a22d823a27855ed03f8e2ab5038bb1df4d87e43865f2daf6948ffffffff",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "67cb63566c7ceb12fdd85ce9d2f77c359242bbaa0ea1bf3cf510a4a26591d1f1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 155,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004000000000000000000000002099f55d5ffffffffffffffffffffffffffffffffead3e5dc27dc5d88aa12fc071d54afc744e20b2881bc79a0d25096b700000000",
+          "private" : "55d55f11bb8da1ea318bca7266f0376662441ea87270aa2077f1b770c4854a48",
+          "shared" : "67cb63566c7ceb12fdd85ce9d2f77c359242bbaa0ea1bf3cf510a4a26591d1f1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 156,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "3",
+          "shared" : "85a0b58519b28e70a694ec5198f72c4bfdabaa30a70f7143b5b1cd7536f716ca",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 157,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "a329a7d80424ea2d6c904393808e510dfbb28155092f1bac284dceda1f13afe5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 158,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "100000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "bd26d0293e8851c51ebe0d426345683ae94026aca545282a4759faa85fde6687",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 159,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "ea9350b2490a2010c7abf43fb1a38be729a2de375ea7a6ac34ff58cc87e51b6c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 160,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "08000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "34eed3f6673d340b6f716913f6dfa36b5ac85fa667791e2d6a217b0c0b7ba807",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 161,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e83f3b9cac2fc632551",
+          "shared" : "1354ce6692c9df7b6fc3119d47c56338afbedccb62faa546c0fe6ed4959e41c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 162,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3a9cac2fc632551",
+          "shared" : "fe7496c30d534995f0bf428b5471c21585aaafc81733916f0165597a55d12cb4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 163,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b1cac2fc632551",
+          "shared" : "348bf8042e4edf1d03c8b36ab815156e77c201b764ed4562cfe2ee90638ffef5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 164,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac1fc632551",
+          "shared" : "6e4ec5479a7c20a537501700484f6f433a8a8fe53c288f7a25c8e8c92d39e8dc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 165,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324f3",
+          "shared" : "f7407d61fdf581be4f564621d590ca9b7ba37f31396150f9922f1501da8c83ef",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632533",
+          "shared" : "82236fd272208693e0574555ca465c6cc512163486084fa57f5e1bd2e2ccc0b3",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632543",
+          "shared" : "06537149664dba1a9924654cb7f787ed224851b0df25ef53fcf54f8f26cd5f3f",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254b",
+          "shared" : "f2b38539bce995d443c7bfeeefadc9e42cc2c89c60bf4e86eac95d51987bd112",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e",
+          "shared" : "85a0b58519b28e70a694ec5198f72c4bfdabaa30a70f7143b5b1cd7536f716ca",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 170,
+          "comment" : "edge case private key",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000431028f3377fc8f2b1967edaab90213acad0da9f50897f08f57537f78f116744743a1930189363bbde2ac4cbd1649cdc6f451add71dd2f16a8a867f2b17caa16b",
+          "private" : "0ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f",
+          "shared" : "027b013a6f166db655d69d643c127ef8ace175311e667dff2520f5b5c75b7659",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "CVE-2017-8932",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004023819813ac969847059028ea88a1f30dfbcde03fc791d3a252c6b41211882eaf93e4ae433cc12cf2a43fc0ef26400c0e125508224cdb649380f25479148a4ad",
+          "private" : "2a265f8bcbdcaf94d58519141e578124cb40d64a501fba9c11847b28965bc737",
+          "shared" : "4d4de80f1534850d261075997e3049321a0864082d24a917863366c0724f5ae3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 172,
+          "comment" : "CVE-2017-8932",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cc11887b2d66cbae8f4d306627192522932146b42f01d3c6f92bd5c8ba739b06a2f08a029cd06b46183085bae9248b0ed15b70280c7ef13a457f5af382426031",
+          "private" : "313f72ff9fe811bf573176231b286a3bdb6f1b14e05c40146590727a71c3bccd",
+          "shared" : "831c3f6b5f762d2f461901577af41354ac5f228c2591f84f8a6e51e2e3f17991",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 173,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 174,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 175,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040000000000000000000000000000000000000000000000000000000000000000ffffffff00000001000000000000000000000000fffffffffffffffffffffffe",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 176,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040000000000000000000000000000000000000000000000000000000000000000ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 177,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 178,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 179,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040000000000000000000000000000000000000000000000000000000000000001ffffffff00000001000000000000000000000000fffffffffffffffffffffffe",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 180,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040000000000000000000000000000000000000000000000000000000000000001ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 181,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffffffff00000001000000000000000000000000fffffffffffffffffffffffe0000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 182,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffffffff00000001000000000000000000000000fffffffffffffffffffffffe0000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 183,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffffffff00000001000000000000000000000000fffffffffffffffffffffffeffffffff00000001000000000000000000000000fffffffffffffffffffffffe",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 184,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffffffff00000001000000000000000000000000fffffffffffffffffffffffeffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 185,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 186,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 187,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffffffff00000001000000000000000000000000ffffffffffffffffffffffffffffffff00000001000000000000000000000000fffffffffffffffffffffffe",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 188,
+          "comment" : "point is not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffffffff00000001000000000000000000000000ffffffffffffffffffffffffffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 189,
+          "comment" : "",
+          "public" : "3018301306072a8648ce3d020106082a8648ce3d030107030100",
+          "private" : "7e4aa54f714bf01df85c50269bea3a86721f84afe74f7b41ea58abcf3474e88d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 190,
+          "comment" : "public point not on curve",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764c",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "public point = (0,0)",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "order = -115792089210356248762697446949407573529996955224135760342422259061068512044369",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f50221ff00000000ffffffff00000000000000004319055258e8617b0c46353d039cdaaf020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "order = 0",
+          "public" : "308201133081cc06072a8648ce3d02013081c0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5020100020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "order = 1",
+          "public" : "308201133081cc06072a8648ce3d02013081c0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5020101020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "order = 26959946660873538060741835960514744168612397095220107664918121663170",
+          "public" : "3082012f3081e806072a8648ce3d02013081dc020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5021d00ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "generator = (0,0)",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b04410400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "generator not on curve",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f7022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "cofactor = -1",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510201ff034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "cofactor = 0",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020100034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "cofactor = 2",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020102034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "cofactor = 115792089210356248762697446949407573529996955224135760342422259061068512044369",
+          "public" : "308201553082010d06072a8648ce3d020130820100020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "cofactor = None",
+          "public" : "308201303081e906072a8648ce3d02013081dd020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "modified prime",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100fd091059a6893635f900e9449d63f572b2aebc4cff7b4e5e33f1b200e8bbc1453044042002f6efa55976c9cb06ff16bb629c0a8d4d5143b40084b1a1cc0e4dff17443eb704205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441040000000000000000000006597fa94b1fd90000000000000000000000000000021b8c7dd77f9a95627922eceefea73f028f1ec95ba9b8fa95a3ad24bdf9fff414022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101034200040000000000000000000006597fa94b1fd90000000000000000000000000000021b8c7dd77f9a95627922eceefea73f028f1ec95ba9b8fa95a3ad24bdf9fff414",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "cea0fbd8f20abc8cf8127c132e29756d25ff1530a88bf5c9e22dc1c137c36be9",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "a = 0",
+          "public" : "308201143081cd06072a8648ce3d02013081c1020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff302504010004201b95c2f46065dbf0f3ff09153e4748ed71595e0774ba8e25c364ff1e6be039b70441041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101034200041510264c189c3d523ff9916abd7069efa6968d8dc7ddb6457d7869b53ea60cdcfafb7ed4786da15d29ee59256f536da3575a4888c1bb0a95b256f4a7e9fd764a",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "d003f5cc83852584061f7a8a28bcb5671ecbda096e16e7accfa8f8d311a3db7a",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "public key of order 3",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff3044042088f968f8b8adf746eae719daaf7f0be1fc5d667dfb46ea9a27f07439dc16dbca04203dc16cfd72abe9f378c266bdbb025f9e8bd6d190d1ad2b49cf5119898cc9b7d7044104a02ae980056ae0bc81f8d227199342e8b041b4d6da0a439d15f565ee0e3306a5057b711931020c3e733d16ae731d452bbe420fde1306cf66c9f1f50cae9bc3f4022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63255102010103420004a02ae980056ae0bc81f8d227199342e8b041b4d6da0a439d15f565ee0e3306a5fa848ee5cefdf3c28cc2e9518ce2bad441bdf022ecf93099360e0af351643c0b",
+          "private" : "4f3414d1589b49f7172d439cbbe78e5b5350dc85dea40cd2d6274740c6e0239c",
+          "shared" : "71814dea44408d67199600f603e6ec814dad46383b21af98d4dcb9ff2326721c",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00042af270d2a6030e3dd38cc46e7d719f176c2ca4eb04d7e8b84290c8edbcaed964ebe226b2d7ce17251622804c0d3b7adce020a3cdc97cac6c",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200041f17901e731b06f349b6e9d7d17d45e8a2b46115a47485be16197932db87b39405b5c941b36fd61b9ef7dd20878e129e55a2277099c601dcdb3747f80ad6e166116378e1ebce2c95744a0986128cfeeaac7f90b71787d9a1cfe417cd4c8f6af5",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400ed76e5888428fad409ff203ab298b0f24827c091939ae0f9b1245d865ac5fbcd2749f9ae6c90fa8e29414d1bc7dc7b3c4aca904cd824484421cc66fe6af43bdfd200c1f790a0b3ae994937f91b6bdb9778b08c83ecadb8cba22a78c37bf565dac164f18e719be0ef890ee5cbf20e17fcfc9a5585e5416470b9862f82fb769339994f4e",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200048028d16082b07696d4aa4aab9d6b1f1463435ac097900631108f9888e13da67c4841fd8dd3ced6e7ad8c6fc656621c2f93d3db0eb29d48d1423154519865dbc1",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004a6bae3d155c1f9ca263928c986ede69acefd0dd9b3a19d2b9f4b0a3a66bea5d167318dcc028945fc1b40c60ce716ba2d414a743c6b856a6f",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 213,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200045d3ddbbb9bc071d8b59855c74bdf3541ae4cb6c1a24ec439034df7abde16a346523edf6a67896b304cb2cd2a083eec2b16935bbc910e85ec6eae38b50230bf70",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004a43c6ef2500723d54c1fc88f8844d83445ca5a0f585c10b8eb3f022d47d0e84862b7f5cbf97d352d4348ca730f600f2258d1d192da223f6ba83a7cc0d6da598d55c2b77824d326c8df000b8fff156d2c",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 215,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200042391c062833d1e6d89ec256cf4a3989534c1ead5e1e14ffae933a53f962857e4713087e1b3d65ac79634c71577af24698b5ce959183835551f7b08aef7853378c299930b360813fd58d5e4da8b37d5a7473e891ee11cb02881bd848b364fb7d5",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 216,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000484beae85096640953c1fd6ebbc32697263d53f89943cbaf14432061aea8c0318acbd9389ab1d2e904fa0e081d08cfabb614ed9bca618211142d94623c14b476a25e47abf98fd3b1da1417dfc2e2cfc8424b16ea14dd45e1422be7d4e0a5cc7f4d4ab5f198cdbaaa3f642ec6361842cbe869382ee78cd596ff5e740d9ec2c3ad6",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00042b0a1a858ffc44e7752940731d378f96570837e279ea3948fe00cff8b5f89adb4e2fe6f8781ba6426364f4590b34dd79fc80629de4a86084",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200043037c01b4a5ac53742e3f5528dffb0f010ab6ebeb08d792b32e19e9006ca331a024b67698d7cf4b575ccd9389441d5c640b77c63771cef1bd85675361c6602a4",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200040f0fd972a495a140124a4019291a20f5b39fb755c126bf268643bb3091eca44f2a3cda1dead6ab1f4fe08a4b3872423f71e5bf96b1c20bc0ca73b7e2c134cc14a5f77bc838ebcf01084da3bf15663536",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c0362000403b65faf5a6bf74bd5c166278a4b566c6c705ac6363e61f3b0699e116d3c5b19e8b7021b75b005f78a8cea8de34c49397f9b3b2bfc8706eb8163c802371eff7dfc825c40aa84dd9d1c4b34615ee5ae28c6c05d58d2a8ccc3786382b712d3bcda",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200047504d660943a69ab043378e44c034896534a346e0e95f35fcaad3503b490856bfb20a753ecabc6d7bfeec28d057f919923b7d3c086953eb16c5bd287b59788db72dbb7c273854294c927ea7eca205aae2f0830e5faaddad8316231bfc3572c85c33cb7054e04c8936e3ce059c907e59f40593444e590b31820bc1f514ed0ec8a",
+          "private" : "0b44f9670fedba887ad8e806226063e77604b27c362836326e93ecb7fcc6dc297",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "invalid public key",
+          "public" : "3039301306072a8648ce3d020106082a8648ce3d03010703220002fd4bf61763b46581fd9174d623516cf3c81edd40e29ffa2777fb6cb0ae3ce535",
+          "private" : "6f953faff3599e6c762d7f4cabfeed092de2add1df1bc5748c6cbb725cf35458",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 223,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3039301306072a8648ce3d020106082a8648ce3d03010703220003efdde3b32872a9effcf3b94cbf73aa7b39f9683ece9121b9852167f4e3da609b",
+          "private" : "0d27edf0ff5b6b6b465753e7158370332c153b468a1be087ad0f490bdb99e5f02",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 224,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3039301306072a8648ce3d020106082a8648ce3d03010703220002efdde3b32872a9effcf3b94cbf73aa7b39f9683ece9121b9852167f4e3da609b",
+          "private" : "0d27edf0ff5b6b6b465753e7158370332c153b468a1be087ad0f490bdb99e5f03",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 225,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3039301306072a8648ce3d020106082a8648ce3d03010703220002c49524b2adfd8f5f972ef554652836e2efb2d306c6d3b0689234cec93ae73db5",
+          "private" : "095ead84540c2d027aa3130ff1b47888cc1ed67e8dda46156e71ce0991791e835",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 226,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3039301306072a8648ce3d020106082a8648ce3d0301070322000318f9bae7747cd844e98525b7ccd0daf6e1d20a818b2175a9a91e4eae5343bc98",
+          "private" : "0a8681ef67fb1f189647d95e8db00c52ceef6d41a85ba0a5bd74c44e8e62c8aa4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 227,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3039301306072a8648ce3d020106082a8648ce3d0301070322000218f9bae7747cd844e98525b7ccd0daf6e1d20a818b2175a9a91e4eae5343bc98",
+          "private" : "0a8681ef67fb1f189647d95e8db00c52ceef6d41a85ba0a5bd74c44e8e62c8aa5",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 228,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3039301306072a8648ce3d020106082a8648ce3d03010703220003c49524b2adfd8f5f972ef554652836e2efb2d306c6d3b0689234cec93ae73db5",
+          "private" : "095ead84540c2d027aa3130ff1b47888cc1ed67e8dda46156e71ce0991791e834",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        }
+      ]
+    },
+    {
+      "curve" : "secp384r1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 229,
+          "comment" : "normal case",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004790a6e059ef9a5940163183d4a7809135d29791643fc43a2f17ee8bf677ab84f791b64a6be15969ffa012dd9185d8796d9b954baa8a75e82df711b3b56eadff6b0f668c3b26b4b1aeb308a1fcc1c680d329a6705025f1c98a0b5e5bfcb163caa",
+          "private" : "766e61425b2da9f846c09fc3564b93a6f8603b7392c785165bf20da948c49fd1fb1dee4edd64356b9f21c588b75dfd81",
+          "shared" : "6461defb95d996b24296f5a1832b34db05ed031114fbe7d98d098f93859866e4de1e229da71fef0c77fe49b249190135",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "compressed public key",
+          "public" : "3046301006072a8648ce3d020106052b8104002203320002790a6e059ef9a5940163183d4a7809135d29791643fc43a2f17ee8bf677ab84f791b64a6be15969ffa012dd9185d8796",
+          "private" : "766e61425b2da9f846c09fc3564b93a6f8603b7392c785165bf20da948c49fd1fb1dee4edd64356b9f21c588b75dfd81",
+          "shared" : "6461defb95d996b24296f5a1832b34db05ed031114fbe7d98d098f93859866e4de1e229da71fef0c77fe49b249190135",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 231,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004490e96d17f4c6ceccd45def408cea33e9704a5f1b01a3de2eaaa3409fd160d78d395d6b3b003d71fd1f590fad95bf1c9d8665efc2070d059aa847125c2f707435955535c7c5df6d6c079ec806dce6b6849d337140db7ca50616f9456de1323c4",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 232,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200040161328909675213e32098d35a6b8308a8d500cca39dcee5e804e73bdb8deaf06fe417291fd9793b231ef5fe86945444a97a01f3ae3a8310c4af49b592cb291ef70ee5bc7f5534d3c23dc9eefde2304842c7737ae937ccf9bd215c28103e9fe2",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 233,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004af4ae964e3bcbd923accda5da3175d411fd62d17dd3c3a1c410bef1730985a6265d90e950ac0fc50743b1ed771906ff33b68cf4d3d83a885a87097fdd329ce83b189f98cec5be44c31d1a3a2bba10f471963232b8ba7610fa8c72179050eb86d",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 234,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200041478ab6e032b9545eda9ac2c264e57a11f08acbc76d16a0ab77b04dbdaf20f215c4183437b32afc471eaa603d14c7c5d8a4c84ee0e895bec5c37f0a1ca075e106ff6bf38801b5c697409d39675231108d33c4a5ea65aaa8c03e939c95d96c4c4",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff00000000000000010000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 235,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004f63208e34e7e90bb5fb036432467a89981444010663b8533b47bfa94bd2bc16f38aa516b930a4726e3876d3091bfb72ec783ed4da0cac06320817dc8bc64f59ccf06f48abc4386a150913fa95743a7b4601190e1c6ee8f8bf6354b254ecace45",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 236,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004033271ef42d92ad47b273b09ea2f45401161baa52696590d0e175ff2d1c0dfa3fea40e4266d446546c05e480d57fabec7889f16a8bcc176602f6d46561614a2f4284abe697b7cb9ce79f7e2e71b155cb1f155ce925d16391a680eda23152e6e1",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 237,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004737e8437e18683de2455b68945bba31daec3e754d72f0a0776d3192b2f9298bb95ca1464baa6687aabb679f804cf6ec6c2b4d47d61a60404df63b1e9ac0954b3419bbc2ad52a0409aeeb82f4703758588059165b20367dcb4b235b0caf71d727",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 238,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b810400220362000437f9004983156bbd9c47891e75237bb13016bd7fe6f4e0f71cef0e63f16a672f0d3b0e20165c33407e146b6a4ae6962dd3b57ccb99e7aaf1303240516d0ebe08e585513e3695d42c467dcab5340ef761990cadc8d8840aacc944481415c07feb",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "3b5eed80727bcbc5113b8a9e4db1c81b1dddc2d99ff56d9c3c1054348913bde296311c4bd2fa899b4d0e66aaa1b6a0dd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 239,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200049655d8e5622718b317cfbc09894357f75a6b13fa516bcd6630721b869a620196cf0c3dec8860b32d27ed9bac2cf263af17321698116d7d811ae8da9b9cbbf9382c1e36e2b67d6c6af9bcea7d9de00ca72b398606c098a0a0f0c4b8941943ed65",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "6a99a5acd4a7edb1c707d7f8be12e81140338e3e14ba563c703c681a319a3f9ce1f90f032bf840f3758e89cb852ceca6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 240,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004ccb13d427b3c4bb33dd4f20cddabc68600eaf97eeb2c81e8c218ae90743e74ff38ca56f0c0224379db464dcf4a40f04350cd7a659b2c4851a5dcf8c990fc920c07d4d5aa50a2185750e6b84c42e83cff635050482decb4780f812e4c49fc7404",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "7c25a4f57f76ab13b25cab3c265db9d9bd925fecbf7bf93bef1308778646628decab067ed988a9755cd88e88de367104",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 241,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200042664624307c02ef487030a632162c515f841d15ea3152d98ff2364232d7aab39343d5f703a4d5a31092aa7356c3a2f671c1cd603addfd8b5477552a3b32a18edaf3e33bec22ee2167f9da729636002a7974eaeb5ff082b2aabf8c7056b84c3ab",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "7fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 242,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004665f1f320b6ab1c1b52d144e52d87a154c2b4489838c9119de622c2d1b52b65b0a3955e44e0d4859175360c0f63dee813f14f69972f18caed7916c94a4d20ec344591e7536a4a7a4d8c9832818c96d60b1a81fabe64ea02c5f647e361bf5b60f",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 243,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b810400220362000491357ca87dbb08e85d7b1acecfd1e086078a82d19f81474da389364a39fe2543eb934b440173c38e61a1d9407855b5d89ef0d9e920764b6d7765b084cf9541dacc43d1dabaa390b0fb856097b0c00a8556f4e3848568ab4ae790c3d346ca01b6",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "fff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 244,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004d5a833bae33b2d10fdff6db7c5477adb614b191c70d97c6f130a14e93931cc1dc058053fee54a264a00fdd16d3166fdc42992276b79925bafcd183b03ed18235350980abfe67b814c6c11074c38f74cd4e734ad58cdb49d9fcd2181d1b8f1119",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "fffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 245,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b810400220362000467547cda7fbe8f16be5a4477cbb02979f1af72fc0f39302773552fbcf4667a8e23abc0e12856ee6234deeca5f22ae0503a4df7c068e7432417260cb9fe0d68b9c7fcf7e16a2ada05687d8f8900b84723103edbff0a42b27517da2760b7d38843",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "ffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 246,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200041363e3b99008e09bb3f085949b9b6ea26a318f496de568a96630fdb9d4c72c2814df3087a1741f32f24989b428167f93c653cb3ae8c3ecfaec57efd54bb8ce9d79c7bf6cc70fb1114f939be8f1a99bf1e42b97431124ef9fa33450faa4e76839",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "ffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff0000000000000100000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 247,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004ba2be8d7147e2417c2ec80b24b4c1aa94464ffd0aae1fa2e078b3afbc77c144489ca9d064acbb7a9cfa6196d0f467b7e65ee1ca1eb1351ff9968f553dfe2e4c59ff8ba34c22a42b3baa13a9a1adc7f13abd40f1fd25d46bc5330852b9371966a",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 248,
+          "comment" : "edge case for shared secret",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004d69850ccbacc4736ea200ff2f8488f26247945a2ab48dd3708f494b293d8cba83417f48974881c7fb03854089bbf66cc1c773ec03cb8cd5f007ec3b03bdd05a409b352103f0decf25b41673ab8ca3d04334babee01219f15701f2bca22d40b37",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 249,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200046fcaf82d982d222d6096ba83e55b1c7dcb71a41e88f323333f44284d95c4bd3616da7a1bef928f31c26f885ba7adb487826fde2ed9f5649c11cf8465f8bf8ad50f68914936fc39666f68219d066506bea4001fdc816c9a90e7e2afb19bea085f",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "000000000000000000000000000000000000000000000000000000001f03123b00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 250,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200046fcaf82d982d222d6096ba83e55b1c7dcb71a41e88f323333f44284d95c4bd3616da7a1bef928f31c26f885ba7adb4877d9021d1260a9b63ee307b9a0740752af0976eb6c903c6999097de62f99af9405bffe0227e93656f181d504f6415f7a0",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "000000000000000000000000000000000000000000000000000000001f03123b00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 251,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004bfeb47fb40a65878e6b642f40b8e15022ade9ecfa8cb618043063494e2bc5d2df10d36f37869b58ef12dcc35e3982835fd2e55ec41fdfe8cabbbb7bcd8163645a19e9dac59630f3fe93b208094ff87cd461b53cef53482e70e2e8ea87200cc3f",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "0000000000000000000000000000000000000000000000000000000036a2907c00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 252,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004bfeb47fb40a65878e6b642f40b8e15022ade9ecfa8cb618043063494e2bc5d2df10d36f37869b58ef12dcc35e398283502d1aa13be0201735444484327e9c9ba5e616253a69cf0c016c4df7f6b007831b9e4ac300acb7d18f1d171588dff33c0",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75b14f5a6766da8035cc1943b15a8e4ebb6025f373be334080f22ab821a3535a6a7",
+          "shared" : "0000000000000000000000000000000000000000000000000000000036a2907c00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 253,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003cf99ef04f51a5ea630ba3f9f960dd593a14c9be39fd2bd215d3b4b08aaaf86bbf927f2c46e52ab06fb742b8850e521e",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "6092a1757ddd43a04e185ff9472a0d18c7f7a7dc802f7e059e0c69ae16c802651719406e04de27652ff83da4a780ef2f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 254,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002732152442fb6ee5c3e6ce1d920c059bc623563814d79042b903ce60f1d4487fccd450a86da03f3e6ed525d02017bfdb3",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "89c804cb81443386b185bcd9e2e6c35ee6177c3b90298985c4e81a89d520cceb17d729540e56ecc343c26bf314f2d052",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 255,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036660041b1c7984620e8d7fd7ccdb50cc3ba816da14d41a4d8affaba8488867f0ca5a24f8d42dd7e44b530a27dc5b58da",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "35513157e804bd918d04de202778b81a6fc7ad8aa541ee94116a0f18466725d75e71c6942bf044b1b0ecba19db33e0de",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 256,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200040000000000000000ffffffffffffffff0000000000000000ffffffffffffffff00000000000000010000000000000001141b9ee5310ea8170131b604484a6d677ed42576045b7143c026710ae92b277afbbea0c4458c220d561e69404dc7d888",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "102080c047881d19aefb01c29c82a4fb328a8ea6e6d6c914af73100507c8ee499799aaa646de0ea8c2727c0b5ed2439b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 257,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b810400220362000400000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff70370385413d3eff6fa3407ba24f682c2b01b51445dbdf5ef7b0dd0979f17e713e09081571f1e94dfb66bf282002f39f",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "f689f6e475b4e15162521acab4637a3cdb9cb42aa92f9114b0ee300ddae89d5eafff3463a1f5004a2a1bd4aeffa47b78",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 258,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff112e191f1f78bbc54b6cc4f0b1e59ae8c6ff1a07f5128e41dfa2828e1b6538d4fa2ca2394c6aab3449dcb3fc4eb44c09",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "f3486244119b3632fd55be9e6951eb5d9c8c62f6a27042f94b924155ecfd4ff8744ba3d25bcf85a7b925bd28a12b897f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 259,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008000028a4c8da5a05112fe6025ef41908969de20d05d9668e5c852ef2d492172ddc2a0a622fc488164fcc1a076b872942af2",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "8171b7c80d4c90bb58ae54393921ab9c5c0b3196f045e9fe5c8b168f0e5f6a77e1aa34ecedc5481ce55ab34c14e0f2e8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 260,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200043b5eed80727bcbc5113b8a9e4db1c81b1dddc2d99ff56d9c3c1054348913bde296311c4bd2fa899b4d0e66aaa1b6a0dd7b7f0f28d55e2f3a50f1f1bef3976834a05b43418e979303bc0363ed16d2d0b4011cc37b3c06ad73154faeab7915cd87",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "1fe6fea5f00d3005abaae2267ff18e430915838d87909ab503885edf38be7618ecb321f0a4df71b0913fbf12c76fc1f0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 261,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200046a99a5acd4a7edb1c707d7f8be12e81140338e3e14ba563c703c681a319a3f9ce1f90f032bf840f3758e89cb852ceca63cf99ef04f51a5ea630ba3f9f960dd593a14c9be39fd2bd215d3b4b08aaaf86bbf927f2c46e52ab06fb742b8850e521e",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "f58adc13ff997d38383910db7befb17670393a33d95b049c2aa19d760c8e728ecedd32168476b90b26a3742dcc121b07",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 262,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200047c25a4f57f76ab13b25cab3c265db9d9bd925fecbf7bf93bef1308778646628decab067ed988a9755cd88e88de367104562ee0c57e71d96cefe31b4c4045bd4086a38e8ab9adf2d5567be318051d70f3aa68b753f271ab032b6abcce919e2962",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "56299684ec5ceb09ba4d94d1231005a826c9c08a5219c757e0136cbe8b6430badd4925172f2939891da7c7893850512f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 263,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200047fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff80000040000024480ab33cb4bf7cb79c024eeade3fd641e2f3003698400e8986a7343a5da59a3b26eea4b4176e53239371437d834a1a7",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "1911a0ee6aebe263fdcf3db073f2598cdafabec2123a2f24a28c3d9151c871f32d6dc2f31d25af9c498fd68da23e5bef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 264,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200048000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020797da4c0751ced16de80d16ab7c654a5dc27d092626d0865a192a1c5ea7c1b88c9fcab057946741e41cc28c80ec0b9a",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "15900643e2e0583976974b05f83c7a96611425f7c4a6eb51916ab958a037fd9cc172bdcfff4540a2ff3ce64e6505557e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 265,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff6c70898ae6fb31fa2f086562af2d10486ba4c6fd5e41dfe4aa61598b4707a3bc276a62feb1b98557e3b17c025f7adf4e",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "88a544a769d5c34a051416bd509dfac911863f604c83ea844bf0e4c5c272dec86d057a88b152a9274701938c705900c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 266,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff00000040000000eb1592858b6e6e3a199c0f3e7c5f0b4a92915936efb8bc0407680eb7274be7422156ce8cfc8b505b2d902c39992380f",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "b7db26b286e7527cb1f454782fe541862ff0f8d7eed960e22855deb7ac2a69611668c777c53bb74c2bcd40edfbf7944d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 267,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004ffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff4987abae412809c2fa48fd23b1bdf9e622f5a606c44117215ffa61b18ef46e54a7fbbf11f9a6ba59c991b4ae501fedce",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "b1e8aab1aa633d98dc6b768594e1e3edb801a9ef483f287c83e19744d2ad343ad3debdc4dc178213ad6876b52284f552",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 268,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004ffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000001000000000000013691fe493d4d28bf8ee1dfec812d6c306eae0842919eda6dc525f0d49ac2d26a992251912139a2936849f9d6fa949a68",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "b0de006f80f6f89e4eea6e46dfe305153005612d1e903171ec2886230971961b5202a9f3187bdac413ac24c836adf7a0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 269,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff615842aa06b06f78f0a66f7bea88d4b6ee59653eeaa00dc5e0a2b658f969b71af90c9b4e96bd3ca33846955bdccbd359",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "ca8cfa42c5e374914c14d6402b1a99208e47e02ec49818913694ea0822a2cc6c310259a8f3ab7559b9974bc4c2fa337e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 270,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe732152442fb6ee5c3e6ce1d920c059bc623563814d79042b903ce60f1d4487fccd450a86da03f3e6ed525d02017bfdb3",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "edf040bace18d90bf9ce720df2a3b31d76d95b7ed9530a159ac0b24e82a871033eada40552f9e606f7115e6a78927511",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 271,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000001f03123b0000000000000000000000000000000071bd1e700c34075c3cade8ce29d33724af68a7672b265a4e157055360440ab7c461b8e9ac8024e63a8b9c17c00000000",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "ea817dff44f1944a38444498f1b6c1a70a8b913aa326bc2acc5068805d8ddd7a5e41b8ee5b8371a1cf3f7a094258e3a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 272,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000001f03123b000000000000000000000000000000008e42e18ff3cbf8a3c3521731d62cc8db50975898d4d9a5b1ea8faac9fbbf5482b9e4716437fdb19c57463e84ffffffff",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "ea817dff44f1944a38444498f1b6c1a70a8b913aa326bc2acc5068805d8ddd7a5e41b8ee5b8371a1cf3f7a094258e3a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 273,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200040000000000000000000000000000000000000000000000000000000036a2907c00000000000000000000000000000000000000007f57b69a014783dbfa4967b2f9cfa678a6f0b6e9cfd41648cec5b3c498e72152da3f82d3da2e8e9f8ef37b11",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "bfa93e184f76279fd707d53ddcb3628855cfafb111bcbd0b4df6ef77aee624924d681626a153fa4e59c923b71fc090b3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 274,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200040000000000000000000000000000000000000000000000000000000036a2907c00000000000000000000000000000000ffffffff80a84965feb87c2405b6984d06305987590f4916302be9b7313a4c3a6718deac25c07d2c25d17161710c84ee",
+          "private" : "2bc15cf3981eab6102c39f9a925aa1309db59c2c02a54411928d73c3945d157848dc36959efef7495c8528ea284c1c97",
+          "shared" : "bfa93e184f76279fd707d53ddcb3628855cfafb111bcbd0b4df6ef77aee624924d681626a153fa4e59c923b71fc090b3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 275,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "3",
+          "shared" : "455aea9924330bd6d2d6403478327900e172e93598e254cf6d8eb13f0a3d21be51a46107333844e61dfa3d80df6928e9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 276,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "db1d8ef1117282870db8113aa4f58723c756ce598686eb8ea531aa4d39abb1b982b1e7bb2648a6c268d2d351204db8d5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 277,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "e98062df47ef884c9411e16466af84ad271d586008b1fbc50aeb3b36836a35a770dd42e0db84d39b26f4dcd2dc03d90b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 278,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "898aae0ebf1cb49fb6b1234d60f59006325421049a8a320820e1ad6af6593cdc2229a08c500aa55ca05999d12829db9c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 279,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "83f862f496ab8af12b82a8a0c047d836bdfa36281324b3a1eb2e9c1d46699d81cb125cbe4b93939fd84e1ae86d8a83cb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 280,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a779ecec196accc52973",
+          "shared" : "9a26894887a0342ca559a74a4d4a8e1d6b2084f02e1c65b3097121a9a9af047d8810fb945dc25bbf02222b3b625f1e0a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 281,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecdc196accc52973",
+          "shared" : "8a8d9dc194a26910cbdae7908d185b6ad04b620c94c5ee331e584ed804e495bebc2290a2d7006a06e65b9bcace86c6f6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 282,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aece4196accc52973",
+          "shared" : "d57f6aa12d3f07e8958499f249e52cfbe5be58482e146c5414dbbf984fc5333710350e2ce96b33beb7678381f40f1dcb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 283,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec1969ccc52973",
+          "shared" : "188e8041d9a5f0b6cfdad315ada4823beda0146774fad65b500e6ef94376ebf8af7a40ff6f6b45019a09dde7d7fb5552",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 284,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52959",
+          "shared" : "2ecf9dc47e8b07ae61ddbd1680ead02698e9e8469f78d5a28328e48d0c9d7a2ac787e50cba58cc44a32fb1235d2d7027",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 285,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52969",
+          "shared" : "06ee9f55079d3d3c18c683ba33e0d2521be97c4fbf7917bf3b6287d58ffcde2df88842e3f5530b39549ac20974b1b60e",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 286,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970",
+          "shared" : "455aea9924330bd6d2d6403478327900e172e93598e254cf6d8eb13f0a3d21be51a46107333844e61dfa3d80df6928e9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 287,
+          "comment" : "edge case private key",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004e9dfaaab808b3aac1ccca7cc6242a7ee583249afe8ee8f66b904cc8eec34ad334456e00f33a94de8b5169cf0199550c020156e9651734ff999c5f3ea62b83d0083a6093f234457251ecf72c41e4df7cea2420b5454a7f690034380bac981e92e",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971",
+          "shared" : "024c5281487216058270cd1cfe259e948310e4adc263a9edaa4da0bc3f5f8ce8ffc88ae41b2c050bf6dd9c8c66857237",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 288,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 289,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 290,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 291,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 292,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 293,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 294,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 295,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 296,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 297,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 298,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 299,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 300,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 301,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 302,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 303,
+          "comment" : "point is not on curve",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 304,
+          "comment" : "",
+          "public" : "3015301006072a8648ce3d020106052b81040022030100",
+          "private" : "0c6cafb74e2a50c82c7a63d13294bfea13d0bc504ba2b08a392c9081bf3815d9e44d969ed7f05ffd1d8594355053c6147",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 305,
+          "comment" : "public point not on curve",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c8",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 306,
+          "comment" : "public point = (0,0)",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 307,
+          "comment" : "order = -39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942643",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f0231ff000000000000000000000000000000000000000000000000389cb27e0bc8d220a7e5f24db74f58851313e695333ad68d020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 308,
+          "comment" : "order = 0",
+          "public" : "308201853082011d06072a8648ce3d020130820110020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f020100020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 309,
+          "comment" : "order = 1",
+          "public" : "308201853082011d06072a8648ce3d020130820110020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f020101020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 310,
+          "comment" : "order = 9173994463960286046443283581208347763186259956673124494950032159599396260248791326163093631191247821216106",
+          "public" : "308201b13082014906072a8648ce3d02013082013c020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f022d00ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196a020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 311,
+          "comment" : "generator = (0,0)",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 312,
+          "comment" : "generator not on curve",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e61023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 313,
+          "comment" : "cofactor = -1",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529730201ff036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 314,
+          "comment" : "cofactor = 0",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020100036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 315,
+          "comment" : "cofactor = 2",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020102036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 316,
+          "comment" : "cofactor = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942643",
+          "public" : "308201e53082017d06072a8648ce3d020130820170020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 317,
+          "comment" : "cofactor = None",
+          "public" : "308201b23082014a06072a8648ce3d02013082013d020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff30640430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 318,
+          "comment" : "modified prime",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100f47e533e4e43e4bf04e901db0eea6efba14bbcdc3b1c5753a7c141487e4f43784e57a72310202323361f44760c8368bf306404300b81acc1b1bc1b40fb16fe24f11591045eb44323c4e3a8ac583ebeb781b0bc86b1a858dbefdfdcdcc9e0bb8af37c973d0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef04610400000000000000000000000000000000fffffffffffd38000000000000000000000000000000000000000000000001cf3646298bba2f24e84189cf0d1e75188fc4fcf5b0844281822e789e3d534b159f4c419342260197625ad924a2c72c4d0f023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529730201010362000400000000000000000000000000000000fffffffffffd38000000000000000000000000000000000000000000000001cf3646298bba2f24e84189cf0d1e75188fc4fcf5b0844281822e789e3d534b159f4c419342260197625ad924a2c72c4d0f",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "5df0762488bc0a7be1121508949382861f781c331676048c2d45d245be6f476c872113e6710bc746c3d06970510193ce",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 319,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 320,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 321,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 322,
+          "comment" : "a = 0",
+          "public" : "308201863082011e06072a8648ce3d020130820111020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff303504010004304fcc45ccf5e23ee407b9291d2e85523962a2a79a50da3facca04b7267ad316db202cb07c24905740d201ded3028881090461042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020101036200042121a348f9743855859c496f91d0f39fe728fc46e48d007713051b22f1c0257fe20dd85b21df7e1ec82bf8b39b2138a2ae74f80e6257778f8cca9f279b57d25eeeb155960642972f0567e204514f0ac1eb1e27db5115053211914961d09644c6",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "455cf3c0b0090688599825522ef3312878201514f6330ccc7f42ec1945204adfe419b2dbbfb942dc98b16d8323150cf6",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 323,
+          "comment" : "public key of order 3",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff3064043072b3656874104b18a53149d3f2eb372f2569f3639e90d8a720cd240a2dfb8102731a7158f093a41c394020346bbf1335043037250f23c44a0cd5d2f4bc5c4b961d4aa4c3d0b3de9152212325ac17ea696a8c3f38a1f1b5249ed2d4befcbdf39659ab046104e6adb603e0fdf32aa11eaf97ddff6ce802ec2aae39a37c980fe4cd12da5bc51a7f71cad00068ada13922958a70b5cef94110ec8f85947c796e5ab0a2c1844673ac6d979fd2456fb7c5715fbbf87273079dfb83886357b434cb400b0b711ffa13023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5297302010103620004e6adb603e0fdf32aa11eaf97ddff6ce802ec2aae39a37c980fe4cd12da5bc51a7f71cad00068ada13922958a70b5cef9beef13707a6b838691a54f5d3e7bb98c539268602dba90483a8ea044078d8cf762047c769ca84bcb34bff4f58ee005ec",
+          "private" : "0de44e63fd924f177340d780af6aaaea271f52d2cb9a5c519b6020e06c3cf0baafbc0b801c6508c2e1483b15cfef7afc2",
+          "shared" : "22a50194a6b08255b20b998db62c86a097d2c03d9bc1e76d337364c8e7a3bac82680c5aa4d58be543378ab5a3876abc7",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 324,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00040710b0c6f4675459f3df2bdf7ca02819f8086198d15c69b8abda37639e6031caca8a0121894d2491d8b3dce093703c70705bc5dbc8fa17c8",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 325,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045fa4fa0b235c21e5c9f3baea9303bf86eccb7d31d0b998e141bc54b5dc43b23eef7fc5cf56308ed595eee99ade6aaf74d591c3d00aa1b438abc59c9607c22c36",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 326,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004005bce61fe27c440fedbad47d88bccf645db9c1d30daa086e592e8b6a0a173b87991b619801907b420fa558c7953ab97badd9c6c1d85859d9ebef7441a088ff57ed5008d7638de703faabeb5a78e83e8fcd4eb786144a75d79bd4cc8cfa8be66612d756c7b65c67f72c6acbade6f0d59e9752e845205b2a560d4f8d6a9e84bf812f94d18",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 327,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a69ced11a8bf7a907bfa47cba3368f2498b465a2407c90649c8da224d2a85bf445ad2df3d0113e72aedccf92ba6b8529ed6faa154bc27aba25f49371981e3b38",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 328,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004a9b0f90e49a57fbe508847bf16e4a7b565dfe870a50164bc2862fe6e4d54bd8b109939f7dbbf800522722b9c0b309ace3884abb69c927ad0",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 329,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004512fe17172db1125a49f9dbb85e387869adf015e4899c06f66ef870d72092d4d195e1d21b4a4647bf734468bee802ddad5449202eba1041df2fd8cde04697237",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 330,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004c391dc7a817d47a3961ea1857895e101c0f5a8767d3a9c7cad49f7af8029f24c67309373cedd0831ccc0a0f45d344f3ab5923d2452507a980301a283848ae31574a57db51ce5e61d35aee483f1bb8e66",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 331,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000419d3c811c04c5c0990d0258386195b2e29fdaba58d3f12b0bac8d3d53828c66c7a35e3d1eb0bdf2c08f23d0e4ab6a3246e456bf0fb863d03423dbe431baf799657c7816a619662fe5b900b754107ba5cc06b1d62c9a927891efee1a1fd404d7e",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 332,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004216eb619457f1168ac873f5b560a75df80749f2bdf9abac31d6580e521ad70368013c3db74f663263b61eb12d4dcd597ad6c77cef6a5d6d2240b1e244d76403f693fb317ffc602a7ac313991b0a62f7bf469bbc95b3ff35003d972eb8ebcc8d4833e6c24ad52d49c1ce6244c7889ab67a8818232e192944542763fc667e5799d",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 333,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004691b24004380a599770214d0c60ab37cfc804cfaa7aedd11cbf0a05467ebec5e33322cda707b848086fd740244f62cdeb867fc057207fde2",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 334,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000422bf69f3a81dfa1ed8a97301943626e20377b78f7e7d714b880deb5a4a9c63a11591c2e47b777488990771855768b9a4050d61bf02d84cc6aa40447a07507285",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 335,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a0352000476568300e2b4c68861589b4966e67bc414811e4011260cb8be5f884869fa179ca8af40f80009e0a58b17ac3e551a772e76683c32e6e09112572542d7c1fe3d49abb56da56d669186e2623dc797129dc0",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 336,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200043345dffded3c33f7dcc19bb8997a39f2d6230abcb765d6142c30bf320c1fadff535feafd8505eb3e614db71826c1e258077a1e6057add7474f6d35dce68417812e7b919b1c673032b28c45d0a9251c43a2a73ab152f64ff8eba4eab312fa73bd",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 337,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004a3677c646cd887685940c28076f55cda7469032845f2cb2af51c61492dc435aaa5b771d8e1528417cdeb89b5f629e06b234e21236b9edf46c7025177ee65a8e940f670d10c722cea355bd3a5c8847a38324b9a06a50a95da4e70bb492cd00194a8830975dd1e115e19315575ff841b30fd4a3f8a44725dfe280d0af57fc80cc3",
+          "private" : "0d6331a5a968e4d3bd7336a423b41055b68edd100b8b998d00eb9ed93881c21e3912bb2ee08e71327be205898675ef7a4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 338,
+          "comment" : "invalid public key",
+          "public" : "3046301006072a8648ce3d020106052b81040022033200024424530ea70bace90601f8d5869e4179a6cd689b6a18fdfec50cecf17cb836d24820211ada67815b42c2c2606303f69e",
+          "private" : "2b9e57572da6cf4fb58cb94eab8df19383a136f219f2a515776a8bf48e1538dd1d811946c16d9f0184c9ce5cdf1dac51",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        }
+      ]
+    },
+    {
+      "curve" : "secp521r1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 339,
+          "comment" : "normal case",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040064da3e94733db536a74a0d8a5cb2265a31c54a1da6529a198377fbd38575d9d79769ca2bdf2d4c972642926d444891a652e7f492337251adf1613cf3077999b5ce00e04ad19cf9fd4722b0c824c069f70c3c0e7ebc5288940dfa92422152ae4a4f79183ced375afb54db1409ddf338b85bb6dbfc5950163346bb63a90a70c5aba098f7",
+          "private" : "1939982b529596ce77a94bc6efd03e92c21a849eb4f87b8f619d506efc9bb22e7c61640c90d598f795b64566dc6df43992ae34a1341d458574440a7371f611c7dcd",
+          "shared" : "01f1e410f2c6262bce6879a3f46dfb7dd11d30eeee9ab49852102e1892201dd10f27266c2cf7cbccc7f6885099043dad80ff57f0df96acf283fb090de53df95f7d87",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 340,
+          "comment" : "compressed public key",
+          "public" : "3058301006072a8648ce3d020106052b81040023034400030064da3e94733db536a74a0d8a5cb2265a31c54a1da6529a198377fbd38575d9d79769ca2bdf2d4c972642926d444891a652e7f492337251adf1613cf3077999b5ce",
+          "private" : "1939982b529596ce77a94bc6efd03e92c21a849eb4f87b8f619d506efc9bb22e7c61640c90d598f795b64566dc6df43992ae34a1341d458574440a7371f611c7dcd",
+          "shared" : "01f1e410f2c6262bce6879a3f46dfb7dd11d30eeee9ab49852102e1892201dd10f27266c2cf7cbccc7f6885099043dad80ff57f0df96acf283fb090de53df95f7d87",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 341,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004014c643329691ba27459a40dfe7c4ce17b3ea14d0cd7aa47b01f1315404db51436fbbfe6de0842e0f7e1265f6ff3aca28750677d3370b2fb2a6ef497356f4b95811201051b14178639a09a41465c72d3743436ee1c191ff7388a40140b34d5317de5911ea03cdbb0329fdeb446695a3b92d437271a9f3c318b02dec4d473908158140e97",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 342,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040029cd32125c23a41af24fd4b729da0faacbc35516ef0ba59096602571693cd282e26d67e18ef4643d0f6f158d7370d3394ca9a8de7938032ac178c6fd34e3702b8d008649834e2b41be3a8b7510bfe570f4c67075943cd0cbb9d9e1d1da52618b5b96d6aec9b650daf1ca6624c13e5116302b9c79c8c4d3d351915d1e8e1ab6ad76098e",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 343,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040032c6f06ce6a15ea064464d35aa368d299c9a9e1e368f694aefb603876248f898f223ce0217bef37d61eb09b27c93187cf8e61ba7b14e3c9bee692b06ac6d95f836019fd19f8480e21c63211d48d45f96f6365cf55f958e1a0fe7ea6b6b9ff230a87b70bb1b14d3a5fb6669a91641c6acf4570c1d3a9e709913b7fe6b35ff81c394d6a7",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 344,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401f7eb96e64b1a62daf9e0801bfd96a0b15b68e5f5cb3e90b434495a473907338e53098e1c2e493335d09c6aae6fdda0345b98aaed588f2abe82910713fb6c20252901396b17cf250bc018f4cead097e7e09863f14cf1239b065e57d884949eee141926f7e7c9f7f34cf0536368767bc0e1ab5142877293a4c722693a73fe14a5390af93",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 345,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004006ddf9b10965d5fc129e96f7a37667ccf66cc44384772906fedb21f9de4629e01aaa09ac7c9866112064bbc9bd58ebc123ab2fe19d8fed1a056d27bfef0630509c7001c441311ef20a16346332ea42d5c65788d68f6817b0267fcab11ea9c948ed108115dda8e823a380b601460742d3772d6424c67b240da24772ff0d2ccd9a1e0cea6",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff0000000000000100000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 346,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004007a8c547268c948b626da636cf54428ea2ab23861d499a84ad7be1cf691b92872a06e26c6dba08ca9ed386f83d396156d5fa023f57d5ea6440ec7401dad2c08ad70018c3815b1b9a2e42555419a6c19043fa2b0ddcc4b5a6e372fee9fcb227d85bad704687e7e1a818b612d5c046cd75972f7a2dd5c9a200ac5582cd59fec47ac525ecf",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "00003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 347,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040029153cf062f88f303e5d6f9aac968bd901076d5994ea7f831833b1e69b67e9e9fe20cf9c5623e00e0b9e3592fca2a03324b5df7c93186aff697aca864600d44ecc002801a62e2f4106f34106da23dc93d50e3e975a1d47510021835290649b7a4125109f656b6b0b5bd00b24d84ea1ba4e1ed49e61c526fb1011005131caee7ee0501e",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 348,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400a61eb994e28722c59b3c6007dfdf8b37893f6350f461b26a00e1a45104314aae9989da87e4facb2c4ef721185b7d96d9a45a28a102756501a1acc5d329a21bbf73010e8d0e12f5a9a40e0d59c90ce73043d39730aeadd3788e31d7c2bb62a1166161994664afa658ce2e60a13f45f27f914307c8d6f8d4ed16ab041b8f69908a62782f",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "010000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 349,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004011dd497b30c73709906b164a9a79dc7f2a98c0148ed63016bb95243834fbcdf8eb74b0ff652d54f59f31aef51da6e8974d363655b1da138dc4de0f2a8d800f475ae0057bd4b84607400d863ffbf45a3cf58999ee24ba05e93eca7b0e4ae760eb1733559a45d15579d3370d716ffa3ec4bfdae418e32fb06138dfca213720a938577610e",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ff00000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000100000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 350,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401283eb93fa369fe7012b647d21e0a97cf9950e5fbed819ef56158f20c8a9473a418eccbca4dc2b47f4cb6d322f917005859bf221e84ac9827cab82a801c627fb1ec0075c480cbafb352fcaf93baf23a1405fd81febe09729a908d1077e177dd8993d94b251a0d52652da3edb6fdf864e80cd51540e73d0b5107e3433576dcaa4e18db43",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 351,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400173beefe35ee868d497ff6601628f65ce18a1591f7e4a3a406622f3f508e2da68f101ed02febc38418c6ddfc26a5ec9848c42792463b1e945f9e167db34bdf2d660053070647aba7cd60eb295ab81a268a3903f393c5d28bbc5e022351c377cd84f02c19deb36442372cae1332e92f95ba60b6c852e0de0718e89d24e43cd479c9fb11",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 352,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004009829cd5432687739ab6ae10af8ea73d2cb53b81ebb06b5961b7badc1676b3ef7b00454f7cde56774a01312d574a9193c1a5fe5336fbe62623ad9bf81143789f9f90012f955697ed578207197bf9aac3896521615dbacc8dc665d4f1715b08439f49c2aa6ed337023ffccc5075a85944936826db92f919737ca3afeadba1847084bdef7",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 353,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040126e3c959cd41120bb83693b1d6a034b385137c1bb3213b776122fed96056e329885718a73bee639c0ba4b68818682f498ce5496925002bd7652516405fcc4fecad0073a9c6e3b0c694bf7cc8ccbbd09800e81e3548ba44a0c2381cef0b07bf702a19054bb5d717a1b79294609cbdafd4e2018064f7b2c4c204d818eb7ce521c3268ce5",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 354,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040153dc481ab3c5dc8decd24ceaee1bec77f59f21f7f31c19538af047d281ac9e2567933fd3d21096b185d4098919571931bb9b0be7197995e2fbaf21c8a10007ade001ad69f08fcae164390be826256b50fae47502ce0e9ca46af0c490cb4033c886f88661a99ff2bd3c9c8e7da30faf2b4c769edc5831810ac05054c97e41063f496e1f",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 355,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401f586611c87150288c3e86116c5db94a26718978829d701ddac05e9b0ce22dee4b18e95f60cba783ed3384da373deaefc57b8265d3a34eeb458bf24b9d82be32819008456e0f1d80492ef0078cc246d32fc7c7fb6720b4d458b51b2098d35746752b0ef0345bd0d342dfee6dd2f12ed12b34bd95d058c2811fd479d2dde32180e6c9ef2",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01ffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc000000080000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 356,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004015edc87fd499a73eabffd14d2b6a70a8fb69b6a39d0d9c4dda2337b53cc72e49a9e3d5a2d9e8930cfa11852dac33443227fba6684bd74732e6879884b6ef9dae98f010eeb8d2e3360ea9726628085268af3f2a05ad41235d0a892098bd661b636f7ef0a820282906eda3f1ff1980b98fb5937228e9edcd6332e3641216c7307e7f3f452",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 357,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040131b43002f7e687eec1ecf6a253c2ccc9e48f04d86fccd18fee0d2d22191f1ea539c40d521970b4709dc03986f647e0e8bb3340cf8a3e643a3541035437cf25f01500b27a55ac45f0296f8c9656bcfd52b5cea9f4115c06e4c64319609847d45e92418400e7868672c0d3e6e5e6e004a7190476ed77cfc33ad19a4bd2c615ad9950f374",
+          "private" : "0a2b6442a37f8a3759d2cb91df5eca75af6b89e27baf2f6cbf971dee5058ffa9d8dac805c7bc72f3718489d6a9cb2787af8c93a17ddeb1a19211ab23604d47b7646",
+          "shared" : "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 358,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d20ec9fea6b577c10d26ca1bb446f40b299e648b1ad508aad068896fee3f8e614bc63054d5772bf01a65d412e0bcaa8e965d2f5d332d7f39f846d440ae001f4f87",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "0053bf137fee8922769f8d0fe279caa4dac9c6054ad0460995588a845d0a959e24bc0fc2391a2b92f7bd400f50a11a9db37f07bef7fa8dad2a903fcf534abc8736f7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 359,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010010e59be93c4f269c0269c79e2afd65d6aeaa9b701eacc194fb3ee03df47849bf550ec636ebee0ddd4a16f1cd9406605af38f584567770e3f272d688c832e843564",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "01c95ac417c90a520149b29105cdab36f528a23efb5621520dbdafea95a7d43499c4c8be02cd1c2de000da18104fa84a1e9ece6386f0e0efa5234a24595d7c4c96f4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 360,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200d9254fdf800496acb33790b103c5ee9fac12832fe546c632225b0f7fce3da4574b1a879b623d722fa8fc34d5fc2a8731aad691a9a8bb8b554c95a051d6aa505acf",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "01b47ec41e3a5abd9dd9808fc04d9078cbed72b9eba98d3c1ded70a29938f0efd5a27a7113ff721f122cb17411de307a355c685074f5766b6d1a033d2fa188c945b6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 361,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000005f880f50ec94bfac6658fa2fce05945c6a36b266407b6fbd5437a83e2f2f9b9c50a734872e48e70df65457f13e47d06c6b8b29f4735acf105ea63e051904d18aea",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "013aefe3245728a08c904fe7d61cd9c2fdac63f29cf664d8f161bebacb93f8a710e9692f9689480ad498de00f00061e40e46e76e4754c1130ef4217a58933e0b1dc6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 362,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff000000000000010000000000000000f33ffc45da3eac1baab727ab8fd355cfa134c42047d55262651654fb50df7e9a5a75f179c8c86c4388213b5687dc43dfebb37f30128703c44ccd5c3284833b8717",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "0168df272d53e3161926168c4aeab5f355b8d2a6689cfd567f2b6eb2011a18c775ac2a21f8dd497f6957217020b3b1afcb7021f24fccc2523be76a2bff44596e5a14",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 363,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00cd2839d857b4699f5c8e8a0194786e26a862f086b4ba80746ae5225ed3aa68f96b7aaec55225830bb98f52d75221141897ba49d7a31ebbf0b6d7d31352e5266190",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "013db1b9241b23d33860d32dec37a79e4546a41afdfdd9c438d04e1f8b566ac8d9d3f572c293e96943722a4ee290e113fffaa82a61867d9ca28d349982354c9b256f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 364,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000813d9829119f42ffa95fea8ba9e81e4cd6a6ca97fb0778e12e5f5dfe35201dd4cca8eca0d2e395555997041381e6ac1f18ddf4c74e0b6e9041cfdca1d1c103091",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "01d2bbe9f754584ebbc7c7ad74136d1c8a144948948aa8be49989dd9b4c514db2e2ab1e0713ad1699f632dd2cea53da218ed549f030a113e282fd9e3be462d9aba84",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 365,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004010000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff00878ad597d290db2cf660594aeed0f9b7c8dd68451d2d1b2cbc816b1ec4f35465b3964aff2edf1255163f5fca580132f85cade2887a017e7cd0b37196ad85221107",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "000f37a2e2caef54fff4126c0fa96e7c47f0cad74626ef91e589e12d2e1e8c221be7295be9dc2712b87bb0aa0f5880b738bc1242f2ba773bf9eb2a54e3c1ca4758d7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 366,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ff00000000000000000000000000000000ffffffffffffffffffffffffffffffff000000000000000000000000000000010000000000000000000000000000000000b5e1191b449fa1ebdbd677daa48f90e2d1d6c058c877087cafd9364d99dbb283c68402e6e6c5f5411b2ed42824d8b280ceb910aba6847883a7e3780e2132af41c1",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "017aeb254d9c8c8ee06215ff33811357da73bf7f6dd6d7f8f176d62c065a88a9005f680c630e9f2763585ea2ee76b6e4ab45e673f814ebfa95947c0c63fb24fa6e9b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 367,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff00207513d615656a1cc7505c18aa21b08e2b1d5a841de0816cc29c004efdb2d902ac1a7bb05e20722b576b64a3ddf4d2486421ac706bf4a424f252386368a5340fb6",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "0061bed42248a37b4625ef04c4f9c7ef69ee3c6f9503378351fcab1b8ce1343206997eec1b88449eb6f7355711ea1a818a486ee30a24126241a7e2289267cf5dd61f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 368,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff001fe800c50e54012b75a33e4be7d07c8d60f29680a395e951a6a31c5096b0ea928fc2cbf327dd784dc0a7ca46ea73992b758b5641364b4aba39e93798a4d925a008",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "001067d9104e296ef42b944587de11b10df05d2d959ed44cac9e7ef1c7a05d90819c43bc79c7397918f957cc98db931763bbeb1bdfc35865e8a359a013f13d60c433",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 369,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000008dd18a1f5e482140be79bb65a21ad60c8987e532c84345f0135affd46ec71ef02b1ca3ad56f301d955fa306c122d441d6fedcf8b855ef256350bf69d23a7207ad9",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "00b779d83035cf7bb0bb04c7b2f46d08f6791f0d1542c9bcce7250e772b12ad8e38fce1d2b063a06f0fa3a1b072dd976f5f8542979903075162f1f5c6ba3b76cc45d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 370,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff800000400000100566203dd325a081c4441f001f780365874fd3d0c9bc47227481afe76a93ae1bfde63af972203abfe22c63b80e83f7cc2184c3cb8cfd0152c54324c4759fd1f9a50",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "01afe5d23733728b79c743933b9ba7dfec5ed19b7737e393908a1d000918aa795d1ce0ad533983d018f927b35d2af6463356573f387febd75911a49486202ca69d3a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 371,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff00b11c668fbd549f36889f7b63434051da26f15705839136b1b14a09152d7a182ea7806c35478a32d3aa3c9c1627a61519ebec71b36fa77449025b8829e27f307834",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "019612aeb386febb1a28096fe5b2f682dead02389785225b80a27df439510d08349a193839525f248b7f9bcabfd3dc8da8cc1724022299b7b5e72399d89464b82e44",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 372,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000008000000200aa75efc0a8daac1d73f32c9c552414bccf44af8e74331b47439e7dcc49a135b3ee61e9f69717d89b4bba3567a195aeda13fbec634bf2984b5ec6b6f80f5978ed5a",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "00570673f87adcef49c1f011e8b9f1e11f7fd3b3c93114d08d3f515aa4a895a6c701c523063bdc13ad1db0a54f6e7b476fe10db2070441befc58c8cff3c08ef76e59",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 373,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0010e59be93c4f269c0269c79e2afd65d6aeaa9b701eacc194fb3ee03df47849bf550ec636ebee0ddd4a16f1cd9406605af38f584567770e3f272d688c832e843564",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "0016aaf228b0aec190d4e4e5b8138ff9cc46d705da1bf002901c6ab420f59314d5b641712b14ef3e4fb125652c47888676804fb5575b741a8408c5625bfccff4fdda",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 374,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00d9254fdf800496acb33790b103c5ee9fac12832fe546c632225b0f7fce3da4574b1a879b623d722fa8fc34d5fc2a8731aad691a9a8bb8b554c95a051d6aa505acf",
+          "private" : "12bc15cf3981eab6102c39f9a925aa130763d01ed6edaf14306eb0a14dd75dff504070def7b88d8b165082f69992de0ffa5ee922cb3ab39917da8524cac73f0a09c",
+          "shared" : "00a5d6dfda2b269f4ab895a41c3b71b6ba10d5c9f0d9b3e730275345e4721594abfd39464c227716ded8ef3e60bb1ca0b551716e3f6eebb48d5ce8e0ab58cb1b73c9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 375,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "3",
+          "shared" : "00f2246431b597930f2eae61e9aabbd39f8f6ae97c3cf2521a6aeecedda10b5ef5f3b2eb3a8906d02f51d244710aa9e19cc0be21db920132be1c91deb85e466c28df",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 376,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "00347c51f587c726070bdeb9173d0a547427ead3f2c8de62d9ecc3013285f645d220931520bcef85d08cfb6786045745fbfbfb1924c44a89d06676131a965677272a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 377,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "01c41dc4437c2f2b94a940711b3a691723397a1f83d6bc0c67ddc7a657160925c7f85bb4eb3842b60b2610ddb7c0b8676267710e58359a8750843c6d8e25d48d1cd9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 378,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "006a239cdb7a783840658d5f314bfe5c51e806a4bf1236f8421265bcc503c673eb16c5c2b38b5717fa04ee7dbcdeb15c871711507abb7557a8a8c7b3250141e854d5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 379,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "0112dbf9713aadd478e4f2ebcb058f05b512b1959c7da1994f851f373ce8c341d39c6843373f6fe559905953e1147640159437953c571961c09bad157a8e1a5bf476",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 380,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47adbb6fb71e91386409",
+          "shared" : "003eca2210c8623105085aa284d119f3d716730595c6291aa89bf32a95e8a5fdc64f3d76e92494a43a9dced12d05b6dca4ffe649b32ac12cb0202e702dc83a2cb277",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 381,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb5fb71e91386409",
+          "shared" : "01c4cae9fbfdd45de51d8525e8447a7553c35cf358f1346f1d79666887bb749a3ba0de62e1866b47a447d53b6f1ca5a33ec94507e2cfb65544f5a1195fc6b4dc5810",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 382,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb67b71e91386409",
+          "shared" : "008073b4796e748f3d0de5e85b22aed463f1a6aecdb336bc287b50d139e3591ef5f86b78c3f6051467755f059f295d758075347d657aaae02383838bb96071eacbd4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 383,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71d91386409",
+          "shared" : "01f11ff8983792d4a790d0de4b56d078b9033ad6318a440e8119342937cc48a39375150ab2cf98273b0fe35d5a3af5d84322a685e89f2cb378a99b9b7bac87e44952",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 384,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138631b",
+          "shared" : "00286cefaaf38ca4c6657eb9b187d8614d51775fd71c1a79b4c0ef1a0d4ce72b6f5b2bc854a4e78283530942a3f4fd2a8586d5ea51513c89d3d29de5de06321e118e",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 385,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138639b",
+          "shared" : "014790de14c481f1336fcb7d33a8bf8e23eb594cc48608e9edfe0e326e106b67e7eaa3f04ec9985599178f632a5ee6419e11217060e9fcd5958a43882bf8cd3be6ba",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 386,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863db",
+          "shared" : "01ae775dbc4096a3aea7977b1a0af4b2830ecf9ca927a6247fba4cccb46b3f71d0e7abb8dda72d1c1ee7bb5b875b4773cc8df40f732819c4147da330775d1742ea35",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 387,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863fb",
+          "shared" : "01979fb05e068a12a3f20cfdfb9eaee9f22b356edcc7655383ed38124b86814f86a6f2216a34f3fc2299d403ee42408f95d08c5c6cd11db72cbf299a4a3c2545be25",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 388,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386403",
+          "shared" : "0197ebe26798bf67f06ff0282773af75115531f41d94c093d87481b76bef707bc222f2d6672f84a00fa20c5ed27027ab4006b68d93ee2151016c9ddbe014346272e2",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 389,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406",
+          "shared" : "00f2246431b597930f2eae61e9aabbd39f8f6ae97c3cf2521a6aeecedda10b5ef5f3b2eb3a8906d02f51d244710aa9e19cc0be21db920132be1c91deb85e466c28df",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 390,
+          "comment" : "edge case private key",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ad5043591dbe81657fe3d1c3d7a516606ad9d320a35fce8aaec8a950fb53f95388f3fc48be998e99334ad9e9234cded14471fe86caccaa07d058ee8771733ac3b900854de36366590b9ee4d0370ea6b00f7ebd8156ccf14e99f1a5344a9b4964fbb8348b081a8840c6b64be77997ad8bebfea5e7d9f7a6a7fa6d7655c50b2b7835f314",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386407",
+          "shared" : "01c168314cdc85757ade34a52a9e5379ffa5968f084b7e404939a8033a0fc698e26211754b9b2c04cf8a1420abe6e986ef1a238bbb91dd402b72e0ed50a876f1a83e",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 391,
+          "comment" : "CVE-2017-10176: Issue with elliptic curve addition",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650",
+          "private" : "1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913863f7",
+          "shared" : "01bc33425e72a12779eacb2edcc5b63d1281f7e86dbc7bf99a7abd0cfe367de4666d6edbb8525bffe5222f0702c3096dec0884ce572f5a15c423fdf44d01dd99c61d",
+          "result" : "valid",
+          "flags" : [
+            "CVE_2017_10176"
+          ]
+        },
+        {
+          "tcId" : 392,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 393,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 394,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 395,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 396,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 397,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 398,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 399,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 400,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 401,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 402,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 403,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 404,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 405,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 406,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 407,
+          "comment" : "point is not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 408,
+          "comment" : "",
+          "public" : "3015301006072a8648ce3d020106052b81040023030100",
+          "private" : "1c6cafb74e2a50c82c7a63d13294bfea113f271e01ae305f79af43203cd32115ecdf2fee5fedba2ad3126783db0c3c4d3029a14369e8f80dbd15d512f13e51c503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 409,
+          "comment" : "public point not on curve",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fe1",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 410,
+          "comment" : "public point = (0,0)",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 411,
+          "comment" : "order = -6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005449",
+          "public" : "30820245308201b806072a8648ce3d0201308201ab020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd166500242fe000000000000000000000000000000000000000000000000000000000000000005ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf7020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 412,
+          "comment" : "order = 0",
+          "public" : "308202043082017706072a8648ce3d02013082016a020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650020100020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 413,
+          "comment" : "order = 1",
+          "public" : "308202043082017706072a8648ce3d02013082016a020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650020101020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 414,
+          "comment" : "order = 1598335257761788022467377781654101148543282249044465229239888363328190330275719844327554513312228302828260696579553960150541916632196023208175974174",
+          "public" : "30820241308201b406072a8648ce3d0201308201a7020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650023e01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 415,
+          "comment" : "generator = (0,0)",
+          "public" : "30820245308201b806072a8648ce3d0201308201ab020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f0004818504000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 416,
+          "comment" : "generator not on curve",
+          "public" : "30820245308201b806072a8648ce3d0201308201ab020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16652024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 417,
+          "comment" : "cofactor = -1",
+          "public" : "30820245308201b806072a8648ce3d0201308201ab020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913864090201ff038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 418,
+          "comment" : "cofactor = 0",
+          "public" : "30820245308201b806072a8648ce3d0201308201ab020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020100038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 419,
+          "comment" : "cofactor = 2",
+          "public" : "30820245308201b806072a8648ce3d0201308201ab020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020102038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 420,
+          "comment" : "cofactor = 6864797660130609714981900799081393217269435300143305409394463459185543183397655394245057746333217197532963996371363321113864768612440380340372808892707005449",
+          "public" : "30820286308201f906072a8648ce3d0201308201ec020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 421,
+          "comment" : "cofactor = None",
+          "public" : "30820242308201b506072a8648ce3d0201308201a8020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff308187044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f000481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 422,
+          "comment" : "modified prime",
+          "public" : "30820244308201b706072a8648ce3d0201308201aa020101304d06072a8648ce3d0101024201e99d17d498f3c68ed8e50430ec4f36c14dbeeaf7652e985636bf0548ffb981e9e011607fd0059cd4fe51e882f19a3839ebe7f1d7376cb761431b214ed76970cc0130818604411662e82b670c3971271afbcf13b0c93eb24115089ad167a9c940fab700467e161fee9f802ffa632b01ae177d0e65c7c614180e28c893489ebce4deb128968f33fb044151953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f0004818504000000000000000000000000000000000000000000000a14517cc6b91f8000000000000000000000000000000000000000000000000000000000000000000000032c006b0f530bec5bed532357d436727699f0e3c5b9366f1a435be640b97cd43d937655b1f157c7d0c7df25011fef7c3ab7d8e556e6125b59b847fcdd89a4051796a797024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913864090201010381860004000000000000000000000000000000000000000000000a14517cc6b91f8000000000000000000000000000000000000000000000000000000000000000000000032c006b0f530bec5bed532357d436727699f0e3c5b9366f1a435be640b97cd43d937655b1f157c7d0c7df25011fef7c3ab7d8e556e6125b59b847fcdd89a4051796a797",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00ebef6771455911ee573c183e990f7086650f9bafdb722c896751bd2c0f87959c78a39382d10fdfb46fd3515c8feb590943dd79778b13adbc7f670ba2a009753483",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 423,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 424,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 425,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 426,
+          "comment" : "a = 0",
+          "public" : "308202033082017606072a8648ce3d020130820169020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3046040100044109a88e6f050cfefa0b49fac45689b6b93ad4fa3b65db7d2f4cb31b67fe056a100066dd80dc5f785d27f82e3369eb22ab2c5729a9e5d9906a1dc31e02f84026484a0481850400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020101038186000400c2a43ac3742b09e006c2dfc9c36444d7e699f567a73f674ce257330b312dd7a8a04fbe92d1d9acbcc65f6184711ada5bf39f6e11e0cbde98f1640d099eb90dfce701802d7755c2fe3180848d4a70b170096ec64eba99b478ba7f6fc129b0566279b8e1ab7962fa912fc4ae53b5202a03520617843dc63e5cb5f956ec7f1453d0865fdf",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "00fb8542487cbd45e609632f681db6b48fdabed9b97a2467a34205eadadad9dedb54a2a647d23dca68e929a2041888b091f4bb4023a0517be669a6c9f9c847ef89de",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 427,
+          "comment" : "public key of order 3",
+          "public" : "30820244308201b706072a8648ce3d0201308201aa020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff30818604417af4d9fe89294169daf9b160f39a91e120a861b73b3b76e7dc745fb0db95f971ee0ccd362449d3802622e716c7a8252adbdaddbccd2c623bb0c97f437490317df2044111a7799ad8e7166fa74133f989d562e50415238e23c826974fdfa7a72251416b496215439ba73718ccb0616ff9f843550900acb6af5c15d30a7e92c59c1a638c0c0481850401583fa37fa9816eb3cfdcf0dea0b50d09bfd22bff366051f05de03daa4efdbd85a01af7e490d24ad2f1d1f58b1f8f0619ac48c2f46cd4497de599c1aa546b6408d2006bc40579920af44644406cce075c2f0d71534b5a090a208d1324cc360932b1a5a98a3c3144c3b713ce0625365a926c2fc43f578a15e82cb6eb7923ce2b4ddad062024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020101038186000401583fa37fa9816eb3cfdcf0dea0b50d09bfd22bff366051f05de03daa4efdbd85a01af7e490d24ad2f1d1f58b1f8f0619ac48c2f46cd4497de599c1aa546b6408d201943bfa866df50bb9bbbf9331f8a3d0f28eacb4a5f6f5df72ecdb33c9f6cd4e5a5675c3cebb3c48ec31f9dac9a56d93d03bc0a875ea17d3491486dc31d4b2252f9d",
+          "private" : "1396a99a337821d8c92d75f562793c70afa4074ae5e6dad2bd2cc6aea8f36f6c45ddde73931440d229f340093ab8c6fb3f20d20999a37371fe92104692136d019b7",
+          "shared" : "01bca56f9c0ade0485006f1bcfc7a95a95dcad50e8768483cf97de9ecc89de4f0abae22895b3deb6b088bd7f2596fd7d1c0d5ea84789d3e110e1e4c3de75b0b92750",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 428,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004af6dd5b71a8c1cf921e36854ae091aaa589d337e740e8579f816eb9e36b03eec5cf956d0fdd2fc1687335507fc1c4a5717d3b5b8ea8340d1",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 429,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000453366db79b320781936df61bb55d4499949d813ee5abaa5dda70da4f97f68228ccc69d7cd0b7266cfc28d0dcafdf3e83738cc611acb08f8b896c4ecf82dd65ae",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 430,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004aa45c13ce3cfea8538422712903edc0ce56df74ede0776e843555a786f9738de1943dffd729addfd4772169751d7765a45b5bb540a47d198f4c8c7c21e67560c1e12f70b64520109bb8858a3f8d6bb4012003431db0778633313fdb9464c47ec",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 431,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000475e01a1555380be188d69aac340a4675e4a6f73d63976a1075249827d8ecc2a31e65ed1eb591954e33a38f68ef8aa6c930229d8755e53257602b3eaa87de6f02",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 432,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004905a06d5bc093697155aaff67305976a769b904d8db9573c4be361626def2ffe1d5ec14462c02e5ffb24fb3edb2b6c77a5cfee2492db757b",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 433,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200042b87df1b6a5cbc4c4a184b7eec9b6c0483f7b80e6477b29649630c37481876bb0e3423f7a00d469320b7e60c88370979064efb9ceb8b387aa87a7c6941ccd9ed",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 434,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000470df62394ee036eefbc8ef11a9a5f3a8af659016f29e7125e52cfda0a74e52c7b21d18ac4375f5e4164c5338fa2f545a3fb2022f0e0686d5b4882958f72b1bb626e37093e3f19673968c237823327fd6",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 435,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004808dc7b1c6d3ec470a7fe5d6144c9c3a8c92b116103aa2edbfce0b2c827312eebcd1350d09a739eac901af341487861b195270f671e0a758deb23222db4fe7983d42a785b35fd158344cd6483c4da5b409e77d0a284dfa9c3e0d91a4d275fce9",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 436,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aa11b560dc1e572f2374e5869210304d66d95b1d8ce40940157f5f5b4a7dc8a340f7c305d6bea289f5c430eb888e2a03528336aaf4680d9d153cd162e2229df330425025df2625b147568927f6acf704e4936f8989ff9d44f33ee22196e70dfd8711e8934d8d42abb4b67afcfee213c3ad5e5c83fcf4283d253d6c5c0e581970",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 437,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00048d7a746de095728a8d83219e587040cb6e794d088ab6eab426638202579850b0f235edcf4eb8adcb51bf41878f6b71a1f2d4101022964340",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 438,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000424ad316bf41e4102dd7ae16311b64464df2d13ea68a11dd27a4445ed900962180ff8c627ed73f0c667863ee3a671e6ed1fa2781b51a229ee2cd21fbf69437d60",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 439,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004548ce4997cc618800d3834dd4b3346e4559be066ab5d0cecd7123c4de940c168fecd3bae067fe3fc7aee875c9da0a86932f0779f42344470860c22dbc6f305eab792fc0874157e175c7d3c4d3bf54c4b",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 440,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200044fc2b35e3019a57a8ca6efe2ec1f72072c599a78c2725f7cfc2d9edf220b5f6abdb0c0d8d160182de451e26bcbb4e8c18726263e21ce56fb4bafaa1f186c745e2c8392ef8c5a1c03f5462ebbbcde0ffcc31e9a0b3e898ddb9c1c79e420fd7a35",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 441,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200047122f743122681ac73b0d611af86847d8bec654cf99e7eaf5d4f684e4078a8e61dc6d07e831ad02cd40d41dbdb6b0e877d960b78a5ac34c1e6ce7c483503d6de2eaddeffbfb3f144d29d13535a05815934186707146e45f64476bbdbc8645be973270a4c5e35d70ffd5eab2f08d1fb04762bc8aa80e999da14f744be9ff8c923",
+          "private" : "2b0d77cd5c47890a52612fc9b38d804266b9784abca2b94de99bdc67475aecc2abc31e72a6dada0cf1d4d776b002c8d2dbd601ab8a0cae4157370846b20e8dd657",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 442,
+          "comment" : "invalid public key",
+          "public" : "3058301006072a8648ce3d020106052b810400230344000200429cb431c18f5f4e4e502f74214e6ac5ec2c3f86b830bac24de95feae142ca7d9aa8aa5b34f55af4b2848f2e6ba6df4c3ecd401a1d7b2a8287a332b202196fadbb",
+          "private" : "1c1fb2cac9087a3397814b198a80e2ea5b437aac1b41e8a2bd8fef8700e4812aa817320e6e1e3865bd2cf75e43a78be5c27ff1c4b5f5019333cb37d0c9c4ff3ec61",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 443,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3058301006072a8648ce3d020106052b81040023034400020108cbf3c9bf8e42135d87127556831076d84d5e549e645afda8a099249231b59b6c508dee4e91c9a543e90ebc82613f86cb1290e29102a0f2fdeb57bf4193fb4639",
+          "private" : "6619644155c449758f65e2dfe7ba89dee1e090c1d68b6342f43cb1ac000090a7f0408138c1de217990bb015cd1d95f1d884cf659f7324f2fe21eeba63ea988aacd",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 444,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3058301006072a8648ce3d020106052b8104002303440003011f2dca6b686e2141c11822e2d5439261583ce98cd6c4041c6d1be9e17dee33ea4a65c3e8cca6de50a30a39c788a585f1188bef0680a9c0264b3c8dcf494d0eb948",
+          "private" : "0a257d97aa4e5195e2919c147c1639bb0da0cce479a036489006b7b8e7e885096066e5adc8fe7c45940c5a6b94d5065b966a45f099a0cecfe9cce1b3e99dca479f2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 445,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3058301006072a8648ce3d020106052b8104002303440002011f2dca6b686e2141c11822e2d5439261583ce98cd6c4041c6d1be9e17dee33ea4a65c3e8cca6de50a30a39c788a585f1188bef0680a9c0264b3c8dcf494d0eb948",
+          "private" : "0a257d97aa4e5195e2919c147c1639bb0da0cce479a036489006b7b8e7e885096066e5adc8fe7c45940c5a6b94d5065b966a45f099a0cecfe9cce1b3e99dca479f3",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 446,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3058301006072a8648ce3d020106052b81040023034400030108cbf3c9bf8e42135d87127556831076d84d5e549e645afda8a099249231b59b6c508dee4e91c9a543e90ebc82613f86cb1290e29102a0f2fdeb57bf4193fb4639",
+          "private" : "6619644155c449758f65e2dfe7ba89dee1e090c1d68b6342f43cb1ac000090a7f0408138c1de217990bb015cd1d95f1d884cf659f7324f2fe21eeba63ea988aacc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 447,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3058301006072a8648ce3d020106052b81040023034400020009cc73141cf1843d2b2c95dc5cbc4d615c6da4814c1c7208615d8e78c7a8666aba1852faaa45a45d32bd0fde6ea78f262a96bf1e02949cea48c33c695103683048",
+          "private" : "2a35258787f91ad0bd3432c3022e4d3ed349c8768a7e7caa1836022fc0c89a9073f6ce14d0990d5b7bb413061c7160e7bd566a5c89f14901b2cc19f1ad531f41e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 448,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3058301006072a8648ce3d020106052b81040023034400030047b9cf28e04b38796858545d60d6133fbdc20ede086e5d95111c982b8c276628235e536c075637a97c0a6c30d02b83b19e578203473eea16dfdeaeccb1dc0d9b19",
+          "private" : "1afe5c77a626161fb2c25964c7895b9fff787099db83f077f05a4bfa320fb61f9315bb44d3fb9dd72225d9d993a18df82ac53fb4a5f86b23cb650e5e4778066f677",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 449,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3058301006072a8648ce3d020106052b810400230344000300c18410f5727ee0101a52ef95c0ac455cbc65bf9967f0a2c419aa0a291cabad569f2337e102d0a9128f4212dbf9fa9e5a8f14ca7f28e82977281facdd9ca7a92c78",
+          "private" : "24ae709e1644e3087b52470c565268becbdbf97de59916763507d109c2e5b7c21727c64e9b560aa248d7bc9fe0ac95720d507263b7b2859b056ea165301cd599d5",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 450,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3058301006072a8648ce3d020106052b810400230344000200c18410f5727ee0101a52ef95c0ac455cbc65bf9967f0a2c419aa0a291cabad569f2337e102d0a9128f4212dbf9fa9e5a8f14ca7f28e82977281facdd9ca7a92c78",
+          "private" : "24ae709e1644e3087b52470c565268becbdbf97de59916763507d109c2e5b7c21727c64e9b560aa248d7bc9fe0ac95720d507263b7b2859b056ea165301cd599d6",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 451,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3058301006072a8648ce3d020106052b81040023034400020047b9cf28e04b38796858545d60d6133fbdc20ede086e5d95111c982b8c276628235e536c075637a97c0a6c30d02b83b19e578203473eea16dfdeaeccb1dc0d9b19",
+          "private" : "1afe5c77a626161fb2c25964c7895b9fff787099db83f077f05a4bfa320fb61f9315bb44d3fb9dd72225d9d993a18df82ac53fb4a5f86b23cb650e5e4778066f678",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 452,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3058301006072a8648ce3d020106052b81040023034400030009cc73141cf1843d2b2c95dc5cbc4d615c6da4814c1c7208615d8e78c7a8666aba1852faaa45a45d32bd0fde6ea78f262a96bf1e02949cea48c33c695103683048",
+          "private" : "2a35258787f91ad0bd3432c3022e4d3ed349c8768a7e7caa1836022fc0c89a9073f6ce14d0990d5b7bb413061c7160e7bd566a5c89f14901b2cc19f1ad531f41e1",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        }
+      ]
+    },
+    {
+      "curve" : "secp256k1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 453,
+          "comment" : "normal case",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004d8096af8a11e0b80037e1ee68246b5dcbb0aeb1cf1244fd767db80f3fa27da2b396812ea1686e7472e9692eaf3e958e50e9500d3b4c77243db1f2acd67ba9cc4",
+          "private" : "0f4b7ff7cccc98813a69fae3df222bfe3f4e28f764bf91b4a10d8096ce446b254",
+          "shared" : "544dfae22af6af939042b1d85b71a1e49e9a5614123c4d6ad0c8af65baf87d65",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 454,
+          "comment" : "compressed public key",
+          "public" : "3036301006072a8648ce3d020106052b8104000a03220002d8096af8a11e0b80037e1ee68246b5dcbb0aeb1cf1244fd767db80f3fa27da2b",
+          "private" : "0f4b7ff7cccc98813a69fae3df222bfe3f4e28f764bf91b4a10d8096ce446b254",
+          "shared" : "544dfae22af6af939042b1d85b71a1e49e9a5614123c4d6ad0c8af65baf87d65",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 455,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004965ff42d654e058ee7317cced7caf093fbb180d8d3a74b0dcd9d8cd47a39d5cb9c2aa4daac01a4be37c20467ede964662f12983e0b5272a47a5f2785685d8087",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 456,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000406c4b87ba76c6dcb101f54a050a086aa2cb0722f03137df5a922472f1bdc11b982e3c735c4b6c481d09269559f080ad08632f370a054af12c1fd1eced2ea9211",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 457,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004bba30eef7967a2f2f08a2ffadac0e41fd4db12a93cef0b045b5706f2853821e6d50b2bf8cbf530e619869e07c021ef16f693cfc0a4b0d4ed5a8f464692bf3d6e",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 458,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004166aed3bc281705444f933913f670957a118f8da2c71bd301a90929743e2ca583514a7972e33d6fea1e377ef4184937f67b37e41ef3099c228a88f5bfb67e5b9",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "00000000000000000000000000000000ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 459,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000436e1e76ffdbe8577520b0716eb88c18ea72a49e5a4e5680a7d290093f841cb6e7310728b59c7572c4b35fb6c29c36ebabfc53553c06ecf747fcfbefcf6114e1c",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 460,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004728e15d578212bc42287c0118c82c84b126f97d549223c10ad07f4e98af912385d23b1a6e716925855a247b16effe92773315241ac951cdfefdfac0ed16467f6",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 461,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004ca03ff8e99e269576cf7564545c89268eb415ff45778732529fa5997cc2b230950d6b84b729bc07f9b2d92754281cdc0d289d2453385aef77e4bdc69bf155c5f",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "000003ffffff0000003ffffff0000003ffffff0000003ffffff0000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 462,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000451be66137e39bbf35a91c6db5ba6919ff471d885ca94462eaaa65b1eac366baa5910de70b6e09e97aa00621ef18f2801719b199b3e7769fdab2bd909b2f340d7",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 463,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000423556564850c50fba51f1e64ef98378ef5c22feafa29499ca27600c473cace889d5679e917daa7f4c7899517d37826284f031de01a60bc813696414d04531a21",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "210c790573632359b1edb4302c117d8a132654692c3feeb7de3a86ac3f3b53f7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 464,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004ddbf807e22c56a19cf6c472829150350781034a5eddec365694d4bd5c865ead14e674127028c91d3394cac37293a866055d10f0f40a3706ad16b64fc9d5998bd",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "4218f20ae6c646b363db68605822fb14264ca8d2587fdd6fbc750d587e76a7ee",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 465,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004595e46ee7c2d7183ff2ea760ffd8472fb834ec89c08b6ef48ff92b44a13a6e1ae563e23953c97c26441323d2500c84e8cee04c15d4d5d2cc458703d1f2d02d31",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "7fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 466,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004e426e2f5108333117587975f18d8cc078d41e56b7d6b82f585d75b0d73479ffd75800fd41236a56034bed9abc55d82cf059a14d63c07cd0750931714731a1ca1",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "8000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 467,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004e1c7076caf26010b1767f1a9c4156b5b4236368d5d90dece3441b734e8684ee6b3534c3c54e614e594dce6ca438b87c424c8e80f8fae226bbdf50e4906c13f6b",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 468,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004663cea1063c9916b75e85fc815d8a2370ec0a02aceef3db022e395db8b03bf3f188787f4047dc106807526502c7ae880e471c929b92e2384489c8070b5bcc109",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "ff00000001fffffffc00000007fffffff00000001fffffffc000000080000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 469,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000424175c078e305d3139e5dab727a6ab8587b26daa470a529a23c10585cb56c038bf1f2b937ae074ff94b15f5cb5e60eb5d32afba2077539db794294bcaab71a81",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 470,
+          "comment" : "edge case for shared secret",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004008d71c712dd95881cd1400dbe7683acbd8e269d25261b08f1f491b45e3b5621778182a24198b0f23502d06e24c45122e1f420af48dc1e17b1ea923386a33062",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "ffffffff00000000000000ffffffffffffff0000000000000100000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 471,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000456baf1d72606c7af5a5fa108620b0839e2c7dd40b832ef847e5b64c86efe1aa563e586a667a65bbb5692500df1ff8403736838b30ea9791d9d390e3dc6689e2c",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "800000000000000000000000009fa2f1ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 472,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200045e4c2cf1320ec84ef8920867b409a9a91d2dd008216a282e36bd84e884726fa05a5e4af11cf63ceaaa42a6dc9e4ccb394852cf84284e8d2627572fbf22c0ba88",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "80000000000000000000000000a3037effffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 473,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000402a30c2fabc87e6730625dec2f0d03894387b7f743ce69c47351ebe5ee98a48307eb78d38770fea1a44f4da72c26f85b17f3501a4f9394fe29856ccbf15fd284",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "8000000000000000000000000124dcb0ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 474,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200045e4c2cf1320ec84ef8920867b409a9a91d2dd008216a282e36bd84e884726fa0a5a1b50ee309c31555bd592361b334c6b7ad307bd7b172d9d8a8d03fdd3f41a7",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "80000000000000000000000000a3037effffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 475,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000402a30c2fabc87e6730625dec2f0d03894387b7f743ce69c47351ebe5ee98a483f814872c788f015e5bb0b258d3d907a4e80cafe5b06c6b01d67a93330ea029ab",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "8000000000000000000000000124dcb0ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 476,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200045450cace04386adc54a14350793e83bdc5f265d6c29287ecd07f791ad2784c4cebd3c24451322334d8d51033e9d34b6bb592b1995d07867863d1044bd59d7501",
+          "private" : "0a2b6442a37f8a3764aeff4011a4c422b389a1e509669c43f279c8b7e32d80c3a",
+          "shared" : "80000000000000000000000001126b54ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 477,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000400000000000000000000000000000000000000000000000000000000000000014218f20ae6c646b363db68605822fb14264ca8d2587fdd6fbc750d587e76a7ee",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "12c2ad36a59fda5ac4f7e97ff611728d0748ac359fca9b12f6d4f43519516487",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 478,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004000000000000000000000000000000000000000000000000000000000000000266fbe727b2ba09e09f5a98d70a5efce8424c5fa425bbda1c511f860657b8535e",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "45aa9666757815e9974140d1b57191c92c588f6e5681131e0df9b3d241831ad4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 479,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000400000000000000000000000000000000000000000000000000000000000000032f233395c8b07a3834a0e59bda43944b5df378852e560ebc0f22877e9f49bb4b",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "b90964c05e464c23acb747a4c83511e93007f7499b065c8e8eccec955d8731f4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 480,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000400000000000000000000000000000000ffffffffffffffffffffffffffffffff3db772ad92db8699ceac1a3c30e126b866c4fefe292cf0c1790e55cee8414f18",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "8163c9dce8356f1df72b698f2f04a14db0263a8402905eee87941b00d8d677f5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 481,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200040000000000000000ffffffffffffffff0000000000000000ffffffffffffffff31cf13671b574e313c35217566f18bd2c5f758c140d24e94e6a4fda7f4c7b12b",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "1a32749dcf047a7e06194ccb34d7c9538a16ddabeeede74bea5f7ef04979f7f7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 482,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000400000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff73b0886496aed70db371e2e49db640abba547e5e0c2763b73a0a42f84348a6b1",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "ab43917a64c1b010159643c18e2eb06d25eedae5b78d02fa9b3debacbf31b777",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 483,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004000003ffffff0000003ffffff0000003ffffff0000003ffffff00000040000000f4d81575c8e328285633ccfd8623f04dd4ed61e187b3a6d7eac553aede7f850",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "1648321c706651adf06643fc4ae06041dce64a82632ad44128061216cc9827ff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 484,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0001000242217b7059b3ddebc68e95443f6c109369e1f9323dd24852ac7612996b6e5601",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "fb866b2e4b1f9ed6b37847fc80a19a52e1e91b75d713b0d4f6b995d2d3c75cfe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 485,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004210c790573632359b1edb4302c117d8a132654692c3feeb7de3a86ac3f3b53f75f450dbbf718a4f6582d7af83953170b3037fb81a450a5ca5acbec74ad6cac89",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "1908ae936f53b9a8a2d09707ae414084090b175365401425479b10b8c3e8d1ba",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 486,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200044218f20ae6c646b363db68605822fb14264ca8d2587fdd6fbc750d587e76a7ee37269a64bbcf3a3f227631c7a8ce532c77245a1c0db4343f16aa1d339fd2591a",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "5e13b3dc04e33f18d1286c606cb0191785f694e82e17796145c9e7b49bc2af58",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 487,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200047fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff4b66003c7482d0f2fd7b1cb2b0b7078cd199f2208fc37eb2ef286ccb2f1224e7",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "3135a6283b97e7537a8bc208a355c2a854b8ee6e4227206730e6d725da044dee",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 488,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004800000000000000000000000000000000000000000000000000000000000000069d3cd0c70f1484d4b3bbbd680679ef477a22a07df085634f117c41c08bf1230",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "62959089a7ed477c22cb4f1c7787327318fccca25e5aa3e44688a282931ab049",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 489,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200048000003ffffff0000007fffffe000000ffffffc000001ffffff800000400000130f69b6e95a3303214a73ad982a1f3ee169d7ecf958de7b0bca8a9ffa3b8e8b3",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "04fda5c00a396fad6b809a8843de573e86b0403d644995c83313da51fb1f5880",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 490,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004ff00000001fffffffc00000007fffffff00000001fffffffc00000008000000056951ead861aa8ec7a314fcd54f905bd92c910786375eb7ee5f3a55f8aa87884",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "bbd9937bb51d27f94ecaea29717df789afeac4414e3ef27bb2e6fa7259182e59",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 491,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff63a88b2e0c8987c6310cf81d0c935f00213f98a3dad2f43c8128fa313a90d55b",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "bbd9d305b99ff3db56f77fea9e89f32260ee7326040067ce05dd15e0dcc13ed8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 492,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004ffffffff00000000000000ffffffffffffff000000000000010000000000000066a4456ca6d4054d13b209f6d262e6057ad712566f46e9e238e894deebe3d3aa",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "4ffb2c7962e32d5365f98f66be6286724d40d5f0333ba4fc943c0f0f06cdbb1f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 493,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004800000000000000000000000009fa2f1ffffffffffffffffffffffffffffffff07ed353c9f1039edcc9cc5336c034dc131a4087692c2e56bc1dd1904e3ffffff",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "7c07b199b6a62e7ac646c7e1dee94aca55de1a97251ddf92fcd4fe0145b40f12",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 494,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000480000000000000000000000000a3037effffffffffffffffffffffffffffffff0000031a6bf344b86730ac5c54a7751aefdba135759b9d535ca64111f298a38d",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "5206c3de46949b9da160295ee0aa142fe3e6629cc25e2d671e582e30ff875082",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 495,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000480000000000000000000000000a3037efffffffffffffffffffffffffffffffffffffce5940cbb4798cf53a3ab588ae510245eca8a6462aca359beed0d6758a2",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "5206c3de46949b9da160295ee0aa142fe3e6629cc25e2d671e582e30ff875082",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 496,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000480000000000000000000000001126b54ffffffffffffffffffffffffffffffff4106a369068d454ea4b9c3ac6177f87fc8fd3aa240b2ccb4882bdccbd4000000",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "e59ddc7646e4aef0623c71c486f24d5d32f7257ef3dab8fa524b394eae19ebe1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 497,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200048000000000000000000000000124dcb0ffffffffffffffffffffffffffffffff0000013bc6f08431e729ed2863f2f4ac8a30279695c8109c340a39fa86f451cd",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "8a8c18b78e1b1fcfd22ee18b4a3a9f391a3fdf15408fb7f8c1dba33c271dbd2f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 498,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200048000000000000000000000000124dcb0fffffffffffffffffffffffffffffffffffffec4390f7bce18d612d79c0d0b5375cfd8696a37ef63cbf5c604790baa62",
+          "private" : "2bc15cf3981eab61e594ebf591290a045ca9326a8d3dd49f3de1190d39270bb8",
+          "shared" : "8a8c18b78e1b1fcfd22ee18b4a3a9f391a3fdf15408fb7f8c1dba33c271dbd2f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 499,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "3",
+          "shared" : "34005694e3cac09332aa42807e3afdc3b3b3bc7c7be887d1f98d76778c55cfd7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 500,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "5841acd3cff2d62861bbe11084738006d68ccf35acae615ee9524726e93d0da5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 501,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "100000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "4348e4cba371ead03982018abc9aacecaebfd636dda82e609fd298947f907de8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 502,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "e56221c2b0dc33b98b90dfd3239a2c0cb1e4ad0399a3aaef3f9d47fb103daef0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 503,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "08000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "5b34a29b1c4ddcb2101162d34bed9f0702361fe5af505df315eff7befd0e4719",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 504,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03abfd25e8cd0364141",
+          "shared" : "cece521b8b5a32bbee38936ba7d645824f238e561701a386fb888e010db54b2f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 505,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03bbfc25e8cd0364141",
+          "shared" : "829521b79d71f5011e079756b851a0d5c83557866189a6258c1e78a1700c6904",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 506,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03bbfca5e8cd0364141",
+          "shared" : "8c5934793505a6a1f84d41283341680c4923f1f4d562989a11cc626fea5eda5a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 507,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8bd0364141",
+          "shared" : "356caee7e7eee031a15e54c3a5c4e72f9c74bb287ce601619ef85eb96c289452",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 508,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03640c3",
+          "shared" : "09c7337df6c2b35edf3a21382511cc5add1a71a84cbf8d3396a5be548d92fa67",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 509,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364103",
+          "shared" : "d16caedd25793666f9e26f5331382106f54095b3d20d40c745b68ca76c0e6983",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 510,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364123",
+          "shared" : "b8ae1e21d8b34ce4caffed7167a26868ec80a7d4a6a98b639d4d05cd226504de",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 511,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364133",
+          "shared" : "02776315fe147a36a4b0987492b6503acdea60f926450e5eddb9f88fc82178d3",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 512,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413b",
+          "shared" : "3988c9c7050a28794934e5bd67629b556d97a4858d22812835f4a37dca351943",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 513,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e",
+          "shared" : "34005694e3cac09332aa42807e3afdc3b3b3bc7c7be887d1f98d76778c55cfd7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 514,
+          "comment" : "edge case private key",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000432bdd978eb62b1f369a56d0949ab8551a7ad527d9602e891ce457586c2a8569e981e67fae053b03fc33e1a291f0a3beb58fceb2e85bb1205dacee1232dfd316b",
+          "private" : "0fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413f",
+          "shared" : "4b52257d8b3ba387797fdf7a752f195ddc4f7d76263de61d0d52a5ec14a36cbf",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 515,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 516,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 517,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200040000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 518,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200040000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 519,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 520,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 521,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200040000000000000000000000000000000000000000000000000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 522,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200040000000000000000000000000000000000000000000000000000000000000001fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 523,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e0000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 524,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e0000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 525,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 526,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 527,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 528,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 529,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 530,
+          "comment" : "point is not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 531,
+          "comment" : "",
+          "public" : "3015301006072a8648ce3d020106052b8104000a030100",
+          "private" : "0c6cafb74e2a50c83b3d232c4585237f44d4c5433c4b3f50ce978e6aeda3a4f5d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 532,
+          "comment" : "public point not on curve",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e4",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 533,
+          "comment" : "public point = (0,0)",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 534,
+          "comment" : "order = -115792089237316195423570985008687907852837564279074904382605163141518161494337",
+          "public" : "3081f53081ae06072a8648ce3d02013081a2020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b80221ff000000000000000000000000000000014551231950b75fc4402da1732fc9bebf0201010342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 535,
+          "comment" : "order = 0",
+          "public" : "3081d530818e06072a8648ce3d0201308182020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b80201000201010342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 536,
+          "comment" : "order = 1",
+          "public" : "3081d530818e06072a8648ce3d0201308182020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b80201010201010342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 537,
+          "comment" : "order = 26959946667150639794667015087019630673536463705607434823784316690060",
+          "public" : "3081f13081aa06072a8648ce3d020130819e020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8021d00fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8c0201010342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 538,
+          "comment" : "generator = (0,0)",
+          "public" : "3081f53081ae06072a8648ce3d02013081a2020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201010342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 539,
+          "comment" : "generator not on curve",
+          "public" : "3081f53081ae06072a8648ce3d02013081a2020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4ba022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201010342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 540,
+          "comment" : "cofactor = -1",
+          "public" : "3081f53081ae06072a8648ce3d02013081a2020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201ff0342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 541,
+          "comment" : "cofactor = 0",
+          "public" : "3081f53081ae06072a8648ce3d02013081a2020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201000342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 542,
+          "comment" : "cofactor = 2",
+          "public" : "3081f53081ae06072a8648ce3d02013081a2020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201020342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 543,
+          "comment" : "cofactor = 115792089237316195423570985008687907852837564279074904382605163141518161494337",
+          "public" : "308201153081ce06072a8648ce3d02013081c2020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 544,
+          "comment" : "cofactor = None",
+          "public" : "3081f23081ab06072a8648ce3d020130819f020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 545,
+          "comment" : "modified prime",
+          "public" : "3081f53081ae06072a8648ce3d02013081a2020101302c06072a8648ce3d0101022100fb524ac7055bebf603a4e216abaa6a9ef8eb2bbea2cd820e59d46d8501f6268b30060401000401070441040000000000000000000006597fa94f5b8380000000000000000000000000000f229ba06e5c03dbcba0eec01b4bcca549cda86e507e8813b5bb2b42df88f12f47022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020101034200040000000000000000000006597fa94f5b8380000000000000000000000000000f229ba06e5c03dbcba0eec01b4bcca549cda86e507e8813b5bb2b42df88f12f47",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "c5956b8cf7244e3c0457658a214210b358205cab12374d523ecf57895cecfeb0",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 546,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 547,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 548,
+          "comment" : "a = 0",
+          "public" : "3081f53081ae06072a8648ce3d02013081a2020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201010342000449c248edc659e18482b7105748a4b95d3a46952a5ba72da0d702dc97a64e99799d8cff7a5c4b925e4360ece25ccf307d7a9a7063286bbd16ef64c65f546757e2",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "380c53e0a509ebb3b63346598105219b43d51ae196b4557d59bbd67824032dff",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 549,
+          "comment" : "public key of order 3",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f30440420c9125e5e5bd443b1084f4b92104f0e02284f827feac21dfc5f2c1f4e7575687b0420e0f3b9ed031563f712ff005f9e9c9a32d74c8a20e834c3be10469d97f46bf40104410482eb93b70029eae69c3176dd85cbb58a0aee40d4ce4e199d639b6913ee32533138e9796365546708bab44e9ea04112584e1e807dc94ce9e994adb5ac4ae054b2022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201010342000482eb93b70029eae69c3176dd85cbb58a0aee40d4ce4e199d639b6913ee325331c716869c9aab98f7454bb1615fbeeda7b1e17f8236b316166b524a52b51fa77d",
+          "private" : "0cfe75ee764197aa7732a5478556b478898423d2bc0e484a6ebb3674a6036a65d",
+          "shared" : "2f25933470ea8c2bb0db66785d9e38964cc74a1181f02721b3852f7bd57d1711",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 550,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000450eb062b54940a455719d523e1ec106525dda34c2fd95ace62b9b16d315d323f089173d10c45dceff155942431750c00ca36f463828e9fab",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 551,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000406372852584037722a7f9bfaad5661acb623162d45f70a552c617f4080e873aa43609275dff6dcaaa122a745d0f154681f9c7726867b43e7523b7f5ab5ea963e",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 552,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200040ef5804731d918f037506ee00b8602b877c7d509ffa2c0847a86e7a2d358ba7c981c2a74b22401ac615307a6deb275402fa6c8218c3374f8a91752d2eff6bd14ad8cae596d2f37dae8aeec085760edf4fda9a7cf70253898a54183469072a561",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 553,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400921da57110db26c7838a69d574fc98588c5c07a792cb379f46664cc773c1e1f6fa16148667748ede232d1a1f1cea7f152c5d586172acbeaa48416bcbd70bb27f0f01b4477e1ae74bf4f093184a9f26f103712ccf6ceb45a0505b191606d897edaf872b37f0f90a933000a80fc3207048323c16883a3d67a90aa78bcc9c5e58d784b9b9",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 554,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00042c9fdd1914cacdb28e39e6fc24b4c3c666cc0d438acc4529a6cc297a2d0fdecb3028d9e4d84c711db352379c080c78659969bdc5d3218901",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 555,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004120e4db849e5d960741c7d221aa80fe6e4fcd578191b7f845a68a6fcb8647719a6fffb6165d8ec39389eecc530839c321b2e9040027fba5d9cb9311df7cd3d4d",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 556,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200040efb1c104938f59a931fe6bf69f7ead4036d2336075a708e66b020e1bc5bb6d9cdc86d4e8fa181d7c7ea1af28353044e8cec12eec75a6dd87a5dc902024d93f8c8d9bf43b453fd919151f9bd7bb955c7",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 557,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200043e96d75b79214e69a4550e25375478bdc9c2a9d0178a77b5700bd5f12e3ce142f50c93dc1ee7268456d7eae2d44b718d6f159e896ae14fbe3aba397801a95e2bb6a9a761e865b289dd9db64aa07c794cedf77328543b94c9b54ce0cf04c60ac8",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 558,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200044f191130740f1b75ae13402960eb22ea801db80ed51a461e06a7b3ba60c9bddd132a6465bbee8afd70cfb4495efbda4f1567b958e6e305bfcb4ac8f05172688e0f2f175aa12425be3ab7271b42f258639e868677d1163c12e641229f1e6427761c9e294de51db564151b21a051d2f7a13661852799557a556a5f3c51d36d083a",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 559,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00044964b948cefa39cd769e3480d4840a3c58e966161be80df02d9aab33b4a318a32f30130224edcefe0dd64342404e594aa334995b179f641f",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 560,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000411157979c08bcd175d34572209a85f3f5d602e35bdc3b553b0f19307672b31ba69d0556bce48c43e2e7e6177055221a4c4b7eb17ee9708f49216de76d6e92ab8",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 561,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200048bb517e198930eba57293419876a8793f711de37c27f200e6fb2c2b13e9fabd4fbc42ad61751ca583031ba76cbc6d745d115addc74eab63bf415c4fa20dbbecae98ac3c3da1a041705cf8959e2ccf453",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 562,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200045eb38d0261b744b03abef4ae7c17bc886b5b426bd910958f8a49ef62053048f869541b7a05d244315fc9cd74271ec3d518d94114b6006017f4ed5e3c06322baa1c75809a1057ba6fa46d1e1a9927a262e627940d5da538b5a3d1d794d9c866a4",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 563,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004035fc238e57d980beae0215fb89108f9c6c4afda5d920f9d0583ee7d65f8778ecfff24a31d4f32deb6ea5f7e3adb6affb9327a5e62e09cba07c88b119fd104a83b7811e958e393971a5c9417412070b9f18b03be37e81e0bca5d3ff0873ed1f3113ed0fc57a0344321fb4d6c43f2f6e630a3d3883efe4c21df3e0f0b1208226b",
+          "private" : "0dafa209e0f81119a4afa3f1bc46e2f7947354e3727c608b05c4950b10386643a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 564,
+          "comment" : "invalid public key",
+          "public" : "3036301006072a8648ce3d020106052b8104000a03220002977cb7fb9a0ec5b208e811d6a0795eb78d7642e3cac42a801bcc8fc0f06472d4",
+          "private" : "0d09182a4d0c94ba85f82eff9fc1bddb0b07d3f2af8632fc1c73a3604e8f0b335",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 565,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301006072a8648ce3d020106052b8104000a032200020000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "098b5c223cf9cc0920a5145ba1fd2f6afee7e1f66d0120b8536685fdf05ebb300",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 566,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301006072a8648ce3d020106052b8104000a032200030000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "098b5c223cf9cc0920a5145ba1fd2f6afee7e1f66d0120b8536685fdf05ebb2ff",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        }
+      ]
+    },
+    {
+      "curve" : "brainpoolP224r1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 567,
+          "comment" : "normal case",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000447a927daafd7282afd721c141c268be12312066c1d62fe047dcef272958e02a2b81c89d7b81004eda65cb6e1df8da330be2d563221862b81",
+          "private" : "08cff3b0b5c1b3220043759320c6cc6392e19e554f180f3df1e44c7fc",
+          "shared" : "4f7afb302c699bd56db0bdac550172bac94b73b0f2b60eee91b6a420",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 568,
+          "comment" : "compressed public key",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010105031e000347a927daafd7282afd721c141c268be12312066c1d62fe047dcef272",
+          "private" : "08cff3b0b5c1b3220043759320c6cc6392e19e554f180f3df1e44c7fc",
+          "shared" : "4f7afb302c699bd56db0bdac550172bac94b73b0f2b60eee91b6a420",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 569,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00045f9a3dd8daebed9583d91dd75c6ef089d325ffafb3639fb97a7a2dea04e811b5cb44e171a5ded25c22f37fd10e1860416e4edb8aa8081c0e",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "00000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 570,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00045c753c63b9cb9b79ebbd8d4e3fc3ae8de3ed6a16d12e38b1fc23e9e5aa6d815ecdf607246745e02982919a91a4cf8f1443fa90dd8f70a57b",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "00000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 571,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00045d8de5d817d49856a9ae870b5c84824f1a19745e963c820fdebb553c06f87a56e4d0019f1192f904285f5538c1d3eedc059e77344e7d4b8b",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "000000000000000000000000ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 572,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004539b0566588e16505e2d39323c07799a6aa288e7d2aa03db8a392a388aad13ac01879d1cde648dc8ad70c2dec49cb67961b2493ddad8724e",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "00000000000000ffffffffffffff0000000000000100000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 573,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000426287f17f2554aaf1e49c5594fbc35059a5c7c037994bfff9cb437f33d0e5fa3400163c4a0ec513e7049edeac43f7463b99f1c9144d454d9",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "00000000ffffffffffffffff0000000000000000ffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 574,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00043ac67c437f5cd2b4bc78218b01f64130c8b217070f6e1eef5ad4b600242505741417f79fd28596192538a9438126a49f44f98ed2642aab1b",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 575,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00048ab3fa0ccf52a661ea3a1d50219c0cbf809bcbf63745f4e0b94a890c01c166c6392c3690f7ec28684857ea05f5fd4b8b4e7b8b05a9e94265",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "0003fffffff00000003fffffff00000003fffffff000000040000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 576,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00045a6ecb1ba881bf4df559980cc940e66e430bb22b6dd0e6ea1842e90caa0c8cd725f93c45985695fc3a78c42ef72c190b083db57ff85c3db2",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "01fffffffc00000007fffffff00000001fffffffc00000007fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 577,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00041076cc0201b3399137184b1731028ba2bebdcba1548ad5ed1af1df9cd2f4abb6d76591efe7712bc3544a76ef53bed9f186a2c2d12105e7ad",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "30975f626ebd46b09e413513a897f6b74de5707bbbeb7a3d8c60d0b9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 578,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00045216d31c450635af6d6c7327d3fe0514a8abb972b16d3084164c9ac761817518c5f4e78e277e009c7028ad7e59a3a87e13295ef1777119cc",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "373bbcf4231b53083d36adb3f56485603b19b4b77251abd9b8683c12",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 579,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004b1121e4cafa5ee5cca2a9b661dadb37a819c0bb32dc0f01680c8192913981ac1c68e6d410cda305b0be46ef1422a70354199d0f544176195",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "41478d4c207e3fe1aef7fbcc34223f39b86f634d978921ecb40a5136",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 580,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00046e22eb98da25e639954eb2987a1fc71605b287abe4a9e7fe4cd79c4bc759b111ce37a17fda313b17393c08c750ecf1d38a9e0f72c0c1705f",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "5394eaa3dbc30feac5eb7d88e69cf068315ccb6dedf787dbf933f823",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 581,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004a60d25227568b2486b402af66d9212fe923a37873a8a5613ef813d91c88aa84b15b7cae6ab6478f0bf42c464f3f50ec27d339e85a4908841",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "7ffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 582,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000499b409afecf5e544d0477a8a43d6f4805ca19d0b24b89d6a372556060695d60a6c4c321043cb40a501a2781c77fb9c8f370c8af801069e85",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "7fff0000003ffffff0000003ffffff0000003ffffff0000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 583,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004772b186ddd36192f7a73f10372c86d6a7e05200e0dabffe07e02bc9ea13a2429f0a30ab26de39bfafd44e37f14c79acee2ca7fbf2bd8f55c",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "7ffff0000007fffffe000000ffffffc000001ffffff8000004000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 584,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d54fbb07c8c0482600908178438fd572eca1ebafdcd101071afcb247a0561e4e2201447d30db350510f0f8afffa228515de9289516855d2f",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "7fffffff00000000ffffffff00000000ffffffff0000000100000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 585,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004baeaa482e45fb4b932c945eeade8644f980e50f4150fc4ce1d02ecf6a883c9da5dc24c149b9b4510da27db8df3b3afbeaa629e19d99be628",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 586,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d63331a28bd6f82dcbe3de0ea807431012e954fd9febcc7a3687dbabca532329351b6a7a0648ab34c6aac123f8dd4ec8a44fb88df0ec45ae",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 587,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004000000000000000000000000000000000000000000000000000000014ebc9078ad8ad07562cd41b374827192aa88ce3c718a014405eed475",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "609042ac307c7d75ee58690d36d1f0ba2cb70f1a77ca43bc7bb70067",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 588,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004000000000000000000000000000000000000000000000000000000034f735bbff1a54db7995b03c4e43c17bc3e0f30bda4b2eaf85189615f",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "9d5cff406488bae680f1747d8f5ef070f3a7d451205a1ba9a6cd19fc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 589,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004000000000000000000000000ffffffffffffffffffffffffffffffff541d4608f6b28dcc77f02d94b1e25428a22e64fa9b3354beed97af99",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "a55b6ca4b1e135cf1df413a50861917b3d10ffef98a29a874ba9563f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 590,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000400000000000000ffffffffffffff00000000000001000000000000004946136fcdd34a5225b09a844d9f482e56a13c46b4ef294e9c049f5b",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "9240e268b133e25b39b36cb7bc9e91a535ce622b48d3b0701d31b2c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 591,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000400000000ffffffffffffffff0000000000000000ffffffffffffffff4bdc280b52c98b4bd52bfd4fd2676a97610c4946a66abef9bad0adaa",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "b552615bd4ea7eef4fef3e39aa4fc511d8cbaf40da099e47a611e512",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 592,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0001000060916626da518ee8f6bad287e697307084e191ca79398148141e57db",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "5701c9c1c1e59e93a0e57addf676c0d7646ff8407de630e5ec7255cc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 593,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00040003fffffff00000003fffffff00000003fffffff0000000400000005b5f99e5ee14baa1c4fa21adf0a6557416c603f933a592dd8dd16d66",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "07c0ae0f2e52e4657fcd5dcf95c5d925b0534da4d6a113e1406580ad",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 594,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000401fffffffc00000007fffffff00000001fffffffc00000007fffffff572544766fb80fb67365c9292c5f70bc285388d705155b361eee3a31",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "2d4f54d23c12ee51456f8047bc9c9bf3829192beef85bc6160029915",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 595,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000430975f626ebd46b09e413513a897f6b74de5707bbbeb7a3d8c60d0b95fb0ba1f08e4e15dfe79c1b2f6614b9df6bbdd57112f52ada01d4f3e",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "466d58ed8630d222335899a419deb03b9f3ddacb314f1ea8ad0ce2c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 596,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004373bbcf4231b53083d36adb3f56485603b19b4b77251abd9b8683c1230c5f383bea0bf35359a47ebd97417b93e24f3d2e78badd6561893aa",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "c0c682a0745b197dcedf8362decf70c0b5135e16c4f7c63b10468501",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 597,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000441478d4c207e3fe1aef7fbcc34223f39b86f634d978921ecb40a51361e9f6a7174b801cedaa4d4bcd772a2884d0a2bd27356295c88573203",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "72e9c06decee8133bb05c483c97a5144351d3a7fde2fc88be6eefd7d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 598,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00045394eaa3dbc30feac5eb7d88e69cf068315ccb6dedf787dbf933f823661267e8aefb70da15181fbf7390e72a4680b78883bea3a09087ac50",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "42e46a0df978b3362a4e546ea65f889f101b4e0270cb99b5ed046554",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 599,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00047ffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff65d425acdceb1b04862ea9df634fcad6f1af3b70ca0000015b943550",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "4d51293480c1208a093504c4c96a4c33466c918d300a8566e69d4afb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 600,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00047fff0000003ffffff0000003ffffff0000003ffffff000000400000002ab72fec57251d40ab8f358a291933878b14635671f9e0a8088dc73",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "7bedf280c9880edf26fe8dbd7afa356a54a67a93a2bf7043d2f497ee",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 601,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00047ffff0000007fffffe000000ffffffc000001ffffff80000040000011f4ecfad07f9a9656935f536a8b06e0db0acf5d54a939436ea844480",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "c56360d832e7d3854f60e0f3d362e58eb8026e27b6161fb2217ce57c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 602,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00047fffffff00000000ffffffff00000000ffffffff00000001000000003532d972042e05e13fe9d8f44800502161c9c5ffa30f5caf151d600d",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "5a0e6ab7b41c61b1cb098449c707f74f55548b92c78af27d3f33c084",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 603,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00047fffffffffffffffffffffffffffffffffffffffffffffffffffffff515853ec16a985fbde8da662e47299e86ee30ad464acb849f5132922",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "b4e21f2403d826439e4d94985cebbc724a85a3e405aeb8f610892ec3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 604,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe51bd78396f681cbf535b3951d0b7edf91abd3b10e1cb5cdeb7ba8f9a",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "92d2a63b7788e0d704ecda5dc59321dc30264445763da792f7035832",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 605,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "3",
+          "shared" : "0c52cf1e5e3f3da21b6040644e0e9eeca2e020f5872c430cccef8b98",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 606,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "ba92ad99f14a0ee915aecf776c4fc5fdecbbc8fd8e13a7610a44d2b9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 607,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "1000000000000000000000000000000000000000000000000000000",
+          "shared" : "2b8dfc433327f665f04f2929084412000f1b2249f98b277784b334dd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 608,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "b70058644ff94dea13a4f3fea5bb80579152095ba9d3cf637f937737",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 609,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "080000000000000000000000000000000000000000000000000000000",
+          "shared" : "27bdac60e05ba7ac0f904050247e653c896bafd45b50d0938589718a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 610,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4a6ddebca3a5a7939f",
+          "shared" : "00b6b04347120ddc5228530ef7075824fbb745945edd75e73f637a40",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 611,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6dcebca3a5a7939f",
+          "shared" : "d5b319d0f3143095c6bd1aa880c9df6a492caa6d6d275eb104a7aba3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 612,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6dd6bca3a5a7939f",
+          "shared" : "a0e1f7a142aafb0856616d46b5f76c2244010c9d46cec07ab33bb4a8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 613,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6ddebca2a5a7939f",
+          "shared" : "6f1baf2ed42e35d71b705f5dbfb7f51a8ab661be91d8b2614769fa01",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 614,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a792dd",
+          "shared" : "1be0d59d1f0f3a743ae19c5246099391098f71444223831e16cfa0c5",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 615,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7935d",
+          "shared" : "7e00a9267243cea4ba7617860b6fcf404e0357d1202d8c85dc5e07d3",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 616,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939c",
+          "shared" : "0c52cf1e5e3f3da21b6040644e0e9eeca2e020f5872c430cccef8b98",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 617,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004aaf040d6cad2c18b953de46420b387fa83474d74c6767ed708b9d1268c82a09310bc35b5caf2d9b46318b895e4c097ed501d2dcb14d30a66",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939d",
+          "shared" : "aac6a805f4ce1b6dcc13ec4ed16a889dc4d708f7f6f1e23471338324",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 618,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 619,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 620,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000400000000000000000000000000000000000000000000000000000000d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 621,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000400000000000000000000000000000000000000000000000000000000d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 622,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00040000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 623,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00040000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 624,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000400000000000000000000000000000000000000000000000000000001d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 625,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000400000000000000000000000000000000000000000000000000000001d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 626,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe00000000000000000000000000000000000000000000000000000000",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 627,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe00000000000000000000000000000000000000000000000000000001",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 628,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fed7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 629,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fed7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 630,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff00000000000000000000000000000000000000000000000000000000",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 631,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff00000000000000000000000000000000000000000000000000000001",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 632,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ffd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 633,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ffd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 634,
+          "comment" : "",
+          "public" : "3019301406072a8648ce3d020106092b2403030208010105030100",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 635,
+          "comment" : "public point not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b3",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 636,
+          "comment" : "public point = (0,0)",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 637,
+          "comment" : "order = -22721622932454352787552537995910923612567546342330757191396560966559",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd021dff283ecb55d9bc9979d5e7cfda8a2f04672ee943b49221435c5a586c61020101033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 638,
+          "comment" : "order = 0",
+          "public" : "3081f73081b806072a8648ce3d02013081ac020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd020100020101033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 639,
+          "comment" : "order = 1",
+          "public" : "3081f73081b806072a8648ce3d02013081ac020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd020101020101033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 640,
+          "comment" : "order = 5290290092223871682666367384584369978999613398297400491171",
+          "public" : "3082010f3081d006072a8648ce3d02013081c4020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd021900d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3020101033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 641,
+          "comment" : "generator = (0,0)",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020101033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 642,
+          "comment" : "generator not on curve",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cf021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020101033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 643,
+          "comment" : "cofactor = -1",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f0201ff033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 644,
+          "comment" : "cofactor = 0",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020100033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 645,
+          "comment" : "cofactor = 2",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020102033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 646,
+          "comment" : "cofactor = 22721622932454352787552537995910923612567546342330757191396560966559",
+          "public" : "3082012f3081f006072a8648ce3d02013081e4020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 647,
+          "comment" : "cofactor = None",
+          "public" : "308201103081d106072a8648ce3d02013081c5020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b0439040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 648,
+          "comment" : "modified prime",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00b352e92e2b56ca58f5e37acdc34af65ec6145e27c14bce42bef26235303c041c68a5e62ca9ce6c1c299803a6c1530b514e182ad8b0042a59cad29f43041c2580f63ccfe44138870713b1a92369e33e2135d266dbb372386c400b04390400000000000000000023f905836e050000000000000000000000024058a847e339e15fdfa24f6f1876ce8b7a763a02e23cc17016e2c89c20021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020101033a000400000000000000000023f905836e050000000000000000000000024058a847e339e15fdfa24f6f1876ce8b7a763a02e23cc17016e2c89c20",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "74aa41dd243d700a0e5fd27262a98927bad607b8a5f43f9994a5540f",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 649,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 650,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 651,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 652,
+          "comment" : "a = 0",
+          "public" : "3081f83081b906072a8648ce3d02013081ad020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff3021040100041c7ca82b1a7918992ef42c3deef04c4862d9e15b11e4c036e5c7389c94043904a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020101033a0004a99e0508ee1d6fa2c3e46900b7130f4906896b1edb6ebc8e539a693826d7c3265cbd14cce5bbeaa7930c2b53ee2022f43ad74401b5fef1b1",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "7e1b3baf50c3b70324164df397146f3f6b5fcf9652699b2347ecbafe",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 653,
+          "comment" : "public key of order 3",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041c8012201a3c3ee30c476883f2ac5e926ebb870b3602be2d1210e9dbce041c23b051be4983ef79faff40e77ed3d19b0a7c4b01dc8d9acb99c2c37704390433c76b1b5b15522e1d9707949042a4f2984d1f71f93a2ee97c61d0e47fe1853445c4e83452d850b3ab48ce80c1ba4b0650fefed6da99ed63021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020101033a000433c76b1b5b15522e1d9707949042a4f2984d1f71f93a2ee97c61d0e457dfaf75e07e7e51d73fdf71ca890906eee4bc5146db8b1ea42ed39c",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "bc7bb245c1fea7c10430824978340a97fe48d41efec3076aa908470f",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 654,
+          "comment" : "public key on isomorphic curve brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004002718942d4d3f883dffbdbea18a5b9af73ac85e648076b2c0b333de4cc8c1d9c6127ab6880b903ac44e50730c5ce1d4b52b3b02689c7f0b",
+          "private" : "09589ebd788c54b1002d7b60ee3c6daa2cad255882df77b6108dd6b58",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "IsomorphicPublicKey",
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 655,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004992f4a20b0e54d674737b79da8e31ca6c6b3f86d5fed22a8861cfc1a3a57f7a9592ec7b70afa981399d30b9cc7f7dd31b6200f33a7d4b696",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 656,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000415cc8782ffaca34a954d055b906afdfffe1e3e2c08202cab9f2b31a18e6545cb52509e9a3ce64208d2cae9af9f366bc0053a210ef117376a4df1c43d54944f90",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 657,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200044d5a019d890fb4a512d6e84c1738ce2ec66b942b17f28bba75341a6dda2ae2acf94ff30bad8205d013382bec105ce2a2287482fb50a9e273d934d5302a74845c21f75c493deaf571ee4df5619d7bc77638a530bebd6bcacf31bd550241b9b81e",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 658,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004009cccaf2f3737187608ee4cd4bca434909fa84976e95bbf7e7517c07739625f5b2d52431c7e744930daac43a8997048ac82d082d37161a3b2a0c4d238d9140d6cf90159320fff6a710b506881b3b772747678dfd73bf7e870b516039c6008d44491e23789b57ad0c43b3fd27565ed703019aa036b60ff84ac866b653e368b47374c557f",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 659,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000422ae2126ae12a38cc771c1c8576a9b983aadcdd65f48f9d201192a488b0ff4a1d6d14ad981aac3fcfa2156b6340012197db2a4f6b6f7324ac8a7c4015861a1eb",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 660,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000467de48ceec36eccd05eb47bf815b784a51723667fe1008e700cd197cf3d50fc577444217f2a1976fb3faf6db0d08e8c6d645785ab66f3e5686c5572093bb6646",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 661,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044ece661f5ba97078659744dde9c8b2ad87ddf952fa76fa31ad3d04ee898aff363690885479efc69d0ddd21a35e0de809b95a183944e43c9653450ee4a03d5c3b714476482f0a84248b14efada7b6a5d9",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 662,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200047aeb413f2efd160ecca59106870bd37ebaaf5e3ff576a6b5125de002dc3031f6000889ec211d8f40ee4c0a085b6011868319cd075c7a5d6dbf24a24eec40ed34ff03618f5548fc3a10d06f168a190723632e5d7979261f048e7da8e8dd564d2e",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 663,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000496f2336f70fc7b831650e40834c0a425cd343b98ddb15d25c849f5951addcdd12dc956ddd6f90bb8ac29e185bcc2098974016dd5e760024bcba4f35adee681fd158c98fc462b2538595157538b299ac638ba6709d968a0e37a4ede0939ba6c1c54675c49c9f0d23c1576fd2c89727f7e50e63406d47612a0c5dc20f7688c1fa5",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 664,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000474ec4011cf976c7151f8ccaa8b753b34c08e31cabf3efcc5bb997cd262c3273750abfcb8f76bc785c056a924e760d3d155bc5a7281a5b345",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 665,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200040b42aeb62fc7e1295f9ce8f5bc5a66aecc4de289f73d05b672e7dd3ca85f34785e2e11f7cb6c7e4b48d458c2e2a613a81af11334ebd2627b0666f0d3628edbaa",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 666,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a0352000472e9530f37de4b1d19d53789b02a5bda6e2124f71c58e8cd0e080047f0ca66aa69d4ff2e31b14901746487c71dfffb8a1368e45a56f482fcb5c635a80a1ad2ef56573ffd5fad242c823516eac42f1c7c",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 667,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c0362000427cd77274564e4cc0b8284eaac5373fe2cbc731d95c01a781a6b6c4c94983a88df69f47cfe38cc04895673b56a4739377cac72600ac72743a72c025fbbc2c20e7b82474dcc3e98ba671fcb10e8aaff3d4791309f7a5d36d0b68c2d0fb703cced",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 668,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e038182000466d53b70bcc33f779eddc473774f0a01f762f88df36199b80ef23123551bfe411a639600466da455b77317aa2f43d130258e7a1e86cd65e19a7e684c61896bcb40a0996fb5a897341f7c53a3486fb0aaf9e3281d31d366929eb608b5ed9e13693384dccb9f51f73a2d195949f1453e063e90287f5cb478322c5f03e9a05ab538",
+          "private" : "0a45d3c181ab18bbeb697c24c199854d4e450107dc4e33183bda31617",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 669,
+          "comment" : "invalid public key",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010105031e0002cfa2455a3fc3491d24291de3588e0eb46063c04430d7975ba71df01d",
+          "private" : "545f59601297fcc8d734f43bebc2d73866b16a3adb885211ae1a608f",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 670,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010105031e00039f98bba2a331e3a334c5ea7f8937a85580e557b353e06f3ed8dcd195",
+          "private" : "7abde5e6ce42081afc6194930710bfd108b91a7fc34d2caf52cdc54f",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 671,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010105031e00029f98bba2a331e3a334c5ea7f8937a85580e557b353e06f3ed8dcd195",
+          "private" : "7abde5e6ce42081afc6194930710bfd108b91a7fc34d2caf52cdc550",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 672,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010105031e0002128849d9e5731a42465e35aebd7b6db3f24e1366f0ade29e821e1c71",
+          "private" : "720c41bbb15e5247ed81e269b421771e6be5134b11f3542ee8059176",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 673,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010105031e0003abefd2cfd3faf77666c7e1ad81414d6336fea6a6b45179eccffcc95a",
+          "private" : "72adf44f808419549de69d89d37b7508ff528c439580e5d0031e842b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 674,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010105031e0002abefd2cfd3faf77666c7e1ad81414d6336fea6a6b45179eccffcc95a",
+          "private" : "72adf44f808419549de69d89d37b7508ff528c439580e5d0031e842c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 675,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010105031e0003128849d9e5731a42465e35aebd7b6db3f24e1366f0ade29e821e1c71",
+          "private" : "720c41bbb15e5247ed81e269b421771e6be5134b11f3542ee8059175",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        }
+      ]
+    },
+    {
+      "curve" : "brainpoolP256r1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 676,
+          "comment" : "normal case",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200044cee5e1072b30d64f70bf01958e22c044a2127ddd744ce3060c15990ff0fe1148c6ee56559829a5a84dd5c8646ee0c43d0b7c50181f234ec09eba43bc86b169e",
+          "private" : "113db979e07d9c8fdbea5b06a682c0d2ad67170ffcb65d7547d8c442d3ac237",
+          "shared" : "3f00d9af7607fd32809ef7a4a30b396e3da9f465adf20597c9e2046f16a7b1be",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 677,
+          "comment" : "compressed public key",
+          "public" : "303a301406072a8648ce3d020106092b2403030208010107032200024cee5e1072b30d64f70bf01958e22c044a2127ddd744ce3060c15990ff0fe114",
+          "private" : "113db979e07d9c8fdbea5b06a682c0d2ad67170ffcb65d7547d8c442d3ac237",
+          "shared" : "3f00d9af7607fd32809ef7a4a30b396e3da9f465adf20597c9e2046f16a7b1be",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 678,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200041284e50ecda6c7c3a15ae79c318dec591da197fc32b7a046b168774013e54687156d96fe0765ea03404ecf5f6efc74b0792c05c11f9a683b97f5c7ca74f8a8c2",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 679,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000498577499d7a42f4dfe44c2757fd9932ec7e45a0d902e0bf1fe4ac09e705eb8e12d9b9a0092c9c92a661e24b2138b6a778324c9db815eb05621c54cd4d4b2e887",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 680,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200045760aa78cfb0df84fcc2c442321a5c278fca245aa90a4fcb33ad8bbbe6e847df8b8f102d948a52b3c21f70067e106daf10626113b8ddc08e50fad4df13f90bed",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 681,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200040b3e56747ee2a81edc487f7b257afc5886f3d80e9848472a944590eacf71172f5786410b71ce226824cd3f0ef462185b2557c9e8e1f02c654e8423488331b600",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "0000000000000000000000000000000100000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 682,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004854a72d5fbeacfc57a5aea2e386e549bab87b8ee313ee6c1f12cf267826940769f1c56486b0ac2dcd96bc018f5f42729cc073c6291bde8c3e7c169329c798142",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 683,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a7043cb065916e173837bc1a109526e946b66008398e697b40438a3e0a2b0d9d56c6faa83d8a4c4b9e2a9b4a6917a45aeee61491f4f4e47efebccb71bef8defe",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff0000000100000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 684,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000494b231b2189576b84aa5911e80da3074a4d16988041f908e6b6a199c16e1f7ed26fb9184971bc6f71cbced6836b3107bb17061a440abca27e5b44252bf39c6dc",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "000003ffffff0000003ffffff0000003ffffff0000003ffffff0000004000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 685,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200047dc0f29a5542c7d67793f52dc1de986bcee45d7571395cab102893aa2a5bf8cf7d4b8443793b137491736b26061ebd705d194405cf108b741cd1c5b42f44f6ab",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 686,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004834777212988ed962bc9d57e98f20bcfa34d9c6587381db48e48ce20a1ce961d6985ed4f21bb019791a6f08c36c42924cd72fe653c90882b9747059b0cc1ea17",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "2310a87dfe5fc25d0c0f51f0d379ef19be687bef34795dc2fd3fcc2d1cfdf189",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 687,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a67cccc5e7b64889f5a8e5c52cb875258f525754ccb6ae2c75c8b9de821c780c7f38e6d238e55725250fc53f67514a9852ff5dd2ee1acf582254cba7deb72267",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "3367a0bb5a87072418334cead5227aedfc063f1a7340dc1c7c8e576eb4118ebf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 688,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200044fe39fe909da0a3e5a05d4f9717661c8f9af24071d711df15de225e98d5edce462aca0b1ffb66a09b769a2c23314d5116fb30b71456ca798370abad10097d453",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7f00000001fffffffc00000007fffffff00000001fffffffc000000080000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 689,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000496c13e3b6f626cc2dd89992ec34b39851938a6c6015c1ee4889795dc536c1415330888344ffe63e0d54e4f9365dd209013933a0a84d5e30424f516b87189b835",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 690,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000406d3939c4c916da103a5f15438ee2b0863cf18b269d3d1a66ccf684f2fd568cf7235f3bac71d7d0f1eb6db9ef7aff385f020991db678e5124ffb0667745b3e03",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 691,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000429f6ba59fbe18c3ed99bc7da638ae419ee7d7853ff6732f5172dea1f085e8fb5071439411bba430d2b8bc8f58c955e94ae167fc9ca06fb262c7c93d710fd62ba",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fffffff00000000000000ffffffffffffff0000000000000100000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 692,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000485d4f416552f4e51f92d80b4d6e71c6487c6fb0a106ed48395393d63528e6e782ba4c5228e60191a762dc02ccdaadb63364eee8e5008b9b25e0577f81903cb53",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 693,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200043b072da3dee819aba673abc3b1acebff18e4a6a20af8d817af97c2b4a8c5350a68e3bfb1d035fdfdb876b2adf85d9af1ad32e57399ca903a2d3fa4902124d194",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 694,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000463e92d05cfcde1179188bff8ba2043beff5a30a1a6b8ec1dfcd8273ce2c330540607392bdd311a313e3ae53196b14480b1967a235ebdbf1827165477884b5be2",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 695,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004292175f490fa8aead813bc9b4923233d999ea61e7f1f9d0b0a02f0f64bcd2a72795a299e368fa3b93ba25193147ad35cb013f8bce669086759f70a56d4083ae0",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7ffffffffffffffffffffffffa1c6646ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 696,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000415e8d9efabc51033eb4d7ab63b46f2b94d942c1abb9c430eda6079036eaed76e024f0f5436b94b6470ff9365849a86b40c14d5588f3dd5264bcf0ba344d9fbfb",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fffffffffffffffffffffffe966ec89ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 697,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000415e8d9efabc51033eb4d7ab63b46f2b94d942c1abb9c430eda6079036eaed76ea7ac48876b355e57cd66772b18e906be622720cb45e84b01d4443c79da94577c",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fffffffffffffffffffffffe966ec89ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 698,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200043704a3e3047e3c56e8c0d8c028ee1ce3ceef5ba1008bae069acae0f7df5d0f4e3940cddb1b2ee9a7839fc798a0f52925832b1da398c7dcb11e9faf36720ff60a",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fffffffffffffffffffffffe8e61519ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 699,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200040a7f86bbfb3a6010d9a8fe72aa0f0fafecb0bf2c18fc9b2937a7b13faa286be3a093055a187b9e90bbcae8a77bf19fa4dd11bce1bbc0b5d7549653c4e7aaa13b",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "23484789fec2f42fdefb0c4ec656217c4f53074616300f86325958b709e3ffc0",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 700,
+          "comment" : "y-coordinate of the public key is small on brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000462c15670202cd9a0cdf881a0ec622d2b39b5e3e6f2f955301210f15da98acadf99faae96994530ff39dddb09f0ee722d6a6a4cfb51eee6508ca4df05b24606b4",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "3d607b612ed1fb6d2b6ae4fbb7024b9ccc379170c121f49f8fb6185ebf937635",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 701,
+          "comment" : "y-coordinate of the public key is large on brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000462c15670202cd9a0cdf881a0ec622d2b39b5e3e6f2f955301210f15da98acadf1000a94508a978bd04882f86ac951b4503d1a928833739d7936e69176d284cc3",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "3d607b612ed1fb6d2b6ae4fbb7024b9ccc379170c121f49f8fb6185ebf937635",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 702,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200043d88f3a636fa94d06d5fb35314d34c51403b72361931bd3586fec2af98ba62a9973d2da83cfba4eb3c995f2bbf177f5051fff9ddb3862845b70da138628eef60",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "770c84309d95d813415d36b8127143d7c97dc5eecb764049631f1d8e6c6e3ce4",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 703,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004000000000000000000000000000000000000000000000000000000000000000109e0e9e8d98fb89da2a32b2c7618b26bb99b920f02a5e831a142e6c8673110cd",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "599cde22070e96a88658c4a5a83f3723542a402ed506639ff9016fe4a26d4c25",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 704,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004000000000000000000000000000000000000000000000000000000000000000226ccfda8234fa9b70316b5ec4da222972b34a970cfe6dd9983a05e2fa746b902",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "4b35a3caa10cd77034e0737e18bc52071f64b8a2e14d7a02df8a36886aa467e5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 705,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000400000000000000000000000000000000000000000000000000000000000000031e8d9392fba7ad1f3ed5b5746cd930370a81d7483fe32003e31264829c9fec8d",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "1d1d5a6ee25b5fe41e015f19cb434936323eb24da09bab873e3c25bea7af8749",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 706,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004000000000000000000000000000000010000000000000000000000000000000001ef5fa5ab0cebc18b64113eb8c040dd743184e7c8ac68f123f3c3d945585524",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "111fbae46ba6389c5879d02e1863301ffa9e1961d721a57c6d88847154398812",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 707,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200040000000000000000ffffffffffffffff0000000000000000ffffffffffffffff2e65afc115d0fe1a86f314629014d6856716a4d9a0114c713051dd700dcc1ade",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "23b36c78c27076e23d6ab56c2e9653d272922c9fc1a176b8b6c2e70ab7c883fb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 708,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000400000000ffffffff00000000ffffffff00000000ffffffff000000010000000131625916fc4e157b1cf93f3c80352ba4dbf26effbd87d31a2a808d001081f06a",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "27dffb62a6ec9ffb3d0480c45ba00c748193afcc0879d76b47f8ee356785dee9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 709,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004000003ffffff0000003ffffff0000003ffffff0000003ffffff0000004000002330b902c4f6a2486744f36adc6000e116a2cbcb14ff9f47aa36319fef93ad5ea",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "9bffd451ceadc27df88a13829852ddab0b2938952f5c58fdae7dd22248840bb0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 710,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff2c6fb3302dd93dc25d2c6792c2ac6f86247c4d39637ee11d9267658017f0055a",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "267a69f4b3945f8d323ff1a526bca566e7ed9806d6a6dc8f4587ab229a5f3ab2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 711,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200042310a87dfe5fc25d0c0f51f0d379ef19be687bef34795dc2fd3fcc2d1cfdf1892fb244825651a94d4d93ff90b74130f77483e5699d68a7a43ae693bca85688da",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "4d3d61bf26573a2ec1d9ae6be62d1a30b71aa963660a4ff309557e616742114b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 712,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200043367a0bb5a87072418334cead5227aedfc063f1a7340dc1c7c8e576eb4118ebf4648a7b0639656227ba7c4b346354b2465099f8422d1be92f0f45ee23b7e2d1a",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "799c4821e92815b9335e77741a9bca2333053886a3777ae637d02e4420d82a66",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 713,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200047f00000001fffffffc00000007fffffff00000001fffffffc0000000800000020cf9ab5899c59216d6d1bc786ddf6221e374cd37a8b745e826c6495bed0a56b0",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "a4a2d3bcc69380396089e719ab8c77e5437ee589e39d98eae7bd17ce5c1d5b03",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 714,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200047fff00000003fffffff00000003fffffff00000003fffffff00000003fffffff01a1ad42b3ff22ba6bf3c94b55cfa4d13c6e140d3c44963198f496ebbc50439a",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "3a6ff3c1d490f652f5178a794b8cf825b5044948f6ebda67310c11fec1ad2b53",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 715,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200047fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008000369a4e24f010260d7c2560f7dc19c41cde6b5c503b6563678580f0d22c74dda4",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "2d59b895062c13d4e5b5e0b77ef273e94e558e724f6241af5bb11bf23acbf851",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 716,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200047fffffff00000000000000ffffffffffffff00000000000001000000000000004677b043dfe54f78c735543b752b3aec043f656e5f22dd6d956cd642e3390881",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "83640be428f7a4f80ae2671799b5ba1881241fd054a7f2dce0254c07531abe40",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 717,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff178945df488779235a2637c39a4a85ab707bd56e7c22b9ad41b652560123b6af",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "801e5f5d61c666bc089a4265c40d2a3fee0db20a0f78e329bbf2793330ab0412",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 718,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200048000003ffffff0000007fffffe000000ffffffc000001ffffff80000040000000424bbe5b0b8702258d2462a8bda59a343b97c3fb1d4005416802bebd628e7d0",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "a409a85067dd63e5eab3aec3d74cb7f071839247dbf97b6de592988095509d0b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 719,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e537613a0346db14d55d1bcc27079b68864ac32885b5bdfc3c9db6f85a35d3df4c39b",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "66d757884634861f28bbe45b502f895233b0ba1c69bf45802f80eac5c837750f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 720,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200047ffffffffffffffffffffffffa1c6646ffffffffffffffffffffffffffffffff5407f4a41e7904d3e7a9e6e6d70b093361dc5ea097c3767e1013f5868fffffff",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "94456bf9e33c392315c5bc350a5d48e39fc7a9ff5ea6fe309e24a89292690dc9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 721,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200047fffffffffffffffffffffffe966ec89ffffffffffffffffffffffffffffffff000000093b3d1910bada32f99c20977cff951d97072fea058e879c4bfeefd404",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "41e2153f9411102965a2f63f8874aa7db33571466b160ea33e9af6721ce5bbfd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 722,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200047fffffffffffffffffffffffe966ec89ffffffffffffffffffffffffffffffffa9fb57d266b190ab838bd7970162f5f56ea6d88ccdf63622918babd1207e7f73",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "41e2153f9411102965a2f63f8874aa7db33571466b160ea33e9af6721ce5bbfd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 723,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200047fffffffffffffffffffffffe8e61519ffffffffffffffffffffffffffffffff8a3af7f7a8a00701cfee7f390f84ed21d374623c20e5c822760d9de3b0000000",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "79c4bdada76d7219c0d65bf220b714440f838a2a1b36efd6276de35b79bee16d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 724,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000423484789fec2f42fdefb0c4ec656217c4f53074616300f86325958b709e3ffc099d1c0c49a359a0c6251b8653b65311a288b99ee6fcf2f22df7886eaec947aee",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "31219d91b716c4897dece400f35cb7103df610bffdfdb90bf76be274ff2bf9f6",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 725,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200043d607b612ed1fb6d2b6ae4fbb7024b9ccc379170c121f49f8fb6185ebf93763535f4a1001eea1bf1ebbfd643af146b990993e98e71af4414e736941c8e444716",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "703413b19d8f415989f70ae507b4afd9900504e3725264a121bef966a30f8922",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 726,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200043d607b612ed1fb6d2b6ae4fbb7024b9ccc379170c121f49f8fb6185ebf9376357406b6db83048dca52a6344cee6f21d964a80c956376dc1338dcb400912a0c61",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "703413b19d8f415989f70ae507b4afd9900504e3725264a121bef966a30f8922",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 727,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004770c84309d95d813415d36b8127143d7c97dc5eecb764049631f1d8e6c6e3ce492c0e8c5ca2371c082e9576485eef53d1536a27ff0d59ce5116a047df7f08ce0",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "86c401c681031d35991ebeaadf996a03b4b471951f6f647c155fc2d740254909",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 728,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "3",
+          "shared" : "a3e1a44851d0dee744378c5e495f3081dff2a0fefccdd08fdc2331687d5c4a80",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 729,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "1a68ab756ecae2853fcf6285974efae32ccdd01c58d05b4cc58f74d16c2661fc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 730,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "100000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "0bc5fea1dd6793664ea15dafba3e06c1524150d9fde32e17d7c6813fdc8c8fd3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 731,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "2d44ec4cbf228a4e32409e4de1ef8859c93996a9df73c317e5d04e64137f49dc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 732,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "08000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "9e1990fec2a345118aaa96a473fb921dfb5c3d69c528cf6fc0989d075552822e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 733,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f6901e0e82974856a7",
+          "shared" : "605641e1bd08b22a1a51022d8ef80f9b6c2f70b2562387db88c124ce60660834",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 734,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7900e0e82974856a7",
+          "shared" : "7db568a027cd6204457ce31e7859cd06fc76ddbc97d5bdefd57a65752fd79340",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 735,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f790160e82974856a7",
+          "shared" : "6878ca1bdd7c0353b505d5a60b2fbed422b5c37c7b54cbed3a22e0894e7b15b8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 736,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e81974856a7",
+          "shared" : "3bc54238c701df3e18c6395f35435059c54ff0d06d8ab19a3d179ab37c1fd8d8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 737,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974855f5",
+          "shared" : "1950b7ce510d4d8648e80c6385a42d005433fc5ca61e2022a1405fe18142c246",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 738,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e8297485675",
+          "shared" : "5c05c4d877a0e2af5ffa004c122630bb87157cf346dbeb8ae13017162da208f4",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 739,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e8297485695",
+          "shared" : "9639bbd4e22194ce3892a814c82eddbd21dde05cfac20e99396e3d6ef0841f7c",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 740,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a4",
+          "shared" : "a3e1a44851d0dee744378c5e495f3081dff2a0fefccdd08fdc2331687d5c4a80",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 741,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a4597cfee2797aaace662caa92a444592c9f626f04beca98a06b6dfcaf53f4b377d67b1c109154309bcf3d2f3928e58747806f08a8cf88436ac1b2110b83493b",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a5",
+          "shared" : "341cbdf61f9dd620ba6873a74804afe30a06b0a113a6916a4104d2d4cc196aec",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 742,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 743,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 744,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200040000000000000000000000000000000000000000000000000000000000000000a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 745,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200040000000000000000000000000000000000000000000000000000000000000000a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 746,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 747,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 748,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200040000000000000000000000000000000000000000000000000000000000000001a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 749,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200040000000000000000000000000000000000000000000000000000000000000001a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 750,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53760000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 751,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53760000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 752,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 753,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 754,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53770000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 755,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53770000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 756,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 757,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 758,
+          "comment" : "",
+          "public" : "3019301406072a8648ce3d020106092b2403030208010107030100",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 759,
+          "comment" : "public point not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e1a",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 760,
+          "comment" : "public point = (0,0)",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 761,
+          "comment" : "order = -76884956397045344220809746629001649092737531784414529538755519063063536359079",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f0469970221ff5604a8245e115643c199f56f627c728e73c6855c4a9e59086fe1f17d68b7a95902010103420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 762,
+          "comment" : "order = 0",
+          "public" : "308201133081cc06072a8648ce3d02013081c0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f04699702010002010103420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 763,
+          "comment" : "order = 1",
+          "public" : "308201133081cc06072a8648ce3d02013081c0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f04699702010102010103420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 764,
+          "comment" : "order = 17901173885223768702896718547912698493510841341785744190857633730178",
+          "public" : "3082012f3081e806072a8648ce3d02013081dc020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997021d00a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e8202010103420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 765,
+          "comment" : "generator = (0,0)",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b604410400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a702010103420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 766,
+          "comment" : "generator not on curve",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046999022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a702010103420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 767,
+          "comment" : "cofactor = -1",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a70201ff03420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 768,
+          "comment" : "cofactor = 0",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a702010003420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 769,
+          "comment" : "cofactor = 2",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a702010203420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 770,
+          "comment" : "cofactor = 76884956397045344220809746629001649092737531784414529538755519063063536359079",
+          "public" : "308201553082010d06072a8648ce3d020130820100020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a703420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 771,
+          "comment" : "cofactor = None",
+          "public" : "308201303081e906072a8648ce3d02013081dd020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a703420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 772,
+          "comment" : "modified prime",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d01010221009cc5080e320d05229fe633a03f5947a56ae6a469b258ad050ad2d32af932c171304404207d5a0975fc2c3057eef67530417affe7fb8055c126dc5c6ce94a4b44f330b5d9042026dc5c6ce94a4b44f330b5d9bbd77cbf958416295cf7e1ce6bccdc18ff8c07b60441040000000000000000000004d52ab6d699450000000000000000000000000000522f63e0ae9874b3327af5880fd557e161861d66e42d7ad495941804bdc861d30b022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7020101034200040000000000000000000004d52ab6d699450000000000000000000000000000522f63e0ae9874b3327af5880fd557e161861d66e42d7ad495941804bdc861d30b",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "a696db5b55e4e3aa5ada30aa4acc9b5ccc347e31a2d0b7bc3e7c320eaeaa8d01",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 773,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 774,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 775,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 776,
+          "comment" : "a = 0",
+          "public" : "308201143081cd06072a8648ce3d02013081c1020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377302504010004207ec47e457bfa6d6de5c0681c57f6b7c710a28e78eaab3f2d25ae2fb1cafae1ce044104751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a702010103420004751e0e4636e839f06f4998e14b72809d29031e895e4c7f3c99a9cc131ba39b761db38f944bdaf663a2606109345dc2a5d2f25c5011e164b12cf0408922342e18",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "59668d33e4163a2e06b8ebac45ef559110d93c6079eb2566f576c6c75fad2657",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 777,
+          "comment" : "public key of order 3",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404202ca61e9227950c9fae3f25aa1cfd9026b3e69e60d63a4f09e268284b6dd99dc604207dc24efa74966e7f87e65a24ea268d92b48d6426ad24cf5a1ae53fd0afa6957e04410420bfea6bdbbda0a7d94d31abc9132787f5eef59206385cfc2fea9cb07f0d8b621d23a08b2bc26bcb983cf19b53df8279774bdb05edeffe7ecb1a03025d374cf6022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a70201010342000420bfea6bdbbda0a7d94d31abc9132787f5eef59206385cfc2fea9cb07f0d8b628cd7b750762c3df0a62918f549a40af8f6f01b1de73621a954f9451ac2370681",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "6ff914701f3b1f72bde0d95f7b1b3458c9e73ee3f690811e08b7a957cda14103",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 778,
+          "comment" : "public key on isomorphic curve brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000481ac2aef36e3d128e4360e715d4885b4d5cdea3b1def7ca2865ff76800e538133be2e51584027d139f6059e254a037f86db12c390fdc3047d3bea6812f19c04d",
+          "private" : "083a8125793c89bec64338abf2db8be8ad5d680ea134645d40c9ee420f3852ebb",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "IsomorphicPublicKey",
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 779,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004debff6a4a9297b3404bd112bb32f212df745b36c698d82f928fad9eb9a9ab56957e44409addfb8b3002f17987032dccecc3375ea8bbc8918",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 780,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042e0f441d258b51e9f02035b72dc92d19fd7f861b1dc22959c4525aaf7d923ea61fcbb7b5a4fff19b19c316fb2126b9e2325573df3c6886b1d87c8b7ce1e323b0",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 781,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200045889a117e567fdc7c23cd9a8fc4a87912c7394c76d0436e3ad7eba2c1cd52b4d354a79c2f1e96365e5a19475925f078546cb829455e7e5f09c2c707b962bfc1684581bcdbecc2764d75d98c8fb1f6c1a908d3d7225af157df5891140d30b6e0c",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 782,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401571fd75d7f8c5ebd5741f8b50575a469f6b429284793ba6dbd57df9f8cc1ae3efa23fd93b69af726cc3758d731c172b9d9db377f28a22ab3463145a3ca89b20d5301b36f5db20089cc7f261ae7fcc4fc0bcdd425e0c80c3d01be586f9092ec64e9c8eeaa4ebe1ede4d0d844a45528d280514ced8ee882348a76d30776b256683dd2a40",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 783,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004628cd86e0686a0f83900ea5650c950a241bcfb585b58591bbd60d474b330ee435d4e5bc111de4e07f4f2ffc40e009b9780a9565c1521da78547ef36192c54cf0",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 784,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004bcdd35ef1d7823cae92732fe1994eefa75e69bff629bf1a551f3e07360fd2f612d9631e62da7b82376b9605028768f114f830daeba7e3c22",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 785,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004947b72e0343407d82a0fdac7c7f6d410d0196caf9dd5108cced9eff722ab9e4431b0906ff15f3f9fb5ccea8e2c11bc12b8c3d98115f1f326e4594848bd8035bae0fe980ca7b13141f7c244e141c3e578",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 786,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200042e8b483b6008ed7d5bdd423ab8e39d68faab00b30c743af1444ef204888684eb6371c4ea9cc0ad803b56abc541f35e4634c48fb32ba6fb975844dfac838cc1bff1286c6ded1f4afe42d68477be54d1ce744cd1fc9cc2e4ddbc897b0dc67a661d",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 787,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000415172c036cb3cd779740fbdaf26930536c9303e0a8d717916abbb6f010058191e1ee0835b4117c2efe4cbeadd3df260aa34d2417734cc52fd4f22d6fd56a6850927f17c97fa71ee829219c7bfe205872d61eb319b7cfa369715e63c25dc739dc6236cc71779bd4fa61bc34e76290f47b47f2b5430984edf61f4c4325a235024f",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 788,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004ad19d0abbc921f2f1fb23eca6765b2ba41b9c51e6e90d22a532c6b8c0ce699f758347ea939e79da8a8289403a5f1f8983aa17a70bbc86ca2",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 789,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000459e7f5220b13269549d11a1052c9ea852eee4c98df598d0c43824aeaf45340fd5a5aa6950b94d6b055ef7b011a506a2b1277ee50e215efa16246a231f0be64df",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 790,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200041a5c93cebdcf7fa5e5c1aedbf463ca7fc7a5a318e7bc281a775aa325c0b2117060c148c4094358fa47b779b11ef3d4b38411cb0a414ace506aa2142f568e141b6a2938122f103d7f849d0763a340e6a0",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 791,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c0362000443e497389d1cc949a87b0bc81b27462b64e8cfe890e2b2d0fadf69c955a39c48d995be3f0597fafafda4719a40e156f761c85d8225dc504c81c6a380f099d82144038fe96bafe0d437d9f3a58a62fe10868aa364fd527f1606ce3c05ad24c653",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 792,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004903c2e5edd60b9831e78cb27c7eddedece338a8c82a9dbd31b1d1a78f8f5de37e4986adf56dfef5136fc30a97f675feeb75fc0488630bb32cf6be8a2cf917dfe589cf0ad661f53093e4a172b3cbbfabbc19a3c7a16f6379060eada96b050061d3bcd9577d5ae602456f6deb6fcb65684240ed6d6420630f07bb38be1cd60a339",
+          "private" : "0898a9c54d72da30e36b42dcf63b37b39c96441dccfcd701b8ed9e0b0c7f6fe7d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 793,
+          "comment" : "invalid public key",
+          "public" : "303a301406072a8648ce3d020106092b2403030208010107032200029cf25745a7ec04b3c00e795c7e8f8d7da33f55732003be4fd4094d842ea82d8c",
+          "private" : "25d405a46ccd1e34658b9be7423e8fce7a997120db963933545d19762c71d8dd",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 794,
+          "comment" : "public key is a low order point on twist",
+          "public" : "303a301406072a8648ce3d020106092b2403030208010107032200020a8944f96de0fe0d82489cbc7e71f2f529cfcfea03ca593d91462278731e19a5",
+          "private" : "66008d35e34ab5f875c3fd8115c335cd9b5f764323dbe44570960155570e71db",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 795,
+          "comment" : "public key is a low order point on twist",
+          "public" : "303a301406072a8648ce3d020106092b240303020801010703220002575862a7c5fc68e9ffcd58ce9bd0ef78c0a26a3a22ee96b0be16b399adb3ac4a",
+          "private" : "622853938bb5dc82716cd8d6d076ae6955da307bb14534ae56fd6dfefd5ed270",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 796,
+          "comment" : "public key is a low order point on twist",
+          "public" : "303a301406072a8648ce3d020106092b240303020801010703220003575862a7c5fc68e9ffcd58ce9bd0ef78c0a26a3a22ee96b0be16b399adb3ac4a",
+          "private" : "622853938bb5dc82716cd8d6d076ae6955da307bb14534ae56fd6dfefd5ed26f",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 797,
+          "comment" : "public key is a low order point on twist",
+          "public" : "303a301406072a8648ce3d020106092b2403030208010107032200030a8944f96de0fe0d82489cbc7e71f2f529cfcfea03ca593d91462278731e19a5",
+          "private" : "66008d35e34ab5f875c3fd8115c335cd9b5f764323dbe44570960155570e71da",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        }
+      ]
+    },
+    {
+      "curve" : "brainpoolP320r1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 798,
+          "comment" : "normal case",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004b7fc5720d4b325c0805cc213c1b9ccbd9e4f380a121fbc00784c821bcd7f0d618b70d39fbdceae553d9de4f90683eb9f000463c7bd1d32db8cfad2b40862ccac05030e93fc6694c071e8e1427b305006",
+          "private" : "12d06c51deda1595d8c43e7c146f898f7141c0836522931049afe61333ae2c03e350b61aeba540bf",
+          "shared" : "94982d50b29faedaa7ed0988fd57b90303b032ce398ec70af6d194bcfd7f9008d14e09425502b7e7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 799,
+          "comment" : "compressed public key",
+          "public" : "3042301406072a8648ce3d020106092b2403030208010109032a0002b7fc5720d4b325c0805cc213c1b9ccbd9e4f380a121fbc00784c821bcd7f0d618b70d39fbdceae55",
+          "private" : "12d06c51deda1595d8c43e7c146f898f7141c0836522931049afe61333ae2c03e350b61aeba540bf",
+          "shared" : "94982d50b29faedaa7ed0988fd57b90303b032ce398ec70af6d194bcfd7f9008d14e09425502b7e7",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 800,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004430dd30b26350bc66c41c71769dd61b740d71008b59e455c1795ebbdc6bb1f0c8afaab415850142f1557feb7bef5fd3937f088ccb4d3ff8dc7431eecc9dce6f57c45035ca97dd0d7de9991742a39ad20",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "00000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 801,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200047bad53f50a369371b9742952b37f6a179ffb0f7f46894321f1b3485453b7bb58b9e61e1ad06913247287976110d22bbaf17dad584cd104bca6601daa0b6633ba889793f931ef61f889a491bfc3776256",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "00000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 802,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000439a0050ad1000627ffeb7bd1c4fa9fc336507c4d1c2a55f4e3672c15dabc8dc9567e326e740c54c799c1b05bcd6fc5b43c693569c0583a19e5a0aff1b4135df461e626e81fb098be2eefbf9ec1075a53",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "00000000000000000000000000000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 803,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004887c70eaddf1e67b2e05e0613154b61cac592568641c5332a218a87cebba63b2518e6c1cc1ca4036a4a62bbe99f7cab95eb1fd6b0acc85d495c9b82ed1ce047db89ab3c08f953c13ab35128638921b09",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "0000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 804,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000404d114977ae64cbca724fc517d6b7bafaf7c9eec36d682c1fd02e9f9bca302b149793582b301c8a95acab775a1f9c63d1eab8f1e67421c7d8de16f0128167a2f7ef8ae55fda1b83e97503b8323343a92",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000100000006",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 805,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200042e78935c77d5fc195928849d98b81c79c8dc407bf113bd1e3f49967d288d7bf8c1cd853a9a5fd80788e3e8ebdf07f70c44075b8ad217123e2ef44ae53f4306d0f1958f1311d0509e1c7754a68afdf7eb",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 806,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200048f93a6519729320805291a17925e6d42ba23dd25acb3eea29c18f1e550c7dfb41182a9fd75747df77191f150afa979031f546222bbdc1afc448c6613d219a109a018ad341b6bb5fff61939a242b42968",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "07fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 807,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000473a8101f2569337b61237b94105f02af62af56fe0364a8b06cfd0c65ad26898034828dbda03b90e7394b1a51f0c32effa86c58c28c5ae2efce2a147eb69580519f31a57a697d9c069b97ef9c02f4bbf4",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "2e5544fd7d843f5df87bad4422ee2f10139748eb004974c3858f8a7a689df792ae0af08dc43414d9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 808,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004a83df8e6d9326d0f6e399db9094f81ab8af846091f5d50f220d2dc94a268c6a8d11ade13e2484b253a77027983c3d8b2d0a4cb9ee9008cbd8d34c50fc65a5aad5c21f332788f719897c44447e0f11370",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "2e62b007e0e833a4fe3a6b527a4fe88f6bbd0ce20e6a374fb6474d56956b6a0f807f68652c8b0ded",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 809,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004bef54b0fe97b66cbfc62731645fe3c6fc1d582dfc18fe419fefb8cbdb0c5fa17a363f352ed7b6bfa37e24f93ec8da50062937823baab3c138cf1335e07bb50c8a05ed6a9bb9f82631c95f500aa9f3645",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "5caa89fafb087ebbf0f75a8845dc5e20272e91d60092e9870b1f14f4d13bef255c15e11b886829b2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 810,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004ab49dd4a73e9f8e0595bd8ca1655e2bca61fa2e1a3cc87635ae7a61fdb7c9bd5a8e4e34aa2b928c930732ccb23d3f512aeda1496a84e7e75303b0ee662d61107da8c67fe7193de7c29251423501df209",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "6166f3de8da8f6e286176276a03ac6dbb4a9f8b0154a1504caa5ba2bb12dde1be6eae89f3384123b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 811,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200048f5659116b4af2d03dd2b3e72c0d78d77677fefb4e277bee2a4966bba8354f85d83845b33a431a6907921555c1ac471e51e26a0cc67fb4146da0502fcee38f5ef502fcd4f9a380b086af5c403396c4f7",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "6946ec9bdddac30dc5060f5bdb41d2140d57066758e3b73f0c50b5590ac45e9c3a483016c97d409d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 812,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004243bd450e757a6a5308cb366f87c359b953cb42c6c61de923a24247217974d6ccb3f8869e832227c64035c2066f24423fee0041ab5ef361d1ca4bd19f34f9802f1fbcd2cc132087d8f4f3d5b32e1b046",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "7f0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 813,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000465677dff00f5899c5100c5ceaeef383de49012e005e8f73656caff3e95dd1254bbbffa840e206e962935d733930dbe0130714761a1a26bf9a59cd37db1311bae7ab2f9ae3f0827aa0ae240b34cefb97c",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "7fc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc000000080000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 814,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200046394defc20111cd8cddc2b8545b9200f080736bf6438f21c6fe0bc246e4bb0bdce1f1107d6dc55b536d025461efef8ec5dfa7f088fc03070efe56158050ac3042d1285aa9ea40215dfe5542e6d5590f4",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "7ffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 815,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200040c1142edacae66ffa6993bca134cd4450b5adf0d5f5c32e21479f2419a9000afe9226749f27bcad113bee319eac4e6c6927deef999d25017890e95a615bd222720ecbb22ebe2ed9aafb9610bfa7e77f9",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "7ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff000000040000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 816,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004770298807fbfc4f084210a361403c6dd3c3f2c31bbf20ec851e10144fc8340ae7a77cead742b5d1dc4a9a855df56a21362614044ae945739c707c0c89b65a43fb091069bd4f695b553c583f538206c35",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "7fffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 817,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004a719ed2e9ff2debac0713bc4806181736885736f183be24175ced514ebb76a0e49b20f7a47bec04477405570758bb4a1835f71338d394ac799d389a9a2b0aab561717a0642c668dd7e88521fc0884db9",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "7fffffffffffffff0000000000000000ffffffffffffffff00000000000000010000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 818,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000423c02591b8ee778c5780ed4c783974ddd5aa52117d68cdda1c375cb77dc36f5fbea9709e44612898c1f5fcb67bd6b2bcc6ff0b01003be7559c1cd0827847de5943d5adde9b8519a55675970051659a03",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 819,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200040000000000000000000000000000000000000000000000000000000000000000000000000000000129110253d52cf3c5fc3382fca93d18adf7b97999028767b9722381db68fe3a41793b7d9952c6177f",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "2bab467efa3adf782324563a4d8f19018ca44458f697318a11f3e3c2269275c7b1aec44ce83cce8a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 820,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004000000000000000000000000000000000000000000000000000000000000000000000000000000020d1a18c0b25d0d32d9c4249a523cfcc12a20c2ead596607d73260895676315a70ad098e8b51d25a8",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "829a5f7c664dce621ba1373c0758d3d2b2984d85c384cf0077930ae4909f6072731572ecc3e4a1aa",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 821,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000400000000000000000000000000000000000000000000000000000000000000000000000000000003638b53e2a2f41dc6d6dc7b3611a6dde54f7e8a7bb2681afa2060100074e51289d13d79251d168da2",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "8131f95388bd0c74d3fedc3077d750382e90f765c820e608292fe923c4f3c76ac77d6c2c05862c7a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 822,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200040000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff13b6599cb2e990a4fee490dff267362978a0e76f57c53b4ee85fc39c790f4c6969978fc462e5a847",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "203ab48d6e3a11afcb44140f0b6596cc85dfe39e589d64b699ddb5470ee2ac5cf61d6ec8534aacfe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 823,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000400000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000001000000063a91ee30c63eb15b1c0f2102c6cf3438dd75ca71636238f891e367c105f0b781d02de648399712a0",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "0f5a4a6607bfd93aa3d1ed5a4aa5ed3d973547cc978265649cc47dae0cd32bfeeef058e4e2ed4288",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 824,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff308f36ab8f37e97723b0aadd7ee4dd585b9e68dc00db4242f6c3cf7b0ec1497a26e629b24a613b3a",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "a6b0761c5fe60e1e4c63704ecb8a0da1a9b89cd502b2091eb37a414181af99c4b421f107865a3989",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 825,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000407fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff231f9aef9b1a7c143485f601980bfa4f7bc7b312b01400bd1d15669197e07f2edf39cd08c905e280",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "8ccfba752052d15c8cca181abd9fded4cb0c176dbadccafe44cf1cc1907fc9ba356c7e7c3289e19e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 826,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200042e5544fd7d843f5df87bad4422ee2f10139748eb004974c3858f8a7a689df792ae0af08dc43414d92c64eca76e2196d01899acac1824effa5a9b4b3167b2131477386006fc3a0f624d9684c900df7b78",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "5e7e6ba602aa2208b1607f879635d6e3c28568a7f754dae448cfc793a80600809ac13381bc800a8d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 827,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200042e62b007e0e833a4fe3a6b527a4fe88f6bbd0ce20e6a374fb6474d56956b6a0f807f68652c8b0ded5b0554bd701c2b9e6687e1b0135dff715d53dae858fa77df8e7e566ed638f9726ade9ea2db601079",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "9f6059cbada97ab9f0826b6a1bedfe79b9c75da51fc2fe2620436bff79b15ac416b9ed1a02513640",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 828,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200045caa89fafb087ebbf0f75a8845dc5e20272e91d60092e9870b1f14f4d13bef255c15e11b886829b213eff0c83008731468789c7865e5c17d5de2da065c8f039a7475cd7588e03e9a68ca0841f6f8429f",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "1a05058f316d94efa0829e12c65c32a01202b24a9cf97b9f64990a39f643456dfb5a89649a8f6832",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 829,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200046166f3de8da8f6e286176276a03ac6dbb4a9f8b0154a1504caa5ba2bb12dde1be6eae89f3384123b0e75f218e122dac1d46f0c09e49b92c167798a6b458e6660c8c10fb3858d89a5f546a301406d456f",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "1f9ae24d0082d8a103842086fae91da616c1b0d26007db2f755a8fb0dd1720205895a1ead88b2a30",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 830,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200046946ec9bdddac30dc5060f5bdb41d2140d57066758e3b73f0c50b5590ac45e9c3a483016c97d409d0ece7c2cf1c5a46c15c6ff814b1252593cb532621fe14c7f557762911a166e46b9b7a3d4b9aa9f7b",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "01980373c0a3a00be8b30b1afb8123b032a7054b16b51016be94f5d9f5dd8a5a5f19e0807f6c27cd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 831,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200047f0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff025368d44d7706408e18118e8338b5a8f65dcb4f7ac1884d97a44d235b8c89e5c240576680e6def6",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "8c14fa61be79ee096dcf6a2cd31aaab422b98161476c02e71a18168eaf3185ac515f6e451af5e27c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 832,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200047fc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc0000000800000011a2b8d3c67305de21501cd7c43ad4cd9a57459c42e6fdac1e2cb37952703ffdccd18fcb326a2e0c7",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "61482d667be2a2d7bfcbd75b9e8140ea37813ede1fd44eb046f436a4d672784643d0d84b1c82f55f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 833,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200047ffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff800000400000025a0dc389bcdc85d8434b2c615d1092b546d7808978f2d0cd3b3f17f57a2774c883fc5fad79ed32d",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "c586152d7416ca85eb55486ec2914a78a3d99a240d7d2657d54a2c8c1540b349380a151c9669a107",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 834,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200047ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff000000040000001030432044ddf1b1586c51deec0306d02d88e54bc2a2dc6c7e65895891633f866addb9de1ad32a8bc",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "c11b2dca6672802c8528af2c84b1a04e59c9a22bb271bd6d7568092babd2f23efc063ab248a2717d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 835,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200047fffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff65f89731c0263d13aaa8ca7b3dadea10c46d7243883d7cab726d463b254df6ef728b52d8bbfb06ee",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "aa2e1ba6b508026b967ab355b99318bc394fc0d3cfabbb246804ddb5f913e6ef6bc0a228311bedcc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 836,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200047fffffffffffffff0000000000000000ffffffffffffffff00000000000000010000000000000000138c04477f42d165e4d474248d091ad74220de2021d0ca8f9f7295c7cc19c787f94ec33a2e4d51ee",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "5397c3d5663f5fcc4705eceba8255e89cea1747ad0d08d40b7a1aee01193b5df9593f8013c5dfb96",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 837,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04f2455cdb035b0cd4422a3ca06bb19bf018d1a5cb84eb12446d47f7f7a16c035c70951b4b6bad7b",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "20c790cf41723c9d5757b1eec1ff88ef16cbb632879cdce47fcb583262a7a6775c4486df301df5f5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 838,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "3",
+          "shared" : "a3e86777a4263b4656733a65bf322d397199cda903588fc3754cb0e27901f5e29f115b511b94c831",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 839,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "93cd465d332e25bbec7b195b37f7e3a126f1d67cdb946cb9b2c45a36a5c4d7e9171f3d3fded20ef7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 840,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "1000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "6cc6520a3d34ec73bdc0648390a8be6736c104a6651c7a35face310fd0bf69b151aecf457ef584da",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 841,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "78b7d04861460cbf141f6d41648742adf459b5f3695ba2449ce76210494ce540069e1536c03100ff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 842,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "080000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "8f21e698a1e1bc66acc08adb5b923e4b2a012dfe8145637e702351f161688f0b572c57d4d1b6b4f7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 843,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e88691555b44c59311",
+          "shared" : "151b2e82d009a18b4b7e46df2ad0e30d151d321bd64ef2f1ff6a36781ae448b99ef443ac7d1b09cc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 844,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98681555b44c59311",
+          "shared" : "d04a5e44828163fcb66f9e601d933ba2f431cada91256861e36765f6098e234005f48bb039a288ef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 845,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98689555b44c59311",
+          "shared" : "94023419382fbdcacb99fc0c37b73be771bbcb8b2efdc6dd324f0328e16b755bb27a2ab440ed6c87",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 846,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555a44c59311",
+          "shared" : "aa464b779d451beb21ba7f63b65db0442c52b9ac32f0a2addcd0869c7ebddff479d47461b83225f8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 847,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59233",
+          "shared" : "c0038da858441f559a864dcd6c4558437f9ad091a67c3fda69a9e0cb6f446a8b47ae95edc2f4eade",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 848,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c592b3",
+          "shared" : "8258131a80bc9f2b8ba532ef1253ef39dce25e6deb85227c670273521c311dbb9bf1a56dd29107b3",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 849,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c592f3",
+          "shared" : "ae752e75684a9adfc6198e6c1ce9249d26743104e8b0bd0417998c62982622ea2fdf6917413d547c",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 850,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59303",
+          "shared" : "37bfbb637fce27ee80b3af326546303e0bd8af01b72f591830a548609055bda489d9a4e6b5e3f43e",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 851,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930b",
+          "shared" : "854ce9516e73c6cc8d0d6ce3cdf933541a719578712440f02a86829af1398fcab2bb0949c1d63106",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 852,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930e",
+          "shared" : "a3e86777a4263b4656733a65bf322d397199cda903588fc3754cb0e27901f5e29f115b511b94c831",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 853,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044e73d59ec474e679414d0922de22e06d0dad990ba4746c3d026bdea52e7bbeaac928d0ddaab29dfed230dde60fd57d4ef8e935b23cb7d4216b278b17a3f02d70454fa0e45da2054b91b0c4b663ab243d",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930f",
+          "shared" : "7dfd07c1cfe70db4772cf9f6bb6b58a10bbc9509e5ce86651d5c395f3544f62d6d8f8109edba441a",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 854,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 855,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 856,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000400000000000000000000000000000000000000000000000000000000000000000000000000000000d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e26",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 857,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000400000000000000000000000000000000000000000000000000000000000000000000000000000000d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 858,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200040000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 859,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200040000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 860,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000400000000000000000000000000000000000000000000000000000000000000000000000000000001d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e26",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 861,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000400000000000000000000000000000000000000000000000000000000000000000000000000000001d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 862,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2600000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 863,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2600000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 864,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e26d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e26",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 865,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e26d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 866,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2700000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 867,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2700000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 868,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e26",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 869,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 870,
+          "comment" : "",
+          "public" : "3019301406072a8648ce3d020106092b2403030208010109030100",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 871,
+          "comment" : "public point not on curve",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb28b",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 872,
+          "comment" : "public point = (0,0)",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 873,
+          "comment" : "order = -1763593322239166354161909842446019520889512772717686063760686124016784784845843468355685258203921",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee10229ff2ca1b8dfc943b0481ec387a12dfe1f9a0670305a4970ed5cd2b7d1381179a716796eaaa4bb3a6cef020101035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 874,
+          "comment" : "order = 0",
+          "public" : "3082014b3081f406072a8648ce3d02013081e8020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1020100020101035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 875,
+          "comment" : "order = 1",
+          "public" : "3082014b3081f406072a8648ce3d02013081e8020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1020101020101035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 876,
+          "comment" : "order = 410618568360611413177547474029944166748205379750040840301822434183392856467013123528027",
+          "public" : "308201713082011906072a8648ce3d02013082010c020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1022500d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b020101035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 877,
+          "comment" : "generator = (0,0)",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a60451040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311020101035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 878,
+          "comment" : "generator not on curve",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee3022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311020101035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 879,
+          "comment" : "cofactor = -1",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593110201ff035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 880,
+          "comment" : "cofactor = 0",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311020100035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 881,
+          "comment" : "cofactor = 2",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311020102035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 882,
+          "comment" : "cofactor = 1763593322239166354161909842446019520889512772717686063760686124016784784845843468355685258203921",
+          "public" : "3082019d3082014506072a8648ce3d020130820138020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 883,
+          "comment" : "cofactor = None",
+          "public" : "308201723082011a06072a8648ce3d02013082010d020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 884,
+          "comment" : "modified prime",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900bfd4cef07c157c860286264eb02a03e4bd57db899dfc714f55bcc71c32b829e7af670ba56e9c05d1305404283ee30b568fbab0f883ccebd46d3f3bb8a2a73513f5eb79da66190eb085ffa9f492f375a97d860eb40428520883949dfdbc42d3ad198640688a6fe13f41349554b49acc31dccd884539816f5eb4ac8fb1f1a604510400000000000000000000000000237bc7178cc16000000000000000000000000000000000000001d54042dd00b5c5ebcbab5d16bfe9013cc20d177a3491ba0fd60ab4d1eafcb56a97a71827d8589de6c0022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593110201010352000400000000000000000000000000237bc7178cc16000000000000000000000000000000000000001d54042dd00b5c5ebcbab5d16bfe9013cc20d177a3491ba0fd60ab4d1eafcb56a97a71827d8589de6c0",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "98a5ab0e3aa9396e44e9a6cf836db0e622639dcead75c2b337487a303c1a100d6e9e8dc71c9c2162",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 885,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 886,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 887,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 888,
+          "comment" : "a = 0",
+          "public" : "3082014c3081f506072a8648ce3d02013081e9020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27302d04010004281c77c2abfaacfed15441047a89c6d600bb9a3c8aa864067cd4281901a411872412960f59881b9f010451044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311020101035200044c666c637a771b09bc9c83edc96a6e78840b0a43fbb42b1b363bfd28d2a22a11889dd1b9db24386a22e44d181b8587700a405e083e4fbee3d441a5496a7a481f572d062d29fd2d4665adc843a1ebb289",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "4f29ff49359bd65f86dde2fdcdee484544b989c6b85c8489076cbf187c57145effbe48e30c1cd762",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 889,
+          "comment" : "public key of order 3",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2730540428b27686359a7b534b829e93b819502fd2ef7bba3a2195d5143b03d0bf5a511374f90c4ceaf0d408bf042828b9477a11b03092b4f483a732a1d53ea2cd855d0da3b8e35f5d2c7aa7f483d331b56fd68ed59c9304510426e0c11513ff225f13992b4960037cdc1cad2c93b9b2c621daf12bc07fb785f63839d792c539657fc4a0ce35882be86f9054b33c232ab0223736661a343af6e9f0fa2859a177d5b9696b615679a4e1cf022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593110201010352000426e0c11513ff225f13992b4960037cdc1cad2c93b9b2c621daf12bc07fb785f63839d792c539657f0ebd78eaae90674850e7c522aed73043c259698cc2b917055e989192d71c166f9368b15b780e4c58",
+          "private" : "63c73ba272722eb5c4ec1f8c0e8b98e3c0d6ae3547a13a1d7614d44ef1d6d14d8822b3f7dd6109c4",
+          "shared" : "518bd1efdee6c83308944c0c45c6b406440f5b175e9ebb74d44cbe739909f24b88194f8145ddeafe",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 890,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004cbbced7d0d8fb5d17ed00a047fb60933d1716b5f120ca68abd92edc2eb4b22a1f8d0410966791ba8fc7a7558a3b220038d84088abbe19728",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 891,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b479d6c21efe1412dd59f04404ea05a8cd7fd74c41c4d2c1535bded83afb32b92c6105ac9ff9786bb20dce846922e69218ea79a89d73573add154272385ffe2b",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 892,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004788d64af48129627a1b87b999bc87c3a633321f6047f071587395dd7690fdd0b85c535c2d5ae157bf1a213b1ba452b38af8087cd933f3effa32c546948a7b79c9801399f5a5c7aeaedd6a8ba1355bb12152f01f060a9cfd32da747edd316417b",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 893,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000400f3f8effa60bcf759f795e0fe77c6e5aa1014b78e92957f9de9ba5b4e7cb99c163c80db96cb28472d721d8f6f39aa738ffe55c7bbb78c54a8e465fc7c548353968700e2b278cb0688cbdae017de7bd98a73d04434058978a5bad558f20120cc230080762b717f5a9d17c1bb11ec6e80fec81f4775784ec9d17aa7e5b119dbec02233e92",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 894,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a0342000486b290e29307ff43b3c81a48720c0e89a478b06d8c811b10c7ff3654aa33105244c37378866ef4920ef6099b596e95449788df3a2a8452ba922ba99e69346f54",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 895,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000459b150d0645424cf928844d1bbd532d8a8195960332da50cf9aa186480ffb0b58b64c4bd198525183852d127aa3742fe96df49bec7585aa4",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 896,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000489021ce82845fcefd942146ce35cad027ade8f821ddfad0ea831d1f6fe6980e60be917f848a4e7dbd3dea6035bbfa41d115fba98797862cbebf8087b7647fe89",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 897,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000437f59347ed0c8de4e888171eed280944742e5cd4246017c657a4daf94436f38f10a3076eac990493ea5ff93234662d9c3f7747a2fb2e14fb72bdc74d5d588cbacc0241cd7ac19fd8eead50526974e6ad56ac471cf7c21667b92ded8d714c79f6",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 898,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004a59f99993f8e3706eb6e104b638e8511c5b08e82344a6538528df723eb38ffe58c70197c8e88371f1d0c550e3bbbfe125c1123d5d0900c8164f9b19dc66fb34f45869a8aac9294587c6bfa261f401883a1844e71b83268e916ed6397c7df9542991437b705ac561cdcd0886409919b69cb12d36399df71e8e2414f1ff17111fb",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 899,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000471f4543326fb3cb36fe6471712c30b1e81e5d717bd1f2bf7136793728cba811d4bfdfa99dd5731911ee78d7010f6bc9e71a423d8d6823ec9",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 900,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200040b2ad117bdc9c839820852ff829d60cb51a6a10f0a72061ca27eead92113b1d98b98919105efdd2376669e8e8361571d3db8736777690a263f04dd2605a65225",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 901,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200042ddfda6a53e3aa3133a04c2ed9a3c36d3f390710ae781e2975c83701ea352f007b4f7a976ba322419d20d75300cdcf190a58942f9aab229a3dbfee185c3adb6ce9a4907b90cac0fa649c22cc2e17d48f",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 902,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200041768d368f882df7083b3d53987ba94d8720cbbc443e12700df5eb044d2f5621e8223a3ee3bd71b34f32e3afb5404e85a51cc7eaa1569ae4c555200a1b2df9c4adcdd6ec3d3de9abadf022da337b6f8873bb415e959e57b029850cdbbb38ab417",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 903,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200045ab89b3df599c3c1f1fbe4c15c0aac1ea95dd83f60623c2aaec3b9c31ba68d1f5a637758a7b8631d720f71d756a72c141e41afd508bf7ebcf9b6d1d4764768a66ffd7dd1d605daea2ba841d0a9106a22f1a630f272f906116c27fe3c3ff729d8516aaf0c3555e352ab69dc64f36e2d6320696b366bf0d07aac51ff9db3a480ec",
+          "private" : "70d5b65d90e6ab58a91b5a75073a347d0863cfc8a96e7db78e098dfb50c4262f401af3c36c43c719",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 904,
+          "comment" : "invalid public key",
+          "public" : "3042301406072a8648ce3d020106092b2403030208010109032a000227f2f8f1cbc7ee440c167d52782f509b980e1da034c259f079fff653301ae28a88511e501836a7d6",
+          "private" : "0cdeaa01757954bf813fafec8356923518e410cc8778d88eac1a07f90b7fb4d20db28670e178b941c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 905,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3042301406072a8648ce3d020106092b2403030208010109032a0002cd873725ad5a0cb428ee170bbea7609f8e156a73c4ab18fd32bab9e41af3d36eaa5313a81f74e845",
+          "private" : "0b58eeb16a7f22f4562161ed8ea68ac86322d3db6e5d4fec50aae16d01129bf8c4d7530ff4d94a137",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 906,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3042301406072a8648ce3d020106092b2403030208010109032a00033fef766ef618b774a78e4d81e16e5a9afea06500eb0e366377d839bffceeed1c74e6caecdc9fbb21",
+          "private" : "0bdbee13a7eac096b33fe43b8adc4c0e5bab438faa6333570ffdeb05d2b3e95961f9d591f36882027",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 907,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3042301406072a8648ce3d020106092b2403030208010109032a00023fef766ef618b774a78e4d81e16e5a9afea06500eb0e366377d839bffceeed1c74e6caecdc9fbb21",
+          "private" : "0bdbee13a7eac096b33fe43b8adc4c0e5bab438faa6333570ffdeb05d2b3e95961f9d591f36882028",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 908,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3042301406072a8648ce3d020106092b2403030208010109032a0003cd873725ad5a0cb428ee170bbea7609f8e156a73c4ab18fd32bab9e41af3d36eaa5313a81f74e845",
+          "private" : "0b58eeb16a7f22f4562161ed8ea68ac86322d3db6e5d4fec50aae16d01129bf8c4d7530ff4d94a136",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        }
+      ]
+    },
+    {
+      "curve" : "brainpoolP384r1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 909,
+          "comment" : "normal case",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000470ffb350173256eb437b140365842397ebaf3611b6389596c1f17c5ff5ce5201f24f6985b8fe0890dcae54b2603dfb4087242aaf7b2d95b3199bfa03e8fce54ef680b57109847274db3b3a65512b7f832248e70b1030e95db6429589775c3346",
+          "private" : "24ddf0fbb41c28365d302dd9d26ff9c32c76c85fa8b9138a3ec621d0caff6de8a724b45d6fe0d9180044242b9f41c84b",
+          "shared" : "22522760edc39280ff3277b121e17e7539165e7c677a65c8d0dc8159111f8e5d3df7035fe8ce33ac0a0e047ed0842a92",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 910,
+          "comment" : "compressed public key",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b0332000270ffb350173256eb437b140365842397ebaf3611b6389596c1f17c5ff5ce5201f24f6985b8fe0890dcae54b2603dfb40",
+          "private" : "24ddf0fbb41c28365d302dd9d26ff9c32c76c85fa8b9138a3ec621d0caff6de8a724b45d6fe0d9180044242b9f41c84b",
+          "shared" : "22522760edc39280ff3277b121e17e7539165e7c677a65c8d0dc8159111f8e5d3df7035fe8ce33ac0a0e047ed0842a92",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 911,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000456b0e00539a304e1dcaef00d90e1e851002c5cbb2e7a0cdde34700f242d52d607cd48498fe7668eeffadcf2418ea898e57677fe6703911e5de7c45f3e03eb179e3248008eff9f5ad5860c74d58a45b291c23bf8d5be285ec6e9fd67ece9b6692",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 912,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004038c59d90915563eb3fcb7f8f0b9b4cfcd279a2591695b5a3c64e3a1bda0eaa78e8f060727858fb074f2acc98efa48230e90a6199713cc07fc845d61744564cebfb1d157c39c4a01807bbf81a69caae69d6a9ef6c8547213ca98237f51406f90",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 913,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000427a570916684cea784b27082b31dcb149b40c9a0513794db6cc4951858d8b2d2a30c5bf09d590b2f17e5c1406e96e1cb047dba720e25f5729903e7164b2c73907db148bcf8aff649aa80715b067d88ce1bd2f380b55705cfc368d5a515bf6f91",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 914,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004279ffd6f54fe3847d3464b645a6f4243c49169b3494c61e20a0457ce93d6aa8535de70b5ca78fd7eff05fece3ac253c563e753d531fb070facb68418900016d66e1687e2daf8eb4b63b749a4283838694d3deeac3e79b9706e856fb7358fa0a2",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 915,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200047908c8d895ed9ef9a902951a3a45383d24d57e3beb47f84c58636abd646b905087b2a06e130428f59007866a2a638abd4af08091e7589dcfbe7e638f10b430a89ea26ad930019a227040ca43aa4d08651b7c0904c51a32f8d214b2f0f434e85d",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 916,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004402f58faf15b56dc448bb6eb752502d03783d7beccc3afdb5c44c0e305765109c95227e9d7e2e9c52177de0ed2f95baa062e400bfae4744a061199b3358030194e7f28d3ba748ff0260b1fee5d0844f8ce446dac263a54be950d389e0341b575",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 917,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000464a17ffb46ef3a321ba23f97740e489ed26e6f76b586344f69cc5c05656daea35719c8c6b4cb5d1c5d8eec6d6705efe477396a9265b9c71ad111855d879598ce31e9e95ce9395b751588c5d92a3aacb60d413c1bcc66e7b9cf663d30b8b00a2b",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "17cfae6c3851f2c5ca6badbbe2cf885662d6f7f09e74374f1c7c2245045c02443eeb57d8b43b463dabcc0221bc82abaa",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 918,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200045d86d2275f8e2c9d7c9232c48b41159b1e8e848d5e0986419c3b40b4a9b93d3d863efbad99c981c45bdd40bf3fd3e2b262ba8a5c36e3d948f2e9fbc4687fb5de4f4fb59e38bac3bca2e61179e08135e346e1febcf9bebe9bcd80768818806ac1",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "1b635895e1e2c809653471a1a1ce3460f76c7b06993c654ee2661011a5b88afecba16d6fff26a7709b7e59f93a9de703",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 919,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200045c1b9513766f017a401fed11a435a3ec55a8180dc280d7ccf7dab89f79499dba8e229361c2bc0f6406558db07218e2d361aa065e64cabb097b9da8ac73b568b4bcddb4e3d6acae8f681f68b02bbfe423c98a2d3e1d99eacedec4bf79bf278507",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "2d06d205cba6e20e97616b25730efc50433fb246da15642508f08dd4dc348e8379371588ac25fa39696968bfff4c76f6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 920,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000447ad5655229b6c8d3f328f00a10cb719c64c8a9942acaa6600da6f0da279d5e830fbe25c2891740b17dcbb22e5255a9314da410d402854ff72dd497ea0accbd367de04b2fc0c7b3378f2bb957e1638820f7ec3dd483fc80d7ee650ead7f0d06a",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "33a28df92842cc0a0d43e5d33e2d351e641258d505cbca1a686a2f8c513d7f945e78187eae188e65963270a075056e35",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 921,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200043673cc8f64b4f6651ce2b69e057db05f24c4c118e69665d8bf6e5774d0b2ba96ccc796f547cf2983b5d4c2055ecab75e51f4c4e99539747df8cb4ab36745fd3c60f16c7e83a1d3e15b44cfca1953929ead6af8398c43589e913ebc64753edb16",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "3bc08823776f7ee08b4f218f4bdb41e954e7e74abb2d319140c67b935706b1d1440b3da7000068ae55d56acb9746d4a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 922,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048c583d0413b24eaac4ec484348a3eb7059e37e8575dc2657ef2c0a1b03d320ee3638307022197eb40cfaa6c2465e7b272f027afad18da3d144091569110324707a8499902d327f97e3295feeb2752c0a6946dedf08e977d830c8e135f9ecc0bc",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "7ff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 923,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004349c8a1b4e986d3f814a0b14ebc416e58eb60c697af889d9eac3927e53791b589d1068b55902605c675ffbc1f11cefe576a8a077f4e5676b07a2e701adbdd15f78a3c04d365e654055ee88c4d007a97f5e6674e64750482c9dedcd24ae263e50",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "7ffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 924,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004572ed47e9ee31d2b2181f5c5562852c7f8ff7050f87dc688a64bc1ba0bf280fe55118f8f8c7f9c0db1e512680876e7ae87ddb0174be3d71ce5bda9cc024d04c8a82c002491b83415043bfbb1b372fbfaca27e0fbe9768fec5ec67c5fd7544817",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "7fffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 925,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200044ef2b05bf70e827c1fe64eddcc04cf1a416c032d155d3946bff2270701fece2ec1ae9725912cc4ed9a97f52b10a98ac12ae6e94bab916c5763812435f25a74be83aea508f537f9f8d67fe66f0e30ed3fc96ccba75d6ff46221816d8fca2b484c",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "7fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 926,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048c4ce75c1fb23e253d0fb0a1be67dde4b45a4e6763ae0794b5d24a37209b25ac2e95208ba397bdb01b459a11fc4cd89c07f43a664ea0fca116b66124a4fadc0b341cc3d7ec2da14bd5589642016f1076762a535145b6cda3f8bbce24c0ed9637",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "7fffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 927,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000470c6e0dceaf63c5b92c45b5f33f9ff049584b0b41ec1c476e50651d5ec56069490db561d97b1a2c2bebcb7b43c8001eb52b9feddb992f69e9e566ccabb69352cea294e1d2683d7046b9858569ab73576f2b42f11ad19cb41a96ea3d595fd0114",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "7fffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 928,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000471613b39cc9cad25b5c677dcf071de6308411a0f2c1066de803bfb68c5bff55c26e32afad0aacdbbc32af5dc5ff71b7e24684b4f59f7e82053d5c2eca45e1963d594cffe2829460659397e3e978b304daf785e81f1566bce2cadc49fdecaf37b",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 929,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000144e54365091651eebe3aa1e13a14ec2c0dd1b1ad3778f69d586d078d7554c116a71e422add51cea477ce154ce873940e",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "55b4e89b8ca6cd3991c3578f8a970489d5fb1bd7b979cbfdadd1864b281afa73792c6e7baf938053fbaceeddaa5325f4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 930,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000316e6519bec6c43060842536dad3a68988e8427530b0f98765b9d0285eebdf461270a2ccbd4d0b352d4263b97281a15fa",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "87cc934265151b4fec1335793e6a7de98432d914b7321e2ba87bb215e4b8589e01d3d42707959c0f243474fe92305100",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 931,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200040000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0b8ce84c25219c7e4ff37a3728fbcdea683c45b156f4158423314fa879e9d49a02e1ec2e305d7f2f01162d2c60e2ad06",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "043edade91d4030be3409d8c989cf3aa79fb09efeb16877b18558dcaf46c1d2f7369f8583ca8350003e3836554af3ae2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 932,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000400000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff3e528e604dc03d7c658e1f5c4102e1d31ddeffafcc2f7d7a4816cec497a09a851f40ad616693013038c007697996de61",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "795ef5cc47dfbd544e1692809d7c853d8afa104d7d4438ede53bea15f6c60d23621e0ae248ea2a6c4e3a919e455c00a4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 933,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000200680b002d9adf1e053dbf04addddf8c58de920543e0614c976446db34269d5e218c121704a0acf35d776d0a14e294d",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "606dc06dcd00830bd42804dc43cb94ee78c1a5a35996ca4b49fb725433bd072e4b04e1c052d7340542cd08f1dbd79f31",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 934,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc000800204f1799aada7abdde3280f9638becb240be60123c91ad14cf1f7d77e83330519a68a9dd61a8d639e12a41ab930bc278b",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "82a6b7b9740a9e61a5f5d977dfcc655047eb415cbb98935fc24086b63fbc980b750eaecb5232ee97f770d1ede51ed81d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 935,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000417cfae6c3851f2c5ca6badbbe2cf885662d6f7f09e74374f1c7c2245045c02443eeb57d8b43b463dabcc0221bc82abaa206ce32ba9a9c83ec79f07a8e61a7a295486cb79c47942efd323cd9dbe140285bd0b064fcde0dc6e32036043e400cd61",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "40d2f675af9b7bcd5b8a7683f600e098b5dfc2681c0ce81a8c8d9ab0a15af157c4ebf3d04f52fa2242f05eb5cdb18894",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 936,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200041b635895e1e2c809653471a1a1ce3460f76c7b06993c654ee2661011a5b88afecba16d6fff26a7709b7e59f93a9de7031f4ea02c39fcbbbbfed4b88095f4dc0be21f360f5bbb6eebbe318c5667a2cae0db94a454db55578551616a2bdec461d7",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "858b9c88c4ceb57ea7195ca4fef5911de0b18c3bd6a46c23077c4dcb70c08534f50d44dfc1a2d2b805205e9d03382ab4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 937,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200042d06d205cba6e20e97616b25730efc50433fb246da15642508f08dd4dc348e8379371588ac25fa39696968bfff4c76f607eb107e35de143e39251c7fa593853952c55ac76c48899de9a6e03d984b24617fa89da4b60b8e8c70ad2ad50ea1d063",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "7817e822301ba68e0ce644acd45aba1b168ddd5995b97eb11fd1a22399bb8b84daf302f33ecfb87028dd8011eecbf95c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 938,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000433a28df92842cc0a0d43e5d33e2d351e641258d505cbca1a686a2f8c513d7f945e78187eae188e65963270a075056e3544e7e60cc04bcd8854cd27565eebe1c366081551800a3fee831d1493d4bae33e1c22dcbb9dc696603ded84a4318bea0a",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "64705403b5404883889cdafa366eb73797ae97bad283d2bddcd9bb2607eefee392cb9d04b4e99701fdbb0d27c1457a9c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 939,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200043bc08823776f7ee08b4f218f4bdb41e954e7e74abb2d319140c67b935706b1d1440b3da7000068ae55d56acb9746d4a600d0235df6f46e9fda7c162cdb7ed520224546e61469c011b6e8cfd70e179e85dd90449664cd8e79bd9fcff61bbe9bcd",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "4e5c219e6f94a524175415e6aa60d1757871d7b6cc6b2c501e053054f381b92dc4f5ac0adaf63e8f6739814e4302e824",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 940,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200047ff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff2b8c710e160b3fdacffca46bc22b0b7b58349ab2a4183931fdf9e0504685db3c40aa853607fbac52b3563e7c74516d61",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "714b4efbc12fe0460fd296c9868feac501d00b0536aa9269806208ba7fbd4f73ed0a26c89a0854e670e01db8088c3f6a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 941,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200047ffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff3e3943f5e92e4bff7f85ac915bdcc0865c97d0cce26f054df1b29c283a8f8e43d964b528dbcd88768b342995ff517f07",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "43da556c9e9e29940253310d94ca5707ca84a04e2cab890ca49f391747c5be283f0f4593247bce6f0027c2e2dfda8d30",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 942,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200047fffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff4214f53b46996183016065c615037a34f8bd346848d13c870e6f74a26e3cee631d4d689244a615983f6f8b9a4880f508",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "30229a314aa8ed9ceb2a9c3577558f6a9bd857747cb60a59815d2055bede53a570b461861229d832cf08642e9078d6ed",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 943,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200047fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff80000040000003c1234be1022b89c3a64f04102658fb8c319b6932edbce6b78b05f86841ede7eeccc2d091ed867c252f59a773c271e8f",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "2ccef9ba30b16e50663bb4e4006de04d5d687eb6f42d3dd821c8fcb2f57d67cf864c345fdf2de1fdc55fa486a16629f5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 944,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200047fffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff0587ff6f77b0abaf253ee363581e52b9aa55b50a59e2238414827e05c83861fd12356be4547b23443912acf07a02edc4",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "70382433ca7683741ba836dfb5983d3c80760bb7a985499d27ac7c715f8b7618877f651f8ff8d1bd7c1b1206f93754ac",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 945,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200047fffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff21510cae0c660490014dd608337b3f3afcd97aaa7d792e186375f12a7a1fca38126ec420034bd12da0cd051d2255f922",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "5bc26ebe1fdba661bd3125e2c681f591db5bfc63ca27e6ad49dd4f42e49561949046395c7b0fcb3e975689cc602dfbea",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 946,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012134018a6f7bb075ef67617abafd66a22ed8b5146408aa52fc17cf52510b85f08b73acd0b4301e9967b3cc20b914f805",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "170a1a6e3092ff8747b29d724bf794a839f2c06f3a71c323323f10cc48fadc5562101171f4f7a9e41638013c07a4fcc3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 947,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "3",
+          "shared" : "1a136db83c88ec1a705db70c310e685164acf6890c5628fb4004520739a30a015557d3d0fa8652d26af3621d8cfac529",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 948,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "4518e59c3325de9ff9ba5176cce02c2fdc5d47c4d71d7bc7f3ce1a860131f39a00b1c9806fe92feea4e15b505dbfa7ce",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 949,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "032ce3f060545bf89e05ef6cc03f04fdaf66ad01a93cc287675e2adcd6044eca1da4108d91e4c22df276d9ad7dc23548",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 950,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "5bf3778bd7335db843dcbf4fae46f184b18d95fce6afde98b47f62c89f61ee64bef7f7b273e4b391471d2c33e46bda32",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 951,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "2d5751d28414a73a5e2049ac38c01cbdb592e90ad4f1f2168c9ade2b8ca336bc965ee7b8cdd63207b3a8768c81fdae6d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 952,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc30f3b883202e9046565",
+          "shared" : "1ca753eb1a6f3a735f459a26c11c1c6f523d40918a41b1193b9342e0cd81c40a625c4c9cbb4d875b55db498b370b7b22",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 953,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b783202e9046565",
+          "shared" : "4be8f16ae1ff3cdb120f32c08e0a1c2c178e2dd7d9beba9fd17bab1994b44e2107aa248da4a18d45612891bd8a599b55",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 954,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b803202e9046565",
+          "shared" : "7b9679e9ef47700a484d65637a03834a2fa8557dafe5f470e4747bf5ac308ec53b16f83789ee63abd0ae7078422440a8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 955,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883201e9046565",
+          "shared" : "678fe10e74bcb45acc0146334418c1ff7512815f05146cccc147a73324de04c58cb87cbb00735cdc2695e7603998a0c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 956,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e904652f",
+          "shared" : "3729bcd215b41c658b832686c81362b3485d75b09478c6dde3b5e278564ef4162bdd6ff65afc6e8213bba9b6c54ba1eb",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 957,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e904654f",
+          "shared" : "12ba4622daf1f2f950aad6d54aaab821885a47a98573afea49bc1896041ee9501acef82810f3755ff284e16665bd0f62",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 958,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e904655f",
+          "shared" : "7fb5398519857f2c17cddd0a9d2c1660ac35b4723e4a049ba5c58c458b742dfa813a5c7175e1c0974b514bfaeb0039f8",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 959,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046562",
+          "shared" : "1a136db83c88ec1a705db70c310e685164acf6890c5628fb4004520739a30a015557d3d0fa8652d26af3621d8cfac529",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 960,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000409d897b6d1452a2f91c4c37fbb06d82f9ebf722298cafb135e582cded3e3210033e4cd07703c34acf36ba72b401c30bf03b161af6e11309a1122145c431996047a7e7808cf8314b6ec37c61a817d08c7d00c8c7b5d258f2674378c832f682edf",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046563",
+          "shared" : "0f0a1d20ba6a7b2c48154b43870be4890979d9261950736de96c29f371233b1ef94a79c2ab698868f00cea7e912deb94",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 961,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 962,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 963,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec52",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 964,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 965,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 966,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 967,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec52",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 968,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 969,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec52000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 970,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec52000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 971,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec528cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec52",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 972,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec528cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 973,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 974,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 975,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec538cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec52",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 976,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec538cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 977,
+          "comment" : "",
+          "public" : "3019301406072a8648ce3d020106092b240303020801010b030100",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 978,
+          "comment" : "public point not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3ca",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 979,
+          "comment" : "public point = (0,0)",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 980,
+          "comment" : "order = -21659270770119316173069236842332604979796116387017648600075645274821611501358515537962695117368903252229601718723941",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c53150231ff7346e17d5cc792d7f0a29081af19be20ead08ef612aba94ce0e9919353fbda5830c5495094803cefc477cdfd16fb9a9b020101036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 981,
+          "comment" : "order = 0",
+          "public" : "308201853082011d06072a8648ce3d020130820110020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c5315020100020101036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 982,
+          "comment" : "order = 1",
+          "public" : "308201853082011d06072a8648ce3d020130820110020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c5315020101020101036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 983,
+          "comment" : "order = 5042941954480324912133914614639385831494842746066313376667826733277554507683616955290244686736004252971522",
+          "public" : "308201b13082014906072a8648ce3d02013082013c020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c5315022d008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202020101036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 984,
+          "comment" : "generator = (0,0)",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565020101036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 985,
+          "comment" : "generator not on curve",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c53170231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565020101036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 986,
+          "comment" : "cofactor = -1",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c53150231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650201ff036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 987,
+          "comment" : "cofactor = 0",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c53150231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565020100036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 988,
+          "comment" : "cofactor = 2",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c53150231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565020102036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 989,
+          "comment" : "cofactor = 21659270770119316173069236842332604979796116387017648600075645274821611501358515537962695117368903252229601718723941",
+          "public" : "308201e53082017d06072a8648ce3d020130820170020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c53150231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 990,
+          "comment" : "cofactor = None",
+          "public" : "308201b23082014a06072a8648ce3d02013082013d020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c110461041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c53150231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 991,
+          "comment" : "modified prime",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d010102310086794027ec8b4fb52f3941d2981a6badcd5cba8307663d051fa6101f193ed726450df412ccfc38b593cc92eab76cfa4b306404307bc382c63d8c150c3c72080ace05afa0c2bea28e4fb22787139165efba91f90f8aa5814a503ad4eb04a8c7dd22ce2826043004a8c7dd22ce28268b39b55416f0447c2fb77de107dcd2a62e880ea53eeb62d57cb4390295dbc9943ab78696fa504c1104610400000000000000000000000000000000abc978d6d096000000000000000000000000000000000000000000000000007a1da7cd48cc78aa2aee262add59969c80d1d577d80c7a670aca818562da8fdda841f80ce27ba0138ddc986e41b23bb2420231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650201010362000400000000000000000000000000000000abc978d6d096000000000000000000000000000000000000000000000000007a1da7cd48cc78aa2aee262add59969c80d1d577d80c7a670aca818562da8fdda841f80ce27ba0138ddc986e41b23bb242",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "1292e4072996602fbc1877e2168c63da918a81a686f2d80aa6e2dad912b429945a02c456e3c85479a7129f43d53ecde8",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 992,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 993,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 994,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 995,
+          "comment" : "a = 0",
+          "public" : "308201863082011e06072a8648ce3d020130820111020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53303504010004306e2a04dd503c3e87cb98a8d5425f32579b0a5a9ad12ec3e33249c1692619d0c661f539c8c86210ea713d8f1538c64f600461042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c80231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565020101036200042baab78f3133b6232af760862a262691b0a13e2f8233acb4c12d0dd27fcb233ef1af756c1a5cd44d91f70e40d541466b50c92527423b71b5940881e0671e9f925f05b3d32c73d6d9067dc7585622c354dca036d5c3f5d8e3ee9eb67febd1f3c8",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "0436546a2e9bb71b70de8cd53dde90336ba92b6c9811c0dff3137b2bc06bde98ce2db705a9fd1bd4d62c2ce4b58ee5f8",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 996,
+          "comment" : "public key of order 3",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404303ea663a1a4fb33123f79a3a287b94662806507c27ce6809061f1a9ebe17486be402d738000712c1276d0a307ec5cecf4043021e03b8395b0948d713b9c9ad95419c8f880ce5caabc44889514740dc52289a612092681886007b844cee91d1453fe2e04610442aa7b94e0b003988f5ea207d4b3442dc2000fac4650848fb5eb7feef3a0da56b8b4966a37323cc59d5f855d52892f0729ee61c2ee46c66c37b9b46c8271b7e408471ed77f53f3bab9ee61fc5c3e1e0668f3ce9edfaab4b877ebae26d9bf836f0231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650201010362000442aa7b94e0b003988f5ea207d4b3442dc2000fac4650848fb5eb7feef3a0da56b8b4966a37323cc59d5f855d52892f0762cabcbfb4f1a6bbd7a3bb11ce7489fb0ce852326e0062f958c3781d2378f31d43dfd88ab07265b90f5b51ec574868e4",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "32e62a168b4606e41f1aa972362c15b6034b4c363efdc5d56dad420a66aea7efe08417b6f848212ef794609a3a4a84d0",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 997,
+          "comment" : "public key on isomorphic curve brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200046a2aac186356f68786c8ca5be5e56c951d2992561bbd094d6796730ff67b33249a93a53455f8291e112199a10fa7fd2d8c4b85d644688724dfd1726f1e368455e5eb300f479a2ffc556c53bce3ee3b7d522db81303ea97ff13f6e7f2812b1ebb",
+          "private" : "0868ed4ed8c88e8ee4ce28486110e7fd31a392d0991df9153a5af624d6c3ff25bdce1ecc472c9cd1cd2fc8e40afbfa0cd",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "IsomorphicPublicKey",
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 998,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00041d8d7078f45444e91bca0c6cc778f1fe321d1ab171bb011aac8edfefea7d996a11d1bdfb073924f453148c38c6de594981b4d8bfe33c27af",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 999,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044e00275706e6ca58a0a7bc864b67df419408a9d8f5ade6527a1c50238891bc68617d1e8777d528e7561a1c1ed6ed2caf8e103858e76e391b42957d8287adb06f",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1000,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b810400220362000459e0d3a39a0251cc1bcde05e330e6ee8a24a2175b85f67eec54d2f4c82d9655013bd53d4b4aaf537749e623c194979504e6abba9547065ce759e95282edd690c569ddbdae460b607510715ba17dc4323144d9492d65d0c0fc1a93fc92b34af08",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1001,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040089e14bf28c88676902c1191f0a2ac25e5c71114ded6120b483e93d1d065ab29f8fb895a701862df5a72d922f48ce27ca8b642184e8076ab6b6b032d71a8839cd7901329967bf36ad29a7b6ac74d97c8f47c66e32f9b029964fbca95c992e76c37b6cd45f5dfa2d16f83e3ba6416c54298dbeb0fbf1e663c14cf22a5915d4fcff66b108",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1002,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200045ade136fefe3cdb4461461a47ae7eb366531ae5d7fc1bb994328f2345c151c0dfb46dab78c5ae0570d9032c59268e3603cfdce83c7fd347c5fc79dff10a755a4",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1003,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000474976e5c913333e7c095a8a6b66bd3c78abb0894ce5598fe00761d927cc78f555570a628ed26dbb2105e014ed23a19b12b162a1d19cee785",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1004,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200045b204fcb4b2f92310bc19e8d4951c7884de3962fefbbec16cc1e9758d7ccaa1da8a4f202076b5515e46f36a2c8a513f8e1e18c7e42007e6ad4dff5e0ab0737a5",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1005,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000423a0440fc8d87b1b799f4b91791f3f5175b5b103f5ed4ed352a92f6c2d5fdda8ea07e9a5592afd2f85557310983058b60f777a8b88632f7127a29d4e949a4834f34db5150023d819a2b5fd7a6ba1561f",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1006,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200043d5b219486463a71ff9296216bce6a7b0ab091447f61f96c98739ad6bccb42a9b74b384f07d3755ec54c58c00db9429ea5bc1691362f3c12bfe41f8c4a1d738d1fbdd1e9da8e3c783157052dbaef82b87829db3c90761de50e07910e773ad21b4ec81dee16dbb8bf50d7f64abb3451ecfb985cca4725ad66eb15fcbc28f31310",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1007,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004ca475ba8be87df96495320a6912ed35f3ae5b5a5dbe170a24aac2e6ea7febb3f1088082ec1fd1d4f5a509c7b05793b2d0f17e611e1579407",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1008,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004a91eb1462fbd71d6d4dde4bcfc5a80e53e61ade709b5eb384b6661f0dfa796f91a45b825213d3215b32fac6faf19506887f84fe933066e3e97c906feac9e41b2",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1009,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200046fd0e50e88a56f131daf8f7ec8e2b44ab796d0491f77c7db01e7a9d872dc7c54913ee8ec683efec969820e7ed431dcb1feded773d12f8c1a17d164e9873a69c0592f5df135f16534e69983199c472edf",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1010,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c0362000411144203a5580501cf2229967282251f35cc66ebb978c8c5df821b11e36f95d6bac1c6f97b8e8d026e88cc2a24fec16b43714b10baa062a06712898730548a9a2290a984ef9a85d2eff128901dc0f16bc57231d21de65e42f84e42a409428eeb",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1011,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200041daebcad055304d190eb662059f41e6e1eb11b7b73d69cd72f74c78756d1219498f667f43e6e0a7fe1dc57cb1a4fbbe8a57646924b8ede193f26b49d9db53c9a98ae0b30895690181d71459ab3c1f3b3f1add63a639edcfb549849a953be3f4bc9fa5d75fb889d49a2f25e8de94cfe714987aa2077ba7f2b2c084f05a6272ab7",
+          "private" : "08c3bc658c0b61a0cc1c468e868a4d0d0b2caebf350cc355db9f3b5e16b54db120ec007fbf683f5b0301a81221c9cba1b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1012,
+          "comment" : "invalid public key",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b0332000266b87a19f47d772130855c64f1c1e445b19de6f917bb1c74198ecda924714d8c48e0cbeaa717453408c31c220a677693",
+          "private" : "3c9f970f25e6951b2953dc37f5458d5e11176fb794bb443c677ab6638d008eb35acfe85d09fe70400cd52bb47da13e88",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1013,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b03320003878663e0db7b8f0bf1f6f24f15160f0589da8f8f92ec000a57657321c6e3c4ec845c97536fd10cad1adc6e1341968dd0",
+          "private" : "084a6fb1f3f3c583d09224965f5a96d7fb9b44bfdaa15d02a5cf7c90e321178018a5cdee93f614ead731692e71918dbf3",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1014,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b03320002867e44d486465a25b827992e1de40cd6eaa276abbcaa852db4234bb3c5fa9f1c6956daf846845fe4862c025882878783",
+          "private" : "58c9afa82e35c64357c13f5f2efc4f9cbd0e65f718e70a9c6c77e73bd7f905ab7dffc4c82316a887e1bd625fa4fb715f",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1015,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b03320002041849139e191747f15e6b8f92462e731ae0c57c408b1e12ab1bffe434081033780b92b5ac81862263117a0836d180f5",
+          "private" : "0c7b7597b1fc8f4f69b90cb164a4295dd5b8bb3d7fee4588fcee79f2fa62c07c2cc35ac68714389e17c3a4b8e8a07dbf",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1016,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b03320003041849139e191747f15e6b8f92462e731ae0c57c408b1e12ab1bffe434081033780b92b5ac81862263117a0836d180f5",
+          "private" : "0c7b7597b1fc8f4f69b90cb164a4295dd5b8bb3d7fee4588fcee79f2fa62c07c2cc35ac68714389e17c3a4b8e8a07dbe",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1017,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b03320003867e44d486465a25b827992e1de40cd6eaa276abbcaa852db4234bb3c5fa9f1c6956daf846845fe4862c025882878783",
+          "private" : "58c9afa82e35c64357c13f5f2efc4f9cbd0e65f718e70a9c6c77e73bd7f905ab7dffc4c82316a887e1bd625fa4fb715e",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1018,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b03320002878663e0db7b8f0bf1f6f24f15160f0589da8f8f92ec000a57657321c6e3c4ec845c97536fd10cad1adc6e1341968dd0",
+          "private" : "084a6fb1f3f3c583d09224965f5a96d7fb9b44bfdaa15d02a5cf7c90e321178018a5cdee93f614ead731692e71918dbf4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1019,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b033200027d965d604aad48774b0c68abb9febff3cab818ea4890bcb616938556828ab77dea4a0847ad8d61eb43d845c9ec241cbc",
+          "private" : "37fb984a7a821d5a3660a951b19f88b2a95dfc6884e029bc5d99251d9b2d1ff88c57e0f9dab94bd0fa13221a1540ca2d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1020,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b0332000311455b9d356978751548ed9ba361f672c40215fe873e5b27770ece7d60701fbf07e3f95ab38857eb8785de02b69c356c",
+          "private" : "5e7ba1f7812005953291c6e5a7236abf5dcb32addc97fa40d06a6fc7a2a1999a93b1d224ef85e3327d7d2b3f7d909e3e",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1021,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b033200035349860144ee64859a8b0174c95e5f91f357cd38b26d2bafeb49dbd912cd4804f1dc04c0707199e113089f1df253a629",
+          "private" : "6fc580974437283ea60899aa7d4c817ea81d5332a86bd9af5ba2fb0e0c7c41b7a523ccddca46dde61b1809c970f17221",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1022,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b03320003705965409ec374f74c51ead3609443cef7db7c879c41db0e28e1656e26b236b74b99f950689ffab717d24c8f979f5231",
+          "private" : "0806f6eb807a213930b60443ba0164d22985b70a2034edb59c35639f52d8e4dd93ec589a83ee9000e8813da131f59a46c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1023,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b033200028af704d3911fa5a7a5f6ce54856465cae4f2eac69c84d2dfb1ae160b8dcd3b577949c97239e2e420896481c76b5a4465",
+          "private" : "2e59b6c0ee75135d8df12b9537d6f00b5281585166a77075858c5e9058a8dbdc4a4b8d7cdb23cda2429e069ad19be3e5",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1024,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b033200038af704d3911fa5a7a5f6ce54856465cae4f2eac69c84d2dfb1ae160b8dcd3b577949c97239e2e420896481c76b5a4465",
+          "private" : "2e59b6c0ee75135d8df12b9537d6f00b5281585166a77075858c5e9058a8dbdc4a4b8d7cdb23cda2429e069ad19be3e4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1025,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b03320002705965409ec374f74c51ead3609443cef7db7c879c41db0e28e1656e26b236b74b99f950689ffab717d24c8f979f5231",
+          "private" : "0806f6eb807a213930b60443ba0164d22985b70a2034edb59c35639f52d8e4dd93ec589a83ee9000e8813da131f59a46d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1026,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b033200025349860144ee64859a8b0174c95e5f91f357cd38b26d2bafeb49dbd912cd4804f1dc04c0707199e113089f1df253a629",
+          "private" : "6fc580974437283ea60899aa7d4c817ea81d5332a86bd9af5ba2fb0e0c7c41b7a523ccddca46dde61b1809c970f17222",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1027,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b0332000211455b9d356978751548ed9ba361f672c40215fe873e5b27770ece7d60701fbf07e3f95ab38857eb8785de02b69c356c",
+          "private" : "5e7ba1f7812005953291c6e5a7236abf5dcb32addc97fa40d06a6fc7a2a1999a93b1d224ef85e3327d7d2b3f7d909e3f",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1028,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010b033200037d965d604aad48774b0c68abb9febff3cab818ea4890bcb616938556828ab77dea4a0847ad8d61eb43d845c9ec241cbc",
+          "private" : "37fb984a7a821d5a3660a951b19f88b2a95dfc6884e029bc5d99251d9b2d1ff88c57e0f9dab94bd0fa13221a1540ca2c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        }
+      ]
+    },
+    {
+      "curve" : "brainpoolP512r1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1029,
+          "comment" : "normal case",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200048a73a66605a5db252ef418ff2c43969bd4128187ce431c36a33d3ff3034cf8910fb0021ce849723621199d0d7ea4805f3cdab82f6c909257762da2a97e26305b078c1fd791fa957e975e30df5b876054758267129e4974a083372b0ce071180d05e1978bd90b8407c0a7ff7f6651bd3ffcf1a574dfe95a2e8af3866cbb385d21",
+          "private" : "6280eb95405fa8c0e9d970547301bbefb152c8c8114abc730c89bf6db3f7d949fcfd7ebb82fd2dbd43d28d47bf4ed95de97baed19f7d087cf303d2b0cd413767",
+          "shared" : "9690120edf3c583f627774ac2837f792e1049b3768199e3cc68c75cc16f73d4eca828f87880de91e2fbe0671b7066fcc814cb2e190832adae3a6dc7d9d9e71d3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1030,
+          "comment" : "compressed public key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010d034200038a73a66605a5db252ef418ff2c43969bd4128187ce431c36a33d3ff3034cf8910fb0021ce849723621199d0d7ea4805f3cdab82f6c909257762da2a97e26305b",
+          "private" : "6280eb95405fa8c0e9d970547301bbefb152c8c8114abc730c89bf6db3f7d949fcfd7ebb82fd2dbd43d28d47bf4ed95de97baed19f7d087cf303d2b0cd413767",
+          "shared" : "9690120edf3c583f627774ac2837f792e1049b3768199e3cc68c75cc16f73d4eca828f87880de91e2fbe0671b7066fcc814cb2e190832adae3a6dc7d9d9e71d3",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1031,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200041c323510258b858d9a996fe644e2d116ca360726c51a54e0aa69e88ef816f20577349ae1f2f202ff40c499bdae4274bcfd502f736cf82f43acfca55649e9faaa88263cd161a1a6555ee0249363b537c8f2e2ee80943f4b162893fc9640d54a8e7b997ad202a9b723c3a08929d572076e3c85adec089da1507861758d47e41ec2",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1032,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000438a0c765409100f0a831387ba46fbcda63956df0f00e77615b33249e1a73d1310bb22784e09e3faece0bfa6ed5c0fa077c8a62664221ccb596c9efa2aebeb3ea937dacea2ee4fc261e29af0b64ec5b4a8f0fbafe7470d715c1effd463eca68344ea7446a88e5874ebb1a0faab7ec0d36d203bece105a11edadb00e93ab0dd818",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "00000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000100000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1033,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200045f65b98616109b88fecb4cc1e639e98d2109bd696a14b921a245f265eead9c44eee4d19d162ebb972eecdbbae1c3b5d683e8a2163861267795840e79bd4e08fb25a472717d167587165060003c77f8d3339b908613063e5cd1abf0e20f4172fd3099f8bb96bc26a84137be2f341ed6c1d91c11ef3111b4cf75170d2db59bd790",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1034,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200044069f3a94ded3bc37d32cd2cbac29ecb33b3aad195d9ac57965128a5a8a4ec2728db23e85b4213c60db409a77661f60756abe7d9edd7057a12453a19202c54288ba58659b7b37d74a80109fc484efdf9168c2121b7aead8f5fe02d483b51f1f213384189924b63050fcdad57d2c4dbc5c31c4c15e1901b5192708410e160c356",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000100000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1035,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000428e7878a20a024121e36339bb0cc67e6e4caacd54e13ede6d7ad4c73385b6125bfefe8f8e1ce95d2d32b956132a91d7c2e09c399ab938228aa16fdd2d748752c0a87e583384d4531d16f5e59debb3691fcdc91e35e9a9a6c4adcd020f3def3931b539cbae2414bdcc4e35688379ffde07a0991730c5783141af7f87fddae070a",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "00003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1036,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042830ff4e16150ded7167833c6bdb7daf11de99448f4e60e0c775f46e3a44b85599148f944fb6ebd8609eb2342cc86524e989726ee6b9f0278ffc36804b775e85881aeea838831b2d0a702a887ba5b549b82ce5543857339fee3425368759cad41432129a187dc37e6a28743fd1dda1028fccd9b8f2c0d44f8f9146e48401b898",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1037,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000403d1fa2562f3b6c63a86731c2519956aab599d17003deedfd67b7f3eed749036aae5c0a110e9bc767463093e597e61e3bdc24078286e87e684da1c4a0514b16868da156d1122b47f01f63fad234f09460f8f36f31aca059991751ef7a553365842eae9814c263249c0093c919622a2d4f96b7f591495567888d10d0b1bb80f82",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "00ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1038,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200049a4ef296678f88e848a939e3b5e93f948e821cbe3c5ec2036d43578676212bc4997f479a2255139902f03a977e304282b06778e86ac5e3e5ea71e6fc43015974555de294d1227fa3165fcd839498dfc4a6dc73cab0313e9241a026a076823286acb95b3b4b29338448df31e9f91a969ae98449ffd871ba273442b6eec0c92193",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "3091819f599671a0d21d866eba2d540ae0a472be0252d3792bc5bb984d20a8dfaa1875e6d05264615545d2ae78b9b5acb696fdf1680a05cd382d83ecef252854",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1039,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200049e4b9145044111317c7bf1697b9428f716b022d1035b1c8781cbd7cd3527b136f0f95df1be0627721a4f6a56c004149f3400c8b0ccc142cd382d60ca250db1f0410b6975e5ea63358f5d1ea163f42ae3744e89ca9d22e24dbc4dc7a05ec4300466fb436a185807b33383484c562d5b65cd57f6f06fbff3eee8e832f816cae53d",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "339f77db58bb17afd4059555b059214889771982d96f1319c9951404c60909bc10bcec2f7dc6e56df44889c1924a304bdfa7aa19d562f49cfb3acd409100bae2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1040,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000436a0b22506a13c46fb9c8d52d112d904d6d93e260dfdd61f680d322d5ad6dc130d9df448eede20ff73ce94dbc7ca10a89a49f54c76c30e771851f0a41d6d525f18304137d791f223be088138636523bde5c136685ab6bb2bfaeacf9578410b3ba9e26083b80b36a23b7e27ed3070692995e45004d5d4bac4ed409cec36fca2ed",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "3fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1041,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004955069edb4b62dc48e0c41924f9644bf85af1801b21732a64cbfcf7cc3bfec914d0cd8bfc8fb334a94fd3488c44dfce0e5eee324da83cb903b71ed47acdd1365881ede882c978ec541f39f4b29d515ef836c77d04b512cdc45bdff505bffa39d39e2e9e3c4a6566b835c326106c7638e3d07e7dddb3331c5d37d7fdaaedfeb49",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "4000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1042,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200046ecd48b171548d97b368a778395b7484ec4c9710963a6fdb107322a936dfcfdeef2c5d1baab81e7da63a3f67a71389b8364aaddca6f65bfbe0d8887f8c5bb716811c8ffeae8cd39e3c6ac2a0d8ab9e511135c2343ab0e0fae8a07fd997926377bbd73c03088209d099cd33609a1707a3eb1ad0abdc68b9b82c659c2e51d2ecd1",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "40007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1043,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004116e13c13ad71c9f8528289553bb71f8feeb05d0b1b21dcad5b9e4c002639dd9d834f80d497eb2af643caeb28f9e82b6dbb1e2cd5a785aff8f144944b6abff188bf286aeba0457ea256e1dca332bbec2d46473519428d298002a518514d9c9eb8f0878f9afe0ff1bb2969449be2a7ebb115f6a753e5edead6d7e01514b718c36",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "7fff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1044,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200046387f14a6db2ec86d9dcf45618cede486187045a33fec85fe11cabeb93a61242682a939ba6c7821e4da3603a0ffb5e9d4f81ee9662fb3e62d865f10903c69eb55177cc263714f091511842b7715c434b8aad1b32273af574cfff44018ce78ad81e699c4403363ed5c392bd6af7d2c0a907b575893f8ead5ca9fbfb12627fb390",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1045,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004273895ea597fb330f9ef29c61679d57b494aba7a22ef54f8edbac8a8b65ad6f91b44c2a8c5f862f42fadf68b44fc7a086b12e8d4eb7a61d63f77108929f6abf42d69e73c49c1b4d8cba5fd200632391d7b33c686b2003581bc6568eae8d0d7b7fa6c69dc732494a5c16ea7605ff24bb6818a49caab161a4dd53876a646644f4d",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1046,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003045dd3ad1b6a380eff32bccd947957f3acd60d5a6df18ed9a4d676c1924123576c959ae8473de224ca262d456e8d51f6da36eaae8e3dfc0e914afdb1bc552796",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "a467eb14c46a4f70ea53aaf9e0b642acc38f2e3f264fedd84bdd082bab3b64e1c7cdaa521c9bcc66391a7b8839e62afeba3325c6d12386a4fd8fe05dc54247fd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1047,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000400000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000100000000000000000000000000000001035201526ac9ed34d51282df1a594a553bf6f07a90e3268fca9a9b3a774324b0e3ee55c351748ac18f7301bc560623ae7846f97f576cce3ca81698029c389562",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "1362fefdf9173162cae5e7a029e3774fbef0082c33b5d19959b2a4b5653acc9f615917058196f1c59c29ce054e4c2e5b035be727991e618604562e837a452fb2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1048,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff5106e912f8124a959dfc5ccbb99786d54af877fe539e664aa0362a4d417d1c4ae647ddf40c8c2cc6ac6b0f35164e24a1c64a5f230fc61e2318c9387fc1547c4c",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "60966e750bcc098107e6a66e8f5a0741e7eec2c7e76553df9569fbe0d28afd8cb1ba80a6aa8e7a84be668dc6e23463d08832b89bd092a4ae838fd228436c1415",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1049,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000400000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff000000010000000003c86f4fd8b138ac5509a4174bd4998e1b4d3d49de88d37e38dcaa74f9c42f3e37b7f7be77cf5322514a879984e44b4a3caed566ab6874b1a781292e7ef791a6",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "22694587ddf8e8c67a989ed4c1386f927897a6b9664aa4c939d74a597ec5e662f18a28c0d746a418361ccf95d8d502e0901b9465a6cf8226a4f730f166021a9d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1050,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000400003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff00000040000003aa5dbaaa057f9987e2e495a2da349f5d30b64499cf505e1a51be9a82db1b75cee639605d98f672c4295507e778b2ce16d229c5fb33da4f5a37c0c97a028fbde",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "4cbf67a6eeed2d8ba1db4f9ae2cffe04f195e4cac0015b694f228efbc4d6396dd21b75ea587426cf043f165aec505535e4b2125cdbf20f56b7e058cf971a6165",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1051,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff3e35ce50921fe7b45a53452690ea8398109e90b0985738e775ee45c5266b1385dc1998956ae6e927a062f99d3729012c14f552dc17267fccdf634d0d3eb3acf1",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "a9cd019aa08a874934c6fc28b0f34982e3d10e3a3a7ac52425c80db1d4705f0c2b733ac54baf1e56cfa6e757a5bc01f54ac39a83d42aa6e8bc5c654a60a7e56f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1052,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000400ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff1b4c363942583811e0bba8ed31540262b8be88f69b9fc4b1292fb68aebae1f9ac961fc40b85b5d09772143066d17c2259a8827691d817992c800c4a5a188e4c9",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "364e65735b2b2353b1b9ddfc4a5e233b30b0dd91e8019905bffacb6d594b32ca79dff593b6269ddc7e80278daaaba341c3c38f0634a1ae286037f1677db0a307",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1053,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200043091819f599671a0d21d866eba2d540ae0a472be0252d3792bc5bb984d20a8dfaa1875e6d05264615545d2ae78b9b5acb696fdf1680a05cd382d83ecef2528541f79f9f14141258d70e41c8a0a09cdbaf2ffac9fcf0d38f4aec24a5ec36ca792c4fb3e25dbd5c1aa1aa2de5786580f58d286683cd6fce157e180128dc0763234",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "496bab460c5a1e762dff6d9a7c7e4fd6b4973b921a60bf08192a9bf5fb1eb5ae993be0b4b6ff8c441d29f5918f6ff5738bb0ef7953f031dce49e766889ff7510",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1054,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004339f77db58bb17afd4059555b059214889771982d96f1319c9951404c60909bc10bcec2f7dc6e56df44889c1924a304bdfa7aa19d562f49cfb3acd409100bae22a19d298cd846cf9ce03a6d7d18c165b2b3c18b70514a4020dae6e3da679ae541df2fbcd20e865becb54d39c71f90284a50c2c7463a04351c4e0b01d6a077808",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "07a4f5d735a280940f6e57e6ac6a1f735ae4c4e25de6f54506c22c19e6a32fa9db5431586d4f442324eb696e5bc44f80a4a672d7b799c605450f1dd918dfa30e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1055,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200043fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff2854149062fd692eecc2302747cc08be854c64c4f9abe86c467f161496b19a52bbb5a4da84392573d7e9632a040e9dd737bc9089aedf5b0c15488e9f1b083a7a",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "6b3d87c962321bed12a867180b3dee7d4b31a0692d36e60e73648986742c42b187f96a22088b1539a8ad832cc532adc95470b47e623c65c61ff5da8ceffc100c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1056,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200044000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff80000040000004b9846887f8752427beb39fbad36f0a0170e3f225a7b0c1fc0528c9ee8f4957fb323faa8a5a329c03c0fe2b8df08209d3ad78f8b161745144b418c4e26f3b276",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "97d1caa3bb77456f5ea8142f85e5e22931b559c81947a0f2c9ce5b23980d9bde1a9f42c24b74e2266dbf265f8a6f949fc22b5d75b93bbb1c32557d9eacf7e279",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1057,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000440007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc000800009a37114d6a5c9ee64371c57bdd264e1764edda64f449cbd0ee1a72009890267fc1ae7d2ee5ddfbb5b1693bda1a0b5494c862e0ed1df03b702f2f2c206e4c52c",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "7ebb5024c36f9f249f164e6b8fcbbba3ec255d5f8e279765b9869cf97311411c359084fe6b76956efa55c1d608f013423397178617935ea110c936ffb73317be",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1058,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200047fff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff27cd77712e0db1978186e9d6feb6eaa034318fbfbab7fa3342a9e43eeea04c28ddde021916d5fcfe2d1b43743ca1ec2b5288cd553901825e4652cf4cf524bcb4",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "380986a2fbf3d5c6d38ac5ea191f7ef4681f068b475b61bfd909a6c3a30c731c30cfe9ac0e7dda521e574fbb6caf9dc52eb3ebe3106a457f5bda9698d252d827",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1059,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff026c17238034c8372217a8cd9a234ecb7debdec5659b7e3f0c6e70ba226824f56acce025ae65da8b0aebc2efe2ef73dd826cea151b201b2f5b4f7623f2fbe332",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "a502a7d0ee2077a3d4b484b02e2ed2d0d132ebd48c2c7d99f1461e1b4428ce97a317e26ef90462e70436789cbcc27986d644e7950650612d9fa2be50d07ea58f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1060,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f212780ae4d2fad1163e2a513d72ad6e3c2211f8079ccbddeb9b1e956b2ee36173abe84464b0c78dca8db21f6964e9a1398a5a0f6e1e717ddf4eac517032879266",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "7bd3f02e85464163815804eb8f5cdf3cea258b520ef564d813ee4102a39e93f604d1c537bb93ac7b9d0fffcf89177f4586ea690bfe93a9632c645038a47e82f7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1061,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "3",
+          "shared" : "47ed915ca64aac752724aa06b311d171dc14b9c55421ff61c6413b3fc7313ecda03c0addd0d6dbdacd5ea0619054614610d07cd78f9ed4d6df024c781af3efae",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1062,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "781a3bd7f99ae145698783495f1f4aac5189d54657c34f76c8847cd5177d6a08a2c837501351e098ba570a3f300cca47f2407ff9172b2954aef46fdbec8429b7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1063,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "33485176aa26cfd17a66e1da3c3973f468bc32a1528a67f9d33b7ca29bfd6fa536bac3112bb8f2c2ea198f2f7df5a56dda570931b7852b3224c403a1d08f3dc6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1064,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "9c4971c89a22da14abac1304b6228c5d647f8dd8a11b1348c419f430733e849957fb037865efa85f9585ed0ffe8c6ea2c7c39ac8bbeedc84717f8a6be9603f65",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1065,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "58be414307cd761143c49224f30ac475e6b8fdbf43be3f130b71ff8d89af5d3b91342898388d1628f56322d327f5f075ca3a766d94213f8ff67076caa253937d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1066,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddadcb58796829ca90069",
+          "shared" : "2e03302f2944b3bc902e5fe6b7d1ca3991bf9fd80bafa8df4d4e85a98f33d956280ba0078178b54ed1aa03571ffac2d476c7246ab68ebb9434fac564455f39b8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1067,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb57796829ca90069",
+          "shared" : "0dcd1e563a94fd8edc83e47ebbc9296d1c27d1aff37b02512c0337ca672ff84ac73a618fa54f2b963182ba141ae596c56f83d0ecb4deb78055cc8ea476d09bfd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1068,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb57f96829ca90069",
+          "shared" : "aa9ac6d3343fb7aad7128855a22cb25f6cd9b46ea02f2a15c7cdecdc681f3ca38f1860290971852de94cc68810d41d14607f558e3858394cef8b166abee023a2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1069,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796819ca90069",
+          "shared" : "5f155d9d14680aa5efb4ed59f670f6efc59c15bb03b59b3a2cf1a4a1546b7e35bfd99194cfe72e79216c1daebdcd247e934eab457ca90d4d2c38b64517e0cce0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1070,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9003b",
+          "shared" : "194871645bbfc309eba92c5613ca7c6aa566fdab45635f656148ec7122d71c825f36852f52722ea949c2572dbb6b894a21f96a05c9bee0df6c6b4faa3197079a",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1071,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9005b",
+          "shared" : "3a6e57858d4e61c7ed2cb93c124221210293a345b47f7644910543ac03117f48b0343ddebd2cf9925e3dc5e1ea590739ed2c2372e1146f84fd262ac7d8eebacd",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1072,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90063",
+          "shared" : "8e0a186a51eae08a86fdd476bcfd961d02be74966ce3c2d937c808db518f2ddc4760bfc924af72f85eb188ebc70edde6d12f402735f58b9006f8b8e283ef9fbe",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1073,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90066",
+          "shared" : "47ed915ca64aac752724aa06b311d171dc14b9c55421ff61c6413b3fc7313ecda03c0addd0d6dbdacd5ea0619054614610d07cd78f9ed4d6df024c781af3efae",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1074,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042ee402777200a1c9e7eceb61feb070af49429f9240d7c0bab9b2f01c5ee145683df47cbe852ff6f99198f6fdfaef1925eb96bd25e03d6d70f709eb1922308acc99a3fbc1e982db7a7b3bbf7827ea70912ee677bb0ba70bfabec38d4b993af165c40727680fe79ad0fbb55d1e9568d978b11f77cc4e72aa7ca5c391034078b8bd",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90067",
+          "shared" : "300b1d80d9dc5587076b7d850ccd00cf8961f389c4ded60bf910d98f196f67c3839d2197101607612b335871a818d50d8f4bb6163cc839cf41af0b742c7254f4",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1075,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1076,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1077,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1078,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1079,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1080,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1081,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1082,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1083,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1084,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1085,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1086,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1087,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1088,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1089,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1090,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1091,
+          "comment" : "",
+          "public" : "3019301406072a8648ce3d020106092b240303020801010d030100",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1092,
+          "comment" : "public point not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5695",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1093,
+          "comment" : "public point = (0,0)",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1094,
+          "comment" : "order = -8948962207650232551656602815159153422162609644098354511344597187200057010413418528378981730643524959857451398370029280583094215613882043973354392115544169",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f7230481810481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad808920241ff5522624724163b74c02b1951cc3603f834cf724c4c362df1299c63358fccf78faac1a3beb356d9e6be799ee68053efb8e24e2c7ef7a225224a78697d6356ff970201010381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1095,
+          "comment" : "order = 0",
+          "public" : "308201f83082016f06072a8648ce3d020130820162020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f7230481810481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad808920201000201010381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1096,
+          "comment" : "order = 1",
+          "public" : "308201f83082016f06072a8648ce3d020130820162020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f7230481810481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad808920201010201010381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1097,
+          "comment" : "order = 2083592630841357761914050861997332755048435564175796348448981807380927961881602771668457829077617488768289656930144243078095422967775269405300354",
+          "public" : "30820234308201ab06072a8648ce3d02013082019e020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f7230481810481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892023d00aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796820201010381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1098,
+          "comment" : "generator = (0,0)",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f723048181040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900690201010381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1099,
+          "comment" : "generator not on curve",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f7230481810481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80894024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900690201010381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1100,
+          "comment" : "cofactor = -1",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f7230481810481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900690201ff0381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1101,
+          "comment" : "cofactor = 0",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f7230481810481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900690201000381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1102,
+          "comment" : "cofactor = 2",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f7230481810481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900690201020381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1103,
+          "comment" : "cofactor = 8948962207650232551656602815159153422162609644098354511344597187200057010413418528378981730643524959857451398370029280583094215613882043973354392115544169",
+          "public" : "30820278308201ef06072a8648ce3d0201308201e2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f7230481810481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900690381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1104,
+          "comment" : "cofactor = None",
+          "public" : "30820235308201ac06072a8648ce3d02013082019f020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f7230481810481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900690381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1105,
+          "comment" : "modified prime",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100a9414de6e5ef176ff64384b554271ef34fde1d646094323012668174776efe4e23c39f2773860bb0bb7ad41d6cc5deef888974b529de7d1168d2a3cf6f6f4dcd30818404407830a3318b603b89e2327145ac234cc594cbdd8d3df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94ca04403df91610a83441caea9863bc2ded5d5aa8253aa10a2ef1c98b9ac8b57f1117a72bf2c7b9e7c1ac4d77fc94cadc083e67984050b75ebae5dd2809bd638016f723048181040000000000000000000000000000000000000000001ecaba5abfa4220000000000000000000000000000000000000000000000000000000000000000000000d61096c9018545277fa62c0af905d4d2e2500ecb6c7306b6508079532c53907b58e3a7ab89660147c556b10a8ad430325d7484da765aa00b8e007a343c233714f0024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006902010103818200040000000000000000000000000000000000000000001ecaba5abfa4220000000000000000000000000000000000000000000000000000000000000000000000d61096c9018545277fa62c0af905d4d2e2500ecb6c7306b6508079532c53907b58e3a7ab89660147c556b10a8ad430325d7484da765aa00b8e007a343c233714f0",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "3917638d8a0c6029dd5d7e7fdd5b798805f2544291277af5f5bcc84d4d665e347bf504a505ade7f365019e6f3aaa79c20a0956e40c8ac472a0cdc198bc99b6c1",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1106,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1107,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1108,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1109,
+          "comment" : "a = 0",
+          "public" : "308201f83082016f06072a8648ce3d020130820162020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f33045040100044044a9dfba839bd5e0edb3dbace1c8f201409f6d505e411f290d8af054fb492a0d0d246c63b2fad54f963f9ae5b3540ccf3417106652f29ce45cd6e41851d7109504818104933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900690201010381820004933acf9f74c73324a719b02f56269f56463a3623a33f2d3001a33ee1ce064e55466073e7535a83dbd4772c3030dab122338daaef4e0aeca1f27f6b228b7fd88a5cd4c67a1a177965f5fce7d352afdb1cb72cc628b7069b6ad1bbab8c14ff0f7792a2b6687bb71ca847405e31c9dcdee5f4cd3d91a2f4f8faf169584a7e3c5693",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "1a1ac0324ecc13de106b7024dbc54847953bf91bdf5d9b7a4a85507adafbd802ec7fc27518b4bd336a6ca387c17359084f5e15d04511f30dde0ce5cee9960d96",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1110,
+          "comment" : "public key of order 3",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404405d0d64b0c6d17026a9588aeb3194324ed157cd6fa20cbd7f22d34d7460fa3e6b21e84d6de1f1ac64cd9e72e524fc9c9f549cb7164b4be522c224fb2c813cd2a204403479187c1248b963585254a8fbf3a14e20091438905aa4eda975cd6b457c17545af0427f3243a3d55eff42b80ce2e7de22ac06757c0f5d8d85234d514f465a520481810472fdbb51be9fa16b1d0cdd54630603d8859ebcd888ad799eb74c7f08418b149105fa5025c38a0aea05a62cb1d9241912870544370ca21f371b936df90cb97cbd0ee503ea130edea67c8eedab601e4d4fe4afb144d1fe55ead248924a79847443ea447e3dc444bf189b4c297e824111f8800a4334c9d64c20d69173da075d4d47024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069020101038182000472fdbb51be9fa16b1d0cdd54630603d8859ebcd888ad799eb74c7f08418b149105fa5025c38a0aea05a62cb1d9241912870544370ca21f371b936df90cb97cbd9bf899cec8dae5e4c345f902d3abaeb7e680dc6ee1cb7c24041b0a7ff6ae942d93091cc2d781a92a138177ac64626eeda877bbfa63ac7a645218ec7c50dcfbac",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "9ae83c0dc4043e24becb55e8c1acaec1945841dd95139bbc6ba42ceac20b79b6e6ecdd0952e260bffc0b65fb8100082fec32a42dff3761ef87e5528ddefc82b3",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1111,
+          "comment" : "public key on isomorphic curve brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004552e0f403a37a53cab048d6c6616973fb80ccbebb788a5d743f6bd48b27e819100acd53c86a95420e52cfa18d958bcb7844f05e40824b5eb38c827456e9b410c6787bafb0cf873f535c82381c81bbea8e7291b68f93e58f5657af40333aefc23cdacaedff7b3eefd8cba644bb72e9746c3bacaec3ff14a950dc6e1ffb03789ab",
+          "private" : "11ca87ee5e9aee914f1ec5479bdb6b0a6ab1fdf38ec8df537e231596762f9428be3194f899890076e78366affdd192fa9e4d44c92066c31c25dab04e0c3fbe68",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "IsomorphicPublicKey",
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1112,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004f1ed1cb1ceb7eeef8f7044b8f3bf488604a1a226a697a202b9fe094b4ef15b2f33ddb17fa5447d65e2783f72821ea01268235d58e18bd14e",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1113,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004fa60a443999e02e693e83e198e6ae8d77c6d5b0fad9269ddcfbcf3fd7454ab551fcd8ec3145c902ac6f57112b1fe5415c0b974fc9cb15105c174f6c26503bb5d",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1114,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004aef982cb3c13ef417bbecfe65d4ac97c8b081f47311069fb63629e45440045c1cbb26cbc4e2c7139511b5cae95a9f79f0ee8ebffdd68e215f602ee98bd0d0acc180b7061e20f213f043915a246b492c214168bdaf8ff95b0ff68f9e3e7f43657",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1115,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040078f1bac16e586a15d828e92a2f35c0690f616a886223b70657639d130a04e58787f2ebb3eb880ea2f396e67e353e326822745959dbe51ee4f80562044c967e33b40018895b6e1370974595784c19b17f8208b900432940680d16367f05f0c1f5ffa607037473461c0a0651884dd35a58c9735d0bb6328c4b5b9d0ec792f0f6f8bc8769",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1116,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200046a4213777e31119f578b3e8be06ebf62502d7d10dfe5bf9341dea64525e0978f12cbbd6f17e4e932b4446c48bd3f1189a55b212d89c5194f689f297e3a27e8a6",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1117,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004b160ff66fc93480bef16ebb4a00b75f3805e884ea875dcfcc73e32a1d764c4dad373d89648afe449018ef5524633459bee47ff9529c5ae41",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1118,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004670c87dc73c6bd2291150ca80eb914924286ada22e50f5fe41079ab3f483c7271cf84db06d98a7e4382b528dfea4335a1bb4ada1f61c5030bdc479a2441dfb28",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1119,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200045f1de6cf461eecea01567345bdcec2ae56dd607ddd15c26b4ec095ca2afb17b1ffbdf61bd47010d16a92595554d297378212bbfaafb62c179960a4db69a7d3aaed57ba9edbcae9b05e3b905fa5eafff1",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1120,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004408d98134c7ff4519187d68da6cb6c7b5d257b98d1240985404d497682656a60e2d4abda818d20d2524af5357700aeff6ecc536169279a38c53bd5dbe49c240eb30cba040568b09ee65be595c25a090dd94ddc06b441f78de9e290fae01fbb11",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1121,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00049bd1aff3c1d564b390e8f9575b123cf2c47151fc1cf534e4c24c254382531d828902af3eaf1383410ffed334caa12697265024b764a8cc40",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1122,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004683cf7c313c9503ed4dab6b6a25463c5d682aac16ee5b33785321e77304201774c22f4703e5cac4891c56c1d8ac3d535f192c041ebfa78979ebbddeb87780607",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1123,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200040f31598d0b84972ae50be531e0ecf11b721b76d8e2843940de0397d7fffb62dc382ddce29ec2ce7baaed79f9144811e1ca8194c8046458fe3956550885315dfe0e29efd283be076ddc81e1a857705804",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1124,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c03620004483dae8e878eb44c217e0ba373ead244428398d83bd0ba1473747887c1c5a5de6e7d42b9f6fab658277f4046ebb6c6b43aa548690bbde6a2d77ec48c81da44183f7631c9ffbdead397d9ff6cf8ece2c21a2f989cede73bec5f461cbbbafd01b4",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1125,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200041bddcd407461d821e5879eb6b27736dc1112c3c9177fc3cf1a1bbd39654514d7c82950e9f674a4ce4c7fc9f9410c5ed9b194c926c1fb0c178940e46dc4fcf12c222d62b9c3f76ba459f8eae72d5b2c8df5a2cecf34dcc66108538a0f6aedd8e2e9c51515a290f244e3e40e352a6e86a58af41cd89f7dee16199bc84d2051c43e",
+          "private" : "215f898ba482ba768a4aa8a5a1d01862c0f184ab92cedd149281f722bd03ffe6aacf33ed8810f98c7575f99fb35548f93b3a828dcda3dae7d91b913c40a94e2",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1126,
+          "comment" : "invalid public key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010d034200022564ece76989d82265ea79fe5b41b2dfad2268e27df8ee7260d937435da3777a5106557dfbdb64d106c2ad46e64dc63e0eaa22e81a03d25b870578d86b0f1432",
+          "private" : "57087c2e66e2221d0618077207ced3fe31627f83afe4ea3d3999a26d9737fa8ace4f50b968930cae8bbf55b422335f22d85a23582b076c2836e060cd1157cffa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        }
+      ]
+    },
+    {
+      "curve" : "brainpoolP224t1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1127,
+          "comment" : "normal case",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004b4780ee66aea435e0a2be8010dba55dca1d2fe27a90c5b21632dc3bdd2984ecd46d71d2115aab7011aa7037523b82f396bf431513a3169b6",
+          "private" : "68c8bbaebef70f1e59ecf3681b2d0c7db8dfd51e2392d6ffb233bf01",
+          "shared" : "6b429db09a4d7a2b336c2c93559c64fd879e73b47ba0cb76b1711b53",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1128,
+          "comment" : "compressed public key",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010106031e0002b4780ee66aea435e0a2be8010dba55dca1d2fe27a90c5b21632dc3bd",
+          "private" : "68c8bbaebef70f1e59ecf3681b2d0c7db8dfd51e2392d6ffb233bf01",
+          "shared" : "6b429db09a4d7a2b336c2c93559c64fd879e73b47ba0cb76b1711b53",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1129,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000412a38de91c32593654a56e4d28dd5f63c5dcd17d630d7030a449fd1c62216cdbd7da43563e1374659b65701a02b9e07d3aee2897801f6eda",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "00000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1130,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00041c255087219f1c2e09e27f397ef897620cf59626f1e76a46a3130f19d578093b49a63aeebc97e79d6ca033155ce9af959d6eb773c144f413",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "00000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1131,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000450120a32457e46bbbcd4eb46d6cbe1c1c49855ad3dc8f4c4da4a55767d959b19f69d72bbf0a55c554f3c2895c0dcc5928759871c604fe176",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "000000000000000000000000ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1132,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004286feb078f3756c06e5315d9e4585b184906071f57d74aebf3e8a431c3d481267687219aa5f3753bc9b2082147a3e6281e34bf39ab8ce35d",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "00000000000000ffffffffffffff00000000000000ffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1133,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00045a06cb7b6d88a21cf77670883c62493f1b1381e1841008ca4bf6f92c24d12e6fedc361aa112180298089cb69d0ea9fe061bec51b51dfc5da",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "00000000ffffffffffffffff00000000000000010000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1134,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004156a91128fedd089ab4741255400b7bb2cf19fb7243e4cface76ddd3463614f4dd54eb1d31ce716f1beeef41d91e6a794a477385ddf402f2",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1135,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00047e5942baf404f1aa162be96709c28394f5f03564ea1bca65af77f7e5af933701c2fc89d66dcbf28913c7f5127a8d68d402a73dc0515bcd82",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "0003fffffff00000003fffffff00000003fffffff000000040000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1136,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004142a4bfad553717dfb8b3f5d7ceb70f185ef014468a075daecdd28fc2204e689e9be5a7f0ca0164a5550bdb9ea241beb5abd55154a53ef2b",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "01fffffffc00000007fffffff00000001fffffffc00000007fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1137,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00047a4d10fe316280605f74d4a85ed6e62c9d1d2c5b4e17c19dfed436b262ab7d69f64fe80fc78953788856b6056990bbe72ca2d3f12d8ea17a",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "29b050418338f32cca7d39e0edab18a31dbf0eff526d468ed8ad1e6f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1138,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000444e0eed256689325509dd26421a2ac024d4ef29f9f750c429b2b0619728b57d68c69ca4f91c1f0ef509ea47bf6240ee2901e63ecb1bf573c",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "30975f626ebd46b09e413513a897f6b74de5707bbbeb7a3d8c60d0b9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1139,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000424b34a522642654d742602db827098842b082126d7a8b91c5fb3f2647bc090db723ee291ee1b2de806636a72962a21552a69b79a1137de29",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "41478d4c207e3fe1aef7fbcc34223f39b86f634d978921ecb40a5136",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1140,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004adaa9b4a60db8cb1b9f307fbd1987de52057bf8952ebf4555fd1245275a6ee7623866f7684ed882057d269753a0cb621f01bfe0a339134b3",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "7ffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1141,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004411742b6193a7d605d03ec130b7492266c8affc083a9bebababde008172b1aa4d711dcc7a44126acdd6af39a9b8de30f89f72bf6bce30c5e",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "7fff0000003ffffff0000003ffffff0000003ffffff0000004000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1142,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004c1601f16b582d5ee402aceac077b00644e07d4c27ad819a45c833704acc8473f1c03887a7715d891d9afb6483d66abfab4fc805f4e9d93fd",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "7ffff0000007fffffe000000ffffffc000001ffffff8000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1143,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000414438a1c0aa6d6322a9c97525203e83224d09c0b6ed7f9edffc87566692277105d2451c0f34fb40db3ae783149075ffde715e7e56a20c56c",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "7fffffff00000000ffffffff00000000ffffffff0000000100000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1144,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004c282016c4120fa64b26a6a95d42a65d85028a8221d1b58b53b53cc26aff7f36536c67b2bf6b7282311039b46a5ef688fc007267d342f726f",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1145,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004231ce0637889a0ce60582070c2bb2669ef188fb3dc4fa5130e16b8a9bad1ca30f0f3cc6f6aaba7d27ff474215621bdc21802b0ffd7a2178c",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1146,
+          "comment" : "edge case for shared secret",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004202f7ea2e5131a84c033fc2c08d3497e02c8f93f9fbac081f178e39c30df87d46a8bd61035259610869c1cc24a2082f894e183ffa9fe2aa0",
+          "private" : "133ba3cdfdd2b6f8e12c4efb844dd1ba60212b3c4afe6476f1efa12c",
+          "shared" : "d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1147,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000400000000000000000000000000000000000000000000000000000001633b4bd954cddaeffefa7a75e81daac78682fc46c2d7ee9648d32ab3",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "91d228a11d5eff2ccc0940265bb5ef25eebebd50efa2dd1a29508a50",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1148,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00040000000000000000000000000000000000000000000000000000000251b3e8984fc0e76d7c0830af455e3a709f5ee363708e92942adbb1e4",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "0047e1811a2371f1521378f0f16d4307077e662fbaa83a3f96fcf5b0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1149,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004000000000000000000000000ffffffffffffffffffffffffffffffff6ae9ab22a7a3d4f4bcd27fad3c1b44d858e75081a9ca61f620719994",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "608052a73a085e0d077002d9894017a75c63644714a8bcae15002174",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1150,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000400000000000000ffffffffffffff00000000000000ffffffffffffff217c3568a965f2a55cc901e357a1575628779371b5ac38f589d9e3e1",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "ae79a814575b0cda006ff1f2f617ff48e99d68886b2beb394dac432e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1151,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000400000000ffffffffffffffff000000000000000100000000000000005b21ef6411409443e83b79d201492eff43eb8e58f2dab71a15facc55",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "09e3e169b2ff1dd5e6a6c0e7da70cc9b781d4ad742cda7388ee017ad",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1152,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000145799e835a004c3cf2d3918ce3f4771561d08dbcc7d73b452456ca7",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "9c33c2f08f8b10ade78af8b7ed021b815cebef08ab0506d73892fbb9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1153,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00040003fffffff00000003fffffff00000003fffffff0000000400000001ee03a1b1a6fc66dba929459e5226cc4b9b9641c2fe0b72f1dca8ac6",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "0c34886d6c6de77dd6d37ca70d4f295a371fb527c853248ba4b0e9be",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1154,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000401fffffffc00000007fffffff00000001fffffffc00000007fffffff6a2f162b62b880074a87c37aa88e4dd07c260e3d1925602b42654311",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "8001e5763300e1741a6a562eca419050372b0aa97d783a4cd606f3e6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1155,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000429b050418338f32cca7d39e0edab18a31dbf0eff526d468ed8ad1e6f63d4999155f63c949b853cac10b6929a3bbaa194998a63018bf14ec7",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "5361799e8d0dfdb1a5a54e553b08ff8f9c7e8a1d71f7d54851c6458f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1156,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000430975f626ebd46b09e413513a897f6b74de5707bbbeb7a3d8c60d0b956b6f9b1ff1785344b26b499507f192c57b77ea6cadf6b6b21b9fa4c",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "abd806eaa7939b6dd8908b6f2e6a48929d85961946d89d01ab055f6e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1157,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000441478d4c207e3fe1aef7fbcc34223f39b86f634d978921ecb40a5136327b1e521484a6fc30033de82293e7169c4290d8ff47b7d44b40aa94",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "0d1b9488c7b9976b2e2ca612204b6e2abcc6842c5b44da762c116646",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1158,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00047ffc0007fff0001fffc0007fff0001fffc0007fff0001fffc000800112be7edba65ee14a56c2494f0b0f5018cd6f997919296655da4297b2",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "464293a02d78bb0249547041186ab4a02f77d23adcaef3325c517623",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1159,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00047fff0000003ffffff0000003ffffff0000003ffffff000000400000269b3c411885503c934b416b7e81b54c8e88ea3482cfff0e9bb26e8fb",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "62ec4ba9e8bc1b56085da67e481836f1c4cde0c4f5694199f452a665",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1160,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00047ffff0000007fffffe000000ffffffc000001ffffff8000003ffffff27a1297c7a38d1b4e7ee21d49e9f43646433e221f8541e261d9695be",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "54d239a3d251130d83c812d0973777fecbad5c12f26fff2d6d65a2ce",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1161,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00047fffffff00000000ffffffff00000000ffffffff00000001000000003747d1fe6bf97cc470bd311736644ebffa8e33def722d572906be4d0",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "bef2f0756be88362991c5b9420f5ed09f075bf1540a059b85a621532",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1162,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00047fffffffffffffffffffffffffffffffffffffffffffffffffffffff339e3bfd7b12918722a6f7faf38f28703a635757a992b393e52052e9",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "55af6868eeeadf94c06cf9407b3b5f5d2b715f474d518f670c3cb9af",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1163,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fd633b4bd954cddaeffefa7a75e81daac78682fc46c2d7ee9648d32ab3",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "97379b47cdb08a1deec67cf2a32bfb4b7f7c95c2a24c1f4eb002aef8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1164,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe51b3e8984fc0e76d7c0830af455e3a709f5ee363708e92942adbb1e4",
+          "private" : "0ae3ad02b042445f5edd485a9370286498b83b82ca6705fb09425dd35",
+          "shared" : "499ea1f831f2b2a29ae45519b2fa3213d90e7c3905fd95bb8133cfa3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1165,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00041b801b9b969daaddbc40876ef79201c5dd8e480f003a043e818862c26709e1b2f6d8826ae4257a5db46b78848091c56a54577248185936b1",
+          "private" : "3",
+          "shared" : "80fc3bbf6ab2a45febab5003a46ce32a8998e776f1caa51e274a059b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1166,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00041b801b9b969daaddbc40876ef79201c5dd8e480f003a043e818862c26709e1b2f6d8826ae4257a5db46b78848091c56a54577248185936b1",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "3f5d8afa32528b63dbfa759e9d5ed37a8fb87f98d856f5e0bb3f67a7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1167,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00041b801b9b969daaddbc40876ef79201c5dd8e480f003a043e818862c26709e1b2f6d8826ae4257a5db46b78848091c56a54577248185936b1",
+          "private" : "1000000000000000000000000000000000000000000000000000000",
+          "shared" : "1d9c4d7df936eb5502ee61d68526877f04adb830747e6f3475ae54ba",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1168,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00041b801b9b969daaddbc40876ef79201c5dd8e480f003a043e818862c26709e1b2f6d8826ae4257a5db46b78848091c56a54577248185936b1",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "6a6085f73272becdd7858ca7b80daed56fe39f319dfcaa559ce647a9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1169,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00041b801b9b969daaddbc40876ef79201c5dd8e480f003a043e818862c26709e1b2f6d8826ae4257a5db46b78848091c56a54577248185936b1",
+          "private" : "080000000000000000000000000000000000000000000000000000000",
+          "shared" : "18af3c83b27fe6a1e5f56be3ed256b9f740dcbe41bac7f148f2692ad",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1170,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00041b801b9b969daaddbc40876ef79201c5dd8e480f003a043e818862c26709e1b2f6d8826ae4257a5db46b78848091c56a54577248185936b1",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4a6ddebca3a5a7939f",
+          "shared" : "2fd7f53b0ed87d438cfb45c9eb8d5c343c6a309fcfdb9686d6a0f97e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1171,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00041b801b9b969daaddbc40876ef79201c5dd8e480f003a043e818862c26709e1b2f6d8826ae4257a5db46b78848091c56a54577248185936b1",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6dcebca3a5a7939f",
+          "shared" : "c5c948724fce4e94ad8682705b063138fe18cc0e7f33204f493a3f4a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1172,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00041b801b9b969daaddbc40876ef79201c5dd8e480f003a043e818862c26709e1b2f6d8826ae4257a5db46b78848091c56a54577248185936b1",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6dd6bca3a5a7939f",
+          "shared" : "5b0230dd604007c71c0e416fa24a7c0192e0ec974efdfac208c115dc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1173,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00041b801b9b969daaddbc40876ef79201c5dd8e480f003a043e818862c26709e1b2f6d8826ae4257a5db46b78848091c56a54577248185936b1",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6ddebca2a5a7939f",
+          "shared" : "06616250fd3f7a3abe31b83659b21281ad93d6e168922fc2157b4be4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1174,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00041b801b9b969daaddbc40876ef79201c5dd8e480f003a043e818862c26709e1b2f6d8826ae4257a5db46b78848091c56a54577248185936b1",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a792dd",
+          "shared" : "97ded4c2e06b5a13c9109be3fa42dc2ca93a306fdf9e85ac4bb02e22",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1175,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00041b801b9b969daaddbc40876ef79201c5dd8e480f003a043e818862c26709e1b2f6d8826ae4257a5db46b78848091c56a54577248185936b1",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7935d",
+          "shared" : "686798270c7e188e6ab3e28a10754f965d5d02f33d30d8faf38155f4",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1176,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00041b801b9b969daaddbc40876ef79201c5dd8e480f003a043e818862c26709e1b2f6d8826ae4257a5db46b78848091c56a54577248185936b1",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939c",
+          "shared" : "80fc3bbf6ab2a45febab5003a46ce32a8998e776f1caa51e274a059b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1177,
+          "comment" : "edge case private key",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00041b801b9b969daaddbc40876ef79201c5dd8e480f003a043e818862c26709e1b2f6d8826ae4257a5db46b78848091c56a54577248185936b1",
+          "private" : "0d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939d",
+          "shared" : "d64f68debaf751d63da1883668822031c69e913cc53b969e5fbae845",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1178,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1179,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1180,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000400000000000000000000000000000000000000000000000000000000d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1181,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000400000000000000000000000000000000000000000000000000000000d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1182,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00040000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1183,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00040000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000001",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1184,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000400000000000000000000000000000000000000000000000000000001d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1185,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000400000000000000000000000000000000000000000000000000000001d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1186,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe00000000000000000000000000000000000000000000000000000000",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1187,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe00000000000000000000000000000000000000000000000000000001",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1188,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fed7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1189,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fed7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1190,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff00000000000000000000000000000000000000000000000000000000",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1191,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff00000000000000000000000000000000000000000000000000000001",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1192,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ffd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1193,
+          "comment" : "point is not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ffd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1194,
+          "comment" : "",
+          "public" : "3019301406072a8648ce3d020106092b2403030208010106030100",
+          "private" : "0c7e1dc95d8877ff3745ed3af688dc63b22cdc34d5b213c6a5a5e3244",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1195,
+          "comment" : "public point not on curve",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00043f6a6d7ef968ed14f22fb5c445d0a198b090555fc4b8440ae0a004b090ead0c4389326a4417f2d3248db535d57e039c045ea1958c4840680",
+          "private" : "1019babf6cb683112dc1bff42f1e0b9242b4b3d3ceedc38b1a0de2fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1196,
+          "comment" : "public point = (0,0)",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a00040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "1019babf6cb683112dc1bff42f1e0b9242b4b3d3ceedc38b1a0de2fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1197,
+          "comment" : "order = -22721622932454352787552537995910923612567546342330757191396560966559",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041cd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fc041c4b337d934104cd7bef271bf60ced1ed20da14c08b3bb64f18a60888d0439046ab1e344ce25ff3896424e7ffe14762ecb49f8928ac0c76029b4d5800374e9f5143e568cd23f3f4d7c0d4b1e41c8cc0d1c6abd5f1a46db4c021dff283ecb55d9bc9979d5e7cfda8a2f04672ee943b49221435c5a586c61020101033a00043f6a6d7ef968ed14f22fb5c445d0a198b090555fc4b8440ae0a004b090ead0c4389326a4417f2d3248db535d57e039c045ea1958c484067e",
+          "private" : "1019babf6cb683112dc1bff42f1e0b9242b4b3d3ceedc38b1a0de2fc",
+          "shared" : "72d7ec663f059dda71360e49296cae4f204d4928e6204b400e2a0b74",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1198,
+          "comment" : "order = 0",
+          "public" : "3081f73081b806072a8648ce3d02013081ac020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041cd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fc041c4b337d934104cd7bef271bf60ced1ed20da14c08b3bb64f18a60888d0439046ab1e344ce25ff3896424e7ffe14762ecb49f8928ac0c76029b4d5800374e9f5143e568cd23f3f4d7c0d4b1e41c8cc0d1c6abd5f1a46db4c020100020101033a00043f6a6d7ef968ed14f22fb5c445d0a198b090555fc4b8440ae0a004b090ead0c4389326a4417f2d3248db535d57e039c045ea1958c484067e",
+          "private" : "1019babf6cb683112dc1bff42f1e0b9242b4b3d3ceedc38b1a0de2fc",
+          "shared" : "72d7ec663f059dda71360e49296cae4f204d4928e6204b400e2a0b74",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1199,
+          "comment" : "order = 1",
+          "public" : "3081f73081b806072a8648ce3d02013081ac020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041cd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fc041c4b337d934104cd7bef271bf60ced1ed20da14c08b3bb64f18a60888d0439046ab1e344ce25ff3896424e7ffe14762ecb49f8928ac0c76029b4d5800374e9f5143e568cd23f3f4d7c0d4b1e41c8cc0d1c6abd5f1a46db4c020101020101033a00043f6a6d7ef968ed14f22fb5c445d0a198b090555fc4b8440ae0a004b090ead0c4389326a4417f2d3248db535d57e039c045ea1958c484067e",
+          "private" : "1019babf6cb683112dc1bff42f1e0b9242b4b3d3ceedc38b1a0de2fc",
+          "shared" : "72d7ec663f059dda71360e49296cae4f204d4928e6204b400e2a0b74",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1200,
+          "comment" : "order = 5290290092223871682666367384584369978999613398297400491171",
+          "public" : "3082010f3081d006072a8648ce3d02013081c4020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041cd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fc041c4b337d934104cd7bef271bf60ced1ed20da14c08b3bb64f18a60888d0439046ab1e344ce25ff3896424e7ffe14762ecb49f8928ac0c76029b4d5800374e9f5143e568cd23f3f4d7c0d4b1e41c8cc0d1c6abd5f1a46db4c021900d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3020101033a00043f6a6d7ef968ed14f22fb5c445d0a198b090555fc4b8440ae0a004b090ead0c4389326a4417f2d3248db535d57e039c045ea1958c484067e",
+          "private" : "1019babf6cb683112dc1bff42f1e0b9242b4b3d3ceedc38b1a0de2fc",
+          "shared" : "72d7ec663f059dda71360e49296cae4f204d4928e6204b400e2a0b74",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1201,
+          "comment" : "generator = (0,0)",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041cd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fc041c4b337d934104cd7bef271bf60ced1ed20da14c08b3bb64f18a60888d0439040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020101033a00043f6a6d7ef968ed14f22fb5c445d0a198b090555fc4b8440ae0a004b090ead0c4389326a4417f2d3248db535d57e039c045ea1958c484067e",
+          "private" : "1019babf6cb683112dc1bff42f1e0b9242b4b3d3ceedc38b1a0de2fc",
+          "shared" : "72d7ec663f059dda71360e49296cae4f204d4928e6204b400e2a0b74",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1202,
+          "comment" : "generator not on curve",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041cd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fc041c4b337d934104cd7bef271bf60ced1ed20da14c08b3bb64f18a60888d0439046ab1e344ce25ff3896424e7ffe14762ecb49f8928ac0c76029b4d5800374e9f5143e568cd23f3f4d7c0d4b1e41c8cc0d1c6abd5f1a46db4e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020101033a00043f6a6d7ef968ed14f22fb5c445d0a198b090555fc4b8440ae0a004b090ead0c4389326a4417f2d3248db535d57e039c045ea1958c484067e",
+          "private" : "1019babf6cb683112dc1bff42f1e0b9242b4b3d3ceedc38b1a0de2fc",
+          "shared" : "72d7ec663f059dda71360e49296cae4f204d4928e6204b400e2a0b74",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1203,
+          "comment" : "cofactor = -1",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041cd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fc041c4b337d934104cd7bef271bf60ced1ed20da14c08b3bb64f18a60888d0439046ab1e344ce25ff3896424e7ffe14762ecb49f8928ac0c76029b4d5800374e9f5143e568cd23f3f4d7c0d4b1e41c8cc0d1c6abd5f1a46db4c021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f0201ff033a00043f6a6d7ef968ed14f22fb5c445d0a198b090555fc4b8440ae0a004b090ead0c4389326a4417f2d3248db535d57e039c045ea1958c484067e",
+          "private" : "1019babf6cb683112dc1bff42f1e0b9242b4b3d3ceedc38b1a0de2fc",
+          "shared" : "72d7ec663f059dda71360e49296cae4f204d4928e6204b400e2a0b74",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1204,
+          "comment" : "cofactor = 0",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041cd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fc041c4b337d934104cd7bef271bf60ced1ed20da14c08b3bb64f18a60888d0439046ab1e344ce25ff3896424e7ffe14762ecb49f8928ac0c76029b4d5800374e9f5143e568cd23f3f4d7c0d4b1e41c8cc0d1c6abd5f1a46db4c021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020100033a00043f6a6d7ef968ed14f22fb5c445d0a198b090555fc4b8440ae0a004b090ead0c4389326a4417f2d3248db535d57e039c045ea1958c484067e",
+          "private" : "1019babf6cb683112dc1bff42f1e0b9242b4b3d3ceedc38b1a0de2fc",
+          "shared" : "72d7ec663f059dda71360e49296cae4f204d4928e6204b400e2a0b74",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1205,
+          "comment" : "cofactor = 2",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041cd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fc041c4b337d934104cd7bef271bf60ced1ed20da14c08b3bb64f18a60888d0439046ab1e344ce25ff3896424e7ffe14762ecb49f8928ac0c76029b4d5800374e9f5143e568cd23f3f4d7c0d4b1e41c8cc0d1c6abd5f1a46db4c021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020102033a00043f6a6d7ef968ed14f22fb5c445d0a198b090555fc4b8440ae0a004b090ead0c4389326a4417f2d3248db535d57e039c045ea1958c484067e",
+          "private" : "1019babf6cb683112dc1bff42f1e0b9242b4b3d3ceedc38b1a0de2fc",
+          "shared" : "72d7ec663f059dda71360e49296cae4f204d4928e6204b400e2a0b74",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1206,
+          "comment" : "cofactor = 22721622932454352787552537995910923612567546342330757191396560966559",
+          "public" : "3082012f3081f006072a8648ce3d02013081e4020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041cd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fc041c4b337d934104cd7bef271bf60ced1ed20da14c08b3bb64f18a60888d0439046ab1e344ce25ff3896424e7ffe14762ecb49f8928ac0c76029b4d5800374e9f5143e568cd23f3f4d7c0d4b1e41c8cc0d1c6abd5f1a46db4c021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f033a00043f6a6d7ef968ed14f22fb5c445d0a198b090555fc4b8440ae0a004b090ead0c4389326a4417f2d3248db535d57e039c045ea1958c484067e",
+          "private" : "1019babf6cb683112dc1bff42f1e0b9242b4b3d3ceedc38b1a0de2fc",
+          "shared" : "72d7ec663f059dda71360e49296cae4f204d4928e6204b400e2a0b74",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1207,
+          "comment" : "cofactor = None",
+          "public" : "308201103081d106072a8648ce3d02013081c5020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041cd7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fc041c4b337d934104cd7bef271bf60ced1ed20da14c08b3bb64f18a60888d0439046ab1e344ce25ff3896424e7ffe14762ecb49f8928ac0c76029b4d5800374e9f5143e568cd23f3f4d7c0d4b1e41c8cc0d1c6abd5f1a46db4c021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f033a00043f6a6d7ef968ed14f22fb5c445d0a198b090555fc4b8440ae0a004b090ead0c4389326a4417f2d3248db535d57e039c045ea1958c484067e",
+          "private" : "1019babf6cb683112dc1bff42f1e0b9242b4b3d3ceedc38b1a0de2fc",
+          "shared" : "72d7ec663f059dda71360e49296cae4f204d4928e6204b400e2a0b74",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1208,
+          "comment" : "modified prime",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00c7dcc95fb9d591ce71a8bf8a556f2740e47b7987cd2f7830aac0eb4b303c041c0fe46b4a6c6dd4b7b86f709b2062b046cc238dcfcaab11c4d407d5b1041c4b337d934104cd7bef271bf60ced1ed20da14c08b3bb64f18a60888d04390400000000000000000023f905836e050000000000000000000000014d3a8e6427eb21055820f8b4c7120ac1a1d4ef9fc8f9cc644c4dc503cb021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020101033a000400000000000000000023f905836e050000000000000000000000014d3a8e6427eb21055820f8b4c7120ac1a1d4ef9fc8f9cc644c4dc503cb",
+          "private" : "1019babf6cb683112dc1bff42f1e0b9242b4b3d3ceedc38b1a0de2fc",
+          "shared" : "1cbab0e5d8e0b8c37dc3f288b50c8a90107396fd521769ec8405203f",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1209,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "1019babf6cb683112dc1bff42f1e0b9242b4b3d3ceedc38b1a0de2fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1210,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "1019babf6cb683112dc1bff42f1e0b9242b4b3d3ceedc38b1a0de2fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1211,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "1019babf6cb683112dc1bff42f1e0b9242b4b3d3ceedc38b1a0de2fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1212,
+          "comment" : "a = 0",
+          "public" : "3081f83081b906072a8648ce3d02013081ad020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff3021040100041c64b569c07b0d6cc342b02aceb14d118fac8f5340fd6d22c667493b7c0439043f6a6d7ef968ed14f22fb5c445d0a198b090555fc4b8440ae0a004b090ead0c4389326a4417f2d3248db535d57e039c045ea1958c484067e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020101033a00043f6a6d7ef968ed14f22fb5c445d0a198b090555fc4b8440ae0a004b090ead0c4389326a4417f2d3248db535d57e039c045ea1958c484067e",
+          "private" : "1019babf6cb683112dc1bff42f1e0b9242b4b3d3ceedc38b1a0de2fc",
+          "shared" : "72d7ec663f059dda71360e49296cae4f204d4928e6204b400e2a0b74",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1213,
+          "comment" : "public key of order 3",
+          "public" : "308201133081d406072a8648ce3d02013081c8020101302806072a8648ce3d0101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff303c041ca6823f0215dcdb3da93f3064004f2253629f998574fb966db8084aa2041c2feb2a755bca29d59c971966bb31d8da4d57750fe67da6e73e68fa83043904376cfe149174e584d8aa2ced53bdcec8053d8ec87c7bc1302fadb087b408cfccce6b447406a5d324852ccb4f4035b22093974e98aaa65217021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020101033a0004376cfe149174e584d8aa2ced53bdcec8053d8ec87c7bc1302fadb08723b864dd57d8221223725d00f0a50c387069553704433b5cd4226ee8",
+          "private" : "1019babf6cb683112dc1bff42f1e0b9242b4b3d3ceedc38b1a0de2fc",
+          "shared" : "c077d8c9f4432873fa699f42bb70951a91cac35a105befc0b26a29a9",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1214,
+          "comment" : "public key on isomorphic curve brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00048920ebf7c326c0c7d3ced9c836bc6739ee0f01eb254ae7302c1c8927bacfb0e6fff4aa3c1e3c9b7230784f568f74a77404608fc7db2f66e9",
+          "private" : "1019babf6cb683112dc1bff42f1e0b9242b4b3d3ceedc38b1a0de2fc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "IsomorphicPublicKey",
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1215,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000442965e56285793adc7a389259e9cf589ddd015e9bd539e7251e87bdf83d78979f31c47573b1b4563d52605ce78d13d4b3dba9137cfb87672",
+          "private" : "11741702730ecbd0302206cc137afac29c8e5b151aa276614bee277d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1216,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044da276013cc1d7a5007057d8534a7992c07cb89a4289be1306a224313972c2dc45c9d98b0401de4291244a64b76e8e6024f80773e41c204c237d1338432f1086",
+          "private" : "11741702730ecbd0302206cc137afac29c8e5b151aa276614bee277d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1217,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b8104002203620004a678b55ac9bf1a53fb34cc5c1d02ee3f5042280b96dc552b37b6c4de4d784772303baa39637bf92c7d2706dfab32aaba3817a9cbf42e631306edeafff56aad3b295bae9d76553c8ebe8260870b676453be70d4cbe77fea59606530d736698810",
+          "private" : "11741702730ecbd0302206cc137afac29c8e5b151aa276614bee277d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1218,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004009ccd4707bcb17a495e71b2815c27da50da8bc73077f37499281350336de71836ab3b8b4d2639536d052d90a1a995be15c5dad427c7f98b1f727d8098b3f929658e01ad739bfd1b6536087427423c134ddeea7feb0c27d7459f739eb023b404670d231af7ca65ef65f67c8d333a2eb4ff85a1392ba597a9339f55388beb83638b705d1f",
+          "private" : "11741702730ecbd0302206cc137afac29c8e5b151aa276614bee277d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1219,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004bb772efdde5aa3ae3002e6fc075a3eec5f23ff3d5cdb95719bb1aba4631beb70a10783eea8ef55db2731e4b465f5f4caf63c6301c9a55f8df07192945f42f82d",
+          "private" : "11741702730ecbd0302206cc137afac29c8e5b151aa276614bee277d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1220,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000407f4cc76a1dfd15a8e6086298b51cf7b5a452bd78d22255079c870193e38b58d0af2c0f1ae929b4f07af26694f28e2e28efe264c4737d3d5",
+          "private" : "11741702730ecbd0302206cc137afac29c8e5b151aa276614bee277d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1221,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200046ce67724a682ac3bcfd9e5eae6752c8f0256936c8ce6d30c2d86acfd0cad65167871ee9db6cbb308d296a4657bfe732d819921a947e2f879b2079c6d72442255",
+          "private" : "11741702730ecbd0302206cc137afac29c8e5b151aa276614bee277d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1222,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200046d81e4491be3c79ee67288a4ecbeb81f5d3f277cc2f8b167abd5a471f3ca0c7bfb6a6b4bb5b59a0215de2bf862b5ea92efc69867b39c479c143b265cce74d86e21a6242ae5b1786cea523a6791c55a2b",
+          "private" : "11741702730ecbd0302206cc137afac29c8e5b151aa276614bee277d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1223,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200047aa0fb8aac947cfdce1dde00a39628b4fd9e0eeb3b3d4a6796a063fedd3da3493f4f1806965b34acf8788d18e4925a3740f8005c8e79d97c3cd9fa4ab7e2545ec491a1a34f3e8ae4a0f91c94d01c3aa590b90aac5d3c19b04e11677c94394b5a",
+          "private" : "11741702730ecbd0302206cc137afac29c8e5b151aa276614bee277d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1224,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042cc1fe0272661d4cf2dd5f624063176b77b52ef3ad565bcd39e19eae4e1ec2538d4f06e3eaa65dd25c3093308525c053c0ff3601eb83293083e7c3db9ffa9cd752076cf9aeb52b831fb0ef0237bdd44b7537c7438136a45ffeffd8a504fd847de0619ef191e651a0cbfc8986013423aa045dfb028fd3044320bbc1b0d9925bc0",
+          "private" : "11741702730ecbd0302206cc137afac29c8e5b151aa276614bee277d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1225,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004787a59a058d051f1bf03b29eb9b62298e7a572d0233d5cd27cbe21a7e59fbecb4f382c492bdd42614d81f69e8890cf1e41f78c4c3e6afe5bcc591f1da67e7bdc",
+          "private" : "11741702730ecbd0302206cc137afac29c8e5b151aa276614bee277d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1226,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a0352000459582047b008714d11e0307018e43022f3840e4794f112f1f65384a37d7037b0e37d78a2b19a94ec91a017126cbc8caf8baf4f39f9af4956f8e24ceca69ff11112603947bf6d442835739328379814fb",
+          "private" : "11741702730ecbd0302206cc137afac29c8e5b151aa276614bee277d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1227,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200046ec42be3b975ce7e5481a05e6c74fab6deea449da35ec5c87f3374ce7589f102052c9d19d7c299ce9dfe31608c40408135e35d85b47dd7317301b7d87e592ee78cd92a4b13271308f06ae6526730d3c05f4c1b57d80e648815c14572fbe9936e",
+          "private" : "11741702730ecbd0302206cc137afac29c8e5b151aa276614bee277d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1228,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e038182000431c185cbecde89be3f67e2518b45aa7dac138637076bf3cfa4e82f408c7a9aa229a3384c71743e6b9408cc49ed4fe410e2c9260ce63221e7e76b1516db5b12ee54d028d6b09c058865af5712866c0caf8ad15c22ebe11a8956782dc57c8aba50cc398f2decdbc8cad5555a172f222f5949872bf75de3e0dfbf80adc711c9267b",
+          "private" : "11741702730ecbd0302206cc137afac29c8e5b151aa276614bee277d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1229,
+          "comment" : "invalid public key",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010106031e00022976d67c0990b15a69fdf3b1a8af1cda5093d56edf5a07920c4a2560",
+          "private" : "094a03f9da3f349baf97d127006b91aec00281360223236ade4960ef4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1230,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010106031e0003207634267719edd5479d4cb295b9187761379d4954ea2167f9f7c21e",
+          "private" : "7a8ba19e871ea26250478bd775bdf5083dca779ef95270c504d14e42",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1231,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010106031e0002207634267719edd5479d4cb295b9187761379d4954ea2167f9f7c21e",
+          "private" : "7a8ba19e871ea26250478bd775bdf5083dca779ef95270c504d14e43",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1232,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010106031e0003a564bd8c207a8eea688192e55f7298903d506534191f941853689dc5",
+          "private" : "540edb903f98285bf9c05a9bdc2863a86c7e885cfe9b93d233000a5b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1233,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010106031e000285c7342870c42049ed0e288892f8bf63ff3a810c58031f9a1af6fa99",
+          "private" : "3b2eb0d8c8edfba44f9c523c3d4a143525608184a108cc376a086393",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1234,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010106031e000385c7342870c42049ed0e288892f8bf63ff3a810c58031f9a1af6fa99",
+          "private" : "3b2eb0d8c8edfba44f9c523c3d4a143525608184a108cc376a086392",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1235,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3036301406072a8648ce3d020106092b2403030208010106031e0002a564bd8c207a8eea688192e55f7298903d506534191f941853689dc5",
+          "private" : "540edb903f98285bf9c05a9bdc2863a86c7e885cfe9b93d233000a5c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        }
+      ]
+    },
+    {
+      "curve" : "brainpoolP256t1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1236,
+          "comment" : "normal case",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000481fec1314ce8ac7e9456b95fbceb2f6c897a2f17abd6092a78b00fb7d8534abe10ff1b436faa8d0bea8c86b720c2d17ea05f0e946f2c0a85a949b83d7e0f2be4",
+          "private" : "09cbd52d2aee63e003d94660046f7ed6e724463abce250ee1264c94d0c9c9faa5",
+          "shared" : "71b37582210878538d83f4384f1843227449b34079d6856d5c5915ad8e747c83",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1237,
+          "comment" : "compressed public key",
+          "public" : "303a301406072a8648ce3d020106092b24030302080101080322000281fec1314ce8ac7e9456b95fbceb2f6c897a2f17abd6092a78b00fb7d8534abe",
+          "private" : "09cbd52d2aee63e003d94660046f7ed6e724463abce250ee1264c94d0c9c9faa5",
+          "shared" : "71b37582210878538d83f4384f1843227449b34079d6856d5c5915ad8e747c83",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1238,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000440dba5f4c16ab52f2f2ec98dde1c5ab1616e8d66efe2fab27357fd5fef2884d706fc02dad5b8250415f87e5e666a8b8b2a3c58c21ff6618e313f9a9568297d51",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1239,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000470d8dc59b3e6e9a11f8b968d736dacc27774b0d48b01f4becc9baf25b8688d66933594ed8eb8c507b4218787c64927b6529464a391c307916367444c289738d8",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1240,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200046da9622d0b7dcd3e47a9cec88edd963b58dd8f9bab8c22d574bb628eca0fd7d90f2fc34b570678cc74b7704caf77856afb099759b9f16e9ff34a65ffb4a58dc5",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "00000000000000000000000000000000ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1241,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200048040001f2d2c7d5e1ca2e0deada348a85f696f0330f9c4bff4d8d046711656f414f028def3ae26e341913abd0eaf4097208ececd788998f6bb880f68304a3ebd",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1242,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000436734aea2de9cc2c3a1e4d552c564892d0a2711688d8a5323e4241789088c31444317ad73b3d38bfae25bf440c86d4b0da608bf1db3ffb66681592f5c046caf2",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1243,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000496a571535786b9b4de1fb339b622669be538913bc8fbd9ba36951a3fb3ed45b35d4cfa5c65f75a20caff34fb7ce894875a348a86025b889c4ba3e6bbceeb0429",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "000003ffffff0000003ffffff0000003ffffff0000003ffffff0000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1244,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000431efe34c91a266c95333caad8e3f1a8402fa8c2469f36f5e6bd68c7b94c6460d246b99e6b31c8582fe17efc4ae52ba9355ddc151f90f59826e96e857aab32ff2",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1245,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200047ed2039365d480148a186c4fa218364d62c41e222d8390b4c8d2e759bc257fb03c443e3ff07d640559eb338ef02151eaede5d73593f34f2622226a2fecf72f01",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "0100d29ad57723bb97832e7ba7cf293b9af7680115bca8737c71f4d10f4c5a7f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1246,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200046055b44b247bd0b921fb77b0199e2118059c30f881b7a71750f2031a3cd526f148a7cb2ee455d0527fc21d688854c52bdfb39300bd8c229ac285f499410a851c",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "418ab1c0e338b5a844d6b3086cf644484b44b3a241170d6af9e4a412674e6b58",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1247,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000474199bbf3d3f63c6344e94fea98143567b4de185da348490108ccb6810c0ebb134998e53ca4fecb4cad5b90ddb57a44295fd0defac69936e258d60f686898ee4",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "4776594608a060160209bc73ed845abeb0d8a8740e4b8a58f3103d9a67ef15df",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1248,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004a943537c033a584ee2db8a46b336d99bbecd5f59e7719d865011f3b320b4c58a1dde73b2bb694327d4b2f33b0416b07959cf5ae4cb8a8567d7956ba4453b1fa3",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "525e89b7b79a501fdd5564b2afa67e23e1dcf1ec211fc3e71eca2a26e5f68fb0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1249,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200040841a48891e8bf0364fd95d4f267b98397aec9394596a1dee3be6ef42df4c81e69b05caff854286ca024becaed6bc78cfd8901c5239d41fbc2f7b8a67b90fcf2",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7f00000001fffffffc00000007fffffff00000001fffffffc000000080000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1250,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200040921c4d6c8820e8fd5caf53d1c76db6d1bc2cb6ccc3747d62684ba685ee8679b44242a2b919497ebfdbcdc089519fe086ed08bcff64d88f93cc526fb8f792383",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fff00000003fffffff00000003fffffff00000003fffffff000000040000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1251,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004412cd2d2dbe9bb969d752b344c6b8625fcaf251bb58a26fd4f78e945bb306490726193d831b6d582f5115760a1bdc34a794eb21aba7328b645577b9109106361",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1252,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200047a9334e25e896519e5f87f849f9a0b9700654c98a686dae2672bac8d7bfa39251a395b7b8de3654b8ff4330ee35f3351450c3a4a1dc5e8da150d4de5c85750c6",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fffffff00000000000000ffffffffffffff00000000000000ffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1253,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004848d508c5d95e9765bcd30509e51924ba5cac5ee5bd471f72fce04b51c10f94523e302ecca89ea1482e3ab71749b65125dbf93b0f152ad168693789646806119",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1254,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004277888653238655c528a8056185383655f6e15fafac3bb72adf962cf1bb11ff60f552ff221d486435e2bb17aca644b4d9ffdbdbc4b9be0e2652c8a0e3b277bc6",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1255,
+          "comment" : "edge case for shared secret",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200048e7296b1c4aeaafb1fd943947cca52910e1a2d2fe7f4ab160fe846194212887401eacc97fceb6edb8387374853f690ec5fb9f66f7d04ad7fcd2b895c06efedf1",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5375",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1256,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000420da2c8eba645c86e63c41cb902f5b6edb8d462a3d6ab37c704a428b9ea95b8b86a1129e7337147c66a70d2514927b802a6144a279ae0345f4be62f4f64d172a",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7ffffffffffffffffffffffff1b9cb97ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1257,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000414d439b943523084b2ba5514b29e8a085f5707e434476846677fd9f8e1546c0e07bfb237cf78850abf00bee96330554fe97a831463d85768ec3f50f83d2b13e2",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fffffffffffffffffffffffc6411cefffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1258,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000414d439b943523084b2ba5514b29e8a085f5707e434476846677fd9f8e1546c0ea23ba5a3d27624b17f654ba73a53382284c1730f714dc8bf33d3f724e2433f95",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fffffffffffffffffffffffc6411cefffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1259,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004a7be6b39d823359cff98fa16cb9ebd2cb021799773f072614bfe8d7b66ffd71553455f99680029e3dd46bc4a55a2b6e38d9ab79aabbbb36e1821bc06d4ef1609",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "7fffffffffffffffffffffffbb95fc9dffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1260,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200048c03d2606a0abec6255383df236e0e38f158380338347b3e0f6cd8d8dd54c5b0a5e164aed103da23bfb1f55046317b44f381d4395da40d7fbc7921d518b40d53",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "3ffd35d021ad4b9d766643241169ff405876c82d67b8857b3837f7b1ac3119b0",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1261,
+          "comment" : "y-coordinate of the public key is small on brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200048c85227a5cb100cad32398d39dc8bfa5f153f3f825fa8b3283796357b1785a01a44e6d3d8cec065600ce0c8e7167fd1e26b41f799dc97a0fd5a164ce8797523c",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "78868160fc8994124a171fb203a9ce828a659562001a30abc987b9fef1a1f526",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1262,
+          "comment" : "y-coordinate of the public key is large on brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200048c85227a5cb100cad32398d39dc8bfa5f153f3f825fa8b3283796357b1785a0105acea9e1502a3663d97fe022c1b90544787d6aa375ca6184a71e34e97d7013b",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "78868160fc8994124a171fb203a9ce828a659562001a30abc987b9fef1a1f526",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1263,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200045bab0563575e08100fe8a4e0e0fca4d39613e270909c1dfd3ea466980dd5fc3e655e58669062686ed4d06ac37dec0e75fdc9e9ee98be9453a29be493cebbd4d7",
+          "private" : "6546f19660be42b6455813d02dab822a1c55529e43179dd5cb77cd16b2c4cf4",
+          "shared" : "4dc18c8b6714087054235dfd8b84cabbf5a9ea63dc217a566d772ca536b0e707",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1264,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000400000000000000000000000000000000000000000000000000000000000000011fc3c8c633ad5ff802caa3b6feb8cbca4505124732e018e6ff97f83ae0afccf1",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "5823cec0fd56a5fcc13c992d37e8b7443bb9659584445327d61da2a5926324f2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1265,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000400000000000000000000000000000000000000000000000000000000000000030b0e6ccc05e5008089ee2c08c64c6d84069b6cb03f63db158ea399d3723829c1",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "863be1d06549feec60d7e64f18d1aa611d2541c46284e6cccdca5352a1eb7677",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1266,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000400000000000000000000000000000000ffffffffffffffffffffffffffffffff276a3e8236ba6aced8b480755508d57c673ab2d9261b4a947ebeff4ca7742e88",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "14c533b14c90ed53613117804f36ea4e3ef8c019dcb8b2e9117a74aaaffb4dbc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1267,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200040000000000000000ffffffffffffffff0000000000000000ffffffffffffffff37ed59ca49554b633d1af4a83a5da34e1d83e5adce8d0af546c16dcc68ad3100",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "6b529ef3f2e5d22c4d30bacdb04ef2d111e66602545ca915d1fd6fe6319a848d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1268,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000400000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff1e102fb9439dc3c67594167fb347d84cd9b5ba5c7f24d0944776bc89610dfdff",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "4f9fd93dd31e2543214baf7ff31e04f980f268d606fcc771c51e123d8ce383ca",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1269,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004000003ffffff0000003ffffff0000003ffffff0000003ffffff000000400000040f405523892b903924b816a5d08d45a203b31a71b44156cd2f18133aab125e4",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "5cd12184cd353efa93426fc6d02890dc8a0a47bc82fddba089a1b00f6b1ecc5d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1270,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff461f5925012b2d3775fc57374560753112a358419f0716ba3c81f3b512340a5e",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "2bf6908e5e99c5bd6c16b481208a137e3723ce75ec88817003aba0d35acca3cf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1271,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200040100d29ad57723bb97832e7ba7cf293b9af7680115bca8737c71f4d10f4c5a7f079d1bed328659a4774472dd572aa7ad5173cd3b15079822c129bf2ac8f901d5",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "7b007eb752d256debd1639dc19e5cca0b56700e34c1999137e7d77ac8588840d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1272,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004418ab1c0e338b5a844d6b3086cf644484b44b3a241170d6af9e4a412674e6b584aa054e60dd85b871e97b56506c8e11031a2bf68a2c5ee74340411121386ada3",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "31b54a3aa28bc08ffc6d9aa85f2b8aa534bb9aaaa991033db72b1defa50773a9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1273,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200044776594608a060160209bc73ed845abeb0d8a8740e4b8a58f3103d9a67ef15df166f5df0d96ddc10227afde544db0793c1b4c867f337d2ea4b9db690e216d44e",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "020c9c8bf10d01a98bbf7c13ac2fe8a06d76a9658861b3cf2145e89ba9de4d05",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1274,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004525e89b7b79a501fdd5564b2afa67e23e1dcf1ec211fc3e71eca2a26e5f68fb03fd92435f89b4f967eae3d9cc4b65f43d4dab5823e61d98e3b7b93be6c7e8d24",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "a767aaae729957a76e439f6107340cded0a441fad7b898159b5806dfe5dd8fcf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1275,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200047f00000001fffffffc00000007fffffff00000001fffffffc00000008000000054a63eedf5deff41b4c7cf26f577ad0620bbf3c27282c974104538acf9c7ed9d",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "06d07069e2b8595f2d91a3ce1e6eca82bf9a1a326c8fae40d6157b94666433bc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1276,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200047fff00000003fffffff00000003fffffff00000003fffffff00000004000000039bc0a48acbed201ec473e44ead6d93c7ec68ae290985aee3ce87a813fd0cd0c",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "54e7e49f6eb2d7e122b629d64e7dc1b1d7470a4dce19a9a6a00690606a2de9e8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1277,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200047fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008002241e6549c3b95fb141b04918593dd00fa1eed143742938147fa9d6bfc79c0075",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "1e87e52ee55db4c37146265f068edd49b2b8339c02570989913f9e8311ab9160",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1278,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200047fffffff00000000000000ffffffffffffff00000000000000ffffffffffffff1414db105804e432c04f20fb3f0012049df4a2fdfd3d4504e98f032f1dfab04c",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "a8ac009aa014fcc7973c916030df55e06c3b340642e01eda0842926531ae30fc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1279,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff198b3bc42419a40dc691048471ef20c36b32d55907419c6786133a01d29a72ea",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "5ca00511c23e8039887f67e66828d84af3ab2b742afc01fee24b204868b59f87",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1280,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200048000003ffffff0000007fffffe000000ffffffc000001ffffff80000040000002b0f6495d600130c9dc5c1644bc40c21d5fa318d259a1dcbe81c433453700c0c",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "91edfb28973fd0489cbd6af94b3be274358651bd2458257034474c69bca63f62",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1281,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53751fc3c8c633ad5ff802caa3b6feb8cbca4505124732e018e6ff97f83ae0afccf1",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "7c6d161b5cdb11b115b855ba23989e6749b012a1990bcc7812fde066de83fcc6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1282,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200047ffffffffffffffffffffffff1b9cb97ffffffffffffffffffffffffffffffff7bca76a7bdd3186966bde7a7f33d34deed65da0e6bd539ec91a954e140000000",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "5985b2a3301f5092625cc55d1435cc3e732db3f95fe9a360bcf55f3a58092461",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1283,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200047fffffffffffffffffffffffc6411cefffffffffffffffffffffffffffffffff0000000032fe3a4b2f3307c2677b6c88bbb62ae65e8cbbe2067709ed0cb320c8",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "79b5e152f817e65e0ad6302936e4a96e928cad5ddf16923a8496702c01b9378b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1284,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200047fffffffffffffffffffffffc6411cefffffffffffffffffffffffffffffffffa9fb57db6ef06f710f3302ce360820e9b285cb3d76996446199c3e3012bb32af",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "79b5e152f817e65e0ad6302936e4a96e928cad5ddf16923a8496702c01b9378b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1285,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200047fffffffffffffffffffffffbb95fc9dffffffffffffffffffffffffffffffff1e15c9e0bcb3c4e417f060296b23b8f476d0301015e3685532a8a6393fffffff",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "5085eb688eb56b85bc8f6c1b557aa5937b1e9d8479514a9e87530caa6e9cfc23",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1286,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200043ffd35d021ad4b9d766643241169ff405876c82d67b8857b3837f7b1ac3119b082efc8f78947da4842abd8d7f788561170184aed2e6ffbeb3c9efd4ec56216f7",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "2b0711fd45ec6e4ac51a33d8600ea4deb9949c46f16d08eb58f571583655c78d",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1287,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000478868160fc8994124a171fb203a9ce828a659562001a30abc987b9fef1a1f5262e5ee7e91de266734df668154e182b2d456bbd812ad9bc17a6fd8e19578dd5dc",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "62687677d30bd393f3a0fcb9900a352c10ad9b0c102dae58e6a3091f1e6ac8e6",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1288,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000478868160fc8994124a171fb203a9ce828a659562001a30abc987b9fef1a1f5267b9c6ff2840c4348f06fa27b4f6b624528d038a2aa4c64107915ba03c7e07d9b",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "62687677d30bd393f3a0fcb9900a352c10ad9b0c102dae58e6a3091f1e6ac8e6",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1289,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200044dc18c8b6714087054235dfd8b84cabbf5a9ea63dc217a566d772ca536b0e7075b0966fa9fc886b2fe0c092f6817ddc37d29a5286f5e2e3b0a9201ea82090dae",
+          "private" : "3717e8add3e1bd89c0761b3aced7b673a0830e477c2b6a76bf1a909b3943fdca",
+          "shared" : "1eff4608fc21bbeccd08e1bff3d3d34f323c95593d41407d1f00496228b74fed",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1290,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200042053bf936c82599d38aef8ec650f502ad9dce3be818d32de66009a3137604f5b02317c894b1138b873b612714c95527021b4240edd45ad26ee96d507954c3245",
+          "private" : "3",
+          "shared" : "170e872994f10d6328dc27163a73af400d6a206cd13cb3ecd7c8fac709f22478",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1291,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200042053bf936c82599d38aef8ec650f502ad9dce3be818d32de66009a3137604f5b02317c894b1138b873b612714c95527021b4240edd45ad26ee96d507954c3245",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "73fa6aa713444cc695cce1a6ea2299b5c09bb0dad21958e6c14524d2beca3d32",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1292,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200042053bf936c82599d38aef8ec650f502ad9dce3be818d32de66009a3137604f5b02317c894b1138b873b612714c95527021b4240edd45ad26ee96d507954c3245",
+          "private" : "100000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "2270bcecf6f71f10345ce24b1d4c878864b80cf79228fb2531b13d95bb0e98a3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1293,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200042053bf936c82599d38aef8ec650f502ad9dce3be818d32de66009a3137604f5b02317c894b1138b873b612714c95527021b4240edd45ad26ee96d507954c3245",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "23a13d59f8adf5a8541bd2e5a9d82cac39ee5aefb89f105bfc162baa621c308e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1294,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200042053bf936c82599d38aef8ec650f502ad9dce3be818d32de66009a3137604f5b02317c894b1138b873b612714c95527021b4240edd45ad26ee96d507954c3245",
+          "private" : "08000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "80df8cf4d7e7e583b266f129540adb4d9e593d098045d519c7b5bd7192d74d1c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1295,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200042053bf936c82599d38aef8ec650f502ad9dce3be818d32de66009a3137604f5b02317c894b1138b873b612714c95527021b4240edd45ad26ee96d507954c3245",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f6901e0e82974856a7",
+          "shared" : "91004e13171062eb7d1703c4c47800183aeaebf55ba867c736c496c90eab5428",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1296,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200042053bf936c82599d38aef8ec650f502ad9dce3be818d32de66009a3137604f5b02317c894b1138b873b612714c95527021b4240edd45ad26ee96d507954c3245",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7900e0e82974856a7",
+          "shared" : "9a2bffea6f356160a6fd1faba7ee23646d43388a45f1bc4c61e9b37abfd52efb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1297,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200042053bf936c82599d38aef8ec650f502ad9dce3be818d32de66009a3137604f5b02317c894b1138b873b612714c95527021b4240edd45ad26ee96d507954c3245",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f790160e82974856a7",
+          "shared" : "69989fcb376ff1f3876aeb6b40c5cc3b6705e368cc4eb54923f8bf5474e3042c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1298,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200042053bf936c82599d38aef8ec650f502ad9dce3be818d32de66009a3137604f5b02317c894b1138b873b612714c95527021b4240edd45ad26ee96d507954c3245",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e81974856a7",
+          "shared" : "01d24147908f768d7b10a7aaa6d1adb6539716ea6fce191fcc8d4e63baebb581",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1299,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200042053bf936c82599d38aef8ec650f502ad9dce3be818d32de66009a3137604f5b02317c894b1138b873b612714c95527021b4240edd45ad26ee96d507954c3245",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974855f5",
+          "shared" : "4875ed4b2bc7e7a0cb89d93b359fa72ddaf0377ddeddd33f62ec2450cd80e7cd",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1300,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200042053bf936c82599d38aef8ec650f502ad9dce3be818d32de66009a3137604f5b02317c894b1138b873b612714c95527021b4240edd45ad26ee96d507954c3245",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e8297485675",
+          "shared" : "315637f94d6776cc3928c1ffbe3c7004aa70b787cc0687faee1da5f9324a36c4",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1301,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200042053bf936c82599d38aef8ec650f502ad9dce3be818d32de66009a3137604f5b02317c894b1138b873b612714c95527021b4240edd45ad26ee96d507954c3245",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e8297485695",
+          "shared" : "54d1009ab7d3cb9d4314ea7512f7bc4d916ecd47bc9e491ad4a6d65a40672554",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1302,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200042053bf936c82599d38aef8ec650f502ad9dce3be818d32de66009a3137604f5b02317c894b1138b873b612714c95527021b4240edd45ad26ee96d507954c3245",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a4",
+          "shared" : "170e872994f10d6328dc27163a73af400d6a206cd13cb3ecd7c8fac709f22478",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1303,
+          "comment" : "edge case private key",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200042053bf936c82599d38aef8ec650f502ad9dce3be818d32de66009a3137604f5b02317c894b1138b873b612714c95527021b4240edd45ad26ee96d507954c3245",
+          "private" : "0a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a5",
+          "shared" : "892923527eb529de963e902641c01701a66cd999d1b665717d7b11cbb5a96f7c",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1304,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1305,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1306,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200040000000000000000000000000000000000000000000000000000000000000000a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1307,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200040000000000000000000000000000000000000000000000000000000000000000a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1308,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1309,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1310,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200040000000000000000000000000000000000000000000000000000000000000001a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1311,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200040000000000000000000000000000000000000000000000000000000000000001a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1312,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53760000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1313,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53760000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1314,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1315,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1316,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53770000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1317,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53770000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1318,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1319,
+          "comment" : "point is not on curve",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1320,
+          "comment" : "",
+          "public" : "3019301406072a8648ce3d020106092b2403030208010108030100",
+          "private" : "0b56c9a5fb87b2090dc62f82c7ddde9d762eebf772640b236041ca71bfc7fb41",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1321,
+          "comment" : "public point not on curve",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200044539ff7feff238b3d6600afd89c1d9d1632bf369c410f9308946f1dd1ab6a0705d57608e0ef4b196f8910b96e92488a0f43c17489962ea46fa1a8315c8a960bd",
+          "private" : "440583c068a2bb22adcc6862a1c5ca37abc482c919ecb15aba61cbbe16edf845",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1322,
+          "comment" : "public point = (0,0)",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101080342000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "440583c068a2bb22adcc6862a1c5ca37abc482c919ecb15aba61cbbe16edf845",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1323,
+          "comment" : "order = -76884956397045344220809746629001649092737531784414529538755519063063536359079",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e537730440420a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53740420662c61c430d84ea4fe66a7733d0b76b7bf93ebc4af2f49256ae58101fee92b04044104a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f42d996c823439c56d7f7b22e14644417e69bcb6de39d027001dabe8f35b25c9be0221ff5604a8245e115643c199f56f627c728e73c6855c4a9e59086fe1f17d68b7a959020101034200044539ff7feff238b3d6600afd89c1d9d1632bf369c410f9308946f1dd1ab6a0705d57608e0ef4b196f8910b96e92488a0f43c17489962ea46fa1a8315c8a960bb",
+          "private" : "440583c068a2bb22adcc6862a1c5ca37abc482c919ecb15aba61cbbe16edf845",
+          "shared" : "2b907484a8b72f8dc85c38824dfec06cb1afe7d6d783ddb8ef441dc11ddce053",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1324,
+          "comment" : "order = 0",
+          "public" : "308201133081cc06072a8648ce3d02013081c0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e537730440420a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53740420662c61c430d84ea4fe66a7733d0b76b7bf93ebc4af2f49256ae58101fee92b04044104a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f42d996c823439c56d7f7b22e14644417e69bcb6de39d027001dabe8f35b25c9be020100020101034200044539ff7feff238b3d6600afd89c1d9d1632bf369c410f9308946f1dd1ab6a0705d57608e0ef4b196f8910b96e92488a0f43c17489962ea46fa1a8315c8a960bb",
+          "private" : "440583c068a2bb22adcc6862a1c5ca37abc482c919ecb15aba61cbbe16edf845",
+          "shared" : "2b907484a8b72f8dc85c38824dfec06cb1afe7d6d783ddb8ef441dc11ddce053",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1325,
+          "comment" : "order = 1",
+          "public" : "308201133081cc06072a8648ce3d02013081c0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e537730440420a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53740420662c61c430d84ea4fe66a7733d0b76b7bf93ebc4af2f49256ae58101fee92b04044104a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f42d996c823439c56d7f7b22e14644417e69bcb6de39d027001dabe8f35b25c9be020101020101034200044539ff7feff238b3d6600afd89c1d9d1632bf369c410f9308946f1dd1ab6a0705d57608e0ef4b196f8910b96e92488a0f43c17489962ea46fa1a8315c8a960bb",
+          "private" : "440583c068a2bb22adcc6862a1c5ca37abc482c919ecb15aba61cbbe16edf845",
+          "shared" : "2b907484a8b72f8dc85c38824dfec06cb1afe7d6d783ddb8ef441dc11ddce053",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1326,
+          "comment" : "order = 17901173885223768702896718547912698493510841341785744190857633730178",
+          "public" : "3082012f3081e806072a8648ce3d02013081dc020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e537730440420a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53740420662c61c430d84ea4fe66a7733d0b76b7bf93ebc4af2f49256ae58101fee92b04044104a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f42d996c823439c56d7f7b22e14644417e69bcb6de39d027001dabe8f35b25c9be021d00a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82020101034200044539ff7feff238b3d6600afd89c1d9d1632bf369c410f9308946f1dd1ab6a0705d57608e0ef4b196f8910b96e92488a0f43c17489962ea46fa1a8315c8a960bb",
+          "private" : "440583c068a2bb22adcc6862a1c5ca37abc482c919ecb15aba61cbbe16edf845",
+          "shared" : "2b907484a8b72f8dc85c38824dfec06cb1afe7d6d783ddb8ef441dc11ddce053",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1327,
+          "comment" : "generator = (0,0)",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e537730440420a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53740420662c61c430d84ea4fe66a7733d0b76b7bf93ebc4af2f49256ae58101fee92b0404410400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7020101034200044539ff7feff238b3d6600afd89c1d9d1632bf369c410f9308946f1dd1ab6a0705d57608e0ef4b196f8910b96e92488a0f43c17489962ea46fa1a8315c8a960bb",
+          "private" : "440583c068a2bb22adcc6862a1c5ca37abc482c919ecb15aba61cbbe16edf845",
+          "shared" : "2b907484a8b72f8dc85c38824dfec06cb1afe7d6d783ddb8ef441dc11ddce053",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1328,
+          "comment" : "generator not on curve",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e537730440420a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53740420662c61c430d84ea4fe66a7733d0b76b7bf93ebc4af2f49256ae58101fee92b04044104a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f42d996c823439c56d7f7b22e14644417e69bcb6de39d027001dabe8f35b25c9c0022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7020101034200044539ff7feff238b3d6600afd89c1d9d1632bf369c410f9308946f1dd1ab6a0705d57608e0ef4b196f8910b96e92488a0f43c17489962ea46fa1a8315c8a960bb",
+          "private" : "440583c068a2bb22adcc6862a1c5ca37abc482c919ecb15aba61cbbe16edf845",
+          "shared" : "2b907484a8b72f8dc85c38824dfec06cb1afe7d6d783ddb8ef441dc11ddce053",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1329,
+          "comment" : "cofactor = -1",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e537730440420a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53740420662c61c430d84ea4fe66a7733d0b76b7bf93ebc4af2f49256ae58101fee92b04044104a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f42d996c823439c56d7f7b22e14644417e69bcb6de39d027001dabe8f35b25c9be022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a70201ff034200044539ff7feff238b3d6600afd89c1d9d1632bf369c410f9308946f1dd1ab6a0705d57608e0ef4b196f8910b96e92488a0f43c17489962ea46fa1a8315c8a960bb",
+          "private" : "440583c068a2bb22adcc6862a1c5ca37abc482c919ecb15aba61cbbe16edf845",
+          "shared" : "2b907484a8b72f8dc85c38824dfec06cb1afe7d6d783ddb8ef441dc11ddce053",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1330,
+          "comment" : "cofactor = 0",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e537730440420a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53740420662c61c430d84ea4fe66a7733d0b76b7bf93ebc4af2f49256ae58101fee92b04044104a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f42d996c823439c56d7f7b22e14644417e69bcb6de39d027001dabe8f35b25c9be022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7020100034200044539ff7feff238b3d6600afd89c1d9d1632bf369c410f9308946f1dd1ab6a0705d57608e0ef4b196f8910b96e92488a0f43c17489962ea46fa1a8315c8a960bb",
+          "private" : "440583c068a2bb22adcc6862a1c5ca37abc482c919ecb15aba61cbbe16edf845",
+          "shared" : "2b907484a8b72f8dc85c38824dfec06cb1afe7d6d783ddb8ef441dc11ddce053",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1331,
+          "comment" : "cofactor = 2",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e537730440420a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53740420662c61c430d84ea4fe66a7733d0b76b7bf93ebc4af2f49256ae58101fee92b04044104a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f42d996c823439c56d7f7b22e14644417e69bcb6de39d027001dabe8f35b25c9be022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7020102034200044539ff7feff238b3d6600afd89c1d9d1632bf369c410f9308946f1dd1ab6a0705d57608e0ef4b196f8910b96e92488a0f43c17489962ea46fa1a8315c8a960bb",
+          "private" : "440583c068a2bb22adcc6862a1c5ca37abc482c919ecb15aba61cbbe16edf845",
+          "shared" : "2b907484a8b72f8dc85c38824dfec06cb1afe7d6d783ddb8ef441dc11ddce053",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1332,
+          "comment" : "cofactor = 76884956397045344220809746629001649092737531784414529538755519063063536359079",
+          "public" : "308201553082010d06072a8648ce3d020130820100020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e537730440420a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53740420662c61c430d84ea4fe66a7733d0b76b7bf93ebc4af2f49256ae58101fee92b04044104a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f42d996c823439c56d7f7b22e14644417e69bcb6de39d027001dabe8f35b25c9be022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7034200044539ff7feff238b3d6600afd89c1d9d1632bf369c410f9308946f1dd1ab6a0705d57608e0ef4b196f8910b96e92488a0f43c17489962ea46fa1a8315c8a960bb",
+          "private" : "440583c068a2bb22adcc6862a1c5ca37abc482c919ecb15aba61cbbe16edf845",
+          "shared" : "2b907484a8b72f8dc85c38824dfec06cb1afe7d6d783ddb8ef441dc11ddce053",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1333,
+          "comment" : "cofactor = None",
+          "public" : "308201303081e906072a8648ce3d02013081dd020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e537730440420a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53740420662c61c430d84ea4fe66a7733d0b76b7bf93ebc4af2f49256ae58101fee92b04044104a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f42d996c823439c56d7f7b22e14644417e69bcb6de39d027001dabe8f35b25c9be022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7034200044539ff7feff238b3d6600afd89c1d9d1632bf369c410f9308946f1dd1ab6a0705d57608e0ef4b196f8910b96e92488a0f43c17489962ea46fa1a8315c8a960bb",
+          "private" : "440583c068a2bb22adcc6862a1c5ca37abc482c919ecb15aba61cbbe16edf845",
+          "shared" : "2b907484a8b72f8dc85c38824dfec06cb1afe7d6d783ddb8ef441dc11ddce053",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1334,
+          "comment" : "modified prime",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a78fbea6902fdc1e0fd7bac0461d36ed824c4ee599b13be4755c618d9b4c87a530440420026b993511becd9e2e8e4fd057665684ebefa73e3b74e443aab6e68f8421cbcf0420662c61c430d84ea4fe66a7733d0b76b7bf93ebc4af2f49256ae58101fee92b040441040000000000000000000004d52ab6d6994500000000000000000000000000027814487f98c572d5bb334a25e76e3006e477c870b53976e37ee5c10e855110ecc7022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7020101034200040000000000000000000004d52ab6d6994500000000000000000000000000027814487f98c572d5bb334a25e76e3006e477c870b53976e37ee5c10e855110ecc7",
+          "private" : "440583c068a2bb22adcc6862a1c5ca37abc482c919ecb15aba61cbbe16edf845",
+          "shared" : "0e2486a6f17154af03209eaeb4f8cb64f0d8a1ecc54fe93986979f66f170ce40",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1335,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "440583c068a2bb22adcc6862a1c5ca37abc482c919ecb15aba61cbbe16edf845",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1336,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "440583c068a2bb22adcc6862a1c5ca37abc482c919ecb15aba61cbbe16edf845",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1337,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "440583c068a2bb22adcc6862a1c5ca37abc482c919ecb15aba61cbbe16edf845",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1338,
+          "comment" : "a = 0",
+          "public" : "308201143081cd06072a8648ce3d02013081c1020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377302504010004204079bb2002f04e45b9ac910b3d4976b6044c07ab38227dbbef23f387ce339d2b0441044539ff7feff238b3d6600afd89c1d9d1632bf369c410f9308946f1dd1ab6a0705d57608e0ef4b196f8910b96e92488a0f43c17489962ea46fa1a8315c8a960bb022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7020101034200044539ff7feff238b3d6600afd89c1d9d1632bf369c410f9308946f1dd1ab6a0705d57608e0ef4b196f8910b96e92488a0f43c17489962ea46fa1a8315c8a960bb",
+          "private" : "440583c068a2bb22adcc6862a1c5ca37abc482c919ecb15aba61cbbe16edf845",
+          "shared" : "2b907484a8b72f8dc85c38824dfec06cb1afe7d6d783ddb8ef441dc11ddce053",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1339,
+          "comment" : "public key of order 3",
+          "public" : "308201333081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377304404203bb85a0f23252965be0ed5c6fac6b21f982d1adbe1f850910f262588a0c3b0ee042065017f1b9c906125823e1bf32dff773bc163a3fe2debb163cc5234782f2ff8340441041dbb2a08c4ec41183ffb48f71cccf2017ca2e3bf21d9268a2694a69555e728a73b17d7bc5c6e5f3349d45c5449f8f527418696a089aa2efd791491dfb06e1eda022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7020101034200041dbb2a08c4ec41183ffb48f71cccf2017ca2e3bf21d9268a2694a69555e728a76ee3801f45804a88f491ae3c538a984b2cb55f834b7bf12aa6feb63d6f00349d",
+          "private" : "440583c068a2bb22adcc6862a1c5ca37abc482c919ecb15aba61cbbe16edf845",
+          "shared" : "a9592125885c525a7885b0b75f30134b84aab2b032353a1931e1c8bc6f520ae5",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1340,
+          "comment" : "public key on isomorphic curve brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000405d543c663375d5b1da56e7be94e2b12f64b09e77e9eba762e38c8019f9065192dd3b9ef667e91f4100d192d43094807d143fe34b2bd184e8132693f006e5d8c",
+          "private" : "440583c068a2bb22adcc6862a1c5ca37abc482c919ecb15aba61cbbe16edf845",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "IsomorphicPublicKey",
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1341,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00045e624ee5b36a73d10f5b91df3e272e637c31d4f121bbef5099e0b6903c20c85c13365d4e440ffc327ac7f601651e98f4079c37ca07ca02e8",
+          "private" : "3f8822340fb5077b260ad29564b8b7bda235357a90680268ac6756125a872831",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1342,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004e9c9ee8e9ff023033538e2b57ca39d89b89007655cc879ccb8ae0bdca349b06222e2648f4a4fd7e011c08df2b55450e39a8d8bafba002f1e1decaf67c1af69a3",
+          "private" : "3f8822340fb5077b260ad29564b8b7bda235357a90680268ac6756125a872831",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1343,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200047e71be8b085f5229dd78b8531f979a19acf3f1d256ccc3e8ebe77cdfa3cfad28cb0e746ca07df8c178abe40512913103b518ef0b567de307df2a605a57a495afb3c49a907ef4f6c1927c7e67132814fe7593dd9f6d661f799c8cd6f6a67aaa2b",
+          "private" : "3f8822340fb5077b260ad29564b8b7bda235357a90680268ac6756125a872831",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1344,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b810400230381860004012624311fbf7b97f48d2c6eeb5a4cd0e3283f4532be8163238bab84d63096eb0b054bebbc068a73decda62f5292827796141018fe994da19d16c26d59d34fabe97e01b7c3b7cd17e7cb3e7a4573bc10780d3ab52cccc57b3c091343202c421a491fdf9a494eeeadf5d54229189e990d366ce58f8a4313346a8106d3f4d79655520bb5e9",
+          "private" : "3f8822340fb5077b260ad29564b8b7bda235357a90680268ac6756125a872831",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1345,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004f79bff10edcf6198780932ec7c8e96497757de356889cbca20a0ce1fdc56c2b39fa4e56488691c4b9cbfc85090a57a6ca14d48f07e08acd52477cfbd0a1b51cb",
+          "private" : "3f8822340fb5077b260ad29564b8b7bda235357a90680268ac6756125a872831",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1346,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a0004c538194901430105f8c27b1b07b7c412e8048d217c7efe6d659142c3a366f0442b22a3da35493b785c167cfa6301312e882457675a02bc4d",
+          "private" : "3f8822340fb5077b260ad29564b8b7bda235357a90680268ac6756125a872831",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1347,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b24030302080101070342000422ad0ff6c47d9f5dde955cb140e7d999702445d602c0012d2f252690761fe9189eac3213ddac2cfab64e3307b3e613d470af930f70d7d5be12c5b81a1eebc4fa",
+          "private" : "3f8822340fb5077b260ad29564b8b7bda235357a90680268ac6756125a872831",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1348,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000491ad1025970fa86236117b53c0a252300f7655d1101894ef5290a650cfc77f319293c545dc02fc1e3ffd728986b5b9ab44d78bda74a84cfe2109fdbdd0d47c138cbfdac1786e98ae05086242e3760adb",
+          "private" : "3f8822340fb5077b260ad29564b8b7bda235357a90680268ac6756125a872831",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1349,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004789bf4602afb992eee02b4802b5e5b8a278bbc68ab0e6ba845353aa9aa17abde66c459feadfab6912fa6e22cf27842d41556d346d7dae455b743f86004c40795eabb5e7223dd0d2ac5f975ec9bd6899beaee3f0e670c80daa4a929ffbfc9b599",
+          "private" : "3f8822340fb5077b260ad29564b8b7bda235357a90680268ac6756125a872831",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1350,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d038182000409c7c8f0148f365bb4ed3bb4880bd481b56cee4897b6356aeadbb77e9bcb3173d648d816b3f4b618664df79ace6b6a54a7be1641f379b02cb3ff2a779a86f6864f8b786452cc6ad3bf60140759c033c89925fd46fb139c89a7a6694c845d1c6b9d9c53a18fbda449e4ead2c2140dea09651c3b091fab14ec6eacf3642d040c7f",
+          "private" : "3f8822340fb5077b260ad29564b8b7bda235357a90680268ac6756125a872831",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1351,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000469369c422f986d3ae80647f12e5accd49082869d284efa7c31adcaf0b85b966cd79eccc5e82495a4e576f9efff6174cb28bfbe41d79929f6",
+          "private" : "3f8822340fb5077b260ad29564b8b7bda235357a90680268ac6756125a872831",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1352,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a0352000485971e0872e195d79a8c48a7778859503c61a1a05251b85a02c833fca77232b710037ea3f2edeac37cbad71dfaa2d42019dc65014bcae9d261985707059263f6ecb4fd562fef71ad3e4581eb53114199",
+          "private" : "3f8822340fb5077b260ad29564b8b7bda235357a90680268ac6756125a872831",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1353,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c0362000423f4f9aedbfdf9b434b18dd7c5a454a8d2a29ddc8db0b3b7e9fc593062c79bf0b543ff4345dfa5fd54b38958674b2122354ec3a9d94d48775ca63132b314967d1a6fc15d304c6347e2c7453d4c75492caf1dd192effe6204ce994d34e58b8a9b",
+          "private" : "3f8822340fb5077b260ad29564b8b7bda235357a90680268ac6756125a872831",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1354,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200040c4ce8a0a691ad2b86e02bcb929e180bd63b2e0818a7b4398155932c8ab814b90e003a8b39d6b7a923cd4627b7d73f03e7be201ca0dc91ba1d3da7af403bc9e092c4edde87fac055d0f7e72dbc804ae389910403829aee52f2b3b5b72618380077d8777dd2171217c30961e78164078e732d6c5d00f23a982b75647982e70342",
+          "private" : "3f8822340fb5077b260ad29564b8b7bda235357a90680268ac6756125a872831",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1355,
+          "comment" : "invalid public key",
+          "public" : "303a301406072a8648ce3d020106092b2403030208010108032200020009989b9391330ab7ded98276f810b9c4c0f051b8fa004493e86a69434ebfd4",
+          "private" : "6be6bbe1fe2ae4d54d3c51a255e47d15562649c7a3c8ccb8058c006b4263936c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1356,
+          "comment" : "public key is a low order point on twist",
+          "public" : "303a301406072a8648ce3d020106092b24030302080101080322000390df76513471dcb69e24321ecb87029309bcf2356579f097db6da5cb3fe54824",
+          "private" : "7cab8b63d45e3a8d16bae7c1fa1b7790660009f1bd369ecbf5bc0a268b5503b",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1357,
+          "comment" : "public key is a low order point on twist",
+          "public" : "303a301406072a8648ce3d020106092b240303020801010803220002559565d0d9ed2706af2ed4055bf4b5d0d1a8400ead1b94ebbf35ee2ecfc45b93",
+          "private" : "7797ef897deb6b8cf263fb85874cc14acfae5d99944b7006bff434912b9bccad",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1358,
+          "comment" : "public key is a low order point on twist",
+          "public" : "303a301406072a8648ce3d020106092b240303020801010803220003559565d0d9ed2706af2ed4055bf4b5d0d1a8400ead1b94ebbf35ee2ecfc45b93",
+          "private" : "7797ef897deb6b8cf263fb85874cc14acfae5d99944b7006bff434912b9bccac",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1359,
+          "comment" : "public key is a low order point on twist",
+          "public" : "303a301406072a8648ce3d020106092b24030302080101080322000290df76513471dcb69e24321ecb87029309bcf2356579f097db6da5cb3fe54824",
+          "private" : "7cab8b63d45e3a8d16bae7c1fa1b7790660009f1bd369ecbf5bc0a268b5503c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        }
+      ]
+    },
+    {
+      "curve" : "brainpoolP320t1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1360,
+          "comment" : "normal case",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200043ebce5cdff67f60919dcfd9090fd9773fc1666ae48242b45b05717f8ecfa196052aabec5efcfd7d70acf6c4cee85a7cc62033c9eb07143a73f6b6ceca7e3ae38425b20bf03ecdd66e1f154494689ec1e",
+          "private" : "0d2de78391de4e27f6a7d8a21d9393a470b52110e8e9d5ddde6dabac2663608e1b150ae67cbb6b719",
+          "shared" : "2d7f82b3026c3b66e873771a6dc21b9cba21b1ee9c4f67e1b0d9ddf7e465ef1db39914881e8831f1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1361,
+          "comment" : "compressed public key",
+          "public" : "3042301406072a8648ce3d020106092b240303020801010a032a00023ebce5cdff67f60919dcfd9090fd9773fc1666ae48242b45b05717f8ecfa196052aabec5efcfd7d7",
+          "private" : "0d2de78391de4e27f6a7d8a21d9393a470b52110e8e9d5ddde6dabac2663608e1b150ae67cbb6b719",
+          "shared" : "2d7f82b3026c3b66e873771a6dc21b9cba21b1ee9c4f67e1b0d9ddf7e465ef1db39914881e8831f1",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1362,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200046975ae12f6ab7cdecf38dbfc73c303b7e761bddba9427a0962c52e8bc8fd4d50e2c616e272d06fd2a30b183ed92bc397e461311ae7606da7f51e03b43500d19844f77f2fe06b5991b79a6ae74e45d8f4",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "00000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1363,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200045ed60d7e4b2783635438ab94a26ccf3eeab621decab700021ebbd5da9c980d94675fe89713ce7aaf4a24d4597cca049babc6d731bdc4fc9b3229913a56f9b70da2361d681c4da92c26a45f741cdc2467",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "00000000000000000000000000000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1364,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200048455ea50e317f100abf686261d54b74571bbaa294a0be35f01129bfe8384f6be19446e564ec75d267173e86e516ab37f4aa7478bb2b8a44b6b89fba41a56179c82cbe0c28d3df0464ca1e021bf1eecf7",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "0000000000ffffffffffffff00000000000000ffffffffffffff0000000000000100000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1365,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a0352000487da65a008a062881c8e3679c8a246ef33ec9b45767153b8aadaf045161088a11efcd9da42ff99c6132f8e6ce692efb7ad39bebfcfa965e7668b822251b02c3113d9dc480c42ed0910246a86268f4d2b",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000100000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1366,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004afa84bb06816946b7809bf03432872170a38f50807a38f4610388568661652d2bfad500fd74d324c7e1a4cff63144fb9b7c90410476ce4ff0d00849673fd7a830fc0f442ad40dada4694f1de1caf67ff",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1367,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a0352000442368c6d3ccc9e6b4c55a2cf582dcf6c332c3ec5c12983e4626a904f2287fde5a5c441ecbafbc84e492e3670173068faa344ff7e7a454d8dbcdc126422745340d1b414d52ec50481ed150c2cff568912",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "07fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1368,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004047529df827d474fae66116022fdab490ee3af1323358d2e06188334a9d710ef0119e3b6b2786c7a76ebafa55ff2e52683ec5ac9fd5901e7a68943a02c11c5231ce9ee1282c176752d7e5a199f19c686",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "5caa89fafb087ebbf0f75a8845dc5e20272e91d60092e9870b1f14f4d13bef255c15e11b886829b2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1369,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004bc1cdd16028b9c3ba49a859a7a2bb110989e4ebbd9c62477b88b774b2da354d6ce6c5162762d0116c0d1a925100f4959c6b64bb352293ad72861ea9fa7efd50500115cd432ad16ef3f08ca2c1bf242dd",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "6166f3de8da8f6e286176276a03ac6dbb4a9f8b0154a1504caa5ba2bb12dde1be6eae89f3384123b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1370,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200048d90e9130b674b3b5250e89fed97f64f4634d26f3d606f9de279d059143d8750b21dc0cbcffa6a9897c809e917ce013eb0da3a42d60cda9030556b11a2d5b70689a0d1c585505573317aac201e283895",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "7f0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1371,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004b75d0c352b5df8536c22f60286595edbe52b7bf109f1e72b01904258c017359284238b65a05352d743a3793eff3628832b976fec09cb4a2b59eb5923be4cd4e0a6f52f62fad9543f10616acc31f3872e",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "7fc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc000000080000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1372,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004607fc2fb45fbe982612bd136ea06ddf8ad265edaa884ca20bfb288fdaf61c1a0896fa3947159321a63f64eed7d48ed529adc61c782eb6bbacbab0a2edcbedd183ba7f8e1653791d438d9cf8a88ccdaa2",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "7ffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1373,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a0352000468b7b4842c85652f3878c7333ee9b372010ebde9a318a9e28c9cedca3d1bc9d0b99271dbdb40174e3bb85d9b325eb3fc2713718b3f64b3ac98b2957e27bdb398995f5dff1ef5c0041407dbe780e8341b",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "7ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1374,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004b3658b493862d59a24b0344143315348d8cd9f4ed0ea4439a66c22bb0ad8cf7e9b7dec834f3a0f9a92d12ad4e9e6ac596a71a376bddc52601ed53b5b62faab2bc39db872a983b13e93d1c1097b573b05",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "7fffffffffffffff0000000000000000000000000000000100000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1375,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a0352000437d53ab43b7a7318b5d56e2e174d5184f70d7aeb7c56800530165da99fc981bf59a8b300e21eec55581a2a66c270481906d7134f4e02be48db2b59dafe0f23155f2a6cca69db3491074e9434686b5515",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "7fffffffffffffff0000000000000000ffffffffffffffff00000000000000010000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1376,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200048bef4afc02bcf88984e43fadc7912900c769d8f5dc00733656487f04b777b803c2fdf1a97f5af911c7b81a31db0f948b3d4d75a06eb5203f1a449546e3f8569f0b9be7c7b8ff0f00cf989aef299bf83d",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "80000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1377,
+          "comment" : "edge case for shared secret",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200048cf86413ec2ae3579d69e5fef52065c009a080b3570b1b3efc40ce9de0138025c17b8682d2600439b61f3182d076f3fa95da23407dd667fc9c7be3eb1f5574fbc3f0ab5d60d0cadf64b5c81e911e2868",
+          "private" : "5a21b0e16c6eb888381f19009dae7a91274e8f18e16674ee6c2bf782e24c2f0cf994daa6fe60ed10",
+          "shared" : "d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e26",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1378,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004000000000000000000000000000000000000000000000000000000000000000000000000000000020118c1b04101ec5f9b33eb6eeffec1b7461b690dd8416ca34c88bee64a1afd246748fea0f3e6995d",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "58f6281ef863cfcd121f00e0d89bb625d9c3eddc97fbef3da989815b7faefcf84d52772dd2bf9b1f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1379,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200040000000000000000000000000000000000000000000000000000000000000000000000000000000307ccd520e969c2025c6ac0c6f16a4ed55fa79f4440a9cbed5deb91b0b5f57bde62f05d867d1aaf40",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "2be2078b9f8c412bf531ca4e1e1faefc51dad9012f057658ec664eba0260e305e6877587b0ca4844",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1380,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200040000000000ffffffffffffff00000000000000ffffffffffffff00000000000001000000000000001a1b1142e0e20a4b4267477ae401951426791db66a8622061a18fb7f7cb4048270fc083662c5e36f",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "5aa75e8ecdea561d0948411aa7a54cd1f3ba0463b5e4aa3784f8953e2a2d6f4723b890de0d374947",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1381,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a0352000400000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff000000010000000007b13cc61ade2a01206c9c7a577fdce73b2faf70c3b3c69bd57a466561111f9326795835d3c2ba79",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "bef5050949ce67c1463dfe11c49e107daf6b04e627a4e6b149e818e5ffb3f3d793ebebe6eaf20c90",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1382,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff3fce9819335760e603d29d8736c5cbfe7d61af21d7fa3007b33578773eb7793697303fa06ce47b8a",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "9d35ad36ec1fb7c9687649766a44fd6595fde0bdded2199e8a82570deb8bded77622f311b77272ac",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1383,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a0352000407fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff09635008f0dfbfbbbcf18db72d5e0608615dba0af087cd3758ca1defe58ea232ec76d6764d2d0d17",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "aa1b41fceff4ba87591a145bf3a1b44adb6dc794ca535c93f50cdcb03a35f4d063c573d4db19512e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1384,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200045caa89fafb087ebbf0f75a8845dc5e20272e91d60092e9870b1f14f4d13bef255c15e11b886829b20a91e5ff65c760438927f58d93114ac17a88b8d5e6415f7db7fe809afe336ac48b88f158744fa8a2",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "1b84bfdb39f13e6f3fd87be6d8e08edd2e0122c4aa7e496ff699daae961ecb4e2e5b07cc3a9804fb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1385,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200046166f3de8da8f6e286176276a03ac6dbb4a9f8b0154a1504caa5ba2bb12dde1be6eae89f3384123b1989dbce13a66c642c5117fa0f9b6d9bfaf57e4dc674d70ecb59371aad8538541a4bc46cc9c09d34",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "cc112d083e3811272e53324e65c2ad7d958bb965fda3af81372cde668016f8bc713d55c274170963",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1386,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200047f0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff3f4aa3fbf2c3f9083ce64cb067189fc86f0009522b0bc6cce8b9aa6184fe8ee2a6d2db2191358be3",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "9445cae9d8b9e5fd8bd3d73da56a3ba37ff83156e1741a4471f4ac0132bc24382eeb3204fc1e41ff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1387,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200047fc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000008000000110d6580b65033f2f1a38907567d7690abcddb0dc339a011e7cd3dbb4ae919d2cbfbf9bb2520bafc9",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "98e6af1ee83717fbbe7b19146e2bbb85886262bfa423c6155b5f0283abb1d2878210efcdaaed364b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1388,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200047ffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000016b3daf997cd6c24fe855474692d57c736b1518afd4e9e1d2cdab20ca9a6bf9366375f3f811418a",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "08192a427110f03c204fb6d7352662acb338f9711b4576153ee09421284d1757dc93191f11982e82",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1389,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200047ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff1b95c563738969707edf3c3e52836a73ef99f75589132189d4efbb02e21ecd8574d8939bb5fb4759",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "1896fb3f034e8d3fc3992a4336296c1d974a4a4770fb987363fc23196db786dd7656a512d02f9360",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1390,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200047fffffffffffffff0000000000000000000000000000000100000000000000000000000000000001118923a0b64a9d7118a97f891351928beeb785c7adc637f553d14eafce7a87d4b79065bf8bdb1f20",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "7a7f45bfb4d8de6972ab547d204cf14489e5be7d2fecdcac6fb91d234ea6e5a04db6b6c2ee345e3f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1391,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200047fffffffffffffff0000000000000000ffffffffffffffff000000000000000100000000000000025ea72c6de93298dddfb9823ce54399149f08b73220573d581171caa19d6d19b0d047c72bb4d7248b",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "050fb12d8129bceb3360b1df064687a75438e4c36483edce3254b658e5a2cada54abe6182d16ac2d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1392,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004800000000000000000000000000000000000000000000000000000000000000000000000000000005dd547d9224452a96d9375e4000887969764b1dcaacafcdd2f111fe85fe91225ad37f26d4ceeea19",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "c0dfb94bdd6bf640043a6179830e5a8cec1eeb8028c5ae9bfff71e251bd1cf73f9014196f86341d1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1393,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e260118c1b04101ec5f9b33eb6eeffec1b7461b690dd8416ca34c88bee64a1afd246748fea0f3e6995d",
+          "private" : "0a0fd4aaf14d5c4f13a2b5afb677d44e2087856cd75bb7bd90c628e4761defe1485de4fbb97ae3aca",
+          "shared" : "aae31f9598c7491b6c2cf680e6e6a60a5e21b07ace64612b0b0998fc2cee54cc984f75cdc2c589e5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1394,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004aac3566c8e494d7d52976b107a9b9058e65e541c01dab5d4bba90658a655890fd2c48d29f0b972253955fdbd31c6328df2e893fe5b401ddc529c4ed70a9c46badb80843277b8f9874538312460d54dfd",
+          "private" : "3",
+          "shared" : "31c02835052e6a04448a10b2b8af64275ab78a4b66756ddf72d9324b0b915021ebf0c8f33aa334b1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1395,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004aac3566c8e494d7d52976b107a9b9058e65e541c01dab5d4bba90658a655890fd2c48d29f0b972253955fdbd31c6328df2e893fe5b401ddc529c4ed70a9c46badb80843277b8f9874538312460d54dfd",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "cba435a0d80bb18cfabea806f885b0c9531920f64cedf6e465bea89db462b183c441c34c7d976b00",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1396,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004aac3566c8e494d7d52976b107a9b9058e65e541c01dab5d4bba90658a655890fd2c48d29f0b972253955fdbd31c6328df2e893fe5b401ddc529c4ed70a9c46badb80843277b8f9874538312460d54dfd",
+          "private" : "1000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "8ef6f50f1d1204f820f1d7d05ba06684f922bca07f9af9ce4820849791595a38385ea88614599ec9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1397,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004aac3566c8e494d7d52976b107a9b9058e65e541c01dab5d4bba90658a655890fd2c48d29f0b972253955fdbd31c6328df2e893fe5b401ddc529c4ed70a9c46badb80843277b8f9874538312460d54dfd",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "18c6cf3f841868380ee533fc70d9ee02495547e6773d1adad816f367a4fe0144094fc73a2692dc02",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1398,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004aac3566c8e494d7d52976b107a9b9058e65e541c01dab5d4bba90658a655890fd2c48d29f0b972253955fdbd31c6328df2e893fe5b401ddc529c4ed70a9c46badb80843277b8f9874538312460d54dfd",
+          "private" : "080000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "13f636563f9bf74a284dbb6fbbc9674437473a3b18007625a0c9e196e548463d6c5ecaafc8e9ae11",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1399,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004aac3566c8e494d7d52976b107a9b9058e65e541c01dab5d4bba90658a655890fd2c48d29f0b972253955fdbd31c6328df2e893fe5b401ddc529c4ed70a9c46badb80843277b8f9874538312460d54dfd",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e88691555b44c59311",
+          "shared" : "7c284bf40bc88ef5a1944f871de3be7f28cb006c5e23af6f479456403f740495e0157c7e2921859d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1400,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004aac3566c8e494d7d52976b107a9b9058e65e541c01dab5d4bba90658a655890fd2c48d29f0b972253955fdbd31c6328df2e893fe5b401ddc529c4ed70a9c46badb80843277b8f9874538312460d54dfd",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98681555b44c59311",
+          "shared" : "033b7c9c296b9063c19746a02669b400b95d50052c603d2503f5998334a84f1abde8dff32ccaf574",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1401,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004aac3566c8e494d7d52976b107a9b9058e65e541c01dab5d4bba90658a655890fd2c48d29f0b972253955fdbd31c6328df2e893fe5b401ddc529c4ed70a9c46badb80843277b8f9874538312460d54dfd",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98689555b44c59311",
+          "shared" : "c45a8c78e5161961fc84e66c8046c8d4599b27225cdd4ebe2462c82d8906bb3cf6e8a6e5cddcb6bf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1402,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004aac3566c8e494d7d52976b107a9b9058e65e541c01dab5d4bba90658a655890fd2c48d29f0b972253955fdbd31c6328df2e893fe5b401ddc529c4ed70a9c46badb80843277b8f9874538312460d54dfd",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555a44c59311",
+          "shared" : "6fbb8bb43eccc86dc13bf7dbc2650945334176fc5f1303a1055f9f4cee38d78747657e38846e25e9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1403,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004aac3566c8e494d7d52976b107a9b9058e65e541c01dab5d4bba90658a655890fd2c48d29f0b972253955fdbd31c6328df2e893fe5b401ddc529c4ed70a9c46badb80843277b8f9874538312460d54dfd",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59233",
+          "shared" : "147c9b3b4880f7f6d4eb96f891672cb0d09a6bef15574ab2a43f09ae7f8090cdfa81517e098dac1e",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1404,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004aac3566c8e494d7d52976b107a9b9058e65e541c01dab5d4bba90658a655890fd2c48d29f0b972253955fdbd31c6328df2e893fe5b401ddc529c4ed70a9c46badb80843277b8f9874538312460d54dfd",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c592b3",
+          "shared" : "47f4412278edc51ba0635853a82e033b164a68194d4c3e2492017432daaa8c35684c343f701f6b02",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1405,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004aac3566c8e494d7d52976b107a9b9058e65e541c01dab5d4bba90658a655890fd2c48d29f0b972253955fdbd31c6328df2e893fe5b401ddc529c4ed70a9c46badb80843277b8f9874538312460d54dfd",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c592f3",
+          "shared" : "a64c2b075abf446a9ba43f6ffcefda795835ab2e1c4d19bd9c9ede59cd9eaf9c831a520b1e0ce269",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1406,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004aac3566c8e494d7d52976b107a9b9058e65e541c01dab5d4bba90658a655890fd2c48d29f0b972253955fdbd31c6328df2e893fe5b401ddc529c4ed70a9c46badb80843277b8f9874538312460d54dfd",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59303",
+          "shared" : "b3b25821ac9b07c614f6fce7f9a1c2325d3cbd51cac82dadeb79037a23bce03b0352407ccd447af8",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1407,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004aac3566c8e494d7d52976b107a9b9058e65e541c01dab5d4bba90658a655890fd2c48d29f0b972253955fdbd31c6328df2e893fe5b401ddc529c4ed70a9c46badb80843277b8f9874538312460d54dfd",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930b",
+          "shared" : "594aebd8010757d15f79631af0e481310359e0086e4e988ab5525a9303aaf800cd4ef123ceb68875",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1408,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004aac3566c8e494d7d52976b107a9b9058e65e541c01dab5d4bba90658a655890fd2c48d29f0b972253955fdbd31c6328df2e893fe5b401ddc529c4ed70a9c46badb80843277b8f9874538312460d54dfd",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930e",
+          "shared" : "31c02835052e6a04448a10b2b8af64275ab78a4b66756ddf72d9324b0b915021ebf0c8f33aa334b1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1409,
+          "comment" : "edge case private key",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004aac3566c8e494d7d52976b107a9b9058e65e541c01dab5d4bba90658a655890fd2c48d29f0b972253955fdbd31c6328df2e893fe5b401ddc529c4ed70a9c46badb80843277b8f9874538312460d54dfd",
+          "private" : "0d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930f",
+          "shared" : "c7e67dc2f64d0e66841777a6f014340b8a63f42024c6cd5ac5e10cec3b02a2d050c2fd8f078a754f",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1410,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1411,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1412,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a0352000400000000000000000000000000000000000000000000000000000000000000000000000000000000d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e26",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1413,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a0352000400000000000000000000000000000000000000000000000000000000000000000000000000000000d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1414,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200040000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1415,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200040000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1416,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a0352000400000000000000000000000000000000000000000000000000000000000000000000000000000001d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e26",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1417,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a0352000400000000000000000000000000000000000000000000000000000000000000000000000000000001d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1418,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2600000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1419,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2600000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1420,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e26d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e26",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1421,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e26d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1422,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2700000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1423,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2700000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1424,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e26",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1425,
+          "comment" : "point is not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1426,
+          "comment" : "",
+          "public" : "3019301406072a8648ce3d020106092b240303020801010a030100",
+          "private" : "657260acc897adc69b0aa87116379842a395b661abc1befad4787cf96a2d702220f2da2b7f762aa",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1427,
+          "comment" : "public point not on curve",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a0352000483defecd610d44b01e5dfa4370347445d43bf2896a3f3836be1617abcf69adc185759903c93275a0957e2ffc79cb4f9649279465b7a33e6b313c4f43af13fd7b6196395e1d4768268b7ed1b6249620ec",
+          "private" : "2f207c431c6ed8352c5650250cf85ff188134c9aa283dc73e6913f8e2694899db3596a3d74b15637",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1428,
+          "comment" : "public point = (0,0)",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "2f207c431c6ed8352c5650250cf85ff188134c9aa283dc73e6913f8e2694899db3596a3d74b15637",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1429,
+          "comment" : "order = -1763593322239166354161909842446019520889512772717686063760686124016784784845843468355685258203921",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2730540428d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e240428a7f561e038eb1ed560b3d147db782013064c19f27ed27c6780aaf77fb8a547ceb5b4fef422340353045104925be9fb01afc6fb4d3e7d4990010f813408ab106c4f09cb7ee07868cc136fff3357f624a21bed5263ba3a7a27483ebf6671dbef7abb30ebee084e58a0b077ad42a5a0989d1ee71b1b9bc0455fb0d2c30229ff2ca1b8dfc943b0481ec387a12dfe1f9a0670305a4970ed5cd2b7d1381179a716796eaaa4bb3a6cef0201010352000483defecd610d44b01e5dfa4370347445d43bf2896a3f3836be1617abcf69adc185759903c93275a0957e2ffc79cb4f9649279465b7a33e6b313c4f43af13fd7b6196395e1d4768268b7ed1b6249620ea",
+          "private" : "2f207c431c6ed8352c5650250cf85ff188134c9aa283dc73e6913f8e2694899db3596a3d74b15637",
+          "shared" : "1ec3bfbcd62f6874660a7f62dcbbbdbf399e343d852a5a54c6e50993bcafcde814993d542bdeab12",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1430,
+          "comment" : "order = 0",
+          "public" : "3082014b3081f406072a8648ce3d02013081e8020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2730540428d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e240428a7f561e038eb1ed560b3d147db782013064c19f27ed27c6780aaf77fb8a547ceb5b4fef422340353045104925be9fb01afc6fb4d3e7d4990010f813408ab106c4f09cb7ee07868cc136fff3357f624a21bed5263ba3a7a27483ebf6671dbef7abb30ebee084e58a0b077ad42a5a0989d1ee71b1b9bc0455fb0d2c30201000201010352000483defecd610d44b01e5dfa4370347445d43bf2896a3f3836be1617abcf69adc185759903c93275a0957e2ffc79cb4f9649279465b7a33e6b313c4f43af13fd7b6196395e1d4768268b7ed1b6249620ea",
+          "private" : "2f207c431c6ed8352c5650250cf85ff188134c9aa283dc73e6913f8e2694899db3596a3d74b15637",
+          "shared" : "1ec3bfbcd62f6874660a7f62dcbbbdbf399e343d852a5a54c6e50993bcafcde814993d542bdeab12",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1431,
+          "comment" : "order = 1",
+          "public" : "3082014b3081f406072a8648ce3d02013081e8020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2730540428d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e240428a7f561e038eb1ed560b3d147db782013064c19f27ed27c6780aaf77fb8a547ceb5b4fef422340353045104925be9fb01afc6fb4d3e7d4990010f813408ab106c4f09cb7ee07868cc136fff3357f624a21bed5263ba3a7a27483ebf6671dbef7abb30ebee084e58a0b077ad42a5a0989d1ee71b1b9bc0455fb0d2c30201010201010352000483defecd610d44b01e5dfa4370347445d43bf2896a3f3836be1617abcf69adc185759903c93275a0957e2ffc79cb4f9649279465b7a33e6b313c4f43af13fd7b6196395e1d4768268b7ed1b6249620ea",
+          "private" : "2f207c431c6ed8352c5650250cf85ff188134c9aa283dc73e6913f8e2694899db3596a3d74b15637",
+          "shared" : "1ec3bfbcd62f6874660a7f62dcbbbdbf399e343d852a5a54c6e50993bcafcde814993d542bdeab12",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1432,
+          "comment" : "order = 410618568360611413177547474029944166748205379750040840301822434183392856467013123528027",
+          "public" : "308201713082011906072a8648ce3d02013082010c020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2730540428d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e240428a7f561e038eb1ed560b3d147db782013064c19f27ed27c6780aaf77fb8a547ceb5b4fef422340353045104925be9fb01afc6fb4d3e7d4990010f813408ab106c4f09cb7ee07868cc136fff3357f624a21bed5263ba3a7a27483ebf6671dbef7abb30ebee084e58a0b077ad42a5a0989d1ee71b1b9bc0455fb0d2c3022500d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b0201010352000483defecd610d44b01e5dfa4370347445d43bf2896a3f3836be1617abcf69adc185759903c93275a0957e2ffc79cb4f9649279465b7a33e6b313c4f43af13fd7b6196395e1d4768268b7ed1b6249620ea",
+          "private" : "2f207c431c6ed8352c5650250cf85ff188134c9aa283dc73e6913f8e2694899db3596a3d74b15637",
+          "shared" : "1ec3bfbcd62f6874660a7f62dcbbbdbf399e343d852a5a54c6e50993bcafcde814993d542bdeab12",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1433,
+          "comment" : "generator = (0,0)",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2730540428d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e240428a7f561e038eb1ed560b3d147db782013064c19f27ed27c6780aaf77fb8a547ceb5b4fef4223403530451040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593110201010352000483defecd610d44b01e5dfa4370347445d43bf2896a3f3836be1617abcf69adc185759903c93275a0957e2ffc79cb4f9649279465b7a33e6b313c4f43af13fd7b6196395e1d4768268b7ed1b6249620ea",
+          "private" : "2f207c431c6ed8352c5650250cf85ff188134c9aa283dc73e6913f8e2694899db3596a3d74b15637",
+          "shared" : "1ec3bfbcd62f6874660a7f62dcbbbdbf399e343d852a5a54c6e50993bcafcde814993d542bdeab12",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1434,
+          "comment" : "generator not on curve",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2730540428d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e240428a7f561e038eb1ed560b3d147db782013064c19f27ed27c6780aaf77fb8a547ceb5b4fef422340353045104925be9fb01afc6fb4d3e7d4990010f813408ab106c4f09cb7ee07868cc136fff3357f624a21bed5263ba3a7a27483ebf6671dbef7abb30ebee084e58a0b077ad42a5a0989d1ee71b1b9bc0455fb0d2c5022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593110201010352000483defecd610d44b01e5dfa4370347445d43bf2896a3f3836be1617abcf69adc185759903c93275a0957e2ffc79cb4f9649279465b7a33e6b313c4f43af13fd7b6196395e1d4768268b7ed1b6249620ea",
+          "private" : "2f207c431c6ed8352c5650250cf85ff188134c9aa283dc73e6913f8e2694899db3596a3d74b15637",
+          "shared" : "1ec3bfbcd62f6874660a7f62dcbbbdbf399e343d852a5a54c6e50993bcafcde814993d542bdeab12",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1435,
+          "comment" : "cofactor = -1",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2730540428d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e240428a7f561e038eb1ed560b3d147db782013064c19f27ed27c6780aaf77fb8a547ceb5b4fef422340353045104925be9fb01afc6fb4d3e7d4990010f813408ab106c4f09cb7ee07868cc136fff3357f624a21bed5263ba3a7a27483ebf6671dbef7abb30ebee084e58a0b077ad42a5a0989d1ee71b1b9bc0455fb0d2c3022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593110201ff0352000483defecd610d44b01e5dfa4370347445d43bf2896a3f3836be1617abcf69adc185759903c93275a0957e2ffc79cb4f9649279465b7a33e6b313c4f43af13fd7b6196395e1d4768268b7ed1b6249620ea",
+          "private" : "2f207c431c6ed8352c5650250cf85ff188134c9aa283dc73e6913f8e2694899db3596a3d74b15637",
+          "shared" : "1ec3bfbcd62f6874660a7f62dcbbbdbf399e343d852a5a54c6e50993bcafcde814993d542bdeab12",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1436,
+          "comment" : "cofactor = 0",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2730540428d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e240428a7f561e038eb1ed560b3d147db782013064c19f27ed27c6780aaf77fb8a547ceb5b4fef422340353045104925be9fb01afc6fb4d3e7d4990010f813408ab106c4f09cb7ee07868cc136fff3357f624a21bed5263ba3a7a27483ebf6671dbef7abb30ebee084e58a0b077ad42a5a0989d1ee71b1b9bc0455fb0d2c3022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593110201000352000483defecd610d44b01e5dfa4370347445d43bf2896a3f3836be1617abcf69adc185759903c93275a0957e2ffc79cb4f9649279465b7a33e6b313c4f43af13fd7b6196395e1d4768268b7ed1b6249620ea",
+          "private" : "2f207c431c6ed8352c5650250cf85ff188134c9aa283dc73e6913f8e2694899db3596a3d74b15637",
+          "shared" : "1ec3bfbcd62f6874660a7f62dcbbbdbf399e343d852a5a54c6e50993bcafcde814993d542bdeab12",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1437,
+          "comment" : "cofactor = 2",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2730540428d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e240428a7f561e038eb1ed560b3d147db782013064c19f27ed27c6780aaf77fb8a547ceb5b4fef422340353045104925be9fb01afc6fb4d3e7d4990010f813408ab106c4f09cb7ee07868cc136fff3357f624a21bed5263ba3a7a27483ebf6671dbef7abb30ebee084e58a0b077ad42a5a0989d1ee71b1b9bc0455fb0d2c3022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593110201020352000483defecd610d44b01e5dfa4370347445d43bf2896a3f3836be1617abcf69adc185759903c93275a0957e2ffc79cb4f9649279465b7a33e6b313c4f43af13fd7b6196395e1d4768268b7ed1b6249620ea",
+          "private" : "2f207c431c6ed8352c5650250cf85ff188134c9aa283dc73e6913f8e2694899db3596a3d74b15637",
+          "shared" : "1ec3bfbcd62f6874660a7f62dcbbbdbf399e343d852a5a54c6e50993bcafcde814993d542bdeab12",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1438,
+          "comment" : "cofactor = 1763593322239166354161909842446019520889512772717686063760686124016784784845843468355685258203921",
+          "public" : "3082019d3082014506072a8648ce3d020130820138020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2730540428d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e240428a7f561e038eb1ed560b3d147db782013064c19f27ed27c6780aaf77fb8a547ceb5b4fef422340353045104925be9fb01afc6fb4d3e7d4990010f813408ab106c4f09cb7ee07868cc136fff3357f624a21bed5263ba3a7a27483ebf6671dbef7abb30ebee084e58a0b077ad42a5a0989d1ee71b1b9bc0455fb0d2c3022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593110352000483defecd610d44b01e5dfa4370347445d43bf2896a3f3836be1617abcf69adc185759903c93275a0957e2ffc79cb4f9649279465b7a33e6b313c4f43af13fd7b6196395e1d4768268b7ed1b6249620ea",
+          "private" : "2f207c431c6ed8352c5650250cf85ff188134c9aa283dc73e6913f8e2694899db3596a3d74b15637",
+          "shared" : "1ec3bfbcd62f6874660a7f62dcbbbdbf399e343d852a5a54c6e50993bcafcde814993d542bdeab12",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1439,
+          "comment" : "cofactor = None",
+          "public" : "308201723082011a06072a8648ce3d02013082010d020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2730540428d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e240428a7f561e038eb1ed560b3d147db782013064c19f27ed27c6780aaf77fb8a547ceb5b4fef422340353045104925be9fb01afc6fb4d3e7d4990010f813408ab106c4f09cb7ee07868cc136fff3357f624a21bed5263ba3a7a27483ebf6671dbef7abb30ebee084e58a0b077ad42a5a0989d1ee71b1b9bc0455fb0d2c3022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593110352000483defecd610d44b01e5dfa4370347445d43bf2896a3f3836be1617abcf69adc185759903c93275a0957e2ffc79cb4f9649279465b7a33e6b313c4f43af13fd7b6196395e1d4768268b7ed1b6249620ea",
+          "private" : "2f207c431c6ed8352c5650250cf85ff188134c9aa283dc73e6913f8e2694899db3596a3d74b15637",
+          "shared" : "1ec3bfbcd62f6874660a7f62dcbbbdbf399e343d852a5a54c6e50993bcafcde814993d542bdeab12",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1440,
+          "comment" : "modified prime",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900ba0dc09c4fca91f8d2737a6773e536418f90d7febb8d727ebacde533cdbfbde0bdcc63663f5da3bf3054042819508683e6f1bdbf0ec8fdf75e1caa2469fef7a83b669b7094c4d4b8aad42e483f07af4bb2558a650428a7f561e038eb1ed560b3d147db782013064c19f27ed27c6780aaf77fb8a547ceb5b4fef42234035304510400000000000000000000000000237bc7178cc16000000000000000000000000000000000000005434925ffb41a70da2dfb580b95e1fb8d86eb9cd182cd6f310275ff52ad21cd8e91220dd9f7383cf5bf022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593110201010352000400000000000000000000000000237bc7178cc16000000000000000000000000000000000000005434925ffb41a70da2dfb580b95e1fb8d86eb9cd182cd6f310275ff52ad21cd8e91220dd9f7383cf5bf",
+          "private" : "2f207c431c6ed8352c5650250cf85ff188134c9aa283dc73e6913f8e2694899db3596a3d74b15637",
+          "shared" : "350c8a9a8792f9b9e871bdd6b977a1f10aa0c9e32bfa3757b91e299e5d28a6a9a48583a06344cc2e",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1441,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "2f207c431c6ed8352c5650250cf85ff188134c9aa283dc73e6913f8e2694899db3596a3d74b15637",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1442,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "2f207c431c6ed8352c5650250cf85ff188134c9aa283dc73e6913f8e2694899db3596a3d74b15637",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1443,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "2f207c431c6ed8352c5650250cf85ff188134c9aa283dc73e6913f8e2694899db3596a3d74b15637",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1444,
+          "comment" : "a = 0",
+          "public" : "3082014c3081f506072a8648ce3d02013081e9020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27302d0401000428c314f3b8833bf034c812d33b2ede840d7cb7e1a42dfcefa1e58e24553b9016dc1efc594caa02fec104510483defecd610d44b01e5dfa4370347445d43bf2896a3f3836be1617abcf69adc185759903c93275a0957e2ffc79cb4f9649279465b7a33e6b313c4f43af13fd7b6196395e1d4768268b7ed1b6249620ea022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593110201010352000483defecd610d44b01e5dfa4370347445d43bf2896a3f3836be1617abcf69adc185759903c93275a0957e2ffc79cb4f9649279465b7a33e6b313c4f43af13fd7b6196395e1d4768268b7ed1b6249620ea",
+          "private" : "2f207c431c6ed8352c5650250cf85ff188134c9aa283dc73e6913f8e2694899db3596a3d74b15637",
+          "shared" : "1ec3bfbcd62f6874660a7f62dcbbbdbf399e343d852a5a54c6e50993bcafcde814993d542bdeab12",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1445,
+          "comment" : "public key of order 3",
+          "public" : "308201753082011d06072a8648ce3d020130820110020101303406072a8648ce3d0101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e2730540428808e7b2227b98585424a613d2809fc558aac8c4a1f2b2750d6eb4f56817f9d1b816d81265bd15cac0428175e209a33c62cee8fef102976c2ce48d5f35b8e3a278910e5a5c86640b398c4dd1e2d86d8ac475b0451049da2bbf5f43d6b067f37dcdfa8a90fa59cd674a1ba22003fbec5ccd6c6f10599406db9adfdd4f9f51cc7564b99d980ea23ad4482e88455c45095b3b1ca135ad25e0ce2df883f07db45c6e0ba3db15b32022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311020101035200049da2bbf5f43d6b067f37dcdfa8a90fa59cd674a1ba22003fbec5ccd6c6f10599406db9adfdd4f9f5b696f0d49ce2cecdbd8f33dbe97d8aa1a8fa1bf52ce0b31cf185d70cf054e44db70d31f7b401d2f5",
+          "private" : "2f207c431c6ed8352c5650250cf85ff188134c9aa283dc73e6913f8e2694899db3596a3d74b15637",
+          "shared" : "4ae553756a4d451024731e72efea8aaf8a20ea4217d67a9fe4437d06a9882e75a607469feb40115c",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1446,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004aec08ac7071001a9ca046069d4fde5dea62029b92652ff8f5771baa59c03cf4e7a113ed38935c22689666c501721639937edd6eb3ed95148",
+          "private" : "083ffee8035954e92b633be34a999d0ebe6af725f643db23a1e56e6aa07ca7a08ff60726d428a601e",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1447,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f0291188ab6042507fb7139957761ba533ad965178045cecc2abbaf13dc3ecb0be0e2af323f895a0a7f0a0679a4f298a9ec3f5fd2b21aceeebcc43b011c478b2",
+          "private" : "083ffee8035954e92b633be34a999d0ebe6af725f643db23a1e56e6aa07ca7a08ff60726d428a601e",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1448,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200049ec9f13ba4e199163afbfe75732d88ee090ce422e72bee4a3f519f7edc11c0a1217034f0ead23b0c067a9a1881e99f21f9fecebaf0771369a217216566ff6241b55d0dcc671551cb462bfa70e6873722e685920b4a2724f00faa0e5d15725e98",
+          "private" : "083ffee8035954e92b633be34a999d0ebe6af725f643db23a1e56e6aa07ca7a08ff60726d428a601e",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1449,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401c24023a1548478a17f7af184dc7905d2baf98db212dc09ff86492d4280c8185a3a04c78cd6104f82ddf7646068221bf329d63ac737162c7f49c1c29d89fed13a3601ab06e27c0fa59befd9087533a44cca6dbc033c6f80e4d64ceb761153584b634a6015786a29018722ffeb63f3cb5912f663dae78c37718eb83aa45ccc9d89760283",
+          "private" : "083ffee8035954e92b633be34a999d0ebe6af725f643db23a1e56e6aa07ca7a08ff60726d428a601e",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1450,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004628386ad21412db5329c0126b0718fb8ac31d1e5d43bd6b5615b2f7e800ad5a357d24fd0ade1a40f988cd25fed98fe3c3ba46df502052ec944a085e5d1cee849",
+          "private" : "083ffee8035954e92b633be34a999d0ebe6af725f643db23a1e56e6aa07ca7a08ff60726d428a601e",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1451,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00043c210ce8a5791d3ed2900b930a807e752c68847ccde2bfcc8f57347a99d99defb102d42a97514b2bec7de009ff5ac6c7f51ff4a1807ab146",
+          "private" : "083ffee8035954e92b633be34a999d0ebe6af725f643db23a1e56e6aa07ca7a08ff60726d428a601e",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1452,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200041f2f5f6ca48446cb3e8c661d83386d721803d32a41ee9332782f193a0cab4a5a48dd359c6c58c9380c16507d7a3edabc105a03bd352a3c745b9c0ed0fc122517",
+          "private" : "083ffee8035954e92b633be34a999d0ebe6af725f643db23a1e56e6aa07ca7a08ff60726d428a601e",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1453,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010903520004b018528b7ecf6c6b93db9a732a9855b4cc96d49a6c99cfc1588557bf7328b9dbfb77eab00dd3f525678da903f79bf8a86fa1bcb112a3141b822036a8d6462fcb1080fe724d9c5a939ae739f84bc93603",
+          "private" : "083ffee8035954e92b633be34a999d0ebe6af725f643db23a1e56e6aa07ca7a08ff60726d428a601e",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1454,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000402236ac5f64ef25b3cebc036b1ded6f143337d2136282c09ca40ca7df6dcbec492fd4feacfac327807701ca1ef503ce20ea5b9bb4492a8a7337dac78502b55ff6c5e7ebea224f88e0d26861b8f11a2fc0c1ab1d54ca157e5b81aeec8cfc80b8c",
+          "private" : "083ffee8035954e92b633be34a999d0ebe6af725f643db23a1e56e6aa07ca7a08ff60726d428a601e",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1455,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004107cb105bb827381310bb1d402d811d3fab73ce7ad418c855eb185993a827fc35da7c6d95a01720100db7bef7e7611fc365ff8a428b8307ef330f2406fe7843b624473df73b11277740ce6c3313d3c50d7edc941716177f9149287d219d998dbdcff2845ba38fd66be8b39715f149ffc63615c364e9c2715d9e4437ccfadd757",
+          "private" : "083ffee8035954e92b633be34a999d0ebe6af725f643db23a1e56e6aa07ca7a08ff60726d428a601e",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1456,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004597a497ac98ef4e7b57eebcb76dbf80fa90010d39d121f3f270c2997c8097ef32ecbe4a7009d7cd2fa3b4de77b880ce58e7ad47c08c6969a",
+          "private" : "083ffee8035954e92b633be34a999d0ebe6af725f643db23a1e56e6aa07ca7a08ff60726d428a601e",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1457,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200048a46d0bac7b26b02441ebab397140237a1d6551e4f9f63cd1b5129c719808ee9825d3ec5e1c68142c886e2b5bca39c2840236669c7aea799cf31beb70713fff8",
+          "private" : "083ffee8035954e92b633be34a999d0ebe6af725f643db23a1e56e6aa07ca7a08ff60726d428a601e",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1458,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200047e8ab74cbcc65a0236721db3f23d039f3bddd753e5f9cdce1466e0c442b70fb1cb3c1de388722307d27899fb6cc83cf3381f7690c0683655d4486415facb060ee76cfc85bac41df8b8257f3c2fcbf67a9553846e5ac960b0adb7c05150f3d321",
+          "private" : "083ffee8035954e92b633be34a999d0ebe6af725f643db23a1e56e6aa07ca7a08ff60726d428a601e",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1459,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200046c7532f8502d34b9db6ea5e52cf3a053934d5e576b620014f51bd15707a77d5be020d2c112e470c516e29b6d63f5ebcb59b11be095a91226e7aed27318dca9e29e1f11f4b14e67461bafa29eeb8d7a81a82890cfe6781dee4c41747eb4bf0ae3a98997dd9cffc955de7ca1abcfe48e83da4a161e9f9a2c75daf9de71722b4be4",
+          "private" : "083ffee8035954e92b633be34a999d0ebe6af725f643db23a1e56e6aa07ca7a08ff60726d428a601e",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1460,
+          "comment" : "invalid public key",
+          "public" : "3042301406072a8648ce3d020106092b240303020801010a032a0002158ddc4c252067e219e0a55d7d55c3f5523296ab8d63175d1907c82a8a03897cf26bc6cf9b6fc12f",
+          "private" : "160538c462cd2d7698fc25d2712b981d7d62413679de89e089a53cd1017fed6fe6a69de1c2875d0a",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1461,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3042301406072a8648ce3d020106092b240303020801010a032a0003b8a851b160505003d2341f9c3a1cec50e1f5d759705769cbff605b0267af15f7b93552867be488cd",
+          "private" : "0c80ed1a9678622c2b698dc1a7e63c13e28e93622bb1c36891c4cbf2525e10a10d5f4855b9c5fb6c",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1462,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3042301406072a8648ce3d020106092b240303020801010a032a000260fa08a01432849d033645cc7e498cc05ab53bba46336b6a0d538ea3f4e77d2dcc09a704a7737060",
+          "private" : "0d2082a5da76bdbfb06b4ced03045d4aa7884933b3aac1986406854e3d05c069e1f89b481e42cbf96",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1463,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3042301406072a8648ce3d020106092b240303020801010a032a000360fa08a01432849d033645cc7e498cc05ab53bba46336b6a0d538ea3f4e77d2dcc09a704a7737060",
+          "private" : "0d2082a5da76bdbfb06b4ced03045d4aa7884933b3aac1986406854e3d05c069e1f89b481e42cbf95",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1464,
+          "comment" : "public key is a low order point on twist",
+          "public" : "3042301406072a8648ce3d020106092b240303020801010a032a0002b8a851b160505003d2341f9c3a1cec50e1f5d759705769cbff605b0267af15f7b93552867be488cd",
+          "private" : "0c80ed1a9678622c2b698dc1a7e63c13e28e93622bb1c36891c4cbf2525e10a10d5f4855b9c5fb6d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        }
+      ]
+    },
+    {
+      "curve" : "brainpoolP384t1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1465,
+          "comment" : "normal case",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200047c9971b3d2b5f6111173bf61f546bdead7918aa0134b72c11dd2fe22eb336ecdce9541dd8c64c6073af5627cf04a5fda30440fdab76d7377708e5a1ccb973d3e56cdb53f299b791cdfdbc45c43851af0aeed35ab6873f4e2f8d77831eb71b0cb",
+          "private" : "6b3cff8513eb44fada3de5baf6612c87e6e5d3ccca55e30fe6d540edd1544b0ad23ec91a208405cc5288ea02d0e09ba3",
+          "shared" : "581332ce12ebb312a6c0a95f0e3391fc1af59c37f7dc94ab1bf7aebc93540cd6362c13016e3f70ba02d5cd33bc895fc5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1466,
+          "comment" : "compressed public key",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010c033200037c9971b3d2b5f6111173bf61f546bdead7918aa0134b72c11dd2fe22eb336ecdce9541dd8c64c6073af5627cf04a5fda",
+          "private" : "6b3cff8513eb44fada3de5baf6612c87e6e5d3ccca55e30fe6d540edd1544b0ad23ec91a208405cc5288ea02d0e09ba3",
+          "shared" : "581332ce12ebb312a6c0a95f0e3391fc1af59c37f7dc94ab1bf7aebc93540cd6362c13016e3f70ba02d5cd33bc895fc5",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1467,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c03620004319ad6d431018c7036152d4814aad9459bb4e3e479b40752a84c3902910a185233153a49ce7f08eee86c5a76be637b2a138bf12770cbaae6e5bc866f1bb072f083dc4bcc367238c833c226823471de82d5266080f89b5776dfa7ea3c24ca263b",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff00000000000000010000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1468,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c03620004779ce983dce3b93b66f1d5f5da0e6461ed87da6a0bd20b39dd1b85cd4da149c09fe815822e49d2706af32c76aa728d620058e66c021ce3ab681c471ca9deb0826b96712c74948a4c971b8db1f4c049cc75d355df8d0f1fcf16bc4ece28669122",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1469,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200044d69d548112a121ae139b4b8b4f92fe0c31a4ffe14bcfe60fe60028049c7e7e31c5136fb64b641885da6595d3d32260f508f63dc8ff1e40208988830080980ec4f045d2d75b633d23d244374ac9d94ebb33367bb6b92b0bd8ebfe87c01124642",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1470,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200047bed1248364e9ee7dce7210d03a2ea8c9675ba12de09d92fea65f31a9336bd7730064e8c425ab57d741eed5f0a90ab587c3f3dbf31eb2480f0bdc7c2e7d5398284437d10799b19c06d73a05a5dd38b49519513d5137d1ff16894390f8cabba09",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1471,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c0362000486a0f686959b86a82fd13a2455a187a7fc62c2a1155decd85630e10c0805a238dc26872b295a4d4033e2d2a313c6f6138c6f5ecc3bc8a8d5e8e057cc8cf542eed9991c458529960a1a4379e9cd4d949da8ac40aac51e4ee1317ae8af5a38f642",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "1b635895e1e2c809653471a1a1ce3460f76c7b06993c654ee2661011a5b88afecba16d6fff26a7709b7e59f93a9de703",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1472,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200042c5ecd2775c622febaeab94a29b9f593ea1242bd0fefc59bb7a970af89f5bd43cbcfc289ff563a418c25f1c060a22d6f69a285b04992fd34035c7ae35b21a9978ab26dbafb5bbf7a84aa11cb6fe80a1df168a30dbecce6f5e16bd29eb9b699f9",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "3bc08823776f7ee08b4f218f4bdb41e954e7e74abb2d319140c67b935706b1d1440b3da7000068ae55d56acb9746d4a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1473,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c0362000471cad293ad4befb3023a077d444b4142c3470ecf74e1eede03c1c9db832417777c757797282f78771ba094eda4c6a4b645d65739131fd6aa9391f9475527b6045f7e54747840c6b420d4a9b5dca40702f76a72651692db4115977a5675d584fc",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "7ff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc000000080000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1474,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200043313a667863796ecb2683751dd1bf51836fd64bfaad84f9ff18aebf92a80b8e49894baa58cf8918c08f71e8fe8e673960d15ae41c90f98f9a5a837fb27d08c5dc1137fe311649552d5332505100f03c8f771bca63b4a1133aec9beb843d10dfc",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "7ffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000004000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1475,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200044b3576c484f554f33bd294d1d20b94e7caf61046f5e1089ce8b096f9ff3ad2049a8d4b365ebd97133a6514232a8473c91de0689497396b184a6a9a3bed37da61cffb8a62b1ae096507f7f4dfa74e26760160f930d28e4170d2a6b2446b0b1a93",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "7fffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff000000040000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1476,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c0362000485c09245c2965f4387e3276a7305e926ce5fdca2e99900425439a0612685d38f843a468d9e2d2968a65215ac434a6542668917bb4e443399a5b3910ba9f75f97d895098dbe2049dd43b076b50ef2cac16ffa80bf9fc3cf35c4589746213ddca1",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "7fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1477,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c0362000478b76373f3d02f5c0d3961684f479057d35e376ad8583aad78fdde98c1bcbbb9af9582c50e8cce0ee76146623a68794508e70bedac883188959e5dfeb6233775adce6d19d3067d80cdbc9b78dc33006806a6457303f9c65698f1fa8816921077",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "7fffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff0000000000000100000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1478,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c03620004879e31be41831a7b309c71144ff5baff9307159fe5751d2dd0c4595ce288e1f81a34001ac74f68f34271c2ef4dcf2a584822e2dcde90ab1e4411fb998774c1bd0840560e6721ba00f978afa5870d75b9482f594e9d72b03034584292bc8df95e",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "7fffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1479,
+          "comment" : "edge case for shared secret",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c0362000423c40e7a2ec9b61837ff67eb7ada25023279c0c77e7b46e3d40a9159811e0a7731cd515606df44b52082b5319979047575d4467ce49ef08fc1e9aa5016c6e219393211cfa1cc868d16caf2347652b72dfcd88b9df821ebde89054ad7b4a8b807",
+          "private" : "0a3315e6cdeb733e26d72d2a98e943727b637f98406755562b0531f1f92a8f4a66e6ace629249e0f61cad07b22ff62bf",
+          "shared" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1480,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200040000000000000000ffffffffffffffff0000000000000000ffffffffffffffff000000000000000100000000000000014199aba2f2ae96ba11e63e82a9232a83bbffd465c3dd76c4cd24ff07f8cc1c1cc10eb7ca2d80072873f27c103153edbd",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "5558f8c9784d2e17cd8bfba3e717caf1e9085ae74fbc5e5855a347734f64c4a99b6f109c8dc85ffa315cfb01010e59da",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1481,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c0362000400000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff10de23e1549f367b07b72d47df2b0e4dd32a78acc9fa2ead7dbc9a5a3f05ed448fe75d121269ed689a8dc82321212984",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "3e59aceb85ae1e9c482e49ecee60d855627d4ab91243c05cbcfcf88174fc31658e89ece9b673ba222c2e31d51a54e6d5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1482,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000183e0091d69e927eaaa9c887f1164b2b6f58ff482de53f28d381be260a773b306e05aef3745e8a72b6b72496f5009e51",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "47b5bbe7bf2ec7f86777c008b84d753de9e6ec4579ee2f274d5ff3bf466680ea6f46a2db7b50ec597ad1aa06d20ce549",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1483,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c03620004007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff3bcf7ad8f51186c0f99db0988ed9c50e20763125aae2cb69c2a4fa0d29b41075c59cf3798cbac0b06b51445e4f68957c",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "44acbe681bb36efd73881cde8cd2269f85dc0f3eaeddf729a243e17841d6a770c2489859fe2487ff9c1f5c2e00018b76",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1484,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200041b635895e1e2c809653471a1a1ce3460f76c7b06993c654ee2661011a5b88afecba16d6fff26a7709b7e59f93a9de703220e4cda75c354f6217bb3857f55bbf6721c097a14900ad9e0c30b0fafe18ad68c5cc4881cbade4e471fab685c438769",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "117fc625ab3f213aaef4ecf4cbb032ac37997fd63ecb8be330ea8e536a49274bf82eda05fdd53302c347841974934e4c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1485,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200043bc08823776f7ee08b4f218f4bdb41e954e7e74abb2d319140c67b935706b1d1440b3da7000068ae55d56acb9746d4a640bf43becd917f53995763509f651a4019068e8c48007b792b050c3c6a4a41d3c53e14044ef668265a76d83bfd256680",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "05d235cd3f4dbaa1ddec877a1ce9c6a317077601359f18be53e9fc7904fee343d70669d781ec31453686eda2d962647c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1486,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200047ff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc0000000800000000532e64008d9cd987b0e99b2975334b3bd6f042a5a8e5eacf72d0c4ca2906f7f5a546d26117b0679067c7c578527f1d1",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "4bbd8d34c4c25f078ad43446824059439abdd914a2ac9a83e9e1508bcc7eac3974c06314ec18885e64088f7735b47b0b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1487,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200047ffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff00000040000012eb8d2eacbc8bdb2c83ff11864f28fe307a8617e3f651e2c98c1349691a19d914240434e2fc599596a18ae05d62c80b6",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "33d5885c57825c73ef0e489513709468c1d86ef7153f8560eaf8d1eff3a38afbd63157c4840aea14182692acc0df292c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1488,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200047fffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff000000040000000333b6edc37e1dee2502c773a2af9d36be3c14b92fb7ff947b2b398884e938d47d7e91ab6163e35cf7fb549a1c8b40cb4",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "60e92912a1cd8bf11e10d882eb3beac75f924957957fce63b0d646836ac38a5f39c0497d9bc14c1884a3ec62cf84264d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1489,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200047fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff80000040000002c6bc7e854b2d294bbf56b016546598aee72e1a05b12491738dd65d366b038c8b027f90d52012dc546768826b9f76d2f",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "65e593164f354dd3dd77ba72ba55ba80b81169a03b115d5d4249d883e071a00baf114289d6186e3550376092a30a44d5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1490,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200047fffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff000000000000010000000000000027ee7adc978f64eb8ce1ac64d4c9c75f4c35d36de0ed3c9d7a1013fb1323c4f2b2e6f02c240e82ed75472a72f27755dd",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "2add186540d1c14206a301c8f087e60899756d8eb0fd95d0defd1435ee1fb88103feca3704cf3747a375813bcf82d439",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1491,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200047fffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff04d46c613e7cea77e579a3a1c38607da44b1ad733cd78e98315f5fcedaa355bdcd98157d194126a9200da34b945a01a9",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "78b196d7197619661dcefb46a19a0a614bae443cd505af158ebbfb744a983f299d32c62f42e76cb4bf679635e17949b9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1492,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0555ff1d9117e3e1db68597a916492e7e69a91b3aa0d7b068dfb3783729daf94890101226ca567ee4d4f93d56a579408",
+          "private" : "5c1e1ff706fdb4c9b704a2ae9375b68f21a0b6059309a4e293369cf6a3a123a0aad3b2daae1629821a12b9c2c62d3b85",
+          "shared" : "35e72046a25476acf53ad50f8239f45b78d76a99681176d0204c180e7d730c969e82e5743e737015930c4bd2ca1d8f61",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1493,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200041e6c405358fab0f63c09eddacc372dd29c17d0eebcffe37975ee3c6bf05c7b8db09f104fcf6cc1a0576c44c12637b4bf88938d33d2d9390c1075f3af467937074db4022a44e2ea2e9cbff6bfcb4af4909fbb8bd3ab627e1dd1649d5faec28a71",
+          "private" : "3",
+          "shared" : "848a0d6b0714c8fb6b9d9208401ee6494c1f7e06252d1e80552bca6e49b9bbcd757f98722215a03b4b44d13b46ac5373",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1494,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200041e6c405358fab0f63c09eddacc372dd29c17d0eebcffe37975ee3c6bf05c7b8db09f104fcf6cc1a0576c44c12637b4bf88938d33d2d9390c1075f3af467937074db4022a44e2ea2e9cbff6bfcb4af4909fbb8bd3ab627e1dd1649d5faec28a71",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "376c192f947b957fac5e8a1b2d1f24f081b77968d4e53ad115f89b058fbc44974e1a37434814a628e934bbdef42427f2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1495,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200041e6c405358fab0f63c09eddacc372dd29c17d0eebcffe37975ee3c6bf05c7b8db09f104fcf6cc1a0576c44c12637b4bf88938d33d2d9390c1075f3af467937074db4022a44e2ea2e9cbff6bfcb4af4909fbb8bd3ab627e1dd1649d5faec28a71",
+          "private" : "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "46db5c4bd9512ed62534e2357b8fbf1bff2aa97e04061eeea8fe1802f81032704fadbc0e12d6d05559539ecdd7c55d72",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1496,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200041e6c405358fab0f63c09eddacc372dd29c17d0eebcffe37975ee3c6bf05c7b8db09f104fcf6cc1a0576c44c12637b4bf88938d33d2d9390c1075f3af467937074db4022a44e2ea2e9cbff6bfcb4af4909fbb8bd3ab627e1dd1649d5faec28a71",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "29981c8fdd06b9788707c78d52bc34b5df769be1edbe5a96144ff4e39c8a8fc37712903cf94ea0e64ed0d67d2a27056c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1497,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200041e6c405358fab0f63c09eddacc372dd29c17d0eebcffe37975ee3c6bf05c7b8db09f104fcf6cc1a0576c44c12637b4bf88938d33d2d9390c1075f3af467937074db4022a44e2ea2e9cbff6bfcb4af4909fbb8bd3ab627e1dd1649d5faec28a71",
+          "private" : "0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "259247a765e1046770970ca4b2cc7b3d6522702c892be75998af16a7596bbcbb6d9bccde431ffc679c63544d0435accf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1498,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200041e6c405358fab0f63c09eddacc372dd29c17d0eebcffe37975ee3c6bf05c7b8db09f104fcf6cc1a0576c44c12637b4bf88938d33d2d9390c1075f3af467937074db4022a44e2ea2e9cbff6bfcb4af4909fbb8bd3ab627e1dd1649d5faec28a71",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc30f3b883202e9046565",
+          "shared" : "0b4a99473f90dd7261d42c5fd5dea7436ec48c5b91453927b9a97c3a84b770e049970050605f34dc38aa60cf0461c9c7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1499,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200041e6c405358fab0f63c09eddacc372dd29c17d0eebcffe37975ee3c6bf05c7b8db09f104fcf6cc1a0576c44c12637b4bf88938d33d2d9390c1075f3af467937074db4022a44e2ea2e9cbff6bfcb4af4909fbb8bd3ab627e1dd1649d5faec28a71",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b783202e9046565",
+          "shared" : "060b4369765ce2c1aff404b8e77a6c379552ed1ac5814e034ae195d0ed08df5c4cad46c2a464e1552bffca1e131d756f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1500,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200041e6c405358fab0f63c09eddacc372dd29c17d0eebcffe37975ee3c6bf05c7b8db09f104fcf6cc1a0576c44c12637b4bf88938d33d2d9390c1075f3af467937074db4022a44e2ea2e9cbff6bfcb4af4909fbb8bd3ab627e1dd1649d5faec28a71",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b803202e9046565",
+          "shared" : "7afdfc83d3221cd5282e9554f7d1e320504c2771a3374de31bb204c1da0831186f377b6e9090672b0d1df00e22a3a1ac",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1501,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200041e6c405358fab0f63c09eddacc372dd29c17d0eebcffe37975ee3c6bf05c7b8db09f104fcf6cc1a0576c44c12637b4bf88938d33d2d9390c1075f3af467937074db4022a44e2ea2e9cbff6bfcb4af4909fbb8bd3ab627e1dd1649d5faec28a71",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883201e9046565",
+          "shared" : "01013981f8873050143f73cefd5a750c223c5e6fdf1e25a24ed0d7233c782b8b9d82a4cb996f83becb096f6abb8352bd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1502,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200041e6c405358fab0f63c09eddacc372dd29c17d0eebcffe37975ee3c6bf05c7b8db09f104fcf6cc1a0576c44c12637b4bf88938d33d2d9390c1075f3af467937074db4022a44e2ea2e9cbff6bfcb4af4909fbb8bd3ab627e1dd1649d5faec28a71",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e904652f",
+          "shared" : "22d772bd2104c3d24b8505b3e7d1f3f00ca2dacb493ca729170854ef2158407a0ffab006153d5cb7781e9cb57cda505f",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1503,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200041e6c405358fab0f63c09eddacc372dd29c17d0eebcffe37975ee3c6bf05c7b8db09f104fcf6cc1a0576c44c12637b4bf88938d33d2d9390c1075f3af467937074db4022a44e2ea2e9cbff6bfcb4af4909fbb8bd3ab627e1dd1649d5faec28a71",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e904654f",
+          "shared" : "2b2c617f8c84713f8440e5e273341d69edf9e6ea2056af38ccfc6ee733a9c11e1f9aa63cb3615d2b3cebe69d8360a2bd",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1504,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200041e6c405358fab0f63c09eddacc372dd29c17d0eebcffe37975ee3c6bf05c7b8db09f104fcf6cc1a0576c44c12637b4bf88938d33d2d9390c1075f3af467937074db4022a44e2ea2e9cbff6bfcb4af4909fbb8bd3ab627e1dd1649d5faec28a71",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e904655f",
+          "shared" : "28518f75e020e00095d47166f7825f1767b6425172decde390c9266764c8b631608dc323b8415c39c9d0b8a24cd337ac",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1505,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200041e6c405358fab0f63c09eddacc372dd29c17d0eebcffe37975ee3c6bf05c7b8db09f104fcf6cc1a0576c44c12637b4bf88938d33d2d9390c1075f3af467937074db4022a44e2ea2e9cbff6bfcb4af4909fbb8bd3ab627e1dd1649d5faec28a71",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046562",
+          "shared" : "848a0d6b0714c8fb6b9d9208401ee6494c1f7e06252d1e80552bca6e49b9bbcd757f98722215a03b4b44d13b46ac5373",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1506,
+          "comment" : "edge case private key",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200041e6c405358fab0f63c09eddacc372dd29c17d0eebcffe37975ee3c6bf05c7b8db09f104fcf6cc1a0576c44c12637b4bf88938d33d2d9390c1075f3af467937074db4022a44e2ea2e9cbff6bfcb4af4909fbb8bd3ab627e1dd1649d5faec28a71",
+          "private" : "08cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046563",
+          "shared" : "4424a1b48eba0524e4aa82455e282b35cf0d13d8536fe6c410cd5050f3d4d1739254945a8f580d43ee0245b1df67de56",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1507,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c03620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1508,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c03620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1509,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec52",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1510,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1511,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c03620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1512,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c03620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1513,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec52",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1514,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1515,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec52000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1516,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec52000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1517,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec528cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec52",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1518,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec528cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1519,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1520,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1521,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec538cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec52",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1522,
+          "comment" : "point is not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c036200048cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec538cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1523,
+          "comment" : "",
+          "public" : "3019301406072a8648ce3d020106092b240303020801010c030100",
+          "private" : "183067d5099fde862216515d6e292c2ce56812a19b76849b5051c46db26452f54375e1e37567c7d62e63fc9604450411",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1524,
+          "comment" : "public point not on curve",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c03620004103e058f7a7d7f6f07dfbe36ac0a55e337e1ad2173f63e16aa222fe17fd3df25ec4e19f78ff9d82fcf6e15d8309abc3b7c0eca8258949207c018c48e005c285bb67506951a0f7e38372828b6ea2e23759e59b59312c5a81eb957d387500515aa",
+          "private" : "5e65bb285c4a1c41d27385c9995e30d1b9a687f4c70419f0c543b292a2b69655bc791414921d0eda3556b6d5e94d597",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1525,
+          "comment" : "public point = (0,0)",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c03620004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "5e65bb285c4a1c41d27385c9995e30d1b9a687f4c70419f0c543b292a2b69655bc791414921d0eda3556b6d5e94d597",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1526,
+          "comment" : "order = -21659270770119316173069236842332604979796116387017648600075645274821611501358515537962695117368903252229601718723941",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404308cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec5004307f519eada7bda81bd826dba647910f8c4b9346ed8ccdc64e4b1abd11756dce1d2074aa263b88805ced70355a33b471ee04610418de98b02db9a306f2afcd7235f72a819b80ab12ebd653172476fecd462aabffc4ff191b946a5f54d8d0aa2f418808cc25ab056962d30651a114afd2755ad336747f93475b7a1fca3b88f2b6a208ccfe469408584dc2b2912675bf5b9e5829280231ff7346e17d5cc792d7f0a29081af19be20ead08ef612aba94ce0e9919353fbda5830c5495094803cefc477cdfd16fb9a9b02010103620004103e058f7a7d7f6f07dfbe36ac0a55e337e1ad2173f63e16aa222fe17fd3df25ec4e19f78ff9d82fcf6e15d8309abc3b7c0eca8258949207c018c48e005c285bb67506951a0f7e38372828b6ea2e23759e59b59312c5a81eb957d387500515a8",
+          "private" : "5e65bb285c4a1c41d27385c9995e30d1b9a687f4c70419f0c543b292a2b69655bc791414921d0eda3556b6d5e94d597",
+          "shared" : "28f865e2f88cc5f63f3f4af24be32f2e3e9f49536933e833f383af8c11233d726eb12a251fa383660ac1901048e29bc1",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1527,
+          "comment" : "order = 0",
+          "public" : "308201853082011d06072a8648ce3d020130820110020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404308cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec5004307f519eada7bda81bd826dba647910f8c4b9346ed8ccdc64e4b1abd11756dce1d2074aa263b88805ced70355a33b471ee04610418de98b02db9a306f2afcd7235f72a819b80ab12ebd653172476fecd462aabffc4ff191b946a5f54d8d0aa2f418808cc25ab056962d30651a114afd2755ad336747f93475b7a1fca3b88f2b6a208ccfe469408584dc2b2912675bf5b9e58292802010002010103620004103e058f7a7d7f6f07dfbe36ac0a55e337e1ad2173f63e16aa222fe17fd3df25ec4e19f78ff9d82fcf6e15d8309abc3b7c0eca8258949207c018c48e005c285bb67506951a0f7e38372828b6ea2e23759e59b59312c5a81eb957d387500515a8",
+          "private" : "5e65bb285c4a1c41d27385c9995e30d1b9a687f4c70419f0c543b292a2b69655bc791414921d0eda3556b6d5e94d597",
+          "shared" : "28f865e2f88cc5f63f3f4af24be32f2e3e9f49536933e833f383af8c11233d726eb12a251fa383660ac1901048e29bc1",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1528,
+          "comment" : "order = 1",
+          "public" : "308201853082011d06072a8648ce3d020130820110020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404308cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec5004307f519eada7bda81bd826dba647910f8c4b9346ed8ccdc64e4b1abd11756dce1d2074aa263b88805ced70355a33b471ee04610418de98b02db9a306f2afcd7235f72a819b80ab12ebd653172476fecd462aabffc4ff191b946a5f54d8d0aa2f418808cc25ab056962d30651a114afd2755ad336747f93475b7a1fca3b88f2b6a208ccfe469408584dc2b2912675bf5b9e58292802010102010103620004103e058f7a7d7f6f07dfbe36ac0a55e337e1ad2173f63e16aa222fe17fd3df25ec4e19f78ff9d82fcf6e15d8309abc3b7c0eca8258949207c018c48e005c285bb67506951a0f7e38372828b6ea2e23759e59b59312c5a81eb957d387500515a8",
+          "private" : "5e65bb285c4a1c41d27385c9995e30d1b9a687f4c70419f0c543b292a2b69655bc791414921d0eda3556b6d5e94d597",
+          "shared" : "28f865e2f88cc5f63f3f4af24be32f2e3e9f49536933e833f383af8c11233d726eb12a251fa383660ac1901048e29bc1",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1529,
+          "comment" : "order = 5042941954480324912133914614639385831494842746066313376667826733277554507683616955290244686736004252971522",
+          "public" : "308201b13082014906072a8648ce3d02013082013c020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404308cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec5004307f519eada7bda81bd826dba647910f8c4b9346ed8ccdc64e4b1abd11756dce1d2074aa263b88805ced70355a33b471ee04610418de98b02db9a306f2afcd7235f72a819b80ab12ebd653172476fecd462aabffc4ff191b946a5f54d8d0aa2f418808cc25ab056962d30651a114afd2755ad336747f93475b7a1fca3b88f2b6a208ccfe469408584dc2b2912675bf5b9e582928022d008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b88320202010103620004103e058f7a7d7f6f07dfbe36ac0a55e337e1ad2173f63e16aa222fe17fd3df25ec4e19f78ff9d82fcf6e15d8309abc3b7c0eca8258949207c018c48e005c285bb67506951a0f7e38372828b6ea2e23759e59b59312c5a81eb957d387500515a8",
+          "private" : "5e65bb285c4a1c41d27385c9995e30d1b9a687f4c70419f0c543b292a2b69655bc791414921d0eda3556b6d5e94d597",
+          "shared" : "28f865e2f88cc5f63f3f4af24be32f2e3e9f49536933e833f383af8c11233d726eb12a251fa383660ac1901048e29bc1",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1530,
+          "comment" : "generator = (0,0)",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404308cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec5004307f519eada7bda81bd826dba647910f8c4b9346ed8ccdc64e4b1abd11756dce1d2074aa263b88805ced70355a33b471ee0461040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e904656502010103620004103e058f7a7d7f6f07dfbe36ac0a55e337e1ad2173f63e16aa222fe17fd3df25ec4e19f78ff9d82fcf6e15d8309abc3b7c0eca8258949207c018c48e005c285bb67506951a0f7e38372828b6ea2e23759e59b59312c5a81eb957d387500515a8",
+          "private" : "5e65bb285c4a1c41d27385c9995e30d1b9a687f4c70419f0c543b292a2b69655bc791414921d0eda3556b6d5e94d597",
+          "shared" : "28f865e2f88cc5f63f3f4af24be32f2e3e9f49536933e833f383af8c11233d726eb12a251fa383660ac1901048e29bc1",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1531,
+          "comment" : "generator not on curve",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404308cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec5004307f519eada7bda81bd826dba647910f8c4b9346ed8ccdc64e4b1abd11756dce1d2074aa263b88805ced70355a33b471ee04610418de98b02db9a306f2afcd7235f72a819b80ab12ebd653172476fecd462aabffc4ff191b946a5f54d8d0aa2f418808cc25ab056962d30651a114afd2755ad336747f93475b7a1fca3b88f2b6a208ccfe469408584dc2b2912675bf5b9e58292a0231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e904656502010103620004103e058f7a7d7f6f07dfbe36ac0a55e337e1ad2173f63e16aa222fe17fd3df25ec4e19f78ff9d82fcf6e15d8309abc3b7c0eca8258949207c018c48e005c285bb67506951a0f7e38372828b6ea2e23759e59b59312c5a81eb957d387500515a8",
+          "private" : "5e65bb285c4a1c41d27385c9995e30d1b9a687f4c70419f0c543b292a2b69655bc791414921d0eda3556b6d5e94d597",
+          "shared" : "28f865e2f88cc5f63f3f4af24be32f2e3e9f49536933e833f383af8c11233d726eb12a251fa383660ac1901048e29bc1",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1532,
+          "comment" : "cofactor = -1",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404308cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec5004307f519eada7bda81bd826dba647910f8c4b9346ed8ccdc64e4b1abd11756dce1d2074aa263b88805ced70355a33b471ee04610418de98b02db9a306f2afcd7235f72a819b80ab12ebd653172476fecd462aabffc4ff191b946a5f54d8d0aa2f418808cc25ab056962d30651a114afd2755ad336747f93475b7a1fca3b88f2b6a208ccfe469408584dc2b2912675bf5b9e5829280231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650201ff03620004103e058f7a7d7f6f07dfbe36ac0a55e337e1ad2173f63e16aa222fe17fd3df25ec4e19f78ff9d82fcf6e15d8309abc3b7c0eca8258949207c018c48e005c285bb67506951a0f7e38372828b6ea2e23759e59b59312c5a81eb957d387500515a8",
+          "private" : "5e65bb285c4a1c41d27385c9995e30d1b9a687f4c70419f0c543b292a2b69655bc791414921d0eda3556b6d5e94d597",
+          "shared" : "28f865e2f88cc5f63f3f4af24be32f2e3e9f49536933e833f383af8c11233d726eb12a251fa383660ac1901048e29bc1",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1533,
+          "comment" : "cofactor = 0",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404308cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec5004307f519eada7bda81bd826dba647910f8c4b9346ed8ccdc64e4b1abd11756dce1d2074aa263b88805ced70355a33b471ee04610418de98b02db9a306f2afcd7235f72a819b80ab12ebd653172476fecd462aabffc4ff191b946a5f54d8d0aa2f418808cc25ab056962d30651a114afd2755ad336747f93475b7a1fca3b88f2b6a208ccfe469408584dc2b2912675bf5b9e5829280231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e904656502010003620004103e058f7a7d7f6f07dfbe36ac0a55e337e1ad2173f63e16aa222fe17fd3df25ec4e19f78ff9d82fcf6e15d8309abc3b7c0eca8258949207c018c48e005c285bb67506951a0f7e38372828b6ea2e23759e59b59312c5a81eb957d387500515a8",
+          "private" : "5e65bb285c4a1c41d27385c9995e30d1b9a687f4c70419f0c543b292a2b69655bc791414921d0eda3556b6d5e94d597",
+          "shared" : "28f865e2f88cc5f63f3f4af24be32f2e3e9f49536933e833f383af8c11233d726eb12a251fa383660ac1901048e29bc1",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1534,
+          "comment" : "cofactor = 2",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404308cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec5004307f519eada7bda81bd826dba647910f8c4b9346ed8ccdc64e4b1abd11756dce1d2074aa263b88805ced70355a33b471ee04610418de98b02db9a306f2afcd7235f72a819b80ab12ebd653172476fecd462aabffc4ff191b946a5f54d8d0aa2f418808cc25ab056962d30651a114afd2755ad336747f93475b7a1fca3b88f2b6a208ccfe469408584dc2b2912675bf5b9e5829280231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e904656502010203620004103e058f7a7d7f6f07dfbe36ac0a55e337e1ad2173f63e16aa222fe17fd3df25ec4e19f78ff9d82fcf6e15d8309abc3b7c0eca8258949207c018c48e005c285bb67506951a0f7e38372828b6ea2e23759e59b59312c5a81eb957d387500515a8",
+          "private" : "5e65bb285c4a1c41d27385c9995e30d1b9a687f4c70419f0c543b292a2b69655bc791414921d0eda3556b6d5e94d597",
+          "shared" : "28f865e2f88cc5f63f3f4af24be32f2e3e9f49536933e833f383af8c11233d726eb12a251fa383660ac1901048e29bc1",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1535,
+          "comment" : "cofactor = 21659270770119316173069236842332604979796116387017648600075645274821611501358515537962695117368903252229601718723941",
+          "public" : "308201e53082017d06072a8648ce3d020130820170020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404308cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec5004307f519eada7bda81bd826dba647910f8c4b9346ed8ccdc64e4b1abd11756dce1d2074aa263b88805ced70355a33b471ee04610418de98b02db9a306f2afcd7235f72a819b80ab12ebd653172476fecd462aabffc4ff191b946a5f54d8d0aa2f418808cc25ab056962d30651a114afd2755ad336747f93475b7a1fca3b88f2b6a208ccfe469408584dc2b2912675bf5b9e5829280231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e904656503620004103e058f7a7d7f6f07dfbe36ac0a55e337e1ad2173f63e16aa222fe17fd3df25ec4e19f78ff9d82fcf6e15d8309abc3b7c0eca8258949207c018c48e005c285bb67506951a0f7e38372828b6ea2e23759e59b59312c5a81eb957d387500515a8",
+          "private" : "5e65bb285c4a1c41d27385c9995e30d1b9a687f4c70419f0c543b292a2b69655bc791414921d0eda3556b6d5e94d597",
+          "shared" : "28f865e2f88cc5f63f3f4af24be32f2e3e9f49536933e833f383af8c11233d726eb12a251fa383660ac1901048e29bc1",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1536,
+          "comment" : "cofactor = None",
+          "public" : "308201b23082014a06072a8648ce3d02013082013d020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53306404308cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec5004307f519eada7bda81bd826dba647910f8c4b9346ed8ccdc64e4b1abd11756dce1d2074aa263b88805ced70355a33b471ee04610418de98b02db9a306f2afcd7235f72a819b80ab12ebd653172476fecd462aabffc4ff191b946a5f54d8d0aa2f418808cc25ab056962d30651a114afd2755ad336747f93475b7a1fca3b88f2b6a208ccfe469408584dc2b2912675bf5b9e5829280231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e904656503620004103e058f7a7d7f6f07dfbe36ac0a55e337e1ad2173f63e16aa222fe17fd3df25ec4e19f78ff9d82fcf6e15d8309abc3b7c0eca8258949207c018c48e005c285bb67506951a0f7e38372828b6ea2e23759e59b59312c5a81eb957d387500515a8",
+          "private" : "5e65bb285c4a1c41d27385c9995e30d1b9a687f4c70419f0c543b292a2b69655bc791414921d0eda3556b6d5e94d597",
+          "shared" : "28f865e2f88cc5f63f3f4af24be32f2e3e9f49536933e833f383af8c11233d726eb12a251fa383660ac1901048e29bc1",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1537,
+          "comment" : "modified prime",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008a954df26c950b69dea5d7a1f618e8a857992af1ca377397a279cf1b6175c6adcf2cb92cc86979370f9353e6e9dde977306404300223d09036a361be30b797dc5acd5936bd964618231ce31c70380afe1e414a75dda6edfcc7b3a13a77b3ac2c472a02d904307f519eada7bda81bd826dba647910f8c4b9346ed8ccdc64e4b1abd11756dce1d2074aa263b88805ced70355a33b471ee04610400000000000000000000000000000000abc978d6d0960000000000000000000000000000000000000000000000000043115a6b5bf3f7ac0febbfc666b4d9bae909618d1f66c0ff2a98aae7f9826ab6cac198935e14306cb5642dbc5806578afa0231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650201010362000400000000000000000000000000000000abc978d6d0960000000000000000000000000000000000000000000000000043115a6b5bf3f7ac0febbfc666b4d9bae909618d1f66c0ff2a98aae7f9826ab6cac198935e14306cb5642dbc5806578afa",
+          "private" : "5e65bb285c4a1c41d27385c9995e30d1b9a687f4c70419f0c543b292a2b69655bc791414921d0eda3556b6d5e94d597",
+          "shared" : "0153579c1b4b8781f02ffd3097416ed0a58b0f36fa94eb7b958f386d5f184eb82ab293ba416da606f0f71c8835c6d3a0",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1538,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "5e65bb285c4a1c41d27385c9995e30d1b9a687f4c70419f0c543b292a2b69655bc791414921d0eda3556b6d5e94d597",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1539,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "5e65bb285c4a1c41d27385c9995e30d1b9a687f4c70419f0c543b292a2b69655bc791414921d0eda3556b6d5e94d597",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1540,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "5e65bb285c4a1c41d27385c9995e30d1b9a687f4c70419f0c543b292a2b69655bc791414921d0eda3556b6d5e94d597",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1541,
+          "comment" : "a = 0",
+          "public" : "308201863082011e06072a8648ce3d020130820111020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53303504010004304e978dff384529cec087a10243720de2a3ee3f8930eb0c0a4cb42d6cf5f230ab5b8a5c3f8b9af7cd7f25f3d1a1e43d3d046104103e058f7a7d7f6f07dfbe36ac0a55e337e1ad2173f63e16aa222fe17fd3df25ec4e19f78ff9d82fcf6e15d8309abc3b7c0eca8258949207c018c48e005c285bb67506951a0f7e38372828b6ea2e23759e59b59312c5a81eb957d387500515a80231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e904656502010103620004103e058f7a7d7f6f07dfbe36ac0a55e337e1ad2173f63e16aa222fe17fd3df25ec4e19f78ff9d82fcf6e15d8309abc3b7c0eca8258949207c018c48e005c285bb67506951a0f7e38372828b6ea2e23759e59b59312c5a81eb957d387500515a8",
+          "private" : "5e65bb285c4a1c41d27385c9995e30d1b9a687f4c70419f0c543b292a2b69655bc791414921d0eda3556b6d5e94d597",
+          "shared" : "28f865e2f88cc5f63f3f4af24be32f2e3e9f49536933e833f383af8c11233d726eb12a251fa383660ac1901048e29bc1",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1542,
+          "comment" : "public key of order 3",
+          "public" : "308201b53082014d06072a8648ce3d020130820140020101303c06072a8648ce3d01010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec533064043059eb964ea2af01c01cbb851067f8a4ff49f133595f7c4a96fa061391573efdc74659374d4199f41b65a7d1eeb69a5cb10430133472e471b1a7cd826fb1a478ef7ec836cc41e74d84f36813b09902702bac95b12ff74739b0365e462a00caf9b9654f0461046b1c31e41c9038f55a93388ae18f6d56c0d3e225de08619c802a918c922834c74bcbc3eff9d156a62515185898885bf07dc1b50c1c1ab46c4aa4340087773a0d446fb407805bdd7fd16c0b98876f4acb27b03e7c42d63b8d49cacbb3a012c72f0231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565020101036200046b1c31e41c9038f55a93388ae18f6d56c0d3e225de08619c802a918c922834c74bcbc3eff9d156a62515185898885bf00ef76976871db8bbc4b93b7dc96f07d1d0bfbd026cf879344145ce80f847c658852368ad4d46dee43d7c345f90f52524",
+          "private" : "5e65bb285c4a1c41d27385c9995e30d1b9a687f4c70419f0c543b292a2b69655bc791414921d0eda3556b6d5e94d597",
+          "shared" : "0abf0e1143cc9e855a183344a91ceb53f8363001839f0a752bcc66410dc0dd4bb8647fc690c234b8fca61a2695afcd67",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1543,
+          "comment" : "public key on isomorphic curve brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b036200041af667fa3ab0337b0f9b51a711f2c5a3ee1d4fb01d5c8e311445ab2c4decc9c22346913f922114b728a312b117d0196f8314ff6d47f8aaf66b691b5ebd80fbcdd92029c16340eb7767266a34b98ef5e2666fdd6a2b3bcb7cdaee4731ecd85141",
+          "private" : "5e65bb285c4a1c41d27385c9995e30d1b9a687f4c70419f0c543b292a2b69655bc791414921d0eda3556b6d5e94d597",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "IsomorphicPublicKey",
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1544,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a00047ac0f84b83f54c8978ac99a99f59f96e372e7dcfc79178fa0a94bc4269c5a28643dbcd4aed0e6140303a9b2287cb8386f5294d092fdd437b",
+          "private" : "1eec948715768c1214363bd806a44d1ef49325c1980dc21ac2a0b1560d9b5cd6575b749eba07186c2f9efb223ca786cc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1545,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d0e57e36999fd97937a9572777bf1793b5b5f8602b06336861a11d297db2bc7a0be71602be26715cf969aad360890901a1a6da732eab1c04ff5b622d7e1a2452",
+          "private" : "1eec948715768c1214363bd806a44d1ef49325c1980dc21ac2a0b1560d9b5cd6575b749eba07186c2f9efb223ca786cc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1546,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b810400220362000457aa0e44ae28fbc60e90c712af4f0777481db35c814947220f28a0aef3eafcb7541a617f9178677e365dd211eff8d33de315a1af94b324568f2a5f5fecf2b40df020f00e2099a321eeb89b4a00789874d39df773697f71d6fe40136d19a54ade",
+          "private" : "1eec948715768c1214363bd806a44d1ef49325c1980dc21ac2a0b1560d9b5cd6575b749eba07186c2f9efb223ca786cc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1547,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b8104002303818600040069177be0f70388923f6d51e7bc289f262f1f2e4cf7e7f16054f8cc1fc775312e7b0e9e8a91e69723c8f5bdaa227c19dc622c8a7c67962ea7dfaec8fb70d99e46ee00bf0d3d39286fd1e54d224b7ba9e532568e5008db402b91ecfd88bd545763cd857accd82fc87102b0ebe4794a9d810c81176354aeaf57fc9931e3cf194dc8d998a4",
+          "private" : "1eec948715768c1214363bd806a44d1ef49325c1980dc21ac2a0b1560d9b5cd6575b749eba07186c2f9efb223ca786cc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1548,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200042effdd981ca54447ff1a95722531fa5d1fd3aab79950f8bfc3a84f10a449d4e186054eb005da0a9d36e5136f4930f7b9e38299ac0239f3a06dbf8b415e53f01e",
+          "private" : "1eec948715768c1214363bd806a44d1ef49325c1980dc21ac2a0b1560d9b5cd6575b749eba07186c2f9efb223ca786cc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1549,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a00044f51fd668da1be3704120e4c38a630d875966bea78b04e7b96101bc4aacd4de2f0e1b016bf47f1ee73c70d82aa89bdbad197b0ae436326ce",
+          "private" : "1eec948715768c1214363bd806a44d1ef49325c1980dc21ac2a0b1560d9b5cd6575b749eba07186c2f9efb223ca786cc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1550,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010703420004828c67c6cf21ae6f03eee6dd851a0bcac9155b146ef729d30234782733b85b341ff0bd8de61046d37f7e851159fc4e793628a49437e18169bce739370cda9924",
+          "private" : "1eec948715768c1214363bd806a44d1ef49325c1980dc21ac2a0b1560d9b5cd6575b749eba07186c2f9efb223ca786cc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1551,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b24030302080101090352000439e980d68ad99b7f29ab42290b214ed2685a08ab0dac7e0c31f6676471a7b31fc140523b04a3a6bc4019e792efb20a960eb35251c5468e1159ba2a599a3e0eb87d5b1e3153fb6fcafdb1f940fc302c72",
+          "private" : "1eec948715768c1214363bd806a44d1ef49325c1980dc21ac2a0b1560d9b5cd6575b749eba07186c2f9efb223ca786cc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1552,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b03620004750c5d8095fa65163937b8eb53f727bc393763e80561abc0238a3db4d501479230520148912f30a59c408b6ca68c4afa668c345958aa1fd0ba8fd857ee72e117af8286b6684f0d723ac2fe1de0454a0317ec730dd5c193f4ff8ea1a1b41fd4f3",
+          "private" : "1eec948715768c1214363bd806a44d1ef49325c1980dc21ac2a0b1560d9b5cd6575b749eba07186c2f9efb223ca786cc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1553,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040c17f07e6a2cdaf8e9b5967c452a7bc78fc1cf4f45ff65f0663c59fea42a39b7360c10587fd4e347582278f2d860889f0d98d2dfc599cc11f825ae90947a95907395bb60dc0f29725dc26deca5fdcfaf30b9559a711297b8267de25f5933f7a06fcf1d7a00a068ce2f24321d2ed08e5a8ed037193332ea92d2e55deccab47e33",
+          "private" : "1eec948715768c1214363bd806a44d1ef49325c1980dc21ac2a0b1560d9b5cd6575b749eba07186c2f9efb223ca786cc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1554,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a000495ec1dd9eab2a77ea8e78c6ed4593eb1db3e00328eabb07c369e7e6f9be2488cbfa29c45e7097e371f59f5f7df87aebcd85f2bce635d876c",
+          "private" : "1eec948715768c1214363bd806a44d1ef49325c1980dc21ac2a0b1560d9b5cd6575b749eba07186c2f9efb223ca786cc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1555,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010108034200041c380839b90fde53c39d58aa26b42ed2060d06dc82f8cb07473966900df128d63f39dfdd88a626145253b3050511e3fa9d1858c01af97e6f5e8d27d3fef5d644",
+          "private" : "1eec948715768c1214363bd806a44d1ef49325c1980dc21ac2a0b1560d9b5cd6575b749eba07186c2f9efb223ca786cc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1556,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a03520004bed26c93ba758a66e04f9ffbfd2e447e472125f47af18f9c360bdbb2bb4b6bf037c4b0352bdf7fb5c3ea2f896c56abf8fe17727b5ef35400ba59acad10522d47deb6474bc96d94ee5e1cf61bf3ad3203",
+          "private" : "1eec948715768c1214363bd806a44d1ef49325c1980dc21ac2a0b1560d9b5cd6575b749eba07186c2f9efb223ca786cc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1557,
+          "comment" : "Public key uses wrong curve: brainpoolP512t1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200041ef6bef116a0bbf87cf2554bee1282bd763fa5c99be5f70676c97ae3acc4db8625b3178f33ca20a13dd2bb259747ee5b777585d90d1205392591b528783cfd8b51fca36e4af443baae8ea5b1d46dcdad5a22fd88641e4cfa010f2128f680c6e71c2cd5da0ab5970e87f49828c1e57996910812141451b728493b95ea94c36523",
+          "private" : "1eec948715768c1214363bd806a44d1ef49325c1980dc21ac2a0b1560d9b5cd6575b749eba07186c2f9efb223ca786cc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1558,
+          "comment" : "invalid public key",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010c0332000243c51b92c31fdd61ee533853fc660d6ccf4d4903dc0a996cf2968cc894d97f9709d92352ee4b93ed23ff618de79e4d30",
+          "private" : "258474baf3b3b83f1f4cc0ac7645677d5d56a40f787d992ac5109894aa372acb87883f74bc6351a31bc66c62dfb82a83",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1559,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010c0332000308f31234f87497b1baede9bc74c1f666a5db957d5b5892ef3cad56db448ffb4bb59976a820f0572e95d4e7771afbc12f",
+          "private" : "182315ca6c80fa1f76ec0bb5a35991b97e4f9ada272989120a2c6dc5fe3020d047ef5c13a0fa505d21d250eb39c5e9ef",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1560,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010c03320002084478797447194423242feecd06000d175087de6adf6f2b782582f424234c48895c356326e8d1550fc0409cc1a4ecad",
+          "private" : "087924186cfbe513dc94b16a5e8ff0e86b0da8d6115fc44ce9d08bafd2636299e498649fe9b1bbb507de2c729a88422a8",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1561,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010c03320002024278cf56415a234792dae6c22e3c3d70517d4350d91d395b54f1ff360bac0a5b19473d6476d1e0585b1b1dbb2132e9",
+          "private" : "1598ecfcc3c9f76dfb758cd572def7a8f36aa348af6c31fb29d59b7f06a8e851b6a5c9e965e6734e5ffde5b0de6388ff",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1562,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010c03320003024278cf56415a234792dae6c22e3c3d70517d4350d91d395b54f1ff360bac0a5b19473d6476d1e0585b1b1dbb2132e9",
+          "private" : "1598ecfcc3c9f76dfb758cd572def7a8f36aa348af6c31fb29d59b7f06a8e851b6a5c9e965e6734e5ffde5b0de6388fe",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1563,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010c03320003084478797447194423242feecd06000d175087de6adf6f2b782582f424234c48895c356326e8d1550fc0409cc1a4ecad",
+          "private" : "087924186cfbe513dc94b16a5e8ff0e86b0da8d6115fc44ce9d08bafd2636299e498649fe9b1bbb507de2c729a88422a7",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1564,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010c0332000208f31234f87497b1baede9bc74c1f666a5db957d5b5892ef3cad56db448ffb4bb59976a820f0572e95d4e7771afbc12f",
+          "private" : "182315ca6c80fa1f76ec0bb5a35991b97e4f9ada272989120a2c6dc5fe3020d047ef5c13a0fa505d21d250eb39c5e9f0",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1565,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010c033200027d0672c75082f962546a912c6e2351cd82d181c1eb316f99ddbe275ffa813e444227d4ee6c71a4fdd5409a1e99ec7c04",
+          "private" : "0b247883eb43b626d4dd53cb6325f7d76251242ef8ef3a07575e88546733d41cf50f293daad93b8de7b52d348b0c665e",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1566,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010c033200033ba6755e4d8992ecc3976c92953bbf463ace5e46b5833b5de9761529103fcd74446e4d717f8dbc77d1c99279f4cf415b",
+          "private" : "6dced8bbcb6140c1f19fae2071fe0c4a569f054e087c9c9c010daa0bcf0bc65007afa96e514218b6aa10510e7de7d7e4",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1567,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010c03320003261a23060a03986991e258259009ae06c6ba0e178b1aa6fcd5644a526b785237669657c553c1aa82ba8919491d4baba1",
+          "private" : "26e8f29d60877d0b679d3369ff9affdd0eaee3561fb4e7042171b87c2d9f32acccd9490b61df4136ff40f6ac402b2792",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1568,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010c03320002543b22c977fbcd346ea07742d2c653d2a455a745a69785fce27d7a3a9a359540a8abf5bd6eb3e3a3a53bc2c0d388e260",
+          "private" : "5a758a0369caaac2762c2f2bd6b6ab72886d320217be216efe48d4914462a569891bb40aef439b27bc27e65b63b3c1c6",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1569,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010c033200036b702f8dace776a80eab194fba1be0a3272058e715ddb6aea3adc5881ad59ca4f043f524783a8a00a5886a56acacf4c6",
+          "private" : "40e732db5e20b27e027336cd5261ff64c915e2ebbfb3844b71e854c069f2fe187cd816b60321a84414f5cd6967036bf",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1570,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010c033200026b702f8dace776a80eab194fba1be0a3272058e715ddb6aea3adc5881ad59ca4f043f524783a8a00a5886a56acacf4c6",
+          "private" : "40e732db5e20b27e027336cd5261ff64c915e2ebbfb3844b71e854c069f2fe187cd816b60321a84414f5cd6967036c0",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1571,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010c03320003543b22c977fbcd346ea07742d2c653d2a455a745a69785fce27d7a3a9a359540a8abf5bd6eb3e3a3a53bc2c0d388e260",
+          "private" : "5a758a0369caaac2762c2f2bd6b6ab72886d320217be216efe48d4914462a569891bb40aef439b27bc27e65b63b3c1c5",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1572,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010c03320002261a23060a03986991e258259009ae06c6ba0e178b1aa6fcd5644a526b785237669657c553c1aa82ba8919491d4baba1",
+          "private" : "26e8f29d60877d0b679d3369ff9affdd0eaee3561fb4e7042171b87c2d9f32acccd9490b61df4136ff40f6ac402b2793",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1573,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010c033200023ba6755e4d8992ecc3976c92953bbf463ace5e46b5833b5de9761529103fcd74446e4d717f8dbc77d1c99279f4cf415b",
+          "private" : "6dced8bbcb6140c1f19fae2071fe0c4a569f054e087c9c9c010daa0bcf0bc65007afa96e514218b6aa10510e7de7d7e5",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1574,
+          "comment" : "public key is a low order point on twist",
+          "public" : "304a301406072a8648ce3d020106092b240303020801010c033200037d0672c75082f962546a912c6e2351cd82d181c1eb316f99ddbe275ffa813e444227d4ee6c71a4fdd5409a1e99ec7c04",
+          "private" : "0b247883eb43b626d4dd53cb6325f7d76251242ef8ef3a07575e88546733d41cf50f293daad93b8de7b52d348b0c665d",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        }
+      ]
+    },
+    {
+      "curve" : "brainpoolP512t1",
+      "encoding" : "asn",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1575,
+          "comment" : "normal case",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200049772e567580ed9a9628cba4a948477d384d5e16c106a8d3216013ca557aa0bd1a4cdee0fa560d2935338f523fc612b7f0eb234aff15f25640adae01ed07a061c541bb6ead18e9bbc7ef04d8c542725b6e35d4da608accd3a284d050aee19ab14ada0dc01185019b6bf133c04721488f8ca80a6ad13b99779cc09aa9a97ad6828",
+          "private" : "09c68746bfa3f4a439e987eea3478d442c96890a087605b619b62cecbe6c6faac77469feedce3e22dfd42a6d1edc8a05badbcf4002be553854db31da4fecfddaa",
+          "shared" : "3d71c1a08960df3e3fce6e57a77e69d3da6bf452bd5a2e8e458122402a1cc1ef4598d6826123a26493cab73253bb6992fbc5ad95b234e7068540fd190285bd36",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1576,
+          "comment" : "compressed public key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010e034200029772e567580ed9a9628cba4a948477d384d5e16c106a8d3216013ca557aa0bd1a4cdee0fa560d2935338f523fc612b7f0eb234aff15f25640adae01ed07a061c",
+          "private" : "09c68746bfa3f4a439e987eea3478d442c96890a087605b619b62cecbe6c6faac77469feedce3e22dfd42a6d1edc8a05badbcf4002be553854db31da4fecfddaa",
+          "shared" : "3d71c1a08960df3e3fce6e57a77e69d3da6bf452bd5a2e8e458122402a1cc1ef4598d6826123a26493cab73253bb6992fbc5ad95b234e7068540fd190285bd36",
+          "result" : "acceptable",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        },
+        {
+          "tcId" : 1577,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200045a9c9895b7d2d87bc45ee650412053bf8692541fe5496f9ad90db99e11b715adc3516119d6078e25a0a12eee0f78c41cadf985fea0ed6c78236d73527decb8ca92c7efb8b6f77550e133431631762469edcf47860005c57d5d327c3701c0a5bde751d3a6c6b616a4238139d3de9fecd49f6a0ca7d8d781bc6a51723ba38ea0c1",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1578,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200043c7c982bcadd9cc5f01e9f6b59340ea20dfc86537f7a108d54ef0a6043ab2d673c798d6fc4bacdc9ff03b305df7c093353fec7ea4a05d44a5f14c4183485875969f916747d9254c9ee268ab630deec327b9e22cc743acbd26835ded65fd370a7445b819f2a9b7da69559e38960b109b21083057ae545011286d727b3d3c56166",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1579,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200048f4ad4e364fb67bd09d65819b8a66770e3d259285e2b8c9c80ef2f77c6fa189142045a6852d2ec76c13ad95ada8379539919f5897011d0607aef0c35edd8946314aaba98f1dc6d60dc898f0c7e9b12840d17cd3feb73e257f3a7d123a33d0732c1b9cb24e1542be1679d818cdf6fed41f5c035278c3d4f61e0d2e89f709e3681",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "00000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000100000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1580,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004798fe077872c658c3fd371254608cee9f2f5f42e92ee35ee6125a4f6605ffdc53ce8ebe4e5b2798b27e783453fc014cb9795fe67264c635bf6964398ae0099961f18832e3ac43fccd1eff6ab0562b299d07828be07e88630c52d46e843cd548390882560fefb894b4c508fc2583ee83ddb4e6f526fa9a900fe5cd5255da071a6",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff00000000000000010000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1581,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200042346fc0a8a940a6376e5d33e9b6d138e94d1974574f04ab4690c2d659a29f0c95eaa84a587f430e9ed64f00ba31d126782f61f10399afbabca2f6098b989b6bb93e0ea737c087430de82f33b19704a9532b2b5b5f85be769849060f6ccf7bbea0333c5e6f2635ae4abd83e6df07abf1a5ba8723e7fd3e0f5282427c324b781a9",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1582,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200048248ec801efc1fd243b02bc1cc2584a803101650d11ae37c29692f4f61615e3f5a29b89a6fe90b550e0a32c9dee8a680e4b803393524f121904e0ad622bbf9024aaa3105957b850a862e3b11aceac76489cfce4ffe72f465d1867fa93f9a36ce62e6668f19c360458a2d5525ce4e2b5cb555cf47799c264ae6e57e35c2737436",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "00003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1583,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200048d33dec860efdd797ecf40fbc9b83f5bd2a4e4295b5f02643222a930885457f80b40fd0bd0481c70b8e661876984ca69995043e4554ac60cc3bacd938d5e34da9487ad24617debb027ee0b0a722abb3b6fc2b82485dee1a069edaf9ae8484ff72a9d2410c9d7404fa86de02bbdfc02568015b071ceac10e9e89e3c38f4284bad",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1584,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004002eeeae6725adaa9e3b23ed16490888e360b1de5e6daa29b5dbba868ba7039e4927438d22a6e2ff76da75d2acbb2bf8e5b06fd85f70eb0f8b81b05510fd7d44a652d93f575182c55148b699f1d8808ab56d2f5cd52d1aa10f8636fbc38a8d5fff5728d2102756131d1ce6e86d78ce29edf23d47893d167ae2352e570ce9fbcd",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "00ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1585,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e038182000435c4f286853b5c0dde03df00126c26b4e501ab1f064f1ef2635ee26f130383f9d2cad97278860c624a68ca805838999133dae484205267e9b572d644ea1cb9bd4d4fe3c39278771d5634ecb844800acb5c4c01bce7ab45ef5991e700cc07ac938abd621134d3cce6bd00c7b4324b5b06bfb6551887381395163340e1a2c786e6",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "1cfd8090beb0e73d73930052066139cf5eb5b804cb1bdc6b4e9a9d5cf0cf7a0022772cb4bdc90365e92f5d4fc0dcde0db52f6d3af7791d110b9d5a482b14b35a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1586,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004a01d1e2a3d7e3157ee38d1261fbba9bac59eee2541af6009dd6db3a0aa0f551aad6e62720f0a202e60bc0a028310cd8cb8fe9d3e15525cdfa5ef45cb0fdc5b7b358b37a2276f690b5454d828acdf2077e6e207ed63b3436527a6facfa6b0afcae96e8d556a605252cd4d6640c8f0098fb207babd6e471e8718c8e84e58b2f8ca",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "34f9de74bed55e40df90a5e729c27f1edb29d2ca0c91ce2ca612efa625e55d8f1b8ca4a23ab0cd9152b832d31a0c8ff67e2d0ed88c23c356ee49b9331f502b54",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1587,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004568d777955663dcaa04168e553a66b3b2076ef5e65f59bc050ed798f34194fa64467d20f694b69245351ff9bcc9185e373c1e3cbb273844933ac873c5be9807204ba6fe9c306177184671ee7a355e3d2fdacfd87022c064fe4630d21b5447081fc94baea0f0e201c75460d2a56326399cf39ce89e2ff0fde8d15e455f70765da",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "3fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1588,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004623464b3e5fa4cabe116cea354d734de1645101810808d90c5d51f893dde2e35e05c0a913ecb6ee630037628ea4e773da203fdbfa844a8c1430a0130da893bdc4dec5d7b468bc151dd5c38722c92ce2fb5190dd803c05a0cd80434f1460da36993068a7a639ddae6a90fe81319bf8113894965cf94f906052404c4e86724323e",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "4000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1589,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200045a1950942434528205a1a3cf54026b4741a9297ddeaebe2edac85f12bc4f45acc48e4fc83cbf6e228bcb1f3769687c5a95d8b69dd21c1fd365b64ae98a725b7397cb87b963eec9aea147b007d732784c2f5066216be7c4bd8b6b44848f0a4788e0f4a59441e2057b8ac4b82376133085828e41d55c774a74fc31ca97f80a6042",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "40007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1590,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200046295a1d85ef3f4ee6ca87b042a05d4c398ac6d5a503e8299fc8efc98d8256702f8449ef4ec8b8b9bcdf02db868b32b81d583b12237652e3a5649bcd5353f5566106ca852761a661207a89d0b88b126146cf665da1fb65d89753770f3805b2581280a80eb78d565e9f88150f658647d9883a64cd4a6f7e3e98979ae6aea29d88b",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "49ba9a7a28bce1499b99d9d0bf6f53f209e7a837af242b1c7ed82599d5f1b6b2291caf32fb219f800441fbcdf530158cbb54034c5d6ebaeab84f587c79eff84b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1591,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e038182000479a6cd2e2c2118b9bbe6921653d996d1bbe4818e996bce1a8edf2918a98627b92d36245c0e2141fe111a3d9e82602c408ce029c7b38589083155ccd3bb033cae5596c9596d7ef72ed8cf06cf6392d84a84d31170847ca2e50109a4d371bf4edbe0e02eb075158a1f58165548244901436d380e2a174384e97f7a1a156315cdad",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "7fff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc000000080000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1592,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e038182000495e93d3fb84de7df8e321ac2b0e93687f73abedab863e862434d16348690f5f234155f08867fcf321957d99ee0b0a1f53a815256d38d7c72953a3169941c681055f60b559c0f665cbfcd9ee16338cf99c54f11c8785b925c4b3ac992f8d64c744b182837dc611ec1e2b8f11fc9dd93b983a6c07c5049810ecf2f01aa682f5da5",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1593,
+          "comment" : "edge case for shared secret",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e038182000418d64900602b4fea02d596365dbf38a9ba876243c45b5df6c3dc51d32fbeb5e5bfa569dc48ba681134dd38abb36702c45ea5ad97bd5fb59b72ac7af7880f779316a6ccd37112d588d4f3f675a0cbfd743f4b263544ccc1c633cc26e4300546e74f56a583dce49150e3451118ca2ab2a7efe35c5e4889c497506c3ff50a131f61",
+          "private" : "0842479c31f83056da807c6bff582540644ed6a3bbc4a5226cf3a21e918ef36e0616c8c6ad4bf13faca900dba60b6761cb07b0ddb01673ae31477e095cd211b4f",
+          "shared" : "aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1594,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010eb28f88ddc962de75542ff578b6104f4d713b25bae50d40bf91008805605972952e7f2a9df7e8e1dd14a461d3973779d24383f20b77c604cf69f8eb5cbace9e",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "46f301c8200fac3c3a3fff3dc63dd1a934773203853b889370c339a4052e0b7cd00ceecb14de015143605f9519efe574d820efbbcacceb81ebcf5c285f09ae29",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1595,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000303e343d3e9319c1ab5546a85fa0514db8d35578015c114f24fab29744653a2ff0dacac254d1ded8b5f41df4600513a8668a523f41e4c73b43ac2f79c9d755d64",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "1477ab84d09a82bc69becd363a893ead8a0c98b2ae4ae0b54e587618a875624881d74bcaedcaa039e0f51164fa72db5d6dd2be89bb5cf2786229ecb79cf8a0ff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1596,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e038182000400000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000001000000000000000000000000000000003476dfaa119072562787ae26f874a935533d4c77d301527a9adeb905acc4643afc580341bd05ae4f63af976b081d22c93d466abecd2dd3b3a9394d15c54d1e17",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "30a3385580163154bb0ea3e5c82e38ea101f754757d279e716663f464adb61c1a665cf5c79db6eea70e0a35ea1d1c9a8c003f13030a5226795daec0507e1893e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1597,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200040000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff000000000000000100000000000000024c9633e8b5525809dd879c06a36b71d84dc39d494d6c20aa3d00518b71d8f44ec979e822efb73720c03a8514562f29b1417882a9298e25abeea9b26026e31c8f",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "4606c80ce9849a3399a5262756464fd90586ead9ca9e85b1766d525a1e8fb1e8e2f312fed3209cf60212e0ebe108d68458d0fabb516f506edd74563f4b188ea1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1598,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e038182000400000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff53d8547a993679babfed1d48e51368fba3d5c9c7a79e4d0a0419eea708e9759825cd72ea1940aafaca35ece726032fbdf82c7d2a2b0450f95cf68cd3019d9ae6",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "3c46a894ebd9b3d948444c55ef7dff0f5043abab0f505486ec4724dcdb32e9ddf1c032e50c9c8bcde8337ab67c2ecf7f41e079ee870f618b65a6e8c8a680583d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1599,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e038182000400003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff000000400000044ab2902b151d5c267dfe90293a52e42eea125240ea8bb0f2ed2414d47362daad93dd5a9a1630e7c5b79943b46858cc0721572cb6b9a8e1c69fe995c7deac65a",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "a374270ca06a0d55fbcc3dd7e1640eb90de33c217d87d4fb9113dab551d74ca997f0c24c7cd1f41465bf02e603738509f29e538ebcfd2b642a595ea4d61bffbf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1600,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200040000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff1345bf06047f22990a083feb027722bdcecdc6a056f02ad60d86a3144ab6ac726a0e8d634f1a54d538a432aff9f68049768cbc618cf4f386eff0762d85832dce",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "75c4617e3f4412b69ecbffa2230ad5dd628dbd278bbb6abd3bfdc649930f0c7394b401b8f069184410779ee5e712816993b66aca811c9c0cf93d9c62ca03723e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1601,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e038182000400ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff10f5d99c748dc7ace19d904aa832daa6f07e5fc0ea90c537de422ada8388c68184b91d5d6c61935d61ccef2d36ff808717cacb15c2804d01c98d6df3fd366870",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "44c88ff638e753e16df66c739400fcd9d463721691358dedb6b5d0798c9f161411cf1527786d4c84e77c2d8159b81a0ec653f5b29ac5bc20c9c914b9228894b0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1602,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200041cfd8090beb0e73d73930052066139cf5eb5b804cb1bdc6b4e9a9d5cf0cf7a0022772cb4bdc90365e92f5d4fc0dcde0db52f6d3af7791d110b9d5a482b14b35a04e621d8299155a18d68d7e568f664d54dc4d2de64f8fcbead71916e10a490364d2f6af268a9d4fef484abb20af4ab0598a7ecdefb6fa556b3d7e038e8e0d3c6",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "100c9dc6f8a3f560b6c82c634ae131931573aecfc339e5adcdb41e076c0d6194c2712e20da819260c7fc747b8628fdfd28b85e748064501e5ee06d067efa5b01",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1603,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e038182000434f9de74bed55e40df90a5e729c27f1edb29d2ca0c91ce2ca612efa625e55d8f1b8ca4a23ab0cd9152b832d31a0c8ff67e2d0ed88c23c356ee49b9331f502b54458925a9496c13513edf939b9dd9bd263368d5a6013723650316869ccef5cbb2d77131ab2f55171d28a753edbe73b201de58d1f94625e8af3c078d0a6cbef67c",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "47ca1b068c55a13c45cc08b6dae889f6b1ee00b5b96b26ffd5b6d7f0834e80b105c790f002d537cfcaaaffc2fbfbb39220deaaa3b295d3fa0ee937766c9b6d37",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1604,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200043fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff43a5100fea6845725acfe76fe7724c20e1c6d20e6eac1d88af4fc2973d011d67e1a5488686147f36343d837cab42b525b77a128e9f3d299983c0cd9e2744d598",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "2ba61d9b782c3bf2327967aea78652bcab06edfd40194f9f29a050ee2e7b215266bb401239e0939d6960aad9639ab8a3e109e6900044793fc785b3659cec844e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1605,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200044000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000003ffffff114dd3a8a1fdcd7a4f73230d0cd64e3e70e4d3cdc7f17813225971e5a4f114c1ac832ee47b3e46a06831823e106afbfd787ab0cb24f08431e31d036c42c83bf8",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "0329bcaa4ef0be643943baeef3da0f492807fa3b8096898162790eefc0e6a9ae174a2dfeeb74a82bcfdf962faf7a5383f9828e905033c79c83c44da1a76dba7f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1606,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e038182000440007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc00080003c9571b0b89f23c99107b1a0af05f56387ae4c995d465888ce76fd8c816ffade0fe5463c15d3c70bf99b69a3fee7e1011a3851899f0238c56817cae06ef23ecc",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "51166f096df52ace944ecd44a51775be9059a573b96fa0b886068302d0bce7b61154fa8a7987c5e449f7ed01c34878d8c0e0f6a0393aacc778d60ef9909d02ce",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1607,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e038182000449ba9a7a28bce1499b99d9d0bf6f53f209e7a837af242b1c7ed82599d5f1b6b2291caf32fb219f800441fbcdf530158cbb54034c5d6ebaeab84f587c79eff84b46f39512652e7c2578d60e484c3fd9fa5bf49218e677ce2d2048527e8571058901e5d223aeed86dd652106e759a917b1447fe155c3f0a96608b38feff31d285f",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "269cc9d17ab57a85d382c2fd67728fc2cc2c82e253cb8c4c6e67567067a237606af9467a672d5afa4ca383ff79f7f754397c85ee05f2469110ba20f250e39553",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1608,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200047fff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc000000080000001178695b6ac05f8d187c2af288f716da9a5b3bb33e69989a74f0f8c05af0f2459fc2cc4ee5c850598c9dbd8870c2d7bde30e7cd10dd810c1a9ea8fba06652564e",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "07ec187ce96377cce3f19319ad081ab4311594aa7d894354857fca87cfdd4b2868100e6120c22bd1f53e095bd1a0e60d74e55e23c5590b293362de2c3540fdf8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1609,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002712339d726983e1f5a4f602f37124b0f9bdbcbfb50cc2b74c64184480e6ab3f7a0db884b9fc2a1c081b4d3f6d6f9b5b813b7d9c72758a2faa55c7fd8d0a633d",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "20a7fbcbe57ff0d3c1af10d17f26aec03299b5bc594a9ddd17acd0d1eea0432b08da9434889cd961c65820f373b59ce214425a1b58a6568eaeda7beaca6a05d6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1610,
+          "comment" : "edge cases for ephemeral key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f10eb28f88ddc962de75542ff578b6104f4d713b25bae50d40bf91008805605972952e7f2a9df7e8e1dd14a461d3973779d24383f20b77c604cf69f8eb5cbace9e",
+          "private" : "5e5fb522b12a9b51f178a4c1d959c1b46a5bd51fce1f003ab07c24a226f3cf7a43856263c1746481ea294c2e47658a14394e20903f972bf7e1c29c33f2a3434e",
+          "shared" : "058ef8e8184937d37424cbf061e5548ade07acda195b2e5f41c848a8003a1182036ae169f0e347092f483475f8f7999d7a762e72711ae54e50c16e4d6baf3f99",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1611,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004242748b1fa44edac413a79ee1cdcc3d4bab5fa125d4d692208ac52764377b84fe3472dbe8f292572f1f3dbf3e927624d983d5c0f4bfca5224dc0739889ddd0793d1f2089639992a74a3c1783d2f1bd50f85ad77540adfa78b1a6581bcd74b3ef0dd996be2809ed16434c42b3a29cb81b1a39720cede1b640f018788afa61cbed",
+          "private" : "3",
+          "shared" : "12b8f005de7e6be94e50afdedaf1414198d9e3d7c4e9fcf91411104bfa6953a5cc72acd06aa061c476affd458804fb5070aa2a85265d6b38a0c8b4cf0c1bcf72",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1612,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004242748b1fa44edac413a79ee1cdcc3d4bab5fa125d4d692208ac52764377b84fe3472dbe8f292572f1f3dbf3e927624d983d5c0f4bfca5224dc0739889ddd0793d1f2089639992a74a3c1783d2f1bd50f85ad77540adfa78b1a6581bcd74b3ef0dd996be2809ed16434c42b3a29cb81b1a39720cede1b640f018788afa61cbed",
+          "private" : "0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "43677fd0b1365e971c06e2bff5bf1ddc0ef933c2fcca2512a0d3590cb39a000f2ca822a6274eab376d79dc5b6615e5df8f1fe79d4b3b8c978286f7aab460afdf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1613,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004242748b1fa44edac413a79ee1cdcc3d4bab5fa125d4d692208ac52764377b84fe3472dbe8f292572f1f3dbf3e927624d983d5c0f4bfca5224dc0739889ddd0793d1f2089639992a74a3c1783d2f1bd50f85ad77540adfa78b1a6581bcd74b3ef0dd996be2809ed16434c42b3a29cb81b1a39720cede1b640f018788afa61cbed",
+          "private" : "1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "785ae49819f91d09ade5e246fe4a109849cb6d6a4f449e2e1dcad0ac7b77206f5e9e2e8ea1e9c046125e32089839377f0d5f641587c2c8a10c64b6d1c15f9cff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1614,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004242748b1fa44edac413a79ee1cdcc3d4bab5fa125d4d692208ac52764377b84fe3472dbe8f292572f1f3dbf3e927624d983d5c0f4bfca5224dc0739889ddd0793d1f2089639992a74a3c1783d2f1bd50f85ad77540adfa78b1a6581bcd74b3ef0dd996be2809ed16434c42b3a29cb81b1a39720cede1b640f018788afa61cbed",
+          "private" : "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "shared" : "233e7e7b9842094261b0bb716840236bfa57d63e37102b8ef68d7ac4e6b6157c2e30b081c8f38ac249bf98ea0ef682e24ce39828188992e04f8e4ca32f809b99",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1615,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004242748b1fa44edac413a79ee1cdcc3d4bab5fa125d4d692208ac52764377b84fe3472dbe8f292572f1f3dbf3e927624d983d5c0f4bfca5224dc0739889ddd0793d1f2089639992a74a3c1783d2f1bd50f85ad77540adfa78b1a6581bcd74b3ef0dd996be2809ed16434c42b3a29cb81b1a39720cede1b640f018788afa61cbed",
+          "private" : "080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "shared" : "84a5b8cda5b63d7df750c8c656abdbf26c89a679b208b0cbf3271784ba7f6c5ab74136b5cab24e83f82f9d553386d894da78de9b7585016d56d04748ee095e67",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1616,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004242748b1fa44edac413a79ee1cdcc3d4bab5fa125d4d692208ac52764377b84fe3472dbe8f292572f1f3dbf3e927624d983d5c0f4bfca5224dc0739889ddd0793d1f2089639992a74a3c1783d2f1bd50f85ad77540adfa78b1a6581bcd74b3ef0dd996be2809ed16434c42b3a29cb81b1a39720cede1b640f018788afa61cbed",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddadcb58796829ca90069",
+          "shared" : "5503815c93641cd012bfbea8f293e9bf4f2d4110b660cc080f17e623c3fca8597791b41f84f856a0ea2902fe516fac4ce8e3cf1908c900ae304c2ca22e0e7ae5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1617,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004242748b1fa44edac413a79ee1cdcc3d4bab5fa125d4d692208ac52764377b84fe3472dbe8f292572f1f3dbf3e927624d983d5c0f4bfca5224dc0739889ddd0793d1f2089639992a74a3c1783d2f1bd50f85ad77540adfa78b1a6581bcd74b3ef0dd996be2809ed16434c42b3a29cb81b1a39720cede1b640f018788afa61cbed",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb57796829ca90069",
+          "shared" : "4e00d64d851b947949af3fce19a413d209c4570fbd023c5b92d534cc6bd0c1378d8ddc0dc3e5407131d17d57e7d9b986b8b3485ff98fdf460faf9fffbe5955f0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1618,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004242748b1fa44edac413a79ee1cdcc3d4bab5fa125d4d692208ac52764377b84fe3472dbe8f292572f1f3dbf3e927624d983d5c0f4bfca5224dc0739889ddd0793d1f2089639992a74a3c1783d2f1bd50f85ad77540adfa78b1a6581bcd74b3ef0dd996be2809ed16434c42b3a29cb81b1a39720cede1b640f018788afa61cbed",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb57f96829ca90069",
+          "shared" : "09f14ca570899490d12dda0bcc829dc8df39f4b00867f0781a6c23568b010d8928edc0fc060207891af5c263b6774b894be70dda4c2b4b305bf57a01075874ed",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1619,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004242748b1fa44edac413a79ee1cdcc3d4bab5fa125d4d692208ac52764377b84fe3472dbe8f292572f1f3dbf3e927624d983d5c0f4bfca5224dc0739889ddd0793d1f2089639992a74a3c1783d2f1bd50f85ad77540adfa78b1a6581bcd74b3ef0dd996be2809ed16434c42b3a29cb81b1a39720cede1b640f018788afa61cbed",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796819ca90069",
+          "shared" : "3d25d403e5deda27c4804eee4c411eb224080f2c2bc82c3b94e9d00c50e39bbd9bf5efdd34871a64afc1e7f62708dc95f0a3b7fb82518dc5b3aad94ad72d11ed",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1620,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004242748b1fa44edac413a79ee1cdcc3d4bab5fa125d4d692208ac52764377b84fe3472dbe8f292572f1f3dbf3e927624d983d5c0f4bfca5224dc0739889ddd0793d1f2089639992a74a3c1783d2f1bd50f85ad77540adfa78b1a6581bcd74b3ef0dd996be2809ed16434c42b3a29cb81b1a39720cede1b640f018788afa61cbed",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9003b",
+          "shared" : "71f9265fcb0a1a899c5a3c8dc31d2fc3c87955285687e73928aab9c5cc750a83760292d514d4cde457fc8e05bb49eac1fb677ffa5f9dc9fa62e1126a9eded5a4",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1621,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004242748b1fa44edac413a79ee1cdcc3d4bab5fa125d4d692208ac52764377b84fe3472dbe8f292572f1f3dbf3e927624d983d5c0f4bfca5224dc0739889ddd0793d1f2089639992a74a3c1783d2f1bd50f85ad77540adfa78b1a6581bcd74b3ef0dd996be2809ed16434c42b3a29cb81b1a39720cede1b640f018788afa61cbed",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9005b",
+          "shared" : "79cc52b05b942dec984ea1d88675fcff93f87103b58bd0f7153c7b36b205ea39f99e85017e97ba89726d15e7d7fe5eb1525827011b3852e1121753dea15cfbb9",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1622,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004242748b1fa44edac413a79ee1cdcc3d4bab5fa125d4d692208ac52764377b84fe3472dbe8f292572f1f3dbf3e927624d983d5c0f4bfca5224dc0739889ddd0793d1f2089639992a74a3c1783d2f1bd50f85ad77540adfa78b1a6581bcd74b3ef0dd996be2809ed16434c42b3a29cb81b1a39720cede1b640f018788afa61cbed",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90063",
+          "shared" : "618f57d971efa605cb141993a1149dff87d01c773fb8f2a8db5726eb1703522568cc55abca616dae5727f390c90cfa792d4349856820f2d0b5df7da418328e7f",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1623,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004242748b1fa44edac413a79ee1cdcc3d4bab5fa125d4d692208ac52764377b84fe3472dbe8f292572f1f3dbf3e927624d983d5c0f4bfca5224dc0739889ddd0793d1f2089639992a74a3c1783d2f1bd50f85ad77540adfa78b1a6581bcd74b3ef0dd996be2809ed16434c42b3a29cb81b1a39720cede1b640f018788afa61cbed",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90066",
+          "shared" : "12b8f005de7e6be94e50afdedaf1414198d9e3d7c4e9fcf91411104bfa6953a5cc72acd06aa061c476affd458804fb5070aa2a85265d6b38a0c8b4cf0c1bcf72",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1624,
+          "comment" : "edge case private key",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004242748b1fa44edac413a79ee1cdcc3d4bab5fa125d4d692208ac52764377b84fe3472dbe8f292572f1f3dbf3e927624d983d5c0f4bfca5224dc0739889ddd0793d1f2089639992a74a3c1783d2f1bd50f85ad77540adfa78b1a6581bcd74b3ef0dd996be2809ed16434c42b3a29cb81b1a39720cede1b640f018788afa61cbed",
+          "private" : "0aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90067",
+          "shared" : "34998a162b0463d81a96dda6c4e256b94ed35f89cb0b69a9af70123bec61b387bb358451e1994d6c29acbec66c50c61f36b66da33782db21521415952b55fa48",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 1625,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1626,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1627,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e038182000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1628,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e038182000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1629,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1630,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1631,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e038182000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1632,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e038182000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1633,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1634,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1635,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1636,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1637,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1638,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1639,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1640,
+          "comment" : "point is not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1641,
+          "comment" : "",
+          "public" : "3019301406072a8648ce3d020106092b240303020801010e030100",
+          "private" : "145c39bd01e36c6a697a49dd72f540741c8a60dd57e607e1e05f3401e79d2febf83e7c1bcbc535deb3d215caae94be83567f994531905f4d83ee309c0cec9bcc",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1642,
+          "comment" : "public point not on curve",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200041b79c3d29ee8a8d00d3490fb4a2b3803540e27c11de403c3a6f9bf74c479943f34d6718a73d06f9cbbc9de9c48ecffd89de95cb91126a4ff79446a20451ccdab76bc2f96994deeef1bc60da0877c3acc9a711bbd8a5ca5866fed7516150efdd57b089cade770af7402aeab082c2b80cfd4fd7c9211edc88d978ebc9441d8a77f",
+          "private" : "2c97c52657984ec1d94e4d44a16045d2ac1604af8455970d967aa095923a89a00df20db023c6c0186884ec18a346e3f650cce8a1b0a41777e0c09f2cbffe5589",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1643,
+          "comment" : "public point = (0,0)",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010e03818200040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "2c97c52657984ec1d94e4d44a16045d2ac1604af8455970d967aa095923a89a00df20db023c6c0186884ec18a346e3f650cce8a1b0a41777e0c09f2cbffe5589",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1644,
+          "comment" : "order = -8948962207650232551656602815159153422162609644098354511344597187200057010413418528378981730643524959857451398370029280583094215613882043973354392115544169",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f33081840440aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f004407cbbbcf9441cfab76e1890e46884eae321f70c0bcb4981527897504bec3e36a62bcdfa2304976540f6450085f2dae145c22553b465763689180ea2571867423e04818104640ece5c12788717b9c1ba06cbc2a6feba85842458c56dde9db1758d39c0313d82ba51735cdb3ea499aa77a7d6943a64f7a3f25fe26f06b51baa2696fa9035da5b534bd595f5af0fa2c892376c84ace1bb4e3019b71634c01131159cae03cee9d9932184beef216bd71df2dadf86a627306ecff96dbb8bace198b61e00f8b3320241ff5522624724163b74c02b1951cc3603f834cf724c4c362df1299c63358fccf78faac1a3beb356d9e6be799ee68053efb8e24e2c7ef7a225224a78697d6356ff9702010103818200041b79c3d29ee8a8d00d3490fb4a2b3803540e27c11de403c3a6f9bf74c479943f34d6718a73d06f9cbbc9de9c48ecffd89de95cb91126a4ff79446a20451ccdab76bc2f96994deeef1bc60da0877c3acc9a711bbd8a5ca5866fed7516150efdd57b089cade770af7402aeab082c2b80cfd4fd7c9211edc88d978ebc9441d8a77d",
+          "private" : "2c97c52657984ec1d94e4d44a16045d2ac1604af8455970d967aa095923a89a00df20db023c6c0186884ec18a346e3f650cce8a1b0a41777e0c09f2cbffe5589",
+          "shared" : "56507c88662cc3d543c7038e14f3e656c877628f756a05608c44549691c6ef385a9220d5bb8645ded173e1ad3e2db390df62ac04cd328a0d0dd4d82e99cf3cfa",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1645,
+          "comment" : "order = 0",
+          "public" : "308201f83082016f06072a8648ce3d020130820162020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f33081840440aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f004407cbbbcf9441cfab76e1890e46884eae321f70c0bcb4981527897504bec3e36a62bcdfa2304976540f6450085f2dae145c22553b465763689180ea2571867423e04818104640ece5c12788717b9c1ba06cbc2a6feba85842458c56dde9db1758d39c0313d82ba51735cdb3ea499aa77a7d6943a64f7a3f25fe26f06b51baa2696fa9035da5b534bd595f5af0fa2c892376c84ace1bb4e3019b71634c01131159cae03cee9d9932184beef216bd71df2dadf86a627306ecff96dbb8bace198b61e00f8b33202010002010103818200041b79c3d29ee8a8d00d3490fb4a2b3803540e27c11de403c3a6f9bf74c479943f34d6718a73d06f9cbbc9de9c48ecffd89de95cb91126a4ff79446a20451ccdab76bc2f96994deeef1bc60da0877c3acc9a711bbd8a5ca5866fed7516150efdd57b089cade770af7402aeab082c2b80cfd4fd7c9211edc88d978ebc9441d8a77d",
+          "private" : "2c97c52657984ec1d94e4d44a16045d2ac1604af8455970d967aa095923a89a00df20db023c6c0186884ec18a346e3f650cce8a1b0a41777e0c09f2cbffe5589",
+          "shared" : "56507c88662cc3d543c7038e14f3e656c877628f756a05608c44549691c6ef385a9220d5bb8645ded173e1ad3e2db390df62ac04cd328a0d0dd4d82e99cf3cfa",
+          "result" : "invalid",
+          "flags" : [
+            "WrongOrder",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1646,
+          "comment" : "order = 1",
+          "public" : "308201f83082016f06072a8648ce3d020130820162020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f33081840440aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f004407cbbbcf9441cfab76e1890e46884eae321f70c0bcb4981527897504bec3e36a62bcdfa2304976540f6450085f2dae145c22553b465763689180ea2571867423e04818104640ece5c12788717b9c1ba06cbc2a6feba85842458c56dde9db1758d39c0313d82ba51735cdb3ea499aa77a7d6943a64f7a3f25fe26f06b51baa2696fa9035da5b534bd595f5af0fa2c892376c84ace1bb4e3019b71634c01131159cae03cee9d9932184beef216bd71df2dadf86a627306ecff96dbb8bace198b61e00f8b33202010102010103818200041b79c3d29ee8a8d00d3490fb4a2b3803540e27c11de403c3a6f9bf74c479943f34d6718a73d06f9cbbc9de9c48ecffd89de95cb91126a4ff79446a20451ccdab76bc2f96994deeef1bc60da0877c3acc9a711bbd8a5ca5866fed7516150efdd57b089cade770af7402aeab082c2b80cfd4fd7c9211edc88d978ebc9441d8a77d",
+          "private" : "2c97c52657984ec1d94e4d44a16045d2ac1604af8455970d967aa095923a89a00df20db023c6c0186884ec18a346e3f650cce8a1b0a41777e0c09f2cbffe5589",
+          "shared" : "56507c88662cc3d543c7038e14f3e656c877628f756a05608c44549691c6ef385a9220d5bb8645ded173e1ad3e2db390df62ac04cd328a0d0dd4d82e99cf3cfa",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1647,
+          "comment" : "order = 2083592630841357761914050861997332755048435564175796348448981807380927961881602771668457829077617488768289656930144243078095422967775269405300354",
+          "public" : "30820234308201ab06072a8648ce3d02013082019e020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f33081840440aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f004407cbbbcf9441cfab76e1890e46884eae321f70c0bcb4981527897504bec3e36a62bcdfa2304976540f6450085f2dae145c22553b465763689180ea2571867423e04818104640ece5c12788717b9c1ba06cbc2a6feba85842458c56dde9db1758d39c0313d82ba51735cdb3ea499aa77a7d6943a64f7a3f25fe26f06b51baa2696fa9035da5b534bd595f5af0fa2c892376c84ace1bb4e3019b71634c01131159cae03cee9d9932184beef216bd71df2dadf86a627306ecff96dbb8bace198b61e00f8b332023d00aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb587968202010103818200041b79c3d29ee8a8d00d3490fb4a2b3803540e27c11de403c3a6f9bf74c479943f34d6718a73d06f9cbbc9de9c48ecffd89de95cb91126a4ff79446a20451ccdab76bc2f96994deeef1bc60da0877c3acc9a711bbd8a5ca5866fed7516150efdd57b089cade770af7402aeab082c2b80cfd4fd7c9211edc88d978ebc9441d8a77d",
+          "private" : "2c97c52657984ec1d94e4d44a16045d2ac1604af8455970d967aa095923a89a00df20db023c6c0186884ec18a346e3f650cce8a1b0a41777e0c09f2cbffe5589",
+          "shared" : "56507c88662cc3d543c7038e14f3e656c877628f756a05608c44549691c6ef385a9220d5bb8645ded173e1ad3e2db390df62ac04cd328a0d0dd4d82e99cf3cfa",
+          "result" : "acceptable",
+          "flags" : [
+            "WrongOrder",
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1648,
+          "comment" : "generator = (0,0)",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f33081840440aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f004407cbbbcf9441cfab76e1890e46884eae321f70c0bcb4981527897504bec3e36a62bcdfa2304976540f6450085f2dae145c22553b465763689180ea2571867423e048181040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006902010103818200041b79c3d29ee8a8d00d3490fb4a2b3803540e27c11de403c3a6f9bf74c479943f34d6718a73d06f9cbbc9de9c48ecffd89de95cb91126a4ff79446a20451ccdab76bc2f96994deeef1bc60da0877c3acc9a711bbd8a5ca5866fed7516150efdd57b089cade770af7402aeab082c2b80cfd4fd7c9211edc88d978ebc9441d8a77d",
+          "private" : "2c97c52657984ec1d94e4d44a16045d2ac1604af8455970d967aa095923a89a00df20db023c6c0186884ec18a346e3f650cce8a1b0a41777e0c09f2cbffe5589",
+          "shared" : "56507c88662cc3d543c7038e14f3e656c877628f756a05608c44549691c6ef385a9220d5bb8645ded173e1ad3e2db390df62ac04cd328a0d0dd4d82e99cf3cfa",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1649,
+          "comment" : "generator not on curve",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f33081840440aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f004407cbbbcf9441cfab76e1890e46884eae321f70c0bcb4981527897504bec3e36a62bcdfa2304976540f6450085f2dae145c22553b465763689180ea2571867423e04818104640ece5c12788717b9c1ba06cbc2a6feba85842458c56dde9db1758d39c0313d82ba51735cdb3ea499aa77a7d6943a64f7a3f25fe26f06b51baa2696fa9035da5b534bd595f5af0fa2c892376c84ace1bb4e3019b71634c01131159cae03cee9d9932184beef216bd71df2dadf86a627306ecff96dbb8bace198b61e00f8b334024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006902010103818200041b79c3d29ee8a8d00d3490fb4a2b3803540e27c11de403c3a6f9bf74c479943f34d6718a73d06f9cbbc9de9c48ecffd89de95cb91126a4ff79446a20451ccdab76bc2f96994deeef1bc60da0877c3acc9a711bbd8a5ca5866fed7516150efdd57b089cade770af7402aeab082c2b80cfd4fd7c9211edc88d978ebc9441d8a77d",
+          "private" : "2c97c52657984ec1d94e4d44a16045d2ac1604af8455970d967aa095923a89a00df20db023c6c0186884ec18a346e3f650cce8a1b0a41777e0c09f2cbffe5589",
+          "shared" : "56507c88662cc3d543c7038e14f3e656c877628f756a05608c44549691c6ef385a9220d5bb8645ded173e1ad3e2db390df62ac04cd328a0d0dd4d82e99cf3cfa",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1650,
+          "comment" : "cofactor = -1",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f33081840440aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f004407cbbbcf9441cfab76e1890e46884eae321f70c0bcb4981527897504bec3e36a62bcdfa2304976540f6450085f2dae145c22553b465763689180ea2571867423e04818104640ece5c12788717b9c1ba06cbc2a6feba85842458c56dde9db1758d39c0313d82ba51735cdb3ea499aa77a7d6943a64f7a3f25fe26f06b51baa2696fa9035da5b534bd595f5af0fa2c892376c84ace1bb4e3019b71634c01131159cae03cee9d9932184beef216bd71df2dadf86a627306ecff96dbb8bace198b61e00f8b332024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900690201ff03818200041b79c3d29ee8a8d00d3490fb4a2b3803540e27c11de403c3a6f9bf74c479943f34d6718a73d06f9cbbc9de9c48ecffd89de95cb91126a4ff79446a20451ccdab76bc2f96994deeef1bc60da0877c3acc9a711bbd8a5ca5866fed7516150efdd57b089cade770af7402aeab082c2b80cfd4fd7c9211edc88d978ebc9441d8a77d",
+          "private" : "2c97c52657984ec1d94e4d44a16045d2ac1604af8455970d967aa095923a89a00df20db023c6c0186884ec18a346e3f650cce8a1b0a41777e0c09f2cbffe5589",
+          "shared" : "56507c88662cc3d543c7038e14f3e656c877628f756a05608c44549691c6ef385a9220d5bb8645ded173e1ad3e2db390df62ac04cd328a0d0dd4d82e99cf3cfa",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1651,
+          "comment" : "cofactor = 0",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f33081840440aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f004407cbbbcf9441cfab76e1890e46884eae321f70c0bcb4981527897504bec3e36a62bcdfa2304976540f6450085f2dae145c22553b465763689180ea2571867423e04818104640ece5c12788717b9c1ba06cbc2a6feba85842458c56dde9db1758d39c0313d82ba51735cdb3ea499aa77a7d6943a64f7a3f25fe26f06b51baa2696fa9035da5b534bd595f5af0fa2c892376c84ace1bb4e3019b71634c01131159cae03cee9d9932184beef216bd71df2dadf86a627306ecff96dbb8bace198b61e00f8b332024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006902010003818200041b79c3d29ee8a8d00d3490fb4a2b3803540e27c11de403c3a6f9bf74c479943f34d6718a73d06f9cbbc9de9c48ecffd89de95cb91126a4ff79446a20451ccdab76bc2f96994deeef1bc60da0877c3acc9a711bbd8a5ca5866fed7516150efdd57b089cade770af7402aeab082c2b80cfd4fd7c9211edc88d978ebc9441d8a77d",
+          "private" : "2c97c52657984ec1d94e4d44a16045d2ac1604af8455970d967aa095923a89a00df20db023c6c0186884ec18a346e3f650cce8a1b0a41777e0c09f2cbffe5589",
+          "shared" : "56507c88662cc3d543c7038e14f3e656c877628f756a05608c44549691c6ef385a9220d5bb8645ded173e1ad3e2db390df62ac04cd328a0d0dd4d82e99cf3cfa",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1652,
+          "comment" : "cofactor = 2",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f33081840440aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f004407cbbbcf9441cfab76e1890e46884eae321f70c0bcb4981527897504bec3e36a62bcdfa2304976540f6450085f2dae145c22553b465763689180ea2571867423e04818104640ece5c12788717b9c1ba06cbc2a6feba85842458c56dde9db1758d39c0313d82ba51735cdb3ea499aa77a7d6943a64f7a3f25fe26f06b51baa2696fa9035da5b534bd595f5af0fa2c892376c84ace1bb4e3019b71634c01131159cae03cee9d9932184beef216bd71df2dadf86a627306ecff96dbb8bace198b61e00f8b332024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006902010203818200041b79c3d29ee8a8d00d3490fb4a2b3803540e27c11de403c3a6f9bf74c479943f34d6718a73d06f9cbbc9de9c48ecffd89de95cb91126a4ff79446a20451ccdab76bc2f96994deeef1bc60da0877c3acc9a711bbd8a5ca5866fed7516150efdd57b089cade770af7402aeab082c2b80cfd4fd7c9211edc88d978ebc9441d8a77d",
+          "private" : "2c97c52657984ec1d94e4d44a16045d2ac1604af8455970d967aa095923a89a00df20db023c6c0186884ec18a346e3f650cce8a1b0a41777e0c09f2cbffe5589",
+          "shared" : "56507c88662cc3d543c7038e14f3e656c877628f756a05608c44549691c6ef385a9220d5bb8645ded173e1ad3e2db390df62ac04cd328a0d0dd4d82e99cf3cfa",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1653,
+          "comment" : "cofactor = 8948962207650232551656602815159153422162609644098354511344597187200057010413418528378981730643524959857451398370029280583094215613882043973354392115544169",
+          "public" : "30820278308201ef06072a8648ce3d0201308201e2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f33081840440aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f004407cbbbcf9441cfab76e1890e46884eae321f70c0bcb4981527897504bec3e36a62bcdfa2304976540f6450085f2dae145c22553b465763689180ea2571867423e04818104640ece5c12788717b9c1ba06cbc2a6feba85842458c56dde9db1758d39c0313d82ba51735cdb3ea499aa77a7d6943a64f7a3f25fe26f06b51baa2696fa9035da5b534bd595f5af0fa2c892376c84ace1bb4e3019b71634c01131159cae03cee9d9932184beef216bd71df2dadf86a627306ecff96dbb8bace198b61e00f8b332024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006903818200041b79c3d29ee8a8d00d3490fb4a2b3803540e27c11de403c3a6f9bf74c479943f34d6718a73d06f9cbbc9de9c48ecffd89de95cb91126a4ff79446a20451ccdab76bc2f96994deeef1bc60da0877c3acc9a711bbd8a5ca5866fed7516150efdd57b089cade770af7402aeab082c2b80cfd4fd7c9211edc88d978ebc9441d8a77d",
+          "private" : "2c97c52657984ec1d94e4d44a16045d2ac1604af8455970d967aa095923a89a00df20db023c6c0186884ec18a346e3f650cce8a1b0a41777e0c09f2cbffe5589",
+          "shared" : "56507c88662cc3d543c7038e14f3e656c877628f756a05608c44549691c6ef385a9220d5bb8645ded173e1ad3e2db390df62ac04cd328a0d0dd4d82e99cf3cfa",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1654,
+          "comment" : "cofactor = None",
+          "public" : "30820235308201ac06072a8648ce3d02013082019f020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f33081840440aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f004407cbbbcf9441cfab76e1890e46884eae321f70c0bcb4981527897504bec3e36a62bcdfa2304976540f6450085f2dae145c22553b465763689180ea2571867423e04818104640ece5c12788717b9c1ba06cbc2a6feba85842458c56dde9db1758d39c0313d82ba51735cdb3ea499aa77a7d6943a64f7a3f25fe26f06b51baa2696fa9035da5b534bd595f5af0fa2c892376c84ace1bb4e3019b71634c01131159cae03cee9d9932184beef216bd71df2dadf86a627306ecff96dbb8bace198b61e00f8b332024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006903818200041b79c3d29ee8a8d00d3490fb4a2b3803540e27c11de403c3a6f9bf74c479943f34d6718a73d06f9cbbc9de9c48ecffd89de95cb91126a4ff79446a20451ccdab76bc2f96994deeef1bc60da0877c3acc9a711bbd8a5ca5866fed7516150efdd57b089cade770af7402aeab082c2b80cfd4fd7c9211edc88d978ebc9441d8a77d",
+          "private" : "2c97c52657984ec1d94e4d44a16045d2ac1604af8455970d967aa095923a89a00df20db023c6c0186884ec18a346e3f650cce8a1b0a41777e0c09f2cbffe5589",
+          "shared" : "56507c88662cc3d543c7038e14f3e656c877628f756a05608c44549691c6ef385a9220d5bb8645ded173e1ad3e2db390df62ac04cd328a0d0dd4d82e99cf3cfa",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1655,
+          "comment" : "modified prime",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100a5165c5f2eee5a788365449a3cc11ec6876bdf02a0746e74d104a4088ec32a3436d134fc5ce5366db37b84da9251cd9f617fe3cf9dd0710e435b6cee731e2c2f308184044005c74159acfb6a12bc6fa213f708dd4143c4aeb11355639a055ef8c1e16fde3d467c66043ee131d4fb521c505451b346c7021b5f8fb25576e54ef367e51c1cc104407cbbbcf9441cfab76e1890e46884eae321f70c0bcb4981527897504bec3e36a62bcdfa2304976540f6450085f2dae145c22553b465763689180ea2571867423e048181040000000000000000000000000000000000000000001ecaba5abfa4220000000000000000000000000000000000000000000000000000000000000000000002c01f6bf15da7e827a52307770f224816efc100d72f49964dd2681567ecd0a6edf7324e660d982ccdd99cf1989f2b04f9b5466d7e9563cde411c762084da2f32a51024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006902010103818200040000000000000000000000000000000000000000001ecaba5abfa4220000000000000000000000000000000000000000000000000000000000000000000002c01f6bf15da7e827a52307770f224816efc100d72f49964dd2681567ecd0a6edf7324e660d982ccdd99cf1989f2b04f9b5466d7e9563cde411c762084da2f32a51",
+          "private" : "2c97c52657984ec1d94e4d44a16045d2ac1604af8455970d967aa095923a89a00df20db023c6c0186884ec18a346e3f650cce8a1b0a41777e0c09f2cbffe5589",
+          "shared" : "94b8c69283408ab3ab3364dec5e3b6f25685e287b252c3d26945dc5e235f1e579190c432012e5a3136841a35a88df125a8e7d08b694340598d917682c34366ae",
+          "result" : "invalid",
+          "flags" : [
+            "ModifiedPrime",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1656,
+          "comment" : "using secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a0004074f56dc2ea648ef89c3b72e23bbd2da36f60243e4d2067b70604af1c2165cec2f86603d60c8a611d5b84ba3d91dfe1a480825bcc4af3bcf",
+          "private" : "2c97c52657984ec1d94e4d44a16045d2ac1604af8455970d967aa095923a89a00df20db023c6c0186884ec18a346e3f650cce8a1b0a41777e0c09f2cbffe5589",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1657,
+          "comment" : "using secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbf6606595a3ee50f9fceaa2798c2740c82540516b4e5a7d361ff24e9dd15364e5408b2e679f9d5310d1f6893b36ce16b4a507509175fcb52aea53b781556b39",
+          "private" : "2c97c52657984ec1d94e4d44a16045d2ac1604af8455970d967aa095923a89a00df20db023c6c0186884ec18a346e3f650cce8a1b0a41777e0c09f2cbffe5589",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1658,
+          "comment" : "using secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a03420004a1263e75b87ae0937060ff1472f330ee55cdf8f4329d6284a9ebfbcc856c11684225e72cbebff41e54fb6f00e11afe53a17937bedbf2df787f8ef9584f775838",
+          "private" : "2c97c52657984ec1d94e4d44a16045d2ac1604af8455970d967aa095923a89a00df20db023c6c0186884ec18a346e3f650cce8a1b0a41777e0c09f2cbffe5589",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1659,
+          "comment" : "a = 0",
+          "public" : "308201f83082016f06072a8648ce3d020130820162020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3304504010004402a4e718167630047467addf28a0342d925cc94c8719d760783aa11ed9ed179e88d4aa583a926166ac2e764b11813e1bbe8693d893202478aac4163f64910d93d048181041b79c3d29ee8a8d00d3490fb4a2b3803540e27c11de403c3a6f9bf74c479943f34d6718a73d06f9cbbc9de9c48ecffd89de95cb91126a4ff79446a20451ccdab76bc2f96994deeef1bc60da0877c3acc9a711bbd8a5ca5866fed7516150efdd57b089cade770af7402aeab082c2b80cfd4fd7c9211edc88d978ebc9441d8a77d024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006902010103818200041b79c3d29ee8a8d00d3490fb4a2b3803540e27c11de403c3a6f9bf74c479943f34d6718a73d06f9cbbc9de9c48ecffd89de95cb91126a4ff79446a20451ccdab76bc2f96994deeef1bc60da0877c3acc9a711bbd8a5ca5866fed7516150efdd57b089cade770af7402aeab082c2b80cfd4fd7c9211edc88d978ebc9441d8a77d",
+          "private" : "2c97c52657984ec1d94e4d44a16045d2ac1604af8455970d967aa095923a89a00df20db023c6c0186884ec18a346e3f650cce8a1b0a41777e0c09f2cbffe5589",
+          "shared" : "56507c88662cc3d543c7038e14f3e656c877628f756a05608c44549691c6ef385a9220d5bb8645ded173e1ad3e2db390df62ac04cd328a0d0dd4d82e99cf3cfa",
+          "result" : "acceptable",
+          "flags" : [
+            "UnusedParam",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1660,
+          "comment" : "public key of order 3",
+          "public" : "30820238308201af06072a8648ce3d0201308201a2020101304c06072a8648ce3d0101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f330818404400d48a82e5d9ebd0b265b0787f75081b3e8ae9afff68a28afed42f80db394b8c518e17e0e3dff67190600184fd1dbdce01d82997be3993e8e381951921e95e3f304406483d327ed19355c1dff45a2a07e6eeb74b33b588841bef14f5ebae7173c25cf4b925ce7544e3745fc489ae557cce69f101ff3692feb763fee30cb4caf207c3b048181041219fd68cd21c6de4460fbeffe63f126cc340bc79197489387059b2a7a634cba5c09f0bdb58d43198648cd86787125bb3fc8cb243e1c48f54c24276055650ff75124197e4e0a9d805682e30b64d67d197c4fe260565a0fb9b4587655ed2b59c8df6a4177856c06b1b8d7600bc01ee9194ed857f9deaf1643fe964d9da85f021a024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006902010103818200041219fd68cd21c6de4460fbeffe63f126cc340bc79197489387059b2a7a634cba5c09f0bdb58d43198648cd86787125bb3fc8cb243e1c48f54c24276055650ff759b9843a8ddf270ae95203a2cef37eee4ee0ab535d6fc255220b26748307aea89de35989165a6190f5f6411f268497ccd9a9a7354ed3b0412a1412b8afdb46d9",
+          "private" : "2c97c52657984ec1d94e4d44a16045d2ac1604af8455970d967aa095923a89a00df20db023c6c0186884ec18a346e3f650cce8a1b0a41777e0c09f2cbffe5589",
+          "shared" : "39b9ab0406428807ff60eaf96ba2dddd4de3d9cb57791685f1609da17f15f5a6013faaa6480876ecad402066789fc3d12c41499520aca50c61d7d0a1c223f8f8",
+          "result" : "invalid",
+          "flags" : [
+            "WeakPublicKey",
+            "InvalidPublic",
+            "UnnamedCurve"
+          ]
+        },
+        {
+          "tcId" : 1661,
+          "comment" : "public key on isomorphic curve brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200049bd10171660265dab6c9e25a9af42f1dfdc0ad0b664d7c935b31747fff72022e4f8369711a7f03c964b9cfec33bbf0856556c1ca3cc10db6317d2f20bf57fd214e04b766a6d8ac26ff3c8cfc78bf70be149f38c1727931143eb371c286e9cf14f3f2c2c5fe7cdb73c93f261c4f8c76a38da076080be5ac233d07b2b6e74898f9",
+          "private" : "2c97c52657984ec1d94e4d44a16045d2ac1604af8455970d967aa095923a89a00df20db023c6c0186884ec18a346e3f650cce8a1b0a41777e0c09f2cbffe5589",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "IsomorphicPublicKey",
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 1662,
+          "comment" : "Public key uses wrong curve: secp224r1",
+          "public" : "304e301006072a8648ce3d020106052b81040021033a000432a1be03f7b9015028219d8d584b22a5d46c0392736f924c5f21d0e2ff5a0aff54dad40dc74af90d4380f89cdfe9d8cee331aa16d7e0a065",
+          "private" : "47c9d4ae3ecfea826f6fc9591dd2e25820a3fd96dcedb22ed2cdb0f30c69a36762b500185c170a70921049885d360e51f6c19503bd3d77bb96ccf5285e256bf1",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1663,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040051faad525b9a324917c42a27940f18aeb4493fa0318271de45ce613b7ebf3793f1ff653f614fa111714e4314c1b483ebd909630d1a87c5993914518fc77dab",
+          "private" : "47c9d4ae3ecfea826f6fc9591dd2e25820a3fd96dcedb22ed2cdb0f30c69a36762b500185c170a70921049885d360e51f6c19503bd3d77bb96ccf5285e256bf1",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1664,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : "3076301006072a8648ce3d020106052b81040022036200041f8d9bc4a2084d5cad84c5250e350ababa59c89dc3366ea066d991ee26a8ca45a0dcedcaff5de5d6929677200cf7156ebfd1a513456576f5cc22e3e8810ccac80ec9cb383ec5444a83e062bfc3c756eefe3bf21dcf8a842f880d42c56a14a3e3",
+          "private" : "47c9d4ae3ecfea826f6fc9591dd2e25820a3fd96dcedb22ed2cdb0f30c69a36762b500185c170a70921049885d360e51f6c19503bd3d77bb96ccf5285e256bf1",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1665,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : "30819b301006072a8648ce3d020106052b81040023038186000401fef39524fef964990ca17fb15232fb785c3fc2c21b0ce4b3cc13a186b04b5f3a39f27be680077ad6f87b6792ca3518aae64611dd9b17771d2611892927c2fb1399017be42de7a39bec4a857a83ba1492cc4d6c6c8c270c8f4c6a34b7bdbb502bd606bc115377194d7635110f57c755d3fd845721d5d36c2798875af8325425695805fe",
+          "private" : "47c9d4ae3ecfea826f6fc9591dd2e25820a3fd96dcedb22ed2cdb0f30c69a36762b500185c170a70921049885d360e51f6c19503bd3d77bb96ccf5285e256bf1",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1666,
+          "comment" : "Public key uses wrong curve: secp256k1",
+          "public" : "3056301006072a8648ce3d020106052b8104000a034200041146cca673f3bce8d5e73fc1b9dc3f7c50b2f80910aa2c85622a81c6eca45080880781b5a27a63f7f4dc658e9ece08b07b7de88fd458b72d1a1e54b4a79ff5a0",
+          "private" : "47c9d4ae3ecfea826f6fc9591dd2e25820a3fd96dcedb22ed2cdb0f30c69a36762b500185c170a70921049885d360e51f6c19503bd3d77bb96ccf5285e256bf1",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1667,
+          "comment" : "Public key uses wrong curve: brainpoolP224r1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010105033a000431eae97c69e623133b6879294da70459a1d2d6d70d3f9e5bc380f1f1be80b9970017e4b9bfa5df1540e43ae7301a769b3c833926c05d361a",
+          "private" : "47c9d4ae3ecfea826f6fc9591dd2e25820a3fd96dcedb22ed2cdb0f30c69a36762b500185c170a70921049885d360e51f6c19503bd3d77bb96ccf5285e256bf1",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1668,
+          "comment" : "Public key uses wrong curve: brainpoolP256r1",
+          "public" : "305a301406072a8648ce3d020106092b2403030208010107034200040eaee13dfb86bd8938df47220423a5a81c335d7db4733264b182157067f3bdad8ba96b27c47fbc659c23cee98e95ff0c45fb64a910f37b141b9db0e408252742",
+          "private" : "47c9d4ae3ecfea826f6fc9591dd2e25820a3fd96dcedb22ed2cdb0f30c69a36762b500185c170a70921049885d360e51f6c19503bd3d77bb96ccf5285e256bf1",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1669,
+          "comment" : "Public key uses wrong curve: brainpoolP320r1",
+          "public" : "306a301406072a8648ce3d020106092b2403030208010109035200043a764d5de212287a85bd344429c4fb3198ada4fe9b18ace23c8a813f9ef00705c37ede3043d3d7315d6e896ea0e067761afdaa34c8676bdf6d33054c944793a0595d1d411b301e18ab292dfae0949487",
+          "private" : "47c9d4ae3ecfea826f6fc9591dd2e25820a3fd96dcedb22ed2cdb0f30c69a36762b500185c170a70921049885d360e51f6c19503bd3d77bb96ccf5285e256bf1",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1670,
+          "comment" : "Public key uses wrong curve: brainpoolP384r1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010b0362000419f894fdbd7e84c9322b3d648bf6bb1724ccf38bc92ed2ea3cd2f8c1704658a40febec7bfb88b231bd2591d4c874dbd44f65dd12a5600f7b9c8865f96ab6fab3635d4e15dd74b3d93afc51cf37a6c145baceffe59bc01d1728566bdd9c159a4a",
+          "private" : "47c9d4ae3ecfea826f6fc9591dd2e25820a3fd96dcedb22ed2cdb0f30c69a36762b500185c170a70921049885d360e51f6c19503bd3d77bb96ccf5285e256bf1",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1671,
+          "comment" : "Public key uses wrong curve: brainpoolP512r1",
+          "public" : "30819b301406072a8648ce3d020106092b240303020801010d03818200046cae8eb745a413b12b416e511a01461dfc4be43fdfefb61d4391de41d84b67e60551b9009213368f2665271012325e9c1f23990babe39b20b18d63d74c74837643e78e361b59af754f477e01eb2a7c120596fd1f755a8e57e48bd61c65e5b328025358d455a95a6b7a6123cc0c34df10434c4d08d2ca956f48cb715cb88f3191",
+          "private" : "47c9d4ae3ecfea826f6fc9591dd2e25820a3fd96dcedb22ed2cdb0f30c69a36762b500185c170a70921049885d360e51f6c19503bd3d77bb96ccf5285e256bf1",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1672,
+          "comment" : "Public key uses wrong curve: brainpoolP224t1",
+          "public" : "3052301406072a8648ce3d020106092b2403030208010106033a0004bc0cc0fc885038c82a60f0d7d3e78a6c39d0088fa642442b6e79b6672d35e5be4fafb47994e51ca4116608573f83cd31cbe7eb07f9a1bc35",
+          "private" : "47c9d4ae3ecfea826f6fc9591dd2e25820a3fd96dcedb22ed2cdb0f30c69a36762b500185c170a70921049885d360e51f6c19503bd3d77bb96ccf5285e256bf1",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1673,
+          "comment" : "Public key uses wrong curve: brainpoolP256t1",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010803420004669705ff197bfb63f933df3c101adad2b632a258cb1a1a593bab178be29da54f659af7d97e0450e0e10e92076a3ac2e728d164b714c019cdecb67d99f1f10d76",
+          "private" : "47c9d4ae3ecfea826f6fc9591dd2e25820a3fd96dcedb22ed2cdb0f30c69a36762b500185c170a70921049885d360e51f6c19503bd3d77bb96ccf5285e256bf1",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1674,
+          "comment" : "Public key uses wrong curve: brainpoolP320t1",
+          "public" : "306a301406072a8648ce3d020106092b240303020801010a035200044c789e53f6f802452bccd438510b6071bf47174bf6865a7e591324d891f22b584182f3cfb2f291de4a5b8b19afe8cdd7d13468eb20800641150e84f6dd3829c0eb51eb144f8f4c8c7f434cc7a98805c9",
+          "private" : "47c9d4ae3ecfea826f6fc9591dd2e25820a3fd96dcedb22ed2cdb0f30c69a36762b500185c170a70921049885d360e51f6c19503bd3d77bb96ccf5285e256bf1",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1675,
+          "comment" : "Public key uses wrong curve: brainpoolP384t1",
+          "public" : "307a301406072a8648ce3d020106092b240303020801010c0362000438c91b58cf47f35c2ea32e955f664f14aa0e7dbe2d45b2510e9b8adb2daff7bb617ff7ce3c9f713918b756383d3569714d476be2d0a7fa64d4c4aebdd4a7490d636f90aa6ea0bb364a880690c7ce25740aeddf5d63e9c8ba0a828ae1581a9658",
+          "private" : "47c9d4ae3ecfea826f6fc9591dd2e25820a3fd96dcedb22ed2cdb0f30c69a36762b500185c170a70921049885d360e51f6c19503bd3d77bb96ccf5285e256bf1",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1676,
+          "comment" : "invalid public key",
+          "public" : "305a301406072a8648ce3d020106092b240303020801010e0342000235e67afb6af3ddf29988a8c571022edbe5bc69da07bc752efe225ca449b123cf1f7dce245069597e4fb49d088f36753059601932eb624ef28221a5f1acf38ff7",
+          "private" : "090bd095b9dcee06acf56c2e4c7b2c25ecd9f24ed86dd305e9fa0359f33392edd4ea3f21b4ba782895b57ae4d0d4ec52a18df0cf076a0f8ca961577466f66805f",
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "CompressedPoint"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdh_webcrypto_test.json b/third_party/wycheproof/testvectors/ecdh_webcrypto_test.json
new file mode 100644
index 0000000..8d34b5a
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdh_webcrypto_test.json
@@ -0,0 +1,5569 @@
+{
+  "algorithm" : "ECDH",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "AddSubChain" : "The private key has a special value. Implementations using addition subtraction chains for the point multiplication may get the point at infinity as an intermediate result. See CVE_2017_10176",
+    "CVE_2017_10176" : "This test vector leads to an EC point multiplication where an intermediate result can be the point at infinity, if addition-subtraction chains are used to speed up the point multiplication.",
+    "InvalidPublic" : "The public key has been modified and is invalid. An implementation should always check whether the public key is valid and on the same curve as the private key. The test vector includes the shared secret computed with the original public key if the public point is on the curve of the private key. Generating a shared secret other than the one with the original key likely indicates that the bug is exploitable.",
+    "ModifiedPrime" : "The modulus of the public key has been modified. The public point of the public key has been chosen so that it is both a point on both the curve of the modified public key and the private key.",
+    "UnnamedCurve" : "The public key does not use a named curve. RFC 3279 allows to encode such curves by explicitly encoding, the parameters of the curve equation, modulus, generator, order and cofactor. However, many crypto libraries only support named curves. Modifying some of the EC parameters and encoding the corresponding public key as an unnamed curve is a potential attack vector.",
+    "UnusedParam" : "A parameter that is typically not used for ECDH has been modified. Sometimes libraries ignore small differences between public and private key. For example, a library might ignore an incorrect cofactor in the public key. We consider ignoring such changes as acceptable as long as these differences do not change the outcome of the ECDH computation, i.e. as long as the computation is done on the curve from the private key.",
+    "WeakPublicKey" : "The vector contains a weak public key. The curve is not a named curve, the public key point has order 3 and has been chosen to be on the same curve as the private key. This test vector is used to check ECC implementations for missing steps in the verification of the public key.",
+    "WrongOrder" : "The order of the public key has been modified. If this order is used in a cryptographic primitive instead of the correct order then private keys may leak. E.g. ECDHC in BC 1.52 suffered from this."
+  },
+  "numberOfTests" : 249,
+  "header" : [],
+  "testGroups" : [
+    {
+      "curve" : "P-256",
+      "encoding" : "webcrypto",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "normal case",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "YtW9M3Kvdf6FoEBxXQ9QJCjgcEaGiwv9-mHXMa_kTyY",
+            "y" : "rDM6k6nnCoHNWpW1v40TmQ63QcjDiHK0oH0nWgFOMM8"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "BhJGXImgI6sXhVsKa86_0_67U674QThke1NS4CwQw0Y",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "tZzHZx3Wprg24s2Tlu9WGLL_PoGS3XydNsJ8tW_5FmE",
+            "y" : "SCbZ29WuZM3YV1Bou8nmPyMepX7QMkiETAkzG5U5IFM"
+          },
+          "shared" : "53020d908b0219328b658b525f26780e3ae12bcd952bb25a93bc0895e1714285",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "WP1BaKh3lWA-KwQ5AoW9ym5X3mAn_iEd2dJeIhLSnmI",
+            "y" : "CA02vSJNdAVQkpXu0CoXFQ4DsxT5baN0RbDR0pN30Sw"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "D20gwEJh7MPpKEasrUjcjsXuNa4Ig_DS6nEhaQbuHEc",
+            "y" : "wEJomplt0SgwrkWTgulKrFa3F68uIIAhX55BlJsfUr4"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "00000000000000000000000000000000ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AMfe_rGhYjZzjpoRI7piG8jpo_JIWz-P_ef5zpj1qKE",
+            "y" : "yzOMORKxeS9gwrBuxSMeLYSw5Zbpt21BnOEF7ON5Hbw"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "0000000000000000ffffffffffffffff00000000000000010000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "6bmPssCsBF-MdhJf_ZnrilFXvh19s-hdZV7B2CECiM8",
+            "y" : "IY3yT9LCdGvlnfQSYu86l9mGdEsoNnSKdIYjCjGf_sA"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff0000000100000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "6UhOWPMzG2b_7W2Qyxx4Bl-ijPulx91DUgE9MlLuQnc",
+            "y" : "vXUDsEWji0skezLFlZNYDznmq_o3bD3KIM9_nPtlnhM"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dn1_u4Sqak2xB5NyZE5C7LL-wgDBeIIjksuLlQ_90Mk",
+            "y" : "HIaFPK_Qm1K6Lyh_DrqiZBWjz6uvksamF6GZiFY9neo"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "x01Uby_MbdOS-F5b4WfjWN6Qh1awwLsBy2nYZMoIPhw",
+            "y" : "k_lZ7s5uEO4RvTk0IH1lriivaLCSWFoVCSYOzrObku8"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "085ec5a4af40176b63189069aeffcb229c96d3e046e0283ed2f9dac21b15ad3c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "NPyfHnoJTNKVmNGEH6lhPb6CMT1jOlHWP7bv8HTMm5o",
+            "y" : "Ts_Z8ljFxNQhC0l1EhOiTFlpgr0dVOBEVEPyHvFUkqU"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "190c25f88ad9ae3a098e6cffe6fd0b1bea42114eb0cedd5868a45c5fe277dff3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "1clu_RkH_UjeKtcVrPgurlxmkP4-_hanjWHGjTv9EN8",
+            "y" : "A-rIFrnnt3YZKj9QdYh8DiJWF1BYM8qZfNoy_Q9nPF4"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "507442007322aa895340cba4abc2d730bfd0b16c2c79a46815f8780d2c55a2dd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "9HX1A6dw33LEWu3-QsAI9ZqlfnKyMvJmAL3QNTlXyyA",
+            "y" : "vbj2QFtJGAUKNUn0TAeo66ggzc5OzmmYiMY432b1T3w"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "5f177bfe19baaaee597e68b6a87a519e805e9d28a70cb72fd40f0fe5a754ba45",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "88tnVLfiqG0GTfufkDGFqqTJK0gcLBof8nYwO7xBg-Q",
+            "y" : "nDGFmbCYTDVj3zOTEf4UOn2SHudbdVpSxvgE-Je4Cfc"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "7fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "zOE_vclqlG37jG2e12Lb0XMWMEVWifV6Q3_uEk3VTOw",
+            "y" : "rveAJsZTAwzy8xSmcGQjawo1Te_rxekMlBJOm_XE_CQ"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "8000000000000000000000000000000000000000000000000000000000000004",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "djPf0K0GdlCXvBG9UCKyAN8x8oxP8GJUISIax-625vQ",
+            "y" : "y5xnaTYJ3db5I0OlocY1QIJA9PjicSDBJVTH_4x24v4"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "o4as5XP4dVimjq0qIAiOP-kova6eEJRG-ToHjBV0HwQ",
+            "y" : "ISYebbK_EhBuTGv4W5WBtMAwKlJiIvkKvFpUkgaxEBE"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "ff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "jntQ99jETV00lsQxQaUC9KQ_FT0DrUPtqOOVl_HUd7g",
+            "y" : "ZH89pnlpt_mJ_0rdw5NRWvQMgghc4fLuGVQSxvWDd08"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "ffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "yCf7kw_VHZJghhkbUCr4OrtfcX3ryN4piXo5NLJXHKA",
+            "y" : "WZDAWXsLei5C_r1WsTI10dQI127SyTs_rPUU2QL2kQo"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "ffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "PLwbMbQ_F9wgDdcMKUTATGyxsIKCDCNKMAsFt3Y4RMc",
+            "y" : "T94KTvk4h0aXkycOsv8UgofakmWwM0-eJgmqwW6K1QM"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "7fffffffffffffffffffffffeecf2230ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "KDDZZImuJLecrUJQVugnRvnj9BmrmqIcofuxHHMl59M",
+            "y" : "GKvmb1de6KLxxKgONSYK6CrX1vZh0V8GlnkwpYUJfvc"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "000000000000000000000000111124f400000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "RQtrbiCXF46dKFAQlRjSjrO23tKSKlRSADvC5KTsd1w",
+            "y" : "iU6Q8N8bDmytsDud4k9qItG9CkpYzWRcJzyuHGGb_WE"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "000000000000000000000001ea77d449ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "PLwbMbQ_F9wgDdcMKUTATGyxsIKCDCNKMAsFt3Y4RMc",
+            "y" : "sCH1sAbHeLpobNjxTQDrfXglbZtPzLBh2fZVPpF1Kvw"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "7fffffffffffffffffffffffeecf2230ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "KDDZZImuJLecrUJQVugnRvnj9BmrmqIcofuxHHMl59M",
+            "y" : "51QZj6ihF14OO1fxytn1F9UoKQqeLqD5aYbPWnr2gQg"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "000000000000000000000000111124f400000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "RQtrbiCXF46dKFAQlRjSjrO23tKSKlRSADvC5KTsd1w",
+            "y" : "drFvDiDk8ZRST8RiHbCV3S5C9banMpuj2MNR455kAp4"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "000000000000000000000001ea77d449ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "mg8OPdMUF7vZ4pi8Boq21cNnM68m7Wdnb0EMgEuLLKE",
+            "y" : "sCyC86YaN223lWJulABVcRInOjbN2wjKqkOVOWVFRzA"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "7fffffffffffffffffffffffca089011ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "jl0i1eU-x5fFXs1ooIp8M2HNmcp_rRpo6oAqaky1ipE",
+            "y" : "jqegcCPvZ2dwJL04QeGHxkswowo3UOsu6HP75Y-hNXs"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "0000000000000000000000001f6bd1e500000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "KTqjSbk0qyyDnPVLinN98jBO-bIPpJTjGtYrMV3WpTw",
+            "y" : "EYGCuF70Zuuajof5Zh99AXmEwV6oIEP1NtHuam2VtQk"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "000000000000000000000002099f55d5ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "mg8OPdMUF7vZ4pi8Boq21cNnM68m7Wdnb0EMgEuLLKE",
+            "y" : "T9N9C1nlyJNIap2Ra_-qju3YxcoyJPc1Vbxqxpq6uM8"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "7fffffffffffffffffffffffca089011ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "jl0i1eU-x5fFXs1ooIp8M2HNmcp_rRpo6oAqaky1ipE",
+            "y" : "cVhfjtwQmJmP20LHvh54ObTPXPbIrxTRF4wEGnBeyoQ"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "0000000000000000000000001f6bd1e500000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "KTqjSbk0qyyDnPVLinN98jBO-bIPpJTjGtYrMV3WpTw",
+            "y" : "7n59RqELmRVlcXgGmeCC_oZ7PqJX37wKyS4RlZJqSvY"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "Cg1iKkfkj2vBA4rOQ4xvUoqgCtK9HaXxPuRr9fYz1xo",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "dGGMuq9p_1kPX7WFUc5KlItcclHUDllaGLG6a77mraU",
+            "y" : "v_QDqOmdU6cNPORhC_0F1Lo6iFW2oNNjyB99B4zezZI"
+          },
+          "shared" : "000000000000000000000002099f55d5ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "ZkhceA4vg9ckM71dhKBrtlQcKvMdrocXKL-FahdPk_Q"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "cfe4077c8730b1c9384581d36bff5542bc417c9eff5c2afcb98cc8829b2ce848",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAP____________________8",
+            "y" : "TyuStMWWpaR_iwQdLepgQwIax3uagLE0OsnXePT49zM"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "49ae50fe096a6cd26698b78356b2c8adf1f6a3490f14e364629f7a0639442509",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAD__________wAAAAAAAAABAAAAAAAAAAE",
+            "y" : "OBIL5qsx7fo0doxDh9L4T7SwvoqamFhkoVdfRDa7N7A"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "5a1334572b2a711ead8b4653eb310cd8d9fd114399379a8f6b872e3b8fdda2d9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAP____8AAAAA_____wAAAAD_____AAAAAQAAAAA",
+            "y" : "RiwEZuQYAiONbJJey-_HR8_lBeoZavmi0RtihQ_OlG4"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "c73755133b6b9b4b2a00631cbc7940ecbe6ec08f20448071422e3362f2556888",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAD____AAAAP___8AAAA____wAAAD____AAAAP___8",
+            "y" : "FYL6MuLUqJ38-z0LFJ9mfbozKUkPTWTuKtWGwMnoxQg"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "06fa1059935e47a9fd667e13f469614eb257cc9a7e3fc599bfb92780d59b146d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAD__wAA__8AAP__AAD__wAA__8AAP__AAD__wABAAE",
+            "y" : "aEyKlYbtb5y-RHBYp9ohCLqx5eCmDR9z5OLnE_Cj3-A"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "f237df4c10bd3e357971bb2b16b293566b7e355bdc8141d6c92cabc682983c45",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "CF7FpK9AF2tjGJBprv_LIpyW0-BG4Cg-0vnawhsVrTw",
+            "y" : "eFn5fLbiA_Rr80OPYSgjJelOaBtgtWaXiK6wZVvxnTg"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "d874b55678d0a04d216c31b02f3ad1f30c92caaf168f34e3a743356d9276e993",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "GQwl-IrZrjoJjmz_5v0LG-pCEU6wzt1YaKRcX-J33_M",
+            "y" : "Ibg0LvB3vGckESQD6u5aFbTDGnFYnwLe0JzZnMXbnIM"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "11a8582057463fc76fda3ab8087eb0a420b0d601bb3134165a369646931e52a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "UHRCAHMiqolTQMukq8LXML_QsWwseaRoFfh4DSxVot0",
+            "y" : "RhnWn5lA9RZjqhI4G8fPZ4vRpypJ-8EbC2nLItGvny0"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "4e173a80907f361fe5a5d335ba7685d5eba93e9dfc8d8fcdb1dcd2d2bde27507",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Xxd7_hm6qu5Zfmi2qHpRnoBenSinDLcv1A8P5adUukU",
+            "y" : "YsoRA_cKIAbNH2f19qNYCyncRGq8kODpEMHgWpqniM0"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "73220471ec8bad99a297db488a34a259f9bc891ffaf09922e6b5001f5df67018",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "f_8AAf_8AAf_8AAf_8AAf_8AAf_8AAf_8AAf_8AAf_8",
+            "y" : "LiITyvAwM-D9D3lRFU9ubDqSRKcvrKZenOnutcjhzqk"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "55d0a203e22ffb523c8d2705060cee9d28308b51f184beefc518cff690bad346",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ",
+            "y" : "K-h4nbgbtIcKnmDFwYyAyD3kZCdygfGvHmQIQ6GjFI4"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "2518d846e577d95e9e7bc766cde7997cb887fb266d3a6cb598a839fd54aa2f4f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "gAAAP___8AAAB____gAAAP___8AAAB____gAAAQAAAA",
+            "y" : "ciVA-KRxw3kIPGALWP3k2Vx9ytUJX0IZ_F6b3ePFzTk"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "bdb49f4bdf42ac64504e9ce677b3ec5c0a03828c5b3efad726005692d35c0f26",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "_wAAAAH____8AAAAB_____AAAAAf____wAAAAH____8",
+            "y" : "XfgPxsria2wZUvvQDtF07hIJ0GkzX1tIWI4p6AuRka0"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "f503ac65637e0f17cb4408961cb882c875e4c6ef7a548d2d52d8c2f681838c55",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "__8AAAAD____8AAAAD____8AAAAD____8AAAAD____8",
+            "y" : "LGNlDmpdMy4ph90Jp5AI6PqrvTfknLAWv7ksjND12nc"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "e3c18e7d7377dc540bc45c08d389bdbe255fa80ca8faf1ef6b94d52049987d21",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "_____wAAAAAAAAD_________AAAAAAAAAP________8",
+            "y" : "ehFslkpM1gZov4nP_hV3FKPOIbk7PKYHyKW5OsVP_Ao"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "516d6d329b095a7c7e93b4023d4d05020c1445ef1ddcb3347b3a27d7d7f57265",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "f_______________7s8iMP____________________8",
+            "y" : "AAAAAcfDBkOr7QrwpJ_jUstIP_m5fczfQnxljoeTJA0"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "6fd26661851a8de3c6d06f834ef3acb8f2a5f9c136a985ffe10d5eeb51edcfa3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "f_______________7s8iMP____________________8",
+            "y" : "_____Tg8-b1UEvUPW2AcrTS3wAdGgjMgvYOacXhs2_I"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "6fd26661851a8de3c6d06f834ef3acb8f2a5f9c136a985ffe10d5eeb51edcfa3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "f_______________ygiQEf____________________8",
+            "y" : "Jnv9-KYRSN7NgCg3Mt1MEJXku0C5ZYQIII3BFH____8"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "44236c8b9505a19d48774a3903c0292759b0f826e6ac092ff898d87e53d353fc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "f_______________ygiQEf____________________8",
+            "y" : "2YQCBlnutyIyf9fIzSKz72obRMBGmnv333I-64AAAAA"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "44236c8b9505a19d48774a3903c0292759b0f826e6ac092ff898d87e53d353fc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAEREk9AAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "AAAADRLTgbB2CxxQvorPhZOFBSx_U83mfOE3Wd4xI6A"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "f1f0e43b374feb7e7f96d4ffe7519fa8bb6c3cfd25f6f87dab2623d2a2d33851",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAEREk9AAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "____8e0sflCJ9OOvQXUwemx6-tSArDIZgx7IpiHO3F8"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "f1f0e43b374feb7e7f96d4ffe7519fa8bb6c3cfd25f6f87dab2623d2a2d33851",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAH2vR5QAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "QJbt1occMgy4qfRTF1EQXJe0wleBG7wylj6vOf____8"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "3ebbace1098a81949d5605dd94a7aa88dc396c2c23e01a9c8cca5bb07bfbb6a1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAH2vR5QAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "v2kSKHjjzfRHVgus6K7vo2hLPal-5EPNacFQxgAAAAA"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "3ebbace1098a81949d5605dd94a7aa88dc396c2c23e01a9c8cca5bb07bfbb6a1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAB6nfUSf____________________8",
+            "y" : "AAAAAHr7wLMl6CBkbexiL7VYpRw0KqJX9Lao7F3fFE8"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "1b085213a9c89d353e1111af078c38c502b7b4771efba51f589b5be243417bdc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAB6nfUSf____________________8",
+            "y" : "_____oUEP03aF9-bkhOd0EqnWuTL1V2oC0lXE6Ig67A"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "1b085213a9c89d353e1111af078c38c502b7b4771efba51f589b5be243417bdc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAACCZ9V1f____________________8",
+            "y" : "FSwaItgjonhV7QP44qtQOLsd9Nh-Q4ZfLa9pSP____8"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "67cb63566c7ceb12fdd85ce9d2f77c359242bbaa0ea1bf3cf510a4a26591d1f1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAACCZ9V1f____________________8",
+            "y" : "6tPl3CfcXYiqEvwHHVSvx0TiCyiBvHmg0lCWtwAAAAA"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "VdVfEbuNoeoxi8pyZvA3ZmJEHqhycKogd_G3cMSFSkg",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SxZj7h2TMLcrIL6yg5hQme_3tAel6XekWoJd4p3uluk",
+            "y" : "6dB0rkqADlx2fpnriM0dV7BXimIO0r61V6hPP3YgGnU"
+          },
+          "shared" : "67cb63566c7ceb12fdd85ce9d2f77c359242bbaa0ea1bf3cf510a4a26591d1f1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "MQKPM3f8jysZZ-2quQITrK0NqfUIl_CPV1N_ePEWdEc",
+            "y" : "Q6GTAYk2O73irEy9FknNxvRRrdcd0vFqioZ_KxfKoWs"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Xsvk0aYzCkTI9--VHUvxZebGtyHvramF-0FmG8bn_Ww",
+            "y" : "hzRkDEmY_343SwbOGmSi7NgqsDY4T7g9mnmxJ6J9UDI"
+          },
+          "shared" : "85a0b58519b28e70a694ec5198f72c4bfdabaa30a70f7143b5b1cd7536f716ca",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "MQKPM3f8jysZZ-2quQITrK0NqfUIl_CPV1N_ePEWdEc",
+            "y" : "Q6GTAYk2O73irEy9FknNxvRRrdcd0vFqioZ_KxfKoWs"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "AAAAAP____________________________________8",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "acDnZ_m-qr_bzfMEoOxotfbWcQPPN1if2EbaGh3UR7M",
+            "y" : "xRdBbkUBRGP8nPHEBH0CrORdpHORaqUdey3D0IAzRSs"
+          },
+          "shared" : "a329a7d80424ea2d6c904393808e510dfbb28155092f1bac284dceda1f13afe5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "MQKPM3f8jysZZ-2quQITrK0NqfUIl_CPV1N_ePEWdEc",
+            "y" : "Q6GTAYk2O73irEy9FknNxvRRrdcd0vFqioZ_KxfKoWs"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "m78G2tmrWQXgVHHOFtUiLInCyqOfJiZ6wHRxKYhfvUQ",
+            "y" : "G8x_qE3hIKNnVdrzCm9H6MDUvdwVA27So0R9-nodPog"
+          },
+          "shared" : "bd26d0293e8851c51ebe0d426345683ae94026aca545282a4759faa85fde6687",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "MQKPM3f8jysZZ-2quQITrK0NqfUIl_CPV1N_ePEWdEc",
+            "y" : "Q6GTAYk2O73irEy9FknNxvRRrdcd0vFqioZ_KxfKoWs"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "f_________________________________________8",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "wdFyaeRuOHrL4pnsLMnMLa2j8F5M9BLyrZRrcAqiYTo",
+            "y" : "7bd0TzcME6T0mVfVT_eYEZ0RH2kSnCTbX1-4QWKQnbs"
+          },
+          "shared" : "ea9350b2490a2010c7abf43fb1a38be729a2de375ea7a6ac34ff58cc87e51b6c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "MQKPM3f8jysZZ-2quQITrK0NqfUIl_CPV1N_ePEWdEc",
+            "y" : "Q6GTAYk2O73irEy9FknNxvRRrdcd0vFqioZ_KxfKoWs"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "d7IKkS5rIxNQZukRiRUkvE7-NWDj6SNQtS3sjzdfK1Q",
+            "y" : "o9wpGCXOo_f3sQv83QOKct9iPaHoUODxyqgB_NbMZ_8"
+          },
+          "shared" : "34eed3f6673d340b6f716913f6dfa36b5ac85fa667791e2d6a217b0c0b7ba807",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "MQKPM3f8jysZZ-2quQITrK0NqfUIl_CPV1N_ePEWdEc",
+            "y" : "Q6GTAYk2O73irEy9FknNxvRRrdcd0vFqioZ_KxfKoWs"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "_____wAAAAD__________7zm-q2nF56D87nKwvxjJVE",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "D6givCgRqqWEklkuMm4l3ilJO6qtZR9-kOdctI4U22M",
+            "y" : "QAu1FgokV_OQtStDTCDndMtOWbCvAX0KG-7bq6C50Rg"
+          },
+          "shared" : "1354ce6692c9df7b6fc3119d47c56338afbedccb62faa546c0fe6ed4959e41c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "MQKPM3f8jysZZ-2quQITrK0NqfUIl_CPV1N_ePEWdEc",
+            "y" : "Q6GTAYk2O73irEy9FknNxvRRrdcd0vFqioZ_KxfKoWs"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "_____wAAAAD__________7zm-q2nF56E86nKwvxjJVE",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "VMzJQVAm1z8gqEW3KljlsYvSfxmFQqC-7qa8kgceXIM",
+            "y" : "47zAuUuuus7FcHjqJS1A3W1h9DSicRtpMC9xCOv26V4"
+          },
+          "shared" : "fe7496c30d534995f0bf428b5471c21585aaafc81733916f0165597a55d12cb4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "MQKPM3f8jysZZ-2quQITrK0NqfUIl_CPV1N_ePEWdEc",
+            "y" : "Q6GTAYk2O73irEy9FknNxvRRrdcd0vFqioZ_KxfKoWs"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "_____wAAAAD__________7zm-q2nF56E87HKwvxjJVE",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "yQ4wCDndWJUegJVwYxVEA8tOZkTHdDZIE9AMJI-o7kE",
+            "y" : "nQr755LmGMRj-O85rHv8na-6rLnoUzKRuFnJmDwoPlE"
+          },
+          "shared" : "348bf8042e4edf1d03c8b36ab815156e77c201b764ed4562cfe2ee90638ffef5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "MQKPM3f8jysZZ-2quQITrK0NqfUIl_CPV1N_ePEWdEc",
+            "y" : "Q6GTAYk2O73irEy9FknNxvRRrdcd0vFqioZ_KxfKoWs"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "_____wAAAAD__________7zm-q2nF56E87nKwfxjJVE",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "f-NrQK8ir4khZWsyJixx2hq5GTZcZd-2OlqeIhhaWUM",
+            "y" : "GWgrptpJydxg9gv7-CNZDotMKnqEdQ3tKvLq05ZjXv4"
+          },
+          "shared" : "6e4ec5479a7c20a537501700484f6f433a8a8fe53c288f7a25c8e8c92d39e8dc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "MQKPM3f8jysZZ-2quQITrK0NqfUIl_CPV1N_ePEWdEc",
+            "y" : "Q6GTAYk2O73irEy9FknNxvRRrdcd0vFqioZ_KxfKoWs"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "_____wAAAAD__________7zm-q2nF56E87nKwvxjJPM",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "gNGZfr2-jlTgVZYZbHqV7DpT4me6KiRxmWCqV35hUOQ",
+            "y" : "DGlrAUfbBllbJyhKDBZSTAER6Y1KRlilq7k4531Xgu0"
+          },
+          "shared" : "f7407d61fdf581be4f564621d590ca9b7ba37f31396150f9922f1501da8c83ef",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 68,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "MQKPM3f8jysZZ-2quQITrK0NqfUIl_CPV1N_ePEWdEc",
+            "y" : "Q6GTAYk2O73irEy9FknNxvRRrdcd0vFqioZ_KxfKoWs"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "_____wAAAAD__________7zm-q2nF56E87nKwvxjJTM",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "QJ-NohrqI2pfWhkE0DEMHGGSpn0NoIk2MZhpqK0IOKM",
+            "y" : "jyMITTD_canx2RjULEK_CMFmXxTp1ZhsHpwtONXhcKU"
+          },
+          "shared" : "82236fd272208693e0574555ca465c6cc512163486084fa57f5e1bd2e2ccc0b3",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 69,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "MQKPM3f8jysZZ-2quQITrK0NqfUIl_CPV1N_ePEWdEc",
+            "y" : "Q6GTAYk2O73irEy9FknNxvRRrdcd0vFqioZ_KxfKoWs"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "_____wAAAAD__________7zm-q2nF56E87nKwvxjJUM",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "VOd6ABw4Yrl6dmR_QzbfPPEmrL56BpxeVwkncyTSkgs",
+            "y" : "CmYOQ9YLzou97eBz-l0YPI6OFYmMr2_35Fg30J8vTIo"
+          },
+          "shared" : "06537149664dba1a9924654cb7f787ed224851b0df25ef53fcf54f8f26cd5f3f",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 70,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "MQKPM3f8jysZZ-2quQITrK0NqfUIl_CPV1N_ePEWdEc",
+            "y" : "Q6GTAYk2O73irEy9FknNxvRRrdcd0vFqioZ_KxfKoWs"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "_____wAAAAD__________7zm-q2nF56E87nKwvxjJUs",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "sBoXKnakYCyS0yQsuJfd4wJMdA3rshW0xrCq6Twikak",
+            "y" : "F6Pvis3IJSuQE_HSBFj8huP_CJDjgelCAoO3rHA4gB0"
+          },
+          "shared" : "f2b38539bce995d443c7bfeeefadc9e42cc2c89c60bf4e86eac95d51987bd112",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 71,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "MQKPM3f8jysZZ-2quQITrK0NqfUIl_CPV1N_ePEWdEc",
+            "y" : "Q6GTAYk2O73irEy9FknNxvRRrdcd0vFqioZ_KxfKoWs"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "_____wAAAAD__________7zm-q2nF56E87nKwvxjJU4",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Xsvk0aYzCkTI9--VHUvxZebGtyHvramF-0FmG8bn_Ww",
+            "y" : "eMub8rZnAILItPkx5ZtdEyfVT8rHsEfCZYZO2F2Cr80"
+          },
+          "shared" : "85a0b58519b28e70a694ec5198f72c4bfdabaa30a70f7143b5b1cd7536f716ca",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "MQKPM3f8jysZZ-2quQITrK0NqfUIl_CPV1N_ePEWdEc",
+            "y" : "Q6GTAYk2O73irEy9FknNxvRRrdcd0vFqioZ_KxfKoWs"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "_____wAAAAD__________7zm-q2nF56E87nKwvxjJU8",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "fPJ7GI0DT36KUjgDBLUaw8CJaeJ38hs1pgtI_EdmmXg",
+            "y" : "-Iiq7iRxL8DWwmU5YIvPJEWCUhrDFn3WYftIYt2HjC4"
+          },
+          "shared" : "027b013a6f166db655d69d643c127ef8ace175311e667dff2520f5b5c75b7659",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 73,
+          "comment" : "CVE-2017-8932",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AjgZgTrJaYRwWQKOqIofMN-83gP8eR06JSxrQSEYguo",
+            "y" : "-T5K5DPMEs8qQ_wO8mQAwOElUIIkzbZJOA8lR5FIpK0"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "KiZfi8vcr5TVhRkUHleBJMtA1kpQH7qcEYR7KJZbxzc",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "HAB87s8hVghneih_jnC6btXARlhEvYjJ41FxMS80aKY",
+            "y" : "DguxnlM-tMEWK9qvywU0g7HAdZ-M4DYPw8iM0H1Q6rk"
+          },
+          "shared" : "4d4de80f1534850d261075997e3049321a0864082d24a917863366c0724f5ae3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "CVE-2017-8932",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "zBGIey1my66PTTBmJxklIpMhRrQvAdPG-SvVyLpzmwY",
+            "y" : "ovCKApzQa0YYMIW66SSLDtFbcCgMfvE6RX9a84JCYDE"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "MT9y_5_oEb9XMXYjGyhqO9tvGxTgXEAUZZByenHDvM0",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "WgYrCxiSExev-7PULD2_yrKWy_IwQaYAggTDuDHG324",
+            "y" : "YGZ1nbACvlovLprkgNokiwsqmTAtWS3lUpPRY0EkY9Y"
+          },
+          "shared" : "831c3f6b5f762d2f461901577af41354ac5f228c2591f84f8a6e51e2e3f17991",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "fkqlT3FL8B34XFAmm-o6hnIfhK_nT3tB6lirzzR06I0",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "R_Z9415ctDKwV-ig0P9iLraYs0vJ_-UjURk2Y8xucnQ",
+            "y" : "FA-BXvYf9u0G3woVA2bqvPsY7aHO49SzDy0V1KT65Rc"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "fkqlT3FL8B34XFAmm-o6hnIfhK_nT3tB6lirzzR06I0",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "R_Z9415ctDKwV-ig0P9iLraYs0vJ_-UjURk2Y8xucnQ",
+            "y" : "FA-BXvYf9u0G3woVA2bqvPsY7aHO49SzDy0V1KT65Rc"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "_____wAAAAEAAAAAAAAAAAAAAAD_______________4"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "fkqlT3FL8B34XFAmm-o6hnIfhK_nT3tB6lirzzR06I0",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "R_Z9415ctDKwV-ig0P9iLraYs0vJ_-UjURk2Y8xucnQ",
+            "y" : "FA-BXvYf9u0G3woVA2bqvPsY7aHO49SzDy0V1KT65Rc"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "_____wAAAAEAAAAAAAAAAAAAAAD_______________8"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "fkqlT3FL8B34XFAmm-o6hnIfhK_nT3tB6lirzzR06I0",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "R_Z9415ctDKwV-ig0P9iLraYs0vJ_-UjURk2Y8xucnQ",
+            "y" : "FA-BXvYf9u0G3woVA2bqvPsY7aHO49SzDy0V1KT65Rc"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "fkqlT3FL8B34XFAmm-o6hnIfhK_nT3tB6lirzzR06I0",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "R_Z9415ctDKwV-ig0P9iLraYs0vJ_-UjURk2Y8xucnQ",
+            "y" : "FA-BXvYf9u0G3woVA2bqvPsY7aHO49SzDy0V1KT65Rc"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "fkqlT3FL8B34XFAmm-o6hnIfhK_nT3tB6lirzzR06I0",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "R_Z9415ctDKwV-ig0P9iLraYs0vJ_-UjURk2Y8xucnQ",
+            "y" : "FA-BXvYf9u0G3woVA2bqvPsY7aHO49SzDy0V1KT65Rc"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE",
+            "y" : "_____wAAAAEAAAAAAAAAAAAAAAD_______________4"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "fkqlT3FL8B34XFAmm-o6hnIfhK_nT3tB6lirzzR06I0",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "R_Z9415ctDKwV-ig0P9iLraYs0vJ_-UjURk2Y8xucnQ",
+            "y" : "FA-BXvYf9u0G3woVA2bqvPsY7aHO49SzDy0V1KT65Rc"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE",
+            "y" : "_____wAAAAEAAAAAAAAAAAAAAAD_______________8"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "fkqlT3FL8B34XFAmm-o6hnIfhK_nT3tB6lirzzR06I0",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "R_Z9415ctDKwV-ig0P9iLraYs0vJ_-UjURk2Y8xucnQ",
+            "y" : "FA-BXvYf9u0G3woVA2bqvPsY7aHO49SzDy0V1KT65Rc"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "_____wAAAAEAAAAAAAAAAAAAAAD_______________4",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "fkqlT3FL8B34XFAmm-o6hnIfhK_nT3tB6lirzzR06I0",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "R_Z9415ctDKwV-ig0P9iLraYs0vJ_-UjURk2Y8xucnQ",
+            "y" : "FA-BXvYf9u0G3woVA2bqvPsY7aHO49SzDy0V1KT65Rc"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "_____wAAAAEAAAAAAAAAAAAAAAD_______________4",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "fkqlT3FL8B34XFAmm-o6hnIfhK_nT3tB6lirzzR06I0",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "R_Z9415ctDKwV-ig0P9iLraYs0vJ_-UjURk2Y8xucnQ",
+            "y" : "FA-BXvYf9u0G3woVA2bqvPsY7aHO49SzDy0V1KT65Rc"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "_____wAAAAEAAAAAAAAAAAAAAAD_______________4",
+            "y" : "_____wAAAAEAAAAAAAAAAAAAAAD_______________4"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "fkqlT3FL8B34XFAmm-o6hnIfhK_nT3tB6lirzzR06I0",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "R_Z9415ctDKwV-ig0P9iLraYs0vJ_-UjURk2Y8xucnQ",
+            "y" : "FA-BXvYf9u0G3woVA2bqvPsY7aHO49SzDy0V1KT65Rc"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "_____wAAAAEAAAAAAAAAAAAAAAD_______________4",
+            "y" : "_____wAAAAEAAAAAAAAAAAAAAAD_______________8"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "fkqlT3FL8B34XFAmm-o6hnIfhK_nT3tB6lirzzR06I0",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "R_Z9415ctDKwV-ig0P9iLraYs0vJ_-UjURk2Y8xucnQ",
+            "y" : "FA-BXvYf9u0G3woVA2bqvPsY7aHO49SzDy0V1KT65Rc"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "_____wAAAAEAAAAAAAAAAAAAAAD_______________8",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "fkqlT3FL8B34XFAmm-o6hnIfhK_nT3tB6lirzzR06I0",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "R_Z9415ctDKwV-ig0P9iLraYs0vJ_-UjURk2Y8xucnQ",
+            "y" : "FA-BXvYf9u0G3woVA2bqvPsY7aHO49SzDy0V1KT65Rc"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "_____wAAAAEAAAAAAAAAAAAAAAD_______________8",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "fkqlT3FL8B34XFAmm-o6hnIfhK_nT3tB6lirzzR06I0",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "R_Z9415ctDKwV-ig0P9iLraYs0vJ_-UjURk2Y8xucnQ",
+            "y" : "FA-BXvYf9u0G3woVA2bqvPsY7aHO49SzDy0V1KT65Rc"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "_____wAAAAEAAAAAAAAAAAAAAAD_______________8",
+            "y" : "_____wAAAAEAAAAAAAAAAAAAAAD_______________4"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "fkqlT3FL8B34XFAmm-o6hnIfhK_nT3tB6lirzzR06I0",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "R_Z9415ctDKwV-ig0P9iLraYs0vJ_-UjURk2Y8xucnQ",
+            "y" : "FA-BXvYf9u0G3woVA2bqvPsY7aHO49SzDy0V1KT65Rc"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "_____wAAAAEAAAAAAAAAAAAAAAD_______________8",
+            "y" : "_____wAAAAEAAAAAAAAAAAAAAAD_______________8"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "fkqlT3FL8B34XFAmm-o6hnIfhK_nT3tB6lirzzR06I0",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "R_Z9415ctDKwV-ig0P9iLraYs0vJ_-UjURk2Y8xucnQ",
+            "y" : "FA-BXvYf9u0G3woVA2bqvPsY7aHO49SzDy0V1KT65Rc"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "public point not on curve",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "FRAmTBicPVI_-ZFqvXBp76aWjY3H3bZFfXhptT6mDNw",
+            "y" : "-vt-1HhtoV0p7lklb1Nto1daSIjBuwqVslb0p-n9dkw"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "TzQU0VibSfcXLUOcu-eOW1NQ3IXepAzS1idHQMbgI5w",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Qd7jCiJE2SAcpk1v0t0Sa3CVNp5nOuyqpeBCMIUonV0",
+            "y" : "TRc1uShB5308iyBk3tLD1l2GkvCgVFJl322i5SuUock"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 92,
+          "comment" : "public point = (0,0)",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "TzQU0VibSfcXLUOcu-eOW1NQ3IXepAzS1idHQMbgI5w",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Qd7jCiJE2SAcpk1v0t0Sa3CVNp5nOuyqpeBCMIUonV0",
+            "y" : "TRc1uShB5308iyBk3tLD1l2GkvCgVFJl322i5SuUock"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 93,
+          "comment" : "using secp256k1",
+          "public" : {
+            "crv" : "P-256K",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "oSY-dbh64JNwYP8UcvMw7lXN-PQynWKEqev7zIVsEWg",
+            "y" : "QiXnLL6_9B5U-28A4Rr-U6F5N77b8t94f475WE93WDg"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "TzQU0VibSfcXLUOcu-eOW1NQ3IXepAzS1idHQMbgI5w",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Qd7jCiJE2SAcpk1v0t0Sa3CVNp5nOuyqpeBCMIUonV0",
+            "y" : "TRc1uShB5308iyBk3tLD1l2GkvCgVFJl322i5SuUock"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 94,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "HxeQHnMbBvNJtunX0X1F6KK0YRWkdIW-Fhl5MtuHs5QFtclBs2_WG5733SCHjhKe",
+            "y" : "VaIncJnGAdzbN0f4CtbhZhFjeOHrziyVdEoJhhKM_uqsf5C3F4fZoc_kF81Mj2r1"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "tE-WcP7bqIetjoBiJgY-d2BLJ8Nig2Mm6T7Lf8xtwpc",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "n1e4_HBpzkbKmlbmPYjpnU7LWEX4HnHPa8hqzIWL0pA",
+            "y" : "iGn8nuVhfbtkaK82OB8MQJaNdHlOGDpmmwGS69nXVhE"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AO125YiEKPrUCf8gOrKYsPJIJ8CRk5rg-bEkXYZaxfvNJ0n5rmyQ-o4pQU0bx9x7PErKkEzYJEhEIcxm_mr0O9_S",
+            "y" : "AMH3kKCzrplJN_kba9uXeLCMg-ytuMuiKnjDe_Vl2sFk8Y5xm-DviQ7ly_IOF_z8mlWF5UFkcLmGL4L7dpM5mU9O"
+          },
+          "private" : {
+            "crv" : "P-256",
+            "d" : "tE-WcP7bqIetjoBiJgY-d2BLJ8Nig2Mm6T7Lf8xtwpc",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "n1e4_HBpzkbKmlbmPYjpnU7LWEX4HnHPa8hqzIWL0pA",
+            "y" : "iGn8nuVhfbtkaK82OB8MQJaNdHlOGDpmmwGS69nXVhE"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "curve" : "P-384",
+      "encoding" : "webcrypto",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 96,
+          "comment" : "normal case",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "eQpuBZ75pZQBYxg9SngJE10peRZD_EOi8X7ov2d6uE95G2SmvhWWn_oBLdkYXYeW",
+            "y" : "2blUuqinXoLfcRs7Vurf9rD2aMOya0sa6zCKH8wcaA0ymmcFAl8cmKC15b_LFjyq"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "dm5hQlstqfhGwJ_DVkuTpvhgO3OSx4UWW_INqUjEn9H7He5O3WQ1a58hxYi3Xf2B",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "em7I0xHVyliLrtQb4-mPMMkpSETsu2KZlWU2NdvCLaLwg_KXEeD5xZY7wCG9jLIQ",
+            "y" : "na9WpV-IOnIAzqnE3kRIjm3En7nDlPUctaSfxp1-igNHkpY65Oq8Y0g6LPGomejI"
+          },
+          "shared" : "6461defb95d996b24296f5a1832b34db05ed031114fbe7d98d098f93859866e4de1e229da71fef0c77fe49b249190135",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "SQ6W0X9MbOzNRd70CM6jPpcEpfGwGj3i6qo0Cf0WDXjTldazsAPXH9H1kPrZW_HJ",
+            "y" : "2GZe_CBw0FmqhHElwvcHQ1lVU1x8XfbWwHnsgG3Oa2hJ0zcUDbfKUGFvlFbeEyPE"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AWEyiQlnUhPjIJjTWmuDCKjVAMyjnc7l6ATnO9uN6vBv5BcpH9l5OyMe9f6GlFRE",
+            "y" : "qXoB8646gxDEr0m1ksspHvcO5bx_VTTTwj3J7v3iMEhCx3N66TfM-b0hXCgQPp_i"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "r0rpZOO8vZI6zNpdoxddQR_WLRfdPDocQQvvFzCYWmJl2Q6VCsD8UHQ7HtdxkG_z",
+            "y" : "O2jPTT2DqIWocJf90ynOg7GJ-YzsW-RMMdGjoruhD0cZYyMri6dhD6jHIXkFDrht"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "FHirbgMrlUXtqawsJk5XoR8IrLx20WoKt3sE29ryDyFcQYNDezKvxHHqpgPRTHxd",
+            "y" : "ikyE7g6JW-xcN_ChygdeEG_2vziAG1xpdAnTlnUjEQjTPEpeplqqjAPpOcldlsTE"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff00000000000000010000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "9jII405-kLtfsDZDJGeomYFEQBBmO4UztHv6lL0rwW84qlFrkwpHJuOHbTCRv7cu",
+            "y" : "x4PtTaDKwGMggX3IvGT1nM8G9Iq8Q4ahUJE_qVdDp7RgEZDhxu6Pi_Y1SyVOys5F"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AzJx70LZKtR7JzsJ6i9FQBFhuqUmllkNDhdf8tHA36P-pA5CZtRGVGwF5IDVf6vs",
+            "y" : "eInxaovMF2YC9tRlYWFKL0KEq-aXt8uc559-LnGxVcsfFVzpJdFjkaaA7aIxUubh"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "c36EN-GGg94kVbaJRbujHa7D51TXLwoHdtMZKy-SmLuVyhRkuqZoequ2efgEz27G",
+            "y" : "wrTUfWGmBATfY7HprAlUs0GbvCrVKgQJruuC9HA3WFiAWRZbIDZ9y0sjWwyvcdcn"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0008000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "N_kASYMVa72cR4kedSN7sTAWvX_m9OD3HO8OY_FqZy8NOw4gFlwzQH4Ua2pK5pYt",
+            "y" : "07V8y5nnqvEwMkBRbQ6-COWFUT42ldQsRn3KtTQO92GZDK3I2IQKrMlESBQVwH_r"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "3b5eed80727bcbc5113b8a9e4db1c81b1dddc2d99ff56d9c3c1054348913bde296311c4bd2fa899b4d0e66aaa1b6a0dd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "llXY5WInGLMXz7wJiUNX91prE_pRa81mMHIbhppiAZbPDD3siGCzLSftm6ws8mOv",
+            "y" : "FzIWmBFtfYEa6NqbnLv5OCweNuK2fWxq-bzqfZ3gDKcrOYYGwJigoPDEuJQZQ-1l"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "6a99a5acd4a7edb1c707d7f8be12e81140338e3e14ba563c703c681a319a3f9ce1f90f032bf840f3758e89cb852ceca6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "zLE9Qns8S7M91PIM3avGhgDq-X7rLIHowhiukHQ-dP84ylbwwCJDedtGTc9KQPBD",
+            "y" : "UM16ZZssSFGl3PjJkPySDAfU1apQohhXUOa4TELoPP9jUFBILey0eA-BLkxJ_HQE"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "7c25a4f57f76ab13b25cab3c265db9d9bd925fecbf7bf93bef1308778646628decab067ed988a9755cd88e88de367104",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "JmRiQwfALvSHAwpjIWLFFfhB0V6jFS2Y_yNkIy16qzk0PV9wOk1aMQkqpzVsOi9n",
+            "y" : "HBzWA63f2LVHdVKjsyoY7a8-M77CLuIWf52nKWNgAqeXTq61_wgrKqv4xwVrhMOr"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "7fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Zl8fMgtqscG1LRROUth6FUwrRImDjJEZ3mIsLRtStlsKOVXkTg1IWRdTYMD2Pe6B",
+            "y" : "PxT2mXLxjK7XkWyUpNIOw0RZHnU2pKek2MmDKBjJbWCxqB-r5k6gLF9kfjYb9bYP"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "kTV8qH27COhdexrOz9HghgeKgtGfgUdNo4k2Sjn-JUPrk0tEAXPDjmGh2UB4VbXY",
+            "y" : "nvDZ6SB2S213ZbCEz5VB2sxD0dq6o5Cw-4Vgl7DACoVW9OOEhWirSueQw9NGygG2"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "fff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "1agzuuM7LRD9_223xUd622FLGRxw2XxvEwoU6TkxzB3AWAU_7lSiZKAP3RbTFm_c",
+            "y" : "QpkidreZJbr80YOwPtGCNTUJgKv-Z7gUxsEQdMOPdM1Oc0rVjNtJ2fzSGB0bjxEZ"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "fffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000004000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Z1R82n--jxa-WkR3y7ApefGvcvwPOTAnc1UvvPRmeo4jq8DhKFbuYjTe7KXyKuBQ",
+            "y" : "Ok33wGjnQyQXJgy5_g1oucf89-FqKtoFaH2PiQC4RyMQPtv_CkKydRfaJ2C304hD"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "ffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "E2PjuZAI4Juz8IWUm5tuomoxj0lt5WipZjD9udTHLCgU3zCHoXQfMvJJibQoFn-T",
+            "y" : "xlPLOujD7PrsV-_VS7jOnXnHv2zHD7ERT5Ob6PGpm_HkK5dDESTvn6M0UPqk52g5"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "ffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff0000000000000100000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "uivo1xR-JBfC7ICyS0waqURk_9Cq4fouB4s6-8d8FESJyp0GSsu3qc-mGW0PRnt-",
+            "y" : "Ze4coesTUf-ZaPVT3-LkxZ_4ujTCKkKzuqE6mhrcfxOr1A8f0l1GvFMwhSuTcZZq"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "1phQzLrMRzbqIA_y-EiPJiR5RaKrSN03CPSUspPYy6g0F_SJdIgcf7A4VAibv2bM",
+            "y" : "HHc-wDy4zV8AfsOwO90FpAmzUhA_DezyW0FnOrjKPQQzS6vuASGfFXAfK8oi1As3"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "b8r4LZgtIi1glrqD5VscfctxpB6I8yMzP0QoTZXEvTYW2nob75KPMcJviFunrbSH",
+            "y" : "gm_eLtn1ZJwRz4Rl-L-K1Q9okUk2_Dlmb2ghnQZlBr6kAB_cgWyakOfir7Gb6ghf"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "000000000000000000000000000000000000000000000000000000001f03123b00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "b8r4LZgtIi1glrqD5VscfctxpB6I8yMzP0QoTZXEvTYW2nob75KPMcJviFunrbSH",
+            "y" : "fZAh0SYKm2PuMHuaB0B1KvCXbrbJA8aZkJfeYvma-UBb_-AifpNlbxgdUE9kFfeg"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "000000000000000000000000000000000000000000000000000000001f03123b00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "y-coordinate of the public key is small",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "v-tH-0CmWHjmtkL0C44VAirens-oy2GAQwY0lOK8XS3xDTbzeGm1jvEtzDXjmCg1",
+            "y" : "_S5V7EH9_oyru7e82BY2RaGenaxZYw8_6TsggJT_h81GG1PO9TSC5w4ujqhyAMw_"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "0000000000000000000000000000000000000000000000000000000036a2907c00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "y-coordinate of the public key is large",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "v-tH-0CmWHjmtkL0C44VAirens-oy2GAQwY0lOK8XS3xDTbzeGm1jvEtzDXjmCg1",
+            "y" : "AtGqE74CAXNUREhDJ-nJul5hYlOmnPDAFsTff2sAeDG55KwwCst9GPHRcViN_zPA"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "orZEKjf4o3WdLLkd9eynWxT1pnZtqANcwZQ7Fajk67YCXzc74zQIDyKrgho1Naan",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X7b8XxfVh97l6VAsTEiO89awbAmBAvYjCiZNC00ZJ8RhYB5HyrbZP68O6YIp1cXd",
+            "y" : "tBbIpSH978yrXL0Uo5sFxriMtl_7SHkIYlI1xpFkw55eJ-w0fH9Y-DEa3kIDSozh"
+          },
+          "shared" : "0000000000000000000000000000000000000000000000000000000036a2907c00000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "PPme8E9RpepjC6P5-WDdWToUyb45_SvSFdO0sIqq-Gu_kn8sRuUqsG-3QriFDlIe"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "6092a1757ddd43a04e185ff9472a0d18c7f7a7dc802f7e059e0c69ae16c802651719406e04de27652ff83da4a780ef2f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC",
+            "y" : "cyFSRC-27lw-bOHZIMBZvGI1Y4FNeQQrkDzmDx1Eh_zNRQqG2gPz5u1SXQIBe_2z"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "89c804cb81443386b185bcd9e2e6c35ee6177c3b90298985c4e81a89d520cceb17d729540e56ecc343c26bf314f2d052",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD",
+            "y" : "ZmAEGxx5hGIOjX_XzNtQzDuoFtoU1BpNiv-rqEiIZ_DKWiT41C3X5EtTCifcW1ja"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "35513157e804bd918d04de202778b81a6fc7ad8aa541ee94116a0f18466725d75e71c6942bf044b1b0ecba19db33e0de",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAD__________wAAAAAAAAAA__________8AAAAAAAAAAQAAAAAAAAAB",
+            "y" : "FBue5TEOqBcBMbYESEptZ37UJXYEW3FDwCZxCukrJ3r7vqDERYwiDVYeaUBNx9iI"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "102080c047881d19aefb01c29c82a4fb328a8ea6e6d6c914af73100507c8ee499799aaa646de0ea8c2727c0b5ed2439b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAP____8AAAAA_____wAAAAD_____AAAAAP____8AAAAA_____wAAAAD_____",
+            "y" : "cDcDhUE9Pv9vo0B7ok9oLCsBtRRF299e97DdCXnxfnE-CQgVcfHpTftmvyggAvOf"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "f689f6e475b4e15162521acab4637a3cdb9cb42aa92f9114b0ee300ddae89d5eafff3463a1f5004a2a1bd4aeffa47b78",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAD__wAA__8AAP__AAD__wAA__8AAP__AAD__wAA__8AAP__AAD__wAA__8AAP__",
+            "y" : "ES4ZHx94u8VLbMTwseWa6Mb_Ggf1Eo5B36KCjhtlONT6LKI5TGqrNEncs_xOtEwJ"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "f3486244119b3632fd55be9e6951eb5d9c8c62f6a27042f94b924155ecfd4ff8744ba3d25bcf85a7b925bd28a12b897f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AH__AAH__AAH__AAH__AAH__AAH__AAH__AAH__AAH__AAH__AAH__AAH__AAIAA",
+            "y" : "AopMjaWgURL-YCXvQZCJad4g0F2WaOXIUu8tSSFy3cKgpiL8SIFk_MGgdrhylCry"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "8171b7c80d4c90bb58ae54393921ab9c5c0b3196f045e9fe5c8b168f0e5f6a77e1aa34ecedc5481ce55ab34c14e0f2e8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "O17tgHJ7y8URO4qeTbHIGx3dwtmf9W2cPBBUNIkTveKWMRxL0vqJm00OZqqhtqDd",
+            "y" : "e38PKNVeLzpQ8fG-85doNKBbQ0GOl5MDvANj7RbS0LQBHMN7PAatcxVPrqt5Fc2H"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "1fe6fea5f00d3005abaae2267ff18e430915838d87909ab503885edf38be7618ecb321f0a4df71b0913fbf12c76fc1f0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "apmlrNSn7bHHB9f4vhLoEUAzjj4UulY8cDxoGjGaP5zh-Q8DK_hA83WOicuFLOym",
+            "y" : "PPme8E9RpepjC6P5-WDdWToUyb45_SvSFdO0sIqq-Gu_kn8sRuUqsG-3QriFDlIe"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "f58adc13ff997d38383910db7befb17670393a33d95b049c2aa19d760c8e728ecedd32168476b90b26a3742dcc121b07",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "fCWk9X92qxOyXKs8Jl252b2SX-y_e_k77xMId4ZGYo3sqwZ-2YipdVzYjojeNnEE",
+            "y" : "Vi7gxX5x2Wzv4xtMQEW9QIajjoq5rfLVVnvjGAUdcPOqaLdT8nGrAytqvM6Rnili"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "56299684ec5ceb09ba4d94d1231005a826c9c08a5219c757e0136cbe8b6430badd4925172f2939891da7c7893850512f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "f___4AAAD____AAAAf___4AAAD____AAAAf___4AAAD____AAAAf___4AAAEAAAC",
+            "y" : "RICrM8tL98t5wCTureP9ZB4vMANphADomGpzQ6XaWaOybupLQXblMjk3FDfYNKGn"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "1911a0ee6aebe263fdcf3db073f2598cdafabec2123a2f24a28c3d9151c871f32d6dc2f31d25af9c498fd68da23e5bef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC",
+            "y" : "B5faTAdRztFt6A0Wq3xlSl3CfQkmJtCGWhkqHF6nwbiMn8qwV5RnQeQcwoyA7Aua"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "15900643e2e0583976974b05f83c7a96611425f7c4a6eb51916ab958a037fd9cc172bdcfff4540a2ff3ce64e6505557e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "__AAAAAf____wAAAAH____8AAAAB_____AAAAAf____wAAAAH____8AAAAB_____",
+            "y" : "bHCJiub7MfovCGViry0QSGukxv1eQd_kqmFZi0cHo7wnamL-sbmFV-OxfAJfet9O"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "88a544a769d5c34a051416bd509dfac911863f604c83ea844bf0e4c5c272dec86d057a88b152a9274701938c705900c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "___wAAAD____AAAAP___8AAAA____wAAAD____AAAAP___8AAAA____wAAAEAAAA",
+            "y" : "DrFZKFi25uOhmcDz58XwtKkpFZNu-4vAQHaA63J0vnQiFWzoz8i1BbLZAsOZkjgP"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "b7db26b286e7527cb1f454782fe541862ff0f8d7eed960e22855deb7ac2a69611668c777c53bb74c2bcd40edfbf7944d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "____AAAAA_____AAAAA_____AAAAA_____AAAAA_____AAAAA_____AAAAA_____",
+            "y" : "SYerrkEoCcL6SP0jsb355iL1pgbEQRchX_phsY70blSn-78R-aa6WcmRtK5QH-3O"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "b1e8aab1aa633d98dc6b768594e1e3edb801a9ef483f287c83e19744d2ad343ad3debdc4dc178213ad6876b52284f552",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "________AAAAAAAAAP________8AAAAAAAAA_________wAAAAAAAAEAAAAAAAAB",
+            "y" : "NpH-ST1NKL-O4d_sgS1sMG6uCEKRntptxSXw1JrC0mqZIlGRITmik2hJ-db6lJpo"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "b0de006f80f6f89e4eea6e46dfe305153005612d1e903171ec2886230971961b5202a9f3187bdac413ac24c836adf7a0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "_____________________wAAAAAAAAAAAAAAAAAAAAD_____________________",
+            "y" : "YVhCqgawb3jwpm976ojUtu5ZZT7qoA3F4KK2WPlptxr5DJtOlr08ozhGlVvcy9NZ"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "ca8cfa42c5e374914c14d6402b1a99208e47e02ec49818913694ea0822a2cc6c310259a8f3ab7559b9974bc4c2fa337e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "__________________________________________7_____AAAAAAAAAAD____-",
+            "y" : "cyFSRC-27lw-bOHZIMBZvGI1Y4FNeQQrkDzmDx1Eh_zNRQqG2gPz5u1SXQIBe_2z"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "edf040bace18d90bf9ce720df2a3b31d76d95b7ed9530a159ac0b24e82a871033eada40552f9e606f7115e6a78927511",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8DEjsAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "cb0ecAw0B1w8rejOKdM3JK9op2crJlpOFXBVNgRAq3xGG46ayAJOY6i5wXwAAAAA"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "ea817dff44f1944a38444498f1b6c1a70a8b913aa326bc2acc5068805d8ddd7a5e41b8ee5b8371a1cf3f7a094258e3a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8DEjsAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "jkLhj_PL-KPDUhcx1izI21CXWJjU2aWx6o-qyfu_VIK55HFkN_2xnFdGPoT_____"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "ea817dff44f1944a38444498f1b6c1a70a8b913aa326bc2acc5068805d8ddd7a5e41b8ee5b8371a1cf3f7a094258e3a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaikHwAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "AAAAAH9XtpoBR4Pb-klnsvnPpnim8Lbpz9QWSM7Fs8SY5yFS2j-C09oujp-O83sR"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "bfa93e184f76279fd707d53ddcb3628855cfafb111bcbd0b4df6ef77aee624924d681626a153fa4e59c923b71fc090b3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaikHwAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "_____4CoSWX-uHwkBbaYTQYwWYdZD0kWMCvptzE6TDpnGN6sJcB9LCXRcWFxDITu"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "K8Fc85geq2ECw5-aklqhMJ21nCwCpUQRko1zw5RdFXhI3DaVnv73SVyFKOooTByX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y1Kls3Y2tCEAc0JSdEIrCtba2jk3yUYSpIyyiS37wGwyrdu-neoULwnDul5Y8VTu",
+            "y" : "IIqE4Mc6BiCHtJwtE2syzqtJrZ3c-ukkQCnEEgy7n_YIfy6-VojCB5emR8hx0NEE"
+          },
+          "shared" : "bfa93e184f76279fd707d53ddcb3628855cfafb111bcbd0b4df6ef77aee624924d681626a153fa4e59c923b71fc090b3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "6d-qq4CLOqwczKfMYkKn7lgySa_o7o9muQTMjuw0rTNEVuAPM6lN6LUWnPAZlVDA",
+            "y" : "IBVullFzT_mZxfPqYrg9AIOmCT8jRFclHs9yxB5N986iQgtUVKf2kANDgLrJgeku"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "B3pB1GBv-hRkeTx-X9x9mMudORAgLc0GvqTyQNNWbaa0CLuuUCZYDQLX5ccFAMgx",
+            "y" : "yZX3ygsMQoN9C76WAqn8mYUgtByFEVql92hMDtwRHqzCSr1r5LXSmLZfKGAKLx3x"
+          },
+          "shared" : "455aea9924330bd6d2d6403478327900e172e93598e254cf6d8eb13f0a3d21be51a46107333844e61dfa3d80df6928e9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "6d-qq4CLOqwczKfMYkKn7lgySa_o7o9muQTMjuw0rTNEVuAPM6lN6LUWnPAZlVDA",
+            "y" : "IBVullFzT_mZxfPqYrg9AIOmCT8jRFclHs9yxB5N986iQgtUVKf2kANDgLrJgeku"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "AAAAAP__________________________________________________________",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "r1HxihVijVYSyPcUQ275D5DVoLo1BU6ZxXRbsQ0L8xjMgsD38sEZ4Iox4_zKW5_j",
+            "y" : "HP-1ZchnGMWeHmpwpleQdon3OnET41__WWhh0-L67nCSm7E1dODhA1aUQgzXPgz1"
+          },
+          "shared" : "db1d8ef1117282870db8113aa4f58723c756ce598686eb8ea531aa4d39abb1b982b1e7bb2648a6c268d2d351204db8d5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "6d-qq4CLOqwczKfMYkKn7lgySa_o7o9muQTMjuw0rTNEVuAPM6lN6LUWnPAZlVDA",
+            "y" : "IBVullFzT_mZxfPqYrg9AIOmCT8jRFclHs9yxB5N986iQgtUVKf2kANDgLrJgeku"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "KEG02v8RPTdX_8rK2HpKdfBxGi_9I1Ke8fM_ynVmW0moqKzOVBOJSk0V6z20Hzcu",
+            "y" : "fEUl6RpTGNFxhPn_Up-j75atipUVVQ5YHC04kJz8TX7CWC202z4bd8IYFZDJ-rJJ"
+          },
+          "shared" : "e98062df47ef884c9411e16466af84ad271d586008b1fbc50aeb3b36836a35a770dd42e0db84d39b26f4dcd2dc03d90b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "6d-qq4CLOqwczKfMYkKn7lgySa_o7o9muQTMjuw0rTNEVuAPM6lN6LUWnPAZlVDA",
+            "y" : "IBVullFzT_mZxfPqYrg9AIOmCT8jRFclHs9yxB5N986iQgtUVKf2kANDgLrJgeku"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "f_______________________________________________________________",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "0T-b0MBbVsww9gEGpLjlAGk7nfBZac9HSU1dLBaFTvHYaSs-CbgJR_c1cQdhbdyz",
+            "y" : "uzx-gwbEb8OYxlIbZDRwwld02tg_r--1xkHP7K3sv5Sz1t1Zr3ruhqmJOQfWgZgU"
+          },
+          "shared" : "898aae0ebf1cb49fb6b1234d60f59006325421049a8a320820e1ad6af6593cdc2229a08c500aa55ca05999d12829db9c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 145,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "6d-qq4CLOqwczKfMYkKn7lgySa_o7o9muQTMjuw0rTNEVuAPM6lN6LUWnPAZlVDA",
+            "y" : "IBVullFzT_mZxfPqYrg9AIOmCT8jRFclHs9yxB5N986iQgtUVKf2kANDgLrJgeku"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "4-Jc2xYCCLZHTis01yv1hruhT3LD-X9RWkBdFCkZbmZzFht4rYCv5mTuUE1LFhq3",
+            "y" : "N3C2TVRCaVlZ-4nafrOnyvy6B50yAx32ITBJwcxQnj-RIMr43ZEJEV9AOFmsM3rM"
+          },
+          "shared" : "83f862f496ab8af12b82a8a0c047d836bdfa36281324b3a1eb2e9c1d46699d81cb125cbe4b93939fd84e1ae86d8a83cb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 146,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "6d-qq4CLOqwczKfMYkKn7lgySa_o7o9muQTMjuw0rTNEVuAPM6lN6LUWnPAZlVDA",
+            "y" : "IBVullFzT_mZxfPqYrg9AIOmCT8jRFclHs9yxB5N986iQgtUVKf2kANDgLrJgeku"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "________________________________x2NNgfQ3Ld9YGg2ySLCneezsGWrMxSlz",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "B53FZlEMxxj_NIeX4s_mfC_Ok79fbzm_dMGsPYy64--S3Zze36D1bQa6WRjXTZZC",
+            "y" : "WbJfZaJveEN2V7yBo3-Qd52ciI97e0oOydiqx3bbplXWC2KuM6470F8TKjA-lErc"
+          },
+          "shared" : "9a26894887a0342ca559a74a4d4a8e1d6b2084f02e1c65b3097121a9a9af047d8810fb945dc25bbf02222b3b625f1e0a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 147,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "6d-qq4CLOqwczKfMYkKn7lgySa_o7o9muQTMjuw0rTNEVuAPM6lN6LUWnPAZlVDA",
+            "y" : "IBVullFzT_mZxfPqYrg9AIOmCT8jRFclHs9yxB5N986iQgtUVKf2kANDgLrJgeku"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "________________________________x2NNgfQ3Ld9YGg2ySLCneuzcGWrMxSlz",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "2ul25L7jPfzrNGjph0zQ1HLI2rnst1ODT6Y4hMczqjhgc7sWNwblrLUAS13O1-XO",
+            "y" : "i6wBz6smj6QSpGD3AHV5Sl7eVsmhYPEzFzroaKJZGBYM1GuUHNy85AngsPTXAnsi"
+          },
+          "shared" : "8a8d9dc194a26910cbdae7908d185b6ad04b620c94c5ee331e584ed804e495bebc2290a2d7006a06e65b9bcace86c6f6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 148,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "6d-qq4CLOqwczKfMYkKn7lgySa_o7o9muQTMjuw0rTNEVuAPM6lN6LUWnPAZlVDA",
+            "y" : "IBVullFzT_mZxfPqYrg9AIOmCT8jRFclHs9yxB5N986iQgtUVKf2kANDgLrJgeku"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "________________________________x2NNgfQ3Ld9YGg2ySLCneuzkGWrMxSlz",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "pxs13OBdGmF3ZPsuJC1iunQshrE5I-iFZktg5Q8-VqRT6V9OFDYLwckAKqsdRacj",
+            "y" : "xpnhNP3vFVPuNWIOeUEOU2lr_U64di40Ngpn3K0L87rRj5Fg-PrGfoG7dGdJb7Gd"
+          },
+          "shared" : "d57f6aa12d3f07e8958499f249e52cfbe5be58482e146c5414dbbf984fc5333710350e2ce96b33beb7678381f40f1dcb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 149,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "6d-qq4CLOqwczKfMYkKn7lgySa_o7o9muQTMjuw0rTNEVuAPM6lN6LUWnPAZlVDA",
+            "y" : "IBVullFzT_mZxfPqYrg9AIOmCT8jRFclHs9yxB5N986iQgtUVKf2kANDgLrJgeku"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "________________________________x2NNgfQ3Ld9YGg2ySLCneuzsGWnMxSlz",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "uiITx61iuJVicr7rUdJYoqW-gE4OKe7RYaFiFu6J-4pFNGwthEOayBrDudZ1737O",
+            "y" : "VwJGw7uSeWHjgSMz76lMfW7Nu3EgoOE-uKYex9khVHElSl8-cfqiD_3cudv81_tk"
+          },
+          "shared" : "188e8041d9a5f0b6cfdad315ada4823beda0146774fad65b500e6ef94376ebf8af7a40ff6f6b45019a09dde7d7fb5552",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 150,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "6d-qq4CLOqwczKfMYkKn7lgySa_o7o9muQTMjuw0rTNEVuAPM6lN6LUWnPAZlVDA",
+            "y" : "IBVullFzT_mZxfPqYrg9AIOmCT8jRFclHs9yxB5N986iQgtUVKf2kANDgLrJgeku"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "________________________________x2NNgfQ3Ld9YGg2ySLCneuzsGWrMxSlZ",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "iNrpbcdquMsriNNj0fzuxqQ3PHHJA5mnzruyWgd5LEMU_N87yFZSdpws1Iu2Um6A",
+            "y" : "Qok3vbvwXLRErBLt_vNenzKaO7llj1ZjlYvs6zSe5zFee83A8ztVb4b55650Wmhl"
+          },
+          "shared" : "2ecf9dc47e8b07ae61ddbd1680ead02698e9e8469f78d5a28328e48d0c9d7a2ac787e50cba58cc44a32fb1235d2d7027",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "6d-qq4CLOqwczKfMYkKn7lgySa_o7o9muQTMjuw0rTNEVuAPM6lN6LUWnPAZlVDA",
+            "y" : "IBVullFzT_mZxfPqYrg9AIOmCT8jRFclHs9yxB5N986iQgtUVKf2kANDgLrJgeku"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "________________________________x2NNgfQ3Ld9YGg2ySLCneuzsGWrMxSlp",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "pmnFVjvWfuxnjSnW70_ehk83LZC3m56Ikx1cKSkSOMztjoWrUHv5GqnLLRMYZlj7",
+            "y" : "VndI1Rg-2GDdJvfCSg8TIgj-5qrz58POOv0ghzxI-lbWkn5p2313JmiHsJZIxd4i"
+          },
+          "shared" : "06ee9f55079d3d3c18c683ba33e0d2521be97c4fbf7917bf3b6287d58ffcde2df88842e3f5530b39549ac20974b1b60e",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "6d-qq4CLOqwczKfMYkKn7lgySa_o7o9muQTMjuw0rTNEVuAPM6lN6LUWnPAZlVDA",
+            "y" : "IBVullFzT_mZxfPqYrg9AIOmCT8jRFclHs9yxB5N986iQgtUVKf2kANDgLrJgeku"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "________________________________x2NNgfQ3Ld9YGg2ySLCneuzsGWrMxSlw",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "B3pB1GBv-hRkeTx-X9x9mMudORAgLc0GvqTyQNNWbaa0CLuuUCZYDQLX5ccFAMgx",
+            "y" : "NmoINfTzvXyC9EFp_VYDZnrfS-N67qVaCJez8SPu4VI9tUKTG0otZ0mg16D10OIO"
+          },
+          "shared" : "455aea9924330bd6d2d6403478327900e172e93598e254cf6d8eb13f0a3d21be51a46107333844e61dfa3d80df6928e9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 153,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "6d-qq4CLOqwczKfMYkKn7lgySa_o7o9muQTMjuw0rTNEVuAPM6lN6LUWnPAZlVDA",
+            "y" : "IBVullFzT_mZxfPqYrg9AIOmCT8jRFclHs9yxB5N986iQgtUVKf2kANDgLrJgeku"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "________________________________x2NNgfQ3Ld9YGg2ySLCneuzsGWrMxSlx",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "CNmZBXuj0tlpJgBFxVuX8IkCWVmm9DTWUdIH0Z-5bp5P4Ohuvg5k-FuWqcdSld9h",
+            "y" : "cX8OBaTkwxJIQBcgApJFi02KJ4pDkzvBb7GvoNqVS9mgArwVssYd0p6v4ZD1a_F_"
+          },
+          "shared" : "024c5281487216058270cd1cfe259e948310e4adc263a9edaa4da0bc3f5f8ce8ffc88ae41b2c050bf6dd9c8c66857237",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "xsr7dOKlDILHpj0TKUv-oT0LxQS6KwijkskIG_OBXZ5E2WntfwX_0dhZQ1UFPGFH",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "XlPoNhRrUZZ-dcYjR7QUbnnAVhCsYYuV2aYULAsj-80-OvhlSto7v-gegKdXrBYj",
+            "y" : "2tXCeTqL3j6KR6vboyV-QccHR8iWe7WU4K9dO5f6EegvcfIpz0z_O1zIW12oCQ5w"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 155,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "xsr7dOKlDILHpj0TKUv-oT0LxQS6KwijkskIG_OBXZ5E2WntfwX_0dhZQ1UFPGFH",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "XlPoNhRrUZZ-dcYjR7QUbnnAVhCsYYuV2aYULAsj-80-OvhlSto7v-gegKdXrBYj",
+            "y" : "2tXCeTqL3j6KR6vboyV-QccHR8iWe7WU4K9dO5f6EegvcfIpz0z_O1zIW12oCQ5w"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 156,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "__________________________________________7_____AAAAAAAAAAD____-"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "xsr7dOKlDILHpj0TKUv-oT0LxQS6KwijkskIG_OBXZ5E2WntfwX_0dhZQ1UFPGFH",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "XlPoNhRrUZZ-dcYjR7QUbnnAVhCsYYuV2aYULAsj-80-OvhlSto7v-gegKdXrBYj",
+            "y" : "2tXCeTqL3j6KR6vboyV-QccHR8iWe7WU4K9dO5f6EegvcfIpz0z_O1zIW12oCQ5w"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 157,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "__________________________________________7_____AAAAAAAAAAD_____"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "xsr7dOKlDILHpj0TKUv-oT0LxQS6KwijkskIG_OBXZ5E2WntfwX_0dhZQ1UFPGFH",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "XlPoNhRrUZZ-dcYjR7QUbnnAVhCsYYuV2aYULAsj-80-OvhlSto7v-gegKdXrBYj",
+            "y" : "2tXCeTqL3j6KR6vboyV-QccHR8iWe7WU4K9dO5f6EegvcfIpz0z_O1zIW12oCQ5w"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 158,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "xsr7dOKlDILHpj0TKUv-oT0LxQS6KwijkskIG_OBXZ5E2WntfwX_0dhZQ1UFPGFH",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "XlPoNhRrUZZ-dcYjR7QUbnnAVhCsYYuV2aYULAsj-80-OvhlSto7v-gegKdXrBYj",
+            "y" : "2tXCeTqL3j6KR6vboyV-QccHR8iWe7WU4K9dO5f6EegvcfIpz0z_O1zIW12oCQ5w"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 159,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "xsr7dOKlDILHpj0TKUv-oT0LxQS6KwijkskIG_OBXZ5E2WntfwX_0dhZQ1UFPGFH",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "XlPoNhRrUZZ-dcYjR7QUbnnAVhCsYYuV2aYULAsj-80-OvhlSto7v-gegKdXrBYj",
+            "y" : "2tXCeTqL3j6KR6vboyV-QccHR8iWe7WU4K9dO5f6EegvcfIpz0z_O1zIW12oCQ5w"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 160,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB",
+            "y" : "__________________________________________7_____AAAAAAAAAAD____-"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "xsr7dOKlDILHpj0TKUv-oT0LxQS6KwijkskIG_OBXZ5E2WntfwX_0dhZQ1UFPGFH",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "XlPoNhRrUZZ-dcYjR7QUbnnAVhCsYYuV2aYULAsj-80-OvhlSto7v-gegKdXrBYj",
+            "y" : "2tXCeTqL3j6KR6vboyV-QccHR8iWe7WU4K9dO5f6EegvcfIpz0z_O1zIW12oCQ5w"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 161,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB",
+            "y" : "__________________________________________7_____AAAAAAAAAAD_____"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "xsr7dOKlDILHpj0TKUv-oT0LxQS6KwijkskIG_OBXZ5E2WntfwX_0dhZQ1UFPGFH",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "XlPoNhRrUZZ-dcYjR7QUbnnAVhCsYYuV2aYULAsj-80-OvhlSto7v-gegKdXrBYj",
+            "y" : "2tXCeTqL3j6KR6vboyV-QccHR8iWe7WU4K9dO5f6EegvcfIpz0z_O1zIW12oCQ5w"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 162,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "__________________________________________7_____AAAAAAAAAAD____-",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "xsr7dOKlDILHpj0TKUv-oT0LxQS6KwijkskIG_OBXZ5E2WntfwX_0dhZQ1UFPGFH",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "XlPoNhRrUZZ-dcYjR7QUbnnAVhCsYYuV2aYULAsj-80-OvhlSto7v-gegKdXrBYj",
+            "y" : "2tXCeTqL3j6KR6vboyV-QccHR8iWe7WU4K9dO5f6EegvcfIpz0z_O1zIW12oCQ5w"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 163,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "__________________________________________7_____AAAAAAAAAAD____-",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "xsr7dOKlDILHpj0TKUv-oT0LxQS6KwijkskIG_OBXZ5E2WntfwX_0dhZQ1UFPGFH",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "XlPoNhRrUZZ-dcYjR7QUbnnAVhCsYYuV2aYULAsj-80-OvhlSto7v-gegKdXrBYj",
+            "y" : "2tXCeTqL3j6KR6vboyV-QccHR8iWe7WU4K9dO5f6EegvcfIpz0z_O1zIW12oCQ5w"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 164,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "__________________________________________7_____AAAAAAAAAAD____-",
+            "y" : "__________________________________________7_____AAAAAAAAAAD____-"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "xsr7dOKlDILHpj0TKUv-oT0LxQS6KwijkskIG_OBXZ5E2WntfwX_0dhZQ1UFPGFH",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "XlPoNhRrUZZ-dcYjR7QUbnnAVhCsYYuV2aYULAsj-80-OvhlSto7v-gegKdXrBYj",
+            "y" : "2tXCeTqL3j6KR6vboyV-QccHR8iWe7WU4K9dO5f6EegvcfIpz0z_O1zIW12oCQ5w"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 165,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "__________________________________________7_____AAAAAAAAAAD____-",
+            "y" : "__________________________________________7_____AAAAAAAAAAD_____"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "xsr7dOKlDILHpj0TKUv-oT0LxQS6KwijkskIG_OBXZ5E2WntfwX_0dhZQ1UFPGFH",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "XlPoNhRrUZZ-dcYjR7QUbnnAVhCsYYuV2aYULAsj-80-OvhlSto7v-gegKdXrBYj",
+            "y" : "2tXCeTqL3j6KR6vboyV-QccHR8iWe7WU4K9dO5f6EegvcfIpz0z_O1zIW12oCQ5w"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 166,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "__________________________________________7_____AAAAAAAAAAD_____",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "xsr7dOKlDILHpj0TKUv-oT0LxQS6KwijkskIG_OBXZ5E2WntfwX_0dhZQ1UFPGFH",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "XlPoNhRrUZZ-dcYjR7QUbnnAVhCsYYuV2aYULAsj-80-OvhlSto7v-gegKdXrBYj",
+            "y" : "2tXCeTqL3j6KR6vboyV-QccHR8iWe7WU4K9dO5f6EegvcfIpz0z_O1zIW12oCQ5w"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 167,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "__________________________________________7_____AAAAAAAAAAD_____",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "xsr7dOKlDILHpj0TKUv-oT0LxQS6KwijkskIG_OBXZ5E2WntfwX_0dhZQ1UFPGFH",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "XlPoNhRrUZZ-dcYjR7QUbnnAVhCsYYuV2aYULAsj-80-OvhlSto7v-gegKdXrBYj",
+            "y" : "2tXCeTqL3j6KR6vboyV-QccHR8iWe7WU4K9dO5f6EegvcfIpz0z_O1zIW12oCQ5w"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 168,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "__________________________________________7_____AAAAAAAAAAD_____",
+            "y" : "__________________________________________7_____AAAAAAAAAAD____-"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "xsr7dOKlDILHpj0TKUv-oT0LxQS6KwijkskIG_OBXZ5E2WntfwX_0dhZQ1UFPGFH",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "XlPoNhRrUZZ-dcYjR7QUbnnAVhCsYYuV2aYULAsj-80-OvhlSto7v-gegKdXrBYj",
+            "y" : "2tXCeTqL3j6KR6vboyV-QccHR8iWe7WU4K9dO5f6EegvcfIpz0z_O1zIW12oCQ5w"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 169,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "__________________________________________7_____AAAAAAAAAAD_____",
+            "y" : "__________________________________________7_____AAAAAAAAAAD_____"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "xsr7dOKlDILHpj0TKUv-oT0LxQS6KwijkskIG_OBXZ5E2WntfwX_0dhZQ1UFPGFH",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "XlPoNhRrUZZ-dcYjR7QUbnnAVhCsYYuV2aYULAsj-80-OvhlSto7v-gegKdXrBYj",
+            "y" : "2tXCeTqL3j6KR6vboyV-QccHR8iWe7WU4K9dO5f6EegvcfIpz0z_O1zIW12oCQ5w"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 170,
+          "comment" : "public point not on curve",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "ISGjSPl0OFWFnElvkdDzn-co_EbkjQB3EwUbIvHAJX_iDdhbId9-Hsgr-LObITii",
+            "y" : "rnT4DmJXd4-Myp8nm1fSXu6xVZYGQpcvBWfiBFFPCsHrHifbURUFMhGRSWHQlkTI"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "3kTmP9kk8Xc0DXgK9qquonH1LSy5pcUZtgIOBsPPC6r7wLgBxlCMLhSDsVz-96_C",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Zc5rnX5x6TG2_R-skQUHtDd6wV5FMpKiNV3zmrdByjYpe_bePDSlr7utNxgGuJHy",
+            "y" : "SwiLxdFGRqdPPvz-o54S4rX1brvdUD1ej-4_wwDXUJuqIrZo2_H9JBgHCrQKB9n2"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "public point = (0,0)",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "3kTmP9kk8Xc0DXgK9qquonH1LSy5pcUZtgIOBsPPC6r7wLgBxlCMLhSDsVz-96_C",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Zc5rnX5x6TG2_R-skQUHtDd6wV5FMpKiNV3zmrdByjYpe_bePDSlr7utNxgGuJHy",
+            "y" : "SwiLxdFGRqdPPvz-o54S4rX1brvdUD1ej-4_wwDXUJuqIrZo2_H9JBgHCrQKB9n2"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "using secp256r1",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y_ZgZZWj7lD5_OqieYwnQMglQFFrTlp9Nh_yTp3RU2Q",
+            "y" : "5UCLLmefnVMQ0faJOzbOFrSlB1CRdfy1KupTt4FVazk"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "3kTmP9kk8Xc0DXgK9qquonH1LSy5pcUZtgIOBsPPC6r7wLgBxlCMLhSDsVz-96_C",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Zc5rnX5x6TG2_R-skQUHtDd6wV5FMpKiNV3zmrdByjYpe_bePDSlr7utNxgGuJHy",
+            "y" : "SwiLxdFGRqdPPvz-o54S4rX1brvdUD1ej-4_wwDXUJuqIrZo2_H9JBgHCrQKB9n2"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "using secp256k1",
+          "public" : {
+            "crv" : "P-256K",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "oSY-dbh64JNwYP8UcvMw7lXN-PQynWKEqev7zIVsEWg",
+            "y" : "QiXnLL6_9B5U-28A4Rr-U6F5N77b8t94f475WE93WDg"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "3kTmP9kk8Xc0DXgK9qquonH1LSy5pcUZtgIOBsPPC6r7wLgBxlCMLhSDsVz-96_C",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Zc5rnX5x6TG2_R-skQUHtDd6wV5FMpKiNV3zmrdByjYpe_bePDSlr7utNxgGuJHy",
+            "y" : "SwiLxdFGRqdPPvz-o54S4rX1brvdUD1ej-4_wwDXUJuqIrZo2_H9JBgHCrQKB9n2"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "X6T6CyNcIeXJ87rqkwO_huzLfTHQuZjhQbxUtdxDsj4",
+            "y" : "73_Fz1YwjtWV7uma3mqvdNWRw9AKobQ4q8WclgfCLDY"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "1jMaWpaOTTvXM2pCO0EFW2jt0QC4uZjQDrntk4gcIeORK7LuCOcTJ74gWJhnXvek",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Lf93OogynmDUoGvzJrQTg6RSsTuMgHRexwG5xH4RThYRU4AmWcVyhAtW96p35FwW",
+            "y" : "LObo-hlEr8xFWhF_Id6Rz3sPPU6DoTziqqXlsLnvQzIqhN6zEXy3eEqG2KGGvLFb"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Public key uses wrong curve: secp521r1",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AFvOYf4nxED-261H2IvM9kXbnB0w2qCG5ZLotqChc7h5kbYZgBkHtCD6VYx5U6uXut2cbB2FhZ2evvdEGgiP9X7V",
+            "y" : "AI12ON5wP6q-taeOg-j81Ot4YUSnXXm9TMjPqL5mYS11bHtlxn9yxqy63m8NWel1LoRSBbKlYNT41qnoS_gS-U0Y"
+          },
+          "private" : {
+            "crv" : "P-384",
+            "d" : "1jMaWpaOTTvXM2pCO0EFW2jt0QC4uZjQDrntk4gcIeORK7LuCOcTJ74gWJhnXvek",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Lf93OogynmDUoGvzJrQTg6RSsTuMgHRexwG5xH4RThYRU4AmWcVyhAtW96p35FwW",
+            "y" : "LObo-hlEr8xFWhF_Id6Rz3sPPU6DoTziqqXlsLnvQzIqhN6zEXy3eEqG2KGGvLFb"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "curve" : "P-521",
+      "encoding" : "webcrypto",
+      "type" : "ECHDComp",
+      "tests" : [
+        {
+          "tcId" : 176,
+          "comment" : "normal case",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AGTaPpRzPbU2p0oNilyyJloxxUodplKaGYN3-9OFddnXl2nKK98tTJcmQpJtREiRplLn9JIzclGt8WE88wd5mbXO",
+            "y" : "AOBK0Zz5_UcisMgkwGn3DDwOfrxSiJQN-pJCIVKuSk95GDztN1r7VNsUCd3zOLhbttv8WVAWM0a7Y6kKcMWroJj3"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AZOZgrUpWWznepS8bv0D6SwhqEnrT4e49hnVBu_JuyLnxhZAyQ1Zj3lbZFZtxt9DmSrjShNB1FhXRECnNx9hHH3N",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AfrISzjXMtrM_O-q2aF449BPLDDhnEkl0RLogjXBDAiANtTR6iUo9eAgA9pwNTMXBInGV21uHk0Pxz7sEmylWs2E",
+            "y" : "AAkEthmdL26JCmVL4gyeZaQK0SAVcEOIGCL8Ut9BIORWOnzVkFwBZ41l6EXq6cZT4wP3nFI5EFUdIS-9fCXi0TRJ"
+          },
+          "shared" : "01f1e410f2c6262bce6879a3f46dfb7dd11d30eeee9ab49852102e1892201dd10f27266c2cf7cbccc7f6885099043dad80ff57f0df96acf283fb090de53df95f7d87",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 177,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AUxkMylpG6J0WaQN_nxM4Xs-oU0M16pHsB8TFUBNtRQ2-7_m3ghC4PfhJl9v86yih1BnfTNwsvsqbvSXNW9LlYES",
+            "y" : "AQUbFBeGOaCaQUZcctN0NDbuHBkf9ziKQBQLNNUxfeWRHqA827Ayn960RmlaO5LUNycanzwxiwLexNRzkIFYFA6X"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AKK2RCo3-KN1nSy5HfXsp1r2uJ4nuvL2y_lx3uUFj_qdjayAXHvHLzcYSJ1qnLJ4evjJOhfd6xoZIRqyNgTUe3ZG",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AD3ewT4NSLOUrihSr1ajt9tSpa__sU7UrYewKGBNDKMvORitbObL_UlQSGXKZHR-p9HVHRZ25XWSBJyF_oXHlOkn",
+            "y" : "AFitu6d2cyRAt8T6o7IcKkSLQBdppZYdPpVJvSd9LaywzrQRfUJVNprQ8ydOsciIX2KuREMq19F5SVUizFdPXp88"
+          },
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 178,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "ACnNMhJcI6Qa8k_UtynaD6rLw1UW7wulkJZgJXFpPNKC4m1n4Y70ZD0PbxWNc3DTOUypqN55OAMqwXjG_TTjcCuN",
+            "y" : "AIZJg04rQb46i3UQv-Vw9MZwdZQ80Mu52eHR2lJhi1uW1q7JtlDa8cpmJME-URYwK5x5yMTT01GRXR6OGratdgmO"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AKK2RCo3-KN1nSy5HfXsp1r2uJ4nuvL2y_lx3uUFj_qdjayAXHvHLzcYSJ1qnLJ4evjJOhfd6xoZIRqyNgTUe3ZG",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AD3ewT4NSLOUrihSr1ajt9tSpa__sU7UrYewKGBNDKMvORitbObL_UlQSGXKZHR-p9HVHRZ25XWSBJyF_oXHlOkn",
+            "y" : "AFitu6d2cyRAt8T6o7IcKkSLQBdppZYdPpVJvSd9LaywzrQRfUJVNprQ8ydOsciIX2KuREMq19F5SVUizFdPXp88"
+          },
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 179,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "ADLG8GzmoV6gZEZNNao2jSmcmp4eNo9pSu-2A4diSPiY8iPOAhe-831h6wmyfJMYfPjmG6exTjyb7mkrBqxtlfg2",
+            "y" : "AZ_Rn4SA4hxjIR1I1F-W9jZc9V-VjhoP5-pra5_yMKh7cLsbFNOl-2ZpqRZBxqz0VwwdOp5wmRO3_ms1_4HDlNan"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AKK2RCo3-KN1nSy5HfXsp1r2uJ4nuvL2y_lx3uUFj_qdjayAXHvHLzcYSJ1qnLJ4evjJOhfd6xoZIRqyNgTUe3ZG",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AD3ewT4NSLOUrihSr1ajt9tSpa__sU7UrYewKGBNDKMvORitbObL_UlQSGXKZHR-p9HVHRZ25XWSBJyF_oXHlOkn",
+            "y" : "AFitu6d2cyRAt8T6o7IcKkSLQBdppZYdPpVJvSd9LaywzrQRfUJVNprQ8ydOsciIX2KuREMq19F5SVUizFdPXp88"
+          },
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 180,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AffrluZLGmLa-eCAG_2WoLFbaOX1yz6QtDRJWkc5BzOOUwmOHC5JMzXQnGqub92gNFuYqu1Yjyq-gpEHE_tsICUp",
+            "y" : "ATlrF88lC8AY9M6tCX5-CYY_FM8SObBl5X2ISUnu4UGSb358n380zwU2NodnvA4atRQodyk6THImk6c_4UpTkK-T"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AKK2RCo3-KN1nSy5HfXsp1r2uJ4nuvL2y_lx3uUFj_qdjayAXHvHLzcYSJ1qnLJ4evjJOhfd6xoZIRqyNgTUe3ZG",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AD3ewT4NSLOUrihSr1ajt9tSpa__sU7UrYewKGBNDKMvORitbObL_UlQSGXKZHR-p9HVHRZ25XWSBJyF_oXHlOkn",
+            "y" : "AFitu6d2cyRAt8T6o7IcKkSLQBdppZYdPpVJvSd9LaywzrQRfUJVNprQ8ydOsciIX2KuREMq19F5SVUizFdPXp88"
+          },
+          "shared" : "000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 181,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AG3fmxCWXV_BKelvejdmfM9mzEQ4R3KQb-2yH53kYp4BqqCax8mGYRIGS7yb1Y68Ejqy_hnY_tGgVtJ7_vBjBQnH",
+            "y" : "ABxEExHvIKFjRjMupC1cZXiNaPaBewJn_KsR6pyUjtEIEV3ajoI6OAtgFGB0LTdy1kJMZ7JA2iR3L_DSzNmh4M6m"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AKK2RCo3-KN1nSy5HfXsp1r2uJ4nuvL2y_lx3uUFj_qdjayAXHvHLzcYSJ1qnLJ4evjJOhfd6xoZIRqyNgTUe3ZG",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AD3ewT4NSLOUrihSr1ajt9tSpa__sU7UrYewKGBNDKMvORitbObL_UlQSGXKZHR-p9HVHRZ25XWSBJyF_oXHlOkn",
+            "y" : "AFitu6d2cyRAt8T6o7IcKkSLQBdppZYdPpVJvSd9LaywzrQRfUJVNprQ8ydOsciIX2KuREMq19F5SVUizFdPXp88"
+          },
+          "shared" : "000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff00000000000000ffffffffffffff0000000000000100000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 182,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AHqMVHJoyUi2JtpjbPVEKOoqsjhh1JmoSte-HPaRuShyoG4mxtugjKntOG-D05YVbV-gI_V9XqZEDsdAHa0sCK1w",
+            "y" : "AYw4FbG5ouQlVUGabBkEP6Kw3cxLWm43L-6fyyJ9hbrXBGh-fhqBi2EtXARs11ly96LdXJogCsVYLNWf7EesUl7P"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AKK2RCo3-KN1nSy5HfXsp1r2uJ4nuvL2y_lx3uUFj_qdjayAXHvHLzcYSJ1qnLJ4evjJOhfd6xoZIRqyNgTUe3ZG",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AD3ewT4NSLOUrihSr1ajt9tSpa__sU7UrYewKGBNDKMvORitbObL_UlQSGXKZHR-p9HVHRZ25XWSBJyF_oXHlOkn",
+            "y" : "AFitu6d2cyRAt8T6o7IcKkSLQBdppZYdPpVJvSd9LaywzrQRfUJVNprQ8ydOsciIX2KuREMq19F5SVUizFdPXp88"
+          },
+          "shared" : "00003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff00000003fffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 183,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "ACkVPPBi-I8wPl1vmqyWi9kBB21ZlOp_gxgzseabZ-np_iDPnFYj4A4LnjWS_KKgMyS133yTGGr_aXrKhkYA1E7M",
+            "y" : "ACgBpi4vQQbzQQbaI9yT1Q4-l1odR1EAIYNSkGSbekElEJ9la2sLW9ALJNhOobpOHtSeYcUm-xARAFExyu5-4FAe"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AKK2RCo3-KN1nSy5HfXsp1r2uJ4nuvL2y_lx3uUFj_qdjayAXHvHLzcYSJ1qnLJ4evjJOhfd6xoZIRqyNgTUe3ZG",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AD3ewT4NSLOUrihSr1ajt9tSpa__sU7UrYewKGBNDKMvORitbObL_UlQSGXKZHR-p9HVHRZ25XWSBJyF_oXHlOkn",
+            "y" : "AFitu6d2cyRAt8T6o7IcKkSLQBdppZYdPpVJvSd9LaywzrQRfUJVNprQ8ydOsciIX2KuREMq19F5SVUizFdPXp88"
+          },
+          "shared" : "010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 184,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AKYeuZTihyLFmzxgB9_fizeJP2NQ9GGyagDhpFEEMUqumYnah-T6yyxO9yEYW32W2aRaKKECdWUBoazF0ymiG79z",
+            "y" : "AQ6NDhL1qaQODVnJDOcwQ9OXMK6t03iOMdfCu2KhFmFhmUZkr6ZYzi5goT9F8n-RQwfI1vjU7RarBBuPaZCKYngv"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AKK2RCo3-KN1nSy5HfXsp1r2uJ4nuvL2y_lx3uUFj_qdjayAXHvHLzcYSJ1qnLJ4evjJOhfd6xoZIRqyNgTUe3ZG",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AD3ewT4NSLOUrihSr1ajt9tSpa__sU7UrYewKGBNDKMvORitbObL_UlQSGXKZHR-p9HVHRZ25XWSBJyF_oXHlOkn",
+            "y" : "AFitu6d2cyRAt8T6o7IcKkSLQBdppZYdPpVJvSd9LaywzrQRfUJVNprQ8ydOsciIX2KuREMq19F5SVUizFdPXp88"
+          },
+          "shared" : "010000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff0000003ffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 185,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AR3Ul7MMc3CZBrFkqaedx_KpjAFI7WMBa7lSQ4NPvN-Ot0sP9lLVT1nzGu9R2m6JdNNjZVsdoTjcTeDyqNgA9HWu",
+            "y" : "AFe9S4RgdADYY_-_RaPPWJme4kugXpPsp7DkrnYOsXM1WaRdFVedM3DXFv-j7Ev9rkGOMvsGE438ohNyCpOFd2EO"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AKK2RCo3-KN1nSy5HfXsp1r2uJ4nuvL2y_lx3uUFj_qdjayAXHvHLzcYSJ1qnLJ4evjJOhfd6xoZIRqyNgTUe3ZG",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AD3ewT4NSLOUrihSr1ajt9tSpa__sU7UrYewKGBNDKMvORitbObL_UlQSGXKZHR-p9HVHRZ25XWSBJyF_oXHlOkn",
+            "y" : "AFitu6d2cyRAt8T6o7IcKkSLQBdppZYdPpVJvSd9LaywzrQRfUJVNprQ8ydOsciIX2KuREMq19F5SVUizFdPXp88"
+          },
+          "shared" : "01ff00000000000000000000000000000000ffffffffffffffffffffffffffffffff0000000000000000000000000000000100000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 186,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "ASg-uT-jaf5wErZH0h4Kl8-ZUOX77YGe9WFY8gyKlHOkGOzLyk3CtH9MttMi-RcAWFm_Ih6ErJgnyrgqgBxif7Hs",
+            "y" : "AHXEgMuvs1L8r5O68joUBf2B_r4JcpqQjRB34XfdiZPZSyUaDVJlLaPttv34ZOgM1RVA5z0LUQfjQzV23KpOGNtD"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AKK2RCo3-KN1nSy5HfXsp1r2uJ4nuvL2y_lx3uUFj_qdjayAXHvHLzcYSJ1qnLJ4evjJOhfd6xoZIRqyNgTUe3ZG",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AD3ewT4NSLOUrihSr1ajt9tSpa__sU7UrYewKGBNDKMvORitbObL_UlQSGXKZHR-p9HVHRZ25XWSBJyF_oXHlOkn",
+            "y" : "AFitu6d2cyRAt8T6o7IcKkSLQBdppZYdPpVJvSd9LaywzrQRfUJVNprQ8ydOsciIX2KuREMq19F5SVUizFdPXp88"
+          },
+          "shared" : "01ff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 187,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "ABc77v417oaNSX_2YBYo9lzhihWR9-SjpAZiLz9Qji2mjxAe0C_rw4QYxt38JqXsmEjEJ5JGOx6UX54WfbNL3y1m",
+            "y" : "AFMHBkerp81g6ylauBomijkD85PF0ou8XgIjUcN3zYTwLBnes2RCNyyuEzLpL5W6YLbIUuDeBxjonSTkPNR5yfsR"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AKK2RCo3-KN1nSy5HfXsp1r2uJ4nuvL2y_lx3uUFj_qdjayAXHvHLzcYSJ1qnLJ4evjJOhfd6xoZIRqyNgTUe3ZG",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AD3ewT4NSLOUrihSr1ajt9tSpa__sU7UrYewKGBNDKMvORitbObL_UlQSGXKZHR-p9HVHRZ25XWSBJyF_oXHlOkn",
+            "y" : "AFitu6d2cyRAt8T6o7IcKkSLQBdppZYdPpVJvSd9LaywzrQRfUJVNprQ8ydOsciIX2KuREMq19F5SVUizFdPXp88"
+          },
+          "shared" : "01ff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 188,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AJgpzVQyaHc5q2rhCvjqc9LLU7geuwa1lht7rcFnaz73sARU983lZ3SgExLVdKkZPBpf5TNvvmJiOtm_gRQ3ifn5",
+            "y" : "ABL5VWl-1XggcZe_mqw4llIWFdusyNxmXU8XFbCEOfScKqbtM3Aj_8zFB1qFlEk2gm25L5GXN8o6_q26GEcIS973"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AKK2RCo3-KN1nSy5HfXsp1r2uJ4nuvL2y_lx3uUFj_qdjayAXHvHLzcYSJ1qnLJ4evjJOhfd6xoZIRqyNgTUe3ZG",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AD3ewT4NSLOUrihSr1ajt9tSpa__sU7UrYewKGBNDKMvORitbObL_UlQSGXKZHR-p9HVHRZ25XWSBJyF_oXHlOkn",
+            "y" : "AFitu6d2cyRAt8T6o7IcKkSLQBdppZYdPpVJvSd9LaywzrQRfUJVNprQ8ydOsciIX2KuREMq19F5SVUizFdPXp88"
+          },
+          "shared" : "01ff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff00010000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 189,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "ASbjyVnNQRILuDaTsdagNLOFE3wbsyE7d2Ei_tlgVuMpiFcYpzvuY5wLpLaIGGgvSYzlSWklACvXZSUWQF_MT-yt",
+            "y" : "AHOpxuOwxpS_fMjMu9CYAOgeNUi6RKDCOBzvCwe_cCoZBUu11xeht5KUYJy9r9TiAYBk97LEwgTYGOt85SHDJozl"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AKK2RCo3-KN1nSy5HfXsp1r2uJ4nuvL2y_lx3uUFj_qdjayAXHvHLzcYSJ1qnLJ4evjJOhfd6xoZIRqyNgTUe3ZG",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AD3ewT4NSLOUrihSr1ajt9tSpa__sU7UrYewKGBNDKMvORitbObL_UlQSGXKZHR-p9HVHRZ25XWSBJyF_oXHlOkn",
+            "y" : "AFitu6d2cyRAt8T6o7IcKkSLQBdppZYdPpVJvSd9LaywzrQRfUJVNprQ8ydOsciIX2KuREMq19F5SVUizFdPXp88"
+          },
+          "shared" : "01ffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000003ffffff0000007fffffe000000ffffffc000001ffffff8000004000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 190,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AVPcSBqzxdyN7NJM6u4b7Hf1nyH38xwZU4rwR9KBrJ4lZ5M_09IQlrGF1AmJGVcZMbubC-cZeZXi-68hyKEAB63g",
+            "y" : "Aa1p8I_K4WQ5C-gmJWtQ-uR1As4OnKRq8MSQy0AzyIb4hmGpn_K9PJyOfaMPrytMdp7cWDGBCsBQVMl-QQY_SW4f"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AKK2RCo3-KN1nSy5HfXsp1r2uJ4nuvL2y_lx3uUFj_qdjayAXHvHLzcYSJ1qnLJ4evjJOhfd6xoZIRqyNgTUe3ZG",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AD3ewT4NSLOUrihSr1ajt9tSpa__sU7UrYewKGBNDKMvORitbObL_UlQSGXKZHR-p9HVHRZ25XWSBJyF_oXHlOkn",
+            "y" : "AFitu6d2cyRAt8T6o7IcKkSLQBdppZYdPpVJvSd9LaywzrQRfUJVNprQ8ydOsciIX2KuREMq19F5SVUizFdPXp88"
+          },
+          "shared" : "01ffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff0001fffc0007fff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 191,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AfWGYRyHFQKIw-hhFsXblKJnGJeIKdcB3awF6bDOIt7ksY6V9gy6eD7TOE2jc96u_Fe4Jl06NO60WL8kudgr4ygZ",
+            "y" : "AIRW4PHYBJLvAHjMJG0y_Hx_tnILTUWLUbIJjTV0Z1Kw7wNFvQ00Lf7m3S8S7RKzS9ldBYwoEf1HnS3eMhgObJ7y"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AKK2RCo3-KN1nSy5HfXsp1r2uJ4nuvL2y_lx3uUFj_qdjayAXHvHLzcYSJ1qnLJ4evjJOhfd6xoZIRqyNgTUe3ZG",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AD3ewT4NSLOUrihSr1ajt9tSpa__sU7UrYewKGBNDKMvORitbObL_UlQSGXKZHR-p9HVHRZ25XWSBJyF_oXHlOkn",
+            "y" : "AFitu6d2cyRAt8T6o7IcKkSLQBdppZYdPpVJvSd9LaywzrQRfUJVNprQ8ydOsciIX2KuREMq19F5SVUizFdPXp88"
+          },
+          "shared" : "01ffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc00000007fffffff00000001fffffffc000000080000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 192,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AV7ch_1JmnPqv_0U0ranCo-2m2o50NnE3aIze1PMcuSanj1aLZ6JMM-hGFLawzRDIn-6ZoS9dHMuaHmIS2752umP",
+            "y" : "AQ7rjS4zYOqXJmKAhSaK8_KgWtQSNdCokgmL1mG2NvfvCoICgpBu2j8f8ZgLmPtZNyKOntzWMy42QSFscwfn8_RS"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AKK2RCo3-KN1nSy5HfXsp1r2uJ4nuvL2y_lx3uUFj_qdjayAXHvHLzcYSJ1qnLJ4evjJOhfd6xoZIRqyNgTUe3ZG",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AD3ewT4NSLOUrihSr1ajt9tSpa__sU7UrYewKGBNDKMvORitbObL_UlQSGXKZHR-p9HVHRZ25XWSBJyF_oXHlOkn",
+            "y" : "AFitu6d2cyRAt8T6o7IcKkSLQBdppZYdPpVJvSd9LaywzrQRfUJVNprQ8ydOsciIX2KuREMq19F5SVUizFdPXp88"
+          },
+          "shared" : "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 193,
+          "comment" : "edge case for shared secret",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "ATG0MAL35ofuwez2olPCzMnkjwTYb8zRj-4NLSIZHx6lOcQNUhlwtHCdwDmG9kfg6LszQM-KPmQ6NUEDVDfPJfAV",
+            "y" : "ALJ6VaxF8ClvjJZWvP1Stc6p9BFcBuTGQxlgmEfUXpJBhADnhoZywNPm5ebgBKcZBHbtd8_DOtGaS9LGFa2ZUPN0"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AKK2RCo3-KN1nSy5HfXsp1r2uJ4nuvL2y_lx3uUFj_qdjayAXHvHLzcYSJ1qnLJ4evjJOhfd6xoZIRqyNgTUe3ZG",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AD3ewT4NSLOUrihSr1ajt9tSpa__sU7UrYewKGBNDKMvORitbObL_UlQSGXKZHR-p9HVHRZ25XWSBJyF_oXHlOkn",
+            "y" : "AFitu6d2cyRAt8T6o7IcKkSLQBdppZYdPpVJvSd9LaywzrQRfUJVNprQ8ydOsciIX2KuREMq19F5SVUizFdPXp88"
+          },
+          "shared" : "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 194,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "ANIOyf6mtXfBDSbKG7RG9AspnmSLGtUIqtBoiW_uP45hS8YwVNV3K_AaZdQS4LyqjpZdL10zLX85-EbUQK4AH0-H"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ASvBXPOYHqthAsOfmpJaoTB2PQHtbtrxQwbrChTddd_1BAcN73uI2LFlCC9pmS3g_6XukiyzqzmRfahSTKxz8KCc",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AX_Hz2ZtrFo4FsY3DNaSxOKGZdWpqnDOUYke5cdvkhRJ6WIFJecYzVJ5zWEu-7-4LxeuEqABQH9V05tpu3xvWbLq",
+            "y" : "AfYaLq3O-KwbkoMK9io0PLsTJSoszxq3UssVHgvTm1gBdSNL9kHUToZgdz2EIGhBHa838C5Z5UWpRsqcPvB-XAu9"
+          },
+          "shared" : "0053bf137fee8922769f8d0fe279caa4dac9c6054ad0460995588a845d0a959e24bc0fc2391a2b92f7bd400f50a11a9db37f07bef7fa8dad2a903fcf534abc8736f7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 195,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB",
+            "y" : "ABDlm-k8TyacAmnHnir9ZdauqptwHqzBlPs-4D30eEm_VQ7GNuvuDd1KFvHNlAZgWvOPWEVndw4_Jy1ojIMuhDVk"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ASvBXPOYHqthAsOfmpJaoTB2PQHtbtrxQwbrChTddd_1BAcN73uI2LFlCC9pmS3g_6XukiyzqzmRfahSTKxz8KCc",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AX_Hz2ZtrFo4FsY3DNaSxOKGZdWpqnDOUYke5cdvkhRJ6WIFJecYzVJ5zWEu-7-4LxeuEqABQH9V05tpu3xvWbLq",
+            "y" : "AfYaLq3O-KwbkoMK9io0PLsTJSoszxq3UssVHgvTm1gBdSNL9kHUToZgdz2EIGhBHa838C5Z5UWpRsqcPvB-XAu9"
+          },
+          "shared" : "01c95ac417c90a520149b29105cdab36f528a23efb5621520dbdafea95a7d43499c4c8be02cd1c2de000da18104fa84a1e9ece6386f0e0efa5234a24595d7c4c96f4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 196,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC",
+            "y" : "ANklT9-ABJasszeQsQPF7p-sEoMv5UbGMiJbD3_OPaRXSxqHm2I9ci-o_DTV_CqHMarWkamou4tVTJWgUdaqUFrP"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ASvBXPOYHqthAsOfmpJaoTB2PQHtbtrxQwbrChTddd_1BAcN73uI2LFlCC9pmS3g_6XukiyzqzmRfahSTKxz8KCc",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AX_Hz2ZtrFo4FsY3DNaSxOKGZdWpqnDOUYke5cdvkhRJ6WIFJecYzVJ5zWEu-7-4LxeuEqABQH9V05tpu3xvWbLq",
+            "y" : "AfYaLq3O-KwbkoMK9io0PLsTJSoszxq3UssVHgvTm1gBdSNL9kHUToZgdz2EIGhBHa838C5Z5UWpRsqcPvB-XAu9"
+          },
+          "shared" : "01b47ec41e3a5abd9dd9808fc04d9078cbed72b9eba98d3c1ded70a29938f0efd5a27a7113ff721f122cb17411de307a355c685074f5766b6d1a033d2fa188c945b6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 197,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "AF-ID1DslL-sZlj6L84FlFxqNrJmQHtvvVQ3qD4vL5ucUKc0hy5I5w32VFfxPkfQbGuLKfRzWs8QXqY-BRkE0Yrq"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ASvBXPOYHqthAsOfmpJaoTB2PQHtbtrxQwbrChTddd_1BAcN73uI2LFlCC9pmS3g_6XukiyzqzmRfahSTKxz8KCc",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AX_Hz2ZtrFo4FsY3DNaSxOKGZdWpqnDOUYke5cdvkhRJ6WIFJecYzVJ5zWEu-7-4LxeuEqABQH9V05tpu3xvWbLq",
+            "y" : "AfYaLq3O-KwbkoMK9io0PLsTJSoszxq3UssVHgvTm1gBdSNL9kHUToZgdz2EIGhBHa838C5Z5UWpRsqcPvB-XAu9"
+          },
+          "shared" : "013aefe3245728a08c904fe7d61cd9c2fdac63f29cf664d8f161bebacb93f8a710e9692f9689480ad498de00f00061e40e46e76e4754c1130ef4217a58933e0b1dc6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 198,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAA_________wAAAAAAAAD_________AAAAAAAAAP________8AAAAAAAAA_________wAAAAAAAAEAAAAAAAAA",
+            "y" : "APM__EXaPqwbqrcnq4_TVc-hNMQgR9VSYmUWVPtQ336aWnXxecjIbEOIITtWh9xD3-uzfzAShwPETM1cMoSDO4cX"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ASvBXPOYHqthAsOfmpJaoTB2PQHtbtrxQwbrChTddd_1BAcN73uI2LFlCC9pmS3g_6XukiyzqzmRfahSTKxz8KCc",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AX_Hz2ZtrFo4FsY3DNaSxOKGZdWpqnDOUYke5cdvkhRJ6WIFJecYzVJ5zWEu-7-4LxeuEqABQH9V05tpu3xvWbLq",
+            "y" : "AfYaLq3O-KwbkoMK9io0PLsTJSoszxq3UssVHgvTm1gBdSNL9kHUToZgdz2EIGhBHa838C5Z5UWpRsqcPvB-XAu9"
+          },
+          "shared" : "0168df272d53e3161926168c4aeab5f355b8d2a6689cfd567f2b6eb2011a18c775ac2a21f8dd497f6957217020b3b1afcb7021f24fccc2523be76a2bff44596e5a14",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 199,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAA_____AAAAA_____AAAAA_____AAAAA_____AAAAA_____AAAAA_____AAAAA_____AAAAA_____AAAAA_____",
+            "y" : "AM0oOdhXtGmfXI6KAZR4biaoYvCGtLqAdGrlIl7Tqmj5a3quxVIlgwu5j1LXUiEUGJe6SdejHrvwttfTE1LlJmGQ"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ASvBXPOYHqthAsOfmpJaoTB2PQHtbtrxQwbrChTddd_1BAcN73uI2LFlCC9pmS3g_6XukiyzqzmRfahSTKxz8KCc",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AX_Hz2ZtrFo4FsY3DNaSxOKGZdWpqnDOUYke5cdvkhRJ6WIFJecYzVJ5zWEu-7-4LxeuEqABQH9V05tpu3xvWbLq",
+            "y" : "AfYaLq3O-KwbkoMK9io0PLsTJSoszxq3UssVHgvTm1gBdSNL9kHUToZgdz2EIGhBHa838C5Z5UWpRsqcPvB-XAu9"
+          },
+          "shared" : "013db1b9241b23d33860d32dec37a79e4546a41afdfdd9c438d04e1f8b566ac8d9d3f572c293e96943722a4ee290e113fffaa82a61867d9ca28d349982354c9b256f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 200,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "AAgT2YKRGfQv-pX-qLqegeTNamypf7B3jhLl9d_jUgHdTMqOyg0uOVVVmXBBOB5qwfGN30x04LbpBBz9yh0cEDCR"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ASvBXPOYHqthAsOfmpJaoTB2PQHtbtrxQwbrChTddd_1BAcN73uI2LFlCC9pmS3g_6XukiyzqzmRfahSTKxz8KCc",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AX_Hz2ZtrFo4FsY3DNaSxOKGZdWpqnDOUYke5cdvkhRJ6WIFJecYzVJ5zWEu-7-4LxeuEqABQH9V05tpu3xvWbLq",
+            "y" : "AfYaLq3O-KwbkoMK9io0PLsTJSoszxq3UssVHgvTm1gBdSNL9kHUToZgdz2EIGhBHa838C5Z5UWpRsqcPvB-XAu9"
+          },
+          "shared" : "01d2bbe9f754584ebbc7c7ad74136d1c8a144948948aa8be49989dd9b4c514db2e2ab1e0713ad1699f632dd2cea53da218ed549f030a113e282fd9e3be462d9aba84",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 201,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AQAAAD____AAAAP___8AAAA____wAAAD____AAAAP___8AAAA____wAAAD____AAAAP___8AAAA____wAAAD____",
+            "y" : "AIeK1ZfSkNss9mBZSu7Q-bfI3WhFHS0bLLyBax7E81Rls5ZK_y7fElUWP1_KWAEy-Fyt4oh6AX580LNxlq2FIhEH"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ASvBXPOYHqthAsOfmpJaoTB2PQHtbtrxQwbrChTddd_1BAcN73uI2LFlCC9pmS3g_6XukiyzqzmRfahSTKxz8KCc",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AX_Hz2ZtrFo4FsY3DNaSxOKGZdWpqnDOUYke5cdvkhRJ6WIFJecYzVJ5zWEu-7-4LxeuEqABQH9V05tpu3xvWbLq",
+            "y" : "AfYaLq3O-KwbkoMK9io0PLsTJSoszxq3UssVHgvTm1gBdSNL9kHUToZgdz2EIGhBHa838C5Z5UWpRsqcPvB-XAu9"
+          },
+          "shared" : "000f37a2e2caef54fff4126c0fa96e7c47f0cad74626ef91e589e12d2e1e8c221be7295be9dc2712b87bb0aa0f5880b738bc1242f2ba773bf9eb2a54e3c1ca4758d7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 202,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Af8AAAAAAAAAAAAAAAAAAAAA_____________________wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "ALXhGRtEn6Hr29Z32qSPkOLR1sBYyHcIfK_ZNk2Z27KDxoQC5ubF9UEbLtQoJNiygM65EKumhHiDp-N4DiEyr0HB"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ASvBXPOYHqthAsOfmpJaoTB2PQHtbtrxQwbrChTddd_1BAcN73uI2LFlCC9pmS3g_6XukiyzqzmRfahSTKxz8KCc",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AX_Hz2ZtrFo4FsY3DNaSxOKGZdWpqnDOUYke5cdvkhRJ6WIFJecYzVJ5zWEu-7-4LxeuEqABQH9V05tpu3xvWbLq",
+            "y" : "AfYaLq3O-KwbkoMK9io0PLsTJSoszxq3UssVHgvTm1gBdSNL9kHUToZgdz2EIGhBHa838C5Z5UWpRsqcPvB-XAu9"
+          },
+          "shared" : "017aeb254d9c8c8ee06215ff33811357da73bf7f6dd6d7f8f176d62c065a88a9005f680c630e9f2763585ea2ee76b6e4ab45e673f814ebfa95947c0c63fb24fa6e9b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 203,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Af8AAAAAAAAAAP__________AAAAAAAAAAD__________wAAAAAAAAAA__________8AAAAAAAAAAP__________",
+            "y" : "ACB1E9YVZWocx1BcGKohsI4rHVqEHeCBbMKcAE79stkCrBp7sF4gcitXa2Sj3fTSSGQhrHBr9KQk8lI4Y2ilNA-2"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ASvBXPOYHqthAsOfmpJaoTB2PQHtbtrxQwbrChTddd_1BAcN73uI2LFlCC9pmS3g_6XukiyzqzmRfahSTKxz8KCc",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AX_Hz2ZtrFo4FsY3DNaSxOKGZdWpqnDOUYke5cdvkhRJ6WIFJecYzVJ5zWEu-7-4LxeuEqABQH9V05tpu3xvWbLq",
+            "y" : "AfYaLq3O-KwbkoMK9io0PLsTJSoszxq3UssVHgvTm1gBdSNL9kHUToZgdz2EIGhBHa838C5Z5UWpRsqcPvB-XAu9"
+          },
+          "shared" : "0061bed42248a37b4625ef04c4f9c7ef69ee3c6f9503378351fcab1b8ce1343206997eec1b88449eb6f7355711ea1a818a486ee30a24126241a7e2289267cf5dd61f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 204,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Af8AAAAA_____wAAAAD_____AAAAAP____8AAAAA_____wAAAAD_____AAAAAP____8AAAAA_____wAAAAD_____",
+            "y" : "AB_oAMUOVAErdaM-S-fQfI1g8paAo5XpUaajHFCWsOqSj8LL8yfdeE3Ap8pG6nOZK3WLVkE2S0q6Oek3mKTZJaAI"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ASvBXPOYHqthAsOfmpJaoTB2PQHtbtrxQwbrChTddd_1BAcN73uI2LFlCC9pmS3g_6XukiyzqzmRfahSTKxz8KCc",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AX_Hz2ZtrFo4FsY3DNaSxOKGZdWpqnDOUYke5cdvkhRJ6WIFJecYzVJ5zWEu-7-4LxeuEqABQH9V05tpu3xvWbLq",
+            "y" : "AfYaLq3O-KwbkoMK9io0PLsTJSoszxq3UssVHgvTm1gBdSNL9kHUToZgdz2EIGhBHa838C5Z5UWpRsqcPvB-XAu9"
+          },
+          "shared" : "001067d9104e296ef42b944587de11b10df05d2d959ed44cac9e7ef1c7a05d90819c43bc79c7397918f957cc98db931763bbeb1bdfc35865e8a359a013f13d60c433",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 205,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Af8AAP__AAD__wAA__8AAP__AAD__wAA__8AAP__AAD__wAA__8AAP__AAD__wAA__8AAP__AAD__wAA__8AAQAA",
+            "y" : "AI3Rih9eSCFAvnm7ZaIa1gyJh-UyyENF8BNa_9Ruxx7wKxyjrVbzAdlV-jBsEi1EHW_tz4uFXvJWNQv2nSOnIHrZ"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ASvBXPOYHqthAsOfmpJaoTB2PQHtbtrxQwbrChTddd_1BAcN73uI2LFlCC9pmS3g_6XukiyzqzmRfahSTKxz8KCc",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AX_Hz2ZtrFo4FsY3DNaSxOKGZdWpqnDOUYke5cdvkhRJ6WIFJecYzVJ5zWEu-7-4LxeuEqABQH9V05tpu3xvWbLq",
+            "y" : "AfYaLq3O-KwbkoMK9io0PLsTJSoszxq3UssVHgvTm1gBdSNL9kHUToZgdz2EIGhBHa838C5Z5UWpRsqcPvB-XAu9"
+          },
+          "shared" : "00b779d83035cf7bb0bb04c7b2f46d08f6791f0d1542c9bcce7250e772b12ad8e38fce1d2b063a06f0fa3a1b072dd976f5f8542979903075162f1f5c6ba3b76cc45d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 206,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Af_AAAAf___4AAAD____AAAAf___4AAAD____AAAAf___4AAAD____AAAAf___4AAAD____AAAAf___4AAAEAAAB",
+            "y" : "AFZiA90yWggcREHwAfeANlh0_T0Mm8RyJ0ga_napOuG_3mOvlyIDq_4ixjuA6D98whhMPLjP0BUsVDJMR1n9H5pQ"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ASvBXPOYHqthAsOfmpJaoTB2PQHtbtrxQwbrChTddd_1BAcN73uI2LFlCC9pmS3g_6XukiyzqzmRfahSTKxz8KCc",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AX_Hz2ZtrFo4FsY3DNaSxOKGZdWpqnDOUYke5cdvkhRJ6WIFJecYzVJ5zWEu-7-4LxeuEqABQH9V05tpu3xvWbLq",
+            "y" : "AfYaLq3O-KwbkoMK9io0PLsTJSoszxq3UssVHgvTm1gBdSNL9kHUToZgdz2EIGhBHa838C5Z5UWpRsqcPvB-XAu9"
+          },
+          "shared" : "01afe5d23733728b79c743933b9ba7dfec5ed19b7737e393908a1d000918aa795d1ce0ad533983d018f927b35d2af6463356573f387febd75911a49486202ca69d3a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 207,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Af_AAH__AAH__AAH__AAH__AAH__AAH__AAH__AAH__AAH__AAH__AAH__AAH__AAH__AAH__AAH__AAH__AAH__",
+            "y" : "ALEcZo-9VJ82iJ97Y0NAUdom8VcFg5E2sbFKCRUtehgup4BsNUeKMtOqPJwWJ6YVGevscbNvp3RJAluIKeJ_MHg0"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ASvBXPOYHqthAsOfmpJaoTB2PQHtbtrxQwbrChTddd_1BAcN73uI2LFlCC9pmS3g_6XukiyzqzmRfahSTKxz8KCc",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AX_Hz2ZtrFo4FsY3DNaSxOKGZdWpqnDOUYke5cdvkhRJ6WIFJecYzVJ5zWEu-7-4LxeuEqABQH9V05tpu3xvWbLq",
+            "y" : "AfYaLq3O-KwbkoMK9io0PLsTJSoszxq3UssVHgvTm1gBdSNL9kHUToZgdz2EIGhBHa838C5Z5UWpRsqcPvB-XAu9"
+          },
+          "shared" : "019612aeb386febb1a28096fe5b2f682dead02389785225b80a27df439510d08349a193839525f248b7f9bcabfd3dc8da8cc1724022299b7b5e72399d89464b82e44",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 208,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Af___wAAAAH____8AAAAB_____AAAAAf____wAAAAH____8AAAAB_____AAAAAf____wAAAAH____8AAAACAAAAC",
+            "y" : "AKp178Co2qwdc_MsnFUkFLzPRK-OdDMbR0OefcxJoTWz7mHp9pcX2JtLujVnoZWu2hP77GNL8phLXsa2-A9ZeO1a"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ASvBXPOYHqthAsOfmpJaoTB2PQHtbtrxQwbrChTddd_1BAcN73uI2LFlCC9pmS3g_6XukiyzqzmRfahSTKxz8KCc",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AX_Hz2ZtrFo4FsY3DNaSxOKGZdWpqnDOUYke5cdvkhRJ6WIFJecYzVJ5zWEu-7-4LxeuEqABQH9V05tpu3xvWbLq",
+            "y" : "AfYaLq3O-KwbkoMK9io0PLsTJSoszxq3UssVHgvTm1gBdSNL9kHUToZgdz2EIGhBHa838C5Z5UWpRsqcPvB-XAu9"
+          },
+          "shared" : "00570673f87adcef49c1f011e8b9f1e11f7fd3b3c93114d08d3f515aa4a895a6c701c523063bdc13ad1db0a54f6e7b476fe10db2070441befc58c8cff3c08ef76e59",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 209,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Af_____________________________________________________________________________________9",
+            "y" : "ABDlm-k8TyacAmnHnir9ZdauqptwHqzBlPs-4D30eEm_VQ7GNuvuDd1KFvHNlAZgWvOPWEVndw4_Jy1ojIMuhDVk"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ASvBXPOYHqthAsOfmpJaoTB2PQHtbtrxQwbrChTddd_1BAcN73uI2LFlCC9pmS3g_6XukiyzqzmRfahSTKxz8KCc",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AX_Hz2ZtrFo4FsY3DNaSxOKGZdWpqnDOUYke5cdvkhRJ6WIFJecYzVJ5zWEu-7-4LxeuEqABQH9V05tpu3xvWbLq",
+            "y" : "AfYaLq3O-KwbkoMK9io0PLsTJSoszxq3UssVHgvTm1gBdSNL9kHUToZgdz2EIGhBHa838C5Z5UWpRsqcPvB-XAu9"
+          },
+          "shared" : "0016aaf228b0aec190d4e4e5b8138ff9cc46d705da1bf002901c6ab420f59314d5b641712b14ef3e4fb125652c47888676804fb5575b741a8408c5625bfccff4fdda",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 210,
+          "comment" : "edge cases for ephemeral key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Af_____________________________________________________________________________________-",
+            "y" : "ANklT9-ABJasszeQsQPF7p-sEoMv5UbGMiJbD3_OPaRXSxqHm2I9ci-o_DTV_CqHMarWkamou4tVTJWgUdaqUFrP"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ASvBXPOYHqthAsOfmpJaoTB2PQHtbtrxQwbrChTddd_1BAcN73uI2LFlCC9pmS3g_6XukiyzqzmRfahSTKxz8KCc",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AX_Hz2ZtrFo4FsY3DNaSxOKGZdWpqnDOUYke5cdvkhRJ6WIFJecYzVJ5zWEu-7-4LxeuEqABQH9V05tpu3xvWbLq",
+            "y" : "AfYaLq3O-KwbkoMK9io0PLsTJSoszxq3UssVHgvTm1gBdSNL9kHUToZgdz2EIGhBHa838C5Z5UWpRsqcPvB-XAu9"
+          },
+          "shared" : "00a5d6dfda2b269f4ab895a41c3b71b6ba10d5c9f0d9b3e730275345e4721594abfd39464c227716ded8ef3e60bb1ca0b551716e3f6eebb48d5ce8e0ab58cb1b73c9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 211,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aa1QQ1kdvoFlf-PRw9elFmBq2dMgo1_Oiq7IqVD7U_lTiPP8SL6ZjpkzStnpI0ze0URx_obKzKoH0Fjuh3FzOsO5",
+            "y" : "AIVN42NmWQue5NA3DqawD369gVbM8U6Z8aU0SptJZPu4NIsIGohAxrZL53mXrYvr_qXn2femp_ptdlXFCyt4NfMU"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aac9NSRD3ikZXdkdamS1lZR5tSpuWxI9mrnlrXoRLXqN0a0_Fko6SDIFHaa9FrWf4huutJCGLDLqBaWRnS7eN619",
+            "y" : "AT6bA7l9-mLd2ZefhsbKuBTy8VV_qCqdAxfS-Ksfo1XO7C4t1M-NxXWwLVrO0d7DxwzxBcm8k6WQQl9YjKHuhsDl"
+          },
+          "shared" : "00f2246431b597930f2eae61e9aabbd39f8f6ae97c3cf2521a6aeecedda10b5ef5f3b2eb3a8906d02f51d244710aa9e19cc0be21db920132be1c91deb85e466c28df",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 212,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aa1QQ1kdvoFlf-PRw9elFmBq2dMgo1_Oiq7IqVD7U_lTiPP8SL6ZjpkzStnpI0ze0URx_obKzKoH0Fjuh3FzOsO5",
+            "y" : "AIVN42NmWQue5NA3DqawD369gVbM8U6Z8aU0SptJZPu4NIsIGohAxrZL53mXrYvr_qXn2femp_ptdlXFCyt4NfMU"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AAAAAAH_________________________________________________________________________________",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "APDdai5T8j6eULgfJV05C1rMMcyEBulXUfsVPGv2Wvm7GFrVmwrgyzXtIbsHy0OpWx9Q2_7wdjnLSMP2rGRf1ehn",
+            "y" : "AR_SHVvpnCjon7W0xs4tcTkLMwaPLVBHZXX86DUY2cH94hZy-aLp_ll_Gv-rLtG_b-7x6AneeNl-pdkAKi9xZFX7"
+          },
+          "shared" : "00347c51f587c726070bdeb9173d0a547427ead3f2c8de62d9ecc3013285f645d220931520bcef85d08cfb6786045745fbfbfb1924c44a89d06676131a965677272a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 213,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aa1QQ1kdvoFlf-PRw9elFmBq2dMgo1_Oiq7IqVD7U_lTiPP8SL6ZjpkzStnpI0ze0URx_obKzKoH0Fjuh3FzOsO5",
+            "y" : "AIVN42NmWQue5NA3DqawD369gVbM8U6Z8aU0SptJZPu4NIsIGohAxrZL53mXrYvr_qXn2femp_ptdlXFCyt4NfMU"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AeNeGCRe09rZZdLcZ7xu4DCJEReEExQgX0YWxvgOgNOGgVYZRnXzjFJDuZpdyBweOLGh_AMyvpYUC67XZmrmsoU_",
+            "y" : "AcNUGqW0ZAwsYLQ-T9dwCKNWuQJ85Hz2iJYVrDFFboETE_OhoIIHZAzq7BXSeiYLMrDzQdZJJZ5NyzieWcr9p3Qe"
+          },
+          "shared" : "01c41dc4437c2f2b94a940711b3a691723397a1f83d6bc0c67ddc7a657160925c7f85bb4eb3842b60b2610ddb7c0b8676267710e58359a8750843c6d8e25d48d1cd9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 214,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aa1QQ1kdvoFlf-PRw9elFmBq2dMgo1_Oiq7IqVD7U_lTiPP8SL6ZjpkzStnpI0ze0URx_obKzKoH0Fjuh3FzOsO5",
+            "y" : "AIVN42NmWQue5NA3DqawD369gVbM8U6Z8aU0SptJZPu4NIsIGohAxrZL53mXrYvr_qXn2femp_ptdlXFCyt4NfMU"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AP______________________________________________________________________________________",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AUqNTX6GVc3DP_fBRSjpEaOMoLkaccqkvl-IAJ2_DDk5FsOaypEJhJm99P1MEMb8brgGGTLTipMRQIblvqb5dAr-",
+            "y" : "AKZeU-K6t07lFmH0dg_u3mhFGV_5t66OCKjH_03cnGX4SqMmayvE-l-L0EJGzjEihDGYbPx7v8i81u9ZRf4hzzwk"
+          },
+          "shared" : "006a239cdb7a783840658d5f314bfe5c51e806a4bf1236f8421265bcc503c673eb16c5c2b38b5717fa04ee7dbcdeb15c871711507abb7557a8a8c7b3250141e854d5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 215,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aa1QQ1kdvoFlf-PRw9elFmBq2dMgo1_Oiq7IqVD7U_lTiPP8SL6ZjpkzStnpI0ze0URx_obKzKoH0Fjuh3FzOsO5",
+            "y" : "AIVN42NmWQue5NA3DqawD369gVbM8U6Z8aU0SptJZPu4NIsIGohAxrZL53mXrYvr_qXn2femp_ptdlXFCyt4NfMU"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AC2n2wKEDwI6NuH__q7hbTxHu0Nb7GojHUqrHsVBL1b7kPzE6quf2FcQhMudolJGbAUtIZE84P2kfmGCmXLOj5oX",
+            "y" : "AJga86YUVduK6TFhosBarsIIwawwVCsjv4cTZeRKTrCcimJl-cuWorYyz3_fd79t_FnNInixo2YRmXJZ5xk413qe"
+          },
+          "shared" : "0112dbf9713aadd478e4f2ebcb058f05b512b1959c7da1994f851f373ce8c341d39c6843373f6fe559905953e1147640159437953c571961c09bad157a8e1a5bf476",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 216,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aa1QQ1kdvoFlf-PRw9elFmBq2dMgo1_Oiq7IqVD7U_lTiPP8SL6ZjpkzStnpI0ze0URx_obKzKoH0Fjuh3FzOsO5",
+            "y" : "AIVN42NmWQue5NA3DqawD369gVbM8U6Z8aU0SptJZPu4NIsIGohAxrZL53mXrYvr_qXn2femp_ptdlXFCyt4NfMU"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "Af__________________________________________-lGGh4O_L5Zrf8wBSPcJpdA7tcm4iZxHrbtvtx6ROGQJ",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AYUaVQnahvW68KGb7M_Ja_z6KtS57BMnUHW1DTSwj1jzryRNsSAKf88tTQyyWeYpQpEtjuFmAmECVpShguJonb48",
+            "y" : "AJDRMoEwhWyunKw1eTNMtvAK7SSuLy_HTn11xwzwWU8mZsxczbHef_A03NtQ89n5f2U3lIjegtjOzxAeuWOlP7wZ"
+          },
+          "shared" : "003eca2210c8623105085aa284d119f3d716730595c6291aa89bf32a95e8a5fdc64f3d76e92494a43a9dced12d05b6dca4ffe649b32ac12cb0202e702dc83a2cb277",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aa1QQ1kdvoFlf-PRw9elFmBq2dMgo1_Oiq7IqVD7U_lTiPP8SL6ZjpkzStnpI0ze0URx_obKzKoH0Fjuh3FzOsO5",
+            "y" : "AIVN42NmWQue5NA3DqawD369gVbM8U6Z8aU0SptJZPu4NIsIGohAxrZL53mXrYvr_qXn2femp_ptdlXFCyt4NfMU"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "Af__________________________________________-lGGh4O_L5Zrf8wBSPcJpdA7tcm4iZxHrrtftx6ROGQJ",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "ALqKZb7o3i2ljrvsepGdFjEXX1GM_PC7DFFwsB-0vsrDC07zQbBhvfIkSCbgFaTG2GCsN7NodvNzobtZ8mdcNGWI",
+            "y" : "Ab1AtKB_khcDEjeYDgVx5BG_dZX916qEmSE3cFqe_ltlkArpYKPJgd6qiAsdgo1mBD4XRfF-UEJ7yWmjUHGpn2dK"
+          },
+          "shared" : "01c4cae9fbfdd45de51d8525e8447a7553c35cf358f1346f1d79666887bb749a3ba0de62e1866b47a447d53b6f1ca5a33ec94507e2cfb65544f5a1195fc6b4dc5810",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aa1QQ1kdvoFlf-PRw9elFmBq2dMgo1_Oiq7IqVD7U_lTiPP8SL6ZjpkzStnpI0ze0URx_obKzKoH0Fjuh3FzOsO5",
+            "y" : "AIVN42NmWQue5NA3DqawD369gVbM8U6Z8aU0SptJZPu4NIsIGohAxrZL53mXrYvr_qXn2femp_ptdlXFCyt4NfMU"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "Af__________________________________________-lGGh4O_L5Zrf8wBSPcJpdA7tcm4iZxHrrtntx6ROGQJ",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AaIcLgd-4xwG1W1n24wbbhZBnGeeJhF7pirlxheYPf7CH8JuOjz164M3frpxS7te4M57e-2H1mzBRHutIR1MqUzj",
+            "y" : "ASoR5Kw3VmLPbLHeFv9LWrZvaWgM1r4Tz_b8O5lHN0AdeGWP54xB2iUqReDMpiPTFJP06k649sjk1j8o7YYyPSij"
+          },
+          "shared" : "008073b4796e748f3d0de5e85b22aed463f1a6aecdb336bc287b50d139e3591ef5f86b78c3f6051467755f059f295d758075347d657aaae02383838bb96071eacbd4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aa1QQ1kdvoFlf-PRw9elFmBq2dMgo1_Oiq7IqVD7U_lTiPP8SL6ZjpkzStnpI0ze0URx_obKzKoH0Fjuh3FzOsO5",
+            "y" : "AIVN42NmWQue5NA3DqawD369gVbM8U6Z8aU0SptJZPu4NIsIGohAxrZL53mXrYvr_qXn2femp_ptdlXFCyt4NfMU"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "Af__________________________________________-lGGh4O_L5Zrf8wBSPcJpdA7tcm4iZxHrrtvtx2ROGQJ",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AI7ZWmst1vLbso89xljwX5sn5C8QDby9XT6PR2FcqxNsro70r0Tw2fnxv7pluDeGsDOt55F6exLe9Kvxf-sAjHpE",
+            "y" : "AVryjQRQ6LIJOphhnrGskuzUE7CrfZsW_syZfZhPAXE734mAEb0oCbtfcOnGO0sSYe_qjnlmL-yhSdxE-Vq5RDvt"
+          },
+          "shared" : "01f11ff8983792d4a790d0de4b56d078b9033ad6318a440e8119342937cc48a39375150ab2cf98273b0fe35d5a3af5d84322a685e89f2cb378a99b9b7bac87e44952",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aa1QQ1kdvoFlf-PRw9elFmBq2dMgo1_Oiq7IqVD7U_lTiPP8SL6ZjpkzStnpI0ze0URx_obKzKoH0Fjuh3FzOsO5",
+            "y" : "AIVN42NmWQue5NA3DqawD369gVbM8U6Z8aU0SptJZPu4NIsIGohAxrZL53mXrYvr_qXn2femp_ptdlXFCyt4NfMU"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "Af__________________________________________-lGGh4O_L5Zrf8wBSPcJpdA7tcm4iZxHrrtvtx6ROGMb",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AORUXIwOE0cAUmYidlO4YY5G7dqnuhexE-BtP6iV_-AZHIHuXtvmzyWKaa9DrZ4GIEYJULQujtP74QQpCp6GarZt",
+            "y" : "AKwhf2l4KU43C9CUSebeXRnqjpm-8bkZZMKfbcgYaHbYKD2nRQCZMFouLm60ymDq6mLmxBNNCN12uwc9BexJ0H4l"
+          },
+          "shared" : "00286cefaaf38ca4c6657eb9b187d8614d51775fd71c1a79b4c0ef1a0d4ce72b6f5b2bc854a4e78283530942a3f4fd2a8586d5ea51513c89d3d29de5de06321e118e",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 221,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aa1QQ1kdvoFlf-PRw9elFmBq2dMgo1_Oiq7IqVD7U_lTiPP8SL6ZjpkzStnpI0ze0URx_obKzKoH0Fjuh3FzOsO5",
+            "y" : "AIVN42NmWQue5NA3DqawD369gVbM8U6Z8aU0SptJZPu4NIsIGohAxrZL53mXrYvr_qXn2femp_ptdlXFCyt4NfMU"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "Af__________________________________________-lGGh4O_L5Zrf8wBSPcJpdA7tcm4iZxHrrtvtx6ROGOb",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AEfkzw8PVNDzLrF5Y7uuIIp20y4xYTtkeanJmFwkuRaGFvQCp2p_Zu3ARp3p_ZbFXb4z5vJEoRtElVxiL-7ugGRV",
+            "y" : "ARWqWC8daiLpeqQUt8cVQBFRGTW8s7hwRarFExkdEBrx-vYctN_s9vAHkocJYfb8kZKgsOyz6FAjNGjKe00AVva-"
+          },
+          "shared" : "014790de14c481f1336fcb7d33a8bf8e23eb594cc48608e9edfe0e326e106b67e7eaa3f04ec9985599178f632a5ee6419e11217060e9fcd5958a43882bf8cd3be6ba",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 222,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aa1QQ1kdvoFlf-PRw9elFmBq2dMgo1_Oiq7IqVD7U_lTiPP8SL6ZjpkzStnpI0ze0URx_obKzKoH0Fjuh3FzOsO5",
+            "y" : "AIVN42NmWQue5NA3DqawD369gVbM8U6Z8aU0SptJZPu4NIsIGohAxrZL53mXrYvr_qXn2femp_ptdlXFCyt4NfMU"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "Af__________________________________________-lGGh4O_L5Zrf8wBSPcJpdA7tcm4iZxHrrtvtx6ROGPb",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "ALvbFi2ChKkQAhmY4tFPM6jFGpz7mmmo_FcJ91Oq8cTSSKbdtWJlQPgdB8CSMdLsFUn2crbSvVfSL2TyroCT5zil",
+            "y" : "AMR5Dypt7ekQH-AWODVD70_1R-NgQmmL62LRMb20h5CTyNXnzu7Qq-zSgsUL0jcygehIE39PYFpg8b0-vXamntpl"
+          },
+          "shared" : "01ae775dbc4096a3aea7977b1a0af4b2830ecf9ca927a6247fba4cccb46b3f71d0e7abb8dda72d1c1ee7bb5b875b4773cc8df40f732819c4147da330775d1742ea35",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 223,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aa1QQ1kdvoFlf-PRw9elFmBq2dMgo1_Oiq7IqVD7U_lTiPP8SL6ZjpkzStnpI0ze0URx_obKzKoH0Fjuh3FzOsO5",
+            "y" : "AIVN42NmWQue5NA3DqawD369gVbM8U6Z8aU0SptJZPu4NIsIGohAxrZL53mXrYvr_qXn2femp_ptdlXFCyt4NfMU"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "Af__________________________________________-lGGh4O_L5Zrf8wBSPcJpdA7tcm4iZxHrrtvtx6ROGP7",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AYdbx9xVGxtlqeG4zPqvhN7RlYtAFJQRai_U-wur4LMZmXT8Bsi4lyIted8-S3vHRKpnZ_a4Eu-_XSyeaC3TQy10",
+            "y" : "AaNbbcqKJTSkLSmdb0RUS0IEe4_t1HGufZX3uDFkeSgSnS-Ifk5LDKez7hdkDi7MI_KklvCsV4N7Qb6ZYHrY_yq1"
+          },
+          "shared" : "01979fb05e068a12a3f20cfdfb9eaee9f22b356edcc7655383ed38124b86814f86a6f2216a34f3fc2299d403ee42408f95d08c5c6cd11db72cbf299a4a3c2545be25",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 224,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aa1QQ1kdvoFlf-PRw9elFmBq2dMgo1_Oiq7IqVD7U_lTiPP8SL6ZjpkzStnpI0ze0URx_obKzKoH0Fjuh3FzOsO5",
+            "y" : "AIVN42NmWQue5NA3DqawD369gVbM8U6Z8aU0SptJZPu4NIsIGohAxrZL53mXrYvr_qXn2femp_ptdlXFCyt4NfMU"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "Af__________________________________________-lGGh4O_L5Zrf8wBSPcJpdA7tcm4iZxHrrtvtx6ROGQD",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Ae5FadbNtZIZUy7_NPlEgNGVYj0wl3_XHPOYFQat5KsBUl-8yhYVP3OU4HJ6I5UxvowvZulWV_OAriNzG-33kga5",
+            "y" : "ACH9qlLzObCnlR0i2Pq5HE7u1VREjCWlf3GNv1bZ3-V1aTVI0vGpm3NiBpNnsh2LDd_COEdKo18lIeFTMoenK7Do"
+          },
+          "shared" : "0197ebe26798bf67f06ff0282773af75115531f41d94c093d87481b76bef707bc222f2d6672f84a00fa20c5ed27027ab4006b68d93ee2151016c9ddbe014346272e2",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 225,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aa1QQ1kdvoFlf-PRw9elFmBq2dMgo1_Oiq7IqVD7U_lTiPP8SL6ZjpkzStnpI0ze0URx_obKzKoH0Fjuh3FzOsO5",
+            "y" : "AIVN42NmWQue5NA3DqawD369gVbM8U6Z8aU0SptJZPu4NIsIGohAxrZL53mXrYvr_qXn2femp_ptdlXFCyt4NfMU"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "Af__________________________________________-lGGh4O_L5Zrf8wBSPcJpdA7tcm4iZxHrrtvtx6ROGQG",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aac9NSRD3ikZXdkdamS1lZR5tSpuWxI9mrnlrXoRLXqN0a0_Fko6SDIFHaa9FrWf4huutJCGLDLqBaWRnS7eN619",
+            "y" : "AMFk_EaCBZ0iJmhgeTk1R-sNDqqAV9Vi_OgtB1TgXKoxE9HSKzByOopP0qUxLiE8OPMO-jZDbFpvvaCnc14ReT8a"
+          },
+          "shared" : "00f2246431b597930f2eae61e9aabbd39f8f6ae97c3cf2521a6aeecedda10b5ef5f3b2eb3a8906d02f51d244710aa9e19cc0be21db920132be1c91deb85e466c28df",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "edge case private key",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aa1QQ1kdvoFlf-PRw9elFmBq2dMgo1_Oiq7IqVD7U_lTiPP8SL6ZjpkzStnpI0ze0URx_obKzKoH0Fjuh3FzOsO5",
+            "y" : "AIVN42NmWQue5NA3DqawD369gVbM8U6Z8aU0SptJZPu4NIsIGohAxrZL53mXrYvr_qXn2femp_ptdlXFCyt4NfMU"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "Af__________________________________________-lGGh4O_L5Zrf8wBSPcJpdA7tcm4iZxHrrtvtx6ROGQH",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AEM8IZAkJ35-aC_LKIFIwoJ0dAMnmxzMBjUsblUF12m-l7OyBNpu9VUHqhBKOjXFr0HPL6Nk1g_ZZ_Q-OTO6bXg9",
+            "y" : "AQtEczgHkk2Y_1gMExERLA9KOUrvg7JWiL9U3l1m-TvSREwciCFg2uCUbGyAVmXNtwsVA0FqEj8LCOQcqSmeC-T9"
+          },
+          "shared" : "01c168314cdc85757ade34a52a9e5379ffa5968f084b7e404939a8033a0fc698e26211754b9b2c04cf8a1420abe6e986ef1a238bbb91dd402b72e0ed50a876f1a83e",
+          "result" : "valid",
+          "flags" : [
+            "AddSubChain"
+          ]
+        },
+        {
+          "tcId" : 227,
+          "comment" : "CVE-2017-10176: Issue with elliptic curve addition",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AMaFjga3BATpzZ4-y2YjlbRCnGSBOQU_tSH4KK9ga009uqFLXnfv51ko_h3BJ6L_qN4zSLPBhWpCm_l-fjHC5b1m",
+            "y" : "ARg5KWp4mjvABFyKX7QsfRvZmPVESVebRGgXr70XJz5mLJfucple9CZAxVC5AT-tB2E1PHCGonLCQIi-lHaf0WZQ"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "Af__________________________________________-lGGh4O_L5Zrf8wBSPcJpdA7tcm4iZxHrrtvtx6ROGP3",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AbwzQl5yoSd56ssu3MW2PRKB9-htvHv5mnq9DP42feRmbW7buFJb_-UiLwcCwwlt7AiEzlcvWhXEI_30TQHdmcYd",
+            "y" : "APL5FmZ3pJysohwYsswmGcL9sE-DHy5pDarTcbX_U3s_u9y1FN_ghW7MbqLktLrfZGJYYB6k5gewLsonvh0nBleV"
+          },
+          "shared" : "01bc33425e72a12779eacb2edcc5b63d1281f7e86dbc7bf99a7abd0cfe367de4666d6edbb8525bffe5222f0702c3096dec0884ce572f5a15c423fdf44d01dd99c61d",
+          "result" : "valid",
+          "flags" : [
+            "CVE_2017_10176"
+          ]
+        },
+        {
+          "tcId" : 228,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AcbK-3TipQyCx6Y9EylL_qET8nHgGuMF95r0MgPNMhFezfL-5f7boq0xJng9sMPE0wKaFDaej4Db0V1RLxPlHFA8",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AJsV2VQvRXnYbPaNO2CsdCT7kCvhO6ZASWpAt6SsTQV7mQrWfDQlQQg_N3r2MiSOa4dt8d5cmFRzFQ0DBIsrzb35",
+            "y" : "AF7A0BtEJCH1SD4BbPQvispAEfAbn1RaiyDgBWh4UFBKqCgf3QCqMoc50Fome3qa_T9La5sViNTvEOH4ZzZSThtX"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AcbK-3TipQyCx6Y9EylL_qET8nHgGuMF95r0MgPNMhFezfL-5f7boq0xJng9sMPE0wKaFDaej4Db0V1RLxPlHFA8",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AJsV2VQvRXnYbPaNO2CsdCT7kCvhO6ZASWpAt6SsTQV7mQrWfDQlQQg_N3r2MiSOa4dt8d5cmFRzFQ0DBIsrzb35",
+            "y" : "AF7A0BtEJCH1SD4BbPQvispAEfAbn1RaiyDgBWh4UFBKqCgf3QCqMoc50Fome3qa_T9La5sViNTvEOH4ZzZSThtX"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "Af_____________________________________________________________________________________-"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AcbK-3TipQyCx6Y9EylL_qET8nHgGuMF95r0MgPNMhFezfL-5f7boq0xJng9sMPE0wKaFDaej4Db0V1RLxPlHFA8",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AJsV2VQvRXnYbPaNO2CsdCT7kCvhO6ZASWpAt6SsTQV7mQrWfDQlQQg_N3r2MiSOa4dt8d5cmFRzFQ0DBIsrzb35",
+            "y" : "AF7A0BtEJCH1SD4BbPQvispAEfAbn1RaiyDgBWh4UFBKqCgf3QCqMoc50Fome3qa_T9La5sViNTvEOH4ZzZSThtX"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 231,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "Af______________________________________________________________________________________"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AcbK-3TipQyCx6Y9EylL_qET8nHgGuMF95r0MgPNMhFezfL-5f7boq0xJng9sMPE0wKaFDaej4Db0V1RLxPlHFA8",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AJsV2VQvRXnYbPaNO2CsdCT7kCvhO6ZASWpAt6SsTQV7mQrWfDQlQQg_N3r2MiSOa4dt8d5cmFRzFQ0DBIsrzb35",
+            "y" : "AF7A0BtEJCH1SD4BbPQvispAEfAbn1RaiyDgBWh4UFBKqCgf3QCqMoc50Fome3qa_T9La5sViNTvEOH4ZzZSThtX"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 232,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AcbK-3TipQyCx6Y9EylL_qET8nHgGuMF95r0MgPNMhFezfL-5f7boq0xJng9sMPE0wKaFDaej4Db0V1RLxPlHFA8",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AJsV2VQvRXnYbPaNO2CsdCT7kCvhO6ZASWpAt6SsTQV7mQrWfDQlQQg_N3r2MiSOa4dt8d5cmFRzFQ0DBIsrzb35",
+            "y" : "AF7A0BtEJCH1SD4BbPQvispAEfAbn1RaiyDgBWh4UFBKqCgf3QCqMoc50Fome3qa_T9La5sViNTvEOH4ZzZSThtX"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 233,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AcbK-3TipQyCx6Y9EylL_qET8nHgGuMF95r0MgPNMhFezfL-5f7boq0xJng9sMPE0wKaFDaej4Db0V1RLxPlHFA8",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AJsV2VQvRXnYbPaNO2CsdCT7kCvhO6ZASWpAt6SsTQV7mQrWfDQlQQg_N3r2MiSOa4dt8d5cmFRzFQ0DBIsrzb35",
+            "y" : "AF7A0BtEJCH1SD4BbPQvispAEfAbn1RaiyDgBWh4UFBKqCgf3QCqMoc50Fome3qa_T9La5sViNTvEOH4ZzZSThtX"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 234,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB",
+            "y" : "Af_____________________________________________________________________________________-"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AcbK-3TipQyCx6Y9EylL_qET8nHgGuMF95r0MgPNMhFezfL-5f7boq0xJng9sMPE0wKaFDaej4Db0V1RLxPlHFA8",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AJsV2VQvRXnYbPaNO2CsdCT7kCvhO6ZASWpAt6SsTQV7mQrWfDQlQQg_N3r2MiSOa4dt8d5cmFRzFQ0DBIsrzb35",
+            "y" : "AF7A0BtEJCH1SD4BbPQvispAEfAbn1RaiyDgBWh4UFBKqCgf3QCqMoc50Fome3qa_T9La5sViNTvEOH4ZzZSThtX"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 235,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB",
+            "y" : "Af______________________________________________________________________________________"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AcbK-3TipQyCx6Y9EylL_qET8nHgGuMF95r0MgPNMhFezfL-5f7boq0xJng9sMPE0wKaFDaej4Db0V1RLxPlHFA8",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AJsV2VQvRXnYbPaNO2CsdCT7kCvhO6ZASWpAt6SsTQV7mQrWfDQlQQg_N3r2MiSOa4dt8d5cmFRzFQ0DBIsrzb35",
+            "y" : "AF7A0BtEJCH1SD4BbPQvispAEfAbn1RaiyDgBWh4UFBKqCgf3QCqMoc50Fome3qa_T9La5sViNTvEOH4ZzZSThtX"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 236,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Af_____________________________________________________________________________________-",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AcbK-3TipQyCx6Y9EylL_qET8nHgGuMF95r0MgPNMhFezfL-5f7boq0xJng9sMPE0wKaFDaej4Db0V1RLxPlHFA8",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AJsV2VQvRXnYbPaNO2CsdCT7kCvhO6ZASWpAt6SsTQV7mQrWfDQlQQg_N3r2MiSOa4dt8d5cmFRzFQ0DBIsrzb35",
+            "y" : "AF7A0BtEJCH1SD4BbPQvispAEfAbn1RaiyDgBWh4UFBKqCgf3QCqMoc50Fome3qa_T9La5sViNTvEOH4ZzZSThtX"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 237,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Af_____________________________________________________________________________________-",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AcbK-3TipQyCx6Y9EylL_qET8nHgGuMF95r0MgPNMhFezfL-5f7boq0xJng9sMPE0wKaFDaej4Db0V1RLxPlHFA8",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AJsV2VQvRXnYbPaNO2CsdCT7kCvhO6ZASWpAt6SsTQV7mQrWfDQlQQg_N3r2MiSOa4dt8d5cmFRzFQ0DBIsrzb35",
+            "y" : "AF7A0BtEJCH1SD4BbPQvispAEfAbn1RaiyDgBWh4UFBKqCgf3QCqMoc50Fome3qa_T9La5sViNTvEOH4ZzZSThtX"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 238,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Af_____________________________________________________________________________________-",
+            "y" : "Af_____________________________________________________________________________________-"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AcbK-3TipQyCx6Y9EylL_qET8nHgGuMF95r0MgPNMhFezfL-5f7boq0xJng9sMPE0wKaFDaej4Db0V1RLxPlHFA8",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AJsV2VQvRXnYbPaNO2CsdCT7kCvhO6ZASWpAt6SsTQV7mQrWfDQlQQg_N3r2MiSOa4dt8d5cmFRzFQ0DBIsrzb35",
+            "y" : "AF7A0BtEJCH1SD4BbPQvispAEfAbn1RaiyDgBWh4UFBKqCgf3QCqMoc50Fome3qa_T9La5sViNTvEOH4ZzZSThtX"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 239,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Af_____________________________________________________________________________________-",
+            "y" : "Af______________________________________________________________________________________"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AcbK-3TipQyCx6Y9EylL_qET8nHgGuMF95r0MgPNMhFezfL-5f7boq0xJng9sMPE0wKaFDaej4Db0V1RLxPlHFA8",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AJsV2VQvRXnYbPaNO2CsdCT7kCvhO6ZASWpAt6SsTQV7mQrWfDQlQQg_N3r2MiSOa4dt8d5cmFRzFQ0DBIsrzb35",
+            "y" : "AF7A0BtEJCH1SD4BbPQvispAEfAbn1RaiyDgBWh4UFBKqCgf3QCqMoc50Fome3qa_T9La5sViNTvEOH4ZzZSThtX"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 240,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Af______________________________________________________________________________________",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AcbK-3TipQyCx6Y9EylL_qET8nHgGuMF95r0MgPNMhFezfL-5f7boq0xJng9sMPE0wKaFDaej4Db0V1RLxPlHFA8",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AJsV2VQvRXnYbPaNO2CsdCT7kCvhO6ZASWpAt6SsTQV7mQrWfDQlQQg_N3r2MiSOa4dt8d5cmFRzFQ0DBIsrzb35",
+            "y" : "AF7A0BtEJCH1SD4BbPQvispAEfAbn1RaiyDgBWh4UFBKqCgf3QCqMoc50Fome3qa_T9La5sViNTvEOH4ZzZSThtX"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 241,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Af______________________________________________________________________________________",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AcbK-3TipQyCx6Y9EylL_qET8nHgGuMF95r0MgPNMhFezfL-5f7boq0xJng9sMPE0wKaFDaej4Db0V1RLxPlHFA8",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AJsV2VQvRXnYbPaNO2CsdCT7kCvhO6ZASWpAt6SsTQV7mQrWfDQlQQg_N3r2MiSOa4dt8d5cmFRzFQ0DBIsrzb35",
+            "y" : "AF7A0BtEJCH1SD4BbPQvispAEfAbn1RaiyDgBWh4UFBKqCgf3QCqMoc50Fome3qa_T9La5sViNTvEOH4ZzZSThtX"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 242,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Af______________________________________________________________________________________",
+            "y" : "Af_____________________________________________________________________________________-"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AcbK-3TipQyCx6Y9EylL_qET8nHgGuMF95r0MgPNMhFezfL-5f7boq0xJng9sMPE0wKaFDaej4Db0V1RLxPlHFA8",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AJsV2VQvRXnYbPaNO2CsdCT7kCvhO6ZASWpAt6SsTQV7mQrWfDQlQQg_N3r2MiSOa4dt8d5cmFRzFQ0DBIsrzb35",
+            "y" : "AF7A0BtEJCH1SD4BbPQvispAEfAbn1RaiyDgBWh4UFBKqCgf3QCqMoc50Fome3qa_T9La5sViNTvEOH4ZzZSThtX"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 243,
+          "comment" : "point is not on curve",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Af______________________________________________________________________________________",
+            "y" : "Af______________________________________________________________________________________"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "AcbK-3TipQyCx6Y9EylL_qET8nHgGuMF95r0MgPNMhFezfL-5f7boq0xJng9sMPE0wKaFDaej4Db0V1RLxPlHFA8",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AJsV2VQvRXnYbPaNO2CsdCT7kCvhO6ZASWpAt6SsTQV7mQrWfDQlQQg_N3r2MiSOa4dt8d5cmFRzFQ0DBIsrzb35",
+            "y" : "AF7A0BtEJCH1SD4BbPQvispAEfAbn1RaiyDgBWh4UFBKqCgf3QCqMoc50Fome3qa_T9La5sViNTvEOH4ZzZSThtX"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 244,
+          "comment" : "public point not on curve",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AMKkOsN0KwngBsLfycNkRNfmmfVnpz9nTOJXMwsxLdeooE--ktHZrLzGX2GEcRraW_OfbhHgy96Y8WQNCZ65Dfzn",
+            "y" : "AYAtd1XC_jGAhI1KcLFwCW7GTrqZtHi6f2_BKbBWYnm44at5YvqRL8SuU7UgKgNSBheEPcY-XLX5Vux_FFPQhl_h"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ATlqmaM3gh2MktdfVieTxwr6QHSuXm2tK9LMauqPNvbEXd3nOTFEDSKfNACTq4xvs_INIJmaNzcf6SEEaSE20Bm3",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aep4GB4E9ID9mJ4FlkJEYTt_emN5q_CBkyep9a3vpvRBB0UCi_GkaoAx_scAN-vLUH29j1C4EqS8wDE7p98Cx9NV",
+            "y" : "AeBFX-bOHqmYxzl1aUjPonu4sangygpQJjGDb5bg9d9mnLPKP298D5JAs9h-F0Fhs7BNg5q2_kbyRb1iZQXvS0FU"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 245,
+          "comment" : "public point = (0,0)",
+          "public" : {
+            "crv" : "P-521",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+            "y" : "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ATlqmaM3gh2MktdfVieTxwr6QHSuXm2tK9LMauqPNvbEXd3nOTFEDSKfNACTq4xvs_INIJmaNzcf6SEEaSE20Bm3",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aep4GB4E9ID9mJ4FlkJEYTt_emN5q_CBkyep9a3vpvRBB0UCi_GkaoAx_scAN-vLUH29j1C4EqS8wDE7p98Cx9NV",
+            "y" : "AeBFX-bOHqmYxzl1aUjPonu4sangygpQJjGDb5bg9d9mnLPKP298D5JAs9h-F0Fhs7BNg5q2_kbyRb1iZQXvS0FU"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 246,
+          "comment" : "using secp256r1",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "y_ZgZZWj7lD5_OqieYwnQMglQFFrTlp9Nh_yTp3RU2Q",
+            "y" : "5UCLLmefnVMQ0faJOzbOFrSlB1CRdfy1KupTt4FVazk"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ATlqmaM3gh2MktdfVieTxwr6QHSuXm2tK9LMauqPNvbEXd3nOTFEDSKfNACTq4xvs_INIJmaNzcf6SEEaSE20Bm3",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aep4GB4E9ID9mJ4FlkJEYTt_emN5q_CBkyep9a3vpvRBB0UCi_GkaoAx_scAN-vLUH29j1C4EqS8wDE7p98Cx9NV",
+            "y" : "AeBFX-bOHqmYxzl1aUjPonu4sangygpQJjGDb5bg9d9mnLPKP298D5JAs9h-F0Fhs7BNg5q2_kbyRb1iZQXvS0FU"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 247,
+          "comment" : "using secp256k1",
+          "public" : {
+            "crv" : "P-256K",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "oSY-dbh64JNwYP8UcvMw7lXN-PQynWKEqev7zIVsEWg",
+            "y" : "QiXnLL6_9B5U-28A4Rr-U6F5N77b8t94f475WE93WDg"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ATlqmaM3gh2MktdfVieTxwr6QHSuXm2tK9LMauqPNvbEXd3nOTFEDSKfNACTq4xvs_INIJmaNzcf6SEEaSE20Bm3",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "Aep4GB4E9ID9mJ4FlkJEYTt_emN5q_CBkyep9a3vpvRBB0UCi_GkaoAx_scAN-vLUH29j1C4EqS8wDE7p98Cx9NV",
+            "y" : "AeBFX-bOHqmYxzl1aUjPonu4sangygpQJjGDb5bg9d9mnLPKP298D5JAs9h-F0Fhs7BNg5q2_kbyRb1iZQXvS0FU"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : [
+            "InvalidPublic"
+          ]
+        },
+        {
+          "tcId" : 248,
+          "comment" : "Public key uses wrong curve: secp256r1",
+          "public" : {
+            "crv" : "P-256",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "UzZtt5syB4GTbfYbtV1EmZSdgT7lq6pd2nDaT5f2gig",
+            "y" : "zMadfNC3Jmz8KNDcr98-g3OMxhGssI-LiWxOz4LdZa4"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ACsNd81cR4kKUmEvybONgEJmuXhKvKK5Temb3GdHWuzCq8Mecqba2gzx1Nd2sALI0tvWAauKDK5BVzcIRrIOjdZX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AXJJDif2ZHz9C_d--fT0Fgqoz5tW4Owv6zKtEsrBSJIA-t9pT_CFC-J3QEPEM9OF_8Oflv73zc9NAJ3PElaggRdM",
+            "y" : "AS42eHj1z24ItC1YyBM3ie8P-dZ7DPpD5W4oNIJO-ZFTD8QiEzTSKEgh05Lqwh5Mpa8Upu1syEzN1QnO-kTByYdt"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 249,
+          "comment" : "Public key uses wrong curve: secp384r1",
+          "public" : {
+            "crv" : "P-384",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "qkXBPOPP6oU4QicSkD7cDOVt907eB3boQ1VaeG-XON4ZQ9_9cprd_UdyFpdR13Za",
+            "y" : "RbW7VApH0Zj0yMfCHmdWDB4S9wtkUgEJu4hYo_jWu0ASADQx2wd4YzMT_blGTEfs"
+          },
+          "private" : {
+            "crv" : "P-521",
+            "d" : "ACsNd81cR4kKUmEvybONgEJmuXhKvKK5Temb3GdHWuzCq8Mecqba2gzx1Nd2sALI0tvWAauKDK5BVzcIRrIOjdZX",
+            "kid" : "none",
+            "kty" : "EC",
+            "x" : "AXJJDif2ZHz9C_d--fT0Fgqoz5tW4Owv6zKtEsrBSJIA-t9pT_CFC-J3QEPEM9OF_8Oflv73zc9NAJ3PElaggRdM",
+            "y" : "AS42eHj1z24ItC1YyBM3ie8P-dZ7DPpD5W4oNIJO-ZFTD8QiEzTSKEgh05Lqwh5Mpa8Upu1syEzN1QnO-kTByYdt"
+          },
+          "shared" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdsa_brainpoolP224r1_sha224_test.json b/third_party/wycheproof/testvectors/ecdsa_brainpoolP224r1_sha224_test.json
new file mode 100644
index 0000000..13e8991
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdsa_brainpoolP224r1_sha224_test.json
@@ -0,0 +1,4125 @@
+{
+  "algorithm" : "ECDSA",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "BER" : "This is a signature with correct values for (r, s) but using some alternative BER encoding instead of DER encoding. Implementations should not accept such signatures to limit signature malleability.",
+    "EdgeCase" : "Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA implementation does not check boundaries and computes s^(-1)==0.",
+    "GroupIsomorphism" : "Some EC groups have isomorphic groups that allow an efficient implementation. This is a test vector that contains values that are edge cases on such an isomorphic group.",
+    "MissingZero" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.",
+    "PointDuplication" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission."
+  },
+  "numberOfTests" : 344,
+  "header" : [],
+  "testGroups" : [
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04572eab7376d052dfc40923db25342ea9cbfce4b8581e104a4c8f37c94a700ec5dc05a481b2b695320c6f1ad2dd8628633cdb75a91245c265",
+        "wx" : "572eab7376d052dfc40923db25342ea9cbfce4b8581e104a4c8f37c9",
+        "wy" : "4a700ec5dc05a481b2b695320c6f1ad2dd8628633cdb75a91245c265"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004572eab7376d052dfc40923db25342ea9cbfce4b8581e104a4c8f37c94a700ec5dc05a481b2b695320c6f1ad2dd8628633cdb75a91245c265",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABFcuq3N20FLfxAkj2yU0LqnL/OS4\nWB4QSkyPN8lKcA7F3AWkgbK2lTIMbxrS3YYoYzzbdakSRcJl\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "signature malleability",
+          "msg" : "313233343030",
+          "sig" : "303d021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021c139c78243a6e36e124d5f5e14b4cb8754abdf20ff1a501d5666a428f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "Legacy:ASN encoding of r misses leading 0",
+          "msg" : "313233343030",
+          "sig" : "303d021ccb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingZero"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "Legacy:ASN encoding of s misses leading 0",
+          "msg" : "313233343030",
+          "sig" : "303d021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021cc424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingZero"
+          ]
+        },
+        {
+          "tcId" : 4,
+          "comment" : "valid",
+          "msg" : "313233343030",
+          "sig" : "303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30813e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 6,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "303f02811d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 7,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "303f021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d302811d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 8,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3082003e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "30400282001d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 10,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3040021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30282001d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 11,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303f021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303d021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303e021e00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303e021c00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021e00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021c00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3085010000003e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "30430285010000001d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3043021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30285010000001d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "308901000000000000003e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3047028901000000000000001d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3047021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3028901000000000000001d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30847fffffff021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "304202847fffffff00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "3042021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d302847fffffff00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3084ffffffff021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "30420284ffffffff00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3042021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30284ffffffff00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3085ffffffffff021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "30430285ffffffffff00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3043021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30285ffffffffff00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3088ffffffffffffffff021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "30460288ffffffffffffffff00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3046021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30288ffffffffffffffff00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30ff021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "303e02ff00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d302ff00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "3080021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "303e028000cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3028000c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "3040021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "30400000021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "3040021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3043498177303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30422500303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3040303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30432222498177021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304222212500021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3046221f021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30004deadbeef021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3043021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d32222498177021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3042021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d322212500021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3046021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3221f021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3046aa00bb00cd00303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3044aa02aabb303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30462225aa00bb00cd00021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30442223aa02aabb021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3046021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d32225aa00bb00cd00021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3044021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d32223aa02aabb021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "30422280021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30000021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3042021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d32280021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3080313e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "30422280031d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30000021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3042021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d32280031d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2e3e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2f3e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "313e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "323e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "ff3e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "3042300102303d1d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "303d021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "303d1d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100000",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 80,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "3080021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d511000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "3080021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d511005000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "3080021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "3080021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "3080021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "30403000021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "3040021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51103000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "3040303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "301f021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "305d021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "removing integer",
+          "msg" : "313233343030",
+          "sig" : "301f021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "302002021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "3020021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d302",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3040021f00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30000021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3040021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021f00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3040021f000000cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 96,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3040021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021f000000c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 97,
+          "comment" : "appending unused 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3040021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30000021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "3040021f00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30500021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "3040021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021f00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51100500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "30210281021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "3021021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30281",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "30210500021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "3021021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303e001d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303e011d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303e031d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303e041d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303eff1d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3001d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3011d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3031d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3041d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3ff1d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "30210200021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "3021021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d30200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "30422221020100021ccb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "3042021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d32221020100021cc424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "303e021d02cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d02c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "303e021d00cb68ac9765c7641785df237e9951e1429581879af263146004896153021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5190",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "303d021c00cb68ac9765c7641785df237e9951e1429581879af2631460048961021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "303d021ccb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "303d021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021c00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d51",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "303d021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021cc424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "303f021eff00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "303f021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021eff00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "3022090180021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "3022021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3090180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "3022021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3020100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303e021d01a329e1418c0aca9daff753a40f22dcdb669843e66041d103aa30f572021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021cf3a777ed3f83fd915bc6f3592380e5a9c46acb4f848457bc5ee1ce34021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303e021dff349753689a389be87a20dc8166ae1ebd6a7e78650d9ceb9ffb769e2d021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021c0c588812c07c026ea4390ca6dc7f1a563b9534b07b7ba843a11e31cc021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303e021dfe5cd61ebe73f535625008ac5bf0dd23249967bc199fbe2efc55cf0a8e021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303e021d01cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021c349753689a389be87a20dc8166ae1ebd6a7e78650d9ceb9ffb769e2d021d00c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d019be5f1301218962b2f5a6a69a0553ebc576f8686ea187771e4e4e4af",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021cec6387dbc591c91edb2a0a1eb4b3478ab5420df00e5afe2a9995bd71",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021dff3bdb437a142ad05afabdc5bbd57bbcdc79a735c483c64531c0c2aef0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021dfe641a0ecfede769d4d0a595965faac143a890797915e7888e1b1b1b51",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303e021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021d01c424bc85ebd52fa505423a442a8443238658ca3b7c39bace3f3d5110",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021d00cb68ac9765c7641785df237e9951e1429581879af2631460048961d3021c3bdb437a142ad05afabdc5bbd57bbcdc79a735c483c64531c0c2aef0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 145,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020101090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30220201ff021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30220201ff021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30220201ff021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30220201ff021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30220201ff021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30080201ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3024021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3024021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a00201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3024021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3024021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c1000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3024021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 217,
+          "comment" : "Edge case for Shamir multiplication",
+          "msg" : "3935333838",
+          "sig" : "303d021c0e7ecab2276f035c0dc70520ebd5ae3cb7b7a8f21fa5687eee92c462021d0085a85332f8c899b53d43091b02e6956b391817e175a8b1f40dca7e00",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "special case hash",
+          "msg" : "32323534363238393834",
+          "sig" : "303d021c2fc2ef9f7663f66f13b04e49f206c22441eb3ee1917b8bf81a9b5376021d00d1df3dd0270e5884e9848ea2812b66f5015be96d2585fed3957b313c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "special case hash",
+          "msg" : "31383237383738363130",
+          "sig" : "303e021d00c682587bf43e0c954eb58bbcfeb94dfac8bad404995ac26e8e51ff20021d0092bf10da10324cc322f79c412daed305b275fc1993bf3af523ded62a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "special case hash",
+          "msg" : "31353138383631373039",
+          "sig" : "303d021c025d1cf16f03341f3c8d16a77839b5c1d696363dae898d91e14ad522021d00b7379cc35c97a8f08b0efb32ee82ce0e1911695d372ee6d679ec5466",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "special case hash",
+          "msg" : "32313239323333343232",
+          "sig" : "303e021d00c0c949e0f0f8571802ea7e02617ca925b95d290a174f686d80bba1d4021d00b966173ce3f13ca54ccdc8a249fea72e3260ad3e7854a731051d8c03",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "special case hash",
+          "msg" : "31323231393739303539",
+          "sig" : "303d021c5d57f14275947c9bffea66f9f30ae203194535f8020c42bbc1efec73021d00c358651ba2527c32d858657ccf08e535d32851fbd8c35477ba175680",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "special case hash",
+          "msg" : "32333032353637363131",
+          "sig" : "303c021c133bb12f1096989dc867d874f675fdf9e97975c2e22c71e44f59bf35021c6557eeb2b5b4f1f7c85184dcc653850c34b1c3480d2f32d1567c25c1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "special case hash",
+          "msg" : "31313035383638343732",
+          "sig" : "303d021d00d1dc7d1cc886ca90e0d960b6c7fda92ed582ec616c1c79b171ef3108021c41a7d21438e7c34b27176005ef67c04a63f362d2daf10b62c53b88b4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "special case hash",
+          "msg" : "31343636363134343432",
+          "sig" : "303e021d009ec3b7b4a0f1235169b64a20584d36b96bb7a2bde00d23163cc3b1bf021d00ac32ef3b9e948d967f96cd08507809e3b9a0e093be3e76b818331dd5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "special case hash",
+          "msg" : "343431393536343230",
+          "sig" : "303d021c392ae381da4ccfd9d5ad093d49b22d579411f7c1cd04e88473ab6ef5021d00a2898b8bf120d18e4ee0d15c419044324de3c0927ee90fd6f38711f4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "special case hash",
+          "msg" : "31393639343836303634",
+          "sig" : "303d021d00a37b0cc87f6d4620303030d7ac4a6572f94c0cf44f0a035c0e59d07c021c30c7acd8db9e72012208f08db5381a1e54fa098c0314a09a3058c421",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "special case hash",
+          "msg" : "32323335363732383833",
+          "sig" : "303d021c62f660d93a45dfa3b661f8b6a4d5e06e5a1ee8a8855abafa4073b513021d00d6978f5da8afcc5b395fd4b5f3c0fdb7a2689e6de46d08fb9de71860",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "special case hash",
+          "msg" : "32323537383433373033",
+          "sig" : "303c021c61af9a2ca20503fd62bc3c6f8434995c6cf3037eb6f9ff621348cf53021c09f8f647138769548db460efdd8323f8cad18a7071d3d04d6ad33d82",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "special case hash",
+          "msg" : "393434353030393436",
+          "sig" : "303d021c0e459cfe37017c8b605e38bf5d25176576d475fa88ded27be26abca7021d00b1bb6a60ccc3d48e8d1d4c53f90142806e44d9949ebcaa05b83e20f4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 231,
+          "comment" : "special case hash",
+          "msg" : "31363837373839343130",
+          "sig" : "303e021d00d0184882bdd6fa09996c2fecf3cd26ed86a3ce15987e06db850b8b2b021d00cff072b27c33f91681d3e95a47bec000cc96c5dc91f68eccc21ca3c4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 232,
+          "comment" : "special case hash",
+          "msg" : "333933323631323238",
+          "sig" : "303c021c357e96ab54f4dbb3a6a3a9d1ede6df5294639aedfdea96e7ffc9da31021c24eb6b7f55906739313ea2665a0504a3b0bf7a9b329c690f4a2edf51",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 233,
+          "comment" : "special case hash",
+          "msg" : "31303733353731303935",
+          "sig" : "303d021c0baaf79d5235e3268e55431cbd790046c2581ebd3f8b90627bd46b8b021d0083d56f6b56ca9381b14ca888281b481cf828e9b43b0d418108e82d58",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 234,
+          "comment" : "special case hash",
+          "msg" : "3630383837343734",
+          "sig" : "303c021c7ebef1ad41de9434eb3f6f83338f0109666c264d89123342b0900f05021c78a3a9fa7201c48f928344004a1f518053099df86908de29eeb76a4c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 235,
+          "comment" : "special case hash",
+          "msg" : "31313932353639393632",
+          "sig" : "303e021d009f20abeff0af965da9c51c99507cf5f91d75f23fe02b61150296167c021d00bf6fed8a8ef726f2f6629c4e4b50b3c2ce14ff439fe9bfe6157868d4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 236,
+          "comment" : "special case hash",
+          "msg" : "3930303736303933",
+          "sig" : "303c021c5ad67ff0ddf8cb88407974f83fea43d9d147cbb23dba261fadadaedb021c7fd31ccc4b3605db42b700a245df8fc60efbf1406afb4d6c8c16e0a3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 237,
+          "comment" : "special case hash",
+          "msg" : "31363032383336313337",
+          "sig" : "303c021c40e0bd9a2fa5a88678c85c3f4d27e2ae2dd046f29a3639ec2ff2511a021c16cd49215cb00533fd139ae1d3631d45fb06d5ecd1138ab46c48a45c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 238,
+          "comment" : "special case hash",
+          "msg" : "32303830323435363734",
+          "sig" : "303d021d009a705ddc8767e54cec4d1c37a2460b3c0b31e9811c3a427526499c01021c36a6b9dcd7c8a81e34afdf845c4cc0e73455011bbcd7987f887258ba",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 239,
+          "comment" : "special case hash",
+          "msg" : "31373938323734363539",
+          "sig" : "303d021d00a51a625b99568d003e4b96e693136ba75221e8e56c9ab5e9ec6816ee021c7e208918785516cda7cf70870dd812e80e8f9f1b5248d919b1ff1d06",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 240,
+          "comment" : "special case hash",
+          "msg" : "31313535353737373230",
+          "sig" : "303d021c4720f937100df52e6ae1baf40f8bc950e5af2b1f947d0417804a8225021d008b822273fb5d473c9c88aa3c8ddea167619cda12ee41ce65de268a75",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 241,
+          "comment" : "special case hash",
+          "msg" : "32343332343734363634",
+          "sig" : "303d021c3d281d98b6a676a6eda7570d7b4f9a08e924c71afd2cb6e062a7ebfd021d008446e42747a352518ef68eff055695b4766bdc2ad8d3fa97bc202b43",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 242,
+          "comment" : "special case hash",
+          "msg" : "32343137323832323737",
+          "sig" : "303c021c4d3469e939ffead941e3cbcebca3bcb6f3c029641f97700e02817738021c42cb87a10ea17c0e58c3822f6ae1f3a8918d86a8325def4a8c8082f2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 243,
+          "comment" : "special case hash",
+          "msg" : "3737383734373731",
+          "sig" : "303c021c21e51b79e8554e22937c3e5b1983b37762591e21f5706e5c1982a50c021c4bcdbd23b0a471db84d1ee3edf7677bbb14307ecc5e1023174ec5b8c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a0ef7db1bee0aedb5a5634f4f3b1b88d97d2a07f806a718efe19014daee1043f9e929c32d74ab0e4eeba2623f17ba281b6be87745b59f60e",
+        "wx" : "0a0ef7db1bee0aedb5a5634f4f3b1b88d97d2a07f806a718efe19014d",
+        "wy" : "0aee1043f9e929c32d74ab0e4eeba2623f17ba281b6be87745b59f60e"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004a0ef7db1bee0aedb5a5634f4f3b1b88d97d2a07f806a718efe19014daee1043f9e929c32d74ab0e4eeba2623f17ba281b6be87745b59f60e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABKDvfbG+4K7bWlY09POxuI2X0qB/\ngGpxjv4ZAU2u4QQ/npKcMtdKsOTuuiYj8Xuigba+h3RbWfYO\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 244,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "313233343030",
+          "sig" : "3030020f00dbeedf884b0c29fbcd51d9212d5f021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 245,
+          "comment" : "r too large",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d1d787b09f075797da89f57ec8c0fe021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043adda407bad7f593e83d7d484fd14c23dda17f8d460c222aa7257577cd62443b2b770291f65904dacf75ff975f1a667187e0e4f50c14889c",
+        "wx" : "3adda407bad7f593e83d7d484fd14c23dda17f8d460c222aa7257577",
+        "wy" : "0cd62443b2b770291f65904dacf75ff975f1a667187e0e4f50c14889c"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00043adda407bad7f593e83d7d484fd14c23dda17f8d460c222aa7257577cd62443b2b770291f65904dacf75ff975f1a667187e0e4f50c14889c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABDrdpAe61/WT6D19SE/RTCPdoX+N\nRgwiKqcldXfNYkQ7K3cCkfZZBNrPdf+XXxpmcYfg5PUMFIic\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 246,
+          "comment" : "r,s are large",
+          "msg" : "313233343030",
+          "sig" : "303e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939e021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7939d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0424587ce1dbff281dcab1794519806281ad4e0997492510677fb651069296996e83b808676cbf6f28c92b84303314b63a0308134f222d0ec2",
+        "wx" : "24587ce1dbff281dcab1794519806281ad4e0997492510677fb65106",
+        "wy" : "09296996e83b808676cbf6f28c92b84303314b63a0308134f222d0ec2"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a000424587ce1dbff281dcab1794519806281ad4e0997492510677fb651069296996e83b808676cbf6f28c92b84303314b63a0308134f222d0ec2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABCRYfOHb/ygdyrF5RRmAYoGtTgmX\nSSUQZ3+2UQaSlplug7gIZ2y/byjJK4QwMxS2OgMIE08iLQ7C\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 247,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "303c021c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff021c63f0e34258bb9061547906d0c3827c504422c139e6d6e1078b37aa44",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c45c51d5a9b213e41ca6f15cb8aa1bc0b8b73d3a8a23a14f5a3da4dfbc78cc6176d3b831e68800671768043c11bf63a695918df6ec87378a",
+        "wx" : "0c45c51d5a9b213e41ca6f15cb8aa1bc0b8b73d3a8a23a14f5a3da4df",
+        "wy" : "0bc78cc6176d3b831e68800671768043c11bf63a695918df6ec87378a"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004c45c51d5a9b213e41ca6f15cb8aa1bc0b8b73d3a8a23a14f5a3da4dfbc78cc6176d3b831e68800671768043c11bf63a695918df6ec87378a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABMRcUdWpshPkHKbxXLiqG8C4tz06\niiOhT1o9pN+8eMxhdtO4MeaIAGcXaAQ8Eb9jppWRjfbshzeK\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 248,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "303c021c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff021c6eb1fbfa8df87d4fa10c833f7dd1bbe7ef0144ff71537975378f91ec",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0436a5344da08a421edc6c3beb7de97a7559fc101c1489ff2b5036d8f6207bf4666e4df606bd0d9823a52b58ddfdfc1da70513c5f9990f8085",
+        "wx" : "36a5344da08a421edc6c3beb7de97a7559fc101c1489ff2b5036d8f6",
+        "wy" : "207bf4666e4df606bd0d9823a52b58ddfdfc1da70513c5f9990f8085"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a000436a5344da08a421edc6c3beb7de97a7559fc101c1489ff2b5036d8f6207bf4666e4df606bd0d9823a52b58ddfdfc1da70513c5f9990f8085",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABDalNE2gikIe3Gw7633penVZ/BAc\nFIn/K1A22PYge/Rmbk32Br0NmCOlK1jd/fwdpwUTxfmZD4CF\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 249,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044095c095a9648951da352b837f368e0be67d79fd57eadfffeddfb455ccdcfabea19e96d4d20e42b8ae23c2519426018e25a64dea85d8a68b",
+        "wx" : "4095c095a9648951da352b837f368e0be67d79fd57eadfffeddfb455",
+        "wy" : "0ccdcfabea19e96d4d20e42b8ae23c2519426018e25a64dea85d8a68b"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00044095c095a9648951da352b837f368e0be67d79fd57eadfffeddfb455ccdcfabea19e96d4d20e42b8ae23c2519426018e25a64dea85d8a68b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABECVwJWpZIlR2jUrg382jgvmfXn9\nV+rf/+3ftFXM3Pq+oZ6W1NIOQriuI8JRlCYBjiWmTeqF2KaL\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 250,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020102",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cc352ac48aacb6495ec3831b21ccd4d3197136292bf6f20f2280256664321991e67f7dbc22602ecbdb3122edce5ff85d923143cecc0d4f6d",
+        "wx" : "0cc352ac48aacb6495ec3831b21ccd4d3197136292bf6f20f22802566",
+        "wy" : "64321991e67f7dbc22602ecbdb3122edce5ff85d923143cecc0d4f6d"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004cc352ac48aacb6495ec3831b21ccd4d3197136292bf6f20f2280256664321991e67f7dbc22602ecbdb3122edce5ff85d923143cecc0d4f6d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABMw1KsSKrLZJXsODGyHM1NMZcTYp\nK/byDyKAJWZkMhmR5n99vCJgLsvbMSLtzl/4XZIxQ87MDU9t\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 251,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020103",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 252,
+          "comment" : "r is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3022021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a0020103",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049148f29c67f83c705eefb59c92954775f90c15e225da2e996abcdd1dc9db1aa1e15277c4555d24118239e53fd2f0b5e7ea807eb3de1ee350",
+        "wx" : "09148f29c67f83c705eefb59c92954775f90c15e225da2e996abcdd1d",
+        "wy" : "0c9db1aa1e15277c4555d24118239e53fd2f0b5e7ea807eb3de1ee350"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00049148f29c67f83c705eefb59c92954775f90c15e225da2e996abcdd1dc9db1aa1e15277c4555d24118239e53fd2f0b5e7ea807eb3de1ee350",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABJFI8pxn+DxwXu+1nJKVR3X5DBXi\nJdoumWq83R3J2xqh4VJ3xFVdJBGCOeU/0vC15+qAfrPeHuNQ\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 253,
+          "comment" : "s is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5ba6a26",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049bf045a43a5f14d5e412ee181f111d6e53961120531f3c50ca701e78be9eb95146f4f2be96949976a7aa49d31593a7da2edd907652398c3a",
+        "wx" : "09bf045a43a5f14d5e412ee181f111d6e53961120531f3c50ca701e78",
+        "wy" : "0be9eb95146f4f2be96949976a7aa49d31593a7da2edd907652398c3a"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00049bf045a43a5f14d5e412ee181f111d6e53961120531f3c50ca701e78be9eb95146f4f2be96949976a7aa49d31593a7da2edd907652398c3a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABJvwRaQ6XxTV5BLuGB8RHW5TlhEg\nUx88UMpwHni+nrlRRvTyvpaUmXanqknTFZOn2i7dkHZSOYw6\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 254,
+          "comment" : "small r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302302020102021d009dfe5cfd9b02fe7a6f747bf31dd581d0a93cfecc66a1173d611dfd3c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0487739e2821ed9567e88702fa8c6d083c97c1f3f1eb32d13f751fb0736d02eba05e8cb94672d09ebc11051d52ec7bd4dc7767301b67034212",
+        "wx" : "087739e2821ed9567e88702fa8c6d083c97c1f3f1eb32d13f751fb073",
+        "wy" : "6d02eba05e8cb94672d09ebc11051d52ec7bd4dc7767301b67034212"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a000487739e2821ed9567e88702fa8c6d083c97c1f3f1eb32d13f751fb0736d02eba05e8cb94672d09ebc11051d52ec7bd4dc7767301b67034212",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABIdznigh7ZVn6IcC+oxtCDyXwfPx\n6zLRP3UfsHNtAuugXoy5RnLQnrwRBR1S7HvU3HdnMBtnA0IS\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 255,
+          "comment" : "smallish r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302702072d9b4d347952cc021c43e235748bd3b1bfa14c92234a90261acc3e9086810801a36746bcee",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041a515cbe957bfc070e4c4a75d6fd5e7c15b1e255eb42fead06c9d2636252cc0d234318394df7db65b0a52e06953ca6c21ec95774d39efdc9",
+        "wx" : "1a515cbe957bfc070e4c4a75d6fd5e7c15b1e255eb42fead06c9d263",
+        "wy" : "6252cc0d234318394df7db65b0a52e06953ca6c21ec95774d39efdc9"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00041a515cbe957bfc070e4c4a75d6fd5e7c15b1e255eb42fead06c9d2636252cc0d234318394df7db65b0a52e06953ca6c21ec95774d39efdc9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABBpRXL6Ve/wHDkxKddb9XnwVseJV\n60L+rQbJ0mNiUswNI0MYOU3322WwpS4GlTymwh7JV3TTnv3J\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 256,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "313233343030",
+          "sig" : "302e020d1033e67e37b32b445580bf4efb021d00a8bdf46532d8136beb21dbf178090c7e7dad2caa8eb52cef8d830fd8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d6a16e194e12b96db8e1bb0250d950f7b3129b14bba0efb157c4423e625a0c8c20838bd97fbc89f1670028754a09ad28f62de5eea6e07bc1",
+        "wx" : "0d6a16e194e12b96db8e1bb0250d950f7b3129b14bba0efb157c4423e",
+        "wy" : "625a0c8c20838bd97fbc89f1670028754a09ad28f62de5eea6e07bc1"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d6a16e194e12b96db8e1bb0250d950f7b3129b14bba0efb157c4423e625a0c8c20838bd97fbc89f1670028754a09ad28f62de5eea6e07bc1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABNahbhlOErltuOG7AlDZUPezEpsU\nu6DvsVfEQj5iWgyMIIOL2X+8ifFnACh1SgmtKPYt5e6m4HvB\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 257,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "313233343030",
+          "sig" : "302202020102021c73168a8994e5f71793081cb7afbe3c0af4bf7aa336cf9de31ef85314",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c012950d074bb01b0a1988a5b59b959104275baf757e53029b046a1542f50fe27f3ebac9036558ef30ebcb812027bf0ef46cda51969541bb",
+        "wx" : "0c012950d074bb01b0a1988a5b59b959104275baf757e53029b046a15",
+        "wy" : "42f50fe27f3ebac9036558ef30ebcb812027bf0ef46cda51969541bb"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004c012950d074bb01b0a1988a5b59b959104275baf757e53029b046a1542f50fe27f3ebac9036558ef30ebcb812027bf0ef46cda51969541bb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABMASlQ0HS7AbChmIpbWblZEEJ1uv\ndX5TApsEahVC9Q/ifz66yQNlWO8w68uBICe/DvRs2lGWlUG7\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 258,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302d020d062522bbd3ecbe7c39e93e7c24021c73168a8994e5f71793081cb7afbe3c0af4bf7aa336cf9de31ef85314",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d15c13a1be99d9eb77d688104a18e24242d205a4026f4a65629e59ee7e3ddf9abbb7d532b6e81a6e11f30d5b55feb8ee707c4fedf99c0607",
+        "wx" : "0d15c13a1be99d9eb77d688104a18e24242d205a4026f4a65629e59ee",
+        "wy" : "7e3ddf9abbb7d532b6e81a6e11f30d5b55feb8ee707c4fedf99c0607"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d15c13a1be99d9eb77d688104a18e24242d205a4026f4a65629e59ee7e3ddf9abbb7d532b6e81a6e11f30d5b55feb8ee707c4fedf99c0607",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABNFcE6G+mdnrd9aIEEoY4kJC0gWk\nAm9KZWKeWe5+Pd+au7fVMrboGm4R8w1bVf647nB8T+35nAYH\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 259,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "313233343030",
+          "sig" : "303d021d00d7c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a7931f021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043fe01972c0622ea812d30652c9fe2febee708123b1626d744f87db0da572c7e1e3a48195e6221d983f782fdc9e7c55bd5fdf7b679b0f8756",
+        "wx" : "3fe01972c0622ea812d30652c9fe2febee708123b1626d744f87db0d",
+        "wy" : "0a572c7e1e3a48195e6221d983f782fdc9e7c55bd5fdf7b679b0f8756"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00043fe01972c0622ea812d30652c9fe2febee708123b1626d744f87db0da572c7e1e3a48195e6221d983f782fdc9e7c55bd5fdf7b679b0f8756",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABD/gGXLAYi6oEtMGUsn+L+vucIEj\nsWJtdE+H2w2lcsfh46SBleYiHZg/eC/cnnxVvV/fe2ebD4dW\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 260,
+          "comment" : "s == 1",
+          "msg" : "313233343030",
+          "sig" : "3021021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 261,
+          "comment" : "s == 0",
+          "msg" : "313233343030",
+          "sig" : "3021021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d4b6e5112406fb743b6bb55f49ea2030d904420831ebddacd67bba89652265384b75d850e7c27f4e33ed6c576df0ff969470a9ef25ffafcd",
+        "wx" : "0d4b6e5112406fb743b6bb55f49ea2030d904420831ebddacd67bba89",
+        "wy" : "652265384b75d850e7c27f4e33ed6c576df0ff969470a9ef25ffafcd"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004d4b6e5112406fb743b6bb55f49ea2030d904420831ebddacd67bba89652265384b75d850e7c27f4e33ed6c576df0ff969470a9ef25ffafcd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABNS25REkBvt0O2u1X0nqIDDZBEII\nMevdrNZ7uollImU4S3XYUOfCf04z7WxXbfD/lpRwqe8l/6/N\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 262,
+          "comment" : "point at infinity during verify",
+          "msg" : "313233343030",
+          "sig" : "303c021c6be09a551321b343150c1812bae87dcc688b5e25b6ef5e51d2d3c9cf021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0455a7b0100613fabd957b42600835c6d42e01e04252593bdde3b1727887708a05aba2f93f1a1e1ecb703ec9a8ee6d6013a101d397012a8cce",
+        "wx" : "55a7b0100613fabd957b42600835c6d42e01e04252593bdde3b17278",
+        "wy" : "087708a05aba2f93f1a1e1ecb703ec9a8ee6d6013a101d397012a8cce"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a000455a7b0100613fabd957b42600835c6d42e01e04252593bdde3b1727887708a05aba2f93f1a1e1ecb703ec9a8ee6d6013a101d397012a8cce",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABFWnsBAGE/q9lXtCYAg1xtQuAeBC\nUlk73eOxcniHcIoFq6L5PxoeHstwPsmo7m1gE6EB05cBKozO\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 263,
+          "comment" : "u1 == 1",
+          "msg" : "313233343030",
+          "sig" : "303c021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a021c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041ada54dc015861680d8bb2d311b90e82db75aa9e8217b92611fa03cb84c611551197298b3274875cb94686e758f0a1a9675c0bc157451a76",
+        "wx" : "1ada54dc015861680d8bb2d311b90e82db75aa9e8217b92611fa03cb",
+        "wy" : "084c611551197298b3274875cb94686e758f0a1a9675c0bc157451a76"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00041ada54dc015861680d8bb2d311b90e82db75aa9e8217b92611fa03cb84c611551197298b3274875cb94686e758f0a1a9675c0bc157451a76",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABBraVNwBWGFoDYuy0xG5DoLbdaqe\nghe5JhH6A8uExhFVEZcpizJ0h1y5RobnWPChqWdcC8FXRRp2\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 264,
+          "comment" : "u1 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "303c021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a021c628580a9adb02604525b1ee6b135e1a9c745021824582c52385a8173",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c67b6429785334a608dde949a8abe641dbd3601ebce1e675fe71a8e527d2e8727dc4f618493550bb940151bca6826f714c5b31854038f44d",
+        "wx" : "0c67b6429785334a608dde949a8abe641dbd3601ebce1e675fe71a8e5",
+        "wy" : "27d2e8727dc4f618493550bb940151bca6826f714c5b31854038f44d"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004c67b6429785334a608dde949a8abe641dbd3601ebce1e675fe71a8e527d2e8727dc4f618493550bb940151bca6826f714c5b31854038f44d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABMZ7ZCl4UzSmCN3pSair5kHb02Ae\nvOHmdf5xqOUn0uhyfcT2GEk1ULuUAVG8poJvcUxbMYVAOPRN\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 265,
+          "comment" : "u2 == 1",
+          "msg" : "313233343030",
+          "sig" : "303c021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041dcc7a5ad111a33627f92dd875ba4a06f6a7c2befdd1050488d057a7341cae0be72a99776db5bd79b463e2d3882764af9c0245d084a3342d",
+        "wx" : "1dcc7a5ad111a33627f92dd875ba4a06f6a7c2befdd1050488d057a7",
+        "wy" : "341cae0be72a99776db5bd79b463e2d3882764af9c0245d084a3342d"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00041dcc7a5ad111a33627f92dd875ba4a06f6a7c2befdd1050488d057a7341cae0be72a99776db5bd79b463e2d3882764af9c0245d084a3342d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABB3MelrREaM2J/kt2HW6Sgb2p8K+\n/dEFBIjQV6c0HK4L5yqZd221vXm0Y+LTiCdkr5wCRdCEozQt\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 266,
+          "comment" : "u2 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "303d021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a021d008fd6231c198244597165756e4e8b5265e0b9d2dcf3e9d317c3c50d15",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bdf708a01c6a814728d394b7f29bf6579734862d8af8e6ff786fbe49901cd462946e5e36cc97c9896df2e18177456d282a7a26a38084c086",
+        "wx" : "0bdf708a01c6a814728d394b7f29bf6579734862d8af8e6ff786fbe49",
+        "wy" : "0901cd462946e5e36cc97c9896df2e18177456d282a7a26a38084c086"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004bdf708a01c6a814728d394b7f29bf6579734862d8af8e6ff786fbe49901cd462946e5e36cc97c9896df2e18177456d282a7a26a38084c086",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABL33CKAcaoFHKNOUt/Kb9leXNIYt\nivjm/3hvvkmQHNRilG5eNsyXyYlt8uGBd0VtKCp6JqOAhMCG\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 267,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021d00b6ea09c6ec5e0484b94f25d890145b0ae3ffbb98b716addd92debdce",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040c531fb3d996faa22407df1305ff6ae0bfe94e1c2022f4730d0f8a4abd8073950459562e539ac0895433757e25209b12534ff30fe3d37c71",
+        "wx" : "0c531fb3d996faa22407df1305ff6ae0bfe94e1c2022f4730d0f8a4a",
+        "wy" : "0bd8073950459562e539ac0895433757e25209b12534ff30fe3d37c71"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00040c531fb3d996faa22407df1305ff6ae0bfe94e1c2022f4730d0f8a4abd8073950459562e539ac0895433757e25209b12534ff30fe3d37c71",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABAxTH7PZlvqiJAffEwX/auC/6U4c\nICL0cw0Pikq9gHOVBFlWLlOawIlUM3V+JSCbElNP8w/j03xx\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 268,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c2f62a9cf48e3ca602eef4e33afa43f2dceb922a40a67de79f7b1ae38",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046782954082418e0002a0812672ac2123b6334b341340555096bcf6c61f6fa1a8fea617d9dda14461d63aa448f205a39b25501a6b1d42ee5f",
+        "wx" : "6782954082418e0002a0812672ac2123b6334b341340555096bcf6c6",
+        "wy" : "1f6fa1a8fea617d9dda14461d63aa448f205a39b25501a6b1d42ee5f"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00046782954082418e0002a0812672ac2123b6334b341340555096bcf6c61f6fa1a8fea617d9dda14461d63aa448f205a39b25501a6b1d42ee5f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABGeClUCCQY4AAqCBJnKsISO2M0s0\nE0BVUJa89sYfb6Go/qYX2d2hRGHWOqRI8gWjmyVQGmsdQu5f\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 269,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c618dfc54408bec1cb37c7ee52b60adbc8d3a6c26457c39d013e88e81",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045b5e6eaba7597ae641420ace6af2575839f161b27b91b270f18bf7d0496ab3c3072fa6ee5578fc814f74d148ecbc2a98cfdc5d40ec7e6980",
+        "wx" : "5b5e6eaba7597ae641420ace6af2575839f161b27b91b270f18bf7d0",
+        "wy" : "496ab3c3072fa6ee5578fc814f74d148ecbc2a98cfdc5d40ec7e6980"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00045b5e6eaba7597ae641420ace6af2575839f161b27b91b270f18bf7d0496ab3c3072fa6ee5578fc814f74d148ecbc2a98cfdc5d40ec7e6980",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABFtebqunWXrmQUIKzmryV1g58WGy\ne5GycPGL99BJarPDBy+m7lV4/IFPdNFI7LwqmM/cXUDsfmmA\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 270,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c010de57124c0930ef800e764b5585927977e2ad2d8b82e7cb648af52",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048e661a06ad55b5227801ea4309a72b9cd94973bc873c0405e1247d1e64898b822c363cac8821302de38a914268aaa67db2561878f0f90a02",
+        "wx" : "08e661a06ad55b5227801ea4309a72b9cd94973bc873c0405e1247d1e",
+        "wy" : "64898b822c363cac8821302de38a914268aaa67db2561878f0f90a02"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00048e661a06ad55b5227801ea4309a72b9cd94973bc873c0405e1247d1e64898b822c363cac8821302de38a914268aaa67db2561878f0f90a02",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABI5mGgatVbUieAHqQwmnK5zZSXO8\nhzwEBeEkfR5kiYuCLDY8rIghMC3jipFCaKqmfbJWGHjw+QoC\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 271,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c033ef5010beced04c4928868513ed1878ce677a6ed810e9b99dd9794",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b3d2b93f1488657262140f96c108aa0485939bd99440240a7a7d54e388968174b061853739f8b0471c76126539dc57cc6d7c1f539f686674",
+        "wx" : "0b3d2b93f1488657262140f96c108aa0485939bd99440240a7a7d54e3",
+        "wy" : "088968174b061853739f8b0471c76126539dc57cc6d7c1f539f686674"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004b3d2b93f1488657262140f96c108aa0485939bd99440240a7a7d54e388968174b061853739f8b0471c76126539dc57cc6d7c1f539f686674",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABLPSuT8UiGVyYhQPlsEIqgSFk5vZ\nlEAkCnp9VOOIloF0sGGFNzn4sEccdhJlOdxXzG18H1OfaGZ0\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 272,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c067dea0217d9da09892510d0a27da30f19ccef4ddb021d3733bb2f28",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ba830dbf83075cd182bc9322c1f6299a4ce3cf4ddde0e6fcee50f0d62b153f6f377a88809c9dd50d8d61eb6794514448165786a7c6558dcc",
+        "wx" : "0ba830dbf83075cd182bc9322c1f6299a4ce3cf4ddde0e6fcee50f0d6",
+        "wy" : "2b153f6f377a88809c9dd50d8d61eb6794514448165786a7c6558dcc"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004ba830dbf83075cd182bc9322c1f6299a4ce3cf4ddde0e6fcee50f0d62b153f6f377a88809c9dd50d8d61eb6794514448165786a7c6558dcc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABLqDDb+DB1zRgryTIsH2KZpM489N\n3eDm/O5Q8NYrFT9vN3qIgJyd1Q2NYetnlFFESBZXhqfGVY3M\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 273,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c45847e02fd01a3cc9e063f961fb920ab3271ec09996f75bca7fe6d3f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0477f40222e4a79a0fa7e510887e69eba31f6dd7067121dafe739bbe13d0ffab7222cf6d827c51eb53abac506bc0a5d7c1a5a7e1683d49e43e",
+        "wx" : "77f40222e4a79a0fa7e510887e69eba31f6dd7067121dafe739bbe13",
+        "wy" : "0d0ffab7222cf6d827c51eb53abac506bc0a5d7c1a5a7e1683d49e43e"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a000477f40222e4a79a0fa7e510887e69eba31f6dd7067121dafe739bbe13d0ffab7222cf6d827c51eb53abac506bc0a5d7c1a5a7e1683d49e43e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABHf0AiLkp5oPp+UQiH5p66MfbdcG\ncSHa/nObvhPQ/6tyIs9tgnxR61OrrFBrwKXXwaWn4Wg9SeQ+\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 274,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c0b4cbe866d1920634138c8798fcc41479447e5ae760794e1e5797928",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04597b5a3c106b8c4e9a7e7a517cd740e77667c8a2d06c510e5e3b728d9cc249e827f5fff902122eb26badc4a7da6555b489ba98982d388125",
+        "wx" : "597b5a3c106b8c4e9a7e7a517cd740e77667c8a2d06c510e5e3b728d",
+        "wy" : "09cc249e827f5fff902122eb26badc4a7da6555b489ba98982d388125"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004597b5a3c106b8c4e9a7e7a517cd740e77667c8a2d06c510e5e3b728d9cc249e827f5fff902122eb26badc4a7da6555b489ba98982d388125",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABFl7WjwQa4xOmn56UXzXQOd2Z8ii\n0GxRDl47co2cwknoJ/X/+QISLrJrrcSn2mVVtIm6mJgtOIEl\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 275,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c20d72ae339e5620170c90a4ce5bca08ded1700b2b6c80ec612c8d5d1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040f2453e7585cb1392ff4fa11869f8c10b2f9cf4f2a18b866e8f37c2bd1566ef04928797579d40f3310ebaf477a4e78a235861928328634df",
+        "wx" : "0f2453e7585cb1392ff4fa11869f8c10b2f9cf4f2a18b866e8f37c2b",
+        "wy" : "0d1566ef04928797579d40f3310ebaf477a4e78a235861928328634df"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00040f2453e7585cb1392ff4fa11869f8c10b2f9cf4f2a18b866e8f37c2bd1566ef04928797579d40f3310ebaf477a4e78a235861928328634df",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABA8kU+dYXLE5L/T6EYafjBCy+c9P\nKhi4ZujzfCvRVm7wSSh5dXnUDzMQ669Hek54ojWGGSgyhjTf\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 276,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021d009d235aa9e9f9c6453e39a78613836ea14c2ddf31c91b747aef010a89",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0410cb3dbce4da518e04eb125cf3b44bef0451bad3e7cbbad5328b85bb358651b478bcf200684fd310e6d14acd23dc2a760475df0f5b8a758c",
+        "wx" : "10cb3dbce4da518e04eb125cf3b44bef0451bad3e7cbbad5328b85bb",
+        "wy" : "358651b478bcf200684fd310e6d14acd23dc2a760475df0f5b8a758c"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a000410cb3dbce4da518e04eb125cf3b44bef0451bad3e7cbbad5328b85bb358651b478bcf200684fd310e6d14acd23dc2a760475df0f5b8a758c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABBDLPbzk2lGOBOsSXPO0S+8EUbrT\n58u61TKLhbs1hlG0eLzyAGhP0xDm0UrNI9wqdgR13w9binWM\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 277,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021d009ca7987f3367a9516eca57855098d4aaaf289438d9ad7b39dcc81110",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042c27732aaaa3f8b16664a48a1dd06fc0fe40f65742751e5c04b7eff507804b2dbee79ffe56dc4f4a6062ced6f375b80b5ad2cf3a2921b395",
+        "wx" : "2c27732aaaa3f8b16664a48a1dd06fc0fe40f65742751e5c04b7eff5",
+        "wy" : "7804b2dbee79ffe56dc4f4a6062ced6f375b80b5ad2cf3a2921b395"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00042c27732aaaa3f8b16664a48a1dd06fc0fe40f65742751e5c04b7eff507804b2dbee79ffe56dc4f4a6062ced6f375b80b5ad2cf3a2921b395",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABCwncyqqo/ixZmSkih3Qb8D+QPZX\nQnUeXAS37/UHgEstvuef/lbcT0pgYs7W83W4C1rSzzopIbOV\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 278,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c7295bc38b76bccd7635d6561d1f053dd9b079419249f94368c8d3133",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048ced556877ee15af314aed5dfc43a00fbb7626fbdc7b81ff7dbea2f898f5e26f7fc3276da2a8e869b0afbc41ef3b40326080aa85ce62c2ab",
+        "wx" : "08ced556877ee15af314aed5dfc43a00fbb7626fbdc7b81ff7dbea2f8",
+        "wy" : "098f5e26f7fc3276da2a8e869b0afbc41ef3b40326080aa85ce62c2ab"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00048ced556877ee15af314aed5dfc43a00fbb7626fbdc7b81ff7dbea2f898f5e26f7fc3276da2a8e869b0afbc41ef3b40326080aa85ce62c2ab",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABIztVWh37hWvMUrtXfxDoA+7dib7\n3HuB/32+oviY9eJvf8MnbaKo6Gmwr7xB7ztAMmCAqoXOYsKr\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 279,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021d00938f2db2b72061abd7eb6e5c8fe685391e966ec0c769d0c538e0678a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0442b19b22506c4fd89fa28c5909d97f8ffebdc82804dcc7bf6a570ae21a974ee08b484fa05e1fbb89c48c50754ba1e40a658a5ced409c6361",
+        "wx" : "42b19b22506c4fd89fa28c5909d97f8ffebdc82804dcc7bf6a570ae2",
+        "wy" : "1a974ee08b484fa05e1fbb89c48c50754ba1e40a658a5ced409c6361"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a000442b19b22506c4fd89fa28c5909d97f8ffebdc82804dcc7bf6a570ae21a974ee08b484fa05e1fbb89c48c50754ba1e40a658a5ced409c6361",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABEKxmyJQbE/Yn6KMWQnZf4/+vcgo\nBNzHv2pXCuIal07gi0hPoF4fu4nEjFB1S6HkCmWKXO1AnGNh\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 280,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c7f907c8e32e60e2ba4033ee7d65f3fe8fd23719c7a9c6f5e52f18c47",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042095e12116cebdd4e8bc1cc184b538b1515f789e3be4b03a4183fae5d0926e446875abdcd12c8239e607961cadd00a2e899d821db11d5679",
+        "wx" : "2095e12116cebdd4e8bc1cc184b538b1515f789e3be4b03a4183fae5",
+        "wy" : "0d0926e446875abdcd12c8239e607961cadd00a2e899d821db11d5679"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00042095e12116cebdd4e8bc1cc184b538b1515f789e3be4b03a4183fae5d0926e446875abdcd12c8239e607961cadd00a2e899d821db11d5679",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABCCV4SEWzr3U6LwcwYS1OLFRX3ie\nO+SwOkGD+uXQkm5EaHWr3NEsgjnmB5YcrdAKLomdgh2xHVZ5\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 281,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c34c3978c3a1dac921f6235c82a02edb9342285469426bb10f82897c4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0458f82eb2ca6e3474a90e29ac56dcb63d88e669e0a40204e6202af7c5a0e85e4039f343255b4fe4bdc1191a7845bdd7eb908ecd8779a27963",
+        "wx" : "58f82eb2ca6e3474a90e29ac56dcb63d88e669e0a40204e6202af7c5",
+        "wy" : "0a0e85e4039f343255b4fe4bdc1191a7845bdd7eb908ecd8779a27963"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a000458f82eb2ca6e3474a90e29ac56dcb63d88e669e0a40204e6202af7c5a0e85e4039f343255b4fe4bdc1191a7845bdd7eb908ecd8779a27963",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABFj4LrLKbjR0qQ4prFbctj2I5mng\npAIE5iAq98Wg6F5AOfNDJVtP5L3BGRp4Rb3X65COzYd5onlj\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 282,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021d009701d6523d3d3f5b8ac8402680b3cab8966e2651cfc1739fcd3c0749",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0471f2c4a7c3f71311a793458ff12262a863518fb30dbb7a80701030b8b6b08428fabdb69c8a8e9e327daed0795fb84e0d8817086022d3b23b",
+        "wx" : "71f2c4a7c3f71311a793458ff12262a863518fb30dbb7a80701030b8",
+        "wy" : "0b6b08428fabdb69c8a8e9e327daed0795fb84e0d8817086022d3b23b"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a000471f2c4a7c3f71311a793458ff12262a863518fb30dbb7a80701030b8b6b08428fabdb69c8a8e9e327daed0795fb84e0d8817086022d3b23b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABHHyxKfD9xMRp5NFj/EiYqhjUY+z\nDbt6gHAQMLi2sIQo+r22nIqOnjJ9rtB5X7hODYgXCGAi07I7\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 283,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c564277fa54371830eb7850278b9699d85bc5905831a42a9bf4d07af3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043cfcf64eece994c35c56e915e4ed1883ba6ec34fe396c11acd8f47d263cdfbaa34401100b5b10af771bb46c0d53446f7aa847956c9363494",
+        "wx" : "3cfcf64eece994c35c56e915e4ed1883ba6ec34fe396c11acd8f47d2",
+        "wy" : "63cdfbaa34401100b5b10af771bb46c0d53446f7aa847956c9363494"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00043cfcf64eece994c35c56e915e4ed1883ba6ec34fe396c11acd8f47d263cdfbaa34401100b5b10af771bb46c0d53446f7aa847956c9363494",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABDz89k7s6ZTDXFbpFeTtGIO6bsNP\n45bBGs2PR9JjzfuqNEARALWxCvdxu0bA1TRG96qEeVbJNjSU\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 284,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c7794fbdee638f657ac1e4c65284c144b3efa7bf4109e6cca605c4f4c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044c404decbc0697b207fa08982ef0fedb001eeb43f37404dab97a9a7747191bc240dfd440274e06955611f9923fad6949b2cc157a185c8229",
+        "wx" : "4c404decbc0697b207fa08982ef0fedb001eeb43f37404dab97a9a77",
+        "wy" : "47191bc240dfd440274e06955611f9923fad6949b2cc157a185c8229"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00044c404decbc0697b207fa08982ef0fedb001eeb43f37404dab97a9a7747191bc240dfd440274e06955611f9923fad6949b2cc157a185c8229",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABExATey8BpeyB/oImC7w/tsAHutD\n83QE2rl6mndHGRvCQN/UQCdOBpVWEfmSP61pSbLMFXoYXIIp\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 285,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021d00b5200da7a45837f5b71c47e1b94c7862a1e4becba30a908ada219487",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047be4b0ea0b15b96f91312c15c81629e40c4418f70b86c5bcdc258fd979cbef8ea2a77ca092db0eb954a9e33e82b9c5f110c8c990b9235a57",
+        "wx" : "7be4b0ea0b15b96f91312c15c81629e40c4418f70b86c5bcdc258fd9",
+        "wy" : "79cbef8ea2a77ca092db0eb954a9e33e82b9c5f110c8c990b9235a57"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00047be4b0ea0b15b96f91312c15c81629e40c4418f70b86c5bcdc258fd979cbef8ea2a77ca092db0eb954a9e33e82b9c5f110c8c990b9235a57",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABHvksOoLFblvkTEsFcgWKeQMRBj3\nC4bFvNwlj9l5y++Ooqd8oJLbDrlUqeM+grnF8RDIyZC5I1pX\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 286,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021c652b78716ed799aec6bacac3a3e0a7bb360f2832493f286d191a626c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0464a64cffa54066499264991e47a0f14bca6319a1c27e1508e2016b56bda7c17a04d9cb88eadb7296cf87dfbfadfe65056837a797d66997dd",
+        "wx" : "64a64cffa54066499264991e47a0f14bca6319a1c27e1508e2016b56",
+        "wy" : "0bda7c17a04d9cb88eadb7296cf87dfbfadfe65056837a797d66997dd"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a000464a64cffa54066499264991e47a0f14bca6319a1c27e1508e2016b56bda7c17a04d9cb88eadb7296cf87dfbfadfe65056837a797d66997dd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABGSmTP+lQGZJkmSZHkeg8UvKYxmh\nwn4VCOIBa1a9p8F6BNnLiOrbcpbPh9+/rf5lBWg3p5fWaZfd\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 287,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021d0097c134aa264366862a18302575d0fb98d116bc4b6ddebca3a5a793a2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043d4c4e3c5ba7a533c8a3386d6ff77a81351346e1894b2560b406a63ea349775946799eeb274926b4d957328f6c7d50f6760291acdaeb114f",
+        "wx" : "3d4c4e3c5ba7a533c8a3386d6ff77a81351346e1894b2560b406a63e",
+        "wy" : "0a349775946799eeb274926b4d957328f6c7d50f6760291acdaeb114f"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00043d4c4e3c5ba7a533c8a3386d6ff77a81351346e1894b2560b406a63ea349775946799eeb274926b4d957328f6c7d50f6760291acdaeb114f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABD1MTjxbp6UzyKM4bW/3eoE1E0bh\niUslYLQGpj6jSXdZRnme6ydJJrTZVzKPbH1Q9nYCkaza6xFP\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 288,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffa021d00aba8d89c2c94ba58e70db786a6181dc0e71d16f3f43d9600fc4c8ff3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044db8e8ac43f22df75c9c09fe193b9cd83d5c9b73f37d1494761724b0a76082c35da862a1e2e8626ffa94ed18fcb1d897ec7ab52c322553ff",
+        "wx" : "4db8e8ac43f22df75c9c09fe193b9cd83d5c9b73f37d1494761724b0",
+        "wy" : "0a76082c35da862a1e2e8626ffa94ed18fcb1d897ec7ab52c322553ff"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00044db8e8ac43f22df75c9c09fe193b9cd83d5c9b73f37d1494761724b0a76082c35da862a1e2e8626ffa94ed18fcb1d897ec7ab52c322553ff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABE246KxD8i33XJwJ/hk7nNg9XJtz\n830UlHYXJLCnYILDXahioeLoYm/6lO0Y/LHYl+x6tSwyJVP/\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 289,
+          "comment" : "point duplication during verification",
+          "msg" : "313233343030",
+          "sig" : "303d021c7af295e6e4787252f34c527af562ca27214a66f6d6db4fd2c112b564021d00b1d010f74062eeaac0cecb2c3c2c4d288a576bf6f0a00347c6a5b562",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044db8e8ac43f22df75c9c09fe193b9cd83d5c9b73f37d1494761724b03060b1e6c89b03e4472fcdb57b3cea6eb3ed2ebfab5fd4c94ca36d00",
+        "wx" : "4db8e8ac43f22df75c9c09fe193b9cd83d5c9b73f37d1494761724b0",
+        "wy" : "3060b1e6c89b03e4472fcdb57b3cea6eb3ed2ebfab5fd4c94ca36d00"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00044db8e8ac43f22df75c9c09fe193b9cd83d5c9b73f37d1494761724b03060b1e6c89b03e4472fcdb57b3cea6eb3ed2ebfab5fd4c94ca36d00",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABE246KxD8i33XJwJ/hk7nNg9XJtz\n830UlHYXJLAwYLHmyJsD5EcvzbV7POpus+0uv6tf1MlMo20A\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 290,
+          "comment" : "duplication bug",
+          "msg" : "313233343030",
+          "sig" : "303d021c7af295e6e4787252f34c527af562ca27214a66f6d6db4fd2c112b564021d00b1d010f74062eeaac0cecb2c3c2c4d288a576bf6f0a00347c6a5b562",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042b92268208d522450c42f3fcbda409c3ace2a5f857ea10612c6093f8315eb2d448134e716b032078b68301622e3c2186ab583d976e769feb",
+        "wx" : "2b92268208d522450c42f3fcbda409c3ace2a5f857ea10612c6093f8",
+        "wy" : "315eb2d448134e716b032078b68301622e3c2186ab583d976e769feb"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00042b92268208d522450c42f3fcbda409c3ace2a5f857ea10612c6093f8315eb2d448134e716b032078b68301622e3c2186ab583d976e769feb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABCuSJoII1SJFDELz/L2kCcOs4qX4\nV+oQYSxgk/gxXrLUSBNOcWsDIHi2gwFiLjwhhqtYPZdudp/r\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 291,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "313233343030",
+          "sig" : "303c021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a021c2b26a42207a714813b9e70077df698b829d158dbe2c625ba5454b71f",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044d4bd5693d86dd9a6016ba806d8031f94dc8e2d33c6f5871a00b64732a4662f29524ece754828b9d829c0a0724d9bd9d288d21f87e3fb1fa",
+        "wx" : "4d4bd5693d86dd9a6016ba806d8031f94dc8e2d33c6f5871a00b6473",
+        "wy" : "2a4662f29524ece754828b9d829c0a0724d9bd9d288d21f87e3fb1fa"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00044d4bd5693d86dd9a6016ba806d8031f94dc8e2d33c6f5871a00b64732a4662f29524ece754828b9d829c0a0724d9bd9d288d21f87e3fb1fa",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABE1L1Wk9ht2aYBa6gG2AMflNyOLT\nPG9YcaALZHMqRmLylSTs51SCi52CnAoHJNm9nSiNIfh+P7H6\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 292,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "303c021c33b7e498bcda1a33e61a67af56a36d12df7032255ddf5e1ec65a5669021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04be0efb4841df37abcdcf3f28ddb0d5751a92a0fe7a3e88d1ab02832cbb53ccd66b9c0e424380693d6416fc2e1a3c793a355f7d05f963f435",
+        "wx" : "0be0efb4841df37abcdcf3f28ddb0d5751a92a0fe7a3e88d1ab02832c",
+        "wy" : "0bb53ccd66b9c0e424380693d6416fc2e1a3c793a355f7d05f963f435"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004be0efb4841df37abcdcf3f28ddb0d5751a92a0fe7a3e88d1ab02832cbb53ccd66b9c0e424380693d6416fc2e1a3c793a355f7d05f963f435",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABL4O+0hB3zerzc8/KN2w1XUakqD+\nej6I0asCgyy7U8zWa5wOQkOAaT1kFvwuGjx5OjVffQX5Y/Q1\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 293,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303d021c33b7e498bcda1a33e61a67af56a36d12df7032255ddf5e1ec65a5669021d00b8eebf6d455e57e0b65de0201bd7b315458133ae5e2ca1b0d721ec3f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bc0272e3693a05e788392c880f9de95c72e293fd1b13f1e22a9907a3699506e4590fa90c6257b1c4e3632ccc486cb833cbbcbf21b4a26041",
+        "wx" : "0bc0272e3693a05e788392c880f9de95c72e293fd1b13f1e22a9907a3",
+        "wy" : "699506e4590fa90c6257b1c4e3632ccc486cb833cbbcbf21b4a26041"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004bc0272e3693a05e788392c880f9de95c72e293fd1b13f1e22a9907a3699506e4590fa90c6257b1c4e3632ccc486cb833cbbcbf21b4a26041",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABLwCcuNpOgXniDksiA+d6Vxy4pP9\nGxPx4iqZB6NplQbkWQ+pDGJXscTjYyzMSGy4M8u8vyG0omBB\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 294,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303d021c33b7e498bcda1a33e61a67af56a36d12df7032255ddf5e1ec65a5669021d00ac9a90881e9c5204ee79c01df7da62e0a745636f8b1896e95152dc7f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a83bc3e9043cb938dae167bbea2f7d623486f4038df45312e8467bda7363fa58af363a71835da09413c88227849c6f0ffe8e4e40aff51023",
+        "wx" : "0a83bc3e9043cb938dae167bbea2f7d623486f4038df45312e8467bda",
+        "wy" : "7363fa58af363a71835da09413c88227849c6f0ffe8e4e40aff51023"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004a83bc3e9043cb938dae167bbea2f7d623486f4038df45312e8467bda7363fa58af363a71835da09413c88227849c6f0ffe8e4e40aff51023",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABKg7w+kEPLk42uFnu+ovfWI0hvQD\njfRTEuhGe9pzY/pYrzY6cYNdoJQTyIInhJxvD/6OTkCv9RAj\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 295,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303c021c33b7e498bcda1a33e61a67af56a36d12df7032255ddf5e1ec65a5669021c2b26a42207a714813b9e70077df698b829d158dbe2c625ba5454b720",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043bd08a1c46638564521ded3fa77ce9c95538e49703ebb9f8d36be6f7276ffa128051671f7e4c63e9b8132de9f3389cc525d72682b6019ec3",
+        "wx" : "3bd08a1c46638564521ded3fa77ce9c95538e49703ebb9f8d36be6f7",
+        "wy" : "276ffa128051671f7e4c63e9b8132de9f3389cc525d72682b6019ec3"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00043bd08a1c46638564521ded3fa77ce9c95538e49703ebb9f8d36be6f7276ffa128051671f7e4c63e9b8132de9f3389cc525d72682b6019ec3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABDvQihxGY4VkUh3tP6d86clVOOSX\nA+u5+NNr5vcnb/oSgFFnH35MY+m4Ey3p8zicxSXXJoK2AZ7D\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 296,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303c021c33b7e498bcda1a33e61a67af56a36d12df7032255ddf5e1ec65a5669021c1ed2753ce0e50ea573ba500559f948838b95889d0fb21af2ce85a760",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a3db2b3e2c62c42bf4fb0e11c2908fd17fe83da3ac9c0980234efdbd3cbeec4027bd7c109b27ae2f7cf04dc65eeaf13faa224d32a20f3163",
+        "wx" : "0a3db2b3e2c62c42bf4fb0e11c2908fd17fe83da3ac9c0980234efdbd",
+        "wy" : "3cbeec4027bd7c109b27ae2f7cf04dc65eeaf13faa224d32a20f3163"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004a3db2b3e2c62c42bf4fb0e11c2908fd17fe83da3ac9c0980234efdbd3cbeec4027bd7c109b27ae2f7cf04dc65eeaf13faa224d32a20f3163",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABKPbKz4sYsQr9PsOEcKQj9F/6D2j\nrJwJgCNO/b08vuxAJ718EJsnri988E3GXurxP6oiTTKiDzFj\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 297,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "303c021c33b7e498bcda1a33e61a67af56a36d12df7032255ddf5e1ec65a5669021c58e37518c6e47a84de10ccb254c03693271145f13e00a91237a4a547",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04606ce6f8c77ac17d5b7515d5851eed155ea120cd07ca4277b35b8d365f716b62aee9a81a011bd1d2bceaf37d5f3a61e5f7307e0bb9c892c8",
+        "wx" : "606ce6f8c77ac17d5b7515d5851eed155ea120cd07ca4277b35b8d36",
+        "wy" : "5f716b62aee9a81a011bd1d2bceaf37d5f3a61e5f7307e0bb9c892c8"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004606ce6f8c77ac17d5b7515d5851eed155ea120cd07ca4277b35b8d365f716b62aee9a81a011bd1d2bceaf37d5f3a61e5f7307e0bb9c892c8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABGBs5vjHesF9W3UV1YUe7RVeoSDN\nB8pCd7NbjTZfcWtirumoGgEb0dK86vN9Xzph5fcwfgu5yJLI\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 298,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "303c021c0d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d021c47eb118e0cc1222cb8b2bab72745a932f05ce96e79f4e98be1e2868a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042affbb8269cb7883dada3350394579912ef756a8df6bdd7da35d398e90213d9382b3d5fb9dde82724d38e5678c17e610f417cfe6f7efcd91",
+        "wx" : "2affbb8269cb7883dada3350394579912ef756a8df6bdd7da35d398e",
+        "wy" : "090213d9382b3d5fb9dde82724d38e5678c17e610f417cfe6f7efcd91"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00042affbb8269cb7883dada3350394579912ef756a8df6bdd7da35d398e90213d9382b3d5fb9dde82724d38e5678c17e610f417cfe6f7efcd91",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABCr/u4Jpy3iD2tozUDlFeZEu91ao\n32vdfaNdOY6QIT2TgrPV+53egnJNOOVnjBfmEPQXz+b3782R\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 299,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303d021c0d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d021d00b8eebf6d455e57e0b65de0201bd7b315458133ae5e2ca1b0d721ec3f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0419cdd44e2a33113a884558e7ee0efb41bafe1adcdcf95df6de6a25115f428ee998a34856f2ac3f6f39c7237bf1f9de232175d747b5cd97fe",
+        "wx" : "19cdd44e2a33113a884558e7ee0efb41bafe1adcdcf95df6de6a2511",
+        "wy" : "5f428ee998a34856f2ac3f6f39c7237bf1f9de232175d747b5cd97fe"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a000419cdd44e2a33113a884558e7ee0efb41bafe1adcdcf95df6de6a25115f428ee998a34856f2ac3f6f39c7237bf1f9de232175d747b5cd97fe",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABBnN1E4qMxE6iEVY5+4O+0G6/hrc\n3Pld9t5qJRFfQo7pmKNIVvKsP285xyN78fneIyF110e1zZf+\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 300,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303d021c0d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d021d00ac9a90881e9c5204ee79c01df7da62e0a745636f8b1896e95152dc7f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b72f7c1a3c8562cb8de9925eec041ccc263649c6524762b9f4585ee39df756da08d1274ad72d8cac293aa60d150c77131f9fa28ccdffdfa0",
+        "wx" : "0b72f7c1a3c8562cb8de9925eec041ccc263649c6524762b9f4585ee3",
+        "wy" : "09df756da08d1274ad72d8cac293aa60d150c77131f9fa28ccdffdfa0"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004b72f7c1a3c8562cb8de9925eec041ccc263649c6524762b9f4585ee39df756da08d1274ad72d8cac293aa60d150c77131f9fa28ccdffdfa0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABLcvfBo8hWLLjemSXuwEHMwmNknG\nUkdiufRYXuOd91baCNEnStctjKwpOqYNFQx3Ex+foozN/9+g\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 301,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303c021c0d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d021c2b26a42207a714813b9e70077df698b829d158dbe2c625ba5454b720",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049d3703b3205b123c903a0446973247c16a88d103fea9d04dd02a702b65186b777b57eadee8154c02fce0e95c3f061468499bac3dc6029e8c",
+        "wx" : "09d3703b3205b123c903a0446973247c16a88d103fea9d04dd02a702b",
+        "wy" : "65186b777b57eadee8154c02fce0e95c3f061468499bac3dc6029e8c"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00049d3703b3205b123c903a0446973247c16a88d103fea9d04dd02a702b65186b777b57eadee8154c02fce0e95c3f061468499bac3dc6029e8c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABJ03A7MgWxI8kDoERpcyR8FqiNED\n/qnQTdAqcCtlGGt3e1fq3ugVTAL84OlcPwYUaEmbrD3GAp6M\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 302,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303c021c0d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d021c1ed2753ce0e50ea573ba500559f948838b95889d0fb21af2ce85a760",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043ea572505a48b1bed085953da7d4c963c2c5b6ad99779d9d54ba401294470074e0252da159a0c0d0b2f8d4c242cb94bab2c2020c4b2df499",
+        "wx" : "3ea572505a48b1bed085953da7d4c963c2c5b6ad99779d9d54ba4012",
+        "wy" : "094470074e0252da159a0c0d0b2f8d4c242cb94bab2c2020c4b2df499"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00043ea572505a48b1bed085953da7d4c963c2c5b6ad99779d9d54ba401294470074e0252da159a0c0d0b2f8d4c242cb94bab2c2020c4b2df499",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABD6lclBaSLG+0IWVPafUyWPCxbat\nmXednVS6QBKURwB04CUtoVmgwNCy+NTCQsuUurLCAgxLLfSZ\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 303,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "303c021c0d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d021c58e37518c6e47a84de10ccb254c03693271145f13e00a91237a4a547",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd",
+        "wx" : "0d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d",
+        "wy" : "58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d58aa56f772c0726f24c6b89e4ecdac24354b9e99caa3f6d3761402cd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABA2QKa0sflz0NAgjsqh9xoyeTOMX\nTB5u/e4SwH1Yqlb3csBybyTGuJ5OzawkNUuemcqj9tN2FALN\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 304,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "303c021c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c021c1ed2753ce0e50ea573ba500559f948838b95889d0fb21af2ce85a75f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 305,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "303c021c628580a9adb02604525b1ee6b135e1a9c745021824582c52385a8173021c1ed2753ce0e50ea573ba500559f948838b95889d0fb21af2ce85a75f",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d7f16ddb2b382f4170551778727042b637b5368bdcd36932208b4be32",
+        "wx" : "0d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d",
+        "wy" : "7f16ddb2b382f4170551778727042b637b5368bdcd36932208b4be32"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00040d9029ad2c7e5cf4340823b2a87dc68c9e4ce3174c1e6efdee12c07d7f16ddb2b382f4170551778727042b637b5368bdcd36932208b4be32",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABA2QKa0sflz0NAgjsqh9xoyeTOMX\nTB5u/e4SwH1/Ft2ys4L0FwVRd4cnBCtje1Novc02kyIItL4y\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 306,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "303c021c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c021c1ed2753ce0e50ea573ba500559f948838b95889d0fb21af2ce85a75f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 307,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "303c021c628580a9adb02604525b1ee6b135e1a9c745021824582c52385a8173021c1ed2753ce0e50ea573ba500559f948838b95889d0fb21af2ce85a75f",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b554fc25e9f098eaf1466c35328c97305d0d4aa0e4462e8baf7a8e7ed08fc40eb01dc855577baea9e3070770616f57b17ea9854cad93881a",
+        "wx" : "0b554fc25e9f098eaf1466c35328c97305d0d4aa0e4462e8baf7a8e7e",
+        "wy" : "0d08fc40eb01dc855577baea9e3070770616f57b17ea9854cad93881a"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004b554fc25e9f098eaf1466c35328c97305d0d4aa0e4462e8baf7a8e7ed08fc40eb01dc855577baea9e3070770616f57b17ea9854cad93881a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABLVU/CXp8Jjq8UZsNTKMlzBdDUqg\n5EYui696jn7Qj8QOsB3IVVd7rqnjBwdwYW9XsX6phUytk4ga\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 308,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "303e021d00b982bea80d10816bb450a3faaaed4ed54fb197b3bff95af25d7d3786021d009e6ea2e58713f1304d29debf8559a74a89e018bae28b05556e5482a1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 309,
+          "comment" : "pseudorandom signature",
+          "msg" : "4d7367",
+          "sig" : "303c021c4dabc5fe962b5f8a6681e94a2165d9b6be1940f20e27ceb73fc4ea7d021c746e9bba7efb90fcecc263c229a16d809d3547c28a26cd71a52abdc5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 310,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "303d021d0095b11e320007a2e0f8ce00f9058ca9b919e8d6aad544a8f9808b44a1021c15a962019c85a5b1fa7474162d03cd0e528e8b93bcc84920af579f61",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 311,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "303e021d009e4dab9e0b0097e365783fc05f010c160d361df7925b0ddbdfece88b021d008406a365f078f031e6fad6511d69f8a65483c19a5a800c39490f7510",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04802a0f51204ef6a829211bc0740887461ee4aba736e9caee000000007fb931e06300451362d444106eeb5dabddca650fec4be55fc545f7c8",
+        "wx" : "0802a0f51204ef6a829211bc0740887461ee4aba736e9caee00000000",
+        "wy" : "7fb931e06300451362d444106eeb5dabddca650fec4be55fc545f7c8"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004802a0f51204ef6a829211bc0740887461ee4aba736e9caee000000007fb931e06300451362d444106eeb5dabddca650fec4be55fc545f7c8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABIAqD1EgTvaoKSEbwHQIh0Ye5Kun\nNunK7gAAAAB/uTHgYwBFE2LURBBu612r3cplD+xL5V/FRffI\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 312,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c0c93fd7f6dd0b697d5c287ee61aee4dcbedcc20885c1e6215b8b3608021c3bc7a1beccf1a8e83af2f5162fc539a1d062bd639a2fbec512907a27",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 313,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d009e0b620a2f313ada756463a22988afb6571b3b030a4285b185e1cc80021d00c3eba04c42e64d4028acabcdcb7b2eed1b3cfb560b8d7d14fb26aca3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 314,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00a306f500da4f0a30946479936aaf9c637676b0f02d20ae0d981c25eb021c015647f2500bcbe3204bdb804972b841890b4e53196cd8b188993151",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cb320c84f26c00a1b4ad7146914cae126529165de7363d8aef9abd05a397d46b87283176b7f69da1f94615ca4431fc47b2a0e60c00000000",
+        "wx" : "0cb320c84f26c00a1b4ad7146914cae126529165de7363d8aef9abd05",
+        "wy" : "0a397d46b87283176b7f69da1f94615ca4431fc47b2a0e60c00000000"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004cb320c84f26c00a1b4ad7146914cae126529165de7363d8aef9abd05a397d46b87283176b7f69da1f94615ca4431fc47b2a0e60c00000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABMsyDITybAChtK1xRpFMrhJlKRZd\n5zY9iu+avQWjl9Rrhygxdrf2naH5RhXKRDH8R7Kg5gwAAAAA\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 315,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c04f00dd44fdd8ae6b08b86ccbdd7d615aa9e498a89b35094c8a9a6fe021c49617a1617c56ce90d41c53eef4e628f24c047a06e02c1f92123441f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 316,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c1286f6a7375bf68051e31b2e32b5f6c0988c9189799256e7ce64e291021c52d3c1f9e777f23c17cbc832d0e5a84bb68b13debf393878d1a06498",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 317,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c582825df2368dcb92fbba3fa6454d149d3b860e3ff326afe36215813021c49334fc6a70418dbc454da6a997bc8376270c3a38863adb2aa70bb0f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040000000081df971744a25ac99472c3ff5a8fc49b86fc9fb570448ff977f2d07c1c9296b2f77478d13d5ab1c63993962f2dd08ee7c313dece",
+        "wx" : "081df971744a25ac99472c3ff5a8fc49b86fc9fb570448ff9",
+        "wy" : "77f2d07c1c9296b2f77478d13d5ab1c63993962f2dd08ee7c313dece"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00040000000081df971744a25ac99472c3ff5a8fc49b86fc9fb570448ff977f2d07c1c9296b2f77478d13d5ab1c63993962f2dd08ee7c313dece",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABAAAAACB35cXRKJayZRyw/9aj8Sb\nhvyftXBEj/l38tB8HJKWsvd0eNE9WrHGOZOWLy3QjufDE97O\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 318,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c5a11718c90a02459800f109e4e840cc261d782d64e1c8a4712dd9081021d00d283b1c1e110a4620a696fdf74a9c7792352139d54cced8c973d9e7e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 319,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00d577f23e592414e351b3928a593c5d2f89f0c72df513bfbc6535babb021c1bb09dd235124a14e0246946f280450f15576912aeb735b73ce828bc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 320,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00af8f836e63995dc715a4d3c6842c4e6c6cf4586df76e4659d809eec9021d0085befd0b1bb8ae182c05d071dad180224d22533dce737d4dda74d5d1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040d28b4f7fe1f6c6fa6a77d11e43bd3e9271758df34c65fa577a6dd3b000000002801d48382861684b8d2cbd7e5989a0d7c15a7e819b573aa",
+        "wx" : "0d28b4f7fe1f6c6fa6a77d11e43bd3e9271758df34c65fa577a6dd3b",
+        "wy" : "2801d48382861684b8d2cbd7e5989a0d7c15a7e819b573aa"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00040d28b4f7fe1f6c6fa6a77d11e43bd3e9271758df34c65fa577a6dd3b000000002801d48382861684b8d2cbd7e5989a0d7c15a7e819b573aa",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABA0otPf+H2xvpqd9EeQ70+knF1jf\nNMZfpXem3TsAAAAAKAHUg4KGFoS40svX5ZiaDXwVp+gZtXOq\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 321,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c156aa78692c78e9769aba728c9eea78835b55000901ba50794a33efc021d00b9785df40a2213377481311b1a81d310e76341927b8fba0d6e3ec7ad",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 322,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d009274d46a7ffa1299a372e821bd89728de83ef87c46af67043a634b02021c19e4bbec8b03fa772a3622bf4893e581efadf9d20bd60806d82676b6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 323,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00cf6a9cba285e56493cbb462b7b16128a0cf1c7058447945daef34149021c29a687839e8ee03c5372a113733c081f413d1f9405ddfe47e18fcc54",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040d28b4f7fe1f6c6fa6a77d11e43bd3e9271758df34c65fa577a6dd3bd7c134a9fe419202a79219a0bcff0bafcb066d4a1bc4e20d65134d55",
+        "wx" : "0d28b4f7fe1f6c6fa6a77d11e43bd3e9271758df34c65fa577a6dd3b",
+        "wy" : "0d7c134a9fe419202a79219a0bcff0bafcb066d4a1bc4e20d65134d55"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00040d28b4f7fe1f6c6fa6a77d11e43bd3e9271758df34c65fa577a6dd3bd7c134a9fe419202a79219a0bcff0bafcb066d4a1bc4e20d65134d55",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABA0otPf+H2xvpqd9EeQ70+knF1jf\nNMZfpXem3TvXwTSp/kGSAqeSGaC8/wuvywZtShvE4g1lE01V\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 324,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c592e54a0ea950ac7cd830f56c7954a769f81aa55e8e101bee19b3b27021c48375fdd4d9014c9b60b63c70bfe98c844be668f2d3a2e259262b945",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 325,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c1ec0ef4d5bedafe5081f7adae32db4d0aa946f130acedabae26d90dc021c627e81d7eb358f59e8a8630527d4e8946d1cad2196761836d97d953c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 326,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c5faf035ed5774eeb0adc187ff485a846aa2abcf1e7f859b1b910f25c021d008bf12a1c00b18f66c228352de49cc4fb827a09fc86f722ce561ba5fa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04512e581731c9c460bb705b60da976ccb1b0ef421785106ba2ccdd2380f21d5bacdf81c0cb78fa151237db3130ad4def373f3e523398c2cf7",
+        "wx" : "512e581731c9c460bb705b60da976ccb1b0ef421785106ba2ccdd238",
+        "wy" : "0f21d5bacdf81c0cb78fa151237db3130ad4def373f3e523398c2cf7"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004512e581731c9c460bb705b60da976ccb1b0ef421785106ba2ccdd2380f21d5bacdf81c0cb78fa151237db3130ad4def373f3e523398c2cf7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABFEuWBcxycRgu3BbYNqXbMsbDvQh\neFEGuizN0jgPIdW6zfgcDLePoVEjfbMTCtTe83Pz5SM5jCz3\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 327,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c52b2d369f18df56372afe7feb38413f232b4fb9ca16c6f6fedc64189021d00c1b19f137773ef3201cd341c381e4f9449cc0e6c688a351d7a6070b2",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 328,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c5b889d288aaa81674d32006e81279c57ed56a035c878d3e2b687bec3021c0da621d5fa9813263c7f58f8e0155d6f0c330a56c594defc2ebdf0a0",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 329,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00b6f8a80187180aad8a5c896be214314601a1585f2ccb28bc7e8e8f01021d00a90c68c14a67f5d59cec70dc0f473b5c14013b056d12cbc0f7153b1d",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ac55d1b3fed4aee03fa3615d225a9cba5c0284416fbaf9a76135f76217a888395bced34977a8482370d56ebc62aa1ca81bc330f49d4a141d",
+        "wx" : "0ac55d1b3fed4aee03fa3615d225a9cba5c0284416fbaf9a76135f762",
+        "wy" : "17a888395bced34977a8482370d56ebc62aa1ca81bc330f49d4a141d"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004ac55d1b3fed4aee03fa3615d225a9cba5c0284416fbaf9a76135f76217a888395bced34977a8482370d56ebc62aa1ca81bc330f49d4a141d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABKxV0bP+1K7gP6NhXSJanLpcAoRB\nb7r5p2E192IXqIg5W87TSXeoSCNw1W68YqocqBvDMPSdShQd\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 330,
+          "comment" : "x-coordinate of the public key is small on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c16d4a8509c9bce2c73f8db4b73257c7e33f41726c25c4c64546b1dcc021c79ba35a96d2345ad194f391091209dfcced79917e04df3b65f44d1eb",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 331,
+          "comment" : "x-coordinate of the public key is small on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c5da15697bbe4eba7707e349ff3239d508455378113d24e7e1d7a020c021c45be44a570fb530c49d759712c10041345f7c0890a7946d91d32bac6",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 332,
+          "comment" : "x-coordinate of the public key is small on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00c1f8d43479c4f29b19b9b2c7b5747010491440746cc800d5be89b011021d008154348b7c37f0504dca2b115941f7ba5857321eae8f64175be9cbb9",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048b319f2ed074a20ec42d869c7f99bd9146ed8263297bfe004f27c59b120f96343deb80093ecb7695c2d2a5be9937a258723d78ed00aa1edf",
+        "wx" : "08b319f2ed074a20ec42d869c7f99bd9146ed8263297bfe004f27c59b",
+        "wy" : "120f96343deb80093ecb7695c2d2a5be9937a258723d78ed00aa1edf"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00048b319f2ed074a20ec42d869c7f99bd9146ed8263297bfe004f27c59b120f96343deb80093ecb7695c2d2a5be9937a258723d78ed00aa1edf",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABIsxny7QdKIOxC2GnH+ZvZFG7YJj\nKXv+AE8nxZsSD5Y0PeuACT7LdpXC0qW+mTeiWHI9eO0Aqh7f\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 333,
+          "comment" : "y-coordinate of the public key is small on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00871581b50092578211160e470dddaa640d5a2d9e224fafca879106d4021d00be70fd5c7591a3130f5c2af536ffff8e72c16251744c97968f921728",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 334,
+          "comment" : "y-coordinate of the public key is small on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00a98735e5659022b0274ae6f7bcb1646e9e6b4b88408db3f926eccc89021d00a923ff5e15e0d764cd5cefffc5c40c082c6eb772db7662fb1b82d525",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 335,
+          "comment" : "y-coordinate of the public key is small on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00a96b5c24e33d59004cf31aaef44ae4c7579e0b5b219ab25d7f1c690a021d0088c01378847c3841f49ec14840e2d023d7b912b503f2d98a923be8c9",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048b319f2ed074a20ec42d869c7f99bd9146ed8263297bfe004f27c59bc5b19e75e857e67ceb4cb98fb2ff31c9176764ff259d11087e1ea220",
+        "wx" : "08b319f2ed074a20ec42d869c7f99bd9146ed8263297bfe004f27c59b",
+        "wy" : "0c5b19e75e857e67ceb4cb98fb2ff31c9176764ff259d11087e1ea220"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00048b319f2ed074a20ec42d869c7f99bd9146ed8263297bfe004f27c59bc5b19e75e857e67ceb4cb98fb2ff31c9176764ff259d11087e1ea220",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABIsxny7QdKIOxC2GnH+ZvZFG7YJj\nKXv+AE8nxZvFsZ516FfmfOtMuY+y/zHJF2dk/yWdEQh+HqIg\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 336,
+          "comment" : "y-coordinate of the public key is large on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c6b57b73ab7c39b5698549dd5cdd4df7398181b556e7c7283375e3f86021d009f59d1863d6fd6013247d4e678a1c4fc1d896dc661fa31fb73c33f00",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 337,
+          "comment" : "y-coordinate of the public key is large on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c2f85af7e535f66cfc9a9dab7be781631dd622be435d7642b5b51fcc7021c619301c21c934255df93eedd5b459c8dd280fdd07ee656a7147d4d69",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 338,
+          "comment" : "y-coordinate of the public key is large on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d0098a8a98fcc82f804a823cc91072437cfd88322b8671686517f1978ab021c6ac3e83776685bcecefebae473ac07c771e83b0c5a557efe83502036",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c5dc5135f050a96bbb0d21885195b49a574d5198baac4b4602b21bc8b5f38b7fe661003faee1b7af670e165bfab70b018965e83329d405bc",
+        "wx" : "0c5dc5135f050a96bbb0d21885195b49a574d5198baac4b4602b21bc8",
+        "wy" : "0b5f38b7fe661003faee1b7af670e165bfab70b018965e83329d405bc"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004c5dc5135f050a96bbb0d21885195b49a574d5198baac4b4602b21bc8b5f38b7fe661003faee1b7af670e165bfab70b018965e83329d405bc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABMXcUTXwUKlruw0hiFGVtJpXTVGY\nuqxLRgKyG8i184t/5mEAP67ht69nDhZb+rcLAYll6DMp1AW8\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 339,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c699c40b735236bd9239770a5de2c1a7554631e6ba6ef512f8553d02f021c0bca9c516ca405ffc9ae2dcee12ad7d96b586bfdc818a3d45dcfcf26",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 340,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c768a819d3943fc30781aaef28fa120184c7212d0911fe03dfc8c6260021c51b3db0e1c3e939149ccbf9d4619bbbff0e2e174110f6ece4313b4ca",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 341,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c58fcc0ffb125c23c435735b7c390692037c03a6765ef7b5365a17dd4021d009518d29d78eda9cb2503fde38d3b73d6fb90a0d40a23f0ec26166969",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c1b56a1ad154e11556b723fc7493f36e66509d8f68fad0e62c40f0859b04780a85e69abf98def3335ce643cd3554167a8b50d596b9538895",
+        "wx" : "0c1b56a1ad154e11556b723fc7493f36e66509d8f68fad0e62c40f085",
+        "wy" : "09b04780a85e69abf98def3335ce643cd3554167a8b50d596b9538895"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004c1b56a1ad154e11556b723fc7493f36e66509d8f68fad0e62c40f0859b04780a85e69abf98def3335ce643cd3554167a8b50d596b9538895",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABMG1ahrRVOEVVrcj/HST825mUJ2P\naPrQ5ixA8IWbBHgKheaav5je8zNc5kPNNVQWeotQ1Za5U4iV\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 342,
+          "comment" : "x-coordinate of the public key has many trailing 1's on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00d193ee0a3d42a23af018ab90896b35d5c250187bf9fb1ccac364748c021d00a0922accc7562d017109e91d2f83e48bfa3c1fa2ee04d8469be94033",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 343,
+          "comment" : "x-coordinate of the public key has many trailing 1's on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c0974521d7ce753dea5d1156fb4d992cc614079eb8677ab36a4078a4f021d008374dfbae8d0429a6fba60fbb5d2fd559856a5d739f39aa2bf1da1c9",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 344,
+          "comment" : "x-coordinate of the public key has many trailing 1's on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c625f473ca2d15bb7f12da1235f90adcb69ed4818746cae2e2db26fe6021c4ab817f6f1b9c8c49f681bed1568346f53ecbfacfd52d45e27abcbb0",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdsa_brainpoolP256r1_sha256_test.json b/third_party/wycheproof/testvectors/ecdsa_brainpoolP256r1_sha256_test.json
new file mode 100644
index 0000000..79f8d11
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdsa_brainpoolP256r1_sha256_test.json
@@ -0,0 +1,4371 @@
+{
+  "algorithm" : "ECDSA",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "BER" : "This is a signature with correct values for (r, s) but using some alternative BER encoding instead of DER encoding. Implementations should not accept such signatures to limit signature malleability.",
+    "EdgeCase" : "Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA implementation does not check boundaries and computes s^(-1)==0.",
+    "GroupIsomorphism" : "Some EC groups have isomorphic groups that allow an efficient implementation. This is a test vector that contains values that are edge cases on such an isomorphic group.",
+    "MissingZero" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.",
+    "PointDuplication" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission."
+  },
+  "numberOfTests" : 372,
+  "header" : [],
+  "testGroups" : [
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04019a2d9637743a63ddaefdbca0ee229a163b809b9b145e5313bbeb8defeab9d6548caf89bf5ba49499404145651234336401b9b2843a579ed152e090f11b9e59",
+        "wx" : "19a2d9637743a63ddaefdbca0ee229a163b809b9b145e5313bbeb8defeab9d6",
+        "wy" : "548caf89bf5ba49499404145651234336401b9b2843a579ed152e090f11b9e59"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004019a2d9637743a63ddaefdbca0ee229a163b809b9b145e5313bbeb8defeab9d6548caf89bf5ba49499404145651234336401b9b2843a579ed152e090f11b9e59",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABAGaLZY3dDpj3a79vKDuIpoWO4Cb\nmxReUxO7643v6rnWVIyvib9bpJSZQEFFZRI0M2QBubKEOlee0VLgkPEbnlk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "signature malleability",
+          "msg" : "313233343030",
+          "sig" : "304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220426e857aad3ff7aa96e4d200c03b45f1846a36d089ee3917768ca1a0d6d4da6e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "valid",
+          "msg" : "313233343030",
+          "sig" : "304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30814402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 4,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30450281200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 5,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "304502200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f028120678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 6,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3082004402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 7,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3046028200200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 8,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "304602200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f02820020678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304502200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304302200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304402210a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3044021f0a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0221678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f021f678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3085010000004402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3049028501000000200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304902200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f02850100000020678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "308901000000000000004402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304d02890100000000000000200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304d02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0289010000000000000020678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30847fffffff02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "304802847fffffff0a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "304802200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f02847fffffff678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3084ffffffff02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "30480284ffffffff0a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "304802200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0284ffffffff678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3085ffffffffff02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "30490285ffffffffff0a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "304902200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0285ffffffffff678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3088ffffffffffffffff02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "304c0288ffffffffffffffff0a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "304c02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0288ffffffffffffffff678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30ff02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "304402ff0a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f02ff678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "308002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "304402800a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0280678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "304602200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "3046000002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "304602200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3049498177304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30482500304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3046304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3049222549817702200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30482224250002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304c222202200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0004deadbeef0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304902200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f22254981770220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304802200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f222425000220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304c02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f22220220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304caa00bb00cd00304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304aaa02aabb304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304c2228aa00bb00cd0002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304a2226aa02aabb02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304c02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f2228aa00bb00cd000220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304a02200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f2226aa02aabb0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3048228002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f00000220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "304802200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f22800220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3080314402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3048228003200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f00000220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "304802200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f22800320678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2e4402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2f4402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "314402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "324402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "ff4402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "30483001023043200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "304302200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "3043200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "308002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390000",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 78,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "308002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c3900",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "308002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c3905000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "308002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "308002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "308002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "3046300002200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "304602200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c393000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "3046304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "302202200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "306602200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "removing integer",
+          "msg" : "313233343030",
+          "sig" : "30220220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "3023020220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "302302200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f02",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "304602220a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f00000220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "304602200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0222678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3046022200000a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 94,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "304602200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f02220000678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 95,
+          "comment" : "appending unused 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "304602200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f00000220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "304602220a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f05000220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "304602200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0222678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c390500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "302402810220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "302402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0281",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "302405000220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "302402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304400200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304401200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304403200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304404200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3044ff200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0020678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0120678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0320678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0420678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111fff20678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "302402000220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "302402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "3048222402010a021f5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "304802200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f2224020167021f8cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "30440220085f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220658cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d119f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737cb9",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3043021f0a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d110220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3043021f5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "304302200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f021f678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "304302200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f021f8cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "30450221ff0a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "304502200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0221ff678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "30250901800220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "302502200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f090180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "30250201000220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "302502200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f020100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3045022100b45ae44c5c1bb1ff143702d28ee43a86a590e44bcafda560b652e5bfdde567c60220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30450221ff60643495183e5e86976aedb153dd1fa38d1def04603a57719616c8baaf54ba780220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30440220f5a0738f45d2f7bd2a2f07be0e9f52eae6a89657ea640196d9cb28c2b962eee10220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30450221009f9bcb6ae7c1a1796895124eac22e05c72e210fb9fc5a88e69e9374550ab45880220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30450221ff4ba51bb3a3e44e00ebc8fd2d711bc5795a6f1bb435025a9f49ad1a40221a983a0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30450221010a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3045022100f5a0738f45d2f7bd2a2f07be0e9f52eae6a89657ea640196d9cb28c2b962eee10220678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f02210111882a3c969d5bcde5e743207acbd4f19408be76e0d514d7a9af7b6457bbd2e0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0220bd917a8552c00855691b2dff3fc4ba0e7b95c92f7611c6e889735e5f292b2592",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304402200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f022098732d9f0b514dee587ec77022b7b87ff830bc2cd48c921fe66e931e3f8c83c7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f0221feee77d5c36962a4321a18bcdf85342b0e6bf741891f2aeb285650849ba8442d20",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f022101678cd260f4aeb211a781388fdd48478007cf43d32b736de019916ce1c0737c39",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502200a5f8c70ba2d0842d5d0f841f160ad15195769a8159bfe692634d73d469d111f02210098732d9f0b514dee587ec77022b7b87ff830bc2cd48c921fe66e931e3f8c83c7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 144,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020101090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30080201ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a70201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a60201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a80201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53770201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e53780201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a7",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a6",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5377",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5378090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "Edge case for Shamir multiplication",
+          "msg" : "3638393434",
+          "sig" : "304402200c939a92486c6d0d619510b4a94162b9221be2eb15faf878bff75e6cdf4e370702203977619b43e6b4ea1870d861206483b306560e3c4a3ef82b11a802ff8892dc1d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 216,
+          "comment" : "special case hash",
+          "msg" : "343236343739373234",
+          "sig" : "304402205583dd480964bd2332885fbb50b7475ebd428399e7166fd9bd529611534b9f3402200ed035a02c4b665cacb70de8e822facd71645a15f93fee661324f850b847b51d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "special case hash",
+          "msg" : "37313338363834383931",
+          "sig" : "30440220300e26027ce7d3f21c8571dc690b1bb990e8fc49ad3e95374bd543b2e22badc6022022bc8f2445cd4956bc0db553966a0718aeb5ead65bc66ddb21fea0e571a87ee1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "special case hash",
+          "msg" : "3130333539333331363638",
+          "sig" : "304402202907cb01a82a88046640a523f9b9854d95b7ec2ddd67c20723d05829e8438a77022038ca08e58623560f724a3e3f9ba0e9ec7974976dd34e6940c0fe6168d540e39b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "special case hash",
+          "msg" : "33393439343031323135",
+          "sig" : "304402200c35840f7b7319f19fd72f29fea4cf937aba2c3fe1dc01aec63c21094c5d354802207bf699868c2b694547aebe9b98c01c5efbe982a84150390894563d4e2cb240b6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "special case hash",
+          "msg" : "31333434323933303739",
+          "sig" : "304402204272ff20b8c3d19e8c84141fbe4d1681fa71b51f6c10360db7affac989274d2302206772ff768ee6a3edaf0dbdd7b5c6962c2acc8cb14e6347631e25940189729468",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "special case hash",
+          "msg" : "33373036323131373132",
+          "sig" : "304502200a1e072c48a62a583bf94fe63809e95f3202176bfa6d28de8f75a4a3256ca21f0221009514a6e5b235c29152561cc9492cf47477a0fe23f56040d7206bfb4eb3e18798",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "special case hash",
+          "msg" : "333433363838373132",
+          "sig" : "3044022002bcbd38a3e3113445ad2ee42faeaee9fed00277e0b15521329f4c27c963af01022006cf399deb1f6fd692075d236272b99c3336aea2cfac34d904646cc1daf54de6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "special case hash",
+          "msg" : "31333531353330333730",
+          "sig" : "3044022062f3a6a9c9f457211b46b1ca3a782f11f44cb9360bb30702e67136036ccba39e022022f02e5f647ceb3d0c49f2e7ac9bbb31b7e3ae29a5ed670c96cad6d0f45df389",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "special case hash",
+          "msg" : "36353533323033313236",
+          "sig" : "3045022023d679aed9066b611820a8e02b3daa922b10d5596c8ceb7bd4e4fcd6e5e1dca70221009626e1d2205d60e39b633852f623f0f8b35e44797e08c6fad196c33be69b5ac7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "special case hash",
+          "msg" : "31353634333436363033",
+          "sig" : "304402200e4c5c077f14a4db197654f8081f10ac2229e6f2084405aea525679e592539a902201355d43667402b9f01959140c414f18d908e2559e57adf35ce794dbc8e222006",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "special case hash",
+          "msg" : "34343239353339313137",
+          "sig" : "304402203246b33954cf1dd4a216218d49b14e39db82004ba0556fb591357aff76a1ea6302205b5fcb726ebf18c9151a26a5b0800cbf95b5edc084b42dc6dc7fbb9a0aed8425",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "special case hash",
+          "msg" : "3130393533323631333531",
+          "sig" : "30440220361a8def874057c715423843bd7bf0775ba6366fa48ca83e1cdce206bf94c2bf0220365e97493d3382681f1d94657e9888245c9b0762ee7f4ca02e738afdbba274d6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "special case hash",
+          "msg" : "35393837333530303431",
+          "sig" : "304402202c5f51bc91969fd5b804e751323fc80294b0b5b1e20e195ec9bdc6a7806da13f02204c246c949bce43d303201fa0d989e70674766555e8d3a99c26babb658d1f7db8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "special case hash",
+          "msg" : "33343633303036383738",
+          "sig" : "3045022100a9e3f1e83108be78668d4bac7ffb2918d38100ba01f37de5b923eeca07cc05e302203f0d81bcc08802a435599759f51c89f816742710885b4137758130e8acf707d4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "special case hash",
+          "msg" : "39383137333230323837",
+          "sig" : "3045022100959e9811bb18b4865fde6d5f9c246d67e48d7a5c7ce46d7afb6f5ec0b26d506002200091a097618f2517ad6dcf49bcc208e94cb81af87f65b7880580f99858a9a915",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 231,
+          "comment" : "special case hash",
+          "msg" : "33323232303431303436",
+          "sig" : "304502204f9231b1cbaea183ed9d8591ae3e9f0439201e1067ff00535a415396b77811d60221009851c799a311abaefa08c412f6f679a000a6edaa005d05f550a62ff9a6a1a507",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 232,
+          "comment" : "special case hash",
+          "msg" : "36363636333037313034",
+          "sig" : "304402205479acb76c38d47f21940855f1800978a52fb10b7cc9b07caf88af67f26971430220244f3cdd683555b88a45e975073735d38713da4bdea340b5fb87d3c443adb0ee",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 233,
+          "comment" : "special case hash",
+          "msg" : "31303335393531383938",
+          "sig" : "3045022014990149d3a8f3c96e9c62952f90ef21cbcc0d03da802f72432a041da54db5be02210087427b96d28499707a6788705cd8a5ee9fd42e2d1f1273752337efcd06aa88a9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 234,
+          "comment" : "special case hash",
+          "msg" : "31383436353937313935",
+          "sig" : "304502205bb244b511a9828fbe7a041af341a93b242b513310de9f4bc366e18b93a3ce34022100978be5d58ce70c92dea75ce2f8e88f093f5e4675e750fd088777a7411526c1f7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 235,
+          "comment" : "special case hash",
+          "msg" : "33313336303436313839",
+          "sig" : "30450220070e64f4d19f9fd9a8d3f0a64f951c41db2f0e13490e7ac0b3f6066bc1e540a7022100835b25029a2ced8df57b0343a2c718db72c2d31f7ef66b230c97d20281d49a33",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 236,
+          "comment" : "special case hash",
+          "msg" : "32363633373834323534",
+          "sig" : "304402202b5a6dc14e98d2e6c0b627568a748bda04c09500bc63bd744f5dee967db0f0b102203452b13ef8dc01a0b785fbb4fcd057a5880c418427283abc7aa7fa07d507eed0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 237,
+          "comment" : "special case hash",
+          "msg" : "31363532313030353234",
+          "sig" : "304402201d91bda90d0831be058f610fe3e6451791e09689c52bd466ef74dd85b3cbd12102204ba37a9341e5923ea93e357344fe7b73446e207a7e449607b1482c510e93b630",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 238,
+          "comment" : "special case hash",
+          "msg" : "35373438303831363936",
+          "sig" : "304402206a32e1625c1eb7d40b3145f894c7138d6232a6116d50f1270a0e971e2b7a8e75022061b6aae56819272813319f7c214f83ce5fccdb58878d592ab0f4479a52d970e1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 239,
+          "comment" : "special case hash",
+          "msg" : "36333433393133343638",
+          "sig" : "304402205b7526f09dab248551ed8b1229c2447a4521d2d6e22902acbc176c501f5f5f7e02203186552f700d9e6b551c893ed2aed9556b3f0ac2a5e2772f8fb1a184949262cb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 240,
+          "comment" : "special case hash",
+          "msg" : "31353431313033353938",
+          "sig" : "3044022030d0ffa9c2be042ccd2c9adbcbbba22cc044d69abf37eff2bcab91d45be9b0bd0220482dd72aa3b3f3f2e6dd4a075fa962b8f6fc25e9d32d0dccbd80831acf7595e0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 241,
+          "comment" : "special case hash",
+          "msg" : "3130343738353830313238",
+          "sig" : "30450220200d3b5f915863ada8c84ef5eb50ecf0ab43e2bac10a4c42cf3719121a8d37cd0221009d137e11a050bfbba746c19ad5f7195c86f24115d1fadfb19ad2cb5624126cda",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 242,
+          "comment" : "special case hash",
+          "msg" : "3130353336323835353638",
+          "sig" : "304402204ac55470789095e9e250332f3790f865fbcc58934588c774babf22de6a8a695802202cfefb0e2be0542c97eb61914f23fb37b58fb17d0d6b766a8f63c8d0dc79e52b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 243,
+          "comment" : "special case hash",
+          "msg" : "393533393034313035",
+          "sig" : "3045022100908c1e6da625879fc116ddb65173b9355fa8eb038063de2cec1934e8fb2bfc2702206e084ff7c043edfb161aea2605a111cf43d58388e061e8019e99526376e4c71e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 244,
+          "comment" : "special case hash",
+          "msg" : "393738383438303339",
+          "sig" : "304502210097328e1050fc2d44ec89836a7eaae360d6f9d996855e8b144d0c273c4866d7fe02203919d7ced9f3e3284978546394fbb277f84d26598dbe83da4ba7c1de372b3340",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 245,
+          "comment" : "special case hash",
+          "msg" : "33363130363732343432",
+          "sig" : "30450221009881e8f75db8163d2be1fc11491926c4125374440da94750a19ecaf8a83b71fc02204a9a191a9da8fa3d5641cbb5a88cac5b3780fbbef8ef1a445782394925efc5b1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 246,
+          "comment" : "special case hash",
+          "msg" : "31303534323430373035",
+          "sig" : "3044022070cb8bc7d5c372c73cf36fe69aa1a509fe0cf2be642e085ac979d6eefddaa9e10220500402f496dc8d904c709695ff02714e607c4bee9d064cd4654b6c466f4010e8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 247,
+          "comment" : "special case hash",
+          "msg" : "35313734343438313937",
+          "sig" : "3044022039c8f870185f87957e009d01e52fbf6c7ae50d734d39ec4113b37b7bd1b68066022073d6da2b777ce0c43d49080857c6ec58546fddf17d2676f10f88ddc900ca1891",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 248,
+          "comment" : "special case hash",
+          "msg" : "31393637353631323531",
+          "sig" : "304402202e95b702ed138f42614f07a1b21548ea1d247a4a7fd765628bab68551129ad3802202e9a6af078b51812ed71b0eab65350cd081f7999a24a56e96af9d5c5f6bdaf0f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 249,
+          "comment" : "special case hash",
+          "msg" : "33343437323533333433",
+          "sig" : "304402205837b687f2128063dc67f512cb6670f122b611257f536d45e3984f5ebbc3cd4d02206a6c0c41b9cc37ae02c2218d3b8cd80cd3c4fc25771c0caab3b8ed2c611cf7cb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 250,
+          "comment" : "special case hash",
+          "msg" : "333638323634333138",
+          "sig" : "304502205a73c75d2b5c48af17b7847244262bb9b2c3f2697a9d8c605758a2d33cccd18f02210097f12aa04b2582373f9bea646bce1b129030ea5f35c9dc2a149e90aa3b56345c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 251,
+          "comment" : "special case hash",
+          "msg" : "33323631313938363038",
+          "sig" : "3045022032b603132a96c5b957b08c88532e49fcb73cd7c5f71a1e6ed14a5cc1776d2da702210093be0e4c9844bec9d2b62b424e618a845a98537b2356c1f473bba13b08458eea",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 252,
+          "comment" : "special case hash",
+          "msg" : "39363738373831303934",
+          "sig" : "30450221009b76b7aac0a13bf217f24d335bc04694ecdbd5acfe4ec23c065efeb7936a1c620220432cde74fdbb4f5437cdeca53cb7ab79f692694f91ed3735fbc4e08a3f527881",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 253,
+          "comment" : "special case hash",
+          "msg" : "34393538383233383233",
+          "sig" : "30450221008f2565b517f62a3b1e19b0917ab2b223fc8193cc0fdf3ab9692bc42cf40910e802201dccfbed8b90ee5391ea743e35b60ed31d19edfbd94504badca4aa4cf2a7bb31",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 254,
+          "comment" : "special case hash",
+          "msg" : "383234363337383337",
+          "sig" : "3044022031c627fd791f734421e5502618aec447c67029b2794ee12b08eeb6c59aedb3ee022008f91f3789bd01e5b9d93941cf46698d5e1a2708e70ee9a226e81e7f4a414e9e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 255,
+          "comment" : "special case hash",
+          "msg" : "3131303230383333373736",
+          "sig" : "304402206005293132d7eac0e72b9b218d03212675d5aae0da97bccdf1a5ff784de5cde6022013a155c74a9ab27cbdf6cae18d4d1f18b8212d8018551e2baec91979ea5b4c49",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 256,
+          "comment" : "special case hash",
+          "msg" : "313333383731363438",
+          "sig" : "304402203a6dab51ed9027f5cae192e0586a32c8ef2276ceba3b796059dca135e361795d02204bf16b0e62e32a945088f55fb428159af78296dd4f8dfd9713bdb2f677cbcd12",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 257,
+          "comment" : "special case hash",
+          "msg" : "333232313434313632",
+          "sig" : "3046022100961de77ed9cf6170d925c233bd3e20eef9bbe6d6c8dac28acde46011f99f8bff022100977de04779ffe3afe708d81ce8a1ed6c7d2a9a25ef9959c7a951a0555a6d3792",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 258,
+          "comment" : "special case hash",
+          "msg" : "3130363836363535353436",
+          "sig" : "30440220778581b3d4030031141e555fa1dbebaef0eed019e0b897b5076544ab80498b9c02207132c8d109c1f1a6c10f81e9fc11adea4b9cff599208b6d9cb4e4b27f1972846",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 259,
+          "comment" : "special case hash",
+          "msg" : "3632313535323436",
+          "sig" : "30450221009eeac8f07c40cc8ee3cba107af49d526731d8b7c70130cbb6efa3c61505d6337022062db38226b71f64a5b598ab7c4e3f89880fe0d0749dfd5c7a38a3eec3c793876",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 260,
+          "comment" : "special case hash",
+          "msg" : "37303330383138373734",
+          "sig" : "30430220673d41c17e727f0125175b2a9f0561ecc5cf9cd49035828ba7c47545a0b338f4021f459ef978e7b03468c80fd4533a334755a0826bf5a30df919129e352d347562",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 261,
+          "comment" : "special case hash",
+          "msg" : "35393234353233373434",
+          "sig" : "30460221008a97f19b0809042cdafe9c32bc0b0b01218a49867a6882d64d5b7bc255eb773d022100904662b5dfd8cd94eaefd57e5d4f2d14268e1b8c4fbd4ac4e5080f79d53fd24c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 262,
+          "comment" : "special case hash",
+          "msg" : "31343935353836363231",
+          "sig" : "30440220287a88bdb561fa2785ca258663f86d3b07aac949f647ee572621b0b70eb3e9ca02204a6d7916418443deb4c43f5c69f6490952cf53ee69eec1ac69e144b8f9e26307",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 263,
+          "comment" : "special case hash",
+          "msg" : "34303035333134343036",
+          "sig" : "30440220250db6a8b3813b13b6fb7bf19896f13a502be453c204e6a813a164dbdd9c66ca02201d96683ac97f5874ac9538b57bf1eaa50a11a33e9abb825d6b7a7546a698606e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 264,
+          "comment" : "special case hash",
+          "msg" : "33303936343537353132",
+          "sig" : "3045022100a29b2c4be50f1724a1ce9acd4c5129b391b4b9009abb582397a522c771d54abd02200ec1d7aedbfe4e743d7627ea8d207c2460ae4c9f2134b0f84a0255205ac23482",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 265,
+          "comment" : "special case hash",
+          "msg" : "32373834303235363230",
+          "sig" : "30440220149f0508aef9fbccf32e1bd3199d630240bb6577593e87566b0a14a5b6f2099902205d37b409c01fb9b6cf4ea14432c35631694402d2875a301d761d81811469628d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 266,
+          "comment" : "special case hash",
+          "msg" : "32363138373837343138",
+          "sig" : "304402206c9b110d8e4453d82ec51a5a691b152edf9fb1a9947bd001beb24d56f3bf27af02202a80bbd2f827cc23157526df6ea4e0e324b765a50be77f7e9667558a165eb692",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 267,
+          "comment" : "special case hash",
+          "msg" : "31363432363235323632",
+          "sig" : "30450221009086a5c93823b1df21f63951ed6e707fba0d899eef711100e32f2d6017da659002201f831ed30c129dab4266272e01283210ed823c55907ac5ecda85d70bd80279c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 268,
+          "comment" : "special case hash",
+          "msg" : "36383234313839343336",
+          "sig" : "304402202af63547dc5ffc8ba4d168d368d9228132a0efa20e3255c332219feced80039502203642f53ce9521fab754be7711f00af7888222bf2bbf1ed8995e03b55c98a6022",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 269,
+          "comment" : "special case hash",
+          "msg" : "343834323435343235",
+          "sig" : "304502210091e9acef9bc28c910891b80320af3603c4306174f17e97059267fc817814ff1f02207a9c833beb73bdd62df64952b4c848d2180fae385f8084f1fc5b1b1c64575007",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044b402a9ae18fc1a87cda337483900499fe729e471607671651a263fbf0d93f781ef9b0f98fb73bcb605a7823a427ea5f0d98788c7dae42a04536202022c021cd",
+        "wx" : "4b402a9ae18fc1a87cda337483900499fe729e471607671651a263fbf0d93f78",
+        "wy" : "1ef9b0f98fb73bcb605a7823a427ea5f0d98788c7dae42a04536202022c021cd"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200044b402a9ae18fc1a87cda337483900499fe729e471607671651a263fbf0d93f781ef9b0f98fb73bcb605a7823a427ea5f0d98788c7dae42a04536202022c021cd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABEtAKprhj8GofNozdIOQBJn+cp5H\nFgdnFlGiY/vw2T94Hvmw+Y+3O8tgWngjpCfqXw2YeIx9rkKgRTYgICLAIc0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 270,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "313233343030",
+          "sig" : "3036021100e2027b801fc479308ff5399a8825fccf022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 271,
+          "comment" : "r too large",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a4",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0440a2df0f17c7873459d5e9ac11fff84deb5f40ff9a52df8745bb4770f6dbf58199c2bf4920e9c8f758c2de69e42c1cb77c58425a9dafa41d7b0873efa894cedc",
+        "wx" : "40a2df0f17c7873459d5e9ac11fff84deb5f40ff9a52df8745bb4770f6dbf581",
+        "wy" : "099c2bf4920e9c8f758c2de69e42c1cb77c58425a9dafa41d7b0873efa894cedc"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000440a2df0f17c7873459d5e9ac11fff84deb5f40ff9a52df8745bb4770f6dbf58199c2bf4920e9c8f758c2de69e42c1cb77c58425a9dafa41d7b0873efa894cedc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABECi3w8Xx4c0WdXprBH/+E3rX0D/\nmlLfh0W7R3D22/WBmcK/SSDpyPdYwt5p5Cwct3xYQlqdr6Qdewhz76iUztw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 272,
+          "comment" : "r,s are large",
+          "msg" : "313233343030",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a3022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049de669f9444da82e429f842f31c64418d4d7b05e93f41daddd09fc181ac227c61c86210e8291fc5ae30c72e2013ec22bb97d88bf376d4a85dd1bb71b22526d1f",
+        "wx" : "09de669f9444da82e429f842f31c64418d4d7b05e93f41daddd09fc181ac227c6",
+        "wy" : "1c86210e8291fc5ae30c72e2013ec22bb97d88bf376d4a85dd1bb71b22526d1f"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200049de669f9444da82e429f842f31c64418d4d7b05e93f41daddd09fc181ac227c61c86210e8291fc5ae30c72e2013ec22bb97d88bf376d4a85dd1bb71b22526d1f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABJ3maflETaguQp+ELzHGRBjU17Be\nk/Qdrd0J/BgawifGHIYhDoKR/FrjDHLiAT7CK7l9iL83bUqF3Ru3GyJSbR8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 273,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "304402207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02204ab8de0a51481bc45794b924518f2dd6ac5cce31f3228d624c5a896f79a2d6a2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0430345b6451377b78a54ac6e110f50c7de71c2c760278373607722c53f586790759acc40014c93d4ad44778bc1a44ebaebe1a97c88ad11c1025057b6bc4377f2d",
+        "wx" : "30345b6451377b78a54ac6e110f50c7de71c2c760278373607722c53f5867907",
+        "wy" : "59acc40014c93d4ad44778bc1a44ebaebe1a97c88ad11c1025057b6bc4377f2d"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000430345b6451377b78a54ac6e110f50c7de71c2c760278373607722c53f586790759acc40014c93d4ad44778bc1a44ebaebe1a97c88ad11c1025057b6bc4377f2d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABDA0W2RRN3t4pUrG4RD1DH3nHCx2\nAng3NgdyLFP1hnkHWazEABTJPUrUR3i8GkTrrr4al8iK0RwQJQV7a8Q3fy0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 274,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "304502207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0221008b1b5f89f5bb74caa42d36e601a9f3c20b4e6c91ceb98a52fbfa9f81781b8a17",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04149d893f1306fb253bbf3a8691aba8a50002b0a27693aa97435a7b5cb33a55ee24b075fcdbc1a739f2f492dbe4799474ee3ad3804447e7d584e3430ce15a968a",
+        "wx" : "149d893f1306fb253bbf3a8691aba8a50002b0a27693aa97435a7b5cb33a55ee",
+        "wy" : "24b075fcdbc1a739f2f492dbe4799474ee3ad3804447e7d584e3430ce15a968a"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004149d893f1306fb253bbf3a8691aba8a50002b0a27693aa97435a7b5cb33a55ee24b075fcdbc1a739f2f492dbe4799474ee3ad3804447e7d584e3430ce15a968a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABBSdiT8TBvslO786hpGrqKUAArCi\ndpOql0Nae1yzOlXuJLB1/NvBpzny9JLb5HmUdO4604BER+fVhONDDOFaloo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 275,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04156e626649ce8236982201a24935fb3d36b0d73041b6fdca97990a8d152efb8b326f4b20a0cc4623b02a6bb17114901a01de0df1716d669d253de440cc8f9cdd",
+        "wx" : "156e626649ce8236982201a24935fb3d36b0d73041b6fdca97990a8d152efb8b",
+        "wy" : "326f4b20a0cc4623b02a6bb17114901a01de0df1716d669d253de440cc8f9cdd"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004156e626649ce8236982201a24935fb3d36b0d73041b6fdca97990a8d152efb8b326f4b20a0cc4623b02a6bb17114901a01de0df1716d669d253de440cc8f9cdd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABBVuYmZJzoI2mCIBokk1+z02sNcw\nQbb9ypeZCo0VLvuLMm9LIKDMRiOwKmuxcRSQGgHeDfFxbWadJT3kQMyPnN0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 276,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020102",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0410cc7992ede28c7b4dda5c35cbd71174918e83adab0342cc3d556a413b4ce93b3f9c3b38aef0a0e687d7ee6afde70d47d6900ff0ce62156e8645b8103fc66cad",
+        "wx" : "10cc7992ede28c7b4dda5c35cbd71174918e83adab0342cc3d556a413b4ce93b",
+        "wy" : "3f9c3b38aef0a0e687d7ee6afde70d47d6900ff0ce62156e8645b8103fc66cad"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000410cc7992ede28c7b4dda5c35cbd71174918e83adab0342cc3d556a413b4ce93b3f9c3b38aef0a0e687d7ee6afde70d47d6900ff0ce62156e8645b8103fc66cad",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABBDMeZLt4ox7TdpcNcvXEXSRjoOt\nqwNCzD1VakE7TOk7P5w7OK7woOaH1+5q/ecNR9aQD/DOYhVuhkW4ED/GbK0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 277,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020103",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 278,
+          "comment" : "r is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8020103",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042ba28f6236c5a774cd104b036d2e016711cb4a83fa078b5150f69e5098de7b4ca7c13ef8c57fcbe684ceff312ef53af1b14397d4154ba6106a3383aaed16ecb1",
+        "wx" : "2ba28f6236c5a774cd104b036d2e016711cb4a83fa078b5150f69e5098de7b4c",
+        "wy" : "0a7c13ef8c57fcbe684ceff312ef53af1b14397d4154ba6106a3383aaed16ecb1"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200042ba28f6236c5a774cd104b036d2e016711cb4a83fa078b5150f69e5098de7b4ca7c13ef8c57fcbe684ceff312ef53af1b14397d4154ba6106a3383aaed16ecb1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABCuij2I2xad0zRBLA20uAWcRy0qD\n+geLUVD2nlCY3ntMp8E++MV/y+aEzv8xLvU68bFDl9QVS6YQajODqu0W7LE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 279,
+          "comment" : "s is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82975b2d2e",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04113489555bdc112352b08b7ffebcf05090f94da62367646b2e03a3478863914b4b4a0a435462a122f6d9ac801319bbc6d2c59228861a3414b500e5cf5943c964",
+        "wx" : "113489555bdc112352b08b7ffebcf05090f94da62367646b2e03a3478863914b",
+        "wy" : "4b4a0a435462a122f6d9ac801319bbc6d2c59228861a3414b500e5cf5943c964"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004113489555bdc112352b08b7ffebcf05090f94da62367646b2e03a3478863914b4b4a0a435462a122f6d9ac801319bbc6d2c59228861a3414b500e5cf5943c964",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABBE0iVVb3BEjUrCLf/688FCQ+U2m\nI2dkay4Do0eIY5FLS0oKQ1RioSL22ayAExm7xtLFkiiGGjQUtQDlz1lDyWQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 280,
+          "comment" : "small r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "30260202010102202827370584fdeb9f5d5a9fb9579a09390efb6f9d99b64fc188d8bce05c2d4eed",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0434224746efa8c5d4f4c6b82de4d76d3e7150c1b69e23339f098ff769bcac94bf94618e3624a57d48d19e72867dbc191a0fd05cf6f4b5ec497b797626a57baa22",
+        "wx" : "34224746efa8c5d4f4c6b82de4d76d3e7150c1b69e23339f098ff769bcac94bf",
+        "wy" : "094618e3624a57d48d19e72867dbc191a0fd05cf6f4b5ec497b797626a57baa22"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000434224746efa8c5d4f4c6b82de4d76d3e7150c1b69e23339f098ff769bcac94bf94618e3624a57d48d19e72867dbc191a0fd05cf6f4b5ec497b797626a57baa22",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABDQiR0bvqMXU9Ma4LeTXbT5xUMG2\nniMznwmP92m8rJS/lGGONiSlfUjRnnKGfbwZGg/QXPb0texJe3l2JqV7qiI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 281,
+          "comment" : "smallish r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302b02072d9b4d347952ce02204937a087731df4febc2c3a81ddfbab5dc3af950817f41b590d156ed409ad2869",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046fb0cdf3b08dc5d8b7e5259c7d1bbd31a2235345b7b445631e894b567d23c07953243207df5c446011c1cfedde6e5351958affa8f274fe5af435759de87db343",
+        "wx" : "6fb0cdf3b08dc5d8b7e5259c7d1bbd31a2235345b7b445631e894b567d23c079",
+        "wy" : "53243207df5c446011c1cfedde6e5351958affa8f274fe5af435759de87db343"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200046fb0cdf3b08dc5d8b7e5259c7d1bbd31a2235345b7b445631e894b567d23c07953243207df5c446011c1cfedde6e5351958affa8f274fe5af435759de87db343",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABG+wzfOwjcXYt+UlnH0bvTGiI1NF\nt7RFYx6JS1Z9I8B5UyQyB99cRGARwc/t3m5TUZWK/6jydP5a9DV1neh9s0M=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 282,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "313233343030",
+          "sig" : "3032020d1033e67e37b32b445580bf4efb02210091827d03bb6dac31940ba56ed88489048ff173f0bf20cab20dcc086fca37f285",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040b8d3bef12ebab43f2f6f6618f0843d5f45d97874f26f9a36b788cb7a69ecf5f855588c99b3839ca9361ddc77645f7592ad371438ee3e186c74081c481dd5295",
+        "wx" : "0b8d3bef12ebab43f2f6f6618f0843d5f45d97874f26f9a36b788cb7a69ecf5f",
+        "wy" : "0855588c99b3839ca9361ddc77645f7592ad371438ee3e186c74081c481dd5295"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200040b8d3bef12ebab43f2f6f6618f0843d5f45d97874f26f9a36b788cb7a69ecf5f855588c99b3839ca9361ddc77645f7592ad371438ee3e186c74081c481dd5295",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABAuNO+8S66tD8vb2YY8IQ9X0XZeH\nTyb5o2t4jLemns9fhVWIyZs4OcqTYd3HdkX3WSrTcUOO4+GGx0CBxIHdUpU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 283,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "313233343030",
+          "sig" : "30260202010102203eb35fe7e8331f71e4c63b45f349a99d47a5e781798e579f2386195d3827bb15",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046d24985342a45a55fd99e47521fe3e991b8a1d376fa73899d3bacc067c12ee0d6542f148599fccb99b1ba28d3805814292a99bffe371df277b09e8ada1253dcd",
+        "wx" : "6d24985342a45a55fd99e47521fe3e991b8a1d376fa73899d3bacc067c12ee0d",
+        "wy" : "6542f148599fccb99b1ba28d3805814292a99bffe371df277b09e8ada1253dcd"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200046d24985342a45a55fd99e47521fe3e991b8a1d376fa73899d3bacc067c12ee0d6542f148599fccb99b1ba28d3805814292a99bffe371df277b09e8ada1253dcd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABG0kmFNCpFpV/ZnkdSH+Ppkbih03\nb6c4mdO6zAZ8Eu4NZULxSFmfzLmbG6KNOAWBQpKpm//jcd8newnoraElPc0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 284,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3031020d062522bbd3ecbe7c39e93e7c2502203eb35fe7e8331f71e4c63b45f349a99d47a5e781798e579f2386195d3827bb15",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044125e46820f41206b670882a9d8d51b6bac39091150c9cb33b6d009e0cff522365749240622b40d70a63407952c1b8761c9f8e85aba6f03bbc7219e24e6fb276",
+        "wx" : "4125e46820f41206b670882a9d8d51b6bac39091150c9cb33b6d009e0cff5223",
+        "wy" : "65749240622b40d70a63407952c1b8761c9f8e85aba6f03bbc7219e24e6fb276"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200044125e46820f41206b670882a9d8d51b6bac39091150c9cb33b6d009e0cff522365749240622b40d70a63407952c1b8761c9f8e85aba6f03bbc7219e24e6fb276",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABEEl5Ggg9BIGtnCIKp2NUba6w5CR\nFQycszttAJ4M/1IjZXSSQGIrQNcKY0B5UsG4dhyfjoWrpvA7vHIZ4k5vsnY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 285,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "313233343030",
+          "sig" : "3045022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e8297485628022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0491ba1706a19ce58faca26366dced293399450efa488f2c4baa95693b974d075d5e8401565a37b05b9351e408af542bf0f7957e5eed182afeabeafa2bf7bbbb47",
+        "wx" : "091ba1706a19ce58faca26366dced293399450efa488f2c4baa95693b974d075d",
+        "wy" : "5e8401565a37b05b9351e408af542bf0f7957e5eed182afeabeafa2bf7bbbb47"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000491ba1706a19ce58faca26366dced293399450efa488f2c4baa95693b974d075d5e8401565a37b05b9351e408af542bf0f7957e5eed182afeabeafa2bf7bbbb47",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABJG6FwahnOWPrKJjZtztKTOZRQ76\nSI8sS6qVaTuXTQddXoQBVlo3sFuTUeQIr1Qr8PeVfl7tGCr+q+r6K/e7u0c=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 286,
+          "comment" : "s == 1",
+          "msg" : "313233343030",
+          "sig" : "3025022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 287,
+          "comment" : "s == 0",
+          "msg" : "313233343030",
+          "sig" : "3025022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0425d17570e4bae1e468e6dd0975b382368061e0c704241c1d18fd5baa8ca8dc135acadcd13992f6665b469c9f9ab7797e3c4b881c6d7f4d2601c96a1536f76d05",
+        "wx" : "25d17570e4bae1e468e6dd0975b382368061e0c704241c1d18fd5baa8ca8dc13",
+        "wy" : "5acadcd13992f6665b469c9f9ab7797e3c4b881c6d7f4d2601c96a1536f76d05"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000425d17570e4bae1e468e6dd0975b382368061e0c704241c1d18fd5baa8ca8dc135acadcd13992f6665b469c9f9ab7797e3c4b881c6d7f4d2601c96a1536f76d05",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABCXRdXDkuuHkaObdCXWzgjaAYeDH\nBCQcHRj9W6qMqNwTWsrc0TmS9mZbRpyfmrd5fjxLiBxtf00mAclqFTb3bQU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 288,
+          "comment" : "point at infinity during verify",
+          "msg" : "313233343030",
+          "sig" : "3044022054fdabedd0f754de1f3305484ec1c6b8c61cbd51dab0d37bc80f07414ba42b53022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048afd47eb0667860bec98d5dcd2f60da9eac1ae99620569892f14e094d635872a5e8f0bc67b98a233ade715c04d9daab11a27517a92cf2651c9e5f2fde4e2db98",
+        "wx" : "08afd47eb0667860bec98d5dcd2f60da9eac1ae99620569892f14e094d635872a",
+        "wy" : "5e8f0bc67b98a233ade715c04d9daab11a27517a92cf2651c9e5f2fde4e2db98"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200048afd47eb0667860bec98d5dcd2f60da9eac1ae99620569892f14e094d635872a5e8f0bc67b98a233ade715c04d9daab11a27517a92cf2651c9e5f2fde4e2db98",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABIr9R+sGZ4YL7JjV3NL2Danqwa6Z\nYgVpiS8U4JTWNYcqXo8LxnuYojOt5xXATZ2qsRonUXqSzyZRyeXy/eTi25g=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 289,
+          "comment" : "u1 == 1",
+          "msg" : "313233343030",
+          "sig" : "3045022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040876616636a8dbc82160ac01af2941353ba0eea4a3b8fe31696b47317d4972c923180073061d27984ecf491f394004c3a4846d773f58dc2ab5e43dcbf968d027",
+        "wx" : "0876616636a8dbc82160ac01af2941353ba0eea4a3b8fe31696b47317d4972c9",
+        "wy" : "23180073061d27984ecf491f394004c3a4846d773f58dc2ab5e43dcbf968d027"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200040876616636a8dbc82160ac01af2941353ba0eea4a3b8fe31696b47317d4972c923180073061d27984ecf491f394004c3a4846d773f58dc2ab5e43dcbf968d027",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABAh2YWY2qNvIIWCsAa8pQTU7oO6k\no7j+MWlrRzF9SXLJIxgAcwYdJ5hOz0kfOUAEw6SEbXc/WNwqteQ9y/lo0Cc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 290,
+          "comment" : "u1 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "3045022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2022100989c5cc31440c1168f88b32ba6e47900183c0d843f9c41671898030664305d2b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040fabb052217eae8e63fea4eea09953d51862427f341307d819ff6e933bf72ba94b897f2c4a4cf57054c363c720da3d242471cc8e493becb0de022251d2ee4c8c",
+        "wx" : "0fabb052217eae8e63fea4eea09953d51862427f341307d819ff6e933bf72ba9",
+        "wy" : "4b897f2c4a4cf57054c363c720da3d242471cc8e493becb0de022251d2ee4c8c"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200040fabb052217eae8e63fea4eea09953d51862427f341307d819ff6e933bf72ba94b897f2c4a4cf57054c363c720da3d242471cc8e493becb0de022251d2ee4c8c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABA+rsFIhfq6OY/6k7qCZU9UYYkJ/\nNBMH2Bn/bpM79yupS4l/LEpM9XBUw2PHINo9JCRxzI5JO+yw3gIiUdLuTIw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 291,
+          "comment" : "u2 == 1",
+          "msg" : "313233343030",
+          "sig" : "3044022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0472ebad749b504c874d21bc5e4bba545dd42eb5fbf78af42043f5cef10aeb3ad745227464e1e9cef662f43fc80d4ce7eb7eb615a23699d48e89b278abd46ccc46",
+        "wx" : "72ebad749b504c874d21bc5e4bba545dd42eb5fbf78af42043f5cef10aeb3ad7",
+        "wy" : "45227464e1e9cef662f43fc80d4ce7eb7eb615a23699d48e89b278abd46ccc46"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000472ebad749b504c874d21bc5e4bba545dd42eb5fbf78af42043f5cef10aeb3ad745227464e1e9cef662f43fc80d4ce7eb7eb615a23699d48e89b278abd46ccc46",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABHLrrXSbUEyHTSG8Xku6VF3ULrX7\n94r0IEP1zvEK6zrXRSJ0ZOHpzvZi9D/IDUzn6362FaI2mdSOibJ4q9RszEY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 292,
+          "comment" : "u2 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "3044022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2022071523a926bf4712829995c6069025e4bb2d0fc6d23966f4fb5695f01ba3039c5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04744e218a04b31471b05e679c9481446bcd72a4d0fca7a7af1a1fe2f574d9362f60c0c52843d8d72cd636153f0f510a09089fc4478372dfc50e5b91d5301ba75e",
+        "wx" : "744e218a04b31471b05e679c9481446bcd72a4d0fca7a7af1a1fe2f574d9362f",
+        "wy" : "60c0c52843d8d72cd636153f0f510a09089fc4478372dfc50e5b91d5301ba75e"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004744e218a04b31471b05e679c9481446bcd72a4d0fca7a7af1a1fe2f574d9362f60c0c52843d8d72cd636153f0f510a09089fc4478372dfc50e5b91d5301ba75e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABHROIYoEsxRxsF5nnJSBRGvNcqTQ\n/Kenrxof4vV02TYvYMDFKEPY1yzWNhU/D1EKCQifxEeDct/FDluR1TAbp14=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 293,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022005ca53b2d9e4a2e1e4f47276fcdfb17b26a9cf0a7c9721dad28203d41107fdd4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047ea53d3c4635a4d5b60d79aac79d974c759263363472146a4605280d935ffc7559790403c96459b20477eaa437b3c7decd5e690faa940c0891de0cd07d41813c",
+        "wx" : "7ea53d3c4635a4d5b60d79aac79d974c759263363472146a4605280d935ffc75",
+        "wy" : "59790403c96459b20477eaa437b3c7decd5e690faa940c0891de0cd07d41813c"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200047ea53d3c4635a4d5b60d79aac79d974c759263363472146a4605280d935ffc7559790403c96459b20477eaa437b3c7decd5e690faa940c0891de0cd07d41813c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABH6lPTxGNaTVtg15qsedl0x1kmM2\nNHIUakYFKA2TX/x1WXkEA8lkWbIEd+qkN7PH3s1eaQ+qlAwIkd4M0H1BgTw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 294,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02205448aa82fc57740b2e1ebdf989baa145b018b423b3761feb055959eb6a01f1a1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04750462a163655746af66ba3eb48009a490d970799280586cfe59316365dc4ef0a2f1567257bd9aa1dcca3cd276ffaeb1dd85cea28d888a98642bf09a98f69f11",
+        "wx" : "750462a163655746af66ba3eb48009a490d970799280586cfe59316365dc4ef0",
+        "wy" : "0a2f1567257bd9aa1dcca3cd276ffaeb1dd85cea28d888a98642bf09a98f69f11"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004750462a163655746af66ba3eb48009a490d970799280586cfe59316365dc4ef0a2f1567257bd9aa1dcca3cd276ffaeb1dd85cea28d888a98642bf09a98f69f11",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABHUEYqFjZVdGr2a6PrSACaSQ2XB5\nkoBYbP5ZMWNl3E7wovFWcle9mqHcyjzSdv+usd2FzqKNiIqYZCvwmpj2nxE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 295,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022065bfcce69b89eff545fb0a67d2581a5f253484ef538b9b55fa862dfd2d488d52",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04323ae5754b417552cf968f5f3eea7187f7b1726e8c2e510f98d26430ac5849bc327101d82adf87c932e8eaa6a57e1d11bd65dc8f404c113f65abaa6eeaf5c7c4",
+        "wx" : "323ae5754b417552cf968f5f3eea7187f7b1726e8c2e510f98d26430ac5849bc",
+        "wy" : "327101d82adf87c932e8eaa6a57e1d11bd65dc8f404c113f65abaa6eeaf5c7c4"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004323ae5754b417552cf968f5f3eea7187f7b1726e8c2e510f98d26430ac5849bc327101d82adf87c932e8eaa6a57e1d11bd65dc8f404c113f65abaa6eeaf5c7c4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABDI65XVLQXVSz5aPXz7qcYf3sXJu\njC5RD5jSZDCsWEm8MnEB2Crfh8ky6OqmpX4dEb1l3I9ATBE/Zauqbur1x8Q=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 296,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207a459e047395d81d3b00f4b8d5ad34442b35dec5e6c1b45a0678e65a1fe9e9e6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0437a105e3ce3fb636733032d1ca56b4c659b451f64f4ba7378b087987e7a544d2782bad9b1654f2770d7a3ee35b672a366f685bc7191889ff2fa5c6b94ebe7ab8",
+        "wx" : "37a105e3ce3fb636733032d1ca56b4c659b451f64f4ba7378b087987e7a544d2",
+        "wy" : "782bad9b1654f2770d7a3ee35b672a366f685bc7191889ff2fa5c6b94ebe7ab8"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000437a105e3ce3fb636733032d1ca56b4c659b451f64f4ba7378b087987e7a544d2782bad9b1654f2770d7a3ee35b672a366f685bc7191889ff2fa5c6b94ebe7ab8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABDehBePOP7Y2czAy0cpWtMZZtFH2\nT0unN4sIeYfnpUTSeCutmxZU8ncNej7jW2cqNm9oW8cZGIn/L6XGuU6+erg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 297,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02203b7739bbe1048b69fd05f9262f628e03b0770e7ecd82337f1482a72db0293232",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0413dd59454f6af3e9db115b7ec8c3a1c8d308fdcb4963c3b8ea1264e4afda652c5d260b7fc9bfd200896d229f3c8daab9df2f55aa9ad95d4ea76aed8d74c5494d",
+        "wx" : "13dd59454f6af3e9db115b7ec8c3a1c8d308fdcb4963c3b8ea1264e4afda652c",
+        "wy" : "5d260b7fc9bfd200896d229f3c8daab9df2f55aa9ad95d4ea76aed8d74c5494d"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000413dd59454f6af3e9db115b7ec8c3a1c8d308fdcb4963c3b8ea1264e4afda652c5d260b7fc9bfd200896d229f3c8daab9df2f55aa9ad95d4ea76aed8d74c5494d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABBPdWUVPavPp2xFbfsjDocjTCP3L\nSWPDuOoSZOSv2mUsXSYLf8m/0gCJbSKfPI2qud8vVaqa2V1Op2rtjXTFSU0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 298,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022076ee7377c20916d3fa0bf24c5ec51c0760ee1cfd9b0466fe29054e5b60526464",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042c1dc56459bf09df50fb2d962f5989f3643021c5c360363e10e695a70b5942e86216d3ca0cca31dbd92a4d28bf951437f6f45db41e8e41fdf72414a293f53087",
+        "wx" : "2c1dc56459bf09df50fb2d962f5989f3643021c5c360363e10e695a70b5942e8",
+        "wy" : "6216d3ca0cca31dbd92a4d28bf951437f6f45db41e8e41fdf72414a293f53087"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200042c1dc56459bf09df50fb2d962f5989f3643021c5c360363e10e695a70b5942e86216d3ca0cca31dbd92a4d28bf951437f6f45db41e8e41fdf72414a293f53087",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABCwdxWRZvwnfUPstli9ZifNkMCHF\nw2A2PhDmlacLWULoYhbTygzKMdvZKk0ov5UUN/b0XbQejkH99yQUopP1MIc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 299,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02204a992824c737b00f02d23d2f2e3decf090b28ffa0e90e6d1e5dd157070719f65",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04137d6fdf836b1824378c08b35fa7ebe4e807d8a20105ce9cb3cd281f0a47c9c307d6475d4958c16d950f0439d3dbf86c2d7e2b12e8b137efc62dd1c723b83a62",
+        "wx" : "137d6fdf836b1824378c08b35fa7ebe4e807d8a20105ce9cb3cd281f0a47c9c3",
+        "wy" : "7d6475d4958c16d950f0439d3dbf86c2d7e2b12e8b137efc62dd1c723b83a62"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004137d6fdf836b1824378c08b35fa7ebe4e807d8a20105ce9cb3cd281f0a47c9c307d6475d4958c16d950f0439d3dbf86c2d7e2b12e8b137efc62dd1c723b83a62",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABBN9b9+DaxgkN4wIs1+n6+ToB9ii\nAQXOnLPNKB8KR8nDB9ZHXUlYwW2VDwQ509v4bC1+KxLosTfvxi3RxyO4OmI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 300,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0221009c092d165ef1b11a82b59c73aab3496631e3032038feda236db7b0f5a8e0cabb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04640213be1698b166f0c54e588e1b57a64826bf848adabfef60681d77747d2ca8646e45d961419d4ad1338c361228e1c6b6615398582c0e3e97f7ebc85a504423",
+        "wx" : "640213be1698b166f0c54e588e1b57a64826bf848adabfef60681d77747d2ca8",
+        "wy" : "646e45d961419d4ad1338c361228e1c6b6615398582c0e3e97f7ebc85a504423"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004640213be1698b166f0c54e588e1b57a64826bf848adabfef60681d77747d2ca8646e45d961419d4ad1338c361228e1c6b6615398582c0e3e97f7ebc85a504423",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABGQCE74WmLFm8MVOWI4bV6ZIJr+E\nitq/72BoHXd0fSyoZG5F2WFBnUrRM4w2EijhxrZhU5hYLA4+l/fryFpQRCM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 301,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100a90449e87d9de3ebed92a227735e45325b1d2d774b4876a86d0863349471ac59",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04269154ca58317552c655d2a9b3804dd94c2711145b9cd93c360f2dfe34cc197198046cc90cc6a8ac48ef7bacc5cb7e57334fa91facbadb48952c9fee543d1bb5",
+        "wx" : "269154ca58317552c655d2a9b3804dd94c2711145b9cd93c360f2dfe34cc1971",
+        "wy" : "098046cc90cc6a8ac48ef7bacc5cb7e57334fa91facbadb48952c9fee543d1bb5"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004269154ca58317552c655d2a9b3804dd94c2711145b9cd93c360f2dfe34cc197198046cc90cc6a8ac48ef7bacc5cb7e57334fa91facbadb48952c9fee543d1bb5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABCaRVMpYMXVSxlXSqbOATdlMJxEU\nW5zZPDYPLf40zBlxmARsyQzGqKxI73usxct+VzNPqR+suttIlSyf7lQ9G7U=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 302,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100a4310428c80a06da59719819a0a3dbf6658fab9938ca851cbd9c0aae864058d3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04240e0b64cee2e0b8890c2fa82de5848a5642ef0f7b2414f88f585281df7a1ff53a5990f860da3053f821bea914059ced85c9c2390b0d860532dbccca7ff66692",
+        "wx" : "240e0b64cee2e0b8890c2fa82de5848a5642ef0f7b2414f88f585281df7a1ff5",
+        "wy" : "3a5990f860da3053f821bea914059ced85c9c2390b0d860532dbccca7ff66692"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004240e0b64cee2e0b8890c2fa82de5848a5642ef0f7b2414f88f585281df7a1ff53a5990f860da3053f821bea914059ced85c9c2390b0d860532dbccca7ff66692",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABCQOC2TO4uC4iQwvqC3lhIpWQu8P\neyQU+I9YUoHfeh/1OlmQ+GDaMFP4Ib6pFAWc7YXJwjkLDYYFMtvMyn/2ZpI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 303,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100a14bda4f5b17b56966f75ede22340338d23ac413fa7ef42f545b08c47dbc59e9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0496f3cb5eb0c33be205ec058a22093d739fe80a7ecc874399c14f7f6c38cfcc5147b3eccaecc9add2b1dffc988f13dcab15b7e910d0250e70a1d79b3b931c32ed",
+        "wx" : "096f3cb5eb0c33be205ec058a22093d739fe80a7ecc874399c14f7f6c38cfcc51",
+        "wy" : "47b3eccaecc9add2b1dffc988f13dcab15b7e910d0250e70a1d79b3b931c32ed"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000496f3cb5eb0c33be205ec058a22093d739fe80a7ecc874399c14f7f6c38cfcc5147b3eccaecc9add2b1dffc988f13dcab15b7e910d0250e70a1d79b3b931c32ed",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABJbzy16wwzviBewFiiIJPXOf6Ap+\nzIdDmcFPf2w4z8xRR7PsyuzJrdKx3/yYjxPcqxW36RDQJQ5wodebO5McMu0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 304,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022032dfe6734dc4f7faa2fd8533e92c0d2f929a4277a9c5cdaafd4316fe96a446a9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04103b1bf6343d57260f652d272aaeff6cfa439f1583335eba66fa72d00eff7f8520f2bb035bd056c67ca22ca952abb5e1bcb68d67ca81790d24097f13d45209a1",
+        "wx" : "103b1bf6343d57260f652d272aaeff6cfa439f1583335eba66fa72d00eff7f85",
+        "wy" : "20f2bb035bd056c67ca22ca952abb5e1bcb68d67ca81790d24097f13d45209a1"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004103b1bf6343d57260f652d272aaeff6cfa439f1583335eba66fa72d00eff7f8520f2bb035bd056c67ca22ca952abb5e1bcb68d67ca81790d24097f13d45209a1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABBA7G/Y0PVcmD2UtJyqu/2z6Q58V\ngzNeumb6ctAO/3+FIPK7A1vQVsZ8oiypUqu14by2jWfKgXkNJAl/E9RSCaE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 305,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02206353c7f3e0a4e33ebf7758dadf2bd9d0841328e13c75e252855f5a2b87c2c78c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04959b3bf372301993b37e20b4344f13c06d5c1c53c7737f166efb94832c3b9bbb40d35ef46e4cfad475ddd1a1d9609feca7069712d30bdf4638d4c88bc9a12100",
+        "wx" : "0959b3bf372301993b37e20b4344f13c06d5c1c53c7737f166efb94832c3b9bbb",
+        "wy" : "40d35ef46e4cfad475ddd1a1d9609feca7069712d30bdf4638d4c88bc9a12100"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004959b3bf372301993b37e20b4344f13c06d5c1c53c7737f166efb94832c3b9bbb40d35ef46e4cfad475ddd1a1d9609feca7069712d30bdf4638d4c88bc9a12100",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABJWbO/NyMBmTs34gtDRPE8BtXBxT\nx3N/Fm77lIMsO5u7QNNe9G5M+tR13dGh2WCf7KcGlxLTC99GONTIi8mhIQA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 306,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022014899bc6ff5e72338f3c9847fa6531c4337fde3fcf1c8c32f768fba3a402a964",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046e69b17d83894e2e71ffce351b53459c0bb29bec379ff435f23c01a9b37df49e3ba1053ad84236d82cf7c762362b37b24e3b0ee1f8ea6c543a2591dcb6681a8f",
+        "wx" : "6e69b17d83894e2e71ffce351b53459c0bb29bec379ff435f23c01a9b37df49e",
+        "wy" : "3ba1053ad84236d82cf7c762362b37b24e3b0ee1f8ea6c543a2591dcb6681a8f"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200046e69b17d83894e2e71ffce351b53459c0bb29bec379ff435f23c01a9b37df49e3ba1053ad84236d82cf7c762362b37b24e3b0ee1f8ea6c543a2591dcb6681a8f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABG5psX2DiU4ucf/ONRtTRZwLspvs\nN5/0NfI8AamzffSeO6EFOthCNtgs98diNis3sk47DuH46mxUOiWR3LZoGo8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 307,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022072655c5e4f1cefca22f413a612e5bfdd7ba9ae71053f68b0c74d9a73590013c3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04336fc28e1f250485276747dfc34859b4741667b3ac46a0f6384decc1ac790304401206b5508aa06601a2246e7381dfecca6adb2b197ae14549a24c355cd53be1",
+        "wx" : "336fc28e1f250485276747dfc34859b4741667b3ac46a0f6384decc1ac790304",
+        "wy" : "401206b5508aa06601a2246e7381dfecca6adb2b197ae14549a24c355cd53be1"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004336fc28e1f250485276747dfc34859b4741667b3ac46a0f6384decc1ac790304401206b5508aa06601a2246e7381dfecca6adb2b197ae14549a24c355cd53be1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABDNvwo4fJQSFJ2dH38NIWbR0Fmez\nrEag9jhN7MGseQMEQBIGtVCKoGYBoiRuc4Hf7Mpq2ysZeuFFSaJMNVzVO+E=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 308,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100a2030dbf01d8c9de2900dc3845fda4e4c6bc049c4cd5717a9c629b9ed29d1859",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04913d9ce35b9c73203578e255d4dd35ff20212d357227d26b8a959180665b542ba503d922d3fd65a07eca18c0a4e2d3f2cf7c05928b406458cb286e11dc62dcb6",
+        "wx" : "0913d9ce35b9c73203578e255d4dd35ff20212d357227d26b8a959180665b542b",
+        "wy" : "0a503d922d3fd65a07eca18c0a4e2d3f2cf7c05928b406458cb286e11dc62dcb6"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004913d9ce35b9c73203578e255d4dd35ff20212d357227d26b8a959180665b542ba503d922d3fd65a07eca18c0a4e2d3f2cf7c05928b406458cb286e11dc62dcb6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABJE9nONbnHMgNXjiVdTdNf8gIS01\ncifSa4qVkYBmW1QrpQPZItP9ZaB+yhjApOLT8s98BZKLQGRYyyhuEdxi3LY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 309,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100a1db7293b6f01594b808718e61a4d642dff4fee2fb471167ef7ab42959a473e7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046b76915cc1c854744a78dac9baecd59845b90ad9cd308f5a887dccc909dacd4a7260456f8f8d31760d81bf85348d9f50c99d9918b480b1ec25f4e2e34de03769",
+        "wx" : "6b76915cc1c854744a78dac9baecd59845b90ad9cd308f5a887dccc909dacd4a",
+        "wy" : "7260456f8f8d31760d81bf85348d9f50c99d9918b480b1ec25f4e2e34de03769"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200046b76915cc1c854744a78dac9baecd59845b90ad9cd308f5a887dccc909dacd4a7260456f8f8d31760d81bf85348d9f50c99d9918b480b1ec25f4e2e34de03769",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABGt2kVzByFR0Snjaybrs1ZhFuQrZ\nzTCPWoh9zMkJ2s1KcmBFb4+NMXYNgb+FNI2fUMmdmRi0gLHsJfTi403gN2k=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 310,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02210099bb8d4bcbf1816d31aad88c25c61f1433b08322412c7bd84ed759d01c009127",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04647b37b731d3ead759762751995483469031084cd709887c9b6bafba462cbf84888c5b171f2b2fb7bb2b9d88200d79ac94d7d4025f79348e2283511c047891bf",
+        "wx" : "647b37b731d3ead759762751995483469031084cd709887c9b6bafba462cbf84",
+        "wy" : "0888c5b171f2b2fb7bb2b9d88200d79ac94d7d4025f79348e2283511c047891bf"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004647b37b731d3ead759762751995483469031084cd709887c9b6bafba462cbf84888c5b171f2b2fb7bb2b9d88200d79ac94d7d4025f79348e2283511c047891bf",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABGR7N7cx0+rXWXYnUZlUg0aQMQhM\n1wmIfJtrr7pGLL+EiIxbFx8rL7e7K52IIA15rJTX1AJfeTSOIoNRHAR4kb8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 311,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022041cee82a6957ef02ab3aa07a3315accc0d0d66c2081d530246d6e681873c90d1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041f761a1ae1e82e4af277b399da0a523e85644ce971c7b90236d03115aed9855b55cdb3e104361fd2e0979863f29a3b0bf5542c5105c91dfc7c94643b78a2b7f2",
+        "wx" : "1f761a1ae1e82e4af277b399da0a523e85644ce971c7b90236d03115aed9855b",
+        "wy" : "55cdb3e104361fd2e0979863f29a3b0bf5542c5105c91dfc7c94643b78a2b7f2"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200041f761a1ae1e82e4af277b399da0a523e85644ce971c7b90236d03115aed9855b55cdb3e104361fd2e0979863f29a3b0bf5542c5105c91dfc7c94643b78a2b7f2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABB92Ghrh6C5K8nezmdoKUj6FZEzp\ncce5AjbQMRWu2YVbVc2z4QQ2H9Lgl5hj8po7C/VULFEFyR38fJRkO3iit/I=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 312,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220746d61572ecae774691e7809121986d9b93279b00934ff1def1f4798da89ad4c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0463d303162574962899fd9a323c5fe24a09188fa20d47a8d92ba502d4f886f5b372cd0d82b3fd4f54fedc5d8618b142f63553e438cc1269719dee3abd3316fa21",
+        "wx" : "63d303162574962899fd9a323c5fe24a09188fa20d47a8d92ba502d4f886f5b3",
+        "wy" : "72cd0d82b3fd4f54fedc5d8618b142f63553e438cc1269719dee3abd3316fa21"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000463d303162574962899fd9a323c5fe24a09188fa20d47a8d92ba502d4f886f5b372cd0d82b3fd4f54fedc5d8618b142f63553e438cc1269719dee3abd3316fa21",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABGPTAxYldJYomf2aMjxf4koJGI+i\nDUeo2SulAtT4hvWzcs0NgrP9T1T+3F2GGLFC9jVT5DjMEmlxne46vTMW+iE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 313,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220281b26a0908968099f8e1f610f4f358318baa21107b791ef6f24cb244677a64b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043e1d966e05f04c44e162133d97730f6408a88ad990a2c6efb7e3e73a886f7ed4a40e3b3fd8b005fc417437f21011d9fbe38b329a2e7959ed9b040c8e1eb677fd",
+        "wx" : "3e1d966e05f04c44e162133d97730f6408a88ad990a2c6efb7e3e73a886f7ed4",
+        "wy" : "0a40e3b3fd8b005fc417437f21011d9fbe38b329a2e7959ed9b040c8e1eb677fd"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200043e1d966e05f04c44e162133d97730f6408a88ad990a2c6efb7e3e73a886f7ed4a40e3b3fd8b005fc417437f21011d9fbe38b329a2e7959ed9b040c8e1eb677fd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABD4dlm4F8ExE4WITPZdzD2QIqIrZ\nkKLG77fj5zqIb37UpA47P9iwBfxBdDfyEBHZ++OLMpoueVntmwQMjh62d/0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 314,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022046a78fe7c149c67d7eeeb1b5be57b3a1082651c278ebc4a50abeb4570f858f1b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0456ac8e49b319d5d041ae3d3f91de229c0a820d7ffd97ea06196eee7507363f42787fc05eba606f77b984e57cabf911209700b5d39147a14c5d1a95f56cd5feb4",
+        "wx" : "56ac8e49b319d5d041ae3d3f91de229c0a820d7ffd97ea06196eee7507363f42",
+        "wy" : "787fc05eba606f77b984e57cabf911209700b5d39147a14c5d1a95f56cd5feb4"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000456ac8e49b319d5d041ae3d3f91de229c0a820d7ffd97ea06196eee7507363f42787fc05eba606f77b984e57cabf911209700b5d39147a14c5d1a95f56cd5feb4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABFasjkmzGdXQQa49P5HeIpwKgg1/\n/ZfqBhlu7nUHNj9CeH/AXrpgb3e5hOV8q/kRIJcAtdORR6FMXRqV9WzV/rQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 315,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022014fdabedd0f754de1f3305484ec1c6b8c61cbd51dab0d37bc80f07414ba42b55",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045e2f228631ee7f00ceaf936278f2e2681b429fcfb8cb2c019b31f188839884f530e1079a6b889393cc83fabbd524f21bb486c65b83ab0afafb17265d971bae91",
+        "wx" : "5e2f228631ee7f00ceaf936278f2e2681b429fcfb8cb2c019b31f188839884f5",
+        "wy" : "30e1079a6b889393cc83fabbd524f21bb486c65b83ab0afafb17265d971bae91"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200045e2f228631ee7f00ceaf936278f2e2681b429fcfb8cb2c019b31f188839884f530e1079a6b889393cc83fabbd524f21bb486c65b83ab0afafb17265d971bae91",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABF4vIoYx7n8Azq+TYnjy4mgbQp/P\nuMssAZsx8YiDmIT1MOEHmmuIk5PMg/q71STyG7SGxluDqwr6+xcmXZcbrpE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 316,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0221008e305a1cf885ccc330ad0f1b5834a6a783f1948a5d5087d42bb5d47af8243535",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046dbc5605b4e113932fede7b4743f4dfc62fdecae16735b51653d79ee008f2fc51288fb2ca09ee336ef316b73919a7f3b329fca2f5c365cc427425fecf64f7bf3",
+        "wx" : "6dbc5605b4e113932fede7b4743f4dfc62fdecae16735b51653d79ee008f2fc5",
+        "wy" : "1288fb2ca09ee336ef316b73919a7f3b329fca2f5c365cc427425fecf64f7bf3"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200046dbc5605b4e113932fede7b4743f4dfc62fdecae16735b51653d79ee008f2fc51288fb2ca09ee336ef316b73919a7f3b329fca2f5c365cc427425fecf64f7bf3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABG28VgW04ROTL+3ntHQ/Tfxi/eyu\nFnNbUWU9ee4Ajy/FEoj7LKCe4zbvMWtzkZp/OzKfyi9cNlzEJ0Jf7PZPe/M=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 317,
+          "comment" : "point duplication during verification",
+          "msg" : "313233343030",
+          "sig" : "30440220074c035603e1eb49ab5382819bf82af82929b500c6e78841c1b2c3ff54a615dd02202035ac9ea7119e30e54f369cd22aa27af38b566ae6093f1df35b612de6f07598",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046dbc5605b4e113932fede7b4743f4dfc62fdecae16735b51653d79ee008f2fc597725caf014fc6854f349f1d0be90e373b9c2bf478efc363f8d0e830291ed784",
+        "wx" : "6dbc5605b4e113932fede7b4743f4dfc62fdecae16735b51653d79ee008f2fc5",
+        "wy" : "097725caf014fc6854f349f1d0be90e373b9c2bf478efc363f8d0e830291ed784"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200046dbc5605b4e113932fede7b4743f4dfc62fdecae16735b51653d79ee008f2fc597725caf014fc6854f349f1d0be90e373b9c2bf478efc363f8d0e830291ed784",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABG28VgW04ROTL+3ntHQ/Tfxi/eyu\nFnNbUWU9ee4Ajy/Fl3JcrwFPxoVPNJ8dC+kONzucK/R478Nj+NDoMCke14Q=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 318,
+          "comment" : "duplication bug",
+          "msg" : "313233343030",
+          "sig" : "30440220074c035603e1eb49ab5382819bf82af82929b500c6e78841c1b2c3ff54a615dd02202035ac9ea7119e30e54f369cd22aa27af38b566ae6093f1df35b612de6f07598",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048c5635eeaf7e994ff163ebdc9aacfdad1d50f9929a8035c36cf1c1e16d5b28f13de48431f3eb823a384c940b2b0a01512da98b8f72bd9545d179d6f1cd5a2a63",
+        "wx" : "08c5635eeaf7e994ff163ebdc9aacfdad1d50f9929a8035c36cf1c1e16d5b28f1",
+        "wy" : "3de48431f3eb823a384c940b2b0a01512da98b8f72bd9545d179d6f1cd5a2a63"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200048c5635eeaf7e994ff163ebdc9aacfdad1d50f9929a8035c36cf1c1e16d5b28f13de48431f3eb823a384c940b2b0a01512da98b8f72bd9545d179d6f1cd5a2a63",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABIxWNe6vfplP8WPr3Jqs/a0dUPmS\nmoA1w2zxweFtWyjxPeSEMfPrgjo4TJQLKwoBUS2pi49yvZVF0XnW8c1aKmM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 319,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "313233343030",
+          "sig" : "3044022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2022021ff1192539621f272e135501f80b5e38271e553f11387cb1cd2cfb3b7db4487",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042b9999cf86f15a7471ff8d212ca3f9a99225851b6d9608034ce0af55fd539b5a25d1d06449a6a9f4db833ab69d1170b4f0f07d2e5f74a9b56212563a0356e0b6",
+        "wx" : "2b9999cf86f15a7471ff8d212ca3f9a99225851b6d9608034ce0af55fd539b5a",
+        "wy" : "25d1d06449a6a9f4db833ab69d1170b4f0f07d2e5f74a9b56212563a0356e0b6"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200042b9999cf86f15a7471ff8d212ca3f9a99225851b6d9608034ce0af55fd539b5a25d1d06449a6a9f4db833ab69d1170b4f0f07d2e5f74a9b56212563a0356e0b6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABCuZmc+G8Vp0cf+NISyj+amSJYUb\nbZYIA0zgr1X9U5taJdHQZEmmqfTbgzq2nRFwtPDwfS5fdKm1YhJWOgNW4LY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 320,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "30440220743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048d40dbb264923c02a484fdc7f06108c727e5d18172c909f79a3845485c939f4594dd7b7c67653a712074d94890a8eb56a7d4b975024d3c82a1151669a6b83821",
+        "wx" : "08d40dbb264923c02a484fdc7f06108c727e5d18172c909f79a3845485c939f45",
+        "wy" : "094dd7b7c67653a712074d94890a8eb56a7d4b975024d3c82a1151669a6b83821"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200048d40dbb264923c02a484fdc7f06108c727e5d18172c909f79a3845485c939f4594dd7b7c67653a712074d94890a8eb56a7d4b975024d3c82a1151669a6b83821",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABI1A27JkkjwCpIT9x/BhCMcn5dGB\ncskJ95o4RUhck59FlN17fGdlOnEgdNlIkKjrVqfUuXUCTTyCoRUWaaa4OCE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 321,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "30440220743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e0220796a6353bccf0b8675b699d502cbae2c88bb5799818ee4f9f93a0a5d477cd02e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041fb44c46fcdcfe8e37f047bccf57ba1890643f0033d492c4b197ca7057c86067763f1041f8c38be3ad20945a6f0fad6f530af96fed289b4e8f02abd80b2f2d83",
+        "wx" : "1fb44c46fcdcfe8e37f047bccf57ba1890643f0033d492c4b197ca7057c86067",
+        "wy" : "763f1041f8c38be3ad20945a6f0fad6f530af96fed289b4e8f02abd80b2f2d83"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200041fb44c46fcdcfe8e37f047bccf57ba1890643f0033d492c4b197ca7057c86067763f1041f8c38be3ad20945a6f0fad6f530af96fed289b4e8f02abd80b2f2d83",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABB+0TEb83P6ON/BHvM9XuhiQZD8A\nM9SSxLGXynBXyGBndj8QQfjDi+OtIJRabw+tb1MK+W/tKJtOjwKr2AsvLYM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 322,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "30450220743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e02210087fc46494e5887c9cb84d5407e02d78e09c7954fc44e1f2c734b3ecedf6d121f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048a42aef32568d8451e187a9441a6e886342d0033b04aaa4ddbd4d600c6a5c86a855fbb0861c7a642333f3723c6c3dd961f279d9943779d4c237deec94bff846e",
+        "wx" : "08a42aef32568d8451e187a9441a6e886342d0033b04aaa4ddbd4d600c6a5c86a",
+        "wy" : "0855fbb0861c7a642333f3723c6c3dd961f279d9943779d4c237deec94bff846e"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200048a42aef32568d8451e187a9441a6e886342d0033b04aaa4ddbd4d600c6a5c86a855fbb0861c7a642333f3723c6c3dd961f279d9943779d4c237deec94bff846e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABIpCrvMlaNhFHhh6lEGm6IY0LQAz\nsEqqTdvU1gDGpchqhV+7CGHHpkIzPzcjxsPdlh8nnZlDd51MI33uyUv/hG4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 323,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "30440220743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e022021ff1192539621f272e135501f80b5e38271e553f11387cb1cd2cfb3b7db4488",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0467f999eb1a40fdda28044d2af23357aac045172ef1e89c6430a68deb0a5e2c21550d93565dfc6a0c5b5cf4e7d9111bf4e31a0d0f94b8adfd9b800c5b38cc22b0",
+        "wx" : "67f999eb1a40fdda28044d2af23357aac045172ef1e89c6430a68deb0a5e2c21",
+        "wy" : "550d93565dfc6a0c5b5cf4e7d9111bf4e31a0d0f94b8adfd9b800c5b38cc22b0"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000467f999eb1a40fdda28044d2af23357aac045172ef1e89c6430a68deb0a5e2c21550d93565dfc6a0c5b5cf4e7d9111bf4e31a0d0f94b8adfd9b800c5b38cc22b0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABGf5mesaQP3aKARNKvIzV6rARRcu\n8eicZDCmjesKXiwhVQ2TVl38agxbXPTn2REb9OMaDQ+UuK39m4AMWzjMIrA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 324,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "30440220743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e02203090f487e51f9e35c8af70bb9ab7df45037e230a33d2c1fd96e404254fcb8679",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047cbf2bd2c89069d23ef7417cb783dec50089b3c45573ad00e1214b0c6f51ced56ef5cbc578da2f35cd8a43cf01a7078841fffef2bfaa4b931920ada792019b29",
+        "wx" : "7cbf2bd2c89069d23ef7417cb783dec50089b3c45573ad00e1214b0c6f51ced5",
+        "wy" : "6ef5cbc578da2f35cd8a43cf01a7078841fffef2bfaa4b931920ada792019b29"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200047cbf2bd2c89069d23ef7417cb783dec50089b3c45573ad00e1214b0c6f51ced56ef5cbc578da2f35cd8a43cf01a7078841fffef2bfaa4b931920ada792019b29",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABHy/K9LIkGnSPvdBfLeD3sUAibPE\nVXOtAOEhSwxvUc7VbvXLxXjaLzXNikPPAacHiEH//vK/qkuTGSCtp5IBmyk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 325,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "30440220743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e022077472d9a28b4ece71cf413a68eac0eb423a16fb462b1f48706fed48ca437bd2d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0433d4259f3ac0ce8a534e7655f2068f80f401c742ec04084784d269c49ef0701f3e1dd6fc7c206d4d759c80e3612da4d0fcd4200afe7a68300e9c13f4ef23f880",
+        "wx" : "33d4259f3ac0ce8a534e7655f2068f80f401c742ec04084784d269c49ef0701f",
+        "wy" : "3e1dd6fc7c206d4d759c80e3612da4d0fcd4200afe7a68300e9c13f4ef23f880"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000433d4259f3ac0ce8a534e7655f2068f80f401c742ec04084784d269c49ef0701f3e1dd6fc7c206d4d759c80e3612da4d0fcd4200afe7a68300e9c13f4ef23f880",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABDPUJZ86wM6KU052VfIGj4D0AcdC\n7AQIR4TSacSe8HAfPh3W/HwgbU11nIDjYS2k0PzUIAr+emgwDpwT9O8j+IA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 326,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "30450221008bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046eacd3ac7f7be63942b897b75d2826210553e1973a5b38487531e0db4a8418cc6b781f1ec2302bf27f8c4a46c9179185b92a53a28b85b3c64171139dede35a05",
+        "wx" : "6eacd3ac7f7be63942b897b75d2826210553e1973a5b38487531e0db4a8418cc",
+        "wy" : "6b781f1ec2302bf27f8c4a46c9179185b92a53a28b85b3c64171139dede35a05"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200046eacd3ac7f7be63942b897b75d2826210553e1973a5b38487531e0db4a8418cc6b781f1ec2302bf27f8c4a46c9179185b92a53a28b85b3c64171139dede35a05",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABG6s06x/e+Y5QriXt10oJiEFU+GX\nOls4SHUx4NtKhBjMa3gfHsIwK/J/jEpGyReRhbkqU6KLhbPGQXETne3jWgU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 327,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "30450221008bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace32620220796a6353bccf0b8675b699d502cbae2c88bb5799818ee4f9f93a0a5d477cd02e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0449680c57a9644af8a3cb5d60f33bbeb54c910bd40dab3fdb8daa09182e4d791880fca5d924092c316ae8266b2a32b74f186f6cf22c29520871fb2ad2c44ee71a",
+        "wx" : "49680c57a9644af8a3cb5d60f33bbeb54c910bd40dab3fdb8daa09182e4d7918",
+        "wy" : "080fca5d924092c316ae8266b2a32b74f186f6cf22c29520871fb2ad2c44ee71a"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000449680c57a9644af8a3cb5d60f33bbeb54c910bd40dab3fdb8daa09182e4d791880fca5d924092c316ae8266b2a32b74f186f6cf22c29520871fb2ad2c44ee71a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABEloDFepZEr4o8tdYPM7vrVMkQvU\nDas/242qCRguTXkYgPyl2SQJLDFq6CZrKjK3TxhvbPIsKVIIcfsq0sRO5xo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 328,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "30460221008bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace326202210087fc46494e5887c9cb84d5407e02d78e09c7954fc44e1f2c734b3ecedf6d121f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0469566f1e4619346bf81d4b7e76705781ae6a3e8470806ae4f73d53bb03c207a1396a54d57b45951ebce9987f6adb457d7ce77c6c3820d657f9a8882cdfad66cf",
+        "wx" : "69566f1e4619346bf81d4b7e76705781ae6a3e8470806ae4f73d53bb03c207a1",
+        "wy" : "396a54d57b45951ebce9987f6adb457d7ce77c6c3820d657f9a8882cdfad66cf"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000469566f1e4619346bf81d4b7e76705781ae6a3e8470806ae4f73d53bb03c207a1396a54d57b45951ebce9987f6adb457d7ce77c6c3820d657f9a8882cdfad66cf",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABGlWbx5GGTRr+B1LfnZwV4Guaj6E\ncIBq5Pc9U7sDwgehOWpU1XtFlR686Zh/attFfXznfGw4INZX+aiILN+tZs8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 329,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "30450221008bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262022021ff1192539621f272e135501f80b5e38271e553f11387cb1cd2cfb3b7db4488",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0446868fbfc7150d0bdb1c8e9976d845dc4b8840f4d921299b6d8f989d4dce865783921b9a729e51d2deb5955f4d87cc2b299c7f01372ae82cd63f529a266d4b52",
+        "wx" : "46868fbfc7150d0bdb1c8e9976d845dc4b8840f4d921299b6d8f989d4dce8657",
+        "wy" : "083921b9a729e51d2deb5955f4d87cc2b299c7f01372ae82cd63f529a266d4b52"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000446868fbfc7150d0bdb1c8e9976d845dc4b8840f4d921299b6d8f989d4dce865783921b9a729e51d2deb5955f4d87cc2b299c7f01372ae82cd63f529a266d4b52",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABEaGj7/HFQ0L2xyOmXbYRdxLiED0\n2SEpm22PmJ1NzoZXg5IbmnKeUdLetZVfTYfMKymcfwE3Kugs1j9SmiZtS1I=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 330,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "30450221008bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace326202203090f487e51f9e35c8af70bb9ab7df45037e230a33d2c1fd96e404254fcb8679",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044ba9ffbad26f909e59ff58118fb25d05e1fd2722cf1b9d88abfeb716c9f5461f76b2f395fdacb89f3b85fdf4cd733630403068559ba12c0f438f856286773f9b",
+        "wx" : "4ba9ffbad26f909e59ff58118fb25d05e1fd2722cf1b9d88abfeb716c9f5461f",
+        "wy" : "76b2f395fdacb89f3b85fdf4cd733630403068559ba12c0f438f856286773f9b"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200044ba9ffbad26f909e59ff58118fb25d05e1fd2722cf1b9d88abfeb716c9f5461f76b2f395fdacb89f3b85fdf4cd733630403068559ba12c0f438f856286773f9b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABEup/7rSb5CeWf9YEY+yXQXh/Sci\nzxudiKv+txbJ9UYfdrLzlf2suJ87hf30zXM2MEAwaFWboSwPQ4+FYoZ3P5s=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 331,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "30450221008bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262022077472d9a28b4ece71cf413a68eac0eb423a16fb462b1f48706fed48ca437bd2d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997",
+        "wx" : "08bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262",
+        "wy" : "547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABIvSrrnLflfLLEtIL/yBt6+53ifh\n470jwjpEU72azjJiVH74NcPaxP2X+EYaFGEdycJ3RRMt7Y5UXB1Uxy8EaZc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 332,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023022018487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 333,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3045022100989c5cc31440c1168f88b32ba6e47900183c0d843f9c41671898030664305d2b022018487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262557c5fa5de13e4bea66dc47689226fa8abc4b110a73891d3c3f5f355f069e9e0",
+        "wx" : "08bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262",
+        "wy" : "557c5fa5de13e4bea66dc47689226fa8abc4b110a73891d3c3f5f355f069e9e0"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262557c5fa5de13e4bea66dc47689226fa8abc4b110a73891d3c3f5f355f069e9e0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABIvSrrnLflfLLEtIL/yBt6+53ifh\n470jwjpEU72azjJiVXxfpd4T5L6mbcR2iSJvqKvEsRCnOJHTw/XzVfBp6eA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 334,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023022018487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 335,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3045022100989c5cc31440c1168f88b32ba6e47900183c0d843f9c41671898030664305d2b022018487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042676bd1e3fd83f3328d1af941442c036760f09587729419053083eb61d1ed22c2cf769688a5ffd67da1899d243e66bcabe21f9e78335263bf5308b8e41a71b39",
+        "wx" : "2676bd1e3fd83f3328d1af941442c036760f09587729419053083eb61d1ed22c",
+        "wy" : "2cf769688a5ffd67da1899d243e66bcabe21f9e78335263bf5308b8e41a71b39"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200042676bd1e3fd83f3328d1af941442c036760f09587729419053083eb61d1ed22c2cf769688a5ffd67da1899d243e66bcabe21f9e78335263bf5308b8e41a71b39",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABCZ2vR4/2D8zKNGvlBRCwDZ2DwlY\ndylBkFMIPrYdHtIsLPdpaIpf/WfaGJnSQ+Zryr4h+eeDNSY79TCLjkGnGzk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 336,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "30440220745be1da902d19c76c8f57d4a1f3362b4b20ed7c8de8fc0463d566795f979cea02205916c317a1e325b53735216a0fa37737f08b32245c88084817b468a41f5afee9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 337,
+          "comment" : "pseudorandom signature",
+          "msg" : "4d7367",
+          "sig" : "304502200ff9279a0775740b7db8bec07f9a0401b7903886cb198c1b18c46de0673b31c30221008b3c8686bd1a1508b5b785e762fece8c6cf19b6156983e5c36b2bbe724d6c23e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 338,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "30450220351e727003896ec02949a3cf752223bcc6c2b611b30391edd60dc0c83dc9c98f022100924ad9dc00364d4aa2091416d173862f9b02965ff176e880ea62a673e16db98e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 339,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "3044022044a811b2321acbc65cacf80d2dbe848946f1dac528f3e1ae38b0e54d083c258f022055d7edfaecdda3bbc062d5074e3c3719d32761159d027ca27c1725ddbd62f688",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a9fb57db62501389594f0ee9fc1652fa83377fa302e19cef64252fc0b147f7749507acf5b04339ed102b9ca60db98c165b94ebe855d2202e46dce15ba1e028be",
+        "wx" : "0a9fb57db62501389594f0ee9fc1652fa83377fa302e19cef64252fc0b147f774",
+        "wy" : "09507acf5b04339ed102b9ca60db98c165b94ebe855d2202e46dce15ba1e028be"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004a9fb57db62501389594f0ee9fc1652fa83377fa302e19cef64252fc0b147f7749507acf5b04339ed102b9ca60db98c165b94ebe855d2202e46dce15ba1e028be",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABKn7V9tiUBOJWU8O6fwWUvqDN3+j\nAuGc72QlL8CxR/d0lQes9bBDOe0QK5ymDbmMFluU6+hV0iAuRtzhW6HgKL4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 340,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3045022062aab40a36d6a0d25644719ce31dc629ec684f6f0da32f9dd034ccc421dbd0ed022100a1fa6b0dfd9558da29374fb77505ee8ab3572161711f821d11807c7fff910c1c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 341,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30450220740cd3d3a9cd9dbe05ead4e39e54db27c0f1579da68e3aa5c9245b047aebc3b80221008ae78c12233d378fe2ce3c0fb2b769f8463830a71a5e5187c11b20fdd7e50445",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 342,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100a28f30245c5fb0c225fdec23924dc2cd4c2da888d1ee1bc5445858c646015ca802200ee364c1491c4551ef3509be8f88db0e04d0afb36528aeda1301b14948cc9cd6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04351a45fb920f2c9f1b178438fa3bf272ff9328b881c477a1f56a8c0e884652761270f806fe40ad97ebf76c6825384b780ae6afccc792b05f2fb3eb7b7fffffff",
+        "wx" : "351a45fb920f2c9f1b178438fa3bf272ff9328b881c477a1f56a8c0e88465276",
+        "wy" : "1270f806fe40ad97ebf76c6825384b780ae6afccc792b05f2fb3eb7b7fffffff"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004351a45fb920f2c9f1b178438fa3bf272ff9328b881c477a1f56a8c0e884652761270f806fe40ad97ebf76c6825384b780ae6afccc792b05f2fb3eb7b7fffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABDUaRfuSDyyfGxeEOPo78nL/kyi4\ngcR3ofVqjA6IRlJ2EnD4Bv5ArZfr92xoJThLeArmr8zHkrBfL7Pre3////8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 343,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "304402207f202f54f591b51105b227ee6d6da3adddfc4b5e819efc04befcdcbf7484f78302204360ea04503955fc3f025928b2dce50ff2d58b9060b34bbedfc3c219b3b4355b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 344,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3044022062e218dca32e4ef35692e9315e1e036bef1766073b846e38de20d2d29349f9fe0220519d4d4c6158d95474d793a0ee9c260a0c5469c5aab79510971b41fb4fae4baf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 345,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100a3902295f6f743ac754db7b3fcd823be917b1191a5705728f5682492784da7f1022043def636660eff72e6435edb850c9126c7067938668f249998a0e4006b8ee7db",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040000000129b2146e36fc055545bf8f2cc70f8e73e8b25e539365ad7577cc35354a2b8c0319bc4ccd3e60da119477c23faf8fc2dcefc42d3af75827aeb42f6f0f",
+        "wx" : "129b2146e36fc055545bf8f2cc70f8e73e8b25e539365ad7577cc3535",
+        "wy" : "4a2b8c0319bc4ccd3e60da119477c23faf8fc2dcefc42d3af75827aeb42f6f0f"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200040000000129b2146e36fc055545bf8f2cc70f8e73e8b25e539365ad7577cc35354a2b8c0319bc4ccd3e60da119477c23faf8fc2dcefc42d3af75827aeb42f6f0f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABAAAAAEpshRuNvwFVUW/jyzHD45z\n6LJeU5NlrXV3zDU1SiuMAxm8TM0+YNoRlHfCP6+PwtzvxC0691gnrrQvbw8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 346,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304502210086d05b26a9ca7e10ae0681bb4c35a06d7a4e918f8625e3dfa7ac2d5aeda91c05022008c5f475a95888769da4a0e1b635c2292f654f934a5c5010fe0c729f3d11e1b1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 347,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3045022043c4474710d25094a2e21a9cc08585c26015f9f94012b100e72c0763aa9e0cff0221008345c46fd5592cefbd5ebb258965c05d964e6e6a278198ddc1e388cf1e75867c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 348,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304402206d2724167e816528491cce574f0526209de52cd0f2af0085284fd050163d37c5022076dd1dd50ff9b553b0e142b7e6c6be8edf3708dd292f03f3e9bf157d21daa9eb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04680becabe7d7df4fadfe5ae01fba5ea51b76759606a2e30612e667419b885d0508541dcb0723785c3c766581a7514a1ff42e4437d63f878271cb860f00000000",
+        "wx" : "680becabe7d7df4fadfe5ae01fba5ea51b76759606a2e30612e667419b885d05",
+        "wy" : "08541dcb0723785c3c766581a7514a1ff42e4437d63f878271cb860f00000000"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004680becabe7d7df4fadfe5ae01fba5ea51b76759606a2e30612e667419b885d0508541dcb0723785c3c766581a7514a1ff42e4437d63f878271cb860f00000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABGgL7Kvn199Prf5a4B+6XqUbdnWW\nBqLjBhLmZ0GbiF0FCFQdywcjeFw8dmWBp1FKH/QuRDfWP4eCccuGDwAAAAA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 349,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "30440220321009a06c759c54cd66baafa0cbfd07eedb19f12a1ed654dd52b56f9c4fac7c02201956310a7e4757ec83ddb92d2763607354678149f1ad92387928cf887b4bed0f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 350,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "30450221009bdd359881c239e2415ca2af3d18463bb24be53f6f636cbd20360b6b333bc34502200ff03bc36cc1975bdc8680c44fbf2aefddf67c118c304b8b3d360eb10203c3a4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 351,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3044022048565eb7e7820d40754b5f264a4ceafa62bf75084241514b491995e7971e699502203da6df3d354f48daef6d078cf1124295fc8c3211f2757967c781dc2e9c62ed1a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047d16fd656a9e6b34e45d8c8c3b458eae7bbc2879f8b4f61171a96f664eee906100000001469fb456ca6a1720ca8db25d567e121cf921ce13e34000f8c12f5272",
+        "wx" : "7d16fd656a9e6b34e45d8c8c3b458eae7bbc2879f8b4f61171a96f664eee9061",
+        "wy" : "1469fb456ca6a1720ca8db25d567e121cf921ce13e34000f8c12f5272"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200047d16fd656a9e6b34e45d8c8c3b458eae7bbc2879f8b4f61171a96f664eee906100000001469fb456ca6a1720ca8db25d567e121cf921ce13e34000f8c12f5272",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABH0W/WVqnms05F2MjDtFjq57vCh5\n+LT2EXGpb2ZO7pBhAAAAAUaftFbKahcgyo2yXVZ+Ehz5Ic4T40AA+MEvUnI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 352,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "30450220518e885def022eb5020fc90f4024d87122dc0f3ed7f869ed7720ff74a009fb7b0221008a3e26a8cd426d21eba5cd7a5614f3644395cfcecb24fe760a68a7a9e8f09c02",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 353,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3044022004b01e5cc3ce9bf10844bc1cb21deeff6ebc9e2a7010cfbb3af0811354599c8102202e65fb8db62f255910ea4d5235bb21aa67aa59ffd519911ecd9893000ab67bb4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 354,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304502210094bb0601198c4ce266b0932426ffd00132d7d4e2de65ef47f56360825f26243802202734327d1989c9580f5458f04aac6fd5752a1ee5e236e9ed1a7c0b2d9b36db10",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047d16fd656a9e6b34e45d8c8c3b458eae7bbc2879f8b4f61171a96f664eee9061a9fb57da5b4ef56573fbf36fd2f5db1517bde406dc0452143cd347245e3f0105",
+        "wx" : "7d16fd656a9e6b34e45d8c8c3b458eae7bbc2879f8b4f61171a96f664eee9061",
+        "wy" : "0a9fb57da5b4ef56573fbf36fd2f5db1517bde406dc0452143cd347245e3f0105"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200047d16fd656a9e6b34e45d8c8c3b458eae7bbc2879f8b4f61171a96f664eee9061a9fb57da5b4ef56573fbf36fd2f5db1517bde406dc0452143cd347245e3f0105",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABH0W/WVqnms05F2MjDtFjq57vCh5\n+LT2EXGpb2ZO7pBhqftX2ltO9WVz+/Nv0vXbFRe95AbcBFIUPNNHJF4/AQU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 355,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "304402204dde197f962c63a7799c862e897b3bb1e7a7ddfb9ab77c2a17a54151ce604ad60220017e7aef86e533086425a2c4b32082f118913ef3667c8437672e0bbc7c2b8d7e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 356,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "304402207c53ed1d504ad4ba53d39792012a34d007250a2b8d1ca189c0d9f75ccc9a9957022009b97dcc5c67487114231d601374a8364cafa39581291762202b9215d51135fd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 357,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30450220513245ab2b6a4206bb0f6970c8ad040a94725ddc9a08db0fd9def93866ffbba1022100a53a7ab37decedae18dd5b5c48eb642b7a9c927e6bcf6bdac3a757e6d2c169c5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0481528b7adbbebf1b6b3c7fa1d61284b07759b9a98d31a5702707b018fdecff1175bbfccb545381bf8601031731841829401b08dcdc68cc34e06a64e412038512",
+        "wx" : "081528b7adbbebf1b6b3c7fa1d61284b07759b9a98d31a5702707b018fdecff11",
+        "wy" : "75bbfccb545381bf8601031731841829401b08dcdc68cc34e06a64e412038512"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000481528b7adbbebf1b6b3c7fa1d61284b07759b9a98d31a5702707b018fdecff1175bbfccb545381bf8601031731841829401b08dcdc68cc34e06a64e412038512",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABIFSi3rbvr8bazx/odYShLB3Wbmp\njTGlcCcHsBj97P8Rdbv8y1RTgb+GAQMXMYQYKUAbCNzcaMw04Gpk5BIDhRI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 358,
+          "comment" : "x-coordinate of the public key has many trailing 1's on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100a50318c3066a4966ad18ae8f85253fbb5835a34b2f9187daac71ee28d3d5d0eb02200890ef0fc93df222d11197cb221483ce897b0cf1acf4a909c306c5a485776abc",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 359,
+          "comment" : "x-coordinate of the public key has many trailing 1's on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "30440220041e0389dda2cf2ae3a9562a0fb5d41c1f7533e6cc84a896e99af781e21097700220366b5d88c36f1227df522fdab65e12347d68eb64f2de82c648115fd565bd37b7",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 360,
+          "comment" : "x-coordinate of the public key has many trailing 1's on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "304502202a76394a04ae19b25c54291e28bcd42a7edeb20981b8a3b838f9dd0e29b574c10221009ce89980ae432c4fa6a68025da554bf900cc2eb0c66906420d322c14b453049c",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a3a25a353caa94ac4eed3700f7d56b456a0fc670d56a166d5219b7c97f30ef3e16ea8e03c20977f20aed58106b6d9d1085b4475f75b5469c5f426cb27ec6d872",
+        "wx" : "0a3a25a353caa94ac4eed3700f7d56b456a0fc670d56a166d5219b7c97f30ef3e",
+        "wy" : "16ea8e03c20977f20aed58106b6d9d1085b4475f75b5469c5f426cb27ec6d872"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004a3a25a353caa94ac4eed3700f7d56b456a0fc670d56a166d5219b7c97f30ef3e16ea8e03c20977f20aed58106b6d9d1085b4475f75b5469c5f426cb27ec6d872",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABKOiWjU8qpSsTu03APfVa0VqD8Zw\n1WoWbVIZt8l/MO8+FuqOA8IJd/IK7VgQa22dEIW0R191tUacX0Jssn7G2HI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 361,
+          "comment" : "y-coordinate of the public key is small on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "3045022066958be3379405826a00daf5495b1657698126a5ff449f9649af26ca96df96670221009b4100816e2741f86c5c0b0dcf82e579f4281d2b8e70c234808d84c1a495079f",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 362,
+          "comment" : "y-coordinate of the public key is small on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "3044022053ed0f4b8fb33ef277cdd1060435ed3dec518a225659f71f67f9a1f07f85c1ca0220124d5f94ddf12bb4cbe3c5cea6d2686d4480dabb8ffbb05e5238c877fe20383e",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 363,
+          "comment" : "y-coordinate of the public key is small on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "3044022046643c7fe0f308b8af4ce2978d797e8c46a7e1f8bfee0b5cdbaecde1f59be41d02201bd11a814d1fbd9ae97a49df99beca7fec2512563c0031c5aad5b9fc2fb0a507",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a3a25a353caa94ac4eed3700f7d56b456a0fc670d56a166d5219b7c97f30ef3e9310c9d7dfe531ca3378b2803215f061e887aec45f70d98bc0d0db6aa0a77b05",
+        "wx" : "0a3a25a353caa94ac4eed3700f7d56b456a0fc670d56a166d5219b7c97f30ef3e",
+        "wy" : "09310c9d7dfe531ca3378b2803215f061e887aec45f70d98bc0d0db6aa0a77b05"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004a3a25a353caa94ac4eed3700f7d56b456a0fc670d56a166d5219b7c97f30ef3e9310c9d7dfe531ca3378b2803215f061e887aec45f70d98bc0d0db6aa0a77b05",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABKOiWjU8qpSsTu03APfVa0VqD8Zw\n1WoWbVIZt8l/MO8+kxDJ19/lMcozeLKAMhXwYeiHrsRfcNmLwNDbaqCnewU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 364,
+          "comment" : "y-coordinate of the public key is large on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "304402204f833bec9c80185beacbb73b5f984e2c03d922359be7468ce37584f53d1aea4a02206636744ab7fecaa53541bcf5f37c6cbe828a8efbc4d00f6469ba390a86708a26",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 365,
+          "comment" : "y-coordinate of the public key is large on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100a2869da416523aad2b8fa8aad5c3b31c5a535fdd413b71af4dffb90c6f96a669022029ff3e8d499cabc3cc4cccd0fa811cc3b04770aa71f0d052185210b14d31993d",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 366,
+          "comment" : "y-coordinate of the public key is large on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "3044022063dbfe29249a506b89fbd2cb1fafc254a9582dfc4b08d143b6d25bf2ab49d55e022044cad80c00460905e103f26da84cefd71af4bc7a71962a3bce321bc3b5842736",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046d499b077ab6d77b244320a2cacab91a764595dd67a7a8dfcf84da7d38b2d8f45994c07b833ff4909c1a92cc9f24dea88be8603b407b00d228faf2158db2354f",
+        "wx" : "6d499b077ab6d77b244320a2cacab91a764595dd67a7a8dfcf84da7d38b2d8f4",
+        "wy" : "5994c07b833ff4909c1a92cc9f24dea88be8603b407b00d228faf2158db2354f"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200046d499b077ab6d77b244320a2cacab91a764595dd67a7a8dfcf84da7d38b2d8f45994c07b833ff4909c1a92cc9f24dea88be8603b407b00d228faf2158db2354f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABG1Jmwd6ttd7JEMgosrKuRp2RZXd\nZ6eo38+E2n04stj0WZTAe4M/9JCcGpLMnyTeqIvoYDtAewDSKPryFY2yNU8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 367,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "30450221009d907cf88e10d60c3f23892498fe43ddb02f824fb18e6be313e02d94f2c8e09002200c16b9e0db4dc8606c023b001f69b3c886080794fc9d7fe31b00c1cf0935e421",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 368,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "304402207395ce0ef652848a86b61097cc9543998d39dae88a1fc9e4dfdd69642949548902207de29e256e8202382f91c116a667a8b946f210447a57369ba61ae4fae73dd136",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 369,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "304402207baf1fde87ccb1bea0f893b3bfb2549c04bca18835d8eb5a31b8d20506ff88c30220289ebe829fefb9ad009d7cdd622874aef5fa088f0508a4b43d5895d61645cecf",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0408c2f95ffedde1d55e3f2c9dcf5884347f6904c6492273ad760eb7b9b35f036b2bcf7a048caa2c726ae8808dc95312eb2350275a8f4fbeea7c0f32f3839c7b93",
+        "wx" : "08c2f95ffedde1d55e3f2c9dcf5884347f6904c6492273ad760eb7b9b35f036b",
+        "wy" : "2bcf7a048caa2c726ae8808dc95312eb2350275a8f4fbeea7c0f32f3839c7b93"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000408c2f95ffedde1d55e3f2c9dcf5884347f6904c6492273ad760eb7b9b35f036b2bcf7a048caa2c726ae8808dc95312eb2350275a8f4fbeea7c0f32f3839c7b93",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABAjC+V/+3eHVXj8snc9YhDR/aQTG\nSSJzrXYOt7mzXwNrK896BIyqLHJq6ICNyVMS6yNQJ1qPT77qfA8y84Oce5M=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 370,
+          "comment" : "x-coordinate of the public key is large on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "3044022033e37c3b66acabee3d68cbbb9c55cd52b586de51647723fa84e532a3ec5953ef02203b8a9ee707d1bc5f83e17ea072adc2ecda92e637d7c06060f1af79b929a850b3",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 371,
+          "comment" : "x-coordinate of the public key is large on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "304402201f8ebdc94ecddd84f90960cc55d0ca02e33d70535fc1c7322b3c2783b9dc92380220205aa8626c3a5da214e5485b11154a378d70b0d3323ab868528ae8048d17b696",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 372,
+          "comment" : "x-coordinate of the public key is large on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "304402206b0d70e09ba1642adac06dff9b52e22a3e4aab4180e372665691412241e743a002204d7d30ff8a210de69e3e6d1ecf7175f89f481a4d9ed06beaf7148da47f4af9e9",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdsa_brainpoolP320r1_sha384_test.json b/third_party/wycheproof/testvectors/ecdsa_brainpoolP320r1_sha384_test.json
new file mode 100644
index 0000000..4c324e4
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdsa_brainpoolP320r1_sha384_test.json
@@ -0,0 +1,4262 @@
+{
+  "algorithm" : "ECDSA",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "BER" : "This is a signature with correct values for (r, s) but using some alternative BER encoding instead of DER encoding. Implementations should not accept such signatures to limit signature malleability.",
+    "EdgeCase" : "Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA implementation does not check boundaries and computes s^(-1)==0.",
+    "MissingZero" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.",
+    "PointDuplication" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission."
+  },
+  "numberOfTests" : 376,
+  "header" : [],
+  "testGroups" : [
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040fcc8860cb26e262ca8b4ecb9c52f78d82a10a1d30dd0c8ecd7584ce80dbb75c488a062b643755001f27e676c26cd3488c1ef4ec3edd88cf8af78daf9036724b57e66da02cf7c676a53664becdfedc3b",
+        "wx" : "0fcc8860cb26e262ca8b4ecb9c52f78d82a10a1d30dd0c8ecd7584ce80dbb75c488a062b64375500",
+        "wy" : "1f27e676c26cd3488c1ef4ec3edd88cf8af78daf9036724b57e66da02cf7c676a53664becdfedc3b"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200040fcc8860cb26e262ca8b4ecb9c52f78d82a10a1d30dd0c8ecd7584ce80dbb75c488a062b643755001f27e676c26cd3488c1ef4ec3edd88cf8af78daf9036724b57e66da02cf7c676a53664becdfedc3b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABA/MiGDLJuJiyotOy5xS942CoQod\nMN0Mjs11hM6A27dcSIoGK2Q3VQAfJ+Z2wmzTSIwe9Ow+3YjPiveNr5A2cktX5m2g\nLPfGdqU2ZL7N/tw7\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "signature malleability",
+          "msg" : "313233343030",
+          "sig" : "305602290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e022900833d6661b0576d61a80ffe4d3271c43b2a56c14b3bd90305923ccdcf7b3d988c07ebb1c4cc67381c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "Legacy:ASN encoding of r misses leading 0",
+          "msg" : "313233343030",
+          "sig" : "3054022885b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingZero"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "valid",
+          "msg" : "313233343030",
+          "sig" : "305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30815502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 5,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30560281290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 6,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "305602290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0281285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 7,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3082005502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 8,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3057028200290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "305702290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e028200285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 10,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "305602290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "305402290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3055022a0085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "305502280085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02295020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02275020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3085010000005502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "305a028501000000290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "305a02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e028501000000285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "308901000000000000005502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "305e02890100000000000000290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "305e02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02890100000000000000285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30847fffffff02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "305902847fffffff0085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "305902290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02847fffffff5020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3084ffffffff02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "30590284ffffffff0085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "305902290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0284ffffffff5020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3085ffffffffff02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "305a0285ffffffffff0085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "305a02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0285ffffffffff5020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3088ffffffffffffffff02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "305d0288ffffffffffffffff0085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "305d02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0288ffffffffffffffff5020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30ff02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "305502ff0085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02ff5020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "308002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "305502800085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02805020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "305702290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "3057000002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "305702290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "305a498177305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30592500305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3057305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "305a222e49817702290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3059222d250002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "305d222b02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0004deadbeef02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "305a02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e222d49817702285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "305902290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e222c250002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "305d02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e222a02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "305daa00bb00cd00305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "305baa02aabb305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "305d2231aa00bb00cd0002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "305b222faa02aabb02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "305d02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e2230aa00bb00cd0002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "305b02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e222eaa02aabb02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3059228002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e000002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "305902290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e228002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3080315502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3059228003290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e000002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "305902290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e228003285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2e5502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2f5502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "315502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "325502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "ff5502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "30593001023054290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "305402290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "3054290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "308002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50000",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 79,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "308002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "308002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af505000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "308002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "308002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "308002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "3057300002290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "305702290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af53000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "3057305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "302b02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "307f02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af502285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "removing integer",
+          "msg" : "313233343030",
+          "sig" : "302a02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "302b0202285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "302c02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3057022b0085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e000002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "305702290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e022a5020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3057022b00000085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 95,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "305702290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e022a00005020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 96,
+          "comment" : "appending unused 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "305702290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e000002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "3057022b0085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e050002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "305702290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e022a5020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af50500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "302c028102285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "302d02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0281",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "302c050002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "302d02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "305500290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "305501290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "305503290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "305504290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3055ff290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e00285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e01285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e03285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e04285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6eff285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "302c020002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "302d02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "3059222d020100022885b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "305902290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e222c020150022720e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "305502290285b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285220e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34aee02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5a75",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "305402280085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3054022885b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "305402290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02275020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "305402290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e022720e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "3056022aff0085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "305602290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0229ff5020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "302d09018002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "302e02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e090180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "302d02010002285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "302e02290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e020100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "305502290159100378a2b190377dcb3bd531e20c378d106931fc183f707dc9d08576f8fb566185594220b8dd7f02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30540228b25375383538f0c7bb524b178dde4b6b99f0c9e68efa1a2a233972f599ec49835462ae8b972db75d02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30550229ff7a4e43a7940abf8063713c89a01fd42e6c7f6673ba76d332af7e5e42778d5d93250bfc19240cb59202285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "305402284dac8ac7cac70f3844adb4e87221b494660f36197105e5d5dcc68d0a6613b67cab9d517468d248a302285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30550229fea6effc875d4e6fc88234c42ace1df3c872ef96ce03e7c08f82362f7a890704a99e7aa6bddf47228102285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "305502290185b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e02285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "305402287a4e43a7940abf8063713c89a01fd42e6c7f6673ba76d332af7e5e42778d5d93250bfc19240cb59202285020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "305602290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e022901237f27debd21320e1a68f2707191fc90c8c8de0031452240c8538fc061cf19470536f8f1bd23ee06",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "305602290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0229ff7cc2999e4fa8929e57f001b2cd8e3bc4d5a93eb4c426fcfa6dc3323084c26773f8144e3b3398c7e4",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "305502290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0228afdf1f41799b1da9c6d385ee606fe3d530c6f1a58549f06264f49f078cb73fa2815a5c6987a1a50b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "305602290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0229fedc80d82142decdf1e5970d8f8e6e036f373721ffcebaddbf37ac703f9e30e6b8fac9070e42dc11fa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "305602290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e0229015020e0be8664e256392c7a119f901c2acf390e5a7ab60f9d9b0b60f87348c05d7ea5a396785e5af5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "305602290085b1bc586bf5407f9c8ec3765fe02bd19380998c45892ccd5081a1bd8872a26cdaf403e6dbf34a6e022900afdf1f41799b1da9c6d385ee606fe3d530c6f1a58549f06264f49f078cb73fa2815a5c6987a1a50b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e020100022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e020100022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e020100022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e020100022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e020100022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e020101022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e020101022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e020101022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e020101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e020101022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020101090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e0201ff022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e0201ff022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e0201ff022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e0201ff022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e0201ff022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30080201ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593110201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3030022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593100201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3030022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c593120201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3030022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e270201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3030022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e280201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59311",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59310",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e27",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3030022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e28090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "Edge case for Shamir multiplication",
+          "msg" : "3730373135",
+          "sig" : "3054022825166f47ac99c6bec3b038849ab4ead3b251f18afb0da1da5caa604a92a909c8561817684abffb9202283107ffd1aadce5b58a2a1b9517ccedda090433ac6344b027f36fc6b358ef4a8e436df3fd05521668",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "special case hash",
+          "msg" : "31373530353531383135",
+          "sig" : "30540228103c3ef2b43a8f57d01e2da67edfa003a0d342d7fbde0541332b0b24deea76afff4e2cd0572d73bb02280a0a680ebe3644c46b58d67ed8ee94f3aaee2839bc270d6b939bcb7657eeebbb6cccf2bc54af9781",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "special case hash",
+          "msg" : "3130333633303731",
+          "sig" : "30550229008c70216094feda4e721a72d8a91c51dd17392cf4c4481d7cd94be56da994e5baaa561085cecfe80d02281b19f7e89525601820bc17bd595a7dbdef76e5b352fcb16c3a8a1c332ff6a5308ff47a7e54e0b1cb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "special case hash",
+          "msg" : "32333632343231333231",
+          "sig" : "3055022900b4a4a035dbeaee126d09c7b15816b04bc717cb71bb5fe7649ac026269b7fe6d593fe1ff8fc5278a10228635516de531104e72176e89a845032b3096e3269e41431c1854fbc4337ba6fb5ea91defd33729d83",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "special case hash",
+          "msg" : "34353838303134363536",
+          "sig" : "305402282a3103cdaad1dd28ecf897491051dd0a9c9da9483753c93490b4a05f1c42e1642925a3a0154d40620228672903243b6858a5e09148e403461f31c1ff0e126c365942e0680d314c1a7a7c57e2f0528c8cabbf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "special case hash",
+          "msg" : "32313436363035363432",
+          "sig" : "3056022900b880b6be2a1295af3840a5f374fe77cde1ffdd6df3bb86097d5ce14852f73a1925fa6d192a27b74c022900c2cb211303aea030a5b92be98fc36770822f8195ad73eee5a9bb87c5717ba4345cb60b099e4d4deb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "special case hash",
+          "msg" : "333335333030383230",
+          "sig" : "30540228677f84a0653725b94e4eeddbe0b70aefdf594f5ef9e484b4060567a8365c43a783d81548d1f2740802284cb24e15375bdae0b44b336fc7e6c11856d4c6f9dd7e83148dc387c4a8869b11538b7ee94f053f4f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "special case hash",
+          "msg" : "36333936363033363331",
+          "sig" : "30550229009d5d984c7544ef737a1001d67f9dbbed521b46f74bc468c03881c2ab5944635af5465c3fa01cf51e02280c706dcfe11a4e30d623870fb0f2b979d0fd9daa970d86f64bb48f49aa484d924e9b93bcaf406924",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "special case hash",
+          "msg" : "33333931363630373935",
+          "sig" : "30540228448464becc13522c90708aa5204930e676fedfbaefe8fe02509a4fe822cc88fd6d92a958438ded7c02285de659e080a61c50b5b7489f4677ec4c6931faaf171f2a69756e2f2d1214235bdb1ea3d2a4a75359",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "special case hash",
+          "msg" : "31343436393735393634",
+          "sig" : "3054022859c0c95941e1a52390e00c2d7796c685dcc4d73d6d6967590aa1767c972e199de3c6dbfca77dcac80228507f27ab5ac05ad23cb25fc48ffc766dcb6dc0cd25606505a2d270066c3a74842768b54af2c84751",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "special case hash",
+          "msg" : "35313539343738363431",
+          "sig" : "3054022859902d7763e7f1875a4252d133eb6114cfc1972b683adfd767a71ca80c3f78057cea759ea195d31e0228397deaf96e2903a207f68e5330c9f2c6276a45d0fdba961a04c275fa203678176201ed370999a32d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "special case hash",
+          "msg" : "35323431373932333331",
+          "sig" : "3055022900d142217584e852a499efa734a10a436a397ba7e068ad70f3eefc4d6731e76a481b260eac1d2147f0022817c8482639df8d20fcb835bfe0f3ecd27317eb8315c69b656ebf137dde6582f3409d7c44a8b6e085",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "special case hash",
+          "msg" : "31313437323930323034",
+          "sig" : "30560229008a55fa49224592f7e403a4b3e647bf382a26499b37ec2cff51a2be2a1357807fe875359ec8654f87022900b9506e74af8f552d4abb2c472b8508ce24814e20b27d192e24d36d5ac751922b0c807bf97a7b1ad7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "special case hash",
+          "msg" : "3130383738373235363435",
+          "sig" : "3055022868ad2da643d66fc5d27b63d7222f835d09fe0b328fc4da4684b86d9c12b3992626f610e3395e4ed00229009662f74d52712a2af54f601c4488934fe2826d50e1ee868022437c9b620c93d43fc750f03312897c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "special case hash",
+          "msg" : "37333433333036353633",
+          "sig" : "30550228578bdd50de9986fad341a954e51126ff0cb540026abb3d42b3c208e4ad187f7ba2d99b3efe495c92022900b95afd2d12cdee68c3572a5fe126334ed0ed7ba82d3097eaa6d9d737c09b830b6cd3e878f470e7e0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 231,
+          "comment" : "special case hash",
+          "msg" : "393734343630393738",
+          "sig" : "30550229009d612663497c484084d3d15d8e799e1fe38b7b5922955fc5a7fea4ecfc41954ca707525c1e0dc010022859e80cf69be6876b95357ded13ca61a494fac7355ac2e80a89be0219552d916852632617c0946bc2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 232,
+          "comment" : "special case hash",
+          "msg" : "33323237303836383339",
+          "sig" : "3056022900b4c00f589dbb51ea68270f4b02eff48a4b123c0167bbd24daf2a837903e734339b8a2542041f87aa02290094c32634baea4452c054295d7aebe23be7e80abbf53789651674182263ee5c2902fbfb3df7da7425",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 233,
+          "comment" : "special case hash",
+          "msg" : "323332393736343130",
+          "sig" : "3056022900b9201e49950ce0d1df644356405f0a785a8b8470f83e78a6f35e6234daa92a7685877a59d8c91a970229008bee9077443eedde34a2fc2c266f188e844eab2904c84204c816ba3cb1c4b9b253d4a78ce4e81114",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 234,
+          "comment" : "special case hash",
+          "msg" : "3934303437333831",
+          "sig" : "305402280d42a1899f73ac70c9192558b478db8803c68337d415faebab76858c32a37e399f1727fd599a18170228363f1346c0227ec54da1659165ee7b07e06610d36b1ce6226f608bf6cef2144248de37562be8537a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 235,
+          "comment" : "special case hash",
+          "msg" : "33323230353639313233",
+          "sig" : "3056022900c5d65effab2ec3e4435c258121c493e24ae92005ac80136f21f2f42946fc3745841dbc2a3eb9969502290085fec2a9080a1ece18896970c9a2e1b32240eaf187d65f6f9e91d27111c4033d471eda67eb8986ed",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 236,
+          "comment" : "special case hash",
+          "msg" : "343134303533393934",
+          "sig" : "3055022900a240adea61f748998df2cde95be9d7df30f454bde5b907ec7de6dcdb121bea41bd42c4392476c4f902283ef991d642bd0265b4a7b521b20a42fb2c687ca2f0694b239a113a83575b5727dcb632482a572649",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 237,
+          "comment" : "special case hash",
+          "msg" : "31393531353638363439",
+          "sig" : "3055022900cad52bdb35af7ee0e8f687c81f2edd8efc2d6ee317f3c6a82121048ef7a3ff3b69187aaea53f4926022858f84e186616544af494900241d2b802df2eae3e3f1410865e4cd16e221f277e7b5093ff186e4d76",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 238,
+          "comment" : "special case hash",
+          "msg" : "35393539303731363335",
+          "sig" : "305602290093013ff84151a04ea146a36d2a3b9f497ba5d9323019b730be322bc519e2701e3f0ec1b6c8015e8f022900872669f33b9b4b93384d9ac3f7c3092560b9af7e6738221e3b289421813601fe569b2c49afec8bb4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 239,
+          "comment" : "special case hash",
+          "msg" : "323135333436393533",
+          "sig" : "3055022826228cdd2c08fbf8dd4ad5d2f80ed15129868e892d33cd892503207e91114c868d0064c60f1bb612022900afdedc05f0b27e9363c34d9bd1bc64ec0142fcd9f40f3584605bbccf12b0e279e4b3e3d0927a4852",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 240,
+          "comment" : "special case hash",
+          "msg" : "34383037313039383330",
+          "sig" : "30540228731d597c3694a4932f0f14fc3132d2ba9f5b7d833ae91cbe9a450352f4240d5bb712f65b0eea041202281b8a6fc9bc1ecf8c09b1ba27c4c8dcebaf1e669a89036b34fa8ff57280e5741959e6c05e05880a37",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 241,
+          "comment" : "special case hash",
+          "msg" : "343932393339363930",
+          "sig" : "3056022900d2ab69ae6110bb67ed99ffbdad8036dfabc46de8ae1fc7e799986b91ba7d454672ebe4896cf72011022900d29d67bf2b882770d46dbd06a6fbaad583c2ceedcbd772200b7532e354f86eaf9a9418191eafc5b8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 242,
+          "comment" : "special case hash",
+          "msg" : "32313132333535393630",
+          "sig" : "305602290081da10c5fef4bfb58b4a73b4cf3fd4f0f028b448b3463dabe0d6f1e101af570fa64116731ea5b9c2022900ceac01ebad706ef43c80caa1d8962c655bfd810396b94d2bbea299bd5cbcced75562b0fab446ff85",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 243,
+          "comment" : "special case hash",
+          "msg" : "31323339323735373034",
+          "sig" : "3055022838358ba2c46f61f39bef22873a5bf26464f2b05e4874bbb62a2323385f8e87a5b118a0079078b44d02290093f84f06290f48161922552577482a973404f47c84c6e1a94643c3832fb2912fc4b38529e2f13e9a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 244,
+          "comment" : "special case hash",
+          "msg" : "32303831313838373638",
+          "sig" : "3055022900afd1fba700fc703fb772f701597adddcce4ff9f530c830dc8c8cbd4b3070f4a22b80516b0b820970022876c2e890860c36bbb5f6a1053401f1b51aa83cdfd96a3c15e1a183fdf8357e49d2984e4fcf19c25d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 245,
+          "comment" : "special case hash",
+          "msg" : "343534363038393633",
+          "sig" : "30550229008c90d4c8bf021906d3d577bd16b3e139bbc35d7692a828f0ef5cdf9d51a8442265f815849fe793b802280bfe16492abb58a1d8064767546d29aaf6138c5842c7f7002fbac34b78b324b84426510c1b7b0d89",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 246,
+          "comment" : "special case hash",
+          "msg" : "31333837363837313131",
+          "sig" : "305402286d07da92bd405912b22a993ed30e06149c78743fa195fcd3baf05803fddd5a6408201e68faee622a02285ad3c8b4c1c68080279f20ba15548343fca9ec52fe23bdf59619738dd1bd418414ac53ad7ce16c2b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 247,
+          "comment" : "special case hash",
+          "msg" : "32303331333831383735",
+          "sig" : "3055022900be43df617f79ef83404e7c7393ed3c38c815d06e3c0debf9ba37f36c419a6c3ea690822f88011ff102282f0ad4ee5fe7ad128f58a520a4fbad3f0a502a4a4412639b3dbc206edfb2a03d564010d78d2228b9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 248,
+          "comment" : "special case hash",
+          "msg" : "323535333538333333",
+          "sig" : "3055022900844ca29340112d0eb9dd15f62655a0cfa993415e570511a3f7273623b82d892d136c6e8bc57db84e022871114ae579d053b5cb3d77d2e9faf1c06cc263ab8fd845a0378f4a75da86ddc23ab4d07946832a77",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 249,
+          "comment" : "special case hash",
+          "msg" : "34363138383431343732",
+          "sig" : "3056022900cda8531222502a62368fddc724798870038333b9fa77141d4bc5ef758f7e973e5ab8b4cfae90eaa10229009ead50a2533287abe5504efd8db57f8b96a7fe039cc95d1690ea0c1e2c9df5fc29cddd7b01edb99b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 250,
+          "comment" : "special case hash",
+          "msg" : "31303039323435383534",
+          "sig" : "305502285c2c6a661338df365af8ba1080b994e59989f002fa4fff42fc8994ca6395620152f3971300aff6f90229008681ea1793bd3e069426127a6b665725ddba4a8f1945851743477a1cbdc7356713ae70fc138531a3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 251,
+          "comment" : "special case hash",
+          "msg" : "32373536343636353238",
+          "sig" : "305402280e061b48b5f7836e0caf73c9770c3fee1f67ec18ded9e1d339ab56d05b9adde369504fedff1d66810228009dbc4ad8edc1896fa041ca60ac64b7fa148e3f02b0f697ae22d923f526fd4936e5f584b23ddbc3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 252,
+          "comment" : "special case hash",
+          "msg" : "313139363937313032",
+          "sig" : "3055022900a8462605c79437c068523d93d2e1529ccae1b5248e8f9a90f2ef08d9d5e5025b3639f82b70f1e7ed022867aa5fe4e79e7c54a8ce389b90e1ce1556aa689b44814a6cb5c2f0fe4569c5cfcee34cbb4a086219",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 253,
+          "comment" : "special case hash",
+          "msg" : "323333313432313732",
+          "sig" : "305502290093b01029421ca30d8abbd06f134ee9dcbe81790d012722ae65214f0aaa34bba642f43949d5ec51a50228110e4fce36e0c2acd898122fba756e711ad082087c36b125084f67b22e37a02bd68628cdb164ece0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 254,
+          "comment" : "special case hash",
+          "msg" : "31363733343831383938",
+          "sig" : "305502286b6d893c3055da5d5a2ff6ce038a1bec59b04950bfd8012648d6063186ff861d7aa91a5185aa3c0c022900a602ed34ee41e4811251a51bd67010f8eb3355b8691dad66035e723d971346f57c8a0f479fef666c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 255,
+          "comment" : "special case hash",
+          "msg" : "31343630313539383237",
+          "sig" : "305402286fc42cf23aa42c36675ff126412c757dde74ef73cadb0425e23cb76230a58b3d002370b4166bfd2902284e61b9b10a13fe0dd2758733f6b178af98e0079867837d55f8e5e90b577de90ce0d8dc345ed16b38",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 256,
+          "comment" : "special case hash",
+          "msg" : "38393930383539393239",
+          "sig" : "3055022900b529a563a2f4065d333c812b0b6134de9735bb269fea763f01cf7d1c6a0ec70d7223c7e6c1b040e80228347fcb8f3971b3d968ba709b1bd4d31b550cceed232268ca0df1e00502a56aa42dde7330bd919d5f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 257,
+          "comment" : "special case hash",
+          "msg" : "34333236343430393831",
+          "sig" : "3055022900b91b2a73449560522112fa4fd1b57b8c24754791af247a8c9de423e0bd536289a4fe850f7e3c43ae02282eb3f874f2e5ec56356bf6baf10b64b7c54b13447ccca1ffc66a1fc89dc8e977801748f8f0ce5a4b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 258,
+          "comment" : "special case hash",
+          "msg" : "32333736343337353537",
+          "sig" : "30550228314338683f23b1110d1840732f672254f38079bf11eeafff1ec2e53a5373f74c98887b11ebb78c86022900b7e3a6b459dd10cfb5df6d2ea7afb15efeb1e5e917e5aa44fa54743689d7daf163f998e05719127a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 259,
+          "comment" : "special case hash",
+          "msg" : "383630333937373230",
+          "sig" : "3054022822d1881a94e1e11cf10620f37d708ebed847f1459129a0d42cb457da8051f81a0f9da846281a68f70228404652ebd261f5f6b185de4a16980dc3662fc4573e245577e7ef6e3cbfdd47bc1e487ba206ccf760",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 260,
+          "comment" : "special case hash",
+          "msg" : "35383037373733393837",
+          "sig" : "3055022900863970caec6c6ff0a1c70f60859576e3583e6b529de3f928136e848c56b6c6715045fdfe526377470228667f525a88be891ec6b9f96d1a68c4f06b3b3d2ad1c15f063d110ec9fb60ae7463dd568a69ce452c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 261,
+          "comment" : "special case hash",
+          "msg" : "353731383636383537",
+          "sig" : "3054022869cf0600384ceb832e237b6b453dea81a3c19cb8fae48ba186d28e3b118464b27af9100f181b738a02282780269a8fa40790ed726372ee0956265e72896d9e84f713f883a3bc0548e8d3a2b357333dda4c0c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 262,
+          "comment" : "special case hash",
+          "msg" : "38363737333039333632",
+          "sig" : "3054022830f38139883f71c0c64d63adcb731f1c385df87db7ce7326bf50410acc50f0babf5017f92a1e1a6e0228597734222482724643f60e48b3b589deaa37b86e1de1cf0b129b286ec67686574f16cfb5f2cc6f45",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 263,
+          "comment" : "special case hash",
+          "msg" : "32343735353135303630",
+          "sig" : "30540228174ae98cc25dbed747cedf8697266d16e96bb4f8071c905990f4e72c728c94aaa32dce24a52166fb0228578099835a3dcb3da2fd42750180079da407c7a142cbccb699fed7af89dd703ba0cad94cdf2c051c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 264,
+          "comment" : "special case hash",
+          "msg" : "393733313736383734",
+          "sig" : "3054022858cfb1511a223c06b3e974b660bed827bee38c59c4523068e9c9faa330c970e6271ea387db6b40b00228763594ced6e8413bfd90d5ceca18d6774a3da87473cc4dee726b0325e2df8b257d9e01318ae7e022",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 265,
+          "comment" : "special case hash",
+          "msg" : "33363938303935313438",
+          "sig" : "30560229008ddba4f7aa8cc5e00a3ffd2a082710d42d3a88f9f947ba51f09466c2a9295caa131b8ae9ef51b35c022900bc3410033a5798d9e4c6a817da1759c00c0d38e3c1ff22f0a41e5ad0d1e914e71c907da8c245ca2c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 266,
+          "comment" : "special case hash",
+          "msg" : "3130373530323638353736",
+          "sig" : "305502282f7e50ee96706d597d8bf0103fa46786746a2c65c021fac7fa378d244c418a42b7908f0fab2dffca022900b7b94f2a883ba1b49858329cc78fc2a992109809b470b878cc38e1bdd4df3ee00a0ae7e228e466bc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 267,
+          "comment" : "special case hash",
+          "msg" : "383639313439353538",
+          "sig" : "305402284591491eee04e10a40a1e8eb82148195123348ec1a7cba06044e8f226ed30910b693ebbbaee0685f02281b8b3733cc5ca15dad84809df8499788b4899cba307f93b49ea6a63b9e77487c3c98b803fce69cb9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 268,
+          "comment" : "special case hash",
+          "msg" : "32313734363535343335",
+          "sig" : "30550229009d22b864e2706fa43a67ea62f39e4d3f402767d9d038c78e2844d699f41eaf1a641cfdd9d6a63fb502281eaacdad8294ecc2ca0c55e6e73df03d832beafe048fc690895beca5cead9d01d37b3fed5741cb94",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 269,
+          "comment" : "special case hash",
+          "msg" : "363434353530373932",
+          "sig" : "30550229008f1502143eff372fb9bdd956ece35d232403fed7f77eb4f4552d4fc84e4a2e5d6c8ccf06f5a6ad6102284621c9fbc37466f7c757f66d171da8ee0a0dd5f24113e2f517a082b7ab5d4123c3eec9eeadf69952",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 270,
+          "comment" : "special case hash",
+          "msg" : "353332383138333338",
+          "sig" : "30560229008dcdcc74a25fcd92e4372e11364a361c7a2d7f3dd74c5d6bc3761c07fe78f084765de8ce70e448fa022900b3cfdb35c20b1e30d3c216dcef3c73cd44ef1973c8695c8ab439f7e26628574e0f349d81c598d1e6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 271,
+          "comment" : "special case hash",
+          "msg" : "31313932303736333832",
+          "sig" : "3055022900bc2a5b098f724830a190480fff5fafa0f2fe85bf17176af8d4eb670e1d55533f820d690e76b3bccd0228516c576444be0250e33823302adb708b6622f17e2438f01800c58edcf907e505b419f6c0dff11afc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 272,
+          "comment" : "special case hash",
+          "msg" : "31353332383432323230",
+          "sig" : "3055022900b3208e3c49a8ce5fb89effb2480e8ca6b9e11b16a049aecf0ce35450e1e53509909b02ab33e663e20228362affc091fa46d71ae84e27979ab575c60f115845fc521e0a81591ab233bd32e6ab0e8b08809801",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 273,
+          "comment" : "special case hash",
+          "msg" : "313536373137373339",
+          "sig" : "305502290091cd133d74c701c936758054753591d31f1d854213b4067e033880116d4653cf257015445c5563ea022843185b31dbee46dbb62d1cdaadf479aa4f4b0b32dbc49ef5ccad43c9f0fcd94f06bdf6315e67c785",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 274,
+          "comment" : "special case hash",
+          "msg" : "34333033303931313230",
+          "sig" : "3056022900c63ac9ada6e0a00dbdc171f4ced1c16294881cd7b8cc91e67d0f97f5a61909ac6a694ab0b0d37a6c022900b33d6876f4464e7ad8e27a195f63b49fad3be8f4684f4c3d42f58913944abc60173e5113581d94b7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 275,
+          "comment" : "special case hash",
+          "msg" : "37373335393135353831",
+          "sig" : "30550228489db46f6ab87624a332376735aaf8e6c4c43affdb9b93c78682d3f90c1e01caadbcac4c975a22130229008e10c64116c4042b71bd9872c0506a7b34b6fffa9c3e24f843ce18270e3f163659ddc4a2460a4382",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 276,
+          "comment" : "special case hash",
+          "msg" : "323433393636373430",
+          "sig" : "3054022809f7e103550337e36ea09f9ab3b83580ddc6259fb9daf38b424175d64134d14cae3112bddd7b21af0228253719f8ce1161959841b06ae31dc9d84cf0df90dffc101f0442c8e98c040e4d53f8ecd709b62049",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 277,
+          "comment" : "special case hash",
+          "msg" : "34333237363032383233",
+          "sig" : "3054022841310739de7f1e06169f375d73e06550a50850be6aef432ef2143d7addfaf218f68836375921006e022843c4594e625f7aaa757eea847451d0155bd6b820883306b921184ec8141ca2b8c23b1dd64b980f97",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 278,
+          "comment" : "special case hash",
+          "msg" : "32393332303032353932",
+          "sig" : "3055022900cf0672d18f93bd9c8c1c5e17d90a918c5cc8fdb967f9d2ad727dd72ec992116741b175d35393885d0228029e747ea2c1d66f1b4c5be492bd3b0ce01e8420a626a8a8e125c3b58c614cab12e6edbfc13f8a4f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 279,
+          "comment" : "special case hash",
+          "msg" : "36343039383737323834",
+          "sig" : "305402282a247a37c489974ed8946e5e8bd5a9d298d7afcc416b5efc3a9c69ba61d6538ad5294775d1c2a479022848f5716ab8b409f284351051dcd222cc5ec4f1b8c71708b1e85ed4db1ecec73888bd8f78c1e74d05",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 280,
+          "comment" : "special case hash",
+          "msg" : "36303735363930343132",
+          "sig" : "305402287a2d71ce074eaaa4dff6d104fb6e7b070cb09c235deb697f5334918e181ce9bbe547b79ab37969f102286dc14d2bfa01e0cb36878d1aef216df992b5c3f058fab8ce922249b59cb72556364138389561af5a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 281,
+          "comment" : "special case hash",
+          "msg" : "32333231363233313335",
+          "sig" : "3055022900851f1d1483719cd183940cf4e9eb30eadde699d8ba8090e216123ff61e41d166505a591a75dac6ce0228292a45f31ef34bf34c3ccfd4a22adc4cc19c416151f70e95ad19999f9c59685e5fd9079a27b86fce",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 282,
+          "comment" : "special case hash",
+          "msg" : "36343130313532313731",
+          "sig" : "30540228061df326b43ad7aa7bc4af8f3a5830bb0e63297cf690ec60a7259a942dce631e6676742ad12830cf02280e88675228b7fa4743ab53d24865193742cd6c5db218dde0044b301654bbab639abc775aae69064d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 283,
+          "comment" : "special case hash",
+          "msg" : "383337323835373438",
+          "sig" : "30550228560e6e5414414dbbd6e9d40522c9f3fce665c4455eae07eafa3724d708689315f6c7515cfe1aedbf022900a3e619bf5f9d776a591ff74a9252e43bd04ae1f1c34fe5b84f04c3d9c972a80e187888bade5aa9d4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 284,
+          "comment" : "special case hash",
+          "msg" : "33333234373034353235",
+          "sig" : "3055022834f9def6f21f5328d1c5e349857f3a7008f0afa5bbcb896ff6247b21a4abac7aedada64fa23f956e022900cb44dbc53b0b0b43d6b158d90247209c2c74152c4e19a1c703577cf407ada14b198bde1ba79a344b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 285,
+          "comment" : "special case hash",
+          "msg" : "31343033393636383732",
+          "sig" : "30550229009721d7991f2968c23856a075e86b70a39f4aa30fd68777dbbf46c1d37cc3be4497cb4714b2f1656a02280aa34e858175fef3c0734c5c7c4ccd0459927b0f722e86af6c4045752b4ba154e725946319dc4274",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 286,
+          "comment" : "special case hash",
+          "msg" : "31323237363035313238",
+          "sig" : "3056022900aec92108751afc4a0c62a9da2163bb52bdabb9e7a8b566ca8d30fac389c68a3817d21a33df2f68da022900befbacfb03957c9378903cf9b432093f78954e5224303611e9e96c92a76704e3a6432a24413bd277",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 287,
+          "comment" : "special case hash",
+          "msg" : "34393531343838333632",
+          "sig" : "305402286e852689b90451a1592fad585ea57c71eb5b446196c07dcf450972ad13fdcd8117319eec75d0781f02283608d11f0b8eb773b35878cc43ea95fb4d354ab0ffec9f785a41a17ebcf8f7d957f793479ae89999",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 288,
+          "comment" : "special case hash",
+          "msg" : "32343532313237303139",
+          "sig" : "3055022900a34ebb41336c252a056097983d56dedd1eda042c7378b8b56d905aa9be1d7f6afb605466c0026c440228414c12e2a97f8e427ee9bd95e15bd5c10c16c1eea6011f01f271fe75869a6000fbfbc25a6d1f8541",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 289,
+          "comment" : "special case hash",
+          "msg" : "31373331353530373036",
+          "sig" : "305502281cf27fa96f137e0fbce4da476bdb5c3b875b7fb455fcfe7efd863cb8ed61090f6cf6a2b927fabbdb022900945bc7e4f319004b2ef4ce2fa2ef270c4abc360e21d8f8b21074080ee8a3422137c96f82e26cfa3c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 290,
+          "comment" : "special case hash",
+          "msg" : "31363637303639383738",
+          "sig" : "3055022900cdb4f0b7f7de92ec59a2e0a1900318bdd649155bcd3e0914136a7c46c5e4bfd84231c04d64cc5c5302287b0ee0d7b7773c3bcd5921239f36b093bd232859d685920eaff53a91ff7188344a3075fe7f342c7c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 291,
+          "comment" : "special case hash",
+          "msg" : "343431353437363137",
+          "sig" : "3055022900aa8ef33f59508ea9617a41084a3532e1179d0f5755e08277a568192272cec63f910377a871021c7e0228708751c6284f7c3cfc57a598c1199c1cfcb3d26e4546484de55228c292bca978ea7698d3f7d806c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 292,
+          "comment" : "special case hash",
+          "msg" : "343233393434393938",
+          "sig" : "305402287d57fe006a0563d5570acbcabdf94ed515029f52e02298c79c9891181bd8b4974dde5765433d89cb02283be83d7dc7a5dc1a151f2b0957f678b9efca3d0818ec359202d9a4cfe792e95924be9e36e20ef970",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 293,
+          "comment" : "special case hash",
+          "msg" : "34383037363230373132",
+          "sig" : "3056022900998c251f0c1f9623980c1cff0e369c7b0a383fc74079113121f982bfe7b87f17b48e5cdd29b0e1c0022900d0d33d8be8c37fb49c4f49ceee321186ff30b9950a706c6fddd1054772af3c3266fb286677592d69",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 294,
+          "comment" : "special case hash",
+          "msg" : "32313634363636323839",
+          "sig" : "305402282e2384e2621b0f248ad34922f721f434527d354a7ef876defb8e80f6864867ae60c76ce24896a40f022808ecea054800ec201f0d1ac893f3bd79ae48533529345e1d3310fdc747d765970fa55ee0a47bdcd1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 295,
+          "comment" : "special case hash",
+          "msg" : "31393432383533383635",
+          "sig" : "3055022900d290cf0f9fbd691743b9dcdc00c0816fb99b5ad3b89a23f1313e0bf00cb3e12c95648dce175e34470228587707db7e9ddf613ff7d979ba9ca411b4bb7826862a380ce7cebecd52f52ff885f8ad536fbf1123",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 296,
+          "comment" : "special case hash",
+          "msg" : "32323139333833353231",
+          "sig" : "3054022834b252604ebd8675104266be4df84b51942687a212957dedd4ab6dff4355a0027b7122aeb1e9f449022815082c5764df742c40193a8bf1e38d43a5fa4c77416cd8753057521c765062c676f99be659fcd00e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 297,
+          "comment" : "special case hash",
+          "msg" : "393236393333343139",
+          "sig" : "3055022900b45baf5ee188cef5413ef3e6f0d917a90cf263d2be0a7039a6064e6e4053b6c960f44de15932855a022847602defee00b2fdea095346deae00b46069c95c09e43594889b8d3aa3d75350377aa3431ef63c76",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 298,
+          "comment" : "special case hash",
+          "msg" : "373639333836333634",
+          "sig" : "305502286d8267065d60dcd375ce041813d6085fa90246cddbbaba12643c736cc9b7e6d619178f12c6fd2d3a0229009b72611a5b4f8763e30c11aa791eff6b74c34d05e65451736e2a2b728f2e5ef485dc4e2e5c3daa37",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 299,
+          "comment" : "special case hash",
+          "msg" : "32373335393330353733",
+          "sig" : "3055022900a1a302aa27a32cd25c336c9ed7adaf5caf33dc3485a813718fce395ec0c93eef4cb34a6518a61cc80228258acd1b450082fddc05433e2dd66b0321114395a33bd9827d4c44d486c82c2d229869f3762012fe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 300,
+          "comment" : "special case hash",
+          "msg" : "38333030353634303635",
+          "sig" : "3054022863fad28570b4203502a1d105903244dfe2b09530a93d8ea429a197c7121337a99d4c73516ec6613502287b4a08b7cdeaf6eedeec6306a0c410b092718c25590190030c5255bf837393d8293890c84909f436",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 301,
+          "comment" : "special case hash",
+          "msg" : "34333037363535373338",
+          "sig" : "3056022900c1e6232f06a44de1d7213b20eaa1b89c31dd2f5bb033245e8171524cc9110876d778a04834ac88ee022900cb4aa20d158c3b8d115ec62bb51545bd58b63f1f0176ada04869dfee84019737cb8072f7a8b940f6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 302,
+          "comment" : "special case hash",
+          "msg" : "39363537303138313735",
+          "sig" : "3055022847b6baa1a053eab8b38ed6c9862f2ffed3811449e49ff2e18a588512129d1dea0a6c4fb811dc5eb0022900a6cceef5a1e12f9b049f72f53732d42903a733ca6f3fae9596e17d9c757ed4ef04fcc37302ad1f45",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b21ecd48cc46fb306ed54e88adb615208457bd257e7e9d81db5bd1f56100a7aebb1386465507bbf386224cb383815e1babe561dcb6f49af0073e1bfda366066ef62440fc81dec7eca021cb0c05091dfb",
+        "wx" : "0b21ecd48cc46fb306ed54e88adb615208457bd257e7e9d81db5bd1f56100a7aebb1386465507bbf3",
+        "wy" : "086224cb383815e1babe561dcb6f49af0073e1bfda366066ef62440fc81dec7eca021cb0c05091dfb"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004b21ecd48cc46fb306ed54e88adb615208457bd257e7e9d81db5bd1f56100a7aebb1386465507bbf386224cb383815e1babe561dcb6f49af0073e1bfda366066ef62440fc81dec7eca021cb0c05091dfb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABLIezUjMRvswbtVOiK22FSCEV70l\nfn6dgdtb0fVhAKeuuxOGRlUHu/OGIkyzg4FeG6vlYdy29JrwBz4b/aNmBm72JED8\ngd7H7KAhywwFCR37\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 303,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "313233343030",
+          "sig" : "30420215014064fb4c224a8b248a0d933f7642bd56aced9b12022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 304,
+          "comment" : "r too large",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e23022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930e",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049c9701de2ffdb296e6d56a5f3c189ecbb0e4448e38ed65da46eeaa51a7b34e650a91da95faf179001e0a98a598523a34c4918d4180f87d641e4626ce11fa3a244abfb2450736693d38652309240ebda9",
+        "wx" : "09c9701de2ffdb296e6d56a5f3c189ecbb0e4448e38ed65da46eeaa51a7b34e650a91da95faf17900",
+        "wy" : "1e0a98a598523a34c4918d4180f87d641e4626ce11fa3a244abfb2450736693d38652309240ebda9"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200049c9701de2ffdb296e6d56a5f3c189ecbb0e4448e38ed65da46eeaa51a7b34e650a91da95faf179001e0a98a598523a34c4918d4180f87d641e4626ce11fa3a244abfb2450736693d38652309240ebda9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABJyXAd4v/bKW5tVqXzwYnsuw5ESO\nOO1l2kbuqlGns05lCpHalfrxeQAeCpilmFI6NMSRjUGA+H1kHkYmzhH6OiRKv7JF\nBzZpPThlIwkkDr2p\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 305,
+          "comment" : "r,s are large",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930f022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b6f0ddc834ef8a67903681ea02b788fcff82d12307c8c3f4a44b30d7c5f614dafcc9a839991f8ee427538e30ae5102b2043957dd6124fba3a1b601c04bddaf6c929ffdf2f7796fd7098c387dbc0b26fb",
+        "wx" : "0b6f0ddc834ef8a67903681ea02b788fcff82d12307c8c3f4a44b30d7c5f614dafcc9a839991f8ee4",
+        "wy" : "27538e30ae5102b2043957dd6124fba3a1b601c04bddaf6c929ffdf2f7796fd7098c387dbc0b26fb"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004b6f0ddc834ef8a67903681ea02b788fcff82d12307c8c3f4a44b30d7c5f614dafcc9a839991f8ee427538e30ae5102b2043957dd6124fba3a1b601c04bddaf6c929ffdf2f7796fd7098c387dbc0b26fb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABLbw3cg074pnkDaB6gK3iPz/gtEj\nB8jD9KRLMNfF9hTa/MmoOZkfjuQnU44wrlECsgQ5V91hJPujobYBwEvdr2ySn/3y\n93lv1wmMOH28Cyb7\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 306,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "305502287fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0229008c0736554dbc446063e8e15f297fd4b66fa8879945bbb5c22714a9645f4fa4ef9d710eafa6b226d8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046df44321d4a5f6af63e01b79bb608ea04ac6f35f795044a04ff400f547fd34d9b78c12c45978f96fb52901cece48aab432c3dbdcbc0e270b2cc9b9915cc1ffb69a365d84c39186c48177387aa9ee0a48",
+        "wx" : "6df44321d4a5f6af63e01b79bb608ea04ac6f35f795044a04ff400f547fd34d9b78c12c45978f96f",
+        "wy" : "0b52901cece48aab432c3dbdcbc0e270b2cc9b9915cc1ffb69a365d84c39186c48177387aa9ee0a48"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200046df44321d4a5f6af63e01b79bb608ea04ac6f35f795044a04ff400f547fd34d9b78c12c45978f96fb52901cece48aab432c3dbdcbc0e270b2cc9b9915cc1ffb69a365d84c39186c48177387aa9ee0a48",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABG30QyHUpfavY+AbebtgjqBKxvNf\neVBEoE/0APVH/TTZt4wSxFl4+W+1KQHOzkiqtDLD29y8DicLLMm5kVzB/7aaNl2E\nw5GGxIF3OHqp7gpI\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 307,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "305402287fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02285407cdd593acb501fc2848351f9d2e6b5457d3de43c3130e3b74e6a9242b3cce1c24f094f118bcd6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044e496f056ab5d07f96562c683643440e31fea26d35e6c5b69eefaa4107d345c807bf279f2ea26b60288539766fc726cb9e841db5dcfbbb792cade3c1ef64b69dcbda7f5e497b455a911ce2f0ebcacaad",
+        "wx" : "4e496f056ab5d07f96562c683643440e31fea26d35e6c5b69eefaa4107d345c807bf279f2ea26b60",
+        "wy" : "288539766fc726cb9e841db5dcfbbb792cade3c1ef64b69dcbda7f5e497b455a911ce2f0ebcacaad"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200044e496f056ab5d07f96562c683643440e31fea26d35e6c5b69eefaa4107d345c807bf279f2ea26b60288539766fc726cb9e841db5dcfbbb792cade3c1ef64b69dcbda7f5e497b455a911ce2f0ebcacaad",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABE5JbwVqtdB/llYsaDZDRA4x/qJt\nNebFtp7vqkEH00XIB78nny6ia2AohTl2b8cmy56EHbXc+7t5LK3jwe9ktp3L2n9e\nSXtFWpEc4vDrysqt\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 308,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0411e094f470948e4eaa6aa13fab4e063386e91a638fa226d988d0693dea719ca95f61e493e9835af43f533e89aa2085a9f8121086a2597f1060f73c8d75d66940e50eead73dfd03c476ea1947cdd4dd3f",
+        "wx" : "11e094f470948e4eaa6aa13fab4e063386e91a638fa226d988d0693dea719ca95f61e493e9835af4",
+        "wy" : "3f533e89aa2085a9f8121086a2597f1060f73c8d75d66940e50eead73dfd03c476ea1947cdd4dd3f"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000411e094f470948e4eaa6aa13fab4e063386e91a638fa226d988d0693dea719ca95f61e493e9835af43f533e89aa2085a9f8121086a2597f1060f73c8d75d66940e50eead73dfd03c476ea1947cdd4dd3f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABBHglPRwlI5OqmqhP6tOBjOG6Rpj\nj6Im2YjQaT3qcZypX2Hkk+mDWvQ/Uz6JqiCFqfgSEIaiWX8QYPc8jXXWaUDlDurX\nPf0DxHbqGUfN1N0/\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 309,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020102",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0416517a7d7beab6472ea8f6bc20412a3cd96d242c246ce9f983b2ef08b284cfad1ac28563b56edafb9f56fe2df78c239aa16c3c318bc9191a16ec407a700354173f8b862d9a0aa10d67397f26e7c9c0be",
+        "wx" : "16517a7d7beab6472ea8f6bc20412a3cd96d242c246ce9f983b2ef08b284cfad1ac28563b56edafb",
+        "wy" : "09f56fe2df78c239aa16c3c318bc9191a16ec407a700354173f8b862d9a0aa10d67397f26e7c9c0be"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000416517a7d7beab6472ea8f6bc20412a3cd96d242c246ce9f983b2ef08b284cfad1ac28563b56edafb9f56fe2df78c239aa16c3c318bc9191a16ec407a700354173f8b862d9a0aa10d67397f26e7c9c0be",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABBZRen176rZHLqj2vCBBKjzZbSQs\nJGzp+YOy7wiyhM+tGsKFY7Vu2vufVv4t94wjmqFsPDGLyRkaFuxAenADVBc/i4Yt\nmgqhDWc5fybnycC+\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 310,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020103",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 311,
+          "comment" : "r is larger than n",
+          "msg" : "313233343030",
+          "sig" : "302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312020103",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043a2668bc09614d2638ed58f1c421bb61f2d499a86fe7d573bd1392acef9e296b1ef2b10d7f4ec524d1b78eb2716ce668054d29677c6f4d3235f27d3a9295ecef9ddfd2f658ba002052d0e1e671721e2e",
+        "wx" : "3a2668bc09614d2638ed58f1c421bb61f2d499a86fe7d573bd1392acef9e296b1ef2b10d7f4ec524",
+        "wy" : "0d1b78eb2716ce668054d29677c6f4d3235f27d3a9295ecef9ddfd2f658ba002052d0e1e671721e2e"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200043a2668bc09614d2638ed58f1c421bb61f2d499a86fe7d573bd1392acef9e296b1ef2b10d7f4ec524d1b78eb2716ce668054d29677c6f4d3235f27d3a9295ecef9ddfd2f658ba002052d0e1e671721e2e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABDomaLwJYU0mOO1Y8cQhu2Hy1Jmo\nb+fVc70TkqzvnilrHvKxDX9OxSTRt46ycWzmaAVNKWd8b00yNfJ9OpKV7O+d39L2\nWLoAIFLQ4eZxch4u\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 312,
+          "comment" : "s is larger than n",
+          "msg" : "313233343030",
+          "sig" : "302e020101022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44d86998",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cd1697c6e107f3d90b8df462eb368b75eba585635950177e0a64b1ad4be527c90957fbdf203d67c84b003f20e81659099b7e466618f2610c6f1df315b2011db07b90f3662b51561fffdf3ebb5d443440",
+        "wx" : "0cd1697c6e107f3d90b8df462eb368b75eba585635950177e0a64b1ad4be527c90957fbdf203d67c8",
+        "wy" : "4b003f20e81659099b7e466618f2610c6f1df315b2011db07b90f3662b51561fffdf3ebb5d443440"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004cd1697c6e107f3d90b8df462eb368b75eba585635950177e0a64b1ad4be527c90957fbdf203d67c84b003f20e81659099b7e466618f2610c6f1df315b2011db07b90f3662b51561fffdf3ebb5d443440",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABM0Wl8bhB/PZC430Yus2i3XrpYVj\nWVAXfgpksa1L5SfJCVf73yA9Z8hLAD8g6BZZCZt+RmYY8mEMbx3zFbIBHbB7kPNm\nK1FWH//fPrtdRDRA\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 313,
+          "comment" : "small r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302e02020100022821494db879806d4f59e53d4963977a03f6ec51140c9f9a1dba8857ff3bbc76d2214947e60edc982b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b1e3619d9e35873e959bb7de7740e927e3cb7fcf4413bfdbbed72ecc9a86a50d7029cae08ec285ab486b5d2f7c9b9314420bc864cfe29b4064bf7b922bbb5bbcd16f3a81ea7d0a61b0a09a62959b7690",
+        "wx" : "0b1e3619d9e35873e959bb7de7740e927e3cb7fcf4413bfdbbed72ecc9a86a50d7029cae08ec285ab",
+        "wy" : "486b5d2f7c9b9314420bc864cfe29b4064bf7b922bbb5bbcd16f3a81ea7d0a61b0a09a62959b7690"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004b1e3619d9e35873e959bb7de7740e927e3cb7fcf4413bfdbbed72ecc9a86a50d7029cae08ec285ab486b5d2f7c9b9314420bc864cfe29b4064bf7b922bbb5bbcd16f3a81ea7d0a61b0a09a62959b7690",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABLHjYZ2eNYc+lZu33ndA6Sfjy3/P\nRBO/277XLsyahqUNcCnK4I7ChatIa10vfJuTFEILyGTP4ptAZL97kiu7W7zRbzqB\n6n0KYbCgmmKVm3aQ\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 314,
+          "comment" : "smallish r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303302072d9b4d347952cc022843becc876a63564b458280199e382cbad8ef68d406665bbf307ffea45845a9ac69345a84a5a72b87",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0497cfebab588a54242a4d962ef803376c3f43079aa50a8871d6e776f7a0b33aea46ab9a2da63a33d8c81af34af2e9a0c571effb501c4a27fd2aedc13623447af2bc8b6d5e7208c23e87e2d797cc3cf57e",
+        "wx" : "097cfebab588a54242a4d962ef803376c3f43079aa50a8871d6e776f7a0b33aea46ab9a2da63a33d8",
+        "wy" : "0c81af34af2e9a0c571effb501c4a27fd2aedc13623447af2bc8b6d5e7208c23e87e2d797cc3cf57e"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000497cfebab588a54242a4d962ef803376c3f43079aa50a8871d6e776f7a0b33aea46ab9a2da63a33d8c81af34af2e9a0c571effb501c4a27fd2aedc13623447af2bc8b6d5e7208c23e87e2d797cc3cf57e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABJfP66tYilQkKk2WLvgDN2w/Qwea\npQqIcdbndvegszrqRquaLaY6M9jIGvNK8umgxXHv+1AcSif9Ku3BNiNEevK8i21e\ncgjCPofi15fMPPV+\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 315,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "313233343030",
+          "sig" : "3039020d1033e67e37b32b445580bf4efc02283992353d916617b49303856488e39fbc26173b8bc426f8207de3d8f1b97f3d12c803b99d57768fa7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04296e0067947efc07a06ae218fb00164d1ebebcd3787f793481407e2796248e8b65eac57db0c14606729e8094b9a54eeac23d98d51d662eff2df33a8693008fd02a0429ef6851ecbdcd93aac67c2fbdb6",
+        "wx" : "296e0067947efc07a06ae218fb00164d1ebebcd3787f793481407e2796248e8b65eac57db0c14606",
+        "wy" : "729e8094b9a54eeac23d98d51d662eff2df33a8693008fd02a0429ef6851ecbdcd93aac67c2fbdb6"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004296e0067947efc07a06ae218fb00164d1ebebcd3787f793481407e2796248e8b65eac57db0c14606729e8094b9a54eeac23d98d51d662eff2df33a8693008fd02a0429ef6851ecbdcd93aac67c2fbdb6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABCluAGeUfvwHoGriGPsAFk0evrzT\neH95NIFAfieWJI6LZerFfbDBRgZynoCUuaVO6sI9mNUdZi7/LfM6hpMAj9AqBCnv\naFHsvc2TqsZ8L722\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 316,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "313233343030",
+          "sig" : "302f0202010002290084380881b243236967227191398a3a4909000425576c79465bdaaa0a03267b9e48f68fa0a68b29e3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a3783b01455d92080f520d171f92abeaf48c7238e168b2931f2b322f9c0faa69a24097836cb0a6851cbf1a22bac2437551244605682dabcdd4cf39ff9d08443921c99448cbcea5deb85ad952dbb2b967",
+        "wx" : "0a3783b01455d92080f520d171f92abeaf48c7238e168b2931f2b322f9c0faa69a24097836cb0a685",
+        "wy" : "1cbf1a22bac2437551244605682dabcdd4cf39ff9d08443921c99448cbcea5deb85ad952dbb2b967"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004a3783b01455d92080f520d171f92abeaf48c7238e168b2931f2b322f9c0faa69a24097836cb0a6851cbf1a22bac2437551244605682dabcdd4cf39ff9d08443921c99448cbcea5deb85ad952dbb2b967",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABKN4OwFFXZIID1INFx+Sq+r0jHI4\n4Wiykx8rMi+cD6ppokCXg2ywpoUcvxoiusJDdVEkRgVoLavN1M85/50IRDkhyZRI\ny86l3rha2VLbsrln\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 317,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303a020d062522bbd3ecbe7c39e93e7c2402290084380881b243236967227191398a3a4909000425576c79465bdaaa0a03267b9e48f68fa0a68b29e3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0470d5fd41c416d5b7cdbcb944205bd69ff00ed6354aa502757e089cb19af6f777beb0f6921c0fafac22ae7cc65e0e7b617423750b8493a58512e379c00de626c17f7c82bfc907f26610a3f1e4d132c575",
+        "wx" : "70d5fd41c416d5b7cdbcb944205bd69ff00ed6354aa502757e089cb19af6f777beb0f6921c0fafac",
+        "wy" : "22ae7cc65e0e7b617423750b8493a58512e379c00de626c17f7c82bfc907f26610a3f1e4d132c575"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000470d5fd41c416d5b7cdbcb944205bd69ff00ed6354aa502757e089cb19af6f777beb0f6921c0fafac22ae7cc65e0e7b617423750b8493a58512e379c00de626c17f7c82bfc907f26610a3f1e4d132c575",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABHDV/UHEFtW3zby5RCBb1p/wDtY1\nSqUCdX4InLGa9vd3vrD2khwPr6wirnzGXg57YXQjdQuEk6WFEuN5wA3mJsF/fIK/\nyQfyZhCj8eTRMsV1\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 318,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c592940229008ce984c0247d8a7a9628503f36abeaeea65fdfc3cf0a0c6cc8dac9da9f043b4659b638e7832e620b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0406828ce63f3b0d694ce2999d06947fa9e2d1c18ab8032652fa7a98c678cf6bb2c52e7369085e4ef7c56df69128962fbefc2aef1b3f6c467b72fc305acf51b339643ca2ed6bde56317c4cf59895923ded",
+        "wx" : "6828ce63f3b0d694ce2999d06947fa9e2d1c18ab8032652fa7a98c678cf6bb2c52e7369085e4ef7",
+        "wy" : "0c56df69128962fbefc2aef1b3f6c467b72fc305acf51b339643ca2ed6bde56317c4cf59895923ded"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000406828ce63f3b0d694ce2999d06947fa9e2d1c18ab8032652fa7a98c678cf6bb2c52e7369085e4ef7c56df69128962fbefc2aef1b3f6c467b72fc305acf51b339643ca2ed6bde56317c4cf59895923ded",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABAaCjOY/Ow1pTOKZnQaUf6ni0cGK\nuAMmUvp6mMZ4z2uyxS5zaQheTvfFbfaRKJYvvvwq7xs/bEZ7cvwwWs9RszlkPKLt\na95WMXxM9ZiVkj3t\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 319,
+          "comment" : "s == 1",
+          "msg" : "313233343030",
+          "sig" : "302d02284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 320,
+          "comment" : "s == 0",
+          "msg" : "313233343030",
+          "sig" : "302d02284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04202516ad663775f12155521079037f3fca50c64faa4afd886add4daab927f3f62aa2dae684a635d6632aedd530e61dab35916962ee8f23ed688198afd5ad6b0705e2ef9d0ba3c5333b15bdab432ee342",
+        "wx" : "202516ad663775f12155521079037f3fca50c64faa4afd886add4daab927f3f62aa2dae684a635d6",
+        "wy" : "632aedd530e61dab35916962ee8f23ed688198afd5ad6b0705e2ef9d0ba3c5333b15bdab432ee342"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004202516ad663775f12155521079037f3fca50c64faa4afd886add4daab927f3f62aa2dae684a635d6632aedd530e61dab35916962ee8f23ed688198afd5ad6b0705e2ef9d0ba3c5333b15bdab432ee342",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABCAlFq1mN3XxIVVSEHkDfz/KUMZP\nqkr9iGrdTaq5J/P2KqLa5oSmNdZjKu3VMOYdqzWRaWLujyPtaIGYr9WtawcF4u+d\nC6PFMzsVvatDLuNC\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 321,
+          "comment" : "point at infinity during verify",
+          "msg" : "313233343030",
+          "sig" : "3054022869af23901b5e27dbf09e3c2f6900f032fcc7e7d2db47895196a41763f7432c74c348aaada262c98802284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046b4327117e9c04d7a58259c5207a36e8d278e873b92b5b3a70a3c4742cc583b41408aaab23a12a9c9b0b26160c548abacd7f0e37276f917c09721b3844d0b26e9ed5c76c99787992259bf0f7b02445d3",
+        "wx" : "6b4327117e9c04d7a58259c5207a36e8d278e873b92b5b3a70a3c4742cc583b41408aaab23a12a9c",
+        "wy" : "09b0b26160c548abacd7f0e37276f917c09721b3844d0b26e9ed5c76c99787992259bf0f7b02445d3"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200046b4327117e9c04d7a58259c5207a36e8d278e873b92b5b3a70a3c4742cc583b41408aaab23a12a9c9b0b26160c548abacd7f0e37276f917c09721b3844d0b26e9ed5c76c99787992259bf0f7b02445d3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABGtDJxF+nATXpYJZxSB6NujSeOhz\nuStbOnCjxHQsxYO0FAiqqyOhKpybCyYWDFSKus1/Djcnb5F8CXIbOETQsm6e1cds\nmXh5kiWb8PewJEXT\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 322,
+          "comment" : "u1 == 1",
+          "msg" : "313233343030",
+          "sig" : "305502284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105022900f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb700",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04277f487faf77a65dbb791536e863b8c70f904fcdcaf52740d4bd5c469731e58ea6bd53e8d77202282d346f2b4ca7bacb882fef749c2713f1a75f00827e8b9b9f744a0e1e34bcf80799a120950de95d99",
+        "wx" : "277f487faf77a65dbb791536e863b8c70f904fcdcaf52740d4bd5c469731e58ea6bd53e8d7720228",
+        "wy" : "2d346f2b4ca7bacb882fef749c2713f1a75f00827e8b9b9f744a0e1e34bcf80799a120950de95d99"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004277f487faf77a65dbb791536e863b8c70f904fcdcaf52740d4bd5c469731e58ea6bd53e8d77202282d346f2b4ca7bacb882fef749c2713f1a75f00827e8b9b9f744a0e1e34bcf80799a120950de95d99",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABCd/SH+vd6Zdu3kVNuhjuMcPkE/N\nyvUnQNS9XEaXMeWOpr1T6NdyAigtNG8rTKe6y4gv73ScJxPxp18Agn6Lm590Sg4e\nNLz4B5mhIJUN6V2Z\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 323,
+          "comment" : "u1 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "305502284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105022900ad0b664f9559e29e46fd4fd390e75abebf14997d17a1a3304c80e451fc8f79bb7cff168e17de6f22",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0473bd62f3bb329d65092b5d13c5746d462401d2600994d8fe2ec5ef5b9f3399084b1ddc64cb334baec1d1ac4f9a0c2a79ef7ccc4ae9165ddfa76138235718cf24032c33f9db4a26b2b03692a56f5202eb",
+        "wx" : "73bd62f3bb329d65092b5d13c5746d462401d2600994d8fe2ec5ef5b9f3399084b1ddc64cb334bae",
+        "wy" : "0c1d1ac4f9a0c2a79ef7ccc4ae9165ddfa76138235718cf24032c33f9db4a26b2b03692a56f5202eb"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000473bd62f3bb329d65092b5d13c5746d462401d2600994d8fe2ec5ef5b9f3399084b1ddc64cb334baec1d1ac4f9a0c2a79ef7ccc4ae9165ddfa76138235718cf24032c33f9db4a26b2b03692a56f5202eb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABHO9YvO7Mp1lCStdE8V0bUYkAdJg\nCZTY/i7F71ufM5kISx3cZMszS67B0axPmgwqee98zErpFl3fp2E4I1cYzyQDLDP5\n20omsrA2kqVvUgLr\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 324,
+          "comment" : "u2 == 1",
+          "msg" : "313233343030",
+          "sig" : "305402284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c197310502284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0420a75551035db95d7a1a673d464d276da0861008e4644c582bc10a1beeaeb070823fd064a2625ebb5d47f0c77fc57e3bb0e153bbc7e9bbde8db98b0c46c58154af5b9786b10ba12ab3ba8533a3992883",
+        "wx" : "20a75551035db95d7a1a673d464d276da0861008e4644c582bc10a1beeaeb070823fd064a2625ebb",
+        "wy" : "5d47f0c77fc57e3bb0e153bbc7e9bbde8db98b0c46c58154af5b9786b10ba12ab3ba8533a3992883"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000420a75551035db95d7a1a673d464d276da0861008e4644c582bc10a1beeaeb070823fd064a2625ebb5d47f0c77fc57e3bb0e153bbc7e9bbde8db98b0c46c58154af5b9786b10ba12ab3ba8533a3992883",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABCCnVVEDXbldehpnPUZNJ22ghhAI\n5GRMWCvBChvurrBwgj/QZKJiXrtdR/DHf8V+O7DhU7vH6bvejbmLDEbFgVSvW5eG\nsQuhKrO6hTOjmSiD\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 325,
+          "comment" : "u2 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "305502284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c19731050229008ce984c0247d8a7a9628503f36abeaeea65fdfc3cf0a0c6cc8dac9da9f043b4659b638e7832e620c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043f436d07cb0264b13f92fd696334a4e51b7d6619e2d043b2d0d278963f2516200ef905ebf671666340e642b6c966072b79278003651128879f19dee01273b66bead8045194277c9284093348d90569b1",
+        "wx" : "3f436d07cb0264b13f92fd696334a4e51b7d6619e2d043b2d0d278963f2516200ef905ebf6716663",
+        "wy" : "40e642b6c966072b79278003651128879f19dee01273b66bead8045194277c9284093348d90569b1"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200043f436d07cb0264b13f92fd696334a4e51b7d6619e2d043b2d0d278963f2516200ef905ebf671666340e642b6c966072b79278003651128879f19dee01273b66bead8045194277c9284093348d90569b1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABD9DbQfLAmSxP5L9aWM0pOUbfWYZ\n4tBDstDSeJY/JRYgDvkF6/ZxZmNA5kK2yWYHK3kngANlESiHnxne4BJztmvq2ARR\nlCd8koQJM0jZBWmx\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 326,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02280cc64af035cb79b3336a62d915b381e268d3bcb834f9cfd0f597c37ca5fcf50f588614ef0ef7b6a5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c16fbe6d0d77327cf9a65f987c2fe7ee1807851c0e1c8bc4f0622807dcd4a88b3b912eb0475471e575421c40540050507a163f23cc7cb90acc52822d01d245ab70dcaac06e2ea644327a85f595d026ef",
+        "wx" : "0c16fbe6d0d77327cf9a65f987c2fe7ee1807851c0e1c8bc4f0622807dcd4a88b3b912eb0475471e5",
+        "wy" : "75421c40540050507a163f23cc7cb90acc52822d01d245ab70dcaac06e2ea644327a85f595d026ef"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004c16fbe6d0d77327cf9a65f987c2fe7ee1807851c0e1c8bc4f0622807dcd4a88b3b912eb0475471e575421c40540050507a163f23cc7cb90acc52822d01d245ab70dcaac06e2ea644327a85f595d026ef",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABMFvvm0NdzJ8+aZfmHwv5+4YB4Uc\nDhyLxPBiKAfc1KiLO5EusEdUceV1QhxAVABQUHoWPyPMfLkKzFKCLQHSRatw3KrA\nbi6mRDJ6hfWV0Cbv\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 327,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0229008e765d0d1cf9539f682a4155b6d60eb6aa6862b2af9e9d3f94c9ad46d332f0e029775522815c0e5a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04be924007d6e22b944ac76da7fc2660d1aefab69471bd835bd78edd2c10621e76f718bfd0a5e2307ec62583d5ba5cc1c547630476b399866e7ed953b538f76c86afe9cfd0854b57e33691c77e444ccab8",
+        "wx" : "0be924007d6e22b944ac76da7fc2660d1aefab69471bd835bd78edd2c10621e76f718bfd0a5e2307e",
+        "wy" : "0c62583d5ba5cc1c547630476b399866e7ed953b538f76c86afe9cfd0854b57e33691c77e444ccab8"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004be924007d6e22b944ac76da7fc2660d1aefab69471bd835bd78edd2c10621e76f718bfd0a5e2307ec62583d5ba5cc1c547630476b399866e7ed953b538f76c86afe9cfd0854b57e33691c77e444ccab8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABL6SQAfW4iuUSsdtp/wmYNGu+raU\ncb2DW9eO3SwQYh529xi/0KXiMH7GJYPVulzBxUdjBHazmYZuftlTtTj3bIav6c/Q\nhUtX4zaRx35ETMq4\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 328,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02287225a960d967cfe52ac126a50fd79fa85a586397c0b298c8adfaf138317b0f794b24f53bd920c1cf",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04acf240130d47d4a57d606595f989129fea7e9744b1e53f5ce679c244c85af35c618607e2ecce1a431b696a7959fe30d049100dd54258181b08a2fe442e41ff29523c11a3e01028eb64b321c2b702579c",
+        "wx" : "0acf240130d47d4a57d606595f989129fea7e9744b1e53f5ce679c244c85af35c618607e2ecce1a43",
+        "wy" : "1b696a7959fe30d049100dd54258181b08a2fe442e41ff29523c11a3e01028eb64b321c2b702579c"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004acf240130d47d4a57d606595f989129fea7e9744b1e53f5ce679c244c85af35c618607e2ecce1a431b696a7959fe30d049100dd54258181b08a2fe442e41ff29523c11a3e01028eb64b321c2b702579c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABKzyQBMNR9SlfWBllfmJEp/qfpdE\nseU/XOZ5wkTIWvNcYYYH4uzOGkMbaWp5Wf4w0EkQDdVCWBgbCKL+RC5B/ylSPBGj\n4BAo62SzIcK3Alec\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 329,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900874f311b6b9ac74fc34c60c0941873651b3c0ec1d097a7861e0c7fbec3226f23a5e2c929d856ecb3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0446243b39e77639ac19e9be53669317d9598e03ec30a0cf6930f800009833826a59ade5321933ff2f69d770b978ccc36c90b748e5010636e7004ddc19885da7bb90dbfad479fc52dce4b9281405f1c6bd",
+        "wx" : "46243b39e77639ac19e9be53669317d9598e03ec30a0cf6930f800009833826a59ade5321933ff2f",
+        "wy" : "69d770b978ccc36c90b748e5010636e7004ddc19885da7bb90dbfad479fc52dce4b9281405f1c6bd"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000446243b39e77639ac19e9be53669317d9598e03ec30a0cf6930f800009833826a59ade5321933ff2f69d770b978ccc36c90b748e5010636e7004ddc19885da7bb90dbfad479fc52dce4b9281405f1c6bd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABEYkOznndjmsGem+U2aTF9lZjgPs\nMKDPaTD4AACYM4JqWa3lMhkz/y9p13C5eMzDbJC3SOUBBjbnAE3cGYhdp7uQ2/rU\nefxS3OS5KBQF8ca9\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 330,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022813753ac90fbc7edfdcb32e1697fdfd41b1fb59c5ad177e96feacc87522ef928de80a60bb0f32e7e2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b4b9b6ba3c0e7509c275894e84e818d71de14577bdb4bf0b8e5e1332d1087f3c333b73e8ab75f2c94f33d0e2ab342d2e1968ce3e1c47be87e39ee88273ae4cf777869d3a1703b63a983d2d43c59303e5",
+        "wx" : "0b4b9b6ba3c0e7509c275894e84e818d71de14577bdb4bf0b8e5e1332d1087f3c333b73e8ab75f2c9",
+        "wy" : "4f33d0e2ab342d2e1968ce3e1c47be87e39ee88273ae4cf777869d3a1703b63a983d2d43c59303e5"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004b4b9b6ba3c0e7509c275894e84e818d71de14577bdb4bf0b8e5e1332d1087f3c333b73e8ab75f2c94f33d0e2ab342d2e1968ce3e1c47be87e39ee88273ae4cf777869d3a1703b63a983d2d43c59303e5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABLS5tro8DnUJwnWJToToGNcd4UV3\nvbS/C45eEzLRCH88Mztz6Kt18slPM9DiqzQtLhlozj4cR76H457ognOuTPd3hp06\nFwO2Opg9LUPFkwPl\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 331,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022826ea75921f78fdbfb9665c2d2ffbfa8363f6b38b5a2efd2dfd5990ea45df251bd014c1761e65cfc4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0403015b3ca67683467c79446d4b93d10978330856eee40d6d58683ac73500ae315c5b582351c4226b18d89561d3ffa0f9311aa616547f7eb1d36e73a6cc4bd230df34a1f319be66bcb2fb0e1f68cc192e",
+        "wx" : "3015b3ca67683467c79446d4b93d10978330856eee40d6d58683ac73500ae315c5b582351c4226b",
+        "wy" : "18d89561d3ffa0f9311aa616547f7eb1d36e73a6cc4bd230df34a1f319be66bcb2fb0e1f68cc192e"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000403015b3ca67683467c79446d4b93d10978330856eee40d6d58683ac73500ae315c5b582351c4226b18d89561d3ffa0f9311aa616547f7eb1d36e73a6cc4bd230df34a1f319be66bcb2fb0e1f68cc192e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABAMBWzymdoNGfHlEbUuT0Ql4MwhW\n7uQNbVhoOsc1AK4xXFtYI1HEImsY2JVh0/+g+TEaphZUf36x025zpsxL0jDfNKHz\nGb5mvLL7Dh9ozBku\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 332,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0229009fee192930d30502c05e56adf086ecd13a92cd43ce0c72ea65ead43667890ae19be835333c32c5f0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04187d93f84a0e6043f097d0a87f8dca07739cf44548a7d3403e039e49c4c51285482975af54ec056c0623c57538fefb7231d619bbefd4cab373a54b361354e586b1d9981a8835e9c6beab082cb93e13b6",
+        "wx" : "187d93f84a0e6043f097d0a87f8dca07739cf44548a7d3403e039e49c4c51285482975af54ec056c",
+        "wy" : "623c57538fefb7231d619bbefd4cab373a54b361354e586b1d9981a8835e9c6beab082cb93e13b6"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004187d93f84a0e6043f097d0a87f8dca07739cf44548a7d3403e039e49c4c51285482975af54ec056c0623c57538fefb7231d619bbefd4cab373a54b361354e586b1d9981a8835e9c6beab082cb93e13b6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABBh9k/hKDmBD8JfQqH+NygdznPRF\nSKfTQD4DnknExRKFSCl1r1TsBWwGI8V1OP77cjHWGbvv1Mqzc6VLNhNU5Yax2Zga\niDXpxr6rCCy5PhO2\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 333,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900963f97cb35a321df62fc219eb2f3703949c483165d06db13c403080a86c1e5d9b43d2e8dd9643cde",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040855cc20351126b38f934fbb56c302f62a360e62493c2d529fb87caea0d71bfdaf5fcc3368d495fd1ce7578610cbec465398b2c1238b3e23b9e29b476196106430d76316aaf29937ace658b69c8bfb99",
+        "wx" : "0855cc20351126b38f934fbb56c302f62a360e62493c2d529fb87caea0d71bfdaf5fcc3368d495fd",
+        "wy" : "1ce7578610cbec465398b2c1238b3e23b9e29b476196106430d76316aaf29937ace658b69c8bfb99"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200040855cc20351126b38f934fbb56c302f62a360e62493c2d529fb87caea0d71bfdaf5fcc3368d495fd1ce7578610cbec465398b2c1238b3e23b9e29b476196106430d76316aaf29937ace658b69c8bfb99",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABAhVzCA1ESazj5NPu1bDAvYqNg5i\nSTwtUp+4fK6g1xv9r1/MM2jUlf0c51eGEMvsRlOYssEjiz4jueKbR2GWEGQw12MW\nqvKZN6zmWLaci/uZ\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 334,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022813dbff9e667e7bcd44950226f93b09738e793517c02886ae9f2b3dededa756c9049ab9a46bc7c93e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0494c54919004079be0db4c92dc1fc947d79eb0f8e869d94813886ada4254f1dadb4d87a6112a5833686d8b5beac00fafd647ef8b631e899a6a8b72a511d4f50ce156648ad9cb708fb2fb2c638fdb9f332",
+        "wx" : "094c54919004079be0db4c92dc1fc947d79eb0f8e869d94813886ada4254f1dadb4d87a6112a58336",
+        "wy" : "086d8b5beac00fafd647ef8b631e899a6a8b72a511d4f50ce156648ad9cb708fb2fb2c638fdb9f332"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000494c54919004079be0db4c92dc1fc947d79eb0f8e869d94813886ada4254f1dadb4d87a6112a5833686d8b5beac00fafd647ef8b631e899a6a8b72a511d4f50ce156648ad9cb708fb2fb2c638fdb9f332",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABJTFSRkAQHm+DbTJLcH8lH156w+O\nhp2UgTiGraQlTx2ttNh6YRKlgzaG2LW+rAD6/WR++LYx6JmmqLcqUR1PUM4VZkit\nnLcI+y+yxjj9ufMy\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 335,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900852466cef316992b3ca25cc54b7f4fda2e8a819e7c4b040543e94f9caca02937681c2019bb49ee43",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042bca76043728b5eeefde89d25acdf2e0b160c5ae0ccdab6bd3baa479f17753c3c000ccf8ba8623de92f0c2d68a1bd405e449823fe63b21402aef3e9a017dcbc30af18bcc79a85264834398c72fa2bb16",
+        "wx" : "2bca76043728b5eeefde89d25acdf2e0b160c5ae0ccdab6bd3baa479f17753c3c000ccf8ba8623de",
+        "wy" : "092f0c2d68a1bd405e449823fe63b21402aef3e9a017dcbc30af18bcc79a85264834398c72fa2bb16"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200042bca76043728b5eeefde89d25acdf2e0b160c5ae0ccdab6bd3baa479f17753c3c000ccf8ba8623de92f0c2d68a1bd405e449823fe63b21402aef3e9a017dcbc30af18bcc79a85264834398c72fa2bb16",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABCvKdgQ3KLXu796J0lrN8uCxYMWu\nDM2ra9O6pHnxd1PDwADM+LqGI96S8MLWihvUBeRJgj/mOyFAKu8+mgF9y8MK8YvM\neahSZINDmMcvorsW\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 336,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0228634bfe1800786b0256e90ac2de272f41c85e0976c0caa1691bd835a5a444b1ed1705a0361ae6ee36",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041c013b3a3260ccfb53e3f6ce93e6984865dc8e1293e92301f4cb3a554bd5da8a53ee101b3e1a300997d2901e26729303e1cb93a8b72dc2afc90ff5b44fd5b6624455487974ed71c7833eff03cc128d0c",
+        "wx" : "1c013b3a3260ccfb53e3f6ce93e6984865dc8e1293e92301f4cb3a554bd5da8a53ee101b3e1a3009",
+        "wy" : "097d2901e26729303e1cb93a8b72dc2afc90ff5b44fd5b6624455487974ed71c7833eff03cc128d0c"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200041c013b3a3260ccfb53e3f6ce93e6984865dc8e1293e92301f4cb3a554bd5da8a53ee101b3e1a300997d2901e26729303e1cb93a8b72dc2afc90ff5b44fd5b6624455487974ed71c7833eff03cc128d0c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABBwBOzoyYMz7U+P2zpPmmEhl3I4S\nk+kjAfTLOlVL1dqKU+4QGz4aMAmX0pAeJnKTA+HLk6i3LcKvyQ/1tE/VtmJEVUh5\ndO1xx4M+/wPMEo0M\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 337,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900c697fc3000f0d604add21585bc4e5e8390bc12ed819542d237b06b4b488963da2e0b406c35cddc6c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04624bec4520e6044abed1eee4964668775181464c5d6bf5a8b539f1156f3248c02271bf9425b966b547f406bcc143226d814cdb988d76412ad186bdeeb869ad78a32fe87c76f2545447ddf8fbd0430811",
+        "wx" : "624bec4520e6044abed1eee4964668775181464c5d6bf5a8b539f1156f3248c02271bf9425b966b5",
+        "wy" : "47f406bcc143226d814cdb988d76412ad186bdeeb869ad78a32fe87c76f2545447ddf8fbd0430811"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004624bec4520e6044abed1eee4964668775181464c5d6bf5a8b539f1156f3248c02271bf9425b966b547f406bcc143226d814cdb988d76412ad186bdeeb869ad78a32fe87c76f2545447ddf8fbd0430811",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABGJL7EUg5gRKvtHu5JZGaHdRgUZM\nXWv1qLU58RVvMkjAInG/lCW5ZrVH9Aa8wUMibYFM25iNdkEq0Ya97rhprXijL+h8\ndvJUVEfd+PvQQwgR\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 338,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02285685b327caacf14f237ea7e9c873ad5f5f8a4cbe8bd0d19826407228fe47bcddbe7f8b470bef3791",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041b2b2738e3055d1596f64176cf0ac381b3a8178a2f021403350218fa18f9f860c1bba39fc524bc8209fbafca1afc5af7598b878d69cb875be0d39f41ff01b09388693eb310adc9d4836e226c23677e51",
+        "wx" : "1b2b2738e3055d1596f64176cf0ac381b3a8178a2f021403350218fa18f9f860c1bba39fc524bc82",
+        "wy" : "09fbafca1afc5af7598b878d69cb875be0d39f41ff01b09388693eb310adc9d4836e226c23677e51"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200041b2b2738e3055d1596f64176cf0ac381b3a8178a2f021403350218fa18f9f860c1bba39fc524bc8209fbafca1afc5af7598b878d69cb875be0d39f41ff01b09388693eb310adc9d4836e226c23677e51",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABBsrJzjjBV0VlvZBds8Kw4GzqBeK\nLwIUAzUCGPoY+fhgwbujn8UkvIIJ+6/KGvxa91mLh41py4db4NOfQf8BsJOIaT6z\nEK3J1INuImwjZ35R\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 339,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900a2c1f84088120fce85fecf81f0ecc00729f4199ebba0d5b5eda190001000b43168db254b8ef32a70",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0440902bf6b239d2f3588260e9d7f512253fa44f308a0ab81dff05b8fa2e25814d65c2018d49390aae016f8ae5691938402adc0ffa29bb87ef0af0ecf3cd446d97c3e8d12b3b09eb78909c1b91b1b8785f",
+        "wx" : "40902bf6b239d2f3588260e9d7f512253fa44f308a0ab81dff05b8fa2e25814d65c2018d49390aae",
+        "wy" : "16f8ae5691938402adc0ffa29bb87ef0af0ecf3cd446d97c3e8d12b3b09eb78909c1b91b1b8785f"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000440902bf6b239d2f3588260e9d7f512253fa44f308a0ab81dff05b8fa2e25814d65c2018d49390aae016f8ae5691938402adc0ffa29bb87ef0af0ecf3cd446d97c3e8d12b3b09eb78909c1b91b1b8785f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABECQK/ayOdLzWIJg6df1EiU/pE8w\nigq4Hf8FuPouJYFNZcIBjUk5Cq4Bb4rlaRk4QCrcD/opu4fvCvDs881EbZfD6NEr\nOwnreJCcG5GxuHhf\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 340,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0228711f6d0abce96fe7f5bed2ca4600a021fdda9a8c922fb0e10f180f97fa2cc84dd785c71e6c41dbaf",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04726533e26773ac720a115b02de89ac15966677e239b7c577a1c15b81027b1feb73e673601e211aa92accb585bc06cc274b61c9e614746edd248d1cccf8d8b1ab4bc15cc58cdf116065ce9767f2a3223d",
+        "wx" : "726533e26773ac720a115b02de89ac15966677e239b7c577a1c15b81027b1feb73e673601e211aa9",
+        "wy" : "2accb585bc06cc274b61c9e614746edd248d1cccf8d8b1ab4bc15cc58cdf116065ce9767f2a3223d"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004726533e26773ac720a115b02de89ac15966677e239b7c577a1c15b81027b1feb73e673601e211aa92accb585bc06cc274b61c9e614746edd248d1cccf8d8b1ab4bc15cc58cdf116065ce9767f2a3223d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABHJlM+Jnc6xyChFbAt6JrBWWZnfi\nObfFd6HBW4ECex/rc+ZzYB4hGqkqzLWFvAbMJ0thyeYUdG7dJI0czPjYsatLwVzF\njN8RYGXOl2fyoyI9\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 341,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022802a6eb408443d24e96be4ca0278442a8a426087f9beb03ffe5526162bf1dc30434cf7ea79574b19b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0453c3da4de14f7d35775f9beca6d53ee78dac73cd3f18c6fbf709b4ffa7dd3e70b436409b9b285d1c2a5b60e457e58422c959142b5ecff236dfd76c99c3018cea904058099a13647db08898cfd0509e84",
+        "wx" : "53c3da4de14f7d35775f9beca6d53ee78dac73cd3f18c6fbf709b4ffa7dd3e70b436409b9b285d1c",
+        "wy" : "2a5b60e457e58422c959142b5ecff236dfd76c99c3018cea904058099a13647db08898cfd0509e84"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000453c3da4de14f7d35775f9beca6d53ee78dac73cd3f18c6fbf709b4ffa7dd3e70b436409b9b285d1c2a5b60e457e58422c959142b5ecff236dfd76c99c3018cea904058099a13647db08898cfd0509e84",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABFPD2k3hT301d1+b7KbVPueNrHPN\nPxjG+/cJtP+n3T5wtDZAm5soXRwqW2DkV+WEIslZFCtez/I239dsmcMBjOqQQFgJ\nmhNkfbCImM/QUJ6E\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 342,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900b6ba1aecd240debe77213a4228b125603671c9d5147b6c0b36dd23e42b7cb5078a1b8fdf1b98b93a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cd24ae7f7523adf859db92e51d48746b8b2f868620898a9c42f8bae8173e3646f586fd818712430e55b12d59f7344168f796fe59c026eaaa139745a8ace97df1d5c6bcc21f0cfa6860f9c8c75f391629",
+        "wx" : "0cd24ae7f7523adf859db92e51d48746b8b2f868620898a9c42f8bae8173e3646f586fd818712430e",
+        "wy" : "55b12d59f7344168f796fe59c026eaaa139745a8ace97df1d5c6bcc21f0cfa6860f9c8c75f391629"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004cd24ae7f7523adf859db92e51d48746b8b2f868620898a9c42f8bae8173e3646f586fd818712430e55b12d59f7344168f796fe59c026eaaa139745a8ace97df1d5c6bcc21f0cfa6860f9c8c75f391629",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABM0krn91I634WduS5R1IdGuLL4aG\nIImKnEL4uugXPjZG9Yb9gYcSQw5VsS1Z9zRBaPeW/lnAJuqqE5dFqKzpffHVxrzC\nHwz6aGD5yMdfORYp\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 343,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900957b383ba1cebf5ca579ef6ed10027988f8424f42ffbea2e51b3340df9f8c3c60b558d6dc2df10f3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044db460209972c8e9c365119546ac457add157f0c4d2b3cd65c635dcaeca617029cabf75c06101bb69ef8b7626e6b2f9845b0086d2a964018b9b25eb8db426bc90694cc614b7602b1fd6087a9a71cbf1f",
+        "wx" : "4db460209972c8e9c365119546ac457add157f0c4d2b3cd65c635dcaeca617029cabf75c06101bb6",
+        "wy" : "09ef8b7626e6b2f9845b0086d2a964018b9b25eb8db426bc90694cc614b7602b1fd6087a9a71cbf1f"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200044db460209972c8e9c365119546ac457add157f0c4d2b3cd65c635dcaeca617029cabf75c06101bb69ef8b7626e6b2f9845b0086d2a964018b9b25eb8db426bc90694cc614b7602b1fd6087a9a71cbf1f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABE20YCCZcsjpw2URlUasRXrdFX8M\nTSs81lxjXcrsphcCnKv3XAYQG7ae+LdibmsvmEWwCG0qlkAYubJeuNtCa8kGlMxh\nS3YCsf1gh6mnHL8f\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 344,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02290098ff1db1b9affa33a2e53c684d3f07611772405e8c200f2af2afa9e53c6e8ef30cc143b3f5ff7fb0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043e7ab850840d75987d33837ead46499ce433f3fce67383b2e325dd2fc7e0f500769cbb67b4550a28c30314487a87094750334499dbfbeb2d5cb976ee2d47997321597a41124a038fe867be0ef668c4ce",
+        "wx" : "3e7ab850840d75987d33837ead46499ce433f3fce67383b2e325dd2fc7e0f500769cbb67b4550a28",
+        "wy" : "0c30314487a87094750334499dbfbeb2d5cb976ee2d47997321597a41124a038fe867be0ef668c4ce"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200043e7ab850840d75987d33837ead46499ce433f3fce67383b2e325dd2fc7e0f500769cbb67b4550a28c30314487a87094750334499dbfbeb2d5cb976ee2d47997321597a41124a038fe867be0ef668c4ce",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABD56uFCEDXWYfTODfq1GSZzkM/P8\n5nODsuMl3S/H4PUAdpy7Z7RVCijDAxRIeocJR1AzRJnb++stXLl27i1HmXMhWXpB\nEkoDj+hnvg72aMTO\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 345,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02285e9ff4433ca3a4af648e0071c87c2e5c3554b11761b10bb2b81725028a56c4fc92f1320ca7396c4f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047acc919934b0fd90011cd96f59ddba52e12094dac18a2cadcb03a0f31ac72d3fd5984a11e9220f8c0629bc5f3f0dabbd3fdd30f47a0a5bea3052892f8e50a4033be4795b32c6671d141b473080e57911",
+        "wx" : "7acc919934b0fd90011cd96f59ddba52e12094dac18a2cadcb03a0f31ac72d3fd5984a11e9220f8c",
+        "wy" : "629bc5f3f0dabbd3fdd30f47a0a5bea3052892f8e50a4033be4795b32c6671d141b473080e57911"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200047acc919934b0fd90011cd96f59ddba52e12094dac18a2cadcb03a0f31ac72d3fd5984a11e9220f8c0629bc5f3f0dabbd3fdd30f47a0a5bea3052892f8e50a4033be4795b32c6671d141b473080e57911",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABHrMkZk0sP2QARzZb1ndulLhIJTa\nwYosrcsDoPMaxy0/1ZhKEekiD4wGKbxfPw2rvT/dMPR6ClvqMFKJL45QpAM75Hlb\nMsZnHRQbRzCA5XkR\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 346,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900c76ce53560163f157b11e4d05c61540a5df6b8241cbd3ba7d911a7541eec55e986ebf811ae50a8b9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0412c163fe25cb79ad59c76b5280dc6706a42c58596230bf7ba7206e6ce2b467e1b7a7063e59b0bed6ccbeaf22accb1ac41ed43ac775b97aea3a688e2f096c3a5e59f868bc919da5ce252cf5d712e7de40",
+        "wx" : "12c163fe25cb79ad59c76b5280dc6706a42c58596230bf7ba7206e6ce2b467e1b7a7063e59b0bed6",
+        "wy" : "0ccbeaf22accb1ac41ed43ac775b97aea3a688e2f096c3a5e59f868bc919da5ce252cf5d712e7de40"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000412c163fe25cb79ad59c76b5280dc6706a42c58596230bf7ba7206e6ce2b467e1b7a7063e59b0bed6ccbeaf22accb1ac41ed43ac775b97aea3a688e2f096c3a5e59f868bc919da5ce252cf5d712e7de40",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABBLBY/4ly3mtWcdrUoDcZwakLFhZ\nYjC/e6cgbmzitGfht6cGPlmwvtbMvq8irMsaxB7UOsd1uXrqOmiOLwlsOl5Z+Gi8\nkZ2lziUs9dcS595A\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 347,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02284218a45116ea65b283cc7d90a510f077b1b09eddbcfca3e7d2896b869dd3ba556c4f10590b0e08cf",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046960bfcddd0021fcb8a3d7aa85f96cf360a7113e3824508525021f83e3085989c35e0c57726503305c1275b9d8b5199d461fcb9d34f8857b65a140462fd5cdc7a33e5cf7f4e2d08a5a34d9ae00b2939a",
+        "wx" : "6960bfcddd0021fcb8a3d7aa85f96cf360a7113e3824508525021f83e3085989c35e0c5772650330",
+        "wy" : "5c1275b9d8b5199d461fcb9d34f8857b65a140462fd5cdc7a33e5cf7f4e2d08a5a34d9ae00b2939a"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200046960bfcddd0021fcb8a3d7aa85f96cf360a7113e3824508525021f83e3085989c35e0c57726503305c1275b9d8b5199d461fcb9d34f8857b65a140462fd5cdc7a33e5cf7f4e2d08a5a34d9ae00b2939a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABGlgv83dACH8uKPXqoX5bPNgpxE+\nOCRQhSUCH4PjCFmJw14MV3JlAzBcEnW52LUZnUYfy500+IV7ZaFARi/VzcejPlz3\n9OLQilo02a4AspOa\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 348,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02285e5f32423bad3644be718d8195341362c9cba52b330f913b1521af6e5e3eb2069421b05dcac299f7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0466ad2c26012388c8b9046a466b87bd71b64ab81b54cffc5a611f4b7581ad8365edd08e6afd4a52f61a3066c0b3b703ddce746239a4d3dbf1938945f15ea9497bbfc45b389e130350b9945922b87ce374",
+        "wx" : "66ad2c26012388c8b9046a466b87bd71b64ab81b54cffc5a611f4b7581ad8365edd08e6afd4a52f6",
+        "wy" : "1a3066c0b3b703ddce746239a4d3dbf1938945f15ea9497bbfc45b389e130350b9945922b87ce374"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000466ad2c26012388c8b9046a466b87bd71b64ab81b54cffc5a611f4b7581ad8365edd08e6afd4a52f61a3066c0b3b703ddce746239a4d3dbf1938945f15ea9497bbfc45b389e130350b9945922b87ce374",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABGatLCYBI4jIuQRqRmuHvXG2Srgb\nVM/8WmEfS3WBrYNl7dCOav1KUvYaMGbAs7cD3c50Yjmk09vxk4lF8V6pSXu/xFs4\nnhMDULmUWSK4fON0\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 349,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900ac07aaade5c5fb2fe5a18bbefd262e0e439fd68e0a317db06ff4ba623a2a03114ec5b6e084171058",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040cfa6e3838d8113a24d87db97417d68f00c426e9b8550d8a951fed531572e7cca66ffe0ae176ff0e312fa02e5cc77c21f4a6630e25bcb987dc1eef14aec80c15b9b292e3acfb30bc2c0438f0a9831c07",
+        "wx" : "0cfa6e3838d8113a24d87db97417d68f00c426e9b8550d8a951fed531572e7cca66ffe0ae176ff0e",
+        "wy" : "312fa02e5cc77c21f4a6630e25bcb987dc1eef14aec80c15b9b292e3acfb30bc2c0438f0a9831c07"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200040cfa6e3838d8113a24d87db97417d68f00c426e9b8550d8a951fed531572e7cca66ffe0ae176ff0e312fa02e5cc77c21f4a6630e25bcb987dc1eef14aec80c15b9b292e3acfb30bc2c0438f0a9831c07",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABAz6bjg42BE6JNh9uXQX1o8AxCbp\nuFUNipUf7VMVcufMpm/+CuF2/w4xL6AuXMd8IfSmYw4lvLmH3B7vFK7IDBW5spLj\nrPswvCwEOPCpgxwH\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 350,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0228311f6d0abce96fe7f5bed2ca4600a021fdda9a8c922fb0e10f180f97fa2cc84dd785c71e6c41dbb1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043dabbc36a455ba07432da1aa7239aefdefb72ac09313c3a7f3439850f602543eb4affc5d8225b5eece48e2f67e82d448b3d8b9b0fc200832a3d1ac88058872762fcbf027e9f5705d8f5812e507dae125",
+        "wx" : "3dabbc36a455ba07432da1aa7239aefdefb72ac09313c3a7f3439850f602543eb4affc5d8225b5ee",
+        "wy" : "0ce48e2f67e82d448b3d8b9b0fc200832a3d1ac88058872762fcbf027e9f5705d8f5812e507dae125"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200043dabbc36a455ba07432da1aa7239aefdefb72ac09313c3a7f3439850f602543eb4affc5d8225b5eece48e2f67e82d448b3d8b9b0fc200832a3d1ac88058872762fcbf027e9f5705d8f5812e507dae125",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABD2rvDakVboHQy2hqnI5rv3vtyrA\nkxPDp/NDmFD2AlQ+tK/8XYIlte7OSOL2foLUSLPYubD8IAgyo9GsiAWIcnYvy/An\n6fVwXY9YEuUH2uEl\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 351,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0228623eda1579d2dfcfeb7da5948c014043fbb53519245f61c21e301f2ff459909baf0b8e3cd883b762",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048a9658dc5f91aa577706f1d91d2252cb0d09f2053e561129105c7f37ddb2f972b3224f12cf9e43fe08782ec6105f4c06587eb1ececb2f4f4a04e236304dc75eb2efff0be66b977fa804af73bfcbac78e",
+        "wx" : "08a9658dc5f91aa577706f1d91d2252cb0d09f2053e561129105c7f37ddb2f972b3224f12cf9e43fe",
+        "wy" : "08782ec6105f4c06587eb1ececb2f4f4a04e236304dc75eb2efff0be66b977fa804af73bfcbac78e"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200048a9658dc5f91aa577706f1d91d2252cb0d09f2053e561129105c7f37ddb2f972b3224f12cf9e43fe08782ec6105f4c06587eb1ececb2f4f4a04e236304dc75eb2efff0be66b977fa804af73bfcbac78e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABIqWWNxfkapXdwbx2R0iUssNCfIF\nPlYRKRBcfzfdsvlysyJPEs+eQ/4IeC7GEF9MBlh+sezssvT0oE4jYwTcdesu//C+\nZrl3+oBK9zv8useO\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 352,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900935e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59313",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0406b43bb9587ee158ad5752d1ad11f6f0f5e316ad21937cdd9253f3844857f0a25e7b677bbf9994449705362334bdceb68ae6a584640c95cb10789b19953f5e119973eed735177aabfcb263fc8ef5ef97",
+        "wx" : "6b43bb9587ee158ad5752d1ad11f6f0f5e316ad21937cdd9253f3844857f0a25e7b677bbf999444",
+        "wy" : "09705362334bdceb68ae6a584640c95cb10789b19953f5e119973eed735177aabfcb263fc8ef5ef97"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000406b43bb9587ee158ad5752d1ad11f6f0f5e316ad21937cdd9253f3844857f0a25e7b677bbf9994449705362334bdceb68ae6a584640c95cb10789b19953f5e119973eed735177aabfcb263fc8ef5ef97",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABAa0O7lYfuFYrVdS0a0R9vD14xat\nIZN83ZJT84RIV/CiXntne7+ZlESXBTYjNL3OtormpYRkDJXLEHibGZU/XhGZc+7X\nNRd6q/yyY/yO9e+X\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 353,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02285b5d0d7669206f5f3b909d21145892b01b38e4ea8a3db6059b6e91f215be5a83c50dc7ef8dcc5c9d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04568803da071e6b9f4380e39954f2b0fc0f5bb58a0f68b5d1a42c7e9052ece2a0fc7acadc0f423999c08367945495d933f206927a2b7f5b74b22f973a898355aa2f7e295e06ef3a4f561546db97f79afa",
+        "wx" : "568803da071e6b9f4380e39954f2b0fc0f5bb58a0f68b5d1a42c7e9052ece2a0fc7acadc0f423999",
+        "wy" : "0c08367945495d933f206927a2b7f5b74b22f973a898355aa2f7e295e06ef3a4f561546db97f79afa"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004568803da071e6b9f4380e39954f2b0fc0f5bb58a0f68b5d1a42c7e9052ece2a0fc7acadc0f423999c08367945495d933f206927a2b7f5b74b22f973a898355aa2f7e295e06ef3a4f561546db97f79afa",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABFaIA9oHHmufQ4DjmVTysPwPW7WK\nD2i10aQsfpBS7OKg/HrK3A9COZnAg2eUVJXZM/IGknorf1t0si+XOomDVaovfile\nBu86T1YVRtuX95r6\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 354,
+          "comment" : "point duplication during verification",
+          "msg" : "313233343030",
+          "sig" : "30560229009563bd68545ccd185ae724d8efcd4cc23234934eef10f280792b2f930c97a6c1e00829a8b975b9ee022900c5e79c49abb135129f0636e18e2e73bced30855deeba1477d9521b33a32865155177d946e1babcb4",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04568803da071e6b9f4380e39954f2b0fc0f5bb58a0f68b5d1a42c7e9052ece2a0fc7acadc0f42399912dadf8be2267683ef35e5e4a68284f14760386c6d70b8452014908e71a4b1d9a6becbd659bb932d",
+        "wx" : "568803da071e6b9f4380e39954f2b0fc0f5bb58a0f68b5d1a42c7e9052ece2a0fc7acadc0f423999",
+        "wy" : "12dadf8be2267683ef35e5e4a68284f14760386c6d70b8452014908e71a4b1d9a6becbd659bb932d"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004568803da071e6b9f4380e39954f2b0fc0f5bb58a0f68b5d1a42c7e9052ece2a0fc7acadc0f42399912dadf8be2267683ef35e5e4a68284f14760386c6d70b8452014908e71a4b1d9a6becbd659bb932d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABFaIA9oHHmufQ4DjmVTysPwPW7WK\nD2i10aQsfpBS7OKg/HrK3A9COZkS2t+L4iZ2g+815eSmgoTxR2A4bG1wuEUgFJCO\ncaSx2aa+y9ZZu5Mt\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 355,
+          "comment" : "duplication bug",
+          "msg" : "313233343030",
+          "sig" : "30560229009563bd68545ccd185ae724d8efcd4cc23234934eef10f280792b2f930c97a6c1e00829a8b975b9ee022900c5e79c49abb135129f0636e18e2e73bced30855deeba1477d9521b33a32865155177d946e1babcb4",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045d1a100118bd3610f10e13b5adcc7a90a37f4f988cfa4e22cca77e88444b00216dcfe5f68418d3425d5b88c9b8c92b3dec7f7bcc688a6d18e6cdeb9176150d4b1062a832c8a3bc377f8d7e98b1db0b9d",
+        "wx" : "5d1a100118bd3610f10e13b5adcc7a90a37f4f988cfa4e22cca77e88444b00216dcfe5f68418d342",
+        "wy" : "5d5b88c9b8c92b3dec7f7bcc688a6d18e6cdeb9176150d4b1062a832c8a3bc377f8d7e98b1db0b9d"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200045d1a100118bd3610f10e13b5adcc7a90a37f4f988cfa4e22cca77e88444b00216dcfe5f68418d3425d5b88c9b8c92b3dec7f7bcc688a6d18e6cdeb9176150d4b1062a832c8a3bc377f8d7e98b1db0b9d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABF0aEAEYvTYQ8Q4Tta3MepCjf0+Y\njPpOIsynfohESwAhbc/l9oQY00JdW4jJuMkrPex/e8xoim0Y5s3rkXYVDUsQYqgy\nyKO8N3+Nfpix2wud\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 356,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "313233343030",
+          "sig" : "305402284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c197310502282a460e39a48c0ff193727e795d339347984ff65457b636ed6f74d627fc8144fb81504445742783d0",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cca9ac38de5b36cf79d8e415cb729e685e0bbdafe161c5e7ecfa4177e826e815d66526aa5daf32279b7799bcefc6b5d8d09ff1a0739fd423188126f80af703314da0d26ba6714aa197a6582c36b0f05d",
+        "wx" : "0cca9ac38de5b36cf79d8e415cb729e685e0bbdafe161c5e7ecfa4177e826e815d66526aa5daf3227",
+        "wy" : "09b7799bcefc6b5d8d09ff1a0739fd423188126f80af703314da0d26ba6714aa197a6582c36b0f05d"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004cca9ac38de5b36cf79d8e415cb729e685e0bbdafe161c5e7ecfa4177e826e815d66526aa5daf32279b7799bcefc6b5d8d09ff1a0739fd423188126f80af703314da0d26ba6714aa197a6582c36b0f05d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABMyprDjeWzbPedjkFctynmheC72v\n4WHF5+z6QXfoJugV1mUmql2vMiebd5m878a12NCf8aBzn9QjGIEm+Ar3AzFNoNJr\npnFKoZemWCw2sPBd\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 357,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "305402282fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de802284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cceaa1203bdcbe15e20434d624f0ed9aca81d4c82f840bba3a86c6756262aa37efed62f5f1d097f7457057b98d2b9ea6bd28581d40ac20fcc9d536a117769203447bf41e10ce4da1ad794ca20f8ee146",
+        "wx" : "0cceaa1203bdcbe15e20434d624f0ed9aca81d4c82f840bba3a86c6756262aa37efed62f5f1d097f7",
+        "wy" : "457057b98d2b9ea6bd28581d40ac20fcc9d536a117769203447bf41e10ce4da1ad794ca20f8ee146"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004cceaa1203bdcbe15e20434d624f0ed9aca81d4c82f840bba3a86c6756262aa37efed62f5f1d097f7457057b98d2b9ea6bd28581d40ac20fcc9d536a117769203447bf41e10ce4da1ad794ca20f8ee146",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABMzqoSA73L4V4gQ01iTw7ZrKgdTI\nL4QLujqGxnViYqo37+1i9fHQl/dFcFe5jSuepr0oWB1ArCD8ydU2oRd2kgNEe/Qe\nEM5Noa15TKIPjuFG\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 358,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "305402282fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de802281e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cc9ed25f13e94a6ebd531f3b142fabc4ed522dc6127861528830c6787d6ecfd4b704e1774e9118ed68e4e172f93f1d5b8d7860fae2c115f4aa0daaf6df5ca3809d79acfdb9ed2be19995658d2f44d235",
+        "wx" : "0cc9ed25f13e94a6ebd531f3b142fabc4ed522dc6127861528830c6787d6ecfd4b704e1774e9118ed",
+        "wy" : "68e4e172f93f1d5b8d7860fae2c115f4aa0daaf6df5ca3809d79acfdb9ed2be19995658d2f44d235"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004cc9ed25f13e94a6ebd531f3b142fabc4ed522dc6127861528830c6787d6ecfd4b704e1774e9118ed68e4e172f93f1d5b8d7860fae2c115f4aa0daaf6df5ca3809d79acfdb9ed2be19995658d2f44d235",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABMye0l8T6UpuvVMfOxQvq8TtUi3G\nEnhhUogwxnh9bs/UtwThd06RGO1o5OFy+T8dW414YPriwRX0qg2q9t9co4Cdeaz9\nue0r4ZmVZY0vRNI1\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 359,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "305402282fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de802282a460e39a48c0ff193727e795d339347984ff65457b636ed6f74d627fc8144fb81504445742783d0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046a3cae0edc8455ae16b5eeb6569603bdaeb5793699e85d372857f1319c70dd525b1ea30a0f5c7b44075537cd822d9ee2d0e7a49c4c3141445d01b789bbcad02ec4249c2e2355d61db5581dbdb342c993",
+        "wx" : "6a3cae0edc8455ae16b5eeb6569603bdaeb5793699e85d372857f1319c70dd525b1ea30a0f5c7b44",
+        "wy" : "75537cd822d9ee2d0e7a49c4c3141445d01b789bbcad02ec4249c2e2355d61db5581dbdb342c993"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200046a3cae0edc8455ae16b5eeb6569603bdaeb5793699e85d372857f1319c70dd525b1ea30a0f5c7b44075537cd822d9ee2d0e7a49c4c3141445d01b789bbcad02ec4249c2e2355d61db5581dbdb342c993",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABGo8rg7chFWuFrXutlaWA72utXk2\nmehdNyhX8TGccN1SWx6jCg9ce0QHVTfNgi2e4tDnpJxMMUFEXQG3ibvK0C7EJJwu\nI1XWHbVYHb2zQsmT\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 360,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "305502282fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de8022900a91838e692303fc64dc9f9e574ce4d1e613fd9515ed8dbb5bdd3589ff20513ee05411115d09e0f41",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044efb5161ca1a1eeb59a5fc39cd521d40bd3e034512fa2a1eaf3b7e92bb9e95c06a4c726ceccdf9bc6bfa801b067137f1b6b4506041130b4d402d90087ad005e3f652e1d91c9d344cd1eeffff61d3a306",
+        "wx" : "4efb5161ca1a1eeb59a5fc39cd521d40bd3e034512fa2a1eaf3b7e92bb9e95c06a4c726ceccdf9bc",
+        "wy" : "6bfa801b067137f1b6b4506041130b4d402d90087ad005e3f652e1d91c9d344cd1eeffff61d3a306"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200044efb5161ca1a1eeb59a5fc39cd521d40bd3e034512fa2a1eaf3b7e92bb9e95c06a4c726ceccdf9bc6bfa801b067137f1b6b4506041130b4d402d90087ad005e3f652e1d91c9d344cd1eeffff61d3a306",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABE77UWHKGh7rWaX8Oc1SHUC9PgNF\nEvoqHq87fpK7npXAakxybOzN+bxr+oAbBnE38ba0UGBBEwtNQC2QCHrQBeP2UuHZ\nHJ00TNHu//9h06MG\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 361,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "305502282fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de8022900b52c3cf70a58445477eab051464ac05768321fb29c7aa242b9194cab5ebc4c35e10edb72cd3ba2a1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045f658687e6a542a91d893b48776a86d528fd399781bbb9305be0797e3a6f36118ae19e68dc1673f6676e536c7897a0002f9664929631f418c4537d23749220c50a32121c434dcad2a6cdc203cd035a32",
+        "wx" : "5f658687e6a542a91d893b48776a86d528fd399781bbb9305be0797e3a6f36118ae19e68dc1673f6",
+        "wy" : "676e536c7897a0002f9664929631f418c4537d23749220c50a32121c434dcad2a6cdc203cd035a32"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200045f658687e6a542a91d893b48776a86d528fd399781bbb9305be0797e3a6f36118ae19e68dc1673f6676e536c7897a0002f9664929631f418c4537d23749220c50a32121c434dcad2a6cdc203cd035a32",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABF9lhofmpUKpHYk7SHdqhtUo/TmX\ngbu5MFvgeX46bzYRiuGeaNwWc/ZnblNseJegAC+WZJKWMfQYxFN9I3SSIMUKMhIc\nQ03K0qbNwgPNA1oy\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 362,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "305402282fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de8022853bf06e43fcc4236b2ec0d88471379053f1f3437207c5a75b09036b1c40fa8f3128277894a4c96cf",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0490537a6827a25060273d44d4846aea596682df0a59d0ffe79be2a1ebe918703cabfac64da5e591003309180d9da5e78237b95403c52f3ceee503067b672715e97d8b6369342684a72f467698741b1a1f",
+        "wx" : "090537a6827a25060273d44d4846aea596682df0a59d0ffe79be2a1ebe918703cabfac64da5e59100",
+        "wy" : "3309180d9da5e78237b95403c52f3ceee503067b672715e97d8b6369342684a72f467698741b1a1f"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000490537a6827a25060273d44d4846aea596682df0a59d0ffe79be2a1ebe918703cabfac64da5e591003309180d9da5e78237b95403c52f3ceee503067b672715e97d8b6369342684a72f467698741b1a1f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABJBTemgnolBgJz1E1IRq6llmgt8K\nWdD/55vioevpGHA8q/rGTaXlkQAzCRgNnaXngje5VAPFLzzu5QMGe2cnFel9i2Np\nNCaEpy9Gdph0Gxof\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 363,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "3054022843bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061102284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a81ccbf4fc4457033bd49ceac8fa52e459400730b877305be0418153d278d30b5973777a7dd1c2c17544ff1b76208e841053ecaef7a5869e92da08c5c4c3d0a167d5685eb721d620339cc9b00149838e",
+        "wx" : "0a81ccbf4fc4457033bd49ceac8fa52e459400730b877305be0418153d278d30b5973777a7dd1c2c1",
+        "wy" : "7544ff1b76208e841053ecaef7a5869e92da08c5c4c3d0a167d5685eb721d620339cc9b00149838e"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004a81ccbf4fc4457033bd49ceac8fa52e459400730b877305be0418153d278d30b5973777a7dd1c2c17544ff1b76208e841053ecaef7a5869e92da08c5c4c3d0a167d5685eb721d620339cc9b00149838e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABKgcy/T8RFcDO9Sc6sj6UuRZQAcw\nuHcwW+BBgVPSeNMLWXN3en3RwsF1RP8bdiCOhBBT7K73pYaektoIxcTD0KFn1Whe\ntyHWIDOcybABSYOO\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 364,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3054022843bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061102281e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ba160089327cf8ba163eefa476a4eafd0f6ce9d55292f6724d020f0efac54bf684f9d5f5695f89c2b4de70dc4ab265761827323da3b2b055ac1187fc5341e4555ebc6f6993b4c3fdd89863fc55ea38b4",
+        "wx" : "0ba160089327cf8ba163eefa476a4eafd0f6ce9d55292f6724d020f0efac54bf684f9d5f5695f89c2",
+        "wy" : "0b4de70dc4ab265761827323da3b2b055ac1187fc5341e4555ebc6f6993b4c3fdd89863fc55ea38b4"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004ba160089327cf8ba163eefa476a4eafd0f6ce9d55292f6724d020f0efac54bf684f9d5f5695f89c2b4de70dc4ab265761827323da3b2b055ac1187fc5341e4555ebc6f6993b4c3fdd89863fc55ea38b4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABLoWAIkyfPi6Fj7vpHak6v0PbOnV\nUpL2ck0CDw76xUv2hPnV9WlficK03nDcSrJldhgnMj2jsrBVrBGH/FNB5FVevG9p\nk7TD/diYY/xV6ji0\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 365,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3054022843bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061102282a460e39a48c0ff193727e795d339347984ff65457b636ed6f74d627fc8144fb81504445742783d0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044a5cf447550f0ff2efa193c3e185db604fcfd7de5c47a59a392da0c7572f061038c6af5afcfa9bd530b7682b82010c39334ba2edecf0a23bca09e810d745bdf73e445e80ace0e5399fa26102cb3faee6",
+        "wx" : "4a5cf447550f0ff2efa193c3e185db604fcfd7de5c47a59a392da0c7572f061038c6af5afcfa9bd5",
+        "wy" : "30b7682b82010c39334ba2edecf0a23bca09e810d745bdf73e445e80ace0e5399fa26102cb3faee6"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200044a5cf447550f0ff2efa193c3e185db604fcfd7de5c47a59a392da0c7572f061038c6af5afcfa9bd530b7682b82010c39334ba2edecf0a23bca09e810d745bdf73e445e80ace0e5399fa26102cb3faee6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABEpc9EdVDw/y76GTw+GF22BPz9fe\nXEelmjktoMdXLwYQOMavWvz6m9Uwt2grggEMOTNLou3s8KI7ygnoENdFvfc+RF6A\nrODlOZ+iYQLLP67m\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 366,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3055022843bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611022900a91838e692303fc64dc9f9e574ce4d1e613fd9515ed8dbb5bdd3589ff20513ee05411115d09e0f41",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045d3fef1b96dbc8ca9330508ad4ced491e627eb67cba8c6b1537937498ee3021b45ca6759117d89c4ad2b699e3ef9516fff2ed2e134931c96d28d3e14dd51c5b87589a8fa88af2529b8caa0f785ce2033",
+        "wx" : "5d3fef1b96dbc8ca9330508ad4ced491e627eb67cba8c6b1537937498ee3021b45ca6759117d89c4",
+        "wy" : "0ad2b699e3ef9516fff2ed2e134931c96d28d3e14dd51c5b87589a8fa88af2529b8caa0f785ce2033"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200045d3fef1b96dbc8ca9330508ad4ced491e627eb67cba8c6b1537937498ee3021b45ca6759117d89c4ad2b699e3ef9516fff2ed2e134931c96d28d3e14dd51c5b87589a8fa88af2529b8caa0f785ce2033",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABF0/7xuW28jKkzBQitTO1JHmJ+tn\ny6jGsVN5N0mO4wIbRcpnWRF9icStK2mePvlRb/8u0uE0kxyW0o0+FN1Rxbh1iaj6\niK8lKbjKoPeFziAz\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 367,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3055022843bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611022900b52c3cf70a58445477eab051464ac05768321fb29c7aa242b9194cab5ebc4c35e10edb72cd3ba2a1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a8336702c158dcae495f1c9cd720c39f15c123a67750dcd74520c34cf67907e49220bcd020cc3a60151a432ee3e23a74c8b8a98d8e7c672216df48d8a60d3f592f6673830ac9ecfbcd00550db7ad5c62",
+        "wx" : "0a8336702c158dcae495f1c9cd720c39f15c123a67750dcd74520c34cf67907e49220bcd020cc3a60",
+        "wy" : "151a432ee3e23a74c8b8a98d8e7c672216df48d8a60d3f592f6673830ac9ecfbcd00550db7ad5c62"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004a8336702c158dcae495f1c9cd720c39f15c123a67750dcd74520c34cf67907e49220bcd020cc3a60151a432ee3e23a74c8b8a98d8e7c672216df48d8a60d3f592f6673830ac9ecfbcd00550db7ad5c62",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABKgzZwLBWNyuSV8cnNcgw58VwSOm\nd1Dc10Ugw0z2eQfkkiC80CDMOmAVGkMu4+I6dMi4qY2OfGciFt9I2KYNP1kvZnOD\nCsns+80AVQ23rVxi\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 368,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "3054022843bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611022853bf06e43fcc4236b2ec0d88471379053f1f3437207c5a75b09036b1c40fa8f3128277894a4c96cf",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1",
+        "wx" : "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611",
+        "wy" : "14fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABEO9fpr7U9i4Uom8xI7lv+byATfR\nCgh+tueHHioQpZnHEK+NDTniBhEU/dBVRewcyKtAkyR/dydeB0P/7RFxguqpx3h3\nqqxqx9NSRdFpLo7h\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 369,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3055022900f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb70002281e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 370,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3055022900ad0b664f9559e29e46fd4fd390e75abebf14997d17a1a3304c80e451fc8f79bb7cff168e17de6f2202281e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611be6076caf0d032ef35fbe53a528ab907f24bcfb9e5828b04a5cb4174cde781612981cce088849f46",
+        "wx" : "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611",
+        "wy" : "0be6076caf0d032ef35fbe53a528ab907f24bcfb9e5828b04a5cb4174cde781612981cce088849f46"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611be6076caf0d032ef35fbe53a528ab907f24bcfb9e5828b04a5cb4174cde781612981cce088849f46",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABEO9fpr7U9i4Uom8xI7lv+byATfR\nCgh+tueHHioQpZnHEK+NDTniBhG+YHbK8NAy7zX75TpSirkH8kvPueWCiwSly0F0\nzeeBYSmBzOCIhJ9G\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 371,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3055022900f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb70002281e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 372,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3055022900ad0b664f9559e29e46fd4fd390e75abebf14997d17a1a3304c80e451fc8f79bb7cff168e17de6f2202281e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0444ab2320c2297b66114428df33fe641956f82033893398af3b49b0023179201c27d26dd65121c06e0c59524c938f19daffc2a9a4679dba7cf1991ced4700592bb75e98cf77dbf6c584c2f72735152921",
+        "wx" : "44ab2320c2297b66114428df33fe641956f82033893398af3b49b0023179201c27d26dd65121c06e",
+        "wy" : "0c59524c938f19daffc2a9a4679dba7cf1991ced4700592bb75e98cf77dbf6c584c2f72735152921"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000444ab2320c2297b66114428df33fe641956f82033893398af3b49b0023179201c27d26dd65121c06e0c59524c938f19daffc2a9a4679dba7cf1991ced4700592bb75e98cf77dbf6c584c2f72735152921",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABESrIyDCKXtmEUQo3zP+ZBlW+CAz\niTOYrztJsAIxeSAcJ9Jt1lEhwG4MWVJMk48Z2v/CqaRnnbp88Zkc7UcAWSu3XpjP\nd9v2xYTC9yc1FSkh\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 373,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "30540229009cf7f0d60cc1fb2d4b3e78d5f83b374e17a4aebccc6e723f1ad35babb2acfb2b75530389189395f802271110c5b8b8e5fa8dc7952a7bf6200bddae6c1d66639a07a4b6046e00bfa7a2bd9d5777b80c3a92",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 374,
+          "comment" : "pseudorandom signature",
+          "msg" : "4d7367",
+          "sig" : "3055022826fd695ee1cc50c2661c2434f8699577af181304bceb7690c538b03463df24334395e791f6750ff6022900b322618cd50c6a7cffcb419ec05b67ec6a117088c78d57cecdd224902d391892ca03e4bc1bd0467b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 375,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "305402287a31b7375f924369ec12bc33b834726c95444a4c263557344afa732cf48a155e71a6ee7de42e91ce022824d3d72861f4d2b551c10f0294d16a3bf1d4ee3e484439b804d097dea2d7cace76ade14af1663322",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 376,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "305502282417eb10a538921621066608243fd6574de84ef1281520f01ebe0444b46a607ab9eda8f3721779a60229008f1e2ea294028baeb738181e128c86ad55cb1945436cf69e090c2f6159f6f22011d731733b4433ba",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdsa_brainpoolP384r1_sha384_test.json b/third_party/wycheproof/testvectors/ecdsa_brainpoolP384r1_sha384_test.json
new file mode 100644
index 0000000..6388848
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdsa_brainpoolP384r1_sha384_test.json
@@ -0,0 +1,4641 @@
+{
+  "algorithm" : "ECDSA",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "BER" : "This is a signature with correct values for (r, s) but using some alternative BER encoding instead of DER encoding. Implementations should not accept such signatures to limit signature malleability.",
+    "EdgeCase" : "Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA implementation does not check boundaries and computes s^(-1)==0.",
+    "GroupIsomorphism" : "Some EC groups have isomorphic groups that allow an efficient implementation. This is a test vector that contains values that are edge cases on such an isomorphic group.",
+    "MissingZero" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.",
+    "PointDuplication" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission."
+  },
+  "numberOfTests" : 403,
+  "header" : [],
+  "testGroups" : [
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04192ed5ce547d2336911d3f6cecba227f08df077f6242a9147a914e854e6e32d325fd23ccc42921dc4a7e4c2eb71defd3631e69079ba982e7a1cad0a39eff47fc6d6e3a280d081286b624886ba1f3069671ec1a29986d84fb79736d2799e6fc21",
+        "wx" : "192ed5ce547d2336911d3f6cecba227f08df077f6242a9147a914e854e6e32d325fd23ccc42921dc4a7e4c2eb71defd3",
+        "wy" : "631e69079ba982e7a1cad0a39eff47fc6d6e3a280d081286b624886ba1f3069671ec1a29986d84fb79736d2799e6fc21"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004192ed5ce547d2336911d3f6cecba227f08df077f6242a9147a914e854e6e32d325fd23ccc42921dc4a7e4c2eb71defd3631e69079ba982e7a1cad0a39eff47fc6d6e3a280d081286b624886ba1f3069671ec1a29986d84fb79736d2799e6fc21",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABBku1c5UfSM2kR0/bOy6In8I3wd/\nYkKpFHqRToVObjLTJf0jzMQpIdxKfkwutx3v02MeaQebqYLnocrQo57/R/xtbjoo\nDQgShrYkiGuh8waWcewaKZhthPt5c20nmeb8IQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "signature malleability",
+          "msg" : "313233343030",
+          "sig" : "306502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9102310083aa7ba485dc060df9922f9ccc5da29adb75d44671d18bad0636d2e09c5e2f95e892a79b9fd3b37e1f798b157b567a24",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "valid",
+          "msg" : "313233343030",
+          "sig" : "306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30816402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 4,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30650281300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 5,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "306502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91028130090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 6,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3082006402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 7,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3066028200300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 8,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "306602300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9102820030090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "306502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "306302300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "306402310e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3064022f0e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910231090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91022f090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3085010000006402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3069028501000000300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "306902300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9102850100000030090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "308901000000000000006402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "306d02890100000000000000300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "306d02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910289010000000000000030090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30847fffffff02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "306802847fffffff0e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "306802300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9102847fffffff090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3084ffffffff02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "30680284ffffffff0e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "306802300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910284ffffffff090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3085ffffffffff02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "30690285ffffffffff0e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "306902300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910285ffffffffff090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3088ffffffffffffffff02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "306c0288ffffffffffffffff0e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "306c02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910288ffffffffffffffff090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30ff02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "306402ff0e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9102ff090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "308002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "306402800e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910280090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "306602300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "3066000002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "306602300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3069498177306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30682500306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3066306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3069223549817702300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30682234250002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "306c223202300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910004deadbeef0230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "306902300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9122354981770230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "306802300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91223425000230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "306c02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9122320230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "306caa00bb00cd00306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "306aaa02aabb306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "306c2238aa00bb00cd0002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "306a2236aa02aabb02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "306c02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b912238aa00bb00cd000230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "306a02300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b912236aa02aabb0230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3068228002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9100000230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "306802300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9122800230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3080316402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3068228003300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9100000230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "306802300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9122800330090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2e6402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2f6402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "316402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "326402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "ff6402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "30683001023063300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "306302300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "3063300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "308002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410000",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 78,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "308002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb4100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "308002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb4105000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "308002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "308002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "308002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "3066300002300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "306602300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb413000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "3066306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "303202300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "30819602300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "removing integer",
+          "msg" : "313233343030",
+          "sig" : "30320230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "3033020230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "303302300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9102",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "306602320e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9100000230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "306602300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910232090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3066023200000e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 94,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "306602300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9102320000090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 95,
+          "comment" : "appending unused 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "306602300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9100000230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "306602320e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9105000230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "306602300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910232090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb410500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "303402810230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "303402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910281",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "303405000230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "303402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "306400300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "306401300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "306403300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "306404300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3064ff300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910030090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910130090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910330090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910430090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91ff30090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "303402000230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "303402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "3068223402010e022f8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "306802300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b912234020109022f0ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "306402300c8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9102300b0ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b110230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadebc1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3063022f0e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b0230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3063022f8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "306302300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91022f090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "306302300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91022f0ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "30650231ff0e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "306502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910231ff090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "30350901800230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "303502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91090180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "30350201000230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "303502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91020100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30650231009b472fccbf6d812d65696852cbfcadddaa9ff8b1ed8f8be752cc82bc2aebfc9f6bc887fe5da9bd8a6aafb4c21c74f0f60230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3064023081d4f2c778fca6dd46ae89562a302a1f8041169e12e6de81149fa5e2d2e3b14fcd531a9f86aa3769f39f50bc4a6c262c0230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30640230f171eeb5e3caebfaa9f4072b84e994016a8f7857ffc4cacbcc49ebb08118290863722eb10dd60585d0d87d40cc8f746f0230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "306402307e2b0d3887035922b95176a9d5cfd5e07fbee961ed19217eeb605a1d2d1c4eb032ace5607955c8960c60af43b593d9d40230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30650231ff64b8d03340927ed29a9697ad340352225560074e12707418ad337d43d514036094377801a256427595504b3de38b0f0a0230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30650231010e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3065023100f171eeb5e3caebfaa9f4072b84e994016a8f7857ffc4cacbcc49ebb08118290863722eb10dd60585d0d87d40cc8f746f0230090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "306502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b9102310095c7c160c094d4422528af5fd56ee1234ee90dcd68d721b937f609f8bbaa1bb9b5e2c5c3372bd2a25796d8f056b250a6",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "306502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910231ff7c55845b7a23f9f2066dd06333a25d65248a2bb98e2e7452f9c92d1f63a1d06a176d5864602c4c81e08674ea84a985dc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "306402300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910230f6f15d21e2a398e5ea34c01e7b7760bbc646633c847d34f9e7206473f05a09ee1957f0ec3453f06de3f15912925214bf",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "306502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b910231ff6a383e9f3f6b2bbddad750a02a911edcb116f2329728de46c809f6074455e4464a1d3a3cc8d42d5da869270fa94daf5a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "306502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91023101090ea2de1d5c671a15cb3fe184889f4439b99cc37b82cb0618df9b8c0fa5f611e6a80f13cbac0f921c0ea6ed6dadeb41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "306502300e8e114a1c351405560bf8d47b166bfe957087a8003b353433b6144f7ee7d6f79c8dd14ef229fa7a2f2782bf33708b91023100f6f15d21e2a398e5ea34c01e7b7760bbc646633c847d34f9e7206473f05a09ee1957f0ec3453f06de3f15912925214bf",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 144,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201000231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201000231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201000231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201000231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201000231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020101090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201ff0231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201ff0231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201ff0231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201ff0231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201ff0231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30080201ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465650231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30380231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465640201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465640231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465640231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465640231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465640231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465640231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30380231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465660201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30380231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec530201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec530231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec530231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec530231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec530231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec530231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30380231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec540201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec540231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046565",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec540231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046564",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec540231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec540231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec53",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec540231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30380231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec54090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "Edge case for Shamir multiplication",
+          "msg" : "3335373632",
+          "sig" : "30640230705c790f8f50061c508c15fc9aabc1f58193ab15b394ab2195e358cb620a5bf4b65449afb9c417bd1a3105e53a9742ce02306dd7abda4001bc416982ab4326b5d27b1280f02b142f040ce2497f9e153e4e1e3a35c5ffaef72694e677872eb19ddf36",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 216,
+          "comment" : "special case hash",
+          "msg" : "31373530353531383135",
+          "sig" : "3064023079df11f0221de0473ccf844ca702b0d3981b8a97eb8f6884f4efeb84715d2c6ede43208c7e98db8e091e6c917fd9f0bb02301da9881957bffe209d61dde87ecd9c9d8c5cdad0e4cfb6e08ce2e06a431c3eeb2d141d3b13b5baac30ebfd622cbf5ed6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "special case hash",
+          "msg" : "3130333633303731",
+          "sig" : "306402301cfce0ce5fbf6178abb6c27db2d4a48ba5797dc9b99cdfe52f749d079c789ecbe1bd8e7de10e2ac7b83d0381ba0c611f023024c37f70691e443b1b70293100c98cf5494e0d6e0b14e4400eef72cd0aa10fb4a689f6b88ae0f0abc3af7d09eb1b0cf9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "special case hash",
+          "msg" : "32333632343231333231",
+          "sig" : "30650231008c297529b9ce5401f51e5eaeb53115f4b07066c79c4b54a9fac00638fcd16cfaaa9626dc6da6598833d924b0b92867a60230787762678f96858f222505f110b97a24987338d5e5dc0c290624c243904f65c0b5780517838a7ba217fac9ff59b6de4e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "special case hash",
+          "msg" : "34353838303134363536",
+          "sig" : "3064023069fcb752545d6576b0ce45f8903651831e79ef0e173ad1c8fdad99d6b380aa7ce4a588d14aaf0a307e5bb05b81945d1002303fc4151f72c111cd2b0a38fec138083f7d058b7389a266f7030fc55b7d69e490aee05f931c55b769cae93229e7af5e69",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "special case hash",
+          "msg" : "32313436363035363432",
+          "sig" : "306402301ff39aa7f866347b6c5a0b62bbc9329483245d524e93dbae9fc350197143460ba6bff2a12401ac12c575fc331d89042a02301591933f0e33894abcb72c0e53de6889a00ebc0ab5974d3ab8613a493b168db33da5118f3f3477a73df49af27ed80d05",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "special case hash",
+          "msg" : "333335333030383230",
+          "sig" : "3064023061d322d16ca80620bb093333ac1f7b5f38ad5d1bf39b686471b3838d194a4337d3d0ca300125d4b724dc6c7cd1b0aa000230595b3d2e24354810c5d20dc81b2ba3d719036c7d4073b170d31d210f58f3b5f7ca0f03007e33702be149517f8ed69ab2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "special case hash",
+          "msg" : "36333936363033363331",
+          "sig" : "306402307c8cd6b9ab6068297f8bd2f4fb5cb86182843b80dd7582317e817899c612bf13bcdf520dcd61353f27a4356dbd16707002304331c14c7f033c5f6e5d9d2de76a9020b426357d5ddbaf125765b8ed476a18ebe1bafaf9417bbe0f8f9672fbf20a5cde",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "special case hash",
+          "msg" : "33333931363630373935",
+          "sig" : "30640230771117177496a9118f2883e57f63a58998d57879166659314c508b6028094d4e16090f277acfd47e097f5bef3dc6593902303ec4bc040aaf47f9acba6093c82c3e07c1e607ee238bebb5db96596964bc3af7e57b808c2f6be04128467a56577b40e4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "special case hash",
+          "msg" : "31343436393735393634",
+          "sig" : "306402306a05488b75acec4718d7164ec19dcd6d351a5fb2852afc4915e9ebcd8073897a5d559dc9ec56a5aae400dd0cdeefc71602302e511d8bf60ebe468f5e045333d43d4be59b4393c8e650e3e6fabcbf10da7ae5f2318bff047413df4dc17fb372d98d8a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "special case hash",
+          "msg" : "35313539343738363431",
+          "sig" : "30660231008542c58427f1deb1dbd36227eb96fbff153edbd23ebd13e786a52e4863c888a2dd50941654e551a4fca91b5bf351978902310082b68b14b608032945bde3d7061d5f687458ede1b302af8842449788f8314b108579f6c528bdc800afe6b2c8b185fb6e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "special case hash",
+          "msg" : "35323431373932333331",
+          "sig" : "3064023058fb974bef2acaf2547cacb6f0cc934b5991c66eb7a223755209acaf5b9e4b0fed712c76606c59c1014ba2c2eb1bb32202307d9e265dc09e031014182b369e15b4a34dba3901062d627cffab561e73d38bbea907272346fbb247d3ec63564fe1cbef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "special case hash",
+          "msg" : "31313437323930323034",
+          "sig" : "30640230065ed5994d4b498af7f5ab7d4c08810cb76d242b5d8b7b5537cb8afa6ea852ab714f66b144a486d05b2a56f2056baa11023037e676a8d535d0a818dcecccaa4783db6d254925a00dcf6a035a7d9e0d677dc78195a7eccfc7beee8e8eea7456c3699a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "special case hash",
+          "msg" : "3130383738373235363435",
+          "sig" : "3064023025c147aa99a615a34a6bd152d17184c48d28bf79fa6fba928e678ef638a064da79d5f253f7feb8915a40d6437b7bdfa502300cf7e14c03cf67895721cc2fbdd62d6a0f89aec43dd123d51f813d9b5c82850c07d089e7aea0df2f597e6a1c8e2bfd29",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "special case hash",
+          "msg" : "37333433333036353633",
+          "sig" : "3065023100853df8d619f3aa7dd0bdd24c34d387cc59abff4a0585e2e9c82066e4d2e957b0437031bc1284ba3d39545d5e850e27a302300435982cefe2cd1581f378c6be16ea77284a178b3f0dc14c169c9ed863cc4a8d8f78651380609df5e05b65041dd7a201",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "special case hash",
+          "msg" : "393734343630393738",
+          "sig" : "306402301b29b1e60895a4920d6861836faa227765404602f4bba3b4faa888a4b1693a7c8b585b59b942487122a9889f4f1454ef02307d9fcfbc2ee71fbe32a4262e4777daa38f9722b0a67500b950aae4b469bff9525ae1de389cc17ae719e24ecd19728441",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 231,
+          "comment" : "special case hash",
+          "msg" : "33323237303836383339",
+          "sig" : "30650231008937dd05004f6e782a2c91c8d79f40795d169fab6af385f91f5cee928c2a22869f10938ee2edb3ed0e0a0e38144d5064023048c692b4b88776b0158b99e15e99de3955ab9d884477418cb740ff917a704c7707f39954186a03977cbedf34bac02715",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 232,
+          "comment" : "special case hash",
+          "msg" : "323332393736343130",
+          "sig" : "306402301e42fae83460bb8f30d7d6bedf984622a55035d502fc2d7f9ce52c56515fd66d1d593094d4167f4ae051f2b12d0e67ab0230284d00f98f29202f03b37971978eebf2fbfb94bef2b4d63fbed88c7d29d18b61ca409882aeeea97e30a0b156dce2bb06",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 233,
+          "comment" : "special case hash",
+          "msg" : "3934303437333831",
+          "sig" : "306402302c07e185941b20628df84808ff9a010e5e112c0632cb3231266e8418ab06f6f18eb41f2f98a5a0ca1a462339228fad9a023029051e9231d68ab462ba7aaee39edef69c05f81ba7eab161454bcf4969ba293463e6de2e784677e8d2a92953400fe957",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 234,
+          "comment" : "special case hash",
+          "msg" : "33323230353639313233",
+          "sig" : "30640230030687253ad2ccb94342d325a8ad19278ff2ac8cfe00209ab030c7997b3008d4e9588ba2922d62e75a5e6cb842324f720230752ae1bdbd94e35bc57815d2758b1fdfee706f410c0ed966be8792eeb54cae8631baa0c095e0742d6dd7d1e0419bc588",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 235,
+          "comment" : "special case hash",
+          "msg" : "343134303533393934",
+          "sig" : "3064023039abdc1943608ef4f5c46bac7ae1e23d2e3252e6fcc2b0ce8f41501df024b7d297362401be87b122bb9ccd98daa533ce023058f8d8088faf75fa06d76e8cc10a1d7bcfc225d58b75d8a204e6a5ce4d6d95146e853b6818746cebf7864facb44a2189",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 236,
+          "comment" : "special case hash",
+          "msg" : "31393531353638363439",
+          "sig" : "30640230510f5602dbf3a095276e99a67a65249217c6e6c168a6caa64f5aad806b57d29002e60786c6f3ed274690583d18cde72b0230687568eb41af3f5ccf7f2b16e67a1f4fbcb3bf683d86e49a61fff0c28fc03d797a722af9b02c391a49f5669c7968db1b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 237,
+          "comment" : "special case hash",
+          "msg" : "35393539303731363335",
+          "sig" : "306602310084bedafb46873274ef91de67b20375c7698afbe37f3d5bac1bbcabcbb4aa6616b345267fc9d5285baacca6f1b694619f02310089b39165949cc435503f4a6ac5754d2afddb99b55a3ba840040d51624a0985251f2c9787b5cb266a218143db5b041879",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 238,
+          "comment" : "special case hash",
+          "msg" : "323135333436393533",
+          "sig" : "30650230251b50b63fe1cbae210431bd1e76563f078454f7c2b2e475abc1b7758920f03b971112c62ca6132a480738768edc35d30231008b8c1646900601de4fc9c9dbea228ce9c9edbbce7c31a42d3cba580e191c92d123e11c0634b87bc094cff16e209b6954",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 239,
+          "comment" : "special case hash",
+          "msg" : "34383037313039383330",
+          "sig" : "3064023034b3c6afc0fa7a75385e3d0dbfb237b5c76afe16f0f69e44533b7ac3abf4233799201504ebec0310b2fd7e867f9fdd0102302f831f5955c2e4fa5b298bef8f09732d0b15ea7ce141a6dcdbbc60378fd9c969339e826def5681e96f0a1dbc36adaf5e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 240,
+          "comment" : "special case hash",
+          "msg" : "343932393339363930",
+          "sig" : "30640230335bf6b152647bdf8a3c5de8de3c69832101902679bc802612d2f4bff8c7ed7df225a080eff6deaa5dacc74016c5ce3d02307f1b116f8d27d894ffe6ab57546851baa5513d110e6960d713263afd542e97f01f4df4f7b64d49496d22c2f6c56050d1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 241,
+          "comment" : "special case hash",
+          "msg" : "32313132333535393630",
+          "sig" : "30640230329c5d35adef357339f901657af55da7b041e8c18374c79ab44449b27a83022800f0c938503bdd85b7884a32df9057fe023074f56101c7f7b36d634c2175a0d17cec0546b6cdf18e86ef9abb6d6d0bccdd0442af1255e02a5dde707840db48543170",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 242,
+          "comment" : "special case hash",
+          "msg" : "31323339323735373034",
+          "sig" : "306402301ac3d463df221945adbd28a746817ba83d5957d95657c724f1ad68b98bde6bf7959f7363253ece174d7aed346410dc2102302a5a30a8191a4883babf69ba883af7f5067bc990f8dac4a35bc6ef387102fad85d268564c61246dff17510634168a1ac",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 243,
+          "comment" : "special case hash",
+          "msg" : "32303831313838373638",
+          "sig" : "306402305cc9a074e10c41724d55502d72430d707ba755c41d568d79987dc3cde45cf6f70341f91fa2a20e3ba5b57febde05b5c402306d8025162af30cfab2cd16a1342b4174ae171dc3c75bc1fe994ec6c0359295f0390e65856aec5ebd894a15c68577ab0c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 244,
+          "comment" : "special case hash",
+          "msg" : "343534363038393633",
+          "sig" : "306402300c13ddef4e7e83163090559fa592edba35a92d66e54a34aae2905a10b03a316ffd0c013f7b061909f3a924ac25f1c90a023040ab2d40b4007fec32a647784ae4a2d5cb4f7042cce8c374298c345180d0e38aaa5d73875eb859b082d0a17cd496d20f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 245,
+          "comment" : "special case hash",
+          "msg" : "31333837363837313131",
+          "sig" : "306402300af74a3ea3c4121711d10f2e4d725031b1b08cf8eff22834748402453b8eaa00b1578611ee45220753bcbd20a391402e023015eb2daf4fb9321283f69157e7c747d6376759d0130e790552b4fd89577139a28daed43ba976a76bec1c7d53a49c9822",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 246,
+          "comment" : "special case hash",
+          "msg" : "32303331333831383735",
+          "sig" : "30640230674b6ac9890dcbaba4d744ce9992e9dc698e524b0d1cf4d76d355372631d6f7dce6ff5a607273c0c1469d8e5b12ab60e02307cf8f98328f920d29475d5cb38bc35fe71ffd87f1be788d202908eb939c76b7694cecfc21dae50f433773d75e279e303",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 247,
+          "comment" : "special case hash",
+          "msg" : "323535333538333333",
+          "sig" : "306502310089ab51357a7db36d1c26b1e906088b9aa3e3d59658e2bed55dd03deb56908677a59a4b24cd65eae6351b03a9300ae5180230395e10a6accc3c6e566844c4fac4caa2a8ceda4751df5aab5b3275f825c5940b1db60886f1395318110ca53c69328352",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 248,
+          "comment" : "special case hash",
+          "msg" : "34363138383431343732",
+          "sig" : "306402305b3f30c83acaa088a372d5588229a3555dba14fbed8cbc2935f6f6eabd8077c853dbc7b2e354683d41dce5b5d4c9de580230767024280e5e131b4a46d66b35f2b304a55e6481f094b355e873a7f861029602097a4d300136ea005bf5fbc10843ba95",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 249,
+          "comment" : "special case hash",
+          "msg" : "31303039323435383534",
+          "sig" : "3064023032e8abc36623fcb2034662105066afd71fae4d75b8300e32bef4632fac65ecbd285c4061ca64f6813edd2abfbcc213e802300b0013e2a56c36de1ba19a9c304869f3d69806ece6f4a801c27a3d4f1c20af5eb175e95e734ef637653a6cdb2a9ecb44",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 250,
+          "comment" : "special case hash",
+          "msg" : "32373536343636353238",
+          "sig" : "3064023045df529d2531d48cab412b680cadb532cd6225304fb742841c89545959b79e198c3b1297dc5c4bd9aa7549193e0780d102305c8f62fc4852069d35232aab7725715e9157d1aa688050f896d690dcd4e41baa66ea6f9b34deea5a607cc391ff097d7d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 251,
+          "comment" : "special case hash",
+          "msg" : "313139363937313032",
+          "sig" : "306402301020078f6e5717538fef879c5635d4d7d52721be1529585b0a77083c5f347f21b1316d0399a8bc17b367336475a6d97e02301ade87ed2e2bdb2481a027dd3fa5b93a81f4ffdc33d4a908d97b40f841821c02929b036135f419752c88d57509d17bef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 252,
+          "comment" : "special case hash",
+          "msg" : "323333313432313732",
+          "sig" : "306402300d93d5c63741447fdbed17a738a41efdbb7093333797499fe70d5c54bc86b6bb650424bbd64907375ef92efd13ee25ec023066192ac1fb22db75881df7ae890da4953a74fa954e0b5e6b692eca23c3bcfd5fb3228d092d9991071baa4b6e8fa206ea",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 253,
+          "comment" : "special case hash",
+          "msg" : "31363733343831383938",
+          "sig" : "30640230049334bf43f7d9c213443c96c4ba119b335757a3e69ba873bdc4ef642139b8687a8a5782b6a900211d6fc1ecf14c2cf90230182990bee4787267b6d63b7ea67a25852951d145cf5a39d201babe9f3f1120924e5b283eeb636a8fbbb0c2fc66ddf755",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 254,
+          "comment" : "special case hash",
+          "msg" : "31343630313539383237",
+          "sig" : "306402306b0c248fa39317621af5344f978bd765ec6125cce2f40cdddfa40f7e8c7f4fe9216354bdafc2067288c56794eb5d17d202307584c077ad35b58fb29403b9c2c641271794e26b241dfc8d74d4daa7de3f076c9c4c6d3909e2c0ab9b9a702c0812eead",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 255,
+          "comment" : "special case hash",
+          "msg" : "38393930383539393239",
+          "sig" : "30650231008c048a8eaba1b654c3f687df01714df3b61b98e578205c804a72bde32daae87b37fd2f9f5f82b3c5f7b4a007eaa1986a023030b79f44c83bd52e537ccf9a35772fab5ba9faf0decbe34763b5ae280984ac7ff27fb8dbad57218c364b39dc2a03b5af",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 256,
+          "comment" : "special case hash",
+          "msg" : "34333236343430393831",
+          "sig" : "306402302ebcd94d17122442d3e7bd12c4b609dbceef69b3246092e4ad0c83d602c2516e09169b592fdf61a7e881e262bf495714023070392cd4e5e17606608c2e4ffff7a9c0e9171198915cf7e50633263d7e071954f12ebb1a4f4acc7683a160d64dda3b88",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 257,
+          "comment" : "special case hash",
+          "msg" : "32333736343337353537",
+          "sig" : "306402304d7191596f50b8309e1490895e62b16c415c1f7b50d2a4260904bc5b7bffde4f92687b029f326f4b48e6fd8d1f19ee5002300a54515fad47bb08e586697f28e2bbf98d7575c7bb911bd74db3d9aa848475bbddac66181efd63a24918dec2dd01a2d9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 258,
+          "comment" : "special case hash",
+          "msg" : "383630333937373230",
+          "sig" : "306402306fdefa7d912cd2c30cf12bae608ab87de12d49ee084d239081e89246e4939d6071dfd11f7401894aee9c13d11013ec7502307937495dc0a3a3d66c43945d99cd98dc842ae8677f14d649b22c1e7ec14857a05639ec1fe08be228112832b5e32fcf15",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 259,
+          "comment" : "special case hash",
+          "msg" : "35383037373733393837",
+          "sig" : "3064023005867e5f8abd704007b98c1a8f2c69f4eea14cb4a4210262b474c4eba9073374cab5dd1bb5c781df040df32bf7943187023068afdc70aaca5f1b36ef32593d889e377d3f83b329386c982acf9b401b7cd26b75a5389395c15d507d7d67023d6d07b1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 260,
+          "comment" : "special case hash",
+          "msg" : "353731383636383537",
+          "sig" : "306502310088d5f4069be31fc58a38fd8de9dbc7fec64065de4268d41c8db799d0a20ae10492c7e80b30034b7f321cd49b2b9c3f33023009912b63c4f88be77211ab533cf13f2b63472006aab5e70df21b87301fe5139aaed4845a421b0f076f968ae4b32490d2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 261,
+          "comment" : "special case hash",
+          "msg" : "38363737333039333632",
+          "sig" : "30640230750e5baeef6934b36512572dd330fa88353e321a521363bda889fd257e4ea4024fb5f92e39f265d789d2a949dd91843b023018b8467c63892514847c3b98ee279e3f41b391a47975d7f4d6669385ac0bd2e322f88608870310b635ad28256d8dcab5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 262,
+          "comment" : "special case hash",
+          "msg" : "32343735353135303630",
+          "sig" : "30650231008bb6569737c5e01d2596d3ba5d01890f231136c69c6c9f42a944f06602296b1159f29fc1d98b68be06f3052c5fa8619b02302d1d4ccd79b00998acf03d3412888f27d274b8788742be27d798dd7db654d964fa4cde3384d88c2a50247792e8820ad3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 263,
+          "comment" : "special case hash",
+          "msg" : "393733313736383734",
+          "sig" : "30640230277b8fe00651998cdcf8b4f40795f454e4dca2fdc2c10dce1fff8f0c852aac0bf6183b1ac3c3826706c3e659854198a002300d71f3f3f681fc391c3cfdb81b61eba0155cb4a8e9ce8049cdf9b459aaf264525fbb893eaa71593a9618c0f117efd90c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 264,
+          "comment" : "special case hash",
+          "msg" : "33363938303935313438",
+          "sig" : "30640230269d14d9867ed23410caf24f5f9f171bc0e52f006d8d16c02c81f1b4edba222de7351ad72943ed09a2e7ac176a1b215602304af93b800fbdca45ac74cfd22cba9a508739f8fcf3ce14e55c39bc770a143f809970e836447a4542d0bb367de6612c89",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 265,
+          "comment" : "special case hash",
+          "msg" : "3130373530323638353736",
+          "sig" : "3064023040731dbe64636cd5ef5d2560a23f3891accf0a530a446c6ad213b4ba7ff9cb505aba9331836ab8a98fe565e866c87979023019eb3cf6b5faf11e9717d6d0449624a509358936dd0067ffc18f22e6bcbc6aa1df3a45f15ae732197790cc6fdb92c3f0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 266,
+          "comment" : "special case hash",
+          "msg" : "383639313439353538",
+          "sig" : "306502310084335a1c93d996e36c22aee4f33ceff7c6ff088cd5604db8275098600666144607bcfac7e695f2f79a775628a1ab6f82023028ca8cdc6bd772cc9f24c14ef71332f192fefd52d03b8df99a257f315e0f6f3296e4a45fd182f06a3d2ba2779c10a40c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 267,
+          "comment" : "special case hash",
+          "msg" : "32313734363535343335",
+          "sig" : "30640230520b74d5d33ba289ffccf5187a6000380c31304b1d6f8fb54d880c1908fbd8df5e0857ffa8ca344ff7a4fa9bb6ed5f38023003ae877bc1f0bc8e7c9039381f0b66a52047163cb78eabd7a3dbfc538b424fef31d1e0af76c0e1bed7936a88338f1bb6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 268,
+          "comment" : "special case hash",
+          "msg" : "363434353530373932",
+          "sig" : "3065023059492f3e58b5bad9412105b4824dbe939d7cb2864a27680620ac107285505c42ebfaeb154c4eb6d9e6783a12abaa35aa0231008b4114caf3260e509658243a5f4190e40c268d012578df86866a4e9503c8490804882d0812aa105e245c8c46fb36480d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 269,
+          "comment" : "special case hash",
+          "msg" : "353332383138333338",
+          "sig" : "30640230421dc854479aa611887aa3689b63276fbdc16ec7d3dca449b482dd27b1403c911ef6265ad625279e9d83ce7534f4ac3f02302852e16b4276215a62ebcbcffaddbdb2358dcea7084948bc948f9b3d0f91693aba66362d4a2cec70f7952e374886211b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 270,
+          "comment" : "special case hash",
+          "msg" : "31313932303736333832",
+          "sig" : "3064023049110e413aa3e02fc05937d100ae4db14cf3f0038b38679a4aa297b11f9c47f7df538df8cee30efda4ddab2cc51a6b0f0230018a09a18e1e7983e52b8e6cc8da9c6d7155c5409082f69587420906b75cb5157d3758e992b223eb7e9c274fbff4a973",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 271,
+          "comment" : "special case hash",
+          "msg" : "31353332383432323230",
+          "sig" : "3065023100884cf64ce726d5758efb9f2f35c92dcc6063b01b7432faffd0f8186ac177e31129633a648a1a6986148384a7d1c4d3f5023001850718d7a2d41eb9892f5440ef4b9fc8b996d3b6742eaec3d40b10c5caa890b9a853e1d211f7fd1178116a9e7c5f4b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 272,
+          "comment" : "special case hash",
+          "msg" : "313536373137373339",
+          "sig" : "306402300d9dbf8ebcf80f256ee2d1f4fb45cd543381f6275c4c10afa85208828e27e6fb3df3ca7491899c68307db66a505c7a9002301f0db26dc691680832b3e359905e5e632bc9eaefd1d5eb4f058a0d88f8f2df0d1a60c2f77172caf6554b2d256cce8c67",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 273,
+          "comment" : "special case hash",
+          "msg" : "34333033303931313230",
+          "sig" : "306402306fa1802ac4c2e79b8b5a477b0a5febf630c29c089841484c1d569daedbf13c0bdf793d0a8f6915bdc67dd1480824a1ce023028b8063258111e32aa10af0b2068c7f54f0d5e9f02ad39a415c91743d6444c20156c3592d2bcc234f265b46a35864e57",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 274,
+          "comment" : "special case hash",
+          "msg" : "37373335393135353831",
+          "sig" : "306402303dc1363dd0119a5054afd99484026a2692567d2fbeeb4c6d80a30d22f166b6304544246a35ba854f854601397ce45bd502302b020a770901108ce6ddf69117a2e80734788171604a8f0571db61a4a8c3c4dae33af841afe4a9892306b4f9ecb19b49",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 275,
+          "comment" : "special case hash",
+          "msg" : "323433393636373430",
+          "sig" : "306402307b984bfa807a8e9b0eef94ed28c24b04d42e0664fbfc0ee1c1b5945c8f0e97fdc515fe09edd6cdaf7fef3151ca4044df02304e878741529d7a90125deb8fa5fdab8e9f7d254b8aa48a59a2f335c7d43402f2590f1082c76b2263582c9dd98ca686cb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 276,
+          "comment" : "special case hash",
+          "msg" : "34333237363032383233",
+          "sig" : "306502310087731525e787239a232ba3c24b9caeff3ce591c168227b8e2864140b1d7c0c50a7d5fa9f4f6468bca817458c171aa4470230670598b6e5dfbaab3b622bad9b5b6ae42c9d27bd45b1b0b892af9fd9739dd50414e8eede3c6dc10fc224463b44c8c23b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 277,
+          "comment" : "special case hash",
+          "msg" : "32393332303032353932",
+          "sig" : "306402301901d0d861205cc3e3f4a189b879ee246486f0cfdc481d63727384feedc46c8baddf891a6e6eab6bede4e46bbff1649602304017c9eddaea3112f26f7c6ee472ee1983d7a296a7402295794fddd9e267fe62d85b07b99e81ea513eca8d1a67e705a0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 278,
+          "comment" : "special case hash",
+          "msg" : "36343039383737323834",
+          "sig" : "3064023004143d73f140febac8fd4d6762b9a55bc93264cc3372bf1661b35a4b11be9af7910d3aa8e4f5cb5eafe1de3a9d96957702305966b4e1e9ef78e523916dbea37e03ecc356f466441dc45b9b98fe6d09af83e7d57a861c5d2cf94bf0b87f62752b2824",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 279,
+          "comment" : "special case hash",
+          "msg" : "36303735363930343132",
+          "sig" : "306402305d24a6cb0a9f7f8b9f8d72da989fcbe85c9448b425a368207fce8421e5a60f029184f18611b9a5a1eb66d054d36057da023032b8a4d4aca17e8335d84f2a68d74f38d8cce5297efe9e6d0e1a8e5bed1b5759bcb73cff28062963a28bbc1c571e3e1c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 280,
+          "comment" : "special case hash",
+          "msg" : "32333231363233313335",
+          "sig" : "306402301d10c1ec203fa05deed62644b809150cd5e3fa15c9129156fbc0477742328d8d35b1c4ca8baa6138e2e12936a0f4c33202304a029bb52ddfb171e4b125d3326deec488cc9f6f2b36d051a35d75c1de4b7abd178c7d4390e511f14d58f49baef62dfe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 281,
+          "comment" : "special case hash",
+          "msg" : "36343130313532313731",
+          "sig" : "306402302dcda31189d8d179f7deff208aea8bdfe0cb08a6da46f663c5ca649c84d8fec9c4495921c7791d32aca42557c3bf658b023067536e336428bddfb0862bff5bf5d5b1694b82c1e1485498e14fe5c88f75a9d7f520115a35703cc30ba0ce973815189e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 282,
+          "comment" : "special case hash",
+          "msg" : "383337323835373438",
+          "sig" : "306402302cb81c03c3cefc417fc60f19b740e230982e0b1c68ced12121300d533f485597d1c532d87b235d136be3a43dd85882ca023048a04c5d8d867e8849bd3b981f010691f0e7422882573bd5bfcc33d6f069a622d159ca71bd562502ec001bd2b453712f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 283,
+          "comment" : "special case hash",
+          "msg" : "33333234373034353235",
+          "sig" : "30640230152464668cefda80dea5232d36bf240ac325e3ca279d8c8e0458306b18fb12ac1ed16586d2d07562691c3205ebb4c77402303c385567269279e9bc5a2d076ae9a09e790d1d8d08978871dfc586298f56121b4bc84f7891e91c3d7612249d320e363f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 284,
+          "comment" : "special case hash",
+          "msg" : "31343033393636383732",
+          "sig" : "30640230052595a16d03a138d656dec75a5540b80f7efe63b193250de3bf811fb2799d7eb9a6ae274ac953a8fbee741dc1f52100023055f0594ffa8d32b91eea8bf079b8f5a9f6b60888500225016095b3e71181ff32dbabcaa5e992b43409f55467bbb65125",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 285,
+          "comment" : "special case hash",
+          "msg" : "31323237363035313238",
+          "sig" : "30640230296f6b3851553203822d7417c176eb3ec5e556e352d24f2834bbdf7089a168e637f3e80999e7a8611466dec370590029023064f796945f53fe0b27bbfbc5b5e957d4132c24c8b462075e821bca24983e8b8f850531617a42ed3157dbe20eab31cb28",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 286,
+          "comment" : "special case hash",
+          "msg" : "34393531343838333632",
+          "sig" : "30640230619380558cd14ac909b565e049afa224f7e720af1b22e18b59cb055fdc0f191deff46a6050d1642c5636c032e9a7b46b02303c3fd2f278f07954936c6183da8aafc0f61319d9a90b7d3dd11abe13e55e2afa81512f384c13331af1d6fb4d7c6929b3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 287,
+          "comment" : "special case hash",
+          "msg" : "32343532313237303139",
+          "sig" : "30640230354ee949bfaca35b1934e88e036b7f376006b79886133d07ff4aea3e057eeeeec0b93f629961c9ac1ee188c1c87e2cd202301d02624a9110f7bad63ef70e134a7ff572d772aae30b4de679494d00ba9cd835d4ec840d772af9f7c0b0dae8cad3837a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 288,
+          "comment" : "special case hash",
+          "msg" : "31373331353530373036",
+          "sig" : "3065023100881e4eaeff3d3ed173daa166223d9583ac8dd28a310765e7261b0ff52b2b3fafee805d613258add6d056157ccc40da73023053bc28cffdedab6452161e05517194e66afcc14d107d1e5ded729f661cd6630d8b6581a8c25251ed7c4b5c364129b58a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 289,
+          "comment" : "special case hash",
+          "msg" : "31363637303639383738",
+          "sig" : "306402301734f666ae2d87271d9ede0da53ba8fc6cc2f83edc15dd26b9349c9e4cc5380434fc37b4ffcfd9b781f07125d85dd6600230531daed4b855e9117a1ebafa232f06b47f50be4386db27ffa5ceca3e247be95497565c0c97b437d32d7694974b22f2ba",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 290,
+          "comment" : "special case hash",
+          "msg" : "343431353437363137",
+          "sig" : "30640230296917dd85475f8e7b6f858e84740bfa967996e173d63d85aa08f1b6d3683097395e4a7648d14e0bedbbe3667d3db4f502304d3e0279e93bb192f24418a0a05bf17238dcf78dbe8343e55a663418106d7ae22845943459b2641f45ef4ed606c53437",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 291,
+          "comment" : "special case hash",
+          "msg" : "343233393434393938",
+          "sig" : "3064023047f3150db2f4fa598ec25dfe864e11f92bbdd5d6046aef744b794f56704e323cde1eb6eabdc3f72f8940d6a6fb30a1c802304e41a74f6f6cd1950df41133c58608fbd8fb92b17bd3bfbeb1c1cc778489a4fcf884e8006546cb69fa9d3492652d1255",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 292,
+          "comment" : "special case hash",
+          "msg" : "34383037363230373132",
+          "sig" : "3064023041b903c255e90cb719b74684ed9700a924362ecd1cc8ce35b44daa1d41e3ae2ad3df2d01b9100337efbab68c53c6c76b0230471f451c324025ddbfbe359f1d3ac5e40f712b4e8ae0bb316f54a1ae1def08c95f53ecc51afc375de4368d03d5095964",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 293,
+          "comment" : "special case hash",
+          "msg" : "32313634363636323839",
+          "sig" : "3064023061b9b042fd654ca9c685aaab03ed0544e39e1848370537a0d0ac42ea7453d6853795695dda8f4c349b897c2f61f950360230634d5a0a8c8571f7685c6c4b68de8b2916d8af2233693a17399acb6048a4d1416ed3b2f91b7853868def58a0eaddce51",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 294,
+          "comment" : "special case hash",
+          "msg" : "31393432383533383635",
+          "sig" : "306402301ac6ec442cbcea48a8c404ac27e42e2122a121ef8484bd91c04aa259438fed1ee8a80ba59464b8a4351089923bb01e92023078c0ed4eea7fedda04dad0d3f0d228bc54148b1238c63428fc39a772146947798965caf7ec9276a05a972ca1e4218f84",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 295,
+          "comment" : "special case hash",
+          "msg" : "32323139333833353231",
+          "sig" : "306402306df0b36456bdcf91f6657d05b93738771f183912e27b9fd888af4850b3d979c4b7cb042f27e38615f054d5175938131802306a638be5f77cbec37a9766036efbc900498ee4fc850ac983e5b602c9483038da987374d755aa089cfd50bf2cc2de3b95",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 296,
+          "comment" : "special case hash",
+          "msg" : "393236393333343139",
+          "sig" : "3064023031c868d4f028e318c6913a8d1af08abb1f8ad961a85338f8baed7cbd8d79e1337f35be3b03f1f62c033f1388d62b701e023077a8d63de68f69ca299aa3ebab0836d1e717285bf403683e03210bd2a333d7b61984d1e13918913c8d1e7d6a93ab7f69",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 297,
+          "comment" : "special case hash",
+          "msg" : "373639333836333634",
+          "sig" : "306402307d45c7dfa59f13830e9dd79a283e2129d5829be4cb84e04369ed3bfaa08fdb38ea643cceda163fdbe5016623d3f1e41e02305b51f7b0ca780125dd6f60d3b40923fcafe6e0d49b84b3dbe508bb169459495a8420028a3e4484412048429e67ca6037",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 298,
+          "comment" : "special case hash",
+          "msg" : "32373335393330353733",
+          "sig" : "30660231008732951e64e15ec1203332b9ca9a1dfbeddfb0d1231d0e2898c099f75efd4de9a46db9a780539bb0e28435d5b297007802310086b21184542ce50d046d49ec539d33569a5cc45c6432d965fb4c455c63d448194355771d7ddc47af74fd2827e1d72e0d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 299,
+          "comment" : "special case hash",
+          "msg" : "38333030353634303635",
+          "sig" : "306402302631c759a6a86914160766b94a4e4f474a0ad679b5afed8a7237eac773c6b0d67ff3ec36df3730e81adeba58d6e29517023016209dcc9237a9ae32d862b33153943f1eaf2a92146af773cf3e5bba48a8551d9c2fa12a01dff3b005426cdaff05a8c0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 300,
+          "comment" : "special case hash",
+          "msg" : "34333037363535373338",
+          "sig" : "3064023059b12f6220b046b08f892d69baefc81c510cc25ad090616b350606084216e6c40e1d8cd96a1b315e64ce1d84986d89ac02303994a6852b2377dcc80935e2ea1eaf7889ed694cd321bbda342dbd57ede1a47c2b30de46bb05cac66a6235c4bb290c5c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 301,
+          "comment" : "special case hash",
+          "msg" : "39363537303138313735",
+          "sig" : "306402304f69180fb660597f8e70334b7b6fa97e5928a6c175de912905261f3e1f4df1752d3415370e6272710c7bd4bd42edadec0230445b0b78099bd99fa78a9945d7bd2058a900b94138d67abd37fdfcf2e9fab6644cb1a8c376163ecb69955e954ce8c320",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048a94164dc7654fda3cd4301d3e972024c2daba71d442128c7f3faecdb9e375a85aa80c4ac28889f258e6cba886d47636548b3bf1b675f2318c3d8ab7a1c281a33241c121b3590bfdf703c7cd4bae8f451886d989234c1b8c589614554d429392",
+        "wx" : "08a94164dc7654fda3cd4301d3e972024c2daba71d442128c7f3faecdb9e375a85aa80c4ac28889f258e6cba886d47636",
+        "wy" : "548b3bf1b675f2318c3d8ab7a1c281a33241c121b3590bfdf703c7cd4bae8f451886d989234c1b8c589614554d429392"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200048a94164dc7654fda3cd4301d3e972024c2daba71d442128c7f3faecdb9e375a85aa80c4ac28889f258e6cba886d47636548b3bf1b675f2318c3d8ab7a1c281a33241c121b3590bfdf703c7cd4bae8f451886d989234c1b8c589614554d429392",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABIqUFk3HZU/aPNQwHT6XICTC2rpx\n1EISjH8/rs2543WoWqgMSsKIifJY5suohtR2NlSLO/G2dfIxjD2Kt6HCgaMyQcEh\ns1kL/fcDx81Lro9FGIbZiSNMG4xYlhRVTUKTkg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 302,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "313233343030",
+          "sig" : "304e021900f39b6bacd3b2eb7bdd98f07a249d57614bbece10480386e80231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046562",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 303,
+          "comment" : "r too large",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec4d0231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046562",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0473f84ab63789301e88b4cb82cb935decffb8f42b2c9784c7544615b9076ec7a7ab94702ca7f1d9aacfb90537b5d368dc502cb7c8c18285994c7b19fa3e2401fdc26de54ffe006bb79bdd7852c666d730bdf76a16c0792a6c6681ed6b647fc81b",
+        "wx" : "73f84ab63789301e88b4cb82cb935decffb8f42b2c9784c7544615b9076ec7a7ab94702ca7f1d9aacfb90537b5d368dc",
+        "wy" : "502cb7c8c18285994c7b19fa3e2401fdc26de54ffe006bb79bdd7852c666d730bdf76a16c0792a6c6681ed6b647fc81b"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000473f84ab63789301e88b4cb82cb935decffb8f42b2c9784c7544615b9076ec7a7ab94702ca7f1d9aacfb90537b5d368dc502cb7c8c18285994c7b19fa3e2401fdc26de54ffe006bb79bdd7852c666d730bdf76a16c0792a6c6681ed6b647fc81b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABHP4SrY3iTAeiLTLgsuTXez/uPQr\nLJeEx1RGFbkHbsenq5RwLKfx2arPuQU3tdNo3FAst8jBgoWZTHsZ+j4kAf3CbeVP\n/gBrt5vdeFLGZtcwvfdqFsB5Kmxmge1rZH/IGw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 304,
+          "comment" : "r,s are large",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465640231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046563",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04895e8461eddbe21367a95b25cd85cd31e80ecf1f95539056fb7e10b4aa49900b2194d919b29cd9bf373a1d53ef571174767c02e36b935a65e5a9cbb35589a2a018482065c5e33da8ce483dc7f7fe441574f9e7ab0614bdcfc61022c780a30009",
+        "wx" : "0895e8461eddbe21367a95b25cd85cd31e80ecf1f95539056fb7e10b4aa49900b2194d919b29cd9bf373a1d53ef571174",
+        "wy" : "767c02e36b935a65e5a9cbb35589a2a018482065c5e33da8ce483dc7f7fe441574f9e7ab0614bdcfc61022c780a30009"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004895e8461eddbe21367a95b25cd85cd31e80ecf1f95539056fb7e10b4aa49900b2194d919b29cd9bf373a1d53ef571174767c02e36b935a65e5a9cbb35589a2a018482065c5e33da8ce483dc7f7fe441574f9e7ab0614bdcfc61022c780a30009",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABIlehGHt2+ITZ6lbJc2FzTHoDs8f\nlVOQVvt+ELSqSZALIZTZGbKc2b83Oh1T71cRdHZ8AuNrk1pl5anLs1WJoqAYSCBl\nxeM9qM5IPcf3/kQVdPnnqwYUvc/GECLHgKMACQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 305,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0230480eca2874aa6ba71e7fb5711339ac0a7bf84065b3c7d59c64a2c6015e6f794e7dfa2b1fec73a72adb32bdb7dd55cd04",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04618ad81912e4c31f23eab2f0c693b3ef8404074ab1dce01dc82a768151c9fa0393b4d6aeaeec6858d3f419957a5b997f31fa809b1b44677cc5aef1894846142c3e44bba6c471123fa14feb8f3aa9e92f769be549cef9c1d55bc6f1f4f841813d",
+        "wx" : "618ad81912e4c31f23eab2f0c693b3ef8404074ab1dce01dc82a768151c9fa0393b4d6aeaeec6858d3f419957a5b997f",
+        "wy" : "31fa809b1b44677cc5aef1894846142c3e44bba6c471123fa14feb8f3aa9e92f769be549cef9c1d55bc6f1f4f841813d"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004618ad81912e4c31f23eab2f0c693b3ef8404074ab1dce01dc82a768151c9fa0393b4d6aeaeec6858d3f419957a5b997f31fa809b1b44677cc5aef1894846142c3e44bba6c471123fa14feb8f3aa9e92f769be549cef9c1d55bc6f1f4f841813d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGGK2BkS5MMfI+qy8MaTs++EBAdK\nsdzgHcgqdoFRyfoDk7TWrq7saFjT9BmVeluZfzH6gJsbRGd8xa7xiUhGFCw+RLum\nxHESP6FP6486qekvdpvlSc75wdVbxvH0+EGBPQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 306,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe02301629ef2d7182d67b6bd9cf6842251fe09c96bfe022b8ad9a0e546fdc8ecf5dc8636fa13059d7e9d83fde50e0d2b392c8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0479583b4968b576811b567e1620e00b0aab8aa223c5e655b27b1ebeaf83bcd35f4205a5a0e51a2052fffe9fd23785c98f77357c8a1008fcb7a3579614c2ff47980fa9e44b6b5ea3f8a33c919dd2aea5dad0ca1a01a9e2106518b1642906e4f275",
+        "wx" : "79583b4968b576811b567e1620e00b0aab8aa223c5e655b27b1ebeaf83bcd35f4205a5a0e51a2052fffe9fd23785c98f",
+        "wy" : "77357c8a1008fcb7a3579614c2ff47980fa9e44b6b5ea3f8a33c919dd2aea5dad0ca1a01a9e2106518b1642906e4f275"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000479583b4968b576811b567e1620e00b0aab8aa223c5e655b27b1ebeaf83bcd35f4205a5a0e51a2052fffe9fd23785c98f77357c8a1008fcb7a3579614c2ff47980fa9e44b6b5ea3f8a33c919dd2aea5dad0ca1a01a9e2106518b1642906e4f275",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABHlYO0lotXaBG1Z+FiDgCwqriqIj\nxeZVsnsevq+DvNNfQgWloOUaIFL//p/SN4XJj3c1fIoQCPy3o1eWFML/R5gPqeRL\na16j+KM8kZ3SrqXa0MoaAaniEGUYsWQpBuTydQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 307,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0489657bac216c3ac4a3a2d5afd342ad24a4eb103d4dbe2e4461e03c7011826513fe82bd06e17e3ae8eb5811da0bec88bb33ee1eddd5d49dd86e785fbfebb9288661964e6fbe0c07af9a4ba3145fc4be11e5484b650c97096db82ebb0ca2bb84ed",
+        "wx" : "089657bac216c3ac4a3a2d5afd342ad24a4eb103d4dbe2e4461e03c7011826513fe82bd06e17e3ae8eb5811da0bec88bb",
+        "wy" : "33ee1eddd5d49dd86e785fbfebb9288661964e6fbe0c07af9a4ba3145fc4be11e5484b650c97096db82ebb0ca2bb84ed"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000489657bac216c3ac4a3a2d5afd342ad24a4eb103d4dbe2e4461e03c7011826513fe82bd06e17e3ae8eb5811da0bec88bb33ee1eddd5d49dd86e785fbfebb9288661964e6fbe0c07af9a4ba3145fc4be11e5484b650c97096db82ebb0ca2bb84ed",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABIlle6whbDrEo6LVr9NCrSSk6xA9\nTb4uRGHgPHARgmUT/oK9BuF+OujrWBHaC+yIuzPuHt3V1J3Ybnhfv+u5KIZhlk5v\nvgwHr5pLoxRfxL4R5UhLZQyXCW24LrsMoruE7Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 308,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020102",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045876f414fa385b403a2d10da5d89b110344ad005bfaf8c759ab1e3561a39ff0db9ff91ec6040316e2fca3654a48c0e890dcb77f896ea475cb97672a8400329554c941b61b4a84bde1f8c8fc5250c29161fc3ca50458a41c77a48bb336882f2ea",
+        "wx" : "5876f414fa385b403a2d10da5d89b110344ad005bfaf8c759ab1e3561a39ff0db9ff91ec6040316e2fca3654a48c0e89",
+        "wy" : "0dcb77f896ea475cb97672a8400329554c941b61b4a84bde1f8c8fc5250c29161fc3ca50458a41c77a48bb336882f2ea"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200045876f414fa385b403a2d10da5d89b110344ad005bfaf8c759ab1e3561a39ff0db9ff91ec6040316e2fca3654a48c0e890dcb77f896ea475cb97672a8400329554c941b61b4a84bde1f8c8fc5250c29161fc3ca50458a41c77a48bb336882f2ea",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABFh29BT6OFtAOi0Q2l2JsRA0StAF\nv6+MdZqx41YaOf8Nuf+R7GBAMW4vyjZUpIwOiQ3Ld/iW6kdcuXZyqEADKVVMlBth\ntKhL3h+Mj8UlDCkWH8PKUEWKQcd6SLszaILy6g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 309,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020103",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 310,
+          "comment" : "r is larger than n",
+          "msg" : "313233343030",
+          "sig" : "30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566020103",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041bee741fa192a9bd0535d00627737079e98f00076394c978a96a0f9fba64e9e21decff6b4b8fe11f60b18d5d758684de06d19321eab7e8601f8f4606fe93fd3b2f02986a58ca56413282c66dd36ba6724a3cbceee79948ba2d55c756586b58e2",
+        "wx" : "1bee741fa192a9bd0535d00627737079e98f00076394c978a96a0f9fba64e9e21decff6b4b8fe11f60b18d5d758684de",
+        "wy" : "6d19321eab7e8601f8f4606fe93fd3b2f02986a58ca56413282c66dd36ba6724a3cbceee79948ba2d55c756586b58e2"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200041bee741fa192a9bd0535d00627737079e98f00076394c978a96a0f9fba64e9e21decff6b4b8fe11f60b18d5d758684de06d19321eab7e8601f8f4606fe93fd3b2f02986a58ca56413282c66dd36ba6724a3cbceee79948ba2d55c756586b58e2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABBvudB+hkqm9BTXQBidzcHnpjwAH\nY5TJeKlqD5+6ZOniHez/a0uP4R9gsY1ddYaE3gbRkyHqt+hgH49GBv6T/TsvAphq\nWMpWQTKCxm3Ta6ZySjy87ueZSLotVcdWWGtY4g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 311,
+          "comment" : "s is larger than n",
+          "msg" : "313233343030",
+          "sig" : "30360201010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9173bec",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046b25f8c1629f7579e3c7ee4b029cc029b4bdbed88b9b399303e4a14352d1f3f6048ecdd062d37cba7b70bcbd587231e7621313f93d310f144bd3322582804639dd2960969a993a9f2a3609f856e1415a0a4dcf58a7864e41e2a8c80dfc158a30",
+        "wx" : "6b25f8c1629f7579e3c7ee4b029cc029b4bdbed88b9b399303e4a14352d1f3f6048ecdd062d37cba7b70bcbd587231e7",
+        "wy" : "621313f93d310f144bd3322582804639dd2960969a993a9f2a3609f856e1415a0a4dcf58a7864e41e2a8c80dfc158a30"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200046b25f8c1629f7579e3c7ee4b029cc029b4bdbed88b9b399303e4a14352d1f3f6048ecdd062d37cba7b70bcbd587231e7621313f93d310f144bd3322582804639dd2960969a993a9f2a3609f856e1415a0a4dcf58a7864e41e2a8c80dfc158a30",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGsl+MFin3V548fuSwKcwCm0vb7Y\ni5s5kwPkoUNS0fP2BI7N0GLTfLp7cLy9WHIx52ITE/k9MQ8US9MyJYKARjndKWCW\nmpk6nyo2CfhW4UFaCk3PWKeGTkHiqMgN/BWKMA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 312,
+          "comment" : "small r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303702020101023100896621d23283b12111048d1c978e2c286d60b6ef7ce37af36cf7aa4de268d626de7ddcb356d167c7483c69455c752c93",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045d082cde6086f8ea6994f46e9dc06c1c1d2c3a3c2dc5c97bf137653d9b2ed21101bad843d46e4b7925b9af7034c6d02112c7f56e65d233104063391fb3828b3990e6893d77746e42305e6a5ba111d976d693f595af858f19fac7234f7484c489",
+        "wx" : "5d082cde6086f8ea6994f46e9dc06c1c1d2c3a3c2dc5c97bf137653d9b2ed21101bad843d46e4b7925b9af7034c6d021",
+        "wy" : "12c7f56e65d233104063391fb3828b3990e6893d77746e42305e6a5ba111d976d693f595af858f19fac7234f7484c489"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200045d082cde6086f8ea6994f46e9dc06c1c1d2c3a3c2dc5c97bf137653d9b2ed21101bad843d46e4b7925b9af7034c6d02112c7f56e65d233104063391fb3828b3990e6893d77746e42305e6a5ba111d976d693f595af858f19fac7234f7484c489",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABF0ILN5ghvjqaZT0bp3AbBwdLDo8\nLcXJe/E3ZT2bLtIRAbrYQ9RuS3klua9wNMbQIRLH9W5l0jMQQGM5H7OCizmQ5ok9\nd3RuQjBealuhEdl21pP1la+Fjxn6xyNPdITEiQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 313,
+          "comment" : "smallish r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303b02072d9b4d347952cc023038e8dae216c63f06b3edbd0f9ba7a5e4a332ec187251e3d627839d1baac667d7caad2ab0a1ea9fbb12dc5a71e3b49bc9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047407ca6c2a183f9ca1376609e9c78a8d080effad15a4f63cbb7a168e3c789b8b59ce4d3122ca08a86907ba487f717fbc3e2c56a9b3460a5136b213be8d48cb3dc9c7ad945b1dcecbf93fa6cfaaf8dbd70f1040b97ad8e3ac30f2e64fd7cc76d6",
+        "wx" : "7407ca6c2a183f9ca1376609e9c78a8d080effad15a4f63cbb7a168e3c789b8b59ce4d3122ca08a86907ba487f717fbc",
+        "wy" : "3e2c56a9b3460a5136b213be8d48cb3dc9c7ad945b1dcecbf93fa6cfaaf8dbd70f1040b97ad8e3ac30f2e64fd7cc76d6"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200047407ca6c2a183f9ca1376609e9c78a8d080effad15a4f63cbb7a168e3c789b8b59ce4d3122ca08a86907ba487f717fbc3e2c56a9b3460a5136b213be8d48cb3dc9c7ad945b1dcecbf93fa6cfaaf8dbd70f1040b97ad8e3ac30f2e64fd7cc76d6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABHQHymwqGD+coTdmCenHio0IDv+t\nFaT2PLt6Fo48eJuLWc5NMSLKCKhpB7pIf3F/vD4sVqmzRgpRNrITvo1Iyz3Jx62U\nWx3Oy/k/ps+q+NvXDxBAuXrY46ww8uZP18x21g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 314,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "313233343030",
+          "sig" : "3041020d1033e67e37b32b445580bf4efc02300d2436a599b396a51c546e05d1c3d25a8f6d05935ae5031dad3cdd7cb36cf6912a433de28f8475d3b1e2e1ce77610879",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044fc32a5226820ec9c3fff2c74e0b36d7de028e59fc005f3807a3bd59892c9ad20dba7168ef9ed9bf99b25ed01bcfc6ca6a13da2e852777a6f99d04322a1b9fb4227684bf7c40d4d3ef92798003a3bf2da158d5686457c33d0e24be5c265fc473",
+        "wx" : "4fc32a5226820ec9c3fff2c74e0b36d7de028e59fc005f3807a3bd59892c9ad20dba7168ef9ed9bf99b25ed01bcfc6ca",
+        "wy" : "6a13da2e852777a6f99d04322a1b9fb4227684bf7c40d4d3ef92798003a3bf2da158d5686457c33d0e24be5c265fc473"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200044fc32a5226820ec9c3fff2c74e0b36d7de028e59fc005f3807a3bd59892c9ad20dba7168ef9ed9bf99b25ed01bcfc6ca6a13da2e852777a6f99d04322a1b9fb4227684bf7c40d4d3ef92798003a3bf2da158d5686457c33d0e24be5c265fc473",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABE/DKlImgg7Jw//yx04LNtfeAo5Z\n/ABfOAejvVmJLJrSDbpxaO+e2b+Zsl7QG8/GymoT2i6FJ3em+Z0EMiobn7QidoS/\nfEDU0++SeYADo78toVjVaGRXwz0OJL5cJl/Ecw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 315,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "313233343030",
+          "sig" : "30360202010102304a289adad7ceec67ae99ef5da797b6bb17d9c168428ab30ea9a68b89652c4b9e9bae876ab3d7fbdf1eb92ed422bd3b93",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047350a7d00d7719a318522ef4c5e6be24b3b2cb300c596f79e8dd31a4688fe65a54b2d7497a06821eecbaf31b2fa7cdcb4bd72fc7f05e32457fda0cc3f321157744f1841c30bd086e6ddd5bf415eb71ecbe36f0f3fd23d3c41487fb283e0e9794",
+        "wx" : "7350a7d00d7719a318522ef4c5e6be24b3b2cb300c596f79e8dd31a4688fe65a54b2d7497a06821eecbaf31b2fa7cdcb",
+        "wy" : "4bd72fc7f05e32457fda0cc3f321157744f1841c30bd086e6ddd5bf415eb71ecbe36f0f3fd23d3c41487fb283e0e9794"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200047350a7d00d7719a318522ef4c5e6be24b3b2cb300c596f79e8dd31a4688fe65a54b2d7497a06821eecbaf31b2fa7cdcb4bd72fc7f05e32457fda0cc3f321157744f1841c30bd086e6ddd5bf415eb71ecbe36f0f3fd23d3c41487fb283e0e9794",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABHNQp9ANdxmjGFIu9MXmviSzsssw\nDFlveejdMaRoj+ZaVLLXSXoGgh7suvMbL6fNy0vXL8fwXjJFf9oMw/MhFXdE8YQc\nML0Ibm3dW/QV63Hsvjbw8/0j08QUh/soPg6XlA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 316,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3041020d062522bbd3ecbe7c39e93e7c2402304a289adad7ceec67ae99ef5da797b6bb17d9c168428ab30ea9a68b89652c4b9e9bae876ab3d7fbdf1eb92ed422bd3b93",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0461498ad31a84eed102ba2712eb8a7bd92320bda4ac6d07b4326a30869d19eb1b96229d21efd711dcf73048bf166800e30cfcc13a0914132284dbeab6fcf5d70b34ca86a681157e4874abffaeebb69b8b71f69d332306567823dde5407ce739e8",
+        "wx" : "61498ad31a84eed102ba2712eb8a7bd92320bda4ac6d07b4326a30869d19eb1b96229d21efd711dcf73048bf166800e3",
+        "wy" : "0cfcc13a0914132284dbeab6fcf5d70b34ca86a681157e4874abffaeebb69b8b71f69d332306567823dde5407ce739e8"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000461498ad31a84eed102ba2712eb8a7bd92320bda4ac6d07b4326a30869d19eb1b96229d21efd711dcf73048bf166800e30cfcc13a0914132284dbeab6fcf5d70b34ca86a681157e4874abffaeebb69b8b71f69d332306567823dde5407ce739e8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGFJitMahO7RAronEuuKe9kjIL2k\nrG0HtDJqMIadGesbliKdIe/XEdz3MEi/FmgA4wz8wToJFBMihNvqtvz11ws0yoam\ngRV+SHSr/67rtpuLcfadMyMGVngj3eVAfOc56A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 317,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "313233343030",
+          "sig" : "30650231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90464e502305dd0bf01c2259e1ab4e8f4fee099813f6374f6069e3839ccbf64499dc802c3c534d1cf1f9cffd76027b021574602ee43",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04050592f34db0263df4c669b8991941be18237a1045bfd165ea4af385376564edf6654a0dff7b5d84474090f265c46b511545918cd8f22260ce21a584edfa0b1644488c997d956529262aef400cc0320ed27ddcec3bde6b9fd79b374af688fa9f",
+        "wx" : "50592f34db0263df4c669b8991941be18237a1045bfd165ea4af385376564edf6654a0dff7b5d84474090f265c46b51",
+        "wy" : "1545918cd8f22260ce21a584edfa0b1644488c997d956529262aef400cc0320ed27ddcec3bde6b9fd79b374af688fa9f"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004050592f34db0263df4c669b8991941be18237a1045bfd165ea4af385376564edf6654a0dff7b5d84474090f265c46b511545918cd8f22260ce21a584edfa0b1644488c997d956529262aef400cc0320ed27ddcec3bde6b9fd79b374af688fa9f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABAUFkvNNsCY99MZpuJkZQb4YI3oQ\nRb/RZepK84U3ZWTt9mVKDf97XYRHQJDyZcRrURVFkYzY8iJgziGlhO36CxZESIyZ\nfZVlKSYq70AMwDIO0n3c7Dvea5/XmzdK9oj6nw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 318,
+          "comment" : "s == 1",
+          "msg" : "313233343030",
+          "sig" : "303502302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 319,
+          "comment" : "s == 0",
+          "msg" : "313233343030",
+          "sig" : "303502302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044df898544c2b10dc3c4d3249fca5130e753d26e08320bd823926acb050d8b6a4feadf29bef07ecdb00e85b341f22069a003343695d1e0ac0a78b38490d97c1e90e4ff4ca0d2140b9101f1b63f29ca4f2bf9176e1600483916216bd35abce6741",
+        "wx" : "4df898544c2b10dc3c4d3249fca5130e753d26e08320bd823926acb050d8b6a4feadf29bef07ecdb00e85b341f22069a",
+        "wy" : "3343695d1e0ac0a78b38490d97c1e90e4ff4ca0d2140b9101f1b63f29ca4f2bf9176e1600483916216bd35abce6741"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200044df898544c2b10dc3c4d3249fca5130e753d26e08320bd823926acb050d8b6a4feadf29bef07ecdb00e85b341f22069a003343695d1e0ac0a78b38490d97c1e90e4ff4ca0d2140b9101f1b63f29ca4f2bf9176e1600483916216bd35abce6741",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABE34mFRMKxDcPE0ySfylEw51PSbg\ngyC9gjkmrLBQ2Lak/q3ym+8H7NsA6Fs0HyIGmgAzQ2ldHgrAp4s4SQ2XwekOT/TK\nDSFAuRAfG2PynKTyv5F24WAEg5FiFr01q85nQQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 320,
+          "comment" : "point at infinity during verify",
+          "msg" : "313233343030",
+          "sig" : "30640230465c8f41519c369407aeb7bf287320ef8a97b884f6aa2b598f8b3736560212d3e79d5b57b5bfe1881dc41901748232b202302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045d77134e890ac72f9c69fcc3f181ae746fefffdafc1dfc791cf33a22fb0f8e586188cf2d5d060ddb04004baf56191c9f0e7401ddcc47a09b5ecf2719cc936010a9371a7f7624e63e7a00550a13d035cf586d3b522c7fd06251adbb0f0aad3dd7",
+        "wx" : "5d77134e890ac72f9c69fcc3f181ae746fefffdafc1dfc791cf33a22fb0f8e586188cf2d5d060ddb04004baf56191c9f",
+        "wy" : "0e7401ddcc47a09b5ecf2719cc936010a9371a7f7624e63e7a00550a13d035cf586d3b522c7fd06251adbb0f0aad3dd7"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200045d77134e890ac72f9c69fcc3f181ae746fefffdafc1dfc791cf33a22fb0f8e586188cf2d5d060ddb04004baf56191c9f0e7401ddcc47a09b5ecf2719cc936010a9371a7f7624e63e7a00550a13d035cf586d3b522c7fd06251adbb0f0aad3dd7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABF13E06JCscvnGn8w/GBrnRv7//a\n/B38eRzzOiL7D45YYYjPLV0GDdsEAEuvVhkcnw50Ad3MR6CbXs8nGcyTYBCpNxp/\ndiTmPnoAVQoT0DXPWG07Uix/0GJRrbsPCq091w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 321,
+          "comment" : "u1 == 1",
+          "msg" : "313233343030",
+          "sig" : "306502302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04607cd94c42f5bbfcf857a708ac163f0afc0a65c8d88725f18c4bf7eb7cf5d34aca6008a27b4e5fd9476134ed85fcd32c89f248290c59b8fb963e90bab9b0b3e313d3b8e0a6c8901455a22b7b74a108152c5b814ba575de8de07cdb8d67ba2b50",
+        "wx" : "607cd94c42f5bbfcf857a708ac163f0afc0a65c8d88725f18c4bf7eb7cf5d34aca6008a27b4e5fd9476134ed85fcd32c",
+        "wy" : "089f248290c59b8fb963e90bab9b0b3e313d3b8e0a6c8901455a22b7b74a108152c5b814ba575de8de07cdb8d67ba2b50"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004607cd94c42f5bbfcf857a708ac163f0afc0a65c8d88725f18c4bf7eb7cf5d34aca6008a27b4e5fd9476134ed85fcd32c89f248290c59b8fb963e90bab9b0b3e313d3b8e0a6c8901455a22b7b74a108152c5b814ba575de8de07cdb8d67ba2b50",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGB82UxC9bv8+FenCKwWPwr8CmXI\n2Icl8YxL9+t89dNKymAIontOX9lHYTTthfzTLInySCkMWbj7lj6Qurmws+MT07jg\npsiQFFWiK3t0oQgVLFuBS6V13o3gfNuNZ7orUA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 322,
+          "comment" : "u1 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "306402302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba301772102301fc115146e521d7ea33f3e128eb01db0f653dc45852c2b50301d639b778b13380e51d9366552cf2049156605d57adffc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044b4afbd91746b1a4df6d0d717afc7528fa4a9dda9a62afee19a72fc0019aa2ea89a125bea7675506230656caaff52c735f5c3575bf669637efdb672477500f1fe37b45dcf879487ad6ca36c4147329fb741706ce9b928ce47bf6dc0f9e44017f",
+        "wx" : "4b4afbd91746b1a4df6d0d717afc7528fa4a9dda9a62afee19a72fc0019aa2ea89a125bea7675506230656caaff52c73",
+        "wy" : "5f5c3575bf669637efdb672477500f1fe37b45dcf879487ad6ca36c4147329fb741706ce9b928ce47bf6dc0f9e44017f"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200044b4afbd91746b1a4df6d0d717afc7528fa4a9dda9a62afee19a72fc0019aa2ea89a125bea7675506230656caaff52c735f5c3575bf669637efdb672477500f1fe37b45dcf879487ad6ca36c4147329fb741706ce9b928ce47bf6dc0f9e44017f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABEtK+9kXRrGk320NcXr8dSj6Sp3a\nmmKv7hmnL8ABmqLqiaElvqdnVQYjBlbKr/Usc19cNXW/ZpY379tnJHdQDx/je0Xc\n+HlIetbKNsQUcyn7dBcGzpuSjOR79twPnkQBfw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 323,
+          "comment" : "u2 == 1",
+          "msg" : "313233343030",
+          "sig" : "306402302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba301772102302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040d8b246c623188b7455716ac189b9af441676a1c41cd575754bd02ae4d6825304b961ddf0826bb161e3d63e9bc71f1d46edbeddc2d40dafdccac90ae85cd616a0ea1e4a08ae8fc3358ce7d5142eee8f3bebdc14591c4c9b15bff12b8cf08334a",
+        "wx" : "0d8b246c623188b7455716ac189b9af441676a1c41cd575754bd02ae4d6825304b961ddf0826bb161e3d63e9bc71f1d4",
+        "wy" : "6edbeddc2d40dafdccac90ae85cd616a0ea1e4a08ae8fc3358ce7d5142eee8f3bebdc14591c4c9b15bff12b8cf08334a"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200040d8b246c623188b7455716ac189b9af441676a1c41cd575754bd02ae4d6825304b961ddf0826bb161e3d63e9bc71f1d46edbeddc2d40dafdccac90ae85cd616a0ea1e4a08ae8fc3358ce7d5142eee8f3bebdc14591c4c9b15bff12b8cf08334a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABA2LJGxiMYi3RVcWrBibmvRBZ2oc\nQc1XV1S9Aq5NaCUwS5Yd3wgmuxYePWPpvHHx1G7b7dwtQNr9zKyQroXNYWoOoeSg\niuj8M1jOfVFC7ujzvr3BRZHEybFb/xK4zwgzSg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 324,
+          "comment" : "u2 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "306402302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba301772102305dd0bf01c2259e1ab4e8f4fee099813f6374f6069e3839ccbf64499dc802c3c534d1cf1f9cffd76027b021574602ee44",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0404d9d4a62d6eb02073e738b1e439cecd5440031911f45190eb6062a33535fc5269bcfc25d4afc1dae0ebad948d7732d8029af37e89a3cea7df38b020f624906fca6d944e1486853fe8e5ba9cfba2d74a852ec587d46fe49917c364418ef7eca5",
+        "wx" : "4d9d4a62d6eb02073e738b1e439cecd5440031911f45190eb6062a33535fc5269bcfc25d4afc1dae0ebad948d7732d8",
+        "wy" : "29af37e89a3cea7df38b020f624906fca6d944e1486853fe8e5ba9cfba2d74a852ec587d46fe49917c364418ef7eca5"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000404d9d4a62d6eb02073e738b1e439cecd5440031911f45190eb6062a33535fc5269bcfc25d4afc1dae0ebad948d7732d8029af37e89a3cea7df38b020f624906fca6d944e1486853fe8e5ba9cfba2d74a852ec587d46fe49917c364418ef7eca5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABATZ1KYtbrAgc+c4seQ5zs1UQAMZ\nEfRRkOtgYqM1NfxSabz8JdSvwdrg662UjXcy2AKa836Jo86n3ziwIPYkkG/KbZRO\nFIaFP+jlupz7otdKhS7Fh9Rv5JkXw2RBjvfspQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 325,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0230533b0d50480a3ef07e7e8af8b1097759bc03ac9a1c7ed6075a052869f57f12b285613162d08ee7aab9fe54aaa984a39a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041a4a55c9b0ce43d7ed78a98d9bf6459ccf349466fccc457598fc15a1d6956d8ce8348b2332fffb3d516b078d28d329dd73f45a4ce1f5dc772f3c3283af6564e6e410f9d5064b6484065966936693f62ac9940eb28914a091d2964cd843b41028",
+        "wx" : "1a4a55c9b0ce43d7ed78a98d9bf6459ccf349466fccc457598fc15a1d6956d8ce8348b2332fffb3d516b078d28d329dd",
+        "wy" : "73f45a4ce1f5dc772f3c3283af6564e6e410f9d5064b6484065966936693f62ac9940eb28914a091d2964cd843b41028"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200041a4a55c9b0ce43d7ed78a98d9bf6459ccf349466fccc457598fc15a1d6956d8ce8348b2332fffb3d516b078d28d329dd73f45a4ce1f5dc772f3c3283af6564e6e410f9d5064b6484065966936693f62ac9940eb28914a091d2964cd843b41028",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABBpKVcmwzkPX7XipjZv2RZzPNJRm\n/MxFdZj8FaHWlW2M6DSLIzL/+z1RaweNKNMp3XP0Wkzh9dx3Lzwyg69lZObkEPnV\nBktkhAZZZpNmk/YqyZQOsokUoJHSlkzYQ7QQKA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 326,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023070a8e817f4ea82b831ba5e671830b4312846b23da14ff7d43baf3a7ee7aa061c86422aaf27ffc5c655406868b5bf19bf",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04373ac98f088268a86d136de4fa0ce2c41042cd33ed2d07250f53cd4ed43fa1da425da597bd5b413d56cfff954267104f069e0453bbbd79280316f8c1c161a846af379a941ed286e593e7f289ba4fff42458b273a3ba499574e134e7fb4a7dc19",
+        "wx" : "373ac98f088268a86d136de4fa0ce2c41042cd33ed2d07250f53cd4ed43fa1da425da597bd5b413d56cfff954267104f",
+        "wy" : "69e0453bbbd79280316f8c1c161a846af379a941ed286e593e7f289ba4fff42458b273a3ba499574e134e7fb4a7dc19"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004373ac98f088268a86d136de4fa0ce2c41042cd33ed2d07250f53cd4ed43fa1da425da597bd5b413d56cfff954267104f069e0453bbbd79280316f8c1c161a846af379a941ed286e593e7f289ba4fff42458b273a3ba499574e134e7fb4a7dc19",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABDc6yY8IgmiobRNt5PoM4sQQQs0z\n7S0HJQ9TzU7UP6HaQl2ll71bQT1Wz/+VQmcQTwaeBFO7vXkoAxb4wcFhqEavN5qU\nHtKG5ZPn8om6T/9CRYsnOjukmVdOE05/tKfcGQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 327,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0230326c0872a7224e7a104087acf4c4b4e3e5aba4ffe4625fc3955ce9647bf71fb596b83971ad2b52473a2821991c808905",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047e6ab429b9e33a974f6ab9a49eb152c484575fad5d9bcddcb87edce16e79333a937276f36aec9121de450384cb20bb2e8595f6c2880d89198e1b625e65056d0a19a58d1d1c551bcc5dd39d281d726dad4108488c8f941ac983169cace3ecc71b",
+        "wx" : "7e6ab429b9e33a974f6ab9a49eb152c484575fad5d9bcddcb87edce16e79333a937276f36aec9121de450384cb20bb2e",
+        "wy" : "08595f6c2880d89198e1b625e65056d0a19a58d1d1c551bcc5dd39d281d726dad4108488c8f941ac983169cace3ecc71b"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200047e6ab429b9e33a974f6ab9a49eb152c484575fad5d9bcddcb87edce16e79333a937276f36aec9121de450384cb20bb2e8595f6c2880d89198e1b625e65056d0a19a58d1d1c551bcc5dd39d281d726dad4108488c8f941ac983169cace3ecc71b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABH5qtCm54zqXT2q5pJ6xUsSEV1+t\nXZvN3Lh+3OFueTM6k3J282rskSHeRQOEyyC7LoWV9sKIDYkZjhtiXmUFbQoZpY0d\nHFUbzF3TnSgdcm2tQQhIjI+UGsmDFpys4+zHGw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 328,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023065cf0a5bce70af078af6d5a14545ca619e47d6eb0fd0531ecc743a7685530284a83289c2d09e024384ae5e778799e414",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041fbb37f75195c3f2de3afcc88ad7eb32108144608943face3a890005ff2a3e0b558079c5842620f44adc0c38dd88aac551734f8eb827df929d7317714a29cf8ba432caf689094d00eb9d63cbc908ba76ca5b1f93d229477c960842940f4224d3",
+        "wx" : "1fbb37f75195c3f2de3afcc88ad7eb32108144608943face3a890005ff2a3e0b558079c5842620f44adc0c38dd88aac5",
+        "wy" : "51734f8eb827df929d7317714a29cf8ba432caf689094d00eb9d63cbc908ba76ca5b1f93d229477c960842940f4224d3"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200041fbb37f75195c3f2de3afcc88ad7eb32108144608943face3a890005ff2a3e0b558079c5842620f44adc0c38dd88aac551734f8eb827df929d7317714a29cf8ba432caf689094d00eb9d63cbc908ba76ca5b1f93d229477c960842940f4224d3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABB+7N/dRlcPy3jr8yIrX6zIQgURg\niUP6zjqJAAX/Kj4LVYB5xYQmIPRK3Aw43YiqxVFzT464J9+SnXMXcUopz4ukMsr2\niQlNAOudY8vJCLp2ylsfk9IpR3yWCEKUD0Ik0w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 329,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02302e099adfe4d9120596e8a1520399b0e249555b171e0a71967307548a3c28753fa40bbcb0a8658369dc8ca0caa05fb001",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0407fa30c837c8ad029326a1d448bd27521b5d26aad4d8244b7242493df70172e6dd1daf5c7e07f4fa102f5c415a4ec61f0904527df877527f7d0f5a7f71b6d9c03f2de1df8804868e7337da35c9b1ffc9bf2e279c3af8a0786e6f39832cc6ed1b",
+        "wx" : "7fa30c837c8ad029326a1d448bd27521b5d26aad4d8244b7242493df70172e6dd1daf5c7e07f4fa102f5c415a4ec61f",
+        "wy" : "0904527df877527f7d0f5a7f71b6d9c03f2de1df8804868e7337da35c9b1ffc9bf2e279c3af8a0786e6f39832cc6ed1b"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000407fa30c837c8ad029326a1d448bd27521b5d26aad4d8244b7242493df70172e6dd1daf5c7e07f4fa102f5c415a4ec61f0904527df877527f7d0f5a7f71b6d9c03f2de1df8804868e7337da35c9b1ffc9bf2e279c3af8a0786e6f39832cc6ed1b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABAf6MMg3yK0Ckyah1Ei9J1IbXSaq\n1NgkS3JCST33AXLm3R2vXH4H9PoQL1xBWk7GHwkEUn34d1J/fQ9af3G22cA/LeHf\niASGjnM32jXJsf/Jvy4nnDr4oHhubzmDLMbtGw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 330,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02305c1335bfc9b2240b2dd142a4073361c492aab62e3c14e32ce60ea9147850ea7f4817796150cb06d3b919419540bf6002",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0461397ae7fe8e7e894bfa689e5813514293a0f1b9f1090c0d9696379b61287a752a3f7d1d2480fe4127498d0eeda84c630c2fadd37ea36bfe532b5d3a0f101ddd3ac59458399648f3efaf5833dec1c8c8ece05515893553ef4d58120d37ce2ecd",
+        "wx" : "61397ae7fe8e7e894bfa689e5813514293a0f1b9f1090c0d9696379b61287a752a3f7d1d2480fe4127498d0eeda84c63",
+        "wy" : "0c2fadd37ea36bfe532b5d3a0f101ddd3ac59458399648f3efaf5833dec1c8c8ece05515893553ef4d58120d37ce2ecd"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000461397ae7fe8e7e894bfa689e5813514293a0f1b9f1090c0d9696379b61287a752a3f7d1d2480fe4127498d0eeda84c630c2fadd37ea36bfe532b5d3a0f101ddd3ac59458399648f3efaf5833dec1c8c8ece05515893553ef4d58120d37ce2ecd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGE5euf+jn6JS/ponlgTUUKToPG5\n8QkMDZaWN5thKHp1Kj99HSSA/kEnSY0O7ahMYwwvrdN+o2v+UytdOg8QHd06xZRY\nOZZI8++vWDPewcjI7OBVFYk1U+9NWBINN84uzQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 331,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0230259160b321c350f4f2299aa77c72a09248927957b6414308bf8c7fb4f2dbba5ca79198f80a150e1ceb5a9845144eee9b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047f166efa8d8416d922f57673a2180cfbb49e8d160d60ba5ec90ba547f3eccd22ce6afd99a0fb292cfd16b0692b9cab03418579e67c87b359912f6cb4158bdd7ea130b5007726df2fce319915deedc4f7e89ee23f786e25373c9937498bab81b4",
+        "wx" : "7f166efa8d8416d922f57673a2180cfbb49e8d160d60ba5ec90ba547f3eccd22ce6afd99a0fb292cfd16b0692b9cab03",
+        "wy" : "418579e67c87b359912f6cb4158bdd7ea130b5007726df2fce319915deedc4f7e89ee23f786e25373c9937498bab81b4"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200047f166efa8d8416d922f57673a2180cfbb49e8d160d60ba5ec90ba547f3eccd22ce6afd99a0fb292cfd16b0692b9cab03418579e67c87b359912f6cb4158bdd7ea130b5007726df2fce319915deedc4f7e89ee23f786e25373c9937498bab81b4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABH8WbvqNhBbZIvV2c6IYDPu0no0W\nDWC6XskLpUfz7M0izmr9maD7KSz9FrBpK5yrA0GFeeZ8h7NZkS9stBWL3X6hMLUA\ndybfL84xmRXe7cT36J7iP3huJTc8mTdJi6uBtA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 332,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023100881964e1bba9a28c7a1d84379c65bb3da72f3cc879f7f579d2f9b34a574432d6c7d1c229ee227d4ddbdd9f15df9978c0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0477c9c2e658b004ab6840d7c33a5e7eb5f93ba3a7c5b32f7275fd75b07c1c92f5ae31576b9cbca046337e6d6ea76c145e67c56010dd9749e2d90b3eb57ef1c4c73741233a32a6a4355b8c4e3a24bcf5986627c7480783161db1d2a5332bd75fef",
+        "wx" : "77c9c2e658b004ab6840d7c33a5e7eb5f93ba3a7c5b32f7275fd75b07c1c92f5ae31576b9cbca046337e6d6ea76c145e",
+        "wy" : "67c56010dd9749e2d90b3eb57ef1c4c73741233a32a6a4355b8c4e3a24bcf5986627c7480783161db1d2a5332bd75fef"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000477c9c2e658b004ab6840d7c33a5e7eb5f93ba3a7c5b32f7275fd75b07c1c92f5ae31576b9cbca046337e6d6ea76c145e67c56010dd9749e2d90b3eb57ef1c4c73741233a32a6a4355b8c4e3a24bcf5986627c7480783161db1d2a5332bd75fef",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABHfJwuZYsASraEDXwzpefrX5O6On\nxbMvcnX9dbB8HJL1rjFXa5y8oEYzfm1up2wUXmfFYBDdl0ni2Qs+tX7xxMc3QSM6\nMqakNVuMTjokvPWYZifHSAeDFh2x0qUzK9df7w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 333,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02300e3c83bb59abc57220170152251cf010b0081fecca2c957ca7ec1a33dae3ca1d7094b1c0f71b03e008bbe64659119f09",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0464d9a317d5b41af30fdfc7389460f357fa9978304d026b312aa5ca04a19bdc0c56440cfd14a0b060c3b8f4ee8d4a5a3777299b2280ab4c857ed2531e8db027f8c7238028bd7f7ba59bc80547d4f10da6f2e613580553406f0427ecbd7b75916e",
+        "wx" : "64d9a317d5b41af30fdfc7389460f357fa9978304d026b312aa5ca04a19bdc0c56440cfd14a0b060c3b8f4ee8d4a5a37",
+        "wy" : "77299b2280ab4c857ed2531e8db027f8c7238028bd7f7ba59bc80547d4f10da6f2e613580553406f0427ecbd7b75916e"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000464d9a317d5b41af30fdfc7389460f357fa9978304d026b312aa5ca04a19bdc0c56440cfd14a0b060c3b8f4ee8d4a5a3777299b2280ab4c857ed2531e8db027f8c7238028bd7f7ba59bc80547d4f10da6f2e613580553406f0427ecbd7b75916e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGTZoxfVtBrzD9/HOJRg81f6mXgw\nTQJrMSqlygShm9wMVkQM/RSgsGDDuPTujUpaN3cpmyKAq0yFftJTHo2wJ/jHI4Ao\nvX97pZvIBUfU8Q2m8uYTWAVTQG8EJ+y9e3WRbg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 334,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0230631b97da7f334dafd01e2a01f8618632372d9abcdf14ebaf7213da37b1449c4e8c8a1dfe03384f3ade8907ad94421398",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04264ba447f80d721bf1e79877f27a23ee58565e88c49f6b9cd6448c024b6ff53aebb2b08cec22eb2eb38e30fd54727f01801887f9f94dce625ed1d56350a4b252e0dcfc0984928f25ad22a13135baf996bfa82809fbe79c0979670fddc9fba9e6",
+        "wx" : "264ba447f80d721bf1e79877f27a23ee58565e88c49f6b9cd6448c024b6ff53aebb2b08cec22eb2eb38e30fd54727f01",
+        "wy" : "0801887f9f94dce625ed1d56350a4b252e0dcfc0984928f25ad22a13135baf996bfa82809fbe79c0979670fddc9fba9e6"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004264ba447f80d721bf1e79877f27a23ee58565e88c49f6b9cd6448c024b6ff53aebb2b08cec22eb2eb38e30fd54727f01801887f9f94dce625ed1d56350a4b252e0dcfc0984928f25ad22a13135baf996bfa82809fbe79c0979670fddc9fba9e6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABCZLpEf4DXIb8eeYd/J6I+5YVl6I\nxJ9rnNZEjAJLb/U667KwjOwi6y6zjjD9VHJ/AYAYh/n5Tc5iXtHVY1CkslLg3PwJ\nhJKPJa0ioTE1uvmWv6goCfvnnAl5Zw/dyfup5g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 335,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0230397e11325b2e2e3790dee4859fdcca85592bc46fd0d580abc5114602b68512f549d9854c9af0db658189dd583f7fc1cb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0404918040a58dc477a7245561273df2d8bd977e5fd39c40d3011536cb2b9cfee82e2ab5f539e5908dcbf3ff24c645db4e5969a9d8df5cdaafe3490caa4946acf5ebe3e93aab28a8d4a6f61e2c8e5c02dc605c75806dddddebe23915631159c1f7",
+        "wx" : "4918040a58dc477a7245561273df2d8bd977e5fd39c40d3011536cb2b9cfee82e2ab5f539e5908dcbf3ff24c645db4e",
+        "wy" : "5969a9d8df5cdaafe3490caa4946acf5ebe3e93aab28a8d4a6f61e2c8e5c02dc605c75806dddddebe23915631159c1f7"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000404918040a58dc477a7245561273df2d8bd977e5fd39c40d3011536cb2b9cfee82e2ab5f539e5908dcbf3ff24c645db4e5969a9d8df5cdaafe3490caa4946acf5ebe3e93aab28a8d4a6f61e2c8e5c02dc605c75806dddddebe23915631159c1f7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABASRgECljcR3pyRVYSc98ti9l35f\n05xA0wEVNssrnP7oLiq19TnlkI3L8/8kxkXbTllpqdjfXNqv40kMqklGrPXr4+k6\nqyio1Kb2HiyOXALcYFx1gG3d3eviORVjEVnB9w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 336,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02300fe08a8a37290ebf519f9f0947580ed87b29ee22c29615a8180eb1cdbbc5899c0728ec9b32a96790248ab302eabd6ffe",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0422e44ebe0a351e4c91f7bdfc0c0c3c6e1c679da84a32539c2dbb41ea31061b0825e3f34d7b0ad525261eb9e457c408196089e33034731ba8e9f95f5a234bf8d3539c8381f4d95510d5e0f145fd48205e5c60218c3f84b189c8e4fd5608b49778",
+        "wx" : "22e44ebe0a351e4c91f7bdfc0c0c3c6e1c679da84a32539c2dbb41ea31061b0825e3f34d7b0ad525261eb9e457c40819",
+        "wy" : "6089e33034731ba8e9f95f5a234bf8d3539c8381f4d95510d5e0f145fd48205e5c60218c3f84b189c8e4fd5608b49778"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000422e44ebe0a351e4c91f7bdfc0c0c3c6e1c679da84a32539c2dbb41ea31061b0825e3f34d7b0ad525261eb9e457c408196089e33034731ba8e9f95f5a234bf8d3539c8381f4d95510d5e0f145fd48205e5c60218c3f84b189c8e4fd5608b49778",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABCLkTr4KNR5Mkfe9/AwMPG4cZ52o\nSjJTnC27QeoxBhsIJePzTXsK1SUmHrnkV8QIGWCJ4zA0cxuo6flfWiNL+NNTnIOB\n9NlVENXg8UX9SCBeXGAhjD+EsYnI5P1WCLSXeA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 337,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02305f92937aa52d5dd10fcefb95a2d57b617d6d8b04e8db5b3b5a39abe893fda2aeb2f978108c558aabbad829ce02c27735",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0466ed49779ed6a7b10c812bc7ee7b47a5d11c5ea50277273da140bc1b0cf5b8210a6a737f7e9d92eee6d845137e5c44a28accb8f637385cf6519bfae3ed3ae4d0acaa19a260a01bd8cb53ad24dacab1954b20d1472cf3975e87cc733f329ab6bd",
+        "wx" : "66ed49779ed6a7b10c812bc7ee7b47a5d11c5ea50277273da140bc1b0cf5b8210a6a737f7e9d92eee6d845137e5c44a2",
+        "wy" : "08accb8f637385cf6519bfae3ed3ae4d0acaa19a260a01bd8cb53ad24dacab1954b20d1472cf3975e87cc733f329ab6bd"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000466ed49779ed6a7b10c812bc7ee7b47a5d11c5ea50277273da140bc1b0cf5b8210a6a737f7e9d92eee6d845137e5c44a28accb8f637385cf6519bfae3ed3ae4d0acaa19a260a01bd8cb53ad24dacab1954b20d1472cf3975e87cc733f329ab6bd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGbtSXee1qexDIErx+57R6XRHF6l\nAncnPaFAvBsM9bghCmpzf36dku7m2EUTflxEoorMuPY3OFz2UZv64+065NCsqhmi\nYKAb2MtTrSTayrGVSyDRRyzzl16HzHM/Mpq2vQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 338,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023059930a2b8bbd79b8051f252a1af76b4a5c6525adf9c6c7910a5ccf798eac0c8d4513923a792a965abe82bb564dac21cb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043024912041bc989a936fb4dcdd178b15e03a0aa94abafb4465b4a89d4416b7a8b029d47c17e69a25962ff3aefe862dcb249ee9252b5713e747a2da8aac2b961ee2b6aca157a44888748648fbcdc5661cd4a169bb92c9c1ce50a79a63735002a1",
+        "wx" : "3024912041bc989a936fb4dcdd178b15e03a0aa94abafb4465b4a89d4416b7a8b029d47c17e69a25962ff3aefe862dcb",
+        "wy" : "249ee9252b5713e747a2da8aac2b961ee2b6aca157a44888748648fbcdc5661cd4a169bb92c9c1ce50a79a63735002a1"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200043024912041bc989a936fb4dcdd178b15e03a0aa94abafb4465b4a89d4416b7a8b029d47c17e69a25962ff3aefe862dcb249ee9252b5713e747a2da8aac2b961ee2b6aca157a44888748648fbcdc5661cd4a169bb92c9c1ce50a79a63735002a1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABDAkkSBBvJiak2+03N0XixXgOgqp\nSrr7RGW0qJ1EFreosCnUfBfmmiWWL/Ou/oYtyySe6SUrVxPnR6Laiqwrlh7itqyh\nV6RIiHSGSPvNxWYc1KFpu5LJwc5Qp5pjc1ACoQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 339,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02301449901ce4b00f0e3a5ff84cff8c134854b808e504d1b8f027ace9591234e3f62ce70c35a8aa8e60cafe1e0df3ed80e7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046c9393b00e9a62ce0b83674cdcca59b18d5b34246348e37c1d78898a522d813c49d08efc5f3f7ef33f3dc9dd1bc2e5c2000b9410ce04a64cd095ae1194bc1f514c7009a4e06871b557154cf492e7c57749487ecfcd04cb31426ab785ffa95e2f",
+        "wx" : "6c9393b00e9a62ce0b83674cdcca59b18d5b34246348e37c1d78898a522d813c49d08efc5f3f7ef33f3dc9dd1bc2e5c2",
+        "wy" : "0b9410ce04a64cd095ae1194bc1f514c7009a4e06871b557154cf492e7c57749487ecfcd04cb31426ab785ffa95e2f"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200046c9393b00e9a62ce0b83674cdcca59b18d5b34246348e37c1d78898a522d813c49d08efc5f3f7ef33f3dc9dd1bc2e5c2000b9410ce04a64cd095ae1194bc1f514c7009a4e06871b557154cf492e7c57749487ecfcd04cb31426ab785ffa95e2f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGyTk7AOmmLOC4NnTNzKWbGNWzQk\nY0jjfB14iYpSLYE8SdCO/F8/fvM/PcndG8LlwgALlBDOBKZM0JWuEZS8H1FMcAmk\n4GhxtVcVTPSS58V3SUh+z80EyzFCareF/6leLw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 340,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02310089ae6f8e215bcf35c7e2afed1a6b9855171687d9edbea8af5bf8e9ddc667aac4e166f05097385fa9ea3a6245fc07b4ad",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042c58277aaa61c400d7036183af49c99a97fea5a8d5f8608c4c6ac7a282757e4dc4b6f92d82a10272f2a19696a48fa79f5a8adb770740669d6010e55f6625b141be469fe1779f4adfe64eab2e4a9ac5bf1c25b3de0b74b8f9644fc216010d9659",
+        "wx" : "2c58277aaa61c400d7036183af49c99a97fea5a8d5f8608c4c6ac7a282757e4dc4b6f92d82a10272f2a19696a48fa79f",
+        "wy" : "5a8adb770740669d6010e55f6625b141be469fe1779f4adfe64eab2e4a9ac5bf1c25b3de0b74b8f9644fc216010d9659"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200042c58277aaa61c400d7036183af49c99a97fea5a8d5f8608c4c6ac7a282757e4dc4b6f92d82a10272f2a19696a48fa79f5a8adb770740669d6010e55f6625b141be469fe1779f4adfe64eab2e4a9ac5bf1c25b3de0b74b8f9644fc216010d9659",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABCxYJ3qqYcQA1wNhg69JyZqX/qWo\n1fhgjExqx6KCdX5NxLb5LYKhAnLyoZaWpI+nn1qK23cHQGadYBDlX2YlsUG+Rp/h\nd59K3+ZOqy5KmsW/HCWz3gt0uPlkT8IWAQ2WWQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 341,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02303fc16256a0914ce2661a54688af4b2546b1b59b043667da6abb5b1a1e0e2e6ab862fe8bb749f7251572bc160567530a7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046e5f827e1aa225c4b95db52655f67d654bdc69a4bf8f49c19d1e65dcf12ca511505aa1726ca2f5cdf8ab376f94a0c5bd5daec6f35f1dfbc68fba024cc8c5f79ce9baa86adfd8d2ba53a798cdcc9025eb9797d3be207bc694abb338e43778ffdd",
+        "wx" : "6e5f827e1aa225c4b95db52655f67d654bdc69a4bf8f49c19d1e65dcf12ca511505aa1726ca2f5cdf8ab376f94a0c5bd",
+        "wy" : "5daec6f35f1dfbc68fba024cc8c5f79ce9baa86adfd8d2ba53a798cdcc9025eb9797d3be207bc694abb338e43778ffdd"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200046e5f827e1aa225c4b95db52655f67d654bdc69a4bf8f49c19d1e65dcf12ca511505aa1726ca2f5cdf8ab376f94a0c5bd5daec6f35f1dfbc68fba024cc8c5f79ce9baa86adfd8d2ba53a798cdcc9025eb9797d3be207bc694abb338e43778ffdd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABG5fgn4aoiXEuV21JlX2fWVL3Gmk\nv49JwZ0eZdzxLKURUFqhcmyi9c34qzdvlKDFvV2uxvNfHfvGj7oCTMjF95zpuqhq\n39jSulOnmM3MkCXrl5fTviB7xpSrszjkN3j/3Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 342,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023064c1556c5eef311a4f3ba46316adf73732d6ed47b1ba2ecd178ff89bbc5ddd6c6419f62e045ea2d35c33a250dc2fb925",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047fe852a7612a673df351f05afeafcbb16ce4cadf85681b2b5f46cc31ef33d6b695378e7325e9cb3185d7137b2b1700465cbd4c810076d135316887e94b14b4b0108db1c944794c398938d42176c32575b6428b3e37b602211c574acafef0911e",
+        "wx" : "7fe852a7612a673df351f05afeafcbb16ce4cadf85681b2b5f46cc31ef33d6b695378e7325e9cb3185d7137b2b170046",
+        "wy" : "5cbd4c810076d135316887e94b14b4b0108db1c944794c398938d42176c32575b6428b3e37b602211c574acafef0911e"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200047fe852a7612a673df351f05afeafcbb16ce4cadf85681b2b5f46cc31ef33d6b695378e7325e9cb3185d7137b2b1700465cbd4c810076d135316887e94b14b4b0108db1c944794c398938d42176c32575b6428b3e37b602211c574acafef0911e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABH/oUqdhKmc981HwWv6vy7Fs5Mrf\nhWgbK19GzDHvM9a2lTeOcyXpyzGF1xN7KxcARly9TIEAdtE1MWiH6UsUtLAQjbHJ\nRHlMOYk41CF2wyV1tkKLPje2AiEcV0rK/vCRHg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 343,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02303cc98c561aa5f50c8f19d947dc75ac8f507e6985762006e7100982caccb79530f8f935ac9d3d82967cdf129ecf5b0ce5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040a49dc359ed4fef683e462dfe685442cea77b733fd95633216794d9a61f7e1022d942a36e781a484a2b479a643469af4512ebd0966b68bfecf7a47021bcd9e6aa2703dcc556a9a443d16195aa145738fa36a4dff3d09481f4a86550a8d1f3545",
+        "wx" : "0a49dc359ed4fef683e462dfe685442cea77b733fd95633216794d9a61f7e1022d942a36e781a484a2b479a643469af4",
+        "wy" : "512ebd0966b68bfecf7a47021bcd9e6aa2703dcc556a9a443d16195aa145738fa36a4dff3d09481f4a86550a8d1f3545"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200040a49dc359ed4fef683e462dfe685442cea77b733fd95633216794d9a61f7e1022d942a36e781a484a2b479a643469af4512ebd0966b68bfecf7a47021bcd9e6aa2703dcc556a9a443d16195aa145738fa36a4dff3d09481f4a86550a8d1f3545",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABApJ3DWe1P72g+Ri3+aFRCzqd7cz\n/ZVjMhZ5TZph9+ECLZQqNueBpISitHmmQ0aa9FEuvQlmtov+z3pHAhvNnmqicD3M\nVWqaRD0WGVqhRXOPo2pN/z0JSB9KhlUKjR81RQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 344,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02303f2095530f36144e009019eee102b2867d83c9eb4f28bcb31b383e00c8c3746b20cc90e8efc813aefb5b6a4965204c53",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04276715087495d52c4160d15446ebb4d758291bf5bc9ca87b56c3f00adc41fa452d66684152d3e19d2fc3ad5d289787ad367385d3c3f5c3c2c6c3166adcfafc3d204453cab8797d56e955fbf1cf421763a6653e40efd9035df8128135546b6261",
+        "wx" : "276715087495d52c4160d15446ebb4d758291bf5bc9ca87b56c3f00adc41fa452d66684152d3e19d2fc3ad5d289787ad",
+        "wy" : "367385d3c3f5c3c2c6c3166adcfafc3d204453cab8797d56e955fbf1cf421763a6653e40efd9035df8128135546b6261"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004276715087495d52c4160d15446ebb4d758291bf5bc9ca87b56c3f00adc41fa452d66684152d3e19d2fc3ad5d289787ad367385d3c3f5c3c2c6c3166adcfafc3d204453cab8797d56e955fbf1cf421763a6653e40efd9035df8128135546b6261",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABCdnFQh0ldUsQWDRVEbrtNdYKRv1\nvJyoe1bD8ArcQfpFLWZoQVLT4Z0vw61dKJeHrTZzhdPD9cPCxsMWatz6/D0gRFPK\nuHl9VulV+/HPQhdjpmU+QO/ZA134EoE1VGtiYQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 345,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0230704afc6a72080d1728f6cc9fd023e9d2373023377f02599b6ea9fb2923dd7403fe2fd73999f65316b53f910bda4f6f10",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045943dbd66c79fcb882936eccdd6d860c42e20727a2cdb29165c8426c9d192990b71d9a3c7f240e46acab2741b7ee9c7a461e5ab1db3eb9b51b3238d3ada33567d251d8fd0fbaf59aa1cfb40fe7b22e0277f166a32edb81ab6a8580f9b1fb3e39",
+        "wx" : "5943dbd66c79fcb882936eccdd6d860c42e20727a2cdb29165c8426c9d192990b71d9a3c7f240e46acab2741b7ee9c7a",
+        "wy" : "461e5ab1db3eb9b51b3238d3ada33567d251d8fd0fbaf59aa1cfb40fe7b22e0277f166a32edb81ab6a8580f9b1fb3e39"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200045943dbd66c79fcb882936eccdd6d860c42e20727a2cdb29165c8426c9d192990b71d9a3c7f240e46acab2741b7ee9c7a461e5ab1db3eb9b51b3238d3ada33567d251d8fd0fbaf59aa1cfb40fe7b22e0277f166a32edb81ab6a8580f9b1fb3e39",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABFlD29Zsefy4gpNuzN1thgxC4gcn\nos2ykWXIQmydGSmQtx2aPH8kDkasqydBt+6cekYeWrHbPrm1GzI4062jNWfSUdj9\nD7r1mqHPtA/nsi4Cd/Fmoy7bgatqhYD5sfs+OQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 346,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023046f09c4741c1afe74e32f6ff14daaf90f4486c33f5d0e978f9af24f5751988e72b374c5faeffdec309330401965f7d20",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045285d72925c87c75b6ad9955064182bf2debcb25c88d0606f6672863de413e549688a4fcfbe6689bb23dba2b757bcda64ef6b01766c95b66ff10496d5deebac4b4bf8c3bb4232c019f80b69d8ab0214ceaf5813027ecec133a5a5b971948822e",
+        "wx" : "5285d72925c87c75b6ad9955064182bf2debcb25c88d0606f6672863de413e549688a4fcfbe6689bb23dba2b757bcda6",
+        "wy" : "4ef6b01766c95b66ff10496d5deebac4b4bf8c3bb4232c019f80b69d8ab0214ceaf5813027ecec133a5a5b971948822e"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200045285d72925c87c75b6ad9955064182bf2debcb25c88d0606f6672863de413e549688a4fcfbe6689bb23dba2b757bcda64ef6b01766c95b66ff10496d5deebac4b4bf8c3bb4232c019f80b69d8ab0214ceaf5813027ecec133a5a5b971948822e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABFKF1yklyHx1tq2ZVQZBgr8t68sl\nyI0GBvZnKGPeQT5Uloik/PvmaJuyPbordXvNpk72sBdmyVtm/xBJbV3uusS0v4w7\ntCMsAZ+Atp2KsCFM6vWBMCfs7BM6WluXGUiCLg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 347,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023019930a2b8bbd79b8051f252a1af76b4a5c6525adf9c6c7910a5ccf798eac0c8d4513923a792a965abe82bb564dac21cd",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040786afb03dd791dbfc371ab51ffa288b7cedd90d6a35a3c3a92566f895f38cb18536137e010f1cfba2fbed70568d77b84eec840cca8b6f3f612304b602ffad8dcbae1786b2c2216e9a1e59a6b69628b52a408b6a083d727f3ccd0e706f9aeef8",
+        "wx" : "786afb03dd791dbfc371ab51ffa288b7cedd90d6a35a3c3a92566f895f38cb18536137e010f1cfba2fbed70568d77b8",
+        "wy" : "4eec840cca8b6f3f612304b602ffad8dcbae1786b2c2216e9a1e59a6b69628b52a408b6a083d727f3ccd0e706f9aeef8"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200040786afb03dd791dbfc371ab51ffa288b7cedd90d6a35a3c3a92566f895f38cb18536137e010f1cfba2fbed70568d77b84eec840cca8b6f3f612304b602ffad8dcbae1786b2c2216e9a1e59a6b69628b52a408b6a083d727f3ccd0e706f9aeef8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABAeGr7A915Hb/DcatR/6KIt87dkN\najWjw6klZviV84yxhTYTfgEPHPui++1wVo13uE7shAzKi28/YSMEtgL/rY3LrheG\nssIhbpoeWaa2lii1KkCLagg9cn88zQ5wb5ru+A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 348,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023033261457177af3700a3e4a5435eed694b8ca4b5bf38d8f2214b99ef31d58191a8a272474f2552cb57d0576ac9b58439a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0446690db403904228e4f736b1344791596628e85669d4dd01374b21274280b421e42f5ba3f3f2fadad27d4469be7d9bdb7e883b43c27217f606e0a5ba6c9df781c145776c0e5a8993f0ed65c6ded65a43bddd0fe7611485e8e8d9e7decdf2d8b5",
+        "wx" : "46690db403904228e4f736b1344791596628e85669d4dd01374b21274280b421e42f5ba3f3f2fadad27d4469be7d9bdb",
+        "wy" : "7e883b43c27217f606e0a5ba6c9df781c145776c0e5a8993f0ed65c6ded65a43bddd0fe7611485e8e8d9e7decdf2d8b5"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000446690db403904228e4f736b1344791596628e85669d4dd01374b21274280b421e42f5ba3f3f2fadad27d4469be7d9bdb7e883b43c27217f606e0a5ba6c9df781c145776c0e5a8993f0ed65c6ded65a43bddd0fe7611485e8e8d9e7decdf2d8b5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABEZpDbQDkEIo5Pc2sTRHkVlmKOhW\nadTdATdLISdCgLQh5C9bo/Py+trSfURpvn2b236IO0PCchf2BuClumyd94HBRXds\nDlqJk/DtZcbe1lpDvd0P52EUhejo2efezfLYtQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 349,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02304cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046567",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048be6928acad44c9571b5c4015fa3ffae5e639e4130a1a66b473e5dfdfe93b68a8de89583666d4d699e8885469f9b1a4d83b1d5312310e445ae57c85ab1a3df8dbbb706a598fbc007efb602a14a5952fd7e7df0464d533e062ea211285c2f5c27",
+        "wx" : "08be6928acad44c9571b5c4015fa3ffae5e639e4130a1a66b473e5dfdfe93b68a8de89583666d4d699e8885469f9b1a4d",
+        "wy" : "083b1d5312310e445ae57c85ab1a3df8dbbb706a598fbc007efb602a14a5952fd7e7df0464d533e062ea211285c2f5c27"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200048be6928acad44c9571b5c4015fa3ffae5e639e4130a1a66b473e5dfdfe93b68a8de89583666d4d699e8885469f9b1a4d83b1d5312310e445ae57c85ab1a3df8dbbb706a598fbc007efb602a14a5952fd7e7df0464d533e062ea211285c2f5c27",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABIvmkorK1EyVcbXEAV+j/65eY55B\nMKGma0c+Xf3+k7aKjeiVg2ZtTWmeiIVGn5saTYOx1TEjEORFrlfIWrGj3427twal\nmPvAB++2AqFKWVL9fn3wRk1TPgYuohEoXC9cJw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 350,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0231008b33c708624a1e2eeba00fb5b5a8ed1a1622fc71ed897fb13d87ac253935e8365850d380015c115d12e14a2472860d09",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041886ddd282b023084953ef7d9e853a6adc1360cef7f56df7da0ca7bdcf4f3a5d227a730f9f20f9434b565dc4fa819e856a0f0ed8d7f28f916a4e727e55bf0818dcc84ed1132bd7da9f98ff95fb2aec238f4df9185b0982a6682c06c85e6a895e",
+        "wx" : "1886ddd282b023084953ef7d9e853a6adc1360cef7f56df7da0ca7bdcf4f3a5d227a730f9f20f9434b565dc4fa819e85",
+        "wy" : "6a0f0ed8d7f28f916a4e727e55bf0818dcc84ed1132bd7da9f98ff95fb2aec238f4df9185b0982a6682c06c85e6a895e"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200041886ddd282b023084953ef7d9e853a6adc1360cef7f56df7da0ca7bdcf4f3a5d227a730f9f20f9434b565dc4fa819e856a0f0ed8d7f28f916a4e727e55bf0818dcc84ed1132bd7da9f98ff95fb2aec238f4df9185b0982a6682c06c85e6a895e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABBiG3dKCsCMISVPvfZ6FOmrcE2DO\n9/Vt99oMp73PTzpdInpzD58g+UNLVl3E+oGehWoPDtjX8o+Rak5yflW/CBjcyE7R\nEyvX2p+Y/5X7Kuwjj035GFsJgqZoLAbIXmqJXg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 351,
+          "comment" : "point duplication during verification",
+          "msg" : "313233343030",
+          "sig" : "30650231008729cbb906f69d8d43f94cb8c4b9572c958272f5c6ff759ba9113f340b9f9aa598837aa37a4311717faf4cf66747a5b4023028a9b8c55eb6f5f1cf5c233aff640f48211cd2b9cf0593e8b9ffff67c7e69703f8a6c5382a36769d3cca57711ab63c65",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041886ddd282b023084953ef7d9e853a6adc1360cef7f56df7da0ca7bdcf4f3a5d227a730f9f20f9434b565dc4fa819e8522aa0fa9cb45dd96a50efcfffb2739c638672238da287ed97318da83848c25001d85ae11351397cb1f1af94ad29d62f5",
+        "wx" : "1886ddd282b023084953ef7d9e853a6adc1360cef7f56df7da0ca7bdcf4f3a5d227a730f9f20f9434b565dc4fa819e85",
+        "wy" : "22aa0fa9cb45dd96a50efcfffb2739c638672238da287ed97318da83848c25001d85ae11351397cb1f1af94ad29d62f5"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200041886ddd282b023084953ef7d9e853a6adc1360cef7f56df7da0ca7bdcf4f3a5d227a730f9f20f9434b565dc4fa819e8522aa0fa9cb45dd96a50efcfffb2739c638672238da287ed97318da83848c25001d85ae11351397cb1f1af94ad29d62f5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABBiG3dKCsCMISVPvfZ6FOmrcE2DO\n9/Vt99oMp73PTzpdInpzD58g+UNLVl3E+oGehSKqD6nLRd2WpQ78//snOcY4ZyI4\n2ih+2XMY2oOEjCUAHYWuETUTl8sfGvlK0p1i9Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 352,
+          "comment" : "duplication bug",
+          "msg" : "313233343030",
+          "sig" : "30650231008729cbb906f69d8d43f94cb8c4b9572c958272f5c6ff759ba9113f340b9f9aa598837aa37a4311717faf4cf66747a5b4023028a9b8c55eb6f5f1cf5c233aff640f48211cd2b9cf0593e8b9ffff67c7e69703f8a6c5382a36769d3cca57711ab63c65",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0489dd738efcb0f79811df6bec873485169450ada18e602721e61768be0d81e5d41381f24668276f32bfe31ff1c16bcb6b1f7a4d2823bcd73f236d90b6ea61d892026190e14317b5d110526e9e2675f03d5ef3fce87b5827a37e0cf19b4d3988c0",
+        "wx" : "089dd738efcb0f79811df6bec873485169450ada18e602721e61768be0d81e5d41381f24668276f32bfe31ff1c16bcb6b",
+        "wy" : "1f7a4d2823bcd73f236d90b6ea61d892026190e14317b5d110526e9e2675f03d5ef3fce87b5827a37e0cf19b4d3988c0"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000489dd738efcb0f79811df6bec873485169450ada18e602721e61768be0d81e5d41381f24668276f32bfe31ff1c16bcb6b1f7a4d2823bcd73f236d90b6ea61d892026190e14317b5d110526e9e2675f03d5ef3fce87b5827a37e0cf19b4d3988c0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABIndc478sPeYEd9r7Ic0hRaUUK2h\njmAnIeYXaL4NgeXUE4HyRmgnbzK/4x/xwWvLax96TSgjvNc/I22Qtuph2JICYZDh\nQxe10RBSbp4mdfA9XvP86HtYJ6N+DPGbTTmIwA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 353,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "313233343030",
+          "sig" : "306402302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba301772102301c25061a20a4e2a19cac497fa9c7a6c6376fe36862aa77bd6c9e1615bc00d454c30bbe23157ff3d00be80a009500e114",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04795592a673e82dff3d77450194e5308d64f45f11f759f34f7c7b5b7cc6ad73f9bff8f6633cc20378cff2e53fb7a5303085b5cd4621665aac8435d8ce85b26d444508b77b282e91cd5315c701d2e5b66ba4c00bf7e1eb0859a13cc351d00041a1",
+        "wx" : "795592a673e82dff3d77450194e5308d64f45f11f759f34f7c7b5b7cc6ad73f9bff8f6633cc20378cff2e53fb7a53030",
+        "wy" : "085b5cd4621665aac8435d8ce85b26d444508b77b282e91cd5315c701d2e5b66ba4c00bf7e1eb0859a13cc351d00041a1"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004795592a673e82dff3d77450194e5308d64f45f11f759f34f7c7b5b7cc6ad73f9bff8f6633cc20378cff2e53fb7a5303085b5cd4621665aac8435d8ce85b26d444508b77b282e91cd5315c701d2e5b66ba4c00bf7e1eb0859a13cc351d00041a1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABHlVkqZz6C3/PXdFAZTlMI1k9F8R\n91nzT3x7W3zGrXP5v/j2YzzCA3jP8uU/t6UwMIW1zUYhZlqshDXYzoWybURFCLd7\nKC6RzVMVxwHS5bZrpMAL9+HrCFmhPMNR0ABBoQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 354,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "306402302282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca02302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0439d94ff8757dcdb67480cbc48e9679423e57de5a23232df0db1e0ff7e908614401e6cd8d615008ea8be51299d9e22de9438126d70d14e75ce41ea2f409be88e2806f7f73bd513731696bc59e7a2c1d44d5683d3bdc92baba1c2ada58809f8bef",
+        "wx" : "39d94ff8757dcdb67480cbc48e9679423e57de5a23232df0db1e0ff7e908614401e6cd8d615008ea8be51299d9e22de9",
+        "wy" : "438126d70d14e75ce41ea2f409be88e2806f7f73bd513731696bc59e7a2c1d44d5683d3bdc92baba1c2ada58809f8bef"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000439d94ff8757dcdb67480cbc48e9679423e57de5a23232df0db1e0ff7e908614401e6cd8d615008ea8be51299d9e22de9438126d70d14e75ce41ea2f409be88e2806f7f73bd513731696bc59e7a2c1d44d5683d3bdc92baba1c2ada58809f8bef",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABDnZT/h1fc22dIDLxI6WeUI+V95a\nIyMt8NseD/fpCGFEAebNjWFQCOqL5RKZ2eIt6UOBJtcNFOdc5B6i9Am+iOKAb39z\nvVE3MWlrxZ56LB1E1Wg9O9ySurocKtpYgJ+L7w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 355,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "306402302282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca0230141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0420b1fc8e2480a973e097337343490b12ae40652e4180dd4ae56df521daa9e391777c0d466f018af55519038dead355017232882bca3ccd6b375591f5b5096538ca5778355307e603148fde31f5acffeb4c6863541ad233de3f281ea0d235b6f3",
+        "wx" : "20b1fc8e2480a973e097337343490b12ae40652e4180dd4ae56df521daa9e391777c0d466f018af55519038dead35501",
+        "wy" : "7232882bca3ccd6b375591f5b5096538ca5778355307e603148fde31f5acffeb4c6863541ad233de3f281ea0d235b6f3"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000420b1fc8e2480a973e097337343490b12ae40652e4180dd4ae56df521daa9e391777c0d466f018af55519038dead355017232882bca3ccd6b375591f5b5096538ca5778355307e603148fde31f5acffeb4c6863541ad233de3f281ea0d235b6f3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABCCx/I4kgKlz4Jczc0NJCxKuQGUu\nQYDdSuVt9SHaqeORd3wNRm8BivVVGQON6tNVAXIyiCvKPM1rN1WR9bUJZTjKV3g1\nUwfmAxSP3jH1rP/rTGhjVBrSM94/KB6g0jW28w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 356,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "306402302282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca02301c25061a20a4e2a19cac497fa9c7a6c6376fe36862aa77bd6c9e1615bc00d454c30bbe23157ff3d00be80a009500e114",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044a391d79cfa82b943123d69ee2d1bc0e0b7e1e6f93c69123bfce0bd4f31a5e3434062dd0e1aa8b886ceba362c4d6720c7a2b0543a156f1934e02d31e81d5d2785a71d541cc7e1e6e6132ebee42111f52a844937260719056ae7b10f751606c41",
+        "wx" : "4a391d79cfa82b943123d69ee2d1bc0e0b7e1e6f93c69123bfce0bd4f31a5e3434062dd0e1aa8b886ceba362c4d6720c",
+        "wy" : "7a2b0543a156f1934e02d31e81d5d2785a71d541cc7e1e6e6132ebee42111f52a844937260719056ae7b10f751606c41"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200044a391d79cfa82b943123d69ee2d1bc0e0b7e1e6f93c69123bfce0bd4f31a5e3434062dd0e1aa8b886ceba362c4d6720c7a2b0543a156f1934e02d31e81d5d2785a71d541cc7e1e6e6132ebee42111f52a844937260719056ae7b10f751606c41",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABEo5HXnPqCuUMSPWnuLRvA4Lfh5v\nk8aRI7/OC9TzGl40NAYt0OGqi4hs66NixNZyDHorBUOhVvGTTgLTHoHV0nhacdVB\nzH4ebmEy6+5CER9SqESTcmBxkFauexD3UWBsQQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 357,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "306402302282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca02307094186882938a8672b125fea71e9b18ddbf8da18aa9def5b2785856f00351530c2ef88c55ffcf402fa0280254038451",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0436854adacf83ce5f0e4422406d7b6f7db63d73d4c892a01e975ef6ee6b71a9334c9d57ce6ffcdb1a2e4174ddba799e127d619672035db4fd73e5e4b4ea920b74f2e70fd24ebca49d22fdb11e96b7867fa1838ca5babcd9dd096ab85e2f97b5ae",
+        "wx" : "36854adacf83ce5f0e4422406d7b6f7db63d73d4c892a01e975ef6ee6b71a9334c9d57ce6ffcdb1a2e4174ddba799e12",
+        "wy" : "7d619672035db4fd73e5e4b4ea920b74f2e70fd24ebca49d22fdb11e96b7867fa1838ca5babcd9dd096ab85e2f97b5ae"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000436854adacf83ce5f0e4422406d7b6f7db63d73d4c892a01e975ef6ee6b71a9334c9d57ce6ffcdb1a2e4174ddba799e127d619672035db4fd73e5e4b4ea920b74f2e70fd24ebca49d22fdb11e96b7867fa1838ca5babcd9dd096ab85e2f97b5ae",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABDaFStrPg85fDkQiQG17b322PXPU\nyJKgHpde9u5rcakzTJ1Xzm/82xouQXTdunmeEn1hlnIDXbT9c+XktOqSC3Ty5w/S\nTryknSL9sR6Wt4Z/oYOMpbq82d0JarheL5e1rg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 358,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "306402302282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca0230789eac6ff99e146b7ae25f90d7a0cabf36baf32d14916ee2aceea7cadc95d7221f56e5baee6d82a03307064ba32856e9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04804e6c71e493b783ecd375a4edcf86c77b1c2df551bbc73bed8516e4d11ce51a1dd081e19aa6f51c656818b853962178580bd6b2c4eabcf5b3741e6b7d59b0e7f2bddb247f5f9d6751cf09e3c6c9d1f7c27c0bb8d21e77a80ebadaf90af8b0d0",
+        "wx" : "0804e6c71e493b783ecd375a4edcf86c77b1c2df551bbc73bed8516e4d11ce51a1dd081e19aa6f51c656818b853962178",
+        "wy" : "580bd6b2c4eabcf5b3741e6b7d59b0e7f2bddb247f5f9d6751cf09e3c6c9d1f7c27c0bb8d21e77a80ebadaf90af8b0d0"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004804e6c71e493b783ecd375a4edcf86c77b1c2df551bbc73bed8516e4d11ce51a1dd081e19aa6f51c656818b853962178580bd6b2c4eabcf5b3741e6b7d59b0e7f2bddb247f5f9d6751cf09e3c6c9d1f7c27c0bb8d21e77a80ebadaf90af8b0d0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABIBObHHkk7eD7NN1pO3Phsd7HC31\nUbvHO+2FFuTRHOUaHdCB4Zqm9RxlaBi4U5YheFgL1rLE6rz1s3Qea31ZsOfyvdsk\nf1+dZ1HPCePGydH3wnwLuNIed6gOutr5Cviw0A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 359,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "306402302282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca023064dc78d112cd6ed67d4323b302650a606ed41415bd8cfc40ec7438a70ee3d8680420e5f602aed591a324760c58140642",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042c115772dd298612197a1c59df9c25a86ac16fa4f27adf74bcc673bb4a6a4bb5d0b5b64470d5d26e0300922ab723732442f6ec209e27ce0b127d334745272643d3666bff54927419764de52322ee1696e620d15e0eea62fed0f20efe6c91e1e3",
+        "wx" : "2c115772dd298612197a1c59df9c25a86ac16fa4f27adf74bcc673bb4a6a4bb5d0b5b64470d5d26e0300922ab7237324",
+        "wy" : "42f6ec209e27ce0b127d334745272643d3666bff54927419764de52322ee1696e620d15e0eea62fed0f20efe6c91e1e3"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200042c115772dd298612197a1c59df9c25a86ac16fa4f27adf74bcc673bb4a6a4bb5d0b5b64470d5d26e0300922ab723732442f6ec209e27ce0b127d334745272643d3666bff54927419764de52322ee1696e620d15e0eea62fed0f20efe6c91e1e3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABCwRV3LdKYYSGXocWd+cJahqwW+k\n8nrfdLzGc7tKaku10LW2RHDV0m4DAJIqtyNzJEL27CCeJ84LEn0zR0UnJkPTZmv/\nVJJ0GXZN5SMi7haW5iDRXg7qYv7Q8g7+bJHh4w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 360,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "306402301d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e02302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04295778c9a3be2b373450f57daf10de66d32441750ac4289f6751ff61405ce0237f64e28ac5281a81d13fba81a8454e584c9f3991d615512faf0dc9107193b1b6f5cd684356ca51504d15c1ca4ba00b21c7c68eb4683222a8211e4ffd56da0e06",
+        "wx" : "295778c9a3be2b373450f57daf10de66d32441750ac4289f6751ff61405ce0237f64e28ac5281a81d13fba81a8454e58",
+        "wy" : "4c9f3991d615512faf0dc9107193b1b6f5cd684356ca51504d15c1ca4ba00b21c7c68eb4683222a8211e4ffd56da0e06"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004295778c9a3be2b373450f57daf10de66d32441750ac4289f6751ff61405ce0237f64e28ac5281a81d13fba81a8454e584c9f3991d615512faf0dc9107193b1b6f5cd684356ca51504d15c1ca4ba00b21c7c68eb4683222a8211e4ffd56da0e06",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABClXeMmjvis3NFD1fa8Q3mbTJEF1\nCsQon2dR/2FAXOAjf2TiisUoGoHRP7qBqEVOWEyfOZHWFVEvrw3JEHGTsbb1zWhD\nVspRUE0VwcpLoAshx8aOtGgyIqghHk/9VtoOBg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 361,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "306402301d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e0230141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0465a340bc68f3fcead4f04277ee8675f9c17bc8c88426c5ba0313b8ce7da58d92ca9a0ffa32c7eee195857d860ba1eebe4dcd5be3a6778008b36ea19d902d93dd488f6fb65dc0719521553b39cb3c524b12681d2e07a8ef720cdc15011c23ba9d",
+        "wx" : "65a340bc68f3fcead4f04277ee8675f9c17bc8c88426c5ba0313b8ce7da58d92ca9a0ffa32c7eee195857d860ba1eebe",
+        "wy" : "4dcd5be3a6778008b36ea19d902d93dd488f6fb65dc0719521553b39cb3c524b12681d2e07a8ef720cdc15011c23ba9d"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000465a340bc68f3fcead4f04277ee8675f9c17bc8c88426c5ba0313b8ce7da58d92ca9a0ffa32c7eee195857d860ba1eebe4dcd5be3a6778008b36ea19d902d93dd488f6fb65dc0719521553b39cb3c524b12681d2e07a8ef720cdc15011c23ba9d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGWjQLxo8/zq1PBCd+6GdfnBe8jI\nhCbFugMTuM59pY2SypoP+jLH7uGVhX2GC6Huvk3NW+Omd4AIs26hnZAtk91Ij2+2\nXcBxlSFVOznLPFJLEmgdLgeo73IM3BUBHCO6nQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 362,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "306402301d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e02301c25061a20a4e2a19cac497fa9c7a6c6376fe36862aa77bd6c9e1615bc00d454c30bbe23157ff3d00be80a009500e114",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0454a03902656bfaf4d6a54ff3429d9f9719bb61e6caf000e100992b31700e780e0f73f51614954acdddcaaa8b2311195b04ad3b19b01e150a39dc0cfaecc6498b18138ce612c492795687a488522644b3ddf7462c3c359bd091b7d39469571879",
+        "wx" : "54a03902656bfaf4d6a54ff3429d9f9719bb61e6caf000e100992b31700e780e0f73f51614954acdddcaaa8b2311195b",
+        "wy" : "4ad3b19b01e150a39dc0cfaecc6498b18138ce612c492795687a488522644b3ddf7462c3c359bd091b7d39469571879"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000454a03902656bfaf4d6a54ff3429d9f9719bb61e6caf000e100992b31700e780e0f73f51614954acdddcaaa8b2311195b04ad3b19b01e150a39dc0cfaecc6498b18138ce612c492795687a488522644b3ddf7462c3c359bd091b7d39469571879",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABFSgOQJla/r01qVP80Kdn5cZu2Hm\nyvAA4QCZKzFwDngOD3P1FhSVSs3dyqqLIxEZWwStOxmwHhUKOdwM+uzGSYsYE4zm\nEsSSeVaHpIhSJkSz3fdGLDw1m9CRt9OUaVcYeQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 363,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "306402301d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e02307094186882938a8672b125fea71e9b18ddbf8da18aa9def5b2785856f00351530c2ef88c55ffcf402fa0280254038451",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0446d10d749a47a4d3f25b6f28951a11f01a54c2413957a477162dabe0d08d8ae9b6a9f44b68ef341fb820b0c24c7a1c0e671ff166cd35d2f3cc821d58fa18e35d25e6033b9e790fce4818f9e570921c0034b381cc9ad254eeaf1b386e511b7c89",
+        "wx" : "46d10d749a47a4d3f25b6f28951a11f01a54c2413957a477162dabe0d08d8ae9b6a9f44b68ef341fb820b0c24c7a1c0e",
+        "wy" : "671ff166cd35d2f3cc821d58fa18e35d25e6033b9e790fce4818f9e570921c0034b381cc9ad254eeaf1b386e511b7c89"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000446d10d749a47a4d3f25b6f28951a11f01a54c2413957a477162dabe0d08d8ae9b6a9f44b68ef341fb820b0c24c7a1c0e671ff166cd35d2f3cc821d58fa18e35d25e6033b9e790fce4818f9e570921c0034b381cc9ad254eeaf1b386e511b7c89",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABEbRDXSaR6TT8ltvKJUaEfAaVMJB\nOVekdxYtq+DQjYrptqn0S2jvNB+4ILDCTHocDmcf8WbNNdLzzIIdWPoY410l5gM7\nnnkPzkgY+eVwkhwANLOBzJrSVO6vGzhuURt8iQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 364,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "306402301d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e0230789eac6ff99e146b7ae25f90d7a0cabf36baf32d14916ee2aceea7cadc95d7221f56e5baee6d82a03307064ba32856e9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048ae92de10b244ac7f0deb6b102d075951d8c13b2960c2e98d7fb42b8abe90fd07a4a21b86eb4c77efe9adb6725676d1736063f3407c71627acaa83be9029c7a40e8aa896cb68a9c2fa2aaa1079035a283181cd3f2723b221d5a8747ad392a0f9",
+        "wx" : "08ae92de10b244ac7f0deb6b102d075951d8c13b2960c2e98d7fb42b8abe90fd07a4a21b86eb4c77efe9adb6725676d17",
+        "wy" : "36063f3407c71627acaa83be9029c7a40e8aa896cb68a9c2fa2aaa1079035a283181cd3f2723b221d5a8747ad392a0f9"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200048ae92de10b244ac7f0deb6b102d075951d8c13b2960c2e98d7fb42b8abe90fd07a4a21b86eb4c77efe9adb6725676d1736063f3407c71627acaa83be9029c7a40e8aa896cb68a9c2fa2aaa1079035a283181cd3f2723b221d5a8747ad392a0f9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABIrpLeELJErH8N62sQLQdZUdjBOy\nlgwumNf7Qrir6Q/QekohuG60x37+mttnJWdtFzYGPzQHxxYnrKqDvpApx6QOiqiW\ny2ipwvoqqhB5A1ooMYHNPycjsiHVqHR605Kg+Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 365,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "306402301d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e023064dc78d112cd6ed67d4323b302650a606ed41415bd8cfc40ec7438a70ee3d8680420e5f602aed591a324760c58140642",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c5315",
+        "wx" : "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e",
+        "wy" : "08abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c5315"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c5315",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABB0cZPBoz0X/oqY6gbfBP2uIR6Pn\nfvFP49t/yv4MvRDo6CbgNDbWRqrvh7LiR9SvHoq+HXUg+cKkXLHrjpXP1VJitwsp\n/uxYZOGcBU/5kSkoDkZGIXeRgRFCggNBJjxTFQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 366,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3065023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0230141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 367,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "306402301fc115146e521d7ea33f3e128eb01db0f653dc45852c2b50301d639b778b13380e51d9366552cf2049156605d57adffc0230141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e01fb010d823eaa83b2ab83efbb166c8cb27865dfee67fe4f3115d4c98625e7fb9e8d6108188b996044c4fcd20acb993e",
+        "wx" : "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e",
+        "wy" : "1fb010d823eaa83b2ab83efbb166c8cb27865dfee67fe4f3115d4c98625e7fb9e8d6108188b996044c4fcd20acb993e"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e01fb010d823eaa83b2ab83efbb166c8cb27865dfee67fe4f3115d4c98625e7fb9e8d6108188b996044c4fcd20acb993e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABB0cZPBoz0X/oqY6gbfBP2uIR6Pn\nfvFP49t/yv4MvRDo6CbgNDbWRqrvh7LiR9SvHgH7AQ2CPqqDsquD77sWbIyyeGXf\n7mf+TzEV1MmGJef7no1hCBiLmWBExPzSCsuZPg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 368,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3065023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0230141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 369,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "306402301fc115146e521d7ea33f3e128eb01db0f653dc45852c2b50301d639b778b13380e51d9366552cf2049156605d57adffc0230141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046c9aaba343cb2faf098319cc4d15ea218786f55c8cf0a8b668091170a6422f6c2498945a8164a4b6f27cdd11e800da501be961b37b09804610ce0df40dd8236c75a12d0c8014b163464a4aeba7cb18d20d3222083ec4a941852f24aa3d5d84e3",
+        "wx" : "6c9aaba343cb2faf098319cc4d15ea218786f55c8cf0a8b668091170a6422f6c2498945a8164a4b6f27cdd11e800da50",
+        "wy" : "1be961b37b09804610ce0df40dd8236c75a12d0c8014b163464a4aeba7cb18d20d3222083ec4a941852f24aa3d5d84e3"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200046c9aaba343cb2faf098319cc4d15ea218786f55c8cf0a8b668091170a6422f6c2498945a8164a4b6f27cdd11e800da501be961b37b09804610ce0df40dd8236c75a12d0c8014b163464a4aeba7cb18d20d3222083ec4a941852f24aa3d5d84e3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGyaq6NDyy+vCYMZzE0V6iGHhvVc\njPCotmgJEXCmQi9sJJiUWoFkpLbyfN0R6ADaUBvpYbN7CYBGEM4N9A3YI2x1oS0M\ngBSxY0ZKSuunyxjSDTIiCD7EqUGFLySqPV2E4w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 370,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "3064023065fd456814371d60883ffda5f74f36dc2d45886121770e29ed3163754716d12c1cab03a2cb6a6e3376fc96d8727bd1bf02301aa65e57932d05788413219b7ab23e5337f63fb2dcb0f89b4227d284a3fcbdf3c54c021a6c0ca42445bf802213121654",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 371,
+          "comment" : "pseudorandom signature",
+          "msg" : "4d7367",
+          "sig" : "3064023001057e36ad00f79e7c1cfcf4dea301e4e2350644d5eff4d4c7f23cdd2f4f236093ff27e33eb44fd804b2f0daf5c327a402302a9b2b910dd23b994cac12f322828461094c8790481b392569c6674ac2eca74dd74957d94456548546b65bd50558f4a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 372,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "306402306dd9d4e98c9c388240e95c49b2100afbe0d722f8a152651c61d7ef9bf46150e3cdf9bf6330e75e4bf2c294cd66e48d0602301282d33b5b79d4eaafa03a77bb8ba2c318291f6ea09d548b7704bb00910856dd360557e609add891c6435d7a80afddfb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 373,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "3065023046cb43798bc06dbe788a4f4b2b98130e3aae917f1d2a005656bd70a3288caf7c37d1dee0c9108828a69d2a1eeae113c60231008180d0c5ba1bed4f2b0d4d8ed7ea17916b63400397e7b6d70e7312c5ff0f4524a49abf7071c8ba470de64fb668570380",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04462117d2e33a7db1b95c8a6a3c7982f83da96817e749718caee7b6aa9c9da4e8f2ff7951674eed2b569ab846f59002a850e6606a9726a9209c9e945fbf6cbbc9a487c4a4d81c52ac3684c26c3392b9bd24f7184821be06f6448b24a8ffffffff",
+        "wx" : "462117d2e33a7db1b95c8a6a3c7982f83da96817e749718caee7b6aa9c9da4e8f2ff7951674eed2b569ab846f59002a8",
+        "wy" : "50e6606a9726a9209c9e945fbf6cbbc9a487c4a4d81c52ac3684c26c3392b9bd24f7184821be06f6448b24a8ffffffff"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004462117d2e33a7db1b95c8a6a3c7982f83da96817e749718caee7b6aa9c9da4e8f2ff7951674eed2b569ab846f59002a850e6606a9726a9209c9e945fbf6cbbc9a487c4a4d81c52ac3684c26c3392b9bd24f7184821be06f6448b24a8ffffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABEYhF9LjOn2xuVyKajx5gvg9qWgX\n50lxjK7ntqqcnaTo8v95UWdO7StWmrhG9ZACqFDmYGqXJqkgnJ6UX79su8mkh8Sk\n2BxSrDaEwmwzkrm9JPcYSCG+BvZEiySo/////w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 374,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3064023043a3ac2f3d2b4d3723a97930b023ee73010a7cf8d2a99372f3132bd7d9c83574de3ab86525efc4ee2c59799d5ff7efb4023034f59a3ea9f5267f8458afdaa3873e2336e0ab8a40ca1b797cbd977d192f2024f9eb8d39b37b9a238f208d66bacd27bf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 375,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "306402303531ada25b8d9af9b87e5224cd6a6d956c17dc323ef8980f497a6e7e44c83d69b74de791d62bceacaff7378863dd725b0230459d15539399409380af99d560c561217daa5c539729453067dd1aa4bd9df2b534920f0d6213261ecea16f0ed68536b1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 376,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "30640230438a0cff9fcfcf587f8c40775ad44ea4b0ed69f2d547befe295d1fb9c24ddcb97f228027df552a06bf657b4c2027261502305e157630bb744fc8e7f75901de498e5af0b5511dfeee0c4c1f2e5c4aa0129de57b87a2a13ea59d187d51cbeb6ef22407",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048cb91e81ee5901b71a59a4f7c8174ae05fe3ba00f699dcbc3c9233265c640587b3c165593c2d76b5ffc4b8dcbcb0e6553a0e5d14f2d0e8efe2bd8aa260d8ace06bf964c51bab8207070a2d30410bb6b87aeecb7fff802f2d4ea3caf6e0e7e726",
+        "wx" : "08cb91e81ee5901b71a59a4f7c8174ae05fe3ba00f699dcbc3c9233265c640587b3c165593c2d76b5ffc4b8dcbcb0e655",
+        "wy" : "3a0e5d14f2d0e8efe2bd8aa260d8ace06bf964c51bab8207070a2d30410bb6b87aeecb7fff802f2d4ea3caf6e0e7e726"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200048cb91e81ee5901b71a59a4f7c8174ae05fe3ba00f699dcbc3c9233265c640587b3c165593c2d76b5ffc4b8dcbcb0e6553a0e5d14f2d0e8efe2bd8aa260d8ace06bf964c51bab8207070a2d30410bb6b87aeecb7fff802f2d4ea3caf6e0e7e726",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABIy5HoHuWQG3Glmk98gXSuBf47oA\n9pncvDySMyZcZAWHs8FlWTwtdrX/xLjcvLDmVToOXRTy0Ojv4r2KomDYrOBr+WTF\nG6uCBwcKLTBBC7a4eu7Lf/+ALy1Oo8r24OfnJg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 377,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3064023016496c08c3076773fcd841a5e25e1a87108e0ba90f9727f539034bd2cf688e01a955686a15112e0590fc91e3995ff5f8023031b1b7338f74adba33712a83a7c685e7cd5f3be84ef951ecad50facb7c6ec393a3bac52ea7b1212bd92f4f45a9f8514c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 378,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "306602310087f3090292e79b722cde5aedafa4244f6eb460a280e2e050399b9d802391ad502108704a3c0bb9f9ae571c3f7dec6c0b02310089ae0043de38a585a1632c7211b78303afa3f8936154a6e65a6f729c3b1ec66a1775aa465af8eed6dfeaa5ba98cedb41",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 379,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30640230720822abefa91265a7b8d446ec3bc405fd192178aa1b85dd663396a896a32c119e64b1a20843f81edd43c03709b8dbc60230206ae95bb18d2d3844a39340872edba1611e3ea0e84cea7cb6cff282af414d8b5aa0be8aabc1b51b7121d426916b01b5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0469ebf332e1eb2455324a7572a17977a4e2955108ee8bd81bd6d1f555d608687f5bbb39858ebee304985baa7d09c830bb672b9c96684dfc007f015e39cdada9fe16db5022bfd173348caafc528684621f97fba24f2c30e3dc728772e800000000",
+        "wx" : "69ebf332e1eb2455324a7572a17977a4e2955108ee8bd81bd6d1f555d608687f5bbb39858ebee304985baa7d09c830bb",
+        "wy" : "672b9c96684dfc007f015e39cdada9fe16db5022bfd173348caafc528684621f97fba24f2c30e3dc728772e800000000"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000469ebf332e1eb2455324a7572a17977a4e2955108ee8bd81bd6d1f555d608687f5bbb39858ebee304985baa7d09c830bb672b9c96684dfc007f015e39cdada9fe16db5022bfd173348caafc528684621f97fba24f2c30e3dc728772e800000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGnr8zLh6yRVMkp1cqF5d6TilVEI\n7ovYG9bR9VXWCGh/W7s5hY6+4wSYW6p9Ccgwu2crnJZoTfwAfwFeOc2tqf4W21Ai\nv9FzNIyq/FKGhGIfl/uiTyww49xyh3LoAAAAAA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 380,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "306402301e5027fcc630aa08750a4725919dd9072422a21aca9d3326bec3e6ac040ba9784951b1fda6f588e60dcb550b75793a4e02300df3224641f6804f4d1bf951051e087ce1fa7365c43bd27878626833f09190cc0a7fa29b16bc2ca0d34fd0660d24718f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 381,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "306402304e61e34740a9f6db0854faf205719a3d98ef644b86241b858fa22959c04395578bef7be35036ae7a9ffeb9a2173311f402301e967c3b6071d37560fd64a4fe0921b1d600f60d883fdec816836176c5e67ad05182aa080c7e2184c0710050d523f0e2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 382,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "306402302c3090c581e575da58a8f659f74c5eee566400eb1d91de0a950e787542e6572f73b9f6d4f81f1c8e42f9e460dac3c1dc0230756b1b693e7fe06686708c2a609854accd21e3195d84b72c11c873908d175dfc00c00ebbdf8e2bb6970f2f19785303cc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044fb5688666673f104287428b5bae6bd82a5c69b523762aa739b24594a9a81297318df613f6b7379af47979ae7fffffff7e2d325b41fe831a23cb694cb80a30119c196143536ee334416ba437a419054c180a945154596b83d7f7c3a6b6059645",
+        "wx" : "4fb5688666673f104287428b5bae6bd82a5c69b523762aa739b24594a9a81297318df613f6b7379af47979ae7fffffff",
+        "wy" : "7e2d325b41fe831a23cb694cb80a30119c196143536ee334416ba437a419054c180a945154596b83d7f7c3a6b6059645"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200044fb5688666673f104287428b5bae6bd82a5c69b523762aa739b24594a9a81297318df613f6b7379af47979ae7fffffff7e2d325b41fe831a23cb694cb80a30119c196143536ee334416ba437a419054c180a945154596b83d7f7c3a6b6059645",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABE+1aIZmZz8QQodCi1uua9gqXGm1\nI3YqpzmyRZSpqBKXMY32E/a3N5r0eXmuf////34tMltB/oMaI8tpTLgKMBGcGWFD\nU27jNEFrpDekGQVMGAqUUVRZa4PX98OmtgWWRQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 383,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "30640230092f0ee1feeb79c054ae36235f8717e9ee72b466b1704d4fa78addfcd13518a64db2b2fdb06439acbc4c045fb2c23c3a02302371ca6d36f4266162ee5c657c71cea35dcec3632c5b220a6f23ace1ba6562a841aeeeefe87a7998adfaf185b8558e4a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 384,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "306402306c8f4be641afaf5bf91ce08974d284ece6aec74792247229fa86c6597eed3fb507b712bb77af0226e1bbb3bad632b0d80230775954fe8bf936157b7ab7a683f6dc1838a8718200621bc8bf2f32b778f6c8e8c656532b50de39ac22d22b37dccfd1f9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 385,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3064023076e5c07582177400df453114fed746f40704197897b4ca21b72e5b44d4ca40cfcaa55e4446355c91ea9767f38c8172df02300c6dd73eefbb4c06e823224d8efaa3ee934e4a97eed2833513b4d735ed06eb550b2a5fa7f86613d627d9db466afa6646",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0434770c73a7e42ce7a57d1de6e54f35f1752047f6513584c7b14bca17d7abc499f8ab037c70fd2e13a8b97b2ae263688622421615ba363f1ffe9a8f2fe0f6e246fda11462a3ec000c685e09a90dbcdc2af6467f9ee69b5e7bead9b8461f4a4be0",
+        "wx" : "34770c73a7e42ce7a57d1de6e54f35f1752047f6513584c7b14bca17d7abc499f8ab037c70fd2e13a8b97b2ae2636886",
+        "wy" : "22421615ba363f1ffe9a8f2fe0f6e246fda11462a3ec000c685e09a90dbcdc2af6467f9ee69b5e7bead9b8461f4a4be0"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000434770c73a7e42ce7a57d1de6e54f35f1752047f6513584c7b14bca17d7abc499f8ab037c70fd2e13a8b97b2ae263688622421615ba363f1ffe9a8f2fe0f6e246fda11462a3ec000c685e09a90dbcdc2af6467f9ee69b5e7bead9b8461f4a4be0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABDR3DHOn5CznpX0d5uVPNfF1IEf2\nUTWEx7FLyhfXq8SZ+KsDfHD9LhOouXsq4mNohiJCFhW6Nj8f/pqPL+D24kb9oRRi\no+wADGheCakNvNwq9kZ/nuabXnvq2bhGH0pL4A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 386,
+          "comment" : "x-coordinate of the public key is large on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "306402300e44fdc33aed0c320e371e2a78e9f18fde83434e681afb05a5bdb0f43cac70e83ede56bf8c56acf70e054e2ffef549cf02301324b4cfe684d401eac15b0940f5835436d3a1028e27c1966dbf69fefef82748a05b4443c77c870789135755d0d184cf",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 387,
+          "comment" : "x-coordinate of the public key is large on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "306402305966acd8a7714f2015e36fd4fdb3452258ce0aaefb3972091b496bd530bbaf1ec67d7e37e50031b3eea44a8bb8f62c2002302a5f309d2fad55b93a7a3012cbda2845efaa4ea0d187d3824f4a6a9227730d3ab15246d8d0952c7ee8c0b9eb83d1c2a2",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 388,
+          "comment" : "x-coordinate of the public key is large on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "30640230266eace657e1ec88a2adbb38a5afb4f750274ca614d1fde9ea39dff6f2a2aa69923e9a7489f06bf9d84c518cee57e55b02303d19027684ef221216f63a591d8e793524e4c1234a56ce415bb9ad9e2ebf25ac94a99261b9157d19daa5aa876291f308",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0486f0fc89b7861ec3bd582161aecfc95789ae402459eb7f3015b7dd24e20fc9b005c635fc290a0e2a9ff35863b7b82e3e01ebba489e923dad88146077914e3ae5c575e1bececec710962a18ffd91005776c4d9e4bd952c793587a70291ce478b4",
+        "wx" : "086f0fc89b7861ec3bd582161aecfc95789ae402459eb7f3015b7dd24e20fc9b005c635fc290a0e2a9ff35863b7b82e3e",
+        "wy" : "1ebba489e923dad88146077914e3ae5c575e1bececec710962a18ffd91005776c4d9e4bd952c793587a70291ce478b4"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000486f0fc89b7861ec3bd582161aecfc95789ae402459eb7f3015b7dd24e20fc9b005c635fc290a0e2a9ff35863b7b82e3e01ebba489e923dad88146077914e3ae5c575e1bececec710962a18ffd91005776c4d9e4bd952c793587a70291ce478b4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABIbw/Im3hh7DvVghYa7PyVeJrkAk\nWet/MBW33STiD8mwBcY1/CkKDiqf81hjt7guPgHrukiekj2tiBRgd5FOOuXFdeG+\nzs7HEJYqGP/ZEAV3bE2eS9lSx5NYenApHOR4tA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 389,
+          "comment" : "x-coordinate of the public key is small on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "3064023013de6eb532321c023092aa78c199f9ee4dce7a18df158c3e799461af9d96c2d38765a78fdb14404d199365de05bd44c502302514a0359bcb66122bf48c186a4bb2edccf305b06414b11f470d2512cadda129366f6072de715bc2babb8a3a5f260d9b",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 390,
+          "comment" : "x-coordinate of the public key is small on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "306402301308d3d9edfe3ad07e215a975b2b067e9f0b803371b3029f4388a3471f4db23f358aea5c03db62d77115c56c4962633b02304b8b1fe44b32cc669114a1ce0ba0555446d0c96a32cb602185e8fba414d3a831cbf5b519b0f90647dc45e30a1f23ef90",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 391,
+          "comment" : "x-coordinate of the public key is small on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "306402305da3df094155b8f8812d0c6345344e41c3b591b65b95fedbbcbd3c3a3bb1c1dbfc4d4c5b841b8f8874d59b07cf2288fc02304a1e4a8399abbdf246929b2559bb0fa404772755fc74523626aeef432fe4764df1e1f5c9b0f897ed8f1ffd7a88167f0e",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04082f7dceb585c5ba4894b0faf6604da888a311ad9f41731a1d3937168a10b0795a1fae496cb9a90739e1c0a6e531e8072c3b8568eaa1c6f541a665ce7a66f78ea2d5893103e6028add62356492d8b5ac6ab8901d59621c33416c33981bd594ec",
+        "wx" : "082f7dceb585c5ba4894b0faf6604da888a311ad9f41731a1d3937168a10b0795a1fae496cb9a90739e1c0a6e531e807",
+        "wy" : "2c3b8568eaa1c6f541a665ce7a66f78ea2d5893103e6028add62356492d8b5ac6ab8901d59621c33416c33981bd594ec"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004082f7dceb585c5ba4894b0faf6604da888a311ad9f41731a1d3937168a10b0795a1fae496cb9a90739e1c0a6e531e8072c3b8568eaa1c6f541a665ce7a66f78ea2d5893103e6028add62356492d8b5ac6ab8901d59621c33416c33981bd594ec",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABAgvfc61hcW6SJSw+vZgTaiIoxGt\nn0FzGh05NxaKELB5Wh+uSWy5qQc54cCm5THoByw7hWjqocb1QaZlznpm946i1Ykx\nA+YCit1iNWSS2LWsariQHVliHDNBbDOYG9WU7A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 392,
+          "comment" : "x-coordinate of the public key has many trailing 0's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "306402300bf6fec0a5be27cddb0e7669ae06d15dfa75837f8ee72b47443ac845ffcd427b0893e10c85c20c7aa576fb70e87761ab02307418b6f374936adca8b07dc51545ee34ed2e9f56f3267033e30ea09a0acd31b6ce83503ee7e098627f8ba8b4c584341e",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 393,
+          "comment" : "x-coordinate of the public key has many trailing 0's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "3064023003e306a86f6b2cb248fcb68d1d317a6042b7089e96d74c2f5b934e2e122831268a45e2185b7c21270e8b906cd372e6d702304c82ab6de6bc0194ac1a2e3480a0c80466af7d2a329d20b03151d1806a0bc0720f55d3781a7db9febe7d8bbd0a719bfa",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 394,
+          "comment" : "x-coordinate of the public key has many trailing 0's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "3064023014d1df9b3db55ecc8d1e126625bdf5b6316bba1e7f4ea5ec77418c754a597563dc5dc291b7dd047782d518fe74e0be83023033ef701c440f280edf81a9632dde9dc17de5f438dcc19e9ca5919b4b73e62905e5f7e0bc9db0b14bc53327f79f70c6da",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046afe4ea7705492bda308b789d70da49457dde825d5258960a7a366e4665af9d326392c2672165ea4bbdc33374d88e7498475e6937a10a6f6a50f23de9126ba04e5650a1cd06a8066ca423339fc2ce53d91482744a4cdf2f937f76f12aae3f630",
+        "wx" : "6afe4ea7705492bda308b789d70da49457dde825d5258960a7a366e4665af9d326392c2672165ea4bbdc33374d88e749",
+        "wy" : "08475e6937a10a6f6a50f23de9126ba04e5650a1cd06a8066ca423339fc2ce53d91482744a4cdf2f937f76f12aae3f630"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200046afe4ea7705492bda308b789d70da49457dde825d5258960a7a366e4665af9d326392c2672165ea4bbdc33374d88e7498475e6937a10a6f6a50f23de9126ba04e5650a1cd06a8066ca423339fc2ce53d91482744a4cdf2f937f76f12aae3f630",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGr+TqdwVJK9owi3idcNpJRX3egl\n1SWJYKejZuRmWvnTJjksJnIWXqS73DM3TYjnSYR15pN6EKb2pQ8j3pEmugTlZQoc\n0GqAZspCMzn8LOU9kUgnRKTN8vk3928SquP2MA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 395,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "306402306a3a18400686635ae279c385b640d4fa080d9c44a5d421fe4be5a5ec7a8ae31b00bfa406e919e57e39c11360e670d8690230729c0b9ff77f88f810548d6db1835312a448114a3bd93cf59422faa2ea026f5d47627f0c11fb859112246d879c859568",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 396,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "306502301ab8d6c31d4577f59ca5714c9eada979fdb9ec0cad32d8cb915dbd70492947187f5a52718e19982f7a2d4cb48b227723023100872e3ce7d1fd5ae180faf1990b11937558aa44ccdab631492b8925be84fbcb452148edad5bbfe48c06b8c9908ca252fd",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 397,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "3066023100803ffc58f8150a9c4c229a7b522357f49f9a5f48f82d8bb982954395836e09eb5f8cf1f345ce284674bc369d046d5c8a0231008a9feb64c410cf3ae6261ad35f7e3e8da13129daf94944f8e08e9649cd006622c3d5c91ec5b9798a1be3a31533a0a851",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044bc65262c22d322ea89146ccb5c60c4287b65a35228743a5b9dcd15493bd8642478987c421637dd0715079ec90fb8cd47a45557ef653d0773dbe2630f8e000629ed8293e1aa4a96f3b159a245aa35ad92a1019c7e09a9ab75ba43c0786928237",
+        "wx" : "4bc65262c22d322ea89146ccb5c60c4287b65a35228743a5b9dcd15493bd8642478987c421637dd0715079ec90fb8cd4",
+        "wy" : "7a45557ef653d0773dbe2630f8e000629ed8293e1aa4a96f3b159a245aa35ad92a1019c7e09a9ab75ba43c0786928237"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200044bc65262c22d322ea89146ccb5c60c4287b65a35228743a5b9dcd15493bd8642478987c421637dd0715079ec90fb8cd47a45557ef653d0773dbe2630f8e000629ed8293e1aa4a96f3b159a245aa35ad92a1019c7e09a9ab75ba43c0786928237",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABEvGUmLCLTIuqJFGzLXGDEKHtlo1\nIodDpbnc0VSTvYZCR4mHxCFjfdBxUHnskPuM1HpFVX72U9B3Pb4mMPjgAGKe2Ck+\nGqSpbzsVmiRao1rZKhAZx+CamrdbpDwHhpKCNw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 398,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "306502302ed569f12dbe30a2abf02190bb9e4de7e218e9fd705dc71cbe1480022781b2a2213c3ef2f91052e90840a18f74e375ae0231008872b566f387c2bcb639df9c2d866f7631df290c5f66c264d4949e256383b1b4b2098c120f13449d9d7bff6891919c88",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 399,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "306402304b7e5651b035959295092e2efe548da52206c8d0e48ba43e2b8ecd98ece25dc08955b6e7b05e38c4e22829d1658711b5023044a973b75528400cef3f63f55f2154d48bb0b826214200d3f33c7bc31155242d4e24f07ed19606fdb2c8ecaeb6981eb7",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 400,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "306402301ecadaceaa479fa4e9aabac4210b1ab77fc1d13a9c4cb022826bb1806575115834a6ecb9dec3e668b8c91d4aca283dc902302de8965a66d56545ad84fdaee16fffa0eb31022186a5b6be2a2475958b9ad72f483ebd4b255748a811806bcd428acfd7",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042ac393f20c110e3f97065304397eae0e23187b2b6163dc66083e82aff568426843056aff8dc23eebce297f747830e21734c935671391c6efa8b46c5c37b3f84a82e429a7580feb9a1383b55c83a9398e8ecc7b15d699e63962329102a1576f2b",
+        "wx" : "2ac393f20c110e3f97065304397eae0e23187b2b6163dc66083e82aff568426843056aff8dc23eebce297f747830e217",
+        "wy" : "34c935671391c6efa8b46c5c37b3f84a82e429a7580feb9a1383b55c83a9398e8ecc7b15d699e63962329102a1576f2b"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200042ac393f20c110e3f97065304397eae0e23187b2b6163dc66083e82aff568426843056aff8dc23eebce297f747830e21734c935671391c6efa8b46c5c37b3f84a82e429a7580feb9a1383b55c83a9398e8ecc7b15d699e63962329102a1576f2b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABCrDk/IMEQ4/lwZTBDl+rg4jGHsr\nYWPcZgg+gq/1aEJoQwVq/43CPuvOKX90eDDiFzTJNWcTkcbvqLRsXDez+EqC5Cmn\nWA/rmhODtVyDqTmOjsx7FdaZ5jliMpECoVdvKw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 401,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "3064023037e256872340da9dc884fd00daa14628372b4bedc0a8a09f9d7513521d3b803a78dc0edbab3c7dc2b2014baf7a9d210e02301ba4b4087973070cca9b957650177eeb41c557731596a966b0b7f68717d8e7b554afd07c2937c95403a90c3a05fa964b",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 402,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "3063022f128c199dc27677f23feae28a9b28813cbc3b02fca493005a67c3126a705c49b982cb5817ee2c81161e80b738bbb512023073cb6d4547771d254be74348955bee979071358aa3afd62a5838179a0965465aec79bd6cbd9b8b2aa2c79bb88ab21592",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 403,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "3065023100818b0fd6ca0978a59cad3fa15e84db2896f39b2aa462f0583834fa4444d153fe61e0c93071ba96c5ffa7193f77b806f302301d2d6144172385f857db4b7e7e863962eacacdec034b4b4a9dd1af272604403f39f45a21948b30976e738e9e98fd9cee",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdsa_brainpoolP512r1_sha512_test.json b/third_party/wycheproof/testvectors/ecdsa_brainpoolP512r1_sha512_test.json
new file mode 100644
index 0000000..53abdd0
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdsa_brainpoolP512r1_sha512_test.json
@@ -0,0 +1,5001 @@
+{
+  "algorithm" : "ECDSA",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "BER" : "This is a signature with correct values for (r, s) but using some alternative BER encoding instead of DER encoding. Implementations should not accept such signatures to limit signature malleability.",
+    "EdgeCase" : "Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA implementation does not check boundaries and computes s^(-1)==0.",
+    "GroupIsomorphism" : "Some EC groups have isomorphic groups that allow an efficient implementation. This is a test vector that contains values that are edge cases on such an isomorphic group.",
+    "MissingZero" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.",
+    "PointDuplication" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission."
+  },
+  "numberOfTests" : 445,
+  "header" : [],
+  "testGroups" : [
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0467cea1bedf84cbdcba69a05bb2ce3a2d1c9d911d236c480929a16ad697b45a6ca127079fe8d7868671e28ef33bdf9319e2e51c84b190ac5c91b51baf0a980ba500a7e79006194b5378f65cbe625ef2c47c64e56040d873b995b5b1ebaa4a6ce971da164391ff619af3bcfc71c5e1ad27ee0e859c2943e2de8ef7c43d3c976e9b",
+        "wx" : "67cea1bedf84cbdcba69a05bb2ce3a2d1c9d911d236c480929a16ad697b45a6ca127079fe8d7868671e28ef33bdf9319e2e51c84b190ac5c91b51baf0a980ba5",
+        "wy" : "0a7e79006194b5378f65cbe625ef2c47c64e56040d873b995b5b1ebaa4a6ce971da164391ff619af3bcfc71c5e1ad27ee0e859c2943e2de8ef7c43d3c976e9b"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000467cea1bedf84cbdcba69a05bb2ce3a2d1c9d911d236c480929a16ad697b45a6ca127079fe8d7868671e28ef33bdf9319e2e51c84b190ac5c91b51baf0a980ba500a7e79006194b5378f65cbe625ef2c47c64e56040d873b995b5b1ebaa4a6ce971da164391ff619af3bcfc71c5e1ad27ee0e859c2943e2de8ef7c43d3c976e9b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEZ86hvt+Ey9y6aaBbss46LRyd\nkR0jbEgJKaFq1pe0WmyhJwef6NeGhnHijvM735MZ4uUchLGQrFyRtRuvCpgLpQCn\n55AGGUtTePZcvmJe8sR8ZOVgQNhzuZW1seuqSmzpcdoWQ5H/YZrzvPxxxeGtJ+4O\nhZwpQ+LejvfEPTyXbps=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "signature malleability",
+          "msg" : "313233343030",
+          "sig" : "30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024044b42304e693796618d090dbcb2a2551c3cb78534611e61fd9d1a5c0938b5b8ec6ed53d2d28999eabbd8e7792d167fcf582492403a6a0f7cc94c73a28fb76b71",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "valid",
+          "msg" : "313233343030",
+          "sig" : "30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3082008402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 4,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "308186028200400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 5,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "30818602400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70282004066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 6,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "308502400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "308302400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "30818402410bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "308184023f0bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024166297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7023f66297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3085010000008402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "308189028501000000400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "30818902400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70285010000004066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "308901000000000000008402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "30818d02890100000000000000400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "30818d02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7028901000000000000004066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30847fffffff02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30818802847fffffff0bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30818802400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c702847fffffff66297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3084ffffffff02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3081880284ffffffff0bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "30818802400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70284ffffffff66297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3085ffffffffff02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3081890285ffffffffff0bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "30818902400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70285ffffffffff66297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3088ffffffffffffffff02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "30818c0288ffffffffffffffff0bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "30818c02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70288ffffffffffffffff66297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30ff02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30818402ff0bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c702ff66297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "308002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "30818402800bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7028066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "30818602400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "308186000002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "30818602400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30818a49817730818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "308189250030818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30818730818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "308189224549817702400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3081882244250002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30818c224202400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70004deadbeef024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30818902400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c72245498177024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30818802400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c722442500024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30818c02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c72242024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30818daa00bb00cd0030818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30818baa02aabb30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30818c2248aa00bb00cd0002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30818a2246aa02aabb02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30818c02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c72248aa00bb00cd00024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30818a02400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c72246aa02aabb024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "308030818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "308188228002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70000024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "30818802400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c72280024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "308031818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "308188228003400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70000024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "30818802400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c72280034066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2e818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2f818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "31818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "32818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "ff818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "308189300102308183400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "30818302400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "308183400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "308002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80000",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 75,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "308002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f800",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "308002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f805000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "308002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "308002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "308002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "308186300002400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "30818602400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f83000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "30818730818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "304202400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "3081c602400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "3081850281400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 86,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30818502400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c702814066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 87,
+          "comment" : "removing integer",
+          "msg" : "313233343030",
+          "sig" : "3042024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "304302024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "304302400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c702",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "30818602420bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70000024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "30818602400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024266297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "308186024200000bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 93,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "30818602400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70242000066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 94,
+          "comment" : "appending unused 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "30818602400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70000024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "30818602420bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70500024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "30818602400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024266297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f80500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "30440281024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "304402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70281",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "30440500024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "304402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "30818400400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "30818401400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "30818403400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "30818404400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "308184ff400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7004066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7014066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7034066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7044066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7ff4066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "30440200024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "304402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "308188224402010b023fd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "30818802400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c72244020166023f297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "308184024009d2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024064297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f947024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf19478",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "308183023f0bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "308183023fd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "30818302400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7023f66297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "30818302400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7023f297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "3081850241ff0bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "30818502400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70241ff66297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "3045090180024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "304502400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7090180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "3045020100024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "304502400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7020100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "308185024100b6aff6ed23b6308e0ace840e7557d0366549da44c23127fbe2d3f6771c987375223c7ac494ef54fd71ece3546ddbfdc3bdc4bd0a1659446423027f0e01affa30024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3081850241ff60f4bb7b6be2a7778b24b6b20dc3d826cee8bedd5a9d83de360cbce23c32629477bfc241fb9d08caeee021216e83dd3582611608059d8ea8b7f35208c85df95e024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3081840240f42da6cbb83393fd3506629fbe722bd165e6b36ef198aa12f38fa653539a94fb3301e17cb7b9d11bcf997dc511d012835fed1676f2049679928517749af90639024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3081850241009f0b4484941d588874db494df23c27d931174122a5627c21c9f3431dc3cd9d6b88403dbe0462f735111fdede917c22ca7d9ee9f7fa627157480cadf737a206a2024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3081850241ff49500912dc49cf71f5317bf18aa82fc99ab625bb3dced8041d2c0988e3678c8addc3853b6b10ab028e131cab9224023c423b42f5e9a6bb9bdcfd80f1fe5005d0024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3081850241010bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "308185024100f42da6cbb83393fd3506629fbe722bd165e6b36ef198aa12f38fa653539a94fb3301e17cb7b9d11bcf997dc511d012835fed1676f2049679928517749af90639024066297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30818502400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70241011107186cd1400fb066d93c809c69d2bdd295a3142181bdfdd2f593d44cdab551e38f64afc6c8b247c733dab9d241a0bee33f14c1d651a63ea1c2b962a99a9561",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70240bb4bdcfb196c8699e72f6f2434d5daae3c3487acb9ee19e0262e5a3f6c74a4713912ac2d2d76661544271886d2e98030a7db6dbfc595f08336b38c5d7048948f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30818402400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c7024099d6854c0aa9b4dad8fbaa2d97602949f89aea9f92481411036e08f62358531e71aef79185e073d17a52865fad6a6f883a72bebf320c349f13c4dd1ff30e6b08",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30818502400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c70241feeef8e7932ebff04f9926c37f63962d422d6a5cebde7e42022d0a6c2bb3254aae1c709b5039374db838cc25462dbe5f411cc0eb3e29ae59c15e3d469d56656a9f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30818502400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c702410166297ab3f5564b25270455d2689fd6b6076515606db7ebeefc91f709dca7ace18e51086e7a1f8c2e85ad79a052959077c58d4140cdf3cb60ec3b22e00cf194f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30818502400bd2593447cc6c02caf99d60418dd42e9a194c910e6755ed0c7059acac656b04ccfe1e8348462ee43066823aee2fed7ca012e9890dfb69866d7ae88b6506f9c702410099d6854c0aa9b4dad8fbaa2d97602949f89aea9f92481411036e08f62358531e71aef79185e073d17a52865fad6a6f883a72bebf320c349f13c4dd1ff30e6b08",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 144,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046020100024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046020100024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046020100024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046020100024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046020100024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046020101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046020101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046020101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046020101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046020101024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020101090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30460201ff024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30460201ff024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30460201ff024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30460201ff024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30460201ff024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30080201ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900690201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3048024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca900680201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3048024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3048024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f30201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3048024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f40201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90069",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90068",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006a",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f3",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3048024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f4090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Edge case for Shamir multiplication",
+          "msg" : "31313138",
+          "sig" : "30818402407da11e5b4bb7932135cd91accef8892c4286654a7be7c9d384b600d97900ee12a23ff1f9ae9a4fe74cca185d0dc9f59dc24be03d0223d8feb55b6dde1777475f02400686bc313aa5c1923ab0543331398190ca5f22a3a97e963a13cedf688da1dfe4a348945497b21c01c8a17c23252b3e8eac1f9a92d6320eaa324b44807c326175",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 215,
+          "comment" : "special case hash",
+          "msg" : "33393439313934313732",
+          "sig" : "30818402406d87be05958ca5c70c5d296291605021402deba1772f31bbba09dc65a837b09a78d332b6162a3201ca1a30d4162d8f186b2bffca5302333aca14894d5f093fe7024010b8b3c90b4609ccbddded275d4249857d882749e4b836d017dbaae05e3a19cf7810632329a02580dae44136cadcf06ca57dfe560e1c1122e2ec00ff04d7881e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 216,
+          "comment" : "special case hash",
+          "msg" : "35333637363431383737",
+          "sig" : "308185024023e9bac3f14d56679bda0bb2f4f19eecaf6dd503649c81149227880f14376d0224193d2b1bda4b08f87e46687dd9141278a399f0a3cd0d002f236d0e7d7382b70241009c24fb2128d62e5ddf59bb86b3a6b787b10cc75865e5aeab41a84f878ab3a947a2f6b4b0871af494c130f58bb3957ce03d61373f3fb5cbe97ebedc1b3aca174d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "special case hash",
+          "msg" : "35363731343831303935",
+          "sig" : "30818402402d07d8bb6277b78fa448d52e3e1d901ccbdd682930fca9d86959a63b5a792a8aa82ff9bd7da3e4057f402a76e82836aa3da34b6ff6bb8b2189ac242baea2b0ee024058ebef50ea30d15ac26fa03e2b065c7ba50f331a5cf240175ff3a6a1d8db400e1597ce675eb32f269b4367011acf3276580602eed7c2938439772e1be1b938be",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "special case hash",
+          "msg" : "3131323037313732393039",
+          "sig" : "30818402400d6743a7bc904a21d731205fcaa7fcd0018ead446ecc9bafc4532bd0ce6bfa6960159f59b5eb37c750d423c4fbcfb20a718e5655d517b74fff8986c9638f4f2902400399d7941fe5f3f308afb8a8a4ff8f2bec1bfe6b910c8399d831eb6221684875f67fe6a2576c86feadf3cd2af147297830113611fcfffacd8a8c8c52cf957ff8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "special case hash",
+          "msg" : "3131323938303334323336",
+          "sig" : "308186024100aabc4bdcc44ceacfe03a96a7939bf08c407d300de446514fc964de4dabf29ebda0608c1709c72244f8d888cb0e556d75828756d11c11be7787603bffc6718ac502410081eb84c8743ad6ab78a021a6f55b3ae0845f18307ea18e771e3c4e11b312eb8e530002c95cdb517855b17ea9726ec9602f347e789fab42055e688a558e3fc98f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "special case hash",
+          "msg" : "39383736303239363833",
+          "sig" : "30818402404e7f75681dd7cb2eea022e5b86329b25307c21b828c7416916cf1f5938071519cb7da668ec6bc219e72d358732f1c77abfcc61065aa3239419089fabefe396df02404f9ec196a71c5c8ed88d7fe1d0038f372ac60bfa180cee2498aa9c0248166f17382368fa2b3b8ce29d50d7a21e91a83ca88db5d4efd073f821a8c5aa4d26675b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "special case hash",
+          "msg" : "3230323034323936353139",
+          "sig" : "308186024100a0e1c2bb33200254beab5e735c1a2c590fc118540301add7e5491701d22c71293adfeddf4308940fd8a066222ccfb3802eafffe03b2156c8e79c3260d180b3b80241009d8482127f22eca10b2792747d6016ba719965603ee8e71f2a39500a2f211dcb2da582d5dbd0c6a407155e1b01085b759c80971cf185fd0a26e3889263a7f2c0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "special case hash",
+          "msg" : "31343531363639313830",
+          "sig" : "30818402402ee9ca54e2df79d6e06f130189faca801ccb081c43472d4f888aed892df878d12ca14c8e800fb7a75c2290a028fb7d12936499c3010bc5c7c07b2f738924766e0240558c02bcd13290ff34e039a199384385a44f97ef9a7dcdaa0faca66357ec7b9c1b40ea7a3529f4bb796fbddadfbe64d3e6abfc54c2946f5b1f548fa0877f3ae6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "special case hash",
+          "msg" : "31303933363835393531",
+          "sig" : "308184024054f45f0bc30a889a4fae7eaa047ea02ca0b9e387d6367801f8bccec2ec7c0ff89d6603d70f7c8e055e59fa69905b185faab437779d62c4d2eef4b12a90c20ab4024043c2ca3205a7f8b61f64661d0fe746bd23fd0f264999310a56b398048ad46fbab8a5e3b3e2e16c4b2f03f101573e2f6593b64accf319dc9e2e2e847b06fcdd31",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "special case hash",
+          "msg" : "36323139353630323031",
+          "sig" : "3081860241008a030fd4ba48d3f5998010c764e869211a4ce33122a7fdc7b8df26763be180f25e068db6c92820be641b8afd178a803360bd197a86cc8ef76ca008443ec4ad630241008037c3a2c1cac26e6ff89894a07b3e25f513680fc2e46ed693df96d0ee85b9400cd62d723fc98adca2a679fafec9db5fe078f25f9804e0d0ce16d1a432d194ff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "special case hash",
+          "msg" : "35363832343734333033",
+          "sig" : "30818402403bbd1997802b5fc5d4f2b87b6cddb97529cac1ba29dd29cfff7315b787116d9d3dabddd1b4414995c2269906a7bc1959a06de5bcd4d563042e1741af009cba9f024051b3d435efe79573aca8efd3cc1c8a227ecd94eb4079675459b6f4f168b6111c07c633e64e60d43a5f3b0d0b2f4371f68c7cdeb6bd8fbbf3bed2effa2542b0ae",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "special case hash",
+          "msg" : "33373336353331373836",
+          "sig" : "3081850241008293a545974430b3d7f7e314ab0ef48731715a5f79c2f34b94f120fc0170397130298803778b532ff10020db060d19d931d74856fbf330a75b28416d45af54b602402b8db48308c0b1f621e22c7dc1e762b08508be1a8eb4355f6f9ccb842085a1f664d7b68b1a24bd88f17b16d141b0c1c3a5d7f1a7ef4d533b900d1853bc5a6f6e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "special case hash",
+          "msg" : "34373935393033373932",
+          "sig" : "3081840240525940c217986b7ef0e18c81fe10063d65dbe1809d726c8a1aa0b617f334891e94c5df14f7b944a1639950a43e98eb6f1c349121d107f91ca7142b7ff62ec77602406b3567e4965f2d766fd07280f31f8c77921265f00e719c7c0055e51c85e1f3d46ac93967816130a6532c902543a530e27b4197cfd1478c90ce1fc74124636b73",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "special case hash",
+          "msg" : "39333939363131303037",
+          "sig" : "3081840240205caef78b7f0300266108ddf4e28b6ec1a2198b857f92b2df58a6d968d3db3ef6469f7afc20c632219ac43139ea08476e1658ad145ce8e3973c674ba8173efc02404a7a5320e5e249c3ff54cf903bace86f39b620acc19007413cd13a2df0a1f5984e7a4d18cd8d1297560295d4183af1857bd8e6e338aa3799ca1550635e4ae006",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "special case hash",
+          "msg" : "31303837343931313835",
+          "sig" : "30818502410089f6e2f342b4bc2f004fdc1d0e24a7d1d4cb6b0032b8fa2f50e3f90f3880918f31aafd5022ff74bbe1cc64febabb3bf33a8e714f597ddb0be8067d8a0964dfe102403ad67dd55364c29d4a5b446c646f30bc5e648a889ac7b1bee49b71918c32554d0d95d5a57ef5e7f4b267042fa3025f1323bd7dbd1d60c44e325d4f78c65a4adf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "special case hash",
+          "msg" : "33323336363738353030",
+          "sig" : "30818402402f3052550c595ed8920a7994b4adb78b8f7502fc066ac47ab4ffbe010d4a5e3e54545279a747d29c61c7d2856b8e47d0040e0713bde50e42e038dfd5af61e891024054f8c58893f19fbcf010d227017b88a49cb6fd1ee6ab883d21cb58fc0869c37ed73c7312c67f5ac19bf5bf0abe4bc836ee35b2a2c805c3953c48e79ab8665aa0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 231,
+          "comment" : "special case hash",
+          "msg" : "31343438393937373033",
+          "sig" : "3081850241008e366955ffb2a7fbc836441492f74cae4552fb0d2496cfe7d8c44b9420290947e29bf8a88265e2c6cfc37d29d2bbbd3d10513e0895e73551e2d7fa80d069710602406311528152bcf6121733867b61fc523e7f01bd15009984ea30b17ec15b8240c13f1ad137df37de4a32f6e3b93bc190959de17a1ba3fe71b03e97541c90a84939",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 232,
+          "comment" : "special case hash",
+          "msg" : "35373134363332383037",
+          "sig" : "308185024038a49f5f88f99e64074f0281ecfab9b8bf02092dbc11b87041bfb561b4b3cf29945ab5d9dc45f1edf41606ef6d2204badb67611584b892993de27e8f6402cd9a02410097e2da758a8e377a7d682f50b0e30f695a6f6c53e6714243aa9d533b4a9b9877d5d50af3e7a4f1fe6077c7ea704b918c599500afb84d0ba016828aa2e6fd132f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 233,
+          "comment" : "special case hash",
+          "msg" : "323236343837343932",
+          "sig" : "30818502406de29d0b50950a6409d29d2583e6c2d77389740ed0be4ebbd4571e82b5303ca27087ce1327832e9991cbf73308a1baedf97d1f3af9edf35e27c15a0cc003d6aa0241009a19f33ff3a88ed303fff90535aa1605bbdc006b803a804eb1df092b5aeb9db1be0cb9b676694503e36d2cd3868db0c34896c94cddabd54ec95ffeb6988a7fc3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 234,
+          "comment" : "special case hash",
+          "msg" : "35333533343439343739",
+          "sig" : "3081850240170f01e92b69cbf0d3d9e4a5740163d7ebafa7bb8d3835039f140d075e950dd57dfdf1b7b8d1678548446410468cf2898e130c745e07ddff921c5542191caefa024100a7b5d928be42799a55b05e15758a1aff02775af9edc214214ca89f73ad12017d672e59cd6aa54f18f270e01ab4dbbb2f748c87cbc2ac9081df2e76524da17711",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 235,
+          "comment" : "special case hash",
+          "msg" : "34373837333033383830",
+          "sig" : "3081850241008bc089bccdd8843c06d5a79e386c513af51931660db8b888bce5b5bddbbe4c73956a9acbc32e1ceaa5053fc39308dd6451e6e403ca574310667093c6d789b9800240417c966dc36dba5c13d96701946c86a0683805692f24c012b1a7d571405efd850a997065b19d35621bb4b39c764933849ff7d8b8f7df9fc5048b598ec1faeeb0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 236,
+          "comment" : "special case hash",
+          "msg" : "32323332313935383233",
+          "sig" : "3081860241008fabc939e7a6c13ac69cdd47f996248bfebe3f8e80deaf9c35e5a5cdca086f9f81661a1a41f69e3595b055a514d57efb2eaf5c1525dccf21736d2bbe89a5668c024100a8f9b171b3d33898cf7eace35dad6c3fdb998fc409fdb708338f20c9e4b8297b375485a5e87eae6fe68b1139b1fb4a3bfa250f47045f12a5fae945a2abe70c50",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 237,
+          "comment" : "special case hash",
+          "msg" : "3130373339333931393137",
+          "sig" : "308184024026f405c9cf5afb29e3f60de672e25016d39666f6b34af54b74562d4ca9e03dd87e2bf020189e5d2faea5bfbae21adece9f210bcb02a7558dad1b73d78b0532f802402b4b0c35057b9524e866625e7df820e15c86c2efdc1cd6c4c3cd4e6eff5d5758bd7f95b8f77e10163ff65b380eff970caaa7ed3bd0a121d3bbff3b6e7a261b75",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 238,
+          "comment" : "special case hash",
+          "msg" : "31383831303237333135",
+          "sig" : "308185024036c5c4720d10a455f4952a95872cc69e5c48e9689a6ea6e3e282c9cba58b01fa3cf64c9c99a6003d424895b996e26072ab6e76b29d1cf1dabc2b276802358ad602410081a9e6b79f8055e2bde4365eac153df4003d487b589ad3306d4a49387d244abcdaa09c1b63f0877b15468fe3e14dcf4cb63400a99fae7dce5fe946548e64abd0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 239,
+          "comment" : "special case hash",
+          "msg" : "36303631363933393037",
+          "sig" : "30818402406e684611327cfcd9d40e5252abd3d48fb735885970e9b3ba3f55a10b3878985c548f0c5244619676a0e5c44b4c9b1ccc1a20acce42e50d4d1aeecb4aa6d87ae502407749fd228293ae527e3d30de8f6fae99151e38329a1094c92b347209a4f7b69474ac90f21d56c625f1c76ab91b4c3d12a2bf4ba2826cf00adfba75368ef50c24",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 240,
+          "comment" : "special case hash",
+          "msg" : "38383935323237303934",
+          "sig" : "308186024100887fe53394545f107a27867df02fbc1f5986585a42b52195243a0fb7d1e700bcabed301caff3ad8c2af23497b2ac027fc186b8aaf4e6512bf5bea5a357ad83fa024100a923a3b4afe30eae49b018766da2913c6647d7384178f656d40d010fe1147d786ee50932286c813ea40e5c11555f6b8d8a6f8275145cb94cc041f1cdfcdfddc1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 241,
+          "comment" : "special case hash",
+          "msg" : "31353830323334303934",
+          "sig" : "308185024068d9fb181a8450ae377dc750f3bfbf82cbc39347cf5d2526bcb6c3f6343a7451065cb4a7b2c0ed3d68ce320d9a9c35c966c05bbf45b1acd2cfeab33b7bbf176d0241008538469e631960f5e13f6a3cdbd5cf6e893d0b154f43032b1bdcdbe2c5ff5338cff5223a1f0eae7ca3ed39232219c848fa75b0aa18e318c06abe474730e26edb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 242,
+          "comment" : "special case hash",
+          "msg" : "33393635393931353132",
+          "sig" : "30818502400d0d1eb2125eafaaa47d2e30e0650bc7e5c99f4fb5be1473708d19a991f4cfd1fe319ca73ed1a8b59d4c00b22ee0cda9bb2f00e78f13bcbf372efc0a003d2d1e024100878e71c2f5d53ac07b2ea1349110ffac6dfdfa2152d3b9fb662f6f9ef4e760dfabdf81ed690e85d80db3213481dabef6dae14b20c25f6f56a360ec9762114bda",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 243,
+          "comment" : "special case hash",
+          "msg" : "32323838373332313938",
+          "sig" : "30818402401c75cfcca11661bc91289b25990a2c836869a2fb5bb61a5530cf248918db45883273d8d9d24a492dccc429480eb9d843544dfb8bf96ea75f06e4caee91fc3c5e0240457a98f6870b4d131f9f769229cbe93e9761432cf4e22ae0f4b35c55123770336784060b747c34bcd3bad3f8970718fa88777b2b565da3f32498286ad00153df",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 244,
+          "comment" : "special case hash",
+          "msg" : "32323330383837333139",
+          "sig" : "30818602410096bc9787cc6d512a2fda9b3498b04b53f9c03f4060ab0382be7cb7077855196e60e0d150eaaae6099acb9341a15d06c9478afc445021a5ef298f1498bffebd9c0241008db26e51fbf0d7a5eabc67a7f7dd698d16a97643784d49c7f292481114a01c581fdfc6f779b1cbccf5e8ea595c98b760c3c5a10ffe1e6e2cb101e1a5c8a14a44",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 245,
+          "comment" : "special case hash",
+          "msg" : "313239303536393337",
+          "sig" : "308184024006e20f468d6fce4b5571d6e188f10cea05541d82c9f81791d7e7b2716d92dc57494053712b0b01b346e5797243326db92028e80f1d8e0382b1e63c4d96daa9d902402155eb2364926fc34797923125503cdada9983e6251273e5fe1e0298e61e26857dc412190c7e677760569500f85ab2665b6e88901be861cfce3fa4e2bda55429",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 246,
+          "comment" : "special case hash",
+          "msg" : "32373438363536343338",
+          "sig" : "30818402401e2480c56be72a52fe00945fd7c2feefdd03bd713bc3e3d6e6d434d5a2a7a2c8e1b47cb1428b96f4d8589d6ee5fb32dd7d0a767790f8209b5fd3412c0d56257902403c0500f7531dc5f0040f0bb0f533bc5bf344fd1f325a80c420435f93d3ca7eeeb15b1a4f4391408f166971c9ddb79bfb68f23c6997c2ae40d66cd0f4fa711217",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 247,
+          "comment" : "special case hash",
+          "msg" : "37353833353032363034",
+          "sig" : "3081840240774d852a1df9f3b530db4d0345c3f7c413c8dc4df1c18f4289cbdf39de2d9eb8bd90ca7803c2b3fe8a8eb9d804dfcf0d0bc79211ac199da1c09abd80b0f220f4024070fd03a6fb63582bc64128758cc8bffcf5ba0bf154ed421b37e95987d4647ed7a3ede5159ac175f7370a2e23fff645105c4e0d99ddd1486ad6ac5a832903d55e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 248,
+          "comment" : "special case hash",
+          "msg" : "32333237373534323739",
+          "sig" : "30818402402e7f63da657a65105287c644cba07b0f986b4b2f3a18c0809dcf8d8ac2169450b2067cc5e0ac3d65e1eac67f3cea3a62c723eee062d30757dcaa9e926ebfbd00024061b262a4aa850ba12e31761dcbde8cc7c9abd48852a734b38b26cbb153a80289c4788389b16baf101f6c5da8eec6d584d0ba883e53b6d7d2afe36db83ea951a5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 249,
+          "comment" : "special case hash",
+          "msg" : "373735353038353834",
+          "sig" : "3081860241009b0be1eff11d16b6c480a0e17c5f3471eae4fcaeff92487209f0f23c57a7dfabede9756698efc625c77935667a519e42062e9d087842c83e08b976d3b96ea6dc0241009c9ef5e7760a036bc40ec710ba88e9ad6f8e06948dfa77a26cb8fd6c3b87112dc0d0f6ccafe08fa5b636f429a097af39d569433c933f902516e85871bec30107",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 250,
+          "comment" : "special case hash",
+          "msg" : "3137393832363438333832",
+          "sig" : "30818402407396b49696311d10da5c85a3324bc07b855aded9f556fcef6b3a157ccdeecedfafebfec27e9b764acc84f0ab137ee3016dba85f4564eb9b220641e73671f8509024034d85eae9bfd43890fcd2b0511aeaa7534a470d4a610fd592acd0e01784dc6be4ab0fae5ea6faeb6c17a5c2a84dc75b91a05173594f6212f2aa2160f229bd096",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 251,
+          "comment" : "special case hash",
+          "msg" : "32333936373737333635",
+          "sig" : "308184024024dc7d0aa89ca22dcec20248f6706b6209583236dba3bc326f29321c5bef77ddf4968e27ab2dbf1882de2985e4901c03dce539d0df1716097ea207fae6b6114002406168c1277b7c881766b767083de4f4df82af8ac407122295ece58fa49cc051308848dc380675800a4a4dfd6b813207d8d0e422c232f30bdff7df7d89f427c194",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 252,
+          "comment" : "special case hash",
+          "msg" : "35393938313035383031",
+          "sig" : "30818402402d47ca2c03adbff284031e2c6315836397ba34b7605057526b159e6975ee660ec809ea15f552087b2ab5bd3f718f8f82f9e9ee47f10c7e96cb06a5a7b4b0247a02403cb1f5681e4ba1b05b5c9a2c03f0d6bd839ad5bccf4be2ea085b6db5516037cc5d36faa83c67a17cf73f8f75e50ca33fb7591cf24f9508a7eed61314a47d9e54",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 253,
+          "comment" : "special case hash",
+          "msg" : "3136363737383237303537",
+          "sig" : "30818402400af3273b4119624979eab305a0f83e5136ef6a56597c5353d8d76723529403995c45f3a24bb13ae85d3872dc811e008eaa2c5842f49a7c2ec68dc7cb4f33ccc3024061f5b236334964eb3ee2c6c6bceb9f2f8ecf0644ce9ca723d598e39472e3d39a993481d27c8df5df2b781d6a022ac489a9199475620d4bab390a3fcb6bf44941",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 254,
+          "comment" : "special case hash",
+          "msg" : "323036323134333632",
+          "sig" : "3081860241009d54ccdcdde1b7b11fa6a70fd75da9a2387aeef94882506eb898d7256da4d0ae2ea0cf54f966ed350ce474c74f00aeff42cc16064b069b8a68820ba557b534d00241009912c602994781606f987213b4e1e056f3ae17935da059341bba17484ac62e32f2d04b3973275e738876ebb16fa1465f8e6bd26019d96aaa28ccfe94ab7ea94f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 255,
+          "comment" : "special case hash",
+          "msg" : "36383432343936303435",
+          "sig" : "30818402407f7b14c2502a2bbf3f7d1829012637a1e46311efb1b87db41304318250d0d1b2552d2425378dad4bfda6ef1197d7b9846384acfdbfae036a5f732e9497c8584a024050693eee71ae5d706105d819089ac948b3d7b4151b0af55436899854d9cc8b7526aed896ae1f3dddfe301962043f4f3ba140864ef8d1bb6d45d5add1325d848a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 256,
+          "comment" : "special case hash",
+          "msg" : "33323639383937333231",
+          "sig" : "3081850241008c33b1623e10e2f51edc0b96862cd2eaf5faee8ea6ccc985ccdb94bfb141d63db251faf1e7d69ed390a2beb71185db4029f07f03af4ac4aaeaf48af01e6f2420024055b0365b12f7d640f758e5af6e2d6a41fc5c56c80598f7bba0990b0d899f22cb634c22f64d7a1e970856b3b31bb013d39f761d588ba14a9583f8387d91d058b5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 257,
+          "comment" : "special case hash",
+          "msg" : "31333837333234363932",
+          "sig" : "308185024100a34ac9c077538c21f92ab4bf0dd40d9fabee1f409e81cce71bed23d06ba72eb15b7b7a96fbe256bd0c41a0d5e3f0748996c16d742705d9a06c544a4e573c359702404500ed995c2608dc62ecc920ee560590648100e5b89e7f109a2c15a851708953e699499c987c1e9523f9d8985e6061cb9a84e58e2c26579bbb084b9d5d71f3aa",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 258,
+          "comment" : "special case hash",
+          "msg" : "34313138383837353336",
+          "sig" : "3081840240639a6cc0c3e50f2457f843c40f1714096e61637c78ba9d847adf0f6b2ece78adea98dd156a91638eeac743971f5d469506fd19e11555fc55fee3f82ae7b05b8f02402427b3fa238430e0cd794f28b4e0f2c1d3c83ab6fd00d47a4c630f5f072f961523cd5316b0f8e7a1387727e330fef692890a472495c69cf216727fba3771ad8e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 259,
+          "comment" : "special case hash",
+          "msg" : "393838363036353435",
+          "sig" : "308185024061949220d668cd59009b0069607afac3a3be3866f50b0c3bdbd98e9eb306082b23136fbe6173dcb6b8d34e81a9e038e8a78071635b7bc4c787efb7bf8a8ba12a0241008426f68e8c7fc3e8bea84d7b56aa2e6bbb2b063e320ecd520d365a066d9240f5daa533daea28d99ca1ffae9c3b9b0e7cd28d7421ba35c305c891034867768b1f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 260,
+          "comment" : "special case hash",
+          "msg" : "32343739313135383435",
+          "sig" : "308184024047ffc9cdf40e5580a4a938c3727acf8c37ad638b11c235d05e44bfb0a680a3c6eff57901541be0c60246749f1f0071a8594ed6eba43ea1f92668d54d938c98d302401521ecb3eb408c9860b83bb748afe306c35b93ee6b9e1e584c98d788d04d013de691cafcd0f5d71fe3dc6c8c77ed03488d8b92ab2c2e007ee35ad02c4ddd0563",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 261,
+          "comment" : "special case hash",
+          "msg" : "35303736383837333637",
+          "sig" : "308185024064638c51af9269fb24d8e0974102be6e94bceadfe9cea1a9c89fd778010891845d26e5dc7a0fe7f0a6ea9ea0c1dd7c905e8ce43be648609eaf8494f06050b5500241009ff2abd8319159bf51c6f3307198d3c0500ad8674f42a91678317342e82ec0781d4310d618694bd8d074650ae64910a24a03598f00168120e530aa60317ad470",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 262,
+          "comment" : "special case hash",
+          "msg" : "393838353036393637",
+          "sig" : "3081840240253d7aff8171372196dd152ce3536e65ff00ac3feefc32d790b6ddc85b0cef074a1736bb473331b3814b2f69d20e90050ed2d3ca125735336d15f9c012e289cb02403850573a859b7f9b153fe0d95f48ed30877eeb34ffd30e9980f4c42c26e9538f7edfe50d52f8e453af03d4554bca7ab2b3b98d794a317dda123fd31e4ea706da",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 263,
+          "comment" : "special case hash",
+          "msg" : "32373231333036313331",
+          "sig" : "30818402407482b5e6bc84f289be96ff9c01ea2df632cc1d23b988f953264100e8a212e77c836fc3f66071d9ec6254341cecfcd8aaa940cc0cc1e26077f3c0a1a855e30c510240328e8a1fc140c8791b9d17e1e2dfdceb969a21d2b0245b1cc20766b6b41a2d6cdf9609dda1b1d2c2c6c385986e6c6facbfd68a674860f48fb8d113f577ef231d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 264,
+          "comment" : "special case hash",
+          "msg" : "33323034313031363535",
+          "sig" : "30818402406599441c0ed9e2a82f5f09cfa9627b25d50195750723ac18907edea3b588b736deedcdcd0aee44df73f5f364e484b9949b7d7b698fde043e6102cfeed69db469024040049f8dd6ee0bbb4b9a29f2eded3c8bf0b10c8bd3be6bf5e4f97f074d716865fa824f51fa79ccfe791d5df6ad7fee6bad96ac5bff21a502f90ab80e211253db",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 265,
+          "comment" : "special case hash",
+          "msg" : "33313530363830393530",
+          "sig" : "308184024074e11c74d4139eb9e532e583cf3edd0b9e0e7b6e82a3b79d8200e8e581deb71b153b961646a76320339f4c1a5f75a638ba2b0c3f065ed856ad0a158e3235c70e02406ff940339c0449d6e2403730b58d0dfc8de79bca0df06c5a6d437cc2c1266a468a8aca2a2903c29979d7f4d4f7871a106b31ec485c28cab62eb2100198871b83",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 266,
+          "comment" : "special case hash",
+          "msg" : "31373237343630313033",
+          "sig" : "30818402405548020c2a0764524ca543d08e1526ce1476ba976af8d6150d8d2ae47495e5fe68cce98493b50304131df71c1a3d4776a77d5ceb74e47b2a8e650108ebab14280240620e2dbf67215f95fbbc92a992f20a4e7f301a2c3c3880b7e891ad484647a97aa00aecdefd03155207a9e459ef745a9d29a54b08f47b81cadbe4bea457eac6d4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 267,
+          "comment" : "special case hash",
+          "msg" : "3134353731343631323235",
+          "sig" : "30818502410083de9122ab462722939d851d456b9b022937be85b15eb65d2ec1a48410a2f234e98140f208ed595de2fb5073b2ea494acade8dc5a44ed7162cfe7a70182479dd02402e0c938f56533857956e56d79c78fd101ddecb1a9695a56f18f6a89b94c0d3db47429afdde6b682832bf4c0fb849ec7faf729cb59d8e219dad70b7c8e257ff14",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 268,
+          "comment" : "special case hash",
+          "msg" : "34313739353136303930",
+          "sig" : "3081860241008d42b3bed0202593ad44a93b43ebac7ee0d9ec1dbc5c546619d5a9bfb5c9cee744a445873f10539b51545ea787648dbc44ba2d27f91eeec59de92f2d71601553024100985ac4972c7b1223656dfec796cd3352d91d6c83ce330e1dcb1ec9817399340d7ca97457af51c19c6fd0787e6965d4f85ede5c7f507598b8bdd5c808db459e73",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 269,
+          "comment" : "special case hash",
+          "msg" : "35383932373133303534",
+          "sig" : "30818402405b826d16040e448dfb70195de16e97454b133aeb1051373d5111f10814b7f4ad1714b25c0c5661efee43fa9329a4af09607eb66c72b2be2e21bb4d0229e3a1af024007f00f3935566f4ca16e346ef5ac47b2953fc8b5cc8870ae638c55fade1b586b37a119015fd7be3a33fd39165564f6117435bc1a20bfd57406608b3b27a91be3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 270,
+          "comment" : "special case hash",
+          "msg" : "33383936313832323937",
+          "sig" : "3081850241008f89db5a6d6dc6fe96ec5f95960c2f03a6a072e644d158247d5b8b66e2346834ee11e5ede6bf9e8e0234a7f75ce8644914c585e0953d371c363e2f21feaa276302406601d228f4b53dab1546ebf7673360dba5dc3d59c953bf867c754325c0cfde85b64505fc995941929b53c5566b42f034ba1a09ed96e113961a1a7357a22793a8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 271,
+          "comment" : "special case hash",
+          "msg" : "38323833333436373332",
+          "sig" : "30818402407e6107bc6e5f0d0958789e4b91201ca19d93c12bc4194c8316c2224451f5748bb6fb46497106c613b07efaac954e2ccb21062005b9ef4ea72ce4471daa5a3ea302407f1837827727685de8c8868d9425db06e33f6778b3b4d1e08e5f73e26804a142723a3d68a7d75fdf826e79f791f7a6b0f89a36e579cda9196fdd9f6419f71ccb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 272,
+          "comment" : "special case hash",
+          "msg" : "33333636393734383931",
+          "sig" : "30818402403539944e52d0db1fe5e9ca3d4c8d93139a2d5c85e51960ed68e8fb5f29cb108fa184fd66864fed2bd90e0017925c5d543d618e287de43d22f7a94f17514f85aa0240060a37da2753925c18ba4b97c95d16ce574ce9542e918b4ea2e7f3890e723a375b0c7ccd497cda6c24111503ff948ee1b0975b90b21c0747f0b4bfd354e2ea36",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 273,
+          "comment" : "special case hash",
+          "msg" : "32313939313533323239",
+          "sig" : "30818502401339cc85b910c82c7d5a0604427150e325c458cb2de1cf27194546db13cab056c021f6a78f5505e8bf6865f29b36bf67a3c23000617e35f92c8736854c5d72a10241008018936e27847ee6819b10458522d78991cde9d08b5e85f2e339bac6ba9afdba19a5c99e2117752345bdaa7a71be57f00e4a2d8db088f350721853f6ea1440a0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 274,
+          "comment" : "special case hash",
+          "msg" : "35363030333136383232",
+          "sig" : "30818402400b62b76886412a3e92180ada31e86c28e288659ee71251b5fcab69fbe3a3ea7a9ecbe513ef2f7e0900738250d2818d255b838dc092f045fe5f90e99a6fc48c20024075255debf55318a265511e3f7bdf647c88dbce185ae139050c437154fc4dee2786c440b4f67528a1a343c8f42057e9bd223df64ce757081dff7f16a784ef5868",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 275,
+          "comment" : "special case hash",
+          "msg" : "383639363531363935",
+          "sig" : "308184024002517cfdd22c2be4c62ff72f0242f844cf137f230b41bd1b968426d75fd01f2b467a3d3dbae156d19ee33498070a672794129965064514337596d1bc66481a1a02401e40509a671fbf9638d1d2b242f3041096d6b59d1eb71072068620fdf31953b20a4bdebfb08d248f0d7e34f053e634f43aa42a3863d753147de7368b28a74d84",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 276,
+          "comment" : "special case hash",
+          "msg" : "36353833393236333732",
+          "sig" : "3081850241008fef6b52c4d643fd9d5f28fd5204fc5b5b6a3e57e6db9c8eef7514068933377a7f16a069a95bb6f649dd3310922a982211f242093a23ab44df810eb4d744b05402405e3862a42fe8a560432d5de042f980613e68f6b3444d7d53526600a505992371f6f72dd1aa775e58e24212a0c26439d2eb717340fd536d38f9148d2136850a7e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 277,
+          "comment" : "special case hash",
+          "msg" : "3133323035303135373235",
+          "sig" : "308184024014be636d9aa0aacb84f1d7d0b88372c0322687767d45239d7b8837d747d60fc6cb0fa7e897bbdb19194c82debddb46ddd094cb001ddb7e025923835d7e0eeda40240090d62997fb4ff82896d2e8a0ae22cef6dacf1889bef71805dba0f701d41ac219820e15e915e10513d491b6aa308b35906dc5d45191928f5025683be8a3a9f1b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 278,
+          "comment" : "special case hash",
+          "msg" : "35303835333330373931",
+          "sig" : "3081860241009af98bee9911640fb5d58fa0803e5393b772fb0c862ee9f8545d9dadbafb1a6c73c85b79f39d1185f4b2c4bb54e51317e2633d50fc8f75888504268b84f40e2402410087fb7c8a2d81f7226debff31b4f0a29a08f1f9a4c50e5615b570555ef2cca1df2b704e92e9b8adb44189e69553ed79effe315bd401d0b2328cb065cf10e130cb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 279,
+          "comment" : "special case hash",
+          "msg" : "37383636383133313139",
+          "sig" : "308185024100a64a9dadf5b6a57028044e08d788784e07ac98dfa1ed238348e45e95d44f631d9f14abb94643f87d1cf3f9fec5dc2720e429646c0ec7151fb89924cd431c30730240115f653a3d327d93118cdd24ffff039da516afa27f37c78735c985973cfe55275b610d7be24969eb531721a0a486194b6b8823d0d70b0dc1fd4c7611c32861e0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 280,
+          "comment" : "special case hash",
+          "msg" : "32303832353339343239",
+          "sig" : "30818602410095d081c0728fee3f5b11a593395869aa342c260dfa05e5575317150236482d00ee80a6f0a3a25c0c8e3a6790014c6747d8b5ddb081328bd53e4c6422c623d79502410098334ddc2a1ed887b26fa23599012b31fbd5fa384db5c0902233c1efe61f85fcce09a9e7fc13fb0253c8cfceb8762360ee5d20e17debbe84a1c8eb68db7ffd4c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 281,
+          "comment" : "special case hash",
+          "msg" : "3130303635393536363937",
+          "sig" : "3081850241009ddd4ac392e9b8391d766b6f5d26f164ef6f4552d73f1ee9d096b77e3dcc3a42023573156c5954187ebecb2f60ed7a01439809dd8eba286e5340eeb7e184593d0240166a4a2b9e0ceeab82783c1a7d622dcf7bffc69b85ae41e5ad9b552bf3b687a228cff644d5497ba0a1644c039162ecdfb095d23dda25efe14f48032c6d09caa4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 282,
+          "comment" : "special case hash",
+          "msg" : "33303234313831363034",
+          "sig" : "30818402407db0fbddcf437e25804bfa6d476007bb2e49138527ff27d759d05c0b1a3dada2327c49813200cc24fd81f0deefb6061314d06829024f4464591f520d5cbd9dae02401753cbe7f6d18e8fc226a950385a43858ddddfba4b57c5c07d581f51cbf5c8f93781b48ccc887c039fcdecd6e65e3e594894c67875ed89e86c44e52d656c346a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 283,
+          "comment" : "special case hash",
+          "msg" : "37373637383532383734",
+          "sig" : "3081860241008986b0ea9c57e037960e76d8b539afc714cc3adc90394b96bcfa3f7fbead4fc585133e4f61b7ce3edff093b98c257dbbb497f86dbf467f1aed8d7a7dbfb446320241009e7d1fa09ccb4b4d49a2463f12a9f760d3cc0be38e409a3521723e6f48398001901153e141c121500c8ba689896e2c3c883767378920375cb52f0cbe5ae98161",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 284,
+          "comment" : "special case hash",
+          "msg" : "353434313939393734",
+          "sig" : "308184024075dff0fc67964d57ff013e4eb8a7d356b9f408be6f5aed818546b064102270a8147f3ab78b94327b60232fe086222f7ee7c027c6a2f856467922156cd00c524602405972544117567221cd67575428c5c61edfb228b131464927657e45ae8e55625c874c46978c7dd481d2db8ee9cabd1a61bc2447ced2ff9a72ede122dabc6d9c31",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 285,
+          "comment" : "special case hash",
+          "msg" : "35383433343830333931",
+          "sig" : "308185024100a2ce4a9661c71f7ede80c167c675860cf68d7ef5400312f2ae050c412ddddd8869ce093b2e11e38495245d04252e44129e994536435210e3b7d1ebb0c015bac502406932855efecc41215d2caf8bbed6f0a2d806d2be3485760dfa8c8817958147e26f6f6bfd91f0874e1449c9745653488c068ab80fd99227b5a79c17fd266b7bfb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 286,
+          "comment" : "special case hash",
+          "msg" : "373138383932363239",
+          "sig" : "30818402401b60263f05e2e818f67941b1b5f5e8668dbba51aafc4dfdf9b49979a80ae0c51f2b1b28824fd9d4b0a2d32b7e6f6e3eac580590752e171bf1ded04da5417ae2902407aaff63685f50e01fbb2d727aca66355c7f524b3b0b7c52301cb9b5aeaa2b62385427cc6aac126e1652fe0e62ccb1479b1a48ac7dd8173d754d06f505dd443c1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 287,
+          "comment" : "special case hash",
+          "msg" : "31373433323233343433",
+          "sig" : "30818502410086039c7f139431e6648bebeb5eaca3dac07ce807b51c68e7590120faaee7fae4280b33b1a4dc979201823b31f150ef2d0285a4588662b7c87e50155d406274a702405ed7cbcb6ba08d0a20514f801503ca84b4a409ce8f55651643013999f8d3ff65a9b0bf2a7c52f84dd2945d22677fa46227a64c7359180fbb4b15033ee8a8abe5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 288,
+          "comment" : "special case hash",
+          "msg" : "32343036303035393336",
+          "sig" : "30818402407016468a36f855abbbb4d4d859937f5fae56a4da2c4d2719fa77e111a56cd3a21e9267120127db5a67afe2b32c7b4c3bfe15d0ad44c60c4089a4fe4fa53cdca902407fcb61da561cb7cb8aba8c07e7417423bed2e99784b5f646990014e6872552a07e1034d80e69b319b7cd2c7b157546323df4a2ab8433c623eb0c77d4159f014e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 289,
+          "comment" : "special case hash",
+          "msg" : "31363134303336393838",
+          "sig" : "308185024043acf84a076d740e997bcaa35dec9e75df3c0c4f25b2075daf077de60b5b9fb7f784a6027699a216a047a2135a3b530fd8fa0077338d4dc85fbbaaceb6641022024100807a3cdfc0f33bbe7a5a52f7e4787c67340d958baf0d957d015c73c9c8d0b60f87a426bfd2c9209fa7f5fab1b05a8860857171400714081b6f6e733f380c3963",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 290,
+          "comment" : "special case hash",
+          "msg" : "32303935343235363835",
+          "sig" : "308185024100851fa88595498dd5a5fb5a0710e02fee1a023e4b4aacfeba03f7c4c14a8fb433934ea233e5d27de155daca4d4e3843f0f2cd586170728a2d4ce65223580cec6602401731b6c00200f4474d4ea2046775d9350e45f2abd45bbcc1163c77deaeafc94210985b7466cf61bc78d59bdd2439aa1c7ddac71e0072d73d876a14f3261af77b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 291,
+          "comment" : "special case hash",
+          "msg" : "31303038303938393833",
+          "sig" : "308184024078456d3583b93fba209d6faf7363f8e87866cce8f1a8f756520d5fc7d22d369408753373a999c8e5ba5817c61ff9a3a0a9804121a00104c7c15dda9b60bd744d024067e149ae6a206d3deeeeaf78f90fc5fc69c0c101273512ad42d5fd3993babc671de9c4aac015310be8eb6d83121b9709b93cd43763bfba9dd83976a91a75f567",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 292,
+          "comment" : "special case hash",
+          "msg" : "31353734313437393237",
+          "sig" : "30818402405ffc31a2e8168748c629e0690161cc6249680c03de5cbad44b121aa856f557cf9a84983e493f40e2c0f598738b0f6ec8575b66e4c4e59b6b63996058e4aca2aa024041e0857e6e959c55bd807629361ac41dde640feacdc212d7cd2e1dcb9a3a9a4e933cf8e91fc7b1257b7a4f9696283e06e32f976987df86da2c87978b34cc5eb4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 293,
+          "comment" : "special case hash",
+          "msg" : "32383636373731353232",
+          "sig" : "308184024031492b0888f6fff52d247bee1734c8425c35606c9d8cc63df382dce5224c8d55ff2ba6cfa29d09500124e8576abbd0d710baeb099efef02fe810d4a19dc2ca44024024d3b320def3943ac856680e00891c28da011840af29f4f2c8884a022463a1da9dbccb11bd4b720e72b9afa8b6b871a86f12f875cc1c09077fcc15a90f402acf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 294,
+          "comment" : "special case hash",
+          "msg" : "31363934323830373837",
+          "sig" : "3081850241008ee3ad5b61de2a1e3a10aaa2b5b7c1f9f790ebcd110afdcc08ac9b70fe7530fda9ce94e44058740e17b7308331ddb0ceb0bc69b949442122713582e4941aecd30240325dfefb8f462d5e7dc4124ef0719fef7649d470f3f1555172484b0304e75ba122802d1a8597b462b345f34e17df4a3c25eaea269ea11ef5b042440b5cabb714",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 295,
+          "comment" : "special case hash",
+          "msg" : "39393231363932353638",
+          "sig" : "3081840240556b513902291450e9a2b126b858e1e2bb0a23e2ee904677d9e5eac88a25f01408b8f512d91352c43c519d9d74570b3d78366df437a4298b311a39a63c442abd02407b8426258789971c56c53d997dcfa1270543bc9f7c42ca2ea2fac08852c472bb2b284aab59a4baaf0f2c986a2c68fd3e6fc91f1d28be9b7577f7784c587f3714",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 296,
+          "comment" : "special case hash",
+          "msg" : "3131363039343339373938",
+          "sig" : "308184024060557b793efc6fd8e22f6fb880b9b24f4ce95b090f694fab2866bc18dd85ed5f479fa896d84092dadcb4b9686ad8074d69be8429eaad63d03c63c6217fd7cc7102407819879f5105f30ce8efd87c044279ae9eac3255327d9a8b083e9dcdbbda1e01ecbc9ea690bfab771b63318a964942f4577847f571b679363311ce1bd20a2ae0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 297,
+          "comment" : "special case hash",
+          "msg" : "37313836313632313030",
+          "sig" : "30818502410096a8b736b4d1c2e40132b0c1dc351c700b62db81e8bb39aa717a1ec0258eb92da819df0117a7047e6c33549d3848d6eea3f725aa39b03222463ff246e896642102406bb7c1e5fde98b5eab976193682cea8648df80a649c2ad68e0b2eda5e2bee9aa9b773f4d62486edbb09ecf434c1ae0dba273f68bfa0f985ced5d7b0120ed88e7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 298,
+          "comment" : "special case hash",
+          "msg" : "33323934333437313737",
+          "sig" : "30818402404d9d07d3a45f1c913634713d7ba74ffbd3cd114ae75f178fe7ac7defce7314818b6167760cb6e7d0a24f427d8eee6012b52c683883bd97e351405c937e4f6eda024027bcb629e31066dd6a4c65432d39c25add00bfa369d48b0e4820a19f081e9eda977875636a8cf9840122d5e1bb3cea5fefe0203f601616d6aec820a1580590fa",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 299,
+          "comment" : "special case hash",
+          "msg" : "3138353134343535313230",
+          "sig" : "3081860241009151eb1014557b00c8f28892a2911f5d67d59396a93da4327d0059fba767b97dedd52e0cc85e0bf8988c7eec231008a0f972d51139a2fe12b75591c071fce9ec024100aa89b592fd309327e6c911e2df0d95fe99bf01de326a9ff06648a321a363a79e7bd5b051e0160fef18ab814031a07601a6783cc4efc68c681d2df648fbc5477e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 300,
+          "comment" : "special case hash",
+          "msg" : "343736303433393330",
+          "sig" : "3081840240374e3d3bff57b2a0f924aa19ed2c8d44429f8f8a62934ada5c0bd83c2ca9ef2538f186f2863680183c51324ef4cac5a945dcb908ac40f4dbcb1d2045cac6585402402ba1c3960386177723809dddab3f806a10da5e74c67c9c460b6c4163f37230c355cd4b098aad23da524e1e7040363f4d728fafe4d952ad5ff1370c1010efbf09",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 301,
+          "comment" : "special case hash",
+          "msg" : "32353637333738373431",
+          "sig" : "308184024060f1a5bc4a35f001114e5d7105c21d6e5161adeb5d1d88251791fd08e0192a6fc94ede2109288389b3ea9d00575b66ec0cee5f1e531c05c0885427a3bd65d64702405f62c35cfbaa2aefdec113335fc5f5646ed858da0be4852177135d7ee62c1220ce447cb6ab26cbf543215b2c15af42d95a515b7250fb5ed79204a57cb04f6567",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 302,
+          "comment" : "special case hash",
+          "msg" : "35373339393334393935",
+          "sig" : "30818502404becd657fd4c9866fbdda4cc07c4cd528964b120b4137afe1c142758d0480398a1fe6e203b564657c99ef03a044f89c4a5bcfb3cfa6659671fcfa1d8384b82d9024100a1649256d0c43f7f6c19267741738903d82976cc3a678b480c50b52aea3d493a80c20ffde7b57f9291b22be5b4130dcefc82fee70bc3f1f308ab0a8403828ede",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 303,
+          "comment" : "special case hash",
+          "msg" : "33343738333636313339",
+          "sig" : "30818402406b3f1533f53fda7448a710a4d0e3d8278c96d656635a8ec9c86085ed2337b73368f5c5934a46d59dc79ee6c3349fc78874c05f5e5ef859eab03dd858d2c28e85024025cf5a2f2638ebf2e76238bb54dab1e96e9de0d67d5579151e2256c9527ebd4d3857731fae84ab3b56b74bc89c4a99639b0c687b2a133bf77029d5abe4a5fdf9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 304,
+          "comment" : "special case hash",
+          "msg" : "363439303532363032",
+          "sig" : "30818402406ff4be5df3f12cf2cb7816985e9ba0099cf589a2a22367abe019328789ad5092107d12dfed8352a1dd4ad975e861ab9f9c64cb6b5bc98c5786247bdb4ea4829d02405eff29e6e20e9ebf1ac602589c5ba64b2020d1f2fee83e6d0c9cdda1af8d7c0ab8e5ff059ea457b903d2fdd48ff84a32e338f0270515fb0ba44c009524ab7880",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 305,
+          "comment" : "special case hash",
+          "msg" : "34373633383837343936",
+          "sig" : "308184024056b91ce37f560c1c6557f7fe0029754f87c8f10d92dc525dfcb4cd5a966be0e8d99fc00851e85b85827d31c861034c20d2acb49e4f1eebd8e0d0215d54db2b1102407cec2970fe9f293c9d3a672d3777ff0edf728545bcbe005c178e0b405fe4223aab60dd44521be321672e81445892911130e602a4b8359bb3632f909918e02a58",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 306,
+          "comment" : "special case hash",
+          "msg" : "353739303230303830",
+          "sig" : "308184024049cd57e25cfb68043705184969e309066986057d9c0b7a2f87766aadcf76eda8028d4eceaceced9153ac9760f47514dddd33473af09ff0dfc000d53130a2010e024073d534bd76522681e71109c07cb17b09e661c11c519b20fe6db80d47756f844840b7be6b95c5db497e706c5f58c78a350a8e802effbd55b5967bdf87ce75f064",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 307,
+          "comment" : "special case hash",
+          "msg" : "35333434373837383438",
+          "sig" : "3081840240680d7c82bbff291bb71f2da532f1a931eb39a222336d5e40657cc2fb126b2247cf2dae233555564ea4424ec37912b37e8866d45c393c6a91ce132dbc9f46635d02401f0c515856a62af68f0f23145aad92a77d7107d8d8aa46cabcc72b2c082185db1d75d1546a4e6cf527c69fe52cb76ee15eaa620444b6f272b4027635ebe83676",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 308,
+          "comment" : "special case hash",
+          "msg" : "3139323636343130393230",
+          "sig" : "308184024059fff5ae9729b21c389a12702360aca2575ed4a44922e17de57ce93979f19556de0e25581cfc98c1a68ef001a7f8d157e7591baea44e003c454e941bbf9e5f7e0240109196a80b32a0a57a7bcd3a6ce7f925d14f51c6152ad866d3373008d650b5af7a25e2bfbd59b6371fffecfde116d2a36a8d1fe9178ba3b3f37c09b271a5b050",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 309,
+          "comment" : "special case hash",
+          "msg" : "33373033393135373035",
+          "sig" : "308184024066ef246c7b80b56e0ea783ac737151c73610218d00c936f4c18d5a6c44f35ee19d8aa15765dffdfe51aaa331123ee4c5c8d67263f695561e7cf7e648efb7a4f702402a0ac49a984cbdf66c59c65dee9a3cc5816b7882af45341e9dc514aefaecd2468cd5b967a53654880046e18e1adc991fe1b7bc0e5379179ba3dc84bcee12c61b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 310,
+          "comment" : "special case hash",
+          "msg" : "3831353435373730",
+          "sig" : "30818402407469767e7512c7d294d83290871b5cb7ec5d6ebf05b2d7651839729b8727818e9e530875e901b759e92c798610d4473591b2cfb87428a2f0b1afb25d25f9868c024013aa65ad34388ee102ce4fe0f3801db5f1be38b8f591946ae55be7159a2e047d037618ce45a0980c9f686a7bee7fe8c7882262c4f7c6608596e12900cea620a3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 311,
+          "comment" : "special case hash",
+          "msg" : "313935353330333737",
+          "sig" : "30818402402dde8dae883b5f5b8222b261ff198b0d4615b223735380031e37603d9766c3a660ccbae350d40994ebb49a09d8c902beacf8f0de1ca2b0a4a31d00b56bd845a402406604fde70ac761420133624def5c44b5d5a5795d4412dd73983aef629080ae47636497018cd5d31c8b85b2b03d72171488429eaf4b8247aa6b01044c0ae461f9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 312,
+          "comment" : "special case hash",
+          "msg" : "31323637383130393033",
+          "sig" : "3081850240245dbf6c53a2d7881b8d157a6200d9ba3243e4d9c12d3edebd8ff9e103c6158f896ed5bcab43383cf6becdbcf081604a595508172bbf43f152b669c4f41d21e5024100a1dfaf17a6e551fe0bc0cc24cac5a8214dbd750860a60300210ae9dc4aa160f788dd58b82f9688407551b0a20e367083a1a0f99c35715228c2252f0f0ddb2585",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 313,
+          "comment" : "special case hash",
+          "msg" : "3131313830373230383135",
+          "sig" : "30818402404550b986fb04cc7fde0dc85a95a1581794b2521020532dc00fb5ed4b0ebd6834f183f3c62a5756bf5bd0b9a516bc3d6c7e81efe551164b9de0c152938295e2fb0240485976253d58032d27ed6156ec15cf853440ddecdf63bdb304e1e74d139c1319674664c5aaed9bb3043a6e8aab1ca2e15afdb45d3320042750f9ea8296fcd5e4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 314,
+          "comment" : "special case hash",
+          "msg" : "38333831383639323930",
+          "sig" : "3081840240539183dadea6630bd4416a49a8d6e7792303e1e44d2028726f84697c496c26daccac5fc4a4ad34866e718e9067c4af1bc9e22c70b94e74f2822fef929e7bad5602404abb755192a18efb2e72a2fb4ee51e47db6d3bb21be2ddefb8fcff5e084a2d8c8c7a1f44d04c54b6bcbb957c14a62d7547feccb5d3f20ed20093136d97dcb689",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 315,
+          "comment" : "special case hash",
+          "msg" : "33313331323837323737",
+          "sig" : "3081840240208250a2a662f8536b5cdcffa137b83c525512d9e3cdfed020760c1b05b55fc9f66c6d7a8c25bfa475b107831153738d55a4dd07a78192d041692bf535e1ac0402403d857ddd8cb246ac6ed21e1dc5368190daa99bf8c36449edd318b27827a24c9ab0314c592617249a1da9fde135bc85e4c4805d05179b40c8cf4edbc0adf19f46",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 316,
+          "comment" : "special case hash",
+          "msg" : "3134333331393236353338",
+          "sig" : "308184024065c639aa06868153b7763ff68bce97c7d9fe2f028d9bea623285214ec5572f641274e419a8335dec43fff2234ded00bb0123411dea843e970bfb8fed4a514ee402403fd4eab53713231e9191906ef0cba9c4cb50fc24628c8f2db1914d6ccec491c780c96cdb1b9be6a63cd379a8463939aa8a6eca6357237fa8e829fa4a38448f7f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 317,
+          "comment" : "special case hash",
+          "msg" : "333434393038323336",
+          "sig" : "30818402404a110cc6aba129603a617f0f83c8d7e9a661df8b571fed8498322d5e448b466f7942e39a56a085303ddb922db59c7dcaee44de094a7853e717a3e928179fbc7602402e5484867e70cf9e3bfcff309e89ee1d909904f4b94022ae91177554706122e5c45f9a72aee76410bb844f09f8e66e0eede287d6c365244e7632f478a7530a11",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 318,
+          "comment" : "special case hash",
+          "msg" : "36383239383335393239",
+          "sig" : "308185024039c896c0409967f9be11fdfff9e8f7b08b7f2cf44be471d4ea1e256932344436663a4da8fe28ffe79d277458e9ea2f597a7db847414bb2ad2438037cb6c4a6cd024100910d53ab2c5c56bf05837429e5e3d08a02d0e602272830297922bc91e29f4f988271fdd60f070eb0aa1e57d742ca75965638274f3cfb2b7b28d1a1462a384fa3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 319,
+          "comment" : "special case hash",
+          "msg" : "33343435313538303233",
+          "sig" : "3081850240431701fe9a41c1cda0a23b6c4fffb7128b536bc9c0fa1455d7263af04a1a1d409a96a2e04a56e1912838d4ad45ae9d66db7d9347e160495b4be77122852a281d024100824cb138a29f22435d401880556e16c5859349bd19f53c5c20516ace4d84c5c600bf61114e05697cde121686921b9774b83b84d00c2cd6b78cc5920c6321878e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 320,
+          "comment" : "special case hash",
+          "msg" : "3132363937393837363434",
+          "sig" : "3081840240684e6e41e2588506b6ec29b458301a7981c1093300675a9cfec0f195696d35a16068c4e25424fc9b276d84f7afeb39af096effecff09a6ac67327095e2e25c2a02401c3080b7f70cebd1930a2b8bf60731e8380fae8a08f0311a27abc15d1105e4aa626260cee865d2cf224ac7a925c4eb5babce2fecb5e20d61f7a5dbbbe33a0193",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 321,
+          "comment" : "special case hash",
+          "msg" : "333939323432353533",
+          "sig" : "30818402404c56b13a81a39cb7f2767b115fb409b9cb9988aac5885b632712b133f23bec54c6fd53318e265fbcb18476717339ea901259fe629a396267741ef44e4475a7bb024024fca68064bbf8bee1551c2d00b54a16b50b4821c299e2aa1a73dfe2f81c73c40993166ab8ed9bd8489cfe523e41cf6e35ef7a7a331bd8d2a4db77dff40d113b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 322,
+          "comment" : "special case hash",
+          "msg" : "31363031393737393737",
+          "sig" : "3081840240682afc3b9259dbc9160119014619375a7d4916bd08a931cf7877875fc777d18a3caaf253c605c1197399ef9372b9f585a5841498565fb577018160f62f9f3b6b024056a7e2dc08f6fb561b620f09e830ce6fd52b49da815f9c3e89959b0d2fcc79adfb6dd9f9ddf0ed9e295b728c305effcb4d97efde40d93dc2b6377e9d4f72be15",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 323,
+          "comment" : "special case hash",
+          "msg" : "3130383738373535313435",
+          "sig" : "3081850241008a6854acf4c80327def8e3ec1046de4f35498df798a916edc84431674d4eb45d20559ccdb8c1a14754de6ef404b5e8a66c3628abacd07e8ca406ddc0d97560e602401e5a07f82bf320b774a460f3ebf53496ef632f7a33d51fa2847f63931fef1311b53c213840ea3c6e70d2846a576599026ac16690258e4fc8edbb1211816fc11b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 324,
+          "comment" : "special case hash",
+          "msg" : "37303034323532393939",
+          "sig" : "30818402401b0605be20e4374b17e4eac26bd2bb957020e1e05108279bd26960de64d39ef2d19cc8ccbe8fd72e122412c2c620cd2c4640268b38df93193b8ac7e0d8382ca50240289927ed08ef4e0e5a41728775a10dde8c6cc6e08f9eaba51077c880c5aad647bc2f35def592d0ddd1d3e140b6e756c46be36013cc5a6e5bb9870b5c4dcaf2ac",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 325,
+          "comment" : "special case hash",
+          "msg" : "31353635333235323833",
+          "sig" : "3081850240373844063323beb4e6a4d282193592df39dc5767519a8031b62d8aabd5ded695407bc4687ac09de93fa38a89412cfe6acb5c09975779a9e41702e18157b844570241009262014ccacb90a4b8333b9743f25b89825f3f7d2171e6f3afd82c048a9805745b7812b46c2c5447fe100e3beea0ec3bb4fded3744531eb00c4df1e05d39c573",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 326,
+          "comment" : "special case hash",
+          "msg" : "3233383236333432333530",
+          "sig" : "3081840240798f3008a628ad65c7f83ab51f2e7b9e1d1b74cad864334cde339ba3d2d73f13549a18c6bc8f8272d5a036570f45a1cff2051cbc48e8a990c3303bd6df887ed9024060a1a0ef92d5c28b6d6afeb2718decb57661253ac5fd2e13639b04fe6d417eeb40d753146fdb804937ac6ba92c8f8bf96a9e0c81532ef03910bf4ce0483bf39d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 327,
+          "comment" : "special case hash",
+          "msg" : "31343437383437303635",
+          "sig" : "3081860241009582bfa8a212ba8d0852a4690bff7c937bafddd2f8447d850ae518389f20182bf83b00052c3b3dc65b1a70cf216cdfa62dcd17a5adf331a2a732baaeeec0ad9d024100a4a1e41f5fdbb9000d0f3bbe311995a28af86b9b0334de549882964c5311aa52d87de9626706bb2514c1cf409e9907f4e91e9a49d65524b4dfcba52092025506",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 328,
+          "comment" : "special case hash",
+          "msg" : "3134323630323035353434",
+          "sig" : "30818402404d6790c49c82a7ac06ce84215394c86c7011b1b5f714738b1ad4d7b010d8546763f602c9af1e6748a27d297bed04ebead4bf629043e4deb398a27d4f86f3d79502406a6dcf9c898c07d24f13e76366fdfb76eddd4157ef2befa910524934a8d4109c12e01ec45d9fd4978fb2910681e5460371bbfc76528703e8b8a8bcbe8a6c8a39",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 329,
+          "comment" : "special case hash",
+          "msg" : "31393933383335323835",
+          "sig" : "308185024065b49ebf5198da395aa182ba31d473129acc2fd65fdc0df2cd59a1c68a527882c922f73993396355bd6cdf4e4fe9c42e1716f66eaf3e0e73253d5f618c3006390241008deb03cc4640194ce230da1d77aacb007427557f70d4a0ee814812c560865f14f24a8f79393cef1a159d2834d9fdee0a16a85bcd5cd50e0f7c26323036335ffd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 330,
+          "comment" : "special case hash",
+          "msg" : "34323932313533353233",
+          "sig" : "308185024100873e39e7f6b7dde5e40ca7fd4b8e85f3cdeeae4671d63218b9f7195445661da0d1f54607599ae7531202ebbae9b5a1a58d37c4a1fd3fff8e96547fdd3f76f883024074bf6db093260eff6cac9f06db1646c083e4bc09c8f1755aa302ecf7916979019cad8bed739007970c2cee87d0252cc68f056f710330c65fc56551297312b220",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 331,
+          "comment" : "special case hash",
+          "msg" : "34343539393031343936",
+          "sig" : "30818402400127ada33ff4c6441e79f6014651df82d4d10cf4601ac567d44142b0dcfc933f7c8a2e231d0d290cbf042df6112d6fe16ddd2c1e96f798205cbf595268a9415702402235411c90cc9ac1872d238e7c7d8deb0755b3662cd9f249bf3c844e750cf58f90fe908f28b138676ef9cb24efbbafab8d3bebc177a5b32a32d17b91fc49b0dd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 332,
+          "comment" : "special case hash",
+          "msg" : "31333933393731313731",
+          "sig" : "3081850241008244c73317b53e37473d7beef9f8e5bd31ed801f9bbdb9639b7f0f24e0329c7914959bf0cd2006986fa81f7f4b4002503343aec0465d8f1ed17c97746ed6caed024014bc6cc4d155377175ea95c359c69624afe18579014421b66a140e87c1439f7d78f5645d4bd8c027549526865855fff0fc527f493623c3647b5c901d8de4b829",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 333,
+          "comment" : "special case hash",
+          "msg" : "32333930363936343935",
+          "sig" : "308183023f11ddcc69dda56764afdbeacd615b3c2950587943716ed6dac7658679a21b2b4cdbe85a5e4094def253ede57f31ef7588ee3124d805abc12ecbf7f55a7cb55d0240119d722bc372a4e6c5b4e39fdf25816f2387d00ef040d0ad75bda27970001ce5cdf5a2d4dd8bc804219fe8e9715296adb53303b90f2c5c1f3f94b3f5f2fda8c2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 334,
+          "comment" : "special case hash",
+          "msg" : "3131343436303536323634",
+          "sig" : "308184024012e59cd484adba7d0fc2e402d6caf0e44a0ed252a891623d2687902b518376efd734a7b7533d797ce8f145028b428c18f5f20443c53f04e604aa311315e9266d024047736e60345f1cb9bf7bd117d8cb82c941179f0893a4b7d8762f7bc9322025a564acbd7b3bb47de384a4582f337b809e84c48b08610a3dfd0c875dfe9b8885f3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 335,
+          "comment" : "special case hash",
+          "msg" : "363835303034373530",
+          "sig" : "3081850240009a5f640cdaaf26f1c15cfc5c27498a8231571f22053154cc2f52877cbe5cf289c553d7bdf86b1973263604d594e529ab2d1df1066d885fd5a061f638e7a34602410091fe33e050748bd7d76883a03d5f2976487a0326a3a3c5ef276c38a9ca09962570ecc8b89f931a145497b77a482a731289c2f79c4a7b871928b39e94a1488c83",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 336,
+          "comment" : "special case hash",
+          "msg" : "3232323035333630363139",
+          "sig" : "308185024068c001ac8c8804c0a9c38f18109e26b4e8a1ba18d0fba8547f70e3989f3c510871e80f8a7b314fc521b7c79c3bb3b691560ab9d699a24915fc682fdac1f01c6f0241008c2fa0a4d960d2688442dbd663e85f46d858faaaff91b7ba9ae96ba6619663780f05950d0ad89b79cd695d14dee57f27bca99f0165f1d4bb123d17b1a46bda32",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 337,
+          "comment" : "special case hash",
+          "msg" : "36323135363635313234",
+          "sig" : "30818502404b1e61394e6c262b1e4a63ea7cf41e660020b247358d1b15aaec9533d587d82425a860dc9f7a8e2b1761393d3fc2a9d1ac433a0662a1e2ee2555fc9c3849ad4b02410086daeb1961ef422a09f53bfa0e5ffc7f52a3b55e76f0c2ebb7f8b034b3cfaff08c527a15a9f97e8d09da812e395d5c611680b7f651d41694f0b58fe9eb310b6b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046b6763a186aa5159049f2ea5c8a232dcbe6337b0d92e969da52af32524f61da3097fa314ac792234e59867af320478774bd4c785a0330624c0b4babe257f65972e4063e45e13d505e14db6f5fef3538db181cc1a6e0a9381fa3f0321be47f40dc05ab80e9caa3b7559c67535e83d984f3b9557118dde29c5e7a5a4a18d0c9d43",
+        "wx" : "6b6763a186aa5159049f2ea5c8a232dcbe6337b0d92e969da52af32524f61da3097fa314ac792234e59867af320478774bd4c785a0330624c0b4babe257f6597",
+        "wy" : "2e4063e45e13d505e14db6f5fef3538db181cc1a6e0a9381fa3f0321be47f40dc05ab80e9caa3b7559c67535e83d984f3b9557118dde29c5e7a5a4a18d0c9d43"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200046b6763a186aa5159049f2ea5c8a232dcbe6337b0d92e969da52af32524f61da3097fa314ac792234e59867af320478774bd4c785a0330624c0b4babe257f65972e4063e45e13d505e14db6f5fef3538db181cc1a6e0a9381fa3f0321be47f40dc05ab80e9caa3b7559c67535e83d984f3b9557118dde29c5e7a5a4a18d0c9d43",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEa2djoYaqUVkEny6lyKIy3L5j\nN7DZLpadpSrzJST2HaMJf6MUrHkiNOWYZ68yBHh3S9THhaAzBiTAtLq+JX9lly5A\nY+ReE9UF4U229f7zU42xgcwabgqTgfo/AyG+R/QNwFq4DpyqO3VZxnU16D2YTzuV\nVxGN3inF56WkoY0MnUM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 338,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "313233343030",
+          "sig" : "3066022101280f3ebf4f1d42296d47401166f7709f0ad02bae2524eba77322c9d3bb914889024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90066",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 339,
+          "comment" : "r too large",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca703308717d4d9b009bc66842aecda12ae6a380e62881ff2f2d82c68528aa6056583a48f2024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90066",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048f676959bfda02d373977a80528b61d4148f8eabc2027fb5b5db5827677d147a728661fd5c546b6ad5f0a89a347449aa2f32112e3bbda8035089547929b56a5578c45ce0a688aea390d4e4db4d48d2cdb21865bc8cefd15f2bbae4270ab765a76f049449f17ce1ac7f513977ce0a5237e5bd63b4af92a6cf4918d91bccd0f279",
+        "wx" : "08f676959bfda02d373977a80528b61d4148f8eabc2027fb5b5db5827677d147a728661fd5c546b6ad5f0a89a347449aa2f32112e3bbda8035089547929b56a55",
+        "wy" : "78c45ce0a688aea390d4e4db4d48d2cdb21865bc8cefd15f2bbae4270ab765a76f049449f17ce1ac7f513977ce0a5237e5bd63b4af92a6cf4918d91bccd0f279"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200048f676959bfda02d373977a80528b61d4148f8eabc2027fb5b5db5827677d147a728661fd5c546b6ad5f0a89a347449aa2f32112e3bbda8035089547929b56a5578c45ce0a688aea390d4e4db4d48d2cdb21865bc8cefd15f2bbae4270ab765a76f049449f17ce1ac7f513977ce0a5237e5bd63b4af92a6cf4918d91bccd0f279",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEj2dpWb/aAtNzl3qAUoth1BSP\njqvCAn+1tdtYJ2d9FHpyhmH9XFRratXwqJo0dEmqLzIRLju9qANQiVR5KbVqVXjE\nXOCmiK6jkNTk201I0s2yGGW8jO/RXyu65CcKt2WnbwSUSfF84ax/UTl3zgpSN+W9\nY7SvkqbPSRjZG8zQ8nk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 340,
+          "comment" : "r,s are large",
+          "msg" : "313233343030",
+          "sig" : "308186024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90065024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca90064",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0414f38afbc8d6be59ee7075bdfd2616a44b86535687d05c2347553173cd14df8abd0a4c102c62e8141127dc66d2dcaae38c9324980ede204688bb9f916ba9f1a823f358139316ca27b8874e68b93388f9780d9ba7e23b8421bfad38a19ed161477e0a05380bebd7a1156dc32f69047679fa2b977fadc0c29ebc1ebcea6cc1894c",
+        "wx" : "14f38afbc8d6be59ee7075bdfd2616a44b86535687d05c2347553173cd14df8abd0a4c102c62e8141127dc66d2dcaae38c9324980ede204688bb9f916ba9f1a8",
+        "wy" : "23f358139316ca27b8874e68b93388f9780d9ba7e23b8421bfad38a19ed161477e0a05380bebd7a1156dc32f69047679fa2b977fadc0c29ebc1ebcea6cc1894c"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000414f38afbc8d6be59ee7075bdfd2616a44b86535687d05c2347553173cd14df8abd0a4c102c62e8141127dc66d2dcaae38c9324980ede204688bb9f916ba9f1a823f358139316ca27b8874e68b93388f9780d9ba7e23b8421bfad38a19ed161477e0a05380bebd7a1156dc32f69047679fa2b977fadc0c29ebc1ebcea6cc1894c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEFPOK+8jWvlnucHW9/SYWpEuG\nU1aH0FwjR1Uxc80U34q9CkwQLGLoFBEn3GbS3KrjjJMkmA7eIEaIu5+Ra6nxqCPz\nWBOTFsonuIdOaLkziPl4DZun4juEIb+tOKGe0WFHfgoFOAvr16EVbcMvaQR2efor\nl3+twMKevB686mzBiUw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 341,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "30818402407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02404338ed95ac0d09c51d7044d59f1bc26f8f3f11fc7bf2f81bdf0b21b5c0b9c89bea3cc6dd8b3692c8310b98117b508d130073e74b02b3ba482fb0a5ef1036a3fd",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043df9e586410ba633b9f165d29b073b67a167297cb4086889e52b925a9cb25acc4c85e5b8112221ba49ecc99a0cb7fb3385352a7140072f79c2f44396ee8b678622c7b6185e4b667a5cc427c99ca53fe54f03dfeeca92ba2c1ae1f2b3feebedeaba62ee3ba065ac5303c2d56969f0b341486f29f3b2a06df32830f25999c42f88",
+        "wx" : "3df9e586410ba633b9f165d29b073b67a167297cb4086889e52b925a9cb25acc4c85e5b8112221ba49ecc99a0cb7fb3385352a7140072f79c2f44396ee8b6786",
+        "wy" : "22c7b6185e4b667a5cc427c99ca53fe54f03dfeeca92ba2c1ae1f2b3feebedeaba62ee3ba065ac5303c2d56969f0b341486f29f3b2a06df32830f25999c42f88"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200043df9e586410ba633b9f165d29b073b67a167297cb4086889e52b925a9cb25acc4c85e5b8112221ba49ecc99a0cb7fb3385352a7140072f79c2f44396ee8b678622c7b6185e4b667a5cc427c99ca53fe54f03dfeeca92ba2c1ae1f2b3feebedeaba62ee3ba065ac5303c2d56969f0b341486f29f3b2a06df32830f25999c42f88",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEPfnlhkELpjO58WXSmwc7Z6Fn\nKXy0CGiJ5SuSWpyyWsxMheW4ESIhuknsyZoMt/szhTUqcUAHL3nC9EOW7otnhiLH\nthheS2Z6XMQnyZylP+VPA9/uypK6LBrh8rP+6+3qumLuO6BlrFMDwtVpafCzQUhv\nKfOyoG3zKDDyWZnEL4g=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 342,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "30818402407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024039c982e2a4f560c509055888f60317e6b5bb61d594d7bd4f5897396bf3e81a09cf703d319f9b4a092d46d5f202ff5ddb776c57e8ede8454def7037b541c97436",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040ad66abdba9fbee1fdd1b9e0db9a7460f460de3916efd16d7d9c6cc7a6cc9fa5cc03020d9f8c9094c0cb52fe1babd63c69ab20f04a116ecee3a009d5acb5729d5b4765858f696b61bf6b3a1812d057bee93b143836a764927971fb746141b5422fc077f73caa000f62ce00103502d1ecb0954f2cad60b224ec6fe1033009d64c",
+        "wx" : "0ad66abdba9fbee1fdd1b9e0db9a7460f460de3916efd16d7d9c6cc7a6cc9fa5cc03020d9f8c9094c0cb52fe1babd63c69ab20f04a116ecee3a009d5acb5729d",
+        "wy" : "5b4765858f696b61bf6b3a1812d057bee93b143836a764927971fb746141b5422fc077f73caa000f62ce00103502d1ecb0954f2cad60b224ec6fe1033009d64c"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040ad66abdba9fbee1fdd1b9e0db9a7460f460de3916efd16d7d9c6cc7a6cc9fa5cc03020d9f8c9094c0cb52fe1babd63c69ab20f04a116ecee3a009d5acb5729d5b4765858f696b61bf6b3a1812d057bee93b143836a764927971fb746141b5422fc077f73caa000f62ce00103502d1ecb0954f2cad60b224ec6fe1033009d64c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAECtZqvbqfvuH90bng25p0YPRg\n3jkW79FtfZxsx6bMn6XMAwINn4yQlMDLUv4bq9Y8aasg8EoRbs7joAnVrLVynVtH\nZYWPaWthv2s6GBLQV77pOxQ4Nqdkknlx+3RhQbVCL8B39zyqAA9izgAQNQLR7LCV\nTyytYLIk7G/hAzAJ1kw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 343,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020103020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049741c2634e42f1865625a9d97ebc549ac8c67eb6d03cd2a7c5987f0f5164c9be9775e32c5d59d3175de468e243591021ab623f6b09b31a4028639b041684f359470ddff173c67c71055f5f715b7b74993800305938bbda89d24b187f4819c30575d5e2275f08cbf3ba86b1a11f12671d2eb009d02516f3d1da0aafcd1d81a0c1",
+        "wx" : "09741c2634e42f1865625a9d97ebc549ac8c67eb6d03cd2a7c5987f0f5164c9be9775e32c5d59d3175de468e243591021ab623f6b09b31a4028639b041684f359",
+        "wy" : "470ddff173c67c71055f5f715b7b74993800305938bbda89d24b187f4819c30575d5e2275f08cbf3ba86b1a11f12671d2eb009d02516f3d1da0aafcd1d81a0c1"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200049741c2634e42f1865625a9d97ebc549ac8c67eb6d03cd2a7c5987f0f5164c9be9775e32c5d59d3175de468e243591021ab623f6b09b31a4028639b041684f359470ddff173c67c71055f5f715b7b74993800305938bbda89d24b187f4819c30575d5e2275f08cbf3ba86b1a11f12671d2eb009d02516f3d1da0aafcd1d81a0c1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEl0HCY05C8YZWJanZfrxUmsjG\nfrbQPNKnxZh/D1Fkyb6XdeMsXVnTF13kaOJDWRAhq2I/awmzGkAoY5sEFoTzWUcN\n3/FzxnxxBV9fcVt7dJk4ADBZOLvaidJLGH9IGcMFddXiJ18Iy/O6hrGhHxJnHS6w\nCdAlFvPR2gqvzR2BoME=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 344,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020103020103",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048b06a77616ea21f14093d3a373a8f57106a71939f25415f6a9aa001640b5ed0adf39fc2f5e58d4233c2eefe4f170499da57e9dceb7f8cd5f38c4181fa7d2f768074a91e99eabced1bda358653e09b51eb8b1a9526f5a1b32c7edd3b701f5af4103314971d5c082c5f20053c3b66d39a1cb6c4d310dbe895546892d4296d96eff",
+        "wx" : "08b06a77616ea21f14093d3a373a8f57106a71939f25415f6a9aa001640b5ed0adf39fc2f5e58d4233c2eefe4f170499da57e9dceb7f8cd5f38c4181fa7d2f768",
+        "wy" : "74a91e99eabced1bda358653e09b51eb8b1a9526f5a1b32c7edd3b701f5af4103314971d5c082c5f20053c3b66d39a1cb6c4d310dbe895546892d4296d96eff"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200048b06a77616ea21f14093d3a373a8f57106a71939f25415f6a9aa001640b5ed0adf39fc2f5e58d4233c2eefe4f170499da57e9dceb7f8cd5f38c4181fa7d2f768074a91e99eabced1bda358653e09b51eb8b1a9526f5a1b32c7edd3b701f5af4103314971d5c082c5f20053c3b66d39a1cb6c4d310dbe895546892d4296d96eff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEiwandhbqIfFAk9Ojc6j1cQan\nGTnyVBX2qaoAFkC17QrfOfwvXljUIzwu7+TxcEmdpX6dzrf4zV84xBgfp9L3aAdK\nkemeq87RvaNYZT4JtR64salSb1obMsft07cB9a9BAzFJcdXAgsXyAFPDtm05octs\nTTENvolVRoktQpbZbv8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 345,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020103020104",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 346,
+          "comment" : "r is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3046024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca9006c020104",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04792feceeb3166356d10aeb0940124294341802924c79f2391b77875657c17f55955b28685cc2203f18c22004bab1da516896f01b0529c804245baa3a6930b35526deb73e372176cc7358c04247923a791181ce72c183506046e69de4976d4f2637f11e705f1f9a5a0f99eea1841e540c6aa43d4fb20030d70d4a54fb6a6e8559",
+        "wx" : "792feceeb3166356d10aeb0940124294341802924c79f2391b77875657c17f55955b28685cc2203f18c22004bab1da516896f01b0529c804245baa3a6930b355",
+        "wy" : "26deb73e372176cc7358c04247923a791181ce72c183506046e69de4976d4f2637f11e705f1f9a5a0f99eea1841e540c6aa43d4fb20030d70d4a54fb6a6e8559"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004792feceeb3166356d10aeb0940124294341802924c79f2391b77875657c17f55955b28685cc2203f18c22004bab1da516896f01b0529c804245baa3a6930b35526deb73e372176cc7358c04247923a791181ce72c183506046e69de4976d4f2637f11e705f1f9a5a0f99eea1841e540c6aa43d4fb20030d70d4a54fb6a6e8559",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEeS/s7rMWY1bRCusJQBJClDQY\nApJMefI5G3eHVlfBf1WVWyhoXMIgPxjCIAS6sdpRaJbwGwUpyAQkW6o6aTCzVSbe\ntz43IXbMc1jAQkeSOnkRgc5ywYNQYEbmneSXbU8mN/EecF8fmloPme6hhB5UDGqk\nPU+yADDXDUpU+2puhVk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 347,
+          "comment" : "s is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3046020103024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829cbbd6f0",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0481b42adaac02a5fd87a04a16ddc2333075778f133ea0af66049c72a06721e3924979249e04291e4b99d4ecf448b3fdc5e56ea23381d6d06e23011965d1653816244327f9d59ca6787575bb7707ef2672f113ba7a302d69c29fea6ff66f449dcd3b273b3398481776c2f2a685cb6dde31e176be8f2b785fed313be5730c6624ed",
+        "wx" : "081b42adaac02a5fd87a04a16ddc2333075778f133ea0af66049c72a06721e3924979249e04291e4b99d4ecf448b3fdc5e56ea23381d6d06e23011965d1653816",
+        "wy" : "244327f9d59ca6787575bb7707ef2672f113ba7a302d69c29fea6ff66f449dcd3b273b3398481776c2f2a685cb6dde31e176be8f2b785fed313be5730c6624ed"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000481b42adaac02a5fd87a04a16ddc2333075778f133ea0af66049c72a06721e3924979249e04291e4b99d4ecf448b3fdc5e56ea23381d6d06e23011965d1653816244327f9d59ca6787575bb7707ef2672f113ba7a302d69c29fea6ff66f449dcd3b273b3398481776c2f2a685cb6dde31e176be8f2b785fed313be5730c6624ed",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEgbQq2qwCpf2HoEoW3cIzMHV3\njxM+oK9mBJxyoGch45JJeSSeBCkeS5nU7PRIs/3F5W6iM4HW0G4jARll0WU4FiRD\nJ/nVnKZ4dXW7dwfvJnLxE7p6MC1pwp/qb/ZvRJ3NOyc7M5hIF3bC8qaFy23eMeF2\nvo8reF/tMTvlcwxmJO0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 348,
+          "comment" : "small r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "304602020100024012d5e9125cc71fbeb86c217e09bd92b646c6dd3a1be1d6a6ed4d80267127e4b5b4bc4aac7d5d3aa0033114c85aac2a1bff3def001d248d0a5483dc2ea66f5ac1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401a0e00bb4a669f10f594489a42f1babd3a028b5ea75757a986c55f6159469752b88bbe9f52f2422d503a4d9a849c3dad410a6dc4e4e32b95469e09386063401574c501128906459a23af93b9830e297f3e73d3173df7807679b713ce6b34f64b1ee7547b927e43105118c496b9a3c1e0264e84b5b0fb459582af98edf0c117f",
+        "wx" : "1a0e00bb4a669f10f594489a42f1babd3a028b5ea75757a986c55f6159469752b88bbe9f52f2422d503a4d9a849c3dad410a6dc4e4e32b95469e09386063401",
+        "wy" : "574c501128906459a23af93b9830e297f3e73d3173df7807679b713ce6b34f64b1ee7547b927e43105118c496b9a3c1e0264e84b5b0fb459582af98edf0c117f"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000401a0e00bb4a669f10f594489a42f1babd3a028b5ea75757a986c55f6159469752b88bbe9f52f2422d503a4d9a849c3dad410a6dc4e4e32b95469e09386063401574c501128906459a23af93b9830e297f3e73d3173df7807679b713ce6b34f64b1ee7547b927e43105118c496b9a3c1e0264e84b5b0fb459582af98edf0c117f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEAaDgC7SmafEPWUSJpC8bq9Og\nKLXqdXV6mGxV9hWUaXUriLvp9S8kItUDpNmoScPa1BCm3E5OMrlUaeCThgY0AVdM\nUBEokGRZojr5O5gw4pfz5z0xc994B2ebcTzms09kse51R7kn5DEFEYxJa5o8HgJk\n6EtbD7RZWCr5jt8MEX8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 349,
+          "comment" : "smallish r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "304b02072d9b4d347952cc024076752ce289c38f22de7f75d0fa6da056f473c77194de931d97efd65421ff3ec82c57a6393a42702e14a2d831768865ab933281abf1bcf52a7ef6b73f2373c9ee",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040dc4c5639b7690157c210b75e7a006d9cfdf80f9d0b2bbd643036890a8168a88947b197aa9a60047cd8f6e77c0777bb9e09da737dbbe57a977a6ae070798356460b0a49d4f9578273f6e5ab3873194292e893e06c5a39bb1f8a0551f4e01ca460a03a77c35cff8d7d6e0f33b8a88acdc36eae5a83a129bfeecc2a68936883d91",
+        "wx" : "0dc4c5639b7690157c210b75e7a006d9cfdf80f9d0b2bbd643036890a8168a88947b197aa9a60047cd8f6e77c0777bb9e09da737dbbe57a977a6ae0707983564",
+        "wy" : "60b0a49d4f9578273f6e5ab3873194292e893e06c5a39bb1f8a0551f4e01ca460a03a77c35cff8d7d6e0f33b8a88acdc36eae5a83a129bfeecc2a68936883d91"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040dc4c5639b7690157c210b75e7a006d9cfdf80f9d0b2bbd643036890a8168a88947b197aa9a60047cd8f6e77c0777bb9e09da737dbbe57a977a6ae070798356460b0a49d4f9578273f6e5ab3873194292e893e06c5a39bb1f8a0551f4e01ca460a03a77c35cff8d7d6e0f33b8a88acdc36eae5a83a129bfeecc2a68936883d91",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEDcTFY5t2kBV8IQt156AG2c/f\ngPnQsrvWQwNokKgWioiUexl6qaYAR82PbnfAd3u54J2nN9u+V6l3pq4HB5g1ZGCw\npJ1PlXgnP25as4cxlCkuiT4GxaObsfigVR9OAcpGCgOnfDXP+NfW4PM7iois3Dbq\n5ag6Epv+7MKmiTaIPZE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 350,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "313233343030",
+          "sig" : "3052020d1033e67e37b32b445580bf4efd0241009ce766006a5130005e79caddba04302708487a27823bd1d3d9ca0a801f4fbc0b83126aa1911ad44afd6a770c753d619fef707e7c773f467de5738b35333893cd",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04867dfdd726cee931256dd9aae0c1a660a12b1dfd6baf180b35e39c0f93cbf9800c5cf11b29f18678d325121fb286545a512dd8f6c2cb81e598d05fc40cfcf9dc91d4d2153f667593e25fee42e39dafd1811974943e875dfcc6badc0ea22db4212637be71c6b74375c43cfbf719088691aec70e691e46edfe8ccdb4cefcb1351e",
+        "wx" : "0867dfdd726cee931256dd9aae0c1a660a12b1dfd6baf180b35e39c0f93cbf9800c5cf11b29f18678d325121fb286545a512dd8f6c2cb81e598d05fc40cfcf9dc",
+        "wy" : "091d4d2153f667593e25fee42e39dafd1811974943e875dfcc6badc0ea22db4212637be71c6b74375c43cfbf719088691aec70e691e46edfe8ccdb4cefcb1351e"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004867dfdd726cee931256dd9aae0c1a660a12b1dfd6baf180b35e39c0f93cbf9800c5cf11b29f18678d325121fb286545a512dd8f6c2cb81e598d05fc40cfcf9dc91d4d2153f667593e25fee42e39dafd1811974943e875dfcc6badc0ea22db4212637be71c6b74375c43cfbf719088691aec70e691e46edfe8ccdb4cefcb1351e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEhn391ybO6TElbdmq4MGmYKEr\nHf1rrxgLNeOcD5PL+YAMXPEbKfGGeNMlEh+yhlRaUS3Y9sLLgeWY0F/EDPz53JHU\n0hU/ZnWT4l/uQuOdr9GBGXSUPodd/Ma63A6iLbQhJje+cca3Q3XEPPv3GQiGka7H\nDmkeRu3+jM20zvyxNR4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 351,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "313233343030",
+          "sig" : "3046020201000240029c0de2216bab72af9ec823411e7ee444482bc268ae1ba9064e04019609757d95b2e0c5a3fde377a87fcd38b32f8061bd3dc81cbbdb96ca626e6582ba61dc31",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0434308c7d6eaa1bd7d8edc02fc6277c5271ca847428ff210d6078ec968df4e8730e21bc7715a7ee85a7352802466c0ab23560929bab49296509937fe7cd6edc0236491a29b86ea0e6124f4b72101f48230bdc1f5b36d2e6500c3ffd4ba9818b435046335a2da15a89bc51117204d330832abc0f7b09a59d82bbb01d71762d8df5",
+        "wx" : "34308c7d6eaa1bd7d8edc02fc6277c5271ca847428ff210d6078ec968df4e8730e21bc7715a7ee85a7352802466c0ab23560929bab49296509937fe7cd6edc02",
+        "wy" : "36491a29b86ea0e6124f4b72101f48230bdc1f5b36d2e6500c3ffd4ba9818b435046335a2da15a89bc51117204d330832abc0f7b09a59d82bbb01d71762d8df5"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000434308c7d6eaa1bd7d8edc02fc6277c5271ca847428ff210d6078ec968df4e8730e21bc7715a7ee85a7352802466c0ab23560929bab49296509937fe7cd6edc0236491a29b86ea0e6124f4b72101f48230bdc1f5b36d2e6500c3ffd4ba9818b435046335a2da15a89bc51117204d330832abc0f7b09a59d82bbb01d71762d8df5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAENDCMfW6qG9fY7cAvxid8UnHK\nhHQo/yENYHjslo306HMOIbx3Fafuhac1KAJGbAqyNWCSm6tJKWUJk3/nzW7cAjZJ\nGim4bqDmEk9LchAfSCML3B9bNtLmUAw//UupgYtDUEYzWi2hWom8URFyBNMwgyq8\nD3sJpZ2Cu7AdcXYtjfU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 352,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3051020d062522bbd3ecbe7c39e93e7c250240029c0de2216bab72af9ec823411e7ee444482bc268ae1ba9064e04019609757d95b2e0c5a3fde377a87fcd38b32f8061bd3dc81cbbdb96ca626e6582ba61dc31",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0478d35a1c8a83997300a02eb477916e7095b001bfc47341528f75c6cebefd2d59c5d5efaeae9c5bd8ad4bdbad76da1cbcd3547a95d392dff53ce85bc4e4b23ff94bb3427e6074138fc0e438320a314e20367137133b4fee63d80ecfb5931666b0873dcd456a36994edfda75b0f3ea81732277e77adc43a481ff0f0ed4d2f37ff0",
+        "wx" : "78d35a1c8a83997300a02eb477916e7095b001bfc47341528f75c6cebefd2d59c5d5efaeae9c5bd8ad4bdbad76da1cbcd3547a95d392dff53ce85bc4e4b23ff9",
+        "wy" : "4bb3427e6074138fc0e438320a314e20367137133b4fee63d80ecfb5931666b0873dcd456a36994edfda75b0f3ea81732277e77adc43a481ff0f0ed4d2f37ff0"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000478d35a1c8a83997300a02eb477916e7095b001bfc47341528f75c6cebefd2d59c5d5efaeae9c5bd8ad4bdbad76da1cbcd3547a95d392dff53ce85bc4e4b23ff94bb3427e6074138fc0e438320a314e20367137133b4fee63d80ecfb5931666b0873dcd456a36994edfda75b0f3ea81732277e77adc43a481ff0f0ed4d2f37ff0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEeNNaHIqDmXMAoC60d5FucJWw\nAb/Ec0FSj3XGzr79LVnF1e+urpxb2K1L26122hy801R6ldOS3/U86FvE5LI/+Uuz\nQn5gdBOPwOQ4MgoxTiA2cTcTO0/uY9gOz7WTFmawhz3NRWo2mU7f2nWw8+qBcyJ3\n53rcQ6SB/w8O1NLzf/A=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 353,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "313233343030",
+          "sig" : "308185024100aadd9db8dbe9c48b3fd4e6ae33c9fc07cb308db3b3c9d20ed6639cca70330870553e5c414ca92619418661197fac10471db1d381085ddaddb58796829ca8ffe9024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049019be20f640ecb2b7c3311bcda870954938a780686c063fe0ab26f57ba60511ff3cee3286d8d90487eb8014788a1f134ed59a774fdb8b0d24770bf2301b2d1808fe934dc911d15c44e59b9026811e7cd8fdd874410d51a56f5aea137bfc4a8e85b7eba7528949cdabc4d33aef16157d14e3f5f68bde5de1c5196917a56dab29",
+        "wx" : "09019be20f640ecb2b7c3311bcda870954938a780686c063fe0ab26f57ba60511ff3cee3286d8d90487eb8014788a1f134ed59a774fdb8b0d24770bf2301b2d18",
+        "wy" : "08fe934dc911d15c44e59b9026811e7cd8fdd874410d51a56f5aea137bfc4a8e85b7eba7528949cdabc4d33aef16157d14e3f5f68bde5de1c5196917a56dab29"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200049019be20f640ecb2b7c3311bcda870954938a780686c063fe0ab26f57ba60511ff3cee3286d8d90487eb8014788a1f134ed59a774fdb8b0d24770bf2301b2d1808fe934dc911d15c44e59b9026811e7cd8fdd874410d51a56f5aea137bfc4a8e85b7eba7528949cdabc4d33aef16157d14e3f5f68bde5de1c5196917a56dab29",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEkBm+IPZA7LK3wzEbzahwlUk4\np4BobAY/4Ksm9XumBRH/PO4yhtjZBIfrgBR4ih8TTtWad0/biw0kdwvyMBstGAj+\nk03JEdFcROWbkCaBHnzY/dh0QQ1RpW9a6hN7/EqOhbfrp1KJSc2rxNM67xYVfRTj\n9faL3l3hxRlpF6Vtqyk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 354,
+          "comment" : "s == 1",
+          "msg" : "313233343030",
+          "sig" : "3045024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 355,
+          "comment" : "s == 0",
+          "msg" : "313233343030",
+          "sig" : "3045024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04417db8e95f89131457983e75379009905d2d8008b790519d65e650d3b60a32563c18c5afd06ca314bc3a17746087a578ce78cbb60cb599cf0dd9cff22acb84cf0b86f2e57ce298c85bc28f3d0274cf3140ea5fc6015f4b636fb271da09445e15adcb60ae1f6d001ad4e25e6d69767236cc16e725f5d7b2af449939017a8c8c85",
+        "wx" : "417db8e95f89131457983e75379009905d2d8008b790519d65e650d3b60a32563c18c5afd06ca314bc3a17746087a578ce78cbb60cb599cf0dd9cff22acb84cf",
+        "wy" : "0b86f2e57ce298c85bc28f3d0274cf3140ea5fc6015f4b636fb271da09445e15adcb60ae1f6d001ad4e25e6d69767236cc16e725f5d7b2af449939017a8c8c85"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004417db8e95f89131457983e75379009905d2d8008b790519d65e650d3b60a32563c18c5afd06ca314bc3a17746087a578ce78cbb60cb599cf0dd9cff22acb84cf0b86f2e57ce298c85bc28f3d0274cf3140ea5fc6015f4b636fb271da09445e15adcb60ae1f6d001ad4e25e6d69767236cc16e725f5d7b2af449939017a8c8c85",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEQX246V+JExRXmD51N5AJkF0t\ngAi3kFGdZeZQ07YKMlY8GMWv0GyjFLw6F3Rgh6V4znjLtgy1mc8N2c/yKsuEzwuG\n8uV84pjIW8KPPQJ0zzFA6l/GAV9LY2+ycdoJRF4Vrctgrh9tABrU4l5taXZyNswW\n5yX117KvRJk5AXqMjIU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 356,
+          "comment" : "point at infinity during verify",
+          "msg" : "313233343030",
+          "sig" : "3081840240556ecedc6df4e2459fea735719e4fe03e59846d9d9e4e9076b31ce65381984382a9f2e20a654930ca0c3308cbfd608238ed8e9c0842eed6edac3cb414e548034024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0438597c68eabfbe648bca0b3e8d235f9082cf15d694e14e686b1e0a89b73e3dbc346ebbde38da2c602fe975c21a1fbc8f363b592903d02d4434fae52ee8cc3b3a572b82084747ea5af0633936b570354365ee2d7fba4c404bd69458eb825007ed89067effec6b2e67c32d197e8c28ecfefa7ee79cea09d7eb248925c543c30ba5",
+        "wx" : "38597c68eabfbe648bca0b3e8d235f9082cf15d694e14e686b1e0a89b73e3dbc346ebbde38da2c602fe975c21a1fbc8f363b592903d02d4434fae52ee8cc3b3a",
+        "wy" : "572b82084747ea5af0633936b570354365ee2d7fba4c404bd69458eb825007ed89067effec6b2e67c32d197e8c28ecfefa7ee79cea09d7eb248925c543c30ba5"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000438597c68eabfbe648bca0b3e8d235f9082cf15d694e14e686b1e0a89b73e3dbc346ebbde38da2c602fe975c21a1fbc8f363b592903d02d4434fae52ee8cc3b3a572b82084747ea5af0633936b570354365ee2d7fba4c404bd69458eb825007ed89067effec6b2e67c32d197e8c28ecfefa7ee79cea09d7eb248925c543c30ba5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEOFl8aOq/vmSLygs+jSNfkILP\nFdaU4U5oax4Kibc+Pbw0brveONosYC/pdcIaH7yPNjtZKQPQLUQ0+uUu6Mw7Olcr\ngghHR+pa8GM5NrVwNUNl7i1/ukxAS9aUWOuCUAftiQZ+/+xrLmfDLRl+jCjs/vp+\n55zqCdfrJIklxUPDC6U=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 357,
+          "comment" : "u1 == 1",
+          "msg" : "313233343030",
+          "sig" : "308184024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578024043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049d60ec91976a8fc7f8422876ccb22870eca8d39b8cdfc30193e3bb22a10e37c537a092dbb0124c8c4b26655ad96127d3140bc1f9556ebabf477fd95951b4b0dd2bc1fcd7d6840fd83a5e982361c304a34ed10e873aa4637ecac29f555c0526b519c238ce0b002d7e2f98225dec884c95d742e86fa68ce6e81f6542fe81730cfb",
+        "wx" : "09d60ec91976a8fc7f8422876ccb22870eca8d39b8cdfc30193e3bb22a10e37c537a092dbb0124c8c4b26655ad96127d3140bc1f9556ebabf477fd95951b4b0dd",
+        "wy" : "2bc1fcd7d6840fd83a5e982361c304a34ed10e873aa4637ecac29f555c0526b519c238ce0b002d7e2f98225dec884c95d742e86fa68ce6e81f6542fe81730cfb"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200049d60ec91976a8fc7f8422876ccb22870eca8d39b8cdfc30193e3bb22a10e37c537a092dbb0124c8c4b26655ad96127d3140bc1f9556ebabf477fd95951b4b0dd2bc1fcd7d6840fd83a5e982361c304a34ed10e873aa4637ecac29f555c0526b519c238ce0b002d7e2f98225dec884c95d742e86fa68ce6e81f6542fe81730cfb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEnWDskZdqj8f4Qih2zLIocOyo\n05uM38MBk+O7IqEON8U3oJLbsBJMjEsmZVrZYSfTFAvB+VVuur9Hf9lZUbSw3SvB\n/NfWhA/YOl6YI2HDBKNO0Q6HOqRjfsrCn1VcBSa1GcI4zgsALX4vmCJd7IhMlddC\n6G+mjOboH2VC/oFzDPs=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 358,
+          "comment" : "u1 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "308184024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578024066e59cbcf0f0a0fee7256d52661cf74b816308a77a7c9e8c4130461a4d1205eedfc32b5fba90829c8425409283eab77c74fcf1d45571da5a372a026368794c9d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a911df350e95c0da4d56c3c44a84aad88ee85e628ccc44c5e131dfad8a3fc69eed9c620ed8c821c84de2c2113c1d6c10aaea5544903b1d59678d39b052e0f1b3a2c16d1e74ae6fd993b986234665eda14ff678e58c414ae55de8aa1eda26242d616b267e6fdb7491efb5a3c179b84903127070e5e2597d2f0b2af333b6349857",
+        "wx" : "0a911df350e95c0da4d56c3c44a84aad88ee85e628ccc44c5e131dfad8a3fc69eed9c620ed8c821c84de2c2113c1d6c10aaea5544903b1d59678d39b052e0f1b3",
+        "wy" : "0a2c16d1e74ae6fd993b986234665eda14ff678e58c414ae55de8aa1eda26242d616b267e6fdb7491efb5a3c179b84903127070e5e2597d2f0b2af333b6349857"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004a911df350e95c0da4d56c3c44a84aad88ee85e628ccc44c5e131dfad8a3fc69eed9c620ed8c821c84de2c2113c1d6c10aaea5544903b1d59678d39b052e0f1b3a2c16d1e74ae6fd993b986234665eda14ff678e58c414ae55de8aa1eda26242d616b267e6fdb7491efb5a3c179b84903127070e5e2597d2f0b2af333b6349857",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEqRHfNQ6VwNpNVsPESoSq2I7o\nXmKMzETF4THfrYo/xp7tnGIO2MghyE3iwhE8HWwQqupVRJA7HVlnjTmwUuDxs6LB\nbR50rm/Zk7mGI0Zl7aFP9njljEFK5V3oqh7aJiQtYWsmfm/bdJHvtaPBebhJAxJw\ncOXiWX0vCyrzM7Y0mFc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 359,
+          "comment" : "u2 == 1",
+          "msg" : "313233343030",
+          "sig" : "308184024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401823db8fd2ba4a34bacc4f64283909f4d01d02b8db66f9cb9bd77806b890ba31a6915b93dcbdd72c83338eb6029f22c31795712b1ac7a1fb81a304e3c58d8d54ec267bad3984a3e2fd87defbe863d73885872488bdda9d6e3da8ecf8eabfd4674d201278ffc63cbc1ffa0f99eb5e85c9b20ae10a226e1e5594ca78fc0d531d8",
+        "wx" : "1823db8fd2ba4a34bacc4f64283909f4d01d02b8db66f9cb9bd77806b890ba31a6915b93dcbdd72c83338eb6029f22c31795712b1ac7a1fb81a304e3c58d8d5",
+        "wy" : "4ec267bad3984a3e2fd87defbe863d73885872488bdda9d6e3da8ecf8eabfd4674d201278ffc63cbc1ffa0f99eb5e85c9b20ae10a226e1e5594ca78fc0d531d8"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000401823db8fd2ba4a34bacc4f64283909f4d01d02b8db66f9cb9bd77806b890ba31a6915b93dcbdd72c83338eb6029f22c31795712b1ac7a1fb81a304e3c58d8d54ec267bad3984a3e2fd87defbe863d73885872488bdda9d6e3da8ecf8eabfd4674d201278ffc63cbc1ffa0f99eb5e85c9b20ae10a226e1e5594ca78fc0d531d8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEAYI9uP0rpKNLrMT2QoOQn00B\n0CuNtm+cub13gGuJC6MaaRW5PcvdcsgzOOtgKfIsMXlXErGseh+4GjBOPFjY1U7C\nZ7rTmEo+L9h9776GPXOIWHJIi92p1uPajs+Oq/1GdNIBJ4/8Y8vB/6D5nrXoXJsg\nrhCiJuHlWUynj8DVMdg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 360,
+          "comment" : "u2 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "308184024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578024071e913d0929bd85cd53899c977dbfd5a8775b3cd22868c09e4426886f5775af58e2992d6331b6ebb810440bbaa72b584be768d00b03e91e923afb9ac6870aaf1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049fa44401db098e9f28579aaf02adff61faf1e6f7039cf1b3134b83dfba962b13a4397dcdd6feef4b64fc32eb3dfba3f596f5f75beabd3dade484089310b658228bb1897c75da51e56db19d8df13623754a0db9d6da5002ffc8a73be21b80eeecca35ec541e81831b3fec4cc3193dc5929f12c4c463a4107911bbb0f15ae390ef",
+        "wx" : "09fa44401db098e9f28579aaf02adff61faf1e6f7039cf1b3134b83dfba962b13a4397dcdd6feef4b64fc32eb3dfba3f596f5f75beabd3dade484089310b65822",
+        "wy" : "08bb1897c75da51e56db19d8df13623754a0db9d6da5002ffc8a73be21b80eeecca35ec541e81831b3fec4cc3193dc5929f12c4c463a4107911bbb0f15ae390ef"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200049fa44401db098e9f28579aaf02adff61faf1e6f7039cf1b3134b83dfba962b13a4397dcdd6feef4b64fc32eb3dfba3f596f5f75beabd3dade484089310b658228bb1897c75da51e56db19d8df13623754a0db9d6da5002ffc8a73be21b80eeecca35ec541e81831b3fec4cc3193dc5929f12c4c463a4107911bbb0f15ae390ef",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEn6REAdsJjp8oV5qvAq3/Yfrx\n5vcDnPGzE0uD37qWKxOkOX3N1v7vS2T8Mus9+6P1lvX3W+q9Pa3khAiTELZYIoux\niXx12lHlbbGdjfE2I3VKDbnW2lAC/8inO+IbgO7syjXsVB6Bgxs/7EzDGT3Fkp8S\nxMRjpBB5Ebuw8VrjkO8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 361,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02404f9c8a3c424ba2b2882c200355d25596b1aa063ff9b2573079325128dbc6ae5098e88460f4eb4331ffa2808ad3cf2305eccce70f3e6df3cb114c638b459d9167",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040fe7f7ca44453560e1ba38b34ec8dfbc745edefc58878255452f614fee561a8a620b4d8624e159bd483db08c9a62100fd2ea69ef7381f520abe651b2ea226eea156e75af465b22d226408314536d4238a739fd2f4003bac552ae34bfa27e9be460fe40a5468cedd3221048cd1b8d796bc27494565f88aaf7fccc4c0fc36b78b1",
+        "wx" : "0fe7f7ca44453560e1ba38b34ec8dfbc745edefc58878255452f614fee561a8a620b4d8624e159bd483db08c9a62100fd2ea69ef7381f520abe651b2ea226eea",
+        "wy" : "156e75af465b22d226408314536d4238a739fd2f4003bac552ae34bfa27e9be460fe40a5468cedd3221048cd1b8d796bc27494565f88aaf7fccc4c0fc36b78b1"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040fe7f7ca44453560e1ba38b34ec8dfbc745edefc58878255452f614fee561a8a620b4d8624e159bd483db08c9a62100fd2ea69ef7381f520abe651b2ea226eea156e75af465b22d226408314536d4238a739fd2f4003bac552ae34bfa27e9be460fe40a5468cedd3221048cd1b8d796bc27494565f88aaf7fccc4c0fc36b78b1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAED+f3ykRFNWDhujizTsjfvHRe\n3vxYh4JVRS9hT+5WGopiC02GJOFZvUg9sIyaYhAP0upp73OB9SCr5lGy6iJu6hVu\nda9GWyLSJkCDFFNtQjinOf0vQAO6xVKuNL+ifpvkYP5ApUaM7dMiEEjNG415a8J0\nlFZfiKr3/MxMD8NreLE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 362,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02402820c603534f430db8e49727244a316acd6ea30733070dc4fdd24e2211dded80597a9cb6bd866f37b255057ab771925eb439293319a9a2c12dc0b7cb1dbf4fa7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0499e5c3ad1ef53ad780c3c4d90c27cc1986496a215b25829a88de200a9c2146aec8f182dc6dec6611c7ffda1a55b0ccb2045b1ed5c9231b9eb3cb232417e2fcfa35e8b3f604f5d793d135ce06e23fc6ac82c0997de9e3f4d2dc3636ba0b521c785776dbc8d48da5d59a86fb3e90fb00bccb017d25100be8e35db1dfb5b44967ef",
+        "wx" : "099e5c3ad1ef53ad780c3c4d90c27cc1986496a215b25829a88de200a9c2146aec8f182dc6dec6611c7ffda1a55b0ccb2045b1ed5c9231b9eb3cb232417e2fcfa",
+        "wy" : "35e8b3f604f5d793d135ce06e23fc6ac82c0997de9e3f4d2dc3636ba0b521c785776dbc8d48da5d59a86fb3e90fb00bccb017d25100be8e35db1dfb5b44967ef"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000499e5c3ad1ef53ad780c3c4d90c27cc1986496a215b25829a88de200a9c2146aec8f182dc6dec6611c7ffda1a55b0ccb2045b1ed5c9231b9eb3cb232417e2fcfa35e8b3f604f5d793d135ce06e23fc6ac82c0997de9e3f4d2dc3636ba0b521c785776dbc8d48da5d59a86fb3e90fb00bccb017d25100be8e35db1dfb5b44967ef",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEmeXDrR71OteAw8TZDCfMGYZJ\naiFbJYKaiN4gCpwhRq7I8YLcbexmEcf/2hpVsMyyBFse1ckjG56zyyMkF+L8+jXo\ns/YE9deT0TXOBuI/xqyCwJl96eP00tw2NroLUhx4V3bbyNSNpdWahvs+kPsAvMsB\nfSUQC+jjXbHftbRJZ+8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 363,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02406e5d2dd1e3d278ebc6f73409651ebc46b65c6c3efe1165b74b5164356783251e3bb666804faa7bf389b5ff285b66b912c51c478c58cd2dbe5293d95735ab9436",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04423fc7aa8d6d77fae60bebce7757e15689426cbabd2c3fa6ff71da7765ab887a93c93cb8e1008892c0d8f1e03e48555c81dfc433d42f4890b71177b848aab9cc1ff6abd7c7f953de797480e292b987ddf47570d88dc5e51c7a47c357d71978190931976f55cc84c3a4cd4635ed5ba4920efa8219c7aa1685bf1a9bc7129fa2cb",
+        "wx" : "423fc7aa8d6d77fae60bebce7757e15689426cbabd2c3fa6ff71da7765ab887a93c93cb8e1008892c0d8f1e03e48555c81dfc433d42f4890b71177b848aab9cc",
+        "wy" : "1ff6abd7c7f953de797480e292b987ddf47570d88dc5e51c7a47c357d71978190931976f55cc84c3a4cd4635ed5ba4920efa8219c7aa1685bf1a9bc7129fa2cb"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004423fc7aa8d6d77fae60bebce7757e15689426cbabd2c3fa6ff71da7765ab887a93c93cb8e1008892c0d8f1e03e48555c81dfc433d42f4890b71177b848aab9cc1ff6abd7c7f953de797480e292b987ddf47570d88dc5e51c7a47c357d71978190931976f55cc84c3a4cd4635ed5ba4920efa8219c7aa1685bf1a9bc7129fa2cb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEQj/Hqo1td/rmC+vOd1fhVolC\nbLq9LD+m/3Had2WriHqTyTy44QCIksDY8eA+SFVcgd/EM9QvSJC3EXe4SKq5zB/2\nq9fH+VPeeXSA4pK5h930dXDYjcXlHHpHw1fXGXgZCTGXb1XMhMOkzUY17Vukkg76\nghnHqhaFvxqbxxKfoss=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 364,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02402bd0ea22df17e2f0854094002df56a63da80713274b5192327b1d86c256437bd10f7a21e1c7480836dea40f56ee9b5810c68f2a06e728a802d01b5a514db6914",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04415e9d50af5da71189607811680dc16d3da9a0e339a53d166b9b226806a6ffdae01eb40295cf5e00f47ddf0b4afa6729a8f7d18a437d157df4d99c19181ef524907efdc15b338664e911b62f9ac015d9e36bb7be0cccdf330517d52970dab18848bce0bfdfc0bd39c675753666036e4c4c5eb0c62321b22bd1cb1fa352670fbc",
+        "wx" : "415e9d50af5da71189607811680dc16d3da9a0e339a53d166b9b226806a6ffdae01eb40295cf5e00f47ddf0b4afa6729a8f7d18a437d157df4d99c19181ef524",
+        "wy" : "0907efdc15b338664e911b62f9ac015d9e36bb7be0cccdf330517d52970dab18848bce0bfdfc0bd39c675753666036e4c4c5eb0c62321b22bd1cb1fa352670fbc"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004415e9d50af5da71189607811680dc16d3da9a0e339a53d166b9b226806a6ffdae01eb40295cf5e00f47ddf0b4afa6729a8f7d18a437d157df4d99c19181ef524907efdc15b338664e911b62f9ac015d9e36bb7be0cccdf330517d52970dab18848bce0bfdfc0bd39c675753666036e4c4c5eb0c62321b22bd1cb1fa352670fbc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEQV6dUK9dpxGJYHgRaA3BbT2p\noOM5pT0Wa5siaAam/9rgHrQClc9eAPR93wtK+mcpqPfRikN9FX302ZwZGB71JJB+\n/cFbM4Zk6RG2L5rAFdnja7e+DMzfMwUX1Slw2rGISLzgv9/AvTnGdXU2ZgNuTExe\nsMYjIbIr0csfo1JnD7w=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 365,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02403da945bb815ee5303a05dc5eec3285b0a1edf43be7caa19fc8f5ac06122b3451d85b7df2da41f347e2e51458f39d4d16c3cc87aad7b451758d3afd9729659156",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042c65b61fa1f4d3c86c829d15d4de5b47c5b789f53a4355661f09eef3b97b21a3b93fae0f035bf347a315594785059b37ccf8062a391ace30e69a984d8417ca2c341a8019653ad617da57c9997c2debfaf340a6780bd8371aee2c668b7dcc70fe06789b8f36f8f13f40822f0401102e03742c8ffaa1dcf0baf981c7ecc1a7e278",
+        "wx" : "2c65b61fa1f4d3c86c829d15d4de5b47c5b789f53a4355661f09eef3b97b21a3b93fae0f035bf347a315594785059b37ccf8062a391ace30e69a984d8417ca2c",
+        "wy" : "341a8019653ad617da57c9997c2debfaf340a6780bd8371aee2c668b7dcc70fe06789b8f36f8f13f40822f0401102e03742c8ffaa1dcf0baf981c7ecc1a7e278"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042c65b61fa1f4d3c86c829d15d4de5b47c5b789f53a4355661f09eef3b97b21a3b93fae0f035bf347a315594785059b37ccf8062a391ace30e69a984d8417ca2c341a8019653ad617da57c9997c2debfaf340a6780bd8371aee2c668b7dcc70fe06789b8f36f8f13f40822f0401102e03742c8ffaa1dcf0baf981c7ecc1a7e278",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAELGW2H6H008hsgp0V1N5bR8W3\nifU6Q1VmHwnu87l7IaO5P64PA1vzR6MVWUeFBZs3zPgGKjkazjDmmphNhBfKLDQa\ngBllOtYX2lfJmXwt6/rzQKZ4C9g3Gu4sZot9zHD+Bnibjzb48T9Agi8EARAuA3Qs\nj/qh3PC6+YHH7MGn4ng=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 366,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02407b528b7702bdca60740bb8bdd8650b6143dbe877cf95433f91eb580c245668a3b0b6fbe5b483e68fc5ca28b1e73a9a2d87990f55af68a2eb1a75fb2e52cb22ac",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046a8222da632550f85a0d59fa8e8f327e16274b6397d5a42aa1bf6f1a1b5cedd3a1182dd0f22fca690c5ef5a261e6e5d8bae34f2e1ae294b50a287c882574ee7c82d86218782338757b9bab359e63516ce3dbf5e7fdbd5baa4ae99713fe5dd85bb61ea12a178cfb50a25eef41a085dcd5e5b88f148badf4c8f4031e03d49aec6b",
+        "wx" : "6a8222da632550f85a0d59fa8e8f327e16274b6397d5a42aa1bf6f1a1b5cedd3a1182dd0f22fca690c5ef5a261e6e5d8bae34f2e1ae294b50a287c882574ee7c",
+        "wy" : "082d86218782338757b9bab359e63516ce3dbf5e7fdbd5baa4ae99713fe5dd85bb61ea12a178cfb50a25eef41a085dcd5e5b88f148badf4c8f4031e03d49aec6b"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200046a8222da632550f85a0d59fa8e8f327e16274b6397d5a42aa1bf6f1a1b5cedd3a1182dd0f22fca690c5ef5a261e6e5d8bae34f2e1ae294b50a287c882574ee7c82d86218782338757b9bab359e63516ce3dbf5e7fdbd5baa4ae99713fe5dd85bb61ea12a178cfb50a25eef41a085dcd5e5b88f148badf4c8f4031e03d49aec6b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEaoIi2mMlUPhaDVn6jo8yfhYn\nS2OX1aQqob9vGhtc7dOhGC3Q8i/KaQxe9aJh5uXYuuNPLhrilLUKKHyIJXTufILY\nYhh4Izh1e5urNZ5jUWzj2/Xn/b1bqkrplxP+Xdhbth6hKheM+1CiXu9BoIXc1eW4\njxSLrfTI9AMeA9Sa7Gs=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 367,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02402d17048ee57e45b66057acfab9c3b2a4939e81b1eb0f8972a8c2b5aa6b04c15584894e168e15dc5cf889fa09f7934d1084def351042c2b97cde3c100b894bad3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04aa17b5bd2bbfce1ae133e2479fe1f87e64e6165897ee457391bc2daee9fd7686b8d4bec8ecfa8a5693f39b4ef9b4163cdbc5c4546fadba0cfe3e1532ea2aadd473fa93039717f9dfd49a9c2884dc2d1012d71d6054ea0f391685bde5e8c0d5d611b40bd1fbe35dc5bd7e916ddc9a66ba54ae8949776f2f21d4cf54b2f6c757c5",
+        "wx" : "0aa17b5bd2bbfce1ae133e2479fe1f87e64e6165897ee457391bc2daee9fd7686b8d4bec8ecfa8a5693f39b4ef9b4163cdbc5c4546fadba0cfe3e1532ea2aadd4",
+        "wy" : "73fa93039717f9dfd49a9c2884dc2d1012d71d6054ea0f391685bde5e8c0d5d611b40bd1fbe35dc5bd7e916ddc9a66ba54ae8949776f2f21d4cf54b2f6c757c5"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aa17b5bd2bbfce1ae133e2479fe1f87e64e6165897ee457391bc2daee9fd7686b8d4bec8ecfa8a5693f39b4ef9b4163cdbc5c4546fadba0cfe3e1532ea2aadd473fa93039717f9dfd49a9c2884dc2d1012d71d6054ea0f391685bde5e8c0d5d611b40bd1fbe35dc5bd7e916ddc9a66ba54ae8949776f2f21d4cf54b2f6c757c5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEqhe1vSu/zhrhM+JHn+H4fmTm\nFliX7kVzkbwtrun9doa41L7I7PqKVpPzm075tBY828XEVG+tugz+PhUy6iqt1HP6\nkwOXF/nf1JqcKITcLRAS1x1gVOoPORaFveXowNXWEbQL0fvjXcW9fpFt3JpmulSu\niUl3by8h1M9UsvbHV8U=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 368,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02402b18986d87bd21cdcbf0f13103794735979354290c43aa8c298dbd473de5a389cb55f00c2184a235f6b7347305926c0e25785eca6d98eb2bd921562164f365f0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a72de8d4d2896f9bc6d72a68f8b2588fa2ecb4992e8e3616fd58a1a12f0327db1fc3740ed384022078156fe66712bf092cabbc43659cddc9cf3dbf807bcf36358819319aef0e23b142e75d9c4c139812e55e1c419d96084a68b950356c46eb2357512f208bb1dbe970d1900c8dfda77d2f477760db63d228dbf8b342265bcbde",
+        "wx" : "0a72de8d4d2896f9bc6d72a68f8b2588fa2ecb4992e8e3616fd58a1a12f0327db1fc3740ed384022078156fe66712bf092cabbc43659cddc9cf3dbf807bcf3635",
+        "wy" : "08819319aef0e23b142e75d9c4c139812e55e1c419d96084a68b950356c46eb2357512f208bb1dbe970d1900c8dfda77d2f477760db63d228dbf8b342265bcbde"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004a72de8d4d2896f9bc6d72a68f8b2588fa2ecb4992e8e3616fd58a1a12f0327db1fc3740ed384022078156fe66712bf092cabbc43659cddc9cf3dbf807bcf36358819319aef0e23b142e75d9c4c139812e55e1c419d96084a68b950356c46eb2357512f208bb1dbe970d1900c8dfda77d2f477760db63d228dbf8b342265bcbde",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEpy3o1NKJb5vG1ypo+LJYj6Ls\ntJkujjYW/VihoS8DJ9sfw3QO04QCIHgVb+ZnEr8JLKu8Q2Wc3cnPPb+Ae882NYgZ\nMZrvDiOxQuddnEwTmBLlXhxBnZYISmi5UDVsRusjV1EvIIux2+lw0ZAMjf2nfS9H\nd2DbY9Io2/izQiZby94=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 369,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0240445f8caaf2093f6882bc6c7af537ebacbf8620f0b6ac68a19a5de1935225cc949c24365504222938c56982b824bbee59253f4a866485149ec4c5b5ec9ad74ec3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0437d8519f0c7492ff443bad34cbd54eee9ba120e41fbb9fd604cdd6d41b762bf2bba392d4f4646978730f6556662b99768dcb2754c180c0fbd8ad707636d8f8b143b17d728ffeac454019530d2bb0f69a58535a2e8e609ff69596d53d11a00e6f650d49d9a5f211204b4e5a421c757f8e1738955df96bad5bfdd71e155a932d1f",
+        "wx" : "37d8519f0c7492ff443bad34cbd54eee9ba120e41fbb9fd604cdd6d41b762bf2bba392d4f4646978730f6556662b99768dcb2754c180c0fbd8ad707636d8f8b1",
+        "wy" : "43b17d728ffeac454019530d2bb0f69a58535a2e8e609ff69596d53d11a00e6f650d49d9a5f211204b4e5a421c757f8e1738955df96bad5bfdd71e155a932d1f"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000437d8519f0c7492ff443bad34cbd54eee9ba120e41fbb9fd604cdd6d41b762bf2bba392d4f4646978730f6556662b99768dcb2754c180c0fbd8ad707636d8f8b143b17d728ffeac454019530d2bb0f69a58535a2e8e609ff69596d53d11a00e6f650d49d9a5f211204b4e5a421c757f8e1738955df96bad5bfdd71e155a932d1f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEN9hRnwx0kv9EO600y9VO7puh\nIOQfu5/WBM3W1Bt2K/K7o5LU9GRpeHMPZVZmK5l2jcsnVMGAwPvYrXB2Ntj4sUOx\nfXKP/qxFQBlTDSuw9ppYU1oujmCf9pWW1T0RoA5vZQ1J2aXyESBLTlpCHHV/jhc4\nlV35a61b/dceFVqTLR8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 370,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02402da089be4ccf10ec5bd463556efbd3388cc343b9dd0bbd6f2e98a5d0ca362d0fde2aebf02bdef173a0f1f04755ee76a098727638e4f7f389521d997bab85b781",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042afb786d246b43a53df6841d04d4c7705357939697714ed4681dc595188191877a46f3c6bbc63170406e0c6db7dd6789a644738f7d0acb7c9e5959c01e39e97520327e6e5c925198b74af0beb51a83ea662efbc3f85bba8924046b97dacb0717d6b7f422d8426625ea7f6b4ce865dfab264ba5247b4dad3e2ca5614bff4c0d5f",
+        "wx" : "2afb786d246b43a53df6841d04d4c7705357939697714ed4681dc595188191877a46f3c6bbc63170406e0c6db7dd6789a644738f7d0acb7c9e5959c01e39e975",
+        "wy" : "20327e6e5c925198b74af0beb51a83ea662efbc3f85bba8924046b97dacb0717d6b7f422d8426625ea7f6b4ce865dfab264ba5247b4dad3e2ca5614bff4c0d5f"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042afb786d246b43a53df6841d04d4c7705357939697714ed4681dc595188191877a46f3c6bbc63170406e0c6db7dd6789a644738f7d0acb7c9e5959c01e39e97520327e6e5c925198b74af0beb51a83ea662efbc3f85bba8924046b97dacb0717d6b7f422d8426625ea7f6b4ce865dfab264ba5247b4dad3e2ca5614bff4c0d5f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEKvt4bSRrQ6U99oQdBNTHcFNX\nk5aXcU7UaB3FlRiBkYd6RvPGu8YxcEBuDG233WeJpkRzj30Ky3yeWVnAHjnpdSAy\nfm5cklGYt0rwvrUag+pmLvvD+Fu6iSQEa5faywcX1rf0IthCZiXqf2tM6GXfqyZL\npSR7Ta0+LKVhS/9MDV8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 371,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02405b41137c999e21d8b7a8c6aaddf7a67119868773ba177ade5d314ba1946c5a1fbc55d7e057bde2e741e3e08eabdced4130e4ec71c9efe712a43b32f7570b6f02",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041b419aa39d3e3125ae705f77885c3b11387bc422fadbba7eb0a66ac14ae26c0f978333dce64e4fe0d3bdbc6d52adcee3b51493a26d21376bef764e0628dfbb1273ee3ef2eae04a27e798323d50e0f4fefbc43fc4613677311da858f83e5d9b3b9e41af6c5582908a3ef2948e4b5dc8c5b8a590b3ceda18e4c4cc05ddc268dcfe",
+        "wx" : "1b419aa39d3e3125ae705f77885c3b11387bc422fadbba7eb0a66ac14ae26c0f978333dce64e4fe0d3bdbc6d52adcee3b51493a26d21376bef764e0628dfbb12",
+        "wy" : "73ee3ef2eae04a27e798323d50e0f4fefbc43fc4613677311da858f83e5d9b3b9e41af6c5582908a3ef2948e4b5dc8c5b8a590b3ceda18e4c4cc05ddc268dcfe"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200041b419aa39d3e3125ae705f77885c3b11387bc422fadbba7eb0a66ac14ae26c0f978333dce64e4fe0d3bdbc6d52adcee3b51493a26d21376bef764e0628dfbb1273ee3ef2eae04a27e798323d50e0f4fefbc43fc4613677311da858f83e5d9b3b9e41af6c5582908a3ef2948e4b5dc8c5b8a590b3ceda18e4c4cc05ddc268dcfe",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEG0Gao50+MSWucF93iFw7ETh7\nxCL627p+sKZqwUribA+XgzPc5k5P4NO9vG1Src7jtRSTom0hN2vvdk4GKN+7EnPu\nPvLq4Eon55gyPVDg9P77xD/EYTZ3MR2oWPg+XZs7nkGvbFWCkIo+8pSOS13Ixbil\nkLPO2hjkxMwF3cJo3P4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 372,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "30818502407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02410088e19d3ae66d32c5137d2a004cf379a9a649cb2d9723384d8bc9f1725ea2872f9a80c3d0839cd45ae2d5d0d601cb63e1c95762aaaee7da9bf658cc7302912683",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04327a6e5e4ef2bec0631e13354094cca4df5bc4018a0572c00873543d98100ac09d76d27bd6e0bc2dc96bd8cbbe19aec0c141320ffd64aedba5c17a1be4bd296078dccc453c2aa7e92a7734823306c6c1ae3e52131edbfa5fddb719c8d5d00ba3d38baa8fb727bb941e21baff375503c27eed7046fa6d00c70ef136e01d36efd5",
+        "wx" : "327a6e5e4ef2bec0631e13354094cca4df5bc4018a0572c00873543d98100ac09d76d27bd6e0bc2dc96bd8cbbe19aec0c141320ffd64aedba5c17a1be4bd2960",
+        "wy" : "78dccc453c2aa7e92a7734823306c6c1ae3e52131edbfa5fddb719c8d5d00ba3d38baa8fb727bb941e21baff375503c27eed7046fa6d00c70ef136e01d36efd5"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004327a6e5e4ef2bec0631e13354094cca4df5bc4018a0572c00873543d98100ac09d76d27bd6e0bc2dc96bd8cbbe19aec0c141320ffd64aedba5c17a1be4bd296078dccc453c2aa7e92a7734823306c6c1ae3e52131edbfa5fddb719c8d5d00ba3d38baa8fb727bb941e21baff375503c27eed7046fa6d00c70ef136e01d36efd5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEMnpuXk7yvsBjHhM1QJTMpN9b\nxAGKBXLACHNUPZgQCsCddtJ71uC8Lclr2Mu+Ga7AwUEyD/1krtulwXob5L0pYHjc\nzEU8KqfpKnc0gjMGxsGuPlITHtv6X923GcjV0Auj04uqj7cnu5QeIbr/N1UDwn7t\ncEb6bQDHDvE24B0279U=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 373,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0240372e96e8f1e93c75e37b9a04b28f5e235b2e361f7f08b2dba5a8b21ab3c1928f1ddb334027d53df9c4daff942db35c89628e23c62c6696df2949ecab9ad5ca1b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049aa189b5b1e5b66641c7ec3fa7d0dbb6a72d874d18c7927cac8470a70969f35705bc73182abc10b5a16955889619bcba6ff310209473c3120e44a2e1bf9fc9c72e5de74749a05227509a2b3d0322a8f9020709cb8e5da67dfee28e96e0ab8a1c3208055d1f08f38fa1cc79c119ff704592a8eef58bf66204b81ad0b0abdd0390",
+        "wx" : "09aa189b5b1e5b66641c7ec3fa7d0dbb6a72d874d18c7927cac8470a70969f35705bc73182abc10b5a16955889619bcba6ff310209473c3120e44a2e1bf9fc9c7",
+        "wy" : "2e5de74749a05227509a2b3d0322a8f9020709cb8e5da67dfee28e96e0ab8a1c3208055d1f08f38fa1cc79c119ff704592a8eef58bf66204b81ad0b0abdd0390"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200049aa189b5b1e5b66641c7ec3fa7d0dbb6a72d874d18c7927cac8470a70969f35705bc73182abc10b5a16955889619bcba6ff310209473c3120e44a2e1bf9fc9c72e5de74749a05227509a2b3d0322a8f9020709cb8e5da67dfee28e96e0ab8a1c3208055d1f08f38fa1cc79c119ff704592a8eef58bf66204b81ad0b0abdd0390",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEmqGJtbHltmZBx+w/p9Dbtqct\nh00Yx5J8rIRwpwlp81cFvHMYKrwQtaFpVYiWGby6b/MQIJRzwxIORKLhv5/Jxy5d\n50dJoFInUJorPQMiqPkCBwnLjl2mff7ijpbgq4ocMggFXR8I84+hzHnBGf9wRZKo\n7vWL9mIEuBrQsKvdA5A=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 374,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02402aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04439a859d7aaf99f57205f210c93ab89c317bd2fa215e7903a67976d336d83b1bf9719067077420078f837514d607ae3981185dc7b02627b05ac66e491a2b94c54c3fa47a926dbd6945aca6d404f85f46e070d04e7dabf6fa9cb88c3428dd02fd01a9b190bb61dfb7b2439e42d0b689aef968356b011cf3054ab929c85777e652",
+        "wx" : "439a859d7aaf99f57205f210c93ab89c317bd2fa215e7903a67976d336d83b1bf9719067077420078f837514d607ae3981185dc7b02627b05ac66e491a2b94c5",
+        "wy" : "4c3fa47a926dbd6945aca6d404f85f46e070d04e7dabf6fa9cb88c3428dd02fd01a9b190bb61dfb7b2439e42d0b689aef968356b011cf3054ab929c85777e652"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004439a859d7aaf99f57205f210c93ab89c317bd2fa215e7903a67976d336d83b1bf9719067077420078f837514d607ae3981185dc7b02627b05ac66e491a2b94c54c3fa47a926dbd6945aca6d404f85f46e070d04e7dabf6fa9cb88c3428dd02fd01a9b190bb61dfb7b2439e42d0b689aef968356b011cf3054ab929c85777e652",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEQ5qFnXqvmfVyBfIQyTq4nDF7\n0vohXnkDpnl20zbYOxv5cZBnB3QgB4+DdRTWB645gRhdx7AmJ7Baxm5JGiuUxUw/\npHqSbb1pRaym1AT4X0bgcNBOfav2+py4jDQo3QL9AamxkLth37eyQ55C0LaJrvlo\nNWsBHPMFSrkpyFd35lI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 375,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb024048d7851b079f620209e8ba05eb24ee515964d37577c7c3ae309ab2bddd7eee7101899d0c6c780111bede61ed1215ec42399409d605eccc9aac4c9548f87770df",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0466fa158c51d3a9421cbb133799ab90a12387ec7875a2b354b8487673495bb1879ef1672f4928a2034095a02c7d083f27e0eac0a40b87d837f52e7648200c5666278037cd7e5e8bc6821027b21a2ca7ae9c694ae809966b79d441dcdc9d3b444f8793122f30956ae0a7aadfbe431a342dcd857095bd058a742ba58af18b1a519b",
+        "wx" : "66fa158c51d3a9421cbb133799ab90a12387ec7875a2b354b8487673495bb1879ef1672f4928a2034095a02c7d083f27e0eac0a40b87d837f52e7648200c5666",
+        "wy" : "278037cd7e5e8bc6821027b21a2ca7ae9c694ae809966b79d441dcdc9d3b444f8793122f30956ae0a7aadfbe431a342dcd857095bd058a742ba58af18b1a519b"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000466fa158c51d3a9421cbb133799ab90a12387ec7875a2b354b8487673495bb1879ef1672f4928a2034095a02c7d083f27e0eac0a40b87d837f52e7648200c5666278037cd7e5e8bc6821027b21a2ca7ae9c694ae809966b79d441dcdc9d3b444f8793122f30956ae0a7aadfbe431a342dcd857095bd058a742ba58af18b1a519b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEZvoVjFHTqUIcuxM3mauQoSOH\n7Hh1orNUuEh2c0lbsYee8WcvSSiiA0CVoCx9CD8n4OrApAuH2Df1LnZIIAxWZieA\nN81+XovGghAnshosp66caUroCZZredRB3NydO0RPh5MSLzCVauCnqt++Qxo0Lc2F\ncJW9BYp0K6WK8YsaUZs=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 376,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02400e6cf68d5be5138253de290ec41bde7dcf96065c280d0a09d9a4888d5de04dbea75038fc061b653340696c62baaea92d5747e50249034c427f2f813e2b98c24b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0429bdf2feb76740763f5098cfd5efaca5fa2b19654bd4e8d5d75978b90520e7483875bfbe2ac0e57adf90cc140af59821786724e5eab9111445a2de4b3768774c32ae3979b352dcfb0c72e8f6799ab76415428a9956ca5d2b14d74b9a1be189bcd3032f742ec94744c33a3cdca10dff4d5b07929660d6e78729ada6e5be9ae101",
+        "wx" : "29bdf2feb76740763f5098cfd5efaca5fa2b19654bd4e8d5d75978b90520e7483875bfbe2ac0e57adf90cc140af59821786724e5eab9111445a2de4b3768774c",
+        "wy" : "32ae3979b352dcfb0c72e8f6799ab76415428a9956ca5d2b14d74b9a1be189bcd3032f742ec94744c33a3cdca10dff4d5b07929660d6e78729ada6e5be9ae101"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000429bdf2feb76740763f5098cfd5efaca5fa2b19654bd4e8d5d75978b90520e7483875bfbe2ac0e57adf90cc140af59821786724e5eab9111445a2de4b3768774c32ae3979b352dcfb0c72e8f6799ab76415428a9956ca5d2b14d74b9a1be189bcd3032f742ec94744c33a3cdca10dff4d5b07929660d6e78729ada6e5be9ae101",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEKb3y/rdnQHY/UJjP1e+spfor\nGWVL1OjV11l4uQUg50g4db++KsDlet+QzBQK9ZgheGck5eq5ERRFot5LN2h3TDKu\nOXmzUtz7DHLo9nmat2QVQoqZVspdKxTXS5ob4Ym80wMvdC7JR0TDOjzcoQ3/TVsH\nkpZg1ueHKa2m5b6a4QE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 377,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb024041b2af78294165d86f751cb82a80327a0eb4c0544a06d4a5719aea4a098f115973aff4c1a8cec2dcf0f5f0fa24190b474a25b9ab3baef7770f68ba9c7ef7f7ca",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0480af1bb9dfce00963799e01aecbf8bf5a659b6bbfa4689f0674a6115bcdf996d155d9a75c5295141e2cc3e611b32c589e6ae76aef190dc8a363ba9f9c3cc5727038cd95bcd34420e63ae435afed09f70e4ebc3501b42f35ebbecd8b0a165c61616090b118ef05a43c31f3b710907c745264b1f537c28596a403c25195e87545e",
+        "wx" : "080af1bb9dfce00963799e01aecbf8bf5a659b6bbfa4689f0674a6115bcdf996d155d9a75c5295141e2cc3e611b32c589e6ae76aef190dc8a363ba9f9c3cc5727",
+        "wy" : "38cd95bcd34420e63ae435afed09f70e4ebc3501b42f35ebbecd8b0a165c61616090b118ef05a43c31f3b710907c745264b1f537c28596a403c25195e87545e"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000480af1bb9dfce00963799e01aecbf8bf5a659b6bbfa4689f0674a6115bcdf996d155d9a75c5295141e2cc3e611b32c589e6ae76aef190dc8a363ba9f9c3cc5727038cd95bcd34420e63ae435afed09f70e4ebc3501b42f35ebbecd8b0a165c61616090b118ef05a43c31f3b710907c745264b1f537c28596a403c25195e87545e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEgK8bud/OAJY3meAa7L+L9aZZ\ntrv6RonwZ0phFbzfmW0VXZp1xSlRQeLMPmEbMsWJ5q52rvGQ3Io2O6n5w8xXJwOM\n2VvNNEIOY65DWv7Qn3Dk68NQG0LzXrvs2LChZcYWFgkLEY7wWkPDHztxCQfHRSZL\nH1N8KFlqQDwlGV6HVF4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 378,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "30818502407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0241009c5fc3fbf70f16ccdac92f95974408ffff7e05bd0268cfdf862e9beb174fb48ee1e0e10f942d8fc67ed69f7a94c85f61c84048617e67c1cc6c0260e048641a6a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046eeb4735286c2c094dda29710a774eccdb6ca5fa8991f9adbc769b448d3899943c860e3fb50cff34825adaee82aab5a533adaf74fbfe7e8b032e2642fa5fc86f5ef74aa61a26823bc2ed70f08b64a6906db981564d5e0c15a076a582da8fee20b773ef591f9054da34d90a1f1317294610a81d3e0f1adce4f6d2fd6ba4b93501",
+        "wx" : "6eeb4735286c2c094dda29710a774eccdb6ca5fa8991f9adbc769b448d3899943c860e3fb50cff34825adaee82aab5a533adaf74fbfe7e8b032e2642fa5fc86f",
+        "wy" : "5ef74aa61a26823bc2ed70f08b64a6906db981564d5e0c15a076a582da8fee20b773ef591f9054da34d90a1f1317294610a81d3e0f1adce4f6d2fd6ba4b93501"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200046eeb4735286c2c094dda29710a774eccdb6ca5fa8991f9adbc769b448d3899943c860e3fb50cff34825adaee82aab5a533adaf74fbfe7e8b032e2642fa5fc86f5ef74aa61a26823bc2ed70f08b64a6906db981564d5e0c15a076a582da8fee20b773ef591f9054da34d90a1f1317294610a81d3e0f1adce4f6d2fd6ba4b93501",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEbutHNShsLAlN2ilxCndOzNts\npfqJkfmtvHabRI04mZQ8hg4/tQz/NIJa2u6CqrWlM62vdPv+fosDLiZC+l/Ib173\nSqYaJoI7wu1w8ItkppBtuYFWTV4MFaB2pYLaj+4gt3PvWR+QVNo02QofExcpRhCo\nHT4PGtzk9tL9a6S5NQE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 379,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "30818502407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0241008de1ea3f1234690e75bd787cfabe15f833cb7dc65107cdb035f99b0bbe6c60ad6e8365dddbb1f973bc26dddba9e4ae7c72cebd41f471a8bb227d2b3df41f346b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04938841937550134c5a4bade19a5021c73cffc774fdca875413a7d541e65145fb77dad4a7c7eb3a966c184d73cdcf3f1bea984ad25dd4fb7f47239faa5b539f6d3275cde53c18f3bb537a7f06c7ea1b4f355025919002bae9a3a3c1dcf150c1b53bc8dfe53f60cc785e44051c95b735552ba622897d5bf7556fd7b9e38b6531be",
+        "wx" : "0938841937550134c5a4bade19a5021c73cffc774fdca875413a7d541e65145fb77dad4a7c7eb3a966c184d73cdcf3f1bea984ad25dd4fb7f47239faa5b539f6d",
+        "wy" : "3275cde53c18f3bb537a7f06c7ea1b4f355025919002bae9a3a3c1dcf150c1b53bc8dfe53f60cc785e44051c95b735552ba622897d5bf7556fd7b9e38b6531be"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004938841937550134c5a4bade19a5021c73cffc774fdca875413a7d541e65145fb77dad4a7c7eb3a966c184d73cdcf3f1bea984ad25dd4fb7f47239faa5b539f6d3275cde53c18f3bb537a7f06c7ea1b4f355025919002bae9a3a3c1dcf150c1b53bc8dfe53f60cc785e44051c95b735552ba622897d5bf7556fd7b9e38b6531be",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEk4hBk3VQE0xaS63hmlAhxzz/\nx3T9yodUE6fVQeZRRft32tSnx+s6lmwYTXPNzz8b6phK0l3U+39HI5+qW1OfbTJ1\nzeU8GPO7U3p/BsfqG081UCWRkAK66aOjwdzxUMG1O8jf5T9gzHheRAUclbc1VSum\nIol9W/dVb9e544tlMb4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 380,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0240326a7e59c4bcf9ba52235a8e06d244557acf66885b64f9238cddb3be327b6205758b60f3203418cbe5b330e28a9d7a360edfb8ddf39d46340d5c2792824b7c6d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0478fbd1e762019602ff7187cf06a886d2ed2cb5d06481b06c3c4be4f7f3746cd0151d57f4d6aebd6048895cabfe9500adf3daec59ffa6ee9621c8b584ed6dad1a6f3c2070e01421a1ebb969607d44f76778748bcb559a8b5eed83b04760ab53556b0039e8765ab85a92950c10ca6bbdcc9d6e2f03d88b6d7bbdcd53c8b1ff86cc",
+        "wx" : "78fbd1e762019602ff7187cf06a886d2ed2cb5d06481b06c3c4be4f7f3746cd0151d57f4d6aebd6048895cabfe9500adf3daec59ffa6ee9621c8b584ed6dad1a",
+        "wy" : "6f3c2070e01421a1ebb969607d44f76778748bcb559a8b5eed83b04760ab53556b0039e8765ab85a92950c10ca6bbdcc9d6e2f03d88b6d7bbdcd53c8b1ff86cc"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000478fbd1e762019602ff7187cf06a886d2ed2cb5d06481b06c3c4be4f7f3746cd0151d57f4d6aebd6048895cabfe9500adf3daec59ffa6ee9621c8b584ed6dad1a6f3c2070e01421a1ebb969607d44f76778748bcb559a8b5eed83b04760ab53556b0039e8765ab85a92950c10ca6bbdcc9d6e2f03d88b6d7bbdcd53c8b1ff86cc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEePvR52IBlgL/cYfPBqiG0u0s\ntdBkgbBsPEvk9/N0bNAVHVf01q69YEiJXKv+lQCt89rsWf+m7pYhyLWE7W2tGm88\nIHDgFCGh67lpYH1E92d4dIvLVZqLXu2DsEdgq1NVawA56HZauFqSlQwQymu9zJ1u\nLwPYi217vc1TyLH/hsw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 381,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02403c5d08339f2f6f97a2b86b83296678f7bff61e1b7487cda14f3b12fce6aeafa3f2fb385aea3e82f312a6880efd18a1d77fd7faafaf9d1ecc5ee9c2c0f71d10d9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044c9ada2fa2acf8d01fba2b015f7badc322785c85f2199b6c4ac490da8e1ec973387f4abe26d526a056dc7195fb1c9c0ca7612cb65f15f106380d8c5dece529f32172c8b9b3b6fb0bbe9f2273d9a218bd512479dd27605b2a6e8b44f58d176178390c2bdd1ccf60c1e823a23e8b0fce7dab2f197913b1fe30f699e3bf366bf1bf",
+        "wx" : "4c9ada2fa2acf8d01fba2b015f7badc322785c85f2199b6c4ac490da8e1ec973387f4abe26d526a056dc7195fb1c9c0ca7612cb65f15f106380d8c5dece529f3",
+        "wy" : "2172c8b9b3b6fb0bbe9f2273d9a218bd512479dd27605b2a6e8b44f58d176178390c2bdd1ccf60c1e823a23e8b0fce7dab2f197913b1fe30f699e3bf366bf1bf"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200044c9ada2fa2acf8d01fba2b015f7badc322785c85f2199b6c4ac490da8e1ec973387f4abe26d526a056dc7195fb1c9c0ca7612cb65f15f106380d8c5dece529f32172c8b9b3b6fb0bbe9f2273d9a218bd512479dd27605b2a6e8b44f58d176178390c2bdd1ccf60c1e823a23e8b0fce7dab2f197913b1fe30f699e3bf366bf1bf",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAETJraL6Ks+NAfuisBX3utwyJ4\nXIXyGZtsSsSQ2o4eyXM4f0q+JtUmoFbccZX7HJwMp2Estl8V8QY4DYxd7OUp8yFy\nyLmztvsLvp8ic9miGL1RJHndJ2BbKm6LRPWNF2F4OQwr3RzPYMHoI6I+iw/Ofasv\nGXkTsf4w9pnjvzZr8b8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 382,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "30818502407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0241009584a4bdf0c6c8ca72211f589dcdd7be181accb926f2430dc7135abbfa7887d606030c85c72f5a3c05fcc7e0d1fb33afc0251fd33ea04b3b96470bc26ce612ab",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04854cf9601010be20633f5d17214cab687dab3aa54a38a02c55ed003615ec8efada2ac0d62d923d0e1df9aa382d512706cadf5539858a62a5ec62fd8248e632776a783303285206018cbb9fc1e98cdf94ac6f2fecbdc7d8428ff485e59b00b2bfa45a06aaa93e6b51b7ad1b8ac0dbe135455d8d2875231357060990abcde563de",
+        "wx" : "0854cf9601010be20633f5d17214cab687dab3aa54a38a02c55ed003615ec8efada2ac0d62d923d0e1df9aa382d512706cadf5539858a62a5ec62fd8248e63277",
+        "wy" : "6a783303285206018cbb9fc1e98cdf94ac6f2fecbdc7d8428ff485e59b00b2bfa45a06aaa93e6b51b7ad1b8ac0dbe135455d8d2875231357060990abcde563de"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004854cf9601010be20633f5d17214cab687dab3aa54a38a02c55ed003615ec8efada2ac0d62d923d0e1df9aa382d512706cadf5539858a62a5ec62fd8248e632776a783303285206018cbb9fc1e98cdf94ac6f2fecbdc7d8428ff485e59b00b2bfa45a06aaa93e6b51b7ad1b8ac0dbe135455d8d2875231357060990abcde563de",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEhUz5YBAQviBjP10XIUyraH2r\nOqVKOKAsVe0ANhXsjvraKsDWLZI9Dh35qjgtUScGyt9VOYWKYqXsYv2CSOYyd2p4\nMwMoUgYBjLufwemM35Ssby/svcfYQo/0heWbALK/pFoGqqk+a1G3rRuKwNvhNUVd\njSh1IxNXBgmQq83lY94=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 383,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb024040197987189f8cf04a951e01c48fa8ae9042f184848f93b215dc790fe2c42ee2d549d8cb50ff3db74b6ddb376a80b2ce3983946b2ed99819856e75ebf8ff2ae0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045e3de509f7585c0f6d05c387a6d07a061c9f98c6adc8b3c36efbdefcbff2e6ad4678960524d116154f5b17332204e3a1867082d2e518504f433e2726ad58e9d7a0b32e9d3c523bac3c1ccdd75f82b909a8306c74be899f13228abf87db76b9115c0b293d7d30f3c86230461b28a45a6cc88b8fe079143103c5b01016ba95bcd5",
+        "wx" : "5e3de509f7585c0f6d05c387a6d07a061c9f98c6adc8b3c36efbdefcbff2e6ad4678960524d116154f5b17332204e3a1867082d2e518504f433e2726ad58e9d7",
+        "wy" : "0a0b32e9d3c523bac3c1ccdd75f82b909a8306c74be899f13228abf87db76b9115c0b293d7d30f3c86230461b28a45a6cc88b8fe079143103c5b01016ba95bcd5"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200045e3de509f7585c0f6d05c387a6d07a061c9f98c6adc8b3c36efbdefcbff2e6ad4678960524d116154f5b17332204e3a1867082d2e518504f433e2726ad58e9d7a0b32e9d3c523bac3c1ccdd75f82b909a8306c74be899f13228abf87db76b9115c0b293d7d30f3c86230461b28a45a6cc88b8fe079143103c5b01016ba95bcd5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEXj3lCfdYXA9tBcOHptB6Bhyf\nmMatyLPDbvve/L/y5q1GeJYFJNEWFU9bFzMiBOOhhnCC0uUYUE9DPicmrVjp16Cz\nLp08UjusPBzN11+CuQmoMGx0vomfEyKKv4fbdrkRXAspPX0w88hiMEYbKKRabMiL\nj+B5FDEDxbAQFrqVvNU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 384,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "30818502407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0241008032f30e313f19e0952a3c03891f515d2085e309091f27642bb8f21fc5885dc5aa93b196a1fe7b6e96dbb66ed501659c730728d65db330330adcebd7f1fe55c0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0415d2ffcd4617eb1b400610cba8d738c76c8e15ad72b34e576772ae19cd8345294644d13ac62a293788de2a92dd547c2ac3a98aba72952d3ea2d491d7eea5b9cba3ec2c79a2cf7ba0083933b2c534fd4b51587c4ebc3cbaaa28d92b95e3c8e90142effac27bbab215ac0b39d1c5f332feb779351a66c294e4ed62f5cd3229a923",
+        "wx" : "15d2ffcd4617eb1b400610cba8d738c76c8e15ad72b34e576772ae19cd8345294644d13ac62a293788de2a92dd547c2ac3a98aba72952d3ea2d491d7eea5b9cb",
+        "wy" : "0a3ec2c79a2cf7ba0083933b2c534fd4b51587c4ebc3cbaaa28d92b95e3c8e90142effac27bbab215ac0b39d1c5f332feb779351a66c294e4ed62f5cd3229a923"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000415d2ffcd4617eb1b400610cba8d738c76c8e15ad72b34e576772ae19cd8345294644d13ac62a293788de2a92dd547c2ac3a98aba72952d3ea2d491d7eea5b9cba3ec2c79a2cf7ba0083933b2c534fd4b51587c4ebc3cbaaa28d92b95e3c8e90142effac27bbab215ac0b39d1c5f332feb779351a66c294e4ed62f5cd3229a923",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEFdL/zUYX6xtABhDLqNc4x2yO\nFa1ys05XZ3KuGc2DRSlGRNE6xiopN4jeKpLdVHwqw6mKunKVLT6i1JHX7qW5y6Ps\nLHmiz3ugCDkzssU0/UtRWHxOvDy6qijZK5XjyOkBQu/6wnu6shWsCznRxfMy/rd5\nNRpmwpTk7WL1zTIpqSM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 385,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb0240156ecedc6df4e2459fea735719e4fe03e59846d9d9e4e9076b31ce65381984382a9f2e20a654930ca0c3308cbfd608238ed8e9c0842eed6edac3cb414e548037",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04974df3e7a61283830e544ba9023479cb8d7559524df76fb38d23c55d29923e72ec5cb48717fab859f2f3111585bbee004595c5fed64411fbbf9f6351bf5f69e84e1fdd691b30b0b4c2590a881ce458053349356da747cd93ba931eee6ae88cae827007105c3b1633a48e1c9db5272ac01145aee6132ba73af83d6e6c4106b290",
+        "wx" : "0974df3e7a61283830e544ba9023479cb8d7559524df76fb38d23c55d29923e72ec5cb48717fab859f2f3111585bbee004595c5fed64411fbbf9f6351bf5f69e8",
+        "wy" : "4e1fdd691b30b0b4c2590a881ce458053349356da747cd93ba931eee6ae88cae827007105c3b1633a48e1c9db5272ac01145aee6132ba73af83d6e6c4106b290"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004974df3e7a61283830e544ba9023479cb8d7559524df76fb38d23c55d29923e72ec5cb48717fab859f2f3111585bbee004595c5fed64411fbbf9f6351bf5f69e84e1fdd691b30b0b4c2590a881ce458053349356da747cd93ba931eee6ae88cae827007105c3b1633a48e1c9db5272ac01145aee6132ba73af83d6e6c4106b290",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEl03z56YSg4MOVEupAjR5y411\nWVJN92+zjSPFXSmSPnLsXLSHF/q4WfLzERWFu+4ARZXF/tZEEfu/n2NRv19p6E4f\n3WkbMLC0wlkKiBzkWAUzSTVtp0fNk7qTHu5q6IyugnAHEFw7FjOkjhydtScqwBFF\nruYTK6c6+D1ubEEGspA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 386,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "30818402407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb02405ca54a231be76c06c9d987de7bf2ed42cd634a07edeb6e0c580412abe709ab177e474a9ea96245a640f7e6be1d2d5cba3a7cdc41a8b093901a5b8be06420e15a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042cb7364ccec9148a3242eee17ce01d82a56d037cb01746fdd24b893f35e072827ce463adafca6282d93cf666a740ee88adbef241f17955d2bf5f9f95958a38a696da5643e5fe057f1c3b931e36d33f0e2f5fba680932a35987b79855b6c1f0ead64cbe9c72959ece2184ee65a768410df1dad81c4dba853340a2396abf82e36a",
+        "wx" : "2cb7364ccec9148a3242eee17ce01d82a56d037cb01746fdd24b893f35e072827ce463adafca6282d93cf666a740ee88adbef241f17955d2bf5f9f95958a38a6",
+        "wy" : "096da5643e5fe057f1c3b931e36d33f0e2f5fba680932a35987b79855b6c1f0ead64cbe9c72959ece2184ee65a768410df1dad81c4dba853340a2396abf82e36a"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042cb7364ccec9148a3242eee17ce01d82a56d037cb01746fdd24b893f35e072827ce463adafca6282d93cf666a740ee88adbef241f17955d2bf5f9f95958a38a696da5643e5fe057f1c3b931e36d33f0e2f5fba680932a35987b79855b6c1f0ead64cbe9c72959ece2184ee65a768410df1dad81c4dba853340a2396abf82e36a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAELLc2TM7JFIoyQu7hfOAdgqVt\nA3ywF0b90kuJPzXgcoJ85GOtr8pigtk89manQO6Irb7yQfF5VdK/X5+VlYo4ppba\nVkPl/gV/HDuTHjbTPw4vX7poCTKjWYe3mFW2wfDq1ky+nHKVns4hhO5lp2hBDfHa\n2BxNuoUzQKI5ar+C42o=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 387,
+          "comment" : "point duplication during verification",
+          "msg" : "313233343030",
+          "sig" : "30818402401b8e8440bd94752dc603159728a346872cad48dfff819f181f9d53537a80868bff1280acfd2397a846d3259049352bc11f5fb739410c766d1344cbcbc03bf761024021610740799a83a13b49aa45dd854d85b058bd955a4105d749cba74b8f2a38cf7c33ed56921d029e7493894ad3d8f28f4431dceb89cd56316de93dc09777ca10",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042cb7364ccec9148a3242eee17ce01d82a56d037cb01746fdd24b893f35e072827ce463adafca6282d93cf666a740ee88adbef241f17955d2bf5f9f95958a38a614034774f5ebbf0c2399538ffcf6bcf99bd0d34baa972eb54eac0474b9711786a700dc642930c9748d48b2c53f3b3fd836a72712dfc84151e80826eb98b76589",
+        "wx" : "2cb7364ccec9148a3242eee17ce01d82a56d037cb01746fdd24b893f35e072827ce463adafca6282d93cf666a740ee88adbef241f17955d2bf5f9f95958a38a6",
+        "wy" : "14034774f5ebbf0c2399538ffcf6bcf99bd0d34baa972eb54eac0474b9711786a700dc642930c9748d48b2c53f3b3fd836a72712dfc84151e80826eb98b76589"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042cb7364ccec9148a3242eee17ce01d82a56d037cb01746fdd24b893f35e072827ce463adafca6282d93cf666a740ee88adbef241f17955d2bf5f9f95958a38a614034774f5ebbf0c2399538ffcf6bcf99bd0d34baa972eb54eac0474b9711786a700dc642930c9748d48b2c53f3b3fd836a72712dfc84151e80826eb98b76589",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAELLc2TM7JFIoyQu7hfOAdgqVt\nA3ywF0b90kuJPzXgcoJ85GOtr8pigtk89manQO6Irb7yQfF5VdK/X5+VlYo4phQD\nR3T1678MI5lTj/z2vPmb0NNLqpcutU6sBHS5cReGpwDcZCkwyXSNSLLFPzs/2Dan\nJxLfyEFR6Agm65i3ZYk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 388,
+          "comment" : "duplication bug",
+          "msg" : "313233343030",
+          "sig" : "30818402401b8e8440bd94752dc603159728a346872cad48dfff819f181f9d53537a80868bff1280acfd2397a846d3259049352bc11f5fb739410c766d1344cbcbc03bf761024021610740799a83a13b49aa45dd854d85b058bd955a4105d749cba74b8f2a38cf7c33ed56921d029e7493894ad3d8f28f4431dceb89cd56316de93dc09777ca10",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04063d566fa93ee219482ec947e7be4694f9c073b2bb786db849e1f3973c5122394cf68edd9947b58e61fe42c98d3640844ed2775b0c36b5f4c0c9605d028bc0c507521b29889632bb0756fec98e8e956cb7ac515a3fc9082b871861548e9702786f591e9a222391014725167a6c22aaf8c2c4be9425248b4d5f94f31cbd8bd352",
+        "wx" : "63d566fa93ee219482ec947e7be4694f9c073b2bb786db849e1f3973c5122394cf68edd9947b58e61fe42c98d3640844ed2775b0c36b5f4c0c9605d028bc0c5",
+        "wy" : "7521b29889632bb0756fec98e8e956cb7ac515a3fc9082b871861548e9702786f591e9a222391014725167a6c22aaf8c2c4be9425248b4d5f94f31cbd8bd352"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004063d566fa93ee219482ec947e7be4694f9c073b2bb786db849e1f3973c5122394cf68edd9947b58e61fe42c98d3640844ed2775b0c36b5f4c0c9605d028bc0c507521b29889632bb0756fec98e8e956cb7ac515a3fc9082b871861548e9702786f591e9a222391014725167a6c22aaf8c2c4be9425248b4d5f94f31cbd8bd352",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEBj1Wb6k+4hlILslH575GlPnA\nc7K7eG24SeHzlzxRIjlM9o7dmUe1jmH+QsmNNkCETtJ3Www2tfTAyWBdAovAxQdS\nGymIljK7B1b+yY6OlWy3rFFaP8kIK4cYYVSOlwJ4b1kemiIjkQFHJRZ6bCKq+MLE\nvpQlJItNX5TzHL2L01I=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 389,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "313233343030",
+          "sig" : "308184024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd6343855780240222c52be9261f41bd990faefa3f53267f5701c5723f52a02f7ad85c216709b49aaa6127375bb6e050d1ae0384cbc03416c56c3e69b45f892bde7eae6ec21cce1",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0413b9a0273b3b283cc8a25aaaf2a8508a745db022e7f4ddc06acdf06eb7770fd95ba68b047b030419aec366bd187eb840a43df7d9439419e2639614d5b4eb22d23ba9a5c0301708dc50ab9e4ad4ed48ad0f701cf387f210e57b6d06fb69cd58dfb0685f89d9ed1a319f00151d9082663046cc27101b692ca22a6b3e083dd0ff7f",
+        "wx" : "13b9a0273b3b283cc8a25aaaf2a8508a745db022e7f4ddc06acdf06eb7770fd95ba68b047b030419aec366bd187eb840a43df7d9439419e2639614d5b4eb22d2",
+        "wy" : "3ba9a5c0301708dc50ab9e4ad4ed48ad0f701cf387f210e57b6d06fb69cd58dfb0685f89d9ed1a319f00151d9082663046cc27101b692ca22a6b3e083dd0ff7f"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000413b9a0273b3b283cc8a25aaaf2a8508a745db022e7f4ddc06acdf06eb7770fd95ba68b047b030419aec366bd187eb840a43df7d9439419e2639614d5b4eb22d23ba9a5c0301708dc50ab9e4ad4ed48ad0f701cf387f210e57b6d06fb69cd58dfb0685f89d9ed1a319f00151d9082663046cc27101b692ca22a6b3e083dd0ff7f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEE7mgJzs7KDzIolqq8qhQinRd\nsCLn9N3Aas3wbrd3D9lbposEewMEGa7DZr0YfrhApD332UOUGeJjlhTVtOsi0jup\npcAwFwjcUKueStTtSK0PcBzzh/IQ5XttBvtpzVjfsGhfidntGjGfABUdkIJmMEbM\nJxAbaSyiKms+CD3Q/38=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 390,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "3081850241009f4945f680edf9800a63285758f399b3d18d8141b8a18064a30d3035f4cb6581957877f3a8f0f72597116e702915a4f4f698f404089a4cc5080447def02f4850024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0445d4d4ad6b3aaf94b6d739a072f31b1e744f13876304ea11113fe8123a155e1a921be46cde2f2412e02a0fa5c1865db8a6dbd44eeac165b0f7fa73c04783802d1cb951cc65c9056480695bc467dca577964cee048a14c81716ce9558b450981cf3a0f0059d581b076afb69efe0a505357b8060e02d6b9f13a031a1dae5f1ce3c",
+        "wx" : "45d4d4ad6b3aaf94b6d739a072f31b1e744f13876304ea11113fe8123a155e1a921be46cde2f2412e02a0fa5c1865db8a6dbd44eeac165b0f7fa73c04783802d",
+        "wy" : "1cb951cc65c9056480695bc467dca577964cee048a14c81716ce9558b450981cf3a0f0059d581b076afb69efe0a505357b8060e02d6b9f13a031a1dae5f1ce3c"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000445d4d4ad6b3aaf94b6d739a072f31b1e744f13876304ea11113fe8123a155e1a921be46cde2f2412e02a0fa5c1865db8a6dbd44eeac165b0f7fa73c04783802d1cb951cc65c9056480695bc467dca577964cee048a14c81716ce9558b450981cf3a0f0059d581b076afb69efe0a505357b8060e02d6b9f13a031a1dae5f1ce3c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAERdTUrWs6r5S21zmgcvMbHnRP\nE4djBOoRET/oEjoVXhqSG+Rs3i8kEuAqD6XBhl24ptvUTurBZbD3+nPAR4OALRy5\nUcxlyQVkgGlbxGfcpXeWTO4EihTIFxbOlVi0UJgc86DwBZ1YGwdq+2nv4KUFNXuA\nYOAta58ToDGh2uXxzjw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 391,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3081850241009f4945f680edf9800a63285758f399b3d18d8141b8a18064a30d3035f4cb6581957877f3a8f0f72597116e702915a4f4f698f404089a4cc5080447def02f485002407a0c02f1c1a6fa1a522a5ba1006bb4059122ae5bc9902853bdb4ddb52b922a996175af9c5b543fc8e5a920c9120d3032cc114dee73b0c0e781a9fdcb022f9294",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049060430c4439c352cbc08cd0906f91464ce37a7974de996525758628b9d3580540afe9be74ba1050d03acbb0ac29e60aca9b96295a6b5e49707410257fb7639d59f888ad8a62becde0661defeee48135d36167f9e8580f2714bcd5b67ec70ae3deae5d80b1e9d10c13f21ce7c59c79ac2cf705aee890adf434f29aa841a05b0f",
+        "wx" : "09060430c4439c352cbc08cd0906f91464ce37a7974de996525758628b9d3580540afe9be74ba1050d03acbb0ac29e60aca9b96295a6b5e49707410257fb7639d",
+        "wy" : "59f888ad8a62becde0661defeee48135d36167f9e8580f2714bcd5b67ec70ae3deae5d80b1e9d10c13f21ce7c59c79ac2cf705aee890adf434f29aa841a05b0f"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200049060430c4439c352cbc08cd0906f91464ce37a7974de996525758628b9d3580540afe9be74ba1050d03acbb0ac29e60aca9b96295a6b5e49707410257fb7639d59f888ad8a62becde0661defeee48135d36167f9e8580f2714bcd5b67ec70ae3deae5d80b1e9d10c13f21ce7c59c79ac2cf705aee890adf434f29aa841a05b0f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEkGBDDEQ5w1LLwIzQkG+RRkzj\nenl03pllJXWGKLnTWAVAr+m+dLoQUNA6y7CsKeYKypuWKVprXklwdBAlf7djnVn4\niK2KYr7N4GYd7+7kgTXTYWf56FgPJxS81bZ+xwrj3q5dgLHp0QwT8hznxZx5rCz3\nBa7okK30NPKaqEGgWw8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 392,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3081860241009f4945f680edf9800a63285758f399b3d18d8141b8a18064a30d3035f4cb6581957877f3a8f0f72597116e702915a4f4f698f404089a4cc5080447def02f485002410088b14afa4987d06f6643ebbe8fd4c99fd5c0715c8fd4a80bdeb6170859c26d26aa9849cdd6edb814346b80e132f00d05b15b0f9a6d17e24af79fab9bb0873387",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047326137c699e6b1d2bf313c04c34b86e63293d7e2054e47187ef843fb42674f65b7e0136ecdaf8e411c6e2dbbf5ac5007401743ec7244e7dac0379516bb92f3992e546d01c1655cf68549391d8582035ee471e58f433ea89f38f8cc1edc1928225b3f5a376e015cee6ae9e1eaae609be2e69537e596b06b77e4b6b7482fab60b",
+        "wx" : "7326137c699e6b1d2bf313c04c34b86e63293d7e2054e47187ef843fb42674f65b7e0136ecdaf8e411c6e2dbbf5ac5007401743ec7244e7dac0379516bb92f39",
+        "wy" : "092e546d01c1655cf68549391d8582035ee471e58f433ea89f38f8cc1edc1928225b3f5a376e015cee6ae9e1eaae609be2e69537e596b06b77e4b6b7482fab60b"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200047326137c699e6b1d2bf313c04c34b86e63293d7e2054e47187ef843fb42674f65b7e0136ecdaf8e411c6e2dbbf5ac5007401743ec7244e7dac0379516bb92f3992e546d01c1655cf68549391d8582035ee471e58f433ea89f38f8cc1edc1928225b3f5a376e015cee6ae9e1eaae609be2e69537e596b06b77e4b6b7482fab60b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEcyYTfGmeax0r8xPATDS4bmMp\nPX4gVORxh++EP7QmdPZbfgE27Nr45BHG4tu/WsUAdAF0PsckTn2sA3lRa7kvOZLl\nRtAcFlXPaFSTkdhYIDXuRx5Y9DPqifOPjMHtwZKCJbP1o3bgFc7mrp4equYJvi5p\nU35Zawa3fktrdIL6tgs=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 393,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3081850241009f4945f680edf9800a63285758f399b3d18d8141b8a18064a30d3035f4cb6581957877f3a8f0f72597116e702915a4f4f698f404089a4cc5080447def02f48500240222c52be9261f41bd990faefa3f53267f5701c5723f52a02f7ad85c216709b49aaa6127375bb6e050d1ae0384cbc03416c56c3e69b45f892bde7eae6ec21cce2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0456bd4e3ca322f65c29b611f79f3f950f21638e026fccf673b08cffc73cc39495ced5b88e26419ebde75c85fdff1460947ef7afe99aca5878b1af79688181e32369e646bb9d01a10cc4931259dc8f597d95e85ebd56729098cfab1443165e558f053698b0bb4f44222ea245ac4c21717eb22aaff650a329eee24203841c59d13f",
+        "wx" : "56bd4e3ca322f65c29b611f79f3f950f21638e026fccf673b08cffc73cc39495ced5b88e26419ebde75c85fdff1460947ef7afe99aca5878b1af79688181e323",
+        "wy" : "69e646bb9d01a10cc4931259dc8f597d95e85ebd56729098cfab1443165e558f053698b0bb4f44222ea245ac4c21717eb22aaff650a329eee24203841c59d13f"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000456bd4e3ca322f65c29b611f79f3f950f21638e026fccf673b08cffc73cc39495ced5b88e26419ebde75c85fdff1460947ef7afe99aca5878b1af79688181e32369e646bb9d01a10cc4931259dc8f597d95e85ebd56729098cfab1443165e558f053698b0bb4f44222ea245ac4c21717eb22aaff650a329eee24203841c59d13f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEVr1OPKMi9lwpthH3nz+VDyFj\njgJvzPZzsIz/xzzDlJXO1biOJkGevedchf3/FGCUfvev6ZrKWHixr3logYHjI2nm\nRrudAaEMxJMSWdyPWX2V6F69VnKQmM+rFEMWXlWPBTaYsLtPRCIuokWsTCFxfrIq\nr/ZQoynu4kIDhBxZ0T8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 394,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3081850241009f4945f680edf9800a63285758f399b3d18d8141b8a18064a30d3035f4cb6581957877f3a8f0f72597116e702915a4f4f698f404089a4cc5080447def02f4850024030d19ac71a42ca70edaa8b0d335e48023a0ddf57ea39a9bb18aebf1544a0ddd6f3c8aca4f154e6505bdd40506d9ee01451a0859294ad19f633dd98b79a796dd5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04688d0f394acb16119e0b29b56e780f295a24dcba1615a23e59e67b1dc9549bff8791a62130d4b0d8d75739f06dfc08cf6b5cb1e31a63bc72b1fad6f058b1cd599f9446ae8a7f41bdfbac1ddbcdd6e6490193260dcdada072079cbf139b666cf5934f11abf572a33e7f1235cdf70820a5475d14eced67ad6a4a8578f9b6e4093c",
+        "wx" : "688d0f394acb16119e0b29b56e780f295a24dcba1615a23e59e67b1dc9549bff8791a62130d4b0d8d75739f06dfc08cf6b5cb1e31a63bc72b1fad6f058b1cd59",
+        "wy" : "09f9446ae8a7f41bdfbac1ddbcdd6e6490193260dcdada072079cbf139b666cf5934f11abf572a33e7f1235cdf70820a5475d14eced67ad6a4a8578f9b6e4093c"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004688d0f394acb16119e0b29b56e780f295a24dcba1615a23e59e67b1dc9549bff8791a62130d4b0d8d75739f06dfc08cf6b5cb1e31a63bc72b1fad6f058b1cd599f9446ae8a7f41bdfbac1ddbcdd6e6490193260dcdada072079cbf139b666cf5934f11abf572a33e7f1235cdf70820a5475d14eced67ad6a4a8578f9b6e4093c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEaI0POUrLFhGeCym1bngPKVok\n3LoWFaI+WeZ7HclUm/+HkaYhMNSw2NdXOfBt/AjPa1yx4xpjvHKx+tbwWLHNWZ+U\nRq6Kf0G9+6wd283W5kkBkyYNza2gcgecvxObZmz1k08Rq/Vyoz5/EjXN9wggpUdd\nFOztZ61qSoV4+bbkCTw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 395,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "3081850241009f4945f680edf9800a63285758f399b3d18d8141b8a18064a30d3035f4cb6581957877f3a8f0f72597116e702915a4f4f698f404089a4cc5080447def02f4850024010b989002855ffafbd8c23a661f3b93ccfff4fbe84a23d1a6c4aff4405bdb94c3f860224e205032fdc9a1dc80c7d6b21409f9632e0fb540021ccc42161b70f1c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0483672d9b61f73f1a0b2e066bc3d009749d28d4e584a1afea28dcffd78b6b2d659dbb0c5cf7bed61f3b03c3c129e31d4b49ca8da3813cf25b6f025d84ee82d561379be7f5c837fd23e0acd749167549e8703dbad3bc7add9d3a9ff01abd34b55342f532428d95cc1f0c9bae7f458d9411919a2816009658224218851b0f8d5720",
+        "wx" : "083672d9b61f73f1a0b2e066bc3d009749d28d4e584a1afea28dcffd78b6b2d659dbb0c5cf7bed61f3b03c3c129e31d4b49ca8da3813cf25b6f025d84ee82d561",
+        "wy" : "379be7f5c837fd23e0acd749167549e8703dbad3bc7add9d3a9ff01abd34b55342f532428d95cc1f0c9bae7f458d9411919a2816009658224218851b0f8d5720"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000483672d9b61f73f1a0b2e066bc3d009749d28d4e584a1afea28dcffd78b6b2d659dbb0c5cf7bed61f3b03c3c129e31d4b49ca8da3813cf25b6f025d84ee82d561379be7f5c837fd23e0acd749167549e8703dbad3bc7add9d3a9ff01abd34b55342f532428d95cc1f0c9bae7f458d9411919a2816009658224218851b0f8d5720",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEg2ctm2H3PxoLLgZrw9AJdJ0o\n1OWEoa/qKNz/14trLWWduwxc977WHzsDw8Ep4x1LScqNo4E88ltvAl2E7oLVYTeb\n5/XIN/0j4KzXSRZ1SehwPbrTvHrdnTqf8Bq9NLVTQvUyQo2VzB8Mm65/RY2UEZGa\nKBYAllgiQhiFGw+NVyA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 396,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "30818502410081aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822024038f489e8494dec2e6a9c4ce4bbedfead43bad9e691434604f22134437abbad7ac714c96b198db75dc082205dd5395ac25f3b4680581f48f491d7dcd634385578",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047386a10991c1475c6c53f05867e69a35219bc5cad4405c960322843a56bb07bbaa317d20a0bc98786ab7b4c0cf6deadf093bb07d5bd563c0d56b380f880e7ad19819e9e897c76405dafbe1d785b3bff2e6e48770ada1f452ec2b4a347bdaba7b6d7122002d5f6ec4cabc585b4ef830e52c624641fe038297805ef0b7e8e82bdd",
+        "wx" : "7386a10991c1475c6c53f05867e69a35219bc5cad4405c960322843a56bb07bbaa317d20a0bc98786ab7b4c0cf6deadf093bb07d5bd563c0d56b380f880e7ad1",
+        "wy" : "09819e9e897c76405dafbe1d785b3bff2e6e48770ada1f452ec2b4a347bdaba7b6d7122002d5f6ec4cabc585b4ef830e52c624641fe038297805ef0b7e8e82bdd"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200047386a10991c1475c6c53f05867e69a35219bc5cad4405c960322843a56bb07bbaa317d20a0bc98786ab7b4c0cf6deadf093bb07d5bd563c0d56b380f880e7ad19819e9e897c76405dafbe1d785b3bff2e6e48770ada1f452ec2b4a347bdaba7b6d7122002d5f6ec4cabc585b4ef830e52c624641fe038297805ef0b7e8e82bdd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEc4ahCZHBR1xsU/BYZ+aaNSGb\nxcrUQFyWAyKEOla7B7uqMX0goLyYeGq3tMDPberfCTuwfVvVY8DVazgPiA560ZgZ\n6eiXx2QF2vvh14Wzv/Lm5IdwraH0UuwrSjR72rp7bXEiAC1fbsTKvFhbTvgw5Sxi\nRkH+A4KXgF7wt+joK90=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 397,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "30818502410081aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f82202407a0c02f1c1a6fa1a522a5ba1006bb4059122ae5bc9902853bdb4ddb52b922a996175af9c5b543fc8e5a920c9120d3032cc114dee73b0c0e781a9fdcb022f9294",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047d76f09db5fc7ed767dfad2af9af5470a43e062f21492499af5fc719f6be17881957ef476688fa3049b13d48c51f259e5d60434465d84445d359b89f66c88bac420661699273b23838827c69908978064b7c98f4195ad5e2ec709a036ead56e34a3e999e8c37ddea5b00490a011d9d116676e9022c124b3c0818bcc3488f78d3",
+        "wx" : "7d76f09db5fc7ed767dfad2af9af5470a43e062f21492499af5fc719f6be17881957ef476688fa3049b13d48c51f259e5d60434465d84445d359b89f66c88bac",
+        "wy" : "420661699273b23838827c69908978064b7c98f4195ad5e2ec709a036ead56e34a3e999e8c37ddea5b00490a011d9d116676e9022c124b3c0818bcc3488f78d3"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200047d76f09db5fc7ed767dfad2af9af5470a43e062f21492499af5fc719f6be17881957ef476688fa3049b13d48c51f259e5d60434465d84445d359b89f66c88bac420661699273b23838827c69908978064b7c98f4195ad5e2ec709a036ead56e34a3e999e8c37ddea5b00490a011d9d116676e9022c124b3c0818bcc3488f78d3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEfXbwnbX8ftdn360q+a9UcKQ+\nBi8hSSSZr1/HGfa+F4gZV+9HZoj6MEmxPUjFHyWeXWBDRGXYREXTWbifZsiLrEIG\nYWmSc7I4OIJ8aZCJeAZLfJj0GVrV4uxwmgNurVbjSj6Znow33epbAEkKAR2dEWZ2\n6QIsEks8CBi8w0iPeNM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 398,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "30818602410081aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f82202410088b14afa4987d06f6643ebbe8fd4c99fd5c0715c8fd4a80bdeb6170859c26d26aa9849cdd6edb814346b80e132f00d05b15b0f9a6d17e24af79fab9bb0873387",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042a3a7f8815983c9251df9220cb5f424f4d8eb9cfce3d96de725bbea6dbfefe226d789fef8533194787668b66f8fb640d135a25a30f5a25111ddcfc5c9c7eb22d9ba35f3054ac439e0f558ead8d0979a0fab046a47aa0339ef16c0e1d37e4d1d6f29fb7f674dd51ed57233409ac9e505e29d40378897194cf5fbc92595fd774be",
+        "wx" : "2a3a7f8815983c9251df9220cb5f424f4d8eb9cfce3d96de725bbea6dbfefe226d789fef8533194787668b66f8fb640d135a25a30f5a25111ddcfc5c9c7eb22d",
+        "wy" : "09ba35f3054ac439e0f558ead8d0979a0fab046a47aa0339ef16c0e1d37e4d1d6f29fb7f674dd51ed57233409ac9e505e29d40378897194cf5fbc92595fd774be"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200042a3a7f8815983c9251df9220cb5f424f4d8eb9cfce3d96de725bbea6dbfefe226d789fef8533194787668b66f8fb640d135a25a30f5a25111ddcfc5c9c7eb22d9ba35f3054ac439e0f558ead8d0979a0fab046a47aa0339ef16c0e1d37e4d1d6f29fb7f674dd51ed57233409ac9e505e29d40378897194cf5fbc92595fd774be",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEKjp/iBWYPJJR35Igy19CT02O\nuc/OPZbeclu+ptv+/iJteJ/vhTMZR4dmi2b4+2QNE1olow9aJREd3PxcnH6yLZuj\nXzBUrEOeD1WOrY0JeaD6sEakeqAznvFsDh035NHW8p+39nTdUe1XIzQJrJ5QXinU\nA3iJcZTPX7ySWV/XdL4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 399,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "30818502410081aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8220240222c52be9261f41bd990faefa3f53267f5701c5723f52a02f7ad85c216709b49aaa6127375bb6e050d1ae0384cbc03416c56c3e69b45f892bde7eae6ec21cce2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0403f498f2ea6e36b498ac66463a06708fb931ac59a2a1dfa6ebb4973cf01a06ceef58b344b85e89fc78351211f71fd1f11818f7ef96e296466b0d3b70c2da692064aa78285439f17d69a98cae8a1379bdac05ced930a18f44939bd91f8669a37fe8fb1e9ab1ead4db0b337ac594fd21d9e0d4325ab7ee07208f1c07601bb91320",
+        "wx" : "3f498f2ea6e36b498ac66463a06708fb931ac59a2a1dfa6ebb4973cf01a06ceef58b344b85e89fc78351211f71fd1f11818f7ef96e296466b0d3b70c2da6920",
+        "wy" : "64aa78285439f17d69a98cae8a1379bdac05ced930a18f44939bd91f8669a37fe8fb1e9ab1ead4db0b337ac594fd21d9e0d4325ab7ee07208f1c07601bb91320"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000403f498f2ea6e36b498ac66463a06708fb931ac59a2a1dfa6ebb4973cf01a06ceef58b344b85e89fc78351211f71fd1f11818f7ef96e296466b0d3b70c2da692064aa78285439f17d69a98cae8a1379bdac05ced930a18f44939bd91f8669a37fe8fb1e9ab1ead4db0b337ac594fd21d9e0d4325ab7ee07208f1c07601bb91320",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEA/SY8upuNrSYrGZGOgZwj7kx\nrFmiod+m67SXPPAaBs7vWLNEuF6J/Hg1EhH3H9HxGBj375bilkZrDTtwwtppIGSq\neChUOfF9aamMrooTeb2sBc7ZMKGPRJOb2R+GaaN/6PsemrHq1NsLM3rFlP0h2eDU\nMlq37gcgjxwHYBu5EyA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 400,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "30818502410081aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822024030d19ac71a42ca70edaa8b0d335e48023a0ddf57ea39a9bb18aebf1544a0ddd6f3c8aca4f154e6505bdd40506d9ee01451a0859294ad19f633dd98b79a796dd5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047bb5f9efbcc260b08120c7c4193566133322ce47e666047edfb462fbc310bb06503e8d62d0cf6055e271a8187be22dc5a1d6b09704a3b99065edb87b46c2ae32401f0040048f947fa02017bca61ab6d6353fc58807bba2f0a46521e20f2066824ec84bae1b545a414a296adee22315fd48573a7c5b3bd4c5398b27d7f2824f2c",
+        "wx" : "7bb5f9efbcc260b08120c7c4193566133322ce47e666047edfb462fbc310bb06503e8d62d0cf6055e271a8187be22dc5a1d6b09704a3b99065edb87b46c2ae32",
+        "wy" : "401f0040048f947fa02017bca61ab6d6353fc58807bba2f0a46521e20f2066824ec84bae1b545a414a296adee22315fd48573a7c5b3bd4c5398b27d7f2824f2c"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200047bb5f9efbcc260b08120c7c4193566133322ce47e666047edfb462fbc310bb06503e8d62d0cf6055e271a8187be22dc5a1d6b09704a3b99065edb87b46c2ae32401f0040048f947fa02017bca61ab6d6353fc58807bba2f0a46521e20f2066824ec84bae1b545a414a296adee22315fd48573a7c5b3bd4c5398b27d7f2824f2c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEe7X577zCYLCBIMfEGTVmEzMi\nzkfmZgR+37Ri+8MQuwZQPo1i0M9gVeJxqBh74i3FodawlwSjuZBl7bh7RsKuMkAf\nAEAEj5R/oCAXvKYattY1P8WIB7ui8KRlIeIPIGaCTshLrhtUWkFKKWre4iMV/UhX\nOnxbO9TFOYsn1/KCTyw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 401,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "30818502410081aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822024010b989002855ffafbd8c23a661f3b93ccfff4fbe84a23d1a6c4aff4405bdb94c3f860224e205032fdc9a1dc80c7d6b21409f9632e0fb540021ccc42161b70f1c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892",
+        "wx" : "081aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822",
+        "wy" : "7dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8227dde385d566332ecc0eabfa9cf7822fdf209f70024a57b1aa000c55b881f8111b2dcde494a5f485e5bca4bd88a2763aed1ca2b2fa8f0540678cd1e0f3ad80892",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEga7kvdgu2WRaITIunExqk4Xt\nn3C12RbBtDti7vTQCY7/Ox944tDUjVDRaHuTuX1ffG1QR0BqXmiLNSIJvLn4In3e\nOF1WYzLswOq/qc94Iv3yCfcAJKV7GqAAxVuIH4ERstzeSUpfSF5bykvYiidjrtHK\nKy+o8FQGeM0eDzrYCJI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 402,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "308184024043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc02401868cd638d21653876d5458699af24011d06efabf51cd4dd8c575f8aa2506eeb79e4565278aa73282deea02836cf700a28d042c94a568cfb19eecc5bcd3cb6ea",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 403,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "308184024066e59cbcf0f0a0fee7256d52661cf74b816308a77a7c9e8c4130461a4d1205eedfc32b5fba90829c8425409283eab77c74fcf1d45571da5a372a026368794c9d02401868cd638d21653876d5458699af24011d06efabf51cd4dd8c575f8aa2506eeb79e4565278aa73282deea02836cf700a28d042c94a568cfb19eecc5bcd3cb6ea",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8222cff655b8586919e7eea27046451d909d92696b38f2456f43662d76ee813875fca70bcb751671fe4530355525c7c1d3756b7d3ff8492727eafdd42471d624061",
+        "wx" : "081aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f822",
+        "wy" : "2cff655b8586919e7eea27046451d909d92696b38f2456f43662d76ee813875fca70bcb751671fe4530355525c7c1d3756b7d3ff8492727eafdd42471d624061"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000481aee4bdd82ed9645a21322e9c4c6a9385ed9f70b5d916c1b43b62eef4d0098eff3b1f78e2d0d48d50d1687b93b97d5f7c6d5047406a5e688b352209bcb9f8222cff655b8586919e7eea27046451d909d92696b38f2456f43662d76ee813875fca70bcb751671fe4530355525c7c1d3756b7d3ff8492727eafdd42471d624061",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEga7kvdgu2WRaITIunExqk4Xt\nn3C12RbBtDti7vTQCY7/Ox944tDUjVDRaHuTuX1ffG1QR0BqXmiLNSIJvLn4Iiz/\nZVuFhpGefuonBGRR2QnZJpazjyRW9DZi127oE4dfynC8t1FnH+RTA1VSXHwdN1a3\n0/+EknJ+r91CRx1iQGE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 404,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "308184024043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc02401868cd638d21653876d5458699af24011d06efabf51cd4dd8c575f8aa2506eeb79e4565278aa73282deea02836cf700a28d042c94a568cfb19eecc5bcd3cb6ea",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 405,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "308184024066e59cbcf0f0a0fee7256d52661cf74b816308a77a7c9e8c4130461a4d1205eedfc32b5fba90829c8425409283eab77c74fcf1d45571da5a372a026368794c9d02401868cd638d21653876d5458699af24011d06efabf51cd4dd8c575f8aa2506eeb79e4565278aa73282deea02836cf700a28d042c94a568cfb19eecc5bcd3cb6ea",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041ec7fe2275860c3bc0e4e6e459af7e16985d37adba7351ac357a7c397e07522ea41bcca8e89777fe05b8f0d9dc8c614004fcaf30a97001a5011a159f46fcd5443cbc1ddfc7ac89a1a2f8eef77bf9bba8ade73da2100cb6a371546b495fb5ea885eb631645e79591db659c49266d263d5cbd3403081cb407536efe9a5bec69955",
+        "wx" : "1ec7fe2275860c3bc0e4e6e459af7e16985d37adba7351ac357a7c397e07522ea41bcca8e89777fe05b8f0d9dc8c614004fcaf30a97001a5011a159f46fcd544",
+        "wy" : "3cbc1ddfc7ac89a1a2f8eef77bf9bba8ade73da2100cb6a371546b495fb5ea885eb631645e79591db659c49266d263d5cbd3403081cb407536efe9a5bec69955"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200041ec7fe2275860c3bc0e4e6e459af7e16985d37adba7351ac357a7c397e07522ea41bcca8e89777fe05b8f0d9dc8c614004fcaf30a97001a5011a159f46fcd5443cbc1ddfc7ac89a1a2f8eef77bf9bba8ade73da2100cb6a371546b495fb5ea885eb631645e79591db659c49266d263d5cbd3403081cb407536efe9a5bec69955",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEHsf+InWGDDvA5ObkWa9+Fphd\nN626c1GsNXp8OX4HUi6kG8yo6Jd3/gW48NncjGFABPyvMKlwAaUBGhWfRvzVRDy8\nHd/HrImhovju93v5u6it5z2iEAy2o3FUa0lfteqIXrYxZF55WR22WcSSZtJj1cvT\nQDCBy0B1Nu/ppb7GmVU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 406,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "30818502410089edf75e6e986305d8181386c16db44ba0d7ff40f4335569754a481f5cd48c6211a63de7bdaa485e9fa79858a4eabf111fed2959f031de2a132ba709412683a902407a8c08564f51534128bb52fe36dffaae89079011256ef8069e64d64c5610d3e611c0ba8b19027388fccc212523b22c44e85a789e16cb1bbd3240c86b43480fde",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 407,
+          "comment" : "pseudorandom signature",
+          "msg" : "4d7367",
+          "sig" : "3081840240225dc2310177ce6267efde9937eff898fb0bad12b0dbeb4fa9c6be6e20f88563e6d2991d47a648b0ba5a7039842dbf883bbd735df793cce0d136023fbfc9be95024000d59783d8bd050cf728b3506c16ee4a78ac26c12fd33dadb6ee8146372e4fb2a880ef77eb20ac90f3a4275c1718a033a7c0b2df538eb35827330154191153cb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 408,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "308184024061483c729369413144a6be0dd05c1ac29bc440bbdaf87e572aa987e9ca423639f339bcaaad99cb1fa80b7c35416a1834ec04bcf0fe7812c712eb1f06a16daca3024041bb956c339ebcf5e4e403c7d8928d5eb4fdf7d3f53a2c06d6c9fac347f603ac3209a2af37516f807b50363b5328bc98b94354af7d59966d160f68e80c6b2dc0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 409,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "308185024100a620880bb7fab1180e3d8f393e4b3343dd4eb1c374f9d61252f8a201d9096ba836721f8e2d8b56cbf406960aae0e50325adfca6b1b529f06a81260bd8b15ff68024076537febbc0e24ab4992b576abf8bc0201cacf5ccf674ad3c3b1552c98ca64642eff5401afecab167ec0be195fe5ffa178f14567ef171b4827964a559d079b7a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0430a67deaaf0cee44aaeb903d8cdb24ad9dc191d375d7d6a60d2520e19306cfc47dde9dcb80aae0b040554bb98d601e019f9336e831cccb99f2d92cf4b91604b1000000001a4b00c74a5a61ac196faf4dc39acd41bf354def0a27529964359132a76f28654248d1ac004d11d811aba0acb9c26d2f4a54012c5d8a9a1e7c8b4a52",
+        "wx" : "30a67deaaf0cee44aaeb903d8cdb24ad9dc191d375d7d6a60d2520e19306cfc47dde9dcb80aae0b040554bb98d601e019f9336e831cccb99f2d92cf4b91604b1",
+        "wy" : "1a4b00c74a5a61ac196faf4dc39acd41bf354def0a27529964359132a76f28654248d1ac004d11d811aba0acb9c26d2f4a54012c5d8a9a1e7c8b4a52"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000430a67deaaf0cee44aaeb903d8cdb24ad9dc191d375d7d6a60d2520e19306cfc47dde9dcb80aae0b040554bb98d601e019f9336e831cccb99f2d92cf4b91604b1000000001a4b00c74a5a61ac196faf4dc39acd41bf354def0a27529964359132a76f28654248d1ac004d11d811aba0acb9c26d2f4a54012c5d8a9a1e7c8b4a52",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEMKZ96q8M7kSq65A9jNskrZ3B\nkdN119amDSUg4ZMGz8R93p3LgKrgsEBVS7mNYB4Bn5M26DHMy5ny2Sz0uRYEsQAA\nAAAaSwDHSlphrBlvr03Dms1BvzVN7wonUplkNZEyp28oZUJI0awATRHYEaugrLnC\nbS9KVAEsXYqaHnyLSlI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 410,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3081850240479ce8458b04b2dc127b46971e6c79831bf788f65ddc770620daaa15583f8d506f2a6652d82b38560ec1977586e11929b666f6d7012d816fd356d41e9304d60f024100a750f73ccaeff5d994067e66e45c200892c607b329be5e64db5c383c7be711c97b5dd425a52250bc862477e28b3afa4ef3d831066a7b143432a5d15403021457",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 411,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3081840240685b8b2929c9a0a9b0deb6baefd00e26f50d4c1fc3fed47d7ef812c52b66ec6f6d09f54e9bdb7202016570f75bb9912aab3a572bfb97ea589ace294ff0fe666202404c286267cb87a6be56f4cd0080398c23e569f2ebda71d2cd1682080290deb4143bdc61e75b42abefbcbbddf4c794545a05378656a1858658e0a4595833fc40f6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 412,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "308186024100811112d27ca1e434b00c0293320284b1c5369fd007f90e7a99d44c9c02013688d16e5e0a2fc3a077064a995c4244195c04f00323e33adea6b37701ad5cb3621602410082dd5c3e3642fc43e5c4c652e3b2d00f6d137207be8c9b2125561c08703e4a84d2a82785f775abd18aab24e52f12c5f8cb56b28b915f9c0b1110c542ba92b313",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0430a67deaaf0cee44aaeb903d8cdb24ad9dc191d375d7d6a60d2520e19306cfc47dde9dcb80aae0b040554bb98d601e019f9336e831cccb99f2d92cf4b91604b1aadd9db8c19ec3c3f57a85021a5a4cba0795c071f494841fcc3c4a310bfd773ed5de729b597d9696ae808f52d4f7e0396ebf91ffe32ec558cb1fc637dbaefea1",
+        "wx" : "30a67deaaf0cee44aaeb903d8cdb24ad9dc191d375d7d6a60d2520e19306cfc47dde9dcb80aae0b040554bb98d601e019f9336e831cccb99f2d92cf4b91604b1",
+        "wy" : "0aadd9db8c19ec3c3f57a85021a5a4cba0795c071f494841fcc3c4a310bfd773ed5de729b597d9696ae808f52d4f7e0396ebf91ffe32ec558cb1fc637dbaefea1"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000430a67deaaf0cee44aaeb903d8cdb24ad9dc191d375d7d6a60d2520e19306cfc47dde9dcb80aae0b040554bb98d601e019f9336e831cccb99f2d92cf4b91604b1aadd9db8c19ec3c3f57a85021a5a4cba0795c071f494841fcc3c4a310bfd773ed5de729b597d9696ae808f52d4f7e0396ebf91ffe32ec558cb1fc637dbaefea1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEMKZ96q8M7kSq65A9jNskrZ3B\nkdN119amDSUg4ZMGz8R93p3LgKrgsEBVS7mNYB4Bn5M26DHMy5ny2Sz0uRYEsard\nnbjBnsPD9XqFAhpaTLoHlcBx9JSEH8w8SjEL/Xc+1d5ym1l9lpaugI9S1PfgOW6/\nkf/jLsVYyx/GN9uu/qE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 413,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "308184024039d0c5c4e48ca14064b2e9b3600deb0ec2fb3e0c65b3be5ce3f206166d76dfc5a5f6ea8702da3aecb13e7b55a87b1263c4884611e5de440f6c89ed12f88ae50f02406ae78398e7f942b35e7d87ef27ce830690f7327ad2a83df56e9d0288b51999454bd90f895e7849f35b2a652a3af97bf55795b4698e0b014ea6ff021a00878f3c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 414,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30818402407c3ab2e3deafb823ee591dc53c97b389c6d18a8ca9a6ae20c74328606db2d7c7d2bb3ce26894e3f30785237b9e874350d615786381b0c8c420224d2f5e359468024034e703dd939b2b1a200872334e2f864dbf26688f8475c9e38a384102e08a18c27d4e30d802095fff3edda6dc1e03aa81aed96719cb49612471fa118875a15c18",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 415,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30818502404cd8a5f1977a3cf8e847a1377359cca7046c793ada0665f2c06908fdcec24e6cd55a1750ca576421b8a65aa99aed863cdaaa77d7f7cf84448ea58e95c57a133c024100a340572d5d9683e72e157e683ab16d0e2a35030ff3e1641d1b4f801d80732c32b9fbb53fdcaea933f131136f8ab25311018b871f53753782989a87ef231a38ac",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04aadd9db8bb4189a6d2ab7b5aae550fe8dc00be2e00f4b35b576d6f862c09869210fc82fbd15a54def1442979fa0da1c64408fd8437a60046930820748ecdfc664a59a87eae338d22d0835523156f8f7d934710a747cf192d3e317bc45f0489d6979887c65ec17ab7b5e3da9f4cb110116ef0739849acc56d24e5a3365fcfb289",
+        "wx" : "0aadd9db8bb4189a6d2ab7b5aae550fe8dc00be2e00f4b35b576d6f862c09869210fc82fbd15a54def1442979fa0da1c64408fd8437a60046930820748ecdfc66",
+        "wy" : "4a59a87eae338d22d0835523156f8f7d934710a747cf192d3e317bc45f0489d6979887c65ec17ab7b5e3da9f4cb110116ef0739849acc56d24e5a3365fcfb289"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aadd9db8bb4189a6d2ab7b5aae550fe8dc00be2e00f4b35b576d6f862c09869210fc82fbd15a54def1442979fa0da1c64408fd8437a60046930820748ecdfc664a59a87eae338d22d0835523156f8f7d934710a747cf192d3e317bc45f0489d6979887c65ec17ab7b5e3da9f4cb110116ef0739849acc56d24e5a3365fcfb289",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEqt2duLtBiabSq3tarlUP6NwA\nvi4A9LNbV21vhiwJhpIQ/IL70VpU3vFEKXn6DaHGRAj9hDemAEaTCCB0js38ZkpZ\nqH6uM40i0INVIxVvj32TRxCnR88ZLT4xe8RfBInWl5iHxl7Bere149qfTLEQEW7w\nc5hJrMVtJOWjNl/Psok=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 416,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "308184024053192c28820ec266639fee09e214a55cc0efb07b22dc0d3f293bda2072fcf9b462da93ec9e7169ae1f1148705189f7f15d2cbec46d224197a3a7a924b0c00a3202401b664536aedbdc97bed4dee23eb94a49f23de3bd84a78f299e81edfe017a7d3ca3a7c8aace8d13b6b2eb477b922c439839eacdff2783070757754863582f715d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 417,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "308185024100969058c15d675b1b262152a4520f7e803ab465a9e1eeef7b8a5d0fb3e88032b8e8f1be9f37c80f9c7b950f4da950baae9b216ecd6c793ddb1459cfdf49776bae024020e0d078a5a113e92facdfe5cb39243247254aa0a656b83e7baa343d36f7b14b86f15e54b71ba7506d5119ff52c47e0ee549927a008cbf2bbfe1916d1cc274b2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 418,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30818402401de5df621364436bed5cacf8dbe420e4e4e5d1b0434fcf9dc335645dd0aa07cc1d1ea30a8cafe2531cd4035dd972c0d6c3720f160e24264fd6c41521e44eb0cb024072e9abd54561bac89b234bf9e51a3f6003590af177098e25f0053a3ae18a6c74b389674a6eb80378ffd255cfe52323645cdfe9a10a965341b4e47fc0dd082e1e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0424c10440e37a15d7ec9a3a48965a9ce9380221fc51155f1e992716cd9933d09ce0a5424471877e8994494a4c2ade0a81ef52952e395655157f0b743b3b219e2d628fd5ba510f610ee693a1e0d39ef39d91a6248379c622a175a23a5330a88b2d5a60dbf6d249702cd1504561535ea17e1be1b70a41dc463e8e1a1af000000000",
+        "wx" : "24c10440e37a15d7ec9a3a48965a9ce9380221fc51155f1e992716cd9933d09ce0a5424471877e8994494a4c2ade0a81ef52952e395655157f0b743b3b219e2d",
+        "wy" : "628fd5ba510f610ee693a1e0d39ef39d91a6248379c622a175a23a5330a88b2d5a60dbf6d249702cd1504561535ea17e1be1b70a41dc463e8e1a1af000000000"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000424c10440e37a15d7ec9a3a48965a9ce9380221fc51155f1e992716cd9933d09ce0a5424471877e8994494a4c2ade0a81ef52952e395655157f0b743b3b219e2d628fd5ba510f610ee693a1e0d39ef39d91a6248379c622a175a23a5330a88b2d5a60dbf6d249702cd1504561535ea17e1be1b70a41dc463e8e1a1af000000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEJMEEQON6FdfsmjpIllqc6TgC\nIfxRFV8emScWzZkz0JzgpUJEcYd+iZRJSkwq3gqB71KVLjlWVRV/C3Q7OyGeLWKP\n1bpRD2EO5pOh4NOe852RpiSDecYioXWiOlMwqIstWmDb9tJJcCzRUEVhU16hfhvh\ntwpB3EY+jhoa8AAAAAA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 419,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3081840240422fb18cdec966937145b0f160b8ce222b0ba16fab075e16f1dac839b8d7772fee27a283ad722225bebe83db2d5a8b25cb2cbe45248b3aa876554c6a37f8137502407a3889d53bb42a6d41f393eb00c43623937029d4cc1d367469f6ea4ec16658619d2935de0a655adae4cbb624f2ffe3ce41f024269d9149dbd83cb1c97aed41b8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 420,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3081850241009836ee7ae0447ec07a6a216633e0a97de831fa04fcd760abe39e8f457796fdfce9c69ed13c827de0ca6b60d849ed6976ac091b7d90ce3e98d3c9144afe638d4202401c9d8e142baee857d6adec8eff84ea1d23b05f5482cc2950451586cf5de0cbf9e3a727a4a4e93e15b6cc0125e5fcd1910636898064a63813a0c75fee28041b88",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 421,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "30818402400877d7a3ffacf4ef36cbedfd44e4cc0237bdeede8ce0bdfb330bb73b317b7d161c45bd1496e1233ced8f7dcfd05e0e1cc665fb1dc92b54fcbe9b0e55d9ba1be402400f7ab871742ebf22e0b7674614d71569d5084ccc0c98c2e40d088ae88eab37820a89a2dbe49e1b67ec55ae1a34fe4822d691bbf5490fcc2c47e7c1ba4dc56e7a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040ba18cc05572424a7a391f4b48258a871a0f6d8216c5cf82446c2d156d5586b4c196da0b2f3a23511b89eff31dd4f0c88dbb1a76c5e4b27c4276f8fbc74a1b9da28cc8c341ea2e3908ae6ab6825f956032c53e625697f80b7b4ee72dcc9f3cff730349e0d30de410917f3d0d1c8988562c1d55583b47f0dec234fda2ffffffff",
+        "wx" : "0ba18cc05572424a7a391f4b48258a871a0f6d8216c5cf82446c2d156d5586b4c196da0b2f3a23511b89eff31dd4f0c88dbb1a76c5e4b27c4276f8fbc74a1b9d",
+        "wy" : "0a28cc8c341ea2e3908ae6ab6825f956032c53e625697f80b7b4ee72dcc9f3cff730349e0d30de410917f3d0d1c8988562c1d55583b47f0dec234fda2ffffffff"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040ba18cc05572424a7a391f4b48258a871a0f6d8216c5cf82446c2d156d5586b4c196da0b2f3a23511b89eff31dd4f0c88dbb1a76c5e4b27c4276f8fbc74a1b9da28cc8c341ea2e3908ae6ab6825f956032c53e625697f80b7b4ee72dcc9f3cff730349e0d30de410917f3d0d1c8988562c1d55583b47f0dec234fda2ffffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEC6GMwFVyQkp6OR9LSCWKhxoP\nbYIWxc+CRGwtFW1VhrTBltoLLzojURuJ7/Md1PDIjbsadsXksnxCdvj7x0obnaKM\nyMNB6i45CK5qtoJflWAyxT5iVpf4C3tO5y3Mnzz/cwNJ4NMN5BCRfz0NHImIViwd\nVVg7R/DewjT9ov////8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 422,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "308186024100a7322046ba7473716d35742d961ac5f2fe2e1dd574ece7bd15da8c66a262b2e79b0d1df27619fdebbb41da1b27ba7c9a0370ef962ee8a45105f4416d16ebf13e0241008418e445db45cfbdc8458055386d65e9bc07b497b8d4bef5f515e7947050d9ab9799fb520f322bf00fae4fae03c1269510ebb3e1dc8cca59298e26945862e9e6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 423,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "30818402401bb460ac42bb3640bfc739a0186ef3362ed27b254f548c073935caa211a1aa302e79a9466d7fece774d250c1aeaef9641b9a2f25e61ca37fada8ee07f49fd51e02403d918a07a36f578da8b0d42d30bad60ecfbd603a45d0c1a71bb01447ead81a5313265cc9b5860aba03f1c93a9cb9f3bdd9a85f270dd3691465941d2b8098f93c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 424,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "30818402405b44e4fd4996f27a7dcf306bc9fff4a9c36e3fe09026fa72122b64a4ff65f861a5954ce8a41f69a3915c84a63db0c57c6dfecbac4fde99ea5fcb104d6967d6130240088e7b846d6c5e093a7ba17427bcba0e925acb826e4e9b972b2d8a6d232f635cbe96bf6f163174db646c2f6623c89dc6e4a828d4e2e2fcf3c427c42bdb72efb7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047f3327e34662274aa147953a007f30c2ee1b06d7bb053e8ce1c9b683f0f46563dd38db071d87433b30380434c92e8cb76d603d1936fba1e9317a06e20000000052ca478f0367ab24857e788576f17bfcd05e62d20d0fbefd1b2d954b996eaba67819023635e31483f5b0257f89b46a1d2b9cb2420e1cdb940ceaff5429dd8013",
+        "wx" : "7f3327e34662274aa147953a007f30c2ee1b06d7bb053e8ce1c9b683f0f46563dd38db071d87433b30380434c92e8cb76d603d1936fba1e9317a06e200000000",
+        "wy" : "52ca478f0367ab24857e788576f17bfcd05e62d20d0fbefd1b2d954b996eaba67819023635e31483f5b0257f89b46a1d2b9cb2420e1cdb940ceaff5429dd8013"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200047f3327e34662274aa147953a007f30c2ee1b06d7bb053e8ce1c9b683f0f46563dd38db071d87433b30380434c92e8cb76d603d1936fba1e9317a06e20000000052ca478f0367ab24857e788576f17bfcd05e62d20d0fbefd1b2d954b996eaba67819023635e31483f5b0257f89b46a1d2b9cb2420e1cdb940ceaff5429dd8013",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEfzMn40ZiJ0qhR5U6AH8wwu4b\nBte7BT6M4cm2g/D0ZWPdONsHHYdDOzA4BDTJLoy3bWA9GTb7oekxegbiAAAAAFLK\nR48DZ6skhX54hXbxe/zQXmLSDQ++/RstlUuZbqumeBkCNjXjFIP1sCV/ibRqHSuc\nskIOHNuUDOr/VCndgBM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 425,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "308184024073967eb24e20f0d4ba58895a49f812c28d24e5f0fd5e35f1075810a478d93717c8aa2605ac84226dd3d53c39c0d8c52eeac8e998bad931f5efdd664b57cee555024005b0031fb10dfc7c36ed89aafe66444835cd9c53e1c850af5f055e2b263d3e737a4e6a83cadb9d76dde535e809f447455324d4aee6f036485d4167a6e60eeda5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 426,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3081850240633f456914707923f4b0086ea318b8cebdba5fa14352e3d9c606bd8dabf032835bbda76aa514c1a6dde1b321803d27f253dfe1cae532a5bdcd9e93e5f94596d10241009b9c8ba074deeb03745d8ae37c73e02273071a35dcfe0f65e463e208bd11c6ccb3aded6be7313d7a656d5e871b8ea4d1d51b778467b6dde6578e105d56b617d4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 427,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "308184024040891a57b9b8f0bc6a8761d2424cb60b3f39de4e601bc8daf15ab3216c2c56ebcc760de30907e89294af5818f5a72a2df409bb6918f3d6e506ce5314602e50c1024068620756ee2a600a1467f29608ead019d0d516b79c8a756fc537a9fc734616bfec133839beb4778fdffd3fb4226e51ce4bc09627331c8daef1f711648a30fb06",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0412482f158e62e83467297b4edad930ad319048283f0949300605a4a2d19f72f924d41e1cc3ad2c246574f4a0eb637cdd386c1ebf4a00707b71a646dcffffffff18d851ef92835f7be92a25b988ae8d5f7ed42f312f7c896850a589f7bb7500330d138cc20dc5630a7d525926e8f717635ee72937035736ace88f0c491f31930d",
+        "wx" : "12482f158e62e83467297b4edad930ad319048283f0949300605a4a2d19f72f924d41e1cc3ad2c246574f4a0eb637cdd386c1ebf4a00707b71a646dcffffffff",
+        "wy" : "18d851ef92835f7be92a25b988ae8d5f7ed42f312f7c896850a589f7bb7500330d138cc20dc5630a7d525926e8f717635ee72937035736ace88f0c491f31930d"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000412482f158e62e83467297b4edad930ad319048283f0949300605a4a2d19f72f924d41e1cc3ad2c246574f4a0eb637cdd386c1ebf4a00707b71a646dcffffffff18d851ef92835f7be92a25b988ae8d5f7ed42f312f7c896850a589f7bb7500330d138cc20dc5630a7d525926e8f717635ee72937035736ace88f0c491f31930d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEEkgvFY5i6DRnKXtO2tkwrTGQ\nSCg/CUkwBgWkotGfcvkk1B4cw60sJGV09KDrY3zdOGwev0oAcHtxpkbc/////xjY\nUe+Sg1976SoluYiujV9+1C8xL3yJaFClife7dQAzDROMwg3FYwp9Ulkm6PcXY17n\nKTcDVzas6I8MSR8xkw0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 428,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "30818402404debd0683028f2335b233c49531b6096e7c5521f75fcb4b5f5e32241be081f3c2b8549b57f31217be9b7aa1a4687a72ec9a5d376307252ca7c1b9b610d25b4d0024004d1303f6b91ac01c91411a983f3abb04f3698b169f8a39ffd1931c061e66f43482fec795dfd0d0abe879fa8db885b618aca2ae013e693f154bb9d0a77adef4f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 429,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "308184024034ac9a4e6fb171f424bb592d1b845bee55173b42422fd5b5132f859a27ddcda5532fd38116e6277d9375639fb25b0f66f1e8a1accaa7800c91c87e7439987d58024075892be8e11d9bf3e81e8370af02d88bda83ce0ae9c21aeb487eef4c4c5458e51a99e4d788db84064cfbc48240f56612078769fde0e3b706125f46e2f26a3508",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 430,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "308184024036b68b5cad7428803f606615505857aa7cfb683d1e9ce856d499fa6e13ee6a4f235edd00403429ff14bc578dd121fd256004794add4fb8195b43a9e1eefbd3a1024045c6affd607f5424a0e49c0f1a72ebf7948a80b482ef171ee161dc36515679e32fa9edaa92c57403e6e102643b77391aedeec2b054964315dedd4cc369f23f03",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04727e75d63dceb1a84a7106d802e8eb34a204bc05353567a23ba8b6f54e50d2d8221c87fd8e5238a3374df958b3cf3e3f38c618c1cc8c5b9574b50e405d69121837f78918506ea9cc14f1492eb66c9e1c4e27f3cb00bb511d5dfdbea6f817a87bfd81de2955fa032f52873f799169cc445cb0391e46e57179ef84d50c85db5c97",
+        "wx" : "727e75d63dceb1a84a7106d802e8eb34a204bc05353567a23ba8b6f54e50d2d8221c87fd8e5238a3374df958b3cf3e3f38c618c1cc8c5b9574b50e405d691218",
+        "wy" : "37f78918506ea9cc14f1492eb66c9e1c4e27f3cb00bb511d5dfdbea6f817a87bfd81de2955fa032f52873f799169cc445cb0391e46e57179ef84d50c85db5c97"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004727e75d63dceb1a84a7106d802e8eb34a204bc05353567a23ba8b6f54e50d2d8221c87fd8e5238a3374df958b3cf3e3f38c618c1cc8c5b9574b50e405d69121837f78918506ea9cc14f1492eb66c9e1c4e27f3cb00bb511d5dfdbea6f817a87bfd81de2955fa032f52873f799169cc445cb0391e46e57179ef84d50c85db5c97",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEcn511j3OsahKcQbYAujrNKIE\nvAU1NWeiO6i29U5Q0tgiHIf9jlI4ozdN+Vizzz4/OMYYwcyMW5V0tQ5AXWkSGDf3\niRhQbqnMFPFJLrZsnhxOJ/PLALtRHV39vqb4F6h7/YHeKVX6Ay9Shz95kWnMRFyw\nOR5G5XF574TVDIXbXJc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 431,
+          "comment" : "y-coordinate of the public key is small on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "30818402405e1bf4b1debacba4725fc3cc8214534de5f6e592645b60f4c4a1dd2260d3357d8fb2ada7f72a48346a7e34395a6a181c694048ae8258f1cb3b6f63f4932829eb02405e3df0beee22fa96d4655833862f73b52f12e4c4c7d818b21846effb39d6f09fc35b2d0fac8f5cb3c4051ff45f5305e93b24138a0f95fad2fef1c10cd1dcf2cb",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 432,
+          "comment" : "y-coordinate of the public key is small on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "30818502410080400bee9a342f3afba2dbb029235ad511aedb30960c53bad670460b38304d7cbd706ff98f1296cb7e746f8ca3a43937a5cd035a00c63868001fa429b491bd8e02405c66941edcda56228edce77373a7b9dcdd464ed18075e7da1427911778784f8017bef6f18751cba12355bd90ba63b8d31ea373387f36494e3642008082d349d1",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 433,
+          "comment" : "y-coordinate of the public key is small on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "30818402404768dfddae4cb83566f2c3a9340091c2608e0e270a4b3f48ded7c75b4aa15ab65cb050cfdb312c32bfaa7759869c9c0ce27f6cdf1fb584379f6398c95ebf864402407e1a3aacd8d603faecf87902147b67435d992ee9e543f934dd4c40d8a12cd1e10366d0743d7862b9c8ba8b6816639c3509b5caa2a91533c0af50ece2fd2c530c",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04727e75d63dceb1a84a7106d802e8eb34a204bc05353567a23ba8b6f54e50d2d8221c87fd8e5238a3374df958b3cf3e3f38c618c1cc8c5b9574b50e405d69121872e614a08b7b1abf2ae39d7f7d5d5deb7d0899e8b30e80f17865de23781b5ff57fcbbcd745cc65135c4661b15539b4a1cbd1c610e69d550b39258b49d25eec5c",
+        "wx" : "727e75d63dceb1a84a7106d802e8eb34a204bc05353567a23ba8b6f54e50d2d8221c87fd8e5238a3374df958b3cf3e3f38c618c1cc8c5b9574b50e405d691218",
+        "wy" : "72e614a08b7b1abf2ae39d7f7d5d5deb7d0899e8b30e80f17865de23781b5ff57fcbbcd745cc65135c4661b15539b4a1cbd1c610e69d550b39258b49d25eec5c"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004727e75d63dceb1a84a7106d802e8eb34a204bc05353567a23ba8b6f54e50d2d8221c87fd8e5238a3374df958b3cf3e3f38c618c1cc8c5b9574b50e405d69121872e614a08b7b1abf2ae39d7f7d5d5deb7d0899e8b30e80f17865de23781b5ff57fcbbcd745cc65135c4661b15539b4a1cbd1c610e69d550b39258b49d25eec5c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEcn511j3OsahKcQbYAujrNKIE\nvAU1NWeiO6i29U5Q0tgiHIf9jlI4ozdN+Vizzz4/OMYYwcyMW5V0tQ5AXWkSGHLm\nFKCLexq/KuOdf31dXet9CJnosw6A8Xhl3iN4G1/1f8u810XMZRNcRmGxVTm0ocvR\nxhDmnVULOSWLSdJe7Fw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 434,
+          "comment" : "y-coordinate of the public key is large on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "308184024027d9c6c4db31aff288fa4e40159d6ee18c98139427484796f1f8745c9827dfc08d393abe144df6b7c12d48971fdd284b81e6e10860359ef71473b9e6bb84cb1e024007a0420c8a9b26911b63626540a85f60aa277afdef9990fc8dc1d3f1f2c5a927e1e4a29d81a701b48b366f000f962614899cbf193826ca8de4a425538de5ac62",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 435,
+          "comment" : "y-coordinate of the public key is large on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "308184024049542eec3b96c476b59b2b94d5fc7ee08fd2a1b1e732e6609098ab2a7f250452fbc1057a6d3feccbcaeb00468b26222eb48065fcaad7647681823860451e1e91024037db336dee1e45d9ace550053511c9c3755657e78eca108d3dfd1e68fe83da626b8dacbb19f0ee232b0f8bfe8ddbe7d5e98b7a2eccd03f375d164ce828631896",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 436,
+          "comment" : "y-coordinate of the public key is large on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "30818402404f90ceb76bc72f0cca10705d3badab6caa6019ef6bfe7de1b75951d517d2b16168515bf305f0006292e4900598256141e45c19077fa447dd5f32daa62c25081502406712a784102802821e9708e349d03a88297b374ef81a4edc35016524cd2a22afea7b8b3171de60ac1b3882533650586dcad338ea48231486e10e3120ce3d2a59",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040518ff14ba05188abed0a8c88db0f097b5660aac57e9a3cdbb9c833e2a7f9f613e49956b53a635952e29818e4a8015cb6a150cede636c2558f2d3602483963b99ed9fe842f3ed418462c63e266944ca2747e15bd8f52844d6a1ce9815210421206805c6ed792356ec57d79fa3e36fff23e2fc6370c67bc51d3f8b555c9048d6d",
+        "wx" : "518ff14ba05188abed0a8c88db0f097b5660aac57e9a3cdbb9c833e2a7f9f613e49956b53a635952e29818e4a8015cb6a150cede636c2558f2d3602483963b9",
+        "wy" : "09ed9fe842f3ed418462c63e266944ca2747e15bd8f52844d6a1ce9815210421206805c6ed792356ec57d79fa3e36fff23e2fc6370c67bc51d3f8b555c9048d6d"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040518ff14ba05188abed0a8c88db0f097b5660aac57e9a3cdbb9c833e2a7f9f613e49956b53a635952e29818e4a8015cb6a150cede636c2558f2d3602483963b99ed9fe842f3ed418462c63e266944ca2747e15bd8f52844d6a1ce9815210421206805c6ed792356ec57d79fa3e36fff23e2fc6370c67bc51d3f8b555c9048d6d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEBRj/FLoFGIq+0KjIjbDwl7Vm\nCqxX6aPNu5yDPip/n2E+SZVrU6Y1lS4pgY5KgBXLahUM7eY2wlWPLTYCSDljuZ7Z\n/oQvPtQYRixj4maUTKJ0fhW9j1KETWoc6YFSEEISBoBcbteSNW7FfXn6Pjb/8j4v\nxjcMZ7xR0/i1VckEjW0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 437,
+          "comment" : "x-coordinate of the public key has many trailing 1's on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "3081850240459e3e6e671a6c342d585db689043d32a494ce0039ee71ac67ed6ec0861908ebae6b2d6e4a67caa7a8f0576a49889a4a63d4b0b8aa8845c9cf785b49412a7071024100a5edd7abfce9d4413b22289397785b3d84b2c0d3719409255bb7128268e0bcd37d928bea5486bf56ffe259c7ec9f50b878e0155d73e3bde5cffe55e612f8d7b8",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 438,
+          "comment" : "x-coordinate of the public key has many trailing 1's on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "30818402401b2f7ea40960e37e28b556b7e446c4641e2f3d8a829dcc4a349553e42cf9ce6272dc9cdcda013e3981cb73b10d46321c80501d6a34ad7fd959a0c78f891f33f002407f195b7696edfc7687ff0126eaba13dad1e19563e8d395af32db3d6a7b4e82f28004501d92b7537da397845b7aa398a11051052e52264bd8cbcba9987ec6742b",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 439,
+          "comment" : "x-coordinate of the public key has many trailing 1's on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "30818402401b5c1d2b2b06591a1fa516cffa9c8a57cf1fffc22cecb7249281670bc23883a68553e0caf1edd9f1703a25b74e0000a37e32e6cc3576939f458c3dd5c4dbcc9c02404b23d7ed7f8a6b7ba7d22aefa8fde030ecb3f2fed4a5f26f12d59a29d63cdd0ec03fae557d141c7b0e8712c306b0eebbd0cab27696012062622bb180043034ba",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043f89e787b4d5d2599624513530e750ab3c5957dc9aa0e7b08a3e25356818e2037d062f336d4eed417c91bcb11b54b57d54a4f02a72fb74262f742cc6f34044013a448b8e2d0d5a7c5b4f1b9f5b701a9d21ff55e3678ca119b6d7c511ba0aef89f31aeb195db00f248359aee924e7c860b76845f6512a2a4aadc1287a15095220",
+        "wx" : "3f89e787b4d5d2599624513530e750ab3c5957dc9aa0e7b08a3e25356818e2037d062f336d4eed417c91bcb11b54b57d54a4f02a72fb74262f742cc6f3404401",
+        "wy" : "3a448b8e2d0d5a7c5b4f1b9f5b701a9d21ff55e3678ca119b6d7c511ba0aef89f31aeb195db00f248359aee924e7c860b76845f6512a2a4aadc1287a15095220"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200043f89e787b4d5d2599624513530e750ab3c5957dc9aa0e7b08a3e25356818e2037d062f336d4eed417c91bcb11b54b57d54a4f02a72fb74262f742cc6f34044013a448b8e2d0d5a7c5b4f1b9f5b701a9d21ff55e3678ca119b6d7c511ba0aef89f31aeb195db00f248359aee924e7c860b76845f6512a2a4aadc1287a15095220",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEP4nnh7TV0lmWJFE1MOdQqzxZ\nV9yaoOewij4lNWgY4gN9Bi8zbU7tQXyRvLEbVLV9VKTwKnL7dCYvdCzG80BEATpE\ni44tDVp8W08bn1twGp0h/1XjZ4yhGbbXxRG6Cu+J8xrrGV2wDySDWa7pJOfIYLdo\nRfZRKipKrcEoehUJUiA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 440,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "308186024100a952847acf213c86e231316d8f9130f7cbdf7f3952307a577076342d13939b4ab5a1313b34abb89204d3fd1f873885fffa683c5a493e5461c7f1400af86ae7fe0241009a65a8a4150de593b29642b988b2ec2e23e15e156ecf0af5fde2fbd73208f69f2506d141e0b47c0e1f2fa09ef26b389a6bd2b0230930a16fd119767e382724b5",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 441,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "308185024051bfb80aae30262a67bf0771a6b8d195e59aa04e87bd060fe5a9bd56d35385a5fc3da5dfc3ae8c67dbd408184482855e3563dedee72a21b60fafd73819aa837c024100807f0d69385467ad6cd8a44d482ca3b6e18f7b352ef19a2bc980500b6d59045f0d6f7ab7e414c50d2b68d7f6e6c01d3e8353cdfd475f249b31842fe59955f414",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 442,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "30818402404e8711b00de355f14c8eb91959c13c77f9155754765f10f2aaa8fdad6a14c6a4e62c5ed48a9d8ca403c902db0c2c0735426b33e67828ac32ae19b84e6598681902407d104ae5e5d0da26cb427d7951d40df429b4205086e633b800d7d7b8bde48a9bec4e43ddeb4226192b5c9b30ffa3efa7d2385ab28a190c165fb2a2c58572c2a2",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047860a4743bb48e7793c7f1416fbac6ca0b538210d743f24976af3efda97f28bc95913401ec4ca5e744a23d1a552653ff110ec8421b3de531f3bacda07bfb09d603662f2f2475bbf5e20da48b50169d289c89c54ed0f97bbbc7f38016f1a955cb74c52727ef802055ea090fe1a49be58ddc6083bca3f7c02ff644775cd0027f06",
+        "wx" : "7860a4743bb48e7793c7f1416fbac6ca0b538210d743f24976af3efda97f28bc95913401ec4ca5e744a23d1a552653ff110ec8421b3de531f3bacda07bfb09d6",
+        "wy" : "3662f2f2475bbf5e20da48b50169d289c89c54ed0f97bbbc7f38016f1a955cb74c52727ef802055ea090fe1a49be58ddc6083bca3f7c02ff644775cd0027f06"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200047860a4743bb48e7793c7f1416fbac6ca0b538210d743f24976af3efda97f28bc95913401ec4ca5e744a23d1a552653ff110ec8421b3de531f3bacda07bfb09d603662f2f2475bbf5e20da48b50169d289c89c54ed0f97bbbc7f38016f1a955cb74c52727ef802055ea090fe1a49be58ddc6083bca3f7c02ff644775cd0027f06",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEeGCkdDu0jneTx/FBb7rGygtT\nghDXQ/JJdq8+/al/KLyVkTQB7Eyl50SiPRpVJlP/EQ7IQhs95THzus2ge/sJ1gNm\nLy8kdbv14g2ki1AWnSicicVO0Pl7u8fzgBbxqVXLdMUnJ++AIFXqCQ/hpJvljdxg\ng7yj98Av9kR3XNACfwY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 443,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "30818402404cd61754211d222371e552578ff705cc819a2f9fb2729f05d848caabf44a31fda1bd038f1b87efd28a8ce53222fdfec18d5929df926df27c2c7e7360bc5c0c7002405ce94c851db1807dc79dcc087c0830d70a0069cf52baffaf347aefa1ddba77f6f770c1483fdde38f5d74bdb32372e12fee843efff0f2dc9344ca1e3b26b9b051",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 444,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "308185024048b4bde7befb1b1cad50cee6233cbf32812860c81d7ad5b0e9d6377202bcd34827c534da0ac9646ae0154689e38c608894bb3126e1025f69c824c69ab821274a0241008369f5840f776668ebb435b33be05dce4adfabb8860ccc900d07db006a50195fd4de98632192fbe7319cedff26aa8682cf7bf5f1c02e58b9c163236103d9b314",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 445,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "308185024019524b15cf4ecb400b938ef5f752b86ec8f07c5903da5dba9c91ab7965b1223a8e262bef8cca8973ed98797f37a35e1c5999cf203e610ef773c6aa2786bba06402410098cf7526f5a24a0e2f22f909f8190b13130451b15dd6774bdea9d929342d924bc7eba1df89919c1b9aee8d09203606d10cebff89904cb7e71a82d8972d755306",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdsa_secp224r1_sha224_test.json b/third_party/wycheproof/testvectors/ecdsa_secp224r1_sha224_test.json
new file mode 100644
index 0000000..047180f
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdsa_secp224r1_sha224_test.json
@@ -0,0 +1,4038 @@
+{
+  "algorithm" : "ECDSA",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "BER" : "This is a signature with correct values for (r, s) but using some alternative BER encoding instead of DER encoding. Implementations should not accept such signatures to limit signature malleability.",
+    "EdgeCase" : "Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA implementation does not check boundaries and computes s^(-1)==0.",
+    "MissingZero" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.",
+    "PointDuplication" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission."
+  },
+  "numberOfTests" : 340,
+  "header" : [],
+  "testGroups" : [
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5",
+        "wx" : "0eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7",
+        "wy" : "0eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE6tqTvhCyRJ4ei7WDBdUgCAE8VxB8GiCj\nF6bLp+ymcjQMA9HS4JZjKGaR31UGn6JUkMndn5wLsrU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "signature malleability",
+          "msg" : "313233343030",
+          "sig" : "303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021c2840bf24f6f66be287066b7cbf38788e1b7770b18fd1aa6a26d7c6dc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "Legacy:ASN encoding of s misses leading 0",
+          "msg" : "313233343030",
+          "sig" : "303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021cd7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingZero"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "valid",
+          "msg" : "313233343030",
+          "sig" : "303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30813d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 5,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "303e02811c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 6,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "303e021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a02811d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 7,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3082003d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 8,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "303f0282001c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0282001d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 10,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303e021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303d021d70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303d021b70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021e00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021c00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3085010000003d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "30420285010000001c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3042021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0285010000001d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "308901000000000000003d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3046028901000000000000001c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3046021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a028901000000000000001d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30847fffffff021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "304102847fffffff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a02847fffffff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3084ffffffff021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "30410284ffffffff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0284ffffffff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3085ffffffffff021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "30420285ffffffffff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3042021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0285ffffffffff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3088ffffffffffffffff021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "30450288ffffffffffffffff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3045021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0288ffffffffffffffff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30ff021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "303d02ff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a02ff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "303d028070049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a028000d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "303f0000021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3042498177303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30412500303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "303f303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30422221498177021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304122202500021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3045221e021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0004deadbeef021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3042021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2222498177021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a22212500021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3045021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a221f021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3045aa00bb00cd00303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3043aa02aabb303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30452224aa00bb00cd00021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30432222aa02aabb021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3045021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2225aa00bb00cd00021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3043021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2223aa02aabb021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "30412280021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0000021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2280021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3080313d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "30412280031c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0000021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2280031d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2e3d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2f3d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "313d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "323d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "ff3d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "3041300102303c1c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "303c1c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 79,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb3584636100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb3584636105000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "3080021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "303f3000021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463613000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "303f303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "301e021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "305c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "removing integer",
+          "msg" : "313233343030",
+          "sig" : "301f021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "302002021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "301f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a02",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "303f021e70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0000021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021f00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "303f021e000070049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 95,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021f000000d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 96,
+          "comment" : "appending unused 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0000021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "303f021e70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0500021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "303f021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021f00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463610500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "30210281021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "3020021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0281",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "30210500021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "3020021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303d001c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303d011c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303d031c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303d041c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303dff1c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a001d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a011d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a031d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a041d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480aff1d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "30210200021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "3020021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a0200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "30412220020170021b049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "3041021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a2221020100021cd7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "303d021c72049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d02d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a488a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463e1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "303c021b70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a48021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "303c021b049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021c00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb358463",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021cd7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "303e021dff70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "303e021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021eff00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "3022090180021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "3021021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a090180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "3021021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a020100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303e021d0170049af31f8348673d56cece2b26fc2a84bbe2e2a2e84aeced767247021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303e021dff70049af31f8348673d56cece2b28cee4c34a02667b2df86234be1dcd021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021c8ffb650ce07cb798c2a93131d4d81a785bfd0d5b70f4de586ee5b7f6021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303e021d008ffb650ce07cb798c2a93131d4d7311b3cb5fd9984d2079dcb41e233021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303e021dfe8ffb650ce07cb798c2a93131d4d903d57b441d1d5d17b51312898db9021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303e021d0170049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303e021d008ffb650ce07cb798c2a93131d4d81a785bfd0d5b70f4de586ee5b7f6021d00d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d01d7bf40db0909941d78f9948340c5b4b7a5fa6fca97e8a82091e08d9e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021cd7bf40db0909941d78f9948340c78771e4888f4e702e5595d9283924",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021dff2840bf24f6f66be287066b7cbf3961eb3abe80737bf48124ca7b9c9f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021dfe2840bf24f6f66be287066b7cbf3a4b485a059035681757df6e1f7262",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021d01d7bf40db0909941d78f9948340c69e14c5417f8c840b7edb35846361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303c021c70049af31f8348673d56cece2b27e587a402f2a48f0b21a7911a480a021c2840bf24f6f66be287066b7cbf3961eb3abe80737bf48124ca7b9c9f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020101090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30220201ff021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30220201ff021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30080201ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffffffff000000000000000000000001020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffffffff000000000000000000000001020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffffffff0000000000000000000000010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3024021d00ffffffffffffffffffffffffffffffff000000000000000000000001090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffffffff000000000000000000000002020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffffffff000000000000000000000002020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffffffff0000000000000000000000020201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3024021d00ffffffffffffffffffffffffffffffff000000000000000000000002090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "Edge case for Shamir multiplication",
+          "msg" : "3137353738",
+          "sig" : "303c021c326bc06353f7f9c9f77b8f4b55464e8619944e7879402cca572e041a021c3116e1a38e4ab2008eca032fb2d185e5c21a232eaf4507ae56177fd2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "special case hash",
+          "msg" : "32323534363238393834",
+          "sig" : "303d021d008ce2afe20b684576fdd91b4b34168c9c011996af5b0eb85fa929f381021c662af5ca651bffbc623c3a3b372779bd09e1948cd19188f5339a979d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "special case hash",
+          "msg" : "31383237383738363130",
+          "sig" : "303e021d00da573cf73aed174710c232155735248f8ebef696374647527da52258021d00b251856b66a83c32bf0b7b81a01f1db4507e622125f301bd832a5ccc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "special case hash",
+          "msg" : "31353138383631373039",
+          "sig" : "303e021d00c368da86582b2c82b696b2f7c79027968f3fd25cbba9688cdc67b17a021d00aba8e3c2ff1af9bb9c66ca88a3825a19ce17206e7a658ff47025891e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "special case hash",
+          "msg" : "32313239323333343232",
+          "sig" : "303d021d00ffcefcb57190d0b87efb789fb53407fd2c65c5ae3551da3eccf8ddd5021c05c89b41238f1e1def8fbe8d4afebf20be077e82972f91297487e118",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "special case hash",
+          "msg" : "31323231393739303539",
+          "sig" : "303c021c2b98c67ebf6597b08bc7f1b73ff8662cf125e9700ec973ece9c6ff48021c2e3f72a8f76e12c8cdf4487e0956c1ef4578e1da4d29d8db824d415b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "special case hash",
+          "msg" : "32333032353637363131",
+          "sig" : "303d021c5794d70440f166904d24d0b910cd127c63a9eddca45a4d9032db47e8021d008ba5d290834d9a0963122d928da902f7b03467396072180bb1801b43",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "special case hash",
+          "msg" : "31313035383638343732",
+          "sig" : "303e021d00c29c70b0b21782d1c727f4907aef5641b6d6c6e7b2a1ebfa57794223021d00aac2d3a02592f298dd3198e388425ec7a91d7e6be48248a64773614c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "special case hash",
+          "msg" : "31343636363134343432",
+          "sig" : "303d021c5c3ef3778c811e69ef0b0e370e45ec0d7eb88505c3e8ffb8c50b9993021d00e06b5c6e47dc4da9e64fd21bc3e1da13cf7c264fa64ccb89da87387c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "special case hash",
+          "msg" : "343431393536343230",
+          "sig" : "303e021d00ed8f586563232cf15ebd014bd4f99727e337cfe4ce48694fe6748ec2021d00fff779a3eca9513522908e252a2b4aab2060608e6cd2d4f1b8c696cd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "special case hash",
+          "msg" : "31393639343836303634",
+          "sig" : "303c021c64c084f6b775bbf7915c1964a68b0259629328598f13557872867830021c2a6f3b289d130ec3d99e4caaf601497895a069c1a5a75b559ad28444",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "special case hash",
+          "msg" : "32323335363732383833",
+          "sig" : "303d021c2b514e9b0e0eb68adc01915abbee9fa21f3034be5581dedaa6b15982021d00b8f71c5fdc68d698716bfc623b278216c0fcc0298497fc9c03db44e9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "special case hash",
+          "msg" : "32323537383433373033",
+          "sig" : "303e021d00e4103f4a8a814485b6b406fe8dd72206bad6a50e7126bc655c3d2285021d009bcb99693284cac26e6641a861dbec24f9cc5dd7bb535339d09ac984",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "special case hash",
+          "msg" : "393434353030393436",
+          "sig" : "303d021d009edfb833446ec8b6fc84eea34ee40a85b732e5c99da8abc8bafcc515021c5052b40f9d407ae90003299cabe3e1a587b0558127cafb31de6b2638",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "special case hash",
+          "msg" : "31363837373839343130",
+          "sig" : "303d021d00ad2647c8ff377798a6aeaed436d30c7b25fb52428829ce6424dd34e8021c28f58671d77c86da302418c51e5ab86d137ba6ef4389722bc79b8751",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 231,
+          "comment" : "special case hash",
+          "msg" : "333933323631323238",
+          "sig" : "303c021c5dfc6fad385bdb24b2b70a64fd4253405c0028bb36f4793aa3bd31fe021c1c210b74924171378992b03bb1bd78c5cfcfc879d2e5c736d35516c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 232,
+          "comment" : "special case hash",
+          "msg" : "31303733353731303935",
+          "sig" : "303d021c766bef46229695e6829dd12cd558369ec34519ba4a72dcaf6f73f7b0021d00fc015ccdd1e943b910101607d81ff1398ca6a4d70c25832b02b221e4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 233,
+          "comment" : "special case hash",
+          "msg" : "3630383837343734",
+          "sig" : "303c021c120055f90ad1290c4c5fc5faf69b215139182c770d2b55e95712442f021c01ac47f7446543d4003b039d9f54daa9d0799f98291a32df4fcd472a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 234,
+          "comment" : "special case hash",
+          "msg" : "31313932353639393632",
+          "sig" : "303d021d00f480591f6f40a25b37a035fd91954145ec342e593d09e142f25da408021c5c6ba44ff52f52c51490743d9b650916be58d06d7c1fd99dfa2eab58",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 235,
+          "comment" : "special case hash",
+          "msg" : "3930303736303933",
+          "sig" : "303c021c57daddb0cb6af939b1ea1aaf4bc72e56150c0c46a581827193e65d17021c3bc37bde4e60b789ba86a054d37f1191e0814926c1a0100168d16c17",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 236,
+          "comment" : "special case hash",
+          "msg" : "31363032383336313337",
+          "sig" : "303c021c3a74102bd1fc617018efc4fbc042e719a81b55830aac1f1dcdedec65021c4bb9fe90015a45f31c8c95dda24f54fcdb64682c13f68d4da3d1abe0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 237,
+          "comment" : "special case hash",
+          "msg" : "32303830323435363734",
+          "sig" : "303e021d00e3b6bb1b5beed048e0177e3e310fa14eb923a1e3274c0946f9275454021d00e044e0494ff46573c37007e3efa3233588f1d103ced1823c7e87e7c8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 238,
+          "comment" : "special case hash",
+          "msg" : "31373938323734363539",
+          "sig" : "303c021c3c212b5a7e65d9af44643bd62fa42a9b9cffe6bdb623e9b9e4337156021c29c8121a12427a324e5d551ff5a83d3c252e32257af2800d080817d2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 239,
+          "comment" : "special case hash",
+          "msg" : "31313535353737373230",
+          "sig" : "303c021c1630554989fffd0e35f2d9105623d73a543634c48000484c422272ca021c214da487d5e51f73814dff80a08c77bd8a83a9889a1b26a5578ba954",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 240,
+          "comment" : "special case hash",
+          "msg" : "32343332343734363634",
+          "sig" : "303d021c0a4609242f2193b94bc54f49bcf532a576e035cec50e043668574bef021d00aa68bd67624d8812002bbb3a5f530594451372d4ab36896a2929c3df",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 241,
+          "comment" : "special case hash",
+          "msg" : "32343137323832323737",
+          "sig" : "303e021d00ef9ff446e8eef3e948f4129fe8804f81f5b7f116a5383f9e8bc359e4021d00f4c7055bd98f4a7ea49d9574160eac167809f6a78b9dd220958dd0f3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 242,
+          "comment" : "special case hash",
+          "msg" : "3737383734373731",
+          "sig" : "303d021c1a6c59d85d5b3120b28c0d30bc058a92dc725d8ef450c198cc3ca522021d008b17fefc8ab1ff0bb37a93446453d40f65bc2cb9636b11207f5c90a1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048bf7e792f7c86877f1fd0552e42d80653b59e3a29e762a22810daac7eec615bbad04b58dc2a7956090b8040bb5055325bba0aa8b3a5caa6f",
+        "wx" : "08bf7e792f7c86877f1fd0552e42d80653b59e3a29e762a22810daac7",
+        "wy" : "0eec615bbad04b58dc2a7956090b8040bb5055325bba0aa8b3a5caa6f"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00048bf7e792f7c86877f1fd0552e42d80653b59e3a29e762a22810daac7eec615bbad04b58dc2a7956090b8040bb5055325bba0aa8b3a5caa6f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEi/fnkvfIaHfx/QVS5C2AZTtZ46Kedioi\ngQ2qx+7GFbutBLWNwqeVYJC4BAu1BVMlu6Cqizpcqm8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 243,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "313233343030",
+          "sig" : "3030020f00e95c1f470fc1ec22d6baa3a3d5c1021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 244,
+          "comment" : "r too large",
+          "msg" : "313233343030",
+          "sig" : "303e021d00fffffffffffffffffffffffffffffffefffffffffffffffffffffffe021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042646ff36d9697aaaed0d641117f94f60e138bab8e9912b558ae0a818ca48e45a33550c1b5bd20a00e4d9df3033c03222e87bd96a8197f2dd",
+        "wx" : "2646ff36d9697aaaed0d641117f94f60e138bab8e9912b558ae0a818",
+        "wy" : "0ca48e45a33550c1b5bd20a00e4d9df3033c03222e87bd96a8197f2dd"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00042646ff36d9697aaaed0d641117f94f60e138bab8e9912b558ae0a818ca48e45a33550c1b5bd20a00e4d9df3033c03222e87bd96a8197f2dd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEJkb/NtlpeqrtDWQRF/lPYOE4urjpkStV\niuCoGMpI5FozVQwbW9IKAOTZ3zAzwDIi6HvZaoGX8t0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 245,
+          "comment" : "r,s are large",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ea3ea2873b6fc099bfd779b0a2c23c2c4354e2fec4536f3b8e420988f97e1c7646b4eb3de616752f415ab3a6f696d1d674fb4b6732252382",
+        "wx" : "0ea3ea2873b6fc099bfd779b0a2c23c2c4354e2fec4536f3b8e420988",
+        "wy" : "0f97e1c7646b4eb3de616752f415ab3a6f696d1d674fb4b6732252382"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004ea3ea2873b6fc099bfd779b0a2c23c2c4354e2fec4536f3b8e420988f97e1c7646b4eb3de616752f415ab3a6f696d1d674fb4b6732252382",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE6j6ihztvwJm/13mwosI8LENU4v7EU287\njkIJiPl+HHZGtOs95hZ1L0Fas6b2ltHWdPtLZzIlI4I=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 246,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "303c021c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff021c3d5052691b8dc89debad360466f2a39e82e8ae2aefb77c3c92ad7cd1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0492ae54e38b4e9c6ae9943193747c4c8acc6c96f422515288e9698a13e8f3a759a1a8273c53f4b4b18bfcf78d9bb988adb3b005002dbe434c",
+        "wx" : "092ae54e38b4e9c6ae9943193747c4c8acc6c96f422515288e9698a13",
+        "wy" : "0e8f3a759a1a8273c53f4b4b18bfcf78d9bb988adb3b005002dbe434c"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000492ae54e38b4e9c6ae9943193747c4c8acc6c96f422515288e9698a13e8f3a759a1a8273c53f4b4b18bfcf78d9bb988adb3b005002dbe434c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEkq5U44tOnGrplDGTdHxMisxslvQiUVKI\n6WmKE+jzp1mhqCc8U/S0sYv8942buYits7AFAC2+Q0w=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 247,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "303d021c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff021d00bf19ab4d3ebf5a1a49d765909308daa88c2b7be3969db552ea30562b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b157315cc1aaeae64eb5b38452884195fdfe8a15fb5618284f48afe5e1fbbaad729477a45f3752b7f72ad2f9cd7dce4158a8e21b8127e8a7",
+        "wx" : "0b157315cc1aaeae64eb5b38452884195fdfe8a15fb5618284f48afe5",
+        "wy" : "0e1fbbaad729477a45f3752b7f72ad2f9cd7dce4158a8e21b8127e8a7"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b157315cc1aaeae64eb5b38452884195fdfe8a15fb5618284f48afe5e1fbbaad729477a45f3752b7f72ad2f9cd7dce4158a8e21b8127e8a7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEsVcxXMGq6uZOtbOEUohBlf3+ihX7Vhgo\nT0iv5eH7uq1ylHekXzdSt/cq0vnNfc5BWKjiG4En6Kc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 248,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020103020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0487d9d964044b5b16801f32de9f3f9066194e8bf80affa3cb0d4ddb1db5eb9b6594e6d1bcacd0fd9d67c408f789dfb95feb79a6e2fb9c4cee",
+        "wx" : "087d9d964044b5b16801f32de9f3f9066194e8bf80affa3cb0d4ddb1d",
+        "wy" : "0b5eb9b6594e6d1bcacd0fd9d67c408f789dfb95feb79a6e2fb9c4cee"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000487d9d964044b5b16801f32de9f3f9066194e8bf80affa3cb0d4ddb1db5eb9b6594e6d1bcacd0fd9d67c408f789dfb95feb79a6e2fb9c4cee",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEh9nZZARLWxaAHzLenz+QZhlOi/gK/6PL\nDU3bHbXrm2WU5tG8rND9nWfECPeJ37lf63mm4vucTO4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 249,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020103020103",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04461b435af09ede35e74dac21f9af7b1b9998213039f8785d4a4905f518b89bde69de34a482638461d09386e7193ca90ca5b3038e2a3885d1",
+        "wx" : "461b435af09ede35e74dac21f9af7b1b9998213039f8785d4a4905f5",
+        "wy" : "18b89bde69de34a482638461d09386e7193ca90ca5b3038e2a3885d1"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004461b435af09ede35e74dac21f9af7b1b9998213039f8785d4a4905f518b89bde69de34a482638461d09386e7193ca90ca5b3038e2a3885d1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAERhtDWvCe3jXnTawh+a97G5mYITA5+Hhd\nSkkF9Ri4m95p3jSkgmOEYdCThucZPKkMpbMDjio4hdE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 250,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020103020104",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 251,
+          "comment" : "r is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a40020104",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048093af8db04b3dd2e7c3c59bb64a832c2fb8e8e141bae7ba1534950a10c5e87aecbd1fcdfc36cd18d41b3238b2ac613eb7c9de988d881816",
+        "wx" : "08093af8db04b3dd2e7c3c59bb64a832c2fb8e8e141bae7ba1534950a",
+        "wy" : "10c5e87aecbd1fcdfc36cd18d41b3238b2ac613eb7c9de988d881816"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00048093af8db04b3dd2e7c3c59bb64a832c2fb8e8e141bae7ba1534950a10c5e87aecbd1fcdfc36cd18d41b3238b2ac613eb7c9de988d881816",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEgJOvjbBLPdLnw8WbtkqDLC+46OFBuue6\nFTSVChDF6HrsvR/N/DbNGNQbMjiyrGE+t8nemI2IGBY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 252,
+          "comment" : "s is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3022020103021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c6f00c4",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c6d71f4ba0933f1269f7d6df83fd0c9c67254f101dcc126dc15faa3e3c45dc9fedc71c9f2b0dd1b12b656241f5e335066f3f925bdbcfe98f",
+        "wx" : "0c6d71f4ba0933f1269f7d6df83fd0c9c67254f101dcc126dc15faa3e",
+        "wy" : "3c45dc9fedc71c9f2b0dd1b12b656241f5e335066f3f925bdbcfe98f"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004c6d71f4ba0933f1269f7d6df83fd0c9c67254f101dcc126dc15faa3e3c45dc9fedc71c9f2b0dd1b12b656241f5e335066f3f925bdbcfe98f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAExtcfS6CTPxJp99bfg/0MnGclTxAdzBJt\nwV+qPjxF3J/txxyfKw3RsStlYkH14zUGbz+SW9vP6Y8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 253,
+          "comment" : "small r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302302020100021d00c993264c993264c993264c99326411d2e55b3214a8d67528812a55ab",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04beb9d8dcba48146b9032688ecea947a231e7d0e6ce17d76b56ed634835503f3b4af414870ef03383784b1d846b3e07b8e9fc2d6190a3bfda",
+        "wx" : "0beb9d8dcba48146b9032688ecea947a231e7d0e6ce17d76b56ed6348",
+        "wy" : "35503f3b4af414870ef03383784b1d846b3e07b8e9fc2d6190a3bfda"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004beb9d8dcba48146b9032688ecea947a231e7d0e6ce17d76b56ed634835503f3b4af414870ef03383784b1d846b3e07b8e9fc2d6190a3bfda",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEvrnY3LpIFGuQMmiOzqlHojHn0ObOF9dr\nVu1jSDVQPztK9BSHDvAzg3hLHYRrPge46fwtYZCjv9o=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 254,
+          "comment" : "smallish r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302702072d9b4d347952cc021c3e85d56474b5c55fbe86608442a84b2bf093b7d75f53a47250e1c70c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041955ba3f90e7a739471a5d182b594c9747eb49d5356203f3bb8b939c807d88ce3a0885bfa5b5b7f6e9beb18285e7130524b6c1498b3269ee",
+        "wx" : "1955ba3f90e7a739471a5d182b594c9747eb49d5356203f3bb8b939c",
+        "wy" : "0807d88ce3a0885bfa5b5b7f6e9beb18285e7130524b6c1498b3269ee"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00041955ba3f90e7a739471a5d182b594c9747eb49d5356203f3bb8b939c807d88ce3a0885bfa5b5b7f6e9beb18285e7130524b6c1498b3269ee",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEGVW6P5DnpzlHGl0YK1lMl0frSdU1YgPz\nu4uTnIB9iM46CIW/pbW39um+sYKF5xMFJLbBSYsyae4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 255,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "313233343030",
+          "sig" : "302d020d1033e67e37b32b445580bf4efb021c02fd02fd02fd02fd02fd02fd02fd0043a4fd2da317247308c74dc6b8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045cb9e5a5071f2b37aa3a5e5f389f54f996b0bc8a132ecb6885318fbf4ec5f8b93d8bf2a3b64fa7cac316392562c46567963c43a69f7a37fd",
+        "wx" : "5cb9e5a5071f2b37aa3a5e5f389f54f996b0bc8a132ecb6885318fbf",
+        "wy" : "4ec5f8b93d8bf2a3b64fa7cac316392562c46567963c43a69f7a37fd"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00045cb9e5a5071f2b37aa3a5e5f389f54f996b0bc8a132ecb6885318fbf4ec5f8b93d8bf2a3b64fa7cac316392562c46567963c43a69f7a37fd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEXLnlpQcfKzeqOl5fOJ9U+ZawvIoTLsto\nhTGPv07F+Lk9i/Kjtk+nysMWOSVixGVnljxDpp96N/0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 256,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "313233343030",
+          "sig" : "302302020100021d00d05434abacd859ed74185e75b751c6d9f60c7921dacfbb8e19cdba8e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047b34ef8723a4309c0fa8a7ec3a783477652a82892370f6763314fe7bdee663853071e35fd3c76f991d7843c5e168ca659b93bd6015518fba",
+        "wx" : "7b34ef8723a4309c0fa8a7ec3a783477652a82892370f6763314fe7b",
+        "wy" : "0dee663853071e35fd3c76f991d7843c5e168ca659b93bd6015518fba"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00047b34ef8723a4309c0fa8a7ec3a783477652a82892370f6763314fe7bdee663853071e35fd3c76f991d7843c5e168ca659b93bd6015518fba",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEezTvhyOkMJwPqKfsOng0d2UqgokjcPZ2\nMxT+e97mY4UwceNf08dvmR14Q8XhaMplm5O9YBVRj7o=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 257,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302e020d062522bbd3ecbe7c39e93e7c24021d00d05434abacd859ed74185e75b751c6d9f60c7921dacfbb8e19cdba8e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0403f26a9c13979cf5d090ea25dc966398022ceec31504abc4b10f76767d577dcf47e10e384c6b9a229a455a9fd33e54fe7960b8b0160aef16",
+        "wx" : "3f26a9c13979cf5d090ea25dc966398022ceec31504abc4b10f7676",
+        "wy" : "7d577dcf47e10e384c6b9a229a455a9fd33e54fe7960b8b0160aef16"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000403f26a9c13979cf5d090ea25dc966398022ceec31504abc4b10f76767d577dcf47e10e384c6b9a229a455a9fd33e54fe7960b8b0160aef16",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEA/JqnBOXnPXQkOol3JZjmAIs7sMVBKvE\nsQ92dn1Xfc9H4Q44TGuaIppFWp/TPlT+eWC4sBYK7xY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 258,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "313233343030",
+          "sig" : "303d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c29bd021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b671296dd5f690502e4b1500e4acb4c82d3aa8dfbc5868a643f86a3ca46ba8c3a7b823259522291e2416232276cca8503cc8dbf941f1d93d",
+        "wx" : "0b671296dd5f690502e4b1500e4acb4c82d3aa8dfbc5868a643f86a3c",
+        "wy" : "0a46ba8c3a7b823259522291e2416232276cca8503cc8dbf941f1d93d"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b671296dd5f690502e4b1500e4acb4c82d3aa8dfbc5868a643f86a3ca46ba8c3a7b823259522291e2416232276cca8503cc8dbf941f1d93d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEtnEpbdX2kFAuSxUA5Ky0yC06qN+8WGim\nQ/hqPKRrqMOnuCMllSIpHiQWIyJ2zKhQPMjb+UHx2T0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 259,
+          "comment" : "s == 1",
+          "msg" : "313233343030",
+          "sig" : "3021021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 260,
+          "comment" : "s == 0",
+          "msg" : "313233343030",
+          "sig" : "3021021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0476e34b57a8c61df59cb0b7921cec6e5422344033f7accb7b3179e682cefd0a848309d1decf98a3b9e333691b95c17821cb681137630c02e2",
+        "wx" : "76e34b57a8c61df59cb0b7921cec6e5422344033f7accb7b3179e682",
+        "wy" : "0cefd0a848309d1decf98a3b9e333691b95c17821cb681137630c02e2"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000476e34b57a8c61df59cb0b7921cec6e5422344033f7accb7b3179e682cefd0a848309d1decf98a3b9e333691b95c17821cb681137630c02e2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEduNLV6jGHfWcsLeSHOxuVCI0QDP3rMt7\nMXnmgs79CoSDCdHez5ijueMzaRuVwXghy2gRN2MMAuI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 261,
+          "comment" : "point at infinity during verify",
+          "msg" : "313233343030",
+          "sig" : "303c021c7fffffffffffffffffffffffffff8b51705c781f09ee94a2ae2e151e021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b5c09b4851a67371eee7bbf02451e5208c40de61bc1a33df2710b384dcce4e5b83c32a800e8de28fa936d582cdcad185e894caac797f1d14",
+        "wx" : "0b5c09b4851a67371eee7bbf02451e5208c40de61bc1a33df2710b384",
+        "wy" : "0dcce4e5b83c32a800e8de28fa936d582cdcad185e894caac797f1d14"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b5c09b4851a67371eee7bbf02451e5208c40de61bc1a33df2710b384dcce4e5b83c32a800e8de28fa936d582cdcad185e894caac797f1d14",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEtcCbSFGmc3Hu57vwJFHlIIxA3mG8GjPf\nJxCzhNzOTluDwyqADo3ij6k21YLNytGF6JTKrHl/HRQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 262,
+          "comment" : "u1 == 1",
+          "msg" : "313233343030",
+          "sig" : "303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04941e283be31300bfd4f6a12b876fd3267352551cc49e9eef73f76538c115e5fe3b92f643c6cef1c58f3f8657574d1f64957d4880995cde83",
+        "wx" : "0941e283be31300bfd4f6a12b876fd3267352551cc49e9eef73f76538",
+        "wy" : "0c115e5fe3b92f643c6cef1c58f3f8657574d1f64957d4880995cde83"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004941e283be31300bfd4f6a12b876fd3267352551cc49e9eef73f76538c115e5fe3b92f643c6cef1c58f3f8657574d1f64957d4880995cde83",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAElB4oO+MTAL/U9qErh2/TJnNSVRzEnp7v\nc/dlOMEV5f47kvZDxs7xxY8/hldXTR9klX1IgJlc3oM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 263,
+          "comment" : "u1 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "303d021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021d008ac44bff876cbf7e2842eec13b63fcb3d6e7360aca5698f3ef0f1811",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0443c9ccd08a80bca18022722b0bdcd790d82a3ef8b65c3f34204bb4729ee1c1f00598130b2313a3e38a3798d03dac665cff20f36ce8a2024a",
+        "wx" : "43c9ccd08a80bca18022722b0bdcd790d82a3ef8b65c3f34204bb472",
+        "wy" : "09ee1c1f00598130b2313a3e38a3798d03dac665cff20f36ce8a2024a"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000443c9ccd08a80bca18022722b0bdcd790d82a3ef8b65c3f34204bb4729ee1c1f00598130b2313a3e38a3798d03dac665cff20f36ce8a2024a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEQ8nM0IqAvKGAInIrC9zXkNgqPvi2XD80\nIEu0cp7hwfAFmBMLIxOj44o3mNA9rGZc/yDzbOiiAko=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 264,
+          "comment" : "u2 == 1",
+          "msg" : "313233343030",
+          "sig" : "303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d958e418fad1c5ea5c923e6185e03ed5539d3f5f58dfac8bb9f104596997e408c97be5fdc037a5c004389d4b97eb1f54635e985853c1f082",
+        "wx" : "0d958e418fad1c5ea5c923e6185e03ed5539d3f5f58dfac8bb9f10459",
+        "wy" : "6997e408c97be5fdc037a5c004389d4b97eb1f54635e985853c1f082"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004d958e418fad1c5ea5c923e6185e03ed5539d3f5f58dfac8bb9f104596997e408c97be5fdc037a5c004389d4b97eb1f54635e985853c1f082",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE2VjkGPrRxepckj5hheA+1VOdP19Y36yL\nufEEWWmX5AjJe+X9wDelwAQ4nUuX6x9UY16YWFPB8II=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 265,
+          "comment" : "u2 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "303d021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021d00aaaaaaaaaaaaaaaaaaaaaaaaaaaa0f17407b4ad40d3e1b8392e81c29",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d629b434c9b5d157bd72e114fd839553f7f0e94600934a0a49e59aa4713a13c01775e75e2ebae75d9e29d2506184177b7dd0868693873596",
+        "wx" : "0d629b434c9b5d157bd72e114fd839553f7f0e94600934a0a49e59aa4",
+        "wy" : "713a13c01775e75e2ebae75d9e29d2506184177b7dd0868693873596"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004d629b434c9b5d157bd72e114fd839553f7f0e94600934a0a49e59aa4713a13c01775e75e2ebae75d9e29d2506184177b7dd0868693873596",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE1im0NMm10Ve9cuEU/YOVU/fw6UYAk0oK\nSeWapHE6E8AXdedeLrrnXZ4p0lBhhBd7fdCGhpOHNZY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 266,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00d1be91557d866ad5f2945b14ec3317bc43c1338fd06af6496201cce2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043d2e9bb9a712bf3ad42ac30659fdbda9be9956537f9f37cd05f0ff377d5982d6d9266d774942c44d9eb3501051d3b9688610131e7856ef36",
+        "wx" : "3d2e9bb9a712bf3ad42ac30659fdbda9be9956537f9f37cd05f0ff37",
+        "wy" : "7d5982d6d9266d774942c44d9eb3501051d3b9688610131e7856ef36"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00043d2e9bb9a712bf3ad42ac30659fdbda9be9956537f9f37cd05f0ff377d5982d6d9266d774942c44d9eb3501051d3b9688610131e7856ef36",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEPS6buacSvzrUKsMGWf29qb6ZVlN/nzfN\nBfD/N31ZgtbZJm13SULETZ6zUBBR07lohhATHnhW7zY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 267,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c7ac54a381d9bd3f2698359d6f658b5e4167d15a75b576e82d2efbd37",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a0be2f10144b9b42b016f1bd9fca30e4c24aae4775596c7cdb07ae60d60ff3a70f1541631f6087d3f3b3fe376d2305b50b94821106412479",
+        "wx" : "0a0be2f10144b9b42b016f1bd9fca30e4c24aae4775596c7cdb07ae60",
+        "wy" : "0d60ff3a70f1541631f6087d3f3b3fe376d2305b50b94821106412479"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004a0be2f10144b9b42b016f1bd9fca30e4c24aae4775596c7cdb07ae60d60ff3a70f1541631f6087d3f3b3fe376d2305b50b94821106412479",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEoL4vEBRLm0KwFvG9n8ow5MJKrkd1WWx8\n2weuYNYP86cPFUFjH2CH0/Oz/jdtIwW1C5SCEQZBJHk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 268,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c4fbb063e82402e16fe14edda4d7986b0b88344a1f53b0e2684ee7e31",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044d74397a586c8ac5e326bed03720bde7037e4a07aee7209f70493cab106778bfd081d17ab6dcb8fd8a454962941c26ecc19cda9fb77719db",
+        "wx" : "4d74397a586c8ac5e326bed03720bde7037e4a07aee7209f70493cab",
+        "wy" : "106778bfd081d17ab6dcb8fd8a454962941c26ecc19cda9fb77719db"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00044d74397a586c8ac5e326bed03720bde7037e4a07aee7209f70493cab106778bfd081d17ab6dcb8fd8a454962941c26ecc19cda9fb77719db",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAETXQ5elhsisXjJr7QNyC95wN+Sgeu5yCf\ncEk8qxBneL/QgdF6tty4/YpFSWKUHCbswZzan7d3Gds=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 269,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00d3be5f50d726f99b8ac44bff876bfe78dd7ae630d227ef0ba87ae39b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048c2f149b1738243f81a6f12135395a2ba2718863622e66e33efc241f5638cf6ae9cfb39578cf3a719702052e5e9e940216c5136dcb6ef085",
+        "wx" : "08c2f149b1738243f81a6f12135395a2ba2718863622e66e33efc241f",
+        "wy" : "5638cf6ae9cfb39578cf3a719702052e5e9e940216c5136dcb6ef085"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00048c2f149b1738243f81a6f12135395a2ba2718863622e66e33efc241f5638cf6ae9cfb39578cf3a719702052e5e9e940216c5136dcb6ef085",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEjC8Umxc4JD+BpvEhNTlaK6JxiGNiLmbj\nPvwkH1Y4z2rpz7OVeM86cZcCBS5enpQCFsUTbctu8IU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 270,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00e5f50d726f99b8ac44bff876cbf710e47f9087d1afdfb1dab6d6daf1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ad5227e48afaa165e7b97ef8210687556e10643fda8a377aaf4f5bf412e86d4ae55f4460aba6a932f307ee78efdc136e9a3df6313100bf4f",
+        "wx" : "0ad5227e48afaa165e7b97ef8210687556e10643fda8a377aaf4f5bf4",
+        "wy" : "12e86d4ae55f4460aba6a932f307ee78efdc136e9a3df6313100bf4f"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004ad5227e48afaa165e7b97ef8210687556e10643fda8a377aaf4f5bf412e86d4ae55f4460aba6a932f307ee78efdc136e9a3df6313100bf4f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAErVIn5Ir6oWXnuX74IQaHVW4QZD/aijd6\nr09b9BLobUrlX0Rgq6apMvMH7njv3BNumj32MTEAv08=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 271,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00cbea1ae4df337158897ff0ed97ef0b261e681f654be23a7011518ba5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043fb94a3165ecdef43fa27907ed075caf52c25420ac7bc7bb90408992023c4d7b4775b591ae223dd4da9ceaabd73b9743ddab8b40576e393f",
+        "wx" : "3fb94a3165ecdef43fa27907ed075caf52c25420ac7bc7bb90408992",
+        "wy" : "23c4d7b4775b591ae223dd4da9ceaabd73b9743ddab8b40576e393f"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00043fb94a3165ecdef43fa27907ed075caf52c25420ac7bc7bb90408992023c4d7b4775b591ae223dd4da9ceaabd73b9743ddab8b40576e393f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEP7lKMWXs3vQ/onkH7Qdcr1LCVCCse8e7\nkECJkgI8TXtHdbWRriI91Nqc6qvXO5dD3auLQFduOT8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 272,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00d726f99b8ac44bff876cbf7e28422aa07ec3cb1d9472bd704f4029f0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e45fcf0a7f4dc2a308dc7868251423fbf71a205a9546850a01a732fc9a73ca4d41175076f2f362b276ecb0ccdb6e0bb30c4a1b35c2e3ed82",
+        "wx" : "0e45fcf0a7f4dc2a308dc7868251423fbf71a205a9546850a01a732fc",
+        "wy" : "09a73ca4d41175076f2f362b276ecb0ccdb6e0bb30c4a1b35c2e3ed82"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004e45fcf0a7f4dc2a308dc7868251423fbf71a205a9546850a01a732fc9a73ca4d41175076f2f362b276ecb0ccdb6e0bb30c4a1b35c2e3ed82",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE5F/PCn9NwqMI3HhoJRQj+/caIFqVRoUK\nAacy/Jpzyk1BF1B28vNisnbssMzbbguzDEobNcLj7YI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 273,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d009720b755413cca9506b5d27589e58ac4bed856762ba7ae20ab5b43cc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043c59e13982fd9c1a45991b1e9d79e939a52a62ca479764f1477e28131b004c9bffd7f00c05e3168c625cc93ab7a0f1ba8d6fa26a4d5162cb",
+        "wx" : "3c59e13982fd9c1a45991b1e9d79e939a52a62ca479764f1477e2813",
+        "wy" : "1b004c9bffd7f00c05e3168c625cc93ab7a0f1ba8d6fa26a4d5162cb"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00043c59e13982fd9c1a45991b1e9d79e939a52a62ca479764f1477e28131b004c9bffd7f00c05e3168c625cc93ab7a0f1ba8d6fa26a4d5162cb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEPFnhOYL9nBpFmRsenXnpOaUqYspHl2Tx\nR34oExsATJv/1/AMBeMWjGJcyTq3oPG6jW+iak1RYss=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 274,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c2e416eaa8279952a0d6ba4eb13cbfee69cf7bcae437232fbfa5a5d5b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c6b8ff152d7a1b7a99ce3483bdeaaf5bd2ce64dc6b0f89cf3544b87c053ab6cf9cb510dc1440ab4e412a167f4c69365fcfc97f31d5ba4581",
+        "wx" : "0c6b8ff152d7a1b7a99ce3483bdeaaf5bd2ce64dc6b0f89cf3544b87c",
+        "wy" : "53ab6cf9cb510dc1440ab4e412a167f4c69365fcfc97f31d5ba4581"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004c6b8ff152d7a1b7a99ce3483bdeaaf5bd2ce64dc6b0f89cf3544b87c053ab6cf9cb510dc1440ab4e412a167f4c69365fcfc97f31d5ba4581",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAExrj/FS16G3qZzjSDveqvW9LOZNxrD4nP\nNUS4fAU6ts+ctRDcFECrTkEqFn9MaTZfz8l/MdW6RYE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 275,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00c56225ffc3b65fbf142177609db189ab5bd013246f19e11ca5b5a127",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047c0772fb6553c0ec0dd1f73b5db380764d9f2f7afb4eac1e774dacd56e2e5de0db63bf03cf9675eae6d2dfe5424e79ab394951c9b60ad5df",
+        "wx" : "7c0772fb6553c0ec0dd1f73b5db380764d9f2f7afb4eac1e774dacd5",
+        "wy" : "6e2e5de0db63bf03cf9675eae6d2dfe5424e79ab394951c9b60ad5df"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00047c0772fb6553c0ec0dd1f73b5db380764d9f2f7afb4eac1e774dacd56e2e5de0db63bf03cf9675eae6d2dfe5424e79ab394951c9b60ad5df",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEfAdy+2VTwOwN0fc7XbOAdk2fL3r7Tqwe\nd02s1W4uXeDbY78Dz5Z16ubS3+VCTnmrOUlRybYK1d8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 276,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00a7dd831f4120170b7f0a76ed26bc4ea9cc9e1a70048c1bb5f0a55437",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044108e0ccd47cba09fb7ed4d9f3455823780965157861c1bf8f93d34b46d6fdb71e9e89adaae71376b13fd17644b11eed00d498783da0ba1a",
+        "wx" : "4108e0ccd47cba09fb7ed4d9f3455823780965157861c1bf8f93d34b",
+        "wy" : "46d6fdb71e9e89adaae71376b13fd17644b11eed00d498783da0ba1a"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00044108e0ccd47cba09fb7ed4d9f3455823780965157861c1bf8f93d34b46d6fdb71e9e89adaae71376b13fd17644b11eed00d498783da0ba1a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEQQjgzNR8ugn7ftTZ80VYI3gJZRV4YcG/\nj5PTS0bW/bcenomtqucTdrE/0XZEsR7tANSYeD2guho=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 277,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c7fffffffffffffffffffffffffffb2364ae85014b149b86c741eb8be",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042f2da40a1b72f67ba63613a243119c41c7252839cf106e86b5d8e6e35a1e0e2fc49b4f316f0c0e7236785749eb34ce923c23aef330af8733",
+        "wx" : "2f2da40a1b72f67ba63613a243119c41c7252839cf106e86b5d8e6e3",
+        "wy" : "5a1e0e2fc49b4f316f0c0e7236785749eb34ce923c23aef330af8733"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00042f2da40a1b72f67ba63613a243119c41c7252839cf106e86b5d8e6e35a1e0e2fc49b4f316f0c0e7236785749eb34ce923c23aef330af8733",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAELy2kChty9numNhOiQxGcQcclKDnPEG6G\ntdjm41oeDi/Em08xbwwOcjZ4V0nrNM6SPCOu8zCvhzM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 278,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00855f5b2dc8e46ec428a593f73219cf65dae793e8346e30cc3701309c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047dc09710f4f586af05b08f0c9dcd48b1308733c97767fc286d1c72834353a704c7950b8f4a11394bc8db06adccf19d8ed95c7f214a173137",
+        "wx" : "7dc09710f4f586af05b08f0c9dcd48b1308733c97767fc286d1c7283",
+        "wy" : "4353a704c7950b8f4a11394bc8db06adccf19d8ed95c7f214a173137"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00047dc09710f4f586af05b08f0c9dcd48b1308733c97767fc286d1c72834353a704c7950b8f4a11394bc8db06adccf19d8ed95c7f214a173137",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEfcCXEPT1hq8FsI8Mnc1IsTCHM8l3Z/wo\nbRxyg0NTpwTHlQuPShE5S8jbBq3M8Z2O2Vx/IUoXMTc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 279,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c2db5f61aea817276af2064e104c7a30e32034cb526dd0aacfa56566f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04dbb439e2c3e9d1822b94ccc7d98c9fcb668e65dd6a759ad2dfdcd32882663234e6da512d7d7d5fe79156ad0e19ffc62d618e3cf48276106d",
+        "wx" : "0dbb439e2c3e9d1822b94ccc7d98c9fcb668e65dd6a759ad2dfdcd328",
+        "wy" : "082663234e6da512d7d7d5fe79156ad0e19ffc62d618e3cf48276106d"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004dbb439e2c3e9d1822b94ccc7d98c9fcb668e65dd6a759ad2dfdcd32882663234e6da512d7d7d5fe79156ad0e19ffc62d618e3cf48276106d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE27Q54sPp0YIrlMzH2Yyfy2aOZd1qdZrS\n39zTKIJmMjTm2lEtfX1f55FWrQ4Z/8YtYY489IJ2EG0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 280,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d0084a6c7513e5f48c07fffffffffff8713f3cba1293e4f3e95597fe6bd",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e012dc20cca5bd2adfaa27f57419596ce09ed0f18a9148e30a0f6ed255beca1b5e3e2485ef9537ae48a67b72dbcf6d7b33372023a5c443e8",
+        "wx" : "0e012dc20cca5bd2adfaa27f57419596ce09ed0f18a9148e30a0f6ed2",
+        "wy" : "55beca1b5e3e2485ef9537ae48a67b72dbcf6d7b33372023a5c443e8"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004e012dc20cca5bd2adfaa27f57419596ce09ed0f18a9148e30a0f6ed255beca1b5e3e2485ef9537ae48a67b72dbcf6d7b33372023a5c443e8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE4BLcIMylvSrfqif1dBlZbOCe0PGKkUjj\nCg9u0lW+yhtePiSF75U3rkime3Lbz217MzcgI6XEQ+g=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 281,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c6c7513e5f48c07ffffffffffffff9d21fd1b31544cb13ca86a75b25e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c510ab34abd4855c54d62407abe6ca090c73ba49aca9de9bf117bca242b3b00c272c22681af7c255120fac148ad73c81b47846e4ad2f5627",
+        "wx" : "0c510ab34abd4855c54d62407abe6ca090c73ba49aca9de9bf117bca2",
+        "wy" : "42b3b00c272c22681af7c255120fac148ad73c81b47846e4ad2f5627"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004c510ab34abd4855c54d62407abe6ca090c73ba49aca9de9bf117bca242b3b00c272c22681af7c255120fac148ad73c81b47846e4ad2f5627",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAExRCrNKvUhVxU1iQHq+bKCQxzukmsqd6b\n8Re8okKzsAwnLCJoGvfCVRIPrBSK1zyBtHhG5K0vVic=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 282,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00d8ea27cbe9180fffffffffffffff3a43fa3662a899627950d4eb64bc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0408a6e167536a47aaa224fec21ce077642efdb97d93ae16b9672279f433fb9f1abb25f2c0c3e6008ac857ede4a89ca8d9d08b8996614969ac",
+        "wx" : "08a6e167536a47aaa224fec21ce077642efdb97d93ae16b9672279f4",
+        "wy" : "33fb9f1abb25f2c0c3e6008ac857ede4a89ca8d9d08b8996614969ac"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000408a6e167536a47aaa224fec21ce077642efdb97d93ae16b9672279f433fb9f1abb25f2c0c3e6008ac857ede4a89ca8d9d08b8996614969ac",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAECKbhZ1NqR6qiJP7CHOB3ZC79uX2Trha5\nZyJ59DP7nxq7JfLAw+YAishX7eSonKjZ0IuJlmFJaaw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 283,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c3e5f48c07fffffffffffffffffffc724968c0ecf9ed783744a7337b3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041a83e185fcf30e6c69cf292e497d63cc04e6fd07cb9365a74be3c39c6b2d56247df49cf94176c4e8efc84ec710cd0d614dd066c16f6ad3e0",
+        "wx" : "1a83e185fcf30e6c69cf292e497d63cc04e6fd07cb9365a74be3c39c",
+        "wy" : "6b2d56247df49cf94176c4e8efc84ec710cd0d614dd066c16f6ad3e0"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00041a83e185fcf30e6c69cf292e497d63cc04e6fd07cb9365a74be3c39c6b2d56247df49cf94176c4e8efc84ec710cd0d614dd066c16f6ad3e0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEGoPhhfzzDmxpzykuSX1jzATm/QfLk2Wn\nS+PDnGstViR99Jz5QXbE6O/ITscQzQ1hTdBmwW9q0+A=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 284,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00bfffffffffffffffffffffffffff3d87bb44c833bb384d0f224ccdde",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042d59efd841a44b83fd42e6a2984a53fa93ad242c11678f92202cccfb95bcaf0b2f6eb0e6d4d83e3260e037d3dc0e48ab6c4141ce6b56cad0",
+        "wx" : "2d59efd841a44b83fd42e6a2984a53fa93ad242c11678f92202cccfb",
+        "wy" : "095bcaf0b2f6eb0e6d4d83e3260e037d3dc0e48ab6c4141ce6b56cad0"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00042d59efd841a44b83fd42e6a2984a53fa93ad242c11678f92202cccfb95bcaf0b2f6eb0e6d4d83e3260e037d3dc0e48ab6c4141ce6b56cad0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAELVnv2EGkS4P9QuaimEpT+pOtJCwRZ4+S\nICzM+5W8rwsvbrDm1Ng+MmDgN9PcDkirbEFBzmtWytA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 285,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c7fffffffffffffffffffffffffff646c95d0a029629370d8e83d717f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041161c7add6f67f995b93e19eb18bd5e73fd71d6bb10dceef0b792e9c08c44cef9826b4ed67508c09d07ec857a0ea49ed1a7f1fa2c74cb838",
+        "wx" : "1161c7add6f67f995b93e19eb18bd5e73fd71d6bb10dceef0b792e9c",
+        "wy" : "08c44cef9826b4ed67508c09d07ec857a0ea49ed1a7f1fa2c74cb838"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00041161c7add6f67f995b93e19eb18bd5e73fd71d6bb10dceef0b792e9c08c44cef9826b4ed67508c09d07ec857a0ea49ed1a7f1fa2c74cb838",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEEWHHrdb2f5lbk+GesYvV5z/XHWuxDc7v\nC3kunAjETO+YJrTtZ1CMCdB+yFeg6kntGn8fosdMuDg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 286,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c3fffffffffffffffffffffffffff8b51705c781f09ee94a2ae2e1520",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0484dc3d2ebfcf3480713baeff30ad0781bc8c4d06ab6ddd4f7f1045af7570537c5d71a78b1a041aca0fe35f642824abda8c3ff2e9fcf5c8cb",
+        "wx" : "084dc3d2ebfcf3480713baeff30ad0781bc8c4d06ab6ddd4f7f1045af",
+        "wy" : "7570537c5d71a78b1a041aca0fe35f642824abda8c3ff2e9fcf5c8cb"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000484dc3d2ebfcf3480713baeff30ad0781bc8c4d06ab6ddd4f7f1045af7570537c5d71a78b1a041aca0fe35f642824abda8c3ff2e9fcf5c8cb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEhNw9Lr/PNIBxO67/MK0HgbyMTQarbd1P\nfxBFr3VwU3xdcaeLGgQayg/jX2QoJKvajD/y6fz1yMs=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 287,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d0096dafb0d7540b93b5790327082635cd8895e1e799d5d19f92b594056",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041767574e645c550ef3d353f76d4428f9616ac288b36378857de332629fe09825a57f3a0ec11189f4560272297ab6d5e095401febb60d0dc9",
+        "wx" : "1767574e645c550ef3d353f76d4428f9616ac288b36378857de33262",
+        "wy" : "09fe09825a57f3a0ec11189f4560272297ab6d5e095401febb60d0dc9"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00041767574e645c550ef3d353f76d4428f9616ac288b36378857de332629fe09825a57f3a0ec11189f4560272297ab6d5e095401febb60d0dc9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEF2dXTmRcVQ7z01P3bUQo+WFqwoizY3iF\nfeMyYp/gmCWlfzoOwRGJ9FYCcil6ttXglUAf67YNDck=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 288,
+          "comment" : "point duplication during verification",
+          "msg" : "313233343030",
+          "sig" : "303d021d00c44503dae85dd5210780f02928b3d927171c578f8603d16b240663c7021c1ef359e4bd146f63d8155c5c2523fa3353c9820f84f28150bad3819a",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041767574e645c550ef3d353f76d4428f9616ac288b36378857de33262601f67da5a80c5f13eee760ba9fd8dd585492a1f6abfe01449f2f238",
+        "wx" : "1767574e645c550ef3d353f76d4428f9616ac288b36378857de33262",
+        "wy" : "601f67da5a80c5f13eee760ba9fd8dd585492a1f6abfe01449f2f238"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00041767574e645c550ef3d353f76d4428f9616ac288b36378857de33262601f67da5a80c5f13eee760ba9fd8dd585492a1f6abfe01449f2f238",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEF2dXTmRcVQ7z01P3bUQo+WFqwoizY3iF\nfeMyYmAfZ9pagMXxPu52C6n9jdWFSSofar/gFEny8jg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 289,
+          "comment" : "duplication bug",
+          "msg" : "313233343030",
+          "sig" : "303d021d00c44503dae85dd5210780f02928b3d927171c578f8603d16b240663c7021c1ef359e4bd146f63d8155c5c2523fa3353c9820f84f28150bad3819a",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e2ef8c8ccb58eba287d9279b349e7652cca3e7cda188a5f179d77142f87594f3664c0faf7b59670e353a370d1d68ad89d6a1e246b4d03bee",
+        "wx" : "0e2ef8c8ccb58eba287d9279b349e7652cca3e7cda188a5f179d77142",
+        "wy" : "0f87594f3664c0faf7b59670e353a370d1d68ad89d6a1e246b4d03bee"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004e2ef8c8ccb58eba287d9279b349e7652cca3e7cda188a5f179d77142f87594f3664c0faf7b59670e353a370d1d68ad89d6a1e246b4d03bee",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE4u+MjMtY66KH2SebNJ52Usyj582hiKXx\neddxQvh1lPNmTA+ve1lnDjU6Nw0daK2J1qHiRrTQO+4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 290,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "313233343030",
+          "sig" : "303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c33333333333333333333333333330486f9be9672d0c5d50ddf45a20c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b8bf3ef9646abfffb84220104ec996a92cef33f9328ec4cb1ea699484fea51a0de9e9d801babd42ca0924b36498bc5900fbeb9cbd5ad9c1a",
+        "wx" : "0b8bf3ef9646abfffb84220104ec996a92cef33f9328ec4cb1ea69948",
+        "wy" : "4fea51a0de9e9d801babd42ca0924b36498bc5900fbeb9cbd5ad9c1a"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b8bf3ef9646abfffb84220104ec996a92cef33f9328ec4cb1ea699484fea51a0de9e9d801babd42ca0924b36498bc5900fbeb9cbd5ad9c1a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEuL8++WRqv/+4QiAQTsmWqSzvM/kyjsTL\nHqaZSE/qUaDenp2AG6vULKCSSzZJi8WQD765y9WtnBo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 291,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "303c021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04286e80429c8796dcd885d95f960d209fed19f87e2ce423d166c8e2202e30882c09970d5dd58b67e5bb80affec74248a9cb4a783384c8b6a0",
+        "wx" : "286e80429c8796dcd885d95f960d209fed19f87e2ce423d166c8e220",
+        "wy" : "2e30882c09970d5dd58b67e5bb80affec74248a9cb4a783384c8b6a0"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004286e80429c8796dcd885d95f960d209fed19f87e2ce423d166c8e2202e30882c09970d5dd58b67e5bb80affec74248a9cb4a783384c8b6a0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEKG6AQpyHltzYhdlflg0gn+0Z+H4s5CPR\nZsjiIC4wiCwJlw1d1Ytn5buAr/7HQkipy0p4M4TItqA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 292,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303d021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021d00db6db6db6db6db6db6db6db6db6ceed4c09e84c77ebd9116e17391eb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045599a3faf96aba7302bd3d98cfde69525b7292762383f4a0b5c310393faa45feb6c35d2b7bf25ffc633c420ebfc4e715765302c5a11ac793",
+        "wx" : "5599a3faf96aba7302bd3d98cfde69525b7292762383f4a0b5c31039",
+        "wy" : "3faa45feb6c35d2b7bf25ffc633c420ebfc4e715765302c5a11ac793"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00045599a3faf96aba7302bd3d98cfde69525b7292762383f4a0b5c310393faa45feb6c35d2b7bf25ffc633c420ebfc4e715765302c5a11ac793",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEVZmj+vlqunMCvT2Yz95pUltyknYjg/Sg\ntcMQOT+qRf62w10re/Jf/GM8Qg6/xOcVdlMCxaEax5M=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 293,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303c021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021c33333333333333333333333333330486f9be9672d0c5d50ddf45a20c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045b5234b8db6bbd396eae7d1ca4e6d877824c98cde9fbfab34b6b8ccb1f38ae9f87adc3e6d2474eb5e3cd9aeff0927320214be550f5e62ed4",
+        "wx" : "5b5234b8db6bbd396eae7d1ca4e6d877824c98cde9fbfab34b6b8ccb",
+        "wy" : "1f38ae9f87adc3e6d2474eb5e3cd9aeff0927320214be550f5e62ed4"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00045b5234b8db6bbd396eae7d1ca4e6d877824c98cde9fbfab34b6b8ccb1f38ae9f87adc3e6d2474eb5e3cd9aeff0927320214be550f5e62ed4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEW1I0uNtrvTlurn0cpObYd4JMmM3p+/qz\nS2uMyx84rp+HrcPm0kdOtePNmu/wknMgIUvlUPXmLtQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 294,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303d021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021d00cccccccccccccccccccccccccccc121be6fa59cb431754377d168831",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04aced4ea8949e5ae37ef2f5eb5e00675d08e17c34be6677b0f269b6725e3ad0af49ebfff415ee4f2a838ead1f84cafaa652c17acc26130725",
+        "wx" : "0aced4ea8949e5ae37ef2f5eb5e00675d08e17c34be6677b0f269b672",
+        "wy" : "5e3ad0af49ebfff415ee4f2a838ead1f84cafaa652c17acc26130725"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004aced4ea8949e5ae37ef2f5eb5e00675d08e17c34be6677b0f269b6725e3ad0af49ebfff415ee4f2a838ead1f84cafaa652c17acc26130725",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAErO1OqJSeWuN+8vXrXgBnXQjhfDS+Znew\n8mm2cl460K9J6//0Fe5PKoOOrR+EyvqmUsF6zCYTByU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 295,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303c021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021c249249249249249249249249249227ce201a6b76951f982e7ae89852",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043e8c1bcc16195e8769e25d4c859807dffe178bed5bca9db06efa15324e3b53b3048b8ccd8cdc1265be240c8ee204060486a99ad31eaad3a4",
+        "wx" : "3e8c1bcc16195e8769e25d4c859807dffe178bed5bca9db06efa1532",
+        "wy" : "4e3b53b3048b8ccd8cdc1265be240c8ee204060486a99ad31eaad3a4"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00043e8c1bcc16195e8769e25d4c859807dffe178bed5bca9db06efa15324e3b53b3048b8ccd8cdc1265be240c8ee204060486a99ad31eaad3a4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEPowbzBYZXodp4l1MhZgH3/4Xi+1byp2w\nbvoVMk47U7MEi4zNjNwSZb4kDI7iBAYEhqma0x6q06Q=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 296,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "303c021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021c0eb10e5ab95facded4061029d63a46f46f12947411f2ea561a592057",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0424819323b7be8ab0910f7f33bd2f7669c44b13f09479965e95287d13b0592345beafbfdb8cf3629269bdd817728d5d5cd3c28bc6c6414a70",
+        "wx" : "24819323b7be8ab0910f7f33bd2f7669c44b13f09479965e95287d13",
+        "wy" : "0b0592345beafbfdb8cf3629269bdd817728d5d5cd3c28bc6c6414a70"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000424819323b7be8ab0910f7f33bd2f7669c44b13f09479965e95287d13b0592345beafbfdb8cf3629269bdd817728d5d5cd3c28bc6c6414a70",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEJIGTI7e+irCRD38zvS92acRLE/CUeZZe\nlSh9E7BZI0W+r7/bjPNikmm92BdyjV1c08KLxsZBSnA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 297,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "303d021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0444cf57bac30a83da39f90bf3faacd52211a70fb92547db7778ea6c812b3fd1bf14688d2770c50cd5a890a3807ba0e8612136a1b11e030f82",
+        "wx" : "44cf57bac30a83da39f90bf3faacd52211a70fb92547db7778ea6c81",
+        "wy" : "2b3fd1bf14688d2770c50cd5a890a3807ba0e8612136a1b11e030f82"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000444cf57bac30a83da39f90bf3faacd52211a70fb92547db7778ea6c812b3fd1bf14688d2770c50cd5a890a3807ba0e8612136a1b11e030f82",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAERM9XusMKg9o5+Qvz+qzVIhGnD7klR9t3\neOpsgSs/0b8UaI0ncMUM1aiQo4B7oOhhITahsR4DD4I=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 298,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303e021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021d00db6db6db6db6db6db6db6db6db6ceed4c09e84c77ebd9116e17391eb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04dc17f1001d326127f7375cffa70b7530bca4da1040dc43d0044aaca07a146f04c5294cfe7e1ed587da55bae70b7fa8e32f6aa800314d01dd",
+        "wx" : "0dc17f1001d326127f7375cffa70b7530bca4da1040dc43d0044aaca0",
+        "wy" : "7a146f04c5294cfe7e1ed587da55bae70b7fa8e32f6aa800314d01dd"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004dc17f1001d326127f7375cffa70b7530bca4da1040dc43d0044aaca07a146f04c5294cfe7e1ed587da55bae70b7fa8e32f6aa800314d01dd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE3BfxAB0yYSf3N1z/pwt1MLyk2hBA3EPQ\nBEqsoHoUbwTFKUz+fh7Vh9pVuucLf6jjL2qoADFNAd0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 299,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303d021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021c33333333333333333333333333330486f9be9672d0c5d50ddf45a20c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0468e2d7088eac18ba775bf68c5c509e86afd6f93451b4e4ee1d73e277e24ff4e27ef6c519db676d822c5db040482888013c8f3881bc9ac65a",
+        "wx" : "68e2d7088eac18ba775bf68c5c509e86afd6f93451b4e4ee1d73e277",
+        "wy" : "0e24ff4e27ef6c519db676d822c5db040482888013c8f3881bc9ac65a"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000468e2d7088eac18ba775bf68c5c509e86afd6f93451b4e4ee1d73e277e24ff4e27ef6c519db676d822c5db040482888013c8f3881bc9ac65a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEaOLXCI6sGLp3W/aMXFCehq/W+TRRtOTu\nHXPid+JP9OJ+9sUZ22dtgixdsEBIKIgBPI84gbyaxlo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 300,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303e021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021d00cccccccccccccccccccccccccccc121be6fa59cb431754377d168831",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cd4171adcb8be75e7734061a048b2bf228d167c2742d27f854392046865eb958ebd320ba87662ad3ac7af568c6be0f09be090bcfe083b3e5",
+        "wx" : "0cd4171adcb8be75e7734061a048b2bf228d167c2742d27f854392046",
+        "wy" : "0865eb958ebd320ba87662ad3ac7af568c6be0f09be090bcfe083b3e5"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004cd4171adcb8be75e7734061a048b2bf228d167c2742d27f854392046865eb958ebd320ba87662ad3ac7af568c6be0f09be090bcfe083b3e5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEzUFxrcuL5153NAYaBIsr8ijRZ8J0LSf4\nVDkgRoZeuVjr0yC6h2Yq06x69WjGvg8JvgkLz+CDs+U=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 301,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303d021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021c249249249249249249249249249227ce201a6b76951f982e7ae89852",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04eefdf99ab69d1888772cabe21d406045e1beab82761a7040beeb7ed359718c889af80f22f320fbe662d5ea0f65dfb4a5589c294ce5b73359",
+        "wx" : "0eefdf99ab69d1888772cabe21d406045e1beab82761a7040beeb7ed3",
+        "wy" : "59718c889af80f22f320fbe662d5ea0f65dfb4a5589c294ce5b73359"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004eefdf99ab69d1888772cabe21d406045e1beab82761a7040beeb7ed359718c889af80f22f320fbe662d5ea0f65dfb4a5589c294ce5b73359",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE7v35mradGIh3LKviHUBgReG+q4J2GnBA\nvut+01lxjIia+A8i8yD75mLV6g9l37SlWJwpTOW3M1k=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 302,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "303d021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021c0eb10e5ab95facded4061029d63a46f46f12947411f2ea561a592057",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34",
+        "wx" : "0b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21",
+        "wy" : "0bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEtw4MvWu0v38yE5C5SgPB01bCESI0MoDW\nEVwdIb03Y4i19yP7TCLf5s1DdaBaB0dkRNWBmYUAfjQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 303,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "303c021c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c021c249249249249249249249249249227ce201a6b76951f982e7ae89851",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 304,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "303d021d008ac44bff876cbf7e2842eec13b63fcb3d6e7360aca5698f3ef0f1811021c249249249249249249249249249227ce201a6b76951f982e7ae89851",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d2142c89c774a08dc04b3dd201932bc8a5ea5f8b89bbb2a7e667aff81cd",
+        "wx" : "0b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21",
+        "wy" : "42c89c774a08dc04b3dd201932bc8a5ea5f8b89bbb2a7e667aff81cd"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d2142c89c774a08dc04b3dd201932bc8a5ea5f8b89bbb2a7e667aff81cd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEtw4MvWu0v38yE5C5SgPB01bCESI0MoDW\nEVwdIULInHdKCNwEs90gGTK8il6l+Libuyp+Znr/gc0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 305,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "303c021c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c021c249249249249249249249249249227ce201a6b76951f982e7ae89851",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 306,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "303d021d008ac44bff876cbf7e2842eec13b63fcb3d6e7360aca5698f3ef0f1811021c249249249249249249249249249227ce201a6b76951f982e7ae89851",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466ddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176",
+        "wx" : "4c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466",
+        "wy" : "0ddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00044c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466ddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAETCRmcGWKHUH113vOJGy+OGrCKEjiabnU\nzWfEZt3ZRxU9ObLUJTOkYN7yaIBAjK8t091I/oiM0XY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 307,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "303d021c2770403d42b7b45e553308d1f6a480640b61cac0ae36665d6f14d34e021d0085506b0404265ededf9a89fc7c9c7a55c16c5b0d781f774de8f46fa1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 308,
+          "comment" : "pseudorandom signature",
+          "msg" : "4d7367",
+          "sig" : "303d021d00b68da722bbba7f6a58417bb5d0dd88f40316fc628b0edfcb0f02b062021c5c742e330b6febadf9a12d58ba2a7199629457ef2e9e4cecd2f09f50",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 309,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "303c021c01ec1ff15c8a55d697a5424d674753f82f711593828368d2fbb41a17021c20d9089db7baf46b8135e17e01645e732d22d5adb20e3772da740eee",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 310,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "303c021c3e46e9ba4dc089ff30fa8c0209c31b11ff49dbeec090f9f53c000c75021c6f2e3b36369416602bca83206809ed898fcf158a56c25a5474143f68",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04aed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf8a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000",
+        "wx" : "0aed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf",
+        "wy" : "08a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004aed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf8a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAErtb8rSQAxNlOVdu2sBLOPUwrRoQ/vpnU\nKJ5uz4okqJ5xND19FR0ljSy2kDScLVazZt0QpgAAAAA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 311,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c77b38da37079d27b837613ac3e8248d66eabd5d637076c8e62c7991e021d00d40cd9f81efc52db4429c0c1af7c1d8a22b6c7babbe7fbd8b5b3f02f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 312,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d008c03b32c166c0c8b99d7f876acd109447efb13f6b82945e78d51a269021c657568f1a0a8bd7df5ffa43097ebb2b64435c8e3335bcaafc63f9ed5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 313,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00d199a375253d30f1d2b4493542e9934f9f1f8b0680117679f5bc4ad2021c11419ddbf02c8ad5f518f8dac33f86a85e777af51a034132e2767a6d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f173d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff",
+        "wx" : "0bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f1",
+        "wy" : "73d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f173d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEvxns/kP/4on2mfR5MWFFuaf3Nwuezlqx\nISF08XPVKJSa6RQvgYut5xqWBAeWO+C2SCpqYP////8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 314,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d008ff82699e2e82870be9cfdd8a408bb34f8f38a83a4ac8370f18f2bc8021c7e5008fab6a0d4159200077ef9918dad6592cd8359838852c636ac05",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 315,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c3f3b60b529ae0f950c517264adf2e481616bc47416742d5103589660021d00f731ebe98e58384b3a64b4696d4cc9619828ad51d7c39980749709a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 316,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00dc11ffdc6b78754a335f168c4033916a2158d125a3f4fed9dc736661021c6dd84364717d9f4b0790f2b282f9245ecb316874eac025600397f109",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0426e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0",
+        "wx" : "26e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000",
+        "wy" : "0eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000426e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEJuWr8TXLVOqqFraeSwspInU0Toignfbf\ngAAAAOq4kd5U4/Jv9Qq5ifMz2sVRWD1GiuYjxZZDSvA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 317,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00a59b25b786d55f26b04dfe90ee02a6bde64ed6e431dc9fbdc3ab360e021d00fc14b5ad20f39da9900e35437936c8626fccf6632e7a3d9e587e3311",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 318,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c2eda1f96c1a6e3ad8a3321ce82cbb13a5b935b501abf6c06f7fd2b3f021d00e81050c3e5f53a3c7b9d0bdb9ed92a326dfeac44791ba1abe4d6e973",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 319,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c60f5e093fda08fc14ac99d820a18ad1370c58150bea0aca24fc6db9d021d00c2220a0ebbf4896e68fdb5bd824f88291c1c862b916f9c4af87f8f5f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd",
+        "wx" : "0ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff",
+        "wy" : "41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE7GJ/NFVF0D+Mbb0I5XVScRZWf+N1+eyq\n/////0G/cFaX1fcWvPeHGNU5O2OphpH0ofJCRjdVOP0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 320,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c2ead37846a5e36a490b75140bdc7b636c6e9f6d8f980f6fadb08f769021d00e1fe130ae1798c196d7be62c7a5ddb3168cf4b8d48b6b6b4dc94ab3b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 321,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00a8a4c9416d72c860573d073281cb08c86ad65313f06b15a329e82eb2021c5a6edd2f0816b7263d915d72c67d50a854e3abee5cde1b679a0cef09",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 322,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c576bb86c517bfecdc930a4c8501725548d425afbb96d93f5c1e2a0e1021c77248c5ecd620c431438c50e6bee6858091b54a87f8548ae35c21027",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a00000000762d28f1fdc219184f81681fbff566d465b5f1f31e872df5",
+        "wx" : "15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a",
+        "wy" : "762d28f1fdc219184f81681fbff566d465b5f1f31e872df5"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a00000000762d28f1fdc219184f81681fbff566d465b5f1f31e872df5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEFQFuUrNkctU2R3YF+4Bd05AwgqBi0eow\nr55VWgAAAAB2LSjx/cIZGE+BaB+/9WbUZbXx8x6HLfU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 323,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c34e41cba628fd8787ba1a528f6015d2cae015c1c9a866e08a7133801021d0083d422ffdd99cc3c6d7096ef927f0b11988d1824e6e93840ff666ccd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 324,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c2558a42e79689244bccd5e855f6a1e42b4ff726873f30b532b89ef53021c07f9bd947785187175d848b6e2d79f7ab3bbc1087b42590b0cfb256a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 325,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00d5fe7dd5fb4fd1ea5ce66c0824f53f96ce47fd9b6c63b4d57827fd17021d00bce5bc3af705afaacb81bfa6d552d6198962fece9fba41546c602ddc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555affffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c",
+        "wx" : "15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a",
+        "wy" : "0ffffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555affffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEFQFuUrNkctU2R3YF+4Bd05AwgqBi0eow\nr55VWv////+J0tcOAj3m57B+l99ACpkrmkoODOF40gw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 326,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d008c1da2f07cdcbce4db8067b863468cfc728df52980229028689e57b6021c32175c1390a4b2cab6359bab9f854957d4fd7976c9c6d920c871c051",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 327,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00e46d4f11b86b5a12f6fe781d1f934ef2b30e78f6f9cc86a9996e20c0021d008351974b965526034a0ccef0e7d3bc13d91798151488c91533143f7b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 328,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c305ccf0b5d0cf33dc745bb7c7964c233f6cfd8892a1c1ae9f50b2f3f021c785f6e85f5e652587c6e15d0c45c427278cf65bb1429a57d8826ca39",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400000000f7e4713d085112112c37cdf4601ff688da796016b71a727ade5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1",
+        "wx" : "0f7e4713d085112112c37cdf4601ff688da796016b71a727a",
+        "wy" : "0de5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000400000000f7e4713d085112112c37cdf4601ff688da796016b71a727ade5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEAAAAAPfkcT0IURIRLDfN9GAf9ojaeWAW\ntxpyet5ansFlBUzJh/nch+mZG5Lk+mScplXurp8qMOE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 329,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c0e4fde0ac8d37536505f7b8bdc2d22c5c334b064ac5ed27bea9c179e021d00c4d6bf829dd547000d6f70b9ad9e9c1503bebcf1d95c2608942ca19d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 330,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00818afcaf491da9d08a7cc29318d5e85dce568dcca7018059f44e9b7e021d00bf32a233d5fc6ed8e2d9270b1bdad4bbd2a0f2c293d289bd91ffbcf3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 331,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c0e05ed675c673e5e70a4fdd5a47b114c5d542d4f6d7a367597d713ea021c26d70d65c48430373363987810bdcc556e02718eab214403ae008db4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f72586c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e",
+        "wx" : "0ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f725",
+        "wy" : "086c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f72586c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE/////+rffO6NNNBM8iyPfeNWdPsvUB0k\nKnb3JYbECTCdOY5gzh4KTJ4FqdMmJ1d+jOLMfzr6LD4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 332,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00ab7a19eecf63e9668278963b65236b2768e57cae0e268cb86a0ddda1021d008829f5d3a3394f9467ba62e66ef1768e3e54f93ed23ec962bc443c2e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 333,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c17111a77cf79bead456ed86a7d8a935531440281eb8b15a885e341c0021d00fdc3958d04f037b1d4bb2cee307b5201be062e0d4e089df1c1917668",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 334,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00acafa1e33345eeba0c338c2204b4cd8ba21de7ec3e1213317038e968021c0b42fbbaeda98a35da0de4c79546f3a0f7d9dec275d2cd671f93c874",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1000000000e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc",
+        "wx" : "0b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1",
+        "wy" : "0e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1000000000e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEsAE8b7/28J/s2hwmPvZTmdTPmJyl/E+P\n/w/p4QAAAAAOKrDoSV6FnrKvsAdp1uf+YmoRkWfAtrw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 335,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00a3fe71a2a56f554e98fd10a8098c2a543c98bc6b3602ef39f2412308021c5d1d68f9a870ef2bc87484b3386549fae95811ab72bc0e3a514720da",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 336,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c132f7625704756c13f2bfa449e60952f836f4904660b5b1da07e5a9f021d0082b4abafc40e8fd19b0c967f02fff152737ce01153658df445c4d7b7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 337,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00f36a8347c6fe0397a1161a364cbc4bdfb4d8b7894cbaa6edc55a4ff7021d009c9c90515da5e602d62e99f48eac414e913dd0b7cbf680c1a5399952",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945",
+        "wx" : "0b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1",
+        "wy" : "0fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEsAE8b7/28J/s2hwmPvZTmdTPmJyl/E+P\n/w/p4f/////x1U8XtqF6YU1QT/eWKRgBnZXubpg/SUU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 338,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c2125ecc08e52e9e39e590117de2145bd879626cb87180e52e9d3ce03021d008f7e838d0e8fb80005fe3c72fca1b7cc08ed321a34487896b0c90b04",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 339,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00e485747ac2f3d045e010cdadab4fd5dbd5556c0008445fb73e07cd90021d00e2133a7906aeac504852e09e6d057f29ab21368cfc4e2394be565e68",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 340,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00a4de0d931ddab90e667ebc0ad800ce49e971c60543abdc46cefff926021c550816170bd87593b9fb8ad5ed9ab4ddb12403ff6fe032252833bac4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdsa_secp224r1_sha256_test.json b/third_party/wycheproof/testvectors/ecdsa_secp224r1_sha256_test.json
new file mode 100644
index 0000000..a4615c8
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdsa_secp224r1_sha256_test.json
@@ -0,0 +1,4252 @@
+{
+  "algorithm" : "ECDSA",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "BER" : "This is a signature with correct values for (r, s) but using some alternative BER encoding instead of DER encoding. Implementations should not accept such signatures to limit signature malleability.",
+    "EdgeCase" : "Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA implementation does not check boundaries and computes s^(-1)==0.",
+    "MissingZero" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.",
+    "PointDuplication" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission."
+  },
+  "numberOfTests" : 367,
+  "header" : [],
+  "testGroups" : [
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5",
+        "wx" : "0eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7",
+        "wy" : "0eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE6tqTvhCyRJ4ei7WDBdUgCAE8VxB8GiCj\nF6bLp+ymcjQMA9HS4JZjKGaR31UGn6JUkMndn5wLsrU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "signature malleability",
+          "msg" : "313233343030",
+          "sig" : "303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021d009e82950ebe102f37ff3645cc7d3c1bab8864e5e03a5011eeba8150bc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "valid",
+          "msg" : "313233343030",
+          "sig" : "303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30813c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 4,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "303d02811c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 5,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a0402811c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 6,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3082003c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 7,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "303e0282001c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 8,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040282001c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303b021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303c021d3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303c021b3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021d617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021b617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3085010000003c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "30410285010000001c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3041021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040285010000001c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "308901000000000000003c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3045028901000000000000001c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3045021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04028901000000000000001c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30847fffffff021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "304002847fffffff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a0402847fffffff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3084ffffffff021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "30400284ffffffff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040284ffffffff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3085ffffffffff021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "30410285ffffffffff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3041021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040285ffffffffff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3088ffffffffffffffff021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "30440288ffffffffffffffff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3044021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040288ffffffffffffffff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30ff021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "303c02ff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a0402ff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "303c02803ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040280617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "303e0000021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3041498177303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30402500303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "303e303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30412221498177021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304022202500021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3044221e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040004deadbeef021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3041021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042221498177021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a0422202500021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3044021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04221e021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3044aa00bb00cd00303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3042aa02aabb303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30442224aa00bb00cd00021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30422222aa02aabb021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3044021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042224aa00bb00cd00021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3042021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042222aa02aabb021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "30402280021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040000021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042280021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3080313c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "30402280031c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040000021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042280031c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2e3c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2f3c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "313c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "323c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "ff3c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "3040300102303b1c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "303b021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "303b1c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 78,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad98100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad98105000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "3080021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "303e3000021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9813000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "303e303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "301e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "305a021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "removing integer",
+          "msg" : "313233343030",
+          "sig" : "301e021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "301f02021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "301f021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a0402",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "303e021e3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040000021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021e617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "303e021e00003ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 94,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021e0000617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 95,
+          "comment" : "appending unused 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040000021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "303e021e3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040500021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "303e021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021e617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9810500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "30200281021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "3020021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040281",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "30200500021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "3020021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303c001c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303c011c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303c031c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303c041c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303cff1c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04001c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04011c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04031c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04041c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04ff1c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "30200200021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "3020021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a040200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "3040222002013a021bde5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "3040021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a042220020161021b7d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "303c021c38de5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c637d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a84021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad901",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "303b021b3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "303b021bde5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "303b021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021b617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad9",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "303b021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021b7d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "303d021dff3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021dff617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "3021090180021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "3021021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04090180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "3021020100021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "3021021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04020100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021d013ade5c0624a5677ed7b6450d941fd283098d8a004fc718e2e7e6b441021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021dff3ade5c0624a5677ed7b6450d9421a53d481ba984280cc6582f2e5fc7021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303c021cc521a3f9db5a98812849baf26bdf441fd72b663dc4161062747575fc021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021d00c521a3f9db5a98812849baf26bde5ac2b7e4567bd7f339a7d0d1a039021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021dfec521a3f9db5a98812849baf26be02d7cf67275ffb038e71d18194bbf021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021d013ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021d00c521a3f9db5a98812849baf26bdf441fd72b663dc4161062747575fc021c617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021d01617d6af141efd0c800c9ba3382c2119a390cfa9bed6a409bfe3703be",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021dff617d6af141efd0c800c9ba3382c3e454779b1a1fc5afee11457eaf44",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303c021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021c9e82950ebe102f37ff3645cc7d3d0508a7abf5a22672e8a95e25267f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021dfe9e82950ebe102f37ff3645cc7d3dee65c6f305641295bf6401c8fc42",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021d01617d6af141efd0c800c9ba3382c2faf758540a5dd98d1756a1dad981",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021c3ade5c0624a5677ed7b6450d9420bbe028d499c23be9ef9d8b8a8a04021d009e82950ebe102f37ff3645cc7d3d0508a7abf5a22672e8a95e25267f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 144,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020101090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30220201ff021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30220201ff021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30080201ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffffffff000000000000000000000001020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffffffff000000000000000000000001020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffffffff0000000000000000000000010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3024021d00ffffffffffffffffffffffffffffffff000000000000000000000001090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffffffff000000000000000000000002020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffffffff000000000000000000000002020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffffffff0000000000000000000000020201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3024021d00ffffffffffffffffffffffffffffffff000000000000000000000002090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "Edge case for Shamir multiplication",
+          "msg" : "3839313737",
+          "sig" : "303d021c326bc06353f7f9c9f77b8f4b55464e8619944e7879402cca572e041a021d0096ad91f02a3bc40c118abd416ed5c6203ed7ced0330860d7b88c10ab",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 216,
+          "comment" : "special case hash",
+          "msg" : "343236343739373234",
+          "sig" : "303d021d00bcca2365cebdcf7c6cda1ee7b27c7fe79e371537b01869c715eabb1e021c3ae76f9bbfe519d778816dc8fe10635ee7576b6b7916f0c21df320c0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "special case hash",
+          "msg" : "37313338363834383931",
+          "sig" : "303c021c59a9f83289ef6995d5d5592e80ab4f6a81123f69d385d3cfb152faf2021c3a97d5be190d5819241067e2be56375ab84155baab8fc7aeb7f8cb3d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "special case hash",
+          "msg" : "3130333539333331363638",
+          "sig" : "303e021d00b54bac9be2beaaa09456a3968a1faf27c9d96bd5f6738fec6066d31e021d00d72c22129344a96d52fda60b264cf5e6fae45fd2c1b1b78bcba30070",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "special case hash",
+          "msg" : "33393439343031323135",
+          "sig" : "303d021c323dbdecd40910c6fa7a5691846fa7769113d1f2ba64ef0dc97d2ddb021d00ca9e73a4587af042f8ba924bb61829c5e24046f9803eb76ab80ef327",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "special case hash",
+          "msg" : "31333434323933303739",
+          "sig" : "303d021d00a55dccc27d287f15960ed79908a3edb6bb31aff07c8caa0e65fc0785021c559cb51aa5f2b9066610199dd01291a47729a6189a622ae9e7af7621",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "special case hash",
+          "msg" : "33373036323131373132",
+          "sig" : "303d021c137ed6105148d6f5b84e87735d57955f81c5914a6e69f55347ade074021d00dfa5d56b1a12567efacb348a133b79d48da7aac78d78ee589c2ec027",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "special case hash",
+          "msg" : "333433363838373132",
+          "sig" : "303e021d00856ff63d779163e78fed8c48330b48f08bf953a95266b3857eee91aa021d00f4aa917cd37f556c6df9d0960c2f7daa7ea118e5c30cc40ca1eed418",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "special case hash",
+          "msg" : "31333531353330333730",
+          "sig" : "303d021d00a9d7716f04c5ce247f6b8c608b37db55f68e2ff94a5883863e867708021c61bc093faa6fb25cd240aea4b56fed728f7b3669b4dc84c449d38c5d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "special case hash",
+          "msg" : "36353533323033313236",
+          "sig" : "303d021d00f6d088fd3b9c981ac491c62030643bbd82d4f4588e8517de5884e73d021c773eee477980763b1ea27ae998bda0244cb67b07aa6779a38cd2ba3f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "special case hash",
+          "msg" : "31353634333436363033",
+          "sig" : "303e021d00eacb55588e446bbf3687089ba8ba3b05cfef7458bb81b4277f90a853021d008039e8944cc3df7f4ce5badc349975d471a81dea14e9bcae3065d410",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "special case hash",
+          "msg" : "34343239353339313137",
+          "sig" : "303c021c5984af8c89fb9d596a1f28fd3d41e46f7205fe12fa63437ac79e7e81021c33b16b742d45f18f88de2713078384e6150f06b8b99f36ab2ce3dd49",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "special case hash",
+          "msg" : "3130393533323631333531",
+          "sig" : "303d021c3cda62d84711c262f782d5c3a79b567485227b34afb821f5241b1961021d00b615cef399706ff758f072931852b717ec898e9a1e6339d0ee81b8da",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "special case hash",
+          "msg" : "35393837333530303431",
+          "sig" : "303d021d00e1db7304609191ea1ac91183ffb31df51b5b3fdc6b1a1129d85818d6021c441886d003ae80fbe7139e1d02845cd1bd959f0df1468f5836dd6ea5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "special case hash",
+          "msg" : "33343633303036383738",
+          "sig" : "303d021c3545dc4a4ef84bbb3a526ff929c91ad234516a9e95455ac8db4012b1021d00af49926f693a7cf11f71e199f382a8d640c0c85e46d94ee26e384344",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "special case hash",
+          "msg" : "39383137333230323837",
+          "sig" : "303d021c0ccafdeae4582c9de6795b2d09a7fc3848c75904fa960989156cbbb9021d00af1f994da3e7d89cc8aaa44616cb77e3be7a83ccecc965775194e502",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 231,
+          "comment" : "special case hash",
+          "msg" : "33323232303431303436",
+          "sig" : "303e021d00a3b2145d8c669027532501eea1913abb22a78a827fdd82fe9d6d3757021d009b2f1ae84f5606d68653065f74e9d089886694c739fbe3fd4a1b2b4a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 232,
+          "comment" : "special case hash",
+          "msg" : "36363636333037313034",
+          "sig" : "303e021d009aac3a7e3d142344991bf177b4f4dbfa074148ad9e20f27555b547d9021d00f830a3c7fdf251d79d41977d28e6d9a72a36df11b86e17c8dc3acae0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 233,
+          "comment" : "special case hash",
+          "msg" : "31303335393531383938",
+          "sig" : "303c021c4769fba554fd436051c285bdadfa33a443d4f7084dd598ce3b98b8fb021c0c014c87cb14113d75864f74905f75b34f9970ba58b5d0676021826d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 234,
+          "comment" : "special case hash",
+          "msg" : "31383436353937313935",
+          "sig" : "303d021d008b91fc5054a75c34a508624b85708b3d25fa74328c68741c3aeb92d9021c155e3e46b1209583135a9fef15abe325b25bd19285ee6b5b4549629f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 235,
+          "comment" : "special case hash",
+          "msg" : "33313336303436313839",
+          "sig" : "303d021d00a4a2a85fbb8bb26c4d845cfac191f89d65b00d3f1b9450d177f78890021c6605a460e60402685c7a5accd2615e9232e51937bd83dfa3065eabf7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 236,
+          "comment" : "special case hash",
+          "msg" : "32363633373834323534",
+          "sig" : "303d021d00a89d333ae34187855cf7fa435ff39be6b7bb39b2d0ce682133ad9646021c483dcc89a3b43be250f5c3f78f78418e7b8341a8bcfb93dfd58e46d8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 237,
+          "comment" : "special case hash",
+          "msg" : "31363532313030353234",
+          "sig" : "303d021c2d0f99c71933c82ded544ef4faac9d669e437dea13b57186f4c20a0e021d00d9682b9f3a05d7832947bc45eadbc742d96e7ab1124832ddb7a8c65b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 238,
+          "comment" : "special case hash",
+          "msg" : "35373438303831363936",
+          "sig" : "303d021d00840208f7c41b1fbadcc701fb3a1d0f98a3e2a75235e695bfd378f8b4021c44c8daad4efc03e1753803c362b409c3ca6e0f21e538fe3a364c0e53",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 239,
+          "comment" : "special case hash",
+          "msg" : "36333433393133343638",
+          "sig" : "303e021d0087cc582cb10602110566fcb10a233aede993fae5fb3f81b0bbff94ca021d00c971c05bd51d9685825b2cfc0a2596c7f80d9f9dc68c28c159aa395a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 240,
+          "comment" : "special case hash",
+          "msg" : "31353431313033353938",
+          "sig" : "303d021c50d73d949b3adcd3e8fa94dafefaf9d263ebc702128d891afac47ea7021d00f8423c378f0190574925142eb5b97c612abfa048fa3ab5375ec795a1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 241,
+          "comment" : "special case hash",
+          "msg" : "3130343738353830313238",
+          "sig" : "303e021d00d608915dfcd5d3c63ed10d0d9b614f7a866f8858a6e59dc03eb0a8ee021d008e701aa0bab491430f6e4da92244b0bb174957ee6f495bc5d15fabb1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 242,
+          "comment" : "special case hash",
+          "msg" : "3130353336323835353638",
+          "sig" : "303e021d00c87b0ab842c4769ed94b910bd7719691f9991bc5a347889608f07034021d00d083111048d6e019771fc2669c55156a3d09615a6b2d9cae52ddabee",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 243,
+          "comment" : "special case hash",
+          "msg" : "393533393034313035",
+          "sig" : "303c021c0a1c2c2478e244464226c660edf724db1213f4923eb725d611d976fd021c764e55186a76f734891d05fb57af2727fab8fbea684ca4321d5de540",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 244,
+          "comment" : "special case hash",
+          "msg" : "393738383438303339",
+          "sig" : "303e021d008a2747c5dd9ef5298b8aeabd2fb3a2beb16158fb2cc62be9e51b2152021d00f96251bc048bcad832e6cbc09c9c2e585ab7543dc552eaa5125be0d3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 245,
+          "comment" : "special case hash",
+          "msg" : "33363130363732343432",
+          "sig" : "303e021d00d9eac32a734f3a3e5b5a2905bed8164ef4c6cd24d5c0fc54cc83f3cc021d00a784930d16c3b753bb3ed9151d583c50ff97bc976274bde482fb9644",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 246,
+          "comment" : "special case hash",
+          "msg" : "31303534323430373035",
+          "sig" : "303d021c6c40c6b15ae573f77b677cd878cc5e4da8171cf50d79974fde374e00021d00c88c9828037bf7013a1415537ca074d6c8a553bdb4b26b14a7e88d93",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 247,
+          "comment" : "special case hash",
+          "msg" : "35313734343438313937",
+          "sig" : "303d021d00dca0aaa0a395393142b323edced09372760350f2ab261ce3339b114d021c0983bf6e510ce7f0a7520f2b7c60cd68a4912b78162c7ac33789e0c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 248,
+          "comment" : "special case hash",
+          "msg" : "31393637353631323531",
+          "sig" : "303d021d00a0526ed47e2607e6bae6dcf3b8f54f4e0638023673a38cad4569c3ba021c61516f55746b379d11cbaa02cef35311d7771a47d1e127cff46dcfd6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 249,
+          "comment" : "special case hash",
+          "msg" : "33343437323533333433",
+          "sig" : "303d021c5c00db60178c8361092bdfb47fc9a47b33363d7e0d76e32520f79657021d00e1baf7ae7d81045793c73173f49d60bdfc8779942795d9d082b3ca11",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 250,
+          "comment" : "special case hash",
+          "msg" : "333638323634333138",
+          "sig" : "303d021c46f69b6a99717949eee74092a0c1438a290a2cd82fe1e10d8f37e88b021d0099a5f59f09bd980a066233523397846987a8a1bfdde355062d140a4b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 251,
+          "comment" : "special case hash",
+          "msg" : "33323631313938363038",
+          "sig" : "303e021d00e643d8085a22706fa0e6540f3d5e169ad8cc49b4bfe98e325321c705021d00f95bd423f9cafe0cedfec6fd97871536d71b2ac58dfb2f7ab8952d4b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 252,
+          "comment" : "special case hash",
+          "msg" : "39363738373831303934",
+          "sig" : "303e021d00e65fb9bcdd791f141ccff2b3cfbf45d84f8c6272021a68dde8c36bc8021d00df6e08c74b5e36b7772658f02515ae0ea813b64df24f3522ea15fb15",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 253,
+          "comment" : "special case hash",
+          "msg" : "34393538383233383233",
+          "sig" : "303e021d00a476d468221ef55611e8a724c9b4cd79c34f6940d5f665e3335f6231021d00bfddc18e7a008bc206c8e1ca6c878363e4138508e0c3a84a27eabe35",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 254,
+          "comment" : "special case hash",
+          "msg" : "383234363337383337",
+          "sig" : "303c021c1b393477941879271873a8c043a77caadb9957fcdd263a6ac978e4ba021c270060d5f356ebb6d185772baa78b878af6807378e0d5c532da0a4a7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 255,
+          "comment" : "special case hash",
+          "msg" : "3131303230383333373736",
+          "sig" : "303e021d00b2eda8c969d4b1bdd31867fd1f92d547b406840c257f2f80dfbdc4e3021d00e6297b059ce64ef04de9715a8f686a9f73980865066a94975b7f8117",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 256,
+          "comment" : "special case hash",
+          "msg" : "313333383731363438",
+          "sig" : "303d021d00938189a18a4bff5712ac99c2b8e92c218af3e4d4e3a84b906b0f704e021c7bb3e538f0b70664dad462ab14b0ed416c86ac6e9060fe760dabb715",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 257,
+          "comment" : "special case hash",
+          "msg" : "333232313434313632",
+          "sig" : "303e021d00bb7c1d8120d2aa7765b16eeac44282de605fb2a1665657dea4492935021d00e0a8adb3a143883f981ea1323fa6f1d347845be2b8dcc6cd5cc93ee5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 258,
+          "comment" : "special case hash",
+          "msg" : "3130363836363535353436",
+          "sig" : "303c021c74a4c51dd60c7118467be29652060f39af94f8c0eb7f15c64771010c021c6102ec0c9257e607af3f3ff7490b54e78111f422bec11ba01277171f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 259,
+          "comment" : "special case hash",
+          "msg" : "3632313535323436",
+          "sig" : "303d021c625da18d676f02fae9dbcb3092265909488fb95d662569d7746b9687021d00c4f1ec831e36604d604b630fd0b1999cd09960862294251d85e5873d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 260,
+          "comment" : "special case hash",
+          "msg" : "37303330383138373734",
+          "sig" : "303d021d008ee0d4a31fd1c4d854d75c14151926899dde1c7332fd4769443d213d021c4b8278b89ba4f8fbd7dcc6affe4c12156f7409909416989685dd5a39",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 261,
+          "comment" : "special case hash",
+          "msg" : "35393234353233373434",
+          "sig" : "303e021d00bdde45fc9ebb3749c9fb2c25bf02e2a217ccc112f8e65499eeffb6a1021d00becd6b88ef2bee872ebc0e2b805a56066e19179fce9f0dc0df3f6378",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 262,
+          "comment" : "special case hash",
+          "msg" : "31343935353836363231",
+          "sig" : "303d021c50186e023a1f5053fcb4d0473039b1b2cdeba569719a4ebabdd675c8021d00f8fb893c1b6b5b827b5f3f4bb5eab75b6212bb56a5a39bb35c127a1c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 263,
+          "comment" : "special case hash",
+          "msg" : "34303035333134343036",
+          "sig" : "303e021d00d3b454639b0fb3da93b20d55be8609e40902cb4a608f3b9064c0deb7021d00ec7aa9637fd71b543e5243faab4c7a2edc2c48e982c5ac017807f19a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 264,
+          "comment" : "special case hash",
+          "msg" : "33303936343537353132",
+          "sig" : "303d021d00c202abbd98e03809de842bdef268a1c616a7306da69a87abaf03169c021c7e7e04823af8ed6836fd2ac011e47de8e1bef91ed1da5144893fc259",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 265,
+          "comment" : "special case hash",
+          "msg" : "32373834303235363230",
+          "sig" : "303d021c2e4b76638816cce057a4a27a49258dcb5437ae97739f27ebc0973c0b021d00e9f6c0b64e764ad39dd92b576e11c23e5994b02095cb2a4720c8662c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 266,
+          "comment" : "special case hash",
+          "msg" : "32363138373837343138",
+          "sig" : "303c021c7e0f48761089aa4c7ecd5a7ac5380836b1e5d381d3400174d15df98b021c0c3df50060e3a6714aa565a33d784e7b16ac87bebfb3c2255cfd832c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 267,
+          "comment" : "special case hash",
+          "msg" : "31363432363235323632",
+          "sig" : "303c021c4d6f7408508eb0814dcd48007f0efd9e2b91cdac4030540cc678de19021c1e74f8dc34d13613ef42462fe88981cbe2489be10e4cdae975a1b38e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 268,
+          "comment" : "special case hash",
+          "msg" : "36383234313839343336",
+          "sig" : "303d021d00967f2c5d304c7932eaaa1682197945e66cc912b703824776ef16ad7a021c73957001d9037c63d6471c809a2388383ad695137c622cd5f5584414",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 269,
+          "comment" : "special case hash",
+          "msg" : "343834323435343235",
+          "sig" : "303d021c49260804bb2ceae4b9cee63b02ea60173ec3f4f90167627c0bb39888021d00c9eb022f96db3e90fe0ff617730a629f342e02fb208d6836cbbdc7d3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0493b4c28f032d00f80e77491edc158359909ee9e30a7327b74219e5e2482c19ae35cb28afc9b95ca1ed7ad91c812d5fcceb4beddbf1a16d92",
+        "wx" : "093b4c28f032d00f80e77491edc158359909ee9e30a7327b74219e5e2",
+        "wy" : "482c19ae35cb28afc9b95ca1ed7ad91c812d5fcceb4beddbf1a16d92"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000493b4c28f032d00f80e77491edc158359909ee9e30a7327b74219e5e2482c19ae35cb28afc9b95ca1ed7ad91c812d5fcceb4beddbf1a16d92",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEk7TCjwMtAPgOd0ke3BWDWZCe6eMKcye3\nQhnl4kgsGa41yyivyblcoe162RyBLV/M60vt2/GhbZI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 270,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "313233343030",
+          "sig" : "3030020f00e95c1f470fc1ec22d6baa3a3d5c1021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 271,
+          "comment" : "r too large",
+          "msg" : "313233343030",
+          "sig" : "303e021d00fffffffffffffffffffffffffffffffefffffffffffffffffffffffe021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04da927f4ba88b639bf5334221d2f54d8ef9ccc1a1125fad18c7bfb789ac51ae53de6d834a9db3947b8dd4c6ac2b084b85496bfa72d86b6948",
+        "wx" : "0da927f4ba88b639bf5334221d2f54d8ef9ccc1a1125fad18c7bfb789",
+        "wy" : "0ac51ae53de6d834a9db3947b8dd4c6ac2b084b85496bfa72d86b6948"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004da927f4ba88b639bf5334221d2f54d8ef9ccc1a1125fad18c7bfb789ac51ae53de6d834a9db3947b8dd4c6ac2b084b85496bfa72d86b6948",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE2pJ/S6iLY5v1M0Ih0vVNjvnMwaESX60Y\nx7+3iaxRrlPebYNKnbOUe43UxqwrCEuFSWv6cthraUg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 272,
+          "comment" : "r,s are large",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0420888e1c0f5694c4c0363b36482beb6e1e6649b3d3b26f127febb6fcde00c2f3d8e4a7e8a0bafd417c96d3e81c975946a2f3686aa39d35f1",
+        "wx" : "20888e1c0f5694c4c0363b36482beb6e1e6649b3d3b26f127febb6fc",
+        "wy" : "0de00c2f3d8e4a7e8a0bafd417c96d3e81c975946a2f3686aa39d35f1"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000420888e1c0f5694c4c0363b36482beb6e1e6649b3d3b26f127febb6fcde00c2f3d8e4a7e8a0bafd417c96d3e81c975946a2f3686aa39d35f1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEIIiOHA9WlMTANjs2SCvrbh5mSbPTsm8S\nf+u2/N4AwvPY5KfooLr9QXyW0+gcl1lGovNoaqOdNfE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 273,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "303c021c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff021c3d5052691b8dc89debad360466f2a39e82e8ae2aefb77c3c92ad7cd1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049545c86f032c5df255a4490bb0b83eca201181792ad74246874db229405264c283063327b70f4c2be5ab4d2e9407b866e121d6145d124c04",
+        "wx" : "09545c86f032c5df255a4490bb0b83eca201181792ad74246874db229",
+        "wy" : "405264c283063327b70f4c2be5ab4d2e9407b866e121d6145d124c04"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00049545c86f032c5df255a4490bb0b83eca201181792ad74246874db229405264c283063327b70f4c2be5ab4d2e9407b866e121d6145d124c04",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAElUXIbwMsXfJVpEkLsLg+yiARgXkq10JG\nh02yKUBSZMKDBjMntw9MK+WrTS6UB7hm4SHWFF0STAQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 274,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "303d021c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff021d00bf19ab4d3ebf5a1a49d765909308daa88c2b7be3969db552ea30562b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04579d53f39d5109bd440e3e3e7efd603740963348ff9c72c03b0fe6b8df02f133ecd60b072a0812adc752708f2be9d8c9ad5953d8c7bf3965",
+        "wx" : "579d53f39d5109bd440e3e3e7efd603740963348ff9c72c03b0fe6b8",
+        "wy" : "0df02f133ecd60b072a0812adc752708f2be9d8c9ad5953d8c7bf3965"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004579d53f39d5109bd440e3e3e7efd603740963348ff9c72c03b0fe6b8df02f133ecd60b072a0812adc752708f2be9d8c9ad5953d8c7bf3965",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEV51T851RCb1EDj4+fv1gN0CWM0j/nHLA\nOw/muN8C8TPs1gsHKggSrcdScI8r6djJrVlT2Me/OWU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 275,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020103020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d2a14c8106d89f3536faebdafcd4680f65ab4bf2243164ca1464b628acaf2bee52e6231d3c980f52f8e189a41c3e3a05e591195ec864217a",
+        "wx" : "0d2a14c8106d89f3536faebdafcd4680f65ab4bf2243164ca1464b628",
+        "wy" : "0acaf2bee52e6231d3c980f52f8e189a41c3e3a05e591195ec864217a"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004d2a14c8106d89f3536faebdafcd4680f65ab4bf2243164ca1464b628acaf2bee52e6231d3c980f52f8e189a41c3e3a05e591195ec864217a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE0qFMgQbYnzU2+uva/NRoD2WrS/IkMWTK\nFGS2KKyvK+5S5iMdPJgPUvjhiaQcPjoF5ZEZXshkIXo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 276,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020103020103",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e892479153ad13ea5ca45d4c323ebf1fc3cd0cdf787c34306a3f79a4326ca9645f2b517608dc1f08b7a84cfc61e6ff68d14f27d2043c7ef5",
+        "wx" : "0e892479153ad13ea5ca45d4c323ebf1fc3cd0cdf787c34306a3f79a4",
+        "wy" : "326ca9645f2b517608dc1f08b7a84cfc61e6ff68d14f27d2043c7ef5"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004e892479153ad13ea5ca45d4c323ebf1fc3cd0cdf787c34306a3f79a4326ca9645f2b517608dc1f08b7a84cfc61e6ff68d14f27d2043c7ef5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE6JJHkVOtE+pcpF1MMj6/H8PNDN94fDQw\naj95pDJsqWRfK1F2CNwfCLeoTPxh5v9o0U8n0gQ8fvU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 277,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020103020104",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 278,
+          "comment" : "r is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a40020104",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042b0eac35c0b294f6d435dcaffa8633b0123005465c30080adbcc103ad465a63bfb71d4aee09328697fe1088753646d8369b8dc103217c219",
+        "wx" : "2b0eac35c0b294f6d435dcaffa8633b0123005465c30080adbcc103a",
+        "wy" : "0d465a63bfb71d4aee09328697fe1088753646d8369b8dc103217c219"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00042b0eac35c0b294f6d435dcaffa8633b0123005465c30080adbcc103ad465a63bfb71d4aee09328697fe1088753646d8369b8dc103217c219",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEKw6sNcCylPbUNdyv+oYzsBIwBUZcMAgK\n28wQOtRlpjv7cdSu4JMoaX/hCIdTZG2DabjcEDIXwhk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 279,
+          "comment" : "s is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3022020103021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c6f00c4",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d156e01e33becede8f4fb4ae9521d751e7f8eb795ca00857db2fd7afd73a450ec60e6a9218a8431870687e0968944f6dc5ffeb30e4693b7c",
+        "wx" : "0d156e01e33becede8f4fb4ae9521d751e7f8eb795ca00857db2fd7af",
+        "wy" : "0d73a450ec60e6a9218a8431870687e0968944f6dc5ffeb30e4693b7c"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004d156e01e33becede8f4fb4ae9521d751e7f8eb795ca00857db2fd7afd73a450ec60e6a9218a8431870687e0968944f6dc5ffeb30e4693b7c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE0VbgHjO+zt6PT7SulSHXUef463lcoAhX\n2y/Xr9c6RQ7GDmqSGKhDGHBofglolE9txf/rMORpO3w=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 280,
+          "comment" : "small r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302302020100021d00c993264c993264c993264c99326411d2e55b3214a8d67528812a55ab",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f293a8a2b4aff0bed95c663b364afe69778d38dd7e7a304f7d3c74e617dfd09e7803c4439a6c075cb579cde652d03f7559ff58846312fa4c",
+        "wx" : "0f293a8a2b4aff0bed95c663b364afe69778d38dd7e7a304f7d3c74e6",
+        "wy" : "17dfd09e7803c4439a6c075cb579cde652d03f7559ff58846312fa4c"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004f293a8a2b4aff0bed95c663b364afe69778d38dd7e7a304f7d3c74e617dfd09e7803c4439a6c075cb579cde652d03f7559ff58846312fa4c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE8pOoorSv8L7ZXGY7Nkr+aXeNON1+ejBP\nfTx05hff0J54A8RDmmwHXLV5zeZS0D91Wf9YhGMS+kw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 281,
+          "comment" : "smallish r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302702072d9b4d347952cc021c3e85d56474b5c55fbe86608442a84b2bf093b7d75f53a47250e1c70c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d4ddf003b298cbaa7d2edc584b28b474a76162ed4b5b0f6222c54317d4e4fe030f178fb4aa4a6d7f61265ecd7ef13c313606b8d341a8b954",
+        "wx" : "0d4ddf003b298cbaa7d2edc584b28b474a76162ed4b5b0f6222c54317",
+        "wy" : "0d4e4fe030f178fb4aa4a6d7f61265ecd7ef13c313606b8d341a8b954"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004d4ddf003b298cbaa7d2edc584b28b474a76162ed4b5b0f6222c54317d4e4fe030f178fb4aa4a6d7f61265ecd7ef13c313606b8d341a8b954",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE1N3wA7KYy6p9LtxYSyi0dKdhYu1LWw9i\nIsVDF9Tk/gMPF4+0qkptf2EmXs1+8TwxNga400GouVQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 282,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "313233343030",
+          "sig" : "302d020d1033e67e37b32b445580bf4efb021c02fd02fd02fd02fd02fd02fd02fd0043a4fd2da317247308c74dc6b8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048a5bf0028f1e3eb6841dee7b8f873f68b0c560e592e3182074f51ce89668c32224b65b6849713d35e3acf1786862e65b5a664b47a098caa0",
+        "wx" : "08a5bf0028f1e3eb6841dee7b8f873f68b0c560e592e3182074f51ce8",
+        "wy" : "09668c32224b65b6849713d35e3acf1786862e65b5a664b47a098caa0"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00048a5bf0028f1e3eb6841dee7b8f873f68b0c560e592e3182074f51ce89668c32224b65b6849713d35e3acf1786862e65b5a664b47a098caa0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEilvwAo8ePraEHe57j4c/aLDFYOWS4xgg\ndPUc6JZowyIktltoSXE9NeOs8XhoYuZbWmZLR6CYyqA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 283,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "313233343030",
+          "sig" : "302302020100021d00d05434abacd859ed74185e75b751c6d9f60c7921dacfbb8e19cdba8e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b53e569b18e9361567e5713ee69ecbe7949911b0257546a24c3dd137f29a83334cff1c44d8c0c33b6dadb8568c024fa1fbb694cd9e705f5a",
+        "wx" : "0b53e569b18e9361567e5713ee69ecbe7949911b0257546a24c3dd137",
+        "wy" : "0f29a83334cff1c44d8c0c33b6dadb8568c024fa1fbb694cd9e705f5a"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b53e569b18e9361567e5713ee69ecbe7949911b0257546a24c3dd137f29a83334cff1c44d8c0c33b6dadb8568c024fa1fbb694cd9e705f5a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEtT5WmxjpNhVn5XE+5p7L55SZEbAldUai\nTD3RN/KagzNM/xxE2MDDO22tuFaMAk+h+7aUzZ5wX1o=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 284,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302e020d062522bbd3ecbe7c39e93e7c24021d00d05434abacd859ed74185e75b751c6d9f60c7921dacfbb8e19cdba8e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0477f3ebf52725c809acbb19adf093126a2a3a065ca654c22099c978129f1948d23c5158ec2adff455eb2fedf1075d4ec22d660977424a10f7",
+        "wx" : "77f3ebf52725c809acbb19adf093126a2a3a065ca654c22099c97812",
+        "wy" : "09f1948d23c5158ec2adff455eb2fedf1075d4ec22d660977424a10f7"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000477f3ebf52725c809acbb19adf093126a2a3a065ca654c22099c978129f1948d23c5158ec2adff455eb2fedf1075d4ec22d660977424a10f7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEd/Pr9SclyAmsuxmt8JMSaio6BlymVMIg\nmcl4Ep8ZSNI8UVjsKt/0Vesv7fEHXU7CLWYJd0JKEPc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 285,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "313233343030",
+          "sig" : "303d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c29bd021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a7f7b99e5cdc6fec8928eff773ccdf3b68b19d43cdb41809e19c60f31736b7a0c12a9c2d706671912915142b3e05c89ef3ad497bd6c34699",
+        "wx" : "0a7f7b99e5cdc6fec8928eff773ccdf3b68b19d43cdb41809e19c60f3",
+        "wy" : "1736b7a0c12a9c2d706671912915142b3e05c89ef3ad497bd6c34699"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004a7f7b99e5cdc6fec8928eff773ccdf3b68b19d43cdb41809e19c60f31736b7a0c12a9c2d706671912915142b3e05c89ef3ad497bd6c34699",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEp/e5nlzcb+yJKO/3c8zfO2ixnUPNtBgJ\n4Zxg8xc2t6DBKpwtcGZxkSkVFCs+Bcie861Je9bDRpk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 286,
+          "comment" : "s == 1",
+          "msg" : "313233343030",
+          "sig" : "3021021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 287,
+          "comment" : "s == 0",
+          "msg" : "313233343030",
+          "sig" : "3021021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049cf00010b4ad86636f6cc70fb58c3b995c0d12e46fc58e24b0d28f6921c8a8a320cc450ccb15ebd71617f4ed25db4d3413fbdf157d31dbb6",
+        "wx" : "09cf00010b4ad86636f6cc70fb58c3b995c0d12e46fc58e24b0d28f69",
+        "wy" : "21c8a8a320cc450ccb15ebd71617f4ed25db4d3413fbdf157d31dbb6"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00049cf00010b4ad86636f6cc70fb58c3b995c0d12e46fc58e24b0d28f6921c8a8a320cc450ccb15ebd71617f4ed25db4d3413fbdf157d31dbb6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEnPAAELSthmNvbMcPtYw7mVwNEuRvxY4k\nsNKPaSHIqKMgzEUMyxXr1xYX9O0l2000E/vfFX0x27Y=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 288,
+          "comment" : "point at infinity during verify",
+          "msg" : "313233343030",
+          "sig" : "303c021c7fffffffffffffffffffffffffff8b51705c781f09ee94a2ae2e151e021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0410518eb7a926b5f7b65be801ec9b2abf76adce25c6152e452a3512c83f322b9ab57ea8352ad29beb99ef356b713432fcc4aef31f903045d9",
+        "wx" : "10518eb7a926b5f7b65be801ec9b2abf76adce25c6152e452a3512c8",
+        "wy" : "3f322b9ab57ea8352ad29beb99ef356b713432fcc4aef31f903045d9"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000410518eb7a926b5f7b65be801ec9b2abf76adce25c6152e452a3512c83f322b9ab57ea8352ad29beb99ef356b713432fcc4aef31f903045d9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEEFGOt6kmtfe2W+gB7Jsqv3atziXGFS5F\nKjUSyD8yK5q1fqg1KtKb65nvNWtxNDL8xK7zH5AwRdk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 289,
+          "comment" : "u1 == 1",
+          "msg" : "313233343030",
+          "sig" : "303d021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021d00bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419fe",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048a5dfedc9dd1cb9a439c88b3dd472b2e66173f7866855db6bb6c12fd3badfbb8a4c6fd80e66510957927c78a2aa02ecef62816d0356b49c3",
+        "wx" : "08a5dfedc9dd1cb9a439c88b3dd472b2e66173f7866855db6bb6c12fd",
+        "wy" : "3badfbb8a4c6fd80e66510957927c78a2aa02ecef62816d0356b49c3"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00048a5dfedc9dd1cb9a439c88b3dd472b2e66173f7866855db6bb6c12fd3badfbb8a4c6fd80e66510957927c78a2aa02ecef62816d0356b49c3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEil3+3J3Ry5pDnIiz3UcrLmYXP3hmhV22\nu2wS/Tut+7ikxv2A5mUQlXknx4oqoC7O9igW0DVrScM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 290,
+          "comment" : "u1 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c44a5ad0bd0636d9e12bc9e0a6bdc74bfe082087ae8b61cbd54b8103f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0483a59fc3df295e84c290b32d0b550a06f99456fc2298e4a68c4f2bff1b34f483db30db3a51d8288732c107d8b1a858cd54c3936e1b5c11a4",
+        "wx" : "083a59fc3df295e84c290b32d0b550a06f99456fc2298e4a68c4f2bff",
+        "wy" : "1b34f483db30db3a51d8288732c107d8b1a858cd54c3936e1b5c11a4"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000483a59fc3df295e84c290b32d0b550a06f99456fc2298e4a68c4f2bff1b34f483db30db3a51d8288732c107d8b1a858cd54c3936e1b5c11a4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEg6Wfw98pXoTCkLMtC1UKBvmUVvwimOSm\njE8r/xs09IPbMNs6UdgohzLBB9ixqFjNVMOTbhtcEaQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 291,
+          "comment" : "u2 == 1",
+          "msg" : "313233343030",
+          "sig" : "303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0458bada578a205d6e170722c8ed6c7715011fe33d7eba869ed1d448a75be4730c1d2d2ef881e02f028a241b7d7d3b0d0b4a9c0565fcb49977",
+        "wx" : "58bada578a205d6e170722c8ed6c7715011fe33d7eba869ed1d448a7",
+        "wy" : "5be4730c1d2d2ef881e02f028a241b7d7d3b0d0b4a9c0565fcb49977"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000458bada578a205d6e170722c8ed6c7715011fe33d7eba869ed1d448a75be4730c1d2d2ef881e02f028a241b7d7d3b0d0b4a9c0565fcb49977",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEWLraV4ogXW4XByLI7Wx3FQEf4z1+uoae\n0dRIp1vkcwwdLS74geAvAookG319Ow0LSpwFZfy0mXc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 292,
+          "comment" : "u2 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "303d021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021d00aaaaaaaaaaaaaaaaaaaaaaaaaaaa0f17407b4ad40d3e1b8392e81c29",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047fcc799b919fe9789ce01dd9202731cb7d815158bc6cb8468760247c0f9d2957e0dd5e4c40124bd5e0dd1be41c038fce2cd1dc814e0af37d",
+        "wx" : "7fcc799b919fe9789ce01dd9202731cb7d815158bc6cb8468760247c",
+        "wy" : "0f9d2957e0dd5e4c40124bd5e0dd1be41c038fce2cd1dc814e0af37d"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00047fcc799b919fe9789ce01dd9202731cb7d815158bc6cb8468760247c0f9d2957e0dd5e4c40124bd5e0dd1be41c038fce2cd1dc814e0af37d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEf8x5m5Gf6Xic4B3ZICcxy32BUVi8bLhG\nh2AkfA+dKVfg3V5MQBJL1eDdG+QcA4/OLNHcgU4K830=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 293,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d0093c8c651653430cb4f1675fc86b5e82ca04ff2ab1501674476aac169",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043ddd68f69d0bfd47ad19370fa3dc72eb258268c2b5f3768852151674fbe0e155d94d2373a01a5e70f1a105259e7b8b1d2fdf4dba3cf4c780",
+        "wx" : "3ddd68f69d0bfd47ad19370fa3dc72eb258268c2b5f3768852151674",
+        "wy" : "0fbe0e155d94d2373a01a5e70f1a105259e7b8b1d2fdf4dba3cf4c780"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00043ddd68f69d0bfd47ad19370fa3dc72eb258268c2b5f3768852151674fbe0e155d94d2373a01a5e70f1a105259e7b8b1d2fdf4dba3cf4c780",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEPd1o9p0L/UetGTcPo9xy6yWCaMK183aI\nUhUWdPvg4VXZTSNzoBpecPGhBSWee4sdL99Nujz0x4A=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 294,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d009df50acc33b3625a2d5940dd13dbb97d1f7dd56afff8b7de7545127c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041cb1f564c29ebf60a342b3bc33c8945cb279c6c1a012255c874e1c37b75191ab3b2bb730914ebfa14080410970b71eaf4fe01e2d48be9891",
+        "wx" : "1cb1f564c29ebf60a342b3bc33c8945cb279c6c1a012255c874e1c37",
+        "wy" : "0b75191ab3b2bb730914ebfa14080410970b71eaf4fe01e2d48be9891"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00041cb1f564c29ebf60a342b3bc33c8945cb279c6c1a012255c874e1c37b75191ab3b2bb730914ebfa14080410970b71eaf4fe01e2d48be9891",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEHLH1ZMKev2CjQrO8M8iUXLJ5xsGgEiVc\nh04cN7dRkas7K7cwkU6/oUCAQQlwtx6vT+AeLUi+mJE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 295,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00dce8c223f235699d1f5d2dcde4809d013390b59129f783239525c08f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0444e309eb686e7af7f1e2cc17fd56542b38910b3b7908ea54fb038d36477e829d4c8332e5b29f344ad27a21c18dab24a31ce7985b63a21304",
+        "wx" : "44e309eb686e7af7f1e2cc17fd56542b38910b3b7908ea54fb038d36",
+        "wy" : "477e829d4c8332e5b29f344ad27a21c18dab24a31ce7985b63a21304"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000444e309eb686e7af7f1e2cc17fd56542b38910b3b7908ea54fb038d36477e829d4c8332e5b29f344ad27a21c18dab24a31ce7985b63a21304",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEROMJ62huevfx4swX/VZUKziRCzt5COpU\n+wONNkd+gp1MgzLlsp80StJ6IcGNqySjHOeYW2OiEwQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 296,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c074aae944ee7a7d544a5ad0bd06366f872d2250ba3018a63d2a7f2e6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c728064542cb5142f5eefe638124dcd7a1ad0b3555842a47dd5108e110129dd878ebd47313276cec86f521ea9585cd105b3dc421141993b8",
+        "wx" : "0c728064542cb5142f5eefe638124dcd7a1ad0b3555842a47dd5108e1",
+        "wy" : "10129dd878ebd47313276cec86f521ea9585cd105b3dc421141993b8"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004c728064542cb5142f5eefe638124dcd7a1ad0b3555842a47dd5108e110129dd878ebd47313276cec86f521ea9585cd105b3dc421141993b8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAExygGRULLUUL17v5jgSTc16GtCzVVhCpH\n3VEI4RASndh469RzEyds7Ib1IeqVhc0QWz3EIRQZk7g=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 297,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00aae944ee7a7d544a5ad0bd0636d9455f4e83de0f186f89bca56b3c5c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c46c1ad3d3d0df8e9c0f525c21ce8d81ef9d66297f442d63099667220cfa2253aa31a98d8966b85969bf9c819c019292ef6a53ac1db2a108",
+        "wx" : "0c46c1ad3d3d0df8e9c0f525c21ce8d81ef9d66297f442d6309966722",
+        "wy" : "0cfa2253aa31a98d8966b85969bf9c819c019292ef6a53ac1db2a108"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004c46c1ad3d3d0df8e9c0f525c21ce8d81ef9d66297f442d63099667220cfa2253aa31a98d8966b85969bf9c819c019292ef6a53ac1db2a108",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAExGwa09PQ346cD1JcIc6Nge+dZil/RC1j\nCZZnIgz6IlOqMamNiWa4WWm/nIGcAZKS72pTrB2yoQg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 298,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c55d289dcf4faa894b5a17a0c6db3741bbc4ecbe01d01ea33ee7a4e7b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b7b2e48c1e60e20925f4d9b6be600dd83786a936c9bfab00639c33caa967cbc65070739a3379da80d54843a18d9c11a29a32234a0b303c12",
+        "wx" : "0b7b2e48c1e60e20925f4d9b6be600dd83786a936c9bfab00639c33ca",
+        "wy" : "0a967cbc65070739a3379da80d54843a18d9c11a29a32234a0b303c12"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b7b2e48c1e60e20925f4d9b6be600dd83786a936c9bfab00639c33caa967cbc65070739a3379da80d54843a18d9c11a29a32234a0b303c12",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEt7LkjB5g4gkl9Nm2vmAN2DeGqTbJv6sA\nY5wzyqlny8ZQcHOaM3nagNVIQ6GNnBGimjIjSgswPBI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 299,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c4ee7a7d544a5ad0bd0636d9e12bc561ce04faaf1312bba3a15601ebc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f4a3d4598875af7f2741bbd67b1733b6541bc5325b3bcb4d3267c27ec30bf322f58a45c6c2aa2ced55f175d1cbf72a7c5bfc464d74f666c0",
+        "wx" : "0f4a3d4598875af7f2741bbd67b1733b6541bc5325b3bcb4d3267c27e",
+        "wy" : "0c30bf322f58a45c6c2aa2ced55f175d1cbf72a7c5bfc464d74f666c0"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004f4a3d4598875af7f2741bbd67b1733b6541bc5325b3bcb4d3267c27ec30bf322f58a45c6c2aa2ced55f175d1cbf72a7c5bfc464d74f666c0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE9KPUWYh1r38nQbvWexcztlQbxTJbO8tN\nMmfCfsML8yL1ikXGwqos7VXxddHL9yp8W/xGTXT2ZsA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 300,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c361b9cd74d65e79a5874c501bca4973b20347ec97f6de10072d8b46a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0456d1e5c1d664f6ce2fc1fcb937a7ce231a29486abf36c73f77a2bd116cb282c9d7c6fc05f399c183e880ea362edf043cd28ffac9f94f2141",
+        "wx" : "56d1e5c1d664f6ce2fc1fcb937a7ce231a29486abf36c73f77a2bd11",
+        "wy" : "6cb282c9d7c6fc05f399c183e880ea362edf043cd28ffac9f94f2141"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000456d1e5c1d664f6ce2fc1fcb937a7ce231a29486abf36c73f77a2bd116cb282c9d7c6fc05f399c183e880ea362edf043cd28ffac9f94f2141",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEVtHlwdZk9s4vwfy5N6fOIxopSGq/Nsc/\nd6K9EWyygsnXxvwF85nBg+iA6jYu3wQ80o/6yflPIUE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 301,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c6c3739ae9acbcf34b0e98a0379492e764068fd92fedbc200e5b168d4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0430bce8c6b7f1bbba040b8d121d85d55167ac99b2e2cf1cfac8b018b5f1c384c35be0ae309a5cb55aba982343d2125f2d4a559d8c545359cd",
+        "wx" : "30bce8c6b7f1bbba040b8d121d85d55167ac99b2e2cf1cfac8b018b5",
+        "wy" : "0f1c384c35be0ae309a5cb55aba982343d2125f2d4a559d8c545359cd"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000430bce8c6b7f1bbba040b8d121d85d55167ac99b2e2cf1cfac8b018b5f1c384c35be0ae309a5cb55aba982343d2125f2d4a559d8c545359cd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEMLzoxrfxu7oEC40SHYXVUWesmbLizxz6\nyLAYtfHDhMNb4K4wmly1WrqYI0PSEl8tSlWdjFRTWc0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 302,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00a252d685e831b6cf095e4f0535edc5b1609d7c5c7e49a301588a1d3e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e87e538a978cf187908beb27a4a247d496a8421dab1fe79f8744d2b5539b9f8fe8bddcf7c97c44c55a4fc22f4d78f6a961447a5b613b5c49",
+        "wx" : "0e87e538a978cf187908beb27a4a247d496a8421dab1fe79f8744d2b5",
+        "wy" : "539b9f8fe8bddcf7c97c44c55a4fc22f4d78f6a961447a5b613b5c49"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004e87e538a978cf187908beb27a4a247d496a8421dab1fe79f8744d2b5539b9f8fe8bddcf7c97c44c55a4fc22f4d78f6a961447a5b613b5c49",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE6H5TipeM8YeQi+snpKJH1JaoQh2rH+ef\nh0TStVObn4/ovdz3yXxExVpPwi9NePapYUR6W2E7XEk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 303,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00ee746111f91ab4ce8fae96e6f23fd9d20a24d2e79eea563478c0f566",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04113a2cc57c8ee7de11bc45e14546c72a29725b9a7218114ac31f02816c765b9a46b0215312a3292f5979c98d37b35883baa156281b1bae8c",
+        "wx" : "113a2cc57c8ee7de11bc45e14546c72a29725b9a7218114ac31f0281",
+        "wy" : "6c765b9a46b0215312a3292f5979c98d37b35883baa156281b1bae8c"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004113a2cc57c8ee7de11bc45e14546c72a29725b9a7218114ac31f02816c765b9a46b0215312a3292f5979c98d37b35883baa156281b1bae8c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEETosxXyO594RvEXhRUbHKilyW5pyGBFK\nwx8CgWx2W5pGsCFTEqMpL1l5yY03s1iDuqFWKBsbrow=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 304,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c7fffffffffffffffffffffffffffb2364ae85014b149b86c741eb8be",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0423dd9c3f1a4b478b01fa2c5e997d0482073b32918de44be583dcf74ad661a5ed579a2f09d2ff56d6b80f26568d93a237ca6444b0cadc7951",
+        "wx" : "23dd9c3f1a4b478b01fa2c5e997d0482073b32918de44be583dcf74a",
+        "wy" : "0d661a5ed579a2f09d2ff56d6b80f26568d93a237ca6444b0cadc7951"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000423dd9c3f1a4b478b01fa2c5e997d0482073b32918de44be583dcf74ad661a5ed579a2f09d2ff56d6b80f26568d93a237ca6444b0cadc7951",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEI92cPxpLR4sB+ixemX0Eggc7MpGN5Evl\ng9z3StZhpe1Xmi8J0v9W1rgPJlaNk6I3ymREsMrceVE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 305,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00855f5b2dc8e46ec428a593f73219cf65dae793e8346e30cc3701309c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bbce4b17d45d24a1c80bc8eca98c359d5e1e458058a00b950643256dfe09e092318e39303dca03688e4ecf300300784312d617e5088c584c",
+        "wx" : "0bbce4b17d45d24a1c80bc8eca98c359d5e1e458058a00b950643256d",
+        "wy" : "0fe09e092318e39303dca03688e4ecf300300784312d617e5088c584c"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004bbce4b17d45d24a1c80bc8eca98c359d5e1e458058a00b950643256dfe09e092318e39303dca03688e4ecf300300784312d617e5088c584c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEu85LF9RdJKHIC8jsqYw1nV4eRYBYoAuV\nBkMlbf4J4JIxjjkwPcoDaI5OzzADAHhDEtYX5QiMWEw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 306,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c2db5f61aea817276af2064e104c7a30e32034cb526dd0aacfa56566f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04035f58446c1bdbeaa56660a897ebf965f2d18820c7cd0630f04a495347bdfaea60091f405e09929cb2c0e2f6eed53e0871b7fe0cd5a15d85",
+        "wx" : "35f58446c1bdbeaa56660a897ebf965f2d18820c7cd0630f04a4953",
+        "wy" : "47bdfaea60091f405e09929cb2c0e2f6eed53e0871b7fe0cd5a15d85"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004035f58446c1bdbeaa56660a897ebf965f2d18820c7cd0630f04a495347bdfaea60091f405e09929cb2c0e2f6eed53e0871b7fe0cd5a15d85",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEA19YRGwb2+qlZmCol+v5ZfLRiCDHzQYw\n8EpJU0e9+upgCR9AXgmSnLLA4vbu1T4Icbf+DNWhXYU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 307,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d0084a6c7513e5f48c07fffffffffff8713f3cba1293e4f3e95597fe6bd",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04911c0033eac46332691cb7920c4950eed57354761e1081a1ea9f1279508ebf7cfd3eab5dabdee1be14ce8296b1fc20acfaac16f7824c6002",
+        "wx" : "0911c0033eac46332691cb7920c4950eed57354761e1081a1ea9f1279",
+        "wy" : "508ebf7cfd3eab5dabdee1be14ce8296b1fc20acfaac16f7824c6002"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004911c0033eac46332691cb7920c4950eed57354761e1081a1ea9f1279508ebf7cfd3eab5dabdee1be14ce8296b1fc20acfaac16f7824c6002",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEkRwAM+rEYzJpHLeSDElQ7tVzVHYeEIGh\n6p8SeVCOv3z9Pqtdq97hvhTOgpax/CCs+qwW94JMYAI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 308,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c6c7513e5f48c07ffffffffffffff9d21fd1b31544cb13ca86a75b25e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0462b2abb70bb9c7efdfb57181f433b64751f108130dce180d6992e7d3124b3aa8a53e5eedf72aa67e6edcc71f19e36e6ad1d099a59ffd9555",
+        "wx" : "62b2abb70bb9c7efdfb57181f433b64751f108130dce180d6992e7d3",
+        "wy" : "124b3aa8a53e5eedf72aa67e6edcc71f19e36e6ad1d099a59ffd9555"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000462b2abb70bb9c7efdfb57181f433b64751f108130dce180d6992e7d3124b3aa8a53e5eedf72aa67e6edcc71f19e36e6ad1d099a59ffd9555",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEYrKrtwu5x+/ftXGB9DO2R1HxCBMNzhgN\naZLn0xJLOqilPl7t9yqmfm7cxx8Z425q0dCZpZ/9lVU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 309,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00d8ea27cbe9180fffffffffffffff3a43fa3662a899627950d4eb64bc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040f759330e7992752aae6a85f7bb0599784bea53e288ff7ee8d53d5e6defe617362380e92f9a23c4fdcc34e09713aab9cc44119418f6f2fd1",
+        "wx" : "0f759330e7992752aae6a85f7bb0599784bea53e288ff7ee8d53d5e6",
+        "wy" : "0defe617362380e92f9a23c4fdcc34e09713aab9cc44119418f6f2fd1"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00040f759330e7992752aae6a85f7bb0599784bea53e288ff7ee8d53d5e6defe617362380e92f9a23c4fdcc34e09713aab9cc44119418f6f2fd1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAED3WTMOeZJ1Kq5qhfe7BZl4S+pT4oj/fu\njVPV5t7+YXNiOA6S+aI8T9zDTglxOqucxEEZQY9vL9E=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 310,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c3e5f48c07fffffffffffffffffffc724968c0ecf9ed783744a7337b3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048f2eda42742ab31f5d4cf666892d1d623efd3b26f7df9aa70296e80d3beaf235cfea41fadb98c533a8fdeb5841d69ee65f6e71914711f138",
+        "wx" : "08f2eda42742ab31f5d4cf666892d1d623efd3b26f7df9aa70296e80d",
+        "wy" : "3beaf235cfea41fadb98c533a8fdeb5841d69ee65f6e71914711f138"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00048f2eda42742ab31f5d4cf666892d1d623efd3b26f7df9aa70296e80d3beaf235cfea41fadb98c533a8fdeb5841d69ee65f6e71914711f138",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEjy7aQnQqsx9dTPZmiS0dYj79Oyb335qn\nApboDTvq8jXP6kH625jFM6j961hB1p7mX25xkUcR8Tg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 311,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00bfffffffffffffffffffffffffff3d87bb44c833bb384d0f224ccdde",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042bcf4371b319a691ed0e2e0c4a55a8a9b987dec86b863621e97b9c095b8660a74cc964a6af0311edc6b1cd980f9c7bf3a6c9b7f9132a0b2f",
+        "wx" : "2bcf4371b319a691ed0e2e0c4a55a8a9b987dec86b863621e97b9c09",
+        "wy" : "5b8660a74cc964a6af0311edc6b1cd980f9c7bf3a6c9b7f9132a0b2f"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00042bcf4371b319a691ed0e2e0c4a55a8a9b987dec86b863621e97b9c095b8660a74cc964a6af0311edc6b1cd980f9c7bf3a6c9b7f9132a0b2f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEK89DcbMZppHtDi4MSlWoqbmH3shrhjYh\n6XucCVuGYKdMyWSmrwMR7caxzZgPnHvzpsm3+RMqCy8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 312,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c7fffffffffffffffffffffffffff646c95d0a029629370d8e83d717f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a6f252568f6fbd1ae045e602344359c0c216911723748f9a3e7fadec3b76efc75ba030bfe7de2ded686991e6183d40241a05b479693c7015",
+        "wx" : "0a6f252568f6fbd1ae045e602344359c0c216911723748f9a3e7fadec",
+        "wy" : "3b76efc75ba030bfe7de2ded686991e6183d40241a05b479693c7015"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004a6f252568f6fbd1ae045e602344359c0c216911723748f9a3e7fadec3b76efc75ba030bfe7de2ded686991e6183d40241a05b479693c7015",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEpvJSVo9vvRrgReYCNENZwMIWkRcjdI+a\nPn+t7Dt278dboDC/594t7WhpkeYYPUAkGgW0eWk8cBU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 313,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c3fffffffffffffffffffffffffff8b51705c781f09ee94a2ae2e1520",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a74c1c3a31c7d493ab2c0af89cf5e688621ca9466d2ba1d8761c3fe82ba0d08f4c9f76856c2b7138c8f1e780b6959992b16ccdfd925f4b3a",
+        "wx" : "0a74c1c3a31c7d493ab2c0af89cf5e688621ca9466d2ba1d8761c3fe8",
+        "wy" : "2ba0d08f4c9f76856c2b7138c8f1e780b6959992b16ccdfd925f4b3a"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004a74c1c3a31c7d493ab2c0af89cf5e688621ca9466d2ba1d8761c3fe82ba0d08f4c9f76856c2b7138c8f1e780b6959992b16ccdfd925f4b3a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEp0wcOjHH1JOrLAr4nPXmiGIcqUZtK6HY\ndhw/6Cug0I9Mn3aFbCtxOMjx54C2lZmSsWzN/ZJfSzo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 314,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d0096dafb0d7540b93b5790327082635cd8895e1e799d5d19f92b594056",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04034ea72798257f33f24f64c49438fc43e8f67ddc7170fd127e2c43f280562acc9b49f2d7fcc89421d2a5db2ea8dd0361fb48d897d4612627",
+        "wx" : "34ea72798257f33f24f64c49438fc43e8f67ddc7170fd127e2c43f2",
+        "wy" : "080562acc9b49f2d7fcc89421d2a5db2ea8dd0361fb48d897d4612627"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004034ea72798257f33f24f64c49438fc43e8f67ddc7170fd127e2c43f280562acc9b49f2d7fcc89421d2a5db2ea8dd0361fb48d897d4612627",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEA06nJ5glfzPyT2TElDj8Q+j2fdxxcP0S\nfixD8oBWKsybSfLX/MiUIdKl2y6o3QNh+0jYl9RhJic=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 315,
+          "comment" : "point duplication during verification",
+          "msg" : "313233343030",
+          "sig" : "303d021d00c44503dae85dd5210780f02928b3d927171c578f8603d16b240663c7021c3f552f1c2b01651edf5902650fe9ab046f71999ac928edc0087bdb13",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04034ea72798257f33f24f64c49438fc43e8f67ddc7170fd127e2c43f27fa9d53364b60d2803376bde2d5a24d05722fc9e04b727682b9ed9da",
+        "wx" : "34ea72798257f33f24f64c49438fc43e8f67ddc7170fd127e2c43f2",
+        "wy" : "7fa9d53364b60d2803376bde2d5a24d05722fc9e04b727682b9ed9da"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004034ea72798257f33f24f64c49438fc43e8f67ddc7170fd127e2c43f27fa9d53364b60d2803376bde2d5a24d05722fc9e04b727682b9ed9da",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEA06nJ5glfzPyT2TElDj8Q+j2fdxxcP0S\nfixD8n+p1TNktg0oAzdr3i1aJNBXIvyeBLcnaCue2do=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 316,
+          "comment" : "duplication bug",
+          "msg" : "313233343030",
+          "sig" : "303d021d00c44503dae85dd5210780f02928b3d927171c578f8603d16b240663c7021c3f552f1c2b01651edf5902650fe9ab046f71999ac928edc0087bdb13",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043672ba9718e60d00eab4295c819ea366a778dd6fd621fa9665259cb67ae5e847eeaea674beeb636379e968f79265502e414a1d444f04ae79",
+        "wx" : "3672ba9718e60d00eab4295c819ea366a778dd6fd621fa9665259cb6",
+        "wy" : "7ae5e847eeaea674beeb636379e968f79265502e414a1d444f04ae79"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00043672ba9718e60d00eab4295c819ea366a778dd6fd621fa9665259cb67ae5e847eeaea674beeb636379e968f79265502e414a1d444f04ae79",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAENnK6lxjmDQDqtClcgZ6jZqd43W/WIfqW\nZSWctnrl6EfurqZ0vutjY3npaPeSZVAuQUodRE8Ernk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 317,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "313233343030",
+          "sig" : "303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c33333333333333333333333333330486f9be9672d0c5d50ddf45a20c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0433eeefbfc77229136e56b575144863ed90b4c0f8a9e315816d6de648051749dd11480c141fb5a1946313163c0141265b68a26216bcb9936a",
+        "wx" : "33eeefbfc77229136e56b575144863ed90b4c0f8a9e315816d6de648",
+        "wy" : "51749dd11480c141fb5a1946313163c0141265b68a26216bcb9936a"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000433eeefbfc77229136e56b575144863ed90b4c0f8a9e315816d6de648051749dd11480c141fb5a1946313163c0141265b68a26216bcb9936a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEM+7vv8dyKRNuVrV1FEhj7ZC0wPip4xWB\nbW3mSAUXSd0RSAwUH7WhlGMTFjwBQSZbaKJiFry5k2o=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 318,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "303c021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bda03b24b62243c61e288b6ea1e99a2886f700944eb1b8f0466cffd61c712a3aaace69331989b707e69e8de39d7cd1aeb65d97ad1800bf7f",
+        "wx" : "0bda03b24b62243c61e288b6ea1e99a2886f700944eb1b8f0466cffd6",
+        "wy" : "1c712a3aaace69331989b707e69e8de39d7cd1aeb65d97ad1800bf7f"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004bda03b24b62243c61e288b6ea1e99a2886f700944eb1b8f0466cffd61c712a3aaace69331989b707e69e8de39d7cd1aeb65d97ad1800bf7f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEvaA7JLYiQ8YeKItuoemaKIb3AJROsbjw\nRmz/1hxxKjqqzmkzGYm3B+aejeOdfNGutl2XrRgAv38=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 319,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303d021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021d00db6db6db6db6db6db6db6db6db6ceed4c09e84c77ebd9116e17391eb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047abba0cbff134ddcf54d04846f954b882ca9faefdfe818898bfb378b792f10b57970ae57bb4fb01c08886848855aeb1984d3d6fcb2b412df",
+        "wx" : "7abba0cbff134ddcf54d04846f954b882ca9faefdfe818898bfb378b",
+        "wy" : "792f10b57970ae57bb4fb01c08886848855aeb1984d3d6fcb2b412df"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00047abba0cbff134ddcf54d04846f954b882ca9faefdfe818898bfb378b792f10b57970ae57bb4fb01c08886848855aeb1984d3d6fcb2b412df",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEerugy/8TTdz1TQSEb5VLiCyp+u/f6BiJ\ni/s3i3kvELV5cK5Xu0+wHAiIaEiFWusZhNPW/LK0Et8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 320,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303c021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021c33333333333333333333333333330486f9be9672d0c5d50ddf45a20c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f68d99e28653b9ba3e7cedb3b78165f5a54fbe90d4b9f88497977e16234da3eaa0178a51b5b0c208ef0818df6f6578793c1af1787026b8da",
+        "wx" : "0f68d99e28653b9ba3e7cedb3b78165f5a54fbe90d4b9f88497977e16",
+        "wy" : "234da3eaa0178a51b5b0c208ef0818df6f6578793c1af1787026b8da"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004f68d99e28653b9ba3e7cedb3b78165f5a54fbe90d4b9f88497977e16234da3eaa0178a51b5b0c208ef0818df6f6578793c1af1787026b8da",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE9o2Z4oZTubo+fO2zt4Fl9aVPvpDUufiE\nl5d+FiNNo+qgF4pRtbDCCO8IGN9vZXh5PBrxeHAmuNo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 321,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303d021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021d00cccccccccccccccccccccccccccc121be6fa59cb431754377d168831",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04065d9ef133ce81c2d6b66e928360f9527f8f36b5badd35b5f10934272004852755f77440a0b08b9f165489c0696e8b4981d6d04a285b0fd1",
+        "wx" : "65d9ef133ce81c2d6b66e928360f9527f8f36b5badd35b5f1093427",
+        "wy" : "2004852755f77440a0b08b9f165489c0696e8b4981d6d04a285b0fd1"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004065d9ef133ce81c2d6b66e928360f9527f8f36b5badd35b5f10934272004852755f77440a0b08b9f165489c0696e8b4981d6d04a285b0fd1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEBl2e8TPOgcLWtm6Sg2D5Un+PNrW63TW1\n8Qk0JyAEhSdV93RAoLCLnxZUicBpbotJgdbQSihbD9E=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 322,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303c021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021c249249249249249249249249249227ce201a6b76951f982e7ae89852",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d6cea09472ede574ce1e0546c9acd0e1cd8cba9b121df29e89d5092e83904ebfb902ea61c987dc0508e0c9a7e563e2609feaf79140ab91d6",
+        "wx" : "0d6cea09472ede574ce1e0546c9acd0e1cd8cba9b121df29e89d5092e",
+        "wy" : "083904ebfb902ea61c987dc0508e0c9a7e563e2609feaf79140ab91d6"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004d6cea09472ede574ce1e0546c9acd0e1cd8cba9b121df29e89d5092e83904ebfb902ea61c987dc0508e0c9a7e563e2609feaf79140ab91d6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE1s6glHLt5XTOHgVGyazQ4c2MupsSHfKe\nidUJLoOQTr+5AuphyYfcBQjgyaflY+Jgn+r3kUCrkdY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 323,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "303c021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021c0eb10e5ab95facded4061029d63a46f46f12947411f2ea561a592057",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c520b18003b356094147ee2f9df1178572bed837bd89443b25ebceb80e2e93a998fbbabe82192ea4c85651cf09a95ab0dc2e3d975ee7be98",
+        "wx" : "0c520b18003b356094147ee2f9df1178572bed837bd89443b25ebceb8",
+        "wy" : "0e2e93a998fbbabe82192ea4c85651cf09a95ab0dc2e3d975ee7be98"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004c520b18003b356094147ee2f9df1178572bed837bd89443b25ebceb80e2e93a998fbbabe82192ea4c85651cf09a95ab0dc2e3d975ee7be98",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAExSCxgAOzVglBR+4vnfEXhXK+2De9iUQ7\nJevOuA4uk6mY+7q+ghkupMhWUc8JqVqw3C49l17nvpg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 324,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "303d021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049dd0b99bb7a830bcc7d55abac42912d525b063c50cf377ca5771a26ca141fccf0793c2ba2469a946c2d4ed26344052c63a6d7e7797ce96c3",
+        "wx" : "09dd0b99bb7a830bcc7d55abac42912d525b063c50cf377ca5771a26c",
+        "wy" : "0a141fccf0793c2ba2469a946c2d4ed26344052c63a6d7e7797ce96c3"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00049dd0b99bb7a830bcc7d55abac42912d525b063c50cf377ca5771a26ca141fccf0793c2ba2469a946c2d4ed26344052c63a6d7e7797ce96c3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEndC5m7eoMLzH1Vq6xCkS1SWwY8UM83fK\nV3GibKFB/M8Hk8K6JGmpRsLU7SY0QFLGOm1+d5fOlsM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 325,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303e021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021d00db6db6db6db6db6db6db6db6db6ceed4c09e84c77ebd9116e17391eb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043dab9f1b19e715d174a7360920375d569a181f055e66f01391871b6f47a6d87c23a5b6a1e3d0a9721302cc02cce35f35dea08e22619be521",
+        "wx" : "3dab9f1b19e715d174a7360920375d569a181f055e66f01391871b6f",
+        "wy" : "47a6d87c23a5b6a1e3d0a9721302cc02cce35f35dea08e22619be521"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00043dab9f1b19e715d174a7360920375d569a181f055e66f01391871b6f47a6d87c23a5b6a1e3d0a9721302cc02cce35f35dea08e22619be521",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEPaufGxnnFdF0pzYJIDddVpoYHwVeZvAT\nkYcbb0em2Hwjpbah49CpchMCzALM41813qCOImGb5SE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 326,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303d021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021c33333333333333333333333333330486f9be9672d0c5d50ddf45a20c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0456dde1ba58ea31053b2535c66623344c24c72d214af5be6982e89100e771084806143e86f2b31bdaf62280f5b311d0d2bdbb385b20fc6c87",
+        "wx" : "56dde1ba58ea31053b2535c66623344c24c72d214af5be6982e89100",
+        "wy" : "0e771084806143e86f2b31bdaf62280f5b311d0d2bdbb385b20fc6c87"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000456dde1ba58ea31053b2535c66623344c24c72d214af5be6982e89100e771084806143e86f2b31bdaf62280f5b311d0d2bdbb385b20fc6c87",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEVt3huljqMQU7JTXGZiM0TCTHLSFK9b5p\nguiRAOdxCEgGFD6G8rMb2vYigPWzEdDSvbs4WyD8bIc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 327,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303e021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021d00cccccccccccccccccccccccccccc121be6fa59cb431754377d168831",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0494efe1387fc0447d7dbcb53739a0e4e0ddec181d382caea645b1a6124414a6b1c78908d0fa206f8f2de950ad4a14d1ce94d9cddbe32e4601",
+        "wx" : "094efe1387fc0447d7dbcb53739a0e4e0ddec181d382caea645b1a612",
+        "wy" : "4414a6b1c78908d0fa206f8f2de950ad4a14d1ce94d9cddbe32e4601"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000494efe1387fc0447d7dbcb53739a0e4e0ddec181d382caea645b1a6124414a6b1c78908d0fa206f8f2de950ad4a14d1ce94d9cddbe32e4601",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAElO/hOH/ARH19vLU3OaDk4N3sGB04LK6m\nRbGmEkQUprHHiQjQ+iBvjy3pUK1KFNHOlNnN2+MuRgE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 328,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303d021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021c249249249249249249249249249227ce201a6b76951f982e7ae89852",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046286803b952976ee1897013695d3ef2cbb6f977142a042b236572577722a6ce9ad3e3fd28e451833496c63b8ab70538877215f204942bf59",
+        "wx" : "6286803b952976ee1897013695d3ef2cbb6f977142a042b236572577",
+        "wy" : "722a6ce9ad3e3fd28e451833496c63b8ab70538877215f204942bf59"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00046286803b952976ee1897013695d3ef2cbb6f977142a042b236572577722a6ce9ad3e3fd28e451833496c63b8ab70538877215f204942bf59",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEYoaAO5Updu4YlwE2ldPvLLtvl3FCoEKy\nNlcld3IqbOmtPj/SjkUYM0lsY7ircFOIdyFfIElCv1k=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 329,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "303d021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021c0eb10e5ab95facded4061029d63a46f46f12947411f2ea561a592057",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34",
+        "wx" : "0b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21",
+        "wy" : "0bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEtw4MvWu0v38yE5C5SgPB01bCESI0MoDW\nEVwdIb03Y4i19yP7TCLf5s1DdaBaB0dkRNWBmYUAfjQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 330,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "303d021d00bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419fe021c249249249249249249249249249227ce201a6b76951f982e7ae89851",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 331,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "303c021c44a5ad0bd0636d9e12bc9e0a6bdc74bfe082087ae8b61cbd54b8103f021c249249249249249249249249249227ce201a6b76951f982e7ae89851",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d2142c89c774a08dc04b3dd201932bc8a5ea5f8b89bbb2a7e667aff81cd",
+        "wx" : "0b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21",
+        "wy" : "42c89c774a08dc04b3dd201932bc8a5ea5f8b89bbb2a7e667aff81cd"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d2142c89c774a08dc04b3dd201932bc8a5ea5f8b89bbb2a7e667aff81cd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEtw4MvWu0v38yE5C5SgPB01bCESI0MoDW\nEVwdIULInHdKCNwEs90gGTK8il6l+Libuyp+Znr/gc0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 332,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "303d021d00bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419fe021c249249249249249249249249249227ce201a6b76951f982e7ae89851",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 333,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "303c021c44a5ad0bd0636d9e12bc9e0a6bdc74bfe082087ae8b61cbd54b8103f021c249249249249249249249249249227ce201a6b76951f982e7ae89851",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466ddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176",
+        "wx" : "4c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466",
+        "wy" : "0ddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00044c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466ddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAETCRmcGWKHUH113vOJGy+OGrCKEjiabnU\nzWfEZt3ZRxU9ObLUJTOkYN7yaIBAjK8t091I/oiM0XY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 334,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "303d021c0364e7d96832614a80216e730c353534d4bffd2c26649c0b4b0e2628021d008f40064b412fe38c5ba9cf664e6172ed48e6e79f0fe5e31a54985dfc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 335,
+          "comment" : "pseudorandom signature",
+          "msg" : "4d7367",
+          "sig" : "303d021d00f4b68df62b9238363ccc1bbee00deb3fb2693f7894178e14eeac596a021c7f51c9451adacd2bcbc721f7df0643d7cd18a6b52064b507e1912f23",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 336,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "303d021d00b2970cdec29c70294a18bbc49985efa33acc0af509c326a3977a35e8021c0cea3ed8ebaaf6ee6aef6049a23cbc39f61fcf8fc6be4bab13385579",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 337,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "303d021c7e7b0eb7da8c68a7072b11404ee95a5c407fbfe3d69646802e28ae77021d00d409a2f6bbaae59bb60fc0a092b12fa4e67dc8d088cf19a833322fd6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04aed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf8a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000",
+        "wx" : "0aed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf",
+        "wy" : "08a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004aed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf8a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAErtb8rSQAxNlOVdu2sBLOPUwrRoQ/vpnU\nKJ5uz4okqJ5xND19FR0ljSy2kDScLVazZt0QpgAAAAA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 338,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c519bf185ff4635271961fa491be257231deeea9c53a6ede3b4a89ed1021c486bdad484a6a3134e1471cf56a9df0fac50f773b3e37d6f327617d7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 339,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c09fd644898b7cb5d018b52234e7b4ef2b54789afd0ce9c434e9e5515021d00f19309532164ea2053cae55df7bdcbab536c83ea7bfe6fe10d60c1ab",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 340,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00ec919d4e283ccf1f71a9e3c0f781a36758d3f38b1b78a87a74288e80021c4c4663044a73c79bd88f0dc245ab1a32f89f06f40a704b31e9fabc51",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f173d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff",
+        "wx" : "0bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f1",
+        "wy" : "73d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f173d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEvxns/kP/4on2mfR5MWFFuaf3Nwuezlqx\nISF08XPVKJSa6RQvgYut5xqWBAeWO+C2SCpqYP////8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 341,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00c51760478447217597ecc6f4001bd45088d53c90f53103608bf88aea021d00a201253aa903f9781e8992101d7171d2dd3a5d48c44d8e1d544cd6d7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 342,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c76be0112674ec29128823e1af7512e6143872fef30a64e2f1799bd56021c187e503e1a48c27b549fe0a4ce5e581e242c8663fc9efb02d6f2b193",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 343,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c36245ef126b5b51e459f84eaaad5a495061f0471dc8c23f1c5f16282021c39e31d72a06ba8e14fcf95778e07bc16a2628e39449da8857d506edc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0426e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0",
+        "wx" : "26e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000",
+        "wy" : "0eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000426e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEJuWr8TXLVOqqFraeSwspInU0Toignfbf\ngAAAAOq4kd5U4/Jv9Qq5ifMz2sVRWD1GiuYjxZZDSvA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 344,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c258682975df8bca7f203f771ebeb478ef637360c860fc386cfb21745021c7663e70188047e41469a2a35c8c330dd900f2340ba82aafd22962a96",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 345,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d0085c98614f36c0d66f8d87834cae978611b7b4eebf59a46bea1b89ae9021d00d1a18e378dda840e06b60f6279bf0a2231d9fa2d8d2c31e88bc1bdd7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 346,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00ca7b7432ba41ff2112e1116fffde89bbd68f5ce67fe5513d16c8e6f7021d00e421b7599e0180798acc2006451603cda2db1d582741116e6033ce5f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd",
+        "wx" : "0ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff",
+        "wy" : "41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE7GJ/NFVF0D+Mbb0I5XVScRZWf+N1+eyq\n/////0G/cFaX1fcWvPeHGNU5O2OphpH0ofJCRjdVOP0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 347,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c19397fe5d3ecabf80fc624c1bf379564387517c185087dc97d605069021c33b5773e9aaf6c34cb612cfc81efd3bf9c22224e8c4fa1bfccf5c501",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 348,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c70f24f5c164164bfbb8459aa12a981aa312dbcf00204326ebaaabdc8021d00f5cebee8caedae8662c43501665084b45d2f494fb70d603043543dc4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 349,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c0bf2d86ecaa8b56aca5e8f8ebcb45081d078a14555b75f5be8e9b132021d009a55b3ce4734849966b5034ccd9b19f76407ee0241c3f58e7b8fc89a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a00000000762d28f1fdc219184f81681fbff566d465b5f1f31e872df5",
+        "wx" : "15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a",
+        "wy" : "762d28f1fdc219184f81681fbff566d465b5f1f31e872df5"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a00000000762d28f1fdc219184f81681fbff566d465b5f1f31e872df5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEFQFuUrNkctU2R3YF+4Bd05AwgqBi0eow\nr55VWgAAAAB2LSjx/cIZGE+BaB+/9WbUZbXx8x6HLfU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 350,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00bfc5dc4434cd09369610687d38d2d418b63fd475dea246a456b25a3a021d00b171dfa6cf722f20816370a868785da842b37bac31d7b78e6751fc50",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 351,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d008fdbe8da646c5642d767c7dbeb3872b1edab6e37365805f0e94ce0a9021d00bcf35ab81222883dd3526cb0cf93138f4687cd0b10c2b0a126385161",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 352,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00e23a11275848fd4f8b6f4ac4fc305eae981d3b7dc453e5a980c46422021c1a875693f24a03ea1614c4c3bbd0dd7221429f22b337ea7d98348ca4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555affffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c",
+        "wx" : "15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a",
+        "wy" : "0ffffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555affffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEFQFuUrNkctU2R3YF+4Bd05AwgqBi0eow\nr55VWv////+J0tcOAj3m57B+l99ACpkrmkoODOF40gw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 353,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c76645164ff9af3a1a9205fda2eef326d2bffc795dcc4829547fe01dd021d00b65bba503719314b27734dd06b1395d540af8396029b78b84e0149eb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 354,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c32fa0ca7e07f1f86ac350734994e1f31b6da9c82f93dced2b983c29c021c7b7891282206a45711bdfcb2a102b5d289df84ff5778548603574004",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 355,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c2d5492478ca64e5111dfd8521867b6477b7e78227849ad090b855694021d00a532f5a2fa3594af81cd5928b81b4057da717be5fb42a3a86c68190d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400000000f7e4713d085112112c37cdf4601ff688da796016b71a727ade5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1",
+        "wx" : "0f7e4713d085112112c37cdf4601ff688da796016b71a727a",
+        "wy" : "0de5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000400000000f7e4713d085112112c37cdf4601ff688da796016b71a727ade5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEAAAAAPfkcT0IURIRLDfN9GAf9ojaeWAW\ntxpyet5ansFlBUzJh/nch+mZG5Lk+mScplXurp8qMOE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 356,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c191eee5daf55cd499e8539cb2cff797cfec5d566d2027bf9f8d64693021d00dadfeae8131f64d96b94fd340197caa2bc04818554812feef3343070",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 357,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00e0e2c08180b8a207ee9105a7d379fa112368e8370fa09dfde4a45c45021d00c717bc0860e016e7ce48f8fe6a299b36906a6055adad93b416ce8838",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 358,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c1b919ef93532292743bb2e1b7b4894fd847c6e5de52a08e1b0f2dcfb021d00c2d30d6b7594d8dbd261491ae1d58779505b075b64e5564dc97a418b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f72586c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e",
+        "wx" : "0ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f725",
+        "wy" : "086c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f72586c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE/////+rffO6NNNBM8iyPfeNWdPsvUB0k\nKnb3JYbECTCdOY5gzh4KTJ4FqdMmJ1d+jOLMfzr6LD4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 359,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00e75db49ed33ff2885ea6100cc95b8fe1b9242ea4248db07bcac2e020021c796c866142ae8eb75bb0499c668c6fe45497692fbcc66b37c2e4624f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 360,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c1f81cd924362ec825890307b9b3936e0d8f728a7c84bdb43c5cf0433021c39d3e46a03040ad41ac026b18e0629f6145e3dc8d1e6bbe200c8482b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 361,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c00fda613aa67ca42673ad4309f3f0f05b2569f3dee63f4aa9cc54cf3021c1e5a64b68a37e5b201c918303dc7a40439aaeacf019c5892a8f6d0ce",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1000000000e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc",
+        "wx" : "0b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1",
+        "wy" : "0e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1000000000e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEsAE8b7/28J/s2hwmPvZTmdTPmJyl/E+P\n/w/p4QAAAAAOKrDoSV6FnrKvsAdp1uf+YmoRkWfAtrw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 362,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00b932b3f7e6467e1ec7a561f31160248c7f224550a8508788634b53ce021d00a0c5312acf9e801aff6d6fc98550cfa712bbf65937165a36f2c32dc9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 363,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00e509593fb09245ee8226ce72786b0cc352be555a7486be628f4fd00c021c0b7abde0061b1e07bf13319150a4ff6a464abab636ab4e297b0d7633",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 364,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c6e54f941204d4639b863c98a65b7bee318d51ab1900a8f345eac6f07021c0da5054829214ecde5e10579b36a2fe6426c24b064ed77c38590f25c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945",
+        "wx" : "0b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1",
+        "wy" : "0fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEsAE8b7/28J/s2hwmPvZTmdTPmJyl/E+P\n/w/p4f/////x1U8XtqF6YU1QT/eWKRgBnZXubpg/SUU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 365,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d0085ea4ab3ffdc992330c0ca8152faf991386bce82877dbb239ba654f6021c0806c6baf0ebea4c1aaa190e7d4325d46d1f7789d550632b70b5fc9b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 366,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c44d53debb646b73485402eab2d099081b97b1243c025b624f0dd67ea021d00e5de789a7d4b77eac6d7bba41658e6e4dc347dabed2f9680c04a6f55",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 367,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c1526eb2f657ebea9af4ca184b975c02372c88e24e835f3f5774c0e12021c1f1ecce38ee52372cb201907794de17b6d6c1afa13c316c51cb07bc7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdsa_secp224r1_sha512_test.json b/third_party/wycheproof/testvectors/ecdsa_secp224r1_sha512_test.json
new file mode 100644
index 0000000..56d9ee4
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdsa_secp224r1_sha512_test.json
@@ -0,0 +1,4814 @@
+{
+  "algorithm" : "ECDSA",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "BER" : "This is a signature with correct values for (r, s) but using some alternative BER encoding instead of DER encoding. Implementations should not accept such signatures to limit signature malleability.",
+    "EdgeCase" : "Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA implementation does not check boundaries and computes s^(-1)==0.",
+    "MissingZero" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.",
+    "PointDuplication" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission."
+  },
+  "numberOfTests" : 437,
+  "header" : [],
+  "testGroups" : [
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5",
+        "wx" : "0eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7",
+        "wy" : "0eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004eada93be10b2449e1e8bb58305d52008013c57107c1a20a317a6cba7eca672340c03d1d2e09663286691df55069fa25490c9dd9f9c0bb2b5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE6tqTvhCyRJ4ei7WDBdUgCAE8VxB8GiCj\nF6bLp+ymcjQMA9HS4JZjKGaR31UGn6JUkMndn5wLsrU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "signature malleability",
+          "msg" : "313233343030",
+          "sig" : "303c021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021c394766fb67a65fe0af6c154f7cbd285ea180b4c6150cdafafb0f6f0f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "Legacy:ASN encoding of s misses leading 0",
+          "msg" : "313233343030",
+          "sig" : "303c021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021cc6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingZero"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "valid",
+          "msg" : "313233343030",
+          "sig" : "303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30813d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 5,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "303e02811c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 6,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "303e021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab02811d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 7,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3082003d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 8,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "303f0282001c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "303f021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0282001d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 10,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303e021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303c021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303d021d691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303d021b691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021e00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021c00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3085010000003d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "30420285010000001c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3042021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0285010000001d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "308901000000000000003d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3046028901000000000000001c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3046021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab028901000000000000001d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30847fffffff021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "304102847fffffff691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "3041021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab02847fffffff00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3084ffffffff021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "30410284ffffffff691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3041021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0284ffffffff00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3085ffffffffff021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "30420285ffffffffff691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3042021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0285ffffffffff00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3088ffffffffffffffff021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "30450288ffffffffffffffff691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3045021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0288ffffffffffffffff00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30ff021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "303d02ff691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab02ff00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "3080021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "303d0280691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab028000c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "303f021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "303f0000021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "303f021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3042498177303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30412500303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "303f303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30422221498177021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304122202500021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3045221e021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0004deadbeef021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3042021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab2222498177021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3041021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab22212500021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3045021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab221f021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3045aa00bb00cd00303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3043aa02aabb303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30452224aa00bb00cd00021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30432222aa02aabb021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3045021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab2225aa00bb00cd00021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3043021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab2223aa02aabb021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "30412280021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0000021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3041021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab2280021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3080313d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "30412280031c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0000021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3041021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab2280031d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2e3d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2f3d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "313d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "323d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "ff3d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "3041300102303c1c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "303c021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "303c1c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0000",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 79,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "3080021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "3080021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e05000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "3080021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "3080021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "3080021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "303f3000021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "303f021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "303f303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "301e021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "305c021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "removing integer",
+          "msg" : "313233343030",
+          "sig" : "301f021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "302002021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "301f021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab02",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "303f021e691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0000021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "303f021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021f00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "303f021e0000691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 95,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "303f021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021f000000c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 96,
+          "comment" : "appending unused 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "303f021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0000021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "303f021e691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0500021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "303f021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021f00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "30210281021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "3020021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0281",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "30210500021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "3020021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303d001c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303d011c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303d031c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303d041c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303dff1c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab001d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab011d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab031d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab041d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92abff1d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "30210200021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "3020021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab0200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "30412220020169021b1c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "3041021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab2221020100021cc6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "303d021c6b1c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d02c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf922b021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbbae",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "303c021b691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "303c021b1c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "303c021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021c00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "303c021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021cc6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "303e021dff691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "303e021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021eff00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "3022090180021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "3021021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab090180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "3021021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab020100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303e021d01691c723dd6a7f5d11b8c8e8bd08173428bc48a2c3f031caaec3bbce8021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303e021dff691c723dd6a7f5d11b8c8e8bd08345fcca52a9b01748ca203383686e021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021c96e38dc229580a2ee47371742f7da36054f46611d4da0c9a70206d55021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303e021d0096e38dc229580a2ee47371742f7cba0335ad564fe8b735dfcc7c9792021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303e021dfe96e38dc229580a2ee47371742f7e8cbd743b75d3c0fce35513c44318021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303e021d01691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303e021d0096e38dc229580a2ee47371742f7da36054f46611d4da0c9a70206d55021d00c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d01c6b899049859a01f5093eab0834104e71ff12bb612ad778fbda8e56b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303c021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021cc6b899049859a01f5093eab08342d7a15e7f4b39eaf3250504f090f1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021dff394766fb67a65fe0af6c154f7cbe11bbc0c7c488012fb1b59eb344d2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021dfe394766fb67a65fe0af6c154f7cbefb18e00ed449ed52887042571a95",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303d021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021d01c6b899049859a01f5093eab08341ee443f383b77fed04e4a614cbb2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "303c021c691c723dd6a7f5d11b8c8e8bd0825c9fab0b99ee2b25f3658fdf92ab021c394766fb67a65fe0af6c154f7cbe11bbc0c7c488012fb1b59eb344d2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020100021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022020101021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020101090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30220201ff021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30220201ff021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30220201ff021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30080201ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3024021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffffffff000000000000000000000001020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffffffff000000000000000000000001020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffffffff0000000000000000000000010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000001021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3024021d00ffffffffffffffffffffffffffffffff000000000000000000000001090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffffffff000000000000000000000002020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffffffff000000000000000000000002020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffffffff0000000000000000000000020201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3e",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffffffff000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffffffff000000000000000000000002021d00ffffffffffffffffffffffffffffffff000000000000000000000002",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3024021d00ffffffffffffffffffffffffffffffff000000000000000000000002090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "Edge case for Shamir multiplication",
+          "msg" : "3639313930",
+          "sig" : "303c021c326bc06353f7f9c9f77b8f4b55464e8619944e7879402cca572e041a021c221a25eb9cc8dd66fdf156b2f6ab601ab6d9c509247f8de5d2671a96",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "special case hash",
+          "msg" : "33393439313934313732",
+          "sig" : "303c021c3b3008ed596b7fa276498def40d96b1eb2ffb731a44050ffb732e4e6021c6dbb08c56db737e9392ff4f3a54d8b806d70af226ecf413b3465de55",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "special case hash",
+          "msg" : "35333637363431383737",
+          "sig" : "303d021d00d1fe269c3061e4b94604e8d612d70887068cc7d5232cd5a9b72923a1021c3c1cbc027d33fb2451d52dce3a828a8c7ecc490a28a94e5e5bb2c4d7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "special case hash",
+          "msg" : "35363731343831303935",
+          "sig" : "303d021c04586134cc679295dd93499311c4a8af37cb94dadbae18d8ee279b9b021d00bf9170a1b65b665664cf567d40a995ce252a23d6a9f962b05e364486",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "special case hash",
+          "msg" : "3131323037313732393039",
+          "sig" : "303d021d00c1f51009b935b4773374364ec3eed72a24b70926e0349c77862f3475021c46df3d98f104ba6602f8041a5bf5495fb240e103d1bd17f2fa878923",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "special case hash",
+          "msg" : "3131323938303334323336",
+          "sig" : "303e021d00e822242872f1ecf338a4f773df87b67e9b21bb283acac7d66b26551e021d0094d4e0fc3c6359994a6eaedddd1533f490f72ef85139f8d3b39cf07b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "special case hash",
+          "msg" : "39383736303239363833",
+          "sig" : "303c021c7fd45528eb7bfc3710e273c4468f0b50ebf93f94cd0e7a602a4929a6021c46613dd1ffd85df8d71f3498001721fda4982c27a1c291359b05b1b8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "special case hash",
+          "msg" : "3230323034323936353139",
+          "sig" : "303d021c36d137b69171a486933b50138d1db1842724766afd25c85b0032daf5021d008e700de21f2fc350a34c7cc19054cf371ecab6f7331ccecf68fca0f4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "special case hash",
+          "msg" : "31343531363639313830",
+          "sig" : "303e021d00da3b436908f5a82f26bc17a8577ad2a782946e3a7587b01d253b1dd0021d00a6544e38f24e8117370c049b5d1f6712ea14337a94511224df4496a3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "special case hash",
+          "msg" : "31303933363835393531",
+          "sig" : "303c021c4314a2bd139d47be3d9fd9ebdd72a06a220219c7596b944178ee6f5f021c0e6f1d2f57c699654e9c705d7b8fa3c1ccb0f939f6368bed246b2e10",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "special case hash",
+          "msg" : "36323139353630323031",
+          "sig" : "303d021c6a25643464682679d84970c603927f4a8ca83e7ef9715dd1ed84c28f021d00932b78d165c225a5253e6201c0b1ded0898ba24de44b23233eb78054",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "special case hash",
+          "msg" : "35363832343734333033",
+          "sig" : "303c021c476aaa58677d9e60477cffd026c43248e2cf3cc21e8fdccb75ceefad021c7799fc7af8f9b929203faf899bb5ca1aecf2492555157282dfde790d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "special case hash",
+          "msg" : "33373336353331373836",
+          "sig" : "303d021c63a98614a1421e2ebb278de53b61618bafc757122647affd358c667a021d008edba806e0a7e438ca35f98405a8ad2d5c3e8cc2d5c4384233aef0a5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "special case hash",
+          "msg" : "34373935393033373932",
+          "sig" : "303e021d00880b5238a014f8b44655b83c175880eb1e8307899a824ea3e07dbd6d021d00a4724c8649fd74e5bc8d7fe6a9067a1376fb8e08dbdaed68980b0f50",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "special case hash",
+          "msg" : "39333939363131303037",
+          "sig" : "303e021d00f8743588234634dd9891f4f2f40f4e46b77f97b82dc5dbe234aa6b5d021d0080656e5262bc25e158f3b78f51ae0d6a41cc8cca1aa457221b2eb7fb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 231,
+          "comment" : "special case hash",
+          "msg" : "31303837343931313835",
+          "sig" : "303d021c2a2357e3d8fe34434582be4dabd58b77b388d1d52adcc664f45dece4021d0094be3a369b7c2788df4587ec5bd4163c4cbc40b77de1a85e8bcfb251",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 232,
+          "comment" : "special case hash",
+          "msg" : "33323336363738353030",
+          "sig" : "303d021d00b6b0c0aba6c611300ecad8816242c415f183a2bd4d46cd7769033d9b021c7750b24be02f22dc0b656fe4af377413f9453dff99226915dbb6e08f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 233,
+          "comment" : "special case hash",
+          "msg" : "31343438393937373033",
+          "sig" : "303d021d00a5c1a75c2779f3eb83a65e295927cce4288e9d5c2132a4c7ca92526e021c10fe30f0be33a785385137b57d806140a402b9bd3c1df1b57de6da63",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 234,
+          "comment" : "special case hash",
+          "msg" : "35373134363332383037",
+          "sig" : "303d021d00b92b5521d1a7abe77e8524dbd3001121cf83c08017e3917bc58b5d1c021c224b113779017f6a522171edf930f1b5d4f5e7dedc6d2d514fd7883c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 235,
+          "comment" : "special case hash",
+          "msg" : "323236343837343932",
+          "sig" : "303e021d00ebd3ecf3aa64cdcdd171585a141a4a673a8d5de0ca087dfcdf62432e021d00e0f1a0f7b8f5ac4a42632f87156ad1094079393b03f2051a9fd60249",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 236,
+          "comment" : "special case hash",
+          "msg" : "35333533343439343739",
+          "sig" : "303d021c6c3854297e1f267b64a28e0cd6148e0fadcf85bc8d5c23947543bcb8021d00aa0594ee11312f5d4767d296e5ca83df68072811f81a8d27e178ca5d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 237,
+          "comment" : "special case hash",
+          "msg" : "34373837333033383830",
+          "sig" : "303c021c785ac8c956d7797ae67498775b3c446c41735eb15f3430b49f6a09f2021c5710879ab83994e809c8d2cbd6f2ac5c205b4b8d6226e98be03e7967",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 238,
+          "comment" : "special case hash",
+          "msg" : "32323332313935383233",
+          "sig" : "303e021d00f1f3d016693125ba73981c8f9a1748e5dce1d9634355f26fa536190e021d00b574e97def60dcd0e9177106483791b2edb4ab0342b9f5ebb957d5b0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 239,
+          "comment" : "special case hash",
+          "msg" : "3130373339333931393137",
+          "sig" : "303e021d00e64f3371522cb1a5f0d1511b152b20e01deca0b3284786853cac279a021d00c9a2e5f4ffde22b9d4ed0179ce74fff408ea918dda7685c7980ae61a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 240,
+          "comment" : "special case hash",
+          "msg" : "31383831303237333135",
+          "sig" : "303d021c1f99dd6ef72feeeda6c123baa4fabb126d7dedb64130fae3f4230797021d00e441ec51dca6271b043e95753c4043d7cb4e76fdc13d6aea45fbf243",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 241,
+          "comment" : "special case hash",
+          "msg" : "36303631363933393037",
+          "sig" : "303d021d008637a09627c52766bf96f0b6cea6f2ac3eb303001c5f6fe6d628e4ba021c10b66c599455d40077bb865ed43e2c2cc403473baa6d63b16be48c84",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 242,
+          "comment" : "special case hash",
+          "msg" : "38383935323237303934",
+          "sig" : "303c021c52a010a23e4f9ebb459bbe9f3057e6c19761fb99d25c9b16b8f007d8021c526dc1f34444de00447ba23c76950f2c159579d548b6335d127ea321",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 243,
+          "comment" : "special case hash",
+          "msg" : "31353830323334303934",
+          "sig" : "303d021d00fc49caaada528f3357e5a264f2e7f970ca1b15ca5fee28741d1202ac021c175e884d10d0bfd20b39311ce2c53083da167d1f3dfeb990e59ed628",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 244,
+          "comment" : "special case hash",
+          "msg" : "33393635393931353132",
+          "sig" : "303d021d00d95d539a85c9edacd4e02ede27b0e0b737099612d166c637c83a9f34021c59936a2b90b7f3f3da83f64dec8e347a3bfa57baadf9acea18c071d8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 245,
+          "comment" : "special case hash",
+          "msg" : "32323838373332313938",
+          "sig" : "303c021c1895e65593d71e5635cce022dda19bd155bb9a7f2e307e5ce9127ade021c121b487c320c544dcdd471d46fcde2ce5dc9d17fda70544c4eab50a2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 246,
+          "comment" : "special case hash",
+          "msg" : "32323330383837333139",
+          "sig" : "303d021d00b5f4c85b13b51a5da81a236f1105937f3d98856d2aeb57101b6b499c021c3be74ae770fa6467f76a742eb9e504a815a4a60e74b38bcaa89f9b06",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 247,
+          "comment" : "special case hash",
+          "msg" : "313239303536393337",
+          "sig" : "303c021c07a57197667a0c40423d4811ff96384c9330467e8a28eaa4c0d519f4021c011062c8694494baaed24ff610e1e4227efb59a163c33fafd40100f9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 248,
+          "comment" : "special case hash",
+          "msg" : "32373438363536343338",
+          "sig" : "303c021b7f718615ba1d0a9d27a8c5a678a6225ffe1233ed8b417c9343b310021d00cf6a87e4496725c6a2612f4034ddf4b31c7435e2fc3a163e92d463ba",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 249,
+          "comment" : "special case hash",
+          "msg" : "37353833353032363034",
+          "sig" : "303e021d00ba8f95a4363c493a9f78bb61dbefaa9587d028bb8344420de2b0cf21021d00b3798c2d6e27a2591c2edc18320b78bf11df194b11b3fb498c595232",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 250,
+          "comment" : "special case hash",
+          "msg" : "32333237373534323739",
+          "sig" : "303c021c596b74077801db2e889d3b2aaa3990fe180abc152d48528385ca955d021c38bffd416f779843fad389750003eb0708112a4834c554f476a3e0d1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 251,
+          "comment" : "special case hash",
+          "msg" : "373735353038353834",
+          "sig" : "303d021d008547f62967523a06c9690e5ff66c3f2254cda28f09ffccc222433d39021c3d9ebf664ee551bb7b33157d6c6c5fd456bda3d4ae460215ec1a5f94",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 252,
+          "comment" : "special case hash",
+          "msg" : "3137393832363438333832",
+          "sig" : "303d021d0090ee3fab9c6ce373a1b35fc135fe878280ee25e58a4bd7529e91b4f0021c6451e7526505b44e88472b46eda3fd2679824dcdfc445e67f35ea382",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 253,
+          "comment" : "special case hash",
+          "msg" : "32333936373737333635",
+          "sig" : "303c021c0a530530b6a9238d2d1a3cf468986c87f3b208f61ea0486d53140c17021c5f027a73f31a5cc2bee81ff0019477c542fd782ecde0e551fcd37e93",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 254,
+          "comment" : "special case hash",
+          "msg" : "35393938313035383031",
+          "sig" : "303e021d00beab4abd23df5e2acfff07c82e245dfa7d587d0238c2c9ab9c88a96a021d0098c6507635536840edf604f9baae6408ce4d3fbee694db3abd825011",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 255,
+          "comment" : "special case hash",
+          "msg" : "3136363737383237303537",
+          "sig" : "303d021c3ec8c36335cb98fa07b983c35b7fc256f44a5aa192d6087595145a15021d00c32b7a47ac6271f4593562bbbf91f9e07395a5e4d46970495cf29f05",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 256,
+          "comment" : "special case hash",
+          "msg" : "323036323134333632",
+          "sig" : "303d021d00bd635a741f1f2a1d9ac1698baf5cfc491d5e3f8e15f1cacbe4ffe4dc021c4bb606cf7cc11d0d7d96b83966f42276095ccc445882ed5afddabf1e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 257,
+          "comment" : "special case hash",
+          "msg" : "36383432343936303435",
+          "sig" : "303d021d00812c08622c0a09d949b7628585c4f4f2db4c5591b5da148ff46d5cd4021c2104f9bc9d0079acb3077d2db58f388119500c5322cb9b5389b5c5d7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 258,
+          "comment" : "special case hash",
+          "msg" : "33323639383937333231",
+          "sig" : "303e021d00fa4e1c8b0006f269c855eb495fa3a113f643fa8b1fef2b08ab145994021d00fe85b8b522c7f9e8943e0f62643395bd1fcdabc892c315d108b75f65",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 259,
+          "comment" : "special case hash",
+          "msg" : "31333837333234363932",
+          "sig" : "303e021d008c1d9b7911bacb6b4a09582648b992d46a1832eb006178c0c77fcb10021d00becbe12b99f243766da5bdad07461b9226a8298672b4f1adb35357ef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 260,
+          "comment" : "special case hash",
+          "msg" : "34313138383837353336",
+          "sig" : "303c021c78850a40530aa258e478e7c547d3a5e4944d3524f1676443e4dfb37d021c687058e1ca478f52a30c9a3f8e2eea9d8c40599cd47ef66b9430d17d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 261,
+          "comment" : "special case hash",
+          "msg" : "393838363036353435",
+          "sig" : "303c021c066e7268a6abefe1b4b916ca51c3e958e40dc78c3661313e0ed2e77d021c6404d8a332a837f2ab6bd13e3ee4aad1e9307d449e7f9b7d6332030c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 262,
+          "comment" : "special case hash",
+          "msg" : "32343739313135383435",
+          "sig" : "303c021c4eca73709a67c41603ca5af494c8132483ffc2e0bf171b52de5a5e81021c2c79137cd2add3ce3a76792270e347221a3ad786eafc2682b39bcf95",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 263,
+          "comment" : "special case hash",
+          "msg" : "35303736383837333637",
+          "sig" : "303d021c0178512f8844984222393a63263e0a009601869e632f07eb7470aa05021d00e32657cded1122cee0a4f66ff50a32da1f05de4c5e217acdf5eb6fe2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 264,
+          "comment" : "special case hash",
+          "msg" : "393838353036393637",
+          "sig" : "303d021d00e2c7bf1222ca23a56492873c2d3fa6c7030cc166d693142dcea272b6021c715a4c82fda4404217dea6c0bbf3ac24f8faa2b435fbc6d51a32c4a8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 265,
+          "comment" : "special case hash",
+          "msg" : "32373231333036313331",
+          "sig" : "303c021c49886a8c26c91d649cbfecda6ce8d1441e764c66f5d81dceedb6c5ba021c4370d8bcd4f052fac9491d62850b6a6a85d5acc44d9248c3dff30bf2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 266,
+          "comment" : "special case hash",
+          "msg" : "33323034313031363535",
+          "sig" : "303e021d00e1ae225e1aeca40747ff3e7ad1f75eb9bc90d637160a7f58ce12e591021d00b97cbea3a9323110315760b7e2ede496514b30f0eec521ffeb07a634",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 267,
+          "comment" : "special case hash",
+          "msg" : "33313530363830393530",
+          "sig" : "303d021d008a93b87b46512544fb9a7af5c41e3aa72e40235ef87ccb7108daae48021c157db617ac697df407af7a11626c52a1af7ef189514da39918c43010",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 268,
+          "comment" : "special case hash",
+          "msg" : "31373237343630313033",
+          "sig" : "303e021d00ebdebe6388b9f460fce6d84faa67ded1e864ef09e77ea3ce58a5deff021d00be5052033eb40380c2b1325fe97dcc55841e147a89f02a296b4505ef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 269,
+          "comment" : "special case hash",
+          "msg" : "3134353731343631323235",
+          "sig" : "303e021d00e85d0667972d003c82afb9e18b702357119b4f38401a5ebdfcbea88c021d00eb7b3e5268a4ce6280f72d7e9a3d74e5cac50b1c3a5296cdb5a49d82",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 270,
+          "comment" : "special case hash",
+          "msg" : "34313739353136303930",
+          "sig" : "303c021c3d243581c0874fd4eb4d80f896c5067429ad455314881951ab5ec6e3021c0ec47aba08ccba88c1a6ddc289f595bda08dc2dd34d12dcefb68094d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 271,
+          "comment" : "special case hash",
+          "msg" : "35383932373133303534",
+          "sig" : "303d021c75c966bbdcef9157d47a134231229f9f5ee8ce458775fc747d4509bd021d00e344fa716e2088d95a55d02a978a416da10f22a5cccf35a2863227cf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 272,
+          "comment" : "special case hash",
+          "msg" : "33383936313832323937",
+          "sig" : "303e021d00cfdf599e986d770b73784d97149f9945fd16d22c302bb796156e7fb4021d00c6409785047b0083f008771b40db8502583208b61c8984671acb0929",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 273,
+          "comment" : "special case hash",
+          "msg" : "38323833333436373332",
+          "sig" : "303e021d00c53c4aeec8f2e7a5cc0e885a6031aa1a6c1b7b7fec83b5084cbe291f021d00b0e6d10a8fd86f958c3b0f4662ed8ca0d6eadbc892aac4200fcf8315",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 274,
+          "comment" : "special case hash",
+          "msg" : "33333636393734383931",
+          "sig" : "303d021c2386550d6e75350bcc32507bfc9beb9c26d72ff82f671c1f5282e98b021d00a55b8de808c4359fb529b80a80d9fc6eddb5ce08082c3b677c689991",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 275,
+          "comment" : "special case hash",
+          "msg" : "32313939313533323239",
+          "sig" : "303d021c1fbd192d955ce02b64a3be5bb21bef22b53a6c6f9576d8f889b09e4e021d00f5a9b673a4ee5aabf1ca8e8289f25b62a3e08b956f7418c03e2d3031",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 276,
+          "comment" : "special case hash",
+          "msg" : "35363030333136383232",
+          "sig" : "303d021d00b80ffba451db9fc2194e450bdd43bc0f53a7d0f4a78900c09fb8d9bc021c0124eeeab9035b6c845959e70b04d1e187d554807d6751afabcc1802",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 277,
+          "comment" : "special case hash",
+          "msg" : "383639363531363935",
+          "sig" : "303c021c187fb026ade3ad16dd4b2813e8ebda433cb6cc3af1615bedf486a9e2021c6fbee53fa884d296f34f7719f74919434d1b7090c485eeed2fb8fd6c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 278,
+          "comment" : "special case hash",
+          "msg" : "36353833393236333732",
+          "sig" : "303d021d00e598a16fe12da79e9814f6985c9a9334010f287dc9e38de857ca5fc0021c19e0ed54f0e08ad091a163b4c7b86d0634da2c86a7a8991f5d8706d8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 279,
+          "comment" : "special case hash",
+          "msg" : "3133323035303135373235",
+          "sig" : "303d021d00b31a10480e397c8aa46f52a0f2fb5c22ebc0534fba156718b50cf6ea021c602004df4b47a2065130ca3b05f1eb02d0b37b79b04b1eb799408346",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 280,
+          "comment" : "special case hash",
+          "msg" : "35303835333330373931",
+          "sig" : "303e021d00bc47e242d19dcc6321913980d73923e430bc6623d219529d586619b6021d0081397dd2f52811b534ed754a937d904f04a7de278fa3bc8926de6946",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 281,
+          "comment" : "special case hash",
+          "msg" : "37383636383133313139",
+          "sig" : "303c021c5be0e0dfb26b1caa88f866504aa8e76f035a82abe00028d962bcfafa021c3c3c1df06026123471bed324ca79c51b28b3d10b1ce877cef21b852d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 282,
+          "comment" : "special case hash",
+          "msg" : "32303832353339343239",
+          "sig" : "303e021d00fe79d0cfe455724792cb5ab0580ad4f2918c1403ec12f0bdd2ce6528021d00f1357cd4afc402994ab868b0163f41701e0f00e561fdd97e0db6f7b9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 283,
+          "comment" : "special case hash",
+          "msg" : "3130303635393536363937",
+          "sig" : "303d021c1858c5d857124cd703e7c2f5e99d5025d6d979539c6f50b1d00fbd34021d00d94a5adb6d9c5001162620415541d49334fb929bc86a350ca4591195",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 284,
+          "comment" : "special case hash",
+          "msg" : "33303234313831363034",
+          "sig" : "303e021d00e6b2ec967cfa25f57234b9ef1d87c5945502cbbd5831c862f00774d1021d00caea26368bffc8e562b2bd03aa6c9dc41c529659fefe6597fce9cd9c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 285,
+          "comment" : "special case hash",
+          "msg" : "37373637383532383734",
+          "sig" : "303d021d00a59b438b2472074a93a289b33f5b13e604977dd3ab4d744d08e1061b021c699574a17dc8c7298c9321ca78552e5128ea801d056f387ba42f7a09",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 286,
+          "comment" : "special case hash",
+          "msg" : "353434313939393734",
+          "sig" : "303d021c748481709c6882c4a130193834a57f4bc714906211ec6cc12c400dff021d00eec6c9d5a06786f821a8117eec3dc025ed3ac74e39e98a16a4aa285c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 287,
+          "comment" : "special case hash",
+          "msg" : "35383433343830333931",
+          "sig" : "303e021d00bc8991b506997403e123136a9c140a4336364733b0815f40d1dbd5fe021d00819503ea3b4c07fc157f948f6949705d560a881fc1c6af4b7391765c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 288,
+          "comment" : "special case hash",
+          "msg" : "373138383932363239",
+          "sig" : "303c021c1caece75c8e31bb0c5cceb0842f23683b8557a97036574ea88ceeabd021c645ad3276aaee22b693647f00dce5f91a03b678b789b667cd3b8e751",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 289,
+          "comment" : "special case hash",
+          "msg" : "31373433323233343433",
+          "sig" : "303c021c3a7d582068aaecaba945203bc445b3312e5cb40886522987aced68d0021c39b3c612b6743a13bb2ffb83514d690cfcb9a7055e3a993cb0863938",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 290,
+          "comment" : "special case hash",
+          "msg" : "32343036303035393336",
+          "sig" : "303e021d00f773c49fd0645716d16e559e22c39101df266cdfa7cb61ce46f85280021d00df6109fd77a241031cf03b376e001d8a3cd2a6b646edbf9e578133f1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 291,
+          "comment" : "special case hash",
+          "msg" : "31363134303336393838",
+          "sig" : "303c021c79cf893f66f7faa5ca08553ea03456107e7bb391a5e51260cedaea84021c32e8e3509468da7216c59975d4f3d5493848a03f864b2332044e68d1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 292,
+          "comment" : "special case hash",
+          "msg" : "32303935343235363835",
+          "sig" : "303d021c025ecd1a7ab765fbfd25a6d7cd3c461e17f465e6958bce9f492b7a5a021d00a1ca95038603d302761e416935acbd6b716a316c9b79c57d4053cb79",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 293,
+          "comment" : "special case hash",
+          "msg" : "31303038303938393833",
+          "sig" : "303d021c3d14a4c21ba4dbd338fdd8b15fcdd0a9228f157cfaf2b09dd4f2aa67021d00e1640e8bd2a6110dc18d6f290b7325814710c0dc88b76f127c5e9e21",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 294,
+          "comment" : "special case hash",
+          "msg" : "31353734313437393237",
+          "sig" : "303c021c258dce916ef78b9d8a87beaf6edd35bcccc08c5de488586e1b7b749a021c4ff500db4d665c7062179c099b2985a814f99fbfa44a3a709024d589",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 295,
+          "comment" : "special case hash",
+          "msg" : "32383636373731353232",
+          "sig" : "303e021d00cecf0aec5357749f357c459575298a3384dc4ac381438ff99acd9993021d00da7adb092a6890e0918c235a62d4a949b0cae5e57856975108fb2b91",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 296,
+          "comment" : "special case hash",
+          "msg" : "31363934323830373837",
+          "sig" : "303d021d00d77f2e547fd68d5db314901da1ff7ecaf3d0c17ec047a974a7cec33e021c443a97afdf882272bf0233c8c4a8d23c9352ad89b1770c26240f6650",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 297,
+          "comment" : "special case hash",
+          "msg" : "39393231363932353638",
+          "sig" : "303e021d00d5dcf93e6e1b93323ea2642d3405a7423cb04f59c03420193f394886021d00ddd5842e4928ee4b5d77d43d4a4bfc7f991c899727b75fc941b52995",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 298,
+          "comment" : "special case hash",
+          "msg" : "3131363039343339373938",
+          "sig" : "303d021d00a9bc3ebc6ee34421326711ce29518d02bd403ead806a3e4502efa0ce021c12610b89a61689a8eb6e062d2524278155fe499ffecc0e0d940d48a7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 299,
+          "comment" : "special case hash",
+          "msg" : "37313836313632313030",
+          "sig" : "303e021d00c703c508784ef71b596dcd61c5b01b45c6c69d2b36a5a3b7701e5976021d00f05444a777204118f3ac2afc92d0212831bf7002158e7c656f4c07db",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 300,
+          "comment" : "special case hash",
+          "msg" : "33323934333437313737",
+          "sig" : "303e021d0080674b740b64d383677c049a6f4baeb214f4a6b5933033853e634578021d009b3a804c75ed790e31966bc25730b7428af8c73c65fb503c06c597eb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 301,
+          "comment" : "special case hash",
+          "msg" : "3138353134343535313230",
+          "sig" : "303c021c7ed658c30f4a0dcc894c39f9320f59a185509ffee45eac6023577c7c021c47ac94a501806d5adffea9fcf3ccd8cf79f3cc47eca9fe38fc4886b4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 302,
+          "comment" : "special case hash",
+          "msg" : "343736303433393330",
+          "sig" : "303d021c397f669cc399a91da96c16efd233f6fe60d1b7caa397cc257843b30b021d00f19375fe66eae4738ec9dc5b7ef51cb33d4cb258f36944d37dd245cb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 303,
+          "comment" : "special case hash",
+          "msg" : "32353637333738373431",
+          "sig" : "303c021c537ec369b3f0d891e166f6c74e5d73dd2c4822210c5fe5f978c34072021c0b183c48b5f6e69245cb76e1e2c39663eedfb74ba9538739ac495ff5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 304,
+          "comment" : "special case hash",
+          "msg" : "35373339393334393935",
+          "sig" : "303d021d00d0ed7159cc3a79988f3c279287ca8ed10bb8f02c8b5a6204aead1223021c75ee1e5c00e81899bfa8545edcc64fdf707dae1f61d976d2f0883777",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 305,
+          "comment" : "special case hash",
+          "msg" : "33343738333636313339",
+          "sig" : "303e021d00cf43329a9781db8044a920758e58399866fe7748c0f5d6a3bcdcbcbd021d00d9740d2dd716290ad4160345bcd4af03af01c44b610b1e5953199075",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 306,
+          "comment" : "special case hash",
+          "msg" : "363439303532363032",
+          "sig" : "303e021d008ab2e92c8c9143f9d8da3bdb1d935cce3ab60ae99b3ccfe863b15d14021d0088c89302e8a9c591c6ed16b1ae46f966004d0b2685449842e291d742",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 307,
+          "comment" : "special case hash",
+          "msg" : "34373633383837343936",
+          "sig" : "303d021c04f60f8450b448198cf7981116de06d4c4888cd26be3a5947092238f021d00cb23fcb33c14f089c2ae030146d68fa65eb9b086fa792f95be8ecf35",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 308,
+          "comment" : "special case hash",
+          "msg" : "353739303230303830",
+          "sig" : "303e021d00f270f7a70a96a0f916c7530c6dea7178e6c087ddbcc60aacd8a7c553021d008b2c378554121365a180ad4edf1a12e566ba55eeabf525356783e603",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 309,
+          "comment" : "special case hash",
+          "msg" : "35333434373837383438",
+          "sig" : "303e021d0085ad01b236ca4a5451969242e16165d322428235a2af8fdcd6c4c7b9021d008eb2998c5e0aaf279793caff59a266ca2068d94ebf77bae81fd0fb6a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 310,
+          "comment" : "special case hash",
+          "msg" : "3139323636343130393230",
+          "sig" : "303d021d00cffdb8d64b5b84b490ff73d77e51cc7797bf67c5ee0a4999def17230021c3baf4b34e1a35e9606a460b395063a554264a9c43cc302ab5abf473e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 311,
+          "comment" : "special case hash",
+          "msg" : "33373033393135373035",
+          "sig" : "303c021c66cda58a5a6ddb9476e36dbad5df542be88d7e447bdc3dfe1d9e8b2c021c0d99d387486a964ebab4e29bad583e46a5a200391d1065768a4e35fd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 312,
+          "comment" : "special case hash",
+          "msg" : "3831353435373730",
+          "sig" : "303c021c3200761902825bd353908accd2be6b482645646971f96dc490706a37021c3ed77899efdbe418370fa7998df3b7c924bed6864535277f805c894f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 313,
+          "comment" : "special case hash",
+          "msg" : "313935353330333737",
+          "sig" : "303e021d00ba0eff0ee46aa9fca5ab8ad64aee4037931d3ad0b953d404ef9f7bdc021d00afdf21df0dcbe39c2f5fa9ef7e1a2bca87d1213d1eca438929ad8982",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 314,
+          "comment" : "special case hash",
+          "msg" : "31323637383130393033",
+          "sig" : "303e021d00a20c6883fc6ec1ca4bb378ac88ed670a742a6284113d5fa3182a1858021d00e0a73b913b94163175d264224cc70736f2fb8e8d58e914b18c921323",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 315,
+          "comment" : "special case hash",
+          "msg" : "3131313830373230383135",
+          "sig" : "303e021d00f2f4af956b0c5409949d377e9bc68e4f1abef7969b518f8beacf27db021d00df3a7b5993d2393ade70a2cfc1e8671a78ca4fecb56425a661a2d2fc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 316,
+          "comment" : "special case hash",
+          "msg" : "38333831383639323930",
+          "sig" : "303c021c331a1a553494f8524adb4e8a722d558965fb703ae432bf3cbdb255c2021c5ab6e3dee6a2516fc4e0ac88e6dfc81d2bc37c98949cc03e521d389d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 317,
+          "comment" : "special case hash",
+          "msg" : "33313331323837323737",
+          "sig" : "303e021d00867135558e06e19796ebce8e3555c607a6607d46f7c8da6b8552ffc1021d008e827e8b9a4f74efeec7d7ba5c23428fde0227df55a1efc179a353b1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 318,
+          "comment" : "special case hash",
+          "msg" : "3134333331393236353338",
+          "sig" : "303d021c6746903ca095bfd3f6378a70092723483ca190b2392d8b1ad337969f021d00f33bfae0835c23a80ec9f33ce9a9035c192836a0b2fadd347d803f96",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 319,
+          "comment" : "special case hash",
+          "msg" : "333434393038323336",
+          "sig" : "303d021c7fc0d8739ecfe349e506e71203a6e60e628a1bb0c67d5e574cb8831c021d00cf8bb1557152c57550a0fde6571456fa752782f7f92f7bb235dde39f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 320,
+          "comment" : "special case hash",
+          "msg" : "36383239383335393239",
+          "sig" : "303e021d00b4486e3139e0b1542892db3d3f51b0524894e19cb00cd07b03ee9c97021d00ad9728d77a8b7b4fa435b3345847860c332d65d8152aa6503ab18755",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 321,
+          "comment" : "special case hash",
+          "msg" : "33343435313538303233",
+          "sig" : "303e021d00afbbdc8e50e801ecbd2e3705079717f4f9d69f3b3d85215aeecb4fbc021d00eceadd4e2cc9cea10b56d16a03fa551fec3eb808bd8d9f0926d14ed3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 322,
+          "comment" : "special case hash",
+          "msg" : "3132363937393837363434",
+          "sig" : "303d021c4a762f7d146f9eafff5ad11a6978260c818b801c3488dd60411f5cf6021d009ea77512585620ef2cfae8b8c9d8171229a32197e1949561bb75a049",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 323,
+          "comment" : "special case hash",
+          "msg" : "333939323432353533",
+          "sig" : "303d021c227fe52b579833feee16c287d29273e2256df68aff0b94d2752d877b021d00bd79935e5faa8e9356622fea0135ecf796daf60333d5ab125f71e512",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 324,
+          "comment" : "special case hash",
+          "msg" : "31363031393737393737",
+          "sig" : "303e021d00cd5365983eb165db39ba0c66c3a45b2ce1370c9ad14a9aa76dd4633a021d00a8c77ce42ab1c888a6b5d04b71139fd882328622e15e80252e5cf7da",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 325,
+          "comment" : "special case hash",
+          "msg" : "3130383738373535313435",
+          "sig" : "303c021c54d6d44373f7dfc98455a22cd39a0b320fabc33215216b37365b5a16021c29cc690f2467c02e07bc416ad47204975af8c5c3346973f2b03ded3d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 326,
+          "comment" : "special case hash",
+          "msg" : "37303034323532393939",
+          "sig" : "303c021c2f5048c9ef9f30da7cb3fe4624552200f9e57a46d79db0484a0d9cf2021c06dad3a4682725852869a1a459bec865661e1a38a9e546eeaac7cb84",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 327,
+          "comment" : "special case hash",
+          "msg" : "31353635333235323833",
+          "sig" : "303e021d00abbf0a02332fbea779899d31d3abd2d22c9c02d4058ced639bf06c45021d00cce0570f3812e5cfcb23376c554c7fc35dbcfeb623a7958c664ac6a4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 328,
+          "comment" : "special case hash",
+          "msg" : "3233383236333432333530",
+          "sig" : "303d021c1c30cb8bc21087b77eb1216ee8629e3676d925f1ae15077cc631da4f021d00ee998157bdefb77d1044e983a6afec7d91a23d95c937fc5c6548c989",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 329,
+          "comment" : "special case hash",
+          "msg" : "31343437383437303635",
+          "sig" : "303c021c43ee11a7ab62e2125e765c2ce5d4f84704183539810512268d87f195021c65897e54025777659ee802b39c6bfd5ccc5706a9d1b38f95c078abaf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 330,
+          "comment" : "special case hash",
+          "msg" : "3134323630323035353434",
+          "sig" : "303e021d00a1fe3f4d3f43aaa3dcafa79ed99fbc045c11c352caacd89f0f63847e021d00ca2e37bd2c13b9fb3f8a55b7a67eb034240395abd39fecde75141336",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 331,
+          "comment" : "special case hash",
+          "msg" : "31393933383335323835",
+          "sig" : "303e021d00bd290286ca08485ea4137010c67203c2455e7b669d153c6be40087c7021d0097dd7502ba3637f33baea5b2398647ad24c0fe35072bd963149b5aa0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 332,
+          "comment" : "special case hash",
+          "msg" : "34323932313533353233",
+          "sig" : "303e021d00c917269a5a4ce80b7fe54a8bed49326b50527a4d2fb0a3093182b5a5021d00a195ec0e69e3172e854e87dd651b44433fcd7dcbb7bd59515d2afe8e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 333,
+          "comment" : "special case hash",
+          "msg" : "34343539393031343936",
+          "sig" : "303c021c0b7b5aab8364dd4b11001a0b986d5aa4fb61ee720237417a7f63722f021c7f13b411e645e819fed1b925ebe807d9560b44d0ba1b75bd2fbd1294",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 334,
+          "comment" : "special case hash",
+          "msg" : "31333933393731313731",
+          "sig" : "303c021c505b974f8ecf07b60ffdbd2b2df9324de92b39476eb763a4c25f126a021c1c36ed1dee772c724205f717c383f49a87a5bc3caa0ef81360f9d800",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 335,
+          "comment" : "special case hash",
+          "msg" : "32333930363936343935",
+          "sig" : "303d021c24219e49b98a9b64e56d21c908c870eb88b447d9f1ddb735083d6df2021d00bc4d7644faeff1e134443b2bb3bb2a20e2a4a7c193180626127ce937",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 336,
+          "comment" : "special case hash",
+          "msg" : "3131343436303536323634",
+          "sig" : "303d021c083246081cf2f8c5e1cd42b60450fc6cac3b0ab03d38bdd271cd7370021d008d117ec32dbf939394499f7dbc2ab77290e9222d6d60ea02ce45c58a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 337,
+          "comment" : "special case hash",
+          "msg" : "363835303034373530",
+          "sig" : "303c021c24916961dd0d168c2878ca4fd065b81311c03b7f23f8416f4a23b14b021c1e37e3c03b2333b33bbb2ebe05b031042af19315adfdccdfc8d078ee",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 338,
+          "comment" : "special case hash",
+          "msg" : "3232323035333630363139",
+          "sig" : "303e021d008df5468b123b92477a5c57ea86c54c5c9e41d119370dc18922aa8303021d0086bdf06b75f4d49d02c5806926f5d01b1a4f6a8146664a03fa820772",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 339,
+          "comment" : "special case hash",
+          "msg" : "36323135363635313234",
+          "sig" : "303d021d00f65bf16f7ced97b0cdc22b08c62ef811306813134b001bc51140e828021c3a9b7c008cdaf803368df9ee50e274c7a9f9369344d9918e0c08dba9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044408e5c95e332ab6c2823a63959391d60a6d69c59eb1f7bd272206b9f5278e901fb4773aeeb2d8255ba4df3cf3db7e0557dbc6134c55f3a6",
+        "wx" : "4408e5c95e332ab6c2823a63959391d60a6d69c59eb1f7bd272206b9",
+        "wy" : "0f5278e901fb4773aeeb2d8255ba4df3cf3db7e0557dbc6134c55f3a6"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00044408e5c95e332ab6c2823a63959391d60a6d69c59eb1f7bd272206b9f5278e901fb4773aeeb2d8255ba4df3cf3db7e0557dbc6134c55f3a6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAERAjlyV4zKrbCgjpjlZOR1gptacWesfe9\nJyIGufUnjpAftHc67rLYJVuk3zzz234FV9vGE0xV86Y=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 340,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "313233343030",
+          "sig" : "3030020f00e95c1f470fc1ec22d6baa3a3d5c1021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 341,
+          "comment" : "r too large",
+          "msg" : "313233343030",
+          "sig" : "303e021d00fffffffffffffffffffffffffffffffefffffffffffffffffffffffe021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04315a83008dba00b351c3f9fca0811c3ae1884fa9a2a75e6d5e71f269504bbe6a25be253b582efab4b8b9e61372767a7a3a423c0943127296",
+        "wx" : "315a83008dba00b351c3f9fca0811c3ae1884fa9a2a75e6d5e71f269",
+        "wy" : "504bbe6a25be253b582efab4b8b9e61372767a7a3a423c0943127296"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004315a83008dba00b351c3f9fca0811c3ae1884fa9a2a75e6d5e71f269504bbe6a25be253b582efab4b8b9e61372767a7a3a423c0943127296",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEMVqDAI26ALNRw/n8oIEcOuGIT6mip15t\nXnHyaVBLvmolviU7WC76tLi55hNydnp6OkI8CUMScpY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 342,
+          "comment" : "r,s are large",
+          "msg" : "313233343030",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042f6983b6e9f8ef96c2d981f69be54b06591ed73fe40c8a546b936a7971bf57726c26c811d7625a9d851951c1fffe236b0eb3b896bc4c98ef",
+        "wx" : "2f6983b6e9f8ef96c2d981f69be54b06591ed73fe40c8a546b936a79",
+        "wy" : "71bf57726c26c811d7625a9d851951c1fffe236b0eb3b896bc4c98ef"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00042f6983b6e9f8ef96c2d981f69be54b06591ed73fe40c8a546b936a7971bf57726c26c811d7625a9d851951c1fffe236b0eb3b896bc4c98ef",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEL2mDtun475bC2YH2m+VLBlke1z/kDIpU\na5NqeXG/V3JsJsgR12JanYUZUcH//iNrDrO4lrxMmO8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 343,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "303c021c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff021c3d5052691b8dc89debad360466f2a39e82e8ae2aefb77c3c92ad7cd1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d1f515971cc9391153569c2befa1f915e2931110757760ebd7e61f8641c3db8beea20b13205389dcc4ba8a6af4d6da2604cacd7184ec9dbc",
+        "wx" : "0d1f515971cc9391153569c2befa1f915e2931110757760ebd7e61f86",
+        "wy" : "41c3db8beea20b13205389dcc4ba8a6af4d6da2604cacd7184ec9dbc"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004d1f515971cc9391153569c2befa1f915e2931110757760ebd7e61f8641c3db8beea20b13205389dcc4ba8a6af4d6da2604cacd7184ec9dbc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE0fUVlxzJORFTVpwr76H5FeKTERB1d2Dr\n1+YfhkHD24vuogsTIFOJ3MS6imr01tomBMrNcYTsnbw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 344,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "303d021c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff021d00bf19ab4d3ebf5a1a49d765909308daa88c2b7be3969db552ea30562b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e8f90a717714f0158d9521f18c14ae8c83bf1eeba115c46cbdabb20b66f50ac13461c02da02edfe4296a1f543dde7b4359f905e04193d3cf",
+        "wx" : "0e8f90a717714f0158d9521f18c14ae8c83bf1eeba115c46cbdabb20b",
+        "wy" : "66f50ac13461c02da02edfe4296a1f543dde7b4359f905e04193d3cf"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004e8f90a717714f0158d9521f18c14ae8c83bf1eeba115c46cbdabb20b66f50ac13461c02da02edfe4296a1f543dde7b4359f905e04193d3cf",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE6PkKcXcU8BWNlSHxjBSujIO/HuuhFcRs\nvauyC2b1CsE0YcAtoC7f5ClqH1Q93ntDWfkF4EGT088=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 345,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020103020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04723bc0c9b7ce6ea784ec075036cede90452c76576bd8fb5be4dc0fb1cf405820d92f48552b551c7b11f49406dc892fd659971ae7f9e74b59",
+        "wx" : "723bc0c9b7ce6ea784ec075036cede90452c76576bd8fb5be4dc0fb1",
+        "wy" : "0cf405820d92f48552b551c7b11f49406dc892fd659971ae7f9e74b59"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004723bc0c9b7ce6ea784ec075036cede90452c76576bd8fb5be4dc0fb1cf405820d92f48552b551c7b11f49406dc892fd659971ae7f9e74b59",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEcjvAybfObqeE7AdQNs7ekEUsdldr2Ptb\n5NwPsc9AWCDZL0hVK1UcexH0lAbciS/WWZca5/nnS1k=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 346,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020103020103",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a0dcce127084f955a4e49a7c86b9b91b05ae7afd6eb07225a6541d88f10a1d4fef93934967bb6c5d8792bbd47ab3abb406899a00b1c91b4a",
+        "wx" : "0a0dcce127084f955a4e49a7c86b9b91b05ae7afd6eb07225a6541d88",
+        "wy" : "0f10a1d4fef93934967bb6c5d8792bbd47ab3abb406899a00b1c91b4a"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004a0dcce127084f955a4e49a7c86b9b91b05ae7afd6eb07225a6541d88f10a1d4fef93934967bb6c5d8792bbd47ab3abb406899a00b1c91b4a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEoNzOEnCE+VWk5Jp8hrm5GwWuev1usHIl\nplQdiPEKHU/vk5NJZ7tsXYeSu9R6s6u0BomaALHJG0o=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 347,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020103020104",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 348,
+          "comment" : "r is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a40020104",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e10abc9fe15bcc63f009e161aaee26602415bcb45bc6c99ce7ab2b10fbebff4e4de0dfaaf04594dd603cee80b5d9ab78b6707608a95e574d",
+        "wx" : "0e10abc9fe15bcc63f009e161aaee26602415bcb45bc6c99ce7ab2b10",
+        "wy" : "0fbebff4e4de0dfaaf04594dd603cee80b5d9ab78b6707608a95e574d"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004e10abc9fe15bcc63f009e161aaee26602415bcb45bc6c99ce7ab2b10fbebff4e4de0dfaaf04594dd603cee80b5d9ab78b6707608a95e574d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE4Qq8n+FbzGPwCeFhqu4mYCQVvLRbxsmc\n56srEPvr/05N4N+q8EWU3WA87oC12at4tnB2CKleV00=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 349,
+          "comment" : "s is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3022020103021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c6f00c4",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fbfabe6c640856ae5dcdc9e4b706fb3db23ddca46b80b9057ab9e44f6b62d4697977ffe19bf3185083b1ede2161aa5725401a8f57851fc82",
+        "wx" : "0fbfabe6c640856ae5dcdc9e4b706fb3db23ddca46b80b9057ab9e44f",
+        "wy" : "6b62d4697977ffe19bf3185083b1ede2161aa5725401a8f57851fc82"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004fbfabe6c640856ae5dcdc9e4b706fb3db23ddca46b80b9057ab9e44f6b62d4697977ffe19bf3185083b1ede2161aa5725401a8f57851fc82",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE+/q+bGQIVq5dzcnktwb7PbI93KRrgLkF\nernkT2ti1Gl5d//hm/MYUIOx7eIWGqVyVAGo9XhR/II=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 350,
+          "comment" : "small r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302302020100021d00c993264c993264c993264c99326411d2e55b3214a8d67528812a55ab",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0491a85b3c5e90b409f6b8d3bca9117a54a40f4162b388bb9367fd6439f1cedf20ab52eb7154b7ea1f2934a9c8292906e18a0e572002cd2f7c",
+        "wx" : "091a85b3c5e90b409f6b8d3bca9117a54a40f4162b388bb9367fd6439",
+        "wy" : "0f1cedf20ab52eb7154b7ea1f2934a9c8292906e18a0e572002cd2f7c"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000491a85b3c5e90b409f6b8d3bca9117a54a40f4162b388bb9367fd6439f1cedf20ab52eb7154b7ea1f2934a9c8292906e18a0e572002cd2f7c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEkahbPF6QtAn2uNO8qRF6VKQPQWKziLuT\nZ/1kOfHO3yCrUutxVLfqHyk0qcgpKQbhig5XIALNL3w=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 351,
+          "comment" : "smallish r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302702072d9b4d347952cc021c3e85d56474b5c55fbe86608442a84b2bf093b7d75f53a47250e1c70c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d1ca7a5c1aa086b2951c1ac14e005f0072fb28383973a05117f9652cce523c05ebe94991c47fecd241d0a07e86c88ab3c620eae792aba3d1",
+        "wx" : "0d1ca7a5c1aa086b2951c1ac14e005f0072fb28383973a05117f9652c",
+        "wy" : "0ce523c05ebe94991c47fecd241d0a07e86c88ab3c620eae792aba3d1"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004d1ca7a5c1aa086b2951c1ac14e005f0072fb28383973a05117f9652cce523c05ebe94991c47fecd241d0a07e86c88ab3c620eae792aba3d1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE0cp6XBqghrKVHBrBTgBfAHL7KDg5c6BR\nF/llLM5SPAXr6UmRxH/s0kHQoH6GyIqzxiDq55Kro9E=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 352,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "313233343030",
+          "sig" : "302d020d1033e67e37b32b445580bf4efb021c02fd02fd02fd02fd02fd02fd02fd0043a4fd2da317247308c74dc6b8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043565af2a481f9390e71d7642717d0427e02e5e7de8a3c0c1ffd5f33e9474547e0d54dcaae85494c74faa23394a056e41c2839638b8523b72",
+        "wx" : "3565af2a481f9390e71d7642717d0427e02e5e7de8a3c0c1ffd5f33e",
+        "wy" : "09474547e0d54dcaae85494c74faa23394a056e41c2839638b8523b72"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00043565af2a481f9390e71d7642717d0427e02e5e7de8a3c0c1ffd5f33e9474547e0d54dcaae85494c74faa23394a056e41c2839638b8523b72",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAENWWvKkgfk5DnHXZCcX0EJ+AuXn3oo8DB\n/9XzPpR0VH4NVNyq6FSUx0+qIzlKBW5BwoOWOLhSO3I=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 353,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "313233343030",
+          "sig" : "302302020100021d00d05434abacd859ed74185e75b751c6d9f60c7921dacfbb8e19cdba8e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0429c694790fbd23777cfde434badcb061a326a5534264bcfe193c716c178a943f7bd4fb132565ba602358b13433a5217ac04cc035566c73f8",
+        "wx" : "29c694790fbd23777cfde434badcb061a326a5534264bcfe193c716c",
+        "wy" : "178a943f7bd4fb132565ba602358b13433a5217ac04cc035566c73f8"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000429c694790fbd23777cfde434badcb061a326a5534264bcfe193c716c178a943f7bd4fb132565ba602358b13433a5217ac04cc035566c73f8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEKcaUeQ+9I3d8/eQ0utywYaMmpVNCZLz+\nGTxxbBeKlD971PsTJWW6YCNYsTQzpSF6wEzANVZsc/g=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 354,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302e020d062522bbd3ecbe7c39e93e7c24021d00d05434abacd859ed74185e75b751c6d9f60c7921dacfbb8e19cdba8e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048fd43aac8556f4665fd4c13f4e151140f42a395763c5da247a398f979687d24a9fcd6b20a59451c348a6364d0ffaf0ecfe164313db6594ab",
+        "wx" : "08fd43aac8556f4665fd4c13f4e151140f42a395763c5da247a398f97",
+        "wy" : "09687d24a9fcd6b20a59451c348a6364d0ffaf0ecfe164313db6594ab"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00048fd43aac8556f4665fd4c13f4e151140f42a395763c5da247a398f979687d24a9fcd6b20a59451c348a6364d0ffaf0ecfe164313db6594ab",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEj9Q6rIVW9GZf1ME/ThURQPQqOVdjxdok\nejmPl5aH0kqfzWsgpZRRw0imNk0P+vDs/hZDE9tllKs=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 355,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "313233343030",
+          "sig" : "303d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c29bd021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c2ae0e357a43f97549a725ae3704449051c96bf3633355c35b6eb7e96a84dfb6d4517d1de46b18786a506178724bf4ae4f9e418c75ab17ef",
+        "wx" : "0c2ae0e357a43f97549a725ae3704449051c96bf3633355c35b6eb7e9",
+        "wy" : "6a84dfb6d4517d1de46b18786a506178724bf4ae4f9e418c75ab17ef"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004c2ae0e357a43f97549a725ae3704449051c96bf3633355c35b6eb7e96a84dfb6d4517d1de46b18786a506178724bf4ae4f9e418c75ab17ef",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEwq4ONXpD+XVJpyWuNwREkFHJa/NjM1XD\nW2636WqE37bUUX0d5GsYeGpQYXhyS/SuT55BjHWrF+8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 356,
+          "comment" : "s == 1",
+          "msg" : "313233343030",
+          "sig" : "3021021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 357,
+          "comment" : "s == 0",
+          "msg" : "313233343030",
+          "sig" : "3021021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04961617d9855f202fd600b584abe94a46674927cfdc6333c5be56ce7b89b4150d9ccdfbd77e7682ca862c0c3e96d89c918b7d3b7bbb92ff43",
+        "wx" : "0961617d9855f202fd600b584abe94a46674927cfdc6333c5be56ce7b",
+        "wy" : "089b4150d9ccdfbd77e7682ca862c0c3e96d89c918b7d3b7bbb92ff43"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004961617d9855f202fd600b584abe94a46674927cfdc6333c5be56ce7b89b4150d9ccdfbd77e7682ca862c0c3e96d89c918b7d3b7bbb92ff43",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAElhYX2YVfIC/WALWEq+lKRmdJJ8/cYzPF\nvlbOe4m0FQ2czfvXfnaCyoYsDD6W2JyRi307e7uS/0M=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 358,
+          "comment" : "point at infinity during verify",
+          "msg" : "313233343030",
+          "sig" : "303c021c7fffffffffffffffffffffffffff8b51705c781f09ee94a2ae2e151e021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0455b212919cd6886b13cd7a2556430ce442e86942f1bf6e4618ae363e795c664ae960ee1106308b7dba91240ab0c3ef8beb7d0a4d7a102a7f",
+        "wx" : "55b212919cd6886b13cd7a2556430ce442e86942f1bf6e4618ae363e",
+        "wy" : "795c664ae960ee1106308b7dba91240ab0c3ef8beb7d0a4d7a102a7f"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000455b212919cd6886b13cd7a2556430ce442e86942f1bf6e4618ae363e795c664ae960ee1106308b7dba91240ab0c3ef8beb7d0a4d7a102a7f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEVbISkZzWiGsTzXolVkMM5ELoaULxv25G\nGK42PnlcZkrpYO4RBjCLfbqRJAqww++L630KTXoQKn8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 359,
+          "comment" : "u1 == 1",
+          "msg" : "313233343030",
+          "sig" : "303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c0288a63ce32263f3651198dab801c896fb9308362fc40e35959e14010d00bd1c228cfb6a5faa647387804e34fa1a7f9fcc472c05ea2eeda",
+        "wx" : "0c0288a63ce32263f3651198dab801c896fb9308362fc40e35959e140",
+        "wy" : "10d00bd1c228cfb6a5faa647387804e34fa1a7f9fcc472c05ea2eeda"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004c0288a63ce32263f3651198dab801c896fb9308362fc40e35959e14010d00bd1c228cfb6a5faa647387804e34fa1a7f9fcc472c05ea2eeda",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEwCiKY84yJj82URmNq4AciW+5MINi/EDj\nWVnhQBDQC9HCKM+2pfqmRzh4BONPoaf5/MRywF6i7to=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 360,
+          "comment" : "u1 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "303d021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021d00bc07ff041506dc73a75086a4325211e696eb6b31da8ff5c2c728d38d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040c8e2cb5f6a903e1cccf3ac2d465f1d0dc3452237fd9e8a4df5d5341d044ca8ceecb54a1b951270971e5ab4eb226116c48c553499d1a4899",
+        "wx" : "0c8e2cb5f6a903e1cccf3ac2d465f1d0dc3452237fd9e8a4df5d5341",
+        "wy" : "0d044ca8ceecb54a1b951270971e5ab4eb226116c48c553499d1a4899"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00040c8e2cb5f6a903e1cccf3ac2d465f1d0dc3452237fd9e8a4df5d5341d044ca8ceecb54a1b951270971e5ab4eb226116c48c553499d1a4899",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEDI4stfapA+HMzzrC1GXx0Nw0UiN/2eik\n311TQdBEyozuy1ShuVEnCXHlq06yJhFsSMVTSZ0aSJk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 361,
+          "comment" : "u2 == 1",
+          "msg" : "313233343030",
+          "sig" : "303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041ff6b9901784d88b25527b3702622a2734b83d8a0fed0f740bb784e20e83ee0aa82933dcdc637a3760606a04974c2dc75f12095f8fdaf003",
+        "wx" : "1ff6b9901784d88b25527b3702622a2734b83d8a0fed0f740bb784e2",
+        "wy" : "0e83ee0aa82933dcdc637a3760606a04974c2dc75f12095f8fdaf003"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00041ff6b9901784d88b25527b3702622a2734b83d8a0fed0f740bb784e20e83ee0aa82933dcdc637a3760606a04974c2dc75f12095f8fdaf003",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEH/a5kBeE2IslUns3AmIqJzS4PYoP7Q90\nC7eE4g6D7gqoKTPc3GN6N2BgagSXTC3HXxIJX4/a8AM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 362,
+          "comment" : "u2 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "303d021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021d00aaaaaaaaaaaaaaaaaaaaaaaaaaaa0f17407b4ad40d3e1b8392e81c29",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b21faca17b68058752d943a81f853b800562df8b2172e150953c624201c2c0f5ed3b342956cacd26f9097562d0fb0a3ddab91c5ae7e90c01",
+        "wx" : "0b21faca17b68058752d943a81f853b800562df8b2172e150953c6242",
+        "wy" : "1c2c0f5ed3b342956cacd26f9097562d0fb0a3ddab91c5ae7e90c01"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b21faca17b68058752d943a81f853b800562df8b2172e150953c624201c2c0f5ed3b342956cacd26f9097562d0fb0a3ddab91c5ae7e90c01",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEsh+soXtoBYdS2UOoH4U7gAVi34shcuFQ\nlTxiQgHCwPXtOzQpVsrNJvkJdWLQ+wo92rkcWufpDAE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 363,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00c152aafea3a8612ec83a7dc9448e6600ae6a772d75ad2caf19f9390e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f49278419e4f506889b0168b1fce1f87ee5b61efa0e73c7833eeb29cb1b334f81be8f05f3b2e98d38b030cff57947b96135ec4465c5e53f3",
+        "wx" : "0f49278419e4f506889b0168b1fce1f87ee5b61efa0e73c7833eeb29c",
+        "wy" : "0b1b334f81be8f05f3b2e98d38b030cff57947b96135ec4465c5e53f3"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004f49278419e4f506889b0168b1fce1f87ee5b61efa0e73c7833eeb29cb1b334f81be8f05f3b2e98d38b030cff57947b96135ec4465c5e53f3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE9JJ4QZ5PUGiJsBaLH84fh+5bYe+g5zx4\nM+6ynLGzNPgb6PBfOy6Y04sDDP9XlHuWE17ERlxeU/M=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 364,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c4e158ef86cc53054f1635c74e65508206048929315e097a59f1519e2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0475c6a886e22bc04b996d4a19575ce0c6686b449b6e05ef1301bd8ba233ab29f65df2d4144da2b21e90359a064765c95e325bb7e54ca28e40",
+        "wx" : "75c6a886e22bc04b996d4a19575ce0c6686b449b6e05ef1301bd8ba2",
+        "wy" : "33ab29f65df2d4144da2b21e90359a064765c95e325bb7e54ca28e40"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000475c6a886e22bc04b996d4a19575ce0c6686b449b6e05ef1301bd8ba233ab29f65df2d4144da2b21e90359a064765c95e325bb7e54ca28e40",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEdcaohuIrwEuZbUoZV1zgxmhrRJtuBe8T\nAb2LojOrKfZd8tQUTaKyHpA1mgZHZcleMlu35UyijkA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 365,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00e2ac0b24512e84f6fb015620d689d30d14736cf00c18838753c3814f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f554014cc14f319c18f5fa6cd739249075ff35ba3b2afdab5329ef0fd2c501f25a704addbd85c0e022748956e5998d99c387fbfd343c89e0",
+        "wx" : "0f554014cc14f319c18f5fa6cd739249075ff35ba3b2afdab5329ef0f",
+        "wy" : "0d2c501f25a704addbd85c0e022748956e5998d99c387fbfd343c89e0"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004f554014cc14f319c18f5fa6cd739249075ff35ba3b2afdab5329ef0fd2c501f25a704addbd85c0e022748956e5998d99c387fbfd343c89e0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE9VQBTMFPMZwY9fps1zkkkHX/Nbo7Kv2r\nUynvD9LFAfJacErdvYXA4CJ0iVblmY2Zw4f7/TQ8ieA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 366,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c6c5221f3c2de0c6fbc07ff04150679b57f57512b814f413aebafe731",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bcfa8db704aca56feb23bd4b4049213233aa652045a0a81a2e0da64c091b359f7be7ae00a0e9777d9510f847430b5dfda878e66d4fb0d62f",
+        "wx" : "0bcfa8db704aca56feb23bd4b4049213233aa652045a0a81a2e0da64c",
+        "wy" : "091b359f7be7ae00a0e9777d9510f847430b5dfda878e66d4fb0d62f"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004bcfa8db704aca56feb23bd4b4049213233aa652045a0a81a2e0da64c091b359f7be7ae00a0e9777d9510f847430b5dfda878e66d4fb0d62f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEvPqNtwSspW/rI71LQEkhMjOqZSBFoKga\nLg2mTAkbNZ97564AoOl3fZUQ+EdDC139qHjmbU+w1i8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 367,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c221f3c2de0c6fbc07ff041506dc71b5a312063d87beb4c30c289210f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049fd4d828ae98056be58fa69eaf9cde98ca0ed9b415d6463fa1864d9fb2a5e41f10e8789450217daafd259f204aed87b0e26100f43f7c5bad",
+        "wx" : "09fd4d828ae98056be58fa69eaf9cde98ca0ed9b415d6463fa1864d9f",
+        "wy" : "0b2a5e41f10e8789450217daafd259f204aed87b0e26100f43f7c5bad"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00049fd4d828ae98056be58fa69eaf9cde98ca0ed9b415d6463fa1864d9fb2a5e41f10e8789450217daafd259f204aed87b0e26100f43f7c5bad",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEn9TYKK6YBWvlj6aer5zemMoO2bQV1kY/\noYZNn7Kl5B8Q6HiUUCF9qv0lnyBK7Yew4mEA9D98W60=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 368,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c443e785bc18df780ffe082a0db8e36b46240c7b0f7d698618512421e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046123a33969f2e036fc27885f55755d391cb0c2d3fafb0c4056c1995da03bb490047e88fe7e608912a6205b65f950a8a0a360362d3339e62c",
+        "wx" : "6123a33969f2e036fc27885f55755d391cb0c2d3fafb0c4056c1995d",
+        "wy" : "0a03bb490047e88fe7e608912a6205b65f950a8a0a360362d3339e62c"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00046123a33969f2e036fc27885f55755d391cb0c2d3fafb0c4056c1995da03bb490047e88fe7e608912a6205b65f950a8a0a360362d3339e62c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEYSOjOWny4Db8J4hfVXVdORywwtP6+wxA\nVsGZXaA7tJAEfoj+fmCJEqYgW2X5UKigo2A2LTM55iw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 369,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00c2de0c6fbc07ff041506dc73a74fd50136878b7e1341521b2f880b19",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a10b7aa7785b2f2791b1d4c43e127aab5669612d740b38abaa0d306ec178f216fad379ad80baa0eac57bf9a56d446d685576371b74762382",
+        "wx" : "0a10b7aa7785b2f2791b1d4c43e127aab5669612d740b38abaa0d306e",
+        "wy" : "0c178f216fad379ad80baa0eac57bf9a56d446d685576371b74762382"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004a10b7aa7785b2f2791b1d4c43e127aab5669612d740b38abaa0d306ec178f216fad379ad80baa0eac57bf9a56d446d685576371b74762382",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEoQt6p3hbLyeRsdTEPhJ6q1ZpYS10Czir\nqg0wbsF48hb603mtgLqg6sV7+aVtRG1oVXY3G3R2I4I=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 370,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d009f56aa80ae2bcf689be2c11b5db7e3a28983b4a7590692edcf5f8db6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e012c23c6867e9553313d0179e9db953de7c368cdb59abe05f1c52bad352a57bb59c45159352c114eeb696ec3b79caa835ef5c2ae71ddcfa",
+        "wx" : "0e012c23c6867e9553313d0179e9db953de7c368cdb59abe05f1c52ba",
+        "wy" : "0d352a57bb59c45159352c114eeb696ec3b79caa835ef5c2ae71ddcfa"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004e012c23c6867e9553313d0179e9db953de7c368cdb59abe05f1c52bad352a57bb59c45159352c114eeb696ec3b79caa835ef5c2ae71ddcfa",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE4BLCPGhn6VUzE9AXnp25U958NozbWavg\nXxxSutNSpXu1nEUVk1LBFO62luw7ecqoNe9cKucd3Po=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 371,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c3ead55015c579ed137c58236bb70b0a2324e79109e2ffc964262f12f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b9ccd7f0f3594954aa729bda4be883e107e7f1226465b64c2ca7105789829d787016c5c118d3ba3317a2da0a0daaf56d3004c10962333a9f",
+        "wx" : "0b9ccd7f0f3594954aa729bda4be883e107e7f1226465b64c2ca71057",
+        "wy" : "089829d787016c5c118d3ba3317a2da0a0daaf56d3004c10962333a9f"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b9ccd7f0f3594954aa729bda4be883e107e7f1226465b64c2ca7105789829d787016c5c118d3ba3317a2da0a0daaf56d3004c10962333a9f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEuczX8PNZSVSqcpvaS+iD4Qfn8SJkZbZM\nLKcQV4mCnXhwFsXBGNO6Mxei2goNqvVtMATBCWIzOp8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 372,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00de03ff820a836e39d3a8435219289444bbd22db7f7368f8411c27ee5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04321a17de024fe89c1864e128b9e0af3e6b48800a70d6e802b8b6dffeb1a8ae96911ddbdeb83948a992b1b0fe316679c64814b6a45ec56fe9",
+        "wx" : "321a17de024fe89c1864e128b9e0af3e6b48800a70d6e802b8b6dffe",
+        "wy" : "0b1a8ae96911ddbdeb83948a992b1b0fe316679c64814b6a45ec56fe9"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004321a17de024fe89c1864e128b9e0af3e6b48800a70d6e802b8b6dffeb1a8ae96911ddbdeb83948a992b1b0fe316679c64814b6a45ec56fe9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEMhoX3gJP6JwYZOEoueCvPmtIgApw1ugC\nuLbf/rGorpaRHdveuDlIqZKxsP4xZnnGSBS2pF7Fb+k=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 373,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00f15605922897427b7d80ab106b4474d7fa962e970ffad666580fd5c6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0408842f19b114d16be27bb4b6971377ed6b1d0915e133a9ebf01674ee4c97738b6912ff71553c4a747c782eddd9d2a20fbeae38864d217859",
+        "wx" : "08842f19b114d16be27bb4b6971377ed6b1d0915e133a9ebf01674ee",
+        "wy" : "4c97738b6912ff71553c4a747c782eddd9d2a20fbeae38864d217859"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000408842f19b114d16be27bb4b6971377ed6b1d0915e133a9ebf01674ee4c97738b6912ff71553c4a747c782eddd9d2a20fbeae38864d217859",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAECIQvGbEU0Wvie7S2lxN37WsdCRXhM6nr\n8BZ07kyXc4tpEv9xVTxKdHx4Lt3Z0qIPvq44hk0heFk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 374,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c7fffffffffffffffffffffffffffb2364ae85014b149b86c741eb8be",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0484d651596fd2348f1bb5c8ae9d22c8b21c4f7509240b609abad5cc243196b67b4cfaffaf0dce25ab00bfeaa1a64821332efa6dedd87cc9e7",
+        "wx" : "084d651596fd2348f1bb5c8ae9d22c8b21c4f7509240b609abad5cc24",
+        "wy" : "3196b67b4cfaffaf0dce25ab00bfeaa1a64821332efa6dedd87cc9e7"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000484d651596fd2348f1bb5c8ae9d22c8b21c4f7509240b609abad5cc243196b67b4cfaffaf0dce25ab00bfeaa1a64821332efa6dedd87cc9e7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEhNZRWW/SNI8btciunSLIshxPdQkkC2Ca\nutXMJDGWtntM+v+vDc4lqwC/6qGmSCEzLvpt7dh8yec=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 375,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00855f5b2dc8e46ec428a593f73219cf65dae793e8346e30cc3701309c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048fbe39e75bc4fd8a15e4b52e4bbebe2047d54385a7117e17a4d0b2b207abdb40824538e5787c718d6548583f523f6b5bbfa239a7f622c8a0",
+        "wx" : "08fbe39e75bc4fd8a15e4b52e4bbebe2047d54385a7117e17a4d0b2b2",
+        "wy" : "7abdb40824538e5787c718d6548583f523f6b5bbfa239a7f622c8a0"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00048fbe39e75bc4fd8a15e4b52e4bbebe2047d54385a7117e17a4d0b2b207abdb40824538e5787c718d6548583f523f6b5bbfa239a7f622c8a0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEj74551vE/YoV5LUuS76+IEfVQ4WnEX4X\npNCysger20CCRTjleHxxjWVIWD9SP2tbv6I5p/YiyKA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 376,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c2db5f61aea817276af2064e104c7a30e32034cb526dd0aacfa56566f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c336b340bc99d46c2c52df5428b6a0c4eb2da76c423530f767cc7652f3ab9981bd05d2955123935a379cbb2d4361a17d19878673e1e17dcc",
+        "wx" : "0c336b340bc99d46c2c52df5428b6a0c4eb2da76c423530f767cc7652",
+        "wy" : "0f3ab9981bd05d2955123935a379cbb2d4361a17d19878673e1e17dcc"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004c336b340bc99d46c2c52df5428b6a0c4eb2da76c423530f767cc7652f3ab9981bd05d2955123935a379cbb2d4361a17d19878673e1e17dcc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEwzazQLyZ1GwsUt9UKLagxOstp2xCNTD3\nZ8x2UvOrmYG9BdKVUSOTWjecuy1DYaF9GYeGc+Hhfcw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 377,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d0084a6c7513e5f48c07fffffffffff8713f3cba1293e4f3e95597fe6bd",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04816fdcf370827e3f7771564e1aa73ed73e62556deadad89711cef663edcda0ea42235f4c9a8c13f787351ffe5ceb32f15fc0ccb24e0a409c",
+        "wx" : "0816fdcf370827e3f7771564e1aa73ed73e62556deadad89711cef663",
+        "wy" : "0edcda0ea42235f4c9a8c13f787351ffe5ceb32f15fc0ccb24e0a409c"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004816fdcf370827e3f7771564e1aa73ed73e62556deadad89711cef663edcda0ea42235f4c9a8c13f787351ffe5ceb32f15fc0ccb24e0a409c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEgW/c83CCfj93cVZOGqc+1z5iVW3q2tiX\nEc72Y+3NoOpCI19MmowT94c1H/5c6zLxX8DMsk4KQJw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 378,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c6c7513e5f48c07ffffffffffffff9d21fd1b31544cb13ca86a75b25e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046429d2b7b07ab0d5ea352902df0efc036d7270a0a6ed39f635d04f394f7932883bc45394151324aab26ae29bbd7385fa6a42c3db84432897",
+        "wx" : "6429d2b7b07ab0d5ea352902df0efc036d7270a0a6ed39f635d04f39",
+        "wy" : "4f7932883bc45394151324aab26ae29bbd7385fa6a42c3db84432897"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00046429d2b7b07ab0d5ea352902df0efc036d7270a0a6ed39f635d04f394f7932883bc45394151324aab26ae29bbd7385fa6a42c3db84432897",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEZCnSt7B6sNXqNSkC3w78A21ycKCm7Tn2\nNdBPOU95Mog7xFOUFRMkqrJq4pu9c4X6akLD24RDKJc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 379,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00d8ea27cbe9180fffffffffffffff3a43fa3662a899627950d4eb64bc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04288f38fd77dd1603ff0275cb11cba280ae3408affa6a760f396f1a1ec84ca6fd772c6ac6cc523cc72c2e7e95eb6a36a66b5cca5a58ba078a",
+        "wx" : "288f38fd77dd1603ff0275cb11cba280ae3408affa6a760f396f1a1e",
+        "wy" : "0c84ca6fd772c6ac6cc523cc72c2e7e95eb6a36a66b5cca5a58ba078a"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004288f38fd77dd1603ff0275cb11cba280ae3408affa6a760f396f1a1ec84ca6fd772c6ac6cc523cc72c2e7e95eb6a36a66b5cca5a58ba078a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEKI84/XfdFgP/AnXLEcuigK40CK/6anYP\nOW8aHshMpv13LGrGzFI8xywufpXrajama1zKWli6B4o=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 380,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c3e5f48c07fffffffffffffffffffc724968c0ecf9ed783744a7337b3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c769c138f9d71ffff113273b71a4afde4f9996a1c4be658a3903cf7f430e512b868b37bb96bc17a09b0ab01b262f2e23f34f00418f6b63d6",
+        "wx" : "0c769c138f9d71ffff113273b71a4afde4f9996a1c4be658a3903cf7f",
+        "wy" : "430e512b868b37bb96bc17a09b0ab01b262f2e23f34f00418f6b63d6"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004c769c138f9d71ffff113273b71a4afde4f9996a1c4be658a3903cf7f430e512b868b37bb96bc17a09b0ab01b262f2e23f34f00418f6b63d6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEx2nBOPnXH//xEyc7caSv3k+ZlqHEvmWK\nOQPPf0MOUSuGize7lrwXoJsKsBsmLy4j808AQY9rY9Y=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 381,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00bfffffffffffffffffffffffffff3d87bb44c833bb384d0f224ccdde",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0475f007c11b93e6f46e9a815cb765990a8305d3ad8d22c76fe6b257cc71b5c1951b5d464c66df7c290cf0a4f156bbf52f1e41a79dc63abce5",
+        "wx" : "75f007c11b93e6f46e9a815cb765990a8305d3ad8d22c76fe6b257cc",
+        "wy" : "71b5c1951b5d464c66df7c290cf0a4f156bbf52f1e41a79dc63abce5"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000475f007c11b93e6f46e9a815cb765990a8305d3ad8d22c76fe6b257cc71b5c1951b5d464c66df7c290cf0a4f156bbf52f1e41a79dc63abce5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEdfAHwRuT5vRumoFct2WZCoMF062NIsdv\n5rJXzHG1wZUbXUZMZt98KQzwpPFWu/UvHkGnncY6vOU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 382,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c7fffffffffffffffffffffffffff646c95d0a029629370d8e83d717f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041255fb94a0f20e6faa2505c394cc3c39f07def4107127dffc4dacb6eea73c1044544a1496560bd1b049ff615e68ae0d483220327569884e1",
+        "wx" : "1255fb94a0f20e6faa2505c394cc3c39f07def4107127dffc4dacb6e",
+        "wy" : "0ea73c1044544a1496560bd1b049ff615e68ae0d483220327569884e1"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00041255fb94a0f20e6faa2505c394cc3c39f07def4107127dffc4dacb6eea73c1044544a1496560bd1b049ff615e68ae0d483220327569884e1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEElX7lKDyDm+qJQXDlMw8OfB970EHEn3/\nxNrLbupzwQRFRKFJZWC9GwSf9hXmiuDUgyIDJ1aYhOE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 383,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c3fffffffffffffffffffffffffff8b51705c781f09ee94a2ae2e1520",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f656a632a0804cf688446b261208f793373c5ff4454bd1e0a882113f30a25d6f586e02dd4dcbf73d96af3e483b7acb5f8f4c06450dec1982",
+        "wx" : "0f656a632a0804cf688446b261208f793373c5ff4454bd1e0a882113f",
+        "wy" : "30a25d6f586e02dd4dcbf73d96af3e483b7acb5f8f4c06450dec1982"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004f656a632a0804cf688446b261208f793373c5ff4454bd1e0a882113f30a25d6f586e02dd4dcbf73d96af3e483b7acb5f8f4c06450dec1982",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE9lamMqCATPaIRGsmEgj3kzc8X/RFS9Hg\nqIIRPzCiXW9YbgLdTcv3PZavPkg7estfj0wGRQ3sGYI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 384,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d0096dafb0d7540b93b5790327082635cd8895e1e799d5d19f92b594056",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048fb572de4daf76702624ce4ed819d026762224e8a54215bf81b202a3f074d20e1da7232d279461732bc1bae0c5416ab9d696308622e7ffe8",
+        "wx" : "08fb572de4daf76702624ce4ed819d026762224e8a54215bf81b202a3",
+        "wy" : "0f074d20e1da7232d279461732bc1bae0c5416ab9d696308622e7ffe8"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00048fb572de4daf76702624ce4ed819d026762224e8a54215bf81b202a3f074d20e1da7232d279461732bc1bae0c5416ab9d696308622e7ffe8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEj7Vy3k2vdnAmJM5O2BnQJnYiJOilQhW/\ngbICo/B00g4dpyMtJ5RhcyvBuuDFQWq51pYwhiLn/+g=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 385,
+          "comment" : "point duplication during verification",
+          "msg" : "313233343030",
+          "sig" : "303e021d00c44503dae85dd5210780f02928b3d927171c578f8603d16b240663c7021d00ec0ce3fa725c1027475a5f5bf4ee980de61c3b4875afe8b654b24ee2",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048fb572de4daf76702624ce4ed819d026762224e8a54215bf81b202a30f8b2df1e258dcd2d86b9e8cd43e451e3abe95462969cf79dd180019",
+        "wx" : "08fb572de4daf76702624ce4ed819d026762224e8a54215bf81b202a3",
+        "wy" : "0f8b2df1e258dcd2d86b9e8cd43e451e3abe95462969cf79dd180019"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00048fb572de4daf76702624ce4ed819d026762224e8a54215bf81b202a30f8b2df1e258dcd2d86b9e8cd43e451e3abe95462969cf79dd180019",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEj7Vy3k2vdnAmJM5O2BnQJnYiJOilQhW/\ngbICow+LLfHiWNzS2GuejNQ+RR46vpVGKWnPed0YABk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 386,
+          "comment" : "duplication bug",
+          "msg" : "313233343030",
+          "sig" : "303e021d00c44503dae85dd5210780f02928b3d927171c578f8603d16b240663c7021d00ec0ce3fa725c1027475a5f5bf4ee980de61c3b4875afe8b654b24ee2",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e5462d3a838d4a14de96a7b0b1071eb622ae6e71ede8f95ff01c2121368e3a90d8584e194616d3211a7541f6a0960339cab28e8bfd6b1dfd",
+        "wx" : "0e5462d3a838d4a14de96a7b0b1071eb622ae6e71ede8f95ff01c2121",
+        "wy" : "368e3a90d8584e194616d3211a7541f6a0960339cab28e8bfd6b1dfd"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004e5462d3a838d4a14de96a7b0b1071eb622ae6e71ede8f95ff01c2121368e3a90d8584e194616d3211a7541f6a0960339cab28e8bfd6b1dfd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE5UYtOoONShTelqewsQcetiKubnHt6Plf\n8BwhITaOOpDYWE4ZRhbTIRp1QfaglgM5yrKOi/1rHf0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 387,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "313233343030",
+          "sig" : "303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c33333333333333333333333333330486f9be9672d0c5d50ddf45a20c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045d97670c1f121f7f1ba541505609f20143b312a7bb49d376690e1831c1b4567141a7b534e21bd2f706ae034169ab9c3f8536147904de8c5f",
+        "wx" : "5d97670c1f121f7f1ba541505609f20143b312a7bb49d376690e1831",
+        "wy" : "0c1b4567141a7b534e21bd2f706ae034169ab9c3f8536147904de8c5f"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00045d97670c1f121f7f1ba541505609f20143b312a7bb49d376690e1831c1b4567141a7b534e21bd2f706ae034169ab9c3f8536147904de8c5f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEXZdnDB8SH38bpUFQVgnyAUOzEqe7SdN2\naQ4YMcG0VnFBp7U04hvS9wauA0Fpq5w/hTYUeQTejF8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 388,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "303c021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d2675278da2d7daa8373dd63b7aa46cb14766571c2d8098b83a102a5699b572d4b951497418a376930022d48fe59966b158fa08340e24b98",
+        "wx" : "0d2675278da2d7daa8373dd63b7aa46cb14766571c2d8098b83a102a5",
+        "wy" : "699b572d4b951497418a376930022d48fe59966b158fa08340e24b98"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004d2675278da2d7daa8373dd63b7aa46cb14766571c2d8098b83a102a5699b572d4b951497418a376930022d48fe59966b158fa08340e24b98",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE0mdSeNotfaqDc91jt6pGyxR2ZXHC2AmL\ng6ECpWmbVy1LlRSXQYo3aTACLUj+WZZrFY+gg0DiS5g=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 389,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303d021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021d00db6db6db6db6db6db6db6db6db6ceed4c09e84c77ebd9116e17391eb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045a5cd1162388348734dae20e2235ae2c464adef0a196f9aaf02482ca2ae94e8b9a024375036429b632ab485e02c5a9665b289b8a47bade8f",
+        "wx" : "5a5cd1162388348734dae20e2235ae2c464adef0a196f9aaf02482ca",
+        "wy" : "2ae94e8b9a024375036429b632ab485e02c5a9665b289b8a47bade8f"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00045a5cd1162388348734dae20e2235ae2c464adef0a196f9aaf02482ca2ae94e8b9a024375036429b632ab485e02c5a9665b289b8a47bade8f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEWlzRFiOINIc02uIOIjWuLEZK3vChlvmq\n8CSCyirpTouaAkN1A2QptjKrSF4CxalmWyibike63o8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 390,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303c021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021c33333333333333333333333333330486f9be9672d0c5d50ddf45a20c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cacd93eb11a821de3d882bab7411e7c77f23c08da174189cc987dc41716fe378ab842161bc16def6e037d4ba9d30d8cb41ad30cf0656e50b",
+        "wx" : "0cacd93eb11a821de3d882bab7411e7c77f23c08da174189cc987dc41",
+        "wy" : "716fe378ab842161bc16def6e037d4ba9d30d8cb41ad30cf0656e50b"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004cacd93eb11a821de3d882bab7411e7c77f23c08da174189cc987dc41716fe378ab842161bc16def6e037d4ba9d30d8cb41ad30cf0656e50b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEys2T6xGoId49iCurdBHnx38jwI2hdBic\nyYfcQXFv43irhCFhvBbe9uA31LqdMNjLQa0wzwZW5Qs=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 391,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303d021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021d00cccccccccccccccccccccccccccc121be6fa59cb431754377d168831",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cf46960060453e55577f1bee6a9c4709e7cdcba45ca8020bb3536931ea4ec33309213864a1318aee0a86d8b6f0c1b9741cd6bd5dea4f4066",
+        "wx" : "0cf46960060453e55577f1bee6a9c4709e7cdcba45ca8020bb3536931",
+        "wy" : "0ea4ec33309213864a1318aee0a86d8b6f0c1b9741cd6bd5dea4f4066"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004cf46960060453e55577f1bee6a9c4709e7cdcba45ca8020bb3536931ea4ec33309213864a1318aee0a86d8b6f0c1b9741cd6bd5dea4f4066",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEz0aWAGBFPlVXfxvuapxHCefNy6RcqAIL\ns1NpMepOwzMJIThkoTGK7gqG2Lbwwbl0HNa9XepPQGY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 392,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303c021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021c249249249249249249249249249227ce201a6b76951f982e7ae89852",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0462f4eaf3797bdc3d5d8cfaa07b5af7060e131b183ca4eded4819e561bff3eadd7b55db2dc01bd20569e6c47c9212f9b2d6793795b51e4f6c",
+        "wx" : "62f4eaf3797bdc3d5d8cfaa07b5af7060e131b183ca4eded4819e561",
+        "wy" : "0bff3eadd7b55db2dc01bd20569e6c47c9212f9b2d6793795b51e4f6c"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000462f4eaf3797bdc3d5d8cfaa07b5af7060e131b183ca4eded4819e561bff3eadd7b55db2dc01bd20569e6c47c9212f9b2d6793795b51e4f6c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEYvTq83l73D1djPqge1r3Bg4TGxg8pO3t\nSBnlYb/z6t17VdstwBvSBWnmxHySEvmy1nk3lbUeT2w=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 393,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "303c021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021c0eb10e5ab95facded4061029d63a46f46f12947411f2ea561a592057",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c4a4bf5ae0138587f50ab7a2c336a430527a86f59f9765c2f3f5488df9419bf9df5f121de3a32db17b49c72b606b2be5ce56acb565cc12b7",
+        "wx" : "0c4a4bf5ae0138587f50ab7a2c336a430527a86f59f9765c2f3f5488d",
+        "wy" : "0f9419bf9df5f121de3a32db17b49c72b606b2be5ce56acb565cc12b7"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004c4a4bf5ae0138587f50ab7a2c336a430527a86f59f9765c2f3f5488df9419bf9df5f121de3a32db17b49c72b606b2be5ce56acb565cc12b7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAExKS/WuAThYf1CreiwzakMFJ6hvWfl2XC\n8/VIjflBm/nfXxId46MtsXtJxytgayvlzlastWXMErc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 394,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "303d021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e7cb5ae54dbe619ab5069f14566236b3c6b0b44f1c4c531e66d89b3e64be7fdc18789629dfddf7158f8ff27abd553bfac3f7c874bccdc31b",
+        "wx" : "0e7cb5ae54dbe619ab5069f14566236b3c6b0b44f1c4c531e66d89b3e",
+        "wy" : "64be7fdc18789629dfddf7158f8ff27abd553bfac3f7c874bccdc31b"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004e7cb5ae54dbe619ab5069f14566236b3c6b0b44f1c4c531e66d89b3e64be7fdc18789629dfddf7158f8ff27abd553bfac3f7c874bccdc31b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE58ta5U2+YZq1Bp8UVmI2s8awtE8cTFMe\nZtibPmS+f9wYeJYp3933FY+P8nq9VTv6w/fIdLzNwxs=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 395,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303e021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021d00db6db6db6db6db6db6db6db6db6ceed4c09e84c77ebd9116e17391eb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0430db5d8279319cf5a3b6768a0c5e5c84752f6314f735d63f6c5650cdd32fb54f74d4a5088e6774a13201683642790d2e69e55e4f47612934",
+        "wx" : "30db5d8279319cf5a3b6768a0c5e5c84752f6314f735d63f6c5650cd",
+        "wy" : "0d32fb54f74d4a5088e6774a13201683642790d2e69e55e4f47612934"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000430db5d8279319cf5a3b6768a0c5e5c84752f6314f735d63f6c5650cdd32fb54f74d4a5088e6774a13201683642790d2e69e55e4f47612934",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEMNtdgnkxnPWjtnaKDF5chHUvYxT3NdY/\nbFZQzdMvtU901KUIjmd0oTIBaDZCeQ0uaeVeT0dhKTQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 396,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303d021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021c33333333333333333333333333330486f9be9672d0c5d50ddf45a20c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047db27da4d67a2de0c78815809719bdf6976332c67ef0f3827df4adc22ab37aec2eed0d5e67acfd6a195f21032d9af71ce73e120fdda29f1a",
+        "wx" : "7db27da4d67a2de0c78815809719bdf6976332c67ef0f3827df4adc2",
+        "wy" : "2ab37aec2eed0d5e67acfd6a195f21032d9af71ce73e120fdda29f1a"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00047db27da4d67a2de0c78815809719bdf6976332c67ef0f3827df4adc22ab37aec2eed0d5e67acfd6a195f21032d9af71ce73e120fdda29f1a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEfbJ9pNZ6LeDHiBWAlxm99pdjMsZ+8POC\nffStwiqzeuwu7Q1eZ6z9ahlfIQMtmvcc5z4SD92inxo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 397,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303e021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021d00cccccccccccccccccccccccccccc121be6fa59cb431754377d168831",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d1c19d46b517bb3bd7bdf074ff975c0dbd2bde10d1ad217e58ebc8c55ac898c040a185804ddb032b48103d6c8d12043d3a4fec93aba7a6d7",
+        "wx" : "0d1c19d46b517bb3bd7bdf074ff975c0dbd2bde10d1ad217e58ebc8c5",
+        "wy" : "5ac898c040a185804ddb032b48103d6c8d12043d3a4fec93aba7a6d7"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004d1c19d46b517bb3bd7bdf074ff975c0dbd2bde10d1ad217e58ebc8c55ac898c040a185804ddb032b48103d6c8d12043d3a4fec93aba7a6d7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE0cGdRrUXuzvXvfB0/5dcDb0r3hDRrSF+\nWOvIxVrImMBAoYWATdsDK0gQPWyNEgQ9Ok/sk6unptc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 398,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303d021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021c249249249249249249249249249227ce201a6b76951f982e7ae89852",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d95ac96ae9dbfb80911862e00a4cadbcb2359f499b53be007f0711c093d3da931acbb9242800dc521695b4f19ff2dffc3613f40bdb15c3cd",
+        "wx" : "0d95ac96ae9dbfb80911862e00a4cadbcb2359f499b53be007f0711c0",
+        "wy" : "093d3da931acbb9242800dc521695b4f19ff2dffc3613f40bdb15c3cd"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004d95ac96ae9dbfb80911862e00a4cadbcb2359f499b53be007f0711c093d3da931acbb9242800dc521695b4f19ff2dffc3613f40bdb15c3cd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE2VrJaunb+4CRGGLgCkytvLI1n0mbU74A\nfwcRwJPT2pMay7kkKADcUhaVtPGf8t/8NhP0C9sVw80=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 399,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "303d021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021c0eb10e5ab95facded4061029d63a46f46f12947411f2ea561a592057",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34",
+        "wx" : "0b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21",
+        "wy" : "0bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEtw4MvWu0v38yE5C5SgPB01bCESI0MoDW\nEVwdIb03Y4i19yP7TCLf5s1DdaBaB0dkRNWBmYUAfjQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 400,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "303c021c43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b0021c249249249249249249249249249227ce201a6b76951f982e7ae89851",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 401,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "303d021d00bc07ff041506dc73a75086a4325211e696eb6b31da8ff5c2c728d38d021c249249249249249249249249249227ce201a6b76951f982e7ae89851",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d2142c89c774a08dc04b3dd201932bc8a5ea5f8b89bbb2a7e667aff81cd",
+        "wx" : "0b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21",
+        "wy" : "42c89c774a08dc04b3dd201932bc8a5ea5f8b89bbb2a7e667aff81cd"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d2142c89c774a08dc04b3dd201932bc8a5ea5f8b89bbb2a7e667aff81cd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEtw4MvWu0v38yE5C5SgPB01bCESI0MoDW\nEVwdIULInHdKCNwEs90gGTK8il6l+Libuyp+Znr/gc0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 402,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "303c021c43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b0021c249249249249249249249249249227ce201a6b76951f982e7ae89851",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 403,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "303d021d00bc07ff041506dc73a75086a4325211e696eb6b31da8ff5c2c728d38d021c249249249249249249249249249227ce201a6b76951f982e7ae89851",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466ddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176",
+        "wx" : "4c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466",
+        "wy" : "0ddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00044c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466ddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAETCRmcGWKHUH113vOJGy+OGrCKEjiabnU\nzWfEZt3ZRxU9ObLUJTOkYN7yaIBAjK8t091I/oiM0XY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 404,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "303e021d00f72915d6d916014279616186869a01228fcd9f1b4078353018b399ab021d00b67f2b91eeeb910381f5b461a4a39c642aea4792013d4eb63da1832b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 405,
+          "comment" : "pseudorandom signature",
+          "msg" : "4d7367",
+          "sig" : "303e021d00a5d179c336ccdc760dfddd913cdf8ea468d0f4686f7b2d3825698ed7021d00a77f12060a4d1b94b0d1c443eae3ad6e21b7eacfdf6fbf39a2b29658",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 406,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "303e021d00b7c65dce56abe24fb4592ece5ac1e6ee8353431f7452409add736884021d00e5fe5db7988931026b937dc4ef983fe446ca134d29b94ac777cde317",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 407,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "303d021c05c563d3a4bad874e4610adfa57777a59f995bfa06ef97bf125a4988021d0097ed68f546cf4bb4998524c18356f3af162d2bf2744be93357bc4b4b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04aed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf8a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000",
+        "wx" : "0aed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf",
+        "wy" : "08a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004aed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf8a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAErtb8rSQAxNlOVdu2sBLOPUwrRoQ/vpnU\nKJ5uz4okqJ5xND19FR0ljSy2kDScLVazZt0QpgAAAAA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 408,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00c7a6f358b7d93815189ae5d2c3ab4d4e05f43176a52dd4fc5b48a34a021d00a2458512bb8dbe6f1bd6eb01d2d77d5624e8547bf87d85fc731c0c86",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 409,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c5f56ca587d16664a20dad13df85a475978e5cee81a8d0f49faaf6158021d00b64ef59d79461fe1a09a5864907435f70bd75f183afb11903f560b7c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 410,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00dd94f5b56e9947d007e7c8efd894a5c882f1d0b5dd56c32b5b266521021d00fbc883741bd27c59958ae17ba6e4a41ad1edeca9a3ba31c8f233b5ac",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f173d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff",
+        "wx" : "0bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f1",
+        "wy" : "73d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f173d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEvxns/kP/4on2mfR5MWFFuaf3Nwuezlqx\nISF08XPVKJSa6RQvgYut5xqWBAeWO+C2SCpqYP////8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 411,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d008071e6682c6e8a32706dc7e411503946546b31fff27dcce188ae389f021d00dc396c797d44edf794432d1da091f8c762974d8ce1f06e08ca013622",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 412,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c791624e5f234b8950d509d0b456ef6fa778b19dccd609d496b62a211021c6c51e846fa53d03d42f798e6bb90954f9a48c1794b47e84ac97b460a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 413,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021b34befa1d25b756ce76b383a6e8753741c12a59266c2c7921ff6e8b021d00bc44e3823e4d807cbc92fa786a89e62a4b217b5fb0c0f1865d4a7e43",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0426e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0",
+        "wx" : "26e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000",
+        "wy" : "0eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000426e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEJuWr8TXLVOqqFraeSwspInU0Toignfbf\ngAAAAOq4kd5U4/Jv9Qq5ifMz2sVRWD1GiuYjxZZDSvA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 414,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c224a38e733ebd3fac274ecc50ecef2e7c3189be2b9d093a8dcc6fa3a021c134fa5a4f923d296b3c6dd4683d249ccf0ad272890e4149c9a0d7415",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 415,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c338d07d990879ad844e24c1788e362269d8aca70500357d385768227021d00f745cc4ebaaf1cd42830026a66e5b95564cdbee5edf853bb2cc91259",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 416,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c689fce4b33d8212a663640a1ae0efaa7a7d7711beba719374fe634ee021c04bd9981fa52293063076f0fd70fc31875d580ef94f020d2f95440e0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd",
+        "wx" : "0ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff",
+        "wy" : "41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE7GJ/NFVF0D+Mbb0I5XVScRZWf+N1+eyq\n/////0G/cFaX1fcWvPeHGNU5O2OphpH0ofJCRjdVOP0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 417,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c2a4287e01510e7fb5fed2e1ccc3f2a6929cf7d03850e49d7ae8a504a021c355c3915f3fa9637dc8001438a8c04e15d14934cabd430feb0cb5ba5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 418,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00b5bf795a38adb052b401468ffcab81103d2d9fca2e15b8d08ab98ce8021c5ec0d2c6aec71888c941af324c7272bec192abb292f9df82a24e8a41",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 419,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c100ed07f467133bf10917f7a15ab2bfda519bdbc2653b95955e22211021d00b38a081f7c2e2b775d1da868d0381c09ba1559c9613b5be7159363ad",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a00000000762d28f1fdc219184f81681fbff566d465b5f1f31e872df5",
+        "wx" : "15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a",
+        "wy" : "762d28f1fdc219184f81681fbff566d465b5f1f31e872df5"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a00000000762d28f1fdc219184f81681fbff566d465b5f1f31e872df5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEFQFuUrNkctU2R3YF+4Bd05AwgqBi0eow\nr55VWgAAAAB2LSjx/cIZGE+BaB+/9WbUZbXx8x6HLfU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 420,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c54e6add8ac910e52c6228fe3980d8f586218334d8d859ba9a3329917021c5836cc79ec88519eab4a6b2614c501628c9fee32fbafd93e32158409",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 421,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c1230d5409f379584b4d548b7bccba64baf81d512a9f2e6398c4e3a66021c1937a298f8cbdfa85b8e6fcf0a12be4966d80270cade85a0c37ee6f3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 422,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00862f43b044fb32adb45e00378ba083ae761c84452054f17b1341bf5b021d0095d8d8e5e3a6cc2b0a06c792252ca11a642257721831578520f96b9e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555affffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c",
+        "wx" : "15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a",
+        "wy" : "0ffffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555affffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEFQFuUrNkctU2R3YF+4Bd05AwgqBi0eow\nr55VWv////+J0tcOAj3m57B+l99ACpkrmkoODOF40gw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 423,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00cb5cabb1ca01b847a6bc70558d1e5d3a204d1741bbe800f4b159af35021c3580cc85f218394130bddf1c4eac04fe96f59f14fb436686950398be",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 424,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00c9d83dc04cf4ee89c405045d0fd1d704f627ca5bbe350f40b826bbc1021c74fedc9e55045e9759f2124460fdfb991dc620cfee6effc0b4adaa9e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 425,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c46dd65b6e7f10c0841841b01033a5befd3a0e78c85f1f390bb3cdf25021d00f33acea3d47cf0dd5273735b004104f6512ed641052509422c0325a7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400000000f7e4713d085112112c37cdf4601ff688da796016b71a727ade5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1",
+        "wx" : "0f7e4713d085112112c37cdf4601ff688da796016b71a727a",
+        "wy" : "0de5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000400000000f7e4713d085112112c37cdf4601ff688da796016b71a727ade5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEAAAAAPfkcT0IURIRLDfN9GAf9ojaeWAW\ntxpyet5ansFlBUzJh/nch+mZG5Lk+mScplXurp8qMOE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 426,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00ddb4a7e400a1e98118f474722da3f421f65a76eec61f4f7b699faf07021d00db80cba199859cdfe916d6ab3deb91d76aaf0ed554c8f9ed7e5aa59d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 427,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c4c260b546280604e4c80384721c9e803ef704e7fb70168e6730fc1f3021d00a8aceae219ac25c9f04231b4e0c171413db1d26df1c1e8430062eb2b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 428,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00f4098d2c0240e78fceabb0183df0b39e7ad3e7f5d6da1587fa09853c021d00d42412b2abaa614c95eb11f9b9346282ce3a1c93aac35ce7aa372f4a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f72586c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e",
+        "wx" : "0ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f725",
+        "wy" : "086c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f72586c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE/////+rffO6NNNBM8iyPfeNWdPsvUB0k\nKnb3JYbECTCdOY5gzh4KTJ4FqdMmJ1d+jOLMfzr6LD4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 429,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c48ddc497f9a4732c677e46c0e2bdabec54fc9d27e46ab595056db4d9021d00b8219ebbfaebc2fe4311efab0c35d4392751351bcc1971e8d01941e4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 430,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00e1abaf51d27a6d7d4c9b28078325cac2d7ce3d5403916c68903760b7021c2c45a99e2770f782fee5ca1d713eaecf07e62d53c64b7cf93de9900d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 431,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00868cd127c99e1149f7fc8d878cdfa986b62e99addea281149611ff15021c16e5953820135b7d462ce5434ef85920e973eec9e4d14d7cb3cc2a3f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1000000000e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc",
+        "wx" : "0b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1",
+        "wy" : "0e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1000000000e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEsAE8b7/28J/s2hwmPvZTmdTPmJyl/E+P\n/w/p4QAAAAAOKrDoSV6FnrKvsAdp1uf+YmoRkWfAtrw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 432,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00a375929718ec4e6ada9c9370c51df6bdaee7ebab2a70675d42a0b6b3021d009eaf4802efaf7ca082ffbf5ed774af43792d9b3fd711c6b1c36112ff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 433,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00d97b32f3bf8bc11ec2672dd6320418beeed99527a63fe4c52199ec61021c68dd9006b03319ccbe651d0bdaf84c63356f03cb007a6865ee3e0206",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 434,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d008ee5794dc2e66f2584910ea1d8361e5b53db535adcf5c1c35e128309021c5d1d8b9b996c0a488e05af14421b86e9841f0cba706027fc827d4d95",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945",
+        "wx" : "0b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1",
+        "wy" : "0fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEsAE8b7/28J/s2hwmPvZTmdTPmJyl/E+P\n/w/p4f/////x1U8XtqF6YU1QT/eWKRgBnZXubpg/SUU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 435,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c7999727c0cc02d88ef274012a762afcbb19e7fce19091a02acd00564021d00dbfacf67999f22c499d48a60a6fe4bbb746199c29957a1ec7a0900e0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 436,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c5797c21c0162e42f69693c6c0244dfdf9218c01e9235760177b61a54021c5452c887b27fb342a8a00d27579c7195dddb73df399233ed0dea567b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 437,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c0eb9dc5d67bb0d4009544f8654977907dfe770e7fae4571d31d7b4fa021d00ab5cda53e868bff5198be4be3681b186cb0c1396d272c71f093f8b12",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdsa_secp256k1_sha256_test.json b/third_party/wycheproof/testvectors/ecdsa_secp256k1_sha256_test.json
new file mode 100644
index 0000000..d261809
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdsa_secp256k1_sha256_test.json
@@ -0,0 +1,4294 @@
+{
+  "algorithm" : "ECDSA",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "BER" : "This is a signature with correct values for (r, s) but using some alternative BER encoding instead of DER encoding. Implementations should not accept such signatures to limit signature malleability.",
+    "EdgeCase" : "Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA implementation does not check boundaries and computes s^(-1)==0.",
+    "MissingZero" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.",
+    "PointDuplication" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission."
+  },
+  "numberOfTests" : 364,
+  "header" : [],
+  "testGroups" : [
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6ff0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9",
+        "wx" : "0b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6f",
+        "wy" : "0f0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6ff0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEuDj/ROW8F3vyEYnQdmCC/J2EMiaIf8l2\nA3EQC37iCm/wyddb+6ezGmvKGXRJbutW3jVwcZVdg8Sxutqgshgy6Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "signature malleability",
+          "msg" : "313233343030",
+          "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365022100900e75ad233fcc908509dbff5922647db37c21f4afd3203ae8dc4ae7794b0f87",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "Legacy:ASN encoding of r misses leading 0",
+          "msg" : "313233343030",
+          "sig" : "30440220813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingZero"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "valid",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "308145022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 5,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "304602812100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 6,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650281206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 7,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "30820045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 8,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "30470282002100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365028200206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 10,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3044022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3045022200813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3045022000813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502216ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365021f6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "30850100000045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304a0285010000002100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304a022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365028501000000206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3089010000000000000045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304e028901000000000000002100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304e022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502890100000000000000206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30847fffffff022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "304902847fffffff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502847fffffff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3084ffffffff022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "30490284ffffffff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650284ffffffff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3085ffffffffff022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "304a0285ffffffffff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "304a022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650285ffffffffff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3088ffffffffffffffff022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "304d0288ffffffffffffffff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "304d022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650288ffffffffffffffff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30ff022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "304502ff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502ff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "3045028000813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502806ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "30470000022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304a4981773045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304925003045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30473045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304a2226498177022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304922252500022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304d2223022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650004deadbeef02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304a022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365222549817702206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323652224250002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304d022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365222202206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304daa00bb00cd003045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304baa02aabb3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304d2229aa00bb00cd00022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304b2227aa02aabb022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304d022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323652228aa00bb00cd0002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304b022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323652226aa02aabb02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "30803045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "30492280022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365000002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365228002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "30803145022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "30492280032100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365000002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365228003206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2e45022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2f45022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3145022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3245022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "ff45022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "304930010230442100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "3044022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "30442100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 79,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba05000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "30473000022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "30473045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "3023022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "3067022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "removing integer",
+          "msg" : "313233343030",
+          "sig" : "302202206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "30230202206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "3024022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3047022300813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365000002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502226ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "30470223000000813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 95,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365022200006ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 96,
+          "comment" : "appending unused 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365000002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "3047022300813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365050002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502226ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "3024028102206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "3025022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650281",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "3024050002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "3025022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045002100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045012100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045032100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045042100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045ff2100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236500206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236501206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236503206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236504206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365ff206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "3024020002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "3025022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "304922250201000220813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365222402016f021ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "3045022102813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206df18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323e502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb313a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3044022000813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832302206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "30440220813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3044022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365021f6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3044022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365021ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "30460222ff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650221ff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "302509018002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "3026022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365090180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "302502010002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "3026022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365020100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3045022101813ef79ccefa9a56f7ba805f0e478583b90deabca4b05c4574e49b5899b964a602206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30440220813ef79ccefa9a56f7ba805f0e47858643b030ef461f1bcdf53fde3ef94ce22402206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30450221ff7ec10863310565a908457fa0f1b87a7b01a0f22a0a9843f64aedc334367cdc9b02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304402207ec10863310565a908457fa0f1b87a79bc4fcf10b9e0e4320ac021c106b31ddc02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30450221fe7ec10863310565a908457fa0f1b87a7c46f215435b4fa3ba8b1b64a766469b5a02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3045022101813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304402207ec10863310565a908457fa0f1b87a7b01a0f22a0a9843f64aedc334367cdc9b02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650221016ff18a52dcc0336f7af62400a6dd9b7fc1e197d8aebe203c96c87232272172fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650221ff6ff18a52dcc0336f7af62400a6dd9b824c83de0b502cdfc51723b51886b4f079",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650220900e75ad233fcc908509dbff5922647ef8cd450e008a7fff2909ec5aa914ce46",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650221fe900e75ad233fcc908509dbff592264803e1e68275141dfc369378dcdd8de8d05",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650221016ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365022100900e75ad233fcc908509dbff5922647ef8cd450e008a7fff2909ec5aa914ce46",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020101090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30080201ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641400201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641420201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc300201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "Edge case for Shamir multiplication",
+          "msg" : "3235353835",
+          "sig" : "3045022100dd1b7d09a7bd8218961034a39a87fecf5314f00c4d25eb58a07ac85e85eab516022035138c401ef8d3493d65c9002fe62b43aee568731b744548358996d9cc427e06",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "special case hash",
+          "msg" : "343236343739373234",
+          "sig" : "304502210095c29267d972a043d955224546222bba343fc1d4db0fec262a33ac61305696ae02206edfe96713aed56f8a28a6653f57e0b829712e5eddc67f34682b24f0676b2640",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "special case hash",
+          "msg" : "37313338363834383931",
+          "sig" : "3045022028f94a894e92024699e345fe66971e3edcd050023386135ab3939d550898fb25022100cd69c1a42be05a6ee1270c821479251e134c21858d800bda6f4e98b37196238e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "special case hash",
+          "msg" : "3130333539333331363638",
+          "sig" : "3046022100be26b18f9549f89f411a9b52536b15aa270b84548d0e859a1952a27af1a77ac60221008f3e2b05632fc33715572af9124681113f2b84325b80154c044a544dc1a8fa12",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "special case hash",
+          "msg" : "33393439343031323135",
+          "sig" : "3046022100b1a4b1478e65cc3eafdf225d1298b43f2da19e4bcff7eacc0a2e98cd4b74b114022100e8655ce1cfb33ebd30af8ce8e8ae4d6f7b50cd3e22af51bf69e0a2851760d52b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "special case hash",
+          "msg" : "31333434323933303739",
+          "sig" : "30440220325332021261f1bd18f2712aa1e2252da23796da8a4b1ff6ea18cafec7e171f2022040b4f5e287ee61fc3c804186982360891eaa35c75f05a43ecd48b35d984a6648",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "special case hash",
+          "msg" : "33373036323131373132",
+          "sig" : "3046022100a23ad18d8fc66d81af0903890cbd453a554cb04cdc1a8ca7f7f78e5367ed88a0022100dc1c14d31e3fb158b73c764268c8b55579734a7e2a2c9b5ee5d9d0144ef652eb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "special case hash",
+          "msg" : "333433363838373132",
+          "sig" : "304502202bdea41cda63a2d14bf47353bd20880a690901de7cd6e3cc6d8ed5ba0cdb1091022100c31599433036064073835b1e3eba8335a650c8fd786f94fe235ad7d41dc94c7a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "special case hash",
+          "msg" : "31333531353330333730",
+          "sig" : "3046022100d7cd76ec01c1b1079eba9e2aa2a397243c4758c98a1ba0b7404a340b9b00ced6022100ca8affe1e626dd192174c2937b15bc48f77b5bdfe01f073a8aeaf7f24dc6c85b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "special case hash",
+          "msg" : "36353533323033313236",
+          "sig" : "3045022100a872c744d936db21a10c361dd5c9063355f84902219652f6fc56dc95a7139d960220400df7575d9756210e9ccc77162c6b593c7746cfb48ac263c42750b421ef4bb9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "special case hash",
+          "msg" : "31353634333436363033",
+          "sig" : "30460221009fa9afe07752da10b36d3afcd0fe44bfc40244d75203599cf8f5047fa3453854022100af1f583fec4040ae7e68c968d2bb4b494eec3a33edc7c0ccf95f7f75bc2569c7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "special case hash",
+          "msg" : "34343239353339313137",
+          "sig" : "3045022100885640384d0d910efb177b46be6c3dc5cac81f0b88c3190bb6b5f99c2641f2050220738ed9bff116306d9caa0f8fc608be243e0b567779d8dab03e8e19d553f1dc8e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "special case hash",
+          "msg" : "3130393533323631333531",
+          "sig" : "304502202d051f91c5a9d440c5676985710483bc4f1a6c611b10c95a2ff0363d90c2a45802210092206b19045a41a797cc2f3ac30de9518165e96d5b86341ecb3bcff231b3fd65",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "special case hash",
+          "msg" : "35393837333530303431",
+          "sig" : "3045022100f3ac2523967482f53d508522712d583f4379cd824101ff635ea0935117baa54f022027f10812227397e02cea96fb0e680761636dab2b080d1fc5d11685cbe8500cfe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "special case hash",
+          "msg" : "33343633303036383738",
+          "sig" : "304602210096447cf68c3ab7266ed7447de3ac52fed7cc08cbdfea391c18a9b8ab370bc913022100f0a1878b2c53f16e70fe377a5e9c6e86f18ae480a22bb499f5b32e7109c07385",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 231,
+          "comment" : "special case hash",
+          "msg" : "39383137333230323837",
+          "sig" : "30450220530a0832b691da0b5619a0b11de6877f3c0971baaa68ed122758c29caaf46b7202210093761bb0a14ccf9f15b4b9ce73c6ec700bd015b8cb1cfac56837f4463f53074e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 232,
+          "comment" : "special case hash",
+          "msg" : "33323232303431303436",
+          "sig" : "30460221009c54c25500bde0b92d72d6ec483dc2482f3654294ca74de796b681255ed58a77022100988bac394a90ad89ce360984c0c149dcbd2684bb64498ace90bcf6b6af1c170e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 233,
+          "comment" : "special case hash",
+          "msg" : "36363636333037313034",
+          "sig" : "3045022100e7909d41439e2f6af29136c7348ca2641a2b070d5b64f91ea9da7070c7a2618b022042d782f132fa1d36c2c88ba27c3d678d80184a5d1eccac7501f0b47e3d205008",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 234,
+          "comment" : "special case hash",
+          "msg" : "31303335393531383938",
+          "sig" : "304502205924873209593135a4c3da7bb381227f8a4b6aa9f34fe5bb7f8fbc131a039ffe022100e0e44ee4bbe370155bf0bbdec265bf9fe31c0746faab446de62e3631eacd111f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 235,
+          "comment" : "special case hash",
+          "msg" : "31383436353937313935",
+          "sig" : "3045022100eeb692c9b262969b231c38b5a7f60649e0c875cd64df88f33aa571fa3d29ab0e0220218b3a1eb06379c2c18cf51b06430786d1c64cd2d24c9b232b23e5bac7989acd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 236,
+          "comment" : "special case hash",
+          "msg" : "33313336303436313839",
+          "sig" : "3045022100a40034177f36091c2b653684a0e3eb5d4bff18e4d09f664c2800e7cafda1daf802203a3ec29853704e52031c58927a800a968353adc3d973beba9172cbbeab4dd149",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 237,
+          "comment" : "special case hash",
+          "msg" : "32363633373834323534",
+          "sig" : "3046022100b5d795cc75cea5c434fa4185180cd6bd21223f3d5a86da6670d71d95680dadbf022100ab1b277ef5ffe134460835e3d1402461ba104cb50b16f397fdc7a9abfefef280",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 238,
+          "comment" : "special case hash",
+          "msg" : "31363532313030353234",
+          "sig" : "3044022007dc2478d43c1232a4595608c64426c35510051a631ae6a5a6eb1161e57e42e102204a59ea0fdb72d12165cea3bf1ca86ba97517bd188db3dbd21a5a157850021984",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 239,
+          "comment" : "special case hash",
+          "msg" : "35373438303831363936",
+          "sig" : "3046022100ddd20c4a05596ca868b558839fce9f6511ddd83d1ccb53f82e5269d559a01552022100a46e8cb8d626cf6c00ddedc3b5da7e613ac376445ee260743f06f79054c7d42a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 240,
+          "comment" : "special case hash",
+          "msg" : "36333433393133343638",
+          "sig" : "30450221009cde6e0ede0a003f02fda0a01b59facfe5dec063318f279ce2de7a9b1062f7b702202886a5b8c679bdf8224c66f908fd6205492cb70b0068d46ae4f33a4149b12a52",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 241,
+          "comment" : "special case hash",
+          "msg" : "31353431313033353938",
+          "sig" : "3046022100c5771016d0dd6357143c89f684cd740423502554c0c59aa8c99584f1ff38f609022100ab4bfa0bb88ab99791b9b3ab9c4b02bd2a57ae8dde50b9064063fcf85315cfe5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 242,
+          "comment" : "special case hash",
+          "msg" : "3130343738353830313238",
+          "sig" : "3045022100a24ebc0ec224bd67ae397cbe6fa37b3125adbd34891abe2d7c7356921916dfe6022034f6eb6374731bbbafc4924fb8b0bdcdda49456d724cdae6178d87014cb53d8c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 243,
+          "comment" : "special case hash",
+          "msg" : "3130353336323835353638",
+          "sig" : "304502202557d64a7aee2e0931c012e4fea1cd3a2c334edae68cdeb7158caf21b68e5a2402210080f93244956ffdc568c77d12684f7f004fa92da7e60ae94a1b98c422e23eda34",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 244,
+          "comment" : "special case hash",
+          "msg" : "393533393034313035",
+          "sig" : "3046022100c4f2eccbb6a24350c8466450b9d61b207ee359e037b3dcedb42a3f2e6dd6aeb5022100cd9c394a65d0aa322e391eb76b2a1a687f8620a88adef3a01eb8e4fb05b6477a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 245,
+          "comment" : "special case hash",
+          "msg" : "393738383438303339",
+          "sig" : "3046022100eff04781c9cbcd162d0a25a6e2ebcca43506c523385cb515d49ea38a1b12fcad022100ea5328ce6b36e56ab87acb0dcfea498bcec1bba86a065268f6eff3c41c4b0c9c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 246,
+          "comment" : "special case hash",
+          "msg" : "33363130363732343432",
+          "sig" : "3046022100f58b4e3110a64bf1b5db97639ee0e5a9c8dfa49dc59b679891f520fdf0584c87022100d32701ae777511624c1f8abbf02b248b04e7a9eb27938f524f3e8828ba40164a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 247,
+          "comment" : "special case hash",
+          "msg" : "31303534323430373035",
+          "sig" : "3045022100f8abecaa4f0c502de4bf5903d48417f786bf92e8ad72fec0bd7fcb7800c0bbe302204c7f9e231076a30b7ae36b0cebe69ccef1cd194f7cce93a5588fd6814f437c0e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 248,
+          "comment" : "special case hash",
+          "msg" : "35313734343438313937",
+          "sig" : "304402205d5b38bd37ad498b2227a633268a8cca879a5c7c94a4e416bd0a614d09e606d2022012b8d664ea9991062ecbb834e58400e25c46007af84f6007d7f1685443269afe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 249,
+          "comment" : "special case hash",
+          "msg" : "31393637353631323531",
+          "sig" : "304402200c1cd9fe4034f086a2b52d65b9d3834d72aebe7f33dfe8f976da82648177d8e3022013105782e3d0cfe85c2778dec1a848b27ac0ae071aa6da341a9553a946b41e59",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 250,
+          "comment" : "special case hash",
+          "msg" : "33343437323533333433",
+          "sig" : "3045022100ae7935fb96ff246b7b5d5662870d1ba587b03d6e1360baf47988b5c02ccc1a5b02205f00c323272083782d4a59f2dfd65e49de0693627016900ef7e61428056664b3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 251,
+          "comment" : "special case hash",
+          "msg" : "333638323634333138",
+          "sig" : "3045022000a134b5c6ccbcefd4c882b945baeb4933444172795fa6796aae149067547098022100a991b9efa2db276feae1c115c140770901839d87e60e7ec45a2b81cf3b437be6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 252,
+          "comment" : "special case hash",
+          "msg" : "33323631313938363038",
+          "sig" : "304502202e4721363ad3992c139e5a1c26395d2c2d777824aa24fde075e0d7381171309d0221008bf083b6bbe71ecff22baed087d5a77eaeaf726bf14ace2c03fd6e37ba6c26f2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 253,
+          "comment" : "special case hash",
+          "msg" : "39363738373831303934",
+          "sig" : "304502206852e9d3cd9fe373c2d504877967d365ab1456707b6817a042864694e1960ccf022100f9b4d815ebd4cf77847b37952334d05b2045cb398d4c21ba207922a7a4714d84",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 254,
+          "comment" : "special case hash",
+          "msg" : "34393538383233383233",
+          "sig" : "30440220188a8c5648dc79eace158cf886c62b5468f05fd95f03a7635c5b4c31f09af4c5022036361a0b571a00c6cd5e686ccbfcfa703c4f97e48938346d0c103fdc76dc5867",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 255,
+          "comment" : "special case hash",
+          "msg" : "383234363337383337",
+          "sig" : "3045022100a74f1fb9a8263f62fc4416a5b7d584f4206f3996bb91f6fc8e73b9e92bad0e1302206815032e8c7d76c3ab06a86f33249ce9940148cb36d1f417c2e992e801afa3fa",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 256,
+          "comment" : "special case hash",
+          "msg" : "3131303230383333373736",
+          "sig" : "3045022007244865b72ff37e62e3146f0dc14682badd7197799135f0b00ade7671742bfe022100f27f3ddc7124b1b58579573a835650e7a8bad5eeb96e9da215cd7bf9a2a039ed",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 257,
+          "comment" : "special case hash",
+          "msg" : "313333383731363438",
+          "sig" : "3045022100da7fdd05b5badabd619d805c4ee7d9a84f84ddd5cf9c5bf4d4338140d689ef08022028f1cf4fa1c3c5862cfa149c0013cf5fe6cf5076cae000511063e7de25bb38e5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 258,
+          "comment" : "special case hash",
+          "msg" : "333232313434313632",
+          "sig" : "3046022100d3027c656f6d4fdfd8ede22093e3c303b0133c340d615e7756f6253aea927238022100f6510f9f371b31068d68bfeeaa720eb9bbdc8040145fcf88d4e0b58de0777d2a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 259,
+          "comment" : "special case hash",
+          "msg" : "3130363836363535353436",
+          "sig" : "304402200bf6c0188dc9571cd0e21eecac5fbb19d2434988e9cc10244593ef3a98099f6902204864a562661f9221ec88e3dd0bc2f6e27ac128c30cc1a80f79ec670a22b042ee",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 260,
+          "comment" : "special case hash",
+          "msg" : "3632313535323436",
+          "sig" : "3045022100ae459640d5d1179be47a47fa538e16d94ddea5585e7a244804a51742c686443a02206c8e30e530a634fae80b3ceb062978b39edbe19777e0a24553b68886181fd897",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 261,
+          "comment" : "special case hash",
+          "msg" : "37303330383138373734",
+          "sig" : "304402201cf3517ba3bf2ab8b9ead4ebb6e866cb88a1deacb6a785d3b63b483ca02ac4950220249a798b73606f55f5f1c70de67cb1a0cff95d7dc50b3a617df861bad3c6b1c9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 262,
+          "comment" : "special case hash",
+          "msg" : "35393234353233373434",
+          "sig" : "3045022100e69b5238265ea35d77e4dd172288d8cea19810a10292617d5976519dc5757cb802204b03c5bc47e826bdb27328abd38d3056d77476b2130f3df6ec4891af08ba1e29",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 263,
+          "comment" : "special case hash",
+          "msg" : "31343935353836363231",
+          "sig" : "304402205f9d7d7c870d085fc1d49fff69e4a275812800d2cf8973e7325866cb40fa2b6f02206d1f5491d9f717a597a15fd540406486d76a44697b3f0d9d6dcef6669f8a0a56",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 264,
+          "comment" : "special case hash",
+          "msg" : "34303035333134343036",
+          "sig" : "304402200a7d5b1959f71df9f817146ee49bd5c89b431e7993e2fdecab6858957da685ae02200f8aad2d254690bdc13f34a4fec44a02fd745a422df05ccbb54635a8b86b9609",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 265,
+          "comment" : "special case hash",
+          "msg" : "33303936343537353132",
+          "sig" : "3044022079e88bf576b74bc07ca142395fda28f03d3d5e640b0b4ff0752c6d94cd553408022032cea05bd2d706c8f6036a507e2ab7766004f0904e2e5c5862749c0073245d6a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 266,
+          "comment" : "special case hash",
+          "msg" : "32373834303235363230",
+          "sig" : "30450221009d54e037a00212b377bc8874798b8da080564bbdf7e07591b861285809d01488022018b4e557667a82bd95965f0706f81a29243fbdd86968a7ebeb43069db3b18c7f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 267,
+          "comment" : "special case hash",
+          "msg" : "32363138373837343138",
+          "sig" : "304402202664f1ffa982fedbcc7cab1b8bc6e2cb420218d2a6077ad08e591ba9feab33bd022049f5c7cb515e83872a3d41b4cdb85f242ad9d61a5bfc01debfbb52c6c84ba728",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 268,
+          "comment" : "special case hash",
+          "msg" : "31363432363235323632",
+          "sig" : "304502205827518344844fd6a7de73cbb0a6befdea7b13d2dee4475317f0f18ffc81524b022100b0a334b1f4b774a5a289f553224d286d239ef8a90929ed2d91423e024eb7fa66",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 269,
+          "comment" : "special case hash",
+          "msg" : "36383234313839343336",
+          "sig" : "304602210097ab19bd139cac319325869218b1bce111875d63fb12098a04b0cd59b6fdd3a3022100bce26315c5dbc7b8cfc31425a9b89bccea7aa9477d711a4d377f833dcc28f820",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 270,
+          "comment" : "special case hash",
+          "msg" : "343834323435343235",
+          "sig" : "3044022052c683144e44119ae2013749d4964ef67509278f6d38ba869adcfa69970e123d02203479910167408f45bda420a626ec9c4ec711c1274be092198b4187c018b562ca",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0407310f90a9eae149a08402f54194a0f7b4ac427bf8d9bd6c7681071dc47dc36226a6d37ac46d61fd600c0bf1bff87689ed117dda6b0e59318ae010a197a26ca0",
+        "wx" : "7310f90a9eae149a08402f54194a0f7b4ac427bf8d9bd6c7681071dc47dc362",
+        "wy" : "26a6d37ac46d61fd600c0bf1bff87689ed117dda6b0e59318ae010a197a26ca0"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000407310f90a9eae149a08402f54194a0f7b4ac427bf8d9bd6c7681071dc47dc36226a6d37ac46d61fd600c0bf1bff87689ed117dda6b0e59318ae010a197a26ca0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEBzEPkKnq4UmghAL1QZSg97SsQnv42b1s\ndoEHHcR9w2ImptN6xG1h/WAMC/G/+HaJ7RF92msOWTGK4BChl6JsoA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 271,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "313233343030",
+          "sig" : "30360211014551231950b75fc4402da1722fc9baeb022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 272,
+          "comment" : "r too large",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2c022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bc97e7585eecad48e16683bc4091708e1a930c683fc47001d4b383594f2c4e22705989cf69daeadd4e4e4b8151ed888dfec20fb01728d89d56b3f38f2ae9c8c5",
+        "wx" : "0bc97e7585eecad48e16683bc4091708e1a930c683fc47001d4b383594f2c4e22",
+        "wy" : "705989cf69daeadd4e4e4b8151ed888dfec20fb01728d89d56b3f38f2ae9c8c5"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004bc97e7585eecad48e16683bc4091708e1a930c683fc47001d4b383594f2c4e22705989cf69daeadd4e4e4b8151ed888dfec20fb01728d89d56b3f38f2ae9c8c5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEvJfnWF7srUjhZoO8QJFwjhqTDGg/xHAB\n1LODWU8sTiJwWYnPadrq3U5OS4FR7YiN/sIPsBco2J1Ws/OPKunIxQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 273,
+          "comment" : "r,s are large",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0444ad339afbc21e9abf7b602a5ca535ea378135b6d10d81310bdd8293d1df3252b63ff7d0774770f8fe1d1722fa83acd02f434e4fc110a0cc8f6dddd37d56c463",
+        "wx" : "44ad339afbc21e9abf7b602a5ca535ea378135b6d10d81310bdd8293d1df3252",
+        "wy" : "0b63ff7d0774770f8fe1d1722fa83acd02f434e4fc110a0cc8f6dddd37d56c463"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000444ad339afbc21e9abf7b602a5ca535ea378135b6d10d81310bdd8293d1df3252b63ff7d0774770f8fe1d1722fa83acd02f434e4fc110a0cc8f6dddd37d56c463",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAERK0zmvvCHpq/e2AqXKU16jeBNbbRDYEx\nC92Ck9HfMlK2P/fQd0dw+P4dFyL6g6zQL0NOT8EQoMyPbd3TfVbEYw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 274,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02203e9a7582886089c62fb840cf3b83061cd1cff3ae4341808bb5bdee6191174177",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041260c2122c9e244e1af5151bede0c3ae23b54d7c596881d3eebad21f37dd878c5c9a0c1a9ade76737a8811bd6a7f9287c978ee396aa89c11e47229d2ccb552f0",
+        "wx" : "1260c2122c9e244e1af5151bede0c3ae23b54d7c596881d3eebad21f37dd878c",
+        "wy" : "5c9a0c1a9ade76737a8811bd6a7f9287c978ee396aa89c11e47229d2ccb552f0"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200041260c2122c9e244e1af5151bede0c3ae23b54d7c596881d3eebad21f37dd878c5c9a0c1a9ade76737a8811bd6a7f9287c978ee396aa89c11e47229d2ccb552f0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEEmDCEiyeJE4a9RUb7eDDriO1TXxZaIHT\n7rrSHzfdh4xcmgwamt52c3qIEb1qf5KHyXjuOWqonBHkcinSzLVS8A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 275,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022024238e70b431b1a64efdf9032669939d4b77f249503fc6905feb7540dea3e6d2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041877045be25d34a1d0600f9d5c00d0645a2a54379b6ceefad2e6bf5c2a3352ce821a532cc1751ee1d36d41c3d6ab4e9b143e44ec46d73478ea6a79a5c0e54159",
+        "wx" : "1877045be25d34a1d0600f9d5c00d0645a2a54379b6ceefad2e6bf5c2a3352ce",
+        "wy" : "0821a532cc1751ee1d36d41c3d6ab4e9b143e44ec46d73478ea6a79a5c0e54159"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200041877045be25d34a1d0600f9d5c00d0645a2a54379b6ceefad2e6bf5c2a3352ce821a532cc1751ee1d36d41c3d6ab4e9b143e44ec46d73478ea6a79a5c0e54159",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEGHcEW+JdNKHQYA+dXADQZFoqVDebbO76\n0ua/XCozUs6CGlMswXUe4dNtQcPWq06bFD5E7EbXNHjqanmlwOVBWQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 276,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04455439fcc3d2deeceddeaece60e7bd17304f36ebb602adf5a22e0b8f1db46a50aec38fb2baf221e9a8d1887c7bf6222dd1834634e77263315af6d23609d04f77",
+        "wx" : "455439fcc3d2deeceddeaece60e7bd17304f36ebb602adf5a22e0b8f1db46a50",
+        "wy" : "0aec38fb2baf221e9a8d1887c7bf6222dd1834634e77263315af6d23609d04f77"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004455439fcc3d2deeceddeaece60e7bd17304f36ebb602adf5a22e0b8f1db46a50aec38fb2baf221e9a8d1887c7bf6222dd1834634e77263315af6d23609d04f77",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAERVQ5/MPS3uzt3q7OYOe9FzBPNuu2Aq31\noi4Ljx20alCuw4+yuvIh6ajRiHx79iIt0YNGNOdyYzFa9tI2CdBPdw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 277,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020102",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042e1f466b024c0c3ace2437de09127fed04b706f94b19a21bb1c2acf35cece7180449ae3523d72534e964972cfd3b38af0bddd9619e5af223e4d1a40f34cf9f1d",
+        "wx" : "2e1f466b024c0c3ace2437de09127fed04b706f94b19a21bb1c2acf35cece718",
+        "wy" : "449ae3523d72534e964972cfd3b38af0bddd9619e5af223e4d1a40f34cf9f1d"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200042e1f466b024c0c3ace2437de09127fed04b706f94b19a21bb1c2acf35cece7180449ae3523d72534e964972cfd3b38af0bddd9619e5af223e4d1a40f34cf9f1d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELh9GawJMDDrOJDfeCRJ/7QS3BvlLGaIb\nscKs81zs5xgESa41I9clNOlklyz9OzivC93ZYZ5a8iPk0aQPNM+fHQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 278,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020103",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 279,
+          "comment" : "r is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142020103",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04dda95d7b0698de5d2d0b4f0034dbe35b50f978fcc518a84abf9c99efd96a25305adc08d6a63dbe831ab99cd9146e3c4c45492ad19521612542256d6af60e7888",
+        "wx" : "0dda95d7b0698de5d2d0b4f0034dbe35b50f978fcc518a84abf9c99efd96a2530",
+        "wy" : "5adc08d6a63dbe831ab99cd9146e3c4c45492ad19521612542256d6af60e7888"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004dda95d7b0698de5d2d0b4f0034dbe35b50f978fcc518a84abf9c99efd96a25305adc08d6a63dbe831ab99cd9146e3c4c45492ad19521612542256d6af60e7888",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE3aldewaY3l0tC08ANNvjW1D5ePzFGKhK\nv5yZ79lqJTBa3AjWpj2+gxq5nNkUbjxMRUkq0ZUhYSVCJW1q9g54iA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 280,
+          "comment" : "s is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd04917c8",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0402ef4d6d6cfd5a94f1d7784226e3e2a6c0a436c55839619f38fb4472b5f9ee777eb4acd4eebda5cd72875ffd2a2f26229c2dc6b46500919a432c86739f3ae866",
+        "wx" : "2ef4d6d6cfd5a94f1d7784226e3e2a6c0a436c55839619f38fb4472b5f9ee77",
+        "wy" : "7eb4acd4eebda5cd72875ffd2a2f26229c2dc6b46500919a432c86739f3ae866"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000402ef4d6d6cfd5a94f1d7784226e3e2a6c0a436c55839619f38fb4472b5f9ee777eb4acd4eebda5cd72875ffd2a2f26229c2dc6b46500919a432c86739f3ae866",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAu9NbWz9WpTx13hCJuPipsCkNsVYOWGf\nOPtEcrX57nd+tKzU7r2lzXKHX/0qLyYinC3GtGUAkZpDLIZznzroZg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 281,
+          "comment" : "small r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302702020101022100c58b162c58b162c58b162c58b162c58a1b242973853e16db75c8a1a71da4d39d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04464f4ff715729cae5072ca3bd801d3195b67aec65e9b01aad20a2943dcbcb584b1afd29d31a39a11d570aa1597439b3b2d1971bf2f1abf15432d0207b10d1d08",
+        "wx" : "464f4ff715729cae5072ca3bd801d3195b67aec65e9b01aad20a2943dcbcb584",
+        "wy" : "0b1afd29d31a39a11d570aa1597439b3b2d1971bf2f1abf15432d0207b10d1d08"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004464f4ff715729cae5072ca3bd801d3195b67aec65e9b01aad20a2943dcbcb584b1afd29d31a39a11d570aa1597439b3b2d1971bf2f1abf15432d0207b10d1d08",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAERk9P9xVynK5Qcso72AHTGVtnrsZemwGq\n0gopQ9y8tYSxr9KdMaOaEdVwqhWXQ5s7LRlxvy8avxVDLQIHsQ0dCA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 282,
+          "comment" : "smallish r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302c02072d9b4d347952cc022100fcbc5103d0da267477d1791461cf2aa44bf9d43198f79507bd8779d69a13108e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04157f8fddf373eb5f49cfcf10d8b853cf91cbcd7d665c3522ba7dd738ddb79a4cdeadf1a5c448ea3c9f4191a8999abfcc757ac6d64567ef072c47fec613443b8f",
+        "wx" : "157f8fddf373eb5f49cfcf10d8b853cf91cbcd7d665c3522ba7dd738ddb79a4c",
+        "wy" : "0deadf1a5c448ea3c9f4191a8999abfcc757ac6d64567ef072c47fec613443b8f"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004157f8fddf373eb5f49cfcf10d8b853cf91cbcd7d665c3522ba7dd738ddb79a4cdeadf1a5c448ea3c9f4191a8999abfcc757ac6d64567ef072c47fec613443b8f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEFX+P3fNz619Jz88Q2LhTz5HLzX1mXDUi\nun3XON23mkzerfGlxEjqPJ9BkaiZmr/MdXrG1kVn7wcsR/7GE0Q7jw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 283,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "313233343030",
+          "sig" : "3032020d1033e67e37b32b445580bf4efc022100906f906f906f906f906f906f906f906ed8e426f7b1968c35a204236a579723d2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040934a537466c07430e2c48feb990bb19fb78cecc9cee424ea4d130291aa237f0d4f92d23b462804b5b68c52558c01c9996dbf727fccabbeedb9621a400535afa",
+        "wx" : "0934a537466c07430e2c48feb990bb19fb78cecc9cee424ea4d130291aa237f0",
+        "wy" : "0d4f92d23b462804b5b68c52558c01c9996dbf727fccabbeedb9621a400535afa"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200040934a537466c07430e2c48feb990bb19fb78cecc9cee424ea4d130291aa237f0d4f92d23b462804b5b68c52558c01c9996dbf727fccabbeedb9621a400535afa",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAECTSlN0ZsB0MOLEj+uZC7Gft4zsyc7kJO\npNEwKRqiN/DU+S0jtGKAS1toxSVYwByZltv3J/zKu+7bliGkAFNa+g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 284,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "313233343030",
+          "sig" : "3026020201010220783266e90f43dafe5cd9b3b0be86de22f9de83677d0f50713a468ec72fcf5d57",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d6ef20be66c893f741a9bf90d9b74675d1c2a31296397acb3ef174fd0b300c654a0c95478ca00399162d7f0f2dc89efdc2b28a30fbabe285857295a4b0c4e265",
+        "wx" : "0d6ef20be66c893f741a9bf90d9b74675d1c2a31296397acb3ef174fd0b300c65",
+        "wy" : "4a0c95478ca00399162d7f0f2dc89efdc2b28a30fbabe285857295a4b0c4e265"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d6ef20be66c893f741a9bf90d9b74675d1c2a31296397acb3ef174fd0b300c654a0c95478ca00399162d7f0f2dc89efdc2b28a30fbabe285857295a4b0c4e265",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE1u8gvmbIk/dBqb+Q2bdGddHCoxKWOXrL\nPvF0/QswDGVKDJVHjKADmRYtfw8tyJ79wrKKMPur4oWFcpWksMTiZQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 285,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3031020d062522bbd3ecbe7c39e93e7c260220783266e90f43dafe5cd9b3b0be86de22f9de83677d0f50713a468ec72fcf5d57",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b7291d1404e0c0c07dab9372189f4bd58d2ceaa8d15ede544d9514545ba9ee0629c9a63d5e308769cc30ec276a410e6464a27eeafd9e599db10f053a4fe4a829",
+        "wx" : "0b7291d1404e0c0c07dab9372189f4bd58d2ceaa8d15ede544d9514545ba9ee06",
+        "wy" : "29c9a63d5e308769cc30ec276a410e6464a27eeafd9e599db10f053a4fe4a829"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b7291d1404e0c0c07dab9372189f4bd58d2ceaa8d15ede544d9514545ba9ee0629c9a63d5e308769cc30ec276a410e6464a27eeafd9e599db10f053a4fe4a829",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEtykdFATgwMB9q5NyGJ9L1Y0s6qjRXt5U\nTZUUVFup7gYpyaY9XjCHacww7CdqQQ5kZKJ+6v2eWZ2xDwU6T+SoKQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 286,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "313233343030",
+          "sig" : "3045022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03640c1022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bb79f61857f743bfa1b6e7111ce4094377256969e4e15159123d9548acc3be6c1f9d9f8860dcffd3eb36dd6c31ff2e7226c2009c4c94d8d7d2b5686bf7abd677",
+        "wx" : "0bb79f61857f743bfa1b6e7111ce4094377256969e4e15159123d9548acc3be6c",
+        "wy" : "1f9d9f8860dcffd3eb36dd6c31ff2e7226c2009c4c94d8d7d2b5686bf7abd677"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004bb79f61857f743bfa1b6e7111ce4094377256969e4e15159123d9548acc3be6c1f9d9f8860dcffd3eb36dd6c31ff2e7226c2009c4c94d8d7d2b5686bf7abd677",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEu3n2GFf3Q7+htucRHOQJQ3claWnk4VFZ\nEj2VSKzDvmwfnZ+IYNz/0+s23Wwx/y5yJsIAnEyU2NfStWhr96vWdw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 287,
+          "comment" : "s == 1",
+          "msg" : "313233343030",
+          "sig" : "3025022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 288,
+          "comment" : "s == 0",
+          "msg" : "313233343030",
+          "sig" : "3025022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d533b789a4af890fa7a82a1fae58c404f9a62a50b49adafab349c513b415087401b4171b803e76b34a9861e10f7bc289a066fd01bd29f84c987a10a5fb18c2d4",
+        "wx" : "0d533b789a4af890fa7a82a1fae58c404f9a62a50b49adafab349c513b4150874",
+        "wy" : "1b4171b803e76b34a9861e10f7bc289a066fd01bd29f84c987a10a5fb18c2d4"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d533b789a4af890fa7a82a1fae58c404f9a62a50b49adafab349c513b415087401b4171b803e76b34a9861e10f7bc289a066fd01bd29f84c987a10a5fb18c2d4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE1TO3iaSviQ+nqCofrljEBPmmKlC0mtr6\ns0nFE7QVCHQBtBcbgD52s0qYYeEPe8KJoGb9Ab0p+EyYehCl+xjC1A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 289,
+          "comment" : "point at infinity during verify",
+          "msg" : "313233343030",
+          "sig" : "304402207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04feb5163b0ece30ff3e03c7d55c4380fa2fa81ee2c0354942ff6f08c99d0cd82ce87de05ee1bda089d3e4e248fa0f721102acfffdf50e654be281433999df897e",
+        "wx" : "0feb5163b0ece30ff3e03c7d55c4380fa2fa81ee2c0354942ff6f08c99d0cd82c",
+        "wy" : "0e87de05ee1bda089d3e4e248fa0f721102acfffdf50e654be281433999df897e"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004feb5163b0ece30ff3e03c7d55c4380fa2fa81ee2c0354942ff6f08c99d0cd82ce87de05ee1bda089d3e4e248fa0f721102acfffdf50e654be281433999df897e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE/rUWOw7OMP8+A8fVXEOA+i+oHuLANUlC\n/28IyZ0M2CzofeBe4b2gidPk4kj6D3IRAqz//fUOZUvigUM5md+Jfg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 290,
+          "comment" : "u1 == 1",
+          "msg" : "313233343030",
+          "sig" : "3045022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04238ced001cf22b8853e02edc89cbeca5050ba7e042a7a77f9382cd414922897640683d3094643840f295890aa4c18aa39b41d77dd0fb3bb2700e4f9ec284ffc2",
+        "wx" : "238ced001cf22b8853e02edc89cbeca5050ba7e042a7a77f9382cd4149228976",
+        "wy" : "40683d3094643840f295890aa4c18aa39b41d77dd0fb3bb2700e4f9ec284ffc2"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004238ced001cf22b8853e02edc89cbeca5050ba7e042a7a77f9382cd414922897640683d3094643840f295890aa4c18aa39b41d77dd0fb3bb2700e4f9ec284ffc2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEI4ztABzyK4hT4C7cicvspQULp+BCp6d/\nk4LNQUkiiXZAaD0wlGQ4QPKViQqkwYqjm0HXfdD7O7JwDk+ewoT/wg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 291,
+          "comment" : "u1 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022044a5ad0bd0636d9e12bc9e0a6bdd5e1bba77f523842193b3b82e448e05d5f11e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04961cf64817c06c0e51b3c2736c922fde18bd8c4906fcd7f5ef66c4678508f35ed2c5d18168cfbe70f2f123bd7419232bb92dd69113e2941061889481c5a027bf",
+        "wx" : "0961cf64817c06c0e51b3c2736c922fde18bd8c4906fcd7f5ef66c4678508f35e",
+        "wy" : "0d2c5d18168cfbe70f2f123bd7419232bb92dd69113e2941061889481c5a027bf"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004961cf64817c06c0e51b3c2736c922fde18bd8c4906fcd7f5ef66c4678508f35ed2c5d18168cfbe70f2f123bd7419232bb92dd69113e2941061889481c5a027bf",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAElhz2SBfAbA5Rs8JzbJIv3hi9jEkG/Nf1\n72bEZ4UI817SxdGBaM++cPLxI710GSMruS3WkRPilBBhiJSBxaAnvw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 292,
+          "comment" : "u2 == 1",
+          "msg" : "313233343030",
+          "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0413681eae168cd4ea7cf2e2a45d052742d10a9f64e796867dbdcb829fe0b1028816528760d177376c09df79de39557c329cc1753517acffe8fa2ec298026b8384",
+        "wx" : "13681eae168cd4ea7cf2e2a45d052742d10a9f64e796867dbdcb829fe0b10288",
+        "wy" : "16528760d177376c09df79de39557c329cc1753517acffe8fa2ec298026b8384"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000413681eae168cd4ea7cf2e2a45d052742d10a9f64e796867dbdcb829fe0b1028816528760d177376c09df79de39557c329cc1753517acffe8fa2ec298026b8384",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEE2gerhaM1Op88uKkXQUnQtEKn2TnloZ9\nvcuCn+CxAogWUodg0Xc3bAnfed45VXwynMF1NRes/+j6LsKYAmuDhA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 293,
+          "comment" : "u2 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "3045022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b89",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045aa7abfdb6b4086d543325e5d79c6e95ce42f866d2bb84909633a04bb1aa31c291c80088794905e1da33336d874e2f91ccf45cc59185bede5dd6f3f7acaae18b",
+        "wx" : "5aa7abfdb6b4086d543325e5d79c6e95ce42f866d2bb84909633a04bb1aa31c2",
+        "wy" : "091c80088794905e1da33336d874e2f91ccf45cc59185bede5dd6f3f7acaae18b"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200045aa7abfdb6b4086d543325e5d79c6e95ce42f866d2bb84909633a04bb1aa31c291c80088794905e1da33336d874e2f91ccf45cc59185bede5dd6f3f7acaae18b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEWqer/ba0CG1UMyXl15xulc5C+GbSu4SQ\nljOgS7GqMcKRyACIeUkF4dozM22HTi+RzPRcxZGFvt5d1vP3rKrhiw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 294,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100e91e1ba6ba898620a46bcb51dc0b8b4ad1dc35dad892c4552d1847b2ce444637",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400277791b305a45b2b39590b2f05d3392a6c8182cef4eb540120e0f5c206c3e464108233fb0b8c3ac892d79ef8e0fbf92ed133addb4554270132584dc52eef41",
+        "wx" : "277791b305a45b2b39590b2f05d3392a6c8182cef4eb540120e0f5c206c3e4",
+        "wy" : "64108233fb0b8c3ac892d79ef8e0fbf92ed133addb4554270132584dc52eef41"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000400277791b305a45b2b39590b2f05d3392a6c8182cef4eb540120e0f5c206c3e464108233fb0b8c3ac892d79ef8e0fbf92ed133addb4554270132584dc52eef41",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEACd3kbMFpFsrOVkLLwXTOSpsgYLO9OtU\nASDg9cIGw+RkEIIz+wuMOsiS15744Pv5LtEzrdtFVCcBMlhNxS7vQQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 295,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100e36bf0cec06d9b841da81332812f74f30bbaec9f202319206c6f0b8a0a400ff7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046efa092b68de9460f0bcc919005a5f6e80e19de98968be3cd2c770a9949bfb1ac75e6e5087d6550d5f9beb1e79e5029307bc255235e2d5dc99241ac3ab886c49",
+        "wx" : "6efa092b68de9460f0bcc919005a5f6e80e19de98968be3cd2c770a9949bfb1a",
+        "wy" : "0c75e6e5087d6550d5f9beb1e79e5029307bc255235e2d5dc99241ac3ab886c49"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200046efa092b68de9460f0bcc919005a5f6e80e19de98968be3cd2c770a9949bfb1ac75e6e5087d6550d5f9beb1e79e5029307bc255235e2d5dc99241ac3ab886c49",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbvoJK2jelGDwvMkZAFpfboDhnemJaL48\n0sdwqZSb+xrHXm5Qh9ZVDV+b6x555QKTB7wlUjXi1dyZJBrDq4hsSQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 296,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100ea26b57af884b6c06e348efe139c1e4e9ec9518d60c340f6bac7d278ca08d8a6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0472d4a19c4f9d2cf5848ea40445b70d4696b5f02d632c0c654cc7d7eeb0c6d058e8c4cd9943e459174c7ac01fa742198e47e6c19a6bdb0c4f6c237831c1b3f942",
+        "wx" : "72d4a19c4f9d2cf5848ea40445b70d4696b5f02d632c0c654cc7d7eeb0c6d058",
+        "wy" : "0e8c4cd9943e459174c7ac01fa742198e47e6c19a6bdb0c4f6c237831c1b3f942"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000472d4a19c4f9d2cf5848ea40445b70d4696b5f02d632c0c654cc7d7eeb0c6d058e8c4cd9943e459174c7ac01fa742198e47e6c19a6bdb0c4f6c237831c1b3f942",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEctShnE+dLPWEjqQERbcNRpa18C1jLAxl\nTMfX7rDG0FjoxM2ZQ+RZF0x6wB+nQhmOR+bBmmvbDE9sI3gxwbP5Qg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 297,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02205b1d27a7694c146244a5ad0bd0636d9d9ef3b9fb58385418d9c982105077d1b7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042a8ea2f50dcced0c217575bdfa7cd47d1c6f100041ec0e35512794c1be7e740258f8c17122ed303fda7143eb58bede70295b653266013b0b0ebd3f053137f6ec",
+        "wx" : "2a8ea2f50dcced0c217575bdfa7cd47d1c6f100041ec0e35512794c1be7e7402",
+        "wy" : "58f8c17122ed303fda7143eb58bede70295b653266013b0b0ebd3f053137f6ec"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200042a8ea2f50dcced0c217575bdfa7cd47d1c6f100041ec0e35512794c1be7e740258f8c17122ed303fda7143eb58bede70295b653266013b0b0ebd3f053137f6ec",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEKo6i9Q3M7QwhdXW9+nzUfRxvEABB7A41\nUSeUwb5+dAJY+MFxIu0wP9pxQ+tYvt5wKVtlMmYBOwsOvT8FMTf27A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 298,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100d27a7694c146244a5ad0bd0636d9e12abe687897e8e9998ddbd4e59a78520d0f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0488de689ce9af1e94be6a2089c8a8b1253ffdbb6c8e9c86249ba220001a4ad3b80c4998e54842f413b9edb1825acbb6335e81e4d184b2b01c8bebdc85d1f28946",
+        "wx" : "088de689ce9af1e94be6a2089c8a8b1253ffdbb6c8e9c86249ba220001a4ad3b8",
+        "wy" : "0c4998e54842f413b9edb1825acbb6335e81e4d184b2b01c8bebdc85d1f28946"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000488de689ce9af1e94be6a2089c8a8b1253ffdbb6c8e9c86249ba220001a4ad3b80c4998e54842f413b9edb1825acbb6335e81e4d184b2b01c8bebdc85d1f28946",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEiN5onOmvHpS+aiCJyKixJT/9u2yOnIYk\nm6IgABpK07gMSZjlSEL0E7ntsYJay7YzXoHk0YSysByL69yF0fKJRg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 299,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100a4f4ed29828c4894b5a17a0c6db3c256c2221449228a92dff7d76ca8206dd8dd",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fea2d31f70f90d5fb3e00e186ac42ab3c1615cee714e0b4e1131b3d4d8225bf7b037a18df2ac15343f30f74067ddf29e817d5f77f8dce05714da59c094f0cda9",
+        "wx" : "0fea2d31f70f90d5fb3e00e186ac42ab3c1615cee714e0b4e1131b3d4d8225bf7",
+        "wy" : "0b037a18df2ac15343f30f74067ddf29e817d5f77f8dce05714da59c094f0cda9"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004fea2d31f70f90d5fb3e00e186ac42ab3c1615cee714e0b4e1131b3d4d8225bf7b037a18df2ac15343f30f74067ddf29e817d5f77f8dce05714da59c094f0cda9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE/qLTH3D5DV+z4A4YasQqs8FhXO5xTgtO\nETGz1NgiW/ewN6GN8qwVND8w90Bn3fKegX1fd/jc4FcU2lnAlPDNqQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 300,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0220694c146244a5ad0bd0636d9e12bc9e09e60e68b90d0b5e6c5dddd0cb694d8799",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047258911e3d423349166479dbe0b8341af7fbd03d0a7e10edccb36b6ceea5a3db17ac2b8992791128fa3b96dc2fbd4ca3bfa782ef2832fc6656943db18e7346b0",
+        "wx" : "7258911e3d423349166479dbe0b8341af7fbd03d0a7e10edccb36b6ceea5a3db",
+        "wy" : "17ac2b8992791128fa3b96dc2fbd4ca3bfa782ef2832fc6656943db18e7346b0"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200047258911e3d423349166479dbe0b8341af7fbd03d0a7e10edccb36b6ceea5a3db17ac2b8992791128fa3b96dc2fbd4ca3bfa782ef2832fc6656943db18e7346b0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEcliRHj1CM0kWZHnb4Lg0Gvf70D0KfhDt\nzLNrbO6lo9sXrCuJknkRKPo7ltwvvUyjv6eC7ygy/GZWlD2xjnNGsA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 301,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02203d7f487c07bfc5f30846938a3dcef696444707cf9677254a92b06c63ab867d22",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044f28461dea64474d6bb34d1499c97d37b9e95633df1ceeeaacd45016c98b3914c8818810b8cc06ddb40e8a1261c528faa589455d5a6df93b77bc5e0e493c7470",
+        "wx" : "4f28461dea64474d6bb34d1499c97d37b9e95633df1ceeeaacd45016c98b3914",
+        "wy" : "0c8818810b8cc06ddb40e8a1261c528faa589455d5a6df93b77bc5e0e493c7470"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200044f28461dea64474d6bb34d1499c97d37b9e95633df1ceeeaacd45016c98b3914c8818810b8cc06ddb40e8a1261c528faa589455d5a6df93b77bc5e0e493c7470",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAETyhGHepkR01rs00Umcl9N7npVjPfHO7q\nrNRQFsmLORTIgYgQuMwG3bQOihJhxSj6pYlFXVpt+Tt3vF4OSTx0cA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 302,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02206c7648fc0fbf8a06adb8b839f97b4ff7a800f11b1e37c593b261394599792ba4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0474f2a814fb5d8eca91a69b5e60712732b3937de32829be974ed7b68c5c2f5d66eff0f07c56f987a657f42196205f588c0f1d96fd8a63a5f238b48f478788fe3b",
+        "wx" : "74f2a814fb5d8eca91a69b5e60712732b3937de32829be974ed7b68c5c2f5d66",
+        "wy" : "0eff0f07c56f987a657f42196205f588c0f1d96fd8a63a5f238b48f478788fe3b"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000474f2a814fb5d8eca91a69b5e60712732b3937de32829be974ed7b68c5c2f5d66eff0f07c56f987a657f42196205f588c0f1d96fd8a63a5f238b48f478788fe3b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEdPKoFPtdjsqRppteYHEnMrOTfeMoKb6X\nTte2jFwvXWbv8PB8VvmHplf0IZYgX1iMDx2W/YpjpfI4tI9Hh4j+Ow==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 303,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0221009be363a286f23f6322c205449d320baad417953ecb70f6214e90d49d7d1f26a8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04195b51a7cc4a21b8274a70a90de779814c3c8ca358328208c09a29f336b82d6ab2416b7c92fffdc29c3b1282dd2a77a4d04df7f7452047393d849989c5cee9ad",
+        "wx" : "195b51a7cc4a21b8274a70a90de779814c3c8ca358328208c09a29f336b82d6a",
+        "wy" : "0b2416b7c92fffdc29c3b1282dd2a77a4d04df7f7452047393d849989c5cee9ad"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004195b51a7cc4a21b8274a70a90de779814c3c8ca358328208c09a29f336b82d6ab2416b7c92fffdc29c3b1282dd2a77a4d04df7f7452047393d849989c5cee9ad",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEGVtRp8xKIbgnSnCpDed5gUw8jKNYMoII\nwJop8za4LWqyQWt8kv/9wpw7EoLdKnek0E3390UgRzk9hJmJxc7prQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 304,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022029798c5c45bdf58b4a7b2fdc2c46ab4af1218c7eeb9f0f27a88f1267674de3b0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04622fc74732034bec2ddf3bc16d34b3d1f7a327dd2a8c19bab4bb4fe3a24b58aa736b2f2fae76f4dfaecc9096333b01328d51eb3fda9c9227e90d0b449983c4f0",
+        "wx" : "622fc74732034bec2ddf3bc16d34b3d1f7a327dd2a8c19bab4bb4fe3a24b58aa",
+        "wy" : "736b2f2fae76f4dfaecc9096333b01328d51eb3fda9c9227e90d0b449983c4f0"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004622fc74732034bec2ddf3bc16d34b3d1f7a327dd2a8c19bab4bb4fe3a24b58aa736b2f2fae76f4dfaecc9096333b01328d51eb3fda9c9227e90d0b449983c4f0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEYi/HRzIDS+wt3zvBbTSz0fejJ90qjBm6\ntLtP46JLWKpzay8vrnb0367MkJYzOwEyjVHrP9qckifpDQtEmYPE8A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 305,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02200b70f22ca2bb3cefadca1a5711fa3a59f4695385eb5aedf3495d0b6d00f8fd85",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041f7f85caf2d7550e7af9b65023ebb4dce3450311692309db269969b834b611c70827f45b78020ecbbaf484fdd5bfaae6870f1184c21581baf6ef82bd7b530f93",
+        "wx" : "1f7f85caf2d7550e7af9b65023ebb4dce3450311692309db269969b834b611c7",
+        "wy" : "0827f45b78020ecbbaf484fdd5bfaae6870f1184c21581baf6ef82bd7b530f93"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200041f7f85caf2d7550e7af9b65023ebb4dce3450311692309db269969b834b611c70827f45b78020ecbbaf484fdd5bfaae6870f1184c21581baf6ef82bd7b530f93",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEH3+FyvLXVQ56+bZQI+u03ONFAxFpIwnb\nJplpuDS2EccIJ/RbeAIOy7r0hP3Vv6rmhw8RhMIVgbr274K9e1MPkw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 306,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022016e1e459457679df5b9434ae23f474b3e8d2a70bd6b5dbe692ba16da01f1fb0a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0449c197dc80ad1da47a4342b93893e8e1fb0bb94fc33a83e783c00b24c781377aefc20da92bac762951f72474becc734d4cc22ba81b895e282fdac4df7af0f37d",
+        "wx" : "49c197dc80ad1da47a4342b93893e8e1fb0bb94fc33a83e783c00b24c781377a",
+        "wy" : "0efc20da92bac762951f72474becc734d4cc22ba81b895e282fdac4df7af0f37d"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000449c197dc80ad1da47a4342b93893e8e1fb0bb94fc33a83e783c00b24c781377aefc20da92bac762951f72474becc734d4cc22ba81b895e282fdac4df7af0f37d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEScGX3ICtHaR6Q0K5OJPo4fsLuU/DOoPn\ng8ALJMeBN3rvwg2pK6x2KVH3JHS+zHNNTMIrqBuJXigv2sTfevDzfQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 307,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202252d685e831b6cf095e4f0535eeaf0ddd3bfa91c210c9d9dc17224702eaf88f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d8cb68517b616a56400aa3868635e54b6f699598a2f6167757654980baf6acbe7ec8cf449c849aa03461a30efada41453c57c6e6fbc93bbc6fa49ada6dc0555c",
+        "wx" : "0d8cb68517b616a56400aa3868635e54b6f699598a2f6167757654980baf6acbe",
+        "wy" : "7ec8cf449c849aa03461a30efada41453c57c6e6fbc93bbc6fa49ada6dc0555c"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d8cb68517b616a56400aa3868635e54b6f699598a2f6167757654980baf6acbe7ec8cf449c849aa03461a30efada41453c57c6e6fbc93bbc6fa49ada6dc0555c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE2MtoUXthalZACqOGhjXlS29plZii9hZ3\nV2VJgLr2rL5+yM9EnISaoDRhow762kFFPFfG5vvJO7xvpJrabcBVXA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 308,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022075135abd7c425b60371a477f09ce0f274f64a8c6b061a07b5d63e93c65046c53",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04030713fb63f2aa6fe2cadf1b20efc259c77445dafa87dac398b84065ca347df3b227818de1a39b589cb071d83e5317cccdc2338e51e312fe31d8dc34a4801750",
+        "wx" : "30713fb63f2aa6fe2cadf1b20efc259c77445dafa87dac398b84065ca347df3",
+        "wy" : "0b227818de1a39b589cb071d83e5317cccdc2338e51e312fe31d8dc34a4801750"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004030713fb63f2aa6fe2cadf1b20efc259c77445dafa87dac398b84065ca347df3b227818de1a39b589cb071d83e5317cccdc2338e51e312fe31d8dc34a4801750",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAwcT+2Pyqm/iyt8bIO/CWcd0Rdr6h9rD\nmLhAZco0ffOyJ4GN4aObWJywcdg+UxfMzcIzjlHjEv4x2Nw0pIAXUA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 309,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100d55555555555555555555555555555547c74934474db157d2a8c3f088aced62a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04babb3677b0955802d8e929a41355640eaf1ea1353f8a771331c4946e3480afa7252f196c87ed3d2a59d3b1b559137fed0013fecefc19fb5a92682b9bca51b950",
+        "wx" : "0babb3677b0955802d8e929a41355640eaf1ea1353f8a771331c4946e3480afa7",
+        "wy" : "252f196c87ed3d2a59d3b1b559137fed0013fecefc19fb5a92682b9bca51b950"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004babb3677b0955802d8e929a41355640eaf1ea1353f8a771331c4946e3480afa7252f196c87ed3d2a59d3b1b559137fed0013fecefc19fb5a92682b9bca51b950",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEurs2d7CVWALY6SmkE1VkDq8eoTU/incT\nMcSUbjSAr6clLxlsh+09KlnTsbVZE3/tABP+zvwZ+1qSaCubylG5UA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 310,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100c1777c8853938e536213c02464a936000ba1e21c0fc62075d46c624e23b52f31",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041aab2018793471111a8a0e9b143fde02fc95920796d3a63de329b424396fba60bbe4130705174792441b318d3aa31dfe8577821e9b446ec573d272e036c4ebe9",
+        "wx" : "1aab2018793471111a8a0e9b143fde02fc95920796d3a63de329b424396fba60",
+        "wy" : "0bbe4130705174792441b318d3aa31dfe8577821e9b446ec573d272e036c4ebe9"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200041aab2018793471111a8a0e9b143fde02fc95920796d3a63de329b424396fba60bbe4130705174792441b318d3aa31dfe8577821e9b446ec573d272e036c4ebe9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEGqsgGHk0cREaig6bFD/eAvyVkgeW06Y9\n4ym0JDlvumC75BMHBRdHkkQbMY06ox3+hXeCHptEbsVz0nLgNsTr6Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 311,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022030bbb794db588363b40679f6c182a50d3ce9679acdd3ffbe36d7813dacbdc818",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048cb0b909499c83ea806cd885b1dd467a0119f06a88a0276eb0cfda274535a8ff47b5428833bc3f2c8bf9d9041158cf33718a69961cd01729bc0011d1e586ab75",
+        "wx" : "08cb0b909499c83ea806cd885b1dd467a0119f06a88a0276eb0cfda274535a8ff",
+        "wy" : "47b5428833bc3f2c8bf9d9041158cf33718a69961cd01729bc0011d1e586ab75"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200048cb0b909499c83ea806cd885b1dd467a0119f06a88a0276eb0cfda274535a8ff47b5428833bc3f2c8bf9d9041158cf33718a69961cd01729bc0011d1e586ab75",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEjLC5CUmcg+qAbNiFsd1GegEZ8GqIoCdu\nsM/aJ0U1qP9HtUKIM7w/LIv52QQRWM8zcYpplhzQFym8ABHR5YardQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 312,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202c37fd995622c4fb7fffffffffffffffc7cee745110cb45ab558ed7c90c15a2f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048f03cf1a42272bb1532723093f72e6feeac85e1700e9fbe9a6a2dd642d74bf5d3b89a7189dad8cf75fc22f6f158aa27f9c2ca00daca785be3358f2bda3862ca0",
+        "wx" : "08f03cf1a42272bb1532723093f72e6feeac85e1700e9fbe9a6a2dd642d74bf5d",
+        "wy" : "3b89a7189dad8cf75fc22f6f158aa27f9c2ca00daca785be3358f2bda3862ca0"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200048f03cf1a42272bb1532723093f72e6feeac85e1700e9fbe9a6a2dd642d74bf5d3b89a7189dad8cf75fc22f6f158aa27f9c2ca00daca785be3358f2bda3862ca0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEjwPPGkInK7FTJyMJP3Lm/urIXhcA6fvp\npqLdZC10v107iacYna2M91/CL28ViqJ/nCygDaynhb4zWPK9o4YsoA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 313,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02207fd995622c4fb7ffffffffffffffffff5d883ffab5b32652ccdcaa290fccb97d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0444de3b9c7a57a8c9e820952753421e7d987bb3d79f71f013805c897e018f8acea2460758c8f98d3fdce121a943659e372c326fff2e5fc2ae7fa3f79daae13c12",
+        "wx" : "44de3b9c7a57a8c9e820952753421e7d987bb3d79f71f013805c897e018f8ace",
+        "wy" : "0a2460758c8f98d3fdce121a943659e372c326fff2e5fc2ae7fa3f79daae13c12"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000444de3b9c7a57a8c9e820952753421e7d987bb3d79f71f013805c897e018f8acea2460758c8f98d3fdce121a943659e372c326fff2e5fc2ae7fa3f79daae13c12",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAERN47nHpXqMnoIJUnU0IefZh7s9efcfAT\ngFyJfgGPis6iRgdYyPmNP9zhIalDZZ43LDJv/y5fwq5/o/edquE8Eg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 314,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100ffb32ac4589f6ffffffffffffffffffebb107ff56b664ca599b954521f9972fa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046fb8b2b48e33031268ad6a517484dc8839ea90f6669ea0c7ac3233e2ac31394a0ac8bbe7f73c2ff4df9978727ac1dfc2fd58647d20f31f99105316b64671f204",
+        "wx" : "6fb8b2b48e33031268ad6a517484dc8839ea90f6669ea0c7ac3233e2ac31394a",
+        "wy" : "0ac8bbe7f73c2ff4df9978727ac1dfc2fd58647d20f31f99105316b64671f204"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200046fb8b2b48e33031268ad6a517484dc8839ea90f6669ea0c7ac3233e2ac31394a0ac8bbe7f73c2ff4df9978727ac1dfc2fd58647d20f31f99105316b64671f204",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEb7iytI4zAxJorWpRdITciDnqkPZmnqDH\nrDIz4qwxOUoKyLvn9zwv9N+ZeHJ6wd/C/VhkfSDzH5kQUxa2RnHyBA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 315,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02205622c4fb7fffffffffffffffffffffff928a8f1c7ac7bec1808b9f61c01ec327",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bea71122a048693e905ff602b3cf9dd18af69b9fc9d8431d2b1dd26b942c95e6f43c7b8b95eb62082c12db9dbda7fe38e45cbe4a4886907fb81bdb0c5ea9246c",
+        "wx" : "0bea71122a048693e905ff602b3cf9dd18af69b9fc9d8431d2b1dd26b942c95e6",
+        "wy" : "0f43c7b8b95eb62082c12db9dbda7fe38e45cbe4a4886907fb81bdb0c5ea9246c"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004bea71122a048693e905ff602b3cf9dd18af69b9fc9d8431d2b1dd26b942c95e6f43c7b8b95eb62082c12db9dbda7fe38e45cbe4a4886907fb81bdb0c5ea9246c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEvqcRIqBIaT6QX/YCs8+d0Yr2m5/J2EMd\nKx3Sa5Qsleb0PHuLletiCCwS2529p/445Fy+SkiGkH+4G9sMXqkkbA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 316,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022044104104104104104104104104104103b87853fd3b7d3f8e175125b4382f25ed",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04da918c731ba06a20cb94ef33b778e981a404a305f1941fe33666b45b03353156e2bb2694f575b45183be78e5c9b5210bf3bf488fd4c8294516d89572ca4f5391",
+        "wx" : "0da918c731ba06a20cb94ef33b778e981a404a305f1941fe33666b45b03353156",
+        "wy" : "0e2bb2694f575b45183be78e5c9b5210bf3bf488fd4c8294516d89572ca4f5391"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004da918c731ba06a20cb94ef33b778e981a404a305f1941fe33666b45b03353156e2bb2694f575b45183be78e5c9b5210bf3bf488fd4c8294516d89572ca4f5391",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE2pGMcxugaiDLlO8zt3jpgaQEowXxlB/j\nNma0WwM1MVbiuyaU9XW0UYO+eOXJtSEL879Ij9TIKUUW2JVyyk9TkQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 317,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202739ce739ce739ce739ce739ce739ce705560298d1f2f08dc419ac273a5b54d9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043007e92c3937dade7964dfa35b0eff031f7eb02aed0a0314411106cdeb70fe3d5a7546fc0552997b20e3d6f413e75e2cb66e116322697114b79bac734bfc4dc5",
+        "wx" : "3007e92c3937dade7964dfa35b0eff031f7eb02aed0a0314411106cdeb70fe3d",
+        "wy" : "5a7546fc0552997b20e3d6f413e75e2cb66e116322697114b79bac734bfc4dc5"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200043007e92c3937dade7964dfa35b0eff031f7eb02aed0a0314411106cdeb70fe3d5a7546fc0552997b20e3d6f413e75e2cb66e116322697114b79bac734bfc4dc5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEMAfpLDk32t55ZN+jWw7/Ax9+sCrtCgMU\nQREGzetw/j1adUb8BVKZeyDj1vQT514stm4RYyJpcRS3m6xzS/xNxQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 318,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100b777777777777777777777777777777688e6a1fe808a97a348671222ff16b863",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0460e734ef5624d3cbf0ddd375011bd663d6d6aebc644eb599fdf98dbdcd18ce9bd2d90b3ac31f139af832cccf6ccbbb2c6ea11fa97370dc9906da474d7d8a7567",
+        "wx" : "60e734ef5624d3cbf0ddd375011bd663d6d6aebc644eb599fdf98dbdcd18ce9b",
+        "wy" : "0d2d90b3ac31f139af832cccf6ccbbb2c6ea11fa97370dc9906da474d7d8a7567"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000460e734ef5624d3cbf0ddd375011bd663d6d6aebc644eb599fdf98dbdcd18ce9bd2d90b3ac31f139af832cccf6ccbbb2c6ea11fa97370dc9906da474d7d8a7567",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEYOc071Yk08vw3dN1ARvWY9bWrrxkTrWZ\n/fmNvc0YzpvS2Qs6wx8TmvgyzM9sy7ssbqEfqXNw3JkG2kdNfYp1Zw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 319,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02206492492492492492492492492492492406dd3a19b8d5fb875235963c593bd2d3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0485a900e97858f693c0b7dfa261e380dad6ea046d1f65ddeeedd5f7d8af0ba33769744d15add4f6c0bc3b0da2aec93b34cb8c65f9340ddf74e7b0009eeeccce3c",
+        "wx" : "085a900e97858f693c0b7dfa261e380dad6ea046d1f65ddeeedd5f7d8af0ba337",
+        "wy" : "69744d15add4f6c0bc3b0da2aec93b34cb8c65f9340ddf74e7b0009eeeccce3c"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000485a900e97858f693c0b7dfa261e380dad6ea046d1f65ddeeedd5f7d8af0ba33769744d15add4f6c0bc3b0da2aec93b34cb8c65f9340ddf74e7b0009eeeccce3c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEhakA6XhY9pPAt9+iYeOA2tbqBG0fZd3u\n7dX32K8LozdpdE0VrdT2wLw7DaKuyTs0y4xl+TQN33TnsACe7szOPA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 320,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100955555555555555555555555555555547c74934474db157d2a8c3f088aced62c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0438066f75d88efc4c93de36f49e037b234cc18b1de5608750a62cab0345401046a3e84bed8cfcb819ef4d550444f2ce4b651766b69e2e2901f88836ff90034fed",
+        "wx" : "38066f75d88efc4c93de36f49e037b234cc18b1de5608750a62cab0345401046",
+        "wy" : "0a3e84bed8cfcb819ef4d550444f2ce4b651766b69e2e2901f88836ff90034fed"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000438066f75d88efc4c93de36f49e037b234cc18b1de5608750a62cab0345401046a3e84bed8cfcb819ef4d550444f2ce4b651766b69e2e2901f88836ff90034fed",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEOAZvddiO/EyT3jb0ngN7I0zBix3lYIdQ\npiyrA0VAEEaj6EvtjPy4Ge9NVQRE8s5LZRdmtp4uKQH4iDb/kANP7Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 321,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3e3a49a23a6d8abe95461f8445676b17",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0498f68177dc95c1b4cbfa5245488ca523a7d5629470d035d621a443c72f39aabfa33d29546fa1c648f2c7d5ccf70cf1ce4ab79b5db1ac059dbecd068dbdff1b89",
+        "wx" : "098f68177dc95c1b4cbfa5245488ca523a7d5629470d035d621a443c72f39aabf",
+        "wy" : "0a33d29546fa1c648f2c7d5ccf70cf1ce4ab79b5db1ac059dbecd068dbdff1b89"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000498f68177dc95c1b4cbfa5245488ca523a7d5629470d035d621a443c72f39aabfa33d29546fa1c648f2c7d5ccf70cf1ce4ab79b5db1ac059dbecd068dbdff1b89",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEmPaBd9yVwbTL+lJFSIylI6fVYpRw0DXW\nIaRDxy85qr+jPSlUb6HGSPLH1cz3DPHOSrebXbGsBZ2+zQaNvf8biQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 322,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100bffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364143",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045c2bbfa23c9b9ad07f038aa89b4930bf267d9401e4255de9e8da0a5078ec8277e3e882a31d5e6a379e0793983ccded39b95c4353ab2ff01ea5369ba47b0c3191",
+        "wx" : "5c2bbfa23c9b9ad07f038aa89b4930bf267d9401e4255de9e8da0a5078ec8277",
+        "wy" : "0e3e882a31d5e6a379e0793983ccded39b95c4353ab2ff01ea5369ba47b0c3191"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200045c2bbfa23c9b9ad07f038aa89b4930bf267d9401e4255de9e8da0a5078ec8277e3e882a31d5e6a379e0793983ccded39b95c4353ab2ff01ea5369ba47b0c3191",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEXCu/ojybmtB/A4qom0kwvyZ9lAHkJV3p\n6NoKUHjsgnfj6IKjHV5qN54Hk5g8ze05uVxDU6sv8B6lNpukewwxkQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 323,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0220185ddbca6dac41b1da033cfb60c152869e74b3cd66e9ffdf1b6bc09ed65ee40c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042ea7133432339c69d27f9b267281bd2ddd5f19d6338d400a05cd3647b157a3853547808298448edb5e701ade84cd5fb1ac9567ba5e8fb68a6b933ec4b5cc84cc",
+        "wx" : "2ea7133432339c69d27f9b267281bd2ddd5f19d6338d400a05cd3647b157a385",
+        "wy" : "3547808298448edb5e701ade84cd5fb1ac9567ba5e8fb68a6b933ec4b5cc84cc"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200042ea7133432339c69d27f9b267281bd2ddd5f19d6338d400a05cd3647b157a3853547808298448edb5e701ade84cd5fb1ac9567ba5e8fb68a6b933ec4b5cc84cc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELqcTNDIznGnSf5smcoG9Ld1fGdYzjUAK\nBc02R7FXo4U1R4CCmESO215wGt6EzV+xrJVnul6Ptoprkz7EtcyEzA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 324,
+          "comment" : "point duplication during verification",
+          "msg" : "313233343030",
+          "sig" : "3045022032b0d10d8d0e04bc8d4d064d270699e87cffc9b49c5c20730e1c26f6105ddcda022100d612c2984c2afa416aa7f2882a486d4a8426cb6cfc91ed5b737278f9fca8be68",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042ea7133432339c69d27f9b267281bd2ddd5f19d6338d400a05cd3647b157a385cab87f7d67bb7124a18fe5217b32a04e536a9845a1704975946cc13a4a337763",
+        "wx" : "2ea7133432339c69d27f9b267281bd2ddd5f19d6338d400a05cd3647b157a385",
+        "wy" : "0cab87f7d67bb7124a18fe5217b32a04e536a9845a1704975946cc13a4a337763"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200042ea7133432339c69d27f9b267281bd2ddd5f19d6338d400a05cd3647b157a385cab87f7d67bb7124a18fe5217b32a04e536a9845a1704975946cc13a4a337763",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELqcTNDIznGnSf5smcoG9Ld1fGdYzjUAK\nBc02R7FXo4XKuH99Z7txJKGP5SF7MqBOU2qYRaFwSXWUbME6SjN3Yw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 325,
+          "comment" : "duplication bug",
+          "msg" : "313233343030",
+          "sig" : "3045022032b0d10d8d0e04bc8d4d064d270699e87cffc9b49c5c20730e1c26f6105ddcda022100d612c2984c2afa416aa7f2882a486d4a8426cb6cfc91ed5b737278f9fca8be68",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048aa2c64fa9c6437563abfbcbd00b2048d48c18c152a2a6f49036de7647ebe82e1ce64387995c68a060fa3bc0399b05cc06eec7d598f75041a4917e692b7f51ff",
+        "wx" : "08aa2c64fa9c6437563abfbcbd00b2048d48c18c152a2a6f49036de7647ebe82e",
+        "wy" : "1ce64387995c68a060fa3bc0399b05cc06eec7d598f75041a4917e692b7f51ff"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200048aa2c64fa9c6437563abfbcbd00b2048d48c18c152a2a6f49036de7647ebe82e1ce64387995c68a060fa3bc0399b05cc06eec7d598f75041a4917e692b7f51ff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEiqLGT6nGQ3Vjq/vL0AsgSNSMGMFSoqb0\nkDbedkfr6C4c5kOHmVxooGD6O8A5mwXMBu7H1Zj3UEGkkX5pK39R/w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 326,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "313233343030",
+          "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0022033333333333333333333333333333332f222f8faefdb533f265d461c29a47373",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04391427ff7ee78013c14aec7d96a8a062209298a783835e94fd6549d502fff71fdd6624ec343ad9fcf4d9872181e59f842f9ba4cccae09a6c0972fb6ac6b4c6bd",
+        "wx" : "391427ff7ee78013c14aec7d96a8a062209298a783835e94fd6549d502fff71f",
+        "wy" : "0dd6624ec343ad9fcf4d9872181e59f842f9ba4cccae09a6c0972fb6ac6b4c6bd"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004391427ff7ee78013c14aec7d96a8a062209298a783835e94fd6549d502fff71fdd6624ec343ad9fcf4d9872181e59f842f9ba4cccae09a6c0972fb6ac6b4c6bd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEORQn/37ngBPBSux9lqigYiCSmKeDg16U\n/WVJ1QL/9x/dZiTsNDrZ/PTZhyGB5Z+EL5ukzMrgmmwJcvtqxrTGvQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 327,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e762b8a219b4f180219cc7a9059245e4961bd191c03899789c7a34b89e8c138ec1533ef0419bb7376e0bfde9319d10a06968791d9ea0eed9c1ce6345aed9759e",
+        "wx" : "0e762b8a219b4f180219cc7a9059245e4961bd191c03899789c7a34b89e8c138e",
+        "wy" : "0c1533ef0419bb7376e0bfde9319d10a06968791d9ea0eed9c1ce6345aed9759e"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004e762b8a219b4f180219cc7a9059245e4961bd191c03899789c7a34b89e8c138ec1533ef0419bb7376e0bfde9319d10a06968791d9ea0eed9c1ce6345aed9759e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE52K4ohm08YAhnMepBZJF5JYb0ZHAOJl4\nnHo0uJ6ME47BUz7wQZu3N24L/ekxnRCgaWh5HZ6g7tnBzmNFrtl1ng==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 328,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3046022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022100b6db6db6db6db6db6db6db6db6db6db5f30f30127d33e02aad96438927022e9c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049aedb0d281db164e130000c5697fae0f305ef848be6fffb43ac593fbb950e952fa6f633359bdcd82b56b0b9f965b037789d46b9a8141b791b2aefa713f96c175",
+        "wx" : "09aedb0d281db164e130000c5697fae0f305ef848be6fffb43ac593fbb950e952",
+        "wy" : "0fa6f633359bdcd82b56b0b9f965b037789d46b9a8141b791b2aefa713f96c175"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200049aedb0d281db164e130000c5697fae0f305ef848be6fffb43ac593fbb950e952fa6f633359bdcd82b56b0b9f965b037789d46b9a8141b791b2aefa713f96c175",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEmu2w0oHbFk4TAADFaX+uDzBe+Ei+b/+0\nOsWT+7lQ6VL6b2MzWb3NgrVrC5+WWwN3idRrmoFBt5GyrvpxP5bBdQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 329,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3046022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee502210099999999999999999999999999999998d668eaf0cf91f9bd7317d2547ced5a5a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048ad445db62816260e4e687fd1884e48b9fc0636d031547d63315e792e19bfaee1de64f99d5f1cd8b6ec9cb0f787a654ae86993ba3db1008ef43cff0684cb22bd",
+        "wx" : "08ad445db62816260e4e687fd1884e48b9fc0636d031547d63315e792e19bfaee",
+        "wy" : "1de64f99d5f1cd8b6ec9cb0f787a654ae86993ba3db1008ef43cff0684cb22bd"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200048ad445db62816260e4e687fd1884e48b9fc0636d031547d63315e792e19bfaee1de64f99d5f1cd8b6ec9cb0f787a654ae86993ba3db1008ef43cff0684cb22bd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEitRF22KBYmDk5of9GITki5/AY20DFUfW\nMxXnkuGb+u4d5k+Z1fHNi27Jyw94emVK6GmTuj2xAI70PP8GhMsivQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 330,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022066666666666666666666666666666665e445f1f5dfb6a67e4cba8c385348e6e7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041f5799c95be89063b24f26e40cb928c1a868a76fb0094607e8043db409c91c32e75724e813a4191e3a839007f08e2e897388b06d4a00de6de60e536d91fab566",
+        "wx" : "1f5799c95be89063b24f26e40cb928c1a868a76fb0094607e8043db409c91c32",
+        "wy" : "0e75724e813a4191e3a839007f08e2e897388b06d4a00de6de60e536d91fab566"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200041f5799c95be89063b24f26e40cb928c1a868a76fb0094607e8043db409c91c32e75724e813a4191e3a839007f08e2e897388b06d4a00de6de60e536d91fab566",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEH1eZyVvokGOyTybkDLkowahop2+wCUYH\n6AQ9tAnJHDLnVyToE6QZHjqDkAfwji6Jc4iwbUoA3m3mDlNtkfq1Zg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 331,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022049249249249249249249249249249248c79facd43214c011123c1b03a93412a5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a3331a4e1b4223ec2c027edd482c928a14ed358d93f1d4217d39abf69fcb5ccc28d684d2aaabcd6383775caa6239de26d4c6937bb603ecb4196082f4cffd509d",
+        "wx" : "0a3331a4e1b4223ec2c027edd482c928a14ed358d93f1d4217d39abf69fcb5ccc",
+        "wy" : "28d684d2aaabcd6383775caa6239de26d4c6937bb603ecb4196082f4cffd509d"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004a3331a4e1b4223ec2c027edd482c928a14ed358d93f1d4217d39abf69fcb5ccc28d684d2aaabcd6383775caa6239de26d4c6937bb603ecb4196082f4cffd509d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEozMaThtCI+wsAn7dSCySihTtNY2T8dQh\nfTmr9p/LXMwo1oTSqqvNY4N3XKpiOd4m1MaTe7YD7LQZYIL0z/1QnQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 332,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee502200eb10e5ab95f2f275348d82ad2e4d7949c8193800d8c9c75df58e343f0ebba7b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043f3952199774c7cf39b38b66cb1042a6260d8680803845e4d433adba3bb248185ea495b68cbc7ed4173ee63c9042dc502625c7eb7e21fb02ca9a9114e0a3a18d",
+        "wx" : "3f3952199774c7cf39b38b66cb1042a6260d8680803845e4d433adba3bb24818",
+        "wy" : "5ea495b68cbc7ed4173ee63c9042dc502625c7eb7e21fb02ca9a9114e0a3a18d"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200043f3952199774c7cf39b38b66cb1042a6260d8680803845e4d433adba3bb248185ea495b68cbc7ed4173ee63c9042dc502625c7eb7e21fb02ca9a9114e0a3a18d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEPzlSGZd0x885s4tmyxBCpiYNhoCAOEXk\n1DOtujuySBhepJW2jLx+1Bc+5jyQQtxQJiXH634h+wLKmpEU4KOhjQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 333,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cdfb8c0f422e144e137c2412c86c171f5fe3fa3f5bbb544e9076288f3ced786e054fd0721b77c11c79beacb3c94211b0a19bda08652efeaf92513a3b0a163698",
+        "wx" : "0cdfb8c0f422e144e137c2412c86c171f5fe3fa3f5bbb544e9076288f3ced786e",
+        "wy" : "54fd0721b77c11c79beacb3c94211b0a19bda08652efeaf92513a3b0a163698"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004cdfb8c0f422e144e137c2412c86c171f5fe3fa3f5bbb544e9076288f3ced786e054fd0721b77c11c79beacb3c94211b0a19bda08652efeaf92513a3b0a163698",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEzfuMD0IuFE4TfCQSyGwXH1/j+j9bu1RO\nkHYojzzteG4FT9ByG3fBHHm+rLPJQhGwoZvaCGUu/q+SUTo7ChY2mA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 334,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3045022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022100b6db6db6db6db6db6db6db6db6db6db5f30f30127d33e02aad96438927022e9c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0473598a6a1c68278fa6bfd0ce4064e68235bc1c0f6b20a928108be336730f87e3cbae612519b5032ecc85aed811271a95fe7939d5d3460140ba318f4d14aba31d",
+        "wx" : "73598a6a1c68278fa6bfd0ce4064e68235bc1c0f6b20a928108be336730f87e3",
+        "wy" : "0cbae612519b5032ecc85aed811271a95fe7939d5d3460140ba318f4d14aba31d"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000473598a6a1c68278fa6bfd0ce4064e68235bc1c0f6b20a928108be336730f87e3cbae612519b5032ecc85aed811271a95fe7939d5d3460140ba318f4d14aba31d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEc1mKahxoJ4+mv9DOQGTmgjW8HA9rIKko\nEIvjNnMPh+PLrmElGbUDLsyFrtgRJxqV/nk51dNGAUC6MY9NFKujHQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 335,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3045022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802210099999999999999999999999999999998d668eaf0cf91f9bd7317d2547ced5a5a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0458debd9a7ee2c9d59132478a5440ae4d5d7ed437308369f92ea86c82183f10a16773e76f5edbf4da0e4f1bdffac0f57257e1dfa465842931309a24245fda6a5d",
+        "wx" : "58debd9a7ee2c9d59132478a5440ae4d5d7ed437308369f92ea86c82183f10a1",
+        "wy" : "6773e76f5edbf4da0e4f1bdffac0f57257e1dfa465842931309a24245fda6a5d"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000458debd9a7ee2c9d59132478a5440ae4d5d7ed437308369f92ea86c82183f10a16773e76f5edbf4da0e4f1bdffac0f57257e1dfa465842931309a24245fda6a5d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEWN69mn7iydWRMkeKVECuTV1+1Dcwg2n5\nLqhsghg/EKFnc+dvXtv02g5PG9/6wPVyV+HfpGWEKTEwmiQkX9pqXQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 336,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022066666666666666666666666666666665e445f1f5dfb6a67e4cba8c385348e6e7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048b904de47967340c5f8c3572a720924ef7578637feab1949acb241a5a6ac3f5b950904496f9824b1d63f3313bae21b89fae89afdfc811b5ece03fd5aa301864f",
+        "wx" : "08b904de47967340c5f8c3572a720924ef7578637feab1949acb241a5a6ac3f5b",
+        "wy" : "0950904496f9824b1d63f3313bae21b89fae89afdfc811b5ece03fd5aa301864f"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200048b904de47967340c5f8c3572a720924ef7578637feab1949acb241a5a6ac3f5b950904496f9824b1d63f3313bae21b89fae89afdfc811b5ece03fd5aa301864f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEi5BN5HlnNAxfjDVypyCSTvdXhjf+qxlJ\nrLJBpaasP1uVCQRJb5gksdY/MxO64huJ+uia/fyBG17OA/1aowGGTw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 337,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022049249249249249249249249249249248c79facd43214c011123c1b03a93412a5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f4892b6d525c771e035f2a252708f3784e48238604b4f94dc56eaa1e546d941a346b1aa0bce68b1c50e5b52f509fb5522e5c25e028bc8f863402edb7bcad8b1b",
+        "wx" : "0f4892b6d525c771e035f2a252708f3784e48238604b4f94dc56eaa1e546d941a",
+        "wy" : "346b1aa0bce68b1c50e5b52f509fb5522e5c25e028bc8f863402edb7bcad8b1b"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004f4892b6d525c771e035f2a252708f3784e48238604b4f94dc56eaa1e546d941a346b1aa0bce68b1c50e5b52f509fb5522e5c25e028bc8f863402edb7bcad8b1b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE9IkrbVJcdx4DXyolJwjzeE5II4YEtPlN\nxW6qHlRtlBo0axqgvOaLHFDltS9Qn7VSLlwl4Ci8j4Y0Au23vK2LGw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 338,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802200eb10e5ab95f2f275348d82ad2e4d7949c8193800d8c9c75df58e343f0ebba7b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
+        "wx" : "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
+        "wy" : "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeb5mfvncu6xVoGKVzocLBwKb/NstzijZ\nWfKBWxb4F5hIOtp3JqPEZV2k+/wOEQio/Re0SKaFVBmcR9CP+xDUuA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 339,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca60502302202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 340,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3044022044a5ad0bd0636d9e12bc9e0a6bdd5e1bba77f523842193b3b82e448e05d5f11e02202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777",
+        "wx" : "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
+        "wy" : "0b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeb5mfvncu6xVoGKVzocLBwKb/NstzijZ\nWfKBWxb4F5i3xSWI2Vw7mqJbBAPx7vdXAuhLt1l6q+ZjuC9vBO8ndw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 341,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca60502302202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 342,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3044022044a5ad0bd0636d9e12bc9e0a6bdd5e1bba77f523842193b3b82e448e05d5f11e02202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152",
+        "wx" : "782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963",
+        "wy" : "0af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeCyO0X47Kng7VGTzOwllKnHGeOBexR6E\n4rz8Zjo96WOvmstCgLjH98QvTvmrpiRewewXEv04oPqWQY2M1qphUg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 343,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "3046022100f80ae4f96cdbc9d853f83d47aae225bf407d51c56b7776cd67d0dc195d99a9dc022100b303e26be1f73465315221f0b331528807a1a9b6eb068ede6eebeaaa49af8a36",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 344,
+          "comment" : "pseudorandom signature",
+          "msg" : "4d7367",
+          "sig" : "30450220109cd8ae0374358984a8249c0a843628f2835ffad1df1a9a69aa2fe72355545c022100ac6f00daf53bd8b1e34da329359b6e08019c5b037fed79ee383ae39f85a159c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 345,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "3045022100d035ee1f17fdb0b2681b163e33c359932659990af77dca632012b30b27a057b302201939d9f3b2858bc13e3474cb50e6a82be44faa71940f876c1cba4c3e989202b6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 346,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "304402204f053f563ad34b74fd8c9934ce59e79c2eb8e6eca0fef5b323ca67d5ac7ed23802204d4b05daa0719e773d8617dce5631c5fd6f59c9bdc748e4b55c970040af01be5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff00000001060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1",
+        "wx" : "6e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff",
+        "wy" : "1060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff00000001060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEboI1VUUpFAmRgsaywdbwtdKNUMzQBa8s\n4bulQapAyv8AAAABBgSS1aVnPg8l2NUPt+WMSdhtRtQhaVXgqj1A4Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 347,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304402206d6a4f556ccce154e7fb9f19e76c3deca13d59cc2aeb4ecad968aab2ded45965022053b9fa74803ede0fc4441bf683d56c564d3e274e09ccf47390badd1471c05fb7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 348,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100aad503de9b9fd66b948e9acf596f0a0e65e700b28b26ec56e6e45e846489b3c4022100fff223c5d0765447e8447a3f9d31fd0696e89d244422022ff61a110b2a8c2f04",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 349,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "30460221009182cebd3bb8ab572e167174397209ef4b1d439af3b200cdf003620089e43225022100abb88367d15fe62d1efffb6803da03109ee22e90bc9c78e8b4ed23630b82ea9d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40cafffffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e",
+        "wx" : "6e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff",
+        "wy" : "0fffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40cafffffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEboI1VUUpFAmRgsaywdbwtdKNUMzQBa8s\n4bulQapAyv/////++fttKlqYwfDaJyrwSBpztieSuSvelqoeVcK7Tg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 350,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "304502203854a3998aebdf2dbc28adac4181462ccac7873907ab7f212c42db0e69b56ed8022100c12c09475c772fd0c1b2060d5163e42bf71d727e4ae7c03eeba954bf50b43bb3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 351,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100e94dbdc38795fe5c904d8f16d969d3b587f0a25d2de90b6d8c5c53ff887e3607022100856b8c963e9b68dade44750bf97ec4d11b1a0a3804f4cb79aa27bdea78ac14e4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 352,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3044022049fc102a08ca47b60e0858cd0284d22cddd7233f94aaffbb2db1dd2cf08425e102205b16fca5a12cdb39701697ad8e39ffd6bdec0024298afaa2326aea09200b14d6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04000000013fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d",
+        "wx" : "13fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0",
+        "wy" : "0f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004000000013fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAAAAAT/SIkjWTZX3PCm0irSGMYUL5QP9\nAPhGi18PcOD27nqkO8LG/SWx2CaSQcvdnbsNrJbcliMfQwcF+DhxfQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 353,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3045022041efa7d3f05a0010675fcb918a45c693da4b348df21a59d6f9cd73e0d831d67a022100bbab52596c1a1d9484296cdc92cbf07e665259a13791a8fe8845e2c07cf3fc67",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 354,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100b615698c358b35920dd883eca625a6c5f7563970cdfc378f8fe0cee17092144c022100da0b84cd94a41e049ef477aeac157b2a9bfa6b7ac8de06ed3858c5eede6ddd6d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 355,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304602210087cf8c0eb82d44f69c60a2ff5457d3aaa322e7ec61ae5aecfd678ae1c1932b0e022100c522c4eea7eafb82914cbf5c1ff76760109f55ddddcf58274d41c9bc4311e06e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0425afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dfffffffffa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35",
+        "wx" : "25afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dffffffff",
+        "wy" : "0fa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000425afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dfffffffffa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEJa/WiayrrtZ8Hylt5ZQG+MVQ9XFGoLTs\nLJeHbf/////6RqduUgMi37xJHsTwzBl0IPxOpYg9j23VPDVLxPZ8NQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 356,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3045022062f48ef71ace27bf5a01834de1f7e3f948b9dce1ca1e911d5e13d3b104471d82022100a1570cc0f388768d3ba7df7f212564caa256ff825df997f21f72f5280d53011f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 357,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100f6b0e2f6fe020cf7c0c20137434344ed7add6c4be51861e2d14cbda472a6ffb40221009be93722c1a3ad7d4cf91723700cb5486de5479d8c1b38ae4e8e5ba1638e9732",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 358,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100db09d8460f05eff23bc7e436b67da563fa4b4edb58ac24ce201fa8a358125057022046da116754602940c8999c8d665f786c50f5772c0a3cdbda075e77eabc64df16",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb93f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff",
+        "wx" : "0d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb9",
+        "wy" : "3f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb93f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE0S5sZrZ3NMPITSYBz1013Al+J2N/CspK\nT9t0tqrdO7k/W9/4i9VzbfiY5pkAbtdQ8RzwfFhmzXrXDHEh/////w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 359,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "30450220592c41e16517f12fcabd98267674f974b588e9f35d35406c1a7bb2ed1d19b7b8022100c19a5f942607c3551484ff0dc97281f0cdc82bc48e2205a0645c0cf3d7f59da0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 360,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100be0d70887d5e40821a61b68047de4ea03debfdf51cdf4d4b195558b959a032b20221008266b4d270e24414ecacb14c091a233134b918d37320c6557d60ad0a63544ac4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 361,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100fae92dfcb2ee392d270af3a5739faa26d4f97bfd39ed3cbee4d29e26af3b206a02210093645c80605595e02c09a0dc4b17ac2a51846a728b3e8d60442ed6449fd3342b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb",
+        "wx" : "6d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000",
+        "wy" : "0e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200046d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbUp/YNR3Sk8KqLve25U8fup5CUB+MWR1\nVmS8KAAAAADmWdNOTfONnoyeqt+6NmEsdpGVvobHeqw/NueLU4aA+w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 362,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "30450220176a2557566ffa518b11226694eb9802ed2098bfe278e5570fe1d5d7af18a943022100ed6e2095f12a03f2eaf6718f430ec5fe2829fd1646ab648701656fd31221b97d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 363,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3045022060be20c3dbc162dd34d26780621c104bbe5dace630171b2daef0d826409ee5c2022100bd8081b27762ab6e8f425956bf604e332fa066a99b59f87e27dc1198b26f5caa",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 364,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100edf03cf63f658883289a1a593d1007895b9f236d27c9c1f1313089aaed6b16ae022100e5b22903f7eb23adc2e01057e39b0408d495f694c83f306f1216c9bf87506074",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdsa_secp256k1_sha512_test.json b/third_party/wycheproof/testvectors/ecdsa_secp256k1_sha512_test.json
new file mode 100644
index 0000000..6fad9cd
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdsa_secp256k1_sha512_test.json
@@ -0,0 +1,4846 @@
+{
+  "algorithm" : "ECDSA",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "BER" : "This is a signature with correct values for (r, s) but using some alternative BER encoding instead of DER encoding. Implementations should not accept such signatures to limit signature malleability.",
+    "EdgeCase" : "Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA implementation does not check boundaries and computes s^(-1)==0.",
+    "MissingZero" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.",
+    "PointDuplication" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission."
+  },
+  "numberOfTests" : 433,
+  "header" : [],
+  "testGroups" : [
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6ff0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9",
+        "wx" : "0b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6f",
+        "wy" : "0f0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6ff0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEuDj/ROW8F3vyEYnQdmCC/J2EMiaIf8l2\nA3EQC37iCm/wyddb+6ezGmvKGXRJbutW3jVwcZVdg8Sxutqgshgy6Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "signature malleability",
+          "msg" : "313233343030",
+          "sig" : "304402206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022034d2f1a567d7e647b178552dec35875a2cc61df3ce8ae2c1357ea8c5ff505561",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "Legacy:ASN encoding of s misses leading 0",
+          "msg" : "313233343030",
+          "sig" : "304402206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90220cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingZero"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "valid",
+          "msg" : "313233343030",
+          "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30814502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 5,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30460281206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 6,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "304602206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e902812100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 7,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3082004502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 8,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3047028200206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "304702206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90282002100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 10,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304602206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304402206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304502216cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3045021f6cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022200cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022000cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3085010000004502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304a028501000000206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304a02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90285010000002100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "308901000000000000004502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304e02890100000000000000206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304e02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9028901000000000000002100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30847fffffff02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "304902847fffffff6cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "304902206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e902847fffffff00cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3084ffffffff02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "30490284ffffffff6cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "304902206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90284ffffffff00cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3085ffffffffff02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "304a0285ffffffffff6cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "304a02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90285ffffffffff00cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3088ffffffffffffffff02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "304d0288ffffffffffffffff6cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "304d02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90288ffffffffffffffff00cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30ff02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "304502ff6cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e902ff00cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "308002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "304502806cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9028000cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "304702206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "3047000002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "304702206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304a498177304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30492500304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3047304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304a222549817702206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30492224250002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304d222202206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90004deadbeef022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304a02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e92226498177022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304902206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e922252500022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304d02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e92223022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304daa00bb00cd00304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304baa02aabb304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304d2228aa00bb00cd0002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304b2226aa02aabb02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304d02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e92229aa00bb00cd00022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304b02206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e92227aa02aabb022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3049228002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90000022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "304902206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e92280022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3080314502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3049228003206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90000022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "304902206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e92280032100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2e4502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2f4502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "314502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "324502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "ff4502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "30493001023044206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "304402206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5eb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "3044206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "308002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00000",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 79,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "308002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "308002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe005000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "308002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "308002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "308002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "3047300002206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "304702206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe03000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "3047304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "302202206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "306802206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "removing integer",
+          "msg" : "313233343030",
+          "sig" : "3023022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "302402022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "302302206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e902",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "304702226cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90000022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "304702206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022300cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3047022200006cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 95,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "304702206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90223000000cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 96,
+          "comment" : "appending unused 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "304702206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90000022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "304702226cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90500022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "304702206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022300cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe00500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "30250281022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "302402206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90281",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "30250500022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "302402206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304500206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304501206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304503206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304504206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045ff206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9002100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9012100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9032100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9042100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9ff2100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "30250200022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "302402206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "3049222402016c021fb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "304902206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e922250201000220cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "304502206eb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022102cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a169022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5eb60",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3044021f6cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3044021fb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "304402206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022000cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5eb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "304402206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90220cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "30460221ff6cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "304602206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90222ff00cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "3026090180022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "302502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9090180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "302502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9020100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30460221016cb914246e1c92050a03d9b0b4f05dde199ab6bf23cec3a120f56da5843de32a022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30460221ff6cb914246e1c92050a03d9b0b4f05de0a43cfcf1c53d8329a150b08be3d160a8022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502209346ebdb91e36dfaf5fc264f4b0fa220a11426278b79dc9a9edcf0e74bf85e17022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30460221009346ebdb91e36dfaf5fc264f4b0fa21f5bc3030e3ac27cd65eaf4f741c2e9f58022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30460221fe9346ebdb91e36dfaf5fc264f4b0fa221e6654940dc313c5edf0a925a7bc21cd6022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30460221016cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30460221009346ebdb91e36dfaf5fc264f4b0fa220a11426278b79dc9a9edcf0e74bf85e17022100cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022101cb2d0e5a982819b84e87aad213ca78a348979bd990065db64a261453a11c2d21",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304402206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90220cb2d0e5a982819b84e87aad213ca78a5d339e20c31751d3eca81573a00afaa9f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90221ff34d2f1a567d7e647b178552dec35875b7217410d1f42428575ac4a392f1a1420",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e90221fe34d2f1a567d7e647b178552dec35875cb76864266ff9a249b5d9ebac5ee3d2df",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022101cb2d0e5a982819b84e87aad213ca78a48de8bef2e0bdbd7a8a53b5c6d0e5ebe0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304402206cb914246e1c92050a03d9b0b4f05ddf5eebd9d87486236561230f18b407a1e9022034d2f1a567d7e647b178552dec35875b7217410d1f42428575ac4a392f1a1420",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020101090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30080201ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641400201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641420201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc300201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "Edge case for Shamir multiplication",
+          "msg" : "313236373939",
+          "sig" : "3045022100dd1b7d09a7bd8218961034a39a87fecf5314f00c4d25eb58a07ac85e85eab51602202c8a79b49cae4ec15d293575a5a1af5b4d6efb74ef5c2c1be34e33cdeb7113cc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "special case hash",
+          "msg" : "33393439313934313732",
+          "sig" : "3045022100d743c5d76e1193a57438f1b43b1b0e33d0d1ab15bd3d57a5cf6aebb370d46ce002207df27cb730b33dfe01e34a0067e548a98c56846d9a4cd64a930c96bfd917cf08",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "special case hash",
+          "msg" : "35333637363431383737",
+          "sig" : "3045022100ba30f4ddf3348f26835e9c50f6a2d5023a9a1f5fe2e9cf14b3270015dac283fe02201d1616abb204f615fbe99860d89158c3264182d617ac9f1560fa8291b349d579",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "special case hash",
+          "msg" : "35363731343831303935",
+          "sig" : "30450220551d72e63f7b27283c4107f7d851f387b60f3f4713a5d35c21fa332fbeed449402210080914cc37a3fe13a74db7fcc5226388d95034a50a89a9b2fe9bf42ea29e5714d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "special case hash",
+          "msg" : "3131323037313732393039",
+          "sig" : "304602210080cead3d165ce05c7cf8469f1c35c5a3a641696c843bef0f022a6c68133dc49e022100ea8409d743a4ad5e136207736c3ad79c8cfc7b57ebd1bd9b8a596670ad12d41c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "special case hash",
+          "msg" : "3131323938303334323336",
+          "sig" : "3046022100bbc0e8b7721065a51bac9c3aad64168998cc0efa23298340d436867cc86ba847022100ae3baa131a83153cb31de2f758e45139f62fe6cc9ce3941c6b1789dc1010f3e2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "special case hash",
+          "msg" : "39383736303239363833",
+          "sig" : "304402203a5ba93917b954617b40e1d866860d1522b0d310cac2457636e54e2ffdea888e02203eac6fe762aee127837c2c65fd9c1f65b404b2c31bb945e75d6166503fb5c8bd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "special case hash",
+          "msg" : "3230323034323936353139",
+          "sig" : "30440220647f2b4bef6d1ea7908ac5f3dfd705494c2587456557805fe64a703b2b17503c022020e164bbb505c6df56455908008cf9626df320f48aa3fc9d0cc8ad8bcf078cb2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "special case hash",
+          "msg" : "31343531363639313830",
+          "sig" : "30460221008aa653cfa001798c471eea3199dc975a4dea4f7c1ede47453409e606d05ceb51022100cab20967a056c0ea7fe9cdf8e1980f55b1597a2dad80c9223a0fab15c314fe6d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "special case hash",
+          "msg" : "31303933363835393531",
+          "sig" : "3045022100842e421f33be241d27f12f875355902a25819f210b3685ad536e23594012d9d002204fb894ae0e9c24b6ed280e224ab0811469296a9837d1e95b5d9d661d21a1c255",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "special case hash",
+          "msg" : "36323139353630323031",
+          "sig" : "304402200b703fd75bdd8dce4820fe130a0b0af17aad4e4681b0254864d5d6f8931ff5730220404521acf84e72ff22c2ee05d14a4bc7b70e69adc78caf81350e01379694c3e8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "special case hash",
+          "msg" : "35363832343734333033",
+          "sig" : "3045022062f0df1650560a5800fa670377a4317a604d6475c490066ce15638f8d1330b63022100963edf905197096818368a993fbffe32908a57153e6a1612bae6ee9ee8a8a719",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "special case hash",
+          "msg" : "33373336353331373836",
+          "sig" : "304502202901ade694d4b9c376b3244018e57bcde7057e8e11dd0f7d07080cdd1a39194b022100ee65a4c2baa70f8e236ceba9eed400d899f75276f94e4b7997b2b01ac008bbbc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "special case hash",
+          "msg" : "34373935393033373932",
+          "sig" : "3046022100aa9c8e5311b232b4ce9db03892f26eb77d655c6ff09a599424abbd4b11e750be022100c1034c44b02e2fdf05e1ba5eebdf954c5a01794600059e05e5c73d542da3ee38",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "special case hash",
+          "msg" : "39333939363131303037",
+          "sig" : "304502202febea016e55059e91e157b988f86048db57c37fd122f5cc60169ff4fcb4863c022100eb19cbc35b3061e1ac4b59b92d1f732cea3212dcbe943ccad82d32740bc22c33",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 231,
+          "comment" : "special case hash",
+          "msg" : "31303837343931313835",
+          "sig" : "304502202be463ff06af2096dd62f0326e1af51c585f18ca8f8aa361dedcf55d543e6b7d022100f56afd59dad42530d94f11c59a6408c54826b7a9ef83f4d020f209d71f9b74c5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 232,
+          "comment" : "special case hash",
+          "msg" : "33323336363738353030",
+          "sig" : "3046022100f61f64defc45abe284b39161b49585f21edef1e88d06389e5b5aacbb394ce4dc022100a5a27e17df10aedace97eb2c48659f69b58cfe76a1f1ac30fea3043655bde515",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 233,
+          "comment" : "special case hash",
+          "msg" : "31343438393937373033",
+          "sig" : "30440220052134eae13c1dec5ac5aa46186391786f5b60591cb0dd30bfc61e89486abfe2022009cdaa279c4f0d3d5ae00e0d74e733a260b8b120a1bda7e5a90194ec442e592d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 234,
+          "comment" : "special case hash",
+          "msg" : "35373134363332383037",
+          "sig" : "3044022024824614686b80f3b738970a27816f58cf103c4a93c2d6b0f5f6de65a65501e30220180e5801a593063e75b83cd7ab8e52575a013a1be5cdeeb05b30e3ac9dc4ed82",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 235,
+          "comment" : "special case hash",
+          "msg" : "323236343837343932",
+          "sig" : "304402202ff7a5ab2f1a3323651a0d17c4263672ee4d2c560cda94e7d52ee755138bb0450220542ce83d8d9d441357e24b618b5695164d4391791cff62eeb01609d1d7cb1c0a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 236,
+          "comment" : "special case hash",
+          "msg" : "35333533343439343739",
+          "sig" : "3045022100ae446d1a81766d21dd7fc515d0a956605d0cde26d6086a76f8ffc81a6dfbea4602204fccef9f75e94abc7eb3f2bdcafdc5d97d61b9d950a06010ab4c54e3da7fd4e0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 237,
+          "comment" : "special case hash",
+          "msg" : "34373837333033383830",
+          "sig" : "304402203957cff4a75fc6039c0b0c2e47eb9b07ff6ec5dc8a3c3316590a7ec9a1d7d99302204e578ee6594a00cb80c640cb9589d616dbd1cecda2d15dcc0062f30686d6073b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 238,
+          "comment" : "special case hash",
+          "msg" : "32323332313935383233",
+          "sig" : "30450220437c36031737a3140dc30eed281adac8e9074187aad41502a3b9a3bfd4ef252c022100da13f88f633202b9b9517b93a6c08a7b8e6858734e8894b1a64c6ec08f1d0423",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 239,
+          "comment" : "special case hash",
+          "msg" : "3130373339333931393137",
+          "sig" : "3045022100828c12fd9fe31f91bd8f58aac72ee6485e34ceddf91927cf3a09b63363b9d8e902200e889664a8c98619cab572687064edb4f0500f8324a5df0bfb5a431a3cb1ca39",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 240,
+          "comment" : "special case hash",
+          "msg" : "31383831303237333135",
+          "sig" : "3045022100807cb34aa6ea48b175f41f3afdf70a109d2b746ae48e08677cdafc33d916b2da022041980e6f7ad19944d278851f98e0a6220ae888964ae81a667a63fec21449334d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 241,
+          "comment" : "special case hash",
+          "msg" : "36303631363933393037",
+          "sig" : "3046022100a998f9f0daf02f717f5292142dca447c722d2394dae0c84910433754669716ac022100826fc37269539cf8a98997f8a0268bfffe888d6c23bc68ad7c759db47f65a925",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 242,
+          "comment" : "special case hash",
+          "msg" : "38383935323237303934",
+          "sig" : "3045022100f151b614afe5bc9d511d0c34a7eb44283921272e91b3e5d02821cf7a43a92bc50220097aa33dc50ebf8fea036cd7e224a4d38aa20773e5a78ddb83a2f3b579b2ef6c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 243,
+          "comment" : "special case hash",
+          "msg" : "31353830323334303934",
+          "sig" : "304502205f21585381f5f42e9f76be3f61f4cfd6476ecc6f06cd4fbcf13e08c27f42614802210095d5b2deabf19891edd41ac52d9072fadebb2f0145bec9b916f68fd1fbcfb3cf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 244,
+          "comment" : "special case hash",
+          "msg" : "33393635393931353132",
+          "sig" : "3045022100bdc361e68984482d7b169bc5e6ccf82d2263871be749d67a44f548d32bcaf5f10220375614fa4134d5055ac117a6ea948b74269b8063e39259d494a7544afb6291ab",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 245,
+          "comment" : "special case hash",
+          "msg" : "32323838373332313938",
+          "sig" : "304502205773b016dffac865ab008abe8a06353d197b4dff32403d7ce98ada4d20ea8a00022100d60de9c98cf50eff0515b962dffd6aac8a1b72bc9cfaf6bda12b99f63eb976d2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 246,
+          "comment" : "special case hash",
+          "msg" : "32323330383837333139",
+          "sig" : "3044022057b747d21fc898472a888b88693a989eabaf143396e4cb2de4af19386fba384f02207c99f63904191a4464d0d23ca560d5558895cdcff93af4b00c1c66ca2d974393",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 247,
+          "comment" : "special case hash",
+          "msg" : "313239303536393337",
+          "sig" : "3046022100854be2bf302a2d6db437eb9e78703673c1c7371399e68caa8625bb13c7aa0fec0221008fd22607e0169eb2e2e00c4af898fd2a609dc57a9fa94a7f93372098fa675649",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 248,
+          "comment" : "special case hash",
+          "msg" : "32373438363536343338",
+          "sig" : "3046022100ebb3359de3b13a518545a86b7fdd92f4793225b8ca4555a6bd4182922b0452be02210083faa7dff1aa0eed89a7ddcdaa5d716ba6253c5c21f7122c2755eb78b28884c4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 249,
+          "comment" : "special case hash",
+          "msg" : "37353833353032363034",
+          "sig" : "30460221008bc91cfcfc85ba8aa171b703a330e398df4460d22602e73e327423ebf98bf632022100ec7569072aa73ff19f183daf433abff142d7d5edceb25b771d853acf0fbd68b6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 250,
+          "comment" : "special case hash",
+          "msg" : "32333237373534323739",
+          "sig" : "3046022100895b07c0450ed6f4941633a053c978128c46e5225c00eb009c3c6cee5eb2b842022100c982818b260f1650e03eba8f9db1a2ca79c3f804dbe7d172233260e1a9c10640",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 251,
+          "comment" : "special case hash",
+          "msg" : "373735353038353834",
+          "sig" : "3045022100d5e152ec304090d764fd7ae61abeeadff2fee8df3dccd8fb44d2af5a8dbee0bc022072518dc1ecc993faadffc3426594fe2024c7c84ba101a9274d88009393103ff6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 252,
+          "comment" : "special case hash",
+          "msg" : "3137393832363438333832",
+          "sig" : "304502201298b131ce97a528e5dae05d92b286e2447b17ec002267b9e8f03784d4074bd1022100edf223ad9c308aef22e1e0c24a20268f966cc2b9ca4d941945bbca057db92d4c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 253,
+          "comment" : "special case hash",
+          "msg" : "32333936373737333635",
+          "sig" : "304502201e79b3921d23d290a57d08958d3ad8305ec444efe1281c98fda44e8af7648f49022100f4c7610ad1ba9339178c50e7979b5aa9af07d8143e59d13a2e84f98f37101e3b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 254,
+          "comment" : "special case hash",
+          "msg" : "35393938313035383031",
+          "sig" : "3045022100e455f464e0edff9c959f84f081828896149a330361ff2d16d5a2448c9d6836840220351cfa2f29a1318ebb3a46f0a36df8954043949b8d7cea94eacf99108b4d3fa0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 255,
+          "comment" : "special case hash",
+          "msg" : "3136363737383237303537",
+          "sig" : "3046022100a885770c9ffef33f0c11245064936e3dd165ea2633575a6a155368670351f726022100de31e6a58626a41fd029cf766ef44b8273b88558e2452e893978fbdda1e321d1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 256,
+          "comment" : "special case hash",
+          "msg" : "323036323134333632",
+          "sig" : "304502204b6b451478ba253ae3c75ca5b18b70ccd3cca408ed245cb2af3369548dd2e507022100fe479b631a3431b42772925cbfe8e789f9c55fb2fd1d7ab51664cc2fa571ad93",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 257,
+          "comment" : "special case hash",
+          "msg" : "36383432343936303435",
+          "sig" : "304502207ca70376547ad6d18f8e539f09dc269ebaa06854c1adacd58fdc735ed3cf0c16022100f47654f4c0ac1b0e65b712300e3bb472983b116db5206520eabd886dc706b266",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 258,
+          "comment" : "special case hash",
+          "msg" : "33323639383937333231",
+          "sig" : "30450220388514d147664fbb37271cb8693e47459c0627d6b1dd52dff1d3947dfc9cabec02210099d3d40814aa177be99e4819696996bc75073f4518955587cd56b5ad8bbc2c58",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 259,
+          "comment" : "special case hash",
+          "msg" : "31333837333234363932",
+          "sig" : "3044022044d3ac50d9b65601d79b47d6c5d98394cef155211ff37d4bac15e0d4890809b802203ea03829afb0545e088361a8cf952aec17bab7637fddd6db35f039803523c921",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 260,
+          "comment" : "special case hash",
+          "msg" : "34313138383837353336",
+          "sig" : "3046022100a33004a2cd50a4f70447fd382e7fdc9257c4d9be7b16e686c5082a231ee7b010022100d87b96ed3beea54652607017702cfce5d4e7fcec1fdd28f41681ab80a5c5b63c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 261,
+          "comment" : "special case hash",
+          "msg" : "393838363036353435",
+          "sig" : "30450220668ad18cc22c1d1498cc8e5a11e2bfc4c1e1fcf0a7350a5806c5533ae332f0b1022100f58b49369771bd20bb08b63d4a9212e2dc71da9257ed3710d9eaef9bee469eb2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 262,
+          "comment" : "special case hash",
+          "msg" : "32343739313135383435",
+          "sig" : "3046022100f7cdcb0281c70786cc3653820d1756a78395a9eeeab2a4d164e260f64ebfd6a8022100d966c74499cac97ca8ee67400df01b14793b6d7d07668fc202a9918f3c046e9b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 263,
+          "comment" : "special case hash",
+          "msg" : "35303736383837333637",
+          "sig" : "3045022100de0e781d9e3e7f73021458fc1201fc021e5c54f1fe40b1b10db8fcf16ef7e54a02207d9db92321b5e5bb105990145390979390d32394116f4e78af34b85105dee8e9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 264,
+          "comment" : "special case hash",
+          "msg" : "393838353036393637",
+          "sig" : "30440220011dac8ea37f7bc6a530a42d0e3bec8c845694f73bec6950081a6f999ccdfbc60220153e57ee45e0a379839f3b8f6faf86de7a626b210f4c1007e431f842e39bf7d5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 265,
+          "comment" : "special case hash",
+          "msg" : "32373231333036313331",
+          "sig" : "3044022063f9c43a8cab49f518685a120bd73a4e5956f9f167a78d4661fc795d41be2ae102206aaf4f3384f1489ef026cb29e97ea1b5562fe8ceb9978d506fb7064f427b9f31",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 266,
+          "comment" : "special case hash",
+          "msg" : "33323034313031363535",
+          "sig" : "304402207f0fd3736166195ba810d5a2dfb5e1f03aece2170510c8aa4cc4a0c974a7c5d60220370c8772a75d32e8c9cc103004e75e6d30a8ac8611b84b89c41c65542171bc5b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 267,
+          "comment" : "special case hash",
+          "msg" : "33313530363830393530",
+          "sig" : "3045022100f975196086d10f683f4aa1a3c2d5fe13fd0f52ee72aa3f785006aa024c75873502206a66364156ef21b5dfdcee60cce8fb09c12019bc576848ff73db49856af74681",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 268,
+          "comment" : "special case hash",
+          "msg" : "31373237343630313033",
+          "sig" : "3045022035fe6d9bf9f7d47612c3f5be6a4e9a0fb0c14854d1a377adfb5485d6e3835c6f022100f96587fc460e7d07396f9f2d060693dae632721259e77c90b8314002a5235dd0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 269,
+          "comment" : "special case hash",
+          "msg" : "3134353731343631323235",
+          "sig" : "30450220210c7c9b231293c8ec09b0f610d31724a045f6a33f84423fdd541ac11ff78962022100e5a40e6b80da99cfc49ce969f1f59146835183e61001b4513f927b71ec3b2a13",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 270,
+          "comment" : "special case hash",
+          "msg" : "34313739353136303930",
+          "sig" : "3044022009b7dcfad2c84b89825cf3aaaffed51664faccc0d171a43387a6ff98aa128a040220272b00e6e0917afe4fbe782604428e09fd91c38125d51c3ba06ce3198e6bf736",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 271,
+          "comment" : "special case hash",
+          "msg" : "35383932373133303534",
+          "sig" : "3045022009c7c99681c9159b22c0a467999559a31e279075d37ef872a88ae13565f6149b022100b0ff953be1940d2cf548663c1b4db7b416521db289467733b9a76629f8ab261f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 272,
+          "comment" : "special case hash",
+          "msg" : "33383936313832323937",
+          "sig" : "304502202bfaae0ea6d8baab3e02ad7fa3dda3ce0725d11533e3666477f54d697e2ca9bc0221009289d5da443395bca18fe9d1a4afbe04a32b4ecd258eca6c1772acff2d0b9a89",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 273,
+          "comment" : "special case hash",
+          "msg" : "38323833333436373332",
+          "sig" : "30440220368846edc677ae8fc237069cda719af3d7f17cc136fe443b2af614ccfb4844ab02205ebe6c1d3e88bc4e291841ea97c836bdcf67d9eabe926346c5f42105f7b38f67",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 274,
+          "comment" : "special case hash",
+          "msg" : "33333636393734383931",
+          "sig" : "3046022100f336da82bea2a111bddef6a25de4ab87d7c95aa80d21838f3a4efa3d9346555d022100da5ab612b327aa0fe95d1caf85f3b6698c23a47212006c5667cfa92aa3ef4dad",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 275,
+          "comment" : "special case hash",
+          "msg" : "32313939313533323239",
+          "sig" : "304602210097c2fb9865f9e76f8d54ce957120b68ccb04cd3183dae7130f73139cd56655cf022100fb63e38176ffac37d0ec1e49c2e2efeff04dffdad5a75f3576f8276cccee9851",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 276,
+          "comment" : "special case hash",
+          "msg" : "35363030333136383232",
+          "sig" : "304402207393e0207e07bd73b674d3667dfbc9c30022574d63079a040a23c0cd7e1b6aa602202994b3468432fecd0a32134171179d2809244d586bd971129cdba73fd3dc8876",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 277,
+          "comment" : "special case hash",
+          "msg" : "383639363531363935",
+          "sig" : "3044022021e1943d7d396a8c46658bede4ce155c9a06f929cf6ad292d32c91cf8f493887022030783c682cebfffec5787d762bd725bafc9c4075ad8eb1582188f4c05dd5169d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 278,
+          "comment" : "special case hash",
+          "msg" : "36353833393236333732",
+          "sig" : "304502205a269eb44e910bfe8a2656dee47556cb908a417917e2068e20d201721f44f9b1022100e69d463204dce77c249439f22f77cc4c88134012a286b36a9559f694203766c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 279,
+          "comment" : "special case hash",
+          "msg" : "3133323035303135373235",
+          "sig" : "3045022100cb8c146fb3d58846e5748c48742af2f1b77805f6cd1e4eb98d8c66cbdf5d6455022017ac992e10251e334467f8e57e2e1c269db8b19469321c74b443972a80f38b2d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 280,
+          "comment" : "special case hash",
+          "msg" : "35303835333330373931",
+          "sig" : "30440220212d84a153db81cea5212fa7dee31d59bdca1307277a01b5936c3aead31bf1e40220520305dbef2bda6526fa2cfca789a1c9aca5c2ad4c0027cc8cf3881813da8a72",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 281,
+          "comment" : "special case hash",
+          "msg" : "37383636383133313139",
+          "sig" : "30450220310c82892f571134a36725f4a31c5cba8bc46e65002d73b11364084433d8da4a0221009ca552aca84b96cc9461e2b65a64975118ea78b8b355a0ebcc1a61de37877d13",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 282,
+          "comment" : "special case hash",
+          "msg" : "32303832353339343239",
+          "sig" : "30440220489deda580c62533783df9fe62de34c2e2cab91d676709beeff13afac8e90db9022032a85a9c56f308b7a794dcce614a5ed7e0857030b8429fe3b4e07ad533a5a00a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 283,
+          "comment" : "special case hash",
+          "msg" : "3130303635393536363937",
+          "sig" : "3046022100e8897c1cad1fc870a7d364676a9d7f7cd3ac951f3bc3a9ef1f7231466c3493d7022100dd2128e876d62da82cfc5fc508d33bf66b71c0a84d0a9b7e47dfc620f5846bc6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 284,
+          "comment" : "special case hash",
+          "msg" : "33303234313831363034",
+          "sig" : "3046022100b4d771d19fffb1fe5ead25ef5dbf6b53d4d3dad284641108ad84b2541ad435a4022100843ecdc2641b33a3ae9ae15d559f6229d7304ee5ecabe00db73bf2b6b5c6c21f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 285,
+          "comment" : "special case hash",
+          "msg" : "37373637383532383734",
+          "sig" : "304502205ab5fb3136fabdbd22009642df03685935819895d675fc284e8b8112db522d08022100d87ec88173e823ed70438fb1088b00689352542fabad5e9fd6d4c3c58f722f86",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 286,
+          "comment" : "special case hash",
+          "msg" : "353434313939393734",
+          "sig" : "3045022100be310120169f8d488c6e5ec5b5e588ab8a65040169d9efd3062e0d05fd7d58df022045033f291fa21a85cc08f78fec2dbd94135520de261360728b8743b558ed16f8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 287,
+          "comment" : "special case hash",
+          "msg" : "35383433343830333931",
+          "sig" : "3045022100cd7fb3f2c25dfab6f9ee83fcbb08698680e9d1f3d47815bc772d717a764f99970220287dd85b976d7f56d23ae7837398c118932aadc982f675f94103036729a47c7c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 288,
+          "comment" : "special case hash",
+          "msg" : "373138383932363239",
+          "sig" : "3045022069f18c064ad2683cc1b6d8b79020aacd186b6ad1999e6e55bf28bb1dac33f339022100ef66e66001fcc219c9a927d7f0b84863483bfd1ffa6086c06921905310c793e1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 289,
+          "comment" : "special case hash",
+          "msg" : "31373433323233343433",
+          "sig" : "3043021f547c6bb40f52d207fff796a29f6dbe62058e50fb73bde6b9c6ca11346fd8e802202bc82bd3efc9febe8578acdbc3148bb46c41a39be9ae1994ad52d8bf13195d09",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 290,
+          "comment" : "special case hash",
+          "msg" : "32343036303035393336",
+          "sig" : "3045022100a80496adce42e7971ebe91300710cf4f535fad266668d76d72c95fffe4d4257002200d4338ca32857e14e0ea8026bc194227b910b98509c8c9307b0d8d93d47b191b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 291,
+          "comment" : "special case hash",
+          "msg" : "31363134303336393838",
+          "sig" : "304502203de40634d11a7a6b67023b84650420673ce6dbadb1159768cc0fd55f3784ec88022100a455fb08e51b8493177d88fca43aeff306e1490d7f6d24d6a910970a3d8619de",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 292,
+          "comment" : "special case hash",
+          "msg" : "32303935343235363835",
+          "sig" : "3046022100c1f229c0557d4c47962593781bc96cf745f3bd629ad85434dc2eee456ddb30310221008638f6c01c15d23db24bb851f6c63c763c1f040976f3f2b32c4bb1b9506c1c12",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 293,
+          "comment" : "special case hash",
+          "msg" : "31303038303938393833",
+          "sig" : "3045022035dd4957b352e8b1bbc80d1deb21f9b0989188ade3fbe46f75106da1684e1d6d0221008b508e2ed7a51efea0dfaf377f6bd5d4ae133cc4c93650600be545af5d3acd75",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 294,
+          "comment" : "special case hash",
+          "msg" : "31353734313437393237",
+          "sig" : "30450220410aa9c943e663082c6f76b84469c9845e0d439ba7ffc7cac0418eea0e20e638022100c873ab5c21c9f0ce0bf78484028796b77451e1187250ee33535dacfb3cee5f61",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 295,
+          "comment" : "special case hash",
+          "msg" : "32383636373731353232",
+          "sig" : "30460221008191db069b571cd40f2676348433430d3a65155c233c46a42a4299e6f5be806c022100f3679ef8af0b1b3a3aeaa7bcee51ce960441622e9ff2dcb22a8ec8de724e0a0c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 296,
+          "comment" : "special case hash",
+          "msg" : "31363934323830373837",
+          "sig" : "3046022100889c44edbf3825b18d933aecd5ef70d12ebb00bf79550451205fd6f5ba7f372b022100ecb67194bed2b8176077622d58c9ab4fe4ca34601decc09f9386b8c4445c7224",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 297,
+          "comment" : "special case hash",
+          "msg" : "39393231363932353638",
+          "sig" : "3045022100aa87113aff2e1ad6461191241f90a23b91242d0066779daaa9506a4188abc427022033dbaac5ac443fb4d9529f83247f94c0ad1360d4d0ba8e162a377946c6ab9ae2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 298,
+          "comment" : "special case hash",
+          "msg" : "3131363039343339373938",
+          "sig" : "304402200e13f66a8ffd0da1c4b67f4d805941e90f98ce386540c48019c1ac105407568302200cb489e8d5acfca5245d9292f59c6ede52425157af77b8beef38d23b6e6ade13",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 299,
+          "comment" : "special case hash",
+          "msg" : "37313836313632313030",
+          "sig" : "304402206c1813f660c78bda956c1685bc924f69d1bbac5fadf3e4b027ab049bc82ad134022020de89ee005d7646f070bdac794ccce24d661b390a78851d35fe6fb5b25b3eba",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 300,
+          "comment" : "special case hash",
+          "msg" : "33323934333437313737",
+          "sig" : "3045022048dc830b6326ec218144391b658d52045ef86ef918a8d41c59131912b1a46fb1022100a431916cb7cf79129b90f09842b3f2164a6cf603db88f2d99944142c00b42559",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 301,
+          "comment" : "special case hash",
+          "msg" : "3138353134343535313230",
+          "sig" : "304502204d45782be145a27ae9ecb6cac1b9e30be87c0d13b7d6ada9f795ff051351ac70022100cf71d1eb15e88446ddb900f20d1e0739da499de9963fe99ded00a62da6462d62",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 302,
+          "comment" : "special case hash",
+          "msg" : "343736303433393330",
+          "sig" : "3044022011acd8b8d736e7f00476495803fbd20ad351321e800cfbddbd6a7dd610c5ab8c0220734027aabcca9487773dc3ab069b802c00f5b6e5520e7761496ac1e7c78ced91",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 303,
+          "comment" : "special case hash",
+          "msg" : "32353637333738373431",
+          "sig" : "3045022041be8b3bf41a4c507de12f098f7d409a1f941fef84d93794c497f7242a7c382c02210081f7e7243116f24b84b0321e93eed35e2bdc32b00aa8eb9583be3e9b7a09a4f3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 304,
+          "comment" : "special case hash",
+          "msg" : "35373339393334393935",
+          "sig" : "3046022100ea032ff41b061e93e456a5f0a9cdef36c0732df4d55ab4d3867484b0fc49d9eb022100ab298dd811826a6a9319c3632a96253c31c14f75baef536a645420442bab4d43",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 305,
+          "comment" : "special case hash",
+          "msg" : "33343738333636313339",
+          "sig" : "30460221008b1ff140c65adca22e5596ffb95a5121c356d2d4055f14606445249a5725686f022100ef8c16ff228114a7e33b35ad465f957577dea405fbdf3faf077a878754e58bef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 306,
+          "comment" : "special case hash",
+          "msg" : "363439303532363032",
+          "sig" : "304402203a40e8dc3ebe9e19dcd0d4d1b698ab2a4934a146def5427b3a6a8fbfbf347846022054f65e36088d2d4543011c94b1e5371697202d488b342dd6f77a69944128223d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 307,
+          "comment" : "special case hash",
+          "msg" : "34373633383837343936",
+          "sig" : "3044022015fecd439137df74820727f71218405cbe525d403c574471d8a36fa4b1f592ab022018ec290971ed0a227ec47f1e2142f3b8fe5b17336350c5515d4a87eb3382fcb6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 308,
+          "comment" : "special case hash",
+          "msg" : "353739303230303830",
+          "sig" : "3046022100e676e84a299f481a207cde6a4271c87d73e29d1e49216393292323bcdc238844022100b8a98c769bf81429644758c8f803ddbedf81634e53099c43ad0ca42f4207ba16",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 309,
+          "comment" : "special case hash",
+          "msg" : "35333434373837383438",
+          "sig" : "304402205116f8f0af12b47bd025aa6eaec5007d4e3c5a3a72cb4c331f569581adb01bfb02206962251da7ba9ac951cfbd2051bcb7d953005cb9599ae0ad9c5f5139baacb976",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 310,
+          "comment" : "special case hash",
+          "msg" : "3139323636343130393230",
+          "sig" : "3046022100b83f3918b6c5506d648ba3dba36762db593ad4b791456babcc3c1a4966317ae60221008cd0166047cec89963e9c8ca43b556ac17d0d62177a9bda35e61d0bb16dd471d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 311,
+          "comment" : "special case hash",
+          "msg" : "33373033393135373035",
+          "sig" : "30440220077858a840230ca21385c4ab4c36cbd3ffaf85656202fba58f1ea995f52ebc4c0220543e5e32a6d2f5c08664ed72175adaa25cdb5d6a754b0cb184e6994ede66c5b9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 312,
+          "comment" : "special case hash",
+          "msg" : "3831353435373730",
+          "sig" : "30440220538ad8797a397414ac82287c9216e41915c9e3dadbd493a0bbef5cb0dc7935ec02202c94cfdae7bf76f90b3cc7d19feea4005b387e312ad4116654d63cfbecf2ae1a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 313,
+          "comment" : "special case hash",
+          "msg" : "313935353330333737",
+          "sig" : "3046022100ff8bbd1b6441388cb8d562c28ce29fbe51de11502fc825773ded3f0df225b2360221008eccca0148b82fdfb370cdd073aa0634b39cc70d0d5244a7319e4b13791e2c2a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 314,
+          "comment" : "special case hash",
+          "msg" : "31323637383130393033",
+          "sig" : "304402207c179a010f51d66ec82fe5d5d45bd867b4b236a27be882e627506f7286ed7baa02205e38c048fb0fbd81c40df3dc16087d9aabeb51a193107499d29d8cf99c388a21",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 315,
+          "comment" : "special case hash",
+          "msg" : "3131313830373230383135",
+          "sig" : "304502207e0810885b405d54ceb2eb18cae08de2062f61b7ed94ab67eb15e87b64e730ef022100f511a7919e6e4d70c8d61b831e383f58dea5878a6c8c5f0436ee058dd80a7668",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 316,
+          "comment" : "special case hash",
+          "msg" : "38333831383639323930",
+          "sig" : "3045022100c665d558dd638ef27a28557c3deb8a2f54abf9bd0bfa032c7ec9a514da9a9e9e022065c9efc355981f91778227eefacf1bb2fedb98657e6cd8674fdd42ae00d619ed",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 317,
+          "comment" : "special case hash",
+          "msg" : "33313331323837323737",
+          "sig" : "304402204f06b82aa0d070a004a7fd1135bc3a0bc36fcaeeca35e3edf00f5895394d59ab022065f71dd7406a17bf19e434a4635479340204dd862a9f2c4653e2fa39b178286c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 318,
+          "comment" : "special case hash",
+          "msg" : "3134333331393236353338",
+          "sig" : "30450220539c8fe5715c3dc893815ec2f00e203b4cd4f8fd36cc5742cc81ced266e02e3b022100a5964b2d5157624cf42b6726ae23a7d5ef83a5d1f1460bd573d5a15316be5bf2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 319,
+          "comment" : "special case hash",
+          "msg" : "333434393038323336",
+          "sig" : "3045022025f337273591f276849cd855b03d07cbcb205924cda4f62a079591602cc10a8c022100d7b82c8fb38bbd503d92e5ae9303e8673c6dd0e9389f5af53366bbab851f0470",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 320,
+          "comment" : "special case hash",
+          "msg" : "36383239383335393239",
+          "sig" : "3045022100f36018945d24c89678ce2c8cf3cb4f93c38bdad3589891a5baa293744d4daa20022019ef05878dfc636a4662fd5dd127c908d7948991a324840323c8aef4fc2ff8ac",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 321,
+          "comment" : "special case hash",
+          "msg" : "33343435313538303233",
+          "sig" : "3045022043203c89ad43a2bb1910e70ea104347e84764599535d46dabbe547395b1463f4022100ed3d29c7c506ecc988614b368b38dd5b4f1e330c1b861efca8152a704b9146e5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 322,
+          "comment" : "special case hash",
+          "msg" : "3132363937393837363434",
+          "sig" : "3046022100c2740bfb3f387df1b564e3ff48835b9e380104716f58c5a43e97bb2c2d84d04a022100e760ee5d0950b512f6c271cd1a87619b830df83fd40d44b9283539b3aa380019",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 323,
+          "comment" : "special case hash",
+          "msg" : "333939323432353533",
+          "sig" : "3046022100ec07ec5378ed131b2dea7ae9776ba536daef2afc38e2556a70b89b9752eb1f71022100fea25b9e50b1cfa2cf475dbb2245761d5f4585fbbc438d97226c64ff74bff19e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 324,
+          "comment" : "special case hash",
+          "msg" : "31363031393737393737",
+          "sig" : "3046022100e438303ccbbee359c865997e46112b0afd7a647c593429291398f0c432dfb9f00221008487e07a53da18793f8b527069e620e44587e420245d6ec827bb35cccfae7a47",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 325,
+          "comment" : "special case hash",
+          "msg" : "3130383738373535313435",
+          "sig" : "3045022100fc09fa30e89a2ba3d0c4d9d9350e717168c21253371359c0f3cb8c8807bdab5602205d6c4766bca462cf95b4aeb8f5886b52fc3286642ffee8d0bd7ffd4af7badb4a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 326,
+          "comment" : "special case hash",
+          "msg" : "37303034323532393939",
+          "sig" : "304402204f184fba2be39078385290acb4cc4b3f39b099c3300c762df205c605c6b30e1a0220506481d2018b3a4c0ad558f029c82e0625c833cbbee978bee7b589742ee1e377",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 327,
+          "comment" : "special case hash",
+          "msg" : "31353635333235323833",
+          "sig" : "3045022100e9a27533a50eafb09561dc335d67f8e5e53b4fc16b3013f062e581ad027e110e02207e4150def368f969ace0fc28cac7a3312d6b9af538c412048be1763ea81f3f44",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 328,
+          "comment" : "special case hash",
+          "msg" : "3233383236333432333530",
+          "sig" : "3046022100fac24d54387202bff01a91f5504f778c183a0a7930c02af0b618ee64d1b1e438022100f3a53cb6f96feea45ccadcdf9ac78cd735ec3342163e573d2125caa0d8d507bb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 329,
+          "comment" : "special case hash",
+          "msg" : "31343437383437303635",
+          "sig" : "304502203544590a0f9fa5d43ad4e0a003a8d7db58b8570951657aab3bab732727d1bbc2022100f257beac10d53e8012ecd236793d280026c5cf1c04aae522019b87e003500ec5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 330,
+          "comment" : "special case hash",
+          "msg" : "3134323630323035353434",
+          "sig" : "3045022100bc0726386497c85da8f4055a727b1938e96786b009e6847a080a8aae571b0753022054b1b15fc7886f09b121af6520d0f4336d259d734713fc3e973cf28368830eff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 331,
+          "comment" : "special case hash",
+          "msg" : "31393933383335323835",
+          "sig" : "30450220216f8051f9ceed5b5cc1085f83efd871128cb44b260ac12c486c0ea06c71aa55022100df90346cb028245a72ac7d8094497f0efb83a7c44ba3b258873127355e3b2edf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 332,
+          "comment" : "special case hash",
+          "msg" : "34323932313533353233",
+          "sig" : "3045022100cb76652e19d6e7a72c9cac35c2ae46178d8c0ff59b06b0cb97c31aad39ec1b0902205c47b889a29c781540b8783ca24e2acc340178685d7331017e29b4efe92d9fbd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 333,
+          "comment" : "special case hash",
+          "msg" : "34343539393031343936",
+          "sig" : "3045022100edfc03190c839528ba2aa0ba3a23b596fcfec1bf2bbf4467f1fd88398cab8ad2022045b41fa49e0fa7f060ac1ba38ab4d2d5ab5b9fa54ca59285aee09ceedd9865a3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 334,
+          "comment" : "special case hash",
+          "msg" : "31333933393731313731",
+          "sig" : "3046022100e7631f03d9dfddc64cfd2a971523def68cb9f8a64e07eb2235c7250adc36480b022100a004cbac3e04056c7e65fdb48be051e9a52ab427c826c84e2cb2229252983663",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 335,
+          "comment" : "special case hash",
+          "msg" : "32333930363936343935",
+          "sig" : "3045022015e36a42515118021f6f5372ecbff90755d8ae77f9dd683972d2f26aa67164510221008d1cd988ba0a1bd919d2f9b5c8a3517eb59ef776caecdf2b5ac2f7a721858315",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 336,
+          "comment" : "special case hash",
+          "msg" : "3131343436303536323634",
+          "sig" : "304502206daacbc1125cb3690e43e16b414077c0dd274b96ed61892bad5a519274f01b23022100d044965811b4050c7a85021e8827635cf9f46260fc33bb7cb56b1b37180c4220",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 337,
+          "comment" : "special case hash",
+          "msg" : "363835303034373530",
+          "sig" : "3044022037e50775ee06024d596ed49824b1e6a49efae25c7dce8181de33f93ce34ac3ce0220616a3e9d1fed086138f6feef6532647c02bd324ba4a8bfea20640d22f5494429",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 338,
+          "comment" : "special case hash",
+          "msg" : "3232323035333630363139",
+          "sig" : "3046022100d5b64cdf82e354ba6a01772f7d38e8d46a729b808aaed73616ed41a9afc83db7022100b5c456c91254e57013228c9724bb7f97aaf18e1bfd4c99d3ca9eaa8214382a10",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 339,
+          "comment" : "special case hash",
+          "msg" : "36323135363635313234",
+          "sig" : "3045022100915779b90ae6f6c1fb82c198c9f0719ce2ea37be0f261e36585ec89adaedd2b602207d05e7794ac57578790808c0ac52ca3a51d1399f1a4c7173a7ed19867732b3d9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0412c90a5debd88d42686b84227dbc755351b78e7c6cb86c0b22536f394603646ed03d965851bc41bb089499c51987b899a8353d997e040fdd35290a2627f0a3ab",
+        "wx" : "12c90a5debd88d42686b84227dbc755351b78e7c6cb86c0b22536f394603646e",
+        "wy" : "0d03d965851bc41bb089499c51987b899a8353d997e040fdd35290a2627f0a3ab"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000412c90a5debd88d42686b84227dbc755351b78e7c6cb86c0b22536f394603646ed03d965851bc41bb089499c51987b899a8353d997e040fdd35290a2627f0a3ab",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEEskKXevYjUJoa4Qifbx1U1G3jnxsuGwL\nIlNvOUYDZG7QPZZYUbxBuwiUmcUZh7iZqDU9mX4ED901KQomJ/Cjqw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 340,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "313233343030",
+          "sig" : "30360211014551231950b75fc4402da1722fc9baeb022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 341,
+          "comment" : "r too large",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2c022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04913ed043022ee590f59e44f519e5cfd9d6f1b84a50fb417e9ad06683c6afa194b68fb80d6ef261b5a63b57f871d2ea7224319f5fa3ed3dd77f1012dba19d0395",
+        "wx" : "0913ed043022ee590f59e44f519e5cfd9d6f1b84a50fb417e9ad06683c6afa194",
+        "wy" : "0b68fb80d6ef261b5a63b57f871d2ea7224319f5fa3ed3dd77f1012dba19d0395"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004913ed043022ee590f59e44f519e5cfd9d6f1b84a50fb417e9ad06683c6afa194b68fb80d6ef261b5a63b57f871d2ea7224319f5fa3ed3dd77f1012dba19d0395",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEkT7QQwIu5ZD1nkT1GeXP2dbxuEpQ+0F+\nmtBmg8avoZS2j7gNbvJhtaY7V/hx0upyJDGfX6PtPdd/EBLboZ0DlQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 342,
+          "comment" : "r,s are large",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04644cc54e84467213fafe2a4451dba550f3ea76ea9970bd6251fc7783a420d8b51cd9439155ec45d5634677c281154bbdf99fe44051dcec322053ca69ea88297c",
+        "wx" : "644cc54e84467213fafe2a4451dba550f3ea76ea9970bd6251fc7783a420d8b5",
+        "wy" : "1cd9439155ec45d5634677c281154bbdf99fe44051dcec322053ca69ea88297c"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004644cc54e84467213fafe2a4451dba550f3ea76ea9970bd6251fc7783a420d8b51cd9439155ec45d5634677c281154bbdf99fe44051dcec322053ca69ea88297c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEZEzFToRGchP6/ipEUdulUPPqduqZcL1i\nUfx3g6Qg2LUc2UORVexF1WNGd8KBFUu9+Z/kQFHc7DIgU8pp6ogpfA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 343,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02203e9a7582886089c62fb840cf3b83061cd1cff3ae4341808bb5bdee6191174177",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040a11d42154bd2de10ca92321fb6b3e638ee8b5a7fb4fb5f501b44515cf60e8c906ccaab8748cd38ece73ddc975bc307e7de172357e14cd96a94bb3461d32d50e",
+        "wx" : "0a11d42154bd2de10ca92321fb6b3e638ee8b5a7fb4fb5f501b44515cf60e8c9",
+        "wy" : "6ccaab8748cd38ece73ddc975bc307e7de172357e14cd96a94bb3461d32d50e"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200040a11d42154bd2de10ca92321fb6b3e638ee8b5a7fb4fb5f501b44515cf60e8c906ccaab8748cd38ece73ddc975bc307e7de172357e14cd96a94bb3461d32d50e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEChHUIVS9LeEMqSMh+2s+Y47otaf7T7X1\nAbRFFc9g6MkGzKq4dIzTjs5z3cl1vDB+feFyNX4UzZapS7NGHTLVDg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 344,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022024238e70b431b1a64efdf9032669939d4b77f249503fc6905feb7540dea3e6d2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049fa2c32bb349846acb5af14e1c67acfdd8963ed251c4b5783cad4bcdd0fd505d6f724937217d1e5483920405cf1b20200797521c464a2355fdde5306f2a9e448",
+        "wx" : "09fa2c32bb349846acb5af14e1c67acfdd8963ed251c4b5783cad4bcdd0fd505d",
+        "wy" : "6f724937217d1e5483920405cf1b20200797521c464a2355fdde5306f2a9e448"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200049fa2c32bb349846acb5af14e1c67acfdd8963ed251c4b5783cad4bcdd0fd505d6f724937217d1e5483920405cf1b20200797521c464a2355fdde5306f2a9e448",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEn6LDK7NJhGrLWvFOHGes/diWPtJRxLV4\nPK1LzdD9UF1vckk3IX0eVIOSBAXPGyAgB5dSHEZKI1X93lMG8qnkSA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 345,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0460eace95001201cf4c83b580fb698bb6abf446e5c56ff945eb5769b1a477b55069f5354a77fe2d601528f126c9a6858deeddb9e5ec408356d05ed5c80d62b8e1",
+        "wx" : "60eace95001201cf4c83b580fb698bb6abf446e5c56ff945eb5769b1a477b550",
+        "wy" : "69f5354a77fe2d601528f126c9a6858deeddb9e5ec408356d05ed5c80d62b8e1"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000460eace95001201cf4c83b580fb698bb6abf446e5c56ff945eb5769b1a477b55069f5354a77fe2d601528f126c9a6858deeddb9e5ec408356d05ed5c80d62b8e1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEYOrOlQASAc9Mg7WA+2mLtqv0RuXFb/lF\n61dpsaR3tVBp9TVKd/4tYBUo8SbJpoWN7t255exAg1bQXtXIDWK44Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 346,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020102",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f1a57d9346842310975ed356672a48a06a70b5efbc0c23287c9b9952ec955b330091aee1224ecd69791856c521b12df172b45a5ce247e6dcaca7349684278f23",
+        "wx" : "0f1a57d9346842310975ed356672a48a06a70b5efbc0c23287c9b9952ec955b33",
+        "wy" : "091aee1224ecd69791856c521b12df172b45a5ce247e6dcaca7349684278f23"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004f1a57d9346842310975ed356672a48a06a70b5efbc0c23287c9b9952ec955b330091aee1224ecd69791856c521b12df172b45a5ce247e6dcaca7349684278f23",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE8aV9k0aEIxCXXtNWZypIoGpwte+8DCMo\nfJuZUuyVWzMAka7hIk7NaXkYVsUhsS3xcrRaXOJH5tyspzSWhCePIw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 347,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020103",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 348,
+          "comment" : "r is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142020103",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04968a493f279c0f8ea9f2446e361ee5b9757039d57a8003e6fd731d4dc6a2d2ca6784c5484fe797c830aa49a72cf85375523228393b730b20b04a192032af4d29",
+        "wx" : "0968a493f279c0f8ea9f2446e361ee5b9757039d57a8003e6fd731d4dc6a2d2ca",
+        "wy" : "6784c5484fe797c830aa49a72cf85375523228393b730b20b04a192032af4d29"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004968a493f279c0f8ea9f2446e361ee5b9757039d57a8003e6fd731d4dc6a2d2ca6784c5484fe797c830aa49a72cf85375523228393b730b20b04a192032af4d29",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAElopJPyecD46p8kRuNh7luXVwOdV6gAPm\n/XMdTcai0spnhMVIT+eXyDCqSacs+FN1UjIoOTtzCyCwShkgMq9NKQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 349,
+          "comment" : "s is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd04917c8",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b3c7fbdf1d7472f7bd578757762c8ebc922ff063b0ae9c3aa9cd81600abea76c038eeb3852b836c0649fd82fe5d1d02c3d0dbb30fbcd7fe41866ebc3bd927c69",
+        "wx" : "0b3c7fbdf1d7472f7bd578757762c8ebc922ff063b0ae9c3aa9cd81600abea76c",
+        "wy" : "38eeb3852b836c0649fd82fe5d1d02c3d0dbb30fbcd7fe41866ebc3bd927c69"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b3c7fbdf1d7472f7bd578757762c8ebc922ff063b0ae9c3aa9cd81600abea76c038eeb3852b836c0649fd82fe5d1d02c3d0dbb30fbcd7fe41866ebc3bd927c69",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEs8f73x10cve9V4dXdiyOvJIv8GOwrpw6\nqc2BYAq+p2wDjus4Urg2wGSf2C/l0dAsPQ27MPvNf+QYZuvDvZJ8aQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 350,
+          "comment" : "small r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302702020101022100c58b162c58b162c58b162c58b162c58a1b242973853e16db75c8a1a71da4d39d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04759fdd1a64c000188b87eb0ddd291a50358fca2b0a5b92f027573845dc40b27a12ec1b2892ef46700f13cff8eb88f40076cc811478b008f5aabee4a74b4546f1",
+        "wx" : "759fdd1a64c000188b87eb0ddd291a50358fca2b0a5b92f027573845dc40b27a",
+        "wy" : "12ec1b2892ef46700f13cff8eb88f40076cc811478b008f5aabee4a74b4546f1"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004759fdd1a64c000188b87eb0ddd291a50358fca2b0a5b92f027573845dc40b27a12ec1b2892ef46700f13cff8eb88f40076cc811478b008f5aabee4a74b4546f1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEdZ/dGmTAABiLh+sN3SkaUDWPyisKW5Lw\nJ1c4RdxAsnoS7Bsoku9GcA8Tz/jriPQAdsyBFHiwCPWqvuSnS0VG8Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 351,
+          "comment" : "smallish r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302c02072d9b4d347952cc022100fcbc5103d0da267477d1791461cf2aa44bf9d43198f79507bd8779d69a13108e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044882825a892d30267264e300e868ab5d4b0ffc9ef3c2cb6e90d61d238daed856e4c8248a189eb36d83740f5928cb802fb9c50b5a18c9196344a0c2cb74416423",
+        "wx" : "4882825a892d30267264e300e868ab5d4b0ffc9ef3c2cb6e90d61d238daed856",
+        "wy" : "0e4c8248a189eb36d83740f5928cb802fb9c50b5a18c9196344a0c2cb74416423"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200044882825a892d30267264e300e868ab5d4b0ffc9ef3c2cb6e90d61d238daed856e4c8248a189eb36d83740f5928cb802fb9c50b5a18c9196344a0c2cb74416423",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAESIKCWoktMCZyZOMA6GirXUsP/J7zwstu\nkNYdI42u2FbkyCSKGJ6zbYN0D1koy4AvucULWhjJGWNEoMLLdEFkIw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 352,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "313233343030",
+          "sig" : "3032020d1033e67e37b32b445580bf4efc022100906f906f906f906f906f906f906f906ed8e426f7b1968c35a204236a579723d2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c4d1b1fdf274cf83f3395a70a36c94f7c51f1a31e99514b4ef10ba1304756caf4eaf435b20dd76d6ef447869503da9b28f0ea08edf287424d44aa04b254c1736",
+        "wx" : "0c4d1b1fdf274cf83f3395a70a36c94f7c51f1a31e99514b4ef10ba1304756caf",
+        "wy" : "4eaf435b20dd76d6ef447869503da9b28f0ea08edf287424d44aa04b254c1736"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004c4d1b1fdf274cf83f3395a70a36c94f7c51f1a31e99514b4ef10ba1304756caf4eaf435b20dd76d6ef447869503da9b28f0ea08edf287424d44aa04b254c1736",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAExNGx/fJ0z4PzOVpwo2yU98UfGjHplRS0\n7xC6EwR1bK9Or0NbIN121u9EeGlQPamyjw6gjt8odCTUSqBLJUwXNg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 353,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "313233343030",
+          "sig" : "3026020201010220783266e90f43dafe5cd9b3b0be86de22f9de83677d0f50713a468ec72fcf5d57",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043376df7376d5e651d45b8ec2e5ff9d891c6fdd6dbbb52b046e6b5ac4c9facedf76cf27f9fcb65403b1f585a2dafe26b43ebd622baccde699d81c9be98df9f4df",
+        "wx" : "3376df7376d5e651d45b8ec2e5ff9d891c6fdd6dbbb52b046e6b5ac4c9facedf",
+        "wy" : "76cf27f9fcb65403b1f585a2dafe26b43ebd622baccde699d81c9be98df9f4df"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200043376df7376d5e651d45b8ec2e5ff9d891c6fdd6dbbb52b046e6b5ac4c9facedf76cf27f9fcb65403b1f585a2dafe26b43ebd622baccde699d81c9be98df9f4df",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEM3bfc3bV5lHUW47C5f+diRxv3W27tSsE\nbmtaxMn6zt92zyf5/LZUA7H1haLa/ia0Pr1iK6zN5pnYHJvpjfn03w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 354,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3031020d062522bbd3ecbe7c39e93e7c260220783266e90f43dafe5cd9b3b0be86de22f9de83677d0f50713a468ec72fcf5d57",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045077fdd202fdb4194b05491b6c053fff8760697531fc5227879e9cbec3309585d0b5cffb3e0fdfb1c06e6d11a1182752730cfe439f7a4f8a49b9c2924f49ec14",
+        "wx" : "5077fdd202fdb4194b05491b6c053fff8760697531fc5227879e9cbec3309585",
+        "wy" : "0d0b5cffb3e0fdfb1c06e6d11a1182752730cfe439f7a4f8a49b9c2924f49ec14"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200045077fdd202fdb4194b05491b6c053fff8760697531fc5227879e9cbec3309585d0b5cffb3e0fdfb1c06e6d11a1182752730cfe439f7a4f8a49b9c2924f49ec14",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEUHf90gL9tBlLBUkbbAU//4dgaXUx/FIn\nh56cvsMwlYXQtc/7Pg/fscBubRGhGCdScwz+Q596T4pJucKST0nsFA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 355,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "313233343030",
+          "sig" : "3045022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03640c1022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041b1f773b472dac5e1adf94e69d865b404d2cc92cff7bb66cf2197978f6c45d08a9725791c5f33787977a9ddfa69296be998a968c51ec7f1c5447793bc56286b3",
+        "wx" : "1b1f773b472dac5e1adf94e69d865b404d2cc92cff7bb66cf2197978f6c45d08",
+        "wy" : "0a9725791c5f33787977a9ddfa69296be998a968c51ec7f1c5447793bc56286b3"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200041b1f773b472dac5e1adf94e69d865b404d2cc92cff7bb66cf2197978f6c45d08a9725791c5f33787977a9ddfa69296be998a968c51ec7f1c5447793bc56286b3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEGx93O0ctrF4a35TmnYZbQE0sySz/e7Zs\n8hl5ePbEXQipcleRxfM3h5d6nd+mkpa+mYqWjFHsfxxUR3k7xWKGsw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 356,
+          "comment" : "s == 1",
+          "msg" : "313233343030",
+          "sig" : "3025022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 357,
+          "comment" : "s == 0",
+          "msg" : "313233343030",
+          "sig" : "3025022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042f20bc2232b4ba9d75fea6a92bc827d91c5a8f5c887f4e304d76656ba15999ea5f83242efbd57dd16dbd3de0915bdb2ddec201d2f749b13fc22c223a2644dcdc",
+        "wx" : "2f20bc2232b4ba9d75fea6a92bc827d91c5a8f5c887f4e304d76656ba15999ea",
+        "wy" : "5f83242efbd57dd16dbd3de0915bdb2ddec201d2f749b13fc22c223a2644dcdc"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200042f20bc2232b4ba9d75fea6a92bc827d91c5a8f5c887f4e304d76656ba15999ea5f83242efbd57dd16dbd3de0915bdb2ddec201d2f749b13fc22c223a2644dcdc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELyC8IjK0up11/qapK8gn2Rxaj1yIf04w\nTXZla6FZmepfgyQu+9V90W29PeCRW9st3sIB0vdJsT/CLCI6JkTc3A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 358,
+          "comment" : "point at infinity during verify",
+          "msg" : "313233343030",
+          "sig" : "304402207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044a7217cabc95b496f3f4e12d54e9def7651b866be69d3695cd77ad2e3a3f13d1d0fa71bf21d2c00b1ff4cc76b53a9c5c2a8a8b6b4c2ec88b99ee537ac6262b3d",
+        "wx" : "4a7217cabc95b496f3f4e12d54e9def7651b866be69d3695cd77ad2e3a3f13d1",
+        "wy" : "0d0fa71bf21d2c00b1ff4cc76b53a9c5c2a8a8b6b4c2ec88b99ee537ac6262b3d"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200044a7217cabc95b496f3f4e12d54e9def7651b866be69d3695cd77ad2e3a3f13d1d0fa71bf21d2c00b1ff4cc76b53a9c5c2a8a8b6b4c2ec88b99ee537ac6262b3d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAESnIXyryVtJbz9OEtVOne92UbhmvmnTaV\nzXetLjo/E9HQ+nG/IdLACx/0zHa1OpxcKoqLa0wuyIuZ7lN6xiYrPQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 359,
+          "comment" : "u1 == 1",
+          "msg" : "313233343030",
+          "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400a42e277ce657fb3dd07e135a3cb9b0a75a30bd8b64911606ee68371e56124467cf22e26a7009045b73ff19cd79851cceaad9ae72ef2d043d75365245befa06",
+        "wx" : "0a42e277ce657fb3dd07e135a3cb9b0a75a30bd8b64911606ee68371e561244",
+        "wy" : "67cf22e26a7009045b73ff19cd79851cceaad9ae72ef2d043d75365245befa06"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000400a42e277ce657fb3dd07e135a3cb9b0a75a30bd8b64911606ee68371e56124467cf22e26a7009045b73ff19cd79851cceaad9ae72ef2d043d75365245befa06",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAKQuJ3zmV/s90H4TWjy5sKdaML2LZJEW\nBu5oNx5WEkRnzyLianAJBFtz/xnNeYUczqrZrnLvLQQ9dTZSRb76Bg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 360,
+          "comment" : "u1 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "3045022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022100bc07ff041506dc73a75086a43252fb4270e157da75fb6cb92a9f07dcad153ec0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048520b9502f9a5ed753f09a5282cad721f5ebfb3db4142d667c6279869e76bcf1678e9bbd04a51460afc40a3e0cb7b0f8b8add89b2979758a5a1ffeb4584ee49e",
+        "wx" : "08520b9502f9a5ed753f09a5282cad721f5ebfb3db4142d667c6279869e76bcf1",
+        "wy" : "678e9bbd04a51460afc40a3e0cb7b0f8b8add89b2979758a5a1ffeb4584ee49e"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200048520b9502f9a5ed753f09a5282cad721f5ebfb3db4142d667c6279869e76bcf1678e9bbd04a51460afc40a3e0cb7b0f8b8add89b2979758a5a1ffeb4584ee49e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEhSC5UC+aXtdT8JpSgsrXIfXr+z20FC1m\nfGJ5hp52vPFnjpu9BKUUYK/ECj4Mt7D4uK3Ymyl5dYpaH/60WE7kng==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 361,
+          "comment" : "u2 == 1",
+          "msg" : "313233343030",
+          "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b5deca0fe0296905aac27e3604a95a0a2ecbee9fc453d2e1164632964454d0c94f9e4e85a143ee677d40919c71014e8cabf4d9db7442fe4b96298f99f90ca67f",
+        "wx" : "0b5deca0fe0296905aac27e3604a95a0a2ecbee9fc453d2e1164632964454d0c9",
+        "wy" : "4f9e4e85a143ee677d40919c71014e8cabf4d9db7442fe4b96298f99f90ca67f"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b5deca0fe0296905aac27e3604a95a0a2ecbee9fc453d2e1164632964454d0c94f9e4e85a143ee677d40919c71014e8cabf4d9db7442fe4b96298f99f90ca67f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEtd7KD+ApaQWqwn42BKlaCi7L7p/EU9Lh\nFkYylkRU0MlPnk6FoUPuZ31AkZxxAU6Mq/TZ23RC/kuWKY+Z+Qymfw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 362,
+          "comment" : "u2 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "3045022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b89",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045dcb2767dc851e20911ed7be39dd87ba81c7a6d10255dfb825f241486f98ae10f8a9ef736b3e11d7d54a0e086902fb477246ec8c57de65d336570b65f65e0d83",
+        "wx" : "5dcb2767dc851e20911ed7be39dd87ba81c7a6d10255dfb825f241486f98ae10",
+        "wy" : "0f8a9ef736b3e11d7d54a0e086902fb477246ec8c57de65d336570b65f65e0d83"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200045dcb2767dc851e20911ed7be39dd87ba81c7a6d10255dfb825f241486f98ae10f8a9ef736b3e11d7d54a0e086902fb477246ec8c57de65d336570b65f65e0d83",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEXcsnZ9yFHiCRHte+Od2HuoHHptECVd+4\nJfJBSG+YrhD4qe9zaz4R19VKDghpAvtHckbsjFfeZdM2Vwtl9l4Ngw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 363,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02206bfd55a94e530bd972e52873ef39ac3e56d420a64d874694c701e714511d1696",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c8e144c853a7e1a6f5bbabe7ef91ef5b152113210d44fd58d3cb6185184e168aac40fb3618882193fc6d113760e476465df49067480a0a7cffe686515b3391a8",
+        "wx" : "0c8e144c853a7e1a6f5bbabe7ef91ef5b152113210d44fd58d3cb6185184e168a",
+        "wy" : "0ac40fb3618882193fc6d113760e476465df49067480a0a7cffe686515b3391a8"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004c8e144c853a7e1a6f5bbabe7ef91ef5b152113210d44fd58d3cb6185184e168aac40fb3618882193fc6d113760e476465df49067480a0a7cffe686515b3391a8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEyOFEyFOn4ab1u6vn75HvWxUhEyENRP1Y\n08thhRhOFoqsQPs2GIghk/xtETdg5HZGXfSQZ0gKCnz/5oZRWzORqA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 364,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100b494bd67c209a5adb1c9a09337e2629b03f8a924be53c542478e5864ed2622ad",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047ffe185a23eb5b736704387e6357628a65984985773b4473cf9ef560b3fa50514740cb1217f1ad2b5910d7f74906602b1f9550b3d11cff705b358c3bcbf72c3d",
+        "wx" : "7ffe185a23eb5b736704387e6357628a65984985773b4473cf9ef560b3fa5051",
+        "wy" : "4740cb1217f1ad2b5910d7f74906602b1f9550b3d11cff705b358c3bcbf72c3d"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200047ffe185a23eb5b736704387e6357628a65984985773b4473cf9ef560b3fa50514740cb1217f1ad2b5910d7f74906602b1f9550b3d11cff705b358c3bcbf72c3d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEf/4YWiPrW3NnBDh+Y1diimWYSYV3O0Rz\nz571YLP6UFFHQMsSF/GtK1kQ1/dJBmArH5VQs9Ec/3BbNYw7y/csPQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 365,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100aad4e2b69a9f378dae7873b40f7c15cb4565fcc8cbc0ec55b0bd3fe9d8626b2c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048a858226155e34dbb7e5dac7f13127c81c6ce8c9d891918c67c8738d7e4b46e96c1386e84c612312de53e9e4af34d9bd57f93d9a06b855b6e0b06ad4137ff57c",
+        "wx" : "08a858226155e34dbb7e5dac7f13127c81c6ce8c9d891918c67c8738d7e4b46e9",
+        "wy" : "6c1386e84c612312de53e9e4af34d9bd57f93d9a06b855b6e0b06ad4137ff57c"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200048a858226155e34dbb7e5dac7f13127c81c6ce8c9d891918c67c8738d7e4b46e96c1386e84c612312de53e9e4af34d9bd57f93d9a06b855b6e0b06ad4137ff57c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEioWCJhVeNNu35drH8TEnyBxs6MnYkZGM\nZ8hzjX5LRulsE4boTGEjEt5T6eSvNNm9V/k9mga4VbbgsGrUE3/1fA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 366,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022073fec4995e9d3140bc07ff041506dc7313e95389fb599d22f24039392a4014d3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04aec0be729b02f266c542d139a3e04110c933e8eca1008e8dba38d75e7f8fab532cd688d924b456848bd5c651444c67a9399fdfb5b5b9693162c1728bfadc1046",
+        "wx" : "0aec0be729b02f266c542d139a3e04110c933e8eca1008e8dba38d75e7f8fab53",
+        "wy" : "2cd688d924b456848bd5c651444c67a9399fdfb5b5b9693162c1728bfadc1046"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004aec0be729b02f266c542d139a3e04110c933e8eca1008e8dba38d75e7f8fab532cd688d924b456848bd5c651444c67a9399fdfb5b5b9693162c1728bfadc1046",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAErsC+cpsC8mbFQtE5o+BBEMkz6OyhAI6N\nujjXXn+Pq1Ms1ojZJLRWhIvVxlFETGepOZ/ftbW5aTFiwXKL+twQRg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 367,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100ec4995e9d3140bc07ff041506dc73a73dc25f4257a911e310e38744b482a5a01",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401ed4b5f941f443b31a7e2583ea165551d1815b54740deb12e9fdeff32e2306184385ca448cc5dd71139bda3ab42d0b6e44d719e52fff64d971876efa9109fb2",
+        "wx" : "1ed4b5f941f443b31a7e2583ea165551d1815b54740deb12e9fdeff32e23061",
+        "wy" : "084385ca448cc5dd71139bda3ab42d0b6e44d719e52fff64d971876efa9109fb2"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000401ed4b5f941f443b31a7e2583ea165551d1815b54740deb12e9fdeff32e2306184385ca448cc5dd71139bda3ab42d0b6e44d719e52fff64d971876efa9109fb2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAe1LX5QfRDsxp+JYPqFlVR0YFbVHQN6x\nLp/e/zLiMGGEOFykSMxd1xE5vaOrQtC25E1xnlL/9k2XGHbvqRCfsg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 368,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100d8932bd3a6281780ffe082a0db8e74e8fd9d0b6445d99c265c9e8a09c01e72c1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0459c427cb6525eab511a06e03e00cf2aab4abc587c2601534338a50bc25701a703e4eb388b453cbaea594d6b5c14a519ac3fda770c53580beefc68f09200d55ff",
+        "wx" : "59c427cb6525eab511a06e03e00cf2aab4abc587c2601534338a50bc25701a70",
+        "wy" : "3e4eb388b453cbaea594d6b5c14a519ac3fda770c53580beefc68f09200d55ff"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000459c427cb6525eab511a06e03e00cf2aab4abc587c2601534338a50bc25701a703e4eb388b453cbaea594d6b5c14a519ac3fda770c53580beefc68f09200d55ff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEWcQny2Ul6rURoG4D4AzyqrSrxYfCYBU0\nM4pQvCVwGnA+TrOItFPLrqWU1rXBSlGaw/2ncMU1gL7vxo8JIA1V/w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 369,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02205e9d3140bc07ff041506dc73a75086a3ba176f06c2b6e37363e2ce1c141f3c27",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0404acbbcd23cf2ec819fd297ab2cb5407ede6319518651a391e941cc8003568331206dd00df23bc8ce0b85a018c4b34e9c3b41b4ef59c71492fa62d134772f97e",
+        "wx" : "4acbbcd23cf2ec819fd297ab2cb5407ede6319518651a391e941cc800356833",
+        "wy" : "1206dd00df23bc8ce0b85a018c4b34e9c3b41b4ef59c71492fa62d134772f97e"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000404acbbcd23cf2ec819fd297ab2cb5407ede6319518651a391e941cc8003568331206dd00df23bc8ce0b85a018c4b34e9c3b41b4ef59c71492fa62d134772f97e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEBKy7zSPPLsgZ/Sl6sstUB+3mMZUYZRo5\nHpQcyAA1aDMSBt0A3yO8jOC4WgGMSzTpw7QbTvWccUkvpi0TR3L5fg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 370,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100fd6dc71a71f1d50d1bbd976af4357be4dd2fe850707c431fd376e53d176c6b62",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ccacbc626fd6ea31175815cff958ca1637323877d3bdf09896b527bf4e255e8571f8a27e6309bd9b9b15d78d5270012ad2ed15a7fffe024fc0eca63fb6ac2f8d",
+        "wx" : "0ccacbc626fd6ea31175815cff958ca1637323877d3bdf09896b527bf4e255e85",
+        "wy" : "71f8a27e6309bd9b9b15d78d5270012ad2ed15a7fffe024fc0eca63fb6ac2f8d"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004ccacbc626fd6ea31175815cff958ca1637323877d3bdf09896b527bf4e255e8571f8a27e6309bd9b9b15d78d5270012ad2ed15a7fffe024fc0eca63fb6ac2f8d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEzKy8Ym/W6jEXWBXP+VjKFjcyOHfTvfCY\nlrUnv04lXoVx+KJ+Ywm9m5sV141ScAEq0u0Vp//+Ak/A7KY/tqwvjQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 371,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02207ee75ad2a5801c54722eb7d95ba67febcfc399b956b7b682fe89638de3690bf1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ccc30b65cad3dd1d793b6db80f57b2e1237973e4264c3d9bbc2551ec68a0b7be75ff6d1f4f535a131aa573f6e2d6912c397154933750417d28e46524392592de",
+        "wx" : "0ccc30b65cad3dd1d793b6db80f57b2e1237973e4264c3d9bbc2551ec68a0b7be",
+        "wy" : "75ff6d1f4f535a131aa573f6e2d6912c397154933750417d28e46524392592de"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004ccc30b65cad3dd1d793b6db80f57b2e1237973e4264c3d9bbc2551ec68a0b7be75ff6d1f4f535a131aa573f6e2d6912c397154933750417d28e46524392592de",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEzMMLZcrT3R15O224D1ey4SN5c+QmTD2b\nvCVR7Gigt751/20fT1NaExqlc/bi1pEsOXFUkzdQQX0o5GUkOSWS3g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 372,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100f533776f11c47ed0a7b5e25ace7a3b921866733c7454b2c678b8943dfb4cf232",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cc9349aca0cbd0b2df0deecd88ed39e6d8c7c3d7b422fd5d92431baf7225fcc0ed494be698d6f3850be277c268792400f396025cfa95cf56018bcbc243e512eb",
+        "wx" : "0cc9349aca0cbd0b2df0deecd88ed39e6d8c7c3d7b422fd5d92431baf7225fcc0",
+        "wy" : "0ed494be698d6f3850be277c268792400f396025cfa95cf56018bcbc243e512eb"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004cc9349aca0cbd0b2df0deecd88ed39e6d8c7c3d7b422fd5d92431baf7225fcc0ed494be698d6f3850be277c268792400f396025cfa95cf56018bcbc243e512eb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEzJNJrKDL0LLfDe7NiO055tjHw9e0Iv1d\nkkMbr3Il/MDtSUvmmNbzhQvid8JoeSQA85YCXPqVz1YBi8vCQ+US6w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 373,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100e8dbffee01807d75f9aa52c295e15b15f138439e7a195a40709b1abf511dbc6a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04000e7c30d2f259f7c13f194320e43905d0ead7277e283e8918437c10f9d052b02b39b66dbba2b1cf5dac1b41d2dec6f1fb08bdd14d420d703986f63aedeb5c47",
+        "wx" : "0e7c30d2f259f7c13f194320e43905d0ead7277e283e8918437c10f9d052b0",
+        "wy" : "2b39b66dbba2b1cf5dac1b41d2dec6f1fb08bdd14d420d703986f63aedeb5c47"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004000e7c30d2f259f7c13f194320e43905d0ead7277e283e8918437c10f9d052b02b39b66dbba2b1cf5dac1b41d2dec6f1fb08bdd14d420d703986f63aedeb5c47",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAA58MNLyWffBPxlDIOQ5BdDq1yd+KD6J\nGEN8EPnQUrArObZtu6Kxz12sG0HS3sbx+wi90U1CDXA5hvY67etcRw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 374,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100ca01552b58d67a13468d6bc6086329df8f44cc938884fcf15c516b02a7a7b5f6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048fa298c00ac93f7c36892c5299005a0f6843f9cf0669fdbb7d6d81e0341803ed4cab33cc2821b2da849f90ef20dc1eb896fc67161440b3c52c0b1e88627e508c",
+        "wx" : "08fa298c00ac93f7c36892c5299005a0f6843f9cf0669fdbb7d6d81e0341803ed",
+        "wy" : "4cab33cc2821b2da849f90ef20dc1eb896fc67161440b3c52c0b1e88627e508c"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200048fa298c00ac93f7c36892c5299005a0f6843f9cf0669fdbb7d6d81e0341803ed4cab33cc2821b2da849f90ef20dc1eb896fc67161440b3c52c0b1e88627e508c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEj6KYwArJP3w2iSxSmQBaD2hD+c8Gaf27\nfW2B4DQYA+1MqzPMKCGy2oSfkO8g3B64lvxnFhRAs8UsCx6IYn5QjA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 375,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0221009402aa56b1acf4268d1ad78c10c653c063dabc4061c159a6f8d077787f192aab",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046fbf608a83e37ec26b37da033e069816680b770ba766fb8c44fce003960562f1045f268ccc5e0949213f7f2f1fa57cfead04625ec3ccfc9c333596e487b2056f",
+        "wx" : "6fbf608a83e37ec26b37da033e069816680b770ba766fb8c44fce003960562f1",
+        "wy" : "45f268ccc5e0949213f7f2f1fa57cfead04625ec3ccfc9c333596e487b2056f"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200046fbf608a83e37ec26b37da033e069816680b770ba766fb8c44fce003960562f1045f268ccc5e0949213f7f2f1fa57cfead04625ec3ccfc9c333596e487b2056f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEb79gioPjfsJrN9oDPgaYFmgLdwunZvuM\nRPzgA5YFYvEEXyaMzF4JSSE/fy8fpXz+rQRiXsPM/JwzNZbkh7IFbw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 376,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02205e03ff820a836e39d3a8435219297da13870abed3afdb65c954f83ee568a9f60",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c4dd547ad750174179bac8b8ce27481c58b81347776220a1b52ada13d65c8124f9c2ef3b5b4957cf69d3a139891682363c040610f200f4c318e59aa68f298af0",
+        "wx" : "0c4dd547ad750174179bac8b8ce27481c58b81347776220a1b52ada13d65c8124",
+        "wy" : "0f9c2ef3b5b4957cf69d3a139891682363c040610f200f4c318e59aa68f298af0"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004c4dd547ad750174179bac8b8ce27481c58b81347776220a1b52ada13d65c8124f9c2ef3b5b4957cf69d3a139891682363c040610f200f4c318e59aa68f298af0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAExN1UetdQF0F5usi4zidIHFi4E0d3YiCh\ntSraE9ZcgST5wu87W0lXz2nToTmJFoI2PAQGEPIA9MMY5ZqmjymK8A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 377,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0220556a715b4d4f9bc6d73c39da07be0ae5a2b2fe6465e0762ad85e9ff4ec313596",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400055d79fb26286bb6289a7983a2b23bf5c30cc3d70363b559adf5548af991f8cae8b1b0ace32fd74a86ee1a671cc36c052a4796eae323be32e02ce9a0fb6227",
+        "wx" : "55d79fb26286bb6289a7983a2b23bf5c30cc3d70363b559adf5548af991f8",
+        "wy" : "0cae8b1b0ace32fd74a86ee1a671cc36c052a4796eae323be32e02ce9a0fb6227"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000400055d79fb26286bb6289a7983a2b23bf5c30cc3d70363b559adf5548af991f8cae8b1b0ace32fd74a86ee1a671cc36c052a4796eae323be32e02ce9a0fb6227",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAAVdefsmKGu2KJp5g6KyO/XDDMPXA2O1\nWa31VIr5kfjK6LGwrOMv10qG7hpnHMNsBSpHlurjI74y4CzpoPtiJw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 378,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100d55555555555555555555555555555547c74934474db157d2a8c3f088aced62a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040db51c74d34e41baba67c13a60af404ee82d8f1b0386b09696ee1e6ea1327b86413886c4623fc222a6950c3c3a09f3fd867a566bfd345e06b09ec6c5c2e4a192",
+        "wx" : "0db51c74d34e41baba67c13a60af404ee82d8f1b0386b09696ee1e6ea1327b86",
+        "wy" : "413886c4623fc222a6950c3c3a09f3fd867a566bfd345e06b09ec6c5c2e4a192"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200040db51c74d34e41baba67c13a60af404ee82d8f1b0386b09696ee1e6ea1327b86413886c4623fc222a6950c3c3a09f3fd867a566bfd345e06b09ec6c5c2e4a192",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEDbUcdNNOQbq6Z8E6YK9ATugtjxsDhrCW\nlu4ebqEye4ZBOIbEYj/CIqaVDDw6CfP9hnpWa/00XgawnsbFwuShkg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 379,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100c1777c8853938e536213c02464a936000ba1e21c0fc62075d46c624e23b52f31",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bc2f7bc74cb3bc7e797b06cc3e649bf3407d1a55b4eaaddd28d3dcfaff2c3737a23bb364e16ac79398c013ce29a22e762c0d6067aaefda958474aad194a92e8a",
+        "wx" : "0bc2f7bc74cb3bc7e797b06cc3e649bf3407d1a55b4eaaddd28d3dcfaff2c3737",
+        "wy" : "0a23bb364e16ac79398c013ce29a22e762c0d6067aaefda958474aad194a92e8a"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004bc2f7bc74cb3bc7e797b06cc3e649bf3407d1a55b4eaaddd28d3dcfaff2c3737a23bb364e16ac79398c013ce29a22e762c0d6067aaefda958474aad194a92e8a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEvC97x0yzvH55ewbMPmSb80B9GlW06q3d\nKNPc+v8sNzeiO7Nk4WrHk5jAE84poi52LA1gZ6rv2pWEdKrRlKkuig==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 380,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022030bbb794db588363b40679f6c182a50d3ce9679acdd3ffbe36d7813dacbdc818",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d7edc7c645efff6af8821aea5b7f969f56ef6e615862b08fba3eaf0111c06f67e47fd0da61682adcc405f329148bf1c35b89cb5ec5a9ed0d98a410e261a6b41a",
+        "wx" : "0d7edc7c645efff6af8821aea5b7f969f56ef6e615862b08fba3eaf0111c06f67",
+        "wy" : "0e47fd0da61682adcc405f329148bf1c35b89cb5ec5a9ed0d98a410e261a6b41a"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d7edc7c645efff6af8821aea5b7f969f56ef6e615862b08fba3eaf0111c06f67e47fd0da61682adcc405f329148bf1c35b89cb5ec5a9ed0d98a410e261a6b41a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE1+3HxkXv/2r4ghrqW3+Wn1bvbmFYYrCP\nuj6vARHAb2fkf9DaYWgq3MQF8ykUi/HDW4nLXsWp7Q2YpBDiYaa0Gg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 381,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202c37fd995622c4fb7fffffffffffffffc7cee745110cb45ab558ed7c90c15a2f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046bfd7ad01b5dcfb04de464083d3ca7ef5054506111df92ef02ff7690d9a6ec9306c469fe4c5a1e04f114e193b4bb197de2c8e35089037e5a20275bcf67d9bf73",
+        "wx" : "6bfd7ad01b5dcfb04de464083d3ca7ef5054506111df92ef02ff7690d9a6ec93",
+        "wy" : "6c469fe4c5a1e04f114e193b4bb197de2c8e35089037e5a20275bcf67d9bf73"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200046bfd7ad01b5dcfb04de464083d3ca7ef5054506111df92ef02ff7690d9a6ec9306c469fe4c5a1e04f114e193b4bb197de2c8e35089037e5a20275bcf67d9bf73",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEa/160Btdz7BN5GQIPTyn71BUUGER35Lv\nAv92kNmm7JMGxGn+TFoeBPEU4ZO0uxl94sjjUIkDflogJ1vPZ9m/cw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 382,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02207fd995622c4fb7ffffffffffffffffff5d883ffab5b32652ccdcaa290fccb97d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048a9076c923021d5c5ef85894176ebb5c3a74aba75b3944c96f17debc2173ba99e5601d115bf08d37ae115c4d186bc21127bbfb21d0629bde27a16e9ed721b740",
+        "wx" : "08a9076c923021d5c5ef85894176ebb5c3a74aba75b3944c96f17debc2173ba99",
+        "wy" : "0e5601d115bf08d37ae115c4d186bc21127bbfb21d0629bde27a16e9ed721b740"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200048a9076c923021d5c5ef85894176ebb5c3a74aba75b3944c96f17debc2173ba99e5601d115bf08d37ae115c4d186bc21127bbfb21d0629bde27a16e9ed721b740",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEipB2ySMCHVxe+FiUF267XDp0q6dbOUTJ\nbxfevCFzupnlYB0RW/CNN64RXE0Ya8IRJ7v7IdBim94noW6e1yG3QA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 383,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100ffb32ac4589f6ffffffffffffffffffebb107ff56b664ca599b954521f9972fa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040fec6a85e077ef4240b98c62ab3b93e2cebcad0ae9617f7b0471504db1f45a65245a5fd0ad7a6d854125ed76d4787f77cc1983eca8c6ba8c019523a088c4d0f3",
+        "wx" : "0fec6a85e077ef4240b98c62ab3b93e2cebcad0ae9617f7b0471504db1f45a65",
+        "wy" : "245a5fd0ad7a6d854125ed76d4787f77cc1983eca8c6ba8c019523a088c4d0f3"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200040fec6a85e077ef4240b98c62ab3b93e2cebcad0ae9617f7b0471504db1f45a65245a5fd0ad7a6d854125ed76d4787f77cc1983eca8c6ba8c019523a088c4d0f3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAED+xqheB370JAuYxiqzuT4s68rQrpYX97\nBHFQTbH0WmUkWl/QrXpthUEl7XbUeH93zBmD7KjGuowBlSOgiMTQ8w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 384,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02205622c4fb7fffffffffffffffffffffff928a8f1c7ac7bec1808b9f61c01ec327",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d3ab94d8704fb51774dcc3838ad9703071e0851de9b2d6ca74ccd79b855581914e4979b67f377419e5a9d4f03012b7e75656556f23756d4dbee145834c8279ef",
+        "wx" : "0d3ab94d8704fb51774dcc3838ad9703071e0851de9b2d6ca74ccd79b85558191",
+        "wy" : "4e4979b67f377419e5a9d4f03012b7e75656556f23756d4dbee145834c8279ef"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d3ab94d8704fb51774dcc3838ad9703071e0851de9b2d6ca74ccd79b855581914e4979b67f377419e5a9d4f03012b7e75656556f23756d4dbee145834c8279ef",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE06uU2HBPtRd03MODitlwMHHghR3pstbK\ndMzXm4VVgZFOSXm2fzd0GeWp1PAwErfnVlZVbyN1bU2+4UWDTIJ57w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 385,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022044104104104104104104104104104103b87853fd3b7d3f8e175125b4382f25ed",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0449e13cd44c8b8350a5eaca2181bf96db120b768bde8800f379f43e9198333c75030ad9fb4b0b233bdc10ca0dc4c2134b18b691e46c7151e3573aa2b62891e69d",
+        "wx" : "49e13cd44c8b8350a5eaca2181bf96db120b768bde8800f379f43e9198333c75",
+        "wy" : "30ad9fb4b0b233bdc10ca0dc4c2134b18b691e46c7151e3573aa2b62891e69d"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000449e13cd44c8b8350a5eaca2181bf96db120b768bde8800f379f43e9198333c75030ad9fb4b0b233bdc10ca0dc4c2134b18b691e46c7151e3573aa2b62891e69d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAESeE81EyLg1Cl6sohgb+W2xILdoveiADz\nefQ+kZgzPHUDCtn7SwsjO9wQyg3EwhNLGLaR5GxxUeNXOqK2KJHmnQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 386,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202739ce739ce739ce739ce739ce739ce705560298d1f2f08dc419ac273a5b54d9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044574fd94ad03828588cb0bc2d434842ee093efe639015cc107d1ea3710f2112d1786d6ef1d411cbd1af5b5ee8845993e738fb64519b4329d04be21f7902a1c1d",
+        "wx" : "4574fd94ad03828588cb0bc2d434842ee093efe639015cc107d1ea3710f2112d",
+        "wy" : "1786d6ef1d411cbd1af5b5ee8845993e738fb64519b4329d04be21f7902a1c1d"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200044574fd94ad03828588cb0bc2d434842ee093efe639015cc107d1ea3710f2112d1786d6ef1d411cbd1af5b5ee8845993e738fb64519b4329d04be21f7902a1c1d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAERXT9lK0DgoWIywvC1DSELuCT7+Y5AVzB\nB9HqNxDyES0XhtbvHUEcvRr1te6IRZk+c4+2RRm0Mp0EviH3kCocHQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 387,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100b777777777777777777777777777777688e6a1fe808a97a348671222ff16b863",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ee824d818768f13fa0eb908e396ea1c56b11774ce69d01e563aa36bb41d6371c990291ce2abc55bb6682d502ae0129e7c57e146e96d44757daaa1f94c93e0b17",
+        "wx" : "0ee824d818768f13fa0eb908e396ea1c56b11774ce69d01e563aa36bb41d6371c",
+        "wy" : "0990291ce2abc55bb6682d502ae0129e7c57e146e96d44757daaa1f94c93e0b17"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004ee824d818768f13fa0eb908e396ea1c56b11774ce69d01e563aa36bb41d6371c990291ce2abc55bb6682d502ae0129e7c57e146e96d44757daaa1f94c93e0b17",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE7oJNgYdo8T+g65COOW6hxWsRd0zmnQHl\nY6o2u0HWNxyZApHOKrxVu2aC1QKuASnnxX4UbpbUR1faqh+UyT4LFw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 388,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02206492492492492492492492492492492406dd3a19b8d5fb875235963c593bd2d3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044825ee46b2d21564726a32a922f5e3f2da6098f780e1f15c6bf1640669c41fe7292c066a24f0f450c2603f1837210898f8e80fa384aaf077eb5c7e87c6b26976",
+        "wx" : "4825ee46b2d21564726a32a922f5e3f2da6098f780e1f15c6bf1640669c41fe7",
+        "wy" : "292c066a24f0f450c2603f1837210898f8e80fa384aaf077eb5c7e87c6b26976"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200044825ee46b2d21564726a32a922f5e3f2da6098f780e1f15c6bf1640669c41fe7292c066a24f0f450c2603f1837210898f8e80fa384aaf077eb5c7e87c6b26976",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAESCXuRrLSFWRyajKpIvXj8tpgmPeA4fFc\na/FkBmnEH+cpLAZqJPD0UMJgPxg3IQiY+OgPo4Sq8HfrXH6HxrJpdg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 389,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100955555555555555555555555555555547c74934474db157d2a8c3f088aced62c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0441348e7ac18eb1f4852801467bb0a0e36209321a8af4b410fd06f070a81f5de603b5594f1a5a79d23089e49e3e379f2a6cb14f92301c6999e510b8c8dc37fb4b",
+        "wx" : "41348e7ac18eb1f4852801467bb0a0e36209321a8af4b410fd06f070a81f5de6",
+        "wy" : "3b5594f1a5a79d23089e49e3e379f2a6cb14f92301c6999e510b8c8dc37fb4b"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000441348e7ac18eb1f4852801467bb0a0e36209321a8af4b410fd06f070a81f5de603b5594f1a5a79d23089e49e3e379f2a6cb14f92301c6999e510b8c8dc37fb4b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEQTSOesGOsfSFKAFGe7Cg42IJMhqK9LQQ\n/QbwcKgfXeYDtVlPGlp50jCJ5J4+N58qbLFPkjAcaZnlELjI3Df7Sw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 390,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3e3a49a23a6d8abe95461f8445676b17",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04753c74e5a36e1a4b61be7787202c98e05841fea2b0392b6ab69ee2e8a747e2b618971da1c85825c1d8141886115d27cb2add86545e6971bb835a2f452cde1e52",
+        "wx" : "753c74e5a36e1a4b61be7787202c98e05841fea2b0392b6ab69ee2e8a747e2b6",
+        "wy" : "18971da1c85825c1d8141886115d27cb2add86545e6971bb835a2f452cde1e52"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004753c74e5a36e1a4b61be7787202c98e05841fea2b0392b6ab69ee2e8a747e2b618971da1c85825c1d8141886115d27cb2add86545e6971bb835a2f452cde1e52",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEdTx05aNuGkthvneHICyY4FhB/qKwOStq\ntp7i6KdH4rYYlx2hyFglwdgUGIYRXSfLKt2GVF5pcbuDWi9FLN4eUg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 391,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100bffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364143",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0449c0254724576b0949827ce46240d90cb4075cd1978a416495a455f06a895504df7d64c35853353bd4d905da6adb88f26e62a5f20b3cd6382adf2c5a42d85053",
+        "wx" : "49c0254724576b0949827ce46240d90cb4075cd1978a416495a455f06a895504",
+        "wy" : "0df7d64c35853353bd4d905da6adb88f26e62a5f20b3cd6382adf2c5a42d85053"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000449c0254724576b0949827ce46240d90cb4075cd1978a416495a455f06a895504df7d64c35853353bd4d905da6adb88f26e62a5f20b3cd6382adf2c5a42d85053",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEScAlRyRXawlJgnzkYkDZDLQHXNGXikFk\nlaRV8GqJVQTffWTDWFM1O9TZBdpq24jybmKl8gs81jgq3yxaQthQUw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 392,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0220185ddbca6dac41b1da033cfb60c152869e74b3cd66e9ffdf1b6bc09ed65ee40c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b05e98e84e2c19743c1dcf4e0ddf0bb1f32854033de63fcf3e605fbb2ed94cb1871d7415d5f6c57c840678f7e1a1c1e323519a4647fb3f6f52abb4647b9b6d70",
+        "wx" : "0b05e98e84e2c19743c1dcf4e0ddf0bb1f32854033de63fcf3e605fbb2ed94cb1",
+        "wy" : "0871d7415d5f6c57c840678f7e1a1c1e323519a4647fb3f6f52abb4647b9b6d70"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b05e98e84e2c19743c1dcf4e0ddf0bb1f32854033de63fcf3e605fbb2ed94cb1871d7415d5f6c57c840678f7e1a1c1e323519a4647fb3f6f52abb4647b9b6d70",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEsF6Y6E4sGXQ8Hc9ODd8LsfMoVAM95j/P\nPmBfuy7ZTLGHHXQV1fbFfIQGePfhocHjI1GaRkf7P29Sq7Rke5ttcA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 393,
+          "comment" : "point duplication during verification",
+          "msg" : "313233343030",
+          "sig" : "3044022032b0d10d8d0e04bc8d4d064d270699e87cffc9b49c5c20730e1c26f6105ddcda02206fd848306e968e3ac1f6e443577c47a3c20bf0d01a5dc39c78c2c69d681850f4",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b05e98e84e2c19743c1dcf4e0ddf0bb1f32854033de63fcf3e605fbb2ed94cb178e28bea2a093a837bf987081e5e3e1cdcae65b9b804c090ad544b9a84648ebf",
+        "wx" : "0b05e98e84e2c19743c1dcf4e0ddf0bb1f32854033de63fcf3e605fbb2ed94cb1",
+        "wy" : "78e28bea2a093a837bf987081e5e3e1cdcae65b9b804c090ad544b9a84648ebf"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b05e98e84e2c19743c1dcf4e0ddf0bb1f32854033de63fcf3e605fbb2ed94cb178e28bea2a093a837bf987081e5e3e1cdcae65b9b804c090ad544b9a84648ebf",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEsF6Y6E4sGXQ8Hc9ODd8LsfMoVAM95j/P\nPmBfuy7ZTLF44ovqKgk6g3v5hwgeXj4c3K5lubgEwJCtVEuahGSOvw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 394,
+          "comment" : "duplication bug",
+          "msg" : "313233343030",
+          "sig" : "3044022032b0d10d8d0e04bc8d4d064d270699e87cffc9b49c5c20730e1c26f6105ddcda02206fd848306e968e3ac1f6e443577c47a3c20bf0d01a5dc39c78c2c69d681850f4",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a49f9ebc082c064d61c0eab5f8bf23207b06e3a689dfc4fa2896ed114d1a88ab55783a6baf9401977d117ccb748c0d5c24a5d3bd2133d62c74de2be7cc7d9d40",
+        "wx" : "0a49f9ebc082c064d61c0eab5f8bf23207b06e3a689dfc4fa2896ed114d1a88ab",
+        "wy" : "55783a6baf9401977d117ccb748c0d5c24a5d3bd2133d62c74de2be7cc7d9d40"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004a49f9ebc082c064d61c0eab5f8bf23207b06e3a689dfc4fa2896ed114d1a88ab55783a6baf9401977d117ccb748c0d5c24a5d3bd2133d62c74de2be7cc7d9d40",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEpJ+evAgsBk1hwOq1+L8jIHsG46aJ38T6\nKJbtEU0aiKtVeDprr5QBl30RfMt0jA1cJKXTvSEz1ix03ivnzH2dQA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 395,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "313233343030",
+          "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0022033333333333333333333333333333332f222f8faefdb533f265d461c29a47373",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f9567a431b716388428510393b37feefd3afcfc6dc3881f623c0a0995e461ec3fba2f910ced19f8e789b158390a295e636c588c622d54f8feffbd2852e2911a9",
+        "wx" : "0f9567a431b716388428510393b37feefd3afcfc6dc3881f623c0a0995e461ec3",
+        "wy" : "0fba2f910ced19f8e789b158390a295e636c588c622d54f8feffbd2852e2911a9"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004f9567a431b716388428510393b37feefd3afcfc6dc3881f623c0a0995e461ec3fba2f910ced19f8e789b158390a295e636c588c622d54f8feffbd2852e2911a9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE+VZ6QxtxY4hChRA5Ozf+79Ovz8bcOIH2\nI8CgmV5GHsP7ovkQztGfjnibFYOQopXmNsWIxiLVT4/v+9KFLikRqQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 396,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0426095ef93b10bf50fe283f4c99136fb81fa297814f09977e8e38a3bfb837f61baf8d7cfc46c1928624f201ed14a70701bc5531bff4e2e578d5c92dabddbc7580",
+        "wx" : "26095ef93b10bf50fe283f4c99136fb81fa297814f09977e8e38a3bfb837f61b",
+        "wy" : "0af8d7cfc46c1928624f201ed14a70701bc5531bff4e2e578d5c92dabddbc7580"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000426095ef93b10bf50fe283f4c99136fb81fa297814f09977e8e38a3bfb837f61baf8d7cfc46c1928624f201ed14a70701bc5531bff4e2e578d5c92dabddbc7580",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEJgle+TsQv1D+KD9MmRNvuB+il4FPCZd+\njjijv7g39huvjXz8RsGShiTyAe0UpwcBvFUxv/Ti5XjVyS2r3bx1gA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 397,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3046022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022100b6db6db6db6db6db6db6db6db6db6db5f30f30127d33e02aad96438927022e9c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047a4b58ee76d461a1c3cde68400a0bbeeab346ee69315bed63f1700c66cf5e6cca642ae4078bb6bbbb76028977882e9c8374f267a2ced131029ae89560ce29825",
+        "wx" : "7a4b58ee76d461a1c3cde68400a0bbeeab346ee69315bed63f1700c66cf5e6cc",
+        "wy" : "0a642ae4078bb6bbbb76028977882e9c8374f267a2ced131029ae89560ce29825"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200047a4b58ee76d461a1c3cde68400a0bbeeab346ee69315bed63f1700c66cf5e6cca642ae4078bb6bbbb76028977882e9c8374f267a2ced131029ae89560ce29825",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEektY7nbUYaHDzeaEAKC77qs0buaTFb7W\nPxcAxmz15symQq5AeLtru7dgKJd4gunIN08meiztExAprolWDOKYJQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 398,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3046022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee502210099999999999999999999999999999998d668eaf0cf91f9bd7317d2547ced5a5a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f2a111eb24c9d280d9a66e4ff18681d222dd6a1828ebc4528f2bebe3e25228a1a0699bcec507fd0ec83da541a5a6143e2e68e4af72fcdcc8a2aea2b17478cc8a",
+        "wx" : "0f2a111eb24c9d280d9a66e4ff18681d222dd6a1828ebc4528f2bebe3e25228a1",
+        "wy" : "0a0699bcec507fd0ec83da541a5a6143e2e68e4af72fcdcc8a2aea2b17478cc8a"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004f2a111eb24c9d280d9a66e4ff18681d222dd6a1828ebc4528f2bebe3e25228a1a0699bcec507fd0ec83da541a5a6143e2e68e4af72fcdcc8a2aea2b17478cc8a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE8qER6yTJ0oDZpm5P8YaB0iLdahgo68RS\njyvr4+JSKKGgaZvOxQf9Dsg9pUGlphQ+Lmjkr3L83MiirqKxdHjMig==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 399,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022066666666666666666666666666666665e445f1f5dfb6a67e4cba8c385348e6e7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e50054b3e4a4d1fef988e5a5e830155abc293fea3598af4c5ddaa10acd111274eb710d1834568cb379a1d1f3d691a8c0dc19f901fe3225c2b6691df5ef5333fe",
+        "wx" : "0e50054b3e4a4d1fef988e5a5e830155abc293fea3598af4c5ddaa10acd111274",
+        "wy" : "0eb710d1834568cb379a1d1f3d691a8c0dc19f901fe3225c2b6691df5ef5333fe"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004e50054b3e4a4d1fef988e5a5e830155abc293fea3598af4c5ddaa10acd111274eb710d1834568cb379a1d1f3d691a8c0dc19f901fe3225c2b6691df5ef5333fe",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE5QBUs+Sk0f75iOWl6DAVWrwpP+o1mK9M\nXdqhCs0REnTrcQ0YNFaMs3mh0fPWkajA3Bn5Af4yJcK2aR3171Mz/g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 400,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022049249249249249249249249249249248c79facd43214c011123c1b03a93412a5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04edc17cd4ca6f9988fda5af4042e3f9eb42d0f7b6a1c0156e1a2af566b78103548a5d357777b306e96405f12e2617c1b29e8d574e5f6d66d1bc8ff7ea7c4b683c",
+        "wx" : "0edc17cd4ca6f9988fda5af4042e3f9eb42d0f7b6a1c0156e1a2af566b7810354",
+        "wy" : "08a5d357777b306e96405f12e2617c1b29e8d574e5f6d66d1bc8ff7ea7c4b683c"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004edc17cd4ca6f9988fda5af4042e3f9eb42d0f7b6a1c0156e1a2af566b78103548a5d357777b306e96405f12e2617c1b29e8d574e5f6d66d1bc8ff7ea7c4b683c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE7cF81MpvmYj9pa9AQuP560LQ97ahwBVu\nGir1ZreBA1SKXTV3d7MG6WQF8S4mF8Gyno1XTl9tZtG8j/fqfEtoPA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 401,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee502200eb10e5ab95f2f275348d82ad2e4d7949c8193800d8c9c75df58e343f0ebba7b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046d267c10d2315b42dbaf34c97c3c0d331fabacaf6021df4dc85b3e9e63dc0798ed154b11fa3a5ed952c14d8a2dd242de2b6cce3c22df42cd97de30054a19555e",
+        "wx" : "6d267c10d2315b42dbaf34c97c3c0d331fabacaf6021df4dc85b3e9e63dc0798",
+        "wy" : "0ed154b11fa3a5ed952c14d8a2dd242de2b6cce3c22df42cd97de30054a19555e"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200046d267c10d2315b42dbaf34c97c3c0d331fabacaf6021df4dc85b3e9e63dc0798ed154b11fa3a5ed952c14d8a2dd242de2b6cce3c22df42cd97de30054a19555e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbSZ8ENIxW0LbrzTJfDwNMx+rrK9gId9N\nyFs+nmPcB5jtFUsR+jpe2VLBTYot0kLeK2zOPCLfQs2X3jAFShlVXg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 402,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c24bf7a984c96ece10077a9def38cbd0d898abd555f1668e06c27cabc00f6f679f69b238e1f95e99e5b558e0036273ebd6c36d12b4515348b85a21f6283f5016",
+        "wx" : "0c24bf7a984c96ece10077a9def38cbd0d898abd555f1668e06c27cabc00f6f67",
+        "wy" : "09f69b238e1f95e99e5b558e0036273ebd6c36d12b4515348b85a21f6283f5016"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004c24bf7a984c96ece10077a9def38cbd0d898abd555f1668e06c27cabc00f6f679f69b238e1f95e99e5b558e0036273ebd6c36d12b4515348b85a21f6283f5016",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEwkv3qYTJbs4QB3qd7zjL0NiYq9VV8WaO\nBsJ8q8APb2efabI44flemeW1WOADYnPr1sNtErRRU0i4WiH2KD9QFg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 403,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3045022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022100b6db6db6db6db6db6db6db6db6db6db5f30f30127d33e02aad96438927022e9c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041cd26d668807c815ed3f532c1db81ac473fb368f0f7ef1aff2592ea6fa6c4624a229b9ab5746cfbc47280c019a4248545354ca20880ff41cac2e252bc9b49704",
+        "wx" : "1cd26d668807c815ed3f532c1db81ac473fb368f0f7ef1aff2592ea6fa6c4624",
+        "wy" : "0a229b9ab5746cfbc47280c019a4248545354ca20880ff41cac2e252bc9b49704"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200041cd26d668807c815ed3f532c1db81ac473fb368f0f7ef1aff2592ea6fa6c4624a229b9ab5746cfbc47280c019a4248545354ca20880ff41cac2e252bc9b49704",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEHNJtZogHyBXtP1MsHbgaxHP7No8PfvGv\n8lkupvpsRiSiKbmrV0bPvEcoDAGaQkhUU1TKIIgP9BysLiUrybSXBA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 404,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3045022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802210099999999999999999999999999999998d668eaf0cf91f9bd7317d2547ced5a5a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fc780777a3289af663fa02b1c262a8373b84614e659c1ab46942f1e058926ff82196c6bcae0b2798298d463be5c87924343d7f103a27131e0c7f4d60d2b5da8c",
+        "wx" : "0fc780777a3289af663fa02b1c262a8373b84614e659c1ab46942f1e058926ff8",
+        "wy" : "2196c6bcae0b2798298d463be5c87924343d7f103a27131e0c7f4d60d2b5da8c"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004fc780777a3289af663fa02b1c262a8373b84614e659c1ab46942f1e058926ff82196c6bcae0b2798298d463be5c87924343d7f103a27131e0c7f4d60d2b5da8c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE/HgHd6MomvZj+gKxwmKoNzuEYU5lnBq0\naULx4FiSb/ghlsa8rgsnmCmNRjvlyHkkND1/EDonEx4Mf01g0rXajA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 405,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022066666666666666666666666666666665e445f1f5dfb6a67e4cba8c385348e6e7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045e25e2ee8af5ef8a3e0908341f9884501fb58a2fd234b1db6f22d561025524f4491d97a7793c9d9a1f35bb35f12121b9dbe075d8501cbd4db6697e3e0ad98bc0",
+        "wx" : "5e25e2ee8af5ef8a3e0908341f9884501fb58a2fd234b1db6f22d561025524f4",
+        "wy" : "491d97a7793c9d9a1f35bb35f12121b9dbe075d8501cbd4db6697e3e0ad98bc0"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200045e25e2ee8af5ef8a3e0908341f9884501fb58a2fd234b1db6f22d561025524f4491d97a7793c9d9a1f35bb35f12121b9dbe075d8501cbd4db6697e3e0ad98bc0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEXiXi7or174o+CQg0H5iEUB+1ii/SNLHb\nbyLVYQJVJPRJHZeneTydmh81uzXxISG52+B12FAcvU22aX4+CtmLwA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 406,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022049249249249249249249249249249248c79facd43214c011123c1b03a93412a5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043ddf2920607df596da90123ea5674958054c8ed7758661b813f1aa30f19778b0707243e1a7bcc264b54289832e950c27563856241b79c243d0fc54f7ad24bc25",
+        "wx" : "3ddf2920607df596da90123ea5674958054c8ed7758661b813f1aa30f19778b0",
+        "wy" : "707243e1a7bcc264b54289832e950c27563856241b79c243d0fc54f7ad24bc25"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200043ddf2920607df596da90123ea5674958054c8ed7758661b813f1aa30f19778b0707243e1a7bcc264b54289832e950c27563856241b79c243d0fc54f7ad24bc25",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEPd8pIGB99ZbakBI+pWdJWAVMjtd1hmG4\nE/GqMPGXeLBwckPhp7zCZLVCiYMulQwnVjhWJBt5wkPQ/FT3rSS8JQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 407,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802200eb10e5ab95f2f275348d82ad2e4d7949c8193800d8c9c75df58e343f0ebba7b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
+        "wx" : "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
+        "wy" : "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeb5mfvncu6xVoGKVzocLBwKb/NstzijZ\nWfKBWxb4F5hIOtp3JqPEZV2k+/wOEQio/Re0SKaFVBmcR9CP+xDUuA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 408,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3044022043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b02321028102202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 409,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3045022100bc07ff041506dc73a75086a43252fb4270e157da75fb6cb92a9f07dcad153ec002202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777",
+        "wx" : "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
+        "wy" : "0b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeb5mfvncu6xVoGKVzocLBwKb/NstzijZ\nWfKBWxb4F5i3xSWI2Vw7mqJbBAPx7vdXAuhLt1l6q+ZjuC9vBO8ndw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 410,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3044022043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b02321028102202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 411,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3045022100bc07ff041506dc73a75086a43252fb4270e157da75fb6cb92a9f07dcad153ec002202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152",
+        "wx" : "782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963",
+        "wy" : "0af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeCyO0X47Kng7VGTzOwllKnHGeOBexR6E\n4rz8Zjo96WOvmstCgLjH98QvTvmrpiRewewXEv04oPqWQY2M1qphUg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 412,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "304502206632473c909425b6fa37095398e2538daab8552440320f9fe190dba8f672796b022100a8c3aacce9ffe4bc17c0530738f1386f9d9579f029ff3a7791b16e98422265e3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 413,
+          "comment" : "pseudorandom signature",
+          "msg" : "4d7367",
+          "sig" : "30430220465b0fb05c14cd4ddef23e13acbe5f2337c45ea3816536670cfa7f2ab9090619021f5e525e837c406cf8944383e20bcee32112d8da5b42b40f88415098f722aa89",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 414,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "304502207b1553e4d650c71fd49aa36ceed56f0438b0065e1b234445134bf7c83231ca9d022100e369a20fa6434bd138b092885a89e53a3f0b6bdcc5d2653e136c54070081dc5a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 415,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "3045022100c7ba1c73bdc4364f6c7c61ab1fecc0547f8d6fcbeb251f734964407536353f3202207b3a6fb2fe60f8861e9e0955663f5703a17f5ecc3a5b5140eb87eaf35a3a5090",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff00000001060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1",
+        "wx" : "6e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff",
+        "wy" : "1060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff00000001060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEboI1VUUpFAmRgsaywdbwtdKNUMzQBa8s\n4bulQapAyv8AAAABBgSS1aVnPg8l2NUPt+WMSdhtRtQhaVXgqj1A4Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 416,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304402202b9c9f85596fed708b3af80393b27edfd0b5ae2f0074270a56362f5f9f62b4e102202fae837503ba2c1d4c945e0913949ef094ce0b8086359bbb5dba4a12707c5600",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 417,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304402205cd765209021d8c1a8aef4ff61d6fa6e7993bf9fea0b93609eea130de536fccc02204f10c7989587fe3019e36d85aa024bf20db6737c4f28900c1c9662f2782143e0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 418,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304502204c1a59b1e578d76f1595e13b557057559f26ab559ec1df3f45ec98b90fa526ce022100c6872f094bdb3f82e31f93ad65357e2daafe66f304af197089ef0dc94ff90624",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40cafffffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e",
+        "wx" : "6e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff",
+        "wy" : "0fffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40cafffffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEboI1VUUpFAmRgsaywdbwtdKNUMzQBa8s\n4bulQapAyv/////++fttKlqYwfDaJyrwSBpztieSuSvelqoeVcK7Tg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 419,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100a35d1400d4cc7a8f617b721faee7118a74103c4630dec5aa47e097951dafc1a7022100958221023024e97ef6df35a22e820c7bc5e16299f3f12e9d9b1b727c46d795e6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 420,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "304402207fb733ed73c72fc4f4cf065e370c730301316ff4e9c6a8a701170f604c2d70b702207ca9ca985d3df48978b3a2f9c0bb8a58b216c795e687f74623a3321448bfa73c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 421,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "304502210095ae4df2fba8524e1151cb9a9c5c1ec1357a663722a18329303d86a58e7047540220591ea644b1dc6f4c7cd5d7d939397f84d9e077100760f0816ae5b22ae6a74203",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04000000013fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d",
+        "wx" : "13fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0",
+        "wy" : "0f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004000000013fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAAAAAT/SIkjWTZX3PCm0irSGMYUL5QP9\nAPhGi18PcOD27nqkO8LG/SWx2CaSQcvdnbsNrJbcliMfQwcF+DhxfQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 422,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "30440220717925f0dd5cf45e746e87f79c9ea97d11eb01444052c270aeccef56c2e958280220785787b664137080383d2fc500459fa713258205fdae97b3240fb64bb638a657",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 423,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "30460221008adfdeae3b586315d06183610d271fc423cc789908b8f5dc563253a3c782510a0221008137bedbb4e60da26041b351f72a6bc3b7741f745743f0733b40b7fc56febd04",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 424,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304502210092ded14e19b94d17c79b063a034b122ce3b93a2502f2f223fad3461abf631632022052ff8ad14ba3657242e29440d01cab36ebb6033ee36021dc8d9b38f0808a90bc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0425afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dfffffffffa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35",
+        "wx" : "25afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dffffffff",
+        "wy" : "0fa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000425afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dfffffffffa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEJa/WiayrrtZ8Hylt5ZQG+MVQ9XFGoLTs\nLJeHbf/////6RqduUgMi37xJHsTwzBl0IPxOpYg9j23VPDVLxPZ8NQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 425,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100d48373483e0fa2f11cfdfaea6f1de59e6861e9e87c4f6446602ba0125ab7de460221009d753bba3a7be08aab456e93a6500d4781795ed59af8bd6d6133129abef1ad98",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 426,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100f11473117b66e5d84a2ecd0f8b7ec4a2cc2aee89ae022020235777305142f498022100fe5ce43ced28f3f69f65e810678afefd2bdeefb051280ad2880157fda28b2ab1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 427,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "304502203c9f5bdde7310b5696c93c86203fc97e11a70739e20c71c9e722308d45a59e6c022100c09efb9a045a47cce799b768890bb17833a0210d869a36be1da33f2585477c32",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb93f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff",
+        "wx" : "0d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb9",
+        "wy" : "3f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb93f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE0S5sZrZ3NMPITSYBz1013Al+J2N/CspK\nT9t0tqrdO7k/W9/4i9VzbfiY5pkAbtdQ8RzwfFhmzXrXDHEh/////w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 428,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "304402206953442c487f240487d2af81f9825c894b1fc2534321fa012db8248be20a4b06022056927395d64ce4d690caa98944c2ddebc312f57f439d37236ea63cc1de098718",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 429,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100fb39aa5f36ceca6e68d1932e811598c412892734dade389fd9e8ba94c5c7a251022100fdddf0c3db66c7c46608ac98431f0ee8ebb1e27ba501937789ebcd0f7ac26ecc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 430,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3044022044fef6017638fd5bda17dfce346b0311b5e369bfb68aa85d5e970786b8e6644b0220720b3a52fe44be6028759f0f1a6fd7020ff6792cd4ece98dffd0d97d3b726091",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb",
+        "wx" : "6d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000",
+        "wy" : "0e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200046d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbUp/YNR3Sk8KqLve25U8fup5CUB+MWR1\nVmS8KAAAAADmWdNOTfONnoyeqt+6NmEsdpGVvobHeqw/NueLU4aA+w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 431,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "30430220304babc41346e6205cf03e2d0b26e4b222dce8227402d001ba233efa69c91234021f65add3279f51b2417fb0a13b0f06404199caac3430385513ee49f67d8e8cdf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 432,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3044022023868700b71fbafcaa73960faf922ee0458ef69e01fb060b2f9a80d992fe114c02206ec1526bd56f6eebf10463bd9210d62510b95166365e10a7b7abfc4d584ca338",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 433,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100dd60d7cf83a08208637212b65d079fb658d8ef1b8438d9c58f4122b0cd14ac49022100f1d762516f4d6c3e6a98dd31dc3869dc7cf35944f33b35c6a17fe632d2b18cd5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdsa_secp256r1_sha256_test.json b/third_party/wycheproof/testvectors/ecdsa_secp256r1_sha256_test.json
new file mode 100644
index 0000000..e3d9c17
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdsa_secp256r1_sha256_test.json
@@ -0,0 +1,4398 @@
+{
+  "algorithm" : "ECDSA",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "BER" : "This is a signature with correct values for (r, s) but using some alternative BER encoding instead of DER encoding. Implementations should not accept such signatures to limit signature malleability.",
+    "EdgeCase" : "Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA implementation does not check boundaries and computes s^(-1)==0.",
+    "MissingZero" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.",
+    "PointDuplication" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission."
+  },
+  "numberOfTests" : 371,
+  "header" : [],
+  "testGroups" : [
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e",
+        "wx" : "2927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838",
+        "wy" : "0c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKSexBRK64+3c/kZ4KBKLrSkDJpkZ\n9whgacjE32xzKDjHeHlk6qwA5ZIfsUmKYPRgZ2az2WhQAVWNGpdOc0FRPg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "signature malleability",
+          "msg" : "313233343030",
+          "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802204cd60b855d442f5b3c7b11eb6c4e0ae7525fe710fab9aa7c77a67f79e6fadd76",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "Legacy:ASN encoding of s misses leading 0",
+          "msg" : "313233343030",
+          "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180220b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingZero"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "valid",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30814502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 5,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30460281202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 6,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802812100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 7,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3082004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 8,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3047028200202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180282002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 10,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304502212ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3045021f2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022200b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3085010000004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304a028501000000202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180285010000002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "308901000000000000004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304e02890100000000000000202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304e02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18028901000000000000002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30847fffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "304902847fffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802847fffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3084ffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "30490284ffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180284ffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3085ffffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "304a0285ffffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180285ffffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3088ffffffffffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "304d0288ffffffffffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180288ffffffffffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30ff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "304502ff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802ff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "304502802ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18028000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "3047000002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304a498177304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30492500304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3047304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304a222549817702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30492224250002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304d222202202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180004deadbeef022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182226498177022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1822252500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182223022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304daa00bb00cd00304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304baa02aabb304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304d2228aa00bb00cd0002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304b2226aa02aabb02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182229aa00bb00cd00022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304b02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182227aa02aabb022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3049228002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182280022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3080314502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3049228003202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182280032100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2e4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2f4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "314502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "324502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "ff4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "30493001023044202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "3044202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 79,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db05000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "3047300002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "3047304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "302202202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "306802202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "removing integer",
+          "msg" : "313233343030",
+          "sig" : "3023022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "302402022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "302302202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "304702222ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022300b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3047022200002ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 95,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180223000000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 96,
+          "comment" : "appending unused 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "304702222ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022300b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "30250281022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180281",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "30250500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304500202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304501202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304503202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304504202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045ff202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18012100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18032100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18042100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18ff2100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "30250200022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "3049222402012b021fa3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1822250201000220b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "3045022029a3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022102b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e98022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b491568475b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3044021f2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3044021fa3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180220b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "30460221ff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180222ff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "3026090180022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "302502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18090180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "302502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18020100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30460221012ba3a8bd6b94d5ed80a6d9d1190a436ebccc0833490686deac8635bcb9bf5369022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30460221ff2ba3a8bf6b94d5eb80a6d9d1190a436f42fe12d7fad749d4c512a036c0f908c7022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30450220d45c5741946b2a137f59262ee6f5bc91001af27a5e1117a64733950642a3d1e8022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3046022100d45c5740946b2a147f59262ee6f5bc90bd01ed280528b62b3aed5fc93f06f739022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30460221fed45c5742946b2a127f59262ee6f5bc914333f7ccb6f979215379ca434640ac97022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30460221012ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3046022100d45c5741946b2a137f59262ee6f5bc91001af27a5e1117a64733950642a3d1e8022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022101b329f478a2bbd0a6c384ee1493b1f518276e0e4a5375928d6fcd160c11cb6d2c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180220b329f47aa2bbd0a4c384ee1493b1f518ada018ef05465583885980861905228a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180221ff4cd60b865d442f5a3c7b11eb6c4e0ae79578ec6353a20bf783ecb4b6ea97b825",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180221fe4cd60b875d442f593c7b11eb6c4e0ae7d891f1b5ac8a6d729032e9f3ee3492d4",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022101b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802204cd60b865d442f5a3c7b11eb6c4e0ae79578ec6353a20bf783ecb4b6ea97b825",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020101090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30080201ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325500201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325520201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000001000000000000000000000001000000000000000000000000020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000001000000000000000000000001000000000000000000000000020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff000000010000000000000000000000010000000000000000000000000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100ffffffff00000001000000000000000000000001000000000000000000000000090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "Edge case for Shamir multiplication",
+          "msg" : "3639383139",
+          "sig" : "3044022064a1aab5000d0e804f3e2fc02bdee9be8ff312334e2ba16d11547c97711c898e02206af015971cc30be6d1a206d4e013e0997772a2f91d73286ffd683b9bb2cf4f1b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "special case hash",
+          "msg" : "343236343739373234",
+          "sig" : "3044022016aea964a2f6506d6f78c81c91fc7e8bded7d397738448de1e19a0ec580bf2660220252cd762130c6667cfe8b7bc47d27d78391e8e80c578d1cd38c3ff033be928e9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "special case hash",
+          "msg" : "37313338363834383931",
+          "sig" : "30450221009cc98be2347d469bf476dfc26b9b733df2d26d6ef524af917c665baccb23c8820220093496459effe2d8d70727b82462f61d0ec1b7847929d10ea631dacb16b56c32",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "special case hash",
+          "msg" : "3130333539333331363638",
+          "sig" : "3044022073b3c90ecd390028058164524dde892703dce3dea0d53fa8093999f07ab8aa4302202f67b0b8e20636695bb7d8bf0a651c802ed25a395387b5f4188c0c4075c88634",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "special case hash",
+          "msg" : "33393439343031323135",
+          "sig" : "3046022100bfab3098252847b328fadf2f89b95c851a7f0eb390763378f37e90119d5ba3dd022100bdd64e234e832b1067c2d058ccb44d978195ccebb65c2aaf1e2da9b8b4987e3b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "special case hash",
+          "msg" : "31333434323933303739",
+          "sig" : "30440220204a9784074b246d8bf8bf04a4ceb1c1f1c9aaab168b1596d17093c5cd21d2cd022051cce41670636783dc06a759c8847868a406c2506fe17975582fe648d1d88b52",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "special case hash",
+          "msg" : "33373036323131373132",
+          "sig" : "3046022100ed66dc34f551ac82f63d4aa4f81fe2cb0031a91d1314f835027bca0f1ceeaa0302210099ca123aa09b13cd194a422e18d5fda167623c3f6e5d4d6abb8953d67c0c48c7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "special case hash",
+          "msg" : "333433363838373132",
+          "sig" : "30450220060b700bef665c68899d44f2356a578d126b062023ccc3c056bf0f60a237012b0221008d186c027832965f4fcc78a3366ca95dedbb410cbef3f26d6be5d581c11d3610",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "special case hash",
+          "msg" : "31333531353330333730",
+          "sig" : "30460221009f6adfe8d5eb5b2c24d7aa7934b6cf29c93ea76cd313c9132bb0c8e38c96831d022100b26a9c9e40e55ee0890c944cf271756c906a33e66b5bd15e051593883b5e9902",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "special case hash",
+          "msg" : "36353533323033313236",
+          "sig" : "3045022100a1af03ca91677b673ad2f33615e56174a1abf6da168cebfa8868f4ba273f16b7022020aa73ffe48afa6435cd258b173d0c2377d69022e7d098d75caf24c8c5e06b1c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "special case hash",
+          "msg" : "31353634333436363033",
+          "sig" : "3045022100fdc70602766f8eed11a6c99a71c973d5659355507b843da6e327a28c11893db902203df5349688a085b137b1eacf456a9e9e0f6d15ec0078ca60a7f83f2b10d21350",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "special case hash",
+          "msg" : "34343239353339313137",
+          "sig" : "3046022100b516a314f2fce530d6537f6a6c49966c23456f63c643cf8e0dc738f7b876e675022100d39ffd033c92b6d717dd536fbc5efdf1967c4bd80954479ba66b0120cd16fff2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "special case hash",
+          "msg" : "3130393533323631333531",
+          "sig" : "304402203b2cbf046eac45842ecb7984d475831582717bebb6492fd0a485c101e29ff0a802204c9b7b47a98b0f82de512bc9313aaf51701099cac5f76e68c8595fc1c1d99258",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "special case hash",
+          "msg" : "35393837333530303431",
+          "sig" : "3044022030c87d35e636f540841f14af54e2f9edd79d0312cfa1ab656c3fb15bfde48dcf022047c15a5a82d24b75c85a692bd6ecafeb71409ede23efd08e0db9abf6340677ed",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "special case hash",
+          "msg" : "33343633303036383738",
+          "sig" : "3044022038686ff0fda2cef6bc43b58cfe6647b9e2e8176d168dec3c68ff262113760f520220067ec3b651f422669601662167fa8717e976e2db5e6a4cf7c2ddabb3fde9d67d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 231,
+          "comment" : "special case hash",
+          "msg" : "39383137333230323837",
+          "sig" : "3044022044a3e23bf314f2b344fc25c7f2de8b6af3e17d27f5ee844b225985ab6e2775cf02202d48e223205e98041ddc87be532abed584f0411f5729500493c9cc3f4dd15e86",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 232,
+          "comment" : "special case hash",
+          "msg" : "33323232303431303436",
+          "sig" : "304402202ded5b7ec8e90e7bf11f967a3d95110c41b99db3b5aa8d330eb9d638781688e902207d5792c53628155e1bfc46fb1a67e3088de049c328ae1f44ec69238a009808f9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 233,
+          "comment" : "special case hash",
+          "msg" : "36363636333037313034",
+          "sig" : "3046022100bdae7bcb580bf335efd3bc3d31870f923eaccafcd40ec2f605976f15137d8b8f022100f6dfa12f19e525270b0106eecfe257499f373a4fb318994f24838122ce7ec3c7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 234,
+          "comment" : "special case hash",
+          "msg" : "31303335393531383938",
+          "sig" : "3045022050f9c4f0cd6940e162720957ffff513799209b78596956d21ece251c2401f1c6022100d7033a0a787d338e889defaaabb106b95a4355e411a59c32aa5167dfab244726",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 235,
+          "comment" : "special case hash",
+          "msg" : "31383436353937313935",
+          "sig" : "3045022100f612820687604fa01906066a378d67540982e29575d019aabe90924ead5c860d02203f9367702dd7dd4f75ea98afd20e328a1a99f4857b316525328230ce294b0fef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 236,
+          "comment" : "special case hash",
+          "msg" : "33313336303436313839",
+          "sig" : "30460221009505e407657d6e8bc93db5da7aa6f5081f61980c1949f56b0f2f507da5782a7a022100c60d31904e3669738ffbeccab6c3656c08e0ed5cb92b3cfa5e7f71784f9c5021",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 237,
+          "comment" : "special case hash",
+          "msg" : "32363633373834323534",
+          "sig" : "3046022100bbd16fbbb656b6d0d83e6a7787cd691b08735aed371732723e1c68a40404517d0221009d8e35dba96028b7787d91315be675877d2d097be5e8ee34560e3e7fd25c0f00",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 238,
+          "comment" : "special case hash",
+          "msg" : "31363532313030353234",
+          "sig" : "304402202ec9760122db98fd06ea76848d35a6da442d2ceef7559a30cf57c61e92df327e02207ab271da90859479701fccf86e462ee3393fb6814c27b760c4963625c0a19878",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 239,
+          "comment" : "special case hash",
+          "msg" : "35373438303831363936",
+          "sig" : "3044022054e76b7683b6650baa6a7fc49b1c51eed9ba9dd463221f7a4f1005a89fe00c5902202ea076886c773eb937ec1cc8374b7915cfd11b1c1ae1166152f2f7806a31c8fd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 240,
+          "comment" : "special case hash",
+          "msg" : "36333433393133343638",
+          "sig" : "304402205291deaf24659ffbbce6e3c26f6021097a74abdbb69be4fb10419c0c496c9466022065d6fcf336d27cc7cdb982bb4e4ecef5827f84742f29f10abf83469270a03dc3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 241,
+          "comment" : "special case hash",
+          "msg" : "31353431313033353938",
+          "sig" : "30450220207a3241812d75d947419dc58efb05e8003b33fc17eb50f9d15166a88479f107022100cdee749f2e492b213ce80b32d0574f62f1c5d70793cf55e382d5caadf7592767",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 242,
+          "comment" : "special case hash",
+          "msg" : "3130343738353830313238",
+          "sig" : "304502206554e49f82a855204328ac94913bf01bbe84437a355a0a37c0dee3cf81aa7728022100aea00de2507ddaf5c94e1e126980d3df16250a2eaebc8be486effe7f22b4f929",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 243,
+          "comment" : "special case hash",
+          "msg" : "3130353336323835353638",
+          "sig" : "3046022100a54c5062648339d2bff06f71c88216c26c6e19b4d80a8c602990ac82707efdfc022100e99bbe7fcfafae3e69fd016777517aa01056317f467ad09aff09be73c9731b0d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 244,
+          "comment" : "special case hash",
+          "msg" : "393533393034313035",
+          "sig" : "3045022100975bd7157a8d363b309f1f444012b1a1d23096593133e71b4ca8b059cff37eaf02207faa7a28b1c822baa241793f2abc930bd4c69840fe090f2aacc46786bf919622",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 245,
+          "comment" : "special case hash",
+          "msg" : "393738383438303339",
+          "sig" : "304402205694a6f84b8f875c276afd2ebcfe4d61de9ec90305afb1357b95b3e0da43885e02200dffad9ffd0b757d8051dec02ebdf70d8ee2dc5c7870c0823b6ccc7c679cbaa4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 246,
+          "comment" : "special case hash",
+          "msg" : "33363130363732343432",
+          "sig" : "3045022100a0c30e8026fdb2b4b4968a27d16a6d08f7098f1a98d21620d7454ba9790f1ba602205e470453a8a399f15baf463f9deceb53acc5ca64459149688bd2760c65424339",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 247,
+          "comment" : "special case hash",
+          "msg" : "31303534323430373035",
+          "sig" : "30440220614ea84acf736527dd73602cd4bb4eea1dfebebd5ad8aca52aa0228cf7b99a880220737cc85f5f2d2f60d1b8183f3ed490e4de14368e96a9482c2a4dd193195c902f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 248,
+          "comment" : "special case hash",
+          "msg" : "35313734343438313937",
+          "sig" : "3045022100bead6734ebe44b810d3fb2ea00b1732945377338febfd439a8d74dfbd0f942fa02206bb18eae36616a7d3cad35919fd21a8af4bbe7a10f73b3e036a46b103ef56e2a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 249,
+          "comment" : "special case hash",
+          "msg" : "31393637353631323531",
+          "sig" : "30440220499625479e161dacd4db9d9ce64854c98d922cbf212703e9654fae182df9bad2022042c177cf37b8193a0131108d97819edd9439936028864ac195b64fca76d9d693",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 250,
+          "comment" : "special case hash",
+          "msg" : "33343437323533333433",
+          "sig" : "3045022008f16b8093a8fb4d66a2c8065b541b3d31e3bfe694f6b89c50fb1aaa6ff6c9b20221009d6455e2d5d1779748573b611cb95d4a21f967410399b39b535ba3e5af81ca2e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 251,
+          "comment" : "special case hash",
+          "msg" : "333638323634333138",
+          "sig" : "3046022100be26231b6191658a19dd72ddb99ed8f8c579b6938d19bce8eed8dc2b338cb5f8022100e1d9a32ee56cffed37f0f22b2dcb57d5c943c14f79694a03b9c5e96952575c89",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 252,
+          "comment" : "special case hash",
+          "msg" : "33323631313938363038",
+          "sig" : "3045022015e76880898316b16204ac920a02d58045f36a229d4aa4f812638c455abe0443022100e74d357d3fcb5c8c5337bd6aba4178b455ca10e226e13f9638196506a1939123",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 253,
+          "comment" : "special case hash",
+          "msg" : "39363738373831303934",
+          "sig" : "30440220352ecb53f8df2c503a45f9846fc28d1d31e6307d3ddbffc1132315cc07f16dad02201348dfa9c482c558e1d05c5242ca1c39436726ecd28258b1899792887dd0a3c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 254,
+          "comment" : "special case hash",
+          "msg" : "34393538383233383233",
+          "sig" : "304402204a40801a7e606ba78a0da9882ab23c7677b8642349ed3d652c5bfa5f2a9558fb02203a49b64848d682ef7f605f2832f7384bdc24ed2925825bf8ea77dc5981725782",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 255,
+          "comment" : "special case hash",
+          "msg" : "383234363337383337",
+          "sig" : "3045022100eacc5e1a8304a74d2be412b078924b3bb3511bac855c05c9e5e9e44df3d61e9602207451cd8e18d6ed1885dd827714847f96ec4bb0ed4c36ce9808db8f714204f6d1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 256,
+          "comment" : "special case hash",
+          "msg" : "3131303230383333373736",
+          "sig" : "304502202f7a5e9e5771d424f30f67fdab61e8ce4f8cd1214882adb65f7de94c31577052022100ac4e69808345809b44acb0b2bd889175fb75dd050c5a449ab9528f8f78daa10c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 257,
+          "comment" : "special case hash",
+          "msg" : "313333383731363438",
+          "sig" : "3045022100ffcda40f792ce4d93e7e0f0e95e1a2147dddd7f6487621c30a03d710b3300219022079938b55f8a17f7ed7ba9ade8f2065a1fa77618f0b67add8d58c422c2453a49a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 258,
+          "comment" : "special case hash",
+          "msg" : "333232313434313632",
+          "sig" : "304602210081f2359c4faba6b53d3e8c8c3fcc16a948350f7ab3a588b28c17603a431e39a8022100cd6f6a5cc3b55ead0ff695d06c6860b509e46d99fccefb9f7f9e101857f74300",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 259,
+          "comment" : "special case hash",
+          "msg" : "3130363836363535353436",
+          "sig" : "3045022100dfc8bf520445cbb8ee1596fb073ea283ea130251a6fdffa5c3f5f2aaf75ca8080220048e33efce147c9dd92823640e338e68bfd7d0dc7a4905b3a7ac711e577e90e7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 260,
+          "comment" : "special case hash",
+          "msg" : "3632313535323436",
+          "sig" : "3046022100ad019f74c6941d20efda70b46c53db166503a0e393e932f688227688ba6a576202210093320eb7ca0710255346bdbb3102cdcf7964ef2e0988e712bc05efe16c199345",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 261,
+          "comment" : "special case hash",
+          "msg" : "37303330383138373734",
+          "sig" : "3046022100ac8096842e8add68c34e78ce11dd71e4b54316bd3ebf7fffdeb7bd5a3ebc1883022100f5ca2f4f23d674502d4caf85d187215d36e3ce9f0ce219709f21a3aac003b7a8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 262,
+          "comment" : "special case hash",
+          "msg" : "35393234353233373434",
+          "sig" : "30440220677b2d3a59b18a5ff939b70ea002250889ddcd7b7b9d776854b4943693fb92f702206b4ba856ade7677bf30307b21f3ccda35d2f63aee81efd0bab6972cc0795db55",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 263,
+          "comment" : "special case hash",
+          "msg" : "31343935353836363231",
+          "sig" : "30450220479e1ded14bcaed0379ba8e1b73d3115d84d31d4b7c30e1f05e1fc0d5957cfb0022100918f79e35b3d89487cf634a4f05b2e0c30857ca879f97c771e877027355b2443",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 264,
+          "comment" : "special case hash",
+          "msg" : "34303035333134343036",
+          "sig" : "3044022043dfccd0edb9e280d9a58f01164d55c3d711e14b12ac5cf3b64840ead512a0a302201dbe33fa8ba84533cd5c4934365b3442ca1174899b78ef9a3199f49584389772",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 265,
+          "comment" : "special case hash",
+          "msg" : "33303936343537353132",
+          "sig" : "304402205b09ab637bd4caf0f4c7c7e4bca592fea20e9087c259d26a38bb4085f0bbff11022045b7eb467b6748af618e9d80d6fdcd6aa24964e5a13f885bca8101de08eb0d75",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 266,
+          "comment" : "special case hash",
+          "msg" : "32373834303235363230",
+          "sig" : "304502205e9b1c5a028070df5728c5c8af9b74e0667afa570a6cfa0114a5039ed15ee06f022100b1360907e2d9785ead362bb8d7bd661b6c29eeffd3c5037744edaeb9ad990c20",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 267,
+          "comment" : "special case hash",
+          "msg" : "32363138373837343138",
+          "sig" : "304502200671a0a85c2b72d54a2fb0990e34538b4890050f5a5712f6d1a7a5fb8578f32e022100db1846bab6b7361479ab9c3285ca41291808f27fd5bd4fdac720e5854713694c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 268,
+          "comment" : "special case hash",
+          "msg" : "31363432363235323632",
+          "sig" : "304402207673f8526748446477dbbb0590a45492c5d7d69859d301abbaedb35b2095103a02203dc70ddf9c6b524d886bed9e6af02e0e4dec0d417a414fed3807ef4422913d7c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 269,
+          "comment" : "special case hash",
+          "msg" : "36383234313839343336",
+          "sig" : "304402207f085441070ecd2bb21285089ebb1aa6450d1a06c36d3ff39dfd657a796d12b50220249712012029870a2459d18d47da9aa492a5e6cb4b2d8dafa9e4c5c54a2b9a8b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 270,
+          "comment" : "special case hash",
+          "msg" : "343834323435343235",
+          "sig" : "3046022100914c67fb61dd1e27c867398ea7322d5ab76df04bc5aa6683a8e0f30a5d287348022100fa07474031481dda4953e3ac1959ee8cea7e66ec412b38d6c96d28f6d37304ea",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040ad99500288d466940031d72a9f5445a4d43784640855bf0a69874d2de5fe103c5011e6ef2c42dcd50d5d3d29f99ae6eba2c80c9244f4c5422f0979ff0c3ba5e",
+        "wx" : "0ad99500288d466940031d72a9f5445a4d43784640855bf0a69874d2de5fe103",
+        "wy" : "0c5011e6ef2c42dcd50d5d3d29f99ae6eba2c80c9244f4c5422f0979ff0c3ba5e"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040ad99500288d466940031d72a9f5445a4d43784640855bf0a69874d2de5fe103c5011e6ef2c42dcd50d5d3d29f99ae6eba2c80c9244f4c5422f0979ff0c3ba5e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECtmVACiNRmlAAx1yqfVEWk1DeEZA\nhVvwpph00t5f4QPFAR5u8sQtzVDV09Kfma5uuiyAySRPTFQi8Jef8MO6Xg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 271,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "313233343030",
+          "sig" : "303502104319055358e8617b0c46353d039cdaab022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 272,
+          "comment" : "r too large",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000000fffffffffffffffffffffffc022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ab05fd9d0de26b9ce6f4819652d9fc69193d0aa398f0fba8013e09c58220455419235271228c786759095d12b75af0692dd4103f19f6a8c32f49435a1e9b8d45",
+        "wx" : "0ab05fd9d0de26b9ce6f4819652d9fc69193d0aa398f0fba8013e09c582204554",
+        "wy" : "19235271228c786759095d12b75af0692dd4103f19f6a8c32f49435a1e9b8d45"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ab05fd9d0de26b9ce6f4819652d9fc69193d0aa398f0fba8013e09c58220455419235271228c786759095d12b75af0692dd4103f19f6a8c32f49435a1e9b8d45",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEqwX9nQ3ia5zm9IGWUtn8aRk9CqOY\n8PuoAT4JxYIgRVQZI1JxIox4Z1kJXRK3WvBpLdQQPxn2qMMvSUNaHpuNRQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 273,
+          "comment" : "r,s are large",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0480984f39a1ff38a86a68aa4201b6be5dfbfecf876219710b07badf6fdd4c6c5611feb97390d9826e7a06dfb41871c940d74415ed3cac2089f1445019bb55ed95",
+        "wx" : "080984f39a1ff38a86a68aa4201b6be5dfbfecf876219710b07badf6fdd4c6c56",
+        "wy" : "11feb97390d9826e7a06dfb41871c940d74415ed3cac2089f1445019bb55ed95"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000480984f39a1ff38a86a68aa4201b6be5dfbfecf876219710b07badf6fdd4c6c5611feb97390d9826e7a06dfb41871c940d74415ed3cac2089f1445019bb55ed95",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEgJhPOaH/OKhqaKpCAba+Xfv+z4di\nGXELB7rfb91MbFYR/rlzkNmCbnoG37QYcclA10QV7TysIInxRFAZu1XtlQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 274,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100909135bdb6799286170f5ead2de4f6511453fe50914f3df2de54a36383df8dd4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044201b4272944201c3294f5baa9a3232b6dd687495fcc19a70a95bc602b4f7c0595c37eba9ee8171c1bb5ac6feaf753bc36f463e3aef16629572c0c0a8fb0800e",
+        "wx" : "4201b4272944201c3294f5baa9a3232b6dd687495fcc19a70a95bc602b4f7c05",
+        "wy" : "095c37eba9ee8171c1bb5ac6feaf753bc36f463e3aef16629572c0c0a8fb0800e"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044201b4272944201c3294f5baa9a3232b6dd687495fcc19a70a95bc602b4f7c0595c37eba9ee8171c1bb5ac6feaf753bc36f463e3aef16629572c0c0a8fb0800e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEQgG0JylEIBwylPW6qaMjK23Wh0lf\nzBmnCpW8YCtPfAWVw366nugXHBu1rG/q91O8NvRj467xZilXLAwKj7CADg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 275,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022027b4577ca009376f71303fd5dd227dcef5deb773ad5f5a84360644669ca249a5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a71af64de5126a4a4e02b7922d66ce9415ce88a4c9d25514d91082c8725ac9575d47723c8fbe580bb369fec9c2665d8e30a435b9932645482e7c9f11e872296b",
+        "wx" : "0a71af64de5126a4a4e02b7922d66ce9415ce88a4c9d25514d91082c8725ac957",
+        "wy" : "5d47723c8fbe580bb369fec9c2665d8e30a435b9932645482e7c9f11e872296b"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a71af64de5126a4a4e02b7922d66ce9415ce88a4c9d25514d91082c8725ac9575d47723c8fbe580bb369fec9c2665d8e30a435b9932645482e7c9f11e872296b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEpxr2TeUSakpOAreSLWbOlBXOiKTJ\n0lUU2RCCyHJayVddR3I8j75YC7Np/snCZl2OMKQ1uZMmRUgufJ8R6HIpaw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 276,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020105020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046627cec4f0731ea23fc2931f90ebe5b7572f597d20df08fc2b31ee8ef16b15726170ed77d8d0a14fc5c9c3c4c9be7f0d3ee18f709bb275eaf2073e258fe694a5",
+        "wx" : "6627cec4f0731ea23fc2931f90ebe5b7572f597d20df08fc2b31ee8ef16b1572",
+        "wy" : "6170ed77d8d0a14fc5c9c3c4c9be7f0d3ee18f709bb275eaf2073e258fe694a5"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046627cec4f0731ea23fc2931f90ebe5b7572f597d20df08fc2b31ee8ef16b15726170ed77d8d0a14fc5c9c3c4c9be7f0d3ee18f709bb275eaf2073e258fe694a5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZifOxPBzHqI/wpMfkOvlt1cvWX0g\n3wj8KzHujvFrFXJhcO132NChT8XJw8TJvn8NPuGPcJuyderyBz4lj+aUpQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 277,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020105020103",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045a7c8825e85691cce1f5e7544c54e73f14afc010cb731343262ca7ec5a77f5bfef6edf62a4497c1bd7b147fb6c3d22af3c39bfce95f30e13a16d3d7b2812f813",
+        "wx" : "5a7c8825e85691cce1f5e7544c54e73f14afc010cb731343262ca7ec5a77f5bf",
+        "wy" : "0ef6edf62a4497c1bd7b147fb6c3d22af3c39bfce95f30e13a16d3d7b2812f813"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045a7c8825e85691cce1f5e7544c54e73f14afc010cb731343262ca7ec5a77f5bfef6edf62a4497c1bd7b147fb6c3d22af3c39bfce95f30e13a16d3d7b2812f813",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWnyIJehWkczh9edUTFTnPxSvwBDL\ncxNDJiyn7Fp39b/vbt9ipEl8G9exR/tsPSKvPDm/zpXzDhOhbT17KBL4Ew==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 278,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020105020105",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cbe0c29132cd738364fedd603152990c048e5e2fff996d883fa6caca7978c73770af6a8ce44cb41224b2603606f4c04d188e80bff7cc31ad5189d4ab0d70e8c1",
+        "wx" : "0cbe0c29132cd738364fedd603152990c048e5e2fff996d883fa6caca7978c737",
+        "wy" : "70af6a8ce44cb41224b2603606f4c04d188e80bff7cc31ad5189d4ab0d70e8c1"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cbe0c29132cd738364fedd603152990c048e5e2fff996d883fa6caca7978c73770af6a8ce44cb41224b2603606f4c04d188e80bff7cc31ad5189d4ab0d70e8c1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEy+DCkTLNc4Nk/t1gMVKZDASOXi//\nmW2IP6bKynl4xzdwr2qM5Ey0EiSyYDYG9MBNGI6Av/fMMa1RidSrDXDowQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 279,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020105020106",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 280,
+          "comment" : "r is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632556020106",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044be4178097002f0deab68f0d9a130e0ed33a6795d02a20796db83444b037e13920f13051e0eecdcfce4dacea0f50d1f247caa669f193c1b4075b51ae296d2d56",
+        "wx" : "4be4178097002f0deab68f0d9a130e0ed33a6795d02a20796db83444b037e139",
+        "wy" : "20f13051e0eecdcfce4dacea0f50d1f247caa669f193c1b4075b51ae296d2d56"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044be4178097002f0deab68f0d9a130e0ed33a6795d02a20796db83444b037e13920f13051e0eecdcfce4dacea0f50d1f247caa669f193c1b4075b51ae296d2d56",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAES+QXgJcALw3qto8NmhMODtM6Z5XQ\nKiB5bbg0RLA34Tkg8TBR4O7Nz85NrOoPUNHyR8qmafGTwbQHW1GuKW0tVg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 281,
+          "comment" : "s is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3026020105022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc75fbd8",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d0f73792203716afd4be4329faa48d269f15313ebbba379d7783c97bf3e890d9971f4a3206605bec21782bf5e275c714417e8f566549e6bc68690d2363c89cc1",
+        "wx" : "0d0f73792203716afd4be4329faa48d269f15313ebbba379d7783c97bf3e890d9",
+        "wy" : "0971f4a3206605bec21782bf5e275c714417e8f566549e6bc68690d2363c89cc1"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d0f73792203716afd4be4329faa48d269f15313ebbba379d7783c97bf3e890d9971f4a3206605bec21782bf5e275c714417e8f566549e6bc68690d2363c89cc1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0Pc3kiA3Fq/UvkMp+qSNJp8VMT67\nujedd4PJe/PokNmXH0oyBmBb7CF4K/XidccUQX6PVmVJ5rxoaQ0jY8icwQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 282,
+          "comment" : "small r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3027020201000221008f1e3c7862c58b16bb76eddbb76eddbb516af4f63f2d74d76e0d28c9bb75ea88",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044838b2be35a6276a80ef9e228140f9d9b96ce83b7a254f71ccdebbb8054ce05ffa9cbc123c919b19e00238198d04069043bd660a828814051fcb8aac738a6c6b",
+        "wx" : "4838b2be35a6276a80ef9e228140f9d9b96ce83b7a254f71ccdebbb8054ce05f",
+        "wy" : "0fa9cbc123c919b19e00238198d04069043bd660a828814051fcb8aac738a6c6b"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044838b2be35a6276a80ef9e228140f9d9b96ce83b7a254f71ccdebbb8054ce05ffa9cbc123c919b19e00238198d04069043bd660a828814051fcb8aac738a6c6b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAESDiyvjWmJ2qA754igUD52bls6Dt6\nJU9xzN67uAVM4F/6nLwSPJGbGeACOBmNBAaQQ71mCoKIFAUfy4qsc4psaw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 283,
+          "comment" : "smallish r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302c02072d9b4d347952d6022100ef3043e7329581dbb3974497710ab11505ee1c87ff907beebadd195a0ffe6d7a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047393983ca30a520bbc4783dc9960746aab444ef520c0a8e771119aa4e74b0f64e9d7be1ab01a0bf626e709863e6a486dbaf32793afccf774e2c6cd27b1857526",
+        "wx" : "7393983ca30a520bbc4783dc9960746aab444ef520c0a8e771119aa4e74b0f64",
+        "wy" : "0e9d7be1ab01a0bf626e709863e6a486dbaf32793afccf774e2c6cd27b1857526"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047393983ca30a520bbc4783dc9960746aab444ef520c0a8e771119aa4e74b0f64e9d7be1ab01a0bf626e709863e6a486dbaf32793afccf774e2c6cd27b1857526",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEc5OYPKMKUgu8R4PcmWB0aqtETvUg\nwKjncRGapOdLD2Tp174asBoL9ibnCYY+akhtuvMnk6/M93Tixs0nsYV1Jg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 284,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "313233343030",
+          "sig" : "3032020d1033e67e37b32b445580bf4eff0221008b748b74000000008b748b748b748b7466e769ad4a16d3dcd87129b8e91d1b4d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045ac331a1103fe966697379f356a937f350588a05477e308851b8a502d5dfcdc5fe9993df4b57939b2b8da095bf6d794265204cfe03be995a02e65d408c871c0b",
+        "wx" : "5ac331a1103fe966697379f356a937f350588a05477e308851b8a502d5dfcdc5",
+        "wy" : "0fe9993df4b57939b2b8da095bf6d794265204cfe03be995a02e65d408c871c0b"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045ac331a1103fe966697379f356a937f350588a05477e308851b8a502d5dfcdc5fe9993df4b57939b2b8da095bf6d794265204cfe03be995a02e65d408c871c0b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWsMxoRA/6WZpc3nzVqk381BYigVH\nfjCIUbilAtXfzcX+mZPfS1eTmyuNoJW/bXlCZSBM/gO+mVoC5l1AjIccCw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 285,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "313233343030",
+          "sig" : "302702020100022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041d209be8de2de877095a399d3904c74cc458d926e27bb8e58e5eae5767c41509dd59e04c214f7b18dce351fc2a549893a6860e80163f38cc60a4f2c9d040d8c9",
+        "wx" : "1d209be8de2de877095a399d3904c74cc458d926e27bb8e58e5eae5767c41509",
+        "wy" : "0dd59e04c214f7b18dce351fc2a549893a6860e80163f38cc60a4f2c9d040d8c9"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041d209be8de2de877095a399d3904c74cc458d926e27bb8e58e5eae5767c41509dd59e04c214f7b18dce351fc2a549893a6860e80163f38cc60a4f2c9d040d8c9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHSCb6N4t6HcJWjmdOQTHTMRY2Sbi\ne7jljl6uV2fEFQndWeBMIU97GNzjUfwqVJiTpoYOgBY/OMxgpPLJ0EDYyQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 286,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3032020d062522bbd3ecbe7c39e93e7c25022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04083539fbee44625e3acaafa2fcb41349392cef0633a1b8fabecee0c133b10e99915c1ebe7bf00df8535196770a58047ae2a402f26326bb7d41d4d7616337911e",
+        "wx" : "083539fbee44625e3acaafa2fcb41349392cef0633a1b8fabecee0c133b10e99",
+        "wy" : "0915c1ebe7bf00df8535196770a58047ae2a402f26326bb7d41d4d7616337911e"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004083539fbee44625e3acaafa2fcb41349392cef0633a1b8fabecee0c133b10e99915c1ebe7bf00df8535196770a58047ae2a402f26326bb7d41d4d7616337911e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECDU5++5EYl46yq+i/LQTSTks7wYz\nobj6vs7gwTOxDpmRXB6+e/AN+FNRlncKWAR64qQC8mMmu31B1NdhYzeRHg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 287,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "313233343030",
+          "sig" : "3045022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d50220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048aeb368a7027a4d64abdea37390c0c1d6a26f399e2d9734de1eb3d0e1937387405bd13834715e1dbae9b875cf07bd55e1b6691c7f7536aef3b19bf7a4adf576d",
+        "wx" : "08aeb368a7027a4d64abdea37390c0c1d6a26f399e2d9734de1eb3d0e19373874",
+        "wy" : "5bd13834715e1dbae9b875cf07bd55e1b6691c7f7536aef3b19bf7a4adf576d"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048aeb368a7027a4d64abdea37390c0c1d6a26f399e2d9734de1eb3d0e1937387405bd13834715e1dbae9b875cf07bd55e1b6691c7f7536aef3b19bf7a4adf576d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEius2inAnpNZKveo3OQwMHWom85ni\n2XNN4es9Dhk3OHQFvRODRxXh266bh1zwe9VeG2aRx/dTau87Gb96St9XbQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 288,
+          "comment" : "s == 1",
+          "msg" : "313233343030",
+          "sig" : "30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 289,
+          "comment" : "s == 0",
+          "msg" : "313233343030",
+          "sig" : "30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b533d4695dd5b8c5e07757e55e6e516f7e2c88fa0239e23f60e8ec07dd70f2871b134ee58cc583278456863f33c3a85d881f7d4a39850143e29d4eaf009afe47",
+        "wx" : "0b533d4695dd5b8c5e07757e55e6e516f7e2c88fa0239e23f60e8ec07dd70f287",
+        "wy" : "1b134ee58cc583278456863f33c3a85d881f7d4a39850143e29d4eaf009afe47"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b533d4695dd5b8c5e07757e55e6e516f7e2c88fa0239e23f60e8ec07dd70f2871b134ee58cc583278456863f33c3a85d881f7d4a39850143e29d4eaf009afe47",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEtTPUaV3VuMXgd1flXm5Rb34siPoC\nOeI/YOjsB91w8ocbE07ljMWDJ4RWhj8zw6hdiB99SjmFAUPinU6vAJr+Rw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 290,
+          "comment" : "point at infinity during verify",
+          "msg" : "313233343030",
+          "sig" : "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a80220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0469da0364734d2e530fece94019265fefb781a0f1b08f6c8897bdf6557927c8b866d2d3c7dcd518b23d726960f069ad71a933d86ef8abbcce8b20f71e2a847002",
+        "wx" : "69da0364734d2e530fece94019265fefb781a0f1b08f6c8897bdf6557927c8b8",
+        "wy" : "66d2d3c7dcd518b23d726960f069ad71a933d86ef8abbcce8b20f71e2a847002"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000469da0364734d2e530fece94019265fefb781a0f1b08f6c8897bdf6557927c8b866d2d3c7dcd518b23d726960f069ad71a933d86ef8abbcce8b20f71e2a847002",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEadoDZHNNLlMP7OlAGSZf77eBoPGw\nj2yIl732VXknyLhm0tPH3NUYsj1yaWDwaa1xqTPYbvirvM6LIPceKoRwAg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 291,
+          "comment" : "u1 == 1",
+          "msg" : "313233343030",
+          "sig" : "30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d8adc00023a8edc02576e2b63e3e30621a471e2b2320620187bf067a1ac1ff3233e2b50ec09807accb36131fff95ed12a09a86b4ea9690aa32861576ba2362e1",
+        "wx" : "0d8adc00023a8edc02576e2b63e3e30621a471e2b2320620187bf067a1ac1ff32",
+        "wy" : "33e2b50ec09807accb36131fff95ed12a09a86b4ea9690aa32861576ba2362e1"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d8adc00023a8edc02576e2b63e3e30621a471e2b2320620187bf067a1ac1ff3233e2b50ec09807accb36131fff95ed12a09a86b4ea9690aa32861576ba2362e1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE2K3AACOo7cAlduK2Pj4wYhpHHisj\nIGIBh78GehrB/zIz4rUOwJgHrMs2Ex//le0SoJqGtOqWkKoyhhV2uiNi4Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 292,
+          "comment" : "u1 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022044a5ad0ad0636d9f12bc9e0a6bdd5e1cbcb012ea7bf091fcec15b0c43202d52e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043623ac973ced0a56fa6d882f03a7d5c7edca02cfc7b2401fab3690dbe75ab7858db06908e64b28613da7257e737f39793da8e713ba0643b92e9bb3252be7f8fe",
+        "wx" : "3623ac973ced0a56fa6d882f03a7d5c7edca02cfc7b2401fab3690dbe75ab785",
+        "wy" : "08db06908e64b28613da7257e737f39793da8e713ba0643b92e9bb3252be7f8fe"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043623ac973ced0a56fa6d882f03a7d5c7edca02cfc7b2401fab3690dbe75ab7858db06908e64b28613da7257e737f39793da8e713ba0643b92e9bb3252be7f8fe",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENiOslzztClb6bYgvA6fVx+3KAs/H\nskAfqzaQ2+dat4WNsGkI5ksoYT2nJX5zfzl5PajnE7oGQ7kum7MlK+f4/g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 293,
+          "comment" : "u2 == 1",
+          "msg" : "313233343030",
+          "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cf04ea77e9622523d894b93ff52dc3027b31959503b6fa3890e5e04263f922f1e8528fb7c006b3983c8b8400e57b4ed71740c2f3975438821199bedeaecab2e9",
+        "wx" : "0cf04ea77e9622523d894b93ff52dc3027b31959503b6fa3890e5e04263f922f1",
+        "wy" : "0e8528fb7c006b3983c8b8400e57b4ed71740c2f3975438821199bedeaecab2e9"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cf04ea77e9622523d894b93ff52dc3027b31959503b6fa3890e5e04263f922f1e8528fb7c006b3983c8b8400e57b4ed71740c2f3975438821199bedeaecab2e9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzwTqd+liJSPYlLk/9S3DAnsxlZUD\ntvo4kOXgQmP5IvHoUo+3wAazmDyLhADle07XF0DC85dUOIIRmb7ersqy6Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 294,
+          "comment" : "u2 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04db7a2c8a1ab573e5929dc24077b508d7e683d49227996bda3e9f78dbeff773504f417f3bc9a88075c2e0aadd5a13311730cf7cc76a82f11a36eaf08a6c99a206",
+        "wx" : "0db7a2c8a1ab573e5929dc24077b508d7e683d49227996bda3e9f78dbeff77350",
+        "wy" : "4f417f3bc9a88075c2e0aadd5a13311730cf7cc76a82f11a36eaf08a6c99a206"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004db7a2c8a1ab573e5929dc24077b508d7e683d49227996bda3e9f78dbeff773504f417f3bc9a88075c2e0aadd5a13311730cf7cc76a82f11a36eaf08a6c99a206",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE23osihq1c+WSncJAd7UI1+aD1JIn\nmWvaPp942+/3c1BPQX87yaiAdcLgqt1aEzEXMM98x2qC8Ro26vCKbJmiBg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 295,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100e91e1ba60fdedb76a46bcb51dc0b8b4b7e019f0a28721885fa5d3a8196623397",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04dead11c7a5b396862f21974dc4752fadeff994efe9bbd05ab413765ea80b6e1f1de3f0640e8ac6edcf89cff53c40e265bb94078a343736df07aa0318fc7fe1ff",
+        "wx" : "0dead11c7a5b396862f21974dc4752fadeff994efe9bbd05ab413765ea80b6e1f",
+        "wy" : "1de3f0640e8ac6edcf89cff53c40e265bb94078a343736df07aa0318fc7fe1ff"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004dead11c7a5b396862f21974dc4752fadeff994efe9bbd05ab413765ea80b6e1f1de3f0640e8ac6edcf89cff53c40e265bb94078a343736df07aa0318fc7fe1ff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3q0Rx6WzloYvIZdNxHUvre/5lO/p\nu9BatBN2XqgLbh8d4/BkDorG7c+Jz/U8QOJlu5QHijQ3Nt8HqgMY/H/h/w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 296,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100fdea5843ffeb73af94313ba4831b53fe24f799e525b1e8e8c87b59b95b430ad9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d0bc472e0d7c81ebaed3a6ef96c18613bb1fea6f994326fbe80e00dfde67c7e9986c723ea4843d48389b946f64ad56c83ad70ff17ba85335667d1bb9fa619efd",
+        "wx" : "0d0bc472e0d7c81ebaed3a6ef96c18613bb1fea6f994326fbe80e00dfde67c7e9",
+        "wy" : "0986c723ea4843d48389b946f64ad56c83ad70ff17ba85335667d1bb9fa619efd"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d0bc472e0d7c81ebaed3a6ef96c18613bb1fea6f994326fbe80e00dfde67c7e9986c723ea4843d48389b946f64ad56c83ad70ff17ba85335667d1bb9fa619efd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0LxHLg18geuu06bvlsGGE7sf6m+Z\nQyb76A4A395nx+mYbHI+pIQ9SDiblG9krVbIOtcP8XuoUzVmfRu5+mGe/Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 297,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022003ffcabf2f1b4d2a65190db1680d62bb994e41c5251cd73b3c3dfc5e5bafc035",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a0a44ca947d66a2acb736008b9c08d1ab2ad03776e02640f78495d458dd51c326337fe5cf8c4604b1f1c409dc2d872d4294a4762420df43a30a2392e40426add",
+        "wx" : "0a0a44ca947d66a2acb736008b9c08d1ab2ad03776e02640f78495d458dd51c32",
+        "wy" : "6337fe5cf8c4604b1f1c409dc2d872d4294a4762420df43a30a2392e40426add"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a0a44ca947d66a2acb736008b9c08d1ab2ad03776e02640f78495d458dd51c326337fe5cf8c4604b1f1c409dc2d872d4294a4762420df43a30a2392e40426add",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEoKRMqUfWairLc2AIucCNGrKtA3du\nAmQPeEldRY3VHDJjN/5c+MRgSx8cQJ3C2HLUKUpHYkIN9DowojkuQEJq3Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 298,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02204dfbc401f971cd304b33dfdb17d0fed0fe4c1a88ae648e0d2847f74977534989",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c9c2115290d008b45fb65fad0f602389298c25420b775019d42b62c3ce8a96b73877d25a8080dc02d987ca730f0405c2c9dbefac46f9e601cc3f06e9713973fd",
+        "wx" : "0c9c2115290d008b45fb65fad0f602389298c25420b775019d42b62c3ce8a96b7",
+        "wy" : "3877d25a8080dc02d987ca730f0405c2c9dbefac46f9e601cc3f06e9713973fd"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c9c2115290d008b45fb65fad0f602389298c25420b775019d42b62c3ce8a96b73877d25a8080dc02d987ca730f0405c2c9dbefac46f9e601cc3f06e9713973fd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEycIRUpDQCLRftl+tD2AjiSmMJUIL\nd1AZ1Ctiw86Klrc4d9JagIDcAtmHynMPBAXCydvvrEb55gHMPwbpcTlz/Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 299,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bc4024761cd2ffd43dfdb17d0fed112b988977055cd3a8e54971eba9cda5ca71",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045eca1ef4c287dddc66b8bccf1b88e8a24c0018962f3c5e7efa83bc1a5ff6033e5e79c4cb2c245b8c45abdce8a8e4da758d92a607c32cd407ecaef22f1c934a71",
+        "wx" : "5eca1ef4c287dddc66b8bccf1b88e8a24c0018962f3c5e7efa83bc1a5ff6033e",
+        "wy" : "5e79c4cb2c245b8c45abdce8a8e4da758d92a607c32cd407ecaef22f1c934a71"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045eca1ef4c287dddc66b8bccf1b88e8a24c0018962f3c5e7efa83bc1a5ff6033e5e79c4cb2c245b8c45abdce8a8e4da758d92a607c32cd407ecaef22f1c934a71",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXsoe9MKH3dxmuLzPG4jookwAGJYv\nPF5++oO8Gl/2Az5eecTLLCRbjEWr3Oio5Np1jZKmB8Ms1AfsrvIvHJNKcQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 300,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220788048ed39a5ffa77bfb62fa1fda2257742bf35d128fb3459f2a0c909ee86f91",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045caaa030e7fdf0e4936bc7ab5a96353e0a01e4130c3f8bf22d473e317029a47adeb6adc462f7058f2a20d371e9702254e9b201642005b3ceda926b42b178bef9",
+        "wx" : "5caaa030e7fdf0e4936bc7ab5a96353e0a01e4130c3f8bf22d473e317029a47a",
+        "wy" : "0deb6adc462f7058f2a20d371e9702254e9b201642005b3ceda926b42b178bef9"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045caaa030e7fdf0e4936bc7ab5a96353e0a01e4130c3f8bf22d473e317029a47adeb6adc462f7058f2a20d371e9702254e9b201642005b3ceda926b42b178bef9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXKqgMOf98OSTa8erWpY1PgoB5BMM\nP4vyLUc+MXAppHretq3EYvcFjyog03HpcCJU6bIBZCAFs87akmtCsXi++Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 301,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220476d9131fd381bd917d0fed112bc9e0a5924b5ed5b11167edd8b23582b3cb15e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c2fd20bac06e555bb8ac0ce69eb1ea20f83a1fc3501c8a66469b1a31f619b0986237050779f52b615bd7b8d76a25fc95ca2ed32525c75f27ffc87ac397e6cbaf",
+        "wx" : "0c2fd20bac06e555bb8ac0ce69eb1ea20f83a1fc3501c8a66469b1a31f619b098",
+        "wy" : "6237050779f52b615bd7b8d76a25fc95ca2ed32525c75f27ffc87ac397e6cbaf"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c2fd20bac06e555bb8ac0ce69eb1ea20f83a1fc3501c8a66469b1a31f619b0986237050779f52b615bd7b8d76a25fc95ca2ed32525c75f27ffc87ac397e6cbaf",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwv0gusBuVVu4rAzmnrHqIPg6H8NQ\nHIpmRpsaMfYZsJhiNwUHefUrYVvXuNdqJfyVyi7TJSXHXyf/yHrDl+bLrw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 302,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0221008374253e3e21bd154448d0a8f640fe46fafa8b19ce78d538f6cc0a19662d3601",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043fd6a1ca7f77fb3b0bbe726c372010068426e11ea6ae78ce17bedae4bba86ced03ce5516406bf8cfaab8745eac1cd69018ad6f50b5461872ddfc56e0db3c8ff4",
+        "wx" : "3fd6a1ca7f77fb3b0bbe726c372010068426e11ea6ae78ce17bedae4bba86ced",
+        "wy" : "3ce5516406bf8cfaab8745eac1cd69018ad6f50b5461872ddfc56e0db3c8ff4"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043fd6a1ca7f77fb3b0bbe726c372010068426e11ea6ae78ce17bedae4bba86ced03ce5516406bf8cfaab8745eac1cd69018ad6f50b5461872ddfc56e0db3c8ff4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEP9ahyn93+zsLvnJsNyAQBoQm4R6m\nrnjOF77a5LuobO0DzlUWQGv4z6q4dF6sHNaQGK1vULVGGHLd/Fbg2zyP9A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 303,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220357cfd3be4d01d413c5b9ede36cba5452c11ee7fe14879e749ae6a2d897a52d6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049cb8e51e27a5ae3b624a60d6dc32734e4989db20e9bca3ede1edf7b086911114b4c104ab3c677e4b36d6556e8ad5f523410a19f2e277aa895fc57322b4427544",
+        "wx" : "09cb8e51e27a5ae3b624a60d6dc32734e4989db20e9bca3ede1edf7b086911114",
+        "wy" : "0b4c104ab3c677e4b36d6556e8ad5f523410a19f2e277aa895fc57322b4427544"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200049cb8e51e27a5ae3b624a60d6dc32734e4989db20e9bca3ede1edf7b086911114b4c104ab3c677e4b36d6556e8ad5f523410a19f2e277aa895fc57322b4427544",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnLjlHielrjtiSmDW3DJzTkmJ2yDp\nvKPt4e33sIaRERS0wQSrPGd+SzbWVW6K1fUjQQoZ8uJ3qolfxXMitEJ1RA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 304,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022029798c5c0ee287d4a5e8e6b799fd86b8df5225298e6ffc807cd2f2bc27a0a6d8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a3e52c156dcaf10502620b7955bc2b40bc78ef3d569e1223c262512d8f49602a4a2039f31c1097024ad3cc86e57321de032355463486164cf192944977df147f",
+        "wx" : "0a3e52c156dcaf10502620b7955bc2b40bc78ef3d569e1223c262512d8f49602a",
+        "wy" : "4a2039f31c1097024ad3cc86e57321de032355463486164cf192944977df147f"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a3e52c156dcaf10502620b7955bc2b40bc78ef3d569e1223c262512d8f49602a4a2039f31c1097024ad3cc86e57321de032355463486164cf192944977df147f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEo+UsFW3K8QUCYgt5VbwrQLx47z1W\nnhIjwmJRLY9JYCpKIDnzHBCXAkrTzIblcyHeAyNVRjSGFkzxkpRJd98Ufw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 305,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02200b70f22c781092452dca1a5711fa3a5a1f72add1bf52c2ff7cae4820b30078dd",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f19b78928720d5bee8e670fb90010fb15c37bf91b58a5157c3f3c059b2655e88cf701ec962fb4a11dcf273f5dc357e58468560c7cfeb942d074abd4329260509",
+        "wx" : "0f19b78928720d5bee8e670fb90010fb15c37bf91b58a5157c3f3c059b2655e88",
+        "wy" : "0cf701ec962fb4a11dcf273f5dc357e58468560c7cfeb942d074abd4329260509"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f19b78928720d5bee8e670fb90010fb15c37bf91b58a5157c3f3c059b2655e88cf701ec962fb4a11dcf273f5dc357e58468560c7cfeb942d074abd4329260509",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE8Zt4kocg1b7o5nD7kAEPsVw3v5G1\nilFXw/PAWbJlXojPcB7JYvtKEdzyc/XcNX5YRoVgx8/rlC0HSr1DKSYFCQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 306,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022016e1e458f021248a5b9434ae23f474b43ee55ba37ea585fef95c90416600f1ba",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0483a744459ecdfb01a5cf52b27a05bb7337482d242f235d7b4cb89345545c90a8c05d49337b9649813287de9ffe90355fd905df5f3c32945828121f37cc50de6e",
+        "wx" : "083a744459ecdfb01a5cf52b27a05bb7337482d242f235d7b4cb89345545c90a8",
+        "wy" : "0c05d49337b9649813287de9ffe90355fd905df5f3c32945828121f37cc50de6e"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000483a744459ecdfb01a5cf52b27a05bb7337482d242f235d7b4cb89345545c90a8c05d49337b9649813287de9ffe90355fd905df5f3c32945828121f37cc50de6e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEg6dERZ7N+wGlz1KyegW7czdILSQv\nI117TLiTRVRckKjAXUkze5ZJgTKH3p/+kDVf2QXfXzwylFgoEh83zFDebg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 307,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02202252d6856831b6cf895e4f0535eeaf0e5e5809753df848fe760ad86219016a97",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04dd13c6b34c56982ddae124f039dfd23f4b19bbe88cee8e528ae51e5d6f3a21d7bfad4c2e6f263fe5eb59ca974d039fc0e4c3345692fb5320bdae4bd3b42a45ff",
+        "wx" : "0dd13c6b34c56982ddae124f039dfd23f4b19bbe88cee8e528ae51e5d6f3a21d7",
+        "wy" : "0bfad4c2e6f263fe5eb59ca974d039fc0e4c3345692fb5320bdae4bd3b42a45ff"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004dd13c6b34c56982ddae124f039dfd23f4b19bbe88cee8e528ae51e5d6f3a21d7bfad4c2e6f263fe5eb59ca974d039fc0e4c3345692fb5320bdae4bd3b42a45ff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3RPGs0xWmC3a4STwOd/SP0sZu+iM\n7o5SiuUeXW86Ide/rUwubyY/5etZypdNA5/A5MM0VpL7UyC9rkvTtCpF/w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 308,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02210081ffe55f178da695b28c86d8b406b15dab1a9e39661a3ae017fbe390ac0972c3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0467e6f659cdde869a2f65f094e94e5b4dfad636bbf95192feeed01b0f3deb7460a37e0a51f258b7aeb51dfe592f5cfd5685bbe58712c8d9233c62886437c38ba0",
+        "wx" : "67e6f659cdde869a2f65f094e94e5b4dfad636bbf95192feeed01b0f3deb7460",
+        "wy" : "0a37e0a51f258b7aeb51dfe592f5cfd5685bbe58712c8d9233c62886437c38ba0"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000467e6f659cdde869a2f65f094e94e5b4dfad636bbf95192feeed01b0f3deb7460a37e0a51f258b7aeb51dfe592f5cfd5685bbe58712c8d9233c62886437c38ba0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZ+b2Wc3ehpovZfCU6U5bTfrWNrv5\nUZL+7tAbDz3rdGCjfgpR8li3rrUd/lkvXP1WhbvlhxLI2SM8YohkN8OLoA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 309,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffffaaaaaaaaffffffffffffffffe9a2538f37b28a2c513dee40fecbb71a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042eb6412505aec05c6545f029932087e490d05511e8ec1f599617bb367f9ecaaf805f51efcc4803403f9b1ae0124890f06a43fedcddb31830f6669af292895cb0",
+        "wx" : "2eb6412505aec05c6545f029932087e490d05511e8ec1f599617bb367f9ecaaf",
+        "wy" : "0805f51efcc4803403f9b1ae0124890f06a43fedcddb31830f6669af292895cb0"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042eb6412505aec05c6545f029932087e490d05511e8ec1f599617bb367f9ecaaf805f51efcc4803403f9b1ae0124890f06a43fedcddb31830f6669af292895cb0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAELrZBJQWuwFxlRfApkyCH5JDQVRHo\n7B9Zlhe7Nn+eyq+AX1HvzEgDQD+bGuASSJDwakP+3N2zGDD2ZprykolcsA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 310,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100b62f26b5f2a2b26f6de86d42ad8a13da3ab3cccd0459b201de009e526adf21f2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0484db645868eab35e3a9fd80e056e2e855435e3a6b68d75a50a854625fe0d7f356d2589ac655edc9a11ef3e075eddda9abf92e72171570ef7bf43a2ee39338cfe",
+        "wx" : "084db645868eab35e3a9fd80e056e2e855435e3a6b68d75a50a854625fe0d7f35",
+        "wy" : "6d2589ac655edc9a11ef3e075eddda9abf92e72171570ef7bf43a2ee39338cfe"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000484db645868eab35e3a9fd80e056e2e855435e3a6b68d75a50a854625fe0d7f356d2589ac655edc9a11ef3e075eddda9abf92e72171570ef7bf43a2ee39338cfe",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhNtkWGjqs146n9gOBW4uhVQ146a2\njXWlCoVGJf4NfzVtJYmsZV7cmhHvPgde3dqav5LnIXFXDve/Q6LuOTOM/g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 311,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bb1d9ac949dd748cd02bbbe749bd351cd57b38bb61403d700686aa7b4c90851e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0491b9e47c56278662d75c0983b22ca8ea6aa5059b7a2ff7637eb2975e386ad66349aa8ff283d0f77c18d6d11dc062165fd13c3c0310679c1408302a16854ecfbd",
+        "wx" : "091b9e47c56278662d75c0983b22ca8ea6aa5059b7a2ff7637eb2975e386ad663",
+        "wy" : "49aa8ff283d0f77c18d6d11dc062165fd13c3c0310679c1408302a16854ecfbd"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000491b9e47c56278662d75c0983b22ca8ea6aa5059b7a2ff7637eb2975e386ad66349aa8ff283d0f77c18d6d11dc062165fd13c3c0310679c1408302a16854ecfbd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkbnkfFYnhmLXXAmDsiyo6mqlBZt6\nL/djfrKXXjhq1mNJqo/yg9D3fBjW0R3AYhZf0Tw8AxBnnBQIMCoWhU7PvQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 312,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022066755a00638cdaec1c732513ca0234ece52545dac11f816e818f725b4f60aaf2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f3ec2f13caf04d0192b47fb4c5311fb6d4dc6b0a9e802e5327f7ec5ee8e4834df97e3e468b7d0db867d6ecfe81e2b0f9531df87efdb47c1338ac321fefe5a432",
+        "wx" : "0f3ec2f13caf04d0192b47fb4c5311fb6d4dc6b0a9e802e5327f7ec5ee8e4834d",
+        "wy" : "0f97e3e468b7d0db867d6ecfe81e2b0f9531df87efdb47c1338ac321fefe5a432"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f3ec2f13caf04d0192b47fb4c5311fb6d4dc6b0a9e802e5327f7ec5ee8e4834df97e3e468b7d0db867d6ecfe81e2b0f9531df87efdb47c1338ac321fefe5a432",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE8+wvE8rwTQGStH+0xTEfttTcawqe\ngC5TJ/fsXujkg035fj5Gi30NuGfW7P6B4rD5Ux34fv20fBM4rDIf7+WkMg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 313,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022055a00c9fcdaebb6032513ca0234ecfffe98ebe492fdf02e48ca48e982beb3669",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d92b200aefcab6ac7dafd9acaf2fa10b3180235b8f46b4503e4693c670fccc885ef2f3aebf5b317475336256768f7c19efb7352d27e4cccadc85b6b8ab922c72",
+        "wx" : "0d92b200aefcab6ac7dafd9acaf2fa10b3180235b8f46b4503e4693c670fccc88",
+        "wy" : "5ef2f3aebf5b317475336256768f7c19efb7352d27e4cccadc85b6b8ab922c72"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d92b200aefcab6ac7dafd9acaf2fa10b3180235b8f46b4503e4693c670fccc885ef2f3aebf5b317475336256768f7c19efb7352d27e4cccadc85b6b8ab922c72",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE2SsgCu/Ktqx9r9msry+hCzGAI1uP\nRrRQPkaTxnD8zIhe8vOuv1sxdHUzYlZ2j3wZ77c1LSfkzMrchba4q5Iscg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 314,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ab40193f9b5d76c064a27940469d9fffd31d7c925fbe05c919491d3057d66cd2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040a88361eb92ecca2625b38e5f98bbabb96bf179b3d76fc48140a3bcd881523cde6bdf56033f84a5054035597375d90866aa2c96b86a41ccf6edebf47298ad489",
+        "wx" : "0a88361eb92ecca2625b38e5f98bbabb96bf179b3d76fc48140a3bcd881523cd",
+        "wy" : "0e6bdf56033f84a5054035597375d90866aa2c96b86a41ccf6edebf47298ad489"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040a88361eb92ecca2625b38e5f98bbabb96bf179b3d76fc48140a3bcd881523cde6bdf56033f84a5054035597375d90866aa2c96b86a41ccf6edebf47298ad489",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECog2HrkuzKJiWzjl+Yu6u5a/F5s9\ndvxIFAo7zYgVI83mvfVgM/hKUFQDVZc3XZCGaqLJa4akHM9u3r9HKYrUiQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 315,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ca0234ebb5fdcb13ca0234ecffffffffcb0dadbbc7f549f8a26b4408d0dc8600",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d0fb17ccd8fafe827e0c1afc5d8d80366e2b20e7f14a563a2ba50469d84375e868612569d39e2bb9f554355564646de99ac602cc6349cf8c1e236a7de7637d93",
+        "wx" : "0d0fb17ccd8fafe827e0c1afc5d8d80366e2b20e7f14a563a2ba50469d84375e8",
+        "wy" : "68612569d39e2bb9f554355564646de99ac602cc6349cf8c1e236a7de7637d93"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d0fb17ccd8fafe827e0c1afc5d8d80366e2b20e7f14a563a2ba50469d84375e868612569d39e2bb9f554355564646de99ac602cc6349cf8c1e236a7de7637d93",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0PsXzNj6/oJ+DBr8XY2ANm4rIOfx\nSlY6K6UEadhDdehoYSVp054rufVUNVVkZG3pmsYCzGNJz4weI2p952N9kw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 316,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff3ea3677e082b9310572620ae19933a9e65b285598711c77298815ad3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04836f33bbc1dc0d3d3abbcef0d91f11e2ac4181076c9af0a22b1e4309d3edb2769ab443ff6f901e30c773867582997c2bec2b0cb8120d760236f3a95bbe881f75",
+        "wx" : "0836f33bbc1dc0d3d3abbcef0d91f11e2ac4181076c9af0a22b1e4309d3edb276",
+        "wy" : "09ab443ff6f901e30c773867582997c2bec2b0cb8120d760236f3a95bbe881f75"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004836f33bbc1dc0d3d3abbcef0d91f11e2ac4181076c9af0a22b1e4309d3edb2769ab443ff6f901e30c773867582997c2bec2b0cb8120d760236f3a95bbe881f75",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEg28zu8HcDT06u87w2R8R4qxBgQds\nmvCiKx5DCdPtsnaatEP/b5AeMMdzhnWCmXwr7CsMuBINdgI286lbvogfdQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 317,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220266666663bbbbbbbe6666666666666665b37902e023fab7c8f055d86e5cc41f4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0492f99fbe973ed4a299719baee4b432741237034dec8d72ba5103cb33e55feeb8033dd0e91134c734174889f3ebcf1b7a1ac05767289280ee7a794cebd6e69697",
+        "wx" : "092f99fbe973ed4a299719baee4b432741237034dec8d72ba5103cb33e55feeb8",
+        "wy" : "33dd0e91134c734174889f3ebcf1b7a1ac05767289280ee7a794cebd6e69697"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000492f99fbe973ed4a299719baee4b432741237034dec8d72ba5103cb33e55feeb8033dd0e91134c734174889f3ebcf1b7a1ac05767289280ee7a794cebd6e69697",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkvmfvpc+1KKZcZuu5LQydBI3A03s\njXK6UQPLM+Vf7rgDPdDpETTHNBdIifPrzxt6GsBXZyiSgO56eUzr1uaWlw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 318,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff36db6db7a492492492492492146c573f4c6dfc8d08a443e258970b09",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d35ba58da30197d378e618ec0fa7e2e2d12cffd73ebbb2049d130bba434af09eff83986e6875e41ea432b7585a49b3a6c77cbb3c47919f8e82874c794635c1d2",
+        "wx" : "0d35ba58da30197d378e618ec0fa7e2e2d12cffd73ebbb2049d130bba434af09e",
+        "wy" : "0ff83986e6875e41ea432b7585a49b3a6c77cbb3c47919f8e82874c794635c1d2"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d35ba58da30197d378e618ec0fa7e2e2d12cffd73ebbb2049d130bba434af09eff83986e6875e41ea432b7585a49b3a6c77cbb3c47919f8e82874c794635c1d2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE01uljaMBl9N45hjsD6fi4tEs/9c+\nu7IEnRMLukNK8J7/g5huaHXkHqQyt1haSbOmx3y7PEeRn46Ch0x5RjXB0g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 319,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff2aaaaaab7fffffffffffffffc815d0e60b3e596ecb1ad3a27cfd49c4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048651ce490f1b46d73f3ff475149be29136697334a519d7ddab0725c8d0793224e11c65bd8ca92dc8bc9ae82911f0b52751ce21dd9003ae60900bd825f590cc28",
+        "wx" : "08651ce490f1b46d73f3ff475149be29136697334a519d7ddab0725c8d0793224",
+        "wy" : "0e11c65bd8ca92dc8bc9ae82911f0b52751ce21dd9003ae60900bd825f590cc28"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048651ce490f1b46d73f3ff475149be29136697334a519d7ddab0725c8d0793224e11c65bd8ca92dc8bc9ae82911f0b52751ce21dd9003ae60900bd825f590cc28",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhlHOSQ8bRtc/P/R1FJvikTZpczSl\nGdfdqwclyNB5MiThHGW9jKktyLya6CkR8LUnUc4h3ZADrmCQC9gl9ZDMKA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 320,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffff55555555ffffffffffffffffd344a71e6f651458a27bdc81fd976e37",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046d8e1b12c831a0da8795650ff95f101ed921d9e2f72b15b1cdaca9826b9cfc6def6d63e2bc5c089570394a4bc9f892d5e6c7a6a637b20469a58c106ad486bf37",
+        "wx" : "6d8e1b12c831a0da8795650ff95f101ed921d9e2f72b15b1cdaca9826b9cfc6d",
+        "wy" : "0ef6d63e2bc5c089570394a4bc9f892d5e6c7a6a637b20469a58c106ad486bf37"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046d8e1b12c831a0da8795650ff95f101ed921d9e2f72b15b1cdaca9826b9cfc6def6d63e2bc5c089570394a4bc9f892d5e6c7a6a637b20469a58c106ad486bf37",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEbY4bEsgxoNqHlWUP+V8QHtkh2eL3\nKxWxzaypgmuc/G3vbWPivFwIlXA5SkvJ+JLV5sempjeyBGmljBBq1Ia/Nw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 321,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02203fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192aa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040ae580bae933b4ef2997cbdbb0922328ca9a410f627a0f7dff24cb4d920e15428911e7f8cc365a8a88eb81421a361ccc2b99e309d8dcd9a98ba83c3949d893e3",
+        "wx" : "0ae580bae933b4ef2997cbdbb0922328ca9a410f627a0f7dff24cb4d920e1542",
+        "wy" : "08911e7f8cc365a8a88eb81421a361ccc2b99e309d8dcd9a98ba83c3949d893e3"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040ae580bae933b4ef2997cbdbb0922328ca9a410f627a0f7dff24cb4d920e15428911e7f8cc365a8a88eb81421a361ccc2b99e309d8dcd9a98ba83c3949d893e3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECuWAuukztO8pl8vbsJIjKMqaQQ9i\neg99/yTLTZIOFUKJEef4zDZaiojrgUIaNhzMK5njCdjc2amLqDw5SdiT4w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 322,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02205d8ecd64a4eeba466815ddf3a4de9a8e6abd9c5db0a01eb80343553da648428f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc46963838a40f2a36092e9004e92d8d940cf5638550ce672ce8b8d4e15eba5499249e9",
+        "wx" : "5b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc46963",
+        "wy" : "0838a40f2a36092e9004e92d8d940cf5638550ce672ce8b8d4e15eba5499249e9"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc46963838a40f2a36092e9004e92d8d940cf5638550ce672ce8b8d4e15eba5499249e9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEW4Ev1SGq+mmDWoSczm+962mDtELS\nRE/nDhNMAn/EaWODikDyo2CS6QBOktjZQM9WOFUM5nLOi41OFeulSZJJ6Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 323,
+          "comment" : "point duplication during verification",
+          "msg" : "313233343030",
+          "sig" : "304502206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022100bb726660235793aa9957a61e76e00c2c435109cf9a15dd624d53f4301047856b",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc469637c75bf0c5c9f6d17ffb16d2726bf30a9c7aaf31a8d317472b1ea145ab66db616",
+        "wx" : "5b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc46963",
+        "wy" : "7c75bf0c5c9f6d17ffb16d2726bf30a9c7aaf31a8d317472b1ea145ab66db616"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045b812fd521aafa69835a849cce6fbdeb6983b442d2444fe70e134c027fc469637c75bf0c5c9f6d17ffb16d2726bf30a9c7aaf31a8d317472b1ea145ab66db616",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEW4Ev1SGq+mmDWoSczm+962mDtELS\nRE/nDhNMAn/EaWN8db8MXJ9tF/+xbScmvzCpx6rzGo0xdHKx6hRatm22Fg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 324,
+          "comment" : "duplication bug",
+          "msg" : "313233343030",
+          "sig" : "304502206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022100bb726660235793aa9957a61e76e00c2c435109cf9a15dd624d53f4301047856b",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046adda82b90261b0f319faa0d878665a6b6da497f09c903176222c34acfef72a647e6f50dcc40ad5d9b59f7602bb222fad71a41bf5e1f9df4959a364c62e488d9",
+        "wx" : "6adda82b90261b0f319faa0d878665a6b6da497f09c903176222c34acfef72a6",
+        "wy" : "47e6f50dcc40ad5d9b59f7602bb222fad71a41bf5e1f9df4959a364c62e488d9"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046adda82b90261b0f319faa0d878665a6b6da497f09c903176222c34acfef72a647e6f50dcc40ad5d9b59f7602bb222fad71a41bf5e1f9df4959a364c62e488d9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEat2oK5AmGw8xn6oNh4ZlprbaSX8J\nyQMXYiLDSs/vcqZH5vUNzECtXZtZ92ArsiL61xpBv14fnfSVmjZMYuSI2Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 325,
+          "comment" : "point with x-coordinate 0",
+          "msg" : "313233343030",
+          "sig" : "30250201010220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042fca0d0a47914de77ed56e7eccc3276a601120c6df0069c825c8f6a01c9f382065f3450a1d17c6b24989a39beb1c7decfca8384fbdc294418e5d807b3c6ed7de",
+        "wx" : "2fca0d0a47914de77ed56e7eccc3276a601120c6df0069c825c8f6a01c9f3820",
+        "wy" : "65f3450a1d17c6b24989a39beb1c7decfca8384fbdc294418e5d807b3c6ed7de"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042fca0d0a47914de77ed56e7eccc3276a601120c6df0069c825c8f6a01c9f382065f3450a1d17c6b24989a39beb1c7decfca8384fbdc294418e5d807b3c6ed7de",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEL8oNCkeRTed+1W5+zMMnamARIMbf\nAGnIJcj2oByfOCBl80UKHRfGskmJo5vrHH3s/Kg4T73ClEGOXYB7PG7X3g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 326,
+          "comment" : "point with x-coordinate 0",
+          "msg" : "313233343030",
+          "sig" : "3045022101000000000000000000000000000000000000000000000000000000000000000002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04dd86d3b5f4a13e8511083b78002081c53ff467f11ebd98a51a633db76665d25045d5c8200c89f2fa10d849349226d21d8dfaed6ff8d5cb3e1b7e17474ebc18f7",
+        "wx" : "0dd86d3b5f4a13e8511083b78002081c53ff467f11ebd98a51a633db76665d250",
+        "wy" : "45d5c8200c89f2fa10d849349226d21d8dfaed6ff8d5cb3e1b7e17474ebc18f7"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004dd86d3b5f4a13e8511083b78002081c53ff467f11ebd98a51a633db76665d25045d5c8200c89f2fa10d849349226d21d8dfaed6ff8d5cb3e1b7e17474ebc18f7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3YbTtfShPoURCDt4ACCBxT/0Z/Ee\nvZilGmM9t2Zl0lBF1cggDIny+hDYSTSSJtIdjfrtb/jVyz4bfhdHTrwY9w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 327,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "313233343030",
+          "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044fea55b32cb32aca0c12c4cd0abfb4e64b0f5a516e578c016591a93f5a0fbcc5d7d3fd10b2be668c547b212f6bb14c88f0fecd38a8a4b2c785ed3be62ce4b280",
+        "wx" : "4fea55b32cb32aca0c12c4cd0abfb4e64b0f5a516e578c016591a93f5a0fbcc5",
+        "wy" : "0d7d3fd10b2be668c547b212f6bb14c88f0fecd38a8a4b2c785ed3be62ce4b280"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044fea55b32cb32aca0c12c4cd0abfb4e64b0f5a516e578c016591a93f5a0fbcc5d7d3fd10b2be668c547b212f6bb14c88f0fecd38a8a4b2c785ed3be62ce4b280",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAET+pVsyyzKsoMEsTNCr+05ksPWlFu\nV4wBZZGpP1oPvMXX0/0Qsr5mjFR7IS9rsUyI8P7NOKiksseF7TvmLOSygA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 328,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699780220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c6a771527024227792170a6f8eee735bf32b7f98af669ead299802e32d7c3107bc3b4b5e65ab887bbd343572b3e5619261fe3a073e2ffd78412f726867db589e",
+        "wx" : "0c6a771527024227792170a6f8eee735bf32b7f98af669ead299802e32d7c3107",
+        "wy" : "0bc3b4b5e65ab887bbd343572b3e5619261fe3a073e2ffd78412f726867db589e"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c6a771527024227792170a6f8eee735bf32b7f98af669ead299802e32d7c3107bc3b4b5e65ab887bbd343572b3e5619261fe3a073e2ffd78412f726867db589e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExqdxUnAkIneSFwpvju5zW/Mrf5iv\nZp6tKZgC4y18MQe8O0teZauIe700NXKz5WGSYf46Bz4v/XhBL3JoZ9tYng==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 329,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "304502207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022100b6db6db6249249254924924924924924625bd7a09bec4ca81bcdd9f8fd6b63cc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04851c2bbad08e54ec7a9af99f49f03644d6ec6d59b207fec98de85a7d15b956efcee9960283045075684b410be8d0f7494b91aa2379f60727319f10ddeb0fe9d6",
+        "wx" : "0851c2bbad08e54ec7a9af99f49f03644d6ec6d59b207fec98de85a7d15b956ef",
+        "wy" : "0cee9960283045075684b410be8d0f7494b91aa2379f60727319f10ddeb0fe9d6"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004851c2bbad08e54ec7a9af99f49f03644d6ec6d59b207fec98de85a7d15b956efcee9960283045075684b410be8d0f7494b91aa2379f60727319f10ddeb0fe9d6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhRwrutCOVOx6mvmfSfA2RNbsbVmy\nB/7JjehafRW5Vu/O6ZYCgwRQdWhLQQvo0PdJS5GqI3n2BycxnxDd6w/p1g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 330,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "304502207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022100cccccccc00000000cccccccccccccccc971f2ef152794b9d8fc7d568c9e8eaa7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f6417c8a670584e388676949e53da7fc55911ff68318d1bf3061205acb19c48f8f2b743df34ad0f72674acb7505929784779cd9ac916c3669ead43026ab6d43f",
+        "wx" : "0f6417c8a670584e388676949e53da7fc55911ff68318d1bf3061205acb19c48f",
+        "wy" : "08f2b743df34ad0f72674acb7505929784779cd9ac916c3669ead43026ab6d43f"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f6417c8a670584e388676949e53da7fc55911ff68318d1bf3061205acb19c48f8f2b743df34ad0f72674acb7505929784779cd9ac916c3669ead43026ab6d43f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9kF8imcFhOOIZ2lJ5T2n/FWRH/aD\nGNG/MGEgWssZxI+PK3Q980rQ9yZ0rLdQWSl4R3nNmskWw2aerUMCarbUPw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 331,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc4766997802203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aaa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04501421277be45a5eefec6c639930d636032565af420cf3373f557faa7f8a06438673d6cb6076e1cfcdc7dfe7384c8e5cac08d74501f2ae6e89cad195d0aa1371",
+        "wx" : "501421277be45a5eefec6c639930d636032565af420cf3373f557faa7f8a0643",
+        "wy" : "08673d6cb6076e1cfcdc7dfe7384c8e5cac08d74501f2ae6e89cad195d0aa1371"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004501421277be45a5eefec6c639930d636032565af420cf3373f557faa7f8a06438673d6cb6076e1cfcdc7dfe7384c8e5cac08d74501f2ae6e89cad195d0aa1371",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUBQhJ3vkWl7v7GxjmTDWNgMlZa9C\nDPM3P1V/qn+KBkOGc9bLYHbhz83H3+c4TI5crAjXRQHyrm6JytGV0KoTcQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 332,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022049249248db6db6dbb6db6db6db6db6db5a8b230d0b2b51dcd7ebf0c9fef7c185",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040d935bf9ffc115a527735f729ca8a4ca23ee01a4894adf0e3415ac84e808bb343195a3762fea29ed38912bd9ea6c4fde70c3050893a4375850ce61d82eba33c5",
+        "wx" : "0d935bf9ffc115a527735f729ca8a4ca23ee01a4894adf0e3415ac84e808bb34",
+        "wy" : "3195a3762fea29ed38912bd9ea6c4fde70c3050893a4375850ce61d82eba33c5"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040d935bf9ffc115a527735f729ca8a4ca23ee01a4894adf0e3415ac84e808bb343195a3762fea29ed38912bd9ea6c4fde70c3050893a4375850ce61d82eba33c5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEDZNb+f/BFaUnc19ynKikyiPuAaSJ\nSt8ONBWshOgIuzQxlaN2L+op7TiRK9nqbE/ecMMFCJOkN1hQzmHYLrozxQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 333,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022016a4502e2781e11ac82cbc9d1edd8c981584d13e18411e2f6e0478c34416e3bb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045e59f50708646be8a589355014308e60b668fb670196206c41e748e64e4dca215de37fee5c97bcaf7144d5b459982f52eeeafbdf03aacbafef38e213624a01de",
+        "wx" : "5e59f50708646be8a589355014308e60b668fb670196206c41e748e64e4dca21",
+        "wy" : "5de37fee5c97bcaf7144d5b459982f52eeeafbdf03aacbafef38e213624a01de"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045e59f50708646be8a589355014308e60b668fb670196206c41e748e64e4dca215de37fee5c97bcaf7144d5b459982f52eeeafbdf03aacbafef38e213624a01de",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXln1Bwhka+iliTVQFDCOYLZo+2cB\nliBsQedI5k5NyiFd43/uXJe8r3FE1bRZmC9S7ur73wOqy6/vOOITYkoB3g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 334,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2960220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04169fb797325843faff2f7a5b5445da9e2fd6226f7ef90ef0bfe924104b02db8e7bbb8de662c7b9b1cf9b22f7a2e582bd46d581d68878efb2b861b131d8a1d667",
+        "wx" : "169fb797325843faff2f7a5b5445da9e2fd6226f7ef90ef0bfe924104b02db8e",
+        "wy" : "7bbb8de662c7b9b1cf9b22f7a2e582bd46d581d68878efb2b861b131d8a1d667"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004169fb797325843faff2f7a5b5445da9e2fd6226f7ef90ef0bfe924104b02db8e7bbb8de662c7b9b1cf9b22f7a2e582bd46d581d68878efb2b861b131d8a1d667",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFp+3lzJYQ/r/L3pbVEXani/WIm9+\n+Q7wv+kkEEsC2457u43mYse5sc+bIvei5YK9RtWB1oh477K4YbEx2KHWZw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 335,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "304502206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022100b6db6db6249249254924924924924924625bd7a09bec4ca81bcdd9f8fd6b63cc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04271cd89c000143096b62d4e9e4ca885aef2f7023d18affdaf8b7b548981487540a1c6e954e32108435b55fa385b0f76481a609b9149ccb4b02b2ca47fe8e4da5",
+        "wx" : "271cd89c000143096b62d4e9e4ca885aef2f7023d18affdaf8b7b54898148754",
+        "wy" : "0a1c6e954e32108435b55fa385b0f76481a609b9149ccb4b02b2ca47fe8e4da5"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004271cd89c000143096b62d4e9e4ca885aef2f7023d18affdaf8b7b548981487540a1c6e954e32108435b55fa385b0f76481a609b9149ccb4b02b2ca47fe8e4da5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJxzYnAABQwlrYtTp5MqIWu8vcCPR\niv/a+Le1SJgUh1QKHG6VTjIQhDW1X6OFsPdkgaYJuRScy0sCsspH/o5NpQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 336,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "304502206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022100cccccccc00000000cccccccccccccccc971f2ef152794b9d8fc7d568c9e8eaa7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043d0bc7ed8f09d2cb7ddb46ebc1ed799ab1563a9ab84bf524587a220afe499c12e22dc3b3c103824a4f378d96adb0a408abf19ce7d68aa6244f78cb216fa3f8df",
+        "wx" : "3d0bc7ed8f09d2cb7ddb46ebc1ed799ab1563a9ab84bf524587a220afe499c12",
+        "wy" : "0e22dc3b3c103824a4f378d96adb0a408abf19ce7d68aa6244f78cb216fa3f8df"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043d0bc7ed8f09d2cb7ddb46ebc1ed799ab1563a9ab84bf524587a220afe499c12e22dc3b3c103824a4f378d96adb0a408abf19ce7d68aa6244f78cb216fa3f8df",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPQvH7Y8J0st920brwe15mrFWOpq4\nS/UkWHoiCv5JnBLiLcOzwQOCSk83jZatsKQIq/Gc59aKpiRPeMshb6P43w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 337,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29602203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aaa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a6c885ade1a4c566f9bb010d066974abb281797fa701288c721bcbd23663a9b72e424b690957168d193a6096fc77a2b004a9c7d467e007e1f2058458f98af316",
+        "wx" : "0a6c885ade1a4c566f9bb010d066974abb281797fa701288c721bcbd23663a9b7",
+        "wy" : "2e424b690957168d193a6096fc77a2b004a9c7d467e007e1f2058458f98af316"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a6c885ade1a4c566f9bb010d066974abb281797fa701288c721bcbd23663a9b72e424b690957168d193a6096fc77a2b004a9c7d467e007e1f2058458f98af316",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEpsiFreGkxWb5uwENBml0q7KBeX+n\nASiMchvL0jZjqbcuQktpCVcWjRk6YJb8d6KwBKnH1GfgB+HyBYRY+YrzFg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 338,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022049249248db6db6dbb6db6db6db6db6db5a8b230d0b2b51dcd7ebf0c9fef7c185",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048d3c2c2c3b765ba8289e6ac3812572a25bf75df62d87ab7330c3bdbad9ebfa5c4c6845442d66935b238578d43aec54f7caa1621d1af241d4632e0b780c423f5d",
+        "wx" : "08d3c2c2c3b765ba8289e6ac3812572a25bf75df62d87ab7330c3bdbad9ebfa5c",
+        "wy" : "4c6845442d66935b238578d43aec54f7caa1621d1af241d4632e0b780c423f5d"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048d3c2c2c3b765ba8289e6ac3812572a25bf75df62d87ab7330c3bdbad9ebfa5c4c6845442d66935b238578d43aec54f7caa1621d1af241d4632e0b780c423f5d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEjTwsLDt2W6gonmrDgSVyolv3XfYt\nh6tzMMO9utnr+lxMaEVELWaTWyOFeNQ67FT3yqFiHRryQdRjLgt4DEI/XQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 339,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022016a4502e2781e11ac82cbc9d1edd8c981584d13e18411e2f6e0478c34416e3bb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5",
+        "wx" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
+        "wy" : "4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaxfR8uEsQkf4vOblY6RA8ncDfYEt\n6zOg9KE5RdiYwpZP40Li/hp/m47n60p8D54WK84zV2sxXs7LtkBoN79R9Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 340,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 341,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3044022044a5ad0ad0636d9f12bc9e0a6bdd5e1cbcb012ea7bf091fcec15b0c43202d52e0220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a",
+        "wx" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
+        "wy" : "0b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaxfR8uEsQkf4vOblY6RA8ncDfYEt\n6zOg9KE5RdiYwpawHL0cAeWAZXEYFLWD8GHp1DHMqZTOoTE0Sb+XyECuCg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 342,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 343,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3044022044a5ad0ad0636d9f12bc9e0a6bdd5e1cbcb012ea7bf091fcec15b0c43202d52e0220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d",
+        "wx" : "4aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad5",
+        "wy" : "087d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEBKrsc2NXJvIT+4qeZNo7hjLkFJWp\nRNAEW1IuunJA+tWH2TFXmKqjpboBd1eHztBeqve04J/IHW0apUboNl1SXQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 344,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "3045022100b292a619339f6e567a305c951c0dcbcc42d16e47f219f9e98e76e09d8770b34a02200177e60492c5a8242f76f07bfe3661bde59ec2a17ce5bd2dab2abebdf89a62e2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 345,
+          "comment" : "pseudorandom signature",
+          "msg" : "4d7367",
+          "sig" : "30450220530bd6b0c9af2d69ba897f6b5fb59695cfbf33afe66dbadcf5b8d2a2a6538e23022100d85e489cb7a161fd55ededcedbf4cc0c0987e3e3f0f242cae934c72caa3f43e9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 346,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "3046022100a8ea150cb80125d7381c4c1f1da8e9de2711f9917060406a73d7904519e51388022100f3ab9fa68bd47973a73b2d40480c2ba50c22c9d76ec217257288293285449b86",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 347,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "3045022100986e65933ef2ed4ee5aada139f52b70539aaf63f00a91f29c69178490d57fb7102203dafedfb8da6189d372308cbf1489bbbdabf0c0217d1c0ff0f701aaa7a694b9c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685",
+        "wx" : "4f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000",
+        "wy" : "0ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETzN8z9Z3JqgF5PFgCuKEnfOAfsoR\nc4Ajn72BaQAAAADtneoSTMjDlkFkEemIww9CfrUEr0OjFGzV336mBmbWhQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 348,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100d434e262a49eab7781e353a3565e482550dd0fd5defa013c7f29745eff3569f10221009b0c0a93f267fb6052fd8077be769c2b98953195d7bc10de844218305c6ba17a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 349,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "304402200fe774355c04d060f76d79fd7a772e421463489221bf0a33add0be9b1979110b0220500dcba1c69a8fbd43fa4f57f743ce124ca8b91a1f325f3fac6181175df55737",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 350,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100bb40bf217bed3fb3950c7d39f03d36dc8e3b2cd79693f125bfd06595ee1135e30220541bf3532351ebb032710bdb6a1bf1bfc89a1e291ac692b3fa4780745bb55677",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000",
+        "wx" : "3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935",
+        "wy" : "084fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPPA9YU2JOc/UmaB4c/rCgWGPBrj/\nh+gBXD9JcmUASTWE+hdNeRxyvyzjiAqJYN0qfHoTOKgvhanlnNvegAAAAA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 351,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "30440220664eb7ee6db84a34df3c86ea31389a5405badd5ca99231ff556d3e75a233e73a022059f3c752e52eca46137642490a51560ce0badc678754b8f72e51a2901426a1bd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 352,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "304502204cd0429bbabd2827009d6fcd843d4ce39c3e42e2d1631fd001985a79d1fd8b430221009638bf12dd682f60be7ef1d0e0d98f08b7bca77a1a2b869ae466189d2acdabe3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 353,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100e56c6ea2d1b017091c44d8b6cb62b9f460e3ce9aed5e5fd41e8added97c56c04022100a308ec31f281e955be20b457e463440b4fcf2b80258078207fc1378180f89b55",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff",
+        "wx" : "3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935",
+        "wy" : "7b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPPA9YU2JOc/UmaB4c/rCgWGPBrj/\nh+gBXD9JcmUASTV7BeixhuONQdMcd/V2nyLVg4XsyFfQelYaYyQhf////w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 354,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "304402201158a08d291500b4cabed3346d891eee57c176356a2624fb011f8fbbf34668300220228a8c486a736006e082325b85290c5bc91f378b75d487dda46798c18f285519",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 355,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100b1db9289649f59410ea36b0c0fc8d6aa2687b29176939dd23e0dde56d309fa9d02203e1535e4280559015b0dbd987366dcf43a6d1af5c23c7d584e1c3f48a1251336",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 356,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100b7b16e762286cb96446aa8d4e6e7578b0a341a79f2dd1a220ac6f0ca4e24ed86022100ddc60a700a139b04661c547d07bbb0721780146df799ccf55e55234ecb8f12bc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e",
+        "wx" : "2829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffff",
+        "wy" : "0a01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKCnDH6ouQA40TtlLyj/NBUWVbrz+\nitD236X/jv////+gGq+vAA5SWFhVr6dnat4oQRMJkFLfV+frO9N+vrkiLg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 357,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100d82a7c2717261187c8e00d8df963ff35d796edad36bc6e6bd1c91c670d9105b402203dcabddaf8fcaa61f4603e7cbac0f3c0351ecd5988efb23f680d07debd139929",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 358,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "304402205eb9c8845de68eb13d5befe719f462d77787802baff30ce96a5cba063254af7802202c026ae9be2e2a5e7ca0ff9bbd92fb6e44972186228ee9a62b87ddbe2ef66fb5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 359,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "304602210096843dd03c22abd2f3b782b170239f90f277921becc117d0404a8e4e36230c28022100f2be378f526f74a543f67165976de9ed9a31214eb4d7e6db19e1ede123dd991d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73",
+        "wx" : "0fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f5",
+        "wy" : "5a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE////+UgIHmoEWN2PnnOPJmX/kFmt\naqwHCDGMTKmnpPVairy6LdqEdDEe5UFJuXPK4MD7iVV60L945lKaFmO9cw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 360,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30440220766456dce1857c906f9996af729339464d27e9d98edc2d0e3b760297067421f60220402385ecadae0d8081dccaf5d19037ec4e55376eced699e93646bfbbf19d0b41",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 361,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100c605c4b2edeab20419e6518a11b2dbc2b97ed8b07cced0b19c34f777de7b9fd9022100edf0f612c5f46e03c719647bc8af1b29b2cde2eda700fb1cff5e159d47326dba",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 362,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100d48b68e6cabfe03cf6141c9ac54141f210e64485d9929ad7b732bfe3b7eb8a84022100feedae50c61bd00e19dc26f9b7e2265e4508c389109ad2f208f0772315b6c941",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71",
+        "wx" : "3fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e",
+        "wy" : "1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAAAAA/oV+WOUnV8DpvXH+G+eABXu\nsjrrv/EXOTe6dI4QmYcgcOjofFVfoTZZzKXX+tz8sAI+qIlUjKSK8rp+cQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 363,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100b7c81457d4aeb6aa65957098569f0479710ad7f6595d5874c35a93d12a5dd4c7022100b7961a0b652878c2d568069a432ca18a1a9199f2ca574dad4b9e3a05c0a1cdb3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 364,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304402206b01332ddb6edfa9a30a1321d5858e1ee3cf97e263e669f8de5e9652e76ff3f702205939545fced457309a6a04ace2bd0f70139c8f7d86b02cb1cc58f9e69e96cd5a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 365,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100efdb884720eaeadc349f9fc356b6c0344101cd2fd8436b7d0e6a4fb93f106361022100f24bee6ad5dc05f7613975473aadf3aacba9e77de7d69b6ce48cb60d8113385d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2",
+        "wx" : "0bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015",
+        "wy" : "1352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvLspFMefBF6qbsu8YSgWs75dLWeW\ncH2BJen4UcGK8BUAAAAAE1K7Sg+i6kzOuatj3WhK3loRJ7zzAKaYpxk7wg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 366,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3044022031230428405560dcb88fb5a646836aea9b23a23dd973dcbe8014c87b8b20eb0702200f9344d6e812ce166646747694a41b0aaf97374e19f3c5fb8bd7ae3d9bd0beff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 367,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100caa797da65b320ab0d5c470cda0b36b294359c7db9841d679174db34c4855743022100cf543a62f23e212745391aaf7505f345123d2685ee3b941d3de6d9b36242e5a0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 368,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304502207e5f0ab5d900d3d3d7867657e5d6d36519bc54084536e7d21c336ed8001859450221009450c07f201faec94b82dfb322e5ac676688294aad35aa72e727ff0b19b646aa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d",
+        "wx" : "0bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015",
+        "wy" : "0fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvLspFMefBF6qbsu8YSgWs75dLWeW\ncH2BJen4UcGK8BX////+7K1EtvBdFbMxRlScIpe1IqXu2EMM/1lnWObEPQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 369,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100d7d70c581ae9e3f66dc6a480bf037ae23f8a1e4a2136fe4b03aa69f0ca25b35602210089c460f8a5a5c2bbba962c8a3ee833a413e85658e62a59e2af41d9127cc47224",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 370,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30440220341c1b9ff3c83dd5e0dfa0bf68bcdf4bb7aa20c625975e5eeee34bb396266b34022072b69f061b750fd5121b22b11366fad549c634e77765a017902a67099e0a4469",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 371,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3045022070bebe684cdcb5ca72a42f0d873879359bd1781a591809947628d313a3814f67022100aec03aca8f5587a4d535fa31027bbe9cc0e464b1c3577f4c2dcde6b2094798a9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdsa_secp256r1_sha512_test.json b/third_party/wycheproof/testvectors/ecdsa_secp256r1_sha512_test.json
new file mode 100644
index 0000000..5447901
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdsa_secp256r1_sha512_test.json
@@ -0,0 +1,4950 @@
+{
+  "algorithm" : "ECDSA",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "BER" : "This is a signature with correct values for (r, s) but using some alternative BER encoding instead of DER encoding. Implementations should not accept such signatures to limit signature malleability.",
+    "EdgeCase" : "Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA implementation does not check boundaries and computes s^(-1)==0.",
+    "MissingZero" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.",
+    "PointDuplication" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission."
+  },
+  "numberOfTests" : 440,
+  "header" : [],
+  "testGroups" : [
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e",
+        "wx" : "2927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838",
+        "wy" : "0c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKSexBRK64+3c/kZ4KBKLrSkDJpkZ\n9whgacjE32xzKDjHeHlk6qwA5ZIfsUmKYPRgZ2az2WhQAVWNGpdOc0FRPg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "signature malleability",
+          "msg" : "313233343030",
+          "sig" : "304402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c002205f85a63a5be977ad714cea16b10035f07cadf7513ae8cca86f35b7692aafd69f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "Legacy:ASN encoding of s misses leading 0",
+          "msg" : "313233343030",
+          "sig" : "304402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00220a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingZero"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "valid",
+          "msg" : "313233343030",
+          "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30814502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 5,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30460281202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 6,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "304602202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c002812100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 7,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3082004502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 8,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3047028200202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00282002100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 10,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304602202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304502212478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3045021f2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022200a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022000a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3085010000004502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304a028501000000202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304a02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00285010000002100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "308901000000000000004502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304e02890100000000000000202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304e02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0028901000000000000002100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30847fffffff02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "304902847fffffff2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "304902202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c002847fffffff00a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3084ffffffff02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "30490284ffffffff2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "304902202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00284ffffffff00a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3085ffffffffff02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "304a0285ffffffffff2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "304a02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00285ffffffffff00a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3088ffffffffffffffff02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "304d0288ffffffffffffffff2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "304d02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00288ffffffffffffffff00a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30ff02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "304502ff2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c002ff00a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "304502802478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0028000a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "3047000002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304a498177304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30492500304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3047304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304a222549817702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30492224250002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304d222202202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00004deadbeef022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304a02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c02226498177022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304902202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c022252500022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304d02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c02223022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304daa00bb00cd00304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304baa02aabb304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304d2228aa00bb00cd0002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304b2226aa02aabb02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304d02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c02229aa00bb00cd00022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304b02202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c02227aa02aabb022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3049228002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00000022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "304902202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c02280022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3080314502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3049228003202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00000022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "304902202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c02280032100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2e4502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2f4502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "314502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "324502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "ff4502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "30493001023044202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "304402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "3044202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 79,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb205000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "308002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "3047300002202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb23000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "3047304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "302202202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "306802202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "removing integer",
+          "msg" : "313233343030",
+          "sig" : "3023022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "302402022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "302302202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c002",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "304702222478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00000022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022300a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3047022200002478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 95,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00223000000a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 96,
+          "comment" : "appending unused 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00000022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "304702222478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00500022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "304702202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022300a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb20500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "30250281022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "302402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00281",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "30250500022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "302402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304500202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304501202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304503202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304504202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045ff202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0002100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0012100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0032100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0042100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0ff2100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "30250200022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "302402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "30492224020124021f78f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "304902202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c022250201000220a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202678f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022102a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f98140022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34e32",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3044021f2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3044021f78f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "304402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022000a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "304402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00220a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "30460221ff2478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "304602202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00222ff00a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "3026090180022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "302502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0090180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "302502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0020100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30460221012478f1cf49f6d858ac900a7af177222661ac95e206d32ee63020beee955ca711022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30460221ff2478f1d149f6d856ac900a7af1772226e7dea086b8a3f1dc48ad29689c965c6f022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30450220db870e2fb60927a8536ff5850e88ddd95b3a64cba0446f9ec3990bd467067e40022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3046022100db870e2eb60927a9536ff5850e88ddd918215f79475c0e23b752d6976369a391022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30460221fedb870e30b60927a7536ff5850e88ddd99e536a1df92cd119cfdf41116aa358ef022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30460221012478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3046022100db870e2fb60927a8536ff5850e88ddd95b3a64cba0446f9ec3990bd467067e40022100a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022101a07a59c3a41688548eb315e94effca0efd1ffe0a13467061783dde1cce167403",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00220a07a59c5a41688528eb315e94effca0f835208aec517335790ca4896d5502961",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00221ff5f85a63b5be977ac714cea16b10035f0bfc6fca393d12e237b7beca62e4cb14e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c00221fe5f85a63c5be977ab714cea16b10035f102e001f5ecb98f9e87c221e331e98bfd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c0022101a07a59c4a41688538eb315e94effca0f4039035c6c2ed1dc84841359d1b34eb2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304402202478f1d049f6d857ac900a7af1772226a4c59b345fbb90613c66f42b98f981c002205f85a63b5be977ac714cea16b10035f0bfc6fca393d12e237b7beca62e4cb14e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020101090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30080201ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325500201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325520201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000001000000000000000000000001000000000000000000000000020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000001000000000000000000000001000000000000000000000000020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff000000010000000000000000000000010000000000000000000000000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100ffffffff00000001000000000000000000000001000000000000000000000000090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "Edge case for Shamir multiplication",
+          "msg" : "3932323038",
+          "sig" : "3044022064a1aab5000d0e804f3e2fc02bdee9be8ff312334e2ba16d11547c97711c898e02203c623e7f7598376825fa8bc09e727c75794cbb4ee8716ae15c31cd1cbe9ca3ee",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "special case hash",
+          "msg" : "33393439313934313732",
+          "sig" : "304402203a4f61f7f8c4546e3580f7848411786fee1229a07a6ecf5fb84870869188215d022018c5ce44354e2274eadb8fea319f8d6f60944532dbaae86bfd8105f253041bcb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "special case hash",
+          "msg" : "35333637363431383737",
+          "sig" : "304502203fa9975fb2b08b7b6e33f3843099da3f43f1dcfe9b171a60cafd5489ca9c5328022100985a86825a0cc728f5d9dac2a513b49127a06100f0fc4b8b1f200903e0df9ed2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "special case hash",
+          "msg" : "35363731343831303935",
+          "sig" : "304402204d66e7ee5edd02ab96db25954050079ef8de1d0f02f34d4d75112eaf3f73124002206292d1563140013c589be40e599862bdd6bda2103809928928a119b43851a2ce",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "special case hash",
+          "msg" : "3131323037313732393039",
+          "sig" : "3046022100a9228305f7b486f568eb65d44e49ba007e3f14b8f23c689c952e4ced1e6cf91e022100b73c74d28bd1268002bed784a6b06c40a90ee5938ea6d08f272d027e0f96a72c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "special case hash",
+          "msg" : "3131323938303334323336",
+          "sig" : "304402203fa39842bfab6c38afa7963c60beb09484d4579fc75ef09efff44e91bc62ca8302205612add1924f0285ace5b158828e2b32ab2b6e7f10ee68dca1cc54591fee1fec",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "special case hash",
+          "msg" : "39383736303239363833",
+          "sig" : "3045022006c04b02edfeecd8620f035ea4f449bd924593e86e5288a6f22d1923b0e2e8a9022100f666718e6fefb515bb9339d29cc0e58cfba89d605ca0066bca87f6a3f08ebcfa",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "special case hash",
+          "msg" : "3230323034323936353139",
+          "sig" : "304402201ddd953c32a5f84109cd4d9ec8c364dd318376ff5d228211a367483077d638800220563dba4845de762baf04910618d587e0dd0c97dd1c9785c24ffdf2f8a660abf2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "special case hash",
+          "msg" : "31343531363639313830",
+          "sig" : "30460221009fe4ec4831ef4945f100d5d35a2e6312411ca5df6c900ca60690f2985d553482022100c674ad5e1bead2f767c9248e444452a4a8530dd47246cbbc968da865bdf212b6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "special case hash",
+          "msg" : "31303933363835393531",
+          "sig" : "3046022100e8703d6b16a79fc2ab3653cece29d06f65dd6f2c230cb08ee30c5517407d75db0221008cfeb87b8e95ddacd638b37d315393c5005f3ab8bba0cc1cd1a050829b775bfb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "special case hash",
+          "msg" : "36323139353630323031",
+          "sig" : "3046022100def608caf1f277d71403009f209c1d7eef11aaa7920397fbf429b8146181aece022100f3b8f2aa5b3df9a8b37313ea66ad5b74673f3e8614ff471b1eb6773217511fb0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "special case hash",
+          "msg" : "35363832343734333033",
+          "sig" : "304402204f5d08e8d936ce831d02d6b23fb8fce0e0750101af3ab9c3b28636b95a5e24ad02206f034480553bcecac221f8be8288163c55492e2e56a88f4d0341b61436a0a6c0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "special case hash",
+          "msg" : "33373336353331373836",
+          "sig" : "3045022100bdd822bfe3733d9f4b88764fe091db2e8f8af366e4c44d876bf82e62bd48c7ee02207fbf7750c5dc849a2c55dbdd067806f869652a7b3a57baa4733781d3128f02de",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "special case hash",
+          "msg" : "34373935393033373932",
+          "sig" : "304402201c4fc02961b7f4245566b410bf08f447502ea4f75b15690344681efa2edf7b4b02207d63eef119dc88bc4a1b2c43ac21cd53892443661f8c3a97d558bf888c29f769",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "special case hash",
+          "msg" : "39333939363131303037",
+          "sig" : "304402206406f2d249ab1264e175476ca3300efd049fcad569dff40b922082b41cc7b7ce0220461872b803383f785077714a9566c4d652e87b2cad90dd4f4cc84bc55004c530",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 231,
+          "comment" : "special case hash",
+          "msg" : "31303837343931313835",
+          "sig" : "30450220415c924b9ba1902b340058117d90623602d48b8280583fb231dc93823b83a153022100f18be8cdc2063a26ab030504d3397dc6e9c6b6c56f4e3a59832c0e4643c0263c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 232,
+          "comment" : "special case hash",
+          "msg" : "33323336363738353030",
+          "sig" : "3045022100d12e96c7d2f177b7cf6d8a1ede060a2b174dc993d43f5fe60f75604824b64fef02200c97d87035fcca0a5f47fe6461bb30cbaf05b37e4211ec3fcd51fc71a12239ca",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 233,
+          "comment" : "special case hash",
+          "msg" : "31343438393937373033",
+          "sig" : "304502207df72a64c7e982c88f83b3a22802690098147e0e42ef4371ef069910858c0646022100adbaa7b10c6a3f995ed5f83d7bda4ba626b355f34a72bf92ff788300b70e72d0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 234,
+          "comment" : "special case hash",
+          "msg" : "35373134363332383037",
+          "sig" : "30440220047c4306f8d30e425ae70e0bee9e0b94faa4ef18a9c6d7f2c95de0fe6e2a323702207a4d0d0a596bd9ea3fe9850e9c8c77322594344623c0b46ac2a8c95948aefd98",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 235,
+          "comment" : "special case hash",
+          "msg" : "323236343837343932",
+          "sig" : "3044022057d603a367e23af39c95dd418c0176da8b211d50b1be82bf5ef621a2640204f702205dc3f285ad015c4d71157bd11e5b8df6a89e4b267393b08b5ad5013bdae544b1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 236,
+          "comment" : "special case hash",
+          "msg" : "35333533343439343739",
+          "sig" : "3044022011df6741021ec8cc567584aea16817c540859c4e5011551c00b097fcfc2337e50220668551919d43206ac0571fc5ad3ac0efb489bea599e7bf99fe4c7468d6c2c5e0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 237,
+          "comment" : "special case hash",
+          "msg" : "34373837333033383830",
+          "sig" : "304402207451ffede471bd370406533436fc42a89daa0af4903d087cbc062fe7e54dbf700220590895398f22b48ce72cbf7c3d3ee1dd7fb0ee645edb0b1b1de35f370e5bf5ee",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 238,
+          "comment" : "special case hash",
+          "msg" : "32323332313935383233",
+          "sig" : "3045022100fc4c4d81da6f687a6426263193c1a680b67734a1b180647b8c76407cc4f0a9c6022056f775d372c9bee685374085be676c9cf31cf1f978a5e6ccb04e4a0761159cc7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 239,
+          "comment" : "special case hash",
+          "msg" : "3130373339333931393137",
+          "sig" : "3045022100feb978ca33c46ffba47eb63bb40de7833e43d5654575b54de1fea3d1de3c8ad50220108078ba997bfa064521baf342c97b0c64bd25240c8fd0fd7533ae2d03081b70",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 240,
+          "comment" : "special case hash",
+          "msg" : "31383831303237333135",
+          "sig" : "3046022100cc61729698467ba53da199ff481fe7433f194fc96367907e8dc5e1d9f42b1e2102210083dd9ef156e7c1f9c09b3bf86a4f1c88e5dd20cd74d997858e600797dbe74ad2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 241,
+          "comment" : "special case hash",
+          "msg" : "36303631363933393037",
+          "sig" : "3045022100d47f616303ff0eb813eac32e760ba30ad445e0af7dc57e70756104823f6a895f0220047f2217b399c46a426b936a124980a6011f0896f51dbe07632828a72d7173f1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 242,
+          "comment" : "special case hash",
+          "msg" : "38383935323237303934",
+          "sig" : "3046022100cff73dfa2bac67ce1340b25c885abb3e7979ef7f840f15d5f19e86640cdd40a3022100c7d1210802796c4f251049ee08a2c29f5c71064033d17010c65bf2e94499381e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 243,
+          "comment" : "special case hash",
+          "msg" : "31353830323334303934",
+          "sig" : "3044022010acaf9c485ab1220355b95be269f124e12eb252f2224b0fc50785eb2ee3df45022032443b557efc6896347fa778e1fcf33cbb769c9a7da896b20d93fea7c2791ea4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 244,
+          "comment" : "special case hash",
+          "msg" : "33393635393931353132",
+          "sig" : "3046022100f919da0651abc2bff994a879d2778fa5195d57400e003e8dd6adb3fc7a0cc4cc0221009b945d06bd119665b278a59bd24fdd2350817d0be87997bee57b70c479d64a2d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 245,
+          "comment" : "special case hash",
+          "msg" : "32323838373332313938",
+          "sig" : "3045022100cc38e7a018f6d70b2d9b49120cc9b4a169f2f72238821a86b81f553b6225d24e0220276efd8bf06ccce07c7aae35eaac3bd1c374dcf0cf0588d5e0e4171936688636",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 246,
+          "comment" : "special case hash",
+          "msg" : "32323330383837333139",
+          "sig" : "3045022100ff85ad66621991c318b85cef73c576cb2a8d43c568c1aafc85b40ef2a9a6b41c0220732a79e6837ebf8434fea6e7fefa948f506ae455c1a3eb36a030185a23037d96",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 247,
+          "comment" : "special case hash",
+          "msg" : "313239303536393337",
+          "sig" : "3044022033f016e51eef9b1136380cb8b84c6b38b107e24c6731bd07cb1c7f4a29f33a83022036b177bb8be94c8be67ff3a41fcc4d22b5c9eb377da713eb014ae01c64ca6dd7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 248,
+          "comment" : "special case hash",
+          "msg" : "32373438363536343338",
+          "sig" : "3045022100929413ee91f27454d74e91370a10a86fc98ac7305c8ab4ca59752bda3a7bfc370220483b47a26a0d7d2e6bd37d351d9ee37c5ec2a4686d884d78b6beb7f6b08c50f9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 249,
+          "comment" : "special case hash",
+          "msg" : "37353833353032363034",
+          "sig" : "30450220578202c7d0abac93ca43dde3cb44414e5601c1eb557604cb9adb4bde0a12633b022100fb9a7412e307aee95ef4b53540571a21559414e5306794ab5182cfb229dab3e9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 250,
+          "comment" : "special case hash",
+          "msg" : "32333237373534323739",
+          "sig" : "3045022046d45ad0bb75b8639d0e91d8450fc31887c211328a5784fc83b4cb7f5b962c1b022100d6751d13ede2079b7aa1d822bdb32d7f3cf00273a1ff03df90c0ec7c62a47568",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 251,
+          "comment" : "special case hash",
+          "msg" : "373735353038353834",
+          "sig" : "3046022100abe84c941783d5ced284fea56341ecc68d6bdd3196d318fbd074641f8c885bd5022100bdea3c44d48e01aa40935c1c9723ff733199563440f26b4ecf0b444b0418d9f5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 252,
+          "comment" : "special case hash",
+          "msg" : "3137393832363438333832",
+          "sig" : "3045022005277cdbf491e336fe81be24e393a161a4fb89112c9ffed1ee6649c406713408022100ab6934332e68e108bb0484d21c457dcf381a620c3a4712fdbfeb658a3fafd60c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 253,
+          "comment" : "special case hash",
+          "msg" : "32333936373737333635",
+          "sig" : "30450220293825737c8c14430ed10dbadd7da337275f9b61d1d26377f778ffaa00c139de022100cdddec267a8678c96829bf6c1d6f38322e119937cfd2fee01e9dc9525f43ed6b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 254,
+          "comment" : "special case hash",
+          "msg" : "35393938313035383031",
+          "sig" : "304402202041fdd6111c45dfd29e750e082dcdadc9a584a8a2be46580fb0ba3b3dc658620220421824fe987e4172a0f8bbcb7bcd9e1b073b7742ed9f9df98f2a1a37cd374ce3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 255,
+          "comment" : "special case hash",
+          "msg" : "3136363737383237303537",
+          "sig" : "30450220267941db660e046ab14e795669e002b852f7788447c53ebef46a2056978b5574022100d00183bcaf75bc11e37653f952f6a6537151c3aa0a1b9e4e41b004a29185395b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 256,
+          "comment" : "special case hash",
+          "msg" : "323036323134333632",
+          "sig" : "304402205dcd7f6814739d47f80a363b9414e6cbfb5f0846223888510abd5b3903d7ae09022043418f138bb3c857c0ad750ca8389ebcf3719cb389634ac54a91de9f18fd7238",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 257,
+          "comment" : "special case hash",
+          "msg" : "36383432343936303435",
+          "sig" : "304502205e0e8cc0280409a0ce252da02b2424d2de3a52b406c3778932dbc60cb86c356702210093d25e929c5b00e950d89585ec6c01b6589ae0ec0af8a79c04df9e5b27b58bc5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 258,
+          "comment" : "special case hash",
+          "msg" : "33323639383937333231",
+          "sig" : "304502204fcf9c9d9ffbf4e0b98268c087071bffe0673bb8dcb32aa667f8a639c364ea47022100820db0730bee8227fc831643fcb8e2ef9c0f7059ce42da45cf74828effa8d772",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 259,
+          "comment" : "special case hash",
+          "msg" : "31333837333234363932",
+          "sig" : "3046022100c60cd2e08248d58d1639b123633643c63f89aff611f998937ccb08c9113bcdca022100ac4bb470ce0164616dada7a173364ed3f9d16fd32c686136f904c99266fda17e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 260,
+          "comment" : "special case hash",
+          "msg" : "34313138383837353336",
+          "sig" : "304502207cfdaf6f22c1c7668d7b6f56f8a7be3fdeeb17a7863539555bbfa899dd70c5f1022100cee151adc71e68483b95a7857a862ae0c5a6eee478d93d40ccc7d40a31dcbd90",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 261,
+          "comment" : "special case hash",
+          "msg" : "393838363036353435",
+          "sig" : "304402202270be7ee033a706b59746eab34816be7e15c8784061d5281060707a0abe0a7d022056a163341ee95e7e3c04294a57f5f7d24bf3c3c6f13ef2f161077c47bd27665d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 262,
+          "comment" : "special case hash",
+          "msg" : "32343739313135383435",
+          "sig" : "3044022016b5d2bfcaba21167a69f7433d0c476b21ded37d84dc74ca401a3ecddb2752a8022062852cf97d89adfb0ebbe6f398ee641bfea8a2271580aac8a3d8326d8c6e0ef9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 263,
+          "comment" : "special case hash",
+          "msg" : "35303736383837333637",
+          "sig" : "3046022100d907eefa664115848b90c3d5baa0236f08eafaf81c0d52bb9d0f8acb57490847022100fd91bc45a76e31cdc58c4bfb3df27f6470d20b19f0fba6a77b6c8846650ed8a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 264,
+          "comment" : "special case hash",
+          "msg" : "393838353036393637",
+          "sig" : "30450220048337b34f427e8774b3bf7c8ff4b1ae65d132ac8af94829bb2d32944579bb31022100bd6f8eab82213ccf80764644204bb6bf16c668729cdd31dd8596286c15686e8e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 265,
+          "comment" : "special case hash",
+          "msg" : "32373231333036313331",
+          "sig" : "3046022100b2bc46b7c44293557ab7ebeb0264924277193f87a25d94c924df1518ba7c7260022100abf1f6238ff696aaafaf4f0cbbe152c3d771c5bfc43f36d7e5f5235819d02c1a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 266,
+          "comment" : "special case hash",
+          "msg" : "33323034313031363535",
+          "sig" : "3045022040d4b38a61232e654ffd08b91e18609851f4189f7bf8a425ad59d9cbb1b54c990221009e775a7bd0d934c3ed886037f5d3b356f60eda41191690566e99677d7aaf64f3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 267,
+          "comment" : "special case hash",
+          "msg" : "33313530363830393530",
+          "sig" : "3046022100ac8f64d7df8d9fea005744e3ac4af70aa3a38e5a0f3d069d85806a4f29710339022100c014e96decfef3857cc174f2c46ad0882bef0c4c8a17ce09441961e4ae8d2df3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 268,
+          "comment" : "special case hash",
+          "msg" : "31373237343630313033",
+          "sig" : "3044022041b3766f41a673a01e2c0cab5ceedbcec8d82530a393f884d72aa4e6685dea0a0220073a55dca2da577cafb40e12dd20bf8529a13a6acdf9a1c7d4b2048d60876cb3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 269,
+          "comment" : "special case hash",
+          "msg" : "3134353731343631323235",
+          "sig" : "304502201942755aa8128382cd8e35a4350c22cc45ba5704d99e8a240970df11956ad866022100f64cf1e0816cf7ac5044f73ba938e142ef3305cb09becb80a0a5b9ad7ba3eb07",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 270,
+          "comment" : "special case hash",
+          "msg" : "34313739353136303930",
+          "sig" : "3045022051aba4ff1c7ddf17e0632ab71684d8de6dc700219ef346cb28ce9dafc3565b3b022100b6aaebe1af0ad01f07a68bf1cf57f9d6040b43c14b7eb8238542760e32ce3b0c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 271,
+          "comment" : "special case hash",
+          "msg" : "35383932373133303534",
+          "sig" : "304502210091efbfcc731650e9f004c38b71db146c17bf871c82c4e87716f7ff2f7f9e51d00220089ea631a7c5f05311c521d21ba798b5174881f0fd8095fb3a77515913efb6e0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 272,
+          "comment" : "special case hash",
+          "msg" : "33383936313832323937",
+          "sig" : "304502204a7e47bd281ea09b9e3a32934c7a969e1f788f978b41585989f4689e804663fb022100e65f6bd702403cbbed7f8ad0045f331d4a96fbf8c43f71f11615b7d1b9153b7f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 273,
+          "comment" : "special case hash",
+          "msg" : "38323833333436373332",
+          "sig" : "3046022100c795f5da86e10a604d4f94bf7cac381c73edad1461d66929e53aa57ca294e89f022100bae784ab6c7b58332ee05e7d54169edf55ce45f030e71ae8df63969fb327a10c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 274,
+          "comment" : "special case hash",
+          "msg" : "33333636393734383931",
+          "sig" : "3046022100ea68b24843b225f505e01c0e608b20b4d93e8faf6b9cf70cf8f9134a80e7b668022100a3abc044b4728f80fe414bdc66f032b262356720547bec7729fad94151c6adc7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 275,
+          "comment" : "special case hash",
+          "msg" : "32313939313533323239",
+          "sig" : "3046022100bfe7502140c57a24a77edc3d9b3c4bc11d21bdb0b196977b7f2b13ac973ad697022100947a01da9731849d72b67ef7bc40b012480fd389895aad1f6b1cdbeab3b93b8d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 276,
+          "comment" : "special case hash",
+          "msg" : "35363030333136383232",
+          "sig" : "304402203434ee1142740a0ab8623b97fc8dc2567eda45dadf6039b45c448819e840cf3002203c0fac0487841997202c29f3bf2df540b115b29dc619160d52203d4a1fd4b9f7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 277,
+          "comment" : "special case hash",
+          "msg" : "383639363531363935",
+          "sig" : "304502205338500e23ba96a0adc6ef84932e25fbad7435d9f70eb7f476c6912de12e33c8022100a002f5583ea8c0d7fb17136d0ee0415acf629879ce6b01ac52e3ecd7772a3704",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 278,
+          "comment" : "special case hash",
+          "msg" : "36353833393236333732",
+          "sig" : "304402204ff2d4e31f4180de6901d2d20341d12387c9c55f4cf003a742f049b84af6fe0502200312f38771414555fa5ed2817dcc629a8c7cf69d306300e87bc167278ec3ef37",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 279,
+          "comment" : "special case hash",
+          "msg" : "3133323035303135373235",
+          "sig" : "3044022051d665bad5f2d6306c6bbfe1f27555887670061d4df36ec9f4ce6cdfaf9ea7ac02202905e43f6207ee93df35a2e9fb9bc8098c448ae98a14e4ad1ebaea5d56b6e493",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 280,
+          "comment" : "special case hash",
+          "msg" : "35303835333330373931",
+          "sig" : "3046022100b804e0235f135aba7b7531b6831f26cc9fb77d3f83854957431be20706b813690221009d317fd08e4e0467617db819cde1d7d4d74da489b2bce4db055ea01eccfafcf2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 281,
+          "comment" : "special case hash",
+          "msg" : "37383636383133313139",
+          "sig" : "30450221008ab50ef3660ccb6af34c78e795ded6b256ffca5c94f249f3d907fb65235ef680022049d5aaeae5a6d0c15b286e428b5e720cf37a822ede445baa143ffae69aba91b8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 282,
+          "comment" : "special case hash",
+          "msg" : "32303832353339343239",
+          "sig" : "30440220571b9c46a47c5cc53a574c196c3fb07f3510c0f4443b9f2fe781252c24d343de022068a9aebd50ff165c89b5b9cb6c1754191958f360b4d2851a481a3e1106ee7809",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 283,
+          "comment" : "special case hash",
+          "msg" : "3130303635393536363937",
+          "sig" : "304502204cb7817b04dc73be60d3711803bc10687a6e3f4ab79c4c1a4e9d63a73174d4eb022100ce398d2d6602d2af58a64042f830bf774aee18209d6fb5c743b6a6e437826b98",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 284,
+          "comment" : "special case hash",
+          "msg" : "33303234313831363034",
+          "sig" : "30450220684399c6cd6ebb1c5d5efb0d78dce40ebd48d9d944eb6548c9ce68d7fdc82229022100cf25c8e427fae359bfe60fa02964f4c9b8d6db54612e05c78c341f0a8c52d0b5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 285,
+          "comment" : "special case hash",
+          "msg" : "37373637383532383734",
+          "sig" : "3045022020b7b36d5bc76fa182ca27152a99a956e6a0880000694296e31af98a7312d04b022100eeeabc5521f9856e920eb7d29ed7e4042f178ff706dff8eeb24b429e3b63402a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 286,
+          "comment" : "special case hash",
+          "msg" : "353434313939393734",
+          "sig" : "304402206b65c95e8e121d2e6ee506cfd62cb88e0bfb3589da40876898ef66c43982aca9022009642c05ad619b4402fd297eb57e29cca5c2eb6823931ba82de32d7c652ba73e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 287,
+          "comment" : "special case hash",
+          "msg" : "35383433343830333931",
+          "sig" : "3044022067c74cbf5ea4b777bf521ace099f4f094d8f58900e15e67e1b4bd399056629ed02203d2884655c49b8b5f64e802a054e7bf09b0fc80ca18ebf927b82e58bb4a00400",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 288,
+          "comment" : "special case hash",
+          "msg" : "373138383932363239",
+          "sig" : "3045022079a5e40da5cf34c4c39adf7dfc5d454995a250314ebd212b5c8e3f4e6f875feb022100b268920e403ba17828ff271938a6558a5b2dd000229f8edb4a9d9f9b6ac1b472",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 289,
+          "comment" : "special case hash",
+          "msg" : "31373433323233343433",
+          "sig" : "3045022100c8b13006c3a51a322fff9321761b01de134f526be582b22e19693c443fc9fe46022034e7f60179c6162ab980fcd58f173b0e6c30b524d35c67921677522dcef843a1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 290,
+          "comment" : "special case hash",
+          "msg" : "32343036303035393336",
+          "sig" : "304502203513db745489a487c88a6cedf8795b640f8f71578397bdabd6cc586c25bd66ad02210099a72cd3f0ca6c799149283ca0af37f86b88200d0c905bd3c9f1b859e55b1659",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 291,
+          "comment" : "special case hash",
+          "msg" : "31363134303336393838",
+          "sig" : "304402203a6386afb08f7ff8140b5a270f764e8706ef2830fb177446f7b4eeb8a25aac6402204b70854b38c29245b2b980eba10ea936c68a38c1da5255ce2386db23afc7c06a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 292,
+          "comment" : "special case hash",
+          "msg" : "32303935343235363835",
+          "sig" : "3046022100b8fc54a8a6be3c55e99c06f99ccdcce7af5c18a3c5829726a870cc1068458f64022100cc7237c39c8e6a4a1c8c62f5f88636549c7410798b89684c502c3adfe5fb7ad2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 293,
+          "comment" : "special case hash",
+          "msg" : "31303038303938393833",
+          "sig" : "3045022047b460851e5607f2021626635c565a63f78f558795e1b330d09115970dbbb8ab022100a6a9f4f213e08d3c736d3e1c44a35140cb107619f265a5b13608ed729fd6d894",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 294,
+          "comment" : "special case hash",
+          "msg" : "31353734313437393237",
+          "sig" : "30450221008cfda4f7a65864ebbea3144863da9b075c07b5b42cb4569643ddfd70dd753b190220595784b1ab217874b82b9585521f8090b9f6322884ab7a620464f51cf846c5b7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 295,
+          "comment" : "special case hash",
+          "msg" : "32383636373731353232",
+          "sig" : "304402204cd6a45bd7c8bf0edbdf073dbf1f746234cbbca31ec20b526b077c9f480096e702207cf97ae0d33f50b73a5d7adf8aa4eeeb6ff10f89a8794efe1d874e23299c1b3d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 296,
+          "comment" : "special case hash",
+          "msg" : "31363934323830373837",
+          "sig" : "304402202e233f4df8ffebeaec64842b23cce161c80d303b016eca562429b227ae2b58ec022046b6b56adec82f82b54daa6a5fca286740a1704828052072a5f0bc8c7b884242",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 297,
+          "comment" : "special case hash",
+          "msg" : "39393231363932353638",
+          "sig" : "30440220549f658d4a3f98233a2c93bd5b1a52d64af10815ae60becb4139cac822b579c3022027bdddf0dbcf374a2aec8accc47a8ac897f8d1823dda8eb2052590970b39ce2a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 298,
+          "comment" : "special case hash",
+          "msg" : "3131363039343339373938",
+          "sig" : "30450221009fabcc1e5fd965226902f594559e231369e584453974e74f49d7d762e134fb9d0220293cccc510793bac45ce5da2bb6c9e906437f59435ca206655f74b625df07c7c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 299,
+          "comment" : "special case hash",
+          "msg" : "37313836313632313030",
+          "sig" : "304502202e5c140fd6f5f823addc8088ffaae967e7f4897274316769561dfb31435825d9022100eda47327d7cfae1daa344ff5582a467bd18eb9f01caeab9c6da3c0cc89df6713",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 300,
+          "comment" : "special case hash",
+          "msg" : "33323934333437313737",
+          "sig" : "304402204c11e3b7efbe3908ad2118e54d7d34d6c6eb4570bf7fdb11a7679fe93afa254c0220712e90f421836e542dac49d10bb39db4a98b2735b6336d8a3c392f3b90e60bbe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 301,
+          "comment" : "special case hash",
+          "msg" : "3138353134343535313230",
+          "sig" : "3045022100dfb4619303f4ff689563d2275069fac44d63ea3c3b18f4fb1ac805d7df3d12ec022068e37b846583901db256329f9cf64f40c416fba50dcb9be333a3e29c76ae32db",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 302,
+          "comment" : "special case hash",
+          "msg" : "343736303433393330",
+          "sig" : "3045022100e70e8e17bd758ff0c48f91cb2c53d293f0f5ae82eb9dfe76ab98f9b064278635022021dde32cb0389cad7bdf676d9b9b7d25bb034ad25a55ea71ee7ee26a18359dd2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 303,
+          "comment" : "special case hash",
+          "msg" : "32353637333738373431",
+          "sig" : "30440220421397ecae30617a5a6081ad1badf6ce9d9d4cb2afdabf1f900e7fdb7fb0af5a022057ca89dc22801c75fdbefdaeca65c675625f94de7d635062b08ed308df5762cc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 304,
+          "comment" : "special case hash",
+          "msg" : "35373339393334393935",
+          "sig" : "304502200610c08076909bb722fba105c23eac8f66b4db1d58f66a882fc90d59acdec8e0022100af59e8d570761cac589d49f11c884007f7ac1eea1a44c6f3fdad1d542187d25e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 305,
+          "comment" : "special case hash",
+          "msg" : "33343738333636313339",
+          "sig" : "3045022059a1181cab0ee8ce94ab2b5ab4f4b13a422e38efe69f634bf947485a5b9ea49c0221009b3c913d98a4ab15f6a39f1802b8f2d28559aa1f8d03a3a88df00c89dc293a97",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 306,
+          "comment" : "special case hash",
+          "msg" : "363439303532363032",
+          "sig" : "30460221008cae6c4dfbf901bd66ab82541011fa15c8e90e2c18c01bd881acaa2b63cb587b022100a86acf943f29cef91d1b66a7de5547df6cdfc45dd7bef816dcb8de9f5a425d2d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 307,
+          "comment" : "special case hash",
+          "msg" : "34373633383837343936",
+          "sig" : "30450221008b00c74b86474d782eac9974aea606d8f7ee78c79597e15687021f5991e86acd0220309dfe3686648eae104e87b3e9b5616a3ad479ca4f0b558ae4f1e5ab3115346a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 308,
+          "comment" : "special case hash",
+          "msg" : "353739303230303830",
+          "sig" : "30450220433a915504c977809634a36fcf4480e4c8069fc127d201d30dfdb1f423c95fd4022100bcb1b89aafd50a1766b09741fc6a9a96e744ae9826d839bf85ffb50a91981773",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 309,
+          "comment" : "special case hash",
+          "msg" : "35333434373837383438",
+          "sig" : "304502204b69abd2b39840a545cdd4a72d384234580e2fd938b7091d0ecdb562780857db022100fdab9957119e0a4092af82f6cc29f3c8a692671ec86efb0a03c1112a0a1e0467",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 310,
+          "comment" : "special case hash",
+          "msg" : "3139323636343130393230",
+          "sig" : "3045022100dab9d3686c28363ad017b4a2b36d35bf2eb80633613d44deb9501d42a3efbd3802201392a562d79f9ab19014e4f7e2f2668259f3720a76c120d4a3c3964e880f7679",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 311,
+          "comment" : "special case hash",
+          "msg" : "33373033393135373035",
+          "sig" : "3045022023f94e47b440ce379b74c9311232b19a64e3e7c9b90da34b0c1c3f3d7af28105022100e1425903b1479c2ce18b108a6d1ec8b7a4f0f657dedb00de3a3ceea7fdeee9be",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 312,
+          "comment" : "special case hash",
+          "msg" : "3831353435373730",
+          "sig" : "30450221009d706a8fa85d15bd0c3492c6672dfe529f4073b217b3947b5b2cfd61f87ccb7102206aaaaf369f82a0e542f72ded7d7eb90c8314ffa613a0ea81da1c8393dbae2bac",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 313,
+          "comment" : "special case hash",
+          "msg" : "313935353330333737",
+          "sig" : "3046022100ac77918c4085c8a7ce5020b00c315629aee053a445cb4661eb50f6b62a47da29022100df2aea2b9c11a6ce39d3cd9e1faf4a53057e0b1b2e48a324be9e773203fe9fbb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 314,
+          "comment" : "special case hash",
+          "msg" : "31323637383130393033",
+          "sig" : "30460221009db2dbd2935f147fae7f6a95c8e2307bd8537c3d96eb732ad6d5ebdd89bc754e02210093a9ab99d2de9d08fe0a61e26c8fe1ebbf88726e4b69d551b57d15f0ae16df5a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 315,
+          "comment" : "special case hash",
+          "msg" : "3131313830373230383135",
+          "sig" : "30440220769f70093939afbd1fa15873decfa803ca523ace8040280ba78cf833497722bc0220369875aba5e1ced5a4ca8444ec9399a38038b00e153a0ae34d9b3c9781447eea",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 316,
+          "comment" : "special case hash",
+          "msg" : "38333831383639323930",
+          "sig" : "3045022026e5182b9822550ad52f46ad80781d6bef3d110a204db5e58a0746f796982200022100a9418e76029ced0cf78a571a9e59ad04086e91f70e6813981bb33c1dee891165",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 317,
+          "comment" : "special case hash",
+          "msg" : "33313331323837323737",
+          "sig" : "3046022100e7bd6aefcf7b27e1f3fadbe713f9adb3d23398e88200cd2e94989c9d12e921770221009583e0de3b76f8d4b1e634a81cbc34af54e2f8599f3684ce48d372760c8204c4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 318,
+          "comment" : "special case hash",
+          "msg" : "3134333331393236353338",
+          "sig" : "30450221008638ed7eaa83609a01a6af9c52ec9bfddda90442b1e6031d61cfa22e48b2e1e2022020c284d596f71c6c8df732f5a5a2006302301e1a792e2b39663d93a9760762d2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 319,
+          "comment" : "special case hash",
+          "msg" : "333434393038323336",
+          "sig" : "3044022061d924307a96180b06383608ba91674e15c3ea06ff2534412b93a587dde649c1022059b84aa2115b2547edac88088ca6313e9fbe1ca6a361c7e57938f9dde3f4349c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 320,
+          "comment" : "special case hash",
+          "msg" : "36383239383335393239",
+          "sig" : "30450220424fcfc3fd63d128c2eb125e88c7fe5d283b63470a786b82783edbb8a0b7a6d7022100b11548c2cd7fce9d44e795ca51af0b2f6a5180e9c9be0314007ed9e7f4bbe5e9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 321,
+          "comment" : "special case hash",
+          "msg" : "33343435313538303233",
+          "sig" : "3045022100a5f747ae6290fa9582c6ce8d5608621d495f061551bc4531bacba586a563b184022062faf8f92291e12812835b3f1d43c967bceb885b110bd06e5a68e2d74781ae2b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 322,
+          "comment" : "special case hash",
+          "msg" : "3132363937393837363434",
+          "sig" : "3045022100b731dc0d92c2cc7a605d78233f7814699bdf1cab2df297b6844eec4015af8ea0022039b1a0cc88eb85bcdc356b3620c51f1298c60aec5306b107e900ffdba049dd6f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 323,
+          "comment" : "special case hash",
+          "msg" : "333939323432353533",
+          "sig" : "3046022100ef73c4fa322da39fb6503bab6b66b64d241056afbcd6908f84b61ccbbe890433022100f1ef85413e5764aa58a3128ccfcf388324fe5340e5edf8d0135ae76786ce415b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 324,
+          "comment" : "special case hash",
+          "msg" : "31363031393737393737",
+          "sig" : "30450220694cd30e2ad0182579331474b271ee2d48723bc8415dc6513873586ce705b76b022100c5ac0c0ed5a4017d110cb45d63aa955dc7dc5ce23e7965c5397c3ff46a884636",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 325,
+          "comment" : "special case hash",
+          "msg" : "3130383738373535313435",
+          "sig" : "3046022100f38b2236be3024e10b894ffb1cc68d0bb8d4cf0fcd2cfc1779f8883765d3cd96022100da69cd0b74c25566d60a486edd559fc39d569fb2751445a4798df8a36891802c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 326,
+          "comment" : "special case hash",
+          "msg" : "37303034323532393939",
+          "sig" : "3046022100a881732c205a0b4b95669c00756fd91973450109a46f17d5a9d971b5e92b9aa40221008acefdca4e06c16b47ccad1c57c05912637e107096ba230c92b97187db79e19e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 327,
+          "comment" : "special case hash",
+          "msg" : "31353635333235323833",
+          "sig" : "3044022004452f554bae819b42effb84ef44a9f1cb7e2d75b4ba9ff9b9cfffaddde3fd1b022061a3fbc5e73c350f2e3d85a7452cd231a3f3375fc11f5fe153b185f53b09c1d0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 328,
+          "comment" : "special case hash",
+          "msg" : "3233383236333432333530",
+          "sig" : "3045022005814f57f58efc7cb490119e584e635e6f0ad1c19fb5dc2edafda075bb55f98e0221009dd5c6e39009d67d965903ecffe08a851775cc1248cc19c0b77798282131b8f6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 329,
+          "comment" : "special case hash",
+          "msg" : "31343437383437303635",
+          "sig" : "3045022100dc1c4a46085e198843b1f01980cd5e4a1ff6f8e8ff7014397f0afd5b247fb0a0022038a13dc723ed90b30251d742b14733a03292ff26530a1ebcaf3d10862a6eff82",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 330,
+          "comment" : "special case hash",
+          "msg" : "3134323630323035353434",
+          "sig" : "304502201067667bf525734ca7f2510e36348fd9c2c9bccf032dfd571de6d45abd49361a022100fa762568d3a19e5a1d8ea65e00202a5b16f9afae56733a01f86e35378c558da4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 331,
+          "comment" : "special case hash",
+          "msg" : "31393933383335323835",
+          "sig" : "3046022100e58d69dc56bc1031644847e3e046e2ea845a515d969d07ea1aa53aea5bd92fa1022100bfe50b80f7c512f5ab521fe7e1a131045fde78d4de826c91573baaba1e35ca97",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 332,
+          "comment" : "special case hash",
+          "msg" : "34323932313533353233",
+          "sig" : "3046022100fe79c6b8c14d0f23d426e3d157f1b541f6bb91bf29957ef97c55949c9ba48a350221009da112c4a4cf4b1ff490c426f6c8ff122183964a0de56f7336ab382dc9d10285",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 333,
+          "comment" : "special case hash",
+          "msg" : "34343539393031343936",
+          "sig" : "3045022045d4ed7e9edacb5a730944ab0037fba0a136ed9d0d26b2f4d4058554f148fa6f022100f136f15fd30cfe5e5548b3f4965c16a66a7c12904686abe12da777619212ae8c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 334,
+          "comment" : "special case hash",
+          "msg" : "31333933393731313731",
+          "sig" : "304402204fb7c1727e40bae272f6143a50001b54b536f90233157896dbf845e263f2486302206fea5c924dca17519f6e502ef67efa08d39eb5cc3381266f0216864d2bd00a62",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 335,
+          "comment" : "special case hash",
+          "msg" : "32333930363936343935",
+          "sig" : "30450220779aac665dd988054b04f2e9d483ca79179b3372b58ca00fe43520f44fcb4c32022100b4eca1182cd51f0abd3ea2268dcda49a807ad4116a583102047498aa863653f5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 336,
+          "comment" : "special case hash",
+          "msg" : "3131343436303536323634",
+          "sig" : "3046022100db7ac6f65fb1c38d80064fd11861631237a09924b4eeca4e1569fa4b7d80ad24022100a38d178d37e13e1afa07a9d03da025d594461938a62a6c6744f5c8f7d7b7bb81",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 337,
+          "comment" : "special case hash",
+          "msg" : "363835303034373530",
+          "sig" : "3046022100c90043b4aadf795d870ac223f33acdbd1948c31afff059054dc99528c6503fa6022100829f67b312bb134f6954a23c611a7f7b5b2a69efced9c48db589ac0b4d3da827",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 338,
+          "comment" : "special case hash",
+          "msg" : "3232323035333630363139",
+          "sig" : "3045022100fa16c0125b6615b90e81f7499804308a90179bf3fcff6a4b2695271c68b23ded02200d6cda5ce041dc5a5f319ad9c0de4927d0cf5e89e37b79216194413d42976d54",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 339,
+          "comment" : "special case hash",
+          "msg" : "36323135363635313234",
+          "sig" : "304502201a4b5bd0f806549f46a3e71bfe412d6d89206017640ded66f3d0b2d9b26bec45022100aac5f74e3130264e01428570ee82ee47e245d160ed812ae252dedffd82e1ec2c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b6e08b1bcc89e7fb0b84d7497e310553495be4877eccc4b3d6d79f7c68a0573431760fa1bcea4972759174ac1103bc6011985ccee251918d0573fbcb78969116",
+        "wx" : "0b6e08b1bcc89e7fb0b84d7497e310553495be4877eccc4b3d6d79f7c68a05734",
+        "wy" : "31760fa1bcea4972759174ac1103bc6011985ccee251918d0573fbcb78969116"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b6e08b1bcc89e7fb0b84d7497e310553495be4877eccc4b3d6d79f7c68a0573431760fa1bcea4972759174ac1103bc6011985ccee251918d0573fbcb78969116",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEtuCLG8yJ5/sLhNdJfjEFU0lb5Id+\nzMSz1teffGigVzQxdg+hvOpJcnWRdKwRA7xgEZhczuJRkY0Fc/vLeJaRFg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 340,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "313233343030",
+          "sig" : "303502104319055358e8617b0c46353d039cdaab022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 341,
+          "comment" : "r too large",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000000fffffffffffffffffffffffc022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043590c6a10353d669bc94d8e2ff9e14bbeed4a7f45b887255ab7e37b676387bb615fc6f97ce39a3874c2b34cc571889abfa0a706c2cfb0e5a4750cc25690696f8",
+        "wx" : "3590c6a10353d669bc94d8e2ff9e14bbeed4a7f45b887255ab7e37b676387bb6",
+        "wy" : "15fc6f97ce39a3874c2b34cc571889abfa0a706c2cfb0e5a4750cc25690696f8"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043590c6a10353d669bc94d8e2ff9e14bbeed4a7f45b887255ab7e37b676387bb615fc6f97ce39a3874c2b34cc571889abfa0a706c2cfb0e5a4750cc25690696f8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENZDGoQNT1mm8lNji/54Uu+7Up/Rb\niHJVq343tnY4e7YV/G+Xzjmjh0wrNMxXGImr+gpwbCz7DlpHUMwlaQaW+A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 342,
+          "comment" : "r,s are large",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04369e96402f2cfd1a37b3acbdecfc562862dbca944a0f12d7aaacb8d325d7650aa723621922be2bdac9186290fdcdda028d94437966507d93f2fc1f5c887fdedb",
+        "wx" : "369e96402f2cfd1a37b3acbdecfc562862dbca944a0f12d7aaacb8d325d7650a",
+        "wy" : "0a723621922be2bdac9186290fdcdda028d94437966507d93f2fc1f5c887fdedb"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004369e96402f2cfd1a37b3acbdecfc562862dbca944a0f12d7aaacb8d325d7650aa723621922be2bdac9186290fdcdda028d94437966507d93f2fc1f5c887fdedb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENp6WQC8s/Ro3s6y97PxWKGLbypRK\nDxLXqqy40yXXZQqnI2IZIr4r2skYYpD9zdoCjZRDeWZQfZPy/B9ciH/e2w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 343,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100909135bdb6799286170f5ead2de4f6511453fe50914f3df2de54a36383df8dd4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0427a0a80ea2e1aa798ea9bcc3aedbf01ab78e49c9ec2ad0e08a0429a0e1db4d0d32a8ee7bee9d0a40014e484f34a92bd6f33fe63624ea9579657441ac79666e7f",
+        "wx" : "27a0a80ea2e1aa798ea9bcc3aedbf01ab78e49c9ec2ad0e08a0429a0e1db4d0d",
+        "wy" : "32a8ee7bee9d0a40014e484f34a92bd6f33fe63624ea9579657441ac79666e7f"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000427a0a80ea2e1aa798ea9bcc3aedbf01ab78e49c9ec2ad0e08a0429a0e1db4d0d32a8ee7bee9d0a40014e484f34a92bd6f33fe63624ea9579657441ac79666e7f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJ6CoDqLhqnmOqbzDrtvwGreOScns\nKtDgigQpoOHbTQ0yqO577p0KQAFOSE80qSvW8z/mNiTqlXlldEGseWZufw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 344,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022027b4577ca009376f71303fd5dd227dcef5deb773ad5f5a84360644669ca249a5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049cff61712d4bc5b3638341e6e0a576a8098c9c6d3f198d389c4669f398dc0867f3b9e09f567f3dfd9c4d2c1163e82beadf16c76e8f9d7a64673800ea76fa1e59",
+        "wx" : "09cff61712d4bc5b3638341e6e0a576a8098c9c6d3f198d389c4669f398dc0867",
+        "wy" : "0f3b9e09f567f3dfd9c4d2c1163e82beadf16c76e8f9d7a64673800ea76fa1e59"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200049cff61712d4bc5b3638341e6e0a576a8098c9c6d3f198d389c4669f398dc0867f3b9e09f567f3dfd9c4d2c1163e82beadf16c76e8f9d7a64673800ea76fa1e59",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnP9hcS1LxbNjg0Hm4KV2qAmMnG0/\nGY04nEZp85jcCGfzueCfVn89/ZxNLBFj6Cvq3xbHbo+demRnOADqdvoeWQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 345,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020105020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d9117cae81295e82682fa387991e668e1570e0e90100bf4e63964822460561bc19f96b1787ed15769929978ba3dd7f68c97adf5c16f671e756cd8f08c49456ca",
+        "wx" : "0d9117cae81295e82682fa387991e668e1570e0e90100bf4e63964822460561bc",
+        "wy" : "19f96b1787ed15769929978ba3dd7f68c97adf5c16f671e756cd8f08c49456ca"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d9117cae81295e82682fa387991e668e1570e0e90100bf4e63964822460561bc19f96b1787ed15769929978ba3dd7f68c97adf5c16f671e756cd8f08c49456ca",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE2RF8roEpXoJoL6OHmR5mjhVw4OkB\nAL9OY5ZIIkYFYbwZ+WsXh+0Vdpkpl4uj3X9oyXrfXBb2cedWzY8IxJRWyg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 346,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020105020103",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048cfcbad3524c22b992529f943e3ce0b2d126085501d6e3edd4f1dbf74bdca21eafb259b1ba179cac09e8e43a88c8a09e7339910a7c941932e44b8be56f1fccde",
+        "wx" : "08cfcbad3524c22b992529f943e3ce0b2d126085501d6e3edd4f1dbf74bdca21e",
+        "wy" : "0afb259b1ba179cac09e8e43a88c8a09e7339910a7c941932e44b8be56f1fccde"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048cfcbad3524c22b992529f943e3ce0b2d126085501d6e3edd4f1dbf74bdca21eafb259b1ba179cac09e8e43a88c8a09e7339910a7c941932e44b8be56f1fccde",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEjPy601JMIrmSUp+UPjzgstEmCFUB\n1uPt1PHb90vcoh6vslmxuhecrAno5DqIyKCeczmRCnyUGTLkS4vlbx/M3g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 347,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020105020105",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fbb51127e1f1b6a38e9fe9a2544614edb8e43ad7cd8c56f14b3235dda3bc11179abd9753a9e647e9340c395fb2b91384d6d33fcb6456214350b6f3fa00f4364c",
+        "wx" : "0fbb51127e1f1b6a38e9fe9a2544614edb8e43ad7cd8c56f14b3235dda3bc1117",
+        "wy" : "09abd9753a9e647e9340c395fb2b91384d6d33fcb6456214350b6f3fa00f4364c"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004fbb51127e1f1b6a38e9fe9a2544614edb8e43ad7cd8c56f14b3235dda3bc11179abd9753a9e647e9340c395fb2b91384d6d33fcb6456214350b6f3fa00f4364c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+7URJ+HxtqOOn+miVEYU7bjkOtfN\njFbxSzI13aO8EReavZdTqeZH6TQMOV+yuROE1tM/y2RWIUNQtvP6APQ2TA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 348,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020105020106",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 349,
+          "comment" : "r is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632556020106",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04dc80905500d7d74ed47de5224d8734545f22b776ae086cabfffe6ce58d5ef994dc3067ce7d2cdfa9f4d5ace296b752814acc69c19a932d8b14077927901de3bf",
+        "wx" : "0dc80905500d7d74ed47de5224d8734545f22b776ae086cabfffe6ce58d5ef994",
+        "wy" : "0dc3067ce7d2cdfa9f4d5ace296b752814acc69c19a932d8b14077927901de3bf"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004dc80905500d7d74ed47de5224d8734545f22b776ae086cabfffe6ce58d5ef994dc3067ce7d2cdfa9f4d5ace296b752814acc69c19a932d8b14077927901de3bf",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3ICQVQDX107UfeUiTYc0VF8it3au\nCGyr//5s5Y1e+ZTcMGfOfSzfqfTVrOKWt1KBSsxpwZqTLYsUB3knkB3jvw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 350,
+          "comment" : "s is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3026020105022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc75fbd8",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041b824a11eed94fbcd9b722d06613bbcf7eca00b9136f2652642178f37b1a920ee900de495d9ef56fa6d19f3dd1e0edb23d23835ac8c2d3d13c0227e852e503eb",
+        "wx" : "1b824a11eed94fbcd9b722d06613bbcf7eca00b9136f2652642178f37b1a920e",
+        "wy" : "0e900de495d9ef56fa6d19f3dd1e0edb23d23835ac8c2d3d13c0227e852e503eb"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041b824a11eed94fbcd9b722d06613bbcf7eca00b9136f2652642178f37b1a920ee900de495d9ef56fa6d19f3dd1e0edb23d23835ac8c2d3d13c0227e852e503eb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEG4JKEe7ZT7zZtyLQZhO7z37KALkT\nbyZSZCF483sakg7pAN5JXZ71b6bRnz3R4O2yPSODWsjC09E8AifoUuUD6w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 351,
+          "comment" : "small r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3027020201000221008f1e3c7862c58b16bb76eddbb76eddbb516af4f63f2d74d76e0d28c9bb75ea88",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042914b30c4c784696ffc3dddcec05f36cb1488bc342b9f529d5387acb9e48cb8d3dbd30d0d5d6d6a39108863c2d6a6e8571cd3261fb9eb98ce46125bd8f139136",
+        "wx" : "2914b30c4c784696ffc3dddcec05f36cb1488bc342b9f529d5387acb9e48cb8d",
+        "wy" : "3dbd30d0d5d6d6a39108863c2d6a6e8571cd3261fb9eb98ce46125bd8f139136"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042914b30c4c784696ffc3dddcec05f36cb1488bc342b9f529d5387acb9e48cb8d3dbd30d0d5d6d6a39108863c2d6a6e8571cd3261fb9eb98ce46125bd8f139136",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKRSzDEx4Rpb/w93c7AXzbLFIi8NC\nufUp1Th6y55Iy409vTDQ1dbWo5EIhjwtam6Fcc0yYfueuYzkYSW9jxORNg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 352,
+          "comment" : "smallish r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302c02072d9b4d347952d6022100ef3043e7329581dbb3974497710ab11505ee1c87ff907beebadd195a0ffe6d7a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042579f546fe2f2aeb5f822feb28f2f8371618d04815455a7e903c10024a17da415528e951147f76bee1314e65a49c6ec70686e62d38fbc23472f96e3d3b33fd1f",
+        "wx" : "2579f546fe2f2aeb5f822feb28f2f8371618d04815455a7e903c10024a17da41",
+        "wy" : "5528e951147f76bee1314e65a49c6ec70686e62d38fbc23472f96e3d3b33fd1f"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042579f546fe2f2aeb5f822feb28f2f8371618d04815455a7e903c10024a17da415528e951147f76bee1314e65a49c6ec70686e62d38fbc23472f96e3d3b33fd1f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJXn1Rv4vKutfgi/rKPL4NxYY0EgV\nRVp+kDwQAkoX2kFVKOlRFH92vuExTmWknG7HBobmLTj7wjRy+W49OzP9Hw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 353,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "313233343030",
+          "sig" : "3032020d1033e67e37b32b445580bf4eff0221008b748b74000000008b748b748b748b7466e769ad4a16d3dcd87129b8e91d1b4d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b102196bf455ee5aafc6f895504d3c3b6b2d37c35f8669bd0f0b694795fbd992f777b6f829b9628ac35db0ef43f6a89f0a42812614e4c15924d8d47ebe45bae5",
+        "wx" : "0b102196bf455ee5aafc6f895504d3c3b6b2d37c35f8669bd0f0b694795fbd992",
+        "wy" : "0f777b6f829b9628ac35db0ef43f6a89f0a42812614e4c15924d8d47ebe45bae5"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b102196bf455ee5aafc6f895504d3c3b6b2d37c35f8669bd0f0b694795fbd992f777b6f829b9628ac35db0ef43f6a89f0a42812614e4c15924d8d47ebe45bae5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEsQIZa/RV7lqvxviVUE08O2stN8Nf\nhmm9DwtpR5X72ZL3d7b4KbliisNdsO9D9qifCkKBJhTkwVkk2NR+vkW65Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 354,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "313233343030",
+          "sig" : "302702020100022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044d056ab2ff57662fd6eebbe23930fef5cd08083e24146190cd01960b1fcd3749fe7ec5847651c857898be0f09efd6e0116a5dbe327f6f3080a65fc966bf64d91",
+        "wx" : "4d056ab2ff57662fd6eebbe23930fef5cd08083e24146190cd01960b1fcd3749",
+        "wy" : "0fe7ec5847651c857898be0f09efd6e0116a5dbe327f6f3080a65fc966bf64d91"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044d056ab2ff57662fd6eebbe23930fef5cd08083e24146190cd01960b1fcd3749fe7ec5847651c857898be0f09efd6e0116a5dbe327f6f3080a65fc966bf64d91",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETQVqsv9XZi/W7rviOTD+9c0ICD4k\nFGGQzQGWCx/NN0n+fsWEdlHIV4mL4PCe/W4BFqXb4yf28wgKZfyWa/ZNkQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 355,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3032020d062522bbd3ecbe7c39e93e7c25022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04361c4a62cd867613138dfe24ccebc4b7df1b55fc7410f4995ee2b6b9ab2220584f116c6c84e53d262fd13a5f5de6b57e7a1981de4ecdffdf3323b4e91d80649c",
+        "wx" : "361c4a62cd867613138dfe24ccebc4b7df1b55fc7410f4995ee2b6b9ab222058",
+        "wy" : "4f116c6c84e53d262fd13a5f5de6b57e7a1981de4ecdffdf3323b4e91d80649c"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004361c4a62cd867613138dfe24ccebc4b7df1b55fc7410f4995ee2b6b9ab2220584f116c6c84e53d262fd13a5f5de6b57e7a1981de4ecdffdf3323b4e91d80649c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENhxKYs2GdhMTjf4kzOvEt98bVfx0\nEPSZXuK2uasiIFhPEWxshOU9Ji/ROl9d5rV+ehmB3k7N/98zI7TpHYBknA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 356,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "313233343030",
+          "sig" : "3045022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d50220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04db9d5c5113f00822a146c9cda2e75cb6634cd0dff54aff6e22875171f57a0dad1c424cdd83eb01c02f6f8d36f42c6dc7e39db74358da8ac9bc9dc5890d46f667",
+        "wx" : "0db9d5c5113f00822a146c9cda2e75cb6634cd0dff54aff6e22875171f57a0dad",
+        "wy" : "1c424cdd83eb01c02f6f8d36f42c6dc7e39db74358da8ac9bc9dc5890d46f667"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004db9d5c5113f00822a146c9cda2e75cb6634cd0dff54aff6e22875171f57a0dad1c424cdd83eb01c02f6f8d36f42c6dc7e39db74358da8ac9bc9dc5890d46f667",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE251cURPwCCKhRsnNoudctmNM0N/1\nSv9uIodRcfV6Da0cQkzdg+sBwC9vjTb0LG3H4523Q1jaism8ncWJDUb2Zw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 357,
+          "comment" : "s == 1",
+          "msg" : "313233343030",
+          "sig" : "30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 358,
+          "comment" : "s == 0",
+          "msg" : "313233343030",
+          "sig" : "30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0499f19f07b33e03caf4703e04b930d57d6d9baa44460c596a2d3064e0b63ea41286a74c4612a812ee348d2b43f80de627c11c75d81511e22a199c32119b792c6a",
+        "wx" : "099f19f07b33e03caf4703e04b930d57d6d9baa44460c596a2d3064e0b63ea412",
+        "wy" : "086a74c4612a812ee348d2b43f80de627c11c75d81511e22a199c32119b792c6a"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000499f19f07b33e03caf4703e04b930d57d6d9baa44460c596a2d3064e0b63ea41286a74c4612a812ee348d2b43f80de627c11c75d81511e22a199c32119b792c6a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEmfGfB7M+A8r0cD4EuTDVfW2bqkRG\nDFlqLTBk4LY+pBKGp0xGEqgS7jSNK0P4DeYnwRx12BUR4ioZnDIRm3ksag==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 359,
+          "comment" : "point at infinity during verify",
+          "msg" : "313233343030",
+          "sig" : "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a80220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045e31eccd4704ebf7a4247ea57f9351abadff63679f2276e2a3b05009ebc1b8df648465a925010db823b2a5f3a6072343a6cc9961a9c482399d0d82051c2e3232",
+        "wx" : "5e31eccd4704ebf7a4247ea57f9351abadff63679f2276e2a3b05009ebc1b8df",
+        "wy" : "648465a925010db823b2a5f3a6072343a6cc9961a9c482399d0d82051c2e3232"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045e31eccd4704ebf7a4247ea57f9351abadff63679f2276e2a3b05009ebc1b8df648465a925010db823b2a5f3a6072343a6cc9961a9c482399d0d82051c2e3232",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXjHszUcE6/ekJH6lf5NRq63/Y2ef\nInbio7BQCevBuN9khGWpJQENuCOypfOmByNDpsyZYanEgjmdDYIFHC4yMg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 360,
+          "comment" : "u1 == 1",
+          "msg" : "313233343030",
+          "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ce0a47f881fd7315a733c4317848fa33c72e38de0b8fda36b61aa9a164f5808a85b05d25115ea4097ddf63f878c8e83657e66de136a8f9e62ed81a58bf117ff9",
+        "wx" : "0ce0a47f881fd7315a733c4317848fa33c72e38de0b8fda36b61aa9a164f5808a",
+        "wy" : "085b05d25115ea4097ddf63f878c8e83657e66de136a8f9e62ed81a58bf117ff9"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ce0a47f881fd7315a733c4317848fa33c72e38de0b8fda36b61aa9a164f5808a85b05d25115ea4097ddf63f878c8e83657e66de136a8f9e62ed81a58bf117ff9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzgpH+IH9cxWnM8QxeEj6M8cuON4L\nj9o2thqpoWT1gIqFsF0lEV6kCX3fY/h4yOg2V+Zt4Tao+eYu2BpYvxF/+Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 361,
+          "comment" : "u1 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100bc07ff031506dc74a75086a43252fb43731975a16dca6b025e867412d94222d0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cd6f487b47f36c0dea8f4b04c4e6ac637c76b725929c611f48addcf3d2f65941b50ea8f3a491190ee0b20cfb6efd113608e7c7c127577500e7f5c4a4e490fd60",
+        "wx" : "0cd6f487b47f36c0dea8f4b04c4e6ac637c76b725929c611f48addcf3d2f65941",
+        "wy" : "0b50ea8f3a491190ee0b20cfb6efd113608e7c7c127577500e7f5c4a4e490fd60"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004cd6f487b47f36c0dea8f4b04c4e6ac637c76b725929c611f48addcf3d2f65941b50ea8f3a491190ee0b20cfb6efd113608e7c7c127577500e7f5c4a4e490fd60",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzW9Ie0fzbA3qj0sExOasY3x2tyWS\nnGEfSK3c89L2WUG1DqjzpJEZDuCyDPtu/RE2COfHwSdXdQDn9cSk5JD9YA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 362,
+          "comment" : "u2 == 1",
+          "msg" : "313233343030",
+          "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04456e5f8067d68a1b0a2e8fe2b28acad5755687154a0f167734ebabbdc059070d720dbe96659a66ef0cf27a73e7b3f3f145a60e0ad29f1e21dcc2bb42f0d82c1e",
+        "wx" : "456e5f8067d68a1b0a2e8fe2b28acad5755687154a0f167734ebabbdc059070d",
+        "wy" : "720dbe96659a66ef0cf27a73e7b3f3f145a60e0ad29f1e21dcc2bb42f0d82c1e"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004456e5f8067d68a1b0a2e8fe2b28acad5755687154a0f167734ebabbdc059070d720dbe96659a66ef0cf27a73e7b3f3f145a60e0ad29f1e21dcc2bb42f0d82c1e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAERW5fgGfWihsKLo/isorK1XVWhxVK\nDxZ3NOurvcBZBw1yDb6WZZpm7wzyenPns/PxRaYOCtKfHiHcwrtC8NgsHg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 363,
+          "comment" : "u2 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0442bf0c0ac1e3850baf5515748a878e34249f71035e20a9f54ed468ec273cb0fc5b3138500230055c71f12d53f5c7d0e3d8aa54a94c668cb311e20d195fc71abb",
+        "wx" : "42bf0c0ac1e3850baf5515748a878e34249f71035e20a9f54ed468ec273cb0fc",
+        "wy" : "5b3138500230055c71f12d53f5c7d0e3d8aa54a94c668cb311e20d195fc71abb"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000442bf0c0ac1e3850baf5515748a878e34249f71035e20a9f54ed468ec273cb0fc5b3138500230055c71f12d53f5c7d0e3d8aa54a94c668cb311e20d195fc71abb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEQr8MCsHjhQuvVRV0ioeONCSfcQNe\nIKn1TtRo7Cc8sPxbMThQAjAFXHHxLVP1x9Dj2KpUqUxmjLMR4g0ZX8cauw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 364,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02206bfd55a8f8fdb68472e52873ef39ac3eace6d53df576f0ad2da4607bb52c0d46",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ffdd48da63d3af67223f16c51eb7e95600eb0b0e8b964f4fcd8c534face3c2c2b4e009ab2a76829480e69c9e43b2f1fe076cfafb3fa8d27dd4d6bab4d6c3db54",
+        "wx" : "0ffdd48da63d3af67223f16c51eb7e95600eb0b0e8b964f4fcd8c534face3c2c2",
+        "wy" : "0b4e009ab2a76829480e69c9e43b2f1fe076cfafb3fa8d27dd4d6bab4d6c3db54"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ffdd48da63d3af67223f16c51eb7e95600eb0b0e8b964f4fcd8c534face3c2c2b4e009ab2a76829480e69c9e43b2f1fe076cfafb3fa8d27dd4d6bab4d6c3db54",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/91I2mPTr2ciPxbFHrfpVgDrCw6L\nlk9PzYxTT6zjwsK04AmrKnaClIDmnJ5DsvH+B2z6+z+o0n3U1rq01sPbVA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 365,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220654937791db0686f712ff9b453eeadb0026c9b058bba49199ca3e8fac03c094f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04793cbfce6f335dcfede7c6898ea1c537d7661ed6a8c9d308d64a2560d21c6e2c483d23a5ff05da00eaf9d52cf5362be9b53b95316c6a32e9ebe68d9ac35c2fd6",
+        "wx" : "793cbfce6f335dcfede7c6898ea1c537d7661ed6a8c9d308d64a2560d21c6e2c",
+        "wy" : "483d23a5ff05da00eaf9d52cf5362be9b53b95316c6a32e9ebe68d9ac35c2fd6"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004793cbfce6f335dcfede7c6898ea1c537d7661ed6a8c9d308d64a2560d21c6e2c483d23a5ff05da00eaf9d52cf5362be9b53b95316c6a32e9ebe68d9ac35c2fd6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEeTy/zm8zXc/t58aJjqHFN9dmHtao\nydMI1kolYNIcbixIPSOl/wXaAOr51Sz1NivptTuVMWxqMunr5o2aw1wv1g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 366,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100c51bbee23a95437abe5c978f8fe596a31c858ac8d55be9786aa5d36a5ac74e97",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a9f7023f559d4bb6c9f4bc3643e2824aff5451d929479ec3ea5eb30bad2c36ac6a7c77e8dd21f4ad49b103e67da9d3cda62b653dd194fad2ba8d1dd37bb0ea9b",
+        "wx" : "0a9f7023f559d4bb6c9f4bc3643e2824aff5451d929479ec3ea5eb30bad2c36ac",
+        "wy" : "6a7c77e8dd21f4ad49b103e67da9d3cda62b653dd194fad2ba8d1dd37bb0ea9b"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a9f7023f559d4bb6c9f4bc3643e2824aff5451d929479ec3ea5eb30bad2c36ac6a7c77e8dd21f4ad49b103e67da9d3cda62b653dd194fad2ba8d1dd37bb0ea9b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEqfcCP1WdS7bJ9Lw2Q+KCSv9UUdkp\nR57D6l6zC60sNqxqfHfo3SH0rUmxA+Z9qdPNpitlPdGU+tK6jR3Te7Dqmw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 367,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0221008ba4c3da7154ba564ab344ae12005aa482b6c1639ea191f8568afb6e47163c45",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04df79ee082b2fc77e9ce4633471f569bbcb5ce53856e3067774f37e8a64a2c7ffaa488a6c34d499df76f427de3609bfcfd9feae67ffe0b0de594463c453b0ab16",
+        "wx" : "0df79ee082b2fc77e9ce4633471f569bbcb5ce53856e3067774f37e8a64a2c7ff",
+        "wy" : "0aa488a6c34d499df76f427de3609bfcfd9feae67ffe0b0de594463c453b0ab16"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004df79ee082b2fc77e9ce4633471f569bbcb5ce53856e3067774f37e8a64a2c7ffaa488a6c34d499df76f427de3609bfcfd9feae67ffe0b0de594463c453b0ab16",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE33nuCCsvx36c5GM0cfVpu8tc5ThW\n4wZ3dPN+imSix/+qSIpsNNSZ33b0J942Cb/P2f6uZ//gsN5ZRGPEU7CrFg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 368,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02204c3dafcf4ba55bf1344ae12005aa4a74f46eaa85f5023131cc637ae2ea90ab26",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044cc3bf65e32e00284adfca00f40df755415c485091ac0489ae9a337103a5f8f0123ab86dd433b933b4f2063c002144df3cfeba78dad0ed89c0377541532908c2",
+        "wx" : "4cc3bf65e32e00284adfca00f40df755415c485091ac0489ae9a337103a5f8f0",
+        "wy" : "123ab86dd433b933b4f2063c002144df3cfeba78dad0ed89c0377541532908c2"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044cc3bf65e32e00284adfca00f40df755415c485091ac0489ae9a337103a5f8f0123ab86dd433b933b4f2063c002144df3cfeba78dad0ed89c0377541532908c2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETMO/ZeMuAChK38oA9A33VUFcSFCR\nrASJrpozcQOl+PASOrht1DO5M7TyBjwAIUTfPP66eNrQ7YnAN3VBUykIwg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 369,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100987b5f9e974ab7e26895c2400b5494e9e8dd550bea04626398c6f5c5d521564c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04264a7ad439a4828a9dc97ecf837155355f99ae0b65975f851b541ad3a0e032f067268b7298c73e581866fbcbd161689b16b81cf262e007ce68e25a28c83ef041",
+        "wx" : "264a7ad439a4828a9dc97ecf837155355f99ae0b65975f851b541ad3a0e032f0",
+        "wy" : "67268b7298c73e581866fbcbd161689b16b81cf262e007ce68e25a28c83ef041"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004264a7ad439a4828a9dc97ecf837155355f99ae0b65975f851b541ad3a0e032f067268b7298c73e581866fbcbd161689b16b81cf262e007ce68e25a28c83ef041",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJkp61DmkgoqdyX7Pg3FVNV+Zrgtl\nl1+FG1Qa06DgMvBnJotymMc+WBhm+8vRYWibFrgc8mLgB85o4looyD7wQQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 370,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100fcf97e2fbf0e80d412005aa4a75086a3f004f59d512cb47271798733ab418606",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041d7ff4d3a41206c8143635f12876e0ea0875ea5e4a5a249250d0eda33daa211f56e89c0beaf910ac934ca12380455600d0fd85b56a7035cb171b3f1c72a15569",
+        "wx" : "1d7ff4d3a41206c8143635f12876e0ea0875ea5e4a5a249250d0eda33daa211f",
+        "wy" : "56e89c0beaf910ac934ca12380455600d0fd85b56a7035cb171b3f1c72a15569"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041d7ff4d3a41206c8143635f12876e0ea0875ea5e4a5a249250d0eda33daa211f56e89c0beaf910ac934ca12380455600d0fd85b56a7035cb171b3f1c72a15569",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHX/006QSBsgUNjXxKHbg6gh16l5K\nWiSSUNDtoz2qIR9W6JwL6vkQrJNMoSOARVYA0P2FtWpwNcsXGz8ccqFVaQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 371,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022079d482b60864d6c5cb4fd5db9e7e28ccd9a5948c316c8740fb429c0f37169a02",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b09685f338dceb421778a1458d52bed734c236242da2baa280d6f6b7b86e4f117fe6a34146b422d7aebd1a51b20948d7872a514c4cfd7686dc436b70733d6473",
+        "wx" : "0b09685f338dceb421778a1458d52bed734c236242da2baa280d6f6b7b86e4f11",
+        "wy" : "7fe6a34146b422d7aebd1a51b20948d7872a514c4cfd7686dc436b70733d6473"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b09685f338dceb421778a1458d52bed734c236242da2baa280d6f6b7b86e4f117fe6a34146b422d7aebd1a51b20948d7872a514c4cfd7686dc436b70733d6473",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEsJaF8zjc60IXeKFFjVK+1zTCNiQt\norqigNb2t7huTxF/5qNBRrQi1669GlGyCUjXhypRTEz9dobcQ2twcz1kcw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 372,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0221008ecd11081a4d0759c14f7bf46813d52cc6738115321be0a4da78a3356bb71510",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04dd811f2c0f5e9d4fbb2ef31818c1cd807247bc14fcd1170bef00e2c71dc037b443a15cdf8f3fbdc87e06250c0720d261d2b8d087fa7bf9548f6293f0ce5ae899",
+        "wx" : "0dd811f2c0f5e9d4fbb2ef31818c1cd807247bc14fcd1170bef00e2c71dc037b4",
+        "wy" : "43a15cdf8f3fbdc87e06250c0720d261d2b8d087fa7bf9548f6293f0ce5ae899"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004dd811f2c0f5e9d4fbb2ef31818c1cd807247bc14fcd1170bef00e2c71dc037b443a15cdf8f3fbdc87e06250c0720d261d2b8d087fa7bf9548f6293f0ce5ae899",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE3YEfLA9enU+7LvMYGMHNgHJHvBT8\n0RcL7wDixx3AN7RDoVzfjz+9yH4GJQwHINJh0rjQh/p7+VSPYpPwzlromQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 373,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100e8dbffed13c9a2093085c079714f11f24eb583d73ba2b416b3169183e7d9b4c2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0469d60ae1f39e1da95809d408894707ad2134f4943a1db089bebf815a391f18db32b401d98bf894d3b6d59e6eb45573285642e358ad687b7d7bf9600b1987809e",
+        "wx" : "69d60ae1f39e1da95809d408894707ad2134f4943a1db089bebf815a391f18db",
+        "wy" : "32b401d98bf894d3b6d59e6eb45573285642e358ad687b7d7bf9600b1987809e"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000469d60ae1f39e1da95809d408894707ad2134f4943a1db089bebf815a391f18db32b401d98bf894d3b6d59e6eb45573285642e358ad687b7d7bf9600b1987809e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEadYK4fOeHalYCdQIiUcHrSE09JQ6\nHbCJvr+BWjkfGNsytAHZi/iU07bVnm60VXMoVkLjWK1oe317+WALGYeAng==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 374,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ca01552a838124bec68d6bc6086329e06673900eac5c262e5ce79a8521cd1eae",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a658553a0620c95e987b5c3163bcfea68c52065f53c9d553f2a924d8b3ed511f79f0dfec4536b65aa5fb31297e96f6b464aa669b9268b3156c43d4612978a577",
+        "wx" : "0a658553a0620c95e987b5c3163bcfea68c52065f53c9d553f2a924d8b3ed511f",
+        "wy" : "79f0dfec4536b65aa5fb31297e96f6b464aa669b9268b3156c43d4612978a577"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a658553a0620c95e987b5c3163bcfea68c52065f53c9d553f2a924d8b3ed511f79f0dfec4536b65aa5fb31297e96f6b464aa669b9268b3156c43d4612978a577",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEplhVOgYgyV6Ye1wxY7z+poxSBl9T\nydVT8qkk2LPtUR958N/sRTa2WqX7MSl+lva0ZKpmm5JosxVsQ9RhKXildw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 375,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0221009402aa560702497c8d1ad78c10c653c11000256fb1a0add7c6156a474737180b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bc4d3354a6a973dd8088919cc181194e879ed7920db30d0d1278edf74413b7b92450d162b26dcb25fbbd53ea4044189981d737055925bd2e86bfb0374b09f3ca",
+        "wx" : "0bc4d3354a6a973dd8088919cc181194e879ed7920db30d0d1278edf74413b7b9",
+        "wy" : "2450d162b26dcb25fbbd53ea4044189981d737055925bd2e86bfb0374b09f3ca"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bc4d3354a6a973dd8088919cc181194e879ed7920db30d0d1278edf74413b7b92450d162b26dcb25fbbd53ea4044189981d737055925bd2e86bfb0374b09f3ca",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvE0zVKapc92AiJGcwYEZToee15IN\nsw0NEnjt90QTt7kkUNFism3LJfu9U+pARBiZgdc3BVklvS6Gv7A3Swnzyg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 376,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02205e03ff818a836e3a53a8435219297da1b98cbad0b6e535812f433a096ca11168",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040eb628724fce764c687d874ade7b8e0aa4abf20ee6e3610fac9fe3e72f97ab5aed09f4843660eb1daf015d397a7c1073d7ae43bda0ba3e117008785abfffa00f",
+        "wx" : "0eb628724fce764c687d874ade7b8e0aa4abf20ee6e3610fac9fe3e72f97ab5a",
+        "wy" : "0ed09f4843660eb1daf015d397a7c1073d7ae43bda0ba3e117008785abfffa00f"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040eb628724fce764c687d874ade7b8e0aa4abf20ee6e3610fac9fe3e72f97ab5aed09f4843660eb1daf015d397a7c1073d7ae43bda0ba3e117008785abfffa00f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEDrYock/OdkxofYdK3nuOCqSr8g7m\n42EPrJ/j5y+Xq1rtCfSENmDrHa8BXTl6fBBz165DvaC6PhFwCHhav/+gDw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 377,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100e28ddf709d4aa1bddf2e4bc7c7f2cb516cb642bb3e39c3feaf2fcf16ab9539f4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e7ac5cc7f296912f703f59fe88e49b521da245e12e6eee161ee6b3b1127611a77b3bedd2a773cf58b0629b936dd85dad2d0c39676306ed63e1a9bcd0e08bccc2",
+        "wx" : "0e7ac5cc7f296912f703f59fe88e49b521da245e12e6eee161ee6b3b1127611a7",
+        "wy" : "7b3bedd2a773cf58b0629b936dd85dad2d0c39676306ed63e1a9bcd0e08bccc2"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004e7ac5cc7f296912f703f59fe88e49b521da245e12e6eee161ee6b3b1127611a77b3bedd2a773cf58b0629b936dd85dad2d0c39676306ed63e1a9bcd0e08bccc2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE56xcx/KWkS9wP1n+iOSbUh2iReEu\nbu4WHuazsRJ2Ead7O+3Sp3PPWLBim5Nt2F2tLQw5Z2MG7WPhqbzQ4IvMwg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 378,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffffaaaaaaaaffffffffffffffffe9a2538f37b28a2c513dee40fecbb71a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042407b60abf3ee5edaf92ed505a11d0ddce0ea33eca58a031bb2f162c512f4062fb81bff36bf967e834e3d5d468730dcd70440022ab60061a62fac53350fe259f",
+        "wx" : "2407b60abf3ee5edaf92ed505a11d0ddce0ea33eca58a031bb2f162c512f4062",
+        "wy" : "0fb81bff36bf967e834e3d5d468730dcd70440022ab60061a62fac53350fe259f"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042407b60abf3ee5edaf92ed505a11d0ddce0ea33eca58a031bb2f162c512f4062fb81bff36bf967e834e3d5d468730dcd70440022ab60061a62fac53350fe259f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEJAe2Cr8+5e2vku1QWhHQ3c4Ooz7K\nWKAxuy8WLFEvQGL7gb/za/ln6DTj1dRocw3NcEQAIqtgBhpi+sUzUP4lnw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 379,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100b62f26b5f2a2b26f6de86d42ad8a13da3ab3cccd0459b201de009e526adf21f2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0447b2ad96dfc2f23fe5926809f38042b2c801962bd7394cefbf4aacb2554b7b0bdf2b937a16a7d96a2a0682cd164428890208597f2cdcc734fda73600b5cf6c59",
+        "wx" : "47b2ad96dfc2f23fe5926809f38042b2c801962bd7394cefbf4aacb2554b7b0b",
+        "wy" : "0df2b937a16a7d96a2a0682cd164428890208597f2cdcc734fda73600b5cf6c59"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000447b2ad96dfc2f23fe5926809f38042b2c801962bd7394cefbf4aacb2554b7b0bdf2b937a16a7d96a2a0682cd164428890208597f2cdcc734fda73600b5cf6c59",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAER7Ktlt/C8j/lkmgJ84BCssgBlivX\nOUzvv0qsslVLewvfK5N6FqfZaioGgs0WRCiJAghZfyzcxzT9pzYAtc9sWQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 380,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bb1d9ac949dd748cd02bbbe749bd351cd57b38bb61403d700686aa7b4c90851e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0469a65b75f31ae7b4930292f90902461befcee5d1606939c28e01b652a7fbc498cf68619e5860128f56cecf53eba2ffe82889a9bb04a5fa4c8b722bc91d55978a",
+        "wx" : "69a65b75f31ae7b4930292f90902461befcee5d1606939c28e01b652a7fbc498",
+        "wy" : "0cf68619e5860128f56cecf53eba2ffe82889a9bb04a5fa4c8b722bc91d55978a"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000469a65b75f31ae7b4930292f90902461befcee5d1606939c28e01b652a7fbc498cf68619e5860128f56cecf53eba2ffe82889a9bb04a5fa4c8b722bc91d55978a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaaZbdfMa57STApL5CQJGG+/O5dFg\naTnCjgG2Uqf7xJjPaGGeWGASj1bOz1Prov/oKImpuwSl+kyLcivJHVWXig==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 381,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022066755a00638cdaec1c732513ca0234ece52545dac11f816e818f725b4f60aaf2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b2037176c84db04a6c773e32f9ed1d6b25ef4c303c6725c6932ec2cc2788bcbb9361505e6b771691adb41598f292d6521722404bf183241b195738b77abd6cfe",
+        "wx" : "0b2037176c84db04a6c773e32f9ed1d6b25ef4c303c6725c6932ec2cc2788bcbb",
+        "wy" : "09361505e6b771691adb41598f292d6521722404bf183241b195738b77abd6cfe"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b2037176c84db04a6c773e32f9ed1d6b25ef4c303c6725c6932ec2cc2788bcbb9361505e6b771691adb41598f292d6521722404bf183241b195738b77abd6cfe",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEsgNxdshNsEpsdz4y+e0dayXvTDA8\nZyXGky7CzCeIvLuTYVBea3cWka20FZjyktZSFyJAS/GDJBsZVzi3er1s/g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 382,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022055a00c9fcdaebb6032513ca0234ecfffe98ebe492fdf02e48ca48e982beb3669",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041eef95aef71f793afd50bb2604064d63e88bef7404a4d0e206446245ae2e7834c96e86dd040f9794b63712d90e719576b8b92c406ab0f288ad9b327bd124454f",
+        "wx" : "1eef95aef71f793afd50bb2604064d63e88bef7404a4d0e206446245ae2e7834",
+        "wy" : "0c96e86dd040f9794b63712d90e719576b8b92c406ab0f288ad9b327bd124454f"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041eef95aef71f793afd50bb2604064d63e88bef7404a4d0e206446245ae2e7834c96e86dd040f9794b63712d90e719576b8b92c406ab0f288ad9b327bd124454f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHu+VrvcfeTr9ULsmBAZNY+iL73QE\npNDiBkRiRa4ueDTJbobdBA+XlLY3EtkOcZV2uLksQGqw8oitmzJ70SRFTw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 383,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ab40193f9b5d76c064a27940469d9fffd31d7c925fbe05c919491d3057d66cd2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a9734899c954e5b7adbca8f783428b5fbcbdfd3d2813f8d2f95b31a78ab107567667abf8c02ce4951bc59b2564130c27d7b64cdbc5cad95ca42d5bbb7cd4e793",
+        "wx" : "0a9734899c954e5b7adbca8f783428b5fbcbdfd3d2813f8d2f95b31a78ab10756",
+        "wy" : "7667abf8c02ce4951bc59b2564130c27d7b64cdbc5cad95ca42d5bbb7cd4e793"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a9734899c954e5b7adbca8f783428b5fbcbdfd3d2813f8d2f95b31a78ab107567667abf8c02ce4951bc59b2564130c27d7b64cdbc5cad95ca42d5bbb7cd4e793",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEqXNImclU5betvKj3g0KLX7y9/T0o\nE/jS+Vsxp4qxB1Z2Z6v4wCzklRvFmyVkEwwn17ZM28XK2VykLVu7fNTnkw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 384,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ca0234ebb5fdcb13ca0234ecffffffffcb0dadbbc7f549f8a26b4408d0dc8600",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041ae51662331a1dbfab0751d30dfab2273a04a239e055a537b16ab595f9612396434f21c2bfe6555c9fc4a8e82dab1fa5631881b016e0831d9e1bbf5799fcf32e",
+        "wx" : "1ae51662331a1dbfab0751d30dfab2273a04a239e055a537b16ab595f9612396",
+        "wy" : "434f21c2bfe6555c9fc4a8e82dab1fa5631881b016e0831d9e1bbf5799fcf32e"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041ae51662331a1dbfab0751d30dfab2273a04a239e055a537b16ab595f9612396434f21c2bfe6555c9fc4a8e82dab1fa5631881b016e0831d9e1bbf5799fcf32e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEGuUWYjMaHb+rB1HTDfqyJzoEojng\nVaU3sWq1lflhI5ZDTyHCv+ZVXJ/EqOgtqx+lYxiBsBbggx2eG79XmfzzLg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 385,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff3ea3677e082b9310572620ae19933a9e65b285598711c77298815ad3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0453c90cdd8b0dadd21c44ad557b327f4dbf57144aaf06597deb3f94125206a6c14603475bd79b30e36340cd09b0b59e6cd46ce90150e9ffe5c8a0172b2c9898e3",
+        "wx" : "53c90cdd8b0dadd21c44ad557b327f4dbf57144aaf06597deb3f94125206a6c1",
+        "wy" : "4603475bd79b30e36340cd09b0b59e6cd46ce90150e9ffe5c8a0172b2c9898e3"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000453c90cdd8b0dadd21c44ad557b327f4dbf57144aaf06597deb3f94125206a6c14603475bd79b30e36340cd09b0b59e6cd46ce90150e9ffe5c8a0172b2c9898e3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEU8kM3YsNrdIcRK1VezJ/Tb9XFEqv\nBll96z+UElIGpsFGA0db15sw42NAzQmwtZ5s1GzpAVDp/+XIoBcrLJiY4w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 386,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220266666663bbbbbbbe6666666666666665b37902e023fab7c8f055d86e5cc41f4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0433797539515c51f429967b8e36930d9fdda1edb13aecec9771f7cde5f6f2e74eba51d0b6456bb902dba1f3ea436f96ad2355da454dc9b32c503c4bc6cfd6d410",
+        "wx" : "33797539515c51f429967b8e36930d9fdda1edb13aecec9771f7cde5f6f2e74e",
+        "wy" : "0ba51d0b6456bb902dba1f3ea436f96ad2355da454dc9b32c503c4bc6cfd6d410"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000433797539515c51f429967b8e36930d9fdda1edb13aecec9771f7cde5f6f2e74eba51d0b6456bb902dba1f3ea436f96ad2355da454dc9b32c503c4bc6cfd6d410",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEM3l1OVFcUfQplnuONpMNn92h7bE6\n7OyXcffN5fby5066UdC2RWu5Atuh8+pDb5atI1XaRU3JsyxQPEvGz9bUEA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 387,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff36db6db7a492492492492492146c573f4c6dfc8d08a443e258970b09",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040a8f5f1d5bbd2783fa7f37c86879057fb2fcf25383aafb86d03d6bafb41a17b3eaf6da715fe950349fd5736117b08e15e32cf1d2fdc003e510009f1b4ba1e648",
+        "wx" : "0a8f5f1d5bbd2783fa7f37c86879057fb2fcf25383aafb86d03d6bafb41a17b3",
+        "wy" : "0eaf6da715fe950349fd5736117b08e15e32cf1d2fdc003e510009f1b4ba1e648"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040a8f5f1d5bbd2783fa7f37c86879057fb2fcf25383aafb86d03d6bafb41a17b3eaf6da715fe950349fd5736117b08e15e32cf1d2fdc003e510009f1b4ba1e648",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECo9fHVu9J4P6fzfIaHkFf7L88lOD\nqvuG0D1rr7QaF7Pq9tpxX+lQNJ/Vc2EXsI4V4yzx0v3AA+UQAJ8bS6HmSA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 388,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff2aaaaaab7fffffffffffffffc815d0e60b3e596ecb1ad3a27cfd49c4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041dbc94e96c056b9d2cb6773bb24b69ed473851badf927a29955aff290ef3675a65e587561122aa8226facb95df08308cadf01c8351a1569176d917821113aa7c",
+        "wx" : "1dbc94e96c056b9d2cb6773bb24b69ed473851badf927a29955aff290ef3675a",
+        "wy" : "65e587561122aa8226facb95df08308cadf01c8351a1569176d917821113aa7c"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041dbc94e96c056b9d2cb6773bb24b69ed473851badf927a29955aff290ef3675a65e587561122aa8226facb95df08308cadf01c8351a1569176d917821113aa7c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEHbyU6WwFa50stnc7sktp7Uc4Ubrf\nknoplVr/KQ7zZ1pl5YdWESKqgib6y5XfCDCMrfAcg1GhVpF22ReCEROqfA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 389,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffff55555555ffffffffffffffffd344a71e6f651458a27bdc81fd976e37",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04084ab885dbff7f12e6cdadb59d456e500797779425c7518c259c83718289e6e991c345d3a093e86670605bbc2ff4c69d0ed694fd433ec6b6ba1bf7d56c3e6b51",
+        "wx" : "084ab885dbff7f12e6cdadb59d456e500797779425c7518c259c83718289e6e9",
+        "wy" : "091c345d3a093e86670605bbc2ff4c69d0ed694fd433ec6b6ba1bf7d56c3e6b51"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004084ab885dbff7f12e6cdadb59d456e500797779425c7518c259c83718289e6e991c345d3a093e86670605bbc2ff4c69d0ed694fd433ec6b6ba1bf7d56c3e6b51",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECEq4hdv/fxLmza21nUVuUAeXd5Ql\nx1GMJZyDcYKJ5umRw0XToJPoZnBgW7wv9MadDtaU/UM+xra6G/fVbD5rUQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 390,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02203fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192aa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04003adfa4c620a207096cd18ee8fd2a90e20106cf824a0c63d6dec727a9fe7f509430d26bdd5f71e819d12b70069901461ae083cc809122d4fb86b5c475244e5a",
+        "wx" : "3adfa4c620a207096cd18ee8fd2a90e20106cf824a0c63d6dec727a9fe7f50",
+        "wy" : "09430d26bdd5f71e819d12b70069901461ae083cc809122d4fb86b5c475244e5a"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004003adfa4c620a207096cd18ee8fd2a90e20106cf824a0c63d6dec727a9fe7f509430d26bdd5f71e819d12b70069901461ae083cc809122d4fb86b5c475244e5a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEADrfpMYgogcJbNGO6P0qkOIBBs+C\nSgxj1t7HJ6n+f1CUMNJr3V9x6BnRK3AGmQFGGuCDzICRItT7hrXEdSROWg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 391,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02205d8ecd64a4eeba466815ddf3a4de9a8e6abd9c5db0a01eb80343553da648428f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047c98b2d47eb433c0d18e533cfbc8909d66f7b79d5925ccb17eccec9d105c58848d5ca99b350bd7d10ab5ee6fcfe46623fdc03e9f828158f4d4cc08ad1ff83de4",
+        "wx" : "7c98b2d47eb433c0d18e533cfbc8909d66f7b79d5925ccb17eccec9d105c5884",
+        "wy" : "08d5ca99b350bd7d10ab5ee6fcfe46623fdc03e9f828158f4d4cc08ad1ff83de4"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047c98b2d47eb433c0d18e533cfbc8909d66f7b79d5925ccb17eccec9d105c58848d5ca99b350bd7d10ab5ee6fcfe46623fdc03e9f828158f4d4cc08ad1ff83de4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEfJiy1H60M8DRjlM8+8iQnWb3t51Z\nJcyxfszsnRBcWISNXKmbNQvX0Qq17m/P5GYj/cA+n4KBWPTUzAitH/g95A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 392,
+          "comment" : "point duplication during verification",
+          "msg" : "313233343030",
+          "sig" : "304502206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022100b4cfa1996ec1d24cdbc8fa17fcabc3a5d4b2b36cf4b50a7b775ab78785710746",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047c98b2d47eb433c0d18e533cfbc8909d66f7b79d5925ccb17eccec9d105c588472a35663caf4282ff54a1190301b99dc023fc1617d7ea70b2b33f752e007c21b",
+        "wx" : "7c98b2d47eb433c0d18e533cfbc8909d66f7b79d5925ccb17eccec9d105c5884",
+        "wy" : "72a35663caf4282ff54a1190301b99dc023fc1617d7ea70b2b33f752e007c21b"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047c98b2d47eb433c0d18e533cfbc8909d66f7b79d5925ccb17eccec9d105c588472a35663caf4282ff54a1190301b99dc023fc1617d7ea70b2b33f752e007c21b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEfJiy1H60M8DRjlM8+8iQnWb3t51Z\nJcyxfszsnRBcWIRyo1ZjyvQoL/VKEZAwG5ncAj/BYX1+pwsrM/dS4AfCGw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 393,
+          "comment" : "duplication bug",
+          "msg" : "313233343030",
+          "sig" : "304502206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022100b4cfa1996ec1d24cdbc8fa17fcabc3a5d4b2b36cf4b50a7b775ab78785710746",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b7a90e21e7547d73267940033cea05042c50f7c9fa5eaeb471cd6260c685f2e38bb7309d0c3bab249faaf3e44179d6dd5302375c580fd0570a788c6be3680c67",
+        "wx" : "0b7a90e21e7547d73267940033cea05042c50f7c9fa5eaeb471cd6260c685f2e3",
+        "wy" : "08bb7309d0c3bab249faaf3e44179d6dd5302375c580fd0570a788c6be3680c67"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b7a90e21e7547d73267940033cea05042c50f7c9fa5eaeb471cd6260c685f2e38bb7309d0c3bab249faaf3e44179d6dd5302375c580fd0570a788c6be3680c67",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEt6kOIedUfXMmeUADPOoFBCxQ98n6\nXq60cc1iYMaF8uOLtzCdDDurJJ+q8+RBedbdUwI3XFgP0FcKeIxr42gMZw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 394,
+          "comment" : "point with x-coordinate 0",
+          "msg" : "313233343030",
+          "sig" : "30250201010220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041550a173373b2d594374f0642cd73de06a045c09c7a4f388c731e8cd8971adfc9a3a9843583a86c0e1c62cbde67165f40a926b1028ba38aa3895e188ebbc7066",
+        "wx" : "1550a173373b2d594374f0642cd73de06a045c09c7a4f388c731e8cd8971adfc",
+        "wy" : "09a3a9843583a86c0e1c62cbde67165f40a926b1028ba38aa3895e188ebbc7066"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200041550a173373b2d594374f0642cd73de06a045c09c7a4f388c731e8cd8971adfc9a3a9843583a86c0e1c62cbde67165f40a926b1028ba38aa3895e188ebbc7066",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFVChczc7LVlDdPBkLNc94GoEXAnH\npPOIxzHozYlxrfyaOphDWDqGwOHGLL3mcWX0CpJrECi6OKo4leGI67xwZg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 395,
+          "comment" : "point with x-coordinate 0",
+          "msg" : "313233343030",
+          "sig" : "3045022101000000000000000000000000000000000000000000000000000000000000000002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04313447778195daa1791a6530cd0697ae34bf9d8d225984394f72eef3505971110996a8fbdd1a70ecd64cb00b595afe1669bfef80d91756a62d84c1d83e0f22ab",
+        "wx" : "313447778195daa1791a6530cd0697ae34bf9d8d225984394f72eef350597111",
+        "wy" : "0996a8fbdd1a70ecd64cb00b595afe1669bfef80d91756a62d84c1d83e0f22ab"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004313447778195daa1791a6530cd0697ae34bf9d8d225984394f72eef3505971110996a8fbdd1a70ecd64cb00b595afe1669bfef80d91756a62d84c1d83e0f22ab",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEMTRHd4GV2qF5GmUwzQaXrjS/nY0i\nWYQ5T3Lu81BZcREJlqj73Rpw7NZMsAtZWv4Wab/vgNkXVqYthMHYPg8iqw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 396,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "313233343030",
+          "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044ada634941476ca63c2c5803eec2f33b2d17920f798a5be6275f5a54cd2e7639b1a04bead5c7314c427492db21b9544d81caa8159587e41aa023aa967f31aaa1",
+        "wx" : "4ada634941476ca63c2c5803eec2f33b2d17920f798a5be6275f5a54cd2e7639",
+        "wy" : "0b1a04bead5c7314c427492db21b9544d81caa8159587e41aa023aa967f31aaa1"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044ada634941476ca63c2c5803eec2f33b2d17920f798a5be6275f5a54cd2e7639b1a04bead5c7314c427492db21b9544d81caa8159587e41aa023aa967f31aaa1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEStpjSUFHbKY8LFgD7sLzOy0Xkg95\nilvmJ19aVM0udjmxoEvq1ccxTEJ0ktshuVRNgcqoFZWH5BqgI6qWfzGqoQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 397,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699780220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04aacce093270fa59ad412b5459a08e490743b97086c781ac3c8d54030b41a31193bece4956172d56befb7011d684e772905e48d2115444a75ac7a325a3f25f4b1",
+        "wx" : "0aacce093270fa59ad412b5459a08e490743b97086c781ac3c8d54030b41a3119",
+        "wy" : "3bece4956172d56befb7011d684e772905e48d2115444a75ac7a325a3f25f4b1"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004aacce093270fa59ad412b5459a08e490743b97086c781ac3c8d54030b41a31193bece4956172d56befb7011d684e772905e48d2115444a75ac7a325a3f25f4b1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEqszgkycPpZrUErVFmgjkkHQ7lwhs\neBrDyNVAMLQaMRk77OSVYXLVa++3AR1oTncpBeSNIRVESnWsejJaPyX0sQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 398,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "304502207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022100b6db6db6249249254924924924924924625bd7a09bec4ca81bcdd9f8fd6b63cc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f62b8d7feeff5a847ab79212269e55e62fa87ebe930821747b57a511a5ea99f0439ee057bb27898582a683c3fdb7f95404d41d42f276803751a316eb3aab7ebf",
+        "wx" : "0f62b8d7feeff5a847ab79212269e55e62fa87ebe930821747b57a511a5ea99f0",
+        "wy" : "439ee057bb27898582a683c3fdb7f95404d41d42f276803751a316eb3aab7ebf"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f62b8d7feeff5a847ab79212269e55e62fa87ebe930821747b57a511a5ea99f0439ee057bb27898582a683c3fdb7f95404d41d42f276803751a316eb3aab7ebf",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9iuNf+7/WoR6t5ISJp5V5i+ofr6T\nCCF0e1elEaXqmfBDnuBXuyeJhYKmg8P9t/lUBNQdQvJ2gDdRoxbrOqt+vw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 399,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "304502207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022100cccccccc00000000cccccccccccccccc971f2ef152794b9d8fc7d568c9e8eaa7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044baa07ff6e7bb9aa223d1c61932005fe98fe78b787fdab4bd3619bc8833072a2bcacd63802c56af82607953e72a0f5d3c23bd265544e020951824ea485555d33",
+        "wx" : "4baa07ff6e7bb9aa223d1c61932005fe98fe78b787fdab4bd3619bc8833072a2",
+        "wy" : "0bcacd63802c56af82607953e72a0f5d3c23bd265544e020951824ea485555d33"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044baa07ff6e7bb9aa223d1c61932005fe98fe78b787fdab4bd3619bc8833072a2bcacd63802c56af82607953e72a0f5d3c23bd265544e020951824ea485555d33",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAES6oH/257uaoiPRxhkyAF/pj+eLeH\n/atL02GbyIMwcqK8rNY4AsVq+CYHlT5yoPXTwjvSZVROAglRgk6khVVdMw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 400,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc4766997802203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aaa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040c753ed1ba92f766800fdd0ae1c0d7f8f4cd8305fd803d8bca881397b5937e2db568509b1faf3cf251de6db9810e8b8caed235da10eeddbed62775c8e5c9460a",
+        "wx" : "0c753ed1ba92f766800fdd0ae1c0d7f8f4cd8305fd803d8bca881397b5937e2d",
+        "wy" : "0b568509b1faf3cf251de6db9810e8b8caed235da10eeddbed62775c8e5c9460a"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040c753ed1ba92f766800fdd0ae1c0d7f8f4cd8305fd803d8bca881397b5937e2db568509b1faf3cf251de6db9810e8b8caed235da10eeddbed62775c8e5c9460a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEDHU+0bqS92aAD90K4cDX+PTNgwX9\ngD2LyogTl7WTfi21aFCbH6888lHebbmBDouMrtI12hDu3b7WJ3XI5clGCg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 401,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022049249248db6db6dbb6db6db6db6db6db5a8b230d0b2b51dcd7ebf0c9fef7c185",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04030fdcae6541f22c5bab254e4f1a285c507d1cefea03bf90cf19daf3cb62df695ff2c94d588f2c2b2b0a12bebc011bcee4fa1b54506ec07d0a29d24a0891193c",
+        "wx" : "30fdcae6541f22c5bab254e4f1a285c507d1cefea03bf90cf19daf3cb62df69",
+        "wy" : "5ff2c94d588f2c2b2b0a12bebc011bcee4fa1b54506ec07d0a29d24a0891193c"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004030fdcae6541f22c5bab254e4f1a285c507d1cefea03bf90cf19daf3cb62df695ff2c94d588f2c2b2b0a12bebc011bcee4fa1b54506ec07d0a29d24a0891193c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAw/crmVB8ixbqyVOTxooXFB9HO/q\nA7+Qzxna88ti32lf8slNWI8sKysKEr68ARvO5PobVFBuwH0KKdJKCJEZPA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 402,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022016a4502e2781e11ac82cbc9d1edd8c981584d13e18411e2f6e0478c34416e3bb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0403fc621eaf90c23d8f9fa125d2c59b8728ebccb30ca3e3db879a06ca90f20cdcae58d3f0c6aef0e805be10ea54e23cf6f0397f9addddc2b09088855316b0ef44",
+        "wx" : "3fc621eaf90c23d8f9fa125d2c59b8728ebccb30ca3e3db879a06ca90f20cdc",
+        "wy" : "0ae58d3f0c6aef0e805be10ea54e23cf6f0397f9addddc2b09088855316b0ef44"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000403fc621eaf90c23d8f9fa125d2c59b8728ebccb30ca3e3db879a06ca90f20cdcae58d3f0c6aef0e805be10ea54e23cf6f0397f9addddc2b09088855316b0ef44",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEA/xiHq+Qwj2Pn6El0sWbhyjrzLMM\no+Pbh5oGypDyDNyuWNPwxq7w6AW+EOpU4jz28Dl/mt3dwrCQiIVTFrDvRA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 403,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2960220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0470f2ce24dc62923bb09cc92d74329bbd0d2e6b0e354c0be2383d24acdccb9e4cd42d1f973466f5e5462a939084a294ebfc7a45629c70ee5def46de9536ea7bf7",
+        "wx" : "70f2ce24dc62923bb09cc92d74329bbd0d2e6b0e354c0be2383d24acdccb9e4c",
+        "wy" : "0d42d1f973466f5e5462a939084a294ebfc7a45629c70ee5def46de9536ea7bf7"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000470f2ce24dc62923bb09cc92d74329bbd0d2e6b0e354c0be2383d24acdccb9e4cd42d1f973466f5e5462a939084a294ebfc7a45629c70ee5def46de9536ea7bf7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEcPLOJNxikjuwnMktdDKbvQ0uaw41\nTAviOD0krNzLnkzULR+XNGb15UYqk5CEopTr/HpFYpxw7l3vRt6VNup79w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 404,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "304502206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022100b6db6db6249249254924924924924924625bd7a09bec4ca81bcdd9f8fd6b63cc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04732b8ac0c30fe44307431235271cb5d6e5f677a19ce3f058b939a7bf19349d3c858cc735af8577468275847cf5ec19972e6c20738276e2708b23c595bfc4433d",
+        "wx" : "732b8ac0c30fe44307431235271cb5d6e5f677a19ce3f058b939a7bf19349d3c",
+        "wy" : "0858cc735af8577468275847cf5ec19972e6c20738276e2708b23c595bfc4433d"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004732b8ac0c30fe44307431235271cb5d6e5f677a19ce3f058b939a7bf19349d3c858cc735af8577468275847cf5ec19972e6c20738276e2708b23c595bfc4433d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEcyuKwMMP5EMHQxI1Jxy11uX2d6Gc\n4/BYuTmnvxk0nTyFjMc1r4V3RoJ1hHz17BmXLmwgc4J24nCLI8WVv8RDPQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 405,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "304502206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022100cccccccc00000000cccccccccccccccc971f2ef152794b9d8fc7d568c9e8eaa7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0447aff9501825a166782bb58a5b459006eacdbce5e5323addad34ec1b6444cdce9199c31502ad4277c73ddd0c807b72634c45762404837d9814a5d4b5a7c3f398",
+        "wx" : "47aff9501825a166782bb58a5b459006eacdbce5e5323addad34ec1b6444cdce",
+        "wy" : "09199c31502ad4277c73ddd0c807b72634c45762404837d9814a5d4b5a7c3f398"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000447aff9501825a166782bb58a5b459006eacdbce5e5323addad34ec1b6444cdce9199c31502ad4277c73ddd0c807b72634c45762404837d9814a5d4b5a7c3f398",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAER6/5UBgloWZ4K7WKW0WQBurNvOXl\nMjrdrTTsG2REzc6RmcMVAq1Cd8c93QyAe3JjTEV2JASDfZgUpdS1p8PzmA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 406,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29602203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aaa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04aed8eeff77644bf83b9222f8f57173fa8217ec7e0763ee7d7171fb6092fba5c06486a86d94f48834ba5adbaf349687f9cee400389642b828e68207b147ca2c46",
+        "wx" : "0aed8eeff77644bf83b9222f8f57173fa8217ec7e0763ee7d7171fb6092fba5c0",
+        "wy" : "6486a86d94f48834ba5adbaf349687f9cee400389642b828e68207b147ca2c46"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004aed8eeff77644bf83b9222f8f57173fa8217ec7e0763ee7d7171fb6092fba5c06486a86d94f48834ba5adbaf349687f9cee400389642b828e68207b147ca2c46",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAErtju/3dkS/g7kiL49XFz+oIX7H4H\nY+59cXH7YJL7pcBkhqhtlPSINLpa2680lof5zuQAOJZCuCjmggexR8osRg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 407,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022049249248db6db6dbb6db6db6db6db6db5a8b230d0b2b51dcd7ebf0c9fef7c185",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f7c54a585a904300d05b53ef3b854e71999a344b89adc0caaa28e254db9bc7c7c161a79f38ff446051303577e40638fb020329940a63c241bb32c2205eb57b7d",
+        "wx" : "0f7c54a585a904300d05b53ef3b854e71999a344b89adc0caaa28e254db9bc7c7",
+        "wy" : "0c161a79f38ff446051303577e40638fb020329940a63c241bb32c2205eb57b7d"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004f7c54a585a904300d05b53ef3b854e71999a344b89adc0caaa28e254db9bc7c7c161a79f38ff446051303577e40638fb020329940a63c241bb32c2205eb57b7d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE98VKWFqQQwDQW1PvO4VOcZmaNEuJ\nrcDKqijiVNubx8fBYaefOP9EYFEwNXfkBjj7AgMplApjwkG7MsIgXrV7fQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 408,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022016a4502e2781e11ac82cbc9d1edd8c981584d13e18411e2f6e0478c34416e3bb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5",
+        "wx" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
+        "wy" : "4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaxfR8uEsQkf4vOblY6RA8ncDfYEt\n6zOg9KE5RdiYwpZP40Li/hp/m47n60p8D54WK84zV2sxXs7LtkBoN79R9Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 409,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3044022043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b0232102810220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 410,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3045022100bc07ff031506dc74a75086a43252fb43731975a16dca6b025e867412d94222d00220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a",
+        "wx" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
+        "wy" : "0b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaxfR8uEsQkf4vOblY6RA8ncDfYEt\n6zOg9KE5RdiYwpawHL0cAeWAZXEYFLWD8GHp1DHMqZTOoTE0Sb+XyECuCg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 411,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3044022043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b0232102810220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 412,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3045022100bc07ff031506dc74a75086a43252fb43731975a16dca6b025e867412d94222d00220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d",
+        "wx" : "4aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad5",
+        "wy" : "087d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEBKrsc2NXJvIT+4qeZNo7hjLkFJWp\nRNAEW1IuunJA+tWH2TFXmKqjpboBd1eHztBeqve04J/IHW0apUboNl1SXQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 413,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "30440220093f3825c0cf820cced816a3a67446c85606a6d529e43857643fccc11e1f705f0220769782888c63058630f97a5891c8700e82979e4f233586bfc5042fa73cb70a4e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 414,
+          "comment" : "pseudorandom signature",
+          "msg" : "4d7367",
+          "sig" : "3046022100e8564e3e515a09f9f35258442b99e162d27e10975fcb7963d3c26319dc093f84022100c3af01ed0fd0148749ca323364846c862fc6f4beb682b7ead3b2d89b9da8bad4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 415,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "304502201412254f8c1dd2742a00ddee5192e7baa288741026871f3057ad9f983b5ab114022100bcdf878fa156f37040922698ad6fb6928601ddc26c40448ea660e67c25eda090",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 416,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "30450221009e0676048381839bb0a4703a0ae38facfe1e2c61bd25950c896aa975cd6ec86902206ea0cedf96f11fff0e746941183492f4d17272c92449afd20e34041a6894ee82",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685",
+        "wx" : "4f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000",
+        "wy" : "0ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETzN8z9Z3JqgF5PFgCuKEnfOAfsoR\nc4Ajn72BaQAAAADtneoSTMjDlkFkEemIww9CfrUEr0OjFGzV336mBmbWhQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 417,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "30440220554482404173a5582884b0d168a32ef8033d7eb780936c390e8eedf720c7f56402200a15413f9ed0d454b92ab901119e7251a4d444ba1421ba639fa57e0d8cf6b313",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 418,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "304502200b1d838dd54a462745e2c8d5f32637f26fb16dde20a385e45f8a20a8a1f8370e022100ae855e0a10ef087075fda0ed84e2bc5786a681172ea9834e53351316df332bbd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 419,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100af89e4f2b03e5d1f0352e258ef71493040c17d70c36cfd044128302df2ed5e4a0220420f04148c3e6f06561bd448362d6c6fa3f9aeeb7e42843b4674e7ddfd0ba901",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000",
+        "wx" : "3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935",
+        "wy" : "084fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPPA9YU2JOc/UmaB4c/rCgWGPBrj/\nh+gBXD9JcmUASTWE+hdNeRxyvyzjiAqJYN0qfHoTOKgvhanlnNvegAAAAA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 420,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "304402206c1581f1485ccc4e657606fa1a38cf227e3870dc9f41e26b84e28483635e321b02201b3e3c22af23e919b30330f8710f6ef3760c0e2237a9a9f5cf30a1d9f5bbd464",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 421,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100dc83bf97ca28db0e04104a16fe3de694311a6cd9f230a300504ae71d8ec755b1022064a83af0ab3e6037003a1f4240dffd8a342afdee50604ed1afa416fd009e4668",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 422,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "30450220575b70b4375684291b95d81e3c820ed9bde9e5b7343036e4951f3c46894a6d9d022100f10d716efbfeba953701b603fc9ef6ff6e47edef38c9eeef2d55e6486bc4d6e6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff",
+        "wx" : "3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935",
+        "wy" : "7b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPPA9YU2JOc/UmaB4c/rCgWGPBrj/\nh+gBXD9JcmUASTV7BeixhuONQdMcd/V2nyLVg4XsyFfQelYaYyQhf////w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 423,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "30450221008d4f113189dfd3d3239e331f76d3fca9cef86fcd5dc9b4ab2ca38aeba56c178b022078389c3cf11dcff6d6c7f5efd277d480060691144b568a6f090c8902557bfc61",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 424,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100834d10ec2d2d50eeebfecd6328f03fafbb488fc043c362cbc67880ec0ebd04b302210094c026feaf6e68759146fe5b6fd52eaa3c3c5552d83719d2cb900615e2a634db",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 425,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "304502206894de495e7bb5566807d475d96a0d414a94f4f02c3ab7c2edc2916deafc1e1f022100a603642c20fabc07182867fcc6923d35be23ad3f97a5f93c6ec5b9cce8239569",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e",
+        "wx" : "2829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffff",
+        "wy" : "0a01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKCnDH6ouQA40TtlLyj/NBUWVbrz+\nitD236X/jv////+gGq+vAA5SWFhVr6dnat4oQRMJkFLfV+frO9N+vrkiLg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 426,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100e500c086fedd59e090ce7bfb615751ed9abe4c09b839ee8f05320245b9796f3e022100807b1d0638c86ef6113fff0d63497800e1b848b5a303a54c748e45ca8f35d7d7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 427,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100b922c1abe1a8309c0acf90e586c6de8c33e37057673390a97ff098f71680b32b022100f86d92b051b7923d82555c205e21b54eab869766c716209648c3e6cc2629057d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 428,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100823c37e46c74ec8497d89245fde3bf53ddb462c00d840e983dcb1b72bbf8bf27022100c4552f2425d14f0f0fa988778403d60a58962e7c548715af83b2edabbb24a49f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73",
+        "wx" : "0fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f5",
+        "wy" : "5a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE////+UgIHmoEWN2PnnOPJmX/kFmt\naqwHCDGMTKmnpPVairy6LdqEdDEe5UFJuXPK4MD7iVV60L945lKaFmO9cw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 429,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30450220577a08a95db6dcda9985109942d3786630f640190f920b95bd4d5d84e0f163ef022100d762286e92925973fd38b67ef944a99c0ec5b499b7175cbb4369e053c1fcbb10",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 430,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "304402207ba458cfe952326922c7aa2854bdc673ce3daaf65d464dfb9f700701503056b102200df8821c92d20546fa741fb426bf56728a53182691964225c9b380b56b22ee6d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 431,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "304402205cd60c3b021b4be116f06f1d447f65e458329a8bbae1d9b5977d18cf5618486102204c635cd7aa9aebb5716d5ae09e57f8c481a741a029b40f71ec47344ef883e86e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71",
+        "wx" : "3fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e",
+        "wy" : "1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAAAAA/oV+WOUnV8DpvXH+G+eABXu\nsjrrv/EXOTe6dI4QmYcgcOjofFVfoTZZzKXX+tz8sAI+qIlUjKSK8rp+cQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 432,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304402204b50e1e8cf830e04c17e7472caf60da8150ffa568e2c64498cc972a379e542e502202e3adaa5afab89cca91693609555f40543578852cde29c21cb037c0c0b78478e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 433,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304402205aea930c7d8fffcd5c6df2c9430ef76f8b5ed58a8b9c95847288abf8f09a1ac202207ddfef7688a6053ce4eeeeefd6f1a9d71381b7548925f6682aa0a9d05cf5a3a3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 434,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304602210098b092c2d14b5b14a23e9368e0ce1be744dfae9f9a5cdaba51e7872099df96f202210090d3e4f87bd7bc94589f8150b6b01045cd8759a00af78b24d7de771887610df5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2",
+        "wx" : "0bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015",
+        "wy" : "1352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvLspFMefBF6qbsu8YSgWs75dLWeW\ncH2BJen4UcGK8BUAAAAAE1K7Sg+i6kzOuatj3WhK3loRJ7zzAKaYpxk7wg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 435,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "30460221009e95f2856a9fff9a172b07817c8c60fe185cd3ce9582678f8cc4b02bc444621a022100c54ca51d8117d904f0d3773911cb2792348fae21c2da7dad25f990d122376e4c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 436,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100e77df8f9782696344c33de29ebdc9f8d3fcf463d950cdbe256fd4fc2fd44877e02210087028850c962cf2fb450ffe6b983981e499dc498fbd654fa454c9e07c8cb5ca8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 437,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100bd2dd6f5026d2b5ad7ead74bdf52b8cbcabc08facee0a1c8584658a85ed0c5dc02203e8543e819bdae47d872e29a85ba38addf3eaeaad8786d79c3fb027f6f1ff4bf",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d",
+        "wx" : "0bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015",
+        "wy" : "0fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvLspFMefBF6qbsu8YSgWs75dLWeW\ncH2BJen4UcGK8BX////+7K1EtvBdFbMxRlScIpe1IqXu2EMM/1lnWObEPQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 438,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100bd5c0294acc28c15c5d1ebc7274c9ca21a081c8a67da430a34a7fff1a564fabb02207ec103a2385b4ff38b47d306434e9091de24dc9f1a25967ee06f8a0a53ac0181",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 439,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "304402203c7dbfb43dd80379ee2c23ad5472873a22c8a0179ac8f381ad9e0f193231dc1f02207cf8e07530ade503b3d43a84b75a2a76fc40763daed4e9734e745c58c9ae72d3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 440,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100b38ca4dac6d949be5e5f969860269f0eedff2eb92f45bfc02470300cc96dd52602201c7b22992bb13749cc0c5bc25330a17446e40db734203f9035172725fc70f863",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdsa_secp384r1_sha384_test.json b/third_party/wycheproof/testvectors/ecdsa_secp384r1_sha384_test.json
new file mode 100644
index 0000000..d1bec29
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdsa_secp384r1_sha384_test.json
@@ -0,0 +1,4454 @@
+{
+  "algorithm" : "ECDSA",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "BER" : "This is a signature with correct values for (r, s) but using some alternative BER encoding instead of DER encoding. Implementations should not accept such signatures to limit signature malleability.",
+    "EdgeCase" : "Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA implementation does not check boundaries and computes s^(-1)==0.",
+    "MissingZero" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.",
+    "PointDuplication" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission."
+  },
+  "numberOfTests" : 392,
+  "header" : [],
+  "testGroups" : [
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f",
+        "wx" : "2da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa",
+        "wy" : "4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200042da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAELaV92hCJJ2pUP5/9rAv/DZdsrXHrcoDn\n2b/Z/uS9svIPR/+IgnQ4l3LZjMV1ITiqS20FTWnc8+JexJ34cHFeNIg7GDYZfXb4\nrZYuePZXG7x0B7DWCR+eTYjwFCdEBhdP\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "signature malleability",
+          "msg" : "313233343030",
+          "sig" : "3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d702301840da9fc1d2f8f8900cf485d5413b8c2574ee3a8d4ca03995ca30240e09513805bf6209b58ac7aa9cff54eecd82b9f1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "Legacy:ASN encoding of s misses leading 0",
+          "msg" : "313233343030",
+          "sig" : "3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70230e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingZero"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "valid",
+          "msg" : "313233343030",
+          "sig" : "3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "308165023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 5,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "306602813012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 6,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "3066023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d702813100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 7,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "30820065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 8,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "30670282003012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70282003100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 10,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3066023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3065023112b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3065022f12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023200e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023000e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "30850100000065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "306a0285010000003012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "306a023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70285010000003100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3089010000000000000065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "306e028901000000000000003012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "306e023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7028901000000000000003100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30847fffffff023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "306902847fffffff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d702847fffffff00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3084ffffffff023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "30690284ffffffff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70284ffffffff00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3085ffffffffff023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "306a0285ffffffffff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "306a023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70285ffffffffff00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3088ffffffffffffffff023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "306d0288ffffffffffffffff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "306d023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70288ffffffffffffffff00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30ff023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "306502ff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d702ff00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "3065028012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7028000e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "30670000023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "306a4981773065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "306925003065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30673065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "306a2235498177023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "306922342500023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "306d2232023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70004deadbeef023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "306a023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72236498177023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d722352500023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "306d023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72233023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "306daa00bb00cd003065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "306baa02aabb3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "306d2238aa00bb00cd00023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "306b2236aa02aabb023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "306d023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72239aa00bb00cd00023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "306b023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72237aa02aabb023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "30803065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "30692280023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70000023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72280023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "30803165023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "30692280033012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70000023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d72280033100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2e65023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2f65023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3165023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3265023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "ff65023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "306930010230643012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "30643012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 79,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f8200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f8205000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "3080023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "30673000023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f823000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "30673065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "3032023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "308198023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "removing integer",
+          "msg" : "313233343030",
+          "sig" : "3033023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "303402023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "3033023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d702",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3067023212b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70000023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023300e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "30670232000012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 95,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70233000000e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 96,
+          "comment" : "appending unused 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70000023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "3067023212b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70500023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "3067023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023300e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f820500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "30350281023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "3034023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70281",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "30350500023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "3034023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3065003012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3065013012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3065033012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3065043012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3065ff3012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7003100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7013100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7033100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7043100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7ff3100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "30350200023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "3034023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "30692234020112022fb30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "3069023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d722350201000230e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "3065023010b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023102e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c54857023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f02",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3064022f12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3064022fb30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023000e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70230e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "30660231ff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "3066023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70232ff00e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "3036090180023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "3035023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7090180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "3036020100023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "3035023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7020100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "306602310112b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19a25617aad7485e6312a8589714f647acf7a94cffbe8a724a023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30660231ff12b30abef6b5476fe6b612ae557c0425661e26b44b1bfe1a138f7ca6eeda02a462743d328394f8b71dd11a2a25001f64023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30650230ed4cf541094ab8901949ed51aa83fbda99e1d94bb4e401e6250d35d71ceecf7c4571b51b33ba5fcdf542cc6b0e3ab729023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3066023100ed4cf541094ab8901949ed51aa83fbda99e1d94bb4e401e5ec7083591125fd5b9d8bc2cd7c6b0748e22ee5d5daffe09c023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30660231feed4cf541094ab8901949ed51aa83fbda99e1d94bb4e401e65da9e85528b7a19ced57a768eb09b8530856b30041758db6023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "306602310112b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3066023100ed4cf541094ab8901949ed51aa83fbda99e1d94bb4e401e6250d35d71ceecf7c4571b51b33ba5fcdf542cc6b0e3ab729023100e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023101e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc5f8fc6adfda650a86aa74b95adbd6874b3cd8dde6cc0798f5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70230e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc66a35cfdbf1f6aec7fa409df64a7538556300ab11327d460f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70231ff1840da9fc1d2f8f8900cf485d5413b8c2574ee3a8d4ca039ce66e2a219d22358ada554576cda202fb0133b8400bd907e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d70231fe1840da9fc1d2f8f8900cf485d5413b8c2574ee3a8d4ca03a07039520259af579558b46a5242978b4c327221933f8670b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3065023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d7023101e7bf25603e2d07076ff30b7a2abec473da8b11c572b35fc631991d5de62ddca7525aaba89325dfd04fecc47bff426f82",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3064023012b30abef6b5476fe6b612ae557c0425661e26b44b1bfe19daf2ca28e3113083ba8e4ae4cc45a0320abd3394f1c548d702301840da9fc1d2f8f8900cf485d5413b8c2574ee3a8d4ca039ce66e2a219d22358ada554576cda202fb0133b8400bd907e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036020100023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036020100023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036020100023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036020100023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036020100023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036020101023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036020101023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036020101023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036020101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036020101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020101090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201ff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201ff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201ff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201ff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201ff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30080201ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529730201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3038023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529720201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3038023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529740201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3038023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3038023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000001000000000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3038023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "Edge case for Shamir multiplication",
+          "msg" : "3133323237",
+          "sig" : "3066023100ac042e13ab83394692019170707bc21dd3d7b8d233d11b651757085bdd5767eabbb85322984f14437335de0cdf565684023100bd770d3ee4beadbabe7ca46e8c4702783435228d46e2dd360e322fe61c86926fa49c8116ec940f72ac8c30d9beb3e12f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "special case hash",
+          "msg" : "31373530353531383135",
+          "sig" : "3066023100d3298a0193c4316b34e3833ff764a82cff4ef57b5dd79ed6237b51ff76ceab13bf92131f41030515b7e012d2ba857830023100bfc7518d2ad20ed5f58f3be79720f1866f7a23b3bd1bf913d3916819d008497a071046311d3c2fd05fc284c964a39617",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "special case hash",
+          "msg" : "3130333633303731",
+          "sig" : "3065023100e14f41a5fc83aa4725a9ea60ab5b0b9de27f519af4b557a601f1fee0243f8eee5180f8c531414f3473f4457430cb7a2602301047ed2bf1f98e3ce93e8fdbdc63cc79f238998fee74e1bb6cd708694950bbffe3945066064da043f04d7083d0a596ec",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "special case hash",
+          "msg" : "32333632343231333231",
+          "sig" : "3066023100b7c8b5cf631a96ad908d6a8c8d0e0a35fcc22a5a36050230b665932764ae45bd84cb87ebba8e444abd89e4483fc9c4a8023100a11636c095aa9bc69cf24b50a0a9e5377d0ffbba4fab5433159f006ab4563d55e918493020a19691574e4d1e66e3975e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "special case hash",
+          "msg" : "34353838303134363536",
+          "sig" : "306402304a7df2df6a32d59b6bfed54f032c3d6f3acd3ac4063704099cd162ab3908e8eeba4e973ee75b5e285dd572062338fe58023035365be327e2463dc759951c5c0be5e3d094cb706912fdf7d26b15d4a5c42ffebeca5ae73a1823f5e65d571b4ccf1a82",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "special case hash",
+          "msg" : "32313436363035363432",
+          "sig" : "30660231009ad363a1bbc67c57c82a378e988cc083cc91f8b32739ec647c0cb348fb5c86472015131a7d9083bf4740af3351755195023100d310dc1509f8c00281efe571768d488027ea760fe32971f6cb7b57cdf90621b7d0086e26443d3761df7aa3a4eccc6c58",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "special case hash",
+          "msg" : "333335333030383230",
+          "sig" : "306502310095078af5c2ac230239557f5fcee2e712a7034e95437a9b34c1692a81270edcf8ddd5aba1138a42012663e5f81c9beae2023040ee510a0cceb8518ad4f618599164da0f3ba75eceeac216216ec62bcceae8dc98b5e35b2e7ed47c4b8ebacfe84a74e6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "special case hash",
+          "msg" : "36333936363033363331",
+          "sig" : "3066023100a538076362043de54864464c14a6c1c3a478443726c1309a36b9e9ea1592b40c3f3f90d195bd298004a71e8f285e093a023100d74f97ef38468515a8c927a450275c14dc16ddbdd92b3a5cae804be20d29c682129247d2e01d37dabe38ffb74808a8b7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "special case hash",
+          "msg" : "33333931363630373935",
+          "sig" : "3065023100bbe835113f8ea4dc469f0283af6603f3d7a3a222b3ab5a93db56007ef2dc07c97988fc7b8b833057fa3fbf97413b6c150230737c316320b61002c2acb184d82e60e46bd2129a9bbf563c80da423121c161decd363518b260aaacf3734c1ef9faa925",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "special case hash",
+          "msg" : "31343436393735393634",
+          "sig" : "30650230679c3640ad8ffe9577d9b59b18ff5598dbfe61122bbab8238d268907c989cd94dc7f601d17486af93f6d18624aa524a3023100e84dd195502bdcdd77b7f51d8c1ea789006905844a0e185474af1a583bab564ee23be0bc49500390dceb3d3948f06730",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "special case hash",
+          "msg" : "35313539343738363431",
+          "sig" : "3066023100f6f1afe6febce799cc9b754279f2499f3825c3e789accef46d3f068e2b6781fd50669e80c3c7293a5c0c0af48e068e35023100f59cc8c2222ed63b4553f8149ebecc43b866719b294ef0832a12b3e3dbc825eeab68b5779625b10ae5541412ec295354",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "special case hash",
+          "msg" : "35323431373932333331",
+          "sig" : "3065023100f46496f6d473f3c091a68aaa3749220c840061cd4f888613ccfeac0aa0411b451edbd4facbe38d2dd9d6d0d0d255ed34023000c3a74fa6666f58c4798f30c3779813e5c6d08ac31a792c2d0f9cb708733f26ad6bf3b1e46815ae536aa151680bdee2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "special case hash",
+          "msg" : "31313437323930323034",
+          "sig" : "3066023100df8b8e4cb1bc4ec69cb1472fa5a81c36642ed47fc6ce560033c4f7cb0bc8459b5788e34caa7d96e6071188e449f0207a0231008b8ee0177962a489938f3feffae55729d9d446fe438c7cb91ea5f632c80aa72a43b9b04e6de7ff34f76f4425107fd697",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "special case hash",
+          "msg" : "3130383738373235363435",
+          "sig" : "30660231008bb6a8ecdc8b483ad7b9c94bb39f63b5fc1378efe8c0204a74631dded7159643821419af33863b0414bd87ecf73ba3fb0231008928449f2d6db2b2c65d44d98beb77eeadcbda83ff33e57eb183e1fc29ad86f0ba29ee66e750e8170ccc434cf70ae199",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "special case hash",
+          "msg" : "37333433333036353633",
+          "sig" : "3065023100e3832877c80c4ed439d8eadcf615c0286ff54943e3ae2f66a3b9f886245fea470e6d5812cef80c23e4f568d0215a3bfc02303177a7dbf0ab8f8f5fc1d01b19d6a5e89642899f369dfe213b7cc55d8eaf21dd2885efce52b5959c1f06b7cac5773e5b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 231,
+          "comment" : "special case hash",
+          "msg" : "393734343630393738",
+          "sig" : "306502306275738f0880023286a9b6f28ea0a9779e8d644c3dec48293c64f1566b34e15c7119bd9d02fa2357774cabc9e53ef7e6023100d2f0a52b1016082bd5517609ee81c0764dc38a8f32d9a5074e717ee1d832f9ea0e4c6b100b1fd5e7f4bc7468c79d3933",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 232,
+          "comment" : "special case hash",
+          "msg" : "33323237303836383339",
+          "sig" : "3066023100d316fe5168cf13753c8c3bbef83869a6703dc0d5afa82af49c88ff3555660f57919a6f36e84451c3e8e5783e3b83fe3b023100995f08c8fec7cd82ce27e7509393f5a3803a48fe255fcb160321c6e1890eb36e37bcda158f0fa6899e7d107e52de8c3c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 233,
+          "comment" : "special case hash",
+          "msg" : "323332393736343130",
+          "sig" : "306402300b13b8fd10fa7b42169137588ad3f557539a4e9206f3a1f1fe9202b0690defded2be18147f5b2da9285c0e7349735ea302300478ad317b22a247bf9334719b4c8ee84acf134515db77e6141c75d08961e1e51eaca29836744103de0f6a4c798d3eeb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 234,
+          "comment" : "special case hash",
+          "msg" : "3934303437333831",
+          "sig" : "3065023015804429bcb5277d4f0af73bd54c8a177499a7b64f18afc566c3ce7096bdc6c275e38548edcfa0b78dd7f57b6f393e49023100d5951f243e65b82ba5c0c7552d33b11f1e90fde0c3fd014aac1bb27db2aaf09b667c8b247c4cdd5b0723fba83b4f999e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 235,
+          "comment" : "special case hash",
+          "msg" : "33323230353639313233",
+          "sig" : "30650230359247c95776bb17492b7bf827f5f330fa9f9de7cc10441a1479c81776ce36cdc6a13c5f5149c4e39147a196bb02ed34023100f6ed9252a73de48516f4eabab6368fbff6875128af4e1226d54db558bd76eec369cc9b285bc196d512e531f84864d33f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 236,
+          "comment" : "special case hash",
+          "msg" : "343134303533393934",
+          "sig" : "3065023100a557d1f63a2094f683429ecb35a6533bac897682775c0051e111eed6e076c48867cae005c5e0803800b050311e381cd602302a2f871efcf03cf1c8f509e076aaa2a76f1ea78d1c64804ea5b063b0324b8e98eb5825d04370106020ee15805dbedf81",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 237,
+          "comment" : "special case hash",
+          "msg" : "31393531353638363439",
+          "sig" : "3065023100f22bf91169b4aec84ca84041cb826f7dfc6f33d973f3c72433b8a0ca203aac93f7eed62be9bea01706402d5b5d3b0e6502307841d3bc34aa47e813a55c25203c5ec2342d838d5b4638c2705dcf4bac9c24f765b5d4c28fa3c7fda7a38ed5048c7de3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 238,
+          "comment" : "special case hash",
+          "msg" : "35393539303731363335",
+          "sig" : "30660231009c196e39a2d61a3c2565f5932f357e242892737e9adfc86c6609f291e5e6fdbb23029ff915a032b0c5390ba9d15f203e023100d721e28e5269d7813e8a9aed53a37e652fec1560ca61f28f55ab4c262cc6214eee8d3c4c2ba9d1ba0ba19e5e3c7484a7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 239,
+          "comment" : "special case hash",
+          "msg" : "323135333436393533",
+          "sig" : "30660231008ba1e9dec14d300b0e250ea0bcd4419c3d9559622cc7b8375bd73f7d70133242e3d5bf70bc782808734654bacd12daea023100d893d3970f72ccab35555ae91ebcfed3c5bfc5d39181071bc06ba382587a695e02ed482f1a74fe309a399eaee5f5bc52",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 240,
+          "comment" : "special case hash",
+          "msg" : "34383037313039383330",
+          "sig" : "306402302f521d9d83e1bff8d25255a9bdca90e15d78a8c9ea7885b884024a40de9a315bed7f746b5da4ce96b070208e9ae0cfa502304185c6f4225b8c255a4d31abb5c9b6c686a6ee50a8eb7103aaef90245a4722fc8996f266f262109c3b5957ba73289a20",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 241,
+          "comment" : "special case hash",
+          "msg" : "343932393339363930",
+          "sig" : "3065023100d4900f54c1bc841d38eb2f13e0bafbb12b5667393b07102db90639744f54d78960b344c8fbfbf3540b38d00278e177aa02303a16eff0399700009b6949f3f506c543495bf8e0f3a34feb8edd63648747b531adc4e75398e4da8083b88b34c2fb97a8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 242,
+          "comment" : "special case hash",
+          "msg" : "32313132333535393630",
+          "sig" : "3065023100c0169e2b8b97eeb0650e27653f2e473b97a06e1e888b07c1018c730cabfdeeec4a626c3edee0767d44e8ed07080c2ac4023013f46475f955f9701928067e3982d4ba5a58a379a66f91b74fad9ac8aee30086be6f41c9c2d8fb80e0924dedbe67e968",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 243,
+          "comment" : "special case hash",
+          "msg" : "31323339323735373034",
+          "sig" : "306402302e868871ea8b27a8a746882152051f2b146af4ac9d8473b4b6852f80a1d0c7cab57489aa43f89024388aec0605b0263702306d8c89eed8a5a6252c5cead1c55391c6743d881609e3db24d70ead80a663570020798fbf41d4c624fcb1ce36c536fe38",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 244,
+          "comment" : "special case hash",
+          "msg" : "32303831313838373638",
+          "sig" : "3065023100abe6a51179ee87c957805ecad5ccebca30c6e3a3e6dbe4eb4d130b71df2bf590b9d67c8f49e81bf90ce0909d3c2dab4c02307110582fab495b21bd9dda064fbd7acc09d0544dcf7699be35ad16207ffa10e8904f9241a709487ba2ba7e34430b81c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 245,
+          "comment" : "special case hash",
+          "msg" : "343534363038393633",
+          "sig" : "3064023050252c19e60e4120b7c28b2c2e0a588e5d107518cd61e5c7999c6d465ea134f752322d8b83f5988fcdc62bd9adb36ccd0230193899352491dabfe4fc942e14ddacb200673729d61602cc0baf5732d262f36e5279865a810ce2f977f57686a0d0137a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 246,
+          "comment" : "special case hash",
+          "msg" : "31333837363837313131",
+          "sig" : "3066023100eb725fdd539d7de8ea02fac8db6ec464f40c272a63e6b2718c4e0266bf1235dae330f747a6052f4319ecbe7bdade9bd0023100ae84507648ba2d1944bb67722ccd2cb94b92b59e89a1ae698c668bb57f481c42b216c23da4b1d8c0e502ef97fda05ad0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 247,
+          "comment" : "special case hash",
+          "msg" : "32303331333831383735",
+          "sig" : "3064023025aa56fcbd92f2cf53bddbaa0db537de5843290731c1dd78036fcbded4a8f7187ddfed9f5ca9d98ea7b12d24b8d29d570230028f68372d66164810bf79c30a191116d496fe32314605dc1668289425fb3a15d7532dde1052a49a35866c147abde1d9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 248,
+          "comment" : "special case hash",
+          "msg" : "323535333538333333",
+          "sig" : "3065023054bf7adc8548e7cae270e7b097f16b5e315158d21b0e652ce1cfe4b33126ba4a65bf227b4cddcaf22d33d82478937b20023100bfc1b8f1d02846a42f31e1bd10ba334065459f712a3bbc76005d6c6488889f88c0983f4834d0bf2249dbf0a6db760701",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 249,
+          "comment" : "special case hash",
+          "msg" : "34363138383431343732",
+          "sig" : "3066023100d3bb29ac0bd1f6058a5197f766d6ea3216c572ded62af46318c8c7f9547bb246553654279d69989d9af5ef4ccacf64da023100e10281122c2112a2a5a9d87ac58f64fb07c996a2d09292119e8f24d5499b2e8524ebd0570097f6cc7f9c26094a35c857",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 250,
+          "comment" : "special case hash",
+          "msg" : "31303039323435383534",
+          "sig" : "3066023100bc32e85e3112472408f9324586e525325128a38313c34b79700cb0a3f7262a90a1fcc40eef1f1a3884032a7a21810e0a023100c02f52541360358107a13dbea31f83d80397710901734b7adb78b1fc904454a28a378514ccef80ecc70c1d8e55f11311",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 251,
+          "comment" : "special case hash",
+          "msg" : "32373536343636353238",
+          "sig" : "3066023100f04b9e17c71d2d2133ea380d71b6b82c8a8e3332703e9d535b2c2bca9b0ad586d176a6049afa35edd9722edb5c33daa3023100bd44d4a6263380ca6f22e76c26d5f70f41f4d7cae7d4b9c1b8dc2ba5298d9d12408b04614e2f3796cc19c950c8c88a10",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 252,
+          "comment" : "special case hash",
+          "msg" : "313139363937313032",
+          "sig" : "3065023100c8807351d8e261338e750cb9a52f4be4470b63f6f181cbe0e81d43b60824ba4be1bba42b1783897a0d72b0614018b02f023052e3a598c8be982127e961eed2b04f21c86df4ebcab0d955a7c66ec7f818898798ee75367a85022276b912c0a072bff7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 253,
+          "comment" : "special case hash",
+          "msg" : "323333313432313732",
+          "sig" : "306402306152841b6fb460546eeb4158a3e5ffa54f51aa6a208987be899b706055cd59d8ec7c01f4634254fe050e1d4ec525a173023073f0c5f13640d892c28f701428e8fbfb736b6478bbd972c8c684977556ed599a70d313e06b126080e13068d56e1c10be",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 254,
+          "comment" : "special case hash",
+          "msg" : "31363733343831383938",
+          "sig" : "3066023100842f8d2814f5b7163f4b21bd9727246e078ad1e7435dfe1bc5f9e0e7374232e686b9b98b73deab9e43b3b7f25416c2be023100852c106c412300bac3ba265990b428a26076ab3f00fd7657bbd9315fa1cd2a1230a9a60d06b7af87aa0a6cf3f48b344c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 255,
+          "comment" : "special case hash",
+          "msg" : "31343630313539383237",
+          "sig" : "3066023100e13f6d638b9d4fba54aa436a945cfea66dec058fab6f026293265884457b5a86e8e927d699bc64431b71e3d41df200440231009832cd1b4177118ed247b4f31277da15f420179f45c71a237d77f599a45df68247bac3dcef0868ecd1665005c25b7c6c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 256,
+          "comment" : "special case hash",
+          "msg" : "38393930383539393239",
+          "sig" : "3064023009fff1c2e4ff8643cbfad588620c2bf7aaca5cf4242969142c7145b927bd82ed14f3ae8c6e2ce2da63b990b9f1be6d640230780c816f6c86343b008235ee986abf2136123ed247e4751e4d5467334f08e5e2ca1161254f68c3e6678e2d0b87d1cc7c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 257,
+          "comment" : "special case hash",
+          "msg" : "34333236343430393831",
+          "sig" : "3066023100ffae6e7d2cea71b5a9c73cbc1285a8d252949772afe1aa27fb137740fc429c2a8c8648c9a5ba678a32f7ae7689b395ca02310089d54cd13a162c34189ff524813690e79768af8ebe794cc941dfe7fdf2cb8dd0b42519f034ea4d4f1c870046d13210e1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 258,
+          "comment" : "special case hash",
+          "msg" : "32333736343337353537",
+          "sig" : "3066023100efa3c5fc3c8be1007475a2dbd46e3578bb30579445909c2445f850fb8aa60aa5b1749cc3400d8ffd81cb8832b50d27b4023100b36a08db3845b3d2ebd2c335480f12fb83f2a7351841ea3842ec62ad904b098efbf9faa7828b9c185746d9c8bd047d76",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 259,
+          "comment" : "special case hash",
+          "msg" : "383630333937373230",
+          "sig" : "3066023100f577095f7c74594aa1c69aca9bb26e0c7475ae5163058ecc074b03af89e56b12b6a72450589dacf0d7e6b172d0017a0e023100bee756a0b5d0a677bf95f98da512854f3ecb712f94570e1ad230eab17c527b6a8bcc9ae202b657a3611ecffa94ba0d54",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 260,
+          "comment" : "special case hash",
+          "msg" : "35383037373733393837",
+          "sig" : "306502300ae7688c7de5882eb9c3172f5500015552f998fb53702c6cd4b03404d5a0510a8073db95db544808dbd76659fd20cf12023100bc610fe5f04d8909cc439615fb7e302d3d82992817647c50c1f467090a52b328cbbc0262f18ffb6fd9f3bd60013cea08",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 261,
+          "comment" : "special case hash",
+          "msg" : "353731383636383537",
+          "sig" : "306502305dc8a6d84afaaf900d78c6a91dc5e12e7d17891a52c1468253061d704b8940bef85b9fe807a0e02b56e8dd37c22fbb82023100914258de52932c4604dceb5ce7cc0a92e021edca9b819b84a9f25652f9af13f956a1139ee95c7aa7a079e3ad8317fbdb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 262,
+          "comment" : "special case hash",
+          "msg" : "38363737333039333632",
+          "sig" : "3066023100da55a6dbb845205c87c995b0bbc8444ffcba6eb1f4eb9d30f721d2dacc198fb1a8296075e68eb3d25ef596a952b8ea19023100829f671dccad6d7b0b8c4b39ff3f42597965d55c645fb880a66fe198d9344c9311f1598930392470379fa5ff43c75d04",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 263,
+          "comment" : "special case hash",
+          "msg" : "32343735353135303630",
+          "sig" : "306402303730dfd0985de77decdd358a544b47f418d3fab42481530d5d514859894c6f23b729af72b44686058de29687b34b3b0c023065bdfaf0ac217a80b82eb09c9f59c5c8cfbf50a6eb979a8f5f63eab9bd38ee0938e4b23102112033b230a14ad2790e3f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 264,
+          "comment" : "special case hash",
+          "msg" : "393733313736383734",
+          "sig" : "3065023055210df2124c170e259af1dafa73e66613aa18ced8eb40a7f66155d50d5f3124edfa55276de4797013177291e8afeff6023100c314d3a310a60647dad3318ed7f0405a64c3f94b5ac98e6be12208c8ad9835fa6b81a0ea59f476608634657b66e00ffd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 265,
+          "comment" : "special case hash",
+          "msg" : "33363938303935313438",
+          "sig" : "3065023100f6c9897144b5d84964515eb0c8c3d0d9c6687c957887e93c29b2a21804b40307fb88bfd5cca11c95885d28867cb33a740230656bafca242290f7d7e9801b6cfd4bd1b07e8d7c6c1c59fd3d8e82e9846a1b2855c85420e4ee6ec2d97fec2161eeb243",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 266,
+          "comment" : "special case hash",
+          "msg" : "3130373530323638353736",
+          "sig" : "3065023100bfbcc5f343e2ab392ce6c1c02d91c00650c47136836a5d0622d476ac2b3274395721b1ab21882ed5cabed093b43b133f0230043e9fc64c6108df73f9eced90f91185f83d89662f5a9d810c1824fbfd97b842f784305fd6b9c28c80d32d52b1538d12",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 267,
+          "comment" : "special case hash",
+          "msg" : "383639313439353538",
+          "sig" : "3066023100b8f793ddd47e657a9081cbed1600fb22b38ad6a155f9c006ba98de1f383b4c0918ceea72253e0f869524b2369cd9bd8c02310096c452ff58f42e0853040a6d5c7e750b57dd4af06e2df8194e8d524e81ac000ee3315bbeabbf6a21f61b8904c55378d9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 268,
+          "comment" : "special case hash",
+          "msg" : "32313734363535343335",
+          "sig" : "30640230263ab1c93567e93b5ec4e380b0d3bb5ea1ce693c14a47afccc539aaf197f099d331ea9e26f1a0057148d46727acb61880230621db07ce94110e2be74fa953a00a8a554225b3f2c0f6c56b4ebd4db2f57ca2565ed3323fd708bb56ac6e28bfb40f2e7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 269,
+          "comment" : "special case hash",
+          "msg" : "363434353530373932",
+          "sig" : "306502310096f4a2b3529c65e45a0b4c19c582dc8db635d4e74f0b81309696b23be920ba8ec553d4b370df4c59d74dd654bac6df5802301573ba1b280c735a3401d957ecd3b8908e4e0b7d80239ce042594d182faf2ddf811c9056aac4c87f4f85043766a26614",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 270,
+          "comment" : "special case hash",
+          "msg" : "353332383138333338",
+          "sig" : "306602310096a691b19a6294b311a438f8da345e480b1deaa1e940cfbf02177d5f08479976ea58aee31011d50b5542be188c9d63df0231008f67dc9e1588aeb8be180013d41a036f9badfad9fe9340910cbf87243776f54bef7da2ebf3a7643866eb9a3b23fe59b9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 271,
+          "comment" : "special case hash",
+          "msg" : "31313932303736333832",
+          "sig" : "3066023100cff27948c6d902c73d103d0802eb144dd89c1b0e3b9f9a5e498b0361dc122a0d555160d8c64d61539c1dbbd4bc18971f023100b60827488c9f16ba28378fd59b1a29c65073335a7f236131134674c62c8396f193c76f2395ddaaa4f24b69161eb69b4d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 272,
+          "comment" : "special case hash",
+          "msg" : "31353332383432323230",
+          "sig" : "3066023100e90e22d9e535dfdfd86e098d5d6a0ae08f69d4a3ffaa39f6930bcf5f5ad02ee0d0472ae984edd9f0bbe5e7d63fd4f6ac023100e3f57b0a4629ecaa21f2d34a7a0834d57ba20f99c6e31b43c37811cc23b9957c8f3356f4462214d3c8e58745e50f23f6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 273,
+          "comment" : "special case hash",
+          "msg" : "313536373137373339",
+          "sig" : "3064023018b70e272a98cc48e1e0af73146f0f972bbfbeb6b985feb2c4acd695a7a41b99c415be9c46aedaf3ddff67a65a89e387023047d6bcea088f622ad35d88bcf46d71827bcba2f57c36d6fb8a4bf2befdc0d4e3ef366d5966c4d076d3cfa43d6626717b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 274,
+          "comment" : "special case hash",
+          "msg" : "34333033303931313230",
+          "sig" : "3066023100acfd981c55fd5286cfce173726d51c3d25f65b11b7673729a62167256774f7c894b74662a212c706e00cef096074162f023100f4d471c97797c24d96aec1de85a249ef468d6036cd712563aeb65cea4995f3ee85e769b874f09a08637a44a96084be7a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 275,
+          "comment" : "special case hash",
+          "msg" : "37373335393135353831",
+          "sig" : "3065023100f15fcbeea8b64dad5e8566a2c37913c82d6be9d9668df469bd0b591c3923a6e12644eaf697d466fa7cd513983d946a40023070063966801079351526999e5c5c2c5f627e4c8bc96784bcbe715fe7c7afcf69785d1c8c7ccd3725e364101638396597",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 276,
+          "comment" : "special case hash",
+          "msg" : "323433393636373430",
+          "sig" : "3066023100d995147939ae6d8f62bb57372227395839e25a0d4308b899d5f506cf9e0a01e8115b7e4b822f037ec95752bd9e892f5e0231009bb4d07333e468f8482a790a2a2e650e2c42da8240ec5e402506b368122f046680cd71e0117897cce3df4a1555fc8876",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 277,
+          "comment" : "special case hash",
+          "msg" : "34333237363032383233",
+          "sig" : "3064023043c6ce5184476f3f496afeae3cb96a3f9f038957686c93437b8266a233022371d266e904aa096c3566cb33824b88075e0230680c13245a8bc560b638d26f0c5f261964130256939552d3fffb07b658355611612c268a89541055d3c2bf9e82cf4da3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 278,
+          "comment" : "special case hash",
+          "msg" : "32393332303032353932",
+          "sig" : "30630230447539941dc350767fc841083d25d9247a0807e1e22e0bb9d94f504f721981b413d521efbd75e4fe831ee26338cf3de3022f395ab27ea782cee4be53e06c7616bbd41d6926b18d219d75d5979f13cba2f52101019b0ec0a41ffdbf29ef73ddba70",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 279,
+          "comment" : "special case hash",
+          "msg" : "36343039383737323834",
+          "sig" : "3066023100a0ba8e8b979c20345e34fca98531900164a859923bd6986a9c39236a2f5de053a252997f35e5b84b0d48ba0f8d09aedd023100facd6df04358fcd95fa9018a6fc0828dfe319812ff65929c060b18ad4b9f06e7fc0addd1b695315d71c15e51dc51d719",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 280,
+          "comment" : "special case hash",
+          "msg" : "36303735363930343132",
+          "sig" : "3065023100b8378390f71f0bb6663f1846daf6908f8c84f770ae740cc8054122494cf0ffa9437ab26040ca22808fb29a810b70126e0230427636b929a500abc34d9f22977b81e734919afaf3ed2c91eeada7074e0c16bdc52f960eaec9db5a879c1e6414035101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 281,
+          "comment" : "special case hash",
+          "msg" : "32333231363233313335",
+          "sig" : "3066023100f36a9048fd94803d3d6d1b11430b90b94ef8d5d2ad89018c69473ce9cfe0d6105b3c2fb2e7555ccd25f65af8c872bdc602310081254841e7ecbfd0d810afaaf5afd6d6c5d0542bb00cc183b1db01767120afbcc0006ddcba8db7baf65f302723dabc4d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 282,
+          "comment" : "special case hash",
+          "msg" : "36343130313532313731",
+          "sig" : "3066023100d8a4d96409c191baa9540bf35f1d5192f9352d7f0e14f92c0e8e1f19f559b42ed3c6b7bdb6becc56584fb5c09421e2e4023100d966ba13d4245e248eafb46f2a3df92c2037d5969c7db6dbcb0ff4b21850e16a18a29785267239886365cf721a212536",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 283,
+          "comment" : "special case hash",
+          "msg" : "383337323835373438",
+          "sig" : "306402301d5d86fd48e65b0cf0b0b46062241f89cf65785dd818f93f1162771a38a15f20febc261812ecaaf6f4f2b86b3362d7eb02300c76e363de1432513cb9dad6493931381ecd25f142e61968b6f20d7b1270cb9e38a7ae54e4778aff4025eb00c6a67aef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 284,
+          "comment" : "special case hash",
+          "msg" : "33333234373034353235",
+          "sig" : "306402300508eed148f061114be18e8a86188feabf76b873b36eadcca9c2c60e24a2002fe456231decf7a8f6f032c08dbe0ab5a90230694c0ad781b2341e30e1d0739ac99672064f48821a69852c7940cf1d621738199c980d56d2a0b71b3fc6011c6b2444ba",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 285,
+          "comment" : "special case hash",
+          "msg" : "31343033393636383732",
+          "sig" : "30650230726ef88bb7947a043116c111cb519ddeda3e6ffbf724884a1b22c24409cdf2779d93ce610c8c07411c2b001399103d6d02310095dc1d65046caf0e8dad07b224798d6f7807278e737883e7c7bf0b446791d4ee144c26f710134861af4e6771d4082896",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 286,
+          "comment" : "special case hash",
+          "msg" : "31323237363035313238",
+          "sig" : "3066023100eb0e8e3c639f5eba8eccd9020d0ec62d8ac73f3fddbdfa08fdb2155deb0a536923ebd55e20020cab9f8e39a43a88be11023100c796df399fc35883dd5dae6817d02d3d67a8eec6601585e5e36fd2c134eddb1447ec12b144dddc9aae28a84f22602641",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 287,
+          "comment" : "special case hash",
+          "msg" : "34393531343838333632",
+          "sig" : "3065023100e8f8c69d0396ea900f9757736d2b19dbc2d2a8c01dccf490c8b9455bd63b34c095867e7cf3b84dc7c3c3d6b51bebf405023058152a7564eeb22a3e26597026d0cd7835725bd512245448cb5016eb48ea759809fd6949d0ee5d579643f72f908c16bb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 288,
+          "comment" : "special case hash",
+          "msg" : "32343532313237303139",
+          "sig" : "30650230380b4e48b3ff012af7c08bf871d9f4da0c708b5494a986d3d80b1979e579d0dbee61db9bc3c04c396176410788e15a0f023100e6971c013c965a7e4df10f95620a5092fab096bd5b50828f4bc91c5e479bccf6e0daf287e7ef580fa9ea153fa1a507a2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 289,
+          "comment" : "special case hash",
+          "msg" : "31373331353530373036",
+          "sig" : "30650231008061de12029e2b000d157a455ecf2301222f092df95b9551b78cf0ef3a64f12212b57ec7b16d2c0f258946f51cb1633a02300ac2ca6ad99b29ca29a0dc38b34443ee41020f81ed9087cef7681a00c4fe60653a572944ba37f1fe51d112bfffbdd701",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 290,
+          "comment" : "special case hash",
+          "msg" : "31363637303639383738",
+          "sig" : "3066023100e74f2a791eeb7341cff6cc1c24f459e6c0109924f7984639ae387e3ceb58758a1bc3839dea1fc3a3799562225e70a733023100d90e4d0f47343268e56bbcb011bd4734390abc9aa1304b6253e78f5a78b6905aa6bf6a3892a4ae1a875c823ae5a83e87",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 291,
+          "comment" : "special case hash",
+          "msg" : "343431353437363137",
+          "sig" : "306402306a1cd0ff7906be207b56862edcbc0d0bbfb26d43255c99f6ab77639f5e6103a07aa322b22ed43870d1ce6df68aa0a8c10230655558b129aa23184500bd4aab4f0355d3192e9b8860f60b05a1c29261f4486a6ae235a526339b86c05f5fac477b6723",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 292,
+          "comment" : "special case hash",
+          "msg" : "343233393434393938",
+          "sig" : "306602310081111fdc5f0de65583c7a5668d26c04ee52e08dac227753132cff1741cb721e112aa793c0d5fa047faf14cb45dd13e1f0231009a25cf1e6c152bc3e216e021561d194979f1c11fe17019ed7bac2c13c4010f209665e3b6f33b86641704d922b407818f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 293,
+          "comment" : "special case hash",
+          "msg" : "34383037363230373132",
+          "sig" : "30660231009b66d122a315095b2b66ccb97272c476a2d760e827fdea05732d634df3d066569c984dd941aad5f5dec4c2e1b7b94a0002310096c32403c85bc3d0ee87f96a600182796dce53d54d7467ae660a42b87bb70792f14650ac28a5fa47ce9ca4d3b2c25878",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 294,
+          "comment" : "special case hash",
+          "msg" : "32313634363636323839",
+          "sig" : "306402302bb062a002088d62a0b7338d0484fedfe2af7e20cebf6a4788264eb27cb4ebc3cc81c816e6a35722cf9b464783094cb8023046cc21b70f2133f85ab0443bebe9c6fc62c6e2ec1fd9c4ddf4a6d5f3f48eb7abf1ee7bdf6725879fd1b7daafb44f6e04",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 295,
+          "comment" : "special case hash",
+          "msg" : "31393432383533383635",
+          "sig" : "3065023033e87061ee9a82eb74d8bb4ae91606563c2e4db8b09183cc00d1119ab4f5033d287a1fc90a2348163fdf68d35006fd7f02310096db97c947ee2e96e6139d3bcbf5a43606bae1ad3ca28290fbad43b281ef115ec1b98bc581ef48094f8c1aa8e36c282a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 296,
+          "comment" : "special case hash",
+          "msg" : "32323139333833353231",
+          "sig" : "3064023070f80b438424ba228a7d80f26e22ff6a896243c9d49c75573489ee0de58ec60efd103838143465bd8fe34672ba9496170230115492bd9365b96f38747536318bffb819e7c146df3a5a7a46d6288c7fdf31cff570b22176aa398daba9073ab1e7b9bf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 297,
+          "comment" : "special case hash",
+          "msg" : "393236393333343139",
+          "sig" : "3066023100ff16ca0389ea6948f4305b434fe0aa589f880f5aa937767c31170ee8da6c1ad620c993d40ddf141b7fda37424d51b5cd023100ba0f86985dffc61d6e35a37de06918b11e431b72403161acfb8f05c469f1fcfa6e215c6f7eb5a0a5e0cc9e7be79ce18b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 298,
+          "comment" : "special case hash",
+          "msg" : "373639333836333634",
+          "sig" : "3065023100d60c24bee05f5198cd155ad095ffb956bbcfb66b82fc0d3755119915a62f2f923557b85ddc1d12e6a757f23042cb601b02302c4d968b5eac930b51d283b418fcff6df3a9d6d66e3812cd1bf5fde797fd203a7c439b1b381e4fe8b44e6f108764a7dd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 299,
+          "comment" : "special case hash",
+          "msg" : "32373335393330353733",
+          "sig" : "3066023100bdf634d915a4fae7a155532ca2847c33a6babe7ef8db0af50f485db3dd2c8bffe722394583932f6eb5cd97f6db7561d9023100bb425cae2e5483174b5ed873af4329da4618c14458141850bee3c7bf1ffb3f2030159043277dacc708e9d32f63400083",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 300,
+          "comment" : "special case hash",
+          "msg" : "38333030353634303635",
+          "sig" : "30650230061320a3bcebac33cf399d45d1e1e1b34f37288fe4753f4fddfd496eff427e1d26b1b91d749cc34c12f4ecef837c0e8f023100fd5cf468cda319fe06e773a190c38de6e150a321ac1c416ad875432cdb7a07134c446f13068e71a1a96e35da923974ad",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 301,
+          "comment" : "special case hash",
+          "msg" : "34333037363535373338",
+          "sig" : "3065023100d620f063d33efa859b623f6c9a92340e4cdd854ffbe3e5e01379177aee31715ce587b00bd0aea98fddf236d2fc8a7a740230671f4b7c187297dc236c61888b6d9397e97783077cc4101807d79ee62e4a53a78c4b6a3a31b03178668af894a3d8902e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 302,
+          "comment" : "special case hash",
+          "msg" : "39363537303138313735",
+          "sig" : "306502310091c556c5bddd529fe903b86afc0eb8fa1f49425b779a39114ae563bebc947e633ba4ee98948faa8940dfe2562c63e1c50230198b00079d8db072d25b0a49bc8bc36457926f3c101527528df6679f92c76f1b487e6695d4b92fe33b4ee7046a6a5df9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044bf4e52f958427ebb5915fb8c9595551b4d3a3fdab67badd9d6c3093f425ba43630df71f42f0eb7ceaa94d9f6448a85dd30331588249fd2fdc0b309ec7ed8481bc16f27800c13d7db700fc82e1b1c8545aa0c0d3b56e3bfe789fc18a916887c2",
+        "wx" : "4bf4e52f958427ebb5915fb8c9595551b4d3a3fdab67badd9d6c3093f425ba43630df71f42f0eb7ceaa94d9f6448a85d",
+        "wy" : "0d30331588249fd2fdc0b309ec7ed8481bc16f27800c13d7db700fc82e1b1c8545aa0c0d3b56e3bfe789fc18a916887c2"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200044bf4e52f958427ebb5915fb8c9595551b4d3a3fdab67badd9d6c3093f425ba43630df71f42f0eb7ceaa94d9f6448a85dd30331588249fd2fdc0b309ec7ed8481bc16f27800c13d7db700fc82e1b1c8545aa0c0d3b56e3bfe789fc18a916887c2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAES/TlL5WEJ+u1kV+4yVlVUbTTo/2rZ7rd\nnWwwk/QlukNjDfcfQvDrfOqpTZ9kSKhd0wMxWIJJ/S/cCzCex+2EgbwW8ngAwT19\ntwD8guGxyFRaoMDTtW47/nifwYqRaIfC\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 303,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "313233343030",
+          "sig" : "304d0218389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68b023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 304,
+          "comment" : "r too large",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043623bb296b88f626d0f92656bf016f115b721277ccb4930739bfbd81f9c1e734630e0685d32e154e0b4a5c62e43851f6768356b4a5764c128c7b1105e3d778a89d1e01da297ede1bc4312c2583e0bbddd21613583dd09ab895c63be479f94576",
+        "wx" : "3623bb296b88f626d0f92656bf016f115b721277ccb4930739bfbd81f9c1e734630e0685d32e154e0b4a5c62e43851f6",
+        "wy" : "768356b4a5764c128c7b1105e3d778a89d1e01da297ede1bc4312c2583e0bbddd21613583dd09ab895c63be479f94576"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200043623bb296b88f626d0f92656bf016f115b721277ccb4930739bfbd81f9c1e734630e0685d32e154e0b4a5c62e43851f6768356b4a5764c128c7b1105e3d778a89d1e01da297ede1bc4312c2583e0bbddd21613583dd09ab895c63be479f94576",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAENiO7KWuI9ibQ+SZWvwFvEVtyEnfMtJMH\nOb+9gfnB5zRjDgaF0y4VTgtKXGLkOFH2doNWtKV2TBKMexEF49d4qJ0eAdopft4b\nxDEsJYPgu93SFhNYPdCauJXGO+R5+UV2\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 305,
+          "comment" : "r,s are large",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d516cb8ac8e4457b693d5192beeb6ce7d9a46bef48eecf3ea823286f101f98d130f5a26dc6fec23662eff07f14486fd58456932e74894b7f0e3bb0dfd362502b3765dd80a3177209fb221dc9b51aaf4470b245391405bef514176b13a267a720",
+        "wx" : "0d516cb8ac8e4457b693d5192beeb6ce7d9a46bef48eecf3ea823286f101f98d130f5a26dc6fec23662eff07f14486fd5",
+        "wy" : "08456932e74894b7f0e3bb0dfd362502b3765dd80a3177209fb221dc9b51aaf4470b245391405bef514176b13a267a720"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004d516cb8ac8e4457b693d5192beeb6ce7d9a46bef48eecf3ea823286f101f98d130f5a26dc6fec23662eff07f14486fd58456932e74894b7f0e3bb0dfd362502b3765dd80a3177209fb221dc9b51aaf4470b245391405bef514176b13a267a720",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE1RbLisjkRXtpPVGSvuts59mka+9I7s8+\nqCMobxAfmNEw9aJtxv7CNmLv8H8USG/VhFaTLnSJS38OO7Df02JQKzdl3YCjF3IJ\n+yIdybUar0RwskU5FAW+9RQXaxOiZ6cg\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 306,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100d1aee55fdc2a716ba2fabcb57020b72e539bf05c7902f98e105bf83d4cc10c2a159a3cf7e01d749d2205f4da6bd8fcf1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a8380cd35026e13bf87be693cdb6e75a82d765b4019b529e8d277c4af6c9db27ebb5d3f86e88add9d5b61186f04c83a992a187507c737325d2cc624acef3cd036bfa99e0c1518be65c88bb51f900f94123acabad81d15130d3ade7ff7e4364e1",
+        "wx" : "0a8380cd35026e13bf87be693cdb6e75a82d765b4019b529e8d277c4af6c9db27ebb5d3f86e88add9d5b61186f04c83a9",
+        "wy" : "092a187507c737325d2cc624acef3cd036bfa99e0c1518be65c88bb51f900f94123acabad81d15130d3ade7ff7e4364e1"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004a8380cd35026e13bf87be693cdb6e75a82d765b4019b529e8d277c4af6c9db27ebb5d3f86e88add9d5b61186f04c83a992a187507c737325d2cc624acef3cd036bfa99e0c1518be65c88bb51f900f94123acabad81d15130d3ade7ff7e4364e1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEqDgM01Am4Tv4e+aTzbbnWoLXZbQBm1Ke\njSd8SvbJ2yfrtdP4boit2dW2EYbwTIOpkqGHUHxzcyXSzGJKzvPNA2v6meDBUYvm\nXIi7UfkA+UEjrKutgdFRMNOt5/9+Q2Th\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 307,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100b6b681dc484f4f020fd3f7e626d88edc6ded1b382ef3e143d60887b51394260832d4d8f2ef70458f9fa90e38c2e19e4f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04554f2fd0b700a9f4568752b673d9c0d29dc96c10fe67e38c6d6d339bfafe05f970da8c3d2164e82031307a44bd32251171312b61b59113ff0bd3b8a9a4934df262aa8096f840e9d8bffa5d7491ded87b38c496f9b9e4f0ba1089f8d3ffc88a9f",
+        "wx" : "554f2fd0b700a9f4568752b673d9c0d29dc96c10fe67e38c6d6d339bfafe05f970da8c3d2164e82031307a44bd322511",
+        "wy" : "71312b61b59113ff0bd3b8a9a4934df262aa8096f840e9d8bffa5d7491ded87b38c496f9b9e4f0ba1089f8d3ffc88a9f"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004554f2fd0b700a9f4568752b673d9c0d29dc96c10fe67e38c6d6d339bfafe05f970da8c3d2164e82031307a44bd32251171312b61b59113ff0bd3b8a9a4934df262aa8096f840e9d8bffa5d7491ded87b38c496f9b9e4f0ba1089f8d3ffc88a9f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEVU8v0LcAqfRWh1K2c9nA0p3JbBD+Z+OM\nbW0zm/r+Bflw2ow9IWToIDEwekS9MiURcTErYbWRE/8L07ippJNN8mKqgJb4QOnY\nv/pddJHe2Hs4xJb5ueTwuhCJ+NP/yIqf\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 308,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020102020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0444ee3335fa77d2fb02e4bd7074f45e598a879c0fa822ec718c21dc13b83440edc4e3c10a1858423e03044c9eff22591cd027c49933e5510557d6b4b2c6f66fe5dcb9302a3b13fdc68048c3fcac88ba152b6a9833c87fdc6280afc5d11ab7c107",
+        "wx" : "44ee3335fa77d2fb02e4bd7074f45e598a879c0fa822ec718c21dc13b83440edc4e3c10a1858423e03044c9eff22591c",
+        "wy" : "0d027c49933e5510557d6b4b2c6f66fe5dcb9302a3b13fdc68048c3fcac88ba152b6a9833c87fdc6280afc5d11ab7c107"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000444ee3335fa77d2fb02e4bd7074f45e598a879c0fa822ec718c21dc13b83440edc4e3c10a1858423e03044c9eff22591cd027c49933e5510557d6b4b2c6f66fe5dcb9302a3b13fdc68048c3fcac88ba152b6a9833c87fdc6280afc5d11ab7c107",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAERO4zNfp30vsC5L1wdPReWYqHnA+oIuxx\njCHcE7g0QO3E48EKGFhCPgMETJ7/Ilkc0CfEmTPlUQVX1rSyxvZv5dy5MCo7E/3G\ngEjD/KyIuhUrapgzyH/cYoCvxdEat8EH\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 309,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020102020102",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e2f87f72e3c66c73037fe77607d42ad2d9c4cc159893b4b9b8b0365d3a7766dbe8678b02e2b68f58e5a4f7681061a390e38f2142818542bef6b2bc3a2c4f43c95e5259d6bd5401531378c7ca125a1f6cc609d4fadfc5c9a99358ee77ff780c8d",
+        "wx" : "0e2f87f72e3c66c73037fe77607d42ad2d9c4cc159893b4b9b8b0365d3a7766dbe8678b02e2b68f58e5a4f7681061a390",
+        "wy" : "0e38f2142818542bef6b2bc3a2c4f43c95e5259d6bd5401531378c7ca125a1f6cc609d4fadfc5c9a99358ee77ff780c8d"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004e2f87f72e3c66c73037fe77607d42ad2d9c4cc159893b4b9b8b0365d3a7766dbe8678b02e2b68f58e5a4f7681061a390e38f2142818542bef6b2bc3a2c4f43c95e5259d6bd5401531378c7ca125a1f6cc609d4fadfc5c9a99358ee77ff780c8d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE4vh/cuPGbHMDf+d2B9Qq0tnEzBWYk7S5\nuLA2XTp3ZtvoZ4sC4raPWOWk92gQYaOQ448hQoGFQr72srw6LE9DyV5SWda9VAFT\nE3jHyhJaH2zGCdT638XJqZNY7nf/eAyN\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 310,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020102020103",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 311,
+          "comment" : "r is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52975020103",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0405e67c44fc0cbc9a8eb343b4d6f596c7d00cac5da8594caf45b7209397496214c42d856a015ce589bc9ba865a4fab5ab88a01c7b5d09efaf878fcb9102fb3875a8381af234d1c593076e452225a56f51674f347126d3009b44dcbb003a64d95f",
+        "wx" : "5e67c44fc0cbc9a8eb343b4d6f596c7d00cac5da8594caf45b7209397496214c42d856a015ce589bc9ba865a4fab5ab",
+        "wy" : "088a01c7b5d09efaf878fcb9102fb3875a8381af234d1c593076e452225a56f51674f347126d3009b44dcbb003a64d95f"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000405e67c44fc0cbc9a8eb343b4d6f596c7d00cac5da8594caf45b7209397496214c42d856a015ce589bc9ba865a4fab5ab88a01c7b5d09efaf878fcb9102fb3875a8381af234d1c593076e452225a56f51674f347126d3009b44dcbb003a64d95f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEBeZ8RPwMvJqOs0O01vWWx9AMrF2oWUyv\nRbcgk5dJYhTELYVqAVzlibybqGWk+rWriKAce10J76+Hj8uRAvs4dag4GvI00cWT\nB25FIiWlb1FnTzRxJtMAm0TcuwA6ZNlf\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 312,
+          "comment" : "s is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3036020102023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accd7fffa",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040bb03fce3c01ebcf0873abd134a8682f5fb8dbffa22da674047e5c3e71e43de582ed6abb908c2e4faa5d96186278b6c1ba3b22123e68ccc56f17dd79ff15565706f71a0b6123c77af3cd88f0af024cc5259781516edcaf5fe990646e7b66999d",
+        "wx" : "0bb03fce3c01ebcf0873abd134a8682f5fb8dbffa22da674047e5c3e71e43de582ed6abb908c2e4faa5d96186278b6c1",
+        "wy" : "0ba3b22123e68ccc56f17dd79ff15565706f71a0b6123c77af3cd88f0af024cc5259781516edcaf5fe990646e7b66999d"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200040bb03fce3c01ebcf0873abd134a8682f5fb8dbffa22da674047e5c3e71e43de582ed6abb908c2e4faa5d96186278b6c1ba3b22123e68ccc56f17dd79ff15565706f71a0b6123c77af3cd88f0af024cc5259781516edcaf5fe990646e7b66999d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEC7A/zjwB688Ic6vRNKhoL1+42/+iLaZ0\nBH5cPnHkPeWC7Wq7kIwuT6pdlhhieLbBujsiEj5ozMVvF915/xVWVwb3GgthI8d6\n882I8K8CTMUll4FRbtyvX+mQZG57Zpmd\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 313,
+          "comment" : "small r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3036020201000230489122448912244891224489122448912244891224489122347ce79bc437f4d071aaa92c7d6c882ae8734dc18cb0d553",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0458f246090d5e49863bc0bf2d501ff72f551c5f1c5e679eb49064fd02e221a2707326ec2d140bcc817afaad5065761566497c823fd736882cbf78fb92b1a5589b67e8067497c710a4cbb39dee2c5431bc45cfb96c9f8454385c9f2b3ef2d3d31a",
+        "wx" : "58f246090d5e49863bc0bf2d501ff72f551c5f1c5e679eb49064fd02e221a2707326ec2d140bcc817afaad5065761566",
+        "wy" : "497c823fd736882cbf78fb92b1a5589b67e8067497c710a4cbb39dee2c5431bc45cfb96c9f8454385c9f2b3ef2d3d31a"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000458f246090d5e49863bc0bf2d501ff72f551c5f1c5e679eb49064fd02e221a2707326ec2d140bcc817afaad5065761566497c823fd736882cbf78fb92b1a5589b67e8067497c710a4cbb39dee2c5431bc45cfb96c9f8454385c9f2b3ef2d3d31a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEWPJGCQ1eSYY7wL8tUB/3L1UcXxxeZ560\nkGT9AuIhonBzJuwtFAvMgXr6rVBldhVmSXyCP9c2iCy/ePuSsaVYm2foBnSXxxCk\ny7Od7ixUMbxFz7lsn4RUOFyfKz7y09Ma\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 314,
+          "comment" : "smallish r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303c02072d9b4d347952cd023100ce751512561b6f57c75342848a3ff98ccf9c3f0219b6b68d00449e6c971a85d2e2ce73554b59219d54d2083b46327351",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fc6984dd6830d1485fb2581a45a791d8dca2c727c73d3d44c89f0082c1868af5ca74b4ca4ae22802640a9ebfe8c7ae12998d63a5b5ad1b72b899f0b132e4952aaa19d41fdeea48b1ed6b8358dd1db207fd66e01453ad40f67b836adc802d5fe8",
+        "wx" : "0fc6984dd6830d1485fb2581a45a791d8dca2c727c73d3d44c89f0082c1868af5ca74b4ca4ae22802640a9ebfe8c7ae12",
+        "wy" : "0998d63a5b5ad1b72b899f0b132e4952aaa19d41fdeea48b1ed6b8358dd1db207fd66e01453ad40f67b836adc802d5fe8"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004fc6984dd6830d1485fb2581a45a791d8dca2c727c73d3d44c89f0082c1868af5ca74b4ca4ae22802640a9ebfe8c7ae12998d63a5b5ad1b72b899f0b132e4952aaa19d41fdeea48b1ed6b8358dd1db207fd66e01453ad40f67b836adc802d5fe8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE/GmE3Wgw0UhfslgaRaeR2NyixyfHPT1E\nyJ8AgsGGivXKdLTKSuIoAmQKnr/ox64SmY1jpbWtG3K4mfCxMuSVKqoZ1B/e6kix\n7WuDWN0dsgf9ZuAUU61A9nuDatyALV/o\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 315,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "313233343030",
+          "sig" : "3041020d1033e67e37b32b445580bf4efb02302ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad5215c51b320e460542f9cc38968ccdf4263684004eb79a452",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041b8def5922303d647e8eb07e3bad92f924b79b769eef168e7541de1f4e0d28ae9733eb98cf8a1fb6dd52ca02c8c75b51c7aa4bf679d49d8114122074da8f6044a427371796a5654a6106162d5f686abb73ebd896ab08c7062687f12171fbe4a3",
+        "wx" : "1b8def5922303d647e8eb07e3bad92f924b79b769eef168e7541de1f4e0d28ae9733eb98cf8a1fb6dd52ca02c8c75b51",
+        "wy" : "0c7aa4bf679d49d8114122074da8f6044a427371796a5654a6106162d5f686abb73ebd896ab08c7062687f12171fbe4a3"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200041b8def5922303d647e8eb07e3bad92f924b79b769eef168e7541de1f4e0d28ae9733eb98cf8a1fb6dd52ca02c8c75b51c7aa4bf679d49d8114122074da8f6044a427371796a5654a6106162d5f686abb73ebd896ab08c7062687f12171fbe4a3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEG43vWSIwPWR+jrB+O62S+SS3m3ae7xaO\ndUHeH04NKK6XM+uYz4oftt1SygLIx1tRx6pL9nnUnYEUEiB02o9gRKQnNxeWpWVK\nYQYWLV9oartz69iWqwjHBiaH8SFx++Sj\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 316,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "313233343030",
+          "sig" : "303602020100023077a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041734a039a88a16c2ff4aa97d2399121f56f52ef01ed5e50887f736f65b6e51d6e8786abb4e063da5d1ba812dff998403ccd698e6c296d5cd69178f8a82481a865da331627f1c4b324fbc02b36e8b5ed58a31f728e904d203a388755302195765",
+        "wx" : "1734a039a88a16c2ff4aa97d2399121f56f52ef01ed5e50887f736f65b6e51d6e8786abb4e063da5d1ba812dff998403",
+        "wy" : "0ccd698e6c296d5cd69178f8a82481a865da331627f1c4b324fbc02b36e8b5ed58a31f728e904d203a388755302195765"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200041734a039a88a16c2ff4aa97d2399121f56f52ef01ed5e50887f736f65b6e51d6e8786abb4e063da5d1ba812dff998403ccd698e6c296d5cd69178f8a82481a865da331627f1c4b324fbc02b36e8b5ed58a31f728e904d203a388755302195765",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEFzSgOaiKFsL/Sql9I5kSH1b1LvAe1eUI\nh/c29ltuUdboeGq7TgY9pdG6gS3/mYQDzNaY5sKW1c1pF4+Kgkgahl2jMWJ/HEsy\nT7wCs26LXtWKMfco6QTSA6OIdVMCGVdl\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 317,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3041020d062522bbd3ecbe7c39e93e7c24023077a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0452ca47dda99172cb8321495acf988548295988ec973c1b4ea9462c53e5768a704a936410ee847b5dbf1e9d0c131da6c787a47027e6655792eb002d4228ee72f7c814c9a0cecbff267948f81c9903ac10eb35f6cb86369224ed609811cdf390f4",
+        "wx" : "52ca47dda99172cb8321495acf988548295988ec973c1b4ea9462c53e5768a704a936410ee847b5dbf1e9d0c131da6c7",
+        "wy" : "087a47027e6655792eb002d4228ee72f7c814c9a0cecbff267948f81c9903ac10eb35f6cb86369224ed609811cdf390f4"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000452ca47dda99172cb8321495acf988548295988ec973c1b4ea9462c53e5768a704a936410ee847b5dbf1e9d0c131da6c787a47027e6655792eb002d4228ee72f7c814c9a0cecbff267948f81c9903ac10eb35f6cb86369224ed609811cdf390f4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEUspH3amRcsuDIUlaz5iFSClZiOyXPBtO\nqUYsU+V2inBKk2QQ7oR7Xb8enQwTHabHh6RwJ+ZlV5LrAC1CKO5y98gUyaDOy/8m\neUj4HJkDrBDrNfbLhjaSJO1gmBHN85D0\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 318,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "313233343030",
+          "sig" : "3065023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f3023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bd3d91f003e18adbea73079d4eba23b91fc17fcec14c9eb15a193fbc9ca39c8c747cd7a2c9623e05dd587ccbb8ab4c443adb0a0706aa5ea7a68042082fccefc979612a7a1a3d694b00793b03f89bff866a8b97c8e77990c29360ce795036c764",
+        "wx" : "0bd3d91f003e18adbea73079d4eba23b91fc17fcec14c9eb15a193fbc9ca39c8c747cd7a2c9623e05dd587ccbb8ab4c44",
+        "wy" : "3adb0a0706aa5ea7a68042082fccefc979612a7a1a3d694b00793b03f89bff866a8b97c8e77990c29360ce795036c764"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004bd3d91f003e18adbea73079d4eba23b91fc17fcec14c9eb15a193fbc9ca39c8c747cd7a2c9623e05dd587ccbb8ab4c443adb0a0706aa5ea7a68042082fccefc979612a7a1a3d694b00793b03f89bff866a8b97c8e77990c29360ce795036c764",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEvT2R8APhitvqcwedTrojuR/Bf87BTJ6x\nWhk/vJyjnIx0fNeiyWI+Bd1YfMu4q0xEOtsKBwaqXqemgEIIL8zvyXlhKnoaPWlL\nAHk7A/ib/4Zqi5fI53mQwpNgznlQNsdk\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 319,
+          "comment" : "s == 1",
+          "msg" : "313233343030",
+          "sig" : "3035023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 320,
+          "comment" : "s == 0",
+          "msg" : "313233343030",
+          "sig" : "3035023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f896353cc3a8afdd543ec3aef062ca97bc32ed1724ea38b940b8c0ea0e23b34187afbe70daf8dbaa5b511557e5d2bddac4bd265da67ceeafca636f6f4c0472f22a9d02e2289184f73bbb700ae8fc921eff4920f290bfcb49fbb232cc13a21028",
+        "wx" : "0f896353cc3a8afdd543ec3aef062ca97bc32ed1724ea38b940b8c0ea0e23b34187afbe70daf8dbaa5b511557e5d2bdda",
+        "wy" : "0c4bd265da67ceeafca636f6f4c0472f22a9d02e2289184f73bbb700ae8fc921eff4920f290bfcb49fbb232cc13a21028"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004f896353cc3a8afdd543ec3aef062ca97bc32ed1724ea38b940b8c0ea0e23b34187afbe70daf8dbaa5b511557e5d2bddac4bd265da67ceeafca636f6f4c0472f22a9d02e2289184f73bbb700ae8fc921eff4920f290bfcb49fbb232cc13a21028",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE+JY1PMOor91UPsOu8GLKl7wy7Rck6ji5\nQLjA6g4js0GHr75w2vjbqltRFVfl0r3axL0mXaZ87q/KY29vTARy8iqdAuIokYT3\nO7twCuj8kh7/SSDykL/LSfuyMswTohAo\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 321,
+          "comment" : "point at infinity during verify",
+          "msg" : "313233343030",
+          "sig" : "306402307fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043ecfd58a3ce583866e0471d16eb3c10a411ec3b8671f3a04769b1ed8464a71cf1c76d8d9b7e3670bbe712d6f554a9383d980d8bedf57470d6b45cc1ad0c6426dc70a0e4be901106a36663bfcab04fcb86008777b92445120d5e3641d97396362",
+        "wx" : "3ecfd58a3ce583866e0471d16eb3c10a411ec3b8671f3a04769b1ed8464a71cf1c76d8d9b7e3670bbe712d6f554a9383",
+        "wy" : "0d980d8bedf57470d6b45cc1ad0c6426dc70a0e4be901106a36663bfcab04fcb86008777b92445120d5e3641d97396362"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200043ecfd58a3ce583866e0471d16eb3c10a411ec3b8671f3a04769b1ed8464a71cf1c76d8d9b7e3670bbe712d6f554a9383d980d8bedf57470d6b45cc1ad0c6426dc70a0e4be901106a36663bfcab04fcb86008777b92445120d5e3641d97396362",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEPs/Vijzlg4ZuBHHRbrPBCkEew7hnHzoE\ndpse2EZKcc8cdtjZt+NnC75xLW9VSpOD2YDYvt9XRw1rRcwa0MZCbccKDkvpARBq\nNmY7/KsE/LhgCHd7kkRRINXjZB2XOWNi\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 322,
+          "comment" : "u1 == 1",
+          "msg" : "313233343030",
+          "sig" : "3065023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044150ccd0fa45aa2ef6b5042ddbb1b87c5ffd1115a8fe5995641948acda82a7b190762d84352cd74d1ca01e79f68f9cb4eb11be9d494c181c156e23e77e532bdf0a20c3cc74ba8c29b1f3eb2bd99129ee0d70ff0d593f0d7a6d6887e7c55930d2",
+        "wx" : "4150ccd0fa45aa2ef6b5042ddbb1b87c5ffd1115a8fe5995641948acda82a7b190762d84352cd74d1ca01e79f68f9cb4",
+        "wy" : "0eb11be9d494c181c156e23e77e532bdf0a20c3cc74ba8c29b1f3eb2bd99129ee0d70ff0d593f0d7a6d6887e7c55930d2"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200044150ccd0fa45aa2ef6b5042ddbb1b87c5ffd1115a8fe5995641948acda82a7b190762d84352cd74d1ca01e79f68f9cb4eb11be9d494c181c156e23e77e532bdf0a20c3cc74ba8c29b1f3eb2bd99129ee0d70ff0d593f0d7a6d6887e7c55930d2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEQVDM0PpFqi72tQQt27G4fF/9ERWo/lmV\nZBlIrNqCp7GQdi2ENSzXTRygHnn2j5y06xG+nUlMGBwVbiPnflMr3wogw8x0uowp\nsfPrK9mRKe4NcP8NWT8Nem1oh+fFWTDS\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 323,
+          "comment" : "u1 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec63260230064ed80f27e1432e84845f15ece399f2cbf4fa31aa837de9b953d44413b9f5c7c7f67989d703f07abef11b6ad0373ea5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e78fe2c11beac7090ee0af7fed469a8ccebd3cccc4ee9fccc8ef3fc0455b69aaa082dc13e1d84f34026cb6f0af9e992ff34ebba71bf3a4050bf28e4084b5c5f5d4098ec46f10a31b02fb4bf20cc9362f6f02a66e802f817507535fac3ec0b099",
+        "wx" : "0e78fe2c11beac7090ee0af7fed469a8ccebd3cccc4ee9fccc8ef3fc0455b69aaa082dc13e1d84f34026cb6f0af9e992f",
+        "wy" : "0f34ebba71bf3a4050bf28e4084b5c5f5d4098ec46f10a31b02fb4bf20cc9362f6f02a66e802f817507535fac3ec0b099"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004e78fe2c11beac7090ee0af7fed469a8ccebd3cccc4ee9fccc8ef3fc0455b69aaa082dc13e1d84f34026cb6f0af9e992ff34ebba71bf3a4050bf28e4084b5c5f5d4098ec46f10a31b02fb4bf20cc9362f6f02a66e802f817507535fac3ec0b099",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE54/iwRvqxwkO4K9/7UaajM69PMzE7p/M\nyO8/wEVbaaqggtwT4dhPNAJstvCvnpkv8067pxvzpAUL8o5AhLXF9dQJjsRvEKMb\nAvtL8gzJNi9vAqZugC+BdQdTX6w+wLCZ\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 324,
+          "comment" : "u2 == 1",
+          "msg" : "313233343030",
+          "sig" : "3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ee24ab8a34d05af684939357f32759cc5a14f3c717529a20aea8e0c5965d8a41e68925f688471994b72021ba51b28c090a55693c92ad0cbae9edcf515e2b4c060b888d82c81e4a3b6a173b62ed04a46fa95db1a2f3949980fba2e371263c4fa9",
+        "wx" : "0ee24ab8a34d05af684939357f32759cc5a14f3c717529a20aea8e0c5965d8a41e68925f688471994b72021ba51b28c09",
+        "wy" : "0a55693c92ad0cbae9edcf515e2b4c060b888d82c81e4a3b6a173b62ed04a46fa95db1a2f3949980fba2e371263c4fa9"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004ee24ab8a34d05af684939357f32759cc5a14f3c717529a20aea8e0c5965d8a41e68925f688471994b72021ba51b28c090a55693c92ad0cbae9edcf515e2b4c060b888d82c81e4a3b6a173b62ed04a46fa95db1a2f3949980fba2e371263c4fa9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE7iSrijTQWvaEk5NX8ydZzFoU88cXUpog\nrqjgxZZdikHmiSX2iEcZlLcgIbpRsowJClVpPJKtDLrp7c9RXitMBguIjYLIHko7\nahc7Yu0EpG+pXbGi85SZgPui43EmPE+p\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 325,
+          "comment" : "u2 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "3065023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa84ecde56a2cf73ea3abc092185cb1a51f34810f1ddd8c64d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043d2e916055c92e1b36133f5937b37c1b0102834eb77008a3ba9c3da446e9065971d68ba913091851e10cff5b4cd875c139aa7aadfc2caf7107b17ae1aea8b299d61bf15aca0cb3fd6f1ffde8192bfe58f0822bbbc1f55bddf6b4fe9c8f2b0eac",
+        "wx" : "3d2e916055c92e1b36133f5937b37c1b0102834eb77008a3ba9c3da446e9065971d68ba913091851e10cff5b4cd875c1",
+        "wy" : "39aa7aadfc2caf7107b17ae1aea8b299d61bf15aca0cb3fd6f1ffde8192bfe58f0822bbbc1f55bddf6b4fe9c8f2b0eac"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200043d2e916055c92e1b36133f5937b37c1b0102834eb77008a3ba9c3da446e9065971d68ba913091851e10cff5b4cd875c139aa7aadfc2caf7107b17ae1aea8b299d61bf15aca0cb3fd6f1ffde8192bfe58f0822bbbc1f55bddf6b4fe9c8f2b0eac",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEPS6RYFXJLhs2Ez9ZN7N8GwECg063cAij\nupw9pEbpBllx1oupEwkYUeEM/1tM2HXBOap6rfwsr3EHsXrhrqiymdYb8VrKDLP9\nbx/96Bkr/ljwgiu7wfVb3fa0/pyPKw6s\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 326,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0230533b0d50480a3ef07e7e8af8b1097759bc03ac9a1c7ed6075a052869f57f12b285613162d08ee7aab9fe54aaa984a39a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ae596697427aa250156c05ac4338e48980a7f093ea1f1fe67098b43f6539c1b20ae74338f9bf270d33663c50abe8fd001ca6a52732db74ab15d2f249a3d839080f898367dfd64992cdce2708deaad523a2a236b43400424241c91a35b530fa50",
+        "wx" : "0ae596697427aa250156c05ac4338e48980a7f093ea1f1fe67098b43f6539c1b20ae74338f9bf270d33663c50abe8fd00",
+        "wy" : "1ca6a52732db74ab15d2f249a3d839080f898367dfd64992cdce2708deaad523a2a236b43400424241c91a35b530fa50"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004ae596697427aa250156c05ac4338e48980a7f093ea1f1fe67098b43f6539c1b20ae74338f9bf270d33663c50abe8fd001ca6a52732db74ab15d2f249a3d839080f898367dfd64992cdce2708deaad523a2a236b43400424241c91a35b530fa50",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAErllml0J6olAVbAWsQzjkiYCn8JPqHx/m\ncJi0P2U5wbIK50M4+b8nDTNmPFCr6P0AHKalJzLbdKsV0vJJo9g5CA+Jg2ff1kmS\nzc4nCN6q1SOioja0NABCQkHJGjW1MPpQ\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 327,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100d49a253986bbaa8ce9c3d3808313d39c3b950a478372edc009bc0566b73be7b05dad0737e16960257cc16db6ec6c620f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0488738f9981dd4d1fabb60ad83c2dd6dfc9da302209ae3e53498a883b6e39a38bead9b02709f352d3e6b6578154eab2529388a05c6b9f3a4028abb9950a51f5264ecd7580a423fdec9472faeeb57f92e31c46bef2a781fe5edad026009f198262",
+        "wx" : "088738f9981dd4d1fabb60ad83c2dd6dfc9da302209ae3e53498a883b6e39a38bead9b02709f352d3e6b6578154eab252",
+        "wy" : "09388a05c6b9f3a4028abb9950a51f5264ecd7580a423fdec9472faeeb57f92e31c46bef2a781fe5edad026009f198262"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000488738f9981dd4d1fabb60ad83c2dd6dfc9da302209ae3e53498a883b6e39a38bead9b02709f352d3e6b6578154eab2529388a05c6b9f3a4028abb9950a51f5264ecd7580a423fdec9472faeeb57f92e31c46bef2a781fe5edad026009f198262",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEiHOPmYHdTR+rtgrYPC3W38naMCIJrj5T\nSYqIO245o4vq2bAnCfNS0+a2V4FU6rJSk4igXGufOkAoq7mVClH1Jk7NdYCkI/3s\nlHL67rV/kuMcRr7yp4H+XtrQJgCfGYJi\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 328,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0230285090b0d6a6820bbba394efbee5c24a2281e825d2f6c55fb7a85b8251db00f75ab07cc993ceaf664f3c116baf34b021",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f421541311c94fdd79fc298f8ab1a3adfd08029fdad439a94d4cea11f7e799bc439609f2fb7be3f349d55e484d0a0d36b35330bbdbec1e75f2984483d96bf210d722c1830292ffc35a2f6a21a4b50519f565f024bbccc97228a2f8ad8fadc0d5",
+        "wx" : "0f421541311c94fdd79fc298f8ab1a3adfd08029fdad439a94d4cea11f7e799bc439609f2fb7be3f349d55e484d0a0d36",
+        "wy" : "0b35330bbdbec1e75f2984483d96bf210d722c1830292ffc35a2f6a21a4b50519f565f024bbccc97228a2f8ad8fadc0d5"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004f421541311c94fdd79fc298f8ab1a3adfd08029fdad439a94d4cea11f7e799bc439609f2fb7be3f349d55e484d0a0d36b35330bbdbec1e75f2984483d96bf210d722c1830292ffc35a2f6a21a4b50519f565f024bbccc97228a2f8ad8fadc0d5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE9CFUExHJT915/CmPirGjrf0IAp/a1Dmp\nTUzqEffnmbxDlgny+3vj80nVXkhNCg02s1Mwu9vsHnXymESD2WvyENciwYMCkv/D\nWi9qIaS1BRn1ZfAku8zJciii+K2PrcDV\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 329,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100b39af4a81ee4ae79064ed80f27e1432e84845f15ece399f2a43d2505a0a8c72c5731f4fd967420b1000e3f75502ed7b7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04399be4cfc439f94f2421cbd34c2cd90bae53eb60ddfafca52f7275d165d14fa659b636713b5d4b39e62fd48bae141d0e1b23e3b4f0c202ed7b59db78a35c12ac698c603eab144fd09ac2ed8f4495f607e4d2c87a23ce2ec33e410ca47ecc2555",
+        "wx" : "399be4cfc439f94f2421cbd34c2cd90bae53eb60ddfafca52f7275d165d14fa659b636713b5d4b39e62fd48bae141d0e",
+        "wy" : "1b23e3b4f0c202ed7b59db78a35c12ac698c603eab144fd09ac2ed8f4495f607e4d2c87a23ce2ec33e410ca47ecc2555"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004399be4cfc439f94f2421cbd34c2cd90bae53eb60ddfafca52f7275d165d14fa659b636713b5d4b39e62fd48bae141d0e1b23e3b4f0c202ed7b59db78a35c12ac698c603eab144fd09ac2ed8f4495f607e4d2c87a23ce2ec33e410ca47ecc2555",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEOZvkz8Q5+U8kIcvTTCzZC65T62Dd+vyl\nL3J10WXRT6ZZtjZxO11LOeYv1IuuFB0OGyPjtPDCAu17Wdt4o1wSrGmMYD6rFE/Q\nmsLtj0SV9gfk0sh6I84uwz5BDKR+zCVV\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 330,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100af4a81ee4ae79064ed80f27e1432e84845f15ece399f2cbf28df829ccd30f5ef62ec23957b837d73fe4e156edccd4465",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041578bbff72137c4bca33d7385a892be94cb059f9091ddfe890345f712a9fba5fc77084cec11084ed048491604a07f66c76bbaa872f0710d82a08d9dddd833c7be7c7e8e265f49145157eb4e8e8280076a37ee5873271db510034da19da24415b",
+        "wx" : "1578bbff72137c4bca33d7385a892be94cb059f9091ddfe890345f712a9fba5fc77084cec11084ed048491604a07f66c",
+        "wy" : "76bbaa872f0710d82a08d9dddd833c7be7c7e8e265f49145157eb4e8e8280076a37ee5873271db510034da19da24415b"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200041578bbff72137c4bca33d7385a892be94cb059f9091ddfe890345f712a9fba5fc77084cec11084ed048491604a07f66c76bbaa872f0710d82a08d9dddd833c7be7c7e8e265f49145157eb4e8e8280076a37ee5873271db510034da19da24415b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEFXi7/3ITfEvKM9c4Wokr6UywWfkJHd/o\nkDRfcSqful/HcITOwRCE7QSEkWBKB/Zsdruqhy8HENgqCNnd3YM8e+fH6OJl9JFF\nFX606OgoAHajfuWHMnHbUQA02hnaJEFb\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 331,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02305e9503dc95cf20c9db01e4fc2865d0908be2bd9c733e597e8a5bb7b7a62abdff6dbe3978ae56536d0fb01172ecd55f57",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0433ba451c85e729058f83041077a4695eb47df93e718b09a4618c753ac803cd75c1a91290c2ff5a635389d07149571dab1fc7d8a71776851ff244ff632fe6f92e1652e5284893c4244fe775d8efc589d823dd03f3919027f004537bd8ee09f3a3",
+        "wx" : "33ba451c85e729058f83041077a4695eb47df93e718b09a4618c753ac803cd75c1a91290c2ff5a635389d07149571dab",
+        "wy" : "1fc7d8a71776851ff244ff632fe6f92e1652e5284893c4244fe775d8efc589d823dd03f3919027f004537bd8ee09f3a3"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000433ba451c85e729058f83041077a4695eb47df93e718b09a4618c753ac803cd75c1a91290c2ff5a635389d07149571dab1fc7d8a71776851ff244ff632fe6f92e1652e5284893c4244fe775d8efc589d823dd03f3919027f004537bd8ee09f3a3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEM7pFHIXnKQWPgwQQd6RpXrR9+T5xiwmk\nYYx1OsgDzXXBqRKQwv9aY1OJ0HFJVx2rH8fYpxd2hR/yRP9jL+b5LhZS5ShIk8Qk\nT+d12O/Fidgj3QPzkZAn8ARTe9juCfOj\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 332,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02301ee4ae79064ed80f27e1432e84845f15ece399f2cbf4fa31a3ae8edab84dc3330a39f70938e3912bd59753de5aed3088",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04040771e3390216fed2c6208bdf5bfea83ab1915b166e626569f12efd410a39b7e7c76f70f0012843a26debf4ccc33ddae5bc5f7e62d054eac31cd022afdb71b7c638f24c30cbad0ef35ed2fc9917f356e9c3f04391b21d1035274b81537fcbf3",
+        "wx" : "40771e3390216fed2c6208bdf5bfea83ab1915b166e626569f12efd410a39b7e7c76f70f0012843a26debf4ccc33dda",
+        "wy" : "0e5bc5f7e62d054eac31cd022afdb71b7c638f24c30cbad0ef35ed2fc9917f356e9c3f04391b21d1035274b81537fcbf3"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004040771e3390216fed2c6208bdf5bfea83ab1915b166e626569f12efd410a39b7e7c76f70f0012843a26debf4ccc33ddae5bc5f7e62d054eac31cd022afdb71b7c638f24c30cbad0ef35ed2fc9917f356e9c3f04391b21d1035274b81537fcbf3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEBAdx4zkCFv7SxiCL31v+qDqxkVsWbmJl\nafEu/UEKObfnx29w8AEoQ6Jt6/TMwz3a5bxffmLQVOrDHNAir9txt8Y48kwwy60O\n817S/JkX81bpw/BDkbIdEDUnS4FTf8vz\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 333,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100bb51cd3ba8eb201f53ddb4e34e08c0ff7dff9378106784d798d5a3440bd6dc34be3a0eaef8776619a0c97fefb15720b3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0498d3f16e1c510a933e648e78d01588319f002e9475df8942a2a89db0666bb7c88b32bb248140e44ac4ab28111b2b792399a926f4a66fbe28ff65c09f8306893aec094b89d0fe529e3577c5ecf30a7944caaf530f4575eb113fcf4c200d2dd4bd",
+        "wx" : "098d3f16e1c510a933e648e78d01588319f002e9475df8942a2a89db0666bb7c88b32bb248140e44ac4ab28111b2b7923",
+        "wy" : "099a926f4a66fbe28ff65c09f8306893aec094b89d0fe529e3577c5ecf30a7944caaf530f4575eb113fcf4c200d2dd4bd"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000498d3f16e1c510a933e648e78d01588319f002e9475df8942a2a89db0666bb7c88b32bb248140e44ac4ab28111b2b792399a926f4a66fbe28ff65c09f8306893aec094b89d0fe529e3577c5ecf30a7944caaf530f4575eb113fcf4c200d2dd4bd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEmNPxbhxRCpM+ZI540BWIMZ8ALpR134lC\noqidsGZrt8iLMrskgUDkSsSrKBEbK3kjmakm9KZvvij/ZcCfgwaJOuwJS4nQ/lKe\nNXfF7PMKeUTKr1MPRXXrET/PTCANLdS9\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 334,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100e707e267ea635384a6da09823149f5cb7acbb29e910d2630c5fb5afbc42aa8436349b214a3b8fb9481ec999e005091f8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d1fd602feef80be9e55a19d1a9799c72a899110c6ac21fb3c21357069809d591a8775b64d1867a8cfff124f6a5e3a4f5f9548064f01b9af8868705493a37a037193b48f53b7c7973023f53e6ceff6830ca2f7a14ef51536d453af43b3058d8a9",
+        "wx" : "0d1fd602feef80be9e55a19d1a9799c72a899110c6ac21fb3c21357069809d591a8775b64d1867a8cfff124f6a5e3a4f5",
+        "wy" : "0f9548064f01b9af8868705493a37a037193b48f53b7c7973023f53e6ceff6830ca2f7a14ef51536d453af43b3058d8a9"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004d1fd602feef80be9e55a19d1a9799c72a899110c6ac21fb3c21357069809d591a8775b64d1867a8cfff124f6a5e3a4f5f9548064f01b9af8868705493a37a037193b48f53b7c7973023f53e6ceff6830ca2f7a14ef51536d453af43b3058d8a9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE0f1gL+74C+nlWhnRqXmccqiZEQxqwh+z\nwhNXBpgJ1ZGod1tk0YZ6jP/xJPal46T1+VSAZPAbmviGhwVJOjegNxk7SPU7fHlz\nAj9T5s7/aDDKL3oU71FTbUU69DswWNip\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 335,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100acc4f2afb7f5c10f818175074ef688a643fc5365e38129f86d5e2517feb81b2cd2b8dc4f7821bfd032edc4c0234085d9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0482f37604f66664c2883dba6d98397c281045cbf59f1d16dddb1381126a246553a8b4d2aaea48ad9185a1645f65567d318a4d7b19f1d2e4434c9a8ecad396304abc82221bbab0679935071c72fd975e7b021c04b1d16ea36fc2d051ef5a8e117c",
+        "wx" : "082f37604f66664c2883dba6d98397c281045cbf59f1d16dddb1381126a246553a8b4d2aaea48ad9185a1645f65567d31",
+        "wy" : "08a4d7b19f1d2e4434c9a8ecad396304abc82221bbab0679935071c72fd975e7b021c04b1d16ea36fc2d051ef5a8e117c"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000482f37604f66664c2883dba6d98397c281045cbf59f1d16dddb1381126a246553a8b4d2aaea48ad9185a1645f65567d318a4d7b19f1d2e4434c9a8ecad396304abc82221bbab0679935071c72fd975e7b021c04b1d16ea36fc2d051ef5a8e117c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEgvN2BPZmZMKIPbptmDl8KBBFy/WfHRbd\n2xOBEmokZVOotNKq6kitkYWhZF9lVn0xik17GfHS5ENMmo7K05YwSryCIhu6sGeZ\nNQcccv2XXnsCHASx0W6jb8LQUe9ajhF8\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 336,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02310083276c0793f0a19742422f8af671ccf965fa7d18d541bef4c05b90e303f891d39008439e0fda4bfad5ee9a6ace7e340c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f052dfc27bf8a6d36f3739f239b981f5b53fe08d999ec683b01e43e7596156206ba08b8b9f59229e2fbdce05f1e40f9990f0fdfb7029f9b3e8c6144dad0339208b7cdcb3820a554259db9d27afdd18f4a750296c59bad6b62df076f90d53be0d",
+        "wx" : "0f052dfc27bf8a6d36f3739f239b981f5b53fe08d999ec683b01e43e7596156206ba08b8b9f59229e2fbdce05f1e40f99",
+        "wy" : "090f0fdfb7029f9b3e8c6144dad0339208b7cdcb3820a554259db9d27afdd18f4a750296c59bad6b62df076f90d53be0d"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004f052dfc27bf8a6d36f3739f239b981f5b53fe08d999ec683b01e43e7596156206ba08b8b9f59229e2fbdce05f1e40f9990f0fdfb7029f9b3e8c6144dad0339208b7cdcb3820a554259db9d27afdd18f4a750296c59bad6b62df076f90d53be0d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE8FLfwnv4ptNvNznyObmB9bU/4I2ZnsaD\nsB5D51lhViBroIuLn1kini+9zgXx5A+ZkPD9+3Ap+bPoxhRNrQM5IIt83LOCClVC\nWdudJ6/dGPSnUClsWbrWti3wdvkNU74N\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 337,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100942848586b534105ddd1ca77df72e1251140f412e97b62afbf85d4822309176b5965453dee3fab709e14156b3dfcecca",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f877bd6e2a9273e322a3298ea3add13d1104b32172283669ca6688f0cb591524a7f15dd41496681eda98939aae729fede85ca37c81ef19e3dc9ab16908a3720d86875a51a6a6d932e37492a6ec7a344eabc482377f14891fbd1da7faeffa1178",
+        "wx" : "0f877bd6e2a9273e322a3298ea3add13d1104b32172283669ca6688f0cb591524a7f15dd41496681eda98939aae729fed",
+        "wy" : "0e85ca37c81ef19e3dc9ab16908a3720d86875a51a6a6d932e37492a6ec7a344eabc482377f14891fbd1da7faeffa1178"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004f877bd6e2a9273e322a3298ea3add13d1104b32172283669ca6688f0cb591524a7f15dd41496681eda98939aae729fede85ca37c81ef19e3dc9ab16908a3720d86875a51a6a6d932e37492a6ec7a344eabc482377f14891fbd1da7faeffa1178",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE+He9biqSc+MioymOo63RPREEsyFyKDZp\nymaI8MtZFSSn8V3UFJZoHtqYk5qucp/t6FyjfIHvGePcmrFpCKNyDYaHWlGmptky\n43SSpux6NE6rxII3fxSJH70dp/rv+hF4\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 338,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02307fffffffffffffffffffffffffffffffffffffffffffffffed2119d5fc12649fc808af3b6d9037d3a44eb32399970dd0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0414249bbcfeeceab06c75654d361c0df8d56b320ea3bc1d4627ec0a2f4b8fa3577445694664f569a91f480741381e494a28479f2186d715a56788f67073056aa0cb0b6a7f7893e77b9a6976ef6663d80226896d7f43bb502e1b4d49558a27dd8b",
+        "wx" : "14249bbcfeeceab06c75654d361c0df8d56b320ea3bc1d4627ec0a2f4b8fa3577445694664f569a91f480741381e494a",
+        "wy" : "28479f2186d715a56788f67073056aa0cb0b6a7f7893e77b9a6976ef6663d80226896d7f43bb502e1b4d49558a27dd8b"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000414249bbcfeeceab06c75654d361c0df8d56b320ea3bc1d4627ec0a2f4b8fa3577445694664f569a91f480741381e494a28479f2186d715a56788f67073056aa0cb0b6a7f7893e77b9a6976ef6663d80226896d7f43bb502e1b4d49558a27dd8b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEFCSbvP7s6rBsdWVNNhwN+NVrMg6jvB1G\nJ+wKL0uPo1d0RWlGZPVpqR9IB0E4HklKKEefIYbXFaVniPZwcwVqoMsLan94k+d7\nmml272Zj2AImiW1/Q7tQLhtNSVWKJ92L\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 339,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023079b95c013b0472de04d8faeec3b779c39fe729ea84fb554cd091c7178c2f054eabbc62c3e1cfbac2c2e69d7aa45d9072",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0450a438c98ee94025ce13e27d36b8280d4843585836eb47011a070cd77729245684a0db31fde980620349c796832b2c6cbdb72dba9f3f9cc878559f50b6bd1290f10a6bccbc1eeef7708b1b72059022987979e35221c51259f337c7288a2f86bc",
+        "wx" : "50a438c98ee94025ce13e27d36b8280d4843585836eb47011a070cd77729245684a0db31fde980620349c796832b2c6c",
+        "wy" : "0bdb72dba9f3f9cc878559f50b6bd1290f10a6bccbc1eeef7708b1b72059022987979e35221c51259f337c7288a2f86bc"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000450a438c98ee94025ce13e27d36b8280d4843585836eb47011a070cd77729245684a0db31fde980620349c796832b2c6cbdb72dba9f3f9cc878559f50b6bd1290f10a6bccbc1eeef7708b1b72059022987979e35221c51259f337c7288a2f86bc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEUKQ4yY7pQCXOE+J9NrgoDUhDWFg260cB\nGgcM13cpJFaEoNsx/emAYgNJx5aDKyxsvbctup8/nMh4VZ9Qtr0SkPEKa8y8Hu73\ncIsbcgWQIph5eeNSIcUSWfM3xyiKL4a8\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 340,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100bfd40d0caa4d9d42381f3d72a25683f52b03a1ed96fb72d03f08dcb9a8bc8f23c1a459deab03bcd39396c0d1e9053c81",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044d3fc5dcfaf741113cda3ce2f8dff4c912143e4d36314c361d7ed5656b68448bcca114ba9e8124281234660b7726ddcd680ddfef7ea07bfbcede10803d38d7211631ca11466078819eb66e11921ab7ffa3c4560c732e77595fd408e917dd9afc",
+        "wx" : "4d3fc5dcfaf741113cda3ce2f8dff4c912143e4d36314c361d7ed5656b68448bcca114ba9e8124281234660b7726ddcd",
+        "wy" : "680ddfef7ea07bfbcede10803d38d7211631ca11466078819eb66e11921ab7ffa3c4560c732e77595fd408e917dd9afc"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200044d3fc5dcfaf741113cda3ce2f8dff4c912143e4d36314c361d7ed5656b68448bcca114ba9e8124281234660b7726ddcd680ddfef7ea07bfbcede10803d38d7211631ca11466078819eb66e11921ab7ffa3c4560c732e77595fd408e917dd9afc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETT/F3Pr3QRE82jzi+N/0yRIUPk02MUw2\nHX7VZWtoRIvMoRS6noEkKBI0Zgt3Jt3NaA3f736ge/vO3hCAPTjXIRYxyhFGYHiB\nnrZuEZIat/+jxFYMcy53WV/UCOkX3Zr8\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 341,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02304c7d219db9af94ce7fffffffffffffffffffffffffffffffef15cf1058c8d8ba1e634c4122db95ec1facd4bb13ebf09a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0463d65cdfeb1f1a42000f43bd1ddd130537a7b6f635e8d2bd81a97da168221183da433ca78429fd2b33c5f94895a9c13aa9d1d5ea328725653a5a9d00f85a5516236f3b1428a8629287d3b0487a2e82dd57f93bb2aa3d9783dc74131e13756034",
+        "wx" : "63d65cdfeb1f1a42000f43bd1ddd130537a7b6f635e8d2bd81a97da168221183da433ca78429fd2b33c5f94895a9c13a",
+        "wy" : "0a9d1d5ea328725653a5a9d00f85a5516236f3b1428a8629287d3b0487a2e82dd57f93bb2aa3d9783dc74131e13756034"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000463d65cdfeb1f1a42000f43bd1ddd130537a7b6f635e8d2bd81a97da168221183da433ca78429fd2b33c5f94895a9c13aa9d1d5ea328725653a5a9d00f85a5516236f3b1428a8629287d3b0487a2e82dd57f93bb2aa3d9783dc74131e13756034",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEY9Zc3+sfGkIAD0O9Hd0TBTentvY16NK9\ngal9oWgiEYPaQzynhCn9KzPF+UiVqcE6qdHV6jKHJWU6Wp0A+FpVFiNvOxQoqGKS\nh9OwSHougt1X+Tuyqj2Xg9x0Ex4TdWA0\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 342,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100d219db9af94ce7ffffffffffffffffffffffffffffffffffd189bdb6d9ef7be8504ca374756ea5b8f15e44067d209b9b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d22c9c348b9745711f57debac3a07df90a527c06bd02a8454f41437d54224e071698f03fdc64b1d652414edc3f2239c49ae9812a4b92f099d6659a659691768d57e530ed3c91d5455781605850997a58221f22a2451c3932470606c23f3ab1b8",
+        "wx" : "0d22c9c348b9745711f57debac3a07df90a527c06bd02a8454f41437d54224e071698f03fdc64b1d652414edc3f2239c4",
+        "wy" : "09ae9812a4b92f099d6659a659691768d57e530ed3c91d5455781605850997a58221f22a2451c3932470606c23f3ab1b8"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004d22c9c348b9745711f57debac3a07df90a527c06bd02a8454f41437d54224e071698f03fdc64b1d652414edc3f2239c49ae9812a4b92f099d6659a659691768d57e530ed3c91d5455781605850997a58221f22a2451c3932470606c23f3ab1b8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE0iycNIuXRXEfV966w6B9+QpSfAa9AqhF\nT0FDfVQiTgcWmPA/3GSx1lJBTtw/IjnEmumBKkuS8JnWZZpllpF2jVflMO08kdVF\nV4FgWFCZelgiHyKiRRw5MkcGBsI/OrG4\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 343,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100a433b735f299cfffffffffffffffffffffffffffffffffffdbb02debbfa7c9f1487f3936a22ca3f6f5d06ea22d7c0dc3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0431f05c0c29e9da49aa2fbbedee770c68d10f85e7f77e72ac3cfa9c8623a2bb42eeb2f24ac8f2aef7ab0c4b47823140035bb32fc1ec04bbff5eab96e070c938ba1b53fe63970f649ae02e2a4ada420a249b6f7c525e2c4b9b0d5562ae26f2278c",
+        "wx" : "31f05c0c29e9da49aa2fbbedee770c68d10f85e7f77e72ac3cfa9c8623a2bb42eeb2f24ac8f2aef7ab0c4b4782314003",
+        "wy" : "5bb32fc1ec04bbff5eab96e070c938ba1b53fe63970f649ae02e2a4ada420a249b6f7c525e2c4b9b0d5562ae26f2278c"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000431f05c0c29e9da49aa2fbbedee770c68d10f85e7f77e72ac3cfa9c8623a2bb42eeb2f24ac8f2aef7ab0c4b47823140035bb32fc1ec04bbff5eab96e070c938ba1b53fe63970f649ae02e2a4ada420a249b6f7c525e2c4b9b0d5562ae26f2278c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEMfBcDCnp2kmqL7vt7ncMaNEPhef3fnKs\nPPqchiOiu0LusvJKyPKu96sMS0eCMUADW7MvwewEu/9eq5bgcMk4uhtT/mOXD2Sa\n4C4qStpCCiSbb3xSXixLmw1VYq4m8ieM\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 344,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100b9af94ce7fffffffffffffffffffffffffffffffffffffffd6efeefc876c9f23217b443c80637ef939e911219f96c179",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bc26eec95e26c980bc0334264cbcfc26b897c3571c96ce9ab2a67b49bb0f26a6272fdc27806d7a4c572ae0f78149f1f3c8af5f41b99d2066018165513fb3b55e4255dcd0659647ed55e1e2602cae4efbd6eae1dfe2ff63e2c748d4acc7430139",
+        "wx" : "0bc26eec95e26c980bc0334264cbcfc26b897c3571c96ce9ab2a67b49bb0f26a6272fdc27806d7a4c572ae0f78149f1f3",
+        "wy" : "0c8af5f41b99d2066018165513fb3b55e4255dcd0659647ed55e1e2602cae4efbd6eae1dfe2ff63e2c748d4acc7430139"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004bc26eec95e26c980bc0334264cbcfc26b897c3571c96ce9ab2a67b49bb0f26a6272fdc27806d7a4c572ae0f78149f1f3c8af5f41b99d2066018165513fb3b55e4255dcd0659647ed55e1e2602cae4efbd6eae1dfe2ff63e2c748d4acc7430139",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEvCbuyV4myYC8AzQmTLz8JriXw1ccls6a\nsqZ7SbsPJqYnL9wngG16TFcq4PeBSfHzyK9fQbmdIGYBgWVRP7O1XkJV3NBllkft\nVeHiYCyuTvvW6uHf4v9j4sdI1KzHQwE5\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 345,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100a276276276276276276276276276276276276276276276273d7228d4f84b769be0fd57b97e4c1ebcae9a5f635e80e9df",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046fa0964dd054250af176891c0c822b013b70f059c347172cafc6b36cd16cf3b0f9d19f2598bd0d580ac16c46acb167d4375bef701c002dcc040fd54824b14cc2df0154eb20e74464e1fe7b833426dd7d636bf2d79603fdde5ddaab23ab0cf426",
+        "wx" : "6fa0964dd054250af176891c0c822b013b70f059c347172cafc6b36cd16cf3b0f9d19f2598bd0d580ac16c46acb167d4",
+        "wy" : "375bef701c002dcc040fd54824b14cc2df0154eb20e74464e1fe7b833426dd7d636bf2d79603fdde5ddaab23ab0cf426"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200046fa0964dd054250af176891c0c822b013b70f059c347172cafc6b36cd16cf3b0f9d19f2598bd0d580ac16c46acb167d4375bef701c002dcc040fd54824b14cc2df0154eb20e74464e1fe7b833426dd7d636bf2d79603fdde5ddaab23ab0cf426",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEb6CWTdBUJQrxdokcDIIrATtw8FnDRxcs\nr8azbNFs87D50Z8lmL0NWArBbEassWfUN1vvcBwALcwED9VIJLFMwt8BVOsg50Rk\n4f57gzQm3X1ja/LXlgP93l3aqyOrDPQm\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 346,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023073333333333333333333333333333333333333333333333316e4d9f42d4eca22df403a0c578b86f0a9a93fe89995c7ed",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04baa4e712ee0786a5ab0e5a5dafdcdcf87b38830ab2ec86faedda9fdf65332f6a9688269412f050356530d4664a7fb8cdecc46a901b016e6bb8a336ad9aa6f19abf9ada69705d1c905beafb95a44f52af43de4bf80c050cf996b7796dfcee8e1b",
+        "wx" : "0baa4e712ee0786a5ab0e5a5dafdcdcf87b38830ab2ec86faedda9fdf65332f6a9688269412f050356530d4664a7fb8cd",
+        "wy" : "0ecc46a901b016e6bb8a336ad9aa6f19abf9ada69705d1c905beafb95a44f52af43de4bf80c050cf996b7796dfcee8e1b"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004baa4e712ee0786a5ab0e5a5dafdcdcf87b38830ab2ec86faedda9fdf65332f6a9688269412f050356530d4664a7fb8cdecc46a901b016e6bb8a336ad9aa6f19abf9ada69705d1c905beafb95a44f52af43de4bf80c050cf996b7796dfcee8e1b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEuqTnEu4HhqWrDlpdr9zc+Hs4gwqy7Ib6\n7dqf32UzL2qWiCaUEvBQNWUw1GZKf7jN7MRqkBsBbmu4ozatmqbxmr+a2mlwXRyQ\nW+r7laRPUq9D3kv4DAUM+Za3eW387o4b\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 347,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02307fffffffffffffffffffffffffffffffffffffffffffffffda4233abf824c93f90115e76db206fa7489d6647332e1ba3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0481e78a52ae0695583f7a601ab9b6fbfaf434f2befa1f8c833d59deb627a927c2f42d48eb617fe042f584e105c23c2317cf22d565f5f3b425ef7937df629b6864dac71264b288c1a987210f523071319ce3f64411910ac23765c4266e615112bc",
+        "wx" : "081e78a52ae0695583f7a601ab9b6fbfaf434f2befa1f8c833d59deb627a927c2f42d48eb617fe042f584e105c23c2317",
+        "wy" : "0cf22d565f5f3b425ef7937df629b6864dac71264b288c1a987210f523071319ce3f64411910ac23765c4266e615112bc"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000481e78a52ae0695583f7a601ab9b6fbfaf434f2befa1f8c833d59deb627a927c2f42d48eb617fe042f584e105c23c2317cf22d565f5f3b425ef7937df629b6864dac71264b288c1a987210f523071319ce3f64411910ac23765c4266e615112bc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEgeeKUq4GlVg/emAaubb7+vQ08r76H4yD\nPVnetiepJ8L0LUjrYX/gQvWE4QXCPCMXzyLVZfXztCXveTffYptoZNrHEmSyiMGp\nhyEPUjBxMZzj9kQRkQrCN2XEJm5hURK8\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 348,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02303fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294bb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0441fa8765b19d3108031e28c9a781a385c9c10b2bfd42e6437e5c4bd711cf2a031750847d17a82f9376a30ae182a6d6e71c20af96324147d4155a4d0c867ca8e36eba204fbed2087e0fcbdc8baabe07bb3123f9f7259e771cd9f1ad17d1a23787",
+        "wx" : "41fa8765b19d3108031e28c9a781a385c9c10b2bfd42e6437e5c4bd711cf2a031750847d17a82f9376a30ae182a6d6e7",
+        "wy" : "1c20af96324147d4155a4d0c867ca8e36eba204fbed2087e0fcbdc8baabe07bb3123f9f7259e771cd9f1ad17d1a23787"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000441fa8765b19d3108031e28c9a781a385c9c10b2bfd42e6437e5c4bd711cf2a031750847d17a82f9376a30ae182a6d6e71c20af96324147d4155a4d0c867ca8e36eba204fbed2087e0fcbdc8baabe07bb3123f9f7259e771cd9f1ad17d1a23787",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEQfqHZbGdMQgDHijJp4GjhcnBCyv9QuZD\nflxL1xHPKgMXUIR9F6gvk3ajCuGCptbnHCCvljJBR9QVWk0Mhnyo4266IE++0gh+\nD8vci6q+B7sxI/n3JZ53HNnxrRfRojeH\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 349,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100dfea06865526cea11c0f9eb9512b41fa9581d0f6cb7db9680336151dce79de818cdf33c879da322740416d1e5ae532fa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e585a067d6dff37ae7f17f81583119b61291597345f107acffe237a08f4886d4fdf94fe63182e6143c99be25a7b7d86b572c1e06dd2c7b94b873f0578fcb2b99d60e246e51245d0804edd44b32f0f000c8f8f88f1d4a65fea51dbbb4ab1e2823",
+        "wx" : "0e585a067d6dff37ae7f17f81583119b61291597345f107acffe237a08f4886d4fdf94fe63182e6143c99be25a7b7d86b",
+        "wy" : "572c1e06dd2c7b94b873f0578fcb2b99d60e246e51245d0804edd44b32f0f000c8f8f88f1d4a65fea51dbbb4ab1e2823"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004e585a067d6dff37ae7f17f81583119b61291597345f107acffe237a08f4886d4fdf94fe63182e6143c99be25a7b7d86b572c1e06dd2c7b94b873f0578fcb2b99d60e246e51245d0804edd44b32f0f000c8f8f88f1d4a65fea51dbbb4ab1e2823",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE5YWgZ9bf83rn8X+BWDEZthKRWXNF8Qes\n/+I3oI9IhtT9+U/mMYLmFDyZviWnt9hrVyweBt0se5S4c/BXj8srmdYOJG5RJF0I\nBO3USzLw8ADI+PiPHUpl/qUdu7SrHigj\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 350,
+          "comment" : "point duplication during verification",
+          "msg" : "313233343030",
+          "sig" : "3065023100b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60023064adb4d51a93f96bed4665de2d4e1169cc95819ec6e9333edfd5c07ca134ceef7c95957b719ae349fc439eaa49fbbe34",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e585a067d6dff37ae7f17f81583119b61291597345f107acffe237a08f4886d4fdf94fe63182e6143c99be25a7b7d86ba8d3e1f922d3846b478c0fa87034d46629f1db91aedba2f7fb122bb4cd0f0ffe3707076fe2b59a015ae2444c54e1d7dc",
+        "wx" : "0e585a067d6dff37ae7f17f81583119b61291597345f107acffe237a08f4886d4fdf94fe63182e6143c99be25a7b7d86b",
+        "wy" : "0a8d3e1f922d3846b478c0fa87034d46629f1db91aedba2f7fb122bb4cd0f0ffe3707076fe2b59a015ae2444c54e1d7dc"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004e585a067d6dff37ae7f17f81583119b61291597345f107acffe237a08f4886d4fdf94fe63182e6143c99be25a7b7d86ba8d3e1f922d3846b478c0fa87034d46629f1db91aedba2f7fb122bb4cd0f0ffe3707076fe2b59a015ae2444c54e1d7dc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE5YWgZ9bf83rn8X+BWDEZthKRWXNF8Qes\n/+I3oI9IhtT9+U/mMYLmFDyZviWnt9hrqNPh+SLThGtHjA+ocDTUZinx25Gu26L3\n+xIrtM0PD/43Bwdv4rWaAVriRExU4dfc\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 351,
+          "comment" : "duplication bug",
+          "msg" : "313233343030",
+          "sig" : "3065023100b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60023064adb4d51a93f96bed4665de2d4e1169cc95819ec6e9333edfd5c07ca134ceef7c95957b719ae349fc439eaa49fbbe34",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b4d78cccbced8065c0ebdc330b4670ec99309273e442b9be341196c1043e4441fc57b914085595bfc755c64fc409f0ba01fee31cbbbaed5c1323f09c87df9b0712c12e99733fa23ef91b4e6ca666b09dd7540ebf1068a15155bc069e3d595c8c",
+        "wx" : "0b4d78cccbced8065c0ebdc330b4670ec99309273e442b9be341196c1043e4441fc57b914085595bfc755c64fc409f0ba",
+        "wy" : "1fee31cbbbaed5c1323f09c87df9b0712c12e99733fa23ef91b4e6ca666b09dd7540ebf1068a15155bc069e3d595c8c"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004b4d78cccbced8065c0ebdc330b4670ec99309273e442b9be341196c1043e4441fc57b914085595bfc755c64fc409f0ba01fee31cbbbaed5c1323f09c87df9b0712c12e99733fa23ef91b4e6ca666b09dd7540ebf1068a15155bc069e3d595c8c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEtNeMzLztgGXA69wzC0Zw7JkwknPkQrm+\nNBGWwQQ+REH8V7kUCFWVv8dVxk/ECfC6Af7jHLu67VwTI/Cch9+bBxLBLplzP6I+\n+RtObKZmsJ3XVA6/EGihUVW8Bp49WVyM\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 352,
+          "comment" : "point with x-coordinate 0",
+          "msg" : "313233343030",
+          "sig" : "3035020101023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046e3c68be53aade81ef89e096d841e2845a23331e7ec8a6a839d58d07fa016c0973ed75de4f99177bfdc74db566e9d15a4972ea08e577ce1f61c13a6ca1bad1deef2982ee01a2826f002b769f2c46098d3baff068a405d09ca3840d2fafe4e46e",
+        "wx" : "6e3c68be53aade81ef89e096d841e2845a23331e7ec8a6a839d58d07fa016c0973ed75de4f99177bfdc74db566e9d15a",
+        "wy" : "4972ea08e577ce1f61c13a6ca1bad1deef2982ee01a2826f002b769f2c46098d3baff068a405d09ca3840d2fafe4e46e"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200046e3c68be53aade81ef89e096d841e2845a23331e7ec8a6a839d58d07fa016c0973ed75de4f99177bfdc74db566e9d15a4972ea08e577ce1f61c13a6ca1bad1deef2982ee01a2826f002b769f2c46098d3baff068a405d09ca3840d2fafe4e46e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEbjxovlOq3oHvieCW2EHihFojMx5+yKao\nOdWNB/oBbAlz7XXeT5kXe/3HTbVm6dFaSXLqCOV3zh9hwTpsobrR3u8pgu4BooJv\nACt2nyxGCY07r/BopAXQnKOEDS+v5ORu\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 353,
+          "comment" : "point with x-coordinate 0",
+          "msg" : "313233343030",
+          "sig" : "3065023101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023033333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b101cdb3eba20e112adbb4bbd2cb479a69e590a44ea902631832abfab8af2c3041b3df7f1665b2c6eb533f546217100a1a61aa9951578ad4f00ae17339a8a6f1359bbd0ac355678ed4df21338f08763c1d3702ec132b634c7bcc0118efb1d0dd",
+        "wx" : "0b101cdb3eba20e112adbb4bbd2cb479a69e590a44ea902631832abfab8af2c3041b3df7f1665b2c6eb533f546217100a",
+        "wy" : "1a61aa9951578ad4f00ae17339a8a6f1359bbd0ac355678ed4df21338f08763c1d3702ec132b634c7bcc0118efb1d0dd"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004b101cdb3eba20e112adbb4bbd2cb479a69e590a44ea902631832abfab8af2c3041b3df7f1665b2c6eb533f546217100a1a61aa9951578ad4f00ae17339a8a6f1359bbd0ac355678ed4df21338f08763c1d3702ec132b634c7bcc0118efb1d0dd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEsQHNs+uiDhEq27S70stHmmnlkKROqQJj\nGDKr+rivLDBBs99/FmWyxutTP1RiFxAKGmGqmVFXitTwCuFzOaim8TWbvQrDVWeO\n1N8hM48IdjwdNwLsEytjTHvMARjvsdDd\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 354,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "313233343030",
+          "sig" : "3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023033333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046761044a040a4979db269b4a377e42f11b4be0ce24611f677674dcf770f5887ca4db565303283809e6d65f7fc6bc273605c7daa403fca53549f75ff3372909642d02b7fdcac1e68242814d6e925ab01a80836cfbb35581960079e2fb44c0d186",
+        "wx" : "6761044a040a4979db269b4a377e42f11b4be0ce24611f677674dcf770f5887ca4db565303283809e6d65f7fc6bc2736",
+        "wy" : "5c7daa403fca53549f75ff3372909642d02b7fdcac1e68242814d6e925ab01a80836cfbb35581960079e2fb44c0d186"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200046761044a040a4979db269b4a377e42f11b4be0ce24611f677674dcf770f5887ca4db565303283809e6d65f7fc6bc273605c7daa403fca53549f75ff3372909642d02b7fdcac1e68242814d6e925ab01a80836cfbb35581960079e2fb44c0d186",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEZ2EESgQKSXnbJptKN35C8RtL4M4kYR9n\ndnTc93D1iHyk21ZTAyg4CebWX3/GvCc2BcfapAP8pTVJ91/zNykJZC0Ct/3KweaC\nQoFNbpJasBqAg2z7s1WBlgB54vtEwNGG\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 355,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "3064023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046922c591502f01046fee5617bf16496f58398822e69afa8335308f36c09a8ed437209fefcffbbdf0a4876b35a3c7ab2655854db825b94b3f27e5f892d3bbb6c7240ec922894dd3598e91fcc6134a2b8fd154e1790466906206f0f623416e63a1",
+        "wx" : "6922c591502f01046fee5617bf16496f58398822e69afa8335308f36c09a8ed437209fefcffbbdf0a4876b35a3c7ab26",
+        "wy" : "55854db825b94b3f27e5f892d3bbb6c7240ec922894dd3598e91fcc6134a2b8fd154e1790466906206f0f623416e63a1"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200046922c591502f01046fee5617bf16496f58398822e69afa8335308f36c09a8ed437209fefcffbbdf0a4876b35a3c7ab2655854db825b94b3f27e5f892d3bbb6c7240ec922894dd3598e91fcc6134a2b8fd154e1790466906206f0f623416e63a1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEaSLFkVAvAQRv7lYXvxZJb1g5iCLmmvqD\nNTCPNsCajtQ3IJ/vz/u98KSHazWjx6smVYVNuCW5Sz8n5fiS07u2xyQOySKJTdNZ\njpH8xhNKK4/RVOF5BGaQYgbw9iNBbmOh\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 356,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3064023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df6102302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04892dac0e700fc29d1802d9a449a6f56b2172cb1b7d881013cd3b31c0edb052f2d340c8995a4477bcb9225fec15667233cc6c34ae17445444516fd8fd22ee83f79eb0771ebff6677ac5d4e089f87a1c72df957acb24492adcd7c3816b8e0c75b1",
+        "wx" : "0892dac0e700fc29d1802d9a449a6f56b2172cb1b7d881013cd3b31c0edb052f2d340c8995a4477bcb9225fec15667233",
+        "wy" : "0cc6c34ae17445444516fd8fd22ee83f79eb0771ebff6677ac5d4e089f87a1c72df957acb24492adcd7c3816b8e0c75b1"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004892dac0e700fc29d1802d9a449a6f56b2172cb1b7d881013cd3b31c0edb052f2d340c8995a4477bcb9225fec15667233cc6c34ae17445444516fd8fd22ee83f79eb0771ebff6677ac5d4e089f87a1c72df957acb24492adcd7c3816b8e0c75b1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEiS2sDnAPwp0YAtmkSab1ayFyyxt9iBAT\nzTsxwO2wUvLTQMiZWkR3vLkiX+wVZnIzzGw0rhdEVERRb9j9Iu6D956wdx6/9md6\nxdTgifh6HHLflXrLJEkq3NfDgWuODHWx\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 357,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3064023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df6102306666666666666666666666666666666666666666666666664fc15233fb49458c89a4057a8379dc9791f80a2ab84edd61",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401634117e6478ce0568b0a2469237bbac6ff096acb7e514072bf77123cb51ba0cc3e8d69284d534d8e6d1e876cecf22231e5ef04dc96762ce7d5ef3348ad1e241ac797ae3b630ea249afc5139af49b8ef68b32f812d6b514210363d498efc28c",
+        "wx" : "1634117e6478ce0568b0a2469237bbac6ff096acb7e514072bf77123cb51ba0cc3e8d69284d534d8e6d1e876cecf222",
+        "wy" : "31e5ef04dc96762ce7d5ef3348ad1e241ac797ae3b630ea249afc5139af49b8ef68b32f812d6b514210363d498efc28c"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000401634117e6478ce0568b0a2469237bbac6ff096acb7e514072bf77123cb51ba0cc3e8d69284d534d8e6d1e876cecf22231e5ef04dc96762ce7d5ef3348ad1e241ac797ae3b630ea249afc5139af49b8ef68b32f812d6b514210363d498efc28c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEAWNBF+ZHjOBWiwokaSN7usb/CWrLflFA\ncr93Ejy1G6DMPo1pKE1TTY5tHods7PIiMeXvBNyWdizn1e8zSK0eJBrHl647Yw6i\nSa/FE5r0m472izL4Eta1FCEDY9SY78KM\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 358,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3065023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df6102310099999999999999999999999999999999999999999999999977a1fb4df8ede852ce760837c536cae35af40f4014764c12",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04675bdc79d8243887fe1b305d12ac10d2e9c0bde070a6e3394cd5f6adfbceda75498b0e7a794c7212f42be93f616744563e96d1bf6f95cdbefa774911ba06463d8a90a0c9d73c9699b061d779dc52496e8ee9b9ae9c5d4d90e89cd1157d811895",
+        "wx" : "675bdc79d8243887fe1b305d12ac10d2e9c0bde070a6e3394cd5f6adfbceda75498b0e7a794c7212f42be93f61674456",
+        "wy" : "3e96d1bf6f95cdbefa774911ba06463d8a90a0c9d73c9699b061d779dc52496e8ee9b9ae9c5d4d90e89cd1157d811895"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004675bdc79d8243887fe1b305d12ac10d2e9c0bde070a6e3394cd5f6adfbceda75498b0e7a794c7212f42be93f616744563e96d1bf6f95cdbefa774911ba06463d8a90a0c9d73c9699b061d779dc52496e8ee9b9ae9c5d4d90e89cd1157d811895",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEZ1vcedgkOIf+GzBdEqwQ0unAveBwpuM5\nTNX2rfvO2nVJiw56eUxyEvQr6T9hZ0RWPpbRv2+Vzb76d0kRugZGPYqQoMnXPJaZ\nsGHXedxSSW6O6bmunF1NkOic0RV9gRiV\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 359,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3065023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61023100db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6aae76701acc1950894a89e068772d8b281eef136f8a8fef5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040fd1aab89f47b565b8160dfcc433b6408adeb1473c036b26b7ddec714fb4d0e7dd756c88469e86e218813ead8e8e7676f1cc955c4139e0071c0079ec1d77164e0569bdf453837e8b33c98535a0e7c9c61ef24762067bb46b6116ea7909a69b23",
+        "wx" : "0fd1aab89f47b565b8160dfcc433b6408adeb1473c036b26b7ddec714fb4d0e7dd756c88469e86e218813ead8e8e7676",
+        "wy" : "0f1cc955c4139e0071c0079ec1d77164e0569bdf453837e8b33c98535a0e7c9c61ef24762067bb46b6116ea7909a69b23"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200040fd1aab89f47b565b8160dfcc433b6408adeb1473c036b26b7ddec714fb4d0e7dd756c88469e86e218813ead8e8e7676f1cc955c4139e0071c0079ec1d77164e0569bdf453837e8b33c98535a0e7c9c61ef24762067bb46b6116ea7909a69b23",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAED9GquJ9HtWW4Fg38xDO2QIresUc8A2sm\nt93scU+00OfddWyIRp6G4hiBPq2OjnZ28cyVXEE54AccAHnsHXcWTgVpvfRTg36L\nM8mFNaDnycYe8kdiBnu0a2EW6nkJppsj\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 360,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "3064023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df6102300eb10e5ab95f2f26a40700b1300fb8c3e754d5c453d9384ecce1daa38135a48a0a96c24efc2a76d00bde1d7aeedf7f6a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0434d74ec088bab6c6323968d1f468993812f690d6edca5b97604d718e12b8cdfdd96d42e57d33afe312f0ee3c3d0a13f786f4922bb2c13bdf7752a3ecb69393e997bd65461c46867ebeef6296b23f2c56df63acfde648f3f5002dbc239ffd1582",
+        "wx" : "34d74ec088bab6c6323968d1f468993812f690d6edca5b97604d718e12b8cdfdd96d42e57d33afe312f0ee3c3d0a13f7",
+        "wy" : "086f4922bb2c13bdf7752a3ecb69393e997bd65461c46867ebeef6296b23f2c56df63acfde648f3f5002dbc239ffd1582"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000434d74ec088bab6c6323968d1f468993812f690d6edca5b97604d718e12b8cdfdd96d42e57d33afe312f0ee3c3d0a13f786f4922bb2c13bdf7752a3ecb69393e997bd65461c46867ebeef6296b23f2c56df63acfde648f3f5002dbc239ffd1582",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAENNdOwIi6tsYyOWjR9GiZOBL2kNbtyluX\nYE1xjhK4zf3ZbULlfTOv4xLw7jw9ChP3hvSSK7LBO993UqPstpOT6Ze9ZUYcRoZ+\nvu9ilrI/LFbfY6z95kjz9QAtvCOf/RWC\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 361,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "3065023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044376c9893e9277296c766a83abbe36b34da7a631f8cbfd32a1888de0dd1455a21a153ea2d61cfa5071fc6be12a658f6b290ba1a8ee8c78b5dd58f9ffcacb22955682eea02429c3fa8cdcb649fa4d007c8693e3f8f3c0a5f3c4de7a51beaa9809",
+        "wx" : "4376c9893e9277296c766a83abbe36b34da7a631f8cbfd32a1888de0dd1455a21a153ea2d61cfa5071fc6be12a658f6b",
+        "wy" : "290ba1a8ee8c78b5dd58f9ffcacb22955682eea02429c3fa8cdcb649fa4d007c8693e3f8f3c0a5f3c4de7a51beaa9809"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200044376c9893e9277296c766a83abbe36b34da7a631f8cbfd32a1888de0dd1455a21a153ea2d61cfa5071fc6be12a658f6b290ba1a8ee8c78b5dd58f9ffcacb22955682eea02429c3fa8cdcb649fa4d007c8693e3f8f3c0a5f3c4de7a51beaa9809",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEQ3bJiT6SdylsdmqDq742s02npjH4y/0y\noYiN4N0UVaIaFT6i1hz6UHH8a+EqZY9rKQuhqO6MeLXdWPn/yssilVaC7qAkKcP6\njNy2SfpNAHyGk+P488Cl88TeelG+qpgJ\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 362,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3065023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab702302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0410878fc4807f6732a23c883e838e38c787f7088f94c1824b84673e8b9eab16de1544ae4bf2c6fe3fe4fb343b7487e2b43036ff439533d22f951dae966584bafb23b217dcad2f8f4e0e6999c0c4d0f076634be805f676fd2a59c27f9fe7c5d95b",
+        "wx" : "10878fc4807f6732a23c883e838e38c787f7088f94c1824b84673e8b9eab16de1544ae4bf2c6fe3fe4fb343b7487e2b4",
+        "wy" : "3036ff439533d22f951dae966584bafb23b217dcad2f8f4e0e6999c0c4d0f076634be805f676fd2a59c27f9fe7c5d95b"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000410878fc4807f6732a23c883e838e38c787f7088f94c1824b84673e8b9eab16de1544ae4bf2c6fe3fe4fb343b7487e2b43036ff439533d22f951dae966584bafb23b217dcad2f8f4e0e6999c0c4d0f076634be805f676fd2a59c27f9fe7c5d95b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEEIePxIB/ZzKiPIg+g444x4f3CI+UwYJL\nhGc+i56rFt4VRK5L8sb+P+T7NDt0h+K0MDb/Q5Uz0i+VHa6WZYS6+yOyF9ytL49O\nDmmZwMTQ8HZjS+gF9nb9KlnCf5/nxdlb\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 363,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3065023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab702306666666666666666666666666666666666666666666666664fc15233fb49458c89a4057a8379dc9791f80a2ab84edd61",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04036b253e3b4ac88bb8585a2b32b978766a931e5ad0d0e653a2e34b44d6ddcc0d386e20c4def2d8bb3f8da128c1eac69f9c8e3b5ff5dde2205af359b3974d52758d7abae812b8b275e1452c4e59cb62e9b6771d347dbd1dea761c70291cc5e0a6",
+        "wx" : "36b253e3b4ac88bb8585a2b32b978766a931e5ad0d0e653a2e34b44d6ddcc0d386e20c4def2d8bb3f8da128c1eac69f",
+        "wy" : "09c8e3b5ff5dde2205af359b3974d52758d7abae812b8b275e1452c4e59cb62e9b6771d347dbd1dea761c70291cc5e0a6"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004036b253e3b4ac88bb8585a2b32b978766a931e5ad0d0e653a2e34b44d6ddcc0d386e20c4def2d8bb3f8da128c1eac69f9c8e3b5ff5dde2205af359b3974d52758d7abae812b8b275e1452c4e59cb62e9b6771d347dbd1dea761c70291cc5e0a6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEA2slPjtKyIu4WForMrl4dmqTHlrQ0OZT\nouNLRNbdzA04biDE3vLYuz+NoSjB6safnI47X/Xd4iBa81mzl01SdY16uugSuLJ1\n4UUsTlnLYum2dx00fb0d6nYccCkcxeCm\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 364,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3066023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab702310099999999999999999999999999999999999999999999999977a1fb4df8ede852ce760837c536cae35af40f4014764c12",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042783c1be922fce155864ecb41d0a316e193a55843e80192f1fe556772f3debd04b9fc93c27bc6f353938886a404419941a352cec336946424fa3c208ea7105f5549edde8688abd305344bf4f66dda7eabcda6f8557c9af88109804d702e9670b",
+        "wx" : "2783c1be922fce155864ecb41d0a316e193a55843e80192f1fe556772f3debd04b9fc93c27bc6f353938886a40441994",
+        "wy" : "1a352cec336946424fa3c208ea7105f5549edde8688abd305344bf4f66dda7eabcda6f8557c9af88109804d702e9670b"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200042783c1be922fce155864ecb41d0a316e193a55843e80192f1fe556772f3debd04b9fc93c27bc6f353938886a404419941a352cec336946424fa3c208ea7105f5549edde8688abd305344bf4f66dda7eabcda6f8557c9af88109804d702e9670b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEJ4PBvpIvzhVYZOy0HQoxbhk6VYQ+gBkv\nH+VWdy8969BLn8k8J7xvNTk4iGpARBmUGjUs7DNpRkJPo8II6nEF9VSe3ehoir0w\nU0S/T2bdp+q82m+FV8mviBCYBNcC6WcL\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 365,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3066023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7023100db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6aae76701acc1950894a89e068772d8b281eef136f8a8fef5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fa92538cdc740368caf16480ff1304cebbbe59a46a7a84603726b9592d105be069df1c61b5974f27e7552f797de97cdb620e03a46da862e4b089bafbb80df8f055c8f47991b3a3ddb2b089aedb2f15841a6a5b5e14c1dc36b3c155c4f74d3409",
+        "wx" : "0fa92538cdc740368caf16480ff1304cebbbe59a46a7a84603726b9592d105be069df1c61b5974f27e7552f797de97cdb",
+        "wy" : "620e03a46da862e4b089bafbb80df8f055c8f47991b3a3ddb2b089aedb2f15841a6a5b5e14c1dc36b3c155c4f74d3409"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004fa92538cdc740368caf16480ff1304cebbbe59a46a7a84603726b9592d105be069df1c61b5974f27e7552f797de97cdb620e03a46da862e4b089bafbb80df8f055c8f47991b3a3ddb2b089aedb2f15841a6a5b5e14c1dc36b3c155c4f74d3409",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE+pJTjNx0A2jK8WSA/xMEzru+WaRqeoRg\nNya5WS0QW+Bp3xxhtZdPJ+dVL3l96XzbYg4DpG2oYuSwibr7uA348FXI9HmRs6Pd\nsrCJrtsvFYQaalteFMHcNrPBVcT3TTQJ\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 366,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "3065023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab702300eb10e5ab95f2f26a40700b1300fb8c3e754d5c453d9384ecce1daa38135a48a0a96c24efc2a76d00bde1d7aeedf7f6a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f",
+        "wx" : "0aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7",
+        "wy" : "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEqofKIr6LBTeOscce8yCtdG4dO2KLp5uY\nWfdB4IJUKjhVAvJdv1UpbDpUXjhydgq3NhfeSpYmLG9dnpi/kpLcKfj0Hb0omhR8\n6doxE7XwuMAKYLHOHX6BnXpDHXyQ6g5f\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 367,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3065023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace02302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 368,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "30640230064ed80f27e1432e84845f15ece399f2cbf4fa31aa837de9b953d44413b9f5c7c7f67989d703f07abef11b6ad0373ea502302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7c9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0",
+        "wx" : "0aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7",
+        "wy" : "0c9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7c9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEqofKIr6LBTeOscce8yCtdG4dO2KLp5uY\nWfdB4IJUKjhVAvJdv1UpbDpUXjhydgq3yeghtWnZ05CiYWdAbW0j1gcL4kLXZeuD\nFiXO7EoPRz71n04w4oF+YoW84oRvFfGg\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 369,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3065023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace02302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 370,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "30640230064ed80f27e1432e84845f15ece399f2cbf4fa31aa837de9b953d44413b9f5c7c7f67989d703f07abef11b6ad0373ea502302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0429bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc9a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3",
+        "wx" : "29bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc",
+        "wy" : "09a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000429bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc9a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEKb23bV+nQb/XAjPLOmbMfUS+s7BmPZKo\nE2ZQR4vO+2HvGC4VWlQ0Wl6OXojwZOW8mlJat/dk2tPa4UaMK0GfO2K5upF9XoxP\nsexHQEo/x2R0snEwgb6dtMAOBDran8Sj\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 371,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "3064023032401249714e9091f05a5e109d5c1216fdc05e98614261aa0dbd9e9cd4415dee29238afbd3b103c1e40ee5c9144aee0f02304326756fb2c4fd726360dd6479b5849478c7a9d054a833a58c1631c33b63c3441336ddf2c7fe0ed129aae6d4ddfeb753",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 372,
+          "comment" : "pseudorandom signature",
+          "msg" : "4d7367",
+          "sig" : "3066023100d7143a836608b25599a7f28dec6635494c2992ad1e2bbeecb7ef601a9c01746e710ce0d9c48accb38a79ede5b9638f3402310080f9e165e8c61035bf8aa7b5533960e46dd0e211c904a064edb6de41f797c0eae4e327612ee3f816f4157272bb4fabc9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 373,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "30650230234503fcca578121986d96be07fbc8da5d894ed8588c6dbcdbe974b4b813b21c52d20a8928f2e2fdac14705b0705498c023100cd7b9b766b97b53d1a80fc0b760af16a11bf4a59c7c367c6c7275dfb6e18a88091eed3734bf5cf41b3dc6fecd6d3baaf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 374,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "306502305cad9ae1565f2588f86d821c2cc1b4d0fdf874331326568f5b0e130e4e0c0ec497f8f5f564212bd2a26ecb782cf0a18d023100bf2e9d0980fbb00696673e7fbb03e1f854b9d7596b759a17bf6e6e67a95ea6c1664f82dc449ae5ea779abd99c78e6840",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aacacbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1",
+        "wx" : "0ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aac",
+        "wy" : "0acbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aacacbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE/////6pj8aI5rHAZfG6/zqV1bcASEj+C\nxR+odNZgKL4A6XahCAYGc3zHXEC9/kqsrL2FOJCIpipjmDhMIrUtSS8j9G5KJ6Ry\nStVVUdpcSDQ4CVokfLDDN48fUsNCX/nx\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 375,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3065023007648b6660d01ba2520a09d298adf3b1a02c32744bd2877208f5a4162f6c984373139d800a4cdc1ffea15bce4871a0ed02310099fd367012cb9e02cde2749455e0d495c52818f3c14f6e6aad105b0925e2a7290ac4a06d9fadf4b15b578556fe332a5f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 376,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3065023100a049dcd96c72e4f36144a51bba30417b451a305dd01c9e30a5e04df94342617dc383f17727708e3277cd7246ca44074102303970e264d85b228bf9e9b9c4947c5dd041ea8b5bde30b93aa59fedf2c428d3e2540a54e0530688acccb83ac7b29b79a2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 377,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30650230441800ea9377c27865be000ad008eb3d7502bdd105824b26d15cf3d06452969a9d0607a915a8fe989215fc4d61af6e05023100dce29faa5137f75ad77e03918c8ee6747cc7a39b0a69f8b915654cac4cf4bfd9c87cc46ae1631b5c6baebd4fc08ff8fd",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000",
+        "wx" : "0d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422",
+        "wy" : "0c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE0YJ/xvbxLyGZLFpAmgZTsSHS7wKysKsB\nqRYc6VYoB0Cx41ayVXAbCm3cnsLKipQixu1dLO2NirdWD6W7iMc450VBiD2KKxwO\nK6fjbQMPxNm/uLIvJNuJfrrEndQAAAAA\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 378,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "306402303244768016457c463b74f2097f216d9670b191f76281c74bc6a1a1971d19f209bf4696468f5eb75d6326a0a43c0a65290230501e0ad985ed9f95697bd17fdbe3f9ca92e0f76426d3664e6896648d9c750bf588d0ce7d011c1a1e8d6c2e082422dc93",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 379,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "306402305e1af40f2480e3d97c4ae4bfd34a9f45269241356f3a46becd86a4a7c9716d73ca5aebdb3db1a7765650666683bc856b02307e7c4b473a2baaa4953785be8aa2a10006f6d36b400ab981864d69cecec046718d0404b9647454b159aa5a92d76d7955",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 380,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "306502306688e36a26f15bdc1c3f91367f8a7667f7bb3e30a335d6f0900e9534eb88b260cb29344c723fedfbe7ac9c5a33f4bf0d023100aa35fddf0fdc9017860b378f801cd806f3e2d754cd2fd94eb7bb36a46ce828cef87e9ebbf447068e630b87fee385ad8f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557",
+        "wx" : "1099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000",
+        "wy" : "0e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200041099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEEJm7RRAPVfWoXMo94rO9XiUPT2+tZjGj\nFWwuUqM9fWFd0nn3n4tLr/fHE6wAAAAA5sm3NqiSny7Xvgx1OlTLtIuEaeBBHq+T\npKgkWboLaBu6j1+zg7SQbUkBozA+LxVX\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 381,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3065023100d4a8f3b0b4d3a5769e3a0bbc644b35f1d509355ed1fe401e170f667b661f693b32598e8c143a817a958982845042bb48023004cc07578bbd1981dbf6e8a97a354c98d41b8b6f6e8a2c2b1763c7c2a29d79e24f8476075c9aed9aec6c64dff50461ae",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 382,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3065023100c286d1928e9c79fdd3bebdf22a1dbd37c8105e8ecf41e9e3777fe341b6b8d5a89b9d986827d6d1dbb381cd8239484a220230201119ae305b9360aa9b5e5d1567e0674c09e4f025556ebf81b987466b0f421b8d31f72bbe95f3ce2aa9874a84edfd40",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 383,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3065023100d9c678550167f10c511e62acb4bd0a3f7f336bc090c94e6c6b02622439c348a2159c5f41f9b5aa4b470590d40dcd7cc202301fd5eaee295abb4081cb626745f4ad279ceb44604062830b58e6c0465c562d41f02ba588fc0db1ebbe339cdc008d7a1b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04000000002b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98",
+        "wx" : "2b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69",
+        "wy" : "0d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004000000002b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEAAAAACsInt11QWkBAUXyY/M0/BZ8wZ2u\ngiWXCuGcyMt+xzWT1qRlw3D1R4sOU51p0ZUdWXtWpnNFrLJYCVgfB80Ot42VOKP4\npl8wDmih63hQffdt5lDo+O5jpfDFaHyY\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 384,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3065023020fee7c71b6cb0d1da3641ec6622c055a3b16a1f596c64b34da1b2d0b868b66a8f0a0d0db983b3dc7e53bb7295da81970231008141a931d3579aec1cac9887d2fff9c6f12d47a27e4aab8cf262a9d14a715bca0b2057cbc3f18b6fd3d1df76f7410f16",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 385,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3065023100913eecc559b3cf7108a65d6cc3076bfdf36c6f94dcc6693d06690470f34a2e81564241e1de5f5f51421de30af467f10f0230649bd3717244e8ef3c6b0eda983f84dca5ea86d1bec15386b9c473ec43a8cd0ba558eee819f791d9ff9272b9afd59551",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 386,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3064023023855c46403a97b76cbb316ec3fe7e2c422b818387604bda8c3d91121b4f20179d9107c5f92dedc8b620d7db87fccccd023050f57343ab148e50662320c4161e44543c35bc992011ea5b1680b94382cf224ea0ec5da511e102f566cb67201f30a2ee",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b33600000000208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4",
+        "wx" : "0fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336",
+        "wy" : "208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b33600000000208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE+wG6rV8Lj3m5zRBNEqq5MQFGrdfWtMAi\n2HrmcRF4uU1hjKezrxOFSxxYiHnod7M2AAAAACCLP1rTs5N6zJ1gbMXs7KtKcB91\n7UKVfqTXhY0z9cJsauIKnMzaVplnANa0\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 387,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3066023100d200958d491fcebde667cd736c9dba0961c70db2ecaf573c31dd7fa41ecca32b40b5896f9a0ddf272110e3d21e84593a023100c2ecf73943b9adce596bac14fce62495ae93825c5ff6f61c247d1d8afcba52082fc96f63a26e55bccfc3779f88cfd799",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 388,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "306402306ac17d71260c79f81a7566124738cb3ee5d0aa690e73a98ae9e766f1336691e500cad51ba1302366c09cc06b8f7049e0023032ca965d6d7012ec187c7cab9544334d66c2a7658ddefa67e4ad40429815518ecc87b1492ddd57333bd2300b4660a835",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 389,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3065023100e19a4646f0ed8a271fe86ba533f8be4fd81bbf4674716f668efa89a40cac51eec2a6cfbd92327d25efe91ca4ff712bc502304a86b2e8e12378e633dec2691e3b1eed4e932cc48b28e45fa3d464cc0e948c02cc9decf2bb43b25937fcf37e9ad86ef0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b",
+        "wx" : "0fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336",
+        "wy" : "0ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE+wG6rV8Lj3m5zRBNEqq5MQFGrdfWtMAi\n2HrmcRF4uU1hjKezrxOFSxxYiHnod7M2/////990wKUsTGyFM2KfkzoTE1S1j+CK\nEr1qgVsoenHMCj2SlR31YzMlqWeY/ylL\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 390,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3064023015aac6c0f435cb662d110db5cf686caee53c64fe2d6d600a83ebe505a0e6fc62dc5705160477c47528c8c903fa865b5d02307f94ddc01a603f9bec5d10c9f2c89fb23b3ffab6b2b68d0f04336d499085e32d22bf3ab67a49a74c743f72473172b59f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 391,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "306602310090b95a7d194b73498fba5afc95c1aea9be073162a9edc57c4d12f459f0a1730baf2f87d7d6624aea7b931ec53370fe47023100cbc1ef470e666010604c609384b872db7fa7b8a5a9f20fdefd656be2fcc75db53948102f7ab203ea1860a6a32af246a1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 392,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3066023100dd4391ce7557cbd005e3d5d727cd264399dcc3c6501e4547505b6d57b40bbf0a7fac794dcc8d4233159dd0aa40d4e0b9023100a77fa1374fd60aa91600912200fc83c6aa447f8171ecea72ae322df32dccd68951dc5caf6c50380e400e45bf5c0e626b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdsa_secp384r1_sha512_test.json b/third_party/wycheproof/testvectors/ecdsa_secp384r1_sha512_test.json
new file mode 100644
index 0000000..ee2c2b8
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdsa_secp384r1_sha512_test.json
@@ -0,0 +1,4760 @@
+{
+  "algorithm" : "ECDSA",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "BER" : "This is a signature with correct values for (r, s) but using some alternative BER encoding instead of DER encoding. Implementations should not accept such signatures to limit signature malleability.",
+    "EdgeCase" : "Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA implementation does not check boundaries and computes s^(-1)==0.",
+    "MissingZero" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.",
+    "PointDuplication" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission."
+  },
+  "numberOfTests" : 430,
+  "header" : [],
+  "testGroups" : [
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f",
+        "wx" : "2da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa",
+        "wy" : "4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200042da57dda1089276a543f9ffdac0bff0d976cad71eb7280e7d9bfd9fee4bdb2f20f47ff888274389772d98cc5752138aa4b6d054d69dcf3e25ec49df870715e34883b1836197d76f8ad962e78f6571bbc7407b0d6091f9e4d88f014274406174f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAELaV92hCJJ2pUP5/9rAv/DZdsrXHrcoDn\n2b/Z/uS9svIPR/+IgnQ4l3LZjMV1ITiqS20FTWnc8+JexJ34cHFeNIg7GDYZfXb4\nrZYuePZXG7x0B7DWCR+eTYjwFCdEBhdP\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "signature malleability",
+          "msg" : "313233343030",
+          "sig" : "3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202307b0a10ee2dd0dd2fab75095af240d095e446faba7a50a19fbb197e4c4250926e30c5303a2c2d34250f17fcf5ab3181a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "Legacy:ASN encoding of r misses leading 0",
+          "msg" : "313233343030",
+          "sig" : "30650230814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingZero"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "Legacy:ASN encoding of s misses leading 0",
+          "msg" : "313233343030",
+          "sig" : "3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2023084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingZero"
+          ]
+        },
+        {
+          "tcId" : 4,
+          "comment" : "valid",
+          "msg" : "313233343030",
+          "sig" : "3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "308166023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 6,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "306702813100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 7,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "3067023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20281310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 8,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "30820066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "30680282003100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 10,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2028200310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 11,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3067023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3066023200814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3066023000814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202320084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202300084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "30850100000066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "306b0285010000003100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "306b023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2028501000000310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3089010000000000000066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "306f028901000000000000003100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "306f023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202890100000000000000310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30847fffffff023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "306a02847fffffff00814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202847fffffff0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3084ffffffff023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "306a0284ffffffff00814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20284ffffffff0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3085ffffffffff023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "306b0285ffffffffff00814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "306b023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20285ffffffffff0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3088ffffffffffffffff023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "306e0288ffffffffffffffff00814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "306e023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20288ffffffffffffffff0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30ff023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "306602ff00814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202ff0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "3066028000814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202800084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "30680000023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "306b4981773066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "306a25003066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30683066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "306b2236498177023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "306a22352500023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "306e2233023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20004deadbeef02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "306b023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2223649817702310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e22235250002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "306e023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2223302310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "306eaa00bb00cd003066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "306caa02aabb3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "306e2239aa00bb00cd00023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "306c2237aa02aabb023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "306e023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e22239aa00bb00cd0002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "306c023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e22237aa02aabb02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "30803066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "306a2280023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2000002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2228002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "30803166023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "306a2280033100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2000002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2228003310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2e66023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2f66023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3166023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3266023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "ff66023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "306a30010230653100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "30653100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 80,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd05000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "3080023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "30683000023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "30683066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "3033023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "308199023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "removing integer",
+          "msg" : "313233343030",
+          "sig" : "303302310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "30340202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "3034023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3068023300814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2000002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202330084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "30680233000000814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 96,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2023300000084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 97,
+          "comment" : "appending unused 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2000002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "3068023300814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2050002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "3068023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202330084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "3035028102310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "3035023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20281",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "3035050002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "3035023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3066003100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3066013100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3066033100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3066043100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3066ff3100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e200310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e201310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e203310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e204310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2ff310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "3035020002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "3035023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "306a22350201000230814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "306a023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e22235020100023084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "3066023102814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310284f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a156202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a74d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3065023000814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a1502310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "30650230814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202300084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2023084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "30670232ff00814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "3067023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20232ff0084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "303609018002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "3036023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2090180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "303602010002310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "3036023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2020100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3066023101814cc9a70febda342d4ada87fc39426f403d5e8980842845d38217e2bcceedb5caa7aef8bc35edeec4beb155610f3f5502310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30650230814cc9a70febda342d4ada87fc39426f403d5e898084284644bb7cded46091f71a7393942ad49ef8eae67e7fc784ec6f02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30660231ff7eb33658f01425cbd2b5257803c6bd90bfc2a1767f7bd7b9f3e1359f376840298d725eb98c7ab98c282d68156bb5ea1e02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "306502307eb33658f01425cbd2b5257803c6bd90bfc2a1767f7bd7b9bb4483212b9f6e08e58c6c6bd52b610715198180387b139102310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30660231fe7eb33658f01425cbd2b5257803c6bd90bfc2a1767f7bd7ba2c7de81d4331124a3558510743ca12113b414eaa9ef0c0ab02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3066023101814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "306502307eb33658f01425cbd2b5257803c6bd90bfc2a1767f7bd7b9f3e1359f376840298d725eb98c7ab98c282d68156bb5ea1e02310084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310184f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e5fd3ad1cb7a61dc9507f6eeb2a65341ad0cac035dfee58d140",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e2023084f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e6044e681b3bdaf6d91cf3acfc5d3d2cbdaf0e8030a54ce7e5a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20231ff7b0a10ee2dd0dd2fab75095af240d095e446faba7a50a19ff3b630ca4e19648ed8ab2287e37c8caa222be38ade6c5833",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e20231fe7b0a10ee2dd0dd2fab75095af240d095e446faba7a50a1a02c52e34859e236af809114d59acbe52f353fca2011a72ec0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3066023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202310184f5ef11d22f22d0548af6a50dbf2f6a1bb9054585af5e600c49cf35b1e69b712754dd781c837355ddd41c752193a7cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3065023100814cc9a70febda342d4ada87fc39426f403d5e89808428460c1eca60c897bfd6728da14673854673d7d297ea944a15e202307b0a10ee2dd0dd2fab75095af240d095e446faba7a50a19ff3b630ca4e19648ed8ab2287e37c8caa222be38ade6c5833",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 145,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036020100023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036020100023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036020100023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036020100023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036020100023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036020101023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036020101023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036020101023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036020101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036020101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020101090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201ff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201ff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201ff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201ff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30360201ff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30080201ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529730201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3038023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529720201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3038023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc529740201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3038023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3038023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3036023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000001000000000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52974",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3038023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff000000000000000100000000090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 217,
+          "comment" : "Edge case for Shamir multiplication",
+          "msg" : "3637323636",
+          "sig" : "3066023100ac042e13ab83394692019170707bc21dd3d7b8d233d11b651757085bdd5767eabbb85322984f14437335de0cdf5656840231008f8a277dde5282671af958e3315e795a20e2885157b77663a67a77ef2379020c5d12be6c732fd725402cb9ee8c345284",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "special case hash",
+          "msg" : "33393439313934313732",
+          "sig" : "3065023100d51c53fa3e201c440a4e33ea0bbc1d3f3fe18b0cc2a4d6812dd217a9b426e54eb4024113b354441272174549c979857c02300992c5442dc6d5d6095a45720f5c5344acb78bc18817ef32c1334e6eba7726246577d4257942bdefe994c1575ed15a6e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "special case hash",
+          "msg" : "35333637363431383737",
+          "sig" : "3065023100c8d44c8b70abed9e6ae6bbb9f4b72ed6e8b50a52a8e6e1bd3447c0828dad26fc6f395ba09069b307f040d1e86a42c022023001e0af500505bb88b3a2b0f132acb4da64adddc0598318cb7612b5812d29c2d0dde1413d0ce40044b44590e91b97bacd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "special case hash",
+          "msg" : "35363731343831303935",
+          "sig" : "3065023100d3513bd06496d8576e01e8c4b284587acafd239acfd739a19a5899f0a00d269f990659a671b2e0e25f935b3a28a1f5fd0230366b35315ce114bffbb75a969543646ee253f046a8630fbbb121ecc5d62df4a7eb09d2878805d5dab9c9b3880b747b68",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "special case hash",
+          "msg" : "3131323037313732393039",
+          "sig" : "3065023100b08c4018556ca8833b524504e30c58346e1c0345b678fdf91891c464a33180ed85a99bc8911acf4f22aceb40440afc9402304a595f7eed2db9f6bd3e90355d5c0e96486dc64242319e41fc07be00a732354b62ec9c34319720b9ffb24c994b1cf875",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "special case hash",
+          "msg" : "3131323938303334323336",
+          "sig" : "306502302b08f784617fd0707a83d3c2615efa0c45f28d7d928fc45cd8a886e116b45f4686aee97474d091012e27057b6ba8f7e6023100c440aa6ecb63e0d43c639b37e5810a96def7eec8e90a4c55e5b57971c48dfb4e850232fbb37bd32bb3b0523b815ff985",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "special case hash",
+          "msg" : "39383736303239363833",
+          "sig" : "306402300609f4ec120c8838bda916f668e9600af7652e1d3f7182734f97f54da5d106bbfd216c32f227b76d583de1c53949b2ee023046926dffc766ff90c3b921b3e51a2982a1072314c1fdfb4175de7adea5a6f97bdff587a473504a9c402aac7c05bd4785",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "special case hash",
+          "msg" : "3230323034323936353139",
+          "sig" : "306502305ae2220e4716e1ef0382afcc39db339e5bd5f05e8a188d4a5daaab71c6c35263ee8820a34558092877449ebb15898c5c023100c4d38e2e85451c43ee35b0c56196cbf3059acf2b8b529f06dc1de9b281d9b0f3f3983df8936e944ab0b18330a342ee88",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "special case hash",
+          "msg" : "31343531363639313830",
+          "sig" : "3065023051fb84ed71d436c737ab24e2a45c68f8f623748be2caebd89e02bfc89309b8350042ab1b97849b9f680f044a58765175023100d4a8f60791657a8c12985fd896ac77e7d95cb050582f2466471dc2c6dcf90db05ce34beadbfcfe690dc56c0cc9944007",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "special case hash",
+          "msg" : "31303933363835393531",
+          "sig" : "3065023040159290d161df6b3f81a92cefb6df56149d588e7b886bf24939f5c8b6bb515d325b3764f0ed284a77fa9081ccfa5237023100bd55dfb47709287ce7b88dfd96ac7543eeba9bd31b8c91f203d2b90418122406399c80a53539b81f1cb60fa3b23a2563",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "special case hash",
+          "msg" : "36323139353630323031",
+          "sig" : "3066023100d7fb9f53865cdf9d4cad6f66981aea35a1454858ceb678d7b851c12a4c6644fe1915a4b219b51389a5ae2c98a433cc3a02310094ad75c3dea88740205cab41032dfe149341cf4ee94dcd2f0c8bbe5af5860b30b5e1f764b2c767b09fd10761050c989c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "special case hash",
+          "msg" : "35363832343734333033",
+          "sig" : "30650230157ef8f85cdb9257983d06a7f29674752659097364b401e701705b3bd9ead884fd32141320ae76ae05f6fc7ec155d6c2023100ccadc3851020e41dd91bc28a6c073409136a47f20b8dbf2553fd456a8ed5fa7e73e4ec59dca499e0d082efbb9ad34dc7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "special case hash",
+          "msg" : "33373336353331373836",
+          "sig" : "3066023100e763001769c76f6a6d06fad37b584d7f25832501491bec283b3b6836f947dc4e2cef021c6c6e525b0a6a3890d1da122a023100acbd88729cce3992d14ec99e69ff0712b82a33a1c1e8b90e1399c66fe196f7c99bdb3ff81db77dc25ae6f0c1a025117d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "special case hash",
+          "msg" : "34373935393033373932",
+          "sig" : "3066023100c6425b6b046ec91ebc32b9e6de750e5d3d36d4ddc6dffd25ba47817385a9466f6fc52259c7d02c66af5bf12045b5659d02310084cdc06e35fecc85a3e00b16488eac3584942f663d8b59df111c0650139d7cda20d68dccae569d433170d832147bc94c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 231,
+          "comment" : "special case hash",
+          "msg" : "39333939363131303037",
+          "sig" : "306502303061f090e4932133a0e08ac984d1c8d8d4f565e21cf15427671503880341265cd44f35a437ee3c3a8857579dd7af0c3502310093ae374a0f63dcbe41a1b7b07a50faf2b33f35e0b6600bb36aa5cda05238640fa35c635c0fa78e1410f3a879bbb8a541",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 232,
+          "comment" : "special case hash",
+          "msg" : "31303837343931313835",
+          "sig" : "306502300ccc627f35454cc84e08a828f5bd5f5e41eeeaa40475bcc2e71ff372e8c718a5e179d3b7f2d7051db9060c4c978eb638023100b12d0240afbdfc64c60861548c33663b8960316a55f860cc33d1908e89aa6fc9519f23a900e0488fa6a37cfb37856565",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 233,
+          "comment" : "special case hash",
+          "msg" : "33323336363738353030",
+          "sig" : "3065023100e72419fb67ebbcc0de9c46ce5475c608f9de7e83fc5e582920b8e9848000d820d393fdac6c96ea35ce941cb14951640002306aa19934ef60f4a247bc261ba256283a94857a268f42a0939c95a536fbd4f8e1f1c285a7b164c12213abb9e3393cbe9f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 234,
+          "comment" : "special case hash",
+          "msg" : "31343438393937373033",
+          "sig" : "30660231008b740931f9afa8a04c08cde896b7fdd9aca3177d5e4a3e5a51e54bfa824b66ab11df4e90f49798d644babfede7830224023100afd91e7ce15059a5b5499e5aef4afa91fd090e4e5029b3f4348f0d4349df11745869f9255117eea405a78af5dd6a646d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 235,
+          "comment" : "special case hash",
+          "msg" : "35373134363332383037",
+          "sig" : "3066023100989024bce204a7539fbd2b185ecf375590d873177c1ff26bbf755838ae5bcde180054663702ac3a4e68fe8b58fd88c70023100bdbedf64e424dbd7f979f83adef3fc85077fa76f8b1724815b5b8c24fde7fbd72f4b369a415d9bbf565cdc459bdce54c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 236,
+          "comment" : "special case hash",
+          "msg" : "323236343837343932",
+          "sig" : "3064023022624fc23403955c0c9f5b89871177fa53879c8424de3b4ab1bcbcddc6e57b870b0491b848e19f728722b3163f4aa32802305bb82642cdaa84d6977fb95b3ede4ec7f2d54881cf435636d3509816f13ebb7be24fd7d4e1e81fddf07bde685e8d630d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 237,
+          "comment" : "special case hash",
+          "msg" : "35333533343439343739",
+          "sig" : "3065023100da5a2daa7437df4566ebba6ac5ed424655633e354ef4d943dc95ddefb0dae69f3616e506cc8cb5bc433a82ba71f6feb402305107b24041bba45073ce54488a5aef861e7805bbb8f970aedc1c59149cfe72c7025e2d117337e8677c88ef43374e6907",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 238,
+          "comment" : "special case hash",
+          "msg" : "34373837333033383830",
+          "sig" : "306402302b0659fb7fa5fc1fce767418c20978de9a6a59941fc54f8380619b2ab2a7d6039de5373fbb503c24f2ce38e9c57995de02300d94dba98dd874bfffeac96a9295b6ab667708b8e33252edc029574c484a132135b13e52db6f877987c1be4f51fca193",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 239,
+          "comment" : "special case hash",
+          "msg" : "32323332313935383233",
+          "sig" : "306402304a5a14f1ecf053bf3ec14843db8c7dd153e9545d20d76345a9e1d1a8fcb49558ca1ee5a9402311c2eaa102e646e57c2c02301573b8b4b633496da320e99a85c6f57b7ee543548180a77f7fced2d0665911cb4cde9de21bc1a981b97742c9040a6369",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 240,
+          "comment" : "special case hash",
+          "msg" : "3130373339333931393137",
+          "sig" : "30650230104e66e6e26c36633c0af001f0d9a216236816923ec93b70bea0a8ff053a15aaaef5fe3483e5cc73564e60fe8364ce0e023100ec2df9100e34875a5dc436da824916487b38e7aeb02944860e257fd982b01782b3bd6b13b376e8a6dbd783dfa0d77169",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 241,
+          "comment" : "special case hash",
+          "msg" : "31383831303237333135",
+          "sig" : "306402304b06795da82bda354e8d9422a76c7bc064027fcdd68f95b7bc6177a85b2d822c84dc31cb91fc016afa48816a3a019267023018e31018e312d3dd3dd49ec355fdb0def3bb3e44393c26cf1bc110b23a3aacf6c442bfcec5535ce37527d0e068f75c03",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 242,
+          "comment" : "special case hash",
+          "msg" : "36303631363933393037",
+          "sig" : "3066023100ad75ca5a3df34e5a6d3ea4c9df534e8910cfb1d8c605fc398fbee4c05f2b715bd2146221920de8bac86c2b210221bcff023100a322d3df3bb2cf9e4215adf1ff459e70f2f86bec6dd6af5d04ae307d21ed5955136c8e258fdc0f9cbd6cf89c31aa691f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 243,
+          "comment" : "special case hash",
+          "msg" : "38383935323237303934",
+          "sig" : "3065023100b0fa6289cc61bab335932ea1ac6540462653cc747ef67827825f77689a4398602297835d08aa16e23a76dea9f75404ef0230278d654a0b50c57d13f9c9c8c7c694001167f8e3b71491772a7427f1410fb6de518740c22e455e58de48846479b300cc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 244,
+          "comment" : "special case hash",
+          "msg" : "31353830323334303934",
+          "sig" : "3065023100c216cb4fe97facb7cd66f02cd751155b94fa2f35f8a62ba565aca575728af533540ff5d769b7c15c1345ab6414e150680230278a8a372b75d6eb17a4f7c7f62d5555c7357a1a047026bead52185cbcc01d73b80a1577e86220b2278da2b1ee8c983a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 245,
+          "comment" : "special case hash",
+          "msg" : "33393635393931353132",
+          "sig" : "30660231009591c80453cffbcd0b8d6d20fce0cbb2a458e54aed7ba1c767e6c017af4c4aa07a76859c0b249f6692a3c9ace893f14e023100893b567cd2959cd60557d3d6013d6e1741421a6edc5bc18244b3e8d7744e57928ce006a3fbd6e6324cb8ea3e5177e7e3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 246,
+          "comment" : "special case hash",
+          "msg" : "32323838373332313938",
+          "sig" : "30650230350b5515ba9785f149e2a566c14f4178757bb325179888f526f7db11161aedcd752551381316c2713f5de21d3d517af002310097d48a90c3bb3444736bec69db0649f82428b39238ada6048a0bead84f2f3b73816b48fed4d57b5f87a194ce4004ed7b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 247,
+          "comment" : "special case hash",
+          "msg" : "32323330383837333139",
+          "sig" : "3066023100833210c45d2448d9a4d69622d6f2193e64c65c79d45d62e28f517ca5c68eef05a2e98b1faed4cc87cbdbec6fe6bb8987023100b777b44cd30e6a049dc56af19a251d955c1bbab0c307fe12e9e5382fd48c173db0292f0b1047da28ee18518e11688eea",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 248,
+          "comment" : "special case hash",
+          "msg" : "313239303536393337",
+          "sig" : "306402307728ef10d9d5f3f32132716e6b403926929b05201700658d4b7f25a0692f153b8d666fd0da39888ab6234212659268d0023055df9466ee2c98225a2b0c4ff77622f9d11b4e48aa7f9279cdc2e245fdd9b9f4282106e25a458ff618bc3ca9422bea25",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 249,
+          "comment" : "special case hash",
+          "msg" : "32373438363536343338",
+          "sig" : "30640230552040701dba17be3b4d5d6e136ce412b6a4c50ce1ee53415d8100c69a8ee4726652648f50e695f8bb552d0df3e8d1c402301374972b2f35b2fd86d45ed0c9358b394e271575e429ac8aa60eb94b9df7e755d9317fb259269e9d3b1db8d48d91dc7e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 250,
+          "comment" : "special case hash",
+          "msg" : "37353833353032363034",
+          "sig" : "3065023100fe6ef07056ce647128584bec156b68b8005f42d8c85dfb122134c488cc0e72cf8f06700417d7ff694b45e894ec23cbbd02307f5e33c5bfa697c144d440b32d06221f630a9ccaa8e9a0489490c04b86e8daae0e41d2466429b4b3cc1d37348e36cc0b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 251,
+          "comment" : "special case hash",
+          "msg" : "32333237373534323739",
+          "sig" : "3065023100e009fc1a13d282bd37f10693350a5b421a0039713d29cb9e816e013c173bd1ec2bd6eb6bd88429023ee3d75d9a5ec06f02300b8bd481982a6e52355bcde5fe0092abac41f0543c31d1928b9a585e63e9520e24a65f46db2696e1b85a65c4e5240879",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 252,
+          "comment" : "special case hash",
+          "msg" : "373735353038353834",
+          "sig" : "3065023100acee00dfdfcee7343aeffa8514b11020c5435027887529d255bdbd45a90f160c68f05bd4b567daa8fa14e5807f5167a402301c9fdf546190970aa33121a3043280669be694e5f700b52a805aa6101b4c58f0467e7b699641d1d03f6229b2faf4253f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 253,
+          "comment" : "special case hash",
+          "msg" : "3137393832363438333832",
+          "sig" : "30650231008a4ee1e3bb251982475877d18763fafcf49ccc8b0fec1da63b0edccbb8d3e38608a2e02d0d951031179e12ac899d30c3023073cb62ad7632cd42dff829abfbfcb6165207e3708ed10043c0cdee951c7f8012432696e9cf732dcbadb504630648419f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 254,
+          "comment" : "special case hash",
+          "msg" : "32333936373737333635",
+          "sig" : "306402303903b59f837ff5f41f42cbe3e2fc8e17d859cbb35386c4327d3947fb012b3629fea911c83cefdbd503aebbcc1114afd102300e5be9094b5a22ade00c24644f476baad0f7741dfb2ce9644a1c45769404f8dccc522017c2b8cc630f1a0ef5fee99fe8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 255,
+          "comment" : "special case hash",
+          "msg" : "35393938313035383031",
+          "sig" : "306502307717ffc8d0811f357299423c56ec181c58f1981f5c1dd4f346f6a2ad71d3582e203a11e8609c1146ff3247a1820f832c02310096c89ec707da3cd8b09084b065e3265327a536a974c4285155388011e348f2e7f005ae7e3e502732fc2971ac13fd72c0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 256,
+          "comment" : "special case hash",
+          "msg" : "3136363737383237303537",
+          "sig" : "3065023100a21519ce3533c80826f1e47fa9afde7096151144291134421990285a8d89a8c2d4afdadd547a923dcc17bfcdd0e9ffb9023040577245dd2e022c8ed8b5de7b8c26f31307429a7a64e5729311cc4128e3b486867e61b4a8a1cd0731792eb1466d08f3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 257,
+          "comment" : "special case hash",
+          "msg" : "323036323134333632",
+          "sig" : "3065023100a727addad0b2acd2942cb1e3f7b2917ca65453275198b06436a993bfc982d3f54620c395e253d57b8fe026efcf7252f902307a19811aa4c12c45c3c041e7c614d0d98051ca7a0c57a9a107d552793ba1d0debb373525aafcc13ae1acd50a42a89adf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 258,
+          "comment" : "special case hash",
+          "msg" : "36383432343936303435",
+          "sig" : "3065023022287277872d175d8a3ff5be9818658f845eb9c1b2edc093ae82a75aa31cc26fe1771b4bfbd4c320251388d7279b5245023100b47d1833867e889fcfd7ac171855293a50aa6db24c6522e374fe87be12bf49b13c8b5e1455a2f25aa7912f799eebe552",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 259,
+          "comment" : "special case hash",
+          "msg" : "33323639383937333231",
+          "sig" : "3065023100a0f41362009b8e7e7545d0f7c4127e22d82ac1921eb61bf51e9ea711e41557a84f7bb6ace499a3bc9ebca8e83728787b02301f6e0c15a3e402370885e2aceb712280ebc45b63986357765b7e54b06cd00db8308e4715c39d48d246030bf960e6a2ff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 260,
+          "comment" : "special case hash",
+          "msg" : "31333837333234363932",
+          "sig" : "306502304144e1c6ad29ad88aa5472d6d1a8d1f15de315f5b281f87cc392d66d7042547e6af7c733b31828f89c8a5dafce5bb9af023100f5d0d81f92428df2977757c88ba67f9e03abd4c15b1e87fa1dd49e601a9dd479e7c3dc03a8bfea60fcfc1c543931a7de",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 261,
+          "comment" : "special case hash",
+          "msg" : "34313138383837353336",
+          "sig" : "306402305f177fc05542be6e09027b7eac5eb34f34fc10ad1429e4daaea75834de48dd22626f2bf653dfcc46234921d19b97406b02307def6c993a87560425f2c911046357c4b1c4c376bfa22bb45d533654fea6f565ba722147b2269ea7652f9c4af62ed118",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 262,
+          "comment" : "special case hash",
+          "msg" : "393838363036353435",
+          "sig" : "3066023100bd77a8ff0cd798d8f6e75dfbbb16c3ee5bf3f626dcb5abdfd453b301cb4fd4caee8e84dd650a8b4cf6655dea163788c7023100ef8f42394469eb8cd7b2ac6942cdb5e70dd54980ad8c0c483099573d75b936880459c9d14f9e73645865a4f24ee2c4ce",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 263,
+          "comment" : "special case hash",
+          "msg" : "32343739313135383435",
+          "sig" : "3066023100a02e2196258436da6a35a2f73cf6b08880f27757566ce80c7fc45f5dcbaec62d3fcebb784b4a650e24c1a997e4b971f7023100f1195d2ba3321b6938e04169d7baf605001b6311f08a5e82157a7675d54993f2fd1e41f8c84fc437a1a139d2e73e8d46",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 264,
+          "comment" : "special case hash",
+          "msg" : "35303736383837333637",
+          "sig" : "30640230686c5dfe858629125fdee522b77a9b9be5e03a347d79cb4c407f17fd25c97293cd99711f33e77814bd30d2453d3a86c10230509ac9b18c1b2b5a2b1b889d994b950743a988c2fcfb683e89211a43da6ee362c2e414d84fe82db1904b81701c257822",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 265,
+          "comment" : "special case hash",
+          "msg" : "393838353036393637",
+          "sig" : "306502310083ce818ecd276432a8ddfe75406d01329e76d7586cd6f611c1fe1a0913ad80014c2156381942d58dd6356e44ccdc52a8023036a35983b97a9ae2a19cf05ba947dd880c973d5c78f9676ebbcb0b40d639124030c137236232f1fad15afd71c52ad8ec",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 266,
+          "comment" : "special case hash",
+          "msg" : "32373231333036313331",
+          "sig" : "306502307cb78ebb712b5a2e0b0573d28440a5da36bd2338805d90ef3b0c1178ae613be8ae8bf548af4e7403e5a5410462afc2e30231008631a82cbdb8c2c7df70f012405f06ad0ab20d6c4fbceb3e736f40fdff1a8e5f6e667a0e77259f277494de84ec0de50d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 267,
+          "comment" : "special case hash",
+          "msg" : "33323034313031363535",
+          "sig" : "306602310085110fe21156b7764b91bcb6cf44da3eb21d162395071c216a13b5920d67a31aaa20dfc4669cf32c04964d0831bcdc29023100e19187033d8b4e1edf7ab8eaaae1e13c80c0c4db51d921ccf62f424524cbd530d07de2cf902a0ecda5e01206ae61e240",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 268,
+          "comment" : "special case hash",
+          "msg" : "33313530363830393530",
+          "sig" : "306402300fd621a892ee5a3eb0bcb80f3184714a6635f568d92f41ad8d523887d5b82d2b930eb5ff2922fda1a3d299f5a045837f02301278725a607fa6f2fc7549b0de816fe2f88e3a1ec1ccaf9fb58e70a0f6646c2d7aad6e4f73d116e73096bdef231d0c89",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 269,
+          "comment" : "special case hash",
+          "msg" : "31373237343630313033",
+          "sig" : "3066023100802cbe405d3ce9663b0b13c639aa27730b3377ce42521098ae09096b7fc5e7ac998b6994344e89abfb50c05476f9cae80231009aa7258c0dc4eff4b2d583575368301e2a7865cfaa3753055a79c8b8e91e94496a5d539181c2fd77941df50fe87453cd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 270,
+          "comment" : "special case hash",
+          "msg" : "3134353731343631323235",
+          "sig" : "3066023100859b0446949d7f78a0301ac4cc02b599a758fd1be006bf1a12570015869e59b9a429ce1c77a750969f49e291f6ab899402310099a812a1acc2c646814315cf9b6290d2232236cdf131f9590088e75a55786cdfc9d9027ec70056408ab55445fd79fe60",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 271,
+          "comment" : "special case hash",
+          "msg" : "34313739353136303930",
+          "sig" : "3065023100dbcc7ee9fa620e943193deae3f46b3142779caa2bce2df79a20639c8d01bce414a61f72764c1ec949c945320f5ee2a1d02301d9879787b880bd05db39bac07bfe3e7d0792932144e211e81f21da9621b83bff11bc52bcc7cb40cf5093f9bad8650fb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 272,
+          "comment" : "special case hash",
+          "msg" : "35383932373133303534",
+          "sig" : "306402307a1f9fbd0f6e776c3e3a3c798f5c0d9e20f0e2f3f4d22e5893dd09e5af69a46abc2f888d3c76834462008069275dfeb9023045e6d62a74d3eb81f0a3a62902b8949132821b45d8e6cad9bb3d8660451727cdf7b332a9ac7bb04604991312143f8a6a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 273,
+          "comment" : "special case hash",
+          "msg" : "33383936313832323937",
+          "sig" : "30640230047962e09e1b61823d23726bf72b4dde380e032b534e3273db157fa60908159ab7ee4cadce14fd06ebe8e08e8d8d5a0702301892f65ee09e34ce45dd44b5a172b200ce66b678b0e200c17e424e319f414f8dfbb2769a0259c9cc105191aa924e48d5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 274,
+          "comment" : "special case hash",
+          "msg" : "38323833333436373332",
+          "sig" : "30660231008f02799390ab861452cd4949942cbbcc25cad7c4334c4bc6146fbef8ad96c86f923fbf376d9ab79073e5fcb663f1ea91023100ce15d9862d100ff95ad7368922eec3f6d7060ce412c01ff13870aa61626ee49edf39bb27005ecbe406bb6825f74c0438",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 275,
+          "comment" : "special case hash",
+          "msg" : "33333636393734383931",
+          "sig" : "306502301879c4d6cf7c5425515547575049be2a40c624a928cf281250f8bdcbf47e9f95310d0992c9887dc6318b3197114f358e023100e1116bf68320bade7d07a1a9651512d60b551af8625b98b5eb8ca222d4073ae5c140a80e5dbe59f073647daa00837aee",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 276,
+          "comment" : "special case hash",
+          "msg" : "32313939313533323239",
+          "sig" : "3064023031dced9a6767f39045472749baec1644ae7d93a810a4b60eb213c02c42de65152ffc669af96089554570801a704e2a2d02303022ecfbc88a72b9c50ef65344765b615738f2b3d420ade68cbf3ec40bef0e10c5cc43bcfe003bb6f17ec23802c40569",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 277,
+          "comment" : "special case hash",
+          "msg" : "35363030333136383232",
+          "sig" : "3066023100f4bdf786c61c5f1ce7568638ba9dbc9a134e27fc142003bf9870353980a8f4c2fbd03c8d0171e4048ef30db6fe15388a023100d0e96768bc6adc91f93ae5704e86888853f479f32a45bfd436dc8a030603d233c56880124b7971362aa11b71315ae304",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 278,
+          "comment" : "special case hash",
+          "msg" : "383639363531363935",
+          "sig" : "3065023100ec0f635b7ce31988a07f41b3df35ca03c70e376bfb3b6ab24831a83be2121b9f9e93928b10a8f5fc0322bdb9edd406fe023066618ccb473c6dac3b14cfab6dfb24d219b37aec63425067c2c1c631d64a80b9cab6445f5a5439adb28bb99daa9234a5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 279,
+          "comment" : "special case hash",
+          "msg" : "36353833393236333732",
+          "sig" : "306402304f2bea24f7de57901e365d4c332ddb62d294d0c5fd58342a43bdd3ba5cbaf25adaddb5944bfef9dcc88f94d93650bbbb02300851b97ddc433e4521c600904970e2bf55aa901e1aaaaf06818377f84a28e033a49eebc21ffe9cff3cbefd0963fbed00",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 280,
+          "comment" : "special case hash",
+          "msg" : "3133323035303135373235",
+          "sig" : "3064023072a9bab30f8da1437f17115cc37b6ef8cf6591ed934d596675ad7b000c6a74cca5f37210a68228a58023790e3726c357023012d697c4e20b18f63a3e0164dca8ca4a5fa0058ad7cd1c571cef356e85fd8f56ab7963d8aba824e8d31efb3e690c27b9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 281,
+          "comment" : "special case hash",
+          "msg" : "35303835333330373931",
+          "sig" : "3064023033b7105f4cc98a1ea2abad45dbbe3761b4613ddd350e62da91560da694be3e84b1684f9a8ee4b3f556c61d02af54446202302c86e3a216dc7dd784cdcbf5084bdf6cdc1c7e67dbd61f9f6ed161fda4d4c26167e5b12731cf2b0cf5d9a5f0b6124939",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 282,
+          "comment" : "special case hash",
+          "msg" : "37383636383133313139",
+          "sig" : "30640230252e3b5b60b8f80748b83623e30013723115cabcc48770c0ab6e7ee29c429ef1d9da78db3a9a8504133b9bd6feceb82502301ba740f87907cf6d450080f7807a50f21c31cd245dd30f95849a168d63b37628e8043c292ab7f130a4468eaf8b47e56d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 283,
+          "comment" : "special case hash",
+          "msg" : "32303832353339343239",
+          "sig" : "3066023100b8694dbf8310ccd78398a1cffa51493f95e3317f238291771cb331f8e3a9753774ae3be78df16d22b3fbe9ad45bed793023100daaead431bbdbf8d82368fbbd2473695683206ee67092c146b266ed32f56b31cb0f033eebf6c75118730eef7b7f96ba7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 284,
+          "comment" : "special case hash",
+          "msg" : "3130303635393536363937",
+          "sig" : "3066023100d37ba39cd1b5289e7aa3f33afefa4df6821a07d3e8ee1c11e7df036c37e36214bb90264633d4c395644cd2cc2523833f0231008b0d58ed75af59e2abbcec9226836f176b27da2d9f3094f2d4a09898136436235025208cf5444265af66fed05b3dc27c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 285,
+          "comment" : "special case hash",
+          "msg" : "33303234313831363034",
+          "sig" : "3066023100b4ef419020c0dcbdeeeed76c255560f1ed783c0f9e7fcea4c08a0714b9d1f491fda9ae7bb1eb96d294b02799f82861290231008d987611063d2f28cb309a56eaf1ea65f27d95c97b77a5f037f2f914fed728267aaf62a37f3c7b44fc4b15125b349863",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 286,
+          "comment" : "special case hash",
+          "msg" : "37373637383532383734",
+          "sig" : "3066023100b2df7b11cf60ac93c078d19f37f889717aa5d9af1d00d0964f9e9f5257c3b51b3d3e47ca5b5aa72058ed63b52464e582023100b524968ea8c58d379e38f4cfa9da1527a2acb26d605d22f173fcf1e834db0d7f031cb9245cb62b8458ff499b8d3decbe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 287,
+          "comment" : "special case hash",
+          "msg" : "353434313939393734",
+          "sig" : "3066023100e0edc08b4122b75ebbd1635d07f0bb55771bda15573a5081da971955f9a63f6decdd4919911dbfea503ea8ed1faad93d023100ca7850c74ce878587056206c590a1097d197a2090cfe3e057becfa2700c7a531623ae7331e163def693e26a97feb540d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 288,
+          "comment" : "special case hash",
+          "msg" : "35383433343830333931",
+          "sig" : "3065023068f555eef5a323a929719bfd8cf81d6d8a977ecb35defd86fa54d8e5749c7b5f3e80087fbd39f8aa0cd29d8310bd6578023100e2c2314a50fc0ad78c1ec02ea77ee2e13dcef1460957c6b573f721d72c209ac5fb529ab20397234c59ed44f60400971a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 289,
+          "comment" : "special case hash",
+          "msg" : "373138383932363239",
+          "sig" : "30660231009e330e29f18123813e83b9c6abd68de96a57f97a4005b88d5b470a67a541b6d3af12124cf8658b751671c6698fb8b021023100d210fba9bde6ef077ca06b75e1cf7ce8dd70b08e9dd42d81a215ef9272f1779ae3e9f0dec510571d87237cc6bf3203e8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 290,
+          "comment" : "special case hash",
+          "msg" : "31373433323233343433",
+          "sig" : "30650230483192056f753f64ddf0f21072b73d68893e6fa5432c981c7a1955b6592a6045a5c1c58c383e70023c34e09b7964ec8d02310094b005d5f98c4fd2ad40ff8e03a8599f45e206082112f834df1d48502d2ac690cd3204f0078913794c9c39077ad6c58b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 291,
+          "comment" : "special case hash",
+          "msg" : "32343036303035393336",
+          "sig" : "306402302b7ec14fd77c4b33230dd0a4e2710fbd307e469baec54b6f25daac7e196b7b4b5df251cdddba7bdc9836ca1319bb900b0230590036192586ff66ae9a288199db9d02bbd5b703f8c329a9a1f986001b190f20ae96fe8b63681eda17bac2a57fd40f2e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 292,
+          "comment" : "special case hash",
+          "msg" : "31363134303336393838",
+          "sig" : "306402302611484e7ff47dfaece4aa883dd73f891869e2786f20c87b980055ddd792070c0d0d9a370878126bab89a402b9ea173c02304e0006b8aabe9d6a3c3018d9c87eae7f46461187d3c20b33e975c850599ec1cb52c76e1f507e439afc43f9f682e7a8d2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 293,
+          "comment" : "special case hash",
+          "msg" : "32303935343235363835",
+          "sig" : "306502302d504e38cdb1bb80bf29e07afbc66aea732accc85a722011069988f21eef685084f55efa30bfe32427eb8636db9171b4023100883e3d80d766ccb29e73a9e929111930da8353ec69769785633fe1b4505f9051e78d50c79a6b7c885c10b160bbb57fb6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 294,
+          "comment" : "special case hash",
+          "msg" : "31303038303938393833",
+          "sig" : "3064023028dc1b63dc61ecde754ff4913780e486339103178e27d761987dac0b03c9bdf4a4a96b8680fa07fc47ae175b780e896e02305a9898eedf8781b9afeb506e0272a12c0c79bb893b8a5893c5a0a1bf4324d46dde71a245be2fd8aa2975fdeb40adf8f3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 295,
+          "comment" : "special case hash",
+          "msg" : "31353734313437393237",
+          "sig" : "306402304c978a47b9e9449337178aa6413a794c4c9bf182a42062646a469b1d2c2c95621e818e661352b07e63254b6954e1459802306997345f05cfc05c0fd4d1dd133e555e5e5002e0929a59f60bbffc354234783ebf4fe5db10a870952cabd453635c1082",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 296,
+          "comment" : "special case hash",
+          "msg" : "32383636373731353232",
+          "sig" : "3065023036d8e2cfc80d0436e1fad3702ec05aa138618cdb745652cb85b0b121ee107bdf1ade0464dc0c6bd16875bcc364044d8c023100898b8775c9b39aa9fd130b5ab77e6c462ced6114898045b7f606142277d9eb2aa897f24c9ba4c8d112111de04dc57c10",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 297,
+          "comment" : "special case hash",
+          "msg" : "31363934323830373837",
+          "sig" : "3065023100ce2bdcf924caaa81e79bd7dd983dfeeee91652e4ea6edd077f8b56ada4953733a22dd3a6336446a648aec4ffc367cb3e023008eb09faeef4b0e5c1262eda2127464f7e2981ea1736e80afc7c622461c3d26fe08694fb4914ce9dbba83704e3077b3c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 298,
+          "comment" : "special case hash",
+          "msg" : "39393231363932353638",
+          "sig" : "3066023100e3a1b4b0567d6c664dec02f3ee9cd8581129046944b0e6650f6e6a41b5d9d4bf79d7a6fd54ea5a218492cfa1bb03ca07023100986206925cbfa186c7d88f7100d87dd3b2d03b8789309a722d582f119eef48cd0ea5460917cf27246c31f90e28540424",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 299,
+          "comment" : "special case hash",
+          "msg" : "3131363039343339373938",
+          "sig" : "306502310095a5e29940e42099c4637f4ae51e7d1ec02be0dcfb0b627030984c35e477e80cc57e7eef970e384dee16a9b9fc8f2bf202300ca166c390339653cde84e79a87e5ceb4f52c1a515a5878542fd82705b9983976fd31a4123b5d0bde95a0818114cf462",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 300,
+          "comment" : "special case hash",
+          "msg" : "37313836313632313030",
+          "sig" : "3066023100c30c49d0ba131944e2075daacb1259d5580a712a08f73d889c4d3d484d73dd9719a439a986f48b072c4595c507a01083023100a5595c0691bc2d215f981fab513e3a88a452f2a1433367b99b02b6efe507519afedbe1ad0337899944e29c9ccccb2476",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 301,
+          "comment" : "special case hash",
+          "msg" : "33323934333437313737",
+          "sig" : "30650231009fd0585f8740669885c162842bba25323ea12b1d05e524bb945cad4e31538742eda5128f467b3c562c5f0a99019d3406023043acfadd03915c2350e1d8e514c47eb36f3c3456169c9a562a6262c1c2d7d33378bf9fec7f220239d5c61e06414414a4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 302,
+          "comment" : "special case hash",
+          "msg" : "3138353134343535313230",
+          "sig" : "306402304ecac0cdbf665c584f8a40614cd55d042706c54895b1de02984fe309122566c959a4dd3315e7d3f089879f8f45821336023009187da6587a3de90eba41f4e6510e711f4467f3122971566ecc39a4bd53e95b8a19380e20ec2a7c752d29de54fd2e8f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 303,
+          "comment" : "special case hash",
+          "msg" : "343736303433393330",
+          "sig" : "3065023037a1ba49f11e97ad0ec47e687c6c6e94f794f874720c0dd2da501437b50e5b00fb6ed33adf7cf1f9c870fd3d37165bf7023100b3ad08c9886b4ca1593a68938b67142c65ed4da1714c22204cba71300c094ccdbdf84c38a3f6d896db72ed5051a19266",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 304,
+          "comment" : "special case hash",
+          "msg" : "32353637333738373431",
+          "sig" : "3066023100a0abe896d2f30207bc9b21e75400eedb88d3498d49806f41aa8e7f9bd815a33382f278db39710c2cb097937790d0236c0231009a29aded30e8ce4790756208d12044e18c34168608026000a883044dd0d91109d866b422a054c232810ddfbb2ae440bb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 305,
+          "comment" : "special case hash",
+          "msg" : "35373339393334393935",
+          "sig" : "3065023100b024fc3479d0ddde1c9e06b63c9bfb76a00d0f2f555220cb9a1311c2deec32eb3d6d2b648f5e8c104d5f88931754c0c20230767950cc149697edbae836f977bd38d89d141ff9774147b13ddd525b7a3f3a14a80d9979856f65b99a6faff173b5d6eb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 306,
+          "comment" : "special case hash",
+          "msg" : "33343738333636313339",
+          "sig" : "306402302a0ae7b5d42645051212cafb7339b9c5283d1fd9881d77ad5c18d25ee10907b7809740a510e65aecd61b53ba3a0f660a02304c0457dd19ef6e4d6ae65f45417ddf1a58c07663a86737d271becfa3ea5724b6018f1fa9e64fd08601a7dbd3957761d9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 307,
+          "comment" : "special case hash",
+          "msg" : "363439303532363032",
+          "sig" : "306502300c1657320faca6668c6e9f06f657a310b01939a7d9640fa0429872fe28bd1667688bc162221285ecfb14e8d80627450a023100f5272aa08c321aa4f7e520825cc720f6511d635598c648d4d514669b3ad803ad259c799e195a095982f66c176435be21",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 308,
+          "comment" : "special case hash",
+          "msg" : "34373633383837343936",
+          "sig" : "3066023100d821798a7a72bfb483e6e9840e8d921200ef1976b7e514036bf9133a01740ce397c73fa046054438c5806c294a02c6800231008c5d12887fcd945ba123fc5a5605d13a5a3e7e781ad69c6103577ee9dc47adc3e39a21080dd50304b59e5f5cf3f5a385",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 309,
+          "comment" : "special case hash",
+          "msg" : "353739303230303830",
+          "sig" : "3065023100c996bd6fa63c9586779f27523d5583135a594808514f98cc44cac1fa5cfa03c78c7f12f746c6bd20608ecbe3060eb068023027d40a11d52373df3054a28b0ab98a91ad689d1211d69919fc04cadc22ff0367d3ef9433012a760c1d1df3715c8d5cf3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 310,
+          "comment" : "special case hash",
+          "msg" : "35333434373837383438",
+          "sig" : "3065023042dd6c8d995938701a538909ed6aeae0ba50c995138de84e195bbb9c56180e108d4a6274548c7be6e121c4d218d2d4a0023100fae8668bb2003f0da1dc90bec67d354ccbb899432599c3198b96c5ca4bd2324c46998f4fb76a123467cf24570b1b6916",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 311,
+          "comment" : "special case hash",
+          "msg" : "3139323636343130393230",
+          "sig" : "30650230061f185633291b9a768e15ec03a2b7c356c757b023b61e313fdf0c5349d128a78668d20b2561709b3bd8451b920f12ab0231008fc5edc66410dbf20a7cbc3498e405761756ed39866856e74256ac1f255f62b0edff519762ecdbbc8395d14715c4388e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 312,
+          "comment" : "special case hash",
+          "msg" : "33373033393135373035",
+          "sig" : "3065023069326e047c62e8bac5c090b76bf73ae652fa9a6aecfa1ccb8702f419094c9727511264fb1aeec00e425c7a0d746793d30231009dbddd22db4a77dbe16114bc6fbb981aecba7e82a9cbc1ed385e28a51793561770fb3f9696090efca24f268d8788f2c9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 313,
+          "comment" : "special case hash",
+          "msg" : "3831353435373730",
+          "sig" : "306402304ca1df89b23ed5efcdf601d295c45e402d786a14d62f7261104e4cb05b8cae17abb095799e71173841749615c829411b02301bb777e0a6fee8a2337a436a6fa26a487de4640ff97d57b44b55305989803863d748c7302f2dfde8b8cedd69bb602e2d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 314,
+          "comment" : "special case hash",
+          "msg" : "313935353330333737",
+          "sig" : "3065023067be1b06f67172c503a5ac50582235d30bc9079eaa4cdec69a39c096310f8d99186cc9af7c8b4369a291d3e921d60705023100ab645fc91f06b1ff7cc58fccf6f7cfac74db30d839748a78cb5f3b8fefc7a06f3b5ff0310a8580c6050bebb75eda972c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 315,
+          "comment" : "special case hash",
+          "msg" : "31323637383130393033",
+          "sig" : "3066023100d966442d6c29e5a4cc60e2374eccd373db3ebe405ee7c9664c4273100cd1899a1c58110487528616d8c5321dbf5227640231009bb0e4a2c041a3b7b672029fe480d155f57671ecd6eb598660d025acce1f613d03cd6cff4a214131c8c7a8ad22df1397",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 316,
+          "comment" : "special case hash",
+          "msg" : "3131313830373230383135",
+          "sig" : "3064023008a84a2bc39b082ab82e6e45f088a36f1cb255f97ec8124eca929d4506d7dab63957c647994be2c2c7344f902de5b38f02300c9645e84a304ba0970ca5ce00b8c8a971fa0d0bcbec6a70134894c44d3075030ff04333ea3889f847a1ed769ee618ee",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 317,
+          "comment" : "special case hash",
+          "msg" : "38333831383639323930",
+          "sig" : "306502310083004b034202bbf51a327d32ed3ddf67b46eda9bac695a4422744a4bd99aaac3b3e8ed80ddac6538939c9385d6c8f61602307b4e61926cb9afa8cdaaf44909df6dc6449887d59fe2acac05f7684a235fa77179bdbcc69fd8f359e8eda19e5a5d4807",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 318,
+          "comment" : "special case hash",
+          "msg" : "33313331323837323737",
+          "sig" : "3065023100ad93375a1d374c41e5de268a8c08c205ff5652445bfe3ddf4ca77a70f5819f9f06db861d82fc9637946f0fe38457f2bd02304bc043acbc6a68d4824ed768af9476ad5b93e4cb3bbac284fb5fbd548ae3b96c265c6d1ef4588a3e2da21b124c0d6b12",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 319,
+          "comment" : "special case hash",
+          "msg" : "3134333331393236353338",
+          "sig" : "30660231009e0d45d2dc93fd363dc919405818e39922f3f9dd0827bcad86d4ba80a44b45a6f60b8e593b580c91262b32859dbb1e53023100eb9b8dfe5ba4a055a974f19b488f3a6fa07161006ac94eb1fe1c12dd0e20f3a7be38a37ce96d671183c5871249b2a3c5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 320,
+          "comment" : "special case hash",
+          "msg" : "333434393038323336",
+          "sig" : "306502307a5d04cd2fda59d8565c79ea2a7f1289ab79cae9fde060094c805c591a2534e4393e28c3fd858529bf17643846aceb830231008de0d8c0092fd02d554afe25f814744beaaa17c6946a6387ec7046b602db8a6c900246c2fb63fcef2ac8d9394444a0fc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 321,
+          "comment" : "special case hash",
+          "msg" : "36383239383335393239",
+          "sig" : "3065023100a564eea0cdac051a769f8ff1e0c834a288ce514f67d138113727b53a1a6fc95ce237367b91f1b91b2f65d589adc8288e0230182e5b47b6fbd8e741a04e809487ba5fcb8a5f2f1b9af6ce214128623a4768e38e6ddc958ff39078c36c04a314708427",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 322,
+          "comment" : "special case hash",
+          "msg" : "33343435313538303233",
+          "sig" : "306402306758867cd1ca1446cc41043d1625c967a0ae04d9db17bbb42fa9c076b3593125d63cd3e7471ee6cdba5235a21cec2f220230563db387adb537e1d89231d935ac790316925aeb29132b9f87bee91116c33bf50943fe39b671ce9535dca0a5d22bbfa4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 323,
+          "comment" : "special case hash",
+          "msg" : "3132363937393837363434",
+          "sig" : "3066023100cde033e38d3f791db87d8a6907516bd8021acd47e897df683fda529d48050f8b5688f6361daf1b14bc3f45fc7f76150f023100e14f4811a667c85335a4709a589ea46bac72055b794eaea92d28e834d5bc459c605fe4f27c1ab18d186d59e7d205cb67",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 324,
+          "comment" : "special case hash",
+          "msg" : "333939323432353533",
+          "sig" : "3065023100f2384468b55553c68f9764d8248cfd7358d604fa377ebb13828c43a8ebdf308fbbbebfa49a9458bfda957d2068d24e3f02301fdf4891d56e3e90c02b05c14c27c17f56f8e6aa144f02328c90109e1f70c9e3f582f0d299c44da505c543cc89c6a990",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 325,
+          "comment" : "special case hash",
+          "msg" : "31363031393737393737",
+          "sig" : "3065023100b1ccafedcc21ba90b342fa23c0149f3d12a939ab6c3342b36ae61fddbdc753927a7c3e978bd780cf25cd78c8c5efe28002304c32a73f3157bbe2384095eb67726b9cd3c2623b98a182a3b4f00e8db933e1113b7ada2695a7d79b471026462b20e289",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 326,
+          "comment" : "special case hash",
+          "msg" : "3130383738373535313435",
+          "sig" : "3066023100f3ed170e449758299ae55eb85244745e1876621c1f708e07e55c0d2d9ab5f9af9e0a8b3c7bdf8936ab3c9ebd1908e9dc023100da62ccdb658868147286d7269bcbd4addb4dec9ea3d5d79fdbe0ccffa40d055170bddeb4ef4c5e0bc99fae5db62b4477",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 327,
+          "comment" : "special case hash",
+          "msg" : "37303034323532393939",
+          "sig" : "306502310083455fc4629e7693c8e495fec2d29bb23bb6db79180fcfa83a4f9310d9db27e29297dee27ee80a71ab2f7a2d59f48b8802307736c056c8f2bb57e9fb6b8de0ab6d09879f6611e737634e7b6337aa5c5a01f515d5e3702dec9a702177c816e32bac67",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 328,
+          "comment" : "special case hash",
+          "msg" : "31353635333235323833",
+          "sig" : "3065023074961587cbe49bbf0a73fea82b8b2242f67b0ea09224774639f437c60378a36b2d511a9145d576b440dffd1f02286a8b0231008fb95d46c22889085cc1d3e20bcfbcbc52f4532445f76f08efae2de8b56fe8525204643330dfd23cce946687a0aef046",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 329,
+          "comment" : "special case hash",
+          "msg" : "3233383236333432333530",
+          "sig" : "3065023100a3fd322330d0f0efccc54bd7d73c3159eb1bcca08cec369a4a08fd00f9ec6d482ced58eb08a0d7c2113bd5575de4917d0230164e3232a628c40fbba1de82bfb9627cec78a8040cf325a5a8bb8f864c2ac19e3524ac93f4db5713ce62ba256176e05e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 330,
+          "comment" : "special case hash",
+          "msg" : "31343437383437303635",
+          "sig" : "306502304c862ff9e4ff88f9a58e9fceaaf9bbb30740d3f6c8c6a69b5627fe234b144f8cdf09520735cfd708f5e341a78cc4873d023100a861972514a0e975cf2da214125ec93288524cc77492ed63c516424278e5ec8d41724467cb7c3111fa34c69193abb435",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 331,
+          "comment" : "special case hash",
+          "msg" : "3134323630323035353434",
+          "sig" : "3065023062225e4e492a9773397870336168960a66b9e50391ef7289cb2d3878f32252dc1b904f6682545e14564e415bd93e01170231009f4d0327f79e043505c691e361fa2e00f87f41324777eca6966f4bea2fa0858876aa01980b2cad7f66037524de49bf65",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 332,
+          "comment" : "special case hash",
+          "msg" : "31393933383335323835",
+          "sig" : "30640230450c65d2d88ba464eee3a5ce9310b519d5dcf608799fb2275eee987a67c2c4d7ac53716987cc5139c18c67ef07b1e20702301ee0439311a7bce1c4fed0a3152d1b354d96536c6ca0c9188ac1f1afcc5cd7305b5611ef0d19d8bd57c5059976dc5e68",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 333,
+          "comment" : "special case hash",
+          "msg" : "34323932313533353233",
+          "sig" : "3066023100aa2575fb5bea0effb5247d20c3d0165d575831840b5c18b0245a99a61b7ad5d7bf8a8cfcc375e095a84e781025bee3ee0231009c8b7797ad330abc206060b28b6ca1c639d89f59582528bda1527e3ab081697a2ab576f9d09c2ee329dd73231667308d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 334,
+          "comment" : "special case hash",
+          "msg" : "34343539393031343936",
+          "sig" : "3064023001fc45285aa2c2e50458199ade2ded0dd36b1de03e8969175be4a6f09f9719b195ded8d9eb4ea132d95d19a3528fd6c9023059609a358c5919fef4781061804d4d64a067edecdcfd14620161aae3ef2735095a558e4f8ae345040123f093e5f70af2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 335,
+          "comment" : "special case hash",
+          "msg" : "31333933393731313731",
+          "sig" : "3065023100d8e1f6b19e5b92e36060e59e53eeb788a4758c2c8ee9519f3949d5f3315abafbe937b8ed44d47e886a07c107aa8ac9f4023012550574318371e5168d0a339f20fcacaec87db211bba4d4e7c7e055b63b75fd31790ad285f4cc061378692b0a248e34",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 336,
+          "comment" : "special case hash",
+          "msg" : "32333930363936343935",
+          "sig" : "306402304815aec44a7a6b86ae87fc2556accd77832fa33a4710e02ec5ef6f41f68a910e6af4d173ae462a759bd98079b371bf5d02306e78d562f9e8be65e8d7a74a7305e5d6cf2f3c4c980f2b18dfb8e9c8b0134ec86548053b3d125e56d5872294d2d14ebc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 337,
+          "comment" : "special case hash",
+          "msg" : "3131343436303536323634",
+          "sig" : "3065023100d302f9db6b2d94e194412f0d40a135a554aee014bd939b3d7e45c1221ef7ce45c2aed875f9a2bc43dbc8264d92e444a5023004e7247b258c6e7739979c0a07282f62958ac45e52dd76a41d5e1aca31a5cda73d7b026d67b4d609803001cb661d74c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 338,
+          "comment" : "special case hash",
+          "msg" : "363835303034373530",
+          "sig" : "3065023100889f0e2a6ae2ddcad1cde3f65b61d4dd40985917ba841b47a1f802491f5af5067722b7683df0fca7ee19d2b73724c8fd02301f989bac23b51c49e5d7dcc319eed2fc767e9b432bf75af92814d9e67a5d4b3398eb15e98b70527abbc029abc1bea524",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 339,
+          "comment" : "special case hash",
+          "msg" : "3232323035333630363139",
+          "sig" : "3066023100e69c70c679795ca7d2b66e2632529651c120055fa3cf25435fe8bb28987c02412ce73e6ca5ca7e0b42e9670c0a588175023100edd8513bff40cdca9e22659238fbcea2de2caeef53c5287a515db9168b3008ec446c9b94f28a6e021c69bc6637fc4634",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 340,
+          "comment" : "special case hash",
+          "msg" : "36323135363635313234",
+          "sig" : "30640230068cbecfd47bfd688f495df05e45fd5fced6d8e240605c5b2be5e69368740b694b9b1ea034af3180e571dd38a86369ef02301a1d2976f748d1621128013c61abda5398a3e24f0073d1a6e07a1e96c12be4f1e2e7b144f9b5a350500acfc5cb0698d9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ca5ee479ad6624ab5870539a56a23b3816eef7bbc67156836dfb58c425fdb7213e31770f12b43152e887d88a3afb4b182aceec92b3139aca8396402a8f81bb5014e748eab2e2059f8656a883e62d78b9dc988b98332627f95232d37df26585d3",
+        "wx" : "0ca5ee479ad6624ab5870539a56a23b3816eef7bbc67156836dfb58c425fdb7213e31770f12b43152e887d88a3afb4b18",
+        "wy" : "2aceec92b3139aca8396402a8f81bb5014e748eab2e2059f8656a883e62d78b9dc988b98332627f95232d37df26585d3"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004ca5ee479ad6624ab5870539a56a23b3816eef7bbc67156836dfb58c425fdb7213e31770f12b43152e887d88a3afb4b182aceec92b3139aca8396402a8f81bb5014e748eab2e2059f8656a883e62d78b9dc988b98332627f95232d37df26585d3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEyl7kea1mJKtYcFOaVqI7OBbu97vGcVaD\nbftYxCX9tyE+MXcPErQxUuiH2Io6+0sYKs7skrMTmsqDlkAqj4G7UBTnSOqy4gWf\nhlaog+YteLncmIuYMyYn+VIy033yZYXT\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 341,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "313233343030",
+          "sig" : "304d0218389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68b023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 342,
+          "comment" : "r too large",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0470e6a90b4e076bf51dfa01fa44de49b448f7afa0f3d07677f1682ca776d404b2a0feef66b005ea28ba99b6ce21d0ca12424f7d179951fb89156cdf04aed6db056c98592c651b5a881abc34e2401127fb81c64e90cee83269c5141f9a3c7bce78",
+        "wx" : "70e6a90b4e076bf51dfa01fa44de49b448f7afa0f3d07677f1682ca776d404b2a0feef66b005ea28ba99b6ce21d0ca12",
+        "wy" : "424f7d179951fb89156cdf04aed6db056c98592c651b5a881abc34e2401127fb81c64e90cee83269c5141f9a3c7bce78"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000470e6a90b4e076bf51dfa01fa44de49b448f7afa0f3d07677f1682ca776d404b2a0feef66b005ea28ba99b6ce21d0ca12424f7d179951fb89156cdf04aed6db056c98592c651b5a881abc34e2401127fb81c64e90cee83269c5141f9a3c7bce78",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEcOapC04Ha/Ud+gH6RN5JtEj3r6Dz0HZ3\n8Wgsp3bUBLKg/u9msAXqKLqZts4h0MoSQk99F5lR+4kVbN8ErtbbBWyYWSxlG1qI\nGrw04kARJ/uBxk6QzugyacUUH5o8e854\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 343,
+          "comment" : "r,s are large",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045a568474805fbf9acc1e5756d296696290b73d4d1c3b197f48aff03b919f0111823f90ea024af1c78e7c803e2297662d4c1c79edc9c694620c1f5b5cc7dd9ff89a42442747857cace26b6ebc99962ec3a68a8e4072226d6d98a2a866dd97c203",
+        "wx" : "5a568474805fbf9acc1e5756d296696290b73d4d1c3b197f48aff03b919f0111823f90ea024af1c78e7c803e2297662d",
+        "wy" : "4c1c79edc9c694620c1f5b5cc7dd9ff89a42442747857cace26b6ebc99962ec3a68a8e4072226d6d98a2a866dd97c203"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200045a568474805fbf9acc1e5756d296696290b73d4d1c3b197f48aff03b919f0111823f90ea024af1c78e7c803e2297662d4c1c79edc9c694620c1f5b5cc7dd9ff89a42442747857cace26b6ebc99962ec3a68a8e4072226d6d98a2a866dd97c203",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEWlaEdIBfv5rMHldW0pZpYpC3PU0cOxl/\nSK/wO5GfARGCP5DqAkrxx458gD4il2YtTBx57cnGlGIMH1tcx92f+JpCRCdHhXys\n4mtuvJmWLsOmio5AciJtbZiiqGbdl8ID\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 344,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100d1aee55fdc2a716ba2fabcb57020b72e539bf05c7902f98e105bf83d4cc10c2a159a3cf7e01d749d2205f4da6bd8fcf1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0488531382963bfe4e179f0b457ecd446528b98d349edbd8e7d0f6c1673b4ae2a7629b3345a7eae2e7c48358c13bdbe0389375c849dd571d91f2a3bf8994f53f82261f38172806c4d725de2029e887bfe036f38d6985ea5a22c52169db6e4213da",
+        "wx" : "088531382963bfe4e179f0b457ecd446528b98d349edbd8e7d0f6c1673b4ae2a7629b3345a7eae2e7c48358c13bdbe038",
+        "wy" : "09375c849dd571d91f2a3bf8994f53f82261f38172806c4d725de2029e887bfe036f38d6985ea5a22c52169db6e4213da"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000488531382963bfe4e179f0b457ecd446528b98d349edbd8e7d0f6c1673b4ae2a7629b3345a7eae2e7c48358c13bdbe0389375c849dd571d91f2a3bf8994f53f82261f38172806c4d725de2029e887bfe036f38d6985ea5a22c52169db6e4213da",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEiFMTgpY7/k4XnwtFfs1EZSi5jTSe29jn\n0PbBZztK4qdimzNFp+ri58SDWME72+A4k3XISd1XHZHyo7+JlPU/giYfOBcoBsTX\nJd4gKeiHv+A2841phepaIsUhadtuQhPa\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 345,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100b6b681dc484f4f020fd3f7e626d88edc6ded1b382ef3e143d60887b51394260832d4d8f2ef70458f9fa90e38c2e19e4f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04080da57d67dba48eb50eef484cf668d981e1bf30c357c3fd21a43cdc41f267c3f186bf87e3680239bac09930f144263c5f28777ad8bcbfc3eb0369e0f7b18392a12397a4fbe15a2a1f6e2e5b4067c82681c89c73db25eca18c6b25768429cef0",
+        "wx" : "080da57d67dba48eb50eef484cf668d981e1bf30c357c3fd21a43cdc41f267c3f186bf87e3680239bac09930f144263c",
+        "wy" : "5f28777ad8bcbfc3eb0369e0f7b18392a12397a4fbe15a2a1f6e2e5b4067c82681c89c73db25eca18c6b25768429cef0"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004080da57d67dba48eb50eef484cf668d981e1bf30c357c3fd21a43cdc41f267c3f186bf87e3680239bac09930f144263c5f28777ad8bcbfc3eb0369e0f7b18392a12397a4fbe15a2a1f6e2e5b4067c82681c89c73db25eca18c6b25768429cef0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAECA2lfWfbpI61Du9ITPZo2YHhvzDDV8P9\nIaQ83EHyZ8Pxhr+H42gCObrAmTDxRCY8Xyh3eti8v8PrA2ng97GDkqEjl6T74Voq\nH24uW0BnyCaByJxz2yXsoYxrJXaEKc7w\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 346,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020102020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040e74a096d7f6ee1be9b4160d6b79baba4d25b4fb6fbdd38f5a9ed5cc1ac79943be71ede093e504c7dc0832daeb898a05a8d005b30c894686f6ecb2bc696e25effaccd3c9e4b48122db567c0118a0b983b757c2f40082dc374f8f6117a8e76fc0",
+        "wx" : "0e74a096d7f6ee1be9b4160d6b79baba4d25b4fb6fbdd38f5a9ed5cc1ac79943be71ede093e504c7dc0832daeb898a05",
+        "wy" : "0a8d005b30c894686f6ecb2bc696e25effaccd3c9e4b48122db567c0118a0b983b757c2f40082dc374f8f6117a8e76fc0"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200040e74a096d7f6ee1be9b4160d6b79baba4d25b4fb6fbdd38f5a9ed5cc1ac79943be71ede093e504c7dc0832daeb898a05a8d005b30c894686f6ecb2bc696e25effaccd3c9e4b48122db567c0118a0b983b757c2f40082dc374f8f6117a8e76fc0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEDnSgltf27hvptBYNa3m6uk0ltPtvvdOP\nWp7VzBrHmUO+ce3gk+UEx9wIMtrriYoFqNAFswyJRob27LK8aW4l7/rM08nktIEi\n21Z8ARiguYO3V8L0AILcN0+PYReo52/A\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 347,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020102020102",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a2ad0e27b40410d16077ddc5e415f109d328bf75e73a0f56876fef731285f83188b207a68690a40e76ed23e2c5e49fcf604f1c5d7d7df365005d40e209f4da7bb06f310d5a1660ad6236577fbb47955261f507d23b83013ffb951bd76908e76c",
+        "wx" : "0a2ad0e27b40410d16077ddc5e415f109d328bf75e73a0f56876fef731285f83188b207a68690a40e76ed23e2c5e49fcf",
+        "wy" : "604f1c5d7d7df365005d40e209f4da7bb06f310d5a1660ad6236577fbb47955261f507d23b83013ffb951bd76908e76c"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004a2ad0e27b40410d16077ddc5e415f109d328bf75e73a0f56876fef731285f83188b207a68690a40e76ed23e2c5e49fcf604f1c5d7d7df365005d40e209f4da7bb06f310d5a1660ad6236577fbb47955261f507d23b83013ffb951bd76908e76c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEoq0OJ7QEENFgd93F5BXxCdMov3XnOg9W\nh2/vcxKF+DGIsgemhpCkDnbtI+LF5J/PYE8cXX1982UAXUDiCfTae7BvMQ1aFmCt\nYjZXf7tHlVJh9QfSO4MBP/uVG9dpCOds\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 348,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020102020103",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 349,
+          "comment" : "r is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52975020103",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a233025c12d20f49dc50dc802e79f03c7ce1750b9204b51325d90b5ade08f4a74ef6efb081ed3156d64a0110d60fffabb924881891ee984cf51949dee96cfd7c9759b1ff00f0dbdc718d52117079d5d8bd6c86c6f532276af38b779bf2350d7f",
+        "wx" : "0a233025c12d20f49dc50dc802e79f03c7ce1750b9204b51325d90b5ade08f4a74ef6efb081ed3156d64a0110d60fffab",
+        "wy" : "0b924881891ee984cf51949dee96cfd7c9759b1ff00f0dbdc718d52117079d5d8bd6c86c6f532276af38b779bf2350d7f"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004a233025c12d20f49dc50dc802e79f03c7ce1750b9204b51325d90b5ade08f4a74ef6efb081ed3156d64a0110d60fffabb924881891ee984cf51949dee96cfd7c9759b1ff00f0dbdc718d52117079d5d8bd6c86c6f532276af38b779bf2350d7f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEojMCXBLSD0ncUNyALnnwPHzhdQuSBLUT\nJdkLWt4I9KdO9u+wge0xVtZKARDWD/+ruSSIGJHumEz1GUne6Wz9fJdZsf8A8Nvc\ncY1SEXB51di9bIbG9TInavOLd5vyNQ1/\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 350,
+          "comment" : "s is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3036020102023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accd7fffa",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043c9bb63607cdea0585f38d9780c9ac3e9a5a58153e2aacc4bc7a1d638d12e32c4d3a90c0c114b232c6f16e23e4bebb24da2ac2ccedc5494fe534a9abaea3013de0176f1b0e91bcd62154bdf3f604091a5008b2466702d0e2f93e4a4b6c601a54",
+        "wx" : "3c9bb63607cdea0585f38d9780c9ac3e9a5a58153e2aacc4bc7a1d638d12e32c4d3a90c0c114b232c6f16e23e4bebb24",
+        "wy" : "0da2ac2ccedc5494fe534a9abaea3013de0176f1b0e91bcd62154bdf3f604091a5008b2466702d0e2f93e4a4b6c601a54"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200043c9bb63607cdea0585f38d9780c9ac3e9a5a58153e2aacc4bc7a1d638d12e32c4d3a90c0c114b232c6f16e23e4bebb24da2ac2ccedc5494fe534a9abaea3013de0176f1b0e91bcd62154bdf3f604091a5008b2466702d0e2f93e4a4b6c601a54",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEPJu2NgfN6gWF842XgMmsPppaWBU+KqzE\nvHodY40S4yxNOpDAwRSyMsbxbiPkvrsk2irCzO3FSU/lNKmrrqMBPeAXbxsOkbzW\nIVS98/YECRpQCLJGZwLQ4vk+SktsYBpU\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 351,
+          "comment" : "small r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3036020201000230489122448912244891224489122448912244891224489122347ce79bc437f4d071aaa92c7d6c882ae8734dc18cb0d553",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04559a66ef77752fd856976f36ed315619932204599bd7ef91d1a53ac1e7c90b3969cab8143b7a53c4bf5a3fe39f649eb61f00f86dd8b8556c4815b2a01c59eb6cc03c97b94b6db4318249fe489e36ac9635876b1ca2ec0999caef5e1a6a58a70d",
+        "wx" : "559a66ef77752fd856976f36ed315619932204599bd7ef91d1a53ac1e7c90b3969cab8143b7a53c4bf5a3fe39f649eb6",
+        "wy" : "1f00f86dd8b8556c4815b2a01c59eb6cc03c97b94b6db4318249fe489e36ac9635876b1ca2ec0999caef5e1a6a58a70d"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004559a66ef77752fd856976f36ed315619932204599bd7ef91d1a53ac1e7c90b3969cab8143b7a53c4bf5a3fe39f649eb61f00f86dd8b8556c4815b2a01c59eb6cc03c97b94b6db4318249fe489e36ac9635876b1ca2ec0999caef5e1a6a58a70d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEVZpm73d1L9hWl2827TFWGZMiBFmb1++R\n0aU6wefJCzlpyrgUO3pTxL9aP+OfZJ62HwD4bdi4VWxIFbKgHFnrbMA8l7lLbbQx\ngkn+SJ42rJY1h2scouwJmcrvXhpqWKcN\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 352,
+          "comment" : "smallish r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303c02072d9b4d347952cd023100ce751512561b6f57c75342848a3ff98ccf9c3f0219b6b68d00449e6c971a85d2e2ce73554b59219d54d2083b46327351",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040548e79a17fd3a114d830ea88f218ee1ef7aa3f8dc139e0a8b9b60e25049a816ef449e8bd5dae867446495fdf20f47700363a1e8afefb02ebfd59df90b6d23ff7d5f706f9b26daebae1d4657ac342844ee9c2e0e9269f7efe7ab91e0303c115d",
+        "wx" : "548e79a17fd3a114d830ea88f218ee1ef7aa3f8dc139e0a8b9b60e25049a816ef449e8bd5dae867446495fdf20f4770",
+        "wy" : "363a1e8afefb02ebfd59df90b6d23ff7d5f706f9b26daebae1d4657ac342844ee9c2e0e9269f7efe7ab91e0303c115d"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200040548e79a17fd3a114d830ea88f218ee1ef7aa3f8dc139e0a8b9b60e25049a816ef449e8bd5dae867446495fdf20f47700363a1e8afefb02ebfd59df90b6d23ff7d5f706f9b26daebae1d4657ac342844ee9c2e0e9269f7efe7ab91e0303c115d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEBUjnmhf9OhFNgw6ojyGO4e96o/jcE54K\ni5tg4lBJqBbvRJ6L1droZ0Rklf3yD0dwA2Oh6K/vsC6/1Z35C20j/31fcG+bJtrr\nrh1GV6w0KETunC4Okmn37+erkeAwPBFd\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 353,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "313233343030",
+          "sig" : "3041020d1033e67e37b32b445580bf4efb02302ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad5215c51b320e460542f9cc38968ccdf4263684004eb79a452",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a0eb670630f9bbbd963c5750de7bcbae4ddfd37b13fe7690eec6861a3c56c8efb87dbbf85ccd953c659d382c3d7df76afb08840635a16ac7ecf3de2dc28a77c8af9d49e5a832551e3354a2b311e52be86720d9b2fbb78d11a8aec61606a29f0d",
+        "wx" : "0a0eb670630f9bbbd963c5750de7bcbae4ddfd37b13fe7690eec6861a3c56c8efb87dbbf85ccd953c659d382c3d7df76a",
+        "wy" : "0fb08840635a16ac7ecf3de2dc28a77c8af9d49e5a832551e3354a2b311e52be86720d9b2fbb78d11a8aec61606a29f0d"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004a0eb670630f9bbbd963c5750de7bcbae4ddfd37b13fe7690eec6861a3c56c8efb87dbbf85ccd953c659d382c3d7df76afb08840635a16ac7ecf3de2dc28a77c8af9d49e5a832551e3354a2b311e52be86720d9b2fbb78d11a8aec61606a29f0d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEoOtnBjD5u72WPFdQ3nvLrk3f03sT/naQ\n7saGGjxWyO+4fbv4XM2VPGWdOCw9ffdq+wiEBjWhasfs894twop3yK+dSeWoMlUe\nM1SisxHlK+hnINmy+7eNEaiuxhYGop8N\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 354,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "313233343030",
+          "sig" : "303602020100023077a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04254bce3041b00468445cb9ae597bc76c1279a8506142ce2427185b1d7f753d1c0aad94156b531a2071aa61c83ec842a3710d6c8c96766ae8b63396133e5872805e47d9ba39113e122d676d54dbb2460b59d986bdd33be346c021e8a71bb41ba9",
+        "wx" : "254bce3041b00468445cb9ae597bc76c1279a8506142ce2427185b1d7f753d1c0aad94156b531a2071aa61c83ec842a3",
+        "wy" : "710d6c8c96766ae8b63396133e5872805e47d9ba39113e122d676d54dbb2460b59d986bdd33be346c021e8a71bb41ba9"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004254bce3041b00468445cb9ae597bc76c1279a8506142ce2427185b1d7f753d1c0aad94156b531a2071aa61c83ec842a3710d6c8c96766ae8b63396133e5872805e47d9ba39113e122d676d54dbb2460b59d986bdd33be346c021e8a71bb41ba9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEJUvOMEGwBGhEXLmuWXvHbBJ5qFBhQs4k\nJxhbHX91PRwKrZQVa1MaIHGqYcg+yEKjcQ1sjJZ2aui2M5YTPlhygF5H2bo5ET4S\nLWdtVNuyRgtZ2Ya90zvjRsAh6KcbtBup\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 355,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3041020d062522bbd3ecbe7c39e93e7c24023077a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049129db4446c2c598c4f81070f70f66c37c39323e01418c095de9902e0e1b20f26bc3e011ba84c10626ffdce836690c9f8e4a104fec4aaa4350c238617ee50456accc49efc3b73eb9548e1600c2483f1c4bae9ddf3ff92af17afd19f86274589c",
+        "wx" : "09129db4446c2c598c4f81070f70f66c37c39323e01418c095de9902e0e1b20f26bc3e011ba84c10626ffdce836690c9f",
+        "wy" : "08e4a104fec4aaa4350c238617ee50456accc49efc3b73eb9548e1600c2483f1c4bae9ddf3ff92af17afd19f86274589c"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200049129db4446c2c598c4f81070f70f66c37c39323e01418c095de9902e0e1b20f26bc3e011ba84c10626ffdce836690c9f8e4a104fec4aaa4350c238617ee50456accc49efc3b73eb9548e1600c2483f1c4bae9ddf3ff92af17afd19f86274589c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEkSnbREbCxZjE+BBw9w9mw3w5Mj4BQYwJ\nXemQLg4bIPJrw+ARuoTBBib/3Og2aQyfjkoQT+xKqkNQwjhhfuUEVqzMSe/Dtz65\nVI4WAMJIPxxLrp3fP/kq8Xr9GfhidFic\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 356,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "313233343030",
+          "sig" : "3065023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f3023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a701a8111cdf97ced74a00a4514b2b526be8113e7df6cf7163aaee465880d26275b833b186d80f1862dc67ff768dde43e5a991f16f8f777311b17eabdc90b6ece3b5da776cfbebbc504382ca1abae1c6aa6a64d9c41110d97950514e99578ed8",
+        "wx" : "0a701a8111cdf97ced74a00a4514b2b526be8113e7df6cf7163aaee465880d26275b833b186d80f1862dc67ff768dde43",
+        "wy" : "0e5a991f16f8f777311b17eabdc90b6ece3b5da776cfbebbc504382ca1abae1c6aa6a64d9c41110d97950514e99578ed8"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004a701a8111cdf97ced74a00a4514b2b526be8113e7df6cf7163aaee465880d26275b833b186d80f1862dc67ff768dde43e5a991f16f8f777311b17eabdc90b6ece3b5da776cfbebbc504382ca1abae1c6aa6a64d9c41110d97950514e99578ed8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEpwGoERzfl87XSgCkUUsrUmvoET599s9x\nY6ruRliA0mJ1uDOxhtgPGGLcZ/92jd5D5amR8W+Pd3MRsX6r3JC27OO12nds++u8\nUEOCyhq64caqamTZxBEQ2XlQUU6ZV47Y\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 357,
+          "comment" : "s == 1",
+          "msg" : "313233343030",
+          "sig" : "3035023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 358,
+          "comment" : "s == 0",
+          "msg" : "313233343030",
+          "sig" : "3035023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b6815ba05413bcf34f4c0704af590c1998d7fcd169541e1efe1567ca1dd71a22e35ac838b20c75281582044a57b58f456cdceb10612062779abadd8742c6e93ed74adf306f3b3a0f96b70dd1134b7558b64b55b200c5732c50f05aa032ae7c00",
+        "wx" : "0b6815ba05413bcf34f4c0704af590c1998d7fcd169541e1efe1567ca1dd71a22e35ac838b20c75281582044a57b58f45",
+        "wy" : "6cdceb10612062779abadd8742c6e93ed74adf306f3b3a0f96b70dd1134b7558b64b55b200c5732c50f05aa032ae7c00"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004b6815ba05413bcf34f4c0704af590c1998d7fcd169541e1efe1567ca1dd71a22e35ac838b20c75281582044a57b58f456cdceb10612062779abadd8742c6e93ed74adf306f3b3a0f96b70dd1134b7558b64b55b200c5732c50f05aa032ae7c00",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEtoFboFQTvPNPTAcEr1kMGZjX/NFpVB4e\n/hVnyh3XGiLjWsg4sgx1KBWCBEpXtY9FbNzrEGEgYneaut2HQsbpPtdK3zBvOzoP\nlrcN0RNLdVi2S1WyAMVzLFDwWqAyrnwA\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 359,
+          "comment" : "point at infinity during verify",
+          "msg" : "313233343030",
+          "sig" : "306402307fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b4b2d5a8b50ffabd34748e94498c1d4728d084f943fbddd4b3b6ee16eaa4da91613a82c98017132c94cd6fe4b87232f16d612228ed5d7d08bf0c8699677e3b8f3e718073b945a6c108d97a3b1433c79052b2655a18a3b2e621baa88198cb5f3c",
+        "wx" : "0b4b2d5a8b50ffabd34748e94498c1d4728d084f943fbddd4b3b6ee16eaa4da91613a82c98017132c94cd6fe4b87232f1",
+        "wy" : "6d612228ed5d7d08bf0c8699677e3b8f3e718073b945a6c108d97a3b1433c79052b2655a18a3b2e621baa88198cb5f3c"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004b4b2d5a8b50ffabd34748e94498c1d4728d084f943fbddd4b3b6ee16eaa4da91613a82c98017132c94cd6fe4b87232f16d612228ed5d7d08bf0c8699677e3b8f3e718073b945a6c108d97a3b1433c79052b2655a18a3b2e621baa88198cb5f3c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEtLLVqLUP+r00dI6USYwdRyjQhPlD+93U\ns7buFuqk2pFhOoLJgBcTLJTNb+S4cjLxbWEiKO1dfQi/DIaZZ347jz5xgHO5RabB\nCNl6OxQzx5BSsmVaGKOy5iG6qIGYy188\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 360,
+          "comment" : "u1 == 1",
+          "msg" : "313233343030",
+          "sig" : "3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158ca",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04842b3d89e54d9a4b5694d9251bba20ae4854c510dc0b6ef7033e4045ba4e64b6ddcd36299aac554dbac6db3e27c98123868258190297e1d6bae648a6dee2285886233afd1c3d6f196ad1db14262a579d74cf7855fffc65f5abd242b135ae87df",
+        "wx" : "0842b3d89e54d9a4b5694d9251bba20ae4854c510dc0b6ef7033e4045ba4e64b6ddcd36299aac554dbac6db3e27c98123",
+        "wy" : "0868258190297e1d6bae648a6dee2285886233afd1c3d6f196ad1db14262a579d74cf7855fffc65f5abd242b135ae87df"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004842b3d89e54d9a4b5694d9251bba20ae4854c510dc0b6ef7033e4045ba4e64b6ddcd36299aac554dbac6db3e27c98123868258190297e1d6bae648a6dee2285886233afd1c3d6f196ad1db14262a579d74cf7855fffc65f5abd242b135ae87df",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEhCs9ieVNmktWlNklG7ogrkhUxRDcC273\nAz5ARbpOZLbdzTYpmqxVTbrG2z4nyYEjhoJYGQKX4da65kim3uIoWIYjOv0cPW8Z\natHbFCYqV510z3hV//xl9avSQrE1roff\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 361,
+          "comment" : "u1 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "3065023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023100bc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d322ff6d1d1162b5de29edcd0b69803fe2f8af8e3d103d0a9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049ab73dcfffc820e739a3ed9c316c6f15d27a032f8aa59325f7842cf4a34198ac6ff09eb1a311ce226bf1abb49d8085110135f4b0c2b6b195da9bbe1993e985b8607664f1a4b3d499ea1a112b6afc7e6b88357c9348b614ddfdc846a3f38bbdca",
+        "wx" : "09ab73dcfffc820e739a3ed9c316c6f15d27a032f8aa59325f7842cf4a34198ac6ff09eb1a311ce226bf1abb49d808511",
+        "wy" : "135f4b0c2b6b195da9bbe1993e985b8607664f1a4b3d499ea1a112b6afc7e6b88357c9348b614ddfdc846a3f38bbdca"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200049ab73dcfffc820e739a3ed9c316c6f15d27a032f8aa59325f7842cf4a34198ac6ff09eb1a311ce226bf1abb49d8085110135f4b0c2b6b195da9bbe1993e985b8607664f1a4b3d499ea1a112b6afc7e6b88357c9348b614ddfdc846a3f38bbdca",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEmrc9z//IIOc5o+2cMWxvFdJ6Ay+KpZMl\n94Qs9KNBmKxv8J6xoxHOImvxq7SdgIURATX0sMK2sZXam74Zk+mFuGB2ZPGks9SZ\n6hoRK2r8fmuINXyTSLYU3f3IRqPzi73K\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 362,
+          "comment" : "u2 == 1",
+          "msg" : "313233343030",
+          "sig" : "3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0428771b137fb7d74c0ed0290416f47c8118997923c7b3b717fbbd5308a4bb0e494714bd3f1ff5e9e368887377284272ebf92e5df476a2fa0906ce4fad121c641abb539ab4ef270cd8f0497cc3e6e05b18561b730670f010741238a5d07b077045",
+        "wx" : "28771b137fb7d74c0ed0290416f47c8118997923c7b3b717fbbd5308a4bb0e494714bd3f1ff5e9e368887377284272eb",
+        "wy" : "0f92e5df476a2fa0906ce4fad121c641abb539ab4ef270cd8f0497cc3e6e05b18561b730670f010741238a5d07b077045"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000428771b137fb7d74c0ed0290416f47c8118997923c7b3b717fbbd5308a4bb0e494714bd3f1ff5e9e368887377284272ebf92e5df476a2fa0906ce4fad121c641abb539ab4ef270cd8f0497cc3e6e05b18561b730670f010741238a5d07b077045",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEKHcbE3+310wO0CkEFvR8gRiZeSPHs7cX\n+71TCKS7DklHFL0/H/Xp42iIc3coQnLr+S5d9Hai+gkGzk+tEhxkGrtTmrTvJwzY\n8El8w+bgWxhWG3MGcPAQdBI4pdB7B3BF\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 363,
+          "comment" : "u2 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "3065023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa84ecde56a2cf73ea3abc092185cb1a51f34810f1ddd8c64d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049d1baad217829d5f2d7db5bd085e9126232e8c49c58707cb153db1d1e20a109c90f7bcbae4f2c74d6595207cb0e5dd271eea30752a1425905d0811d0f42019e5088142b41945bee03948f206f2e7c3c1081ba9a297180e36b247ee9e70832035",
+        "wx" : "09d1baad217829d5f2d7db5bd085e9126232e8c49c58707cb153db1d1e20a109c90f7bcbae4f2c74d6595207cb0e5dd27",
+        "wy" : "1eea30752a1425905d0811d0f42019e5088142b41945bee03948f206f2e7c3c1081ba9a297180e36b247ee9e70832035"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200049d1baad217829d5f2d7db5bd085e9126232e8c49c58707cb153db1d1e20a109c90f7bcbae4f2c74d6595207cb0e5dd271eea30752a1425905d0811d0f42019e5088142b41945bee03948f206f2e7c3c1081ba9a297180e36b247ee9e70832035",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEnRuq0heCnV8tfbW9CF6RJiMujEnFhwfL\nFT2x0eIKEJyQ97y65PLHTWWVIHyw5d0nHuowdSoUJZBdCBHQ9CAZ5QiBQrQZRb7g\nOUjyBvLnw8EIG6milxgONrJH7p5wgyA1\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 364,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100c152aafea3a8612ec83a7dc9448f01941899d7041319bbd60bfdfb3c03da74c00c8fc4176128a6263268711edc6e8e90",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048e39e1e44f782b810ea93037c344371c4fb141c8bf196ea618f3a176547139a6d02121d2794cbe6481061694db579315c3184e8cd9b6c16b37699633d87f5600654b44cbcb5ab50ba872dfa001769eb765b2d1902e01d2e8af4e1fd6e9c0f30f",
+        "wx" : "08e39e1e44f782b810ea93037c344371c4fb141c8bf196ea618f3a176547139a6d02121d2794cbe6481061694db579315",
+        "wy" : "0c3184e8cd9b6c16b37699633d87f5600654b44cbcb5ab50ba872dfa001769eb765b2d1902e01d2e8af4e1fd6e9c0f30f"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200048e39e1e44f782b810ea93037c344371c4fb141c8bf196ea618f3a176547139a6d02121d2794cbe6481061694db579315c3184e8cd9b6c16b37699633d87f5600654b44cbcb5ab50ba872dfa001769eb765b2d1902e01d2e8af4e1fd6e9c0f30f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEjjnh5E94K4EOqTA3w0Q3HE+xQci/GW6m\nGPOhdlRxOabQISHSeUy+ZIEGFpTbV5MVwxhOjNm2wWs3aZYz2H9WAGVLRMvLWrUL\nqHLfoAF2nrdlstGQLgHS6K9OH9bpwPMP\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 365,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02304764eeac3e7a08daacfad7d1e1e3696042164b06f77bd78c3213ddea6f9fd449a34c97b9e560a6bf7195da41333c7565",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b96fca0e3f6ebf7326f0a8ce8bdf226a2560c22526bf154f7b467010f3a46baca73414070db0f7ab039f345548452ae26f7b744274e9bd6c791f47513e6b51eb42fea3816b3032b33a81695f04d4e775be06484cf7e6a69cba8bacbcb597b3e3",
+        "wx" : "0b96fca0e3f6ebf7326f0a8ce8bdf226a2560c22526bf154f7b467010f3a46baca73414070db0f7ab039f345548452ae2",
+        "wy" : "6f7b744274e9bd6c791f47513e6b51eb42fea3816b3032b33a81695f04d4e775be06484cf7e6a69cba8bacbcb597b3e3"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004b96fca0e3f6ebf7326f0a8ce8bdf226a2560c22526bf154f7b467010f3a46baca73414070db0f7ab039f345548452ae26f7b744274e9bd6c791f47513e6b51eb42fea3816b3032b33a81695f04d4e775be06484cf7e6a69cba8bacbcb597b3e3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEuW/KDj9uv3Mm8KjOi98iaiVgwiUmvxVP\ne0ZwEPOka6ynNBQHDbD3qwOfNFVIRSrib3t0QnTpvWx5H0dRPmtR60L+o4FrMDKz\nOoFpXwTU53W+BkhM9+amnLqLrLy1l7Pj\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 366,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100cb4d5c0ff0abe29b2771fe9f179a5614e2e4c3cc1134a7aad08d8ec3fd8fcd07fd34b3473ca65ead1c7bb20bcf3ea5c9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044fd52b11ff747b59ef609e065a462cd85b73172d20f406fdd845d4eaa3ec173e06ee58a58e1810f051b275bbaa47ccb484d2382b9e72c526dc3764a11a4a962a7a4c7355e6f057fc976ab73cc384f9a29da50769809ecbf37358dd83c74fc25f",
+        "wx" : "4fd52b11ff747b59ef609e065a462cd85b73172d20f406fdd845d4eaa3ec173e06ee58a58e1810f051b275bbaa47ccb4",
+        "wy" : "084d2382b9e72c526dc3764a11a4a962a7a4c7355e6f057fc976ab73cc384f9a29da50769809ecbf37358dd83c74fc25f"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200044fd52b11ff747b59ef609e065a462cd85b73172d20f406fdd845d4eaa3ec173e06ee58a58e1810f051b275bbaa47ccb484d2382b9e72c526dc3764a11a4a962a7a4c7355e6f057fc976ab73cc384f9a29da50769809ecbf37358dd83c74fc25f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAET9UrEf90e1nvYJ4GWkYs2FtzFy0g9Ab9\n2EXU6qPsFz4G7liljhgQ8FGydbuqR8y0hNI4K55yxSbcN2ShGkqWKnpMc1Xm8Ff8\nl2q3PMOE+aKdpQdpgJ7L83NY3YPHT8Jf\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 367,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02306e441db253bf798dbc07ff041506dc73a75086a43252fb439dd016110475d8381f65f7f27f9e1cfc9b48f06a2dfa8eb6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047d123e3dbab9913d698891023e28654cba2a94dc408a0dc386e63d8d22ff0f33358a231860b7c2e4f8429e9e8c9a1c5be7c95d1875f24ecdfeffc6136cf56f800f5434490f234f14d78505c2d4aea51e2a3a6a5d1693e72c4b1dd2a8746b875a",
+        "wx" : "7d123e3dbab9913d698891023e28654cba2a94dc408a0dc386e63d8d22ff0f33358a231860b7c2e4f8429e9e8c9a1c5b",
+        "wy" : "0e7c95d1875f24ecdfeffc6136cf56f800f5434490f234f14d78505c2d4aea51e2a3a6a5d1693e72c4b1dd2a8746b875a"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200047d123e3dbab9913d698891023e28654cba2a94dc408a0dc386e63d8d22ff0f33358a231860b7c2e4f8429e9e8c9a1c5be7c95d1875f24ecdfeffc6136cf56f800f5434490f234f14d78505c2d4aea51e2a3a6a5d1693e72c4b1dd2a8746b875a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEfRI+Pbq5kT1piJECPihlTLoqlNxAig3D\nhuY9jSL/DzM1iiMYYLfC5PhCnp6Mmhxb58ldGHXyTs3+/8YTbPVvgA9UNEkPI08U\n14UFwtSupR4qOmpdFpPnLEsd0qh0a4da\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 368,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023041db253bf798dbc07ff041506dc73a75086a43252fb43b63191efcd0914b6afb4bf8c77d008dbeac04277ef4aa59c394",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04608ce23a383452f8f4dcc5c0085d6793ec518985f0276a3409a23d7b7ca7e7dcb163601aca73840c3bd470aff70250bf674005a0be08939339363e314dca7ea67adfb60cd530628fe35f05416da8f20d5fb3b0ccd183a21dbb41c4e195d6303d",
+        "wx" : "608ce23a383452f8f4dcc5c0085d6793ec518985f0276a3409a23d7b7ca7e7dcb163601aca73840c3bd470aff70250bf",
+        "wy" : "674005a0be08939339363e314dca7ea67adfb60cd530628fe35f05416da8f20d5fb3b0ccd183a21dbb41c4e195d6303d"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004608ce23a383452f8f4dcc5c0085d6793ec518985f0276a3409a23d7b7ca7e7dcb163601aca73840c3bd470aff70250bf674005a0be08939339363e314dca7ea67adfb60cd530628fe35f05416da8f20d5fb3b0ccd183a21dbb41c4e195d6303d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEYIziOjg0Uvj03MXACF1nk+xRiYXwJ2o0\nCaI9e3yn59yxY2AaynOEDDvUcK/3AlC/Z0AFoL4Ik5M5Nj4xTcp+pnrftgzVMGKP\n418FQW2o8g1fs7DM0YOiHbtBxOGV1jA9\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 369,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02310083b64a77ef31b780ffe082a0db8e74ea10d4864a5f6876c6323df9a12296d5f697f18efa011b7d58084efde954b38728",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0448d23de1869475a1de532399da1240bab560eb74a6c7b0871bf8ac8fb6cc17cf7b34fcd7c79fd99c76c605bdf3fcbe18e15b66ab91d0a03e203c2ff914d4bedc38c1ec5dcd1d12db9b43ef6f44581632683bf785aa4326566227ece3c16be796",
+        "wx" : "48d23de1869475a1de532399da1240bab560eb74a6c7b0871bf8ac8fb6cc17cf7b34fcd7c79fd99c76c605bdf3fcbe18",
+        "wy" : "0e15b66ab91d0a03e203c2ff914d4bedc38c1ec5dcd1d12db9b43ef6f44581632683bf785aa4326566227ece3c16be796"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000448d23de1869475a1de532399da1240bab560eb74a6c7b0871bf8ac8fb6cc17cf7b34fcd7c79fd99c76c605bdf3fcbe18e15b66ab91d0a03e203c2ff914d4bedc38c1ec5dcd1d12db9b43ef6f44581632683bf785aa4326566227ece3c16be796",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAESNI94YaUdaHeUyOZ2hJAurVg63Smx7CH\nG/isj7bMF897NPzXx5/ZnHbGBb3z/L4Y4Vtmq5HQoD4gPC/5FNS+3DjB7F3NHRLb\nm0Pvb0RYFjJoO/eFqkMmVmIn7OPBa+eW\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 370,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023053bf798dbc07ff041506dc73a75086a43252fb43b6327af3b42da6d3e9a72cde0b5c2de6bf072e780e94ad12dcab270a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045d5eb470f9c6a0bb18e8960b67011acf9f01df405ac5b4bf9f4611d6a8af1a26b11b0790e93ae2361525dde51bacac94d42ce151793b80cee679c848362ec272000316590ebc91547b3b6608dfbade21e04de1548ebb45cc4721eb64a16b8318",
+        "wx" : "5d5eb470f9c6a0bb18e8960b67011acf9f01df405ac5b4bf9f4611d6a8af1a26b11b0790e93ae2361525dde51bacac94",
+        "wy" : "0d42ce151793b80cee679c848362ec272000316590ebc91547b3b6608dfbade21e04de1548ebb45cc4721eb64a16b8318"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200045d5eb470f9c6a0bb18e8960b67011acf9f01df405ac5b4bf9f4611d6a8af1a26b11b0790e93ae2361525dde51bacac94d42ce151793b80cee679c848362ec272000316590ebc91547b3b6608dfbade21e04de1548ebb45cc4721eb64a16b8318",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEXV60cPnGoLsY6JYLZwEaz58B30BaxbS/\nn0YR1qivGiaxGweQ6TriNhUl3eUbrKyU1CzhUXk7gM7mechINi7CcgADFlkOvJFU\neztmCN+63iHgTeFUjrtFzEch62Sha4MY\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 371,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023024c53b0a00cf087a9a20a2b78bc81d5b383d04ba9b55a567405239d224387344c41cceff0f68ffc930dbaa0b3d346f45",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041da34a149ed562c8ec13e84cb067107bc28b50bfa47575d5a9948cde5a3d7357c38ea41fcfcdd1ab1a1bd9b6592b33d9e14aedfd0cfffcfecbdc21276e6a2c78b8729412c48339ae538b799b7d8e61163047a64cfcec9018aa00f99ae740e3f3",
+        "wx" : "1da34a149ed562c8ec13e84cb067107bc28b50bfa47575d5a9948cde5a3d7357c38ea41fcfcdd1ab1a1bd9b6592b33d9",
+        "wy" : "0e14aedfd0cfffcfecbdc21276e6a2c78b8729412c48339ae538b799b7d8e61163047a64cfcec9018aa00f99ae740e3f3"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200041da34a149ed562c8ec13e84cb067107bc28b50bfa47575d5a9948cde5a3d7357c38ea41fcfcdd1ab1a1bd9b6592b33d9e14aedfd0cfffcfecbdc21276e6a2c78b8729412c48339ae538b799b7d8e61163047a64cfcec9018aa00f99ae740e3f3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEHaNKFJ7VYsjsE+hMsGcQe8KLUL+kdXXV\nqZSM3lo9c1fDjqQfz83Rqxob2bZZKzPZ4Urt/Qz//P7L3CEnbmoseLhylBLEgzmu\nU4t5m32OYRYwR6ZM/OyQGKoA+ZrnQOPz\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 372,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100c600ccb39bb3e2d85d880d76d1d519205f050c4b93deae0c5d63e8898ca8d7a5babbb944debe0f3c44332aae5770cb7b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048b8675211b321f8b318ba60337cde32a6b04243979546383127a068a8749cb5e98c4231b198de62a2b069d3a94d1c7b19d33468a130b4fef66a59d4aee00ca40bdbeaf044b8b22841bb4c8ba419f891b3855f4bddf8dae3577d97120b9d3fa44",
+        "wx" : "08b8675211b321f8b318ba60337cde32a6b04243979546383127a068a8749cb5e98c4231b198de62a2b069d3a94d1c7b1",
+        "wy" : "09d33468a130b4fef66a59d4aee00ca40bdbeaf044b8b22841bb4c8ba419f891b3855f4bddf8dae3577d97120b9d3fa44"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200048b8675211b321f8b318ba60337cde32a6b04243979546383127a068a8749cb5e98c4231b198de62a2b069d3a94d1c7b19d33468a130b4fef66a59d4aee00ca40bdbeaf044b8b22841bb4c8ba419f891b3855f4bddf8dae3577d97120b9d3fa44",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEi4Z1IRsyH4sxi6YDN83jKmsEJDl5VGOD\nEnoGiodJy16YxCMbGY3mKisGnTqU0cexnTNGihMLT+9mpZ1K7gDKQL2+rwRLiyKE\nG7TIukGfiRs4VfS9342uNXfZcSC50/pE\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 373,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02303ead55015c579ed137c58236bb70fe6be76628fbece64429bb655245f05cb91f4b8a499ae7880154ba83a84bf0569ae3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04442766bdb8b2cf4fef5f65d5d86b61681ec89220c983b51f15bfe12fb0bf9780e0c38bbcc888afb3c55ee828774b86f756b7f399c534c7acd46be4bc8bb38f087b0023b8f5166ab34192ca0b1cad62d663aa474c6f9286c8a054ef94ea42e3c7",
+        "wx" : "442766bdb8b2cf4fef5f65d5d86b61681ec89220c983b51f15bfe12fb0bf9780e0c38bbcc888afb3c55ee828774b86f7",
+        "wy" : "56b7f399c534c7acd46be4bc8bb38f087b0023b8f5166ab34192ca0b1cad62d663aa474c6f9286c8a054ef94ea42e3c7"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004442766bdb8b2cf4fef5f65d5d86b61681ec89220c983b51f15bfe12fb0bf9780e0c38bbcc888afb3c55ee828774b86f756b7f399c534c7acd46be4bc8bb38f087b0023b8f5166ab34192ca0b1cad62d663aa474c6f9286c8a054ef94ea42e3c7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAERCdmvbiyz0/vX2XV2GthaB7IkiDJg7Uf\nFb/hL7C/l4Dgw4u8yIivs8Ve6Ch3S4b3VrfzmcU0x6zUa+S8i7OPCHsAI7j1Fmqz\nQZLKCxytYtZjqkdMb5KGyKBU75TqQuPH\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 374,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100de03ff820a836e39d3a8435219297da1db193d79e359663e7cc9a229e2a6ac9e9d5c75417fa455bc8e3b89274ee47d0e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0411342b314f31648931abb897c1371dd3a23e91f2405c4a81744be18e753919752208779de2d54e865eeefbb0bfb4998af533d7a4d6fc6cb5cb98915ce08d0f656e37a502e78f8c1b8baca728c2ecb05a2156f01cff16595b363cdb49c00c1aa2",
+        "wx" : "11342b314f31648931abb897c1371dd3a23e91f2405c4a81744be18e753919752208779de2d54e865eeefbb0bfb4998a",
+        "wy" : "0f533d7a4d6fc6cb5cb98915ce08d0f656e37a502e78f8c1b8baca728c2ecb05a2156f01cff16595b363cdb49c00c1aa2"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000411342b314f31648931abb897c1371dd3a23e91f2405c4a81744be18e753919752208779de2d54e865eeefbb0bfb4998af533d7a4d6fc6cb5cb98915ce08d0f656e37a502e78f8c1b8baca728c2ecb05a2156f01cff16595b363cdb49c00c1aa2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEETQrMU8xZIkxq7iXwTcd06I+kfJAXEqB\ndEvhjnU5GXUiCHed4tVOhl7u+7C/tJmK9TPXpNb8bLXLmJFc4I0PZW43pQLnj4wb\ni6ynKMLssFohVvAc/xZZWzY820nADBqi\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 375,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100e5a6ae07f855f14d93b8ff4f8bcd2b0a717261e6089a53d54bf86e22f8e37d73aaa7607cc2ab831404b3e5bb4e01e79e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043c96b49ff60ff05951b7b1aca65664f13128b714da620697ef0d90bfc01ef643baa5c608f16ca885038322a443aed3e6169a27f2ea7a36376ef92a900e5389a7b441fd051d693ce65250b881cfdd6487370372292c84369742b18106188b05c0",
+        "wx" : "3c96b49ff60ff05951b7b1aca65664f13128b714da620697ef0d90bfc01ef643baa5c608f16ca885038322a443aed3e6",
+        "wy" : "169a27f2ea7a36376ef92a900e5389a7b441fd051d693ce65250b881cfdd6487370372292c84369742b18106188b05c0"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200043c96b49ff60ff05951b7b1aca65664f13128b714da620697ef0d90bfc01ef643baa5c608f16ca885038322a443aed3e6169a27f2ea7a36376ef92a900e5389a7b441fd051d693ce65250b881cfdd6487370372292c84369742b18106188b05c0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEPJa0n/YP8FlRt7GsplZk8TEotxTaYgaX\n7w2Qv8Ae9kO6pcYI8WyohQODIqRDrtPmFpon8up6Njdu+SqQDlOJp7RB/QUdaTzm\nUlC4gc/dZIc3A3IpLIQ2l0KxgQYYiwXA\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 376,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02307fffffffffffffffffffffffffffffffffffffffffffffffed2119d5fc12649fc808af3b6d9037d3a44eb32399970dd0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04388dae49ea48afb558456fdb1d0b04d4f8f1c46f14d22de25862d35069a28ae9284d7a8074546e779ad2c5f17ce9b89bb353298f3c526aa0a10ed23bcb1ed9788812c8a3a6cbea82a3d9d8d465a4cca59dbd3d3d8a36098d644f1b45d36df537",
+        "wx" : "388dae49ea48afb558456fdb1d0b04d4f8f1c46f14d22de25862d35069a28ae9284d7a8074546e779ad2c5f17ce9b89b",
+        "wy" : "0b353298f3c526aa0a10ed23bcb1ed9788812c8a3a6cbea82a3d9d8d465a4cca59dbd3d3d8a36098d644f1b45d36df537"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004388dae49ea48afb558456fdb1d0b04d4f8f1c46f14d22de25862d35069a28ae9284d7a8074546e779ad2c5f17ce9b89bb353298f3c526aa0a10ed23bcb1ed9788812c8a3a6cbea82a3d9d8d465a4cca59dbd3d3d8a36098d644f1b45d36df537",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEOI2uSepIr7VYRW/bHQsE1PjxxG8U0i3i\nWGLTUGmiiukoTXqAdFRud5rSxfF86bibs1MpjzxSaqChDtI7yx7ZeIgSyKOmy+qC\no9nY1GWkzKWdvT09ijYJjWRPG0XTbfU3\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 377,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023079b95c013b0472de04d8faeec3b779c39fe729ea84fb554cd091c7178c2f054eabbc62c3e1cfbac2c2e69d7aa45d9072",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c85200ac6411423573e3ebc1b7aea95e74add5ce3b41282baa885972acc085c8365c05c539ce47e799afc353d6788ce868cfce1eb2bfe009990084fb03c0919ab892313d7a12efc3514e8273685b9071892faefca4306adf7854afcebafffbf4",
+        "wx" : "0c85200ac6411423573e3ebc1b7aea95e74add5ce3b41282baa885972acc085c8365c05c539ce47e799afc353d6788ce8",
+        "wy" : "68cfce1eb2bfe009990084fb03c0919ab892313d7a12efc3514e8273685b9071892faefca4306adf7854afcebafffbf4"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004c85200ac6411423573e3ebc1b7aea95e74add5ce3b41282baa885972acc085c8365c05c539ce47e799afc353d6788ce868cfce1eb2bfe009990084fb03c0919ab892313d7a12efc3514e8273685b9071892faefca4306adf7854afcebafffbf4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEyFIArGQRQjVz4+vBt66pXnSt1c47QSgr\nqohZcqzAhcg2XAXFOc5H55mvw1PWeIzoaM/OHrK/4AmZAIT7A8CRmriSMT16Eu/D\nUU6Cc2hbkHGJL678pDBq33hUr866//v0\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 378,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100bfd40d0caa4d9d42381f3d72a25683f52b03a1ed96fb72d03f08dcb9a8bc8f23c1a459deab03bcd39396c0d1e9053c81",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e63ae2881ed60884ef1aef52178a297bdfedf67f4e3c1d876ad10b42c03b5e67f7f8cfaf4dfea4def7ab82fde3ed9b910e2be22bc3fa46a2ed094ebd7c86a9512c8c40cd542fb539c34347ef2be4e7f1543af960fd2347354a7a1df71a237d51",
+        "wx" : "0e63ae2881ed60884ef1aef52178a297bdfedf67f4e3c1d876ad10b42c03b5e67f7f8cfaf4dfea4def7ab82fde3ed9b91",
+        "wy" : "0e2be22bc3fa46a2ed094ebd7c86a9512c8c40cd542fb539c34347ef2be4e7f1543af960fd2347354a7a1df71a237d51"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004e63ae2881ed60884ef1aef52178a297bdfedf67f4e3c1d876ad10b42c03b5e67f7f8cfaf4dfea4def7ab82fde3ed9b910e2be22bc3fa46a2ed094ebd7c86a9512c8c40cd542fb539c34347ef2be4e7f1543af960fd2347354a7a1df71a237d51",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE5jriiB7WCITvGu9SF4ope9/t9n9OPB2H\natELQsA7Xmf3+M+vTf6k3vergv3j7ZuRDiviK8P6RqLtCU69fIapUSyMQM1UL7U5\nw0NH7yvk5/FUOvlg/SNHNUp6HfcaI31R\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 379,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02304c7d219db9af94ce7fffffffffffffffffffffffffffffffef15cf1058c8d8ba1e634c4122db95ec1facd4bb13ebf09a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e9c415f8a72055239570c3c370cf9380cdfabb6ebdbd8058e2fc65193080707895ea1566eeb26149603f4b4d4c1e79d496ae17a001424d21eae4eaa01067048bcd919625fdd7efd896d980633a0e2ca1f8c9b02c99b69a1e4fa53468a2fe244d",
+        "wx" : "0e9c415f8a72055239570c3c370cf9380cdfabb6ebdbd8058e2fc65193080707895ea1566eeb26149603f4b4d4c1e79d4",
+        "wy" : "096ae17a001424d21eae4eaa01067048bcd919625fdd7efd896d980633a0e2ca1f8c9b02c99b69a1e4fa53468a2fe244d"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004e9c415f8a72055239570c3c370cf9380cdfabb6ebdbd8058e2fc65193080707895ea1566eeb26149603f4b4d4c1e79d496ae17a001424d21eae4eaa01067048bcd919625fdd7efd896d980633a0e2ca1f8c9b02c99b69a1e4fa53468a2fe244d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE6cQV+KcgVSOVcMPDcM+TgM36u269vYBY\n4vxlGTCAcHiV6hVm7rJhSWA/S01MHnnUlq4XoAFCTSHq5OqgEGcEi82RliX91+/Y\nltmAYzoOLKH4ybAsmbaaHk+lNGii/iRN\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 380,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100d219db9af94ce7ffffffffffffffffffffffffffffffffffd189bdb6d9ef7be8504ca374756ea5b8f15e44067d209b9b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04637223a93dd63af6b348f246e7b3bcb30beaa1dcc888af8e12e5086aa00f7792fbe457463c52422d435f430ad1bb4b21f9a1e01758d1e025b162d09d3df8b403226ed3b35e414c41651740d509d8cf6b5e558118607d10669902abebda3ca28d",
+        "wx" : "637223a93dd63af6b348f246e7b3bcb30beaa1dcc888af8e12e5086aa00f7792fbe457463c52422d435f430ad1bb4b21",
+        "wy" : "0f9a1e01758d1e025b162d09d3df8b403226ed3b35e414c41651740d509d8cf6b5e558118607d10669902abebda3ca28d"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004637223a93dd63af6b348f246e7b3bcb30beaa1dcc888af8e12e5086aa00f7792fbe457463c52422d435f430ad1bb4b21f9a1e01758d1e025b162d09d3df8b403226ed3b35e414c41651740d509d8cf6b5e558118607d10669902abebda3ca28d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEY3IjqT3WOvazSPJG57O8swvqodzIiK+O\nEuUIaqAPd5L75FdGPFJCLUNfQwrRu0sh+aHgF1jR4CWxYtCdPfi0AyJu07NeQUxB\nZRdA1QnYz2teVYEYYH0QZpkCq+vaPKKN\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 381,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100a433b735f299cfffffffffffffffffffffffffffffffffffdbb02debbfa7c9f1487f3936a22ca3f6f5d06ea22d7c0dc3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047f4dc23982ecc8b84f54241715c7e94e950f596ce033237639a15fefa5eb5c37cb2e562d6d5b3051ea15600e3341a565fed2b55b89d2793321374887b78827ee4ca2216eac2993b1b095844db76adc560450135c072ac1a2c4167520237fbc9d",
+        "wx" : "7f4dc23982ecc8b84f54241715c7e94e950f596ce033237639a15fefa5eb5c37cb2e562d6d5b3051ea15600e3341a565",
+        "wy" : "0fed2b55b89d2793321374887b78827ee4ca2216eac2993b1b095844db76adc560450135c072ac1a2c4167520237fbc9d"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200047f4dc23982ecc8b84f54241715c7e94e950f596ce033237639a15fefa5eb5c37cb2e562d6d5b3051ea15600e3341a565fed2b55b89d2793321374887b78827ee4ca2216eac2993b1b095844db76adc560450135c072ac1a2c4167520237fbc9d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEf03COYLsyLhPVCQXFcfpTpUPWWzgMyN2\nOaFf76XrXDfLLlYtbVswUeoVYA4zQaVl/tK1W4nSeTMhN0iHt4gn7kyiIW6sKZOx\nsJWETbdq3FYEUBNcByrBosQWdSAjf7yd\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 382,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100b9af94ce7fffffffffffffffffffffffffffffffffffffffd6efeefc876c9f23217b443c80637ef939e911219f96c179",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a0ae8c949f63f1b6a5d024c99e0a296ecd12d196d3b1625d4a76600082a14d455aab267c68f571d89ad0619cb8e476a134634336611e1fd1d728bcea588d0e1b652bbca0e52c1bfbd4387a6337ff41ce13a65c8306915d2a39897b985d909b36",
+        "wx" : "0a0ae8c949f63f1b6a5d024c99e0a296ecd12d196d3b1625d4a76600082a14d455aab267c68f571d89ad0619cb8e476a1",
+        "wy" : "34634336611e1fd1d728bcea588d0e1b652bbca0e52c1bfbd4387a6337ff41ce13a65c8306915d2a39897b985d909b36"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004a0ae8c949f63f1b6a5d024c99e0a296ecd12d196d3b1625d4a76600082a14d455aab267c68f571d89ad0619cb8e476a134634336611e1fd1d728bcea588d0e1b652bbca0e52c1bfbd4387a6337ff41ce13a65c8306915d2a39897b985d909b36",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEoK6MlJ9j8bal0CTJngopbs0S0ZbTsWJd\nSnZgAIKhTUVaqyZ8aPVx2JrQYZy45HahNGNDNmEeH9HXKLzqWI0OG2UrvKDlLBv7\n1Dh6Yzf/Qc4TplyDBpFdKjmJe5hdkJs2\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 383,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100a276276276276276276276276276276276276276276276273d7228d4f84b769be0fd57b97e4c1ebcae9a5f635e80e9df",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047cad1637721f5988cb7967238b1f47fd0b63f30f207a165951fc6fb74ba868e5b462628595edc80f75182e564a89c7a0fc04c405938aab3d6828e72e86bc59a400719270f8ee3cb5ef929ab53287bb308b51abd2e3ffbc3d93b87471bc2e3730",
+        "wx" : "7cad1637721f5988cb7967238b1f47fd0b63f30f207a165951fc6fb74ba868e5b462628595edc80f75182e564a89c7a0",
+        "wy" : "0fc04c405938aab3d6828e72e86bc59a400719270f8ee3cb5ef929ab53287bb308b51abd2e3ffbc3d93b87471bc2e3730"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200047cad1637721f5988cb7967238b1f47fd0b63f30f207a165951fc6fb74ba868e5b462628595edc80f75182e564a89c7a0fc04c405938aab3d6828e72e86bc59a400719270f8ee3cb5ef929ab53287bb308b51abd2e3ffbc3d93b87471bc2e3730",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEfK0WN3IfWYjLeWcjix9H/Qtj8w8gehZZ\nUfxvt0uoaOW0YmKFle3ID3UYLlZKiceg/ATEBZOKqz1oKOcuhrxZpABxknD47jy1\n75KatTKHuzCLUavS4/+8PZO4dHG8Ljcw\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 384,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023073333333333333333333333333333333333333333333333316e4d9f42d4eca22df403a0c578b86f0a9a93fe89995c7ed",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042024ecde0e61262955b0301ae6b0a4fbd7771762feb2de35eed1823d2636c6e001f7bfcdbc4e65b1ea40224090411906d55362a570e80a2126f01d919b608440294039be03419d518b13cca6a1595414717f1b4ddb842b2c9d4f543e683b86a0",
+        "wx" : "2024ecde0e61262955b0301ae6b0a4fbd7771762feb2de35eed1823d2636c6e001f7bfcdbc4e65b1ea40224090411906",
+        "wy" : "0d55362a570e80a2126f01d919b608440294039be03419d518b13cca6a1595414717f1b4ddb842b2c9d4f543e683b86a0"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200042024ecde0e61262955b0301ae6b0a4fbd7771762feb2de35eed1823d2636c6e001f7bfcdbc4e65b1ea40224090411906d55362a570e80a2126f01d919b608440294039be03419d518b13cca6a1595414717f1b4ddb842b2c9d4f543e683b86a0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEICTs3g5hJilVsDAa5rCk+9d3F2L+st41\n7tGCPSY2xuAB97/NvE5lsepAIkCQQRkG1VNipXDoCiEm8B2Rm2CEQClAOb4DQZ1R\nixPMpqFZVBRxfxtN24QrLJ1PVD5oO4ag\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 385,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02307fffffffffffffffffffffffffffffffffffffffffffffffda4233abf824c93f90115e76db206fa7489d6647332e1ba3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0440c5f2608956380c39695c7457ddce0880b5e8fab0a9a3726d0c8535b2ff6ca15814d83ed82c0ab33aba76e05e5c0476c9d15a2a0b2041237ff61c26519d1d74b141d7a4499fbdefc414a900937a8faf6ef560550c73cdb7edfe9314c480bb2b",
+        "wx" : "40c5f2608956380c39695c7457ddce0880b5e8fab0a9a3726d0c8535b2ff6ca15814d83ed82c0ab33aba76e05e5c0476",
+        "wy" : "0c9d15a2a0b2041237ff61c26519d1d74b141d7a4499fbdefc414a900937a8faf6ef560550c73cdb7edfe9314c480bb2b"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000440c5f2608956380c39695c7457ddce0880b5e8fab0a9a3726d0c8535b2ff6ca15814d83ed82c0ab33aba76e05e5c0476c9d15a2a0b2041237ff61c26519d1d74b141d7a4499fbdefc414a900937a8faf6ef560550c73cdb7edfe9314c480bb2b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEQMXyYIlWOAw5aVx0V93OCIC16PqwqaNy\nbQyFNbL/bKFYFNg+2CwKszq6duBeXAR2ydFaKgsgQSN/9hwmUZ0ddLFB16RJn73v\nxBSpAJN6j69u9WBVDHPNt+3+kxTEgLsr\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 386,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02303fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294bb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0474acdfd2ab763c593bca30d248f2bf26f1843acf9eb89b4dfcb8451d59683812cf3cbe9a264ea435912a8969c53d7cb8496dcb0a4efed69b87110fda20e68eb6feed2d5101a4955d43759f10b73e8ffc3131e0c12a765b68bd216ed1ec4f5d2f",
+        "wx" : "74acdfd2ab763c593bca30d248f2bf26f1843acf9eb89b4dfcb8451d59683812cf3cbe9a264ea435912a8969c53d7cb8",
+        "wy" : "496dcb0a4efed69b87110fda20e68eb6feed2d5101a4955d43759f10b73e8ffc3131e0c12a765b68bd216ed1ec4f5d2f"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000474acdfd2ab763c593bca30d248f2bf26f1843acf9eb89b4dfcb8451d59683812cf3cbe9a264ea435912a8969c53d7cb8496dcb0a4efed69b87110fda20e68eb6feed2d5101a4955d43759f10b73e8ffc3131e0c12a765b68bd216ed1ec4f5d2f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEdKzf0qt2PFk7yjDSSPK/JvGEOs+euJtN\n/LhFHVloOBLPPL6aJk6kNZEqiWnFPXy4SW3LCk7+1puHEQ/aIOaOtv7tLVEBpJVd\nQ3WfELc+j/wxMeDBKnZbaL0hbtHsT10v\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 387,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100dfea06865526cea11c0f9eb9512b41fa9581d0f6cb7db9680336151dce79de818cdf33c879da322740416d1e5ae532fa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04da35d6a82818ae5254cb65fc86ac42a47873ab247a5ca664e9f095e8de9a57fe721860e66cbc6bd499431a48a3991734945baab27ca6383737b7dd45023f997aff5e165f0fd7d8e5c0b5f9c5e731588af2fe5bd8976a0b871c132edf21f363af",
+        "wx" : "0da35d6a82818ae5254cb65fc86ac42a47873ab247a5ca664e9f095e8de9a57fe721860e66cbc6bd499431a48a3991734",
+        "wy" : "0945baab27ca6383737b7dd45023f997aff5e165f0fd7d8e5c0b5f9c5e731588af2fe5bd8976a0b871c132edf21f363af"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004da35d6a82818ae5254cb65fc86ac42a47873ab247a5ca664e9f095e8de9a57fe721860e66cbc6bd499431a48a3991734945baab27ca6383737b7dd45023f997aff5e165f0fd7d8e5c0b5f9c5e731588af2fe5bd8976a0b871c132edf21f363af",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE2jXWqCgYrlJUy2X8hqxCpHhzqyR6XKZk\n6fCV6N6aV/5yGGDmbLxr1JlDGkijmRc0lFuqsnymODc3t91FAj+Zev9eFl8P19jl\nwLX5xecxWIry/lvYl2oLhxwTLt8h82Ov\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 388,
+          "comment" : "point duplication during verification",
+          "msg" : "313233343030",
+          "sig" : "3066023100b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60023100e16043c2face20228dba6366e19ecc6db71b918bbe8a890b9dad2fcead184e071c9ac4acaee2f831a1e4cc337994f5ec",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04da35d6a82818ae5254cb65fc86ac42a47873ab247a5ca664e9f095e8de9a57fe721860e66cbc6bd499431a48a39917346ba4554d8359c7c8c84822bafdc0668500a1e9a0f028271a3f4a063a18cea7740d01a4266895f478e3ecd121de0c9c50",
+        "wx" : "0da35d6a82818ae5254cb65fc86ac42a47873ab247a5ca664e9f095e8de9a57fe721860e66cbc6bd499431a48a3991734",
+        "wy" : "6ba4554d8359c7c8c84822bafdc0668500a1e9a0f028271a3f4a063a18cea7740d01a4266895f478e3ecd121de0c9c50"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004da35d6a82818ae5254cb65fc86ac42a47873ab247a5ca664e9f095e8de9a57fe721860e66cbc6bd499431a48a39917346ba4554d8359c7c8c84822bafdc0668500a1e9a0f028271a3f4a063a18cea7740d01a4266895f478e3ecd121de0c9c50",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE2jXWqCgYrlJUy2X8hqxCpHhzqyR6XKZk\n6fCV6N6aV/5yGGDmbLxr1JlDGkijmRc0a6RVTYNZx8jISCK6/cBmhQCh6aDwKCca\nP0oGOhjOp3QNAaQmaJX0eOPs0SHeDJxQ\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 389,
+          "comment" : "duplication bug",
+          "msg" : "313233343030",
+          "sig" : "3066023100b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60023100e16043c2face20228dba6366e19ecc6db71b918bbe8a890b9dad2fcead184e071c9ac4acaee2f831a1e4cc337994f5ec",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04820064193c71c7141fe41e711fe843a7474be6b05f50cb0be411cdf7fc78ea7ec96aeb3991ef7646bbde59152d381a32631c5adf93d488b45e67cc9890d8e779f63960193dc16bd1cc136b3e28cf499dfa8e7bff482a0115e6083987f7c042fc",
+        "wx" : "0820064193c71c7141fe41e711fe843a7474be6b05f50cb0be411cdf7fc78ea7ec96aeb3991ef7646bbde59152d381a32",
+        "wy" : "631c5adf93d488b45e67cc9890d8e779f63960193dc16bd1cc136b3e28cf499dfa8e7bff482a0115e6083987f7c042fc"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004820064193c71c7141fe41e711fe843a7474be6b05f50cb0be411cdf7fc78ea7ec96aeb3991ef7646bbde59152d381a32631c5adf93d488b45e67cc9890d8e779f63960193dc16bd1cc136b3e28cf499dfa8e7bff482a0115e6083987f7c042fc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEggBkGTxxxxQf5B5xH+hDp0dL5rBfUMsL\n5BHN9/x46n7Jaus5ke92RrveWRUtOBoyYxxa35PUiLReZ8yYkNjnefY5YBk9wWvR\nzBNrPijPSZ36jnv/SCoBFeYIOYf3wEL8\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 390,
+          "comment" : "point with x-coordinate 0",
+          "msg" : "313233343030",
+          "sig" : "3035020101023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0452fabc58eacfd3a4828f51c413205c20888941ee45ecac076ffc23145d83542034aa01253d6ebf34eeefaa371d6cee119f340712cd78155712746578f5632ded2b2e5afb43b085f81732792108e331a4b50d27f3578252ffb0daa9d78655a0ab",
+        "wx" : "52fabc58eacfd3a4828f51c413205c20888941ee45ecac076ffc23145d83542034aa01253d6ebf34eeefaa371d6cee11",
+        "wy" : "09f340712cd78155712746578f5632ded2b2e5afb43b085f81732792108e331a4b50d27f3578252ffb0daa9d78655a0ab"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000452fabc58eacfd3a4828f51c413205c20888941ee45ecac076ffc23145d83542034aa01253d6ebf34eeefaa371d6cee119f340712cd78155712746578f5632ded2b2e5afb43b085f81732792108e331a4b50d27f3578252ffb0daa9d78655a0ab",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEUvq8WOrP06SCj1HEEyBcIIiJQe5F7KwH\nb/wjFF2DVCA0qgElPW6/NO7vqjcdbO4RnzQHEs14FVcSdGV49WMt7SsuWvtDsIX4\nFzJ5IQjjMaS1DSfzV4JS/7DaqdeGVaCr\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 391,
+          "comment" : "point with x-coordinate 0",
+          "msg" : "313233343030",
+          "sig" : "3065023101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023033333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a8fdb1a022d4e3a7ee29612bb110acbea27daecb827d344cb6c6a7acad61d371ddc7842147b74a18767e618712f04c1c64ac6daf8e08cd7b90a0c9d9123884c7a7abb4664a75b0897064c3c8956b0ca9c417237f8d5a7dd8421b0d48c9d52c7c",
+        "wx" : "0a8fdb1a022d4e3a7ee29612bb110acbea27daecb827d344cb6c6a7acad61d371ddc7842147b74a18767e618712f04c1c",
+        "wy" : "64ac6daf8e08cd7b90a0c9d9123884c7a7abb4664a75b0897064c3c8956b0ca9c417237f8d5a7dd8421b0d48c9d52c7c"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004a8fdb1a022d4e3a7ee29612bb110acbea27daecb827d344cb6c6a7acad61d371ddc7842147b74a18767e618712f04c1c64ac6daf8e08cd7b90a0c9d9123884c7a7abb4664a75b0897064c3c8956b0ca9c417237f8d5a7dd8421b0d48c9d52c7c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEqP2xoCLU46fuKWErsRCsvqJ9rsuCfTRM\ntsanrK1h03Hdx4QhR7dKGHZ+YYcS8EwcZKxtr44IzXuQoMnZEjiEx6ertGZKdbCJ\ncGTDyJVrDKnEFyN/jVp92EIbDUjJ1Sx8\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 392,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "313233343030",
+          "sig" : "3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023033333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04878e414a5d6a0e0d1ab3c5563c44e80c3b2ef265f27a33ed5cac109ad664c1269beae9031d8d178cbfdb1bfa7cc3cc79fabbb2b6f7ce54026863b0f297a4fe3de82d5044dacafede49d5afc60bc875f4b659c06c19bb74c7c27351687f52b411",
+        "wx" : "0878e414a5d6a0e0d1ab3c5563c44e80c3b2ef265f27a33ed5cac109ad664c1269beae9031d8d178cbfdb1bfa7cc3cc79",
+        "wy" : "0fabbb2b6f7ce54026863b0f297a4fe3de82d5044dacafede49d5afc60bc875f4b659c06c19bb74c7c27351687f52b411"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004878e414a5d6a0e0d1ab3c5563c44e80c3b2ef265f27a33ed5cac109ad664c1269beae9031d8d178cbfdb1bfa7cc3cc79fabbb2b6f7ce54026863b0f297a4fe3de82d5044dacafede49d5afc60bc875f4b659c06c19bb74c7c27351687f52b411",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEh45BSl1qDg0as8VWPEToDDsu8mXyejPt\nXKwQmtZkwSab6ukDHY0XjL/bG/p8w8x5+ruytvfOVAJoY7Dyl6T+PegtUETayv7e\nSdWvxgvIdfS2WcBsGbt0x8JzUWh/UrQR\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 393,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "3064023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048faa8497ae3006b612999b03f91f7884d95543a266598e897b71e44ecfd9abd7908bfd122bb366c016a577cb1b2e2e412bb1a719289c749804ca677d14c0900fab031da8c70724723a0d54e3a0035da7dcddeef6fce80df2f81940817d27b2b5",
+        "wx" : "08faa8497ae3006b612999b03f91f7884d95543a266598e897b71e44ecfd9abd7908bfd122bb366c016a577cb1b2e2e41",
+        "wy" : "2bb1a719289c749804ca677d14c0900fab031da8c70724723a0d54e3a0035da7dcddeef6fce80df2f81940817d27b2b5"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200048faa8497ae3006b612999b03f91f7884d95543a266598e897b71e44ecfd9abd7908bfd122bb366c016a577cb1b2e2e412bb1a719289c749804ca677d14c0900fab031da8c70724723a0d54e3a0035da7dcddeef6fce80df2f81940817d27b2b5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEj6qEl64wBrYSmZsD+R94hNlVQ6JmWY6J\ne3HkTs/Zq9eQi/0SK7NmwBald8sbLi5BK7GnGSicdJgEymd9FMCQD6sDHajHByRy\nOg1U46ADXafc3e72/OgN8vgZQIF9J7K1\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 394,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3064023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df6102302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c59cc648629e62dc1855f653583da0ace631e0f4b4589b7fe5cc449e12df2dceeb862cae00cd100233b999af657ae16cb138f659dcc8d342fd17664d86c5bddaa866c20b0031f65c8442a0ed62b337d09adb63a443ab14e3587b9299053717f9",
+        "wx" : "0c59cc648629e62dc1855f653583da0ace631e0f4b4589b7fe5cc449e12df2dceeb862cae00cd100233b999af657ae16c",
+        "wy" : "0b138f659dcc8d342fd17664d86c5bddaa866c20b0031f65c8442a0ed62b337d09adb63a443ab14e3587b9299053717f9"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004c59cc648629e62dc1855f653583da0ace631e0f4b4589b7fe5cc449e12df2dceeb862cae00cd100233b999af657ae16cb138f659dcc8d342fd17664d86c5bddaa866c20b0031f65c8442a0ed62b337d09adb63a443ab14e3587b9299053717f9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAExZzGSGKeYtwYVfZTWD2grOYx4PS0WJt/\n5cxEnhLfLc7rhiyuAM0QAjO5ma9leuFssTj2WdzI00L9F2ZNhsW92qhmwgsAMfZc\nhEKg7WKzN9Ca22OkQ6sU41h7kpkFNxf5\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 395,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3064023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df6102306666666666666666666666666666666666666666666666664fc15233fb49458c89a4057a8379dc9791f80a2ab84edd61",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04386bdc98fe3c156a790eee6d556e0036a4b84853358bd5ab6856db5985b9e8ea92e8d4c1f8d04ecd1e6de4548bf288215503292c2c570f57b42f2caf5e7ab94d87817a800b2af6ffcd4f13e30edb8caaf23c6d5be22abea18c2f9450ad1a4715",
+        "wx" : "386bdc98fe3c156a790eee6d556e0036a4b84853358bd5ab6856db5985b9e8ea92e8d4c1f8d04ecd1e6de4548bf28821",
+        "wy" : "5503292c2c570f57b42f2caf5e7ab94d87817a800b2af6ffcd4f13e30edb8caaf23c6d5be22abea18c2f9450ad1a4715"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004386bdc98fe3c156a790eee6d556e0036a4b84853358bd5ab6856db5985b9e8ea92e8d4c1f8d04ecd1e6de4548bf288215503292c2c570f57b42f2caf5e7ab94d87817a800b2af6ffcd4f13e30edb8caaf23c6d5be22abea18c2f9450ad1a4715",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEOGvcmP48FWp5Du5tVW4ANqS4SFM1i9Wr\naFbbWYW56OqS6NTB+NBOzR5t5FSL8oghVQMpLCxXD1e0LyyvXnq5TYeBeoALKvb/\nzU8T4w7bjKryPG1b4iq+oYwvlFCtGkcV\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 396,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3065023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df6102310099999999999999999999999999999999999999999999999977a1fb4df8ede852ce760837c536cae35af40f4014764c12",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04294c37b3ec91a1b0500042d8b97bc9619d17f784a9ea528c0602d700783bfbac9ac49bff1e527b39bb2a49d1dc3abd471e798679b7c58f4dfa33cfe40bb62e7df6d2f190b0f3804c700fa19eba28ad7fd6edd7e3a754af852921c2705f444f0b",
+        "wx" : "294c37b3ec91a1b0500042d8b97bc9619d17f784a9ea528c0602d700783bfbac9ac49bff1e527b39bb2a49d1dc3abd47",
+        "wy" : "1e798679b7c58f4dfa33cfe40bb62e7df6d2f190b0f3804c700fa19eba28ad7fd6edd7e3a754af852921c2705f444f0b"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004294c37b3ec91a1b0500042d8b97bc9619d17f784a9ea528c0602d700783bfbac9ac49bff1e527b39bb2a49d1dc3abd471e798679b7c58f4dfa33cfe40bb62e7df6d2f190b0f3804c700fa19eba28ad7fd6edd7e3a754af852921c2705f444f0b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEKUw3s+yRobBQAELYuXvJYZ0X94Sp6lKM\nBgLXAHg7+6yaxJv/HlJ7ObsqSdHcOr1HHnmGebfFj036M8/kC7YuffbS8ZCw84BM\ncA+hnroorX/W7dfjp1SvhSkhwnBfRE8L\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 397,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3065023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61023100db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6aae76701acc1950894a89e068772d8b281eef136f8a8fef5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bac7cd8a7755a174fab58e5374ec55a5ce5313235ec51c919c6684bd49305b7005393f72bc4d810ca864fb046d2c83415a33b77f4145680bde63b669ea1f10f3ee1836018c11a6f97155d90827c83dbac388402ac8f59368ddaf2c33548611af",
+        "wx" : "0bac7cd8a7755a174fab58e5374ec55a5ce5313235ec51c919c6684bd49305b7005393f72bc4d810ca864fb046d2c8341",
+        "wy" : "5a33b77f4145680bde63b669ea1f10f3ee1836018c11a6f97155d90827c83dbac388402ac8f59368ddaf2c33548611af"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004bac7cd8a7755a174fab58e5374ec55a5ce5313235ec51c919c6684bd49305b7005393f72bc4d810ca864fb046d2c83415a33b77f4145680bde63b669ea1f10f3ee1836018c11a6f97155d90827c83dbac388402ac8f59368ddaf2c33548611af",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEusfNindVoXT6tY5TdOxVpc5TEyNexRyR\nnGaEvUkwW3AFOT9yvE2BDKhk+wRtLINBWjO3f0FFaAveY7Zp6h8Q8+4YNgGMEab5\ncVXZCCfIPbrDiEAqyPWTaN2vLDNUhhGv\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 398,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "3064023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df6102300eb10e5ab95f2f26a40700b1300fb8c3e754d5c453d9384ecce1daa38135a48a0a96c24efc2a76d00bde1d7aeedf7f6a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04984a1c04446a52ad6a54d64f2c6c49b61f23abe7dc6f33714896aefb0befb9a52b95b048561132c28c9850e851a6d00eb4e19f9de59d30ca26801f2789a3330b081e6bf57f84f3c6107defd05a959cef5f298acea5a6b87b38e22c5409ec9f71",
+        "wx" : "0984a1c04446a52ad6a54d64f2c6c49b61f23abe7dc6f33714896aefb0befb9a52b95b048561132c28c9850e851a6d00e",
+        "wy" : "0b4e19f9de59d30ca26801f2789a3330b081e6bf57f84f3c6107defd05a959cef5f298acea5a6b87b38e22c5409ec9f71"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004984a1c04446a52ad6a54d64f2c6c49b61f23abe7dc6f33714896aefb0befb9a52b95b048561132c28c9850e851a6d00eb4e19f9de59d30ca26801f2789a3330b081e6bf57f84f3c6107defd05a959cef5f298acea5a6b87b38e22c5409ec9f71",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEmEocBERqUq1qVNZPLGxJth8jq+fcbzNx\nSJau+wvvuaUrlbBIVhEywoyYUOhRptAOtOGfneWdMMomgB8niaMzCwgea/V/hPPG\nEH3v0FqVnO9fKYrOpaa4ezjiLFQJ7J9x\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 399,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "3065023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f00d6327b1226eaa1b0897295eeddadf7510249e6f0f811b57d7197eb6e61199a8f1c6665ec4821d3e18675d5399fdf787bf1e3fb7fee5cb3582a4159808b75e8b1de07eaffd49d3882d15c77443ad83213d21a4be9285223aa44a840e47eb56",
+        "wx" : "0f00d6327b1226eaa1b0897295eeddadf7510249e6f0f811b57d7197eb6e61199a8f1c6665ec4821d3e18675d5399fdf7",
+        "wy" : "087bf1e3fb7fee5cb3582a4159808b75e8b1de07eaffd49d3882d15c77443ad83213d21a4be9285223aa44a840e47eb56"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004f00d6327b1226eaa1b0897295eeddadf7510249e6f0f811b57d7197eb6e61199a8f1c6665ec4821d3e18675d5399fdf787bf1e3fb7fee5cb3582a4159808b75e8b1de07eaffd49d3882d15c77443ad83213d21a4be9285223aa44a840e47eb56",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE8A1jJ7EibqobCJcpXu3a33UQJJ5vD4Eb\nV9cZfrbmEZmo8cZmXsSCHT4YZ11Tmf33h78eP7f+5cs1gqQVmAi3Xosd4H6v/UnT\niC0Vx3RDrYMhPSGkvpKFIjqkSoQOR+tW\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 400,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3065023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab702302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04452b047743346898b087daaac5d982d378752ba534e569f21ac592c09654d0809b94ccf822045f2885cbd3b221453cd668a01f502f551af14aab35c2c30ec7bac0709f525fe7960439b1e9de53cdad245efd8930967cde6caf8d222c8200cd69",
+        "wx" : "452b047743346898b087daaac5d982d378752ba534e569f21ac592c09654d0809b94ccf822045f2885cbd3b221453cd6",
+        "wy" : "68a01f502f551af14aab35c2c30ec7bac0709f525fe7960439b1e9de53cdad245efd8930967cde6caf8d222c8200cd69"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004452b047743346898b087daaac5d982d378752ba534e569f21ac592c09654d0809b94ccf822045f2885cbd3b221453cd668a01f502f551af14aab35c2c30ec7bac0709f525fe7960439b1e9de53cdad245efd8930967cde6caf8d222c8200cd69",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAERSsEd0M0aJiwh9qqxdmC03h1K6U05Wny\nGsWSwJZU0ICblMz4IgRfKIXL07IhRTzWaKAfUC9VGvFKqzXCww7HusBwn1Jf55YE\nObHp3lPNrSRe/YkwlnzebK+NIiyCAM1p\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 401,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3065023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab702306666666666666666666666666666666666666666666666664fc15233fb49458c89a4057a8379dc9791f80a2ab84edd61",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0444a8f54795bdb81e00fc84fa8373d125b16da6e2bf4cfa9ee1dc13d7f157394683963c170f4c15e8cf21b5466b49fa72bb5693655b3e0a85e27e3e6d265fba0131f3083bf447f62b6e3e5275496f34daa522e16195d81488a31fe982c2b75f16",
+        "wx" : "44a8f54795bdb81e00fc84fa8373d125b16da6e2bf4cfa9ee1dc13d7f157394683963c170f4c15e8cf21b5466b49fa72",
+        "wy" : "0bb5693655b3e0a85e27e3e6d265fba0131f3083bf447f62b6e3e5275496f34daa522e16195d81488a31fe982c2b75f16"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000444a8f54795bdb81e00fc84fa8373d125b16da6e2bf4cfa9ee1dc13d7f157394683963c170f4c15e8cf21b5466b49fa72bb5693655b3e0a85e27e3e6d265fba0131f3083bf447f62b6e3e5275496f34daa522e16195d81488a31fe982c2b75f16",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAERKj1R5W9uB4A/IT6g3PRJbFtpuK/TPqe\n4dwT1/FXOUaDljwXD0wV6M8htUZrSfpyu1aTZVs+CoXifj5tJl+6ATHzCDv0R/Yr\nbj5SdUlvNNqlIuFhldgUiKMf6YLCt18W\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 402,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3066023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab702310099999999999999999999999999999999999999999999999977a1fb4df8ede852ce760837c536cae35af40f4014764c12",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0410b336b3afb80c80ff50716e734110fe83cd5b8d41d7f2f94f0dec7ecf1facc663babb8ed94e4bdf3592e37464970afa9be144d354e9b456873c6387a12a3eefd3e2feb66f7519ac72ac502c09d20d72cae9d04c88549a285c081023e1c1da08",
+        "wx" : "10b336b3afb80c80ff50716e734110fe83cd5b8d41d7f2f94f0dec7ecf1facc663babb8ed94e4bdf3592e37464970afa",
+        "wy" : "09be144d354e9b456873c6387a12a3eefd3e2feb66f7519ac72ac502c09d20d72cae9d04c88549a285c081023e1c1da08"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000410b336b3afb80c80ff50716e734110fe83cd5b8d41d7f2f94f0dec7ecf1facc663babb8ed94e4bdf3592e37464970afa9be144d354e9b456873c6387a12a3eefd3e2feb66f7519ac72ac502c09d20d72cae9d04c88549a285c081023e1c1da08",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEELM2s6+4DID/UHFuc0EQ/oPNW41B1/L5\nTw3sfs8frMZjuruO2U5L3zWS43Rklwr6m+FE01TptFaHPGOHoSo+79Pi/rZvdRms\ncqxQLAnSDXLK6dBMiFSaKFwIECPhwdoI\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 403,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3066023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7023100db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6aae76701acc1950894a89e068772d8b281eef136f8a8fef5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0481f92630778777a01781e7924fced35fc09018d9b00820881b14a814c1836a1f73c3641f7a17c821ffd95da902efe132221d81323509391f7b61bd796011337e6af36ae0798c17043d79e8efcdae8e724adf96a2309207c2d2cfd88e8c483acb",
+        "wx" : "081f92630778777a01781e7924fced35fc09018d9b00820881b14a814c1836a1f73c3641f7a17c821ffd95da902efe132",
+        "wy" : "221d81323509391f7b61bd796011337e6af36ae0798c17043d79e8efcdae8e724adf96a2309207c2d2cfd88e8c483acb"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000481f92630778777a01781e7924fced35fc09018d9b00820881b14a814c1836a1f73c3641f7a17c821ffd95da902efe132221d81323509391f7b61bd796011337e6af36ae0798c17043d79e8efcdae8e724adf96a2309207c2d2cfd88e8c483acb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEgfkmMHeHd6AXgeeST87TX8CQGNmwCCCI\nGxSoFMGDah9zw2QfehfIIf/ZXakC7+EyIh2BMjUJOR97Yb15YBEzfmrzauB5jBcE\nPXno782ujnJK35aiMJIHwtLP2I6MSDrL\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 404,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "3065023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab702300eb10e5ab95f2f26a40700b1300fb8c3e754d5c453d9384ecce1daa38135a48a0a96c24efc2a76d00bde1d7aeedf7f6a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f",
+        "wx" : "0aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7",
+        "wy" : "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEqofKIr6LBTeOscce8yCtdG4dO2KLp5uY\nWfdB4IJUKjhVAvJdv1UpbDpUXjhydgq3NhfeSpYmLG9dnpi/kpLcKfj0Hb0omhR8\n6doxE7XwuMAKYLHOHX6BnXpDHXyQ6g5f\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 405,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3064023043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158ca02302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 406,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3065023100bc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d322ff6d1d1162b5de29edcd0b69803fe2f8af8e3d103d0a902302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7c9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0",
+        "wx" : "0aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7",
+        "wy" : "0c9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7c9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEqofKIr6LBTeOscce8yCtdG4dO2KLp5uY\nWfdB4IJUKjhVAvJdv1UpbDpUXjhydgq3yeghtWnZ05CiYWdAbW0j1gcL4kLXZeuD\nFiXO7EoPRz71n04w4oF+YoW84oRvFfGg\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 407,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3064023043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158ca02302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 408,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3065023100bc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d322ff6d1d1162b5de29edcd0b69803fe2f8af8e3d103d0a902302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0429bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc9a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3",
+        "wx" : "29bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc",
+        "wy" : "09a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000429bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc9a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEKb23bV+nQb/XAjPLOmbMfUS+s7BmPZKo\nE2ZQR4vO+2HvGC4VWlQ0Wl6OXojwZOW8mlJat/dk2tPa4UaMK0GfO2K5upF9XoxP\nsexHQEo/x2R0snEwgb6dtMAOBDran8Sj\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 409,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "306402302290c886bbad8f53089583d543a269a727665626d6b94a3796324c62d08988f66f6011e845811a03589e92abe1f17faf023066e2cb4380997f4e7f85022541adb22d24d1196be68a3db888b03eb3d2d40b0d9a3a6a00a1a4782ee0a00e8410ba2d86",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 410,
+          "comment" : "pseudorandom signature",
+          "msg" : "4d7367",
+          "sig" : "30650231008071d8cf9df9efef696ebafc59f74db90c1f1ecf5ccde18858de22fe4d7df2a25cb3001695d706dfd7984b39df65a0f4023027291e6339c2a7fed7a174bb97ffe41d8cfdc20c1260c6ec85d7259f0cc7781bf2ae7a6e6fb4c08e0d75b7381bb7d9b8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 411,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "30650230470014ccd7a1a5e5333d301c8ea528ac3b07b01944af30cec60f4bad94db108509e45ba381818b5bdfaf9daf0d372301023100e3d49d6a05a755aa871d7cb96fffb79fed7625f83f69498ba07c0d65166a67107c9a17ae6e1028e244377a44096217b2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 412,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "30640230377044d343f900175ac6833071be74964cd636417039e10e837da94b6919bffc3f5a517b945a450852af3259f5cbf108023032ea25006375c153581e80c09f53ad585c736f823c70147aba4fb47bb0a224fae4d8819adad80d4c144ecc2380954a9e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aacacbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1",
+        "wx" : "0ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aac",
+        "wy" : "0acbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aacacbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE/////6pj8aI5rHAZfG6/zqV1bcASEj+C\nxR+odNZgKL4A6XahCAYGc3zHXEC9/kqsrL2FOJCIpipjmDhMIrUtSS8j9G5KJ6Ry\nStVVUdpcSDQ4CVokfLDDN48fUsNCX/nx\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 413,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3066023100ccb13c4dc9805a9b4e06ee25ef8c7593eaff7326c432d4b12b923163cf1cbe5fe1cfd3546c1d0761d8874e83ffd2e15d023100db1b0c082ae314b539f05e8a14ad51e5db37f29cacea9b2aab63a04917d58d008cf3f7ba41d5ea280f3b6a67be3ae8f8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 414,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3065023100c79a30e36d2126b348dd9eb2f5db6aa98f79d80214027e51bcf3cabec188a7ebaf25cb7bbe9ec6bfed135e2a3b70e9160230241338ee2ac931adea9a56e7bfe909947128d54d5122a47b00c278e684e10102740d26e89e343290a5b2fa8b401faec6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 415,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "306402300df82e4ec2960e3df614f8b49cec9a4ee1054365414241361feec9d9d9b6909d8775f222ec385a14afab46266db390c302300968485e854addba0f8354e677e955e1ef2df973d564c49f65f2562cb2a2b80d75e92f8784042955f7b8765f609ce221",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000",
+        "wx" : "0d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422",
+        "wy" : "0c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE0YJ/xvbxLyGZLFpAmgZTsSHS7wKysKsB\nqRYc6VYoB0Cx41ayVXAbCm3cnsLKipQixu1dLO2NirdWD6W7iMc450VBiD2KKxwO\nK6fjbQMPxNm/uLIvJNuJfrrEndQAAAAA\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 416,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "306402301fafd83d728422e1485f1e52e5b631548647cc3c76c109c3177a73751d91a19012fa4628b218f2229fc4d55f105fe00102304474f9af7b4b0bb96fdb05ae918f799024e8d5b864e49ccd047cf97e7b9f8763cce015c11cf1f461c9027cb901055101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 417,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3066023100e6025bb957ab197fb4c080d0a5c647e428afb0d7cc235c605ae97545494fd31a9979790bb2da6e1cf186789422b15c970231008ae9872291430d1bb371ef72360dad5afbb6fb001f403d9aaa1445f0326eb1eef775c9dfe1d7ef8bf4e744822108d27e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 418,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3066023100877d5567c18fa568259005a89c2300d1b3825b732fa14964c1477d4b3098afd09384b97d497464adba41e9df8a74d339023100c40f0760717b4b3bae75742b6dc3dcf04cc22a449cfea19d305e0658cb705fda75163e7399e0b3125ca7d1919c13851e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557",
+        "wx" : "1099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000",
+        "wy" : "0e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200041099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEEJm7RRAPVfWoXMo94rO9XiUPT2+tZjGj\nFWwuUqM9fWFd0nn3n4tLr/fHE6wAAAAA5sm3NqiSny7Xvgx1OlTLtIuEaeBBHq+T\npKgkWboLaBu6j1+zg7SQbUkBozA+LxVX\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 419,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3065023100e706b0045a6f54bd175e2437b48767b0204f93d8a4d9d3d00838278137e5b670de4305c5c55e49059b8b5f6e264654c90230405741adff94afd9a88e08d0b1021911fa4cedb2466b1a8fd302a5b5d96566ada63ccb82b6c5e8452fde860c545e0a19",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 420,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "306502300c57ce2bc579fbd3a759dfbf5e84c3cef2414846a2e300453e1e4c5188f24432b14ca647a733b6ad35c980a880d36145023100f12a119e22d48b82049df611f1c851fb22795056498a873c730fcb9fd8f314728de0298b9b22c348abc6de2aba97e972",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 421,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "30660231009a8f80697ccf2e0617612027d861a3a3a657fb75cc82810b40dd5072d39ff37eca29008390da356137e2c9babd814198023100a86537a83c3d57da50e4b29b47dcc3717c5a1ed0fff18ade8dcce4220eac63aab60b9bfed5f1bdd241dab655a9bdd75f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04000000002b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98",
+        "wx" : "2b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69",
+        "wy" : "0d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004000000002b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEAAAAACsInt11QWkBAUXyY/M0/BZ8wZ2u\ngiWXCuGcyMt+xzWT1qRlw3D1R4sOU51p0ZUdWXtWpnNFrLJYCVgfB80Ot42VOKP4\npl8wDmih63hQffdt5lDo+O5jpfDFaHyY\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 422,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "306602310093718f6f8542725f62de7039fc193d3fcc81d622230ccc94e9e265390b385af3a3ba50c91a9d6a5b1e07d79af2bd80b2023100d08499f3d298e8afecea122265a36dbf337259020654739783c8ec8ef783d072555b5907285ce83fc8ced9c8398c6269",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 423,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3066023100ce26e42c490dec92cf59d6b1ba75c9a1400d6e5c3fd7c47e1eeb1cded30a3a3d18c81cdfdcbad2742a97293369ce21c202310094671085d941fd27d495452a4c8559a1fe24f3225f5b8ef75faf9d3fb01372c586e23b82714359d0e47144ff5d946161",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 424,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3066023100ffc4738acf71f04a13104c328c138b331fb7202aef66f583ba543ed490d12993c18f724c81ad0f7ea18dae352e5c6480023100e67d4ccdeb68a9a731f06f77eae00175be076d92529b109a62542692c8749ddfde03bed1c119a5901a4e852f2115578f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b33600000000208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4",
+        "wx" : "0fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336",
+        "wy" : "208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b33600000000208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE+wG6rV8Lj3m5zRBNEqq5MQFGrdfWtMAi\n2HrmcRF4uU1hjKezrxOFSxxYiHnod7M2AAAAACCLP1rTs5N6zJ1gbMXs7KtKcB91\n7UKVfqTXhY0z9cJsauIKnMzaVplnANa0\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 425,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3065023100e6fa8455bc14e730e4ca1eb5faf6c8180f2f231069b93a0bb17d33ad5513d93a36214f5ce82ca6bd785ccbacf7249a4c02303979b4b480f496357c25aa3fc850c67ff1c5a2aabd80b6020d2eac3dd7833cf2387d0be64df54a0e9b59f12c3bebf886",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 426,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "306502301b49b037783838867fbaa57305b2aa28df1b0ec40f43140067fafdea63f87c02dfb0e6f41b760fbdf51005e90c0c3715023100e7d4eb6ee61611264ea8a668a70287e3d63489273da2b30ad0c221f1893feaea3e878c9a81c6cec865899dbda4fa79ae",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 427,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "306502310091d9da3d577408189dcaae33d95ed0a0118afd460d5228fa352b6ea671b172eb413816a70621ddaf23c5e2ef79df0c110230053dadbfcd564bddbe44e0ecb4d1e608dbd35d4e83b6634cc72afb87a2d61675ee13960c243f6be70519e167b1d3ceb0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b",
+        "wx" : "0fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336",
+        "wy" : "0ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE+wG6rV8Lj3m5zRBNEqq5MQFGrdfWtMAi\n2HrmcRF4uU1hjKezrxOFSxxYiHnod7M2/////990wKUsTGyFM2KfkzoTE1S1j+CK\nEr1qgVsoenHMCj2SlR31YzMlqWeY/ylL\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 428,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3065023100af0ed6ce6419662db80f02a2b632675445c7bf8a34bbacdc81cc5dd306c657ca4c5a3fb1b05f358d8f36fda8ae238806023046b472c0badb17e089c8f9697fd0b4ce71f0f4471b235483d4c8dd3d00aa282cde990253df38ba733b2ad82a601c7508",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 429,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3066023100e2aa9468ccaaadad8b9f43a429c97f0c6a7eedcb4d4af72d639df0fe53f610b953408a8e24e8db138551770750680f7a023100d81020846d1c50ee9ae23601dd638cb71b38d37fb555268c2fa1ad8a761fa7b27afcab2fa69224d1f976699914e09de2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 430,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "306402306bf6fa7a663802c3382cc5fd02004ec71e5a031e3d9bfc0858fa994e88497a7782308bc265b8237a6bbbdd38658b36fc02303a9d5941a013bf70d99cc3ff255ce85573688dac40344b5db7144b19bf57bb2701e6850a8f819796b67f7d0b6aea7e50",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdsa_secp521r1_sha512_test.json b/third_party/wycheproof/testvectors/ecdsa_secp521r1_sha512_test.json
new file mode 100644
index 0000000..804269a
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdsa_secp521r1_sha512_test.json
@@ -0,0 +1,4802 @@
+{
+  "algorithm" : "ECDSA",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "BER" : "This is a signature with correct values for (r, s) but using some alternative BER encoding instead of DER encoding. Implementations should not accept such signatures to limit signature malleability.",
+    "EdgeCase" : "Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA implementation does not check boundaries and computes s^(-1)==0.",
+    "MissingZero" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.",
+    "PointDuplication" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission."
+  },
+  "numberOfTests" : 430,
+  "header" : [],
+  "testGroups" : [
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04005c6457ec088d532f482093965ae53ccd07e556ed59e2af945cd8c7a95c1c644f8a56a8a8a3cd77392ddd861e8a924dac99c69069093bd52a52fa6c56004a074508007878d6d42e4b4dd1e9c0696cb3e19f63033c3db4e60d473259b3ebe079aaf0a986ee6177f8217a78c68b813f7e149a4e56fd9562c07fed3d895942d7d101cb83f6",
+        "wx" : "5c6457ec088d532f482093965ae53ccd07e556ed59e2af945cd8c7a95c1c644f8a56a8a8a3cd77392ddd861e8a924dac99c69069093bd52a52fa6c56004a074508",
+        "wy" : "7878d6d42e4b4dd1e9c0696cb3e19f63033c3db4e60d473259b3ebe079aaf0a986ee6177f8217a78c68b813f7e149a4e56fd9562c07fed3d895942d7d101cb83f6"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004005c6457ec088d532f482093965ae53ccd07e556ed59e2af945cd8c7a95c1c644f8a56a8a8a3cd77392ddd861e8a924dac99c69069093bd52a52fa6c56004a074508007878d6d42e4b4dd1e9c0696cb3e19f63033c3db4e60d473259b3ebe079aaf0a986ee6177f8217a78c68b813f7e149a4e56fd9562c07fed3d895942d7d101cb83f6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAXGRX7AiNUy9IIJOWWuU8zQflVu1Z\n4q+UXNjHqVwcZE+KVqioo813OS3dhh6Kkk2smcaQaQk71SpS+mxWAEoHRQgAeHjW\n1C5LTdHpwGlss+GfYwM8PbTmDUcyWbPr4Hmq8KmG7mF3+CF6eMaLgT9+FJpOVv2V\nYsB/7T2JWULX0QHLg/Y=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "signature malleability",
+          "msg" : "313233343030",
+          "sig" : "30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024201d74a2f6d95be8d4cb64f02d16d6b785a1246b4ebd206dc596818bb953253245f5a27a24a1aae1e218fdccd8cd7d4990b666d4bf4902b84fdad123f941fe906d948",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "valid",
+          "msg" : "313233343030",
+          "sig" : "30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3082008602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 4,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "308188028200414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 5,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450282004128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 6,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "308702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "308502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "30818602424e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "30818602404e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024228b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3085010000008602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "30818b028501000000414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "30818b02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450285010000004128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "308901000000000000008602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "30818f02890100000000000000414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "30818f02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645028901000000000000004128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30847fffffff02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30818a02847fffffff4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864502847fffffff28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3084ffffffff02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "30818a0284ffffffff4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450284ffffffff28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3085ffffffffff02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "30818b0285ffffffffff4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "30818b02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450285ffffffffff28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3088ffffffffffffffff02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "30818e0288ffffffffffffffff4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "30818e02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450288ffffffffffffffff28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30ff02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30818602ff4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864502ff28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "30818602804e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645028028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "308188000002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30818c49817730818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30818b250030818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30818930818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30818b224649817702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30818a2245250002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30818e224302414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450004deadbeef024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30818b02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452246498177024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864522452500024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30818e02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452243024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30818faa00bb00cd0030818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30818daa02aabb30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30818e2249aa00bb00cd0002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30818c2247aa02aabb02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30818e02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452249aa00bb00cd00024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30818c02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452247aa02aabb024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "308030818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "30818a228002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450000024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452280024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "308031818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "30818a228003414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450000024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86452280034128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2e818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2f818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "31818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "32818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "ff818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "30818b300102308185414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "30818502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "308185414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 75,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac105000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "308002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "308188300002414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac13000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "30818930818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "304302414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "3081c902414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "3081870281414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 86,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864502814128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 87,
+          "comment" : "removing integer",
+          "msg" : "313233343030",
+          "sig" : "3043024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "304402024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "304402414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864502",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "30818802434e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450000024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024328b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "308188024300004e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 93,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450243000028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 94,
+          "comment" : "appending unused 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450000024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "30818802434e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450500024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "30818802414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024328b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac10500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "30450281024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "304502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450281",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "30450500024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "304502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "30818600414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "30818601414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "30818603414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "30818604414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "308186ff414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645004128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645014128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645034128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645044128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645ff4128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "30450200024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "30818a224502014e02404223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "30818a02414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864522450201280240b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "30818602414c4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864502412ab5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86c5024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318a41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "30818502404e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "30818502404223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "30818502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024028b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "30818502414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450240b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "3081870242ff4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450242ff28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "3046090180024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "304602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645090180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "3046020100024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "304602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645020100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3081870242024e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbe97b3367122fa4a20584c271233f3ec3b7f7b31b0faa4d340b92a6b0d5cd17ea4e024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3081870242fe4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbf4d826580ab145752e852a6e91512b78178047879e9714a4ae1bc74298aaa7223c024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3081860241b1bddc11bc17347621c4ecc6003d861a7d07d3854f08e4421bc241c8b538a00410d65320718f8af465fb099025b7cae2184402aea8df4f13a328c90648c42079bb024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "308187024201b1bddc11bc17347621c4ecc6003d861a7d07d3854f08e4421bc241c8b538a0040b27d9a7f54eba8ad17ad5916eaed487e87fb8786168eb5b51e438bd675558ddc4024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3081870242fdb1bddc11bc17347621c4ecc6003d861a7d07d3854f08e4421bc241c8b538a0041684cc98edd05b5dfa7b3d8edcc0c13c48084ce4f055b2cbf46d594f2a32e815b2024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3081870242024e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3081870242fe4e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "308187024201b1bddc11bc17347621c4ecc6003d861a7d07d3854f08e4421bc241c8b538a00410d65320718f8af465fb099025b7cae2184402aea8df4f13a328c90648c42079bb024128b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864502420228b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba09a7b6ac4ecd0410b4722ca75ba197a403a0a1f9ee0e7b391b0649fda1d3969eeca",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450242fe28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a5d85db5e551e1de70233273282b66f49992b40b6fd47b0252edc06be016f926b8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30818602414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450241d74a2f6d95be8d4cb64f02d16d6b785a1246b4ebd206dc596818bb953253245f5fd61bc296eeee8b245d018b8edd8f659631962ad7a1e8b5fe56cfdd0157ce753f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450242fdd74a2f6d95be8d4cb64f02d16d6b785a1246b4ebd206dc596818bb953253245f6584953b132fbef4b8dd358a45e685bfc5f5e0611f184c6e4f9b6025e2c6961136",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf864502420228b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf86450242fe28b5d0926a4172b349b0fd2e929487a5edb94b142df923a697e7446acdacdba0a029e43d69111174dba2fe747122709a69ce69d5285e174a01a93022fea8318ac1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30818702414e4223ee43e8cb89de3b1339ffc279e582f82c7ab0f71bbde43dbe374ac75ffbef29acdf8e70750b9a04f66fda48351de7bbfd515720b0ec5cd736f9b73bdf8645024201d74a2f6d95be8d4cb64f02d16d6b785a1246b4ebd206dc596818bb953253245f5fd61bc296eeee8b245d018b8edd8f659631962ad7a1e8b5fe56cfdd0157ce753f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3047020100024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3047020100024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3047020100024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3047020100024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30470201000242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3047020101024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3047020101024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3047020101024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3047020101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30470201010242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020101090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30470201ff024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30470201ff024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30470201ff024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30470201ff024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30470201ff0242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30080201ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913864090201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913864090242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3049024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913864080201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913864080242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3049024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a0242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3049024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3047024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3047024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3047024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308188024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308188024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308188024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308188024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "308188024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3049024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30470242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30470242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "304702420200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3081880242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386409",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3081880242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386408",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3081880242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3081880242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30818802420200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30490242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "Edge case for Shamir multiplication",
+          "msg" : "39353032",
+          "sig" : "308187024200b4b10646a668c385e1c4da613eb6592c0976fc4df843fc446f20673be5ac18c7d8608a943f019d96216254b09de5f20f3159402ced88ef805a4154f780e093e044024165cd4e7f2d8b752c35a62fc11a4ab745a91ca80698a226b41f156fb764b79f4d76548140eb94d2c477c0a9be3e1d4d1acbf9cf449701c10bd47c2e3698b3287934",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "special case hash",
+          "msg" : "33393439313934313732",
+          "sig" : "308188024201209e6f7b6f2f764261766d4106c3e4a43ac615f645f3ef5c7139651e86e4a177f9c2ab68027afbc6784ccb78d05c258a8b9b18fb1c0f28be4d024da90738fbd374024201ade5d2cb6bf79d80583aeb11ac3254fc151fa363305508a0f121457d00911f8f5ef6d4ec27460d26f3b56f4447f434ff9abe6a91e5055e7fe7707345e562983d64",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "special case hash",
+          "msg" : "35333637363431383737",
+          "sig" : "308188024201c0832c973a455cac48a4439659aa21146036c52ec1514121c66714348a1c0e2c7099a2466d9acb49325a0cb509e5dff2efbcd90369d3027cbb7dca58a134278d05024200a426c063ab5cc6af20dd1ba8a519fac910183561598e67c0929e25f9c3aaeb245c5647fba21e30c103304dc6f49e6dec68a7833533e4e5448240bde023fe201eb9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "special case hash",
+          "msg" : "35363731343831303935",
+          "sig" : "30818702410d01cde64dda4dbcef1a9b924779598217b97eb688d9b4a4fd20d1b81ff0bb870abff1b0db6dfc3762f27c3954f230a7933d9ea397a972caac5ed2183ec72716c7024201c6530fb6b913005f81e156be89b3847701829fbb310d8a4c761212c6d2f8750174f2bf81c238fdde4370fa87de320f57dbed96691af45cb99f3daa865edcdda59e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "special case hash",
+          "msg" : "3131323037313732393039",
+          "sig" : "308187024200c009c74ec707252325d78f4e7f14be28f56272be17c0c18c90ad4c07322cef4eea444c8feabf41a213e3e846f8ac8bb7750d49143069cd01877d530bb981f1a85b02411f1c27ef97f434a8c2ff315dd39d909709775bb3c7588243bdfd8f7c866c49b3369719d5b74a47924bbce57301675e2baadcec438e07e6d532aba664253ab09550",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "special case hash",
+          "msg" : "3131323938303334323336",
+          "sig" : "308188024201d3b17a34b19d134773988c434a9fb7f22a57dfb4c4bcca031e213e1b9a56db0ecb2f3c54cf9b1b6e5981369652de37337a7a7d7ddb54d67b067bbce01fd7fd2808024200c90317dfa061122557eb3899939924a8ea3cdd886e0f2e5f2c384b65b1a40de5f00fd9fce889fc313a6a9d5f0a9cd3a7b89b7ba8e97807031f3d1e3f9c103f0a10",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "special case hash",
+          "msg" : "39383736303239363833",
+          "sig" : "308188024200cdca5299e788600a3ca5938d4a4c5f42b5eea3cefc990e67af95a4449aac0ab50e8fc4778efa497223cdca07c0e5a5920110f3a87afaaf265beadbb91c00d13464024201a92b9a5570b42f91ebc3d8ba272db9241468154783548d3fcfb6ef46c9e037bb6217af0a31ef952c27604629ad5775e7695c63efa138cee8326a51c1b04d0c658f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "special case hash",
+          "msg" : "3230323034323936353139",
+          "sig" : "308188024201660b0ed15d5f63044cb189e1a405bcb591c37217d0e000008614b152665d5bb9353a3826854a8bc6ebed423b15680e4340a00701b17bae24bd399bcff7e0438bfb024201c47f2f5c6143d2eef063757114aaeb27827b6a8f675d1825dac7f4548cbf78a37eb9621a29e9b14cf61fc6ae49e7e6e15350a4b90a4a897ff69b0c59b69508ebc7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "special case hash",
+          "msg" : "31343531363639313830",
+          "sig" : "3081870241364684856c7c02bfb2ad2de603d10883ca93c122d4cebef276467a9b7620fb530e4d05d07c15ab948b9ce7682561307913b64ea6896ece1095dc64369f1a9d5c0d0242009e6db2ff96d9d71150440fd44992656ca118fcaf6bd04499314e8ba61a55a8790aac023ddb68600fbd7ed4cd4decb176e8bd7822ea31d75adcbdaccafcf510c26c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "special case hash",
+          "msg" : "31303933363835393531",
+          "sig" : "308188024201a317e49014f1bf3afc09cc048531010e2144b662cac657e51b32bb432d274a730b535fb2de66fa8ddd26faa3f46e004389d25517c56e7d8a1d39563b0e8c9c215b024201ad2e1212e1680b660a1c07f54addff575c8c8298e26a14c516f517fb5f966a2b383aa46a483fdbfa72711d60c0f67a2c03d63d2626ffe271e0ce353a4d4b09bd5e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "special case hash",
+          "msg" : "36323139353630323031",
+          "sig" : "308188024201c09b29fc4da04e9b86097bd6d6806aa969ceb37ce52eeac5e9518d27541c3f30c00f113d9dd3b007dae6f381896d43fc6ddfb3fa256a36529b054e416ed638059902420113e5622cb1e4c4bb0842f3d396d7e660241116e94e8120a602e3d2952701b1a11415a3d8c503adced160450fd13157ad147d2d65d77449458659350e20a545602e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "special case hash",
+          "msg" : "35363832343734333033",
+          "sig" : "308187024178f4a2968460ea8f64a938b3a97c914eb0ccfa94eb08636efee9d5ad8668ce1c9099573abd146df9e7b2ccaaa1a25de903f85962849356a872e88e545babc28974024200f2729e9593c9fcdf5971b21e367ffdc87aa7520393527c6f68ab512b88b839003c1c9952b04f2dc74010a31071ee20a9fb1c7e1187d04de71b3f4327df128ccd43",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "special case hash",
+          "msg" : "33373336353331373836",
+          "sig" : "3081870242019faed147a76b65779d0989e1300802844c9ba09f338c5e31a24d9ebf8f0b0b4c21f59d369ac10e315fa2b7605b0f17a9c07cf6ce4c83838e58333a3390142d79d002415f4de71fdaced1e8da86efd47ecbdac6a6ffc6d69df71da7ceb5596475cdfecea3d00f074d2de89e0fcc05e3231d531f0d38f2b7c6fe4ecf67a0cdddc21d0867b8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "special case hash",
+          "msg" : "34373935393033373932",
+          "sig" : "308188024200d0b144350a2128f042bc1a27f6c021dad1ec031be8f1d8304797f9ddcb742974aae209f014980174b9d4e434e3f53247889d2da4b767593179cb4eda47e799643002420184d3416dee35ba8807703a91ac927096c10959a05cbffd8103a93a9f20a11537bed7a645f32295e4abce493579caa4e2242060cc4d58b2414870e98b9336795787",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "special case hash",
+          "msg" : "39333939363131303037",
+          "sig" : "308187024105257a0f45ee2ae5cc30283d23c47c96f6deaa3ac1473e8e8a40eaf61bc4b0ef8bd18d11983f257ec4b1d8d04e76a122b5bbe1d31065159072c58fd9bc3e98376802420122dba50d0eb71bdbf092a94a7ea280412906e1f849e91dbd5d8158e3fc6cd12e20461b77653e3df2e45b86883f81071b33651ae1b84cc8e7c365ab8d6a36d1cfa6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 231,
+          "comment" : "special case hash",
+          "msg" : "31303837343931313835",
+          "sig" : "3081880242014f624af9d8096fe7a290651d23ab260da64e44b886fef4f3881d0d984d3b387fddcf65b1fa1dbb239028fbab4a1de6ad150cc8a4e4db0a971bb8bcf01c4728ff9802420105e3b55db0141c06d9854096cc0f73415dd2b85a331da50cfea3bbf648bbf8651f61f2cd09386b62fbb8ce67248683c260894d9ed54d6667ae02978e38ab99320a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 232,
+          "comment" : "special case hash",
+          "msg" : "33323336363738353030",
+          "sig" : "30818702412c952d7e61e1097cd7f709e62ec486879b380b63791c146b545c064e65b3060250d00af279cf15eade67384b28594db542845fcc6574ef5d8d5bb8a162e0350a0002420135ac6d1cc05b095fbae28b652fe5386b8689e21a14990236d3ada7ceeb0c12a4f774bff7b81c8d07572b0c7985364c5d31f33271f0ac3a2afb88b46bfeefbaeaa8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 233,
+          "comment" : "special case hash",
+          "msg" : "31343438393937373033",
+          "sig" : "3081880242017919eff78225e1937a921f98f5d153cbffa03929819f228ee013f8e59549b04b9867006a8df25a93a6a25dd1d3f540239a8ed14047ea00811da9305ec515ad000d0242011fb873bdae1757801e575c5df62cf82a1881af3cd6ed17dc50edbe6c5fd0f4d31766670b2aa572a9e6547b36142afa8464d0be4bf41930629dc04c85e01b2ee8e2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 234,
+          "comment" : "special case hash",
+          "msg" : "35373134363332383037",
+          "sig" : "30818702416ac9b370067b13ac2b57f35d6d9b1faa93b9b068ef5ddf8bde3a54024810aa2226560065b0cb7501df96b4756ce1e1fa607f86a942367894a1f7728bd5f22cf1770242008b47a9e1370c9f5bf4677d554c00e9ac3ea7cdfc78836ac53ac710b7f3bff8c2297780c69a9fddb80e03a605e5e48a52e52fd35f41668cd9064886366fda206086",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 235,
+          "comment" : "special case hash",
+          "msg" : "323236343837343932",
+          "sig" : "308187024200c4bcfff265cd32442220976ffc7e4ec09181d694696eb89af0cb2d5a2dfc3876deb3c6adea168965200c355c3bff5e47ab17ecc44c8434333280796d3a183449ea024162debe91550f8a760eaea309f48483c65a52c7e88a83867c31730cbc6b0a64d4c564bde67e6539af787ecfd18016cde46ddf91740f58f6ea6ec80b173fd1c47ad0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 236,
+          "comment" : "special case hash",
+          "msg" : "35333533343439343739",
+          "sig" : "30818802420174d744ddc631fcf8202fca0ab10f6d96d3f7552bb2a9ae5ac573634133f61c59a120fedbc39cfb521ab0cd572afbd5147981090d1dcbfe902e03f0c0579967b5810242012f59ca927c4ae331d2f667fcd9ec01b0b5514e2ab5da0561ea614431dc1fcb761c351cd1211092720ebb7074a5128f8019b7c18e048d5ed3573ed61686e9713f72",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 237,
+          "comment" : "special case hash",
+          "msg" : "34373837333033383830",
+          "sig" : "3081880242019a513cfaf871287340d8a51d2f4348ab4096c5fe244b22add38ce433e3178e8ff5b2df0fe74a1ba40fe8341f734c71f9a1177b41035777e2da6b082e0b566690de024200d0c43eb33a817c3aab30281c593c74517ee84e958b114395ce0b31fcf30bb8f5dfe60dbc7f6f14698977d8e0516a9274a5bd71847057e006fa315fae6922eaaa55",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 238,
+          "comment" : "special case hash",
+          "msg" : "32323332313935383233",
+          "sig" : "3081870242013204800efcb40ab09ae4137325a3e8c468edae91880a51616ba61f3ef1f72fd89feb956bfb39818d827468bb4475110a04779fd6bb3def25c61c4ba60889ed0ff70241704b7394687698c8841f4875d40e5b3c914f154ccb2b54466ae163ed3410f20d0a07ac5f90c0c31271ec8a524ca2dae4b8bc4f6e1ece173ea907890693c5f2190c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 239,
+          "comment" : "special case hash",
+          "msg" : "3130373339333931393137",
+          "sig" : "30818802420180241cd2e6163158a39599890dabee99c2c86b88accd2b04b5a72874fbdfbde0d18143c4d78e0da1abf3796b238738840d60e34775a8ff810d58a9bb3559a3997c024200bc396c2ef28b244fb8e004bf5361572ba1fef6fbe081ed1dedba4d9af78deee126599f75a0a9d0f1b1618ded7a0c5e672e40917fdd30582460da3aeb1e9c4477d7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 240,
+          "comment" : "special case hash",
+          "msg" : "31383831303237333135",
+          "sig" : "308188024201485fc03fcd629fd4c564775ab6969bbc696b5b0f38141b69f86e052e7fe8849a64af2dd37a2adf64672f20bd6f97cd32f0efea51aa22064c5f10a3911177e1979d02420180fab473ff9d726db6d266541a0bddff8610e4026d26b6c9abf972eaef477d50670bdd3067c9d711a8346e16869147751e89b4ea75bb00ece71300cc3b80cf8899",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 241,
+          "comment" : "special case hash",
+          "msg" : "36303631363933393037",
+          "sig" : "308188024201bea49b150a27026fdf848297b0491019f76abf90f3e6d782e3d3fa6caddb81b7ef58b27f1b2b3f7898889b4e2b6cdda7b5636177a27eb9a67b2055b6f21d262c26024200dffb13c2d5f746c8573aa444afc8baf8bf881cc4d0fca8169f6cb304f400eb3932666cd3758c437c9cad79abfd89c72a788505763aabdfabf8903ad4a70d9ec9f7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 242,
+          "comment" : "special case hash",
+          "msg" : "38383935323237303934",
+          "sig" : "308187024201d56bf6f3758f627f470706d1d28c28fbfcad6dc30465cb285a274fc057f791de73ac30baccde044473fa9e3dce6d395eadf98d1f97259bd851a1eb6f3d31d2d756024133704b4ad37300a96682569f4f7fea3e14d6e1f65864663f39aa67f40b5c949f198d5de9f2ac2369bbb9111c89b393199537c6c08ed7c02709c733ef7660113d53",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 243,
+          "comment" : "special case hash",
+          "msg" : "31353830323334303934",
+          "sig" : "308188024201554035ba84b051d50901c622b98be4de0123a02928dffa7eb13b0403fd5e255f226505e15694956a66a878ff581173d123d1b24eaa85c5fe46d8973a55040ff405024201b016dd6b5176ad8347eb9802dd7727e06a29db33cc946f809a42f9193040692b0f82ebbd04eff9f099b7f75f8e45e74ac00a51a9cd4f2cbf5f03f4d2bee99c24eb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 244,
+          "comment" : "special case hash",
+          "msg" : "33393635393931353132",
+          "sig" : "3081860241293e8d6775f3c14183aecc22f608e9013d7b15dad167bb38a1dfef6b373619f1ba2751d77b43f643f68643cfdb5c04a8ed858bfcf3858a681ae93bfc7cd7e3143802412c7d96db7dbbe347bab9f6f7b88f48cb32ab963248737d2c901b90d64591cbdb0f0ca7a14557f8a50fd80d402f929dad141141f1f0c85d9414b32d1fd4d796e6e7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 245,
+          "comment" : "special case hash",
+          "msg" : "32323838373332313938",
+          "sig" : "308188024200b16a9b3aceece85908125f96f6cb6b1afd0ef04171936b3766f8e43beb340d382084b33439f775a29a83945da8efc4190db1343e87d8c0ffb97aeb3be159d90f59024200e5c2bbd98e449bd0bb4f75a07f1a88dd63c0602a7660f4acd33937c4913a9c16ba44dc5808892ec88a4255109a7bc5b221c07e6a278888a9712fc2a25b374427e3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 246,
+          "comment" : "special case hash",
+          "msg" : "32323330383837333139",
+          "sig" : "30818702413b47a8ed52f5b0566365313520bc0b6e4e4efb3ea4176ed7a352c4b2f8bffbdb0148ff44f3f13d9e5e31b1cdeae097574aad8bf393c54a5c842e749ee87a74c6b0024201d3f484e9e224bda9c8f10fbb74bbb62d7a18245707f4eb52f17dde793892c16e4bdf504960fba55da487f542d412b1b833f6f46336118618fcff69469c83963777",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 247,
+          "comment" : "special case hash",
+          "msg" : "313239303536393337",
+          "sig" : "30818802420128b8988bfe9287f82ac97be507a544b823e85cc2813b6929e63699cff85a40283076028e7bf8d24330f89adb96bf24a4e183a898e679b36768909574e7d4733d61024200c18aae44e6801fc2e3d9c7a20ff9d42b46e4a31ca37772f8c46ce65219b195ca23717f816e1fed51e5b6f9a0ca12c3cf81ae7fc9cc6946a88330b2011ddd160930",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 248,
+          "comment" : "special case hash",
+          "msg" : "32373438363536343338",
+          "sig" : "3081870242015edf1fa95b17159f762d68c1736101309e80fe5b2c4415609a5ac0837fe5901f3c2d3d826a43b1f8cd1babf494ffd96cca1267950188a924d4e1bf7f68189f27d302412e8697efbbf53adb7cb1b904718fc71eb2561f331c209c50848b5bc50bef77c5c3487d285bfaa3caa14025cbb71bdbaea6911e3610335641d2799c3fd75019f716",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 249,
+          "comment" : "special case hash",
+          "msg" : "37353833353032363034",
+          "sig" : "30818802420161f64bbe93fdc0e61134cfd4c453ab740233b436179351aa68a3e38a83400d86ff464d7ceb7a51f541b86eb2f12e32a879b3a29bcb92e08cd50e74f86a0ed52ae90242008f6fef49ba12ced6696f4f6d24e6c68057a84496d42eede630199e9bd06d91363542a9776bfcd6d77fbae422e80fe466edd2c2c5e1f5cc79bedd1a7becc1a12660",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 250,
+          "comment" : "special case hash",
+          "msg" : "32333237373534323739",
+          "sig" : "3081870242013a6faccc1c06cb5dadb2cf083cb94a7181fd5cbf3954fdc430c2691248fcfcd13767e32491f00269b549cae93777ced0f7b069440726adde7605d4038d7b5ea4cc02417622c9065f4c49a6f8649073dfc6a827b897b6984176b1a09d151b9733a68f6da746c47427cdeb3be075da4a351ab78dd5e472cd98d1586edd6ff2a11c6c169fbb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 251,
+          "comment" : "special case hash",
+          "msg" : "373735353038353834",
+          "sig" : "308188024201899609e7f7cd2ef14bfbb1cb9ba9283ae11a9346a34bef23b1c249da2e76a7708e0f2f97f819e4e25b0d5227eeb85aa593c3fae9398a7020f61ae1606945d13841024201b8d5e9c4f030295447106d2b5c80cc2e7d4e36b458a90a08f505df62d2234e59d08187385ba5501049b34e12ec92f7839a18361a52a9a0b6f6a664b118680b53d7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 252,
+          "comment" : "special case hash",
+          "msg" : "3137393832363438333832",
+          "sig" : "308187024201ddc69d1508021eb560db39f3add8a28dd7fbce417e5fa1f4f626705caaad72b634868d01dfc474e926c97927c56ac51f9bdcfd0e7627be35cc300a0cdc083b00d402416e862caf9f2df11b0a46104e78865fbbabe30bfac0b1fe7f99badc11746a288c1ff27f6fa2aaba6441bab0372af906eef083ff03ba466b896c9344cd396dd46dbd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 253,
+          "comment" : "special case hash",
+          "msg" : "32333936373737333635",
+          "sig" : "30818702420117fe2c21f282c7e4a8415e9c53c254514eeeb0adadc771adbc6d21a09add4f17ea0c597469488238be795f2e187fa016d590535b4ff10c62d2246aa17bb013f9ee02413c9f1590ce7a68fc84c617f478188e71aefe8c74c4b9979b8c9196bcc262205aecce5fd2bb80c360d3e20da20e36c5ab70d810d4ba97d13858199d3a1c9c140c63",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 254,
+          "comment" : "special case hash",
+          "msg" : "35393938313035383031",
+          "sig" : "308188024200be6b47254a3cf93e2e276adfb072256404744070d6dec83ef34e3e6c119206422bb275e61fc47053ef7b2af9e33aca8f8b2e4938057070eb6ebbcf82fabb44a5fe024201061ef80935ff6d0e9f87f3537b639945acf50c5d97d30b4b9c347e3f5f5ec02b15a376ae754d64b2efaa811b3d12a0fff0bc689022025dd2f69f2f4b40dda8687a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 255,
+          "comment" : "special case hash",
+          "msg" : "3136363737383237303537",
+          "sig" : "30818802420130b6fd7dec5cb6f90a8b54ce7b58c61b013d0aed7c4a26639de80aeac3d9e3388e9f87e1e6419d3f0339af324e1421b5d130317ffd9d8be36500a84bb41d026cea02420176b460a3eae01d8aa8ccffb0d6cf4d1595aa697c65510a1197b97343c1a6234552ce9d6d318c5f20f48bec0dc311dd62eb40058f3cb22fa958edaf9ddded191a08",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 256,
+          "comment" : "special case hash",
+          "msg" : "323036323134333632",
+          "sig" : "308188024200a87de42d827ae1f55d6fab3277c7a9fdfac3af22fe47e52bfee34fa1ee3e765095fff20175becbdc94b4a5ad3a149ea7c1bebf4d45370e6b4404a0437d8fae264f024201a3c1c5186d8aa491b4623f5765a388930f37bb8f3e1c0db508983585b9090b3aaf22bb846e0fb6d915b5811ac55e4d6cb08f605cb84deb55ab7fba2dde8736b1c4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 257,
+          "comment" : "special case hash",
+          "msg" : "36383432343936303435",
+          "sig" : "3081880242010e46055d9aa087f1c4b6056319cbf17a0694fe073266a3f30363030e345a4bd461acbd99d1261fc05ef3c9a1c37afba6e21c2d513ea3d4709de5586810d7d29ec6024200d0c95c7e97a94efb44aa717cd6ebe82de0644e32676d197351f128ee8d2b223ab476d3e66014ecc003081f7040c578b8984628d6ec80733f713e26b2c98cb4ede1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 258,
+          "comment" : "special case hash",
+          "msg" : "33323639383937333231",
+          "sig" : "3081880242012c04d08a7a2d07403aba604ea85ec23a52b52786e7fce04170e867be6146eea75a7180f5d4f3b82a204a3c996811a1e61a3e76ed209c22428b35c51fe60f3bee1e0242016f2feabc25733b0a460463b9933e6e4ae9f4124cd0ad3785c77755dbf0848ec1cfd2ab08b960b556870fa00388d23d9a9fa3112ac3e62a0f342d58fb1f0aa81748",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 259,
+          "comment" : "special case hash",
+          "msg" : "31333837333234363932",
+          "sig" : "308188024201ca9532c9daeb80d0dbc07a4138ba62a6bab8c88b9e1e2edf2675132eb97cfb26f4c395f3b9d1d1275694956b34c3ef72cd00bab86777465b9edba29a41b0114c6202420140eb6dddff253a7ff5b032d82fbd18e481a376fe242f6405b81b57165665c9bfe61e25cd3358245bdfb8de7632de72ed20cdacf384764096c8fe3a376563a348af",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 260,
+          "comment" : "special case hash",
+          "msg" : "34313138383837353336",
+          "sig" : "308188024200d609e1f1cc1adf5889dc6deda441682e760be08932b31592fef3ada143fb4940e4ea75ae519e4fb0769c4fbd33a52b183a21d0bba1ffa3fe50fd11f75c6ac58ff60242012400cc4ddc24ddcd47a6d639a2abdef29a65d4fe9175f51b316f4bf918bc918879495c572f8e98364e2e1aa0d4d53ad29e803a4470d94dd06a982a1d041bf2b5dd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 261,
+          "comment" : "special case hash",
+          "msg" : "393838363036353435",
+          "sig" : "30818702413775a7e61bdda9a3a990ba9fde98f9d81d4b03195547bbd0658e1059daa00da9270671b2fada1bbbf13982f87c9f3f26dda5cd4f24de63bceb5fd9390163c58d260242010a03e4ba08f9e2b6915a6c0b83156b00f59efc5417394c51ca7616b58cf91ab7166d8459eb4eeb0d57146ed6560e173faf354b4390817e0aafb38294df25992cbd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 262,
+          "comment" : "special case hash",
+          "msg" : "32343739313135383435",
+          "sig" : "3081880242017ab00a30c88faeced3e4a10f9c63785bc29e9af4499466bd8880827cfa580b6171f4a20f36487f7b94592946bca4162faf65872af6bfb1919e6b026c14e51e2740024201927515f6489e9b7d9cbf61e103295857c8131320217e7a86d3f2fdcb350da5b42c2dbe173fcb025d14da239d7d610de8475914748573429c9590d3594f4fa3aab3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 263,
+          "comment" : "special case hash",
+          "msg" : "35303736383837333637",
+          "sig" : "30818602413b2ba1509aea9d42d400400033952a022fe7e00c7ad65c39a2f76d41130aada99c3cdfb9cf44575a2163de29f097beb9bd3aef9334e6fd0813dde2a087f938c5f602411afb56087dfd5cb4fff6679a114c340f3a59f6b3e1813373bf3ebe30cb5e8b285a5875d1b5a9120db80f70310201559f89bb1df147961d1ca4fcdb5e8e84cae082",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 264,
+          "comment" : "special case hash",
+          "msg" : "393838353036393637",
+          "sig" : "3081880242010efb321a347625343f5126ed8545017d799eb103c75558922eabe44211e8fd834655dc2ec5bee9bb3e44350eb6885e0ab974730222e55f13ad27c066722fecaa25024200d62e3d7ff9215369aa7da818db302e49033875010b2f9b73d25ca5b9bf2c62ed756686230cd5f4a37c1fa881c97e623919fab827de5995ab456a1fd7ac7b85b1f8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 265,
+          "comment" : "special case hash",
+          "msg" : "32373231333036313331",
+          "sig" : "30818702412f778cd552f54da5f567f47e6979872ba130dc0890172bf3b3bb952f03c64bc8783abe9f056d60e1667780f5ea88f59ef33c735d540561a197d31fe34853a60a52024200bd2816f06372f2e3f2582d53e583e133a551aaec04ddc2fdb7b8131787e73e4295ac28a9604a2402ed5b272cc03be57dd4a7df84d9ee24cb0c2bf124ed927defee",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 266,
+          "comment" : "special case hash",
+          "msg" : "33323034313031363535",
+          "sig" : "3081880242012a459fffea70d3bfc13e9ea0abb10aae3910df604997cb5e4bb0548abd852abac6b9a32418c3b5ed4e7951ae88eecc0a2f1065caf24c6a814674e95682d9b493f2024200e2abd05c585e0c213a219a7e7d38b810d252ffea67650d4d1994a41c2ca325bb964920c6c2545381c45ca3e1eca05e00514b366cb0e1e49b8c236d383b260b9cbd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 267,
+          "comment" : "special case hash",
+          "msg" : "33313530363830393530",
+          "sig" : "3081870242010f2653d94aa28bcbd667a5013f9b283d8487c44d093ee47660329398caa550ca9c9388c7aadeceacac1507e76590afb736adb3583f54f31ae25c9c717ec9f89b5e0241494448a7ffe4a4eed84b4602781ecef77a23fed116b1b791b8d2e4231b7ca2a7b6f06d132705932d446e61d344714ee24014fa5bb144a96572b3d48d038a55ad68",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 268,
+          "comment" : "special case hash",
+          "msg" : "31373237343630313033",
+          "sig" : "308188024200c2da48552c39d94f5a45427ae9dcd891b65cca33e624ad2532ffa333666b241d873336fab7bbd7b4c193db4d865cd50f0c1d8cb5c14cf3f089ad42dd43cfff634e0242014f2070dcf860b96a45f2a6061e4ec2a6ad64d7d0e9fbdb25aa93b99941be280f5c70c0e32b6234df545bace7341af94c140c865d44fa8ea7ebe0fe53bda44645df",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 269,
+          "comment" : "special case hash",
+          "msg" : "3134353731343631323235",
+          "sig" : "3081880242009bc6e74549b48a1e7c181b179687fb27d6e9acac47ec34b1b8bd044d329320544e4e568e67d17f4cda2f0a3fe303d561a11fc0c981ed9be2fcc6d397a43ad49e10024200ff295e43fec5b68b00ce8044434bcd17af1ba04a74556353e258d017ba26bed67f458fad5dd8e7d2734d56f59928c2419441a9e8c0573db3586ca056951ca935e0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 270,
+          "comment" : "special case hash",
+          "msg" : "34313739353136303930",
+          "sig" : "308187024120963638d0b058494254efce57778ac65e5f23491f7adfa72e4713b7c03946b543c014d9660d855246f308085eeee495cd831b7dbece47aea48e90433bd0fe818402420161a4f4977fecae92d4f67e56f3338c7a9b820b5e05db1f28d05d71f7e5f36bc63f6edda4d3c1b2d73bb8a30c4d745b73e634ef574cf47656a372e3eb42cc038850",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 271,
+          "comment" : "special case hash",
+          "msg" : "35383932373133303534",
+          "sig" : "308187024201bcc5858597ce8d4dc5ffa6be33f7d804f2f8ef59c5db9301785e0cceb7ed57462f455a465710c7414570c9a35a3100bd15fa40e3ec350d1f75406c2a25885e9d76024143757d282fd1d44c253f9a05d8142c29a6d63c0a1f5508431bc9fb9b60a38b7f414e730e0d59b7b709706a67022e1922fe88b182a57443c58bd06a69ee7814bcab",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 272,
+          "comment" : "special case hash",
+          "msg" : "33383936313832323937",
+          "sig" : "308188024201240120b97ea67bcbd0e412d87137a13e347a870a2249375fccf8c004da35e592620774160e7b82aed1f57997fb015a764d014d4be1f389e5499777054576e7bf000242019f157ec3a2410853274bc4d8e7565e9eaa5dc47d5e515abc86c22fa6dc215482df5c0e2b885f37baef3a6ae83daac930617a5fb37bb03ce40f06fa4ece26cbb11c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 273,
+          "comment" : "special case hash",
+          "msg" : "38323833333436373332",
+          "sig" : "308188024201a7536d55876f8392a6eba18f075118c273015844eb3536c727c004c1bf23067d57e8fe31872f8bf839640e80e06aba3c0a365a268cabc2da96d84550a569f17f9c024200e840b6a7cba718d91103faa134c2f63763f3b6b91db7ecbd3b10f10171a875712cb9384325411beca9a3aa87aaae3902c282d2dedaa1cbddd40ccf0d29975df22a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 274,
+          "comment" : "special case hash",
+          "msg" : "33333636393734383931",
+          "sig" : "3081880242013f72be1c331214f45007ff72ce54afce1c910a90e4ff3d176620ff3ca976c2b62d0cdf5d1134290ee97440715531455dc29818828094d366f959e1adc7d7e98ea4024201e80ac38ba69f3e53116e5432fbdb3b1e7ea1b43e5f86d1c0e3d1c469442dbb406ffe524f0685f71e811d94a9efa9ed38ccd9213f983983035f2add0b8f2fa4ae23",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 275,
+          "comment" : "special case hash",
+          "msg" : "32313939313533323239",
+          "sig" : "308188024201aceaa6d567ddb39ba52d297e60e4a814c9b476cab568c09d8ace878d846218dd2b5d2a2461f0d5a56c12f0bd803e3253dc5b387b94e86589cb1d0cb809c7071125024201b1fb021b10b593cf9e793cf22a88bde9a4b92f9e218094f270b093e8c6c95aced43d097bfa3354e6b98d195c599c2e6f13351c63c28967e08b7e497e120665c663",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 276,
+          "comment" : "special case hash",
+          "msg" : "35363030333136383232",
+          "sig" : "308188024200f6ffb5dd786326041e74564b719d38924a28329868177c13463cff90c4b09d3d2dbc011281cc78aa0e5e8656123bc50605601a547bb4b1761f852a120ea46df9df024201a407fdd445614a16a5ebd4ba075c6c1d7564f3cfd477d6b2620abf18a5bf78311282ea45b9bff813f24c3c7854e6091c8055144f9592fbf2e456421a41c555d7a9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 277,
+          "comment" : "special case hash",
+          "msg" : "383639363531363935",
+          "sig" : "308187024201a15af4d5ca3deadecd75ec1baec31c8d43fbc889466475e6c23106db4e63ab69003f56d819ddfc5a673c8289f9e6df806b07af57a2541af694e6489734c8eec837024169c35433a3217fcd738a65b7da9e81cd81f04f0ef060050b9c843e9e808d8b8175f3adaefa105d215ea9a46bf415fe2ac180958fcdd878d54f8d19d23e11b76d1a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 278,
+          "comment" : "special case hash",
+          "msg" : "36353833393236333732",
+          "sig" : "308188024200ba899f94841db6c33b850867c8906b436be3853640dbfc863197fa1e5a55ce25240f2be498b9bdcfc0a89dbdca192d8f84ca3c44e5e0ee6f83e7900e085e1bd48102420086e6d558de8d8f014a85cb4a5f6908627e7a1acd70581d9d9c7d14df44d437aa09e5a10a0b760e98d46731f2512ca1b0240c602b5f0a2030485e34de9c6cd08e7e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 279,
+          "comment" : "special case hash",
+          "msg" : "3133323035303135373235",
+          "sig" : "3081880242008eb5c92dbf5e00888b85e6bf6617017e97c04ae950dd731856b9dfb20e0c0e5c54284f411231fed1d071b321f78618d2a75c139663fb9db3435214cbac5a0dcb4f024201da0dd29d4728fe6331c8e2ade5045b1237664aed157db2a6cbdeaf5abea81324e28920a1c49c334b1226441f88e1a7f2c7e01d63e950d4378f08973db16b2e6161",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 280,
+          "comment" : "special case hash",
+          "msg" : "35303835333330373931",
+          "sig" : "30818802420130779f943df098ddb5315cdca4b731c83472d589f4ba4d32c172faf6b3a9e4154c0517fcc5c432eb269b0152297f6df490ece59496bea8047e2f32d0b5f91e85ef024200c9eb0b56273114ce2e553341247da86b813bfd65f143a5562bb1c874ff970523836bcdf390dc196e67dd75cd28112ef74afd51b1fb35333be0505a012efebd4e22",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 281,
+          "comment" : "special case hash",
+          "msg" : "37383636383133313139",
+          "sig" : "3081870241593f0132f7b5c282355978a2cba73fd3bd5ce3272066d4ad9bd8bd8b3e2be0990071b3509ea445dd155cf97e294e2b8d1355809d880e10700eeab0eb8ebbaa4f0902420107eb3d5ed75cbb9bcb9278f2266c14c57cf703cbd8f7c7de45c51f0f3baf1dff6bb92f1cbf89ba649677bcdca776fc57f587ce714e2e43e6cc523f0d0a286d38fb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 282,
+          "comment" : "special case hash",
+          "msg" : "32303832353339343239",
+          "sig" : "3081880242016ded17fad10f945e3d953b4fd3b72898c370f15164bb7712673385c10bf3929bea293e08bfc30029a465138ad47abe604df807b31707fef55adf3e104920038e3b024200b76b212d74e4b6eb994d926e9e796975235fad90e339a21a329e6eed3fe96b6d3c0d5426e8464c4a9ed5cbe08eeb5e490f72e9e0406c0d76ad076b476d07c0144a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 283,
+          "comment" : "special case hash",
+          "msg" : "3130303635393536363937",
+          "sig" : "308187024201f8624ffa5a6aa8d9d04ed1c2272ea55f5271ca2cfc9aa6a3778a0b8a230f611e5d65af18d8251a0cc4ace663878c33205239ee7e8388cc0a040ea51515072e3f6102412c1e61197229f40e840ea37325f3bd87a6cd32d080bd61bbde4b072cf7a0c8a89d402cd9235c26f19a084ddceb1cc0bae4006251ccbe10de3954e85a8c5efaf6cc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 284,
+          "comment" : "special case hash",
+          "msg" : "33303234313831363034",
+          "sig" : "3081880242012b01c6601ceca9e58e8abb85d1f6663df70cee761a756b77e45294f09ae609a6b76cfcd67f60e47a3494cb85511e33d92a8d297a1b89e9a9038c0c5b78c3a3d4ca0242010ef5d2fab59bd42e2e92a2fca7a975b959dfb372519330defc8fa8954bfcfb397ba939edb6a944a2ce9f6fafbfcda6092cddf628801f6dd8cd40cad4d809d5c1bf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 285,
+          "comment" : "special case hash",
+          "msg" : "37373637383532383734",
+          "sig" : "308188024201c54a330b9dc47eb88dbf60c9ee49f2c7518c0a78baf642c74105fe283fa4c357ff22931ef42f92d16d6a0b806ef718539d21cad71955a530e21cab49a56f561673024201c2cc32c5a4d335c48d0cbb0407fb7e4729c57251afbf9534c5309b94e6aae13614a1f2514252f48cc7f143ee761782f8dcebf2fb490e08fdeaf570a7ed9d287da2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 286,
+          "comment" : "special case hash",
+          "msg" : "353434313939393734",
+          "sig" : "308188024201467b4511b9d6601da3557b8ed432c14a80e5999847be136c756a88dd5134689b5ab70d0a2e8fd8d6141e2b143282f98afb93b7e17609522dd9e64c9e4a31c7c34f024200f50ee66a1dfbf86167ba5968d4ee3506a7cffe0f521c1bf830d0867241e345d319e77eeca45858bb3062acbf8d100bc6bfd3127d57a7e91a8199e05052b8ccf304",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 287,
+          "comment" : "special case hash",
+          "msg" : "35383433343830333931",
+          "sig" : "30818602417af90f6227750f917d65b1c60200c755158bb783a479be6877c59ed89ff595fea3f3a4137591aab23826ed385bd6156277364b5d603ca272259083e6e9ab5db3f9024170842eb62c894935b82da15ca611d9d754ef57859e0c912c0358d0820f4940cdf5360f116a7547a81bf65617f182e597eb1007e26c62838487ca021c3829a590db",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 288,
+          "comment" : "special case hash",
+          "msg" : "373138383932363239",
+          "sig" : "308188024200b0169e68062caa79f99ec0c72d83c4d0fc2a1c818665cfed1aba3e684392b9a95afb82ddd1de49e3fc3cb3889b4f5a86a7bdf944361db2cfa57021a7643fcfce9502420115ec784e042436892c6cc1bede0f4b7b6eb24b300b1f0c674999a6da816dbefb2d53f90b0dedb962a085e5209fcea50311130800d2a9249d279c7bde2f88622512",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 289,
+          "comment" : "special case hash",
+          "msg" : "31373433323233343433",
+          "sig" : "308188024201de4ed1ee81d5cffcf8256a06858cba5eb925ee68e3ed848ac98071b6e30c3b44b102a2de8117cce5b4f9e42603225e0dbcb3fcc171d1492e7ed8bcb6ec286c7de0024200fd1e93bbc8b8adeb7864a2bf8e29d6f9c0966fe3d543525bf268b57cd6fa8852bfe0d2750726d5445560f2fc211aa7859dd3ee10078ef907e49cd64326b397e01c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 290,
+          "comment" : "special case hash",
+          "msg" : "32343036303035393336",
+          "sig" : "308188024201fcafa62ee6275443d7277fc46e4c30b4db845ba45b5d6b54faf47bbf921f825f6fd0f23a38c0c7f4debc33add282afad1154c8707b6e18cd65adcb07d32915b46202420087a27b2bf3c35d18fd397e0cd7159516cf563b98441e030bfde93ceacd2c4e41228b7b33443ef0a351ce553d6d1d71c12092df796276175cd779b8090c4958b391",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 291,
+          "comment" : "special case hash",
+          "msg" : "31363134303336393838",
+          "sig" : "308187024178989628acfba86d4bf28beeb9f44001fb8f2d8e245320a19efdede31eae3ec8b496faec30c85e8f63f8ae06046fe1d1575321fa04953e460f6b1386dd5df94edb0242012aba3349732e21a5bb27d7d6facd8c7688b9d0d0271d6a077f9d6d82db45b5456b767f4b9f1a80f487031f9c0b3ea833c63fdf9c6a25e6b424c19c2e55305d7a0f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 292,
+          "comment" : "special case hash",
+          "msg" : "32303935343235363835",
+          "sig" : "308187024114a5a46a3ba415f6e8c566ca1b15fa2055649687b1a9fc84cc0fa8631296898fe014e0d45927e4271396baa4cfb3675669b16e76c339db3c0edaf61337e8bebe91024201fb313129757f76754b60fdb1e4077f9fe3dd62c8bce52190cfeb9c03021cc92f6d7d1302b8a84733486bf769ae94d3db4b60b6df28fed481d3d7c510299f0c319f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 293,
+          "comment" : "special case hash",
+          "msg" : "31303038303938393833",
+          "sig" : "3081870242008a3250eb5f28b598c4a42890d25f6af84082d4376f84f1717e5112a76623e6fe0d207c39463d20bb86341bc26c9f68bcdf794671a01f90465025f87a8c52137edf02411ddd317f6622d9b032223f76765ba6c9116ae4b43a1bd357bc9db6fa62f0867dc5d8f781f08c1cbd49b4424fe8c22cfd1dcd07cfde7b3598342442589825aa67f7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 294,
+          "comment" : "special case hash",
+          "msg" : "31353734313437393237",
+          "sig" : "308187024160ee161741d5cb2dd0ff2cf9924aca0376b1544681627a31688e4d8b3b63a01adbb417ee113b9ba8d4d13b7b4e1b14b51a24dbc3f099b068d916aa94862ee081b40242015caff8d30141e1c163e3ec62b7e14874da624a6d8e0252d8e829860e5a49d3732321b625262e5c9b1ef348c3e7cbb1de8227513f320637866785e97e1931d35ccb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 295,
+          "comment" : "special case hash",
+          "msg" : "32383636373731353232",
+          "sig" : "308188024200a1ef8229db9f45da38ae3b6d601110611e209878bbd03ac2a6de65e8402957c669a115e3f02d085fe2d031c61324b77052ab346b4b1a437b58062fb36f9d56cf45024200cc5c0a3b68970279ae16880f6ca579d0171a827e99a46aa82b9242dcc09cb0b22a44ebcfca84293e6d21aeea492f00ba3157c5b6e2e4caea6a1c09c824720552f2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 296,
+          "comment" : "special case hash",
+          "msg" : "31363934323830373837",
+          "sig" : "30818702415aa0c8a378c4e02bcc2f56c2c365ccee424e2973c28f0daae8f4c3f0d90b421fefd456e749087e0c667c2a7147bc67b90c696244f216b4d9d7418eadc7d06ef1d2024201e28914bd341f526b041128f2d251131d8b2c65847e541d65adca3442962cddb2a71c64fae39fdd56e41686ad632f99c6038d8de0b3aac4045e0a961efdbf4c6a22",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 297,
+          "comment" : "special case hash",
+          "msg" : "39393231363932353638",
+          "sig" : "30818702415a05f5366c8b8be28654bc39a6671d1b1593495e445c07c995c3be3e168ffdec92e44288802fd455007f8746570d93b5683e4d40e9d9e59de539f0e62bc40d92bc02420187a47d8f70adcc5e10267b8fec89d7011d9985427645aed19a8efa2d1189b469cb7aab1998e0c1d2fcac5a5054d79d2ec1c9a00b183dc9af20f555a1140be2dcef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 298,
+          "comment" : "special case hash",
+          "msg" : "3131363039343339373938",
+          "sig" : "308187024201e213bcb8b960b1296ae176993b2449bae556b6d90df2f07fb08ad8fd60e3b7fe6c73f9c8a7364417611d60119c550261c54bbca8d61e264130ab90187e27d22dbd024134f519382cfacfd07b0a6f3aca117c13d2be725d2f9ee4e5f88739c99121e63ed7358046bfb1575fc73e1ede8339e46c5139843e52e9184bb8c579061a154a0b8f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 299,
+          "comment" : "special case hash",
+          "msg" : "37313836313632313030",
+          "sig" : "308188024200ed11ac7efb1f29ee64108a5e2606fa9af3bbc12d1a952e47240d5236df64f5b2b77a0f7a0a73d30d0708b5b23ac6d584bf6997d8851623793655dee8774549b829024201e1602a2cae7d3212df47eebd12e2fe404851201101bbde702be9d74d040ed998e79a09ebf6d055f94473b1f8d87c99aa165bdaf0a5f270d46caabb8e88bfa54103",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 300,
+          "comment" : "special case hash",
+          "msg" : "33323934333437313737",
+          "sig" : "308187024107123c45e6e9338bc9fe225cdd96c5ab36cad5c06163f44f6bd903c7594e8068ba9bc89f652ec31b6e1298766b246c1f10877f1e3ec9829b0937b8d36e3c1ab2b5024201688bbaeb188b5047be6e8023b14fb121eb1451dcb19f814f5f4dca55ff95128011e3bae505a4d22166d00cb7cf14130590335ee923dc5db3e736832a128a067aa4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 301,
+          "comment" : "special case hash",
+          "msg" : "3138353134343535313230",
+          "sig" : "308187024201264e3cc4fb802aa221d0787cd0cdf44eb6568982a00a6639f15238af36e894b14f45f06f8c2180fdeaaac77f674e056d1928cbbdfc4b2ceca0b35345ca07bfff7f02415c2dedee6b3aa096fc47ba0991a077ef4d5df20d8eff1bf8354412b171f08a98cea1704c8189a7951b0e7a8270ccb285b8db8e35285ed926b19c1eef07fdc05ee5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 302,
+          "comment" : "special case hash",
+          "msg" : "343736303433393330",
+          "sig" : "308188024200ca3814747888751794b0488955e2aee07e5fab4b9872074aa7432698e7c83b8079773734df1bc752548a218fa59a362e0657b77ae7798ef4a7a3873256ea59ec670242015df8f1f16611c960d56647424b97936c8a06f62dc3a95d66bf4aa378d7a9e17d2afb53565780025927e6928f5313428f1d6708339787c8f460ba18457d4c0f521f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 303,
+          "comment" : "special case hash",
+          "msg" : "32353637333738373431",
+          "sig" : "3081870242017ba871aee34a893c4ded7a2a546da0d6867d428497b80fca7eea6e51b73d6411aff7609743e6242b6d4d3736ddcc9ee1aa12c8b62de5382e5c33d1fc4853e3e47d02415feb9d9f8fdd44622e4f9effe73fd9b467d355fd6b8de205527f722ee2f5a15eebd59ccdd7b57da26cf953f78886db5a6e5bdd0d56c9bd47ba2271f77687a64b63",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 304,
+          "comment" : "special case hash",
+          "msg" : "35373339393334393935",
+          "sig" : "308188024201840793684765410baf26b66cbcf7c36658d6c18a2f750c1225520e9f3a7c1b890583f321d4e48752c3b3116dfef733ee386c52a53402acea77cfad1db9380110e6024201b51985a306fcdbe3692181106d7d6308873912d003946992098bc98b4261fd78869ed8218849459780b6079f6899a47fcb9ea4874d1c08fab82c6f1e9c9aaae245",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 305,
+          "comment" : "special case hash",
+          "msg" : "33343738333636313339",
+          "sig" : "3081870242012276720b2725ba556d06be39cd16ca0a0351d8f530913c4f0cfb71fdda74b83f02febddc8da0a1f0f910d37d3f5332c027d7bd4c38fd08ebc770bf1252078649540241637e70b06045a86e2f329f907e079a785d7f8649541860322fb8b64b9736363f90156b9a5532d808cf2af33b87ff970c02e648dc4f1c90ff0704028ec2c2d9a82d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 306,
+          "comment" : "special case hash",
+          "msg" : "363439303532363032",
+          "sig" : "30818702417aade608b22c77245734fc5c4be8737ba24dc2ed4321b58124ae46a77ea7befaa5bcf166cb966aad007911623af10925a324bc3c6d06f24d0e2e7b2c7b8468b8ee024201e9913a412300b3980719148de0bb03826184aabd58f19659aa8ca18045f36c73c97df3d12b921de510ffa96ceac5454b801c86c55a06b2d771fa77bca784332c39",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 307,
+          "comment" : "special case hash",
+          "msg" : "34373633383837343936",
+          "sig" : "308187024201eefc7b6c1468ffa7d60b8408bd44c64a3ffaff298168c5016c6f504031867ea14ae48c661b8124418b4ed6ccc32df6bac6d0a485b1990236e15676268b7868d2760241515d48436afffdb65caed737116a861974b734bd1903e37dbbc231a9db37464ed762e364cac8b32f1546d6de37979fa05f8b80159a0f747d9470291af6569d6d94",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 308,
+          "comment" : "special case hash",
+          "msg" : "353739303230303830",
+          "sig" : "308188024201271b912ca055040c227955df729757654aa9bbdb73c61ba14155220e4e7132319f6fb0ee94f2fbe160738f1dce2ad690845c38d962db4fda1598e93270da84a2bb024200b8907f041c3b19b9234ab555d0b48325b0cd330889a53276a1e913bab892b9c05cfa889005b14ee2730220746aecf12af911c5baea4be377ee76c0eeaf47b7a712",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 309,
+          "comment" : "special case hash",
+          "msg" : "35333434373837383438",
+          "sig" : "3081880242016a813db0f75f9047fb11f3e19fc1688c29328a54f56ae30c1c9d9378537bfc40c5719d084e49a3b4aea255f5b7f6cc775492b5371e6b67b2d6abd5743e10fac709024201c258ffd830151bfd41ccdabb86b24af846612788b361c196d24e997ccf3f17d4452f63d32851a483072e6908095e5c49bbc241a0417749b097bc1ca0e4d127779b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 310,
+          "comment" : "special case hash",
+          "msg" : "3139323636343130393230",
+          "sig" : "3081870241156a04c22ea5bdb7871124f1117301d781113ac4c9d4da05fea536e983d9261d25dc97006f8c78de23c788718557cf6f98863994af2086f0be3e8aa8812dc3a11d024200ffca96b04c56a4a6ce5d22b36e44d3b974d520e7f7c0f9d69034f9e59e0bbdc43236b3e4bfb0f6bde8802cc5cd6022cff166f4c488d64f38d44e3c563da31cf6fe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 311,
+          "comment" : "special case hash",
+          "msg" : "33373033393135373035",
+          "sig" : "3081880242010913540ad73ceef7314d1758264e1d1525a371a7b9b3086971599a6b749be4d6ba69269b089508f6500dd925aa89a7c7cb7185e0cca7d2ee5664f22845d961e31702420135256c79ea5e5768fb3a55e2899b12219b8f68953ccd98c710b6a13de0f59786f4331845e65c7dd6340023a5e280206ca31416058f395fff4bb5de411ff66fc018",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 312,
+          "comment" : "special case hash",
+          "msg" : "3831353435373730",
+          "sig" : "308188024201b5051ca0dd3b20df7d8c5b92cb42b8a204f92fb4e58c612f43d3800de8c0683c427e832ce622156747052b81bfbf6ed5fa177b6d47858ec8478f6c9ca7948fd511024201fe5710fac0e9d3e2b3b83081b28b194b822d0c13397bf1516140cbe3faa52e908848f69789a741b9cd54d703a94577fa813e2f2c75834807401ca010fde5328317",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 313,
+          "comment" : "special case hash",
+          "msg" : "313935353330333737",
+          "sig" : "3081870242008d3c8f8e7ab74d49e16a4c7db3a393fa9567777e373313667f9ce32b1b5e648debffedfd2ff5345ca1b8154c18c8b883957d911e41336285f86261c3ee225fdedd02413c51b84c2c9a3feb76a6518634b6f09c0dde8a9d08dec0b3d66135cc1bdb0a80fd69636104af69de8f4062646b29fa3af685ec82704cef706a18c59ca7eca0fb56",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 314,
+          "comment" : "special case hash",
+          "msg" : "31323637383130393033",
+          "sig" : "308187024201195625a64ac11c4fc1fc479ef80430eb85c1af77f8a197a17e009569ef6c41ac6f35850755379f478d8928b154e3baaa29e92b481ac04dc72f3728b4f088ff37dc02410d55c7067877dd1302fdc6bb69b7b7c024e4cf3a0e924102d744ac52366d9d76d5855d3da228c4b67bc7bc4b2a14e7999962cc9bbdc517fc24a823abf584b8f56e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 315,
+          "comment" : "special case hash",
+          "msg" : "3131313830373230383135",
+          "sig" : "308187024126eb68bc0fb7664c35bf5762cd532dce33b0e396e97d6f4143dc6e1e766c836e27c069da9ea1e74e0b03d030cf8a81490508c1c728f86e59282df94de8d8a0dcaf024200a9fb584b712986f19ab7568693df278cafa43272dba400ff333cf48b5556e6e78353a665605c70b6fd0f18f30b850e1a47cda42c4c924bca80102e6793be9a8698",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 316,
+          "comment" : "special case hash",
+          "msg" : "38333831383639323930",
+          "sig" : "308188024200f3d34e36f9754dfa8eafab160ca96d91c7f4f388ec82ac33784026bb6c6a035719eaeec3ee511fffb22dd5d6ab819e6c6387192d6c3a6e9249ead565157e323f62024201b5786b1d662d26fe9f69c370d2bc18882abef693c8f17100a02725de7c9f03602fd53a9208b573b3b7b0b66db971767bde835f9e8f42ada201e7b7391b86fe0294",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 317,
+          "comment" : "special case hash",
+          "msg" : "33313331323837323737",
+          "sig" : "308188024200e69c833b604075e9b28a2ff73a56a32e1a247ef9ae01e7a0e471f6015c2b86eb864c281c8c93d2acf5653ad05bafab2f58027f37513eb8569f50bd475e770e9a81024200b9c9d6ce09b53025bfcaa7d172ae41a9b636aa4b80a930931fc99e5e2aa23306f19dc57399b0431e72440a1f4ec7d5ca902f0f7b81c91de85e469f992fdfd4c52e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 318,
+          "comment" : "special case hash",
+          "msg" : "3134333331393236353338",
+          "sig" : "308188024201c6b8b5cf3c4dd3d62391f18e97eef3aa6ace0ae2c6fc97a561cb8e49c087dbcf8135fa433b566b3385cb57202f1b12164fe62765ef73b72a94e7a57870989a498102420185944434b83a0d0fb4bcdce8ddaadb30a1e440815e7674562df9c8bf711222208cc346b9665d90abedb437912391505dd5d26f0178e7c063790f5518f47d1b05c7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 319,
+          "comment" : "special case hash",
+          "msg" : "333434393038323336",
+          "sig" : "3081880242009f351a41d5375b8993e90b8d8a65bf01d52d14aba1dbe49cbb4ea823804f2b533e0c167903c8bbc593297c18f309798a544787d598074cbf56ef0e5022520912ad024201b892740a57204186bd5f434f72d1534b4289f8f7114cb7b1c9cf4541d754f314448cc32deaf35608263488fdc7596f7481ec098b36f8e440829194becc746c77f5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 320,
+          "comment" : "special case hash",
+          "msg" : "36383239383335393239",
+          "sig" : "308187024201fe24ea831199e31cc68ef23980c4babd3773040870af8823a19708bd0229adc1ce99d02e4d95224101e3e974236f54df86051fa1e9fd21380432633b2495ab782a02410efd1f2a281f967e7b09d721581356a714c499f9b14f781992eb9ae7a19f6825045fdc6d9d763f44e1e7c91480a678a1d8ecf6d66e76cea3505f65ff78cff15cbd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 321,
+          "comment" : "special case hash",
+          "msg" : "33343435313538303233",
+          "sig" : "3081870242014c6ee9de0a2a0b60c981831e0acd6636b46ae134fedce61b0488112663b24e1d7e74e227fea883d26b68f21e4135ba0e2069bbe0d9c6433c3908fd5b00182894b002416a180a493182c6bc2a09d7e17ff5d62015293f1e8ae205a16fa09042b0a9af6794cb377f4b8b1175fcee5137c234900f735c484feb7da4cbb405cf9e5370fe4f49",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 322,
+          "comment" : "special case hash",
+          "msg" : "3132363937393837363434",
+          "sig" : "308188024201044a45853ada17ca761acc7df6d1d380252cb0fa66124d9278a5ed8a4a60453bc71de1dbe32b0261165948823c461c7c1eb1714ec1dbf66fd602c7a47446d1dae1024200f8b27f7c71e37e4b440d2c86f1c1d50bf7c53d3878ed27e7bcfbeb902f769f86d6c3e8820b99f890050f0dbebd2132e84626c5b16a8c7ffffc3a30ace69dd15a11",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 323,
+          "comment" : "special case hash",
+          "msg" : "333939323432353533",
+          "sig" : "3081870241676a381b18d05207cddd73b44e4dd71449985c0fa7de1fff43ca5155139a1a09e5e3fd754d86ebbe32f6609f6e906d48d24790e494343c61faa90bfdaa4f49fdc7024200fbc1c891bf6e368fccad51cc9b2c29e8e92b658e88c0d23285af269aff6702a55a0ab16807e5523b6637bbb004727f6f55c51ad4cec8c924f9c1feb24601aeddef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 324,
+          "comment" : "special case hash",
+          "msg" : "31363031393737393737",
+          "sig" : "3081880242013c9a575382ff6881c908fb5184be7baf38edb0b06008592558efd57dd8fb9993c893800a6ac8c6d2e34ebfbeff43e63263f133868d0ac7a838f69aff26d60a38490242009d22ae7bca8a75a53214c3eece437fb28e05b076ec704d751a28a7ed7e529d5c5338be8c724afa547574a17f70510b2462748a53678e39752a688dc8cf39e886c2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 325,
+          "comment" : "special case hash",
+          "msg" : "3130383738373535313435",
+          "sig" : "308188024201071ce5a19a09aacd43c7cacd58a439dcca4e85f94ea1d48a60f298ee01bb3eeb11d5daf545e7086486f8e4b518a15be69620ab920cf95c5c15ff178c903124fac3024201ad6eaeedece9a7592bd21508b2720f1b8c4bf55637b1e8a5ce5359775b980b21eb1d33e8ebf5c0b3d7829152a295b8a9a1343c25350e35f709936accc8ce08b0b1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 326,
+          "comment" : "special case hash",
+          "msg" : "37303034323532393939",
+          "sig" : "308188024201bdae499160f4cc6cd163cf110bb1f9b421e8786a8ef9297e4b98fd508a1d14c50617c8d1a3de94fc8bd6c38055e4906b20fdcab6ef7bf9e7e5c98ef3e83e38ec3b024201ba867b8ee72bb7304ff83fc2d734749447420791d5609e0515de4e05fa70a83385a853cac6c47a075c8c61e4b65b9774574101cf4e081770f83ae1b7e727010ba3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 327,
+          "comment" : "special case hash",
+          "msg" : "31353635333235323833",
+          "sig" : "3081860240269fc7ed89e554aa52b3875dc00bc140c1937d4f1b32e29da41ff241cdb9bd3058fc148f905982b8717b035e0db00ded7ebcb08572ec76bf0128411145d73091024201b4bd6bc4ba7befd5c305e018448a771b71fa1a11b3a2c6185dd6b8477c35eaeb4733fecd90f38ecba628f27c02f809191e993e1e7ff590383e2ec2afd08020b267",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 328,
+          "comment" : "special case hash",
+          "msg" : "3233383236333432333530",
+          "sig" : "308188024201a5cecc0e572f5ee4eed6755d3230ec5a933c1fb0e35ae771a1fcf0dc880e1c159dd5b6d192dc377505048b7188de3feb815a81a4f30d9226cdc85f751dec1a0410024201ef4a743e1e16f0a60201cc1060625ede6f0936e7af90b42736281e89fe7f2de6aa3f25c68576da705d8b3f6d5d8a34d3073307ea198d1cc8d72a18ef25e90f31af",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 329,
+          "comment" : "special case hash",
+          "msg" : "31343437383437303635",
+          "sig" : "308188024201a92b43f57421e54d2528d305e7d5aac9a708e75a7d6fedb47908a4e3edcabdd836a2c4e8436f3b7b64895254536174d88c6dca143699522bc2dfdeebcbf38eb90502420093b0b99a89de72aca0c03e12724c2be323577a4629cb47fdda5b12b61ace0b9fdb97549d3d2a1dac15da66ba6389ee54cbc82c995b9f3aa3ae8474f4bb4b52da8a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 330,
+          "comment" : "special case hash",
+          "msg" : "3134323630323035353434",
+          "sig" : "308188024200a0400f255174ffb8548c29f5faa70e806bb6f6ca08a08753c85c5d145a555cc8e2df285af9985f2e729d4a99a734b7e7fc95560d546a067fda03529f56b2fe66bc024200d7fb60271d22ecb5d8ec904a9df1a416be706ce539e34650b8fc514d1dd7afebc1344c0c68c533c5b20ee249a77c075293b2d7efc8731c2e3619be59da871bb083",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 331,
+          "comment" : "special case hash",
+          "msg" : "31393933383335323835",
+          "sig" : "3081880242019207c7b645aa45c2722331f46e094f2eb0052075b8ac9414ad77baafd01d4d1fdc68344136fbce01edfa5627bfb8f3c128abb61072c74802192e89137c68d0cc31024200ff15b0218f81f0a848742f683cb4d1b7c517efdb8fcf8ac6a35e4971b35536851ed68de40a6e1a4a23bddb5b42efca23b91e91959a4f7e2afa196779c96c6c654c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 332,
+          "comment" : "special case hash",
+          "msg" : "34323932313533353233",
+          "sig" : "308188024200aaf119702b9985354bbe3f6b6cda8c46151af4202546dfbe04d5f0ffd18ebe7b29d616f1c40376a412a52f4204b5a13e7f3e4304ead566fc41bf4b5fc0b84c8a2d024200d599deafd4fa2368cd072b854a3d53425d06adf3573e886b81248a7328a546ddc41caed38c6b1ffeaec9a98c940905cbffa87b936da980d4a9003da41e0c59c92f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 333,
+          "comment" : "special case hash",
+          "msg" : "34343539393031343936",
+          "sig" : "30818702416c09a59e71cf34f983f75dbb4724c4828a93021cee8fd7d92af6941ca8efc9c5ddda7c49a0e1777225782e09313e3091f056122e585c4eaa689fb2fdb1cb7848d80242019f0c5ff6b4638f4c33916db76f9d078bfa8f9e25ae00348e46bb32d777aa26155b82ea73a9e4e2f21f6a65c73ed6c6ab2101cef3524d45b9fc6ea1292f1986acad",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 334,
+          "comment" : "special case hash",
+          "msg" : "31333933393731313731",
+          "sig" : "3081880242014e791c42f3998458c5e17f895d25c85cb419195d65e5a0b9a42cf13ddd36959c73460f54aa840d2254355c6ac626f440cb3a84fba632262c9dc5cab31be7da106b024200abb97b682f01f45168403613a7e2ff82bb4a9fc20952a35d935428f71ddcc799c6d9085fe3230d72261d73cd082e8108523da7ba0b1691ad6ea63f5f4e8e8909f4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 335,
+          "comment" : "special case hash",
+          "msg" : "32333930363936343935",
+          "sig" : "3081880242013ded35ddff2f97780bbc60b8cec89855a35183a48f8fa6bbdc183994bf89021118cc019629df72112b2c529c023e7a5cfce253f7fdb49105d238680b64275a213c0242009c92e7a0f71608e8d8cfab3f850f7fda1a1a1d056e72254469afe5ceec3c718e6a462e1346941eb08c105501647502c1a810a29df8b208da6a5b296b2bd1e98137",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 336,
+          "comment" : "special case hash",
+          "msg" : "3131343436303536323634",
+          "sig" : "308188024201d0d29756ebff02b71674fa4eae37557ccd51a036fb1eb0b7121b405e7fabd60592927d805b75815af1bca6e9d6c5484225bdd0ec7a40735da972fd5ff645d86f1d0242008b9fe55357dc118070cf898973a64e7554b734e900c675541e20332a260ca51a23248d9b8f47ded811cfce556a06a71ba5dc5b873075f264a6843e675caf06a534",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 337,
+          "comment" : "special case hash",
+          "msg" : "363835303034373530",
+          "sig" : "30818802420165fb993f39d350ed60c8483dd6e4e6736591dea974ecd8ab027d3839b752322ee220d40bb6fc0b0d5a8c42928bde50f659b18f51f42fb2b1aa4583892a9114a0c3024200a8816c09d47138bf662da4ba25caf44e24185696d4914a7de2b2535f73b9afbd3ffa9cb0a86a115e4d9ac5be48cf7e8fe276466abdf17127bcc7aaf4d096008ca4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 338,
+          "comment" : "special case hash",
+          "msg" : "3232323035333630363139",
+          "sig" : "30818702410b901c88ea699e715f6db864e23a676e7f7f2415ac1f850f2dde1ad0d3f9c92e8c5de66d45174d619955fae4b0dfebe49c583506481d28d30cbf58e2ac49f370c202420144c97b688b9ecc07b84c68095267e17e48232922756609e9859d18d2eb7844ec925150c39f2b3a255c882be705e0a8e30e68e49fe7914dbcc3ccfbc1d467050f80",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 339,
+          "comment" : "special case hash",
+          "msg" : "36323135363635313234",
+          "sig" : "308188024200abbd9e77ef1e2a36c6b06f063d93effb8e852387a94bfdf8359b5c18708f90d9f4e9749fd45347f637546b08733789c988fda4f0309551bde813a0bb1a232adee102420191165d58d153fec68f5cc83bcf5891e2e0ca9681204876e872453e9ebd45870b6878ee437e4d833c6ec54337b779acbf9f8202df510d269a710d0c43e4e07b040d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400491cd6c5f93b7414d6d45cfe3d264bd077fc4427a4b0afede76cac537a7ca5ee2c44564258260f7691b81fdfecebfd03ba672277875c5b311ea920e74fb3978af50144a353a251b4297894161bae12d16a89c33b719f904cfccc277df78cea5379198642fd549df919904dc0cf3662eeab01ef11b8e3cb49b51b853d98f042600c0997",
+        "wx" : "491cd6c5f93b7414d6d45cfe3d264bd077fc4427a4b0afede76cac537a7ca5ee2c44564258260f7691b81fdfecebfd03ba672277875c5b311ea920e74fb3978af5",
+        "wy" : "144a353a251b4297894161bae12d16a89c33b719f904cfccc277df78cea5379198642fd549df919904dc0cf3662eeab01ef11b8e3cb49b51b853d98f042600c0997"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400491cd6c5f93b7414d6d45cfe3d264bd077fc4427a4b0afede76cac537a7ca5ee2c44564258260f7691b81fdfecebfd03ba672277875c5b311ea920e74fb3978af50144a353a251b4297894161bae12d16a89c33b719f904cfccc277df78cea5379198642fd549df919904dc0cf3662eeab01ef11b8e3cb49b51b853d98f042600c0997",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQASRzWxfk7dBTW1Fz+PSZL0Hf8RCek\nsK/t52ysU3p8pe4sRFZCWCYPdpG4H9/s6/0Dumcid4dcWzEeqSDnT7OXivUBRKNT\nolG0KXiUFhuuEtFqicM7cZ+QTPzMJ333jOpTeRmGQv1UnfkZkE3AzzZi7qsB7xG4\n48tJtRuFPZjwQmAMCZc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 340,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "313233343030",
+          "sig" : "3067022105ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf5024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 341,
+          "comment" : "r too large",
+          "msg" : "313233343030",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04015f281dcdc976641ce024dca1eac8ddd7f949e3290d3b2de11c4873f3676a06ff9f704c24813bd8d63528b2e813f78b869ff38112527e79b383a3bd527badb929ff01502e4cc7032d3ec35b0f8d05409438a86966d623f7a2f432bf712f76dc6345405dfcfcdc36d477831d38eec64ede7f4d39aa91bffcc56ec4241cb06735b2809fbe",
+        "wx" : "15f281dcdc976641ce024dca1eac8ddd7f949e3290d3b2de11c4873f3676a06ff9f704c24813bd8d63528b2e813f78b869ff38112527e79b383a3bd527badb929ff",
+        "wy" : "1502e4cc7032d3ec35b0f8d05409438a86966d623f7a2f432bf712f76dc6345405dfcfcdc36d477831d38eec64ede7f4d39aa91bffcc56ec4241cb06735b2809fbe"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004015f281dcdc976641ce024dca1eac8ddd7f949e3290d3b2de11c4873f3676a06ff9f704c24813bd8d63528b2e813f78b869ff38112527e79b383a3bd527badb929ff01502e4cc7032d3ec35b0f8d05409438a86966d623f7a2f432bf712f76dc6345405dfcfcdc36d477831d38eec64ede7f4d39aa91bffcc56ec4241cb06735b2809fbe",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBXygdzcl2ZBzgJNyh6sjd1/lJ4ykN\nOy3hHEhz82dqBv+fcEwkgTvY1jUosugT94uGn/OBElJ+ebODo71Se625Kf8BUC5M\nxwMtPsNbD40FQJQ4qGlm1iP3ovQyv3EvdtxjRUBd/PzcNtR3gx047sZO3n9NOaqR\nv/zFbsQkHLBnNbKAn74=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 342,
+          "comment" : "r,s are large",
+          "msg" : "313233343030",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386407024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400336d5d08fe75c50946e6dddd36c550bb054d9925c8f254cfe1c3388f720b1d6500a90412b020b3db592b92ab9f68f1c693b8d1365371635e21bc43eaadf89e4e7401d48d60319dfd06f935fc46488c229b611eecd038804ae9f681a078dde8ed8f8e20ad9504bcf3c24a0b566b1e85b2d3ed0a1273292ff5f87bae5b3c87857e67ed81",
+        "wx" : "336d5d08fe75c50946e6dddd36c550bb054d9925c8f254cfe1c3388f720b1d6500a90412b020b3db592b92ab9f68f1c693b8d1365371635e21bc43eaadf89e4e74",
+        "wy" : "1d48d60319dfd06f935fc46488c229b611eecd038804ae9f681a078dde8ed8f8e20ad9504bcf3c24a0b566b1e85b2d3ed0a1273292ff5f87bae5b3c87857e67ed81"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400336d5d08fe75c50946e6dddd36c550bb054d9925c8f254cfe1c3388f720b1d6500a90412b020b3db592b92ab9f68f1c693b8d1365371635e21bc43eaadf89e4e7401d48d60319dfd06f935fc46488c229b611eecd038804ae9f681a078dde8ed8f8e20ad9504bcf3c24a0b566b1e85b2d3ed0a1273292ff5f87bae5b3c87857e67ed81",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAM21dCP51xQlG5t3dNsVQuwVNmSXI\n8lTP4cM4j3ILHWUAqQQSsCCz21krkqufaPHGk7jRNlNxY14hvEPqrfieTnQB1I1g\nMZ39Bvk1/EZIjCKbYR7s0DiASun2gaB43ejtj44grZUEvPPCSgtWax6FstPtChJz\nKS/1+HuuWzyHhX5n7YE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 343,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe02420095e19fd2b755d603bf994562d9a11f63cf4eadecbdc0ecb5a394e54529e8da58a527bc6d85725043786362ab4de6cbc7d80e625ae0a98861aea1c7bf7109c91f66",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04006f8fadedbae63701072c287c633f9c0052ea1e6cd00a84342cc0f626210071576abfd0875664b0746cdaf2745effc18d94905b0fc9d2cad4ba375c0ea2298c8d1c0150d128cb62a527ae6df3e92f1f280ea33248711ffe4b35c1b162a9508576860165e0ddc361d96fafcd2ff82776c743b9cd6845db61eb56739f5c4ef561e6c20d8c",
+        "wx" : "6f8fadedbae63701072c287c633f9c0052ea1e6cd00a84342cc0f626210071576abfd0875664b0746cdaf2745effc18d94905b0fc9d2cad4ba375c0ea2298c8d1c",
+        "wy" : "150d128cb62a527ae6df3e92f1f280ea33248711ffe4b35c1b162a9508576860165e0ddc361d96fafcd2ff82776c743b9cd6845db61eb56739f5c4ef561e6c20d8c"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004006f8fadedbae63701072c287c633f9c0052ea1e6cd00a84342cc0f626210071576abfd0875664b0746cdaf2745effc18d94905b0fc9d2cad4ba375c0ea2298c8d1c0150d128cb62a527ae6df3e92f1f280ea33248711ffe4b35c1b162a9508576860165e0ddc361d96fafcd2ff82776c743b9cd6845db61eb56739f5c4ef561e6c20d8c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAb4+t7brmNwEHLCh8Yz+cAFLqHmzQ\nCoQ0LMD2JiEAcVdqv9CHVmSwdGza8nRe/8GNlJBbD8nSytS6N1wOoimMjRwBUNEo\ny2KlJ65t8+kvHygOozJIcR/+SzXBsWKpUIV2hgFl4N3DYdlvr80v+Cd2x0O5zWhF\n22HrVnOfXE71YebCDYw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 344,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe024115837645583a37a7a665f983c5e347f65dca47647aa80fd2498a791d44d9b2850a151a6e86fce7d7bb814e724ff11b9ef726bf36c6e7548c37f82a24902876ee19",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04005e7eb6c4f481830abaad8a60ddb09891164ee418ea4cd2995062e227d33c229fb737bf330703097d6b3b69a3f09e79c9de0b402bf846dd26b5bb1191cff801355d01789c9afda567e61de414437b0e93a17611e6e76853762bc0aff1e2bc9e46ce1285b931651d7129b85aef2c1fab1728e7eb4449b2956dec33e6cd7c9ba125c5cd9d",
+        "wx" : "5e7eb6c4f481830abaad8a60ddb09891164ee418ea4cd2995062e227d33c229fb737bf330703097d6b3b69a3f09e79c9de0b402bf846dd26b5bb1191cff801355d",
+        "wy" : "1789c9afda567e61de414437b0e93a17611e6e76853762bc0aff1e2bc9e46ce1285b931651d7129b85aef2c1fab1728e7eb4449b2956dec33e6cd7c9ba125c5cd9d"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004005e7eb6c4f481830abaad8a60ddb09891164ee418ea4cd2995062e227d33c229fb737bf330703097d6b3b69a3f09e79c9de0b402bf846dd26b5bb1191cff801355d01789c9afda567e61de414437b0e93a17611e6e76853762bc0aff1e2bc9e46ce1285b931651d7129b85aef2c1fab1728e7eb4449b2956dec33e6cd7c9ba125c5cd9d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAXn62xPSBgwq6rYpg3bCYkRZO5Bjq\nTNKZUGLiJ9M8Ip+3N78zBwMJfWs7aaPwnnnJ3gtAK/hG3Sa1uxGRz/gBNV0BeJya\n/aVn5h3kFEN7DpOhdhHm52hTdivAr/HivJ5GzhKFuTFlHXEpuFrvLB+rFyjn60RJ\nspVt7DPmzXyboSXFzZ0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 345,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400b420fb1fecdd9cc5ea7d7c7617e70538db32e6d7a0ad722c63580f1f6a1f5537eb50930b90fd6fdd9abd40015f746d2fd8adf945a75621407edb6863588e41979e00295108a7e9d2191a287fd160bd24f498055dc9badbd61c6a89fede27b4f9d479d86a20b6dc07c90f008ebe68a0e0cc15a4a03b8cf990e4ff7ed6e3892b21c52153",
+        "wx" : "0b420fb1fecdd9cc5ea7d7c7617e70538db32e6d7a0ad722c63580f1f6a1f5537eb50930b90fd6fdd9abd40015f746d2fd8adf945a75621407edb6863588e41979e",
+        "wy" : "295108a7e9d2191a287fd160bd24f498055dc9badbd61c6a89fede27b4f9d479d86a20b6dc07c90f008ebe68a0e0cc15a4a03b8cf990e4ff7ed6e3892b21c52153"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400b420fb1fecdd9cc5ea7d7c7617e70538db32e6d7a0ad722c63580f1f6a1f5537eb50930b90fd6fdd9abd40015f746d2fd8adf945a75621407edb6863588e41979e00295108a7e9d2191a287fd160bd24f498055dc9badbd61c6a89fede27b4f9d479d86a20b6dc07c90f008ebe68a0e0cc15a4a03b8cf990e4ff7ed6e3892b21c52153",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAtCD7H+zdnMXqfXx2F+cFONsy5teg\nrXIsY1gPH2ofVTfrUJMLkP1v3Zq9QAFfdG0v2K35RadWIUB+22hjWI5Bl54AKVEI\np+nSGRoof9FgvST0mAVdybrb1hxqif7eJ7T51HnYaiC23AfJDwCOvmig4MwVpKA7\njPmQ5P9+1uOJKyHFIVM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 346,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020102",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040032b9a17c201aec34d29b8c2764e7c7f6aeef10fb61bf9837117fad879f8c6a22a300006d2018cf42b25898ffc9a1bf507352e59e6a52e627cda160e17ea2f4600500317a89899b7cb3a0d33eafa02b0137a0fb1b05102b22b676f35b9ff6c050ddee9f185609ffb7f5165a769e440792b75044a43e838690d13f884aaae888bf5f86f0",
+        "wx" : "32b9a17c201aec34d29b8c2764e7c7f6aeef10fb61bf9837117fad879f8c6a22a300006d2018cf42b25898ffc9a1bf507352e59e6a52e627cda160e17ea2f46005",
+        "wy" : "317a89899b7cb3a0d33eafa02b0137a0fb1b05102b22b676f35b9ff6c050ddee9f185609ffb7f5165a769e440792b75044a43e838690d13f884aaae888bf5f86f0"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040032b9a17c201aec34d29b8c2764e7c7f6aeef10fb61bf9837117fad879f8c6a22a300006d2018cf42b25898ffc9a1bf507352e59e6a52e627cda160e17ea2f4600500317a89899b7cb3a0d33eafa02b0137a0fb1b05102b22b676f35b9ff6c050ddee9f185609ffb7f5165a769e440792b75044a43e838690d13f884aaae888bf5f86f0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAMrmhfCAa7DTSm4wnZOfH9q7vEPth\nv5g3EX+th5+MaiKjAABtIBjPQrJYmP/Job9Qc1LlnmpS5ifNoWDhfqL0YAUAMXqJ\niZt8s6DTPq+gKwE3oPsbBRArIrZ281uf9sBQ3e6fGFYJ/7f1Flp2nkQHkrdQRKQ+\ng4aQ0T+ISqroiL9fhvA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 347,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020103",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 348,
+          "comment" : "r is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a020103",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040067dd456b52f82a5d4c4a71b3ea9302f62a852ddc04ad25b62fef1ddf657374fb4e80679ddf42d212f0711db32b626d8593bd70892e93ed0adb273157b6df187938014d2c78509f3bd6f7d0fba4a90cb456286e267f5dd9d967842a6086884d66c7b2a932833470c721a4a728cd8486d15314232d801f17e3a6fd7068bdebacdf82c0b4",
+        "wx" : "67dd456b52f82a5d4c4a71b3ea9302f62a852ddc04ad25b62fef1ddf657374fb4e80679ddf42d212f0711db32b626d8593bd70892e93ed0adb273157b6df187938",
+        "wy" : "14d2c78509f3bd6f7d0fba4a90cb456286e267f5dd9d967842a6086884d66c7b2a932833470c721a4a728cd8486d15314232d801f17e3a6fd7068bdebacdf82c0b4"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040067dd456b52f82a5d4c4a71b3ea9302f62a852ddc04ad25b62fef1ddf657374fb4e80679ddf42d212f0711db32b626d8593bd70892e93ed0adb273157b6df187938014d2c78509f3bd6f7d0fba4a90cb456286e267f5dd9d967842a6086884d66c7b2a932833470c721a4a728cd8486d15314232d801f17e3a6fd7068bdebacdf82c0b4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAZ91Fa1L4Kl1MSnGz6pMC9iqFLdwE\nrSW2L+8d32VzdPtOgGed30LSEvBxHbMrYm2Fk71wiS6T7QrbJzFXtt8YeTgBTSx4\nUJ871vfQ+6SpDLRWKG4mf13Z2WeEKmCGiE1mx7KpMoM0cMchpKcozYSG0VMUIy2A\nHxfjpv1waL3rrN+CwLQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 349,
+          "comment" : "s is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3047020101024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e914b3a90",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040068d7b518214766ac734a7461d499352444377d50af42a1bbdb7f0032065ee6dc341ccf231af65250e7d13a80733abebff559891d4211d6c28cf952c9222303b53b00a2f3d7e14d9d8fabe1939d664e4615c6e24f5490c815c7651ccf6cc65252f88bcfd3b07fbdbaa0ba00441e590ccbcea00658f388f22c42d8a6d0f781ae5bb4d78b",
+        "wx" : "68d7b518214766ac734a7461d499352444377d50af42a1bbdb7f0032065ee6dc341ccf231af65250e7d13a80733abebff559891d4211d6c28cf952c9222303b53b",
+        "wy" : "0a2f3d7e14d9d8fabe1939d664e4615c6e24f5490c815c7651ccf6cc65252f88bcfd3b07fbdbaa0ba00441e590ccbcea00658f388f22c42d8a6d0f781ae5bb4d78b"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040068d7b518214766ac734a7461d499352444377d50af42a1bbdb7f0032065ee6dc341ccf231af65250e7d13a80733abebff559891d4211d6c28cf952c9222303b53b00a2f3d7e14d9d8fabe1939d664e4615c6e24f5490c815c7651ccf6cc65252f88bcfd3b07fbdbaa0ba00441e590ccbcea00658f388f22c42d8a6d0f781ae5bb4d78b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAaNe1GCFHZqxzSnRh1Jk1JEQ3fVCv\nQqG7238AMgZe5tw0HM8jGvZSUOfROoBzOr6/9VmJHUIR1sKM+VLJIiMDtTsAovPX\n4U2dj6vhk51mTkYVxuJPVJDIFcdlHM9sxlJS+IvP07B/vbqgugBEHlkMy86gBljz\niPIsQtim0PeBrlu014s=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 350,
+          "comment" : "small r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "304802020100024201efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7ef87b4de1fc92dd757639408a50bee10764e326fdd2fa308dfde3e5243fdf4ac5ac",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04011edc3b22b20f9a188b32b1e827d6e46b2ed61b9be6f4ada0b2c95835bee2738ec4dc5313831cce5f927210a7bc2f13abc02fa90e716fc1bd2f63c429a760ed23630118daad88fe9b9d66e66e71ce05d74137d277a9ca81c7d7aef1e74550890564103cc0d95d30f6205c9124829192e15d66fb1f4033032a42ba606e3edca6ec065c50",
+        "wx" : "11edc3b22b20f9a188b32b1e827d6e46b2ed61b9be6f4ada0b2c95835bee2738ec4dc5313831cce5f927210a7bc2f13abc02fa90e716fc1bd2f63c429a760ed2363",
+        "wy" : "118daad88fe9b9d66e66e71ce05d74137d277a9ca81c7d7aef1e74550890564103cc0d95d30f6205c9124829192e15d66fb1f4033032a42ba606e3edca6ec065c50"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004011edc3b22b20f9a188b32b1e827d6e46b2ed61b9be6f4ada0b2c95835bee2738ec4dc5313831cce5f927210a7bc2f13abc02fa90e716fc1bd2f63c429a760ed23630118daad88fe9b9d66e66e71ce05d74137d277a9ca81c7d7aef1e74550890564103cc0d95d30f6205c9124829192e15d66fb1f4033032a42ba606e3edca6ec065c50",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBHtw7IrIPmhiLMrHoJ9bkay7WG5vm\n9K2gsslYNb7ic47E3FMTgxzOX5JyEKe8LxOrwC+pDnFvwb0vY8Qpp2DtI2MBGNqt\niP6bnWbmbnHOBddBN9J3qcqBx9eu8edFUIkFZBA8wNldMPYgXJEkgpGS4V1m+x9A\nMwMqQrpgbj7cpuwGXFA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 351,
+          "comment" : "smallish r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "304d02072d9b4d347952cd02420100508d073413de829275e76509fd81cff49adf4c80ed2ddd4a7937d1d918796878fec24cc46570982c3fb8f5e92ccdcb3e677f07e9bd0db0b84814be1c7949b0de",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04012f8b9863a1887eca6827ad4accc2ba607f8592e5be15d9692b697a4061fcc81560c8feb2ae3851d00e06df3e0091f1f1ca5ec64761f4f8bd6d0c2cab2a121024440174b4e34aec517a0d2ceb2fd152ed1736bc330efca5e6d530ea170802fb6af031425903fa6a378405be5e47d1e52f62f859f537df9c0f6a4a6479a0aadafe219821",
+        "wx" : "12f8b9863a1887eca6827ad4accc2ba607f8592e5be15d9692b697a4061fcc81560c8feb2ae3851d00e06df3e0091f1f1ca5ec64761f4f8bd6d0c2cab2a12102444",
+        "wy" : "174b4e34aec517a0d2ceb2fd152ed1736bc330efca5e6d530ea170802fb6af031425903fa6a378405be5e47d1e52f62f859f537df9c0f6a4a6479a0aadafe219821"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004012f8b9863a1887eca6827ad4accc2ba607f8592e5be15d9692b697a4061fcc81560c8feb2ae3851d00e06df3e0091f1f1ca5ec64761f4f8bd6d0c2cab2a121024440174b4e34aec517a0d2ceb2fd152ed1736bc330efca5e6d530ea170802fb6af031425903fa6a378405be5e47d1e52f62f859f537df9c0f6a4a6479a0aadafe219821",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBL4uYY6GIfspoJ61KzMK6YH+FkuW+\nFdlpK2l6QGH8yBVgyP6yrjhR0A4G3z4AkfHxyl7GR2H0+L1tDCyrKhIQJEQBdLTj\nSuxReg0s6y/RUu0XNrwzDvyl5tUw6hcIAvtq8DFCWQP6ajeEBb5eR9HlL2L4WfU3\n35wPakpkeaCq2v4hmCE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 352,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "313233343030",
+          "sig" : "3053020d1033e67e37b32b445580bf4eff0242013cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc3393f632affd3eaa3c8fb64507bd5996497bd588fb9e3947c097ced7546b57c8998",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04008aed779a32b9bf56ea7ab46e4b914e55c65301cdbe9ea6e7ed44f7e978c0365989a19a5e48282fb1158f481c556505d66ff414a07003ebf82fca1698c33f2884c600a62426993ed5b177b6045e60b5fa1a1f8ce1ad5d70e7bc7b5af811dbf86e651f9ea02ec796ab991e1439bf07ffe2ac6052a8a0b0174d78a9441aaf4d8fc757d80f",
+        "wx" : "08aed779a32b9bf56ea7ab46e4b914e55c65301cdbe9ea6e7ed44f7e978c0365989a19a5e48282fb1158f481c556505d66ff414a07003ebf82fca1698c33f2884c6",
+        "wy" : "0a62426993ed5b177b6045e60b5fa1a1f8ce1ad5d70e7bc7b5af811dbf86e651f9ea02ec796ab991e1439bf07ffe2ac6052a8a0b0174d78a9441aaf4d8fc757d80f"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004008aed779a32b9bf56ea7ab46e4b914e55c65301cdbe9ea6e7ed44f7e978c0365989a19a5e48282fb1158f481c556505d66ff414a07003ebf82fca1698c33f2884c600a62426993ed5b177b6045e60b5fa1a1f8ce1ad5d70e7bc7b5af811dbf86e651f9ea02ec796ab991e1439bf07ffe2ac6052a8a0b0174d78a9441aaf4d8fc757d80f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAiu13mjK5v1bqerRuS5FOVcZTAc2+\nnqbn7UT36XjANlmJoZpeSCgvsRWPSBxVZQXWb/QUoHAD6/gvyhaYwz8ohMYApiQm\nmT7VsXe2BF5gtfoaH4zhrV1w57x7WvgR2/huZR+eoC7HlquZHhQ5vwf/4qxgUqig\nsBdNeKlEGq9Nj8dX2A8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 353,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "313233343030",
+          "sig" : "30480202010002420086ecbf54ab59a4e195f0be1402edd8657bb94618fab50f2fe20fe5ebbc9ff0e491397ed313cc918d438eedb9b5ecb4d9dfa305303505baf25400ed8c20fc3fc47b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040093697b0378312b38c31deae073f24a8163f086ac2116b7c37c99157cfae7970ab4201f5a7e06ec39eedbf7d87f3021ca439e3ff7c5988b84679937bab786dbe12e01c6987c86077c05423ac281de6d23f6a685870e12855463770eccabc9f3a1d23cb2a0c15479420b5dd40fbdc9886c463b62ee23239df3a8b861c3291d28224f6057",
+        "wx" : "093697b0378312b38c31deae073f24a8163f086ac2116b7c37c99157cfae7970ab4201f5a7e06ec39eedbf7d87f3021ca439e3ff7c5988b84679937bab786dbe12e",
+        "wy" : "1c6987c86077c05423ac281de6d23f6a685870e12855463770eccabc9f3a1d23cb2a0c15479420b5dd40fbdc9886c463b62ee23239df3a8b861c3291d28224f6057"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040093697b0378312b38c31deae073f24a8163f086ac2116b7c37c99157cfae7970ab4201f5a7e06ec39eedbf7d87f3021ca439e3ff7c5988b84679937bab786dbe12e01c6987c86077c05423ac281de6d23f6a685870e12855463770eccabc9f3a1d23cb2a0c15479420b5dd40fbdc9886c463b62ee23239df3a8b861c3291d28224f6057",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAk2l7A3gxKzjDHergc/JKgWPwhqwh\nFrfDfJkVfPrnlwq0IB9afgbsOe7b99h/MCHKQ54/98WYi4RnmTe6t4bb4S4Bxph8\nhgd8BUI6woHebSP2poWHDhKFVGN3DsyryfOh0jyyoMFUeUILXdQPvcmIbEY7Yu4j\nI53zqLhhwykdKCJPYFc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 354,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3053020d062522bbd3ecbe7c39e93e7c2402420086ecbf54ab59a4e195f0be1402edd8657bb94618fab50f2fe20fe5ebbc9ff0e491397ed313cc918d438eedb9b5ecb4d9dfa305303505baf25400ed8c20fc3fc47b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04019a9f1b7b7f574a021fedd8679a4e998b48524854eefbaae4104a3973d693e02104fa119243256e3d986f8b4966c286ab8cb1f5267c0bbd6bc182aeb57493a5d5b60158b97eb74862fbca41763e8d3a7beb5fccd05565b75a3a43c2b38b96eb2ccff149c23ef1ac09fc455d808ff28081e985f9e172fc62d0900585172cfbff87383595",
+        "wx" : "19a9f1b7b7f574a021fedd8679a4e998b48524854eefbaae4104a3973d693e02104fa119243256e3d986f8b4966c286ab8cb1f5267c0bbd6bc182aeb57493a5d5b6",
+        "wy" : "158b97eb74862fbca41763e8d3a7beb5fccd05565b75a3a43c2b38b96eb2ccff149c23ef1ac09fc455d808ff28081e985f9e172fc62d0900585172cfbff87383595"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004019a9f1b7b7f574a021fedd8679a4e998b48524854eefbaae4104a3973d693e02104fa119243256e3d986f8b4966c286ab8cb1f5267c0bbd6bc182aeb57493a5d5b60158b97eb74862fbca41763e8d3a7beb5fccd05565b75a3a43c2b38b96eb2ccff149c23ef1ac09fc455d808ff28081e985f9e172fc62d0900585172cfbff87383595",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBmp8be39XSgIf7dhnmk6Zi0hSSFTu\n+6rkEEo5c9aT4CEE+hGSQyVuPZhvi0lmwoarjLH1JnwLvWvBgq61dJOl1bYBWLl+\nt0hi+8pBdj6NOnvrX8zQVWW3WjpDwrOLlussz/FJwj7xrAn8RV2Aj/KAgemF+eFy\n/GLQkAWFFyz7/4c4NZU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 355,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "313233343030",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138638a0242015555555555555555555555555555555555555555555555555555555555555555518baf05027f750ef25532ab85fa066e8ad2793125b112da747cf524bf0b7aed5b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401aa9f3a894b727d7a01b09c4f051b469d661de1e06915b599e211463319ac1b7ca8a6097f1be401d70a71d0b53655cdf9bef748d886e08ee7de2fa781e93ec41a2601ba9ea67385e19894fc9cd4b0173ab215f7b96f23bc420665d46c75447bf200ae3ac7b42bd9b857fd1c85cce8ea9c8d2345e4687dd70df59f5149510735bb9c7b64",
+        "wx" : "1aa9f3a894b727d7a01b09c4f051b469d661de1e06915b599e211463319ac1b7ca8a6097f1be401d70a71d0b53655cdf9bef748d886e08ee7de2fa781e93ec41a26",
+        "wy" : "1ba9ea67385e19894fc9cd4b0173ab215f7b96f23bc420665d46c75447bf200ae3ac7b42bd9b857fd1c85cce8ea9c8d2345e4687dd70df59f5149510735bb9c7b64"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401aa9f3a894b727d7a01b09c4f051b469d661de1e06915b599e211463319ac1b7ca8a6097f1be401d70a71d0b53655cdf9bef748d886e08ee7de2fa781e93ec41a2601ba9ea67385e19894fc9cd4b0173ab215f7b96f23bc420665d46c75447bf200ae3ac7b42bd9b857fd1c85cce8ea9c8d2345e4687dd70df59f5149510735bb9c7b64",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBqp86iUtyfXoBsJxPBRtGnWYd4eBp\nFbWZ4hFGMxmsG3yopgl/G+QB1wpx0LU2Vc35vvdI2IbgjufeL6eB6T7EGiYBup6m\nc4XhmJT8nNSwFzqyFfe5byO8QgZl1Gx1RHvyAK46x7Qr2bhX/RyFzOjqnI0jReRo\nfdcN9Z9RSVEHNbuce2Q=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 356,
+          "comment" : "s == 1",
+          "msg" : "313233343030",
+          "sig" : "3047024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 357,
+          "comment" : "s == 0",
+          "msg" : "313233343030",
+          "sig" : "3047024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04002a07f13f3e8df382145b7942fe6f91c12ff3064b314b4e3476bf3afbb982070f17f63b2de5fbe8c91a87ae632869facf17d5ce9d139b37ed557581bb9a7e4b8fa30024b904c5fc536ae53b323a7fd0b7b8e420302406ade84ea8a10ca7c5c934bad5489db6e3a8cc3064602cc83f309e9d247aae72afca08336bc8919e15f4be5ad77a",
+        "wx" : "2a07f13f3e8df382145b7942fe6f91c12ff3064b314b4e3476bf3afbb982070f17f63b2de5fbe8c91a87ae632869facf17d5ce9d139b37ed557581bb9a7e4b8fa3",
+        "wy" : "24b904c5fc536ae53b323a7fd0b7b8e420302406ade84ea8a10ca7c5c934bad5489db6e3a8cc3064602cc83f309e9d247aae72afca08336bc8919e15f4be5ad77a"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004002a07f13f3e8df382145b7942fe6f91c12ff3064b314b4e3476bf3afbb982070f17f63b2de5fbe8c91a87ae632869facf17d5ce9d139b37ed557581bb9a7e4b8fa30024b904c5fc536ae53b323a7fd0b7b8e420302406ade84ea8a10ca7c5c934bad5489db6e3a8cc3064602cc83f309e9d247aae72afca08336bc8919e15f4be5ad77a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAKgfxPz6N84IUW3lC/m+RwS/zBksx\nS040dr86+7mCBw8X9jst5fvoyRqHrmMoafrPF9XOnRObN+1VdYG7mn5Lj6MAJLkE\nxfxTauU7Mjp/0Le45CAwJAat6E6ooQynxck0utVInbbjqMwwZGAsyD8wnp0keq5y\nr8oIM2vIkZ4V9L5a13o=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 358,
+          "comment" : "point at infinity during verify",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd28c343c1df97cb35bfe600a47b84d2e81ddae4dc44ce23d75db7db8f489c3204024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040060daf59638158ed9d3d7e8428501334764162f9be239e168fae9af348c30a7be1cfa4d9636c3bb621d7e0aa71446f8d4a37f2d43274a4255b226f612382f63152e016e48300124a636b206fad4d0355862a852623799afee941e864d96dcbf55b801cabd6249b6f567506d5a503e7d03b4764c70fc44c5365f32c3603678476d62b09d",
+        "wx" : "60daf59638158ed9d3d7e8428501334764162f9be239e168fae9af348c30a7be1cfa4d9636c3bb621d7e0aa71446f8d4a37f2d43274a4255b226f612382f63152e",
+        "wy" : "16e48300124a636b206fad4d0355862a852623799afee941e864d96dcbf55b801cabd6249b6f567506d5a503e7d03b4764c70fc44c5365f32c3603678476d62b09d"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040060daf59638158ed9d3d7e8428501334764162f9be239e168fae9af348c30a7be1cfa4d9636c3bb621d7e0aa71446f8d4a37f2d43274a4255b226f612382f63152e016e48300124a636b206fad4d0355862a852623799afee941e864d96dcbf55b801cabd6249b6f567506d5a503e7d03b4764c70fc44c5365f32c3603678476d62b09d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAYNr1ljgVjtnT1+hChQEzR2QWL5vi\nOeFo+umvNIwwp74c+k2WNsO7Yh1+CqcURvjUo38tQydKQlWyJvYSOC9jFS4Bbkgw\nASSmNrIG+tTQNVhiqFJiN5mv7pQehk2W3L9VuAHKvWJJtvVnUG1aUD59A7R2THD8\nRMU2XzLDYDZ4R21isJ0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 359,
+          "comment" : "u1 == 1",
+          "msg" : "313233343030",
+          "sig" : "308186024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad024043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040051fe6a35a85070c7c29502a87672a38153d799aef734226b64d8fd3398621701117f0af9d9afaf6dbb8ca3007255dc79b0f41ed552512cb29207b15a01cdfdfaae01a16c61277586356efadcb24764f21f574ef96f2caabc3f47fa66fb8719d7785824061c2d6d7a4bcb851540e62b2f00960b283eac7808d1813ef51b46e1149d3e4d",
+        "wx" : "51fe6a35a85070c7c29502a87672a38153d799aef734226b64d8fd3398621701117f0af9d9afaf6dbb8ca3007255dc79b0f41ed552512cb29207b15a01cdfdfaae",
+        "wy" : "1a16c61277586356efadcb24764f21f574ef96f2caabc3f47fa66fb8719d7785824061c2d6d7a4bcb851540e62b2f00960b283eac7808d1813ef51b46e1149d3e4d"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040051fe6a35a85070c7c29502a87672a38153d799aef734226b64d8fd3398621701117f0af9d9afaf6dbb8ca3007255dc79b0f41ed552512cb29207b15a01cdfdfaae01a16c61277586356efadcb24764f21f574ef96f2caabc3f47fa66fb8719d7785824061c2d6d7a4bcb851540e62b2f00960b283eac7808d1813ef51b46e1149d3e4d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAUf5qNahQcMfClQKodnKjgVPXma73\nNCJrZNj9M5hiFwERfwr52a+vbbuMowByVdx5sPQe1VJRLLKSB7FaAc39+q4BoWxh\nJ3WGNW763LJHZPIfV075byyqvD9H+mb7hxnXeFgkBhwtbXpLy4UVQOYrLwCWCyg+\nrHgI0YE+9RtG4RSdPk0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 360,
+          "comment" : "u1 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "308188024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad024201ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d6acca94fdcdefd78dc0b56a22d16f2eec26ae0c1fb484d059300e80bd6b0472b3d1222ff5d08b03d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400b4ffc0fff087607ad26c4b23d6d31ae5f904cc064e350f47131ce2784fbb359867988a559d4386752e56277bef34e26544dedda88cc20a3411fa98834eeae869ad009d6e8ca99949b7b34fd06a789744ecac3356247317c4d7aa9296676dd623594f3684bc13064cab8d2db7edbca91f1c8beb542bc97978a3f31f3610a03f46a982d2",
+        "wx" : "0b4ffc0fff087607ad26c4b23d6d31ae5f904cc064e350f47131ce2784fbb359867988a559d4386752e56277bef34e26544dedda88cc20a3411fa98834eeae869ad",
+        "wy" : "09d6e8ca99949b7b34fd06a789744ecac3356247317c4d7aa9296676dd623594f3684bc13064cab8d2db7edbca91f1c8beb542bc97978a3f31f3610a03f46a982d2"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400b4ffc0fff087607ad26c4b23d6d31ae5f904cc064e350f47131ce2784fbb359867988a559d4386752e56277bef34e26544dedda88cc20a3411fa98834eeae869ad009d6e8ca99949b7b34fd06a789744ecac3356247317c4d7aa9296676dd623594f3684bc13064cab8d2db7edbca91f1c8beb542bc97978a3f31f3610a03f46a982d2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAtP/A//CHYHrSbEsj1tMa5fkEzAZO\nNQ9HExzieE+7NZhnmIpVnUOGdS5WJ3vvNOJlRN7dqIzCCjQR+piDTuroaa0AnW6M\nqZlJt7NP0Gp4l0TsrDNWJHMXxNeqkpZnbdYjWU82hLwTBkyrjS237bypHxyL61Qr\nyXl4o/MfNhCgP0apgtI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 361,
+          "comment" : "u2 == 1",
+          "msg" : "313233343030",
+          "sig" : "308188024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400809fba320fe96ded24611b72a2a5428fe46049ff080d6e0813ab7a35897018fe6418613abd860d1eb484959059a01af7d68cba69d1c52ea64ad0f28a18a41fc78a01108acc5577e9e8962e2a7cea0bb37df1d0ca4050fb6cfeba41a7f868d988dbbcebc962986748fa485183f6b60f453ec8606f8c33d43767dddbbef8c412b2c37939",
+        "wx" : "0809fba320fe96ded24611b72a2a5428fe46049ff080d6e0813ab7a35897018fe6418613abd860d1eb484959059a01af7d68cba69d1c52ea64ad0f28a18a41fc78a",
+        "wy" : "1108acc5577e9e8962e2a7cea0bb37df1d0ca4050fb6cfeba41a7f868d988dbbcebc962986748fa485183f6b60f453ec8606f8c33d43767dddbbef8c412b2c37939"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400809fba320fe96ded24611b72a2a5428fe46049ff080d6e0813ab7a35897018fe6418613abd860d1eb484959059a01af7d68cba69d1c52ea64ad0f28a18a41fc78a01108acc5577e9e8962e2a7cea0bb37df1d0ca4050fb6cfeba41a7f868d988dbbcebc962986748fa485183f6b60f453ec8606f8c33d43767dddbbef8c412b2c37939",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAgJ+6Mg/pbe0kYRtyoqVCj+RgSf8I\nDW4IE6t6NYlwGP5kGGE6vYYNHrSElZBZoBr31oy6adHFLqZK0PKKGKQfx4oBEIrM\nVXfp6JYuKnzqC7N98dDKQFD7bP66Qaf4aNmI27zryWKYZ0j6SFGD9rYPRT7IYG+M\nM9Q3Z93bvvjEErLDeTk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 362,
+          "comment" : "u2 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "308188024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad0242015555555555555555555555555555555555555555555555555555555555555555518baf05027f750ef25532ab85fa066e8ad2793125b112da747cf524bf0b7aed5c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040145130dca77d9674dfceffa851b4a2672e490e8fba8277622b0020e2fe9101e76933b0c01d248071f854e9bc523733936dc0b9930cbe154b9a402f681ee3c6cef6b000d0c94b2ad28556643aa3d27523048d227a1de82f8a664707e75394d21da181bec82e1afb0e627539531affa849a2409bcac83fb786c351c88bac2fb2e4322e54a",
+        "wx" : "145130dca77d9674dfceffa851b4a2672e490e8fba8277622b0020e2fe9101e76933b0c01d248071f854e9bc523733936dc0b9930cbe154b9a402f681ee3c6cef6b",
+        "wy" : "0d0c94b2ad28556643aa3d27523048d227a1de82f8a664707e75394d21da181bec82e1afb0e627539531affa849a2409bcac83fb786c351c88bac2fb2e4322e54a"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040145130dca77d9674dfceffa851b4a2672e490e8fba8277622b0020e2fe9101e76933b0c01d248071f854e9bc523733936dc0b9930cbe154b9a402f681ee3c6cef6b000d0c94b2ad28556643aa3d27523048d227a1de82f8a664707e75394d21da181bec82e1afb0e627539531affa849a2409bcac83fb786c351c88bac2fb2e4322e54a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBRRMNynfZZ0387/qFG0omcuSQ6Puo\nJ3YisAIOL+kQHnaTOwwB0kgHH4VOm8Ujczk23AuZMMvhVLmkAvaB7jxs72sADQyU\nsq0oVWZDqj0nUjBI0ieh3oL4pmRwfnU5TSHaGBvsguGvsOYnU5Uxr/qEmiQJvKyD\n+3hsNRyIusL7LkMi5Uo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 363,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201556bfd55a94e530bd972e52873ef39ac3ec34481aebdc46680dc66723ab66056275d82bff85ad29ac694530bb2f89c36ce600ad1b49761854afc69ab741ce0294a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400ed3e09809fe5985818f90592fd06e71d2c493d9a781714c9157cbafa5ba196b987fd49ae24274c76251c70b9f7970f1f713ad274590a702f463c73a0704831ce5d00cac278297093bd9f9ac2d00bef3d67a01b43b28b9f829407264c738117438300c7704772976916ea102a776262ccf4222cc348c34aac683d8f00179a348323babd",
+        "wx" : "0ed3e09809fe5985818f90592fd06e71d2c493d9a781714c9157cbafa5ba196b987fd49ae24274c76251c70b9f7970f1f713ad274590a702f463c73a0704831ce5d",
+        "wy" : "0cac278297093bd9f9ac2d00bef3d67a01b43b28b9f829407264c738117438300c7704772976916ea102a776262ccf4222cc348c34aac683d8f00179a348323babd"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400ed3e09809fe5985818f90592fd06e71d2c493d9a781714c9157cbafa5ba196b987fd49ae24274c76251c70b9f7970f1f713ad274590a702f463c73a0704831ce5d00cac278297093bd9f9ac2d00bef3d67a01b43b28b9f829407264c738117438300c7704772976916ea102a776262ccf4222cc348c34aac683d8f00179a348323babd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQA7T4JgJ/lmFgY+QWS/QbnHSxJPZp4\nFxTJFXy6+luhlrmH/UmuJCdMdiUccLn3lw8fcTrSdFkKcC9GPHOgcEgxzl0AysJ4\nKXCTvZ+awtAL7z1noBtDsoufgpQHJkxzgRdDgwDHcEdyl2kW6hAqd2JizPQiLMNI\nw0qsaD2PABeaNIMjur0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 364,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200dcf9e7f441448a125b96d72b989d9f4dac7508c7e036f6080d4758e736f5e0636b0ff503f128a98d08e0ae189921065219d2cc3aa83e3c660ca0cb85e7c11a24d0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04000ac2c5a4c79309a5132d5d7494befb3905d33fda5f80eeaf63775183aae7af108a3d97f3a441532cf6fac47f6c898329d69182e1fa07ce45997ebec3781c9ad7410173a5b6b80a8b73d30ac97e1a4aacb773c1ad692c5ea63f68e373842782bd677864ff656cf8d1e6ec1e58e9a83856ef92677555916749fb95e800ae2e011618ca3a",
+        "wx" : "0ac2c5a4c79309a5132d5d7494befb3905d33fda5f80eeaf63775183aae7af108a3d97f3a441532cf6fac47f6c898329d69182e1fa07ce45997ebec3781c9ad741",
+        "wy" : "173a5b6b80a8b73d30ac97e1a4aacb773c1ad692c5ea63f68e373842782bd677864ff656cf8d1e6ec1e58e9a83856ef92677555916749fb95e800ae2e011618ca3a"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004000ac2c5a4c79309a5132d5d7494befb3905d33fda5f80eeaf63775183aae7af108a3d97f3a441532cf6fac47f6c898329d69182e1fa07ce45997ebec3781c9ad7410173a5b6b80a8b73d30ac97e1a4aacb773c1ad692c5ea63f68e373842782bd677864ff656cf8d1e6ec1e58e9a83856ef92677555916749fb95e800ae2e011618ca3a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQACsLFpMeTCaUTLV10lL77OQXTP9pf\ngO6vY3dRg6rnrxCKPZfzpEFTLPb6xH9siYMp1pGC4foHzkWZfr7DeBya10EBc6W2\nuAqLc9MKyX4aSqy3c8GtaSxepj9o43OEJ4K9Z3hk/2Vs+NHm7B5Y6ag4Vu+SZ3VV\nkWdJ+5XoAK4uARYYyjo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 365,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024166eb57733c19a7003cf8253279fce41907bc4f127153c4576dd4814f8b335a0b51560b4447f0382c69b3fe509522c891f0eec3999ad2526835f33ae22a642843af",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401eb2a353dec6b460fbda49c67f431190fff6f195639c226ef8fefcbf191d72529a12cc5485b282a52704c1fd84529a1aa0ad794f96493e299718d2618a1b83a526c01f704604d5b2b94a42bfc3ab93317d66a54de15258337433fc96a965d8e2d056fd1134b7989d7b3f709adc28227bdabc11fe2f359c6a6e5111ab43379ca25b66f2f",
+        "wx" : "1eb2a353dec6b460fbda49c67f431190fff6f195639c226ef8fefcbf191d72529a12cc5485b282a52704c1fd84529a1aa0ad794f96493e299718d2618a1b83a526c",
+        "wy" : "1f704604d5b2b94a42bfc3ab93317d66a54de15258337433fc96a965d8e2d056fd1134b7989d7b3f709adc28227bdabc11fe2f359c6a6e5111ab43379ca25b66f2f"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401eb2a353dec6b460fbda49c67f431190fff6f195639c226ef8fefcbf191d72529a12cc5485b282a52704c1fd84529a1aa0ad794f96493e299718d2618a1b83a526c01f704604d5b2b94a42bfc3ab93317d66a54de15258337433fc96a965d8e2d056fd1134b7989d7b3f709adc28227bdabc11fe2f359c6a6e5111ab43379ca25b66f2f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB6yo1PexrRg+9pJxn9DEZD/9vGVY5\nwibvj+/L8ZHXJSmhLMVIWygqUnBMH9hFKaGqCteU+WST4plxjSYYobg6UmwB9wRg\nTVsrlKQr/Dq5MxfWalTeFSWDN0M/yWqWXY4tBW/RE0t5idez9wmtwoInvavBH+Lz\nWcam5REatDN5yiW2by8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 366,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242017106d1131b3300d7ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc79527ac09f0a3f0a8aa38285585b6afceac5ff6692842232d106d15d4df1b66aa8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401e43dfecc7e6caad03d17b407322c878f701c5add6eb2afcd786ff3803622dfbb6baa01246e1ea059f7b78842919b2507daa9e3434efa7e8d3ae6c35499f82d0ac8018b0e4d6378222a07ccdb4214001f97b1a503d1aac3ab925ea64faa9c739ba04ee3480b147cb07f93edf40b6856a22f4159c3f5cd6c9e7165452907c8d02fab201e",
+        "wx" : "1e43dfecc7e6caad03d17b407322c878f701c5add6eb2afcd786ff3803622dfbb6baa01246e1ea059f7b78842919b2507daa9e3434efa7e8d3ae6c35499f82d0ac8",
+        "wy" : "18b0e4d6378222a07ccdb4214001f97b1a503d1aac3ab925ea64faa9c739ba04ee3480b147cb07f93edf40b6856a22f4159c3f5cd6c9e7165452907c8d02fab201e"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401e43dfecc7e6caad03d17b407322c878f701c5add6eb2afcd786ff3803622dfbb6baa01246e1ea059f7b78842919b2507daa9e3434efa7e8d3ae6c35499f82d0ac8018b0e4d6378222a07ccdb4214001f97b1a503d1aac3ab925ea64faa9c739ba04ee3480b147cb07f93edf40b6856a22f4159c3f5cd6c9e7165452907c8d02fab201e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB5D3+zH5sqtA9F7QHMiyHj3AcWt1u\nsq/NeG/zgDYi37trqgEkbh6gWfe3iEKRmyUH2qnjQ076fo065sNUmfgtCsgBiw5N\nY3giKgfM20IUAB+XsaUD0arDq5Jepk+qnHOboE7jSAsUfLB/k+30C2hWoi9BWcP1\nzWyecWVFKQfI0C+rIB4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 367,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02416d1131b3300d7ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d6ab94bf496f53ea229e7fe6b456088ea32f6e2b104f5112798bb59d46a0d468f838",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040141a4d714628c192b8ace1a42854da06e0e1ddb82a07618e4efb05d7095cd1eb65425078160594715eaf59fcb41c9e573fe10298c75c9e9135c775ca73f63d13aac0089524b475170d4391cc032a0543ea22dab60ea07538f3a37607f0d4ed516634fde545e2f0a6ba8d0d2fe6aded0a771b4b134a5a280e54799fa476ef0ec87d44e1c",
+        "wx" : "141a4d714628c192b8ace1a42854da06e0e1ddb82a07618e4efb05d7095cd1eb65425078160594715eaf59fcb41c9e573fe10298c75c9e9135c775ca73f63d13aac",
+        "wy" : "089524b475170d4391cc032a0543ea22dab60ea07538f3a37607f0d4ed516634fde545e2f0a6ba8d0d2fe6aded0a771b4b134a5a280e54799fa476ef0ec87d44e1c"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040141a4d714628c192b8ace1a42854da06e0e1ddb82a07618e4efb05d7095cd1eb65425078160594715eaf59fcb41c9e573fe10298c75c9e9135c775ca73f63d13aac0089524b475170d4391cc032a0543ea22dab60ea07538f3a37607f0d4ed516634fde545e2f0a6ba8d0d2fe6aded0a771b4b134a5a280e54799fa476ef0ec87d44e1c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBQaTXFGKMGSuKzhpChU2gbg4d24Kg\ndhjk77BdcJXNHrZUJQeBYFlHFer1n8tByeVz/hApjHXJ6RNcd1ynP2PROqwAiVJL\nR1Fw1DkcwDKgVD6iLatg6gdTjzo3YH8NTtUWY0/eVF4vCmuo0NL+at7Qp3G0sTSl\nooDlR5n6R27w7IfUThw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 368,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200da226366601afff780ffe082a0db8e74ea10d4864a5f6876c64f5e78d6598fad57297e92dea7d4453cffcd68ac111d465edc56209ea224f3176b3a8d41a8d1f070",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040147fbcc65d4818e029e0a3af13a1f7c90f0605a00cd0781200eb656a591d669a787620e6fc8cc594aa28a0b0f2939ec73472c494e09cecaf5f331dafd32d5ac31c30075432bdaeecaa0bec7feddc298c565723fb669ee76e38a4c5ff1701f1b38cda9dc9ac43bff18da2047e4dcd80c05a7bb7e7464829d608b68176b04c87f409f46d6",
+        "wx" : "147fbcc65d4818e029e0a3af13a1f7c90f0605a00cd0781200eb656a591d669a787620e6fc8cc594aa28a0b0f2939ec73472c494e09cecaf5f331dafd32d5ac31c3",
+        "wy" : "75432bdaeecaa0bec7feddc298c565723fb669ee76e38a4c5ff1701f1b38cda9dc9ac43bff18da2047e4dcd80c05a7bb7e7464829d608b68176b04c87f409f46d6"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040147fbcc65d4818e029e0a3af13a1f7c90f0605a00cd0781200eb656a591d669a787620e6fc8cc594aa28a0b0f2939ec73472c494e09cecaf5f331dafd32d5ac31c30075432bdaeecaa0bec7feddc298c565723fb669ee76e38a4c5ff1701f1b38cda9dc9ac43bff18da2047e4dcd80c05a7bb7e7464829d608b68176b04c87f409f46d6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBR/vMZdSBjgKeCjrxOh98kPBgWgDN\nB4EgDrZWpZHWaaeHYg5vyMxZSqKKCw8pOexzRyxJTgnOyvXzMdr9MtWsMcMAdUMr\n2u7KoL7H/t3CmMVlcj+2ae5244pMX/FwHxs4zancmsQ7/xjaIEfk3NgMBae7fnRk\ngp1gi2gXawTIf0CfRtY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 369,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242011b3300d7ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d6acca94cb85df5e6c1125394fcd34f6521ffdaddd98f88a99fedcedd9384288bb793cf2f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400b5b1c3998589b25c96a700bbd450d04da1f273df8053767a3b03ed1a763ed089c0de99bcf54d49c1520d3a09b845296f0445b3bd5b87918d3752cf651e0ff3007b00e896380876b9419c56096914ff6eec01aee247eefef0741895f14ee280f360e11508c37826af82cd915b9002f046cb51008d9ead21124c591bd8265d1492b35ffb",
+        "wx" : "0b5b1c3998589b25c96a700bbd450d04da1f273df8053767a3b03ed1a763ed089c0de99bcf54d49c1520d3a09b845296f0445b3bd5b87918d3752cf651e0ff3007b",
+        "wy" : "0e896380876b9419c56096914ff6eec01aee247eefef0741895f14ee280f360e11508c37826af82cd915b9002f046cb51008d9ead21124c591bd8265d1492b35ffb"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400b5b1c3998589b25c96a700bbd450d04da1f273df8053767a3b03ed1a763ed089c0de99bcf54d49c1520d3a09b845296f0445b3bd5b87918d3752cf651e0ff3007b00e896380876b9419c56096914ff6eec01aee247eefef0741895f14ee280f360e11508c37826af82cd915b9002f046cb51008d9ead21124c591bd8265d1492b35ffb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAtbHDmYWJslyWpwC71FDQTaHyc9+A\nU3Z6OwPtGnY+0InA3pm89U1JwVINOgm4RSlvBEWzvVuHkY03Us9lHg/zAHsA6JY4\nCHa5QZxWCWkU/27sAa7iR+7+8HQYlfFO4oDzYOEVCMN4Jq+CzZFbkALwRstRAI2e\nrSESTFkb2CZdFJKzX/s=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 370,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02420161be37ed5f748e06a89d72c4b7051cae809d9567848b1d8d7ed019221efb06ae81e1264ce49c5d29ee5fe22ccf70899002643aca7b99f57756f2639b6d459ae410",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401aadb41fadc35cf6d11a7c7d01d049b74b37677f04e1bd3dc08450fabae28adcd2d135f966616d283fb18a5e69eabfe7ec41e1a0edb3682f1d39f2af64a94d602b9014ae81ebf5e3d2d0529479d4ae8eb05f4b42e519608466ad69e7662d6e9b236765f9be535c058f00f0866bbb4b172ef47a03cb97c58dde5750344bb293035f8e97e",
+        "wx" : "1aadb41fadc35cf6d11a7c7d01d049b74b37677f04e1bd3dc08450fabae28adcd2d135f966616d283fb18a5e69eabfe7ec41e1a0edb3682f1d39f2af64a94d602b9",
+        "wy" : "14ae81ebf5e3d2d0529479d4ae8eb05f4b42e519608466ad69e7662d6e9b236765f9be535c058f00f0866bbb4b172ef47a03cb97c58dde5750344bb293035f8e97e"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401aadb41fadc35cf6d11a7c7d01d049b74b37677f04e1bd3dc08450fabae28adcd2d135f966616d283fb18a5e69eabfe7ec41e1a0edb3682f1d39f2af64a94d602b9014ae81ebf5e3d2d0529479d4ae8eb05f4b42e519608466ad69e7662d6e9b236765f9be535c058f00f0866bbb4b172ef47a03cb97c58dde5750344bb293035f8e97e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBqttB+tw1z20Rp8fQHQSbdLN2d/BO\nG9PcCEUPq64orc0tE1+WZhbSg/sYpeaeq/5+xB4aDts2gvHTnyr2SpTWArkBSuge\nv149LQUpR51K6OsF9LQuUZYIRmrWnnZi1umyNnZfm+U1wFjwDwhmu7Sxcu9HoDy5\nfFjd5XUDRLspMDX46X4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 371,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201e9bbbd64270b9668f7623ef7cbead5483eb07b883cf39fb6884aab67dac7958b0e03144357b9433e69adc696c86c63a23d35724cbd749b7c34f8e34232d21ea420",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401b706fc3f4aae5b86da261a66fbce47eb3b3e1e91544a40a9989fccf74154bbecac042dbbbf411a39090058b62c46fccd1d5eaba0c4879a688ea5fd0a7b4f9a0b4f01eda01930c6b22745a97f2d59e182598dfdfbfdb463335293901de7fc9d49cf55ed7fcf5d767d4c22f89f171b4137c8415c3ed438089270c41f88eadef3018140e1",
+        "wx" : "1b706fc3f4aae5b86da261a66fbce47eb3b3e1e91544a40a9989fccf74154bbecac042dbbbf411a39090058b62c46fccd1d5eaba0c4879a688ea5fd0a7b4f9a0b4f",
+        "wy" : "1eda01930c6b22745a97f2d59e182598dfdfbfdb463335293901de7fc9d49cf55ed7fcf5d767d4c22f89f171b4137c8415c3ed438089270c41f88eadef3018140e1"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401b706fc3f4aae5b86da261a66fbce47eb3b3e1e91544a40a9989fccf74154bbecac042dbbbf411a39090058b62c46fccd1d5eaba0c4879a688ea5fd0a7b4f9a0b4f01eda01930c6b22745a97f2d59e182598dfdfbfdb463335293901de7fc9d49cf55ed7fcf5d767d4c22f89f171b4137c8415c3ed438089270c41f88eadef3018140e1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBtwb8P0quW4baJhpm+85H6zs+HpFU\nSkCpmJ/M90FUu+ysBC27v0EaOQkAWLYsRvzNHV6roMSHmmiOpf0Ke0+aC08B7aAZ\nMMayJ0Wpfy1Z4YJZjf37/bRjM1KTkB3n/J1Jz1Xtf89ddn1MIvifFxtBN8hBXD7U\nOAiScMQfiOre8wGBQOE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 372,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200924449b6c96f3758e3b085c079714f11f28d039b11699f0e9b3e7c553c8fc6c8f5212fec5eac3068713b8ec72fc6e2a90872b94e161a89822887f4a9bd5c9efd74",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040058a1fa96111bf30be76c3b8ba4435666677b6dd05031b5c4a840e1ea81f6025f70e1d395ef63cb59fa71e3674cb678f7250887f5d734e3ec377dbe3ae637d24f82007a4eaf02cc57e658b5b9fa08ee30e0ef5b3429bb5a10438b0e05bacaebc60317010a334d7f896028aef620f5d9c7cabc38306e032b1b91c2376c3fef3e455a10df",
+        "wx" : "58a1fa96111bf30be76c3b8ba4435666677b6dd05031b5c4a840e1ea81f6025f70e1d395ef63cb59fa71e3674cb678f7250887f5d734e3ec377dbe3ae637d24f82",
+        "wy" : "7a4eaf02cc57e658b5b9fa08ee30e0ef5b3429bb5a10438b0e05bacaebc60317010a334d7f896028aef620f5d9c7cabc38306e032b1b91c2376c3fef3e455a10df"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040058a1fa96111bf30be76c3b8ba4435666677b6dd05031b5c4a840e1ea81f6025f70e1d395ef63cb59fa71e3674cb678f7250887f5d734e3ec377dbe3ae637d24f82007a4eaf02cc57e658b5b9fa08ee30e0ef5b3429bb5a10438b0e05bacaebc60317010a334d7f896028aef620f5d9c7cabc38306e032b1b91c2376c3fef3e455a10df",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAWKH6lhEb8wvnbDuLpENWZmd7bdBQ\nMbXEqEDh6oH2Al9w4dOV72PLWfpx42dMtnj3JQiH9dc04+w3fb465jfST4IAek6v\nAsxX5li1ufoI7jDg71s0KbtaEEOLDgW6yuvGAxcBCjNNf4lgKK72IPXZx8q8ODBu\nAysbkcI3bD/vPkVaEN8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 373,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201554a01552b58d67a13468d6bc6086329e09e5dbf28a11dccbf91ccc6e2a4cfd4e6a2c5278791c6490835a27b6f7abb8a690bb060de3deb85093d3ae16482c84f64",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400303ba5ef90b05110002fdf74d2b8d4c7ab189c64004859c69d7c4730fcacb5f4d9b761ae987d1f3b63bb3ecb78aeecf4a04ff60f5f367a96ac2da8da27a3687a3e006673d0d4ccd4c3ce1abc9980fd1885002c3e7b86078214caf7f0962fa51e116363032d7a1b93c92a4d62827549d5a33e4e6b9b6c2ab6ad9c2a15e410c5b1a846b2",
+        "wx" : "303ba5ef90b05110002fdf74d2b8d4c7ab189c64004859c69d7c4730fcacb5f4d9b761ae987d1f3b63bb3ecb78aeecf4a04ff60f5f367a96ac2da8da27a3687a3e",
+        "wy" : "6673d0d4ccd4c3ce1abc9980fd1885002c3e7b86078214caf7f0962fa51e116363032d7a1b93c92a4d62827549d5a33e4e6b9b6c2ab6ad9c2a15e410c5b1a846b2"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400303ba5ef90b05110002fdf74d2b8d4c7ab189c64004859c69d7c4730fcacb5f4d9b761ae987d1f3b63bb3ecb78aeecf4a04ff60f5f367a96ac2da8da27a3687a3e006673d0d4ccd4c3ce1abc9980fd1885002c3e7b86078214caf7f0962fa51e116363032d7a1b93c92a4d62827549d5a33e4e6b9b6c2ab6ad9c2a15e410c5b1a846b2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAMDul75CwURAAL9900rjUx6sYnGQA\nSFnGnXxHMPystfTZt2GumH0fO2O7Pst4ruz0oE/2D182epasLajaJ6Noej4AZnPQ\n1MzUw84avJmA/RiFACw+e4YHghTK9/CWL6UeEWNjAy16G5PJKk1ignVJ1aM+Tmub\nbCq2rZwqFeQQxbGoRrI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 374,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200aa9402aa56b1acf4268d1ad78c10c653c13cbb7e51423b997f23998dc5499fa9d2f403c78b645cfba4eb78f595fe6d6f01dbaaf803f23ac263bf060baa74583abf",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400a94eea843a5c49637041598e30c381f7173bf8cd127f3caf5c16cbc728aa4d99173fb38d6a1b1ec21e40336e8d802249272b0ccbf4f8c3636ef66290a81b58fa5b01116c23464fad61df8d2d5d1250a5a4c427e9c58e2cf1d059cdd88a7c34984fdd22a4cf18411e1b0224d444a5bd39d5fc97fc0b3648600f19d6ab80aa6a7c083a17",
+        "wx" : "0a94eea843a5c49637041598e30c381f7173bf8cd127f3caf5c16cbc728aa4d99173fb38d6a1b1ec21e40336e8d802249272b0ccbf4f8c3636ef66290a81b58fa5b",
+        "wy" : "1116c23464fad61df8d2d5d1250a5a4c427e9c58e2cf1d059cdd88a7c34984fdd22a4cf18411e1b0224d444a5bd39d5fc97fc0b3648600f19d6ab80aa6a7c083a17"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400a94eea843a5c49637041598e30c381f7173bf8cd127f3caf5c16cbc728aa4d99173fb38d6a1b1ec21e40336e8d802249272b0ccbf4f8c3636ef66290a81b58fa5b01116c23464fad61df8d2d5d1250a5a4c427e9c58e2cf1d059cdd88a7c34984fdd22a4cf18411e1b0224d444a5bd39d5fc97fc0b3648600f19d6ab80aa6a7c083a17",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAqU7qhDpcSWNwQVmOMMOB9xc7+M0S\nfzyvXBbLxyiqTZkXP7ONahsewh5AM26NgCJJJysMy/T4w2Nu9mKQqBtY+lsBEWwj\nRk+tYd+NLV0SUKWkxCfpxY4s8dBZzdiKfDSYT90ipM8YQR4bAiTURKW9OdX8l/wL\nNkhgDxnWq4CqanwIOhc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 375,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201ffde03ff820a836e39d3a8435219297da1db193d79e359663eb56654a7ee6f7eb996c8ef12f62344ad211b71057928f96ae75b58e23026476cfc40ed0ef7208a23",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04014f71d2ca5bd2051336854657f09a1fab14c7f2f7865d71bd3fa354bf27b69dc8738972140553b525658b6fd203cc05ca0822e0904bad21b632e0de74a2ad3f0e72004525f90519f9497425460b31cbb69ab3701a9ea68aaab72c6d65d364d0f0ed4d0524280f113bd69ef1ba9825202b10287a088c4bf30debecb720ac0739ec67434d",
+        "wx" : "14f71d2ca5bd2051336854657f09a1fab14c7f2f7865d71bd3fa354bf27b69dc8738972140553b525658b6fd203cc05ca0822e0904bad21b632e0de74a2ad3f0e72",
+        "wy" : "4525f90519f9497425460b31cbb69ab3701a9ea68aaab72c6d65d364d0f0ed4d0524280f113bd69ef1ba9825202b10287a088c4bf30debecb720ac0739ec67434d"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004014f71d2ca5bd2051336854657f09a1fab14c7f2f7865d71bd3fa354bf27b69dc8738972140553b525658b6fd203cc05ca0822e0904bad21b632e0de74a2ad3f0e72004525f90519f9497425460b31cbb69ab3701a9ea68aaab72c6d65d364d0f0ed4d0524280f113bd69ef1ba9825202b10287a088c4bf30debecb720ac0739ec67434d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBT3HSylvSBRM2hUZX8JofqxTH8veG\nXXG9P6NUvye2nchziXIUBVO1JWWLb9IDzAXKCCLgkEutIbYy4N50oq0/DnIARSX5\nBRn5SXQlRgsxy7aas3AanqaKqrcsbWXTZNDw7U0FJCgPETvWnvG6mCUgKxAoegiM\nS/MN6+y3IKwHOexnQ00=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 376,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242013375abb99e0cd3801e7c12993cfe720c83de278938a9e22bb6ea40a7c599ad05a5d3c8e5e5d7b3e16a99e528ef0ce91be0953cb1a9adf757f257554ca47ab053dc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401d2ecad921dd100a8dc1a7b824b0ac6c9b654ab179833c2881ce237f1b8497ade851302cf50ea5ea169c2a50c0c09cb6ea539a7290a0f3437044b7a2e9ca8d40500003fd5651535dcba1f331981c216a1c7d9842f65c5f38ca43dd71c41e19efcac384617656fd0afdd83c50c5e524e9b672b7aa8a66b289afa688e45ca6edb3477a8b0",
+        "wx" : "1d2ecad921dd100a8dc1a7b824b0ac6c9b654ab179833c2881ce237f1b8497ade851302cf50ea5ea169c2a50c0c09cb6ea539a7290a0f3437044b7a2e9ca8d40500",
+        "wy" : "3fd5651535dcba1f331981c216a1c7d9842f65c5f38ca43dd71c41e19efcac384617656fd0afdd83c50c5e524e9b672b7aa8a66b289afa688e45ca6edb3477a8b0"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401d2ecad921dd100a8dc1a7b824b0ac6c9b654ab179833c2881ce237f1b8497ade851302cf50ea5ea169c2a50c0c09cb6ea539a7290a0f3437044b7a2e9ca8d40500003fd5651535dcba1f331981c216a1c7d9842f65c5f38ca43dd71c41e19efcac384617656fd0afdd83c50c5e524e9b672b7aa8a66b289afa688e45ca6edb3477a8b0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB0uytkh3RAKjcGnuCSwrGybZUqxeY\nM8KIHOI38bhJet6FEwLPUOpeoWnCpQwMCctupTmnKQoPNDcES3ounKjUBQAAP9Vl\nFTXcuh8zGYHCFqHH2YQvZcXzjKQ91xxB4Z78rDhGF2Vv0K/dg8UMXlJOm2creqim\nayia+miORcpu2zR3qLA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 377,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02415555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555554",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040165d67972a48fddc2f41c03f79ab5e0d42fd0992c013ead135c3394049645e26ad7c7be96510df59ba677dc94f1146e8e8e8fbe56debcb66920639581956b92b4d1008aeb66ee0be18abaa909a973c70b5749d688f8e2cd2e6e1613af93d0033492d26a6e82cfb80ac6925ac6bc79b984f73e3ebbff2f223a38676891c1ecd784a8a789",
+        "wx" : "165d67972a48fddc2f41c03f79ab5e0d42fd0992c013ead135c3394049645e26ad7c7be96510df59ba677dc94f1146e8e8e8fbe56debcb66920639581956b92b4d1",
+        "wy" : "08aeb66ee0be18abaa909a973c70b5749d688f8e2cd2e6e1613af93d0033492d26a6e82cfb80ac6925ac6bc79b984f73e3ebbff2f223a38676891c1ecd784a8a789"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040165d67972a48fddc2f41c03f79ab5e0d42fd0992c013ead135c3394049645e26ad7c7be96510df59ba677dc94f1146e8e8e8fbe56debcb66920639581956b92b4d1008aeb66ee0be18abaa909a973c70b5749d688f8e2cd2e6e1613af93d0033492d26a6e82cfb80ac6925ac6bc79b984f73e3ebbff2f223a38676891c1ecd784a8a789",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBZdZ5cqSP3cL0HAP3mrXg1C/QmSwB\nPq0TXDOUBJZF4mrXx76WUQ31m6Z33JTxFG6Ojo++Vt68tmkgY5WBlWuStNEAiutm\n7gvhirqpCalzxwtXSdaI+OLNLm4WE6+T0AM0ktJqboLPuArGklrGvHm5hPc+Prv/\nLyI6OGdokcHs14Sop4k=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 378,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242009f57708fa97eba94c6d4782cdd4e33bb95c1353bde095232e3e2bab277bb5d2b48f55a53ffe928d034c29970a9e5f384a003907d3d9b82a86817cc61fb17f4c59e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04018cd11252f0a434f446d3af18518c6b84cb0b7bf33758b4d83b97c2a56e0037b54d57d2b0b842e9c17d70504e01896389c066db8f2bfec025259a51dff51466830801cca54365156c59e2c73c17664f09fcdcfd5b910f9ab48d0899b6a7064de8b80fc7a992e47ee7f23ec82fd80179a19f4cf89b4c02b7218f435298da5d322a982c1e",
+        "wx" : "18cd11252f0a434f446d3af18518c6b84cb0b7bf33758b4d83b97c2a56e0037b54d57d2b0b842e9c17d70504e01896389c066db8f2bfec025259a51dff514668308",
+        "wy" : "1cca54365156c59e2c73c17664f09fcdcfd5b910f9ab48d0899b6a7064de8b80fc7a992e47ee7f23ec82fd80179a19f4cf89b4c02b7218f435298da5d322a982c1e"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004018cd11252f0a434f446d3af18518c6b84cb0b7bf33758b4d83b97c2a56e0037b54d57d2b0b842e9c17d70504e01896389c066db8f2bfec025259a51dff51466830801cca54365156c59e2c73c17664f09fcdcfd5b910f9ab48d0899b6a7064de8b80fc7a992e47ee7f23ec82fd80179a19f4cf89b4c02b7218f435298da5d322a982c1e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBjNESUvCkNPRG068YUYxrhMsLe/M3\nWLTYO5fCpW4AN7VNV9KwuELpwX1wUE4BiWOJwGbbjyv+wCUlmlHf9RRmgwgBzKVD\nZRVsWeLHPBdmTwn83P1bkQ+atI0ImbanBk3ouA/HqZLkfufyPsgv2AF5oZ9M+JtM\nArchj0NSmNpdMiqYLB4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 379,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024168d98fa90736eff3e90f8fcfe50838b6fa0bf2cde77bc51e3f41019c8006f4e9cbaeadce7dbb44462da6425be9cfdaecb234c41749ce695be1b5ead2e6b1205f35",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401d6329a8afdea27cf1028a44d19c3c72927590d64628775f324514c81de301aa9be9c775c53a6349d1cbd5ecfc7bd39b373e613a10c1439441b141430fdadac168c00071342d63dba901b93bdc444a1fe2ec6a15108bdf49eb1dfd218373884520d84bce03c5012f5837051cb8abf6a0be78dfdfeeb3a5872dff75b3f874faa6d2243bf",
+        "wx" : "1d6329a8afdea27cf1028a44d19c3c72927590d64628775f324514c81de301aa9be9c775c53a6349d1cbd5ecfc7bd39b373e613a10c1439441b141430fdadac168c",
+        "wy" : "71342d63dba901b93bdc444a1fe2ec6a15108bdf49eb1dfd218373884520d84bce03c5012f5837051cb8abf6a0be78dfdfeeb3a5872dff75b3f874faa6d2243bf"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401d6329a8afdea27cf1028a44d19c3c72927590d64628775f324514c81de301aa9be9c775c53a6349d1cbd5ecfc7bd39b373e613a10c1439441b141430fdadac168c00071342d63dba901b93bdc444a1fe2ec6a15108bdf49eb1dfd218373884520d84bce03c5012f5837051cb8abf6a0be78dfdfeeb3a5872dff75b3f874faa6d2243bf",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB1jKaiv3qJ88QKKRNGcPHKSdZDWRi\nh3XzJFFMgd4wGqm+nHdcU6Y0nRy9Xs/HvTmzc+YToQwUOUQbFBQw/a2sFowABxNC\n1j26kBuTvcREof4uxqFRCL30nrHf0hg3OIRSDYS84DxQEvWDcFHLir9qC+eN/f7r\nOlhy3/dbP4dPqm0iQ78=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 380,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200e97ae66bcd4cae36fffffffffffffffffffffffffffffffffffffffffffffffffd68bc9726f02dbf8598a98b3e5077eff6f2491eb678ed040fb338c084a9ea8a4c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401c963b64cdc3ecb1c35cda5ced9419ac146b060adb04c638cf6b66658013cb25e915a6ad0055668342881ed27f438b50ae4bb86ae3c7c02b727a130c77bad69800800481bfffaead856b4137fd4268ecd74a6c2d4bd6cd13998ce7f0e828b220135d8df23253e681dc90673e0537e7590769a2a441aaaaa3a9901c4fbe44fa9513951ef",
+        "wx" : "1c963b64cdc3ecb1c35cda5ced9419ac146b060adb04c638cf6b66658013cb25e915a6ad0055668342881ed27f438b50ae4bb86ae3c7c02b727a130c77bad698008",
+        "wy" : "481bfffaead856b4137fd4268ecd74a6c2d4bd6cd13998ce7f0e828b220135d8df23253e681dc90673e0537e7590769a2a441aaaaa3a9901c4fbe44fa9513951ef"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401c963b64cdc3ecb1c35cda5ced9419ac146b060adb04c638cf6b66658013cb25e915a6ad0055668342881ed27f438b50ae4bb86ae3c7c02b727a130c77bad69800800481bfffaead856b4137fd4268ecd74a6c2d4bd6cd13998ce7f0e828b220135d8df23253e681dc90673e0537e7590769a2a441aaaaa3a9901c4fbe44fa9513951ef",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQByWO2TNw+yxw1zaXO2UGawUawYK2w\nTGOM9rZmWAE8sl6RWmrQBVZoNCiB7Sf0OLUK5LuGrjx8ArcnoTDHe61pgAgASBv/\n+urYVrQTf9Qmjs10psLUvWzROZjOfw6CiyIBNdjfIyU+aB3JBnPgU351kHaaKkQa\nqqo6mQHE++RPqVE5Ue8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 381,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201ae66bcd4cae36ffffffffffffffffffffffffffffffffffffffffffffffffffffb3954212f8bea578d93e685e5dba329811b2542bb398233e2944bceb19263325d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04005dfbc867d53c57b2945502b8e56d96ca2d4d485aa33452200a2f4ba16042357976afeecf3e63b2fdcd5cdd76076c1a73e496caf9d6de3e8831d955d138e05884ae01e04aa0b5360a0d3badd0120fbb8cc42a38bf1c61755d00858e40e4b10da4ea2575830dc92e312c20af2b8b167d7a58d178661d48cd932fe47a4bc7145e620ae22c",
+        "wx" : "5dfbc867d53c57b2945502b8e56d96ca2d4d485aa33452200a2f4ba16042357976afeecf3e63b2fdcd5cdd76076c1a73e496caf9d6de3e8831d955d138e05884ae",
+        "wy" : "1e04aa0b5360a0d3badd0120fbb8cc42a38bf1c61755d00858e40e4b10da4ea2575830dc92e312c20af2b8b167d7a58d178661d48cd932fe47a4bc7145e620ae22c"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004005dfbc867d53c57b2945502b8e56d96ca2d4d485aa33452200a2f4ba16042357976afeecf3e63b2fdcd5cdd76076c1a73e496caf9d6de3e8831d955d138e05884ae01e04aa0b5360a0d3badd0120fbb8cc42a38bf1c61755d00858e40e4b10da4ea2575830dc92e312c20af2b8b167d7a58d178661d48cd932fe47a4bc7145e620ae22c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAXfvIZ9U8V7KUVQK45W2Wyi1NSFqj\nNFIgCi9LoWBCNXl2r+7PPmOy/c1c3XYHbBpz5JbK+dbePogx2VXROOBYhK4B4Eqg\ntTYKDTut0BIPu4zEKji/HGF1XQCFjkDksQ2k6iV1gw3JLjEsIK8rixZ9eljReGYd\nSM2TL+R6S8cUXmIK4iw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 382,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242015ccd79a995c6dffffffffffffffffffffffffffffffffffffffffffffffffffffc2121badb58a518afa8010a82c03cad31fa94bbbde96820166d27e644938e00b1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040078be6c43e366cf63ddc4235e8b969386e95012fbca5cebf1b0a6fe3c03c1257df7cf47b002eb6c4497f310bff6131b5ccb54fd0e8ee7fcf6b49d487e1b54508f68009b61a547104c8516e0dc35d3d17659ca098d023b0593908fe979c29e62373738a3c30094ba47105a49edbc6e1d37cce317b49d2701470eeb53d9b24dce9d809166",
+        "wx" : "78be6c43e366cf63ddc4235e8b969386e95012fbca5cebf1b0a6fe3c03c1257df7cf47b002eb6c4497f310bff6131b5ccb54fd0e8ee7fcf6b49d487e1b54508f68",
+        "wy" : "09b61a547104c8516e0dc35d3d17659ca098d023b0593908fe979c29e62373738a3c30094ba47105a49edbc6e1d37cce317b49d2701470eeb53d9b24dce9d809166"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040078be6c43e366cf63ddc4235e8b969386e95012fbca5cebf1b0a6fe3c03c1257df7cf47b002eb6c4497f310bff6131b5ccb54fd0e8ee7fcf6b49d487e1b54508f68009b61a547104c8516e0dc35d3d17659ca098d023b0593908fe979c29e62373738a3c30094ba47105a49edbc6e1d37cce317b49d2701470eeb53d9b24dce9d809166",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAeL5sQ+Nmz2PdxCNei5aThulQEvvK\nXOvxsKb+PAPBJX33z0ewAutsRJfzEL/2Extcy1T9Do7n/Pa0nUh+G1RQj2gAm2Gl\nRxBMhRbg3DXT0XZZygmNAjsFk5CP6XnCnmI3NzijwwCUukcQWkntvG4dN8zjF7Sd\nJwFHDutT2bJNzp2AkWY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 383,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201cd4cae36fffffffffffffffffffffffffffffffffffffffffffffffffffffffffae18dcc11dff7526233d923a0b202cb29e713f22de8bb6ab0a12821c5abbe3f23",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040093f68961005f3040dc1a8ff1416c917bdcc77f1dfa85506c3bb62dac47f7be9529b4cbe57dd2c19e860bd2a0db71d47ef1eca8a20bfc3e0bc5e05c8303001c1960002b9a3d45f2f5120fee06445f0d34e6138e3ac5b16d2a22f0460cea258c368ca9e478eb7b8253e7c6f2f7250fdc7dcd7243761f8d56f2350ac51e47ee063f41da31",
+        "wx" : "093f68961005f3040dc1a8ff1416c917bdcc77f1dfa85506c3bb62dac47f7be9529b4cbe57dd2c19e860bd2a0db71d47ef1eca8a20bfc3e0bc5e05c8303001c1960",
+        "wy" : "2b9a3d45f2f5120fee06445f0d34e6138e3ac5b16d2a22f0460cea258c368ca9e478eb7b8253e7c6f2f7250fdc7dcd7243761f8d56f2350ac51e47ee063f41da31"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040093f68961005f3040dc1a8ff1416c917bdcc77f1dfa85506c3bb62dac47f7be9529b4cbe57dd2c19e860bd2a0db71d47ef1eca8a20bfc3e0bc5e05c8303001c1960002b9a3d45f2f5120fee06445f0d34e6138e3ac5b16d2a22f0460cea258c368ca9e478eb7b8253e7c6f2f7250fdc7dcd7243761f8d56f2350ac51e47ee063f41da31",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAk/aJYQBfMEDcGo/xQWyRe9zHfx36\nhVBsO7YtrEf3vpUptMvlfdLBnoYL0qDbcdR+8eyoogv8PgvF4FyDAwAcGWAAK5o9\nRfL1Eg/uBkRfDTTmE446xbFtKiLwRgzqJYw2jKnkeOt7glPnxvL3JQ/cfc1yQ3Yf\njVbyNQrFHkfuBj9B2jE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 384,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024122e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b9c4c3f73cc816143fac3412b62de4c63db08f8c57e4c58c31f1b457ca5e57e20a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04002d2d7d40bf17c4e8b18757e451ddded95e6b1007cd144809d21af31353b03038372c4af204d4414b71060b48b3a8439c632809bd33c4736263044405a1ad766e3600bb0c5a8848f93fa3e85376b012bf064e303746529a673b852bb5a969c24c0156a8dd26242d0aad4bae43e23631b01fb9d050f9744b59f3b52b1c572217a1d70588",
+        "wx" : "2d2d7d40bf17c4e8b18757e451ddded95e6b1007cd144809d21af31353b03038372c4af204d4414b71060b48b3a8439c632809bd33c4736263044405a1ad766e36",
+        "wy" : "0bb0c5a8848f93fa3e85376b012bf064e303746529a673b852bb5a969c24c0156a8dd26242d0aad4bae43e23631b01fb9d050f9744b59f3b52b1c572217a1d70588"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004002d2d7d40bf17c4e8b18757e451ddded95e6b1007cd144809d21af31353b03038372c4af204d4414b71060b48b3a8439c632809bd33c4736263044405a1ad766e3600bb0c5a8848f93fa3e85376b012bf064e303746529a673b852bb5a969c24c0156a8dd26242d0aad4bae43e23631b01fb9d050f9744b59f3b52b1c572217a1d70588",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQALS19QL8XxOixh1fkUd3e2V5rEAfN\nFEgJ0hrzE1OwMDg3LEryBNRBS3EGC0izqEOcYygJvTPEc2JjBEQFoa12bjYAuwxa\niEj5P6PoU3awEr8GTjA3RlKaZzuFK7WpacJMAVao3SYkLQqtS65D4jYxsB+50FD5\ndEtZ87UrHFciF6HXBYg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 385,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242010590b21642c8590b21642c8590b21642c8590b21642c8590b21642c8590b2164298eb57e5aff9343597a542d3132f9e734fdc305125e0ec139c5f780ee8e8cb9c2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04018ac11dfe62d1f2a8202732c79b423d29f43bec4db6080a220796a10f2685f92c71c7f72d9da0a8acb22680cca018eba2e8ba3bfde1db9a4ef3b97da16474364e96005aad3b286707bd3ad07a060cabca49c53de4f56c05a0a8de40fd969d7d4f995f7c6701fe5c5321f85318b98be66251fa490088fd727da2454e00b3b94dc6e1241b",
+        "wx" : "18ac11dfe62d1f2a8202732c79b423d29f43bec4db6080a220796a10f2685f92c71c7f72d9da0a8acb22680cca018eba2e8ba3bfde1db9a4ef3b97da16474364e96",
+        "wy" : "5aad3b286707bd3ad07a060cabca49c53de4f56c05a0a8de40fd969d7d4f995f7c6701fe5c5321f85318b98be66251fa490088fd727da2454e00b3b94dc6e1241b"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004018ac11dfe62d1f2a8202732c79b423d29f43bec4db6080a220796a10f2685f92c71c7f72d9da0a8acb22680cca018eba2e8ba3bfde1db9a4ef3b97da16474364e96005aad3b286707bd3ad07a060cabca49c53de4f56c05a0a8de40fd969d7d4f995f7c6701fe5c5321f85318b98be66251fa490088fd727da2454e00b3b94dc6e1241b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBisEd/mLR8qggJzLHm0I9KfQ77E22\nCAoiB5ahDyaF+Sxxx/ctnaCorLImgMygGOui6Lo7/eHbmk7zuX2hZHQ2TpYAWq07\nKGcHvTrQegYMq8pJxT3k9WwFoKjeQP2WnX1PmV98ZwH+XFMh+FMYuYvmYlH6SQCI\n/XJ9okVOALO5TcbhJBs=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 386,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201a4924924924924924924924924924924924924924924924924924924924924924445e10670ed0437c9db4125ac4175fbd70e9bd1799a85f44ca0a8e61a3354e808",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040051b2c3e0494564ed48ed3479b596ea4078240550a3c28da33d71d259e8e623e37ab43f396c49363f31c8de8a4644d37e94ed80e0dd4f92c3df2106e2795c2798b800a530d5e961f0696bbeb962aca8e71f65956ae04cdc22a4ac65146943e99a4a2fdb477df75aa069c8dd37a5daaea3848079a6a7bc03e0faa3d65d42f8053db2078b",
+        "wx" : "51b2c3e0494564ed48ed3479b596ea4078240550a3c28da33d71d259e8e623e37ab43f396c49363f31c8de8a4644d37e94ed80e0dd4f92c3df2106e2795c2798b8",
+        "wy" : "0a530d5e961f0696bbeb962aca8e71f65956ae04cdc22a4ac65146943e99a4a2fdb477df75aa069c8dd37a5daaea3848079a6a7bc03e0faa3d65d42f8053db2078b"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040051b2c3e0494564ed48ed3479b596ea4078240550a3c28da33d71d259e8e623e37ab43f396c49363f31c8de8a4644d37e94ed80e0dd4f92c3df2106e2795c2798b800a530d5e961f0696bbeb962aca8e71f65956ae04cdc22a4ac65146943e99a4a2fdb477df75aa069c8dd37a5daaea3848079a6a7bc03e0faa3d65d42f8053db2078b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAUbLD4ElFZO1I7TR5tZbqQHgkBVCj\nwo2jPXHSWejmI+N6tD85bEk2PzHI3opGRNN+lO2A4N1PksPfIQbieVwnmLgApTDV\n6WHwaWu+uWKsqOcfZZVq4EzcIqSsZRRpQ+maSi/bR333WqBpyN03pdquo4SAeaan\nvAPg+qPWXUL4BT2yB4s=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 387,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201d5555555555555555555555555555555555555555555555555555555555555554fa6dbdcd91484ebc0d521569e4c5efb25910b1f0ddef19d0410c50c73e68db95f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401ba31a6f9c2d227da57de00759e2e844d607bc9bd92bcdf282006884dc347c9284f0dc0623af1e9db22117364a7a80a5b067efa19b204dac8faf2230d80b704addc00d88b761cd3a4b0947bfc17e204b4d751f76880a82c9b7c6fd93ded55883c995002d8b8bfff1e021189c08d829d16b088f4fb39ad9456eafbc77c20353bc0f3c038",
+        "wx" : "1ba31a6f9c2d227da57de00759e2e844d607bc9bd92bcdf282006884dc347c9284f0dc0623af1e9db22117364a7a80a5b067efa19b204dac8faf2230d80b704addc",
+        "wy" : "0d88b761cd3a4b0947bfc17e204b4d751f76880a82c9b7c6fd93ded55883c995002d8b8bfff1e021189c08d829d16b088f4fb39ad9456eafbc77c20353bc0f3c038"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401ba31a6f9c2d227da57de00759e2e844d607bc9bd92bcdf282006884dc347c9284f0dc0623af1e9db22117364a7a80a5b067efa19b204dac8faf2230d80b704addc00d88b761cd3a4b0947bfc17e204b4d751f76880a82c9b7c6fd93ded55883c995002d8b8bfff1e021189c08d829d16b088f4fb39ad9456eafbc77c20353bc0f3c038",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBujGm+cLSJ9pX3gB1ni6ETWB7yb2S\nvN8oIAaITcNHyShPDcBiOvHp2yIRc2SnqApbBn76GbIE2sj68iMNgLcErdwA2It2\nHNOksJR7/BfiBLTXUfdogKgsm3xv2T3tVYg8mVAC2Li//x4CEYnAjYKdFrCI9Ps5\nrZRW6vvHfCA1O8DzwDg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 388,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4fc31322e69da41162a76abf3a1b4507ae66074633446f259661a61c93be30eb5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040137bbb48ef281133849ed723f5662a19fff9cc7389a0170d311bd34f4dbdc656246db695ea0712d8aceff9d1d0ef7921ec2e3f8b533e4ca122f9f7f4460738893340163e4500d998095f60fa3fed4149d2d9b5b018e03eb5344efe8ffcc1c7d276e7401a4df639c4ab108820062495471be7b29398aadbae440a9bdcd55cf0bb5d96f79",
+        "wx" : "137bbb48ef281133849ed723f5662a19fff9cc7389a0170d311bd34f4dbdc656246db695ea0712d8aceff9d1d0ef7921ec2e3f8b533e4ca122f9f7f446073889334",
+        "wy" : "163e4500d998095f60fa3fed4149d2d9b5b018e03eb5344efe8ffcc1c7d276e7401a4df639c4ab108820062495471be7b29398aadbae440a9bdcd55cf0bb5d96f79"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040137bbb48ef281133849ed723f5662a19fff9cc7389a0170d311bd34f4dbdc656246db695ea0712d8aceff9d1d0ef7921ec2e3f8b533e4ca122f9f7f4460738893340163e4500d998095f60fa3fed4149d2d9b5b018e03eb5344efe8ffcc1c7d276e7401a4df639c4ab108820062495471be7b29398aadbae440a9bdcd55cf0bb5d96f79",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBN7u0jvKBEzhJ7XI/VmKhn/+cxzia\nAXDTEb009NvcZWJG22leoHEtis7/nR0O95IewuP4tTPkyhIvn39EYHOIkzQBY+RQ\nDZmAlfYPo/7UFJ0tm1sBjgPrU0Tv6P/MHH0nbnQBpN9jnEqxCIIAYklUcb57KTmK\nrbrkQKm9zVXPC7XZb3k=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 389,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400726dda8b7b6ed25f97f1fc6c3ccf554d60fc71e4fab2a578286d32612e7f3e669faed0b97619aef2d5aff9c8ffd987feddc0d6c38b7eec028191400874803f498b00c0b8870c612e06c13c57ed6f7ef3d53b5e5fa2db62707b034b5ec13fb47018e31da7ecc991d575943468d701e118eca33122cf6d394b8a6ec0f45bc09701603a26",
+        "wx" : "726dda8b7b6ed25f97f1fc6c3ccf554d60fc71e4fab2a578286d32612e7f3e669faed0b97619aef2d5aff9c8ffd987feddc0d6c38b7eec028191400874803f498b",
+        "wy" : "0c0b8870c612e06c13c57ed6f7ef3d53b5e5fa2db62707b034b5ec13fb47018e31da7ecc991d575943468d701e118eca33122cf6d394b8a6ec0f45bc09701603a26"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400726dda8b7b6ed25f97f1fc6c3ccf554d60fc71e4fab2a578286d32612e7f3e669faed0b97619aef2d5aff9c8ffd987feddc0d6c38b7eec028191400874803f498b00c0b8870c612e06c13c57ed6f7ef3d53b5e5fa2db62707b034b5ec13fb47018e31da7ecc991d575943468d701e118eca33122cf6d394b8a6ec0f45bc09701603a26",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAcm3ai3tu0l+X8fxsPM9VTWD8ceT6\nsqV4KG0yYS5/PmafrtC5dhmu8tWv+cj/2Yf+3cDWw4t+7AKBkUAIdIA/SYsAwLiH\nDGEuBsE8V+1vfvPVO15fotticHsDS17BP7RwGOMdp+zJkdV1lDRo1wHhGOyjMSLP\nbTlLim7A9FvAlwFgOiY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 390,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201346cc7d4839b77f9f487c7e7f2841c5b7d05f966f3bde28f1fa080ce40037a74e3001a2b00bd39ee4c93072e9963724941383cf0812c02d1c838ad4502a12c619f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04016fce9f375bbd2968adaaf3575595129ef3e721c3b7c83d5a4a79f4b5dfbbdb1f66da7243e5120c5dbd7be1ca073e04b4cc58ca8ce2f34ff6a3d02a929bf2fc27970083f130792d6c45c8f2a67471e51246e2b8781465b8291cbda66d22719cd536bf801e0076030919d5701732ce7678bf472846ed0777937ed77caad74d05664614a2",
+        "wx" : "16fce9f375bbd2968adaaf3575595129ef3e721c3b7c83d5a4a79f4b5dfbbdb1f66da7243e5120c5dbd7be1ca073e04b4cc58ca8ce2f34ff6a3d02a929bf2fc2797",
+        "wy" : "083f130792d6c45c8f2a67471e51246e2b8781465b8291cbda66d22719cd536bf801e0076030919d5701732ce7678bf472846ed0777937ed77caad74d05664614a2"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004016fce9f375bbd2968adaaf3575595129ef3e721c3b7c83d5a4a79f4b5dfbbdb1f66da7243e5120c5dbd7be1ca073e04b4cc58ca8ce2f34ff6a3d02a929bf2fc27970083f130792d6c45c8f2a67471e51246e2b8781465b8291cbda66d22719cd536bf801e0076030919d5701732ce7678bf472846ed0777937ed77caad74d05664614a2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBb86fN1u9KWitqvNXVZUSnvPnIcO3\nyD1aSnn0td+72x9m2nJD5RIMXb174coHPgS0zFjKjOLzT/aj0CqSm/L8J5cAg/Ew\neS1sRcjypnRx5RJG4rh4FGW4KRy9pm0icZzVNr+AHgB2AwkZ1XAXMs52eL9HKEbt\nB3eTftd8qtdNBWZGFKI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 391,
+          "comment" : "point duplication during verification",
+          "msg" : "313233343030",
+          "sig" : "30818802420090c8d0d718cb9d8d81094e6d068fb13c16b4df8c77bac676dddfe3e68855bed06b9ba8d0f8a80edce03a9fac7da561e24b1cd22d459239a146695a671f81f73aaf024201150b0fe9f0dff27fa180cc9442c3bfc9e395232898607b110a51bcb1086cb9726e251a07c9557808df32460715950a3dc446ae4229b9ed59fe241b389aee3a6963",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04016fce9f375bbd2968adaaf3575595129ef3e721c3b7c83d5a4a79f4b5dfbbdb1f66da7243e5120c5dbd7be1ca073e04b4cc58ca8ce2f34ff6a3d02a929bf2fc2797017c0ecf86d293ba370d598b8e1aedb91d4787eb9a47d6e3425992dd8e632ac9407fe1ff89fcf6e62a8fe8cd31898740b8d7b912f8886c8128835528b2fa99b9eb5d",
+        "wx" : "16fce9f375bbd2968adaaf3575595129ef3e721c3b7c83d5a4a79f4b5dfbbdb1f66da7243e5120c5dbd7be1ca073e04b4cc58ca8ce2f34ff6a3d02a929bf2fc2797",
+        "wy" : "17c0ecf86d293ba370d598b8e1aedb91d4787eb9a47d6e3425992dd8e632ac9407fe1ff89fcf6e62a8fe8cd31898740b8d7b912f8886c8128835528b2fa99b9eb5d"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004016fce9f375bbd2968adaaf3575595129ef3e721c3b7c83d5a4a79f4b5dfbbdb1f66da7243e5120c5dbd7be1ca073e04b4cc58ca8ce2f34ff6a3d02a929bf2fc2797017c0ecf86d293ba370d598b8e1aedb91d4787eb9a47d6e3425992dd8e632ac9407fe1ff89fcf6e62a8fe8cd31898740b8d7b912f8886c8128835528b2fa99b9eb5d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBb86fN1u9KWitqvNXVZUSnvPnIcO3\nyD1aSnn0td+72x9m2nJD5RIMXb174coHPgS0zFjKjOLzT/aj0CqSm/L8J5cBfA7P\nhtKTujcNWYuOGu25HUeH65pH1uNCWZLdjmMqyUB/4f+J/PbmKo/ozTGJh0C417kS\n+IhsgSiDVSiy+pm5610=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 392,
+          "comment" : "duplication bug",
+          "msg" : "313233343030",
+          "sig" : "30818802420090c8d0d718cb9d8d81094e6d068fb13c16b4df8c77bac676dddfe3e68855bed06b9ba8d0f8a80edce03a9fac7da561e24b1cd22d459239a146695a671f81f73aaf024201150b0fe9f0dff27fa180cc9442c3bfc9e395232898607b110a51bcb1086cb9726e251a07c9557808df32460715950a3dc446ae4229b9ed59fe241b389aee3a6963",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040110fb89aff135edb801a1cb5bc49525b81dc74da45090d228122871814f489fdcb02ebee46b703e6b4e6af56c5024422b31fd4252c44d0bfd29d945de782d98543f01ec425b4c4928e12b619227f1da6d0a9675070d9c5b49ca523050acb718e62643b0e5801543b76dc11f8d694ba09436d8391b477ad2c143ec50c2384c4f688512dc",
+        "wx" : "110fb89aff135edb801a1cb5bc49525b81dc74da45090d228122871814f489fdcb02ebee46b703e6b4e6af56c5024422b31fd4252c44d0bfd29d945de782d98543f",
+        "wy" : "1ec425b4c4928e12b619227f1da6d0a9675070d9c5b49ca523050acb718e62643b0e5801543b76dc11f8d694ba09436d8391b477ad2c143ec50c2384c4f688512dc"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040110fb89aff135edb801a1cb5bc49525b81dc74da45090d228122871814f489fdcb02ebee46b703e6b4e6af56c5024422b31fd4252c44d0bfd29d945de782d98543f01ec425b4c4928e12b619227f1da6d0a9675070d9c5b49ca523050acb718e62643b0e5801543b76dc11f8d694ba09436d8391b477ad2c143ec50c2384c4f688512dc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBEPuJr/E17bgBoctbxJUluB3HTaRQ\nkNIoEihxgU9In9ywLr7ka3A+a05q9WxQJEIrMf1CUsRNC/0p2UXeeC2YVD8B7EJb\nTEko4Sthkifx2m0KlnUHDZxbScpSMFCstxjmJkOw5YAVQ7dtwR+NaUuglDbYORtH\netLBQ+xQwjhMT2iFEtw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 393,
+          "comment" : "point with x-coordinate 0",
+          "msg" : "313233343030",
+          "sig" : "3047020101024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401c693a3fccbc9f625284239c2725f2a5c90b29b7ce3d07730f7de6031c9e74446d217888ae023aae23df6a4aa153f58c79597d57f42ce5c1354e5dc43a5eb311e13015f99658443b2e39c3edcbcda70707fc5a4d39545eabe354816d09284a6265e47ebf0a47355828e818a767f8452a6d18451e0e3817a896ff404cb1611bfc4c4b4a3",
+        "wx" : "1c693a3fccbc9f625284239c2725f2a5c90b29b7ce3d07730f7de6031c9e74446d217888ae023aae23df6a4aa153f58c79597d57f42ce5c1354e5dc43a5eb311e13",
+        "wy" : "15f99658443b2e39c3edcbcda70707fc5a4d39545eabe354816d09284a6265e47ebf0a47355828e818a767f8452a6d18451e0e3817a896ff404cb1611bfc4c4b4a3"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401c693a3fccbc9f625284239c2725f2a5c90b29b7ce3d07730f7de6031c9e74446d217888ae023aae23df6a4aa153f58c79597d57f42ce5c1354e5dc43a5eb311e13015f99658443b2e39c3edcbcda70707fc5a4d39545eabe354816d09284a6265e47ebf0a47355828e818a767f8452a6d18451e0e3817a896ff404cb1611bfc4c4b4a3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBxpOj/MvJ9iUoQjnCcl8qXJCym3zj\n0Hcw995gMcnnREbSF4iK4COq4j32pKoVP1jHlZfVf0LOXBNU5dxDpesxHhMBX5ll\nhEOy45w+3LzacHB/xaTTlUXqvjVIFtCShKYmXkfr8KRzVYKOgYp2f4RSptGEUeDj\ngXqJb/QEyxYRv8TEtKM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 394,
+          "comment" : "point with x-coordinate 0",
+          "msg" : "313233343030",
+          "sig" : "3081870242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024166666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81401",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04017d7bf723678df574ce4366741e1d3787f834af9997b41c8260a074cb1f325d2bae9f8565dc6b51b6cb02dceeb5a1b774ee8dd7057c99e2d94c3c71299a9ce0f1b00162c65632fff88bdbb17ce2525ccac8df37c501ab0e6626e273fb6cf99000424344c0ac539c9fd6c4f3d28876b257c010d347a45bb010cc058443843a758328d491",
+        "wx" : "17d7bf723678df574ce4366741e1d3787f834af9997b41c8260a074cb1f325d2bae9f8565dc6b51b6cb02dceeb5a1b774ee8dd7057c99e2d94c3c71299a9ce0f1b0",
+        "wy" : "162c65632fff88bdbb17ce2525ccac8df37c501ab0e6626e273fb6cf99000424344c0ac539c9fd6c4f3d28876b257c010d347a45bb010cc058443843a758328d491"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004017d7bf723678df574ce4366741e1d3787f834af9997b41c8260a074cb1f325d2bae9f8565dc6b51b6cb02dceeb5a1b774ee8dd7057c99e2d94c3c71299a9ce0f1b00162c65632fff88bdbb17ce2525ccac8df37c501ab0e6626e273fb6cf99000424344c0ac539c9fd6c4f3d28876b257c010d347a45bb010cc058443843a758328d491",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBfXv3I2eN9XTOQ2Z0Hh03h/g0r5mX\ntByCYKB0yx8yXSuun4Vl3GtRtssC3O61obd07o3XBXyZ4tlMPHEpmpzg8bABYsZW\nMv/4i9uxfOJSXMrI3zfFAasOZibic/ts+ZAAQkNEwKxTnJ/WxPPSiHayV8AQ00ek\nW7AQzAWEQ4Q6dYMo1JE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 395,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "313233343030",
+          "sig" : "308187024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad024166666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81401",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401e06db423a902e239b97340ab052534ead37e79412c675bf0eb823999e6b731040bff2b0e4fa64edf3962a328921ea5ae4e8f4079eab439e12f92335dfc4863c07f007ee9f0ecb409cb133c0cd08b85e840b076f3d615e1ef1393b5222338b227d768003da5f3ba1f72f6654ca54ac11c2ba91a6cb5883d6d1a82304ad2b79de09215f3",
+        "wx" : "1e06db423a902e239b97340ab052534ead37e79412c675bf0eb823999e6b731040bff2b0e4fa64edf3962a328921ea5ae4e8f4079eab439e12f92335dfc4863c07f",
+        "wy" : "7ee9f0ecb409cb133c0cd08b85e840b076f3d615e1ef1393b5222338b227d768003da5f3ba1f72f6654ca54ac11c2ba91a6cb5883d6d1a82304ad2b79de09215f3"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401e06db423a902e239b97340ab052534ead37e79412c675bf0eb823999e6b731040bff2b0e4fa64edf3962a328921ea5ae4e8f4079eab439e12f92335dfc4863c07f007ee9f0ecb409cb133c0cd08b85e840b076f3d615e1ef1393b5222338b227d768003da5f3ba1f72f6654ca54ac11c2ba91a6cb5883d6d1a82304ad2b79de09215f3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB4G20I6kC4jm5c0CrBSU06tN+eUEs\nZ1vw64I5mea3MQQL/ysOT6ZO3zlioyiSHqWuTo9Aeeq0OeEvkjNd/EhjwH8Afunw\n7LQJyxM8DNCLhehAsHbz1hXh7xOTtSIjOLIn12gAPaXzuh9y9mVMpUrBHCupGmy1\niD1tGoIwStK3neCSFfM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 396,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "3081870241433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04015053744d53811dbed8880f38d3a34578a7f1c172ec65bd8ad8183ba0ae10093416107f3c942742bde60719949b2c4f026f43582125c99ed48cbc7c5a051a5a744800b36d4c91a2b0367c566b2c12981ce0fdbc3beb983717403f69bf4264fc6182478af0b236ff120bcfca116924c552abef6663b6023be1986b70206d9bb89b5ed298",
+        "wx" : "15053744d53811dbed8880f38d3a34578a7f1c172ec65bd8ad8183ba0ae10093416107f3c942742bde60719949b2c4f026f43582125c99ed48cbc7c5a051a5a7448",
+        "wy" : "0b36d4c91a2b0367c566b2c12981ce0fdbc3beb983717403f69bf4264fc6182478af0b236ff120bcfca116924c552abef6663b6023be1986b70206d9bb89b5ed298"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004015053744d53811dbed8880f38d3a34578a7f1c172ec65bd8ad8183ba0ae10093416107f3c942742bde60719949b2c4f026f43582125c99ed48cbc7c5a051a5a744800b36d4c91a2b0367c566b2c12981ce0fdbc3beb983717403f69bf4264fc6182478af0b236ff120bcfca116924c552abef6663b6023be1986b70206d9bb89b5ed298",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBUFN0TVOBHb7YiA8406NFeKfxwXLs\nZb2K2Bg7oK4QCTQWEH88lCdCveYHGZSbLE8Cb0NYISXJntSMvHxaBRpadEgAs21M\nkaKwNnxWaywSmBzg/bw765g3F0A/ab9CZPxhgkeK8LI2/xILz8oRaSTFUqvvZmO2\nAjvhmGtwIG2buJte0pg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 397,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3081860241433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d0241492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401fb2e26596cc80473917dd46b4a1d14bd9a1ca9769dd12bfac1bff17cdc282e74c73a801ec1be83edfe4bfe9813ec943ac151678f0a9a0bf27d9ef308177eb0400f019e03a5da3da67e6b8d068dbdacf091b9d5efadaf63f4a7e9c6b6ed0a1c9a5d3cbc3e0244d481066018fba7674a2b59139a5656780563bb4618014f176752e177e0",
+        "wx" : "1fb2e26596cc80473917dd46b4a1d14bd9a1ca9769dd12bfac1bff17cdc282e74c73a801ec1be83edfe4bfe9813ec943ac151678f0a9a0bf27d9ef308177eb0400f",
+        "wy" : "19e03a5da3da67e6b8d068dbdacf091b9d5efadaf63f4a7e9c6b6ed0a1c9a5d3cbc3e0244d481066018fba7674a2b59139a5656780563bb4618014f176752e177e0"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401fb2e26596cc80473917dd46b4a1d14bd9a1ca9769dd12bfac1bff17cdc282e74c73a801ec1be83edfe4bfe9813ec943ac151678f0a9a0bf27d9ef308177eb0400f019e03a5da3da67e6b8d068dbdacf091b9d5efadaf63f4a7e9c6b6ed0a1c9a5d3cbc3e0244d481066018fba7674a2b59139a5656780563bb4618014f176752e177e0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB+y4mWWzIBHORfdRrSh0UvZocqXad\n0Sv6wb/xfNwoLnTHOoAewb6D7f5L/pgT7JQ6wVFnjwqaC/J9nvMIF36wQA8BngOl\n2j2mfmuNBo29rPCRudXvra9j9KfpxrbtChyaXTy8PgJE1IEGYBj7p2dKK1kTmlZW\neAVju0YYAU8XZ1Lhd+A=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 398,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3081870241433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d0242019999999999999999999999999999999999999999999999999999999999999999950e053936328c7855ffd6676d926e1e402fc4a1606e169fbefc595f4ba7605007",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04008422cea9dcf8ae01f7a157888f018a40a66461d3566ec4a4dfc89ecb3c2404be734d329137d630387b012d033221857d5bfb290fa8027640b4063072a3e5b14c860025a219e724b81814901a677a8bee9b716b33b16a5b65f2272956a46b5e8683dc896984309ac79449657a1895c9f62bde99c7f5e24ed2defbc9f8dde35ebd0bddc1",
+        "wx" : "08422cea9dcf8ae01f7a157888f018a40a66461d3566ec4a4dfc89ecb3c2404be734d329137d630387b012d033221857d5bfb290fa8027640b4063072a3e5b14c86",
+        "wy" : "25a219e724b81814901a677a8bee9b716b33b16a5b65f2272956a46b5e8683dc896984309ac79449657a1895c9f62bde99c7f5e24ed2defbc9f8dde35ebd0bddc1"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004008422cea9dcf8ae01f7a157888f018a40a66461d3566ec4a4dfc89ecb3c2404be734d329137d630387b012d033221857d5bfb290fa8027640b4063072a3e5b14c860025a219e724b81814901a677a8bee9b716b33b16a5b65f2272956a46b5e8683dc896984309ac79449657a1895c9f62bde99c7f5e24ed2defbc9f8dde35ebd0bddc1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAhCLOqdz4rgH3oVeIjwGKQKZkYdNW\nbsSk38ieyzwkBL5zTTKRN9YwOHsBLQMyIYV9W/spD6gCdkC0BjByo+WxTIYAJaIZ\n5yS4GBSQGmd6i+6bcWszsWpbZfInKVaka16Gg9yJaYQwmseUSWV6GJXJ9ivemcf1\n4k7S3vvJ+N3jXr0L3cE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 399,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3081860241433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d024166666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81402",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401bc19cf4b94bcd34114ce83c5f1a7e048e2fc4fd457d57e39b3da29f4766acbaef1c10cb13c796a6fffb56d6a392e47b6c74522df7fa02754c33d95b1a9a3c92a1500f5744c2bed308cb4f41b512e632cd01d270ef1a0d3f47ea780e73c6a6c9ea6a996faef4d282896c64fa50f5b04e204c56b504bc122ffba7aea4574d7d7ab6303c0",
+        "wx" : "1bc19cf4b94bcd34114ce83c5f1a7e048e2fc4fd457d57e39b3da29f4766acbaef1c10cb13c796a6fffb56d6a392e47b6c74522df7fa02754c33d95b1a9a3c92a15",
+        "wy" : "0f5744c2bed308cb4f41b512e632cd01d270ef1a0d3f47ea780e73c6a6c9ea6a996faef4d282896c64fa50f5b04e204c56b504bc122ffba7aea4574d7d7ab6303c0"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401bc19cf4b94bcd34114ce83c5f1a7e048e2fc4fd457d57e39b3da29f4766acbaef1c10cb13c796a6fffb56d6a392e47b6c74522df7fa02754c33d95b1a9a3c92a1500f5744c2bed308cb4f41b512e632cd01d270ef1a0d3f47ea780e73c6a6c9ea6a996faef4d282896c64fa50f5b04e204c56b504bc122ffba7aea4574d7d7ab6303c0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBvBnPS5S800EUzoPF8afgSOL8T9RX\n1X45s9op9HZqy67xwQyxPHlqb/+1bWo5Lke2x0Ui33+gJ1TDPZWxqaPJKhUA9XRM\nK+0wjLT0G1EuYyzQHScO8aDT9H6ngOc8amyepqmW+u9NKCiWxk+lD1sE4gTFa1BL\nwSL/unrqRXTX16tjA8A=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 400,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3081870241433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d024201b6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db68d82a2b033628ca12ffd36ed0d3bf206957c063c2bf183d7132f20aac7c797a51",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04017b0ebce08b09f21e30d15e0edd9fcdf24ab4831ec8a65a3d1e38f72b15f0115da6ed1885e42fcfae31c0914b71e9df2cd106adc039a82810a92924dd154dc05da300c614d1afc4f63de3803bb5490a34e1e2fab9eb78422b21d377fc0d7f991b938c22f4d7dd665f8dd21fadde43172a55f80d05cc4557b6663f9e7a3fe490d25c5531",
+        "wx" : "17b0ebce08b09f21e30d15e0edd9fcdf24ab4831ec8a65a3d1e38f72b15f0115da6ed1885e42fcfae31c0914b71e9df2cd106adc039a82810a92924dd154dc05da3",
+        "wy" : "0c614d1afc4f63de3803bb5490a34e1e2fab9eb78422b21d377fc0d7f991b938c22f4d7dd665f8dd21fadde43172a55f80d05cc4557b6663f9e7a3fe490d25c5531"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004017b0ebce08b09f21e30d15e0edd9fcdf24ab4831ec8a65a3d1e38f72b15f0115da6ed1885e42fcfae31c0914b71e9df2cd106adc039a82810a92924dd154dc05da300c614d1afc4f63de3803bb5490a34e1e2fab9eb78422b21d377fc0d7f991b938c22f4d7dd665f8dd21fadde43172a55f80d05cc4557b6663f9e7a3fe490d25c5531",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBew684IsJ8h4w0V4O3Z/N8kq0gx7I\nplo9Hjj3KxXwEV2m7RiF5C/PrjHAkUtx6d8s0QatwDmoKBCpKSTdFU3AXaMAxhTR\nr8T2PeOAO7VJCjTh4vq563hCKyHTd/wNf5kbk4wi9NfdZl+N0h+t3kMXKlX4DQXM\nRVe2Zj+eej/kkNJcVTE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 401,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "3081860241433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d02410eb10e5ab95f2f26a40700b1300fb8c3c8d5384ffbecf1fdb9e11e67cb7fd6a7f503e6e25ac09bb88b6c3983df764d4d72bc2920e233f0f7974a234a21b00bb447",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040004c3ec8d7d23ce74be8b9c7c27be869c23bafc6874ebc44f47e107422ab1e75ed09bebd7cb1ec4626e442bcf512a25c5ddde26eb08ba37506461830cf9241cbe9c0050a1bc08f4ba8da1d641ac3891823ab519facd4159768b1c0738f0e23450f374e4d6de55cceed95722be635c5dc0023a1498862f87bfe61d77e20e592cc20bb2ca",
+        "wx" : "4c3ec8d7d23ce74be8b9c7c27be869c23bafc6874ebc44f47e107422ab1e75ed09bebd7cb1ec4626e442bcf512a25c5ddde26eb08ba37506461830cf9241cbe9c",
+        "wy" : "50a1bc08f4ba8da1d641ac3891823ab519facd4159768b1c0738f0e23450f374e4d6de55cceed95722be635c5dc0023a1498862f87bfe61d77e20e592cc20bb2ca"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040004c3ec8d7d23ce74be8b9c7c27be869c23bafc6874ebc44f47e107422ab1e75ed09bebd7cb1ec4626e442bcf512a25c5ddde26eb08ba37506461830cf9241cbe9c0050a1bc08f4ba8da1d641ac3891823ab519facd4159768b1c0738f0e23450f374e4d6de55cceed95722be635c5dc0023a1498862f87bfe61d77e20e592cc20bb2ca",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQABMPsjX0jznS+i5x8J76GnCO6/Gh0\n68RPR+EHQiqx517Qm+vXyx7EYm5EK89RKiXF3d4m6wi6N1BkYYMM+SQcvpwAUKG8\nCPS6jaHWQaw4kYI6tRn6zUFZdoscBzjw4jRQ83Tk1t5VzO7ZVyK+Y1xdwAI6FJiG\nL4e/5h134g5ZLMILsso=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 402,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "308188024200c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400a7c8204f2864dcef089165c3914dcc2c0896075870ca0bc1ce37856f80f23815b0c8f2ec05145c421049e80ec1e7694f9f04174bbef21bc0972e559cf222de7e1a01ff1108c28f01b703820e1c0187912962ab23109618dfcb0c062ccee339002222a3f7dd8dd21675b0e20908fe5855ea876d6a9e02c5f5b793d38fdf79fb83603ea9",
+        "wx" : "0a7c8204f2864dcef089165c3914dcc2c0896075870ca0bc1ce37856f80f23815b0c8f2ec05145c421049e80ec1e7694f9f04174bbef21bc0972e559cf222de7e1a",
+        "wy" : "1ff1108c28f01b703820e1c0187912962ab23109618dfcb0c062ccee339002222a3f7dd8dd21675b0e20908fe5855ea876d6a9e02c5f5b793d38fdf79fb83603ea9"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400a7c8204f2864dcef089165c3914dcc2c0896075870ca0bc1ce37856f80f23815b0c8f2ec05145c421049e80ec1e7694f9f04174bbef21bc0972e559cf222de7e1a01ff1108c28f01b703820e1c0187912962ab23109618dfcb0c062ccee339002222a3f7dd8dd21675b0e20908fe5855ea876d6a9e02c5f5b793d38fdf79fb83603ea9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAp8ggTyhk3O8IkWXDkU3MLAiWB1hw\nygvBzjeFb4DyOBWwyPLsBRRcQhBJ6A7B52lPnwQXS77yG8CXLlWc8iLefhoB/xEI\nwo8BtwOCDhwBh5EpYqsjEJYY38sMBizO4zkAIiKj992N0hZ1sOIJCP5YVeqHbWqe\nAsX1t5PTj995+4NgPqk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 403,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "308187024200c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd660241492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401802fc79fc8e55bce50a581632b51d6eec04a3c74ac2bf4fae16ce6c7efef1701d69f9c00a91ad521d75ac7539d54bf464caeec871456103dc974354460898a19c600722fc1f528506618b1da9f8b2edbdbdaf7eec02e8fb9203d2b277735a1d867911b131f453f52ccc4ced05c3b1bc29e4d20f1e6d34979faa688ce8003f79d8e0c95",
+        "wx" : "1802fc79fc8e55bce50a581632b51d6eec04a3c74ac2bf4fae16ce6c7efef1701d69f9c00a91ad521d75ac7539d54bf464caeec871456103dc974354460898a19c6",
+        "wy" : "722fc1f528506618b1da9f8b2edbdbdaf7eec02e8fb9203d2b277735a1d867911b131f453f52ccc4ced05c3b1bc29e4d20f1e6d34979faa688ce8003f79d8e0c95"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401802fc79fc8e55bce50a581632b51d6eec04a3c74ac2bf4fae16ce6c7efef1701d69f9c00a91ad521d75ac7539d54bf464caeec871456103dc974354460898a19c600722fc1f528506618b1da9f8b2edbdbdaf7eec02e8fb9203d2b277735a1d867911b131f453f52ccc4ced05c3b1bc29e4d20f1e6d34979faa688ce8003f79d8e0c95",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBgC/Hn8jlW85QpYFjK1HW7sBKPHSs\nK/T64Wzmx+/vFwHWn5wAqRrVIddax1OdVL9GTK7shxRWED3JdDVEYImKGcYAci/B\n9ShQZhix2p+LLtvb2vfuwC6PuSA9Kyd3NaHYZ5EbEx9FP1LMxM7QXDsbwp5NIPHm\n00l5+qaIzoAD952ODJU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 404,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "308188024200c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd660242019999999999999999999999999999999999999999999999999999999999999999950e053936328c7855ffd6676d926e1e402fc4a1606e169fbefc595f4ba7605007",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401beb0b4c2e494226404fca4ad505ebfed13d184b1572683215b16173c29a4475aede47f266e0c9c4143137d3e0001f9f0148b689286a7c64e229458b824ed7658360130205169783ed9ada9f3a193027ae4e21829ad4a71d05d969605c04f3231dabab03beb2fab07dd8323d7132755734f4e6d1fb43fc8a63bfd244160c23efb6c1429",
+        "wx" : "1beb0b4c2e494226404fca4ad505ebfed13d184b1572683215b16173c29a4475aede47f266e0c9c4143137d3e0001f9f0148b689286a7c64e229458b824ed765836",
+        "wy" : "130205169783ed9ada9f3a193027ae4e21829ad4a71d05d969605c04f3231dabab03beb2fab07dd8323d7132755734f4e6d1fb43fc8a63bfd244160c23efb6c1429"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401beb0b4c2e494226404fca4ad505ebfed13d184b1572683215b16173c29a4475aede47f266e0c9c4143137d3e0001f9f0148b689286a7c64e229458b824ed7658360130205169783ed9ada9f3a193027ae4e21829ad4a71d05d969605c04f3231dabab03beb2fab07dd8323d7132755734f4e6d1fb43fc8a63bfd244160c23efb6c1429",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBvrC0wuSUImQE/KStUF6/7RPRhLFX\nJoMhWxYXPCmkR1rt5H8mbgycQUMTfT4AAfnwFItokoanxk4ilFi4JO12WDYBMCBR\naXg+2a2p86GTAnrk4hgprUpx0F2WlgXATzIx2rqwO+svqwfdgyPXEydVc09ObR+0\nP8imO/0kQWDCPvtsFCk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 405,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "308187024200c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66024166666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81402",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040121e59aaf26b8301f4fcc3e0a563c4104ae00b47c55b8945ce749116fdf6761d768bd50ed431e2b51e646fe4fe7dc2985b6aefa7f9441ea11840d2ace2f34293cb1000cf1e1a46d4d637216e28abd124cc641ae7a673445d573856bc2fec58d86e5ed63bc2a7f2049234e335a7bee95bb2724fb1480c97c38cd0d296cbcc113de3f135f",
+        "wx" : "121e59aaf26b8301f4fcc3e0a563c4104ae00b47c55b8945ce749116fdf6761d768bd50ed431e2b51e646fe4fe7dc2985b6aefa7f9441ea11840d2ace2f34293cb1",
+        "wy" : "0cf1e1a46d4d637216e28abd124cc641ae7a673445d573856bc2fec58d86e5ed63bc2a7f2049234e335a7bee95bb2724fb1480c97c38cd0d296cbcc113de3f135f"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040121e59aaf26b8301f4fcc3e0a563c4104ae00b47c55b8945ce749116fdf6761d768bd50ed431e2b51e646fe4fe7dc2985b6aefa7f9441ea11840d2ace2f34293cb1000cf1e1a46d4d637216e28abd124cc641ae7a673445d573856bc2fec58d86e5ed63bc2a7f2049234e335a7bee95bb2724fb1480c97c38cd0d296cbcc113de3f135f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBIeWarya4MB9PzD4KVjxBBK4AtHxV\nuJRc50kRb99nYddovVDtQx4rUeZG/k/n3CmFtq76f5RB6hGEDSrOLzQpPLEADPHh\npG1NY3IW4oq9EkzGQa56ZzRF1XOFa8L+xY2G5e1jvCp/IEkjTjNae+6Vuyck+xSA\nyXw4zQ0pbLzBE94/E18=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 406,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "308188024200c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66024201b6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db68d82a2b033628ca12ffd36ed0d3bf206957c063c2bf183d7132f20aac7c797a51",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04008e859e66d1237fdc928a4b954954fef565d203a0731d065d9df41a4fd3812b1cc2487053ea19ce839d200845952f80d80698771d83ccc1fc7f236dbee4c76b2bb4005a04b24c88cd40233fb43c59ea5cf2cb9510d16b1168bc126db64aaf9ab07a7453208fde079095966272bf03bc3312c9b9bab8c795ae375e8a0e8dd81c924e7c27",
+        "wx" : "08e859e66d1237fdc928a4b954954fef565d203a0731d065d9df41a4fd3812b1cc2487053ea19ce839d200845952f80d80698771d83ccc1fc7f236dbee4c76b2bb4",
+        "wy" : "5a04b24c88cd40233fb43c59ea5cf2cb9510d16b1168bc126db64aaf9ab07a7453208fde079095966272bf03bc3312c9b9bab8c795ae375e8a0e8dd81c924e7c27"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004008e859e66d1237fdc928a4b954954fef565d203a0731d065d9df41a4fd3812b1cc2487053ea19ce839d200845952f80d80698771d83ccc1fc7f236dbee4c76b2bb4005a04b24c88cd40233fb43c59ea5cf2cb9510d16b1168bc126db64aaf9ab07a7453208fde079095966272bf03bc3312c9b9bab8c795ae375e8a0e8dd81c924e7c27",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAjoWeZtEjf9ySikuVSVT+9WXSA6Bz\nHQZdnfQaT9OBKxzCSHBT6hnOg50gCEWVL4DYBph3HYPMwfx/I22+5MdrK7QAWgSy\nTIjNQCM/tDxZ6lzyy5UQ0WsRaLwSbbZKr5qwenRTII/eB5CVlmJyvwO8MxLJubq4\nx5WuN16KDo3YHJJOfCc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 407,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "308187024200c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd6602410eb10e5ab95f2f26a40700b1300fb8c3c8d5384ffbecf1fdb9e11e67cb7fd6a7f503e6e25ac09bb88b6c3983df764d4d72bc2920e233f0f7974a234a21b00bb447",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650",
+        "wx" : "0c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66",
+        "wy" : "11839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAxoWOBrcEBOnNnj7LZiOVtEKcZIE5\nBT+1Ifgor2BrTT26oUted+/nWSj+HcEnov+o3jNIs8GFakKb+X5+McLlvWYBGDkp\naniaO8AEXIpftCx9G9mY9URJV5tEaBevvRcnPmYsl+5ymV70JkDFULkBP60HYTU8\ncIaicsJAiL6Udp/RZlA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 408,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "308185024043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0241492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 409,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "308187024201ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d6acca94fdcdefd78dc0b56a22d16f2eec26ae0c1fb484d059300e80bd6b0472b3d1222ff5d08b03d0241492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd6600e7c6d6958765c43ffba375a04bd382e426670abbb6a864bb97e85042e8d8c199d368118d66a10bd9bf3aaf46fec052f89ecac38f795d8d3dbf77416b89602e99af",
+        "wx" : "0c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66",
+        "wy" : "0e7c6d6958765c43ffba375a04bd382e426670abbb6a864bb97e85042e8d8c199d368118d66a10bd9bf3aaf46fec052f89ecac38f795d8d3dbf77416b89602e99af"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd6600e7c6d6958765c43ffba375a04bd382e426670abbb6a864bb97e85042e8d8c199d368118d66a10bd9bf3aaf46fec052f89ecac38f795d8d3dbf77416b89602e99af",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAxoWOBrcEBOnNnj7LZiOVtEKcZIE5\nBT+1Ifgor2BrTT26oUted+/nWSj+HcEnov+o3jNIs8GFakKb+X5+McLlvWYA58bW\nlYdlxD/7o3WgS9OC5CZnCru2qGS7l+hQQujYwZnTaBGNZqEL2b86r0b+wFL4nsrD\nj3ldjT2/d0FriWAuma8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 410,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "308185024043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0241492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 411,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "308187024201ffbc07ff041506dc73a75086a43252fb43b6327af3c6b2cc7d6acca94fdcdefd78dc0b56a22d16f2eec26ae0c1fb484d059300e80bd6b0472b3d1222ff5d08b03d0241492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04012a908bfc5b70e17bdfae74294994808bf2a42dab59af8b0523a026d640a2a3d6d344520b62177e2cfa339ca42fb0883ec425904fbda2833a3b5b0a9a00811365d8012333d532f8f8eb1a623c378a3694651192bbda833e3b8d7b8f90b2bfc9b045f8a55e1b6a5fe1512c400c4bc9c86fd7c699d642f5cee9bb827c8b0abc0da01cef1e",
+        "wx" : "12a908bfc5b70e17bdfae74294994808bf2a42dab59af8b0523a026d640a2a3d6d344520b62177e2cfa339ca42fb0883ec425904fbda2833a3b5b0a9a00811365d8",
+        "wy" : "12333d532f8f8eb1a623c378a3694651192bbda833e3b8d7b8f90b2bfc9b045f8a55e1b6a5fe1512c400c4bc9c86fd7c699d642f5cee9bb827c8b0abc0da01cef1e"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004012a908bfc5b70e17bdfae74294994808bf2a42dab59af8b0523a026d640a2a3d6d344520b62177e2cfa339ca42fb0883ec425904fbda2833a3b5b0a9a00811365d8012333d532f8f8eb1a623c378a3694651192bbda833e3b8d7b8f90b2bfc9b045f8a55e1b6a5fe1512c400c4bc9c86fd7c699d642f5cee9bb827c8b0abc0da01cef1e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBKpCL/Ftw4XvfrnQpSZSAi/KkLatZ\nr4sFI6Am1kCio9bTRFILYhd+LPoznKQvsIg+xCWQT72igzo7WwqaAIETZdgBIzPV\nMvj46xpiPDeKNpRlEZK72oM+O417j5Cyv8mwRfilXhtqX+FRLEAMS8nIb9fGmdZC\n9c7pu4J8iwq8DaAc7x4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 412,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "308188024201625d6115092a8e2ee21b9f8a425aa73814dec8b2335e86150ab4229f5a3421d2e6256d632c7a4365a1ee01dd2a936921bbb4551a512d1d4b5a56c314e4a02534c5024201b792d23f2649862595451055777bda1b02dc6cc8fef23231e44b921b16155cd42257441d75a790371e91819f0a9b1fd0ebd02c90b5b774527746ed9bfe743dbe2f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 413,
+          "comment" : "pseudorandom signature",
+          "msg" : "4d7367",
+          "sig" : "30818602415adc833cbc1d6141ced457bab2b01b0814054d7a28fa8bb2925d1e7525b7cf7d5c938a17abfb33426dcc05ce8d44db02f53a75ea04017dca51e1fbb14ce3311b1402415f69b2a6de129147a8437b79c72315d35173d88c2d6119085c90dae8ec05c55e067e7dfa4f681035e3dccab099291c0ecf4428332a9cb0736d16e79111ac76d766",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 414,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "3081880242014141e4d94a58c1e747cbd9ee6670a41eac3c26fb4db3248e45d583179076e6b19a8e2003657a108f91f9a103157edff9b37df2b436a77dc112927d907ac9ba258702420108afa91b34bd904c680471e943af336fb90c5fb2b91401a58c9b1f467bf81af8049965dd8b45f12e152f4f7fd3780e3492f31ed2680d4777fbe655fe779ad897ab",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 415,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "308187024108135d3f1ae9e26fba825643ed8a29d63d7843720e93566aa09db2bdf5aaa69afbcc0c51e5295c298f305ba7b870f0a85bb5699cdf40764aab59418f77c6ffb4520242011d345256887fb351f5700961a7d47572e0d669056cb1d5619345c0c987f3331c2fe2c6df848a5c610422defd6212b64346161aa871ae55b1fe4add5f68836eb181",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a00000000009b98bfd33398c2cf8606fc0ae468b6d617ccb3e704af3b8506642a775d5b4da9d00209364a9f0a4ad77cbac604a015c97e6b5a18844a589a4f1c7d9625",
+        "wx" : "304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a",
+        "wy" : "09b98bfd33398c2cf8606fc0ae468b6d617ccb3e704af3b8506642a775d5b4da9d00209364a9f0a4ad77cbac604a015c97e6b5a18844a589a4f1c7d9625"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a00000000009b98bfd33398c2cf8606fc0ae468b6d617ccb3e704af3b8506642a775d5b4da9d00209364a9f0a4ad77cbac604a015c97e6b5a18844a589a4f1c7d9625",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAMEs9Bx7R7zAjkbVmr4ydHLev6aq8\nFBrDmrOWdsY+SMGyxkUetGDkUr1XPh+18VuOX5wD9jTY22iXKFBks86b2YoAAAAA\nAJuYv9MzmMLPhgb8CuRottYXzLPnBK87hQZkKnddW02p0AIJNkqfCkrXfLrGBKAV\nyX5rWhiESliaTxx9liU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 416,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3081870242011c9684af6dc52728410473c63053b01c358d67e81f8a1324ad711c60481a4a86dd3e75de20ca55ce7a9a39b1f82fd5da4fadf26a5bb8edd467af8825efe4746218024134c058aba6488d6943e11e0d1348429449ea17ac5edf8bcaf654106b98b2ddf346c537b8a9a3f9b3174b77637d220ef5318dbbc33d0aac0fe2ddeda17b23cb2de6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 417,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "30818702417c47a668625648cd8a31ac92174cf3d61041f7ad292588def6ed143b1ff9a288fd20cf36f58d4bfe4b2cd4a381d4da50c8eda5674f020449ae1d3dd77e44ed485e024201058e86b327d284e35bab49fc7c335417573f310afa9e1a53566e0fae516e099007965030f6f46b077116353f26cb466d1cf3f35300d744d2d8f883c8a31b43c20d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 418,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "308188024201e4e9f3a7b800de63407b8703ac545226541c97a673566711f70e2b9ccb21a145ad4637825b023d1ea9f18e60897413711611a85c1179bff9c107368f1c1b61c24c024201de948ee577c3d4e4122a52ecccac59abb6fa937dfb3e4b988cb243efe98740309452ba013112b225b3b1b1384d5f68796845199a2602a8d4505a331b07d101188e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a01ffffffff6467402ccc673d3079f903f51b974929e8334c18fb50c47af99bd588a2a4b2562ffdf6c9b560f5b528834539fb5fea368194a5e77bb5a765b0e38269da",
+        "wx" : "304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a",
+        "wy" : "1ffffffff6467402ccc673d3079f903f51b974929e8334c18fb50c47af99bd588a2a4b2562ffdf6c9b560f5b528834539fb5fea368194a5e77bb5a765b0e38269da"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a01ffffffff6467402ccc673d3079f903f51b974929e8334c18fb50c47af99bd588a2a4b2562ffdf6c9b560f5b528834539fb5fea368194a5e77bb5a765b0e38269da",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAMEs9Bx7R7zAjkbVmr4ydHLev6aq8\nFBrDmrOWdsY+SMGyxkUetGDkUr1XPh+18VuOX5wD9jTY22iXKFBks86b2YoB////\n/2RnQCzMZz0wefkD9RuXSSnoM0wY+1DEevmb1YiipLJWL/32ybVg9bUog0U5+1/q\nNoGUped7tadlsOOCado=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 419,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "308187024200b6cf64861a2b16e33976095dbf45a592c7c24228c4a1dd727f303d5eeb87e5388ad05c328f824c40abd3e6ce003fef5cd59dee0069ad6348ea6e57f90f6bdc0a820241228181c180366e5451dfef3593ce664804cb42d5a8d5046b816b3daf6602fafd9ac2dc24b8c93a10024480882558b6ad3d9e905923dcd0fd2a11964754a9b46b8f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 420,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30818802420093c8f766827d6dc15c810fa30433153a5e742859205ee8389fbf695c8840dc917440870acc5b160087ffd0cd9a6081029c60a7c26d5e8aa9a0570f4efdeb13dea20242012ec3bbf75a0ad3df40310266648a36db820217ed7fa94e9c8313e03293ef4f6a40e736fb8f208ad8fb883ca509d48046910523645459c27829d54431463b2548c7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 421,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30818802420152388c6da66164b706b41dd4dd48176d6eaf6525f876ef0ff2d147f6966ebfadf1767fa66d04203d3ec9c937a1f0c945aed953e34be444c219fd3b94d3277aa652024201658c1e5b2e563a49d11c883d05c491d628f0a92c3e3dc8db9a4c8d5f0dc846ac22af8b3c5fb5bbe2cfa98614dcffd87de1cee2c5912a5899505a0c5bcaa513e2c6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040000000002fba6a061201ea6b1ed4265163568735ebab78600cdf6a71101dc63beaf546d97a214fc6396793b014eb1aa7a728f53deb2ff9999a3808ddfed15e9629b01993852dadc39299a5a45b6bd7c8dc8ec67e7adbb359fa8fa5d44977e15e2e5a9acf0c33645f3f2c68c526e07732fb35043719cfafc16063c8e58850a958436a4e5",
+        "wx" : "2fba6a061201ea6b1ed4265163568735ebab78600cdf6a71101dc63beaf546d97a214fc6396793b014eb1aa7a728f53deb2ff9999a3808ddfed15e9629b",
+        "wy" : "1993852dadc39299a5a45b6bd7c8dc8ec67e7adbb359fa8fa5d44977e15e2e5a9acf0c33645f3f2c68c526e07732fb35043719cfafc16063c8e58850a958436a4e5"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040000000002fba6a061201ea6b1ed4265163568735ebab78600cdf6a71101dc63beaf546d97a214fc6396793b014eb1aa7a728f53deb2ff9999a3808ddfed15e9629b01993852dadc39299a5a45b6bd7c8dc8ec67e7adbb359fa8fa5d44977e15e2e5a9acf0c33645f3f2c68c526e07732fb35043719cfafc16063c8e58850a958436a4e5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAAAAAAvumoGEgHqax7UJlFjVoc166\nt4YAzfanEQHcY76vVG2XohT8Y5Z5OwFOsap6co9T3rL/mZmjgI3f7RXpYpsBmThS\n2tw5KZpaRba9fI3I7Gfnrbs1n6j6XUSXfhXi5ams8MM2RfPyxoxSbgdzL7NQQ3Gc\n+vwWBjyOWIUKlYQ2pOU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 422,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3081880242010e89470f981d2c7c5c96587121a67323bb96ff2427739d0d885ea277293efa3b25c0bda04d81466198a3cbfc441f1b1b98f6bcdc2589d9d91a17a7899f70d0461e0242017351b0da8c8d0e4aa0974669d190fa2f90aa50227160594dfb55755002365441de17ea42902128a6f81e554177ed509c0cec31fd5053fae03f62ff76579ba92bda",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 423,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3081880242011094ac23ca46a3e2b4ac3baae6504f1bfb3ddf2db9ab40eda32d8e0a05727998f8552a033bb05241e826a86a1d03014eae3aa5fe1a45caac1db3e8138b9cf5906802420147edb15a5080ee2f929f78b6ac86604aae51b674fa46eaae7fdfd90bf64d6189341155f4eba937eae74c9e480eb4fb7e6aafd4285e7fc503ee6ec20f0b1415be06",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 424,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "308188024201d876ae174da31e128babff9f1d15507660bdc7958750844dc4f4291f75a882a22f177f704be6067bf7ce8f06b8626d971e6ef5dcb666fa975c1e11126e04fccce2024201abb12630a68b669e6ad2d8d62654d75dfbc6b54a8e3a9c915be663e080ddcc348e57a10e2b1dd9f03e1b897796ad889b075e5919dc5bf37a112d92c693456e6457",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401fffffffe1d5d52b31ca52f8947a35593edf164cd324f833b90935846c64db1454df9f028dc8bc36bb04cb7f0cceceba01a3844097f7c35eeaa81428db0cca6333101b7c70277d0bf78a3c7b62c937f0cb2cad2565f5514f6205ceb1a193d4fdb45ba6e6cec07827bae0b16b8316c3539a15114d0de6d2de407fd7117551a70826eada6",
+        "wx" : "1fffffffe1d5d52b31ca52f8947a35593edf164cd324f833b90935846c64db1454df9f028dc8bc36bb04cb7f0cceceba01a3844097f7c35eeaa81428db0cca63331",
+        "wy" : "1b7c70277d0bf78a3c7b62c937f0cb2cad2565f5514f6205ceb1a193d4fdb45ba6e6cec07827bae0b16b8316c3539a15114d0de6d2de407fd7117551a70826eada6"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401fffffffe1d5d52b31ca52f8947a35593edf164cd324f833b90935846c64db1454df9f028dc8bc36bb04cb7f0cceceba01a3844097f7c35eeaa81428db0cca6333101b7c70277d0bf78a3c7b62c937f0cb2cad2565f5514f6205ceb1a193d4fdb45ba6e6cec07827bae0b16b8316c3539a15114d0de6d2de407fd7117551a70826eada6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB/////h1dUrMcpS+JR6NVk+3xZM0y\nT4M7kJNYRsZNsUVN+fAo3IvDa7BMt/DM7OugGjhECX98Ne6qgUKNsMymMzEBt8cC\nd9C/eKPHtiyTfwyyytJWX1UU9iBc6xoZPU/bRbpubOwHgnuuCxa4MWw1OaFRFNDe\nbS3kB/1xF1UacIJuraY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 425,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30818602414ed692af1ed1b4bd5cea3aa8ddc6f3f15d8a6ee0016fa0e8eb958580e7421832ecc0e387c34aafac6380bac419ea45c42ae6426af503847f22c49c2f456338c1a702417aceadde02ace1668bc1a3360d34e125afde230f536c154d91e6c876bee1d34ae06edcbbca0c7cd17646840913164740b12e2e224fe3ef3dec6fd84a81b581c188",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 426,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "308188024200e01094048fcf7a1e2ec66faedffc40f48c9c93514325bde6b4958d80f0413efde7eec1dc6de65f96009c069397e51da2eb1729efa287afd5552b25a9e427a6d836024201489e7e124f66942e642de992e60b3a86fcce576767719390c3a312fcdeaa560a7fbb0cabb35e05a6d6f3499160fd2dba12d29b613b16dec7494c950d65fdf11fa3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 427,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "308188024201d296292213380de133dc66eceb8bd857a5c468afe855c05da9db937373b51f9020ca11353415da76bb6af997a486d2370e31adcc0a4531952a3b59428678ee59430242015979a3c609c2c2099ae1b290da3d613b248e3a10de7ad770dffc82fb33e74fc3207533f97285cf4557a6407e9a775e59efeaee4264b2634933a6baf8c406f0c4a9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400c7c8817bf2f0652a4a4b5140c773e261080a0a111395856e8a3350f5eb5612bd63b367b965e92e9538ea3b7908aef1ade4b68e17f9f9148495c167d1c4dd4913490008bf0be2979abb8111fd0d768adcad774113a822c1bb60887053b5cf8c9563e76705a391ece154b5dfb114b20e351df4014bec19fa87720845801cf06b7fffffff",
+        "wx" : "0c7c8817bf2f0652a4a4b5140c773e261080a0a111395856e8a3350f5eb5612bd63b367b965e92e9538ea3b7908aef1ade4b68e17f9f9148495c167d1c4dd491349",
+        "wy" : "08bf0be2979abb8111fd0d768adcad774113a822c1bb60887053b5cf8c9563e76705a391ece154b5dfb114b20e351df4014bec19fa87720845801cf06b7fffffff"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400c7c8817bf2f0652a4a4b5140c773e261080a0a111395856e8a3350f5eb5612bd63b367b965e92e9538ea3b7908aef1ade4b68e17f9f9148495c167d1c4dd4913490008bf0be2979abb8111fd0d768adcad774113a822c1bb60887053b5cf8c9563e76705a391ece154b5dfb114b20e351df4014bec19fa87720845801cf06b7fffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAx8iBe/LwZSpKS1FAx3PiYQgKChET\nlYVuijNQ9etWEr1js2e5ZekulTjqO3kIrvGt5LaOF/n5FISVwWfRxN1JE0kACL8L\n4peau4ER/Q12itytd0ETqCLBu2CIcFO1z4yVY+dnBaOR7OFUtd+xFLIONR30AUvs\nGfqHcghFgBzwa3////8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 428,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "308188024201ef8f785c51a25ae2cd93487b5c848d4af133217a91f51359c966e7538e68743578122df5830002f96f6fadb5bc44480e3b3b2c804e4c51cf95d059d5646c5cef21024201ba2276cc003e87bea37c3724e58a0ab885f56d09b8b5718f674f9c70f3b5ecfb4ad1f3417b420ec40810e08826efa7d8ad6ca7c6a7840348097f92b2de8d6e080b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 429,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "30818802420155978adc4b570d897511f5ecfb65a31947e6e989da17dea716625bb3fa7b92b853623eb0cd9ce2a5e2b4d8c1c2a90ec04fe79d012576ec728a45c5ce47c6d500c0024200f79fa8b94ee282a3d1815892cbf15d7ebdf62cb042c76bb3c710c23e32b75992cc249d84072198e4ed63d72435a07d2ed76f278d7399f61a5b5c997f45692fed22",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 430,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "308188024201a2af29c58184ca861e7cd931f39cea064b199eee563f241cd5ecf6ebb2ade728f1be23cf007ebe8ef0c42d99f9f5190f6815446afc3043a820d7daf27e86b83b8a024201a2acd1822eb539383defff8769aad8bacd50cd24ca7aa6670671418110177808c3f4fbe6041b9cb898359ee61e04824adedd62b39fe5791907a20586333bd3c76d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdsa_test.json b/third_party/wycheproof/testvectors/ecdsa_test.json
new file mode 100644
index 0000000..5b8b632
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdsa_test.json
@@ -0,0 +1,23838 @@
+{
+  "algorithm" : "ECDSA",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "BER" : "This is a signature with correct values for (r, s) but using some alternative BER encoding instead of DER encoding. Implementations should not accept such signatures to limit signature malleability.",
+    "EdgeCase" : "Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA implementation does not check boundaries and computes s^(-1)==0.",
+    "GroupIsomorphism" : "Some EC groups have isomorphic groups that allow an efficient implementation. This is a test vector that contains values that are edge cases on such an isomorphic group.",
+    "MissingZero" : "Some implementations of ECDSA and DSA incorrectly encode r and s by not including leading zeros in the ASN encoding of integers when necessary. Hence, some implementations (e.g. jdk) allow signatures with incorrect ASN encodings assuming that the signature is otherwise valid.",
+    "PointDuplication" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.",
+    "WeakHash" : "The security strength of the hash function used in this signature is weaker than then strength of the EC parameters. Such choices are disallowed in FIPS PUB 186-4 Section 6.1.1. However, it is unclear whether a library should reject such parameter choices."
+  },
+  "numberOfTests" : 1525,
+  "header" : [],
+  "testGroups" : [
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e",
+        "wx" : "2927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838",
+        "wy" : "0c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKSexBRK64+3c/kZ4KBKLrSkDJpkZ\n9whgacjE32xzKDjHeHlk6qwA5ZIfsUmKYPRgZ2az2WhQAVWNGpdOc0FRPg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "signature malleability",
+          "msg" : "313233343030",
+          "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802204cd60b855d442f5b3c7b11eb6c4e0ae7525fe710fab9aa7c77a67f79e6fadd76",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "Legacy:ASN encoding of s misses leading 0",
+          "msg" : "313233343030",
+          "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180220b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingZero"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "valid",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30814502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 5,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "30460281202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 6,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802812100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 7,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3082004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 8,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3047028200202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180282002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 10,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304502212ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3045021f2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022200b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3085010000004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304a028501000000202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180285010000002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "308901000000000000004502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304e02890100000000000000202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304e02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18028901000000000000002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30847fffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "304902847fffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802847fffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3084ffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "30490284ffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180284ffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3085ffffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "304a0285ffffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180285ffffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3088ffffffffffffffff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "304d0288ffffffffffffffff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180288ffffffffffffffff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30ff02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "304502ff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802ff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "304502802ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18028000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "3047000002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304a498177304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30492500304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3047304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304a222549817702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30492224250002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304d222202202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180004deadbeef022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304a02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182226498177022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1822252500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182223022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304daa00bb00cd00304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304baa02aabb304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304d2228aa00bb00cd0002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304b2226aa02aabb02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304d02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182229aa00bb00cd00022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304b02202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182227aa02aabb022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3049228002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182280022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3080314502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3049228003202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e182280032100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2e4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2f4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "314502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "324502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "ff4502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "30493001023044202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "3044202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 79,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db05000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "308002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "3047300002202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "3047304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "302202202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "306802202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "removing integer",
+          "msg" : "313233343030",
+          "sig" : "3023022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "302402022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "302302202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "304702222ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022300b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3047022200002ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 95,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180223000000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 96,
+          "comment" : "appending unused 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180000022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "304702222ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "304702202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022300b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "30250281022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180281",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "30250500022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304500202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304501202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304503202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304504202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045ff202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18002100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18012100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18032100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18042100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18ff2100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "30250200022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "302402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "3049222402012b021fa3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "304902202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1822250201000220b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "3045022029a3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022102b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e98022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b491568475b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3044021f2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3044021fa3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022000b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180220b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "30460221ff2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "304602202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180222ff00b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "3026090180022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "302502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18090180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "302502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18020100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30460221012ba3a8bd6b94d5ed80a6d9d1190a436ebccc0833490686deac8635bcb9bf5369022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30460221ff2ba3a8bf6b94d5eb80a6d9d1190a436f42fe12d7fad749d4c512a036c0f908c7022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30450220d45c5741946b2a137f59262ee6f5bc91001af27a5e1117a64733950642a3d1e8022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3046022100d45c5740946b2a147f59262ee6f5bc90bd01ed280528b62b3aed5fc93f06f739022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30460221fed45c5742946b2a127f59262ee6f5bc914333f7ccb6f979215379ca434640ac97022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30460221012ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3046022100d45c5741946b2a137f59262ee6f5bc91001af27a5e1117a64733950642a3d1e8022100b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022101b329f478a2bbd0a6c384ee1493b1f518276e0e4a5375928d6fcd160c11cb6d2c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180220b329f47aa2bbd0a4c384ee1493b1f518ada018ef05465583885980861905228a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180221ff4cd60b865d442f5a3c7b11eb6c4e0ae79578ec6353a20bf783ecb4b6ea97b825",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e180221fe4cd60b875d442f593c7b11eb6c4e0ae7d891f1b5ac8a6d729032e9f3ee3492d4",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304502202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e18022101b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304402202ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1802204cd60b865d442f5a3c7b11eb6c4e0ae79578ec6353a20bf783ecb4b6ea97b825",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 145,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 146,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 147,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 148,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 149,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 150,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 151,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 153,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 154,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 155,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 156,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 157,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 158,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 159,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 160,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 161,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020101090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 162,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 163,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 165,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 166,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 167,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 168,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 169,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 170,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30080201ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 171,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 172,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 173,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 176,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 177,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 178,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 179,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 180,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 181,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 182,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325500201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 183,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 184,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 185,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 186,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 187,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 188,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 189,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 190,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 191,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325520201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 192,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 193,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 194,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 195,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 196,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 197,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 199,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 200,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 202,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 203,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 204,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 205,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 206,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 207,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000001000000000000000000000001000000000000000000000000020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff00000001000000000000000000000001000000000000000000000000020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 209,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100ffffffff000000010000000000000000000000010000000000000000000000000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 211,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 212,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 213,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 214,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100ffffffff00000001000000000000000000000001000000000000000000000000022100ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 215,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100ffffffff00000001000000000000000000000001000000000000000000000000090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 216,
+          "comment" : "Edge case for Shamir multiplication",
+          "msg" : "3639383139",
+          "sig" : "3044022064a1aab5000d0e804f3e2fc02bdee9be8ff312334e2ba16d11547c97711c898e02206af015971cc30be6d1a206d4e013e0997772a2f91d73286ffd683b9bb2cf4f1b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "special case hash",
+          "msg" : "343236343739373234",
+          "sig" : "3044022016aea964a2f6506d6f78c81c91fc7e8bded7d397738448de1e19a0ec580bf2660220252cd762130c6667cfe8b7bc47d27d78391e8e80c578d1cd38c3ff033be928e9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "special case hash",
+          "msg" : "37313338363834383931",
+          "sig" : "30450221009cc98be2347d469bf476dfc26b9b733df2d26d6ef524af917c665baccb23c8820220093496459effe2d8d70727b82462f61d0ec1b7847929d10ea631dacb16b56c32",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "special case hash",
+          "msg" : "3130333539333331363638",
+          "sig" : "3044022073b3c90ecd390028058164524dde892703dce3dea0d53fa8093999f07ab8aa4302202f67b0b8e20636695bb7d8bf0a651c802ed25a395387b5f4188c0c4075c88634",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "special case hash",
+          "msg" : "33393439343031323135",
+          "sig" : "3046022100bfab3098252847b328fadf2f89b95c851a7f0eb390763378f37e90119d5ba3dd022100bdd64e234e832b1067c2d058ccb44d978195ccebb65c2aaf1e2da9b8b4987e3b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "special case hash",
+          "msg" : "31333434323933303739",
+          "sig" : "30440220204a9784074b246d8bf8bf04a4ceb1c1f1c9aaab168b1596d17093c5cd21d2cd022051cce41670636783dc06a759c8847868a406c2506fe17975582fe648d1d88b52",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "special case hash",
+          "msg" : "33373036323131373132",
+          "sig" : "3046022100ed66dc34f551ac82f63d4aa4f81fe2cb0031a91d1314f835027bca0f1ceeaa0302210099ca123aa09b13cd194a422e18d5fda167623c3f6e5d4d6abb8953d67c0c48c7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "special case hash",
+          "msg" : "333433363838373132",
+          "sig" : "30450220060b700bef665c68899d44f2356a578d126b062023ccc3c056bf0f60a237012b0221008d186c027832965f4fcc78a3366ca95dedbb410cbef3f26d6be5d581c11d3610",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "special case hash",
+          "msg" : "31333531353330333730",
+          "sig" : "30460221009f6adfe8d5eb5b2c24d7aa7934b6cf29c93ea76cd313c9132bb0c8e38c96831d022100b26a9c9e40e55ee0890c944cf271756c906a33e66b5bd15e051593883b5e9902",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "special case hash",
+          "msg" : "36353533323033313236",
+          "sig" : "3045022100a1af03ca91677b673ad2f33615e56174a1abf6da168cebfa8868f4ba273f16b7022020aa73ffe48afa6435cd258b173d0c2377d69022e7d098d75caf24c8c5e06b1c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "special case hash",
+          "msg" : "31353634333436363033",
+          "sig" : "3045022100fdc70602766f8eed11a6c99a71c973d5659355507b843da6e327a28c11893db902203df5349688a085b137b1eacf456a9e9e0f6d15ec0078ca60a7f83f2b10d21350",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "special case hash",
+          "msg" : "34343239353339313137",
+          "sig" : "3046022100b516a314f2fce530d6537f6a6c49966c23456f63c643cf8e0dc738f7b876e675022100d39ffd033c92b6d717dd536fbc5efdf1967c4bd80954479ba66b0120cd16fff2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "special case hash",
+          "msg" : "3130393533323631333531",
+          "sig" : "304402203b2cbf046eac45842ecb7984d475831582717bebb6492fd0a485c101e29ff0a802204c9b7b47a98b0f82de512bc9313aaf51701099cac5f76e68c8595fc1c1d99258",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "special case hash",
+          "msg" : "35393837333530303431",
+          "sig" : "3044022030c87d35e636f540841f14af54e2f9edd79d0312cfa1ab656c3fb15bfde48dcf022047c15a5a82d24b75c85a692bd6ecafeb71409ede23efd08e0db9abf6340677ed",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "special case hash",
+          "msg" : "33343633303036383738",
+          "sig" : "3044022038686ff0fda2cef6bc43b58cfe6647b9e2e8176d168dec3c68ff262113760f520220067ec3b651f422669601662167fa8717e976e2db5e6a4cf7c2ddabb3fde9d67d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 231,
+          "comment" : "special case hash",
+          "msg" : "39383137333230323837",
+          "sig" : "3044022044a3e23bf314f2b344fc25c7f2de8b6af3e17d27f5ee844b225985ab6e2775cf02202d48e223205e98041ddc87be532abed584f0411f5729500493c9cc3f4dd15e86",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 232,
+          "comment" : "special case hash",
+          "msg" : "33323232303431303436",
+          "sig" : "304402202ded5b7ec8e90e7bf11f967a3d95110c41b99db3b5aa8d330eb9d638781688e902207d5792c53628155e1bfc46fb1a67e3088de049c328ae1f44ec69238a009808f9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 233,
+          "comment" : "special case hash",
+          "msg" : "36363636333037313034",
+          "sig" : "3046022100bdae7bcb580bf335efd3bc3d31870f923eaccafcd40ec2f605976f15137d8b8f022100f6dfa12f19e525270b0106eecfe257499f373a4fb318994f24838122ce7ec3c7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 234,
+          "comment" : "special case hash",
+          "msg" : "31303335393531383938",
+          "sig" : "3045022050f9c4f0cd6940e162720957ffff513799209b78596956d21ece251c2401f1c6022100d7033a0a787d338e889defaaabb106b95a4355e411a59c32aa5167dfab244726",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 235,
+          "comment" : "special case hash",
+          "msg" : "31383436353937313935",
+          "sig" : "3045022100f612820687604fa01906066a378d67540982e29575d019aabe90924ead5c860d02203f9367702dd7dd4f75ea98afd20e328a1a99f4857b316525328230ce294b0fef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 236,
+          "comment" : "special case hash",
+          "msg" : "33313336303436313839",
+          "sig" : "30460221009505e407657d6e8bc93db5da7aa6f5081f61980c1949f56b0f2f507da5782a7a022100c60d31904e3669738ffbeccab6c3656c08e0ed5cb92b3cfa5e7f71784f9c5021",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 237,
+          "comment" : "special case hash",
+          "msg" : "32363633373834323534",
+          "sig" : "3046022100bbd16fbbb656b6d0d83e6a7787cd691b08735aed371732723e1c68a40404517d0221009d8e35dba96028b7787d91315be675877d2d097be5e8ee34560e3e7fd25c0f00",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 238,
+          "comment" : "special case hash",
+          "msg" : "31363532313030353234",
+          "sig" : "304402202ec9760122db98fd06ea76848d35a6da442d2ceef7559a30cf57c61e92df327e02207ab271da90859479701fccf86e462ee3393fb6814c27b760c4963625c0a19878",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 239,
+          "comment" : "special case hash",
+          "msg" : "35373438303831363936",
+          "sig" : "3044022054e76b7683b6650baa6a7fc49b1c51eed9ba9dd463221f7a4f1005a89fe00c5902202ea076886c773eb937ec1cc8374b7915cfd11b1c1ae1166152f2f7806a31c8fd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 240,
+          "comment" : "special case hash",
+          "msg" : "36333433393133343638",
+          "sig" : "304402205291deaf24659ffbbce6e3c26f6021097a74abdbb69be4fb10419c0c496c9466022065d6fcf336d27cc7cdb982bb4e4ecef5827f84742f29f10abf83469270a03dc3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 241,
+          "comment" : "special case hash",
+          "msg" : "31353431313033353938",
+          "sig" : "30450220207a3241812d75d947419dc58efb05e8003b33fc17eb50f9d15166a88479f107022100cdee749f2e492b213ce80b32d0574f62f1c5d70793cf55e382d5caadf7592767",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 242,
+          "comment" : "special case hash",
+          "msg" : "3130343738353830313238",
+          "sig" : "304502206554e49f82a855204328ac94913bf01bbe84437a355a0a37c0dee3cf81aa7728022100aea00de2507ddaf5c94e1e126980d3df16250a2eaebc8be486effe7f22b4f929",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 243,
+          "comment" : "special case hash",
+          "msg" : "3130353336323835353638",
+          "sig" : "3046022100a54c5062648339d2bff06f71c88216c26c6e19b4d80a8c602990ac82707efdfc022100e99bbe7fcfafae3e69fd016777517aa01056317f467ad09aff09be73c9731b0d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 244,
+          "comment" : "special case hash",
+          "msg" : "393533393034313035",
+          "sig" : "3045022100975bd7157a8d363b309f1f444012b1a1d23096593133e71b4ca8b059cff37eaf02207faa7a28b1c822baa241793f2abc930bd4c69840fe090f2aacc46786bf919622",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 245,
+          "comment" : "special case hash",
+          "msg" : "393738383438303339",
+          "sig" : "304402205694a6f84b8f875c276afd2ebcfe4d61de9ec90305afb1357b95b3e0da43885e02200dffad9ffd0b757d8051dec02ebdf70d8ee2dc5c7870c0823b6ccc7c679cbaa4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 246,
+          "comment" : "special case hash",
+          "msg" : "33363130363732343432",
+          "sig" : "3045022100a0c30e8026fdb2b4b4968a27d16a6d08f7098f1a98d21620d7454ba9790f1ba602205e470453a8a399f15baf463f9deceb53acc5ca64459149688bd2760c65424339",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 247,
+          "comment" : "special case hash",
+          "msg" : "31303534323430373035",
+          "sig" : "30440220614ea84acf736527dd73602cd4bb4eea1dfebebd5ad8aca52aa0228cf7b99a880220737cc85f5f2d2f60d1b8183f3ed490e4de14368e96a9482c2a4dd193195c902f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 248,
+          "comment" : "special case hash",
+          "msg" : "35313734343438313937",
+          "sig" : "3045022100bead6734ebe44b810d3fb2ea00b1732945377338febfd439a8d74dfbd0f942fa02206bb18eae36616a7d3cad35919fd21a8af4bbe7a10f73b3e036a46b103ef56e2a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 249,
+          "comment" : "special case hash",
+          "msg" : "31393637353631323531",
+          "sig" : "30440220499625479e161dacd4db9d9ce64854c98d922cbf212703e9654fae182df9bad2022042c177cf37b8193a0131108d97819edd9439936028864ac195b64fca76d9d693",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 250,
+          "comment" : "special case hash",
+          "msg" : "33343437323533333433",
+          "sig" : "3045022008f16b8093a8fb4d66a2c8065b541b3d31e3bfe694f6b89c50fb1aaa6ff6c9b20221009d6455e2d5d1779748573b611cb95d4a21f967410399b39b535ba3e5af81ca2e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 251,
+          "comment" : "special case hash",
+          "msg" : "333638323634333138",
+          "sig" : "3046022100be26231b6191658a19dd72ddb99ed8f8c579b6938d19bce8eed8dc2b338cb5f8022100e1d9a32ee56cffed37f0f22b2dcb57d5c943c14f79694a03b9c5e96952575c89",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 252,
+          "comment" : "special case hash",
+          "msg" : "33323631313938363038",
+          "sig" : "3045022015e76880898316b16204ac920a02d58045f36a229d4aa4f812638c455abe0443022100e74d357d3fcb5c8c5337bd6aba4178b455ca10e226e13f9638196506a1939123",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 253,
+          "comment" : "special case hash",
+          "msg" : "39363738373831303934",
+          "sig" : "30440220352ecb53f8df2c503a45f9846fc28d1d31e6307d3ddbffc1132315cc07f16dad02201348dfa9c482c558e1d05c5242ca1c39436726ecd28258b1899792887dd0a3c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 254,
+          "comment" : "special case hash",
+          "msg" : "34393538383233383233",
+          "sig" : "304402204a40801a7e606ba78a0da9882ab23c7677b8642349ed3d652c5bfa5f2a9558fb02203a49b64848d682ef7f605f2832f7384bdc24ed2925825bf8ea77dc5981725782",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 255,
+          "comment" : "special case hash",
+          "msg" : "383234363337383337",
+          "sig" : "3045022100eacc5e1a8304a74d2be412b078924b3bb3511bac855c05c9e5e9e44df3d61e9602207451cd8e18d6ed1885dd827714847f96ec4bb0ed4c36ce9808db8f714204f6d1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 256,
+          "comment" : "special case hash",
+          "msg" : "3131303230383333373736",
+          "sig" : "304502202f7a5e9e5771d424f30f67fdab61e8ce4f8cd1214882adb65f7de94c31577052022100ac4e69808345809b44acb0b2bd889175fb75dd050c5a449ab9528f8f78daa10c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 257,
+          "comment" : "special case hash",
+          "msg" : "313333383731363438",
+          "sig" : "3045022100ffcda40f792ce4d93e7e0f0e95e1a2147dddd7f6487621c30a03d710b3300219022079938b55f8a17f7ed7ba9ade8f2065a1fa77618f0b67add8d58c422c2453a49a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 258,
+          "comment" : "special case hash",
+          "msg" : "333232313434313632",
+          "sig" : "304602210081f2359c4faba6b53d3e8c8c3fcc16a948350f7ab3a588b28c17603a431e39a8022100cd6f6a5cc3b55ead0ff695d06c6860b509e46d99fccefb9f7f9e101857f74300",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 259,
+          "comment" : "special case hash",
+          "msg" : "3130363836363535353436",
+          "sig" : "3045022100dfc8bf520445cbb8ee1596fb073ea283ea130251a6fdffa5c3f5f2aaf75ca8080220048e33efce147c9dd92823640e338e68bfd7d0dc7a4905b3a7ac711e577e90e7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 260,
+          "comment" : "special case hash",
+          "msg" : "3632313535323436",
+          "sig" : "3046022100ad019f74c6941d20efda70b46c53db166503a0e393e932f688227688ba6a576202210093320eb7ca0710255346bdbb3102cdcf7964ef2e0988e712bc05efe16c199345",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 261,
+          "comment" : "special case hash",
+          "msg" : "37303330383138373734",
+          "sig" : "3046022100ac8096842e8add68c34e78ce11dd71e4b54316bd3ebf7fffdeb7bd5a3ebc1883022100f5ca2f4f23d674502d4caf85d187215d36e3ce9f0ce219709f21a3aac003b7a8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 262,
+          "comment" : "special case hash",
+          "msg" : "35393234353233373434",
+          "sig" : "30440220677b2d3a59b18a5ff939b70ea002250889ddcd7b7b9d776854b4943693fb92f702206b4ba856ade7677bf30307b21f3ccda35d2f63aee81efd0bab6972cc0795db55",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 263,
+          "comment" : "special case hash",
+          "msg" : "31343935353836363231",
+          "sig" : "30450220479e1ded14bcaed0379ba8e1b73d3115d84d31d4b7c30e1f05e1fc0d5957cfb0022100918f79e35b3d89487cf634a4f05b2e0c30857ca879f97c771e877027355b2443",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 264,
+          "comment" : "special case hash",
+          "msg" : "34303035333134343036",
+          "sig" : "3044022043dfccd0edb9e280d9a58f01164d55c3d711e14b12ac5cf3b64840ead512a0a302201dbe33fa8ba84533cd5c4934365b3442ca1174899b78ef9a3199f49584389772",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 265,
+          "comment" : "special case hash",
+          "msg" : "33303936343537353132",
+          "sig" : "304402205b09ab637bd4caf0f4c7c7e4bca592fea20e9087c259d26a38bb4085f0bbff11022045b7eb467b6748af618e9d80d6fdcd6aa24964e5a13f885bca8101de08eb0d75",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 266,
+          "comment" : "special case hash",
+          "msg" : "32373834303235363230",
+          "sig" : "304502205e9b1c5a028070df5728c5c8af9b74e0667afa570a6cfa0114a5039ed15ee06f022100b1360907e2d9785ead362bb8d7bd661b6c29eeffd3c5037744edaeb9ad990c20",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 267,
+          "comment" : "special case hash",
+          "msg" : "32363138373837343138",
+          "sig" : "304502200671a0a85c2b72d54a2fb0990e34538b4890050f5a5712f6d1a7a5fb8578f32e022100db1846bab6b7361479ab9c3285ca41291808f27fd5bd4fdac720e5854713694c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 268,
+          "comment" : "special case hash",
+          "msg" : "31363432363235323632",
+          "sig" : "304402207673f8526748446477dbbb0590a45492c5d7d69859d301abbaedb35b2095103a02203dc70ddf9c6b524d886bed9e6af02e0e4dec0d417a414fed3807ef4422913d7c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 269,
+          "comment" : "special case hash",
+          "msg" : "36383234313839343336",
+          "sig" : "304402207f085441070ecd2bb21285089ebb1aa6450d1a06c36d3ff39dfd657a796d12b50220249712012029870a2459d18d47da9aa492a5e6cb4b2d8dafa9e4c5c54a2b9a8b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 270,
+          "comment" : "special case hash",
+          "msg" : "343834323435343235",
+          "sig" : "3046022100914c67fb61dd1e27c867398ea7322d5ab76df04bc5aa6683a8e0f30a5d287348022100fa07474031481dda4953e3ac1959ee8cea7e66ec412b38d6c96d28f6d37304ea",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6ff0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9",
+        "wx" : "0b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6f",
+        "wy" : "0f0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b838ff44e5bc177bf21189d0766082fc9d843226887fc9760371100b7ee20a6ff0c9d75bfba7b31a6bca1974496eeb56de357071955d83c4b1badaa0b21832e9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEuDj/ROW8F3vyEYnQdmCC/J2EMiaIf8l2\nA3EQC37iCm/wyddb+6ezGmvKGXRJbutW3jVwcZVdg8Sxutqgshgy6Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 271,
+          "comment" : "signature malleability",
+          "msg" : "313233343030",
+          "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365022100900e75ad233fcc908509dbff5922647db37c21f4afd3203ae8dc4ae7794b0f87",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 272,
+          "comment" : "Legacy:ASN encoding of r misses leading 0",
+          "msg" : "313233343030",
+          "sig" : "30440220813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingZero"
+          ]
+        },
+        {
+          "tcId" : 273,
+          "comment" : "valid",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 274,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "308145022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 275,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "304602812100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 276,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650281206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 277,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "30820045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 278,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "30470282002100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 279,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365028200206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 280,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 281,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3044022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 282,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3045022200813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 283,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3045022000813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 284,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502216ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 285,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365021f6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 286,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "30850100000045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 287,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304a0285010000002100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 288,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304a022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365028501000000206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 289,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3089010000000000000045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 290,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304e028901000000000000002100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 291,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "304e022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502890100000000000000206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 292,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "30847fffffff022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 293,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "304902847fffffff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 294,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502847fffffff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 295,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3084ffffffff022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 296,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "30490284ffffffff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 297,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650284ffffffff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 298,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "3085ffffffffff022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 299,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "304a0285ffffffffff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 300,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "304a022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650285ffffffffff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 301,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3088ffffffffffffffff022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 302,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "304d0288ffffffffffffffff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 303,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "304d022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650288ffffffffffffffff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 304,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "30ff022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 305,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "304502ff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 306,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502ff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 307,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 308,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "3045028000813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 309,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502806ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 310,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 311,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 312,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 313,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "30470000022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 314,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 315,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 316,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304a4981773045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 317,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304925003045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 318,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "30473045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 319,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304a2226498177022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 320,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304922252500022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 321,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304d2223022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650004deadbeef02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 322,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304a022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365222549817702206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 323,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323652224250002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 324,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "304d022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365222202206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 325,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304daa00bb00cd003045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 326,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304baa02aabb3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 327,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304d2229aa00bb00cd00022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 328,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304b2227aa02aabb022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 329,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304d022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323652228aa00bb00cd0002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 330,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "304b022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323652226aa02aabb02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 331,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 332,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "30803045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 333,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "30492280022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365000002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 334,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365228002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 335,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "30803145022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 336,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "30492280032100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365000002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 337,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365228003206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 338,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 339,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2e45022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 340,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2f45022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 341,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3145022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 342,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3245022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 343,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "ff45022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 344,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 345,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "304930010230442100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 346,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "3044022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 347,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "30442100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 348,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 349,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 350,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba05000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 351,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 352,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 353,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "3080022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 354,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "30473000022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 355,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 356,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "30473045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 357,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "3023022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 358,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "3067022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 359,
+          "comment" : "removing integer",
+          "msg" : "313233343030",
+          "sig" : "302202206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 360,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "30230202206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 361,
+          "comment" : "lonely integer tag",
+          "msg" : "313233343030",
+          "sig" : "3024022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 362,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3047022300813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365000002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 363,
+          "comment" : "appending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502226ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 364,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "30470223000000813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 365,
+          "comment" : "prepending 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365022200006ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : [
+            "BER"
+          ]
+        },
+        {
+          "tcId" : 366,
+          "comment" : "appending unused 0's to integer",
+          "msg" : "313233343030",
+          "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365000002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 367,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "3047022300813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365050002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 368,
+          "comment" : "appending null value to integer",
+          "msg" : "313233343030",
+          "sig" : "3047022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502226ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 369,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "3024028102206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 370,
+          "comment" : "truncated length of integer",
+          "msg" : "313233343030",
+          "sig" : "3025022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650281",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 371,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "3024050002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 372,
+          "comment" : "Replacing integer with NULL",
+          "msg" : "313233343030",
+          "sig" : "3025022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 373,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045002100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 374,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045012100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 375,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045032100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 376,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045042100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 377,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045ff2100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 378,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236500206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 379,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236501206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 380,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236503206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 381,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236504206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 382,
+          "comment" : "changing tag value of integer",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365ff206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 383,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "3024020002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 384,
+          "comment" : "dropping value of integer",
+          "msg" : "313233343030",
+          "sig" : "3025022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650200",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 385,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "304922250201000220813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 386,
+          "comment" : "using composition for integer",
+          "msg" : "313233343030",
+          "sig" : "3049022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365222402016f021ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 387,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "3045022102813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 388,
+          "comment" : "modify first byte of integer",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206df18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 389,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323e502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 390,
+          "comment" : "modify last byte of integer",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb313a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 391,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3044022000813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832302206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 392,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "30440220813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 393,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3044022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365021f6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 394,
+          "comment" : "truncate integer",
+          "msg" : "313233343030",
+          "sig" : "3044022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365021ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 395,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "30460222ff00813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 396,
+          "comment" : "leading ff in integer",
+          "msg" : "313233343030",
+          "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650221ff6ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 397,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "302509018002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 398,
+          "comment" : "infinity",
+          "msg" : "313233343030",
+          "sig" : "3026022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365090180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 399,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "302502010002206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 400,
+          "comment" : "replacing integer with zero",
+          "msg" : "313233343030",
+          "sig" : "3026022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365020100",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 401,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3045022101813ef79ccefa9a56f7ba805f0e478583b90deabca4b05c4574e49b5899b964a602206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 402,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30440220813ef79ccefa9a56f7ba805f0e47858643b030ef461f1bcdf53fde3ef94ce22402206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 403,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30450221ff7ec10863310565a908457fa0f1b87a7b01a0f22a0a9843f64aedc334367cdc9b02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 404,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304402207ec10863310565a908457fa0f1b87a79bc4fcf10b9e0e4320ac021c106b31ddc02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 405,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "30450221fe7ec10863310565a908457fa0f1b87a7c46f215435b4fa3ba8b1b64a766469b5a02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 406,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3045022101813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc983236502206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 407,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "304402207ec10863310565a908457fa0f1b87a7b01a0f22a0a9843f64aedc334367cdc9b02206ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 408,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650221016ff18a52dcc0336f7af62400a6dd9b7fc1e197d8aebe203c96c87232272172fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 409,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650221ff6ff18a52dcc0336f7af62400a6dd9b824c83de0b502cdfc51723b51886b4f079",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 410,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3045022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650220900e75ad233fcc908509dbff5922647ef8cd450e008a7fff2909ec5aa914ce46",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 411,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650221fe900e75ad233fcc908509dbff592264803e1e68275141dfc369378dcdd8de8d05",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 412,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc98323650221016ff18a52dcc0336f7af62400a6dd9b810732baf1ff758000d6f613a556eb31ba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 413,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "3046022100813ef79ccefa9a56f7ba805f0e478584fe5f0dd5f567bc09b5123ccbc9832365022100900e75ad233fcc908509dbff5922647ef8cd450e008a7fff2909ec5aa914ce46",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 414,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 415,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020100020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 416,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201000201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 417,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 418,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 419,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 420,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 421,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020100022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 422,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020100090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 423,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 424,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 425,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201010201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 426,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 427,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 428,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 429,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 430,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 431,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3008020101090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 432,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 433,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 434,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30060201ff0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 435,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 436,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 437,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 438,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 439,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30260201ff022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 440,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "30080201ff090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 441,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 442,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 443,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641410201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 444,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 445,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 446,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 447,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 448,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 449,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 450,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 451,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 452,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641400201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 453,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 454,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 455,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 456,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 457,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 458,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 459,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 460,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 461,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641420201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 462,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 463,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 464,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 465,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 466,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 467,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 468,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 469,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 470,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f0201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 471,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 472,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 473,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 474,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 475,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 476,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 477,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30020100",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 478,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30020101",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 479,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc300201ff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 480,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 481,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 482,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 483,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 484,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 485,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "3028022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30090380fe01",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 486,
+          "comment" : "Edge case for Shamir multiplication",
+          "msg" : "3235353835",
+          "sig" : "3045022100dd1b7d09a7bd8218961034a39a87fecf5314f00c4d25eb58a07ac85e85eab516022035138c401ef8d3493d65c9002fe62b43aee568731b744548358996d9cc427e06",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 487,
+          "comment" : "special case hash",
+          "msg" : "343236343739373234",
+          "sig" : "304502210095c29267d972a043d955224546222bba343fc1d4db0fec262a33ac61305696ae02206edfe96713aed56f8a28a6653f57e0b829712e5eddc67f34682b24f0676b2640",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 488,
+          "comment" : "special case hash",
+          "msg" : "37313338363834383931",
+          "sig" : "3045022028f94a894e92024699e345fe66971e3edcd050023386135ab3939d550898fb25022100cd69c1a42be05a6ee1270c821479251e134c21858d800bda6f4e98b37196238e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 489,
+          "comment" : "special case hash",
+          "msg" : "3130333539333331363638",
+          "sig" : "3046022100be26b18f9549f89f411a9b52536b15aa270b84548d0e859a1952a27af1a77ac60221008f3e2b05632fc33715572af9124681113f2b84325b80154c044a544dc1a8fa12",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 490,
+          "comment" : "special case hash",
+          "msg" : "33393439343031323135",
+          "sig" : "3046022100b1a4b1478e65cc3eafdf225d1298b43f2da19e4bcff7eacc0a2e98cd4b74b114022100e8655ce1cfb33ebd30af8ce8e8ae4d6f7b50cd3e22af51bf69e0a2851760d52b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 491,
+          "comment" : "special case hash",
+          "msg" : "31333434323933303739",
+          "sig" : "30440220325332021261f1bd18f2712aa1e2252da23796da8a4b1ff6ea18cafec7e171f2022040b4f5e287ee61fc3c804186982360891eaa35c75f05a43ecd48b35d984a6648",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 492,
+          "comment" : "special case hash",
+          "msg" : "33373036323131373132",
+          "sig" : "3046022100a23ad18d8fc66d81af0903890cbd453a554cb04cdc1a8ca7f7f78e5367ed88a0022100dc1c14d31e3fb158b73c764268c8b55579734a7e2a2c9b5ee5d9d0144ef652eb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 493,
+          "comment" : "special case hash",
+          "msg" : "333433363838373132",
+          "sig" : "304502202bdea41cda63a2d14bf47353bd20880a690901de7cd6e3cc6d8ed5ba0cdb1091022100c31599433036064073835b1e3eba8335a650c8fd786f94fe235ad7d41dc94c7a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 494,
+          "comment" : "special case hash",
+          "msg" : "31333531353330333730",
+          "sig" : "3046022100d7cd76ec01c1b1079eba9e2aa2a397243c4758c98a1ba0b7404a340b9b00ced6022100ca8affe1e626dd192174c2937b15bc48f77b5bdfe01f073a8aeaf7f24dc6c85b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 495,
+          "comment" : "special case hash",
+          "msg" : "36353533323033313236",
+          "sig" : "3045022100a872c744d936db21a10c361dd5c9063355f84902219652f6fc56dc95a7139d960220400df7575d9756210e9ccc77162c6b593c7746cfb48ac263c42750b421ef4bb9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 496,
+          "comment" : "special case hash",
+          "msg" : "31353634333436363033",
+          "sig" : "30460221009fa9afe07752da10b36d3afcd0fe44bfc40244d75203599cf8f5047fa3453854022100af1f583fec4040ae7e68c968d2bb4b494eec3a33edc7c0ccf95f7f75bc2569c7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 497,
+          "comment" : "special case hash",
+          "msg" : "34343239353339313137",
+          "sig" : "3045022100885640384d0d910efb177b46be6c3dc5cac81f0b88c3190bb6b5f99c2641f2050220738ed9bff116306d9caa0f8fc608be243e0b567779d8dab03e8e19d553f1dc8e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 498,
+          "comment" : "special case hash",
+          "msg" : "3130393533323631333531",
+          "sig" : "304502202d051f91c5a9d440c5676985710483bc4f1a6c611b10c95a2ff0363d90c2a45802210092206b19045a41a797cc2f3ac30de9518165e96d5b86341ecb3bcff231b3fd65",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 499,
+          "comment" : "special case hash",
+          "msg" : "35393837333530303431",
+          "sig" : "3045022100f3ac2523967482f53d508522712d583f4379cd824101ff635ea0935117baa54f022027f10812227397e02cea96fb0e680761636dab2b080d1fc5d11685cbe8500cfe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 500,
+          "comment" : "special case hash",
+          "msg" : "33343633303036383738",
+          "sig" : "304602210096447cf68c3ab7266ed7447de3ac52fed7cc08cbdfea391c18a9b8ab370bc913022100f0a1878b2c53f16e70fe377a5e9c6e86f18ae480a22bb499f5b32e7109c07385",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 501,
+          "comment" : "special case hash",
+          "msg" : "39383137333230323837",
+          "sig" : "30450220530a0832b691da0b5619a0b11de6877f3c0971baaa68ed122758c29caaf46b7202210093761bb0a14ccf9f15b4b9ce73c6ec700bd015b8cb1cfac56837f4463f53074e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 502,
+          "comment" : "special case hash",
+          "msg" : "33323232303431303436",
+          "sig" : "30460221009c54c25500bde0b92d72d6ec483dc2482f3654294ca74de796b681255ed58a77022100988bac394a90ad89ce360984c0c149dcbd2684bb64498ace90bcf6b6af1c170e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 503,
+          "comment" : "special case hash",
+          "msg" : "36363636333037313034",
+          "sig" : "3045022100e7909d41439e2f6af29136c7348ca2641a2b070d5b64f91ea9da7070c7a2618b022042d782f132fa1d36c2c88ba27c3d678d80184a5d1eccac7501f0b47e3d205008",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 504,
+          "comment" : "special case hash",
+          "msg" : "31303335393531383938",
+          "sig" : "304502205924873209593135a4c3da7bb381227f8a4b6aa9f34fe5bb7f8fbc131a039ffe022100e0e44ee4bbe370155bf0bbdec265bf9fe31c0746faab446de62e3631eacd111f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 505,
+          "comment" : "special case hash",
+          "msg" : "31383436353937313935",
+          "sig" : "3045022100eeb692c9b262969b231c38b5a7f60649e0c875cd64df88f33aa571fa3d29ab0e0220218b3a1eb06379c2c18cf51b06430786d1c64cd2d24c9b232b23e5bac7989acd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 506,
+          "comment" : "special case hash",
+          "msg" : "33313336303436313839",
+          "sig" : "3045022100a40034177f36091c2b653684a0e3eb5d4bff18e4d09f664c2800e7cafda1daf802203a3ec29853704e52031c58927a800a968353adc3d973beba9172cbbeab4dd149",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 507,
+          "comment" : "special case hash",
+          "msg" : "32363633373834323534",
+          "sig" : "3046022100b5d795cc75cea5c434fa4185180cd6bd21223f3d5a86da6670d71d95680dadbf022100ab1b277ef5ffe134460835e3d1402461ba104cb50b16f397fdc7a9abfefef280",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 508,
+          "comment" : "special case hash",
+          "msg" : "31363532313030353234",
+          "sig" : "3044022007dc2478d43c1232a4595608c64426c35510051a631ae6a5a6eb1161e57e42e102204a59ea0fdb72d12165cea3bf1ca86ba97517bd188db3dbd21a5a157850021984",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 509,
+          "comment" : "special case hash",
+          "msg" : "35373438303831363936",
+          "sig" : "3046022100ddd20c4a05596ca868b558839fce9f6511ddd83d1ccb53f82e5269d559a01552022100a46e8cb8d626cf6c00ddedc3b5da7e613ac376445ee260743f06f79054c7d42a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 510,
+          "comment" : "special case hash",
+          "msg" : "36333433393133343638",
+          "sig" : "30450221009cde6e0ede0a003f02fda0a01b59facfe5dec063318f279ce2de7a9b1062f7b702202886a5b8c679bdf8224c66f908fd6205492cb70b0068d46ae4f33a4149b12a52",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 511,
+          "comment" : "special case hash",
+          "msg" : "31353431313033353938",
+          "sig" : "3046022100c5771016d0dd6357143c89f684cd740423502554c0c59aa8c99584f1ff38f609022100ab4bfa0bb88ab99791b9b3ab9c4b02bd2a57ae8dde50b9064063fcf85315cfe5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 512,
+          "comment" : "special case hash",
+          "msg" : "3130343738353830313238",
+          "sig" : "3045022100a24ebc0ec224bd67ae397cbe6fa37b3125adbd34891abe2d7c7356921916dfe6022034f6eb6374731bbbafc4924fb8b0bdcdda49456d724cdae6178d87014cb53d8c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 513,
+          "comment" : "special case hash",
+          "msg" : "3130353336323835353638",
+          "sig" : "304502202557d64a7aee2e0931c012e4fea1cd3a2c334edae68cdeb7158caf21b68e5a2402210080f93244956ffdc568c77d12684f7f004fa92da7e60ae94a1b98c422e23eda34",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 514,
+          "comment" : "special case hash",
+          "msg" : "393533393034313035",
+          "sig" : "3046022100c4f2eccbb6a24350c8466450b9d61b207ee359e037b3dcedb42a3f2e6dd6aeb5022100cd9c394a65d0aa322e391eb76b2a1a687f8620a88adef3a01eb8e4fb05b6477a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 515,
+          "comment" : "special case hash",
+          "msg" : "393738383438303339",
+          "sig" : "3046022100eff04781c9cbcd162d0a25a6e2ebcca43506c523385cb515d49ea38a1b12fcad022100ea5328ce6b36e56ab87acb0dcfea498bcec1bba86a065268f6eff3c41c4b0c9c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 516,
+          "comment" : "special case hash",
+          "msg" : "33363130363732343432",
+          "sig" : "3046022100f58b4e3110a64bf1b5db97639ee0e5a9c8dfa49dc59b679891f520fdf0584c87022100d32701ae777511624c1f8abbf02b248b04e7a9eb27938f524f3e8828ba40164a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 517,
+          "comment" : "special case hash",
+          "msg" : "31303534323430373035",
+          "sig" : "3045022100f8abecaa4f0c502de4bf5903d48417f786bf92e8ad72fec0bd7fcb7800c0bbe302204c7f9e231076a30b7ae36b0cebe69ccef1cd194f7cce93a5588fd6814f437c0e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 518,
+          "comment" : "special case hash",
+          "msg" : "35313734343438313937",
+          "sig" : "304402205d5b38bd37ad498b2227a633268a8cca879a5c7c94a4e416bd0a614d09e606d2022012b8d664ea9991062ecbb834e58400e25c46007af84f6007d7f1685443269afe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 519,
+          "comment" : "special case hash",
+          "msg" : "31393637353631323531",
+          "sig" : "304402200c1cd9fe4034f086a2b52d65b9d3834d72aebe7f33dfe8f976da82648177d8e3022013105782e3d0cfe85c2778dec1a848b27ac0ae071aa6da341a9553a946b41e59",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 520,
+          "comment" : "special case hash",
+          "msg" : "33343437323533333433",
+          "sig" : "3045022100ae7935fb96ff246b7b5d5662870d1ba587b03d6e1360baf47988b5c02ccc1a5b02205f00c323272083782d4a59f2dfd65e49de0693627016900ef7e61428056664b3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 521,
+          "comment" : "special case hash",
+          "msg" : "333638323634333138",
+          "sig" : "3045022000a134b5c6ccbcefd4c882b945baeb4933444172795fa6796aae149067547098022100a991b9efa2db276feae1c115c140770901839d87e60e7ec45a2b81cf3b437be6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 522,
+          "comment" : "special case hash",
+          "msg" : "33323631313938363038",
+          "sig" : "304502202e4721363ad3992c139e5a1c26395d2c2d777824aa24fde075e0d7381171309d0221008bf083b6bbe71ecff22baed087d5a77eaeaf726bf14ace2c03fd6e37ba6c26f2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 523,
+          "comment" : "special case hash",
+          "msg" : "39363738373831303934",
+          "sig" : "304502206852e9d3cd9fe373c2d504877967d365ab1456707b6817a042864694e1960ccf022100f9b4d815ebd4cf77847b37952334d05b2045cb398d4c21ba207922a7a4714d84",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 524,
+          "comment" : "special case hash",
+          "msg" : "34393538383233383233",
+          "sig" : "30440220188a8c5648dc79eace158cf886c62b5468f05fd95f03a7635c5b4c31f09af4c5022036361a0b571a00c6cd5e686ccbfcfa703c4f97e48938346d0c103fdc76dc5867",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 525,
+          "comment" : "special case hash",
+          "msg" : "383234363337383337",
+          "sig" : "3045022100a74f1fb9a8263f62fc4416a5b7d584f4206f3996bb91f6fc8e73b9e92bad0e1302206815032e8c7d76c3ab06a86f33249ce9940148cb36d1f417c2e992e801afa3fa",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 526,
+          "comment" : "special case hash",
+          "msg" : "3131303230383333373736",
+          "sig" : "3045022007244865b72ff37e62e3146f0dc14682badd7197799135f0b00ade7671742bfe022100f27f3ddc7124b1b58579573a835650e7a8bad5eeb96e9da215cd7bf9a2a039ed",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 527,
+          "comment" : "special case hash",
+          "msg" : "313333383731363438",
+          "sig" : "3045022100da7fdd05b5badabd619d805c4ee7d9a84f84ddd5cf9c5bf4d4338140d689ef08022028f1cf4fa1c3c5862cfa149c0013cf5fe6cf5076cae000511063e7de25bb38e5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 528,
+          "comment" : "special case hash",
+          "msg" : "333232313434313632",
+          "sig" : "3046022100d3027c656f6d4fdfd8ede22093e3c303b0133c340d615e7756f6253aea927238022100f6510f9f371b31068d68bfeeaa720eb9bbdc8040145fcf88d4e0b58de0777d2a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 529,
+          "comment" : "special case hash",
+          "msg" : "3130363836363535353436",
+          "sig" : "304402200bf6c0188dc9571cd0e21eecac5fbb19d2434988e9cc10244593ef3a98099f6902204864a562661f9221ec88e3dd0bc2f6e27ac128c30cc1a80f79ec670a22b042ee",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 530,
+          "comment" : "special case hash",
+          "msg" : "3632313535323436",
+          "sig" : "3045022100ae459640d5d1179be47a47fa538e16d94ddea5585e7a244804a51742c686443a02206c8e30e530a634fae80b3ceb062978b39edbe19777e0a24553b68886181fd897",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 531,
+          "comment" : "special case hash",
+          "msg" : "37303330383138373734",
+          "sig" : "304402201cf3517ba3bf2ab8b9ead4ebb6e866cb88a1deacb6a785d3b63b483ca02ac4950220249a798b73606f55f5f1c70de67cb1a0cff95d7dc50b3a617df861bad3c6b1c9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 532,
+          "comment" : "special case hash",
+          "msg" : "35393234353233373434",
+          "sig" : "3045022100e69b5238265ea35d77e4dd172288d8cea19810a10292617d5976519dc5757cb802204b03c5bc47e826bdb27328abd38d3056d77476b2130f3df6ec4891af08ba1e29",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 533,
+          "comment" : "special case hash",
+          "msg" : "31343935353836363231",
+          "sig" : "304402205f9d7d7c870d085fc1d49fff69e4a275812800d2cf8973e7325866cb40fa2b6f02206d1f5491d9f717a597a15fd540406486d76a44697b3f0d9d6dcef6669f8a0a56",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 534,
+          "comment" : "special case hash",
+          "msg" : "34303035333134343036",
+          "sig" : "304402200a7d5b1959f71df9f817146ee49bd5c89b431e7993e2fdecab6858957da685ae02200f8aad2d254690bdc13f34a4fec44a02fd745a422df05ccbb54635a8b86b9609",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 535,
+          "comment" : "special case hash",
+          "msg" : "33303936343537353132",
+          "sig" : "3044022079e88bf576b74bc07ca142395fda28f03d3d5e640b0b4ff0752c6d94cd553408022032cea05bd2d706c8f6036a507e2ab7766004f0904e2e5c5862749c0073245d6a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 536,
+          "comment" : "special case hash",
+          "msg" : "32373834303235363230",
+          "sig" : "30450221009d54e037a00212b377bc8874798b8da080564bbdf7e07591b861285809d01488022018b4e557667a82bd95965f0706f81a29243fbdd86968a7ebeb43069db3b18c7f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 537,
+          "comment" : "special case hash",
+          "msg" : "32363138373837343138",
+          "sig" : "304402202664f1ffa982fedbcc7cab1b8bc6e2cb420218d2a6077ad08e591ba9feab33bd022049f5c7cb515e83872a3d41b4cdb85f242ad9d61a5bfc01debfbb52c6c84ba728",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 538,
+          "comment" : "special case hash",
+          "msg" : "31363432363235323632",
+          "sig" : "304502205827518344844fd6a7de73cbb0a6befdea7b13d2dee4475317f0f18ffc81524b022100b0a334b1f4b774a5a289f553224d286d239ef8a90929ed2d91423e024eb7fa66",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 539,
+          "comment" : "special case hash",
+          "msg" : "36383234313839343336",
+          "sig" : "304602210097ab19bd139cac319325869218b1bce111875d63fb12098a04b0cd59b6fdd3a3022100bce26315c5dbc7b8cfc31425a9b89bccea7aa9477d711a4d377f833dcc28f820",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 540,
+          "comment" : "special case hash",
+          "msg" : "343834323435343235",
+          "sig" : "3044022052c683144e44119ae2013749d4964ef67509278f6d38ba869adcfa69970e123d02203479910167408f45bda420a626ec9c4ec711c1274be092198b4187c018b562ca",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bc75e84bc85176a30559db843e5fbb3628526120dae9227de017934ab10526c0eccb6c30f0781acb6b7036ee6dd2b9b7d77c963247266e43",
+        "wx" : "0bc75e84bc85176a30559db843e5fbb3628526120dae9227de017934a",
+        "wy" : "0b10526c0eccb6c30f0781acb6b7036ee6dd2b9b7d77c963247266e43"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004bc75e84bc85176a30559db843e5fbb3628526120dae9227de017934ab10526c0eccb6c30f0781acb6b7036ee6dd2b9b7d77c963247266e43",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEvHXoS8hRdqMFWduEPl+7NihSYSDa6SJ9\n4BeTSrEFJsDsy2ww8Hgay2twNu5t0rm313yWMkcmbkM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 541,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "4d7367",
+          "sig" : "3030020f00e95c1f470fc1ec22d6baa3a3d5c1021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 542,
+          "comment" : "r too large",
+          "msg" : "4d7367",
+          "sig" : "303e021d00fffffffffffffffffffffffffffffffefffffffffffffffffffffffe021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3a",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040bfefa69d4970f77e259099b01bbb869248e4859ed20c3d50dd83081e1f47eb82f10f71166816ad2a533b341883f9cdd88567c0fa9b2312e",
+        "wx" : "0bfefa69d4970f77e259099b01bbb869248e4859ed20c3d50dd83081",
+        "wy" : "0e1f47eb82f10f71166816ad2a533b341883f9cdd88567c0fa9b2312e"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00040bfefa69d4970f77e259099b01bbb869248e4859ed20c3d50dd83081e1f47eb82f10f71166816ad2a533b341883f9cdd88567c0fa9b2312e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEC/76adSXD3fiWQmbAbu4aSSOSFntIMPV\nDdgwgeH0frgvEPcRZoFq0qUzs0GIP5zdiFZ8D6myMS4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 543,
+          "comment" : "r,s are large",
+          "msg" : "4d7367",
+          "sig" : "303e021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3c021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0469627a4c0957fc76df1698c37b9c6efedf0768f9797da84749a6b6070ba90da74515d002f3ecc6fbc7619c66b962db97f361933fb2f9b943",
+        "wx" : "69627a4c0957fc76df1698c37b9c6efedf0768f9797da84749a6b607",
+        "wy" : "0ba90da74515d002f3ecc6fbc7619c66b962db97f361933fb2f9b943"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000469627a4c0957fc76df1698c37b9c6efedf0768f9797da84749a6b6070ba90da74515d002f3ecc6fbc7619c66b962db97f361933fb2f9b943",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEaWJ6TAlX/HbfFpjDe5xu/t8HaPl5fahH\nSaa2BwupDadFFdAC8+zG+8dhnGa5YtuX82GTP7L5uUM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 544,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "4d7367",
+          "sig" : "303c021c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff021c3d5052691b8dc89debad360466f2a39e82e8ae2aefb77c3c92ad7cd1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046514a1d0aa8f7f516efee552d0948f6c44caa2f5b8489910753c7418e126a8aadd213f6f38e27b16b92fd6a9d01b10ec6db10f2ae7e24c31",
+        "wx" : "6514a1d0aa8f7f516efee552d0948f6c44caa2f5b8489910753c7418",
+        "wy" : "0e126a8aadd213f6f38e27b16b92fd6a9d01b10ec6db10f2ae7e24c31"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00046514a1d0aa8f7f516efee552d0948f6c44caa2f5b8489910753c7418e126a8aadd213f6f38e27b16b92fd6a9d01b10ec6db10f2ae7e24c31",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEZRSh0KqPf1Fu/uVS0JSPbETKovW4SJkQ\ndTx0GOEmqKrdIT9vOOJ7Frkv1qnQGxDsbbEPKufiTDE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 545,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "4d7367",
+          "sig" : "303d021c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff021d00bf19ab4d3ebf5a1a49d765909308daa88c2b7be3969db552ea30562b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045a1fd06d0c6ae74cd08b8a94b01357c110eb9304ce58b93de7b02e002c824eca4386c5fcfba682f9dcd88b99f5fe90f6c620c50d420509e4",
+        "wx" : "5a1fd06d0c6ae74cd08b8a94b01357c110eb9304ce58b93de7b02e00",
+        "wy" : "2c824eca4386c5fcfba682f9dcd88b99f5fe90f6c620c50d420509e4"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00045a1fd06d0c6ae74cd08b8a94b01357c110eb9304ce58b93de7b02e002c824eca4386c5fcfba682f9dcd88b99f5fe90f6c620c50d420509e4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEWh/QbQxq50zQi4qUsBNXwRDrkwTOWLk9\n57AuACyCTspDhsX8+6aC+dzYi5n1/pD2xiDFDUIFCeQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 546,
+          "comment" : "small r and s",
+          "msg" : "4d7367",
+          "sig" : "3006020103020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0499c273370404653c768c5d638e9209e81ebb03e132a3669a3c23c8c7c068e0572c09a968eaa4b92781fe0aa7303099b374b9c2fa5da05834",
+        "wx" : "099c273370404653c768c5d638e9209e81ebb03e132a3669a3c23c8c7",
+        "wy" : "0c068e0572c09a968eaa4b92781fe0aa7303099b374b9c2fa5da05834"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000499c273370404653c768c5d638e9209e81ebb03e132a3669a3c23c8c7c068e0572c09a968eaa4b92781fe0aa7303099b374b9c2fa5da05834",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEmcJzNwQEZTx2jF1jjpIJ6B67A+Eyo2aa\nPCPIx8Bo4FcsCalo6qS5J4H+CqcwMJmzdLnC+l2gWDQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 547,
+          "comment" : "small r and s",
+          "msg" : "4d7367",
+          "sig" : "3006020103020103",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bed2146c8c62ddc31327c7f33d3a8feb2c3ef8e4414fe55f3545144536e288f69784e2a2d1ba748b0b3e07ffc31af07fd42c519a5c485d63",
+        "wx" : "0bed2146c8c62ddc31327c7f33d3a8feb2c3ef8e4414fe55f35451445",
+        "wy" : "36e288f69784e2a2d1ba748b0b3e07ffc31af07fd42c519a5c485d63"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004bed2146c8c62ddc31327c7f33d3a8feb2c3ef8e4414fe55f3545144536e288f69784e2a2d1ba748b0b3e07ffc31af07fd42c519a5c485d63",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEvtIUbIxi3cMTJ8fzPTqP6yw++ORBT+Vf\nNUUURTbiiPaXhOKi0bp0iws+B//DGvB/1CxRmlxIXWM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 548,
+          "comment" : "small r and s",
+          "msg" : "4d7367",
+          "sig" : "3006020103020104",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 549,
+          "comment" : "r is larger than n",
+          "msg" : "4d7367",
+          "sig" : "3022021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a40020104",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a83321aecea4a1fca6be1add7a93ab679ef165ee24999eedf50a2dca00d1bb5122c539d17669e7b805d1ef3c83f81b991af0c380429fad85",
+        "wx" : "0a83321aecea4a1fca6be1add7a93ab679ef165ee24999eedf50a2dca",
+        "wy" : "0d1bb5122c539d17669e7b805d1ef3c83f81b991af0c380429fad85"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004a83321aecea4a1fca6be1add7a93ab679ef165ee24999eedf50a2dca00d1bb5122c539d17669e7b805d1ef3c83f81b991af0c380429fad85",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEqDMhrs6kofymvhrdepOrZ57xZe4kmZ7t\n9QotygDRu1EixTnRdmnnuAXR7zyD+BuZGvDDgEKfrYU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 550,
+          "comment" : "s is larger than n",
+          "msg" : "4d7367",
+          "sig" : "3022020103021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c6f00c4",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0448aea0b4cbcbeba311d7d90a3a68c3af32d9aad3ea9eccb7573599a6dd5e2021bd903228e2d46faa9dd294a0793f81ad352f448e3e3b5ddc",
+        "wx" : "48aea0b4cbcbeba311d7d90a3a68c3af32d9aad3ea9eccb7573599a6",
+        "wy" : "0dd5e2021bd903228e2d46faa9dd294a0793f81ad352f448e3e3b5ddc"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000448aea0b4cbcbeba311d7d90a3a68c3af32d9aad3ea9eccb7573599a6dd5e2021bd903228e2d46faa9dd294a0793f81ad352f448e3e3b5ddc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAESK6gtMvL66MR19kKOmjDrzLZqtPqnsy3\nVzWZpt1eICG9kDIo4tRvqp3SlKB5P4GtNS9Ejj47Xdw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 551,
+          "comment" : "small r and s^-1",
+          "msg" : "4d7367",
+          "sig" : "302302020100021d00c993264c993264c993264c99326411d2e55b3214a8d67528812a55ab",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043b11713a7fd7aa516ba2529ad28ac4ce9b6ddc0d9bf4be5fd235b81c139277b772527cd2e857d212402f80d7f3c237e4730509012fab97c6",
+        "wx" : "3b11713a7fd7aa516ba2529ad28ac4ce9b6ddc0d9bf4be5fd235b81c",
+        "wy" : "139277b772527cd2e857d212402f80d7f3c237e4730509012fab97c6"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00043b11713a7fd7aa516ba2529ad28ac4ce9b6ddc0d9bf4be5fd235b81c139277b772527cd2e857d212402f80d7f3c237e4730509012fab97c6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEOxFxOn/XqlFrolKa0orEzptt3A2b9L5f\n0jW4HBOSd7dyUnzS6FfSEkAvgNfzwjfkcwUJAS+rl8Y=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 552,
+          "comment" : "smallish r and s^-1",
+          "msg" : "4d7367",
+          "sig" : "302702072d9b4d347952cc021c3e85d56474b5c55fbe86608442a84b2bf093b7d75f53a47250e1c70c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047b1bf2b11f43f76f623270499a325450a8933590c09e132b83147033109485d2a2850aa0ed457e8de70398265ea27cbea2a53cc3a95db998",
+        "wx" : "7b1bf2b11f43f76f623270499a325450a8933590c09e132b83147033",
+        "wy" : "109485d2a2850aa0ed457e8de70398265ea27cbea2a53cc3a95db998"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00047b1bf2b11f43f76f623270499a325450a8933590c09e132b83147033109485d2a2850aa0ed457e8de70398265ea27cbea2a53cc3a95db998",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEexvysR9D929iMnBJmjJUUKiTNZDAnhMr\ngxRwMxCUhdKihQqg7UV+jecDmCZeony+oqU8w6lduZg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 553,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "4d7367",
+          "sig" : "302d020d1033e67e37b32b445580bf4efb021c02fd02fd02fd02fd02fd02fd02fd0043a4fd2da317247308c74dc6b8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0438243cf4e5484660564484d497ef2afe528f28fda8c3697d10750a77b5c87a1b3090e592f047d1ba44b8f3ba1ec076fd8e8115c6fd671f22",
+        "wx" : "38243cf4e5484660564484d497ef2afe528f28fda8c3697d10750a77",
+        "wy" : "0b5c87a1b3090e592f047d1ba44b8f3ba1ec076fd8e8115c6fd671f22"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000438243cf4e5484660564484d497ef2afe528f28fda8c3697d10750a77b5c87a1b3090e592f047d1ba44b8f3ba1ec076fd8e8115c6fd671f22",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEOCQ89OVIRmBWRITUl+8q/lKPKP2ow2l9\nEHUKd7XIehswkOWS8EfRukS487oewHb9joEVxv1nHyI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 554,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "4d7367",
+          "sig" : "302302020100021d00d05434abacd859ed74185e75b751c6d9f60c7921dacfbb8e19cdba8e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043147173105159d5a66542e891dc5c1e831c390d76556a21f46b3f15ed9680c6eaa4136100e87bfa6592b8f059ae1450cf10980691049a5e5",
+        "wx" : "3147173105159d5a66542e891dc5c1e831c390d76556a21f46b3f15e",
+        "wy" : "0d9680c6eaa4136100e87bfa6592b8f059ae1450cf10980691049a5e5"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00043147173105159d5a66542e891dc5c1e831c390d76556a21f46b3f15ed9680c6eaa4136100e87bfa6592b8f059ae1450cf10980691049a5e5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEMUcXMQUVnVpmVC6JHcXB6DHDkNdlVqIf\nRrPxXtloDG6qQTYQDoe/plkrjwWa4UUM8QmAaRBJpeU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 555,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "4d7367",
+          "sig" : "302e020d062522bbd3ecbe7c39e93e7c24021d00d05434abacd859ed74185e75b751c6d9f60c7921dacfbb8e19cdba8e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0476152d39df62cbd76319de7d35bdb1a3994baf4f5ca5fc984e95021cb1b3a380622ebbd266413ef0ba15d121afc5d2d51ba7979da29c4007",
+        "wx" : "76152d39df62cbd76319de7d35bdb1a3994baf4f5ca5fc984e95021c",
+        "wy" : "0b1b3a380622ebbd266413ef0ba15d121afc5d2d51ba7979da29c4007"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000476152d39df62cbd76319de7d35bdb1a3994baf4f5ca5fc984e95021cb1b3a380622ebbd266413ef0ba15d121afc5d2d51ba7979da29c4007",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEdhUtOd9iy9djGd59Nb2xo5lLr09cpfyY\nTpUCHLGzo4BiLrvSZkE+8LoV0SGvxdLVG6eXnaKcQAc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 556,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "4d7367",
+          "sig" : "303d021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c29bd021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048e7d4044d0aece8c814fd2e4a540d6ce14e3e92498a4f6d2760170e0e7edb0b8e72157b42682787a43f78632b5bc8d5ca084b08ddd742902",
+        "wx" : "08e7d4044d0aece8c814fd2e4a540d6ce14e3e92498a4f6d2760170e0",
+        "wy" : "0e7edb0b8e72157b42682787a43f78632b5bc8d5ca084b08ddd742902"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00048e7d4044d0aece8c814fd2e4a540d6ce14e3e92498a4f6d2760170e0e7edb0b8e72157b42682787a43f78632b5bc8d5ca084b08ddd742902",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEjn1ARNCuzoyBT9LkpUDWzhTj6SSYpPbS\ndgFw4OftsLjnIVe0JoJ4ekP3hjK1vI1coISwjd10KQI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 557,
+          "comment" : "s == 1",
+          "msg" : "4d7367",
+          "sig" : "3021021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 558,
+          "comment" : "s == 0",
+          "msg" : "4d7367",
+          "sig" : "3021021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0486eef598040bc7ceb7cf07f0ee72e4e947dc120023bf552c0b484170bffa633852e6c6e2a41d61cf223a86b6ecfcf682cca8c38794925f4d",
+        "wx" : "086eef598040bc7ceb7cf07f0ee72e4e947dc120023bf552c0b484170",
+        "wy" : "0bffa633852e6c6e2a41d61cf223a86b6ecfcf682cca8c38794925f4d"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000486eef598040bc7ceb7cf07f0ee72e4e947dc120023bf552c0b484170bffa633852e6c6e2a41d61cf223a86b6ecfcf682cca8c38794925f4d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEhu71mAQLx863zwfw7nLk6UfcEgAjv1Us\nC0hBcL/6YzhS5sbipB1hzyI6hrbs/PaCzKjDh5SSX00=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 559,
+          "comment" : "point at infinity during verify",
+          "msg" : "4d7367",
+          "sig" : "303c021c7fffffffffffffffffffffffffff8b51705c781f09ee94a2ae2e151e021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b7fd6e16896127b2d4341fb41c4274797b739bd5b756c4737f8fee55eb01d914e4dfdf606e9198bf03dfc7734abd0fadd4193ed0515f3cd7",
+        "wx" : "0b7fd6e16896127b2d4341fb41c4274797b739bd5b756c4737f8fee55",
+        "wy" : "0eb01d914e4dfdf606e9198bf03dfc7734abd0fadd4193ed0515f3cd7"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b7fd6e16896127b2d4341fb41c4274797b739bd5b756c4737f8fee55eb01d914e4dfdf606e9198bf03dfc7734abd0fadd4193ed0515f3cd7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEt/1uFolhJ7LUNB+0HEJ0eXtzm9W3VsRz\nf4/uVesB2RTk399gbpGYvwPfx3NKvQ+t1Bk+0FFfPNc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 560,
+          "comment" : "u1 == 1",
+          "msg" : "4d7367",
+          "sig" : "303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c0b041f884d648cc345e4600078eb790708ccad576d4abe3c943aa328",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04161fe96bac1f151e0565a7b2c3c089d79df5d298e7ca48964fdd86574c6247dbd41f235a149736122e96e6735054dac58c234031153fb82f",
+        "wx" : "161fe96bac1f151e0565a7b2c3c089d79df5d298e7ca48964fdd8657",
+        "wy" : "4c6247dbd41f235a149736122e96e6735054dac58c234031153fb82f"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004161fe96bac1f151e0565a7b2c3c089d79df5d298e7ca48964fdd86574c6247dbd41f235a149736122e96e6735054dac58c234031153fb82f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEFh/pa6wfFR4FZaeyw8CJ15310pjnykiW\nT92GV0xiR9vUHyNaFJc2Ei6W5nNQVNrFjCNAMRU/uC8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 561,
+          "comment" : "u1 == n - 1",
+          "msg" : "4d7367",
+          "sig" : "303d021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021d00f4fbe077b29b733cba1b9fff87139d9bd7ec42e6a6926b08c8218715",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04882dff239cdf9a0812caaf384ade87497131e6fb8ca184c27f9fb4d60032fbe649751ab5bc386f09dcab56a6df6563480a4bec5ed72298b1",
+        "wx" : "0882dff239cdf9a0812caaf384ade87497131e6fb8ca184c27f9fb4d6",
+        "wy" : "32fbe649751ab5bc386f09dcab56a6df6563480a4bec5ed72298b1"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004882dff239cdf9a0812caaf384ade87497131e6fb8ca184c27f9fb4d60032fbe649751ab5bc386f09dcab56a6df6563480a4bec5ed72298b1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEiC3/I5zfmggSyq84St6HSXEx5vuMoYTC\nf5+01gAy++ZJdRq1vDhvCdyrVqbfZWNICkvsXtcimLE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 562,
+          "comment" : "u2 == 1",
+          "msg" : "4d7367",
+          "sig" : "303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cd8f963a1694e83241a7172f782b211786bc47b31ce5cad6abc865c19310d590a09e146c08fe443df76ec22ea95a62a90c7acef1127e4d71",
+        "wx" : "0cd8f963a1694e83241a7172f782b211786bc47b31ce5cad6abc865c1",
+        "wy" : "09310d590a09e146c08fe443df76ec22ea95a62a90c7acef1127e4d71"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004cd8f963a1694e83241a7172f782b211786bc47b31ce5cad6abc865c19310d590a09e146c08fe443df76ec22ea95a62a90c7acef1127e4d71",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEzY+WOhaU6DJBpxcveCshF4a8R7Mc5crW\nq8hlwZMQ1ZCgnhRsCP5EPfduwi6pWmKpDHrO8RJ+TXE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 563,
+          "comment" : "u2 == n - 1",
+          "msg" : "4d7367",
+          "sig" : "303d021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021d00aaaaaaaaaaaaaaaaaaaaaaaaaaaa0f17407b4ad40d3e1b8392e81c29",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b564852ecb065e52db2b0cf9acdd3499b9b0045331a78e27aab12d173bccbf5375fc99604883f23b83f46f3e3c36c46dda56227b771497ed",
+        "wx" : "0b564852ecb065e52db2b0cf9acdd3499b9b0045331a78e27aab12d17",
+        "wy" : "3bccbf5375fc99604883f23b83f46f3e3c36c46dda56227b771497ed"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b564852ecb065e52db2b0cf9acdd3499b9b0045331a78e27aab12d173bccbf5375fc99604883f23b83f46f3e3c36c46dda56227b771497ed",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEtWSFLssGXlLbKwz5rN00mbmwBFMxp44n\nqrEtFzvMv1N1/JlgSIPyO4P0bz48NsRt2lYie3cUl+0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 564,
+          "comment" : "edge case for u1",
+          "msg" : "4d7367",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00ae56b52d6f218441174c2000284de21998bf849bdc570597c450fd36",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c6780fe52e48d890a9ece0d4eda2ab9ad7c18cbfa9fd747215fc2cd14463d417b8b15383290a12cc3d5f1a5d24df2607bf73dbc6e61d0dc8",
+        "wx" : "0c6780fe52e48d890a9ece0d4eda2ab9ad7c18cbfa9fd747215fc2cd1",
+        "wy" : "4463d417b8b15383290a12cc3d5f1a5d24df2607bf73dbc6e61d0dc8"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004c6780fe52e48d890a9ece0d4eda2ab9ad7c18cbfa9fd747215fc2cd14463d417b8b15383290a12cc3d5f1a5d24df2607bf73dbc6e61d0dc8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAExngP5S5I2JCp7ODU7aKrmtfBjL+p/XRy\nFfws0URj1Be4sVODKQoSzD1fGl0k3yYHv3PbxuYdDcg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 565,
+          "comment" : "edge case for u1",
+          "msg" : "4d7367",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00abadccc5cafa7d90d9f20d1f3fbe18241e38cd6e99821135a808feb6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04111285cc943890d01f0ef496a0ab99c5f879127941193717ecfec0ad35cea32862b4985580a4277d6062210ff42a529eb878b901183743de",
+        "wx" : "111285cc943890d01f0ef496a0ab99c5f879127941193717ecfec0ad",
+        "wy" : "35cea32862b4985580a4277d6062210ff42a529eb878b901183743de"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004111285cc943890d01f0ef496a0ab99c5f879127941193717ecfec0ad35cea32862b4985580a4277d6062210ff42a529eb878b901183743de",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEERKFzJQ4kNAfDvSWoKuZxfh5EnlBGTcX\n7P7ArTXOoyhitJhVgKQnfWBiIQ/0KlKeuHi5ARg3Q94=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 566,
+          "comment" : "edge case for u1",
+          "msg" : "4d7367",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00ab7051d7e48b9f852e258cbede1f26aedc2e862ca9f63c7314c6ab13",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a70cf775ed0c3c6bc97e7c43e855c635d0b594011e59df12a8e28ee148da113b01454696dbe066c0368055000a92ad1018f1f6f2ccf8a26b",
+        "wx" : "0a70cf775ed0c3c6bc97e7c43e855c635d0b594011e59df12a8e28ee1",
+        "wy" : "48da113b01454696dbe066c0368055000a92ad1018f1f6f2ccf8a26b"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004a70cf775ed0c3c6bc97e7c43e855c635d0b594011e59df12a8e28ee148da113b01454696dbe066c0368055000a92ad1018f1f6f2ccf8a26b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEpwz3de0MPGvJfnxD6FXGNdC1lAEeWd8S\nqOKO4UjaETsBRUaW2+BmwDaAVQAKkq0QGPH28sz4oms=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 567,
+          "comment" : "edge case for u1",
+          "msg" : "4d7367",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c787b89e72cafea47f4fbe077b29b056875feb7f770106528bbee29a6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a2e42035b4fe096ecacb4b1a06565af64cfcc2b04f0178bc100732da00f2f50ea59d2a39ccee2eb5eca216c4748da18d783907963f5cb3e4",
+        "wx" : "0a2e42035b4fe096ecacb4b1a06565af64cfcc2b04f0178bc100732da",
+        "wy" : "0f2f50ea59d2a39ccee2eb5eca216c4748da18d783907963f5cb3e4"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004a2e42035b4fe096ecacb4b1a06565af64cfcc2b04f0178bc100732da00f2f50ea59d2a39ccee2eb5eca216c4748da18d783907963f5cb3e4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEouQgNbT+CW7Ky0saBlZa9kz8wrBPAXi8\nEAcy2gDy9Q6lnSo5zO4uteyiFsR0jaGNeDkHlj9cs+Q=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 568,
+          "comment" : "edge case for u1",
+          "msg" : "4d7367",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00b89e72cafea47f4fbe077b29b73323565b6713b98090e2a4a8d86ed5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f378963f5ef0893b5f89d58f73e9f5de692843637b8d9f301a775374f53e8627b42d2d6d540c0e238d4abc9576b7f202a97774e2ee9e58a6",
+        "wx" : "0f378963f5ef0893b5f89d58f73e9f5de692843637b8d9f301a775374",
+        "wy" : "0f53e8627b42d2d6d540c0e238d4abc9576b7f202a97774e2ee9e58a6"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004f378963f5ef0893b5f89d58f73e9f5de692843637b8d9f301a775374f53e8627b42d2d6d540c0e238d4abc9576b7f202a97774e2ee9e58a6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE83iWP17wiTtfidWPc+n13mkoQ2N7jZ8w\nGndTdPU+hie0LS1tVAwOI41KvJV2t/ICqXd04u6eWKY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 569,
+          "comment" : "edge case for u1",
+          "msg" : "4d7367",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c713ce595fd48fe9f7c0ef6536e673009d6153734ed449c03f554b36d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044be8786cf0e12e300b6180bcfb839a857f8aa99dc77e5496d28fcd122b5b9a274964449662fa65f8af0ca1f5d28c70a5c0a85d638cb8affe",
+        "wx" : "4be8786cf0e12e300b6180bcfb839a857f8aa99dc77e5496d28fcd12",
+        "wy" : "2b5b9a274964449662fa65f8af0ca1f5d28c70a5c0a85d638cb8affe"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00044be8786cf0e12e300b6180bcfb839a857f8aa99dc77e5496d28fcd122b5b9a274964449662fa65f8af0ca1f5d28c70a5c0a85d638cb8affe",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAES+h4bPDhLjALYYC8+4OahX+KqZ3HflSW\n0o/NEitbmidJZESWYvpl+K8MofXSjHClwKhdY4y4r/4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 570,
+          "comment" : "edge case for u1",
+          "msg" : "4d7367",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c2cafea47f4fbe077b29b733cba1b7743297b2de81ca9398d72ec3df5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049e5daf1bfea28ce039a8b95a08a1335034dd4cb8fe62ab5c8083ad27fea54bd62f2cf6ba7be2bb2823f73ebb3bb31fa3cf6638c11ecee8bb",
+        "wx" : "09e5daf1bfea28ce039a8b95a08a1335034dd4cb8fe62ab5c8083ad27",
+        "wy" : "0fea54bd62f2cf6ba7be2bb2823f73ebb3bb31fa3cf6638c11ecee8bb"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00049e5daf1bfea28ce039a8b95a08a1335034dd4cb8fe62ab5c8083ad27fea54bd62f2cf6ba7be2bb2823f73ebb3bb31fa3cf6638c11ecee8bb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEnl2vG/6ijOA5qLlaCKEzUDTdTLj+Yqtc\ngIOtJ/6lS9YvLPa6e+K7KCP3Prs7sx+jz2Y4wR7O6Ls=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 571,
+          "comment" : "edge case for u1",
+          "msg" : "4d7367",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00a8d4a569486f3ddf7459efffebd8259614592df025b1a6797a33aba2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04846285e0d1d15f80a2377a48d5233c61f8cff74cd6236fff2936c006647b6c0e9bc8a250f8b3b3b2565dd0b65f394db2a5c58bf271ca4a22",
+        "wx" : "0846285e0d1d15f80a2377a48d5233c61f8cff74cd6236fff2936c006",
+        "wy" : "647b6c0e9bc8a250f8b3b3b2565dd0b65f394db2a5c58bf271ca4a22"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004846285e0d1d15f80a2377a48d5233c61f8cff74cd6236fff2936c006647b6c0e9bc8a250f8b3b3b2565dd0b65f394db2a5c58bf271ca4a22",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEhGKF4NHRX4CiN3pI1SM8YfjP90zWI2//\nKTbABmR7bA6byKJQ+LOzslZd0LZfOU2ypcWL8nHKSiI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 572,
+          "comment" : "edge case for u1",
+          "msg" : "4d7367",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c51a94ad290de7bbee8b3dfffd7b1348947f96ba2378623ad980b2d07",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ecc1ba5ba1d685c1c4a15146145b376f2e42950c3876f2160988a68ab58542baf7fa542fbab77cc7c93ff28969e37cf0f3ffbfe7fe02dc51",
+        "wx" : "0ecc1ba5ba1d685c1c4a15146145b376f2e42950c3876f2160988a68a",
+        "wy" : "0b58542baf7fa542fbab77cc7c93ff28969e37cf0f3ffbfe7fe02dc51"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004ecc1ba5ba1d685c1c4a15146145b376f2e42950c3876f2160988a68ab58542baf7fa542fbab77cc7c93ff28969e37cf0f3ffbfe7fe02dc51",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE7MG6W6HWhcHEoVFGFFs3by5ClQw4dvIW\nCYimirWFQrr3+lQvurd8x8k/8olp43zw8/+/5/4C3FE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 573,
+          "comment" : "edge case for u1",
+          "msg" : "4d7367",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00fa7df03bd94db99e5d0dcfffc3895a1f5c5299925d37ca27123ed8a9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042cbb210b5f6d09ade8b6566e9e4f122caa0032798cff8fa3cb36a10c7978044ce07d958601f3e49323313780325ed39eb4ed130b4c70551a",
+        "wx" : "2cbb210b5f6d09ade8b6566e9e4f122caa0032798cff8fa3cb36a10c",
+        "wy" : "7978044ce07d958601f3e49323313780325ed39eb4ed130b4c70551a"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00042cbb210b5f6d09ade8b6566e9e4f122caa0032798cff8fa3cb36a10c7978044ce07d958601f3e49323313780325ed39eb4ed130b4c70551a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAELLshC19tCa3otlZunk8SLKoAMnmM/4+j\nyzahDHl4BEzgfZWGAfPkkyMxN4AyXtOetO0TC0xwVRo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 574,
+          "comment" : "edge case for u1",
+          "msg" : "4d7367",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00d5b828ebf245cfc29712c65f6f0f1ea8de73bb355ee9b2dc38916aa8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04754108bb613336db9886cba90f5e4a9e4efd26cad603ff650164350de335eb473aa5c19e9d28d3100879d90c733e0f8436fef59a5afa1016",
+        "wx" : "754108bb613336db9886cba90f5e4a9e4efd26cad603ff650164350d",
+        "wy" : "0e335eb473aa5c19e9d28d3100879d90c733e0f8436fef59a5afa1016"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004754108bb613336db9886cba90f5e4a9e4efd26cad603ff650164350de335eb473aa5c19e9d28d3100879d90c733e0f8436fef59a5afa1016",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEdUEIu2EzNtuYhsupD15Knk79JsrWA/9l\nAWQ1DeM160c6pcGenSjTEAh52QxzPg+ENv71mlr6EBY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 575,
+          "comment" : "edge case for u2",
+          "msg" : "4d7367",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c7fffffffffffffffffffffffffffb2364ae85014b149b86c741eb8be",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04273c311cc5ce74d1d01b017188472de04b38b72d34abfae6266679b4ec64adcb3ca5247cf598a9cb66cc22e79e31f1661c781c1871fcc1a3",
+        "wx" : "273c311cc5ce74d1d01b017188472de04b38b72d34abfae6266679b4",
+        "wy" : "0ec64adcb3ca5247cf598a9cb66cc22e79e31f1661c781c1871fcc1a3"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004273c311cc5ce74d1d01b017188472de04b38b72d34abfae6266679b4ec64adcb3ca5247cf598a9cb66cc22e79e31f1661c781c1871fcc1a3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEJzwxHMXOdNHQGwFxiEct4Es4ty00q/rm\nJmZ5tOxkrcs8pSR89Zipy2bMIueeMfFmHHgcGHH8waM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 576,
+          "comment" : "edge case for u2",
+          "msg" : "4d7367",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00855f5b2dc8e46ec428a593f73219cf65dae793e8346e30cc3701309c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bd53b3b52cd9134e91e2f90ba50083c007daa7cff5cdabe4208ec1b8d4b114bdcd3f599aedde76c6ea6993d1d578d8faf9851d136d4caa4f",
+        "wx" : "0bd53b3b52cd9134e91e2f90ba50083c007daa7cff5cdabe4208ec1b8",
+        "wy" : "0d4b114bdcd3f599aedde76c6ea6993d1d578d8faf9851d136d4caa4f"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004bd53b3b52cd9134e91e2f90ba50083c007daa7cff5cdabe4208ec1b8d4b114bdcd3f599aedde76c6ea6993d1d578d8faf9851d136d4caa4f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEvVOztSzZE06R4vkLpQCDwAfap8/1zavk\nII7BuNSxFL3NP1ma7d52xuppk9HVeNj6+YUdE21Mqk8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 577,
+          "comment" : "edge case for u2",
+          "msg" : "4d7367",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c2db5f61aea817276af2064e104c7a30e32034cb526dd0aacfa56566f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04014cbf869ed4534cd9d32fc5bb806d5dfa61aad3e81edd4502c594859478257b5e26770f7bc6f7e084d47e1d7c4140b836344e5fe84c0694",
+        "wx" : "14cbf869ed4534cd9d32fc5bb806d5dfa61aad3e81edd4502c59485",
+        "wy" : "09478257b5e26770f7bc6f7e084d47e1d7c4140b836344e5fe84c0694"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004014cbf869ed4534cd9d32fc5bb806d5dfa61aad3e81edd4502c594859478257b5e26770f7bc6f7e084d47e1d7c4140b836344e5fe84c0694",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEAUy/hp7UU0zZ0y/Fu4BtXfphqtPoHt1F\nAsWUhZR4JXteJncPe8b34ITUfh18QUC4NjROX+hMBpQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 578,
+          "comment" : "edge case for u2",
+          "msg" : "4d7367",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d0084a6c7513e5f48c07fffffffffff8713f3cba1293e4f3e95597fe6bd",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0403c6d87405e081ac2dc9188afed99eb87f13bd7b80e7363fd21a7692a092b8b8354493e2444736a9c78bf356fcdf07849120986afb98fa03",
+        "wx" : "3c6d87405e081ac2dc9188afed99eb87f13bd7b80e7363fd21a7692",
+        "wy" : "0a092b8b8354493e2444736a9c78bf356fcdf07849120986afb98fa03"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000403c6d87405e081ac2dc9188afed99eb87f13bd7b80e7363fd21a7692a092b8b8354493e2444736a9c78bf356fcdf07849120986afb98fa03",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEA8bYdAXggawtyRiK/tmeuH8TvXuA5zY/\n0hp2kqCSuLg1RJPiREc2qceL81b83weEkSCYavuY+gM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 579,
+          "comment" : "edge case for u2",
+          "msg" : "4d7367",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c6c7513e5f48c07ffffffffffffff9d21fd1b31544cb13ca86a75b25e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0423a692efebef2ac0f696d0f952dbd435a4402aad2edc3262c19e0c2f705278859aec7c13b3ff66d04ea226c7de2edd6e69099b9d1a0e4bc9",
+        "wx" : "23a692efebef2ac0f696d0f952dbd435a4402aad2edc3262c19e0c2f",
+        "wy" : "705278859aec7c13b3ff66d04ea226c7de2edd6e69099b9d1a0e4bc9"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000423a692efebef2ac0f696d0f952dbd435a4402aad2edc3262c19e0c2f705278859aec7c13b3ff66d04ea226c7de2edd6e69099b9d1a0e4bc9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEI6aS7+vvKsD2ltD5UtvUNaRAKq0u3DJi\nwZ4ML3BSeIWa7HwTs/9m0E6iJsfeLt1uaQmbnRoOS8k=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 580,
+          "comment" : "edge case for u2",
+          "msg" : "4d7367",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00d8ea27cbe9180fffffffffffffff3a43fa3662a899627950d4eb64bc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b2fcf3f649cdd7f8012ac1d2243f07ca0ff8fe75c9f59bbe7f3407e69c69a46fdf16174bb0e59ce3d7129cfafd74e6dacdb3dbbe6d772943",
+        "wx" : "0b2fcf3f649cdd7f8012ac1d2243f07ca0ff8fe75c9f59bbe7f3407e6",
+        "wy" : "09c69a46fdf16174bb0e59ce3d7129cfafd74e6dacdb3dbbe6d772943"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b2fcf3f649cdd7f8012ac1d2243f07ca0ff8fe75c9f59bbe7f3407e69c69a46fdf16174bb0e59ce3d7129cfafd74e6dacdb3dbbe6d772943",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEsvzz9knN1/gBKsHSJD8Hyg/4/nXJ9Zu+\nfzQH5pxppG/fFhdLsOWc49cSnPr9dObazbPbvm13KUM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 581,
+          "comment" : "edge case for u2",
+          "msg" : "4d7367",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c3e5f48c07fffffffffffffffffffc724968c0ecf9ed783744a7337b3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0421b68c2b25120292e7f0616d68260fc0f3fe9f1dff0fcb88c9f0138607ada4f6669a1c52e684113ceafd4f49cc119faa8ccbb3834e9853b9",
+        "wx" : "21b68c2b25120292e7f0616d68260fc0f3fe9f1dff0fcb88c9f01386",
+        "wy" : "7ada4f6669a1c52e684113ceafd4f49cc119faa8ccbb3834e9853b9"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000421b68c2b25120292e7f0616d68260fc0f3fe9f1dff0fcb88c9f0138607ada4f6669a1c52e684113ceafd4f49cc119faa8ccbb3834e9853b9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEIbaMKyUSApLn8GFtaCYPwPP+nx3/D8uI\nyfAThgetpPZmmhxS5oQRPOr9T0nMEZ+qjMuzg06YU7k=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 582,
+          "comment" : "edge case for u2",
+          "msg" : "4d7367",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d00bfffffffffffffffffffffffffff3d87bb44c833bb384d0f224ccdde",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a4d3669d9b797a7e2b07ea8e89ac2f0bc1aa914f788e93babcc4f15d46b26c00dad8dc5162bdeaaec2a38a649303bbdafc02b5a8ae8abf1d",
+        "wx" : "0a4d3669d9b797a7e2b07ea8e89ac2f0bc1aa914f788e93babcc4f15d",
+        "wy" : "46b26c00dad8dc5162bdeaaec2a38a649303bbdafc02b5a8ae8abf1d"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004a4d3669d9b797a7e2b07ea8e89ac2f0bc1aa914f788e93babcc4f15d46b26c00dad8dc5162bdeaaec2a38a649303bbdafc02b5a8ae8abf1d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEpNNmnZt5en4rB+qOiawvC8GqkU94jpO6\nvMTxXUaybADa2NxRYr3qrsKjimSTA7va/AK1qK6Kvx0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 583,
+          "comment" : "edge case for u2",
+          "msg" : "4d7367",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c7fffffffffffffffffffffffffff646c95d0a029629370d8e83d717f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0435d31d0546d98621e629ef809364e61f069d5209eb07df02aca0aed9ade758d0998296d3adadf1b2076081a787a52e4f2d647cb3f06ff9ae",
+        "wx" : "35d31d0546d98621e629ef809364e61f069d5209eb07df02aca0aed9",
+        "wy" : "0ade758d0998296d3adadf1b2076081a787a52e4f2d647cb3f06ff9ae"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000435d31d0546d98621e629ef809364e61f069d5209eb07df02aca0aed9ade758d0998296d3adadf1b2076081a787a52e4f2d647cb3f06ff9ae",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAENdMdBUbZhiHmKe+Ak2TmHwadUgnrB98C\nrKCu2a3nWNCZgpbTra3xsgdggaeHpS5PLWR8s/Bv+a4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 584,
+          "comment" : "edge case for u2",
+          "msg" : "4d7367",
+          "sig" : "303c021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021c3fffffffffffffffffffffffffff8b51705c781f09ee94a2ae2e1520",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b243cde43260a599600ce327389369ee212d61be8603a6aa9d0cc0ebb066a5cd3e877b75f45ef89699673c5d3a7be7385de993583ce9b20d",
+        "wx" : "0b243cde43260a599600ce327389369ee212d61be8603a6aa9d0cc0eb",
+        "wy" : "0b066a5cd3e877b75f45ef89699673c5d3a7be7385de993583ce9b20d"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b243cde43260a599600ce327389369ee212d61be8603a6aa9d0cc0ebb066a5cd3e877b75f45ef89699673c5d3a7be7385de993583ce9b20d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEskPN5DJgpZlgDOMnOJNp7iEtYb6GA6aq\nnQzA67Bmpc0+h3t19F74lplnPF06e+c4XemTWDzpsg0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 585,
+          "comment" : "edge case for u2",
+          "msg" : "4d7367",
+          "sig" : "303d021c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffd021d0096dafb0d7540b93b5790327082635cd8895e1e799d5d19f92b594056",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c0e1d6eec40932374bdfd0833092396f898b48a558d672fcea97db77bf48b8d63e9618de21fa2bd81fda7552340a8d00fea6f33f47857f09",
+        "wx" : "0c0e1d6eec40932374bdfd0833092396f898b48a558d672fcea97db77",
+        "wy" : "0bf48b8d63e9618de21fa2bd81fda7552340a8d00fea6f33f47857f09"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004c0e1d6eec40932374bdfd0833092396f898b48a558d672fcea97db77bf48b8d63e9618de21fa2bd81fda7552340a8d00fea6f33f47857f09",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEwOHW7sQJMjdL39CDMJI5b4mLSKVY1nL8\n6pfbd79IuNY+lhjeIfor2B/adVI0Co0A/qbzP0eFfwk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 586,
+          "comment" : "point duplication during verification",
+          "msg" : "4d7367",
+          "sig" : "303d021d00c44503dae85dd5210780f02928b3d927171c578f8603d16b240663c7021c23c5bbfb025d0d11bc97dd040416fcc32324cc8f5936ed88da2dc253",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c0e1d6eec40932374bdfd0833092396f898b48a558d672fcea97db7740b74729c169e721de05d427e0258aaccbf572ff01590cc0b87a80f8",
+        "wx" : "0c0e1d6eec40932374bdfd0833092396f898b48a558d672fcea97db77",
+        "wy" : "40b74729c169e721de05d427e0258aaccbf572ff01590cc0b87a80f8"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004c0e1d6eec40932374bdfd0833092396f898b48a558d672fcea97db7740b74729c169e721de05d427e0258aaccbf572ff01590cc0b87a80f8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEwOHW7sQJMjdL39CDMJI5b4mLSKVY1nL8\n6pfbd0C3RynBaech3gXUJ+AliqzL9XL/AVkMwLh6gPg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 587,
+          "comment" : "duplication bug",
+          "msg" : "4d7367",
+          "sig" : "303d021d00c44503dae85dd5210780f02928b3d927171c578f8603d16b240663c7021c23c5bbfb025d0d11bc97dd040416fcc32324cc8f5936ed88da2dc253",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0431406520359b1fb714b9042a821a958e423639ef7c4d463b33240a8d9a813d3906c33b07451694b58ae6862898b4ecdad3ea3e0954a27ab1",
+        "wx" : "31406520359b1fb714b9042a821a958e423639ef7c4d463b33240a8d",
+        "wy" : "09a813d3906c33b07451694b58ae6862898b4ecdad3ea3e0954a27ab1"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000431406520359b1fb714b9042a821a958e423639ef7c4d463b33240a8d9a813d3906c33b07451694b58ae6862898b4ecdad3ea3e0954a27ab1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEMUBlIDWbH7cUuQQqghqVjkI2Oe98TUY7\nMyQKjZqBPTkGwzsHRRaUtYrmhiiYtOza0+o+CVSierE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 588,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "4d7367",
+          "sig" : "303c021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14021c33333333333333333333333333330486f9be9672d0c5d50ddf45a20c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0453883538d86609217a4d9c27992e2bd704a4bb12fb91253cd4f496fa00b32f3a2d153a52bb577650cdf1b73a340535c7e73deb599aa95088",
+        "wx" : "53883538d86609217a4d9c27992e2bd704a4bb12fb91253cd4f496fa",
+        "wy" : "0b32f3a2d153a52bb577650cdf1b73a340535c7e73deb599aa95088"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000453883538d86609217a4d9c27992e2bd704a4bb12fb91253cd4f496fa00b32f3a2d153a52bb577650cdf1b73a340535c7e73deb599aa95088",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEU4g1ONhmCSF6TZwnmS4r1wSkuxL7kSU8\n1PSW+gCzLzotFTpSu1d2UM3xtzo0BTXH5z3rWZqpUIg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 589,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "4d7367",
+          "sig" : "303c021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045568139000f8cf6496428e524f105cb0447ee417ab0a1d842c831e73ed0465c1c6e623c3acc6a3349bb41ad41b741cce460d6e72d008c47d",
+        "wx" : "5568139000f8cf6496428e524f105cb0447ee417ab0a1d842c831e73",
+        "wy" : "0ed0465c1c6e623c3acc6a3349bb41ad41b741cce460d6e72d008c47d"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00045568139000f8cf6496428e524f105cb0447ee417ab0a1d842c831e73ed0465c1c6e623c3acc6a3349bb41ad41b741cce460d6e72d008c47d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEVWgTkAD4z2SWQo5STxBcsER+5BerCh2E\nLIMec+0EZcHG5iPDrMajNJu0GtQbdBzORg1uctAIxH0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 590,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "4d7367",
+          "sig" : "303d021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021d00db6db6db6db6db6db6db6db6db6ceed4c09e84c77ebd9116e17391eb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0468820408a5dd10cc423d60efbb5b6d7aab326dc95e40030f118ad59bb2a92f649fc395904ea83c1c77f1ee9725a2d3e20ee2bed12e54b3e6",
+        "wx" : "68820408a5dd10cc423d60efbb5b6d7aab326dc95e40030f118ad59b",
+        "wy" : "0b2a92f649fc395904ea83c1c77f1ee9725a2d3e20ee2bed12e54b3e6"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000468820408a5dd10cc423d60efbb5b6d7aab326dc95e40030f118ad59bb2a92f649fc395904ea83c1c77f1ee9725a2d3e20ee2bed12e54b3e6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEaIIECKXdEMxCPWDvu1tteqsybcleQAMP\nEYrVm7KpL2Sfw5WQTqg8HHfx7pclotPiDuK+0S5Us+Y=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 591,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "4d7367",
+          "sig" : "303c021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021c33333333333333333333333333330486f9be9672d0c5d50ddf45a20c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0464d6344a03e8858f482883c9cf653364c1ca15a9b4638c3d4854eb5342070226b4ea55b227e540dfb6acd3b56fd829d34be310a5f0b57425",
+        "wx" : "64d6344a03e8858f482883c9cf653364c1ca15a9b4638c3d4854eb53",
+        "wy" : "42070226b4ea55b227e540dfb6acd3b56fd829d34be310a5f0b57425"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000464d6344a03e8858f482883c9cf653364c1ca15a9b4638c3d4854eb5342070226b4ea55b227e540dfb6acd3b56fd829d34be310a5f0b57425",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEZNY0SgPohY9IKIPJz2UzZMHKFam0Y4w9\nSFTrU0IHAia06lWyJ+VA37as07Vv2CnTS+MQpfC1dCU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 592,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "4d7367",
+          "sig" : "303d021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021d00cccccccccccccccccccccccccccc121be6fa59cb431754377d168831",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0493a2063dc206c8c277e67920b2102cfa5b47e862ed70f864ee6b8cb6c163388e63647115e37092cea043c45e09f8fec6ecdc99b6fbc76ce4",
+        "wx" : "093a2063dc206c8c277e67920b2102cfa5b47e862ed70f864ee6b8cb6",
+        "wy" : "0c163388e63647115e37092cea043c45e09f8fec6ecdc99b6fbc76ce4"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000493a2063dc206c8c277e67920b2102cfa5b47e862ed70f864ee6b8cb6c163388e63647115e37092cea043c45e09f8fec6ecdc99b6fbc76ce4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEk6IGPcIGyMJ35nkgshAs+ltH6GLtcPhk\n7muMtsFjOI5jZHEV43CSzqBDxF4J+P7G7NyZtvvHbOQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 593,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "4d7367",
+          "sig" : "303c021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021c249249249249249249249249249227ce201a6b76951f982e7ae89852",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ad2a196e6aa1b0334fc3cbd7533c237f96de557cecbcb963001b7315c06060bea2aadd9fc70a98ad1e10bfee5c34b29a6acfa69e708d1c7c",
+        "wx" : "0ad2a196e6aa1b0334fc3cbd7533c237f96de557cecbcb963001b7315",
+        "wy" : "0c06060bea2aadd9fc70a98ad1e10bfee5c34b29a6acfa69e708d1c7c"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004ad2a196e6aa1b0334fc3cbd7533c237f96de557cecbcb963001b7315c06060bea2aadd9fc70a98ad1e10bfee5c34b29a6acfa69e708d1c7c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAErSoZbmqhsDNPw8vXUzwjf5beVXzsvLlj\nABtzFcBgYL6iqt2fxwqYrR4Qv+5cNLKaas+mnnCNHHw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 594,
+          "comment" : "extreme value for k",
+          "msg" : "4d7367",
+          "sig" : "303c021c706a46dc76dcb76798e60e6d89474788d16dc18032d268fd1a704fa6021c0eb10e5ab95facded4061029d63a46f46f12947411f2ea561a592057",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04019cb0c37dbd376a14e9e9438767307e8f6cf2e79689b582882f347d02b11468cb1a7782569e48b7f72e482f5fc0da729388e4b479dc76b5",
+        "wx" : "19cb0c37dbd376a14e9e9438767307e8f6cf2e79689b582882f347d",
+        "wy" : "2b11468cb1a7782569e48b7f72e482f5fc0da729388e4b479dc76b5"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004019cb0c37dbd376a14e9e9438767307e8f6cf2e79689b582882f347d02b11468cb1a7782569e48b7f72e482f5fc0da729388e4b479dc76b5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEAZyww329N2oU6elDh2cwfo9s8ueWibWC\niC80fQKxFGjLGneCVp5It/cuSC9fwNpyk4jktHncdrU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 595,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "4d7367",
+          "sig" : "303d021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021c5555555555555555555555555555078ba03da56a069f0dc1c9740e14",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fbd1d4eff21c752f648ac2c68e3aa9bfe42821c2ca44a57380ed60eea247d953d459b04915783b69fb4316a7bd7f185a88e6b5013cf888fa",
+        "wx" : "0fbd1d4eff21c752f648ac2c68e3aa9bfe42821c2ca44a57380ed60ee",
+        "wy" : "0a247d953d459b04915783b69fb4316a7bd7f185a88e6b5013cf888fa"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004fbd1d4eff21c752f648ac2c68e3aa9bfe42821c2ca44a57380ed60eea247d953d459b04915783b69fb4316a7bd7f185a88e6b5013cf888fa",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE+9HU7/IcdS9kisLGjjqpv+QoIcLKRKVz\ngO1g7qJH2VPUWbBJFXg7aftDFqe9fxhaiOa1ATz4iPo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 596,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "4d7367",
+          "sig" : "303e021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021d00db6db6db6db6db6db6db6db6db6ceed4c09e84c77ebd9116e17391eb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040a30164667b9f3dd854589fe6231000e2877eb998c4b67a2d6de8f3dbf1b247fc0aaad5debd1c67b9a2bee26b31cdc4f69f3bc71cf459c2b",
+        "wx" : "0a30164667b9f3dd854589fe6231000e2877eb998c4b67a2d6de8f3d",
+        "wy" : "0bf1b247fc0aaad5debd1c67b9a2bee26b31cdc4f69f3bc71cf459c2b"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00040a30164667b9f3dd854589fe6231000e2877eb998c4b67a2d6de8f3dbf1b247fc0aaad5debd1c67b9a2bee26b31cdc4f69f3bc71cf459c2b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAECjAWRme5892FRYn+YjEADih365mMS2ei\n1t6PPb8bJH/Aqq1d69HGe5or7iazHNxPafO8cc9FnCs=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 597,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "4d7367",
+          "sig" : "303d021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021c33333333333333333333333333330486f9be9672d0c5d50ddf45a20c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045126ffacb4950168a420dd479ce1b26586e1a313c04546fbd9c60fe94e074ab326efcefad191264175a358909fea1fdd8cc80b209ba7321b",
+        "wx" : "5126ffacb4950168a420dd479ce1b26586e1a313c04546fbd9c60fe9",
+        "wy" : "4e074ab326efcefad191264175a358909fea1fdd8cc80b209ba7321b"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00045126ffacb4950168a420dd479ce1b26586e1a313c04546fbd9c60fe94e074ab326efcefad191264175a358909fea1fdd8cc80b209ba7321b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEUSb/rLSVAWikIN1HnOGyZYbhoxPARUb7\n2cYP6U4HSrMm78760ZEmQXWjWJCf6h/djMgLIJunMhs=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 598,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "4d7367",
+          "sig" : "303e021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021d00cccccccccccccccccccccccccccc121be6fa59cb431754377d168831",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0491b25dd9a1259a742e5d8e909ac09983685c82a3e4cdb91858e6ce0fbb78599ecac5116724e9cb0b7aaeb5ad45b098d8c59f2567dd1b1298",
+        "wx" : "091b25dd9a1259a742e5d8e909ac09983685c82a3e4cdb91858e6ce0f",
+        "wy" : "0bb78599ecac5116724e9cb0b7aaeb5ad45b098d8c59f2567dd1b1298"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000491b25dd9a1259a742e5d8e909ac09983685c82a3e4cdb91858e6ce0fbb78599ecac5116724e9cb0b7aaeb5ad45b098d8c59f2567dd1b1298",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEkbJd2aElmnQuXY6QmsCZg2hcgqPkzbkY\nWObOD7t4WZ7KxRFnJOnLC3quta1FsJjYxZ8lZ90bEpg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 599,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "4d7367",
+          "sig" : "303d021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021c249249249249249249249249249227ce201a6b76951f982e7ae89852",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045bc34a3c52a4fbd90eb90aaea41171ee037e4b2811ba168b01b13d71852a17c2243d517a8c38cc54e39e4f7983c5033d4ecac265a44b773c",
+        "wx" : "5bc34a3c52a4fbd90eb90aaea41171ee037e4b2811ba168b01b13d71",
+        "wy" : "0852a17c2243d517a8c38cc54e39e4f7983c5033d4ecac265a44b773c"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00045bc34a3c52a4fbd90eb90aaea41171ee037e4b2811ba168b01b13d71852a17c2243d517a8c38cc54e39e4f7983c5033d4ecac265a44b773c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEW8NKPFKk+9kOuQqupBFx7gN+SygRuhaL\nAbE9cYUqF8IkPVF6jDjMVOOeT3mDxQM9TsrCZaRLdzw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 600,
+          "comment" : "extreme value for k",
+          "msg" : "4d7367",
+          "sig" : "303d021d00b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21021c0eb10e5ab95facded4061029d63a46f46f12947411f2ea561a592057",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34",
+        "wx" : "0b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21",
+        "wy" : "0bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEtw4MvWu0v38yE5C5SgPB01bCESI0MoDW\nEVwdIb03Y4i19yP7TCLf5s1DdaBaB0dkRNWBmYUAfjQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 601,
+          "comment" : "testing point duplication",
+          "msg" : "4d7367",
+          "sig" : "303c021c0b041f884d648cc345e4600078eb790708ccad576d4abe3c943aa328021c249249249249249249249249249227ce201a6b76951f982e7ae89851",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 602,
+          "comment" : "testing point duplication",
+          "msg" : "4d7367",
+          "sig" : "303d021d00f4fbe077b29b733cba1b9fff87139d9bd7ec42e6a6926b08c8218715021c249249249249249249249249249227ce201a6b76951f982e7ae89851",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d2142c89c774a08dc04b3dd201932bc8a5ea5f8b89bbb2a7e667aff81cd",
+        "wx" : "0b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21",
+        "wy" : "42c89c774a08dc04b3dd201932bc8a5ea5f8b89bbb2a7e667aff81cd"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d2142c89c774a08dc04b3dd201932bc8a5ea5f8b89bbb2a7e667aff81cd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEtw4MvWu0v38yE5C5SgPB01bCESI0MoDW\nEVwdIULInHdKCNwEs90gGTK8il6l+Libuyp+Znr/gc0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 603,
+          "comment" : "testing point duplication",
+          "msg" : "4d7367",
+          "sig" : "303c021c0b041f884d648cc345e4600078eb790708ccad576d4abe3c943aa328021c249249249249249249249249249227ce201a6b76951f982e7ae89851",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 604,
+          "comment" : "testing point duplication",
+          "msg" : "4d7367",
+          "sig" : "303d021d00f4fbe077b29b733cba1b9fff87139d9bd7ec42e6a6926b08c8218715021c249249249249249249249249249227ce201a6b76951f982e7ae89851",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d705d16f80987e2d9b1a6957d29ce22febf7d10fa515153182415c8361baaca4b1fc105ee5ce80d514ec1238beae2037a6f83625593620d460819e8682160926",
+        "wx" : "0d705d16f80987e2d9b1a6957d29ce22febf7d10fa515153182415c8361baaca4",
+        "wy" : "0b1fc105ee5ce80d514ec1238beae2037a6f83625593620d460819e8682160926"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d705d16f80987e2d9b1a6957d29ce22febf7d10fa515153182415c8361baaca4b1fc105ee5ce80d514ec1238beae2037a6f83625593620d460819e8682160926",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1wXRb4CYfi2bGmlX0pziL+v30Q+l\nFRUxgkFcg2G6rKSx/BBe5c6A1RTsEji+riA3pvg2JVk2INRggZ6GghYJJg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 605,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "54657374",
+          "sig" : "303502104319055358e8617b0c46353d039cdaab022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 606,
+          "comment" : "r too large",
+          "msg" : "54657374",
+          "sig" : "3046022100ffffffff00000001000000000000000000000000fffffffffffffffffffffffc022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043cd8d2f81d6953b0844c09d7b560d527cd2ef67056893eadafa52c8501387d59ee41fdb4d10402ce7a0c5e3b747adfa3a490b62a6b7719068903485c0bb6dc2d",
+        "wx" : "3cd8d2f81d6953b0844c09d7b560d527cd2ef67056893eadafa52c8501387d59",
+        "wy" : "0ee41fdb4d10402ce7a0c5e3b747adfa3a490b62a6b7719068903485c0bb6dc2d"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cd8d2f81d6953b0844c09d7b560d527cd2ef67056893eadafa52c8501387d59ee41fdb4d10402ce7a0c5e3b747adfa3a490b62a6b7719068903485c0bb6dc2d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPNjS+B1pU7CETAnXtWDVJ80u9nBW\niT6tr6UshQE4fVnuQf200QQCznoMXjt0et+jpJC2Kmt3GQaJA0hcC7bcLQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 607,
+          "comment" : "r,s are large",
+          "msg" : "54657374",
+          "sig" : "3046022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048240cd81edd91cb6936133508c3915100e81f332c4545d41189b481196851378e05b06e72d4a1bff80ea5db514aa2f93ea6dd6d9c0ae27b7837dc432f9ce89d9",
+        "wx" : "08240cd81edd91cb6936133508c3915100e81f332c4545d41189b481196851378",
+        "wy" : "0e05b06e72d4a1bff80ea5db514aa2f93ea6dd6d9c0ae27b7837dc432f9ce89d9"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048240cd81edd91cb6936133508c3915100e81f332c4545d41189b481196851378e05b06e72d4a1bff80ea5db514aa2f93ea6dd6d9c0ae27b7837dc432f9ce89d9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEgkDNge3ZHLaTYTNQjDkVEA6B8zLE\nVF1BGJtIEZaFE3jgWwbnLUob/4DqXbUUqi+T6m3W2cCuJ7eDfcQy+c6J2Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 608,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100909135bdb6799286170f5ead2de4f6511453fe50914f3df2de54a36383df8dd4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b062947356748b0fc17f1704c65aa1dca6e1bfe6779756fa616d91eaad13df2c0b38c17f3d0672e7409cfc5992a99fff12b84a4f8432293b431113f1b2fb579d",
+        "wx" : "0b062947356748b0fc17f1704c65aa1dca6e1bfe6779756fa616d91eaad13df2c",
+        "wy" : "0b38c17f3d0672e7409cfc5992a99fff12b84a4f8432293b431113f1b2fb579d"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b062947356748b0fc17f1704c65aa1dca6e1bfe6779756fa616d91eaad13df2c0b38c17f3d0672e7409cfc5992a99fff12b84a4f8432293b431113f1b2fb579d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEsGKUc1Z0iw/BfxcExlqh3Kbhv+Z3\nl1b6YW2R6q0T3ywLOMF/PQZy50Cc/FmSqZ//ErhKT4QyKTtDERPxsvtXnQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 609,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022027b4577ca009376f71303fd5dd227dcef5deb773ad5f5a84360644669ca249a5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044a03ef9f92eb268cafa601072489a56380fa0dc43171d7712813b3a19a1eb5e53e213e28a608ce9a2f4a17fd830c6654018a79b3e0263d91a8ba90622df6f2f0",
+        "wx" : "4a03ef9f92eb268cafa601072489a56380fa0dc43171d7712813b3a19a1eb5e5",
+        "wy" : "3e213e28a608ce9a2f4a17fd830c6654018a79b3e0263d91a8ba90622df6f2f0"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044a03ef9f92eb268cafa601072489a56380fa0dc43171d7712813b3a19a1eb5e53e213e28a608ce9a2f4a17fd830c6654018a79b3e0263d91a8ba90622df6f2f0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAESgPvn5LrJoyvpgEHJImlY4D6DcQx\ncddxKBOzoZoeteU+IT4opgjOmi9KF/2DDGZUAYp5s+AmPZGoupBiLfby8A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 610,
+          "comment" : "small r and s",
+          "msg" : "54657374",
+          "sig" : "3006020105020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04091194c1cba17f34e286b4833701606a41cef26177ada8850b601ea1f859e70127242fcec708828758403ce2fe501983a7984e6209f4d6b95db9ad77767f55eb",
+        "wx" : "091194c1cba17f34e286b4833701606a41cef26177ada8850b601ea1f859e701",
+        "wy" : "27242fcec708828758403ce2fe501983a7984e6209f4d6b95db9ad77767f55eb"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004091194c1cba17f34e286b4833701606a41cef26177ada8850b601ea1f859e70127242fcec708828758403ce2fe501983a7984e6209f4d6b95db9ad77767f55eb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECRGUwcuhfzTihrSDNwFgakHO8mF3\nraiFC2AeofhZ5wEnJC/OxwiCh1hAPOL+UBmDp5hOYgn01rldua13dn9V6w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 611,
+          "comment" : "small r and s",
+          "msg" : "54657374",
+          "sig" : "3006020105020103",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04103c6ecceff59e71ea8f56fee3a4b2b148e81c2bdbdd39c195812c96dcfb41a72303a193dc591be150b883d770ec51ebb4ebce8b09042c2ecb16c448d8e57bf5",
+        "wx" : "103c6ecceff59e71ea8f56fee3a4b2b148e81c2bdbdd39c195812c96dcfb41a7",
+        "wy" : "2303a193dc591be150b883d770ec51ebb4ebce8b09042c2ecb16c448d8e57bf5"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004103c6ecceff59e71ea8f56fee3a4b2b148e81c2bdbdd39c195812c96dcfb41a72303a193dc591be150b883d770ec51ebb4ebce8b09042c2ecb16c448d8e57bf5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEEDxuzO/1nnHqj1b+46SysUjoHCvb\n3TnBlYEsltz7QacjA6GT3Fkb4VC4g9dw7FHrtOvOiwkELC7LFsRI2OV79Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 612,
+          "comment" : "small r and s",
+          "msg" : "54657374",
+          "sig" : "3006020105020105",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043b66b829fe604638bcb2bfe8c22228be67390c20111bd2b451468927e87fb6eabc8e59c009361758b274ba2cad36b58fde485a3ed09dade76712fa9e9c4ac212",
+        "wx" : "3b66b829fe604638bcb2bfe8c22228be67390c20111bd2b451468927e87fb6ea",
+        "wy" : "0bc8e59c009361758b274ba2cad36b58fde485a3ed09dade76712fa9e9c4ac212"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043b66b829fe604638bcb2bfe8c22228be67390c20111bd2b451468927e87fb6eabc8e59c009361758b274ba2cad36b58fde485a3ed09dade76712fa9e9c4ac212",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEO2a4Kf5gRji8sr/owiIovmc5DCAR\nG9K0UUaJJ+h/tuq8jlnACTYXWLJ0uiytNrWP3khaPtCdrednEvqenErCEg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 613,
+          "comment" : "small r and s",
+          "msg" : "54657374",
+          "sig" : "3006020105020106",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 614,
+          "comment" : "r is larger than n",
+          "msg" : "54657374",
+          "sig" : "3026022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632556020106",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044ff2f6c24e4a33cd71c09fdcbc74a6233961b874b8c8e0eb94582092cbc50c3084fa9547afda5c66335f3f937d4c79afa120486b534139d59ae82d61ead26420",
+        "wx" : "4ff2f6c24e4a33cd71c09fdcbc74a6233961b874b8c8e0eb94582092cbc50c30",
+        "wy" : "084fa9547afda5c66335f3f937d4c79afa120486b534139d59ae82d61ead26420"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044ff2f6c24e4a33cd71c09fdcbc74a6233961b874b8c8e0eb94582092cbc50c3084fa9547afda5c66335f3f937d4c79afa120486b534139d59ae82d61ead26420",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAET/L2wk5KM81xwJ/cvHSmIzlhuHS4\nyODrlFggksvFDDCE+pVHr9pcZjNfP5N9THmvoSBIa1NBOdWa6C1h6tJkIA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 615,
+          "comment" : "s is larger than n",
+          "msg" : "54657374",
+          "sig" : "3026020105022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc75fbd8",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0484b959080bb30859cd53c2fb973cf14d60cdaa8ee00587889b5bc657ac588175a02ce5c1e53cb196113c78b4cb8dc7d360e5ea7850b0f6650b0c45af2c3cd7ca",
+        "wx" : "084b959080bb30859cd53c2fb973cf14d60cdaa8ee00587889b5bc657ac588175",
+        "wy" : "0a02ce5c1e53cb196113c78b4cb8dc7d360e5ea7850b0f6650b0c45af2c3cd7ca"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000484b959080bb30859cd53c2fb973cf14d60cdaa8ee00587889b5bc657ac588175a02ce5c1e53cb196113c78b4cb8dc7d360e5ea7850b0f6650b0c45af2c3cd7ca",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhLlZCAuzCFnNU8L7lzzxTWDNqo7g\nBYeIm1vGV6xYgXWgLOXB5TyxlhE8eLTLjcfTYOXqeFCw9mULDEWvLDzXyg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 616,
+          "comment" : "small r and s^-1",
+          "msg" : "54657374",
+          "sig" : "3027020201000221008f1e3c7862c58b16bb76eddbb76eddbb516af4f63f2d74d76e0d28c9bb75ea88",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04df4083bd6ecbda5a77ae578e5d835fa7f74a07ebb91e0570e1ff32a563354e9925af80b09a167d9ef647df28e2d9acd0d4bc4f2deec5723818edaf9071e311f8",
+        "wx" : "0df4083bd6ecbda5a77ae578e5d835fa7f74a07ebb91e0570e1ff32a563354e99",
+        "wy" : "25af80b09a167d9ef647df28e2d9acd0d4bc4f2deec5723818edaf9071e311f8"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004df4083bd6ecbda5a77ae578e5d835fa7f74a07ebb91e0570e1ff32a563354e9925af80b09a167d9ef647df28e2d9acd0d4bc4f2deec5723818edaf9071e311f8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE30CDvW7L2lp3rleOXYNfp/dKB+u5\nHgVw4f8ypWM1Tpklr4CwmhZ9nvZH3yji2azQ1LxPLe7FcjgY7a+QceMR+A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 617,
+          "comment" : "smallish r and s^-1",
+          "msg" : "54657374",
+          "sig" : "302c02072d9b4d347952d6022100ef3043e7329581dbb3974497710ab11505ee1c87ff907beebadd195a0ffe6d7a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c2569a3c9bf8c1838ca821f7ba6f000cc8679d278f3736b414a34a7c956a03770387ea85bc4f28804b4a91c9b7d65bc6434c975806795ab7d441a4e9683aeb09",
+        "wx" : "0c2569a3c9bf8c1838ca821f7ba6f000cc8679d278f3736b414a34a7c956a0377",
+        "wy" : "387ea85bc4f28804b4a91c9b7d65bc6434c975806795ab7d441a4e9683aeb09"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c2569a3c9bf8c1838ca821f7ba6f000cc8679d278f3736b414a34a7c956a03770387ea85bc4f28804b4a91c9b7d65bc6434c975806795ab7d441a4e9683aeb09",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwlaaPJv4wYOMqCH3um8ADMhnnSeP\nNza0FKNKfJVqA3cDh+qFvE8ogEtKkcm31lvGQ0yXWAZ5WrfUQaTpaDrrCQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 618,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "54657374",
+          "sig" : "3032020d1033e67e37b32b445580bf4eff0221008b748b74000000008b748b748b748b7466e769ad4a16d3dcd87129b8e91d1b4d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044a9f7da2a6c359a16540c271774a6bf1c586357c978256f44a6496d80670968ac496e73a44563f8d56fbd7bb9e4e3ae304c86f2c508eb777b03924755beb40d4",
+        "wx" : "4a9f7da2a6c359a16540c271774a6bf1c586357c978256f44a6496d80670968a",
+        "wy" : "0c496e73a44563f8d56fbd7bb9e4e3ae304c86f2c508eb777b03924755beb40d4"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044a9f7da2a6c359a16540c271774a6bf1c586357c978256f44a6496d80670968ac496e73a44563f8d56fbd7bb9e4e3ae304c86f2c508eb777b03924755beb40d4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAESp99oqbDWaFlQMJxd0pr8cWGNXyX\nglb0SmSW2AZwlorEluc6RFY/jVb717ueTjrjBMhvLFCOt3ewOSR1W+tA1A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 619,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "54657374",
+          "sig" : "302702020100022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04874146432b3cd2c9e26204c0a34136996067d466dde4917a8ff23a8e95ca106b709b3d50976ef8b385a813bc35f3a20710bdc6edd465e6f43ac4866703a6608c",
+        "wx" : "0874146432b3cd2c9e26204c0a34136996067d466dde4917a8ff23a8e95ca106b",
+        "wy" : "709b3d50976ef8b385a813bc35f3a20710bdc6edd465e6f43ac4866703a6608c"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004874146432b3cd2c9e26204c0a34136996067d466dde4917a8ff23a8e95ca106b709b3d50976ef8b385a813bc35f3a20710bdc6edd465e6f43ac4866703a6608c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEh0FGQys80sniYgTAo0E2mWBn1Gbd\n5JF6j/I6jpXKEGtwmz1Ql274s4WoE7w186IHEL3G7dRl5vQ6xIZnA6ZgjA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 620,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "54657374",
+          "sig" : "3032020d062522bbd3ecbe7c39e93e7c25022100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047a736d8e326a9ca62bbe25a34ea4e3633b499a96afa7aaa3fcf3fd88f8e07edeb3e45879d8622b93e818443a686e869eeda7bf9ae46aa3eafcc48a5934864627",
+        "wx" : "7a736d8e326a9ca62bbe25a34ea4e3633b499a96afa7aaa3fcf3fd88f8e07ede",
+        "wy" : "0b3e45879d8622b93e818443a686e869eeda7bf9ae46aa3eafcc48a5934864627"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047a736d8e326a9ca62bbe25a34ea4e3633b499a96afa7aaa3fcf3fd88f8e07edeb3e45879d8622b93e818443a686e869eeda7bf9ae46aa3eafcc48a5934864627",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEenNtjjJqnKYrviWjTqTjYztJmpav\np6qj/PP9iPjgft6z5Fh52GIrk+gYRDpoboae7ae/muRqo+r8xIpZNIZGJw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 621,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "54657374",
+          "sig" : "3045022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d50220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e84d9b232e971a43382630f99725e423ec1ecb41e55172e9c69748a03f0d5988618b15b427ad83363bd041ff75fac98ef2ee923714e7d1dfe31753793c7588d4",
+        "wx" : "0e84d9b232e971a43382630f99725e423ec1ecb41e55172e9c69748a03f0d5988",
+        "wy" : "618b15b427ad83363bd041ff75fac98ef2ee923714e7d1dfe31753793c7588d4"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004e84d9b232e971a43382630f99725e423ec1ecb41e55172e9c69748a03f0d5988618b15b427ad83363bd041ff75fac98ef2ee923714e7d1dfe31753793c7588d4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6E2bIy6XGkM4JjD5lyXkI+wey0Hl\nUXLpxpdIoD8NWYhhixW0J62DNjvQQf91+smO8u6SNxTn0d/jF1N5PHWI1A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 622,
+          "comment" : "s == 1",
+          "msg" : "54657374",
+          "sig" : "30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 623,
+          "comment" : "s == 0",
+          "msg" : "54657374",
+          "sig" : "30250220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040203736fcb198b15d8d7a0c80f66dddd15259240aa78d08aae67c467de04503434383438d5041ea9a387ee8e4d4e84b4471b160c6bcf2568b072f8f20e87a996",
+        "wx" : "203736fcb198b15d8d7a0c80f66dddd15259240aa78d08aae67c467de045034",
+        "wy" : "34383438d5041ea9a387ee8e4d4e84b4471b160c6bcf2568b072f8f20e87a996"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040203736fcb198b15d8d7a0c80f66dddd15259240aa78d08aae67c467de04503434383438d5041ea9a387ee8e4d4e84b4471b160c6bcf2568b072f8f20e87a996",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAgNzb8sZixXY16DID2bd3RUlkkCq\neNCKrmfEZ94EUDQ0ODQ41QQeqaOH7o5NToS0RxsWDGvPJWiwcvjyDoeplg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 624,
+          "comment" : "point at infinity during verify",
+          "msg" : "54657374",
+          "sig" : "304402207fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a80220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a17f5b75a35ed64623ca5cbf1f91951292db0c23f0c2ea24c3d0cad0988cabc083a7a618625c228940730b4fa3ee64faecbb2fc20fdde7c58b3a3f6300424dc6",
+        "wx" : "0a17f5b75a35ed64623ca5cbf1f91951292db0c23f0c2ea24c3d0cad0988cabc0",
+        "wy" : "083a7a618625c228940730b4fa3ee64faecbb2fc20fdde7c58b3a3f6300424dc6"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a17f5b75a35ed64623ca5cbf1f91951292db0c23f0c2ea24c3d0cad0988cabc083a7a618625c228940730b4fa3ee64faecbb2fc20fdde7c58b3a3f6300424dc6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEoX9bdaNe1kYjyly/H5GVEpLbDCPw\nwuokw9DK0JiMq8CDp6YYYlwiiUBzC0+j7mT67Lsvwg/d58WLOj9jAEJNxg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 625,
+          "comment" : "u1 == 1",
+          "msg" : "54657374",
+          "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0404ba0cba291a37db13f33bf90dab628c04ec8393a0200419e9eaa1ebcc9fb5c31f3a0a0e6823a49b625ad57b12a32d4047970fc3428f0f0049ecf4265dc12f62",
+        "wx" : "4ba0cba291a37db13f33bf90dab628c04ec8393a0200419e9eaa1ebcc9fb5c3",
+        "wy" : "1f3a0a0e6823a49b625ad57b12a32d4047970fc3428f0f0049ecf4265dc12f62"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000404ba0cba291a37db13f33bf90dab628c04ec8393a0200419e9eaa1ebcc9fb5c31f3a0a0e6823a49b625ad57b12a32d4047970fc3428f0f0049ecf4265dc12f62",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEBLoMuikaN9sT8zv5DatijATsg5Og\nIAQZ6eqh68yftcMfOgoOaCOkm2Ja1XsSoy1AR5cPw0KPDwBJ7PQmXcEvYg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 626,
+          "comment" : "u1 == n - 1",
+          "msg" : "54657374",
+          "sig" : "30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100acd155416a8b77f34089464733ff7cd39c400e9c69af7beb9eac5054ed2ec72c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04692b6c828e0feed63d8aeaa2b7322f9ccbe8723a1ed39f229f204a434b8900efa1f6f6abcb38ea3b8fde38b98c7c271f274af56a8c5628dc3329069ae4dd5716",
+        "wx" : "692b6c828e0feed63d8aeaa2b7322f9ccbe8723a1ed39f229f204a434b8900ef",
+        "wy" : "0a1f6f6abcb38ea3b8fde38b98c7c271f274af56a8c5628dc3329069ae4dd5716"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004692b6c828e0feed63d8aeaa2b7322f9ccbe8723a1ed39f229f204a434b8900efa1f6f6abcb38ea3b8fde38b98c7c271f274af56a8c5628dc3329069ae4dd5716",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaStsgo4P7tY9iuqitzIvnMvocjoe\n058inyBKQ0uJAO+h9varyzjqO4/eOLmMfCcfJ0r1aoxWKNwzKQaa5N1XFg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 627,
+          "comment" : "u2 == 1",
+          "msg" : "54657374",
+          "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c700220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400cefd9162d13e64cb93687a9cd8f9755ebb5a3ef7632f800f84871874ccef09543ecbeaf7e8044ef721be2fb5f549e4b8480d2587404ebf7dbbef2c54bc0cb1",
+        "wx" : "0cefd9162d13e64cb93687a9cd8f9755ebb5a3ef7632f800f84871874ccef09",
+        "wy" : "543ecbeaf7e8044ef721be2fb5f549e4b8480d2587404ebf7dbbef2c54bc0cb1"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400cefd9162d13e64cb93687a9cd8f9755ebb5a3ef7632f800f84871874ccef09543ecbeaf7e8044ef721be2fb5f549e4b8480d2587404ebf7dbbef2c54bc0cb1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAM79kWLRPmTLk2h6nNj5dV67Wj73\nYy+AD4SHGHTM7wlUPsvq9+gETvchvi+19UnkuEgNJYdATr99u+8sVLwMsQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 628,
+          "comment" : "u2 == n - 1",
+          "msg" : "54657374",
+          "sig" : "30450220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70022100aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b975183b42551cf52f291d5c1921fd5e12f50c8c85a4beb9de03efa3f0f244862243018e6866df922dc313612020311ff21e242ce3fb15bc78c406b25ab43091",
+        "wx" : "0b975183b42551cf52f291d5c1921fd5e12f50c8c85a4beb9de03efa3f0f24486",
+        "wy" : "2243018e6866df922dc313612020311ff21e242ce3fb15bc78c406b25ab43091"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b975183b42551cf52f291d5c1921fd5e12f50c8c85a4beb9de03efa3f0f244862243018e6866df922dc313612020311ff21e242ce3fb15bc78c406b25ab43091",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuXUYO0JVHPUvKR1cGSH9XhL1DIyF\npL653gPvo/DyRIYiQwGOaGbfki3DE2EgIDEf8h4kLOP7Fbx4xAayWrQwkQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 629,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220710f8e3edc7c2d5a3fd23de844002bb949d9f794f6d5405f6d97c1bb03dd2bd2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c25f1d166f3e211cdf042a26f8abf6094d48b8d17191d74ed71714927446699965d06dd6a88abfa49e8b4c5da6bb922851969adf9604b5accfb52a114e77ccdb",
+        "wx" : "0c25f1d166f3e211cdf042a26f8abf6094d48b8d17191d74ed717149274466999",
+        "wy" : "65d06dd6a88abfa49e8b4c5da6bb922851969adf9604b5accfb52a114e77ccdb"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c25f1d166f3e211cdf042a26f8abf6094d48b8d17191d74ed71714927446699965d06dd6a88abfa49e8b4c5da6bb922851969adf9604b5accfb52a114e77ccdb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwl8dFm8+IRzfBCom+Kv2CU1IuNFx\nkddO1xcUknRGaZll0G3WqIq/pJ6LTF2mu5IoUZaa35YEtazPtSoRTnfM2w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 630,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100edffbc270f722c243069a7e5f40335a61a58525c7b4db2e7a8e269274ffe4e1b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048fe5e88243a76e41a004236218a3c3a2d6eee398a23c3a0b008d7f0164cbc0ca98a20d1bdcf573513c7cfd9b83c63e3a82d40127c897697c86b8cb387af7f240",
+        "wx" : "08fe5e88243a76e41a004236218a3c3a2d6eee398a23c3a0b008d7f0164cbc0ca",
+        "wy" : "098a20d1bdcf573513c7cfd9b83c63e3a82d40127c897697c86b8cb387af7f240"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048fe5e88243a76e41a004236218a3c3a2d6eee398a23c3a0b008d7f0164cbc0ca98a20d1bdcf573513c7cfd9b83c63e3a82d40127c897697c86b8cb387af7f240",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEj+XogkOnbkGgBCNiGKPDotbu45ii\nPDoLAI1/AWTLwMqYog0b3PVzUTx8/ZuDxj46gtQBJ8iXaXyGuMs4evfyQA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 631,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100a25adcae105ed7ff4f95d2344e24ee523314c3e178525d007904b68919ba4d53",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0402148256b530fbc470c7b341970b38243ecee6d5a840a37beca2efb37e8dff2cc0adbea0882482a7489ca703a399864ba987eeb6ddb738af53a83573473cb30d",
+        "wx" : "2148256b530fbc470c7b341970b38243ecee6d5a840a37beca2efb37e8dff2c",
+        "wy" : "0c0adbea0882482a7489ca703a399864ba987eeb6ddb738af53a83573473cb30d"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000402148256b530fbc470c7b341970b38243ecee6d5a840a37beca2efb37e8dff2cc0adbea0882482a7489ca703a399864ba987eeb6ddb738af53a83573473cb30d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAhSCVrUw+8Rwx7NBlws4JD7O5tWo\nQKN77KLvs36N/yzArb6giCSCp0icpwOjmYZLqYfutt23OK9TqDVzRzyzDQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 632,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02202e4348c645707dce6760d773de3f3e87346924b2f64bd3dd0297e766b5805ebb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a34db012ce6eda1e9c7375c5fcf3e54ed698e19615124273b3a621d021c76f8e777458d6f55a364c221e39e1205d5510bb4fbb7ddf08d8d8fdde13d1d6df7f14",
+        "wx" : "0a34db012ce6eda1e9c7375c5fcf3e54ed698e19615124273b3a621d021c76f8e",
+        "wy" : "777458d6f55a364c221e39e1205d5510bb4fbb7ddf08d8d8fdde13d1d6df7f14"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a34db012ce6eda1e9c7375c5fcf3e54ed698e19615124273b3a621d021c76f8e777458d6f55a364c221e39e1205d5510bb4fbb7ddf08d8d8fdde13d1d6df7f14",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEo02wEs5u2h6cc3XF/PPlTtaY4ZYV\nEkJzs6Yh0CHHb453dFjW9Vo2TCIeOeEgXVUQu0+7fd8I2Nj93hPR1t9/FA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 633,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220348c673b07dce3920d773de3f3e87408869e916dbcf797d8f9684fb67753d1dc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b97af3fe78be15f2912b6271dd8a43badb6dd2a1b315b2ce7ae37b4e7778041d930d71ee1992d2466495c42102d08e81154c305307d1dcd52d0fa4c479b278e7",
+        "wx" : "0b97af3fe78be15f2912b6271dd8a43badb6dd2a1b315b2ce7ae37b4e7778041d",
+        "wy" : "0930d71ee1992d2466495c42102d08e81154c305307d1dcd52d0fa4c479b278e7"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b97af3fe78be15f2912b6271dd8a43badb6dd2a1b315b2ce7ae37b4e7778041d930d71ee1992d2466495c42102d08e81154c305307d1dcd52d0fa4c479b278e7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuXrz/ni+FfKRK2Jx3YpDuttt0qGz\nFbLOeuN7Tnd4BB2TDXHuGZLSRmSVxCEC0I6BFUwwUwfR3NUtD6TEebJ45w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 634,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02206918ce760fb9c7241aee7bc7e7d0e8110d3d22db79ef2fb1f2d09f6ceea7a3b8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0481e7198a3c3f23901cedc7a1d6eff6e9bf81108e6c35cd8559139af3135dbcbb9ef1568530291a8061b90c9f4285eefcba990d4570a4e3b7b737525b5d580034",
+        "wx" : "081e7198a3c3f23901cedc7a1d6eff6e9bf81108e6c35cd8559139af3135dbcbb",
+        "wy" : "09ef1568530291a8061b90c9f4285eefcba990d4570a4e3b7b737525b5d580034"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000481e7198a3c3f23901cedc7a1d6eff6e9bf81108e6c35cd8559139af3135dbcbb9ef1568530291a8061b90c9f4285eefcba990d4570a4e3b7b737525b5d580034",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEgecZijw/I5Ac7ceh1u/26b+BEI5s\nNc2FWROa8xNdvLue8VaFMCkagGG5DJ9Che78upkNRXCk47e3N1JbXVgANA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 635,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022073b3c694391d8eadde3f3e874089464715ac20e4c126bbf6d864d648969f5b5a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ab4d792ca121d1dba39cb9de645149c2ab573e8becc6ddff3cc9960f188ddf737f90ba23664153e93262ff73355415195858d7be1315a69456386de68285a3c8",
+        "wx" : "0ab4d792ca121d1dba39cb9de645149c2ab573e8becc6ddff3cc9960f188ddf73",
+        "wy" : "7f90ba23664153e93262ff73355415195858d7be1315a69456386de68285a3c8"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ab4d792ca121d1dba39cb9de645149c2ab573e8becc6ddff3cc9960f188ddf737f90ba23664153e93262ff73355415195858d7be1315a69456386de68285a3c8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEq015LKEh0dujnLneZFFJwqtXPovs\nxt3/PMmWDxiN33N/kLojZkFT6TJi/3M1VBUZWFjXvhMVppRWOG3mgoWjyA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 636,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bb07ac7a86948c2c2989a16db1930ef1b89ce112595197656877e53c41457f28",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04518412b69af43aae084476a68d59bbde51fbfa9e5be80563f587c9c2652f88ef2d3b90d25baa6bdb7b0c55e5240a3a98fbc24afed8523edec1c70503fc10f233",
+        "wx" : "518412b69af43aae084476a68d59bbde51fbfa9e5be80563f587c9c2652f88ef",
+        "wy" : "2d3b90d25baa6bdb7b0c55e5240a3a98fbc24afed8523edec1c70503fc10f233"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004518412b69af43aae084476a68d59bbde51fbfa9e5be80563f587c9c2652f88ef2d3b90d25baa6bdb7b0c55e5240a3a98fbc24afed8523edec1c70503fc10f233",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUYQStpr0Oq4IRHamjVm73lH7+p5b\n6AVj9YfJwmUviO8tO5DSW6pr23sMVeUkCjqY+8JK/thSPt7BxwUD/BDyMw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 637,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022027e4d82cb6c061dd9337c69bf9332ed3d198662d6f2299443f62c861187db648",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a08f14a644b9a935dffea4761ebaf592d1f66fe6cd373aa7f5d370af34f8352da54b5bc4025cf335900a914c2934ec2fec7a396d0a7affcad732a5741c7aaaf5",
+        "wx" : "0a08f14a644b9a935dffea4761ebaf592d1f66fe6cd373aa7f5d370af34f8352d",
+        "wy" : "0a54b5bc4025cf335900a914c2934ec2fec7a396d0a7affcad732a5741c7aaaf5"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a08f14a644b9a935dffea4761ebaf592d1f66fe6cd373aa7f5d370af34f8352da54b5bc4025cf335900a914c2934ec2fec7a396d0a7affcad732a5741c7aaaf5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEoI8UpkS5qTXf/qR2Hrr1ktH2b+bN\nNzqn9dNwrzT4NS2lS1vEAlzzNZAKkUwpNOwv7Ho5bQp6/8rXMqV0HHqq9Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 638,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100e7c5cf3aac2e88923b77850515fff6a12d13b356dfe9ec275c3dd81ae94609a4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ccf2296a6a89b62b90739d38af4ae3a20e9f45715b90044639241061e33f8f8caace0046491eeaa1c6e9a472b96d88f4af83e7ff1bb84438c7e058034412ae08",
+        "wx" : "0ccf2296a6a89b62b90739d38af4ae3a20e9f45715b90044639241061e33f8f8c",
+        "wy" : "0aace0046491eeaa1c6e9a472b96d88f4af83e7ff1bb84438c7e058034412ae08"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ccf2296a6a89b62b90739d38af4ae3a20e9f45715b90044639241061e33f8f8caace0046491eeaa1c6e9a472b96d88f4af83e7ff1bb84438c7e058034412ae08",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzPIpamqJtiuQc504r0rjog6fRXFb\nkARGOSQQYeM/j4yqzgBGSR7qocbppHK5bYj0r4Pn/xu4RDjH4FgDRBKuCA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 639,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100c77838df91c1e953e016e10bddffea2317f9fee32bacfe553cede9e57a748f68",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0494b0fc1525bcabf82b1f34895e5819a06c02b23e04002276e165f962c86e3927be7c2ab4d0b25303204fb32a1f8292902792225e16a6d2dbfb29fbc89a9c3376",
+        "wx" : "094b0fc1525bcabf82b1f34895e5819a06c02b23e04002276e165f962c86e3927",
+        "wy" : "0be7c2ab4d0b25303204fb32a1f8292902792225e16a6d2dbfb29fbc89a9c3376"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000494b0fc1525bcabf82b1f34895e5819a06c02b23e04002276e165f962c86e3927be7c2ab4d0b25303204fb32a1f8292902792225e16a6d2dbfb29fbc89a9c3376",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAElLD8FSW8q/grHzSJXlgZoGwCsj4E\nACJ24WX5YshuOSe+fCq00LJTAyBPsyofgpKQJ5IiXham0tv7KfvImpwzdg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 640,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0221008ef071c02383d2a6c02dc217bbffd446730d0318b0425e2586220907f885f97f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045351f37e1de0c88c508527d89882d183ccdcf2efca407edb0627cadfd16de6ec44b4b57cdf960d32ebcc4c97847eed218425853b5b675eb781b766a1a1300349",
+        "wx" : "5351f37e1de0c88c508527d89882d183ccdcf2efca407edb0627cadfd16de6ec",
+        "wy" : "44b4b57cdf960d32ebcc4c97847eed218425853b5b675eb781b766a1a1300349"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045351f37e1de0c88c508527d89882d183ccdcf2efca407edb0627cadfd16de6ec44b4b57cdf960d32ebcc4c97847eed218425853b5b675eb781b766a1a1300349",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEU1Hzfh3gyIxQhSfYmILRg8zc8u/K\nQH7bBifK39Ft5uxEtLV835YNMuvMTJeEfu0hhCWFO1tnXreBt2ahoTADSQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 641,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02205668aaa0b545bbf9a044a32399ffbe69ce20074e34d7bdf5cf56282a76976396",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04748bbafc320e6735cb64019710a269c6c2b5d147bdc831325cb2fb276ac971a69d655e9a755bc9d800ad21ee3fd4d980d93a7a49a8c5ccd37005177578f51163",
+        "wx" : "748bbafc320e6735cb64019710a269c6c2b5d147bdc831325cb2fb276ac971a6",
+        "wy" : "09d655e9a755bc9d800ad21ee3fd4d980d93a7a49a8c5ccd37005177578f51163"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004748bbafc320e6735cb64019710a269c6c2b5d147bdc831325cb2fb276ac971a69d655e9a755bc9d800ad21ee3fd4d980d93a7a49a8c5ccd37005177578f51163",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdIu6/DIOZzXLZAGXEKJpxsK10Ue9\nyDEyXLL7J2rJcaadZV6adVvJ2ACtIe4/1NmA2Tp6SajFzNNwBRd1ePURYw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 642,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100d12d6e56882f6c0027cae91a27127728f7fddf478fb4fdc2b65f40a60b0eb952",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0414b3bbd75c5e1c0c36535a934d4ab85112410b3b90fa97a31c33038964fd85cc112f7d837f8f9c36b460d636c965a5f818f2b50c5d00fb3f9705561dd6631883",
+        "wx" : "14b3bbd75c5e1c0c36535a934d4ab85112410b3b90fa97a31c33038964fd85cc",
+        "wy" : "112f7d837f8f9c36b460d636c965a5f818f2b50c5d00fb3f9705561dd6631883"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000414b3bbd75c5e1c0c36535a934d4ab85112410b3b90fa97a31c33038964fd85cc112f7d837f8f9c36b460d636c965a5f818f2b50c5d00fb3f9705561dd6631883",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFLO711xeHAw2U1qTTUq4URJBCzuQ\n+pejHDMDiWT9hcwRL32Df4+cNrRg1jbJZaX4GPK1DF0A+z+XBVYd1mMYgw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 643,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffffaaaaaaaaffffffffffffffffe9a2538f37b28a2c513dee40fecbb71a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d823533c04cd8edc6d6f950a8e08ade04a9bafa2f14a590356935671ae9305bf43178d1f88b6a57a96924c265f0ddb75b58312907b195acb59d7797303123775",
+        "wx" : "0d823533c04cd8edc6d6f950a8e08ade04a9bafa2f14a590356935671ae9305bf",
+        "wy" : "43178d1f88b6a57a96924c265f0ddb75b58312907b195acb59d7797303123775"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d823533c04cd8edc6d6f950a8e08ade04a9bafa2f14a590356935671ae9305bf43178d1f88b6a57a96924c265f0ddb75b58312907b195acb59d7797303123775",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE2CNTPATNjtxtb5UKjgit4Eqbr6Lx\nSlkDVpNWca6TBb9DF40fiLalepaSTCZfDdt1tYMSkHsZWstZ13lzAxI3dQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 644,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100b62f26b5f2a2b26f6de86d42ad8a13da3ab3cccd0459b201de009e526adf21f2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04db2b3408b3167d91030624c6328e8ce3ec108c105575c2f3d209b92e654bab69c34318139c50b0802c6e612f0fd3189d800df7c996d5d7b7c3d6be82836fa258",
+        "wx" : "0db2b3408b3167d91030624c6328e8ce3ec108c105575c2f3d209b92e654bab69",
+        "wy" : "0c34318139c50b0802c6e612f0fd3189d800df7c996d5d7b7c3d6be82836fa258"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004db2b3408b3167d91030624c6328e8ce3ec108c105575c2f3d209b92e654bab69c34318139c50b0802c6e612f0fd3189d800df7c996d5d7b7c3d6be82836fa258",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE2ys0CLMWfZEDBiTGMo6M4+wQjBBV\ndcLz0gm5LmVLq2nDQxgTnFCwgCxuYS8P0xidgA33yZbV17fD1r6Cg2+iWA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 645,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bb1d9ac949dd748cd02bbbe749bd351cd57b38bb61403d700686aa7b4c90851e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0409179ce7c59225392216453b2ac1e9d178c24837dfae26bc1dd7ab60638527425556b42e330289f3b826b2db7a86d19d45c2860a59f2be1ddcc3b691f95a9255",
+        "wx" : "09179ce7c59225392216453b2ac1e9d178c24837dfae26bc1dd7ab6063852742",
+        "wy" : "5556b42e330289f3b826b2db7a86d19d45c2860a59f2be1ddcc3b691f95a9255"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000409179ce7c59225392216453b2ac1e9d178c24837dfae26bc1dd7ab60638527425556b42e330289f3b826b2db7a86d19d45c2860a59f2be1ddcc3b691f95a9255",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECRec58WSJTkiFkU7KsHp0XjCSDff\nria8HderYGOFJ0JVVrQuMwKJ87gmstt6htGdRcKGClnyvh3cw7aR+VqSVQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 646,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022066755a00638cdaec1c732513ca0234ece52545dac11f816e818f725b4f60aaf2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401959fb8deda56e5467b7e4b214ea4c2d0c2fb29d70ff19b6b1eccebd6568d7ed9dbd77a918297fd970bff01e1343f6925167db5a14d098a211c39cc3a413398",
+        "wx" : "1959fb8deda56e5467b7e4b214ea4c2d0c2fb29d70ff19b6b1eccebd6568d7e",
+        "wy" : "0d9dbd77a918297fd970bff01e1343f6925167db5a14d098a211c39cc3a413398"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000401959fb8deda56e5467b7e4b214ea4c2d0c2fb29d70ff19b6b1eccebd6568d7ed9dbd77a918297fd970bff01e1343f6925167db5a14d098a211c39cc3a413398",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAZWfuN7aVuVGe35LIU6kwtDC+ynX\nD/Gbax7M69ZWjX7Z29d6kYKX/ZcL/wHhND9pJRZ9taFNCYohHDnMOkEzmA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 647,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022055a00c9fcdaebb6032513ca0234ecfffe98ebe492fdf02e48ca48e982beb3669",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04567f1fdc387e5350c852b4e8f8ba9d6d947e1c5dd7ccc61a5938245dd6bcab3a9960bebaf919514f9535c22eaaf0b5812857970e26662267b1f3eb1011130a11",
+        "wx" : "567f1fdc387e5350c852b4e8f8ba9d6d947e1c5dd7ccc61a5938245dd6bcab3a",
+        "wy" : "09960bebaf919514f9535c22eaaf0b5812857970e26662267b1f3eb1011130a11"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004567f1fdc387e5350c852b4e8f8ba9d6d947e1c5dd7ccc61a5938245dd6bcab3a9960bebaf919514f9535c22eaaf0b5812857970e26662267b1f3eb1011130a11",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEVn8f3Dh+U1DIUrTo+LqdbZR+HF3X\nzMYaWTgkXda8qzqZYL66+RlRT5U1wi6q8LWBKFeXDiZmImex8+sQERMKEQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 648,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ab40193f9b5d76c064a27940469d9fffd31d7c925fbe05c919491d3057d66cd2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043499f974ff4ca6bbb2f51682fd5f51762f9dd6dd2855262660b36d46d3e4bec2f498fae2487807e220119152f0122476c64d4fa46ddce85c4546630f0d5c5e81",
+        "wx" : "3499f974ff4ca6bbb2f51682fd5f51762f9dd6dd2855262660b36d46d3e4bec2",
+        "wy" : "0f498fae2487807e220119152f0122476c64d4fa46ddce85c4546630f0d5c5e81"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043499f974ff4ca6bbb2f51682fd5f51762f9dd6dd2855262660b36d46d3e4bec2f498fae2487807e220119152f0122476c64d4fa46ddce85c4546630f0d5c5e81",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENJn5dP9Mpruy9RaC/V9Rdi+d1t0o\nVSYmYLNtRtPkvsL0mPriSHgH4iARkVLwEiR2xk1PpG3c6FxFRmMPDVxegQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 649,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100ca0234ebb5fdcb13ca0234ecffffffffcb0dadbbc7f549f8a26b4408d0dc8600",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042c5c01662cf00c1929596257db13b26ecf30d0f3ec4b9f0351b0f27094473426e986a086060d086eee822ddd2fc744247a0154b57f7a69c51d9fdafa484e4ac7",
+        "wx" : "2c5c01662cf00c1929596257db13b26ecf30d0f3ec4b9f0351b0f27094473426",
+        "wy" : "0e986a086060d086eee822ddd2fc744247a0154b57f7a69c51d9fdafa484e4ac7"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042c5c01662cf00c1929596257db13b26ecf30d0f3ec4b9f0351b0f27094473426e986a086060d086eee822ddd2fc744247a0154b57f7a69c51d9fdafa484e4ac7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAELFwBZizwDBkpWWJX2xOybs8w0PPs\nS58DUbDycJRHNCbphqCGBg0Ibu6CLd0vx0QkegFUtX96acUdn9r6SE5Kxw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 650,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff3ea3677e082b9310572620ae19933a9e65b285598711c77298815ad3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0491d4cba813a04d86dbae94c23be6f52c15774183be7ba5b2d9f3cf010b160501900b8adfea6491019a9ac080d516025a541bf4b952b0ad7be4b1874b02fd544a",
+        "wx" : "091d4cba813a04d86dbae94c23be6f52c15774183be7ba5b2d9f3cf010b160501",
+        "wy" : "0900b8adfea6491019a9ac080d516025a541bf4b952b0ad7be4b1874b02fd544a"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000491d4cba813a04d86dbae94c23be6f52c15774183be7ba5b2d9f3cf010b160501900b8adfea6491019a9ac080d516025a541bf4b952b0ad7be4b1874b02fd544a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkdTLqBOgTYbbrpTCO+b1LBV3QYO+\ne6Wy2fPPAQsWBQGQC4rf6mSRAZqawIDVFgJaVBv0uVKwrXvksYdLAv1USg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 651,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220266666663bbbbbbbe6666666666666665b37902e023fab7c8f055d86e5cc41f4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ef7fd0a3a36386638330ecad41e1a3b302af36960831d0210c614b948e8aa124ef0d6d800e4047d6d3c1be0fdeaf11fcd8cab5ab59c730eb34116e35a8c7d098",
+        "wx" : "0ef7fd0a3a36386638330ecad41e1a3b302af36960831d0210c614b948e8aa124",
+        "wy" : "0ef0d6d800e4047d6d3c1be0fdeaf11fcd8cab5ab59c730eb34116e35a8c7d098"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ef7fd0a3a36386638330ecad41e1a3b302af36960831d0210c614b948e8aa124ef0d6d800e4047d6d3c1be0fdeaf11fcd8cab5ab59c730eb34116e35a8c7d098",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE73/Qo6NjhmODMOytQeGjswKvNpYI\nMdAhDGFLlI6KoSTvDW2ADkBH1tPBvg/erxH82Mq1q1nHMOs0EW41qMfQmA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 652,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff36db6db7a492492492492492146c573f4c6dfc8d08a443e258970b09",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a521dab13cc9152d8ca77035a607fea06c55cc3ca5dbeb868cea92eafe93df2a7bfb9b28531996635e6a5ccaa2826a406ce1111bdb9c2e0ca36500418a2f43de",
+        "wx" : "0a521dab13cc9152d8ca77035a607fea06c55cc3ca5dbeb868cea92eafe93df2a",
+        "wy" : "7bfb9b28531996635e6a5ccaa2826a406ce1111bdb9c2e0ca36500418a2f43de"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a521dab13cc9152d8ca77035a607fea06c55cc3ca5dbeb868cea92eafe93df2a7bfb9b28531996635e6a5ccaa2826a406ce1111bdb9c2e0ca36500418a2f43de",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEpSHasTzJFS2Mp3A1pgf+oGxVzDyl\n2+uGjOqS6v6T3yp7+5soUxmWY15qXMqigmpAbOERG9ucLgyjZQBBii9D3g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 653,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100bfffffff2aaaaaab7fffffffffffffffc815d0e60b3e596ecb1ad3a27cfd49c4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04474d58a4eec16e0d565f2187fe11d4e8e7a2683a12f38b4fc01d1237a81a10976e55f73bb7cdda46bdb67ef77f6fd2969df2b67920fb5945fde3a517a6ded4cd",
+        "wx" : "474d58a4eec16e0d565f2187fe11d4e8e7a2683a12f38b4fc01d1237a81a1097",
+        "wy" : "6e55f73bb7cdda46bdb67ef77f6fd2969df2b67920fb5945fde3a517a6ded4cd"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004474d58a4eec16e0d565f2187fe11d4e8e7a2683a12f38b4fc01d1237a81a10976e55f73bb7cdda46bdb67ef77f6fd2969df2b67920fb5945fde3a517a6ded4cd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAER01YpO7Bbg1WXyGH/hHU6OeiaDoS\n84tPwB0SN6gaEJduVfc7t83aRr22fvd/b9KWnfK2eSD7WUX946UXpt7UzQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 654,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207fffffff55555555ffffffffffffffffd344a71e6f651458a27bdc81fd976e37",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04692da5cd4309d9a6e5cb525c37da8fa0879f7b57208cdabbf47d223a5b23a62140e0daa78cfdd207a7389aaed61738b17fc5fc3e6a5ed3397d2902e9125e6ab4",
+        "wx" : "692da5cd4309d9a6e5cb525c37da8fa0879f7b57208cdabbf47d223a5b23a621",
+        "wy" : "40e0daa78cfdd207a7389aaed61738b17fc5fc3e6a5ed3397d2902e9125e6ab4"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004692da5cd4309d9a6e5cb525c37da8fa0879f7b57208cdabbf47d223a5b23a62140e0daa78cfdd207a7389aaed61738b17fc5fc3e6a5ed3397d2902e9125e6ab4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaS2lzUMJ2ably1JcN9qPoIefe1cg\njNq79H0iOlsjpiFA4NqnjP3SB6c4mq7WFzixf8X8Pmpe0zl9KQLpEl5qtA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 655,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02203fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192aa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0485689b3e0775c7718a90279f14a8082cfcd4d1f1679274f4e9b8805c570a0670167fcc5ca734552e09afa3640f4a034e15b9b7ca661ec7ff70d3f240ebe705b1",
+        "wx" : "085689b3e0775c7718a90279f14a8082cfcd4d1f1679274f4e9b8805c570a0670",
+        "wy" : "167fcc5ca734552e09afa3640f4a034e15b9b7ca661ec7ff70d3f240ebe705b1"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000485689b3e0775c7718a90279f14a8082cfcd4d1f1679274f4e9b8805c570a0670167fcc5ca734552e09afa3640f4a034e15b9b7ca661ec7ff70d3f240ebe705b1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhWibPgd1x3GKkCefFKgILPzU0fFn\nknT06biAXFcKBnAWf8xcpzRVLgmvo2QPSgNOFbm3ymYex/9w0/JA6+cFsQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 656,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02205d8ecd64a4eeba466815ddf3a4de9a8e6abd9c5db0a01eb80343553da648428f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040158137755b901f797a90d4ca8887e023cb2ef63b2ba2c0d455edaef42cf237e2a964fc00d377a8592b8b61aafa7a4aaa7c7b9fd2b41d6e0e17bd1ba5677edcd",
+        "wx" : "158137755b901f797a90d4ca8887e023cb2ef63b2ba2c0d455edaef42cf237e",
+        "wy" : "2a964fc00d377a8592b8b61aafa7a4aaa7c7b9fd2b41d6e0e17bd1ba5677edcd"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040158137755b901f797a90d4ca8887e023cb2ef63b2ba2c0d455edaef42cf237e2a964fc00d377a8592b8b61aafa7a4aaa7c7b9fd2b41d6e0e17bd1ba5677edcd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAVgTd1W5AfeXqQ1MqIh+Ajyy72Oy\nuiwNRV7a70LPI34qlk/ADTd6hZK4thqvp6Sqp8e5/StB1uDhe9G6VnftzQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 657,
+          "comment" : "point duplication during verification",
+          "msg" : "54657374",
+          "sig" : "304502206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022100f21d907e3890916dc4fa1f4703c1e50d3f54ddf7383e44023a41de562aa18ed8",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040158137755b901f797a90d4ca8887e023cb2ef63b2ba2c0d455edaef42cf237ed569b03ef2c8857b6d4749e550585b5558384603d4be291f1e842e45a9881232",
+        "wx" : "158137755b901f797a90d4ca8887e023cb2ef63b2ba2c0d455edaef42cf237e",
+        "wy" : "0d569b03ef2c8857b6d4749e550585b5558384603d4be291f1e842e45a9881232"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040158137755b901f797a90d4ca8887e023cb2ef63b2ba2c0d455edaef42cf237ed569b03ef2c8857b6d4749e550585b5558384603d4be291f1e842e45a9881232",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAVgTd1W5AfeXqQ1MqIh+Ajyy72Oy\nuiwNRV7a70LPI37VabA+8siFe21HSeVQWFtVWDhGA9S+KR8ehC5FqYgSMg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 658,
+          "comment" : "duplication bug",
+          "msg" : "54657374",
+          "sig" : "304502206f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569022100f21d907e3890916dc4fa1f4703c1e50d3f54ddf7383e44023a41de562aa18ed8",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0438a084ffccc4ae2f8204be2abca9fb8ad4ab283b2aa50f13b6bb2347adabc69ca699799b77b1cc6dad271e88b899c12931986e958e1f5cf5653dddf7389365e2",
+        "wx" : "38a084ffccc4ae2f8204be2abca9fb8ad4ab283b2aa50f13b6bb2347adabc69c",
+        "wy" : "0a699799b77b1cc6dad271e88b899c12931986e958e1f5cf5653dddf7389365e2"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000438a084ffccc4ae2f8204be2abca9fb8ad4ab283b2aa50f13b6bb2347adabc69ca699799b77b1cc6dad271e88b899c12931986e958e1f5cf5653dddf7389365e2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEOKCE/8zEri+CBL4qvKn7itSrKDsq\npQ8TtrsjR62rxpymmXmbd7HMba0nHoi4mcEpMZhulY4fXPVlPd33OJNl4g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 659,
+          "comment" : "point with x-coordinate 0",
+          "msg" : "54657374",
+          "sig" : "30250201010220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047a876fbf821d96c555c35393d3b2d2e809a6d839b0b115d964da3e919ef82504733dcf41d833b0530b87a7b1a52f7d91bfa19913f7151886913b160de07cd69b",
+        "wx" : "7a876fbf821d96c555c35393d3b2d2e809a6d839b0b115d964da3e919ef82504",
+        "wy" : "733dcf41d833b0530b87a7b1a52f7d91bfa19913f7151886913b160de07cd69b"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047a876fbf821d96c555c35393d3b2d2e809a6d839b0b115d964da3e919ef82504733dcf41d833b0530b87a7b1a52f7d91bfa19913f7151886913b160de07cd69b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEeodvv4IdlsVVw1OT07LS6Amm2Dmw\nsRXZZNo+kZ74JQRzPc9B2DOwUwuHp7GlL32Rv6GZE/cVGIaROxYN4HzWmw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 660,
+          "comment" : "point with x-coordinate 0",
+          "msg" : "54657374",
+          "sig" : "3045022101000000000000000000000000000000000000000000000000000000000000000002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04664ce273320d918d8bdb2e61201b4549b36b7cdc54e33b84adb6f2c10aac831e49e68831f18bda2973ac3d76bfbc8c5ee1cceed2dd862e2dc7c915c736cef1f4",
+        "wx" : "664ce273320d918d8bdb2e61201b4549b36b7cdc54e33b84adb6f2c10aac831e",
+        "wy" : "49e68831f18bda2973ac3d76bfbc8c5ee1cceed2dd862e2dc7c915c736cef1f4"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004664ce273320d918d8bdb2e61201b4549b36b7cdc54e33b84adb6f2c10aac831e49e68831f18bda2973ac3d76bfbc8c5ee1cceed2dd862e2dc7c915c736cef1f4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZkziczINkY2L2y5hIBtFSbNrfNxU\n4zuErbbywQqsgx5J5ogx8YvaKXOsPXa/vIxe4czu0t2GLi3HyRXHNs7x9A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 661,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "54657374",
+          "sig" : "30440220555555550000000055555555555555553ef7a8e48d07df81a693439654210c7002203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04961691a5e960d07a301dbbad4d86247ec27d7089faeb3ddd1add395efff1e0fe7254622cc371866cdf990d2c5377790e37d1f1519817f09a231bd260a9e78aeb",
+        "wx" : "0961691a5e960d07a301dbbad4d86247ec27d7089faeb3ddd1add395efff1e0fe",
+        "wy" : "7254622cc371866cdf990d2c5377790e37d1f1519817f09a231bd260a9e78aeb"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004961691a5e960d07a301dbbad4d86247ec27d7089faeb3ddd1add395efff1e0fe7254622cc371866cdf990d2c5377790e37d1f1519817f09a231bd260a9e78aeb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAElhaRpelg0HowHbutTYYkfsJ9cIn6\n6z3dGt05Xv/x4P5yVGIsw3GGbN+ZDSxTd3kON9HxUZgX8JojG9JgqeeK6w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 662,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "54657374",
+          "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699780220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045d283e13ce8ca60da868e3b0fb33e6b4f1074793274e2928250e71e2aca63e9c214dc74fa25371fb4d9e506d418ed9a1bfd6d0c8bb6591d3e0f44505a84886ce",
+        "wx" : "5d283e13ce8ca60da868e3b0fb33e6b4f1074793274e2928250e71e2aca63e9c",
+        "wy" : "214dc74fa25371fb4d9e506d418ed9a1bfd6d0c8bb6591d3e0f44505a84886ce"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045d283e13ce8ca60da868e3b0fb33e6b4f1074793274e2928250e71e2aca63e9c214dc74fa25371fb4d9e506d418ed9a1bfd6d0c8bb6591d3e0f44505a84886ce",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXSg+E86Mpg2oaOOw+zPmtPEHR5Mn\nTikoJQ5x4qymPpwhTcdPolNx+02eUG1Bjtmhv9bQyLtlkdPg9EUFqEiGzg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 663,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "304502207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022100b6db6db6249249254924924924924924625bd7a09bec4ca81bcdd9f8fd6b63cc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040fc351da038ae0803bd1d86514ae0462f9f8216551d9315aa9d297f792eef6a341c74eed786f2d33da35360ca7aa925e753f00d6077a1e9e5fc339d634019c73",
+        "wx" : "0fc351da038ae0803bd1d86514ae0462f9f8216551d9315aa9d297f792eef6a3",
+        "wy" : "41c74eed786f2d33da35360ca7aa925e753f00d6077a1e9e5fc339d634019c73"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040fc351da038ae0803bd1d86514ae0462f9f8216551d9315aa9d297f792eef6a341c74eed786f2d33da35360ca7aa925e753f00d6077a1e9e5fc339d634019c73",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAED8NR2gOK4IA70dhlFK4EYvn4IWVR\n2TFaqdKX95Lu9qNBx07teG8tM9o1NgynqpJedT8A1gd6Hp5fwznWNAGccw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 664,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "304502207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022100cccccccc00000000cccccccccccccccc971f2ef152794b9d8fc7d568c9e8eaa7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a1e34c8f16d138673fee55c080547c2bfd4de7550065f638322bba9430ce4b60662be9bb512663aa4d7df8ab3f3b4181c5d44a7bdf42436620b7d8a6b81ac936",
+        "wx" : "0a1e34c8f16d138673fee55c080547c2bfd4de7550065f638322bba9430ce4b60",
+        "wy" : "662be9bb512663aa4d7df8ab3f3b4181c5d44a7bdf42436620b7d8a6b81ac936"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a1e34c8f16d138673fee55c080547c2bfd4de7550065f638322bba9430ce4b60662be9bb512663aa4d7df8ab3f3b4181c5d44a7bdf42436620b7d8a6b81ac936",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEoeNMjxbROGc/7lXAgFR8K/1N51UA\nZfY4Miu6lDDOS2BmK+m7USZjqk19+Ks/O0GBxdRKe99CQ2Ygt9imuBrJNg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 665,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc4766997802203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aaa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047e1a8a8338d7fd8cf41d322a302d2078a87a23c7186150ed7cda6e52817c1bdfd0a9135a89d21ce821e29014b2898349254d748272b2d4eb8d59ee34c615377f",
+        "wx" : "7e1a8a8338d7fd8cf41d322a302d2078a87a23c7186150ed7cda6e52817c1bdf",
+        "wy" : "0d0a9135a89d21ce821e29014b2898349254d748272b2d4eb8d59ee34c615377f"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047e1a8a8338d7fd8cf41d322a302d2078a87a23c7186150ed7cda6e52817c1bdfd0a9135a89d21ce821e29014b2898349254d748272b2d4eb8d59ee34c615377f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEfhqKgzjX/Yz0HTIqMC0geKh6I8cY\nYVDtfNpuUoF8G9/QqRNaidIc6CHikBSyiYNJJU10gnKy1OuNWe40xhU3fw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 666,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022049249248db6db6dbb6db6db6db6db6db5a8b230d0b2b51dcd7ebf0c9fef7c185",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045c19fe227a61abc65c61ee7a018cc9571b2c6f663ea33583f76a686f64be078b7b4a0d734940f613d52bc48673b457c2cf78492490a5cc5606c0541d17b24ddb",
+        "wx" : "5c19fe227a61abc65c61ee7a018cc9571b2c6f663ea33583f76a686f64be078b",
+        "wy" : "7b4a0d734940f613d52bc48673b457c2cf78492490a5cc5606c0541d17b24ddb"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045c19fe227a61abc65c61ee7a018cc9571b2c6f663ea33583f76a686f64be078b7b4a0d734940f613d52bc48673b457c2cf78492490a5cc5606c0541d17b24ddb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXBn+Inphq8ZcYe56AYzJVxssb2Y+\nozWD92pob2S+B4t7Sg1zSUD2E9UrxIZztFfCz3hJJJClzFYGwFQdF7JN2w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 667,
+          "comment" : "extreme value for k",
+          "msg" : "54657374",
+          "sig" : "304402207cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978022016a4502e2781e11ac82cbc9d1edd8c981584d13e18411e2f6e0478c34416e3bb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04db02d1f3421d600e9d9ef9e47419dba3208eed08c2d4189a5db63abeb2739666e0ed26967b9ada9ed7ffe480827f90a0d210d5fd8ec628e31715e6b24125512a",
+        "wx" : "0db02d1f3421d600e9d9ef9e47419dba3208eed08c2d4189a5db63abeb2739666",
+        "wy" : "0e0ed26967b9ada9ed7ffe480827f90a0d210d5fd8ec628e31715e6b24125512a"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004db02d1f3421d600e9d9ef9e47419dba3208eed08c2d4189a5db63abeb2739666e0ed26967b9ada9ed7ffe480827f90a0d210d5fd8ec628e31715e6b24125512a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE2wLR80IdYA6dnvnkdBnboyCO7QjC\n1BiaXbY6vrJzlmbg7SaWe5rantf/5ICCf5Cg0hDV/Y7GKOMXFeayQSVRKg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 668,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "54657374",
+          "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2960220555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046222d1962655501893c29e441395b6c05711bd3ed5a0ef72cfab338b88229c4baaae079cb44a1af070362aaa520ee24cac2626423b0bf81af1c54311d8e2fd23",
+        "wx" : "6222d1962655501893c29e441395b6c05711bd3ed5a0ef72cfab338b88229c4b",
+        "wy" : "0aaae079cb44a1af070362aaa520ee24cac2626423b0bf81af1c54311d8e2fd23"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046222d1962655501893c29e441395b6c05711bd3ed5a0ef72cfab338b88229c4baaae079cb44a1af070362aaa520ee24cac2626423b0bf81af1c54311d8e2fd23",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYiLRliZVUBiTwp5EE5W2wFcRvT7V\noO9yz6szi4ginEuqrgectEoa8HA2KqpSDuJMrCYmQjsL+BrxxUMR2OL9Iw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 669,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "304502206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022100b6db6db6249249254924924924924924625bd7a09bec4ca81bcdd9f8fd6b63cc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044ccfa24c67f3def7fa81bc99c70bb0419c0952ba599f4c03361da184b04cdca5db76b797f7f41d9c729a2219478a7e629728df870800be8cf6ca7a0a82153bfa",
+        "wx" : "4ccfa24c67f3def7fa81bc99c70bb0419c0952ba599f4c03361da184b04cdca5",
+        "wy" : "0db76b797f7f41d9c729a2219478a7e629728df870800be8cf6ca7a0a82153bfa"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044ccfa24c67f3def7fa81bc99c70bb0419c0952ba599f4c03361da184b04cdca5db76b797f7f41d9c729a2219478a7e629728df870800be8cf6ca7a0a82153bfa",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETM+iTGfz3vf6gbyZxwuwQZwJUrpZ\nn0wDNh2hhLBM3KXbdreX9/QdnHKaIhlHin5ilyjfhwgAvoz2ynoKghU7+g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 670,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "304502206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022100cccccccc00000000cccccccccccccccc971f2ef152794b9d8fc7d568c9e8eaa7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ea1c72c91034036bac71402b6e9ecc4af3dbde7a99dc574061e99fefff9d84dab7dd057e75b78ac6f56e34eb048f0a9d29d5d055408c90d02bc2ea918c18cb63",
+        "wx" : "0ea1c72c91034036bac71402b6e9ecc4af3dbde7a99dc574061e99fefff9d84da",
+        "wy" : "0b7dd057e75b78ac6f56e34eb048f0a9d29d5d055408c90d02bc2ea918c18cb63"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ea1c72c91034036bac71402b6e9ecc4af3dbde7a99dc574061e99fefff9d84dab7dd057e75b78ac6f56e34eb048f0a9d29d5d055408c90d02bc2ea918c18cb63",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6hxyyRA0A2uscUArbp7MSvPb3nqZ\n3FdAYemf7/+dhNq33QV+dbeKxvVuNOsEjwqdKdXQVUCMkNArwuqRjBjLYw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 671,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29602203333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aaa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c2879a66d86cb20b820b7795da2da62b38924f7817d1cd350d936988e90e79bc5431a7268ff6931c7a759de024eff90bcb0177216db6fd1f3aaaa11fa3b6a083",
+        "wx" : "0c2879a66d86cb20b820b7795da2da62b38924f7817d1cd350d936988e90e79bc",
+        "wy" : "5431a7268ff6931c7a759de024eff90bcb0177216db6fd1f3aaaa11fa3b6a083"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c2879a66d86cb20b820b7795da2da62b38924f7817d1cd350d936988e90e79bc5431a7268ff6931c7a759de024eff90bcb0177216db6fd1f3aaaa11fa3b6a083",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwoeaZthssguCC3eV2i2mKziST3gX\n0c01DZNpiOkOebxUMacmj/aTHHp1neAk7/kLywF3IW22/R86qqEfo7aggw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 672,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022049249248db6db6dbb6db6db6db6db6db5a8b230d0b2b51dcd7ebf0c9fef7c185",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ab1c0f273f74abc2b848c75006f2ef3c54c26df27711b06558f455079aee0ba3df510f2ecef6d9a05997c776f14ad6456c179f0a13af1771e4d6c37fa48b47f2",
+        "wx" : "0ab1c0f273f74abc2b848c75006f2ef3c54c26df27711b06558f455079aee0ba3",
+        "wy" : "0df510f2ecef6d9a05997c776f14ad6456c179f0a13af1771e4d6c37fa48b47f2"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ab1c0f273f74abc2b848c75006f2ef3c54c26df27711b06558f455079aee0ba3df510f2ecef6d9a05997c776f14ad6456c179f0a13af1771e4d6c37fa48b47f2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEqxwPJz90q8K4SMdQBvLvPFTCbfJ3\nEbBlWPRVB5ruC6PfUQ8uzvbZoFmXx3bxStZFbBefChOvF3Hk1sN/pItH8g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 673,
+          "comment" : "extreme value for k",
+          "msg" : "54657374",
+          "sig" : "304402206b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296022016a4502e2781e11ac82cbc9d1edd8c981584d13e18411e2f6e0478c34416e3bb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5",
+        "wx" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
+        "wy" : "4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaxfR8uEsQkf4vOblY6RA8ncDfYEt\n6zOg9KE5RdiYwpZP40Li/hp/m47n60p8D54WK84zV2sxXs7LtkBoN79R9Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 674,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "30440220532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 675,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "3045022100acd155416a8b77f34089464733ff7cd39c400e9c69af7beb9eac5054ed2ec72c0220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a",
+        "wx" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
+        "wy" : "0b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaxfR8uEsQkf4vOblY6RA8ncDfYEt\n6zOg9KE5RdiYwpawHL0cAeWAZXEYFLWD8GHp1DHMqZTOoTE0Sb+XyECuCg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 676,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "30440220532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 677,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "3045022100acd155416a8b77f34089464733ff7cd39c400e9c69af7beb9eac5054ed2ec72c0220249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044bf4e52f958427ebb5915fb8c9595551b4d3a3fdab67badd9d6c3093f425ba43630df71f42f0eb7ceaa94d9f6448a85dd30331588249fd2fdc0b309ec7ed8481bc16f27800c13d7db700fc82e1b1c8545aa0c0d3b56e3bfe789fc18a916887c2",
+        "wx" : "4bf4e52f958427ebb5915fb8c9595551b4d3a3fdab67badd9d6c3093f425ba43630df71f42f0eb7ceaa94d9f6448a85d",
+        "wy" : "0d30331588249fd2fdc0b309ec7ed8481bc16f27800c13d7db700fc82e1b1c8545aa0c0d3b56e3bfe789fc18a916887c2"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200044bf4e52f958427ebb5915fb8c9595551b4d3a3fdab67badd9d6c3093f425ba43630df71f42f0eb7ceaa94d9f6448a85dd30331588249fd2fdc0b309ec7ed8481bc16f27800c13d7db700fc82e1b1c8545aa0c0d3b56e3bfe789fc18a916887c2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAES/TlL5WEJ+u1kV+4yVlVUbTTo/2rZ7rd\nnWwwk/QlukNjDfcfQvDrfOqpTZ9kSKhd0wMxWIJJ/S/cCzCex+2EgbwW8ngAwT19\ntwD8guGxyFRaoMDTtW47/nifwYqRaIfC\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 678,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "313233343030",
+          "sig" : "304d0218389cb27e0bc8d21fa7e5f24cb74f58851313e696333ad68b023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 679,
+          "comment" : "r too large",
+          "msg" : "313233343030",
+          "sig" : "3066023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffe023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52970",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043623bb296b88f626d0f92656bf016f115b721277ccb4930739bfbd81f9c1e734630e0685d32e154e0b4a5c62e43851f6768356b4a5764c128c7b1105e3d778a89d1e01da297ede1bc4312c2583e0bbddd21613583dd09ab895c63be479f94576",
+        "wx" : "3623bb296b88f626d0f92656bf016f115b721277ccb4930739bfbd81f9c1e734630e0685d32e154e0b4a5c62e43851f6",
+        "wy" : "768356b4a5764c128c7b1105e3d778a89d1e01da297ede1bc4312c2583e0bbddd21613583dd09ab895c63be479f94576"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200043623bb296b88f626d0f92656bf016f115b721277ccb4930739bfbd81f9c1e734630e0685d32e154e0b4a5c62e43851f6768356b4a5764c128c7b1105e3d778a89d1e01da297ede1bc4312c2583e0bbddd21613583dd09ab895c63be479f94576",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAENiO7KWuI9ibQ+SZWvwFvEVtyEnfMtJMH\nOb+9gfnB5zRjDgaF0y4VTgtKXGLkOFH2doNWtKV2TBKMexEF49d4qJ0eAdopft4b\nxDEsJYPgu93SFhNYPdCauJXGO+R5+UV2\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 680,
+          "comment" : "r,s are large",
+          "msg" : "313233343030",
+          "sig" : "3066023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52972023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52971",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d516cb8ac8e4457b693d5192beeb6ce7d9a46bef48eecf3ea823286f101f98d130f5a26dc6fec23662eff07f14486fd58456932e74894b7f0e3bb0dfd362502b3765dd80a3177209fb221dc9b51aaf4470b245391405bef514176b13a267a720",
+        "wx" : "0d516cb8ac8e4457b693d5192beeb6ce7d9a46bef48eecf3ea823286f101f98d130f5a26dc6fec23662eff07f14486fd5",
+        "wy" : "08456932e74894b7f0e3bb0dfd362502b3765dd80a3177209fb221dc9b51aaf4470b245391405bef514176b13a267a720"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004d516cb8ac8e4457b693d5192beeb6ce7d9a46bef48eecf3ea823286f101f98d130f5a26dc6fec23662eff07f14486fd58456932e74894b7f0e3bb0dfd362502b3765dd80a3177209fb221dc9b51aaf4470b245391405bef514176b13a267a720",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE1RbLisjkRXtpPVGSvuts59mka+9I7s8+\nqCMobxAfmNEw9aJtxv7CNmLv8H8USG/VhFaTLnSJS38OO7Df02JQKzdl3YCjF3IJ\n+yIdybUar0RwskU5FAW+9RQXaxOiZ6cg\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 681,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100d1aee55fdc2a716ba2fabcb57020b72e539bf05c7902f98e105bf83d4cc10c2a159a3cf7e01d749d2205f4da6bd8fcf1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a8380cd35026e13bf87be693cdb6e75a82d765b4019b529e8d277c4af6c9db27ebb5d3f86e88add9d5b61186f04c83a992a187507c737325d2cc624acef3cd036bfa99e0c1518be65c88bb51f900f94123acabad81d15130d3ade7ff7e4364e1",
+        "wx" : "0a8380cd35026e13bf87be693cdb6e75a82d765b4019b529e8d277c4af6c9db27ebb5d3f86e88add9d5b61186f04c83a9",
+        "wy" : "092a187507c737325d2cc624acef3cd036bfa99e0c1518be65c88bb51f900f94123acabad81d15130d3ade7ff7e4364e1"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004a8380cd35026e13bf87be693cdb6e75a82d765b4019b529e8d277c4af6c9db27ebb5d3f86e88add9d5b61186f04c83a992a187507c737325d2cc624acef3cd036bfa99e0c1518be65c88bb51f900f94123acabad81d15130d3ade7ff7e4364e1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEqDgM01Am4Tv4e+aTzbbnWoLXZbQBm1Ke\njSd8SvbJ2yfrtdP4boit2dW2EYbwTIOpkqGHUHxzcyXSzGJKzvPNA2v6meDBUYvm\nXIi7UfkA+UEjrKutgdFRMNOt5/9+Q2Th\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 682,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100b6b681dc484f4f020fd3f7e626d88edc6ded1b382ef3e143d60887b51394260832d4d8f2ef70458f9fa90e38c2e19e4f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04554f2fd0b700a9f4568752b673d9c0d29dc96c10fe67e38c6d6d339bfafe05f970da8c3d2164e82031307a44bd32251171312b61b59113ff0bd3b8a9a4934df262aa8096f840e9d8bffa5d7491ded87b38c496f9b9e4f0ba1089f8d3ffc88a9f",
+        "wx" : "554f2fd0b700a9f4568752b673d9c0d29dc96c10fe67e38c6d6d339bfafe05f970da8c3d2164e82031307a44bd322511",
+        "wy" : "71312b61b59113ff0bd3b8a9a4934df262aa8096f840e9d8bffa5d7491ded87b38c496f9b9e4f0ba1089f8d3ffc88a9f"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004554f2fd0b700a9f4568752b673d9c0d29dc96c10fe67e38c6d6d339bfafe05f970da8c3d2164e82031307a44bd32251171312b61b59113ff0bd3b8a9a4934df262aa8096f840e9d8bffa5d7491ded87b38c496f9b9e4f0ba1089f8d3ffc88a9f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEVU8v0LcAqfRWh1K2c9nA0p3JbBD+Z+OM\nbW0zm/r+Bflw2ow9IWToIDEwekS9MiURcTErYbWRE/8L07ippJNN8mKqgJb4QOnY\nv/pddJHe2Hs4xJb5ueTwuhCJ+NP/yIqf\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 683,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020102020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0444ee3335fa77d2fb02e4bd7074f45e598a879c0fa822ec718c21dc13b83440edc4e3c10a1858423e03044c9eff22591cd027c49933e5510557d6b4b2c6f66fe5dcb9302a3b13fdc68048c3fcac88ba152b6a9833c87fdc6280afc5d11ab7c107",
+        "wx" : "44ee3335fa77d2fb02e4bd7074f45e598a879c0fa822ec718c21dc13b83440edc4e3c10a1858423e03044c9eff22591c",
+        "wy" : "0d027c49933e5510557d6b4b2c6f66fe5dcb9302a3b13fdc68048c3fcac88ba152b6a9833c87fdc6280afc5d11ab7c107"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000444ee3335fa77d2fb02e4bd7074f45e598a879c0fa822ec718c21dc13b83440edc4e3c10a1858423e03044c9eff22591cd027c49933e5510557d6b4b2c6f66fe5dcb9302a3b13fdc68048c3fcac88ba152b6a9833c87fdc6280afc5d11ab7c107",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAERO4zNfp30vsC5L1wdPReWYqHnA+oIuxx\njCHcE7g0QO3E48EKGFhCPgMETJ7/Ilkc0CfEmTPlUQVX1rSyxvZv5dy5MCo7E/3G\ngEjD/KyIuhUrapgzyH/cYoCvxdEat8EH\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 684,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020102020102",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e2f87f72e3c66c73037fe77607d42ad2d9c4cc159893b4b9b8b0365d3a7766dbe8678b02e2b68f58e5a4f7681061a390e38f2142818542bef6b2bc3a2c4f43c95e5259d6bd5401531378c7ca125a1f6cc609d4fadfc5c9a99358ee77ff780c8d",
+        "wx" : "0e2f87f72e3c66c73037fe77607d42ad2d9c4cc159893b4b9b8b0365d3a7766dbe8678b02e2b68f58e5a4f7681061a390",
+        "wy" : "0e38f2142818542bef6b2bc3a2c4f43c95e5259d6bd5401531378c7ca125a1f6cc609d4fadfc5c9a99358ee77ff780c8d"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004e2f87f72e3c66c73037fe77607d42ad2d9c4cc159893b4b9b8b0365d3a7766dbe8678b02e2b68f58e5a4f7681061a390e38f2142818542bef6b2bc3a2c4f43c95e5259d6bd5401531378c7ca125a1f6cc609d4fadfc5c9a99358ee77ff780c8d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE4vh/cuPGbHMDf+d2B9Qq0tnEzBWYk7S5\nuLA2XTp3ZtvoZ4sC4raPWOWk92gQYaOQ448hQoGFQr72srw6LE9DyV5SWda9VAFT\nE3jHyhJaH2zGCdT638XJqZNY7nf/eAyN\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 685,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020102020103",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 686,
+          "comment" : "r is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3036023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52975020103",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0405e67c44fc0cbc9a8eb343b4d6f596c7d00cac5da8594caf45b7209397496214c42d856a015ce589bc9ba865a4fab5ab88a01c7b5d09efaf878fcb9102fb3875a8381af234d1c593076e452225a56f51674f347126d3009b44dcbb003a64d95f",
+        "wx" : "5e67c44fc0cbc9a8eb343b4d6f596c7d00cac5da8594caf45b7209397496214c42d856a015ce589bc9ba865a4fab5ab",
+        "wy" : "088a01c7b5d09efaf878fcb9102fb3875a8381af234d1c593076e452225a56f51674f347126d3009b44dcbb003a64d95f"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000405e67c44fc0cbc9a8eb343b4d6f596c7d00cac5da8594caf45b7209397496214c42d856a015ce589bc9ba865a4fab5ab88a01c7b5d09efaf878fcb9102fb3875a8381af234d1c593076e452225a56f51674f347126d3009b44dcbb003a64d95f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEBeZ8RPwMvJqOs0O01vWWx9AMrF2oWUyv\nRbcgk5dJYhTELYVqAVzlibybqGWk+rWriKAce10J76+Hj8uRAvs4dag4GvI00cWT\nB25FIiWlb1FnTzRxJtMAm0TcuwA6ZNlf\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 687,
+          "comment" : "s is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3036020102023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accd7fffa",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040bb03fce3c01ebcf0873abd134a8682f5fb8dbffa22da674047e5c3e71e43de582ed6abb908c2e4faa5d96186278b6c1ba3b22123e68ccc56f17dd79ff15565706f71a0b6123c77af3cd88f0af024cc5259781516edcaf5fe990646e7b66999d",
+        "wx" : "0bb03fce3c01ebcf0873abd134a8682f5fb8dbffa22da674047e5c3e71e43de582ed6abb908c2e4faa5d96186278b6c1",
+        "wy" : "0ba3b22123e68ccc56f17dd79ff15565706f71a0b6123c77af3cd88f0af024cc5259781516edcaf5fe990646e7b66999d"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200040bb03fce3c01ebcf0873abd134a8682f5fb8dbffa22da674047e5c3e71e43de582ed6abb908c2e4faa5d96186278b6c1ba3b22123e68ccc56f17dd79ff15565706f71a0b6123c77af3cd88f0af024cc5259781516edcaf5fe990646e7b66999d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEC7A/zjwB688Ic6vRNKhoL1+42/+iLaZ0\nBH5cPnHkPeWC7Wq7kIwuT6pdlhhieLbBujsiEj5ozMVvF915/xVWVwb3GgthI8d6\n882I8K8CTMUll4FRbtyvX+mQZG57Zpmd\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 688,
+          "comment" : "small r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3036020201000230489122448912244891224489122448912244891224489122347ce79bc437f4d071aaa92c7d6c882ae8734dc18cb0d553",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0458f246090d5e49863bc0bf2d501ff72f551c5f1c5e679eb49064fd02e221a2707326ec2d140bcc817afaad5065761566497c823fd736882cbf78fb92b1a5589b67e8067497c710a4cbb39dee2c5431bc45cfb96c9f8454385c9f2b3ef2d3d31a",
+        "wx" : "58f246090d5e49863bc0bf2d501ff72f551c5f1c5e679eb49064fd02e221a2707326ec2d140bcc817afaad5065761566",
+        "wy" : "497c823fd736882cbf78fb92b1a5589b67e8067497c710a4cbb39dee2c5431bc45cfb96c9f8454385c9f2b3ef2d3d31a"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000458f246090d5e49863bc0bf2d501ff72f551c5f1c5e679eb49064fd02e221a2707326ec2d140bcc817afaad5065761566497c823fd736882cbf78fb92b1a5589b67e8067497c710a4cbb39dee2c5431bc45cfb96c9f8454385c9f2b3ef2d3d31a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEWPJGCQ1eSYY7wL8tUB/3L1UcXxxeZ560\nkGT9AuIhonBzJuwtFAvMgXr6rVBldhVmSXyCP9c2iCy/ePuSsaVYm2foBnSXxxCk\ny7Od7ixUMbxFz7lsn4RUOFyfKz7y09Ma\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 689,
+          "comment" : "smallish r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303c02072d9b4d347952cd023100ce751512561b6f57c75342848a3ff98ccf9c3f0219b6b68d00449e6c971a85d2e2ce73554b59219d54d2083b46327351",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fc6984dd6830d1485fb2581a45a791d8dca2c727c73d3d44c89f0082c1868af5ca74b4ca4ae22802640a9ebfe8c7ae12998d63a5b5ad1b72b899f0b132e4952aaa19d41fdeea48b1ed6b8358dd1db207fd66e01453ad40f67b836adc802d5fe8",
+        "wx" : "0fc6984dd6830d1485fb2581a45a791d8dca2c727c73d3d44c89f0082c1868af5ca74b4ca4ae22802640a9ebfe8c7ae12",
+        "wy" : "0998d63a5b5ad1b72b899f0b132e4952aaa19d41fdeea48b1ed6b8358dd1db207fd66e01453ad40f67b836adc802d5fe8"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004fc6984dd6830d1485fb2581a45a791d8dca2c727c73d3d44c89f0082c1868af5ca74b4ca4ae22802640a9ebfe8c7ae12998d63a5b5ad1b72b899f0b132e4952aaa19d41fdeea48b1ed6b8358dd1db207fd66e01453ad40f67b836adc802d5fe8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE/GmE3Wgw0UhfslgaRaeR2NyixyfHPT1E\nyJ8AgsGGivXKdLTKSuIoAmQKnr/ox64SmY1jpbWtG3K4mfCxMuSVKqoZ1B/e6kix\n7WuDWN0dsgf9ZuAUU61A9nuDatyALV/o\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 690,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "313233343030",
+          "sig" : "3041020d1033e67e37b32b445580bf4efb02302ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad52ad5215c51b320e460542f9cc38968ccdf4263684004eb79a452",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041b8def5922303d647e8eb07e3bad92f924b79b769eef168e7541de1f4e0d28ae9733eb98cf8a1fb6dd52ca02c8c75b51c7aa4bf679d49d8114122074da8f6044a427371796a5654a6106162d5f686abb73ebd896ab08c7062687f12171fbe4a3",
+        "wx" : "1b8def5922303d647e8eb07e3bad92f924b79b769eef168e7541de1f4e0d28ae9733eb98cf8a1fb6dd52ca02c8c75b51",
+        "wy" : "0c7aa4bf679d49d8114122074da8f6044a427371796a5654a6106162d5f686abb73ebd896ab08c7062687f12171fbe4a3"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200041b8def5922303d647e8eb07e3bad92f924b79b769eef168e7541de1f4e0d28ae9733eb98cf8a1fb6dd52ca02c8c75b51c7aa4bf679d49d8114122074da8f6044a427371796a5654a6106162d5f686abb73ebd896ab08c7062687f12171fbe4a3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEG43vWSIwPWR+jrB+O62S+SS3m3ae7xaO\ndUHeH04NKK6XM+uYz4oftt1SygLIx1tRx6pL9nnUnYEUEiB02o9gRKQnNxeWpWVK\nYQYWLV9oartz69iWqwjHBiaH8SFx++Sj\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 691,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "313233343030",
+          "sig" : "303602020100023077a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041734a039a88a16c2ff4aa97d2399121f56f52ef01ed5e50887f736f65b6e51d6e8786abb4e063da5d1ba812dff998403ccd698e6c296d5cd69178f8a82481a865da331627f1c4b324fbc02b36e8b5ed58a31f728e904d203a388755302195765",
+        "wx" : "1734a039a88a16c2ff4aa97d2399121f56f52ef01ed5e50887f736f65b6e51d6e8786abb4e063da5d1ba812dff998403",
+        "wy" : "0ccd698e6c296d5cd69178f8a82481a865da331627f1c4b324fbc02b36e8b5ed58a31f728e904d203a388755302195765"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200041734a039a88a16c2ff4aa97d2399121f56f52ef01ed5e50887f736f65b6e51d6e8786abb4e063da5d1ba812dff998403ccd698e6c296d5cd69178f8a82481a865da331627f1c4b324fbc02b36e8b5ed58a31f728e904d203a388755302195765",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEFzSgOaiKFsL/Sql9I5kSH1b1LvAe1eUI\nh/c29ltuUdboeGq7TgY9pdG6gS3/mYQDzNaY5sKW1c1pF4+Kgkgahl2jMWJ/HEsy\nT7wCs26LXtWKMfco6QTSA6OIdVMCGVdl\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 692,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3041020d062522bbd3ecbe7c39e93e7c24023077a172dfe37a2c53f0b92ab60f0a8f085f49dbfd930719d6f9e587ea68ae57cb49cd35a88cf8c6acec02f057a3807a5b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0452ca47dda99172cb8321495acf988548295988ec973c1b4ea9462c53e5768a704a936410ee847b5dbf1e9d0c131da6c787a47027e6655792eb002d4228ee72f7c814c9a0cecbff267948f81c9903ac10eb35f6cb86369224ed609811cdf390f4",
+        "wx" : "52ca47dda99172cb8321495acf988548295988ec973c1b4ea9462c53e5768a704a936410ee847b5dbf1e9d0c131da6c7",
+        "wy" : "087a47027e6655792eb002d4228ee72f7c814c9a0cecbff267948f81c9903ac10eb35f6cb86369224ed609811cdf390f4"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000452ca47dda99172cb8321495acf988548295988ec973c1b4ea9462c53e5768a704a936410ee847b5dbf1e9d0c131da6c787a47027e6655792eb002d4228ee72f7c814c9a0cecbff267948f81c9903ac10eb35f6cb86369224ed609811cdf390f4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEUspH3amRcsuDIUlaz5iFSClZiOyXPBtO\nqUYsU+V2inBKk2QQ7oR7Xb8enQwTHabHh6RwJ+ZlV5LrAC1CKO5y98gUyaDOy/8m\neUj4HJkDrBDrNfbLhjaSJO1gmBHN85D0\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 693,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "313233343030",
+          "sig" : "3065023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc528f3023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bd3d91f003e18adbea73079d4eba23b91fc17fcec14c9eb15a193fbc9ca39c8c747cd7a2c9623e05dd587ccbb8ab4c443adb0a0706aa5ea7a68042082fccefc979612a7a1a3d694b00793b03f89bff866a8b97c8e77990c29360ce795036c764",
+        "wx" : "0bd3d91f003e18adbea73079d4eba23b91fc17fcec14c9eb15a193fbc9ca39c8c747cd7a2c9623e05dd587ccbb8ab4c44",
+        "wy" : "3adb0a0706aa5ea7a68042082fccefc979612a7a1a3d694b00793b03f89bff866a8b97c8e77990c29360ce795036c764"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004bd3d91f003e18adbea73079d4eba23b91fc17fcec14c9eb15a193fbc9ca39c8c747cd7a2c9623e05dd587ccbb8ab4c443adb0a0706aa5ea7a68042082fccefc979612a7a1a3d694b00793b03f89bff866a8b97c8e77990c29360ce795036c764",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEvT2R8APhitvqcwedTrojuR/Bf87BTJ6x\nWhk/vJyjnIx0fNeiyWI+Bd1YfMu4q0xEOtsKBwaqXqemgEIIL8zvyXlhKnoaPWlL\nAHk7A/ib/4Zqi5fI53mQwpNgznlQNsdk\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 694,
+          "comment" : "s == 1",
+          "msg" : "313233343030",
+          "sig" : "3035023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 695,
+          "comment" : "s == 0",
+          "msg" : "313233343030",
+          "sig" : "3035023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f896353cc3a8afdd543ec3aef062ca97bc32ed1724ea38b940b8c0ea0e23b34187afbe70daf8dbaa5b511557e5d2bddac4bd265da67ceeafca636f6f4c0472f22a9d02e2289184f73bbb700ae8fc921eff4920f290bfcb49fbb232cc13a21028",
+        "wx" : "0f896353cc3a8afdd543ec3aef062ca97bc32ed1724ea38b940b8c0ea0e23b34187afbe70daf8dbaa5b511557e5d2bdda",
+        "wy" : "0c4bd265da67ceeafca636f6f4c0472f22a9d02e2289184f73bbb700ae8fc921eff4920f290bfcb49fbb232cc13a21028"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004f896353cc3a8afdd543ec3aef062ca97bc32ed1724ea38b940b8c0ea0e23b34187afbe70daf8dbaa5b511557e5d2bddac4bd265da67ceeafca636f6f4c0472f22a9d02e2289184f73bbb700ae8fc921eff4920f290bfcb49fbb232cc13a21028",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE+JY1PMOor91UPsOu8GLKl7wy7Rck6ji5\nQLjA6g4js0GHr75w2vjbqltRFVfl0r3axL0mXaZ87q/KY29vTARy8iqdAuIokYT3\nO7twCuj8kh7/SSDykL/LSfuyMswTohAo\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 696,
+          "comment" : "point at infinity during verify",
+          "msg" : "313233343030",
+          "sig" : "306402307fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294b9023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043ecfd58a3ce583866e0471d16eb3c10a411ec3b8671f3a04769b1ed8464a71cf1c76d8d9b7e3670bbe712d6f554a9383d980d8bedf57470d6b45cc1ad0c6426dc70a0e4be901106a36663bfcab04fcb86008777b92445120d5e3641d97396362",
+        "wx" : "3ecfd58a3ce583866e0471d16eb3c10a411ec3b8671f3a04769b1ed8464a71cf1c76d8d9b7e3670bbe712d6f554a9383",
+        "wy" : "0d980d8bedf57470d6b45cc1ad0c6426dc70a0e4be901106a36663bfcab04fcb86008777b92445120d5e3641d97396362"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200043ecfd58a3ce583866e0471d16eb3c10a411ec3b8671f3a04769b1ed8464a71cf1c76d8d9b7e3670bbe712d6f554a9383d980d8bedf57470d6b45cc1ad0c6426dc70a0e4be901106a36663bfcab04fcb86008777b92445120d5e3641d97396362",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEPs/Vijzlg4ZuBHHRbrPBCkEew7hnHzoE\ndpse2EZKcc8cdtjZt+NnC75xLW9VSpOD2YDYvt9XRw1rRcwa0MZCbccKDkvpARBq\nNmY7/KsE/LhgCHd7kkRRINXjZB2XOWNi\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 697,
+          "comment" : "u1 == 1",
+          "msg" : "313233343030",
+          "sig" : "3065023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044150ccd0fa45aa2ef6b5042ddbb1b87c5ffd1115a8fe5995641948acda82a7b190762d84352cd74d1ca01e79f68f9cb4eb11be9d494c181c156e23e77e532bdf0a20c3cc74ba8c29b1f3eb2bd99129ee0d70ff0d593f0d7a6d6887e7c55930d2",
+        "wx" : "4150ccd0fa45aa2ef6b5042ddbb1b87c5ffd1115a8fe5995641948acda82a7b190762d84352cd74d1ca01e79f68f9cb4",
+        "wy" : "0eb11be9d494c181c156e23e77e532bdf0a20c3cc74ba8c29b1f3eb2bd99129ee0d70ff0d593f0d7a6d6887e7c55930d2"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200044150ccd0fa45aa2ef6b5042ddbb1b87c5ffd1115a8fe5995641948acda82a7b190762d84352cd74d1ca01e79f68f9cb4eb11be9d494c181c156e23e77e532bdf0a20c3cc74ba8c29b1f3eb2bd99129ee0d70ff0d593f0d7a6d6887e7c55930d2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEQVDM0PpFqi72tQQt27G4fF/9ERWo/lmV\nZBlIrNqCp7GQdi2ENSzXTRygHnn2j5y06xG+nUlMGBwVbiPnflMr3wogw8x0uowp\nsfPrK9mRKe4NcP8NWT8Nem1oh+fFWTDS\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 698,
+          "comment" : "u1 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec63260230064ed80f27e1432e84845f15ece399f2cbf4fa31aa837de9b953d44413b9f5c7c7f67989d703f07abef11b6ad0373ea5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e78fe2c11beac7090ee0af7fed469a8ccebd3cccc4ee9fccc8ef3fc0455b69aaa082dc13e1d84f34026cb6f0af9e992ff34ebba71bf3a4050bf28e4084b5c5f5d4098ec46f10a31b02fb4bf20cc9362f6f02a66e802f817507535fac3ec0b099",
+        "wx" : "0e78fe2c11beac7090ee0af7fed469a8ccebd3cccc4ee9fccc8ef3fc0455b69aaa082dc13e1d84f34026cb6f0af9e992f",
+        "wy" : "0f34ebba71bf3a4050bf28e4084b5c5f5d4098ec46f10a31b02fb4bf20cc9362f6f02a66e802f817507535fac3ec0b099"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004e78fe2c11beac7090ee0af7fed469a8ccebd3cccc4ee9fccc8ef3fc0455b69aaa082dc13e1d84f34026cb6f0af9e992ff34ebba71bf3a4050bf28e4084b5c5f5d4098ec46f10a31b02fb4bf20cc9362f6f02a66e802f817507535fac3ec0b099",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE54/iwRvqxwkO4K9/7UaajM69PMzE7p/M\nyO8/wEVbaaqggtwT4dhPNAJstvCvnpkv8067pxvzpAUL8o5AhLXF9dQJjsRvEKMb\nAvtL8gzJNi9vAqZugC+BdQdTX6w+wLCZ\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 699,
+          "comment" : "u2 == 1",
+          "msg" : "313233343030",
+          "sig" : "3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ee24ab8a34d05af684939357f32759cc5a14f3c717529a20aea8e0c5965d8a41e68925f688471994b72021ba51b28c090a55693c92ad0cbae9edcf515e2b4c060b888d82c81e4a3b6a173b62ed04a46fa95db1a2f3949980fba2e371263c4fa9",
+        "wx" : "0ee24ab8a34d05af684939357f32759cc5a14f3c717529a20aea8e0c5965d8a41e68925f688471994b72021ba51b28c09",
+        "wy" : "0a55693c92ad0cbae9edcf515e2b4c060b888d82c81e4a3b6a173b62ed04a46fa95db1a2f3949980fba2e371263c4fa9"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004ee24ab8a34d05af684939357f32759cc5a14f3c717529a20aea8e0c5965d8a41e68925f688471994b72021ba51b28c090a55693c92ad0cbae9edcf515e2b4c060b888d82c81e4a3b6a173b62ed04a46fa95db1a2f3949980fba2e371263c4fa9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE7iSrijTQWvaEk5NX8ydZzFoU88cXUpog\nrqjgxZZdikHmiSX2iEcZlLcgIbpRsowJClVpPJKtDLrp7c9RXitMBguIjYLIHko7\nahc7Yu0EpG+pXbGi85SZgPui43EmPE+p\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 700,
+          "comment" : "u2 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "3065023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa84ecde56a2cf73ea3abc092185cb1a51f34810f1ddd8c64d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043d2e916055c92e1b36133f5937b37c1b0102834eb77008a3ba9c3da446e9065971d68ba913091851e10cff5b4cd875c139aa7aadfc2caf7107b17ae1aea8b299d61bf15aca0cb3fd6f1ffde8192bfe58f0822bbbc1f55bddf6b4fe9c8f2b0eac",
+        "wx" : "3d2e916055c92e1b36133f5937b37c1b0102834eb77008a3ba9c3da446e9065971d68ba913091851e10cff5b4cd875c1",
+        "wy" : "39aa7aadfc2caf7107b17ae1aea8b299d61bf15aca0cb3fd6f1ffde8192bfe58f0822bbbc1f55bddf6b4fe9c8f2b0eac"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200043d2e916055c92e1b36133f5937b37c1b0102834eb77008a3ba9c3da446e9065971d68ba913091851e10cff5b4cd875c139aa7aadfc2caf7107b17ae1aea8b299d61bf15aca0cb3fd6f1ffde8192bfe58f0822bbbc1f55bddf6b4fe9c8f2b0eac",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEPS6RYFXJLhs2Ez9ZN7N8GwECg063cAij\nupw9pEbpBllx1oupEwkYUeEM/1tM2HXBOap6rfwsr3EHsXrhrqiymdYb8VrKDLP9\nbx/96Bkr/ljwgiu7wfVb3fa0/pyPKw6s\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 701,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0230533b0d50480a3ef07e7e8af8b1097759bc03ac9a1c7ed6075a052869f57f12b285613162d08ee7aab9fe54aaa984a39a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ae596697427aa250156c05ac4338e48980a7f093ea1f1fe67098b43f6539c1b20ae74338f9bf270d33663c50abe8fd001ca6a52732db74ab15d2f249a3d839080f898367dfd64992cdce2708deaad523a2a236b43400424241c91a35b530fa50",
+        "wx" : "0ae596697427aa250156c05ac4338e48980a7f093ea1f1fe67098b43f6539c1b20ae74338f9bf270d33663c50abe8fd00",
+        "wy" : "1ca6a52732db74ab15d2f249a3d839080f898367dfd64992cdce2708deaad523a2a236b43400424241c91a35b530fa50"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004ae596697427aa250156c05ac4338e48980a7f093ea1f1fe67098b43f6539c1b20ae74338f9bf270d33663c50abe8fd001ca6a52732db74ab15d2f249a3d839080f898367dfd64992cdce2708deaad523a2a236b43400424241c91a35b530fa50",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAErllml0J6olAVbAWsQzjkiYCn8JPqHx/m\ncJi0P2U5wbIK50M4+b8nDTNmPFCr6P0AHKalJzLbdKsV0vJJo9g5CA+Jg2ff1kmS\nzc4nCN6q1SOioja0NABCQkHJGjW1MPpQ\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 702,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100d49a253986bbaa8ce9c3d3808313d39c3b950a478372edc009bc0566b73be7b05dad0737e16960257cc16db6ec6c620f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0488738f9981dd4d1fabb60ad83c2dd6dfc9da302209ae3e53498a883b6e39a38bead9b02709f352d3e6b6578154eab2529388a05c6b9f3a4028abb9950a51f5264ecd7580a423fdec9472faeeb57f92e31c46bef2a781fe5edad026009f198262",
+        "wx" : "088738f9981dd4d1fabb60ad83c2dd6dfc9da302209ae3e53498a883b6e39a38bead9b02709f352d3e6b6578154eab252",
+        "wy" : "09388a05c6b9f3a4028abb9950a51f5264ecd7580a423fdec9472faeeb57f92e31c46bef2a781fe5edad026009f198262"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000488738f9981dd4d1fabb60ad83c2dd6dfc9da302209ae3e53498a883b6e39a38bead9b02709f352d3e6b6578154eab2529388a05c6b9f3a4028abb9950a51f5264ecd7580a423fdec9472faeeb57f92e31c46bef2a781fe5edad026009f198262",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEiHOPmYHdTR+rtgrYPC3W38naMCIJrj5T\nSYqIO245o4vq2bAnCfNS0+a2V4FU6rJSk4igXGufOkAoq7mVClH1Jk7NdYCkI/3s\nlHL67rV/kuMcRr7yp4H+XtrQJgCfGYJi\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 703,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0230285090b0d6a6820bbba394efbee5c24a2281e825d2f6c55fb7a85b8251db00f75ab07cc993ceaf664f3c116baf34b021",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f421541311c94fdd79fc298f8ab1a3adfd08029fdad439a94d4cea11f7e799bc439609f2fb7be3f349d55e484d0a0d36b35330bbdbec1e75f2984483d96bf210d722c1830292ffc35a2f6a21a4b50519f565f024bbccc97228a2f8ad8fadc0d5",
+        "wx" : "0f421541311c94fdd79fc298f8ab1a3adfd08029fdad439a94d4cea11f7e799bc439609f2fb7be3f349d55e484d0a0d36",
+        "wy" : "0b35330bbdbec1e75f2984483d96bf210d722c1830292ffc35a2f6a21a4b50519f565f024bbccc97228a2f8ad8fadc0d5"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004f421541311c94fdd79fc298f8ab1a3adfd08029fdad439a94d4cea11f7e799bc439609f2fb7be3f349d55e484d0a0d36b35330bbdbec1e75f2984483d96bf210d722c1830292ffc35a2f6a21a4b50519f565f024bbccc97228a2f8ad8fadc0d5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE9CFUExHJT915/CmPirGjrf0IAp/a1Dmp\nTUzqEffnmbxDlgny+3vj80nVXkhNCg02s1Mwu9vsHnXymESD2WvyENciwYMCkv/D\nWi9qIaS1BRn1ZfAku8zJciii+K2PrcDV\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 704,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100b39af4a81ee4ae79064ed80f27e1432e84845f15ece399f2a43d2505a0a8c72c5731f4fd967420b1000e3f75502ed7b7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04399be4cfc439f94f2421cbd34c2cd90bae53eb60ddfafca52f7275d165d14fa659b636713b5d4b39e62fd48bae141d0e1b23e3b4f0c202ed7b59db78a35c12ac698c603eab144fd09ac2ed8f4495f607e4d2c87a23ce2ec33e410ca47ecc2555",
+        "wx" : "399be4cfc439f94f2421cbd34c2cd90bae53eb60ddfafca52f7275d165d14fa659b636713b5d4b39e62fd48bae141d0e",
+        "wy" : "1b23e3b4f0c202ed7b59db78a35c12ac698c603eab144fd09ac2ed8f4495f607e4d2c87a23ce2ec33e410ca47ecc2555"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004399be4cfc439f94f2421cbd34c2cd90bae53eb60ddfafca52f7275d165d14fa659b636713b5d4b39e62fd48bae141d0e1b23e3b4f0c202ed7b59db78a35c12ac698c603eab144fd09ac2ed8f4495f607e4d2c87a23ce2ec33e410ca47ecc2555",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEOZvkz8Q5+U8kIcvTTCzZC65T62Dd+vyl\nL3J10WXRT6ZZtjZxO11LOeYv1IuuFB0OGyPjtPDCAu17Wdt4o1wSrGmMYD6rFE/Q\nmsLtj0SV9gfk0sh6I84uwz5BDKR+zCVV\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 705,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100af4a81ee4ae79064ed80f27e1432e84845f15ece399f2cbf28df829ccd30f5ef62ec23957b837d73fe4e156edccd4465",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041578bbff72137c4bca33d7385a892be94cb059f9091ddfe890345f712a9fba5fc77084cec11084ed048491604a07f66c76bbaa872f0710d82a08d9dddd833c7be7c7e8e265f49145157eb4e8e8280076a37ee5873271db510034da19da24415b",
+        "wx" : "1578bbff72137c4bca33d7385a892be94cb059f9091ddfe890345f712a9fba5fc77084cec11084ed048491604a07f66c",
+        "wy" : "76bbaa872f0710d82a08d9dddd833c7be7c7e8e265f49145157eb4e8e8280076a37ee5873271db510034da19da24415b"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200041578bbff72137c4bca33d7385a892be94cb059f9091ddfe890345f712a9fba5fc77084cec11084ed048491604a07f66c76bbaa872f0710d82a08d9dddd833c7be7c7e8e265f49145157eb4e8e8280076a37ee5873271db510034da19da24415b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEFXi7/3ITfEvKM9c4Wokr6UywWfkJHd/o\nkDRfcSqful/HcITOwRCE7QSEkWBKB/Zsdruqhy8HENgqCNnd3YM8e+fH6OJl9JFF\nFX606OgoAHajfuWHMnHbUQA02hnaJEFb\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 706,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02305e9503dc95cf20c9db01e4fc2865d0908be2bd9c733e597e8a5bb7b7a62abdff6dbe3978ae56536d0fb01172ecd55f57",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0433ba451c85e729058f83041077a4695eb47df93e718b09a4618c753ac803cd75c1a91290c2ff5a635389d07149571dab1fc7d8a71776851ff244ff632fe6f92e1652e5284893c4244fe775d8efc589d823dd03f3919027f004537bd8ee09f3a3",
+        "wx" : "33ba451c85e729058f83041077a4695eb47df93e718b09a4618c753ac803cd75c1a91290c2ff5a635389d07149571dab",
+        "wy" : "1fc7d8a71776851ff244ff632fe6f92e1652e5284893c4244fe775d8efc589d823dd03f3919027f004537bd8ee09f3a3"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000433ba451c85e729058f83041077a4695eb47df93e718b09a4618c753ac803cd75c1a91290c2ff5a635389d07149571dab1fc7d8a71776851ff244ff632fe6f92e1652e5284893c4244fe775d8efc589d823dd03f3919027f004537bd8ee09f3a3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEM7pFHIXnKQWPgwQQd6RpXrR9+T5xiwmk\nYYx1OsgDzXXBqRKQwv9aY1OJ0HFJVx2rH8fYpxd2hR/yRP9jL+b5LhZS5ShIk8Qk\nT+d12O/Fidgj3QPzkZAn8ARTe9juCfOj\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 707,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02301ee4ae79064ed80f27e1432e84845f15ece399f2cbf4fa31a3ae8edab84dc3330a39f70938e3912bd59753de5aed3088",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04040771e3390216fed2c6208bdf5bfea83ab1915b166e626569f12efd410a39b7e7c76f70f0012843a26debf4ccc33ddae5bc5f7e62d054eac31cd022afdb71b7c638f24c30cbad0ef35ed2fc9917f356e9c3f04391b21d1035274b81537fcbf3",
+        "wx" : "40771e3390216fed2c6208bdf5bfea83ab1915b166e626569f12efd410a39b7e7c76f70f0012843a26debf4ccc33dda",
+        "wy" : "0e5bc5f7e62d054eac31cd022afdb71b7c638f24c30cbad0ef35ed2fc9917f356e9c3f04391b21d1035274b81537fcbf3"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004040771e3390216fed2c6208bdf5bfea83ab1915b166e626569f12efd410a39b7e7c76f70f0012843a26debf4ccc33ddae5bc5f7e62d054eac31cd022afdb71b7c638f24c30cbad0ef35ed2fc9917f356e9c3f04391b21d1035274b81537fcbf3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEBAdx4zkCFv7SxiCL31v+qDqxkVsWbmJl\nafEu/UEKObfnx29w8AEoQ6Jt6/TMwz3a5bxffmLQVOrDHNAir9txt8Y48kwwy60O\n817S/JkX81bpw/BDkbIdEDUnS4FTf8vz\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 708,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100bb51cd3ba8eb201f53ddb4e34e08c0ff7dff9378106784d798d5a3440bd6dc34be3a0eaef8776619a0c97fefb15720b3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0498d3f16e1c510a933e648e78d01588319f002e9475df8942a2a89db0666bb7c88b32bb248140e44ac4ab28111b2b792399a926f4a66fbe28ff65c09f8306893aec094b89d0fe529e3577c5ecf30a7944caaf530f4575eb113fcf4c200d2dd4bd",
+        "wx" : "098d3f16e1c510a933e648e78d01588319f002e9475df8942a2a89db0666bb7c88b32bb248140e44ac4ab28111b2b7923",
+        "wy" : "099a926f4a66fbe28ff65c09f8306893aec094b89d0fe529e3577c5ecf30a7944caaf530f4575eb113fcf4c200d2dd4bd"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000498d3f16e1c510a933e648e78d01588319f002e9475df8942a2a89db0666bb7c88b32bb248140e44ac4ab28111b2b792399a926f4a66fbe28ff65c09f8306893aec094b89d0fe529e3577c5ecf30a7944caaf530f4575eb113fcf4c200d2dd4bd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEmNPxbhxRCpM+ZI540BWIMZ8ALpR134lC\noqidsGZrt8iLMrskgUDkSsSrKBEbK3kjmakm9KZvvij/ZcCfgwaJOuwJS4nQ/lKe\nNXfF7PMKeUTKr1MPRXXrET/PTCANLdS9\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 709,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100e707e267ea635384a6da09823149f5cb7acbb29e910d2630c5fb5afbc42aa8436349b214a3b8fb9481ec999e005091f8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d1fd602feef80be9e55a19d1a9799c72a899110c6ac21fb3c21357069809d591a8775b64d1867a8cfff124f6a5e3a4f5f9548064f01b9af8868705493a37a037193b48f53b7c7973023f53e6ceff6830ca2f7a14ef51536d453af43b3058d8a9",
+        "wx" : "0d1fd602feef80be9e55a19d1a9799c72a899110c6ac21fb3c21357069809d591a8775b64d1867a8cfff124f6a5e3a4f5",
+        "wy" : "0f9548064f01b9af8868705493a37a037193b48f53b7c7973023f53e6ceff6830ca2f7a14ef51536d453af43b3058d8a9"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004d1fd602feef80be9e55a19d1a9799c72a899110c6ac21fb3c21357069809d591a8775b64d1867a8cfff124f6a5e3a4f5f9548064f01b9af8868705493a37a037193b48f53b7c7973023f53e6ceff6830ca2f7a14ef51536d453af43b3058d8a9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE0f1gL+74C+nlWhnRqXmccqiZEQxqwh+z\nwhNXBpgJ1ZGod1tk0YZ6jP/xJPal46T1+VSAZPAbmviGhwVJOjegNxk7SPU7fHlz\nAj9T5s7/aDDKL3oU71FTbUU69DswWNip\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 710,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100acc4f2afb7f5c10f818175074ef688a643fc5365e38129f86d5e2517feb81b2cd2b8dc4f7821bfd032edc4c0234085d9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0482f37604f66664c2883dba6d98397c281045cbf59f1d16dddb1381126a246553a8b4d2aaea48ad9185a1645f65567d318a4d7b19f1d2e4434c9a8ecad396304abc82221bbab0679935071c72fd975e7b021c04b1d16ea36fc2d051ef5a8e117c",
+        "wx" : "082f37604f66664c2883dba6d98397c281045cbf59f1d16dddb1381126a246553a8b4d2aaea48ad9185a1645f65567d31",
+        "wy" : "08a4d7b19f1d2e4434c9a8ecad396304abc82221bbab0679935071c72fd975e7b021c04b1d16ea36fc2d051ef5a8e117c"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000482f37604f66664c2883dba6d98397c281045cbf59f1d16dddb1381126a246553a8b4d2aaea48ad9185a1645f65567d318a4d7b19f1d2e4434c9a8ecad396304abc82221bbab0679935071c72fd975e7b021c04b1d16ea36fc2d051ef5a8e117c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEgvN2BPZmZMKIPbptmDl8KBBFy/WfHRbd\n2xOBEmokZVOotNKq6kitkYWhZF9lVn0xik17GfHS5ENMmo7K05YwSryCIhu6sGeZ\nNQcccv2XXnsCHASx0W6jb8LQUe9ajhF8\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 711,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02310083276c0793f0a19742422f8af671ccf965fa7d18d541bef4c05b90e303f891d39008439e0fda4bfad5ee9a6ace7e340c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f052dfc27bf8a6d36f3739f239b981f5b53fe08d999ec683b01e43e7596156206ba08b8b9f59229e2fbdce05f1e40f9990f0fdfb7029f9b3e8c6144dad0339208b7cdcb3820a554259db9d27afdd18f4a750296c59bad6b62df076f90d53be0d",
+        "wx" : "0f052dfc27bf8a6d36f3739f239b981f5b53fe08d999ec683b01e43e7596156206ba08b8b9f59229e2fbdce05f1e40f99",
+        "wy" : "090f0fdfb7029f9b3e8c6144dad0339208b7cdcb3820a554259db9d27afdd18f4a750296c59bad6b62df076f90d53be0d"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004f052dfc27bf8a6d36f3739f239b981f5b53fe08d999ec683b01e43e7596156206ba08b8b9f59229e2fbdce05f1e40f9990f0fdfb7029f9b3e8c6144dad0339208b7cdcb3820a554259db9d27afdd18f4a750296c59bad6b62df076f90d53be0d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE8FLfwnv4ptNvNznyObmB9bU/4I2ZnsaD\nsB5D51lhViBroIuLn1kini+9zgXx5A+ZkPD9+3Ap+bPoxhRNrQM5IIt83LOCClVC\nWdudJ6/dGPSnUClsWbrWti3wdvkNU74N\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 712,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100942848586b534105ddd1ca77df72e1251140f412e97b62afbf85d4822309176b5965453dee3fab709e14156b3dfcecca",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f877bd6e2a9273e322a3298ea3add13d1104b32172283669ca6688f0cb591524a7f15dd41496681eda98939aae729fede85ca37c81ef19e3dc9ab16908a3720d86875a51a6a6d932e37492a6ec7a344eabc482377f14891fbd1da7faeffa1178",
+        "wx" : "0f877bd6e2a9273e322a3298ea3add13d1104b32172283669ca6688f0cb591524a7f15dd41496681eda98939aae729fed",
+        "wy" : "0e85ca37c81ef19e3dc9ab16908a3720d86875a51a6a6d932e37492a6ec7a344eabc482377f14891fbd1da7faeffa1178"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004f877bd6e2a9273e322a3298ea3add13d1104b32172283669ca6688f0cb591524a7f15dd41496681eda98939aae729fede85ca37c81ef19e3dc9ab16908a3720d86875a51a6a6d932e37492a6ec7a344eabc482377f14891fbd1da7faeffa1178",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE+He9biqSc+MioymOo63RPREEsyFyKDZp\nymaI8MtZFSSn8V3UFJZoHtqYk5qucp/t6FyjfIHvGePcmrFpCKNyDYaHWlGmptky\n43SSpux6NE6rxII3fxSJH70dp/rv+hF4\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 713,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02307fffffffffffffffffffffffffffffffffffffffffffffffed2119d5fc12649fc808af3b6d9037d3a44eb32399970dd0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0414249bbcfeeceab06c75654d361c0df8d56b320ea3bc1d4627ec0a2f4b8fa3577445694664f569a91f480741381e494a28479f2186d715a56788f67073056aa0cb0b6a7f7893e77b9a6976ef6663d80226896d7f43bb502e1b4d49558a27dd8b",
+        "wx" : "14249bbcfeeceab06c75654d361c0df8d56b320ea3bc1d4627ec0a2f4b8fa3577445694664f569a91f480741381e494a",
+        "wy" : "28479f2186d715a56788f67073056aa0cb0b6a7f7893e77b9a6976ef6663d80226896d7f43bb502e1b4d49558a27dd8b"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000414249bbcfeeceab06c75654d361c0df8d56b320ea3bc1d4627ec0a2f4b8fa3577445694664f569a91f480741381e494a28479f2186d715a56788f67073056aa0cb0b6a7f7893e77b9a6976ef6663d80226896d7f43bb502e1b4d49558a27dd8b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEFCSbvP7s6rBsdWVNNhwN+NVrMg6jvB1G\nJ+wKL0uPo1d0RWlGZPVpqR9IB0E4HklKKEefIYbXFaVniPZwcwVqoMsLan94k+d7\nmml272Zj2AImiW1/Q7tQLhtNSVWKJ92L\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 714,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023079b95c013b0472de04d8faeec3b779c39fe729ea84fb554cd091c7178c2f054eabbc62c3e1cfbac2c2e69d7aa45d9072",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0450a438c98ee94025ce13e27d36b8280d4843585836eb47011a070cd77729245684a0db31fde980620349c796832b2c6cbdb72dba9f3f9cc878559f50b6bd1290f10a6bccbc1eeef7708b1b72059022987979e35221c51259f337c7288a2f86bc",
+        "wx" : "50a438c98ee94025ce13e27d36b8280d4843585836eb47011a070cd77729245684a0db31fde980620349c796832b2c6c",
+        "wy" : "0bdb72dba9f3f9cc878559f50b6bd1290f10a6bccbc1eeef7708b1b72059022987979e35221c51259f337c7288a2f86bc"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000450a438c98ee94025ce13e27d36b8280d4843585836eb47011a070cd77729245684a0db31fde980620349c796832b2c6cbdb72dba9f3f9cc878559f50b6bd1290f10a6bccbc1eeef7708b1b72059022987979e35221c51259f337c7288a2f86bc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEUKQ4yY7pQCXOE+J9NrgoDUhDWFg260cB\nGgcM13cpJFaEoNsx/emAYgNJx5aDKyxsvbctup8/nMh4VZ9Qtr0SkPEKa8y8Hu73\ncIsbcgWQIph5eeNSIcUSWfM3xyiKL4a8\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 715,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100bfd40d0caa4d9d42381f3d72a25683f52b03a1ed96fb72d03f08dcb9a8bc8f23c1a459deab03bcd39396c0d1e9053c81",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044d3fc5dcfaf741113cda3ce2f8dff4c912143e4d36314c361d7ed5656b68448bcca114ba9e8124281234660b7726ddcd680ddfef7ea07bfbcede10803d38d7211631ca11466078819eb66e11921ab7ffa3c4560c732e77595fd408e917dd9afc",
+        "wx" : "4d3fc5dcfaf741113cda3ce2f8dff4c912143e4d36314c361d7ed5656b68448bcca114ba9e8124281234660b7726ddcd",
+        "wy" : "680ddfef7ea07bfbcede10803d38d7211631ca11466078819eb66e11921ab7ffa3c4560c732e77595fd408e917dd9afc"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200044d3fc5dcfaf741113cda3ce2f8dff4c912143e4d36314c361d7ed5656b68448bcca114ba9e8124281234660b7726ddcd680ddfef7ea07bfbcede10803d38d7211631ca11466078819eb66e11921ab7ffa3c4560c732e77595fd408e917dd9afc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETT/F3Pr3QRE82jzi+N/0yRIUPk02MUw2\nHX7VZWtoRIvMoRS6noEkKBI0Zgt3Jt3NaA3f736ge/vO3hCAPTjXIRYxyhFGYHiB\nnrZuEZIat/+jxFYMcy53WV/UCOkX3Zr8\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 716,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02304c7d219db9af94ce7fffffffffffffffffffffffffffffffef15cf1058c8d8ba1e634c4122db95ec1facd4bb13ebf09a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0463d65cdfeb1f1a42000f43bd1ddd130537a7b6f635e8d2bd81a97da168221183da433ca78429fd2b33c5f94895a9c13aa9d1d5ea328725653a5a9d00f85a5516236f3b1428a8629287d3b0487a2e82dd57f93bb2aa3d9783dc74131e13756034",
+        "wx" : "63d65cdfeb1f1a42000f43bd1ddd130537a7b6f635e8d2bd81a97da168221183da433ca78429fd2b33c5f94895a9c13a",
+        "wy" : "0a9d1d5ea328725653a5a9d00f85a5516236f3b1428a8629287d3b0487a2e82dd57f93bb2aa3d9783dc74131e13756034"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000463d65cdfeb1f1a42000f43bd1ddd130537a7b6f635e8d2bd81a97da168221183da433ca78429fd2b33c5f94895a9c13aa9d1d5ea328725653a5a9d00f85a5516236f3b1428a8629287d3b0487a2e82dd57f93bb2aa3d9783dc74131e13756034",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEY9Zc3+sfGkIAD0O9Hd0TBTentvY16NK9\ngal9oWgiEYPaQzynhCn9KzPF+UiVqcE6qdHV6jKHJWU6Wp0A+FpVFiNvOxQoqGKS\nh9OwSHougt1X+Tuyqj2Xg9x0Ex4TdWA0\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 717,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100d219db9af94ce7ffffffffffffffffffffffffffffffffffd189bdb6d9ef7be8504ca374756ea5b8f15e44067d209b9b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d22c9c348b9745711f57debac3a07df90a527c06bd02a8454f41437d54224e071698f03fdc64b1d652414edc3f2239c49ae9812a4b92f099d6659a659691768d57e530ed3c91d5455781605850997a58221f22a2451c3932470606c23f3ab1b8",
+        "wx" : "0d22c9c348b9745711f57debac3a07df90a527c06bd02a8454f41437d54224e071698f03fdc64b1d652414edc3f2239c4",
+        "wy" : "09ae9812a4b92f099d6659a659691768d57e530ed3c91d5455781605850997a58221f22a2451c3932470606c23f3ab1b8"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004d22c9c348b9745711f57debac3a07df90a527c06bd02a8454f41437d54224e071698f03fdc64b1d652414edc3f2239c49ae9812a4b92f099d6659a659691768d57e530ed3c91d5455781605850997a58221f22a2451c3932470606c23f3ab1b8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE0iycNIuXRXEfV966w6B9+QpSfAa9AqhF\nT0FDfVQiTgcWmPA/3GSx1lJBTtw/IjnEmumBKkuS8JnWZZpllpF2jVflMO08kdVF\nV4FgWFCZelgiHyKiRRw5MkcGBsI/OrG4\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 718,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100a433b735f299cfffffffffffffffffffffffffffffffffffdbb02debbfa7c9f1487f3936a22ca3f6f5d06ea22d7c0dc3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0431f05c0c29e9da49aa2fbbedee770c68d10f85e7f77e72ac3cfa9c8623a2bb42eeb2f24ac8f2aef7ab0c4b47823140035bb32fc1ec04bbff5eab96e070c938ba1b53fe63970f649ae02e2a4ada420a249b6f7c525e2c4b9b0d5562ae26f2278c",
+        "wx" : "31f05c0c29e9da49aa2fbbedee770c68d10f85e7f77e72ac3cfa9c8623a2bb42eeb2f24ac8f2aef7ab0c4b4782314003",
+        "wy" : "5bb32fc1ec04bbff5eab96e070c938ba1b53fe63970f649ae02e2a4ada420a249b6f7c525e2c4b9b0d5562ae26f2278c"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000431f05c0c29e9da49aa2fbbedee770c68d10f85e7f77e72ac3cfa9c8623a2bb42eeb2f24ac8f2aef7ab0c4b47823140035bb32fc1ec04bbff5eab96e070c938ba1b53fe63970f649ae02e2a4ada420a249b6f7c525e2c4b9b0d5562ae26f2278c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEMfBcDCnp2kmqL7vt7ncMaNEPhef3fnKs\nPPqchiOiu0LusvJKyPKu96sMS0eCMUADW7MvwewEu/9eq5bgcMk4uhtT/mOXD2Sa\n4C4qStpCCiSbb3xSXixLmw1VYq4m8ieM\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 719,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100b9af94ce7fffffffffffffffffffffffffffffffffffffffd6efeefc876c9f23217b443c80637ef939e911219f96c179",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bc26eec95e26c980bc0334264cbcfc26b897c3571c96ce9ab2a67b49bb0f26a6272fdc27806d7a4c572ae0f78149f1f3c8af5f41b99d2066018165513fb3b55e4255dcd0659647ed55e1e2602cae4efbd6eae1dfe2ff63e2c748d4acc7430139",
+        "wx" : "0bc26eec95e26c980bc0334264cbcfc26b897c3571c96ce9ab2a67b49bb0f26a6272fdc27806d7a4c572ae0f78149f1f3",
+        "wy" : "0c8af5f41b99d2066018165513fb3b55e4255dcd0659647ed55e1e2602cae4efbd6eae1dfe2ff63e2c748d4acc7430139"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004bc26eec95e26c980bc0334264cbcfc26b897c3571c96ce9ab2a67b49bb0f26a6272fdc27806d7a4c572ae0f78149f1f3c8af5f41b99d2066018165513fb3b55e4255dcd0659647ed55e1e2602cae4efbd6eae1dfe2ff63e2c748d4acc7430139",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEvCbuyV4myYC8AzQmTLz8JriXw1ccls6a\nsqZ7SbsPJqYnL9wngG16TFcq4PeBSfHzyK9fQbmdIGYBgWVRP7O1XkJV3NBllkft\nVeHiYCyuTvvW6uHf4v9j4sdI1KzHQwE5\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 720,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100a276276276276276276276276276276276276276276276273d7228d4f84b769be0fd57b97e4c1ebcae9a5f635e80e9df",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046fa0964dd054250af176891c0c822b013b70f059c347172cafc6b36cd16cf3b0f9d19f2598bd0d580ac16c46acb167d4375bef701c002dcc040fd54824b14cc2df0154eb20e74464e1fe7b833426dd7d636bf2d79603fdde5ddaab23ab0cf426",
+        "wx" : "6fa0964dd054250af176891c0c822b013b70f059c347172cafc6b36cd16cf3b0f9d19f2598bd0d580ac16c46acb167d4",
+        "wy" : "375bef701c002dcc040fd54824b14cc2df0154eb20e74464e1fe7b833426dd7d636bf2d79603fdde5ddaab23ab0cf426"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200046fa0964dd054250af176891c0c822b013b70f059c347172cafc6b36cd16cf3b0f9d19f2598bd0d580ac16c46acb167d4375bef701c002dcc040fd54824b14cc2df0154eb20e74464e1fe7b833426dd7d636bf2d79603fdde5ddaab23ab0cf426",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEb6CWTdBUJQrxdokcDIIrATtw8FnDRxcs\nr8azbNFs87D50Z8lmL0NWArBbEassWfUN1vvcBwALcwED9VIJLFMwt8BVOsg50Rk\n4f57gzQm3X1ja/LXlgP93l3aqyOrDPQm\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 721,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023073333333333333333333333333333333333333333333333316e4d9f42d4eca22df403a0c578b86f0a9a93fe89995c7ed",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04baa4e712ee0786a5ab0e5a5dafdcdcf87b38830ab2ec86faedda9fdf65332f6a9688269412f050356530d4664a7fb8cdecc46a901b016e6bb8a336ad9aa6f19abf9ada69705d1c905beafb95a44f52af43de4bf80c050cf996b7796dfcee8e1b",
+        "wx" : "0baa4e712ee0786a5ab0e5a5dafdcdcf87b38830ab2ec86faedda9fdf65332f6a9688269412f050356530d4664a7fb8cd",
+        "wy" : "0ecc46a901b016e6bb8a336ad9aa6f19abf9ada69705d1c905beafb95a44f52af43de4bf80c050cf996b7796dfcee8e1b"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004baa4e712ee0786a5ab0e5a5dafdcdcf87b38830ab2ec86faedda9fdf65332f6a9688269412f050356530d4664a7fb8cdecc46a901b016e6bb8a336ad9aa6f19abf9ada69705d1c905beafb95a44f52af43de4bf80c050cf996b7796dfcee8e1b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEuqTnEu4HhqWrDlpdr9zc+Hs4gwqy7Ib6\n7dqf32UzL2qWiCaUEvBQNWUw1GZKf7jN7MRqkBsBbmu4ozatmqbxmr+a2mlwXRyQ\nW+r7laRPUq9D3kv4DAUM+Za3eW387o4b\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 722,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02307fffffffffffffffffffffffffffffffffffffffffffffffda4233abf824c93f90115e76db206fa7489d6647332e1ba3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0481e78a52ae0695583f7a601ab9b6fbfaf434f2befa1f8c833d59deb627a927c2f42d48eb617fe042f584e105c23c2317cf22d565f5f3b425ef7937df629b6864dac71264b288c1a987210f523071319ce3f64411910ac23765c4266e615112bc",
+        "wx" : "081e78a52ae0695583f7a601ab9b6fbfaf434f2befa1f8c833d59deb627a927c2f42d48eb617fe042f584e105c23c2317",
+        "wy" : "0cf22d565f5f3b425ef7937df629b6864dac71264b288c1a987210f523071319ce3f64411910ac23765c4266e615112bc"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000481e78a52ae0695583f7a601ab9b6fbfaf434f2befa1f8c833d59deb627a927c2f42d48eb617fe042f584e105c23c2317cf22d565f5f3b425ef7937df629b6864dac71264b288c1a987210f523071319ce3f64411910ac23765c4266e615112bc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEgeeKUq4GlVg/emAaubb7+vQ08r76H4yD\nPVnetiepJ8L0LUjrYX/gQvWE4QXCPCMXzyLVZfXztCXveTffYptoZNrHEmSyiMGp\nhyEPUjBxMZzj9kQRkQrCN2XEJm5hURK8\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 723,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02303fffffffffffffffffffffffffffffffffffffffffffffffe3b1a6c0fa1b96efac0d06d9245853bd76760cb5666294bb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0441fa8765b19d3108031e28c9a781a385c9c10b2bfd42e6437e5c4bd711cf2a031750847d17a82f9376a30ae182a6d6e71c20af96324147d4155a4d0c867ca8e36eba204fbed2087e0fcbdc8baabe07bb3123f9f7259e771cd9f1ad17d1a23787",
+        "wx" : "41fa8765b19d3108031e28c9a781a385c9c10b2bfd42e6437e5c4bd711cf2a031750847d17a82f9376a30ae182a6d6e7",
+        "wy" : "1c20af96324147d4155a4d0c867ca8e36eba204fbed2087e0fcbdc8baabe07bb3123f9f7259e771cd9f1ad17d1a23787"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000441fa8765b19d3108031e28c9a781a385c9c10b2bfd42e6437e5c4bd711cf2a031750847d17a82f9376a30ae182a6d6e71c20af96324147d4155a4d0c867ca8e36eba204fbed2087e0fcbdc8baabe07bb3123f9f7259e771cd9f1ad17d1a23787",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEQfqHZbGdMQgDHijJp4GjhcnBCyv9QuZD\nflxL1xHPKgMXUIR9F6gvk3ajCuGCptbnHCCvljJBR9QVWk0Mhnyo4266IE++0gh+\nD8vci6q+B7sxI/n3JZ53HNnxrRfRojeH\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 724,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd023100dfea06865526cea11c0f9eb9512b41fa9581d0f6cb7db9680336151dce79de818cdf33c879da322740416d1e5ae532fa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e585a067d6dff37ae7f17f81583119b61291597345f107acffe237a08f4886d4fdf94fe63182e6143c99be25a7b7d86b572c1e06dd2c7b94b873f0578fcb2b99d60e246e51245d0804edd44b32f0f000c8f8f88f1d4a65fea51dbbb4ab1e2823",
+        "wx" : "0e585a067d6dff37ae7f17f81583119b61291597345f107acffe237a08f4886d4fdf94fe63182e6143c99be25a7b7d86b",
+        "wy" : "572c1e06dd2c7b94b873f0578fcb2b99d60e246e51245d0804edd44b32f0f000c8f8f88f1d4a65fea51dbbb4ab1e2823"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004e585a067d6dff37ae7f17f81583119b61291597345f107acffe237a08f4886d4fdf94fe63182e6143c99be25a7b7d86b572c1e06dd2c7b94b873f0578fcb2b99d60e246e51245d0804edd44b32f0f000c8f8f88f1d4a65fea51dbbb4ab1e2823",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE5YWgZ9bf83rn8X+BWDEZthKRWXNF8Qes\n/+I3oI9IhtT9+U/mMYLmFDyZviWnt9hrVyweBt0se5S4c/BXj8srmdYOJG5RJF0I\nBO3USzLw8ADI+PiPHUpl/qUdu7SrHigj\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 725,
+          "comment" : "point duplication during verification",
+          "msg" : "313233343030",
+          "sig" : "3065023100b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60023064adb4d51a93f96bed4665de2d4e1169cc95819ec6e9333edfd5c07ca134ceef7c95957b719ae349fc439eaa49fbbe34",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e585a067d6dff37ae7f17f81583119b61291597345f107acffe237a08f4886d4fdf94fe63182e6143c99be25a7b7d86ba8d3e1f922d3846b478c0fa87034d46629f1db91aedba2f7fb122bb4cd0f0ffe3707076fe2b59a015ae2444c54e1d7dc",
+        "wx" : "0e585a067d6dff37ae7f17f81583119b61291597345f107acffe237a08f4886d4fdf94fe63182e6143c99be25a7b7d86b",
+        "wy" : "0a8d3e1f922d3846b478c0fa87034d46629f1db91aedba2f7fb122bb4cd0f0ffe3707076fe2b59a015ae2444c54e1d7dc"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004e585a067d6dff37ae7f17f81583119b61291597345f107acffe237a08f4886d4fdf94fe63182e6143c99be25a7b7d86ba8d3e1f922d3846b478c0fa87034d46629f1db91aedba2f7fb122bb4cd0f0ffe3707076fe2b59a015ae2444c54e1d7dc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE5YWgZ9bf83rn8X+BWDEZthKRWXNF8Qes\n/+I3oI9IhtT9+U/mMYLmFDyZviWnt9hrqNPh+SLThGtHjA+ocDTUZinx25Gu26L3\n+xIrtM0PD/43Bwdv4rWaAVriRExU4dfc\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 726,
+          "comment" : "duplication bug",
+          "msg" : "313233343030",
+          "sig" : "3065023100b37699e0d518a4d370dbdaaaea3788850fa03f8186d1f78fdfbae6540aa670b31c8ada0fff3e737bd69520560fe0ce60023064adb4d51a93f96bed4665de2d4e1169cc95819ec6e9333edfd5c07ca134ceef7c95957b719ae349fc439eaa49fbbe34",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b4d78cccbced8065c0ebdc330b4670ec99309273e442b9be341196c1043e4441fc57b914085595bfc755c64fc409f0ba01fee31cbbbaed5c1323f09c87df9b0712c12e99733fa23ef91b4e6ca666b09dd7540ebf1068a15155bc069e3d595c8c",
+        "wx" : "0b4d78cccbced8065c0ebdc330b4670ec99309273e442b9be341196c1043e4441fc57b914085595bfc755c64fc409f0ba",
+        "wy" : "1fee31cbbbaed5c1323f09c87df9b0712c12e99733fa23ef91b4e6ca666b09dd7540ebf1068a15155bc069e3d595c8c"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004b4d78cccbced8065c0ebdc330b4670ec99309273e442b9be341196c1043e4441fc57b914085595bfc755c64fc409f0ba01fee31cbbbaed5c1323f09c87df9b0712c12e99733fa23ef91b4e6ca666b09dd7540ebf1068a15155bc069e3d595c8c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEtNeMzLztgGXA69wzC0Zw7JkwknPkQrm+\nNBGWwQQ+REH8V7kUCFWVv8dVxk/ECfC6Af7jHLu67VwTI/Cch9+bBxLBLplzP6I+\n+RtObKZmsJ3XVA6/EGihUVW8Bp49WVyM\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 727,
+          "comment" : "point with x-coordinate 0",
+          "msg" : "313233343030",
+          "sig" : "3035020101023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046e3c68be53aade81ef89e096d841e2845a23331e7ec8a6a839d58d07fa016c0973ed75de4f99177bfdc74db566e9d15a4972ea08e577ce1f61c13a6ca1bad1deef2982ee01a2826f002b769f2c46098d3baff068a405d09ca3840d2fafe4e46e",
+        "wx" : "6e3c68be53aade81ef89e096d841e2845a23331e7ec8a6a839d58d07fa016c0973ed75de4f99177bfdc74db566e9d15a",
+        "wy" : "4972ea08e577ce1f61c13a6ca1bad1deef2982ee01a2826f002b769f2c46098d3baff068a405d09ca3840d2fafe4e46e"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200046e3c68be53aade81ef89e096d841e2845a23331e7ec8a6a839d58d07fa016c0973ed75de4f99177bfdc74db566e9d15a4972ea08e577ce1f61c13a6ca1bad1deef2982ee01a2826f002b769f2c46098d3baff068a405d09ca3840d2fafe4e46e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEbjxovlOq3oHvieCW2EHihFojMx5+yKao\nOdWNB/oBbAlz7XXeT5kXe/3HTbVm6dFaSXLqCOV3zh9hwTpsobrR3u8pgu4BooJv\nACt2nyxGCY07r/BopAXQnKOEDS+v5ORu\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 728,
+          "comment" : "point with x-coordinate 0",
+          "msg" : "313233343030",
+          "sig" : "3065023101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023033333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b101cdb3eba20e112adbb4bbd2cb479a69e590a44ea902631832abfab8af2c3041b3df7f1665b2c6eb533f546217100a1a61aa9951578ad4f00ae17339a8a6f1359bbd0ac355678ed4df21338f08763c1d3702ec132b634c7bcc0118efb1d0dd",
+        "wx" : "0b101cdb3eba20e112adbb4bbd2cb479a69e590a44ea902631832abfab8af2c3041b3df7f1665b2c6eb533f546217100a",
+        "wy" : "1a61aa9951578ad4f00ae17339a8a6f1359bbd0ac355678ed4df21338f08763c1d3702ec132b634c7bcc0118efb1d0dd"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004b101cdb3eba20e112adbb4bbd2cb479a69e590a44ea902631832abfab8af2c3041b3df7f1665b2c6eb533f546217100a1a61aa9951578ad4f00ae17339a8a6f1359bbd0ac355678ed4df21338f08763c1d3702ec132b634c7bcc0118efb1d0dd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEsQHNs+uiDhEq27S70stHmmnlkKROqQJj\nGDKr+rivLDBBs99/FmWyxutTP1RiFxAKGmGqmVFXitTwCuFzOaim8TWbvQrDVWeO\n1N8hM48IdjwdNwLsEytjTHvMARjvsdDd\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 729,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "313233343030",
+          "sig" : "3064023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326023033333333333333333333333333333333333333333333333327e0a919fda4a2c644d202bd41bcee4bc8fc05155c276eb0",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046761044a040a4979db269b4a377e42f11b4be0ce24611f677674dcf770f5887ca4db565303283809e6d65f7fc6bc273605c7daa403fca53549f75ff3372909642d02b7fdcac1e68242814d6e925ab01a80836cfbb35581960079e2fb44c0d186",
+        "wx" : "6761044a040a4979db269b4a377e42f11b4be0ce24611f677674dcf770f5887ca4db565303283809e6d65f7fc6bc2736",
+        "wy" : "5c7daa403fca53549f75ff3372909642d02b7fdcac1e68242814d6e925ab01a80836cfbb35581960079e2fb44c0d186"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200046761044a040a4979db269b4a377e42f11b4be0ce24611f677674dcf770f5887ca4db565303283809e6d65f7fc6bc273605c7daa403fca53549f75ff3372909642d02b7fdcac1e68242814d6e925ab01a80836cfbb35581960079e2fb44c0d186",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEZ2EESgQKSXnbJptKN35C8RtL4M4kYR9n\ndnTc93D1iHyk21ZTAyg4CebWX3/GvCc2BcfapAP8pTVJ91/zNykJZC0Ct/3KweaC\nQoFNbpJasBqAg2z7s1WBlgB54vtEwNGG\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 730,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "3064023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046922c591502f01046fee5617bf16496f58398822e69afa8335308f36c09a8ed437209fefcffbbdf0a4876b35a3c7ab2655854db825b94b3f27e5f892d3bbb6c7240ec922894dd3598e91fcc6134a2b8fd154e1790466906206f0f623416e63a1",
+        "wx" : "6922c591502f01046fee5617bf16496f58398822e69afa8335308f36c09a8ed437209fefcffbbdf0a4876b35a3c7ab26",
+        "wy" : "55854db825b94b3f27e5f892d3bbb6c7240ec922894dd3598e91fcc6134a2b8fd154e1790466906206f0f623416e63a1"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200046922c591502f01046fee5617bf16496f58398822e69afa8335308f36c09a8ed437209fefcffbbdf0a4876b35a3c7ab2655854db825b94b3f27e5f892d3bbb6c7240ec922894dd3598e91fcc6134a2b8fd154e1790466906206f0f623416e63a1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEaSLFkVAvAQRv7lYXvxZJb1g5iCLmmvqD\nNTCPNsCajtQ3IJ/vz/u98KSHazWjx6smVYVNuCW5Sz8n5fiS07u2xyQOySKJTdNZ\njpH8xhNKK4/RVOF5BGaQYgbw9iNBbmOh\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 731,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3064023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df6102302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04892dac0e700fc29d1802d9a449a6f56b2172cb1b7d881013cd3b31c0edb052f2d340c8995a4477bcb9225fec15667233cc6c34ae17445444516fd8fd22ee83f79eb0771ebff6677ac5d4e089f87a1c72df957acb24492adcd7c3816b8e0c75b1",
+        "wx" : "0892dac0e700fc29d1802d9a449a6f56b2172cb1b7d881013cd3b31c0edb052f2d340c8995a4477bcb9225fec15667233",
+        "wy" : "0cc6c34ae17445444516fd8fd22ee83f79eb0771ebff6677ac5d4e089f87a1c72df957acb24492adcd7c3816b8e0c75b1"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004892dac0e700fc29d1802d9a449a6f56b2172cb1b7d881013cd3b31c0edb052f2d340c8995a4477bcb9225fec15667233cc6c34ae17445444516fd8fd22ee83f79eb0771ebff6677ac5d4e089f87a1c72df957acb24492adcd7c3816b8e0c75b1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEiS2sDnAPwp0YAtmkSab1ayFyyxt9iBAT\nzTsxwO2wUvLTQMiZWkR3vLkiX+wVZnIzzGw0rhdEVERRb9j9Iu6D956wdx6/9md6\nxdTgifh6HHLflXrLJEkq3NfDgWuODHWx\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 732,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3064023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df6102306666666666666666666666666666666666666666666666664fc15233fb49458c89a4057a8379dc9791f80a2ab84edd61",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401634117e6478ce0568b0a2469237bbac6ff096acb7e514072bf77123cb51ba0cc3e8d69284d534d8e6d1e876cecf22231e5ef04dc96762ce7d5ef3348ad1e241ac797ae3b630ea249afc5139af49b8ef68b32f812d6b514210363d498efc28c",
+        "wx" : "1634117e6478ce0568b0a2469237bbac6ff096acb7e514072bf77123cb51ba0cc3e8d69284d534d8e6d1e876cecf222",
+        "wy" : "31e5ef04dc96762ce7d5ef3348ad1e241ac797ae3b630ea249afc5139af49b8ef68b32f812d6b514210363d498efc28c"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000401634117e6478ce0568b0a2469237bbac6ff096acb7e514072bf77123cb51ba0cc3e8d69284d534d8e6d1e876cecf22231e5ef04dc96762ce7d5ef3348ad1e241ac797ae3b630ea249afc5139af49b8ef68b32f812d6b514210363d498efc28c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEAWNBF+ZHjOBWiwokaSN7usb/CWrLflFA\ncr93Ejy1G6DMPo1pKE1TTY5tHods7PIiMeXvBNyWdizn1e8zSK0eJBrHl647Yw6i\nSa/FE5r0m472izL4Eta1FCEDY9SY78KM\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 733,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3065023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df6102310099999999999999999999999999999999999999999999999977a1fb4df8ede852ce760837c536cae35af40f4014764c12",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04675bdc79d8243887fe1b305d12ac10d2e9c0bde070a6e3394cd5f6adfbceda75498b0e7a794c7212f42be93f616744563e96d1bf6f95cdbefa774911ba06463d8a90a0c9d73c9699b061d779dc52496e8ee9b9ae9c5d4d90e89cd1157d811895",
+        "wx" : "675bdc79d8243887fe1b305d12ac10d2e9c0bde070a6e3394cd5f6adfbceda75498b0e7a794c7212f42be93f61674456",
+        "wy" : "3e96d1bf6f95cdbefa774911ba06463d8a90a0c9d73c9699b061d779dc52496e8ee9b9ae9c5d4d90e89cd1157d811895"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004675bdc79d8243887fe1b305d12ac10d2e9c0bde070a6e3394cd5f6adfbceda75498b0e7a794c7212f42be93f616744563e96d1bf6f95cdbefa774911ba06463d8a90a0c9d73c9699b061d779dc52496e8ee9b9ae9c5d4d90e89cd1157d811895",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEZ1vcedgkOIf+GzBdEqwQ0unAveBwpuM5\nTNX2rfvO2nVJiw56eUxyEvQr6T9hZ0RWPpbRv2+Vzb76d0kRugZGPYqQoMnXPJaZ\nsGHXedxSSW6O6bmunF1NkOic0RV9gRiV\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 734,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3065023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df61023100db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6aae76701acc1950894a89e068772d8b281eef136f8a8fef5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040fd1aab89f47b565b8160dfcc433b6408adeb1473c036b26b7ddec714fb4d0e7dd756c88469e86e218813ead8e8e7676f1cc955c4139e0071c0079ec1d77164e0569bdf453837e8b33c98535a0e7c9c61ef24762067bb46b6116ea7909a69b23",
+        "wx" : "0fd1aab89f47b565b8160dfcc433b6408adeb1473c036b26b7ddec714fb4d0e7dd756c88469e86e218813ead8e8e7676",
+        "wy" : "0f1cc955c4139e0071c0079ec1d77164e0569bdf453837e8b33c98535a0e7c9c61ef24762067bb46b6116ea7909a69b23"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200040fd1aab89f47b565b8160dfcc433b6408adeb1473c036b26b7ddec714fb4d0e7dd756c88469e86e218813ead8e8e7676f1cc955c4139e0071c0079ec1d77164e0569bdf453837e8b33c98535a0e7c9c61ef24762067bb46b6116ea7909a69b23",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAED9GquJ9HtWW4Fg38xDO2QIresUc8A2sm\nt93scU+00OfddWyIRp6G4hiBPq2OjnZ28cyVXEE54AccAHnsHXcWTgVpvfRTg36L\nM8mFNaDnycYe8kdiBnu0a2EW6nkJppsj\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 735,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "3064023008d999057ba3d2d969260045c55b97f089025959a6f434d651d207d19fb96e9e4fe0e86ebe0e64f85b96a9c75295df6102300eb10e5ab95f2f26a40700b1300fb8c3e754d5c453d9384ecce1daa38135a48a0a96c24efc2a76d00bde1d7aeedf7f6a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0434d74ec088bab6c6323968d1f468993812f690d6edca5b97604d718e12b8cdfdd96d42e57d33afe312f0ee3c3d0a13f786f4922bb2c13bdf7752a3ecb69393e997bd65461c46867ebeef6296b23f2c56df63acfde648f3f5002dbc239ffd1582",
+        "wx" : "34d74ec088bab6c6323968d1f468993812f690d6edca5b97604d718e12b8cdfdd96d42e57d33afe312f0ee3c3d0a13f7",
+        "wy" : "086f4922bb2c13bdf7752a3ecb69393e997bd65461c46867ebeef6296b23f2c56df63acfde648f3f5002dbc239ffd1582"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000434d74ec088bab6c6323968d1f468993812f690d6edca5b97604d718e12b8cdfdd96d42e57d33afe312f0ee3c3d0a13f786f4922bb2c13bdf7752a3ecb69393e997bd65461c46867ebeef6296b23f2c56df63acfde648f3f5002dbc239ffd1582",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAENNdOwIi6tsYyOWjR9GiZOBL2kNbtyluX\nYE1xjhK4zf3ZbULlfTOv4xLw7jw9ChP3hvSSK7LBO993UqPstpOT6Ze9ZUYcRoZ+\nvu9ilrI/LFbfY6z95kjz9QAtvCOf/RWC\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 736,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "3065023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7023055555555555555555555555555555555555555555555555542766f2b5167b9f51d5e0490c2e58d28f9a40878eeec6326",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044376c9893e9277296c766a83abbe36b34da7a631f8cbfd32a1888de0dd1455a21a153ea2d61cfa5071fc6be12a658f6b290ba1a8ee8c78b5dd58f9ffcacb22955682eea02429c3fa8cdcb649fa4d007c8693e3f8f3c0a5f3c4de7a51beaa9809",
+        "wx" : "4376c9893e9277296c766a83abbe36b34da7a631f8cbfd32a1888de0dd1455a21a153ea2d61cfa5071fc6be12a658f6b",
+        "wy" : "290ba1a8ee8c78b5dd58f9ffcacb22955682eea02429c3fa8cdcb649fa4d007c8693e3f8f3c0a5f3c4de7a51beaa9809"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200044376c9893e9277296c766a83abbe36b34da7a631f8cbfd32a1888de0dd1455a21a153ea2d61cfa5071fc6be12a658f6b290ba1a8ee8c78b5dd58f9ffcacb22955682eea02429c3fa8cdcb649fa4d007c8693e3f8f3c0a5f3c4de7a51beaa9809",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEQ3bJiT6SdylsdmqDq742s02npjH4y/0y\noYiN4N0UVaIaFT6i1hz6UHH8a+EqZY9rKQuhqO6MeLXdWPn/yssilVaC7qAkKcP6\njNy2SfpNAHyGk+P488Cl88TeelG+qpgJ\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 737,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3065023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab702302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0410878fc4807f6732a23c883e838e38c787f7088f94c1824b84673e8b9eab16de1544ae4bf2c6fe3fe4fb343b7487e2b43036ff439533d22f951dae966584bafb23b217dcad2f8f4e0e6999c0c4d0f076634be805f676fd2a59c27f9fe7c5d95b",
+        "wx" : "10878fc4807f6732a23c883e838e38c787f7088f94c1824b84673e8b9eab16de1544ae4bf2c6fe3fe4fb343b7487e2b4",
+        "wy" : "3036ff439533d22f951dae966584bafb23b217dcad2f8f4e0e6999c0c4d0f076634be805f676fd2a59c27f9fe7c5d95b"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000410878fc4807f6732a23c883e838e38c787f7088f94c1824b84673e8b9eab16de1544ae4bf2c6fe3fe4fb343b7487e2b43036ff439533d22f951dae966584bafb23b217dcad2f8f4e0e6999c0c4d0f076634be805f676fd2a59c27f9fe7c5d95b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEEIePxIB/ZzKiPIg+g444x4f3CI+UwYJL\nhGc+i56rFt4VRK5L8sb+P+T7NDt0h+K0MDb/Q5Uz0i+VHa6WZYS6+yOyF9ytL49O\nDmmZwMTQ8HZjS+gF9nb9KlnCf5/nxdlb\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 738,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3065023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab702306666666666666666666666666666666666666666666666664fc15233fb49458c89a4057a8379dc9791f80a2ab84edd61",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04036b253e3b4ac88bb8585a2b32b978766a931e5ad0d0e653a2e34b44d6ddcc0d386e20c4def2d8bb3f8da128c1eac69f9c8e3b5ff5dde2205af359b3974d52758d7abae812b8b275e1452c4e59cb62e9b6771d347dbd1dea761c70291cc5e0a6",
+        "wx" : "36b253e3b4ac88bb8585a2b32b978766a931e5ad0d0e653a2e34b44d6ddcc0d386e20c4def2d8bb3f8da128c1eac69f",
+        "wy" : "09c8e3b5ff5dde2205af359b3974d52758d7abae812b8b275e1452c4e59cb62e9b6771d347dbd1dea761c70291cc5e0a6"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004036b253e3b4ac88bb8585a2b32b978766a931e5ad0d0e653a2e34b44d6ddcc0d386e20c4def2d8bb3f8da128c1eac69f9c8e3b5ff5dde2205af359b3974d52758d7abae812b8b275e1452c4e59cb62e9b6771d347dbd1dea761c70291cc5e0a6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEA2slPjtKyIu4WForMrl4dmqTHlrQ0OZT\nouNLRNbdzA04biDE3vLYuz+NoSjB6safnI47X/Xd4iBa81mzl01SdY16uugSuLJ1\n4UUsTlnLYum2dx00fb0d6nYccCkcxeCm\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 739,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3066023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab702310099999999999999999999999999999999999999999999999977a1fb4df8ede852ce760837c536cae35af40f4014764c12",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042783c1be922fce155864ecb41d0a316e193a55843e80192f1fe556772f3debd04b9fc93c27bc6f353938886a404419941a352cec336946424fa3c208ea7105f5549edde8688abd305344bf4f66dda7eabcda6f8557c9af88109804d702e9670b",
+        "wx" : "2783c1be922fce155864ecb41d0a316e193a55843e80192f1fe556772f3debd04b9fc93c27bc6f353938886a40441994",
+        "wy" : "1a352cec336946424fa3c208ea7105f5549edde8688abd305344bf4f66dda7eabcda6f8557c9af88109804d702e9670b"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200042783c1be922fce155864ecb41d0a316e193a55843e80192f1fe556772f3debd04b9fc93c27bc6f353938886a404419941a352cec336946424fa3c208ea7105f5549edde8688abd305344bf4f66dda7eabcda6f8557c9af88109804d702e9670b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEJ4PBvpIvzhVYZOy0HQoxbhk6VYQ+gBkv\nH+VWdy8969BLn8k8J7xvNTk4iGpARBmUGjUs7DNpRkJPo8II6nEF9VSe3ehoir0w\nU0S/T2bdp+q82m+FV8mviBCYBNcC6WcL\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 740,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3066023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7023100db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6aae76701acc1950894a89e068772d8b281eef136f8a8fef5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fa92538cdc740368caf16480ff1304cebbbe59a46a7a84603726b9592d105be069df1c61b5974f27e7552f797de97cdb620e03a46da862e4b089bafbb80df8f055c8f47991b3a3ddb2b089aedb2f15841a6a5b5e14c1dc36b3c155c4f74d3409",
+        "wx" : "0fa92538cdc740368caf16480ff1304cebbbe59a46a7a84603726b9592d105be069df1c61b5974f27e7552f797de97cdb",
+        "wy" : "620e03a46da862e4b089bafbb80df8f055c8f47991b3a3ddb2b089aedb2f15841a6a5b5e14c1dc36b3c155c4f74d3409"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004fa92538cdc740368caf16480ff1304cebbbe59a46a7a84603726b9592d105be069df1c61b5974f27e7552f797de97cdb620e03a46da862e4b089bafbb80df8f055c8f47991b3a3ddb2b089aedb2f15841a6a5b5e14c1dc36b3c155c4f74d3409",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE+pJTjNx0A2jK8WSA/xMEzru+WaRqeoRg\nNya5WS0QW+Bp3xxhtZdPJ+dVL3l96XzbYg4DpG2oYuSwibr7uA348FXI9HmRs6Pd\nsrCJrtsvFYQaalteFMHcNrPBVcT3TTQJ\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 741,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "3065023100aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab702300eb10e5ab95f2f26a40700b1300fb8c3e754d5c453d9384ecce1daa38135a48a0a96c24efc2a76d00bde1d7aeedf7f6a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f",
+        "wx" : "0aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7",
+        "wy" : "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEqofKIr6LBTeOscce8yCtdG4dO2KLp5uY\nWfdB4IJUKjhVAvJdv1UpbDpUXjhydgq3NhfeSpYmLG9dnpi/kpLcKfj0Hb0omhR8\n6doxE7XwuMAKYLHOHX6BnXpDHXyQ6g5f\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 742,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3065023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace02302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 743,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "30640230064ed80f27e1432e84845f15ece399f2cbf4fa31aa837de9b953d44413b9f5c7c7f67989d703f07abef11b6ad0373ea502302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7c9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0",
+        "wx" : "0aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7",
+        "wy" : "0c9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7c9e821b569d9d390a26167406d6d23d6070be242d765eb831625ceec4a0f473ef59f4e30e2817e6285bce2846f15f1a0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEqofKIr6LBTeOscce8yCtdG4dO2KLp5uY\nWfdB4IJUKjhVAvJdv1UpbDpUXjhydgq3yeghtWnZ05CiYWdAbW0j1gcL4kLXZeuD\nFiXO7EoPRz71n04w4oF+YoW84oRvFfGg\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 744,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3065023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace02302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 745,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "30640230064ed80f27e1432e84845f15ece399f2cbf4fa31aa837de9b953d44413b9f5c7c7f67989d703f07abef11b6ad0373ea502302492492492492492492492492492492492492492492492491c7be680477598d6c3716fabc13dcec86afd2833d41c2a7e",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04011d2fc994df204b63f05ae8420ca390559b80c4988ef639b95c469e5cb24cf216540cbebc470bcaa0466612dbde6d03098c6996e0a05f02902183ceba4b530f4f3500a99e4cdc8a50c0d98d870944e56548dc4cf6bbbf3d6978efbc8fc8778b33e132d2c185c20844cf3df394d522259317e3931f0130f23f6500c880f3a8319ab44a0e",
+        "wx" : "11d2fc994df204b63f05ae8420ca390559b80c4988ef639b95c469e5cb24cf216540cbebc470bcaa0466612dbde6d03098c6996e0a05f02902183ceba4b530f4f35",
+        "wy" : "0a99e4cdc8a50c0d98d870944e56548dc4cf6bbbf3d6978efbc8fc8778b33e132d2c185c20844cf3df394d522259317e3931f0130f23f6500c880f3a8319ab44a0e"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004011d2fc994df204b63f05ae8420ca390559b80c4988ef639b95c469e5cb24cf216540cbebc470bcaa0466612dbde6d03098c6996e0a05f02902183ceba4b530f4f3500a99e4cdc8a50c0d98d870944e56548dc4cf6bbbf3d6978efbc8fc8778b33e132d2c185c20844cf3df394d522259317e3931f0130f23f6500c880f3a8319ab44a0e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBHS/JlN8gS2PwWuhCDKOQVZuAxJiO\n9jm5XEaeXLJM8hZUDL68RwvKoEZmEtvebQMJjGmW4KBfApAhg866S1MPTzUAqZ5M\n3IpQwNmNhwlE5WVI3Ez2u789aXjvvI/Id4sz4TLSwYXCCETPPfOU1SIlkxfjkx8B\nMPI/ZQDIgPOoMZq0Sg4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 746,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "54657374",
+          "sig" : "3067022105ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf5024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 747,
+          "comment" : "r too large",
+          "msg" : "54657374",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04019a029c77fed04cab1ab8937fda8128fc19bf8c41a8f242f6a9ca6f0ae813c1709b8b03e26a9298fe59f99e3706ffc28c43d26a11690d2ffd815a33ea329076697800125b2a4b635f514fd5d63215672f311ae5935c1774ed5d8a44897b68191e6369ab26df915e2066a943e59a3577319dac5a86640bc8c718d2b159479fdd22d11441",
+        "wx" : "19a029c77fed04cab1ab8937fda8128fc19bf8c41a8f242f6a9ca6f0ae813c1709b8b03e26a9298fe59f99e3706ffc28c43d26a11690d2ffd815a33ea3290766978",
+        "wy" : "125b2a4b635f514fd5d63215672f311ae5935c1774ed5d8a44897b68191e6369ab26df915e2066a943e59a3577319dac5a86640bc8c718d2b159479fdd22d11441"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004019a029c77fed04cab1ab8937fda8128fc19bf8c41a8f242f6a9ca6f0ae813c1709b8b03e26a9298fe59f99e3706ffc28c43d26a11690d2ffd815a33ea329076697800125b2a4b635f514fd5d63215672f311ae5935c1774ed5d8a44897b68191e6369ab26df915e2066a943e59a3577319dac5a86640bc8c718d2b159479fdd22d11441",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBmgKcd/7QTKsauJN/2oEo/Bm/jEGo\n8kL2qcpvCugTwXCbiwPiapKY/ln5njcG/8KMQ9JqEWkNL/2BWjPqMpB2aXgAElsq\nS2NfUU/V1jIVZy8xGuWTXBd07V2KRIl7aBkeY2mrJt+RXiBmqUPlmjV3MZ2sWoZk\nC8jHGNKxWUef3SLRFEE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 748,
+          "comment" : "r,s are large",
+          "msg" : "54657374",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386407024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400eb62878040b4ca0c8c61afe7e195e22e395f69c7859ac2b79802967098325573b56d3d65b7bcf3111bc4859e1d0816c541473ac1ffcf4a2cc7d6e6aa591ba117af005bea26cac7ce213584b5d35ab22d8b45dc88ff26edbadd487aa98ccaa71613bb7b79dce67a9bc36d3e980fc10d4313ac20c4cf271ecc1f4adab39513971aa4fb9d",
+        "wx" : "0eb62878040b4ca0c8c61afe7e195e22e395f69c7859ac2b79802967098325573b56d3d65b7bcf3111bc4859e1d0816c541473ac1ffcf4a2cc7d6e6aa591ba117af",
+        "wy" : "5bea26cac7ce213584b5d35ab22d8b45dc88ff26edbadd487aa98ccaa71613bb7b79dce67a9bc36d3e980fc10d4313ac20c4cf271ecc1f4adab39513971aa4fb9d"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400eb62878040b4ca0c8c61afe7e195e22e395f69c7859ac2b79802967098325573b56d3d65b7bcf3111bc4859e1d0816c541473ac1ffcf4a2cc7d6e6aa591ba117af005bea26cac7ce213584b5d35ab22d8b45dc88ff26edbadd487aa98ccaa71613bb7b79dce67a9bc36d3e980fc10d4313ac20c4cf271ecc1f4adab39513971aa4fb9d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQA62KHgEC0ygyMYa/n4ZXiLjlfaceF\nmsK3mAKWcJgyVXO1bT1lt7zzERvEhZ4dCBbFQUc6wf/PSizH1uaqWRuhF68AW+om\nysfOITWEtdNasi2LRdyI/ybtut1IeqmMyqcWE7t7edzmepvDbT6YD8ENQxOsIMTP\nJx7MH0ras5UTlxqk+50=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 749,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe02420095e19fd2b755d603bf994562d9a11f63cf4eadecbdc0ecb5a394e54529e8da58a527bc6d85725043786362ab4de6cbc7d80e625ae0a98861aea1c7bf7109c91f66",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401296b049f1979785b3377c5e28edf4c2787f213f2836beaf5d61407870ade857d5083e01d8728b0ddde1ba1bb3e791617eddb02a52c78049791ca52b646f93117c200b977a711a5030c4ef6990833296132203badbdbc01407c4aceb49c96b658fc77ff1f655ad74e1344e2fc55c91c7fc3432355192db3d2c03cd134ba387ad3acde40",
+        "wx" : "1296b049f1979785b3377c5e28edf4c2787f213f2836beaf5d61407870ade857d5083e01d8728b0ddde1ba1bb3e791617eddb02a52c78049791ca52b646f93117c2",
+        "wy" : "0b977a711a5030c4ef6990833296132203badbdbc01407c4aceb49c96b658fc77ff1f655ad74e1344e2fc55c91c7fc3432355192db3d2c03cd134ba387ad3acde40"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401296b049f1979785b3377c5e28edf4c2787f213f2836beaf5d61407870ade857d5083e01d8728b0ddde1ba1bb3e791617eddb02a52c78049791ca52b646f93117c200b977a711a5030c4ef6990833296132203badbdbc01407c4aceb49c96b658fc77ff1f655ad74e1344e2fc55c91c7fc3432355192db3d2c03cd134ba387ad3acde40",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBKWsEnxl5eFszd8Xijt9MJ4fyE/KD\na+r11hQHhwrehX1Qg+Adhyiw3d4bobs+eRYX7dsCpSx4BJeRylK2RvkxF8IAuXen\nEaUDDE72mQgzKWEyIDutvbwBQHxKzrSclrZY/Hf/H2Va104TROL8Vckcf8NDI1UZ\nLbPSwDzRNLo4etOs3kA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 750,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "54657374",
+          "sig" : "308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe024115837645583a37a7a665f983c5e347f65dca47647aa80fd2498a791d44d9b2850a151a6e86fce7d7bb814e724ff11b9ef726bf36c6e7548c37f82a24902876ee19",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04005f5059308349f9ebbb4d1c55c0afccf62162ec1dd12ef3ed906656924ffd99cab9f06b0eb218cff078a4677a5ce1cc07652bc976aefc732c28f67ef078a434e99900a5d14df310630d76ec03cb6f9b95bf1a22438105c88cd9fd3dac80f857add38271d8ba901684b26d436d4a859ad4cda5e9677b73cab3f3e5e41a3d7996607279ab",
+        "wx" : "5f5059308349f9ebbb4d1c55c0afccf62162ec1dd12ef3ed906656924ffd99cab9f06b0eb218cff078a4677a5ce1cc07652bc976aefc732c28f67ef078a434e999",
+        "wy" : "0a5d14df310630d76ec03cb6f9b95bf1a22438105c88cd9fd3dac80f857add38271d8ba901684b26d436d4a859ad4cda5e9677b73cab3f3e5e41a3d7996607279ab"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004005f5059308349f9ebbb4d1c55c0afccf62162ec1dd12ef3ed906656924ffd99cab9f06b0eb218cff078a4677a5ce1cc07652bc976aefc732c28f67ef078a434e99900a5d14df310630d76ec03cb6f9b95bf1a22438105c88cd9fd3dac80f857add38271d8ba901684b26d436d4a859ad4cda5e9677b73cab3f3e5e41a3d7996607279ab",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAX1BZMINJ+eu7TRxVwK/M9iFi7B3R\nLvPtkGZWkk/9mcq58GsOshjP8HikZ3pc4cwHZSvJdq78cywo9n7weKQ06ZkApdFN\n8xBjDXbsA8tvm5W/GiJDgQXIjNn9PayA+Fet04Jx2LqQFoSybUNtSoWa1M2l6Wd7\nc8qz8+XkGj15lmByeas=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 751,
+          "comment" : "small r and s",
+          "msg" : "54657374",
+          "sig" : "3006020101020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04001fb7064274ba3b5950f00a027cb2cf42d1ed69c89d944da0415e9086f35c85b44afdd635cdc1fade2ce71e62485e243ceb9f075a111476302e60d7d78b1207cda7006b4252077172332059a9c60f966893fda7e73377debcba9a8f69cee8f59d67a2ca892fad1df4463161f157c7c117c1bbfddc88441c4c8abc63667be5c1ff22f6e2",
+        "wx" : "1fb7064274ba3b5950f00a027cb2cf42d1ed69c89d944da0415e9086f35c85b44afdd635cdc1fade2ce71e62485e243ceb9f075a111476302e60d7d78b1207cda7",
+        "wy" : "6b4252077172332059a9c60f966893fda7e73377debcba9a8f69cee8f59d67a2ca892fad1df4463161f157c7c117c1bbfddc88441c4c8abc63667be5c1ff22f6e2"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004001fb7064274ba3b5950f00a027cb2cf42d1ed69c89d944da0415e9086f35c85b44afdd635cdc1fade2ce71e62485e243ceb9f075a111476302e60d7d78b1207cda7006b4252077172332059a9c60f966893fda7e73377debcba9a8f69cee8f59d67a2ca892fad1df4463161f157c7c117c1bbfddc88441c4c8abc63667be5c1ff22f6e2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAH7cGQnS6O1lQ8AoCfLLPQtHtacid\nlE2gQV6QhvNchbRK/dY1zcH63iznHmJIXiQ8658HWhEUdjAuYNfXixIHzacAa0JS\nB3FyMyBZqcYPlmiT/afnM3fevLqaj2nO6PWdZ6LKiS+tHfRGMWHxV8fBF8G7/dyI\nRBxMirxjZnvlwf8i9uI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 752,
+          "comment" : "small r and s",
+          "msg" : "54657374",
+          "sig" : "3006020101020102",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401877d42c110a9fbe3723e684ea01c552697a8e83678145cbadc2e27c33e76ef2ed885e7af77f83313213b04107b4b92f80aebfd670fd1467b2bb9333ac280ea9b6101acf4e85a0ccbdfc4703638c21eb45b4a93db3fa747b365238535cdaee4fc56aa95854b4ec9c451693aaf72a90d66d300d2211bdc1fa0cf85e5c24ae08ef2a24248",
+        "wx" : "1877d42c110a9fbe3723e684ea01c552697a8e83678145cbadc2e27c33e76ef2ed885e7af77f83313213b04107b4b92f80aebfd670fd1467b2bb9333ac280ea9b61",
+        "wy" : "1acf4e85a0ccbdfc4703638c21eb45b4a93db3fa747b365238535cdaee4fc56aa95854b4ec9c451693aaf72a90d66d300d2211bdc1fa0cf85e5c24ae08ef2a24248"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401877d42c110a9fbe3723e684ea01c552697a8e83678145cbadc2e27c33e76ef2ed885e7af77f83313213b04107b4b92f80aebfd670fd1467b2bb9333ac280ea9b6101acf4e85a0ccbdfc4703638c21eb45b4a93db3fa747b365238535cdaee4fc56aa95854b4ec9c451693aaf72a90d66d300d2211bdc1fa0cf85e5c24ae08ef2a24248",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBh31CwRCp++NyPmhOoBxVJpeo6DZ4\nFFy63C4nwz527y7Yheevd/gzEyE7BBB7S5L4Cuv9Zw/RRnsruTM6woDqm2EBrPTo\nWgzL38RwNjjCHrRbSpPbP6dHs2UjhTXNruT8VqqVhUtOycRRaTqvcqkNZtMA0iEb\n3B+gz4XlwkrgjvKiQkg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 753,
+          "comment" : "small r and s",
+          "msg" : "54657374",
+          "sig" : "3006020101020103",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 754,
+          "comment" : "r is larger than n",
+          "msg" : "54657374",
+          "sig" : "3047024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a020103",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04016eaf2c3043b10ad8a99be7f8ccc4931519b6ec59326f6a06f374cb4f86e1237df0f26df6a90cf86c30d42e3bd0583c744830decf78344545f4b6daea674a882db9006dfd09320a976d592c4d39d3090d6f4ad3992b700e3e90ed1a1346238c75f4baf493be8c1c16838ecec2d9994266042ff9c624869296ee9b023bbb12d40bc0af07",
+        "wx" : "16eaf2c3043b10ad8a99be7f8ccc4931519b6ec59326f6a06f374cb4f86e1237df0f26df6a90cf86c30d42e3bd0583c744830decf78344545f4b6daea674a882db9",
+        "wy" : "6dfd09320a976d592c4d39d3090d6f4ad3992b700e3e90ed1a1346238c75f4baf493be8c1c16838ecec2d9994266042ff9c624869296ee9b023bbb12d40bc0af07"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004016eaf2c3043b10ad8a99be7f8ccc4931519b6ec59326f6a06f374cb4f86e1237df0f26df6a90cf86c30d42e3bd0583c744830decf78344545f4b6daea674a882db9006dfd09320a976d592c4d39d3090d6f4ad3992b700e3e90ed1a1346238c75f4baf493be8c1c16838ecec2d9994266042ff9c624869296ee9b023bbb12d40bc0af07",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBbq8sMEOxCtipm+f4zMSTFRm27Fky\nb2oG83TLT4bhI33w8m32qQz4bDDULjvQWDx0SDDez3g0RUX0ttrqZ0qILbkAbf0J\nMgqXbVksTTnTCQ1vStOZK3AOPpDtGhNGI4x19Lr0k76MHBaDjs7C2ZlCZgQv+cYk\nhpKW7psCO7sS1AvArwc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 755,
+          "comment" : "s is larger than n",
+          "msg" : "54657374",
+          "sig" : "3047020101024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e914b3a90",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04018b70df396a6bd8418de6a1f7e80f915bcc079129cdcb4a1c76b0e1d2576910f1ae16f3c276718c841c03e18ce243ebae5aa618f09cddf470341224a5016f6f04e8017ad3c6102b2821200d373cffd5614a670bebdce6f244b34dce87dd8758786b7a2829cd53e59325dcebe94b5640b9d1ca775c52716a596d9e3a0840ffdbd64bf247",
+        "wx" : "18b70df396a6bd8418de6a1f7e80f915bcc079129cdcb4a1c76b0e1d2576910f1ae16f3c276718c841c03e18ce243ebae5aa618f09cddf470341224a5016f6f04e8",
+        "wy" : "17ad3c6102b2821200d373cffd5614a670bebdce6f244b34dce87dd8758786b7a2829cd53e59325dcebe94b5640b9d1ca775c52716a596d9e3a0840ffdbd64bf247"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004018b70df396a6bd8418de6a1f7e80f915bcc079129cdcb4a1c76b0e1d2576910f1ae16f3c276718c841c03e18ce243ebae5aa618f09cddf470341224a5016f6f04e8017ad3c6102b2821200d373cffd5614a670bebdce6f244b34dce87dd8758786b7a2829cd53e59325dcebe94b5640b9d1ca775c52716a596d9e3a0840ffdbd64bf247",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBi3DfOWpr2EGN5qH36A+RW8wHkSnN\ny0ocdrDh0ldpEPGuFvPCdnGMhBwD4YziQ+uuWqYY8Jzd9HA0EiSlAW9vBOgBetPG\nECsoISANNzz/1WFKZwvr3ObyRLNNzofdh1h4a3ooKc1T5ZMl3OvpS1ZAudHKd1xS\ncWpZbZ46CED/29ZL8kc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 756,
+          "comment" : "small r and s^-1",
+          "msg" : "54657374",
+          "sig" : "304802020100024201efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7ef87b4de1fc92dd757639408a50bee10764e326fdd2fa308dfde3e5243fdf4ac5ac",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04001333798864458808fd6b10a6c8251740da6d623440cdf1e3596e8312b58f23692d6a0210d1682c06a476f447034d7a346976d0c2ce1a583f96f79a5356b9a080b900643d23b521292fa96966b7f733cf208b6be75647df86e2e2ccda40ab3360ab1d631ef13fe66eb3e08faea19445b6f93e8323e17de290931fadbe2b6a7d2cdf33d7",
+        "wx" : "1333798864458808fd6b10a6c8251740da6d623440cdf1e3596e8312b58f23692d6a0210d1682c06a476f447034d7a346976d0c2ce1a583f96f79a5356b9a080b9",
+        "wy" : "643d23b521292fa96966b7f733cf208b6be75647df86e2e2ccda40ab3360ab1d631ef13fe66eb3e08faea19445b6f93e8323e17de290931fadbe2b6a7d2cdf33d7"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004001333798864458808fd6b10a6c8251740da6d623440cdf1e3596e8312b58f23692d6a0210d1682c06a476f447034d7a346976d0c2ce1a583f96f79a5356b9a080b900643d23b521292fa96966b7f733cf208b6be75647df86e2e2ccda40ab3360ab1d631ef13fe66eb3e08faea19445b6f93e8323e17de290931fadbe2b6a7d2cdf33d7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAEzN5iGRFiAj9axCmyCUXQNptYjRA\nzfHjWW6DErWPI2ktagIQ0WgsBqR29EcDTXo0aXbQws4aWD+W95pTVrmggLkAZD0j\ntSEpL6lpZrf3M88gi2vnVkffhuLizNpAqzNgqx1jHvE/5m6z4I+uoZRFtvk+gyPh\nfeKQkx+tvitqfSzfM9c=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 757,
+          "comment" : "smallish r and s^-1",
+          "msg" : "54657374",
+          "sig" : "304d02072d9b4d347952cd02420100508d073413de829275e76509fd81cff49adf4c80ed2ddd4a7937d1d918796878fec24cc46570982c3fb8f5e92ccdcb3e677f07e9bd0db0b84814be1c7949b0de",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040153fa0be1f9d199ba62b1ea704893e9b34b4d91e38f16ae8c43cf3ba9e3b7b09b1f93cf87655363aefe9396348aafb71aefc156789050df46f8403b046e1a906aaf01c2c41a7fa00d0f7aeaeca1564dabe870c9097182551b1cefeba6b4673e557a1b297587113943e25c00c21a54f45f280e0fbc511664933567f79cbd0e9e2a5ada75",
+        "wx" : "153fa0be1f9d199ba62b1ea704893e9b34b4d91e38f16ae8c43cf3ba9e3b7b09b1f93cf87655363aefe9396348aafb71aefc156789050df46f8403b046e1a906aaf",
+        "wy" : "1c2c41a7fa00d0f7aeaeca1564dabe870c9097182551b1cefeba6b4673e557a1b297587113943e25c00c21a54f45f280e0fbc511664933567f79cbd0e9e2a5ada75"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040153fa0be1f9d199ba62b1ea704893e9b34b4d91e38f16ae8c43cf3ba9e3b7b09b1f93cf87655363aefe9396348aafb71aefc156789050df46f8403b046e1a906aaf01c2c41a7fa00d0f7aeaeca1564dabe870c9097182551b1cefeba6b4673e557a1b297587113943e25c00c21a54f45f280e0fbc511664933567f79cbd0e9e2a5ada75",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBU/oL4fnRmbpisepwSJPps0tNkeOP\nFq6MQ887qeO3sJsfk8+HZVNjrv6TljSKr7ca78FWeJBQ30b4QDsEbhqQaq8BwsQa\nf6AND3rq7KFWTavocMkJcYJVGxzv66a0Zz5VehspdYcROUPiXADCGlT0XygOD7xR\nFmSTNWf3nL0Onipa2nU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 758,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "54657374",
+          "sig" : "3053020d1033e67e37b32b445580bf4eff0242013cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc3393f632affd3eaa3c8fb64507bd5996497bd588fb9e3947c097ced7546b57c8998",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040152304599ba21fcf9ef247b99df12ada714c90673f31700a714bccaa647f6308089a438d95a462064624b8c16d42d660f3c16a27a823df1dd0398899028ef8be6c000e2e61a27e8fbf0b0afb1c3948e8b89375b6e5ecb5ddd46e1d2c2a196baae1ef8d68e4f0a924a9b6bf85e50fccf719db610aa004fafcef83d996cd1efcbd00828a6",
+        "wx" : "152304599ba21fcf9ef247b99df12ada714c90673f31700a714bccaa647f6308089a438d95a462064624b8c16d42d660f3c16a27a823df1dd0398899028ef8be6c0",
+        "wy" : "0e2e61a27e8fbf0b0afb1c3948e8b89375b6e5ecb5ddd46e1d2c2a196baae1ef8d68e4f0a924a9b6bf85e50fccf719db610aa004fafcef83d996cd1efcbd00828a6"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040152304599ba21fcf9ef247b99df12ada714c90673f31700a714bccaa647f6308089a438d95a462064624b8c16d42d660f3c16a27a823df1dd0398899028ef8be6c000e2e61a27e8fbf0b0afb1c3948e8b89375b6e5ecb5ddd46e1d2c2a196baae1ef8d68e4f0a924a9b6bf85e50fccf719db610aa004fafcef83d996cd1efcbd00828a6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBUjBFmboh/PnvJHuZ3xKtpxTJBnPz\nFwCnFLzKpkf2MICJpDjZWkYgZGJLjBbULWYPPBaieoI98d0DmImQKO+L5sAA4uYa\nJ+j78LCvscOUjouJN1tuXstd3Ubh0sKhlrquHvjWjk8Kkkqba/heUPzPcZ22EKoA\nT6/O+D2ZbNHvy9AIKKY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 759,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "54657374",
+          "sig" : "30480202010002420086ecbf54ab59a4e195f0be1402edd8657bb94618fab50f2fe20fe5ebbc9ff0e491397ed313cc918d438eedb9b5ecb4d9dfa305303505baf25400ed8c20fc3fc47b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400d03acceeddb7d8f60041205def82e09e64bc59811cf6502dea8f72a9a8e7dd3c6ab03e3e6d4d131b68857d0ae96fd4b59d4fac820b10648fb282df94e5d29c62d3010b01c8530a089b07b1b2a34fda9dfe97123b1c0ef97c7c9eb64f44a6c1acf2101157d8596a9bdbdb54ad79b3b4a36dd06764cab024751c3f84cd0a3cd714d7e49c",
+        "wx" : "0d03acceeddb7d8f60041205def82e09e64bc59811cf6502dea8f72a9a8e7dd3c6ab03e3e6d4d131b68857d0ae96fd4b59d4fac820b10648fb282df94e5d29c62d3",
+        "wy" : "10b01c8530a089b07b1b2a34fda9dfe97123b1c0ef97c7c9eb64f44a6c1acf2101157d8596a9bdbdb54ad79b3b4a36dd06764cab024751c3f84cd0a3cd714d7e49c"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400d03acceeddb7d8f60041205def82e09e64bc59811cf6502dea8f72a9a8e7dd3c6ab03e3e6d4d131b68857d0ae96fd4b59d4fac820b10648fb282df94e5d29c62d3010b01c8530a089b07b1b2a34fda9dfe97123b1c0ef97c7c9eb64f44a6c1acf2101157d8596a9bdbdb54ad79b3b4a36dd06764cab024751c3f84cd0a3cd714d7e49c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQA0DrM7t232PYAQSBd74LgnmS8WYEc\n9lAt6o9yqajn3TxqsD4+bU0TG2iFfQrpb9S1nU+sggsQZI+ygt+U5dKcYtMBCwHI\nUwoImwexsqNP2p3+lxI7HA75fHyetk9EpsGs8hARV9hZapvb21StebO0o23QZ2TK\nsCR1HD+EzQo81xTX5Jw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 760,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "54657374",
+          "sig" : "3053020d062522bbd3ecbe7c39e93e7c2402420086ecbf54ab59a4e195f0be1402edd8657bb94618fab50f2fe20fe5ebbc9ff0e491397ed313cc918d438eedb9b5ecb4d9dfa305303505baf25400ed8c20fc3fc47b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401d929bab6105bedc9c5f1854ce3647422484e933a472c822f3fc88c768454039aa0dc1ec4f752157d46025ead0722b3cb86f682333e88ede6bd2f7487084873ad46005888243360b08ba6238d7c82d74920fb7c8d5ccaf92b2c47882e730e6a68a562474d3c4cd9cd1303574c290aeddac213cc831b6e710c9cd136892cacc7ac8e2e9a",
+        "wx" : "1d929bab6105bedc9c5f1854ce3647422484e933a472c822f3fc88c768454039aa0dc1ec4f752157d46025ead0722b3cb86f682333e88ede6bd2f7487084873ad46",
+        "wy" : "5888243360b08ba6238d7c82d74920fb7c8d5ccaf92b2c47882e730e6a68a562474d3c4cd9cd1303574c290aeddac213cc831b6e710c9cd136892cacc7ac8e2e9a"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401d929bab6105bedc9c5f1854ce3647422484e933a472c822f3fc88c768454039aa0dc1ec4f752157d46025ead0722b3cb86f682333e88ede6bd2f7487084873ad46005888243360b08ba6238d7c82d74920fb7c8d5ccaf92b2c47882e730e6a68a562474d3c4cd9cd1303574c290aeddac213cc831b6e710c9cd136892cacc7ac8e2e9a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB2Sm6thBb7cnF8YVM42R0IkhOkzpH\nLIIvP8iMdoRUA5qg3B7E91IVfUYCXq0HIrPLhvaCMz6I7ea9L3SHCEhzrUYAWIgk\nM2Cwi6YjjXyC10kg+3yNXMr5KyxHiC5zDmpopWJHTTxM2c0TA1dMKQrt2sITzIMb\nbnEMnNE2iSysx6yOLpo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 761,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "54657374",
+          "sig" : "308188024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138638a0242015555555555555555555555555555555555555555555555555555555555555555518baf05027f750ef25532ab85fa066e8ad2793125b112da747cf524bf0b7aed5b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04017bfe3ada4a1a06e732f484f1830d0c0b71c47b74fa506de3abdea6d139ab21dd72c7b1c13035f0ffd125433d0100a7030337b99dd1626b91ca5723335853a0f67f007d28447c2fc4c29fc74a838e30eae399e282b607fff061a27b0d69321ccc3ceb0fc3ae86a58c774028dafd108bd874b8c44f34f5ab9d2e31ca77d2aab3cc5eacdb",
+        "wx" : "17bfe3ada4a1a06e732f484f1830d0c0b71c47b74fa506de3abdea6d139ab21dd72c7b1c13035f0ffd125433d0100a7030337b99dd1626b91ca5723335853a0f67f",
+        "wy" : "7d28447c2fc4c29fc74a838e30eae399e282b607fff061a27b0d69321ccc3ceb0fc3ae86a58c774028dafd108bd874b8c44f34f5ab9d2e31ca77d2aab3cc5eacdb"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004017bfe3ada4a1a06e732f484f1830d0c0b71c47b74fa506de3abdea6d139ab21dd72c7b1c13035f0ffd125433d0100a7030337b99dd1626b91ca5723335853a0f67f007d28447c2fc4c29fc74a838e30eae399e282b607fff061a27b0d69321ccc3ceb0fc3ae86a58c774028dafd108bd874b8c44f34f5ab9d2e31ca77d2aab3cc5eacdb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBe/462koaBucy9ITxgw0MC3HEe3T6\nUG3jq96m0TmrId1yx7HBMDXw/9ElQz0BAKcDAze5ndFia5HKVyMzWFOg9n8AfShE\nfC/Ewp/HSoOOMOrjmeKCtgf/8GGiew1pMhzMPOsPw66GpYx3QCja/RCL2HS4xE80\n9audLjHKd9Kqs8xerNs=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 762,
+          "comment" : "s == 1",
+          "msg" : "54657374",
+          "sig" : "3047024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 763,
+          "comment" : "s == 0",
+          "msg" : "54657374",
+          "sig" : "3047024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04013b73be0ec4f18b36fdc20aac9675580a20cc725ed0de6fea63ab6111b4aaecc69b1fdf05bb1c7a71c4b7a5a1eaaff23be15604f405b5ecd3b3ed6afea8e49cd64900912180c981f480d2b8b7438988b03a0c5efdbd2da094f082f7fa57ecc41fde8c65d3c9d80f34f9124e151da55d96d2a9b991672de79449bcc1c0192b7650ae90b7",
+        "wx" : "13b73be0ec4f18b36fdc20aac9675580a20cc725ed0de6fea63ab6111b4aaecc69b1fdf05bb1c7a71c4b7a5a1eaaff23be15604f405b5ecd3b3ed6afea8e49cd649",
+        "wy" : "0912180c981f480d2b8b7438988b03a0c5efdbd2da094f082f7fa57ecc41fde8c65d3c9d80f34f9124e151da55d96d2a9b991672de79449bcc1c0192b7650ae90b7"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004013b73be0ec4f18b36fdc20aac9675580a20cc725ed0de6fea63ab6111b4aaecc69b1fdf05bb1c7a71c4b7a5a1eaaff23be15604f405b5ecd3b3ed6afea8e49cd64900912180c981f480d2b8b7438988b03a0c5efdbd2da094f082f7fa57ecc41fde8c65d3c9d80f34f9124e151da55d96d2a9b991672de79449bcc1c0192b7650ae90b7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBO3O+DsTxizb9wgqslnVYCiDMcl7Q\n3m/qY6thEbSq7MabH98Fuxx6ccS3paHqr/I74VYE9AW17NOz7Wr+qOSc1kkAkSGA\nyYH0gNK4t0OJiLA6DF79vS2glPCC9/pX7MQf3oxl08nYDzT5Ek4VHaVdltKpuZFn\nLeeUSbzBwBkrdlCukLc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 764,
+          "comment" : "point at infinity during verify",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd28c343c1df97cb35bfe600a47b84d2e81ddae4dc44ce23d75db7db8f489c3204024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401c01eab9ba6ddd21e33421034acd6ac923a409fab349e0380bfaa54b404890086a5e12fb09e1352712cfde15abc2563079a73d333c9c79c670fb06b5d802aa9b77600a76a28d03f657c61bf87ff78e7733a069556d2bd638b79316ab70b5a2809bc8a98a2a843238d4abe2698b2aa6aede1b2541bf3dcd007cf9cd5c4d4969c4f7ffccb",
+        "wx" : "1c01eab9ba6ddd21e33421034acd6ac923a409fab349e0380bfaa54b404890086a5e12fb09e1352712cfde15abc2563079a73d333c9c79c670fb06b5d802aa9b776",
+        "wy" : "0a76a28d03f657c61bf87ff78e7733a069556d2bd638b79316ab70b5a2809bc8a98a2a843238d4abe2698b2aa6aede1b2541bf3dcd007cf9cd5c4d4969c4f7ffccb"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401c01eab9ba6ddd21e33421034acd6ac923a409fab349e0380bfaa54b404890086a5e12fb09e1352712cfde15abc2563079a73d333c9c79c670fb06b5d802aa9b77600a76a28d03f657c61bf87ff78e7733a069556d2bd638b79316ab70b5a2809bc8a98a2a843238d4abe2698b2aa6aede1b2541bf3dcd007cf9cd5c4d4969c4f7ffccb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBwB6rm6bd0h4zQhA0rNaskjpAn6s0\nngOAv6pUtASJAIal4S+wnhNScSz94Vq8JWMHmnPTM8nHnGcPsGtdgCqpt3YAp2oo\n0D9lfGG/h/9453M6BpVW0r1ji3kxarcLWigJvIqYoqhDI41KviaYsqpq7eGyVBvz\n3NAHz5zVxNSWnE9//Ms=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 765,
+          "comment" : "u1 == 1",
+          "msg" : "54657374",
+          "sig" : "308187024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad024100c6ee9e33cf5c6715a1d148fd73f7318884b41adcb916021e2bc0e800a5c5dd97f5142178f6ae88c8fdd98e1afb0ce4c8d2c54b5f37b30b7da1997bb33b0b8a31",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400186365c73588807a51005412db004b45f5f7be3a6074e6119042978dbfbc5a431e16cc930747e6cd7511505b4c9349cedf908a5a9dbd33cdb0aeccbf69454457fb0014620a29a2691d8038d39e1e4de7c4243c8c42601e719945c1297c1a4b10d7415af37bf1ed0ddc9030bce530185dfdfc4658ff635f6bd9660becc8ff9eca4fddfa",
+        "wx" : "186365c73588807a51005412db004b45f5f7be3a6074e6119042978dbfbc5a431e16cc930747e6cd7511505b4c9349cedf908a5a9dbd33cdb0aeccbf69454457fb",
+        "wy" : "14620a29a2691d8038d39e1e4de7c4243c8c42601e719945c1297c1a4b10d7415af37bf1ed0ddc9030bce530185dfdfc4658ff635f6bd9660becc8ff9eca4fddfa"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400186365c73588807a51005412db004b45f5f7be3a6074e6119042978dbfbc5a431e16cc930747e6cd7511505b4c9349cedf908a5a9dbd33cdb0aeccbf69454457fb0014620a29a2691d8038d39e1e4de7c4243c8c42601e719945c1297c1a4b10d7415af37bf1ed0ddc9030bce530185dfdfc4658ff635f6bd9660becc8ff9eca4fddfa",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAGGNlxzWIgHpRAFQS2wBLRfX3vjpg\ndOYRkEKXjb+8WkMeFsyTB0fmzXURUFtMk0nO35CKWp29M82wrsy/aUVEV/sAFGIK\nKaJpHYA4054eTefEJDyMQmAecZlFwSl8GksQ10Fa83vx7Q3ckDC85TAYXf38Rlj/\nY19r2WYL7Mj/nspP3fo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 766,
+          "comment" : "u1 == n - 1",
+          "msg" : "54657374",
+          "sig" : "308188024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad024201ff391161cc30a398ea5e2eb7028c08ce777b4be52346e9fde1d43f17ff5a3a22625c72660ac8810da281f2732dfbfcc10768f07e5951e93c3119d63b6b562cd9d8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04002e2a746b55e05bc130d374c8abb8bf651a2e2b025404f08545befcb95c9f7f681f6f5b9bf2ebc45d4c8572921d3ab5dce144ea5d50ebec89b8c8f010ea31494863008c816f122d5d63b5fea00d1a00ed23577f7ef7d48f3973568353d468368ec77cbc9e3c5012839b74833087d51ba3e680ab5375be680ea8c18f7b619f32b141f281",
+        "wx" : "2e2a746b55e05bc130d374c8abb8bf651a2e2b025404f08545befcb95c9f7f681f6f5b9bf2ebc45d4c8572921d3ab5dce144ea5d50ebec89b8c8f010ea31494863",
+        "wy" : "08c816f122d5d63b5fea00d1a00ed23577f7ef7d48f3973568353d468368ec77cbc9e3c5012839b74833087d51ba3e680ab5375be680ea8c18f7b619f32b141f281"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004002e2a746b55e05bc130d374c8abb8bf651a2e2b025404f08545befcb95c9f7f681f6f5b9bf2ebc45d4c8572921d3ab5dce144ea5d50ebec89b8c8f010ea31494863008c816f122d5d63b5fea00d1a00ed23577f7ef7d48f3973568353d468368ec77cbc9e3c5012839b74833087d51ba3e680ab5375be680ea8c18f7b619f32b141f281",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQALip0a1XgW8Ew03TIq7i/ZRouKwJU\nBPCFRb78uVyff2gfb1ub8uvEXUyFcpIdOrXc4UTqXVDr7Im4yPAQ6jFJSGMAjIFv\nEi1dY7X+oA0aAO0jV39+99SPOXNWg1PUaDaOx3y8njxQEoObdIMwh9Ubo+aAq1N1\nvmgOqMGPe2GfMrFB8oE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 767,
+          "comment" : "u2 == 1",
+          "msg" : "54657374",
+          "sig" : "308188024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400d379f79826b04198df371ab0519d1a7f0a4f199d6149ca8b7f13a5da09cba024fbe7d4ff7fd7a8a93b5cbcaf3c68243f630d47d8f2b652b6a7d6b1c522a75fa9f201c660722d95c83c6b9457944acc671e881e8d17b07362f2f82799456f2f15d662d36aa09d5a5236288d3c1382e3e2308f46867d53c588a370857fae4d32f0a3ddaf",
+        "wx" : "0d379f79826b04198df371ab0519d1a7f0a4f199d6149ca8b7f13a5da09cba024fbe7d4ff7fd7a8a93b5cbcaf3c68243f630d47d8f2b652b6a7d6b1c522a75fa9f2",
+        "wy" : "1c660722d95c83c6b9457944acc671e881e8d17b07362f2f82799456f2f15d662d36aa09d5a5236288d3c1382e3e2308f46867d53c588a370857fae4d32f0a3ddaf"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400d379f79826b04198df371ab0519d1a7f0a4f199d6149ca8b7f13a5da09cba024fbe7d4ff7fd7a8a93b5cbcaf3c68243f630d47d8f2b652b6a7d6b1c522a75fa9f201c660722d95c83c6b9457944acc671e881e8d17b07362f2f82799456f2f15d662d36aa09d5a5236288d3c1382e3e2308f46867d53c588a370857fae4d32f0a3ddaf",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQA03n3mCawQZjfNxqwUZ0afwpPGZ1h\nScqLfxOl2gnLoCT759T/f9eoqTtcvK88aCQ/Yw1H2PK2Uran1rHFIqdfqfIBxmBy\nLZXIPGuUV5RKzGceiB6NF7BzYvL4J5lFby8V1mLTaqCdWlI2KI08E4Lj4jCPRoZ9\nU8WIo3CFf65NMvCj3a8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 768,
+          "comment" : "u2 == n - 1",
+          "msg" : "54657374",
+          "sig" : "308188024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad0242015555555555555555555555555555555555555555555555555555555555555555518baf05027f750ef25532ab85fa066e8ad2793125b112da747cf524bf0b7aed5c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401b9cc8cab6af3efce62a15de1f2adbbb22a4d2d74e8dcf32fec0a94a3da3508de1d4a073f5245f96c9a6aa3021e54eaa3533a7817c4e57944ab2174549b6b93eb5001712cdd8366c45118f016163a7347198f495a2a9bc427908dbc6dd4b330f56e1c1df4a9886f7fd63c49124ade60d5bf8e6b7ac3d69d38f9c4dbd8a1221638272ccb",
+        "wx" : "1b9cc8cab6af3efce62a15de1f2adbbb22a4d2d74e8dcf32fec0a94a3da3508de1d4a073f5245f96c9a6aa3021e54eaa3533a7817c4e57944ab2174549b6b93eb50",
+        "wy" : "1712cdd8366c45118f016163a7347198f495a2a9bc427908dbc6dd4b330f56e1c1df4a9886f7fd63c49124ade60d5bf8e6b7ac3d69d38f9c4dbd8a1221638272ccb"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401b9cc8cab6af3efce62a15de1f2adbbb22a4d2d74e8dcf32fec0a94a3da3508de1d4a073f5245f96c9a6aa3021e54eaa3533a7817c4e57944ab2174549b6b93eb5001712cdd8366c45118f016163a7347198f495a2a9bc427908dbc6dd4b330f56e1c1df4a9886f7fd63c49124ade60d5bf8e6b7ac3d69d38f9c4dbd8a1221638272ccb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBucyMq2rz785ioV3h8q27sipNLXTo\n3PMv7AqUo9o1CN4dSgc/UkX5bJpqowIeVOqjUzp4F8TleUSrIXRUm2uT61ABcSzd\ng2bEURjwFhY6c0cZj0laKpvEJ5CNvG3UszD1bhwd9KmIb3/WPEkSSt5g1b+Oa3rD\n1p04+cTb2KEiFjgnLMs=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 769,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "308186024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0240424f8a11451ecd0735f06da9d15265d82c3c08f43db200b4b9404d558c9749dd51b1607da78f82eda9f32f5e53aef6ed9b97191fbd3bae7f35ddd3e66903d8bb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04003826c91aaa33a183de3f6e134d865308aebc790e9287bc7ae136ed59bf03be44a7b5b43a18ca8af1a14e8ca88efe1c65f894976c56c48af00b5ac1f3cbcdf588b601ac3bce5fae3c2bb6dcf19d9c275eb2eb5614523a04bf0e7f98a4a50be7f80c8ccee8a9e7b74c8af076341704a7ac23769a420717227d6f7d1bbcfcecf720ecac39",
+        "wx" : "3826c91aaa33a183de3f6e134d865308aebc790e9287bc7ae136ed59bf03be44a7b5b43a18ca8af1a14e8ca88efe1c65f894976c56c48af00b5ac1f3cbcdf588b6",
+        "wy" : "1ac3bce5fae3c2bb6dcf19d9c275eb2eb5614523a04bf0e7f98a4a50be7f80c8ccee8a9e7b74c8af076341704a7ac23769a420717227d6f7d1bbcfcecf720ecac39"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004003826c91aaa33a183de3f6e134d865308aebc790e9287bc7ae136ed59bf03be44a7b5b43a18ca8af1a14e8ca88efe1c65f894976c56c48af00b5ac1f3cbcdf588b601ac3bce5fae3c2bb6dcf19d9c275eb2eb5614523a04bf0e7f98a4a50be7f80c8ccee8a9e7b74c8af076341704a7ac23769a420717227d6f7d1bbcfcecf720ecac39",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAOCbJGqozoYPeP24TTYZTCK68eQ6S\nh7x64TbtWb8DvkSntbQ6GMqK8aFOjKiO/hxl+JSXbFbEivALWsHzy831iLYBrDvO\nX648K7bc8Z2cJ16y61YUUjoEvw5/mKSlC+f4DIzO6Knnt0yK8HY0FwSnrCN2mkIH\nFyJ9b30bvPzs9yDsrDk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 770,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024141eeab7d3d7e80937cad0b86d3e53e14830166c2efa89df18ec6f88fc6a8a580601a91934ba922bd746351a008ac4f86dcc4d13a7ff09420f897b52bf88a4c9269",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400c861b3d5977dafd321c42eab1913a2f1a734e9fb1a218f33c02a941dafa41e7f5fa5b4d73f52c74c35e6262b1c4a1545c5cddfa912fe442ee7a16aaae0c5c3f64300601db981ab9593c9405723caa86d862c575b5c54a487467c2340e495f26dbb1587570d10d38609b38c500948055f596b290194b1e66ea8d06ffa7554d1d8fb6b18",
+        "wx" : "0c861b3d5977dafd321c42eab1913a2f1a734e9fb1a218f33c02a941dafa41e7f5fa5b4d73f52c74c35e6262b1c4a1545c5cddfa912fe442ee7a16aaae0c5c3f643",
+        "wy" : "601db981ab9593c9405723caa86d862c575b5c54a487467c2340e495f26dbb1587570d10d38609b38c500948055f596b290194b1e66ea8d06ffa7554d1d8fb6b18"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400c861b3d5977dafd321c42eab1913a2f1a734e9fb1a218f33c02a941dafa41e7f5fa5b4d73f52c74c35e6262b1c4a1545c5cddfa912fe442ee7a16aaae0c5c3f64300601db981ab9593c9405723caa86d862c575b5c54a487467c2340e495f26dbb1587570d10d38609b38c500948055f596b290194b1e66ea8d06ffa7554d1d8fb6b18",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAyGGz1Zd9r9MhxC6rGROi8ac06fsa\nIY8zwCqUHa+kHn9fpbTXP1LHTDXmJiscShVFxc3fqRL+RC7noWqq4MXD9kMAYB25\ngauVk8lAVyPKqG2GLFdbXFSkh0Z8I0DklfJtuxWHVw0Q04YJs4xQCUgFX1lrKQGU\nseZuqNBv+nVU0dj7axg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 771,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201a2eb25c2d3f9db15f320a4dd42e236f98a5d8c6774c12f982e2bce6c5e16cb53dbc52da6e091201170c7b11463700865120b560f106e1448c57f957a3bec28db90",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04001f02da363829ee08b4cc93464e2d7b16f2c262ef7977a4b4d40f1384b40bde6808128860e5539fb91e9231048024999abce18f1fbeea8983487549a4043b53023800754a059a8ea11bca4c1f2c536fbbd910c50386acd554c27478090dfa92999f27e26e9c5f0c551f7b02aa1523dbf56063f7bb7004d64904c1aec35bc73aefe2e808",
+        "wx" : "1f02da363829ee08b4cc93464e2d7b16f2c262ef7977a4b4d40f1384b40bde6808128860e5539fb91e9231048024999abce18f1fbeea8983487549a4043b530238",
+        "wy" : "754a059a8ea11bca4c1f2c536fbbd910c50386acd554c27478090dfa92999f27e26e9c5f0c551f7b02aa1523dbf56063f7bb7004d64904c1aec35bc73aefe2e808"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004001f02da363829ee08b4cc93464e2d7b16f2c262ef7977a4b4d40f1384b40bde6808128860e5539fb91e9231048024999abce18f1fbeea8983487549a4043b53023800754a059a8ea11bca4c1f2c536fbbd910c50386acd554c27478090dfa92999f27e26e9c5f0c551f7b02aa1523dbf56063f7bb7004d64904c1aec35bc73aefe2e808",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAHwLaNjgp7gi0zJNGTi17FvLCYu95\nd6S01A8ThLQL3mgIEohg5VOfuR6SMQSAJJmavOGPH77qiYNIdUmkBDtTAjgAdUoF\nmo6hG8pMHyxTb7vZEMUDhqzVVMJ0eAkN+pKZnyfibpxfDFUfewKqFSPb9WBj97tw\nBNZJBMGuw1vHOu/i6Ag=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 772,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200a521a445fe801dd1ff391161cc30a398ea5e2eb7028c08ce777b4be52346e9fddfff25612d4c640b972f4400e5bf597b342cc4a0e5e4d50ca579ce8a0ae09c0913",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04002ece2962ef4711f49b1697ac7fad0759167767a104b76ad87749c83ae2818bf66ab9d9509f73fb153eab8b54607dcca73d3c380975afa3ee393732b44a5934992c01186ad80bf123ba35bd5b21b3d95e2c672ad3b485f078620858cfb24f1bf61ead90fb1a2723ec501c2b7a97cdd1fc3e964e86d23c030a2ab90da6f3971da4f68c99",
+        "wx" : "2ece2962ef4711f49b1697ac7fad0759167767a104b76ad87749c83ae2818bf66ab9d9509f73fb153eab8b54607dcca73d3c380975afa3ee393732b44a5934992c",
+        "wy" : "1186ad80bf123ba35bd5b21b3d95e2c672ad3b485f078620858cfb24f1bf61ead90fb1a2723ec501c2b7a97cdd1fc3e964e86d23c030a2ab90da6f3971da4f68c99"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004002ece2962ef4711f49b1697ac7fad0759167767a104b76ad87749c83ae2818bf66ab9d9509f73fb153eab8b54607dcca73d3c380975afa3ee393732b44a5934992c01186ad80bf123ba35bd5b21b3d95e2c672ad3b485f078620858cfb24f1bf61ead90fb1a2723ec501c2b7a97cdd1fc3e964e86d23c030a2ab90da6f3971da4f68c99",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQALs4pYu9HEfSbFpesf60HWRZ3Z6EE\nt2rYd0nIOuKBi/ZqudlQn3P7FT6ri1RgfcynPTw4CXWvo+45NzK0Slk0mSwBGGrY\nC/EjujW9WyGz2V4sZyrTtIXweGIIWM+yTxv2Hq2Q+xonI+xQHCt6l83R/D6WTobS\nPAMKKrkNpvOXHaT2jJk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 773,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02411a445fe801dd1ff391161cc30a398ea5e2eb7028c08ce777b4be52346e9fde1d43a6e18df0b42a423dcc5bba72d6eaa3482d00750f395c72f7b528c14e6494fd8f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401ab981f507aac6c08a9af8d7963c0cc95d9a4176a30bd36d9b8b966697912f56908792ccf15c6ca418151aa2e841c17783f8414fa4d5c222e49c007adcab10aa034008d1a1688a839931084caede33758208656837292209a877fbc1c12eb56ff98508d23483d6e36a6d47e0f2217d258cddcc6f2effe243c0a33664e0aba0e46da33b9",
+        "wx" : "1ab981f507aac6c08a9af8d7963c0cc95d9a4176a30bd36d9b8b966697912f56908792ccf15c6ca418151aa2e841c17783f8414fa4d5c222e49c007adcab10aa034",
+        "wy" : "08d1a1688a839931084caede33758208656837292209a877fbc1c12eb56ff98508d23483d6e36a6d47e0f2217d258cddcc6f2effe243c0a33664e0aba0e46da33b9"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401ab981f507aac6c08a9af8d7963c0cc95d9a4176a30bd36d9b8b966697912f56908792ccf15c6ca418151aa2e841c17783f8414fa4d5c222e49c007adcab10aa034008d1a1688a839931084caede33758208656837292209a877fbc1c12eb56ff98508d23483d6e36a6d47e0f2217d258cddcc6f2effe243c0a33664e0aba0e46da33b9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBq5gfUHqsbAipr415Y8DMldmkF2ow\nvTbZuLlmaXkS9WkIeSzPFcbKQYFRqi6EHBd4P4QU+k1cIi5JwAetyrEKoDQAjRoW\niKg5kxCEyu3jN1gghlaDcpIgmod/vBwS61b/mFCNI0g9bjam1H4PIhfSWM3cxvLv\n/iQ8CjNmTgq6DkbaM7k=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 774,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02413488bfd003ba3fe7222c398614731d4bc5d6e0518119ceef697ca468dd3fbc3a874dc31be16854847b98b774e5add546905a00ea1e72b8e5ef6a51829cc929fb1e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400fefacf425661c8d3a2183fc4ce11b9a79798b923671e42c693c10bee06d8a7b461efa4a32573cac7a0164f2ba3e9f48366b8ad064170fbe798664b15389d8e8da4017f4b29cb1ae09f640a6abeb78a84677422befb80416341386adee4dae702c7e16ae83d024531e1b63b01acb2c46e4c0e25de56915bd4c90ef113e8779108fae267",
+        "wx" : "0fefacf425661c8d3a2183fc4ce11b9a79798b923671e42c693c10bee06d8a7b461efa4a32573cac7a0164f2ba3e9f48366b8ad064170fbe798664b15389d8e8da4",
+        "wy" : "17f4b29cb1ae09f640a6abeb78a84677422befb80416341386adee4dae702c7e16ae83d024531e1b63b01acb2c46e4c0e25de56915bd4c90ef113e8779108fae267"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400fefacf425661c8d3a2183fc4ce11b9a79798b923671e42c693c10bee06d8a7b461efa4a32573cac7a0164f2ba3e9f48366b8ad064170fbe798664b15389d8e8da4017f4b29cb1ae09f640a6abeb78a84677422befb80416341386adee4dae702c7e16ae83d024531e1b63b01acb2c46e4c0e25de56915bd4c90ef113e8779108fae267",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQA/vrPQlZhyNOiGD/EzhG5p5eYuSNn\nHkLGk8EL7gbYp7Rh76SjJXPKx6AWTyuj6fSDZritBkFw++eYZksVOJ2OjaQBf0sp\nyxrgn2QKar63ioRndCK++4BBY0E4at7k2ucCx+Fq6D0CRTHhtjsBrLLEbkwOJd5W\nkVvUyQ7xE+h3kQj64mc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 775,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201fe801dd1ff391161cc30a398ea5e2eb7028c08ce777b4be52346e9fde1d43f17f9b003304fb6269c9f550768537b35f96443556a62b5ec77958bd8e4204d6354ce",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401ba563f243d8590233be59745dc8e311e87b6a9e32bddbdf40f0dc87a11bdd1d75d58d312c36dc8e272223690da1b6a058d5dab56f2fc6f297121a5ab288c269e7501e034d2e5ddb90efd4893e48694b4cf5c85e8bdcafbbcae51880d97e22d14d838f8162edb0e026f5ba88b150e3f2c1fc49ed2429793b76e92f1afa9f01805105cd8",
+        "wx" : "1ba563f243d8590233be59745dc8e311e87b6a9e32bddbdf40f0dc87a11bdd1d75d58d312c36dc8e272223690da1b6a058d5dab56f2fc6f297121a5ab288c269e75",
+        "wy" : "1e034d2e5ddb90efd4893e48694b4cf5c85e8bdcafbbcae51880d97e22d14d838f8162edb0e026f5ba88b150e3f2c1fc49ed2429793b76e92f1afa9f01805105cd8"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401ba563f243d8590233be59745dc8e311e87b6a9e32bddbdf40f0dc87a11bdd1d75d58d312c36dc8e272223690da1b6a058d5dab56f2fc6f297121a5ab288c269e7501e034d2e5ddb90efd4893e48694b4cf5c85e8bdcafbbcae51880d97e22d14d838f8162edb0e026f5ba88b150e3f2c1fc49ed2429793b76e92f1afa9f01805105cd8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBulY/JD2FkCM75ZdF3I4xHoe2qeMr\n3b30Dw3IehG90dddWNMSw23I4nIiNpDaG2oFjV2rVvL8bylxIaWrKIwmnnUB4DTS\n5d25Dv1Ik+SGlLTPXIXovcr7vK5RiA2X4i0U2Dj4Fi7bDgJvW6iLFQ4/LB/EntJC\nl5O3bpLxr6nwGAUQXNg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 776,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242014128151a7d33a465767e87681050667ae528af3c43cfc59e3c3c1c8037d941b12bed6b79efcbcacf25ad46226c5c2b2bbfa1360e23c331db67cede47d9b0aa3fd2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04002434cca27c3965d30c1ac37604fecd56f0d4ac701c1d7a4cc735774a1091365cc1a7cb5e2d66d89931551fdce04c0def1503e2ec2b7820c199ae990e36352386e5015a3bd7db62f9b5f96f50f14cf0b315aaa1342bf43525c9cd2eb04d2b83ec21404fe51f67511d1ee72967e7836b8316e8228477f8933e45df55b75feba4319953c6",
+        "wx" : "2434cca27c3965d30c1ac37604fecd56f0d4ac701c1d7a4cc735774a1091365cc1a7cb5e2d66d89931551fdce04c0def1503e2ec2b7820c199ae990e36352386e5",
+        "wy" : "15a3bd7db62f9b5f96f50f14cf0b315aaa1342bf43525c9cd2eb04d2b83ec21404fe51f67511d1ee72967e7836b8316e8228477f8933e45df55b75feba4319953c6"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004002434cca27c3965d30c1ac37604fecd56f0d4ac701c1d7a4cc735774a1091365cc1a7cb5e2d66d89931551fdce04c0def1503e2ec2b7820c199ae990e36352386e5015a3bd7db62f9b5f96f50f14cf0b315aaa1342bf43525c9cd2eb04d2b83ec21404fe51f67511d1ee72967e7836b8316e8228477f8933e45df55b75feba4319953c6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAJDTMonw5ZdMMGsN2BP7NVvDUrHAc\nHXpMxzV3ShCRNlzBp8teLWbYmTFVH9zgTA3vFQPi7Ct4IMGZrpkONjUjhuUBWjvX\n22L5tflvUPFM8LMVqqE0K/Q1JcnNLrBNK4PsIUBP5R9nUR0e5yln54NrgxboIoR3\n+JM+Rd9Vt1/rpDGZU8Y=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 777,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242019bcf27559ab324f2a0ebc95d059edeccd613604232da95c84d41d4d990ae7bb2d12b8d297d99fb86b64572d6fce2a34e4fa5e168f6894d4a1a828e2c6dbbdf31a2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04003eeab7241b49825f8db39043c307a9dbbb626ccc306931c6a88d4245257ae005762d54944b8a97950fd3be02ee5bcbb5a10068b230c1bd21003073033b5b4072e20089b2134afaff1d7e19fc23d44110608efbc6e2b8120a16a63bdff2e065fcc942e796c6dbdff14fc179ab694ee865e83a28e70e8ba63565c2fa2f31ac3e71bdc46a",
+        "wx" : "3eeab7241b49825f8db39043c307a9dbbb626ccc306931c6a88d4245257ae005762d54944b8a97950fd3be02ee5bcbb5a10068b230c1bd21003073033b5b4072e2",
+        "wy" : "089b2134afaff1d7e19fc23d44110608efbc6e2b8120a16a63bdff2e065fcc942e796c6dbdff14fc179ab694ee865e83a28e70e8ba63565c2fa2f31ac3e71bdc46a"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004003eeab7241b49825f8db39043c307a9dbbb626ccc306931c6a88d4245257ae005762d54944b8a97950fd3be02ee5bcbb5a10068b230c1bd21003073033b5b4072e20089b2134afaff1d7e19fc23d44110608efbc6e2b8120a16a63bdff2e065fcc942e796c6dbdff14fc179ab694ee865e83a28e70e8ba63565c2fa2f31ac3e71bdc46a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAPuq3JBtJgl+Ns5BDwwep27tibMww\naTHGqI1CRSV64AV2LVSUS4qXlQ/TvgLuW8u1oQBosjDBvSEAMHMDO1tAcuIAibIT\nSvr/HX4Z/CPUQRBgjvvG4rgSChamO9/y4GX8yULnlsbb3/FPwXmraU7oZeg6KOcO\ni6Y1ZcL6LzGsPnG9xGo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 778,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200b6cd381945713041c7990356370a00a10888ce905df2c792226a96cadb61df94bc4277c04afbcdabf376f02d2a6addf4052ad7673b1ae1e1ec49af389066810792",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04017fb838ef9a6bc8876ef2188a5f0d36fb76642673ec222f23f49cfdd860c50534d3477609c3a1165e93dfafcc1034d6cf76296cd02f56e33f50efa202cdd7dd0a170100d275bcb8369c34cf3046d198ffaf4ccebb03139aad8e4401310f763e78b4ad0dd87fa6e0438bf430b2c10f25f8819dc546b6b06613eaf068c59cecb2bb91684a",
+        "wx" : "17fb838ef9a6bc8876ef2188a5f0d36fb76642673ec222f23f49cfdd860c50534d3477609c3a1165e93dfafcc1034d6cf76296cd02f56e33f50efa202cdd7dd0a17",
+        "wy" : "100d275bcb8369c34cf3046d198ffaf4ccebb03139aad8e4401310f763e78b4ad0dd87fa6e0438bf430b2c10f25f8819dc546b6b06613eaf068c59cecb2bb91684a"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004017fb838ef9a6bc8876ef2188a5f0d36fb76642673ec222f23f49cfdd860c50534d3477609c3a1165e93dfafcc1034d6cf76296cd02f56e33f50efa202cdd7dd0a170100d275bcb8369c34cf3046d198ffaf4ccebb03139aad8e4401310f763e78b4ad0dd87fa6e0438bf430b2c10f25f8819dc546b6b06613eaf068c59cecb2bb91684a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBf7g475pryIdu8hiKXw02+3ZkJnPs\nIi8j9Jz92GDFBTTTR3YJw6EWXpPfr8wQNNbPdils0C9W4z9Q76ICzdfdChcBANJ1\nvLg2nDTPMEbRmP+vTM67AxOarY5EATEPdj54tK0N2H+m4EOL9DCywQ8l+IGdxUa2\nsGYT6vBoxZzssruRaEo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 779,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200ffded83af75d70997c6507c92b1756cd13e9e1fb85e126ffa5a35fd95539b45b0e7fea93830bd009beeaec68f551ad5771500f584c66304c97c2c8f19c141a45a7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04013d2a5518c45b602f7b3eee2e261a997aa78a5a831c44e3ada16fdb0cf1b329269efb152cfe8e4e08077b67cc27ab4ae42995b7a9971efe5248175cb5d7ca63f78a00d2b676ca3d41f8ed8bb65309de6ec5379941a5f74a6d70ddcae1f7365ce71fdef03e372aa31408a8a51cc34cac54f6ab7366d98758b7f93fc976e0fe51f3871b82",
+        "wx" : "13d2a5518c45b602f7b3eee2e261a997aa78a5a831c44e3ada16fdb0cf1b329269efb152cfe8e4e08077b67cc27ab4ae42995b7a9971efe5248175cb5d7ca63f78a",
+        "wy" : "0d2b676ca3d41f8ed8bb65309de6ec5379941a5f74a6d70ddcae1f7365ce71fdef03e372aa31408a8a51cc34cac54f6ab7366d98758b7f93fc976e0fe51f3871b82"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004013d2a5518c45b602f7b3eee2e261a997aa78a5a831c44e3ada16fdb0cf1b329269efb152cfe8e4e08077b67cc27ab4ae42995b7a9971efe5248175cb5d7ca63f78a00d2b676ca3d41f8ed8bb65309de6ec5379941a5f74a6d70ddcae1f7365ce71fdef03e372aa31408a8a51cc34cac54f6ab7366d98758b7f93fc976e0fe51f3871b82",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBPSpVGMRbYC97Pu4uJhqZeqeKWoMc\nROOtoW/bDPGzKSae+xUs/o5OCAd7Z8wnq0rkKZW3qZce/lJIF1y118pj94oA0rZ2\nyj1B+O2LtlMJ3m7FN5lBpfdKbXDdyuH3NlznH97wPjcqoxQIqKUcw0ysVParc2bZ\nh1i3+T/JduD+UfOHG4I=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 780,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201ffbdb075eebae132f8ca0f92562ead9a27d3c3f70bc24dff4b46bfb2aa7368b61cffd5270617a0137dd5d8d1eaa35aaee2a01eb098cc60992f8591e33828348b4e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400ac4e9ad1fad8054a2e13203fcc489333955bfb7762aed45b61e751826f8a130b5307c1f2f052001dc39f971f195d6a9c6a5ab5d02597822a892ae2be67143bf2ae005ce0fd82e350b85f2d7a2edbd595a1e890a143ee9a17f14aed31950d517d457e95ee160f818b7e7ae6b72135504516b4bbdbc85718f442a3dc9a21ee4da0f327b6",
+        "wx" : "0ac4e9ad1fad8054a2e13203fcc489333955bfb7762aed45b61e751826f8a130b5307c1f2f052001dc39f971f195d6a9c6a5ab5d02597822a892ae2be67143bf2ae",
+        "wy" : "5ce0fd82e350b85f2d7a2edbd595a1e890a143ee9a17f14aed31950d517d457e95ee160f818b7e7ae6b72135504516b4bbdbc85718f442a3dc9a21ee4da0f327b6"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400ac4e9ad1fad8054a2e13203fcc489333955bfb7762aed45b61e751826f8a130b5307c1f2f052001dc39f971f195d6a9c6a5ab5d02597822a892ae2be67143bf2ae005ce0fd82e350b85f2d7a2edbd595a1e890a143ee9a17f14aed31950d517d457e95ee160f818b7e7ae6b72135504516b4bbdbc85718f442a3dc9a21ee4da0f327b6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQArE6a0frYBUouEyA/zEiTM5Vb+3di\nrtRbYedRgm+KEwtTB8Hy8FIAHcOflx8ZXWqcalq10CWXgiqJKuK+ZxQ78q4AXOD9\nguNQuF8tei7b1ZWh6JChQ+6aF/FK7TGVDVF9RX6V7hYPgYt+eua3ITVQRRa0u9vI\nVxj0QqPcmiHuTaDzJ7Y=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 781,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200ff9c88b0e61851cc752f175b814604673bbda5f291a374fef0ea1f8bffad1d11312e393305644086d140f93996fdfe6083b4783f2ca8f49e188ceb1db5ab166cec",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04009d1aefc011608774dde6b1574cf79735691bccd0d534979555b923e4803f496e096d95af7dbf8025955312cf3180f2b124e1404ba8bd462cf8c750bd157dbb18f1016e37365625e283c6447676bec298410a36b9c8c64ba5a1b69179179dd8b8f3e8e659ccac0cdf1c42f174d3580a0082c131a8865e50ad9af9088eb2d63f0b4768ae",
+        "wx" : "09d1aefc011608774dde6b1574cf79735691bccd0d534979555b923e4803f496e096d95af7dbf8025955312cf3180f2b124e1404ba8bd462cf8c750bd157dbb18f1",
+        "wy" : "16e37365625e283c6447676bec298410a36b9c8c64ba5a1b69179179dd8b8f3e8e659ccac0cdf1c42f174d3580a0082c131a8865e50ad9af9088eb2d63f0b4768ae"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004009d1aefc011608774dde6b1574cf79735691bccd0d534979555b923e4803f496e096d95af7dbf8025955312cf3180f2b124e1404ba8bd462cf8c750bd157dbb18f1016e37365625e283c6447676bec298410a36b9c8c64ba5a1b69179179dd8b8f3e8e659ccac0cdf1c42f174d3580a0082c131a8865e50ad9af9088eb2d63f0b4768ae",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAnRrvwBFgh3Td5rFXTPeXNWkbzNDV\nNJeVVbkj5IA/SW4JbZWvfb+AJZVTEs8xgPKxJOFAS6i9Riz4x1C9FX27GPEBbjc2\nViXig8ZEdna+wphBCja5yMZLpaG2kXkXndi48+jmWcysDN8cQvF001gKAILBMaiG\nXlCtmvkIjrLWPwtHaK4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 782,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200d17592e169fced8af990526ea1711b7cc52ec633ba6097cc1715e7362f0b65a9ede296d370489008b863d88a31b804328905ab0788370a2462bfcabd1df6146dc8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04010f5824d11d100f9c1dea1f440fffe6aef143a8fc9aac9e64e14f7baff3a62a5ae9f6dd40dd368b65239aa80231869e2aa7aa24f058d17a6c359246bdf5ec85d705012d07c251fecbcf5016a8ea9e3c46bc53184bba961d4ae89dabfaa1aee334dcf94824cf1a6f840e9a8ba1cebfbb9881acc8e806284d0581b7c8598f3e7e466dea09",
+        "wx" : "10f5824d11d100f9c1dea1f440fffe6aef143a8fc9aac9e64e14f7baff3a62a5ae9f6dd40dd368b65239aa80231869e2aa7aa24f058d17a6c359246bdf5ec85d705",
+        "wy" : "12d07c251fecbcf5016a8ea9e3c46bc53184bba961d4ae89dabfaa1aee334dcf94824cf1a6f840e9a8ba1cebfbb9881acc8e806284d0581b7c8598f3e7e466dea09"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004010f5824d11d100f9c1dea1f440fffe6aef143a8fc9aac9e64e14f7baff3a62a5ae9f6dd40dd368b65239aa80231869e2aa7aa24f058d17a6c359246bdf5ec85d705012d07c251fecbcf5016a8ea9e3c46bc53184bba961d4ae89dabfaa1aee334dcf94824cf1a6f840e9a8ba1cebfbb9881acc8e806284d0581b7c8598f3e7e466dea09",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBD1gk0R0QD5wd6h9ED//mrvFDqPya\nrJ5k4U97r/OmKlrp9t1A3TaLZSOaqAIxhp4qp6ok8FjRemw1kka99eyF1wUBLQfC\nUf7Lz1AWqOqePEa8UxhLupYdSuidq/qhruM03PlIJM8ab4QOmouhzr+7mIGsyOgG\nKE0FgbfIWY8+fkZt6gk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 783,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02415555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555554",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401b557f6fc21f16e6a8e51b2904b24fb8c75c8fee4b1b0ff975fcd54c491a0e52758a3883038dbcf21f19e5791463c2d952bb4b0b6428f0ae7369b41d1d97661b29400f75c8593f9ecf54a26cc8c7b418f9fbca4296885b93670939942f5dcf6cb4a03c2344d0411df1e5a548652534c4b7dbcce9401697252267e8745d071388eec832e",
+        "wx" : "1b557f6fc21f16e6a8e51b2904b24fb8c75c8fee4b1b0ff975fcd54c491a0e52758a3883038dbcf21f19e5791463c2d952bb4b0b6428f0ae7369b41d1d97661b294",
+        "wy" : "0f75c8593f9ecf54a26cc8c7b418f9fbca4296885b93670939942f5dcf6cb4a03c2344d0411df1e5a548652534c4b7dbcce9401697252267e8745d071388eec832e"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401b557f6fc21f16e6a8e51b2904b24fb8c75c8fee4b1b0ff975fcd54c491a0e52758a3883038dbcf21f19e5791463c2d952bb4b0b6428f0ae7369b41d1d97661b29400f75c8593f9ecf54a26cc8c7b418f9fbca4296885b93670939942f5dcf6cb4a03c2344d0411df1e5a548652534c4b7dbcce9401697252267e8745d071388eec832e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBtVf2/CHxbmqOUbKQSyT7jHXI/uSx\nsP+XX81UxJGg5SdYo4gwONvPIfGeV5FGPC2VK7SwtkKPCuc2m0HR2XZhspQA91yF\nk/ns9UomzIx7QY+fvKQpaIW5NnCTmUL13PbLSgPCNE0EEd8eWlSGUlNMS328zpQB\naXJSJn6HRdBxOI7sgy4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 784,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242009f57708fa97eba94c6d4782cdd4e33bb95c1353bde095232e3e2bab277bb5d2b48f55a53ffe928d034c29970a9e5f384a003907d3d9b82a86817cc61fb17f4c59e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400ce022b543a181fdd3130ce35926178a7f0ef971c5fe848b02dc1bf68c883b29aa35369abd199ed628ea8373a9660a1c085414a2c66de0128c08f8386efeca00d3f00a29c704baaea0214ab9444e92d47db59c448c65594b709c5bd4307897c98d0bccb4a9f351c51d2273ef2bb84d687c305e7636b55fd3e3854b4b34ca7ba71276aca",
+        "wx" : "0ce022b543a181fdd3130ce35926178a7f0ef971c5fe848b02dc1bf68c883b29aa35369abd199ed628ea8373a9660a1c085414a2c66de0128c08f8386efeca00d3f",
+        "wy" : "0a29c704baaea0214ab9444e92d47db59c448c65594b709c5bd4307897c98d0bccb4a9f351c51d2273ef2bb84d687c305e7636b55fd3e3854b4b34ca7ba71276aca"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400ce022b543a181fdd3130ce35926178a7f0ef971c5fe848b02dc1bf68c883b29aa35369abd199ed628ea8373a9660a1c085414a2c66de0128c08f8386efeca00d3f00a29c704baaea0214ab9444e92d47db59c448c65594b709c5bd4307897c98d0bccb4a9f351c51d2273ef2bb84d687c305e7636b55fd3e3854b4b34ca7ba71276aca",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAzgIrVDoYH90xMM41kmF4p/Dvlxxf\n6EiwLcG/aMiDspqjU2mr0ZntYo6oNzqWYKHAhUFKLGbeASjAj4OG7+ygDT8Aopxw\nS6rqAhSrlETpLUfbWcRIxlWUtwnFvUMHiXyY0LzLSp81HFHSJz7yu4TWh8MF52Nr\nVf0+OFS0s0ynunEnaso=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 785,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024168d98fa90736eff3e90f8fcfe50838b6fa0bf2cde77bc51e3f41019c8006f4e9cbaeadce7dbb44462da6425be9cfdaecb234c41749ce695be1b5ead2e6b1205f35",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400400d194f51d80218c0296e978b9b7a5ebb0d373d21e9ed7f4be8ae25ea5b6fceb580dc4510826525fe138d1a4e20cc293c530dba4b85c3d29bb874867c3684696a01537ba3c32c1f1f9b2d9e80f88ffcdc4aa5246e8145b87c37d473044234d8ad28c6abd5a186ed0ab61c6e72ddef77b099f51edc58ebeb433aed064503ca494c4c73",
+        "wx" : "400d194f51d80218c0296e978b9b7a5ebb0d373d21e9ed7f4be8ae25ea5b6fceb580dc4510826525fe138d1a4e20cc293c530dba4b85c3d29bb874867c3684696a",
+        "wy" : "1537ba3c32c1f1f9b2d9e80f88ffcdc4aa5246e8145b87c37d473044234d8ad28c6abd5a186ed0ab61c6e72ddef77b099f51edc58ebeb433aed064503ca494c4c73"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400400d194f51d80218c0296e978b9b7a5ebb0d373d21e9ed7f4be8ae25ea5b6fceb580dc4510826525fe138d1a4e20cc293c530dba4b85c3d29bb874867c3684696a01537ba3c32c1f1f9b2d9e80f88ffcdc4aa5246e8145b87c37d473044234d8ad28c6abd5a186ed0ab61c6e72ddef77b099f51edc58ebeb433aed064503ca494c4c73",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAQA0ZT1HYAhjAKW6Xi5t6XrsNNz0h\n6e1/S+iuJepbb861gNxFEIJlJf4TjRpOIMwpPFMNukuFw9KbuHSGfDaEaWoBU3uj\nwywfH5stnoD4j/zcSqUkboFFuHw31HMEQjTYrSjGq9Whhu0Kthxuct3vd7CZ9R7c\nWOvrQzrtBkUDyklMTHM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 786,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024200e97ae66bcd4cae36fffffffffffffffffffffffffffffffffffffffffffffffffd68bc9726f02dbf8598a98b3e5077eff6f2491eb678ed040fb338c084a9ea8a4c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040078266f579dca13ea14338c32a0d6812dfd98720a2a1ea2bfa44ba2b3fe15c63063c8cc793c96ee960cf537e34ad0cafa462192cf6285cb8c48d9399bf552d4fc6a0198bede612689d2289841e4905be766dba8a07b00a4d4a96f9a107160a9b26eb32fda799634e007ee50e34f6b25560d7eed1728d4b5edc4537df4f508910acef736",
+        "wx" : "78266f579dca13ea14338c32a0d6812dfd98720a2a1ea2bfa44ba2b3fe15c63063c8cc793c96ee960cf537e34ad0cafa462192cf6285cb8c48d9399bf552d4fc6a",
+        "wy" : "198bede612689d2289841e4905be766dba8a07b00a4d4a96f9a107160a9b26eb32fda799634e007ee50e34f6b25560d7eed1728d4b5edc4537df4f508910acef736"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040078266f579dca13ea14338c32a0d6812dfd98720a2a1ea2bfa44ba2b3fe15c63063c8cc793c96ee960cf537e34ad0cafa462192cf6285cb8c48d9399bf552d4fc6a0198bede612689d2289841e4905be766dba8a07b00a4d4a96f9a107160a9b26eb32fda799634e007ee50e34f6b25560d7eed1728d4b5edc4537df4f508910acef736",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAeCZvV53KE+oUM4wyoNaBLf2Ycgoq\nHqK/pEuis/4VxjBjyMx5PJbulgz1N+NK0Mr6RiGSz2KFy4xI2Tmb9VLU/GoBmL7e\nYSaJ0iiYQeSQW+dm26igewCk1KlvmhBxYKmybrMv2nmWNOAH7lDjT2slVg1+7Rco\n1LXtxFN99PUIkQrO9zY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 787,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201ae66bcd4cae36ffffffffffffffffffffffffffffffffffffffffffffffffffffb3954212f8bea578d93e685e5dba329811b2542bb398233e2944bceb19263325d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04005c585c0fadec9a34fcc0804154f14cb5668b997f2e096da0974b23e9902e3499956037a178a5210833507e1e108ee5cd994f659e3e8caade9d2958ed48f66991c301282c1969a68e190c611ec0322352ef01c750dc87464aa01024b2c10c9d4b6a4a29f99ea740db8dafab65ed75423601654d68f4df642e80a4e79ca12dfb0ee42404",
+        "wx" : "5c585c0fadec9a34fcc0804154f14cb5668b997f2e096da0974b23e9902e3499956037a178a5210833507e1e108ee5cd994f659e3e8caade9d2958ed48f66991c3",
+        "wy" : "1282c1969a68e190c611ec0322352ef01c750dc87464aa01024b2c10c9d4b6a4a29f99ea740db8dafab65ed75423601654d68f4df642e80a4e79ca12dfb0ee42404"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004005c585c0fadec9a34fcc0804154f14cb5668b997f2e096da0974b23e9902e3499956037a178a5210833507e1e108ee5cd994f659e3e8caade9d2958ed48f66991c301282c1969a68e190c611ec0322352ef01c750dc87464aa01024b2c10c9d4b6a4a29f99ea740db8dafab65ed75423601654d68f4df642e80a4e79ca12dfb0ee42404",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAXFhcD63smjT8wIBBVPFMtWaLmX8u\nCW2gl0sj6ZAuNJmVYDeheKUhCDNQfh4QjuXNmU9lnj6Mqt6dKVjtSPZpkcMBKCwZ\naaaOGQxhHsAyI1LvAcdQ3IdGSqAQJLLBDJ1Lakop+Z6nQNuNr6tl7XVCNgFlTWj0\n32QugKTnnKEt+w7kJAQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 788,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242015ccd79a995c6dffffffffffffffffffffffffffffffffffffffffffffffffffffc2121badb58a518afa8010a82c03cad31fa94bbbde96820166d27e644938e00b1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400919d0cbff7043de2eb024e5ece7a59de14b1bd8b084289587430056e350e49136bf892757b389735e775b352d774376fe29e62e4015253502e4ccc299f2575766a00403cdfa49fe4647794d679fd2889c3a6c2a651ebb04e4fee8468bd4c240d8ba722097eaebd5247b4bebc6e873b27011c49d1f8a131ea0f7a567a8c2a7c173289e2",
+        "wx" : "0919d0cbff7043de2eb024e5ece7a59de14b1bd8b084289587430056e350e49136bf892757b389735e775b352d774376fe29e62e4015253502e4ccc299f2575766a",
+        "wy" : "403cdfa49fe4647794d679fd2889c3a6c2a651ebb04e4fee8468bd4c240d8ba722097eaebd5247b4bebc6e873b27011c49d1f8a131ea0f7a567a8c2a7c173289e2"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400919d0cbff7043de2eb024e5ece7a59de14b1bd8b084289587430056e350e49136bf892757b389735e775b352d774376fe29e62e4015253502e4ccc299f2575766a00403cdfa49fe4647794d679fd2889c3a6c2a651ebb04e4fee8468bd4c240d8ba722097eaebd5247b4bebc6e873b27011c49d1f8a131ea0f7a567a8c2a7c173289e2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAkZ0Mv/cEPeLrAk5eznpZ3hSxvYsI\nQolYdDAFbjUOSRNr+JJ1eziXNed1s1LXdDdv4p5i5AFSU1AuTMwpnyV1dmoAQDzf\npJ/kZHeU1nn9KInDpsKmUeuwTk/uhGi9TCQNi6ciCX6uvVJHtL68boc7JwEcSdH4\noTHqD3pWeowqfBcyieI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 789,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201cd4cae36fffffffffffffffffffffffffffffffffffffffffffffffffffffffffae18dcc11dff7526233d923a0b202cb29e713f22de8bb6ab0a12821c5abbe3f23",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04013c89b68ee2165ce583e29a6b46303e51e49b6583b97fa48fc97f48ca8ad0ddd4ddd09dfadfcf7095f0ca18963432841c4eff915f6138d0ef591e8ae4be9f4a99750010829c296b49e83ea22018bd1d4be30cc33bfce205aaba5452e1049f78bede0b003ae2c27bafc0cd7f7ac1121089288bfe37e221e18f5a4fdd7d73b3c0e5ae6ad1",
+        "wx" : "13c89b68ee2165ce583e29a6b46303e51e49b6583b97fa48fc97f48ca8ad0ddd4ddd09dfadfcf7095f0ca18963432841c4eff915f6138d0ef591e8ae4be9f4a9975",
+        "wy" : "10829c296b49e83ea22018bd1d4be30cc33bfce205aaba5452e1049f78bede0b003ae2c27bafc0cd7f7ac1121089288bfe37e221e18f5a4fdd7d73b3c0e5ae6ad1"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004013c89b68ee2165ce583e29a6b46303e51e49b6583b97fa48fc97f48ca8ad0ddd4ddd09dfadfcf7095f0ca18963432841c4eff915f6138d0ef591e8ae4be9f4a99750010829c296b49e83ea22018bd1d4be30cc33bfce205aaba5452e1049f78bede0b003ae2c27bafc0cd7f7ac1121089288bfe37e221e18f5a4fdd7d73b3c0e5ae6ad1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBPIm2juIWXOWD4pprRjA+UeSbZYO5\nf6SPyX9IyorQ3dTd0J36389wlfDKGJY0MoQcTv+RX2E40O9ZHorkvp9KmXUAEIKc\nKWtJ6D6iIBi9HUvjDMM7/OIFqrpUUuEEn3i+3gsAOuLCe6/AzX96wRIQiSiL/jfi\nIeGPWk/dfXOzwOWuatE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 790,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "308187024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024122e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b9c4c3f73cc816143fac3412b62de4c63db08f8c57e4c58c31f1b457ca5e57e20a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401d91ca0ff790797a83c3be1c82425af917208087aa6735eebd349840fd9fbc3ba5962ee11f8043338c1b3f3504171faa8e8444880b6a5c55ae6667c52ca07ed3f7901f34786c2dc71704ac34634100a8e912a7c40637820e97cd32d5739d7034bc7f6874b90ee94cce07662a3b275b23fa20ae7fc8370d05baeefe0286168bd3417d13f",
+        "wx" : "1d91ca0ff790797a83c3be1c82425af917208087aa6735eebd349840fd9fbc3ba5962ee11f8043338c1b3f3504171faa8e8444880b6a5c55ae6667c52ca07ed3f79",
+        "wy" : "1f34786c2dc71704ac34634100a8e912a7c40637820e97cd32d5739d7034bc7f6874b90ee94cce07662a3b275b23fa20ae7fc8370d05baeefe0286168bd3417d13f"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401d91ca0ff790797a83c3be1c82425af917208087aa6735eebd349840fd9fbc3ba5962ee11f8043338c1b3f3504171faa8e8444880b6a5c55ae6667c52ca07ed3f7901f34786c2dc71704ac34634100a8e912a7c40637820e97cd32d5739d7034bc7f6874b90ee94cce07662a3b275b23fa20ae7fc8370d05baeefe0286168bd3417d13f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB2Ryg/3kHl6g8O+HIJCWvkXIICHqm\nc17r00mED9n7w7pZYu4R+AQzOMGz81BBcfqo6ERIgLalxVrmZnxSygftP3kB80eG\nwtxxcErDRjQQCo6RKnxAY3gg6XzTLVc51wNLx/aHS5DulMzgdmKjsnWyP6IK5/yD\ncNBbru/gKGFovTQX0T8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 791,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242010590b21642c8590b21642c8590b21642c8590b21642c8590b21642c8590b2164298eb57e5aff9343597a542d3132f9e734fdc305125e0ec139c5f780ee8e8cb9c2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040040af2f4ddc1e5272b2aed358b7776f28f0dc996f772f951f25d12f9f8b0f3de0d1c1d29b63b74a950db474701a34c8dd803b594e957bd6a3eb7e938be4511f4c7901c01b42c973d55fb8996e40ee68e112e58a892eab032c5cdd6db39fb2c11692e8b3cebdbbdc08fb3d95a2a7607005089f452cdeb9821b5a118401fcd029c9ad2484",
+        "wx" : "40af2f4ddc1e5272b2aed358b7776f28f0dc996f772f951f25d12f9f8b0f3de0d1c1d29b63b74a950db474701a34c8dd803b594e957bd6a3eb7e938be4511f4c79",
+        "wy" : "1c01b42c973d55fb8996e40ee68e112e58a892eab032c5cdd6db39fb2c11692e8b3cebdbbdc08fb3d95a2a7607005089f452cdeb9821b5a118401fcd029c9ad2484"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040040af2f4ddc1e5272b2aed358b7776f28f0dc996f772f951f25d12f9f8b0f3de0d1c1d29b63b74a950db474701a34c8dd803b594e957bd6a3eb7e938be4511f4c7901c01b42c973d55fb8996e40ee68e112e58a892eab032c5cdd6db39fb2c11692e8b3cebdbbdc08fb3d95a2a7607005089f452cdeb9821b5a118401fcd029c9ad2484",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAQK8vTdweUnKyrtNYt3dvKPDcmW93\nL5UfJdEvn4sPPeDRwdKbY7dKlQ20dHAaNMjdgDtZTpV71qPrfpOL5FEfTHkBwBtC\nyXPVX7iZbkDuaOES5YqJLqsDLFzdbbOfssEWkuizzr273Aj7PZWip2BwBQifRSze\nuYIbWhGEAfzQKcmtJIQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 792,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201a4924924924924924924924924924924924924924924924924924924924924924445e10670ed0437c9db4125ac4175fbd70e9bd1799a85f44ca0a8e61a3354e808",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040069e0b481db99f894f0780f84719de16aec599c765eba50b8615477073c32c26ab1e4e7ae5d1f952513ad323225203b4f0c65a24a8368cd322c23e92049d121747c0177901e379e5e724f416487fee7077e6aea81e5250caa3cffbb7d1b2270aa754b4fdae51e443050c33c7b8421c7b3c538c49a674a34e2278c7ea09d900cf5851dcf",
+        "wx" : "69e0b481db99f894f0780f84719de16aec599c765eba50b8615477073c32c26ab1e4e7ae5d1f952513ad323225203b4f0c65a24a8368cd322c23e92049d121747c",
+        "wy" : "177901e379e5e724f416487fee7077e6aea81e5250caa3cffbb7d1b2270aa754b4fdae51e443050c33c7b8421c7b3c538c49a674a34e2278c7ea09d900cf5851dcf"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040069e0b481db99f894f0780f84719de16aec599c765eba50b8615477073c32c26ab1e4e7ae5d1f952513ad323225203b4f0c65a24a8368cd322c23e92049d121747c0177901e379e5e724f416487fee7077e6aea81e5250caa3cffbb7d1b2270aa754b4fdae51e443050c33c7b8421c7b3c538c49a674a34e2278c7ea09d900cf5851dcf",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAaeC0gduZ+JTweA+EcZ3hauxZnHZe\nulC4YVR3Bzwywmqx5OeuXR+VJROtMjIlIDtPDGWiSoNozTIsI+kgSdEhdHwBd5Ae\nN55eck9BZIf+5wd+auqB5SUMqjz/u30bInCqdUtP2uUeRDBQwzx7hCHHs8U4xJpn\nSjTiJ4x+oJ2QDPWFHc8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 793,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201d5555555555555555555555555555555555555555555555555555555555555554fa6dbdcd91484ebc0d521569e4c5efb25910b1f0ddef19d0410c50c73e68db95f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400a9c2c57f1a2e91c4ee6b3d03c0923b58d0ec409df88e4f3065ba8148bfcf7f71ceb2f1a1e99dc830084b16993454e7e18da23c1a1e77199491db5418ae28b76c67001c97ee720493b427fd33a13c8e87e842ec96e6903cc97cb0f69340498bfdc6f543ca8044eca511eae7f0dd562aac13f2c3f356d216c42b73ddad4756d032f69790",
+        "wx" : "0a9c2c57f1a2e91c4ee6b3d03c0923b58d0ec409df88e4f3065ba8148bfcf7f71ceb2f1a1e99dc830084b16993454e7e18da23c1a1e77199491db5418ae28b76c67",
+        "wy" : "1c97ee720493b427fd33a13c8e87e842ec96e6903cc97cb0f69340498bfdc6f543ca8044eca511eae7f0dd562aac13f2c3f356d216c42b73ddad4756d032f69790"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400a9c2c57f1a2e91c4ee6b3d03c0923b58d0ec409df88e4f3065ba8148bfcf7f71ceb2f1a1e99dc830084b16993454e7e18da23c1a1e77199491db5418ae28b76c67001c97ee720493b427fd33a13c8e87e842ec96e6903cc97cb0f69340498bfdc6f543ca8044eca511eae7f0dd562aac13f2c3f356d216c42b73ddad4756d032f69790",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAqcLFfxoukcTuaz0DwJI7WNDsQJ34\njk8wZbqBSL/Pf3HOsvGh6Z3IMAhLFpk0VOfhjaI8Gh53GZSR21QYrii3bGcAHJfu\ncgSTtCf9M6E8jofoQuyW5pA8yXyw9pNASYv9xvVDyoBE7KUR6ufw3VYqrBPyw/NW\n0hbEK3PdrUdW0DL2l5A=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 794,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4fc31322e69da41162a76abf3a1b4507ae66074633446f259661a61c93be30eb5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401df9a6ea5a8357e829e60bba711d11f86a2dd28c5efdbf968e9646dfbb0d27fa8bf4d81d46255c198df4a27e6ca315690b1ea68795297c365229bd6959b2964b4a301aab45a211e9012b2bc69abc0588a0de8e2c59334cd38a3c221defab789f9cfb4608794a8c51150a783e5956a0a9f9a2f547cde82d1b5d6cf51c566604b50bcf78d",
+        "wx" : "1df9a6ea5a8357e829e60bba711d11f86a2dd28c5efdbf968e9646dfbb0d27fa8bf4d81d46255c198df4a27e6ca315690b1ea68795297c365229bd6959b2964b4a3",
+        "wy" : "1aab45a211e9012b2bc69abc0588a0de8e2c59334cd38a3c221defab789f9cfb4608794a8c51150a783e5956a0a9f9a2f547cde82d1b5d6cf51c566604b50bcf78d"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401df9a6ea5a8357e829e60bba711d11f86a2dd28c5efdbf968e9646dfbb0d27fa8bf4d81d46255c198df4a27e6ca315690b1ea68795297c365229bd6959b2964b4a301aab45a211e9012b2bc69abc0588a0de8e2c59334cd38a3c221defab789f9cfb4608794a8c51150a783e5956a0a9f9a2f547cde82d1b5d6cf51c566604b50bcf78d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB35pupag1foKeYLunEdEfhqLdKMXv\n2/lo6WRt+7DSf6i/TYHUYlXBmN9KJ+bKMVaQsepoeVKXw2Uim9aVmylktKMBqrRa\nIR6QErK8aavAWIoN6OLFkzTNOKPCId76t4n5z7Rgh5SoxRFQp4PllWoKn5ovVHze\ngtG11s9RxWZgS1C8940=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 795,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0242017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401df30ef26e160153a1468a5ddd06b02ccb164dfe3ac8c7f15f68d4f1907ef8be9cadc6be705a229442340670bd1186ed826d39ba4c2311b1df794001a293c027cdf00134f30e4435504102a54c344ed80009ce1b9c5092c40ba32df8053936a8cd8a941ae5284505fd1ae0c5302086c93a582830d24bb646272dd9dd2f2150425a2d7e5",
+        "wx" : "1df30ef26e160153a1468a5ddd06b02ccb164dfe3ac8c7f15f68d4f1907ef8be9cadc6be705a229442340670bd1186ed826d39ba4c2311b1df794001a293c027cdf",
+        "wy" : "134f30e4435504102a54c344ed80009ce1b9c5092c40ba32df8053936a8cd8a941ae5284505fd1ae0c5302086c93a582830d24bb646272dd9dd2f2150425a2d7e5"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401df30ef26e160153a1468a5ddd06b02ccb164dfe3ac8c7f15f68d4f1907ef8be9cadc6be705a229442340670bd1186ed826d39ba4c2311b1df794001a293c027cdf00134f30e4435504102a54c344ed80009ce1b9c5092c40ba32df8053936a8cd8a941ae5284505fd1ae0c5302086c93a582830d24bb646272dd9dd2f2150425a2d7e5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB3zDvJuFgFToUaKXd0GsCzLFk3+Os\njH8V9o1PGQfvi+nK3GvnBaIpRCNAZwvRGG7YJtObpMIxGx33lAAaKTwCfN8AE08w\n5ENVBBAqVMNE7YAAnOG5xQksQLoy34BTk2qM2KlBrlKEUF/RrgxTAghsk6WCgw0k\nu2Rict2d0vIVBCWi1+U=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 796,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "308188024200fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc024201346cc7d4839b77f9f487c7e7f2841c5b7d05f966f3bde28f1fa080ce40037a74e3001a2b00bd39ee4c93072e9963724941383cf0812c02d1c838ad4502a12c619f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401400fa3bc87482ec1ba75346a129ec8f79456e7d6343b2a6be22490884b8f8b89114c0e5f9558d7627adeae53ff8ce37baf94b99d04f75098ca8e3e77c6be02bc3e01690d770806bde9f4d2760293aba6076066f1762e8448f0d08724ef311ff7596f35e8b6a9346de65bea924b9d30bb972e3b38878172f9040378a0db47299e979856",
+        "wx" : "1400fa3bc87482ec1ba75346a129ec8f79456e7d6343b2a6be22490884b8f8b89114c0e5f9558d7627adeae53ff8ce37baf94b99d04f75098ca8e3e77c6be02bc3e",
+        "wy" : "1690d770806bde9f4d2760293aba6076066f1762e8448f0d08724ef311ff7596f35e8b6a9346de65bea924b9d30bb972e3b38878172f9040378a0db47299e979856"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401400fa3bc87482ec1ba75346a129ec8f79456e7d6343b2a6be22490884b8f8b89114c0e5f9558d7627adeae53ff8ce37baf94b99d04f75098ca8e3e77c6be02bc3e01690d770806bde9f4d2760293aba6076066f1762e8448f0d08724ef311ff7596f35e8b6a9346de65bea924b9d30bb972e3b38878172f9040378a0db47299e979856",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBQA+jvIdILsG6dTRqEp7I95RW59Y0\nOypr4iSQiEuPi4kRTA5flVjXYnrerlP/jON7r5S5nQT3UJjKjj53xr4CvD4BaQ13\nCAa96fTSdgKTq6YHYGbxdi6ESPDQhyTvMR/3WW816LapNG3mW+qSS50wu5cuOziH\ngXL5BAN4oNtHKZ6XmFY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 797,
+          "comment" : "point duplication during verification",
+          "msg" : "54657374",
+          "sig" : "30818802420090c8d0d718cb9d8d81094e6d068fb13c16b4df8c77bac676dddfe3e68855bed06b9ba8d0f8a80edce03a9fac7da561e24b1cd22d459239a146695a671f81f73aaf024200a24fbd602ff7012b6b00e9aa1683b45bfa2d62dc768737e8da92cad52f069efbea526acc68096fc0ef9960c6b989bf8922aea38fd463d02c0e7c25e336f32b0874",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401400fa3bc87482ec1ba75346a129ec8f79456e7d6343b2a6be22490884b8f8b89114c0e5f9558d7627adeae53ff8ce37baf94b99d04f75098ca8e3e77c6be02bc3e0096f288f7f942160b2d89fd6c5459f89f990e89d17bb70f2f78db10cee008a690ca174956cb9219a4156db462cf4468d1c4c7787e8d06fbfc875f24b8d6616867a9",
+        "wx" : "1400fa3bc87482ec1ba75346a129ec8f79456e7d6343b2a6be22490884b8f8b89114c0e5f9558d7627adeae53ff8ce37baf94b99d04f75098ca8e3e77c6be02bc3e",
+        "wy" : "096f288f7f942160b2d89fd6c5459f89f990e89d17bb70f2f78db10cee008a690ca174956cb9219a4156db462cf4468d1c4c7787e8d06fbfc875f24b8d6616867a9"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401400fa3bc87482ec1ba75346a129ec8f79456e7d6343b2a6be22490884b8f8b89114c0e5f9558d7627adeae53ff8ce37baf94b99d04f75098ca8e3e77c6be02bc3e0096f288f7f942160b2d89fd6c5459f89f990e89d17bb70f2f78db10cee008a690ca174956cb9219a4156db462cf4468d1c4c7787e8d06fbfc875f24b8d6616867a9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBQA+jvIdILsG6dTRqEp7I95RW59Y0\nOypr4iSQiEuPi4kRTA5flVjXYnrerlP/jON7r5S5nQT3UJjKjj53xr4CvD4AlvKI\n9/lCFgstif1sVFn4n5kOidF7tw8veNsQzuAIppDKF0lWy5IZpBVttGLPRGjRxMd4\nfo0G+/yHXyS41mFoZ6k=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 798,
+          "comment" : "duplication bug",
+          "msg" : "54657374",
+          "sig" : "30818802420090c8d0d718cb9d8d81094e6d068fb13c16b4df8c77bac676dddfe3e68855bed06b9ba8d0f8a80edce03a9fac7da561e24b1cd22d459239a146695a671f81f73aaf024200a24fbd602ff7012b6b00e9aa1683b45bfa2d62dc768737e8da92cad52f069efbea526acc68096fc0ef9960c6b989bf8922aea38fd463d02c0e7c25e336f32b0874",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04009a7b52e1dff018058143cef15c702a7a094e81b3e665b52987a4b077d00c7d1cc398bdbe167d2a3c1ed9daff20f768acb3fd962c06b1fc16593a291734080f40c0008e44b444a3f66803ff3846f226dcf724ec3ce692e67ac991e062ae4a0e555a1ad184905d3231c3f058ae40c266547b076a7c8420d6a7e94aa300342aeeed1c5f7d",
+        "wx" : "09a7b52e1dff018058143cef15c702a7a094e81b3e665b52987a4b077d00c7d1cc398bdbe167d2a3c1ed9daff20f768acb3fd962c06b1fc16593a291734080f40c0",
+        "wy" : "08e44b444a3f66803ff3846f226dcf724ec3ce692e67ac991e062ae4a0e555a1ad184905d3231c3f058ae40c266547b076a7c8420d6a7e94aa300342aeeed1c5f7d"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004009a7b52e1dff018058143cef15c702a7a094e81b3e665b52987a4b077d00c7d1cc398bdbe167d2a3c1ed9daff20f768acb3fd962c06b1fc16593a291734080f40c0008e44b444a3f66803ff3846f226dcf724ec3ce692e67ac991e062ae4a0e555a1ad184905d3231c3f058ae40c266547b076a7c8420d6a7e94aa300342aeeed1c5f7d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAmntS4d/wGAWBQ87xXHAqeglOgbPm\nZbUph6Swd9AMfRzDmL2+Fn0qPB7Z2v8g92iss/2WLAax/BZZOikXNAgPQMAAjkS0\nRKP2aAP/OEbyJtz3JOw85pLmesmR4GKuSg5VWhrRhJBdMjHD8FiuQMJmVHsHanyE\nINan6UqjADQq7u0cX30=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 799,
+          "comment" : "point with x-coordinate 0",
+          "msg" : "54657374",
+          "sig" : "3047020101024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400e26ff0200b731450ad17bb6fef1a6e387a3ec41cd4d808234a64272e819c220266be79c5adae378254649ec8cca05ec92815b8b9eb3cec58693aa6abd0ba191abd01efc536ff700f3611d358e18291470d845473b5750b7525cd3709432ff2fa87743af92894a7a646a82fd24d3f6e0cc47ab673d68630d770bd0d724b0d60de6b51f6",
+        "wx" : "0e26ff0200b731450ad17bb6fef1a6e387a3ec41cd4d808234a64272e819c220266be79c5adae378254649ec8cca05ec92815b8b9eb3cec58693aa6abd0ba191abd",
+        "wy" : "1efc536ff700f3611d358e18291470d845473b5750b7525cd3709432ff2fa87743af92894a7a646a82fd24d3f6e0cc47ab673d68630d770bd0d724b0d60de6b51f6"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400e26ff0200b731450ad17bb6fef1a6e387a3ec41cd4d808234a64272e819c220266be79c5adae378254649ec8cca05ec92815b8b9eb3cec58693aa6abd0ba191abd01efc536ff700f3611d358e18291470d845473b5750b7525cd3709432ff2fa87743af92894a7a646a82fd24d3f6e0cc47ab673d68630d770bd0d724b0d60de6b51f6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQA4m/wIAtzFFCtF7tv7xpuOHo+xBzU\n2AgjSmQnLoGcIgJmvnnFra43glRknsjMoF7JKBW4ues87FhpOqar0LoZGr0B78U2\n/3APNhHTWOGCkUcNhFRztXULdSXNNwlDL/L6h3Q6+SiUp6ZGqC/STT9uDMR6tnPW\nhjDXcL0NcksNYN5rUfY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 800,
+          "comment" : "point with x-coordinate 0",
+          "msg" : "54657374",
+          "sig" : "3081870242020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024166666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81401",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040177d4130bb0ff5597f3a51f5a00f90213c1d8585389829ded631809c180a6656364483142aedad31486ff27a2aaabb0ed308896943ddf96590e1665450ba34c9e87002bba609ad8a4b4c894d303b3872c4f63939e19ae91d21b1a83cc2260700f8e0ec198a6f38da62a6ea5721e1364a5a7f02f60f5e8de53a97ce11c8666d588cbcdb3",
+        "wx" : "177d4130bb0ff5597f3a51f5a00f90213c1d8585389829ded631809c180a6656364483142aedad31486ff27a2aaabb0ed308896943ddf96590e1665450ba34c9e87",
+        "wy" : "2bba609ad8a4b4c894d303b3872c4f63939e19ae91d21b1a83cc2260700f8e0ec198a6f38da62a6ea5721e1364a5a7f02f60f5e8de53a97ce11c8666d588cbcdb3"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040177d4130bb0ff5597f3a51f5a00f90213c1d8585389829ded631809c180a6656364483142aedad31486ff27a2aaabb0ed308896943ddf96590e1665450ba34c9e87002bba609ad8a4b4c894d303b3872c4f63939e19ae91d21b1a83cc2260700f8e0ec198a6f38da62a6ea5721e1364a5a7f02f60f5e8de53a97ce11c8666d588cbcdb3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBd9QTC7D/VZfzpR9aAPkCE8HYWFOJ\ngp3tYxgJwYCmZWNkSDFCrtrTFIb/J6Kqq7DtMIiWlD3fllkOFmVFC6NMnocAK7pg\nmtiktMiU0wOzhyxPY5OeGa6R0hsag8wiYHAPjg7BmKbzjaYqbqVyHhNkpafwL2D1\n6N5TqXzhHIZm1YjLzbM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 801,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "54657374",
+          "sig" : "308187024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad024166666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81401",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040058d31b9f3ba34f384f2478fd60d54cfa693bbc547210281c0009589c0244ba1958f2ba91adf76a296c77566e8eaaec132b5cbd555b13edec0c0f0ae061e8c9a1b1018728b0dd02d131fc6805b75168c982a3fdb93fe85ca2b530d1d839cb534c0ebc021ae3723926a3002737b4b796c12688d768834d05e2516818438a38c023b52fcf",
+        "wx" : "58d31b9f3ba34f384f2478fd60d54cfa693bbc547210281c0009589c0244ba1958f2ba91adf76a296c77566e8eaaec132b5cbd555b13edec0c0f0ae061e8c9a1b1",
+        "wy" : "18728b0dd02d131fc6805b75168c982a3fdb93fe85ca2b530d1d839cb534c0ebc021ae3723926a3002737b4b796c12688d768834d05e2516818438a38c023b52fcf"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040058d31b9f3ba34f384f2478fd60d54cfa693bbc547210281c0009589c0244ba1958f2ba91adf76a296c77566e8eaaec132b5cbd555b13edec0c0f0ae061e8c9a1b1018728b0dd02d131fc6805b75168c982a3fdb93fe85ca2b530d1d839cb534c0ebc021ae3723926a3002737b4b796c12688d768834d05e2516818438a38c023b52fcf",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAWNMbnzujTzhPJHj9YNVM+mk7vFRy\nECgcAAlYnAJEuhlY8rqRrfdqKWx3Vm6OquwTK1y9VVsT7ewMDwrgYejJobEBhyiw\n3QLRMfxoBbdRaMmCo/25P+hcorUw0dg5y1NMDrwCGuNyOSajACc3tLeWwSaI12iD\nTQXiUWgYQ4o4wCO1L88=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 802,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "54657374",
+          "sig" : "3081870241433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040051f9819380755fab58f496a81f8465554bcf907554e911580366215296d3a6d81ba22cec986ae33010d6416bf1db3b6637f64d240b6f4b5c7ea229f87e0fcd699f01812487275e672c364712783fe4a8a53729e3fc90138afe5b869c5068cb5d4554e1a7f1d8ac9dd78fbca9acab4ea791311d66e01e048201b40d9f383d0a0b068daa",
+        "wx" : "51f9819380755fab58f496a81f8465554bcf907554e911580366215296d3a6d81ba22cec986ae33010d6416bf1db3b6637f64d240b6f4b5c7ea229f87e0fcd699f",
+        "wy" : "1812487275e672c364712783fe4a8a53729e3fc90138afe5b869c5068cb5d4554e1a7f1d8ac9dd78fbca9acab4ea791311d66e01e048201b40d9f383d0a0b068daa"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040051f9819380755fab58f496a81f8465554bcf907554e911580366215296d3a6d81ba22cec986ae33010d6416bf1db3b6637f64d240b6f4b5c7ea229f87e0fcd699f01812487275e672c364712783fe4a8a53729e3fc90138afe5b869c5068cb5d4554e1a7f1d8ac9dd78fbca9acab4ea791311d66e01e048201b40d9f383d0a0b068daa",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAUfmBk4B1X6tY9JaoH4RlVUvPkHVU\n6RFYA2YhUpbTptgboizsmGrjMBDWQWvx2ztmN/ZNJAtvS1x+oin4fg/NaZ8BgSSH\nJ15nLDZHEng/5KilNynj/JATiv5bhpxQaMtdRVThp/HYrJ3Xj7yprKtOp5ExHWbg\nHgSCAbQNnzg9CgsGjao=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 803,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "3081860241433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d0241492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401fca5b6da4b965f2c88b14f7a5844ce6f8276d2f5d03739db266c4f5d85fc9b3719be453ac8004f027f714cf07ac1b27c7b2a1ef92705d2a57bbdebf521647615b601a8dabcdbbf3510a509244dcd9af272abc560b30d874e92ad52c52ba64b19325b250e15e7eb5b04a190eb658e0cf663f0265c05bf4ab8eb960a7084c514250de790",
+        "wx" : "1fca5b6da4b965f2c88b14f7a5844ce6f8276d2f5d03739db266c4f5d85fc9b3719be453ac8004f027f714cf07ac1b27c7b2a1ef92705d2a57bbdebf521647615b6",
+        "wy" : "1a8dabcdbbf3510a509244dcd9af272abc560b30d874e92ad52c52ba64b19325b250e15e7eb5b04a190eb658e0cf663f0265c05bf4ab8eb960a7084c514250de790"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401fca5b6da4b965f2c88b14f7a5844ce6f8276d2f5d03739db266c4f5d85fc9b3719be453ac8004f027f714cf07ac1b27c7b2a1ef92705d2a57bbdebf521647615b601a8dabcdbbf3510a509244dcd9af272abc560b30d874e92ad52c52ba64b19325b250e15e7eb5b04a190eb658e0cf663f0265c05bf4ab8eb960a7084c514250de790",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB/KW22kuWXyyIsU96WETOb4J20vXQ\nNznbJmxPXYX8mzcZvkU6yABPAn9xTPB6wbJ8eyoe+ScF0qV7vev1IWR2FbYBqNq8\n2781EKUJJE3NmvJyq8Vgsw2HTpKtUsUrpksZMlslDhXn61sEoZDrZY4M9mPwJlwF\nv0q465YKcITFFCUN55A=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 804,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "3081870241433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d0242019999999999999999999999999999999999999999999999999999999999999999950e053936328c7855ffd6676d926e1e402fc4a1606e169fbefc595f4ba7605007",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04004c8643e546a71b93185ca583ae5098c1e6c0b0d33fc2d618870f9438b1c595dbc8920084565f0074dafaca78bac2558ca623c251f6d530328c2734a0413821dfe5001d8ac0a7251b82046f9cf2ce679e12770f8681a43f0e27e553680fc5234295ac24212a25c857e152350676e4e52ca3044181b67110ce0129fa0bdc15a4d5a70e8e",
+        "wx" : "4c8643e546a71b93185ca583ae5098c1e6c0b0d33fc2d618870f9438b1c595dbc8920084565f0074dafaca78bac2558ca623c251f6d530328c2734a0413821dfe5",
+        "wy" : "1d8ac0a7251b82046f9cf2ce679e12770f8681a43f0e27e553680fc5234295ac24212a25c857e152350676e4e52ca3044181b67110ce0129fa0bdc15a4d5a70e8e"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004004c8643e546a71b93185ca583ae5098c1e6c0b0d33fc2d618870f9438b1c595dbc8920084565f0074dafaca78bac2558ca623c251f6d530328c2734a0413821dfe5001d8ac0a7251b82046f9cf2ce679e12770f8681a43f0e27e553680fc5234295ac24212a25c857e152350676e4e52ca3044181b67110ce0129fa0bdc15a4d5a70e8e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQATIZD5UanG5MYXKWDrlCYwebAsNM/\nwtYYhw+UOLHFldvIkgCEVl8AdNr6yni6wlWMpiPCUfbVMDKMJzSgQTgh3+UAHYrA\npyUbggRvnPLOZ54Sdw+GgaQ/DiflU2gPxSNClawkISolyFfhUjUGduTlLKMEQYG2\ncRDOASn6C9wVpNWnDo4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 805,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "3081860241433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d024166666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81402",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400a6597c76956046fcd03c444e9a4e13b9fb751ac91fb4fcba5fd33aff61f3305fa7b831e5227a5c0470e5e1fde4a25e539fc23773bb3a2cf41eee0fc678d050705a01f6f5ae4a3b994473679074f6ee6579c5005e6fd860cd4dd29e07d4475823af6be8af5d414bba47b42e601b97660d10a662e37b5180e8e69b33c5f7d798da18be49",
+        "wx" : "0a6597c76956046fcd03c444e9a4e13b9fb751ac91fb4fcba5fd33aff61f3305fa7b831e5227a5c0470e5e1fde4a25e539fc23773bb3a2cf41eee0fc678d050705a",
+        "wy" : "1f6f5ae4a3b994473679074f6ee6579c5005e6fd860cd4dd29e07d4475823af6be8af5d414bba47b42e601b97660d10a662e37b5180e8e69b33c5f7d798da18be49"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400a6597c76956046fcd03c444e9a4e13b9fb751ac91fb4fcba5fd33aff61f3305fa7b831e5227a5c0470e5e1fde4a25e539fc23773bb3a2cf41eee0fc678d050705a01f6f5ae4a3b994473679074f6ee6579c5005e6fd860cd4dd29e07d4475823af6be8af5d414bba47b42e601b97660d10a662e37b5180e8e69b33c5f7d798da18be49",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQApll8dpVgRvzQPEROmk4Tuft1Gskf\ntPy6X9M6/2HzMF+nuDHlInpcBHDl4f3kol5Tn8I3c7s6LPQe7g/GeNBQcFoB9vWu\nSjuZRHNnkHT27mV5xQBeb9hgzU3SngfUR1gjr2vor11BS7pHtC5gG5dmDRCmYuN7\nUYDo5pszxffXmNoYvkk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 806,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "3081870241433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d024201b6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db68d82a2b033628ca12ffd36ed0d3bf206957c063c2bf183d7132f20aac7c797a51",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401a72fa046b1157567b9913a8a61107fb4dd0e12b2b406ef219b767f93130f39d54998745c51d1aff51b68d78d34418d6128bf93ccdbe15f6476824e0b311bd267ad00f3e4d71961055a4c1763fc1eefa0800f84ac7c7bbc4fd8ed773b79b70a99e01d1a6c00965ee1ff6665093aa423f9d304792af7a4f4141c3a2a5d900524954a95d4",
+        "wx" : "1a72fa046b1157567b9913a8a61107fb4dd0e12b2b406ef219b767f93130f39d54998745c51d1aff51b68d78d34418d6128bf93ccdbe15f6476824e0b311bd267ad",
+        "wy" : "0f3e4d71961055a4c1763fc1eefa0800f84ac7c7bbc4fd8ed773b79b70a99e01d1a6c00965ee1ff6665093aa423f9d304792af7a4f4141c3a2a5d900524954a95d4"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401a72fa046b1157567b9913a8a61107fb4dd0e12b2b406ef219b767f93130f39d54998745c51d1aff51b68d78d34418d6128bf93ccdbe15f6476824e0b311bd267ad00f3e4d71961055a4c1763fc1eefa0800f84ac7c7bbc4fd8ed773b79b70a99e01d1a6c00965ee1ff6665093aa423f9d304792af7a4f4141c3a2a5d900524954a95d4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBpy+gRrEVdWe5kTqKYRB/tN0OErK0\nBu8hm3Z/kxMPOdVJmHRcUdGv9Rto1400QY1hKL+TzNvhX2R2gk4LMRvSZ60A8+TX\nGWEFWkwXY/we76CAD4SsfHu8T9jtdzt5twqZ4B0abACWXuH/ZmUJOqQj+dMEeSr3\npPQUHDoqXZAFJJVKldQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 807,
+          "comment" : "extreme value for k",
+          "msg" : "54657374",
+          "sig" : "3081860241433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d02410eb10e5ab95f2f26a40700b1300fb8c3c8d5384ffbecf1fdb9e11e67cb7fd6a7f503e6e25ac09bb88b6c3983df764d4d72bc2920e233f0f7974a234a21b00bb447",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400cf6df1caf02f9098be502e187a924fbe8cc10f0422dd66bfd9f9156cf22d830f084b8db3a4ee588fb108ba178103a1aa45aa687fe9b30173791b6efede4b60077400359b96e724fe869abb95f4549af40e13c664d1a009ad0205b454f1a495581a770e5c82aa984bd2a5cd2d359adf487c392e441048fe60c2696ffa958c807de097c9",
+        "wx" : "0cf6df1caf02f9098be502e187a924fbe8cc10f0422dd66bfd9f9156cf22d830f084b8db3a4ee588fb108ba178103a1aa45aa687fe9b30173791b6efede4b600774",
+        "wy" : "359b96e724fe869abb95f4549af40e13c664d1a009ad0205b454f1a495581a770e5c82aa984bd2a5cd2d359adf487c392e441048fe60c2696ffa958c807de097c9"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400cf6df1caf02f9098be502e187a924fbe8cc10f0422dd66bfd9f9156cf22d830f084b8db3a4ee588fb108ba178103a1aa45aa687fe9b30173791b6efede4b60077400359b96e724fe869abb95f4549af40e13c664d1a009ad0205b454f1a495581a770e5c82aa984bd2a5cd2d359adf487c392e441048fe60c2696ffa958c807de097c9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAz23xyvAvkJi+UC4YepJPvozBDwQi\n3Wa/2fkVbPItgw8IS42zpO5Yj7EIuheBA6GqRapof+mzAXN5G27+3ktgB3QANZuW\n5yT+hpq7lfRUmvQOE8Zk0aAJrQIFtFTxpJVYGncOXIKqmEvSpc0tNZrfSHw5LkQQ\nSP5gwmlv+pWMgH3gl8k=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 808,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "54657374",
+          "sig" : "308188024200c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66024200aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04006f839c4f23ef040b3a9991d47c9c4def6fdb0ecf6fc3b8295d07729beb37505cb4e9b10d68972f03b6ef5d669603c1515e26cdf3a7ff5d34cd4f70e7ad4b94a27b0054df97785db8216d9a5e21118bc6cca9597d89c66db1df90c9c8303a49001ab854fd39d3c18f2eb3736a0827a751011870c1db6a0013bdbf6175c2fbfe27d91fe5",
+        "wx" : "6f839c4f23ef040b3a9991d47c9c4def6fdb0ecf6fc3b8295d07729beb37505cb4e9b10d68972f03b6ef5d669603c1515e26cdf3a7ff5d34cd4f70e7ad4b94a27b",
+        "wy" : "54df97785db8216d9a5e21118bc6cca9597d89c66db1df90c9c8303a49001ab854fd39d3c18f2eb3736a0827a751011870c1db6a0013bdbf6175c2fbfe27d91fe5"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004006f839c4f23ef040b3a9991d47c9c4def6fdb0ecf6fc3b8295d07729beb37505cb4e9b10d68972f03b6ef5d669603c1515e26cdf3a7ff5d34cd4f70e7ad4b94a27b0054df97785db8216d9a5e21118bc6cca9597d89c66db1df90c9c8303a49001ab854fd39d3c18f2eb3736a0827a751011870c1db6a0013bdbf6175c2fbfe27d91fe5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAb4OcTyPvBAs6mZHUfJxN72/bDs9v\nw7gpXQdym+s3UFy06bENaJcvA7bvXWaWA8FRXibN86f/XTTNT3DnrUuUonsAVN+X\neF24IW2aXiERi8bMqVl9icZtsd+QycgwOkkAGrhU/TnTwY8us3NqCCenUQEYcMHb\nagATvb9hdcL7/ifZH+U=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 809,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "308187024200c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd660241492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040150246dd427cacce66e6de57a8cc0dfe249969f3fcf4ed64de341339eb90331db1f05475292ce9c29916da65ceab6e67ef2dce13b1e17b8d1a2de7ffc1504f3fd9d019287f09186d2a7efd6c4bc5690429dc31a17ddea53d4aa662a58aa11feb40801dc9c750c187d4351f5990cdd1671ab9097baac0512b8ca37f557fecbf590fafd6a",
+        "wx" : "150246dd427cacce66e6de57a8cc0dfe249969f3fcf4ed64de341339eb90331db1f05475292ce9c29916da65ceab6e67ef2dce13b1e17b8d1a2de7ffc1504f3fd9d",
+        "wy" : "19287f09186d2a7efd6c4bc5690429dc31a17ddea53d4aa662a58aa11feb40801dc9c750c187d4351f5990cdd1671ab9097baac0512b8ca37f557fecbf590fafd6a"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040150246dd427cacce66e6de57a8cc0dfe249969f3fcf4ed64de341339eb90331db1f05475292ce9c29916da65ceab6e67ef2dce13b1e17b8d1a2de7ffc1504f3fd9d019287f09186d2a7efd6c4bc5690429dc31a17ddea53d4aa662a58aa11feb40801dc9c750c187d4351f5990cdd1671ab9097baac0512b8ca37f557fecbf590fafd6a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBUCRt1CfKzOZubeV6jMDf4kmWnz/P\nTtZN40EznrkDMdsfBUdSks6cKZFtplzqtuZ+8tzhOx4XuNGi3n/8FQTz/Z0Bkofw\nkYbSp+/WxLxWkEKdwxoX3epT1KpmKliqEf60CAHcnHUMGH1DUfWZDN0WcauQl7qs\nBRK4yjf1V/7L9ZD6/Wo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 810,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "308188024200c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd660242019999999999999999999999999999999999999999999999999999999999999999950e053936328c7855ffd6676d926e1e402fc4a1606e169fbefc595f4ba7605007",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400d42b271445241e4e5136cf8e5b706ed4403234cca54821737169e9a60dec54745f1dc077c5ed9d60c2f572c5e5749f4f4431952561c2a30d9ac312fbc3e5dc9dca0179b7a63b67b345aa865db14d9147b36094a12164263e588e20996ad814b2f1ffd9681720305b3b03f6b948db03a7d89af2eff7dbdea0c411940ed80cce6d9b34c6",
+        "wx" : "0d42b271445241e4e5136cf8e5b706ed4403234cca54821737169e9a60dec54745f1dc077c5ed9d60c2f572c5e5749f4f4431952561c2a30d9ac312fbc3e5dc9dca",
+        "wy" : "179b7a63b67b345aa865db14d9147b36094a12164263e588e20996ad814b2f1ffd9681720305b3b03f6b948db03a7d89af2eff7dbdea0c411940ed80cce6d9b34c6"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400d42b271445241e4e5136cf8e5b706ed4403234cca54821737169e9a60dec54745f1dc077c5ed9d60c2f572c5e5749f4f4431952561c2a30d9ac312fbc3e5dc9dca0179b7a63b67b345aa865db14d9147b36094a12164263e588e20996ad814b2f1ffd9681720305b3b03f6b948db03a7d89af2eff7dbdea0c411940ed80cce6d9b34c6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQA1CsnFEUkHk5RNs+OW3Bu1EAyNMyl\nSCFzcWnppg3sVHRfHcB3xe2dYML1csXldJ9PRDGVJWHCow2awxL7w+XcncoBebem\nO2ezRaqGXbFNkUezYJShIWQmPliOIJlq2BSy8f/ZaBcgMFs7A/a5SNsDp9ia8u/3\n296gxBGUDtgMzm2bNMY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 811,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "308187024200c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66024166666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81402",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040070780ea3c2e73b2400f44f48a393b6c9019cfa788aa5e3d272ecbec9dc0dbcb35187d9575e1f5f15baf22f502e3ca9287c5224f587fbaf1d8894a1c33bd6d12aa6000e0bcd718484ed9f4da4d77a97f6b5a42ff82c0f25d3241ab0b2a1de2419bee04545ea159d8e564ec3bb91267cec492bfb9bfcaba8fda4e88051fcafc98a3f5336",
+        "wx" : "70780ea3c2e73b2400f44f48a393b6c9019cfa788aa5e3d272ecbec9dc0dbcb35187d9575e1f5f15baf22f502e3ca9287c5224f587fbaf1d8894a1c33bd6d12aa6",
+        "wy" : "0e0bcd718484ed9f4da4d77a97f6b5a42ff82c0f25d3241ab0b2a1de2419bee04545ea159d8e564ec3bb91267cec492bfb9bfcaba8fda4e88051fcafc98a3f5336"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040070780ea3c2e73b2400f44f48a393b6c9019cfa788aa5e3d272ecbec9dc0dbcb35187d9575e1f5f15baf22f502e3ca9287c5224f587fbaf1d8894a1c33bd6d12aa6000e0bcd718484ed9f4da4d77a97f6b5a42ff82c0f25d3241ab0b2a1de2419bee04545ea159d8e564ec3bb91267cec492bfb9bfcaba8fda4e88051fcafc98a3f5336",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAcHgOo8LnOyQA9E9Io5O2yQGc+niK\npePScuy+ydwNvLNRh9lXXh9fFbryL1AuPKkofFIk9Yf7rx2IlKHDO9bRKqYADgvN\ncYSE7Z9NpNd6l/a1pC/4LA8l0yQasLKh3iQZvuBFReoVnY5WTsO7kSZ87Ekr+5v8\nq6j9pOiAUfyvyYo/UzY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 812,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "308188024200c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66024201b6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db68d82a2b033628ca12ffd36ed0d3bf206957c063c2bf183d7132f20aac7c797a51",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401f988e92791f14ddbff35eab1dddd36f3167b514e95c70dfe6e616a77a0064721f8aef871d4c482524e5647ff20204fa4dafaeaa80dd3b7d99007e592ae5b589916003a9299ba5dfb5991c94e880ff6c614958ceee55e2ce5b22c0bfb0eb43759b4848ce007482e7421aef5c8da000ba224acb4dbbf73498d73705c06b67f267e5a8a10",
+        "wx" : "1f988e92791f14ddbff35eab1dddd36f3167b514e95c70dfe6e616a77a0064721f8aef871d4c482524e5647ff20204fa4dafaeaa80dd3b7d99007e592ae5b589916",
+        "wy" : "3a9299ba5dfb5991c94e880ff6c614958ceee55e2ce5b22c0bfb0eb43759b4848ce007482e7421aef5c8da000ba224acb4dbbf73498d73705c06b67f267e5a8a10"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401f988e92791f14ddbff35eab1dddd36f3167b514e95c70dfe6e616a77a0064721f8aef871d4c482524e5647ff20204fa4dafaeaa80dd3b7d99007e592ae5b589916003a9299ba5dfb5991c94e880ff6c614958ceee55e2ce5b22c0bfb0eb43759b4848ce007482e7421aef5c8da000ba224acb4dbbf73498d73705c06b67f267e5a8a10",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB+YjpJ5HxTdv/Neqx3d028xZ7UU6V\nxw3+bmFqd6AGRyH4rvhx1MSCUk5WR/8gIE+k2vrqqA3Tt9mQB+WSrltYmRYAOpKZ\nul37WZHJTogP9sYUlYzu5V4s5bIsC/sOtDdZtISM4AdILnQhrvXI2gALoiSstNu/\nc0mNc3BcBrZ/Jn5aihA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 813,
+          "comment" : "extreme value for k",
+          "msg" : "54657374",
+          "sig" : "308187024200c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd6602410eb10e5ab95f2f26a40700b1300fb8c3c8d5384ffbecf1fdb9e11e67cb7fd6a7f503e6e25ac09bb88b6c3983df764d4d72bc2920e233f0f7974a234a21b00bb447",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650",
+        "wx" : "0c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66",
+        "wy" : "11839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAxoWOBrcEBOnNnj7LZiOVtEKcZIE5\nBT+1Ifgor2BrTT26oUted+/nWSj+HcEnov+o3jNIs8GFakKb+X5+McLlvWYBGDkp\naniaO8AEXIpftCx9G9mY9URJV5tEaBevvRcnPmYsl+5ymV70JkDFULkBP60HYTU8\ncIaicsJAiL6Udp/RZlA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 814,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "308186024100c6ee9e33cf5c6715a1d148fd73f7318884b41adcb916021e2bc0e800a5c5dd97f5142178f6ae88c8fdd98e1afb0ce4c8d2c54b5f37b30b7da1997bb33b0b8a310241492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 815,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "308187024201ff391161cc30a398ea5e2eb7028c08ce777b4be52346e9fde1d43f17ff5a3a22625c72660ac8810da281f2732dfbfcc10768f07e5951e93c3119d63b6b562cd9d80241492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd6600e7c6d6958765c43ffba375a04bd382e426670abbb6a864bb97e85042e8d8c199d368118d66a10bd9bf3aaf46fec052f89ecac38f795d8d3dbf77416b89602e99af",
+        "wx" : "0c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66",
+        "wy" : "0e7c6d6958765c43ffba375a04bd382e426670abbb6a864bb97e85042e8d8c199d368118d66a10bd9bf3aaf46fec052f89ecac38f795d8d3dbf77416b89602e99af"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd6600e7c6d6958765c43ffba375a04bd382e426670abbb6a864bb97e85042e8d8c199d368118d66a10bd9bf3aaf46fec052f89ecac38f795d8d3dbf77416b89602e99af",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAxoWOBrcEBOnNnj7LZiOVtEKcZIE5\nBT+1Ifgor2BrTT26oUted+/nWSj+HcEnov+o3jNIs8GFakKb+X5+McLlvWYA58bW\nlYdlxD/7o3WgS9OC5CZnCru2qGS7l+hQQujYwZnTaBGNZqEL2b86r0b+wFL4nsrD\nj3ldjT2/d0FriWAuma8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 816,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "308186024100c6ee9e33cf5c6715a1d148fd73f7318884b41adcb916021e2bc0e800a5c5dd97f5142178f6ae88c8fdd98e1afb0ce4c8d2c54b5f37b30b7da1997bb33b0b8a310241492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 817,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "308187024201ff391161cc30a398ea5e2eb7028c08ce777b4be52346e9fde1d43f17ff5a3a22625c72660ac8810da281f2732dfbfcc10768f07e5951e93c3119d63b6b562cd9d80241492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04873b01c3fbd1852fb7029e571eb0b6ee7a2cd85cdc3350332baf15b19b7892cd827fd418154a8436a2dbcff0ffde24cd1436e08161a7c9c1abf936c533bf2296",
+        "wx" : "0873b01c3fbd1852fb7029e571eb0b6ee7a2cd85cdc3350332baf15b19b7892cd",
+        "wy" : "0827fd418154a8436a2dbcff0ffde24cd1436e08161a7c9c1abf936c533bf2296"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004873b01c3fbd1852fb7029e571eb0b6ee7a2cd85cdc3350332baf15b19b7892cd827fd418154a8436a2dbcff0ffde24cd1436e08161a7c9c1abf936c533bf2296",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABIc7AcP70YUvtwKeVx6wtu56LNhc\n3DNQMyuvFbGbeJLNgn/UGBVKhDai28/w/94kzRQ24IFhp8nBq/k2xTO/IpY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 818,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "54657374",
+          "sig" : "3036021100e2027b801fc479308ff5399a8825fccf022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 819,
+          "comment" : "r too large",
+          "msg" : "54657374",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5376022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a4",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040654f94b4ee20794db95a64f56fc4d823118c8a2df77c25dc49ab6172a43a5cb3e43eec1ceab77f227a84fc0a185ee368817419900117724edd476fc17ce0c99",
+        "wx" : "654f94b4ee20794db95a64f56fc4d823118c8a2df77c25dc49ab6172a43a5cb",
+        "wy" : "3e43eec1ceab77f227a84fc0a185ee368817419900117724edd476fc17ce0c99"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200040654f94b4ee20794db95a64f56fc4d823118c8a2df77c25dc49ab6172a43a5cb3e43eec1ceab77f227a84fc0a185ee368817419900117724edd476fc17ce0c99",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABAZU+UtO4geU25WmT1b8TYIxGMii\n33fCXcSathcqQ6XLPkPuwc6rd/InqE/AoYXuNogXQZkAEXck7dR2/BfODJk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 820,
+          "comment" : "r,s are large",
+          "msg" : "54657374",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a3022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040bdcb6c8fd1409184869e266c97a59982d9c360114c1ec5fd5402bc638fcb27e055132e5ac1221bc4fc89161d2d56e113880292e4a3d4d9e43979bb66e5dc819",
+        "wx" : "0bdcb6c8fd1409184869e266c97a59982d9c360114c1ec5fd5402bc638fcb27e",
+        "wy" : "55132e5ac1221bc4fc89161d2d56e113880292e4a3d4d9e43979bb66e5dc819"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200040bdcb6c8fd1409184869e266c97a59982d9c360114c1ec5fd5402bc638fcb27e055132e5ac1221bc4fc89161d2d56e113880292e4a3d4d9e43979bb66e5dc819",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABAvctsj9FAkYSGniZsl6WZgtnDYB\nFMHsX9VAK8Y4/LJ+BVEy5awSIbxPyJFh0tVuETiAKS5KPU2eQ5ebtm5dyBk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 821,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "54657374",
+          "sig" : "304402207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02204ab8de0a51481bc45794b924518f2dd6ac5cce31f3228d624c5a896f79a2d6a2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04656bd0903ccbd335f66090d6ed2ed1a9a6056142c5ccc55c38838a7f3847a4845ae6dc9d86de0b6f330344d9ed1683b6ec92184d8caf0c7837b1a8724125d7c9",
+        "wx" : "656bd0903ccbd335f66090d6ed2ed1a9a6056142c5ccc55c38838a7f3847a484",
+        "wy" : "5ae6dc9d86de0b6f330344d9ed1683b6ec92184d8caf0c7837b1a8724125d7c9"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004656bd0903ccbd335f66090d6ed2ed1a9a6056142c5ccc55c38838a7f3847a4845ae6dc9d86de0b6f330344d9ed1683b6ec92184d8caf0c7837b1a8724125d7c9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABGVr0JA8y9M19mCQ1u0u0ammBWFC\nxczFXDiDin84R6SEWubcnYbeC28zA0TZ7RaDtuySGE2Mrwx4N7GockEl18k=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 822,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "54657374",
+          "sig" : "304502207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0221008b1b5f89f5bb74caa42d36e601a9f3c20b4e6c91ceb98a52fbfa9f81781b8a17",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043794534eb2f575d7948fb331553b33aeaf395f66193c6f9eabd5e1b2a30b230c9afb63cb41720f4e915b630d4b088fb4fcea4d0849f3cc023a6ca59357f85c36",
+        "wx" : "3794534eb2f575d7948fb331553b33aeaf395f66193c6f9eabd5e1b2a30b230c",
+        "wy" : "09afb63cb41720f4e915b630d4b088fb4fcea4d0849f3cc023a6ca59357f85c36"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200043794534eb2f575d7948fb331553b33aeaf395f66193c6f9eabd5e1b2a30b230c9afb63cb41720f4e915b630d4b088fb4fcea4d0849f3cc023a6ca59357f85c36",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABDeUU06y9XXXlI+zMVU7M66vOV9m\nGTxvnqvV4bKjCyMMmvtjy0FyD06RW2MNSwiPtPzqTQhJ88wCOmylk1f4XDY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 823,
+          "comment" : "small r and s",
+          "msg" : "54657374",
+          "sig" : "3006020101020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04380ec87cfe9da69e438357d9f68ed7ba59d43b164b1cb7ebdb5a8ba25ffb2abf832f8efce46b1c8a5ac4b4c39657432e0bfcf71bfccb08e236620f444148665c",
+        "wx" : "380ec87cfe9da69e438357d9f68ed7ba59d43b164b1cb7ebdb5a8ba25ffb2abf",
+        "wy" : "0832f8efce46b1c8a5ac4b4c39657432e0bfcf71bfccb08e236620f444148665c"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004380ec87cfe9da69e438357d9f68ed7ba59d43b164b1cb7ebdb5a8ba25ffb2abf832f8efce46b1c8a5ac4b4c39657432e0bfcf71bfccb08e236620f444148665c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABDgOyHz+naaeQ4NX2faO17pZ1DsW\nSxy369tai6Jf+yq/gy+O/ORrHIpaxLTDlldDLgv89xv8ywjiNmIPREFIZlw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 824,
+          "comment" : "small r and s",
+          "msg" : "54657374",
+          "sig" : "3006020101020102",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041b93505886094d6e1df0393000b41d097906fdf03435e771082ddb6e7d53b347285ecd2cb254f514c566b3cfffc50db03f259155be368fe713e8a833a747f981",
+        "wx" : "1b93505886094d6e1df0393000b41d097906fdf03435e771082ddb6e7d53b347",
+        "wy" : "285ecd2cb254f514c566b3cfffc50db03f259155be368fe713e8a833a747f981"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200041b93505886094d6e1df0393000b41d097906fdf03435e771082ddb6e7d53b347285ecd2cb254f514c566b3cfffc50db03f259155be368fe713e8a833a747f981",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABBuTUFiGCU1uHfA5MAC0HQl5Bv3w\nNDXncQgt2259U7NHKF7NLLJU9RTFZrPP/8UNsD8lkVW+No/nE+ioM6dH+YE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 825,
+          "comment" : "small r and s",
+          "msg" : "54657374",
+          "sig" : "3006020101020103",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 826,
+          "comment" : "r is larger than n",
+          "msg" : "54657374",
+          "sig" : "3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8020103",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0403d1c0ee4010a27b1faddcdf256d0b6eb2a5bcc256e685d379f5ba20e93919f4658be2a06d5eb3205c2dbdb67d55413913b51d794c59e91d3e5b783d535ef5bc",
+        "wx" : "3d1c0ee4010a27b1faddcdf256d0b6eb2a5bcc256e685d379f5ba20e93919f4",
+        "wy" : "658be2a06d5eb3205c2dbdb67d55413913b51d794c59e91d3e5b783d535ef5bc"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000403d1c0ee4010a27b1faddcdf256d0b6eb2a5bcc256e685d379f5ba20e93919f4658be2a06d5eb3205c2dbdb67d55413913b51d794c59e91d3e5b783d535ef5bc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABAPRwO5AEKJ7H63c3yVtC26ypbzC\nVuaF03n1uiDpORn0ZYvioG1esyBcLb22fVVBORO1HXlMWekdPlt4PVNe9bw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 827,
+          "comment" : "s is larger than n",
+          "msg" : "54657374",
+          "sig" : "3026020101022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82975b2d2e",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04677ccca257fb6730e744de5013bf98ea8003e320b8ca70888a351aa7b0f8906f54ca266a5267503e1aa90c74a67006bff1a8461ce9526bf266b02b39448a0219",
+        "wx" : "677ccca257fb6730e744de5013bf98ea8003e320b8ca70888a351aa7b0f8906f",
+        "wy" : "54ca266a5267503e1aa90c74a67006bff1a8461ce9526bf266b02b39448a0219"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004677ccca257fb6730e744de5013bf98ea8003e320b8ca70888a351aa7b0f8906f54ca266a5267503e1aa90c74a67006bff1a8461ce9526bf266b02b39448a0219",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABGd8zKJX+2cw50TeUBO/mOqAA+Mg\nuMpwiIo1Gqew+JBvVMomalJnUD4aqQx0pnAGv/GoRhzpUmvyZrArOUSKAhk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 828,
+          "comment" : "small r and s^-1",
+          "msg" : "54657374",
+          "sig" : "30260202010102202827370584fdeb9f5d5a9fb9579a09390efb6f9d99b64fc188d8bce05c2d4eed",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0499a4b3ffdda680963d6a6f29d95eb6c1c653655437e028b92d8fa90b6e31649c28cbae0a35de3ad10e462c6854e95dfb5dfde9cb0575075c204ccf2edddbf725",
+        "wx" : "099a4b3ffdda680963d6a6f29d95eb6c1c653655437e028b92d8fa90b6e31649c",
+        "wy" : "28cbae0a35de3ad10e462c6854e95dfb5dfde9cb0575075c204ccf2edddbf725"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000499a4b3ffdda680963d6a6f29d95eb6c1c653655437e028b92d8fa90b6e31649c28cbae0a35de3ad10e462c6854e95dfb5dfde9cb0575075c204ccf2edddbf725",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABJmks//dpoCWPWpvKdletsHGU2VU\nN+AouS2PqQtuMWScKMuuCjXeOtEORixoVOld+1396csFdQdcIEzPLt3b9yU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 829,
+          "comment" : "smallish r and s^-1",
+          "msg" : "54657374",
+          "sig" : "302b02072d9b4d347952ce02204937a087731df4febc2c3a81ddfbab5dc3af950817f41b590d156ed409ad2869",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0463aeb7a8c99b569922290cfaf225e135c3110261987605d22edf37a3c6672d341acabe5a64f0c9ba20c665381ad24d275347ab6f54fb992d0d3f436c19d05cee",
+        "wx" : "63aeb7a8c99b569922290cfaf225e135c3110261987605d22edf37a3c6672d34",
+        "wy" : "1acabe5a64f0c9ba20c665381ad24d275347ab6f54fb992d0d3f436c19d05cee"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000463aeb7a8c99b569922290cfaf225e135c3110261987605d22edf37a3c6672d341acabe5a64f0c9ba20c665381ad24d275347ab6f54fb992d0d3f436c19d05cee",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABGOut6jJm1aZIikM+vIl4TXDEQJh\nmHYF0i7fN6PGZy00Gsq+WmTwybogxmU4GtJNJ1NHq29U+5ktDT9DbBnQXO4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 830,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "54657374",
+          "sig" : "3032020d1033e67e37b32b445580bf4efb02210091827d03bb6dac31940ba56ed88489048ff173f0bf20cab20dcc086fca37f285",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048e2fdf5606030d4c02117b6642699cd10b9f791bafa6952a6635939aa577ff3a350cd8e98725756cd384937e0599f38ee7cc16e85474c9bc6d6bbcb4a6ae3a82",
+        "wx" : "08e2fdf5606030d4c02117b6642699cd10b9f791bafa6952a6635939aa577ff3a",
+        "wy" : "350cd8e98725756cd384937e0599f38ee7cc16e85474c9bc6d6bbcb4a6ae3a82"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200048e2fdf5606030d4c02117b6642699cd10b9f791bafa6952a6635939aa577ff3a350cd8e98725756cd384937e0599f38ee7cc16e85474c9bc6d6bbcb4a6ae3a82",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABI4v31YGAw1MAhF7ZkJpnNELn3kb\nr6aVKmY1k5qld/86NQzY6YcldWzThJN+BZnzjufMFuhUdMm8bWu8tKauOoI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 831,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "54657374",
+          "sig" : "30260202010102203eb35fe7e8331f71e4c63b45f349a99d47a5e781798e579f2386195d3827bb15",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048854b415e4e34bb3e19a1c4bda67260f0518c320696b6e6393b3c7823d8a30a70e594403225c63da5138eb9067e86f638d91793b6410688c34cdf6c8d2ac601a",
+        "wx" : "08854b415e4e34bb3e19a1c4bda67260f0518c320696b6e6393b3c7823d8a30a7",
+        "wy" : "0e594403225c63da5138eb9067e86f638d91793b6410688c34cdf6c8d2ac601a"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200048854b415e4e34bb3e19a1c4bda67260f0518c320696b6e6393b3c7823d8a30a70e594403225c63da5138eb9067e86f638d91793b6410688c34cdf6c8d2ac601a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABIhUtBXk40uz4ZocS9pnJg8FGMMg\naWtuY5Ozx4I9ijCnDllEAyJcY9pROOuQZ+hvY42ReTtkEGiMNM32yNKsYBo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 832,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "54657374",
+          "sig" : "3031020d062522bbd3ecbe7c39e93e7c2502203eb35fe7e8331f71e4c63b45f349a99d47a5e781798e579f2386195d3827bb15",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04595f3befe9ac34763eb99d6a95f8b45a94084406f165ea5781ccd39d923b61232508badaf61ae9c37742f03b8fbf48413ef9c512cfa63a299c1bea7d6a7cc583",
+        "wx" : "595f3befe9ac34763eb99d6a95f8b45a94084406f165ea5781ccd39d923b6123",
+        "wy" : "2508badaf61ae9c37742f03b8fbf48413ef9c512cfa63a299c1bea7d6a7cc583"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004595f3befe9ac34763eb99d6a95f8b45a94084406f165ea5781ccd39d923b61232508badaf61ae9c37742f03b8fbf48413ef9c512cfa63a299c1bea7d6a7cc583",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABFlfO+/prDR2PrmdapX4tFqUCEQG\n8WXqV4HM052SO2EjJQi62vYa6cN3QvA7j79IQT75xRLPpjopnBvqfWp8xYM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 833,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "54657374",
+          "sig" : "3045022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e8297485628022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040f4c30d0099f1d1ce785714707f10172c0881cd1aec5daf4f849462688248fa00be78142c4538617830dcd2ef814cbe33c7dcf5cf6fb95217f7a76d118e029ed",
+        "wx" : "0f4c30d0099f1d1ce785714707f10172c0881cd1aec5daf4f849462688248fa0",
+        "wy" : "0be78142c4538617830dcd2ef814cbe33c7dcf5cf6fb95217f7a76d118e029ed"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200040f4c30d0099f1d1ce785714707f10172c0881cd1aec5daf4f849462688248fa00be78142c4538617830dcd2ef814cbe33c7dcf5cf6fb95217f7a76d118e029ed",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABA9MMNAJnx0c54VxRwfxAXLAiBzR\nrsXa9PhJRiaIJI+gC+eBQsRThheDDc0u+BTL4zx9z1z2+5Uhf3p20RjgKe0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 834,
+          "comment" : "s == 1",
+          "msg" : "54657374",
+          "sig" : "3025022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 835,
+          "comment" : "s == 0",
+          "msg" : "54657374",
+          "sig" : "3025022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045866d53f9e14bb54784136192419568c060f30d7dfd771f5a3e4d6a0e8c2597c43a773b94d7d0a706b9ba3488389705e29d6809f93a92fa69786657364129202",
+        "wx" : "5866d53f9e14bb54784136192419568c060f30d7dfd771f5a3e4d6a0e8c2597c",
+        "wy" : "43a773b94d7d0a706b9ba3488389705e29d6809f93a92fa69786657364129202"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200045866d53f9e14bb54784136192419568c060f30d7dfd771f5a3e4d6a0e8c2597c43a773b94d7d0a706b9ba3488389705e29d6809f93a92fa69786657364129202",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABFhm1T+eFLtUeEE2GSQZVowGDzDX\n39dx9aPk1qDowll8Q6dzuU19CnBrm6NIg4lwXinWgJ+TqS+ml4Zlc2QSkgI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 836,
+          "comment" : "point at infinity during verify",
+          "msg" : "54657374",
+          "sig" : "3044022054fdabedd0f754de1f3305484ec1c6b8c61cbd51dab0d37bc80f07414ba42b53022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a60f67988936eb09516548355a6731e04c62f2fb5be99668a819d3f1edcfe8ac691ec942aaa90570c5a61c3bdb6c01085829e63b87ecb5e80fa9d305b1f3e151",
+        "wx" : "0a60f67988936eb09516548355a6731e04c62f2fb5be99668a819d3f1edcfe8ac",
+        "wy" : "691ec942aaa90570c5a61c3bdb6c01085829e63b87ecb5e80fa9d305b1f3e151"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004a60f67988936eb09516548355a6731e04c62f2fb5be99668a819d3f1edcfe8ac691ec942aaa90570c5a61c3bdb6c01085829e63b87ecb5e80fa9d305b1f3e151",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABKYPZ5iJNusJUWVINVpnMeBMYvL7\nW+mWaKgZ0/Htz+isaR7JQqqpBXDFphw722wBCFgp5juH7LXoD6nTBbHz4VE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 837,
+          "comment" : "u1 == 1",
+          "msg" : "54657374",
+          "sig" : "3044022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce20220532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a68baf3367bc5d28f24eaa740ccb4f115f02e8e0d86d389d2f0679d522a21f3b57d331289faf2dc50f95d4e2cbfa7ace61c1fbbe73c628d78e78f1ed57e982e5",
+        "wx" : "0a68baf3367bc5d28f24eaa740ccb4f115f02e8e0d86d389d2f0679d522a21f3b",
+        "wy" : "57d331289faf2dc50f95d4e2cbfa7ace61c1fbbe73c628d78e78f1ed57e982e5"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004a68baf3367bc5d28f24eaa740ccb4f115f02e8e0d86d389d2f0679d522a21f3b57d331289faf2dc50f95d4e2cbfa7ace61c1fbbe73c628d78e78f1ed57e982e5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABKaLrzNnvF0o8k6qdAzLTxFfAujg\n2G04nS8GedUioh87V9MxKJ+vLcUPldTiy/p6zmHB+75zxijXjnjx7VfpguU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 838,
+          "comment" : "u1 == n - 1",
+          "msg" : "54657374",
+          "sig" : "3044022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2022056ccad1e0c7a21ae7eef50d7d1830a456b928e9277f9845e3b1094148813f882",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040fd5ca9814b5dd0bb7dde76609785bc61ed9490ffff8e67d4d8cb67de0982ddda61b90df51db44af8adbbfd524b7eb3dd1eb652d13dd0a2e17049bed1ad20b23",
+        "wx" : "0fd5ca9814b5dd0bb7dde76609785bc61ed9490ffff8e67d4d8cb67de0982ddd",
+        "wy" : "0a61b90df51db44af8adbbfd524b7eb3dd1eb652d13dd0a2e17049bed1ad20b23"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200040fd5ca9814b5dd0bb7dde76609785bc61ed9490ffff8e67d4d8cb67de0982ddda61b90df51db44af8adbbfd524b7eb3dd1eb652d13dd0a2e17049bed1ad20b23",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABA/VypgUtd0Lt93nZgl4W8Ye2UkP\n//jmfU2Mtn3gmC3dphuQ31HbRK+K27/VJLfrPdHrZS0T3QouFwSb7RrSCyM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 839,
+          "comment" : "u2 == 1",
+          "msg" : "54657374",
+          "sig" : "3044022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047289e13555ea568fe89151d61e5c072f4b35897600ae7bf9e2b2aa0e5fb3f0f33e3148ae84ca2d0bf8c771bf330be074b3524d7bf0d2bea2f5ae3ec101cca105",
+        "wx" : "7289e13555ea568fe89151d61e5c072f4b35897600ae7bf9e2b2aa0e5fb3f0f3",
+        "wy" : "3e3148ae84ca2d0bf8c771bf330be074b3524d7bf0d2bea2f5ae3ec101cca105"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200047289e13555ea568fe89151d61e5c072f4b35897600ae7bf9e2b2aa0e5fb3f0f33e3148ae84ca2d0bf8c771bf330be074b3524d7bf0d2bea2f5ae3ec101cca105",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABHKJ4TVV6laP6JFR1h5cBy9LNYl2\nAK57+eKyqg5fs/DzPjFIroTKLQv4x3G/MwvgdLNSTXvw0r6i9a4+wQHMoQU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 840,
+          "comment" : "u2 == n - 1",
+          "msg" : "54657374",
+          "sig" : "3044022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2022071523a926bf4712829995c6069025e4bb2d0fc6d23966f4fb5695f01ba3039c5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040e5c985b558157eb8ea717ed9662ba521d3c54164d7fe2ce3aaff1d395f90c076dd5d9ad049a537b684974297a1f91eadb3b7a97164ec381efbb3b0526661047",
+        "wx" : "0e5c985b558157eb8ea717ed9662ba521d3c54164d7fe2ce3aaff1d395f90c07",
+        "wy" : "6dd5d9ad049a537b684974297a1f91eadb3b7a97164ec381efbb3b0526661047"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200040e5c985b558157eb8ea717ed9662ba521d3c54164d7fe2ce3aaff1d395f90c076dd5d9ad049a537b684974297a1f91eadb3b7a97164ec381efbb3b0526661047",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABA5cmFtVgVfrjqcX7ZZiulIdPFQW\nTX/izjqv8dOV+QwHbdXZrQSaU3toSXQpeh+R6ts7epcWTsOB77s7BSZmEEc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 841,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022054635633127665edff4996c3232c0589e44acce6fb989885a1b92da58cd43c44",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04389a0c6c57397a0e5dd0dc238ff253a82d3073b4e3fca8b5ffb5f205c34651d308a535730a6987df9717111c8272fad3ac1ffb5feb5e04541682c9440863f425",
+        "wx" : "389a0c6c57397a0e5dd0dc238ff253a82d3073b4e3fca8b5ffb5f205c34651d3",
+        "wy" : "08a535730a6987df9717111c8272fad3ac1ffb5feb5e04541682c9440863f425"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004389a0c6c57397a0e5dd0dc238ff253a82d3073b4e3fca8b5ffb5f205c34651d308a535730a6987df9717111c8272fad3ac1ffb5feb5e04541682c9440863f425",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABDiaDGxXOXoOXdDcI4/yU6gtMHO0\n4/yotf+18gXDRlHTCKU1cwpph9+XFxEcgnL606wf+1/rXgRUFoLJRAhj9CU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 842,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220028eb8f6fb8e5a3833700b5687f17948beeecf7c73aa9c14430ef3ca01602036",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041817c8914321f6d4dea4936b11500555e57c20651db6b478761c8ea1d58632a80067bccdae9389ca4cb6e3279b1896448ff22951e5065326833487066eeedcf9",
+        "wx" : "1817c8914321f6d4dea4936b11500555e57c20651db6b478761c8ea1d58632a8",
+        "wy" : "67bccdae9389ca4cb6e3279b1896448ff22951e5065326833487066eeedcf9"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200041817c8914321f6d4dea4936b11500555e57c20651db6b478761c8ea1d58632a80067bccdae9389ca4cb6e3279b1896448ff22951e5065326833487066eeedcf9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABBgXyJFDIfbU3qSTaxFQBVXlfCBl\nHba0eHYcjqHVhjKoAGe8za6TicpMtuMnmxiWRI/yKVHlBlMmgzSHBm7u3Pk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 843,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207c04eb7f3730e231a1c6f86a11042f1a914b02bd83ca8e82670f9bf9d17d9e00",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04446e925eb47fb9e986762c3ad5600e44018b8928be7c61fee438db8f0fd76b185420796deda74ab9508ba6c45e826dbd47acbf943e87877478d6cd1b8825efad",
+        "wx" : "446e925eb47fb9e986762c3ad5600e44018b8928be7c61fee438db8f0fd76b18",
+        "wy" : "5420796deda74ab9508ba6c45e826dbd47acbf943e87877478d6cd1b8825efad"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004446e925eb47fb9e986762c3ad5600e44018b8928be7c61fee438db8f0fd76b185420796deda74ab9508ba6c45e826dbd47acbf943e87877478d6cd1b8825efad",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABERukl60f7nphnYsOtVgDkQBi4ko\nvnxh/uQ4248P12sYVCB5be2nSrlQi6bEXoJtvUesv5Q+h4d0eNbNG4gl760=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 844,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02203b3b272686d138084988ae23089d57b574fbabe983e1de35694442c2b9660070",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047742d14fff17f37674f3f1d4df982427dac545722aeafd8f3effbd40890900af693a32aa0b83dc4fe27a409e7a35f52827582d9c97f84acd24a4c3e3db67cdc6",
+        "wx" : "7742d14fff17f37674f3f1d4df982427dac545722aeafd8f3effbd40890900af",
+        "wy" : "693a32aa0b83dc4fe27a409e7a35f52827582d9c97f84acd24a4c3e3db67cdc6"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200047742d14fff17f37674f3f1d4df982427dac545722aeafd8f3effbd40890900af693a32aa0b83dc4fe27a409e7a35f52827582d9c97f84acd24a4c3e3db67cdc6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABHdC0U//F/N2dPPx1N+YJCfaxUVy\nKur9jz7/vUCJCQCvaToyqguD3E/iekCeejX1KCdYLZyX+ErNJKTD49tnzcY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 845,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02202e67ab256e246048b8154c6bd12de75f1657f9b20e8da09beca149a517cbfb1b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045cc07b0a02619c701b5b2112ee1e8152aa2a7d87880c2310409142046e962df40e74e8191e2ec76f8f9e3c54a59bc79ec68bff407e4ad4d6988f419b5671f25b",
+        "wx" : "5cc07b0a02619c701b5b2112ee1e8152aa2a7d87880c2310409142046e962df4",
+        "wy" : "0e74e8191e2ec76f8f9e3c54a59bc79ec68bff407e4ad4d6988f419b5671f25b"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200045cc07b0a02619c701b5b2112ee1e8152aa2a7d87880c2310409142046e962df40e74e8191e2ec76f8f9e3c54a59bc79ec68bff407e4ad4d6988f419b5671f25b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABFzAewoCYZxwG1shEu4egVKqKn2H\niAwjEECRQgRuli30DnToGR4ux2+PnjxUpZvHnsaL/0B+StTWmI9Bm1Zx8ls=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 846,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02205ccf564adc48c091702a98d7a25bcebe2caff3641d1b4137d942934a2f97f636",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045598267f28a0d095cac9d4b6e4f8157c73d48d6a76b72c8f3a8115ecfe5e28a72d651136d13e039ce4c134dd5572ffdc996bee018b3d01439df62a538ceac8a7",
+        "wx" : "5598267f28a0d095cac9d4b6e4f8157c73d48d6a76b72c8f3a8115ecfe5e28a7",
+        "wy" : "2d651136d13e039ce4c134dd5572ffdc996bee018b3d01439df62a538ceac8a7"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200045598267f28a0d095cac9d4b6e4f8157c73d48d6a76b72c8f3a8115ecfe5e28a72d651136d13e039ce4c134dd5572ffdc996bee018b3d01439df62a538ceac8a7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABFWYJn8ooNCVysnUtuT4FXxz1I1q\ndrcsjzqBFez+XiinLWURNtE+A5zkwTTdVXL/3Jlr7gGLPQFDnfYqU4zqyKc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 847,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0221008197dc78d6ccee9677df5d99f382c80c19dd0d78babbb86810d8398b0c911414",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0480e25f21cd7b8be2bab4183194edbd22b0ca53fd70f344e42988a396b0f2c6e2991e27d9c14c1dbb5e1889956a7328159da9dbac082b93b289cc90b28f96a65a",
+        "wx" : "080e25f21cd7b8be2bab4183194edbd22b0ca53fd70f344e42988a396b0f2c6e2",
+        "wy" : "0991e27d9c14c1dbb5e1889956a7328159da9dbac082b93b289cc90b28f96a65a"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000480e25f21cd7b8be2bab4183194edbd22b0ca53fd70f344e42988a396b0f2c6e2991e27d9c14c1dbb5e1889956a7328159da9dbac082b93b289cc90b28f96a65a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABIDiXyHNe4viurQYMZTtvSKwylP9\ncPNE5CmIo5aw8sbimR4n2cFMHbteGImVanMoFZ2p26wIK5OyicyQso+Wplo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 848,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02207552d8ce45674b223735b1c2d0946581cd062d494a89f42f58f0ee1bc5c0f318",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04680de45fd1e6c38819ae4bdd43d61482752fa43e8138a9a390364cecf36b4ef28b90de2f260f747fee8a963ae308349aa6b816e6be814035cbc68448eae27272",
+        "wx" : "680de45fd1e6c38819ae4bdd43d61482752fa43e8138a9a390364cecf36b4ef2",
+        "wy" : "08b90de2f260f747fee8a963ae308349aa6b816e6be814035cbc68448eae27272"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004680de45fd1e6c38819ae4bdd43d61482752fa43e8138a9a390364cecf36b4ef28b90de2f260f747fee8a963ae308349aa6b816e6be814035cbc68448eae27272",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABGgN5F/R5sOIGa5L3UPWFIJ1L6Q+\ngTipo5A2TOzza07yi5DeLyYPdH/uipY64wg0mqa4Fua+gUA1y8aESOricnI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 849,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02202a988eeb5d91279714eb150faea4838ede06b16567dc73919515d28ff04a12d7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0452d9e8e7e7a728f24a61ef3713375ade942d708d9bc061f500fd32d493f48fbd0f3883d1a55680f69a0fe6909da55f506e9937837e244e20550019a17ba9c370",
+        "wx" : "52d9e8e7e7a728f24a61ef3713375ade942d708d9bc061f500fd32d493f48fbd",
+        "wy" : "0f3883d1a55680f69a0fe6909da55f506e9937837e244e20550019a17ba9c370"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000452d9e8e7e7a728f24a61ef3713375ade942d708d9bc061f500fd32d493f48fbd0f3883d1a55680f69a0fe6909da55f506e9937837e244e20550019a17ba9c370",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABFLZ6OfnpyjySmHvNxM3Wt6ULXCN\nm8Bh9QD9MtST9I+9DziD0aVWgPaaD+aQnaVfUG6ZN4N+JE4gVQAZoXupw3A=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 850,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220559801a88f7843ce3f1c73cd7a5787e7a7eeadbcb9c90e71ee64e0dd0a741a63",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a00c60235109352c589563a590d61adbe34d84bddd6e82c2f42efb871527011778035471de3b72ddc3caf6981824aa4ce301405610156deb90ea9aa316a8ba66",
+        "wx" : "0a00c60235109352c589563a590d61adbe34d84bddd6e82c2f42efb8715270117",
+        "wy" : "78035471de3b72ddc3caf6981824aa4ce301405610156deb90ea9aa316a8ba66"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004a00c60235109352c589563a590d61adbe34d84bddd6e82c2f42efb871527011778035471de3b72ddc3caf6981824aa4ce301405610156deb90ea9aa316a8ba66",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABKAMYCNRCTUsWJVjpZDWGtvjTYS9\n3W6CwvQu+4cVJwEXeANUcd47ct3DyvaYGCSqTOMBQFYQFW3rkOqaoxaoumY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 851,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02202b66568f063d10d73f77a86be8c18522b5c947493bfcc22f1d884a0a4409fc41",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045758f9e402a4bafd82594d0d26ed47a5f8e9c50526d34b34b47d0875b9fe7b1404f3f8095376d54dfc10d83c938a18175a64517e3b464edd058f5b8626d837c5",
+        "wx" : "5758f9e402a4bafd82594d0d26ed47a5f8e9c50526d34b34b47d0875b9fe7b14",
+        "wy" : "4f3f8095376d54dfc10d83c938a18175a64517e3b464edd058f5b8626d837c5"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200045758f9e402a4bafd82594d0d26ed47a5f8e9c50526d34b34b47d0875b9fe7b1404f3f8095376d54dfc10d83c938a18175a64517e3b464edd058f5b8626d837c5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABFdY+eQCpLr9gllNDSbtR6X46cUF\nJtNLNLR9CHW5/nsUBPP4CVN21U38ENg8k4oYF1pkUX47Rk7dBY9bhibYN8U=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 852,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02203e0275bf9b987118d0e37c350882178d48a5815ec1e547413387cdfce8becf00",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042fa1d8ac0d02da83a998f767bd854b1a043e383d5159e7077e35ed3a9ca8194212d7fb2b95e867ed0b24e45093d639f1fed68162aa51e60ad2e45de012b8e94a",
+        "wx" : "2fa1d8ac0d02da83a998f767bd854b1a043e383d5159e7077e35ed3a9ca81942",
+        "wy" : "12d7fb2b95e867ed0b24e45093d639f1fed68162aa51e60ad2e45de012b8e94a"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200042fa1d8ac0d02da83a998f767bd854b1a043e383d5159e7077e35ed3a9ca8194212d7fb2b95e867ed0b24e45093d639f1fed68162aa51e60ad2e45de012b8e94a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABC+h2KwNAtqDqZj3Z72FSxoEPjg9\nUVnnB3417TqcqBlCEtf7K5XoZ+0LJORQk9Y58f7WgWKqUeYK0uRd4BK46Uo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 853,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02206353c7f3e0a4e33ebf7758dadf2bd9d0841328e13c75e252855f5a2b87c2c78c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043e09805fe499d1bcd7a4388fe03c4bd3eaf6371cdb3e7afd748cde52ae897c0219e65e9b77ef754d77140c20b8c89074950f7e71cbc7d97e0dc879371aa3306c",
+        "wx" : "3e09805fe499d1bcd7a4388fe03c4bd3eaf6371cdb3e7afd748cde52ae897c02",
+        "wy" : "19e65e9b77ef754d77140c20b8c89074950f7e71cbc7d97e0dc879371aa3306c"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200043e09805fe499d1bcd7a4388fe03c4bd3eaf6371cdb3e7afd748cde52ae897c0219e65e9b77ef754d77140c20b8c89074950f7e71cbc7d97e0dc879371aa3306c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABD4JgF/kmdG816Q4j+A8S9Pq9jcc\n2z56/XSM3lKuiXwCGeZem3fvdU13FAwguMiQdJUPfnHLx9l+Dch5NxqjMGw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 854,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022014899bc6ff5e72338f3c9847fa6531c4337fde3fcf1c8c32f768fba3a402a964",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047e69909dbc544342a5bee9af766347526fea9bea526bd8a2728d80253c01c204a3490b6583c6bf44a3791b61a298dc18be55d3593c24b8a013747f9877f66e61",
+        "wx" : "7e69909dbc544342a5bee9af766347526fea9bea526bd8a2728d80253c01c204",
+        "wy" : "0a3490b6583c6bf44a3791b61a298dc18be55d3593c24b8a013747f9877f66e61"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200047e69909dbc544342a5bee9af766347526fea9bea526bd8a2728d80253c01c204a3490b6583c6bf44a3791b61a298dc18be55d3593c24b8a013747f9877f66e61",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABH5pkJ28VENCpb7pr3ZjR1Jv6pvq\nUmvYonKNgCU8AcIEo0kLZYPGv0SjeRthopjcGL5V01k8JLigE3R/mHf2bmE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 855,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022072655c5e4f1cefca22f413a612e5bfdd7ba9ae71053f68b0c74d9a73590013c3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046be621988af517a22e1549cb23416dc2cf8d8accdd8d083708e6d655f155ccfe8eb87277219356972a3bd0dac5f549ac52315c43e0edea9d6e24f2ff952029d0",
+        "wx" : "6be621988af517a22e1549cb23416dc2cf8d8accdd8d083708e6d655f155ccfe",
+        "wy" : "08eb87277219356972a3bd0dac5f549ac52315c43e0edea9d6e24f2ff952029d0"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200046be621988af517a22e1549cb23416dc2cf8d8accdd8d083708e6d655f155ccfe8eb87277219356972a3bd0dac5f549ac52315c43e0edea9d6e24f2ff952029d0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABGvmIZiK9ReiLhVJyyNBbcLPjYrM\n3Y0INwjm1lXxVcz+jrhydyGTVpcqO9DaxfVJrFIxXEPg7eqdbiTy/5UgKdA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 856,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100a2030dbf01d8c9de2900dc3845fda4e4c6bc049c4cd5717a9c629b9ed29d1859",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045ae6afae79752250b1ea02f49cd75aa899418631041172b2e3db31ca7abb2ab22bef1f798389a216b0322419fd7a76e4448b3d1abe425b47d84307e4553ad352",
+        "wx" : "5ae6afae79752250b1ea02f49cd75aa899418631041172b2e3db31ca7abb2ab2",
+        "wy" : "2bef1f798389a216b0322419fd7a76e4448b3d1abe425b47d84307e4553ad352"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200045ae6afae79752250b1ea02f49cd75aa899418631041172b2e3db31ca7abb2ab22bef1f798389a216b0322419fd7a76e4448b3d1abe425b47d84307e4553ad352",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABFrmr655dSJQseoC9JzXWqiZQYYx\nBBFysuPbMcp6uyqyK+8feYOJohawMiQZ/Xp25ESLPRq+QltH2EMH5FU601I=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 857,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022100a1db7293b6f01594b808718e61a4d642dff4fee2fb471167ef7ab42959a473e7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0418350252507cc26e4a12bf3e483e02dee74809382c8e640ca635b06c27b51a4e97578f3ef03fae837a178d50a9c94d7af61d6070dd13a72409925ec6b331326c",
+        "wx" : "18350252507cc26e4a12bf3e483e02dee74809382c8e640ca635b06c27b51a4e",
+        "wy" : "097578f3ef03fae837a178d50a9c94d7af61d6070dd13a72409925ec6b331326c"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000418350252507cc26e4a12bf3e483e02dee74809382c8e640ca635b06c27b51a4e97578f3ef03fae837a178d50a9c94d7af61d6070dd13a72409925ec6b331326c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABBg1AlJQfMJuShK/Pkg+At7nSAk4\nLI5kDKY1sGwntRpOl1ePPvA/roN6F41QqclNevYdYHDdE6ckCZJexrMxMmw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 858,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd02210099bb8d4bcbf1816d31aad88c25c61f1433b08322412c7bd84ed759d01c009127",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040943cc104456d87a712b8aaf7113d43be64404dcd0f8ed707ae3286e3db5323f43862753ab1b05e3f8d425498514caf178a7602ebe43a71ceeec6da14f880e4c",
+        "wx" : "0943cc104456d87a712b8aaf7113d43be64404dcd0f8ed707ae3286e3db5323f",
+        "wy" : "43862753ab1b05e3f8d425498514caf178a7602ebe43a71ceeec6da14f880e4c"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200040943cc104456d87a712b8aaf7113d43be64404dcd0f8ed707ae3286e3db5323f43862753ab1b05e3f8d425498514caf178a7602ebe43a71ceeec6da14f880e4c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABAlDzBBEVth6cSuKr3ET1DvmRATc\n0PjtcHrjKG49tTI/Q4YnU6sbBeP41CVJhRTK8XinYC6+Q6cc7uxtoU+IDkw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 859,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022041cee82a6957ef02ab3aa07a3315accc0d0d66c2081d530246d6e681873c90d1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0464931339acdda82764a00229d8d266b131122302fa3eb440cfda72cf81ad554e92ddffa1e7690efc1a4a8408e1e3c5e599aa9811f26d51852c9ceeabdfe5e5c7",
+        "wx" : "64931339acdda82764a00229d8d266b131122302fa3eb440cfda72cf81ad554e",
+        "wy" : "092ddffa1e7690efc1a4a8408e1e3c5e599aa9811f26d51852c9ceeabdfe5e5c7"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000464931339acdda82764a00229d8d266b131122302fa3eb440cfda72cf81ad554e92ddffa1e7690efc1a4a8408e1e3c5e599aa9811f26d51852c9ceeabdfe5e5c7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABGSTEzms3agnZKACKdjSZrExEiMC\n+j60QM/acs+BrVVOkt3/oedpDvwaSoQI4ePF5ZmqmBHybVGFLJzuq9/l5cc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 860,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220746d61572ecae774691e7809121986d9b93279b00934ff1def1f4798da89ad4c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04018d755e5540692f87b6e01864be3cc272a468f3fccdd535cc0c2f1c75e0abd04c7c7155f0e9686de0fcbcf93a39d50c2e2adf8b0362676b31e9a49bdcaadbb7",
+        "wx" : "18d755e5540692f87b6e01864be3cc272a468f3fccdd535cc0c2f1c75e0abd0",
+        "wy" : "4c7c7155f0e9686de0fcbcf93a39d50c2e2adf8b0362676b31e9a49bdcaadbb7"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004018d755e5540692f87b6e01864be3cc272a468f3fccdd535cc0c2f1c75e0abd04c7c7155f0e9686de0fcbcf93a39d50c2e2adf8b0362676b31e9a49bdcaadbb7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABAGNdV5VQGkvh7bgGGS+PMJypGjz\n/M3VNcwMLxx14KvQTHxxVfDpaG3g/Lz5OjnVDC4q34sDYmdrMemkm9yq27c=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 861,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0220281b26a0908968099f8e1f610f4f358318baa21107b791ef6f24cb244677a64b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0453ee3f75ed7275550c4b1604f68fbc4c411006b13da809d5ae6a14cb37bafef57d26222d2d7236b9d7e3ac4225100d68764c37c77b80f24f7c65e579d13d9727",
+        "wx" : "53ee3f75ed7275550c4b1604f68fbc4c411006b13da809d5ae6a14cb37bafef5",
+        "wy" : "7d26222d2d7236b9d7e3ac4225100d68764c37c77b80f24f7c65e579d13d9727"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000453ee3f75ed7275550c4b1604f68fbc4c411006b13da809d5ae6a14cb37bafef57d26222d2d7236b9d7e3ac4225100d68764c37c77b80f24f7c65e579d13d9727",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABFPuP3XtcnVVDEsWBPaPvExBEAax\nPagJ1a5qFMs3uv71fSYiLS1yNrnX46xCJRANaHZMN8d7gPJPfGXledE9lyc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 862,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022046a78fe7c149c67d7eeeb1b5be57b3a1082651c278ebc4a50abeb4570f858f1b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0486fd25de250bd6e9c272d4a3e7f28edea934b7f043050b765ab755200f4e2900a2238299783c290a0b4d4f3bfe37645719967000466f29882e895f54c3eb7f8f",
+        "wx" : "086fd25de250bd6e9c272d4a3e7f28edea934b7f043050b765ab755200f4e2900",
+        "wy" : "0a2238299783c290a0b4d4f3bfe37645719967000466f29882e895f54c3eb7f8f"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000486fd25de250bd6e9c272d4a3e7f28edea934b7f043050b765ab755200f4e2900a2238299783c290a0b4d4f3bfe37645719967000466f29882e895f54c3eb7f8f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABIb9Jd4lC9bpwnLUo+fyjt6pNLfw\nQwULdlq3VSAPTikAoiOCmXg8KQoLTU87/jdkVxmWcABGbymILolfVMPrf48=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 863,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd022014fdabedd0f754de1f3305484ec1c6b8c61cbd51dab0d37bc80f07414ba42b55",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041cc2c242a63d44b90f67f35aca9fd5cc0b25d384ee9648a05279d476f9aa748c6cb072f7336cf89f483542721c9ba71197e9bf387299d9807ef7924b9e7c083c",
+        "wx" : "1cc2c242a63d44b90f67f35aca9fd5cc0b25d384ee9648a05279d476f9aa748c",
+        "wy" : "6cb072f7336cf89f483542721c9ba71197e9bf387299d9807ef7924b9e7c083c"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200041cc2c242a63d44b90f67f35aca9fd5cc0b25d384ee9648a05279d476f9aa748c6cb072f7336cf89f483542721c9ba71197e9bf387299d9807ef7924b9e7c083c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABBzCwkKmPUS5D2fzWsqf1cwLJdOE\n7pZIoFJ51Hb5qnSMbLBy9zNs+J9INUJyHJunEZfpvzhymdmAfveSS558CDw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 864,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0221008e305a1cf885ccc330ad0f1b5834a6a783f1948a5d5087d42bb5d47af8243535",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044533382e1caedbed8bdfa5f48c58bdfcb75d6811122bb016cf42e457989fb4386d34b899200cdd58ba2faa1d0169da8a5454de50d08a2e7f5362d60f6ec7c5de",
+        "wx" : "4533382e1caedbed8bdfa5f48c58bdfcb75d6811122bb016cf42e457989fb438",
+        "wy" : "6d34b899200cdd58ba2faa1d0169da8a5454de50d08a2e7f5362d60f6ec7c5de"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200044533382e1caedbed8bdfa5f48c58bdfcb75d6811122bb016cf42e457989fb4386d34b899200cdd58ba2faa1d0169da8a5454de50d08a2e7f5362d60f6ec7c5de",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABEUzOC4crtvti9+l9IxYvfy3XWgR\nEiuwFs9C5FeYn7Q4bTS4mSAM3Vi6L6odAWnailRU3lDQii5/U2LWD27Hxd4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 865,
+          "comment" : "point duplication during verification",
+          "msg" : "54657374",
+          "sig" : "30440220074c035603e1eb49ab5382819bf82af82929b500c6e78841c1b2c3ff54a615dd022044088a0685df1955696286cc083d35afa8d2895927405b0731eadcd8a7233799",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044533382e1caedbed8bdfa5f48c58bdfcb75d6811122bb016cf42e457989fb4383cc69f4281e1cc63843660739c19b2e819e717d3049bf1a8ccb0720db0a68d99",
+        "wx" : "4533382e1caedbed8bdfa5f48c58bdfcb75d6811122bb016cf42e457989fb438",
+        "wy" : "3cc69f4281e1cc63843660739c19b2e819e717d3049bf1a8ccb0720db0a68d99"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200044533382e1caedbed8bdfa5f48c58bdfcb75d6811122bb016cf42e457989fb4383cc69f4281e1cc63843660739c19b2e819e717d3049bf1a8ccb0720db0a68d99",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABEUzOC4crtvti9+l9IxYvfy3XWgR\nEiuwFs9C5FeYn7Q4PMafQoHhzGOENmBznBmy6BnnF9MEm/GozLByDbCmjZk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 866,
+          "comment" : "duplication bug",
+          "msg" : "54657374",
+          "sig" : "30440220074c035603e1eb49ab5382819bf82af82929b500c6e78841c1b2c3ff54a615dd022044088a0685df1955696286cc083d35afa8d2895927405b0731eadcd8a7233799",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a9011e3712e137ef2319b964c61ba2335399cb49d16f1939ca7f03c37c13bb0f93fdb94d60b34aa9e6919b62c24db2e57a07d593692f8ae924ee37a59f2fcd4e",
+        "wx" : "0a9011e3712e137ef2319b964c61ba2335399cb49d16f1939ca7f03c37c13bb0f",
+        "wy" : "093fdb94d60b34aa9e6919b62c24db2e57a07d593692f8ae924ee37a59f2fcd4e"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004a9011e3712e137ef2319b964c61ba2335399cb49d16f1939ca7f03c37c13bb0f93fdb94d60b34aa9e6919b62c24db2e57a07d593692f8ae924ee37a59f2fcd4e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABKkBHjcS4TfvIxm5ZMYbojNTmctJ\n0W8ZOcp/A8N8E7sPk/25TWCzSqnmkZtiwk2y5XoH1ZNpL4rpJO43pZ8vzU4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 867,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "54657374",
+          "sig" : "3044022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2022021ff1192539621f272e135501f80b5e38271e553f11387cb1cd2cfb3b7db4487",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04616514d11e2e9b4f63725981f1d33a0e28973bc7719a4cc2969700913cd2f1b16071f71eff21d2bc254fcffede47a53b6b4e041ab97b6350d59485176ec9d72b",
+        "wx" : "616514d11e2e9b4f63725981f1d33a0e28973bc7719a4cc2969700913cd2f1b1",
+        "wy" : "6071f71eff21d2bc254fcffede47a53b6b4e041ab97b6350d59485176ec9d72b"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004616514d11e2e9b4f63725981f1d33a0e28973bc7719a4cc2969700913cd2f1b16071f71eff21d2bc254fcffede47a53b6b4e041ab97b6350d59485176ec9d72b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABGFlFNEeLptPY3JZgfHTOg4olzvH\ncZpMwpaXAJE80vGxYHH3Hv8h0rwlT8/+3kelO2tOBBq5e2NQ1ZSFF27J1ys=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 868,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "54657374",
+          "sig" : "30440220743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048897c36dda8276cd506b8952172661188c0e0e793d3ae477bc7741f737ded270160f4a84f6678e8f4c91e462f80d83701754c4be2fcabf8ca507bf8652375c7f",
+        "wx" : "08897c36dda8276cd506b8952172661188c0e0e793d3ae477bc7741f737ded270",
+        "wy" : "160f4a84f6678e8f4c91e462f80d83701754c4be2fcabf8ca507bf8652375c7f"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200048897c36dda8276cd506b8952172661188c0e0e793d3ae477bc7741f737ded270160f4a84f6678e8f4c91e462f80d83701754c4be2fcabf8ca507bf8652375c7f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABIiXw23agnbNUGuJUhcmYRiMDg55\nPTrkd7x3Qfc33tJwFg9KhPZnjo9MkeRi+A2DcBdUxL4vyr+MpQe/hlI3XH8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 869,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "30440220743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e0220796a6353bccf0b8675b699d502cbae2c88bb5799818ee4f9f93a0a5d477cd02e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0458961ab0292d1738fc4e560909b43b6f8f5674b2ea802550b50c78856371f6af86513e451cf349bf19f0362f3445efb4a0d0838a24333b943054f826d1bedd27",
+        "wx" : "58961ab0292d1738fc4e560909b43b6f8f5674b2ea802550b50c78856371f6af",
+        "wy" : "086513e451cf349bf19f0362f3445efb4a0d0838a24333b943054f826d1bedd27"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000458961ab0292d1738fc4e560909b43b6f8f5674b2ea802550b50c78856371f6af86513e451cf349bf19f0362f3445efb4a0d0838a24333b943054f826d1bedd27",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABFiWGrApLRc4/E5WCQm0O2+PVnSy\n6oAlULUMeIVjcfavhlE+RRzzSb8Z8DYvNEXvtKDQg4okMzuUMFT4JtG+3Sc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 870,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "30450220743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e02210087fc46494e5887c9cb84d5407e02d78e09c7954fc44e1f2c734b3ecedf6d121f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043925bdeea6e2f648ae6da3988b3a3ea9203829d28da4584f60e3bcbe5f82fa3069822ff194599d3b580f72fcf2a864c4138a12dbd980c2b3e2d7ef870c91cc6e",
+        "wx" : "3925bdeea6e2f648ae6da3988b3a3ea9203829d28da4584f60e3bcbe5f82fa30",
+        "wy" : "69822ff194599d3b580f72fcf2a864c4138a12dbd980c2b3e2d7ef870c91cc6e"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200043925bdeea6e2f648ae6da3988b3a3ea9203829d28da4584f60e3bcbe5f82fa3069822ff194599d3b580f72fcf2a864c4138a12dbd980c2b3e2d7ef870c91cc6e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABDklve6m4vZIrm2jmIs6PqkgOCnS\njaRYT2DjvL5fgvowaYIv8ZRZnTtYD3L88qhkxBOKEtvZgMKz4tfvhwyRzG4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 871,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "30440220743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e022021ff1192539621f272e135501f80b5e38271e553f11387cb1cd2cfb3b7db4488",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04311f12cc03f64afdf6a8348926241d5aafbcfb6e604d50bc9f88018f6acc1b77940c3892867e5953730c3116d3f772feb777302cdf825193f81d19eb4e726eb6",
+        "wx" : "311f12cc03f64afdf6a8348926241d5aafbcfb6e604d50bc9f88018f6acc1b77",
+        "wy" : "0940c3892867e5953730c3116d3f772feb777302cdf825193f81d19eb4e726eb6"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004311f12cc03f64afdf6a8348926241d5aafbcfb6e604d50bc9f88018f6acc1b77940c3892867e5953730c3116d3f772feb777302cdf825193f81d19eb4e726eb6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABDEfEswD9kr99qg0iSYkHVqvvPtu\nYE1QvJ+IAY9qzBt3lAw4koZ+WVNzDDEW0/dy/rd3MCzfglGT+B0Z605ybrY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 872,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "30440220743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e02203090f487e51f9e35c8af70bb9ab7df45037e230a33d2c1fd96e404254fcb8679",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0430291bca4eb93c41991daec0fd2e87c2778d958d9a8e2fa4e6d3835d485bc23e4217f684cfdd836d7cf6099a34c68261e5a094adb5b3e4a9262ff5957c1b1ba8",
+        "wx" : "30291bca4eb93c41991daec0fd2e87c2778d958d9a8e2fa4e6d3835d485bc23e",
+        "wy" : "4217f684cfdd836d7cf6099a34c68261e5a094adb5b3e4a9262ff5957c1b1ba8"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000430291bca4eb93c41991daec0fd2e87c2778d958d9a8e2fa4e6d3835d485bc23e4217f684cfdd836d7cf6099a34c68261e5a094adb5b3e4a9262ff5957c1b1ba8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABDApG8pOuTxBmR2uwP0uh8J3jZWN\nmo4vpObTg11IW8I+Qhf2hM/dg2189gmaNMaCYeWglK21s+SpJi/1lXwbG6g=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 873,
+          "comment" : "extreme value for k",
+          "msg" : "54657374",
+          "sig" : "30440220743cf1b8b5cd4f2eb55f8aa369593ac436ef044166699e37d51a14c2ce13ea0e022077472d9a28b4ece71cf413a68eac0eb423a16fb462b1f48706fed48ca437bd2d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a12c7c13adff626ad31ffb8ba385c3092db1afe4a2a8e887d810a722048164cd8b1f3e67fde9ff0703f1e429f748c847997546ab1850ebc004535dccd453cf81",
+        "wx" : "0a12c7c13adff626ad31ffb8ba385c3092db1afe4a2a8e887d810a722048164cd",
+        "wy" : "08b1f3e67fde9ff0703f1e429f748c847997546ab1850ebc004535dccd453cf81"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004a12c7c13adff626ad31ffb8ba385c3092db1afe4a2a8e887d810a722048164cd8b1f3e67fde9ff0703f1e429f748c847997546ab1850ebc004535dccd453cf81",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABKEsfBOt/2Jq0x/7i6OFwwktsa/k\noqjoh9gQpyIEgWTNix8+Z/3p/wcD8eQp90jIR5l1RqsYUOvABFNdzNRTz4E=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 874,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "54657374",
+          "sig" : "30450221008bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048b0a02e69359fe5e11e15f765277d4bbd31e898a7daa1fca22d6841037c8d7ab7e771e124db6c35c8ae8d262140c4e47de301d8b0fddfc25a7338b08ab2d698b",
+        "wx" : "08b0a02e69359fe5e11e15f765277d4bbd31e898a7daa1fca22d6841037c8d7ab",
+        "wy" : "7e771e124db6c35c8ae8d262140c4e47de301d8b0fddfc25a7338b08ab2d698b"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200048b0a02e69359fe5e11e15f765277d4bbd31e898a7daa1fca22d6841037c8d7ab7e771e124db6c35c8ae8d262140c4e47de301d8b0fddfc25a7338b08ab2d698b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABIsKAuaTWf5eEeFfdlJ31LvTHomK\nfaofyiLWhBA3yNerfnceEk22w1yK6NJiFAxOR94wHYsP3fwlpzOLCKstaYs=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 875,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "30450221008bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace32620220796a6353bccf0b8675b699d502cbae2c88bb5799818ee4f9f93a0a5d477cd02e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04714d086c1016bc3c73cbe008fe42e4418af114e17ad5fd06b357f443bbf947d017ff32e299fd7e3ec73d93374753a62d227324a25daf47ec5d0630ffe2c0219a",
+        "wx" : "714d086c1016bc3c73cbe008fe42e4418af114e17ad5fd06b357f443bbf947d0",
+        "wy" : "17ff32e299fd7e3ec73d93374753a62d227324a25daf47ec5d0630ffe2c0219a"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004714d086c1016bc3c73cbe008fe42e4418af114e17ad5fd06b357f443bbf947d017ff32e299fd7e3ec73d93374753a62d227324a25daf47ec5d0630ffe2c0219a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABHFNCGwQFrw8c8vgCP5C5EGK8RTh\netX9BrNX9EO7+UfQF/8y4pn9fj7HPZM3R1OmLSJzJKJdr0fsXQYw/+LAIZo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 876,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "30460221008bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace326202210087fc46494e5887c9cb84d5407e02d78e09c7954fc44e1f2c734b3ecedf6d121f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0458e260beaa2177f61a1aa24b70b104f3ed7ce997e1e764f2f7af8809c83299ac41cce510d2abd1b9ae5d6d621bf76476c3804c1d9df0dcf368ff214689f20a92",
+        "wx" : "58e260beaa2177f61a1aa24b70b104f3ed7ce997e1e764f2f7af8809c83299ac",
+        "wy" : "41cce510d2abd1b9ae5d6d621bf76476c3804c1d9df0dcf368ff214689f20a92"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000458e260beaa2177f61a1aa24b70b104f3ed7ce997e1e764f2f7af8809c83299ac41cce510d2abd1b9ae5d6d621bf76476c3804c1d9df0dcf368ff214689f20a92",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABFjiYL6qIXf2GhqiS3CxBPPtfOmX\n4edk8veviAnIMpmsQczlENKr0bmuXW1iG/dkdsOATB2d8NzzaP8hRonyCpI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 877,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "30450221008bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262022021ff1192539621f272e135501f80b5e38271e553f11387cb1cd2cfb3b7db4488",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046e7f19d3f4b8a5443f4b460446099c71c1aca4f7e3b40152e25e332e14cdb7d833295afc0cb4f8dd478589ec32fd30de716c3788c35f15f1a0eb3fe6cad085fe",
+        "wx" : "6e7f19d3f4b8a5443f4b460446099c71c1aca4f7e3b40152e25e332e14cdb7d8",
+        "wy" : "33295afc0cb4f8dd478589ec32fd30de716c3788c35f15f1a0eb3fe6cad085fe"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200046e7f19d3f4b8a5443f4b460446099c71c1aca4f7e3b40152e25e332e14cdb7d833295afc0cb4f8dd478589ec32fd30de716c3788c35f15f1a0eb3fe6cad085fe",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABG5/GdP0uKVEP0tGBEYJnHHBrKT3\n47QBUuJeMy4UzbfYMyla/Ay0+N1HhYnsMv0w3nFsN4jDXxXxoOs/5srQhf4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 878,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "30450221008bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace326202203090f487e51f9e35c8af70bb9ab7df45037e230a33d2c1fd96e404254fcb8679",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a888899c0d571168431730d7f24018d340f0a14fd45d8ba747a028de41dd38724541c38e87f62f2f1294923c28f79b3802deb6634366f17d3e5b699e9c4c8534",
+        "wx" : "0a888899c0d571168431730d7f24018d340f0a14fd45d8ba747a028de41dd3872",
+        "wy" : "4541c38e87f62f2f1294923c28f79b3802deb6634366f17d3e5b699e9c4c8534"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004a888899c0d571168431730d7f24018d340f0a14fd45d8ba747a028de41dd38724541c38e87f62f2f1294923c28f79b3802deb6634366f17d3e5b699e9c4c8534",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABKiIiZwNVxFoQxcw1/JAGNNA8KFP\n1F2Lp0egKN5B3ThyRUHDjof2Ly8SlJI8KPebOALetmNDZvF9PltpnpxMhTQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 879,
+          "comment" : "extreme value for k",
+          "msg" : "54657374",
+          "sig" : "30450221008bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262022077472d9a28b4ece71cf413a68eac0eb423a16fb462b1f48706fed48ca437bd2d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997",
+        "wx" : "08bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262",
+        "wy" : "547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262547ef835c3dac4fd97f8461a14611dc9c27745132ded8e545c1d54c72f046997",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABIvSrrnLflfLLEtIL/yBt6+53ifh\n470jwjpEU72azjJiVH74NcPaxP2X+EYaFGEdycJ3RRMt7Y5UXB1Uxy8EaZc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 880,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "30440220532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25022018487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 881,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "3044022056ccad1e0c7a21ae7eef50d7d1830a456b928e9277f9845e3b1094148813f882022018487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262557c5fa5de13e4bea66dc47689226fa8abc4b110a73891d3c3f5f355f069e9e0",
+        "wx" : "08bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262",
+        "wy" : "557c5fa5de13e4bea66dc47689226fa8abc4b110a73891d3c3f5f355f069e9e0"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200048bd2aeb9cb7e57cb2c4b482ffc81b7afb9de27e1e3bd23c23a4453bd9ace3262557c5fa5de13e4bea66dc47689226fa8abc4b110a73891d3c3f5f355f069e9e0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABIvSrrnLflfLLEtIL/yBt6+53ifh\n470jwjpEU72azjJiVXxfpd4T5L6mbcR2iSJvqKvEsRCnOJHTw/XzVfBp6eA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 882,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "30440220532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25022018487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 883,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "3044022056ccad1e0c7a21ae7eef50d7d1830a456b928e9277f9845e3b1094148813f882022018487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04231ea76f9414e4667265c9750666b38b6e9bde67fb074f78d25e7b1807a45a46182e262b4038cc6868516fbf12bd4dca207c17564e5a049c60b5d5dd09c73d22",
+        "wx" : "231ea76f9414e4667265c9750666b38b6e9bde67fb074f78d25e7b1807a45a46",
+        "wy" : "182e262b4038cc6868516fbf12bd4dca207c17564e5a049c60b5d5dd09c73d22"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010803420004231ea76f9414e4667265c9750666b38b6e9bde67fb074f78d25e7b1807a45a46182e262b4038cc6868516fbf12bd4dca207c17564e5a049c60b5d5dd09c73d22",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABCMep2+UFORmcmXJdQZms4tum95n\n+wdPeNJeexgHpFpGGC4mK0A4zGhoUW+/Er1NyiB8F1ZOWgScYLXV3QnHPSI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 884,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "54657374",
+          "sig" : "3036021100e2027b801fc479308ff5399a8825fcce022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 885,
+          "comment" : "r too large",
+          "msg" : "54657374",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d726e3bf623d52620282013481d1f6e5375022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a4",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0485d4be1e69cb9b5a0c3be6fd07576bffa61e9a430b2fa4a80ef860ca6de2a4e58003cfc8de01db91d37dc76d1e3bd95aea47c301f1b987cd2ddaf5e91be77f15",
+        "wx" : "085d4be1e69cb9b5a0c3be6fd07576bffa61e9a430b2fa4a80ef860ca6de2a4e5",
+        "wy" : "08003cfc8de01db91d37dc76d1e3bd95aea47c301f1b987cd2ddaf5e91be77f15"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101080342000485d4be1e69cb9b5a0c3be6fd07576bffa61e9a430b2fa4a80ef860ca6de2a4e58003cfc8de01db91d37dc76d1e3bd95aea47c301f1b987cd2ddaf5e91be77f15",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABIXUvh5py5taDDvm/QdXa/+mHppD\nCy+kqA74YMpt4qTlgAPPyN4B25HTfcdtHjvZWupHwwHxuYfNLdr16RvnfxU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 886,
+          "comment" : "r,s are large",
+          "msg" : "54657374",
+          "sig" : "3046022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a4022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043b0a4f1e4d84c6bfd203a0ea04d7a9419bcd59b0ff8757609701b61881eda3b79bc84764caa0dd0815ca06fc0b38d7e840eabccf945697438944d5859772aeb4",
+        "wx" : "3b0a4f1e4d84c6bfd203a0ea04d7a9419bcd59b0ff8757609701b61881eda3b7",
+        "wy" : "09bc84764caa0dd0815ca06fc0b38d7e840eabccf945697438944d5859772aeb4"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200043b0a4f1e4d84c6bfd203a0ea04d7a9419bcd59b0ff8757609701b61881eda3b79bc84764caa0dd0815ca06fc0b38d7e840eabccf945697438944d5859772aeb4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABDsKTx5NhMa/0gOg6gTXqUGbzVmw\n/4dXYJcBthiB7aO3m8hHZMqg3QgVygb8CzjX6EDqvM+UVpdDiUTVhZdyrrQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 887,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "54657374",
+          "sig" : "304402207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02204ab8de0a51481bc45794b924518f2dd6ac5cce31f3228d624c5a896f79a2d6a2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045a40fcf15f9749254ebcc9c8e1fecebb1248f5ce29dddc26702357bedebfa0154e25e19b6b63fe08914f4062c0a564ac5333632f1086415464d671626bc4dc56",
+        "wx" : "5a40fcf15f9749254ebcc9c8e1fecebb1248f5ce29dddc26702357bedebfa015",
+        "wy" : "4e25e19b6b63fe08914f4062c0a564ac5333632f1086415464d671626bc4dc56"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200045a40fcf15f9749254ebcc9c8e1fecebb1248f5ce29dddc26702357bedebfa0154e25e19b6b63fe08914f4062c0a564ac5333632f1086415464d671626bc4dc56",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABFpA/PFfl0klTrzJyOH+zrsSSPXO\nKd3cJnAjV77ev6AVTiXhm2tj/giRT0BiwKVkrFMzYy8QhkFUZNZxYmvE3FY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 888,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "54657374",
+          "sig" : "304502207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0221008b1b5f89f5bb74caa42d36e601a9f3c20b4e6c91ceb98a52fbfa9f81781b8a17",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044ee4aff9868419906d5946b3cc338fa4db92a1d016a5c6c697062d2c39dff57a7a308c37a2610abc9e604666c53495bd4359903e47119570935984b34d118018",
+        "wx" : "4ee4aff9868419906d5946b3cc338fa4db92a1d016a5c6c697062d2c39dff57a",
+        "wy" : "7a308c37a2610abc9e604666c53495bd4359903e47119570935984b34d118018"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200044ee4aff9868419906d5946b3cc338fa4db92a1d016a5c6c697062d2c39dff57a7a308c37a2610abc9e604666c53495bd4359903e47119570935984b34d118018",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABE7kr/mGhBmQbVlGs8wzj6TbkqHQ\nFqXGxpcGLSw53/V6ejCMN6JhCryeYEZmxTSVvUNZkD5HEZVwk1mEs00RgBg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 889,
+          "comment" : "small r and s",
+          "msg" : "54657374",
+          "sig" : "3006020101020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045ef5efbfaeb5cb4c2c9f8db76cdb6f832adabda8c3a882e99f9ab23d8962b7cb33097ad4f67e9cbb90b8bbd2b71f4554818ac5aeb1f396ac6d49626edd51b0c2",
+        "wx" : "5ef5efbfaeb5cb4c2c9f8db76cdb6f832adabda8c3a882e99f9ab23d8962b7cb",
+        "wy" : "33097ad4f67e9cbb90b8bbd2b71f4554818ac5aeb1f396ac6d49626edd51b0c2"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200045ef5efbfaeb5cb4c2c9f8db76cdb6f832adabda8c3a882e99f9ab23d8962b7cb33097ad4f67e9cbb90b8bbd2b71f4554818ac5aeb1f396ac6d49626edd51b0c2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABF7177+utctMLJ+Nt2zbb4Mq2r2o\nw6iC6Z+asj2JYrfLMwl61PZ+nLuQuLvStx9FVIGKxa6x85asbUlibt1RsMI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 890,
+          "comment" : "small r and s",
+          "msg" : "54657374",
+          "sig" : "3006020101020102",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043e8403566c4bd45dc1a3e33ffc44482c103eab150327e52879d91faec4b41ba27fa87129ced313ce073e9772f0d4862d879c39e5d1512e1a47e43303d9ddfb1d",
+        "wx" : "3e8403566c4bd45dc1a3e33ffc44482c103eab150327e52879d91faec4b41ba2",
+        "wy" : "7fa87129ced313ce073e9772f0d4862d879c39e5d1512e1a47e43303d9ddfb1d"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200043e8403566c4bd45dc1a3e33ffc44482c103eab150327e52879d91faec4b41ba27fa87129ced313ce073e9772f0d4862d879c39e5d1512e1a47e43303d9ddfb1d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABD6EA1ZsS9RdwaPjP/xESCwQPqsV\nAyflKHnZH67EtBuif6hxKc7TE84HPpdy8NSGLYecOeXRUS4aR+QzA9nd+x0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 891,
+          "comment" : "small r and s",
+          "msg" : "54657374",
+          "sig" : "3006020101020103",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 892,
+          "comment" : "r is larger than n",
+          "msg" : "54657374",
+          "sig" : "3026022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a8020103",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0414033c115778c47034a8dcd20912fa3dfa7c68aaf24b5cabc4c8d032f32758f855ec2a8c3033a2a832fc2f496d8fc067547bbffd37e7ea7314bba8a0e2e38bc8",
+        "wx" : "14033c115778c47034a8dcd20912fa3dfa7c68aaf24b5cabc4c8d032f32758f8",
+        "wy" : "55ec2a8c3033a2a832fc2f496d8fc067547bbffd37e7ea7314bba8a0e2e38bc8"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101080342000414033c115778c47034a8dcd20912fa3dfa7c68aaf24b5cabc4c8d032f32758f855ec2a8c3033a2a832fc2f496d8fc067547bbffd37e7ea7314bba8a0e2e38bc8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABBQDPBFXeMRwNKjc0gkS+j36fGiq\n8ktcq8TI0DLzJ1j4VewqjDAzoqgy/C9JbY/AZ1R7v/035+pzFLuooOLji8g=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 893,
+          "comment" : "s is larger than n",
+          "msg" : "54657374",
+          "sig" : "3026020101022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82975b2d2e",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048a9fcc60103a2ca5b2c4d88843e224785a2b0540bd89a14d2f320a953aac5d789f2153a664aa7e150c0e267921894696c6cecbaba854457fc42c9d24864a08a1",
+        "wx" : "08a9fcc60103a2ca5b2c4d88843e224785a2b0540bd89a14d2f320a953aac5d78",
+        "wy" : "09f2153a664aa7e150c0e267921894696c6cecbaba854457fc42c9d24864a08a1"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200048a9fcc60103a2ca5b2c4d88843e224785a2b0540bd89a14d2f320a953aac5d789f2153a664aa7e150c0e267921894696c6cecbaba854457fc42c9d24864a08a1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABIqfzGAQOiylssTYiEPiJHhaKwVA\nvYmhTS8yCpU6rF14nyFTpmSqfhUMDiZ5IYlGlsbOy6uoVEV/xCydJIZKCKE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 894,
+          "comment" : "small r and s^-1",
+          "msg" : "54657374",
+          "sig" : "30260202010202202827370584fdeb9f5d5a9fb9579a09390efb6f9d99b64fc188d8bce05c2d4eed",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047eb86f8e5d2adf7cc4cbd8849ca3ac811540fd35f60bd691dbc666a894ee6e5c6c1daa6faf62318dc5f1dba736f841bb21af46aa6ac17f78662018d45fbdcc3f",
+        "wx" : "7eb86f8e5d2adf7cc4cbd8849ca3ac811540fd35f60bd691dbc666a894ee6e5c",
+        "wy" : "6c1daa6faf62318dc5f1dba736f841bb21af46aa6ac17f78662018d45fbdcc3f"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200047eb86f8e5d2adf7cc4cbd8849ca3ac811540fd35f60bd691dbc666a894ee6e5c6c1daa6faf62318dc5f1dba736f841bb21af46aa6ac17f78662018d45fbdcc3f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABH64b45dKt98xMvYhJyjrIEVQP01\n9gvWkdvGZqiU7m5cbB2qb69iMY3F8dunNvhBuyGvRqpqwX94ZiAY1F+9zD8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 895,
+          "comment" : "smallish r and s^-1",
+          "msg" : "54657374",
+          "sig" : "302b02072d9b4d347952cc02204937a087731df4febc2c3a81ddfbab5dc3af950817f41b590d156ed409ad2869",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041206e3a802f59b8ed707474530c37a8c25efdfb1bcb2cfea3c813b58eb667e1715e78dc70170f2720cf0331432d61148591ebcfc4d20c6a3fd01afd9fa6a9e80",
+        "wx" : "1206e3a802f59b8ed707474530c37a8c25efdfb1bcb2cfea3c813b58eb667e17",
+        "wy" : "15e78dc70170f2720cf0331432d61148591ebcfc4d20c6a3fd01afd9fa6a9e80"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200041206e3a802f59b8ed707474530c37a8c25efdfb1bcb2cfea3c813b58eb667e1715e78dc70170f2720cf0331432d61148591ebcfc4d20c6a3fd01afd9fa6a9e80",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABBIG46gC9ZuO1wdHRTDDeowl79+x\nvLLP6jyBO1jrZn4XFeeNxwFw8nIM8DMUMtYRSFkevPxNIMaj/QGv2fpqnoA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 896,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "54657374",
+          "sig" : "3032020d1033e67e37b32b445580bf4efc02210091827d03bb6dac31940ba56ed88489048ff173f0bf20cab20dcc086fca37f285",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048a33c9017ba0f19ed44cbdf7c9817024c3f095a899adafdcfe7dd6f51ffef9518c56c09ccfcbe2250838630e26764ba9e1bc1092bccec6135c29f31f617c14ca",
+        "wx" : "08a33c9017ba0f19ed44cbdf7c9817024c3f095a899adafdcfe7dd6f51ffef951",
+        "wy" : "08c56c09ccfcbe2250838630e26764ba9e1bc1092bccec6135c29f31f617c14ca"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200048a33c9017ba0f19ed44cbdf7c9817024c3f095a899adafdcfe7dd6f51ffef9518c56c09ccfcbe2250838630e26764ba9e1bc1092bccec6135c29f31f617c14ca",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABIozyQF7oPGe1Ey998mBcCTD8JWo\nma2v3P591vUf/vlRjFbAnM/L4iUIOGMOJnZLqeG8EJK8zsYTXCnzH2F8FMo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 897,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "54657374",
+          "sig" : "30260202010202203eb35fe7e8331f71e4c63b45f349a99d47a5e781798e579f2386195d3827bb15",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a5d5c0efc3901f308bf4251bb0cc2844e5abcee9096d118134fd714d13f2d0308ef80671c71bd6bf6e333325b561b3c0c3d1a4db1ac7ed8b0fe09b3b3253cd56",
+        "wx" : "0a5d5c0efc3901f308bf4251bb0cc2844e5abcee9096d118134fd714d13f2d030",
+        "wy" : "08ef80671c71bd6bf6e333325b561b3c0c3d1a4db1ac7ed8b0fe09b3b3253cd56"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010803420004a5d5c0efc3901f308bf4251bb0cc2844e5abcee9096d118134fd714d13f2d0308ef80671c71bd6bf6e333325b561b3c0c3d1a4db1ac7ed8b0fe09b3b3253cd56",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABKXVwO/DkB8wi/QlG7DMKETlq87p\nCW0RgTT9cU0T8tAwjvgGcccb1r9uMzMltWGzwMPRpNsax+2LD+CbOzJTzVY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 898,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "54657374",
+          "sig" : "3031020d062522bbd3ecbe7c39e93e7c2502203eb35fe7e8331f71e4c63b45f349a99d47a5e781798e579f2386195d3827bb15",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048aede4648355451e9ac82e480fee5c4c90492d053ece6f77d153878b51e13a4e9c3fd7e229ec77ab92ba6ca57005cb25313b3629d33409b15d34cabe08fec31a",
+        "wx" : "08aede4648355451e9ac82e480fee5c4c90492d053ece6f77d153878b51e13a4e",
+        "wy" : "09c3fd7e229ec77ab92ba6ca57005cb25313b3629d33409b15d34cabe08fec31a"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200048aede4648355451e9ac82e480fee5c4c90492d053ece6f77d153878b51e13a4e9c3fd7e229ec77ab92ba6ca57005cb25313b3629d33409b15d34cabe08fec31a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABIrt5GSDVUUemsguSA/uXEyQSS0F\nPs5vd9FTh4tR4TpOnD/X4insd6uSumylcAXLJTE7NinTNAmxXTTKvgj+wxo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 899,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "54657374",
+          "sig" : "3045022100a9fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e8297485629022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a3e82d3f4e532da8f2fb627e07436c86923e7bcd3055706250074257fad3f1052d01c6d7e6d065c3b25e4f85d211e060208d7dad38a56bbd397f785ab77820a8",
+        "wx" : "0a3e82d3f4e532da8f2fb627e07436c86923e7bcd3055706250074257fad3f105",
+        "wy" : "2d01c6d7e6d065c3b25e4f85d211e060208d7dad38a56bbd397f785ab77820a8"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010803420004a3e82d3f4e532da8f2fb627e07436c86923e7bcd3055706250074257fad3f1052d01c6d7e6d065c3b25e4f85d211e060208d7dad38a56bbd397f785ab77820a8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABKPoLT9OUy2o8vtifgdDbIaSPnvN\nMFVwYlAHQlf60/EFLQHG1+bQZcOyXk+F0hHgYCCNfa04pWu9OX94Wrd4IKg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 900,
+          "comment" : "s == 1",
+          "msg" : "54657374",
+          "sig" : "3025022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce4020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 901,
+          "comment" : "s == 0",
+          "msg" : "54657374",
+          "sig" : "3025022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce4020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04938461391ad301808f26169b23999507de65e9af8af7e1f8e480336765ef4a8b3a858dbd1ef2cca29203ee738dacb20e0c57f1bc77653a0bb4929bc1fc4fe792",
+        "wx" : "0938461391ad301808f26169b23999507de65e9af8af7e1f8e480336765ef4a8b",
+        "wy" : "3a858dbd1ef2cca29203ee738dacb20e0c57f1bc77653a0bb4929bc1fc4fe792"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010803420004938461391ad301808f26169b23999507de65e9af8af7e1f8e480336765ef4a8b3a858dbd1ef2cca29203ee738dacb20e0c57f1bc77653a0bb4929bc1fc4fe792",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABJOEYTka0wGAjyYWmyOZlQfeZemv\nivfh+OSAM2dl70qLOoWNvR7yzKKSA+5zjayyDgxX8bx3ZToLtJKbwfxP55I=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 902,
+          "comment" : "point at infinity during verify",
+          "msg" : "54657374",
+          "sig" : "3044022054fdabedd0f754de1f3305484ec1c6b8c61cbd51dab0d37bc80f07414ba42b53022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0495d81e1dd9790ff561dc95495371397250466122ef461ebf706de39e1f35929f18736e96131c0cb92c504dc26025db20bd124ece9c5c04182b3f0dd79bbdaa55",
+        "wx" : "095d81e1dd9790ff561dc95495371397250466122ef461ebf706de39e1f35929f",
+        "wy" : "18736e96131c0cb92c504dc26025db20bd124ece9c5c04182b3f0dd79bbdaa55"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101080342000495d81e1dd9790ff561dc95495371397250466122ef461ebf706de39e1f35929f18736e96131c0cb92c504dc26025db20bd124ece9c5c04182b3f0dd79bbdaa55",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABJXYHh3ZeQ/1YdyVSVNxOXJQRmEi\n70Yev3Bt454fNZKfGHNulhMcDLksUE3CYCXbIL0STs6cXAQYKz8N15u9qlU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 903,
+          "comment" : "u1 == 1",
+          "msg" : "54657374",
+          "sig" : "3044022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce00220532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0482fd28b9fad4a324f2f1124c8c3bf4577b6ac6635377d01dc539399dfc48fe8e54435ac2fa06f4e74b8ec7276a185b15419182366e4bee335335a2b87f27a9bc",
+        "wx" : "082fd28b9fad4a324f2f1124c8c3bf4577b6ac6635377d01dc539399dfc48fe8e",
+        "wy" : "54435ac2fa06f4e74b8ec7276a185b15419182366e4bee335335a2b87f27a9bc"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101080342000482fd28b9fad4a324f2f1124c8c3bf4577b6ac6635377d01dc539399dfc48fe8e54435ac2fa06f4e74b8ec7276a185b15419182366e4bee335335a2b87f27a9bc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABIL9KLn61KMk8vESTIw79Fd7asZj\nU3fQHcU5OZ38SP6OVENawvoG9OdLjscnahhbFUGRgjZuS+4zUzWiuH8nqbw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 904,
+          "comment" : "u1 == n - 1",
+          "msg" : "54657374",
+          "sig" : "3044022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce0022056ccad1e0c7a21ae7eef50d7d1830a456b928e9277f9845e3b1094148813f882",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042ec2ca240d708aee13f51f45e3d81caf3abc0a12056c6473f4ac77d06a9243593074913904d9383dc793a752bb29085bebbcbd221080f05137ea2633e00c9f38",
+        "wx" : "2ec2ca240d708aee13f51f45e3d81caf3abc0a12056c6473f4ac77d06a924359",
+        "wy" : "3074913904d9383dc793a752bb29085bebbcbd221080f05137ea2633e00c9f38"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200042ec2ca240d708aee13f51f45e3d81caf3abc0a12056c6473f4ac77d06a9243593074913904d9383dc793a752bb29085bebbcbd221080f05137ea2633e00c9f38",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABC7CyiQNcIruE/UfRePYHK86vAoS\nBWxkc/Ssd9BqkkNZMHSROQTZOD3Hk6dSuykIW+u8vSIQgPBRN+omM+AMnzg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 905,
+          "comment" : "u2 == 1",
+          "msg" : "54657374",
+          "sig" : "3044022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce0022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0437e96dd49cec4da55325782300d56bad85ceb0bb89a68f489d58b0cab883bdd745684243865d704269ceb1d8682dd370c4b5456ebda33d60dba0c1fba8493db7",
+        "wx" : "37e96dd49cec4da55325782300d56bad85ceb0bb89a68f489d58b0cab883bdd7",
+        "wy" : "45684243865d704269ceb1d8682dd370c4b5456ebda33d60dba0c1fba8493db7"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101080342000437e96dd49cec4da55325782300d56bad85ceb0bb89a68f489d58b0cab883bdd745684243865d704269ceb1d8682dd370c4b5456ebda33d60dba0c1fba8493db7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABDfpbdSc7E2lUyV4IwDVa62FzrC7\niaaPSJ1YsMq4g73XRWhCQ4ZdcEJpzrHYaC3TcMS1RW69oz1g26DB+6hJPbc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 906,
+          "comment" : "u2 == n - 1",
+          "msg" : "54657374",
+          "sig" : "3044022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce0022071523a926bf4712829995c6069025e4bb2d0fc6d23966f4fb5695f01ba3039c7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049f787c4b132b722d1c5a34042e8587d001b379a0f884bff21335a91e7e393b798a1c1eaf1520068b6e891222a434e9c61f3490fffdd855e4f54765105a6fccd6",
+        "wx" : "09f787c4b132b722d1c5a34042e8587d001b379a0f884bff21335a91e7e393b79",
+        "wy" : "08a1c1eaf1520068b6e891222a434e9c61f3490fffdd855e4f54765105a6fccd6"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200049f787c4b132b722d1c5a34042e8587d001b379a0f884bff21335a91e7e393b798a1c1eaf1520068b6e891222a434e9c61f3490fffdd855e4f54765105a6fccd6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABJ94fEsTK3ItHFo0BC6Fh9ABs3mg\n+IS/8hM1qR5+OTt5ihwerxUgBotuiRIipDTpxh80kP/92FXk9UdlEFpvzNY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 907,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022054635633127665edff4996c3232c0589e44acce6fb989885a1b92da58cd43c44",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0485b0ab50fcd2814f9e98712fd08bf77e95b95fa0a3203b14e9d64511f498dd535af793c11e554ce787e6e44037ce1449ef4eca6f1087e72b809e128fed50c1e7",
+        "wx" : "085b0ab50fcd2814f9e98712fd08bf77e95b95fa0a3203b14e9d64511f498dd53",
+        "wy" : "5af793c11e554ce787e6e44037ce1449ef4eca6f1087e72b809e128fed50c1e7"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101080342000485b0ab50fcd2814f9e98712fd08bf77e95b95fa0a3203b14e9d64511f498dd535af793c11e554ce787e6e44037ce1449ef4eca6f1087e72b809e128fed50c1e7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABIWwq1D80oFPnphxL9CL936VuV+g\noyA7FOnWRRH0mN1TWveTwR5VTOeH5uRAN84USe9Oym8Qh+crgJ4Sj+1Qwec=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 908,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0220028eb8f6fb8e5a3833700b5687f17948beeecf7c73aa9c14430ef3ca01602036",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0482958c572d5b3db6e18567361b715b1e3aea2a399f0a3c0723fa7f39ac6ec997201815b8ab4412a36334844afb6b407290240282b4036112ddf61f281057c862",
+        "wx" : "082958c572d5b3db6e18567361b715b1e3aea2a399f0a3c0723fa7f39ac6ec997",
+        "wy" : "201815b8ab4412a36334844afb6b407290240282b4036112ddf61f281057c862"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101080342000482958c572d5b3db6e18567361b715b1e3aea2a399f0a3c0723fa7f39ac6ec997201815b8ab4412a36334844afb6b407290240282b4036112ddf61f281057c862",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABIKVjFctWz224YVnNhtxWx466io5\nnwo8ByP6fzmsbsmXIBgVuKtEEqNjNIRK+2tAcpAkAoK0A2ES3fYfKBBXyGI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 909,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02207c04eb7f3730e231a1c6f86a11042f1a914b02bd83ca8e82670f9bf9d17d9e00",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043269930ec284341b0d34ffaa187f69ca4d1599daa85ff7c2ef069d75d62a2e189eb2b5ed183a18c369626e4eff08f42fb9d3286de2bcdb7c145507bd57e37a78",
+        "wx" : "3269930ec284341b0d34ffaa187f69ca4d1599daa85ff7c2ef069d75d62a2e18",
+        "wy" : "09eb2b5ed183a18c369626e4eff08f42fb9d3286de2bcdb7c145507bd57e37a78"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200043269930ec284341b0d34ffaa187f69ca4d1599daa85ff7c2ef069d75d62a2e189eb2b5ed183a18c369626e4eff08f42fb9d3286de2bcdb7c145507bd57e37a78",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABDJpkw7ChDQbDTT/qhh/acpNFZna\nqF/3wu8GnXXWKi4YnrK17Rg6GMNpYm5O/wj0L7nTKG3ivNt8FFUHvVfjeng=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 910,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02203b3b272686d138084988ae23089d57b574fbabe983e1de35694442c2b9660070",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042ebdb7c2caec4073589afde56e0f7ecd8983fcc80eac1450af82dca4328c9b7198509d877261e2f71b05059e71f9f81fe91466e51ea1b8621407ce182ffadb45",
+        "wx" : "2ebdb7c2caec4073589afde56e0f7ecd8983fcc80eac1450af82dca4328c9b71",
+        "wy" : "098509d877261e2f71b05059e71f9f81fe91466e51ea1b8621407ce182ffadb45"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200042ebdb7c2caec4073589afde56e0f7ecd8983fcc80eac1450af82dca4328c9b7198509d877261e2f71b05059e71f9f81fe91466e51ea1b8621407ce182ffadb45",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABC69t8LK7EBzWJr95W4Pfs2Jg/zI\nDqwUUK+C3KQyjJtxmFCdh3Jh4vcbBQWecfn4H+kUZuUeobhiFAfOGC/620U=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 911,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202e67ab256e246048b8154c6bd12de75f1657f9b20e8da09beca149a517cbfb1b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042bb609b2926d816280a8104377abab010feb15a0c537081bdf3d5152ce94e5765a84ed06d11a4bfddfdc5465b1c0e4f891119cdcbaaad52eee39b046afb2c6cb",
+        "wx" : "2bb609b2926d816280a8104377abab010feb15a0c537081bdf3d5152ce94e576",
+        "wy" : "5a84ed06d11a4bfddfdc5465b1c0e4f891119cdcbaaad52eee39b046afb2c6cb"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200042bb609b2926d816280a8104377abab010feb15a0c537081bdf3d5152ce94e5765a84ed06d11a4bfddfdc5465b1c0e4f891119cdcbaaad52eee39b046afb2c6cb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABCu2CbKSbYFigKgQQ3erqwEP6xWg\nxTcIG989UVLOlOV2WoTtBtEaS/3f3FRlscDk+JERnNy6qtUu7jmwRq+yxss=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 912,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02205ccf564adc48c091702a98d7a25bcebe2caff3641d1b4137d942934a2f97f636",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045c52ce74f8178b363464f21ad35af0e4eb944c64006590b00d1f110ce66d19b696777c5dd01e7c522bccd704adeb236697617ef70b2ba24a7b8e19b02fc1dd88",
+        "wx" : "5c52ce74f8178b363464f21ad35af0e4eb944c64006590b00d1f110ce66d19b6",
+        "wy" : "096777c5dd01e7c522bccd704adeb236697617ef70b2ba24a7b8e19b02fc1dd88"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200045c52ce74f8178b363464f21ad35af0e4eb944c64006590b00d1f110ce66d19b696777c5dd01e7c522bccd704adeb236697617ef70b2ba24a7b8e19b02fc1dd88",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABFxSznT4F4s2NGTyGtNa8OTrlExk\nAGWQsA0fEQzmbRm2lnd8XdAefFIrzNcEresjZpdhfvcLK6JKe44ZsC/B3Yg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 913,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0221008197dc78d6ccee9677df5d99f382c80c19dd0d78babbb86810d8398b0c911414",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042ffe3a34411ff56f7c7de85601cf4a07bfb39623ef660ceb0ab4493be8911362735028764c6e7812195d792ebc7e5954755f3e35c28467f72a7890bbbf403f7f",
+        "wx" : "2ffe3a34411ff56f7c7de85601cf4a07bfb39623ef660ceb0ab4493be8911362",
+        "wy" : "735028764c6e7812195d792ebc7e5954755f3e35c28467f72a7890bbbf403f7f"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200042ffe3a34411ff56f7c7de85601cf4a07bfb39623ef660ceb0ab4493be8911362735028764c6e7812195d792ebc7e5954755f3e35c28467f72a7890bbbf403f7f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABC/+OjRBH/VvfH3oVgHPSge/s5Yj\n72YM6wq0STvokRNic1AodkxueBIZXXkuvH5ZVHVfPjXChGf3KniQu79AP38=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 914,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02207552d8ce45674b223735b1c2d0946581cd062d494a89f42f58f0ee1bc5c0f318",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0464aa0c89a2b612b682080395da8601d8d19cd7ca163c01ee8d012ddace8e82ec4114ff212a262a25f7983ef1caa8fc5c781a06462c7f556e69f164aaf9ec0f40",
+        "wx" : "64aa0c89a2b612b682080395da8601d8d19cd7ca163c01ee8d012ddace8e82ec",
+        "wy" : "4114ff212a262a25f7983ef1caa8fc5c781a06462c7f556e69f164aaf9ec0f40"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101080342000464aa0c89a2b612b682080395da8601d8d19cd7ca163c01ee8d012ddace8e82ec4114ff212a262a25f7983ef1caa8fc5c781a06462c7f556e69f164aaf9ec0f40",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABGSqDImithK2gggDldqGAdjRnNfK\nFjwB7o0BLdrOjoLsQRT/ISomKiX3mD7xyqj8XHgaBkYsf1VuafFkqvnsD0A=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 915,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202a988eeb5d91279714eb150faea4838ede06b16567dc73919515d28ff04a12d7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0480af66c253b93acb4d5c06d22fba4dfec149d243af9fad96b9b0ab792ba38c4f171eb35aee0ad693d6ac63adf2813840f13e6432cb498ad9eb0356f6abe7d503",
+        "wx" : "080af66c253b93acb4d5c06d22fba4dfec149d243af9fad96b9b0ab792ba38c4f",
+        "wy" : "171eb35aee0ad693d6ac63adf2813840f13e6432cb498ad9eb0356f6abe7d503"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101080342000480af66c253b93acb4d5c06d22fba4dfec149d243af9fad96b9b0ab792ba38c4f171eb35aee0ad693d6ac63adf2813840f13e6432cb498ad9eb0356f6abe7d503",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABICvZsJTuTrLTVwG0i+6Tf7BSdJD\nr5+tlrmwq3kro4xPFx6zWu4K1pPWrGOt8oE4QPE+ZDLLSYrZ6wNW9qvn1QM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 916,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0220559801a88f7843ce3f1c73cd7a5787e7a7eeadbcb9c90e71ee64e0dd0a741a63",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0420d1a06bd6fda62e0a9ee8be88681234d04a519a44b25a8515746c44aad5787226d00ef3ec03a34b07efbbf1185bc6ce1f30ed780812dcebefe046fc9be6d9dc",
+        "wx" : "20d1a06bd6fda62e0a9ee8be88681234d04a519a44b25a8515746c44aad57872",
+        "wy" : "26d00ef3ec03a34b07efbbf1185bc6ce1f30ed780812dcebefe046fc9be6d9dc"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101080342000420d1a06bd6fda62e0a9ee8be88681234d04a519a44b25a8515746c44aad5787226d00ef3ec03a34b07efbbf1185bc6ce1f30ed780812dcebefe046fc9be6d9dc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABCDRoGvW/aYuCp7ovohoEjTQSlGa\nRLJahRV0bESq1XhyJtAO8+wDo0sH77vxGFvGzh8w7XgIEtzr7+BG/Jvm2dw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 917,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202b66568f063d10d73f77a86be8c18522b5c947493bfcc22f1d884a0a4409fc41",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049b3fc0ecd0fc126fa2c539e0f0b1eb3228829664c841775a4d35032500a8a04522de521356799e53e43a4f5a62ddfc98aae4a3cb9f0ae2096224df1e84e90dd6",
+        "wx" : "09b3fc0ecd0fc126fa2c539e0f0b1eb3228829664c841775a4d35032500a8a045",
+        "wy" : "22de521356799e53e43a4f5a62ddfc98aae4a3cb9f0ae2096224df1e84e90dd6"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200049b3fc0ecd0fc126fa2c539e0f0b1eb3228829664c841775a4d35032500a8a04522de521356799e53e43a4f5a62ddfc98aae4a3cb9f0ae2096224df1e84e90dd6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABJs/wOzQ/BJvosU54PCx6zIogpZk\nyEF3Wk01AyUAqKBFIt5SE1Z5nlPkOk9aYt38mKrko8ufCuIJYiTfHoTpDdY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 918,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02203e0275bf9b987118d0e37c350882178d48a5815ec1e547413387cdfce8becf00",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04265900656b73d7f3023419513d3809a9f7553280756451a4f5b9696f4ec4630b8b4ab325d5fa8831b16699993dc49cc87db870fd1789869614653b38e0c74219",
+        "wx" : "265900656b73d7f3023419513d3809a9f7553280756451a4f5b9696f4ec4630b",
+        "wy" : "08b4ab325d5fa8831b16699993dc49cc87db870fd1789869614653b38e0c74219"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010803420004265900656b73d7f3023419513d3809a9f7553280756451a4f5b9696f4ec4630b8b4ab325d5fa8831b16699993dc49cc87db870fd1789869614653b38e0c74219",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABCZZAGVrc9fzAjQZUT04Can3VTKA\ndWRRpPW5aW9OxGMLi0qzJdX6iDGxZpmZPcScyH24cP0XiYaWFGU7OODHQhk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 919,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0221009bfce53d169f1bd2d444070b13ad08f65d7ba717ce4119fa601409ac64dae46e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042c26be9c36920f0066ec7816cf910e99cff1ed2a4f76f2762a8a9bb2312247152f594f09d6ac32cf0b761eea8a29ba67511765ffc5c67ca093e92a09171b4e4a",
+        "wx" : "2c26be9c36920f0066ec7816cf910e99cff1ed2a4f76f2762a8a9bb231224715",
+        "wy" : "2f594f09d6ac32cf0b761eea8a29ba67511765ffc5c67ca093e92a09171b4e4a"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200042c26be9c36920f0066ec7816cf910e99cff1ed2a4f76f2762a8a9bb2312247152f594f09d6ac32cf0b761eea8a29ba67511765ffc5c67ca093e92a09171b4e4a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABCwmvpw2kg8AZux4Fs+RDpnP8e0q\nT3bydiqKm7IxIkcVL1lPCdasMs8Ldh7qiim6Z1EXZf/Fxnygk+kqCRcbTko=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 920,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022073cc15985005002b760de9b44659915f135c8ab1915ba5c83b2c80b6c1a82969",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040cde1d4275e01f57e5a78968b6da29d704b12d7ee15ffdbf67edb53937f575504c95a2f102571f765c509a89ac7a6ced5fede55b339eed9032f49bd627f75280",
+        "wx" : "0cde1d4275e01f57e5a78968b6da29d704b12d7ee15ffdbf67edb53937f57550",
+        "wy" : "4c95a2f102571f765c509a89ac7a6ced5fede55b339eed9032f49bd627f75280"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200040cde1d4275e01f57e5a78968b6da29d704b12d7ee15ffdbf67edb53937f575504c95a2f102571f765c509a89ac7a6ced5fede55b339eed9032f49bd627f75280",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABAzeHUJ14B9X5aeJaLbaKdcEsS1+\n4V/9v2fttTk39XVQTJWi8QJXH3ZcUJqJrHps7V/t5Vsznu2QMvSb1if3UoA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 921,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202734eb40a83223e55a56bdd25adaa186476696d438be1c46a9a8c442bc7a8b3f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043795af819ed2bafdc708718f4f0b10c1362ae0210bd7c63c4f243ca7ce725e8927952b02af7554f50f4e0c71150b6a03c864479bfeca00a799a13212288c1c01",
+        "wx" : "3795af819ed2bafdc708718f4f0b10c1362ae0210bd7c63c4f243ca7ce725e89",
+        "wy" : "27952b02af7554f50f4e0c71150b6a03c864479bfeca00a799a13212288c1c01"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200043795af819ed2bafdc708718f4f0b10c1362ae0210bd7c63c4f243ca7ce725e8927952b02af7554f50f4e0c71150b6a03c864479bfeca00a799a13212288c1c01",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABDeVr4Ge0rr9xwhxj08LEME2KuAh\nC9fGPE8kPKfOcl6JJ5UrAq91VPUPTgxxFQtqA8hkR5v+ygCnmaEyEiiMHAE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 922,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0221009f5af50acc7c29e9a1df221ad37bacb5da3cdd447f515fa64b241ffd910eae3f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0459dcdf8fd82ad6aacf29c588ffdf9aeab54c89f6729cdc0c286d5c115bb5309071d4aec02802a39e801f793e87c96dfb7ff414adb24e609fd811835e5947bbb4",
+        "wx" : "59dcdf8fd82ad6aacf29c588ffdf9aeab54c89f6729cdc0c286d5c115bb53090",
+        "wy" : "71d4aec02802a39e801f793e87c96dfb7ff414adb24e609fd811835e5947bbb4"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101080342000459dcdf8fd82ad6aacf29c588ffdf9aeab54c89f6729cdc0c286d5c115bb5309071d4aec02802a39e801f793e87c96dfb7ff414adb24e609fd811835e5947bbb4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABFnc34/YKtaqzynFiP/fmuq1TIn2\ncpzcDChtXBFbtTCQcdSuwCgCo56AH3k+h8lt+3/0FK2yTmCf2BGDXllHu7Q=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 923,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0221009f262626689b3c3235e93e8da30543ddfbde2af812938a380f4440b645187da7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04133904e1f94786758e63ddf382bd25b59793ce16e81dc33f794e9581cde8da644a099fe3b67dace481cae93f0ae7ece905e5ff3b411c0a6a2db4e20a228fe61f",
+        "wx" : "133904e1f94786758e63ddf382bd25b59793ce16e81dc33f794e9581cde8da64",
+        "wy" : "4a099fe3b67dace481cae93f0ae7ece905e5ff3b411c0a6a2db4e20a228fe61f"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010803420004133904e1f94786758e63ddf382bd25b59793ce16e81dc33f794e9581cde8da644a099fe3b67dace481cae93f0ae7ece905e5ff3b411c0a6a2db4e20a228fe61f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABBM5BOH5R4Z1jmPd84K9JbWXk84W\n6B3DP3lOlYHN6NpkSgmf47Z9rOSByuk/Cufs6QXl/ztBHApqLbTiCiKP5h8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 924,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0221009450f4712f47cea82d6c728aa886fa4a6b82db4c6fc56d788e6a72e9f2e8a4a7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046d36cf5d643e4c77be28a30ef74d5016c5dfcba4f181467a0d8d419c28c0e9010f09dad5ab90679b3baf6cce79d8d87c07005a868133dcc898da81c2c760ae55",
+        "wx" : "6d36cf5d643e4c77be28a30ef74d5016c5dfcba4f181467a0d8d419c28c0e901",
+        "wy" : "0f09dad5ab90679b3baf6cce79d8d87c07005a868133dcc898da81c2c760ae55"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200046d36cf5d643e4c77be28a30ef74d5016c5dfcba4f181467a0d8d419c28c0e9010f09dad5ab90679b3baf6cce79d8d87c07005a868133dcc898da81c2c760ae55",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABG02z11kPkx3viijDvdNUBbF38uk\n8YFGeg2NQZwowOkBDwna1auQZ5s7r2zOedjYfAcAWoaBM9zImNqBwsdgrlU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 925,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02201f156d9a2bd05b6f7a2c27c80f9bb73f8d540acc23b13705d91483d681e34edf",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04346a4c284d5f5aab6577fa8eaab3f465bd8dc99f91c0fc327d0dcf9f330293c24acc9f6c82b403b78f97b31e5f5ebadee52429716a3bd484478497ae649d2e66",
+        "wx" : "346a4c284d5f5aab6577fa8eaab3f465bd8dc99f91c0fc327d0dcf9f330293c2",
+        "wy" : "4acc9f6c82b403b78f97b31e5f5ebadee52429716a3bd484478497ae649d2e66"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010803420004346a4c284d5f5aab6577fa8eaab3f465bd8dc99f91c0fc327d0dcf9f330293c24acc9f6c82b403b78f97b31e5f5ebadee52429716a3bd484478497ae649d2e66",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABDRqTChNX1qrZXf6jqqz9GW9jcmf\nkcD8Mn0Nz58zApPCSsyfbIK0A7ePl7MeX1663uUkKXFqO9SER4SXrmSdLmY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 926,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022033d58cc129940d5af53f5f8a6fd82d430e26df908bf649e8d1f5235cfd35de4a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046af61f84384de5591090cb3b6d8c592094f3702c2401eee392c920a43e927390a87f47a6d5db9e88ac2001e1843a3ce4c664bc33aedccef5f104f3d38501ca92",
+        "wx" : "6af61f84384de5591090cb3b6d8c592094f3702c2401eee392c920a43e927390",
+        "wy" : "0a87f47a6d5db9e88ac2001e1843a3ce4c664bc33aedccef5f104f3d38501ca92"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200046af61f84384de5591090cb3b6d8c592094f3702c2401eee392c920a43e927390a87f47a6d5db9e88ac2001e1843a3ce4c664bc33aedccef5f104f3d38501ca92",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABGr2H4Q4TeVZEJDLO22MWSCU83As\nJAHu45LJIKQ+knOQqH9HptXbnoisIAHhhDo85MZkvDOu3M718QTz04UBypI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 927,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02201ea9a1bf078a5e9b9c16ad03b139ada7747e8d07ef6b08a8cab1588ecc48f6d0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046c98913484d659ac8bb2d2dec96505eadca3b1d9703a71c558655b8a9f3513c66f905ec936941a5798720c32847c2166a91e875f66d1949b9bfc9b3a7217c80a",
+        "wx" : "6c98913484d659ac8bb2d2dec96505eadca3b1d9703a71c558655b8a9f3513c6",
+        "wy" : "6f905ec936941a5798720c32847c2166a91e875f66d1949b9bfc9b3a7217c80a"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200046c98913484d659ac8bb2d2dec96505eadca3b1d9703a71c558655b8a9f3513c66f905ec936941a5798720c32847c2166a91e875f66d1949b9bfc9b3a7217c80a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABGyYkTSE1lmsi7LS3sllBerco7HZ\ncDpxxVhlW4qfNRPGb5BeyTaUGleYcgwyhHwhZqkeh19m0ZSbm/ybOnIXyAo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 928,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02200dfe729e8b4f8de96a22038589d6847b2ebdd38be7208cfd300a04d6326d7239",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040c30a40dbad124c50fc8b4000a51545523384fdc0cdc267cf734f65fb55902fd4630e4eaed17c12345efc9c8b5de7fc04271bf65ede03ee3df4668a9619d935f",
+        "wx" : "0c30a40dbad124c50fc8b4000a51545523384fdc0cdc267cf734f65fb55902fd",
+        "wy" : "4630e4eaed17c12345efc9c8b5de7fc04271bf65ede03ee3df4668a9619d935f"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200040c30a40dbad124c50fc8b4000a51545523384fdc0cdc267cf734f65fb55902fd4630e4eaed17c12345efc9c8b5de7fc04271bf65ede03ee3df4668a9619d935f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABAwwpA260STFD8i0AApRVFUjOE/c\nDNwmfPc09l+1WQL9RjDk6u0XwSNF78nItd5/wEJxv2Xt4D7j30ZoqWGdk18=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 929,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022069fb57dba1eea9bc3e660a909d838d718c397aa3b561a6f7901e0e82974856a9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046ca3fc25839a95af403e37794bad8a08e0f87fceb7ac68468704284807f65601681f87c95a55f1e210fe96f2d89c330b45fa034006c5280ce5c1770f091138b6",
+        "wx" : "6ca3fc25839a95af403e37794bad8a08e0f87fceb7ac68468704284807f65601",
+        "wy" : "681f87c95a55f1e210fe96f2d89c330b45fa034006c5280ce5c1770f091138b6"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200046ca3fc25839a95af403e37794bad8a08e0f87fceb7ac68468704284807f65601681f87c95a55f1e210fe96f2d89c330b45fa034006c5280ce5c1770f091138b6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABGyj/CWDmpWvQD43eUutigjg+H/O\nt6xoRocEKEgH9lYBaB+HyVpV8eIQ/pby2JwzC0X6A0AGxSgM5cF3DwkROLY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 930,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02206898218e251066d0cc5e64317c2f177be9d008bbf70fe19f1ce36962a9e170f3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043b0d31e4ec39f194146e3fe9648bba4e6cd9d5ca5f8dd1304cdec0d396b254471c1b4633bf35e53fcfdd6ec8bd1d30e94d342809e19e651ea265b9b09b7240c1",
+        "wx" : "3b0d31e4ec39f194146e3fe9648bba4e6cd9d5ca5f8dd1304cdec0d396b25447",
+        "wy" : "1c1b4633bf35e53fcfdd6ec8bd1d30e94d342809e19e651ea265b9b09b7240c1"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200043b0d31e4ec39f194146e3fe9648bba4e6cd9d5ca5f8dd1304cdec0d396b254471c1b4633bf35e53fcfdd6ec8bd1d30e94d342809e19e651ea265b9b09b7240c1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABDsNMeTsOfGUFG4/6WSLuk5s2dXK\nX43RMEzewNOWslRHHBtGM7815T/P3W7IvR0w6U00KAnhnmUeomW5sJtyQME=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 931,
+          "comment" : "point duplication during verification",
+          "msg" : "54657374",
+          "sig" : "304402205b22974296c093fcc9930e14215bb19875a7d1efb2efe0154d4e6196ddb34d44022044088a0685df1955696286cc083d35afa8d2895927405b0731eadcd8a7233799",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043b0d31e4ec39f194146e3fe9648bba4e6cd9d5ca5f8dd1304cdec0d396b254478de011a7e2b8c47c6e889bc7e0665c892107ce19f387bb097dad8e6c83fc12b6",
+        "wx" : "3b0d31e4ec39f194146e3fe9648bba4e6cd9d5ca5f8dd1304cdec0d396b25447",
+        "wy" : "08de011a7e2b8c47c6e889bc7e0665c892107ce19f387bb097dad8e6c83fc12b6"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200043b0d31e4ec39f194146e3fe9648bba4e6cd9d5ca5f8dd1304cdec0d396b254478de011a7e2b8c47c6e889bc7e0665c892107ce19f387bb097dad8e6c83fc12b6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABDsNMeTsOfGUFG4/6WSLuk5s2dXK\nX43RMEzewNOWslRHjeARp+K4xHxuiJvH4GZciSEHzhnzh7sJfa2ObIP8ErY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 932,
+          "comment" : "duplication bug",
+          "msg" : "54657374",
+          "sig" : "304402205b22974296c093fcc9930e14215bb19875a7d1efb2efe0154d4e6196ddb34d44022044088a0685df1955696286cc083d35afa8d2895927405b0731eadcd8a7233799",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0452987319644a827a6d82083352487688f33e2095faeacbc83ec9c4e53e0338f115b7ed0718c3b21da8ae42a0b3735eb4fc7fdadbec883f3545698bd3305c0843",
+        "wx" : "52987319644a827a6d82083352487688f33e2095faeacbc83ec9c4e53e0338f1",
+        "wy" : "15b7ed0718c3b21da8ae42a0b3735eb4fc7fdadbec883f3545698bd3305c0843"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101080342000452987319644a827a6d82083352487688f33e2095faeacbc83ec9c4e53e0338f115b7ed0718c3b21da8ae42a0b3735eb4fc7fdadbec883f3545698bd3305c0843",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABFKYcxlkSoJ6bYIIM1JIdojzPiCV\n+urLyD7JxOU+AzjxFbftBxjDsh2orkKgs3NetPx/2tvsiD81RWmL0zBcCEM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 933,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "54657374",
+          "sig" : "3044022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2022021ff1192539621f272e135501f80b5e38271e553f11387cb1cd2cfb3b7db4487",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041d30cc1c88b587fe248d14ae8391e2204517611dacd43eea92795327d3e177487f90837130c328b9396d81061094e9741d07578ad937e12b45551463866c8367",
+        "wx" : "1d30cc1c88b587fe248d14ae8391e2204517611dacd43eea92795327d3e17748",
+        "wy" : "7f90837130c328b9396d81061094e9741d07578ad937e12b45551463866c8367"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200041d30cc1c88b587fe248d14ae8391e2204517611dacd43eea92795327d3e177487f90837130c328b9396d81061094e9741d07578ad937e12b45551463866c8367",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABB0wzByItYf+JI0UroOR4iBFF2Ed\nrNQ+6pJ5UyfT4XdIf5CDcTDDKLk5bYEGEJTpdB0HV4rZN+ErRVUUY4Zsg2c=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 934,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "54657374",
+          "sig" : "30450221008338427c7cf4d11cb981d9b18793e3779c494c502c75bd739e578de2a700578d022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04122f70e98579bab33d717664868d56d5b00683b5d532091eed7f56c9b9bee5cf2269ae98c2c40ccdaf447851e36bd4d6c5d46f57d7ecd8a4cc415514e481bf11",
+        "wx" : "122f70e98579bab33d717664868d56d5b00683b5d532091eed7f56c9b9bee5cf",
+        "wy" : "2269ae98c2c40ccdaf447851e36bd4d6c5d46f57d7ecd8a4cc415514e481bf11"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010803420004122f70e98579bab33d717664868d56d5b00683b5d532091eed7f56c9b9bee5cf2269ae98c2c40ccdaf447851e36bd4d6c5d46f57d7ecd8a4cc415514e481bf11",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABBIvcOmFebqzPXF2ZIaNVtWwBoO1\n1TIJHu1/Vsm5vuXPImmumMLEDM2vRHhR42vU1sXUb1fX7NikzEFVFOSBvxE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 935,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "30450221008338427c7cf4d11cb981d9b18793e3779c494c502c75bd739e578de2a700578d0220796a6353bccf0b8675b699d502cbae2c88bb5799818ee4f9f93a0a5d477cd02e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04904c3d1a939ac75edbe7c66cbcb751f7ab369b684930eaaa3c54420367ab009a7e9b8347ee4db666e78be870a732c6f471c20b2cbf61cce59d81475e4a3e6a0f",
+        "wx" : "0904c3d1a939ac75edbe7c66cbcb751f7ab369b684930eaaa3c54420367ab009a",
+        "wy" : "7e9b8347ee4db666e78be870a732c6f471c20b2cbf61cce59d81475e4a3e6a0f"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010803420004904c3d1a939ac75edbe7c66cbcb751f7ab369b684930eaaa3c54420367ab009a7e9b8347ee4db666e78be870a732c6f471c20b2cbf61cce59d81475e4a3e6a0f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABJBMPRqTmsde2+fGbLy3UferNpto\nSTDqqjxUQgNnqwCafpuDR+5Ntmbni+hwpzLG9HHCCyy/YczlnYFHXko+ag8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 936,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "30460221008338427c7cf4d11cb981d9b18793e3779c494c502c75bd739e578de2a700578d02210087fc46494e5887c9cb84d5407e02d78e09c7954fc44e1f2c734b3ecedf6d121f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043f9e34f512b8588b6b2c4384fcbb395979e6142ec13d8af937c725185d1329b254eba9f00758e1642c694a1958b4f79b1de97595f492d7eeb970824f326d914e",
+        "wx" : "3f9e34f512b8588b6b2c4384fcbb395979e6142ec13d8af937c725185d1329b2",
+        "wy" : "54eba9f00758e1642c694a1958b4f79b1de97595f492d7eeb970824f326d914e"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200043f9e34f512b8588b6b2c4384fcbb395979e6142ec13d8af937c725185d1329b254eba9f00758e1642c694a1958b4f79b1de97595f492d7eeb970824f326d914e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABD+eNPUSuFiLayxDhPy7OVl55hQu\nwT2K+TfHJRhdEymyVOup8AdY4WQsaUoZWLT3mx3pdZX0ktfuuXCCTzJtkU4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 937,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "30450221008338427c7cf4d11cb981d9b18793e3779c494c502c75bd739e578de2a700578d022021ff1192539621f272e135501f80b5e38271e553f11387cb1cd2cfb3b7db4488",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044424f09e4f869231e47b1e3426ec269e5bef19ec64cc96da5b2efdd2116b83f07a863d25743bb260a638de649796c676e13805865c8bb9dac38e16fae54b0cef",
+        "wx" : "4424f09e4f869231e47b1e3426ec269e5bef19ec64cc96da5b2efdd2116b83f0",
+        "wy" : "7a863d25743bb260a638de649796c676e13805865c8bb9dac38e16fae54b0cef"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200044424f09e4f869231e47b1e3426ec269e5bef19ec64cc96da5b2efdd2116b83f07a863d25743bb260a638de649796c676e13805865c8bb9dac38e16fae54b0cef",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABEQk8J5PhpIx5HseNCbsJp5b7xns\nZMyW2lsu/dIRa4PweoY9JXQ7smCmON5kl5bGduE4BYZci7naw44W+uVLDO8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 938,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "30450221008338427c7cf4d11cb981d9b18793e3779c494c502c75bd739e578de2a700578d02203090f487e51f9e35c8af70bb9ab7df45037e230a33d2c1fd96e404254fcb8679",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04395d3e0debc6f3f5c33cdd6b5d0b4e457cfd94a7c29b05a490ff4e0397d73dca49268faa790b51955b297aa06fbb7c6f92b9d588d04325415f08d1fbe97c7c09",
+        "wx" : "395d3e0debc6f3f5c33cdd6b5d0b4e457cfd94a7c29b05a490ff4e0397d73dca",
+        "wy" : "49268faa790b51955b297aa06fbb7c6f92b9d588d04325415f08d1fbe97c7c09"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010803420004395d3e0debc6f3f5c33cdd6b5d0b4e457cfd94a7c29b05a490ff4e0397d73dca49268faa790b51955b297aa06fbb7c6f92b9d588d04325415f08d1fbe97c7c09",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABDldPg3rxvP1wzzda10LTkV8/ZSn\nwpsFpJD/TgOX1z3KSSaPqnkLUZVbKXqgb7t8b5K51YjQQyVBXwjR++l8fAk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 939,
+          "comment" : "extreme value for k",
+          "msg" : "54657374",
+          "sig" : "30450221008338427c7cf4d11cb981d9b18793e3779c494c502c75bd739e578de2a700578d022077472d9a28b4ece71cf413a68eac0eb423a16fb462b1f48706fed48ca437bd2d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042d373920bf3f9957e92d328be30b9c3ef5da0def50544577194d167ff55e55fd51d21be506e0aa233fad3869d197e4474d2a9039850c229ab772e510c06b20d5",
+        "wx" : "2d373920bf3f9957e92d328be30b9c3ef5da0def50544577194d167ff55e55fd",
+        "wy" : "51d21be506e0aa233fad3869d197e4474d2a9039850c229ab772e510c06b20d5"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200042d373920bf3f9957e92d328be30b9c3ef5da0def50544577194d167ff55e55fd51d21be506e0aa233fad3869d197e4474d2a9039850c229ab772e510c06b20d5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABC03OSC/P5lX6S0yi+MLnD712g3v\nUFRFdxlNFn/1XlX9UdIb5QbgqiM/rThp0ZfkR00qkDmFDCKat3LlEMBrINU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 940,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "54657374",
+          "sig" : "3045022100a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f4022038a91d4935fa389414ccae3034812f25d9687e3691cb37a7dab4af80dd181ce2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048f99ece4442ea6ec2b4e412c6167f847a3ec781998148cd58255c9ea34d379b4080a032469e7bcc64f0c387b36525239090604c115fe89bae2e462ccc26c417b",
+        "wx" : "08f99ece4442ea6ec2b4e412c6167f847a3ec781998148cd58255c9ea34d379b4",
+        "wy" : "080a032469e7bcc64f0c387b36525239090604c115fe89bae2e462ccc26c417b"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200048f99ece4442ea6ec2b4e412c6167f847a3ec781998148cd58255c9ea34d379b4080a032469e7bcc64f0c387b36525239090604c115fe89bae2e462ccc26c417b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABI+Z7ORELqbsK05BLGFn+Eej7HgZ\nmBSM1YJVyeo003m0CAoDJGnnvMZPDDh7NlJSOQkGBMEV/om64uRizMJsQXs=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 941,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "3045022100a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f40220796a6353bccf0b8675b699d502cbae2c88bb5799818ee4f9f93a0a5d477cd02e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0406bd17d0d354ecd7e8c7ecc9020b1a781743b2462671d19ecf7ee69137d23e2609c5f605d0cf1b8ce96b4d1b7039599dd4e6726fd27b34aecc9fc07d90ad7ff8",
+        "wx" : "6bd17d0d354ecd7e8c7ecc9020b1a781743b2462671d19ecf7ee69137d23e26",
+        "wy" : "09c5f605d0cf1b8ce96b4d1b7039599dd4e6726fd27b34aecc9fc07d90ad7ff8"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101080342000406bd17d0d354ecd7e8c7ecc9020b1a781743b2462671d19ecf7ee69137d23e2609c5f605d0cf1b8ce96b4d1b7039599dd4e6726fd27b34aecc9fc07d90ad7ff8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABAa9F9DTVOzX6MfsyQILGngXQ7JG\nJnHRns9+5pE30j4mCcX2BdDPG4zpa00bcDlZndTmcm/SezSuzJ/AfZCtf/g=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 942,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "3046022100a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f402210087fc46494e5887c9cb84d5407e02d78e09c7954fc44e1f2c734b3ecedf6d121f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045f894cbb72549ded11d41abcc30bd0634ea4508ad11b323a74a31a95be5b7c99996d7de228ad0c2309be12a33a86c170870f4a93b8f6ce4c2f347b9ecc715bbb",
+        "wx" : "5f894cbb72549ded11d41abcc30bd0634ea4508ad11b323a74a31a95be5b7c99",
+        "wy" : "0996d7de228ad0c2309be12a33a86c170870f4a93b8f6ce4c2f347b9ecc715bbb"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200045f894cbb72549ded11d41abcc30bd0634ea4508ad11b323a74a31a95be5b7c99996d7de228ad0c2309be12a33a86c170870f4a93b8f6ce4c2f347b9ecc715bbb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABF+JTLtyVJ3tEdQavMML0GNOpFCK\n0RsyOnSjGpW+W3yZmW194iitDCMJvhKjOobBcIcPSpO49s5MLzR7nsxxW7s=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 943,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "3045022100a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f4022021ff1192539621f272e135501f80b5e38271e553f11387cb1cd2cfb3b7db4488",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0478e1d4be5068250d2cb266397e727c066e5f2f747a8666cd8af070d5b9ed6a4168a546bec874dfaa1300421e2ce7646b6dfd8e7e5ac5a82129d759ffe4aeefff",
+        "wx" : "78e1d4be5068250d2cb266397e727c066e5f2f747a8666cd8af070d5b9ed6a41",
+        "wy" : "68a546bec874dfaa1300421e2ce7646b6dfd8e7e5ac5a82129d759ffe4aeefff"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101080342000478e1d4be5068250d2cb266397e727c066e5f2f747a8666cd8af070d5b9ed6a4168a546bec874dfaa1300421e2ce7646b6dfd8e7e5ac5a82129d759ffe4aeefff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABHjh1L5QaCUNLLJmOX5yfAZuXy90\neoZmzYrwcNW57WpBaKVGvsh036oTAEIeLOdka239jn5axaghKddZ/+Su7/8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 944,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "3045022100a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f402203090f487e51f9e35c8af70bb9ab7df45037e230a33d2c1fd96e404254fcb8679",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048eea4918015d5d0bf2d8bc047a1b2ced1da6889ee4dfa58461a351ce36bff8f8197ede0e92b1001f0fd82cf66f96f51471d48a6dfff52aec62a9e1a361cd7d49",
+        "wx" : "08eea4918015d5d0bf2d8bc047a1b2ced1da6889ee4dfa58461a351ce36bff8f8",
+        "wy" : "197ede0e92b1001f0fd82cf66f96f51471d48a6dfff52aec62a9e1a361cd7d49"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200048eea4918015d5d0bf2d8bc047a1b2ced1da6889ee4dfa58461a351ce36bff8f8197ede0e92b1001f0fd82cf66f96f51471d48a6dfff52aec62a9e1a361cd7d49",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABI7qSRgBXV0L8ti8BHobLO0dpoie\n5N+lhGGjUc42v/j4GX7eDpKxAB8P2Cz2b5b1FHHUim3/9SrsYqnho2HNfUk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 945,
+          "comment" : "extreme value for k",
+          "msg" : "54657374",
+          "sig" : "3045022100a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f4022077472d9a28b4ece71cf413a68eac0eb423a16fb462b1f48706fed48ca437bd2d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f42d996c823439c56d7f7b22e14644417e69bcb6de39d027001dabe8f35b25c9be",
+        "wx" : "0a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f4",
+        "wy" : "2d996c823439c56d7f7b22e14644417e69bcb6de39d027001dabe8f35b25c9be"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010803420004a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f42d996c823439c56d7f7b22e14644417e69bcb6de39d027001dabe8f35b25c9be",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABKPo6zzBz+e3cyITsjplYUmvoULE\neq+8K3mhkVYuEwX0LZlsgjQ5xW1/eyLhRkRBfmm8tt450CcAHavo81slyb4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 946,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "30440220532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25022018487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 947,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "3044022056ccad1e0c7a21ae7eef50d7d1830a456b928e9277f9845e3b1094148813f882022018487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f47c61eb596db4e44ebeeae7af573f4bf4047f3f459b55f92802675f29c44889b9",
+        "wx" : "0a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f4",
+        "wy" : "7c61eb596db4e44ebeeae7af573f4bf4047f3f459b55f92802675f29c44889b9"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010803420004a3e8eb3cc1cfe7b7732213b23a656149afa142c47aafbc2b79a191562e1305f47c61eb596db4e44ebeeae7af573f4bf4047f3f459b55f92802675f29c44889b9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABKPo6zzBz+e3cyITsjplYUmvoULE\neq+8K3mhkVYuEwX0fGHrWW205E6+6uevVz9L9AR/P0WbVfkoAmdfKcRIibk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 948,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "30440220532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25022018487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 949,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "3044022056ccad1e0c7a21ae7eef50d7d1830a456b928e9277f9845e3b1094148813f882022018487a43f28fcf1ae457b85dcd5befa281bf118519e960fecb720212a7e5c33c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b21ecd48cc46fb306ed54e88adb615208457bd257e7e9d81db5bd1f56100a7aebb1386465507bbf386224cb383815e1babe561dcb6f49af0073e1bfda366066ef62440fc81dec7eca021cb0c05091dfb",
+        "wx" : "0b21ecd48cc46fb306ed54e88adb615208457bd257e7e9d81db5bd1f56100a7aebb1386465507bbf3",
+        "wy" : "086224cb383815e1babe561dcb6f49af0073e1bfda366066ef62440fc81dec7eca021cb0c05091dfb"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004b21ecd48cc46fb306ed54e88adb615208457bd257e7e9d81db5bd1f56100a7aebb1386465507bbf386224cb383815e1babe561dcb6f49af0073e1bfda366066ef62440fc81dec7eca021cb0c05091dfb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABLIezUjMRvswbtVOiK22FSCEV70l\nfn6dgdtb0fVhAKeuuxOGRlUHu/OGIkyzg4FeG6vlYdy29JrwBz4b/aNmBm72JED8\ngd7H7KAhywwFCR37\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 950,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "313233343030",
+          "sig" : "30420215014064fb4c224a8b248a0d933f7642bd56aced9b12022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 951,
+          "comment" : "r too large",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa6f6f40def4f92b9ec7893ec28fcd412b1f1b32e23022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930e",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049c9701de2ffdb296e6d56a5f3c189ecbb0e4448e38ed65da46eeaa51a7b34e650a91da95faf179001e0a98a598523a34c4918d4180f87d641e4626ce11fa3a244abfb2450736693d38652309240ebda9",
+        "wx" : "09c9701de2ffdb296e6d56a5f3c189ecbb0e4448e38ed65da46eeaa51a7b34e650a91da95faf17900",
+        "wy" : "1e0a98a598523a34c4918d4180f87d641e4626ce11fa3a244abfb2450736693d38652309240ebda9"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200049c9701de2ffdb296e6d56a5f3c189ecbb0e4448e38ed65da46eeaa51a7b34e650a91da95faf179001e0a98a598523a34c4918d4180f87d641e4626ce11fa3a244abfb2450736693d38652309240ebda9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABJyXAd4v/bKW5tVqXzwYnsuw5ESO\nOO1l2kbuqlGns05lCpHalfrxeQAeCpilmFI6NMSRjUGA+H1kHkYmzhH6OiRKv7JF\nBzZpPThlIwkkDr2p\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 952,
+          "comment" : "r,s are large",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930f022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c5930e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b6f0ddc834ef8a67903681ea02b788fcff82d12307c8c3f4a44b30d7c5f614dafcc9a839991f8ee427538e30ae5102b2043957dd6124fba3a1b601c04bddaf6c929ffdf2f7796fd7098c387dbc0b26fb",
+        "wx" : "0b6f0ddc834ef8a67903681ea02b788fcff82d12307c8c3f4a44b30d7c5f614dafcc9a839991f8ee4",
+        "wy" : "27538e30ae5102b2043957dd6124fba3a1b601c04bddaf6c929ffdf2f7796fd7098c387dbc0b26fb"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004b6f0ddc834ef8a67903681ea02b788fcff82d12307c8c3f4a44b30d7c5f614dafcc9a839991f8ee427538e30ae5102b2043957dd6124fba3a1b601c04bddaf6c929ffdf2f7796fd7098c387dbc0b26fb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABLbw3cg074pnkDaB6gK3iPz/gtEj\nB8jD9KRLMNfF9hTa/MmoOZkfjuQnU44wrlECsgQ5V91hJPujobYBwEvdr2ySn/3y\n93lv1wmMOH28Cyb7\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 953,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "305502287fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0229008c0736554dbc446063e8e15f297fd4b66fa8879945bbb5c22714a9645f4fa4ef9d710eafa6b226d8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046df44321d4a5f6af63e01b79bb608ea04ac6f35f795044a04ff400f547fd34d9b78c12c45978f96fb52901cece48aab432c3dbdcbc0e270b2cc9b9915cc1ffb69a365d84c39186c48177387aa9ee0a48",
+        "wx" : "6df44321d4a5f6af63e01b79bb608ea04ac6f35f795044a04ff400f547fd34d9b78c12c45978f96f",
+        "wy" : "0b52901cece48aab432c3dbdcbc0e270b2cc9b9915cc1ffb69a365d84c39186c48177387aa9ee0a48"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200046df44321d4a5f6af63e01b79bb608ea04ac6f35f795044a04ff400f547fd34d9b78c12c45978f96fb52901cece48aab432c3dbdcbc0e270b2cc9b9915cc1ffb69a365d84c39186c48177387aa9ee0a48",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABG30QyHUpfavY+AbebtgjqBKxvNf\neVBEoE/0APVH/TTZt4wSxFl4+W+1KQHOzkiqtDLD29y8DicLLMm5kVzB/7aaNl2E\nw5GGxIF3OHqp7gpI\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 954,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "305402287fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02285407cdd593acb501fc2848351f9d2e6b5457d3de43c3130e3b74e6a9242b3cce1c24f094f118bcd6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044e496f056ab5d07f96562c683643440e31fea26d35e6c5b69eefaa4107d345c807bf279f2ea26b60288539766fc726cb9e841db5dcfbbb792cade3c1ef64b69dcbda7f5e497b455a911ce2f0ebcacaad",
+        "wx" : "4e496f056ab5d07f96562c683643440e31fea26d35e6c5b69eefaa4107d345c807bf279f2ea26b60",
+        "wy" : "288539766fc726cb9e841db5dcfbbb792cade3c1ef64b69dcbda7f5e497b455a911ce2f0ebcacaad"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200044e496f056ab5d07f96562c683643440e31fea26d35e6c5b69eefaa4107d345c807bf279f2ea26b60288539766fc726cb9e841db5dcfbbb792cade3c1ef64b69dcbda7f5e497b455a911ce2f0ebcacaad",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABE5JbwVqtdB/llYsaDZDRA4x/qJt\nNebFtp7vqkEH00XIB78nny6ia2AohTl2b8cmy56EHbXc+7t5LK3jwe9ktp3L2n9e\nSXtFWpEc4vDrysqt\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 955,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0411e094f470948e4eaa6aa13fab4e063386e91a638fa226d988d0693dea719ca95f61e493e9835af43f533e89aa2085a9f8121086a2597f1060f73c8d75d66940e50eead73dfd03c476ea1947cdd4dd3f",
+        "wx" : "11e094f470948e4eaa6aa13fab4e063386e91a638fa226d988d0693dea719ca95f61e493e9835af4",
+        "wy" : "3f533e89aa2085a9f8121086a2597f1060f73c8d75d66940e50eead73dfd03c476ea1947cdd4dd3f"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000411e094f470948e4eaa6aa13fab4e063386e91a638fa226d988d0693dea719ca95f61e493e9835af43f533e89aa2085a9f8121086a2597f1060f73c8d75d66940e50eead73dfd03c476ea1947cdd4dd3f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABBHglPRwlI5OqmqhP6tOBjOG6Rpj\nj6Im2YjQaT3qcZypX2Hkk+mDWvQ/Uz6JqiCFqfgSEIaiWX8QYPc8jXXWaUDlDurX\nPf0DxHbqGUfN1N0/\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 956,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020102",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0416517a7d7beab6472ea8f6bc20412a3cd96d242c246ce9f983b2ef08b284cfad1ac28563b56edafb9f56fe2df78c239aa16c3c318bc9191a16ec407a700354173f8b862d9a0aa10d67397f26e7c9c0be",
+        "wx" : "16517a7d7beab6472ea8f6bc20412a3cd96d242c246ce9f983b2ef08b284cfad1ac28563b56edafb",
+        "wy" : "09f56fe2df78c239aa16c3c318bc9191a16ec407a700354173f8b862d9a0aa10d67397f26e7c9c0be"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000416517a7d7beab6472ea8f6bc20412a3cd96d242c246ce9f983b2ef08b284cfad1ac28563b56edafb9f56fe2df78c239aa16c3c318bc9191a16ec407a700354173f8b862d9a0aa10d67397f26e7c9c0be",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABBZRen176rZHLqj2vCBBKjzZbSQs\nJGzp+YOy7wiyhM+tGsKFY7Vu2vufVv4t94wjmqFsPDGLyRkaFuxAenADVBc/i4Yt\nmgqhDWc5fybnycC+\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 957,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020103",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 958,
+          "comment" : "r is larger than n",
+          "msg" : "313233343030",
+          "sig" : "302e022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59312020103",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043a2668bc09614d2638ed58f1c421bb61f2d499a86fe7d573bd1392acef9e296b1ef2b10d7f4ec524d1b78eb2716ce668054d29677c6f4d3235f27d3a9295ecef9ddfd2f658ba002052d0e1e671721e2e",
+        "wx" : "3a2668bc09614d2638ed58f1c421bb61f2d499a86fe7d573bd1392acef9e296b1ef2b10d7f4ec524",
+        "wy" : "0d1b78eb2716ce668054d29677c6f4d3235f27d3a9295ecef9ddfd2f658ba002052d0e1e671721e2e"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200043a2668bc09614d2638ed58f1c421bb61f2d499a86fe7d573bd1392acef9e296b1ef2b10d7f4ec524d1b78eb2716ce668054d29677c6f4d3235f27d3a9295ecef9ddfd2f658ba002052d0e1e671721e2e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABDomaLwJYU0mOO1Y8cQhu2Hy1Jmo\nb+fVc70TkqzvnilrHvKxDX9OxSTRt46ycWzmaAVNKWd8b00yNfJ9OpKV7O+d39L2\nWLoAIFLQ4eZxch4u\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 959,
+          "comment" : "s is larger than n",
+          "msg" : "313233343030",
+          "sig" : "302e020101022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44d86998",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cd1697c6e107f3d90b8df462eb368b75eba585635950177e0a64b1ad4be527c90957fbdf203d67c84b003f20e81659099b7e466618f2610c6f1df315b2011db07b90f3662b51561fffdf3ebb5d443440",
+        "wx" : "0cd1697c6e107f3d90b8df462eb368b75eba585635950177e0a64b1ad4be527c90957fbdf203d67c8",
+        "wy" : "4b003f20e81659099b7e466618f2610c6f1df315b2011db07b90f3662b51561fffdf3ebb5d443440"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004cd1697c6e107f3d90b8df462eb368b75eba585635950177e0a64b1ad4be527c90957fbdf203d67c84b003f20e81659099b7e466618f2610c6f1df315b2011db07b90f3662b51561fffdf3ebb5d443440",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABM0Wl8bhB/PZC430Yus2i3XrpYVj\nWVAXfgpksa1L5SfJCVf73yA9Z8hLAD8g6BZZCZt+RmYY8mEMbx3zFbIBHbB7kPNm\nK1FWH//fPrtdRDRA\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 960,
+          "comment" : "small r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302e02020100022821494db879806d4f59e53d4963977a03f6ec51140c9f9a1dba8857ff3bbc76d2214947e60edc982b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b1e3619d9e35873e959bb7de7740e927e3cb7fcf4413bfdbbed72ecc9a86a50d7029cae08ec285ab486b5d2f7c9b9314420bc864cfe29b4064bf7b922bbb5bbcd16f3a81ea7d0a61b0a09a62959b7690",
+        "wx" : "0b1e3619d9e35873e959bb7de7740e927e3cb7fcf4413bfdbbed72ecc9a86a50d7029cae08ec285ab",
+        "wy" : "486b5d2f7c9b9314420bc864cfe29b4064bf7b922bbb5bbcd16f3a81ea7d0a61b0a09a62959b7690"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004b1e3619d9e35873e959bb7de7740e927e3cb7fcf4413bfdbbed72ecc9a86a50d7029cae08ec285ab486b5d2f7c9b9314420bc864cfe29b4064bf7b922bbb5bbcd16f3a81ea7d0a61b0a09a62959b7690",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABLHjYZ2eNYc+lZu33ndA6Sfjy3/P\nRBO/277XLsyahqUNcCnK4I7ChatIa10vfJuTFEILyGTP4ptAZL97kiu7W7zRbzqB\n6n0KYbCgmmKVm3aQ\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 961,
+          "comment" : "smallish r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303302072d9b4d347952cc022843becc876a63564b458280199e382cbad8ef68d406665bbf307ffea45845a9ac69345a84a5a72b87",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0497cfebab588a54242a4d962ef803376c3f43079aa50a8871d6e776f7a0b33aea46ab9a2da63a33d8c81af34af2e9a0c571effb501c4a27fd2aedc13623447af2bc8b6d5e7208c23e87e2d797cc3cf57e",
+        "wx" : "097cfebab588a54242a4d962ef803376c3f43079aa50a8871d6e776f7a0b33aea46ab9a2da63a33d8",
+        "wy" : "0c81af34af2e9a0c571effb501c4a27fd2aedc13623447af2bc8b6d5e7208c23e87e2d797cc3cf57e"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000497cfebab588a54242a4d962ef803376c3f43079aa50a8871d6e776f7a0b33aea46ab9a2da63a33d8c81af34af2e9a0c571effb501c4a27fd2aedc13623447af2bc8b6d5e7208c23e87e2d797cc3cf57e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABJfP66tYilQkKk2WLvgDN2w/Qwea\npQqIcdbndvegszrqRquaLaY6M9jIGvNK8umgxXHv+1AcSif9Ku3BNiNEevK8i21e\ncgjCPofi15fMPPV+\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 962,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "313233343030",
+          "sig" : "3039020d1033e67e37b32b445580bf4efc02283992353d916617b49303856488e39fbc26173b8bc426f8207de3d8f1b97f3d12c803b99d57768fa7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04296e0067947efc07a06ae218fb00164d1ebebcd3787f793481407e2796248e8b65eac57db0c14606729e8094b9a54eeac23d98d51d662eff2df33a8693008fd02a0429ef6851ecbdcd93aac67c2fbdb6",
+        "wx" : "296e0067947efc07a06ae218fb00164d1ebebcd3787f793481407e2796248e8b65eac57db0c14606",
+        "wy" : "729e8094b9a54eeac23d98d51d662eff2df33a8693008fd02a0429ef6851ecbdcd93aac67c2fbdb6"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004296e0067947efc07a06ae218fb00164d1ebebcd3787f793481407e2796248e8b65eac57db0c14606729e8094b9a54eeac23d98d51d662eff2df33a8693008fd02a0429ef6851ecbdcd93aac67c2fbdb6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABCluAGeUfvwHoGriGPsAFk0evrzT\neH95NIFAfieWJI6LZerFfbDBRgZynoCUuaVO6sI9mNUdZi7/LfM6hpMAj9AqBCnv\naFHsvc2TqsZ8L722\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 963,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "313233343030",
+          "sig" : "302f0202010002290084380881b243236967227191398a3a4909000425576c79465bdaaa0a03267b9e48f68fa0a68b29e3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a3783b01455d92080f520d171f92abeaf48c7238e168b2931f2b322f9c0faa69a24097836cb0a6851cbf1a22bac2437551244605682dabcdd4cf39ff9d08443921c99448cbcea5deb85ad952dbb2b967",
+        "wx" : "0a3783b01455d92080f520d171f92abeaf48c7238e168b2931f2b322f9c0faa69a24097836cb0a685",
+        "wy" : "1cbf1a22bac2437551244605682dabcdd4cf39ff9d08443921c99448cbcea5deb85ad952dbb2b967"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004a3783b01455d92080f520d171f92abeaf48c7238e168b2931f2b322f9c0faa69a24097836cb0a6851cbf1a22bac2437551244605682dabcdd4cf39ff9d08443921c99448cbcea5deb85ad952dbb2b967",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABKN4OwFFXZIID1INFx+Sq+r0jHI4\n4Wiykx8rMi+cD6ppokCXg2ywpoUcvxoiusJDdVEkRgVoLavN1M85/50IRDkhyZRI\ny86l3rha2VLbsrln\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 964,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303a020d062522bbd3ecbe7c39e93e7c2402290084380881b243236967227191398a3a4909000425576c79465bdaaa0a03267b9e48f68fa0a68b29e3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0470d5fd41c416d5b7cdbcb944205bd69ff00ed6354aa502757e089cb19af6f777beb0f6921c0fafac22ae7cc65e0e7b617423750b8493a58512e379c00de626c17f7c82bfc907f26610a3f1e4d132c575",
+        "wx" : "70d5fd41c416d5b7cdbcb944205bd69ff00ed6354aa502757e089cb19af6f777beb0f6921c0fafac",
+        "wy" : "22ae7cc65e0e7b617423750b8493a58512e379c00de626c17f7c82bfc907f26610a3f1e4d132c575"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000470d5fd41c416d5b7cdbcb944205bd69ff00ed6354aa502757e089cb19af6f777beb0f6921c0fafac22ae7cc65e0e7b617423750b8493a58512e379c00de626c17f7c82bfc907f26610a3f1e4d132c575",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABHDV/UHEFtW3zby5RCBb1p/wDtY1\nSqUCdX4InLGa9vd3vrD2khwPr6wirnzGXg57YXQjdQuEk6WFEuN5wA3mJsF/fIK/\nyQfyZhCj8eTRMsV1\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 965,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "313233343030",
+          "sig" : "3056022900d35e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c592940229008ce984c0247d8a7a9628503f36abeaeea65fdfc3cf0a0c6cc8dac9da9f043b4659b638e7832e620b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0406828ce63f3b0d694ce2999d06947fa9e2d1c18ab8032652fa7a98c678cf6bb2c52e7369085e4ef7c56df69128962fbefc2aef1b3f6c467b72fc305acf51b339643ca2ed6bde56317c4cf59895923ded",
+        "wx" : "6828ce63f3b0d694ce2999d06947fa9e2d1c18ab8032652fa7a98c678cf6bb2c52e7369085e4ef7",
+        "wy" : "0c56df69128962fbefc2aef1b3f6c467b72fc305acf51b339643ca2ed6bde56317c4cf59895923ded"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000406828ce63f3b0d694ce2999d06947fa9e2d1c18ab8032652fa7a98c678cf6bb2c52e7369085e4ef7c56df69128962fbefc2aef1b3f6c467b72fc305acf51b339643ca2ed6bde56317c4cf59895923ded",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABAaCjOY/Ow1pTOKZnQaUf6ni0cGK\nuAMmUvp6mMZ4z2uyxS5zaQheTvfFbfaRKJYvvvwq7xs/bEZ7cvwwWs9RszlkPKLt\na95WMXxM9ZiVkj3t\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 966,
+          "comment" : "s == 1",
+          "msg" : "313233343030",
+          "sig" : "302d02284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 967,
+          "comment" : "s == 0",
+          "msg" : "313233343030",
+          "sig" : "302d02284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04202516ad663775f12155521079037f3fca50c64faa4afd886add4daab927f3f62aa2dae684a635d6632aedd530e61dab35916962ee8f23ed688198afd5ad6b0705e2ef9d0ba3c5333b15bdab432ee342",
+        "wx" : "202516ad663775f12155521079037f3fca50c64faa4afd886add4daab927f3f62aa2dae684a635d6",
+        "wy" : "632aedd530e61dab35916962ee8f23ed688198afd5ad6b0705e2ef9d0ba3c5333b15bdab432ee342"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004202516ad663775f12155521079037f3fca50c64faa4afd886add4daab927f3f62aa2dae684a635d6632aedd530e61dab35916962ee8f23ed688198afd5ad6b0705e2ef9d0ba3c5333b15bdab432ee342",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABCAlFq1mN3XxIVVSEHkDfz/KUMZP\nqkr9iGrdTaq5J/P2KqLa5oSmNdZjKu3VMOYdqzWRaWLujyPtaIGYr9WtawcF4u+d\nC6PFMzsVvatDLuNC\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 968,
+          "comment" : "point at infinity during verify",
+          "msg" : "313233343030",
+          "sig" : "3054022869af23901b5e27dbf09e3c2f6900f032fcc7e7d2db47895196a41763f7432c74c348aaada262c98802284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046b4327117e9c04d7a58259c5207a36e8d278e873b92b5b3a70a3c4742cc583b41408aaab23a12a9c9b0b26160c548abacd7f0e37276f917c09721b3844d0b26e9ed5c76c99787992259bf0f7b02445d3",
+        "wx" : "6b4327117e9c04d7a58259c5207a36e8d278e873b92b5b3a70a3c4742cc583b41408aaab23a12a9c",
+        "wy" : "09b0b26160c548abacd7f0e37276f917c09721b3844d0b26e9ed5c76c99787992259bf0f7b02445d3"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200046b4327117e9c04d7a58259c5207a36e8d278e873b92b5b3a70a3c4742cc583b41408aaab23a12a9c9b0b26160c548abacd7f0e37276f917c09721b3844d0b26e9ed5c76c99787992259bf0f7b02445d3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABGtDJxF+nATXpYJZxSB6NujSeOhz\nuStbOnCjxHQsxYO0FAiqqyOhKpybCyYWDFSKus1/Djcnb5F8CXIbOETQsm6e1cds\nmXh5kiWb8PewJEXT\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 969,
+          "comment" : "u1 == 1",
+          "msg" : "313233343030",
+          "sig" : "305502284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105022900f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb700",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04277f487faf77a65dbb791536e863b8c70f904fcdcaf52740d4bd5c469731e58ea6bd53e8d77202282d346f2b4ca7bacb882fef749c2713f1a75f00827e8b9b9f744a0e1e34bcf80799a120950de95d99",
+        "wx" : "277f487faf77a65dbb791536e863b8c70f904fcdcaf52740d4bd5c469731e58ea6bd53e8d7720228",
+        "wy" : "2d346f2b4ca7bacb882fef749c2713f1a75f00827e8b9b9f744a0e1e34bcf80799a120950de95d99"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004277f487faf77a65dbb791536e863b8c70f904fcdcaf52740d4bd5c469731e58ea6bd53e8d77202282d346f2b4ca7bacb882fef749c2713f1a75f00827e8b9b9f744a0e1e34bcf80799a120950de95d99",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABCd/SH+vd6Zdu3kVNuhjuMcPkE/N\nyvUnQNS9XEaXMeWOpr1T6NdyAigtNG8rTKe6y4gv73ScJxPxp18Agn6Lm590Sg4e\nNLz4B5mhIJUN6V2Z\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 970,
+          "comment" : "u1 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "305502284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105022900ad0b664f9559e29e46fd4fd390e75abebf14997d17a1a3304c80e451fc8f79bb7cff168e17de6f22",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0473bd62f3bb329d65092b5d13c5746d462401d2600994d8fe2ec5ef5b9f3399084b1ddc64cb334baec1d1ac4f9a0c2a79ef7ccc4ae9165ddfa76138235718cf24032c33f9db4a26b2b03692a56f5202eb",
+        "wx" : "73bd62f3bb329d65092b5d13c5746d462401d2600994d8fe2ec5ef5b9f3399084b1ddc64cb334bae",
+        "wy" : "0c1d1ac4f9a0c2a79ef7ccc4ae9165ddfa76138235718cf24032c33f9db4a26b2b03692a56f5202eb"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000473bd62f3bb329d65092b5d13c5746d462401d2600994d8fe2ec5ef5b9f3399084b1ddc64cb334baec1d1ac4f9a0c2a79ef7ccc4ae9165ddfa76138235718cf24032c33f9db4a26b2b03692a56f5202eb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABHO9YvO7Mp1lCStdE8V0bUYkAdJg\nCZTY/i7F71ufM5kISx3cZMszS67B0axPmgwqee98zErpFl3fp2E4I1cYzyQDLDP5\n20omsrA2kqVvUgLr\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 971,
+          "comment" : "u2 == 1",
+          "msg" : "313233343030",
+          "sig" : "305402284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c197310502284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0420a75551035db95d7a1a673d464d276da0861008e4644c582bc10a1beeaeb070823fd064a2625ebb5d47f0c77fc57e3bb0e153bbc7e9bbde8db98b0c46c58154af5b9786b10ba12ab3ba8533a3992883",
+        "wx" : "20a75551035db95d7a1a673d464d276da0861008e4644c582bc10a1beeaeb070823fd064a2625ebb",
+        "wy" : "5d47f0c77fc57e3bb0e153bbc7e9bbde8db98b0c46c58154af5b9786b10ba12ab3ba8533a3992883"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000420a75551035db95d7a1a673d464d276da0861008e4644c582bc10a1beeaeb070823fd064a2625ebb5d47f0c77fc57e3bb0e153bbc7e9bbde8db98b0c46c58154af5b9786b10ba12ab3ba8533a3992883",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABCCnVVEDXbldehpnPUZNJ22ghhAI\n5GRMWCvBChvurrBwgj/QZKJiXrtdR/DHf8V+O7DhU7vH6bvejbmLDEbFgVSvW5eG\nsQuhKrO6hTOjmSiD\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 972,
+          "comment" : "u2 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "305502284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c19731050229008ce984c0247d8a7a9628503f36abeaeea65fdfc3cf0a0c6cc8dac9da9f043b4659b638e7832e620c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043f436d07cb0264b13f92fd696334a4e51b7d6619e2d043b2d0d278963f2516200ef905ebf671666340e642b6c966072b79278003651128879f19dee01273b66bead8045194277c9284093348d90569b1",
+        "wx" : "3f436d07cb0264b13f92fd696334a4e51b7d6619e2d043b2d0d278963f2516200ef905ebf6716663",
+        "wy" : "40e642b6c966072b79278003651128879f19dee01273b66bead8045194277c9284093348d90569b1"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200043f436d07cb0264b13f92fd696334a4e51b7d6619e2d043b2d0d278963f2516200ef905ebf671666340e642b6c966072b79278003651128879f19dee01273b66bead8045194277c9284093348d90569b1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABD9DbQfLAmSxP5L9aWM0pOUbfWYZ\n4tBDstDSeJY/JRYgDvkF6/ZxZmNA5kK2yWYHK3kngANlESiHnxne4BJztmvq2ARR\nlCd8koQJM0jZBWmx\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 973,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02280cc64af035cb79b3336a62d915b381e268d3bcb834f9cfd0f597c37ca5fcf50f588614ef0ef7b6a5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c16fbe6d0d77327cf9a65f987c2fe7ee1807851c0e1c8bc4f0622807dcd4a88b3b912eb0475471e575421c40540050507a163f23cc7cb90acc52822d01d245ab70dcaac06e2ea644327a85f595d026ef",
+        "wx" : "0c16fbe6d0d77327cf9a65f987c2fe7ee1807851c0e1c8bc4f0622807dcd4a88b3b912eb0475471e5",
+        "wy" : "75421c40540050507a163f23cc7cb90acc52822d01d245ab70dcaac06e2ea644327a85f595d026ef"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004c16fbe6d0d77327cf9a65f987c2fe7ee1807851c0e1c8bc4f0622807dcd4a88b3b912eb0475471e575421c40540050507a163f23cc7cb90acc52822d01d245ab70dcaac06e2ea644327a85f595d026ef",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABMFvvm0NdzJ8+aZfmHwv5+4YB4Uc\nDhyLxPBiKAfc1KiLO5EusEdUceV1QhxAVABQUHoWPyPMfLkKzFKCLQHSRatw3KrA\nbi6mRDJ6hfWV0Cbv\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 974,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0229008e765d0d1cf9539f682a4155b6d60eb6aa6862b2af9e9d3f94c9ad46d332f0e029775522815c0e5a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04be924007d6e22b944ac76da7fc2660d1aefab69471bd835bd78edd2c10621e76f718bfd0a5e2307ec62583d5ba5cc1c547630476b399866e7ed953b538f76c86afe9cfd0854b57e33691c77e444ccab8",
+        "wx" : "0be924007d6e22b944ac76da7fc2660d1aefab69471bd835bd78edd2c10621e76f718bfd0a5e2307e",
+        "wy" : "0c62583d5ba5cc1c547630476b399866e7ed953b538f76c86afe9cfd0854b57e33691c77e444ccab8"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004be924007d6e22b944ac76da7fc2660d1aefab69471bd835bd78edd2c10621e76f718bfd0a5e2307ec62583d5ba5cc1c547630476b399866e7ed953b538f76c86afe9cfd0854b57e33691c77e444ccab8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABL6SQAfW4iuUSsdtp/wmYNGu+raU\ncb2DW9eO3SwQYh529xi/0KXiMH7GJYPVulzBxUdjBHazmYZuftlTtTj3bIav6c/Q\nhUtX4zaRx35ETMq4\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 975,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02287225a960d967cfe52ac126a50fd79fa85a586397c0b298c8adfaf138317b0f794b24f53bd920c1cf",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04acf240130d47d4a57d606595f989129fea7e9744b1e53f5ce679c244c85af35c618607e2ecce1a431b696a7959fe30d049100dd54258181b08a2fe442e41ff29523c11a3e01028eb64b321c2b702579c",
+        "wx" : "0acf240130d47d4a57d606595f989129fea7e9744b1e53f5ce679c244c85af35c618607e2ecce1a43",
+        "wy" : "1b696a7959fe30d049100dd54258181b08a2fe442e41ff29523c11a3e01028eb64b321c2b702579c"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004acf240130d47d4a57d606595f989129fea7e9744b1e53f5ce679c244c85af35c618607e2ecce1a431b696a7959fe30d049100dd54258181b08a2fe442e41ff29523c11a3e01028eb64b321c2b702579c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABKzyQBMNR9SlfWBllfmJEp/qfpdE\nseU/XOZ5wkTIWvNcYYYH4uzOGkMbaWp5Wf4w0EkQDdVCWBgbCKL+RC5B/ylSPBGj\n4BAo62SzIcK3Alec\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 976,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900874f311b6b9ac74fc34c60c0941873651b3c0ec1d097a7861e0c7fbec3226f23a5e2c929d856ecb3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0446243b39e77639ac19e9be53669317d9598e03ec30a0cf6930f800009833826a59ade5321933ff2f69d770b978ccc36c90b748e5010636e7004ddc19885da7bb90dbfad479fc52dce4b9281405f1c6bd",
+        "wx" : "46243b39e77639ac19e9be53669317d9598e03ec30a0cf6930f800009833826a59ade5321933ff2f",
+        "wy" : "69d770b978ccc36c90b748e5010636e7004ddc19885da7bb90dbfad479fc52dce4b9281405f1c6bd"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000446243b39e77639ac19e9be53669317d9598e03ec30a0cf6930f800009833826a59ade5321933ff2f69d770b978ccc36c90b748e5010636e7004ddc19885da7bb90dbfad479fc52dce4b9281405f1c6bd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABEYkOznndjmsGem+U2aTF9lZjgPs\nMKDPaTD4AACYM4JqWa3lMhkz/y9p13C5eMzDbJC3SOUBBjbnAE3cGYhdp7uQ2/rU\nefxS3OS5KBQF8ca9\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 977,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022813753ac90fbc7edfdcb32e1697fdfd41b1fb59c5ad177e96feacc87522ef928de80a60bb0f32e7e2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b4b9b6ba3c0e7509c275894e84e818d71de14577bdb4bf0b8e5e1332d1087f3c333b73e8ab75f2c94f33d0e2ab342d2e1968ce3e1c47be87e39ee88273ae4cf777869d3a1703b63a983d2d43c59303e5",
+        "wx" : "0b4b9b6ba3c0e7509c275894e84e818d71de14577bdb4bf0b8e5e1332d1087f3c333b73e8ab75f2c9",
+        "wy" : "4f33d0e2ab342d2e1968ce3e1c47be87e39ee88273ae4cf777869d3a1703b63a983d2d43c59303e5"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004b4b9b6ba3c0e7509c275894e84e818d71de14577bdb4bf0b8e5e1332d1087f3c333b73e8ab75f2c94f33d0e2ab342d2e1968ce3e1c47be87e39ee88273ae4cf777869d3a1703b63a983d2d43c59303e5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABLS5tro8DnUJwnWJToToGNcd4UV3\nvbS/C45eEzLRCH88Mztz6Kt18slPM9DiqzQtLhlozj4cR76H457ognOuTPd3hp06\nFwO2Opg9LUPFkwPl\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 978,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022826ea75921f78fdbfb9665c2d2ffbfa8363f6b38b5a2efd2dfd5990ea45df251bd014c1761e65cfc4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0403015b3ca67683467c79446d4b93d10978330856eee40d6d58683ac73500ae315c5b582351c4226b18d89561d3ffa0f9311aa616547f7eb1d36e73a6cc4bd230df34a1f319be66bcb2fb0e1f68cc192e",
+        "wx" : "3015b3ca67683467c79446d4b93d10978330856eee40d6d58683ac73500ae315c5b582351c4226b",
+        "wy" : "18d89561d3ffa0f9311aa616547f7eb1d36e73a6cc4bd230df34a1f319be66bcb2fb0e1f68cc192e"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000403015b3ca67683467c79446d4b93d10978330856eee40d6d58683ac73500ae315c5b582351c4226b18d89561d3ffa0f9311aa616547f7eb1d36e73a6cc4bd230df34a1f319be66bcb2fb0e1f68cc192e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABAMBWzymdoNGfHlEbUuT0Ql4MwhW\n7uQNbVhoOsc1AK4xXFtYI1HEImsY2JVh0/+g+TEaphZUf36x025zpsxL0jDfNKHz\nGb5mvLL7Dh9ozBku\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 979,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0229009fee192930d30502c05e56adf086ecd13a92cd43ce0c72ea65ead43667890ae19be835333c32c5f0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04187d93f84a0e6043f097d0a87f8dca07739cf44548a7d3403e039e49c4c51285482975af54ec056c0623c57538fefb7231d619bbefd4cab373a54b361354e586b1d9981a8835e9c6beab082cb93e13b6",
+        "wx" : "187d93f84a0e6043f097d0a87f8dca07739cf44548a7d3403e039e49c4c51285482975af54ec056c",
+        "wy" : "623c57538fefb7231d619bbefd4cab373a54b361354e586b1d9981a8835e9c6beab082cb93e13b6"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004187d93f84a0e6043f097d0a87f8dca07739cf44548a7d3403e039e49c4c51285482975af54ec056c0623c57538fefb7231d619bbefd4cab373a54b361354e586b1d9981a8835e9c6beab082cb93e13b6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABBh9k/hKDmBD8JfQqH+NygdznPRF\nSKfTQD4DnknExRKFSCl1r1TsBWwGI8V1OP77cjHWGbvv1Mqzc6VLNhNU5Yax2Zga\niDXpxr6rCCy5PhO2\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 980,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900963f97cb35a321df62fc219eb2f3703949c483165d06db13c403080a86c1e5d9b43d2e8dd9643cde",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040855cc20351126b38f934fbb56c302f62a360e62493c2d529fb87caea0d71bfdaf5fcc3368d495fd1ce7578610cbec465398b2c1238b3e23b9e29b476196106430d76316aaf29937ace658b69c8bfb99",
+        "wx" : "0855cc20351126b38f934fbb56c302f62a360e62493c2d529fb87caea0d71bfdaf5fcc3368d495fd",
+        "wy" : "1ce7578610cbec465398b2c1238b3e23b9e29b476196106430d76316aaf29937ace658b69c8bfb99"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200040855cc20351126b38f934fbb56c302f62a360e62493c2d529fb87caea0d71bfdaf5fcc3368d495fd1ce7578610cbec465398b2c1238b3e23b9e29b476196106430d76316aaf29937ace658b69c8bfb99",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABAhVzCA1ESazj5NPu1bDAvYqNg5i\nSTwtUp+4fK6g1xv9r1/MM2jUlf0c51eGEMvsRlOYssEjiz4jueKbR2GWEGQw12MW\nqvKZN6zmWLaci/uZ\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 981,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022813dbff9e667e7bcd44950226f93b09738e793517c02886ae9f2b3dededa756c9049ab9a46bc7c93e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0494c54919004079be0db4c92dc1fc947d79eb0f8e869d94813886ada4254f1dadb4d87a6112a5833686d8b5beac00fafd647ef8b631e899a6a8b72a511d4f50ce156648ad9cb708fb2fb2c638fdb9f332",
+        "wx" : "094c54919004079be0db4c92dc1fc947d79eb0f8e869d94813886ada4254f1dadb4d87a6112a58336",
+        "wy" : "086d8b5beac00fafd647ef8b631e899a6a8b72a511d4f50ce156648ad9cb708fb2fb2c638fdb9f332"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000494c54919004079be0db4c92dc1fc947d79eb0f8e869d94813886ada4254f1dadb4d87a6112a5833686d8b5beac00fafd647ef8b631e899a6a8b72a511d4f50ce156648ad9cb708fb2fb2c638fdb9f332",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABJTFSRkAQHm+DbTJLcH8lH156w+O\nhp2UgTiGraQlTx2ttNh6YRKlgzaG2LW+rAD6/WR++LYx6JmmqLcqUR1PUM4VZkit\nnLcI+y+yxjj9ufMy\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 982,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900852466cef316992b3ca25cc54b7f4fda2e8a819e7c4b040543e94f9caca02937681c2019bb49ee43",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042bca76043728b5eeefde89d25acdf2e0b160c5ae0ccdab6bd3baa479f17753c3c000ccf8ba8623de92f0c2d68a1bd405e449823fe63b21402aef3e9a017dcbc30af18bcc79a85264834398c72fa2bb16",
+        "wx" : "2bca76043728b5eeefde89d25acdf2e0b160c5ae0ccdab6bd3baa479f17753c3c000ccf8ba8623de",
+        "wy" : "092f0c2d68a1bd405e449823fe63b21402aef3e9a017dcbc30af18bcc79a85264834398c72fa2bb16"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200042bca76043728b5eeefde89d25acdf2e0b160c5ae0ccdab6bd3baa479f17753c3c000ccf8ba8623de92f0c2d68a1bd405e449823fe63b21402aef3e9a017dcbc30af18bcc79a85264834398c72fa2bb16",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABCvKdgQ3KLXu796J0lrN8uCxYMWu\nDM2ra9O6pHnxd1PDwADM+LqGI96S8MLWihvUBeRJgj/mOyFAKu8+mgF9y8MK8YvM\neahSZINDmMcvorsW\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 983,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0228634bfe1800786b0256e90ac2de272f41c85e0976c0caa1691bd835a5a444b1ed1705a0361ae6ee36",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041c013b3a3260ccfb53e3f6ce93e6984865dc8e1293e92301f4cb3a554bd5da8a53ee101b3e1a300997d2901e26729303e1cb93a8b72dc2afc90ff5b44fd5b6624455487974ed71c7833eff03cc128d0c",
+        "wx" : "1c013b3a3260ccfb53e3f6ce93e6984865dc8e1293e92301f4cb3a554bd5da8a53ee101b3e1a3009",
+        "wy" : "097d2901e26729303e1cb93a8b72dc2afc90ff5b44fd5b6624455487974ed71c7833eff03cc128d0c"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200041c013b3a3260ccfb53e3f6ce93e6984865dc8e1293e92301f4cb3a554bd5da8a53ee101b3e1a300997d2901e26729303e1cb93a8b72dc2afc90ff5b44fd5b6624455487974ed71c7833eff03cc128d0c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABBwBOzoyYMz7U+P2zpPmmEhl3I4S\nk+kjAfTLOlVL1dqKU+4QGz4aMAmX0pAeJnKTA+HLk6i3LcKvyQ/1tE/VtmJEVUh5\ndO1xx4M+/wPMEo0M\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 984,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900c697fc3000f0d604add21585bc4e5e8390bc12ed819542d237b06b4b488963da2e0b406c35cddc6c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04624bec4520e6044abed1eee4964668775181464c5d6bf5a8b539f1156f3248c02271bf9425b966b547f406bcc143226d814cdb988d76412ad186bdeeb869ad78a32fe87c76f2545447ddf8fbd0430811",
+        "wx" : "624bec4520e6044abed1eee4964668775181464c5d6bf5a8b539f1156f3248c02271bf9425b966b5",
+        "wy" : "47f406bcc143226d814cdb988d76412ad186bdeeb869ad78a32fe87c76f2545447ddf8fbd0430811"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004624bec4520e6044abed1eee4964668775181464c5d6bf5a8b539f1156f3248c02271bf9425b966b547f406bcc143226d814cdb988d76412ad186bdeeb869ad78a32fe87c76f2545447ddf8fbd0430811",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABGJL7EUg5gRKvtHu5JZGaHdRgUZM\nXWv1qLU58RVvMkjAInG/lCW5ZrVH9Aa8wUMibYFM25iNdkEq0Ya97rhprXijL+h8\ndvJUVEfd+PvQQwgR\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 985,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02285685b327caacf14f237ea7e9c873ad5f5f8a4cbe8bd0d19826407228fe47bcddbe7f8b470bef3791",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041b2b2738e3055d1596f64176cf0ac381b3a8178a2f021403350218fa18f9f860c1bba39fc524bc8209fbafca1afc5af7598b878d69cb875be0d39f41ff01b09388693eb310adc9d4836e226c23677e51",
+        "wx" : "1b2b2738e3055d1596f64176cf0ac381b3a8178a2f021403350218fa18f9f860c1bba39fc524bc82",
+        "wy" : "09fbafca1afc5af7598b878d69cb875be0d39f41ff01b09388693eb310adc9d4836e226c23677e51"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200041b2b2738e3055d1596f64176cf0ac381b3a8178a2f021403350218fa18f9f860c1bba39fc524bc8209fbafca1afc5af7598b878d69cb875be0d39f41ff01b09388693eb310adc9d4836e226c23677e51",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABBsrJzjjBV0VlvZBds8Kw4GzqBeK\nLwIUAzUCGPoY+fhgwbujn8UkvIIJ+6/KGvxa91mLh41py4db4NOfQf8BsJOIaT6z\nEK3J1INuImwjZ35R\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 986,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900a2c1f84088120fce85fecf81f0ecc00729f4199ebba0d5b5eda190001000b43168db254b8ef32a70",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0440902bf6b239d2f3588260e9d7f512253fa44f308a0ab81dff05b8fa2e25814d65c2018d49390aae016f8ae5691938402adc0ffa29bb87ef0af0ecf3cd446d97c3e8d12b3b09eb78909c1b91b1b8785f",
+        "wx" : "40902bf6b239d2f3588260e9d7f512253fa44f308a0ab81dff05b8fa2e25814d65c2018d49390aae",
+        "wy" : "16f8ae5691938402adc0ffa29bb87ef0af0ecf3cd446d97c3e8d12b3b09eb78909c1b91b1b8785f"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000440902bf6b239d2f3588260e9d7f512253fa44f308a0ab81dff05b8fa2e25814d65c2018d49390aae016f8ae5691938402adc0ffa29bb87ef0af0ecf3cd446d97c3e8d12b3b09eb78909c1b91b1b8785f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABECQK/ayOdLzWIJg6df1EiU/pE8w\nigq4Hf8FuPouJYFNZcIBjUk5Cq4Bb4rlaRk4QCrcD/opu4fvCvDs881EbZfD6NEr\nOwnreJCcG5GxuHhf\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 987,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0228711f6d0abce96fe7f5bed2ca4600a021fdda9a8c922fb0e10f180f97fa2cc84dd785c71e6c41dbaf",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04726533e26773ac720a115b02de89ac15966677e239b7c577a1c15b81027b1feb73e673601e211aa92accb585bc06cc274b61c9e614746edd248d1cccf8d8b1ab4bc15cc58cdf116065ce9767f2a3223d",
+        "wx" : "726533e26773ac720a115b02de89ac15966677e239b7c577a1c15b81027b1feb73e673601e211aa9",
+        "wy" : "2accb585bc06cc274b61c9e614746edd248d1cccf8d8b1ab4bc15cc58cdf116065ce9767f2a3223d"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004726533e26773ac720a115b02de89ac15966677e239b7c577a1c15b81027b1feb73e673601e211aa92accb585bc06cc274b61c9e614746edd248d1cccf8d8b1ab4bc15cc58cdf116065ce9767f2a3223d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABHJlM+Jnc6xyChFbAt6JrBWWZnfi\nObfFd6HBW4ECex/rc+ZzYB4hGqkqzLWFvAbMJ0thyeYUdG7dJI0czPjYsatLwVzF\njN8RYGXOl2fyoyI9\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 988,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022802a6eb408443d24e96be4ca0278442a8a426087f9beb03ffe5526162bf1dc30434cf7ea79574b19b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0453c3da4de14f7d35775f9beca6d53ee78dac73cd3f18c6fbf709b4ffa7dd3e70b436409b9b285d1c2a5b60e457e58422c959142b5ecff236dfd76c99c3018cea904058099a13647db08898cfd0509e84",
+        "wx" : "53c3da4de14f7d35775f9beca6d53ee78dac73cd3f18c6fbf709b4ffa7dd3e70b436409b9b285d1c",
+        "wy" : "2a5b60e457e58422c959142b5ecff236dfd76c99c3018cea904058099a13647db08898cfd0509e84"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000453c3da4de14f7d35775f9beca6d53ee78dac73cd3f18c6fbf709b4ffa7dd3e70b436409b9b285d1c2a5b60e457e58422c959142b5ecff236dfd76c99c3018cea904058099a13647db08898cfd0509e84",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABFPD2k3hT301d1+b7KbVPueNrHPN\nPxjG+/cJtP+n3T5wtDZAm5soXRwqW2DkV+WEIslZFCtez/I239dsmcMBjOqQQFgJ\nmhNkfbCImM/QUJ6E\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 989,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900b6ba1aecd240debe77213a4228b125603671c9d5147b6c0b36dd23e42b7cb5078a1b8fdf1b98b93a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cd24ae7f7523adf859db92e51d48746b8b2f868620898a9c42f8bae8173e3646f586fd818712430e55b12d59f7344168f796fe59c026eaaa139745a8ace97df1d5c6bcc21f0cfa6860f9c8c75f391629",
+        "wx" : "0cd24ae7f7523adf859db92e51d48746b8b2f868620898a9c42f8bae8173e3646f586fd818712430e",
+        "wy" : "55b12d59f7344168f796fe59c026eaaa139745a8ace97df1d5c6bcc21f0cfa6860f9c8c75f391629"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004cd24ae7f7523adf859db92e51d48746b8b2f868620898a9c42f8bae8173e3646f586fd818712430e55b12d59f7344168f796fe59c026eaaa139745a8ace97df1d5c6bcc21f0cfa6860f9c8c75f391629",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABM0krn91I634WduS5R1IdGuLL4aG\nIImKnEL4uugXPjZG9Yb9gYcSQw5VsS1Z9zRBaPeW/lnAJuqqE5dFqKzpffHVxrzC\nHwz6aGD5yMdfORYp\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 990,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900957b383ba1cebf5ca579ef6ed10027988f8424f42ffbea2e51b3340df9f8c3c60b558d6dc2df10f3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044db460209972c8e9c365119546ac457add157f0c4d2b3cd65c635dcaeca617029cabf75c06101bb69ef8b7626e6b2f9845b0086d2a964018b9b25eb8db426bc90694cc614b7602b1fd6087a9a71cbf1f",
+        "wx" : "4db460209972c8e9c365119546ac457add157f0c4d2b3cd65c635dcaeca617029cabf75c06101bb6",
+        "wy" : "09ef8b7626e6b2f9845b0086d2a964018b9b25eb8db426bc90694cc614b7602b1fd6087a9a71cbf1f"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200044db460209972c8e9c365119546ac457add157f0c4d2b3cd65c635dcaeca617029cabf75c06101bb69ef8b7626e6b2f9845b0086d2a964018b9b25eb8db426bc90694cc614b7602b1fd6087a9a71cbf1f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABE20YCCZcsjpw2URlUasRXrdFX8M\nTSs81lxjXcrsphcCnKv3XAYQG7ae+LdibmsvmEWwCG0qlkAYubJeuNtCa8kGlMxh\nS3YCsf1gh6mnHL8f\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 991,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02290098ff1db1b9affa33a2e53c684d3f07611772405e8c200f2af2afa9e53c6e8ef30cc143b3f5ff7fb0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043e7ab850840d75987d33837ead46499ce433f3fce67383b2e325dd2fc7e0f500769cbb67b4550a28c30314487a87094750334499dbfbeb2d5cb976ee2d47997321597a41124a038fe867be0ef668c4ce",
+        "wx" : "3e7ab850840d75987d33837ead46499ce433f3fce67383b2e325dd2fc7e0f500769cbb67b4550a28",
+        "wy" : "0c30314487a87094750334499dbfbeb2d5cb976ee2d47997321597a41124a038fe867be0ef668c4ce"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200043e7ab850840d75987d33837ead46499ce433f3fce67383b2e325dd2fc7e0f500769cbb67b4550a28c30314487a87094750334499dbfbeb2d5cb976ee2d47997321597a41124a038fe867be0ef668c4ce",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABD56uFCEDXWYfTODfq1GSZzkM/P8\n5nODsuMl3S/H4PUAdpy7Z7RVCijDAxRIeocJR1AzRJnb++stXLl27i1HmXMhWXpB\nEkoDj+hnvg72aMTO\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 992,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02285e9ff4433ca3a4af648e0071c87c2e5c3554b11761b10bb2b81725028a56c4fc92f1320ca7396c4f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047acc919934b0fd90011cd96f59ddba52e12094dac18a2cadcb03a0f31ac72d3fd5984a11e9220f8c0629bc5f3f0dabbd3fdd30f47a0a5bea3052892f8e50a4033be4795b32c6671d141b473080e57911",
+        "wx" : "7acc919934b0fd90011cd96f59ddba52e12094dac18a2cadcb03a0f31ac72d3fd5984a11e9220f8c",
+        "wy" : "629bc5f3f0dabbd3fdd30f47a0a5bea3052892f8e50a4033be4795b32c6671d141b473080e57911"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200047acc919934b0fd90011cd96f59ddba52e12094dac18a2cadcb03a0f31ac72d3fd5984a11e9220f8c0629bc5f3f0dabbd3fdd30f47a0a5bea3052892f8e50a4033be4795b32c6671d141b473080e57911",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABHrMkZk0sP2QARzZb1ndulLhIJTa\nwYosrcsDoPMaxy0/1ZhKEekiD4wGKbxfPw2rvT/dMPR6ClvqMFKJL45QpAM75Hlb\nMsZnHRQbRzCA5XkR\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 993,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900c76ce53560163f157b11e4d05c61540a5df6b8241cbd3ba7d911a7541eec55e986ebf811ae50a8b9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0412c163fe25cb79ad59c76b5280dc6706a42c58596230bf7ba7206e6ce2b467e1b7a7063e59b0bed6ccbeaf22accb1ac41ed43ac775b97aea3a688e2f096c3a5e59f868bc919da5ce252cf5d712e7de40",
+        "wx" : "12c163fe25cb79ad59c76b5280dc6706a42c58596230bf7ba7206e6ce2b467e1b7a7063e59b0bed6",
+        "wy" : "0ccbeaf22accb1ac41ed43ac775b97aea3a688e2f096c3a5e59f868bc919da5ce252cf5d712e7de40"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000412c163fe25cb79ad59c76b5280dc6706a42c58596230bf7ba7206e6ce2b467e1b7a7063e59b0bed6ccbeaf22accb1ac41ed43ac775b97aea3a688e2f096c3a5e59f868bc919da5ce252cf5d712e7de40",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABBLBY/4ly3mtWcdrUoDcZwakLFhZ\nYjC/e6cgbmzitGfht6cGPlmwvtbMvq8irMsaxB7UOsd1uXrqOmiOLwlsOl5Z+Gi8\nkZ2lziUs9dcS595A\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 994,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02284218a45116ea65b283cc7d90a510f077b1b09eddbcfca3e7d2896b869dd3ba556c4f10590b0e08cf",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046960bfcddd0021fcb8a3d7aa85f96cf360a7113e3824508525021f83e3085989c35e0c57726503305c1275b9d8b5199d461fcb9d34f8857b65a140462fd5cdc7a33e5cf7f4e2d08a5a34d9ae00b2939a",
+        "wx" : "6960bfcddd0021fcb8a3d7aa85f96cf360a7113e3824508525021f83e3085989c35e0c5772650330",
+        "wy" : "5c1275b9d8b5199d461fcb9d34f8857b65a140462fd5cdc7a33e5cf7f4e2d08a5a34d9ae00b2939a"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200046960bfcddd0021fcb8a3d7aa85f96cf360a7113e3824508525021f83e3085989c35e0c57726503305c1275b9d8b5199d461fcb9d34f8857b65a140462fd5cdc7a33e5cf7f4e2d08a5a34d9ae00b2939a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABGlgv83dACH8uKPXqoX5bPNgpxE+\nOCRQhSUCH4PjCFmJw14MV3JlAzBcEnW52LUZnUYfy500+IV7ZaFARi/VzcejPlz3\n9OLQilo02a4AspOa\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 995,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02285e5f32423bad3644be718d8195341362c9cba52b330f913b1521af6e5e3eb2069421b05dcac299f7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0466ad2c26012388c8b9046a466b87bd71b64ab81b54cffc5a611f4b7581ad8365edd08e6afd4a52f61a3066c0b3b703ddce746239a4d3dbf1938945f15ea9497bbfc45b389e130350b9945922b87ce374",
+        "wx" : "66ad2c26012388c8b9046a466b87bd71b64ab81b54cffc5a611f4b7581ad8365edd08e6afd4a52f6",
+        "wy" : "1a3066c0b3b703ddce746239a4d3dbf1938945f15ea9497bbfc45b389e130350b9945922b87ce374"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000466ad2c26012388c8b9046a466b87bd71b64ab81b54cffc5a611f4b7581ad8365edd08e6afd4a52f61a3066c0b3b703ddce746239a4d3dbf1938945f15ea9497bbfc45b389e130350b9945922b87ce374",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABGatLCYBI4jIuQRqRmuHvXG2Srgb\nVM/8WmEfS3WBrYNl7dCOav1KUvYaMGbAs7cD3c50Yjmk09vxk4lF8V6pSXu/xFs4\nnhMDULmUWSK4fON0\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 996,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900ac07aaade5c5fb2fe5a18bbefd262e0e439fd68e0a317db06ff4ba623a2a03114ec5b6e084171058",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040cfa6e3838d8113a24d87db97417d68f00c426e9b8550d8a951fed531572e7cca66ffe0ae176ff0e312fa02e5cc77c21f4a6630e25bcb987dc1eef14aec80c15b9b292e3acfb30bc2c0438f0a9831c07",
+        "wx" : "0cfa6e3838d8113a24d87db97417d68f00c426e9b8550d8a951fed531572e7cca66ffe0ae176ff0e",
+        "wy" : "312fa02e5cc77c21f4a6630e25bcb987dc1eef14aec80c15b9b292e3acfb30bc2c0438f0a9831c07"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200040cfa6e3838d8113a24d87db97417d68f00c426e9b8550d8a951fed531572e7cca66ffe0ae176ff0e312fa02e5cc77c21f4a6630e25bcb987dc1eef14aec80c15b9b292e3acfb30bc2c0438f0a9831c07",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABAz6bjg42BE6JNh9uXQX1o8AxCbp\nuFUNipUf7VMVcufMpm/+CuF2/w4xL6AuXMd8IfSmYw4lvLmH3B7vFK7IDBW5spLj\nrPswvCwEOPCpgxwH\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 997,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0228311f6d0abce96fe7f5bed2ca4600a021fdda9a8c922fb0e10f180f97fa2cc84dd785c71e6c41dbb1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043dabbc36a455ba07432da1aa7239aefdefb72ac09313c3a7f3439850f602543eb4affc5d8225b5eece48e2f67e82d448b3d8b9b0fc200832a3d1ac88058872762fcbf027e9f5705d8f5812e507dae125",
+        "wx" : "3dabbc36a455ba07432da1aa7239aefdefb72ac09313c3a7f3439850f602543eb4affc5d8225b5ee",
+        "wy" : "0ce48e2f67e82d448b3d8b9b0fc200832a3d1ac88058872762fcbf027e9f5705d8f5812e507dae125"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200043dabbc36a455ba07432da1aa7239aefdefb72ac09313c3a7f3439850f602543eb4affc5d8225b5eece48e2f67e82d448b3d8b9b0fc200832a3d1ac88058872762fcbf027e9f5705d8f5812e507dae125",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABD2rvDakVboHQy2hqnI5rv3vtyrA\nkxPDp/NDmFD2AlQ+tK/8XYIlte7OSOL2foLUSLPYubD8IAgyo9GsiAWIcnYvy/An\n6fVwXY9YEuUH2uEl\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 998,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0228623eda1579d2dfcfeb7da5948c014043fbb53519245f61c21e301f2ff459909baf0b8e3cd883b762",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048a9658dc5f91aa577706f1d91d2252cb0d09f2053e561129105c7f37ddb2f972b3224f12cf9e43fe08782ec6105f4c06587eb1ececb2f4f4a04e236304dc75eb2efff0be66b977fa804af73bfcbac78e",
+        "wx" : "08a9658dc5f91aa577706f1d91d2252cb0d09f2053e561129105c7f37ddb2f972b3224f12cf9e43fe",
+        "wy" : "08782ec6105f4c06587eb1ececb2f4f4a04e236304dc75eb2efff0be66b977fa804af73bfcbac78e"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200048a9658dc5f91aa577706f1d91d2252cb0d09f2053e561129105c7f37ddb2f972b3224f12cf9e43fe08782ec6105f4c06587eb1ececb2f4f4a04e236304dc75eb2efff0be66b977fa804af73bfcbac78e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABIqWWNxfkapXdwbx2R0iUssNCfIF\nPlYRKRBcfzfdsvlysyJPEs+eQ/4IeC7GEF9MBlh+sezssvT0oE4jYwTcdesu//C+\nZrl3+oBK9zv8useO\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 999,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305502287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022900935e472036bc4fb7e13c785ed201e065f98fcfa5b68f12a32d482ec7ee8658e98691555b44c59313",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0406b43bb9587ee158ad5752d1ad11f6f0f5e316ad21937cdd9253f3844857f0a25e7b677bbf9994449705362334bdceb68ae6a584640c95cb10789b19953f5e119973eed735177aabfcb263fc8ef5ef97",
+        "wx" : "6b43bb9587ee158ad5752d1ad11f6f0f5e316ad21937cdd9253f3844857f0a25e7b677bbf999444",
+        "wy" : "09705362334bdceb68ae6a584640c95cb10789b19953f5e119973eed735177aabfcb263fc8ef5ef97"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000406b43bb9587ee158ad5752d1ad11f6f0f5e316ad21937cdd9253f3844857f0a25e7b677bbf9994449705362334bdceb68ae6a584640c95cb10789b19953f5e119973eed735177aabfcb263fc8ef5ef97",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABAa0O7lYfuFYrVdS0a0R9vD14xat\nIZN83ZJT84RIV/CiXntne7+ZlESXBTYjNL3OtormpYRkDJXLEHibGZU/XhGZc+7X\nNRd6q/yyY/yO9e+X\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1000,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "305402287ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02285b5d0d7669206f5f3b909d21145892b01b38e4ea8a3db6059b6e91f215be5a83c50dc7ef8dcc5c9d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04568803da071e6b9f4380e39954f2b0fc0f5bb58a0f68b5d1a42c7e9052ece2a0fc7acadc0f423999c08367945495d933f206927a2b7f5b74b22f973a898355aa2f7e295e06ef3a4f561546db97f79afa",
+        "wx" : "568803da071e6b9f4380e39954f2b0fc0f5bb58a0f68b5d1a42c7e9052ece2a0fc7acadc0f423999",
+        "wy" : "0c08367945495d933f206927a2b7f5b74b22f973a898355aa2f7e295e06ef3a4f561546db97f79afa"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004568803da071e6b9f4380e39954f2b0fc0f5bb58a0f68b5d1a42c7e9052ece2a0fc7acadc0f423999c08367945495d933f206927a2b7f5b74b22f973a898355aa2f7e295e06ef3a4f561546db97f79afa",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABFaIA9oHHmufQ4DjmVTysPwPW7WK\nD2i10aQsfpBS7OKg/HrK3A9COZnAg2eUVJXZM/IGknorf1t0si+XOomDVaovfile\nBu86T1YVRtuX95r6\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1001,
+          "comment" : "point duplication during verification",
+          "msg" : "313233343030",
+          "sig" : "30560229009563bd68545ccd185ae724d8efcd4cc23234934eef10f280792b2f930c97a6c1e00829a8b975b9ee022900c5e79c49abb135129f0636e18e2e73bced30855deeba1477d9521b33a32865155177d946e1babcb4",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04568803da071e6b9f4380e39954f2b0fc0f5bb58a0f68b5d1a42c7e9052ece2a0fc7acadc0f42399912dadf8be2267683ef35e5e4a68284f14760386c6d70b8452014908e71a4b1d9a6becbd659bb932d",
+        "wx" : "568803da071e6b9f4380e39954f2b0fc0f5bb58a0f68b5d1a42c7e9052ece2a0fc7acadc0f423999",
+        "wy" : "12dadf8be2267683ef35e5e4a68284f14760386c6d70b8452014908e71a4b1d9a6becbd659bb932d"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004568803da071e6b9f4380e39954f2b0fc0f5bb58a0f68b5d1a42c7e9052ece2a0fc7acadc0f42399912dadf8be2267683ef35e5e4a68284f14760386c6d70b8452014908e71a4b1d9a6becbd659bb932d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABFaIA9oHHmufQ4DjmVTysPwPW7WK\nD2i10aQsfpBS7OKg/HrK3A9COZkS2t+L4iZ2g+815eSmgoTxR2A4bG1wuEUgFJCO\ncaSx2aa+y9ZZu5Mt\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1002,
+          "comment" : "duplication bug",
+          "msg" : "313233343030",
+          "sig" : "30560229009563bd68545ccd185ae724d8efcd4cc23234934eef10f280792b2f930c97a6c1e00829a8b975b9ee022900c5e79c49abb135129f0636e18e2e73bced30855deeba1477d9521b33a32865155177d946e1babcb4",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045d1a100118bd3610f10e13b5adcc7a90a37f4f988cfa4e22cca77e88444b00216dcfe5f68418d3425d5b88c9b8c92b3dec7f7bcc688a6d18e6cdeb9176150d4b1062a832c8a3bc377f8d7e98b1db0b9d",
+        "wx" : "5d1a100118bd3610f10e13b5adcc7a90a37f4f988cfa4e22cca77e88444b00216dcfe5f68418d342",
+        "wy" : "5d5b88c9b8c92b3dec7f7bcc688a6d18e6cdeb9176150d4b1062a832c8a3bc377f8d7e98b1db0b9d"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200045d1a100118bd3610f10e13b5adcc7a90a37f4f988cfa4e22cca77e88444b00216dcfe5f68418d3425d5b88c9b8c92b3dec7f7bcc688a6d18e6cdeb9176150d4b1062a832c8a3bc377f8d7e98b1db0b9d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABF0aEAEYvTYQ8Q4Tta3MepCjf0+Y\njPpOIsynfohESwAhbc/l9oQY00JdW4jJuMkrPex/e8xoim0Y5s3rkXYVDUsQYqgy\nyKO8N3+Nfpix2wud\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1003,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "313233343030",
+          "sig" : "305402284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c197310502282a460e39a48c0ff193727e795d339347984ff65457b636ed6f74d627fc8144fb81504445742783d0",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cca9ac38de5b36cf79d8e415cb729e685e0bbdafe161c5e7ecfa4177e826e815d66526aa5daf32279b7799bcefc6b5d8d09ff1a0739fd423188126f80af703314da0d26ba6714aa197a6582c36b0f05d",
+        "wx" : "0cca9ac38de5b36cf79d8e415cb729e685e0bbdafe161c5e7ecfa4177e826e815d66526aa5daf3227",
+        "wy" : "09b7799bcefc6b5d8d09ff1a0739fd423188126f80af703314da0d26ba6714aa197a6582c36b0f05d"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004cca9ac38de5b36cf79d8e415cb729e685e0bbdafe161c5e7ecfa4177e826e815d66526aa5daf32279b7799bcefc6b5d8d09ff1a0739fd423188126f80af703314da0d26ba6714aa197a6582c36b0f05d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABMyprDjeWzbPedjkFctynmheC72v\n4WHF5+z6QXfoJugV1mUmql2vMiebd5m878a12NCf8aBzn9QjGIEm+Ar3AzFNoNJr\npnFKoZemWCw2sPBd\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1004,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "305402282fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de802284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cceaa1203bdcbe15e20434d624f0ed9aca81d4c82f840bba3a86c6756262aa37efed62f5f1d097f7457057b98d2b9ea6bd28581d40ac20fcc9d536a117769203447bf41e10ce4da1ad794ca20f8ee146",
+        "wx" : "0cceaa1203bdcbe15e20434d624f0ed9aca81d4c82f840bba3a86c6756262aa37efed62f5f1d097f7",
+        "wy" : "457057b98d2b9ea6bd28581d40ac20fcc9d536a117769203447bf41e10ce4da1ad794ca20f8ee146"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004cceaa1203bdcbe15e20434d624f0ed9aca81d4c82f840bba3a86c6756262aa37efed62f5f1d097f7457057b98d2b9ea6bd28581d40ac20fcc9d536a117769203447bf41e10ce4da1ad794ca20f8ee146",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABMzqoSA73L4V4gQ01iTw7ZrKgdTI\nL4QLujqGxnViYqo37+1i9fHQl/dFcFe5jSuepr0oWB1ArCD8ydU2oRd2kgNEe/Qe\nEM5Noa15TKIPjuFG\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1005,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "305402282fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de802281e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cc9ed25f13e94a6ebd531f3b142fabc4ed522dc6127861528830c6787d6ecfd4b704e1774e9118ed68e4e172f93f1d5b8d7860fae2c115f4aa0daaf6df5ca3809d79acfdb9ed2be19995658d2f44d235",
+        "wx" : "0cc9ed25f13e94a6ebd531f3b142fabc4ed522dc6127861528830c6787d6ecfd4b704e1774e9118ed",
+        "wy" : "68e4e172f93f1d5b8d7860fae2c115f4aa0daaf6df5ca3809d79acfdb9ed2be19995658d2f44d235"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004cc9ed25f13e94a6ebd531f3b142fabc4ed522dc6127861528830c6787d6ecfd4b704e1774e9118ed68e4e172f93f1d5b8d7860fae2c115f4aa0daaf6df5ca3809d79acfdb9ed2be19995658d2f44d235",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABMye0l8T6UpuvVMfOxQvq8TtUi3G\nEnhhUogwxnh9bs/UtwThd06RGO1o5OFy+T8dW414YPriwRX0qg2q9t9co4Cdeaz9\nue0r4ZmVZY0vRNI1\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1006,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "305402282fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de802282a460e39a48c0ff193727e795d339347984ff65457b636ed6f74d627fc8144fb81504445742783d0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046a3cae0edc8455ae16b5eeb6569603bdaeb5793699e85d372857f1319c70dd525b1ea30a0f5c7b44075537cd822d9ee2d0e7a49c4c3141445d01b789bbcad02ec4249c2e2355d61db5581dbdb342c993",
+        "wx" : "6a3cae0edc8455ae16b5eeb6569603bdaeb5793699e85d372857f1319c70dd525b1ea30a0f5c7b44",
+        "wy" : "75537cd822d9ee2d0e7a49c4c3141445d01b789bbcad02ec4249c2e2355d61db5581dbdb342c993"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200046a3cae0edc8455ae16b5eeb6569603bdaeb5793699e85d372857f1319c70dd525b1ea30a0f5c7b44075537cd822d9ee2d0e7a49c4c3141445d01b789bbcad02ec4249c2e2355d61db5581dbdb342c993",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABGo8rg7chFWuFrXutlaWA72utXk2\nmehdNyhX8TGccN1SWx6jCg9ce0QHVTfNgi2e4tDnpJxMMUFEXQG3ibvK0C7EJJwu\nI1XWHbVYHb2zQsmT\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1007,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "305502282fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de8022900a91838e692303fc64dc9f9e574ce4d1e613fd9515ed8dbb5bdd3589ff20513ee05411115d09e0f41",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044efb5161ca1a1eeb59a5fc39cd521d40bd3e034512fa2a1eaf3b7e92bb9e95c06a4c726ceccdf9bc6bfa801b067137f1b6b4506041130b4d402d90087ad005e3f652e1d91c9d344cd1eeffff61d3a306",
+        "wx" : "4efb5161ca1a1eeb59a5fc39cd521d40bd3e034512fa2a1eaf3b7e92bb9e95c06a4c726ceccdf9bc",
+        "wy" : "6bfa801b067137f1b6b4506041130b4d402d90087ad005e3f652e1d91c9d344cd1eeffff61d3a306"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200044efb5161ca1a1eeb59a5fc39cd521d40bd3e034512fa2a1eaf3b7e92bb9e95c06a4c726ceccdf9bc6bfa801b067137f1b6b4506041130b4d402d90087ad005e3f652e1d91c9d344cd1eeffff61d3a306",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABE77UWHKGh7rWaX8Oc1SHUC9PgNF\nEvoqHq87fpK7npXAakxybOzN+bxr+oAbBnE38ba0UGBBEwtNQC2QCHrQBeP2UuHZ\nHJ00TNHu//9h06MG\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1008,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "305502282fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de8022900b52c3cf70a58445477eab051464ac05768321fb29c7aa242b9194cab5ebc4c35e10edb72cd3ba2a1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045f658687e6a542a91d893b48776a86d528fd399781bbb9305be0797e3a6f36118ae19e68dc1673f6676e536c7897a0002f9664929631f418c4537d23749220c50a32121c434dcad2a6cdc203cd035a32",
+        "wx" : "5f658687e6a542a91d893b48776a86d528fd399781bbb9305be0797e3a6f36118ae19e68dc1673f6",
+        "wy" : "676e536c7897a0002f9664929631f418c4537d23749220c50a32121c434dcad2a6cdc203cd035a32"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200045f658687e6a542a91d893b48776a86d528fd399781bbb9305be0797e3a6f36118ae19e68dc1673f6676e536c7897a0002f9664929631f418c4537d23749220c50a32121c434dcad2a6cdc203cd035a32",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABF9lhofmpUKpHYk7SHdqhtUo/TmX\ngbu5MFvgeX46bzYRiuGeaNwWc/ZnblNseJegAC+WZJKWMfQYxFN9I3SSIMUKMhIc\nQ03K0qbNwgPNA1oy\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1009,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "305402282fb412f03e6debdfbfa3a3092f21c4619e04279be0931694ab99c6503e5a894def8377ed059a6de8022853bf06e43fcc4236b2ec0d88471379053f1f3437207c5a75b09036b1c40fa8f3128277894a4c96cf",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0490537a6827a25060273d44d4846aea596682df0a59d0ffe79be2a1ebe918703cabfac64da5e591003309180d9da5e78237b95403c52f3ceee503067b672715e97d8b6369342684a72f467698741b1a1f",
+        "wx" : "090537a6827a25060273d44d4846aea596682df0a59d0ffe79be2a1ebe918703cabfac64da5e59100",
+        "wy" : "3309180d9da5e78237b95403c52f3ceee503067b672715e97d8b6369342684a72f467698741b1a1f"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000490537a6827a25060273d44d4846aea596682df0a59d0ffe79be2a1ebe918703cabfac64da5e591003309180d9da5e78237b95403c52f3ceee503067b672715e97d8b6369342684a72f467698741b1a1f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABJBTemgnolBgJz1E1IRq6llmgt8K\nWdD/55vioevpGHA8q/rGTaXlkQAzCRgNnaXngje5VAPFLzzu5QMGe2cnFel9i2Np\nNCaEpy9Gdph0Gxof\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1010,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "3054022843bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061102284674c260123ec53d4b14281f9b55f577532fefe1e7850636646d64ed4f821da32cdb1c73c1973105",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a81ccbf4fc4457033bd49ceac8fa52e459400730b877305be0418153d278d30b5973777a7dd1c2c17544ff1b76208e841053ecaef7a5869e92da08c5c4c3d0a167d5685eb721d620339cc9b00149838e",
+        "wx" : "0a81ccbf4fc4457033bd49ceac8fa52e459400730b877305be0418153d278d30b5973777a7dd1c2c1",
+        "wy" : "7544ff1b76208e841053ecaef7a5869e92da08c5c4c3d0a167d5685eb721d620339cc9b00149838e"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004a81ccbf4fc4457033bd49ceac8fa52e459400730b877305be0418153d278d30b5973777a7dd1c2c17544ff1b76208e841053ecaef7a5869e92da08c5c4c3d0a167d5685eb721d620339cc9b00149838e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABKgcy/T8RFcDO9Sc6sj6UuRZQAcw\nuHcwW+BBgVPSeNMLWXN3en3RwsF1RP8bdiCOhBBT7K73pYaektoIxcTD0KFn1Whe\ntyHWIDOcybABSYOO\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1011,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3054022843bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061102281e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ba160089327cf8ba163eefa476a4eafd0f6ce9d55292f6724d020f0efac54bf684f9d5f5695f89c2b4de70dc4ab265761827323da3b2b055ac1187fc5341e4555ebc6f6993b4c3fdd89863fc55ea38b4",
+        "wx" : "0ba160089327cf8ba163eefa476a4eafd0f6ce9d55292f6724d020f0efac54bf684f9d5f5695f89c2",
+        "wy" : "0b4de70dc4ab265761827323da3b2b055ac1187fc5341e4555ebc6f6993b4c3fdd89863fc55ea38b4"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004ba160089327cf8ba163eefa476a4eafd0f6ce9d55292f6724d020f0efac54bf684f9d5f5695f89c2b4de70dc4ab265761827323da3b2b055ac1187fc5341e4555ebc6f6993b4c3fdd89863fc55ea38b4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABLoWAIkyfPi6Fj7vpHak6v0PbOnV\nUpL2ck0CDw76xUv2hPnV9WlficK03nDcSrJldhgnMj2jsrBVrBGH/FNB5FVevG9p\nk7TD/diYY/xV6ji0\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1012,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3054022843bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061102282a460e39a48c0ff193727e795d339347984ff65457b636ed6f74d627fc8144fb81504445742783d0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044a5cf447550f0ff2efa193c3e185db604fcfd7de5c47a59a392da0c7572f061038c6af5afcfa9bd530b7682b82010c39334ba2edecf0a23bca09e810d745bdf73e445e80ace0e5399fa26102cb3faee6",
+        "wx" : "4a5cf447550f0ff2efa193c3e185db604fcfd7de5c47a59a392da0c7572f061038c6af5afcfa9bd5",
+        "wy" : "30b7682b82010c39334ba2edecf0a23bca09e810d745bdf73e445e80ace0e5399fa26102cb3faee6"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200044a5cf447550f0ff2efa193c3e185db604fcfd7de5c47a59a392da0c7572f061038c6af5afcfa9bd530b7682b82010c39334ba2edecf0a23bca09e810d745bdf73e445e80ace0e5399fa26102cb3faee6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABEpc9EdVDw/y76GTw+GF22BPz9fe\nXEelmjktoMdXLwYQOMavWvz6m9Uwt2grggEMOTNLou3s8KI7ygnoENdFvfc+RF6A\nrODlOZ+iYQLLP67m\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1013,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3055022843bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611022900a91838e692303fc64dc9f9e574ce4d1e613fd9515ed8dbb5bdd3589ff20513ee05411115d09e0f41",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045d3fef1b96dbc8ca9330508ad4ced491e627eb67cba8c6b1537937498ee3021b45ca6759117d89c4ad2b699e3ef9516fff2ed2e134931c96d28d3e14dd51c5b87589a8fa88af2529b8caa0f785ce2033",
+        "wx" : "5d3fef1b96dbc8ca9330508ad4ced491e627eb67cba8c6b1537937498ee3021b45ca6759117d89c4",
+        "wy" : "0ad2b699e3ef9516fff2ed2e134931c96d28d3e14dd51c5b87589a8fa88af2529b8caa0f785ce2033"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b2403030208010109035200045d3fef1b96dbc8ca9330508ad4ced491e627eb67cba8c6b1537937498ee3021b45ca6759117d89c4ad2b699e3ef9516fff2ed2e134931c96d28d3e14dd51c5b87589a8fa88af2529b8caa0f785ce2033",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABF0/7xuW28jKkzBQitTO1JHmJ+tn\ny6jGsVN5N0mO4wIbRcpnWRF9icStK2mePvlRb/8u0uE0kxyW0o0+FN1Rxbh1iaj6\niK8lKbjKoPeFziAz\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1014,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3055022843bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611022900b52c3cf70a58445477eab051464ac05768321fb29c7aa242b9194cab5ebc4c35e10edb72cd3ba2a1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a8336702c158dcae495f1c9cd720c39f15c123a67750dcd74520c34cf67907e49220bcd020cc3a60151a432ee3e23a74c8b8a98d8e7c672216df48d8a60d3f592f6673830ac9ecfbcd00550db7ad5c62",
+        "wx" : "0a8336702c158dcae495f1c9cd720c39f15c123a67750dcd74520c34cf67907e49220bcd020cc3a60",
+        "wy" : "151a432ee3e23a74c8b8a98d8e7c672216df48d8a60d3f592f6673830ac9ecfbcd00550db7ad5c62"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010903520004a8336702c158dcae495f1c9cd720c39f15c123a67750dcd74520c34cf67907e49220bcd020cc3a60151a432ee3e23a74c8b8a98d8e7c672216df48d8a60d3f592f6673830ac9ecfbcd00550db7ad5c62",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABKgzZwLBWNyuSV8cnNcgw58VwSOm\nd1Dc10Ugw0z2eQfkkiC80CDMOmAVGkMu4+I6dMi4qY2OfGciFt9I2KYNP1kvZnOD\nCsns+80AVQ23rVxi\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1015,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "3054022843bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611022853bf06e43fcc4236b2ec0d88471379053f1f3437207c5a75b09036b1c40fa8f3128277894a4c96cf",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1",
+        "wx" : "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611",
+        "wy" : "14fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e2061114fdd05545ec1cc8ab4093247f77275e0743ffed117182eaa9c77877aaac6ac7d35245d1692e8ee1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABEO9fpr7U9i4Uom8xI7lv+byATfR\nCgh+tueHHioQpZnHEK+NDTniBhEU/dBVRewcyKtAkyR/dydeB0P/7RFxguqpx3h3\nqqxqx9NSRdFpLo7h\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1016,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3055022900f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb70002281e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1017,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3055022900ad0b664f9559e29e46fd4fd390e75abebf14997d17a1a3304c80e451fc8f79bb7cff168e17de6f2202281e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611be6076caf0d032ef35fbe53a528ab907f24bcfb9e5828b04a5cb4174cde781612981cce088849f46",
+        "wx" : "43bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611",
+        "wy" : "0be6076caf0d032ef35fbe53a528ab907f24bcfb9e5828b04a5cb4174cde781612981cce088849f46"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000443bd7e9afb53d8b85289bcc48ee5bfe6f20137d10a087eb6e7871e2a10a599c710af8d0d39e20611be6076caf0d032ef35fbe53a528ab907f24bcfb9e5828b04a5cb4174cde781612981cce088849f46",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABEO9fpr7U9i4Uom8xI7lv+byATfR\nCgh+tueHHioQpZnHEK+NDTniBhG+YHbK8NAy7zX75TpSirkH8kvPueWCiwSly0F0\nzeeBYSmBzOCIhJ9G\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1018,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3055022900f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb70002281e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1019,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3055022900ad0b664f9559e29e46fd4fd390e75abebf14997d17a1a3304c80e451fc8f79bb7cff168e17de6f2202281e320a292c640b636951c80d8bb7200e915daff31a147060742ee21c8fca0cb3a58279e87789f070",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048a94164dc7654fda3cd4301d3e972024c2daba71d442128c7f3faecdb9e375a85aa80c4ac28889f258e6cba886d47636548b3bf1b675f2318c3d8ab7a1c281a33241c121b3590bfdf703c7cd4bae8f451886d989234c1b8c589614554d429392",
+        "wx" : "08a94164dc7654fda3cd4301d3e972024c2daba71d442128c7f3faecdb9e375a85aa80c4ac28889f258e6cba886d47636",
+        "wy" : "548b3bf1b675f2318c3d8ab7a1c281a33241c121b3590bfdf703c7cd4bae8f451886d989234c1b8c589614554d429392"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200048a94164dc7654fda3cd4301d3e972024c2daba71d442128c7f3faecdb9e375a85aa80c4ac28889f258e6cba886d47636548b3bf1b675f2318c3d8ab7a1c281a33241c121b3590bfdf703c7cd4bae8f451886d989234c1b8c589614554d429392",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABIqUFk3HZU/aPNQwHT6XICTC2rpx\n1EISjH8/rs2543WoWqgMSsKIifJY5suohtR2NlSLO/G2dfIxjD2Kt6HCgaMyQcEh\ns1kL/fcDx81Lro9FGIbZiSNMG4xYlhRVTUKTkg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1020,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "313233343030",
+          "sig" : "304e021900f39b6bacd3b2eb7bdd98f07a249d57614bbece10480386e80231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046562",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1021,
+          "comment" : "r too large",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b412b1da197fb71123acd3a729901d1a71874700133107ec4d0231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046562",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0473f84ab63789301e88b4cb82cb935decffb8f42b2c9784c7544615b9076ec7a7ab94702ca7f1d9aacfb90537b5d368dc502cb7c8c18285994c7b19fa3e2401fdc26de54ffe006bb79bdd7852c666d730bdf76a16c0792a6c6681ed6b647fc81b",
+        "wx" : "73f84ab63789301e88b4cb82cb935decffb8f42b2c9784c7544615b9076ec7a7ab94702ca7f1d9aacfb90537b5d368dc",
+        "wy" : "502cb7c8c18285994c7b19fa3e2401fdc26de54ffe006bb79bdd7852c666d730bdf76a16c0792a6c6681ed6b647fc81b"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000473f84ab63789301e88b4cb82cb935decffb8f42b2c9784c7544615b9076ec7a7ab94702ca7f1d9aacfb90537b5d368dc502cb7c8c18285994c7b19fa3e2401fdc26de54ffe006bb79bdd7852c666d730bdf76a16c0792a6c6681ed6b647fc81b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABHP4SrY3iTAeiLTLgsuTXez/uPQr\nLJeEx1RGFbkHbsenq5RwLKfx2arPuQU3tdNo3FAst8jBgoWZTHsZ+j4kAf3CbeVP\n/gBrt5vdeFLGZtcwvfdqFsB5Kmxmge1rZH/IGw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1022,
+          "comment" : "r,s are large",
+          "msg" : "313233343030",
+          "sig" : "30660231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90465640231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046563",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04895e8461eddbe21367a95b25cd85cd31e80ecf1f95539056fb7e10b4aa49900b2194d919b29cd9bf373a1d53ef571174767c02e36b935a65e5a9cbb35589a2a018482065c5e33da8ce483dc7f7fe441574f9e7ab0614bdcfc61022c780a30009",
+        "wx" : "0895e8461eddbe21367a95b25cd85cd31e80ecf1f95539056fb7e10b4aa49900b2194d919b29cd9bf373a1d53ef571174",
+        "wy" : "767c02e36b935a65e5a9cbb35589a2a018482065c5e33da8ce483dc7f7fe441574f9e7ab0614bdcfc61022c780a30009"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004895e8461eddbe21367a95b25cd85cd31e80ecf1f95539056fb7e10b4aa49900b2194d919b29cd9bf373a1d53ef571174767c02e36b935a65e5a9cbb35589a2a018482065c5e33da8ce483dc7f7fe441574f9e7ab0614bdcfc61022c780a30009",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABIlehGHt2+ITZ6lbJc2FzTHoDs8f\nlVOQVvt+ELSqSZALIZTZGbKc2b83Oh1T71cRdHZ8AuNrk1pl5anLs1WJoqAYSCBl\nxeM9qM5IPcf3/kQVdPnnqwYUvc/GECLHgKMACQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1023,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0230480eca2874aa6ba71e7fb5711339ac0a7bf84065b3c7d59c64a2c6015e6f794e7dfa2b1fec73a72adb32bdb7dd55cd04",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04618ad81912e4c31f23eab2f0c693b3ef8404074ab1dce01dc82a768151c9fa0393b4d6aeaeec6858d3f419957a5b997f31fa809b1b44677cc5aef1894846142c3e44bba6c471123fa14feb8f3aa9e92f769be549cef9c1d55bc6f1f4f841813d",
+        "wx" : "618ad81912e4c31f23eab2f0c693b3ef8404074ab1dce01dc82a768151c9fa0393b4d6aeaeec6858d3f419957a5b997f",
+        "wy" : "31fa809b1b44677cc5aef1894846142c3e44bba6c471123fa14feb8f3aa9e92f769be549cef9c1d55bc6f1f4f841813d"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004618ad81912e4c31f23eab2f0c693b3ef8404074ab1dce01dc82a768151c9fa0393b4d6aeaeec6858d3f419957a5b997f31fa809b1b44677cc5aef1894846142c3e44bba6c471123fa14feb8f3aa9e92f769be549cef9c1d55bc6f1f4f841813d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGGK2BkS5MMfI+qy8MaTs++EBAdK\nsdzgHcgqdoFRyfoDk7TWrq7saFjT9BmVeluZfzH6gJsbRGd8xa7xiUhGFCw+RLum\nxHESP6FP6486qekvdpvlSc75wdVbxvH0+EGBPQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1024,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe02301629ef2d7182d67b6bd9cf6842251fe09c96bfe022b8ad9a0e546fdc8ecf5dc8636fa13059d7e9d83fde50e0d2b392c8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0479583b4968b576811b567e1620e00b0aab8aa223c5e655b27b1ebeaf83bcd35f4205a5a0e51a2052fffe9fd23785c98f77357c8a1008fcb7a3579614c2ff47980fa9e44b6b5ea3f8a33c919dd2aea5dad0ca1a01a9e2106518b1642906e4f275",
+        "wx" : "79583b4968b576811b567e1620e00b0aab8aa223c5e655b27b1ebeaf83bcd35f4205a5a0e51a2052fffe9fd23785c98f",
+        "wy" : "77357c8a1008fcb7a3579614c2ff47980fa9e44b6b5ea3f8a33c919dd2aea5dad0ca1a01a9e2106518b1642906e4f275"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000479583b4968b576811b567e1620e00b0aab8aa223c5e655b27b1ebeaf83bcd35f4205a5a0e51a2052fffe9fd23785c98f77357c8a1008fcb7a3579614c2ff47980fa9e44b6b5ea3f8a33c919dd2aea5dad0ca1a01a9e2106518b1642906e4f275",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABHlYO0lotXaBG1Z+FiDgCwqriqIj\nxeZVsnsevq+DvNNfQgWloOUaIFL//p/SN4XJj3c1fIoQCPy3o1eWFML/R5gPqeRL\na16j+KM8kZ3SrqXa0MoaAaniEGUYsWQpBuTydQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1025,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0489657bac216c3ac4a3a2d5afd342ad24a4eb103d4dbe2e4461e03c7011826513fe82bd06e17e3ae8eb5811da0bec88bb33ee1eddd5d49dd86e785fbfebb9288661964e6fbe0c07af9a4ba3145fc4be11e5484b650c97096db82ebb0ca2bb84ed",
+        "wx" : "089657bac216c3ac4a3a2d5afd342ad24a4eb103d4dbe2e4461e03c7011826513fe82bd06e17e3ae8eb5811da0bec88bb",
+        "wy" : "33ee1eddd5d49dd86e785fbfebb9288661964e6fbe0c07af9a4ba3145fc4be11e5484b650c97096db82ebb0ca2bb84ed"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000489657bac216c3ac4a3a2d5afd342ad24a4eb103d4dbe2e4461e03c7011826513fe82bd06e17e3ae8eb5811da0bec88bb33ee1eddd5d49dd86e785fbfebb9288661964e6fbe0c07af9a4ba3145fc4be11e5484b650c97096db82ebb0ca2bb84ed",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABIlle6whbDrEo6LVr9NCrSSk6xA9\nTb4uRGHgPHARgmUT/oK9BuF+OujrWBHaC+yIuzPuHt3V1J3Ybnhfv+u5KIZhlk5v\nvgwHr5pLoxRfxL4R5UhLZQyXCW24LrsMoruE7Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1026,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020102",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045876f414fa385b403a2d10da5d89b110344ad005bfaf8c759ab1e3561a39ff0db9ff91ec6040316e2fca3654a48c0e890dcb77f896ea475cb97672a8400329554c941b61b4a84bde1f8c8fc5250c29161fc3ca50458a41c77a48bb336882f2ea",
+        "wx" : "5876f414fa385b403a2d10da5d89b110344ad005bfaf8c759ab1e3561a39ff0db9ff91ec6040316e2fca3654a48c0e89",
+        "wy" : "0dcb77f896ea475cb97672a8400329554c941b61b4a84bde1f8c8fc5250c29161fc3ca50458a41c77a48bb336882f2ea"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200045876f414fa385b403a2d10da5d89b110344ad005bfaf8c759ab1e3561a39ff0db9ff91ec6040316e2fca3654a48c0e890dcb77f896ea475cb97672a8400329554c941b61b4a84bde1f8c8fc5250c29161fc3ca50458a41c77a48bb336882f2ea",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABFh29BT6OFtAOi0Q2l2JsRA0StAF\nv6+MdZqx41YaOf8Nuf+R7GBAMW4vyjZUpIwOiQ3Ld/iW6kdcuXZyqEADKVVMlBth\ntKhL3h+Mj8UlDCkWH8PKUEWKQcd6SLszaILy6g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1027,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020103",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1028,
+          "comment" : "r is larger than n",
+          "msg" : "313233343030",
+          "sig" : "30360231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046566020103",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041bee741fa192a9bd0535d00627737079e98f00076394c978a96a0f9fba64e9e21decff6b4b8fe11f60b18d5d758684de06d19321eab7e8601f8f4606fe93fd3b2f02986a58ca56413282c66dd36ba6724a3cbceee79948ba2d55c756586b58e2",
+        "wx" : "1bee741fa192a9bd0535d00627737079e98f00076394c978a96a0f9fba64e9e21decff6b4b8fe11f60b18d5d758684de",
+        "wy" : "6d19321eab7e8601f8f4606fe93fd3b2f02986a58ca56413282c66dd36ba6724a3cbceee79948ba2d55c756586b58e2"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200041bee741fa192a9bd0535d00627737079e98f00076394c978a96a0f9fba64e9e21decff6b4b8fe11f60b18d5d758684de06d19321eab7e8601f8f4606fe93fd3b2f02986a58ca56413282c66dd36ba6724a3cbceee79948ba2d55c756586b58e2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABBvudB+hkqm9BTXQBidzcHnpjwAH\nY5TJeKlqD5+6ZOniHez/a0uP4R9gsY1ddYaE3gbRkyHqt+hgH49GBv6T/TsvAphq\nWMpWQTKCxm3Ta6ZySjy87ueZSLotVcdWWGtY4g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1029,
+          "comment" : "s is larger than n",
+          "msg" : "313233343030",
+          "sig" : "30360201010231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9173bec",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046b25f8c1629f7579e3c7ee4b029cc029b4bdbed88b9b399303e4a14352d1f3f6048ecdd062d37cba7b70bcbd587231e7621313f93d310f144bd3322582804639dd2960969a993a9f2a3609f856e1415a0a4dcf58a7864e41e2a8c80dfc158a30",
+        "wx" : "6b25f8c1629f7579e3c7ee4b029cc029b4bdbed88b9b399303e4a14352d1f3f6048ecdd062d37cba7b70bcbd587231e7",
+        "wy" : "621313f93d310f144bd3322582804639dd2960969a993a9f2a3609f856e1415a0a4dcf58a7864e41e2a8c80dfc158a30"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200046b25f8c1629f7579e3c7ee4b029cc029b4bdbed88b9b399303e4a14352d1f3f6048ecdd062d37cba7b70bcbd587231e7621313f93d310f144bd3322582804639dd2960969a993a9f2a3609f856e1415a0a4dcf58a7864e41e2a8c80dfc158a30",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGsl+MFin3V548fuSwKcwCm0vb7Y\ni5s5kwPkoUNS0fP2BI7N0GLTfLp7cLy9WHIx52ITE/k9MQ8US9MyJYKARjndKWCW\nmpk6nyo2CfhW4UFaCk3PWKeGTkHiqMgN/BWKMA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1030,
+          "comment" : "small r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303702020101023100896621d23283b12111048d1c978e2c286d60b6ef7ce37af36cf7aa4de268d626de7ddcb356d167c7483c69455c752c93",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045d082cde6086f8ea6994f46e9dc06c1c1d2c3a3c2dc5c97bf137653d9b2ed21101bad843d46e4b7925b9af7034c6d02112c7f56e65d233104063391fb3828b3990e6893d77746e42305e6a5ba111d976d693f595af858f19fac7234f7484c489",
+        "wx" : "5d082cde6086f8ea6994f46e9dc06c1c1d2c3a3c2dc5c97bf137653d9b2ed21101bad843d46e4b7925b9af7034c6d021",
+        "wy" : "12c7f56e65d233104063391fb3828b3990e6893d77746e42305e6a5ba111d976d693f595af858f19fac7234f7484c489"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200045d082cde6086f8ea6994f46e9dc06c1c1d2c3a3c2dc5c97bf137653d9b2ed21101bad843d46e4b7925b9af7034c6d02112c7f56e65d233104063391fb3828b3990e6893d77746e42305e6a5ba111d976d693f595af858f19fac7234f7484c489",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABF0ILN5ghvjqaZT0bp3AbBwdLDo8\nLcXJe/E3ZT2bLtIRAbrYQ9RuS3klua9wNMbQIRLH9W5l0jMQQGM5H7OCizmQ5ok9\nd3RuQjBealuhEdl21pP1la+Fjxn6xyNPdITEiQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1031,
+          "comment" : "smallish r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "303b02072d9b4d347952cc023038e8dae216c63f06b3edbd0f9ba7a5e4a332ec187251e3d627839d1baac667d7caad2ab0a1ea9fbb12dc5a71e3b49bc9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047407ca6c2a183f9ca1376609e9c78a8d080effad15a4f63cbb7a168e3c789b8b59ce4d3122ca08a86907ba487f717fbc3e2c56a9b3460a5136b213be8d48cb3dc9c7ad945b1dcecbf93fa6cfaaf8dbd70f1040b97ad8e3ac30f2e64fd7cc76d6",
+        "wx" : "7407ca6c2a183f9ca1376609e9c78a8d080effad15a4f63cbb7a168e3c789b8b59ce4d3122ca08a86907ba487f717fbc",
+        "wy" : "3e2c56a9b3460a5136b213be8d48cb3dc9c7ad945b1dcecbf93fa6cfaaf8dbd70f1040b97ad8e3ac30f2e64fd7cc76d6"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200047407ca6c2a183f9ca1376609e9c78a8d080effad15a4f63cbb7a168e3c789b8b59ce4d3122ca08a86907ba487f717fbc3e2c56a9b3460a5136b213be8d48cb3dc9c7ad945b1dcecbf93fa6cfaaf8dbd70f1040b97ad8e3ac30f2e64fd7cc76d6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABHQHymwqGD+coTdmCenHio0IDv+t\nFaT2PLt6Fo48eJuLWc5NMSLKCKhpB7pIf3F/vD4sVqmzRgpRNrITvo1Iyz3Jx62U\nWx3Oy/k/ps+q+NvXDxBAuXrY46ww8uZP18x21g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1032,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "313233343030",
+          "sig" : "3041020d1033e67e37b32b445580bf4efc02300d2436a599b396a51c546e05d1c3d25a8f6d05935ae5031dad3cdd7cb36cf6912a433de28f8475d3b1e2e1ce77610879",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044fc32a5226820ec9c3fff2c74e0b36d7de028e59fc005f3807a3bd59892c9ad20dba7168ef9ed9bf99b25ed01bcfc6ca6a13da2e852777a6f99d04322a1b9fb4227684bf7c40d4d3ef92798003a3bf2da158d5686457c33d0e24be5c265fc473",
+        "wx" : "4fc32a5226820ec9c3fff2c74e0b36d7de028e59fc005f3807a3bd59892c9ad20dba7168ef9ed9bf99b25ed01bcfc6ca",
+        "wy" : "6a13da2e852777a6f99d04322a1b9fb4227684bf7c40d4d3ef92798003a3bf2da158d5686457c33d0e24be5c265fc473"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200044fc32a5226820ec9c3fff2c74e0b36d7de028e59fc005f3807a3bd59892c9ad20dba7168ef9ed9bf99b25ed01bcfc6ca6a13da2e852777a6f99d04322a1b9fb4227684bf7c40d4d3ef92798003a3bf2da158d5686457c33d0e24be5c265fc473",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABE/DKlImgg7Jw//yx04LNtfeAo5Z\n/ABfOAejvVmJLJrSDbpxaO+e2b+Zsl7QG8/GymoT2i6FJ3em+Z0EMiobn7QidoS/\nfEDU0++SeYADo78toVjVaGRXwz0OJL5cJl/Ecw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1033,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "313233343030",
+          "sig" : "30360202010102304a289adad7ceec67ae99ef5da797b6bb17d9c168428ab30ea9a68b89652c4b9e9bae876ab3d7fbdf1eb92ed422bd3b93",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047350a7d00d7719a318522ef4c5e6be24b3b2cb300c596f79e8dd31a4688fe65a54b2d7497a06821eecbaf31b2fa7cdcb4bd72fc7f05e32457fda0cc3f321157744f1841c30bd086e6ddd5bf415eb71ecbe36f0f3fd23d3c41487fb283e0e9794",
+        "wx" : "7350a7d00d7719a318522ef4c5e6be24b3b2cb300c596f79e8dd31a4688fe65a54b2d7497a06821eecbaf31b2fa7cdcb",
+        "wy" : "4bd72fc7f05e32457fda0cc3f321157744f1841c30bd086e6ddd5bf415eb71ecbe36f0f3fd23d3c41487fb283e0e9794"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200047350a7d00d7719a318522ef4c5e6be24b3b2cb300c596f79e8dd31a4688fe65a54b2d7497a06821eecbaf31b2fa7cdcb4bd72fc7f05e32457fda0cc3f321157744f1841c30bd086e6ddd5bf415eb71ecbe36f0f3fd23d3c41487fb283e0e9794",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABHNQp9ANdxmjGFIu9MXmviSzsssw\nDFlveejdMaRoj+ZaVLLXSXoGgh7suvMbL6fNy0vXL8fwXjJFf9oMw/MhFXdE8YQc\nML0Ibm3dW/QV63Hsvjbw8/0j08QUh/soPg6XlA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1034,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3041020d062522bbd3ecbe7c39e93e7c2402304a289adad7ceec67ae99ef5da797b6bb17d9c168428ab30ea9a68b89652c4b9e9bae876ab3d7fbdf1eb92ed422bd3b93",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0461498ad31a84eed102ba2712eb8a7bd92320bda4ac6d07b4326a30869d19eb1b96229d21efd711dcf73048bf166800e30cfcc13a0914132284dbeab6fcf5d70b34ca86a681157e4874abffaeebb69b8b71f69d332306567823dde5407ce739e8",
+        "wx" : "61498ad31a84eed102ba2712eb8a7bd92320bda4ac6d07b4326a30869d19eb1b96229d21efd711dcf73048bf166800e3",
+        "wy" : "0cfcc13a0914132284dbeab6fcf5d70b34ca86a681157e4874abffaeebb69b8b71f69d332306567823dde5407ce739e8"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000461498ad31a84eed102ba2712eb8a7bd92320bda4ac6d07b4326a30869d19eb1b96229d21efd711dcf73048bf166800e30cfcc13a0914132284dbeab6fcf5d70b34ca86a681157e4874abffaeebb69b8b71f69d332306567823dde5407ce739e8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGFJitMahO7RAronEuuKe9kjIL2k\nrG0HtDJqMIadGesbliKdIe/XEdz3MEi/FmgA4wz8wToJFBMihNvqtvz11ws0yoam\ngRV+SHSr/67rtpuLcfadMyMGVngj3eVAfOc56A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1035,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "313233343030",
+          "sig" : "30650231008cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e90464e502305dd0bf01c2259e1ab4e8f4fee099813f6374f6069e3839ccbf64499dc802c3c534d1cf1f9cffd76027b021574602ee43",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04050592f34db0263df4c669b8991941be18237a1045bfd165ea4af385376564edf6654a0dff7b5d84474090f265c46b511545918cd8f22260ce21a584edfa0b1644488c997d956529262aef400cc0320ed27ddcec3bde6b9fd79b374af688fa9f",
+        "wx" : "50592f34db0263df4c669b8991941be18237a1045bfd165ea4af385376564edf6654a0dff7b5d84474090f265c46b51",
+        "wy" : "1545918cd8f22260ce21a584edfa0b1644488c997d956529262aef400cc0320ed27ddcec3bde6b9fd79b374af688fa9f"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004050592f34db0263df4c669b8991941be18237a1045bfd165ea4af385376564edf6654a0dff7b5d84474090f265c46b511545918cd8f22260ce21a584edfa0b1644488c997d956529262aef400cc0320ed27ddcec3bde6b9fd79b374af688fa9f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABAUFkvNNsCY99MZpuJkZQb4YI3oQ\nRb/RZepK84U3ZWTt9mVKDf97XYRHQJDyZcRrURVFkYzY8iJgziGlhO36CxZESIyZ\nfZVlKSYq70AMwDIO0n3c7Dvea5/XmzdK9oj6nw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1036,
+          "comment" : "s == 1",
+          "msg" : "313233343030",
+          "sig" : "303502302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1037,
+          "comment" : "s == 0",
+          "msg" : "313233343030",
+          "sig" : "303502302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044df898544c2b10dc3c4d3249fca5130e753d26e08320bd823926acb050d8b6a4feadf29bef07ecdb00e85b341f22069a003343695d1e0ac0a78b38490d97c1e90e4ff4ca0d2140b9101f1b63f29ca4f2bf9176e1600483916216bd35abce6741",
+        "wx" : "4df898544c2b10dc3c4d3249fca5130e753d26e08320bd823926acb050d8b6a4feadf29bef07ecdb00e85b341f22069a",
+        "wy" : "3343695d1e0ac0a78b38490d97c1e90e4ff4ca0d2140b9101f1b63f29ca4f2bf9176e1600483916216bd35abce6741"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200044df898544c2b10dc3c4d3249fca5130e753d26e08320bd823926acb050d8b6a4feadf29bef07ecdb00e85b341f22069a003343695d1e0ac0a78b38490d97c1e90e4ff4ca0d2140b9101f1b63f29ca4f2bf9176e1600483916216bd35abce6741",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABE34mFRMKxDcPE0ySfylEw51PSbg\ngyC9gjkmrLBQ2Lak/q3ym+8H7NsA6Fs0HyIGmgAzQ2ldHgrAp4s4SQ2XwekOT/TK\nDSFAuRAfG2PynKTyv5F24WAEg5FiFr01q85nQQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1038,
+          "comment" : "point at infinity during verify",
+          "msg" : "313233343030",
+          "sig" : "30640230465c8f41519c369407aeb7bf287320ef8a97b884f6aa2b598f8b3736560212d3e79d5b57b5bfe1881dc41901748232b202302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045d77134e890ac72f9c69fcc3f181ae746fefffdafc1dfc791cf33a22fb0f8e586188cf2d5d060ddb04004baf56191c9f0e7401ddcc47a09b5ecf2719cc936010a9371a7f7624e63e7a00550a13d035cf586d3b522c7fd06251adbb0f0aad3dd7",
+        "wx" : "5d77134e890ac72f9c69fcc3f181ae746fefffdafc1dfc791cf33a22fb0f8e586188cf2d5d060ddb04004baf56191c9f",
+        "wy" : "0e7401ddcc47a09b5ecf2719cc936010a9371a7f7624e63e7a00550a13d035cf586d3b522c7fd06251adbb0f0aad3dd7"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200045d77134e890ac72f9c69fcc3f181ae746fefffdafc1dfc791cf33a22fb0f8e586188cf2d5d060ddb04004baf56191c9f0e7401ddcc47a09b5ecf2719cc936010a9371a7f7624e63e7a00550a13d035cf586d3b522c7fd06251adbb0f0aad3dd7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABF13E06JCscvnGn8w/GBrnRv7//a\n/B38eRzzOiL7D45YYYjPLV0GDdsEAEuvVhkcnw50Ad3MR6CbXs8nGcyTYBCpNxp/\ndiTmPnoAVQoT0DXPWG07Uix/0GJRrbsPCq091w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1039,
+          "comment" : "u1 == 1",
+          "msg" : "313233343030",
+          "sig" : "306502302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04607cd94c42f5bbfcf857a708ac163f0afc0a65c8d88725f18c4bf7eb7cf5d34aca6008a27b4e5fd9476134ed85fcd32c89f248290c59b8fb963e90bab9b0b3e313d3b8e0a6c8901455a22b7b74a108152c5b814ba575de8de07cdb8d67ba2b50",
+        "wx" : "607cd94c42f5bbfcf857a708ac163f0afc0a65c8d88725f18c4bf7eb7cf5d34aca6008a27b4e5fd9476134ed85fcd32c",
+        "wy" : "089f248290c59b8fb963e90bab9b0b3e313d3b8e0a6c8901455a22b7b74a108152c5b814ba575de8de07cdb8d67ba2b50"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004607cd94c42f5bbfcf857a708ac163f0afc0a65c8d88725f18c4bf7eb7cf5d34aca6008a27b4e5fd9476134ed85fcd32c89f248290c59b8fb963e90bab9b0b3e313d3b8e0a6c8901455a22b7b74a108152c5b814ba575de8de07cdb8d67ba2b50",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGB82UxC9bv8+FenCKwWPwr8CmXI\n2Icl8YxL9+t89dNKymAIontOX9lHYTTthfzTLInySCkMWbj7lj6Qurmws+MT07jg\npsiQFFWiK3t0oQgVLFuBS6V13o3gfNuNZ7orUA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1040,
+          "comment" : "u1 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "306402302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba301772102301fc115146e521d7ea33f3e128eb01db0f653dc45852c2b50301d639b778b13380e51d9366552cf2049156605d57adffc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044b4afbd91746b1a4df6d0d717afc7528fa4a9dda9a62afee19a72fc0019aa2ea89a125bea7675506230656caaff52c735f5c3575bf669637efdb672477500f1fe37b45dcf879487ad6ca36c4147329fb741706ce9b928ce47bf6dc0f9e44017f",
+        "wx" : "4b4afbd91746b1a4df6d0d717afc7528fa4a9dda9a62afee19a72fc0019aa2ea89a125bea7675506230656caaff52c73",
+        "wy" : "5f5c3575bf669637efdb672477500f1fe37b45dcf879487ad6ca36c4147329fb741706ce9b928ce47bf6dc0f9e44017f"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200044b4afbd91746b1a4df6d0d717afc7528fa4a9dda9a62afee19a72fc0019aa2ea89a125bea7675506230656caaff52c735f5c3575bf669637efdb672477500f1fe37b45dcf879487ad6ca36c4147329fb741706ce9b928ce47bf6dc0f9e44017f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABEtK+9kXRrGk320NcXr8dSj6Sp3a\nmmKv7hmnL8ABmqLqiaElvqdnVQYjBlbKr/Usc19cNXW/ZpY379tnJHdQDx/je0Xc\n+HlIetbKNsQUcyn7dBcGzpuSjOR79twPnkQBfw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1041,
+          "comment" : "u2 == 1",
+          "msg" : "313233343030",
+          "sig" : "306402302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba301772102302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040d8b246c623188b7455716ac189b9af441676a1c41cd575754bd02ae4d6825304b961ddf0826bb161e3d63e9bc71f1d46edbeddc2d40dafdccac90ae85cd616a0ea1e4a08ae8fc3358ce7d5142eee8f3bebdc14591c4c9b15bff12b8cf08334a",
+        "wx" : "0d8b246c623188b7455716ac189b9af441676a1c41cd575754bd02ae4d6825304b961ddf0826bb161e3d63e9bc71f1d4",
+        "wy" : "6edbeddc2d40dafdccac90ae85cd616a0ea1e4a08ae8fc3358ce7d5142eee8f3bebdc14591c4c9b15bff12b8cf08334a"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200040d8b246c623188b7455716ac189b9af441676a1c41cd575754bd02ae4d6825304b961ddf0826bb161e3d63e9bc71f1d46edbeddc2d40dafdccac90ae85cd616a0ea1e4a08ae8fc3358ce7d5142eee8f3bebdc14591c4c9b15bff12b8cf08334a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABA2LJGxiMYi3RVcWrBibmvRBZ2oc\nQc1XV1S9Aq5NaCUwS5Yd3wgmuxYePWPpvHHx1G7b7dwtQNr9zKyQroXNYWoOoeSg\niuj8M1jOfVFC7ujzvr3BRZHEybFb/xK4zwgzSg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1042,
+          "comment" : "u2 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "306402302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba301772102305dd0bf01c2259e1ab4e8f4fee099813f6374f6069e3839ccbf64499dc802c3c534d1cf1f9cffd76027b021574602ee44",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0404d9d4a62d6eb02073e738b1e439cecd5440031911f45190eb6062a33535fc5269bcfc25d4afc1dae0ebad948d7732d8029af37e89a3cea7df38b020f624906fca6d944e1486853fe8e5ba9cfba2d74a852ec587d46fe49917c364418ef7eca5",
+        "wx" : "4d9d4a62d6eb02073e738b1e439cecd5440031911f45190eb6062a33535fc5269bcfc25d4afc1dae0ebad948d7732d8",
+        "wy" : "29af37e89a3cea7df38b020f624906fca6d944e1486853fe8e5ba9cfba2d74a852ec587d46fe49917c364418ef7eca5"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000404d9d4a62d6eb02073e738b1e439cecd5440031911f45190eb6062a33535fc5269bcfc25d4afc1dae0ebad948d7732d8029af37e89a3cea7df38b020f624906fca6d944e1486853fe8e5ba9cfba2d74a852ec587d46fe49917c364418ef7eca5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABATZ1KYtbrAgc+c4seQ5zs1UQAMZ\nEfRRkOtgYqM1NfxSabz8JdSvwdrg662UjXcy2AKa836Jo86n3ziwIPYkkG/KbZRO\nFIaFP+jlupz7otdKhS7Fh9Rv5JkXw2RBjvfspQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1043,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0230533b0d50480a3ef07e7e8af8b1097759bc03ac9a1c7ed6075a052869f57f12b285613162d08ee7aab9fe54aaa984a39a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041a4a55c9b0ce43d7ed78a98d9bf6459ccf349466fccc457598fc15a1d6956d8ce8348b2332fffb3d516b078d28d329dd73f45a4ce1f5dc772f3c3283af6564e6e410f9d5064b6484065966936693f62ac9940eb28914a091d2964cd843b41028",
+        "wx" : "1a4a55c9b0ce43d7ed78a98d9bf6459ccf349466fccc457598fc15a1d6956d8ce8348b2332fffb3d516b078d28d329dd",
+        "wy" : "73f45a4ce1f5dc772f3c3283af6564e6e410f9d5064b6484065966936693f62ac9940eb28914a091d2964cd843b41028"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200041a4a55c9b0ce43d7ed78a98d9bf6459ccf349466fccc457598fc15a1d6956d8ce8348b2332fffb3d516b078d28d329dd73f45a4ce1f5dc772f3c3283af6564e6e410f9d5064b6484065966936693f62ac9940eb28914a091d2964cd843b41028",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABBpKVcmwzkPX7XipjZv2RZzPNJRm\n/MxFdZj8FaHWlW2M6DSLIzL/+z1RaweNKNMp3XP0Wkzh9dx3Lzwyg69lZObkEPnV\nBktkhAZZZpNmk/YqyZQOsokUoJHSlkzYQ7QQKA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1044,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023070a8e817f4ea82b831ba5e671830b4312846b23da14ff7d43baf3a7ee7aa061c86422aaf27ffc5c655406868b5bf19bf",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04373ac98f088268a86d136de4fa0ce2c41042cd33ed2d07250f53cd4ed43fa1da425da597bd5b413d56cfff954267104f069e0453bbbd79280316f8c1c161a846af379a941ed286e593e7f289ba4fff42458b273a3ba499574e134e7fb4a7dc19",
+        "wx" : "373ac98f088268a86d136de4fa0ce2c41042cd33ed2d07250f53cd4ed43fa1da425da597bd5b413d56cfff954267104f",
+        "wy" : "69e0453bbbd79280316f8c1c161a846af379a941ed286e593e7f289ba4fff42458b273a3ba499574e134e7fb4a7dc19"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004373ac98f088268a86d136de4fa0ce2c41042cd33ed2d07250f53cd4ed43fa1da425da597bd5b413d56cfff954267104f069e0453bbbd79280316f8c1c161a846af379a941ed286e593e7f289ba4fff42458b273a3ba499574e134e7fb4a7dc19",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABDc6yY8IgmiobRNt5PoM4sQQQs0z\n7S0HJQ9TzU7UP6HaQl2ll71bQT1Wz/+VQmcQTwaeBFO7vXkoAxb4wcFhqEavN5qU\nHtKG5ZPn8om6T/9CRYsnOjukmVdOE05/tKfcGQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1045,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0230326c0872a7224e7a104087acf4c4b4e3e5aba4ffe4625fc3955ce9647bf71fb596b83971ad2b52473a2821991c808905",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047e6ab429b9e33a974f6ab9a49eb152c484575fad5d9bcddcb87edce16e79333a937276f36aec9121de450384cb20bb2e8595f6c2880d89198e1b625e65056d0a19a58d1d1c551bcc5dd39d281d726dad4108488c8f941ac983169cace3ecc71b",
+        "wx" : "7e6ab429b9e33a974f6ab9a49eb152c484575fad5d9bcddcb87edce16e79333a937276f36aec9121de450384cb20bb2e",
+        "wy" : "08595f6c2880d89198e1b625e65056d0a19a58d1d1c551bcc5dd39d281d726dad4108488c8f941ac983169cace3ecc71b"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200047e6ab429b9e33a974f6ab9a49eb152c484575fad5d9bcddcb87edce16e79333a937276f36aec9121de450384cb20bb2e8595f6c2880d89198e1b625e65056d0a19a58d1d1c551bcc5dd39d281d726dad4108488c8f941ac983169cace3ecc71b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABH5qtCm54zqXT2q5pJ6xUsSEV1+t\nXZvN3Lh+3OFueTM6k3J282rskSHeRQOEyyC7LoWV9sKIDYkZjhtiXmUFbQoZpY0d\nHFUbzF3TnSgdcm2tQQhIjI+UGsmDFpys4+zHGw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1046,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023065cf0a5bce70af078af6d5a14545ca619e47d6eb0fd0531ecc743a7685530284a83289c2d09e024384ae5e778799e414",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041fbb37f75195c3f2de3afcc88ad7eb32108144608943face3a890005ff2a3e0b558079c5842620f44adc0c38dd88aac551734f8eb827df929d7317714a29cf8ba432caf689094d00eb9d63cbc908ba76ca5b1f93d229477c960842940f4224d3",
+        "wx" : "1fbb37f75195c3f2de3afcc88ad7eb32108144608943face3a890005ff2a3e0b558079c5842620f44adc0c38dd88aac5",
+        "wy" : "51734f8eb827df929d7317714a29cf8ba432caf689094d00eb9d63cbc908ba76ca5b1f93d229477c960842940f4224d3"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200041fbb37f75195c3f2de3afcc88ad7eb32108144608943face3a890005ff2a3e0b558079c5842620f44adc0c38dd88aac551734f8eb827df929d7317714a29cf8ba432caf689094d00eb9d63cbc908ba76ca5b1f93d229477c960842940f4224d3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABB+7N/dRlcPy3jr8yIrX6zIQgURg\niUP6zjqJAAX/Kj4LVYB5xYQmIPRK3Aw43YiqxVFzT464J9+SnXMXcUopz4ukMsr2\niQlNAOudY8vJCLp2ylsfk9IpR3yWCEKUD0Ik0w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1047,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02302e099adfe4d9120596e8a1520399b0e249555b171e0a71967307548a3c28753fa40bbcb0a8658369dc8ca0caa05fb001",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0407fa30c837c8ad029326a1d448bd27521b5d26aad4d8244b7242493df70172e6dd1daf5c7e07f4fa102f5c415a4ec61f0904527df877527f7d0f5a7f71b6d9c03f2de1df8804868e7337da35c9b1ffc9bf2e279c3af8a0786e6f39832cc6ed1b",
+        "wx" : "7fa30c837c8ad029326a1d448bd27521b5d26aad4d8244b7242493df70172e6dd1daf5c7e07f4fa102f5c415a4ec61f",
+        "wy" : "0904527df877527f7d0f5a7f71b6d9c03f2de1df8804868e7337da35c9b1ffc9bf2e279c3af8a0786e6f39832cc6ed1b"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000407fa30c837c8ad029326a1d448bd27521b5d26aad4d8244b7242493df70172e6dd1daf5c7e07f4fa102f5c415a4ec61f0904527df877527f7d0f5a7f71b6d9c03f2de1df8804868e7337da35c9b1ffc9bf2e279c3af8a0786e6f39832cc6ed1b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABAf6MMg3yK0Ckyah1Ei9J1IbXSaq\n1NgkS3JCST33AXLm3R2vXH4H9PoQL1xBWk7GHwkEUn34d1J/fQ9af3G22cA/LeHf\niASGjnM32jXJsf/Jvy4nnDr4oHhubzmDLMbtGw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1048,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02305c1335bfc9b2240b2dd142a4073361c492aab62e3c14e32ce60ea9147850ea7f4817796150cb06d3b919419540bf6002",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0461397ae7fe8e7e894bfa689e5813514293a0f1b9f1090c0d9696379b61287a752a3f7d1d2480fe4127498d0eeda84c630c2fadd37ea36bfe532b5d3a0f101ddd3ac59458399648f3efaf5833dec1c8c8ece05515893553ef4d58120d37ce2ecd",
+        "wx" : "61397ae7fe8e7e894bfa689e5813514293a0f1b9f1090c0d9696379b61287a752a3f7d1d2480fe4127498d0eeda84c63",
+        "wy" : "0c2fadd37ea36bfe532b5d3a0f101ddd3ac59458399648f3efaf5833dec1c8c8ece05515893553ef4d58120d37ce2ecd"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000461397ae7fe8e7e894bfa689e5813514293a0f1b9f1090c0d9696379b61287a752a3f7d1d2480fe4127498d0eeda84c630c2fadd37ea36bfe532b5d3a0f101ddd3ac59458399648f3efaf5833dec1c8c8ece05515893553ef4d58120d37ce2ecd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGE5euf+jn6JS/ponlgTUUKToPG5\n8QkMDZaWN5thKHp1Kj99HSSA/kEnSY0O7ahMYwwvrdN+o2v+UytdOg8QHd06xZRY\nOZZI8++vWDPewcjI7OBVFYk1U+9NWBINN84uzQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1049,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0230259160b321c350f4f2299aa77c72a09248927957b6414308bf8c7fb4f2dbba5ca79198f80a150e1ceb5a9845144eee9b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047f166efa8d8416d922f57673a2180cfbb49e8d160d60ba5ec90ba547f3eccd22ce6afd99a0fb292cfd16b0692b9cab03418579e67c87b359912f6cb4158bdd7ea130b5007726df2fce319915deedc4f7e89ee23f786e25373c9937498bab81b4",
+        "wx" : "7f166efa8d8416d922f57673a2180cfbb49e8d160d60ba5ec90ba547f3eccd22ce6afd99a0fb292cfd16b0692b9cab03",
+        "wy" : "418579e67c87b359912f6cb4158bdd7ea130b5007726df2fce319915deedc4f7e89ee23f786e25373c9937498bab81b4"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200047f166efa8d8416d922f57673a2180cfbb49e8d160d60ba5ec90ba547f3eccd22ce6afd99a0fb292cfd16b0692b9cab03418579e67c87b359912f6cb4158bdd7ea130b5007726df2fce319915deedc4f7e89ee23f786e25373c9937498bab81b4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABH8WbvqNhBbZIvV2c6IYDPu0no0W\nDWC6XskLpUfz7M0izmr9maD7KSz9FrBpK5yrA0GFeeZ8h7NZkS9stBWL3X6hMLUA\ndybfL84xmRXe7cT36J7iP3huJTc8mTdJi6uBtA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1050,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023100881964e1bba9a28c7a1d84379c65bb3da72f3cc879f7f579d2f9b34a574432d6c7d1c229ee227d4ddbdd9f15df9978c0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0477c9c2e658b004ab6840d7c33a5e7eb5f93ba3a7c5b32f7275fd75b07c1c92f5ae31576b9cbca046337e6d6ea76c145e67c56010dd9749e2d90b3eb57ef1c4c73741233a32a6a4355b8c4e3a24bcf5986627c7480783161db1d2a5332bd75fef",
+        "wx" : "77c9c2e658b004ab6840d7c33a5e7eb5f93ba3a7c5b32f7275fd75b07c1c92f5ae31576b9cbca046337e6d6ea76c145e",
+        "wy" : "67c56010dd9749e2d90b3eb57ef1c4c73741233a32a6a4355b8c4e3a24bcf5986627c7480783161db1d2a5332bd75fef"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000477c9c2e658b004ab6840d7c33a5e7eb5f93ba3a7c5b32f7275fd75b07c1c92f5ae31576b9cbca046337e6d6ea76c145e67c56010dd9749e2d90b3eb57ef1c4c73741233a32a6a4355b8c4e3a24bcf5986627c7480783161db1d2a5332bd75fef",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABHfJwuZYsASraEDXwzpefrX5O6On\nxbMvcnX9dbB8HJL1rjFXa5y8oEYzfm1up2wUXmfFYBDdl0ni2Qs+tX7xxMc3QSM6\nMqakNVuMTjokvPWYZifHSAeDFh2x0qUzK9df7w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1051,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02300e3c83bb59abc57220170152251cf010b0081fecca2c957ca7ec1a33dae3ca1d7094b1c0f71b03e008bbe64659119f09",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0464d9a317d5b41af30fdfc7389460f357fa9978304d026b312aa5ca04a19bdc0c56440cfd14a0b060c3b8f4ee8d4a5a3777299b2280ab4c857ed2531e8db027f8c7238028bd7f7ba59bc80547d4f10da6f2e613580553406f0427ecbd7b75916e",
+        "wx" : "64d9a317d5b41af30fdfc7389460f357fa9978304d026b312aa5ca04a19bdc0c56440cfd14a0b060c3b8f4ee8d4a5a37",
+        "wy" : "77299b2280ab4c857ed2531e8db027f8c7238028bd7f7ba59bc80547d4f10da6f2e613580553406f0427ecbd7b75916e"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000464d9a317d5b41af30fdfc7389460f357fa9978304d026b312aa5ca04a19bdc0c56440cfd14a0b060c3b8f4ee8d4a5a3777299b2280ab4c857ed2531e8db027f8c7238028bd7f7ba59bc80547d4f10da6f2e613580553406f0427ecbd7b75916e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGTZoxfVtBrzD9/HOJRg81f6mXgw\nTQJrMSqlygShm9wMVkQM/RSgsGDDuPTujUpaN3cpmyKAq0yFftJTHo2wJ/jHI4Ao\nvX97pZvIBUfU8Q2m8uYTWAVTQG8EJ+y9e3WRbg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1052,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0230631b97da7f334dafd01e2a01f8618632372d9abcdf14ebaf7213da37b1449c4e8c8a1dfe03384f3ade8907ad94421398",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04264ba447f80d721bf1e79877f27a23ee58565e88c49f6b9cd6448c024b6ff53aebb2b08cec22eb2eb38e30fd54727f01801887f9f94dce625ed1d56350a4b252e0dcfc0984928f25ad22a13135baf996bfa82809fbe79c0979670fddc9fba9e6",
+        "wx" : "264ba447f80d721bf1e79877f27a23ee58565e88c49f6b9cd6448c024b6ff53aebb2b08cec22eb2eb38e30fd54727f01",
+        "wy" : "0801887f9f94dce625ed1d56350a4b252e0dcfc0984928f25ad22a13135baf996bfa82809fbe79c0979670fddc9fba9e6"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004264ba447f80d721bf1e79877f27a23ee58565e88c49f6b9cd6448c024b6ff53aebb2b08cec22eb2eb38e30fd54727f01801887f9f94dce625ed1d56350a4b252e0dcfc0984928f25ad22a13135baf996bfa82809fbe79c0979670fddc9fba9e6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABCZLpEf4DXIb8eeYd/J6I+5YVl6I\nxJ9rnNZEjAJLb/U667KwjOwi6y6zjjD9VHJ/AYAYh/n5Tc5iXtHVY1CkslLg3PwJ\nhJKPJa0ioTE1uvmWv6goCfvnnAl5Zw/dyfup5g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1053,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0230397e11325b2e2e3790dee4859fdcca85592bc46fd0d580abc5114602b68512f549d9854c9af0db658189dd583f7fc1cb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0404918040a58dc477a7245561273df2d8bd977e5fd39c40d3011536cb2b9cfee82e2ab5f539e5908dcbf3ff24c645db4e5969a9d8df5cdaafe3490caa4946acf5ebe3e93aab28a8d4a6f61e2c8e5c02dc605c75806dddddebe23915631159c1f7",
+        "wx" : "4918040a58dc477a7245561273df2d8bd977e5fd39c40d3011536cb2b9cfee82e2ab5f539e5908dcbf3ff24c645db4e",
+        "wy" : "5969a9d8df5cdaafe3490caa4946acf5ebe3e93aab28a8d4a6f61e2c8e5c02dc605c75806dddddebe23915631159c1f7"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000404918040a58dc477a7245561273df2d8bd977e5fd39c40d3011536cb2b9cfee82e2ab5f539e5908dcbf3ff24c645db4e5969a9d8df5cdaafe3490caa4946acf5ebe3e93aab28a8d4a6f61e2c8e5c02dc605c75806dddddebe23915631159c1f7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABASRgECljcR3pyRVYSc98ti9l35f\n05xA0wEVNssrnP7oLiq19TnlkI3L8/8kxkXbTllpqdjfXNqv40kMqklGrPXr4+k6\nqyio1Kb2HiyOXALcYFx1gG3d3eviORVjEVnB9w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1054,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02300fe08a8a37290ebf519f9f0947580ed87b29ee22c29615a8180eb1cdbbc5899c0728ec9b32a96790248ab302eabd6ffe",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0422e44ebe0a351e4c91f7bdfc0c0c3c6e1c679da84a32539c2dbb41ea31061b0825e3f34d7b0ad525261eb9e457c408196089e33034731ba8e9f95f5a234bf8d3539c8381f4d95510d5e0f145fd48205e5c60218c3f84b189c8e4fd5608b49778",
+        "wx" : "22e44ebe0a351e4c91f7bdfc0c0c3c6e1c679da84a32539c2dbb41ea31061b0825e3f34d7b0ad525261eb9e457c40819",
+        "wy" : "6089e33034731ba8e9f95f5a234bf8d3539c8381f4d95510d5e0f145fd48205e5c60218c3f84b189c8e4fd5608b49778"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000422e44ebe0a351e4c91f7bdfc0c0c3c6e1c679da84a32539c2dbb41ea31061b0825e3f34d7b0ad525261eb9e457c408196089e33034731ba8e9f95f5a234bf8d3539c8381f4d95510d5e0f145fd48205e5c60218c3f84b189c8e4fd5608b49778",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABCLkTr4KNR5Mkfe9/AwMPG4cZ52o\nSjJTnC27QeoxBhsIJePzTXsK1SUmHrnkV8QIGWCJ4zA0cxuo6flfWiNL+NNTnIOB\n9NlVENXg8UX9SCBeXGAhjD+EsYnI5P1WCLSXeA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1055,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02305f92937aa52d5dd10fcefb95a2d57b617d6d8b04e8db5b3b5a39abe893fda2aeb2f978108c558aabbad829ce02c27735",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0466ed49779ed6a7b10c812bc7ee7b47a5d11c5ea50277273da140bc1b0cf5b8210a6a737f7e9d92eee6d845137e5c44a28accb8f637385cf6519bfae3ed3ae4d0acaa19a260a01bd8cb53ad24dacab1954b20d1472cf3975e87cc733f329ab6bd",
+        "wx" : "66ed49779ed6a7b10c812bc7ee7b47a5d11c5ea50277273da140bc1b0cf5b8210a6a737f7e9d92eee6d845137e5c44a2",
+        "wy" : "08accb8f637385cf6519bfae3ed3ae4d0acaa19a260a01bd8cb53ad24dacab1954b20d1472cf3975e87cc733f329ab6bd"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000466ed49779ed6a7b10c812bc7ee7b47a5d11c5ea50277273da140bc1b0cf5b8210a6a737f7e9d92eee6d845137e5c44a28accb8f637385cf6519bfae3ed3ae4d0acaa19a260a01bd8cb53ad24dacab1954b20d1472cf3975e87cc733f329ab6bd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGbtSXee1qexDIErx+57R6XRHF6l\nAncnPaFAvBsM9bghCmpzf36dku7m2EUTflxEoorMuPY3OFz2UZv64+065NCsqhmi\nYKAb2MtTrSTayrGVSyDRRyzzl16HzHM/Mpq2vQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1056,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023059930a2b8bbd79b8051f252a1af76b4a5c6525adf9c6c7910a5ccf798eac0c8d4513923a792a965abe82bb564dac21cb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043024912041bc989a936fb4dcdd178b15e03a0aa94abafb4465b4a89d4416b7a8b029d47c17e69a25962ff3aefe862dcb249ee9252b5713e747a2da8aac2b961ee2b6aca157a44888748648fbcdc5661cd4a169bb92c9c1ce50a79a63735002a1",
+        "wx" : "3024912041bc989a936fb4dcdd178b15e03a0aa94abafb4465b4a89d4416b7a8b029d47c17e69a25962ff3aefe862dcb",
+        "wy" : "249ee9252b5713e747a2da8aac2b961ee2b6aca157a44888748648fbcdc5661cd4a169bb92c9c1ce50a79a63735002a1"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200043024912041bc989a936fb4dcdd178b15e03a0aa94abafb4465b4a89d4416b7a8b029d47c17e69a25962ff3aefe862dcb249ee9252b5713e747a2da8aac2b961ee2b6aca157a44888748648fbcdc5661cd4a169bb92c9c1ce50a79a63735002a1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABDAkkSBBvJiak2+03N0XixXgOgqp\nSrr7RGW0qJ1EFreosCnUfBfmmiWWL/Ou/oYtyySe6SUrVxPnR6Laiqwrlh7itqyh\nV6RIiHSGSPvNxWYc1KFpu5LJwc5Qp5pjc1ACoQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1057,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02301449901ce4b00f0e3a5ff84cff8c134854b808e504d1b8f027ace9591234e3f62ce70c35a8aa8e60cafe1e0df3ed80e7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046c9393b00e9a62ce0b83674cdcca59b18d5b34246348e37c1d78898a522d813c49d08efc5f3f7ef33f3dc9dd1bc2e5c2000b9410ce04a64cd095ae1194bc1f514c7009a4e06871b557154cf492e7c57749487ecfcd04cb31426ab785ffa95e2f",
+        "wx" : "6c9393b00e9a62ce0b83674cdcca59b18d5b34246348e37c1d78898a522d813c49d08efc5f3f7ef33f3dc9dd1bc2e5c2",
+        "wy" : "0b9410ce04a64cd095ae1194bc1f514c7009a4e06871b557154cf492e7c57749487ecfcd04cb31426ab785ffa95e2f"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200046c9393b00e9a62ce0b83674cdcca59b18d5b34246348e37c1d78898a522d813c49d08efc5f3f7ef33f3dc9dd1bc2e5c2000b9410ce04a64cd095ae1194bc1f514c7009a4e06871b557154cf492e7c57749487ecfcd04cb31426ab785ffa95e2f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGyTk7AOmmLOC4NnTNzKWbGNWzQk\nY0jjfB14iYpSLYE8SdCO/F8/fvM/PcndG8LlwgALlBDOBKZM0JWuEZS8H1FMcAmk\n4GhxtVcVTPSS58V3SUh+z80EyzFCareF/6leLw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1058,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02310089ae6f8e215bcf35c7e2afed1a6b9855171687d9edbea8af5bf8e9ddc667aac4e166f05097385fa9ea3a6245fc07b4ad",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042c58277aaa61c400d7036183af49c99a97fea5a8d5f8608c4c6ac7a282757e4dc4b6f92d82a10272f2a19696a48fa79f5a8adb770740669d6010e55f6625b141be469fe1779f4adfe64eab2e4a9ac5bf1c25b3de0b74b8f9644fc216010d9659",
+        "wx" : "2c58277aaa61c400d7036183af49c99a97fea5a8d5f8608c4c6ac7a282757e4dc4b6f92d82a10272f2a19696a48fa79f",
+        "wy" : "5a8adb770740669d6010e55f6625b141be469fe1779f4adfe64eab2e4a9ac5bf1c25b3de0b74b8f9644fc216010d9659"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200042c58277aaa61c400d7036183af49c99a97fea5a8d5f8608c4c6ac7a282757e4dc4b6f92d82a10272f2a19696a48fa79f5a8adb770740669d6010e55f6625b141be469fe1779f4adfe64eab2e4a9ac5bf1c25b3de0b74b8f9644fc216010d9659",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABCxYJ3qqYcQA1wNhg69JyZqX/qWo\n1fhgjExqx6KCdX5NxLb5LYKhAnLyoZaWpI+nn1qK23cHQGadYBDlX2YlsUG+Rp/h\nd59K3+ZOqy5KmsW/HCWz3gt0uPlkT8IWAQ2WWQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1059,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02303fc16256a0914ce2661a54688af4b2546b1b59b043667da6abb5b1a1e0e2e6ab862fe8bb749f7251572bc160567530a7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046e5f827e1aa225c4b95db52655f67d654bdc69a4bf8f49c19d1e65dcf12ca511505aa1726ca2f5cdf8ab376f94a0c5bd5daec6f35f1dfbc68fba024cc8c5f79ce9baa86adfd8d2ba53a798cdcc9025eb9797d3be207bc694abb338e43778ffdd",
+        "wx" : "6e5f827e1aa225c4b95db52655f67d654bdc69a4bf8f49c19d1e65dcf12ca511505aa1726ca2f5cdf8ab376f94a0c5bd",
+        "wy" : "5daec6f35f1dfbc68fba024cc8c5f79ce9baa86adfd8d2ba53a798cdcc9025eb9797d3be207bc694abb338e43778ffdd"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200046e5f827e1aa225c4b95db52655f67d654bdc69a4bf8f49c19d1e65dcf12ca511505aa1726ca2f5cdf8ab376f94a0c5bd5daec6f35f1dfbc68fba024cc8c5f79ce9baa86adfd8d2ba53a798cdcc9025eb9797d3be207bc694abb338e43778ffdd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABG5fgn4aoiXEuV21JlX2fWVL3Gmk\nv49JwZ0eZdzxLKURUFqhcmyi9c34qzdvlKDFvV2uxvNfHfvGj7oCTMjF95zpuqhq\n39jSulOnmM3MkCXrl5fTviB7xpSrszjkN3j/3Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1060,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023064c1556c5eef311a4f3ba46316adf73732d6ed47b1ba2ecd178ff89bbc5ddd6c6419f62e045ea2d35c33a250dc2fb925",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047fe852a7612a673df351f05afeafcbb16ce4cadf85681b2b5f46cc31ef33d6b695378e7325e9cb3185d7137b2b1700465cbd4c810076d135316887e94b14b4b0108db1c944794c398938d42176c32575b6428b3e37b602211c574acafef0911e",
+        "wx" : "7fe852a7612a673df351f05afeafcbb16ce4cadf85681b2b5f46cc31ef33d6b695378e7325e9cb3185d7137b2b170046",
+        "wy" : "5cbd4c810076d135316887e94b14b4b0108db1c944794c398938d42176c32575b6428b3e37b602211c574acafef0911e"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200047fe852a7612a673df351f05afeafcbb16ce4cadf85681b2b5f46cc31ef33d6b695378e7325e9cb3185d7137b2b1700465cbd4c810076d135316887e94b14b4b0108db1c944794c398938d42176c32575b6428b3e37b602211c574acafef0911e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABH/oUqdhKmc981HwWv6vy7Fs5Mrf\nhWgbK19GzDHvM9a2lTeOcyXpyzGF1xN7KxcARly9TIEAdtE1MWiH6UsUtLAQjbHJ\nRHlMOYk41CF2wyV1tkKLPje2AiEcV0rK/vCRHg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1061,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02303cc98c561aa5f50c8f19d947dc75ac8f507e6985762006e7100982caccb79530f8f935ac9d3d82967cdf129ecf5b0ce5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040a49dc359ed4fef683e462dfe685442cea77b733fd95633216794d9a61f7e1022d942a36e781a484a2b479a643469af4512ebd0966b68bfecf7a47021bcd9e6aa2703dcc556a9a443d16195aa145738fa36a4dff3d09481f4a86550a8d1f3545",
+        "wx" : "0a49dc359ed4fef683e462dfe685442cea77b733fd95633216794d9a61f7e1022d942a36e781a484a2b479a643469af4",
+        "wy" : "512ebd0966b68bfecf7a47021bcd9e6aa2703dcc556a9a443d16195aa145738fa36a4dff3d09481f4a86550a8d1f3545"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200040a49dc359ed4fef683e462dfe685442cea77b733fd95633216794d9a61f7e1022d942a36e781a484a2b479a643469af4512ebd0966b68bfecf7a47021bcd9e6aa2703dcc556a9a443d16195aa145738fa36a4dff3d09481f4a86550a8d1f3545",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABApJ3DWe1P72g+Ri3+aFRCzqd7cz\n/ZVjMhZ5TZph9+ECLZQqNueBpISitHmmQ0aa9FEuvQlmtov+z3pHAhvNnmqicD3M\nVWqaRD0WGVqhRXOPo2pN/z0JSB9KhlUKjR81RQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1062,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02303f2095530f36144e009019eee102b2867d83c9eb4f28bcb31b383e00c8c3746b20cc90e8efc813aefb5b6a4965204c53",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04276715087495d52c4160d15446ebb4d758291bf5bc9ca87b56c3f00adc41fa452d66684152d3e19d2fc3ad5d289787ad367385d3c3f5c3c2c6c3166adcfafc3d204453cab8797d56e955fbf1cf421763a6653e40efd9035df8128135546b6261",
+        "wx" : "276715087495d52c4160d15446ebb4d758291bf5bc9ca87b56c3f00adc41fa452d66684152d3e19d2fc3ad5d289787ad",
+        "wy" : "367385d3c3f5c3c2c6c3166adcfafc3d204453cab8797d56e955fbf1cf421763a6653e40efd9035df8128135546b6261"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004276715087495d52c4160d15446ebb4d758291bf5bc9ca87b56c3f00adc41fa452d66684152d3e19d2fc3ad5d289787ad367385d3c3f5c3c2c6c3166adcfafc3d204453cab8797d56e955fbf1cf421763a6653e40efd9035df8128135546b6261",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABCdnFQh0ldUsQWDRVEbrtNdYKRv1\nvJyoe1bD8ArcQfpFLWZoQVLT4Z0vw61dKJeHrTZzhdPD9cPCxsMWatz6/D0gRFPK\nuHl9VulV+/HPQhdjpmU+QO/ZA134EoE1VGtiYQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1063,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0230704afc6a72080d1728f6cc9fd023e9d2373023377f02599b6ea9fb2923dd7403fe2fd73999f65316b53f910bda4f6f10",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045943dbd66c79fcb882936eccdd6d860c42e20727a2cdb29165c8426c9d192990b71d9a3c7f240e46acab2741b7ee9c7a461e5ab1db3eb9b51b3238d3ada33567d251d8fd0fbaf59aa1cfb40fe7b22e0277f166a32edb81ab6a8580f9b1fb3e39",
+        "wx" : "5943dbd66c79fcb882936eccdd6d860c42e20727a2cdb29165c8426c9d192990b71d9a3c7f240e46acab2741b7ee9c7a",
+        "wy" : "461e5ab1db3eb9b51b3238d3ada33567d251d8fd0fbaf59aa1cfb40fe7b22e0277f166a32edb81ab6a8580f9b1fb3e39"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200045943dbd66c79fcb882936eccdd6d860c42e20727a2cdb29165c8426c9d192990b71d9a3c7f240e46acab2741b7ee9c7a461e5ab1db3eb9b51b3238d3ada33567d251d8fd0fbaf59aa1cfb40fe7b22e0277f166a32edb81ab6a8580f9b1fb3e39",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABFlD29Zsefy4gpNuzN1thgxC4gcn\nos2ykWXIQmydGSmQtx2aPH8kDkasqydBt+6cekYeWrHbPrm1GzI4062jNWfSUdj9\nD7r1mqHPtA/nsi4Cd/Fmoy7bgatqhYD5sfs+OQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1064,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023046f09c4741c1afe74e32f6ff14daaf90f4486c33f5d0e978f9af24f5751988e72b374c5faeffdec309330401965f7d20",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045285d72925c87c75b6ad9955064182bf2debcb25c88d0606f6672863de413e549688a4fcfbe6689bb23dba2b757bcda64ef6b01766c95b66ff10496d5deebac4b4bf8c3bb4232c019f80b69d8ab0214ceaf5813027ecec133a5a5b971948822e",
+        "wx" : "5285d72925c87c75b6ad9955064182bf2debcb25c88d0606f6672863de413e549688a4fcfbe6689bb23dba2b757bcda6",
+        "wy" : "4ef6b01766c95b66ff10496d5deebac4b4bf8c3bb4232c019f80b69d8ab0214ceaf5813027ecec133a5a5b971948822e"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200045285d72925c87c75b6ad9955064182bf2debcb25c88d0606f6672863de413e549688a4fcfbe6689bb23dba2b757bcda64ef6b01766c95b66ff10496d5deebac4b4bf8c3bb4232c019f80b69d8ab0214ceaf5813027ecec133a5a5b971948822e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABFKF1yklyHx1tq2ZVQZBgr8t68sl\nyI0GBvZnKGPeQT5Uloik/PvmaJuyPbordXvNpk72sBdmyVtm/xBJbV3uusS0v4w7\ntCMsAZ+Atp2KsCFM6vWBMCfs7BM6WluXGUiCLg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1065,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023019930a2b8bbd79b8051f252a1af76b4a5c6525adf9c6c7910a5ccf798eac0c8d4513923a792a965abe82bb564dac21cd",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040786afb03dd791dbfc371ab51ffa288b7cedd90d6a35a3c3a92566f895f38cb18536137e010f1cfba2fbed70568d77b84eec840cca8b6f3f612304b602ffad8dcbae1786b2c2216e9a1e59a6b69628b52a408b6a083d727f3ccd0e706f9aeef8",
+        "wx" : "786afb03dd791dbfc371ab51ffa288b7cedd90d6a35a3c3a92566f895f38cb18536137e010f1cfba2fbed70568d77b8",
+        "wy" : "4eec840cca8b6f3f612304b602ffad8dcbae1786b2c2216e9a1e59a6b69628b52a408b6a083d727f3ccd0e706f9aeef8"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200040786afb03dd791dbfc371ab51ffa288b7cedd90d6a35a3c3a92566f895f38cb18536137e010f1cfba2fbed70568d77b84eec840cca8b6f3f612304b602ffad8dcbae1786b2c2216e9a1e59a6b69628b52a408b6a083d727f3ccd0e706f9aeef8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABAeGr7A915Hb/DcatR/6KIt87dkN\najWjw6klZviV84yxhTYTfgEPHPui++1wVo13uE7shAzKi28/YSMEtgL/rY3LrheG\nssIhbpoeWaa2lii1KkCLagg9cn88zQ5wb5ru+A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1066,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc023033261457177af3700a3e4a5435eed694b8ca4b5bf38d8f2214b99ef31d58191a8a272474f2552cb57d0576ac9b58439a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0446690db403904228e4f736b1344791596628e85669d4dd01374b21274280b421e42f5ba3f3f2fadad27d4469be7d9bdb7e883b43c27217f606e0a5ba6c9df781c145776c0e5a8993f0ed65c6ded65a43bddd0fe7611485e8e8d9e7decdf2d8b5",
+        "wx" : "46690db403904228e4f736b1344791596628e85669d4dd01374b21274280b421e42f5ba3f3f2fadad27d4469be7d9bdb",
+        "wy" : "7e883b43c27217f606e0a5ba6c9df781c145776c0e5a8993f0ed65c6ded65a43bddd0fe7611485e8e8d9e7decdf2d8b5"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000446690db403904228e4f736b1344791596628e85669d4dd01374b21274280b421e42f5ba3f3f2fadad27d4469be7d9bdb7e883b43c27217f606e0a5ba6c9df781c145776c0e5a8993f0ed65c6ded65a43bddd0fe7611485e8e8d9e7decdf2d8b5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABEZpDbQDkEIo5Pc2sTRHkVlmKOhW\nadTdATdLISdCgLQh5C9bo/Py+trSfURpvn2b236IO0PCchf2BuClumyd94HBRXds\nDlqJk/DtZcbe1lpDvd0P52EUhejo2efezfLYtQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1067,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306402307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02304cb91e82a3386d280f5d6f7e50e641df152f7109ed5456b31f166e6cac0425a7cf3ab6af6b7fc3103b883202e9046567",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048be6928acad44c9571b5c4015fa3ffae5e639e4130a1a66b473e5dfdfe93b68a8de89583666d4d699e8885469f9b1a4d83b1d5312310e445ae57c85ab1a3df8dbbb706a598fbc007efb602a14a5952fd7e7df0464d533e062ea211285c2f5c27",
+        "wx" : "08be6928acad44c9571b5c4015fa3ffae5e639e4130a1a66b473e5dfdfe93b68a8de89583666d4d699e8885469f9b1a4d",
+        "wy" : "083b1d5312310e445ae57c85ab1a3df8dbbb706a598fbc007efb602a14a5952fd7e7df0464d533e062ea211285c2f5c27"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200048be6928acad44c9571b5c4015fa3ffae5e639e4130a1a66b473e5dfdfe93b68a8de89583666d4d699e8885469f9b1a4d83b1d5312310e445ae57c85ab1a3df8dbbb706a598fbc007efb602a14a5952fd7e7df0464d533e062ea211285c2f5c27",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABIvmkorK1EyVcbXEAV+j/65eY55B\nMKGma0c+Xf3+k7aKjeiVg2ZtTWmeiIVGn5saTYOx1TEjEORFrlfIWrGj3427twal\nmPvAB++2AqFKWVL9fn3wRk1TPgYuohEoXC9cJw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1068,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "306502307ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0231008b33c708624a1e2eeba00fb5b5a8ed1a1622fc71ed897fb13d87ac253935e8365850d380015c115d12e14a2472860d09",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041886ddd282b023084953ef7d9e853a6adc1360cef7f56df7da0ca7bdcf4f3a5d227a730f9f20f9434b565dc4fa819e856a0f0ed8d7f28f916a4e727e55bf0818dcc84ed1132bd7da9f98ff95fb2aec238f4df9185b0982a6682c06c85e6a895e",
+        "wx" : "1886ddd282b023084953ef7d9e853a6adc1360cef7f56df7da0ca7bdcf4f3a5d227a730f9f20f9434b565dc4fa819e85",
+        "wy" : "6a0f0ed8d7f28f916a4e727e55bf0818dcc84ed1132bd7da9f98ff95fb2aec238f4df9185b0982a6682c06c85e6a895e"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200041886ddd282b023084953ef7d9e853a6adc1360cef7f56df7da0ca7bdcf4f3a5d227a730f9f20f9434b565dc4fa819e856a0f0ed8d7f28f916a4e727e55bf0818dcc84ed1132bd7da9f98ff95fb2aec238f4df9185b0982a6682c06c85e6a895e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABBiG3dKCsCMISVPvfZ6FOmrcE2DO\n9/Vt99oMp73PTzpdInpzD58g+UNLVl3E+oGehWoPDtjX8o+Rak5yflW/CBjcyE7R\nEyvX2p+Y/5X7Kuwjj035GFsJgqZoLAbIXmqJXg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1069,
+          "comment" : "point duplication during verification",
+          "msg" : "313233343030",
+          "sig" : "30650231008729cbb906f69d8d43f94cb8c4b9572c958272f5c6ff759ba9113f340b9f9aa598837aa37a4311717faf4cf66747a5b4023028a9b8c55eb6f5f1cf5c233aff640f48211cd2b9cf0593e8b9ffff67c7e69703f8a6c5382a36769d3cca57711ab63c65",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041886ddd282b023084953ef7d9e853a6adc1360cef7f56df7da0ca7bdcf4f3a5d227a730f9f20f9434b565dc4fa819e8522aa0fa9cb45dd96a50efcfffb2739c638672238da287ed97318da83848c25001d85ae11351397cb1f1af94ad29d62f5",
+        "wx" : "1886ddd282b023084953ef7d9e853a6adc1360cef7f56df7da0ca7bdcf4f3a5d227a730f9f20f9434b565dc4fa819e85",
+        "wy" : "22aa0fa9cb45dd96a50efcfffb2739c638672238da287ed97318da83848c25001d85ae11351397cb1f1af94ad29d62f5"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200041886ddd282b023084953ef7d9e853a6adc1360cef7f56df7da0ca7bdcf4f3a5d227a730f9f20f9434b565dc4fa819e8522aa0fa9cb45dd96a50efcfffb2739c638672238da287ed97318da83848c25001d85ae11351397cb1f1af94ad29d62f5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABBiG3dKCsCMISVPvfZ6FOmrcE2DO\n9/Vt99oMp73PTzpdInpzD58g+UNLVl3E+oGehSKqD6nLRd2WpQ78//snOcY4ZyI4\n2ih+2XMY2oOEjCUAHYWuETUTl8sfGvlK0p1i9Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1070,
+          "comment" : "duplication bug",
+          "msg" : "313233343030",
+          "sig" : "30650231008729cbb906f69d8d43f94cb8c4b9572c958272f5c6ff759ba9113f340b9f9aa598837aa37a4311717faf4cf66747a5b4023028a9b8c55eb6f5f1cf5c233aff640f48211cd2b9cf0593e8b9ffff67c7e69703f8a6c5382a36769d3cca57711ab63c65",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0489dd738efcb0f79811df6bec873485169450ada18e602721e61768be0d81e5d41381f24668276f32bfe31ff1c16bcb6b1f7a4d2823bcd73f236d90b6ea61d892026190e14317b5d110526e9e2675f03d5ef3fce87b5827a37e0cf19b4d3988c0",
+        "wx" : "089dd738efcb0f79811df6bec873485169450ada18e602721e61768be0d81e5d41381f24668276f32bfe31ff1c16bcb6b",
+        "wy" : "1f7a4d2823bcd73f236d90b6ea61d892026190e14317b5d110526e9e2675f03d5ef3fce87b5827a37e0cf19b4d3988c0"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000489dd738efcb0f79811df6bec873485169450ada18e602721e61768be0d81e5d41381f24668276f32bfe31ff1c16bcb6b1f7a4d2823bcd73f236d90b6ea61d892026190e14317b5d110526e9e2675f03d5ef3fce87b5827a37e0cf19b4d3988c0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABIndc478sPeYEd9r7Ic0hRaUUK2h\njmAnIeYXaL4NgeXUE4HyRmgnbzK/4x/xwWvLax96TSgjvNc/I22Qtuph2JICYZDh\nQxe10RBSbp4mdfA9XvP86HtYJ6N+DPGbTTmIwA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1071,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "313233343030",
+          "sig" : "306402302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba301772102301c25061a20a4e2a19cac497fa9c7a6c6376fe36862aa77bd6c9e1615bc00d454c30bbe23157ff3d00be80a009500e114",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04795592a673e82dff3d77450194e5308d64f45f11f759f34f7c7b5b7cc6ad73f9bff8f6633cc20378cff2e53fb7a5303085b5cd4621665aac8435d8ce85b26d444508b77b282e91cd5315c701d2e5b66ba4c00bf7e1eb0859a13cc351d00041a1",
+        "wx" : "795592a673e82dff3d77450194e5308d64f45f11f759f34f7c7b5b7cc6ad73f9bff8f6633cc20378cff2e53fb7a53030",
+        "wy" : "085b5cd4621665aac8435d8ce85b26d444508b77b282e91cd5315c701d2e5b66ba4c00bf7e1eb0859a13cc351d00041a1"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004795592a673e82dff3d77450194e5308d64f45f11f759f34f7c7b5b7cc6ad73f9bff8f6633cc20378cff2e53fb7a5303085b5cd4621665aac8435d8ce85b26d444508b77b282e91cd5315c701d2e5b66ba4c00bf7e1eb0859a13cc351d00041a1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABHlVkqZz6C3/PXdFAZTlMI1k9F8R\n91nzT3x7W3zGrXP5v/j2YzzCA3jP8uU/t6UwMIW1zUYhZlqshDXYzoWybURFCLd7\nKC6RzVMVxwHS5bZrpMAL9+HrCFmhPMNR0ABBoQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1072,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "306402302282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca02302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0439d94ff8757dcdb67480cbc48e9679423e57de5a23232df0db1e0ff7e908614401e6cd8d615008ea8be51299d9e22de9438126d70d14e75ce41ea2f409be88e2806f7f73bd513731696bc59e7a2c1d44d5683d3bdc92baba1c2ada58809f8bef",
+        "wx" : "39d94ff8757dcdb67480cbc48e9679423e57de5a23232df0db1e0ff7e908614401e6cd8d615008ea8be51299d9e22de9",
+        "wy" : "438126d70d14e75ce41ea2f409be88e2806f7f73bd513731696bc59e7a2c1d44d5683d3bdc92baba1c2ada58809f8bef"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000439d94ff8757dcdb67480cbc48e9679423e57de5a23232df0db1e0ff7e908614401e6cd8d615008ea8be51299d9e22de9438126d70d14e75ce41ea2f409be88e2806f7f73bd513731696bc59e7a2c1d44d5683d3bdc92baba1c2ada58809f8bef",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABDnZT/h1fc22dIDLxI6WeUI+V95a\nIyMt8NseD/fpCGFEAebNjWFQCOqL5RKZ2eIt6UOBJtcNFOdc5B6i9Am+iOKAb39z\nvVE3MWlrxZ56LB1E1Wg9O9ySurocKtpYgJ+L7w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1073,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "306402302282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca0230141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0420b1fc8e2480a973e097337343490b12ae40652e4180dd4ae56df521daa9e391777c0d466f018af55519038dead355017232882bca3ccd6b375591f5b5096538ca5778355307e603148fde31f5acffeb4c6863541ad233de3f281ea0d235b6f3",
+        "wx" : "20b1fc8e2480a973e097337343490b12ae40652e4180dd4ae56df521daa9e391777c0d466f018af55519038dead35501",
+        "wy" : "7232882bca3ccd6b375591f5b5096538ca5778355307e603148fde31f5acffeb4c6863541ad233de3f281ea0d235b6f3"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000420b1fc8e2480a973e097337343490b12ae40652e4180dd4ae56df521daa9e391777c0d466f018af55519038dead355017232882bca3ccd6b375591f5b5096538ca5778355307e603148fde31f5acffeb4c6863541ad233de3f281ea0d235b6f3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABCCx/I4kgKlz4Jczc0NJCxKuQGUu\nQYDdSuVt9SHaqeORd3wNRm8BivVVGQON6tNVAXIyiCvKPM1rN1WR9bUJZTjKV3g1\nUwfmAxSP3jH1rP/rTGhjVBrSM94/KB6g0jW28w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1074,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "306402302282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca02301c25061a20a4e2a19cac497fa9c7a6c6376fe36862aa77bd6c9e1615bc00d454c30bbe23157ff3d00be80a009500e114",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044a391d79cfa82b943123d69ee2d1bc0e0b7e1e6f93c69123bfce0bd4f31a5e3434062dd0e1aa8b886ceba362c4d6720c7a2b0543a156f1934e02d31e81d5d2785a71d541cc7e1e6e6132ebee42111f52a844937260719056ae7b10f751606c41",
+        "wx" : "4a391d79cfa82b943123d69ee2d1bc0e0b7e1e6f93c69123bfce0bd4f31a5e3434062dd0e1aa8b886ceba362c4d6720c",
+        "wy" : "7a2b0543a156f1934e02d31e81d5d2785a71d541cc7e1e6e6132ebee42111f52a844937260719056ae7b10f751606c41"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200044a391d79cfa82b943123d69ee2d1bc0e0b7e1e6f93c69123bfce0bd4f31a5e3434062dd0e1aa8b886ceba362c4d6720c7a2b0543a156f1934e02d31e81d5d2785a71d541cc7e1e6e6132ebee42111f52a844937260719056ae7b10f751606c41",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABEo5HXnPqCuUMSPWnuLRvA4Lfh5v\nk8aRI7/OC9TzGl40NAYt0OGqi4hs66NixNZyDHorBUOhVvGTTgLTHoHV0nhacdVB\nzH4ebmEy6+5CER9SqESTcmBxkFauexD3UWBsQQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1075,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "306402302282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca02307094186882938a8672b125fea71e9b18ddbf8da18aa9def5b2785856f00351530c2ef88c55ffcf402fa0280254038451",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0436854adacf83ce5f0e4422406d7b6f7db63d73d4c892a01e975ef6ee6b71a9334c9d57ce6ffcdb1a2e4174ddba799e127d619672035db4fd73e5e4b4ea920b74f2e70fd24ebca49d22fdb11e96b7867fa1838ca5babcd9dd096ab85e2f97b5ae",
+        "wx" : "36854adacf83ce5f0e4422406d7b6f7db63d73d4c892a01e975ef6ee6b71a9334c9d57ce6ffcdb1a2e4174ddba799e12",
+        "wy" : "7d619672035db4fd73e5e4b4ea920b74f2e70fd24ebca49d22fdb11e96b7867fa1838ca5babcd9dd096ab85e2f97b5ae"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000436854adacf83ce5f0e4422406d7b6f7db63d73d4c892a01e975ef6ee6b71a9334c9d57ce6ffcdb1a2e4174ddba799e127d619672035db4fd73e5e4b4ea920b74f2e70fd24ebca49d22fdb11e96b7867fa1838ca5babcd9dd096ab85e2f97b5ae",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABDaFStrPg85fDkQiQG17b322PXPU\nyJKgHpde9u5rcakzTJ1Xzm/82xouQXTdunmeEn1hlnIDXbT9c+XktOqSC3Ty5w/S\nTryknSL9sR6Wt4Z/oYOMpbq82d0JarheL5e1rg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1076,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "306402302282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca0230789eac6ff99e146b7ae25f90d7a0cabf36baf32d14916ee2aceea7cadc95d7221f56e5baee6d82a03307064ba32856e9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04804e6c71e493b783ecd375a4edcf86c77b1c2df551bbc73bed8516e4d11ce51a1dd081e19aa6f51c656818b853962178580bd6b2c4eabcf5b3741e6b7d59b0e7f2bddb247f5f9d6751cf09e3c6c9d1f7c27c0bb8d21e77a80ebadaf90af8b0d0",
+        "wx" : "0804e6c71e493b783ecd375a4edcf86c77b1c2df551bbc73bed8516e4d11ce51a1dd081e19aa6f51c656818b853962178",
+        "wy" : "580bd6b2c4eabcf5b3741e6b7d59b0e7f2bddb247f5f9d6751cf09e3c6c9d1f7c27c0bb8d21e77a80ebadaf90af8b0d0"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004804e6c71e493b783ecd375a4edcf86c77b1c2df551bbc73bed8516e4d11ce51a1dd081e19aa6f51c656818b853962178580bd6b2c4eabcf5b3741e6b7d59b0e7f2bddb247f5f9d6751cf09e3c6c9d1f7c27c0bb8d21e77a80ebadaf90af8b0d0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABIBObHHkk7eD7NN1pO3Phsd7HC31\nUbvHO+2FFuTRHOUaHdCB4Zqm9RxlaBi4U5YheFgL1rLE6rz1s3Qea31ZsOfyvdsk\nf1+dZ1HPCePGydH3wnwLuNIed6gOutr5Cviw0A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1077,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "306402302282bc382a2f4dfcb95c3495d7b4fd590ad520b3eb6be4d6ec2f80c4e0f70df87c4ba74a09b553ebb427b58df9d59fca023064dc78d112cd6ed67d4323b302650a606ed41415bd8cfc40ec7438a70ee3d8680420e5f602aed591a324760c58140642",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042c115772dd298612197a1c59df9c25a86ac16fa4f27adf74bcc673bb4a6a4bb5d0b5b64470d5d26e0300922ab723732442f6ec209e27ce0b127d334745272643d3666bff54927419764de52322ee1696e620d15e0eea62fed0f20efe6c91e1e3",
+        "wx" : "2c115772dd298612197a1c59df9c25a86ac16fa4f27adf74bcc673bb4a6a4bb5d0b5b64470d5d26e0300922ab7237324",
+        "wy" : "42f6ec209e27ce0b127d334745272643d3666bff54927419764de52322ee1696e620d15e0eea62fed0f20efe6c91e1e3"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200042c115772dd298612197a1c59df9c25a86ac16fa4f27adf74bcc673bb4a6a4bb5d0b5b64470d5d26e0300922ab723732442f6ec209e27ce0b127d334745272643d3666bff54927419764de52322ee1696e620d15e0eea62fed0f20efe6c91e1e3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABCwRV3LdKYYSGXocWd+cJahqwW+k\n8nrfdLzGc7tKaku10LW2RHDV0m4DAJIqtyNzJEL27CCeJ84LEn0zR0UnJkPTZmv/\nVJJ0GXZN5SMi7haW5iDRXg7qYv7Q8g7+bJHh4w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1078,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "306402301d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e02302ee85f80e112cf0d5a747a7f704cc09fb1ba7b034f1c1ce65fb224cee40161e29a68e78fce7febb013d810aba3017721",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04295778c9a3be2b373450f57daf10de66d32441750ac4289f6751ff61405ce0237f64e28ac5281a81d13fba81a8454e584c9f3991d615512faf0dc9107193b1b6f5cd684356ca51504d15c1ca4ba00b21c7c68eb4683222a8211e4ffd56da0e06",
+        "wx" : "295778c9a3be2b373450f57daf10de66d32441750ac4289f6751ff61405ce0237f64e28ac5281a81d13fba81a8454e58",
+        "wy" : "4c9f3991d615512faf0dc9107193b1b6f5cd684356ca51504d15c1ca4ba00b21c7c68eb4683222a8211e4ffd56da0e06"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004295778c9a3be2b373450f57daf10de66d32441750ac4289f6751ff61405ce0237f64e28ac5281a81d13fba81a8454e584c9f3991d615512faf0dc9107193b1b6f5cd684356ca51504d15c1ca4ba00b21c7c68eb4683222a8211e4ffd56da0e06",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABClXeMmjvis3NFD1fa8Q3mbTJEF1\nCsQon2dR/2FAXOAjf2TiisUoGoHRP7qBqEVOWEyfOZHWFVEvrw3JEHGTsbb1zWhD\nVspRUE0VwcpLoAshx8aOtGgyIqghHk/9VtoOBg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1079,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "306402301d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e0230141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0465a340bc68f3fcead4f04277ee8675f9c17bc8c88426c5ba0313b8ce7da58d92ca9a0ffa32c7eee195857d860ba1eebe4dcd5be3a6778008b36ea19d902d93dd488f6fb65dc0719521553b39cb3c524b12681d2e07a8ef720cdc15011c23ba9d",
+        "wx" : "65a340bc68f3fcead4f04277ee8675f9c17bc8c88426c5ba0313b8ce7da58d92ca9a0ffa32c7eee195857d860ba1eebe",
+        "wy" : "4dcd5be3a6778008b36ea19d902d93dd488f6fb65dc0719521553b39cb3c524b12681d2e07a8ef720cdc15011c23ba9d"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000465a340bc68f3fcead4f04277ee8675f9c17bc8c88426c5ba0313b8ce7da58d92ca9a0ffa32c7eee195857d860ba1eebe4dcd5be3a6778008b36ea19d902d93dd488f6fb65dc0719521553b39cb3c524b12681d2e07a8ef720cdc15011c23ba9d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGWjQLxo8/zq1PBCd+6GdfnBe8jI\nhCbFugMTuM59pY2SypoP+jLH7uGVhX2GC6Huvk3NW+Omd4AIs26hnZAtk91Ij2+2\nXcBxlSFVOznLPFJLEmgdLgeo73IM3BUBHCO6nQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1080,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "306402301d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e02301c25061a20a4e2a19cac497fa9c7a6c6376fe36862aa77bd6c9e1615bc00d454c30bbe23157ff3d00be80a009500e114",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0454a03902656bfaf4d6a54ff3429d9f9719bb61e6caf000e100992b31700e780e0f73f51614954acdddcaaa8b2311195b04ad3b19b01e150a39dc0cfaecc6498b18138ce612c492795687a488522644b3ddf7462c3c359bd091b7d39469571879",
+        "wx" : "54a03902656bfaf4d6a54ff3429d9f9719bb61e6caf000e100992b31700e780e0f73f51614954acdddcaaa8b2311195b",
+        "wy" : "4ad3b19b01e150a39dc0cfaecc6498b18138ce612c492795687a488522644b3ddf7462c3c359bd091b7d39469571879"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000454a03902656bfaf4d6a54ff3429d9f9719bb61e6caf000e100992b31700e780e0f73f51614954acdddcaaa8b2311195b04ad3b19b01e150a39dc0cfaecc6498b18138ce612c492795687a488522644b3ddf7462c3c359bd091b7d39469571879",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABFSgOQJla/r01qVP80Kdn5cZu2Hm\nyvAA4QCZKzFwDngOD3P1FhSVSs3dyqqLIxEZWwStOxmwHhUKOdwM+uzGSYsYE4zm\nEsSSeVaHpIhSJkSz3fdGLDw1m9CRt9OUaVcYeQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1081,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "306402301d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e02307094186882938a8672b125fea71e9b18ddbf8da18aa9def5b2785856f00351530c2ef88c55ffcf402fa0280254038451",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0446d10d749a47a4d3f25b6f28951a11f01a54c2413957a477162dabe0d08d8ae9b6a9f44b68ef341fb820b0c24c7a1c0e671ff166cd35d2f3cc821d58fa18e35d25e6033b9e790fce4818f9e570921c0034b381cc9ad254eeaf1b386e511b7c89",
+        "wx" : "46d10d749a47a4d3f25b6f28951a11f01a54c2413957a477162dabe0d08d8ae9b6a9f44b68ef341fb820b0c24c7a1c0e",
+        "wy" : "671ff166cd35d2f3cc821d58fa18e35d25e6033b9e790fce4818f9e570921c0034b381cc9ad254eeaf1b386e511b7c89"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000446d10d749a47a4d3f25b6f28951a11f01a54c2413957a477162dabe0d08d8ae9b6a9f44b68ef341fb820b0c24c7a1c0e671ff166cd35d2f3cc821d58fa18e35d25e6033b9e790fce4818f9e570921c0034b381cc9ad254eeaf1b386e511b7c89",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABEbRDXSaR6TT8ltvKJUaEfAaVMJB\nOVekdxYtq+DQjYrptqn0S2jvNB+4ILDCTHocDmcf8WbNNdLzzIIdWPoY410l5gM7\nnnkPzkgY+eVwkhwANLOBzJrSVO6vGzhuURt8iQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1082,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "306402301d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e0230789eac6ff99e146b7ae25f90d7a0cabf36baf32d14916ee2aceea7cadc95d7221f56e5baee6d82a03307064ba32856e9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048ae92de10b244ac7f0deb6b102d075951d8c13b2960c2e98d7fb42b8abe90fd07a4a21b86eb4c77efe9adb6725676d1736063f3407c71627acaa83be9029c7a40e8aa896cb68a9c2fa2aaa1079035a283181cd3f2723b221d5a8747ad392a0f9",
+        "wx" : "08ae92de10b244ac7f0deb6b102d075951d8c13b2960c2e98d7fb42b8abe90fd07a4a21b86eb4c77efe9adb6725676d17",
+        "wy" : "36063f3407c71627acaa83be9029c7a40e8aa896cb68a9c2fa2aaa1079035a283181cd3f2723b221d5a8747ad392a0f9"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200048ae92de10b244ac7f0deb6b102d075951d8c13b2960c2e98d7fb42b8abe90fd07a4a21b86eb4c77efe9adb6725676d1736063f3407c71627acaa83be9029c7a40e8aa896cb68a9c2fa2aaa1079035a283181cd3f2723b221d5a8747ad392a0f9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABIrpLeELJErH8N62sQLQdZUdjBOy\nlgwumNf7Qrir6Q/QekohuG60x37+mttnJWdtFzYGPzQHxxYnrKqDvpApx6QOiqiW\ny2ipwvoqqhB5A1ooMYHNPycjsiHVqHR605Kg+Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1083,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "306402301d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e023064dc78d112cd6ed67d4323b302650a606ed41415bd8cfc40ec7438a70ee3d8680420e5f602aed591a324760c58140642",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c5315",
+        "wx" : "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e",
+        "wy" : "08abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c5315"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e8abe1d7520f9c2a45cb1eb8e95cfd55262b70b29feec5864e19c054ff99129280e4646217791811142820341263c5315",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABB0cZPBoz0X/oqY6gbfBP2uIR6Pn\nfvFP49t/yv4MvRDo6CbgNDbWRqrvh7LiR9SvHoq+HXUg+cKkXLHrjpXP1VJitwsp\n/uxYZOGcBU/5kSkoDkZGIXeRgRFCggNBJjxTFQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1084,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3065023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0230141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1085,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "306402301fc115146e521d7ea33f3e128eb01db0f653dc45852c2b50301d639b778b13380e51d9366552cf2049156605d57adffc0230141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e01fb010d823eaa83b2ab83efbb166c8cb27865dfee67fe4f3115d4c98625e7fb9e8d6108188b996044c4fcd20acb993e",
+        "wx" : "1d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e",
+        "wy" : "1fb010d823eaa83b2ab83efbb166c8cb27865dfee67fe4f3115d4c98625e7fb9e8d6108188b996044c4fcd20acb993e"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200041d1c64f068cf45ffa2a63a81b7c13f6b8847a3e77ef14fe3db7fcafe0cbd10e8e826e03436d646aaef87b2e247d4af1e01fb010d823eaa83b2ab83efbb166c8cb27865dfee67fe4f3115d4c98625e7fb9e8d6108188b996044c4fcd20acb993e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABB0cZPBoz0X/oqY6gbfBP2uIR6Pn\nfvFP49t/yv4MvRDo6CbgNDbWRqrvh7LiR9SvHgH7AQ2CPqqDsquD77sWbIyyeGXf\n7mf+TzEV1MmGJef7no1hCBiLmWBExPzSCsuZPg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1086,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3065023100f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0230141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1087,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "306402301fc115146e521d7ea33f3e128eb01db0f653dc45852c2b50301d639b778b13380e51d9366552cf2049156605d57adffc0230141a7212a99a58bc947b0fed7945771fde747ddcd8c2e7d07227c6a1cf6e4e85afe3d0f47d12407008812bb745dc0e7c",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0407310f90a9eae149a08402f54194a0f7b4ac427bf8d9bd6c7681071dc47dc36226a6d37ac46d61fd600c0bf1bff87689ed117dda6b0e59318ae010a197a26ca0",
+        "wx" : "7310f90a9eae149a08402f54194a0f7b4ac427bf8d9bd6c7681071dc47dc362",
+        "wy" : "26a6d37ac46d61fd600c0bf1bff87689ed117dda6b0e59318ae010a197a26ca0"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000407310f90a9eae149a08402f54194a0f7b4ac427bf8d9bd6c7681071dc47dc36226a6d37ac46d61fd600c0bf1bff87689ed117dda6b0e59318ae010a197a26ca0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEBzEPkKnq4UmghAL1QZSg97SsQnv42b1s\ndoEHHcR9w2ImptN6xG1h/WAMC/G/+HaJ7RF92msOWTGK4BChl6JsoA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1088,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "313233343030",
+          "sig" : "30360211014551231950b75fc4402da1722fc9baeb022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1089,
+          "comment" : "r too large",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2c022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bc97e7585eecad48e16683bc4091708e1a930c683fc47001d4b383594f2c4e22705989cf69daeadd4e4e4b8151ed888dfec20fb01728d89d56b3f38f2ae9c8c5",
+        "wx" : "0bc97e7585eecad48e16683bc4091708e1a930c683fc47001d4b383594f2c4e22",
+        "wy" : "705989cf69daeadd4e4e4b8151ed888dfec20fb01728d89d56b3f38f2ae9c8c5"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004bc97e7585eecad48e16683bc4091708e1a930c683fc47001d4b383594f2c4e22705989cf69daeadd4e4e4b8151ed888dfec20fb01728d89d56b3f38f2ae9c8c5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEvJfnWF7srUjhZoO8QJFwjhqTDGg/xHAB\n1LODWU8sTiJwWYnPadrq3U5OS4FR7YiN/sIPsBco2J1Ws/OPKunIxQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1090,
+          "comment" : "r,s are large",
+          "msg" : "313233343030",
+          "sig" : "3046022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413f022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0444ad339afbc21e9abf7b602a5ca535ea378135b6d10d81310bdd8293d1df3252b63ff7d0774770f8fe1d1722fa83acd02f434e4fc110a0cc8f6dddd37d56c463",
+        "wx" : "44ad339afbc21e9abf7b602a5ca535ea378135b6d10d81310bdd8293d1df3252",
+        "wy" : "0b63ff7d0774770f8fe1d1722fa83acd02f434e4fc110a0cc8f6dddd37d56c463"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000444ad339afbc21e9abf7b602a5ca535ea378135b6d10d81310bdd8293d1df3252b63ff7d0774770f8fe1d1722fa83acd02f434e4fc110a0cc8f6dddd37d56c463",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAERK0zmvvCHpq/e2AqXKU16jeBNbbRDYEx\nC92Ck9HfMlK2P/fQd0dw+P4dFyL6g6zQL0NOT8EQoMyPbd3TfVbEYw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1091,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02203e9a7582886089c62fb840cf3b83061cd1cff3ae4341808bb5bdee6191174177",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041260c2122c9e244e1af5151bede0c3ae23b54d7c596881d3eebad21f37dd878c5c9a0c1a9ade76737a8811bd6a7f9287c978ee396aa89c11e47229d2ccb552f0",
+        "wx" : "1260c2122c9e244e1af5151bede0c3ae23b54d7c596881d3eebad21f37dd878c",
+        "wy" : "5c9a0c1a9ade76737a8811bd6a7f9287c978ee396aa89c11e47229d2ccb552f0"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200041260c2122c9e244e1af5151bede0c3ae23b54d7c596881d3eebad21f37dd878c5c9a0c1a9ade76737a8811bd6a7f9287c978ee396aa89c11e47229d2ccb552f0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEEmDCEiyeJE4a9RUb7eDDriO1TXxZaIHT\n7rrSHzfdh4xcmgwamt52c3qIEb1qf5KHyXjuOWqonBHkcinSzLVS8A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1092,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022024238e70b431b1a64efdf9032669939d4b77f249503fc6905feb7540dea3e6d2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041877045be25d34a1d0600f9d5c00d0645a2a54379b6ceefad2e6bf5c2a3352ce821a532cc1751ee1d36d41c3d6ab4e9b143e44ec46d73478ea6a79a5c0e54159",
+        "wx" : "1877045be25d34a1d0600f9d5c00d0645a2a54379b6ceefad2e6bf5c2a3352ce",
+        "wy" : "0821a532cc1751ee1d36d41c3d6ab4e9b143e44ec46d73478ea6a79a5c0e54159"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200041877045be25d34a1d0600f9d5c00d0645a2a54379b6ceefad2e6bf5c2a3352ce821a532cc1751ee1d36d41c3d6ab4e9b143e44ec46d73478ea6a79a5c0e54159",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEGHcEW+JdNKHQYA+dXADQZFoqVDebbO76\n0ua/XCozUs6CGlMswXUe4dNtQcPWq06bFD5E7EbXNHjqanmlwOVBWQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1093,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020101",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04455439fcc3d2deeceddeaece60e7bd17304f36ebb602adf5a22e0b8f1db46a50aec38fb2baf221e9a8d1887c7bf6222dd1834634e77263315af6d23609d04f77",
+        "wx" : "455439fcc3d2deeceddeaece60e7bd17304f36ebb602adf5a22e0b8f1db46a50",
+        "wy" : "0aec38fb2baf221e9a8d1887c7bf6222dd1834634e77263315af6d23609d04f77"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004455439fcc3d2deeceddeaece60e7bd17304f36ebb602adf5a22e0b8f1db46a50aec38fb2baf221e9a8d1887c7bf6222dd1834634e77263315af6d23609d04f77",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAERVQ5/MPS3uzt3q7OYOe9FzBPNuu2Aq31\noi4Ljx20alCuw4+yuvIh6ajRiHx79iIt0YNGNOdyYzFa9tI2CdBPdw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1094,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020102",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042e1f466b024c0c3ace2437de09127fed04b706f94b19a21bb1c2acf35cece7180449ae3523d72534e964972cfd3b38af0bddd9619e5af223e4d1a40f34cf9f1d",
+        "wx" : "2e1f466b024c0c3ace2437de09127fed04b706f94b19a21bb1c2acf35cece718",
+        "wy" : "449ae3523d72534e964972cfd3b38af0bddd9619e5af223e4d1a40f34cf9f1d"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200042e1f466b024c0c3ace2437de09127fed04b706f94b19a21bb1c2acf35cece7180449ae3523d72534e964972cfd3b38af0bddd9619e5af223e4d1a40f34cf9f1d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELh9GawJMDDrOJDfeCRJ/7QS3BvlLGaIb\nscKs81zs5xgESa41I9clNOlklyz9OzivC93ZYZ5a8iPk0aQPNM+fHQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1095,
+          "comment" : "small r and s",
+          "msg" : "313233343030",
+          "sig" : "3006020101020103",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1096,
+          "comment" : "r is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3026022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364142020103",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04dda95d7b0698de5d2d0b4f0034dbe35b50f978fcc518a84abf9c99efd96a25305adc08d6a63dbe831ab99cd9146e3c4c45492ad19521612542256d6af60e7888",
+        "wx" : "0dda95d7b0698de5d2d0b4f0034dbe35b50f978fcc518a84abf9c99efd96a2530",
+        "wy" : "5adc08d6a63dbe831ab99cd9146e3c4c45492ad19521612542256d6af60e7888"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004dda95d7b0698de5d2d0b4f0034dbe35b50f978fcc518a84abf9c99efd96a25305adc08d6a63dbe831ab99cd9146e3c4c45492ad19521612542256d6af60e7888",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE3aldewaY3l0tC08ANNvjW1D5ePzFGKhK\nv5yZ79lqJTBa3AjWpj2+gxq5nNkUbjxMRUkq0ZUhYSVCJW1q9g54iA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1097,
+          "comment" : "s is larger than n",
+          "msg" : "313233343030",
+          "sig" : "3026020101022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd04917c8",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0402ef4d6d6cfd5a94f1d7784226e3e2a6c0a436c55839619f38fb4472b5f9ee777eb4acd4eebda5cd72875ffd2a2f26229c2dc6b46500919a432c86739f3ae866",
+        "wx" : "2ef4d6d6cfd5a94f1d7784226e3e2a6c0a436c55839619f38fb4472b5f9ee77",
+        "wy" : "7eb4acd4eebda5cd72875ffd2a2f26229c2dc6b46500919a432c86739f3ae866"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000402ef4d6d6cfd5a94f1d7784226e3e2a6c0a436c55839619f38fb4472b5f9ee777eb4acd4eebda5cd72875ffd2a2f26229c2dc6b46500919a432c86739f3ae866",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAu9NbWz9WpTx13hCJuPipsCkNsVYOWGf\nOPtEcrX57nd+tKzU7r2lzXKHX/0qLyYinC3GtGUAkZpDLIZznzroZg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1098,
+          "comment" : "small r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302702020101022100c58b162c58b162c58b162c58b162c58a1b242973853e16db75c8a1a71da4d39d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04464f4ff715729cae5072ca3bd801d3195b67aec65e9b01aad20a2943dcbcb584b1afd29d31a39a11d570aa1597439b3b2d1971bf2f1abf15432d0207b10d1d08",
+        "wx" : "464f4ff715729cae5072ca3bd801d3195b67aec65e9b01aad20a2943dcbcb584",
+        "wy" : "0b1afd29d31a39a11d570aa1597439b3b2d1971bf2f1abf15432d0207b10d1d08"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004464f4ff715729cae5072ca3bd801d3195b67aec65e9b01aad20a2943dcbcb584b1afd29d31a39a11d570aa1597439b3b2d1971bf2f1abf15432d0207b10d1d08",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAERk9P9xVynK5Qcso72AHTGVtnrsZemwGq\n0gopQ9y8tYSxr9KdMaOaEdVwqhWXQ5s7LRlxvy8avxVDLQIHsQ0dCA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1099,
+          "comment" : "smallish r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "302c02072d9b4d347952cc022100fcbc5103d0da267477d1791461cf2aa44bf9d43198f79507bd8779d69a13108e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04157f8fddf373eb5f49cfcf10d8b853cf91cbcd7d665c3522ba7dd738ddb79a4cdeadf1a5c448ea3c9f4191a8999abfcc757ac6d64567ef072c47fec613443b8f",
+        "wx" : "157f8fddf373eb5f49cfcf10d8b853cf91cbcd7d665c3522ba7dd738ddb79a4c",
+        "wy" : "0deadf1a5c448ea3c9f4191a8999abfcc757ac6d64567ef072c47fec613443b8f"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004157f8fddf373eb5f49cfcf10d8b853cf91cbcd7d665c3522ba7dd738ddb79a4cdeadf1a5c448ea3c9f4191a8999abfcc757ac6d64567ef072c47fec613443b8f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEFX+P3fNz619Jz88Q2LhTz5HLzX1mXDUi\nun3XON23mkzerfGlxEjqPJ9BkaiZmr/MdXrG1kVn7wcsR/7GE0Q7jw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1100,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "313233343030",
+          "sig" : "3032020d1033e67e37b32b445580bf4efc022100906f906f906f906f906f906f906f906ed8e426f7b1968c35a204236a579723d2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040934a537466c07430e2c48feb990bb19fb78cecc9cee424ea4d130291aa237f0d4f92d23b462804b5b68c52558c01c9996dbf727fccabbeedb9621a400535afa",
+        "wx" : "0934a537466c07430e2c48feb990bb19fb78cecc9cee424ea4d130291aa237f0",
+        "wy" : "0d4f92d23b462804b5b68c52558c01c9996dbf727fccabbeedb9621a400535afa"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200040934a537466c07430e2c48feb990bb19fb78cecc9cee424ea4d130291aa237f0d4f92d23b462804b5b68c52558c01c9996dbf727fccabbeedb9621a400535afa",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAECTSlN0ZsB0MOLEj+uZC7Gft4zsyc7kJO\npNEwKRqiN/DU+S0jtGKAS1toxSVYwByZltv3J/zKu+7bliGkAFNa+g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1101,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "313233343030",
+          "sig" : "3026020201010220783266e90f43dafe5cd9b3b0be86de22f9de83677d0f50713a468ec72fcf5d57",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d6ef20be66c893f741a9bf90d9b74675d1c2a31296397acb3ef174fd0b300c654a0c95478ca00399162d7f0f2dc89efdc2b28a30fbabe285857295a4b0c4e265",
+        "wx" : "0d6ef20be66c893f741a9bf90d9b74675d1c2a31296397acb3ef174fd0b300c65",
+        "wy" : "4a0c95478ca00399162d7f0f2dc89efdc2b28a30fbabe285857295a4b0c4e265"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d6ef20be66c893f741a9bf90d9b74675d1c2a31296397acb3ef174fd0b300c654a0c95478ca00399162d7f0f2dc89efdc2b28a30fbabe285857295a4b0c4e265",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE1u8gvmbIk/dBqb+Q2bdGddHCoxKWOXrL\nPvF0/QswDGVKDJVHjKADmRYtfw8tyJ79wrKKMPur4oWFcpWksMTiZQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1102,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3031020d062522bbd3ecbe7c39e93e7c260220783266e90f43dafe5cd9b3b0be86de22f9de83677d0f50713a468ec72fcf5d57",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b7291d1404e0c0c07dab9372189f4bd58d2ceaa8d15ede544d9514545ba9ee0629c9a63d5e308769cc30ec276a410e6464a27eeafd9e599db10f053a4fe4a829",
+        "wx" : "0b7291d1404e0c0c07dab9372189f4bd58d2ceaa8d15ede544d9514545ba9ee06",
+        "wy" : "29c9a63d5e308769cc30ec276a410e6464a27eeafd9e599db10f053a4fe4a829"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004b7291d1404e0c0c07dab9372189f4bd58d2ceaa8d15ede544d9514545ba9ee0629c9a63d5e308769cc30ec276a410e6464a27eeafd9e599db10f053a4fe4a829",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEtykdFATgwMB9q5NyGJ9L1Y0s6qjRXt5U\nTZUUVFup7gYpyaY9XjCHacww7CdqQQ5kZKJ+6v2eWZ2xDwU6T+SoKQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1103,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "313233343030",
+          "sig" : "3045022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03640c1022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bb79f61857f743bfa1b6e7111ce4094377256969e4e15159123d9548acc3be6c1f9d9f8860dcffd3eb36dd6c31ff2e7226c2009c4c94d8d7d2b5686bf7abd677",
+        "wx" : "0bb79f61857f743bfa1b6e7111ce4094377256969e4e15159123d9548acc3be6c",
+        "wy" : "1f9d9f8860dcffd3eb36dd6c31ff2e7226c2009c4c94d8d7d2b5686bf7abd677"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004bb79f61857f743bfa1b6e7111ce4094377256969e4e15159123d9548acc3be6c1f9d9f8860dcffd3eb36dd6c31ff2e7226c2009c4c94d8d7d2b5686bf7abd677",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEu3n2GFf3Q7+htucRHOQJQ3claWnk4VFZ\nEj2VSKzDvmwfnZ+IYNz/0+s23Wwx/y5yJsIAnEyU2NfStWhr96vWdw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1104,
+          "comment" : "s == 1",
+          "msg" : "313233343030",
+          "sig" : "3025022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1020101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1105,
+          "comment" : "s == 0",
+          "msg" : "313233343030",
+          "sig" : "3025022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c1020100",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d533b789a4af890fa7a82a1fae58c404f9a62a50b49adafab349c513b415087401b4171b803e76b34a9861e10f7bc289a066fd01bd29f84c987a10a5fb18c2d4",
+        "wx" : "0d533b789a4af890fa7a82a1fae58c404f9a62a50b49adafab349c513b4150874",
+        "wy" : "1b4171b803e76b34a9861e10f7bc289a066fd01bd29f84c987a10a5fb18c2d4"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d533b789a4af890fa7a82a1fae58c404f9a62a50b49adafab349c513b415087401b4171b803e76b34a9861e10f7bc289a066fd01bd29f84c987a10a5fb18c2d4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE1TO3iaSviQ+nqCofrljEBPmmKlC0mtr6\ns0nFE7QVCHQBtBcbgD52s0qYYeEPe8KJoGb9Ab0p+EyYehCl+xjC1A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1106,
+          "comment" : "point at infinity during verify",
+          "msg" : "313233343030",
+          "sig" : "304402207fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04feb5163b0ece30ff3e03c7d55c4380fa2fa81ee2c0354942ff6f08c99d0cd82ce87de05ee1bda089d3e4e248fa0f721102acfffdf50e654be281433999df897e",
+        "wx" : "0feb5163b0ece30ff3e03c7d55c4380fa2fa81ee2c0354942ff6f08c99d0cd82c",
+        "wy" : "0e87de05ee1bda089d3e4e248fa0f721102acfffdf50e654be281433999df897e"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004feb5163b0ece30ff3e03c7d55c4380fa2fa81ee2c0354942ff6f08c99d0cd82ce87de05ee1bda089d3e4e248fa0f721102acfffdf50e654be281433999df897e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE/rUWOw7OMP8+A8fVXEOA+i+oHuLANUlC\n/28IyZ0M2CzofeBe4b2gidPk4kj6D3IRAqz//fUOZUvigUM5md+Jfg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1107,
+          "comment" : "u1 == 1",
+          "msg" : "313233343030",
+          "sig" : "3045022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04238ced001cf22b8853e02edc89cbeca5050ba7e042a7a77f9382cd414922897640683d3094643840f295890aa4c18aa39b41d77dd0fb3bb2700e4f9ec284ffc2",
+        "wx" : "238ced001cf22b8853e02edc89cbeca5050ba7e042a7a77f9382cd4149228976",
+        "wy" : "40683d3094643840f295890aa4c18aa39b41d77dd0fb3bb2700e4f9ec284ffc2"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004238ced001cf22b8853e02edc89cbeca5050ba7e042a7a77f9382cd414922897640683d3094643840f295890aa4c18aa39b41d77dd0fb3bb2700e4f9ec284ffc2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEI4ztABzyK4hT4C7cicvspQULp+BCp6d/\nk4LNQUkiiXZAaD0wlGQ4QPKViQqkwYqjm0HXfdD7O7JwDk+ewoT/wg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1108,
+          "comment" : "u1 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022044a5ad0bd0636d9e12bc9e0a6bdd5e1bba77f523842193b3b82e448e05d5f11e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04961cf64817c06c0e51b3c2736c922fde18bd8c4906fcd7f5ef66c4678508f35ed2c5d18168cfbe70f2f123bd7419232bb92dd69113e2941061889481c5a027bf",
+        "wx" : "0961cf64817c06c0e51b3c2736c922fde18bd8c4906fcd7f5ef66c4678508f35e",
+        "wy" : "0d2c5d18168cfbe70f2f123bd7419232bb92dd69113e2941061889481c5a027bf"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004961cf64817c06c0e51b3c2736c922fde18bd8c4906fcd7f5ef66c4678508f35ed2c5d18168cfbe70f2f123bd7419232bb92dd69113e2941061889481c5a027bf",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAElhz2SBfAbA5Rs8JzbJIv3hi9jEkG/Nf1\n72bEZ4UI817SxdGBaM++cPLxI710GSMruS3WkRPilBBhiJSBxaAnvw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1109,
+          "comment" : "u2 == 1",
+          "msg" : "313233343030",
+          "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0413681eae168cd4ea7cf2e2a45d052742d10a9f64e796867dbdcb829fe0b1028816528760d177376c09df79de39557c329cc1753517acffe8fa2ec298026b8384",
+        "wx" : "13681eae168cd4ea7cf2e2a45d052742d10a9f64e796867dbdcb829fe0b10288",
+        "wy" : "16528760d177376c09df79de39557c329cc1753517acffe8fa2ec298026b8384"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000413681eae168cd4ea7cf2e2a45d052742d10a9f64e796867dbdcb829fe0b1028816528760d177376c09df79de39557c329cc1753517acffe8fa2ec298026b8384",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEE2gerhaM1Op88uKkXQUnQtEKn2TnloZ9\nvcuCn+CxAogWUodg0Xc3bAnfed45VXwynMF1NRes/+j6LsKYAmuDhA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1110,
+          "comment" : "u2 == n - 1",
+          "msg" : "313233343030",
+          "sig" : "3045022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215b8022100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa9d1c9e899ca306ad27fe1945de0242b89",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045aa7abfdb6b4086d543325e5d79c6e95ce42f866d2bb84909633a04bb1aa31c291c80088794905e1da33336d874e2f91ccf45cc59185bede5dd6f3f7acaae18b",
+        "wx" : "5aa7abfdb6b4086d543325e5d79c6e95ce42f866d2bb84909633a04bb1aa31c2",
+        "wy" : "091c80088794905e1da33336d874e2f91ccf45cc59185bede5dd6f3f7acaae18b"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200045aa7abfdb6b4086d543325e5d79c6e95ce42f866d2bb84909633a04bb1aa31c291c80088794905e1da33336d874e2f91ccf45cc59185bede5dd6f3f7acaae18b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEWqer/ba0CG1UMyXl15xulc5C+GbSu4SQ\nljOgS7GqMcKRyACIeUkF4dozM22HTi+RzPRcxZGFvt5d1vP3rKrhiw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1111,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100e91e1ba6ba898620a46bcb51dc0b8b4ad1dc35dad892c4552d1847b2ce444637",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400277791b305a45b2b39590b2f05d3392a6c8182cef4eb540120e0f5c206c3e464108233fb0b8c3ac892d79ef8e0fbf92ed133addb4554270132584dc52eef41",
+        "wx" : "277791b305a45b2b39590b2f05d3392a6c8182cef4eb540120e0f5c206c3e4",
+        "wy" : "64108233fb0b8c3ac892d79ef8e0fbf92ed133addb4554270132584dc52eef41"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000400277791b305a45b2b39590b2f05d3392a6c8182cef4eb540120e0f5c206c3e464108233fb0b8c3ac892d79ef8e0fbf92ed133addb4554270132584dc52eef41",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEACd3kbMFpFsrOVkLLwXTOSpsgYLO9OtU\nASDg9cIGw+RkEIIz+wuMOsiS15744Pv5LtEzrdtFVCcBMlhNxS7vQQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1112,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100e36bf0cec06d9b841da81332812f74f30bbaec9f202319206c6f0b8a0a400ff7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046efa092b68de9460f0bcc919005a5f6e80e19de98968be3cd2c770a9949bfb1ac75e6e5087d6550d5f9beb1e79e5029307bc255235e2d5dc99241ac3ab886c49",
+        "wx" : "6efa092b68de9460f0bcc919005a5f6e80e19de98968be3cd2c770a9949bfb1a",
+        "wy" : "0c75e6e5087d6550d5f9beb1e79e5029307bc255235e2d5dc99241ac3ab886c49"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200046efa092b68de9460f0bcc919005a5f6e80e19de98968be3cd2c770a9949bfb1ac75e6e5087d6550d5f9beb1e79e5029307bc255235e2d5dc99241ac3ab886c49",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbvoJK2jelGDwvMkZAFpfboDhnemJaL48\n0sdwqZSb+xrHXm5Qh9ZVDV+b6x555QKTB7wlUjXi1dyZJBrDq4hsSQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1113,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100ea26b57af884b6c06e348efe139c1e4e9ec9518d60c340f6bac7d278ca08d8a6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0472d4a19c4f9d2cf5848ea40445b70d4696b5f02d632c0c654cc7d7eeb0c6d058e8c4cd9943e459174c7ac01fa742198e47e6c19a6bdb0c4f6c237831c1b3f942",
+        "wx" : "72d4a19c4f9d2cf5848ea40445b70d4696b5f02d632c0c654cc7d7eeb0c6d058",
+        "wy" : "0e8c4cd9943e459174c7ac01fa742198e47e6c19a6bdb0c4f6c237831c1b3f942"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000472d4a19c4f9d2cf5848ea40445b70d4696b5f02d632c0c654cc7d7eeb0c6d058e8c4cd9943e459174c7ac01fa742198e47e6c19a6bdb0c4f6c237831c1b3f942",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEctShnE+dLPWEjqQERbcNRpa18C1jLAxl\nTMfX7rDG0FjoxM2ZQ+RZF0x6wB+nQhmOR+bBmmvbDE9sI3gxwbP5Qg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1114,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02205b1d27a7694c146244a5ad0bd0636d9d9ef3b9fb58385418d9c982105077d1b7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042a8ea2f50dcced0c217575bdfa7cd47d1c6f100041ec0e35512794c1be7e740258f8c17122ed303fda7143eb58bede70295b653266013b0b0ebd3f053137f6ec",
+        "wx" : "2a8ea2f50dcced0c217575bdfa7cd47d1c6f100041ec0e35512794c1be7e7402",
+        "wy" : "58f8c17122ed303fda7143eb58bede70295b653266013b0b0ebd3f053137f6ec"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200042a8ea2f50dcced0c217575bdfa7cd47d1c6f100041ec0e35512794c1be7e740258f8c17122ed303fda7143eb58bede70295b653266013b0b0ebd3f053137f6ec",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEKo6i9Q3M7QwhdXW9+nzUfRxvEABB7A41\nUSeUwb5+dAJY+MFxIu0wP9pxQ+tYvt5wKVtlMmYBOwsOvT8FMTf27A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1115,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100d27a7694c146244a5ad0bd0636d9e12abe687897e8e9998ddbd4e59a78520d0f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0488de689ce9af1e94be6a2089c8a8b1253ffdbb6c8e9c86249ba220001a4ad3b80c4998e54842f413b9edb1825acbb6335e81e4d184b2b01c8bebdc85d1f28946",
+        "wx" : "088de689ce9af1e94be6a2089c8a8b1253ffdbb6c8e9c86249ba220001a4ad3b8",
+        "wy" : "0c4998e54842f413b9edb1825acbb6335e81e4d184b2b01c8bebdc85d1f28946"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000488de689ce9af1e94be6a2089c8a8b1253ffdbb6c8e9c86249ba220001a4ad3b80c4998e54842f413b9edb1825acbb6335e81e4d184b2b01c8bebdc85d1f28946",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEiN5onOmvHpS+aiCJyKixJT/9u2yOnIYk\nm6IgABpK07gMSZjlSEL0E7ntsYJay7YzXoHk0YSysByL69yF0fKJRg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1116,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100a4f4ed29828c4894b5a17a0c6db3c256c2221449228a92dff7d76ca8206dd8dd",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fea2d31f70f90d5fb3e00e186ac42ab3c1615cee714e0b4e1131b3d4d8225bf7b037a18df2ac15343f30f74067ddf29e817d5f77f8dce05714da59c094f0cda9",
+        "wx" : "0fea2d31f70f90d5fb3e00e186ac42ab3c1615cee714e0b4e1131b3d4d8225bf7",
+        "wy" : "0b037a18df2ac15343f30f74067ddf29e817d5f77f8dce05714da59c094f0cda9"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004fea2d31f70f90d5fb3e00e186ac42ab3c1615cee714e0b4e1131b3d4d8225bf7b037a18df2ac15343f30f74067ddf29e817d5f77f8dce05714da59c094f0cda9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE/qLTH3D5DV+z4A4YasQqs8FhXO5xTgtO\nETGz1NgiW/ewN6GN8qwVND8w90Bn3fKegX1fd/jc4FcU2lnAlPDNqQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1117,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0220694c146244a5ad0bd0636d9e12bc9e09e60e68b90d0b5e6c5dddd0cb694d8799",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047258911e3d423349166479dbe0b8341af7fbd03d0a7e10edccb36b6ceea5a3db17ac2b8992791128fa3b96dc2fbd4ca3bfa782ef2832fc6656943db18e7346b0",
+        "wx" : "7258911e3d423349166479dbe0b8341af7fbd03d0a7e10edccb36b6ceea5a3db",
+        "wy" : "17ac2b8992791128fa3b96dc2fbd4ca3bfa782ef2832fc6656943db18e7346b0"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200047258911e3d423349166479dbe0b8341af7fbd03d0a7e10edccb36b6ceea5a3db17ac2b8992791128fa3b96dc2fbd4ca3bfa782ef2832fc6656943db18e7346b0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEcliRHj1CM0kWZHnb4Lg0Gvf70D0KfhDt\nzLNrbO6lo9sXrCuJknkRKPo7ltwvvUyjv6eC7ygy/GZWlD2xjnNGsA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1118,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02203d7f487c07bfc5f30846938a3dcef696444707cf9677254a92b06c63ab867d22",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044f28461dea64474d6bb34d1499c97d37b9e95633df1ceeeaacd45016c98b3914c8818810b8cc06ddb40e8a1261c528faa589455d5a6df93b77bc5e0e493c7470",
+        "wx" : "4f28461dea64474d6bb34d1499c97d37b9e95633df1ceeeaacd45016c98b3914",
+        "wy" : "0c8818810b8cc06ddb40e8a1261c528faa589455d5a6df93b77bc5e0e493c7470"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200044f28461dea64474d6bb34d1499c97d37b9e95633df1ceeeaacd45016c98b3914c8818810b8cc06ddb40e8a1261c528faa589455d5a6df93b77bc5e0e493c7470",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAETyhGHepkR01rs00Umcl9N7npVjPfHO7q\nrNRQFsmLORTIgYgQuMwG3bQOihJhxSj6pYlFXVpt+Tt3vF4OSTx0cA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1119,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02206c7648fc0fbf8a06adb8b839f97b4ff7a800f11b1e37c593b261394599792ba4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0474f2a814fb5d8eca91a69b5e60712732b3937de32829be974ed7b68c5c2f5d66eff0f07c56f987a657f42196205f588c0f1d96fd8a63a5f238b48f478788fe3b",
+        "wx" : "74f2a814fb5d8eca91a69b5e60712732b3937de32829be974ed7b68c5c2f5d66",
+        "wy" : "0eff0f07c56f987a657f42196205f588c0f1d96fd8a63a5f238b48f478788fe3b"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000474f2a814fb5d8eca91a69b5e60712732b3937de32829be974ed7b68c5c2f5d66eff0f07c56f987a657f42196205f588c0f1d96fd8a63a5f238b48f478788fe3b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEdPKoFPtdjsqRppteYHEnMrOTfeMoKb6X\nTte2jFwvXWbv8PB8VvmHplf0IZYgX1iMDx2W/YpjpfI4tI9Hh4j+Ow==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1120,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0221009be363a286f23f6322c205449d320baad417953ecb70f6214e90d49d7d1f26a8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04195b51a7cc4a21b8274a70a90de779814c3c8ca358328208c09a29f336b82d6ab2416b7c92fffdc29c3b1282dd2a77a4d04df7f7452047393d849989c5cee9ad",
+        "wx" : "195b51a7cc4a21b8274a70a90de779814c3c8ca358328208c09a29f336b82d6a",
+        "wy" : "0b2416b7c92fffdc29c3b1282dd2a77a4d04df7f7452047393d849989c5cee9ad"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004195b51a7cc4a21b8274a70a90de779814c3c8ca358328208c09a29f336b82d6ab2416b7c92fffdc29c3b1282dd2a77a4d04df7f7452047393d849989c5cee9ad",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEGVtRp8xKIbgnSnCpDed5gUw8jKNYMoII\nwJop8za4LWqyQWt8kv/9wpw7EoLdKnek0E3390UgRzk9hJmJxc7prQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1121,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022029798c5c45bdf58b4a7b2fdc2c46ab4af1218c7eeb9f0f27a88f1267674de3b0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04622fc74732034bec2ddf3bc16d34b3d1f7a327dd2a8c19bab4bb4fe3a24b58aa736b2f2fae76f4dfaecc9096333b01328d51eb3fda9c9227e90d0b449983c4f0",
+        "wx" : "622fc74732034bec2ddf3bc16d34b3d1f7a327dd2a8c19bab4bb4fe3a24b58aa",
+        "wy" : "736b2f2fae76f4dfaecc9096333b01328d51eb3fda9c9227e90d0b449983c4f0"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004622fc74732034bec2ddf3bc16d34b3d1f7a327dd2a8c19bab4bb4fe3a24b58aa736b2f2fae76f4dfaecc9096333b01328d51eb3fda9c9227e90d0b449983c4f0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEYi/HRzIDS+wt3zvBbTSz0fejJ90qjBm6\ntLtP46JLWKpzay8vrnb0367MkJYzOwEyjVHrP9qckifpDQtEmYPE8A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1122,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02200b70f22ca2bb3cefadca1a5711fa3a59f4695385eb5aedf3495d0b6d00f8fd85",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041f7f85caf2d7550e7af9b65023ebb4dce3450311692309db269969b834b611c70827f45b78020ecbbaf484fdd5bfaae6870f1184c21581baf6ef82bd7b530f93",
+        "wx" : "1f7f85caf2d7550e7af9b65023ebb4dce3450311692309db269969b834b611c7",
+        "wy" : "0827f45b78020ecbbaf484fdd5bfaae6870f1184c21581baf6ef82bd7b530f93"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200041f7f85caf2d7550e7af9b65023ebb4dce3450311692309db269969b834b611c70827f45b78020ecbbaf484fdd5bfaae6870f1184c21581baf6ef82bd7b530f93",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEH3+FyvLXVQ56+bZQI+u03ONFAxFpIwnb\nJplpuDS2EccIJ/RbeAIOy7r0hP3Vv6rmhw8RhMIVgbr274K9e1MPkw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1123,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022016e1e459457679df5b9434ae23f474b3e8d2a70bd6b5dbe692ba16da01f1fb0a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0449c197dc80ad1da47a4342b93893e8e1fb0bb94fc33a83e783c00b24c781377aefc20da92bac762951f72474becc734d4cc22ba81b895e282fdac4df7af0f37d",
+        "wx" : "49c197dc80ad1da47a4342b93893e8e1fb0bb94fc33a83e783c00b24c781377a",
+        "wy" : "0efc20da92bac762951f72474becc734d4cc22ba81b895e282fdac4df7af0f37d"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000449c197dc80ad1da47a4342b93893e8e1fb0bb94fc33a83e783c00b24c781377aefc20da92bac762951f72474becc734d4cc22ba81b895e282fdac4df7af0f37d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEScGX3ICtHaR6Q0K5OJPo4fsLuU/DOoPn\ng8ALJMeBN3rvwg2pK6x2KVH3JHS+zHNNTMIrqBuJXigv2sTfevDzfQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1124,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202252d685e831b6cf095e4f0535eeaf0ddd3bfa91c210c9d9dc17224702eaf88f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d8cb68517b616a56400aa3868635e54b6f699598a2f6167757654980baf6acbe7ec8cf449c849aa03461a30efada41453c57c6e6fbc93bbc6fa49ada6dc0555c",
+        "wx" : "0d8cb68517b616a56400aa3868635e54b6f699598a2f6167757654980baf6acbe",
+        "wy" : "7ec8cf449c849aa03461a30efada41453c57c6e6fbc93bbc6fa49ada6dc0555c"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d8cb68517b616a56400aa3868635e54b6f699598a2f6167757654980baf6acbe7ec8cf449c849aa03461a30efada41453c57c6e6fbc93bbc6fa49ada6dc0555c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE2MtoUXthalZACqOGhjXlS29plZii9hZ3\nV2VJgLr2rL5+yM9EnISaoDRhow762kFFPFfG5vvJO7xvpJrabcBVXA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1125,
+          "comment" : "edge case for u1",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022075135abd7c425b60371a477f09ce0f274f64a8c6b061a07b5d63e93c65046c53",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04030713fb63f2aa6fe2cadf1b20efc259c77445dafa87dac398b84065ca347df3b227818de1a39b589cb071d83e5317cccdc2338e51e312fe31d8dc34a4801750",
+        "wx" : "30713fb63f2aa6fe2cadf1b20efc259c77445dafa87dac398b84065ca347df3",
+        "wy" : "0b227818de1a39b589cb071d83e5317cccdc2338e51e312fe31d8dc34a4801750"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004030713fb63f2aa6fe2cadf1b20efc259c77445dafa87dac398b84065ca347df3b227818de1a39b589cb071d83e5317cccdc2338e51e312fe31d8dc34a4801750",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAwcT+2Pyqm/iyt8bIO/CWcd0Rdr6h9rD\nmLhAZco0ffOyJ4GN4aObWJywcdg+UxfMzcIzjlHjEv4x2Nw0pIAXUA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1126,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100d55555555555555555555555555555547c74934474db157d2a8c3f088aced62a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04babb3677b0955802d8e929a41355640eaf1ea1353f8a771331c4946e3480afa7252f196c87ed3d2a59d3b1b559137fed0013fecefc19fb5a92682b9bca51b950",
+        "wx" : "0babb3677b0955802d8e929a41355640eaf1ea1353f8a771331c4946e3480afa7",
+        "wy" : "252f196c87ed3d2a59d3b1b559137fed0013fecefc19fb5a92682b9bca51b950"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004babb3677b0955802d8e929a41355640eaf1ea1353f8a771331c4946e3480afa7252f196c87ed3d2a59d3b1b559137fed0013fecefc19fb5a92682b9bca51b950",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEurs2d7CVWALY6SmkE1VkDq8eoTU/incT\nMcSUbjSAr6clLxlsh+09KlnTsbVZE3/tABP+zvwZ+1qSaCubylG5UA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1127,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100c1777c8853938e536213c02464a936000ba1e21c0fc62075d46c624e23b52f31",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041aab2018793471111a8a0e9b143fde02fc95920796d3a63de329b424396fba60bbe4130705174792441b318d3aa31dfe8577821e9b446ec573d272e036c4ebe9",
+        "wx" : "1aab2018793471111a8a0e9b143fde02fc95920796d3a63de329b424396fba60",
+        "wy" : "0bbe4130705174792441b318d3aa31dfe8577821e9b446ec573d272e036c4ebe9"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200041aab2018793471111a8a0e9b143fde02fc95920796d3a63de329b424396fba60bbe4130705174792441b318d3aa31dfe8577821e9b446ec573d272e036c4ebe9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEGqsgGHk0cREaig6bFD/eAvyVkgeW06Y9\n4ym0JDlvumC75BMHBRdHkkQbMY06ox3+hXeCHptEbsVz0nLgNsTr6Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1128,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022030bbb794db588363b40679f6c182a50d3ce9679acdd3ffbe36d7813dacbdc818",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048cb0b909499c83ea806cd885b1dd467a0119f06a88a0276eb0cfda274535a8ff47b5428833bc3f2c8bf9d9041158cf33718a69961cd01729bc0011d1e586ab75",
+        "wx" : "08cb0b909499c83ea806cd885b1dd467a0119f06a88a0276eb0cfda274535a8ff",
+        "wy" : "47b5428833bc3f2c8bf9d9041158cf33718a69961cd01729bc0011d1e586ab75"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200048cb0b909499c83ea806cd885b1dd467a0119f06a88a0276eb0cfda274535a8ff47b5428833bc3f2c8bf9d9041158cf33718a69961cd01729bc0011d1e586ab75",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEjLC5CUmcg+qAbNiFsd1GegEZ8GqIoCdu\nsM/aJ0U1qP9HtUKIM7w/LIv52QQRWM8zcYpplhzQFym8ABHR5YardQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1129,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202c37fd995622c4fb7fffffffffffffffc7cee745110cb45ab558ed7c90c15a2f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048f03cf1a42272bb1532723093f72e6feeac85e1700e9fbe9a6a2dd642d74bf5d3b89a7189dad8cf75fc22f6f158aa27f9c2ca00daca785be3358f2bda3862ca0",
+        "wx" : "08f03cf1a42272bb1532723093f72e6feeac85e1700e9fbe9a6a2dd642d74bf5d",
+        "wy" : "3b89a7189dad8cf75fc22f6f158aa27f9c2ca00daca785be3358f2bda3862ca0"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200048f03cf1a42272bb1532723093f72e6feeac85e1700e9fbe9a6a2dd642d74bf5d3b89a7189dad8cf75fc22f6f158aa27f9c2ca00daca785be3358f2bda3862ca0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEjwPPGkInK7FTJyMJP3Lm/urIXhcA6fvp\npqLdZC10v107iacYna2M91/CL28ViqJ/nCygDaynhb4zWPK9o4YsoA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1130,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02207fd995622c4fb7ffffffffffffffffff5d883ffab5b32652ccdcaa290fccb97d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0444de3b9c7a57a8c9e820952753421e7d987bb3d79f71f013805c897e018f8acea2460758c8f98d3fdce121a943659e372c326fff2e5fc2ae7fa3f79daae13c12",
+        "wx" : "44de3b9c7a57a8c9e820952753421e7d987bb3d79f71f013805c897e018f8ace",
+        "wy" : "0a2460758c8f98d3fdce121a943659e372c326fff2e5fc2ae7fa3f79daae13c12"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000444de3b9c7a57a8c9e820952753421e7d987bb3d79f71f013805c897e018f8acea2460758c8f98d3fdce121a943659e372c326fff2e5fc2ae7fa3f79daae13c12",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAERN47nHpXqMnoIJUnU0IefZh7s9efcfAT\ngFyJfgGPis6iRgdYyPmNP9zhIalDZZ43LDJv/y5fwq5/o/edquE8Eg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1131,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100ffb32ac4589f6ffffffffffffffffffebb107ff56b664ca599b954521f9972fa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046fb8b2b48e33031268ad6a517484dc8839ea90f6669ea0c7ac3233e2ac31394a0ac8bbe7f73c2ff4df9978727ac1dfc2fd58647d20f31f99105316b64671f204",
+        "wx" : "6fb8b2b48e33031268ad6a517484dc8839ea90f6669ea0c7ac3233e2ac31394a",
+        "wy" : "0ac8bbe7f73c2ff4df9978727ac1dfc2fd58647d20f31f99105316b64671f204"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200046fb8b2b48e33031268ad6a517484dc8839ea90f6669ea0c7ac3233e2ac31394a0ac8bbe7f73c2ff4df9978727ac1dfc2fd58647d20f31f99105316b64671f204",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEb7iytI4zAxJorWpRdITciDnqkPZmnqDH\nrDIz4qwxOUoKyLvn9zwv9N+ZeHJ6wd/C/VhkfSDzH5kQUxa2RnHyBA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1132,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02205622c4fb7fffffffffffffffffffffff928a8f1c7ac7bec1808b9f61c01ec327",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bea71122a048693e905ff602b3cf9dd18af69b9fc9d8431d2b1dd26b942c95e6f43c7b8b95eb62082c12db9dbda7fe38e45cbe4a4886907fb81bdb0c5ea9246c",
+        "wx" : "0bea71122a048693e905ff602b3cf9dd18af69b9fc9d8431d2b1dd26b942c95e6",
+        "wy" : "0f43c7b8b95eb62082c12db9dbda7fe38e45cbe4a4886907fb81bdb0c5ea9246c"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004bea71122a048693e905ff602b3cf9dd18af69b9fc9d8431d2b1dd26b942c95e6f43c7b8b95eb62082c12db9dbda7fe38e45cbe4a4886907fb81bdb0c5ea9246c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEvqcRIqBIaT6QX/YCs8+d0Yr2m5/J2EMd\nKx3Sa5Qsleb0PHuLletiCCwS2529p/445Fy+SkiGkH+4G9sMXqkkbA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1133,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022044104104104104104104104104104103b87853fd3b7d3f8e175125b4382f25ed",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04da918c731ba06a20cb94ef33b778e981a404a305f1941fe33666b45b03353156e2bb2694f575b45183be78e5c9b5210bf3bf488fd4c8294516d89572ca4f5391",
+        "wx" : "0da918c731ba06a20cb94ef33b778e981a404a305f1941fe33666b45b03353156",
+        "wy" : "0e2bb2694f575b45183be78e5c9b5210bf3bf488fd4c8294516d89572ca4f5391"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004da918c731ba06a20cb94ef33b778e981a404a305f1941fe33666b45b03353156e2bb2694f575b45183be78e5c9b5210bf3bf488fd4c8294516d89572ca4f5391",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE2pGMcxugaiDLlO8zt3jpgaQEowXxlB/j\nNma0WwM1MVbiuyaU9XW0UYO+eOXJtSEL879Ij9TIKUUW2JVyyk9TkQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1134,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202739ce739ce739ce739ce739ce739ce705560298d1f2f08dc419ac273a5b54d9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043007e92c3937dade7964dfa35b0eff031f7eb02aed0a0314411106cdeb70fe3d5a7546fc0552997b20e3d6f413e75e2cb66e116322697114b79bac734bfc4dc5",
+        "wx" : "3007e92c3937dade7964dfa35b0eff031f7eb02aed0a0314411106cdeb70fe3d",
+        "wy" : "5a7546fc0552997b20e3d6f413e75e2cb66e116322697114b79bac734bfc4dc5"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200043007e92c3937dade7964dfa35b0eff031f7eb02aed0a0314411106cdeb70fe3d5a7546fc0552997b20e3d6f413e75e2cb66e116322697114b79bac734bfc4dc5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEMAfpLDk32t55ZN+jWw7/Ax9+sCrtCgMU\nQREGzetw/j1adUb8BVKZeyDj1vQT514stm4RYyJpcRS3m6xzS/xNxQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1135,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100b777777777777777777777777777777688e6a1fe808a97a348671222ff16b863",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0460e734ef5624d3cbf0ddd375011bd663d6d6aebc644eb599fdf98dbdcd18ce9bd2d90b3ac31f139af832cccf6ccbbb2c6ea11fa97370dc9906da474d7d8a7567",
+        "wx" : "60e734ef5624d3cbf0ddd375011bd663d6d6aebc644eb599fdf98dbdcd18ce9b",
+        "wy" : "0d2d90b3ac31f139af832cccf6ccbbb2c6ea11fa97370dc9906da474d7d8a7567"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000460e734ef5624d3cbf0ddd375011bd663d6d6aebc644eb599fdf98dbdcd18ce9bd2d90b3ac31f139af832cccf6ccbbb2c6ea11fa97370dc9906da474d7d8a7567",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEYOc071Yk08vw3dN1ARvWY9bWrrxkTrWZ\n/fmNvc0YzpvS2Qs6wx8TmvgyzM9sy7ssbqEfqXNw3JkG2kdNfYp1Zw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1136,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02206492492492492492492492492492492406dd3a19b8d5fb875235963c593bd2d3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0485a900e97858f693c0b7dfa261e380dad6ea046d1f65ddeeedd5f7d8af0ba33769744d15add4f6c0bc3b0da2aec93b34cb8c65f9340ddf74e7b0009eeeccce3c",
+        "wx" : "085a900e97858f693c0b7dfa261e380dad6ea046d1f65ddeeedd5f7d8af0ba337",
+        "wy" : "69744d15add4f6c0bc3b0da2aec93b34cb8c65f9340ddf74e7b0009eeeccce3c"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000485a900e97858f693c0b7dfa261e380dad6ea046d1f65ddeeedd5f7d8af0ba33769744d15add4f6c0bc3b0da2aec93b34cb8c65f9340ddf74e7b0009eeeccce3c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEhakA6XhY9pPAt9+iYeOA2tbqBG0fZd3u\n7dX32K8LozdpdE0VrdT2wLw7DaKuyTs0y4xl+TQN33TnsACe7szOPA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1137,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100955555555555555555555555555555547c74934474db157d2a8c3f088aced62c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0438066f75d88efc4c93de36f49e037b234cc18b1de5608750a62cab0345401046a3e84bed8cfcb819ef4d550444f2ce4b651766b69e2e2901f88836ff90034fed",
+        "wx" : "38066f75d88efc4c93de36f49e037b234cc18b1de5608750a62cab0345401046",
+        "wy" : "0a3e84bed8cfcb819ef4d550444f2ce4b651766b69e2e2901f88836ff90034fed"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000438066f75d88efc4c93de36f49e037b234cc18b1de5608750a62cab0345401046a3e84bed8cfcb819ef4d550444f2ce4b651766b69e2e2901f88836ff90034fed",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEOAZvddiO/EyT3jb0ngN7I0zBix3lYIdQ\npiyrA0VAEEaj6EvtjPy4Ge9NVQRE8s5LZRdmtp4uKQH4iDb/kANP7Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1138,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02202aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa3e3a49a23a6d8abe95461f8445676b17",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0498f68177dc95c1b4cbfa5245488ca523a7d5629470d035d621a443c72f39aabfa33d29546fa1c648f2c7d5ccf70cf1ce4ab79b5db1ac059dbecd068dbdff1b89",
+        "wx" : "098f68177dc95c1b4cbfa5245488ca523a7d5629470d035d621a443c72f39aabf",
+        "wy" : "0a33d29546fa1c648f2c7d5ccf70cf1ce4ab79b5db1ac059dbecd068dbdff1b89"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000498f68177dc95c1b4cbfa5245488ca523a7d5629470d035d621a443c72f39aabfa33d29546fa1c648f2c7d5ccf70cf1ce4ab79b5db1ac059dbecd068dbdff1b89",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEmPaBd9yVwbTL+lJFSIylI6fVYpRw0DXW\nIaRDxy85qr+jPSlUb6HGSPLH1cz3DPHOSrebXbGsBZ2+zQaNvf8biQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1139,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304502207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc022100bffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364143",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045c2bbfa23c9b9ad07f038aa89b4930bf267d9401e4255de9e8da0a5078ec8277e3e882a31d5e6a379e0793983ccded39b95c4353ab2ff01ea5369ba47b0c3191",
+        "wx" : "5c2bbfa23c9b9ad07f038aa89b4930bf267d9401e4255de9e8da0a5078ec8277",
+        "wy" : "0e3e882a31d5e6a379e0793983ccded39b95c4353ab2ff01ea5369ba47b0c3191"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200045c2bbfa23c9b9ad07f038aa89b4930bf267d9401e4255de9e8da0a5078ec8277e3e882a31d5e6a379e0793983ccded39b95c4353ab2ff01ea5369ba47b0c3191",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEXCu/ojybmtB/A4qom0kwvyZ9lAHkJV3p\n6NoKUHjsgnfj6IKjHV5qN54Hk5g8ze05uVxDU6sv8B6lNpukewwxkQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1140,
+          "comment" : "edge case for u2",
+          "msg" : "313233343030",
+          "sig" : "304402207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0220185ddbca6dac41b1da033cfb60c152869e74b3cd66e9ffdf1b6bc09ed65ee40c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042ea7133432339c69d27f9b267281bd2ddd5f19d6338d400a05cd3647b157a3853547808298448edb5e701ade84cd5fb1ac9567ba5e8fb68a6b933ec4b5cc84cc",
+        "wx" : "2ea7133432339c69d27f9b267281bd2ddd5f19d6338d400a05cd3647b157a385",
+        "wy" : "3547808298448edb5e701ade84cd5fb1ac9567ba5e8fb68a6b933ec4b5cc84cc"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200042ea7133432339c69d27f9b267281bd2ddd5f19d6338d400a05cd3647b157a3853547808298448edb5e701ade84cd5fb1ac9567ba5e8fb68a6b933ec4b5cc84cc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELqcTNDIznGnSf5smcoG9Ld1fGdYzjUAK\nBc02R7FXo4U1R4CCmESO215wGt6EzV+xrJVnul6Ptoprkz7EtcyEzA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1141,
+          "comment" : "point duplication during verification",
+          "msg" : "313233343030",
+          "sig" : "3045022032b0d10d8d0e04bc8d4d064d270699e87cffc9b49c5c20730e1c26f6105ddcda022100d612c2984c2afa416aa7f2882a486d4a8426cb6cfc91ed5b737278f9fca8be68",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042ea7133432339c69d27f9b267281bd2ddd5f19d6338d400a05cd3647b157a385cab87f7d67bb7124a18fe5217b32a04e536a9845a1704975946cc13a4a337763",
+        "wx" : "2ea7133432339c69d27f9b267281bd2ddd5f19d6338d400a05cd3647b157a385",
+        "wy" : "0cab87f7d67bb7124a18fe5217b32a04e536a9845a1704975946cc13a4a337763"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200042ea7133432339c69d27f9b267281bd2ddd5f19d6338d400a05cd3647b157a385cab87f7d67bb7124a18fe5217b32a04e536a9845a1704975946cc13a4a337763",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAELqcTNDIznGnSf5smcoG9Ld1fGdYzjUAK\nBc02R7FXo4XKuH99Z7txJKGP5SF7MqBOU2qYRaFwSXWUbME6SjN3Yw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1142,
+          "comment" : "duplication bug",
+          "msg" : "313233343030",
+          "sig" : "3045022032b0d10d8d0e04bc8d4d064d270699e87cffc9b49c5c20730e1c26f6105ddcda022100d612c2984c2afa416aa7f2882a486d4a8426cb6cfc91ed5b737278f9fca8be68",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048aa2c64fa9c6437563abfbcbd00b2048d48c18c152a2a6f49036de7647ebe82e1ce64387995c68a060fa3bc0399b05cc06eec7d598f75041a4917e692b7f51ff",
+        "wx" : "08aa2c64fa9c6437563abfbcbd00b2048d48c18c152a2a6f49036de7647ebe82e",
+        "wy" : "1ce64387995c68a060fa3bc0399b05cc06eec7d598f75041a4917e692b7f51ff"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200048aa2c64fa9c6437563abfbcbd00b2048d48c18c152a2a6f49036de7647ebe82e1ce64387995c68a060fa3bc0399b05cc06eec7d598f75041a4917e692b7f51ff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEiqLGT6nGQ3Vjq/vL0AsgSNSMGMFSoqb0\nkDbedkfr6C4c5kOHmVxooGD6O8A5mwXMBu7H1Zj3UEGkkX5pK39R/w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1143,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "313233343030",
+          "sig" : "3044022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0022033333333333333333333333333333332f222f8faefdb533f265d461c29a47373",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04391427ff7ee78013c14aec7d96a8a062209298a783835e94fd6549d502fff71fdd6624ec343ad9fcf4d9872181e59f842f9ba4cccae09a6c0972fb6ac6b4c6bd",
+        "wx" : "391427ff7ee78013c14aec7d96a8a062209298a783835e94fd6549d502fff71f",
+        "wy" : "0dd6624ec343ad9fcf4d9872181e59f842f9ba4cccae09a6c0972fb6ac6b4c6bd"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004391427ff7ee78013c14aec7d96a8a062209298a783835e94fd6549d502fff71fdd6624ec343ad9fcf4d9872181e59f842f9ba4cccae09a6c0972fb6ac6b4c6bd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEORQn/37ngBPBSux9lqigYiCSmKeDg16U\n/WVJ1QL/9x/dZiTsNDrZ/PTZhyGB5Z+EL5ukzMrgmmwJcvtqxrTGvQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1144,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e762b8a219b4f180219cc7a9059245e4961bd191c03899789c7a34b89e8c138ec1533ef0419bb7376e0bfde9319d10a06968791d9ea0eed9c1ce6345aed9759e",
+        "wx" : "0e762b8a219b4f180219cc7a9059245e4961bd191c03899789c7a34b89e8c138e",
+        "wy" : "0c1533ef0419bb7376e0bfde9319d10a06968791d9ea0eed9c1ce6345aed9759e"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004e762b8a219b4f180219cc7a9059245e4961bd191c03899789c7a34b89e8c138ec1533ef0419bb7376e0bfde9319d10a06968791d9ea0eed9c1ce6345aed9759e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE52K4ohm08YAhnMepBZJF5JYb0ZHAOJl4\nnHo0uJ6ME47BUz7wQZu3N24L/ekxnRCgaWh5HZ6g7tnBzmNFrtl1ng==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1145,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3046022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022100b6db6db6db6db6db6db6db6db6db6db5f30f30127d33e02aad96438927022e9c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049aedb0d281db164e130000c5697fae0f305ef848be6fffb43ac593fbb950e952fa6f633359bdcd82b56b0b9f965b037789d46b9a8141b791b2aefa713f96c175",
+        "wx" : "09aedb0d281db164e130000c5697fae0f305ef848be6fffb43ac593fbb950e952",
+        "wy" : "0fa6f633359bdcd82b56b0b9f965b037789d46b9a8141b791b2aefa713f96c175"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200049aedb0d281db164e130000c5697fae0f305ef848be6fffb43ac593fbb950e952fa6f633359bdcd82b56b0b9f965b037789d46b9a8141b791b2aefa713f96c175",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEmu2w0oHbFk4TAADFaX+uDzBe+Ei+b/+0\nOsWT+7lQ6VL6b2MzWb3NgrVrC5+WWwN3idRrmoFBt5GyrvpxP5bBdQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1146,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3046022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee502210099999999999999999999999999999998d668eaf0cf91f9bd7317d2547ced5a5a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048ad445db62816260e4e687fd1884e48b9fc0636d031547d63315e792e19bfaee1de64f99d5f1cd8b6ec9cb0f787a654ae86993ba3db1008ef43cff0684cb22bd",
+        "wx" : "08ad445db62816260e4e687fd1884e48b9fc0636d031547d63315e792e19bfaee",
+        "wy" : "1de64f99d5f1cd8b6ec9cb0f787a654ae86993ba3db1008ef43cff0684cb22bd"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200048ad445db62816260e4e687fd1884e48b9fc0636d031547d63315e792e19bfaee1de64f99d5f1cd8b6ec9cb0f787a654ae86993ba3db1008ef43cff0684cb22bd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEitRF22KBYmDk5of9GITki5/AY20DFUfW\nMxXnkuGb+u4d5k+Z1fHNi27Jyw94emVK6GmTuj2xAI70PP8GhMsivQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1147,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022066666666666666666666666666666665e445f1f5dfb6a67e4cba8c385348e6e7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041f5799c95be89063b24f26e40cb928c1a868a76fb0094607e8043db409c91c32e75724e813a4191e3a839007f08e2e897388b06d4a00de6de60e536d91fab566",
+        "wx" : "1f5799c95be89063b24f26e40cb928c1a868a76fb0094607e8043db409c91c32",
+        "wy" : "0e75724e813a4191e3a839007f08e2e897388b06d4a00de6de60e536d91fab566"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200041f5799c95be89063b24f26e40cb928c1a868a76fb0094607e8043db409c91c32e75724e813a4191e3a839007f08e2e897388b06d4a00de6de60e536d91fab566",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEH1eZyVvokGOyTybkDLkowahop2+wCUYH\n6AQ9tAnJHDLnVyToE6QZHjqDkAfwji6Jc4iwbUoA3m3mDlNtkfq1Zg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1148,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5022049249249249249249249249249249248c79facd43214c011123c1b03a93412a5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a3331a4e1b4223ec2c027edd482c928a14ed358d93f1d4217d39abf69fcb5ccc28d684d2aaabcd6383775caa6239de26d4c6937bb603ecb4196082f4cffd509d",
+        "wx" : "0a3331a4e1b4223ec2c027edd482c928a14ed358d93f1d4217d39abf69fcb5ccc",
+        "wy" : "28d684d2aaabcd6383775caa6239de26d4c6937bb603ecb4196082f4cffd509d"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004a3331a4e1b4223ec2c027edd482c928a14ed358d93f1d4217d39abf69fcb5ccc28d684d2aaabcd6383775caa6239de26d4c6937bb603ecb4196082f4cffd509d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEozMaThtCI+wsAn7dSCySihTtNY2T8dQh\nfTmr9p/LXMwo1oTSqqvNY4N3XKpiOd4m1MaTe7YD7LQZYIL0z/1QnQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1149,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "3045022100c6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee502200eb10e5ab95f2f275348d82ad2e4d7949c8193800d8c9c75df58e343f0ebba7b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043f3952199774c7cf39b38b66cb1042a6260d8680803845e4d433adba3bb248185ea495b68cbc7ed4173ee63c9042dc502625c7eb7e21fb02ca9a9114e0a3a18d",
+        "wx" : "3f3952199774c7cf39b38b66cb1042a6260d8680803845e4d433adba3bb24818",
+        "wy" : "5ea495b68cbc7ed4173ee63c9042dc502625c7eb7e21fb02ca9a9114e0a3a18d"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200043f3952199774c7cf39b38b66cb1042a6260d8680803845e4d433adba3bb248185ea495b68cbc7ed4173ee63c9042dc502625c7eb7e21fb02ca9a9114e0a3a18d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEPzlSGZd0x885s4tmyxBCpiYNhoCAOEXk\n1DOtujuySBhepJW2jLx+1Bc+5jyQQtxQJiXH634h+wLKmpEU4KOhjQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1150,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "313233343030",
+          "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022055555555555555555555555555555554e8e4f44ce51835693ff0ca2ef01215c0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cdfb8c0f422e144e137c2412c86c171f5fe3fa3f5bbb544e9076288f3ced786e054fd0721b77c11c79beacb3c94211b0a19bda08652efeaf92513a3b0a163698",
+        "wx" : "0cdfb8c0f422e144e137c2412c86c171f5fe3fa3f5bbb544e9076288f3ced786e",
+        "wy" : "54fd0721b77c11c79beacb3c94211b0a19bda08652efeaf92513a3b0a163698"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004cdfb8c0f422e144e137c2412c86c171f5fe3fa3f5bbb544e9076288f3ced786e054fd0721b77c11c79beacb3c94211b0a19bda08652efeaf92513a3b0a163698",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEzfuMD0IuFE4TfCQSyGwXH1/j+j9bu1RO\nkHYojzzteG4FT9ByG3fBHHm+rLPJQhGwoZvaCGUu/q+SUTo7ChY2mA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1151,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3045022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022100b6db6db6db6db6db6db6db6db6db6db5f30f30127d33e02aad96438927022e9c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0473598a6a1c68278fa6bfd0ce4064e68235bc1c0f6b20a928108be336730f87e3cbae612519b5032ecc85aed811271a95fe7939d5d3460140ba318f4d14aba31d",
+        "wx" : "73598a6a1c68278fa6bfd0ce4064e68235bc1c0f6b20a928108be336730f87e3",
+        "wy" : "0cbae612519b5032ecc85aed811271a95fe7939d5d3460140ba318f4d14aba31d"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000473598a6a1c68278fa6bfd0ce4064e68235bc1c0f6b20a928108be336730f87e3cbae612519b5032ecc85aed811271a95fe7939d5d3460140ba318f4d14aba31d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEc1mKahxoJ4+mv9DOQGTmgjW8HA9rIKko\nEIvjNnMPh+PLrmElGbUDLsyFrtgRJxqV/nk51dNGAUC6MY9NFKujHQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1152,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3045022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802210099999999999999999999999999999998d668eaf0cf91f9bd7317d2547ced5a5a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0458debd9a7ee2c9d59132478a5440ae4d5d7ed437308369f92ea86c82183f10a16773e76f5edbf4da0e4f1bdffac0f57257e1dfa465842931309a24245fda6a5d",
+        "wx" : "58debd9a7ee2c9d59132478a5440ae4d5d7ed437308369f92ea86c82183f10a1",
+        "wy" : "6773e76f5edbf4da0e4f1bdffac0f57257e1dfa465842931309a24245fda6a5d"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000458debd9a7ee2c9d59132478a5440ae4d5d7ed437308369f92ea86c82183f10a16773e76f5edbf4da0e4f1bdffac0f57257e1dfa465842931309a24245fda6a5d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEWN69mn7iydWRMkeKVECuTV1+1Dcwg2n5\nLqhsghg/EKFnc+dvXtv02g5PG9/6wPVyV+HfpGWEKTEwmiQkX9pqXQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1153,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022066666666666666666666666666666665e445f1f5dfb6a67e4cba8c385348e6e7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048b904de47967340c5f8c3572a720924ef7578637feab1949acb241a5a6ac3f5b950904496f9824b1d63f3313bae21b89fae89afdfc811b5ece03fd5aa301864f",
+        "wx" : "08b904de47967340c5f8c3572a720924ef7578637feab1949acb241a5a6ac3f5b",
+        "wy" : "0950904496f9824b1d63f3313bae21b89fae89afdfc811b5ece03fd5aa301864f"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200048b904de47967340c5f8c3572a720924ef7578637feab1949acb241a5a6ac3f5b950904496f9824b1d63f3313bae21b89fae89afdfc811b5ece03fd5aa301864f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEi5BN5HlnNAxfjDVypyCSTvdXhjf+qxlJ\nrLJBpaasP1uVCQRJb5gksdY/MxO64huJ+uia/fyBG17OA/1aowGGTw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1154,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "313233343030",
+          "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798022049249249249249249249249249249248c79facd43214c011123c1b03a93412a5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04f4892b6d525c771e035f2a252708f3784e48238604b4f94dc56eaa1e546d941a346b1aa0bce68b1c50e5b52f509fb5522e5c25e028bc8f863402edb7bcad8b1b",
+        "wx" : "0f4892b6d525c771e035f2a252708f3784e48238604b4f94dc56eaa1e546d941a",
+        "wy" : "346b1aa0bce68b1c50e5b52f509fb5522e5c25e028bc8f863402edb7bcad8b1b"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004f4892b6d525c771e035f2a252708f3784e48238604b4f94dc56eaa1e546d941a346b1aa0bce68b1c50e5b52f509fb5522e5c25e028bc8f863402edb7bcad8b1b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE9IkrbVJcdx4DXyolJwjzeE5II4YEtPlN\nxW6qHlRtlBo0axqgvOaLHFDltS9Qn7VSLlwl4Ci8j4Y0Au23vK2LGw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1155,
+          "comment" : "extreme value for k",
+          "msg" : "313233343030",
+          "sig" : "3044022079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179802200eb10e5ab95f2f275348d82ad2e4d7949c8193800d8c9c75df58e343f0ebba7b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
+        "wx" : "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
+        "wy" : "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeb5mfvncu6xVoGKVzocLBwKb/NstzijZ\nWfKBWxb4F5hIOtp3JqPEZV2k+/wOEQio/Re0SKaFVBmcR9CP+xDUuA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1156,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca60502302202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1157,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3044022044a5ad0bd0636d9e12bc9e0a6bdd5e1bba77f523842193b3b82e448e05d5f11e02202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777",
+        "wx" : "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
+        "wy" : "0b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798b7c52588d95c3b9aa25b0403f1eef75702e84bb7597aabe663b82f6f04ef2777",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeb5mfvncu6xVoGKVzocLBwKb/NstzijZ\nWfKBWxb4F5i3xSWI2Vw7mqJbBAPx7vdXAuhLt1l6q+ZjuC9vBO8ndw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1158,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3045022100bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca60502302202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1159,
+          "comment" : "testing point duplication",
+          "msg" : "313233343030",
+          "sig" : "3044022044a5ad0bd0636d9e12bc9e0a6bdd5e1bba77f523842193b3b82e448e05d5f11e02202492492492492492492492492492492463cfd66a190a6008891e0d81d49a0952",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466ddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176",
+        "wx" : "4c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466",
+        "wy" : "0ddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a00044c246670658a1d41f5d77bce246cbe386ac22848e269b9d4cd67c466ddd947153d39b2d42533a460def26880408caf2dd3dd48fe888cd176",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAETCRmcGWKHUH113vOJGy+OGrCKEjiabnU\nzWfEZt3ZRxU9ObLUJTOkYN7yaIBAjK8t091I/oiM0XY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1160,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "303d021d00b2970cdec29c70294a18bbc49985efa33acc0af509c326a3977a35e8021c0cea3ed8ebaaf6ee6aef6049a23cbc39f61fcf8fc6be4bab13385579",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1161,
+          "comment" : "pseudorandom signature",
+          "msg" : "54657374",
+          "sig" : "303d021d00d48ab7215a25802132a9b0cb95493f911c965b1b2518cdaa3625417b021c1e49bc825576c5436140caa8a3332d1bb2a745f6a22ef3e80018581d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1162,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "303d021c0364e7d96832614a80216e730c353534d4bffd2c26649c0b4b0e2628021d008f40064b412fe38c5ba9cf664e6172ed48e6e79f0fe5e31a54985dfc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1163,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "303d021c7e7b0eb7da8c68a7072b11404ee95a5c407fbfe3d69646802e28ae77021d00d409a2f6bbaae59bb60fc0a092b12fa4e67dc8d088cf19a833322fd6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d",
+        "wx" : "4aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad5",
+        "wy" : "087d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEBKrsc2NXJvIT+4qeZNo7hjLkFJWp\nRNAEW1IuunJA+tWH2TFXmKqjpboBd1eHztBeqve04J/IHW0apUboNl1SXQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1164,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "3046022100a8ea150cb80125d7381c4c1f1da8e9de2711f9917060406a73d7904519e51388022100f3ab9fa68bd47973a73b2d40480c2ba50c22c9d76ec217257288293285449b86",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1165,
+          "comment" : "pseudorandom signature",
+          "msg" : "54657374",
+          "sig" : "3044022030e782f964b2e2ff065a051bc7adc20615d8c43a1365713c88268822c253bcce02205b16df652aa1ecb2dc8b46c515f9604e2e84cacfa7c6eec30428d2d3f4e08ed5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1166,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "3045022100b292a619339f6e567a305c951c0dcbcc42d16e47f219f9e98e76e09d8770b34a02200177e60492c5a8242f76f07bfe3661bde59ec2a17ce5bd2dab2abebdf89a62e2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1167,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "3045022100986e65933ef2ed4ee5aada139f52b70539aaf63f00a91f29c69178490d57fb7102203dafedfb8da6189d372308cbf1489bbbdabf0c0217d1c0ff0f701aaa7a694b9c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0429bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc9a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3",
+        "wx" : "29bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc",
+        "wy" : "09a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000429bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc9a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEKb23bV+nQb/XAjPLOmbMfUS+s7BmPZKo\nE2ZQR4vO+2HvGC4VWlQ0Wl6OXojwZOW8mlJat/dk2tPa4UaMK0GfO2K5upF9XoxP\nsexHQEo/x2R0snEwgb6dtMAOBDran8Sj\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1168,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "30650230234503fcca578121986d96be07fbc8da5d894ed8588c6dbcdbe974b4b813b21c52d20a8928f2e2fdac14705b0705498c023100cd7b9b766b97b53d1a80fc0b760af16a11bf4a59c7c367c6c7275dfb6e18a88091eed3734bf5cf41b3dc6fecd6d3baaf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1169,
+          "comment" : "pseudorandom signature",
+          "msg" : "54657374",
+          "sig" : "306602310099c8ee5310653f6bb6f540146edc015cce3c115bf3088be1f4205930b08184be8868d8b8320f0ecc60f3b1bccd410b32023100ca49b9f4fda715d522bd0ec9b767ef6d7d0b340d3aa9fcac675874bb3dabc7b8e0c33923860b94cb00115b10ac5056f1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1170,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "3064023032401249714e9091f05a5e109d5c1216fdc05e98614261aa0dbd9e9cd4415dee29238afbd3b103c1e40ee5c9144aee0f02304326756fb2c4fd726360dd6479b5849478c7a9d054a833a58c1631c33b63c3441336ddf2c7fe0ed129aae6d4ddfeb753",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1171,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "306502305cad9ae1565f2588f86d821c2cc1b4d0fdf874331326568f5b0e130e4e0c0ec497f8f5f564212bd2a26ecb782cf0a18d023100bf2e9d0980fbb00696673e7fbb03e1f854b9d7596b759a17bf6e6e67a95ea6c1664f82dc449ae5ea779abd99c78e6840",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04012a908bfc5b70e17bdfae74294994808bf2a42dab59af8b0523a026d640a2a3d6d344520b62177e2cfa339ca42fb0883ec425904fbda2833a3b5b0a9a00811365d8012333d532f8f8eb1a623c378a3694651192bbda833e3b8d7b8f90b2bfc9b045f8a55e1b6a5fe1512c400c4bc9c86fd7c699d642f5cee9bb827c8b0abc0da01cef1e",
+        "wx" : "12a908bfc5b70e17bdfae74294994808bf2a42dab59af8b0523a026d640a2a3d6d344520b62177e2cfa339ca42fb0883ec425904fbda2833a3b5b0a9a00811365d8",
+        "wy" : "12333d532f8f8eb1a623c378a3694651192bbda833e3b8d7b8f90b2bfc9b045f8a55e1b6a5fe1512c400c4bc9c86fd7c699d642f5cee9bb827c8b0abc0da01cef1e"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004012a908bfc5b70e17bdfae74294994808bf2a42dab59af8b0523a026d640a2a3d6d344520b62177e2cfa339ca42fb0883ec425904fbda2833a3b5b0a9a00811365d8012333d532f8f8eb1a623c378a3694651192bbda833e3b8d7b8f90b2bfc9b045f8a55e1b6a5fe1512c400c4bc9c86fd7c699d642f5cee9bb827c8b0abc0da01cef1e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBKpCL/Ftw4XvfrnQpSZSAi/KkLatZ\nr4sFI6Am1kCio9bTRFILYhd+LPoznKQvsIg+xCWQT72igzo7WwqaAIETZdgBIzPV\nMvj46xpiPDeKNpRlEZK72oM+O417j5Cyv8mwRfilXhtqX+FRLEAMS8nIb9fGmdZC\n9c7pu4J8iwq8DaAc7x4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1172,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "3081880242014141e4d94a58c1e747cbd9ee6670a41eac3c26fb4db3248e45d583179076e6b19a8e2003657a108f91f9a103157edff9b37df2b436a77dc112927d907ac9ba258702420108afa91b34bd904c680471e943af336fb90c5fb2b91401a58c9b1f467bf81af8049965dd8b45f12e152f4f7fd3780e3492f31ed2680d4777fbe655fe779ad897ab",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1173,
+          "comment" : "pseudorandom signature",
+          "msg" : "54657374",
+          "sig" : "308188024201b257e46f4a9fcba03012fbeea4cd3bb2e20fd7dd4e1ced708405330a87597407a5870861e71c3a157c021eb4beb9881fce9c3f458f3cd9dbd94e422cf07a75012e024201b55f01bd17e5a6ad7d28bfbf7560de548f96ca52683d12ec6ba347e6f3c1c4c3b6463c73bd2639014de5db1443f181d620d42e6f69b560f37732af83a6a2ef2119",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1174,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "308188024201625d6115092a8e2ee21b9f8a425aa73814dec8b2335e86150ab4229f5a3421d2e6256d632c7a4365a1ee01dd2a936921bbb4551a512d1d4b5a56c314e4a02534c5024201b792d23f2649862595451055777bda1b02dc6cc8fef23231e44b921b16155cd42257441d75a790371e91819f0a9b1fd0ebd02c90b5b774527746ed9bfe743dbe2f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1175,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "308187024108135d3f1ae9e26fba825643ed8a29d63d7843720e93566aa09db2bdf5aaa69afbcc0c51e5295c298f305ba7b870f0a85bb5699cdf40764aab59418f77c6ffb4520242011d345256887fb351f5700961a7d47572e0d669056cb1d5619345c0c987f3331c2fe2c6df848a5c610422defd6212b64346161aa871ae55b1fe4add5f68836eb181",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152",
+        "wx" : "782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963",
+        "wy" : "0af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004782c8ed17e3b2a783b5464f33b09652a71c678e05ec51e84e2bcfc663a3de963af9acb4280b8c7f7c42f4ef9aba6245ec1ec1712fd38a0fa96418d8cd6aa6152",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEeCyO0X47Kng7VGTzOwllKnHGeOBexR6E\n4rz8Zjo96WOvmstCgLjH98QvTvmrpiRewewXEv04oPqWQY2M1qphUg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1176,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "3045022100d035ee1f17fdb0b2681b163e33c359932659990af77dca632012b30b27a057b302201939d9f3b2858bc13e3474cb50e6a82be44faa71940f876c1cba4c3e989202b6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1177,
+          "comment" : "pseudorandom signature",
+          "msg" : "54657374",
+          "sig" : "3044022024813a5aeff4584826a72e3ce030ff39124b456c8db11574ab44e9634f2be54502200c50c914e04bfe3c87ef8dfda335686faa799591141c9b8def398c5eeae107c5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1178,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "3046022100f80ae4f96cdbc9d853f83d47aae225bf407d51c56b7776cd67d0dc195d99a9dc022100b303e26be1f73465315221f0b331528807a1a9b6eb068ede6eebeaaa49af8a36",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1179,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "304402204f053f563ad34b74fd8c9934ce59e79c2eb8e6eca0fef5b323ca67d5ac7ed23802204d4b05daa0719e773d8617dce5631c5fd6f59c9bdc748e4b55c970040af01be5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b554fc25e9f098eaf1466c35328c97305d0d4aa0e4462e8baf7a8e7ed08fc40eb01dc855577baea9e3070770616f57b17ea9854cad93881a",
+        "wx" : "0b554fc25e9f098eaf1466c35328c97305d0d4aa0e4462e8baf7a8e7e",
+        "wy" : "0d08fc40eb01dc855577baea9e3070770616f57b17ea9854cad93881a"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004b554fc25e9f098eaf1466c35328c97305d0d4aa0e4462e8baf7a8e7ed08fc40eb01dc855577baea9e3070770616f57b17ea9854cad93881a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABLVU/CXp8Jjq8UZsNTKMlzBdDUqg\n5EYui696jn7Qj8QOsB3IVVd7rqnjBwdwYW9XsX6phUytk4ga\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1180,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "303c021c669ce9e63d915be4a217fb0bb9ad361d62e98d73e073fffbe921fd4a021c33ef2edccac60ced6d3d07c3b8f1d36687e16f8487c3e8ad5096c798",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1181,
+          "comment" : "pseudorandom signature",
+          "msg" : "54657374",
+          "sig" : "303d021d00921175090125c251838efece2fe3ac1f5a52a4a3e027d864d375433f021c2c008ff69458d37992cd6b60af33e1c5ecc917cc6dbab80b74cfcb4b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1182,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "303c021c79854774987fa51e6614af166a3298d2a20ac8594a7287a9632c0be1021c13fa3911567cdcc2021d238335e67ffa01c6de22b18971854392d70e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1183,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "303c021c4f4e4d86d432a539f62dda75842544b24bbb0609d09ab1d0d1bcb976021c637ee62661e83551144240ea029572e03efd85787e45f175f0cd22d6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042676bd1e3fd83f3328d1af941442c036760f09587729419053083eb61d1ed22c2cf769688a5ffd67da1899d243e66bcabe21f9e78335263bf5308b8e41a71b39",
+        "wx" : "2676bd1e3fd83f3328d1af941442c036760f09587729419053083eb61d1ed22c",
+        "wy" : "2cf769688a5ffd67da1899d243e66bcabe21f9e78335263bf5308b8e41a71b39"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200042676bd1e3fd83f3328d1af941442c036760f09587729419053083eb61d1ed22c2cf769688a5ffd67da1899d243e66bcabe21f9e78335263bf5308b8e41a71b39",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABCZ2vR4/2D8zKNGvlBRCwDZ2DwlY\ndylBkFMIPrYdHtIsLPdpaIpf/WfaGJnSQ+Zryr4h+eeDNSY79TCLjkGnGzk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1184,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "30450220351e727003896ec02949a3cf752223bcc6c2b611b30391edd60dc0c83dc9c98f022100924ad9dc00364d4aa2091416d173862f9b02965ff176e880ea62a673e16db98e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1185,
+          "comment" : "pseudorandom signature",
+          "msg" : "54657374",
+          "sig" : "304502203e083e2a473bda482c81c6beade21b130d15b1ca957a4576768caa3f11362f1502210087dc390d128a792252b51d8c93d1da064d702317add97dab74db78a8f2e6d2a7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1186,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "30440220745be1da902d19c76c8f57d4a1f3362b4b20ed7c8de8fc0463d566795f979cea02205916c317a1e325b53735216a0fa37737f08b32245c88084817b468a41f5afee9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1187,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "3044022044a811b2321acbc65cacf80d2dbe848946f1dac528f3e1ae38b0e54d083c258f022055d7edfaecdda3bbc062d5074e3c3719d32761159d027ca27c1725ddbd62f688",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320r1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0444ab2320c2297b66114428df33fe641956f82033893398af3b49b0023179201c27d26dd65121c06e0c59524c938f19daffc2a9a4679dba7cf1991ced4700592bb75e98cf77dbf6c584c2f72735152921",
+        "wx" : "44ab2320c2297b66114428df33fe641956f82033893398af3b49b0023179201c27d26dd65121c06e",
+        "wy" : "0c59524c938f19daffc2a9a4679dba7cf1991ced4700592bb75e98cf77dbf6c584c2f72735152921"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b24030302080101090352000444ab2320c2297b66114428df33fe641956f82033893398af3b49b0023179201c27d26dd65121c06e0c59524c938f19daffc2a9a4679dba7cf1991ced4700592bb75e98cf77dbf6c584c2f72735152921",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEJA1IABESrIyDCKXtmEUQo3zP+ZBlW+CAz\niTOYrztJsAIxeSAcJ9Jt1lEhwG4MWVJMk48Z2v/CqaRnnbp88Zkc7UcAWSu3XpjP\nd9v2xYTC9yc1FSkh\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1188,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "305402287a31b7375f924369ec12bc33b834726c95444a4c263557344afa732cf48a155e71a6ee7de42e91ce022824d3d72861f4d2b551c10f0294d16a3bf1d4ee3e484439b804d097dea2d7cace76ade14af1663322",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1189,
+          "comment" : "pseudorandom signature",
+          "msg" : "54657374",
+          "sig" : "3056022900ac60ae7e85aedd2e65b37a3731695f684d82c78029b4baa70e56e6fec23f3b65dd213dac69b5052f02290082ae3c06ffdceffec7da820479e6cf3f58bc3bb9b6d88e0da615b0885ece3388f6f2d2fa3685e6a7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1190,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "30540229009cf7f0d60cc1fb2d4b3e78d5f83b374e17a4aebccc6e723f1ad35babb2acfb2b75530389189395f802271110c5b8b8e5fa8dc7952a7bf6200bddae6c1d66639a07a4b6046e00bfa7a2bd9d5777b80c3a92",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1191,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "305502282417eb10a538921621066608243fd6574de84ef1281520f01ebe0444b46a607ab9eda8f3721779a60229008f1e2ea294028baeb738181e128c86ad55cb1945436cf69e090c2f6159f6f22011d731733b4433ba",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046c9aaba343cb2faf098319cc4d15ea218786f55c8cf0a8b668091170a6422f6c2498945a8164a4b6f27cdd11e800da501be961b37b09804610ce0df40dd8236c75a12d0c8014b163464a4aeba7cb18d20d3222083ec4a941852f24aa3d5d84e3",
+        "wx" : "6c9aaba343cb2faf098319cc4d15ea218786f55c8cf0a8b668091170a6422f6c2498945a8164a4b6f27cdd11e800da50",
+        "wy" : "1be961b37b09804610ce0df40dd8236c75a12d0c8014b163464a4aeba7cb18d20d3222083ec4a941852f24aa3d5d84e3"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200046c9aaba343cb2faf098319cc4d15ea218786f55c8cf0a8b668091170a6422f6c2498945a8164a4b6f27cdd11e800da501be961b37b09804610ce0df40dd8236c75a12d0c8014b163464a4aeba7cb18d20d3222083ec4a941852f24aa3d5d84e3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGyaq6NDyy+vCYMZzE0V6iGHhvVc\njPCotmgJEXCmQi9sJJiUWoFkpLbyfN0R6ADaUBvpYbN7CYBGEM4N9A3YI2x1oS0M\ngBSxY0ZKSuunyxjSDTIiCD7EqUGFLySqPV2E4w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1192,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "306402306dd9d4e98c9c388240e95c49b2100afbe0d722f8a152651c61d7ef9bf46150e3cdf9bf6330e75e4bf2c294cd66e48d0602301282d33b5b79d4eaafa03a77bb8ba2c318291f6ea09d548b7704bb00910856dd360557e609add891c6435d7a80afddfb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1193,
+          "comment" : "pseudorandom signature",
+          "msg" : "54657374",
+          "sig" : "306402300179a6f40039bfe52e7d30a9af9e3b24638de555bfef84840f0c9d6bd75fcb8e9b97bf33c5f8dc6b7d6b53972fe156d00230691efc254c864e9a448997c41525ffc386fa97ee489852c95a1485b1993b33e40fd3e0de7f1b64308fa829faceb3be17",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1194,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "3064023065fd456814371d60883ffda5f74f36dc2d45886121770e29ed3163754716d12c1cab03a2cb6a6e3376fc96d8727bd1bf02301aa65e57932d05788413219b7ab23e5337f63fb2dcb0f89b4227d284a3fcbdf3c54c021a6c0ca42445bf802213121654",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1195,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "3065023046cb43798bc06dbe788a4f4b2b98130e3aae917f1d2a005656bd70a3288caf7c37d1dee0c9108828a69d2a1eeae113c60231008180d0c5ba1bed4f2b0d4d8ed7ea17916b63400397e7b6d70e7312c5ff0f4524a49abf7071c8ba470de64fb668570380",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041ec7fe2275860c3bc0e4e6e459af7e16985d37adba7351ac357a7c397e07522ea41bcca8e89777fe05b8f0d9dc8c614004fcaf30a97001a5011a159f46fcd5443cbc1ddfc7ac89a1a2f8eef77bf9bba8ade73da2100cb6a371546b495fb5ea885eb631645e79591db659c49266d263d5cbd3403081cb407536efe9a5bec69955",
+        "wx" : "1ec7fe2275860c3bc0e4e6e459af7e16985d37adba7351ac357a7c397e07522ea41bcca8e89777fe05b8f0d9dc8c614004fcaf30a97001a5011a159f46fcd544",
+        "wy" : "3cbc1ddfc7ac89a1a2f8eef77bf9bba8ade73da2100cb6a371546b495fb5ea885eb631645e79591db659c49266d263d5cbd3403081cb407536efe9a5bec69955"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200041ec7fe2275860c3bc0e4e6e459af7e16985d37adba7351ac357a7c397e07522ea41bcca8e89777fe05b8f0d9dc8c614004fcaf30a97001a5011a159f46fcd5443cbc1ddfc7ac89a1a2f8eef77bf9bba8ade73da2100cb6a371546b495fb5ea885eb631645e79591db659c49266d263d5cbd3403081cb407536efe9a5bec69955",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEHsf+InWGDDvA5ObkWa9+Fphd\nN626c1GsNXp8OX4HUi6kG8yo6Jd3/gW48NncjGFABPyvMKlwAaUBGhWfRvzVRDy8\nHd/HrImhovju93v5u6it5z2iEAy2o3FUa0lfteqIXrYxZF55WR22WcSSZtJj1cvT\nQDCBy0B1Nu/ppb7GmVU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1196,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "308184024061483c729369413144a6be0dd05c1ac29bc440bbdaf87e572aa987e9ca423639f339bcaaad99cb1fa80b7c35416a1834ec04bcf0fe7812c712eb1f06a16daca3024041bb956c339ebcf5e4e403c7d8928d5eb4fdf7d3f53a2c06d6c9fac347f603ac3209a2af37516f807b50363b5328bc98b94354af7d59966d160f68e80c6b2dc0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1197,
+          "comment" : "pseudorandom signature",
+          "msg" : "54657374",
+          "sig" : "30818402405b86ad576cdc5e76a4e4a2ba795b80faa822bc07d62d6697a1a2d4c9f1ac99bdaf6c34ec446e764f598db0f422592ae59a59c8efdf6c480adfff10bff1936fdd02407725a56a95c4cbea85ebf78f01d16b63534f6f0c53d645e3c3d6e7c30ae25797a5e4e6a578368df577734823ad0efabd15581c428def0c4e34dacacb9f164909",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1198,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "30818502410089edf75e6e986305d8181386c16db44ba0d7ff40f4335569754a481f5cd48c6211a63de7bdaa485e9fa79858a4eabf111fed2959f031de2a132ba709412683a902407a8c08564f51534128bb52fe36dffaae89079011256ef8069e64d64c5610d3e611c0ba8b19027388fccc212523b22c44e85a789e16cb1bbd3240c86b43480fde",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1199,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "308185024100a620880bb7fab1180e3d8f393e4b3343dd4eb1c374f9d61252f8a201d9096ba836721f8e2d8b56cbf406960aae0e50325adfca6b1b529f06a81260bd8b15ff68024076537febbc0e24ab4992b576abf8bc0201cacf5ccf674ad3c3b1552c98ca64642eff5401afecab167ec0be195fe5ffa178f14567ef171b4827964a559d079b7a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224t1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c514e66ef76e69aa6d27eb4a9147c84f2516407494ee454136a42f6b364a318ddcfd8b7024550e601ba549f96d2ca1b75d512ca6cf47fbe4",
+        "wx" : "0c514e66ef76e69aa6d27eb4a9147c84f2516407494ee454136a42f6b",
+        "wy" : "364a318ddcfd8b7024550e601ba549f96d2ca1b75d512ca6cf47fbe4"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010106033a0004c514e66ef76e69aa6d27eb4a9147c84f2516407494ee454136a42f6b364a318ddcfd8b7024550e601ba549f96d2ca1b75d512ca6cf47fbe4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEGAzoABMUU5m73bmmqbSfrSpFHyE8lFkB0\nlO5FQTakL2s2SjGN3P2LcCRVDmAbpUn5bSyht11RLKbPR/vk\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1200,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "303c021c34a59f27e90297e11ac10c22d15f54d6b95b39ea3e7a0e0ac19f6180021c77a1ced2a607e6f7410f1f2e5e8d95f1e9545c7a3681aed99427ae66",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1201,
+          "comment" : "pseudorandom signature",
+          "msg" : "54657374",
+          "sig" : "303d021d00cdd0d45c29175bf8e9ac47d84e73eb83102995384369d45fe432d2d6021c586641ff60219da25448c314a2c4267be4d12f0e490fd46142e41874",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1202,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "303b021c3000d34848dff1f1412f9754ac38a061ae69feeef07aae4cc3ca0a5c021b3330a2e4e5ad39ee244649aad7d5fc533f0bc281c03ddbb0f6edff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1203,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "303c021c1d0a67e5916f3eefa2794822489be4e9e8d2bfc83f31544103a11cbf021c4ae3cec888167cc93bdbf1f83ebf3d2d9a7288bdb1f094bf21b45d01",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048509d27e0e9b9720f61f48d491c6bcc62fd6d97f23394fb0b794f3bc7e926c7399fca67f503522d0453df1caf8e6db43d62c789f99fbc468774fb29efa44162c",
+        "wx" : "08509d27e0e9b9720f61f48d491c6bcc62fd6d97f23394fb0b794f3bc7e926c73",
+        "wy" : "099fca67f503522d0453df1caf8e6db43d62c789f99fbc468774fb29efa44162c"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200048509d27e0e9b9720f61f48d491c6bcc62fd6d97f23394fb0b794f3bc7e926c7399fca67f503522d0453df1caf8e6db43d62c789f99fbc468774fb29efa44162c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABIUJ0n4Om5cg9h9I1JHGvMYv1tl/\nIzlPsLeU87x+kmxzmfymf1A1ItBFPfHK+ObbQ9YseJ+Z+8Rod0+ynvpEFiw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1204,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "30460221008a2a6cd8b36728e5cbac83e6748d36876cb46004872b45adc05c55284ce612b602210098ac99ca605e2cd46ce17264be25899138a06340fa75c04e97b74af25ad16b78",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1205,
+          "comment" : "pseudorandom signature",
+          "msg" : "54657374",
+          "sig" : "304402204f0afdfa975557f8a144c9b0b2a60f43e40f5b9ba0d80779943a106e6a278b6902201d52424c3aeb9800c2afb9a066b106b66f202717828a261ed27476190d3f62d4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1206,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "304402204ebd5f5e64c10e74bd32a769565c49f931ec3b69f74859e4123dd85ddfa6ac7502200c1498cb92ce45a6e777a1f7d8de1e1f11f8056ba675ec9d1027b884a9e25177",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1207,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "304402205895cb223665173957d33b1bdbc9727371cfe5ebfb596b8e366b9f1c75aa0a0e02205d372010b36dde53c599262829a8f88581ad6247d3f30a2b692963212db88b6d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP320t1",
+        "keySize" : 320,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0461447d3e1bb7da8122352bada17ab980cf5cbddbe09c4269533c7b48764bbfdffa78af06ef6333226ac4899f6a0bfaff640c91ae099489b18093ed1987b9a18cf621653b93dfcaf6bbbe9696e52281c8",
+        "wx" : "61447d3e1bb7da8122352bada17ab980cf5cbddbe09c4269533c7b48764bbfdffa78af06ef633322",
+        "wy" : "6ac4899f6a0bfaff640c91ae099489b18093ed1987b9a18cf621653b93dfcaf6bbbe9696e52281c8"
+      },
+      "keyDer" : "306a301406072a8648ce3d020106092b240303020801010a0352000461447d3e1bb7da8122352bada17ab980cf5cbddbe09c4269533c7b48764bbfdffa78af06ef6333226ac4899f6a0bfaff640c91ae099489b18093ed1987b9a18cf621653b93dfcaf6bbbe9696e52281c8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMGowFAYHKoZIzj0CAQYJKyQDAwIIAQEKA1IABGFEfT4bt9qBIjUrraF6uYDPXL3b\n4JxCaVM8e0h2S7/f+nivBu9jMyJqxImfagv6/2QMka4JlImxgJPtGYe5oYz2IWU7\nk9/K9ru+lpblIoHI\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1208,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "3055022900accb506f1bad3d84f2966be7630ff551be70c1c1d6f45728abde037bf2a6b3bbc2dc94416539339d022865c576935e93ac452834bdf9cf3a6ce91da7fadaba34b24a0b5aa47f717ae3d1ef21c6ef7ef6be32",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1209,
+          "comment" : "pseudorandom signature",
+          "msg" : "54657374",
+          "sig" : "305502286f64c4e05fb8f11e7ca9c71407de33d824adf4c0da9abf2f74a7b28dae2253586b18d3a69bea0520022900ca8ef19ae2f278265db27259693e57c7cf52e5c12d53f29e321a68aea5570f9f428854522813979f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1210,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "305602290080439603434ae38f3f08ca8812c3cf6b5b41973aace77ce5acc0fec5accbe5fce65b9dfaeeb1d75d0229008a952af632fc4823ff40f7d65be23e85717ef2111118b2b22932dc3f8b479501e1bc422fb0f6309c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1211,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "305502286ef646d78f7f4d69aa7378a9d199bc7fc5355f65a83b62de0d78ca3f6a9588d873b6a54ba9cbf98a022900b31e5ca01a5d076e70a1b8de28eff126bb3cab9f0e607a2cfd3a8056b6896762bae51b25861b8ef7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384t1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400d95b9bbcf029074240d23232b287fec40768d9d31826a2d128d48667c91fddd509ce449d7de14568af320d15499f964cdccbb334791e89c0ea0dadd3e9ab657d6dec8a38b174c6f3a9da08d8bf3703cbb21ed3c35dc702536aaeef03bd56a0",
+        "wx" : "0d95b9bbcf029074240d23232b287fec40768d9d31826a2d128d48667c91fddd509ce449d7de14568af320d15499f96",
+        "wy" : "4cdccbb334791e89c0ea0dadd3e9ab657d6dec8a38b174c6f3a9da08d8bf3703cbb21ed3c35dc702536aaeef03bd56a0"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010c0362000400d95b9bbcf029074240d23232b287fec40768d9d31826a2d128d48667c91fddd509ce449d7de14568af320d15499f964cdccbb334791e89c0ea0dadd3e9ab657d6dec8a38b174c6f3a9da08d8bf3703cbb21ed3c35dc702536aaeef03bd56a0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQEMA2IABADZW5u88CkHQkDSMjKyh/7EB2jZ\n0xgmotEo1IZnyR/d1QnORJ194UVorzINFUmflkzcy7M0eR6JwOoNrdPpq2V9beyK\nOLF0xvOp2gjYvzcDy7Ie08NdxwJTaq7vA71WoA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1212,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "3064023038d0472c6a7fb0fa0b605023eca6e26c7570820554f1d3ccb9cce15579469c057ca6f99cafb591599ddc1713cd67e659023050f3983145a748dda08ab2547eff692b69606beffa993380f27fdf6fb91ba7bb9b3b37c65586c9512ff10ba849b58987",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1213,
+          "comment" : "pseudorandom signature",
+          "msg" : "54657374",
+          "sig" : "30640230152ca621474847b02e3cd14ec2c8e21247aacc830a0a5410bf408d5837d9ddd45738637134e55555916828922db3e4ea023039f3093eec232e1449d72a3a2b68cef4fd436c498ac265f90edc7bbbe1b102d5a42a801f3be233bacb5c52ce488fe83e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1214,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "3064023029b74d0c4211d1e36e8fcf0ae00a4b3fe738478119866c0503da62b6abdb96bd61fa70460be6aaa0579e162d045cc8be02304820e4bfe763eb12f37b1f852723728feb63c86741d4dd2196446ea5f47c2f879f11fdf23f121f950169901f3c4cb03c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1215,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "306502305e83a0b1c1bdfe98babe8f83bc046d5a896fbf307c8a468f4567dc2940a11d31344d3575620bd0c4201b80d6cc2a3ca9023100801352c92b908ce2f7522492ade4dea788ddb6d17204387d764ce7c2940302a98b62cf83baa69f0c735a56fe8c35dbeb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512t1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a5008ecb5b6294ab2ea71a9e23694973c95a0b5f5874ade775d349a23148038e6c7311aa69aba4b9fa8cefe8ff9bf1c5f4324e3f3cdf43143b1d35df7cf7f5071bc165ca46fe65152d2e74d95ce1a740d5e1a2728005f72ed66e5eeef49d9750a7471c45658d0d189890a1616aa66d6487cc3e70ac950fe81e550dab58fdb55f",
+        "wx" : "0a5008ecb5b6294ab2ea71a9e23694973c95a0b5f5874ade775d349a23148038e6c7311aa69aba4b9fa8cefe8ff9bf1c5f4324e3f3cdf43143b1d35df7cf7f507",
+        "wy" : "1bc165ca46fe65152d2e74d95ce1a740d5e1a2728005f72ed66e5eeef49d9750a7471c45658d0d189890a1616aa66d6487cc3e70ac950fe81e550dab58fdb55f"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010e0381820004a5008ecb5b6294ab2ea71a9e23694973c95a0b5f5874ade775d349a23148038e6c7311aa69aba4b9fa8cefe8ff9bf1c5f4324e3f3cdf43143b1d35df7cf7f5071bc165ca46fe65152d2e74d95ce1a740d5e1a2728005f72ed66e5eeef49d9750a7471c45658d0d189890a1616aa66d6487cc3e70ac950fe81e550dab58fdb55f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDgOBggAEpQCOy1tilKsupxqeI2lJc8la\nC19YdK3nddNJojFIA45scxGqaaukufqM7+j/m/HF9DJOPzzfQxQ7HTXffPf1BxvB\nZcpG/mUVLS502Vzhp0DV4aJygAX3LtZuXu70nZdQp0ccRWWNDRiYkKFhaqZtZIfM\nPnCslQ/oHlUNq1j9tV8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1216,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "30818502403a146c30a1e275ef8e6410288c48e9751d82c14cce9a1a8367cb272bda61048e6272bbfbe781a52f2694229a5fa49fb021b90b67dd976e83b7eabd3d6893d613024100810c5bdc99f722390918937ef115276cae34b30441285ed7242024dea1704445bb694848f6c2914e818af6947e3df8072fa9643ebc199ca88a374df7fd2fc009",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1217,
+          "comment" : "pseudorandom signature",
+          "msg" : "54657374",
+          "sig" : "30818402405326efd4d3969f3074cc2fc1226e0cd0a00be4cec1d01643812435bfe135ccd781040cd201101eb45c13d4654dbe3902109ec662dbb63b9e9d3ea017a62209d3024003fb04f8b00612a0020e8cdadf30a064436ced16a34ed7ec4d332950b93083b506ce05d12465877aed3db3744ba7b8e4698bc1c125bd38517f15949444b8fc8a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1218,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "30818402401ebb81543b870229db3a440fdcf6402e22b5f9760c3b95e44bca6a7b7ad3df5c6e9d07f71ac6ce63916141baa92171bde9701b59907da2cfa922b30611188a2102406adba7340a1687dae2596329218a856ced4e86d0a39ddd7c1634233e061767dbf58751a05df152b49e0a5d722358a6d8fe7e69176621a365772cafaf41714833",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1219,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "308185024100a6b9e91472661f0a15d79e3dd4c6b05921e07c456571233f4af67c66e94a9e06c6daddece057dc49b617f95138038a28d77a984015548d487adb3d55152129d002404c657ef2b28b0b7171a5c4ec4a11a894cba4c312be4d26013e508766f43cf8f7986d54fbc358e8b95b4171bee39fc0c8e1810e6e4642c31c740138f44e2586f8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ea659ff9db8803270c9e1ee0d51f604352e0a4a29934e7f2ead6e9ad4528ffea49b2787707756802c4d6b6b094fa360e79acf86f762d100accf5f0a63a634a8e",
+        "wx" : "0ea659ff9db8803270c9e1ee0d51f604352e0a4a29934e7f2ead6e9ad4528ffea",
+        "wy" : "49b2787707756802c4d6b6b094fa360e79acf86f762d100accf5f0a63a634a8e"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ea659ff9db8803270c9e1ee0d51f604352e0a4a29934e7f2ead6e9ad4528ffea49b2787707756802c4d6b6b094fa360e79acf86f762d100accf5f0a63a634a8e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6mWf+duIAycMnh7g1R9gQ1LgpKKZ\nNOfy6tbprUUo/+pJsnh3B3VoAsTWtrCU+jYOeaz4b3YtEArM9fCmOmNKjg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-224",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1220,
+          "comment" : "Hash weaker than DL-group",
+          "msg" : "4d7367",
+          "sig" : "304402201525048659434a531f6af322116bc5c8829747bb254f89e620cc99f86903353802204f0eb76ef9aefa310b1ddf76ebb9cdd551fd6b192a4875d70c0ceb7f74e19252",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045993264ee17ddf209aec31fe0a3c153b5a2a845d4fe67fbc218ab1397d42df07c9c98b1a98d2a1d792014dfc77fe99bd2b83b18785eb4ebcbe8d16ecd14f8f625015b2687af2d13d6872e52b055c95eb34817a9f18fbe8fef235818515242565",
+        "wx" : "5993264ee17ddf209aec31fe0a3c153b5a2a845d4fe67fbc218ab1397d42df07c9c98b1a98d2a1d792014dfc77fe99bd",
+        "wy" : "2b83b18785eb4ebcbe8d16ecd14f8f625015b2687af2d13d6872e52b055c95eb34817a9f18fbe8fef235818515242565"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200045993264ee17ddf209aec31fe0a3c153b5a2a845d4fe67fbc218ab1397d42df07c9c98b1a98d2a1d792014dfc77fe99bd2b83b18785eb4ebcbe8d16ecd14f8f625015b2687af2d13d6872e52b055c95eb34817a9f18fbe8fef235818515242565",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEWZMmTuF93yCa7DH+CjwVO1oqhF1P5n+8\nIYqxOX1C3wfJyYsamNKh15IBTfx3/pm9K4Oxh4XrTry+jRbs0U+PYlAVsmh68tE9\naHLlKwVcles0gXqfGPvo/vI1gYUVJCVl\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1221,
+          "comment" : "Hash weaker than DL-group",
+          "msg" : "54657374",
+          "sig" : "3065023023a86458feb3c220dbf9f4a9150d86694c12569eaa1e5f63c41fb87e4ff425b8fea57ecaa4e147aa041780c64fc01f54023100e47d546b638df0a29246df46aab7fa3f1d797c1427d9819e5df3c7da7c6d81c77cc185c7d469dcf8bb0a201f940737f1",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04018f0d2a742e18cb855a3477886461a15ada5533100f488dc39aed896c5ea62fa029c5b80454b4eabaebf2917d762c5053dba126b39a078c0f00b2f936a09184dbfe00503cc4cca010bdd2aa8d85f5625d516f3e41d068cfd4ea413ec4a97510627920c0197eef2ad22383c57f2e93a5d525521fd8635550fb5dd98e3b6c73592b24a831",
+        "wx" : "18f0d2a742e18cb855a3477886461a15ada5533100f488dc39aed896c5ea62fa029c5b80454b4eabaebf2917d762c5053dba126b39a078c0f00b2f936a09184dbfe",
+        "wy" : "503cc4cca010bdd2aa8d85f5625d516f3e41d068cfd4ea413ec4a97510627920c0197eef2ad22383c57f2e93a5d525521fd8635550fb5dd98e3b6c73592b24a831"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004018f0d2a742e18cb855a3477886461a15ada5533100f488dc39aed896c5ea62fa029c5b80454b4eabaebf2917d762c5053dba126b39a078c0f00b2f936a09184dbfe00503cc4cca010bdd2aa8d85f5625d516f3e41d068cfd4ea413ec4a97510627920c0197eef2ad22383c57f2e93a5d525521fd8635550fb5dd98e3b6c73592b24a831",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBjw0qdC4Yy4VaNHeIZGGhWtpVMxAP\nSI3Dmu2JbF6mL6ApxbgEVLTquuvykX12LFBT26Ems5oHjA8Asvk2oJGE2/4AUDzE\nzKAQvdKqjYX1Yl1Rbz5B0GjP1OpBPsSpdRBieSDAGX7vKtIjg8V/LpOl1SVSH9hj\nVVD7XdmOO2xzWSskqDE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1222,
+          "comment" : "Hash weaker than DL-group",
+          "msg" : "54657374",
+          "sig" : "308187024201cd35bd8adcb9155d8760edab8612d86d9518e5eafba22b230c0aa34cea7679d2278104903a831d21c2092075d5f1fd686012dab33dd87d32fa04d7d1d10722c3f9024112c5e76b245c67cc25fae2f04045546f95113e04f3a4860ff21d6194b51a385332aa6ad34e3024906244071c415a688a0db2df62dce92067bf14aed466a9d90d0b",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04aed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf8a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000",
+        "wx" : "0aed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf",
+        "wy" : "08a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004aed6fcad2400c4d94e55dbb6b012ce3d4c2b46843fbe99d4289e6ecf8a24a89e71343d7d151d258d2cb690349c2d56b366dd10a600000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAErtb8rSQAxNlOVdu2sBLOPUwrRoQ/vpnU\nKJ5uz4okqJ5xND19FR0ljSy2kDScLVazZt0QpgAAAAA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1223,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c519bf185ff4635271961fa491be257231deeea9c53a6ede3b4a89ed1021c486bdad484a6a3134e1471cf56a9df0fac50f773b3e37d6f327617d7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1224,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c09fd644898b7cb5d018b52234e7b4ef2b54789afd0ce9c434e9e5515021d00f19309532164ea2053cae55df7bdcbab536c83ea7bfe6fe10d60c1ab",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1225,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00ec919d4e283ccf1f71a9e3c0f781a36758d3f38b1b78a87a74288e80021c4c4663044a73c79bd88f0dc245ab1a32f89f06f40a704b31e9fabc51",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f173d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff",
+        "wx" : "0bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f1",
+        "wy" : "73d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004bf19ecfe43ffe289f699f479316145b9a7f7370b9ece5ab1212174f173d528949ae9142f818bade71a960407963be0b6482a6a60ffffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEvxns/kP/4on2mfR5MWFFuaf3Nwuezlqx\nISF08XPVKJSa6RQvgYut5xqWBAeWO+C2SCpqYP////8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1226,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00c51760478447217597ecc6f4001bd45088d53c90f53103608bf88aea021d00a201253aa903f9781e8992101d7171d2dd3a5d48c44d8e1d544cd6d7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1227,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c76be0112674ec29128823e1af7512e6143872fef30a64e2f1799bd56021c187e503e1a48c27b549fe0a4ce5e581e242c8663fc9efb02d6f2b193",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1228,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c36245ef126b5b51e459f84eaaad5a495061f0471dc8c23f1c5f16282021c39e31d72a06ba8e14fcf95778e07bc16a2628e39449da8857d506edc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0426e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0",
+        "wx" : "26e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000",
+        "wy" : "0eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000426e5abf135cb54eaaa16b69e4b0b292275344e88a09df6df80000000eab891de54e3f26ff50ab989f333dac551583d468ae623c596434af0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEJuWr8TXLVOqqFraeSwspInU0Toignfbf\ngAAAAOq4kd5U4/Jv9Qq5ifMz2sVRWD1GiuYjxZZDSvA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1229,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c258682975df8bca7f203f771ebeb478ef637360c860fc386cfb21745021c7663e70188047e41469a2a35c8c330dd900f2340ba82aafd22962a96",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1230,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d0085c98614f36c0d66f8d87834cae978611b7b4eebf59a46bea1b89ae9021d00d1a18e378dda840e06b60f6279bf0a2231d9fa2d8d2c31e88bc1bdd7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1231,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00ca7b7432ba41ff2112e1116fffde89bbd68f5ce67fe5513d16c8e6f7021d00e421b7599e0180798acc2006451603cda2db1d582741116e6033ce5f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd",
+        "wx" : "0ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff",
+        "wy" : "41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004ec627f345545d03f8c6dbd08e575527116567fe375f9ecaaffffffff41bf705697d5f716bcf78718d5393b63a98691f4a1f24246375538fd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE7GJ/NFVF0D+Mbb0I5XVScRZWf+N1+eyq\n/////0G/cFaX1fcWvPeHGNU5O2OphpH0ofJCRjdVOP0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1232,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c19397fe5d3ecabf80fc624c1bf379564387517c185087dc97d605069021c33b5773e9aaf6c34cb612cfc81efd3bf9c22224e8c4fa1bfccf5c501",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1233,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c70f24f5c164164bfbb8459aa12a981aa312dbcf00204326ebaaabdc8021d00f5cebee8caedae8662c43501665084b45d2f494fb70d603043543dc4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1234,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c0bf2d86ecaa8b56aca5e8f8ebcb45081d078a14555b75f5be8e9b132021d009a55b3ce4734849966b5034ccd9b19f76407ee0241c3f58e7b8fc89a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a00000000762d28f1fdc219184f81681fbff566d465b5f1f31e872df5",
+        "wx" : "15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a",
+        "wy" : "762d28f1fdc219184f81681fbff566d465b5f1f31e872df5"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a00000000762d28f1fdc219184f81681fbff566d465b5f1f31e872df5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEFQFuUrNkctU2R3YF+4Bd05AwgqBi0eow\nr55VWgAAAAB2LSjx/cIZGE+BaB+/9WbUZbXx8x6HLfU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1235,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00bfc5dc4434cd09369610687d38d2d418b63fd475dea246a456b25a3a021d00b171dfa6cf722f20816370a868785da842b37bac31d7b78e6751fc50",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1236,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d008fdbe8da646c5642d767c7dbeb3872b1edab6e37365805f0e94ce0a9021d00bcf35ab81222883dd3526cb0cf93138f4687cd0b10c2b0a126385161",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1237,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00e23a11275848fd4f8b6f4ac4fc305eae981d3b7dc453e5a980c46422021c1a875693f24a03ea1614c4c3bbd0dd7221429f22b337ea7d98348ca4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555affffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c",
+        "wx" : "15016e52b36472d536477605fb805dd3903082a062d1ea30af9e555a",
+        "wy" : "0ffffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000415016e52b36472d536477605fb805dd3903082a062d1ea30af9e555affffffff89d2d70e023de6e7b07e97df400a992b9a4a0e0ce178d20c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEFQFuUrNkctU2R3YF+4Bd05AwgqBi0eow\nr55VWv////+J0tcOAj3m57B+l99ACpkrmkoODOF40gw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1238,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c76645164ff9af3a1a9205fda2eef326d2bffc795dcc4829547fe01dd021d00b65bba503719314b27734dd06b1395d540af8396029b78b84e0149eb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1239,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c32fa0ca7e07f1f86ac350734994e1f31b6da9c82f93dced2b983c29c021c7b7891282206a45711bdfcb2a102b5d289df84ff5778548603574004",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1240,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c2d5492478ca64e5111dfd8521867b6477b7e78227849ad090b855694021d00a532f5a2fa3594af81cd5928b81b4057da717be5fb42a3a86c68190d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400000000f7e4713d085112112c37cdf4601ff688da796016b71a727ade5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1",
+        "wx" : "0f7e4713d085112112c37cdf4601ff688da796016b71a727a",
+        "wy" : "0de5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a000400000000f7e4713d085112112c37cdf4601ff688da796016b71a727ade5a9ec165054cc987f9dc87e9991b92e4fa649ca655eeae9f2a30e1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEAAAAAPfkcT0IURIRLDfN9GAf9ojaeWAW\ntxpyet5ansFlBUzJh/nch+mZG5Lk+mScplXurp8qMOE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1241,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c191eee5daf55cd499e8539cb2cff797cfec5d566d2027bf9f8d64693021d00dadfeae8131f64d96b94fd340197caa2bc04818554812feef3343070",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1242,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00e0e2c08180b8a207ee9105a7d379fa112368e8370fa09dfde4a45c45021d00c717bc0860e016e7ce48f8fe6a299b36906a6055adad93b416ce8838",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1243,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c1b919ef93532292743bb2e1b7b4894fd847c6e5de52a08e1b0f2dcfb021d00c2d30d6b7594d8dbd261491ae1d58779505b075b64e5564dc97a418b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f72586c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e",
+        "wx" : "0ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f725",
+        "wy" : "086c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004ffffffffeadf7cee8d34d04cf22c8f7de35674fb2f501d242a76f72586c409309d398e60ce1e0a4c9e05a9d32627577e8ce2cc7f3afa2c3e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAE/////+rffO6NNNBM8iyPfeNWdPsvUB0k\nKnb3JYbECTCdOY5gzh4KTJ4FqdMmJ1d+jOLMfzr6LD4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1244,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00e75db49ed33ff2885ea6100cc95b8fe1b9242ea4248db07bcac2e020021c796c866142ae8eb75bb0499c668c6fe45497692fbcc66b37c2e4624f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1245,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c1f81cd924362ec825890307b9b3936e0d8f728a7c84bdb43c5cf0433021c39d3e46a03040ad41ac026b18e0629f6145e3dc8d1e6bbe200c8482b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1246,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c00fda613aa67ca42673ad4309f3f0f05b2569f3dee63f4aa9cc54cf3021c1e5a64b68a37e5b201c918303dc7a40439aaeacf019c5892a8f6d0ce",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1000000000e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc",
+        "wx" : "0b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1",
+        "wy" : "0e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1000000000e2ab0e8495e859eb2afb00769d6e7fe626a119167c0b6bc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEsAE8b7/28J/s2hwmPvZTmdTPmJyl/E+P\n/w/p4QAAAAAOKrDoSV6FnrKvsAdp1uf+YmoRkWfAtrw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1247,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00b932b3f7e6467e1ec7a561f31160248c7f224550a8508788634b53ce021d00a0c5312acf9e801aff6d6fc98550cfa712bbf65937165a36f2c32dc9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1248,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00e509593fb09245ee8226ce72786b0cc352be555a7486be628f4fd00c021c0b7abde0061b1e07bf13319150a4ff6a464abab636ab4e297b0d7633",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1249,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c6e54f941204d4639b863c98a65b7bee318d51ab1900a8f345eac6f07021c0da5054829214ecde5e10579b36a2fe6426c24b064ed77c38590f25c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945",
+        "wx" : "0b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1",
+        "wy" : "0fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945"
+      },
+      "keyDer" : "304e301006072a8648ce3d020106052b81040021033a0004b0013c6fbff6f09fecda1c263ef65399d4cf989ca5fc4f8fff0fe9e1fffffffff1d54f17b6a17a614d504ff7962918019d95ee6e983f4945",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEsAE8b7/28J/s2hwmPvZTmdTPmJyl/E+P\n/w/p4f/////x1U8XtqF6YU1QT/eWKRgBnZXubpg/SUU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1250,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d0085ea4ab3ffdc992330c0ca8152faf991386bce82877dbb239ba654f6021c0806c6baf0ebea4c1aaa190e7d4325d46d1f7789d550632b70b5fc9b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1251,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c44d53debb646b73485402eab2d099081b97b1243c025b624f0dd67ea021d00e5de789a7d4b77eac6d7bba41658e6e4dc347dabed2f9680c04a6f55",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1252,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c1526eb2f657ebea9af4ca184b975c02372c88e24e835f3f5774c0e12021c1f1ecce38ee52372cb201907794de17b6d6c1afa13c316c51cb07bc7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685",
+        "wx" : "4f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000",
+        "wy" : "0ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETzN8z9Z3JqgF5PFgCuKEnfOAfsoR\nc4Ajn72BaQAAAADtneoSTMjDlkFkEemIww9CfrUEr0OjFGzV336mBmbWhQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1253,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100d434e262a49eab7781e353a3565e482550dd0fd5defa013c7f29745eff3569f10221009b0c0a93f267fb6052fd8077be769c2b98953195d7bc10de844218305c6ba17a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1254,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "304402200fe774355c04d060f76d79fd7a772e421463489221bf0a33add0be9b1979110b0220500dcba1c69a8fbd43fa4f57f743ce124ca8b91a1f325f3fac6181175df55737",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1255,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100bb40bf217bed3fb3950c7d39f03d36dc8e3b2cd79693f125bfd06595ee1135e30220541bf3532351ebb032710bdb6a1bf1bfc89a1e291ac692b3fa4780745bb55677",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000",
+        "wx" : "3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935",
+        "wy" : "084fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPPA9YU2JOc/UmaB4c/rCgWGPBrj/\nh+gBXD9JcmUASTWE+hdNeRxyvyzjiAqJYN0qfHoTOKgvhanlnNvegAAAAA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1256,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "30440220664eb7ee6db84a34df3c86ea31389a5405badd5ca99231ff556d3e75a233e73a022059f3c752e52eca46137642490a51560ce0badc678754b8f72e51a2901426a1bd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1257,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "304502204cd0429bbabd2827009d6fcd843d4ce39c3e42e2d1631fd001985a79d1fd8b430221009638bf12dd682f60be7ef1d0e0d98f08b7bca77a1a2b869ae466189d2acdabe3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1258,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100e56c6ea2d1b017091c44d8b6cb62b9f460e3ce9aed5e5fd41e8added97c56c04022100a308ec31f281e955be20b457e463440b4fcf2b80258078207fc1378180f89b55",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff",
+        "wx" : "3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935",
+        "wy" : "7b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPPA9YU2JOc/UmaB4c/rCgWGPBrj/\nh+gBXD9JcmUASTV7BeixhuONQdMcd/V2nyLVg4XsyFfQelYaYyQhf////w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1259,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "304402201158a08d291500b4cabed3346d891eee57c176356a2624fb011f8fbbf34668300220228a8c486a736006e082325b85290c5bc91f378b75d487dda46798c18f285519",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1260,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100b1db9289649f59410ea36b0c0fc8d6aa2687b29176939dd23e0dde56d309fa9d02203e1535e4280559015b0dbd987366dcf43a6d1af5c23c7d584e1c3f48a1251336",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1261,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100b7b16e762286cb96446aa8d4e6e7578b0a341a79f2dd1a220ac6f0ca4e24ed86022100ddc60a700a139b04661c547d07bbb0721780146df799ccf55e55234ecb8f12bc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e",
+        "wx" : "2829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffff",
+        "wy" : "0a01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKCnDH6ouQA40TtlLyj/NBUWVbrz+\nitD236X/jv////+gGq+vAA5SWFhVr6dnat4oQRMJkFLfV+frO9N+vrkiLg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1262,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100d82a7c2717261187c8e00d8df963ff35d796edad36bc6e6bd1c91c670d9105b402203dcabddaf8fcaa61f4603e7cbac0f3c0351ecd5988efb23f680d07debd139929",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1263,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "304402205eb9c8845de68eb13d5befe719f462d77787802baff30ce96a5cba063254af7802202c026ae9be2e2a5e7ca0ff9bbd92fb6e44972186228ee9a62b87ddbe2ef66fb5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1264,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "304602210096843dd03c22abd2f3b782b170239f90f277921becc117d0404a8e4e36230c28022100f2be378f526f74a543f67165976de9ed9a31214eb4d7e6db19e1ede123dd991d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73",
+        "wx" : "0fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f5",
+        "wy" : "5a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE////+UgIHmoEWN2PnnOPJmX/kFmt\naqwHCDGMTKmnpPVairy6LdqEdDEe5UFJuXPK4MD7iVV60L945lKaFmO9cw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1265,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30440220766456dce1857c906f9996af729339464d27e9d98edc2d0e3b760297067421f60220402385ecadae0d8081dccaf5d19037ec4e55376eced699e93646bfbbf19d0b41",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1266,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100c605c4b2edeab20419e6518a11b2dbc2b97ed8b07cced0b19c34f777de7b9fd9022100edf0f612c5f46e03c719647bc8af1b29b2cde2eda700fb1cff5e159d47326dba",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1267,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100d48b68e6cabfe03cf6141c9ac54141f210e64485d9929ad7b732bfe3b7eb8a84022100feedae50c61bd00e19dc26f9b7e2265e4508c389109ad2f208f0772315b6c941",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71",
+        "wx" : "3fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e",
+        "wy" : "1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAAAAA/oV+WOUnV8DpvXH+G+eABXu\nsjrrv/EXOTe6dI4QmYcgcOjofFVfoTZZzKXX+tz8sAI+qIlUjKSK8rp+cQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1268,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100b7c81457d4aeb6aa65957098569f0479710ad7f6595d5874c35a93d12a5dd4c7022100b7961a0b652878c2d568069a432ca18a1a9199f2ca574dad4b9e3a05c0a1cdb3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1269,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304402206b01332ddb6edfa9a30a1321d5858e1ee3cf97e263e669f8de5e9652e76ff3f702205939545fced457309a6a04ace2bd0f70139c8f7d86b02cb1cc58f9e69e96cd5a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1270,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100efdb884720eaeadc349f9fc356b6c0344101cd2fd8436b7d0e6a4fb93f106361022100f24bee6ad5dc05f7613975473aadf3aacba9e77de7d69b6ce48cb60d8113385d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2",
+        "wx" : "0bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015",
+        "wy" : "1352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvLspFMefBF6qbsu8YSgWs75dLWeW\ncH2BJen4UcGK8BUAAAAAE1K7Sg+i6kzOuatj3WhK3loRJ7zzAKaYpxk7wg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1271,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3044022031230428405560dcb88fb5a646836aea9b23a23dd973dcbe8014c87b8b20eb0702200f9344d6e812ce166646747694a41b0aaf97374e19f3c5fb8bd7ae3d9bd0beff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1272,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100caa797da65b320ab0d5c470cda0b36b294359c7db9841d679174db34c4855743022100cf543a62f23e212745391aaf7505f345123d2685ee3b941d3de6d9b36242e5a0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1273,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304502207e5f0ab5d900d3d3d7867657e5d6d36519bc54084536e7d21c336ed8001859450221009450c07f201faec94b82dfb322e5ac676688294aad35aa72e727ff0b19b646aa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d",
+        "wx" : "0bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015",
+        "wy" : "0fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvLspFMefBF6qbsu8YSgWs75dLWeW\ncH2BJen4UcGK8BX////+7K1EtvBdFbMxRlScIpe1IqXu2EMM/1lnWObEPQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1274,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100d7d70c581ae9e3f66dc6a480bf037ae23f8a1e4a2136fe4b03aa69f0ca25b35602210089c460f8a5a5c2bbba962c8a3ee833a413e85658e62a59e2af41d9127cc47224",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1275,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30440220341c1b9ff3c83dd5e0dfa0bf68bcdf4bb7aa20c625975e5eeee34bb396266b34022072b69f061b750fd5121b22b11366fad549c634e77765a017902a67099e0a4469",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1276,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3045022070bebe684cdcb5ca72a42f0d873879359bd1781a591809947628d313a3814f67022100aec03aca8f5587a4d535fa31027bbe9cc0e464b1c3577f4c2dcde6b2094798a9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff00000001060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1",
+        "wx" : "6e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff",
+        "wy" : "1060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff00000001060492d5a5673e0f25d8d50fb7e58c49d86d46d4216955e0aa3d40e1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEboI1VUUpFAmRgsaywdbwtdKNUMzQBa8s\n4bulQapAyv8AAAABBgSS1aVnPg8l2NUPt+WMSdhtRtQhaVXgqj1A4Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1277,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304402206d6a4f556ccce154e7fb9f19e76c3deca13d59cc2aeb4ecad968aab2ded45965022053b9fa74803ede0fc4441bf683d56c564d3e274e09ccf47390badd1471c05fb7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1278,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100aad503de9b9fd66b948e9acf596f0a0e65e700b28b26ec56e6e45e846489b3c4022100fff223c5d0765447e8447a3f9d31fd0696e89d244422022ff61a110b2a8c2f04",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1279,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "30460221009182cebd3bb8ab572e167174397209ef4b1d439af3b200cdf003620089e43225022100abb88367d15fe62d1efffb6803da03109ee22e90bc9c78e8b4ed23630b82ea9d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40cafffffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e",
+        "wx" : "6e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40caff",
+        "wy" : "0fffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200046e823555452914099182c6b2c1d6f0b5d28d50ccd005af2ce1bba541aa40cafffffffffef9fb6d2a5a98c1f0da272af0481a73b62792b92bde96aa1e55c2bb4e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEboI1VUUpFAmRgsaywdbwtdKNUMzQBa8s\n4bulQapAyv/////++fttKlqYwfDaJyrwSBpztieSuSvelqoeVcK7Tg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1280,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "304502203854a3998aebdf2dbc28adac4181462ccac7873907ab7f212c42db0e69b56ed8022100c12c09475c772fd0c1b2060d5163e42bf71d727e4ae7c03eeba954bf50b43bb3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1281,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100e94dbdc38795fe5c904d8f16d969d3b587f0a25d2de90b6d8c5c53ff887e3607022100856b8c963e9b68dade44750bf97ec4d11b1a0a3804f4cb79aa27bdea78ac14e4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1282,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3044022049fc102a08ca47b60e0858cd0284d22cddd7233f94aaffbb2db1dd2cf08425e102205b16fca5a12cdb39701697ad8e39ffd6bdec0024298afaa2326aea09200b14d6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04000000013fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d",
+        "wx" : "13fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0",
+        "wy" : "0f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004000000013fd22248d64d95f73c29b48ab48631850be503fd00f8468b5f0f70e0f6ee7aa43bc2c6fd25b1d8269241cbdd9dbb0dac96dc96231f430705f838717d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEAAAAAT/SIkjWTZX3PCm0irSGMYUL5QP9\nAPhGi18PcOD27nqkO8LG/SWx2CaSQcvdnbsNrJbcliMfQwcF+DhxfQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1283,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3045022041efa7d3f05a0010675fcb918a45c693da4b348df21a59d6f9cd73e0d831d67a022100bbab52596c1a1d9484296cdc92cbf07e665259a13791a8fe8845e2c07cf3fc67",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1284,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100b615698c358b35920dd883eca625a6c5f7563970cdfc378f8fe0cee17092144c022100da0b84cd94a41e049ef477aeac157b2a9bfa6b7ac8de06ed3858c5eede6ddd6d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1285,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304602210087cf8c0eb82d44f69c60a2ff5457d3aaa322e7ec61ae5aecfd678ae1c1932b0e022100c522c4eea7eafb82914cbf5c1ff76760109f55ddddcf58274d41c9bc4311e06e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0425afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dfffffffffa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35",
+        "wx" : "25afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dffffffff",
+        "wy" : "0fa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a0342000425afd689acabaed67c1f296de59406f8c550f57146a0b4ec2c97876dfffffffffa46a76e520322dfbc491ec4f0cc197420fc4ea5883d8f6dd53c354bc4f67c35",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEJa/WiayrrtZ8Hylt5ZQG+MVQ9XFGoLTs\nLJeHbf/////6RqduUgMi37xJHsTwzBl0IPxOpYg9j23VPDVLxPZ8NQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1286,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3045022062f48ef71ace27bf5a01834de1f7e3f948b9dce1ca1e911d5e13d3b104471d82022100a1570cc0f388768d3ba7df7f212564caa256ff825df997f21f72f5280d53011f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1287,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100f6b0e2f6fe020cf7c0c20137434344ed7add6c4be51861e2d14cbda472a6ffb40221009be93722c1a3ad7d4cf91723700cb5486de5479d8c1b38ae4e8e5ba1638e9732",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1288,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100db09d8460f05eff23bc7e436b67da563fa4b4edb58ac24ce201fa8a358125057022046da116754602940c8999c8d665f786c50f5772c0a3cdbda075e77eabc64df16",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb93f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff",
+        "wx" : "0d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb9",
+        "wy" : "3f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a03420004d12e6c66b67734c3c84d2601cf5d35dc097e27637f0aca4a4fdb74b6aadd3bb93f5bdff88bd5736df898e699006ed750f11cf07c5866cd7ad70c7121ffffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE0S5sZrZ3NMPITSYBz1013Al+J2N/CspK\nT9t0tqrdO7k/W9/4i9VzbfiY5pkAbtdQ8RzwfFhmzXrXDHEh/////w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1289,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "30450220592c41e16517f12fcabd98267674f974b588e9f35d35406c1a7bb2ed1d19b7b8022100c19a5f942607c3551484ff0dc97281f0cdc82bc48e2205a0645c0cf3d7f59da0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1290,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100be0d70887d5e40821a61b68047de4ea03debfdf51cdf4d4b195558b959a032b20221008266b4d270e24414ecacb14c091a233134b918d37320c6557d60ad0a63544ac4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1291,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100fae92dfcb2ee392d270af3a5739faa26d4f97bfd39ed3cbee4d29e26af3b206a02210093645c80605595e02c09a0dc4b17ac2a51846a728b3e8d60442ed6449fd3342b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp256k1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb",
+        "wx" : "6d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000",
+        "wy" : "0e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb"
+      },
+      "keyDer" : "3056301006072a8648ce3d020106052b8104000a034200046d4a7f60d4774a4f0aa8bbdedb953c7eea7909407e3164755664bc2800000000e659d34e4df38d9e8c9eaadfba36612c769195be86c77aac3f36e78b538680fb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEbUp/YNR3Sk8KqLve25U8fup5CUB+MWR1\nVmS8KAAAAADmWdNOTfONnoyeqt+6NmEsdpGVvobHeqw/NueLU4aA+w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1292,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "30450220176a2557566ffa518b11226694eb9802ed2098bfe278e5570fe1d5d7af18a943022100ed6e2095f12a03f2eaf6718f430ec5fe2829fd1646ab648701656fd31221b97d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1293,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3045022060be20c3dbc162dd34d26780621c104bbe5dace630171b2daef0d826409ee5c2022100bd8081b27762ab6e8f425956bf604e332fa066a99b59f87e27dc1198b26f5caa",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1294,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3046022100edf03cf63f658883289a1a593d1007895b9f236d27c9c1f1313089aaed6b16ae022100e5b22903f7eb23adc2e01057e39b0408d495f694c83f306f1216c9bf87506074",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aacacbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1",
+        "wx" : "0ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aac",
+        "wy" : "0acbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aacacbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE/////6pj8aI5rHAZfG6/zqV1bcASEj+C\nxR+odNZgKL4A6XahCAYGc3zHXEC9/kqsrL2FOJCIpipjmDhMIrUtSS8j9G5KJ6Ry\nStVVUdpcSDQ4CVokfLDDN48fUsNCX/nx\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1295,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3065023007648b6660d01ba2520a09d298adf3b1a02c32744bd2877208f5a4162f6c984373139d800a4cdc1ffea15bce4871a0ed02310099fd367012cb9e02cde2749455e0d495c52818f3c14f6e6aad105b0925e2a7290ac4a06d9fadf4b15b578556fe332a5f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1296,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3065023100a049dcd96c72e4f36144a51bba30417b451a305dd01c9e30a5e04df94342617dc383f17727708e3277cd7246ca44074102303970e264d85b228bf9e9b9c4947c5dd041ea8b5bde30b93aa59fedf2c428d3e2540a54e0530688acccb83ac7b29b79a2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1297,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30650230441800ea9377c27865be000ad008eb3d7502bdd105824b26d15cf3d06452969a9d0607a915a8fe989215fc4d61af6e05023100dce29faa5137f75ad77e03918c8ee6747cc7a39b0a69f8b915654cac4cf4bfd9c87cc46ae1631b5c6baebd4fc08ff8fd",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000",
+        "wx" : "0d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422",
+        "wy" : "0c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE0YJ/xvbxLyGZLFpAmgZTsSHS7wKysKsB\nqRYc6VYoB0Cx41ayVXAbCm3cnsLKipQixu1dLO2NirdWD6W7iMc450VBiD2KKxwO\nK6fjbQMPxNm/uLIvJNuJfrrEndQAAAAA\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1298,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "306402303244768016457c463b74f2097f216d9670b191f76281c74bc6a1a1971d19f209bf4696468f5eb75d6326a0a43c0a65290230501e0ad985ed9f95697bd17fdbe3f9ca92e0f76426d3664e6896648d9c750bf588d0ce7d011c1a1e8d6c2e082422dc93",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1299,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "306402305e1af40f2480e3d97c4ae4bfd34a9f45269241356f3a46becd86a4a7c9716d73ca5aebdb3db1a7765650666683bc856b02307e7c4b473a2baaa4953785be8aa2a10006f6d36b400ab981864d69cecec046718d0404b9647454b159aa5a92d76d7955",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1300,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "306502306688e36a26f15bdc1c3f91367f8a7667f7bb3e30a335d6f0900e9534eb88b260cb29344c723fedfbe7ac9c5a33f4bf0d023100aa35fddf0fdc9017860b378f801cd806f3e2d754cd2fd94eb7bb36a46ce828cef87e9ebbf447068e630b87fee385ad8f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557",
+        "wx" : "1099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000",
+        "wy" : "0e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200041099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEEJm7RRAPVfWoXMo94rO9XiUPT2+tZjGj\nFWwuUqM9fWFd0nn3n4tLr/fHE6wAAAAA5sm3NqiSny7Xvgx1OlTLtIuEaeBBHq+T\npKgkWboLaBu6j1+zg7SQbUkBozA+LxVX\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1301,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3065023100d4a8f3b0b4d3a5769e3a0bbc644b35f1d509355ed1fe401e170f667b661f693b32598e8c143a817a958982845042bb48023004cc07578bbd1981dbf6e8a97a354c98d41b8b6f6e8a2c2b1763c7c2a29d79e24f8476075c9aed9aec6c64dff50461ae",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1302,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3065023100c286d1928e9c79fdd3bebdf22a1dbd37c8105e8ecf41e9e3777fe341b6b8d5a89b9d986827d6d1dbb381cd8239484a220230201119ae305b9360aa9b5e5d1567e0674c09e4f025556ebf81b987466b0f421b8d31f72bbe95f3ce2aa9874a84edfd40",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1303,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3065023100d9c678550167f10c511e62acb4bd0a3f7f336bc090c94e6c6b02622439c348a2159c5f41f9b5aa4b470590d40dcd7cc202301fd5eaee295abb4081cb626745f4ad279ceb44604062830b58e6c0465c562d41f02ba588fc0db1ebbe339cdc008d7a1b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04000000002b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98",
+        "wx" : "2b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69",
+        "wy" : "0d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004000000002b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEAAAAACsInt11QWkBAUXyY/M0/BZ8wZ2u\ngiWXCuGcyMt+xzWT1qRlw3D1R4sOU51p0ZUdWXtWpnNFrLJYCVgfB80Ot42VOKP4\npl8wDmih63hQffdt5lDo+O5jpfDFaHyY\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1304,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3065023020fee7c71b6cb0d1da3641ec6622c055a3b16a1f596c64b34da1b2d0b868b66a8f0a0d0db983b3dc7e53bb7295da81970231008141a931d3579aec1cac9887d2fff9c6f12d47a27e4aab8cf262a9d14a715bca0b2057cbc3f18b6fd3d1df76f7410f16",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1305,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3065023100913eecc559b3cf7108a65d6cc3076bfdf36c6f94dcc6693d06690470f34a2e81564241e1de5f5f51421de30af467f10f0230649bd3717244e8ef3c6b0eda983f84dca5ea86d1bec15386b9c473ec43a8cd0ba558eee819f791d9ff9272b9afd59551",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1306,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3064023023855c46403a97b76cbb316ec3fe7e2c422b818387604bda8c3d91121b4f20179d9107c5f92dedc8b620d7db87fccccd023050f57343ab148e50662320c4161e44543c35bc992011ea5b1680b94382cf224ea0ec5da511e102f566cb67201f30a2ee",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b33600000000208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4",
+        "wx" : "0fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336",
+        "wy" : "208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b33600000000208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE+wG6rV8Lj3m5zRBNEqq5MQFGrdfWtMAi\n2HrmcRF4uU1hjKezrxOFSxxYiHnod7M2AAAAACCLP1rTs5N6zJ1gbMXs7KtKcB91\n7UKVfqTXhY0z9cJsauIKnMzaVplnANa0\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1307,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3066023100d200958d491fcebde667cd736c9dba0961c70db2ecaf573c31dd7fa41ecca32b40b5896f9a0ddf272110e3d21e84593a023100c2ecf73943b9adce596bac14fce62495ae93825c5ff6f61c247d1d8afcba52082fc96f63a26e55bccfc3779f88cfd799",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1308,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "306402306ac17d71260c79f81a7566124738cb3ee5d0aa690e73a98ae9e766f1336691e500cad51ba1302366c09cc06b8f7049e0023032ca965d6d7012ec187c7cab9544334d66c2a7658ddefa67e4ad40429815518ecc87b1492ddd57333bd2300b4660a835",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1309,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3065023100e19a4646f0ed8a271fe86ba533f8be4fd81bbf4674716f668efa89a40cac51eec2a6cfbd92327d25efe91ca4ff712bc502304a86b2e8e12378e633dec2691e3b1eed4e932cc48b28e45fa3d464cc0e948c02cc9decf2bb43b25937fcf37e9ad86ef0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b",
+        "wx" : "0fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336",
+        "wy" : "0ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE+wG6rV8Lj3m5zRBNEqq5MQFGrdfWtMAi\n2HrmcRF4uU1hjKezrxOFSxxYiHnod7M2/////990wKUsTGyFM2KfkzoTE1S1j+CK\nEr1qgVsoenHMCj2SlR31YzMlqWeY/ylL\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1310,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3064023015aac6c0f435cb662d110db5cf686caee53c64fe2d6d600a83ebe505a0e6fc62dc5705160477c47528c8c903fa865b5d02307f94ddc01a603f9bec5d10c9f2c89fb23b3ffab6b2b68d0f04336d499085e32d22bf3ab67a49a74c743f72473172b59f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1311,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "306602310090b95a7d194b73498fba5afc95c1aea9be073162a9edc57c4d12f459f0a1730baf2f87d7d6624aea7b931ec53370fe47023100cbc1ef470e666010604c609384b872db7fa7b8a5a9f20fdefd656be2fcc75db53948102f7ab203ea1860a6a32af246a1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1312,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3066023100dd4391ce7557cbd005e3d5d727cd264399dcc3c6501e4547505b6d57b40bbf0a7fac794dcc8d4233159dd0aa40d4e0b9023100a77fa1374fd60aa91600912200fc83c6aa447f8171ecea72ae322df32dccd68951dc5caf6c50380e400e45bf5c0e626b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a00000000009b98bfd33398c2cf8606fc0ae468b6d617ccb3e704af3b8506642a775d5b4da9d00209364a9f0a4ad77cbac604a015c97e6b5a18844a589a4f1c7d9625",
+        "wx" : "304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a",
+        "wy" : "09b98bfd33398c2cf8606fc0ae468b6d617ccb3e704af3b8506642a775d5b4da9d00209364a9f0a4ad77cbac604a015c97e6b5a18844a589a4f1c7d9625"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a00000000009b98bfd33398c2cf8606fc0ae468b6d617ccb3e704af3b8506642a775d5b4da9d00209364a9f0a4ad77cbac604a015c97e6b5a18844a589a4f1c7d9625",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAMEs9Bx7R7zAjkbVmr4ydHLev6aq8\nFBrDmrOWdsY+SMGyxkUetGDkUr1XPh+18VuOX5wD9jTY22iXKFBks86b2YoAAAAA\nAJuYv9MzmMLPhgb8CuRottYXzLPnBK87hQZkKnddW02p0AIJNkqfCkrXfLrGBKAV\nyX5rWhiESliaTxx9liU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1313,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3081870242011c9684af6dc52728410473c63053b01c358d67e81f8a1324ad711c60481a4a86dd3e75de20ca55ce7a9a39b1f82fd5da4fadf26a5bb8edd467af8825efe4746218024134c058aba6488d6943e11e0d1348429449ea17ac5edf8bcaf654106b98b2ddf346c537b8a9a3f9b3174b77637d220ef5318dbbc33d0aac0fe2ddeda17b23cb2de6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1314,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "30818702417c47a668625648cd8a31ac92174cf3d61041f7ad292588def6ed143b1ff9a288fd20cf36f58d4bfe4b2cd4a381d4da50c8eda5674f020449ae1d3dd77e44ed485e024201058e86b327d284e35bab49fc7c335417573f310afa9e1a53566e0fae516e099007965030f6f46b077116353f26cb466d1cf3f35300d744d2d8f883c8a31b43c20d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1315,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "308188024201e4e9f3a7b800de63407b8703ac545226541c97a673566711f70e2b9ccb21a145ad4637825b023d1ea9f18e60897413711611a85c1179bff9c107368f1c1b61c24c024201de948ee577c3d4e4122a52ecccac59abb6fa937dfb3e4b988cb243efe98740309452ba013112b225b3b1b1384d5f68796845199a2602a8d4505a331b07d101188e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a01ffffffff6467402ccc673d3079f903f51b974929e8334c18fb50c47af99bd588a2a4b2562ffdf6c9b560f5b528834539fb5fea368194a5e77bb5a765b0e38269da",
+        "wx" : "304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a",
+        "wy" : "1ffffffff6467402ccc673d3079f903f51b974929e8334c18fb50c47af99bd588a2a4b2562ffdf6c9b560f5b528834539fb5fea368194a5e77bb5a765b0e38269da"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a01ffffffff6467402ccc673d3079f903f51b974929e8334c18fb50c47af99bd588a2a4b2562ffdf6c9b560f5b528834539fb5fea368194a5e77bb5a765b0e38269da",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAMEs9Bx7R7zAjkbVmr4ydHLev6aq8\nFBrDmrOWdsY+SMGyxkUetGDkUr1XPh+18VuOX5wD9jTY22iXKFBks86b2YoB////\n/2RnQCzMZz0wefkD9RuXSSnoM0wY+1DEevmb1YiipLJWL/32ybVg9bUog0U5+1/q\nNoGUped7tadlsOOCado=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1316,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "308187024200b6cf64861a2b16e33976095dbf45a592c7c24228c4a1dd727f303d5eeb87e5388ad05c328f824c40abd3e6ce003fef5cd59dee0069ad6348ea6e57f90f6bdc0a820241228181c180366e5451dfef3593ce664804cb42d5a8d5046b816b3daf6602fafd9ac2dc24b8c93a10024480882558b6ad3d9e905923dcd0fd2a11964754a9b46b8f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1317,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30818802420093c8f766827d6dc15c810fa30433153a5e742859205ee8389fbf695c8840dc917440870acc5b160087ffd0cd9a6081029c60a7c26d5e8aa9a0570f4efdeb13dea20242012ec3bbf75a0ad3df40310266648a36db820217ed7fa94e9c8313e03293ef4f6a40e736fb8f208ad8fb883ca509d48046910523645459c27829d54431463b2548c7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1318,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30818802420152388c6da66164b706b41dd4dd48176d6eaf6525f876ef0ff2d147f6966ebfadf1767fa66d04203d3ec9c937a1f0c945aed953e34be444c219fd3b94d3277aa652024201658c1e5b2e563a49d11c883d05c491d628f0a92c3e3dc8db9a4c8d5f0dc846ac22af8b3c5fb5bbe2cfa98614dcffd87de1cee2c5912a5899505a0c5bcaa513e2c6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040000000002fba6a061201ea6b1ed4265163568735ebab78600cdf6a71101dc63beaf546d97a214fc6396793b014eb1aa7a728f53deb2ff9999a3808ddfed15e9629b01993852dadc39299a5a45b6bd7c8dc8ec67e7adbb359fa8fa5d44977e15e2e5a9acf0c33645f3f2c68c526e07732fb35043719cfafc16063c8e58850a958436a4e5",
+        "wx" : "2fba6a061201ea6b1ed4265163568735ebab78600cdf6a71101dc63beaf546d97a214fc6396793b014eb1aa7a728f53deb2ff9999a3808ddfed15e9629b",
+        "wy" : "1993852dadc39299a5a45b6bd7c8dc8ec67e7adbb359fa8fa5d44977e15e2e5a9acf0c33645f3f2c68c526e07732fb35043719cfafc16063c8e58850a958436a4e5"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040000000002fba6a061201ea6b1ed4265163568735ebab78600cdf6a71101dc63beaf546d97a214fc6396793b014eb1aa7a728f53deb2ff9999a3808ddfed15e9629b01993852dadc39299a5a45b6bd7c8dc8ec67e7adbb359fa8fa5d44977e15e2e5a9acf0c33645f3f2c68c526e07732fb35043719cfafc16063c8e58850a958436a4e5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAAAAAAvumoGEgHqax7UJlFjVoc166\nt4YAzfanEQHcY76vVG2XohT8Y5Z5OwFOsap6co9T3rL/mZmjgI3f7RXpYpsBmThS\n2tw5KZpaRba9fI3I7Gfnrbs1n6j6XUSXfhXi5ams8MM2RfPyxoxSbgdzL7NQQ3Gc\n+vwWBjyOWIUKlYQ2pOU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1319,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3081880242010e89470f981d2c7c5c96587121a67323bb96ff2427739d0d885ea277293efa3b25c0bda04d81466198a3cbfc441f1b1b98f6bcdc2589d9d91a17a7899f70d0461e0242017351b0da8c8d0e4aa0974669d190fa2f90aa50227160594dfb55755002365441de17ea42902128a6f81e554177ed509c0cec31fd5053fae03f62ff76579ba92bda",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1320,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3081880242011094ac23ca46a3e2b4ac3baae6504f1bfb3ddf2db9ab40eda32d8e0a05727998f8552a033bb05241e826a86a1d03014eae3aa5fe1a45caac1db3e8138b9cf5906802420147edb15a5080ee2f929f78b6ac86604aae51b674fa46eaae7fdfd90bf64d6189341155f4eba937eae74c9e480eb4fb7e6aafd4285e7fc503ee6ec20f0b1415be06",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1321,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "308188024201d876ae174da31e128babff9f1d15507660bdc7958750844dc4f4291f75a882a22f177f704be6067bf7ce8f06b8626d971e6ef5dcb666fa975c1e11126e04fccce2024201abb12630a68b669e6ad2d8d62654d75dfbc6b54a8e3a9c915be663e080ddcc348e57a10e2b1dd9f03e1b897796ad889b075e5919dc5bf37a112d92c693456e6457",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401fffffffe1d5d52b31ca52f8947a35593edf164cd324f833b90935846c64db1454df9f028dc8bc36bb04cb7f0cceceba01a3844097f7c35eeaa81428db0cca6333101b7c70277d0bf78a3c7b62c937f0cb2cad2565f5514f6205ceb1a193d4fdb45ba6e6cec07827bae0b16b8316c3539a15114d0de6d2de407fd7117551a70826eada6",
+        "wx" : "1fffffffe1d5d52b31ca52f8947a35593edf164cd324f833b90935846c64db1454df9f028dc8bc36bb04cb7f0cceceba01a3844097f7c35eeaa81428db0cca63331",
+        "wy" : "1b7c70277d0bf78a3c7b62c937f0cb2cad2565f5514f6205ceb1a193d4fdb45ba6e6cec07827bae0b16b8316c3539a15114d0de6d2de407fd7117551a70826eada6"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401fffffffe1d5d52b31ca52f8947a35593edf164cd324f833b90935846c64db1454df9f028dc8bc36bb04cb7f0cceceba01a3844097f7c35eeaa81428db0cca6333101b7c70277d0bf78a3c7b62c937f0cb2cad2565f5514f6205ceb1a193d4fdb45ba6e6cec07827bae0b16b8316c3539a15114d0de6d2de407fd7117551a70826eada6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB/////h1dUrMcpS+JR6NVk+3xZM0y\nT4M7kJNYRsZNsUVN+fAo3IvDa7BMt/DM7OugGjhECX98Ne6qgUKNsMymMzEBt8cC\nd9C/eKPHtiyTfwyyytJWX1UU9iBc6xoZPU/bRbpubOwHgnuuCxa4MWw1OaFRFNDe\nbS3kB/1xF1UacIJuraY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1322,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30818602414ed692af1ed1b4bd5cea3aa8ddc6f3f15d8a6ee0016fa0e8eb958580e7421832ecc0e387c34aafac6380bac419ea45c42ae6426af503847f22c49c2f456338c1a702417aceadde02ace1668bc1a3360d34e125afde230f536c154d91e6c876bee1d34ae06edcbbca0c7cd17646840913164740b12e2e224fe3ef3dec6fd84a81b581c188",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1323,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "308188024200e01094048fcf7a1e2ec66faedffc40f48c9c93514325bde6b4958d80f0413efde7eec1dc6de65f96009c069397e51da2eb1729efa287afd5552b25a9e427a6d836024201489e7e124f66942e642de992e60b3a86fcce576767719390c3a312fcdeaa560a7fbb0cabb35e05a6d6f3499160fd2dba12d29b613b16dec7494c950d65fdf11fa3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1324,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "308188024201d296292213380de133dc66eceb8bd857a5c468afe855c05da9db937373b51f9020ca11353415da76bb6af997a486d2370e31adcc0a4531952a3b59428678ee59430242015979a3c609c2c2099ae1b290da3d613b248e3a10de7ad770dffc82fb33e74fc3207533f97285cf4557a6407e9a775e59efeaee4264b2634933a6baf8c406f0c4a9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400c7c8817bf2f0652a4a4b5140c773e261080a0a111395856e8a3350f5eb5612bd63b367b965e92e9538ea3b7908aef1ade4b68e17f9f9148495c167d1c4dd4913490008bf0be2979abb8111fd0d768adcad774113a822c1bb60887053b5cf8c9563e76705a391ece154b5dfb114b20e351df4014bec19fa87720845801cf06b7fffffff",
+        "wx" : "0c7c8817bf2f0652a4a4b5140c773e261080a0a111395856e8a3350f5eb5612bd63b367b965e92e9538ea3b7908aef1ade4b68e17f9f9148495c167d1c4dd491349",
+        "wy" : "08bf0be2979abb8111fd0d768adcad774113a822c1bb60887053b5cf8c9563e76705a391ece154b5dfb114b20e351df4014bec19fa87720845801cf06b7fffffff"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400c7c8817bf2f0652a4a4b5140c773e261080a0a111395856e8a3350f5eb5612bd63b367b965e92e9538ea3b7908aef1ade4b68e17f9f9148495c167d1c4dd4913490008bf0be2979abb8111fd0d768adcad774113a822c1bb60887053b5cf8c9563e76705a391ece154b5dfb114b20e351df4014bec19fa87720845801cf06b7fffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAx8iBe/LwZSpKS1FAx3PiYQgKChET\nlYVuijNQ9etWEr1js2e5ZekulTjqO3kIrvGt5LaOF/n5FISVwWfRxN1JE0kACL8L\n4peau4ER/Q12itytd0ETqCLBu2CIcFO1z4yVY+dnBaOR7OFUtd+xFLIONR30AUvs\nGfqHcghFgBzwa3////8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1325,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "308188024201ef8f785c51a25ae2cd93487b5c848d4af133217a91f51359c966e7538e68743578122df5830002f96f6fadb5bc44480e3b3b2c804e4c51cf95d059d5646c5cef21024201ba2276cc003e87bea37c3724e58a0ab885f56d09b8b5718f674f9c70f3b5ecfb4ad1f3417b420ec40810e08826efa7d8ad6ca7c6a7840348097f92b2de8d6e080b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1326,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "30818802420155978adc4b570d897511f5ecfb65a31947e6e989da17dea716625bb3fa7b92b853623eb0cd9ce2a5e2b4d8c1c2a90ec04fe79d012576ec728a45c5ce47c6d500c0024200f79fa8b94ee282a3d1815892cbf15d7ebdf62cb042c76bb3c710c23e32b75992cc249d84072198e4ed63d72435a07d2ed76f278d7399f61a5b5c997f45692fed22",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1327,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "308188024201a2af29c58184ca861e7cd931f39cea064b199eee563f241cd5ecf6ebb2ade728f1be23cf007ebe8ef0c42d99f9f5190f6815446afc3043a820d7daf27e86b83b8a024201a2acd1822eb539383defff8769aad8bacd50cd24ca7aa6670671418110177808c3f4fbe6041b9cb898359ee61e04824adedd62b39fe5791907a20586333bd3c76d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04802a0f51204ef6a829211bc0740887461ee4aba736e9caee000000007fb931e06300451362d444106eeb5dabddca650fec4be55fc545f7c8",
+        "wx" : "0802a0f51204ef6a829211bc0740887461ee4aba736e9caee00000000",
+        "wy" : "7fb931e06300451362d444106eeb5dabddca650fec4be55fc545f7c8"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004802a0f51204ef6a829211bc0740887461ee4aba736e9caee000000007fb931e06300451362d444106eeb5dabddca650fec4be55fc545f7c8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABIAqD1EgTvaoKSEbwHQIh0Ye5Kun\nNunK7gAAAAB/uTHgYwBFE2LURBBu612r3cplD+xL5V/FRffI\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1328,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c0e17e8450ea85d201ac120ad8219dba676e937f139eb28ca3b02b7a7021c7839548a47fc6f4d5dbd4fa76b947ab9d3fd1f428bf3b0ebcafe85d6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1329,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c331c2d450147066ec54df6db127e520f53ff40494694f40c16d62bda021c17f9ecad114fac61661fa4be9dba6adf361ccd2a7cfd9141926273c5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1330,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c40cdcc80f93e469b257cf5890500eb6e6cb0f5f6b81b717159baaa43021c0d748759d141d54d15080bbf76db1e9da934d6a43b5df86fafee9fa8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04cb320c84f26c00a1b4ad7146914cae126529165de7363d8aef9abd05a397d46b87283176b7f69da1f94615ca4431fc47b2a0e60c00000000",
+        "wx" : "0cb320c84f26c00a1b4ad7146914cae126529165de7363d8aef9abd05",
+        "wy" : "0a397d46b87283176b7f69da1f94615ca4431fc47b2a0e60c00000000"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004cb320c84f26c00a1b4ad7146914cae126529165de7363d8aef9abd05a397d46b87283176b7f69da1f94615ca4431fc47b2a0e60c00000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABMsyDITybAChtK1xRpFMrhJlKRZd\n5zY9iu+avQWjl9Rrhygxdrf2naH5RhXKRDH8R7Kg5gwAAAAA\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1331,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00bdf933f1bd8f7f85007b53006ca6286825d8cda993d2732bcf7ef821021d008b233dcd04c8bfc0135f77f092c40e5a3d372663cd270467cec78602",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1332,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00a130281e17a3bebbbf807d82a17ee8481ae355d97986066ebc23a9d2021c57967b897505d7833916968b24d3f4a4d75881b530725d28ece785af",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1333,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c711567408f7592b1e09b87c6bfd20dff2fa50663ad4dd0ff86353f5d021c60c183ff249e79258c8e95e59d13ead6db5ccfcb70c0ea05433fd8d7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040000000081df971744a25ac99472c3ff5a8fc49b86fc9fb570448ff977f2d07c1c9296b2f77478d13d5ab1c63993962f2dd08ee7c313dece",
+        "wx" : "081df971744a25ac99472c3ff5a8fc49b86fc9fb570448ff9",
+        "wy" : "77f2d07c1c9296b2f77478d13d5ab1c63993962f2dd08ee7c313dece"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00040000000081df971744a25ac99472c3ff5a8fc49b86fc9fb570448ff977f2d07c1c9296b2f77478d13d5ab1c63993962f2dd08ee7c313dece",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABAAAAACB35cXRKJayZRyw/9aj8Sb\nhvyftXBEj/l38tB8HJKWsvd0eNE9WrHGOZOWLy3QjufDE97O\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1334,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c141aa423ae368d00efcdc9a3a61102888a2f3457d21f1ceb15a646d0021c2cf9185b025434b807fec86c2dee087827fe3a07b174eddbe0b3fc63",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1335,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c0714c39972835620b5f1952e8792bc2933e9fda40c1c48472bb93feb021d00d30c570777affb34aa4d2506bd0ae9e4245398fc3a5d79d8e4681b37",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1336,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d0088089cd16381ba75b1bb830053202970ebdf4a3222831378d9784713021c3bcef1a5e70eee13abac90b95b764cf344ccc9c0b4703f7be60292da",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040d28b4f7fe1f6c6fa6a77d11e43bd3e9271758df34c65fa577a6dd3b000000002801d48382861684b8d2cbd7e5989a0d7c15a7e819b573aa",
+        "wx" : "0d28b4f7fe1f6c6fa6a77d11e43bd3e9271758df34c65fa577a6dd3b",
+        "wy" : "2801d48382861684b8d2cbd7e5989a0d7c15a7e819b573aa"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00040d28b4f7fe1f6c6fa6a77d11e43bd3e9271758df34c65fa577a6dd3b000000002801d48382861684b8d2cbd7e5989a0d7c15a7e819b573aa",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABA0otPf+H2xvpqd9EeQ70+knF1jf\nNMZfpXem3TsAAAAAKAHUg4KGFoS40svX5ZiaDXwVp+gZtXOq\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1337,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c6e5344dd4452d37dff3d46177d56d3dd7f3faa63ac0ff0f4fa3996d7021d00d380df757a616d6c209a590dbbeba1dd2bf75d17e49841a6f7a7aca4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1338,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00c85b980fa4149d9ac418090c9eda8754d1ea5228fbe04a918157879f021c4f848fb87e188614ad92b4e0bddfaeade1d7d19da6a249e4cbd73358",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1339,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00b02936692b3e662508896e956fec67733a5436a40fc9b7a896f44c8e021c04b8dea8fe1593aa703dcde9c3a9e8bd8a1bd6e06631d273aa8bd978",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040d28b4f7fe1f6c6fa6a77d11e43bd3e9271758df34c65fa577a6dd3bd7c134a9fe419202a79219a0bcff0bafcb066d4a1bc4e20d65134d55",
+        "wx" : "0d28b4f7fe1f6c6fa6a77d11e43bd3e9271758df34c65fa577a6dd3b",
+        "wy" : "0d7c134a9fe419202a79219a0bcff0bafcb066d4a1bc4e20d65134d55"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00040d28b4f7fe1f6c6fa6a77d11e43bd3e9271758df34c65fa577a6dd3bd7c134a9fe419202a79219a0bcff0bafcb066d4a1bc4e20d65134d55",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABA0otPf+H2xvpqd9EeQ70+knF1jf\nNMZfpXem3TvXwTSp/kGSAqeSGaC8/wuvywZtShvE4g1lE01V\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1340,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d009750a310311b383b1e9c36c63003748261460b52233f871a8d0d0e87021c4cab79d9bbf0c570e30a2383405b4ecbec8608dde1d24b3730b87835",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1341,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c560e0be613fb22842c6c23cc571058141112dc35497e54241f398cc9021c009dc86d2c7f0861313d49379335b2ed1c06a1709eddca0326f76ab5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1342,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00a5c995fc1fb0a913f2bb5db55d40bc846b78f32eb77ce8037b1e6086021d00b0bc916ecffdeb812f0bb16d0236d5fe77d855ba47009c921581eb4f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224t1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d3315edb498cdae7e105fb1cb9cfb1c8b736a831e0bef47be3c15311b513d2bf169a570607f9dcb809a53840ef6e907a7fe90ee3ffffffff",
+        "wx" : "0d3315edb498cdae7e105fb1cb9cfb1c8b736a831e0bef47be3c15311",
+        "wy" : "0b513d2bf169a570607f9dcb809a53840ef6e907a7fe90ee3ffffffff"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010106033a0004d3315edb498cdae7e105fb1cb9cfb1c8b736a831e0bef47be3c15311b513d2bf169a570607f9dcb809a53840ef6e907a7fe90ee3ffffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEGAzoABNMxXttJjNrn4QX7HLnPsci3Nqgx\n4L70e+PBUxG1E9K/FppXBgf53LgJpThA726Qen/pDuP/////\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1343,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c77cd4c6e4907e645028fd9ab47f35f3e4deac62ab5623e4caa5f22ca021c4dfb99d0da46d520687e3ad4eac2383664a7bbc9249faaef6af5d0c5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1344,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c270c9c43ade9dc6cf53853d7b544db44aa43291d20f8674cf4d2cfab021c2f6d5d4db32b2f547923bbdb9d7a79044a2b02149ba8a409914ddf77",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1345,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c218a41444e6a08de3a15dd81deb2f0909989926e919c6b39422a07b9021d00bff743595322d652da673bbb78428150d2aaa245c4ecc08d58350b57",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224t1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400000000ad0561f78ae4931752dcac129756e9057a5fd6ee31a280293ce1515ae15694f8bd2efa26f5fb5e10b38c393d539d25ad3152fe94",
+        "wx" : "0ad0561f78ae4931752dcac129756e9057a5fd6ee31a28029",
+        "wy" : "3ce1515ae15694f8bd2efa26f5fb5e10b38c393d539d25ad3152fe94"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010106033a000400000000ad0561f78ae4931752dcac129756e9057a5fd6ee31a280293ce1515ae15694f8bd2efa26f5fb5e10b38c393d539d25ad3152fe94",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEGAzoABAAAAACtBWH3iuSTF1LcrBKXVukF\nel/W7jGigCk84VFa4VaU+L0u+ib1+14Qs4w5PVOdJa0xUv6U\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1346,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c240c5b1371b9b45cc72ae32ef9dca603d92644bc33c88af5494c4568021c225648b2154e0b3834a426b3c0f3c68afd356715670664b4bcebd44d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1347,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00b585ad9b16d2999bad8ae0c08e49d6f1aab3287f4c5a9ccb0ca75c19021c6b6cca5d875bf475b56669b4bff47dddb6ae9dd0c29d8f5bb3806ece",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1348,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c5c9b6872553ed6bf23ec5fcc5ac1f6cf49a30e93a275556634e7cd44021c687e3a536c67325a97b46db24d557469b0dc38e0574a5bd4aae8f976",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224t1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0467a0970c72a15b2bf830ede450f72d29f7e24e307933e39fe37a6269000000000a84a1d47239d59c46df70265c8f728d4a6dc98c9b1237dc",
+        "wx" : "67a0970c72a15b2bf830ede450f72d29f7e24e307933e39fe37a6269",
+        "wy" : "0a84a1d47239d59c46df70265c8f728d4a6dc98c9b1237dc"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010106033a000467a0970c72a15b2bf830ede450f72d29f7e24e307933e39fe37a6269000000000a84a1d47239d59c46df70265c8f728d4a6dc98c9b1237dc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEGAzoABGeglwxyoVsr+DDt5FD3LSn34k4w\neTPjn+N6YmkAAAAACoSh1HI51ZxG33AmXI9yjUptyYybEjfc\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1349,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d0094b828b360834e98f348d0e2084f39b6375a7fb31ac2c16a78d5c123021c2e6b6686d1b582e165be1bfda1b35ca16839f312fa74252ba7f42e2d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1350,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c69c0f72f5308ef41dad0e2ea4dbd3af978a80186aded8f33c1fa1c7e021c22ba73e20baaa697c67de73c89752705aa3f3acdaf027d7ef216e338",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1351,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00a5a02604d4edff156c42619395a41304440e375e94314a482ee52ef8021c1a5f88c1c708e7cf2697f574c1edcb5e68dd6a25199be40d190860fa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224t1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0467a0970c72a15b2bf830ede450f72d29f7e24e307933e39fe37a6269d7c134aa1bbec4b1b7de5a892ef26761540f94ca4d6cc068e3b68923",
+        "wx" : "67a0970c72a15b2bf830ede450f72d29f7e24e307933e39fe37a6269",
+        "wy" : "0d7c134aa1bbec4b1b7de5a892ef26761540f94ca4d6cc068e3b68923"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010106033a000467a0970c72a15b2bf830ede450f72d29f7e24e307933e39fe37a6269d7c134aa1bbec4b1b7de5a892ef26761540f94ca4d6cc068e3b68923",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEGAzoABGeglwxyoVsr+DDt5FD3LSn34k4w\neTPjn+N6YmnXwTSqG77EsbfeWoku8mdhVA+Uyk1swGjjtokj\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1352,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c58c9484628a064a0c0708b8cc9cc66c86c469228684ed9ddcfd84f60021d00c676ba679fba5b70dc502b307c44c73994b2215025654beea00edf86",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1353,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00d4927deedb36416ff812c995147f906a3c25f1fa6931c7aac5993633021d00951be296ab7fe95ec7f3d0a4277ae2b45c2736b56ddd041c07c7bf6a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1354,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d0091d9e01b7d857d6dc1c795e363a5db9e8aceb36a71f3ccc500e3200b021d00d12426571cd8e7764b682cb65b9e0fed3aec3e224ed89f45610bf9c5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224t1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040e3b9930f83128444f91cb99dad7ad08ebda6751249ff480b4f8c99ba87ab319035e38828bedfd8b88648c509a93a2c90893667b00000000",
+        "wx" : "0e3b9930f83128444f91cb99dad7ad08ebda6751249ff480b4f8c99b",
+        "wy" : "0a87ab319035e38828bedfd8b88648c509a93a2c90893667b00000000"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010106033a00040e3b9930f83128444f91cb99dad7ad08ebda6751249ff480b4f8c99ba87ab319035e38828bedfd8b88648c509a93a2c90893667b00000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEGAzoABA47mTD4MShET5HLmdrXrQjr2mdR\nJJ/0gLT4yZuoerMZA144govt/YuIZIxQmpOiyQiTZnsAAAAA\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1355,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c60e49adadc253a80c898a6e5bb60729f8a493c69ca762f5f914bb095021d00a9767c5acf98c0486dcbdc8d893406833ed3d7512b90b3dc8c86e068",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1356,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c3b802bc26fbf0a1ac2471622721300e4b6b6608683dc53c1695bbb49021d00a484c4c40c1cd96c72bb59193c408f36ae7db57b0b7019b83412f56e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1357,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00bb4333677bbd774da30446a45cb4457ebbf348fd79a0570e94353df5021c03aee9fb72e283d6ff2721796696e7d7e744e9128411519a31a0aa9c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224t1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d6939170da6417743dd90517b6b5a249d8176cdc054395a5ffffffff40d1f24a9103e287cff1cd33c841a8f5ac64441adb60e5aa55cbf4a2",
+        "wx" : "0d6939170da6417743dd90517b6b5a249d8176cdc054395a5ffffffff",
+        "wy" : "40d1f24a9103e287cff1cd33c841a8f5ac64441adb60e5aa55cbf4a2"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010106033a0004d6939170da6417743dd90517b6b5a249d8176cdc054395a5ffffffff40d1f24a9103e287cff1cd33c841a8f5ac64441adb60e5aa55cbf4a2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEGAzoABNaTkXDaZBd0PdkFF7a1oknYF2zc\nBUOVpf////9A0fJKkQPih8/xzTPIQaj1rGREGttg5apVy/Si\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1358,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c5b0960bf9b80e91dca65e558adf271f16b23e87bcc6c51ef10ce9352021d008f84a7c312b21c959c6cf7efbfd8feb7174ff6401a85e17ba6121e0b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1359,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c1f1a6223aad76016ac351833a0b7859c6b6ff9edf900d040c8cc398a021c512b0b449c3bd0df9e5153f6e8d6381752ed62785d853d72950d9d7f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1360,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c034a264c9d3feafdd488c528af27fa45c58f28cfe4a1637d1ab567d3021c4d7c05e58af7f288ab83d01bbf8fad1d8ca793221d4af5fe4c719fd3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a9fb57db62501389594f0ee9fc1652fa83377fa302e19cef64252fc0b147f7749507acf5b04339ed102b9ca60db98c165b94ebe855d2202e46dce15ba1e028be",
+        "wx" : "0a9fb57db62501389594f0ee9fc1652fa83377fa302e19cef64252fc0b147f774",
+        "wy" : "09507acf5b04339ed102b9ca60db98c165b94ebe855d2202e46dce15ba1e028be"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004a9fb57db62501389594f0ee9fc1652fa83377fa302e19cef64252fc0b147f7749507acf5b04339ed102b9ca60db98c165b94ebe855d2202e46dce15ba1e028be",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABKn7V9tiUBOJWU8O6fwWUvqDN3+j\nAuGc72QlL8CxR/d0lQes9bBDOe0QK5ymDbmMFluU6+hV0iAuRtzhW6HgKL4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1361,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3045022062aab40a36d6a0d25644719ce31dc629ec684f6f0da32f9dd034ccc421dbd0ed022100a1fa6b0dfd9558da29374fb77505ee8ab3572161711f821d11807c7fff910c1c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1362,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30450220740cd3d3a9cd9dbe05ead4e39e54db27c0f1579da68e3aa5c9245b047aebc3b80221008ae78c12233d378fe2ce3c0fb2b769f8463830a71a5e5187c11b20fdd7e50445",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1363,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100a28f30245c5fb0c225fdec23924dc2cd4c2da888d1ee1bc5445858c646015ca802200ee364c1491c4551ef3509be8f88db0e04d0afb36528aeda1301b14948cc9cd6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04351a45fb920f2c9f1b178438fa3bf272ff9328b881c477a1f56a8c0e884652761270f806fe40ad97ebf76c6825384b780ae6afccc792b05f2fb3eb7b7fffffff",
+        "wx" : "351a45fb920f2c9f1b178438fa3bf272ff9328b881c477a1f56a8c0e88465276",
+        "wy" : "1270f806fe40ad97ebf76c6825384b780ae6afccc792b05f2fb3eb7b7fffffff"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004351a45fb920f2c9f1b178438fa3bf272ff9328b881c477a1f56a8c0e884652761270f806fe40ad97ebf76c6825384b780ae6afccc792b05f2fb3eb7b7fffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABDUaRfuSDyyfGxeEOPo78nL/kyi4\ngcR3ofVqjA6IRlJ2EnD4Bv5ArZfr92xoJThLeArmr8zHkrBfL7Pre3////8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1364,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "304402207f202f54f591b51105b227ee6d6da3adddfc4b5e819efc04befcdcbf7484f78302204360ea04503955fc3f025928b2dce50ff2d58b9060b34bbedfc3c219b3b4355b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1365,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3044022062e218dca32e4ef35692e9315e1e036bef1766073b846e38de20d2d29349f9fe0220519d4d4c6158d95474d793a0ee9c260a0c5469c5aab79510971b41fb4fae4baf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1366,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100a3902295f6f743ac754db7b3fcd823be917b1191a5705728f5682492784da7f1022043def636660eff72e6435edb850c9126c7067938668f249998a0e4006b8ee7db",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040000000129b2146e36fc055545bf8f2cc70f8e73e8b25e539365ad7577cc35354a2b8c0319bc4ccd3e60da119477c23faf8fc2dcefc42d3af75827aeb42f6f0f",
+        "wx" : "129b2146e36fc055545bf8f2cc70f8e73e8b25e539365ad7577cc3535",
+        "wy" : "4a2b8c0319bc4ccd3e60da119477c23faf8fc2dcefc42d3af75827aeb42f6f0f"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200040000000129b2146e36fc055545bf8f2cc70f8e73e8b25e539365ad7577cc35354a2b8c0319bc4ccd3e60da119477c23faf8fc2dcefc42d3af75827aeb42f6f0f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABAAAAAEpshRuNvwFVUW/jyzHD45z\n6LJeU5NlrXV3zDU1SiuMAxm8TM0+YNoRlHfCP6+PwtzvxC0691gnrrQvbw8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1367,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304502210086d05b26a9ca7e10ae0681bb4c35a06d7a4e918f8625e3dfa7ac2d5aeda91c05022008c5f475a95888769da4a0e1b635c2292f654f934a5c5010fe0c729f3d11e1b1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1368,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3045022043c4474710d25094a2e21a9cc08585c26015f9f94012b100e72c0763aa9e0cff0221008345c46fd5592cefbd5ebb258965c05d964e6e6a278198ddc1e388cf1e75867c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1369,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304402206d2724167e816528491cce574f0526209de52cd0f2af0085284fd050163d37c5022076dd1dd50ff9b553b0e142b7e6c6be8edf3708dd292f03f3e9bf157d21daa9eb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04680becabe7d7df4fadfe5ae01fba5ea51b76759606a2e30612e667419b885d0508541dcb0723785c3c766581a7514a1ff42e4437d63f878271cb860f00000000",
+        "wx" : "680becabe7d7df4fadfe5ae01fba5ea51b76759606a2e30612e667419b885d05",
+        "wy" : "08541dcb0723785c3c766581a7514a1ff42e4437d63f878271cb860f00000000"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004680becabe7d7df4fadfe5ae01fba5ea51b76759606a2e30612e667419b885d0508541dcb0723785c3c766581a7514a1ff42e4437d63f878271cb860f00000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABGgL7Kvn199Prf5a4B+6XqUbdnWW\nBqLjBhLmZ0GbiF0FCFQdywcjeFw8dmWBp1FKH/QuRDfWP4eCccuGDwAAAAA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1370,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "30440220321009a06c759c54cd66baafa0cbfd07eedb19f12a1ed654dd52b56f9c4fac7c02201956310a7e4757ec83ddb92d2763607354678149f1ad92387928cf887b4bed0f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1371,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "30450221009bdd359881c239e2415ca2af3d18463bb24be53f6f636cbd20360b6b333bc34502200ff03bc36cc1975bdc8680c44fbf2aefddf67c118c304b8b3d360eb10203c3a4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1372,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3044022048565eb7e7820d40754b5f264a4ceafa62bf75084241514b491995e7971e699502203da6df3d354f48daef6d078cf1124295fc8c3211f2757967c781dc2e9c62ed1a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047d16fd656a9e6b34e45d8c8c3b458eae7bbc2879f8b4f61171a96f664eee906100000001469fb456ca6a1720ca8db25d567e121cf921ce13e34000f8c12f5272",
+        "wx" : "7d16fd656a9e6b34e45d8c8c3b458eae7bbc2879f8b4f61171a96f664eee9061",
+        "wy" : "1469fb456ca6a1720ca8db25d567e121cf921ce13e34000f8c12f5272"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200047d16fd656a9e6b34e45d8c8c3b458eae7bbc2879f8b4f61171a96f664eee906100000001469fb456ca6a1720ca8db25d567e121cf921ce13e34000f8c12f5272",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABH0W/WVqnms05F2MjDtFjq57vCh5\n+LT2EXGpb2ZO7pBhAAAAAUaftFbKahcgyo2yXVZ+Ehz5Ic4T40AA+MEvUnI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1373,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "30450220518e885def022eb5020fc90f4024d87122dc0f3ed7f869ed7720ff74a009fb7b0221008a3e26a8cd426d21eba5cd7a5614f3644395cfcecb24fe760a68a7a9e8f09c02",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1374,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3044022004b01e5cc3ce9bf10844bc1cb21deeff6ebc9e2a7010cfbb3af0811354599c8102202e65fb8db62f255910ea4d5235bb21aa67aa59ffd519911ecd9893000ab67bb4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1375,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "304502210094bb0601198c4ce266b0932426ffd00132d7d4e2de65ef47f56360825f26243802202734327d1989c9580f5458f04aac6fd5752a1ee5e236e9ed1a7c0b2d9b36db10",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047d16fd656a9e6b34e45d8c8c3b458eae7bbc2879f8b4f61171a96f664eee9061a9fb57da5b4ef56573fbf36fd2f5db1517bde406dc0452143cd347245e3f0105",
+        "wx" : "7d16fd656a9e6b34e45d8c8c3b458eae7bbc2879f8b4f61171a96f664eee9061",
+        "wy" : "0a9fb57da5b4ef56573fbf36fd2f5db1517bde406dc0452143cd347245e3f0105"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200047d16fd656a9e6b34e45d8c8c3b458eae7bbc2879f8b4f61171a96f664eee9061a9fb57da5b4ef56573fbf36fd2f5db1517bde406dc0452143cd347245e3f0105",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABH0W/WVqnms05F2MjDtFjq57vCh5\n+LT2EXGpb2ZO7pBhqftX2ltO9WVz+/Nv0vXbFRe95AbcBFIUPNNHJF4/AQU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1376,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "304402204dde197f962c63a7799c862e897b3bb1e7a7ddfb9ab77c2a17a54151ce604ad60220017e7aef86e533086425a2c4b32082f118913ef3667c8437672e0bbc7c2b8d7e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1377,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "304402207c53ed1d504ad4ba53d39792012a34d007250a2b8d1ca189c0d9f75ccc9a9957022009b97dcc5c67487114231d601374a8364cafa39581291762202b9215d51135fd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1378,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30450220513245ab2b6a4206bb0f6970c8ad040a94725ddc9a08db0fd9def93866ffbba1022100a53a7ab37decedae18dd5b5c48eb642b7a9c927e6bcf6bdac3a757e6d2c169c5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047f85e98d6be68ba1db3a0e1eddd66f059521eb4117e72d804134392effffffff0efe5fb8e32884e0796063ee19094944d7998137b305ff3b5f0288f67a1b6a2e",
+        "wx" : "7f85e98d6be68ba1db3a0e1eddd66f059521eb4117e72d804134392effffffff",
+        "wy" : "0efe5fb8e32884e0796063ee19094944d7998137b305ff3b5f0288f67a1b6a2e"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200047f85e98d6be68ba1db3a0e1eddd66f059521eb4117e72d804134392effffffff0efe5fb8e32884e0796063ee19094944d7998137b305ff3b5f0288f67a1b6a2e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABH+F6Y1r5ouh2zoOHt3WbwWVIetB\nF+ctgEE0OS7/////Dv5fuOMohOB5YGPuGQlJRNeZgTezBf87XwKI9nobai4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1379,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "304402204b5eaecd4434b9a3052490e5d74725d11b1bb0eab3341ab7e5343638b96309a5022060c4fcfacac8f8b6079402b514453033606c42efd166f67115644ec0cc704ff2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1380,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3044022017c45f9814d9553c17d73fccf1060770dba9e540af29b2576cce524494d6c8d202205cc08e026aed87fbb3d6f2e8e0cc8083f04eb3fd06e12e108f180b3e0fdec73e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1381,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "30440220515bc9c084757bbdbe90497ec5fca75e8b48e64f794417af2ba8bbf78ea992f5022068c31499463513540ba789bdaa4530884117c1856398ba3b19286029f3fa797b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040058237a34f93d8b7013f96b8bd618300a2796cad9350f44e5bb89def5b250890000000049e1973136914fb97489793fe44a2103c7bc6b90fe183976d0794632",
+        "wx" : "58237a34f93d8b7013f96b8bd618300a2796cad9350f44e5bb89def5b25089",
+        "wy" : "49e1973136914fb97489793fe44a2103c7bc6b90fe183976d0794632"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200040058237a34f93d8b7013f96b8bd618300a2796cad9350f44e5bb89def5b250890000000049e1973136914fb97489793fe44a2103c7bc6b90fe183976d0794632",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABABYI3o0+T2LcBP5a4vWGDAKJ5bK\n2TUPROW7id71slCJAAAAAEnhlzE2kU+5dIl5P+RKIQPHvGuQ/hg5dtB5RjI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1382,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "30450220038090bf9f3f640519d418414f0a7f8afb0dbe4c225d4f9fa284922ba5f966490221008bfaded7b3ea38f7eb7f9912443130b4418e5bacc16a6ff8253d4f1926eced67",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1383,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3045022074cb761ac6b5687c29f18448c5ba804d5869780de37e5606ac5461b1b9697cfe02210098852aadb7bb2b44cbcd432eee62bdb0cebcab8c1d24ace5218bedee35609438",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1384,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3044022077cbc58c57a912a3a66153b6e83f0c0daf6f7d1449fa9a29281dd5d221ae8e8d02200b56cff53baccce588ca5c8eda47cf74a57ebbd8448126a50acdb11c8e0a2a53",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040058237a34f93d8b7013f96b8bd618300a2796cad9350f44e5bb89def5b25089a9fb57db580d128b07d4bad728fa143289f1d5200d69b49721fb0ea64ef50d45",
+        "wx" : "58237a34f93d8b7013f96b8bd618300a2796cad9350f44e5bb89def5b25089",
+        "wy" : "0a9fb57db580d128b07d4bad728fa143289f1d5200d69b49721fb0ea64ef50d45"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200040058237a34f93d8b7013f96b8bd618300a2796cad9350f44e5bb89def5b25089a9fb57db580d128b07d4bad728fa143289f1d5200d69b49721fb0ea64ef50d45",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABABYI3o0+T2LcBP5a4vWGDAKJ5bK\n2TUPROW7id71slCJqftX21gNEosH1LrXKPoUMonx1SANabSXIfsOpk71DUU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1385,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3044022063a581c9e66100f650d9ff11ad7bea622386a26c5337b71b4d97a120c146343102205cc6bb800deeb73a16814897ef9a625bbdb6e4b45fcceaf0a3182980619ea727",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1386,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "304402207d62fbfb45e73ffacf9c81d68769364940537494992296a50656731a5ebe1ab102207b986faf243493ce8f6a5e278271339cc18d3fd8a00f3fb07a5dbb37e820209d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1387,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "304402210092cdaed3e4842b55745b13a84d4a67ee8fa4ec7c939f4a19425ed0c86bc36f9c021f5b52a0957ffcfceb4662fdd21af0846f4c877a37897b50f62ab344469d9e68",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "049894c2c5ae909bc9f69fdeb1a9c19966c09c63c8d7b82acb1a83d24651716f664939cb7769d74f2235ad0653e0d33114062ebd90478bf8e219d2cfa8ffffffff",
+        "wx" : "09894c2c5ae909bc9f69fdeb1a9c19966c09c63c8d7b82acb1a83d24651716f66",
+        "wy" : "4939cb7769d74f2235ad0653e0d33114062ebd90478bf8e219d2cfa8ffffffff"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010108034200049894c2c5ae909bc9f69fdeb1a9c19966c09c63c8d7b82acb1a83d24651716f664939cb7769d74f2235ad0653e0d33114062ebd90478bf8e219d2cfa8ffffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABJiUwsWukJvJ9p/esanBmWbAnGPI\n17gqyxqD0kZRcW9mSTnLd2nXTyI1rQZT4NMxFAYuvZBHi/jiGdLPqP////8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1388,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "304402205157cfa642e8d3b77536846a0ff6cadaea5f53974d7c55385e84592a37fbb258022071e17e0a1c84805b2e6760e2cff8eb9b396a09264905fddb8db1e2a7cb5221d7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1389,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "30440220615579b5fe86585ece10d0c1eaa2a30d5d4b23b2c8c2ba51ca83ea51a8f73b3602204441feacf132db44e5d9d74ef183bdf86d25f8f48f5abc8286e0dd2f9dc0d189",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1390,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3044022034e5d4ab1ba116d64a65b098b29cc7919c7de039f1e6c62a2ed3f1801c07263a022069d9d5eb218dbd58ae23d2653bdb80d92d8672e3c518a5529a574a94c0c9cce0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256t1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a9fb57db1931dcd62fd3601a5f197b62bae749d2f28f7b2d02b8a6376ae050a546ede758cc395813b28ccf2fb7ca4ff2ca36b963473248e001ef511aa61f2f1b",
+        "wx" : "0a9fb57db1931dcd62fd3601a5f197b62bae749d2f28f7b2d02b8a6376ae050a5",
+        "wy" : "46ede758cc395813b28ccf2fb7ca4ff2ca36b963473248e001ef511aa61f2f1b"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010803420004a9fb57db1931dcd62fd3601a5f197b62bae749d2f28f7b2d02b8a6376ae050a546ede758cc395813b28ccf2fb7ca4ff2ca36b963473248e001ef511aa61f2f1b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEIA0IABKn7V9sZMdzWL9NgGl8Ze2K650nS\n8o97LQK4pjdq4FClRu3nWMw5WBOyjM8vt8pP8so2uWNHMkjgAe9RGqYfLxs=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1391,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30450221009572dfd46d530875292df5c19f2b66f76d2ab5e8c859464fa36712309f804d0002204fb29d6df73504fabb2a11b42b3a65b6568a67c0b8442b48733392a80cfb9a69",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1392,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30450221008502979572eb037cc088e0b5d00e8ae8a9596fd2274be6170cefa44b7fb73432022071d740cbc4d99ac707c98138c2676b6ffabe050db7320b869f3f05d49a3a17e1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1393,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "304402206ad7e2ca670e0c7ff8c5c6f0b4fce230b04a729a11cbf003c8bce87955bc56c8022029719b165bac6822c9582830cd4b0c61e03bfcdc2750d950ed27330fdc81fe43",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04462117d2e33a7db1b95c8a6a3c7982f83da96817e749718caee7b6aa9c9da4e8f2ff7951674eed2b569ab846f59002a850e6606a9726a9209c9e945fbf6cbbc9a487c4a4d81c52ac3684c26c3392b9bd24f7184821be06f6448b24a8ffffffff",
+        "wx" : "462117d2e33a7db1b95c8a6a3c7982f83da96817e749718caee7b6aa9c9da4e8f2ff7951674eed2b569ab846f59002a8",
+        "wy" : "50e6606a9726a9209c9e945fbf6cbbc9a487c4a4d81c52ac3684c26c3392b9bd24f7184821be06f6448b24a8ffffffff"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004462117d2e33a7db1b95c8a6a3c7982f83da96817e749718caee7b6aa9c9da4e8f2ff7951674eed2b569ab846f59002a850e6606a9726a9209c9e945fbf6cbbc9a487c4a4d81c52ac3684c26c3392b9bd24f7184821be06f6448b24a8ffffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABEYhF9LjOn2xuVyKajx5gvg9qWgX\n50lxjK7ntqqcnaTo8v95UWdO7StWmrhG9ZACqFDmYGqXJqkgnJ6UX79su8mkh8Sk\n2BxSrDaEwmwzkrm9JPcYSCG+BvZEiySo/////w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1394,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3064023043a3ac2f3d2b4d3723a97930b023ee73010a7cf8d2a99372f3132bd7d9c83574de3ab86525efc4ee2c59799d5ff7efb4023034f59a3ea9f5267f8458afdaa3873e2336e0ab8a40ca1b797cbd977d192f2024f9eb8d39b37b9a238f208d66bacd27bf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1395,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "306402303531ada25b8d9af9b87e5224cd6a6d956c17dc323ef8980f497a6e7e44c83d69b74de791d62bceacaff7378863dd725b0230459d15539399409380af99d560c561217daa5c539729453067dd1aa4bd9df2b534920f0d6213261ecea16f0ed68536b1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1396,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "30640230438a0cff9fcfcf587f8c40775ad44ea4b0ed69f2d547befe295d1fb9c24ddcb97f228027df552a06bf657b4c2027261502305e157630bb744fc8e7f75901de498e5af0b5511dfeee0c4c1f2e5c4aa0129de57b87a2a13ea59d187d51cbeb6ef22407",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048cb91e81ee5901b71a59a4f7c8174ae05fe3ba00f699dcbc3c9233265c640587b3c165593c2d76b5ffc4b8dcbcb0e6553a0e5d14f2d0e8efe2bd8aa260d8ace06bf964c51bab8207070a2d30410bb6b87aeecb7fff802f2d4ea3caf6e0e7e726",
+        "wx" : "08cb91e81ee5901b71a59a4f7c8174ae05fe3ba00f699dcbc3c9233265c640587b3c165593c2d76b5ffc4b8dcbcb0e655",
+        "wy" : "3a0e5d14f2d0e8efe2bd8aa260d8ace06bf964c51bab8207070a2d30410bb6b87aeecb7fff802f2d4ea3caf6e0e7e726"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200048cb91e81ee5901b71a59a4f7c8174ae05fe3ba00f699dcbc3c9233265c640587b3c165593c2d76b5ffc4b8dcbcb0e6553a0e5d14f2d0e8efe2bd8aa260d8ace06bf964c51bab8207070a2d30410bb6b87aeecb7fff802f2d4ea3caf6e0e7e726",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABIy5HoHuWQG3Glmk98gXSuBf47oA\n9pncvDySMyZcZAWHs8FlWTwtdrX/xLjcvLDmVToOXRTy0Ojv4r2KomDYrOBr+WTF\nG6uCBwcKLTBBC7a4eu7Lf/+ALy1Oo8r24OfnJg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1397,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3064023016496c08c3076773fcd841a5e25e1a87108e0ba90f9727f539034bd2cf688e01a955686a15112e0590fc91e3995ff5f8023031b1b7338f74adba33712a83a7c685e7cd5f3be84ef951ecad50facb7c6ec393a3bac52ea7b1212bd92f4f45a9f8514c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1398,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "306602310087f3090292e79b722cde5aedafa4244f6eb460a280e2e050399b9d802391ad502108704a3c0bb9f9ae571c3f7dec6c0b02310089ae0043de38a585a1632c7211b78303afa3f8936154a6e65a6f729c3b1ec66a1775aa465af8eed6dfeaa5ba98cedb41",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1399,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30640230720822abefa91265a7b8d446ec3bc405fd192178aa1b85dd663396a896a32c119e64b1a20843f81edd43c03709b8dbc60230206ae95bb18d2d3844a39340872edba1611e3ea0e84cea7cb6cff282af414d8b5aa0be8aabc1b51b7121d426916b01b5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0469ebf332e1eb2455324a7572a17977a4e2955108ee8bd81bd6d1f555d608687f5bbb39858ebee304985baa7d09c830bb672b9c96684dfc007f015e39cdada9fe16db5022bfd173348caafc528684621f97fba24f2c30e3dc728772e800000000",
+        "wx" : "69ebf332e1eb2455324a7572a17977a4e2955108ee8bd81bd6d1f555d608687f5bbb39858ebee304985baa7d09c830bb",
+        "wy" : "672b9c96684dfc007f015e39cdada9fe16db5022bfd173348caafc528684621f97fba24f2c30e3dc728772e800000000"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000469ebf332e1eb2455324a7572a17977a4e2955108ee8bd81bd6d1f555d608687f5bbb39858ebee304985baa7d09c830bb672b9c96684dfc007f015e39cdada9fe16db5022bfd173348caafc528684621f97fba24f2c30e3dc728772e800000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGnr8zLh6yRVMkp1cqF5d6TilVEI\n7ovYG9bR9VXWCGh/W7s5hY6+4wSYW6p9Ccgwu2crnJZoTfwAfwFeOc2tqf4W21Ai\nv9FzNIyq/FKGhGIfl/uiTyww49xyh3LoAAAAAA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1400,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "306402301e5027fcc630aa08750a4725919dd9072422a21aca9d3326bec3e6ac040ba9784951b1fda6f588e60dcb550b75793a4e02300df3224641f6804f4d1bf951051e087ce1fa7365c43bd27878626833f09190cc0a7fa29b16bc2ca0d34fd0660d24718f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1401,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "306402304e61e34740a9f6db0854faf205719a3d98ef644b86241b858fa22959c04395578bef7be35036ae7a9ffeb9a2173311f402301e967c3b6071d37560fd64a4fe0921b1d600f60d883fdec816836176c5e67ad05182aa080c7e2184c0710050d523f0e2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1402,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "306402302c3090c581e575da58a8f659f74c5eee566400eb1d91de0a950e787542e6572f73b9f6d4f81f1c8e42f9e460dac3c1dc0230756b1b693e7fe06686708c2a609854accd21e3195d84b72c11c873908d175dfc00c00ebbdf8e2bb6970f2f19785303cc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044fb5688666673f104287428b5bae6bd82a5c69b523762aa739b24594a9a81297318df613f6b7379af47979ae7fffffff7e2d325b41fe831a23cb694cb80a30119c196143536ee334416ba437a419054c180a945154596b83d7f7c3a6b6059645",
+        "wx" : "4fb5688666673f104287428b5bae6bd82a5c69b523762aa739b24594a9a81297318df613f6b7379af47979ae7fffffff",
+        "wy" : "7e2d325b41fe831a23cb694cb80a30119c196143536ee334416ba437a419054c180a945154596b83d7f7c3a6b6059645"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200044fb5688666673f104287428b5bae6bd82a5c69b523762aa739b24594a9a81297318df613f6b7379af47979ae7fffffff7e2d325b41fe831a23cb694cb80a30119c196143536ee334416ba437a419054c180a945154596b83d7f7c3a6b6059645",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABE+1aIZmZz8QQodCi1uua9gqXGm1\nI3YqpzmyRZSpqBKXMY32E/a3N5r0eXmuf////34tMltB/oMaI8tpTLgKMBGcGWFD\nU27jNEFrpDekGQVMGAqUUVRZa4PX98OmtgWWRQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1403,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "30640230092f0ee1feeb79c054ae36235f8717e9ee72b466b1704d4fa78addfcd13518a64db2b2fdb06439acbc4c045fb2c23c3a02302371ca6d36f4266162ee5c657c71cea35dcec3632c5b220a6f23ace1ba6562a841aeeeefe87a7998adfaf185b8558e4a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1404,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "306402306c8f4be641afaf5bf91ce08974d284ece6aec74792247229fa86c6597eed3fb507b712bb77af0226e1bbb3bad632b0d80230775954fe8bf936157b7ab7a683f6dc1838a8718200621bc8bf2f32b778f6c8e8c656532b50de39ac22d22b37dccfd1f9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1405,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3064023076e5c07582177400df453114fed746f40704197897b4ca21b72e5b44d4ca40cfcaa55e4446355c91ea9767f38c8172df02300c6dd73eefbb4c06e823224d8efaa3ee934e4a97eed2833513b4d735ed06eb550b2a5fa7f86613d627d9db466afa6646",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384t1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048cb91e70c122d808515ce5383d1f753f95023a64adee7b7072bcbf43ffbdfdfb05060d6a8f5ea5022a6a0e6245190235599ea831aa5857a0a118d4871e8a86aee2965afbdcfe3fb50e5e7c94672a63672eaf26384ecfa8d7a78512d6a6c63d86",
+        "wx" : "08cb91e70c122d808515ce5383d1f753f95023a64adee7b7072bcbf43ffbdfdfb05060d6a8f5ea5022a6a0e6245190235",
+        "wy" : "599ea831aa5857a0a118d4871e8a86aee2965afbdcfe3fb50e5e7c94672a63672eaf26384ecfa8d7a78512d6a6c63d86"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010c036200048cb91e70c122d808515ce5383d1f753f95023a64adee7b7072bcbf43ffbdfdfb05060d6a8f5ea5022a6a0e6245190235599ea831aa5857a0a118d4871e8a86aee2965afbdcfe3fb50e5e7c94672a63672eaf26384ecfa8d7a78512d6a6c63d86",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQEMA2IABIy5HnDBItgIUVzlOD0fdT+VAjpk\nre57cHK8v0P/vf37BQYNao9epQIqag5iRRkCNVmeqDGqWFegoRjUhx6Khq7illr7\n3P4/tQ5efJRnKmNnLq8mOE7PqNenhRLWpsY9hg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1406,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30640230495c7d5f262ad770f5f223cbf80d0c9e256c41d19ba9ad251fcd958915434c56c7f60db2f269b8b6aa49ff7a0314f5b1023026248e930f04d06798f447ade60ac88439a7b1e2bd987c03b17ddd357c2482c06d81e0eec720ab5180fefcbf2a95d5a6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1407,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3064023059326ed88303d6dd31dd7b4c7e30337172ac4a9c3511c4805c2094374ddad15191bbdd3fe7a5e86a4fb9d0c46216492c023036dfedf341921afe9e3158b44a7db7ab370e2c43496a34d09fa88a4e8c8fb0ce8d933c08c39ea27503199e9a632d220c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1408,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "306402305c53e8fc75fd338f2e28bb886fa3c88b09395a66e8a4528de51375c211f0e1c7ee04134db06f6caed4265be691c43471023051ac815c377e6af03fe1de6db95ca6cbac16e8b3d0b6384f153a4f7952b64923683266d30038d1465e400d6345d513af",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384t1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04000000004ac5b59140cd6406050b0d813411a18e4a8449596b1fabd36fc49e4478117db2ea522ccaa43cc1beaa9a18a35fbf6dec1a4d2a8bc7b4c39ceeda7108068168a94e87161dfdd3040df9f6dae4d7eb5a88286d014c92cfe009902b3463",
+        "wx" : "4ac5b59140cd6406050b0d813411a18e4a8449596b1fabd36fc49e4478117db2ea522ccaa43cc1beaa9a18a3",
+        "wy" : "5fbf6dec1a4d2a8bc7b4c39ceeda7108068168a94e87161dfdd3040df9f6dae4d7eb5a88286d014c92cfe009902b3463"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010c03620004000000004ac5b59140cd6406050b0d813411a18e4a8449596b1fabd36fc49e4478117db2ea522ccaa43cc1beaa9a18a35fbf6dec1a4d2a8bc7b4c39ceeda7108068168a94e87161dfdd3040df9f6dae4d7eb5a88286d014c92cfe009902b3463",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQEMA2IABAAAAABKxbWRQM1kBgULDYE0EaGO\nSoRJWWsfq9NvxJ5EeBF9supSLMqkPMG+qpoYo1+/bewaTSqLx7TDnO7acQgGgWip\nTocWHf3TBA359trk1+taiChtAUySz+AJkCs0Yw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1409,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "306402300e971ffffd7b86a216cf2e8c2267ebfdbfffe33cc91a578abdb3b065a33829b1e85d77a83490bd862b484545373276e402301dee3a5b1021e5d7f2f6283be4c37749200089af3039847ee2d9d62abfe36144e6de9690714bd931535d73f872f5509b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1410,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "306402307080b70e60eb3bf5538555554ae8b135ec6378610e5fe1c9e3d1646b61ec28f51e7fe7ed9fb18717641e7debb90eb647023017d44cc60ef9d9d00f3672fb101f0e2d76a472d34181a607a13eb58756648ba0555dae6acb357d3cd5e30e7758884d42",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1411,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "30640230210674f82d8731467e9893c007733971740837ceb78ee1a957e799c3309f27da768331262df94293f84b85fb00a70c730230686be0240ac527f1560e6d9c20af7b755be421c30ec3dae94bb2d01d7b0af2894c96a5ba181ab2d92b9f18db2d6dd28e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384t1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0449967ad412be2ee1d435ce6261ff127250085e1903e04c0388ff9c1a35e12536e31a2f8fefe2194cdf1e9bb800000000245148c105c664988179a8c2e68418dea078f90682ea06b51d89cc93173fb8a991ecca52805d97ac89f66855a593fbb4",
+        "wx" : "49967ad412be2ee1d435ce6261ff127250085e1903e04c0388ff9c1a35e12536e31a2f8fefe2194cdf1e9bb800000000",
+        "wy" : "245148c105c664988179a8c2e68418dea078f90682ea06b51d89cc93173fb8a991ecca52805d97ac89f66855a593fbb4"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010c0362000449967ad412be2ee1d435ce6261ff127250085e1903e04c0388ff9c1a35e12536e31a2f8fefe2194cdf1e9bb800000000245148c105c664988179a8c2e68418dea078f90682ea06b51d89cc93173fb8a991ecca52805d97ac89f66855a593fbb4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQEMA2IABEmWetQSvi7h1DXOYmH/EnJQCF4Z\nA+BMA4j/nBo14SU24xovj+/iGUzfHpu4AAAAACRRSMEFxmSYgXmowuaEGN6gePkG\nguoGtR2JzJMXP7ipkezKUoBdl6yJ9mhVpZP7tA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1412,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3064023064aa82bf225050a63cf16424ccccd0f16d5939d73479d33db3d7f0517a750cdfc01e37354502ffcb1c4956c2c7c7fa3e02305e8101692c6eb55767734839efe43da943cb69d7b3ce9ea0d4aef6892cb244883997ec10f368e295ef080ef9b078d0d3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1413,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "306402302d106908a50b6e5ba59d6074a2e940dcfeb73c5ba1c5464ab9ff6c805d23f46464978116c68199d1a8ac63d8b823368d02307b8cc56036a62d9a26322a413a1a183f1bb2d795789fab72a45f4121b35796e1e3a592e1c62f2c4d070e9bee85bce70f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1414,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "30640230180bea728d39c32579141a215e0256d2b8e0fcc1d2b73135a71cc484d9c8fb666644fe3c14ff11affe135e02c72647c2023042ccc524b7109bfef81604adb1893d1531b65c497560daa941f18a0dbd200ddf79743168011c0c6856f2a456e46c57da",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384t1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0433a02b38ab0869360416d68a1cb9d1e5e3fc37e539b7f562f4ce359d7504a5f551a98cd78812fad80b717df3f7de92510c66e185b7d57726984fe09e8ec885554d84faf51284fd839af4e59fc704c3f37626491d98a48350f41a50dfffffffff",
+        "wx" : "33a02b38ab0869360416d68a1cb9d1e5e3fc37e539b7f562f4ce359d7504a5f551a98cd78812fad80b717df3f7de9251",
+        "wy" : "0c66e185b7d57726984fe09e8ec885554d84faf51284fd839af4e59fc704c3f37626491d98a48350f41a50dfffffffff"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010c0362000433a02b38ab0869360416d68a1cb9d1e5e3fc37e539b7f562f4ce359d7504a5f551a98cd78812fad80b717df3f7de92510c66e185b7d57726984fe09e8ec885554d84faf51284fd839af4e59fc704c3f37626491d98a48350f41a50dfffffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQEMA2IABDOgKzirCGk2BBbWihy50eXj/Dfl\nObf1YvTONZ11BKX1UamM14gS+tgLcX3z996SUQxm4YW31XcmmE/gno7IhVVNhPr1\nEoT9g5r05Z/HBMPzdiZJHZikg1D0GlDf/////w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1415,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "30640230577b89e7eb4e0c11d3ddc8273fdcab2583a0c8908acb3c92a41073c1b4879cb6bd09825e345917d10e9a10c57127a096023033c568e1ff376a2b6c49e495385de655d667b8402d73fc02e9db61d42b4920bd0c3f0c88a1c3091ab5b9970bdaa1d39c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1416,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "306402306bb794738248b375c9f5c6a5e67c04053979b1f096a97a54710da3674a6af23295256c660a6e0949be8c69c9e0af1c9a023016f454f290edac489680bc8bcacabfbff9d0d29dd11c7c003e97c056cca9cd2b5033692b766fd20d8ce0a4b0dfc417a4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1417,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3064023071dad8b09ea0c67eaa79b937cb4fc54c7280779f37dfe293756327b9bdf3bbad9a51613dbfde19496d620e15e2bf8fda023016db51fa414c9f13e2c7965e3315cda2fbd64f95b0c88d3b2aa48811727af7cdd70eee7700dbf4ea3c9c84e6284387be",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384t1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047fa73b521e19cd2b08e7127f5a31309089ecb3628c7e341a977cfc4bf445ab151010602becf720dc41aebb86900870de4f3b7dd19ac8970f116996b0d48dc20d69d784e8502284701ef653300993e158c8b82fc5a4664a8ec28a03c400000000",
+        "wx" : "7fa73b521e19cd2b08e7127f5a31309089ecb3628c7e341a977cfc4bf445ab151010602becf720dc41aebb86900870de",
+        "wy" : "4f3b7dd19ac8970f116996b0d48dc20d69d784e8502284701ef653300993e158c8b82fc5a4664a8ec28a03c400000000"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010c036200047fa73b521e19cd2b08e7127f5a31309089ecb3628c7e341a977cfc4bf445ab151010602becf720dc41aebb86900870de4f3b7dd19ac8970f116996b0d48dc20d69d784e8502284701ef653300993e158c8b82fc5a4664a8ec28a03c400000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQEMA2IABH+nO1IeGc0rCOcSf1oxMJCJ7LNi\njH40Gpd8/Ev0RasVEBBgK+z3INxBrruGkAhw3k87fdGayJcPEWmWsNSNwg1p14To\nUCKEcB72UzAJk+FYyLgvxaRmSo7CigPEAAAAAA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1418,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "306402300e0e11e2cf805a3054db77fd49a9456ccf22f5948a9a02e6474a5a89dd394d3c89a46b16dcad39f67b33be149f75b8e30230719ace8887143d8f0f4c1e478de836fe78dc71d14ea234fddd47bbfcdd77fb44c77b49c6c4b048d05be953713a480db2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1419,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "306402305e4f0e8f833a1e50cf46495d4594c37894a21ec8164dfde3a05c9682698620746b42988fdeec9bdae3e961121e5ea0b1023077eba3e704bf9635b5750ffec2ee8d39681c762d21278465828ab0f574935448cff6575b8d699406407874864f87ad9f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1420,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3064023008c4664a036a5d4f5b7b9a365656db0c786246ac7b992bfac53cf2f31e9fc738698596db4ea385f7bab978b4f1ed02b2023063eb0c4d629d01f1fe9133d64440cda717cac4e16ac1ceeebe10b8c38d3ccc0b2bd75918e4c995d2c525c77591681804",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384t1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043dc23704ba8346fee7028a863e3e1c201ac5e5c1f0a0bd8ad967d3fe8c8e4b8d6b5f92449e3378218862f261d09f6fd833c942cd24af05e473097248db981d009c69e53ea9b5f3f4ecba0d6f4d24317caedb6917f4ca9f8e9bf0e82800000000",
+        "wx" : "3dc23704ba8346fee7028a863e3e1c201ac5e5c1f0a0bd8ad967d3fe8c8e4b8d6b5f92449e3378218862f261d09f6fd8",
+        "wy" : "33c942cd24af05e473097248db981d009c69e53ea9b5f3f4ecba0d6f4d24317caedb6917f4ca9f8e9bf0e82800000000"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010c036200043dc23704ba8346fee7028a863e3e1c201ac5e5c1f0a0bd8ad967d3fe8c8e4b8d6b5f92449e3378218862f261d09f6fd833c942cd24af05e473097248db981d009c69e53ea9b5f3f4ecba0d6f4d24317caedb6917f4ca9f8e9bf0e82800000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQEMA2IABD3CNwS6g0b+5wKKhj4+HCAaxeXB\n8KC9itln0/6MjkuNa1+SRJ4zeCGIYvJh0J9v2DPJQs0krwXkcwlySNuYHQCcaeU+\nqbXz9Oy6DW9NJDF8rttpF/TKn46b8OgoAAAAAA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1421,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "30640230064db827c2b97c16fce0d952513bb687c26451db1c6b1e82010f6901fdd1709e83d0efcc5b33eae5f490c6604e8e172f023054aed930e8300a82efe2609ccb030b82c7991a7db261fd60e3c9097be13341909ec3492a3803cda07cb2d1838946d191",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1422,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3064023008d8ba04dc844a5ef30f632c7ca47ebe2ac75b86a821b8b6b5b699a5cbe42382f0b92703af6042205f80ddf23d27e97102300a33ca44c7b65eaf5cc81af23de282c562307980e31a1e6ee632a6141d7714394241d90869e2c9592423106abf2a35b1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1423,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3064023024e40d5ef670018c0ce690fc15042156b0e39a057d2eb76c91d8119cc3982136118f4eee76403eac13b89cb9bdb0020002301aa24023e2e12ebed8146f3c4f1ecdfb24eca3bff085cd6c654cb52f33e368a073e27a9912f4509a27c84913b85fc7e0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0430a67deaaf0cee44aaeb903d8cdb24ad9dc191d375d7d6a60d2520e19306cfc47dde9dcb80aae0b040554bb98d601e019f9336e831cccb99f2d92cf4b91604b1000000001a4b00c74a5a61ac196faf4dc39acd41bf354def0a27529964359132a76f28654248d1ac004d11d811aba0acb9c26d2f4a54012c5d8a9a1e7c8b4a52",
+        "wx" : "30a67deaaf0cee44aaeb903d8cdb24ad9dc191d375d7d6a60d2520e19306cfc47dde9dcb80aae0b040554bb98d601e019f9336e831cccb99f2d92cf4b91604b1",
+        "wy" : "1a4b00c74a5a61ac196faf4dc39acd41bf354def0a27529964359132a76f28654248d1ac004d11d811aba0acb9c26d2f4a54012c5d8a9a1e7c8b4a52"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000430a67deaaf0cee44aaeb903d8cdb24ad9dc191d375d7d6a60d2520e19306cfc47dde9dcb80aae0b040554bb98d601e019f9336e831cccb99f2d92cf4b91604b1000000001a4b00c74a5a61ac196faf4dc39acd41bf354def0a27529964359132a76f28654248d1ac004d11d811aba0acb9c26d2f4a54012c5d8a9a1e7c8b4a52",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEMKZ96q8M7kSq65A9jNskrZ3B\nkdN119amDSUg4ZMGz8R93p3LgKrgsEBVS7mNYB4Bn5M26DHMy5ny2Sz0uRYEsQAA\nAAAaSwDHSlphrBlvr03Dms1BvzVN7wonUplkNZEyp28oZUJI0awATRHYEaugrLnC\nbS9KVAEsXYqaHnyLSlI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1424,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3081850240479ce8458b04b2dc127b46971e6c79831bf788f65ddc770620daaa15583f8d506f2a6652d82b38560ec1977586e11929b666f6d7012d816fd356d41e9304d60f024100a750f73ccaeff5d994067e66e45c200892c607b329be5e64db5c383c7be711c97b5dd425a52250bc862477e28b3afa4ef3d831066a7b143432a5d15403021457",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1425,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "3081840240685b8b2929c9a0a9b0deb6baefd00e26f50d4c1fc3fed47d7ef812c52b66ec6f6d09f54e9bdb7202016570f75bb9912aab3a572bfb97ea589ace294ff0fe666202404c286267cb87a6be56f4cd0080398c23e569f2ebda71d2cd1682080290deb4143bdc61e75b42abefbcbbddf4c794545a05378656a1858658e0a4595833fc40f6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1426,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "308186024100811112d27ca1e434b00c0293320284b1c5369fd007f90e7a99d44c9c02013688d16e5e0a2fc3a077064a995c4244195c04f00323e33adea6b37701ad5cb3621602410082dd5c3e3642fc43e5c4c652e3b2d00f6d137207be8c9b2125561c08703e4a84d2a82785f775abd18aab24e52f12c5f8cb56b28b915f9c0b1110c542ba92b313",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0430a67deaaf0cee44aaeb903d8cdb24ad9dc191d375d7d6a60d2520e19306cfc47dde9dcb80aae0b040554bb98d601e019f9336e831cccb99f2d92cf4b91604b1aadd9db8c19ec3c3f57a85021a5a4cba0795c071f494841fcc3c4a310bfd773ed5de729b597d9696ae808f52d4f7e0396ebf91ffe32ec558cb1fc637dbaefea1",
+        "wx" : "30a67deaaf0cee44aaeb903d8cdb24ad9dc191d375d7d6a60d2520e19306cfc47dde9dcb80aae0b040554bb98d601e019f9336e831cccb99f2d92cf4b91604b1",
+        "wy" : "0aadd9db8c19ec3c3f57a85021a5a4cba0795c071f494841fcc3c4a310bfd773ed5de729b597d9696ae808f52d4f7e0396ebf91ffe32ec558cb1fc637dbaefea1"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000430a67deaaf0cee44aaeb903d8cdb24ad9dc191d375d7d6a60d2520e19306cfc47dde9dcb80aae0b040554bb98d601e019f9336e831cccb99f2d92cf4b91604b1aadd9db8c19ec3c3f57a85021a5a4cba0795c071f494841fcc3c4a310bfd773ed5de729b597d9696ae808f52d4f7e0396ebf91ffe32ec558cb1fc637dbaefea1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEMKZ96q8M7kSq65A9jNskrZ3B\nkdN119amDSUg4ZMGz8R93p3LgKrgsEBVS7mNYB4Bn5M26DHMy5ny2Sz0uRYEsard\nnbjBnsPD9XqFAhpaTLoHlcBx9JSEH8w8SjEL/Xc+1d5ym1l9lpaugI9S1PfgOW6/\nkf/jLsVYyx/GN9uu/qE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1427,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "308184024039d0c5c4e48ca14064b2e9b3600deb0ec2fb3e0c65b3be5ce3f206166d76dfc5a5f6ea8702da3aecb13e7b55a87b1263c4884611e5de440f6c89ed12f88ae50f02406ae78398e7f942b35e7d87ef27ce830690f7327ad2a83df56e9d0288b51999454bd90f895e7849f35b2a652a3af97bf55795b4698e0b014ea6ff021a00878f3c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1428,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30818402407c3ab2e3deafb823ee591dc53c97b389c6d18a8ca9a6ae20c74328606db2d7c7d2bb3ce26894e3f30785237b9e874350d615786381b0c8c420224d2f5e359468024034e703dd939b2b1a200872334e2f864dbf26688f8475c9e38a384102e08a18c27d4e30d802095fff3edda6dc1e03aa81aed96719cb49612471fa118875a15c18",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1429,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30818502404cd8a5f1977a3cf8e847a1377359cca7046c793ada0665f2c06908fdcec24e6cd55a1750ca576421b8a65aa99aed863cdaaa77d7f7cf84448ea58e95c57a133c024100a340572d5d9683e72e157e683ab16d0e2a35030ff3e1641d1b4f801d80732c32b9fbb53fdcaea933f131136f8ab25311018b871f53753782989a87ef231a38ac",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04aadd9db8bb4189a6d2ab7b5aae550fe8dc00be2e00f4b35b576d6f862c09869210fc82fbd15a54def1442979fa0da1c64408fd8437a60046930820748ecdfc664a59a87eae338d22d0835523156f8f7d934710a747cf192d3e317bc45f0489d6979887c65ec17ab7b5e3da9f4cb110116ef0739849acc56d24e5a3365fcfb289",
+        "wx" : "0aadd9db8bb4189a6d2ab7b5aae550fe8dc00be2e00f4b35b576d6f862c09869210fc82fbd15a54def1442979fa0da1c64408fd8437a60046930820748ecdfc66",
+        "wy" : "4a59a87eae338d22d0835523156f8f7d934710a747cf192d3e317bc45f0489d6979887c65ec17ab7b5e3da9f4cb110116ef0739849acc56d24e5a3365fcfb289"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004aadd9db8bb4189a6d2ab7b5aae550fe8dc00be2e00f4b35b576d6f862c09869210fc82fbd15a54def1442979fa0da1c64408fd8437a60046930820748ecdfc664a59a87eae338d22d0835523156f8f7d934710a747cf192d3e317bc45f0489d6979887c65ec17ab7b5e3da9f4cb110116ef0739849acc56d24e5a3365fcfb289",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEqt2duLtBiabSq3tarlUP6NwA\nvi4A9LNbV21vhiwJhpIQ/IL70VpU3vFEKXn6DaHGRAj9hDemAEaTCCB0js38ZkpZ\nqH6uM40i0INVIxVvj32TRxCnR88ZLT4xe8RfBInWl5iHxl7Bere149qfTLEQEW7w\nc5hJrMVtJOWjNl/Psok=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1430,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "308184024053192c28820ec266639fee09e214a55cc0efb07b22dc0d3f293bda2072fcf9b462da93ec9e7169ae1f1148705189f7f15d2cbec46d224197a3a7a924b0c00a3202401b664536aedbdc97bed4dee23eb94a49f23de3bd84a78f299e81edfe017a7d3ca3a7c8aace8d13b6b2eb477b922c439839eacdff2783070757754863582f715d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1431,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "308185024100969058c15d675b1b262152a4520f7e803ab465a9e1eeef7b8a5d0fb3e88032b8e8f1be9f37c80f9c7b950f4da950baae9b216ecd6c793ddb1459cfdf49776bae024020e0d078a5a113e92facdfe5cb39243247254aa0a656b83e7baa343d36f7b14b86f15e54b71ba7506d5119ff52c47e0ee549927a008cbf2bbfe1916d1cc274b2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1432,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "30818402401de5df621364436bed5cacf8dbe420e4e4e5d1b0434fcf9dc335645dd0aa07cc1d1ea30a8cafe2531cd4035dd972c0d6c3720f160e24264fd6c41521e44eb0cb024072e9abd54561bac89b234bf9e51a3f6003590af177098e25f0053a3ae18a6c74b389674a6eb80378ffd255cfe52323645cdfe9a10a965341b4e47fc0dd082e1e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0424c10440e37a15d7ec9a3a48965a9ce9380221fc51155f1e992716cd9933d09ce0a5424471877e8994494a4c2ade0a81ef52952e395655157f0b743b3b219e2d628fd5ba510f610ee693a1e0d39ef39d91a6248379c622a175a23a5330a88b2d5a60dbf6d249702cd1504561535ea17e1be1b70a41dc463e8e1a1af000000000",
+        "wx" : "24c10440e37a15d7ec9a3a48965a9ce9380221fc51155f1e992716cd9933d09ce0a5424471877e8994494a4c2ade0a81ef52952e395655157f0b743b3b219e2d",
+        "wy" : "628fd5ba510f610ee693a1e0d39ef39d91a6248379c622a175a23a5330a88b2d5a60dbf6d249702cd1504561535ea17e1be1b70a41dc463e8e1a1af000000000"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000424c10440e37a15d7ec9a3a48965a9ce9380221fc51155f1e992716cd9933d09ce0a5424471877e8994494a4c2ade0a81ef52952e395655157f0b743b3b219e2d628fd5ba510f610ee693a1e0d39ef39d91a6248379c622a175a23a5330a88b2d5a60dbf6d249702cd1504561535ea17e1be1b70a41dc463e8e1a1af000000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEJMEEQON6FdfsmjpIllqc6TgC\nIfxRFV8emScWzZkz0JzgpUJEcYd+iZRJSkwq3gqB71KVLjlWVRV/C3Q7OyGeLWKP\n1bpRD2EO5pOh4NOe852RpiSDecYioXWiOlMwqIstWmDb9tJJcCzRUEVhU16hfhvh\ntwpB3EY+jhoa8AAAAAA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1433,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3081840240422fb18cdec966937145b0f160b8ce222b0ba16fab075e16f1dac839b8d7772fee27a283ad722225bebe83db2d5a8b25cb2cbe45248b3aa876554c6a37f8137502407a3889d53bb42a6d41f393eb00c43623937029d4cc1d367469f6ea4ec16658619d2935de0a655adae4cbb624f2ffe3ce41f024269d9149dbd83cb1c97aed41b8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1434,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3081850241009836ee7ae0447ec07a6a216633e0a97de831fa04fcd760abe39e8f457796fdfce9c69ed13c827de0ca6b60d849ed6976ac091b7d90ce3e98d3c9144afe638d4202401c9d8e142baee857d6adec8eff84ea1d23b05f5482cc2950451586cf5de0cbf9e3a727a4a4e93e15b6cc0125e5fcd1910636898064a63813a0c75fee28041b88",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1435,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "30818402400877d7a3ffacf4ef36cbedfd44e4cc0237bdeede8ce0bdfb330bb73b317b7d161c45bd1496e1233ced8f7dcfd05e0e1cc665fb1dc92b54fcbe9b0e55d9ba1be402400f7ab871742ebf22e0b7674614d71569d5084ccc0c98c2e40d088ae88eab37820a89a2dbe49e1b67ec55ae1a34fe4822d691bbf5490fcc2c47e7c1ba4dc56e7a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040ba18cc05572424a7a391f4b48258a871a0f6d8216c5cf82446c2d156d5586b4c196da0b2f3a23511b89eff31dd4f0c88dbb1a76c5e4b27c4276f8fbc74a1b9da28cc8c341ea2e3908ae6ab6825f956032c53e625697f80b7b4ee72dcc9f3cff730349e0d30de410917f3d0d1c8988562c1d55583b47f0dec234fda2ffffffff",
+        "wx" : "0ba18cc05572424a7a391f4b48258a871a0f6d8216c5cf82446c2d156d5586b4c196da0b2f3a23511b89eff31dd4f0c88dbb1a76c5e4b27c4276f8fbc74a1b9d",
+        "wy" : "0a28cc8c341ea2e3908ae6ab6825f956032c53e625697f80b7b4ee72dcc9f3cff730349e0d30de410917f3d0d1c8988562c1d55583b47f0dec234fda2ffffffff"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040ba18cc05572424a7a391f4b48258a871a0f6d8216c5cf82446c2d156d5586b4c196da0b2f3a23511b89eff31dd4f0c88dbb1a76c5e4b27c4276f8fbc74a1b9da28cc8c341ea2e3908ae6ab6825f956032c53e625697f80b7b4ee72dcc9f3cff730349e0d30de410917f3d0d1c8988562c1d55583b47f0dec234fda2ffffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEC6GMwFVyQkp6OR9LSCWKhxoP\nbYIWxc+CRGwtFW1VhrTBltoLLzojURuJ7/Md1PDIjbsadsXksnxCdvj7x0obnaKM\nyMNB6i45CK5qtoJflWAyxT5iVpf4C3tO5y3Mnzz/cwNJ4NMN5BCRfz0NHImIViwd\nVVg7R/DewjT9ov////8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1436,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "308186024100a7322046ba7473716d35742d961ac5f2fe2e1dd574ece7bd15da8c66a262b2e79b0d1df27619fdebbb41da1b27ba7c9a0370ef962ee8a45105f4416d16ebf13e0241008418e445db45cfbdc8458055386d65e9bc07b497b8d4bef5f515e7947050d9ab9799fb520f322bf00fae4fae03c1269510ebb3e1dc8cca59298e26945862e9e6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1437,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "30818402401bb460ac42bb3640bfc739a0186ef3362ed27b254f548c073935caa211a1aa302e79a9466d7fece774d250c1aeaef9641b9a2f25e61ca37fada8ee07f49fd51e02403d918a07a36f578da8b0d42d30bad60ecfbd603a45d0c1a71bb01447ead81a5313265cc9b5860aba03f1c93a9cb9f3bdd9a85f270dd3691465941d2b8098f93c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1438,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "30818402405b44e4fd4996f27a7dcf306bc9fff4a9c36e3fe09026fa72122b64a4ff65f861a5954ce8a41f69a3915c84a63db0c57c6dfecbac4fde99ea5fcb104d6967d6130240088e7b846d6c5e093a7ba17427bcba0e925acb826e4e9b972b2d8a6d232f635cbe96bf6f163174db646c2f6623c89dc6e4a828d4e2e2fcf3c427c42bdb72efb7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047f3327e34662274aa147953a007f30c2ee1b06d7bb053e8ce1c9b683f0f46563dd38db071d87433b30380434c92e8cb76d603d1936fba1e9317a06e20000000052ca478f0367ab24857e788576f17bfcd05e62d20d0fbefd1b2d954b996eaba67819023635e31483f5b0257f89b46a1d2b9cb2420e1cdb940ceaff5429dd8013",
+        "wx" : "7f3327e34662274aa147953a007f30c2ee1b06d7bb053e8ce1c9b683f0f46563dd38db071d87433b30380434c92e8cb76d603d1936fba1e9317a06e200000000",
+        "wy" : "52ca478f0367ab24857e788576f17bfcd05e62d20d0fbefd1b2d954b996eaba67819023635e31483f5b0257f89b46a1d2b9cb2420e1cdb940ceaff5429dd8013"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200047f3327e34662274aa147953a007f30c2ee1b06d7bb053e8ce1c9b683f0f46563dd38db071d87433b30380434c92e8cb76d603d1936fba1e9317a06e20000000052ca478f0367ab24857e788576f17bfcd05e62d20d0fbefd1b2d954b996eaba67819023635e31483f5b0257f89b46a1d2b9cb2420e1cdb940ceaff5429dd8013",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEfzMn40ZiJ0qhR5U6AH8wwu4b\nBte7BT6M4cm2g/D0ZWPdONsHHYdDOzA4BDTJLoy3bWA9GTb7oekxegbiAAAAAFLK\nR48DZ6skhX54hXbxe/zQXmLSDQ++/RstlUuZbqumeBkCNjXjFIP1sCV/ibRqHSuc\nskIOHNuUDOr/VCndgBM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1439,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "308184024073967eb24e20f0d4ba58895a49f812c28d24e5f0fd5e35f1075810a478d93717c8aa2605ac84226dd3d53c39c0d8c52eeac8e998bad931f5efdd664b57cee555024005b0031fb10dfc7c36ed89aafe66444835cd9c53e1c850af5f055e2b263d3e737a4e6a83cadb9d76dde535e809f447455324d4aee6f036485d4167a6e60eeda5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1440,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3081850240633f456914707923f4b0086ea318b8cebdba5fa14352e3d9c606bd8dabf032835bbda76aa514c1a6dde1b321803d27f253dfe1cae532a5bdcd9e93e5f94596d10241009b9c8ba074deeb03745d8ae37c73e02273071a35dcfe0f65e463e208bd11c6ccb3aded6be7313d7a656d5e871b8ea4d1d51b778467b6dde6578e105d56b617d4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1441,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "308184024040891a57b9b8f0bc6a8761d2424cb60b3f39de4e601bc8daf15ab3216c2c56ebcc760de30907e89294af5818f5a72a2df409bb6918f3d6e506ce5314602e50c1024068620756ee2a600a1467f29608ead019d0d516b79c8a756fc537a9fc734616bfec133839beb4778fdffd3fb4226e51ce4bc09627331c8daef1f711648a30fb06",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0412482f158e62e83467297b4edad930ad319048283f0949300605a4a2d19f72f924d41e1cc3ad2c246574f4a0eb637cdd386c1ebf4a00707b71a646dcffffffff18d851ef92835f7be92a25b988ae8d5f7ed42f312f7c896850a589f7bb7500330d138cc20dc5630a7d525926e8f717635ee72937035736ace88f0c491f31930d",
+        "wx" : "12482f158e62e83467297b4edad930ad319048283f0949300605a4a2d19f72f924d41e1cc3ad2c246574f4a0eb637cdd386c1ebf4a00707b71a646dcffffffff",
+        "wy" : "18d851ef92835f7be92a25b988ae8d5f7ed42f312f7c896850a589f7bb7500330d138cc20dc5630a7d525926e8f717635ee72937035736ace88f0c491f31930d"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d038182000412482f158e62e83467297b4edad930ad319048283f0949300605a4a2d19f72f924d41e1cc3ad2c246574f4a0eb637cdd386c1ebf4a00707b71a646dcffffffff18d851ef92835f7be92a25b988ae8d5f7ed42f312f7c896850a589f7bb7500330d138cc20dc5630a7d525926e8f717635ee72937035736ace88f0c491f31930d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEEkgvFY5i6DRnKXtO2tkwrTGQ\nSCg/CUkwBgWkotGfcvkk1B4cw60sJGV09KDrY3zdOGwev0oAcHtxpkbc/////xjY\nUe+Sg1976SoluYiujV9+1C8xL3yJaFClife7dQAzDROMwg3FYwp9Ulkm6PcXY17n\nKTcDVzas6I8MSR8xkw0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1442,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "30818402404debd0683028f2335b233c49531b6096e7c5521f75fcb4b5f5e32241be081f3c2b8549b57f31217be9b7aa1a4687a72ec9a5d376307252ca7c1b9b610d25b4d0024004d1303f6b91ac01c91411a983f3abb04f3698b169f8a39ffd1931c061e66f43482fec795dfd0d0abe879fa8db885b618aca2ae013e693f154bb9d0a77adef4f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1443,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "308184024034ac9a4e6fb171f424bb592d1b845bee55173b42422fd5b5132f859a27ddcda5532fd38116e6277d9375639fb25b0f66f1e8a1accaa7800c91c87e7439987d58024075892be8e11d9bf3e81e8370af02d88bda83ce0ae9c21aeb487eef4c4c5458e51a99e4d788db84064cfbc48240f56612078769fde0e3b706125f46e2f26a3508",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1444,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "308184024036b68b5cad7428803f606615505857aa7cfb683d1e9ce856d499fa6e13ee6a4f235edd00403429ff14bc578dd121fd256004794add4fb8195b43a9e1eefbd3a1024045c6affd607f5424a0e49c0f1a72ebf7948a80b482ef171ee161dc36515679e32fa9edaa92c57403e6e102643b77391aedeec2b054964315dedd4cc369f23f03",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512t1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042998e0959e62bbed075dad4830ff74a33d199c6e29beb5ba518c6c4105e1b413ab78f730e1fc32e94f1a2c15931625c6b2150db2a12b5b44da15845068fab40f000000005d9bf2e4367c381dab13e026a1db8ba70f04268779ac786983d697461f0c7e526aaf03001b168cb47911cec4439d139ce2bdc3cb2f6f7ce51001de6e",
+        "wx" : "2998e0959e62bbed075dad4830ff74a33d199c6e29beb5ba518c6c4105e1b413ab78f730e1fc32e94f1a2c15931625c6b2150db2a12b5b44da15845068fab40f",
+        "wy" : "5d9bf2e4367c381dab13e026a1db8ba70f04268779ac786983d697461f0c7e526aaf03001b168cb47911cec4439d139ce2bdc3cb2f6f7ce51001de6e"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010e03818200042998e0959e62bbed075dad4830ff74a33d199c6e29beb5ba518c6c4105e1b413ab78f730e1fc32e94f1a2c15931625c6b2150db2a12b5b44da15845068fab40f000000005d9bf2e4367c381dab13e026a1db8ba70f04268779ac786983d697461f0c7e526aaf03001b168cb47911cec4439d139ce2bdc3cb2f6f7ce51001de6e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDgOBggAEKZjglZ5iu+0HXa1IMP90oz0Z\nnG4pvrW6UYxsQQXhtBOrePcw4fwy6U8aLBWTFiXGshUNsqErW0TaFYRQaPq0DwAA\nAABdm/LkNnw4HasT4Cah24unDwQmh3mseGmD1pdGHwx+UmqvAwAbFoy0eRHOxEOd\nE5zivcPLL2985RAB3m4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1445,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "30818402402eaf57807294e50728a87468381a4499b336af045d534cf0854ccf80178d53a379585ff06b3db31174e101dce81c757a8cc3c4033231baf3e8d4c5c4bd35984b024060d445cccc506abdae5a7d42c2d22cf03fc2e8f6717668308fb5cf8e10176d1c723e4682f942ff13ef832ad51329076f4c628b4f6263f519bcaf0d915692a24d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1446,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "30818402400ae7a5f9bef3bc570b1bfc218f6ee071855d86c8aba36504dc0c480d857059dce2cf937506716075cd8045fae969309585f62ad34135c64dd6f9c18705df0db1024069f2473a71eca7222b27c5bd600c1b1c2a8b9afb3b063ae49d5b4a090ecfc76179f041b39dafa491b391ee79b5d24fc1210e5d8d135cb1fda891ec7b806af31f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1447,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "30818402404a2942579bed39477d56cec8d7e8f029e93ded04bed5ec727180efab14212f88530fb4bd92d99202ac966c6d75d8c1f1bef5d13e14973ac49f32e70643a83c670240632f647f8c256a6ff572c0885d20e9dd309d26c96cc7392649ca1a1dd5c638358626705850f7768542f53a50a63c191b2d86e00ee2b3233df5c0bddcff272bad",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512t1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042998e0959e62bbed075dad4830ff74a33d199c6e29beb5ba518c6c4105e1b413ab78f730e1fc32e94f1a2c15931625c6b2150db2a12b5b44da15845068fab40faadd9db87e4dd1a70958ae9088b61be12955020ca4c5ab875cb72460ec5c712b5e411cae3117654293b714766d91b221e4e4eb924ac502b9f93ae37148386a85",
+        "wx" : "2998e0959e62bbed075dad4830ff74a33d199c6e29beb5ba518c6c4105e1b413ab78f730e1fc32e94f1a2c15931625c6b2150db2a12b5b44da15845068fab40f",
+        "wy" : "0aadd9db87e4dd1a70958ae9088b61be12955020ca4c5ab875cb72460ec5c712b5e411cae3117654293b714766d91b221e4e4eb924ac502b9f93ae37148386a85"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010e03818200042998e0959e62bbed075dad4830ff74a33d199c6e29beb5ba518c6c4105e1b413ab78f730e1fc32e94f1a2c15931625c6b2150db2a12b5b44da15845068fab40faadd9db87e4dd1a70958ae9088b61be12955020ca4c5ab875cb72460ec5c712b5e411cae3117654293b714766d91b221e4e4eb924ac502b9f93ae37148386a85",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDgOBggAEKZjglZ5iu+0HXa1IMP90oz0Z\nnG4pvrW6UYxsQQXhtBOrePcw4fwy6U8aLBWTFiXGshUNsqErW0TaFYRQaPq0D6rd\nnbh+TdGnCViukIi2G+EpVQIMpMWrh1y3JGDsXHErXkEcrjEXZUKTtxR2bZGyIeTk\n65JKxQK5+TrjcUg4aoU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1448,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "3081850240113619a3231e670e22c557ce2cdd030b7e32d9abd069db7304c31e2a1e54aa9986a44124b40d5fb50a8fa1cafcdbf6f1454753203819d0d269579b138fc7b63b024100989982ebc17f27cbcdf17d04e994c829b013305c6faa48b10cff5e9118d6368d7a4f276cd1c92200a17eb6a2b9309f75d9f5df58b68e876082720468ef63fa48",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1449,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "308183023f558cf186f501179e19d8606bad39e84f14239dcf6993ae850f42759a13eb7cad5eae697ed25ec2ee18b77c3ef7ef09c06cab159a82f18ddccaf1063c83cd220240660292d1bcf9d6fd1d1b66eae49cde4da7710e9807aeb747417002047b7148f7e316b9e810ae5359c7218e5baf4da97664ed4e93d169d4ade7fe272d56ebc21d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1450,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "308185024100909621b2b940d634907762fa65c6249857e414b3e5e4a1461cd47743bd46497cc313c28811287f9ff1b485219ef050b26623b9bec5f1e0e6b7b96b49e2bb831c02400169e5b9f3d0a64bf90e55668fd12888dcfa55eaaec2076ea7b84e88f22225c57e220d7b96c2a5753d7e3b45fa046ea1fb6683e1a8cf818b19afbbe54c12d28c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512t1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0450ce8ff875f5162824bc04693a98fb3ede4d850986640c5b6d8fc451c45de8ed6fdc28c097ba8eafd591e7dc48ca5f9a94710666c310be8c335a4c68ffffffff5a186446dc03018965b508c5941ee6b462774fe6229610e235678a304755e1b6eabf725dfcff2a0cae7e8a7c6bf220ddf0189d0afa78519944b9958c50ac1e90",
+        "wx" : "50ce8ff875f5162824bc04693a98fb3ede4d850986640c5b6d8fc451c45de8ed6fdc28c097ba8eafd591e7dc48ca5f9a94710666c310be8c335a4c68ffffffff",
+        "wy" : "5a186446dc03018965b508c5941ee6b462774fe6229610e235678a304755e1b6eabf725dfcff2a0cae7e8a7c6bf220ddf0189d0afa78519944b9958c50ac1e90"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010e038182000450ce8ff875f5162824bc04693a98fb3ede4d850986640c5b6d8fc451c45de8ed6fdc28c097ba8eafd591e7dc48ca5f9a94710666c310be8c335a4c68ffffffff5a186446dc03018965b508c5941ee6b462774fe6229610e235678a304755e1b6eabf725dfcff2a0cae7e8a7c6bf220ddf0189d0afa78519944b9958c50ac1e90",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDgOBggAEUM6P+HX1FigkvARpOpj7Pt5N\nhQmGZAxbbY/EUcRd6O1v3CjAl7qOr9WR59xIyl+alHEGZsMQvowzWkxo/////1oY\nZEbcAwGJZbUIxZQe5rRid0/mIpYQ4jVnijBHVeG26r9yXfz/Kgyufop8a/Ig3fAY\nnQr6eFGZRLmVjFCsHpA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1451,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "308185024072e1d955e0d4579fbbf3cd6700ef435292be919c42a0f003d6a2a5e4b94cfe1a4dbf4b4a1781f81ef4706f2e9f4fac8cd671251685ebe50002d4e6f532bb454f024100875967a2c16d3ffc1c571875b6f35ca66709fa86fe24f61d0ece79b8df551c4cb71918748105f26e367ee141f13f1bdfbbb1070d6ac031a1aecf2b25ba8d563a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1452,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "308184024035e6f53d230d2d18cfd3e6ccf2b6c9fd56838760884f1888754beb474feb3dc41073075b3b7c309548bfce2eefc3107328f364b816b923e8efef89f39539bc3902401e5eddd0ff983a9af60b30bfb1662491bb900f91bb506332c630ed06d83e34420490d782c9df591d39c53364a5a6e3c6e330cde77658f34ed34c33bf3d264e35",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1453,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "30818502410094875032e0358e02ef7418c2141a3c97a9cdc42451c5498d048e9bceb23b6c62f0245c778d064b9fdb6c0c182b2c8cba6f92c20bdc39ccf6f789d7cbfc8781e3024033fc0f481463d96900a59158a78c288bd78593a1cdb3e287ae75c597cf8d59ac2636a8535e1723f12791b9ada9d0f4509eb48e573cf4f69571d527a22d14e39e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512t1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044c827f0f3da1a424a2cef8a32f51046e6e99b834912c779b9b8ced1df4941379082a7545fb34f1da0413542ffe713aba57e7c275e28197746fc7e837a325f42a23d88740018aea655ce5b763aa3fb1a83072f866f7c1454f8c023c196953026abe4a01f5ed414c703c4b458d09e0815df663790b77f7a9a38b8f07a900000000",
+        "wx" : "4c827f0f3da1a424a2cef8a32f51046e6e99b834912c779b9b8ced1df4941379082a7545fb34f1da0413542ffe713aba57e7c275e28197746fc7e837a325f42a",
+        "wy" : "23d88740018aea655ce5b763aa3fb1a83072f866f7c1454f8c023c196953026abe4a01f5ed414c703c4b458d09e0815df663790b77f7a9a38b8f07a900000000"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010e03818200044c827f0f3da1a424a2cef8a32f51046e6e99b834912c779b9b8ced1df4941379082a7545fb34f1da0413542ffe713aba57e7c275e28197746fc7e837a325f42a23d88740018aea655ce5b763aa3fb1a83072f866f7c1454f8c023c196953026abe4a01f5ed414c703c4b458d09e0815df663790b77f7a9a38b8f07a900000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDgOBggAETIJ/Dz2hpCSizvijL1EEbm6Z\nuDSRLHebm4ztHfSUE3kIKnVF+zTx2gQTVC/+cTq6V+fCdeKBl3Rvx+g3oyX0KiPY\nh0ABiuplXOW3Y6o/sagwcvhm98FFT4wCPBlpUwJqvkoB9e1BTHA8S0WNCeCBXfZj\neQt396mji48HqQAAAAA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1454,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "30818402406fc29976ce99ca8961a91a97dc6a4a110cf087eef1865bce8fb47f704b641f7170121db02ce95066e672efc0bcc6fd5c6a6a6c162cdfffc66dc202d30f16bae002402ec8e0d92e576b417756e387a5418e2b83fdf04b6f087b1f01bf58f8d6691577755172fbfc71a29689fc823737882cf8df16f0bc29cb3884e7c04b8e5dc75c4f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1455,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "30818402405bc931007fd6c71a64df18fe1b44afaf58ecdbb21e7bc9dda8f11b0c23f5cbabe659de7a6a68f9fdb59a78c73f7c307677857e04a6ee2b0a71fae572bec5197d0240683cc10278169dc262b5ebb8ee498b9e48957c91293c2ece45e6398a4a7f7fa05ddb6f39dd6729450cc8226631a2cceeaf735b1e54f023272059a0568229c500",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1456,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "308184024044314adc963c90d08ebefdb19f5426678ddf05dfeaee54e58a8f6b689832f01b75ccf2a13ac9ba96739ba2caa2948705a47b01a2134ce023c7a51c43aea2cd47024009769abfcba361f04bc661d28d51edb6c0a61d02a2b092a239928d5df3ed88ae50cb93e1fc25d7a4b0f5088e7300363ebaea6797b37fa68c2b3a92ba086aac99",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512t1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046ba6e00ef35739a400c612f603b9363f3442b2fcec8a94e2685818ea114925e68db15ec7ebc4fe778838d183b14e16f2eba107256e1e65cad301af869521f64e4a469191781d8503a3a41bdd1203f96af37547d8cf4dfbd780ffb223d60c8f0ad303f5109447564164c4ae85310899d089d333cfb2655852a51dbb31ffffffff",
+        "wx" : "6ba6e00ef35739a400c612f603b9363f3442b2fcec8a94e2685818ea114925e68db15ec7ebc4fe778838d183b14e16f2eba107256e1e65cad301af869521f64e",
+        "wy" : "4a469191781d8503a3a41bdd1203f96af37547d8cf4dfbd780ffb223d60c8f0ad303f5109447564164c4ae85310899d089d333cfb2655852a51dbb31ffffffff"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010e03818200046ba6e00ef35739a400c612f603b9363f3442b2fcec8a94e2685818ea114925e68db15ec7ebc4fe778838d183b14e16f2eba107256e1e65cad301af869521f64e4a469191781d8503a3a41bdd1203f96af37547d8cf4dfbd780ffb223d60c8f0ad303f5109447564164c4ae85310899d089d333cfb2655852a51dbb31ffffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDgOBggAEa6bgDvNXOaQAxhL2A7k2PzRC\nsvzsipTiaFgY6hFJJeaNsV7H68T+d4g40YOxThby66EHJW4eZcrTAa+GlSH2TkpG\nkZF4HYUDo6Qb3RID+WrzdUfYz03714D/siPWDI8K0wP1EJRHVkFkxK6FMQiZ0InT\nM8+yZVhSpR27Mf////8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1457,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "30818502406fa3401b7ffd9e455613f1032f757ee318e3fad1eb064f5b7036efdbf6c1d7a1c40328f4bb2435b37a21b6f1f9d7d853eeac2660c45d65459d73ce191767c69302410092e90f5e883638d9bac9b4eff9333dfba55860a97810a505baa7f317cfee0d44c9bd332163db3d63e975443b0457cc52737aa84dbcbfdcd5b8d4f7f8388973f9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1458,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3081850241008f1a46fa97c1f64e999a373af69cda2da531440f22383328f04b30b20366b3814d0a5616fc5ccbf7cbca97e95d2099fc7c5bb582ecadcda9b535117daa9c39920240186a626132df3f81868ce9d5963f931e0142677254a31a8647556bf896907f29d62167b3cb2ea892a4384daf8855e258361cb6762de703c63d6445cd68ab4d33",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 1459,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "3081850240108b5edd424745fc20da9bdcb83cf2f8c0439b390d72805149b8deb85352d79b9579d5f7f1b92e79ddff5c05f8c046f6bce7129565d33937c72a34d3436587c40241008f3af09a517f564adb3dbb345c122de41640f4b3cc6c5cbc0e2b36a836b2653caa112ae03f753b0e9070c9fc7f0d140b33c9d2b837837d1947c03d141957ffee",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04512e581731c9c460bb705b60da976ccb1b0ef421785106ba2ccdd2380f21d5bacdf81c0cb78fa151237db3130ad4def373f3e523398c2cf7",
+        "wx" : "512e581731c9c460bb705b60da976ccb1b0ef421785106ba2ccdd238",
+        "wy" : "0f21d5bacdf81c0cb78fa151237db3130ad4def373f3e523398c2cf7"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004512e581731c9c460bb705b60da976ccb1b0ef421785106ba2ccdd2380f21d5bacdf81c0cb78fa151237db3130ad4def373f3e523398c2cf7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABFEuWBcxycRgu3BbYNqXbMsbDvQh\neFEGuizN0jgPIdW6zfgcDLePoVEjfbMTCtTe83Pz5SM5jCz3\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1460,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00c95518bae4cdd1311784590a784650c2633ae192d2929553e96edf5f021c6afb37f9924b5e4c9453bdc2dcb9ac1565b3b1182d74607e339de8ff",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1461,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c2d0cdd510f69007deb38ad899122b926cd684ee85a29892a6f8e2949021d00a60982ac01e843bf4039baf0e4c54d803ee86c9b396b719a58f2b084",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1462,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00bf03007699cbd36c564029340d93e7a69230aceb759a3d0918ee0e6c021d0099743ba3a4e77418adadc7b2db67adec8fc8b244e56ec4f2d5afc0c5",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ac55d1b3fed4aee03fa3615d225a9cba5c0284416fbaf9a76135f76217a888395bced34977a8482370d56ebc62aa1ca81bc330f49d4a141d",
+        "wx" : "0ac55d1b3fed4aee03fa3615d225a9cba5c0284416fbaf9a76135f762",
+        "wy" : "17a888395bced34977a8482370d56ebc62aa1ca81bc330f49d4a141d"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004ac55d1b3fed4aee03fa3615d225a9cba5c0284416fbaf9a76135f76217a888395bced34977a8482370d56ebc62aa1ca81bc330f49d4a141d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABKxV0bP+1K7gP6NhXSJanLpcAoRB\nb7r5p2E192IXqIg5W87TSXeoSCNw1W68YqocqBvDMPSdShQd\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1463,
+          "comment" : "x-coordinate of the public key is small on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00b207e86cb0789b09de84e0b05c875c134cb701b825b7e37369d1497f021d00b66f890b6c61171d2d474391d5fbf5205afef3d8628ed3728d5c1655",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1464,
+          "comment" : "x-coordinate of the public key is small on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00d2c0ae451c1d661cd3c137a2b0c2a5349a1b22e890093f3bb021b470021c6b7bf3bee77d48b32b0b822f5d4f0dca0a017919b09f92c7669cf5cd",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1465,
+          "comment" : "x-coordinate of the public key is small on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00ad305aff3120dcaa93238388f96f26b44e2abfbfc8e366e936a1f5f0021d00910d0c66c18b74dcad62da508f8bb5e44483c20df95d7b3348c5d32c",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048b319f2ed074a20ec42d869c7f99bd9146ed8263297bfe004f27c59b120f96343deb80093ecb7695c2d2a5be9937a258723d78ed00aa1edf",
+        "wx" : "08b319f2ed074a20ec42d869c7f99bd9146ed8263297bfe004f27c59b",
+        "wy" : "120f96343deb80093ecb7695c2d2a5be9937a258723d78ed00aa1edf"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00048b319f2ed074a20ec42d869c7f99bd9146ed8263297bfe004f27c59b120f96343deb80093ecb7695c2d2a5be9937a258723d78ed00aa1edf",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABIsxny7QdKIOxC2GnH+ZvZFG7YJj\nKXv+AE8nxZsSD5Y0PeuACT7LdpXC0qW+mTeiWHI9eO0Aqh7f\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1466,
+          "comment" : "y-coordinate of the public key is small on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00a2f1ca07012f6d76f0c1a7edc98e97ac5439ea6f536376e1518243e1021d008da899be8b73ad74f31cde8030ec694c3c0380a303554557009ddce4",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1467,
+          "comment" : "y-coordinate of the public key is small on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d008e245a23d95e8c8512689c6a7b79b338f4628116d92e2659650bb879021c2602f7ec88ab2e7e10fa02aac442476ee26ffb8231d017355f804761",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1468,
+          "comment" : "y-coordinate of the public key is small on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303e021d00948a855285cfd20560efa45f93306aa5d0aeb3988b224587fc30122f021d00d54acf351e538f162991b91768e3690f149095d31397cf01ad136a21",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048b319f2ed074a20ec42d869c7f99bd9146ed8263297bfe004f27c59bc5b19e75e857e67ceb4cb98fb2ff31c9176764ff259d11087e1ea220",
+        "wx" : "08b319f2ed074a20ec42d869c7f99bd9146ed8263297bfe004f27c59b",
+        "wy" : "0c5b19e75e857e67ceb4cb98fb2ff31c9176764ff259d11087e1ea220"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a00048b319f2ed074a20ec42d869c7f99bd9146ed8263297bfe004f27c59bc5b19e75e857e67ceb4cb98fb2ff31c9176764ff259d11087e1ea220",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABIsxny7QdKIOxC2GnH+ZvZFG7YJj\nKXv+AE8nxZvFsZ516FfmfOtMuY+y/zHJF2dk/yWdEQh+HqIg\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1469,
+          "comment" : "y-coordinate of the public key is large on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c1c2d0f676f99a2955b72ca32d28968ccbd38d3de70bcedbbe1592291021d00cb7a39faa9ab0508a6aaa772f0a003c703ab84ffcddd9ac50ba1f196",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1470,
+          "comment" : "y-coordinate of the public key is large on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d00d3a0a4924f86c524fe771342d6cb645d72807fa250cb7b27502a7fc9021c5393c63fd2c682691dc3cd911f175a5f115d002e33794ad8d39b6c4b",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1471,
+          "comment" : "y-coordinate of the public key is large on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c3a001e9bd29a137ef655aa8fc02ad9cfb19171668df2ffecbb166fab021c646b4695547ddb392820e0f84350862a7cff332b036f046d4c2fe4a0",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c5dc5135f050a96bbb0d21885195b49a574d5198baac4b4602b21bc8b5f38b7fe661003faee1b7af670e165bfab70b018965e83329d405bc",
+        "wx" : "0c5dc5135f050a96bbb0d21885195b49a574d5198baac4b4602b21bc8",
+        "wy" : "0b5f38b7fe661003faee1b7af670e165bfab70b018965e83329d405bc"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004c5dc5135f050a96bbb0d21885195b49a574d5198baac4b4602b21bc8b5f38b7fe661003faee1b7af670e165bfab70b018965e83329d405bc",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABMXcUTXwUKlruw0hiFGVtJpXTVGY\nuqxLRgKyG8i184t/5mEAP67ht69nDhZb+rcLAYll6DMp1AW8\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1472,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c7116be59cfe691bf4d41aa536df59681f08ff5663a87e5b0432543ff021c6459005b5513c470c8fa49213c97d54a8d9241c56b2c35df714f474c",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1473,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303c021c3e2af0528f85dd3603b6138d4d58b700d9e14c24ebb9a523233e02da021c34cd5a75313f0d0c57d4534cac1859197eac3e837fd7b77bc925b257",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1474,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c2357daaf4dd854e9090386350d76ca18436c81a91811ddd272e0e369021d00d491a745051d6a45afb6bd4653b1a1eb52c3b6eb41e03847da3ee5b9",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP224r1",
+        "keySize" : 224,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c1b56a1ad154e11556b723fc7493f36e66509d8f68fad0e62c40f0859b04780a85e69abf98def3335ce643cd3554167a8b50d596b9538895",
+        "wx" : "0c1b56a1ad154e11556b723fc7493f36e66509d8f68fad0e62c40f085",
+        "wy" : "09b04780a85e69abf98def3335ce643cd3554167a8b50d596b9538895"
+      },
+      "keyDer" : "3052301406072a8648ce3d020106092b2403030208010105033a0004c1b56a1ad154e11556b723fc7493f36e66509d8f68fad0e62c40f0859b04780a85e69abf98def3335ce643cd3554167a8b50d596b9538895",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFIwFAYHKoZIzj0CAQYJKyQDAwIIAQEFAzoABMG1ahrRVOEVVrcj/HST825mUJ2P\naPrQ5ixA8IWbBHgKheaav5je8zNc5kPNNVQWeotQ1Za5U4iV\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1475,
+          "comment" : "x-coordinate of the public key has many trailing 1's on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c39aa3aa6691c95487ebc3d605cf9e0ac8a64ea3324f448e851ea1d0c021d008e87a220c70a7e1b5b53e10f9f85dfd796e5bcb8c50b56fe8c119a25",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1476,
+          "comment" : "x-coordinate of the public key has many trailing 1's on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303d021c3c4e580131536b54fb1bf9da674cbf773e88599bf5664e414d38cf54021d00d1b2db7da0337af9665a0c3c635545e6e07325ea811664ab1bb97f21",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1477,
+          "comment" : "x-coordinate of the public key has many trailing 1's on brainpoolP224t1",
+          "msg" : "4d657373616765",
+          "sig" : "303d021d0082890d9903ff2413542b218cd13a0401f6a83f07c2b7cb32294953b0021c2189daaae8e48edab99bd1e01e22d04f28782f2d1e17b6c85b7bb56f",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0481528b7adbbebf1b6b3c7fa1d61284b07759b9a98d31a5702707b018fdecff1175bbfccb545381bf8601031731841829401b08dcdc68cc34e06a64e412038512",
+        "wx" : "081528b7adbbebf1b6b3c7fa1d61284b07759b9a98d31a5702707b018fdecff11",
+        "wy" : "75bbfccb545381bf8601031731841829401b08dcdc68cc34e06a64e412038512"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000481528b7adbbebf1b6b3c7fa1d61284b07759b9a98d31a5702707b018fdecff1175bbfccb545381bf8601031731841829401b08dcdc68cc34e06a64e412038512",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABIFSi3rbvr8bazx/odYShLB3Wbmp\njTGlcCcHsBj97P8Rdbv8y1RTgb+GAQMXMYQYKUAbCNzcaMw04Gpk5BIDhRI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1478,
+          "comment" : "x-coordinate of the public key has many trailing 1's on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100a50318c3066a4966ad18ae8f85253fbb5835a34b2f9187daac71ee28d3d5d0eb02200890ef0fc93df222d11197cb221483ce897b0cf1acf4a909c306c5a485776abc",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1479,
+          "comment" : "x-coordinate of the public key has many trailing 1's on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "30440220041e0389dda2cf2ae3a9562a0fb5d41c1f7533e6cc84a896e99af781e21097700220366b5d88c36f1227df522fdab65e12347d68eb64f2de82c648115fd565bd37b7",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1480,
+          "comment" : "x-coordinate of the public key has many trailing 1's on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "304502202a76394a04ae19b25c54291e28bcd42a7edeb20981b8a3b838f9dd0e29b574c10221009ce89980ae432c4fa6a68025da554bf900cc2eb0c66906420d322c14b453049c",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a3a25a353caa94ac4eed3700f7d56b456a0fc670d56a166d5219b7c97f30ef3e16ea8e03c20977f20aed58106b6d9d1085b4475f75b5469c5f426cb27ec6d872",
+        "wx" : "0a3a25a353caa94ac4eed3700f7d56b456a0fc670d56a166d5219b7c97f30ef3e",
+        "wy" : "16ea8e03c20977f20aed58106b6d9d1085b4475f75b5469c5f426cb27ec6d872"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004a3a25a353caa94ac4eed3700f7d56b456a0fc670d56a166d5219b7c97f30ef3e16ea8e03c20977f20aed58106b6d9d1085b4475f75b5469c5f426cb27ec6d872",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABKOiWjU8qpSsTu03APfVa0VqD8Zw\n1WoWbVIZt8l/MO8+FuqOA8IJd/IK7VgQa22dEIW0R191tUacX0Jssn7G2HI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1481,
+          "comment" : "y-coordinate of the public key is small on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "3045022066958be3379405826a00daf5495b1657698126a5ff449f9649af26ca96df96670221009b4100816e2741f86c5c0b0dcf82e579f4281d2b8e70c234808d84c1a495079f",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1482,
+          "comment" : "y-coordinate of the public key is small on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "3044022053ed0f4b8fb33ef277cdd1060435ed3dec518a225659f71f67f9a1f07f85c1ca0220124d5f94ddf12bb4cbe3c5cea6d2686d4480dabb8ffbb05e5238c877fe20383e",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1483,
+          "comment" : "y-coordinate of the public key is small on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "3044022046643c7fe0f308b8af4ce2978d797e8c46a7e1f8bfee0b5cdbaecde1f59be41d02201bd11a814d1fbd9ae97a49df99beca7fec2512563c0031c5aad5b9fc2fb0a507",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a3a25a353caa94ac4eed3700f7d56b456a0fc670d56a166d5219b7c97f30ef3e9310c9d7dfe531ca3378b2803215f061e887aec45f70d98bc0d0db6aa0a77b05",
+        "wx" : "0a3a25a353caa94ac4eed3700f7d56b456a0fc670d56a166d5219b7c97f30ef3e",
+        "wy" : "09310c9d7dfe531ca3378b2803215f061e887aec45f70d98bc0d0db6aa0a77b05"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b240303020801010703420004a3a25a353caa94ac4eed3700f7d56b456a0fc670d56a166d5219b7c97f30ef3e9310c9d7dfe531ca3378b2803215f061e887aec45f70d98bc0d0db6aa0a77b05",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABKOiWjU8qpSsTu03APfVa0VqD8Zw\n1WoWbVIZt8l/MO8+kxDJ19/lMcozeLKAMhXwYeiHrsRfcNmLwNDbaqCnewU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1484,
+          "comment" : "y-coordinate of the public key is large on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "304402204f833bec9c80185beacbb73b5f984e2c03d922359be7468ce37584f53d1aea4a02206636744ab7fecaa53541bcf5f37c6cbe828a8efbc4d00f6469ba390a86708a26",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1485,
+          "comment" : "y-coordinate of the public key is large on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "3045022100a2869da416523aad2b8fa8aad5c3b31c5a535fdd413b71af4dffb90c6f96a669022029ff3e8d499cabc3cc4cccd0fa811cc3b04770aa71f0d052185210b14d31993d",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1486,
+          "comment" : "y-coordinate of the public key is large on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "3044022063dbfe29249a506b89fbd2cb1fafc254a9582dfc4b08d143b6d25bf2ab49d55e022044cad80c00460905e103f26da84cefd71af4bc7a71962a3bce321bc3b5842736",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046d499b077ab6d77b244320a2cacab91a764595dd67a7a8dfcf84da7d38b2d8f45994c07b833ff4909c1a92cc9f24dea88be8603b407b00d228faf2158db2354f",
+        "wx" : "6d499b077ab6d77b244320a2cacab91a764595dd67a7a8dfcf84da7d38b2d8f4",
+        "wy" : "5994c07b833ff4909c1a92cc9f24dea88be8603b407b00d228faf2158db2354f"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b2403030208010107034200046d499b077ab6d77b244320a2cacab91a764595dd67a7a8dfcf84da7d38b2d8f45994c07b833ff4909c1a92cc9f24dea88be8603b407b00d228faf2158db2354f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABG1Jmwd6ttd7JEMgosrKuRp2RZXd\nZ6eo38+E2n04stj0WZTAe4M/9JCcGpLMnyTeqIvoYDtAewDSKPryFY2yNU8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1487,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "30450221009d907cf88e10d60c3f23892498fe43ddb02f824fb18e6be313e02d94f2c8e09002200c16b9e0db4dc8606c023b001f69b3c886080794fc9d7fe31b00c1cf0935e421",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1488,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "304402207395ce0ef652848a86b61097cc9543998d39dae88a1fc9e4dfdd69642949548902207de29e256e8202382f91c116a667a8b946f210447a57369ba61ae4fae73dd136",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1489,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "304402207baf1fde87ccb1bea0f893b3bfb2549c04bca18835d8eb5a31b8d20506ff88c30220289ebe829fefb9ad009d7cdd622874aef5fa088f0508a4b43d5895d61645cecf",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0408c2f95ffedde1d55e3f2c9dcf5884347f6904c6492273ad760eb7b9b35f036b2bcf7a048caa2c726ae8808dc95312eb2350275a8f4fbeea7c0f32f3839c7b93",
+        "wx" : "08c2f95ffedde1d55e3f2c9dcf5884347f6904c6492273ad760eb7b9b35f036b",
+        "wy" : "2bcf7a048caa2c726ae8808dc95312eb2350275a8f4fbeea7c0f32f3839c7b93"
+      },
+      "keyDer" : "305a301406072a8648ce3d020106092b24030302080101070342000408c2f95ffedde1d55e3f2c9dcf5884347f6904c6492273ad760eb7b9b35f036b2bcf7a048caa2c726ae8808dc95312eb2350275a8f4fbeea7c0f32f3839c7b93",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABAjC+V/+3eHVXj8snc9YhDR/aQTG\nSSJzrXYOt7mzXwNrK896BIyqLHJq6ICNyVMS6yNQJ1qPT77qfA8y84Oce5M=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1490,
+          "comment" : "x-coordinate of the public key is large on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "3044022033e37c3b66acabee3d68cbbb9c55cd52b586de51647723fa84e532a3ec5953ef02203b8a9ee707d1bc5f83e17ea072adc2ecda92e637d7c06060f1af79b929a850b3",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1491,
+          "comment" : "x-coordinate of the public key is large on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "304402201f8ebdc94ecddd84f90960cc55d0ca02e33d70535fc1c7322b3c2783b9dc92380220205aa8626c3a5da214e5485b11154a378d70b0d3323ab868528ae8048d17b696",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1492,
+          "comment" : "x-coordinate of the public key is large on brainpoolP256t1",
+          "msg" : "4d657373616765",
+          "sig" : "304402206b0d70e09ba1642adac06dff9b52e22a3e4aab4180e372665691412241e743a002204d7d30ff8a210de69e3e6d1ecf7175f89f481a4d9ed06beaf7148da47f4af9e9",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0434770c73a7e42ce7a57d1de6e54f35f1752047f6513584c7b14bca17d7abc499f8ab037c70fd2e13a8b97b2ae263688622421615ba363f1ffe9a8f2fe0f6e246fda11462a3ec000c685e09a90dbcdc2af6467f9ee69b5e7bead9b8461f4a4be0",
+        "wx" : "34770c73a7e42ce7a57d1de6e54f35f1752047f6513584c7b14bca17d7abc499f8ab037c70fd2e13a8b97b2ae2636886",
+        "wy" : "22421615ba363f1ffe9a8f2fe0f6e246fda11462a3ec000c685e09a90dbcdc2af6467f9ee69b5e7bead9b8461f4a4be0"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000434770c73a7e42ce7a57d1de6e54f35f1752047f6513584c7b14bca17d7abc499f8ab037c70fd2e13a8b97b2ae263688622421615ba363f1ffe9a8f2fe0f6e246fda11462a3ec000c685e09a90dbcdc2af6467f9ee69b5e7bead9b8461f4a4be0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABDR3DHOn5CznpX0d5uVPNfF1IEf2\nUTWEx7FLyhfXq8SZ+KsDfHD9LhOouXsq4mNohiJCFhW6Nj8f/pqPL+D24kb9oRRi\no+wADGheCakNvNwq9kZ/nuabXnvq2bhGH0pL4A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1493,
+          "comment" : "x-coordinate of the public key is large on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "306402300e44fdc33aed0c320e371e2a78e9f18fde83434e681afb05a5bdb0f43cac70e83ede56bf8c56acf70e054e2ffef549cf02301324b4cfe684d401eac15b0940f5835436d3a1028e27c1966dbf69fefef82748a05b4443c77c870789135755d0d184cf",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1494,
+          "comment" : "x-coordinate of the public key is large on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "306402305966acd8a7714f2015e36fd4fdb3452258ce0aaefb3972091b496bd530bbaf1ec67d7e37e50031b3eea44a8bb8f62c2002302a5f309d2fad55b93a7a3012cbda2845efaa4ea0d187d3824f4a6a9227730d3ab15246d8d0952c7ee8c0b9eb83d1c2a2",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1495,
+          "comment" : "x-coordinate of the public key is large on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "30640230266eace657e1ec88a2adbb38a5afb4f750274ca614d1fde9ea39dff6f2a2aa69923e9a7489f06bf9d84c518cee57e55b02303d19027684ef221216f63a591d8e793524e4c1234a56ce415bb9ad9e2ebf25ac94a99261b9157d19daa5aa876291f308",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0486f0fc89b7861ec3bd582161aecfc95789ae402459eb7f3015b7dd24e20fc9b005c635fc290a0e2a9ff35863b7b82e3e01ebba489e923dad88146077914e3ae5c575e1bececec710962a18ffd91005776c4d9e4bd952c793587a70291ce478b4",
+        "wx" : "086f0fc89b7861ec3bd582161aecfc95789ae402459eb7f3015b7dd24e20fc9b005c635fc290a0e2a9ff35863b7b82e3e",
+        "wy" : "1ebba489e923dad88146077914e3ae5c575e1bececec710962a18ffd91005776c4d9e4bd952c793587a70291ce478b4"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b0362000486f0fc89b7861ec3bd582161aecfc95789ae402459eb7f3015b7dd24e20fc9b005c635fc290a0e2a9ff35863b7b82e3e01ebba489e923dad88146077914e3ae5c575e1bececec710962a18ffd91005776c4d9e4bd952c793587a70291ce478b4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABIbw/Im3hh7DvVghYa7PyVeJrkAk\nWet/MBW33STiD8mwBcY1/CkKDiqf81hjt7guPgHrukiekj2tiBRgd5FOOuXFdeG+\nzs7HEJYqGP/ZEAV3bE2eS9lSx5NYenApHOR4tA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1496,
+          "comment" : "x-coordinate of the public key is small on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "3064023013de6eb532321c023092aa78c199f9ee4dce7a18df158c3e799461af9d96c2d38765a78fdb14404d199365de05bd44c502302514a0359bcb66122bf48c186a4bb2edccf305b06414b11f470d2512cadda129366f6072de715bc2babb8a3a5f260d9b",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1497,
+          "comment" : "x-coordinate of the public key is small on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "306402301308d3d9edfe3ad07e215a975b2b067e9f0b803371b3029f4388a3471f4db23f358aea5c03db62d77115c56c4962633b02304b8b1fe44b32cc669114a1ce0ba0555446d0c96a32cb602185e8fba414d3a831cbf5b519b0f90647dc45e30a1f23ef90",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1498,
+          "comment" : "x-coordinate of the public key is small on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "306402305da3df094155b8f8812d0c6345344e41c3b591b65b95fedbbcbd3c3a3bb1c1dbfc4d4c5b841b8f8874d59b07cf2288fc02304a1e4a8399abbdf246929b2559bb0fa404772755fc74523626aeef432fe4764df1e1f5c9b0f897ed8f1ffd7a88167f0e",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04082f7dceb585c5ba4894b0faf6604da888a311ad9f41731a1d3937168a10b0795a1fae496cb9a90739e1c0a6e531e8072c3b8568eaa1c6f541a665ce7a66f78ea2d5893103e6028add62356492d8b5ac6ab8901d59621c33416c33981bd594ec",
+        "wx" : "082f7dceb585c5ba4894b0faf6604da888a311ad9f41731a1d3937168a10b0795a1fae496cb9a90739e1c0a6e531e807",
+        "wy" : "2c3b8568eaa1c6f541a665ce7a66f78ea2d5893103e6028add62356492d8b5ac6ab8901d59621c33416c33981bd594ec"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b03620004082f7dceb585c5ba4894b0faf6604da888a311ad9f41731a1d3937168a10b0795a1fae496cb9a90739e1c0a6e531e8072c3b8568eaa1c6f541a665ce7a66f78ea2d5893103e6028add62356492d8b5ac6ab8901d59621c33416c33981bd594ec",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABAgvfc61hcW6SJSw+vZgTaiIoxGt\nn0FzGh05NxaKELB5Wh+uSWy5qQc54cCm5THoByw7hWjqocb1QaZlznpm946i1Ykx\nA+YCit1iNWSS2LWsariQHVliHDNBbDOYG9WU7A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1499,
+          "comment" : "x-coordinate of the public key has many trailing 0's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "306402300bf6fec0a5be27cddb0e7669ae06d15dfa75837f8ee72b47443ac845ffcd427b0893e10c85c20c7aa576fb70e87761ab02307418b6f374936adca8b07dc51545ee34ed2e9f56f3267033e30ea09a0acd31b6ce83503ee7e098627f8ba8b4c584341e",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1500,
+          "comment" : "x-coordinate of the public key has many trailing 0's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "3064023003e306a86f6b2cb248fcb68d1d317a6042b7089e96d74c2f5b934e2e122831268a45e2185b7c21270e8b906cd372e6d702304c82ab6de6bc0194ac1a2e3480a0c80466af7d2a329d20b03151d1806a0bc0720f55d3781a7db9febe7d8bbd0a719bfa",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1501,
+          "comment" : "x-coordinate of the public key has many trailing 0's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "3064023014d1df9b3db55ecc8d1e126625bdf5b6316bba1e7f4ea5ec77418c754a597563dc5dc291b7dd047782d518fe74e0be83023033ef701c440f280edf81a9632dde9dc17de5f438dcc19e9ca5919b4b73e62905e5f7e0bc9db0b14bc53327f79f70c6da",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046afe4ea7705492bda308b789d70da49457dde825d5258960a7a366e4665af9d326392c2672165ea4bbdc33374d88e7498475e6937a10a6f6a50f23de9126ba04e5650a1cd06a8066ca423339fc2ce53d91482744a4cdf2f937f76f12aae3f630",
+        "wx" : "6afe4ea7705492bda308b789d70da49457dde825d5258960a7a366e4665af9d326392c2672165ea4bbdc33374d88e749",
+        "wy" : "08475e6937a10a6f6a50f23de9126ba04e5650a1cd06a8066ca423339fc2ce53d91482744a4cdf2f937f76f12aae3f630"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200046afe4ea7705492bda308b789d70da49457dde825d5258960a7a366e4665af9d326392c2672165ea4bbdc33374d88e7498475e6937a10a6f6a50f23de9126ba04e5650a1cd06a8066ca423339fc2ce53d91482744a4cdf2f937f76f12aae3f630",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABGr+TqdwVJK9owi3idcNpJRX3egl\n1SWJYKejZuRmWvnTJjksJnIWXqS73DM3TYjnSYR15pN6EKb2pQ8j3pEmugTlZQoc\n0GqAZspCMzn8LOU9kUgnRKTN8vk3928SquP2MA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1502,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "306402306a3a18400686635ae279c385b640d4fa080d9c44a5d421fe4be5a5ec7a8ae31b00bfa406e919e57e39c11360e670d8690230729c0b9ff77f88f810548d6db1835312a448114a3bd93cf59422faa2ea026f5d47627f0c11fb859112246d879c859568",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1503,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "306502301ab8d6c31d4577f59ca5714c9eada979fdb9ec0cad32d8cb915dbd70492947187f5a52718e19982f7a2d4cb48b227723023100872e3ce7d1fd5ae180faf1990b11937558aa44ccdab631492b8925be84fbcb452148edad5bbfe48c06b8c9908ca252fd",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1504,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "3066023100803ffc58f8150a9c4c229a7b522357f49f9a5f48f82d8bb982954395836e09eb5f8cf1f345ce284674bc369d046d5c8a0231008a9feb64c410cf3ae6261ad35f7e3e8da13129daf94944f8e08e9649cd006622c3d5c91ec5b9798a1be3a31533a0a851",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044bc65262c22d322ea89146ccb5c60c4287b65a35228743a5b9dcd15493bd8642478987c421637dd0715079ec90fb8cd47a45557ef653d0773dbe2630f8e000629ed8293e1aa4a96f3b159a245aa35ad92a1019c7e09a9ab75ba43c0786928237",
+        "wx" : "4bc65262c22d322ea89146ccb5c60c4287b65a35228743a5b9dcd15493bd8642478987c421637dd0715079ec90fb8cd4",
+        "wy" : "7a45557ef653d0773dbe2630f8e000629ed8293e1aa4a96f3b159a245aa35ad92a1019c7e09a9ab75ba43c0786928237"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200044bc65262c22d322ea89146ccb5c60c4287b65a35228743a5b9dcd15493bd8642478987c421637dd0715079ec90fb8cd47a45557ef653d0773dbe2630f8e000629ed8293e1aa4a96f3b159a245aa35ad92a1019c7e09a9ab75ba43c0786928237",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABEvGUmLCLTIuqJFGzLXGDEKHtlo1\nIodDpbnc0VSTvYZCR4mHxCFjfdBxUHnskPuM1HpFVX72U9B3Pb4mMPjgAGKe2Ck+\nGqSpbzsVmiRao1rZKhAZx+CamrdbpDwHhpKCNw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1505,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "306502302ed569f12dbe30a2abf02190bb9e4de7e218e9fd705dc71cbe1480022781b2a2213c3ef2f91052e90840a18f74e375ae0231008872b566f387c2bcb639df9c2d866f7631df290c5f66c264d4949e256383b1b4b2098c120f13449d9d7bff6891919c88",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1506,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "306402304b7e5651b035959295092e2efe548da52206c8d0e48ba43e2b8ecd98ece25dc08955b6e7b05e38c4e22829d1658711b5023044a973b75528400cef3f63f55f2154d48bb0b826214200d3f33c7bc31155242d4e24f07ed19606fdb2c8ecaeb6981eb7",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1507,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "306402301ecadaceaa479fa4e9aabac4210b1ab77fc1d13a9c4cb022826bb1806575115834a6ecb9dec3e668b8c91d4aca283dc902302de8965a66d56545ad84fdaee16fffa0eb31022186a5b6be2a2475958b9ad72f483ebd4b255748a811806bcd428acfd7",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042ac393f20c110e3f97065304397eae0e23187b2b6163dc66083e82aff568426843056aff8dc23eebce297f747830e21734c935671391c6efa8b46c5c37b3f84a82e429a7580feb9a1383b55c83a9398e8ecc7b15d699e63962329102a1576f2b",
+        "wx" : "2ac393f20c110e3f97065304397eae0e23187b2b6163dc66083e82aff568426843056aff8dc23eebce297f747830e217",
+        "wy" : "34c935671391c6efa8b46c5c37b3f84a82e429a7580feb9a1383b55c83a9398e8ecc7b15d699e63962329102a1576f2b"
+      },
+      "keyDer" : "307a301406072a8648ce3d020106092b240303020801010b036200042ac393f20c110e3f97065304397eae0e23187b2b6163dc66083e82aff568426843056aff8dc23eebce297f747830e21734c935671391c6efa8b46c5c37b3f84a82e429a7580feb9a1383b55c83a9398e8ecc7b15d699e63962329102a1576f2b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABCrDk/IMEQ4/lwZTBDl+rg4jGHsr\nYWPcZgg+gq/1aEJoQwVq/43CPuvOKX90eDDiFzTJNWcTkcbvqLRsXDez+EqC5Cmn\nWA/rmhODtVyDqTmOjsx7FdaZ5jliMpECoVdvKw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1508,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "3064023037e256872340da9dc884fd00daa14628372b4bedc0a8a09f9d7513521d3b803a78dc0edbab3c7dc2b2014baf7a9d210e02301ba4b4087973070cca9b957650177eeb41c557731596a966b0b7f68717d8e7b554afd07c2937c95403a90c3a05fa964b",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1509,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "3063022f128c199dc27677f23feae28a9b28813cbc3b02fca493005a67c3126a705c49b982cb5817ee2c81161e80b738bbb512023073cb6d4547771d254be74348955bee979071358aa3afd62a5838179a0965465aec79bd6cbd9b8b2aa2c79bb88ab21592",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1510,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP384t1",
+          "msg" : "4d657373616765",
+          "sig" : "3065023100818b0fd6ca0978a59cad3fa15e84db2896f39b2aa462f0583834fa4444d153fe61e0c93071ba96c5ffa7193f77b806f302301d2d6144172385f857db4b7e7e863962eacacdec034b4b4a9dd1af272604403f39f45a21948b30976e738e9e98fd9cee",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04727e75d63dceb1a84a7106d802e8eb34a204bc05353567a23ba8b6f54e50d2d8221c87fd8e5238a3374df958b3cf3e3f38c618c1cc8c5b9574b50e405d69121837f78918506ea9cc14f1492eb66c9e1c4e27f3cb00bb511d5dfdbea6f817a87bfd81de2955fa032f52873f799169cc445cb0391e46e57179ef84d50c85db5c97",
+        "wx" : "727e75d63dceb1a84a7106d802e8eb34a204bc05353567a23ba8b6f54e50d2d8221c87fd8e5238a3374df958b3cf3e3f38c618c1cc8c5b9574b50e405d691218",
+        "wy" : "37f78918506ea9cc14f1492eb66c9e1c4e27f3cb00bb511d5dfdbea6f817a87bfd81de2955fa032f52873f799169cc445cb0391e46e57179ef84d50c85db5c97"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004727e75d63dceb1a84a7106d802e8eb34a204bc05353567a23ba8b6f54e50d2d8221c87fd8e5238a3374df958b3cf3e3f38c618c1cc8c5b9574b50e405d69121837f78918506ea9cc14f1492eb66c9e1c4e27f3cb00bb511d5dfdbea6f817a87bfd81de2955fa032f52873f799169cc445cb0391e46e57179ef84d50c85db5c97",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEcn511j3OsahKcQbYAujrNKIE\nvAU1NWeiO6i29U5Q0tgiHIf9jlI4ozdN+Vizzz4/OMYYwcyMW5V0tQ5AXWkSGDf3\niRhQbqnMFPFJLrZsnhxOJ/PLALtRHV39vqb4F6h7/YHeKVX6Ay9Shz95kWnMRFyw\nOR5G5XF574TVDIXbXJc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1511,
+          "comment" : "y-coordinate of the public key is small on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "30818402405e1bf4b1debacba4725fc3cc8214534de5f6e592645b60f4c4a1dd2260d3357d8fb2ada7f72a48346a7e34395a6a181c694048ae8258f1cb3b6f63f4932829eb02405e3df0beee22fa96d4655833862f73b52f12e4c4c7d818b21846effb39d6f09fc35b2d0fac8f5cb3c4051ff45f5305e93b24138a0f95fad2fef1c10cd1dcf2cb",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1512,
+          "comment" : "y-coordinate of the public key is small on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "30818502410080400bee9a342f3afba2dbb029235ad511aedb30960c53bad670460b38304d7cbd706ff98f1296cb7e746f8ca3a43937a5cd035a00c63868001fa429b491bd8e02405c66941edcda56228edce77373a7b9dcdd464ed18075e7da1427911778784f8017bef6f18751cba12355bd90ba63b8d31ea373387f36494e3642008082d349d1",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1513,
+          "comment" : "y-coordinate of the public key is small on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "30818402404768dfddae4cb83566f2c3a9340091c2608e0e270a4b3f48ded7c75b4aa15ab65cb050cfdb312c32bfaa7759869c9c0ce27f6cdf1fb584379f6398c95ebf864402407e1a3aacd8d603faecf87902147b67435d992ee9e543f934dd4c40d8a12cd1e10366d0743d7862b9c8ba8b6816639c3509b5caa2a91533c0af50ece2fd2c530c",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04727e75d63dceb1a84a7106d802e8eb34a204bc05353567a23ba8b6f54e50d2d8221c87fd8e5238a3374df958b3cf3e3f38c618c1cc8c5b9574b50e405d69121872e614a08b7b1abf2ae39d7f7d5d5deb7d0899e8b30e80f17865de23781b5ff57fcbbcd745cc65135c4661b15539b4a1cbd1c610e69d550b39258b49d25eec5c",
+        "wx" : "727e75d63dceb1a84a7106d802e8eb34a204bc05353567a23ba8b6f54e50d2d8221c87fd8e5238a3374df958b3cf3e3f38c618c1cc8c5b9574b50e405d691218",
+        "wy" : "72e614a08b7b1abf2ae39d7f7d5d5deb7d0899e8b30e80f17865de23781b5ff57fcbbcd745cc65135c4661b15539b4a1cbd1c610e69d550b39258b49d25eec5c"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d0381820004727e75d63dceb1a84a7106d802e8eb34a204bc05353567a23ba8b6f54e50d2d8221c87fd8e5238a3374df958b3cf3e3f38c618c1cc8c5b9574b50e405d69121872e614a08b7b1abf2ae39d7f7d5d5deb7d0899e8b30e80f17865de23781b5ff57fcbbcd745cc65135c4661b15539b4a1cbd1c610e69d550b39258b49d25eec5c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEcn511j3OsahKcQbYAujrNKIE\nvAU1NWeiO6i29U5Q0tgiHIf9jlI4ozdN+Vizzz4/OMYYwcyMW5V0tQ5AXWkSGHLm\nFKCLexq/KuOdf31dXet9CJnosw6A8Xhl3iN4G1/1f8u810XMZRNcRmGxVTm0ocvR\nxhDmnVULOSWLSdJe7Fw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1514,
+          "comment" : "y-coordinate of the public key is large on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "308184024027d9c6c4db31aff288fa4e40159d6ee18c98139427484796f1f8745c9827dfc08d393abe144df6b7c12d48971fdd284b81e6e10860359ef71473b9e6bb84cb1e024007a0420c8a9b26911b63626540a85f60aa277afdef9990fc8dc1d3f1f2c5a927e1e4a29d81a701b48b366f000f962614899cbf193826ca8de4a425538de5ac62",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1515,
+          "comment" : "y-coordinate of the public key is large on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "308184024049542eec3b96c476b59b2b94d5fc7ee08fd2a1b1e732e6609098ab2a7f250452fbc1057a6d3feccbcaeb00468b26222eb48065fcaad7647681823860451e1e91024037db336dee1e45d9ace550053511c9c3755657e78eca108d3dfd1e68fe83da626b8dacbb19f0ee232b0f8bfe8ddbe7d5e98b7a2eccd03f375d164ce828631896",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1516,
+          "comment" : "y-coordinate of the public key is large on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "30818402404f90ceb76bc72f0cca10705d3badab6caa6019ef6bfe7de1b75951d517d2b16168515bf305f0006292e4900598256141e45c19077fa447dd5f32daa62c25081502406712a784102802821e9708e349d03a88297b374ef81a4edc35016524cd2a22afea7b8b3171de60ac1b3882533650586dcad338ea48231486e10e3120ce3d2a59",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040518ff14ba05188abed0a8c88db0f097b5660aac57e9a3cdbb9c833e2a7f9f613e49956b53a635952e29818e4a8015cb6a150cede636c2558f2d3602483963b99ed9fe842f3ed418462c63e266944ca2747e15bd8f52844d6a1ce9815210421206805c6ed792356ec57d79fa3e36fff23e2fc6370c67bc51d3f8b555c9048d6d",
+        "wx" : "518ff14ba05188abed0a8c88db0f097b5660aac57e9a3cdbb9c833e2a7f9f613e49956b53a635952e29818e4a8015cb6a150cede636c2558f2d3602483963b9",
+        "wy" : "09ed9fe842f3ed418462c63e266944ca2747e15bd8f52844d6a1ce9815210421206805c6ed792356ec57d79fa3e36fff23e2fc6370c67bc51d3f8b555c9048d6d"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200040518ff14ba05188abed0a8c88db0f097b5660aac57e9a3cdbb9c833e2a7f9f613e49956b53a635952e29818e4a8015cb6a150cede636c2558f2d3602483963b99ed9fe842f3ed418462c63e266944ca2747e15bd8f52844d6a1ce9815210421206805c6ed792356ec57d79fa3e36fff23e2fc6370c67bc51d3f8b555c9048d6d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEBRj/FLoFGIq+0KjIjbDwl7Vm\nCqxX6aPNu5yDPip/n2E+SZVrU6Y1lS4pgY5KgBXLahUM7eY2wlWPLTYCSDljuZ7Z\n/oQvPtQYRixj4maUTKJ0fhW9j1KETWoc6YFSEEISBoBcbteSNW7FfXn6Pjb/8j4v\nxjcMZ7xR0/i1VckEjW0=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1517,
+          "comment" : "x-coordinate of the public key has many trailing 1's on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "3081850240459e3e6e671a6c342d585db689043d32a494ce0039ee71ac67ed6ec0861908ebae6b2d6e4a67caa7a8f0576a49889a4a63d4b0b8aa8845c9cf785b49412a7071024100a5edd7abfce9d4413b22289397785b3d84b2c0d3719409255bb7128268e0bcd37d928bea5486bf56ffe259c7ec9f50b878e0155d73e3bde5cffe55e612f8d7b8",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1518,
+          "comment" : "x-coordinate of the public key has many trailing 1's on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "30818402401b2f7ea40960e37e28b556b7e446c4641e2f3d8a829dcc4a349553e42cf9ce6272dc9cdcda013e3981cb73b10d46321c80501d6a34ad7fd959a0c78f891f33f002407f195b7696edfc7687ff0126eaba13dad1e19563e8d395af32db3d6a7b4e82f28004501d92b7537da397845b7aa398a11051052e52264bd8cbcba9987ec6742b",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1519,
+          "comment" : "x-coordinate of the public key has many trailing 1's on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "30818402401b5c1d2b2b06591a1fa516cffa9c8a57cf1fffc22cecb7249281670bc23883a68553e0caf1edd9f1703a25b74e0000a37e32e6cc3576939f458c3dd5c4dbcc9c02404b23d7ed7f8a6b7ba7d22aefa8fde030ecb3f2fed4a5f26f12d59a29d63cdd0ec03fae557d141c7b0e8712c306b0eebbd0cab27696012062622bb180043034ba",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043f89e787b4d5d2599624513530e750ab3c5957dc9aa0e7b08a3e25356818e2037d062f336d4eed417c91bcb11b54b57d54a4f02a72fb74262f742cc6f34044013a448b8e2d0d5a7c5b4f1b9f5b701a9d21ff55e3678ca119b6d7c511ba0aef89f31aeb195db00f248359aee924e7c860b76845f6512a2a4aadc1287a15095220",
+        "wx" : "3f89e787b4d5d2599624513530e750ab3c5957dc9aa0e7b08a3e25356818e2037d062f336d4eed417c91bcb11b54b57d54a4f02a72fb74262f742cc6f3404401",
+        "wy" : "3a448b8e2d0d5a7c5b4f1b9f5b701a9d21ff55e3678ca119b6d7c511ba0aef89f31aeb195db00f248359aee924e7c860b76845f6512a2a4aadc1287a15095220"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200043f89e787b4d5d2599624513530e750ab3c5957dc9aa0e7b08a3e25356818e2037d062f336d4eed417c91bcb11b54b57d54a4f02a72fb74262f742cc6f34044013a448b8e2d0d5a7c5b4f1b9f5b701a9d21ff55e3678ca119b6d7c511ba0aef89f31aeb195db00f248359aee924e7c860b76845f6512a2a4aadc1287a15095220",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEP4nnh7TV0lmWJFE1MOdQqzxZ\nV9yaoOewij4lNWgY4gN9Bi8zbU7tQXyRvLEbVLV9VKTwKnL7dCYvdCzG80BEATpE\ni44tDVp8W08bn1twGp0h/1XjZ4yhGbbXxRG6Cu+J8xrrGV2wDySDWa7pJOfIYLdo\nRfZRKipKrcEoehUJUiA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1520,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "308186024100a952847acf213c86e231316d8f9130f7cbdf7f3952307a577076342d13939b4ab5a1313b34abb89204d3fd1f873885fffa683c5a493e5461c7f1400af86ae7fe0241009a65a8a4150de593b29642b988b2ec2e23e15e156ecf0af5fde2fbd73208f69f2506d141e0b47c0e1f2fa09ef26b389a6bd2b0230930a16fd119767e382724b5",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1521,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "308185024051bfb80aae30262a67bf0771a6b8d195e59aa04e87bd060fe5a9bd56d35385a5fc3da5dfc3ae8c67dbd408184482855e3563dedee72a21b60fafd73819aa837c024100807f0d69385467ad6cd8a44d482ca3b6e18f7b352ef19a2bc980500b6d59045f0d6f7ab7e414c50d2b68d7f6e6c01d3e8353cdfd475f249b31842fe59955f414",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1522,
+          "comment" : "y-coordinate of the public key has many trailing 0's on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "30818402404e8711b00de355f14c8eb91959c13c77f9155754765f10f2aaa8fdad6a14c6a4e62c5ed48a9d8ca403c902db0c2c0735426b33e67828ac32ae19b84e6598681902407d104ae5e5d0da26cb427d7951d40df429b4205086e633b800d7d7b8bde48a9bec4e43ddeb4226192b5c9b30ffa3efa7d2385ab28a190c165fb2a2c58572c2a2",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "brainpoolP512r1",
+        "keySize" : 512,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047860a4743bb48e7793c7f1416fbac6ca0b538210d743f24976af3efda97f28bc95913401ec4ca5e744a23d1a552653ff110ec8421b3de531f3bacda07bfb09d603662f2f2475bbf5e20da48b50169d289c89c54ed0f97bbbc7f38016f1a955cb74c52727ef802055ea090fe1a49be58ddc6083bca3f7c02ff644775cd0027f06",
+        "wx" : "7860a4743bb48e7793c7f1416fbac6ca0b538210d743f24976af3efda97f28bc95913401ec4ca5e744a23d1a552653ff110ec8421b3de531f3bacda07bfb09d6",
+        "wy" : "3662f2f2475bbf5e20da48b50169d289c89c54ed0f97bbbc7f38016f1a955cb74c52727ef802055ea090fe1a49be58ddc6083bca3f7c02ff644775cd0027f06"
+      },
+      "keyDer" : "30819b301406072a8648ce3d020106092b240303020801010d03818200047860a4743bb48e7793c7f1416fbac6ca0b538210d743f24976af3efda97f28bc95913401ec4ca5e744a23d1a552653ff110ec8421b3de531f3bacda07bfb09d603662f2f2475bbf5e20da48b50169d289c89c54ed0f97bbbc7f38016f1a955cb74c52727ef802055ea090fe1a49be58ddc6083bca3f7c02ff644775cd0027f06",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEeGCkdDu0jneTx/FBb7rGygtT\nghDXQ/JJdq8+/al/KLyVkTQB7Eyl50SiPRpVJlP/EQ7IQhs95THzus2ge/sJ1gNm\nLy8kdbv14g2ki1AWnSicicVO0Pl7u8fzgBbxqVXLdMUnJ++AIFXqCQ/hpJvljdxg\ng7yj98Av9kR3XNACfwY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1523,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "30818402404cd61754211d222371e552578ff705cc819a2f9fb2729f05d848caabf44a31fda1bd038f1b87efd28a8ce53222fdfec18d5929df926df27c2c7e7360bc5c0c7002405ce94c851db1807dc79dcc087c0830d70a0069cf52baffaf347aefa1ddba77f6f770c1483fdde38f5d74bdb32372e12fee843efff0f2dc9344ca1e3b26b9b051",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1524,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "308185024048b4bde7befb1b1cad50cee6233cbf32812860c81d7ad5b0e9d6377202bcd34827c534da0ac9646ae0154689e38c608894bb3126e1025f69c824c69ab821274a0241008369f5840f776668ebb435b33be05dce4adfabb8860ccc900d07db006a50195fd4de98632192fbe7319cedff26aa8682cf7bf5f1c02e58b9c163236103d9b314",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        },
+        {
+          "tcId" : 1525,
+          "comment" : "y-coordinate of the public key has many trailing 1's on brainpoolP512t1",
+          "msg" : "4d657373616765",
+          "sig" : "308185024019524b15cf4ecb400b938ef5f752b86ec8f07c5903da5dba9c91ab7965b1223a8e262bef8cca8973ed98797f37a35e1c5999cf203e610ef773c6aa2786bba06402410098cf7526f5a24a0e2f22f909f8190b13130451b15dd6774bdea9d929342d924bc7eba1df89919c1b9aee8d09203606d10cebff89904cb7e71a82d8972d755306",
+          "result" : "valid",
+          "flags" : [
+            "GroupIsomorphism"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/ecdsa_webcrypto_test.json b/third_party/wycheproof/testvectors/ecdsa_webcrypto_test.json
new file mode 100644
index 0000000..ff2afaf
--- /dev/null
+++ b/third_party/wycheproof/testvectors/ecdsa_webcrypto_test.json
@@ -0,0 +1,6531 @@
+{
+  "algorithm" : "ECDSA",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "EdgeCase" : "Edge case values such as r=1 and s=0 can lead to forgeries if the ECDSA implementation does not check boundaries and computes s^(-1)==0.",
+    "PointDuplication" : "Some implementations of ECDSA do not handle duplication and points at infinity correctly. This is a test vector that has been specially crafted to check for such an omission.",
+    "SigSize" : "The size of the signature should always be twice the number of bytes of the size of the order. But some libraries accept signatures with less bytes.",
+    "WeakHash" : "The security strength of the hash function used in this signature is weaker than then strength of the EC parameters. Such choices are disallowed in FIPS PUB 186-4 Section 6.1.1. However, it is unclear whether a library should reject such parameter choices."
+  },
+  "numberOfTests" : 336,
+  "header" : [],
+  "testGroups" : [
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "KSexBRK64-3c_kZ4KBKLrSkDJpkZ9whgacjE32xzKDg",
+        "y" : "x3h5ZOqsAOWSH7FJimD0YGdms9loUAFVjRqXTnNBUT4"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e",
+        "wx" : "2927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838",
+        "wy" : "0c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042927b10512bae3eddcfe467828128bad2903269919f7086069c8c4df6c732838c7787964eaac00e5921fb1498a60f4606766b3d9685001558d1a974e7341513e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKSexBRK64+3c/kZ4KBKLrSkDJpkZ\n9whgacjE32xzKDjHeHlk6qwA5ZIfsUmKYPRgZ2az2WhQAVWNGpdOc0FRPg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "signature malleability",
+          "msg" : "313233343030",
+          "sig" : "2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e184cd60b855d442f5b3c7b11eb6c4e0ae7525fe710fab9aa7c77a67f79e6fadd76",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "012ba3a8bd6b94d5ed80a6d9d1190a436ebccc0833490686deac8635bcb9bf536900b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "d45c5740946b2a147f59262ee6f5bc90bd01ed280528b62b3aed5fc93f06f739b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "012ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1800b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "d45c5741946b2a137f59262ee6f5bc91001af27a5e1117a64733950642a3d1e8b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "002ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1801b329f478a2bbd0a6c384ee1493b1f518276e0e4a5375928d6fcd160c11cb6d2c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "002ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e1801b329f479a2bbd0a5c384ee1493b1f5186a87139cac5df4087c134b49156847db",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "Modified r or s, e.g. by adding or subtracting the order of the group",
+          "msg" : "313233343030",
+          "sig" : "2ba3a8be6b94d5ec80a6d9d1190a436effe50d85a1eee859b8cc6af9bd5c2e184cd60b865d442f5a3c7b11eb6c4e0ae79578ec6353a20bf783ecb4b6ea97b825",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 10,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 11,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 12,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 13,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 14,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 15,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 16,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 17,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 18,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000001ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 19,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000001ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 20,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000001ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 21,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000001ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 22,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000001ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 23,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 24,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325510000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 25,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 26,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 27,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 28,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 29,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 30,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325500000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 31,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325500000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 32,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 33,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 34,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 35,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 36,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 37,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325520000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 38,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325520000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 39,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 40,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 41,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 42,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 43,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 44,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 45,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000001000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 46,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000001000000000000000000000000ffffffffffffffffffffffffffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 47,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000001000000000000000000000000ffffffffffffffffffffffffffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 48,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000001000000000000000000000000ffffffffffffffffffffffffffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 49,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000001000000000000000000000000ffffffffffffffffffffffffffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 50,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000001000000000000000000000000ffffffffffffffffffffffffffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 51,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff000000010000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 52,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff000000010000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 53,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000001000000000000000000000001000000000000000000000000ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 54,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000001000000000000000000000001000000000000000000000000ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632550",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 55,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000001000000000000000000000001000000000000000000000000ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632552",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 56,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000001000000000000000000000001000000000000000000000000ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 57,
+          "comment" : "Signature with special case values for r and s",
+          "msg" : "313233343030",
+          "sig" : "ffffffff00000001000000000000000000000001000000000000000000000000ffffffff00000001000000000000000000000001000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "EdgeCase"
+          ]
+        },
+        {
+          "tcId" : 58,
+          "comment" : "Edge case for Shamir multiplication",
+          "msg" : "3639383139",
+          "sig" : "64a1aab5000d0e804f3e2fc02bdee9be8ff312334e2ba16d11547c97711c898e6af015971cc30be6d1a206d4e013e0997772a2f91d73286ffd683b9bb2cf4f1b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "special case hash",
+          "msg" : "343236343739373234",
+          "sig" : "16aea964a2f6506d6f78c81c91fc7e8bded7d397738448de1e19a0ec580bf266252cd762130c6667cfe8b7bc47d27d78391e8e80c578d1cd38c3ff033be928e9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "special case hash",
+          "msg" : "37313338363834383931",
+          "sig" : "9cc98be2347d469bf476dfc26b9b733df2d26d6ef524af917c665baccb23c882093496459effe2d8d70727b82462f61d0ec1b7847929d10ea631dacb16b56c32",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "special case hash",
+          "msg" : "3130333539333331363638",
+          "sig" : "73b3c90ecd390028058164524dde892703dce3dea0d53fa8093999f07ab8aa432f67b0b8e20636695bb7d8bf0a651c802ed25a395387b5f4188c0c4075c88634",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "special case hash",
+          "msg" : "33393439343031323135",
+          "sig" : "bfab3098252847b328fadf2f89b95c851a7f0eb390763378f37e90119d5ba3ddbdd64e234e832b1067c2d058ccb44d978195ccebb65c2aaf1e2da9b8b4987e3b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "special case hash",
+          "msg" : "31333434323933303739",
+          "sig" : "204a9784074b246d8bf8bf04a4ceb1c1f1c9aaab168b1596d17093c5cd21d2cd51cce41670636783dc06a759c8847868a406c2506fe17975582fe648d1d88b52",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "special case hash",
+          "msg" : "33373036323131373132",
+          "sig" : "ed66dc34f551ac82f63d4aa4f81fe2cb0031a91d1314f835027bca0f1ceeaa0399ca123aa09b13cd194a422e18d5fda167623c3f6e5d4d6abb8953d67c0c48c7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "special case hash",
+          "msg" : "333433363838373132",
+          "sig" : "060b700bef665c68899d44f2356a578d126b062023ccc3c056bf0f60a237012b8d186c027832965f4fcc78a3366ca95dedbb410cbef3f26d6be5d581c11d3610",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "special case hash",
+          "msg" : "31333531353330333730",
+          "sig" : "9f6adfe8d5eb5b2c24d7aa7934b6cf29c93ea76cd313c9132bb0c8e38c96831db26a9c9e40e55ee0890c944cf271756c906a33e66b5bd15e051593883b5e9902",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "special case hash",
+          "msg" : "36353533323033313236",
+          "sig" : "a1af03ca91677b673ad2f33615e56174a1abf6da168cebfa8868f4ba273f16b720aa73ffe48afa6435cd258b173d0c2377d69022e7d098d75caf24c8c5e06b1c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "special case hash",
+          "msg" : "31353634333436363033",
+          "sig" : "fdc70602766f8eed11a6c99a71c973d5659355507b843da6e327a28c11893db93df5349688a085b137b1eacf456a9e9e0f6d15ec0078ca60a7f83f2b10d21350",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "special case hash",
+          "msg" : "34343239353339313137",
+          "sig" : "b516a314f2fce530d6537f6a6c49966c23456f63c643cf8e0dc738f7b876e675d39ffd033c92b6d717dd536fbc5efdf1967c4bd80954479ba66b0120cd16fff2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "special case hash",
+          "msg" : "3130393533323631333531",
+          "sig" : "3b2cbf046eac45842ecb7984d475831582717bebb6492fd0a485c101e29ff0a84c9b7b47a98b0f82de512bc9313aaf51701099cac5f76e68c8595fc1c1d99258",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "special case hash",
+          "msg" : "35393837333530303431",
+          "sig" : "30c87d35e636f540841f14af54e2f9edd79d0312cfa1ab656c3fb15bfde48dcf47c15a5a82d24b75c85a692bd6ecafeb71409ede23efd08e0db9abf6340677ed",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "special case hash",
+          "msg" : "33343633303036383738",
+          "sig" : "38686ff0fda2cef6bc43b58cfe6647b9e2e8176d168dec3c68ff262113760f52067ec3b651f422669601662167fa8717e976e2db5e6a4cf7c2ddabb3fde9d67d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "special case hash",
+          "msg" : "39383137333230323837",
+          "sig" : "44a3e23bf314f2b344fc25c7f2de8b6af3e17d27f5ee844b225985ab6e2775cf2d48e223205e98041ddc87be532abed584f0411f5729500493c9cc3f4dd15e86",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "special case hash",
+          "msg" : "33323232303431303436",
+          "sig" : "2ded5b7ec8e90e7bf11f967a3d95110c41b99db3b5aa8d330eb9d638781688e97d5792c53628155e1bfc46fb1a67e3088de049c328ae1f44ec69238a009808f9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "special case hash",
+          "msg" : "36363636333037313034",
+          "sig" : "bdae7bcb580bf335efd3bc3d31870f923eaccafcd40ec2f605976f15137d8b8ff6dfa12f19e525270b0106eecfe257499f373a4fb318994f24838122ce7ec3c7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "special case hash",
+          "msg" : "31303335393531383938",
+          "sig" : "50f9c4f0cd6940e162720957ffff513799209b78596956d21ece251c2401f1c6d7033a0a787d338e889defaaabb106b95a4355e411a59c32aa5167dfab244726",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "special case hash",
+          "msg" : "31383436353937313935",
+          "sig" : "f612820687604fa01906066a378d67540982e29575d019aabe90924ead5c860d3f9367702dd7dd4f75ea98afd20e328a1a99f4857b316525328230ce294b0fef",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "special case hash",
+          "msg" : "33313336303436313839",
+          "sig" : "9505e407657d6e8bc93db5da7aa6f5081f61980c1949f56b0f2f507da5782a7ac60d31904e3669738ffbeccab6c3656c08e0ed5cb92b3cfa5e7f71784f9c5021",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "special case hash",
+          "msg" : "32363633373834323534",
+          "sig" : "bbd16fbbb656b6d0d83e6a7787cd691b08735aed371732723e1c68a40404517d9d8e35dba96028b7787d91315be675877d2d097be5e8ee34560e3e7fd25c0f00",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "special case hash",
+          "msg" : "31363532313030353234",
+          "sig" : "2ec9760122db98fd06ea76848d35a6da442d2ceef7559a30cf57c61e92df327e7ab271da90859479701fccf86e462ee3393fb6814c27b760c4963625c0a19878",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "special case hash",
+          "msg" : "35373438303831363936",
+          "sig" : "54e76b7683b6650baa6a7fc49b1c51eed9ba9dd463221f7a4f1005a89fe00c592ea076886c773eb937ec1cc8374b7915cfd11b1c1ae1166152f2f7806a31c8fd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "special case hash",
+          "msg" : "36333433393133343638",
+          "sig" : "5291deaf24659ffbbce6e3c26f6021097a74abdbb69be4fb10419c0c496c946665d6fcf336d27cc7cdb982bb4e4ecef5827f84742f29f10abf83469270a03dc3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "special case hash",
+          "msg" : "31353431313033353938",
+          "sig" : "207a3241812d75d947419dc58efb05e8003b33fc17eb50f9d15166a88479f107cdee749f2e492b213ce80b32d0574f62f1c5d70793cf55e382d5caadf7592767",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "special case hash",
+          "msg" : "3130343738353830313238",
+          "sig" : "6554e49f82a855204328ac94913bf01bbe84437a355a0a37c0dee3cf81aa7728aea00de2507ddaf5c94e1e126980d3df16250a2eaebc8be486effe7f22b4f929",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "special case hash",
+          "msg" : "3130353336323835353638",
+          "sig" : "a54c5062648339d2bff06f71c88216c26c6e19b4d80a8c602990ac82707efdfce99bbe7fcfafae3e69fd016777517aa01056317f467ad09aff09be73c9731b0d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "special case hash",
+          "msg" : "393533393034313035",
+          "sig" : "975bd7157a8d363b309f1f444012b1a1d23096593133e71b4ca8b059cff37eaf7faa7a28b1c822baa241793f2abc930bd4c69840fe090f2aacc46786bf919622",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "special case hash",
+          "msg" : "393738383438303339",
+          "sig" : "5694a6f84b8f875c276afd2ebcfe4d61de9ec90305afb1357b95b3e0da43885e0dffad9ffd0b757d8051dec02ebdf70d8ee2dc5c7870c0823b6ccc7c679cbaa4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "special case hash",
+          "msg" : "33363130363732343432",
+          "sig" : "a0c30e8026fdb2b4b4968a27d16a6d08f7098f1a98d21620d7454ba9790f1ba65e470453a8a399f15baf463f9deceb53acc5ca64459149688bd2760c65424339",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "special case hash",
+          "msg" : "31303534323430373035",
+          "sig" : "614ea84acf736527dd73602cd4bb4eea1dfebebd5ad8aca52aa0228cf7b99a88737cc85f5f2d2f60d1b8183f3ed490e4de14368e96a9482c2a4dd193195c902f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "special case hash",
+          "msg" : "35313734343438313937",
+          "sig" : "bead6734ebe44b810d3fb2ea00b1732945377338febfd439a8d74dfbd0f942fa6bb18eae36616a7d3cad35919fd21a8af4bbe7a10f73b3e036a46b103ef56e2a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "special case hash",
+          "msg" : "31393637353631323531",
+          "sig" : "499625479e161dacd4db9d9ce64854c98d922cbf212703e9654fae182df9bad242c177cf37b8193a0131108d97819edd9439936028864ac195b64fca76d9d693",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "special case hash",
+          "msg" : "33343437323533333433",
+          "sig" : "08f16b8093a8fb4d66a2c8065b541b3d31e3bfe694f6b89c50fb1aaa6ff6c9b29d6455e2d5d1779748573b611cb95d4a21f967410399b39b535ba3e5af81ca2e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "special case hash",
+          "msg" : "333638323634333138",
+          "sig" : "be26231b6191658a19dd72ddb99ed8f8c579b6938d19bce8eed8dc2b338cb5f8e1d9a32ee56cffed37f0f22b2dcb57d5c943c14f79694a03b9c5e96952575c89",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "special case hash",
+          "msg" : "33323631313938363038",
+          "sig" : "15e76880898316b16204ac920a02d58045f36a229d4aa4f812638c455abe0443e74d357d3fcb5c8c5337bd6aba4178b455ca10e226e13f9638196506a1939123",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "special case hash",
+          "msg" : "39363738373831303934",
+          "sig" : "352ecb53f8df2c503a45f9846fc28d1d31e6307d3ddbffc1132315cc07f16dad1348dfa9c482c558e1d05c5242ca1c39436726ecd28258b1899792887dd0a3c6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "special case hash",
+          "msg" : "34393538383233383233",
+          "sig" : "4a40801a7e606ba78a0da9882ab23c7677b8642349ed3d652c5bfa5f2a9558fb3a49b64848d682ef7f605f2832f7384bdc24ed2925825bf8ea77dc5981725782",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "special case hash",
+          "msg" : "383234363337383337",
+          "sig" : "eacc5e1a8304a74d2be412b078924b3bb3511bac855c05c9e5e9e44df3d61e967451cd8e18d6ed1885dd827714847f96ec4bb0ed4c36ce9808db8f714204f6d1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "special case hash",
+          "msg" : "3131303230383333373736",
+          "sig" : "2f7a5e9e5771d424f30f67fdab61e8ce4f8cd1214882adb65f7de94c31577052ac4e69808345809b44acb0b2bd889175fb75dd050c5a449ab9528f8f78daa10c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "special case hash",
+          "msg" : "313333383731363438",
+          "sig" : "ffcda40f792ce4d93e7e0f0e95e1a2147dddd7f6487621c30a03d710b330021979938b55f8a17f7ed7ba9ade8f2065a1fa77618f0b67add8d58c422c2453a49a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "special case hash",
+          "msg" : "333232313434313632",
+          "sig" : "81f2359c4faba6b53d3e8c8c3fcc16a948350f7ab3a588b28c17603a431e39a8cd6f6a5cc3b55ead0ff695d06c6860b509e46d99fccefb9f7f9e101857f74300",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "special case hash",
+          "msg" : "3130363836363535353436",
+          "sig" : "dfc8bf520445cbb8ee1596fb073ea283ea130251a6fdffa5c3f5f2aaf75ca808048e33efce147c9dd92823640e338e68bfd7d0dc7a4905b3a7ac711e577e90e7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "special case hash",
+          "msg" : "3632313535323436",
+          "sig" : "ad019f74c6941d20efda70b46c53db166503a0e393e932f688227688ba6a576293320eb7ca0710255346bdbb3102cdcf7964ef2e0988e712bc05efe16c199345",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "special case hash",
+          "msg" : "37303330383138373734",
+          "sig" : "ac8096842e8add68c34e78ce11dd71e4b54316bd3ebf7fffdeb7bd5a3ebc1883f5ca2f4f23d674502d4caf85d187215d36e3ce9f0ce219709f21a3aac003b7a8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "special case hash",
+          "msg" : "35393234353233373434",
+          "sig" : "677b2d3a59b18a5ff939b70ea002250889ddcd7b7b9d776854b4943693fb92f76b4ba856ade7677bf30307b21f3ccda35d2f63aee81efd0bab6972cc0795db55",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "special case hash",
+          "msg" : "31343935353836363231",
+          "sig" : "479e1ded14bcaed0379ba8e1b73d3115d84d31d4b7c30e1f05e1fc0d5957cfb0918f79e35b3d89487cf634a4f05b2e0c30857ca879f97c771e877027355b2443",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "special case hash",
+          "msg" : "34303035333134343036",
+          "sig" : "43dfccd0edb9e280d9a58f01164d55c3d711e14b12ac5cf3b64840ead512a0a31dbe33fa8ba84533cd5c4934365b3442ca1174899b78ef9a3199f49584389772",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "special case hash",
+          "msg" : "33303936343537353132",
+          "sig" : "5b09ab637bd4caf0f4c7c7e4bca592fea20e9087c259d26a38bb4085f0bbff1145b7eb467b6748af618e9d80d6fdcd6aa24964e5a13f885bca8101de08eb0d75",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "special case hash",
+          "msg" : "32373834303235363230",
+          "sig" : "5e9b1c5a028070df5728c5c8af9b74e0667afa570a6cfa0114a5039ed15ee06fb1360907e2d9785ead362bb8d7bd661b6c29eeffd3c5037744edaeb9ad990c20",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "special case hash",
+          "msg" : "32363138373837343138",
+          "sig" : "0671a0a85c2b72d54a2fb0990e34538b4890050f5a5712f6d1a7a5fb8578f32edb1846bab6b7361479ab9c3285ca41291808f27fd5bd4fdac720e5854713694c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "special case hash",
+          "msg" : "31363432363235323632",
+          "sig" : "7673f8526748446477dbbb0590a45492c5d7d69859d301abbaedb35b2095103a3dc70ddf9c6b524d886bed9e6af02e0e4dec0d417a414fed3807ef4422913d7c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "special case hash",
+          "msg" : "36383234313839343336",
+          "sig" : "7f085441070ecd2bb21285089ebb1aa6450d1a06c36d3ff39dfd657a796d12b5249712012029870a2459d18d47da9aa492a5e6cb4b2d8dafa9e4c5c54a2b9a8b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "special case hash",
+          "msg" : "343834323435343235",
+          "sig" : "914c67fb61dd1e27c867398ea7322d5ab76df04bc5aa6683a8e0f30a5d287348fa07474031481dda4953e3ac1959ee8cea7e66ec412b38d6c96d28f6d37304ea",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "1wXRb4CYfi2bGmlX0pziL-v30Q-lFRUxgkFcg2G6rKQ",
+        "y" : "sfwQXuXOgNUU7BI4vq4gN6b4NiVZNiDUYIGehoIWCSY"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d705d16f80987e2d9b1a6957d29ce22febf7d10fa515153182415c8361baaca4b1fc105ee5ce80d514ec1238beae2037a6f83625593620d460819e8682160926",
+        "wx" : "0d705d16f80987e2d9b1a6957d29ce22febf7d10fa515153182415c8361baaca4",
+        "wy" : "0b1fc105ee5ce80d514ec1238beae2037a6f83625593620d460819e8682160926"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d705d16f80987e2d9b1a6957d29ce22febf7d10fa515153182415c8361baaca4b1fc105ee5ce80d514ec1238beae2037a6f83625593620d460819e8682160926",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1wXRb4CYfi2bGmlX0pziL+v30Q+l\nFRUxgkFcg2G6rKSx/BBe5c6A1RTsEji+riA3pvg2JVk2INRggZ6GghYJJg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 113,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "54657374",
+          "sig" : "000000000000000000000000000000004319055358e8617b0c46353d039cdaabffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "r too large",
+          "msg" : "54657374",
+          "sig" : "ffffffff00000001000000000000000000000000fffffffffffffffffffffffcffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "PNjS-B1pU7CETAnXtWDVJ80u9nBWiT6tr6UshQE4fVk",
+        "y" : "7kH9tNEEAs56DF47dHrfo6SQtiprdxkGiQNIXAu23C0"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043cd8d2f81d6953b0844c09d7b560d527cd2ef67056893eadafa52c8501387d59ee41fdb4d10402ce7a0c5e3b747adfa3a490b62a6b7719068903485c0bb6dc2d",
+        "wx" : "3cd8d2f81d6953b0844c09d7b560d527cd2ef67056893eadafa52c8501387d59",
+        "wy" : "0ee41fdb4d10402ce7a0c5e3b747adfa3a490b62a6b7719068903485c0bb6dc2d"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cd8d2f81d6953b0844c09d7b560d527cd2ef67056893eadafa52c8501387d59ee41fdb4d10402ce7a0c5e3b747adfa3a490b62a6b7719068903485c0bb6dc2d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPNjS+B1pU7CETAnXtWDVJ80u9nBW\niT6tr6UshQE4fVnuQf200QQCznoMXjt0et+jpJC2Kmt3GQaJA0hcC7bcLQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 115,
+          "comment" : "r,s are large",
+          "msg" : "54657374",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "gkDNge3ZHLaTYTNQjDkVEA6B8zLEVF1BGJtIEZaFE3g",
+        "y" : "4FsG5y1KG_-A6l21FKovk-pt1tnArie3g33EMvnOidk"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048240cd81edd91cb6936133508c3915100e81f332c4545d41189b481196851378e05b06e72d4a1bff80ea5db514aa2f93ea6dd6d9c0ae27b7837dc432f9ce89d9",
+        "wx" : "08240cd81edd91cb6936133508c3915100e81f332c4545d41189b481196851378",
+        "wy" : "0e05b06e72d4a1bff80ea5db514aa2f93ea6dd6d9c0ae27b7837dc432f9ce89d9"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048240cd81edd91cb6936133508c3915100e81f332c4545d41189b481196851378e05b06e72d4a1bff80ea5db514aa2f93ea6dd6d9c0ae27b7837dc432f9ce89d9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEgkDNge3ZHLaTYTNQjDkVEA6B8zLE\nVF1BGJtIEZaFE3jgWwbnLUob/4DqXbUUqi+T6m3W2cCuJ7eDfcQy+c6J2Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 116,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd909135bdb6799286170f5ead2de4f6511453fe50914f3df2de54a36383df8dd4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "sGKUc1Z0iw_BfxcExlqh3Kbhv-Z3l1b6YW2R6q0T3yw",
+        "y" : "CzjBfz0GcudAnPxZkqmf_xK4Sk-EMik7QxET8bL7V50"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b062947356748b0fc17f1704c65aa1dca6e1bfe6779756fa616d91eaad13df2c0b38c17f3d0672e7409cfc5992a99fff12b84a4f8432293b431113f1b2fb579d",
+        "wx" : "0b062947356748b0fc17f1704c65aa1dca6e1bfe6779756fa616d91eaad13df2c",
+        "wy" : "0b38c17f3d0672e7409cfc5992a99fff12b84a4f8432293b431113f1b2fb579d"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b062947356748b0fc17f1704c65aa1dca6e1bfe6779756fa616d91eaad13df2c0b38c17f3d0672e7409cfc5992a99fff12b84a4f8432293b431113f1b2fb579d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEsGKUc1Z0iw/BfxcExlqh3Kbhv+Z3\nl1b6YW2R6q0T3ywLOMF/PQZy50Cc/FmSqZ//ErhKT4QyKTtDERPxsvtXnQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 117,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd27b4577ca009376f71303fd5dd227dcef5deb773ad5f5a84360644669ca249a5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "SgPvn5LrJoyvpgEHJImlY4D6DcQxcddxKBOzoZoeteU",
+        "y" : "PiE-KKYIzpovShf9gwxmVAGKebPgJj2RqLqQYi328vA"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044a03ef9f92eb268cafa601072489a56380fa0dc43171d7712813b3a19a1eb5e53e213e28a608ce9a2f4a17fd830c6654018a79b3e0263d91a8ba90622df6f2f0",
+        "wx" : "4a03ef9f92eb268cafa601072489a56380fa0dc43171d7712813b3a19a1eb5e5",
+        "wy" : "3e213e28a608ce9a2f4a17fd830c6654018a79b3e0263d91a8ba90622df6f2f0"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044a03ef9f92eb268cafa601072489a56380fa0dc43171d7712813b3a19a1eb5e53e213e28a608ce9a2f4a17fd830c6654018a79b3e0263d91a8ba90622df6f2f0",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAESgPvn5LrJoyvpgEHJImlY4D6DcQx\ncddxKBOzoZoeteU+IT4opgjOmi9KF/2DDGZUAYp5s+AmPZGoupBiLfby8A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 118,
+          "comment" : "small r and s",
+          "msg" : "54657374",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "incorrect size of signature",
+          "msg" : "54657374",
+          "sig" : "0501",
+          "result" : "acceptable",
+          "flags" : [
+            "SigSize"
+          ]
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "CRGUwcuhfzTihrSDNwFgakHO8mF3raiFC2AeofhZ5wE",
+        "y" : "JyQvzscIgodYQDzi_lAZg6eYTmIJ9Na5Xbmtd3Z_Ves"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04091194c1cba17f34e286b4833701606a41cef26177ada8850b601ea1f859e70127242fcec708828758403ce2fe501983a7984e6209f4d6b95db9ad77767f55eb",
+        "wx" : "091194c1cba17f34e286b4833701606a41cef26177ada8850b601ea1f859e701",
+        "wy" : "27242fcec708828758403ce2fe501983a7984e6209f4d6b95db9ad77767f55eb"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004091194c1cba17f34e286b4833701606a41cef26177ada8850b601ea1f859e70127242fcec708828758403ce2fe501983a7984e6209f4d6b95db9ad77767f55eb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECRGUwcuhfzTihrSDNwFgakHO8mF3\nraiFC2AeofhZ5wEnJC/OxwiCh1hAPOL+UBmDp5hOYgn01rldua13dn9V6w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 120,
+          "comment" : "small r and s",
+          "msg" : "54657374",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "incorrect size of signature",
+          "msg" : "54657374",
+          "sig" : "0503",
+          "result" : "acceptable",
+          "flags" : [
+            "SigSize"
+          ]
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "EDxuzO_1nnHqj1b-46SysUjoHCvb3TnBlYEsltz7Qac",
+        "y" : "IwOhk9xZG-FQuIPXcOxR67TrzosJBCwuyxbESNjle_U"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04103c6ecceff59e71ea8f56fee3a4b2b148e81c2bdbdd39c195812c96dcfb41a72303a193dc591be150b883d770ec51ebb4ebce8b09042c2ecb16c448d8e57bf5",
+        "wx" : "103c6ecceff59e71ea8f56fee3a4b2b148e81c2bdbdd39c195812c96dcfb41a7",
+        "wy" : "2303a193dc591be150b883d770ec51ebb4ebce8b09042c2ecb16c448d8e57bf5"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004103c6ecceff59e71ea8f56fee3a4b2b148e81c2bdbdd39c195812c96dcfb41a72303a193dc591be150b883d770ec51ebb4ebce8b09042c2ecb16c448d8e57bf5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEEDxuzO/1nnHqj1b+46SysUjoHCvb\n3TnBlYEsltz7QacjA6GT3Fkb4VC4g9dw7FHrtOvOiwkELC7LFsRI2OV79Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 122,
+          "comment" : "small r and s",
+          "msg" : "54657374",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "incorrect size of signature",
+          "msg" : "54657374",
+          "sig" : "0505",
+          "result" : "acceptable",
+          "flags" : [
+            "SigSize"
+          ]
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "O2a4Kf5gRji8sr_owiIovmc5DCARG9K0UUaJJ-h_tuo",
+        "y" : "vI5ZwAk2F1iydLosrTa1j95IWj7Qna3nZxL6npxKwhI"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043b66b829fe604638bcb2bfe8c22228be67390c20111bd2b451468927e87fb6eabc8e59c009361758b274ba2cad36b58fde485a3ed09dade76712fa9e9c4ac212",
+        "wx" : "3b66b829fe604638bcb2bfe8c22228be67390c20111bd2b451468927e87fb6ea",
+        "wy" : "0bc8e59c009361758b274ba2cad36b58fde485a3ed09dade76712fa9e9c4ac212"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043b66b829fe604638bcb2bfe8c22228be67390c20111bd2b451468927e87fb6eabc8e59c009361758b274ba2cad36b58fde485a3ed09dade76712fa9e9c4ac212",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEO2a4Kf5gRji8sr/owiIovmc5DCAR\nG9K0UUaJJ+h/tuq8jlnACTYXWLJ0uiytNrWP3khaPtCdrednEvqenErCEg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 124,
+          "comment" : "small r and s",
+          "msg" : "54657374",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "incorrect size of signature",
+          "msg" : "54657374",
+          "sig" : "0506",
+          "result" : "acceptable",
+          "flags" : [
+            "SigSize"
+          ]
+        },
+        {
+          "tcId" : 126,
+          "comment" : "r is larger than n",
+          "msg" : "54657374",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6325560000000000000000000000000000000000000000000000000000000000000006",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "T_L2wk5KM81xwJ_cvHSmIzlhuHS4yODrlFggksvFDDA",
+        "y" : "hPqVR6_aXGYzXz-TfUx5r6EgSGtTQTnVmugtYerSZCA"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044ff2f6c24e4a33cd71c09fdcbc74a6233961b874b8c8e0eb94582092cbc50c3084fa9547afda5c66335f3f937d4c79afa120486b534139d59ae82d61ead26420",
+        "wx" : "4ff2f6c24e4a33cd71c09fdcbc74a6233961b874b8c8e0eb94582092cbc50c30",
+        "wy" : "084fa9547afda5c66335f3f937d4c79afa120486b534139d59ae82d61ead26420"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044ff2f6c24e4a33cd71c09fdcbc74a6233961b874b8c8e0eb94582092cbc50c3084fa9547afda5c66335f3f937d4c79afa120486b534139d59ae82d61ead26420",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAET/L2wk5KM81xwJ/cvHSmIzlhuHS4\nyODrlFggksvFDDCE+pVHr9pcZjNfP5N9THmvoSBIa1NBOdWa6C1h6tJkIA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 127,
+          "comment" : "s is larger than n",
+          "msg" : "54657374",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000005ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc75fbd8",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "hLlZCAuzCFnNU8L7lzzxTWDNqo7gBYeIm1vGV6xYgXU",
+        "y" : "oCzlweU8sZYRPHi0y43H02Dl6nhQsPZlCwxFryw818o"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0484b959080bb30859cd53c2fb973cf14d60cdaa8ee00587889b5bc657ac588175a02ce5c1e53cb196113c78b4cb8dc7d360e5ea7850b0f6650b0c45af2c3cd7ca",
+        "wx" : "084b959080bb30859cd53c2fb973cf14d60cdaa8ee00587889b5bc657ac588175",
+        "wy" : "0a02ce5c1e53cb196113c78b4cb8dc7d360e5ea7850b0f6650b0c45af2c3cd7ca"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000484b959080bb30859cd53c2fb973cf14d60cdaa8ee00587889b5bc657ac588175a02ce5c1e53cb196113c78b4cb8dc7d360e5ea7850b0f6650b0c45af2c3cd7ca",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhLlZCAuzCFnNU8L7lzzxTWDNqo7g\nBYeIm1vGV6xYgXWgLOXB5TyxlhE8eLTLjcfTYOXqeFCw9mULDEWvLDzXyg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 128,
+          "comment" : "small r and s^-1",
+          "msg" : "54657374",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000001008f1e3c7862c58b16bb76eddbb76eddbb516af4f63f2d74d76e0d28c9bb75ea88",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "30CDvW7L2lp3rleOXYNfp_dKB-u5HgVw4f8ypWM1Tpk",
+        "y" : "Ja-AsJoWfZ72R98o4tms0NS8Ty3uxXI4GO2vkHHjEfg"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04df4083bd6ecbda5a77ae578e5d835fa7f74a07ebb91e0570e1ff32a563354e9925af80b09a167d9ef647df28e2d9acd0d4bc4f2deec5723818edaf9071e311f8",
+        "wx" : "0df4083bd6ecbda5a77ae578e5d835fa7f74a07ebb91e0570e1ff32a563354e99",
+        "wy" : "25af80b09a167d9ef647df28e2d9acd0d4bc4f2deec5723818edaf9071e311f8"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004df4083bd6ecbda5a77ae578e5d835fa7f74a07ebb91e0570e1ff32a563354e9925af80b09a167d9ef647df28e2d9acd0d4bc4f2deec5723818edaf9071e311f8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE30CDvW7L2lp3rleOXYNfp/dKB+u5\nHgVw4f8ypWM1Tpklr4CwmhZ9nvZH3yji2azQ1LxPLe7FcjgY7a+QceMR+A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 129,
+          "comment" : "smallish r and s^-1",
+          "msg" : "54657374",
+          "sig" : "000000000000000000000000000000000000000000000000002d9b4d347952d6ef3043e7329581dbb3974497710ab11505ee1c87ff907beebadd195a0ffe6d7a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "wlaaPJv4wYOMqCH3um8ADMhnnSePNza0FKNKfJVqA3c",
+        "y" : "A4fqhbxPKIBLSpHJt9ZbxkNMl1gGeVq31EGk6Wg66wk"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c2569a3c9bf8c1838ca821f7ba6f000cc8679d278f3736b414a34a7c956a03770387ea85bc4f28804b4a91c9b7d65bc6434c975806795ab7d441a4e9683aeb09",
+        "wx" : "0c2569a3c9bf8c1838ca821f7ba6f000cc8679d278f3736b414a34a7c956a0377",
+        "wy" : "387ea85bc4f28804b4a91c9b7d65bc6434c975806795ab7d441a4e9683aeb09"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c2569a3c9bf8c1838ca821f7ba6f000cc8679d278f3736b414a34a7c956a03770387ea85bc4f28804b4a91c9b7d65bc6434c975806795ab7d441a4e9683aeb09",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwlaaPJv4wYOMqCH3um8ADMhnnSeP\nNza0FKNKfJVqA3cDh+qFvE8ogEtKkcm31lvGQ0yXWAZ5WrfUQaTpaDrrCQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 130,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "54657374",
+          "sig" : "000000000000000000000000000000000000001033e67e37b32b445580bf4eff8b748b74000000008b748b748b748b7466e769ad4a16d3dcd87129b8e91d1b4d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "Sp99oqbDWaFlQMJxd0pr8cWGNXyXglb0SmSW2AZwloo",
+        "y" : "xJbnOkRWP41W-9e7nk464wTIbyxQjrd3sDkkdVvrQNQ"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044a9f7da2a6c359a16540c271774a6bf1c586357c978256f44a6496d80670968ac496e73a44563f8d56fbd7bb9e4e3ae304c86f2c508eb777b03924755beb40d4",
+        "wx" : "4a9f7da2a6c359a16540c271774a6bf1c586357c978256f44a6496d80670968a",
+        "wy" : "0c496e73a44563f8d56fbd7bb9e4e3ae304c86f2c508eb777b03924755beb40d4"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044a9f7da2a6c359a16540c271774a6bf1c586357c978256f44a6496d80670968ac496e73a44563f8d56fbd7bb9e4e3ae304c86f2c508eb777b03924755beb40d4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAESp99oqbDWaFlQMJxd0pr8cWGNXyX\nglb0SmSW2AZwlorEluc6RFY/jVb717ueTjrjBMhvLFCOt3ewOSR1W+tA1A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 131,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "54657374",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000100ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "h0FGQys80sniYgTAo0E2mWBn1Gbd5JF6j_I6jpXKEGs",
+        "y" : "cJs9UJdu-LOFqBO8NfOiBxC9xu3UZeb0OsSGZwOmYIw"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04874146432b3cd2c9e26204c0a34136996067d466dde4917a8ff23a8e95ca106b709b3d50976ef8b385a813bc35f3a20710bdc6edd465e6f43ac4866703a6608c",
+        "wx" : "0874146432b3cd2c9e26204c0a34136996067d466dde4917a8ff23a8e95ca106b",
+        "wy" : "709b3d50976ef8b385a813bc35f3a20710bdc6edd465e6f43ac4866703a6608c"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004874146432b3cd2c9e26204c0a34136996067d466dde4917a8ff23a8e95ca106b709b3d50976ef8b385a813bc35f3a20710bdc6edd465e6f43ac4866703a6608c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEh0FGQys80sniYgTAo0E2mWBn1Gbd\n5JF6j/I6jpXKEGtwmz1Ql274s4WoE7w186IHEL3G7dRl5vQ6xIZnA6ZgjA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 132,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "54657374",
+          "sig" : "00000000000000000000000000000000000000062522bbd3ecbe7c39e93e7c25ef9f6ba4d97c09d03178fa20b4aaad83be3cf9cb824a879fec3270fc4b81ef5b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "enNtjjJqnKYrviWjTqTjYztJmpavp6qj_PP9iPjgft4",
+        "y" : "s-RYedhiK5PoGEQ6aG6Gnu2nv5rkaqPq_MSKWTSGRic"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047a736d8e326a9ca62bbe25a34ea4e3633b499a96afa7aaa3fcf3fd88f8e07edeb3e45879d8622b93e818443a686e869eeda7bf9ae46aa3eafcc48a5934864627",
+        "wx" : "7a736d8e326a9ca62bbe25a34ea4e3633b499a96afa7aaa3fcf3fd88f8e07ede",
+        "wy" : "0b3e45879d8622b93e818443a686e869eeda7bf9ae46aa3eafcc48a5934864627"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047a736d8e326a9ca62bbe25a34ea4e3633b499a96afa7aaa3fcf3fd88f8e07edeb3e45879d8622b93e818443a686e869eeda7bf9ae46aa3eafcc48a5934864627",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEenNtjjJqnKYrviWjTqTjYztJmpav\np6qj/PP9iPjgft6z5Fh52GIrk+gYRDpoboae7ae/muRqo+r8xIpZNIZGJw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 133,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "54657374",
+          "sig" : "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc6324d5555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "6E2bIy6XGkM4JjD5lyXkI-wey0HlUXLpxpdIoD8NWYg",
+        "y" : "YYsVtCetgzY70EH_dfrJjvLukjcU59Hf4xdTeTx1iNQ"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04e84d9b232e971a43382630f99725e423ec1ecb41e55172e9c69748a03f0d5988618b15b427ad83363bd041ff75fac98ef2ee923714e7d1dfe31753793c7588d4",
+        "wx" : "0e84d9b232e971a43382630f99725e423ec1ecb41e55172e9c69748a03f0d5988",
+        "wy" : "618b15b427ad83363bd041ff75fac98ef2ee923714e7d1dfe31753793c7588d4"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004e84d9b232e971a43382630f99725e423ec1ecb41e55172e9c69748a03f0d5988618b15b427ad83363bd041ff75fac98ef2ee923714e7d1dfe31753793c7588d4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6E2bIy6XGkM4JjD5lyXkI+wey0Hl\nUXLpxpdIoD8NWYhhixW0J62DNjvQQf91+smO8u6SNxTn0d/jF1N5PHWI1A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 134,
+          "comment" : "s == 1",
+          "msg" : "54657374",
+          "sig" : "555555550000000055555555555555553ef7a8e48d07df81a693439654210c700000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "s == 0",
+          "msg" : "54657374",
+          "sig" : "555555550000000055555555555555553ef7a8e48d07df81a693439654210c700000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AgNzb8sZixXY16DID2bd3RUlkkCqeNCKrmfEZ94EUDQ",
+        "y" : "NDg0ONUEHqmjh-6OTU6EtEcbFgxrzyVosHL48g6HqZY"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040203736fcb198b15d8d7a0c80f66dddd15259240aa78d08aae67c467de04503434383438d5041ea9a387ee8e4d4e84b4471b160c6bcf2568b072f8f20e87a996",
+        "wx" : "203736fcb198b15d8d7a0c80f66dddd15259240aa78d08aae67c467de045034",
+        "wy" : "34383438d5041ea9a387ee8e4d4e84b4471b160c6bcf2568b072f8f20e87a996"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040203736fcb198b15d8d7a0c80f66dddd15259240aa78d08aae67c467de04503434383438d5041ea9a387ee8e4d4e84b4471b160c6bcf2568b072f8f20e87a996",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAgNzb8sZixXY16DID2bd3RUlkkCq\neNCKrmfEZ94EUDQ0ODQ41QQeqaOH7o5NToS0RxsWDGvPJWiwcvjyDoeplg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 136,
+          "comment" : "point at infinity during verify",
+          "msg" : "54657374",
+          "sig" : "7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a8555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "oX9bdaNe1kYjyly_H5GVEpLbDCPwwuokw9DK0JiMq8A",
+        "y" : "g6emGGJcIolAcwtPo-5k-uy7L8IP3efFizo_YwBCTcY"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a17f5b75a35ed64623ca5cbf1f91951292db0c23f0c2ea24c3d0cad0988cabc083a7a618625c228940730b4fa3ee64faecbb2fc20fdde7c58b3a3f6300424dc6",
+        "wx" : "0a17f5b75a35ed64623ca5cbf1f91951292db0c23f0c2ea24c3d0cad0988cabc0",
+        "wy" : "083a7a618625c228940730b4fa3ee64faecbb2fc20fdde7c58b3a3f6300424dc6"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a17f5b75a35ed64623ca5cbf1f91951292db0c23f0c2ea24c3d0cad0988cabc083a7a618625c228940730b4fa3ee64faecbb2fc20fdde7c58b3a3f6300424dc6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEoX9bdaNe1kYjyly/H5GVEpLbDCPw\nwuokw9DK0JiMq8CDp6YYYlwiiUBzC0+j7mT67Lsvwg/d58WLOj9jAEJNxg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 137,
+          "comment" : "u1 == 1",
+          "msg" : "54657374",
+          "sig" : "555555550000000055555555555555553ef7a8e48d07df81a693439654210c70532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "BLoMuikaN9sT8zv5DatijATsg5OgIAQZ6eqh68yftcM",
+        "y" : "HzoKDmgjpJtiWtV7EqMtQEeXD8NCjw8ASez0Jl3BL2I"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0404ba0cba291a37db13f33bf90dab628c04ec8393a0200419e9eaa1ebcc9fb5c31f3a0a0e6823a49b625ad57b12a32d4047970fc3428f0f0049ecf4265dc12f62",
+        "wx" : "4ba0cba291a37db13f33bf90dab628c04ec8393a0200419e9eaa1ebcc9fb5c3",
+        "wy" : "1f3a0a0e6823a49b625ad57b12a32d4047970fc3428f0f0049ecf4265dc12f62"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000404ba0cba291a37db13f33bf90dab628c04ec8393a0200419e9eaa1ebcc9fb5c31f3a0a0e6823a49b625ad57b12a32d4047970fc3428f0f0049ecf4265dc12f62",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEBLoMuikaN9sT8zv5DatijATsg5Og\nIAQZ6eqh68yftcMfOgoOaCOkm2Ja1XsSoy1AR5cPw0KPDwBJ7PQmXcEvYg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 138,
+          "comment" : "u1 == n - 1",
+          "msg" : "54657374",
+          "sig" : "555555550000000055555555555555553ef7a8e48d07df81a693439654210c70acd155416a8b77f34089464733ff7cd39c400e9c69af7beb9eac5054ed2ec72c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "aStsgo4P7tY9iuqitzIvnMvocjoe058inyBKQ0uJAO8",
+        "y" : "ofb2q8s46juP3ji5jHwnHydK9WqMVijcMykGmuTdVxY"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04692b6c828e0feed63d8aeaa2b7322f9ccbe8723a1ed39f229f204a434b8900efa1f6f6abcb38ea3b8fde38b98c7c271f274af56a8c5628dc3329069ae4dd5716",
+        "wx" : "692b6c828e0feed63d8aeaa2b7322f9ccbe8723a1ed39f229f204a434b8900ef",
+        "wy" : "0a1f6f6abcb38ea3b8fde38b98c7c271f274af56a8c5628dc3329069ae4dd5716"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004692b6c828e0feed63d8aeaa2b7322f9ccbe8723a1ed39f229f204a434b8900efa1f6f6abcb38ea3b8fde38b98c7c271f274af56a8c5628dc3329069ae4dd5716",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaStsgo4P7tY9iuqitzIvnMvocjoe\n058inyBKQ0uJAO+h9varyzjqO4/eOLmMfCcfJ0r1aoxWKNwzKQaa5N1XFg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 139,
+          "comment" : "u2 == 1",
+          "msg" : "54657374",
+          "sig" : "555555550000000055555555555555553ef7a8e48d07df81a693439654210c70555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AM79kWLRPmTLk2h6nNj5dV67Wj73Yy-AD4SHGHTM7wk",
+        "y" : "VD7L6vfoBE73Ib4vtfVJ5LhIDSWHQE6_fbvvLFS8DLE"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400cefd9162d13e64cb93687a9cd8f9755ebb5a3ef7632f800f84871874ccef09543ecbeaf7e8044ef721be2fb5f549e4b8480d2587404ebf7dbbef2c54bc0cb1",
+        "wx" : "0cefd9162d13e64cb93687a9cd8f9755ebb5a3ef7632f800f84871874ccef09",
+        "wy" : "543ecbeaf7e8044ef721be2fb5f549e4b8480d2587404ebf7dbbef2c54bc0cb1"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400cefd9162d13e64cb93687a9cd8f9755ebb5a3ef7632f800f84871874ccef09543ecbeaf7e8044ef721be2fb5f549e4b8480d2587404ebf7dbbef2c54bc0cb1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAM79kWLRPmTLk2h6nNj5dV67Wj73\nYy+AD4SHGHTM7wlUPsvq9+gETvchvi+19UnkuEgNJYdATr99u+8sVLwMsQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 140,
+          "comment" : "u2 == n - 1",
+          "msg" : "54657374",
+          "sig" : "555555550000000055555555555555553ef7a8e48d07df81a693439654210c70aaaaaaaa00000000aaaaaaaaaaaaaaaa7def51c91a0fbf034d26872ca84218e1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "uXUYO0JVHPUvKR1cGSH9XhL1DIyFpL653gPvo_DyRIY",
+        "y" : "IkMBjmhm35ItwxNhICAxH_IeJCzj-xW8eMQGslq0MJE"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b975183b42551cf52f291d5c1921fd5e12f50c8c85a4beb9de03efa3f0f244862243018e6866df922dc313612020311ff21e242ce3fb15bc78c406b25ab43091",
+        "wx" : "0b975183b42551cf52f291d5c1921fd5e12f50c8c85a4beb9de03efa3f0f24486",
+        "wy" : "2243018e6866df922dc313612020311ff21e242ce3fb15bc78c406b25ab43091"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b975183b42551cf52f291d5c1921fd5e12f50c8c85a4beb9de03efa3f0f244862243018e6866df922dc313612020311ff21e242ce3fb15bc78c406b25ab43091",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuXUYO0JVHPUvKR1cGSH9XhL1DIyF\npL653gPvo/DyRIYiQwGOaGbfki3DE2EgIDEf8h4kLOP7Fbx4xAayWrQwkQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 141,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd710f8e3edc7c2d5a3fd23de844002bb949d9f794f6d5405f6d97c1bb03dd2bd2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "wl8dFm8-IRzfBCom-Kv2CU1IuNFxkddO1xcUknRGaZk",
+        "y" : "ZdBt1qiKv6Sei0xdpruSKFGWmt-WBLWsz7UqEU53zNs"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c25f1d166f3e211cdf042a26f8abf6094d48b8d17191d74ed71714927446699965d06dd6a88abfa49e8b4c5da6bb922851969adf9604b5accfb52a114e77ccdb",
+        "wx" : "0c25f1d166f3e211cdf042a26f8abf6094d48b8d17191d74ed717149274466999",
+        "wy" : "65d06dd6a88abfa49e8b4c5da6bb922851969adf9604b5accfb52a114e77ccdb"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c25f1d166f3e211cdf042a26f8abf6094d48b8d17191d74ed71714927446699965d06dd6a88abfa49e8b4c5da6bb922851969adf9604b5accfb52a114e77ccdb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwl8dFm8+IRzfBCom+Kv2CU1IuNFx\nkddO1xcUknRGaZll0G3WqIq/pJ6LTF2mu5IoUZaa35YEtazPtSoRTnfM2w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 142,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdedffbc270f722c243069a7e5f40335a61a58525c7b4db2e7a8e269274ffe4e1b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "j-XogkOnbkGgBCNiGKPDotbu45iiPDoLAI1_AWTLwMo",
+        "y" : "mKING9z1c1E8fP2bg8Y-OoLUASfIl2l8hrjLOHr38kA"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "048fe5e88243a76e41a004236218a3c3a2d6eee398a23c3a0b008d7f0164cbc0ca98a20d1bdcf573513c7cfd9b83c63e3a82d40127c897697c86b8cb387af7f240",
+        "wx" : "08fe5e88243a76e41a004236218a3c3a2d6eee398a23c3a0b008d7f0164cbc0ca",
+        "wy" : "098a20d1bdcf573513c7cfd9b83c63e3a82d40127c897697c86b8cb387af7f240"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200048fe5e88243a76e41a004236218a3c3a2d6eee398a23c3a0b008d7f0164cbc0ca98a20d1bdcf573513c7cfd9b83c63e3a82d40127c897697c86b8cb387af7f240",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEj+XogkOnbkGgBCNiGKPDotbu45ii\nPDoLAI1/AWTLwMqYog0b3PVzUTx8/ZuDxj46gtQBJ8iXaXyGuMs4evfyQA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 143,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffda25adcae105ed7ff4f95d2344e24ee523314c3e178525d007904b68919ba4d53",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AhSCVrUw-8Rwx7NBlws4JD7O5tWoQKN77KLvs36N_yw",
+        "y" : "wK2-oIgkgqdInKcDo5mGS6mH7rbdtzivU6g1c0c8sw0"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0402148256b530fbc470c7b341970b38243ecee6d5a840a37beca2efb37e8dff2cc0adbea0882482a7489ca703a399864ba987eeb6ddb738af53a83573473cb30d",
+        "wx" : "2148256b530fbc470c7b341970b38243ecee6d5a840a37beca2efb37e8dff2c",
+        "wy" : "0c0adbea0882482a7489ca703a399864ba987eeb6ddb738af53a83573473cb30d"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000402148256b530fbc470c7b341970b38243ecee6d5a840a37beca2efb37e8dff2cc0adbea0882482a7489ca703a399864ba987eeb6ddb738af53a83573473cb30d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAhSCVrUw+8Rwx7NBlws4JD7O5tWo\nQKN77KLvs36N/yzArb6giCSCp0icpwOjmYZLqYfutt23OK9TqDVzRzyzDQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 144,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd2e4348c645707dce6760d773de3f3e87346924b2f64bd3dd0297e766b5805ebb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "o02wEs5u2h6cc3XF_PPlTtaY4ZYVEkJzs6Yh0CHHb44",
+        "y" : "d3RY1vVaNkwiHjnhIF1VELtPu33fCNjY_d4T0dbffxQ"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a34db012ce6eda1e9c7375c5fcf3e54ed698e19615124273b3a621d021c76f8e777458d6f55a364c221e39e1205d5510bb4fbb7ddf08d8d8fdde13d1d6df7f14",
+        "wx" : "0a34db012ce6eda1e9c7375c5fcf3e54ed698e19615124273b3a621d021c76f8e",
+        "wy" : "777458d6f55a364c221e39e1205d5510bb4fbb7ddf08d8d8fdde13d1d6df7f14"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a34db012ce6eda1e9c7375c5fcf3e54ed698e19615124273b3a621d021c76f8e777458d6f55a364c221e39e1205d5510bb4fbb7ddf08d8d8fdde13d1d6df7f14",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEo02wEs5u2h6cc3XF/PPlTtaY4ZYV\nEkJzs6Yh0CHHb453dFjW9Vo2TCIeOeEgXVUQu0+7fd8I2Nj93hPR1t9/FA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 145,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd348c673b07dce3920d773de3f3e87408869e916dbcf797d8f9684fb67753d1dc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "uXrz_ni-FfKRK2Jx3YpDuttt0qGzFbLOeuN7Tnd4BB0",
+        "y" : "kw1x7hmS0kZklcQhAtCOgRVMMFMH0dzVLQ-kxHmyeOc"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04b97af3fe78be15f2912b6271dd8a43badb6dd2a1b315b2ce7ae37b4e7778041d930d71ee1992d2466495c42102d08e81154c305307d1dcd52d0fa4c479b278e7",
+        "wx" : "0b97af3fe78be15f2912b6271dd8a43badb6dd2a1b315b2ce7ae37b4e7778041d",
+        "wy" : "0930d71ee1992d2466495c42102d08e81154c305307d1dcd52d0fa4c479b278e7"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004b97af3fe78be15f2912b6271dd8a43badb6dd2a1b315b2ce7ae37b4e7778041d930d71ee1992d2466495c42102d08e81154c305307d1dcd52d0fa4c479b278e7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuXrz/ni+FfKRK2Jx3YpDuttt0qGz\nFbLOeuN7Tnd4BB2TDXHuGZLSRmSVxCEC0I6BFUwwUwfR3NUtD6TEebJ45w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 146,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd6918ce760fb9c7241aee7bc7e7d0e8110d3d22db79ef2fb1f2d09f6ceea7a3b8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "gecZijw_I5Ac7ceh1u_26b-BEI5sNc2FWROa8xNdvLs",
+        "y" : "nvFWhTApGoBhuQyfQoXu_LqZDUVwpOO3tzdSW11YADQ"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0481e7198a3c3f23901cedc7a1d6eff6e9bf81108e6c35cd8559139af3135dbcbb9ef1568530291a8061b90c9f4285eefcba990d4570a4e3b7b737525b5d580034",
+        "wx" : "081e7198a3c3f23901cedc7a1d6eff6e9bf81108e6c35cd8559139af3135dbcbb",
+        "wy" : "09ef1568530291a8061b90c9f4285eefcba990d4570a4e3b7b737525b5d580034"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000481e7198a3c3f23901cedc7a1d6eff6e9bf81108e6c35cd8559139af3135dbcbb9ef1568530291a8061b90c9f4285eefcba990d4570a4e3b7b737525b5d580034",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEgecZijw/I5Ac7ceh1u/26b+BEI5s\nNc2FWROa8xNdvLue8VaFMCkagGG5DJ9Che78upkNRXCk47e3N1JbXVgANA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 147,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd73b3c694391d8eadde3f3e874089464715ac20e4c126bbf6d864d648969f5b5a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "q015LKEh0dujnLneZFFJwqtXPovsxt3_PMmWDxiN33M",
+        "y" : "f5C6I2ZBU-kyYv9zNVQVGVhY174TFaaUVjht5oKFo8g"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ab4d792ca121d1dba39cb9de645149c2ab573e8becc6ddff3cc9960f188ddf737f90ba23664153e93262ff73355415195858d7be1315a69456386de68285a3c8",
+        "wx" : "0ab4d792ca121d1dba39cb9de645149c2ab573e8becc6ddff3cc9960f188ddf73",
+        "wy" : "7f90ba23664153e93262ff73355415195858d7be1315a69456386de68285a3c8"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ab4d792ca121d1dba39cb9de645149c2ab573e8becc6ddff3cc9960f188ddf737f90ba23664153e93262ff73355415195858d7be1315a69456386de68285a3c8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEq015LKEh0dujnLneZFFJwqtXPovs\nxt3/PMmWDxiN33N/kLojZkFT6TJi/3M1VBUZWFjXvhMVppRWOG3mgoWjyA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 148,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdbb07ac7a86948c2c2989a16db1930ef1b89ce112595197656877e53c41457f28",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "UYQStpr0Oq4IRHamjVm73lH7-p5b6AVj9YfJwmUviO8",
+        "y" : "LTuQ0luqa9t7DFXlJAo6mPvCSv7YUj7ewccFA_wQ8jM"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04518412b69af43aae084476a68d59bbde51fbfa9e5be80563f587c9c2652f88ef2d3b90d25baa6bdb7b0c55e5240a3a98fbc24afed8523edec1c70503fc10f233",
+        "wx" : "518412b69af43aae084476a68d59bbde51fbfa9e5be80563f587c9c2652f88ef",
+        "wy" : "2d3b90d25baa6bdb7b0c55e5240a3a98fbc24afed8523edec1c70503fc10f233"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004518412b69af43aae084476a68d59bbde51fbfa9e5be80563f587c9c2652f88ef2d3b90d25baa6bdb7b0c55e5240a3a98fbc24afed8523edec1c70503fc10f233",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUYQStpr0Oq4IRHamjVm73lH7+p5b\n6AVj9YfJwmUviO8tO5DSW6pr23sMVeUkCjqY+8JK/thSPt7BxwUD/BDyMw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 149,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd27e4d82cb6c061dd9337c69bf9332ed3d198662d6f2299443f62c861187db648",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "oI8UpkS5qTXf_qR2Hrr1ktH2b-bNNzqn9dNwrzT4NS0",
+        "y" : "pUtbxAJc8zWQCpFMKTTsL-x6OW0Kev_K1zKldBx6qvU"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a08f14a644b9a935dffea4761ebaf592d1f66fe6cd373aa7f5d370af34f8352da54b5bc4025cf335900a914c2934ec2fec7a396d0a7affcad732a5741c7aaaf5",
+        "wx" : "0a08f14a644b9a935dffea4761ebaf592d1f66fe6cd373aa7f5d370af34f8352d",
+        "wy" : "0a54b5bc4025cf335900a914c2934ec2fec7a396d0a7affcad732a5741c7aaaf5"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a08f14a644b9a935dffea4761ebaf592d1f66fe6cd373aa7f5d370af34f8352da54b5bc4025cf335900a914c2934ec2fec7a396d0a7affcad732a5741c7aaaf5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEoI8UpkS5qTXf/qR2Hrr1ktH2b+bN\nNzqn9dNwrzT4NS2lS1vEAlzzNZAKkUwpNOwv7Ho5bQp6/8rXMqV0HHqq9Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 150,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffde7c5cf3aac2e88923b77850515fff6a12d13b356dfe9ec275c3dd81ae94609a4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "zPIpamqJtiuQc504r0rjog6fRXFbkARGOSQQYeM_j4w",
+        "y" : "qs4ARkke6qHG6aRyuW2I9K-D5_8buEQ4x-BYA0QSrgg"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ccf2296a6a89b62b90739d38af4ae3a20e9f45715b90044639241061e33f8f8caace0046491eeaa1c6e9a472b96d88f4af83e7ff1bb84438c7e058034412ae08",
+        "wx" : "0ccf2296a6a89b62b90739d38af4ae3a20e9f45715b90044639241061e33f8f8c",
+        "wy" : "0aace0046491eeaa1c6e9a472b96d88f4af83e7ff1bb84438c7e058034412ae08"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ccf2296a6a89b62b90739d38af4ae3a20e9f45715b90044639241061e33f8f8caace0046491eeaa1c6e9a472b96d88f4af83e7ff1bb84438c7e058034412ae08",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzPIpamqJtiuQc504r0rjog6fRXFb\nkARGOSQQYeM/j4yqzgBGSR7qocbppHK5bYj0r4Pn/xu4RDjH4FgDRBKuCA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 151,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc77838df91c1e953e016e10bddffea2317f9fee32bacfe553cede9e57a748f68",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "lLD8FSW8q_grHzSJXlgZoGwCsj4EACJ24WX5YshuOSc",
+        "y" : "vnwqtNCyUwMgT7MqH4KSkCeSIl4WptLb-yn7yJqcM3Y"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0494b0fc1525bcabf82b1f34895e5819a06c02b23e04002276e165f962c86e3927be7c2ab4d0b25303204fb32a1f8292902792225e16a6d2dbfb29fbc89a9c3376",
+        "wx" : "094b0fc1525bcabf82b1f34895e5819a06c02b23e04002276e165f962c86e3927",
+        "wy" : "0be7c2ab4d0b25303204fb32a1f8292902792225e16a6d2dbfb29fbc89a9c3376"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000494b0fc1525bcabf82b1f34895e5819a06c02b23e04002276e165f962c86e3927be7c2ab4d0b25303204fb32a1f8292902792225e16a6d2dbfb29fbc89a9c3376",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAElLD8FSW8q/grHzSJXlgZoGwCsj4E\nACJ24WX5YshuOSe+fCq00LJTAyBPsyofgpKQJ5IiXham0tv7KfvImpwzdg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 152,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd8ef071c02383d2a6c02dc217bbffd446730d0318b0425e2586220907f885f97f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "U1Hzfh3gyIxQhSfYmILRg8zc8u_KQH7bBifK39Ft5uw",
+        "y" : "RLS1fN-WDTLrzEyXhH7tIYQlhTtbZ163gbdmoaEwA0k"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045351f37e1de0c88c508527d89882d183ccdcf2efca407edb0627cadfd16de6ec44b4b57cdf960d32ebcc4c97847eed218425853b5b675eb781b766a1a1300349",
+        "wx" : "5351f37e1de0c88c508527d89882d183ccdcf2efca407edb0627cadfd16de6ec",
+        "wy" : "44b4b57cdf960d32ebcc4c97847eed218425853b5b675eb781b766a1a1300349"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045351f37e1de0c88c508527d89882d183ccdcf2efca407edb0627cadfd16de6ec44b4b57cdf960d32ebcc4c97847eed218425853b5b675eb781b766a1a1300349",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEU1Hzfh3gyIxQhSfYmILRg8zc8u/K\nQH7bBifK39Ft5uxEtLV835YNMuvMTJeEfu0hhCWFO1tnXreBt2ahoTADSQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 153,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5668aaa0b545bbf9a044a32399ffbe69ce20074e34d7bdf5cf56282a76976396",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "dIu6_DIOZzXLZAGXEKJpxsK10Ue9yDEyXLL7J2rJcaY",
+        "y" : "nWVemnVbydgArSHuP9TZgNk6ekmoxczTcAUXdXj1EWM"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04748bbafc320e6735cb64019710a269c6c2b5d147bdc831325cb2fb276ac971a69d655e9a755bc9d800ad21ee3fd4d980d93a7a49a8c5ccd37005177578f51163",
+        "wx" : "748bbafc320e6735cb64019710a269c6c2b5d147bdc831325cb2fb276ac971a6",
+        "wy" : "09d655e9a755bc9d800ad21ee3fd4d980d93a7a49a8c5ccd37005177578f51163"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004748bbafc320e6735cb64019710a269c6c2b5d147bdc831325cb2fb276ac971a69d655e9a755bc9d800ad21ee3fd4d980d93a7a49a8c5ccd37005177578f51163",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdIu6/DIOZzXLZAGXEKJpxsK10Ue9\nyDEyXLL7J2rJcaadZV6adVvJ2ACtIe4/1NmA2Tp6SajFzNNwBRd1ePURYw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 154,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd12d6e56882f6c0027cae91a27127728f7fddf478fb4fdc2b65f40a60b0eb952",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "FLO711xeHAw2U1qTTUq4URJBCzuQ-pejHDMDiWT9hcw",
+        "y" : "ES99g3-PnDa0YNY2yWWl-BjytQxdAPs_lwVWHdZjGIM"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0414b3bbd75c5e1c0c36535a934d4ab85112410b3b90fa97a31c33038964fd85cc112f7d837f8f9c36b460d636c965a5f818f2b50c5d00fb3f9705561dd6631883",
+        "wx" : "14b3bbd75c5e1c0c36535a934d4ab85112410b3b90fa97a31c33038964fd85cc",
+        "wy" : "112f7d837f8f9c36b460d636c965a5f818f2b50c5d00fb3f9705561dd6631883"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000414b3bbd75c5e1c0c36535a934d4ab85112410b3b90fa97a31c33038964fd85cc112f7d837f8f9c36b460d636c965a5f818f2b50c5d00fb3f9705561dd6631883",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFLO711xeHAw2U1qTTUq4URJBCzuQ\n+pejHDMDiWT9hcwRL32Df4+cNrRg1jbJZaX4GPK1DF0A+z+XBVYd1mMYgw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 155,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd7fffffffaaaaaaaaffffffffffffffffe9a2538f37b28a2c513dee40fecbb71a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "2CNTPATNjtxtb5UKjgit4Eqbr6LxSlkDVpNWca6TBb8",
+        "y" : "QxeNH4i2pXqWkkwmXw3bdbWDEpB7GVrLWdd5cwMSN3U"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d823533c04cd8edc6d6f950a8e08ade04a9bafa2f14a590356935671ae9305bf43178d1f88b6a57a96924c265f0ddb75b58312907b195acb59d7797303123775",
+        "wx" : "0d823533c04cd8edc6d6f950a8e08ade04a9bafa2f14a590356935671ae9305bf",
+        "wy" : "43178d1f88b6a57a96924c265f0ddb75b58312907b195acb59d7797303123775"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004d823533c04cd8edc6d6f950a8e08ade04a9bafa2f14a590356935671ae9305bf43178d1f88b6a57a96924c265f0ddb75b58312907b195acb59d7797303123775",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE2CNTPATNjtxtb5UKjgit4Eqbr6Lx\nSlkDVpNWca6TBb9DF40fiLalepaSTCZfDdt1tYMSkHsZWstZ13lzAxI3dQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 156,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdb62f26b5f2a2b26f6de86d42ad8a13da3ab3cccd0459b201de009e526adf21f2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "2ys0CLMWfZEDBiTGMo6M4-wQjBBVdcLz0gm5LmVLq2k",
+        "y" : "w0MYE5xQsIAsbmEvD9MYnYAN98mW1de3w9a-goNvolg"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04db2b3408b3167d91030624c6328e8ce3ec108c105575c2f3d209b92e654bab69c34318139c50b0802c6e612f0fd3189d800df7c996d5d7b7c3d6be82836fa258",
+        "wx" : "0db2b3408b3167d91030624c6328e8ce3ec108c105575c2f3d209b92e654bab69",
+        "wy" : "0c34318139c50b0802c6e612f0fd3189d800df7c996d5d7b7c3d6be82836fa258"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004db2b3408b3167d91030624c6328e8ce3ec108c105575c2f3d209b92e654bab69c34318139c50b0802c6e612f0fd3189d800df7c996d5d7b7c3d6be82836fa258",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE2ys0CLMWfZEDBiTGMo6M4+wQjBBV\ndcLz0gm5LmVLq2nDQxgTnFCwgCxuYS8P0xidgA33yZbV17fD1r6Cg2+iWA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 157,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdbb1d9ac949dd748cd02bbbe749bd351cd57b38bb61403d700686aa7b4c90851e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "CRec58WSJTkiFkU7KsHp0XjCSDffria8HderYGOFJ0I",
+        "y" : "VVa0LjMCifO4JrLbeobRnUXChgpZ8r4d3MO2kflaklU"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0409179ce7c59225392216453b2ac1e9d178c24837dfae26bc1dd7ab60638527425556b42e330289f3b826b2db7a86d19d45c2860a59f2be1ddcc3b691f95a9255",
+        "wx" : "09179ce7c59225392216453b2ac1e9d178c24837dfae26bc1dd7ab6063852742",
+        "wy" : "5556b42e330289f3b826b2db7a86d19d45c2860a59f2be1ddcc3b691f95a9255"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000409179ce7c59225392216453b2ac1e9d178c24837dfae26bc1dd7ab60638527425556b42e330289f3b826b2db7a86d19d45c2860a59f2be1ddcc3b691f95a9255",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECRec58WSJTkiFkU7KsHp0XjCSDff\nria8HderYGOFJ0JVVrQuMwKJ87gmstt6htGdRcKGClnyvh3cw7aR+VqSVQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 158,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd66755a00638cdaec1c732513ca0234ece52545dac11f816e818f725b4f60aaf2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AZWfuN7aVuVGe35LIU6kwtDC-ynXD_Gbax7M69ZWjX4",
+        "y" : "2dvXepGCl_2XC_8B4TQ_aSUWfbWhTQmKIRw5zDpBM5g"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401959fb8deda56e5467b7e4b214ea4c2d0c2fb29d70ff19b6b1eccebd6568d7ed9dbd77a918297fd970bff01e1343f6925167db5a14d098a211c39cc3a413398",
+        "wx" : "1959fb8deda56e5467b7e4b214ea4c2d0c2fb29d70ff19b6b1eccebd6568d7e",
+        "wy" : "0d9dbd77a918297fd970bff01e1343f6925167db5a14d098a211c39cc3a413398"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000401959fb8deda56e5467b7e4b214ea4c2d0c2fb29d70ff19b6b1eccebd6568d7ed9dbd77a918297fd970bff01e1343f6925167db5a14d098a211c39cc3a413398",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAZWfuN7aVuVGe35LIU6kwtDC+ynX\nD/Gbax7M69ZWjX7Z29d6kYKX/ZcL/wHhND9pJRZ9taFNCYohHDnMOkEzmA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 159,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd55a00c9fcdaebb6032513ca0234ecfffe98ebe492fdf02e48ca48e982beb3669",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "Vn8f3Dh-U1DIUrTo-LqdbZR-HF3XzMYaWTgkXda8qzo",
+        "y" : "mWC-uvkZUU-VNcIuqvC1gShXlw4mZiJnsfPrEBETChE"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04567f1fdc387e5350c852b4e8f8ba9d6d947e1c5dd7ccc61a5938245dd6bcab3a9960bebaf919514f9535c22eaaf0b5812857970e26662267b1f3eb1011130a11",
+        "wx" : "567f1fdc387e5350c852b4e8f8ba9d6d947e1c5dd7ccc61a5938245dd6bcab3a",
+        "wy" : "09960bebaf919514f9535c22eaaf0b5812857970e26662267b1f3eb1011130a11"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004567f1fdc387e5350c852b4e8f8ba9d6d947e1c5dd7ccc61a5938245dd6bcab3a9960bebaf919514f9535c22eaaf0b5812857970e26662267b1f3eb1011130a11",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEVn8f3Dh+U1DIUrTo+LqdbZR+HF3X\nzMYaWTgkXda8qzqZYL66+RlRT5U1wi6q8LWBKFeXDiZmImex8+sQERMKEQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 160,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdab40193f9b5d76c064a27940469d9fffd31d7c925fbe05c919491d3057d66cd2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "NJn5dP9Mpruy9RaC_V9Rdi-d1t0oVSYmYLNtRtPkvsI",
+        "y" : "9Jj64kh4B-IgEZFS8BIkdsZNT6Rt3OhcRUZjDw1cXoE"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043499f974ff4ca6bbb2f51682fd5f51762f9dd6dd2855262660b36d46d3e4bec2f498fae2487807e220119152f0122476c64d4fa46ddce85c4546630f0d5c5e81",
+        "wx" : "3499f974ff4ca6bbb2f51682fd5f51762f9dd6dd2855262660b36d46d3e4bec2",
+        "wy" : "0f498fae2487807e220119152f0122476c64d4fa46ddce85c4546630f0d5c5e81"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043499f974ff4ca6bbb2f51682fd5f51762f9dd6dd2855262660b36d46d3e4bec2f498fae2487807e220119152f0122476c64d4fa46ddce85c4546630f0d5c5e81",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENJn5dP9Mpruy9RaC/V9Rdi+d1t0o\nVSYmYLNtRtPkvsL0mPriSHgH4iARkVLwEiR2xk1PpG3c6FxFRmMPDVxegQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 161,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdca0234ebb5fdcb13ca0234ecffffffffcb0dadbbc7f549f8a26b4408d0dc8600",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "LFwBZizwDBkpWWJX2xOybs8w0PPsS58DUbDycJRHNCY",
+        "y" : "6YaghgYNCG7ugi3dL8dEJHoBVLV_emnFHZ_a-khOSsc"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042c5c01662cf00c1929596257db13b26ecf30d0f3ec4b9f0351b0f27094473426e986a086060d086eee822ddd2fc744247a0154b57f7a69c51d9fdafa484e4ac7",
+        "wx" : "2c5c01662cf00c1929596257db13b26ecf30d0f3ec4b9f0351b0f27094473426",
+        "wy" : "0e986a086060d086eee822ddd2fc744247a0154b57f7a69c51d9fdafa484e4ac7"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042c5c01662cf00c1929596257db13b26ecf30d0f3ec4b9f0351b0f27094473426e986a086060d086eee822ddd2fc744247a0154b57f7a69c51d9fdafa484e4ac7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAELFwBZizwDBkpWWJX2xOybs8w0PPs\nS58DUbDycJRHNCbphqCGBg0Ibu6CLd0vx0QkegFUtX96acUdn9r6SE5Kxw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 162,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdbfffffff3ea3677e082b9310572620ae19933a9e65b285598711c77298815ad3",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "kdTLqBOgTYbbrpTCO-b1LBV3QYO-e6Wy2fPPAQsWBQE",
+        "y" : "kAuK3-pkkQGamsCA1RYCWlQb9LlSsK175LGHSwL9VEo"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0491d4cba813a04d86dbae94c23be6f52c15774183be7ba5b2d9f3cf010b160501900b8adfea6491019a9ac080d516025a541bf4b952b0ad7be4b1874b02fd544a",
+        "wx" : "091d4cba813a04d86dbae94c23be6f52c15774183be7ba5b2d9f3cf010b160501",
+        "wy" : "0900b8adfea6491019a9ac080d516025a541bf4b952b0ad7be4b1874b02fd544a"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000491d4cba813a04d86dbae94c23be6f52c15774183be7ba5b2d9f3cf010b160501900b8adfea6491019a9ac080d516025a541bf4b952b0ad7be4b1874b02fd544a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEkdTLqBOgTYbbrpTCO+b1LBV3QYO+\ne6Wy2fPPAQsWBQGQC4rf6mSRAZqawIDVFgJaVBv0uVKwrXvksYdLAv1USg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 163,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd266666663bbbbbbbe6666666666666665b37902e023fab7c8f055d86e5cc41f4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "73_Qo6NjhmODMOytQeGjswKvNpYIMdAhDGFLlI6KoSQ",
+        "y" : "7w1tgA5AR9bTwb4P3q8R_NjKtatZxzDrNBFuNajH0Jg"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ef7fd0a3a36386638330ecad41e1a3b302af36960831d0210c614b948e8aa124ef0d6d800e4047d6d3c1be0fdeaf11fcd8cab5ab59c730eb34116e35a8c7d098",
+        "wx" : "0ef7fd0a3a36386638330ecad41e1a3b302af36960831d0210c614b948e8aa124",
+        "wy" : "0ef0d6d800e4047d6d3c1be0fdeaf11fcd8cab5ab59c730eb34116e35a8c7d098"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ef7fd0a3a36386638330ecad41e1a3b302af36960831d0210c614b948e8aa124ef0d6d800e4047d6d3c1be0fdeaf11fcd8cab5ab59c730eb34116e35a8c7d098",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE73/Qo6NjhmODMOytQeGjswKvNpYI\nMdAhDGFLlI6KoSTvDW2ADkBH1tPBvg/erxH82Mq1q1nHMOs0EW41qMfQmA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 164,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdbfffffff36db6db7a492492492492492146c573f4c6dfc8d08a443e258970b09",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "pSHasTzJFS2Mp3A1pgf-oGxVzDyl2-uGjOqS6v6T3yo",
+        "y" : "e_ubKFMZlmNealzKooJqQGzhERvbnC4Mo2UAQYovQ94"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a521dab13cc9152d8ca77035a607fea06c55cc3ca5dbeb868cea92eafe93df2a7bfb9b28531996635e6a5ccaa2826a406ce1111bdb9c2e0ca36500418a2f43de",
+        "wx" : "0a521dab13cc9152d8ca77035a607fea06c55cc3ca5dbeb868cea92eafe93df2a",
+        "wy" : "7bfb9b28531996635e6a5ccaa2826a406ce1111bdb9c2e0ca36500418a2f43de"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a521dab13cc9152d8ca77035a607fea06c55cc3ca5dbeb868cea92eafe93df2a7bfb9b28531996635e6a5ccaa2826a406ce1111bdb9c2e0ca36500418a2f43de",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEpSHasTzJFS2Mp3A1pgf+oGxVzDyl\n2+uGjOqS6v6T3yp7+5soUxmWY15qXMqigmpAbOERG9ucLgyjZQBBii9D3g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 165,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdbfffffff2aaaaaab7fffffffffffffffc815d0e60b3e596ecb1ad3a27cfd49c4",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "R01YpO7Bbg1WXyGH_hHU6OeiaDoS84tPwB0SN6gaEJc",
+        "y" : "blX3O7fN2ka9tn73f2_Slp3ytnkg-1lF_eOlF6be1M0"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04474d58a4eec16e0d565f2187fe11d4e8e7a2683a12f38b4fc01d1237a81a10976e55f73bb7cdda46bdb67ef77f6fd2969df2b67920fb5945fde3a517a6ded4cd",
+        "wx" : "474d58a4eec16e0d565f2187fe11d4e8e7a2683a12f38b4fc01d1237a81a1097",
+        "wy" : "6e55f73bb7cdda46bdb67ef77f6fd2969df2b67920fb5945fde3a517a6ded4cd"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004474d58a4eec16e0d565f2187fe11d4e8e7a2683a12f38b4fc01d1237a81a10976e55f73bb7cdda46bdb67ef77f6fd2969df2b67920fb5945fde3a517a6ded4cd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAER01YpO7Bbg1WXyGH/hHU6OeiaDoS\n84tPwB0SN6gaEJduVfc7t83aRr22fvd/b9KWnfK2eSD7WUX946UXpt7UzQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 166,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd7fffffff55555555ffffffffffffffffd344a71e6f651458a27bdc81fd976e37",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "aS2lzUMJ2ably1JcN9qPoIefe1cgjNq79H0iOlsjpiE",
+        "y" : "QODap4z90genOJqu1hc4sX_F_D5qXtM5fSkC6RJearQ"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04692da5cd4309d9a6e5cb525c37da8fa0879f7b57208cdabbf47d223a5b23a62140e0daa78cfdd207a7389aaed61738b17fc5fc3e6a5ed3397d2902e9125e6ab4",
+        "wx" : "692da5cd4309d9a6e5cb525c37da8fa0879f7b57208cdabbf47d223a5b23a621",
+        "wy" : "40e0daa78cfdd207a7389aaed61738b17fc5fc3e6a5ed3397d2902e9125e6ab4"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004692da5cd4309d9a6e5cb525c37da8fa0879f7b57208cdabbf47d223a5b23a62140e0daa78cfdd207a7389aaed61738b17fc5fc3e6a5ed3397d2902e9125e6ab4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaS2lzUMJ2ably1JcN9qPoIefe1cg\njNq79H0iOlsjpiFA4NqnjP3SB6c4mq7WFzixf8X8Pmpe0zl9KQLpEl5qtA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 167,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd3fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192aa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "hWibPgd1x3GKkCefFKgILPzU0fFnknT06biAXFcKBnA",
+        "y" : "Fn_MXKc0VS4Jr6NkD0oDThW5t8pmHsf_cNPyQOvnBbE"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0485689b3e0775c7718a90279f14a8082cfcd4d1f1679274f4e9b8805c570a0670167fcc5ca734552e09afa3640f4a034e15b9b7ca661ec7ff70d3f240ebe705b1",
+        "wx" : "085689b3e0775c7718a90279f14a8082cfcd4d1f1679274f4e9b8805c570a0670",
+        "wy" : "167fcc5ca734552e09afa3640f4a034e15b9b7ca661ec7ff70d3f240ebe705b1"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000485689b3e0775c7718a90279f14a8082cfcd4d1f1679274f4e9b8805c570a0670167fcc5ca734552e09afa3640f4a034e15b9b7ca661ec7ff70d3f240ebe705b1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEhWibPgd1x3GKkCefFKgILPzU0fFn\nknT06biAXFcKBnAWf8xcpzRVLgmvo2QPSgNOFbm3ymYex/9w0/JA6+cFsQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 168,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5d8ecd64a4eeba466815ddf3a4de9a8e6abd9c5db0a01eb80343553da648428f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AVgTd1W5AfeXqQ1MqIh-Ajyy72OyuiwNRV7a70LPI34",
+        "y" : "KpZPwA03eoWSuLYar6ekqqfHuf0rQdbg4XvRulZ37c0"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040158137755b901f797a90d4ca8887e023cb2ef63b2ba2c0d455edaef42cf237e2a964fc00d377a8592b8b61aafa7a4aaa7c7b9fd2b41d6e0e17bd1ba5677edcd",
+        "wx" : "158137755b901f797a90d4ca8887e023cb2ef63b2ba2c0d455edaef42cf237e",
+        "wy" : "2a964fc00d377a8592b8b61aafa7a4aaa7c7b9fd2b41d6e0e17bd1ba5677edcd"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040158137755b901f797a90d4ca8887e023cb2ef63b2ba2c0d455edaef42cf237e2a964fc00d377a8592b8b61aafa7a4aaa7c7b9fd2b41d6e0e17bd1ba5677edcd",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAVgTd1W5AfeXqQ1MqIh+Ajyy72Oy\nuiwNRV7a70LPI34qlk/ADTd6hZK4thqvp6Sqp8e5/StB1uDhe9G6VnftzQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 169,
+          "comment" : "point duplication during verification",
+          "msg" : "54657374",
+          "sig" : "6f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569f21d907e3890916dc4fa1f4703c1e50d3f54ddf7383e44023a41de562aa18ed8",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AVgTd1W5AfeXqQ1MqIh-Ajyy72OyuiwNRV7a70LPI34",
+        "y" : "1WmwPvLIhXttR0nlUFhbVVg4RgPUvikfHoQuRamIEjI"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040158137755b901f797a90d4ca8887e023cb2ef63b2ba2c0d455edaef42cf237ed569b03ef2c8857b6d4749e550585b5558384603d4be291f1e842e45a9881232",
+        "wx" : "158137755b901f797a90d4ca8887e023cb2ef63b2ba2c0d455edaef42cf237e",
+        "wy" : "0d569b03ef2c8857b6d4749e550585b5558384603d4be291f1e842e45a9881232"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040158137755b901f797a90d4ca8887e023cb2ef63b2ba2c0d455edaef42cf237ed569b03ef2c8857b6d4749e550585b5558384603d4be291f1e842e45a9881232",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAVgTd1W5AfeXqQ1MqIh+Ajyy72Oy\nuiwNRV7a70LPI37VabA+8siFe21HSeVQWFtVWDhGA9S+KR8ehC5FqYgSMg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 170,
+          "comment" : "duplication bug",
+          "msg" : "54657374",
+          "sig" : "6f2347cab7dd76858fe0555ac3bc99048c4aacafdfb6bcbe05ea6c42c4934569f21d907e3890916dc4fa1f4703c1e50d3f54ddf7383e44023a41de562aa18ed8",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "OKCE_8zEri-CBL4qvKn7itSrKDsqpQ8TtrsjR62rxpw",
+        "y" : "ppl5m3exzG2tJx6IuJnBKTGYbpWOH1z1ZT3d9ziTZeI"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0438a084ffccc4ae2f8204be2abca9fb8ad4ab283b2aa50f13b6bb2347adabc69ca699799b77b1cc6dad271e88b899c12931986e958e1f5cf5653dddf7389365e2",
+        "wx" : "38a084ffccc4ae2f8204be2abca9fb8ad4ab283b2aa50f13b6bb2347adabc69c",
+        "wy" : "0a699799b77b1cc6dad271e88b899c12931986e958e1f5cf5653dddf7389365e2"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000438a084ffccc4ae2f8204be2abca9fb8ad4ab283b2aa50f13b6bb2347adabc69ca699799b77b1cc6dad271e88b899c12931986e958e1f5cf5653dddf7389365e2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEOKCE/8zEri+CBL4qvKn7itSrKDsq\npQ8TtrsjR62rxpymmXmbd7HMba0nHoi4mcEpMZhulY4fXPVlPd33OJNl4g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 171,
+          "comment" : "point with x-coordinate 0",
+          "msg" : "54657374",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000001555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "eodvv4IdlsVVw1OT07LS6Amm2DmwsRXZZNo-kZ74JQQ",
+        "y" : "cz3PQdgzsFMLh6expS99kb-hmRP3FRiGkTsWDeB81ps"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047a876fbf821d96c555c35393d3b2d2e809a6d839b0b115d964da3e919ef82504733dcf41d833b0530b87a7b1a52f7d91bfa19913f7151886913b160de07cd69b",
+        "wx" : "7a876fbf821d96c555c35393d3b2d2e809a6d839b0b115d964da3e919ef82504",
+        "wy" : "733dcf41d833b0530b87a7b1a52f7d91bfa19913f7151886913b160de07cd69b"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047a876fbf821d96c555c35393d3b2d2e809a6d839b0b115d964da3e919ef82504733dcf41d833b0530b87a7b1a52f7d91bfa19913f7151886913b160de07cd69b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEeodvv4IdlsVVw1OT07LS6Amm2Dmw\nsRXZZNo+kZ74JQRzPc9B2DOwUwuHp7GlL32Rv6GZE/cVGIaROxYN4HzWmw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 172,
+          "comment" : "point with x-coordinate 0",
+          "msg" : "54657374",
+          "sig" : "010000000000000000000000000000000000000000000000000000000000000000003333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "ZkziczINkY2L2y5hIBtFSbNrfNxU4zuErbbywQqsgx4",
+        "y" : "SeaIMfGL2ilzrD12v7yMXuHM7tLdhi4tx8kVxzbO8fQ"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04664ce273320d918d8bdb2e61201b4549b36b7cdc54e33b84adb6f2c10aac831e49e68831f18bda2973ac3d76bfbc8c5ee1cceed2dd862e2dc7c915c736cef1f4",
+        "wx" : "664ce273320d918d8bdb2e61201b4549b36b7cdc54e33b84adb6f2c10aac831e",
+        "wy" : "49e68831f18bda2973ac3d76bfbc8c5ee1cceed2dd862e2dc7c915c736cef1f4"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004664ce273320d918d8bdb2e61201b4549b36b7cdc54e33b84adb6f2c10aac831e49e68831f18bda2973ac3d76bfbc8c5ee1cceed2dd862e2dc7c915c736cef1f4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZkziczINkY2L2y5hIBtFSbNrfNxU\n4zuErbbywQqsgx5J5ogx8YvaKXOsPXa/vIxe4czu0t2GLi3HyRXHNs7x9A==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 173,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "54657374",
+          "sig" : "555555550000000055555555555555553ef7a8e48d07df81a693439654210c703333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aa9",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "lhaRpelg0HowHbutTYYkfsJ9cIn66z3dGt05Xv_x4P4",
+        "y" : "clRiLMNxhmzfmQ0sU3d5DjfR8VGYF_CaIxvSYKnnius"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04961691a5e960d07a301dbbad4d86247ec27d7089faeb3ddd1add395efff1e0fe7254622cc371866cdf990d2c5377790e37d1f1519817f09a231bd260a9e78aeb",
+        "wx" : "0961691a5e960d07a301dbbad4d86247ec27d7089faeb3ddd1add395efff1e0fe",
+        "wy" : "7254622cc371866cdf990d2c5377790e37d1f1519817f09a231bd260a9e78aeb"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004961691a5e960d07a301dbbad4d86247ec27d7089faeb3ddd1add395efff1e0fe7254622cc371866cdf990d2c5377790e37d1f1519817f09a231bd260a9e78aeb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAElhaRpelg0HowHbutTYYkfsJ9cIn6\n6z3dGt05Xv/x4P5yVGIsw3GGbN+ZDSxTd3kON9HxUZgX8JojG9JgqeeK6w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 174,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "54657374",
+          "sig" : "7cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "XSg-E86Mpg2oaOOw-zPmtPEHR5MnTikoJQ5x4qymPpw",
+        "y" : "IU3HT6JTcftNnlBtQY7Zob_W0Mi7ZZHT4PRFBahIhs4"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045d283e13ce8ca60da868e3b0fb33e6b4f1074793274e2928250e71e2aca63e9c214dc74fa25371fb4d9e506d418ed9a1bfd6d0c8bb6591d3e0f44505a84886ce",
+        "wx" : "5d283e13ce8ca60da868e3b0fb33e6b4f1074793274e2928250e71e2aca63e9c",
+        "wy" : "214dc74fa25371fb4d9e506d418ed9a1bfd6d0c8bb6591d3e0f44505a84886ce"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045d283e13ce8ca60da868e3b0fb33e6b4f1074793274e2928250e71e2aca63e9c214dc74fa25371fb4d9e506d418ed9a1bfd6d0c8bb6591d3e0f44505a84886ce",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXSg+E86Mpg2oaOOw+zPmtPEHR5Mn\nTikoJQ5x4qymPpwhTcdPolNx+02eUG1Bjtmhv9bQyLtlkdPg9EUFqEiGzg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 175,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "7cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978b6db6db6249249254924924924924924625bd7a09bec4ca81bcdd9f8fd6b63cc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "D8NR2gOK4IA70dhlFK4EYvn4IWVR2TFaqdKX95Lu9qM",
+        "y" : "QcdO7XhvLTPaNTYMp6qSXnU_ANYHeh6eX8M51jQBnHM"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040fc351da038ae0803bd1d86514ae0462f9f8216551d9315aa9d297f792eef6a341c74eed786f2d33da35360ca7aa925e753f00d6077a1e9e5fc339d634019c73",
+        "wx" : "0fc351da038ae0803bd1d86514ae0462f9f8216551d9315aa9d297f792eef6a3",
+        "wy" : "41c74eed786f2d33da35360ca7aa925e753f00d6077a1e9e5fc339d634019c73"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200040fc351da038ae0803bd1d86514ae0462f9f8216551d9315aa9d297f792eef6a341c74eed786f2d33da35360ca7aa925e753f00d6077a1e9e5fc339d634019c73",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAED8NR2gOK4IA70dhlFK4EYvn4IWVR\n2TFaqdKX95Lu9qNBx07teG8tM9o1NgynqpJedT8A1gd6Hp5fwznWNAGccw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 176,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "7cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978cccccccc00000000cccccccccccccccc971f2ef152794b9d8fc7d568c9e8eaa7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "oeNMjxbROGc_7lXAgFR8K_1N51UAZfY4Miu6lDDOS2A",
+        "y" : "Zivpu1EmY6pNffirPztBgcXUSnvfQkNmILfYprgayTY"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04a1e34c8f16d138673fee55c080547c2bfd4de7550065f638322bba9430ce4b60662be9bb512663aa4d7df8ab3f3b4181c5d44a7bdf42436620b7d8a6b81ac936",
+        "wx" : "0a1e34c8f16d138673fee55c080547c2bfd4de7550065f638322bba9430ce4b60",
+        "wy" : "662be9bb512663aa4d7df8ab3f3b4181c5d44a7bdf42436620b7d8a6b81ac936"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004a1e34c8f16d138673fee55c080547c2bfd4de7550065f638322bba9430ce4b60662be9bb512663aa4d7df8ab3f3b4181c5d44a7bdf42436620b7d8a6b81ac936",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEoeNMjxbROGc/7lXAgFR8K/1N51UA\nZfY4Miu6lDDOS2BmK+m7USZjqk19+Ks/O0GBxdRKe99CQ2Ygt9imuBrJNg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 177,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "7cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc476699783333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aaa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "fhqKgzjX_Yz0HTIqMC0geKh6I8cYYVDtfNpuUoF8G98",
+        "y" : "0KkTWonSHOgh4pAUsomDSSVNdIJystTrjVnuNMYVN38"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "047e1a8a8338d7fd8cf41d322a302d2078a87a23c7186150ed7cda6e52817c1bdfd0a9135a89d21ce821e29014b2898349254d748272b2d4eb8d59ee34c615377f",
+        "wx" : "7e1a8a8338d7fd8cf41d322a302d2078a87a23c7186150ed7cda6e52817c1bdf",
+        "wy" : "0d0a9135a89d21ce821e29014b2898349254d748272b2d4eb8d59ee34c615377f"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200047e1a8a8338d7fd8cf41d322a302d2078a87a23c7186150ed7cda6e52817c1bdfd0a9135a89d21ce821e29014b2898349254d748272b2d4eb8d59ee34c615377f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEfhqKgzjX/Yz0HTIqMC0geKh6I8cY\nYVDtfNpuUoF8G9/QqRNaidIc6CHikBSyiYNJJU10gnKy1OuNWe40xhU3fw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 178,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "7cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc4766997849249248db6db6dbb6db6db6db6db6db5a8b230d0b2b51dcd7ebf0c9fef7c185",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "XBn-Inphq8ZcYe56AYzJVxssb2Y-ozWD92pob2S-B4s",
+        "y" : "e0oNc0lA9hPVK8SGc7RXws94SSSQpcxWBsBUHReyTds"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045c19fe227a61abc65c61ee7a018cc9571b2c6f663ea33583f76a686f64be078b7b4a0d734940f613d52bc48673b457c2cf78492490a5cc5606c0541d17b24ddb",
+        "wx" : "5c19fe227a61abc65c61ee7a018cc9571b2c6f663ea33583f76a686f64be078b",
+        "wy" : "7b4a0d734940f613d52bc48673b457c2cf78492490a5cc5606c0541d17b24ddb"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200045c19fe227a61abc65c61ee7a018cc9571b2c6f663ea33583f76a686f64be078b7b4a0d734940f613d52bc48673b457c2cf78492490a5cc5606c0541d17b24ddb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXBn+Inphq8ZcYe56AYzJVxssb2Y+\nozWD92pob2S+B4t7Sg1zSUD2E9UrxIZztFfCz3hJJJClzFYGwFQdF7JN2w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 179,
+          "comment" : "extreme value for k",
+          "msg" : "54657374",
+          "sig" : "7cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc4766997816a4502e2781e11ac82cbc9d1edd8c981584d13e18411e2f6e0478c34416e3bb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "2wLR80IdYA6dnvnkdBnboyCO7QjC1BiaXbY6vrJzlmY",
+        "y" : "4O0mlnua2p7X_-SAgn-QoNIQ1f2OxijjFxXmskElUSo"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04db02d1f3421d600e9d9ef9e47419dba3208eed08c2d4189a5db63abeb2739666e0ed26967b9ada9ed7ffe480827f90a0d210d5fd8ec628e31715e6b24125512a",
+        "wx" : "0db02d1f3421d600e9d9ef9e47419dba3208eed08c2d4189a5db63abeb2739666",
+        "wy" : "0e0ed26967b9ada9ed7ffe480827f90a0d210d5fd8ec628e31715e6b24125512a"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004db02d1f3421d600e9d9ef9e47419dba3208eed08c2d4189a5db63abeb2739666e0ed26967b9ada9ed7ffe480827f90a0d210d5fd8ec628e31715e6b24125512a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE2wLR80IdYA6dnvnkdBnboyCO7QjC\n1BiaXbY6vrJzlmbg7SaWe5rantf/5ICCf5Cg0hDV/Y7GKOMXFeayQSVRKg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 180,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "54657374",
+          "sig" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296555555550000000055555555555555553ef7a8e48d07df81a693439654210c70",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "YiLRliZVUBiTwp5EE5W2wFcRvT7VoO9yz6szi4ginEs",
+        "y" : "qq4HnLRKGvBwNiqqUg7iTKwmJkI7C_ga8cVDEdji_SM"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046222d1962655501893c29e441395b6c05711bd3ed5a0ef72cfab338b88229c4baaae079cb44a1af070362aaa520ee24cac2626423b0bf81af1c54311d8e2fd23",
+        "wx" : "6222d1962655501893c29e441395b6c05711bd3ed5a0ef72cfab338b88229c4b",
+        "wy" : "0aaae079cb44a1af070362aaa520ee24cac2626423b0bf81af1c54311d8e2fd23"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046222d1962655501893c29e441395b6c05711bd3ed5a0ef72cfab338b88229c4baaae079cb44a1af070362aaa520ee24cac2626423b0bf81af1c54311d8e2fd23",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYiLRliZVUBiTwp5EE5W2wFcRvT7V\noO9yz6szi4ginEuqrgectEoa8HA2KqpSDuJMrCYmQjsL+BrxxUMR2OL9Iw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 181,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b6db6db6249249254924924924924924625bd7a09bec4ca81bcdd9f8fd6b63cc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "TM-iTGfz3vf6gbyZxwuwQZwJUrpZn0wDNh2hhLBM3KU",
+        "y" : "23a3l_f0HZxymiIZR4p-Ypco34cIAL6M9sp6CoIVO_o"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044ccfa24c67f3def7fa81bc99c70bb0419c0952ba599f4c03361da184b04cdca5db76b797f7f41d9c729a2219478a7e629728df870800be8cf6ca7a0a82153bfa",
+        "wx" : "4ccfa24c67f3def7fa81bc99c70bb0419c0952ba599f4c03361da184b04cdca5",
+        "wy" : "0db76b797f7f41d9c729a2219478a7e629728df870800be8cf6ca7a0a82153bfa"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044ccfa24c67f3def7fa81bc99c70bb0419c0952ba599f4c03361da184b04cdca5db76b797f7f41d9c729a2219478a7e629728df870800be8cf6ca7a0a82153bfa",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETM+iTGfz3vf6gbyZxwuwQZwJUrpZ\nn0wDNh2hhLBM3KXbdreX9/QdnHKaIhlHin5ilyjfhwgAvoz2ynoKghU7+g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 182,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296cccccccc00000000cccccccccccccccc971f2ef152794b9d8fc7d568c9e8eaa7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "6hxyyRA0A2uscUArbp7MSvPb3nqZ3FdAYemf7_-dhNo",
+        "y" : "t90FfnW3isb1bjTrBI8KnSnV0FVAjJDQK8LqkYwYy2M"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ea1c72c91034036bac71402b6e9ecc4af3dbde7a99dc574061e99fefff9d84dab7dd057e75b78ac6f56e34eb048f0a9d29d5d055408c90d02bc2ea918c18cb63",
+        "wx" : "0ea1c72c91034036bac71402b6e9ecc4af3dbde7a99dc574061e99fefff9d84da",
+        "wy" : "0b7dd057e75b78ac6f56e34eb048f0a9d29d5d055408c90d02bc2ea918c18cb63"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ea1c72c91034036bac71402b6e9ecc4af3dbde7a99dc574061e99fefff9d84dab7dd057e75b78ac6f56e34eb048f0a9d29d5d055408c90d02bc2ea918c18cb63",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6hxyyRA0A2uscUArbp7MSvPb3nqZ\n3FdAYemf7/+dhNq33QV+dbeKxvVuNOsEjwqdKdXQVUCMkNArwuqRjBjLYw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 183,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2963333333300000000333333333333333325c7cbbc549e52e763f1f55a327a3aaa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "woeaZthssguCC3eV2i2mKziST3gX0c01DZNpiOkOebw",
+        "y" : "VDGnJo_2kxx6dZ3gJO_5C8sBdyFttv0fOqqhH6O2oIM"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04c2879a66d86cb20b820b7795da2da62b38924f7817d1cd350d936988e90e79bc5431a7268ff6931c7a759de024eff90bcb0177216db6fd1f3aaaa11fa3b6a083",
+        "wx" : "0c2879a66d86cb20b820b7795da2da62b38924f7817d1cd350d936988e90e79bc",
+        "wy" : "5431a7268ff6931c7a759de024eff90bcb0177216db6fd1f3aaaa11fa3b6a083"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004c2879a66d86cb20b820b7795da2da62b38924f7817d1cd350d936988e90e79bc5431a7268ff6931c7a759de024eff90bcb0177216db6fd1f3aaaa11fa3b6a083",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwoeaZthssguCC3eV2i2mKziST3gX\n0c01DZNpiOkOebxUMacmj/aTHHp1neAk7/kLywF3IW22/R86qqEfo7aggw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 184,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29649249248db6db6dbb6db6db6db6db6db5a8b230d0b2b51dcd7ebf0c9fef7c185",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "qxwPJz90q8K4SMdQBvLvPFTCbfJ3EbBlWPRVB5ruC6M",
+        "y" : "31EPLs722aBZl8d28UrWRWwXnwoTrxdx5NbDf6SLR_I"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ab1c0f273f74abc2b848c75006f2ef3c54c26df27711b06558f455079aee0ba3df510f2ecef6d9a05997c776f14ad6456c179f0a13af1771e4d6c37fa48b47f2",
+        "wx" : "0ab1c0f273f74abc2b848c75006f2ef3c54c26df27711b06558f455079aee0ba3",
+        "wy" : "0df510f2ecef6d9a05997c776f14ad6456c179f0a13af1771e4d6c37fa48b47f2"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004ab1c0f273f74abc2b848c75006f2ef3c54c26df27711b06558f455079aee0ba3df510f2ecef6d9a05997c776f14ad6456c179f0a13af1771e4d6c37fa48b47f2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEqxwPJz90q8K4SMdQBvLvPFTCbfJ3\nEbBlWPRVB5ruC6PfUQ8uzvbZoFmXx3bxStZFbBefChOvF3Hk1sN/pItH8g==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 185,
+          "comment" : "extreme value for k",
+          "msg" : "54657374",
+          "sig" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c29616a4502e2781e11ac82cbc9d1edd8c981584d13e18411e2f6e0478c34416e3bb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "axfR8uEsQkf4vOblY6RA8ncDfYEt6zOg9KE5RdiYwpY",
+        "y" : "T-NC4v4af5uO5-tKfA-eFivOM1drMV7Oy7ZAaDe_UfU"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5",
+        "wx" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
+        "wy" : "4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaxfR8uEsQkf4vOblY6RA8ncDfYEt\n6zOg9KE5RdiYwpZP40Li/hp/m47n60p8D54WK84zV2sxXs7LtkBoN79R9Q==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 186,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 187,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "acd155416a8b77f34089464733ff7cd39c400e9c69af7beb9eac5054ed2ec72c249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "axfR8uEsQkf4vOblY6RA8ncDfYEt6zOg9KE5RdiYwpY",
+        "y" : "sBy9HAHlgGVxGBS1g_Bh6dQxzKmUzqExNEm_l8hArgo"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a",
+        "wx" : "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
+        "wy" : "0b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296b01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaxfR8uEsQkf4vOblY6RA8ncDfYEt\n6zOg9KE5RdiYwpawHL0cAeWAZXEYFLWD8GHp1DHMqZTOoTE0Sb+XyECuCg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 188,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 189,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "acd155416a8b77f34089464733ff7cd39c400e9c69af7beb9eac5054ed2ec72c249249246db6db6ddb6db6db6db6db6dad4591868595a8ee6bf5f864ff7be0c2",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AR0vyZTfIEtj8FroQgyjkFWbgMSYjvY5uVxGnlyyTPIWVAy-vEcLyqBGZhLb3m0DCYxpluCgXwKQIYPOuktTD081",
+        "y" : "AKmeTNyKUMDZjYcJROVlSNxM9ru_PWl477yPyHeLM-Ey0sGFwghEzz3zlNUiJZMX45MfATDyP2UAyIDzqDGatEoO"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04011d2fc994df204b63f05ae8420ca390559b80c4988ef639b95c469e5cb24cf216540cbebc470bcaa0466612dbde6d03098c6996e0a05f02902183ceba4b530f4f3500a99e4cdc8a50c0d98d870944e56548dc4cf6bbbf3d6978efbc8fc8778b33e132d2c185c20844cf3df394d522259317e3931f0130f23f6500c880f3a8319ab44a0e",
+        "wx" : "11d2fc994df204b63f05ae8420ca390559b80c4988ef639b95c469e5cb24cf216540cbebc470bcaa0466612dbde6d03098c6996e0a05f02902183ceba4b530f4f35",
+        "wy" : "0a99e4cdc8a50c0d98d870944e56548dc4cf6bbbf3d6978efbc8fc8778b33e132d2c185c20844cf3df394d522259317e3931f0130f23f6500c880f3a8319ab44a0e"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004011d2fc994df204b63f05ae8420ca390559b80c4988ef639b95c469e5cb24cf216540cbebc470bcaa0466612dbde6d03098c6996e0a05f02902183ceba4b530f4f3500a99e4cdc8a50c0d98d870944e56548dc4cf6bbbf3d6978efbc8fc8778b33e132d2c185c20844cf3df394d522259317e3931f0130f23f6500c880f3a8319ab44a0e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBHS/JlN8gS2PwWuhCDKOQVZuAxJiO\n9jm5XEaeXLJM8hZUDL68RwvKoEZmEtvebQMJjGmW4KBfApAhg866S1MPTzUAqZ5M\n3IpQwNmNhwlE5WVI3Ez2u789aXjvvI/Id4sz4TLSwYXCCETPPfOU1SIlkxfjkx8B\nMPI/ZQDIgPOoMZq0Sg4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 190,
+          "comment" : "k*G has a large x-coordinate",
+          "msg" : "54657374",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000005ae79787c40d069948033feb708f65a2fc44a36477663b851449048e16ec79bf501fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 191,
+          "comment" : "r too large",
+          "msg" : "54657374",
+          "sig" : "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AZoCnHf-0EyrGriTf9qBKPwZv4xBqPJC9qnKbwroE8Fwm4sD4mqSmP5Z-Z43Bv_CjEPSahFpDS_9gVoz6jKQdml4",
+        "y" : "ABJbKktjX1FP1dYyFWcvMRrlk1wXdO1dikSJe2gZHmNpqybfkV4gZqlD5Zo1dzGdrFqGZAvIxxjSsVlHn90i0RRB"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04019a029c77fed04cab1ab8937fda8128fc19bf8c41a8f242f6a9ca6f0ae813c1709b8b03e26a9298fe59f99e3706ffc28c43d26a11690d2ffd815a33ea329076697800125b2a4b635f514fd5d63215672f311ae5935c1774ed5d8a44897b68191e6369ab26df915e2066a943e59a3577319dac5a86640bc8c718d2b159479fdd22d11441",
+        "wx" : "19a029c77fed04cab1ab8937fda8128fc19bf8c41a8f242f6a9ca6f0ae813c1709b8b03e26a9298fe59f99e3706ffc28c43d26a11690d2ffd815a33ea3290766978",
+        "wy" : "125b2a4b635f514fd5d63215672f311ae5935c1774ed5d8a44897b68191e6369ab26df915e2066a943e59a3577319dac5a86640bc8c718d2b159479fdd22d11441"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004019a029c77fed04cab1ab8937fda8128fc19bf8c41a8f242f6a9ca6f0ae813c1709b8b03e26a9298fe59f99e3706ffc28c43d26a11690d2ffd815a33ea329076697800125b2a4b635f514fd5d63215672f311ae5935c1774ed5d8a44897b68191e6369ab26df915e2066a943e59a3577319dac5a86640bc8c718d2b159479fdd22d11441",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBmgKcd/7QTKsauJN/2oEo/Bm/jEGo\n8kL2qcpvCugTwXCbiwPiapKY/ln5njcG/8KMQ9JqEWkNL/2BWjPqMpB2aXgAElsq\nS2NfUU/V1jIVZy8xGuWTXBd07V2KRIl7aBkeY2mrJt+RXiBmqUPlmjV3MZ2sWoZk\nC8jHGNKxWUef3SLRFEE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 192,
+          "comment" : "r,s are large",
+          "msg" : "54657374",
+          "sig" : "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640701fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e91386406",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AOtih4BAtMoMjGGv5-GV4i45X2nHhZrCt5gClnCYMlVztW09Zbe88xEbxIWeHQgWxUFHOsH_z0osx9bmqlkboRev",
+        "y" : "AFvqJsrHziE1hLXTWrIti0XciP8m7brdSHqpjMqnFhO7e3nc5nqbw20-mA_BDUMTrCDEzycezB9K2rOVE5capPud"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400eb62878040b4ca0c8c61afe7e195e22e395f69c7859ac2b79802967098325573b56d3d65b7bcf3111bc4859e1d0816c541473ac1ffcf4a2cc7d6e6aa591ba117af005bea26cac7ce213584b5d35ab22d8b45dc88ff26edbadd487aa98ccaa71613bb7b79dce67a9bc36d3e980fc10d4313ac20c4cf271ecc1f4adab39513971aa4fb9d",
+        "wx" : "0eb62878040b4ca0c8c61afe7e195e22e395f69c7859ac2b79802967098325573b56d3d65b7bcf3111bc4859e1d0816c541473ac1ffcf4a2cc7d6e6aa591ba117af",
+        "wy" : "5bea26cac7ce213584b5d35ab22d8b45dc88ff26edbadd487aa98ccaa71613bb7b79dce67a9bc36d3e980fc10d4313ac20c4cf271ecc1f4adab39513971aa4fb9d"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400eb62878040b4ca0c8c61afe7e195e22e395f69c7859ac2b79802967098325573b56d3d65b7bcf3111bc4859e1d0816c541473ac1ffcf4a2cc7d6e6aa591ba117af005bea26cac7ce213584b5d35ab22d8b45dc88ff26edbadd487aa98ccaa71613bb7b79dce67a9bc36d3e980fc10d4313ac20c4cf271ecc1f4adab39513971aa4fb9d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQA62KHgEC0ygyMYa/n4ZXiLjlfaceF\nmsK3mAKWcJgyVXO1bT1lt7zzERvEhZ4dCBbFQUc6wf/PSizH1uaqWRuhF68AW+om\nysfOITWEtdNasi2LRdyI/ybtut1IeqmMyqcWE7t7edzmepvDbT6YD8ENQxOsIMTP\nJx7MH0ras5UTlxqk+50=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 193,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0095e19fd2b755d603bf994562d9a11f63cf4eadecbdc0ecb5a394e54529e8da58a527bc6d85725043786362ab4de6cbc7d80e625ae0a98861aea1c7bf7109c91f66",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "ASlrBJ8ZeXhbM3fF4o7fTCeH8hPyg2vq9dYUB4cK3oV9UIPgHYcosN3eG6G7PnkWF-3bAqUseASXkcpStkb5MRfC",
+        "y" : "ALl3pxGlAwxO9pkIMylhMiA7rb28AUB8Ss60nJa2WPx3_x9lWtdOE0Ti_FXJHH_DQyNVGS2z0sA80TS6OHrTrN5A"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401296b049f1979785b3377c5e28edf4c2787f213f2836beaf5d61407870ade857d5083e01d8728b0ddde1ba1bb3e791617eddb02a52c78049791ca52b646f93117c200b977a711a5030c4ef6990833296132203badbdbc01407c4aceb49c96b658fc77ff1f655ad74e1344e2fc55c91c7fc3432355192db3d2c03cd134ba387ad3acde40",
+        "wx" : "1296b049f1979785b3377c5e28edf4c2787f213f2836beaf5d61407870ade857d5083e01d8728b0ddde1ba1bb3e791617eddb02a52c78049791ca52b646f93117c2",
+        "wy" : "0b977a711a5030c4ef6990833296132203badbdbc01407c4aceb49c96b658fc77ff1f655ad74e1344e2fc55c91c7fc3432355192db3d2c03cd134ba387ad3acde40"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401296b049f1979785b3377c5e28edf4c2787f213f2836beaf5d61407870ade857d5083e01d8728b0ddde1ba1bb3e791617eddb02a52c78049791ca52b646f93117c200b977a711a5030c4ef6990833296132203badbdbc01407c4aceb49c96b658fc77ff1f655ad74e1344e2fc55c91c7fc3432355192db3d2c03cd134ba387ad3acde40",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBKWsEnxl5eFszd8Xijt9MJ4fyE/KD\na+r11hQHhwrehX1Qg+Adhyiw3d4bobs+eRYX7dsCpSx4BJeRylK2RvkxF8IAuXen\nEaUDDE72mQgzKWEyIDutvbwBQHxKzrSclrZY/Hf/H2Va104TROL8Vckcf8NDI1UZ\nLbPSwDzRNLo4etOs3kA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 194,
+          "comment" : "r and s^-1 have a large Hamming weight",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015837645583a37a7a665f983c5e347f65dca47647aa80fd2498a791d44d9b2850a151a6e86fce7d7bb814e724ff11b9ef726bf36c6e7548c37f82a24902876ee19",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AF9QWTCDSfnru00cVcCvzPYhYuwd0S7z7ZBmVpJP_ZnKufBrDrIYz_B4pGd6XOHMB2UryXau_HMsKPZ-8HikNOmZ",
+        "y" : "AKXRTfMQYw127APLb5uVvxoiQ4EFyIzZ_T2sgPhXrdOCcdi6kBaEsm1DbUqFmtTNpelne3PKs_Pl5Bo9eZZgcnmr"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04005f5059308349f9ebbb4d1c55c0afccf62162ec1dd12ef3ed906656924ffd99cab9f06b0eb218cff078a4677a5ce1cc07652bc976aefc732c28f67ef078a434e99900a5d14df310630d76ec03cb6f9b95bf1a22438105c88cd9fd3dac80f857add38271d8ba901684b26d436d4a859ad4cda5e9677b73cab3f3e5e41a3d7996607279ab",
+        "wx" : "5f5059308349f9ebbb4d1c55c0afccf62162ec1dd12ef3ed906656924ffd99cab9f06b0eb218cff078a4677a5ce1cc07652bc976aefc732c28f67ef078a434e999",
+        "wy" : "0a5d14df310630d76ec03cb6f9b95bf1a22438105c88cd9fd3dac80f857add38271d8ba901684b26d436d4a859ad4cda5e9677b73cab3f3e5e41a3d7996607279ab"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004005f5059308349f9ebbb4d1c55c0afccf62162ec1dd12ef3ed906656924ffd99cab9f06b0eb218cff078a4677a5ce1cc07652bc976aefc732c28f67ef078a434e99900a5d14df310630d76ec03cb6f9b95bf1a22438105c88cd9fd3dac80f857add38271d8ba901684b26d436d4a859ad4cda5e9677b73cab3f3e5e41a3d7996607279ab",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAX1BZMINJ+eu7TRxVwK/M9iFi7B3R\nLvPtkGZWkk/9mcq58GsOshjP8HikZ3pc4cwHZSvJdq78cywo9n7weKQ06ZkApdFN\n8xBjDXbsA8tvm5W/GiJDgQXIjNn9PayA+Fet04Jx2LqQFoSybUNtSoWa1M2l6Wd7\nc8qz8+XkGj15lmByeas=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 195,
+          "comment" : "small r and s",
+          "msg" : "54657374",
+          "sig" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 196,
+          "comment" : "incorrect size of signature",
+          "msg" : "54657374",
+          "sig" : "0101",
+          "result" : "acceptable",
+          "flags" : [
+            "SigSize"
+          ]
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AB-3BkJ0ujtZUPAKAnyyz0LR7WnInZRNoEFekIbzXIW0Sv3WNc3B-t4s5x5iSF4kPOufB1oRFHYwLmDX14sSB82n",
+        "y" : "AGtCUgdxcjMgWanGD5Zok_2n5zN33ry6mo9pzuj1nWeiyokvrR30RjFh8VfHwRfBu_3ciEQcTIq8Y2Z75cH_Ivbi"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04001fb7064274ba3b5950f00a027cb2cf42d1ed69c89d944da0415e9086f35c85b44afdd635cdc1fade2ce71e62485e243ceb9f075a111476302e60d7d78b1207cda7006b4252077172332059a9c60f966893fda7e73377debcba9a8f69cee8f59d67a2ca892fad1df4463161f157c7c117c1bbfddc88441c4c8abc63667be5c1ff22f6e2",
+        "wx" : "1fb7064274ba3b5950f00a027cb2cf42d1ed69c89d944da0415e9086f35c85b44afdd635cdc1fade2ce71e62485e243ceb9f075a111476302e60d7d78b1207cda7",
+        "wy" : "6b4252077172332059a9c60f966893fda7e73377debcba9a8f69cee8f59d67a2ca892fad1df4463161f157c7c117c1bbfddc88441c4c8abc63667be5c1ff22f6e2"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004001fb7064274ba3b5950f00a027cb2cf42d1ed69c89d944da0415e9086f35c85b44afdd635cdc1fade2ce71e62485e243ceb9f075a111476302e60d7d78b1207cda7006b4252077172332059a9c60f966893fda7e73377debcba9a8f69cee8f59d67a2ca892fad1df4463161f157c7c117c1bbfddc88441c4c8abc63667be5c1ff22f6e2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAH7cGQnS6O1lQ8AoCfLLPQtHtacid\nlE2gQV6QhvNchbRK/dY1zcH63iznHmJIXiQ8658HWhEUdjAuYNfXixIHzacAa0JS\nB3FyMyBZqcYPlmiT/afnM3fevLqaj2nO6PWdZ6LKiS+tHfRGMWHxV8fBF8G7/dyI\nRBxMirxjZnvlwf8i9uI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 197,
+          "comment" : "small r and s",
+          "msg" : "54657374",
+          "sig" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 198,
+          "comment" : "incorrect size of signature",
+          "msg" : "54657374",
+          "sig" : "0102",
+          "result" : "acceptable",
+          "flags" : [
+            "SigSize"
+          ]
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AYd9QsEQqfvjcj5oTqAcVSaXqOg2eBRcutwuJ8M-du8u2IXnr3f4MxMhOwQQe0uS-Arr_WcP0UZ7K7kzOsKA6pth",
+        "y" : "Aaz06FoMy9_EcDY4wh60W0qT2z-nR7NlI4U1za7k_FaqlYVLTsnEUWk6r3KpDWbTANIhG9wfoM-F5cJK4I7yokJI"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401877d42c110a9fbe3723e684ea01c552697a8e83678145cbadc2e27c33e76ef2ed885e7af77f83313213b04107b4b92f80aebfd670fd1467b2bb9333ac280ea9b6101acf4e85a0ccbdfc4703638c21eb45b4a93db3fa747b365238535cdaee4fc56aa95854b4ec9c451693aaf72a90d66d300d2211bdc1fa0cf85e5c24ae08ef2a24248",
+        "wx" : "1877d42c110a9fbe3723e684ea01c552697a8e83678145cbadc2e27c33e76ef2ed885e7af77f83313213b04107b4b92f80aebfd670fd1467b2bb9333ac280ea9b61",
+        "wy" : "1acf4e85a0ccbdfc4703638c21eb45b4a93db3fa747b365238535cdaee4fc56aa95854b4ec9c451693aaf72a90d66d300d2211bdc1fa0cf85e5c24ae08ef2a24248"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401877d42c110a9fbe3723e684ea01c552697a8e83678145cbadc2e27c33e76ef2ed885e7af77f83313213b04107b4b92f80aebfd670fd1467b2bb9333ac280ea9b6101acf4e85a0ccbdfc4703638c21eb45b4a93db3fa747b365238535cdaee4fc56aa95854b4ec9c451693aaf72a90d66d300d2211bdc1fa0cf85e5c24ae08ef2a24248",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBh31CwRCp++NyPmhOoBxVJpeo6DZ4\nFFy63C4nwz527y7Yheevd/gzEyE7BBB7S5L4Cuv9Zw/RRnsruTM6woDqm2EBrPTo\nWgzL38RwNjjCHrRbSpPbP6dHs2UjhTXNruT8VqqVhUtOycRRaTqvcqkNZtMA0iEb\n3B+gz4XlwkrgjvKiQkg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 199,
+          "comment" : "small r and s",
+          "msg" : "54657374",
+          "sig" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 200,
+          "comment" : "incorrect size of signature",
+          "msg" : "54657374",
+          "sig" : "0103",
+          "result" : "acceptable",
+          "flags" : [
+            "SigSize"
+          ]
+        },
+        {
+          "tcId" : 201,
+          "comment" : "r is larger than n",
+          "msg" : "54657374",
+          "sig" : "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AW6vLDBDsQrYqZvn-MzEkxUZtuxZMm9qBvN0y0-G4SN98PJt9qkM-Gww1C470Fg8dEgw3s94NEVF9Lba6mdKiC25",
+        "y" : "AG39CTIKl21ZLE050wkNb0rTmStwDj6Q7RoTRiOMdfS69JO-jBwWg47OwtmZQmYEL_nGJIaSlu6bAju7EtQLwK8H"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04016eaf2c3043b10ad8a99be7f8ccc4931519b6ec59326f6a06f374cb4f86e1237df0f26df6a90cf86c30d42e3bd0583c744830decf78344545f4b6daea674a882db9006dfd09320a976d592c4d39d3090d6f4ad3992b700e3e90ed1a1346238c75f4baf493be8c1c16838ecec2d9994266042ff9c624869296ee9b023bbb12d40bc0af07",
+        "wx" : "16eaf2c3043b10ad8a99be7f8ccc4931519b6ec59326f6a06f374cb4f86e1237df0f26df6a90cf86c30d42e3bd0583c744830decf78344545f4b6daea674a882db9",
+        "wy" : "6dfd09320a976d592c4d39d3090d6f4ad3992b700e3e90ed1a1346238c75f4baf493be8c1c16838ecec2d9994266042ff9c624869296ee9b023bbb12d40bc0af07"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004016eaf2c3043b10ad8a99be7f8ccc4931519b6ec59326f6a06f374cb4f86e1237df0f26df6a90cf86c30d42e3bd0583c744830decf78344545f4b6daea674a882db9006dfd09320a976d592c4d39d3090d6f4ad3992b700e3e90ed1a1346238c75f4baf493be8c1c16838ecec2d9994266042ff9c624869296ee9b023bbb12d40bc0af07",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBbq8sMEOxCtipm+f4zMSTFRm27Fky\nb2oG83TLT4bhI33w8m32qQz4bDDULjvQWDx0SDDez3g0RUX0ttrqZ0qILbkAbf0J\nMgqXbVksTTnTCQ1vStOZK3AOPpDtGhNGI4x19Lr0k76MHBaDjs7C2ZlCZgQv+cYk\nhpKW7psCO7sS1AvArwc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 202,
+          "comment" : "s is larger than n",
+          "msg" : "54657374",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e914b3a90",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AYtw3zlqa9hBjeah9-gPkVvMB5EpzctKHHaw4dJXaRDxrhbzwnZxjIQcA-GM4kPrrlqmGPCc3fRwNBIkpQFvbwTo",
+        "y" : "AXrTxhArKCEgDTc8_9VhSmcL69zm8kSzTc6H3YdYeGt6KCnNU-WTJdzr6UtWQLnRyndcUnFqWW2eOghA_9vWS_JH"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04018b70df396a6bd8418de6a1f7e80f915bcc079129cdcb4a1c76b0e1d2576910f1ae16f3c276718c841c03e18ce243ebae5aa618f09cddf470341224a5016f6f04e8017ad3c6102b2821200d373cffd5614a670bebdce6f244b34dce87dd8758786b7a2829cd53e59325dcebe94b5640b9d1ca775c52716a596d9e3a0840ffdbd64bf247",
+        "wx" : "18b70df396a6bd8418de6a1f7e80f915bcc079129cdcb4a1c76b0e1d2576910f1ae16f3c276718c841c03e18ce243ebae5aa618f09cddf470341224a5016f6f04e8",
+        "wy" : "17ad3c6102b2821200d373cffd5614a670bebdce6f244b34dce87dd8758786b7a2829cd53e59325dcebe94b5640b9d1ca775c52716a596d9e3a0840ffdbd64bf247"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004018b70df396a6bd8418de6a1f7e80f915bcc079129cdcb4a1c76b0e1d2576910f1ae16f3c276718c841c03e18ce243ebae5aa618f09cddf470341224a5016f6f04e8017ad3c6102b2821200d373cffd5614a670bebdce6f244b34dce87dd8758786b7a2829cd53e59325dcebe94b5640b9d1ca775c52716a596d9e3a0840ffdbd64bf247",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBi3DfOWpr2EGN5qH36A+RW8wHkSnN\ny0ocdrDh0ldpEPGuFvPCdnGMhBwD4YziQ+uuWqYY8Jzd9HA0EiSlAW9vBOgBetPG\nECsoISANNzz/1WFKZwvr3ObyRLNNzofdh1h4a3ooKc1T5ZMl3OvpS1ZAudHKd1xS\ncWpZbZ46CED/29ZL8kc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 203,
+          "comment" : "small r and s^-1",
+          "msg" : "54657374",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010001efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7efdfbf7ef87b4de1fc92dd757639408a50bee10764e326fdd2fa308dfde3e5243fdf4ac5ac",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "ABMzeYhkRYgI_WsQpsglF0DabWI0QM3x41lugxK1jyNpLWoCENFoLAakdvRHA016NGl20MLOGlg_lveaU1a5oIC5",
+        "y" : "AGQ9I7UhKS-paWa39zPPIItr51ZH34bi4szaQKszYKsdYx7xP-Zus-CPrqGURbb5PoMj4X3ikJMfrb4ran0s3zPX"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04001333798864458808fd6b10a6c8251740da6d623440cdf1e3596e8312b58f23692d6a0210d1682c06a476f447034d7a346976d0c2ce1a583f96f79a5356b9a080b900643d23b521292fa96966b7f733cf208b6be75647df86e2e2ccda40ab3360ab1d631ef13fe66eb3e08faea19445b6f93e8323e17de290931fadbe2b6a7d2cdf33d7",
+        "wx" : "1333798864458808fd6b10a6c8251740da6d623440cdf1e3596e8312b58f23692d6a0210d1682c06a476f447034d7a346976d0c2ce1a583f96f79a5356b9a080b9",
+        "wy" : "643d23b521292fa96966b7f733cf208b6be75647df86e2e2ccda40ab3360ab1d631ef13fe66eb3e08faea19445b6f93e8323e17de290931fadbe2b6a7d2cdf33d7"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004001333798864458808fd6b10a6c8251740da6d623440cdf1e3596e8312b58f23692d6a0210d1682c06a476f447034d7a346976d0c2ce1a583f96f79a5356b9a080b900643d23b521292fa96966b7f733cf208b6be75647df86e2e2ccda40ab3360ab1d631ef13fe66eb3e08faea19445b6f93e8323e17de290931fadbe2b6a7d2cdf33d7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAEzN5iGRFiAj9axCmyCUXQNptYjRA\nzfHjWW6DErWPI2ktagIQ0WgsBqR29EcDTXo0aXbQws4aWD+W95pTVrmggLkAZD0j\ntSEpL6lpZrf3M88gi2vnVkffhuLizNpAqzNgqx1jHvE/5m6z4I+uoZRFtvk+gyPh\nfeKQkx+tvitqfSzfM9c=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 204,
+          "comment" : "smallish r and s^-1",
+          "msg" : "54657374",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d9b4d347952cd0100508d073413de829275e76509fd81cff49adf4c80ed2ddd4a7937d1d918796878fec24cc46570982c3fb8f5e92ccdcb3e677f07e9bd0db0b84814be1c7949b0de",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AVP6C-H50Zm6YrHqcEiT6bNLTZHjjxaujEPPO6njt7CbH5PPh2VTY67-k5Y0iq-3Gu_BVniQUN9G-EA7BG4akGqv",
+        "y" : "AcLEGn-gDQ966uyhVk2r6HDJCXGCVRsc7-umtGc-VXobKXWHETlD4lwAwhpU9F8oDg-8URZkkzVn95y9Dp4qWtp1"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040153fa0be1f9d199ba62b1ea704893e9b34b4d91e38f16ae8c43cf3ba9e3b7b09b1f93cf87655363aefe9396348aafb71aefc156789050df46f8403b046e1a906aaf01c2c41a7fa00d0f7aeaeca1564dabe870c9097182551b1cefeba6b4673e557a1b297587113943e25c00c21a54f45f280e0fbc511664933567f79cbd0e9e2a5ada75",
+        "wx" : "153fa0be1f9d199ba62b1ea704893e9b34b4d91e38f16ae8c43cf3ba9e3b7b09b1f93cf87655363aefe9396348aafb71aefc156789050df46f8403b046e1a906aaf",
+        "wy" : "1c2c41a7fa00d0f7aeaeca1564dabe870c9097182551b1cefeba6b4673e557a1b297587113943e25c00c21a54f45f280e0fbc511664933567f79cbd0e9e2a5ada75"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040153fa0be1f9d199ba62b1ea704893e9b34b4d91e38f16ae8c43cf3ba9e3b7b09b1f93cf87655363aefe9396348aafb71aefc156789050df46f8403b046e1a906aaf01c2c41a7fa00d0f7aeaeca1564dabe870c9097182551b1cefeba6b4673e557a1b297587113943e25c00c21a54f45f280e0fbc511664933567f79cbd0e9e2a5ada75",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBU/oL4fnRmbpisepwSJPps0tNkeOP\nFq6MQ887qeO3sJsfk8+HZVNjrv6TljSKr7ca78FWeJBQ30b4QDsEbhqQaq8BwsQa\nf6AND3rq7KFWTavocMkJcYJVGxzv66a0Zz5VehspdYcROUPiXADCGlT0XygOD7xR\nFmSTNWf3nL0Onipa2nU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 205,
+          "comment" : "100-bit r and small s^-1",
+          "msg" : "54657374",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001033e67e37b32b445580bf4eff013cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc33cc3393f632affd3eaa3c8fb64507bd5996497bd588fb9e3947c097ced7546b57c8998",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AVIwRZm6Ifz57yR7md8SracUyQZz8xcApxS8yqZH9jCAiaQ42VpGIGRiS4wW1C1mDzwWonqCPfHdA5iJkCjvi-bA",
+        "y" : "AOLmGifo-_Cwr7HDlI6LiTdbbl7LXd1G4dLCoZa6rh741o5PCpJKm2v4XlD8z3GdthCqAE-vzvg9mWzR78vQCCim"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040152304599ba21fcf9ef247b99df12ada714c90673f31700a714bccaa647f6308089a438d95a462064624b8c16d42d660f3c16a27a823df1dd0398899028ef8be6c000e2e61a27e8fbf0b0afb1c3948e8b89375b6e5ecb5ddd46e1d2c2a196baae1ef8d68e4f0a924a9b6bf85e50fccf719db610aa004fafcef83d996cd1efcbd00828a6",
+        "wx" : "152304599ba21fcf9ef247b99df12ada714c90673f31700a714bccaa647f6308089a438d95a462064624b8c16d42d660f3c16a27a823df1dd0398899028ef8be6c0",
+        "wy" : "0e2e61a27e8fbf0b0afb1c3948e8b89375b6e5ecb5ddd46e1d2c2a196baae1ef8d68e4f0a924a9b6bf85e50fccf719db610aa004fafcef83d996cd1efcbd00828a6"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040152304599ba21fcf9ef247b99df12ada714c90673f31700a714bccaa647f6308089a438d95a462064624b8c16d42d660f3c16a27a823df1dd0398899028ef8be6c000e2e61a27e8fbf0b0afb1c3948e8b89375b6e5ecb5ddd46e1d2c2a196baae1ef8d68e4f0a924a9b6bf85e50fccf719db610aa004fafcef83d996cd1efcbd00828a6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBUjBFmboh/PnvJHuZ3xKtpxTJBnPz\nFwCnFLzKpkf2MICJpDjZWkYgZGJLjBbULWYPPBaieoI98d0DmImQKO+L5sAA4uYa\nJ+j78LCvscOUjouJN1tuXstd3Ubh0sKhlrquHvjWjk8Kkkqba/heUPzPcZ22EKoA\nT6/O+D2ZbNHvy9AIKKY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 206,
+          "comment" : "small r and 100 bit s^-1",
+          "msg" : "54657374",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000086ecbf54ab59a4e195f0be1402edd8657bb94618fab50f2fe20fe5ebbc9ff0e491397ed313cc918d438eedb9b5ecb4d9dfa305303505baf25400ed8c20fc3fc47b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "ANA6zO7dt9j2AEEgXe-C4J5kvFmBHPZQLeqPcqmo5908arA-Pm1NExtohX0K6W_UtZ1PrIILEGSPsoLflOXSnGLT",
+        "y" : "AQsByFMKCJsHsbKjT9qd_pcSOxwO-Xx8nrZPRKbBrPIQEVfYWWqb29tUrXmztKNt0GdkyrAkdRw_hM0KPNcU1-Sc"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400d03acceeddb7d8f60041205def82e09e64bc59811cf6502dea8f72a9a8e7dd3c6ab03e3e6d4d131b68857d0ae96fd4b59d4fac820b10648fb282df94e5d29c62d3010b01c8530a089b07b1b2a34fda9dfe97123b1c0ef97c7c9eb64f44a6c1acf2101157d8596a9bdbdb54ad79b3b4a36dd06764cab024751c3f84cd0a3cd714d7e49c",
+        "wx" : "0d03acceeddb7d8f60041205def82e09e64bc59811cf6502dea8f72a9a8e7dd3c6ab03e3e6d4d131b68857d0ae96fd4b59d4fac820b10648fb282df94e5d29c62d3",
+        "wy" : "10b01c8530a089b07b1b2a34fda9dfe97123b1c0ef97c7c9eb64f44a6c1acf2101157d8596a9bdbdb54ad79b3b4a36dd06764cab024751c3f84cd0a3cd714d7e49c"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400d03acceeddb7d8f60041205def82e09e64bc59811cf6502dea8f72a9a8e7dd3c6ab03e3e6d4d131b68857d0ae96fd4b59d4fac820b10648fb282df94e5d29c62d3010b01c8530a089b07b1b2a34fda9dfe97123b1c0ef97c7c9eb64f44a6c1acf2101157d8596a9bdbdb54ad79b3b4a36dd06764cab024751c3f84cd0a3cd714d7e49c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQA0DrM7t232PYAQSBd74LgnmS8WYEc\n9lAt6o9yqajn3TxqsD4+bU0TG2iFfQrpb9S1nU+sggsQZI+ygt+U5dKcYtMBCwHI\nUwoImwexsqNP2p3+lxI7HA75fHyetk9EpsGs8hARV9hZapvb21StebO0o23QZ2TK\nsCR1HD+EzQo81xTX5Jw=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 207,
+          "comment" : "100-bit r and s^-1",
+          "msg" : "54657374",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062522bbd3ecbe7c39e93e7c240086ecbf54ab59a4e195f0be1402edd8657bb94618fab50f2fe20fe5ebbc9ff0e491397ed313cc918d438eedb9b5ecb4d9dfa305303505baf25400ed8c20fc3fc47b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AdkpurYQW-3JxfGFTONkdCJITpM6RyyCLz_IjHaEVAOaoNwexPdSFX1GAl6tByKzy4b2gjM-iO3mvS90hwhIc61G",
+        "y" : "AFiIJDNgsIumI418gtdJIPt8jVzK-SssR4gucw5qaKViR008TNnNEwNXTCkK7drCE8yDG25xDJzRNoksrMesji6a"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401d929bab6105bedc9c5f1854ce3647422484e933a472c822f3fc88c768454039aa0dc1ec4f752157d46025ead0722b3cb86f682333e88ede6bd2f7487084873ad46005888243360b08ba6238d7c82d74920fb7c8d5ccaf92b2c47882e730e6a68a562474d3c4cd9cd1303574c290aeddac213cc831b6e710c9cd136892cacc7ac8e2e9a",
+        "wx" : "1d929bab6105bedc9c5f1854ce3647422484e933a472c822f3fc88c768454039aa0dc1ec4f752157d46025ead0722b3cb86f682333e88ede6bd2f7487084873ad46",
+        "wy" : "5888243360b08ba6238d7c82d74920fb7c8d5ccaf92b2c47882e730e6a68a562474d3c4cd9cd1303574c290aeddac213cc831b6e710c9cd136892cacc7ac8e2e9a"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401d929bab6105bedc9c5f1854ce3647422484e933a472c822f3fc88c768454039aa0dc1ec4f752157d46025ead0722b3cb86f682333e88ede6bd2f7487084873ad46005888243360b08ba6238d7c82d74920fb7c8d5ccaf92b2c47882e730e6a68a562474d3c4cd9cd1303574c290aeddac213cc831b6e710c9cd136892cacc7ac8e2e9a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB2Sm6thBb7cnF8YVM42R0IkhOkzpH\nLIIvP8iMdoRUA5qg3B7E91IVfUYCXq0HIrPLhvaCMz6I7ea9L3SHCEhzrUYAWIgk\nM2Cwi6YjjXyC10kg+3yNXMr5KyxHiC5zDmpopWJHTTxM2c0TA1dMKQrt2sITzIMb\nbnEMnNE2iSysx6yOLpo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 208,
+          "comment" : "r and s^-1 are close to n",
+          "msg" : "54657374",
+          "sig" : "01fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138638a015555555555555555555555555555555555555555555555555555555555555555518baf05027f750ef25532ab85fa066e8ad2793125b112da747cf524bf0b7aed5b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AXv-OtpKGgbnMvSE8YMNDAtxxHt0-lBt46veptE5qyHdcsexwTA18P_RJUM9AQCnAwM3uZ3RYmuRylcjM1hToPZ_",
+        "y" : "AH0oRHwvxMKfx0qDjjDq45nigrYH__BhonsNaTIczDzrD8OuhqWMd0Ao2v0Qi9h0uMRPNPWrnS4xynfSqrPMXqzb"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04017bfe3ada4a1a06e732f484f1830d0c0b71c47b74fa506de3abdea6d139ab21dd72c7b1c13035f0ffd125433d0100a7030337b99dd1626b91ca5723335853a0f67f007d28447c2fc4c29fc74a838e30eae399e282b607fff061a27b0d69321ccc3ceb0fc3ae86a58c774028dafd108bd874b8c44f34f5ab9d2e31ca77d2aab3cc5eacdb",
+        "wx" : "17bfe3ada4a1a06e732f484f1830d0c0b71c47b74fa506de3abdea6d139ab21dd72c7b1c13035f0ffd125433d0100a7030337b99dd1626b91ca5723335853a0f67f",
+        "wy" : "7d28447c2fc4c29fc74a838e30eae399e282b607fff061a27b0d69321ccc3ceb0fc3ae86a58c774028dafd108bd874b8c44f34f5ab9d2e31ca77d2aab3cc5eacdb"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004017bfe3ada4a1a06e732f484f1830d0c0b71c47b74fa506de3abdea6d139ab21dd72c7b1c13035f0ffd125433d0100a7030337b99dd1626b91ca5723335853a0f67f007d28447c2fc4c29fc74a838e30eae399e282b607fff061a27b0d69321ccc3ceb0fc3ae86a58c774028dafd108bd874b8c44f34f5ab9d2e31ca77d2aab3cc5eacdb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBe/462koaBucy9ITxgw0MC3HEe3T6\nUG3jq96m0TmrId1yx7HBMDXw/9ElQz0BAKcDAze5ndFia5HKVyMzWFOg9n8AfShE\nfC/Ewp/HSoOOMOrjmeKCtgf/8GGiew1pMhzMPOsPw66GpYx3QCja/RCL2HS4xE80\n9audLjHKd9Kqs8xerNs=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 209,
+          "comment" : "s == 1",
+          "msg" : "54657374",
+          "sig" : "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 210,
+          "comment" : "s == 0",
+          "msg" : "54657374",
+          "sig" : "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "ATtzvg7E8Ys2_cIKrJZ1WAogzHJe0N5v6mOrYRG0quzGmx_fBbscenHEt6Wh6q_yO-FWBPQFtezTs-1q_qjknNZJ",
+        "y" : "AJEhgMmB9IDSuLdDiYiwOgxe_b0toJTwgvf6V-zEH96MZdPJ2A80-RJOFR2lXZbSqbmRZy3nlEm8wcAZK3ZQrpC3"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04013b73be0ec4f18b36fdc20aac9675580a20cc725ed0de6fea63ab6111b4aaecc69b1fdf05bb1c7a71c4b7a5a1eaaff23be15604f405b5ecd3b3ed6afea8e49cd64900912180c981f480d2b8b7438988b03a0c5efdbd2da094f082f7fa57ecc41fde8c65d3c9d80f34f9124e151da55d96d2a9b991672de79449bcc1c0192b7650ae90b7",
+        "wx" : "13b73be0ec4f18b36fdc20aac9675580a20cc725ed0de6fea63ab6111b4aaecc69b1fdf05bb1c7a71c4b7a5a1eaaff23be15604f405b5ecd3b3ed6afea8e49cd649",
+        "wy" : "0912180c981f480d2b8b7438988b03a0c5efdbd2da094f082f7fa57ecc41fde8c65d3c9d80f34f9124e151da55d96d2a9b991672de79449bcc1c0192b7650ae90b7"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004013b73be0ec4f18b36fdc20aac9675580a20cc725ed0de6fea63ab6111b4aaecc69b1fdf05bb1c7a71c4b7a5a1eaaff23be15604f405b5ecd3b3ed6afea8e49cd64900912180c981f480d2b8b7438988b03a0c5efdbd2da094f082f7fa57ecc41fde8c65d3c9d80f34f9124e151da55d96d2a9b991672de79449bcc1c0192b7650ae90b7",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBO3O+DsTxizb9wgqslnVYCiDMcl7Q\n3m/qY6thEbSq7MabH98Fuxx6ccS3paHqr/I74VYE9AW17NOz7Wr+qOSc1kkAkSGA\nyYH0gNK4t0OJiLA6DF79vS2glPCC9/pX7MQf3oxl08nYDzT5Ek4VHaVdltKpuZFn\nLeeUSbzBwBkrdlCukLc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 211,
+          "comment" : "point at infinity during verify",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd28c343c1df97cb35bfe600a47b84d2e81ddae4dc44ce23d75db7db8f489c320400aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AcAeq5um3dIeM0IQNKzWrJI6QJ-rNJ4DgL-qVLQEiQCGpeEvsJ4TUnEs_eFavCVjB5pz0zPJx5xnD7BrXYAqqbd2",
+        "y" : "AKdqKNA_ZXxhv4f_eOdzOgaVVtK9Y4t5MWq3C1ooCbyKmKKoQyONSr4mmLKqau3hslQb89zQB8-c1cTUlpxPf_zL"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401c01eab9ba6ddd21e33421034acd6ac923a409fab349e0380bfaa54b404890086a5e12fb09e1352712cfde15abc2563079a73d333c9c79c670fb06b5d802aa9b77600a76a28d03f657c61bf87ff78e7733a069556d2bd638b79316ab70b5a2809bc8a98a2a843238d4abe2698b2aa6aede1b2541bf3dcd007cf9cd5c4d4969c4f7ffccb",
+        "wx" : "1c01eab9ba6ddd21e33421034acd6ac923a409fab349e0380bfaa54b404890086a5e12fb09e1352712cfde15abc2563079a73d333c9c79c670fb06b5d802aa9b776",
+        "wy" : "0a76a28d03f657c61bf87ff78e7733a069556d2bd638b79316ab70b5a2809bc8a98a2a843238d4abe2698b2aa6aede1b2541bf3dcd007cf9cd5c4d4969c4f7ffccb"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401c01eab9ba6ddd21e33421034acd6ac923a409fab349e0380bfaa54b404890086a5e12fb09e1352712cfde15abc2563079a73d333c9c79c670fb06b5d802aa9b77600a76a28d03f657c61bf87ff78e7733a069556d2bd638b79316ab70b5a2809bc8a98a2a843238d4abe2698b2aa6aede1b2541bf3dcd007cf9cd5c4d4969c4f7ffccb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBwB6rm6bd0h4zQhA0rNaskjpAn6s0\nngOAv6pUtASJAIal4S+wnhNScSz94Vq8JWMHmnPTM8nHnGcPsGtdgCqpt3YAp2oo\n0D9lfGG/h/9453M6BpVW0r1ji3kxarcLWigJvIqYoqhDI41KviaYsqpq7eGyVBvz\n3NAHz5zVxNSWnE9//Ms=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 212,
+          "comment" : "u1 == 1",
+          "msg" : "54657374",
+          "sig" : "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad0000c6ee9e33cf5c6715a1d148fd73f7318884b41adcb916021e2bc0e800a5c5dd97f5142178f6ae88c8fdd98e1afb0ce4c8d2c54b5f37b30b7da1997bb33b0b8a31",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "ABhjZcc1iIB6UQBUEtsAS0X19746YHTmEZBCl42_vFpDHhbMkwdH5s11EVBbTJNJzt-QilqdvTPNsK7Mv2lFRFf7",
+        "y" : "ABRiCimiaR2AONOeHk3nxCQ8jEJgHnGZRcEpfBpLENdBWvN78e0N3JAwvOUwGF39_EZY_2Nfa9lmC-zI_57KT936"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400186365c73588807a51005412db004b45f5f7be3a6074e6119042978dbfbc5a431e16cc930747e6cd7511505b4c9349cedf908a5a9dbd33cdb0aeccbf69454457fb0014620a29a2691d8038d39e1e4de7c4243c8c42601e719945c1297c1a4b10d7415af37bf1ed0ddc9030bce530185dfdfc4658ff635f6bd9660becc8ff9eca4fddfa",
+        "wx" : "186365c73588807a51005412db004b45f5f7be3a6074e6119042978dbfbc5a431e16cc930747e6cd7511505b4c9349cedf908a5a9dbd33cdb0aeccbf69454457fb",
+        "wy" : "14620a29a2691d8038d39e1e4de7c4243c8c42601e719945c1297c1a4b10d7415af37bf1ed0ddc9030bce530185dfdfc4658ff635f6bd9660becc8ff9eca4fddfa"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400186365c73588807a51005412db004b45f5f7be3a6074e6119042978dbfbc5a431e16cc930747e6cd7511505b4c9349cedf908a5a9dbd33cdb0aeccbf69454457fb0014620a29a2691d8038d39e1e4de7c4243c8c42601e719945c1297c1a4b10d7415af37bf1ed0ddc9030bce530185dfdfc4658ff635f6bd9660becc8ff9eca4fddfa",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAGGNlxzWIgHpRAFQS2wBLRfX3vjpg\ndOYRkEKXjb+8WkMeFsyTB0fmzXURUFtMk0nO35CKWp29M82wrsy/aUVEV/sAFGIK\nKaJpHYA4054eTefEJDyMQmAecZlFwSl8GksQ10Fa83vx7Q3ckDC85TAYXf38Rlj/\nY19r2WYL7Mj/nspP3fo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 213,
+          "comment" : "u1 == n - 1",
+          "msg" : "54657374",
+          "sig" : "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad01ff391161cc30a398ea5e2eb7028c08ce777b4be52346e9fde1d43f17ff5a3a22625c72660ac8810da281f2732dfbfcc10768f07e5951e93c3119d63b6b562cd9d8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AC4qdGtV4FvBMNN0yKu4v2UaLisCVATwhUW-_Llcn39oH29bm_LrxF1MhXKSHTq13OFE6l1Q6-yJuMjwEOoxSUhj",
+        "y" : "AIyBbxItXWO1_qANGgDtI1d_fvfUjzlzVoNT1Gg2jsd8vJ48UBKDm3SDMIfVG6PmgKtTdb5oDqjBj3thnzKxQfKB"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04002e2a746b55e05bc130d374c8abb8bf651a2e2b025404f08545befcb95c9f7f681f6f5b9bf2ebc45d4c8572921d3ab5dce144ea5d50ebec89b8c8f010ea31494863008c816f122d5d63b5fea00d1a00ed23577f7ef7d48f3973568353d468368ec77cbc9e3c5012839b74833087d51ba3e680ab5375be680ea8c18f7b619f32b141f281",
+        "wx" : "2e2a746b55e05bc130d374c8abb8bf651a2e2b025404f08545befcb95c9f7f681f6f5b9bf2ebc45d4c8572921d3ab5dce144ea5d50ebec89b8c8f010ea31494863",
+        "wy" : "08c816f122d5d63b5fea00d1a00ed23577f7ef7d48f3973568353d468368ec77cbc9e3c5012839b74833087d51ba3e680ab5375be680ea8c18f7b619f32b141f281"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004002e2a746b55e05bc130d374c8abb8bf651a2e2b025404f08545befcb95c9f7f681f6f5b9bf2ebc45d4c8572921d3ab5dce144ea5d50ebec89b8c8f010ea31494863008c816f122d5d63b5fea00d1a00ed23577f7ef7d48f3973568353d468368ec77cbc9e3c5012839b74833087d51ba3e680ab5375be680ea8c18f7b619f32b141f281",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQALip0a1XgW8Ew03TIq7i/ZRouKwJU\nBPCFRb78uVyff2gfb1ub8uvEXUyFcpIdOrXc4UTqXVDr7Im4yPAQ6jFJSGMAjIFv\nEi1dY7X+oA0aAO0jV39+99SPOXNWg1PUaDaOx3y8njxQEoObdIMwh9Ubo+aAq1N1\nvmgOqMGPe2GfMrFB8oE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 214,
+          "comment" : "u2 == 1",
+          "msg" : "54657374",
+          "sig" : "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "ANN595gmsEGY3zcasFGdGn8KTxmdYUnKi38TpdoJy6Ak--fU_3_XqKk7XLyvPGgkP2MNR9jytlK2p9axxSKnX6ny",
+        "y" : "AcZgci2VyDxrlFeUSsxnHogejRewc2Ly-CeZRW8vFdZi02qgnVpSNiiNPBOC4-Iwj0aGfVPFiKNwhX-uTTLwo92v"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400d379f79826b04198df371ab0519d1a7f0a4f199d6149ca8b7f13a5da09cba024fbe7d4ff7fd7a8a93b5cbcaf3c68243f630d47d8f2b652b6a7d6b1c522a75fa9f201c660722d95c83c6b9457944acc671e881e8d17b07362f2f82799456f2f15d662d36aa09d5a5236288d3c1382e3e2308f46867d53c588a370857fae4d32f0a3ddaf",
+        "wx" : "0d379f79826b04198df371ab0519d1a7f0a4f199d6149ca8b7f13a5da09cba024fbe7d4ff7fd7a8a93b5cbcaf3c68243f630d47d8f2b652b6a7d6b1c522a75fa9f2",
+        "wy" : "1c660722d95c83c6b9457944acc671e881e8d17b07362f2f82799456f2f15d662d36aa09d5a5236288d3c1382e3e2308f46867d53c588a370857fae4d32f0a3ddaf"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400d379f79826b04198df371ab0519d1a7f0a4f199d6149ca8b7f13a5da09cba024fbe7d4ff7fd7a8a93b5cbcaf3c68243f630d47d8f2b652b6a7d6b1c522a75fa9f201c660722d95c83c6b9457944acc671e881e8d17b07362f2f82799456f2f15d662d36aa09d5a5236288d3c1382e3e2308f46867d53c588a370857fae4d32f0a3ddaf",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQA03n3mCawQZjfNxqwUZ0afwpPGZ1h\nScqLfxOl2gnLoCT759T/f9eoqTtcvK88aCQ/Yw1H2PK2Uran1rHFIqdfqfIBxmBy\nLZXIPGuUV5RKzGceiB6NF7BzYvL4J5lFby8V1mLTaqCdWlI2KI08E4Lj4jCPRoZ9\nU8WIo3CFf65NMvCj3a8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 215,
+          "comment" : "u2 == n - 1",
+          "msg" : "54657374",
+          "sig" : "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad015555555555555555555555555555555555555555555555555555555555555555518baf05027f750ef25532ab85fa066e8ad2793125b112da747cf524bf0b7aed5c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AbnMjKtq8-_OYqFd4fKtu7IqTS106NzzL-wKlKPaNQjeHUoHP1JF-WyaaqMCHlTqo1M6eBfE5XlEqyF0VJtrk-tQ",
+        "y" : "AXEs3YNmxFEY8BYWOnNHGY9JWiqbxCeQjbxt1LMw9W4cHfSpiG9_1jxJEkreYNW_jmt6w9adOPnE29ihIhY4JyzL"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401b9cc8cab6af3efce62a15de1f2adbbb22a4d2d74e8dcf32fec0a94a3da3508de1d4a073f5245f96c9a6aa3021e54eaa3533a7817c4e57944ab2174549b6b93eb5001712cdd8366c45118f016163a7347198f495a2a9bc427908dbc6dd4b330f56e1c1df4a9886f7fd63c49124ade60d5bf8e6b7ac3d69d38f9c4dbd8a1221638272ccb",
+        "wx" : "1b9cc8cab6af3efce62a15de1f2adbbb22a4d2d74e8dcf32fec0a94a3da3508de1d4a073f5245f96c9a6aa3021e54eaa3533a7817c4e57944ab2174549b6b93eb50",
+        "wy" : "1712cdd8366c45118f016163a7347198f495a2a9bc427908dbc6dd4b330f56e1c1df4a9886f7fd63c49124ade60d5bf8e6b7ac3d69d38f9c4dbd8a1221638272ccb"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401b9cc8cab6af3efce62a15de1f2adbbb22a4d2d74e8dcf32fec0a94a3da3508de1d4a073f5245f96c9a6aa3021e54eaa3533a7817c4e57944ab2174549b6b93eb5001712cdd8366c45118f016163a7347198f495a2a9bc427908dbc6dd4b330f56e1c1df4a9886f7fd63c49124ade60d5bf8e6b7ac3d69d38f9c4dbd8a1221638272ccb",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBucyMq2rz785ioV3h8q27sipNLXTo\n3PMv7AqUo9o1CN4dSgc/UkX5bJpqowIeVOqjUzp4F8TleUSrIXRUm2uT61ABcSzd\ng2bEURjwFhY6c0cZj0laKpvEJ5CNvG3UszD1bhwd9KmIb3/WPEkSSt5g1b+Oa3rD\n1p04+cTb2KEiFjgnLMs=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 216,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0000424f8a11451ecd0735f06da9d15265d82c3c08f43db200b4b9404d558c9749dd51b1607da78f82eda9f32f5e53aef6ed9b97191fbd3bae7f35ddd3e66903d8bb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "ADgmyRqqM6GD3j9uE02GUwiuvHkOkoe8euE27Vm_A75Ep7W0OhjKivGhToyojv4cZfiUl2xWxIrwC1rB88vN9Yi2",
+        "y" : "Aaw7zl-uPCu23PGdnCdesutWFFI6BL8Of5ikpQvn-AyMzuip57dMivB2NBcEp6wjdppCBxcifW99G7z87Pcg7Kw5"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04003826c91aaa33a183de3f6e134d865308aebc790e9287bc7ae136ed59bf03be44a7b5b43a18ca8af1a14e8ca88efe1c65f894976c56c48af00b5ac1f3cbcdf588b601ac3bce5fae3c2bb6dcf19d9c275eb2eb5614523a04bf0e7f98a4a50be7f80c8ccee8a9e7b74c8af076341704a7ac23769a420717227d6f7d1bbcfcecf720ecac39",
+        "wx" : "3826c91aaa33a183de3f6e134d865308aebc790e9287bc7ae136ed59bf03be44a7b5b43a18ca8af1a14e8ca88efe1c65f894976c56c48af00b5ac1f3cbcdf588b6",
+        "wy" : "1ac3bce5fae3c2bb6dcf19d9c275eb2eb5614523a04bf0e7f98a4a50be7f80c8ccee8a9e7b74c8af076341704a7ac23769a420717227d6f7d1bbcfcecf720ecac39"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004003826c91aaa33a183de3f6e134d865308aebc790e9287bc7ae136ed59bf03be44a7b5b43a18ca8af1a14e8ca88efe1c65f894976c56c48af00b5ac1f3cbcdf588b601ac3bce5fae3c2bb6dcf19d9c275eb2eb5614523a04bf0e7f98a4a50be7f80c8ccee8a9e7b74c8af076341704a7ac23769a420717227d6f7d1bbcfcecf720ecac39",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAOCbJGqozoYPeP24TTYZTCK68eQ6S\nh7x64TbtWb8DvkSntbQ6GMqK8aFOjKiO/hxl+JSXbFbEivALWsHzy831iLYBrDvO\nX648K7bc8Z2cJ16y61YUUjoEvw5/mKSlC+f4DIzO6Knnt0yK8HY0FwSnrCN2mkIH\nFyJ9b30bvPzs9yDsrDk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 217,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0041eeab7d3d7e80937cad0b86d3e53e14830166c2efa89df18ec6f88fc6a8a580601a91934ba922bd746351a008ac4f86dcc4d13a7ff09420f897b52bf88a4c9269",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AMhhs9WXfa_TIcQuqxkTovGnNOn7GiGPM8AqlB2vpB5_X6W01z9Sx0w15iYrHEoVRcXN36kS_kQu56FqquDFw_ZD",
+        "y" : "AGAduYGrlZPJQFcjyqhthixXW1xUpIdGfCNA5JXybbsVh1cNENOGCbOMUAlIBV9ZaykBlLHmbqjQb_p1VNHY-2sY"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400c861b3d5977dafd321c42eab1913a2f1a734e9fb1a218f33c02a941dafa41e7f5fa5b4d73f52c74c35e6262b1c4a1545c5cddfa912fe442ee7a16aaae0c5c3f64300601db981ab9593c9405723caa86d862c575b5c54a487467c2340e495f26dbb1587570d10d38609b38c500948055f596b290194b1e66ea8d06ffa7554d1d8fb6b18",
+        "wx" : "0c861b3d5977dafd321c42eab1913a2f1a734e9fb1a218f33c02a941dafa41e7f5fa5b4d73f52c74c35e6262b1c4a1545c5cddfa912fe442ee7a16aaae0c5c3f643",
+        "wy" : "601db981ab9593c9405723caa86d862c575b5c54a487467c2340e495f26dbb1587570d10d38609b38c500948055f596b290194b1e66ea8d06ffa7554d1d8fb6b18"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400c861b3d5977dafd321c42eab1913a2f1a734e9fb1a218f33c02a941dafa41e7f5fa5b4d73f52c74c35e6262b1c4a1545c5cddfa912fe442ee7a16aaae0c5c3f64300601db981ab9593c9405723caa86d862c575b5c54a487467c2340e495f26dbb1587570d10d38609b38c500948055f596b290194b1e66ea8d06ffa7554d1d8fb6b18",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAyGGz1Zd9r9MhxC6rGROi8ac06fsa\nIY8zwCqUHa+kHn9fpbTXP1LHTDXmJiscShVFxc3fqRL+RC7noWqq4MXD9kMAYB25\ngauVk8lAVyPKqG2GLFdbXFSkh0Z8I0DklfJtuxWHVw0Q04YJs4xQCUgFX1lrKQGU\nseZuqNBv+nVU0dj7axg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 218,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01a2eb25c2d3f9db15f320a4dd42e236f98a5d8c6774c12f982e2bce6c5e16cb53dbc52da6e091201170c7b11463700865120b560f106e1448c57f957a3bec28db90",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AB8C2jY4Ke4ItMyTRk4texbywmLveXektNQPE4S0C95oCBKIYOVTn7kekjEEgCSZmrzhjx--6omDSHVJpAQ7UwI4",
+        "y" : "AHVKBZqOoRvKTB8sU2-72RDFA4as1VTCdHgJDfqSmZ8n4m6cXwxVH3sCqhUj2_VgY_e7cATWSQTBrsNbxzrv4ugI"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04001f02da363829ee08b4cc93464e2d7b16f2c262ef7977a4b4d40f1384b40bde6808128860e5539fb91e9231048024999abce18f1fbeea8983487549a4043b53023800754a059a8ea11bca4c1f2c536fbbd910c50386acd554c27478090dfa92999f27e26e9c5f0c551f7b02aa1523dbf56063f7bb7004d64904c1aec35bc73aefe2e808",
+        "wx" : "1f02da363829ee08b4cc93464e2d7b16f2c262ef7977a4b4d40f1384b40bde6808128860e5539fb91e9231048024999abce18f1fbeea8983487549a4043b530238",
+        "wy" : "754a059a8ea11bca4c1f2c536fbbd910c50386acd554c27478090dfa92999f27e26e9c5f0c551f7b02aa1523dbf56063f7bb7004d64904c1aec35bc73aefe2e808"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004001f02da363829ee08b4cc93464e2d7b16f2c262ef7977a4b4d40f1384b40bde6808128860e5539fb91e9231048024999abce18f1fbeea8983487549a4043b53023800754a059a8ea11bca4c1f2c536fbbd910c50386acd554c27478090dfa92999f27e26e9c5f0c551f7b02aa1523dbf56063f7bb7004d64904c1aec35bc73aefe2e808",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAHwLaNjgp7gi0zJNGTi17FvLCYu95\nd6S01A8ThLQL3mgIEohg5VOfuR6SMQSAJJmavOGPH77qiYNIdUmkBDtTAjgAdUoF\nmo6hG8pMHyxTb7vZEMUDhqzVVMJ0eAkN+pKZnyfibpxfDFUfewKqFSPb9WBj97tw\nBNZJBMGuw1vHOu/i6Ag=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 219,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00a521a445fe801dd1ff391161cc30a398ea5e2eb7028c08ce777b4be52346e9fddfff25612d4c640b972f4400e5bf597b342cc4a0e5e4d50ca579ce8a0ae09c0913",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AC7OKWLvRxH0mxaXrH-tB1kWd2ehBLdq2HdJyDrigYv2arnZUJ9z-xU-q4tUYH3Mpz08OAl1r6PuOTcytEpZNJks",
+        "y" : "ARhq2AvxI7o1vVshs9leLGcq07SF8HhiCFjPsk8b9h6tkPsaJyPsUBwrepfN0fw-lk6G0jwDCiq5Dabzlx2k9oyZ"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04002ece2962ef4711f49b1697ac7fad0759167767a104b76ad87749c83ae2818bf66ab9d9509f73fb153eab8b54607dcca73d3c380975afa3ee393732b44a5934992c01186ad80bf123ba35bd5b21b3d95e2c672ad3b485f078620858cfb24f1bf61ead90fb1a2723ec501c2b7a97cdd1fc3e964e86d23c030a2ab90da6f3971da4f68c99",
+        "wx" : "2ece2962ef4711f49b1697ac7fad0759167767a104b76ad87749c83ae2818bf66ab9d9509f73fb153eab8b54607dcca73d3c380975afa3ee393732b44a5934992c",
+        "wy" : "1186ad80bf123ba35bd5b21b3d95e2c672ad3b485f078620858cfb24f1bf61ead90fb1a2723ec501c2b7a97cdd1fc3e964e86d23c030a2ab90da6f3971da4f68c99"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004002ece2962ef4711f49b1697ac7fad0759167767a104b76ad87749c83ae2818bf66ab9d9509f73fb153eab8b54607dcca73d3c380975afa3ee393732b44a5934992c01186ad80bf123ba35bd5b21b3d95e2c672ad3b485f078620858cfb24f1bf61ead90fb1a2723ec501c2b7a97cdd1fc3e964e86d23c030a2ab90da6f3971da4f68c99",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQALs4pYu9HEfSbFpesf60HWRZ3Z6EE\nt2rYd0nIOuKBi/ZqudlQn3P7FT6ri1RgfcynPTw4CXWvo+45NzK0Slk0mSwBGGrY\nC/EjujW9WyGz2V4sZyrTtIXweGIIWM+yTxv2Hq2Q+xonI+xQHCt6l83R/D6WTobS\nPAMKKrkNpvOXHaT2jJk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 220,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc001a445fe801dd1ff391161cc30a398ea5e2eb7028c08ce777b4be52346e9fde1d43a6e18df0b42a423dcc5bba72d6eaa3482d00750f395c72f7b528c14e6494fd8f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AauYH1B6rGwIqa-NeWPAzJXZpBdqML022bi5Zml5EvVpCHkszxXGykGBUaouhBwXeD-EFPpNXCIuScAHrcqxCqA0",
+        "y" : "AI0aFoioOZMQhMrt4zdYIIZWg3KSIJqHf7wcEutW_5hQjSNIPW42ptR-DyIX0ljN3Mby7_4kPAozZk4Kug5G2jO5"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401ab981f507aac6c08a9af8d7963c0cc95d9a4176a30bd36d9b8b966697912f56908792ccf15c6ca418151aa2e841c17783f8414fa4d5c222e49c007adcab10aa034008d1a1688a839931084caede33758208656837292209a877fbc1c12eb56ff98508d23483d6e36a6d47e0f2217d258cddcc6f2effe243c0a33664e0aba0e46da33b9",
+        "wx" : "1ab981f507aac6c08a9af8d7963c0cc95d9a4176a30bd36d9b8b966697912f56908792ccf15c6ca418151aa2e841c17783f8414fa4d5c222e49c007adcab10aa034",
+        "wy" : "08d1a1688a839931084caede33758208656837292209a877fbc1c12eb56ff98508d23483d6e36a6d47e0f2217d258cddcc6f2effe243c0a33664e0aba0e46da33b9"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401ab981f507aac6c08a9af8d7963c0cc95d9a4176a30bd36d9b8b966697912f56908792ccf15c6ca418151aa2e841c17783f8414fa4d5c222e49c007adcab10aa034008d1a1688a839931084caede33758208656837292209a877fbc1c12eb56ff98508d23483d6e36a6d47e0f2217d258cddcc6f2effe243c0a33664e0aba0e46da33b9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBq5gfUHqsbAipr415Y8DMldmkF2ow\nvTbZuLlmaXkS9WkIeSzPFcbKQYFRqi6EHBd4P4QU+k1cIi5JwAetyrEKoDQAjRoW\niKg5kxCEyu3jN1gghlaDcpIgmod/vBwS61b/mFCNI0g9bjam1H4PIhfSWM3cxvLv\n/iQ8CjNmTgq6DkbaM7k=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 221,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc003488bfd003ba3fe7222c398614731d4bc5d6e0518119ceef697ca468dd3fbc3a874dc31be16854847b98b774e5add546905a00ea1e72b8e5ef6a51829cc929fb1e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AP76z0JWYcjTohg_xM4RuaeXmLkjZx5CxpPBC-4G2Ke0Ye-koyVzysegFk8ro-n0g2a4rQZBcPvnmGZLFTidjo2k",
+        "y" : "AX9LKcsa4J9kCmq-t4qEZ3QivvuAQWNBOGre5NrnAsfhaug9AkUx4bY7AayyxG5MDiXeVpFb1MkO8RPod5EI-uJn"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400fefacf425661c8d3a2183fc4ce11b9a79798b923671e42c693c10bee06d8a7b461efa4a32573cac7a0164f2ba3e9f48366b8ad064170fbe798664b15389d8e8da4017f4b29cb1ae09f640a6abeb78a84677422befb80416341386adee4dae702c7e16ae83d024531e1b63b01acb2c46e4c0e25de56915bd4c90ef113e8779108fae267",
+        "wx" : "0fefacf425661c8d3a2183fc4ce11b9a79798b923671e42c693c10bee06d8a7b461efa4a32573cac7a0164f2ba3e9f48366b8ad064170fbe798664b15389d8e8da4",
+        "wy" : "17f4b29cb1ae09f640a6abeb78a84677422befb80416341386adee4dae702c7e16ae83d024531e1b63b01acb2c46e4c0e25de56915bd4c90ef113e8779108fae267"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400fefacf425661c8d3a2183fc4ce11b9a79798b923671e42c693c10bee06d8a7b461efa4a32573cac7a0164f2ba3e9f48366b8ad064170fbe798664b15389d8e8da4017f4b29cb1ae09f640a6abeb78a84677422befb80416341386adee4dae702c7e16ae83d024531e1b63b01acb2c46e4c0e25de56915bd4c90ef113e8779108fae267",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQA/vrPQlZhyNOiGD/EzhG5p5eYuSNn\nHkLGk8EL7gbYp7Rh76SjJXPKx6AWTyuj6fSDZritBkFw++eYZksVOJ2OjaQBf0sp\nyxrgn2QKar63ioRndCK++4BBY0E4at7k2ucCx+Fq6D0CRTHhtjsBrLLEbkwOJd5W\nkVvUyQ7xE+h3kQj64mc=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 222,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01fe801dd1ff391161cc30a398ea5e2eb7028c08ce777b4be52346e9fde1d43f17f9b003304fb6269c9f550768537b35f96443556a62b5ec77958bd8e4204d6354ce",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AbpWPyQ9hZAjO-WXRdyOMR6HtqnjK9299A8NyHoRvdHXXVjTEsNtyOJyIjaQ2htqBY1dq1by_G8pcSGlqyiMJp51",
+        "y" : "AeA00uXduQ79SJPkhpS0z1yF6L3K-7yuUYgNl-ItFNg4-BYu2w4Cb1uoixUOPywfxJ7SQpeTt26S8a-p8BgFEFzY"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401ba563f243d8590233be59745dc8e311e87b6a9e32bddbdf40f0dc87a11bdd1d75d58d312c36dc8e272223690da1b6a058d5dab56f2fc6f297121a5ab288c269e7501e034d2e5ddb90efd4893e48694b4cf5c85e8bdcafbbcae51880d97e22d14d838f8162edb0e026f5ba88b150e3f2c1fc49ed2429793b76e92f1afa9f01805105cd8",
+        "wx" : "1ba563f243d8590233be59745dc8e311e87b6a9e32bddbdf40f0dc87a11bdd1d75d58d312c36dc8e272223690da1b6a058d5dab56f2fc6f297121a5ab288c269e75",
+        "wy" : "1e034d2e5ddb90efd4893e48694b4cf5c85e8bdcafbbcae51880d97e22d14d838f8162edb0e026f5ba88b150e3f2c1fc49ed2429793b76e92f1afa9f01805105cd8"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401ba563f243d8590233be59745dc8e311e87b6a9e32bddbdf40f0dc87a11bdd1d75d58d312c36dc8e272223690da1b6a058d5dab56f2fc6f297121a5ab288c269e7501e034d2e5ddb90efd4893e48694b4cf5c85e8bdcafbbcae51880d97e22d14d838f8162edb0e026f5ba88b150e3f2c1fc49ed2429793b76e92f1afa9f01805105cd8",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBulY/JD2FkCM75ZdF3I4xHoe2qeMr\n3b30Dw3IehG90dddWNMSw23I4nIiNpDaG2oFjV2rVvL8bylxIaWrKIwmnnUB4DTS\n5d25Dv1Ik+SGlLTPXIXovcr7vK5RiA2X4i0U2Dj4Fi7bDgJvW6iLFQ4/LB/EntJC\nl5O3bpLxr6nwGAUQXNg=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 223,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc014128151a7d33a465767e87681050667ae528af3c43cfc59e3c3c1c8037d941b12bed6b79efcbcacf25ad46226c5c2b2bbfa1360e23c331db67cede47d9b0aa3fd2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "ACQ0zKJ8OWXTDBrDdgT-zVbw1KxwHB16TMc1d0oQkTZcwafLXi1m2JkxVR_c4EwN7xUD4uwreCDBma6ZDjY1I4bl",
+        "y" : "AVo719ti-bX5b1DxTPCzFaqhNCv0NSXJzS6wTSuD7CFAT-UfZ1EdHucpZ-eDa4MW6CKEd_iTPkXfVbdf66QxmVPG"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04002434cca27c3965d30c1ac37604fecd56f0d4ac701c1d7a4cc735774a1091365cc1a7cb5e2d66d89931551fdce04c0def1503e2ec2b7820c199ae990e36352386e5015a3bd7db62f9b5f96f50f14cf0b315aaa1342bf43525c9cd2eb04d2b83ec21404fe51f67511d1ee72967e7836b8316e8228477f8933e45df55b75feba4319953c6",
+        "wx" : "2434cca27c3965d30c1ac37604fecd56f0d4ac701c1d7a4cc735774a1091365cc1a7cb5e2d66d89931551fdce04c0def1503e2ec2b7820c199ae990e36352386e5",
+        "wy" : "15a3bd7db62f9b5f96f50f14cf0b315aaa1342bf43525c9cd2eb04d2b83ec21404fe51f67511d1ee72967e7836b8316e8228477f8933e45df55b75feba4319953c6"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004002434cca27c3965d30c1ac37604fecd56f0d4ac701c1d7a4cc735774a1091365cc1a7cb5e2d66d89931551fdce04c0def1503e2ec2b7820c199ae990e36352386e5015a3bd7db62f9b5f96f50f14cf0b315aaa1342bf43525c9cd2eb04d2b83ec21404fe51f67511d1ee72967e7836b8316e8228477f8933e45df55b75feba4319953c6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAJDTMonw5ZdMMGsN2BP7NVvDUrHAc\nHXpMxzV3ShCRNlzBp8teLWbYmTFVH9zgTA3vFQPi7Ct4IMGZrpkONjUjhuUBWjvX\n22L5tflvUPFM8LMVqqE0K/Q1JcnNLrBNK4PsIUBP5R9nUR0e5yln54NrgxboIoR3\n+JM+Rd9Vt1/rpDGZU8Y=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 224,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc019bcf27559ab324f2a0ebc95d059edeccd613604232da95c84d41d4d990ae7bb2d12b8d297d99fb86b64572d6fce2a34e4fa5e168f6894d4a1a828e2c6dbbdf31a2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AD7qtyQbSYJfjbOQQ8MHqdu7YmzMMGkxxqiNQkUleuAFdi1UlEuKl5UP074C7lvLtaEAaLIwwb0hADBzAztbQHLi",
+        "y" : "AImyE0r6_x1-Gfwj1EEQYI77xuK4EgoWpjvf8uBl_MlC55bG29_xT8F5q2lO6GXoOijnDoumNWXC-i8xrD5xvcRq"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04003eeab7241b49825f8db39043c307a9dbbb626ccc306931c6a88d4245257ae005762d54944b8a97950fd3be02ee5bcbb5a10068b230c1bd21003073033b5b4072e20089b2134afaff1d7e19fc23d44110608efbc6e2b8120a16a63bdff2e065fcc942e796c6dbdff14fc179ab694ee865e83a28e70e8ba63565c2fa2f31ac3e71bdc46a",
+        "wx" : "3eeab7241b49825f8db39043c307a9dbbb626ccc306931c6a88d4245257ae005762d54944b8a97950fd3be02ee5bcbb5a10068b230c1bd21003073033b5b4072e2",
+        "wy" : "089b2134afaff1d7e19fc23d44110608efbc6e2b8120a16a63bdff2e065fcc942e796c6dbdff14fc179ab694ee865e83a28e70e8ba63565c2fa2f31ac3e71bdc46a"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004003eeab7241b49825f8db39043c307a9dbbb626ccc306931c6a88d4245257ae005762d54944b8a97950fd3be02ee5bcbb5a10068b230c1bd21003073033b5b4072e20089b2134afaff1d7e19fc23d44110608efbc6e2b8120a16a63bdff2e065fcc942e796c6dbdff14fc179ab694ee865e83a28e70e8ba63565c2fa2f31ac3e71bdc46a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAPuq3JBtJgl+Ns5BDwwep27tibMww\naTHGqI1CRSV64AV2LVSUS4qXlQ/TvgLuW8u1oQBosjDBvSEAMHMDO1tAcuIAibIT\nSvr/HX4Z/CPUQRBgjvvG4rgSChamO9/y4GX8yULnlsbb3/FPwXmraU7oZeg6KOcO\ni6Y1ZcL6LzGsPnG9xGo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 225,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00b6cd381945713041c7990356370a00a10888ce905df2c792226a96cadb61df94bc4277c04afbcdabf376f02d2a6addf4052ad7673b1ae1e1ec49af389066810792",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AX-4OO-aa8iHbvIYil8NNvt2ZCZz7CIvI_Sc_dhgxQU000d2CcOhFl6T36_MEDTWz3YpbNAvVuM_UO-iAs3X3QoX",
+        "y" : "AQDSdby4Npw0zzBG0Zj_r0zOuwMTmq2ORAExD3Y-eLStDdh_puBDi_QwssEPJfiBncVGtrBmE-rwaMWc7LK7kWhK"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04017fb838ef9a6bc8876ef2188a5f0d36fb76642673ec222f23f49cfdd860c50534d3477609c3a1165e93dfafcc1034d6cf76296cd02f56e33f50efa202cdd7dd0a170100d275bcb8369c34cf3046d198ffaf4ccebb03139aad8e4401310f763e78b4ad0dd87fa6e0438bf430b2c10f25f8819dc546b6b06613eaf068c59cecb2bb91684a",
+        "wx" : "17fb838ef9a6bc8876ef2188a5f0d36fb76642673ec222f23f49cfdd860c50534d3477609c3a1165e93dfafcc1034d6cf76296cd02f56e33f50efa202cdd7dd0a17",
+        "wy" : "100d275bcb8369c34cf3046d198ffaf4ccebb03139aad8e4401310f763e78b4ad0dd87fa6e0438bf430b2c10f25f8819dc546b6b06613eaf068c59cecb2bb91684a"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004017fb838ef9a6bc8876ef2188a5f0d36fb76642673ec222f23f49cfdd860c50534d3477609c3a1165e93dfafcc1034d6cf76296cd02f56e33f50efa202cdd7dd0a170100d275bcb8369c34cf3046d198ffaf4ccebb03139aad8e4401310f763e78b4ad0dd87fa6e0438bf430b2c10f25f8819dc546b6b06613eaf068c59cecb2bb91684a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBf7g475pryIdu8hiKXw02+3ZkJnPs\nIi8j9Jz92GDFBTTTR3YJw6EWXpPfr8wQNNbPdils0C9W4z9Q76ICzdfdChcBANJ1\nvLg2nDTPMEbRmP+vTM67AxOarY5EATEPdj54tK0N2H+m4EOL9DCywQ8l+IGdxUa2\nsGYT6vBoxZzssruRaEo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 226,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00ffded83af75d70997c6507c92b1756cd13e9e1fb85e126ffa5a35fd95539b45b0e7fea93830bd009beeaec68f551ad5771500f584c66304c97c2c8f19c141a45a7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AT0qVRjEW2Avez7uLiYamXqnilqDHETjraFv2wzxsykmnvsVLP6OTggHe2fMJ6tK5CmVt6mXHv5SSBdctdfKY_eK",
+        "y" : "ANK2dso9Qfjti7ZTCd5uxTeZQaX3Sm1w3crh9zZc5x_e8D43KqMUCKilHMNMrFT2q3Nm2YdYt_k_yXbg_lHzhxuC"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04013d2a5518c45b602f7b3eee2e261a997aa78a5a831c44e3ada16fdb0cf1b329269efb152cfe8e4e08077b67cc27ab4ae42995b7a9971efe5248175cb5d7ca63f78a00d2b676ca3d41f8ed8bb65309de6ec5379941a5f74a6d70ddcae1f7365ce71fdef03e372aa31408a8a51cc34cac54f6ab7366d98758b7f93fc976e0fe51f3871b82",
+        "wx" : "13d2a5518c45b602f7b3eee2e261a997aa78a5a831c44e3ada16fdb0cf1b329269efb152cfe8e4e08077b67cc27ab4ae42995b7a9971efe5248175cb5d7ca63f78a",
+        "wy" : "0d2b676ca3d41f8ed8bb65309de6ec5379941a5f74a6d70ddcae1f7365ce71fdef03e372aa31408a8a51cc34cac54f6ab7366d98758b7f93fc976e0fe51f3871b82"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004013d2a5518c45b602f7b3eee2e261a997aa78a5a831c44e3ada16fdb0cf1b329269efb152cfe8e4e08077b67cc27ab4ae42995b7a9971efe5248175cb5d7ca63f78a00d2b676ca3d41f8ed8bb65309de6ec5379941a5f74a6d70ddcae1f7365ce71fdef03e372aa31408a8a51cc34cac54f6ab7366d98758b7f93fc976e0fe51f3871b82",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBPSpVGMRbYC97Pu4uJhqZeqeKWoMc\nROOtoW/bDPGzKSae+xUs/o5OCAd7Z8wnq0rkKZW3qZce/lJIF1y118pj94oA0rZ2\nyj1B+O2LtlMJ3m7FN5lBpfdKbXDdyuH3NlznH97wPjcqoxQIqKUcw0ysVParc2bZ\nh1i3+T/JduD+UfOHG4I=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 227,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01ffbdb075eebae132f8ca0f92562ead9a27d3c3f70bc24dff4b46bfb2aa7368b61cffd5270617a0137dd5d8d1eaa35aaee2a01eb098cc60992f8591e33828348b4e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AKxOmtH62AVKLhMgP8xIkzOVW_t3Yq7UW2HnUYJvihMLUwfB8vBSAB3Dn5cfGV1qnGpatdAll4IqiSrivmcUO_Ku",
+        "y" : "AFzg_YLjULhfLXou29WVoeiQoUPumhfxSu0xlQ1RfUV-le4WD4GLfnrmtyE1UEUWtLvbyFcY9EKj3Joh7k2g8ye2"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400ac4e9ad1fad8054a2e13203fcc489333955bfb7762aed45b61e751826f8a130b5307c1f2f052001dc39f971f195d6a9c6a5ab5d02597822a892ae2be67143bf2ae005ce0fd82e350b85f2d7a2edbd595a1e890a143ee9a17f14aed31950d517d457e95ee160f818b7e7ae6b72135504516b4bbdbc85718f442a3dc9a21ee4da0f327b6",
+        "wx" : "0ac4e9ad1fad8054a2e13203fcc489333955bfb7762aed45b61e751826f8a130b5307c1f2f052001dc39f971f195d6a9c6a5ab5d02597822a892ae2be67143bf2ae",
+        "wy" : "5ce0fd82e350b85f2d7a2edbd595a1e890a143ee9a17f14aed31950d517d457e95ee160f818b7e7ae6b72135504516b4bbdbc85718f442a3dc9a21ee4da0f327b6"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400ac4e9ad1fad8054a2e13203fcc489333955bfb7762aed45b61e751826f8a130b5307c1f2f052001dc39f971f195d6a9c6a5ab5d02597822a892ae2be67143bf2ae005ce0fd82e350b85f2d7a2edbd595a1e890a143ee9a17f14aed31950d517d457e95ee160f818b7e7ae6b72135504516b4bbdbc85718f442a3dc9a21ee4da0f327b6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQArE6a0frYBUouEyA/zEiTM5Vb+3di\nrtRbYedRgm+KEwtTB8Hy8FIAHcOflx8ZXWqcalq10CWXgiqJKuK+ZxQ78q4AXOD9\nguNQuF8tei7b1ZWh6JChQ+6aF/FK7TGVDVF9RX6V7hYPgYt+eua3ITVQRRa0u9vI\nVxj0QqPcmiHuTaDzJ7Y=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 228,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00ff9c88b0e61851cc752f175b814604673bbda5f291a374fef0ea1f8bffad1d11312e393305644086d140f93996fdfe6083b4783f2ca8f49e188ceb1db5ab166cec",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AJ0a78ARYId03eaxV0z3lzVpG8zQ1TSXlVW5I-SAP0luCW2Vr32_gCWVUxLPMYDysSThQEuovUYs-MdQvRV9uxjx",
+        "y" : "AW43NlYl4oPGRHZ2vsKYQQo2ucjGS6WhtpF5F53YuPPo5lnMrAzfHELxdNNYCgCCwTGohl5QrZr5CI6y1j8LR2iu"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04009d1aefc011608774dde6b1574cf79735691bccd0d534979555b923e4803f496e096d95af7dbf8025955312cf3180f2b124e1404ba8bd462cf8c750bd157dbb18f1016e37365625e283c6447676bec298410a36b9c8c64ba5a1b69179179dd8b8f3e8e659ccac0cdf1c42f174d3580a0082c131a8865e50ad9af9088eb2d63f0b4768ae",
+        "wx" : "09d1aefc011608774dde6b1574cf79735691bccd0d534979555b923e4803f496e096d95af7dbf8025955312cf3180f2b124e1404ba8bd462cf8c750bd157dbb18f1",
+        "wy" : "16e37365625e283c6447676bec298410a36b9c8c64ba5a1b69179179dd8b8f3e8e659ccac0cdf1c42f174d3580a0082c131a8865e50ad9af9088eb2d63f0b4768ae"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004009d1aefc011608774dde6b1574cf79735691bccd0d534979555b923e4803f496e096d95af7dbf8025955312cf3180f2b124e1404ba8bd462cf8c750bd157dbb18f1016e37365625e283c6447676bec298410a36b9c8c64ba5a1b69179179dd8b8f3e8e659ccac0cdf1c42f174d3580a0082c131a8865e50ad9af9088eb2d63f0b4768ae",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAnRrvwBFgh3Td5rFXTPeXNWkbzNDV\nNJeVVbkj5IA/SW4JbZWvfb+AJZVTEs8xgPKxJOFAS6i9Riz4x1C9FX27GPEBbjc2\nViXig8ZEdna+wphBCja5yMZLpaG2kXkXndi48+jmWcysDN8cQvF001gKAILBMaiG\nXlCtmvkIjrLWPwtHaK4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 229,
+          "comment" : "edge case for u1",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00d17592e169fced8af990526ea1711b7cc52ec633ba6097cc1715e7362f0b65a9ede296d370489008b863d88a31b804328905ab0788370a2462bfcabd1df6146dc8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AQ9YJNEdEA-cHeofRA__5q7xQ6j8mqyeZOFPe6_zpipa6fbdQN02i2UjmqgCMYaeKqeqJPBY0XpsNZJGvfXshdcF",
+        "y" : "AS0HwlH-y89QFqjqnjxGvFMYS7qWHUronav6oa7jNNz5SCTPGm-EDpqLoc6_u5iBrMjoBihNBYG3yFmPPn5GbeoJ"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04010f5824d11d100f9c1dea1f440fffe6aef143a8fc9aac9e64e14f7baff3a62a5ae9f6dd40dd368b65239aa80231869e2aa7aa24f058d17a6c359246bdf5ec85d705012d07c251fecbcf5016a8ea9e3c46bc53184bba961d4ae89dabfaa1aee334dcf94824cf1a6f840e9a8ba1cebfbb9881acc8e806284d0581b7c8598f3e7e466dea09",
+        "wx" : "10f5824d11d100f9c1dea1f440fffe6aef143a8fc9aac9e64e14f7baff3a62a5ae9f6dd40dd368b65239aa80231869e2aa7aa24f058d17a6c359246bdf5ec85d705",
+        "wy" : "12d07c251fecbcf5016a8ea9e3c46bc53184bba961d4ae89dabfaa1aee334dcf94824cf1a6f840e9a8ba1cebfbb9881acc8e806284d0581b7c8598f3e7e466dea09"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004010f5824d11d100f9c1dea1f440fffe6aef143a8fc9aac9e64e14f7baff3a62a5ae9f6dd40dd368b65239aa80231869e2aa7aa24f058d17a6c359246bdf5ec85d705012d07c251fecbcf5016a8ea9e3c46bc53184bba961d4ae89dabfaa1aee334dcf94824cf1a6f840e9a8ba1cebfbb9881acc8e806284d0581b7c8598f3e7e466dea09",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBD1gk0R0QD5wd6h9ED//mrvFDqPya\nrJ5k4U97r/OmKlrp9t1A3TaLZSOaqAIxhp4qp6ok8FjRemw1kka99eyF1wUBLQfC\nUf7Lz1AWqOqePEa8UxhLupYdSuidq/qhruM03PlIJM8ab4QOmouhzr+7mIGsyOgG\nKE0FgbfIWY8+fkZt6gk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 230,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc005555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555554",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AbVX9vwh8W5qjlGykEsk-4x1yP7ksbD_l1_NVMSRoOUnWKOIMDjbzyHxnleRRjwtlSu0sLZCjwrnNptB0dl2YbKU",
+        "y" : "APdchZP57PVKJsyMe0GPn7ykKWiFuTZwk5lC9dz2y0oDwjRNBBHfHlpUhlJTTEt9vM6UAWlyUiZ-h0XQcTiO7IMu"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401b557f6fc21f16e6a8e51b2904b24fb8c75c8fee4b1b0ff975fcd54c491a0e52758a3883038dbcf21f19e5791463c2d952bb4b0b6428f0ae7369b41d1d97661b29400f75c8593f9ecf54a26cc8c7b418f9fbca4296885b93670939942f5dcf6cb4a03c2344d0411df1e5a548652534c4b7dbcce9401697252267e8745d071388eec832e",
+        "wx" : "1b557f6fc21f16e6a8e51b2904b24fb8c75c8fee4b1b0ff975fcd54c491a0e52758a3883038dbcf21f19e5791463c2d952bb4b0b6428f0ae7369b41d1d97661b294",
+        "wy" : "0f75c8593f9ecf54a26cc8c7b418f9fbca4296885b93670939942f5dcf6cb4a03c2344d0411df1e5a548652534c4b7dbcce9401697252267e8745d071388eec832e"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401b557f6fc21f16e6a8e51b2904b24fb8c75c8fee4b1b0ff975fcd54c491a0e52758a3883038dbcf21f19e5791463c2d952bb4b0b6428f0ae7369b41d1d97661b29400f75c8593f9ecf54a26cc8c7b418f9fbca4296885b93670939942f5dcf6cb4a03c2344d0411df1e5a548652534c4b7dbcce9401697252267e8745d071388eec832e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBtVf2/CHxbmqOUbKQSyT7jHXI/uSx\nsP+XX81UxJGg5SdYo4gwONvPIfGeV5FGPC2VK7SwtkKPCuc2m0HR2XZhspQA91yF\nk/ns9UomzIx7QY+fvKQpaIW5NnCTmUL13PbLSgPCNE0EEd8eWlSGUlNMS328zpQB\naXJSJn6HRdBxOI7sgy4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 231,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc009f57708fa97eba94c6d4782cdd4e33bb95c1353bde095232e3e2bab277bb5d2b48f55a53ffe928d034c29970a9e5f384a003907d3d9b82a86817cc61fb17f4c59e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AM4CK1Q6GB_dMTDONZJheKfw75ccX-hIsC3Bv2jIg7Kao1Npq9GZ7WKOqDc6lmChwIVBSixm3gEowI-Dhu_soA0_",
+        "y" : "AKKccEuq6gIUq5RE6S1H21nESMZVlLcJxb1DB4l8mNC8y0qfNRxR0ic-8ruE1ofDBedja1X9PjhUtLNMp7pxJ2rK"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400ce022b543a181fdd3130ce35926178a7f0ef971c5fe848b02dc1bf68c883b29aa35369abd199ed628ea8373a9660a1c085414a2c66de0128c08f8386efeca00d3f00a29c704baaea0214ab9444e92d47db59c448c65594b709c5bd4307897c98d0bccb4a9f351c51d2273ef2bb84d687c305e7636b55fd3e3854b4b34ca7ba71276aca",
+        "wx" : "0ce022b543a181fdd3130ce35926178a7f0ef971c5fe848b02dc1bf68c883b29aa35369abd199ed628ea8373a9660a1c085414a2c66de0128c08f8386efeca00d3f",
+        "wy" : "0a29c704baaea0214ab9444e92d47db59c448c65594b709c5bd4307897c98d0bccb4a9f351c51d2273ef2bb84d687c305e7636b55fd3e3854b4b34ca7ba71276aca"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400ce022b543a181fdd3130ce35926178a7f0ef971c5fe848b02dc1bf68c883b29aa35369abd199ed628ea8373a9660a1c085414a2c66de0128c08f8386efeca00d3f00a29c704baaea0214ab9444e92d47db59c448c65594b709c5bd4307897c98d0bccb4a9f351c51d2273ef2bb84d687c305e7636b55fd3e3854b4b34ca7ba71276aca",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAzgIrVDoYH90xMM41kmF4p/Dvlxxf\n6EiwLcG/aMiDspqjU2mr0ZntYo6oNzqWYKHAhUFKLGbeASjAj4OG7+ygDT8Aopxw\nS6rqAhSrlETpLUfbWcRIxlWUtwnFvUMHiXyY0LzLSp81HFHSJz7yu4TWh8MF52Nr\nVf0+OFS0s0ynunEnaso=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 232,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0068d98fa90736eff3e90f8fcfe50838b6fa0bf2cde77bc51e3f41019c8006f4e9cbaeadce7dbb44462da6425be9cfdaecb234c41749ce695be1b5ead2e6b1205f35",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AEANGU9R2AIYwClul4ubel67DTc9Ientf0voriXqW2_OtYDcRRCCZSX-E40aTiDMKTxTDbpLhcPSm7h0hnw2hGlq",
+        "y" : "AVN7o8MsHx-bLZ6A-I_83EqlJG6BRbh8N9RzBEI02K0oxqvVoYbtCrYcbnLd73ewmfUe3Fjr60M67QZFA8pJTExz"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400400d194f51d80218c0296e978b9b7a5ebb0d373d21e9ed7f4be8ae25ea5b6fceb580dc4510826525fe138d1a4e20cc293c530dba4b85c3d29bb874867c3684696a01537ba3c32c1f1f9b2d9e80f88ffcdc4aa5246e8145b87c37d473044234d8ad28c6abd5a186ed0ab61c6e72ddef77b099f51edc58ebeb433aed064503ca494c4c73",
+        "wx" : "400d194f51d80218c0296e978b9b7a5ebb0d373d21e9ed7f4be8ae25ea5b6fceb580dc4510826525fe138d1a4e20cc293c530dba4b85c3d29bb874867c3684696a",
+        "wy" : "1537ba3c32c1f1f9b2d9e80f88ffcdc4aa5246e8145b87c37d473044234d8ad28c6abd5a186ed0ab61c6e72ddef77b099f51edc58ebeb433aed064503ca494c4c73"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400400d194f51d80218c0296e978b9b7a5ebb0d373d21e9ed7f4be8ae25ea5b6fceb580dc4510826525fe138d1a4e20cc293c530dba4b85c3d29bb874867c3684696a01537ba3c32c1f1f9b2d9e80f88ffcdc4aa5246e8145b87c37d473044234d8ad28c6abd5a186ed0ab61c6e72ddef77b099f51edc58ebeb433aed064503ca494c4c73",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAQA0ZT1HYAhjAKW6Xi5t6XrsNNz0h\n6e1/S+iuJepbb861gNxFEIJlJf4TjRpOIMwpPFMNukuFw9KbuHSGfDaEaWoBU3uj\nwywfH5stnoD4j/zcSqUkboFFuHw31HMEQjTYrSjGq9Whhu0Kthxuct3vd7CZ9R7c\nWOvrQzrtBkUDyklMTHM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 233,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00e97ae66bcd4cae36fffffffffffffffffffffffffffffffffffffffffffffffffd68bc9726f02dbf8598a98b3e5077eff6f2491eb678ed040fb338c084a9ea8a4c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AHgmb1edyhPqFDOMMqDWgS39mHIKKh6iv6RLorP-FcYwY8jMeTyW7pYM9TfjStDK-kYhks9ihcuMSNk5m_VS1Pxq",
+        "y" : "AZi-3mEmidIomEHkkFvnZtuooHsApNSpb5oQcWCpsm6zL9p5ljTgB-5Q409rJVYNfu0XKNS17cRTffT1CJEKzvc2"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040078266f579dca13ea14338c32a0d6812dfd98720a2a1ea2bfa44ba2b3fe15c63063c8cc793c96ee960cf537e34ad0cafa462192cf6285cb8c48d9399bf552d4fc6a0198bede612689d2289841e4905be766dba8a07b00a4d4a96f9a107160a9b26eb32fda799634e007ee50e34f6b25560d7eed1728d4b5edc4537df4f508910acef736",
+        "wx" : "78266f579dca13ea14338c32a0d6812dfd98720a2a1ea2bfa44ba2b3fe15c63063c8cc793c96ee960cf537e34ad0cafa462192cf6285cb8c48d9399bf552d4fc6a",
+        "wy" : "198bede612689d2289841e4905be766dba8a07b00a4d4a96f9a107160a9b26eb32fda799634e007ee50e34f6b25560d7eed1728d4b5edc4537df4f508910acef736"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040078266f579dca13ea14338c32a0d6812dfd98720a2a1ea2bfa44ba2b3fe15c63063c8cc793c96ee960cf537e34ad0cafa462192cf6285cb8c48d9399bf552d4fc6a0198bede612689d2289841e4905be766dba8a07b00a4d4a96f9a107160a9b26eb32fda799634e007ee50e34f6b25560d7eed1728d4b5edc4537df4f508910acef736",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAeCZvV53KE+oUM4wyoNaBLf2Ycgoq\nHqK/pEuis/4VxjBjyMx5PJbulgz1N+NK0Mr6RiGSz2KFy4xI2Tmb9VLU/GoBmL7e\nYSaJ0iiYQeSQW+dm26igewCk1KlvmhBxYKmybrMv2nmWNOAH7lDjT2slVg1+7Rco\n1LXtxFN99PUIkQrO9zY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 234,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01ae66bcd4cae36ffffffffffffffffffffffffffffffffffffffffffffffffffffb3954212f8bea578d93e685e5dba329811b2542bb398233e2944bceb19263325d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AFxYXA-t7Jo0_MCAQVTxTLVmi5l_LgltoJdLI-mQLjSZlWA3oXilIQgzUH4eEI7lzZlPZZ4-jKrenSlY7Uj2aZHD",
+        "y" : "ASgsGWmmjhkMYR7AMiNS7wHHUNyHRkqgECSywQydS2pKKfmep0Dbja-rZe11QjYBZU1o9N9kLoCk55yhLfsO5CQE"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04005c585c0fadec9a34fcc0804154f14cb5668b997f2e096da0974b23e9902e3499956037a178a5210833507e1e108ee5cd994f659e3e8caade9d2958ed48f66991c301282c1969a68e190c611ec0322352ef01c750dc87464aa01024b2c10c9d4b6a4a29f99ea740db8dafab65ed75423601654d68f4df642e80a4e79ca12dfb0ee42404",
+        "wx" : "5c585c0fadec9a34fcc0804154f14cb5668b997f2e096da0974b23e9902e3499956037a178a5210833507e1e108ee5cd994f659e3e8caade9d2958ed48f66991c3",
+        "wy" : "1282c1969a68e190c611ec0322352ef01c750dc87464aa01024b2c10c9d4b6a4a29f99ea740db8dafab65ed75423601654d68f4df642e80a4e79ca12dfb0ee42404"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004005c585c0fadec9a34fcc0804154f14cb5668b997f2e096da0974b23e9902e3499956037a178a5210833507e1e108ee5cd994f659e3e8caade9d2958ed48f66991c301282c1969a68e190c611ec0322352ef01c750dc87464aa01024b2c10c9d4b6a4a29f99ea740db8dafab65ed75423601654d68f4df642e80a4e79ca12dfb0ee42404",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAXFhcD63smjT8wIBBVPFMtWaLmX8u\nCW2gl0sj6ZAuNJmVYDeheKUhCDNQfh4QjuXNmU9lnj6Mqt6dKVjtSPZpkcMBKCwZ\naaaOGQxhHsAyI1LvAcdQ3IdGSqAQJLLBDJ1Lakop+Z6nQNuNr6tl7XVCNgFlTWj0\n32QugKTnnKEt+w7kJAQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 235,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc015ccd79a995c6dffffffffffffffffffffffffffffffffffffffffffffffffffffc2121badb58a518afa8010a82c03cad31fa94bbbde96820166d27e644938e00b1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AJGdDL_3BD3i6wJOXs56Wd4Usb2LCEKJWHQwBW41DkkTa_iSdXs4lzXndbNS13Q3b-KeYuQBUlNQLkzMKZ8ldXZq",
+        "y" : "AEA836Sf5GR3lNZ5_SiJw6bCplHrsE5P7oRovUwkDYunIgl-rr1SR7S-vG6HOycBHEnR-KEx6g96VnqMKnwXMoni"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400919d0cbff7043de2eb024e5ece7a59de14b1bd8b084289587430056e350e49136bf892757b389735e775b352d774376fe29e62e4015253502e4ccc299f2575766a00403cdfa49fe4647794d679fd2889c3a6c2a651ebb04e4fee8468bd4c240d8ba722097eaebd5247b4bebc6e873b27011c49d1f8a131ea0f7a567a8c2a7c173289e2",
+        "wx" : "0919d0cbff7043de2eb024e5ece7a59de14b1bd8b084289587430056e350e49136bf892757b389735e775b352d774376fe29e62e4015253502e4ccc299f2575766a",
+        "wy" : "403cdfa49fe4647794d679fd2889c3a6c2a651ebb04e4fee8468bd4c240d8ba722097eaebd5247b4bebc6e873b27011c49d1f8a131ea0f7a567a8c2a7c173289e2"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400919d0cbff7043de2eb024e5ece7a59de14b1bd8b084289587430056e350e49136bf892757b389735e775b352d774376fe29e62e4015253502e4ccc299f2575766a00403cdfa49fe4647794d679fd2889c3a6c2a651ebb04e4fee8468bd4c240d8ba722097eaebd5247b4bebc6e873b27011c49d1f8a131ea0f7a567a8c2a7c173289e2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAkZ0Mv/cEPeLrAk5eznpZ3hSxvYsI\nQolYdDAFbjUOSRNr+JJ1eziXNed1s1LXdDdv4p5i5AFSU1AuTMwpnyV1dmoAQDzf\npJ/kZHeU1nn9KInDpsKmUeuwTk/uhGi9TCQNi6ciCX6uvVJHtL68boc7JwEcSdH4\noTHqD3pWeowqfBcyieI=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 236,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01cd4cae36fffffffffffffffffffffffffffffffffffffffffffffffffffffffffae18dcc11dff7526233d923a0b202cb29e713f22de8bb6ab0a12821c5abbe3f23",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "ATyJto7iFlzlg-Kaa0YwPlHkm2WDuX-kj8l_SMqK0N3U3dCd-t_PcJXwyhiWNDKEHE7_kV9hONDvWR6K5L6fSpl1",
+        "y" : "ABCCnClrSeg-oiAYvR1L4wzDO_ziBaq6VFLhBJ94vt4LADriwnuvwM1_esESEIkoi_434iHhj1pP3X1zs8DlrmrR"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04013c89b68ee2165ce583e29a6b46303e51e49b6583b97fa48fc97f48ca8ad0ddd4ddd09dfadfcf7095f0ca18963432841c4eff915f6138d0ef591e8ae4be9f4a99750010829c296b49e83ea22018bd1d4be30cc33bfce205aaba5452e1049f78bede0b003ae2c27bafc0cd7f7ac1121089288bfe37e221e18f5a4fdd7d73b3c0e5ae6ad1",
+        "wx" : "13c89b68ee2165ce583e29a6b46303e51e49b6583b97fa48fc97f48ca8ad0ddd4ddd09dfadfcf7095f0ca18963432841c4eff915f6138d0ef591e8ae4be9f4a9975",
+        "wy" : "10829c296b49e83ea22018bd1d4be30cc33bfce205aaba5452e1049f78bede0b003ae2c27bafc0cd7f7ac1121089288bfe37e221e18f5a4fdd7d73b3c0e5ae6ad1"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004013c89b68ee2165ce583e29a6b46303e51e49b6583b97fa48fc97f48ca8ad0ddd4ddd09dfadfcf7095f0ca18963432841c4eff915f6138d0ef591e8ae4be9f4a99750010829c296b49e83ea22018bd1d4be30cc33bfce205aaba5452e1049f78bede0b003ae2c27bafc0cd7f7ac1121089288bfe37e221e18f5a4fdd7d73b3c0e5ae6ad1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBPIm2juIWXOWD4pprRjA+UeSbZYO5\nf6SPyX9IyorQ3dTd0J36389wlfDKGJY0MoQcTv+RX2E40O9ZHorkvp9KmXUAEIKc\nKWtJ6D6iIBi9HUvjDMM7/OIFqrpUUuEEn3i+3gsAOuLCe6/AzX96wRIQiSiL/jfi\nIeGPWk/dfXOzwOWuatE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 237,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0022e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b9c4c3f73cc816143fac3412b62de4c63db08f8c57e4c58c31f1b457ca5e57e20a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AdkcoP95B5eoPDvhyCQlr5FyCAh6pnNe69NJhA_Z-8O6WWLuEfgEMzjBs_NQQXH6qOhESIC2pcVa5mZ8UsoH7T95",
+        "y" : "AfNHhsLccXBKw0Y0EAqOkSp8QGN4IOl80y1XOdcDS8f2h0uQ7pTM4HZio7J1sj-iCuf8g3DQW67v4ChhaL00F9E_"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401d91ca0ff790797a83c3be1c82425af917208087aa6735eebd349840fd9fbc3ba5962ee11f8043338c1b3f3504171faa8e8444880b6a5c55ae6667c52ca07ed3f7901f34786c2dc71704ac34634100a8e912a7c40637820e97cd32d5739d7034bc7f6874b90ee94cce07662a3b275b23fa20ae7fc8370d05baeefe0286168bd3417d13f",
+        "wx" : "1d91ca0ff790797a83c3be1c82425af917208087aa6735eebd349840fd9fbc3ba5962ee11f8043338c1b3f3504171faa8e8444880b6a5c55ae6667c52ca07ed3f79",
+        "wy" : "1f34786c2dc71704ac34634100a8e912a7c40637820e97cd32d5739d7034bc7f6874b90ee94cce07662a3b275b23fa20ae7fc8370d05baeefe0286168bd3417d13f"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401d91ca0ff790797a83c3be1c82425af917208087aa6735eebd349840fd9fbc3ba5962ee11f8043338c1b3f3504171faa8e8444880b6a5c55ae6667c52ca07ed3f7901f34786c2dc71704ac34634100a8e912a7c40637820e97cd32d5739d7034bc7f6874b90ee94cce07662a3b275b23fa20ae7fc8370d05baeefe0286168bd3417d13f",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB2Ryg/3kHl6g8O+HIJCWvkXIICHqm\nc17r00mED9n7w7pZYu4R+AQzOMGz81BBcfqo6ERIgLalxVrmZnxSygftP3kB80eG\nwtxxcErDRjQQCo6RKnxAY3gg6XzTLVc51wNLx/aHS5DulMzgdmKjsnWyP6IK5/yD\ncNBbru/gKGFovTQX0T8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 238,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc010590b21642c8590b21642c8590b21642c8590b21642c8590b21642c8590b2164298eb57e5aff9343597a542d3132f9e734fdc305125e0ec139c5f780ee8e8cb9c2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AECvL03cHlJysq7TWLd3byjw3Jlvdy-VHyXRL5-LDz3g0cHSm2O3SpUNtHRwGjTI3YA7WU6Ve9aj636Ti-RRH0x5",
+        "y" : "AcAbQslz1V-4mW5A7mjhEuWKiS6rAyxc3W2zn7LBFpLos869u9wI-z2VoqdgcAUIn0Us3rmCG1oRhAH80CnJrSSE"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040040af2f4ddc1e5272b2aed358b7776f28f0dc996f772f951f25d12f9f8b0f3de0d1c1d29b63b74a950db474701a34c8dd803b594e957bd6a3eb7e938be4511f4c7901c01b42c973d55fb8996e40ee68e112e58a892eab032c5cdd6db39fb2c11692e8b3cebdbbdc08fb3d95a2a7607005089f452cdeb9821b5a118401fcd029c9ad2484",
+        "wx" : "40af2f4ddc1e5272b2aed358b7776f28f0dc996f772f951f25d12f9f8b0f3de0d1c1d29b63b74a950db474701a34c8dd803b594e957bd6a3eb7e938be4511f4c79",
+        "wy" : "1c01b42c973d55fb8996e40ee68e112e58a892eab032c5cdd6db39fb2c11692e8b3cebdbbdc08fb3d95a2a7607005089f452cdeb9821b5a118401fcd029c9ad2484"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040040af2f4ddc1e5272b2aed358b7776f28f0dc996f772f951f25d12f9f8b0f3de0d1c1d29b63b74a950db474701a34c8dd803b594e957bd6a3eb7e938be4511f4c7901c01b42c973d55fb8996e40ee68e112e58a892eab032c5cdd6db39fb2c11692e8b3cebdbbdc08fb3d95a2a7607005089f452cdeb9821b5a118401fcd029c9ad2484",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAQK8vTdweUnKyrtNYt3dvKPDcmW93\nL5UfJdEvn4sPPeDRwdKbY7dKlQ20dHAaNMjdgDtZTpV71qPrfpOL5FEfTHkBwBtC\nyXPVX7iZbkDuaOES5YqJLqsDLFzdbbOfssEWkuizzr273Aj7PZWip2BwBQifRSze\nuYIbWhGEAfzQKcmtJIQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 239,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01a4924924924924924924924924924924924924924924924924924924924924924445e10670ed0437c9db4125ac4175fbd70e9bd1799a85f44ca0a8e61a3354e808",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AGngtIHbmfiU8HgPhHGd4WrsWZx2XrpQuGFUdwc8MsJqseTnrl0flSUTrTIyJSA7TwxlokqDaM0yLCPpIEnRIXR8",
+        "y" : "AXeQHjeeXnJPQWSH_ucHfmrqgeUlDKo8_7t9GyJwqnVLT9rlHkQwUMM8e4Qhx7PFOMSaZ0o04ieMfqCdkAz1hR3P"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040069e0b481db99f894f0780f84719de16aec599c765eba50b8615477073c32c26ab1e4e7ae5d1f952513ad323225203b4f0c65a24a8368cd322c23e92049d121747c0177901e379e5e724f416487fee7077e6aea81e5250caa3cffbb7d1b2270aa754b4fdae51e443050c33c7b8421c7b3c538c49a674a34e2278c7ea09d900cf5851dcf",
+        "wx" : "69e0b481db99f894f0780f84719de16aec599c765eba50b8615477073c32c26ab1e4e7ae5d1f952513ad323225203b4f0c65a24a8368cd322c23e92049d121747c",
+        "wy" : "177901e379e5e724f416487fee7077e6aea81e5250caa3cffbb7d1b2270aa754b4fdae51e443050c33c7b8421c7b3c538c49a674a34e2278c7ea09d900cf5851dcf"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040069e0b481db99f894f0780f84719de16aec599c765eba50b8615477073c32c26ab1e4e7ae5d1f952513ad323225203b4f0c65a24a8368cd322c23e92049d121747c0177901e379e5e724f416487fee7077e6aea81e5250caa3cffbb7d1b2270aa754b4fdae51e443050c33c7b8421c7b3c538c49a674a34e2278c7ea09d900cf5851dcf",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAaeC0gduZ+JTweA+EcZ3hauxZnHZe\nulC4YVR3Bzwywmqx5OeuXR+VJROtMjIlIDtPDGWiSoNozTIsI+kgSdEhdHwBd5Ae\nN55eck9BZIf+5wd+auqB5SUMqjz/u30bInCqdUtP2uUeRDBQwzx7hCHHs8U4xJpn\nSjTiJ4x+oJ2QDPWFHc8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 240,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01d5555555555555555555555555555555555555555555555555555555555555554fa6dbdcd91484ebc0d521569e4c5efb25910b1f0ddef19d0410c50c73e68db95f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AKnCxX8aLpHE7ms9A8CSO1jQ7ECd-I5PMGW6gUi_z39xzrLxoemdyDAISxaZNFTn4Y2iPBoedxmUkdtUGK4ot2xn",
+        "y" : "AByX7nIEk7Qn_TOhPI6H6ELsluaQPMl8sPaTQEmL_cb1Q8qAROylEern8N1WKqwT8sPzVtIWxCtz3a1HVtAy9peQ"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400a9c2c57f1a2e91c4ee6b3d03c0923b58d0ec409df88e4f3065ba8148bfcf7f71ceb2f1a1e99dc830084b16993454e7e18da23c1a1e77199491db5418ae28b76c67001c97ee720493b427fd33a13c8e87e842ec96e6903cc97cb0f69340498bfdc6f543ca8044eca511eae7f0dd562aac13f2c3f356d216c42b73ddad4756d032f69790",
+        "wx" : "0a9c2c57f1a2e91c4ee6b3d03c0923b58d0ec409df88e4f3065ba8148bfcf7f71ceb2f1a1e99dc830084b16993454e7e18da23c1a1e77199491db5418ae28b76c67",
+        "wy" : "1c97ee720493b427fd33a13c8e87e842ec96e6903cc97cb0f69340498bfdc6f543ca8044eca511eae7f0dd562aac13f2c3f356d216c42b73ddad4756d032f69790"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400a9c2c57f1a2e91c4ee6b3d03c0923b58d0ec409df88e4f3065ba8148bfcf7f71ceb2f1a1e99dc830084b16993454e7e18da23c1a1e77199491db5418ae28b76c67001c97ee720493b427fd33a13c8e87e842ec96e6903cc97cb0f69340498bfdc6f543ca8044eca511eae7f0dd562aac13f2c3f356d216c42b73ddad4756d032f69790",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAqcLFfxoukcTuaz0DwJI7WNDsQJ34\njk8wZbqBSL/Pf3HOsvGh6Z3IMAhLFpk0VOfhjaI8Gh53GZSR21QYrii3bGcAHJfu\ncgSTtCf9M6E8jofoQuyW5pA8yXyw9pNASYv9xvVDyoBE7KUR6ufw3VYqrBPyw/NW\n0hbEK3PdrUdW0DL2l5A=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 241,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4fc31322e69da41162a76abf3a1b4507ae66074633446f259661a61c93be30eb5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "Ad-abqWoNX6CnmC7pxHRH4ai3SjF79v5aOlkbfuw0n-ov02B1GJVwZjfSifmyjFWkLHqaHlSl8NlIpvWlZspZLSj",
+        "y" : "Aaq0WiEekBKyvGmrwFiKDejixZM0zTijwiHe-reJ-c-0YIeUqMURUKeD5ZVqCp-aL1R83oLRtdbPUcVmYEtQvPeN"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401df9a6ea5a8357e829e60bba711d11f86a2dd28c5efdbf968e9646dfbb0d27fa8bf4d81d46255c198df4a27e6ca315690b1ea68795297c365229bd6959b2964b4a301aab45a211e9012b2bc69abc0588a0de8e2c59334cd38a3c221defab789f9cfb4608794a8c51150a783e5956a0a9f9a2f547cde82d1b5d6cf51c566604b50bcf78d",
+        "wx" : "1df9a6ea5a8357e829e60bba711d11f86a2dd28c5efdbf968e9646dfbb0d27fa8bf4d81d46255c198df4a27e6ca315690b1ea68795297c365229bd6959b2964b4a3",
+        "wy" : "1aab45a211e9012b2bc69abc0588a0de8e2c59334cd38a3c221defab789f9cfb4608794a8c51150a783e5956a0a9f9a2f547cde82d1b5d6cf51c566604b50bcf78d"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401df9a6ea5a8357e829e60bba711d11f86a2dd28c5efdbf968e9646dfbb0d27fa8bf4d81d46255c198df4a27e6ca315690b1ea68795297c365229bd6959b2964b4a301aab45a211e9012b2bc69abc0588a0de8e2c59334cd38a3c221defab789f9cfb4608794a8c51150a783e5956a0a9f9a2f547cde82d1b5d6cf51c566604b50bcf78d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB35pupag1foKeYLunEdEfhqLdKMXv\n2/lo6WRt+7DSf6i/TYHUYlXBmN9KJ+bKMVaQsepoeVKXw2Uim9aVmylktKMBqrRa\nIR6QErK8aavAWIoN6OLFkzTNOKPCId76t4n5z7Rgh5SoxRFQp4PllWoKn5ovVHze\ngtG11s9RxWZgS1C8940=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 242,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e9138640b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "Ad8w7ybhYBU6FGil3dBrAsyxZN_jrIx_FfaNTxkH74vpytxr5wWiKUQjQGcL0Rhu2CbTm6TCMRsd95QAGik8Anzf",
+        "y" : "ABNPMORDVQQQKlTDRO2AAJzhucUJLEC6Mt-AU5NqjNipQa5ShFBf0a4MUwIIbJOlgoMNJLtkYnLdndLyFQQlotfl"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401df30ef26e160153a1468a5ddd06b02ccb164dfe3ac8c7f15f68d4f1907ef8be9cadc6be705a229442340670bd1186ed826d39ba4c2311b1df794001a293c027cdf00134f30e4435504102a54c344ed80009ce1b9c5092c40ba32df8053936a8cd8a941ae5284505fd1ae0c5302086c93a582830d24bb646272dd9dd2f2150425a2d7e5",
+        "wx" : "1df30ef26e160153a1468a5ddd06b02ccb164dfe3ac8c7f15f68d4f1907ef8be9cadc6be705a229442340670bd1186ed826d39ba4c2311b1df794001a293c027cdf",
+        "wy" : "134f30e4435504102a54c344ed80009ce1b9c5092c40ba32df8053936a8cd8a941ae5284505fd1ae0c5302086c93a582830d24bb646272dd9dd2f2150425a2d7e5"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401df30ef26e160153a1468a5ddd06b02ccb164dfe3ac8c7f15f68d4f1907ef8be9cadc6be705a229442340670bd1186ed826d39ba4c2311b1df794001a293c027cdf00134f30e4435504102a54c344ed80009ce1b9c5092c40ba32df8053936a8cd8a941ae5284505fd1ae0c5302086c93a582830d24bb646272dd9dd2f2150425a2d7e5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB3zDvJuFgFToUaKXd0GsCzLFk3+Os\njH8V9o1PGQfvi+nK3GvnBaIpRCNAZwvRGG7YJtObpMIxGx33lAAaKTwCfN8AE08w\n5ENVBBAqVMNE7YAAnOG5xQksQLoy34BTk2qM2KlBrlKEUF/RrgxTAghsk6WCgw0k\nu2Rict2d0vIVBCWi1+U=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 243,
+          "comment" : "edge case for u2",
+          "msg" : "54657374",
+          "sig" : "00fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01346cc7d4839b77f9f487c7e7f2841c5b7d05f966f3bde28f1fa080ce40037a74e3001a2b00bd39ee4c93072e9963724941383cf0812c02d1c838ad4502a12c619f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AUAPo7yHSC7BunU0ahKeyPeUVufWNDsqa-IkkIhLj4uJEUwOX5VY12J63q5T_4zje6-UuZ0E91CYyo4-d8a-Arw-",
+        "y" : "AWkNdwgGven00nYCk6umB2Bm8XYuhEjw0Ick7zEf91lvNei2qTRt5lvqkkudMLuXLjs4h4Fy-QQDeKDbRymel5hW"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401400fa3bc87482ec1ba75346a129ec8f79456e7d6343b2a6be22490884b8f8b89114c0e5f9558d7627adeae53ff8ce37baf94b99d04f75098ca8e3e77c6be02bc3e01690d770806bde9f4d2760293aba6076066f1762e8448f0d08724ef311ff7596f35e8b6a9346de65bea924b9d30bb972e3b38878172f9040378a0db47299e979856",
+        "wx" : "1400fa3bc87482ec1ba75346a129ec8f79456e7d6343b2a6be22490884b8f8b89114c0e5f9558d7627adeae53ff8ce37baf94b99d04f75098ca8e3e77c6be02bc3e",
+        "wy" : "1690d770806bde9f4d2760293aba6076066f1762e8448f0d08724ef311ff7596f35e8b6a9346de65bea924b9d30bb972e3b38878172f9040378a0db47299e979856"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401400fa3bc87482ec1ba75346a129ec8f79456e7d6343b2a6be22490884b8f8b89114c0e5f9558d7627adeae53ff8ce37baf94b99d04f75098ca8e3e77c6be02bc3e01690d770806bde9f4d2760293aba6076066f1762e8448f0d08724ef311ff7596f35e8b6a9346de65bea924b9d30bb972e3b38878172f9040378a0db47299e979856",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBQA+jvIdILsG6dTRqEp7I95RW59Y0\nOypr4iSQiEuPi4kRTA5flVjXYnrerlP/jON7r5S5nQT3UJjKjj53xr4CvD4BaQ13\nCAa96fTSdgKTq6YHYGbxdi6ESPDQhyTvMR/3WW816LapNG3mW+qSS50wu5cuOziH\ngXL5BAN4oNtHKZ6XmFY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 244,
+          "comment" : "point duplication during verification",
+          "msg" : "54657374",
+          "sig" : "0090c8d0d718cb9d8d81094e6d068fb13c16b4df8c77bac676dddfe3e68855bed06b9ba8d0f8a80edce03a9fac7da561e24b1cd22d459239a146695a671f81f73aaf00a24fbd602ff7012b6b00e9aa1683b45bfa2d62dc768737e8da92cad52f069efbea526acc68096fc0ef9960c6b989bf8922aea38fd463d02c0e7c25e336f32b0874",
+          "result" : "valid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AUAPo7yHSC7BunU0ahKeyPeUVufWNDsqa-IkkIhLj4uJEUwOX5VY12J63q5T_4zje6-UuZ0E91CYyo4-d8a-Arw-",
+        "y" : "AJbyiPf5QhYLLYn9bFRZ-J-ZDonRe7cPL3jbEM7gCKaQyhdJVsuSGaQVbbRiz0Ro0cTHeH6NBvv8h18kuNZhaGep"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401400fa3bc87482ec1ba75346a129ec8f79456e7d6343b2a6be22490884b8f8b89114c0e5f9558d7627adeae53ff8ce37baf94b99d04f75098ca8e3e77c6be02bc3e0096f288f7f942160b2d89fd6c5459f89f990e89d17bb70f2f78db10cee008a690ca174956cb9219a4156db462cf4468d1c4c7787e8d06fbfc875f24b8d6616867a9",
+        "wx" : "1400fa3bc87482ec1ba75346a129ec8f79456e7d6343b2a6be22490884b8f8b89114c0e5f9558d7627adeae53ff8ce37baf94b99d04f75098ca8e3e77c6be02bc3e",
+        "wy" : "096f288f7f942160b2d89fd6c5459f89f990e89d17bb70f2f78db10cee008a690ca174956cb9219a4156db462cf4468d1c4c7787e8d06fbfc875f24b8d6616867a9"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401400fa3bc87482ec1ba75346a129ec8f79456e7d6343b2a6be22490884b8f8b89114c0e5f9558d7627adeae53ff8ce37baf94b99d04f75098ca8e3e77c6be02bc3e0096f288f7f942160b2d89fd6c5459f89f990e89d17bb70f2f78db10cee008a690ca174956cb9219a4156db462cf4468d1c4c7787e8d06fbfc875f24b8d6616867a9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBQA+jvIdILsG6dTRqEp7I95RW59Y0\nOypr4iSQiEuPi4kRTA5flVjXYnrerlP/jON7r5S5nQT3UJjKjj53xr4CvD4AlvKI\n9/lCFgstif1sVFn4n5kOidF7tw8veNsQzuAIppDKF0lWy5IZpBVttGLPRGjRxMd4\nfo0G+/yHXyS41mFoZ6k=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 245,
+          "comment" : "duplication bug",
+          "msg" : "54657374",
+          "sig" : "0090c8d0d718cb9d8d81094e6d068fb13c16b4df8c77bac676dddfe3e68855bed06b9ba8d0f8a80edce03a9fac7da561e24b1cd22d459239a146695a671f81f73aaf00a24fbd602ff7012b6b00e9aa1683b45bfa2d62dc768737e8da92cad52f069efbea526acc68096fc0ef9960c6b989bf8922aea38fd463d02c0e7c25e336f32b0874",
+          "result" : "invalid",
+          "flags" : [
+            "PointDuplication"
+          ]
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AJp7UuHf8BgFgUPO8VxwKnoJToGz5mW1KYeksHfQDH0cw5i9vhZ9Kjwe2dr_IPdorLP9liwGsfwWWTopFzQID0DA",
+        "y" : "AI5EtESj9mgD_zhG8ibc9yTsPOaS5nrJkeBirkoOVVoa0YSQXTIxw_BYrkDCZlR7B2p8hCDWp-lKowA0Ku7tHF99"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04009a7b52e1dff018058143cef15c702a7a094e81b3e665b52987a4b077d00c7d1cc398bdbe167d2a3c1ed9daff20f768acb3fd962c06b1fc16593a291734080f40c0008e44b444a3f66803ff3846f226dcf724ec3ce692e67ac991e062ae4a0e555a1ad184905d3231c3f058ae40c266547b076a7c8420d6a7e94aa300342aeeed1c5f7d",
+        "wx" : "09a7b52e1dff018058143cef15c702a7a094e81b3e665b52987a4b077d00c7d1cc398bdbe167d2a3c1ed9daff20f768acb3fd962c06b1fc16593a291734080f40c0",
+        "wy" : "08e44b444a3f66803ff3846f226dcf724ec3ce692e67ac991e062ae4a0e555a1ad184905d3231c3f058ae40c266547b076a7c8420d6a7e94aa300342aeeed1c5f7d"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004009a7b52e1dff018058143cef15c702a7a094e81b3e665b52987a4b077d00c7d1cc398bdbe167d2a3c1ed9daff20f768acb3fd962c06b1fc16593a291734080f40c0008e44b444a3f66803ff3846f226dcf724ec3ce692e67ac991e062ae4a0e555a1ad184905d3231c3f058ae40c266547b076a7c8420d6a7e94aa300342aeeed1c5f7d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAmntS4d/wGAWBQ87xXHAqeglOgbPm\nZbUph6Swd9AMfRzDmL2+Fn0qPB7Z2v8g92iss/2WLAax/BZZOikXNAgPQMAAjkS0\nRKP2aAP/OEbyJtz3JOw85pLmesmR4GKuSg5VWhrRhJBdMjHD8FiuQMJmVHsHanyE\nINan6UqjADQq7u0cX30=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 246,
+          "comment" : "point with x-coordinate 0",
+          "msg" : "54657374",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AOJv8CALcxRQrRe7b-8abjh6PsQc1NgII0pkJy6BnCICZr55xa2uN4JUZJ7IzKBeySgVuLnrPOxYaTqmq9C6GRq9",
+        "y" : "Ae_FNv9wDzYR01jhgpFHDYRUc7V1C3UlzTcJQy_y-od0OvkolKemRqgv0k0_bgzEerZz1oYw13C9DXJLDWDea1H2"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400e26ff0200b731450ad17bb6fef1a6e387a3ec41cd4d808234a64272e819c220266be79c5adae378254649ec8cca05ec92815b8b9eb3cec58693aa6abd0ba191abd01efc536ff700f3611d358e18291470d845473b5750b7525cd3709432ff2fa87743af92894a7a646a82fd24d3f6e0cc47ab673d68630d770bd0d724b0d60de6b51f6",
+        "wx" : "0e26ff0200b731450ad17bb6fef1a6e387a3ec41cd4d808234a64272e819c220266be79c5adae378254649ec8cca05ec92815b8b9eb3cec58693aa6abd0ba191abd",
+        "wy" : "1efc536ff700f3611d358e18291470d845473b5750b7525cd3709432ff2fa87743af92894a7a646a82fd24d3f6e0cc47ab673d68630d770bd0d724b0d60de6b51f6"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400e26ff0200b731450ad17bb6fef1a6e387a3ec41cd4d808234a64272e819c220266be79c5adae378254649ec8cca05ec92815b8b9eb3cec58693aa6abd0ba191abd01efc536ff700f3611d358e18291470d845473b5750b7525cd3709432ff2fa87743af92894a7a646a82fd24d3f6e0cc47ab673d68630d770bd0d724b0d60de6b51f6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQA4m/wIAtzFFCtF7tv7xpuOHo+xBzU\n2AgjSmQnLoGcIgJmvnnFra43glRknsjMoF7JKBW4ues87FhpOqar0LoZGr0B78U2\n/3APNhHTWOGCkUcNhFRztXULdSXNNwlDL/L6h3Q6+SiUp6ZGqC/STT9uDMR6tnPW\nhjDXcL0NcksNYN5rUfY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 247,
+          "comment" : "point with x-coordinate 0",
+          "msg" : "54657374",
+          "sig" : "0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81401",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AXfUEwuw_1WX86UfWgD5AhPB2FhTiYKd7WMYCcGApmVjZEgxQq7a0xSG_yeiqquw7TCIlpQ935ZZDhZlRQujTJ6H",
+        "y" : "ACu6YJrYpLTIlNMDs4csT2OTnhmukdIbGoPMImBwD44OwZim842mKm6lch4TZKWn8C9g9ejeU6l84RyGZtWIy82z"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040177d4130bb0ff5597f3a51f5a00f90213c1d8585389829ded631809c180a6656364483142aedad31486ff27a2aaabb0ed308896943ddf96590e1665450ba34c9e87002bba609ad8a4b4c894d303b3872c4f63939e19ae91d21b1a83cc2260700f8e0ec198a6f38da62a6ea5721e1364a5a7f02f60f5e8de53a97ce11c8666d588cbcdb3",
+        "wx" : "177d4130bb0ff5597f3a51f5a00f90213c1d8585389829ded631809c180a6656364483142aedad31486ff27a2aaabb0ed308896943ddf96590e1665450ba34c9e87",
+        "wy" : "2bba609ad8a4b4c894d303b3872c4f63939e19ae91d21b1a83cc2260700f8e0ec198a6f38da62a6ea5721e1364a5a7f02f60f5e8de53a97ce11c8666d588cbcdb3"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040177d4130bb0ff5597f3a51f5a00f90213c1d8585389829ded631809c180a6656364483142aedad31486ff27a2aaabb0ed308896943ddf96590e1665450ba34c9e87002bba609ad8a4b4c894d303b3872c4f63939e19ae91d21b1a83cc2260700f8e0ec198a6f38da62a6ea5721e1364a5a7f02f60f5e8de53a97ce11c8666d588cbcdb3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBd9QTC7D/VZfzpR9aAPkCE8HYWFOJ\ngp3tYxgJwYCmZWNkSDFCrtrTFIb/J6Kqq7DtMIiWlD3fllkOFmVFC6NMnocAK7pg\nmtiktMiU0wOzhyxPY5OeGa6R0hsag8wiYHAPjg7BmKbzjaYqbqVyHhNkpafwL2D1\n6N5TqXzhHIZm1YjLzbM=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 248,
+          "comment" : "comparison with point at infinity ",
+          "msg" : "54657374",
+          "sig" : "00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad0066666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81401",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AFjTG587o084TyR4_WDVTPppO7xUchAoHAAJWJwCRLoZWPK6ka33ailsd1ZujqrsEytcvVVbE-3sDA8K4GHoyaGx",
+        "y" : "AYcosN0C0TH8aAW3UWjJgqP9uT_oXKK1MNHYOctTTA68AhrjcjkmowAnN7S3lsEmiNdog00F4lFoGEOKOMAjtS_P"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040058d31b9f3ba34f384f2478fd60d54cfa693bbc547210281c0009589c0244ba1958f2ba91adf76a296c77566e8eaaec132b5cbd555b13edec0c0f0ae061e8c9a1b1018728b0dd02d131fc6805b75168c982a3fdb93fe85ca2b530d1d839cb534c0ebc021ae3723926a3002737b4b796c12688d768834d05e2516818438a38c023b52fcf",
+        "wx" : "58d31b9f3ba34f384f2478fd60d54cfa693bbc547210281c0009589c0244ba1958f2ba91adf76a296c77566e8eaaec132b5cbd555b13edec0c0f0ae061e8c9a1b1",
+        "wy" : "18728b0dd02d131fc6805b75168c982a3fdb93fe85ca2b530d1d839cb534c0ebc021ae3723926a3002737b4b796c12688d768834d05e2516818438a38c023b52fcf"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040058d31b9f3ba34f384f2478fd60d54cfa693bbc547210281c0009589c0244ba1958f2ba91adf76a296c77566e8eaaec132b5cbd555b13edec0c0f0ae061e8c9a1b1018728b0dd02d131fc6805b75168c982a3fdb93fe85ca2b530d1d839cb534c0ebc021ae3723926a3002737b4b796c12688d768834d05e2516818438a38c023b52fcf",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAWNMbnzujTzhPJHj9YNVM+mk7vFRy\nECgcAAlYnAJEuhlY8rqRrfdqKWx3Vm6OquwTK1y9VVsT7ewMDwrgYejJobEBhyiw\n3QLRMfxoBbdRaMmCo/25P+hcorUw0dg5y1NMDrwCGuNyOSajACc3tLeWwSaI12iD\nTQXiUWgYQ4o4wCO1L88=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 249,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "54657374",
+          "sig" : "00433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AFH5gZOAdV-rWPSWqB-EZVVLz5B1VOkRWANmIVKW06bYG6Is7Jhq4zAQ1kFr8ds7Zjf2TSQLb0tcfqIp-H4PzWmf",
+        "y" : "AYEkhydeZyw2RxJ4P-SopTcp4_yQE4r-W4acUGjLXUVU4afx2Kyd14-8qayrTqeRMR1m4B4EggG0DZ84PQoLBo2q"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040051f9819380755fab58f496a81f8465554bcf907554e911580366215296d3a6d81ba22cec986ae33010d6416bf1db3b6637f64d240b6f4b5c7ea229f87e0fcd699f01812487275e672c364712783fe4a8a53729e3fc90138afe5b869c5068cb5d4554e1a7f1d8ac9dd78fbca9acab4ea791311d66e01e048201b40d9f383d0a0b068daa",
+        "wx" : "51f9819380755fab58f496a81f8465554bcf907554e911580366215296d3a6d81ba22cec986ae33010d6416bf1db3b6637f64d240b6f4b5c7ea229f87e0fcd699f",
+        "wy" : "1812487275e672c364712783fe4a8a53729e3fc90138afe5b869c5068cb5d4554e1a7f1d8ac9dd78fbca9acab4ea791311d66e01e048201b40d9f383d0a0b068daa"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040051f9819380755fab58f496a81f8465554bcf907554e911580366215296d3a6d81ba22cec986ae33010d6416bf1db3b6637f64d240b6f4b5c7ea229f87e0fcd699f01812487275e672c364712783fe4a8a53729e3fc90138afe5b869c5068cb5d4554e1a7f1d8ac9dd78fbca9acab4ea791311d66e01e048201b40d9f383d0a0b068daa",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAUfmBk4B1X6tY9JaoH4RlVUvPkHVU\n6RFYA2YhUpbTptgboizsmGrjMBDWQWvx2ztmN/ZNJAtvS1x+oin4fg/NaZ8BgSSH\nJ15nLDZHEng/5KilNynj/JATiv5bhpxQaMtdRVThp/HYrJ3Xj7yprKtOp5ExHWbg\nHgSCAbQNnzg9CgsGjao=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 250,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "00433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d00492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AfylttpLll8siLFPelhEzm-CdtL10Dc52yZsT12F_Js3Gb5FOsgATwJ_cUzwesGyfHsqHvknBdKle73r9SFkdhW2",
+        "y" : "AajavNu_NRClCSRNzZrycqvFYLMNh06SrVLFK6ZLGTJbJQ4V5-tbBKGQ62WODPZj8CZcBb9KuOuWCnCExRQlDeeQ"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401fca5b6da4b965f2c88b14f7a5844ce6f8276d2f5d03739db266c4f5d85fc9b3719be453ac8004f027f714cf07ac1b27c7b2a1ef92705d2a57bbdebf521647615b601a8dabcdbbf3510a509244dcd9af272abc560b30d874e92ad52c52ba64b19325b250e15e7eb5b04a190eb658e0cf663f0265c05bf4ab8eb960a7084c514250de790",
+        "wx" : "1fca5b6da4b965f2c88b14f7a5844ce6f8276d2f5d03739db266c4f5d85fc9b3719be453ac8004f027f714cf07ac1b27c7b2a1ef92705d2a57bbdebf521647615b6",
+        "wy" : "1a8dabcdbbf3510a509244dcd9af272abc560b30d874e92ad52c52ba64b19325b250e15e7eb5b04a190eb658e0cf663f0265c05bf4ab8eb960a7084c514250de790"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401fca5b6da4b965f2c88b14f7a5844ce6f8276d2f5d03739db266c4f5d85fc9b3719be453ac8004f027f714cf07ac1b27c7b2a1ef92705d2a57bbdebf521647615b601a8dabcdbbf3510a509244dcd9af272abc560b30d874e92ad52c52ba64b19325b250e15e7eb5b04a190eb658e0cf663f0265c05bf4ab8eb960a7084c514250de790",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB/KW22kuWXyyIsU96WETOb4J20vXQ\nNznbJmxPXYX8mzcZvkU6yABPAn9xTPB6wbJ8eyoe+ScF0qV7vev1IWR2FbYBqNq8\n2781EKUJJE3NmvJyq8Vgsw2HTpKtUsUrpksZMlslDhXn61sEoZDrZY4M9mPwJlwF\nv0q465YKcITFFCUN55A=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 251,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "00433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d019999999999999999999999999999999999999999999999999999999999999999950e053936328c7855ffd6676d926e1e402fc4a1606e169fbefc595f4ba7605007",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AEyGQ-VGpxuTGFylg65QmMHmwLDTP8LWGIcPlDixxZXbyJIAhFZfAHTa-sp4usJVjKYjwlH21TAyjCc0oEE4Id_l",
+        "y" : "AB2KwKclG4IEb5zyzmeeEncPhoGkPw4n5VNoD8UjQpWsJCEqJchX4VI1Bnbk5SyjBEGBtnEQzgEp-gvcFaTVpw6O"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04004c8643e546a71b93185ca583ae5098c1e6c0b0d33fc2d618870f9438b1c595dbc8920084565f0074dafaca78bac2558ca623c251f6d530328c2734a0413821dfe5001d8ac0a7251b82046f9cf2ce679e12770f8681a43f0e27e553680fc5234295ac24212a25c857e152350676e4e52ca3044181b67110ce0129fa0bdc15a4d5a70e8e",
+        "wx" : "4c8643e546a71b93185ca583ae5098c1e6c0b0d33fc2d618870f9438b1c595dbc8920084565f0074dafaca78bac2558ca623c251f6d530328c2734a0413821dfe5",
+        "wy" : "1d8ac0a7251b82046f9cf2ce679e12770f8681a43f0e27e553680fc5234295ac24212a25c857e152350676e4e52ca3044181b67110ce0129fa0bdc15a4d5a70e8e"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004004c8643e546a71b93185ca583ae5098c1e6c0b0d33fc2d618870f9438b1c595dbc8920084565f0074dafaca78bac2558ca623c251f6d530328c2734a0413821dfe5001d8ac0a7251b82046f9cf2ce679e12770f8681a43f0e27e553680fc5234295ac24212a25c857e152350676e4e52ca3044181b67110ce0129fa0bdc15a4d5a70e8e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQATIZD5UanG5MYXKWDrlCYwebAsNM/\nwtYYhw+UOLHFldvIkgCEVl8AdNr6yni6wlWMpiPCUfbVMDKMJzSgQTgh3+UAHYrA\npyUbggRvnPLOZ54Sdw+GgaQ/DiflU2gPxSNClawkISolyFfhUjUGduTlLKMEQYG2\ncRDOASn6C9wVpNWnDo4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 252,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "00433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d0066666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81402",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AKZZfHaVYEb80DxETppOE7n7dRrJH7T8ul_TOv9h8zBfp7gx5SJ6XARw5eH95KJeU5_CN3O7Oiz0Hu4PxnjQUHBa",
+        "y" : "Afb1rko7mURzZ5B09u5lecUAXm_YYM1N0p4H1EdYI69r6K9dQUu6R7QuYBuXZg0QpmLje1GA6OabM8X315jaGL5J"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400a6597c76956046fcd03c444e9a4e13b9fb751ac91fb4fcba5fd33aff61f3305fa7b831e5227a5c0470e5e1fde4a25e539fc23773bb3a2cf41eee0fc678d050705a01f6f5ae4a3b994473679074f6ee6579c5005e6fd860cd4dd29e07d4475823af6be8af5d414bba47b42e601b97660d10a662e37b5180e8e69b33c5f7d798da18be49",
+        "wx" : "0a6597c76956046fcd03c444e9a4e13b9fb751ac91fb4fcba5fd33aff61f3305fa7b831e5227a5c0470e5e1fde4a25e539fc23773bb3a2cf41eee0fc678d050705a",
+        "wy" : "1f6f5ae4a3b994473679074f6ee6579c5005e6fd860cd4dd29e07d4475823af6be8af5d414bba47b42e601b97660d10a662e37b5180e8e69b33c5f7d798da18be49"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400a6597c76956046fcd03c444e9a4e13b9fb751ac91fb4fcba5fd33aff61f3305fa7b831e5227a5c0470e5e1fde4a25e539fc23773bb3a2cf41eee0fc678d050705a01f6f5ae4a3b994473679074f6ee6579c5005e6fd860cd4dd29e07d4475823af6be8af5d414bba47b42e601b97660d10a662e37b5180e8e69b33c5f7d798da18be49",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQApll8dpVgRvzQPEROmk4Tuft1Gskf\ntPy6X9M6/2HzMF+nuDHlInpcBHDl4f3kol5Tn8I3c7s6LPQe7g/GeNBQcFoB9vWu\nSjuZRHNnkHT27mV5xQBeb9hgzU3SngfUR1gjr2vor11BS7pHtC5gG5dmDRCmYuN7\nUYDo5pszxffXmNoYvkk=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 253,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "00433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d01b6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db68d82a2b033628ca12ffd36ed0d3bf206957c063c2bf183d7132f20aac7c797a51",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AacvoEaxFXVnuZE6imEQf7TdDhKytAbvIZt2f5MTDznVSZh0XFHRr_UbaNeNNEGNYSi_k8zb4V9kdoJOCzEb0met",
+        "y" : "APPk1xlhBVpMF2P8Hu-ggA-ErHx7vE_Y7Xc7ebcKmeAdGmwAll7h_2ZlCTqkI_nTBHkq96T0FBw6Kl2QBSSVSpXU"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401a72fa046b1157567b9913a8a61107fb4dd0e12b2b406ef219b767f93130f39d54998745c51d1aff51b68d78d34418d6128bf93ccdbe15f6476824e0b311bd267ad00f3e4d71961055a4c1763fc1eefa0800f84ac7c7bbc4fd8ed773b79b70a99e01d1a6c00965ee1ff6665093aa423f9d304792af7a4f4141c3a2a5d900524954a95d4",
+        "wx" : "1a72fa046b1157567b9913a8a61107fb4dd0e12b2b406ef219b767f93130f39d54998745c51d1aff51b68d78d34418d6128bf93ccdbe15f6476824e0b311bd267ad",
+        "wy" : "0f3e4d71961055a4c1763fc1eefa0800f84ac7c7bbc4fd8ed773b79b70a99e01d1a6c00965ee1ff6665093aa423f9d304792af7a4f4141c3a2a5d900524954a95d4"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401a72fa046b1157567b9913a8a61107fb4dd0e12b2b406ef219b767f93130f39d54998745c51d1aff51b68d78d34418d6128bf93ccdbe15f6476824e0b311bd267ad00f3e4d71961055a4c1763fc1eefa0800f84ac7c7bbc4fd8ed773b79b70a99e01d1a6c00965ee1ff6665093aa423f9d304792af7a4f4141c3a2a5d900524954a95d4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBpy+gRrEVdWe5kTqKYRB/tN0OErK0\nBu8hm3Z/kxMPOdVJmHRcUdGv9Rto1400QY1hKL+TzNvhX2R2gk4LMRvSZ60A8+TX\nGWEFWkwXY/we76CAD4SsfHu8T9jtdzt5twqZ4B0abACWXuH/ZmUJOqQj+dMEeSr3\npPQUHDoqXZAFJJVKldQ=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 254,
+          "comment" : "extreme value for k",
+          "msg" : "54657374",
+          "sig" : "00433c219024277e7e682fcb288148c282747403279b1ccc06352c6e5505d769be97b3b204da6ef55507aa104a3a35c5af41cf2fa364d60fd967f43e3933ba6d783d000eb10e5ab95f2f26a40700b1300fb8c3c8d5384ffbecf1fdb9e11e67cb7fd6a7f503e6e25ac09bb88b6c3983df764d4d72bc2920e233f0f7974a234a21b00bb447",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AM9t8crwL5CYvlAuGHqST76MwQ8EIt1mv9n5FWzyLYMPCEuNs6TuWI-xCLoXgQOhqkWqaH_pswFzeRtu_t5LYAd0",
+        "y" : "ADWbluck_oaau5X0VJr0DhPGZNGgCa0CBbRU8aSVWBp3DlyCqphL0qXNLTWa30h8OS5EEEj-YMJpb_qVjIB94JfJ"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400cf6df1caf02f9098be502e187a924fbe8cc10f0422dd66bfd9f9156cf22d830f084b8db3a4ee588fb108ba178103a1aa45aa687fe9b30173791b6efede4b60077400359b96e724fe869abb95f4549af40e13c664d1a009ad0205b454f1a495581a770e5c82aa984bd2a5cd2d359adf487c392e441048fe60c2696ffa958c807de097c9",
+        "wx" : "0cf6df1caf02f9098be502e187a924fbe8cc10f0422dd66bfd9f9156cf22d830f084b8db3a4ee588fb108ba178103a1aa45aa687fe9b30173791b6efede4b600774",
+        "wy" : "359b96e724fe869abb95f4549af40e13c664d1a009ad0205b454f1a495581a770e5c82aa984bd2a5cd2d359adf487c392e441048fe60c2696ffa958c807de097c9"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400cf6df1caf02f9098be502e187a924fbe8cc10f0422dd66bfd9f9156cf22d830f084b8db3a4ee588fb108ba178103a1aa45aa687fe9b30173791b6efede4b60077400359b96e724fe869abb95f4549af40e13c664d1a009ad0205b454f1a495581a770e5c82aa984bd2a5cd2d359adf487c392e441048fe60c2696ffa958c807de097c9",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAz23xyvAvkJi+UC4YepJPvozBDwQi\n3Wa/2fkVbPItgw8IS42zpO5Yj7EIuheBA6GqRapof+mzAXN5G27+3ktgB3QANZuW\n5yT+hpq7lfRUmvQOE8Zk0aAJrQIFtFTxpJVYGncOXIKqmEvSpc0tNZrfSHw5LkQQ\nSP5gwmlv+pWMgH3gl8k=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 255,
+          "comment" : "extreme value for k and edgecase s",
+          "msg" : "54657374",
+          "sig" : "00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd6600aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa8c5d782813fba87792a9955c2fd033745693c9892d8896d3a3e7a925f85bd76ad",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AG-DnE8j7wQLOpmR1HycTe9v2w7Pb8O4KV0HcpvrN1BctOmxDWiXLwO2711mlgPBUV4mzfOn_100zU9w561LlKJ7",
+        "y" : "AFTfl3hduCFtml4hEYvGzKlZfYnGbbHfkMnIMDpJABq4VP0508GPLrNzaggnp1EBGHDB22oAE72_YXXC-_4n2R_l"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04006f839c4f23ef040b3a9991d47c9c4def6fdb0ecf6fc3b8295d07729beb37505cb4e9b10d68972f03b6ef5d669603c1515e26cdf3a7ff5d34cd4f70e7ad4b94a27b0054df97785db8216d9a5e21118bc6cca9597d89c66db1df90c9c8303a49001ab854fd39d3c18f2eb3736a0827a751011870c1db6a0013bdbf6175c2fbfe27d91fe5",
+        "wx" : "6f839c4f23ef040b3a9991d47c9c4def6fdb0ecf6fc3b8295d07729beb37505cb4e9b10d68972f03b6ef5d669603c1515e26cdf3a7ff5d34cd4f70e7ad4b94a27b",
+        "wy" : "54df97785db8216d9a5e21118bc6cca9597d89c66db1df90c9c8303a49001ab854fd39d3c18f2eb3736a0827a751011870c1db6a0013bdbf6175c2fbfe27d91fe5"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004006f839c4f23ef040b3a9991d47c9c4def6fdb0ecf6fc3b8295d07729beb37505cb4e9b10d68972f03b6ef5d669603c1515e26cdf3a7ff5d34cd4f70e7ad4b94a27b0054df97785db8216d9a5e21118bc6cca9597d89c66db1df90c9c8303a49001ab854fd39d3c18f2eb3736a0827a751011870c1db6a0013bdbf6175c2fbfe27d91fe5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAb4OcTyPvBAs6mZHUfJxN72/bDs9v\nw7gpXQdym+s3UFy06bENaJcvA7bvXWaWA8FRXibN86f/XTTNT3DnrUuUonsAVN+X\neF24IW2aXiERi8bMqVl9icZtsd+QycgwOkkAGrhU/TnTwY8us3NqCCenUQEYcMHb\nagATvb9hdcL7/ifZH+U=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 256,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd6600492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AVAkbdQnyszmbm3leozA3-JJlp8_z07WTeNBM565AzHbHwVHUpLOnCmRbaZc6rbmfvLc4TseF7jRot5__BUE8_2d",
+        "y" : "AZKH8JGG0qfv1sS8VpBCncMaF93qU9SqZipYqhH-tAgB3Jx1DBh9Q1H1mQzdFnGrkJe6rAUSuMo39Vf-y_WQ-v1q"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040150246dd427cacce66e6de57a8cc0dfe249969f3fcf4ed64de341339eb90331db1f05475292ce9c29916da65ceab6e67ef2dce13b1e17b8d1a2de7ffc1504f3fd9d019287f09186d2a7efd6c4bc5690429dc31a17ddea53d4aa662a58aa11feb40801dc9c750c187d4351f5990cdd1671ab9097baac0512b8ca37f557fecbf590fafd6a",
+        "wx" : "150246dd427cacce66e6de57a8cc0dfe249969f3fcf4ed64de341339eb90331db1f05475292ce9c29916da65ceab6e67ef2dce13b1e17b8d1a2de7ffc1504f3fd9d",
+        "wy" : "19287f09186d2a7efd6c4bc5690429dc31a17ddea53d4aa662a58aa11feb40801dc9c750c187d4351f5990cdd1671ab9097baac0512b8ca37f557fecbf590fafd6a"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040150246dd427cacce66e6de57a8cc0dfe249969f3fcf4ed64de341339eb90331db1f05475292ce9c29916da65ceab6e67ef2dce13b1e17b8d1a2de7ffc1504f3fd9d019287f09186d2a7efd6c4bc5690429dc31a17ddea53d4aa662a58aa11feb40801dc9c750c187d4351f5990cdd1671ab9097baac0512b8ca37f557fecbf590fafd6a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBUCRt1CfKzOZubeV6jMDf4kmWnz/P\nTtZN40EznrkDMdsfBUdSks6cKZFtplzqtuZ+8tzhOx4XuNGi3n/8FQTz/Z0Bkofw\nkYbSp+/WxLxWkEKdwxoX3epT1KpmKliqEf60CAHcnHUMGH1DUfWZDN0WcauQl7qs\nBRK4yjf1V/7L9ZD6/Wo=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 257,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66019999999999999999999999999999999999999999999999999999999999999999950e053936328c7855ffd6676d926e1e402fc4a1606e169fbefc595f4ba7605007",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "ANQrJxRFJB5OUTbPjltwbtRAMjTMpUghc3Fp6aYN7FR0Xx3Ad8XtnWDC9XLF5XSfT0QxlSVhwqMNmsMS-8Pl3J3K",
+        "y" : "AXm3pjtns0Wqhl2xTZFHs2CUoSFkJj5YjiCZatgUsvH_2WgXIDBbOwP2uUjbA6fYmvLv99veoMQRlA7YDM5tmzTG"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400d42b271445241e4e5136cf8e5b706ed4403234cca54821737169e9a60dec54745f1dc077c5ed9d60c2f572c5e5749f4f4431952561c2a30d9ac312fbc3e5dc9dca0179b7a63b67b345aa865db14d9147b36094a12164263e588e20996ad814b2f1ffd9681720305b3b03f6b948db03a7d89af2eff7dbdea0c411940ed80cce6d9b34c6",
+        "wx" : "0d42b271445241e4e5136cf8e5b706ed4403234cca54821737169e9a60dec54745f1dc077c5ed9d60c2f572c5e5749f4f4431952561c2a30d9ac312fbc3e5dc9dca",
+        "wy" : "179b7a63b67b345aa865db14d9147b36094a12164263e588e20996ad814b2f1ffd9681720305b3b03f6b948db03a7d89af2eff7dbdea0c411940ed80cce6d9b34c6"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400d42b271445241e4e5136cf8e5b706ed4403234cca54821737169e9a60dec54745f1dc077c5ed9d60c2f572c5e5749f4f4431952561c2a30d9ac312fbc3e5dc9dca0179b7a63b67b345aa865db14d9147b36094a12164263e588e20996ad814b2f1ffd9681720305b3b03f6b948db03a7d89af2eff7dbdea0c411940ed80cce6d9b34c6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQA1CsnFEUkHk5RNs+OW3Bu1EAyNMyl\nSCFzcWnppg3sVHRfHcB3xe2dYML1csXldJ9PRDGVJWHCow2awxL7w+XcncoBebem\nO2ezRaqGXbFNkUezYJShIWQmPliOIJlq2BSy8f/ZaBcgMFs7A/a5SNsDp9ia8u/3\n296gxBGUDtgMzm2bNMY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 258,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd660066666666666666666666666666666666666666666666666666666666666666666543814e4d8ca31e157ff599db649b87900bf128581b85a7efbf1657d2e9d81402",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AHB4DqPC5zskAPRPSKOTtskBnPp4iqXj0nLsvsncDbyzUYfZV14fXxW68i9QLjypKHxSJPWH-68diJShwzvW0Sqm",
+        "y" : "AA4LzXGEhO2fTaTXepf2taQv-CwPJdMkGrCyod4kGb7gRUXqFZ2OVk7Du5EmfOxJK_ub_Kuo_aTogFH8r8mKP1M2"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040070780ea3c2e73b2400f44f48a393b6c9019cfa788aa5e3d272ecbec9dc0dbcb35187d9575e1f5f15baf22f502e3ca9287c5224f587fbaf1d8894a1c33bd6d12aa6000e0bcd718484ed9f4da4d77a97f6b5a42ff82c0f25d3241ab0b2a1de2419bee04545ea159d8e564ec3bb91267cec492bfb9bfcaba8fda4e88051fcafc98a3f5336",
+        "wx" : "70780ea3c2e73b2400f44f48a393b6c9019cfa788aa5e3d272ecbec9dc0dbcb35187d9575e1f5f15baf22f502e3ca9287c5224f587fbaf1d8894a1c33bd6d12aa6",
+        "wy" : "0e0bcd718484ed9f4da4d77a97f6b5a42ff82c0f25d3241ab0b2a1de2419bee04545ea159d8e564ec3bb91267cec492bfb9bfcaba8fda4e88051fcafc98a3f5336"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040070780ea3c2e73b2400f44f48a393b6c9019cfa788aa5e3d272ecbec9dc0dbcb35187d9575e1f5f15baf22f502e3ca9287c5224f587fbaf1d8894a1c33bd6d12aa6000e0bcd718484ed9f4da4d77a97f6b5a42ff82c0f25d3241ab0b2a1de2419bee04545ea159d8e564ec3bb91267cec492bfb9bfcaba8fda4e88051fcafc98a3f5336",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAcHgOo8LnOyQA9E9Io5O2yQGc+niK\npePScuy+ydwNvLNRh9lXXh9fFbryL1AuPKkofFIk9Yf7rx2IlKHDO9bRKqYADgvN\ncYSE7Z9NpNd6l/a1pC/4LA8l0yQasLKh3iQZvuBFReoVnY5WTsO7kSZ87Ekr+5v8\nq6j9pOiAUfyvyYo/UzY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 259,
+          "comment" : "extreme value for k and s^-1",
+          "msg" : "54657374",
+          "sig" : "00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd6601b6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db6db68d82a2b033628ca12ffd36ed0d3bf206957c063c2bf183d7132f20aac7c797a51",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AfmI6SeR8U3b_zXqsd3dNvMWe1FOlccN_m5hanegBkch-K74cdTEglJOVkf_ICBPpNr66qgN07fZkAflkq5bWJkW",
+        "y" : "ADqSmbpd-1mRyU6ID_bGFJWM7uVeLOWyLAv7DrQ3WbSEjOAHSC50Ia71yNoAC6IkrLTbv3NJjXNwXAa2fyZ-WooQ"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401f988e92791f14ddbff35eab1dddd36f3167b514e95c70dfe6e616a77a0064721f8aef871d4c482524e5647ff20204fa4dafaeaa80dd3b7d99007e592ae5b589916003a9299ba5dfb5991c94e880ff6c614958ceee55e2ce5b22c0bfb0eb43759b4848ce007482e7421aef5c8da000ba224acb4dbbf73498d73705c06b67f267e5a8a10",
+        "wx" : "1f988e92791f14ddbff35eab1dddd36f3167b514e95c70dfe6e616a77a0064721f8aef871d4c482524e5647ff20204fa4dafaeaa80dd3b7d99007e592ae5b589916",
+        "wy" : "3a9299ba5dfb5991c94e880ff6c614958ceee55e2ce5b22c0bfb0eb43759b4848ce007482e7421aef5c8da000ba224acb4dbbf73498d73705c06b67f267e5a8a10"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401f988e92791f14ddbff35eab1dddd36f3167b514e95c70dfe6e616a77a0064721f8aef871d4c482524e5647ff20204fa4dafaeaa80dd3b7d99007e592ae5b589916003a9299ba5dfb5991c94e880ff6c614958ceee55e2ce5b22c0bfb0eb43759b4848ce007482e7421aef5c8da000ba224acb4dbbf73498d73705c06b67f267e5a8a10",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB+YjpJ5HxTdv/Neqx3d028xZ7UU6V\nxw3+bmFqd6AGRyH4rvhx1MSCUk5WR/8gIE+k2vrqqA3Tt9mQB+WSrltYmRYAOpKZ\nul37WZHJTogP9sYUlYzu5V4s5bIsC/sOtDdZtISM4AdILnQhrvXI2gALoiSstNu/\nc0mNc3BcBrZ/Jn5aihA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 260,
+          "comment" : "extreme value for k",
+          "msg" : "54657374",
+          "sig" : "00c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66000eb10e5ab95f2f26a40700b1300fb8c3c8d5384ffbecf1fdb9e11e67cb7fd6a7f503e6e25ac09bb88b6c3983df764d4d72bc2920e233f0f7974a234a21b00bb447",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AMaFjga3BATpzZ4-y2YjlbRCnGSBOQU_tSH4KK9ga009uqFLXnfv51ko_h3BJ6L_qN4zSLPBhWpCm_l-fjHC5b1m",
+        "y" : "ARg5KWp4mjvABFyKX7QsfRvZmPVESVebRGgXr70XJz5mLJfucple9CZAxVC5AT-tB2E1PHCGonLCQIi-lHaf0WZQ"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650",
+        "wx" : "0c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66",
+        "wy" : "11839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAxoWOBrcEBOnNnj7LZiOVtEKcZIE5\nBT+1Ifgor2BrTT26oUted+/nWSj+HcEnov+o3jNIs8GFakKb+X5+McLlvWYBGDkp\naniaO8AEXIpftCx9G9mY9URJV5tEaBevvRcnPmYsl+5ymV70JkDFULkBP60HYTU8\ncIaicsJAiL6Udp/RZlA=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 261,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "0000c6ee9e33cf5c6715a1d148fd73f7318884b41adcb916021e2bc0e800a5c5dd97f5142178f6ae88c8fdd98e1afb0ce4c8d2c54b5f37b30b7da1997bb33b0b8a3100492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 262,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "01ff391161cc30a398ea5e2eb7028c08ce777b4be52346e9fde1d43f17ff5a3a22625c72660ac8810da281f2732dfbfcc10768f07e5951e93c3119d63b6b562cd9d800492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AMaFjga3BATpzZ4-y2YjlbRCnGSBOQU_tSH4KK9ga009uqFLXnfv51ko_h3BJ6L_qN4zSLPBhWpCm_l-fjHC5b1m",
+        "y" : "AOfG1pWHZcQ_-6N1oEvTguQmZwq7tqhku5foUELo2MGZ02gRjWahC9m_Oq9G_sBS-J7Kw495XY09v3dBa4lgLpmv"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd6600e7c6d6958765c43ffba375a04bd382e426670abbb6a864bb97e85042e8d8c199d368118d66a10bd9bf3aaf46fec052f89ecac38f795d8d3dbf77416b89602e99af",
+        "wx" : "0c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66",
+        "wy" : "0e7c6d6958765c43ffba375a04bd382e426670abbb6a864bb97e85042e8d8c199d368118d66a10bd9bf3aaf46fec052f89ecac38f795d8d3dbf77416b89602e99af"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd6600e7c6d6958765c43ffba375a04bd382e426670abbb6a864bb97e85042e8d8c199d368118d66a10bd9bf3aaf46fec052f89ecac38f795d8d3dbf77416b89602e99af",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAxoWOBrcEBOnNnj7LZiOVtEKcZIE5\nBT+1Ifgor2BrTT26oUted+/nWSj+HcEnov+o3jNIs8GFakKb+X5+McLlvWYA58bW\nlYdlxD/7o3WgS9OC5CZnCru2qGS7l+hQQujYwZnTaBGNZqEL2b86r0b+wFL4nsrD\nj3ldjT2/d0FriWAuma8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 263,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "0000c6ee9e33cf5c6715a1d148fd73f7318884b41adcb916021e2bc0e800a5c5dd97f5142178f6ae88c8fdd98e1afb0ce4c8d2c54b5f37b30b7da1997bb33b0b8a3100492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 264,
+          "comment" : "testing point duplication",
+          "msg" : "54657374",
+          "sig" : "01ff391161cc30a398ea5e2eb7028c08ce777b4be52346e9fde1d43f17ff5a3a22625c72660ac8810da281f2732dfbfcc10768f07e5951e93c3119d63b6b562cd9d800492492492492492492492492492492492492492492492492492492492492492491795c5c808906cc587ff89278234a8566e3f565f5ca840a3d887dac7214bee9b8",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "BKrsc2NXJvIT-4qeZNo7hjLkFJWpRNAEW1IuunJA-tU",
+        "y" : "h9kxV5iqo6W6AXdXh87QXqr3tOCfyB1tGqVG6DZdUl0"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d",
+        "wx" : "4aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad5",
+        "wy" : "087d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000404aaec73635726f213fb8a9e64da3b8632e41495a944d0045b522eba7240fad587d9315798aaa3a5ba01775787ced05eaaf7b4e09fc81d6d1aa546e8365d525d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEBKrsc2NXJvIT+4qeZNo7hjLkFJWp\nRNAEW1IuunJA+tWH2TFXmKqjpboBd1eHztBeqve04J/IHW0apUboNl1SXQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 265,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "a8ea150cb80125d7381c4c1f1da8e9de2711f9917060406a73d7904519e51388f3ab9fa68bd47973a73b2d40480c2ba50c22c9d76ec217257288293285449b86",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 266,
+          "comment" : "pseudorandom signature",
+          "msg" : "54657374",
+          "sig" : "30e782f964b2e2ff065a051bc7adc20615d8c43a1365713c88268822c253bcce5b16df652aa1ecb2dc8b46c515f9604e2e84cacfa7c6eec30428d2d3f4e08ed5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 267,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "b292a619339f6e567a305c951c0dcbcc42d16e47f219f9e98e76e09d8770b34a0177e60492c5a8242f76f07bfe3661bde59ec2a17ce5bd2dab2abebdf89a62e2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 268,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "986e65933ef2ed4ee5aada139f52b70539aaf63f00a91f29c69178490d57fb713dafedfb8da6189d372308cbf1489bbbdabf0c0217d1c0ff0f701aaa7a694b9c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-384",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "Kb23bV-nQb_XAjPLOmbMfUS-s7BmPZKoE2ZQR4vO-2HvGC4VWlQ0Wl6OXojwZOW8",
+        "y" : "mlJat_dk2tPa4UaMK0GfO2K5upF9XoxPsexHQEo_x2R0snEwgb6dtMAOBDran8Sj"
+      },
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0429bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc9a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3",
+        "wx" : "29bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc",
+        "wy" : "09a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b810400220362000429bdb76d5fa741bfd70233cb3a66cc7d44beb3b0663d92a8136650478bcefb61ef182e155a54345a5e8e5e88f064e5bc9a525ab7f764dad3dae1468c2b419f3b62b9ba917d5e8c4fb1ec47404a3fc76474b2713081be9db4c00e043ada9fc4a3",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEKb23bV+nQb/XAjPLOmbMfUS+s7BmPZKo\nE2ZQR4vO+2HvGC4VWlQ0Wl6OXojwZOW8mlJat/dk2tPa4UaMK0GfO2K5upF9XoxP\nsexHQEo/x2R0snEwgb6dtMAOBDran8Sj\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 269,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "234503fcca578121986d96be07fbc8da5d894ed8588c6dbcdbe974b4b813b21c52d20a8928f2e2fdac14705b0705498ccd7b9b766b97b53d1a80fc0b760af16a11bf4a59c7c367c6c7275dfb6e18a88091eed3734bf5cf41b3dc6fecd6d3baaf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 270,
+          "comment" : "pseudorandom signature",
+          "msg" : "54657374",
+          "sig" : "99c8ee5310653f6bb6f540146edc015cce3c115bf3088be1f4205930b08184be8868d8b8320f0ecc60f3b1bccd410b32ca49b9f4fda715d522bd0ec9b767ef6d7d0b340d3aa9fcac675874bb3dabc7b8e0c33923860b94cb00115b10ac5056f1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 271,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "32401249714e9091f05a5e109d5c1216fdc05e98614261aa0dbd9e9cd4415dee29238afbd3b103c1e40ee5c9144aee0f4326756fb2c4fd726360dd6479b5849478c7a9d054a833a58c1631c33b63c3441336ddf2c7fe0ed129aae6d4ddfeb753",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 272,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "5cad9ae1565f2588f86d821c2cc1b4d0fdf874331326568f5b0e130e4e0c0ec497f8f5f564212bd2a26ecb782cf0a18dbf2e9d0980fbb00696673e7fbb03e1f854b9d7596b759a17bf6e6e67a95ea6c1664f82dc449ae5ea779abd99c78e6840",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "ASqQi_xbcOF73650KUmUgIvypC2rWa-LBSOgJtZAoqPW00RSC2IXfiz6M5ykL7CIPsQlkE-9ooM6O1sKmgCBE2XY",
+        "y" : "ASMz1TL4-OsaYjw3ijaUZRGSu9qDPjuNe4-Qsr_JsEX4pV4bal_hUSxADEvJyG_XxpnWQvXO6buCfIsKvA2gHO8e"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04012a908bfc5b70e17bdfae74294994808bf2a42dab59af8b0523a026d640a2a3d6d344520b62177e2cfa339ca42fb0883ec425904fbda2833a3b5b0a9a00811365d8012333d532f8f8eb1a623c378a3694651192bbda833e3b8d7b8f90b2bfc9b045f8a55e1b6a5fe1512c400c4bc9c86fd7c699d642f5cee9bb827c8b0abc0da01cef1e",
+        "wx" : "12a908bfc5b70e17bdfae74294994808bf2a42dab59af8b0523a026d640a2a3d6d344520b62177e2cfa339ca42fb0883ec425904fbda2833a3b5b0a9a00811365d8",
+        "wy" : "12333d532f8f8eb1a623c378a3694651192bbda833e3b8d7b8f90b2bfc9b045f8a55e1b6a5fe1512c400c4bc9c86fd7c699d642f5cee9bb827c8b0abc0da01cef1e"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004012a908bfc5b70e17bdfae74294994808bf2a42dab59af8b0523a026d640a2a3d6d344520b62177e2cfa339ca42fb0883ec425904fbda2833a3b5b0a9a00811365d8012333d532f8f8eb1a623c378a3694651192bbda833e3b8d7b8f90b2bfc9b045f8a55e1b6a5fe1512c400c4bc9c86fd7c699d642f5cee9bb827c8b0abc0da01cef1e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBKpCL/Ftw4XvfrnQpSZSAi/KkLatZ\nr4sFI6Am1kCio9bTRFILYhd+LPoznKQvsIg+xCWQT72igzo7WwqaAIETZdgBIzPV\nMvj46xpiPDeKNpRlEZK72oM+O417j5Cyv8mwRfilXhtqX+FRLEAMS8nIb9fGmdZC\n9c7pu4J8iwq8DaAc7x4=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 273,
+          "comment" : "pseudorandom signature",
+          "msg" : "313233343030",
+          "sig" : "014141e4d94a58c1e747cbd9ee6670a41eac3c26fb4db3248e45d583179076e6b19a8e2003657a108f91f9a103157edff9b37df2b436a77dc112927d907ac9ba25870108afa91b34bd904c680471e943af336fb90c5fb2b91401a58c9b1f467bf81af8049965dd8b45f12e152f4f7fd3780e3492f31ed2680d4777fbe655fe779ad897ab",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 274,
+          "comment" : "pseudorandom signature",
+          "msg" : "54657374",
+          "sig" : "01b257e46f4a9fcba03012fbeea4cd3bb2e20fd7dd4e1ced708405330a87597407a5870861e71c3a157c021eb4beb9881fce9c3f458f3cd9dbd94e422cf07a75012e01b55f01bd17e5a6ad7d28bfbf7560de548f96ca52683d12ec6ba347e6f3c1c4c3b6463c73bd2639014de5db1443f181d620d42e6f69b560f37732af83a6a2ef2119",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 275,
+          "comment" : "pseudorandom signature",
+          "msg" : "",
+          "sig" : "01625d6115092a8e2ee21b9f8a425aa73814dec8b2335e86150ab4229f5a3421d2e6256d632c7a4365a1ee01dd2a936921bbb4551a512d1d4b5a56c314e4a02534c501b792d23f2649862595451055777bda1b02dc6cc8fef23231e44b921b16155cd42257441d75a790371e91819f0a9b1fd0ebd02c90b5b774527746ed9bfe743dbe2f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 276,
+          "comment" : "pseudorandom signature",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "0008135d3f1ae9e26fba825643ed8a29d63d7843720e93566aa09db2bdf5aaa69afbcc0c51e5295c298f305ba7b870f0a85bb5699cdf40764aab59418f77c6ffb452011d345256887fb351f5700961a7d47572e0d669056cb1d5619345c0c987f3331c2fe2c6df848a5c610422defd6212b64346161aa871ae55b1fe4add5f68836eb181",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-384",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "WZMmTuF93yCa7DH-CjwVO1oqhF1P5n-8IYqxOX1C3wfJyYsamNKh15IBTfx3_pm9",
+        "y" : "K4Oxh4XrTry-jRbs0U-PYlAVsmh68tE9aHLlKwVcles0gXqfGPvo_vI1gYUVJCVl"
+      },
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "045993264ee17ddf209aec31fe0a3c153b5a2a845d4fe67fbc218ab1397d42df07c9c98b1a98d2a1d792014dfc77fe99bd2b83b18785eb4ebcbe8d16ecd14f8f625015b2687af2d13d6872e52b055c95eb34817a9f18fbe8fef235818515242565",
+        "wx" : "5993264ee17ddf209aec31fe0a3c153b5a2a845d4fe67fbc218ab1397d42df07c9c98b1a98d2a1d792014dfc77fe99bd",
+        "wy" : "2b83b18785eb4ebcbe8d16ecd14f8f625015b2687af2d13d6872e52b055c95eb34817a9f18fbe8fef235818515242565"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200045993264ee17ddf209aec31fe0a3c153b5a2a845d4fe67fbc218ab1397d42df07c9c98b1a98d2a1d792014dfc77fe99bd2b83b18785eb4ebcbe8d16ecd14f8f625015b2687af2d13d6872e52b055c95eb34817a9f18fbe8fef235818515242565",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEWZMmTuF93yCa7DH+CjwVO1oqhF1P5n+8\nIYqxOX1C3wfJyYsamNKh15IBTfx3/pm9K4Oxh4XrTry+jRbs0U+PYlAVsmh68tE9\naHLlKwVcles0gXqfGPvo/vI1gYUVJCVl\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 277,
+          "comment" : "Hash weaker than DL-group",
+          "msg" : "48656c6c6f",
+          "sig" : "21d14f225510a10f42f00ed55c0771085d5ee22bc24266c0333f031970879d34abed5d5701e0b86f8e14dd78fee243368c636109e157498a57e4b449bdbbb1b22ebd621564b4dae8776e2616045eb18bb6cb8e542a052e50368875a72af2e533",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AY8NKnQuGMuFWjR3iGRhoVraVTMQD0iNw5rtiWxepi-gKcW4BFS06rrr8pF9dixQU9uhJrOaB4wPALL5NqCRhNv-",
+        "y" : "AFA8xMygEL3Sqo2F9WJdUW8-QdBoz9TqQT7EqXUQYnkgwBl-7yrSI4PFfy6TpdUlUh_YY1VQ-13Zjjtsc1krJKgx"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04018f0d2a742e18cb855a3477886461a15ada5533100f488dc39aed896c5ea62fa029c5b80454b4eabaebf2917d762c5053dba126b39a078c0f00b2f936a09184dbfe00503cc4cca010bdd2aa8d85f5625d516f3e41d068cfd4ea413ec4a97510627920c0197eef2ad22383c57f2e93a5d525521fd8635550fb5dd98e3b6c73592b24a831",
+        "wx" : "18f0d2a742e18cb855a3477886461a15ada5533100f488dc39aed896c5ea62fa029c5b80454b4eabaebf2917d762c5053dba126b39a078c0f00b2f936a09184dbfe",
+        "wy" : "503cc4cca010bdd2aa8d85f5625d516f3e41d068cfd4ea413ec4a97510627920c0197eef2ad22383c57f2e93a5d525521fd8635550fb5dd98e3b6c73592b24a831"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004018f0d2a742e18cb855a3477886461a15ada5533100f488dc39aed896c5ea62fa029c5b80454b4eabaebf2917d762c5053dba126b39a078c0f00b2f936a09184dbfe00503cc4cca010bdd2aa8d85f5625d516f3e41d068cfd4ea413ec4a97510627920c0197eef2ad22383c57f2e93a5d525521fd8635550fb5dd98e3b6c73592b24a831",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBjw0qdC4Yy4VaNHeIZGGhWtpVMxAP\nSI3Dmu2JbF6mL6ApxbgEVLTquuvykX12LFBT26Ems5oHjA8Asvk2oJGE2/4AUDzE\nzKAQvdKqjYX1Yl1Rbz5B0GjP1OpBPsSpdRBieSDAGX7vKtIjg8V/LpOl1SVSH9hj\nVVD7XdmOO2xzWSskqDE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 278,
+          "comment" : "Hash weaker than DL-group",
+          "msg" : "48656c6c6f",
+          "sig" : "00702ca9f25a0aa83c037695d8984eae6f52c1599d52903228fb72d41c0732103f3382f6239715153f4f4e97853273637b38ecdc104e4df0aecfa3b61f2fca31e6ea0006aa60c2abf93d5a12acbb06bf5b8a8d255cca4781f12f2bc4b5c9aea7e0b0de1b432106184a4273f242ad56cf09dda487305340b1f36c57ba4d38549032b0116f",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AY8NKnQuGMuFWjR3iGRhoVraVTMQD0iNw5rtiWxepi-gKcW4BFS06rrr8pF9dixQU9uhJrOaB4wPALL5NqCRhNv-",
+        "y" : "AFA8xMygEL3Sqo2F9WJdUW8-QdBoz9TqQT7EqXUQYnkgwBl-7yrSI4PFfy6TpdUlUh_YY1VQ-13Zjjtsc1krJKgx"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04018f0d2a742e18cb855a3477886461a15ada5533100f488dc39aed896c5ea62fa029c5b80454b4eabaebf2917d762c5053dba126b39a078c0f00b2f936a09184dbfe00503cc4cca010bdd2aa8d85f5625d516f3e41d068cfd4ea413ec4a97510627920c0197eef2ad22383c57f2e93a5d525521fd8635550fb5dd98e3b6c73592b24a831",
+        "wx" : "18f0d2a742e18cb855a3477886461a15ada5533100f488dc39aed896c5ea62fa029c5b80454b4eabaebf2917d762c5053dba126b39a078c0f00b2f936a09184dbfe",
+        "wy" : "503cc4cca010bdd2aa8d85f5625d516f3e41d068cfd4ea413ec4a97510627920c0197eef2ad22383c57f2e93a5d525521fd8635550fb5dd98e3b6c73592b24a831"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b810400230381860004018f0d2a742e18cb855a3477886461a15ada5533100f488dc39aed896c5ea62fa029c5b80454b4eabaebf2917d762c5053dba126b39a078c0f00b2f936a09184dbfe00503cc4cca010bdd2aa8d85f5625d516f3e41d068cfd4ea413ec4a97510627920c0197eef2ad22383c57f2e93a5d525521fd8635550fb5dd98e3b6c73592b24a831",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBjw0qdC4Yy4VaNHeIZGGhWtpVMxAP\nSI3Dmu2JbF6mL6ApxbgEVLTquuvykX12LFBT26Ems5oHjA8Asvk2oJGE2/4AUDzE\nzKAQvdKqjYX1Yl1Rbz5B0GjP1OpBPsSpdRBieSDAGX7vKtIjg8V/LpOl1SVSH9hj\nVVD7XdmOO2xzWSskqDE=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 279,
+          "comment" : "Hash weaker than DL-group",
+          "msg" : "48656c6c6f",
+          "sig" : "00b89446cf77a372c0a789b207d40d849f19f1aef4aca874d62d419b58068d01accb4ee6ee67f27aac7ad742e092ed821c9fbb83d25374cde027afdb9cec4d8c0d65015d28102ca7c546fab988afbd7286c412a4bcb0e1913efbe03fa08d4097092800bed17c48b7cd21ce9777d18ab421e11ba27823d9f811d25004f8f2839467663fd6",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "TzN8z9Z3JqgF5PFgCuKEnfOAfsoRc4Ajn72BaQAAAAA",
+        "y" : "7Z3qEkzIw5ZBZBHpiMMPQn61BK9DoxRs1d9-pgZm1oU"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685",
+        "wx" : "4f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000",
+        "wy" : "0ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200044f337ccfd67726a805e4f1600ae2849df3807eca117380239fbd816900000000ed9dea124cc8c396416411e988c30f427eb504af43a3146cd5df7ea60666d685",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETzN8z9Z3JqgF5PFgCuKEnfOAfsoR\nc4Ajn72BaQAAAADtneoSTMjDlkFkEemIww9CfrUEr0OjFGzV336mBmbWhQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 280,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "d434e262a49eab7781e353a3565e482550dd0fd5defa013c7f29745eff3569f19b0c0a93f267fb6052fd8077be769c2b98953195d7bc10de844218305c6ba17a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 281,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "0fe774355c04d060f76d79fd7a772e421463489221bf0a33add0be9b1979110b500dcba1c69a8fbd43fa4f57f743ce124ca8b91a1f325f3fac6181175df55737",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 282,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "bb40bf217bed3fb3950c7d39f03d36dc8e3b2cd79693f125bfd06595ee1135e3541bf3532351ebb032710bdb6a1bf1bfc89a1e291ac692b3fa4780745bb55677",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "PPA9YU2JOc_UmaB4c_rCgWGPBrj_h-gBXD9JcmUASTU",
+        "y" : "hPoXTXkccr8s44gKiWDdKnx6EzioL4Wp5Zzb3oAAAAA"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000",
+        "wx" : "3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935",
+        "wy" : "084fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f49726500493584fa174d791c72bf2ce3880a8960dd2a7c7a1338a82f85a9e59cdbde80000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPPA9YU2JOc/UmaB4c/rCgWGPBrj/\nh+gBXD9JcmUASTWE+hdNeRxyvyzjiAqJYN0qfHoTOKgvhanlnNvegAAAAA==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 283,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "664eb7ee6db84a34df3c86ea31389a5405badd5ca99231ff556d3e75a233e73a59f3c752e52eca46137642490a51560ce0badc678754b8f72e51a2901426a1bd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 284,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "4cd0429bbabd2827009d6fcd843d4ce39c3e42e2d1631fd001985a79d1fd8b439638bf12dd682f60be7ef1d0e0d98f08b7bca77a1a2b869ae466189d2acdabe3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 285,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "e56c6ea2d1b017091c44d8b6cb62b9f460e3ce9aed5e5fd41e8added97c56c04a308ec31f281e955be20b457e463440b4fcf2b80258078207fc1378180f89b55",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "PPA9YU2JOc_UmaB4c_rCgWGPBrj_h-gBXD9JcmUASTU",
+        "y" : "ewXosYbjjUHTHHf1dp8i1YOF7MhX0HpWGmMkIX____8"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff",
+        "wx" : "3cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f497265004935",
+        "wy" : "7b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200043cf03d614d8939cfd499a07873fac281618f06b8ff87e8015c3f4972650049357b05e8b186e38d41d31c77f5769f22d58385ecc857d07a561a6324217fffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPPA9YU2JOc/UmaB4c/rCgWGPBrj/\nh+gBXD9JcmUASTV7BeixhuONQdMcd/V2nyLVg4XsyFfQelYaYyQhf////w==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 286,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "1158a08d291500b4cabed3346d891eee57c176356a2624fb011f8fbbf3466830228a8c486a736006e082325b85290c5bc91f378b75d487dda46798c18f285519",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 287,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "b1db9289649f59410ea36b0c0fc8d6aa2687b29176939dd23e0dde56d309fa9d3e1535e4280559015b0dbd987366dcf43a6d1af5c23c7d584e1c3f48a1251336",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 288,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "b7b16e762286cb96446aa8d4e6e7578b0a341a79f2dd1a220ac6f0ca4e24ed86ddc60a700a139b04661c547d07bbb0721780146df799ccf55e55234ecb8f12bc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "KCnDH6ouQA40TtlLyj_NBUWVbrz-itD236X_jv____8",
+        "y" : "oBqvrwAOUlhYVa-nZ2reKEETCZBS31fn6zvTfr65Ii4"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e",
+        "wx" : "2829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffff",
+        "wy" : "0a01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d030107034200042829c31faa2e400e344ed94bca3fcd0545956ebcfe8ad0f6dfa5ff8effffffffa01aafaf000e52585855afa7676ade284113099052df57e7eb3bd37ebeb9222e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEKCnDH6ouQA40TtlLyj/NBUWVbrz+\nitD236X/jv////+gGq+vAA5SWFhVr6dnat4oQRMJkFLfV+frO9N+vrkiLg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 289,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "d82a7c2717261187c8e00d8df963ff35d796edad36bc6e6bd1c91c670d9105b43dcabddaf8fcaa61f4603e7cbac0f3c0351ecd5988efb23f680d07debd139929",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 290,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "5eb9c8845de68eb13d5befe719f462d77787802baff30ce96a5cba063254af782c026ae9be2e2a5e7ca0ff9bbd92fb6e44972186228ee9a62b87ddbe2ef66fb5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 291,
+          "comment" : "x-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "96843dd03c22abd2f3b782b170239f90f277921becc117d0404a8e4e36230c28f2be378f526f74a543f67165976de9ed9a31214eb4d7e6db19e1ede123dd991d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "____-UgIHmoEWN2PnnOPJmX_kFmtaqwHCDGMTKmnpPU",
+        "y" : "Woq8ui3ahHQxHuVBSblzyuDA-4lVetC_eOZSmhZjvXM"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73",
+        "wx" : "0fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f5",
+        "wy" : "5a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004fffffff948081e6a0458dd8f9e738f2665ff9059ad6aac0708318c4ca9a7a4f55a8abcba2dda8474311ee54149b973cae0c0fb89557ad0bf78e6529a1663bd73",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE////+UgIHmoEWN2PnnOPJmX/kFmt\naqwHCDGMTKmnpPVairy6LdqEdDEe5UFJuXPK4MD7iVV60L945lKaFmO9cw==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 292,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "766456dce1857c906f9996af729339464d27e9d98edc2d0e3b760297067421f6402385ecadae0d8081dccaf5d19037ec4e55376eced699e93646bfbbf19d0b41",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 293,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "c605c4b2edeab20419e6518a11b2dbc2b97ed8b07cced0b19c34f777de7b9fd9edf0f612c5f46e03c719647bc8af1b29b2cde2eda700fb1cff5e159d47326dba",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 294,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "d48b68e6cabfe03cf6141c9ac54141f210e64485d9929ad7b732bfe3b7eb8a84feedae50c61bd00e19dc26f9b7e2265e4508c389109ad2f208f0772315b6c941",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AAAAA_oV-WOUnV8DpvXH-G-eABXusjrrv_EXOTe6dI4",
+        "y" : "EJmHIHDo6HxVX6E2Wcyl1_rc_LACPqiJVIykivK6fnE"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71",
+        "wx" : "3fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e",
+        "wy" : "1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d0301070342000400000003fa15f963949d5f03a6f5c7f86f9e0015eeb23aebbff1173937ba748e1099872070e8e87c555fa13659cca5d7fadcfcb0023ea889548ca48af2ba7e71",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAAAAA/oV+WOUnV8DpvXH+G+eABXu\nsjrrv/EXOTe6dI4QmYcgcOjofFVfoTZZzKXX+tz8sAI+qIlUjKSK8rp+cQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 295,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "b7c81457d4aeb6aa65957098569f0479710ad7f6595d5874c35a93d12a5dd4c7b7961a0b652878c2d568069a432ca18a1a9199f2ca574dad4b9e3a05c0a1cdb3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 296,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "6b01332ddb6edfa9a30a1321d5858e1ee3cf97e263e669f8de5e9652e76ff3f75939545fced457309a6a04ace2bd0f70139c8f7d86b02cb1cc58f9e69e96cd5a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 297,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "efdb884720eaeadc349f9fc356b6c0344101cd2fd8436b7d0e6a4fb93f106361f24bee6ad5dc05f7613975473aadf3aacba9e77de7d69b6ce48cb60d8113385d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "vLspFMefBF6qbsu8YSgWs75dLWeWcH2BJen4UcGK8BU",
+        "y" : "AAAAABNSu0oPoupMzrmrY91oSt5aESe88wCmmKcZO8I"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2",
+        "wx" : "0bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015",
+        "wy" : "1352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015000000001352bb4a0fa2ea4cceb9ab63dd684ade5a1127bcf300a698a7193bc2",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvLspFMefBF6qbsu8YSgWs75dLWeW\ncH2BJen4UcGK8BUAAAAAE1K7Sg+i6kzOuatj3WhK3loRJ7zzAKaYpxk7wg==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 298,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "31230428405560dcb88fb5a646836aea9b23a23dd973dcbe8014c87b8b20eb070f9344d6e812ce166646747694a41b0aaf97374e19f3c5fb8bd7ae3d9bd0beff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 299,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "caa797da65b320ab0d5c470cda0b36b294359c7db9841d679174db34c4855743cf543a62f23e212745391aaf7505f345123d2685ee3b941d3de6d9b36242e5a0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 300,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "7e5f0ab5d900d3d3d7867657e5d6d36519bc54084536e7d21c336ed8001859459450c07f201faec94b82dfb322e5ac676688294aad35aa72e727ff0b19b646aa",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-256",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "vLspFMefBF6qbsu8YSgWs75dLWeWcH2BJen4UcGK8BU",
+        "y" : "_____uytRLbwXRWzMUZUnCKXtSKl7thDDP9ZZ1jmxD0"
+      },
+      "key" : {
+        "curve" : "secp256r1",
+        "keySize" : 256,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d",
+        "wx" : "0bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015",
+        "wy" : "0fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d"
+      },
+      "keyDer" : "3059301306072a8648ce3d020106082a8648ce3d03010703420004bcbb2914c79f045eaa6ecbbc612816b3be5d2d6796707d8125e9f851c18af015fffffffeecad44b6f05d15b33146549c2297b522a5eed8430cff596758e6c43d",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvLspFMefBF6qbsu8YSgWs75dLWeW\ncH2BJen4UcGK8BX////+7K1EtvBdFbMxRlScIpe1IqXu2EMM/1lnWObEPQ==\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-256",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 301,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "d7d70c581ae9e3f66dc6a480bf037ae23f8a1e4a2136fe4b03aa69f0ca25b35689c460f8a5a5c2bbba962c8a3ee833a413e85658e62a59e2af41d9127cc47224",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 302,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "341c1b9ff3c83dd5e0dfa0bf68bcdf4bb7aa20c625975e5eeee34bb396266b3472b69f061b750fd5121b22b11366fad549c634e77765a017902a67099e0a4469",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 303,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "70bebe684cdcb5ca72a42f0d873879359bd1781a591809947628d313a3814f67aec03aca8f5587a4d535fa31027bbe9cc0e464b1c3577f4c2dcde6b2094798a9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-384",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "_____6pj8aI5rHAZfG6_zqV1bcASEj-CxR-odNZgKL4A6XahCAYGc3zHXEC9_kqs",
+        "y" : "rL2FOJCIpipjmDhMIrUtSS8j9G5KJ6RyStVVUdpcSDQ4CVokfLDDN48fUsNCX_nx"
+      },
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aacacbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1",
+        "wx" : "0ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aac",
+        "wy" : "0acbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004ffffffffaa63f1a239ac70197c6ebfcea5756dc012123f82c51fa874d66028be00e976a1080606737cc75c40bdfe4aacacbd85389088a62a6398384c22b52d492f23f46e4a27a4724ad55551da5c483438095a247cb0c3378f1f52c3425ff9f1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE/////6pj8aI5rHAZfG6/zqV1bcASEj+C\nxR+odNZgKL4A6XahCAYGc3zHXEC9/kqsrL2FOJCIpipjmDhMIrUtSS8j9G5KJ6Ry\nStVVUdpcSDQ4CVokfLDDN48fUsNCX/nx\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 304,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "07648b6660d01ba2520a09d298adf3b1a02c32744bd2877208f5a4162f6c984373139d800a4cdc1ffea15bce4871a0ed99fd367012cb9e02cde2749455e0d495c52818f3c14f6e6aad105b0925e2a7290ac4a06d9fadf4b15b578556fe332a5f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 305,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "a049dcd96c72e4f36144a51bba30417b451a305dd01c9e30a5e04df94342617dc383f17727708e3277cd7246ca4407413970e264d85b228bf9e9b9c4947c5dd041ea8b5bde30b93aa59fedf2c428d3e2540a54e0530688acccb83ac7b29b79a2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 306,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "441800ea9377c27865be000ad008eb3d7502bdd105824b26d15cf3d06452969a9d0607a915a8fe989215fc4d61af6e05dce29faa5137f75ad77e03918c8ee6747cc7a39b0a69f8b915654cac4cf4bfd9c87cc46ae1631b5c6baebd4fc08ff8fd",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-384",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "0YJ_xvbxLyGZLFpAmgZTsSHS7wKysKsBqRYc6VYoB0Cx41ayVXAbCm3cnsLKipQi",
+        "y" : "xu1dLO2NirdWD6W7iMc450VBiD2KKxwOK6fjbQMPxNm_uLIvJNuJfrrEndQAAAAA"
+      },
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000",
+        "wx" : "0d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422",
+        "wy" : "0c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004d1827fc6f6f12f21992c5a409a0653b121d2ef02b2b0ab01a9161ce956280740b1e356b255701b0a6ddc9ec2ca8a9422c6ed5d2ced8d8ab7560fa5bb88c738e74541883d8a2b1c0e2ba7e36d030fc4d9bfb8b22f24db897ebac49dd400000000",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE0YJ/xvbxLyGZLFpAmgZTsSHS7wKysKsB\nqRYc6VYoB0Cx41ayVXAbCm3cnsLKipQixu1dLO2NirdWD6W7iMc450VBiD2KKxwO\nK6fjbQMPxNm/uLIvJNuJfrrEndQAAAAA\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 307,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "3244768016457c463b74f2097f216d9670b191f76281c74bc6a1a1971d19f209bf4696468f5eb75d6326a0a43c0a6529501e0ad985ed9f95697bd17fdbe3f9ca92e0f76426d3664e6896648d9c750bf588d0ce7d011c1a1e8d6c2e082422dc93",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 308,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "5e1af40f2480e3d97c4ae4bfd34a9f45269241356f3a46becd86a4a7c9716d73ca5aebdb3db1a7765650666683bc856b7e7c4b473a2baaa4953785be8aa2a10006f6d36b400ab981864d69cecec046718d0404b9647454b159aa5a92d76d7955",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 309,
+          "comment" : "y-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "6688e36a26f15bdc1c3f91367f8a7667f7bb3e30a335d6f0900e9534eb88b260cb29344c723fedfbe7ac9c5a33f4bf0daa35fddf0fdc9017860b378f801cd806f3e2d754cd2fd94eb7bb36a46ce828cef87e9ebbf447068e630b87fee385ad8f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-384",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "EJm7RRAPVfWoXMo94rO9XiUPT2-tZjGjFWwuUqM9fWFd0nn3n4tLr_fHE6wAAAAA",
+        "y" : "5sm3NqiSny7Xvgx1OlTLtIuEaeBBHq-TpKgkWboLaBu6j1-zg7SQbUkBozA-LxVX"
+      },
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "041099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557",
+        "wx" : "1099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000",
+        "wy" : "0e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b81040022036200041099bb45100f55f5a85cca3de2b3bd5e250f4f6fad6631a3156c2e52a33d7d615dd279f79f8b4baff7c713ac00000000e6c9b736a8929f2ed7be0c753a54cbb48b8469e0411eaf93a4a82459ba0b681bba8f5fb383b4906d4901a3303e2f1557",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEEJm7RRAPVfWoXMo94rO9XiUPT2+tZjGj\nFWwuUqM9fWFd0nn3n4tLr/fHE6wAAAAA5sm3NqiSny7Xvgx1OlTLtIuEaeBBHq+T\npKgkWboLaBu6j1+zg7SQbUkBozA+LxVX\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 310,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "d4a8f3b0b4d3a5769e3a0bbc644b35f1d509355ed1fe401e170f667b661f693b32598e8c143a817a958982845042bb4804cc07578bbd1981dbf6e8a97a354c98d41b8b6f6e8a2c2b1763c7c2a29d79e24f8476075c9aed9aec6c64dff50461ae",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 311,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "c286d1928e9c79fdd3bebdf22a1dbd37c8105e8ecf41e9e3777fe341b6b8d5a89b9d986827d6d1dbb381cd8239484a22201119ae305b9360aa9b5e5d1567e0674c09e4f025556ebf81b987466b0f421b8d31f72bbe95f3ce2aa9874a84edfd40",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 312,
+          "comment" : "x-coordinate of the public key has many trailing 0's",
+          "msg" : "4d657373616765",
+          "sig" : "d9c678550167f10c511e62acb4bd0a3f7f336bc090c94e6c6b02622439c348a2159c5f41f9b5aa4b470590d40dcd7cc21fd5eaee295abb4081cb626745f4ad279ceb44604062830b58e6c0465c562d41f02ba588fc0db1ebbe339cdc008d7a1b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-384",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AAAAACsInt11QWkBAUXyY_M0_BZ8wZ2ugiWXCuGcyMt-xzWT1qRlw3D1R4sOU51p",
+        "y" : "0ZUdWXtWpnNFrLJYCVgfB80Ot42VOKP4pl8wDmih63hQffdt5lDo-O5jpfDFaHyY"
+      },
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04000000002b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98",
+        "wx" : "2b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69",
+        "wy" : "0d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004000000002b089edd754169010145f263f334fc167cc19dae8225970ae19cc8cb7ec73593d6a465c370f5478b0e539d69d1951d597b56a67345acb25809581f07cd0eb78d9538a3f8a65f300e68a1eb78507df76de650e8f8ee63a5f0c5687c98",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEAAAAACsInt11QWkBAUXyY/M0/BZ8wZ2u\ngiWXCuGcyMt+xzWT1qRlw3D1R4sOU51p0ZUdWXtWpnNFrLJYCVgfB80Ot42VOKP4\npl8wDmih63hQffdt5lDo+O5jpfDFaHyY\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 313,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "20fee7c71b6cb0d1da3641ec6622c055a3b16a1f596c64b34da1b2d0b868b66a8f0a0d0db983b3dc7e53bb7295da81978141a931d3579aec1cac9887d2fff9c6f12d47a27e4aab8cf262a9d14a715bca0b2057cbc3f18b6fd3d1df76f7410f16",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 314,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "913eecc559b3cf7108a65d6cc3076bfdf36c6f94dcc6693d06690470f34a2e81564241e1de5f5f51421de30af467f10f649bd3717244e8ef3c6b0eda983f84dca5ea86d1bec15386b9c473ec43a8cd0ba558eee819f791d9ff9272b9afd59551",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 315,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "23855c46403a97b76cbb316ec3fe7e2c422b818387604bda8c3d91121b4f20179d9107c5f92dedc8b620d7db87fccccd50f57343ab148e50662320c4161e44543c35bc992011ea5b1680b94382cf224ea0ec5da511e102f566cb67201f30a2ee",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-384",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "-wG6rV8Lj3m5zRBNEqq5MQFGrdfWtMAi2HrmcRF4uU1hjKezrxOFSxxYiHnod7M2",
+        "y" : "AAAAACCLP1rTs5N6zJ1gbMXs7KtKcB917UKVfqTXhY0z9cJsauIKnMzaVplnANa0"
+      },
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b33600000000208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4",
+        "wx" : "0fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336",
+        "wy" : "208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b33600000000208b3f5ad3b3937acc9d606cc5ececab4a701f75ed42957ea4d7858d33f5c26c6ae20a9cccda56996700d6b4",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE+wG6rV8Lj3m5zRBNEqq5MQFGrdfWtMAi\n2HrmcRF4uU1hjKezrxOFSxxYiHnod7M2AAAAACCLP1rTs5N6zJ1gbMXs7KtKcB91\n7UKVfqTXhY0z9cJsauIKnMzaVplnANa0\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 316,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "d200958d491fcebde667cd736c9dba0961c70db2ecaf573c31dd7fa41ecca32b40b5896f9a0ddf272110e3d21e84593ac2ecf73943b9adce596bac14fce62495ae93825c5ff6f61c247d1d8afcba52082fc96f63a26e55bccfc3779f88cfd799",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 317,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "6ac17d71260c79f81a7566124738cb3ee5d0aa690e73a98ae9e766f1336691e500cad51ba1302366c09cc06b8f7049e032ca965d6d7012ec187c7cab9544334d66c2a7658ddefa67e4ad40429815518ecc87b1492ddd57333bd2300b4660a835",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 318,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "e19a4646f0ed8a271fe86ba533f8be4fd81bbf4674716f668efa89a40cac51eec2a6cfbd92327d25efe91ca4ff712bc54a86b2e8e12378e633dec2691e3b1eed4e932cc48b28e45fa3d464cc0e948c02cc9decf2bb43b25937fcf37e9ad86ef0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-384",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "-wG6rV8Lj3m5zRBNEqq5MQFGrdfWtMAi2HrmcRF4uU1hjKezrxOFSxxYiHnod7M2",
+        "y" : "_____990wKUsTGyFM2KfkzoTE1S1j-CKEr1qgVsoenHMCj2SlR31YzMlqWeY_ylL"
+      },
+      "key" : {
+        "curve" : "secp384r1",
+        "keySize" : 384,
+        "type" : "ECPublicKey",
+        "uncompressed" : "04fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b",
+        "wx" : "0fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336",
+        "wy" : "0ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b"
+      },
+      "keyDer" : "3076301006072a8648ce3d020106052b8104002203620004fb01baad5f0b8f79b9cd104d12aab9310146add7d6b4c022d87ae6711178b94d618ca7b3af13854b1c588879e877b336ffffffffdf74c0a52c4c6c8533629f933a131354b58fe08a12bd6a815b287a71cc0a3d92951df5633325a96798ff294b",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE+wG6rV8Lj3m5zRBNEqq5MQFGrdfWtMAi\n2HrmcRF4uU1hjKezrxOFSxxYiHnod7M2/////990wKUsTGyFM2KfkzoTE1S1j+CK\nEr1qgVsoenHMCj2SlR31YzMlqWeY/ylL\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-384",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 319,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "15aac6c0f435cb662d110db5cf686caee53c64fe2d6d600a83ebe505a0e6fc62dc5705160477c47528c8c903fa865b5d7f94ddc01a603f9bec5d10c9f2c89fb23b3ffab6b2b68d0f04336d499085e32d22bf3ab67a49a74c743f72473172b59f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 320,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "90b95a7d194b73498fba5afc95c1aea9be073162a9edc57c4d12f459f0a1730baf2f87d7d6624aea7b931ec53370fe47cbc1ef470e666010604c609384b872db7fa7b8a5a9f20fdefd656be2fcc75db53948102f7ab203ea1860a6a32af246a1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 321,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "dd4391ce7557cbd005e3d5d727cd264399dcc3c6501e4547505b6d57b40bbf0a7fac794dcc8d4233159dd0aa40d4e0b9a77fa1374fd60aa91600912200fc83c6aa447f8171ecea72ae322df32dccd68951dc5caf6c50380e400e45bf5c0e626b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "ADBLPQce0e8wI5G1Zq-MnRy3r-mqvBQaw5qzlnbGPkjBssZFHrRg5FK9Vz4ftfFbjl-cA_Y02NtolyhQZLPOm9mK",
+        "y" : "AAAAAACbmL_TM5jCz4YG_ArkaLbWF8yz5wSvO4UGZCp3XVtNqdACCTZKnwpK13y6xgSgFcl-a1oYhEpYmk8cfZYl"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a00000000009b98bfd33398c2cf8606fc0ae468b6d617ccb3e704af3b8506642a775d5b4da9d00209364a9f0a4ad77cbac604a015c97e6b5a18844a589a4f1c7d9625",
+        "wx" : "304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a",
+        "wy" : "09b98bfd33398c2cf8606fc0ae468b6d617ccb3e704af3b8506642a775d5b4da9d00209364a9f0a4ad77cbac604a015c97e6b5a18844a589a4f1c7d9625"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a00000000009b98bfd33398c2cf8606fc0ae468b6d617ccb3e704af3b8506642a775d5b4da9d00209364a9f0a4ad77cbac604a015c97e6b5a18844a589a4f1c7d9625",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAMEs9Bx7R7zAjkbVmr4ydHLev6aq8\nFBrDmrOWdsY+SMGyxkUetGDkUr1XPh+18VuOX5wD9jTY22iXKFBks86b2YoAAAAA\nAJuYv9MzmMLPhgb8CuRottYXzLPnBK87hQZkKnddW02p0AIJNkqfCkrXfLrGBKAV\nyX5rWhiESliaTxx9liU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 322,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "011c9684af6dc52728410473c63053b01c358d67e81f8a1324ad711c60481a4a86dd3e75de20ca55ce7a9a39b1f82fd5da4fadf26a5bb8edd467af8825efe47462180034c058aba6488d6943e11e0d1348429449ea17ac5edf8bcaf654106b98b2ddf346c537b8a9a3f9b3174b77637d220ef5318dbbc33d0aac0fe2ddeda17b23cb2de6",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 323,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "007c47a668625648cd8a31ac92174cf3d61041f7ad292588def6ed143b1ff9a288fd20cf36f58d4bfe4b2cd4a381d4da50c8eda5674f020449ae1d3dd77e44ed485e01058e86b327d284e35bab49fc7c335417573f310afa9e1a53566e0fae516e099007965030f6f46b077116353f26cb466d1cf3f35300d744d2d8f883c8a31b43c20d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 324,
+          "comment" : "y-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "01e4e9f3a7b800de63407b8703ac545226541c97a673566711f70e2b9ccb21a145ad4637825b023d1ea9f18e60897413711611a85c1179bff9c107368f1c1b61c24c01de948ee577c3d4e4122a52ecccac59abb6fa937dfb3e4b988cb243efe98740309452ba013112b225b3b1b1384d5f68796845199a2602a8d4505a331b07d101188e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "ADBLPQce0e8wI5G1Zq-MnRy3r-mqvBQaw5qzlnbGPkjBssZFHrRg5FK9Vz4ftfFbjl-cA_Y02NtolyhQZLPOm9mK",
+        "y" : "Af____9kZ0AszGc9MHn5A_Ubl0kp6DNMGPtQxHr5m9WIoqSyVi_99sm1YPW1KINFOftf6jaBlKXne7WnZbDjgmna"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a01ffffffff6467402ccc673d3079f903f51b974929e8334c18fb50c47af99bd588a2a4b2562ffdf6c9b560f5b528834539fb5fea368194a5e77bb5a765b0e38269da",
+        "wx" : "304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a",
+        "wy" : "1ffffffff6467402ccc673d3079f903f51b974929e8334c18fb50c47af99bd588a2a4b2562ffdf6c9b560f5b528834539fb5fea368194a5e77bb5a765b0e38269da"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400304b3d071ed1ef302391b566af8c9d1cb7afe9aabc141ac39ab39676c63e48c1b2c6451eb460e452bd573e1fb5f15b8e5f9c03f634d8db6897285064b3ce9bd98a01ffffffff6467402ccc673d3079f903f51b974929e8334c18fb50c47af99bd588a2a4b2562ffdf6c9b560f5b528834539fb5fea368194a5e77bb5a765b0e38269da",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAMEs9Bx7R7zAjkbVmr4ydHLev6aq8\nFBrDmrOWdsY+SMGyxkUetGDkUr1XPh+18VuOX5wD9jTY22iXKFBks86b2YoB////\n/2RnQCzMZz0wefkD9RuXSSnoM0wY+1DEevmb1YiipLJWL/32ybVg9bUog0U5+1/q\nNoGUped7tadlsOOCado=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 325,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "00b6cf64861a2b16e33976095dbf45a592c7c24228c4a1dd727f303d5eeb87e5388ad05c328f824c40abd3e6ce003fef5cd59dee0069ad6348ea6e57f90f6bdc0a8200228181c180366e5451dfef3593ce664804cb42d5a8d5046b816b3daf6602fafd9ac2dc24b8c93a10024480882558b6ad3d9e905923dcd0fd2a11964754a9b46b8f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 326,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "0093c8f766827d6dc15c810fa30433153a5e742859205ee8389fbf695c8840dc917440870acc5b160087ffd0cd9a6081029c60a7c26d5e8aa9a0570f4efdeb13dea2012ec3bbf75a0ad3df40310266648a36db820217ed7fa94e9c8313e03293ef4f6a40e736fb8f208ad8fb883ca509d48046910523645459c27829d54431463b2548c7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 327,
+          "comment" : "y-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "0152388c6da66164b706b41dd4dd48176d6eaf6525f876ef0ff2d147f6966ebfadf1767fa66d04203d3ec9c937a1f0c945aed953e34be444c219fd3b94d3277aa65201658c1e5b2e563a49d11c883d05c491d628f0a92c3e3dc8db9a4c8d5f0dc846ac22af8b3c5fb5bbe2cfa98614dcffd87de1cee2c5912a5899505a0c5bcaa513e2c6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AAAAAAL7pqBhIB6mse1CZRY1aHNeureGAM32pxEB3GO-r1Rtl6IU_GOWeTsBTrGqenKPU96y_5mZo4CN3-0V6WKb",
+        "y" : "AZk4UtrcOSmaWkW2vXyNyOxn5627NZ-o-l1El34V4uWprPDDNkXz8saMUm4Hcy-zUENxnPr8FgY8jliFCpWENqTl"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "040000000002fba6a061201ea6b1ed4265163568735ebab78600cdf6a71101dc63beaf546d97a214fc6396793b014eb1aa7a728f53deb2ff9999a3808ddfed15e9629b01993852dadc39299a5a45b6bd7c8dc8ec67e7adbb359fa8fa5d44977e15e2e5a9acf0c33645f3f2c68c526e07732fb35043719cfafc16063c8e58850a958436a4e5",
+        "wx" : "2fba6a061201ea6b1ed4265163568735ebab78600cdf6a71101dc63beaf546d97a214fc6396793b014eb1aa7a728f53deb2ff9999a3808ddfed15e9629b",
+        "wy" : "1993852dadc39299a5a45b6bd7c8dc8ec67e7adbb359fa8fa5d44977e15e2e5a9acf0c33645f3f2c68c526e07732fb35043719cfafc16063c8e58850a958436a4e5"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b8104002303818600040000000002fba6a061201ea6b1ed4265163568735ebab78600cdf6a71101dc63beaf546d97a214fc6396793b014eb1aa7a728f53deb2ff9999a3808ddfed15e9629b01993852dadc39299a5a45b6bd7c8dc8ec67e7adbb359fa8fa5d44977e15e2e5a9acf0c33645f3f2c68c526e07732fb35043719cfafc16063c8e58850a958436a4e5",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAAAAAAvumoGEgHqax7UJlFjVoc166\nt4YAzfanEQHcY76vVG2XohT8Y5Z5OwFOsap6co9T3rL/mZmjgI3f7RXpYpsBmThS\n2tw5KZpaRba9fI3I7Gfnrbs1n6j6XUSXfhXi5ams8MM2RfPyxoxSbgdzL7NQQ3Gc\n+vwWBjyOWIUKlYQ2pOU=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 328,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "010e89470f981d2c7c5c96587121a67323bb96ff2427739d0d885ea277293efa3b25c0bda04d81466198a3cbfc441f1b1b98f6bcdc2589d9d91a17a7899f70d0461e017351b0da8c8d0e4aa0974669d190fa2f90aa50227160594dfb55755002365441de17ea42902128a6f81e554177ed509c0cec31fd5053fae03f62ff76579ba92bda",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 329,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "011094ac23ca46a3e2b4ac3baae6504f1bfb3ddf2db9ab40eda32d8e0a05727998f8552a033bb05241e826a86a1d03014eae3aa5fe1a45caac1db3e8138b9cf590680147edb15a5080ee2f929f78b6ac86604aae51b674fa46eaae7fdfd90bf64d6189341155f4eba937eae74c9e480eb4fb7e6aafd4285e7fc503ee6ec20f0b1415be06",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 330,
+          "comment" : "x-coordinate of the public key is small",
+          "msg" : "4d657373616765",
+          "sig" : "01d876ae174da31e128babff9f1d15507660bdc7958750844dc4f4291f75a882a22f177f704be6067bf7ce8f06b8626d971e6ef5dcb666fa975c1e11126e04fccce201abb12630a68b669e6ad2d8d62654d75dfbc6b54a8e3a9c915be663e080ddcc348e57a10e2b1dd9f03e1b897796ad889b075e5919dc5bf37a112d92c693456e6457",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "Af____4dXVKzHKUviUejVZPt8WTNMk-DO5CTWEbGTbFFTfnwKNyLw2uwTLfwzOzroBo4RAl_fDXuqoFCjbDMpjMx",
+        "y" : "AbfHAnfQv3ijx7Ysk38MssrSVl9VFPYgXOsaGT1P20W6bmzsB4J7rgsWuDFsNTmhURTQ3m0t5Af9cRdVGnCCbq2m"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0401fffffffe1d5d52b31ca52f8947a35593edf164cd324f833b90935846c64db1454df9f028dc8bc36bb04cb7f0cceceba01a3844097f7c35eeaa81428db0cca6333101b7c70277d0bf78a3c7b62c937f0cb2cad2565f5514f6205ceb1a193d4fdb45ba6e6cec07827bae0b16b8316c3539a15114d0de6d2de407fd7117551a70826eada6",
+        "wx" : "1fffffffe1d5d52b31ca52f8947a35593edf164cd324f833b90935846c64db1454df9f028dc8bc36bb04cb7f0cceceba01a3844097f7c35eeaa81428db0cca63331",
+        "wy" : "1b7c70277d0bf78a3c7b62c937f0cb2cad2565f5514f6205ceb1a193d4fdb45ba6e6cec07827bae0b16b8316c3539a15114d0de6d2de407fd7117551a70826eada6"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000401fffffffe1d5d52b31ca52f8947a35593edf164cd324f833b90935846c64db1454df9f028dc8bc36bb04cb7f0cceceba01a3844097f7c35eeaa81428db0cca6333101b7c70277d0bf78a3c7b62c937f0cb2cad2565f5514f6205ceb1a193d4fdb45ba6e6cec07827bae0b16b8316c3539a15114d0de6d2de407fd7117551a70826eada6",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB/////h1dUrMcpS+JR6NVk+3xZM0y\nT4M7kJNYRsZNsUVN+fAo3IvDa7BMt/DM7OugGjhECX98Ne6qgUKNsMymMzEBt8cC\nd9C/eKPHtiyTfwyyytJWX1UU9iBc6xoZPU/bRbpubOwHgnuuCxa4MWw1OaFRFNDe\nbS3kB/1xF1UacIJuraY=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 331,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "004ed692af1ed1b4bd5cea3aa8ddc6f3f15d8a6ee0016fa0e8eb958580e7421832ecc0e387c34aafac6380bac419ea45c42ae6426af503847f22c49c2f456338c1a7007aceadde02ace1668bc1a3360d34e125afde230f536c154d91e6c876bee1d34ae06edcbbca0c7cd17646840913164740b12e2e224fe3ef3dec6fd84a81b581c188",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 332,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "00e01094048fcf7a1e2ec66faedffc40f48c9c93514325bde6b4958d80f0413efde7eec1dc6de65f96009c069397e51da2eb1729efa287afd5552b25a9e427a6d83601489e7e124f66942e642de992e60b3a86fcce576767719390c3a312fcdeaa560a7fbb0cabb35e05a6d6f3499160fd2dba12d29b613b16dec7494c950d65fdf11fa3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 333,
+          "comment" : "x-coordinate of the public key is large",
+          "msg" : "4d657373616765",
+          "sig" : "01d296292213380de133dc66eceb8bd857a5c468afe855c05da9db937373b51f9020ca11353415da76bb6af997a486d2370e31adcc0a4531952a3b59428678ee5943015979a3c609c2c2099ae1b290da3d613b248e3a10de7ad770dffc82fb33e74fc3207533f97285cf4557a6407e9a775e59efeaee4264b2634933a6baf8c406f0c4a9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "jwk" : {
+        "crv" : "P-521",
+        "kid" : "none",
+        "kty" : "EC",
+        "x" : "AMfIgXvy8GUqSktRQMdz4mEICgoRE5WFboozUPXrVhK9Y7NnuWXpLpU46jt5CK7xreS2jhf5-RSElcFn0cTdSRNJ",
+        "y" : "AAi_C-KXmruBEf0NdorcrXdBE6giwbtgiHBTtc-MlWPnZwWjkezhVLXfsRSyDjUd9AFL7Bn6h3IIRYAc8Gt_____"
+      },
+      "key" : {
+        "curve" : "secp521r1",
+        "keySize" : 521,
+        "type" : "ECPublicKey",
+        "uncompressed" : "0400c7c8817bf2f0652a4a4b5140c773e261080a0a111395856e8a3350f5eb5612bd63b367b965e92e9538ea3b7908aef1ade4b68e17f9f9148495c167d1c4dd4913490008bf0be2979abb8111fd0d768adcad774113a822c1bb60887053b5cf8c9563e76705a391ece154b5dfb114b20e351df4014bec19fa87720845801cf06b7fffffff",
+        "wx" : "0c7c8817bf2f0652a4a4b5140c773e261080a0a111395856e8a3350f5eb5612bd63b367b965e92e9538ea3b7908aef1ade4b68e17f9f9148495c167d1c4dd491349",
+        "wy" : "08bf0be2979abb8111fd0d768adcad774113a822c1bb60887053b5cf8c9563e76705a391ece154b5dfb114b20e351df4014bec19fa87720845801cf06b7fffffff"
+      },
+      "keyDer" : "30819b301006072a8648ce3d020106052b81040023038186000400c7c8817bf2f0652a4a4b5140c773e261080a0a111395856e8a3350f5eb5612bd63b367b965e92e9538ea3b7908aef1ade4b68e17f9f9148495c167d1c4dd4913490008bf0be2979abb8111fd0d768adcad774113a822c1bb60887053b5cf8c9563e76705a391ece154b5dfb114b20e351df4014bec19fa87720845801cf06b7fffffff",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAx8iBe/LwZSpKS1FAx3PiYQgKChET\nlYVuijNQ9etWEr1js2e5ZekulTjqO3kIrvGt5LaOF/n5FISVwWfRxN1JE0kACL8L\n4peau4ER/Q12itytd0ETqCLBu2CIcFO1z4yVY+dnBaOR7OFUtd+xFLIONR30AUvs\nGfqHcghFgBzwa3////8=\n-----END PUBLIC KEY-----",
+      "sha" : "SHA-512",
+      "type" : "ECDSAVer",
+      "tests" : [
+        {
+          "tcId" : 334,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "01ef8f785c51a25ae2cd93487b5c848d4af133217a91f51359c966e7538e68743578122df5830002f96f6fadb5bc44480e3b3b2c804e4c51cf95d059d5646c5cef2101ba2276cc003e87bea37c3724e58a0ab885f56d09b8b5718f674f9c70f3b5ecfb4ad1f3417b420ec40810e08826efa7d8ad6ca7c6a7840348097f92b2de8d6e080b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 335,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "0155978adc4b570d897511f5ecfb65a31947e6e989da17dea716625bb3fa7b92b853623eb0cd9ce2a5e2b4d8c1c2a90ec04fe79d012576ec728a45c5ce47c6d500c000f79fa8b94ee282a3d1815892cbf15d7ebdf62cb042c76bb3c710c23e32b75992cc249d84072198e4ed63d72435a07d2ed76f278d7399f61a5b5c997f45692fed22",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 336,
+          "comment" : "y-coordinate of the public key has many trailing 1's",
+          "msg" : "4d657373616765",
+          "sig" : "01a2af29c58184ca861e7cd931f39cea064b199eee563f241cd5ecf6ebb2ade728f1be23cf007ebe8ef0c42d99f9f5190f6815446afc3043a820d7daf27e86b83b8a01a2acd1822eb539383defff8769aad8bacd50cd24ca7aa6670671418110177808c3f4fbe6041b9cb898359ee61e04824adedd62b39fe5791907a20586333bd3c76d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/eddsa_test.json b/third_party/wycheproof/testvectors/eddsa_test.json
new file mode 100644
index 0000000..91fcbdb
--- /dev/null
+++ b/third_party/wycheproof/testvectors/eddsa_test.json
@@ -0,0 +1,1153 @@
+{
+  "algorithm" : "EDDSA",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "SignatureMalleability" : "EdDSA signatures are non-malleable, if implemented accordingly. Failing to check the range of S allows to modify signatures. See RFC 8032, Section 5.2.7 and Section 8.4."
+  },
+  "numberOfTests" : 111,
+  "header" : [],
+  "testGroups" : [
+    {
+      "key" : {
+        "curve" : "edwards25519",
+        "keySize" : 255,
+        "pk" : "7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa",
+        "sk" : "add4bb8103785baf9ac534258e8aaf65f5f1adb5ef5f3df19bb80ab989c4d64b",
+        "type" : "EDDSAKeyPair"
+      },
+      "keyDer" : "302a300506032b65700321007d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAfU0Of2FTpptiQrUiq77mhf2kQg+INLEIw72uNp71Sfo=\n-----END PUBLIC KEY-----\n",
+      "type" : "EDDSAVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "d4fbdb52bfa726b44d1786a8c0d171c3e62ca83c9e5bbe63de0bb2483f8fd6cc1429ab72cafc41ab56af02ff8fcc43b99bfe4c7ae940f60f38ebaa9d311c4007",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "msg" : "78",
+          "sig" : "d80737358ede548acb173ef7e0399f83392fe8125b2ce877de7975d8b726ef5b1e76632280ee38afad12125ea44b961bf92f1178c9fa819d020869975bcbe109",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "",
+          "msg" : "48656c6c6f",
+          "sig" : "1c1ad976cbaae3b31dee07971cf92c928ce2091a85f5899f5e11ecec90fc9f8e93df18c5037ec9b29c07195ad284e63d548cd0a6fe358cc775bd6c1608d2c905",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bf0cf5b3a289976458a1be6277a5055545253b45b07dcc1abd96c8b989c00f301",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "",
+          "msg" : "000000000000000000000000",
+          "sig" : "d46543bfb892f84ec124dcdfc847034c19363bf3fc2fa89b1267833a14856e52e60736918783f950b6f1dd8d40dc343247cd43ce054c2d68ef974f7ed0f3c60f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "",
+          "msg" : "6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161",
+          "sig" : "879350045543bc14ed2c08939b68c30d22251d83e018cacbaf0c9d7a48db577e80bdf76ce99e5926762bc13b7b3483260a5ef63d07e34b58eb9c14621ac92f00",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60",
+          "sig" : "7bdc3f9919a05f1d5db4a3ada896094f6871c1f37afc75db82ec3147d84d6f237b7e5ecc26b59cfea0c7eaf1052dc427b0f724615be9c3d3e01356c65b9b5109",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "",
+          "msg" : "ffffffffffffffffffffffffffffffff",
+          "sig" : "5dbd7360e55aa38e855d6ad48c34bd35b7871628508906861a7c4776765ed7d1e13d910faabd689ec8618b78295c8ab8f0e19c8b4b43eb8685778499e943ae04",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "special values for r and s",
+          "msg" : "3f",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "special values for r and s",
+          "msg" : "3f",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "special values for r and s",
+          "msg" : "3f",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000ecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "special values for r and s",
+          "msg" : "3f",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "special values for r and s",
+          "msg" : "3f",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "special values for r and s",
+          "msg" : "3f",
+          "sig" : "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "special values for r and s",
+          "msg" : "3f",
+          "sig" : "01000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "special values for r and s",
+          "msg" : "3f",
+          "sig" : "0100000000000000000000000000000000000000000000000000000000000000ecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "special values for r and s",
+          "msg" : "3f",
+          "sig" : "0100000000000000000000000000000000000000000000000000000000000000edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "special values for r and s",
+          "msg" : "3f",
+          "sig" : "0100000000000000000000000000000000000000000000000000000000000000edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "special values for r and s",
+          "msg" : "3f",
+          "sig" : "edd3f55c1a631258d69cf7a2def9de14000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "special values for r and s",
+          "msg" : "3f",
+          "sig" : "edd3f55c1a631258d69cf7a2def9de14000000000000000000000000000000100100000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "special values for r and s",
+          "msg" : "3f",
+          "sig" : "edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010ecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "special values for r and s",
+          "msg" : "3f",
+          "sig" : "edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "special values for r and s",
+          "msg" : "3f",
+          "sig" : "edd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "special values for r and s",
+          "msg" : "3f",
+          "sig" : "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "special values for r and s",
+          "msg" : "3f",
+          "sig" : "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0100000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "special values for r and s",
+          "msg" : "3f",
+          "sig" : "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fecd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "special values for r and s",
+          "msg" : "3f",
+          "sig" : "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fedd3f55c1a631258d69cf7a2def9de1400000000000000000000000000000010",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "special values for r and s",
+          "msg" : "3f",
+          "sig" : "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fedffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "empty signature",
+          "msg" : "54657374",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "s missing",
+          "msg" : "54657374",
+          "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "signature too short",
+          "msg" : "54657374",
+          "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "signature too long",
+          "msg" : "54657374",
+          "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d2020",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "include pk in signature",
+          "msg" : "54657374",
+          "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d7d4d0e7f6153a69b6242b522abbee685fda4420f8834b108c3bdae369ef549fa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "prepending 0 byte to signature",
+          "msg" : "54657374",
+          "sig" : "007c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "prepending 0 byte to s",
+          "msg" : "54657374",
+          "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0007a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "appending 0 byte to signature",
+          "msg" : "54657374",
+          "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "removing 0 byte from signature",
+          "msg" : "546573743137",
+          "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b3",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "removing 0 byte from signature",
+          "msg" : "54657374313236",
+          "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab09155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "removing leading 0 byte from signature",
+          "msg" : "546573743530",
+          "sig" : "38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "dropping byte from signature",
+          "msg" : "54657374333437",
+          "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab09155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b30d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "modified bit 0 in R",
+          "msg" : "313233343030",
+          "sig" : "647c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b1d125e5538f38afbcc1c84e489521083041d24bc6240767029da063271a1ff0c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "modified bit 1 in R",
+          "msg" : "313233343030",
+          "sig" : "677c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bc108ca4b87a49c9ed2cf383aecad8f54a962b2899da891e12004d7993a627e01",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "modified bit 2 in R",
+          "msg" : "313233343030",
+          "sig" : "617c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b9ce23fc6213ed5b87912e9bbf92f5e2c780eae26d15c50a112d1e97d2ea33c06",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "modified bit 7 in R",
+          "msg" : "313233343030",
+          "sig" : "e57c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bbb3eb51cd98dddb235a5f46f2bded6af184a58d09cce928bda43f41d69118a03",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "modified bit 8 in R",
+          "msg" : "313233343030",
+          "sig" : "657d1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bcd237dda9a116501f67a5705a854b9adc304f34720803a91b324f2c13e0f5a09",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "modified bit 16 in R",
+          "msg" : "313233343030",
+          "sig" : "657c1592402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b6b167bbdc0d881cc04d28905552c1876f3709851abc5007376940cc8a435c300",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "modified bit 31 in R",
+          "msg" : "313233343030",
+          "sig" : "657c1412402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b7fd2ac7da14afffcceeb13f2a0d6b887941cb1a5eb57a52f3cb131a16cce7b0e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "modified bit 32 in R",
+          "msg" : "313233343030",
+          "sig" : "657c1492412ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2b7373ba13ebbef99cd2a8ead55ce735c987d85a35320925a8e871702dc7c5c40d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "modified bit 63 in R",
+          "msg" : "313233343030",
+          "sig" : "657c1492402ab54e03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bd35bd331c03f0855504ca1cab87b83c36a028425a3cf007ede4f4254c261cb00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "modified bit 64 in R",
+          "msg" : "313233343030",
+          "sig" : "657c1492402ab5ce02e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2bcb35101f73cf467deac8c1a03b6c3dc35af544132734b7e57ab20c89b2e4750d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "modified bit 97 in R",
+          "msg" : "313233343030",
+          "sig" : "657c1492402ab5ce03e2c3a7f2384d051b9cf3570f1207fc78c1bcc98c281c2bb58d2e8878290bff8d3355fdd4ea381924ee578752354eb6dee678ab4011c301",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "modified bit 127 in R",
+          "msg" : "313233343030",
+          "sig" : "657c1492402ab5ce03e2c3a7f0384d851b9cf3570f1207fc78c1bcc98c281c2bb978c866187ffb1cc7b29a0b4045aefc08768df65717194ff0c6e63f4dea0d02",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "modified bit 240 in R",
+          "msg" : "313233343030",
+          "sig" : "657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281d2b0576ecf8eaf675f00f3dfbe19f75b83b7607a6c96414f6821af920a2498d0305",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "modified bit 247 in R",
+          "msg" : "313233343030",
+          "sig" : "657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c289c2be5241a345c7b5428054c74b7c382fa10d4a5f1e8f8b79a71d3fdea2254f1ff0e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "modified bit 248 in R",
+          "msg" : "313233343030",
+          "sig" : "657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c2a63950c85cd6dc96364e768de50ff7732b538f8a0b1615d799190ab600849230e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "modified bit 253 in R",
+          "msg" : "313233343030",
+          "sig" : "657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c0b543bd3da0a56a8c9c152f59c9fec12f31fa66434d48b817b30d90cb4efa8b501",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "modified bit 254 in R",
+          "msg" : "313233343030",
+          "sig" : "657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281c6b8da07efd07a6dafb015ed6a32fe136319a972ffbc341f3a0beae97ccf8136505",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "modified bit 255 in R",
+          "msg" : "313233343030",
+          "sig" : "657c1492402ab5ce03e2c3a7f0384d051b9cf3570f1207fc78c1bcc98c281cab227aedf259f910f0f3a759a335062665217925d019173b88917eae294f75d40f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "R==0",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000e0b8e7770d51c7a36375d006c5bffd6af43ff54aaf47e4330dc118c71d61ec02",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "invalid R",
+          "msg" : "313233343030",
+          "sig" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff463a1908382e7eb7693acef9884f7cf931a215e0791876be22c631a59881fd0e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "all bits flipped in R",
+          "msg" : "313233343030",
+          "sig" : "9a83eb6dbfd54a31fc1d3c580fc7b2fae4630ca8f0edf803873e433673d7e3d40e94254586cb6188c5386c3febed477cb9a6cb29e3979adc4cb27cf5278fb70a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "checking malleability ",
+          "msg" : "54657374",
+          "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab067654bce3832c2d76f8f6f5dafc08d9339d4eef676573336a5c51eb6f946b31d",
+          "result" : "invalid",
+          "flags" : [
+            "SignatureMalleability"
+          ]
+        },
+        {
+          "tcId" : 64,
+          "comment" : "checking malleability ",
+          "msg" : "54657374",
+          "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab05439412b5395d42f462c67008eba6ca839d4eef676573336a5c51eb6f946b32d",
+          "result" : "invalid",
+          "flags" : [
+            "SignatureMalleability"
+          ]
+        },
+        {
+          "tcId" : 65,
+          "comment" : "checking malleability ",
+          "msg" : "54657374",
+          "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab02ee12ce5875bf9dff26556464bae2ad239d4eef676573336a5c51eb6f946b34d",
+          "result" : "invalid",
+          "flags" : [
+            "SignatureMalleability"
+          ]
+        },
+        {
+          "tcId" : 66,
+          "comment" : "checking malleability ",
+          "msg" : "54657374",
+          "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0e2300459f1e742404cd934d2c595a6253ad4eef676573336a5c51eb6f946b38d",
+          "result" : "invalid",
+          "flags" : [
+            "SignatureMalleability"
+          ]
+        },
+        {
+          "tcId" : 67,
+          "comment" : "checking malleability ",
+          "msg" : "54657374",
+          "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b32d",
+          "result" : "invalid",
+          "flags" : [
+            "SignatureMalleability"
+          ]
+        },
+        {
+          "tcId" : 68,
+          "comment" : "checking malleability ",
+          "msg" : "54657374",
+          "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b34d",
+          "result" : "invalid",
+          "flags" : [
+            "SignatureMalleability"
+          ]
+        },
+        {
+          "tcId" : 69,
+          "comment" : "checking malleability ",
+          "msg" : "54657374",
+          "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab07a9155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b38d",
+          "result" : "invalid",
+          "flags" : [
+            "SignatureMalleability"
+          ]
+        },
+        {
+          "tcId" : 70,
+          "comment" : "checking malleability ",
+          "msg" : "54657374",
+          "sig" : "7c38e026f29e14aabd059a0f2db8b0cd783040609a8be684db12f82a27774ab0679155711ecfaf7f99f277bad0c6ae7e39d4eef676573336a5c51eb6f946b38d",
+          "result" : "invalid",
+          "flags" : [
+            "SignatureMalleability"
+          ]
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "edwards25519",
+        "keySize" : 255,
+        "pk" : "a12c2beb77265f2aac953b5009349d94155a03ada416aad451319480e983ca4c",
+        "sk" : "0a23a20072891237aa0864b5765139514908787878cd77135a0059881d313f00",
+        "type" : "EDDSAKeyPair"
+      },
+      "keyDer" : "302a300506032b6570032100a12c2beb77265f2aac953b5009349d94155a03ada416aad451319480e983ca4c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAoSwr63cmXyqslTtQCTSdlBVaA62kFqrUUTGUgOmDykw=\n-----END PUBLIC KEY-----\n",
+      "type" : "EDDSAVer",
+      "tests" : [
+        {
+          "tcId" : 71,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "5056325d2ab440bf30bbf0f7173199aa8b4e6fbc091cf3eb6bc6cf87cd73d992ffc216c85e4ab5b8a0bbc7e9a6e9f8d33b7f6e5ac0ffdc22d9fcaf784af84302",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "",
+          "msg" : "78",
+          "sig" : "481fafbf4364d7b682475282f517a3ac0538c9a6b6a562e99a3d8e5afb4f90a559b056b9f07af023905753b02d95eb329a35c77f154b79abbcd291615ce42f02",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "8a9bb4c465a3863abc9fd0dd35d80bb28f7d33d37d74679802d63f82b20da114b8d765a1206b3e9ad7cf2b2d8d778bb8651f1fa992db293c0039eacb6161480f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "",
+          "msg" : "48656c6c6f",
+          "sig" : "d839c20abfda1fd429531831c64f813f84b913e9928540310cf060b44c3dbf9457d44a7721fdc0d67724ff81cb450dd39b10cfb65db15dda4b8bf09d26bd3801",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "9bbb1052dcfa8ad2715c2eb716ae4f1902dea353d42ee09fd4c0b4fcb8b52b5219e2200016e1199d0061891c263e31b0bc3b55673c19610c4e0fa5408004160b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "",
+          "msg" : "000000000000000000000000",
+          "sig" : "f63b5c0667c7897fc283296416f7f60e84bbde9cbd832e56be463ed9f568069702b17a2f7c341ebf590706a6388ac76ac613c1675ec0f2c7118f2573422a500b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "",
+          "msg" : "6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161",
+          "sig" : "1bc44d7001e6b5b9090fef34b2ca480f9786bbefa7d279353e5881e8dfb91b803ccd46500e270ef0109bfd741037558832120bc2a4f20fbe7b5fb3c3aaf23e08",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "",
+          "msg" : "202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60",
+          "sig" : "ea8e22143b02372e76e99aece3ed36aec529768a27e2bb49bdc135d44378061e1f62d1ac518f33ebf37b2ee8cc6dde68a4bd7d4a2f4d6cb77f015f71ca9fc30d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "",
+          "msg" : "ffffffffffffffffffffffffffffffff",
+          "sig" : "8acd679e1a914fc45d5fa83d3021f0509c805c8d271df54e52f43cfbd00cb6222bf81d58fe1de2de378df67ee9f453786626961fe50a9b05f12b6f0899ebdd0a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "edwards25519",
+        "keySize" : 255,
+        "pk" : "d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a",
+        "sk" : "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60",
+        "type" : "EDDSAKeyPair"
+      },
+      "keyDer" : "302a300506032b6570032100d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEA11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo=\n-----END PUBLIC KEY-----\n",
+      "type" : "EDDSAVer",
+      "tests" : [
+        {
+          "tcId" : 80,
+          "comment" : "draft-josefsson-eddsa-ed25519-02: Test 1",
+          "msg" : "",
+          "sig" : "e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "edwards25519",
+        "keySize" : 255,
+        "pk" : "3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c",
+        "sk" : "4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb",
+        "type" : "EDDSAKeyPair"
+      },
+      "keyDer" : "302a300506032b65700321003d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAPUAXw+hDiVqStwqnTRt+vJyYLM8uxJaMwM1V8Sr0Zgw=\n-----END PUBLIC KEY-----\n",
+      "type" : "EDDSAVer",
+      "tests" : [
+        {
+          "tcId" : 81,
+          "comment" : "draft-josefsson-eddsa-ed25519-02: Test 2",
+          "msg" : "72",
+          "sig" : "92a009a9f0d4cab8720e820b5f642540a2b27b5416503f8fb3762223ebdb69da085ac1e43e15996e458f3613d0f11d8c387b2eaeb4302aeeb00d291612bb0c00",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "edwards25519",
+        "keySize" : 255,
+        "pk" : "fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025",
+        "sk" : "c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7",
+        "type" : "EDDSAKeyPair"
+      },
+      "keyDer" : "302a300506032b6570032100fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEA/FHNjmIYoaONpH7QAjDwWAgW7RO6MwOsXeuRFUiQgCU=\n-----END PUBLIC KEY-----\n",
+      "type" : "EDDSAVer",
+      "tests" : [
+        {
+          "tcId" : 82,
+          "comment" : "draft-josefsson-eddsa-ed25519-02: Test 3",
+          "msg" : "af82",
+          "sig" : "6291d657deec24024827e69c3abe01a30ce548a284743a445e3680d7db5ac3ac18ff9b538d16f290ae67f760984dc6594a7c15e9716ed28dc027beceea1ec40a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "edwards25519",
+        "keySize" : 255,
+        "pk" : "278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e",
+        "sk" : "f5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5",
+        "type" : "EDDSAKeyPair"
+      },
+      "keyDer" : "302a300506032b6570032100278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAJ4EX/BRMcjQPZ9DyMW6Dhs7/vyskKMnFH+98WX8dQm4=\n-----END PUBLIC KEY-----\n",
+      "type" : "EDDSAVer",
+      "tests" : [
+        {
+          "tcId" : 83,
+          "comment" : "draft-josefsson-eddsa-ed25519-02: Test 1024",
+          "msg" : "08b8b2b733424243760fe426a4b54908632110a66c2f6591eabd3345e3e4eb98fa6e264bf09efe12ee50f8f54e9f77b1e355f6c50544e23fb1433ddf73be84d879de7c0046dc4996d9e773f4bc9efe5738829adb26c81b37c93a1b270b20329d658675fc6ea534e0810a4432826bf58c941efb65d57a338bbd2e26640f89ffbc1a858efcb8550ee3a5e1998bd177e93a7363c344fe6b199ee5d02e82d522c4feba15452f80288a821a579116ec6dad2b3b310da903401aa62100ab5d1a36553e06203b33890cc9b832f79ef80560ccb9a39ce767967ed628c6ad573cb116dbefefd75499da96bd68a8a97b928a8bbc103b6621fcde2beca1231d206be6cd9ec7aff6f6c94fcd7204ed3455c68c83f4a41da4af2b74ef5c53f1d8ac70bdcb7ed185ce81bd84359d44254d95629e9855a94a7c1958d1f8ada5d0532ed8a5aa3fb2d17ba70eb6248e594e1a2297acbbb39d502f1a8c6eb6f1ce22b3de1a1f40cc24554119a831a9aad6079cad88425de6bde1a9187ebb6092cf67bf2b13fd65f27088d78b7e883c8759d2c4f5c65adb7553878ad575f9fad878e80a0c9ba63bcbcc2732e69485bbc9c90bfbd62481d9089beccf80cfe2df16a2cf65bd92dd597b0707e0917af48bbb75fed413d238f5555a7a569d80c3414a8d0859dc65a46128bab27af87a71314f318c782b23ebfe808b82b0ce26401d2e22f04d83d1255dc51addd3b75a2b1ae0784504df543af8969be3ea7082ff7fc9888c144da2af58429ec96031dbcad3dad9af0dcbaaaf268cb8fcffead94f3c7ca495e056a9b47acdb751fb73e666c6c655ade8297297d07ad1ba5e43f1bca32301651339e22904cc8c42f58c30c04aafdb038dda0847dd988dcda6f3bfd15c4b4c4525004aa06eeff8ca61783aacec57fb3d1f92b0fe2fd1a85f6724517b65e614ad6808d6f6ee34dff7310fdc82aebfd904b01e1dc54b2927094b2db68d6f903b68401adebf5a7e08d78ff4ef5d63653a65040cf9bfd4aca7984a74d37145986780fc0b16ac451649de6188a7dbdf191f64b5fc5e2ab47b57f7f7276cd419c17a3ca8e1b939ae49e488acba6b965610b5480109c8b17b80e1b7b750dfc7598d5d5011fd2dcc5600a32ef5b52a1ecc820e308aa342721aac0943bf6686b64b2579376504ccc493d97e6aed3fb0f9cd71a43dd497f01f17c0e2cb3797aa2a2f256656168e6c496afc5fb93246f6b1116398a346f1a641f3b041e989f7914f90cc2c7fff357876e506b50d334ba77c225bc307ba537152f3f1610e4eafe595f6d9d90d11faa933a15ef1369546868a7f3a45a96768d40fd9d03412c091c6315cf4fde7cb68606937380db2eaaa707b4c4185c32eddcdd306705e4dc1ffc872eeee475a64dfac86aba41c0618983f8741c5ef68d3a101e8a3b8cac60c905c15fc910840b94c00a0b9d0",
+          "sig" : "0aab4c900501b3e24d7cdf4663326a3a87df5e4843b2cbdb67cbf6e460fec350aa5371b1508f9f4528ecea23c436d94b5e8fcd4f681e30a6ac00a9704a188a03",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "edwards25519",
+        "keySize" : 255,
+        "pk" : "8fd659b77b558ed93882c1157438450ac86ec62d421d568e98ee236f3810295a",
+        "sk" : "d7ad3f1f6bbe0477c3c357a806a19eb41ae3f94025035bc87f281f8ee9fc0e34",
+        "type" : "EDDSAKeyPair"
+      },
+      "keyDer" : "302a300506032b65700321008fd659b77b558ed93882c1157438450ac86ec62d421d568e98ee236f3810295a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAj9ZZt3tVjtk4gsEVdDhFCshuxi1CHVaOmO4jbzgQKVo=\n-----END PUBLIC KEY-----\n",
+      "type" : "EDDSAVer",
+      "tests" : [
+        {
+          "tcId" : 84,
+          "comment" : "Random test failure 1",
+          "msg" : "b0729a713593a92e46b56eaa66b9e435f7a09a8e7de03b078f6f282285276635f301e7aaafe42187c45d6f5b13f9f16b11195cc125c05b90d24dfe4c",
+          "sig" : "7db17557ac470c0eda4eedaabce99197ab62565653cf911f632ee8be0e5ffcfc88fb94276b42e0798fd3aa2f0318be7fc6a29fae75f70c3dcdc414a0ad866601",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "edwards25519",
+        "keySize" : 255,
+        "pk" : "2a606bf67ac770c607038b004101b325edb569efd3413d2d1f2c3e6b4e6e3082",
+        "sk" : "ad9b22793336fcdac10e136c4deea599be187a38eef91c1cf7c7a4ec884dda08",
+        "type" : "EDDSAKeyPair"
+      },
+      "keyDer" : "302a300506032b65700321002a606bf67ac770c607038b004101b325edb569efd3413d2d1f2c3e6b4e6e3082",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAKmBr9nrHcMYHA4sAQQGzJe21ae/TQT0tHyw+a05uMII=\n-----END PUBLIC KEY-----\n",
+      "type" : "EDDSAVer",
+      "tests" : [
+        {
+          "tcId" : 85,
+          "comment" : "Random test failure 2",
+          "msg" : "a8546e50ba31cae3234310d32672447be213fad91a227a19669c53d309b959782b0e6b71f8791fdb470043b58122003157d2d96a43a6cbd7d3a8d86bf4c97391883e268d50af80e1e6e12939c2bd50ca746cdadfad4edf1bda875299740724148efb1ebe73fb60088cda890317658627a5f7ab5a0c075d9d8f3f97b6492b35519e50ff6b38377432a7081f9176bb1c29a862deac1336ca20b097a47829cec10a6a7cec178eda2d12f6dc6c87f910454af0123555ba184e68804d9cced60fd5c8c90943e56599c8f0ba59a38491ba5e5a53460682474c07e40ca142983314fd762856bb1093f359da6eb0a756bd93a3160c10dd8feea6b97e7c6a17cb54bd5d7649c05c66d7bdee056671dfdaf689fa3945bb8e29a429f4bd5d355dce9687b06f01d5e33e3999f0e8",
+          "sig" : "67d84d4c3945aaf06e06d524be63acbfb5dbb1988c4aea96a5ee9f7a9b9eecc29df4f66b8aa1d9e8607a58fb1ef0c2ad69aac005b4f58e34103344a9c8871a09",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "Random test failure 24",
+          "msg" : "b477b0480bb84642608b908d29a51cf2fce63f24ee95",
+          "sig" : "28fafbb62b4d688fa79e1ac92851f46e319b161f801d4dc09acc21fdd6780a2c4292b8c1003c61c2bcebe7f3f88ccc4bb26d407387c5f27cb8c94cf6ce810405",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "edwards25519",
+        "keySize" : 255,
+        "pk" : "c9c946cbc5544ac74eef491f07c5881c16faf7ec31ce4aa91bb60ae7b4539051",
+        "sk" : "04a6553d68a9baef78a2175af375458eaa01cdb77350c61e282ef5f0c7116599",
+        "type" : "EDDSAKeyPair"
+      },
+      "keyDer" : "302a300506032b6570032100c9c946cbc5544ac74eef491f07c5881c16faf7ec31ce4aa91bb60ae7b4539051",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAyclGy8VUSsdO70kfB8WIHBb69+wxzkqpG7YK57RTkFE=\n-----END PUBLIC KEY-----\n",
+      "type" : "EDDSAVer",
+      "tests" : [
+        {
+          "tcId" : 87,
+          "comment" : "Random test failure 3",
+          "msg" : "cd2212eddb0706f62c995cef958634f0cb7793444cbf4d30e81c27c41ebea6cb02607510131f9c015692dfd521b148841e9a2d3564d20ac401f6cb8e40f520fe0cafbeaa88840b83013369d879f013463fe52a13267aa0c8c59c45cde9399cd1e6be8cc64cf48315ac2eb31a1c567a4fb7d601746d1f63b5ac020712adbbe07519bded6f",
+          "sig" : "24087d47f3e20af51b9668ae0a88ce76586802d0ec75d8c0f28fc30962b5e1d1a1d509571a1624ed125a8df92a6e963728d6b5de99200b8e285f70feb6f05207",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "Random test failure 20",
+          "msg" : "27d465bc632743522aefa23c",
+          "sig" : "c2656951e2a0285585a51ff0eda7e9a23c2dfd2ffa273aee7808f4604e8f9a8c8ea49e9fce4eb2d8d75d36b7238fe6fc13b6c5d9427dd58f8c6615d033c0bd0f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "edwards25519",
+        "keySize" : 255,
+        "pk" : "32ad026f693d0d2afe7f4388d91c4c964426fcb9e3665c3ebd8650009b815c8e",
+        "sk" : "c367c8d2ebeeecd70c1e8985b70c3808b75657f243b21ba4f322792540e92257",
+        "type" : "EDDSAKeyPair"
+      },
+      "keyDer" : "302a300506032b657003210032ad026f693d0d2afe7f4388d91c4c964426fcb9e3665c3ebd8650009b815c8e",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAMq0Cb2k9DSr+f0OI2RxMlkQm/LnjZlw+vYZQAJuBXI4=\n-----END PUBLIC KEY-----\n",
+      "type" : "EDDSAVer",
+      "tests" : [
+        {
+          "tcId" : 89,
+          "comment" : "Random test failure 4",
+          "msg" : "ec5c7cb078",
+          "sig" : "d920d421a5956b69bfe1ba834c025e2babb6c7a6d78c97de1d9bb1116dfdd1185147b2887e34e15578172e150774275ea2aad9e02106f7e8ca1caa669a066f0c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "Random test failure 5",
+          "msg" : "4668c6a76f0e482190a7175b9f3806a5fe4314a004fa69f988373f7a",
+          "sig" : "4f62daf7f7c162038552ad7d306e195baa37ecf6ca7604142679d7d1128e1f8af52e4cb3545748c44ef1ff1c64e877e4f4d248259b7f6eb56e3ef72097dc8e0c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "Random test failure 8",
+          "msg" : "5dc9bb87eb11621a93f92abe53515697d2611b2eef73",
+          "sig" : "deecafb6f2ede73fec91a6f10e45b9c1c61c4b9bfbe6b6147e2de0b1df6938971f7896c3ab83851fb5d9e537037bff0fca0ccb4a3cc38f056f91f7d7a0557e08",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "Random test failure 10",
+          "msg" : "7dcfe60f881e1285676f35b68a1b2dbcdd7be6f719a288ababc28d36e3a42ac3010a1ca54b32760e74",
+          "sig" : "7f8663cf98cbd39d5ff553f00bcf3d0d520605794f8866ce75714d77cc51e66c91818b657d7b0dae430a68353506edc4a714c345f5ddb5c8b958ba3d035f7a01",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "Random test failure 12",
+          "msg" : "58e456064dff471109def4ca27fa8310a1df32739655b624f27e6418d34b7f007173f3faa5",
+          "sig" : "6aab49e5c0bc309b783378ee03ffda282f0185cdf94c847701ff307a6ee8d0865411c44e0a8206f6a5f606107451940c2593af790ce1860f4c14ab25b2deae08",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "Random test failure 15",
+          "msg" : "a1",
+          "sig" : "1a74ed2cbdc7d8f3827014e8e6ecf8fd2698ac8f86833acccdd400df710fe0d6b0543c9cfa00d52bf024ab7ce0d91981944097233ec134d5c7abbd44bfd32d0d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "Random test failure 19",
+          "msg" : "11cb1eafa4c42a8402c4193c4696f7b2e6d4585e4b42dcf1a8b67a80b2da80bc9d4b649fb2f35eaf1f56c426fd0b",
+          "sig" : "14ceb2eaf4688d995d482f44852d71ad878cd7c77b41e60b0065fd01a59b054ee74759224187dbde9e59a763a70277c960892ef89fba997aba2576b2c54ba608",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "Random test failure 25",
+          "msg" : "aa365b442d12b7f3c925",
+          "sig" : "83c40ce13d483cc58ff65844875862d93df4bd367af77efa469ec06a8ed9e6d7905a04879535708ddf225567a815c9b941d405c98e918fd0c151165cea7fb101",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "Random test failure 28",
+          "msg" : "475f",
+          "sig" : "71a4a06a34075f2fd47bc3abf4714d46db7e97b08cb6180d3f1539ac50b18ce51f8af8ae95ed21d4fa0daab7235925631ecea1fd9d0d8a2ba7a7583fd04b900c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "edwards25519",
+        "keySize" : 255,
+        "pk" : "c29ec1894e06d27b4e40486b4fa5063d66a746c7f9c323b12203c03b72b8b78a",
+        "sk" : "56c1e22d616cbb6dea869288b4b1c02bb98696583c2f6e650013a03e17049c62",
+        "type" : "EDDSAKeyPair"
+      },
+      "keyDer" : "302a300506032b6570032100c29ec1894e06d27b4e40486b4fa5063d66a746c7f9c323b12203c03b72b8b78a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAwp7BiU4G0ntOQEhrT6UGPWanRsf5wyOxIgPAO3K4t4o=\n-----END PUBLIC KEY-----\n",
+      "type" : "EDDSAVer",
+      "tests" : [
+        {
+          "tcId" : 98,
+          "comment" : "Random test failure 6",
+          "msg" : "0f325ffd87e58131ffa23c05ea4579513b287fdba87b44",
+          "sig" : "6669acf94667c5b541afe5307bde9476b13ae7e0e6058a772101ac8eb0a94331428eb4db0a2c68a9b6c1763b8624dab259b0876cdcfaeacc17b21a18e3fc010a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "Random test failure 21",
+          "msg" : "5ffa",
+          "sig" : "931e5152fcef078c22cc5d6a3a65f06e396289f6f5f2d1efa6340254a53526ef5dc6874eeddf35c3f50991c53cd02bf06313e37d93ee1f7022128ffa3b8f300b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "edwards25519",
+        "keySize" : 255,
+        "pk" : "cfda5b899e35764c5229e59295fe1222b7ddce176643697c29e46ecbba10cf10",
+        "sk" : "b7d2f64276df417fed27d8e15b4e90f6fd93dace707294c338bd32bc4bbd8fdb",
+        "type" : "EDDSAKeyPair"
+      },
+      "keyDer" : "302a300506032b6570032100cfda5b899e35764c5229e59295fe1222b7ddce176643697c29e46ecbba10cf10",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAz9pbiZ41dkxSKeWSlf4SIrfdzhdmQ2l8KeRuy7oQzxA=\n-----END PUBLIC KEY-----\n",
+      "type" : "EDDSAVer",
+      "tests" : [
+        {
+          "tcId" : 100,
+          "comment" : "Random test failure 7",
+          "msg" : "ec5c7cb078",
+          "sig" : "30490c28f806298225df62103521dcee047153912c33ab8ab8bbdd1ffabd70fd4fdb360f05be535b067d1cf4e78c2cb432206bf280aab3bd21aaa1cb894c5b06",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Random test failure 9",
+          "msg" : "67484059b2490b1a0a4f8dee77979e26",
+          "sig" : "4cd4f77ed473a6647387f3163541c67a1708a3c3bd1673247cb87f0cb68b3c56f04bfa72970c8a483efe659c87009ab4020b590b6641316b3deddb5450544e02",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Random test failure 11",
+          "msg" : "a020a4381dc9141f47ee508871ab7a8b5a3648727c4281ae9932376f23a8e1bcda0626b7129197d864178631ec89c4332dbb18",
+          "sig" : "1e41a24fe732bd7cab14c2a2f5134ee8c87fcbd2e987e60957ed9239e5c32404d56977e1b4282871896cb10625a1937468e4dc266e16a9c1b8e9891177eca802",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "Random test failure 14",
+          "msg" : "a25176b3afea318b2ec11ddacb10caf7179c0b3f8eabbfa2895581138d3c1e0e",
+          "sig" : "2a833aadecd9f28235cb5896bf3781521dc71f28af2e91dbe1735a61dce3e31ac15ca24b3fc47817a59d386bbbb2ce60a6adc0a2703bb2bdea8f70f91051f706",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "Random test failure 18",
+          "msg" : "a9e6d94870a67a9fe1cf13b1e6f9150cdd407bf6480ec841ea586ae3935e9787163cf419c1",
+          "sig" : "c97e3190f83bae7729ba473ad46b420b8aad735f0808ea42c0f898ccfe6addd4fd9d9fa3355d5e67ee21ab7e1f805cd07f1fce980e307f4d7ad36cc924eef00c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "edwards25519",
+        "keySize" : 255,
+        "pk" : "529919c9c780985a841c42ba6c180ff2d67a276ccfbe281080e47ab71a758f56",
+        "sk" : "7d597c3b7283929d07ed8f01f31d2596823e5e46ab226c7be4234d1a9dcaef37",
+        "type" : "EDDSAKeyPair"
+      },
+      "keyDer" : "302a300506032b6570032100529919c9c780985a841c42ba6c180ff2d67a276ccfbe281080e47ab71a758f56",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAUpkZyceAmFqEHEK6bBgP8tZ6J2zPvigQgOR6txp1j1Y=\n-----END PUBLIC KEY-----\n",
+      "type" : "EDDSAVer",
+      "tests" : [
+        {
+          "tcId" : 105,
+          "comment" : "Random test failure 13",
+          "msg" : "e1cbf2d86827825613fb7a85811d",
+          "sig" : "01abfa4d6bbc726b196928ec84fd03f0c953a4fa2b228249562ff1442a4f63a7150b064f3712b51c2af768d2c2711a71aabf8d186833e941a0301b82f0502905",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "Random test failure 22",
+          "msg" : "25",
+          "sig" : "e4ae21f7a8f4b3b325c161a8c6e53e2edd7005b9c2f8a2e3b0ac4ba94aa80be6f2ee22ac8d4a96b9a3eb73a825e7bb5aff4a3393bf5b4a38119e9c9b1b041106",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "edwards25519",
+        "keySize" : 255,
+        "pk" : "2252b3d57c74cbf8bc460dc2e082847926bc022f09ab6ae95756362bfd1167c1",
+        "sk" : "f401cee4bfb1732f0e9b8d8ba79469565c3115296141dbdf7e9c311a0ac1823b",
+        "type" : "EDDSAKeyPair"
+      },
+      "keyDer" : "302a300506032b65700321002252b3d57c74cbf8bc460dc2e082847926bc022f09ab6ae95756362bfd1167c1",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAIlKz1Xx0y/i8Rg3C4IKEeSa8Ai8Jq2rpV1Y2K/0RZ8E=\n-----END PUBLIC KEY-----\n",
+      "type" : "EDDSAVer",
+      "tests" : [
+        {
+          "tcId" : 107,
+          "comment" : "Random test failure 16",
+          "msg" : "975ef941710071a9e1e6325a0c860becd7c695b5117c3107b686e330e5",
+          "sig" : "af0fd9dda7e03e12313410d8d8844ebb6fe6b7f65141f22d7bcba5695a25414a9e54326fb44d59fb14707899a8aae70857b23d4080d7ab2c396ef3a36d45ce02",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "Random test failure 23",
+          "msg" : "80fdd6218f29c8c8f6bd820945f9b0854e3a8824",
+          "sig" : "e097e0bd0370bff5bde359175a11b728ee9639095d5df8eda496395565616edfe079977f7d4dc8c75d6113a83d6a55e6e1676408c0967a2906339b43337dcb01",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "edwards25519",
+        "keySize" : 255,
+        "pk" : "c0a773110f975de3732355bb7ec7f0c41c091c0252966070205516693b992a4a",
+        "sk" : "3d658956410377d0644676d2599542412a4f3b0e4eadfb7f3f836615f42b18bc",
+        "type" : "EDDSAKeyPair"
+      },
+      "keyDer" : "302a300506032b6570032100c0a773110f975de3732355bb7ec7f0c41c091c0252966070205516693b992a4a",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAwKdzEQ+XXeNzI1W7fsfwxBwJHAJSlmBwIFUWaTuZKko=\n-----END PUBLIC KEY-----\n",
+      "type" : "EDDSAVer",
+      "tests" : [
+        {
+          "tcId" : 109,
+          "comment" : "Random test failure 17",
+          "msg" : "",
+          "sig" : "0280427e713378f49d478df6373c6cac847b622b567daa2376c839e7ac10e22c380ab0fa8617c9dcfe76c4d9db5459b21dc1413726e46cc8f387d359e344f407",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "edwards25519",
+        "keySize" : 255,
+        "pk" : "54cda623245759ad6d43e620a606908befc633d60792bc7798447a0ef38e7311",
+        "sk" : "bccb61323840c2a96fc36f7e54ea6c8e55f9d221f7f05791ed60025e06064439",
+        "type" : "EDDSAKeyPair"
+      },
+      "keyDer" : "302a300506032b657003210054cda623245759ad6d43e620a606908befc633d60792bc7798447a0ef38e7311",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAVM2mIyRXWa1tQ+YgpgaQi+/GM9YHkrx3mER6DvOOcxE=\n-----END PUBLIC KEY-----\n",
+      "type" : "EDDSAVer",
+      "tests" : [
+        {
+          "tcId" : 110,
+          "comment" : "Random test failure 26",
+          "msg" : "27e792b28b2f1702",
+          "sig" : "14d9b497c19b91d43481c55bb6f5056de252d9ecb637575c807e58e9b4c5eac8b284089d97e2192dc242014363208e2c9a3435edf8928fb1d893553e9be4c703",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "key" : {
+        "curve" : "edwards25519",
+        "keySize" : 255,
+        "pk" : "2362bac514d5fad33802642e979a1e82de6eb6f1bcbf6a5b304f2bb02b9e57fe",
+        "sk" : "f2d3023b9c19e241748bc4039a7a43c595701f23675505015213a8a2a0274c1b",
+        "type" : "EDDSAKeyPair"
+      },
+      "keyDer" : "302a300506032b65700321002362bac514d5fad33802642e979a1e82de6eb6f1bcbf6a5b304f2bb02b9e57fe",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAI2K6xRTV+tM4AmQul5oegt5utvG8v2pbME8rsCueV/4=\n-----END PUBLIC KEY-----\n",
+      "type" : "EDDSAVer",
+      "tests" : [
+        {
+          "tcId" : 111,
+          "comment" : "Random test failure 27",
+          "msg" : "eef3bb0f617c17d0420c115c21c28e3762edc7b7fb048529b84a9c2bc6",
+          "sig" : "242ddb3a5d938d07af690b1b0ef0fa75842c5f9549bf39c8750f75614c712e7cbaf2e37cc0799db38b858d41aec5b9dd2fca6a3c8e082c10408e2cf3932b9d08",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/kw_test.json b/third_party/wycheproof/testvectors/kw_test.json
new file mode 100644
index 0000000..e506339
--- /dev/null
+++ b/third_party/wycheproof/testvectors/kw_test.json
@@ -0,0 +1,1484 @@
+{
+  "algorithm" : "KW",
+  "generatorVersion" : "0.4.12",
+  "numberOfTests" : 162,
+  "header" : [],
+  "testGroups" : [
+    {
+      "keySize" : 128,
+      "type" : "KeywrapTest",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "key" : "6f67486d1e914419cb43c28509c7c1ea",
+          "msg" : "8dc0632d92ee0be4f740028410b08270",
+          "ct" : "9de453ced5d4ab46a5601708eeefefb5e593e6ae8e86b26b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "key" : "a0b17172bb296db7f5c869e9a36b5ce3",
+          "msg" : "615dd022d607c910f20178cbdf42060f",
+          "ct" : "8c3aba85cc0ae1ae10b36658b068f595baf8caafb745ef3c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "key" : "0e49d571c19b5250effd41d94bde39d6",
+          "msg" : "f25e4de8caca363fd5f29442eb147b55",
+          "ct" : "1de093654826f18fcd0f3fd499416ff22ed75ee12fe0b624",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "wrapped key is longer than wrapping key",
+          "key" : "e0e12959109103e30ae8b5684a22e662",
+          "msg" : "dbb0f2bb2be912a20430972d9842ce3fd3b928e573e1ac8e",
+          "ct" : "9c3ddc23827b7b3c13105f9e8b11523baccdfb6c8b7e7825496e7a840bd32aec",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "wrapped key is longer than wrapping key",
+          "key" : "dd583d9f1059861430ec8b5d8a180e9b",
+          "msg" : "f2e34f356362a31b51d6e02bcd333c9e6170494ca5ff5487",
+          "ct" : "afb744aaf746dcc0b57f8b378c404cbe877f44cf3d45140d60814eda3f541f01",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "wrapped key is longer than wrapping key",
+          "key" : "faf5ccfae42b43cee2c5f0f3177a7c5d",
+          "msg" : "4e02084833660c463830483b36dab866c64c8cf7429cac3d",
+          "ct" : "cff98cd64cb51ab99b81aee82cee4274d0df3e1b6a4943d39236ea989846d0cc",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "wrapped key is longer than wrapping key",
+          "key" : "c2b9d23f2831ddcdeb456853d4014db9",
+          "msg" : "f4cfea98e58b939cc859554385cf3a6c7f8217f728efb431c964786de8274907",
+          "ct" : "58dcfb0e7ec4d3bc8003418d865fbd520c6b24b2bde35b1be5b1c5ff32a130f33d035e5932616083",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "wrapped key is longer than wrapping key",
+          "key" : "620a08f320cdedbf7ae551add348d95e",
+          "msg" : "cec34eaf8e67e1ce619ddfc309531c42f16033a7e2cbc4f5eb3a548164e9b291",
+          "ct" : "4ee47bd68d418586c447a39111e2ec1502ff0f1726ea91c5d97370409d89b8e66e889b638ac40ced",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "wrapped key is longer than wrapping key",
+          "key" : "ed089ac274f8c7cea2415671a94b5e53",
+          "msg" : "6065e41df14daeeefacac5daeb7674cdc9c1f686013b797153e80ef215893299",
+          "ct" : "d3b093fd822ce454ebc251c6f21fa71c3858ee7e623ecbfbbf887398a30b40c55d0565c7a15e4015",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "Round counter overflows 256",
+          "key" : "31cacbb17d6dbbecae40727c5048fe0c",
+          "msg" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "222deadde6efb760cae42fa188310e0c07e7d557529766444a9efb330907d42f0dd8f3d17b3a38bf40d68c095a9cce19daf907bf2c92f1e59b18b277ff0397fc50f45f582db936aa8afb943de01b58abfdc81daef4e038c99e4c1eb3ee447464bb8f89a4ea81e56556cc26c72883c06a7fe850d04347d68bbadc4a06775030676db8cc34aeb07e39c7f059c2bff76a7f2baf076749004ef7189f887f89029f88c5c1d0f5ee62320b423048e2ad8186e63be23c553f5576a40d967e8b527ccd783c41abc64bea1aec8a76deb3e9c9a6656756e1dac38bd25ff008888a5591af763fd73f5addd749794817070990484654a46ef442adaeacab14d12daaf87bcb91661a21593717d9b93529d813ea5fc812d708c0d8e9b68122d9f5e6267cde363780a45d07e4caa5bf14f2334f25b9d177632bb80a82894aa47b6f360b2da1138dedd4331f077c900554c7a68b5d154980bb3517ac20a78a51f6f21e42b2c4c960d31cbd22bd610819182c5e456ba7d7e903f5e60f6e0c4cc014feb4f81973ce48ad6f4dab8da51eb7",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "empty keys cannot be wrapped",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495",
+          "msg" : "",
+          "ct" : "a6a6a6a6a6a6a6a6",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "keys of size 8 byte cannot be wrapped",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495",
+          "msg" : "0001020304050607",
+          "ct" : "dc26fb6911d71971df0356d6bb9ed6e6",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495",
+          "msg" : "00",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495",
+          "msg" : "0001",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495",
+          "msg" : "000102",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495",
+          "msg" : "00010203",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495",
+          "msg" : "0001020304",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495",
+          "msg" : "000102030405",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495",
+          "msg" : "00010203040506",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495",
+          "msg" : "000102030405060708090a0b0c0d0e0f10111213",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7",
+          "msg" : "",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7",
+          "msg" : "",
+          "ct" : "9f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7",
+          "msg" : "",
+          "ct" : "dc9e9580",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7",
+          "msg" : "",
+          "ct" : "b9b282d138693000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7",
+          "msg" : "",
+          "ct" : "0efc635b2d61e244056b9d4591ca6b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7",
+          "msg" : "",
+          "ct" : "4a305dae087b0d24d62af41831338f33ae",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7",
+          "msg" : "",
+          "ct" : "82cb927097cf31ea4affea440b0d8ca6a240b900",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "bytes appended to wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "ct" : "9790ab51fbcb850df6764e011ae97c85785bed2633aea66500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "0aac329ccd513edbdd6367df67999eaac9e7b51984c4d38d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "5a55dc429749ca49bb4ab01d966b19ea9a9e1402e6ab2962",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "45f533f6072f640eb7e1e512d56072085567f4ad6012a97a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "84f284565df47c409107f7a0a71bc370a8ed4489d414b9e9",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "3941c366554fc896e9fe52f02493ca03d439eb17c236146d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "45c9d42363d981d086a972728e130a42f5dd90bda562a85a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "037d17859519d6c0728a9eb6e64113e86919decabd3bbb88",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "1ad10af7f6c042b267a0c7bc4d25d27c003deb50e2cc566a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "630c571b7fb8647ac5360a255f9f5d3645795ac45285cbaa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "16db553e467d4029d0fea62b2c440e5df6c6591f0497a99d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "097991090a156047d4784b757f262e12ce57e13a3d5d286c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "3957c338b750a3285eb7b65c9cfe77053dd7d8149f42caa1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "RFC 3394",
+          "key" : "000102030405060708090a0b0c0d0e0f",
+          "msg" : "00112233445566778899aabbccddeeff",
+          "ct" : "1fa68b0a8112b447aef34bd8fb5a7b829d3e862371d2cfe5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "keySize" : 192,
+      "type" : "KeywrapTest",
+      "tests" : [
+        {
+          "tcId" : 42,
+          "comment" : "",
+          "key" : "f75a2f49a630c7dc91626b00ce029f0bd2981d7c74a93ebe",
+          "msg" : "9adbc00c710b1101bdf6a4ed65b32d72",
+          "ct" : "00be1caddfd5ad7697877017795f9cee4bce5a61687a6126",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "",
+          "key" : "b713f6b7814f98894d7b153974684359f1460213eb74be68",
+          "msg" : "78585f0c49922e82caf17ebc3721b4db",
+          "ct" : "54e7f278b5a1fb4c31a0d79ac1f615edd910bf22015a0668",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "",
+          "key" : "13ecf423211caa334ba6db37259a535c20de8ad10fc8c432",
+          "msg" : "4fc75d0f221e22408a37e11265d49a05",
+          "ct" : "510455bd9c078ac1f07bb3752cbd04e421b0dd635190fa62",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "",
+          "key" : "4417fbbea51bdd91818d74051957dd70e135c5cf3732bdf1",
+          "msg" : "f5357da9f8fd4a1190f36e9fa09a90fcf14d87d62332f1a5",
+          "ct" : "880da5b410f913ad72cc93f46344f1152165bdea14664fd2d3afbd87b8cc5cfd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "",
+          "key" : "b3f26d8a22fdd61f709841231fbde695b3f28dddced6d41e",
+          "msg" : "0d0af955d2e3829cc3d643219b301e64e0510dfbc428119a",
+          "ct" : "27654cf6a63d6004ae83da54c2e5d7b5fad20878f350087ddd17ac44a2be868f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "",
+          "key" : "f70cfb262c729a18206c8afd74356ec7e049d10b44a6e000",
+          "msg" : "241cedfa64c4e7bec541a2eb4c368269e0f0ddebc58267ea",
+          "ct" : "ad7ca66ad4664f43e4dd09296a6e6f02d5af4408f225c0abeb0d9b76c8d1e982",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "wrapped key is longer than wrapping key",
+          "key" : "1639f9f81e53e2eeb677a249e5eced3af108971301601a7b",
+          "msg" : "ec3c6a1f1a9585327fe658490c74635e5300876da5846a629398984fb551d691",
+          "ct" : "e245c90a6b46caece94f47117d608331958c8f75f531ebcdc902c0213d9105f2155af07daa62d132",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "wrapped key is longer than wrapping key",
+          "key" : "1f22d5658aa685b8ba8659dc342880d5b2399e6a815005b0",
+          "msg" : "50be4c1b2f29a63f44d7fc63737f600f0194ea3fb36e173d2ddd19f218656380",
+          "ct" : "8a32b9f207ae5aaedb7e8a0d945107412c1bd06999bc5ac83c1f958dfb77ebdcf9d98c60dbd4650a",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "wrapped key is longer than wrapping key",
+          "key" : "3a2f4aa50441954bba5a1836294ce071f9296b23dbed6771",
+          "msg" : "65da02ff21b483a1e39575490b4319e84ae0299f1f00b3859fbe2e74b3ec2aaf",
+          "ct" : "4a5842b10d2db96ea1039ef4785ce722555b3751a9b6dd39126ad363378c72320d83ea7adb81615a",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "Round counter overflows 256",
+          "key" : "31cacbb17d6dbbecae40727c5048fe0c01bc53b23ab63502",
+          "msg" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "e2192598e6124f2791b2751f930958435bb1d02e98aa1e09781bba0b159435db659fa73fa310111704692c68e16ddf4be06022c52fe9dba6279aad1aeb814125d0ddf33f31e58e625af32305050cfea390d8782d32caac558889ca8e641908208da6976542b40dbd090178e2a6812a436c18a5e891ac8083176ace1ddfee4d382856a59c80c643ecd5c1ab68c66b2b8984ce6e0e386f6554a9cb91d363bb4accf028878ec20b8b2e37214f7b12dbcd78fb38f711a90fe262c78491b9058354e27b34fc92ef0d7028594cb08259f86b54cb1d317ec55f2ef2ab7e8b141671f8bcb1a90bb7d82bc8cb4fb02c9ce430ef4ae0dc847e91e7d4fb463eb9dd87fc9dc9568f3a4ef504d74c134dcb60ca01b36ce10cb467268ea297c0518a50d12cc025cfeea1381ddd7dd63e4ac94890a0eae9dbd8db244625a3c8af2e1aff6a8112c4d3d98e8263588ee1dd9063b709b8ec00474c4ea413a802b8cde814e7b3731410809ed000060fb7b9b0bf8509ef17515f333e868b188ea16445f380b3a7d42774f6456cdf724246fa",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "empty keys cannot be wrapped",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76",
+          "msg" : "",
+          "ct" : "a6a6a6a6a6a6a6a6",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "keys of size 8 byte cannot be wrapped",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76",
+          "msg" : "0001020304050607",
+          "ct" : "38d8238cdb0d9a2da28d6d56194f2e78",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76",
+          "msg" : "00",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76",
+          "msg" : "0001",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76",
+          "msg" : "000102",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76",
+          "msg" : "00010203",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76",
+          "msg" : "0001020304",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76",
+          "msg" : "000102030405",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76",
+          "msg" : "00010203040506",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76",
+          "msg" : "000102030405060708090a0b0c0d0e0f10111213",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd97",
+          "msg" : "",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd97",
+          "msg" : "",
+          "ct" : "9f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd97",
+          "msg" : "",
+          "ct" : "dc9e9580",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd97",
+          "msg" : "",
+          "ct" : "b9b282d138693000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd97",
+          "msg" : "",
+          "ct" : "0efc635b2d61e244056b9d4591ca6b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd97",
+          "msg" : "",
+          "ct" : "4a305dae087b0d24d62af41831338f33ae",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd97",
+          "msg" : "",
+          "ct" : "82cb927097cf31ea4affea440b0d8ca6a240b900",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "bytes appended to wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd97",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "ct" : "55dfb2f7e0c1ea04fead897c451c0505921dc47f308c491700",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "9b1593fd7d4fe25a660bbc1976ea4ab68bcc53f848a8eb9d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "e7edb847fa91e2deded726edf3ab93da91151697425fee28",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "1b51a7c033c1efb5ee2994259c40f03bb57d8cc09e507e6e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "c40b614a5062f5fd049c5379b3e8141614c2da97893589fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "d7575ef02df54b3086eb49035eeafbce0e08336e89b35ab0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "0d617f1c12485a35917d2a941e949d2fdbf03a346889b850",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "c7df34729174db2e83ee16c6de74d5eb9766715fad049b40",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "c3ed38d6f9ccb9bf3c56bb3176f00d3ce9887521f8d4c70b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "6582b5f4652744b0537e97e7cdae0f443130140dbaea604c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "fc9b9bdf25f2b48ad79934c8d34897cdbf4c846f8cb4b11d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "fc23c7f4fe20aa81105efc1a7105a5316b23399ac792c824",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "37b4a261b96bcec9cc93eef5b2fbbbe84634f978c5893dda",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "1831109847d17d010bfcd93fb46f3150cdafd52733db74c221b034fe8e1552c0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "2b2b89c3c6b2db4903877ad4622ca33f3a3cb7e6701d1340e6afc0fdab7dbd72",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "3c6903f37da57161af6706050a2ed747cd55344d869189fd49d2536ff948129d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "8a8dc8b131c6b968b60c1dd819a655392d1a96d6cafa48e30fb1146f096229c6",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "303e0b3602d514a7d52edba3306d7383e8999e7c652a510335a8949efb42eb66",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "319befbf2ddbb475723fb2fa30f2ae7fc1ceb1e6f361715eca7209608873c7fc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "9b3e440341c5da131559959db6b3553a534691162f4f009327bf2c21d6fe5ada",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "eba6cc0959e6a56339b141629840add80f4565656dc687a3b996960c994dfd26",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "b703b6cf4587709353c7e4004d3da61ce5f5deaf7163ca9d6158dde919e0ac34",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "72549d52d6f4ff912d833c74136d90634ce8afa4f84412bbee8074084d4cecff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "1337c8bd6c8a5dd43aba8d298864ffe76ad6ea909f3488157a15e6c46acf2214",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "4aaffaca5fe85814d040aa2a306ba4d1d44746cfe46c978aa057b53fd25316c1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "RFC 3394",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "00112233445566778899aabbccddeeff",
+          "ct" : "96778b25ae6ca435f92b5b97c050aed2468ab8a17ad84e5d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "RFC 3394",
+          "key" : "000102030405060708090a0b0c0d0e0f1011121314151617",
+          "msg" : "00112233445566778899aabbccddeeff0001020304050607",
+          "ct" : "031d33264e15d33268f24ec260743edce1c6c7ddee725a936ba814915c6762d2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "keySize" : 256,
+      "type" : "KeywrapTest",
+      "tests" : [
+        {
+          "tcId" : 96,
+          "comment" : "",
+          "key" : "fce0429c610658ef8e7cfb0154c51de2239a8a317f5af5b6714f985fb5c4d75c",
+          "msg" : "287326b5ed0078e7ca0164d748f667e7",
+          "ct" : "940b1c580e0c7233a791b0f192438d2eace14214cee455b7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "",
+          "key" : "0dda6da5123e2c37c6fa16ba0d334cd01acd652f8994211751dfab4faac2fc22",
+          "msg" : "b40b6828729b456322a8d065abc0d081",
+          "ct" : "939b3389336fea4a9751bf014ef18011323090e8a0500bc4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "",
+          "key" : "d6925914cd06308f81ad91e23073593d99d4e50351b20eb2a8d1a1ac4ced6588",
+          "msg" : "037b27b3dc95b19d15bd4091e320bfe1",
+          "ct" : "59ee8e5198861237f682edec6ba906526c016d4d935942bd",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "",
+          "key" : "07518a82cbc8da1dcec55f3763a206d277487abd03cedd0b8bef9ee2fb157121",
+          "msg" : "faa4664d79fce3c7d2fdd462f6c1c423c2f8e6b69be2e071",
+          "ct" : "1ab53a065d8f776a08b33e51383071b6f154612116655137bd3b7ec29b70fd56",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "",
+          "key" : "ea46991d4e71f53dd624e7fe7fde11944a7c5942d232369b8065d42b8cd2dde1",
+          "msg" : "dffc5cf1dd5411d015d84601fa38df5effe885c7f26a4825",
+          "ct" : "a1bf8e73e3fa1db759f0ab2ab0b1ca6f2c85b63d83e25f7a0b5293d0a216a2b7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "",
+          "key" : "fdcfa902c6f222f527af84da533b14b52e2615da3a89d1d35708b0cd49f60d87",
+          "msg" : "966b07047354966a703e79607b556032f4f596b7f9206f05",
+          "ct" : "27308a0e1a6c0a1d15d6174ab7d68675207b615df16fcf7a3c69b25f551cca9f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "",
+          "key" : "38e1b1d075d9d852b9a6c01c8ff6965af01bac457a4e339ae3e1d7b2ffacc0cd",
+          "msg" : "80ad6820f1c90981e2ca42b817a345c1179d0a11d8e23a8adc0505e13d87295a",
+          "ct" : "7155ee932b0358d98182a23f7f427c774ab340a4757d0b6a63facd3de90578438cf03201c3f88057",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "",
+          "key" : "c641f1689d81caa8ba37d895272240664054ed974cfffc40e6c5c0cad1b916c7",
+          "msg" : "3fd0ba19955e46749f54d88e99d080b7339d588fe612ec0f4021ca3ca2104270",
+          "ct" : "f20b9b553bc0847529f8d4379fa909211e68249bd429f436c615c4c4a5d9f1a1968f0b89c5237b30",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "",
+          "key" : "aa0ab9d68ed4a04e723f81b44c0c88d0bcde7a80cfd476eb4b8836d9aa01ec4c",
+          "msg" : "57faa8766f6d6a0aa1cf643f857c150df5b31303b50af480e21c4b5e8c8a15d5",
+          "ct" : "2811716854a214aecdd318c6670b9b2a7511713c9a0c0fa805230ff05cf84af795dd72f6c1a44512",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "Round counter overflows 256",
+          "key" : "31cacbb17d6dbbecae40727c5048fe0c01bc53b23ab635025cbac1ecf52ca495",
+          "msg" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "5322bc62bd8379abbb75f69688b8f00e31962b8f9ae1e89771952d8a2a749e1352ec33b5435a674271b314760ab9f753b16726185ec7d319ac60531355344c1d53c7903000a8039eb40f70564a0ad3f41b2355ea5dfa6a1d46392f1d106a5da569bfb0493bf7c12dff04bafeae377df4bb47cd440b6f60fbab2a54a98551b76273e02cac8d7be9f2343d3abb2a23af1c91a7011c67a7907260116b67d510aabe5c7ca46c1c20f77106c45966583b3e4ed799a47ee19bb4223209265c2b1ac8183a678ff43bc9a3470a50b9ee4d10f60674268d72c68be003a0d9dd6849aba836fe8a1792b81c90e12945bfe1f27a9c6b2af66a063cdb7721a7f23fb30afdbd8b18db377dd1697f157be81c1578d08b066c71b0c5ca7feecac1cdd938cf9ad525f74844660908194b28e54eddb158f6e4c921b811d90db71a92ff872db2250dcc3f847fc752b66d77e33c85084d3fa53b4f30503d2a06e6cabb9033d59fc1dc15e32f19846a039b91597b0ba3141a7d9717630062170117b2131dab77406e9ed7d66b2c754d849c60",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "empty keys cannot be wrapped",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76a51aac96038ad692",
+          "msg" : "",
+          "ct" : "a6a6a6a6a6a6a6a6",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "keys of size 8 byte cannot be wrapped",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76a51aac96038ad692",
+          "msg" : "0001020304050607",
+          "ct" : "181ba6a3a4392469e3de98ddbbdd2432",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76a51aac96038ad692",
+          "msg" : "00",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76a51aac96038ad692",
+          "msg" : "0001",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76a51aac96038ad692",
+          "msg" : "000102",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76a51aac96038ad692",
+          "msg" : "00010203",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76a51aac96038ad692",
+          "msg" : "0001020304",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76a51aac96038ad692",
+          "msg" : "000102030405",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76a51aac96038ad692",
+          "msg" : "00010203040506",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "wrapped key size must be divisible by 8",
+          "key" : "574957151fc2afe0fa3dc7a9a7da6495398f18ea0d8eed76a51aac96038ad692",
+          "msg" : "000102030405060708090a0b0c0d0e0f10111213",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd978e3bd2defc1c10d7",
+          "msg" : "",
+          "ct" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd978e3bd2defc1c10d7",
+          "msg" : "",
+          "ct" : "9f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd978e3bd2defc1c10d7",
+          "msg" : "",
+          "ct" : "dc9e9580",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd978e3bd2defc1c10d7",
+          "msg" : "",
+          "ct" : "b9b282d138693000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd978e3bd2defc1c10d7",
+          "msg" : "",
+          "ct" : "0efc635b2d61e244056b9d4591ca6b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd978e3bd2defc1c10d7",
+          "msg" : "",
+          "ct" : "4a305dae087b0d24d62af41831338f33ae",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "invalid size of wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd978e3bd2defc1c10d7",
+          "msg" : "",
+          "ct" : "82cb927097cf31ea4affea440b0d8ca6a240b900",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "bytes appended to wrapped key",
+          "key" : "fe60fc8df7d9f4ebb5416ca4e82182f7e9923a746110fd978e3bd2defc1c10d7",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "ct" : "7dfbd7cf6158d75bb5900b3bf1e3871003402a6508b1912800",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "a417671bc62a23c7a65543092124024df72c048d8db330c7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "9518d0f99d7a73ed4a502b449c14c285971b0e6177ce0eca",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "f3511f0491bd74ae1defb5307f0e18db864b57b5c404d428",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "6c03ce779259661c43d41d5d0e45687f874353bba516c73e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "8df01969a11c87026535bfccf72b1d064c86ecc7e5227157",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "8ed1cde228d9c8d046dca65c7a27aef2edf8ae90c705d1e9",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "d69b3e34e9de38d44de1998992362a6fa1f696b5acab3f10",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "67865122af3294b8da0588775125cbd6dc19d5e5cab97b6d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "9f0fa52363dd55df472d867e6faf5da8eb204a1d6d497030",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "c399f999c96a4204325e7f08d6a4de256faf21ec2c007ddf",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "282082264a87dc35ce1cc5b9931b77d80d82fcacc0927f85",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "c192c90b83003ca96744498014b6ad6bedda837955269819",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "30a983cd9e69d561acc95c42b252aba4185f8392f2e6c935c8eb105af8082e34",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "4de9a639b799630b45b49e28dbfc44dabb9843ee588a8cff286b8d5fbd7b32ee",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "d915b2cdfb769d9d82259dc3d124646bbf972b83efd4c2eae9b9f751073f78d6",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "117d653f480b69fce564f1fe99572492945189ed5af789ce05a2651baf90bb5e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "8226d07a2f919e24ada1081c69a75520be895e3a2bda9b805d9747773ddeaa38",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "b0a74345bedf8865348daf45d054b99ce515ea8be136270d1cf71e1cfa7aa4a2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "a261db77f17f7ec736d1a8be16e5f9ae432fe2a17012e5a6f07c5426a9f0ca59",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "c53acb5e096b54548e1385b2ff18eaef68d235c95b0194e74a2383d3a7a530dc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "faef482d99ebb180e5bc5e3cf775ba292c2a3b6c44aa4a21ad400906f11af392",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 145,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "73a450b63b07b3aece9d1ae5bf097a3dd3fcf73e3ec2f1bd8fc3b5586cb9bd73",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 146,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "d34b6ee184d387c9aa4b2d180ae0a89498014e55fe8e416be4f826fcf7d56522",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 147,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "2af823d1602803740bfa9040c2c4e769a5b6de919d403cfba9ad360f63af1113",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 148,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c",
+          "ct" : "dd78ebd3091c55a5da5b24504200f7fadd1b3ac6ad35f814f733e603c13936245d69d83f262f6b1e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 149,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c",
+          "ct" : "3d8338eae7de322399e1d1b4a3df54326b242b563612ea4b27da22a041d3c80966911bc009911761",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 150,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c",
+          "ct" : "d04bf75cadd3b5f099c34b27a91e64a8f2dbcf08e8c5c1c9f07a777eeb805d5d0e8c5c01afc43944",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 151,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c",
+          "ct" : "be0c5d193b61c5137a8fd8a6d7d1ed8f0fa28cec516f544697c12add4f8f4d5cfca65edeb1019974",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c",
+          "ct" : "a83ebcbeb2be9d6807b5cfc31c89849d1343dd4eb22e5bfe9e2b2b3790ad8900601f1f5d54fd472f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 153,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c",
+          "ct" : "416221485a6cb98ad1342ea9a12926a9a133ead8bd919323fe789bb8f89a4fcaf81e1be54f9d358e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 154,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c",
+          "ct" : "bf6a53286fac48e7f25d89b7056b27aa917d5b54c0d3171dff369f7249153bf09da5891eb4dc2d88",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 155,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c",
+          "ct" : "99d517a1321bb633b0d5f3afda2372d3abf68b41d13cbfdffc78f173b88bc4b97efcab2b2904788d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 156,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c",
+          "ct" : "d92456bc77a268ef71cba76064a1b772d1fee2ae4f0ee3bb932a2adb2b031796b9eadb51753f2868",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 157,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c",
+          "ct" : "5bb54630ab8d73a040f0f87e70e263d1aeb2358bcdc0dce6994d0d874452bbd8741b7ec1d59d8298",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 158,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c",
+          "ct" : "4581d6536039db1b23da50c648777e90c82d6128bb92e28b2974bae1141543a19a1592fda1fbd61f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 159,
+          "comment" : "Incorrect IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce34973526908c",
+          "ct" : "d35bc67e62064c34f48150999ba30ded475d8c75978f45737320f23edaaa7a40d7803fc61add34a4",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 160,
+          "comment" : "RFC 3394",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "00112233445566778899aabbccddeeff",
+          "ct" : "64e8c3f9ce0f5ba263e9777905818a2a93c8191e7d6e8ae7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 161,
+          "comment" : "RFC 3394",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "00112233445566778899aabbccddeeff0001020304050607",
+          "ct" : "a8f9bc1612c68b3ff6e6f4fbe30e71e4769c8b80a32cb8958cd5d17d6b254da1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 162,
+          "comment" : "RFC 3394",
+          "key" : "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+          "msg" : "00112233445566778899aabbccddeeff000102030405060708090a0b0c0d0e0f",
+          "ct" : "28c9f404c4b810f4cbccb35cfb87f8263f5786e2d80ed326cbc7f0e71a99f43bfb988b9b7a02dd21",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/kwp_test.json b/third_party/wycheproof/testvectors/kwp_test.json
new file mode 100644
index 0000000..014549d
--- /dev/null
+++ b/third_party/wycheproof/testvectors/kwp_test.json
@@ -0,0 +1,2042 @@
+{
+  "algorithm" : "KWP",
+  "generatorVersion" : "0.4.12",
+  "numberOfTests" : 224,
+  "header" : [],
+  "testGroups" : [
+    {
+      "keySize" : 128,
+      "type" : "KeywrapTest",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "key" : "6f67486d1e914419cb43c28509c7c1ea",
+          "msg" : "8dc0632d92ee0be4f740028410b08270",
+          "ct" : "8cd63fa6788aa5edfa753fc87d645a672b14107c3b4519e7",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "key" : "a0b17172bb296db7f5c869e9a36b5ce3",
+          "msg" : "615dd022d607c910f20178cbdf42060f",
+          "ct" : "e8bac475d1429034b32f9bdeec09a37f9b3704028f1e0270",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "key" : "0e49d571c19b5250effd41d94bde39d6",
+          "msg" : "f25e4de8caca363fd5f29442eb147b55",
+          "ct" : "4c8bcd601b508ef399f71b841294497a4493c4a0014c0103",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "wrapped key is longer than wrapping key",
+          "key" : "e0e12959109103e30ae8b5684a22e662",
+          "msg" : "dbb0f2bb2be912a20430972d9842ce3fd3b928e573e1ac8e",
+          "ct" : "9e4510cc84c4bd7abab0a8a5d7f1e6ff3e6777ca2dff9be7e223652239fe57d8",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "wrapped key is longer than wrapping key",
+          "key" : "dd583d9f1059861430ec8b5d8a180e9b",
+          "msg" : "f2e34f356362a31b51d6e02bcd333c9e6170494ca5ff5487",
+          "ct" : "8fbf39ae583bd4efa7a3e8f7b86870b34766ae7d8923a8e97b0cd289ad98cacb",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "wrapped key is longer than wrapping key",
+          "key" : "faf5ccfae42b43cee2c5f0f3177a7c5d",
+          "msg" : "4e02084833660c463830483b36dab866c64c8cf7429cac3d",
+          "ct" : "df2fbe5fa86418edc7b5b04a4aea724aca17e88cedc84ca8b0b0f048e64590cb",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "wrapped key is longer than wrapping key",
+          "key" : "c2b9d23f2831ddcdeb456853d4014db9",
+          "msg" : "f4cfea98e58b939cc859554385cf3a6c7f8217f728efb431c964786de8274907",
+          "ct" : "67f8edf57f84ea0a35b35511d67d3f299c9984b2c07d3809c3d7f5f45091f1a8fbb937ed447677f6",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "wrapped key is longer than wrapping key",
+          "key" : "620a08f320cdedbf7ae551add348d95e",
+          "msg" : "cec34eaf8e67e1ce619ddfc309531c42f16033a7e2cbc4f5eb3a548164e9b291",
+          "ct" : "60d55a22ba7dbd7d8f317388e01e6be561d15d29f85c566f1259aa7e7dc3d5d30e0ef5f4c6267553",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "wrapped key is longer than wrapping key",
+          "key" : "ed089ac274f8c7cea2415671a94b5e53",
+          "msg" : "6065e41df14daeeefacac5daeb7674cdc9c1f686013b797153e80ef215893299",
+          "ct" : "d78a8291108f0f2d8be0ec10ec08240bf4d3021f0a5ed7faba0748db73762f34a0504bd373212df2",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "Round counter overflows 256",
+          "key" : "b6121acad51038e11873aaa7e6c7be06",
+          "msg" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "9341221aca1c647e2afc2bdd9cf4ed6e60058eb0a84cb3fc2daf3a87d9fad0a1f8268b27aaf7201d705e72f7e2240309ad98742094e3f1c99b7faa9ae181b441f5004b8bc93cdd4160d403d0884749a3c379d47c112a45788c05c2106c98f59758d393e04c880691b0e8683a12df7f876e1e1f68b4acbae9cc8310b34d59ccf4617cee72e845df1e0e32e5b4938f2923d55f1bb5156dd8c787401e6ef241ea4073d0a59ddfcd7a53db5d89b480b030cfb9084ea8479b964f090bb612d5251eee9ef8870a45f1e76fd24abdd9b350fe148b15a4cfeb032d57b5743b3548a7ce9eec8e21a31ce832530edfd1cffd9bb37369e6463c6b373ab60d80b0a2677e92e658f7daf2a5234b7312bf2d967cd0bc809e9be2f706ae63bd632fd611f161e48ee19677f3243aa0e91f6651a1cef62feff7a72eedf830bae1dc6d89e55ccb5e6f97889c6266f7d3f2eb0aea6c8c42200febccc5916825368adc87e04e835de06fd7bc2805c219e7f0b6252563f29969b1f30cfa1a8da4b90ae7534fb849d068a7e77de7360f8af173",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dca",
+          "msg" : "",
+          "ct" : "a65959a600000000",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dca",
+          "msg" : "4c",
+          "ct" : "09bcbab50b8dd45ad83412e2919030d3",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dca",
+          "msg" : "be52",
+          "ct" : "0cbe852cdce4f0b5333366f446b2b1c5",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dca",
+          "msg" : "2d5244",
+          "ct" : "a9dc66e03435ab3d4f97ff66f2c911a3",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dca",
+          "msg" : "6c3d3b4c",
+          "ct" : "1b970c8ecb4187447e60e6083da03086",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dca",
+          "msg" : "0412ab3ec6",
+          "ct" : "0344f7b34ab8ef28aaa843f276b0b3d5",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dca",
+          "msg" : "8ae08938929c",
+          "ct" : "17356c7148334ca1a24aab7e82a66e18",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dca",
+          "msg" : "7c8dfbb68d72af",
+          "ct" : "1db7510a55591a455d9f8167e6db3c88",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dca",
+          "msg" : "536f8f83b64771c1",
+          "ct" : "936fe58b629ea6ec158145218f2361c7",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dca",
+          "msg" : "8571f282b18b64ec5e",
+          "ct" : "6787816804b3127d0ca4073f1dba5c4d3db1ec9c227e6556",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dca",
+          "msg" : "8ada889862813e364c4d",
+          "ct" : "34131c3bfcc48af15eea8672e52927b462f81d5ba0e6260f",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dca",
+          "msg" : "f9c56e8058758a5c7c2baa",
+          "ct" : "4d1ec9287cd4dd378b9aefee79d4ed35bcb98ad9fa9fe529",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dca",
+          "msg" : "7c7dbc83fa62206a521ed4ad",
+          "ct" : "7209f5b6bd5d4916f4995d280e9aa89edd5e96e3c9283ad2",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dca",
+          "msg" : "a6614daf00df6d14f50388bad5",
+          "ct" : "d85a1efc6ab3a40948f723d9810a5deb019b3ce0208a0d94",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dca",
+          "msg" : "450580a47d7008321496bfb82f48",
+          "ct" : "43509b5df3688b6e44c1a994592f4c03da34712f886e63d5",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dca",
+          "msg" : "9efd21e13855eea8907afdcd8935f4",
+          "ct" : "16e369351c40f220d3fb1197f35da652a3a40ca3b1e99bfb",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "82af032f5389caa503147d2825336eab84816fb6f8ae6df4",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "4e00a9eeef87eb6d7be4ec46204d94006c216d5177d2a83c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "d3dc6c3b4707a08039d621879caf419b9895482fff7bdcd0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "09d3bfc3c9c5af2b2951b06406f7ea4d84e9c37402637e2c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "3396679a4d87caf7ce7eb4707ba1c6526728f5a973191713",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "ec637d90d945e92929c1c873d9aa9c47bc7b172237319d15",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "748f373d48d8590e2216b294b9ef94860dbb6b0b0ab625c5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "61d7c584197f257caf2583e444896f1d3ba12509b1ef725b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "7f8cda973fe58b484b120fc710b520c5636057629795f89a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "ccea198029edb9d848d6ca76667b666b1dbebd1e4b1faa8d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "ee08cb9d20a98b88b2d8f0e39acf34219d105dc14afbe364",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "6782992bf8cff068cf41341dd2ca04adedea92e846f74411",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "7ed35d0c08042dd56bb5df78056ecd21b8c797d36f57aaec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "37e3b4cefee648766a8efe73d6af12812eded603ab7141bb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "fe73777d8992e07eef0d053ad5ec0bf8243fc7e0bc2b405b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "39292c91b6b826d47d502043c3ba4f41e2ce32960a0291b5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "36ef8fc13d0f1f5745e3939877b62b8ecba2f5f0b19f9e90",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "7255c4eacb4105a68095e9e5b5a4bd8f9623a0da5c6fc230",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "ea26eec89a46ff1a628834c7247a8e4e45d8a8d3229e26cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "508593fa85a8effd27c8a225981978fcec6e992eb488c9c2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "b8a4cb22f15529864d4ced8e8abae69752a9045a084dfc3f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "a0a6bf5e47e89706932b1057b680c3c81dc4d9d0b4f9153b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "11f3af4ed30e77520517c880f1d0c272a89a968dc697cb5a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "6fc912a0bda73bacfa93db4002f18f349fa30f22f7a95ab9",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "RFC 3349 padding",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "ct" : "3731038571c35f7dcc55e48892de353e54c079b89774bbfd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "Invalid encryption",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9",
+          "msg" : "0001020304050607",
+          "ct" : "d85c6bfd092df1aeae5a548e47aa7681",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "padding too long",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9",
+          "msg" : "000000000000000000000000000000000000000000000000",
+          "ct" : "7a92427387f5587ee825d1ffa011c40286844ecdadce31cd9678338694ea2682",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "padding too long",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9",
+          "msg" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "a437d354606ae752894feb62c8def7d17046d8e47f9aed755fba48b3a3009e3ff67d34e26a779064",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "incorrectly encoded length",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "e8d240d64f16d1522ae2ded42ced257dfec158ff2fe1467d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "length = 2**32-1",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "6d1bfda356b7b954e7aaccc6df953322f75be95947b02b30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "length = 2**32-1",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9",
+          "msg" : "0000000000000000",
+          "ct" : "17dbf878ef4076cfcaba5f81d7b123d7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "length = 2**31-1",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "75c23e253478037802fae0f86af9c78d4e4d9be0c3bff89f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "length = 2**31 + 16",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "55717658c6a35e15ee36c66cce91083b63091f51525c0b51",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "data is incorrectly padded",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9",
+          "msg" : "ffffffffffffffffffffffffffffffffffffffffffffffff",
+          "ct" : "8ede88a52ccb8a6d617456955a9f04c94d87696125ded87eebe3e97e185496d9",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "data is incorrectly padded",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9",
+          "msg" : "0001020304050607",
+          "ct" : "5b4a8f1abffa51676ac8b5ddf9366c12",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "length = 0",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "205cc6dd9592da0ebff6b4b48a0c450eeaeb11a60d33f387",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "RFC 3349 padding with incorrect size",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9",
+          "msg" : "0001020304050607",
+          "ct" : "908a68b0d2054e199220d37c34a2e136",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "length = 9",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9",
+          "msg" : "0000000000000000",
+          "ct" : "f84bdb15045cee3a8a0f3ed2f07c1771",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "length = 16",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9",
+          "msg" : "0000000000000000",
+          "ct" : "7592b1ee6ee92c9467db366adcfa65bb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "length = 2**31 + 8",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9",
+          "msg" : "0000000000000000",
+          "ct" : "db93a1db3b5babc80a304d527682c1ef",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "keySize" : 192,
+      "type" : "KeywrapTest",
+      "tests" : [
+        {
+          "tcId" : 67,
+          "comment" : "",
+          "key" : "f75a2f49a630c7dc91626b00ce029f0bd2981d7c74a93ebe",
+          "msg" : "9adbc00c710b1101bdf6a4ed65b32d72",
+          "ct" : "5c117a678223cfe5ee691503061e7ab1e5f720e005171b32",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "",
+          "key" : "b713f6b7814f98894d7b153974684359f1460213eb74be68",
+          "msg" : "78585f0c49922e82caf17ebc3721b4db",
+          "ct" : "6a7f9e03b6f379c56da3a56d8f32eba515454a91fd417449",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "",
+          "key" : "13ecf423211caa334ba6db37259a535c20de8ad10fc8c432",
+          "msg" : "4fc75d0f221e22408a37e11265d49a05",
+          "ct" : "764097f5ee8236bc0d93bbcea139a652f4b211cc33a61ac9",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "",
+          "key" : "4417fbbea51bdd91818d74051957dd70e135c5cf3732bdf1",
+          "msg" : "f5357da9f8fd4a1190f36e9fa09a90fcf14d87d62332f1a5",
+          "ct" : "04b83ec803a75bbcb2f87fc6f488a4ccc1827b412483070eed195b6f0048ccbe",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "",
+          "key" : "b3f26d8a22fdd61f709841231fbde695b3f28dddced6d41e",
+          "msg" : "0d0af955d2e3829cc3d643219b301e64e0510dfbc428119a",
+          "ct" : "46ab71f032cb1ccbcc7447a5183574268c0167a26a93fe8422bf284417aa93ea",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "",
+          "key" : "f70cfb262c729a18206c8afd74356ec7e049d10b44a6e000",
+          "msg" : "241cedfa64c4e7bec541a2eb4c368269e0f0ddebc58267ea",
+          "ct" : "47ca298ee47b1b755a499129347e11e7a25754ccb6c2689e8eff270e98c81d18",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "wrapped key is longer than wrapping key",
+          "key" : "1639f9f81e53e2eeb677a249e5eced3af108971301601a7b",
+          "msg" : "ec3c6a1f1a9585327fe658490c74635e5300876da5846a629398984fb551d691",
+          "ct" : "ecac4c91758e1ae7bb010c34f4c5f99a3d728b9fa92cb778d3fe80d777a20d3de85ef46e7a0c6a6a",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "wrapped key is longer than wrapping key",
+          "key" : "1f22d5658aa685b8ba8659dc342880d5b2399e6a815005b0",
+          "msg" : "50be4c1b2f29a63f44d7fc63737f600f0194ea3fb36e173d2ddd19f218656380",
+          "ct" : "39b7326a44eaed08bffbd4aeaf3e2c3f899c1fd049384ed7b3eb92b788c6449acd6385f0bb18cf28",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "wrapped key is longer than wrapping key",
+          "key" : "3a2f4aa50441954bba5a1836294ce071f9296b23dbed6771",
+          "msg" : "65da02ff21b483a1e39575490b4319e84ae0299f1f00b3859fbe2e74b3ec2aaf",
+          "ct" : "3d2e9f39c7b13e9585227c4344fbe596f92b002456616f137deacc6a8c941649ce294bb2695c1807",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "Round counter overflows 256",
+          "key" : "b6121acad51038e11873aaa7e6c7be06f93826b74fec0ea1",
+          "msg" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "d6aacfb52c26baae78c2f54259a4e4168f817064344e2ba8fbfa7fae9f1fd69bd5bc5c1e20a6101b4a7119cbce028e25a9e93d29ee260c4e609baedee788411c2afe60218ce1b0d28b9c29b941251fdcbac3009d59040a0337b8b4a3a020c6d8f310cba63db046d8f36b64c9092e75cee463fc7692ef56bed395c4579da0ecb02129e45ad8a7f116aac6170204888e40693f017a6a0a7dd3962004e60db3a9b6c8b7614a467ccb799bce1ba83f5c0921f1e52bb3909bc0486ec0eaea736498f3ba520a519c3ddf491307958620b737613417b15b438b80b43189baa455031f5771502002ea170c767b33d247feebce62e606f2262537f85f18d1951cc75cedef291c6a501cb1778586249b58156eb8d7283a3f508ee8bcc1206d77bbd6892fe74b865bfc02a8f07223087a6c1e50a41b7cf5f6ee04bd07766b2e5b34c4a7666b0ce06f670e6434a59fb74e0df36c91d94e5e8b721e53e09b6f6504c5d515492a373fcc348a63122cc6e4716e0e1a543d038c6f7731199f691780a8a655cca6718e3dc56e815b3669",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b",
+          "msg" : "",
+          "ct" : "a65959a600000000",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b",
+          "msg" : "a3",
+          "ct" : "52c7f388d0d4237afaa29f2b94723475",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b",
+          "msg" : "594b",
+          "ct" : "833431ce8799be69b36aafe3f38d9dac",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b",
+          "msg" : "72ab34",
+          "ct" : "31674f46b989f6ead582c70dedc8c6b9",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b",
+          "msg" : "d4d9460f",
+          "ct" : "80535172d2a498aa31601d70fdca9dea",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b",
+          "msg" : "643972e552",
+          "ct" : "56232300dd7b2a71d2328b6df47af8e3",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b",
+          "msg" : "f3cdb73d2561",
+          "ct" : "e27e08efe39adbbad8d300b87be2c258",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b",
+          "msg" : "7b0b53b6429e14",
+          "ct" : "8f90942cdab33e58b24a23ad7efb7538",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b",
+          "msg" : "6b2393773e6d1378",
+          "ct" : "0ebaf23c858015d3bda5b8d908db6049",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b",
+          "msg" : "2c52d6639e769960e8",
+          "ct" : "d56f89977b8eff511158edad6b993007189e5a4b8c0e2faf",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b",
+          "msg" : "707c9356216d69c69048",
+          "ct" : "dd889475a76733849f59bed49a15d4315bdb5ba00dc63470",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b",
+          "msg" : "615f6fa79e1847e7359a8a",
+          "ct" : "1a9b3369239b0f40a8dc5bd8d965caf7431445799337b99b",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b",
+          "msg" : "7f5e999168ec60624426cbb1",
+          "ct" : "5232f8f6679a17d3303b0bd72b06b56b5089e80372dc295b",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b",
+          "msg" : "3f93aaf4463775baf6c0c975ae",
+          "ct" : "e5544361c60980f3d38f2d8820a150f48f49ef3f9184b29f",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b",
+          "msg" : "fefcf10c976309b2beb085771e50",
+          "ct" : "55396065905915ec914b8d1efbf471e37d283fc2c1496b49",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b",
+          "msg" : "6854354d0099f7eff740b0587140b3",
+          "ct" : "d90376be302a24c541bd6d96094f0025e3d73888391b4306",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "eee27510be39cc88379459420f3773642a423ac1ff0cfb84",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "765df3fa1aca6f13268ba79f8659807049a313a0308b643e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "71346c17a2718cb7c357e3af2b2d0c3e29b7e02317926746",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "55fd49ba081fdf72896068c5a968e2b3c4a473786a2e12c2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "133c66fcbf0e9d5139eff3fcb494b672d72bb622d7015c4b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "8439244f27470e5f1f294cfa22ef5412675d7fbbd92ff016",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "4265bdb7d8ea30d9a51e5f48b7ac5487e0c95f154ea8baeb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "31afcca8ff2b8806408c3460181ee5a96bbaf51d133211be",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "196f2a6eccb5368fe6a3f2fa0874d8fc9b3b52484e2d6351",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "8dc73d363fdb32f6e0ff830c2a48db5815f66d0922694c74",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "e90022b9da998b4a30c91c1bd1a1f8ca05a52432867e5e78",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "c9898a1b70bd718df45f1f3eca82eab1eaddb8ed7f2380dc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "cc3f2cd6476eddbbfdc801b61174301688554f3db54c2903",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "23e15705e7b00d82bd052f0e0135ab7ac0dcce471ff2f1a7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "b8e2862c0f9eae4f44ad99496e3ed62b3b9c4ce7ab5afb74",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "66d8a7769d81421efda456992f6c26cb17665fe080b0160e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "a6a28bceb91551a395369ff09370658cc92b092855f417aa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "03ff601cf12b432078a2185590fb5d01e3441cf084bcb04a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "e250d358d16d9fd20ad80a99656509229dca391aad3798f0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "643a17860b116ec74089bc574685a6328a3d7a07cd18b520",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "3e86e8128904f753c0f3fe3401ba36672966567725c4726c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "d4b8cc849176b8344b0849490143d3512915171bd7d5759e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "f84e0e6ff64e0b27b8b59b5b77c223023f0fea95433864ec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "4030b4b0e9c1b1ce8e52f6bdb48088e65b05844307989c8b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "ccb3b36c26b2d901b7f0765362d992b2d5089c2a7559b195becbe173780352fa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "4e5fc8dccaeec9b1c8a606a2bd7d7201eede62b9c2e939a5aba663a6a040e361",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "af21f5e7f15a63c8ea6001cf024f281e7f44aedd68954564fc2bd146e96d793a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "3a4f571ffbf761d3f7d413172ee1e4ae2862baacfd5ab66dc685b9af8b70b538",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "273de386d5fef497f9487afd54c1c0fae8aacabf2af465caf352e2300d29266b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "16511743dc44199cee1dbf5045141b075f01ee13326c9faf2c74b7c99791830f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "370f92db00f7fc8a0e654318a5b3ff89a604034f421339201d79e0ec4d6088de",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "e3edd0e84832f3615f6deefb444de3b9ec527741686029db91de0bb9b2a5c05d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "RFC 3349 padding",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702e",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "ct" : "36ee480138edf11e144efcddd24d2c121749da6e4eab17fe",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "Invalid encryption",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702e",
+          "msg" : "0001020304050607",
+          "ct" : "166beb49e97a4a9cc7b0ccf441ec15b5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "padding too long",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702e",
+          "msg" : "000000000000000000000000000000000000000000000000",
+          "ct" : "74ff3070a0a08471c001febb95a890f35159a9fe263719e40c2332ce5c58fada",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "padding too long",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702e",
+          "msg" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "4f0b38eb328d1227b1e17c103a44a373ff67cee953c59eea26117947b5d3ef8932c8858b4f9fb47c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "incorrectly encoded length",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702e",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "775dcabab9e4be8fd9963a4dc7a1447ef82888403882bdb6",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "length = 2**32-1",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702e",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "669803237fa10eabb4d2c6ad85bd9f7df5f4a33340eb0ce9",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "length = 2**32-1",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702e",
+          "msg" : "0000000000000000",
+          "ct" : "c788504d786f5c21b6671bf190657301",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "length = 2**31-1",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702e",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "d079f60d3258f5e695d1a73db008ef38516b713eca2c0eaf",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "length = 2**31 + 16",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702e",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "f1ae4b8865013b0fc63b463e664cec3c6031f61f2de82f43",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "data is incorrectly padded",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702e",
+          "msg" : "ffffffffffffffffffffffffffffffffffffffffffffffff",
+          "ct" : "8874e1b6e15e3ef6c461411a5f5ad0c8b05368cd5b3ee39b2b413d18a4eebfc9",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "data is incorrectly padded",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702e",
+          "msg" : "0001020304050607",
+          "ct" : "890a3dab8439bb73b14c6e99c34f0b0e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "length = 0",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702e",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "d4f633aedeb89e349a98738b00ee42c90d583b16e986e49f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "RFC 3349 padding with incorrect size",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702e",
+          "msg" : "0001020304050607",
+          "ct" : "b8b2a5b1d3280dcb4daeeed43f36509b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "length = 9",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702e",
+          "msg" : "0000000000000000",
+          "ct" : "4429cf64251d8a54a9d1389c01c30900",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "length = 16",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702e",
+          "msg" : "0000000000000000",
+          "ct" : "e5634eca10372c867c7f91ee813ec3f3",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "length = 2**31 + 8",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702e",
+          "msg" : "0000000000000000",
+          "ct" : "9e517d4d0142e1544ba1e7419a696c21",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "RFC 3394",
+          "key" : "5840df6e29b02af1ab493b705bf16ea1ae8338f4dcc176a8",
+          "msg" : "c37b7e6492584340bed12207808941155068f738",
+          "ct" : "138bdeaa9b8fa7fc61f97742e72248ee5ae6ae5360d1ae6a5f54f373fa543b6a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "RFC 3394",
+          "key" : "5840df6e29b02af1ab493b705bf16ea1ae8338f4dcc176a8",
+          "msg" : "466f7250617369",
+          "ct" : "afbeb0f07dfbf5419200f2ccb50bb24f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "keySize" : 256,
+      "type" : "KeywrapTest",
+      "tests" : [
+        {
+          "tcId" : 143,
+          "comment" : "",
+          "key" : "fce0429c610658ef8e7cfb0154c51de2239a8a317f5af5b6714f985fb5c4d75c",
+          "msg" : "287326b5ed0078e7ca0164d748f667e7",
+          "ct" : "e3eab96d9a2fda12f9e252053aff15e753e5ea6f5172c92b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "",
+          "key" : "0dda6da5123e2c37c6fa16ba0d334cd01acd652f8994211751dfab4faac2fc22",
+          "msg" : "b40b6828729b456322a8d065abc0d081",
+          "ct" : "9d2b42fb2fdb92c89fb0c3bcd9e1600d3334b4e35e791369",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 145,
+          "comment" : "",
+          "key" : "d6925914cd06308f81ad91e23073593d99d4e50351b20eb2a8d1a1ac4ced6588",
+          "msg" : "037b27b3dc95b19d15bd4091e320bfe1",
+          "ct" : "5291e05abd55f5886850855e3f9f2f576b101acc222d6766",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 146,
+          "comment" : "",
+          "key" : "07518a82cbc8da1dcec55f3763a206d277487abd03cedd0b8bef9ee2fb157121",
+          "msg" : "faa4664d79fce3c7d2fdd462f6c1c423c2f8e6b69be2e071",
+          "ct" : "4b1220525c537aec30ebcd562b694b4e9e2ccd819de22ef608b5d8090779d9de",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 147,
+          "comment" : "",
+          "key" : "ea46991d4e71f53dd624e7fe7fde11944a7c5942d232369b8065d42b8cd2dde1",
+          "msg" : "dffc5cf1dd5411d015d84601fa38df5effe885c7f26a4825",
+          "ct" : "67b2cbd68f6a208d647bdc5af7d0bccf6711a9e8fd0d9434363006addd4b9696",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 148,
+          "comment" : "",
+          "key" : "fdcfa902c6f222f527af84da533b14b52e2615da3a89d1d35708b0cd49f60d87",
+          "msg" : "966b07047354966a703e79607b556032f4f596b7f9206f05",
+          "ct" : "cfdbbd95f187508a488fe017c5e5d5a5975b68441d520e0e931922388e28784c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 149,
+          "comment" : "",
+          "key" : "38e1b1d075d9d852b9a6c01c8ff6965af01bac457a4e339ae3e1d7b2ffacc0cd",
+          "msg" : "80ad6820f1c90981e2ca42b817a345c1179d0a11d8e23a8adc0505e13d87295a",
+          "ct" : "b63b7e0fec7e315816233db6758fd3e744b9f6a40862bdf866487e53bcb950d8b2649269e51b4475",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 150,
+          "comment" : "",
+          "key" : "c641f1689d81caa8ba37d895272240664054ed974cfffc40e6c5c0cad1b916c7",
+          "msg" : "3fd0ba19955e46749f54d88e99d080b7339d588fe612ec0f4021ca3ca2104270",
+          "ct" : "837cfc316b49299edaf427e0988020ee876204b29d847669daab72c8660b0d860e9de3bd851198ff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 151,
+          "comment" : "",
+          "key" : "aa0ab9d68ed4a04e723f81b44c0c88d0bcde7a80cfd476eb4b8836d9aa01ec4c",
+          "msg" : "57faa8766f6d6a0aa1cf643f857c150df5b31303b50af480e21c4b5e8c8a15d5",
+          "ct" : "0e9e2e9aa34bbf973d67bc534ac86fc5b5a5f9da5f026866177894ec6077a5c84501510e1bf4afb3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 152,
+          "comment" : "Round counter overflows 256",
+          "key" : "b6121acad51038e11873aaa7e6c7be06f93826b74fec0ea1c02f9981ed49d16a",
+          "msg" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "1c6b7e4003384f071bf29baea9098ad81da8e9862909329f52793b35d592c10dba15aa89400ea6403df8dcaffd0dbf5606303f109f79ad700ed5d5ad4e59950ce9ce5296c9d186a0df441973d1835f9ac000ad1a6797875c3a03161e9e3f5ea464032e407854eadca5a9e7a386bb0d29253e3804adefd8c0402cc8c40ac7f9041429cc0bb77a405b284baa2dae764ea09c654c0a82f2c5724221ba44e341503d3103dbc393c7702182f8cc2762ddbc873b7f84197709886a4b5df5b04ff9d21b79b50904af3c32128dfb9cde94fe1254d981e6ce3acfda82db1fa2badbccd2d29052a04a69ce1f5652f30496ea57edc7e3e885dd4a35ca15aba602bb4c888a8064da94c2ac5c12c11f608810af46fbb49c3e8f8771ff661f8d8dccd163d0c4a401b8b9aa74e68a56011cf78d21dc7541a974f9dad5ae27f8a26d1b0e76be2f86c6a21e9d1c2b5df3c8878a8bcae143b3af1f082afc52616eeadd2232926597b245d394931e02e493b0bc27a92d013e111694cac2c5a2a46e008a8498b5c31bb5ec35a4e9957e365d",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 153,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b162baa53d2700093",
+          "msg" : "",
+          "ct" : "a65959a600000000",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 154,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b162baa53d2700093",
+          "msg" : "ae",
+          "ct" : "06c1e65ac0f385b4e8c400d229f39422",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 155,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b162baa53d2700093",
+          "msg" : "c548",
+          "ct" : "c98da5936a1313eba1a6773b8060ea5e",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 156,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b162baa53d2700093",
+          "msg" : "f713b9",
+          "ct" : "b2a77d9b837e87cdb7391e1df7cdaf14",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 157,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b162baa53d2700093",
+          "msg" : "f375cbf7",
+          "ct" : "d8ecf20191f75aa36686298bfa5022ab",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 158,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b162baa53d2700093",
+          "msg" : "d9445094b1",
+          "ct" : "077362f50356fc7c54c70f9cb4306f7d",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 159,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b162baa53d2700093",
+          "msg" : "fab43e91ae15",
+          "ct" : "a4bd6a116ad88a52aae3f0c0cb893f9b",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 160,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b162baa53d2700093",
+          "msg" : "90735025797bd2",
+          "ct" : "68a52de00ec0f1ebbedc38fee6be0c23",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 161,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b162baa53d2700093",
+          "msg" : "e43f5e4e123a03c4",
+          "ct" : "3a6746052a1744cfe7e2f36dafc4042d",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 162,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b162baa53d2700093",
+          "msg" : "1723eb9d000916996a",
+          "ct" : "db7e73da22219e1baac0f4e955c3db2b900b5d3078f94b59",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 163,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b162baa53d2700093",
+          "msg" : "8b18daecde14b8472ffd",
+          "ct" : "f77ec14a010777f1f1071808f285c1c00b4e9420f0e8bf48",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 164,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b162baa53d2700093",
+          "msg" : "e5bd6fbacbf3ef0d40c884",
+          "ct" : "6b40d4f0863581a7d0365ad477568bfad94f8bf134984838",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 165,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b162baa53d2700093",
+          "msg" : "b3be5e5397df5f46b099e821",
+          "ct" : "660f645b02405a18f7225b68c0a09a949b2b5ba784922cfe",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 166,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b162baa53d2700093",
+          "msg" : "4cdd960cabcf8aaf69c37da1d3",
+          "ct" : "6bea6bf57601bf063873f47ec3572cfb9cfb595d8bdb5e97",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 167,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b162baa53d2700093",
+          "msg" : "da29e0889cf98742612e0326300b",
+          "ct" : "b631292536aaf02d829cc6d3c39e5a5cd76240889e9d51d0",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 168,
+          "comment" : "wrapping small key",
+          "key" : "1abf4b7fa2bb62a78f09ddab04625dcacdd9e551d1a69b6b162baa53d2700093",
+          "msg" : "72aaee126a822184806c7d22eed66b",
+          "ct" : "de497acf18a177a3a9b3d8da46d74dfa58dcc537a3a95323",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 169,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "aef4d2357a8fc5c3b4a80a15ed49781d3a82c98eb78c9180",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 170,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "6eaefd5193f0725fea545077a430860663901979f0b6f4a3",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 171,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "f9ded536c1ae9c680f7d9c4b91a566a07b1628e9b9f4fccd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 172,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "443526477c779a329ded0b230307afa64fdc10dfc86414dd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 173,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "21ba79f3b423a66e7baad86fe49786e07a33dfdf227687e9",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 174,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "3e65dbacaae556fa18bd192035cd55958adeac30e5ca7b3b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 175,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "de2054883b00f81ff68e42b7ff1c05ef5faaf75b2bb14004",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 176,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae37",
+          "ct" : "2aa3c6ba891d1211677d59f886cc6d05698243d10dc189f7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 177,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "9b1e7d6caf42bb3a15530f2387ed7329310ba76e1852566a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 178,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "daf6a9f5e4b4985fcd4815bf6298a3039bcb32327b0876ff",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 179,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "14c4079399721142fd5fce26e9417064c7e0201fb7b5255c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 180,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "f48a30b8691a2a80dd79c355c281addf779bfed8971e3ce4",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 181,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "248f867430ffc954b494c936a3ef815b1754009928aaf0c4",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 182,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "dcaa88dad9b03e59a3ac8350239824368004e2ca616c15d7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 183,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "a6cc8470192687ec9a31258ddb73084005784475f3442705",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 184,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070",
+          "ct" : "0527ab5408b4f1484b27f98641511143ab88783688256815",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 185,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "7fd3ad3aee0545da1ed3a54d5a198a2c76cf8290c011c042",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 186,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "a24e94c12b2e6b776c8febe9179521beae0cfbd507d358b4",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 187,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "9395b071fa3d9908b2e1b349bf7cd6a1cfc86b979c8c73cd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 188,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "1eb452770bc0f26a3576b604bf5ac72f714fc468c357eba7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 189,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "b42bcb4161f40b30f3d2f740f43e441d3c9a39613914f1c6",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 190,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "f3d76dd320e5f1b3f85b8f73a9ebcfabfb8346daafaf36e6",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 191,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "b8e26164496942f44f16751096fb47952ec478bb288e72a1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 192,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5",
+          "ct" : "fa783b3aca0ec1e677378f23ebe937776fa590ecc6b01392",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 193,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "8b011408049eab81cc185796b9636982c1ad28e940e5c35ab1219434c23e8c59",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 194,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "08db2f06aa2400d4cc1113b1c9e3ba1b39e3e26a84918f9266796c426c166428",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 195,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "3114404be000ee167b65dd3cfae3b10c50dffe1df864b5e52a2805f0c80021c0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 196,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "405ae5bdeff8b05d28ea55900b8e81dc789d532ec3fc457730819e762172f751",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 197,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "7c19e66d21c0f1409ee6f03a36ab6ba532349e2567200b95d7f5012b2b7e5d33",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "955ac67d6e496b9b93a4dda8f6e65e668f1326b256ee146a7647ba18deee7986",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 199,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "c8600aa18be27279493fd68c84130c8bc328b0f6821e01e892b6c2dc1c005270",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 200,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1",
+          "ct" : "492566e0dc539e234b08b95fb23594a6d14f59fa4367799495c2e7f2993135ec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 201,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce3497352690",
+          "ct" : "8c5c2ea18125a03d15d2a624c9bfcccdf53709a89ae03d5728c98943b13df72c6f02fc8e1cfcdfa7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 202,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce3497352690",
+          "ct" : "8836c5cb2eec2ca2541b18c1259933ebd601bd6763d9f7cebf06ed6abbe37d455aca13a2db87d111",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 203,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce3497352690",
+          "ct" : "2554e0faf721d77f7dfadaaa90b70c2f242f93bdc4f876cd058a86ccfff33f8fd88736997f505d98",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 204,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce3497352690",
+          "ct" : "53ee4c8f03212b389f5bc2b26bc898deb91a457f258a22028a688919e12c4da23090c26b5c9ff692",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 205,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce3497352690",
+          "ct" : "3a63b0283ec071a4d4c32b0f30b384eccb3cd8d7fb12de6806e12fef5da82a7a39aad8128c3e5915",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 206,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce3497352690",
+          "ct" : "d1cfaaa9adc25f948c0c4720967b01488e06d3dfc5622b5de38a722798d4a3a44fa6194a92c5ede7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 207,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce3497352690",
+          "ct" : "251a71511a4e73d1469a051fd88fa78cae96547fd8ca8e323b05d8717cdcd239292c7bbe0708fae5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 208,
+          "comment" : "Modified IV",
+          "key" : "4f710eb6b5e28703becfc3dc52fa8bc1dd44a4a6d38a84b4f94e89ac32d987e7",
+          "msg" : "a828cbda9b5ff0ae374f84fa01d070a5f0a17a0c462be4f1acce3497352690",
+          "ct" : "14a62f7284124d795826cc89852e97dbe6b8a30ac56df07173878cf0136dbe386ec46327d6fc65f1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 209,
+          "comment" : "RFC 3349 padding",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2",
+          "msg" : "000102030405060708090a0b0c0d0e0f",
+          "ct" : "ac1a774a5de27e4f9c356e4f62deaf8b7eeee6bcafafd895",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 210,
+          "comment" : "Invalid encryption",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2",
+          "msg" : "0001020304050607",
+          "ct" : "b3941437f55e7cbc3f88050aff703967",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 211,
+          "comment" : "padding too long",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2",
+          "msg" : "000000000000000000000000000000000000000000000000",
+          "ct" : "86175acf19ad0b7ac60d1fe4bb7850635e7ec6f8a314f85b6dd3d8f9349ea38d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 212,
+          "comment" : "padding too long",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2",
+          "msg" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "ct" : "791f088847a76731e0d56b9b2dcb28bf9f091a9725790e0a64fc8e7cb3ad50f380297a98e3b1c33e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 213,
+          "comment" : "incorrectly encoded length",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "868c34495bd3d7b4e2c1861e7fcbbdb372099488dd96c9ea",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 214,
+          "comment" : "length = 2**32-1",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "4a8b4aeaa713469bfd9bf88d4072379fc858e40b24b0bebe",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 215,
+          "comment" : "length = 2**32-1",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2",
+          "msg" : "0000000000000000",
+          "ct" : "c210aa3b5fbf5eac97e68d98d7727f38",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 216,
+          "comment" : "length = 2**31-1",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "e0ebd376e050cc9027b76dfc38ee2c6ae2808cecf480a560",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "length = 2**31 + 16",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "23a693e211c08ab9b222c2ede2db18f437e22917fdff8032",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "data is incorrectly padded",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2",
+          "msg" : "ffffffffffffffffffffffffffffffffffffffffffffffff",
+          "ct" : "003f2916fea6827e01199028d3dc4e03889113f97b1860cc242e5a0f28a0f159",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "data is incorrectly padded",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2",
+          "msg" : "0001020304050607",
+          "ct" : "5c25a170d5225a6d66e117c691b37383",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "length = 0",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2",
+          "msg" : "00000000000000000000000000000000",
+          "ct" : "df9ef924eb59634be5b27cabd33d72bd6be6e01e4672ab05",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "RFC 3349 padding with incorrect size",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2",
+          "msg" : "0001020304050607",
+          "ct" : "e6e66fad359a7b63a977788acd297121",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "length = 9",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2",
+          "msg" : "0000000000000000",
+          "ct" : "76b88ecda760b1af80703036185fc476",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "length = 16",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2",
+          "msg" : "0000000000000000",
+          "ct" : "fd101943f4ab7c38ec68c75d4b3193dc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "length = 2**31 + 8",
+          "key" : "48a53c11ef2d727db7eb9a834b134ea9602273aca929702eb2c31d96a58c9be2",
+          "msg" : "0000000000000000",
+          "ct" : "1793a3a9bd146726edbcb9589f20e849",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/rsa_pss_2048_sha1_mgf1_20_test.json b/third_party/wycheproof/testvectors/rsa_pss_2048_sha1_mgf1_20_test.json
new file mode 100644
index 0000000..833b8e8
--- /dev/null
+++ b/third_party/wycheproof/testvectors/rsa_pss_2048_sha1_mgf1_20_test.json
@@ -0,0 +1,496 @@
+{
+  "algorithm" : "RSASSA-PSS",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "WeakHash" : "The key for this test vector uses a weak hash function."
+  },
+  "numberOfTests" : 47,
+  "header" : [],
+  "testGroups" : [
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100af3897c38ca932c661de8cd18315dcbd8582e98f9f9a21d8cd822d4d1bf1ff1d1bb98dc0ac25c4c268d82ec61dbf32dac496eab4622be114a9309634cc85c16036088026da96abd350152e549552500d6ab9341f6b695c0d4d160f6d50fe97519b44cd74edd65bce876db5da9adeb87a7cba1c5c02f0d0fba690b4ca855024dceee68d04f48679d5c63ec87fd65e1e42604d32f0453db7e83a1bf4dbb8230308bf7c0e36013d555429c6650d7bf576b37b25f420798b22842340e370702fd1cc0fce98a407fff326017dd985f8c64bb6686aa274b664ca44e40de1cbbbf79ad760693c256f820d0dbdfcaaa440b0e69899b7b9bb2911082ba957c4b188e6d6db0203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100af3897c38ca932c661de8cd18315dcbd8582e98f9f9a21d8cd822d4d1bf1ff1d1bb98dc0ac25c4c268d82ec61dbf32dac496eab4622be114a9309634cc85c16036088026da96abd350152e549552500d6ab9341f6b695c0d4d160f6d50fe97519b44cd74edd65bce876db5da9adeb87a7cba1c5c02f0d0fba690b4ca855024dceee68d04f48679d5c63ec87fd65e1e42604d32f0453db7e83a1bf4dbb8230308bf7c0e36013d555429c6650d7bf576b37b25f420798b22842340e370702fd1cc0fce98a407fff326017dd985f8c64bb6686aa274b664ca44e40de1cbbbf79ad760693c256f820d0dbdfcaaa440b0e69899b7b9bb2911082ba957c4b188e6d6db0203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArziXw4ypMsZh3ozRgxXc\nvYWC6Y+fmiHYzYItTRvx/x0buY3ArCXEwmjYLsYdvzLaxJbqtGIr4RSpMJY0zIXB\nYDYIgCbalqvTUBUuVJVSUA1quTQfa2lcDU0WD21Q/pdRm0TNdO3WW86HbbXamt64\neny6HFwC8ND7ppC0yoVQJNzu5o0E9IZ51cY+yH/WXh5CYE0y8EU9t+g6G/TbuCMD\nCL98DjYBPVVUKcZlDXv1drN7JfQgeYsihCNA43BwL9HMD86YpAf/8yYBfdmF+MZL\ntmhqonS2ZMpE5A3hy7v3mtdgaTwlb4INDb38qqRAsOaYmbe5uykRCCupV8SxiObW\n2wIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0af3897c38ca932c661de8cd18315dcbd8582e98f9f9a21d8cd822d4d1bf1ff1d1bb98dc0ac25c4c268d82ec61dbf32dac496eab4622be114a9309634cc85c16036088026da96abd350152e549552500d6ab9341f6b695c0d4d160f6d50fe97519b44cd74edd65bce876db5da9adeb87a7cba1c5c02f0d0fba690b4ca855024dceee68d04f48679d5c63ec87fd65e1e42604d32f0453db7e83a1bf4dbb8230308bf7c0e36013d555429c6650d7bf576b37b25f420798b22842340e370702fd1cc0fce98a407fff326017dd985f8c64bb6686aa274b664ca44e40de1cbbbf79ad760693c256f820d0dbdfcaaa440b0e69899b7b9bb2911082ba957c4b188e6d6db",
+      "sLen" : 20,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "50dfd875f0a46683f4783667b72993151e6a69e2954538d806fc362725ac6c05d7cb2b99b28b8e2b1c911402bae45fab0270b0eba744e97c00eed757e57fc0ea839421587b3011237adc3373963dfd3d31f5d254a6d6c206f1eb360e9b0ad3675250a4b0cc09f6e63e1bb578a440b2a2a83296056949f61b81a5381e7d05f24f593c471b43d0b408b090af63893bbc535ccf9e1a6c6c96186e59e5428999e2df768ee7ccd4a7ace1feae6b0794d44688ce59c3c5086e5dffdb572abbb4929db6ce219257421aec6f94fdcd2f519dee15d3a0757e366a3942d606937701f5d7e4a1ed9b903739e7c73d98bac19075f050b782225824ce3e28a3175384dab91935",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "3b32d1225fc5702a3b4fc4bd29a0cb84e0ad17f8b9879d5d8c870f12ad5a77e45995bfc79f6f73078aa76dacfc2160bd322f5a6854604da364b44d267fe13a9016ab408436d5fb2dddeee07bf0d936b7415f565e0b0d9a0cecbb2a62677a3059d07ffa9a191ec7dd5b26914aa15084c10b3ee4c30444f5777901f15f693077876f3691845f32e94a5ad991f6135a7d139281fbf01ca27a889e93d07a79e48c2cbc02847a4ba685ad4b84e1459fbfc848dd203d04361df1441b3184414704ccfad2e7f5b2dd863cdb1ae52989e82148a1c6bfb605bbd0f38fb7755c7381e6392746477d96304444a1003307f7b21faebb44333d88435b3ae0248729d17cf83e81",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "719d263205cdbc0d8a9af580628386f68501f29f4026dad9116f149fc285870ac06f570a3632abd20a01d76f617b0001e88ad7606f0a48bb49a8ab1331ce61439ed35c7e45df9c22e54f499309dc2bde89ee9edc8dbbf9b25b60b021f25ae11166a9fda31a0f3a84efc891fe436e3b22e3e0a6c0f2dde3868179abf673848a53ee235671eb401e3b79faf94ce508a7ca3431c2ade11b7fa629ed893881ac731d6d673e5ef4d5ef7f1c12145c9d060fdbdb49fd43db4fdeddaf526cda93dd1a45636168e1b9115ba41e17adcdd95e6a1b7525452244ab6f46cfa01bfa787fab605b82c43a2f65d2e0b066b34b5684369d3ceab10c37a73d3c979be2ac996ea036",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 4,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "1ad9d6447423c4436a96c17407f8ffbcb8a41ab5421fe319222899e9091fd219690a97f801113d33e13fb5920335646616a35ce4996d63504a2c0dbf7172533b06738706ce20484698cfbd24eade67ed91e6b985ac2df1f17c4598125b2439286c9c01fd10901058b7318f8cc49aadab349560d473c30c3389905311d78288f900cab33b5db060694489a018c2552e588f32832820703e3838b44519ee9430eafd65076e5c8195acbb85ea1e4502810ac13ed72614db0c4bf94ad83dc95ca2bd47688021a56429c4b74b1acd82f242aca266f8a02defdae8b47e12d790c6a7c157d2bf530d50134b1e7c8446bd13884f3de0d44fdca612cd3d4260b6570ad0d8",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 5,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "19f7396f4f538b1dcb82f556ba9b4817aed67eb97229587db7ea1d70f5fffb2af67f4bdf31915ac5c528648fdafa19c21e41d868a78709ec3a1f1f9a4d992c8e5dc98ee7668e66812bac88d39721e6bd6262679652357be5a5d54569ec74a0ab4e9c52244a927b1472d97368854c1dd1bc253d7618d5a94d1e64dc1630461c1c506a5323583e75fcd32b2e30efcff352250580dc8b780dfe1abd5e2ce4b2c58b17f9a95b177e4302e99815aa1de7e84050323cda3fd9fa0e22f5ece22278f075fbe3a09874a464795cb72080a3ba4d5a94c2aef5733fa3b11a9a0172e761aed2eb7e364c885c6fb66c54996d92a98ecf837ae2c3e55354f56def5d71c09a7698",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 6,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "640c44887275af542fb28ea33a7cc1c05188481d69c8a46d05a3651abb658d7ebe5c5d955c0b27ecbc2cbc05d131910b563e56409d2d0ffd09380a880c58324bb77d4d91c64d94d4f50751a046e1f2a617c20bc34c18636389c89fae170370da1c83c3926431ed164d0518c1fb8646aa7ea43c20695fb9bb1a34adfa2a78bcd97829d87b0a87c9d8e510d25a51ec1969c3ee0b8a22aad0394a36f0a98af973f7fac61e4f9d5c6c0c9b6e703c33e28b39e28d9a65e4f451d3d5ff6ea369f65a38d93bd91b30459f4fd1ef5445dd6ac45715274d3ed28278424324a52fc1be917e4ead14a94fc2baa3e5101fc37f8f1beb2f9601e44c0789c325ad2189c9d4a2d2",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 7,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "ad5150442d1b552326200ff1fe9bc797e4be9e3146b92b269a0b2acfb18e7ba326319c7752ea7e6392854a5070f3cf09e0ec54227b16526bc13dc8df4a7ccde94c7237c4d49de949c2c407679f8aa49be386e09f0e35e6a3fece34273a7e88b91a658d3e002a939b16637ee152398ba912284f2d3726354616c155cde76df1fd421936ce213df0a4f84baa01b111479e1c4593cec97a609e2fd54d0350d7f08b2a9dc094c6bde3907583da25f3d6abcc404d2a321282d3a17379137e5ad04e544efdcc62af54a544ae1c17467d99a68cd8e20daa5fb4f906e7528e306688ba58e80d41f2b0c6a1801780cb6b6c36e5be80d1da4e0af005e217d57c3fc26345da",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 8,
+          "comment" : "first byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "4f732634b50d2ebaa205b8ea73349ffb95cc494b4c8f722de0569c33c2ed4a977095e03e87abe532f48e811d86c8185042cc0dae7cbc59cba0f0aff6dfcdbabfa3dbb2e18e0033cba1cb2661d289c15aacf45469bd5772de4bf378fa4cf4adc7dece05436781c4ff1085dee1ede3f3979d553af3c68f42919ddfd151710644c80c8d1da6cf4cb51f9149efe4e7921ee2f192f057dc6690f6db54a1affd0ecd0d8c205818bac599856fa7729ad63332c1aac2a0148102f549b11b8f33afa638710abae7ab052ba118af38fa87c7f6b7b6f722b513c9c202ba47d3c7a7d0228b535e5f583ed19a014e2e81e4495dede1b72650a4eda669a0e76e78a40b46020c74",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "first byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "52c4c54d30d822b6c7d1741395f95dc303f068680efd2bbbb864c0cce58737f3ab12f5a086603b6806812e3ce39330fde071a6c113a7f9f64c9bff494832f0bff229a0d40e4b67a6e505dbf942af6eeb700b4e6b6e0936ee30fa1a25710cabfc75348a30c951b84f975789e0fc78e9298af5f3f2cfbe9cae763e127720c8451647d3e9c39efc19761c3d7a0c880ca7f84d0737f59ac0e12a32863a34888518f95edaa1cc057e1bb6137d497807b878c91536e09a0a4514cad144822bd7d10c61d11a8810b9d5b81b2127bf626540a5b1af5eabb3db40bdcb528c6bb115ffe61d107d3d593ef2edb375ebf25a91d17ccb63f1f9be27127dc0d00c58e8f6b5f3bb",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 10,
+          "comment" : "last byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "5b7524c140e80b5fbded9106c9d731233aceaadf71580e5b5632f62c298c670fcb0872b1ff9034a27be61539484d477a3b56e1557b7e6f851ec0aa74e4b6df7b8e0d36771cccdc06c8a1a076a803cd31b1abd1c8037be9fa4320a339a28d731d2824070d7fc816691a6faf233c83e66c598943d41191912edcb298fbd35164c1d5d4e35483f477665a5c0a4d518e77ef60b09bb4281c47a25c20a1a91f6a1749ad0a94145b3c47113ed08e3ba5e938a751e1d1b282cbd48ae980ae02a41604b2f5ed10fdb6f1ab3427cbdaa9467caab56da29a2290b92e6be75f242fe97b96e55545cb18216bd5b654cd014107b2448ac33a833682bb4f79401be44498655687",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 11,
+          "comment" : "last byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "0a1a47c81b13e02edac4ee16a40e84e1b400285feef1224dd787516cdaf9c81431eb3523226d95856f83c0e58f804ad9c0765f5173dce0268a6dd73d65981a678bcfaf867bcd880bab60b779e032ea7ffa1c4755fa2cc0b67f1714e1db97603b47285e4d43b0e4c1c349d338f904968a8ae6a86683e840c3018186b4dc2d7ea58213120d1dc724a3fe72c980e148fc9892ad4ffcf8336d2f0d99963edc2ec7f3bc5382db750c3c6ea34d9a2c78baa9dadb98cf30361a91aaa01a12dba123745796e13eaa3e200c725a999cd84063f14657ab51ce76f7743333dfb4b74af77e8bd32092776b892430beeace6bd3c2f59a364b9820d31bb3adeca568491fcac10a",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 12,
+          "comment" : "all bits in m_hash flipped",
+          "msg" : "313233343030",
+          "sig" : "2b69fdadae6e8854e0e4aa6df667d4cb4e278388a25b4c37f90d45d425bf4f9efdf078cc2e7888c1ff71c2a593a8982c19a6c5b2a9b54703bb007c43226a2d51c35d011a981dd6bf3f5c7c68520468d42417b4f11f62e7bb35c4520bd7d02b74cef0492ee32caabcc35b42166af3a7fd3cc8dac12474a7c71b87f8f018d7631f6452bc7ddb35ceafa5964b010ed1595ac53098557dec598a0c7e861160949e1e5e43ce126add866eaa035b76d1b10724994703178faa228aa0c3ca90f1602dc90a53e8b1493b44192b4488068b802c3ce91c2696c336e1b789e9cf4f1e153cc0eedc8c7f23c580d842078199a263e26bb6ebe469612694e8c6121d97edc64918",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 13,
+          "comment" : "s_len changed to 0",
+          "msg" : "313233343030",
+          "sig" : "63384fa945e41c0e4343f43ee12c115cd021737b7cab9c778cc451d180359c9f39a1c457ce5308d029a508c19ca61fe3434bddf28e836726e6e6d4d635cc3d265c8918b4bd921971fcc7fe8857ca330d01cca47d0dbea91ffa7bc813240cd9a81f799f961d00adb060f599836987f5ae194e22262d27f216dd48497205fbafc4274e97f427ec99ab29c6090a62ae6edc777a0494d7e9812dcaeaa51c436d924a38d8c731f4a82243f0fb132fd9f77403f9f0c7f5569608b530b61a69ee8e0c9f32da8d5bcdb0e8370e964a952250b3fece411cbe28d39ce7eabd54f23110f97fbbdb902966524493fd47833addea2baf31979ef65e9ea5f087f7cc898c463503",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 14,
+          "comment" : "s_len changed to 32",
+          "msg" : "313233343030",
+          "sig" : "6249a0d0651ea272e9308178eeac74e98e48822bcfa21a2663689e1cca6735d5d298be1d1aa3bf70754a91d87342b78b385cbed55fa761d6ce58ed81411770cd7f4d0d1ac96b2966caade37db00e27c74b497cbbd76f9fa13c08596880a3357cbf05e42f826cef564e707e378af170f9ac892e081930b20183925d6f4a8e934829784472c49c9f384fb631310b376282476130750ef3de53fbf564f2d2cf3161485ffbfd0b96d98b47d4df23dc35974bb853544389fc6ff6eade53d9f4f14f0ace492eaf59dce778bb4398478a531a5ea9fc3f230e0bb973eb173a197d840d1eb080632cb7f4f0193e82a1c9571127616609f55e9f258b42890189a70adee22e",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 15,
+          "comment" : "salt is all 0",
+          "msg" : "313233343030",
+          "sig" : "0580894932c20ad27584f68b560d97e095cacdf2b69286eca83396ef0a9ab5d89263ca8e90f6c7fa59736d0d99ce437f6409f56a07b6ccf228965f556f6ae9f1e505a512bda0420e177535582204fdd933d510dc3ed9cbfd80ae37d1bc1c621f06d32162e0509f2c5e139953796cf306216106ab4379030a26d87b9c761bc9b35d26e296446eae2c5df7a54ce98a155292a7bab987c7eba884b0638e659d57b85ee9093401ec11514e67bd0106fd59542470ab328bdbead97efcccf9d0f85bc6ec1879a2420c5ebf6aa53afe3f62b8197ae16593ef4049c0e8d76b2990beebccb407822701fef5e8b5210982a9f392192491113a7e2e69bae2b1779554d97435",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 16,
+          "comment" : "salt is all 1",
+          "msg" : "313233343030",
+          "sig" : "8f183006f11363b35cb506412c27a1b2b12e0da08ae92233b0248d8ef6c4981ed0993a447e6a5e2336eb33fd8145e8b1465f5ce3cc157bdabca33a2aadda31223ce2f0e8c4ef20546d98476f889064d8e95043ad7923bc2e97498580085fc84a36bd14e3fd056d859a677c3fb01868f8a2bd27d08bc52056d060b25c9b5361871e693cd084918fde00f2d6794a3975c92436dca1d07f20f321c0e5d0a52499be6c1ea7be2ebfdfb7982bb51e72a4306ec1ed7484fda2cdc3d38655d92bded1541387d90ceae0ee0e14837ca61c3acad3b3b06b45b84819fbd4df0502eef53139ebf96c804d780396b397eab38f2ca25ccad4cfc8bc4cebe70386d7432e876ec0",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 17,
+          "comment" : "byte 0 in zero padding modified",
+          "msg" : "313233343030",
+          "sig" : "6dc8af93242468b652f14c470730651d6b2de224c15701f025ff056a7b0d72b383fe944e0e4537ab47ce5818e13787e652c373b614543da38a2708b6a522e4c3ffb5790a16d2aeb1aa69610a7dd858ac9bf415ff7c277cf6c9cfecff85df6bbd400f000bde74206068a658f27ccac13055c50911af77d1647c582d5ee140c971701f15c5520e355d32704e383fbf8c4fa571c26a55c6c49ebf4b3f6bc26ef939b575ebeefd4cad99afcab0a9ecc8551e428b9858bd5f6f8d497fc75121d0bcb651bd739d93223197b9306fa6842f695fe651e9b143023b962eb166d21384bebcbb99bc9af257b0f8997da90410646f7783ac65741171e7c94a10c3aee10c1a25",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 18,
+          "comment" : "byte 7 in zero padding modified",
+          "msg" : "313233343030",
+          "sig" : "89c0510bdadd44bebee7eb52cef303a1b751539ca4ad31752a9dcf3af755844eb1b47d1879a4da10ff766d47df1871fcf6fcba06e101134c304e87f1d8d255f5363bb123d56c9d2bb5c3056aa5561cfa772a1f9265f714fa0a5118356699b57efdb2c2c553af1ff41026bd8c01512dc760ce0d62a88d868d46914f6ac3793be6aa65e0059e61babff5a8e58c3bd459533013ca0bb19e63018c926c11e4f910b18263fe58b259f1e6f517f0241d4787cc2da771039ef73db3ab3bc364f65a672561c533205740e0c5a0ff754aa90683d3a8637781d3d4438acb8f917d946543f9054a2d032723e0106c56c278ebf63f66dec7eb6022a5afa352bbd8c19248e6e4",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 19,
+          "comment" : "all bytes in zero padding modified",
+          "msg" : "313233343030",
+          "sig" : "5e0670e048659ad9e3b9ceb3a07cc4a549ad80fab3f76b532dd077c2e841383a781ca0bcb4de50dd0f737f923fe03062c2d33a9ae9f4ce827cb993369088c8cf6dc3e1765d09d836ed63c3f6a949d2726f429841c6b945adbb8d10d5d7d3f0570d30a813a32c20633f03a6cac4850f5aac776c7e573902af39daebddb205efdbb057662116c41fcf9f46d1d0ab536e300dd9c56fb7dc702fc0385e25149c64cfbb5fe663660feeebbfa009bd40a9d011203a2b216f449c5b949805abfb766a3c2a1d8dc8fd37c1ab4f228c0719f72e223c3d4937fc871f6972268313fba32788f79d20df3ce6e0a540f061711059a7a259f5c38e0389a77e61f13b094f1c4010",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 20,
+          "comment" : "first byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "5694842681c2892a52cd903b55004859553dd7b42f85ef93492c74278aa4ded900a13245b4e3fbae340bee5880e2be0ead44c5ac0d529063d9a22145ddd9652259b0a134213a56b7947c66e525e136dc86d1ead3e2d057018085b5cf03a2621683d59e60cf7712515343681f857821548dd55092644219015b2e39ba4efcf3ac8794f942e1e7f9285dbd7b24eabe422a23e1c9e61bb42f3c204f572ffda99ba97c90cb0db3936c262177e1562fb333f9cc1b859f55c9f3645e14086804ee965184a436ca13fe458ad74818b554ac834ebcffa4d54cde2a82233da5aa9ab0de031960e1cf48fb00aa89949f8cbb9e149914aa401ad948b32f90f93505706a8cf3",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 21,
+          "comment" : "first byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "012739d50132db2da632e03fe9126b3b3044f3c71aace80cfbda5c58c22083d0be128a972a6dfdece0445e19161713f33bff4a49ca808c5d0ef2e79de010f3e28eeb00233e2ecf35cc7766b1c130912557beae44717524da4ba553eb2d4ecf06a331c9a82ab6182b02c7143dc9ad1bb33075d234a6c40c6551c864811bb1a4cc8171c6d814d79bda4647f2f11df515132f605b38f080ed400a976f36fb81e58ddd1e01b7de4f96a952e7fb13b2169f70ee679f07b99abca564efebb234a0d66c24bcd7710f89839c93ee6868341327a14960c0e385cb786888e8d462668f0d5f1db94c69a3b4f271e4e7cb64117a0004c87df15ca9fca63f19a0f49a9b61da63",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 22,
+          "comment" : "last byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "9e98e3431040f3f939def28cf782ba23cdb0a92ceafddd4c6469351c639780a195140eac331416d00a2f846582433b5141a3021459a2eafc229448b178c376c0f6ad8dc7dc1a0cd048def48eace50e8f77a0345cd3666d20389fdeafa3d4474d50a41b7bc6db000b128174c82df7cff6bd17335dfd3f6d954e065ada694ed33c291b82191a1a90cbff58dcfed4f0fdc720369f74a9b218d85eb14c0450e1523b688f5ea1e5ec9ff10d39a42f58902f6639d0f8e760d8f6067a57921515b2edd8338cefe09171decc00a50ae806a47a7d35dda7376aa962d63b0189a63642d33dbf9153a03c1e496c01b9ef74d6871e1d63bb61719b3ef5d40f4dfc15264a07d8",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 23,
+          "comment" : "last byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "76533757a9a6f4efaf59b8e4fa38c50cc7ac5f9bbaa7f45583ef79dcfd50afe07390f572c5880c27badc4ba3130494aa396540b8fa3d15d1d510d0d0ad7a07d3b44fa989957d6e50ad3921449aa6adea1af2879cfba9f8f045f5c3457fdfc53525c00de55ca0069e239b737e0c02b497c5f2f33f66c9fad5599ae3168bbb1b0dbf40f4d941ad26a9483488d06276b167d089d242cc423b785a4c34568817af7747782db559a32610cbdb368511b7ccb5be09c0ba5a21f677405c73a43088b193d445eb54416d282fab82453ffbeb68e3a1e5eb33a705db4d8be0149817a255c40a53040c05395abfe2c56fae34b8e2ba083955dce77bb7cb5e5905d0ad9bff6d",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 24,
+          "comment" : "all bytes of h replaced by 0",
+          "msg" : "313233343030",
+          "sig" : "80fdee23937b15c70116b060340bc7a430914506880dd3f71b5fda9f24964a9ba69454e7929c529327a7bb648c2789d3b4d5d2ca465c74b7659cf445e57a8e7d11e614e34b2f9917139352c0f322428d7c1dda1fa11750a7eb9e7558a6152114f148a90a14250adcdc8918dd0c748b71ade03126ff13a8a191c024291bbb1ef80e5e559a27d6d204247e241864ecff580c56b3345a803967aa0952b59a5401780299cde2cf1b783bdc3f8bff9ccfdf283896ecfdc995ecdb54e394add4fbf16c0904a5f581b4061bf00b2ceda8f7acffc463323584ef69a194f2ddc2c2ac6002bb5647643eba036f4ccf30472387c99b6e199a3a04caea8135ec82654a2cbe3e",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 25,
+          "comment" : "all bits of h replaced by 1s",
+          "msg" : "313233343030",
+          "sig" : "2fd19f1af2e56de93cd223e96318b336fc587fe333ec6b81b0b4304d85af72cd56dbce64d9d75f023c39e7d82307ea6504c81bb28119df545e1ac8b73453a87a6c1fff0619c537c6c1f98694b35afedf37540a70f4665c1fc8ee0cce2e29e68c821ff558433845ae46118179cb24ed247419bdc48c13b927e9d4a6da9e445dfb0a1d0d3f599ff1927956fbf04cee1f6e004490198edb6b9cc440ae786f74ddf257474ef3a5f273d87ad361434117ea0172e7cf4a8fa3f0768eb4c26cda4f8d0bc7ce90b2ad39b588897f85513d22ad0af86ddc0a2664ba2dab0b0832160010d743ac0a5ac69b00a68a148ba6c4ac36496addbeb188b58bab9e9b06a2f5e30ed9",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 26,
+          "comment" : "all bits in hash h flipped",
+          "msg" : "313233343030",
+          "sig" : "004524fd468f6b32c1e39aa51df5052e174d02851aa433871dc4c9f72b6fc5dd776a7e68f57d180f049d6f90c4c6d5aa21d0749d2232bc2e257dbeae0640b985706eb285b700f6480a29fbf42152f5505b91a73ec8cc80e17b5236dfedd15280e6de907080b339b116f644ddeed18361851ff25f0b6c174e49e0b33962086cf19bc4423f6ddca67c52ec62b8b664504b6a5d97c6d68e80ac522a98008b3d4deef1f0147f3574f4acadb8e3687b410c2f4e52cbe85163a26356dcae935581fd75434da19e1022bc7865ebb1c15c93968fa357e7029b328ba7e59ee6429d4858bc9acf78fbb68508d653c73b97da4bcacb1088ce88c651a7d90c7951b920a2ee80",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 27,
+          "comment" : "first byte of ps modified",
+          "msg" : "313233343030",
+          "sig" : "aa33236940904a0c0c88e3f7b9744343c4577854cc017e8ab0aa08694393bf1166a55b56f6589fed56bb4bf4c87151407363c36a9530d200a92eb7a04f2451245b105d1d44260ae10385edb5edc6e118e7b27f4270fa2988b1dbca3fd21e1d3ae6d62f24bb4af5138eaef53c598fabf108ee78a6a986c14e5c472f71b24aa67a48c5986ac3962a6eeb9f35d0f09d22f0f9a665cf80e08a19e9cd7bed243af7edef90e5a025fc2b8b0b3ea49940836e9971d3558defb2a08ea6b7c40a4c3db6fc4a7aa4891297f9c9dc92d16b2e6cfb7f558603fd17ce5bada483688b344278e27d05c5bcc1d2f44f91cf24bcd50b53289c744ca67b909ea04fe1a1bb4f680b41",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 28,
+          "comment" : "last byte of ps modified",
+          "msg" : "313233343030",
+          "sig" : "7fd4d853d91dac3e29a1d24df4586aae452aeb7d997ed8a039490c2257a259c2fd4e868320a5391d5cdfe13905ab7fb248d722a6932ea15750d8a26b810d10d5c494639b88265d385516acbcf6dbce502b834999387635690b65b65ba1053a42f909b05d590498bfc9962db35f14a1ffa10cecaef5dbcb6ce73b783ac4ec4119cc22f976f3e91be86d67b0a1a45f3b8b757f893bca0f717e9dc4184aac01296e18ce1a1dc643a37635d2ea0618793b1624c0c0da74a46e422df25c56a6610e02a723bf80f147f10939eed5ac347779dbdcdc4b994cb4cd3388283cb6a04e4837d903f75ea7d08a43d334be80b3c05a6b0806502eaf4aecad28abb86c790cc4b7",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 29,
+          "comment" : "all bytes of ps changed to 0xff",
+          "msg" : "313233343030",
+          "sig" : "952e142d407387b8bf807790bbb1c8bbf73f86cf8efb897157d5f15ec6579ff2478216eae543b9e81fa45a015070d31f5e8087a987df01e66c332cc0626c984032b3368621b53157a7531d491e70b756a2112a4644486ea74eed5536aa63e5b992317fe1a68cf1f37109aa4709b6347da34c4f846a82b25d51837df3bdb59a41e6edccd92e25f4885d58a164b23e11dbb9ecf3981917ae8682f7ca8606d770114527f34799686bfd3b6e000df2e719fa88d6272bb308403cbd3b216133b60ed74448b04909dc24e2bd3005673667157fa336f3934da3b9991f5584641e67b8dacae279d6e92bd564364719f8a79415c59e1150281ceccc23a312f39c783f0c4f",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 30,
+          "comment" : "all bytes of ps changed to 0x80",
+          "msg" : "313233343030",
+          "sig" : "3cc78a8aa312cb60d3452c235d8a530b3f32c376eccf1c981f87658ccf492989aa059aed5a18971182d1a083015c2616b6f5305e37843e8b182a71f19d09a03e46447ee6a4b03846b6cc629c2f39dea75aee0c79040cf6ed930abeabda242032e47082ddb23e62cbf11379022ae08d5463837a10d22d9faf63f3436c8a762a030832333064e73642a01a0bc722d39b11dc720247081280d6790847314401a4def0b1ac9e307c8531fc1136efca55b19c4d0697af168f81c62aa82a8105566b46f690209b6829b7238f579168e11ba1f02646c4a8557a4b15d2136fc2a2f9a46da9688a5c3ae61e91b2463075b5422e82bc40903afa867cd7a77998e097b921f9",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 31,
+          "comment" : "ps followed by 0",
+          "msg" : "313233343030",
+          "sig" : "3e68229146bee8f86f1a85439d59132c20f161762d35e117b46a8c9bf6ef7a7b3a6ffc7e83382c8f0550b491c304c397d8240ede43efa5e1cc889e90d0a5a7b829e885f72f764d1574478c2dfb9530e42de5003121a2aa865daaf421e973899c8f3d6479b80b500c10e1b8375f8fee56b1fdd5fe1d1ea4f0ed1ab3e42abed62134ed5ac8d513a91ee782c79e92cc3e76bd34fe66ac3ed4f6865a6c0c5f04c3b430aa2323c9ea5a0409abb64c1fc95af535a3cb45596323431e208640d6f8b9d425bc2c75f0f2f431bb1943198ce80189755569b8c1b09acc729122357de8c88d185926df71ecafcb0122edb7097165337c83340b9676ead12c692c4025177d88",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 32,
+          "comment" : "ps followed by 0xff",
+          "msg" : "313233343030",
+          "sig" : "aa68dd72cf47df9a0d01f5e7bdc297b35a5cae62846e707b0b8116fc2527dff6e6991ba01e8b5b84bc20e82cbf26b2afd524c68bbc3a6c872b6fcaa92e4fd55b69ce5b773861b3308228f09cab60387779da33213724669fa119ada65d4945bf8c3af6e445584c85f553b17ce6bccec8535e66952c34c9517bafe73a33793ea80e3be07d607d4c7f047198708f973e4f635f190018278824e7e5c8970413239e48854e107b26535085c61309b62a8b2b96320523cef60f6ec30d278bbaf462221bd56950a1f042063148685642d5721ee35e5935aa80f82a16457165b22ba48cc79c4b2cfefdb1b88570aaf760edbcd1f8fef2fabec9d70e3e425daf7ea47d66",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 33,
+          "comment" : "shifted salt",
+          "msg" : "313233343030",
+          "sig" : "70ea1c8cf6d950da9cf4f11da5e91089c7b60097004337aa1394e004b58ea4b722decd23dd2260095ff8179f70f9a7c29430247b4086a341302a36daa6e925e42d192835c7d69207586aa6c97c184f17ab6f2b6bb6f97a3d866a2155d5199a6cb0121ee1a31030635bf505c0fb96d883cad6050bc1802769311ad1ea23aaf884e347d2a2ed71c460285d0d4d064bd276be732e899d01ad3b5e08745732fa1bc74622bd20fd0a53320ee5b70cecbb65ed51d6f29f87774b36f26ff66129178beeff34630df9af9ec80cea6b3e307614be9a20a1038079801c24f089847404252e5ca4d60c1613d5e6b1c596ed7a09ec162875664a6bd5168d352464e13ee81f2a",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 34,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "84fd2800622e4808ffbf30bde60d9a55c702ba39e344230d8d5a1fff44be6322abce6f1c7a702e2e1c3660c891fce6aa3833bdd87a6d1b28b629c19d01d24d06bf404d54e444f055bcd659815944daea78df4939fe6912f9c396cd9139852a76aa8f90669013e3307ca045793044de1702e98c3d2e02a4023861d13399f489fee3a3a1ee91272948d08cd6503f79f321bbb936910f36c63f8e24a3ff10908547a2818e9d5c954cf3564afc71884b47299e16c70f9f9d2affb68f2620acd58f5e4538f5b56adb6c7f4461d586e1de2bf3c99b7de01bae479ac124a59aea4d4df707dae47edda3bd3c74696fb62a9cd24282193f0cc43816279ee0e2683b82c8bd",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 35,
+          "comment" : "leading bits of masked_bd not cleared",
+          "msg" : "313233343030",
+          "sig" : "764e687e19fd6c0f60ef4767262faf217d6bd83f402f72c46dcfcc346f3170d67c3ee927b3366ebde5fc81d576bbf8a0da76ffe950a8dc441d4bcd3485f5a821b5d58dfe6567b7dd5a3a77f3062809ba7ce311fae758ef696d1b36f3066a054d11a38eb124b17b5387ca71433685c14042cf68a1ae42b749083bd852113a214af76c7e34a791c9819b59b261cf71fcb58812c52c9636153a893ec60372b24388f28eb15a806ef912052911661ed55b71e4ce3f5b16d4ed589c27a2a07d2c488990fbdfcd9760fb7b61d56af8ccf00e93814add5a41a436472d7c5f848cbdf269fabcb9452138b06f810f2958b04bf5727640e1d81d99f4e7d6b413976fb59ab4",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 36,
+          "comment" : "first byte of masked_db changed to 0",
+          "msg" : "313233343030",
+          "sig" : "452efe45f5f852f61c14e7bf357e58f1a601d3322ba60b7e4d09a226fbae5af2ed866226ad7dd0e658b00afe58e0f017cb218b28dcce2d10bb8b099d8c3a7b4fbc6dfc2d085fef16b5cac7123540e9623fc4704ddb48a3120c1753c2a4de13053e4fb61135375768ef35baedd1dbd31b1b4b51e8a7b9108c8c18faa5d55184e2aa693e27e4534a60627c1cf2ab332fbf13eded03913b310c29f48a09912eaf2128dbc0e402bfdfe5d10dcc3a7071fd12497d904038ceec21382a71ac9a0dc28260acdd23405a291b2c0fe2c9764b04f53db8e2f640f70cb57c452807a01f588529da21fdb8a93f569268c2e5b8f14ccc21e3c05d88a9856a76a58b9e7201b1dc",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 37,
+          "comment" : "last byte in em modified",
+          "msg" : "313233343030",
+          "sig" : "2815361aa080fada916df00abb4ff6745144271e36868facb4fd3d42e079b5f0aca5db90991e454f7349e9e8aa85517f8c5a148547c646f9d89dd38a18ecc439b6d8e1f1a67420af089f4030e310e3a9aacdf32c687946b1f2829364bf6127ec9211327793468832090a1afc178901946b552e399c5f4f83fc099c31c950d3f7b3913c13f93eb23186bef7bba43724caed7ddb3551e937ca006ac892d1f3b8933d9ca952ee0d307ca131b53fecc975b29b611a5c95585cdafdbe8f0037488b65d4b4a3bad17a784171264f257b4a7febbdd5a959d99d4e1aa89e6bac530d38acde8acdd068349332b32e05715bda82c25d2eacd58fe72d08af9fbe3ed60990a6",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 38,
+          "comment" : "last byte in em modified",
+          "msg" : "313233343030",
+          "sig" : "abf40fa37aec687e46bc355e0dc8534f27e9bce3f9ea2d27b5943fc27730d38bc948557b581e548f46d47a18d726806b547866127657414f9b1b0bef341cc2c6cb80bcfbbd7c59112268c49d3f7fd896a4c121b487a99929d94606acf882569d9d63c92bf46232059a485400486558a5041737205709fb3996a8e0f697d4d98a7131bddaaf2000232952c6343a81cfd8d10b4a944cf16cc70c5b78b8adb0a10d690c2454581e5e36aa83bb106be6a753f0807e8c6383e32f6e4268cc91af1a67c09f85b43db732cf401414404a2bc378c7546ba6acf93ce409eb049c58c286a3ad8bb24a8390c166e6d7860a511ffb622a587d44040936238265def3ce8b0972",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 39,
+          "comment" : "last byte in em modified",
+          "msg" : "313233343030",
+          "sig" : "18215b1083aab4e4dc911b55332c2dfc7fe776dbf8873eaa7738d79e6529c27081b43e24ba7fe52f9d38933aa9a91337c1cd607e82f092b82895eee08ead942d344a813be0575b110e95e39ad7fa07ca1904926e526d04831c355059570fd24015e2ca660207b55a5bd45f2043f2704dcce5f2f992dc9b185221ab4eb28272cb5b179c6f934e218471f989da57c787e12cc1079428485104cb8cdb380e74d0d8bec8f75cd4831beae12379493f58db754c1f332fdf51d61f2d34f297dda0f761be3afef70ed769fcb786348301f954586f135fd55a67cacff16760147c5f38c796b4837ad5f0688fd0ea5e6567fe0c7f89803004c45a5343cffa5e20c7630c9f",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 40,
+          "comment" : "signature is 0",
+          "msg" : "313233343030",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 41,
+          "comment" : "signature is 1",
+          "msg" : "313233343030",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 42,
+          "comment" : "signature is n-1",
+          "msg" : "313233343030",
+          "sig" : "af3897c38ca932c661de8cd18315dcbd8582e98f9f9a21d8cd822d4d1bf1ff1d1bb98dc0ac25c4c268d82ec61dbf32dac496eab4622be114a9309634cc85c16036088026da96abd350152e549552500d6ab9341f6b695c0d4d160f6d50fe97519b44cd74edd65bce876db5da9adeb87a7cba1c5c02f0d0fba690b4ca855024dceee68d04f48679d5c63ec87fd65e1e42604d32f0453db7e83a1bf4dbb8230308bf7c0e36013d555429c6650d7bf576b37b25f420798b22842340e370702fd1cc0fce98a407fff326017dd985f8c64bb6686aa274b664ca44e40de1cbbbf79ad760693c256f820d0dbdfcaaa440b0e69899b7b9bb2911082ba957c4b188e6d6da",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 43,
+          "comment" : "signature is n",
+          "msg" : "313233343030",
+          "sig" : "af3897c38ca932c661de8cd18315dcbd8582e98f9f9a21d8cd822d4d1bf1ff1d1bb98dc0ac25c4c268d82ec61dbf32dac496eab4622be114a9309634cc85c16036088026da96abd350152e549552500d6ab9341f6b695c0d4d160f6d50fe97519b44cd74edd65bce876db5da9adeb87a7cba1c5c02f0d0fba690b4ca855024dceee68d04f48679d5c63ec87fd65e1e42604d32f0453db7e83a1bf4dbb8230308bf7c0e36013d555429c6650d7bf576b37b25f420798b22842340e370702fd1cc0fce98a407fff326017dd985f8c64bb6686aa274b664ca44e40de1cbbbf79ad760693c256f820d0dbdfcaaa440b0e69899b7b9bb2911082ba957c4b188e6d6db",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 44,
+          "comment" : "prepending 0's to signature",
+          "msg" : "313233343030",
+          "sig" : "00001ad9d6447423c4436a96c17407f8ffbcb8a41ab5421fe319222899e9091fd219690a97f801113d33e13fb5920335646616a35ce4996d63504a2c0dbf7172533b06738706ce20484698cfbd24eade67ed91e6b985ac2df1f17c4598125b2439286c9c01fd10901058b7318f8cc49aadab349560d473c30c3389905311d78288f900cab33b5db060694489a018c2552e588f32832820703e3838b44519ee9430eafd65076e5c8195acbb85ea1e4502810ac13ed72614db0c4bf94ad83dc95ca2bd47688021a56429c4b74b1acd82f242aca266f8a02defdae8b47e12d790c6a7c157d2bf530d50134b1e7c8446bd13884f3de0d44fdca612cd3d4260b6570ad0d8",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 45,
+          "comment" : "appending 0's to signature",
+          "msg" : "313233343030",
+          "sig" : "1ad9d6447423c4436a96c17407f8ffbcb8a41ab5421fe319222899e9091fd219690a97f801113d33e13fb5920335646616a35ce4996d63504a2c0dbf7172533b06738706ce20484698cfbd24eade67ed91e6b985ac2df1f17c4598125b2439286c9c01fd10901058b7318f8cc49aadab349560d473c30c3389905311d78288f900cab33b5db060694489a018c2552e588f32832820703e3838b44519ee9430eafd65076e5c8195acbb85ea1e4502810ac13ed72614db0c4bf94ad83dc95ca2bd47688021a56429c4b74b1acd82f242aca266f8a02defdae8b47e12d790c6a7c157d2bf530d50134b1e7c8446bd13884f3de0d44fdca612cd3d4260b6570ad0d80000",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 46,
+          "comment" : "truncated signature",
+          "msg" : "313233343030",
+          "sig" : "1ad9d6447423c4436a96c17407f8ffbcb8a41ab5421fe319222899e9091fd219690a97f801113d33e13fb5920335646616a35ce4996d63504a2c0dbf7172533b06738706ce20484698cfbd24eade67ed91e6b985ac2df1f17c4598125b2439286c9c01fd10901058b7318f8cc49aadab349560d473c30c3389905311d78288f900cab33b5db060694489a018c2552e588f32832820703e3838b44519ee9430eafd65076e5c8195acbb85ea1e4502810ac13ed72614db0c4bf94ad83dc95ca2bd47688021a56429c4b74b1acd82f242aca266f8a02defdae8b47e12d790c6a7c157d2bf530d50134b1e7c8446bd13884f3de0d44fdca612cd3d4260b6570a",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 47,
+          "comment" : "empty signature",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/rsa_pss_2048_sha256_mgf1_0_test.json b/third_party/wycheproof/testvectors/rsa_pss_2048_sha256_mgf1_0_test.json
new file mode 100644
index 0000000..ad6bd95
--- /dev/null
+++ b/third_party/wycheproof/testvectors/rsa_pss_2048_sha256_mgf1_0_test.json
@@ -0,0 +1,375 @@
+{
+  "algorithm" : "RSASSA-PSS",
+  "generatorVersion" : "0.4.12",
+  "numberOfTests" : 44,
+  "header" : [],
+  "testGroups" : [
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d50203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d50203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAorRRoH0KpfluRVZxUTVQ\nUUqKW0YuvvcXCU+h/ugiJOY3+XRtP3yv0xh42AMltu9aFwD2WQO0aUKeidbqyIRQ\nl7WrOTGJ25JRLtincRoSU/rNIPecFegkfz0+QuRuSMmOJUov6XZTE6A+/48X4aAp\nOXofomqNzib0kO2BKZYV2YFMItphBCjgnH2WWFlCZvXAIdD87KCNlFoSvoLeTR7O\na0wDFFtdNJXU7VQR64eNrwX9evw+Ca2g8RJkIvWQl1oZaYFvSGmLy7obTZyuedRg\n2Pn4Xnl1AF2bwixOWsD3waRdElaaYoB9O5oC5aUw53MGb0U9H1tMLpz3ggKD90K5\n1QIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d5",
+      "sLen" : 0,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "20081f8894a1330c4d503f642880e3c30e398fc6235c24f1be752e2d49cd9493ac0cf999e275c4f89ff08f0d9ba4e264a332525a616d336bd9e822f41ab3f4fae2f48ec66c2e52642ed93b7cb944396fbaa727cbfdfc1f20aace99a6f2a74475c338f8d9f22a38cb5bc51752076503b3aef1e65e5a8f8583d9ae7378ded038cf516898ad06beb90a42b85764526fcea44f74258fa4efb1da253d337f65619181ceb832dfe285ce78ae6b15f204e23bab274e87445d9f5df97f41dc8e3a97736b62591d075744b2552f90bcf1b1393e1e7627ef1f985f2bbabd52e43a35d0ddf4c67126e391f922ef7b1bb1911cd6e1b303cb2910dd70672bbfb62ea4eaad725c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "4bf16f098701d340c438368e658ed8904d3a21f7714c02440d7476ead132766b3d578b325ae752f906873af1b795585a2a0d0e6788fe903321b2080bd0dfb9de42c3be41aeff37e32defdc0a75f12adb5b9de4d067a920a720cb16cfaf56d7c09d8ef384a8aa106545229b540c52b49ecc9d6d14ea70480642b9cd0330efc005502e4c38b96a36456447ce2133df78854307010ec221305dc90570252321e06c1bb01d75100e85e68326fe92488c0c5e58524b10f8ec7458d887cec254d39b0bef921ba31fd5a117977f1945fc04837727456949ffdc9886f21071186bf32dfbd9c3cd6a2a00a1cdd5fc3c22f4bbaab92aa85116711f1c53754bdd2bc384f2a8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "2b3155b14971f79c9e3294723c7e41ded41af709f6edb2c19f3526584aaa1ef2de2e7a8dcaf5d7c3239f604c421656dc58e8b0852f7a65cd557724a9b2a17cac38d8020e939bfefec5dce0d8993e75615b974944e4c4a811e40db63f13d2b626bf26257a706a7bedc863d0100b676ab70d4a4f6eaf4692e0b69ee4426cfe7cfc3e92d93bb804569883cf31fb282efa5a81ce9f6d9f0ed79251ef2a0b596f80e0eb96ede67e30457a07655d777928b898ed1679046673e489d9c6305dee05abfdeba7357099f9cffd00735165ddc39aa7355b10a8b8612dfa2f836fb9f5f89f1407365d6b39a39e89c6647ff9da5fc6f960306686a8ed8e2ce12cc7fd9870d576",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "5e91b5dcbf02d6f19621d41a83dc8f15ea83c0edb83765ef029b0acac2e1ec8918b1d2afe1fadf11c48d27594cb9c01fed79d90e5d5a8085c438450111aa7d9fa39c2345b14fc3c2cb34128f86db5eb00bdf8dfe38d61f29a41fe31342e7aaefcb4b122eb5d63c2f5c263c8df8450e9428ffef974d535818d51dc03a7d60c8b2d16c999ae46d73ab40515fe601d9b89b1d09c6d60cd51639a97c1d211e097609ba5e8c319c6fbd21b34a634ec8fb8971c5aae21c70b847a4539cc10dc314ddd8a9629e8a0e51c66c0cb61fd1f7228c01c6769190abe9bac9a3897800050014358594e0fb20dbb458b12aa1346826cc9f7e9c5352b073d62853dafe77c848cb1f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "501c8119a0f8aa2139ef5e05adc65384fa389b9023532171d514651ff48677aad546326a2e3c02b39ed84e5b7e4630604f2979c1fd7bf37da8e0cedcaecfbea6f9c715141a1d052529d0d0fcd71eb70867e2704377801a0ec721fc59fca9d8b1b08cd9ae3ab094f5bbe2faaf3171dcf1712c534bbc7ea802a2a72d8cebefeeff1530e4081b85a42ae38f630f38c1121199f2156e267ce2467f9b4853dbd29dd999aebfc402f2a0c33b8c1b8022941e754b7a187df4c59633dc6e76cb3200e34acfde53a386647833dc2accf244726fdbf440cd32503188a291e5b0678aa729b539c1f5f97e7b788c0c20b88d90c90a3bf33300d181b9ae797cbc76049b43be3d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "a17d67937354c7fcba18dd5383edbf2f0868ccbe0a316876fb1c4fb14e7f4c048ef5ded5d01d02556cff0c8bf081bd09c46ce4da156e9810df195c5b65ddbc3025b84f91047049f205341ca8dc55e440bf8d9a3e98c231bb74e71be019cdf451e962d8b7e8e6d766d3be430c7596ffcafbb785e5fe8987ce721ae228832c8b4fe0b0071b0e5c652856f785695f70cbb3c62394a8291ba5f587d4fd7bb448649a72261447aae6a2b750824d400ca402543c8bdbbb8e7c3b44cb7085a83392346abe999ea2a5ea15e9eef6bf08a88096ee4e532369f0059285298b387a428e5e34ed7296e0b53d34c5e23f0d3c12e8a2d3132672a655c7048bdc0c69b36cae602f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "64c26d43b028f284e9667d5951e70c75e611ae2ab876f66ccfaf09bd54a26dd17983d993bd4f5270537f4c4b2e48695eda28c8c365486b5fc3bde4049dcf6fd722e634fdf5571d29b1e156a48b0c706d96155d86c20dbbb1a47c7e54efa15b25d76f502b3069e2514f89d9bdfda9bcda02301c58e2173cf4f3dd49d8415802c11aed78f031e8e2e50197443e5fe9ab55afd8deeb7b5db8ba7a7b9fce6b7d9eeab9ef25035742d076935c059d076b4714127d408c9428a90cb9891a151eee8de7d0cea32b0ad2d8ca4abeb0521b296b5ac08f7c53d5c85e47ed828e0c11468d6cb50bea89e4b455936376bde9f22eb98b3e2395eedd05d1def38fd5e082ade3b0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "first byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "6b77fb8cd287c666cbc30f00bcfccd31f6dc01655c3c976d1b2a980d53be40d6a4a7676024abeb1825ec47589365c07e5d4c3d34e249814126e32ba40aa81ddea0f61fe4e3725aeb9751103fd034cf3fa516fdc1569aeb7b028d192c8ef4ef60a5befb8a4de595bd4717462879f424e87286aec0bce6f9e763ee341765c24cef24f916a52a777595879471e2f3188c1be77fdced941fe0cf739bd8d5a4ceed9fa1e47f6f12dba68cbe7bb2eb81e46c2788b847d0ab6f55951f787db4ec736772851c43534b7ebcf226c2540806d925bebec9d109915e466d08e2470b7e85b4fac66e089b1a535ba703dbc10f800f6bdd557370e9ce761e86466833903efe315c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "first byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "4af6c02b1f3c2719fd1c84965658e36651ff891484f4c4177fce2185b7098c861939fcba677e8ad461577a666ac77653ac37fe61b5fc235ba76917e03c3419fa3b055171f959edc7f9fd349209a23a4aba57ca80744f69be6ffd1a2252a182a3a2c1a2c069dd4953dab9a6acb4c7047d7402584275cb726875c0858066f50caebdf7e9afb6d4f3270662afbc66ed14ce69a846fc0c54f9e57bd4f827c0b780c30dcf8661cf4bb678ee0396bf8e0a08d259593170dff3f93dfde9f4d9ced510e07a2736c8727d2f9e973e32524e072a92dba8edb2d1628da03741d227255914717445407111eefaaa889febfc6f4b0d42dd958937710ba5e94414a26e09cb3f5c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "last byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "601f6431b0607c80d5c92c86a63d06fcd862bb35eda31a7f331a59abbb8ec18fbc86ec95ad63723216e151b7bf73135c028a5ac3b45f30a7ff8ea43d5dfa6a52f5fe1405e6f5d64abc4999f8c580701bd9e451bcf6d54bf0bd1c83c7e0399e7805757cf436164f365ee76f29433861856b67b6cbd8b235365786c2de9b305e3293792202e1848f9595265ed6fd4b1740bcbcc697d719ff70b9200e65d7711494e18855fac36bf9487b54798f39d5a32b5d62dde3de2c3b5f8f7f4bbaf3ea04e11cc8a4f6247e25c8a3a4e05d831199d14cf44ecc8e66c8ca3883b5aaac3eb5889b23dea6ba6649c8a69cfed547ca936a57b220c44b8eb8604c8dbd81a3500116",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "last byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "2a31524193054309ce7b6ae9c4bb053f5a5aed273d7a4a609496c7205f5077ddc746e8a4ea376bb879556d4999e788fc8f82378f6281140663af2fe0995a1b73eeef60341d0720ce47282eb87bb79908be8c3ffe86182d174afd0522a87fa56e0d149ab4c32292ca1d1a8478ad4090006b32a147ffe4303487196d308dd59f81eff956bd6ca87ee0246927e279bf80807ef45829824c80b82f7442021bccd8ce4513cbd4d4150fff20ddc2ea942ef318455265b5667a74ebbeb83a05d15f3215c04b113c8b55ec8be512e797a3ace15d2514c2bb74f50e0969eb1a2291fdb6fdea1af0cbea6f05937be614003c1569b648c2012ec5dcde806f68e247597bcce6",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "all bits in m_hash flipped",
+          "msg" : "313233343030",
+          "sig" : "8291cbd81529c8f1e27a907dfef2de16dc6d382b112cc3d2d69f4c6915e7c6992eeac6e4b82f5396a46eab562858835ab0c0aee63d2585dc7537dc0008a4b40803467abd5fdca4114282265c2bd929a03c7892774a21ed6454e73684673d6448b19555d0cba9e4c00c99af77b30f1daa4b15eef8489e15a276fed1553e617a64dc58d5dff3c05853a7039047d243c52e53f7dcfc40641bb9acc33ed96c74c79c93b79f32566cf553428cf85d2d36a070c89f1eceb4606fd285f7ba3ddef70ff151ed0fd3a5b6c5338eb2f812cb4cf4827caef0b896a1d49f49e2c3049462d07d0e64d33f1e2c615c62a958abb6942d9ac8fdc39acc595cd381aead075ab7b51c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "s_len changed to 20",
+          "msg" : "313233343030",
+          "sig" : "57e8cc1dc00c07383d89a79b5c8e4f5bde2a2ba55a3c7201b3291c4d805b1b2eb36f8f326b542342da180abe508669bb6cc2dd54e327bc70c1e317ba93a0fd21e7fce22a0c597c7420d1d5602ac43d9348ba3eba561f250e301ab955b0dc33e4abde32946b9b3e86c8bf07a44646ca595960bb988fef04b2824967e9da8b0264f1da0659373935313a574b5380f0b54ce1bc0dde423bd3a54f6ae5fafa772a55c1c44eb6edffecf13e6e5e1edaf87a79e338577304141fbc44f0e9eeb286f553f879addd6e12e436fa3af51ad53a72f2679f0ed102d504ee08706fe111eaee49d880d1a0b91924b3b79968ed0f9bff446dac199ee89b158c074927d27b864498",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "s_len changed to 32",
+          "msg" : "313233343030",
+          "sig" : "68caf07e71ee654ffabf07d342fc4059deb4f7e5970746c423b1e8f668d5332275cc35eb61270aebd27855b1e80d59def47fe8882867fd33c2308c91976baa0b1df952caa78db4828ab81e79949bf145cbdfd1c4987ed036f81e8442081016f20fa4b587574884ca6f6045959ce3501ae7c02b1902ec1d241ef28dee356c0d30d28a950f1fbc683ee7d9aad26b048c13426fe3975d5638afeb5b9c1a99d162d3a5810e8b074d7a2eae2be52b577151f76e1f734b0a956ef4f22be64dc20a81ad1316e4f79dff5fc41fc08a20bc612283a88415d41595bfea66d59de7ac12e230f72244ad9905aef0ead3fa41ed70bf4218863d5f041292f2d14ce0a7271c6d36",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "byte 0 in zero padding modified",
+          "msg" : "313233343030",
+          "sig" : "1abb40f03dbe5b4f1365862d9f095a8d57e8922565372f0b34ef5e232441d577b3c1f19a240ebda880a09cb41a7267732623b0faa414843f9ef063f93a92bfe5f98f7c28da184f011aa787ebd0b5fda4aec1beab6757add32f7a35cb407779aacef43c0429280e5a040cf5943dfb579f86e0c63cc828fbcafc9c8a15ec98fb64ecb5e295dc360f50230f415337aaac6fcac02fe625ef61744488eb7cd81a4e788a443f56b32bb3a7a344900806952f6f3f55f8d9e9217ddaf06a0ffe8b0bf5551d87cc9251d839441cdb3c72ae9c6a5a3de7ab85f908ae7d04232c52143d272e87a54c5b39d399b49ca7e96edd3b6e22c296de69e9e1848038025780e4f1ac29",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "byte 7 in zero padding modified",
+          "msg" : "313233343030",
+          "sig" : "a11bd4fdd30fb353314530d60b1cd921d6091658e0c775432b6b702b1563a9e5b547f968ac13ac5b7027aeb53ea8987c9441fbcaf414bd04434445b2ce6a1d9dea2f2f179a6d40342a25b10300d45358f703f814917870f0a47f4b4ac47228574096ff240ab0966bb77ea9b5155c6a4fa0a185ce5d389c6ce28821262698beadd0fbec4ba2b66389d610f290656b7a4f7ea1f4a3c44b3528bf62f72abf7935e0d8b6cfc2db947e440752410a43a0ef77c0dc31b58be021b94118e5e0cab1d8994e76ddffcc2e5d55fa59d1ba792fda9db2b5ba9ec6f6bac395c250e2b8ff245a448b611797322bce637c0b1537c9765a8498e0e0371af2f8ec15f32e765ee234",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "all bytes in zero padding modified",
+          "msg" : "313233343030",
+          "sig" : "83673bf6d178e873e986c9a9750befdf2d6a3f0128ec90b5a8059d32f9f9592349095e24f88e9fc48ae549009f52b4d821fd40848a9aceaec252374b17d4950296e30b3ff489d420b8daaef47488696762ae4cc55ade170c5e0d72e696af793d5cfa04477c147732328e275999746c3680c3dca701592b17bb37dd8c5eeb3a929f932a3521a8004c10c9e3eed8d956835a700cabca21038a9d6dde44f888336c167c04ac26e800a99130a6e1d3b3bd8061dafd2b462102249fd07dc50a2e57a8c6cd52381fd4e1bfdbab18fd602c8890d51e8053c3c2ab5c96bae2847b5539aed3ad83953f47841f8f50fa28446d30c20b2b7dd8abf4e49c0636437c22833ba9",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "first byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "90c3cb3331e8b352c37db46283a1a66b647ecca43e3461ce1afc49d6230457341a52b558496ff83053175a7bfb4755a1bef0e65f470d6139eaaa28cc1c083905859c1475868ceb1e3829437f64a7ad757c9da3b6e8443e8f981f5c0724c5909bd4ebcfa65eea4e4f7af5222dba64a51228759c69e26c44d9a528d75a5b96855253da88f9b54744b1a8b02328394c452e62ef75cd69f7def67b80e4859ba3e73b08a2a3ff931f44d1d524320a33416bf4fc744847d12e3e973cb870fdc3ac1bdbacb677bcc63f927366f4d0d61ee3bc0d1a1b3d149672c6398f3409fe9e7c7c0a150571573b87889b4f23ef49b6f5984412642e5b0abe7f5ec4b4cf12c46a38f4",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "first byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "7a7318799477eb6da55c7b5f6a0338071d981011e1a9bc6fa3a2258ca5caa039fc7f768234cc08e425323f57691cbcf5f83d6a3439a639818c6b2bd3a860c9a6b9a8e0728aa7ddffe18f82c02854ca07b17db0f166d2e521ada5c1f85d0c2f259301d3f4b4f1380f94bb819dcfac9adb764a198091e110f0d3c5fbe20a29366fa52d246cc922bfd2b44a619b59b497a5379282ee30608f4243f7328ca8aec20f61aa8b4083abd1c206fbc9ea598d163e52da1026ae349d26469e2244b86139895f80ec4e8b6f5965a28ac4e9636ec3b1e5d685483a0475fa645421ed6ee9633f276aa4000eefb173b5ffe824d38a4d7e24146e4a6adedc3ffde4521dab879120",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "last byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "331756b92b346379e1c50dea5e05d92912eabc568905d7f290ed353e705671f0f5a43921d71cef11fa2cc23c954ef27eebfbaec77a33147b5c6408b7fb8ba9d8e3ccd5af541942a946bf057d39ac34e954ca3eb308449a9a8fed15f760d9392c32618c289993b38875df412d460500ed0ac7d9b79b0c34e8a64310ad4cb0e7d6dd1dd8ad6aa81683a3420618783a315b2643f7e8c8a95734aa1ea526752bca4d443a18224ced3d2a07bbb734d01629483f5c8b91d94926916e86ee430f4f6f07c40d5808f0f59b9f438723bcfb0a8f595e3da00d5f2c3bc9eba4e64cfc5edd9c244eaa4aa8f7181fc0895c911305fb8dd3d404865f6ee2a4de8f5de7962cfa9e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "last byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "28481a5bc8762ab8cfad8d7888e5db6b678b12554a244aebedbb4d83fe0fb676d77411285484ec8b76843d4ebed1dc9dbc2039c3d0e7e5288de9602f7ee82793e75d2320d8a7c254116ccb086573142cfd33e36cce3f830901dc734ef18364e1c0125cd8fcc3c7f4f333d4b05386c3cbdf616d386a086862b591d80c34832767feb83aebdace7d19269b0b5bf340499a9d530c15b19c68ce227364080b27e6f4e017d6dfdf6ef05f4b73b92602a6249391812a286d8fc87204a477d14307aa2e23f12f7452e15d4bfaa3deee56903ed66031304dac16f6393008a53496845079af72e6c5d4781664ec757c741ea0dc9ba628df2dbfa591f16c352d5171b3a0c5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "all bytes of h replaced by 0",
+          "msg" : "313233343030",
+          "sig" : "267cdb3f7ec390ac0910a3acd42893b3c445226413ce38d7fecd825e29d3a7c8a2c361607b70b88f1ccedee4c9d3c8d109bc3e77ad749236f546352713b71581ef0ed3b9a9d1a11035629c8f6cf912cca10eeb2b02d3bcbcb167f02ce43d00513999e4710cf5d4f4d730dffe9e52ac5a11d6453821298e66dd882fa7eeaa99d06d324a1436e2e2f3a8e78744cdb21d0070987a4895697f26d37f79e93f6702619ddc4b6986450f84630717643224d134a922b5aebaa430444bb587079f925ba93a42bf847579b8bd7e72baa5eef82af83afde809ead8f810bf4441107a3095a4f4f137a3a24bd5f21a18cfec809a164f4471c49091390d2fc1c6578dfbc2060a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "all bits of h replaced by 1s",
+          "msg" : "313233343030",
+          "sig" : "7b9fb586f1455c9fd95db25ec66cc1b8e0237355177cf1c40df59ec1eb84a95149fc4c06117e8301836a32aae7e9ed18b9eae67e5f76ced60e89b8e11d3467afd71194b494f7062c15731a475586fc90ebbd1b382d5c55c0b319869b3d409b82cec0afb19f6352efcd6f1ed949f27a0306a3fd1ec4722cd335c1169871c63796bf3a933dee3f81f01fa8b6e710072fea562cd938fb2bb1053845555b07cda74f144ac84d9557326cca799af501f9474cd8b18a2af4d1a12f93a5b6dfd1880e58ea82e98fabe96fa76981a6243e8e4ca386f5ea4463f615ba1812e38842fd51c71e0b6a9da68a2b1432a7ce2686638e55129d4224c94513207ebf90e8c5f435ab",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "all bits in hash h flipped",
+          "msg" : "313233343030",
+          "sig" : "6bd414e877abc92b608b08a273946f90ba6c6c27de2448175638f67a6b14492fc1415ece540be3e3df8c8ea7154211637d9b5144312e113bda2526b6fb2caf7b07673332dfa605468e37f4026eadb4c0f84b7b482ba6752839fba46b765709c3c6e54de13953245a3364bbf21222374eb63e61e68d73a126f40f115405fe9092b00b60a7f0b995092061427454f6876ae2ab3b2757337349ff3ca3e2332888b9616fcffb3b924977ef856553f55b2f1b115ef0ad7856f666a9863109c6498c52271ea2e6854fe73e9e4d4ec666fe668f0ea1d1af19853e9a07066418697429cc31fff107b6ba212b4a3cc19b59ada459efbc4ccb90da8a0bbb48280456de69d2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "first byte of ps modified",
+          "msg" : "313233343030",
+          "sig" : "487bc9021d8e95d05c1d3237c3e9f10df764e8f70a068fe6d93b865233f6ce8088bfc117c9086a3bea29d86e6d75fd9c8700e871f6027bdd0b37c1b581dda807a1401721f8a582a06309bfdfea5ef177cb7bff47179d9fee32bf545e3e4513212b68fc3eaa43f9bf86ab066fea31018299f4401e3e0985c0d450f102162896e619a2083d5fd2f2a03fac6ad99d38eaade1c56a7996a35e5e657078547c43d13fbf62a64a007c8f03b79b9c59d19697069344b7ab309b532a7449878d3c33472098026917f99d07d4b24c39c67dac099d77c2c0313a557d8a5aeb896214211fdccb531f390d91848be459df01c014454c8c9fb390d6f759713e30128a9184e881",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "last byte of ps modified",
+          "msg" : "313233343030",
+          "sig" : "5bc1e96ad536dee1b3d23e31f053b9b0e1439ce7c48ebb54f01a81de10133612dd0c1b4dc0b60d6afcbd18e40123b40236bcd773b5ff473b5f35c6ed4294541e7f028acbc29f5583e93331d4c03631afaf79bc683c187c7929d2f7db52d1a34d88210ab50231219837e1b60d49ce8048e9ee4ef55c2218674f297158c711e4fba62351879e7d058e0cef25575cb0ab9f6d6961a4cb6d9ab0a68a301fa3bbb8d0899f43bae40ec19758591e5e0cfa84dd08f7859ebf54c76e04e74748833313bf15793b5bbc47494f3bf439d7fb5225640f3f3756d9d4452f7fbdd828fe844f757a0cc585ae0a6a5410065c8ce4e0319c356565ebdb1ba0fefe780c70a5135365",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "all bytes of ps changed to 0xff",
+          "msg" : "313233343030",
+          "sig" : "2b3be6997057ae17c749c435dbc68110204e95b3e127a230121e27c95aace90e9f221e2763833024b3bb873368e3e992897d8767eba2479637ee9383796cbc10455da3b52c7fac1d91131e3f78f5f616b3fd413b310fe8f50ef4f721fc026a6222f0d9113624cf7d481e79e788587ee659e81296eaa438ff13454e36ea50e9f038ed2a7548a8d169635c3e15bc20cd83c8279d16e6b0edcac2e9c72b9048dd7fd1d298e414c3832236d612af3841e426c74f20484ef408b19f22449e701460633fbc5155851e812e886cbfd6218bb27388e20547fb4a48d2e0f9a284f9bc1e9391b28ab7f3f45ff5aeb6af12faae437361877d04e2df1a1057ac3a680e5123ef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "all bytes of ps changed to 0x80",
+          "msg" : "313233343030",
+          "sig" : "4bb8fd79da58fd3217661938c90772eebde7bfe5d49fa597cf448019a56d710ea126e8b94aacb45bed81df07ed4c89a9889bac0ad2abd506374d5ebed14777673fb1c51a3f844e9619bf707c9866b21721a75458c100d57b9ebf6ca58aaff1d47cb2d0f26074dc15d0900a11d681bcd76b111140500a51cf8c1b5ff4771176f1dc0884d42b36a15690b991c77f9605ee9c4329fead40364f2b6372812319c0ed4a6a15c0716da9426ddbbee79938bbf8dc3b459bad11ce79c0bae6080a06b6c8c1c051fc37e0bf0546c7b55b2cb6d90bbf4961ccd1adc623c9b9b51912d6b78843932ce04323f8a9159d10ac94c2d980e9b48fc143299d4c830050ace61f7238",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "ps followed by 0",
+          "msg" : "313233343030",
+          "sig" : "9aca5b5fe1369dc46eff908e690ba88744db0c86f7da7e644eac314493ba6a7d003dc5400e1c521c373ede410afcaae8a4ea8e14d1e6c2ac3f39c0bf8bfeb688962260f91058ef9c1a0ba39689736d039ff86524a97d8eaaf248601793023ce6569c3cf15dff30f41e384690ab40812cb1e4414a0370fc39f526abab87bb9a405fd44869069f343f28bab50a1e582d4bced25d41f9fdd2e958177a3625bb59c4677f7f749321023fc9b9b724e8172a4a512743a1c78c3c8b1f0556fede02e9f6f2f851fd31e21f0886a35d12a0e04f041251524bd7838d91657026540e133a2ac1ade52f03efb509c30578bfde272f0d9fc2e515e541259dfc249bf1762b17b5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "ps followed by 0xff",
+          "msg" : "313233343030",
+          "sig" : "9211ea6374362d77f491d9dca7e8e8d2b672bd565dda1566814670d22e3f211b38246529a5f01333ced70323e6cc4de58e9dee11a90f345fc53c1cb0f0c2287230d1cfc83d33c6158a8730853b5163c825ec05084cf0816325e21ba87f1685197c9891ca3b89d8d8bbad395f7f71b91ef937a1d81bf7497356928b77b10fe270500a731d498beb85490c1d3c4145336d2a8ce8430354b3afcbf0c923b0b0e824adb36d7be69a8e951f64a5b1d648dfd9fea49b59c99efcf015c6b3937d8986100f48022346136eb56f9538b115284ead85196385d91dd414ee22a3c7f40f632cbe565c8d0a325404d0d4905282cf7acc6210a6eaa26f3c3961660a944771b342",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "shifted salt",
+          "msg" : "313233343030",
+          "sig" : "39112e1c8251d5ffe1373e70fac946358b00bae6a461a1af561a82d81ec4acdc63eecb3b98f5f070929dec66a758d4a12cec2600208d7597320ba5db412006ebe76ed593d8b1090e93be21b1c00700e393ddb4b7d7a8bbdaab603087abd2b90a0408a775a4469d4f2f6b34d228da55bb4872ef6dde5282f5bbcdd6a8cefc71c4caf00453e6d6c59321b738d3b21a3d8f0da4afde30c16bc5722ac30ad6bb1f9fe0451ad150fb3d67a805993e506a80b2dea3801bbedb8ff7b676f50ca3fa5b9bd744c00822c975e2ab8cc6a917436279a9e85aea62477ef84270f6efe495ed503623108ca39d5c47bafa3505f04995ec9c2a0e411fed9179c9a9e94fcecda5ad",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "1baab34d753d4c169107ff7dba46ec1a4203cb1654489d6fc20d206bb21fab483872c44ae8017b7c07aadb8e8489a2b41b89f9331fef63317408105eae19900377ce150ec89a37b26bfb169a89aa1c71a83cba6858d5b47353e82017f19a6688927768bfd0e75bfcd71a5e1948543907d65bc8fc813436a15949fbaf0a7f95ddf010f298df9314203838a60b39c5bcbc7a438500649950bf28e78f94155cc664ad5ff996e51789fb13038e1757dc19b6572f028fdd8be318ab933adced2e87b569544503916030b4060e231b0265372805cb53214c6f21e13c632ce08031ee368bcdf3eacb3b87269e8a8684703a348524020e820de93f1f334b59cddff51a12",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "first byte of masked_db changed to 0",
+          "msg" : "313233343030",
+          "sig" : "7f04560acea95c8b3df67a74fb2b32d904e5c59b43b10b11519e796efa77c0c9b14beaf1ba1308a65fee50e7862289d46a3cfe79f423e7d9201dfc7428bec7f304228508b7e8e5af4dbabbb3958d1f48dae4016cf699421b7a9a0b1dc1c806a7b19cf65fb7d4465a031bd8c24071b397dc1f6987cddc8b69f5f3dde25fa36c2ad6e030c64413bf3eb39176bc003c909e37d28d5a040c15bb4a73c74c39c4d132d09fd565abd7b63d81115ecc8a151786f6ea50882e50db362cced39702ae1ecc176cece9509ff071b87f142547ca3aab04bec1a7d0c6ff35060420b99e285515eec016ec419caf75cf11af56a395187fe6575786998b6b4348561a0dd68878cf",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "last byte in em modified",
+          "msg" : "313233343030",
+          "sig" : "1c029185061385643943dca8adefc5666ca039765d29f8baa20dc3cc43981ebe1e6d1f09a617559955437323e50f6464a69950baf23c7463b1b1c6761b50bba89c81299d4543f76e3e4ca4e30ce710a20707b18dee5d2ac9e0d9330148526f193439cb33238ef9d82424fc1287097e7626bae0130b735a22cb6ef08ba4d840b370c9e8658f83267e52b8d56ae0ada9dc5114920f97884d6bf529bbd7c81b2f9a700e4df4c71a8ce3141f9f4be31c9d639619b20f725f55475b38ce36faee929864a5c7793ec26dd6d1c4b75f111feba3765d0d35a272fc52fdb85f2c0bd1bd22cfb47bd0ba58d00af119759e1f4d5763f15cba4e788fc6f8a221dbdeb32c484a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "last byte in em modified",
+          "msg" : "313233343030",
+          "sig" : "0594a2a0f3d10857e8e2a89d72df80c8b37977bf2c390087d1df7672fca50d21b7a3b24453b55afee4c6fb2adf83e6b3e6a63db31b685ca956bda1f3074eb53364d9bbb9ad16883b56ceb66cae51712d592e10f851c4431a4f7b3625c774808bf7c694c582f1f20c2f51ca9f781c6172d05201e1e0ad96f7231c2786e039cdafcc4045bb078c2f432d3409dcaf25d8c0549de03d7964606aa0fbda333a0eac26e5f3ba13b1d6dc710c01a17e1a24241bd741d51db4cafbaca518fe32feb0ed5cb916c8c094c41f092cecb7a9cc0818351b5c8b6563bba32fb8e86b4c81f4f57c24a880e91daf31cd1911aa6690c8e45f00dd62986369bfa5824b785c1c56fdbb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "last byte in em modified",
+          "msg" : "313233343030",
+          "sig" : "10bc1d1d1fdd4a8f74b17f2c8258078ef5c4f5fb973a2505060b126504c9366a4578e2a333b1a9c580239ee959d17017664631982cb8554fae8cedae07eb7e2fb69cb702db93d948d0d0e4654d9eb49192ef87e92f4d229ba56f165a8ad4769d0c707111b9be90c6cc29cb3389a9ae4d5045d8a69234cd5e57fabb76e5d1869d83cd2f3ea8f0419194cc54c398a288aaa35f765ca8e0e264865b709d5a21c9d807c4c0751f9e4e68c9cdc61d93113e5bb811c2e217f31eb14f010aad77abed3e4305e7bdb1066879237849883c3ef099b85c78352b32374dd244e173edc3824924098cfce9d729166ccfccadae8871266927763ae6a5e750f49b837b60682aa9",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "signature is 0",
+          "msg" : "313233343030",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "signature is 1",
+          "msg" : "313233343030",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "signature is n-1",
+          "msg" : "313233343030",
+          "sig" : "a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d4",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "signature is n",
+          "msg" : "313233343030",
+          "sig" : "a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "prepending 0's to signature",
+          "msg" : "313233343030",
+          "sig" : "00005e91b5dcbf02d6f19621d41a83dc8f15ea83c0edb83765ef029b0acac2e1ec8918b1d2afe1fadf11c48d27594cb9c01fed79d90e5d5a8085c438450111aa7d9fa39c2345b14fc3c2cb34128f86db5eb00bdf8dfe38d61f29a41fe31342e7aaefcb4b122eb5d63c2f5c263c8df8450e9428ffef974d535818d51dc03a7d60c8b2d16c999ae46d73ab40515fe601d9b89b1d09c6d60cd51639a97c1d211e097609ba5e8c319c6fbd21b34a634ec8fb8971c5aae21c70b847a4539cc10dc314ddd8a9629e8a0e51c66c0cb61fd1f7228c01c6769190abe9bac9a3897800050014358594e0fb20dbb458b12aa1346826cc9f7e9c5352b073d62853dafe77c848cb1f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "appending 0's to signature",
+          "msg" : "313233343030",
+          "sig" : "5e91b5dcbf02d6f19621d41a83dc8f15ea83c0edb83765ef029b0acac2e1ec8918b1d2afe1fadf11c48d27594cb9c01fed79d90e5d5a8085c438450111aa7d9fa39c2345b14fc3c2cb34128f86db5eb00bdf8dfe38d61f29a41fe31342e7aaefcb4b122eb5d63c2f5c263c8df8450e9428ffef974d535818d51dc03a7d60c8b2d16c999ae46d73ab40515fe601d9b89b1d09c6d60cd51639a97c1d211e097609ba5e8c319c6fbd21b34a634ec8fb8971c5aae21c70b847a4539cc10dc314ddd8a9629e8a0e51c66c0cb61fd1f7228c01c6769190abe9bac9a3897800050014358594e0fb20dbb458b12aa1346826cc9f7e9c5352b073d62853dafe77c848cb1f0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "truncated signature",
+          "msg" : "313233343030",
+          "sig" : "5e91b5dcbf02d6f19621d41a83dc8f15ea83c0edb83765ef029b0acac2e1ec8918b1d2afe1fadf11c48d27594cb9c01fed79d90e5d5a8085c438450111aa7d9fa39c2345b14fc3c2cb34128f86db5eb00bdf8dfe38d61f29a41fe31342e7aaefcb4b122eb5d63c2f5c263c8df8450e9428ffef974d535818d51dc03a7d60c8b2d16c999ae46d73ab40515fe601d9b89b1d09c6d60cd51639a97c1d211e097609ba5e8c319c6fbd21b34a634ec8fb8971c5aae21c70b847a4539cc10dc314ddd8a9629e8a0e51c66c0cb61fd1f7228c01c6769190abe9bac9a3897800050014358594e0fb20dbb458b12aa1346826cc9f7e9c5352b073d62853dafe77c848",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "empty signature",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/rsa_pss_2048_sha256_mgf1_32_test.json b/third_party/wycheproof/testvectors/rsa_pss_2048_sha256_mgf1_32_test.json
new file mode 100644
index 0000000..38892a2
--- /dev/null
+++ b/third_party/wycheproof/testvectors/rsa_pss_2048_sha256_mgf1_32_test.json
@@ -0,0 +1,399 @@
+{
+  "algorithm" : "RSASSA-PSS",
+  "generatorVersion" : "0.4.12",
+  "numberOfTests" : 47,
+  "header" : [],
+  "testGroups" : [
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d50203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d50203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAorRRoH0KpfluRVZxUTVQ\nUUqKW0YuvvcXCU+h/ugiJOY3+XRtP3yv0xh42AMltu9aFwD2WQO0aUKeidbqyIRQ\nl7WrOTGJ25JRLtincRoSU/rNIPecFegkfz0+QuRuSMmOJUov6XZTE6A+/48X4aAp\nOXofomqNzib0kO2BKZYV2YFMItphBCjgnH2WWFlCZvXAIdD87KCNlFoSvoLeTR7O\na0wDFFtdNJXU7VQR64eNrwX9evw+Ca2g8RJkIvWQl1oZaYFvSGmLy7obTZyuedRg\n2Pn4Xnl1AF2bwixOWsD3waRdElaaYoB9O5oC5aUw53MGb0U9H1tMLpz3ggKD90K5\n1QIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d5",
+      "sLen" : 32,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "4f01e0c12b08625ecac89a69231906edf826380f37c959a96690d046316d68ffce9d5c471694fcebfc6b45534864689256e4fc81c78e583f675d0c94b449647451e81beff01a11a516d5e5ce3f1a910437cb8a3a5096b19fb15f4524a35b23d89cdba12cf5b71aac1047b28c562df7c5542c34ce23a182cf7e0e231934b17294799d44877a1d68ef1b8f073619b7618e6b7c22db20030d98cf591ffc3d4da5f58613ecd5ecfc3b40a1d02f40891ca43695cd4c088b05a8054c89c595a47e274816f35384226f74459ee63e25a1bfc03c360490552ec38343f8ace502f065303b00bc0ec320711b211fde92e57feb9013c3609342495ec0d7cabdec21e54acc38",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "0658c68fe0895646056d9bca422a64fe48813b4e14f0c8c4122e56d345b6813dc6286ffde014617e351c7af0a0d2c0f285def79cb734e1e055a25fa6fddc1c07da17b4b235c637413b1849c24311fa72331f4c0458c364a4916de8619b884d7e37288fad12926fc091f4851686a04fd0a504dbce3db370663a6ea6128fea86c2ca94c63e0d34d7f2c845b5d71d9a5e544451f524a451acb85c49bba7864e0a34a48613a819caf3dfd0d510c940f1df21c3373915be1f3509a557fa4d5a4e9f273e85467961133e2482c0907386454228fb0246638616fc31bbb6fa7c2361b8035994eec69a923f4c0bb0ba8696dfe8b1400c2398d7b343fdf498b1116c8de602",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "401eb03cdb47ca88033e3030f6bdecbac8f5c8fc1dd6a13d23d379ed9a2b309891d13d74fea9d21d159b9e6d8f37efa2489962e24555f56dd434ff1d31ce4f9f5abd3f22cbea8b691d6a11e44efb83e2bca155e6a164325e0fde2a8865afd5c9f51161a9d615f62af7ec2e31b3e5ab649c164490d31d88cfae35b84aea7925690f929a144b6d2f48e8fb894a52deecd1b9a6496990c4ecf1588699a42cacd10c53af350514e4291ea9a058e77f101e32c1c0cefa61d945f7bc931f8bd19e7ba3169358a60e5a8b0123bc3199b9fdcafe8e519c41ba675491a27b85e44ef2d77277c10fe107293c8290186913bc9a99b640d8da041b64f31eab1d35920985f4a5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "68caf07e71ee654ffabf07d342fc4059deb4f7e5970746c423b1e8f668d5332275cc35eb61270aebd27855b1e80d59def47fe8882867fd33c2308c91976baa0b1df952caa78db4828ab81e79949bf145cbdfd1c4987ed036f81e8442081016f20fa4b587574884ca6f6045959ce3501ae7c02b1902ec1d241ef28dee356c0d30d28a950f1fbc683ee7d9aad26b048c13426fe3975d5638afeb5b9c1a99d162d3a5810e8b074d7a2eae2be52b577151f76e1f734b0a956ef4f22be64dc20a81ad1316e4f79dff5fc41fc08a20bc612283a88415d41595bfea66d59de7ac12e230f72244ad9905aef0ead3fa41ed70bf4218863d5f041292f2d14ce0a7271c6d36",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "599724adc1bae31e84eb6e1399cd90cd67f48b432c63719b600402384aaea9b21ee864cdcf259029180877c847a223912b0647f066a59a65df6c2d3a6675b1450f0b05185cee486bfac56cfded182babcefe60568a6954f026cb2f59002a2f755e9bce49793f280d89822c9bd3a06a7ad2209c3d6cab7c1f74c8bbf4bf374e7ae8a539fccb83a78cff96a4f538adeba0869659d0e9647d98f96cb55d9cb7e58440c4c9d85b8e9dc602e909e29e45f2b82ded44f40e9ceb1292da20063967e3a116f4aeb202863cea523f215b8ec7fc4f6a22cd8652ed661e33803f3fa1be966fa8754cc7b0fa894cee0f045efba14c4f4a1d7cb837cea69e30522526b8a5878f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "4e68a8375e086990bde05fc4bbde2d368f8d96a5bbcf16d9239fcdd45942d764fc2317d90f4f62ec80059490240be8f32dfc32414a427c7e34be25ed0dcaee6927881e797db97a0341fdde459b9cc915d0a348e15dcbfe1b0780472f52a887faffc988a9ceb677e1cf5638e44a9d6f2532417ed0bde5d67f5dc9229ef1f3cfd9cb46c695738fd006cc62d02f5df76996270223060f72505ccfbdf4e88d961e2e7763705480335148ecdd23d1202c26a963860dc769a43e44c72285092ba7f24d81844e612bf03f9c2ddd4e5960622f71672f4e42b8a8f36c6847a05f70400207471c575d6a960fac1de809118efb52903ca37f12d40f6de74decb9a5b8a415d4",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "8bdd6db90323f3bf26a36a4ab5b92180c96881bd32b66317c4b48c2ba1421f8434000c06adde4264c6ea2d5346468c6d5e97cb13d3cb932e523ac57b59c814fa0397ca6dcc9bec4be1147d77abcd318a6aba1af46ede2f5640da06511a006fd1bd5fb8e04be22789956adc47bbec7988be477150f9b24a07dff51530e8f0c14cfef7d25ca141f512939987b7eb0825633d41a48742bd7f56d4db9733d92ac0f36b4041f51332695f551ec91076da2301120c438eb9ec197cbe318d4571b6b79098d17eded0ca47747a143e34f882ad6e3f490f3a710ff7ec1bffce022027165d96281e593180c67f44aeda9ce6605e6b8e5eac1347695dab211a965bb3d3f928",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "first byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "67d1d1c0a398148625317c3f5e44b738bdf461c27a59594b39ebb2aebef233c7809379e54411411b82d2e7ac88f989b58373d532c758baea121878ce9759441738d121881c1fa2d04421f02dd565b12770d844611ed1873a0b64d822709a6b78d6d3892b294404bce6711001d6c3a54546c76a1d17819674b0be904497a233b466fe4becc832dee740f9ab79e5b9f5db0b0f9aac0084ba05cebf42303b5ca2ad95e3d61b29ed6475545c02e93e7b0e118af92f5cddb1faeb2cbc23c9e69c120e29df7fe31991e887b3b29e77688c60e80be65cccf3d7861a7a14c39e6a6e5645568e2cc5e4a17b75db1dd415aadb45e112a9b582b2ff6e82a43d7a7347b7b56d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "first byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "842348f2b2cdd4c72cda7dbec0fb8b114e419cbfc1ee1b7ce5d70ec56a833c4ebc8c114dc3c92164b13f4692f236d6b88e5618b23af9fa979fe9b5d8eb228b1efd0da8e47b4c4042965c8b9f08eb9f6fdf7e472c88f532d4d851623b4bf99e021e82ef313c7d93179af810b70aaf929a395ece713d5fec3339e394210b56f1edf26dedfb04083bd24eb0d3ca117761f38319c3b97a9453993dafd3d2dd8c01cd63117f8fda46f52565e4d7de9f718f1f23254c4f9ee77ad1414af4d4dcf959a89bef438329516cc9b79149db058d206e6d7c0133e7c870335f0490b8c569d787443c4a84ff665dbc6f4353dec66f9c488a3f91071ce19553a7c156025f1f81b2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "last byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "77c9dd7786f0b5cbe76f20abf24361f8979d3a6c6c122e798eda906b0b9700cd2dd26e5286ddd39d07b7c24379cb40f8350354a36b0759bfade61d3d770702b58218c5dc64ddd0d5fce405a16fbc4de3a5fbe7737032605c06ac82e174619c3004d24bbf22bd1ab3e4d432b4ae36c23573cbad845c16a1842e5de1a3bfa2f12d3496a3114fda830dd6061cf538a4571fe088cc03dd7e8762fb08b84501843f5f0362a4fb097d6fe9b96970c0c505d2f6a59754c42684908627fa8c734ecd587c161de7b7bdd69924c0b4d06cb7db2a70dd9257876d1da1ed8cc00fa68279525c346b7256c916ccf1df9386ff9d1eb27f0a5d83a00a2738fa2dbfaa500baea789",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "last byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "455221c385f769fedd123afa37a42b7477d6c3ed968ce44d4982c41ad29a3f59baeb2b566dbacc91b423fbaec371f3809c20cad6afcc2b8df782e472c954cdeffca49553f6eca58781894c67fed1d9326a53422f9642031b69ff45e6a826d18e4241b5214231f7d252d4c640386a17c2a1839ba9c5a34e94b2b8f30fb259fa752339f134e54375a9a4f3a5dbd5f3fb93c38b59fc33a77dbdea9b8fab7c209e6f403d188958b5fa5481bd225b266bee6761132104890c8c25f04583084eb01c266ccbca401617120c61a388cc683fdd5d195c8dcd48f4d1a9be80c07727f78a10cd26359c8dd1d87614f8acac1506c5bba79b30c0af745c872433f17e8a52a94e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "all bits in m_hash flipped",
+          "msg" : "313233343030",
+          "sig" : "5d1f5b3ada8d4507a7447829f26764b9f794ccb4c287870b5c5aac649f9272fbbe22f064cb75e5b3813bf874c6977dc286ef1deddeee1a84a9302fbbc9c8f86ec45eed5469bb85eed8618efdaf29ea4bc0a9cd0c0be71e82bdab6f15a9f7a637f297e0b5ad4c7885bd27b89f4a52452f0176df3d266f9c13fc44d3fcc3e71e3cc5ede3fe2555ff2bf2b72a2198af709e29c2f6f5ce44997c02ea7aebc9a33d0c609ff0f586e753e585ee5052a0bf2f71247cf43ac244818c84347662338384d6c1a4c9b9ebc14f912db688e658d453bb2082c8def4c440a6b25e03ea4459c1c9bd5495e2ce9343439cbbf03affca63856cc50936d49cf2dcfc73679c9aa32e56",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "s_len changed to 0",
+          "msg" : "313233343030",
+          "sig" : "5e91b5dcbf02d6f19621d41a83dc8f15ea83c0edb83765ef029b0acac2e1ec8918b1d2afe1fadf11c48d27594cb9c01fed79d90e5d5a8085c438450111aa7d9fa39c2345b14fc3c2cb34128f86db5eb00bdf8dfe38d61f29a41fe31342e7aaefcb4b122eb5d63c2f5c263c8df8450e9428ffef974d535818d51dc03a7d60c8b2d16c999ae46d73ab40515fe601d9b89b1d09c6d60cd51639a97c1d211e097609ba5e8c319c6fbd21b34a634ec8fb8971c5aae21c70b847a4539cc10dc314ddd8a9629e8a0e51c66c0cb61fd1f7228c01c6769190abe9bac9a3897800050014358594e0fb20dbb458b12aa1346826cc9f7e9c5352b073d62853dafe77c848cb1f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "s_len changed to 20",
+          "msg" : "313233343030",
+          "sig" : "57e8cc1dc00c07383d89a79b5c8e4f5bde2a2ba55a3c7201b3291c4d805b1b2eb36f8f326b542342da180abe508669bb6cc2dd54e327bc70c1e317ba93a0fd21e7fce22a0c597c7420d1d5602ac43d9348ba3eba561f250e301ab955b0dc33e4abde32946b9b3e86c8bf07a44646ca595960bb988fef04b2824967e9da8b0264f1da0659373935313a574b5380f0b54ce1bc0dde423bd3a54f6ae5fafa772a55c1c44eb6edffecf13e6e5e1edaf87a79e338577304141fbc44f0e9eeb286f553f879addd6e12e436fa3af51ad53a72f2679f0ed102d504ee08706fe111eaee49d880d1a0b91924b3b79968ed0f9bff446dac199ee89b158c074927d27b864498",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "salt is all 0",
+          "msg" : "313233343030",
+          "sig" : "1591ae743c58ceb723a76f502e21ff6a65c24cabf5f527bab5a6f2a69f20c776fd2251e43ad22e09b1486ceb1935b2dc2ade95e233f296cc0e5a8af8109659be76b6bfdf37e14837fd6c34bfed1f19ec9d21f974b984fe4d4773896ebcc7fb862fd641cd0d77178485c70c2d68b4d9be1d863f6f254b77991fc9053f5d5415d1aa74ba9067e2e6607fb651638c9cc0430a40c9b691977b557a31d95a290a95b56ef2ec8e4313686a9c5ef48235912b210fdd2c50aafac28131104c795c42ae75810b0284b2d257e81ecac4240622ebc261ab8bceeeebe80f1cfa70f18d782aebb97d803ea3a895be541be6941df103eaaabd870848bfaf58cdaf6cecdd5a10bf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "salt is all 1",
+          "msg" : "313233343030",
+          "sig" : "6f2f650ac10d5aa2c16703f657233da8c035da67a6e9e950dfd0391399da3a86ca7837dd7cf23e864d9cfca1fe77dae45a01ba21d23dd918ca7bba094aae376100198f59834396ec942fcffdd7d6a44953f69bc60291b1eed5921a0434d8b8953beb9d1e1b15fdca7090fa5c646847c0b759e94f056911ad188d4b0cc399c8c345757d5022f1a38926de0cbda8648a7affd9f031262b1079a3681d58249186fec4f6e98bf151c9b680a46b88dada9b42cca365cf908ed0501cd21e02a5bc4c0675f23ece50987b703499eeb94b6c40b5cdf22299776fe30800f887a1dfff18cd8a7da8c2388060dcb78c925c54b4e620cd3fe7546accfb3bbae9de08ba886009",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "byte 0 in zero padding modified",
+          "msg" : "313233343030",
+          "sig" : "37487b948dac95a1e57bf1ac40888b8e074cf9db9c9825e7b7267d3b105a8c67cb9b33c0e5fd641836798f41b8b1f024b13243da4fa5e527098337e5cac41e0523a28fb135ae060e7c1e4eb9556222bc43bf1659f65a2a2db108ac9b7c9942a5658fcbca5622c115e34ead883ea4ef03f7f62990f282fa791b04489053771329a482467cba8a13ad98f27ff7b61c24a452e085d432130b7259e59b2866e55320119b21e3c706f3596ec174517c43cdbe957e012b573961b1fa925373945ab3209a1007d197e1e9301dd0afa485acf6643ba0587a69f7c44bdf1e53c32f05a3b96db0c462509c292d7de09a6c78ebf1131453d37ab037176011296730f57cda97",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "byte 7 in zero padding modified",
+          "msg" : "313233343030",
+          "sig" : "241a3a7569210a47b83125fb67039a68d9859b971a49af62bfd4bde01e3b955ab166bba5165657fbfa519573027ef1a0f40cf7533f941d64e09fcfcc35cdd564c1ee0823166dfc054ed93e01c5831c036920335d8b8daa32220dd5c0b6a071f08d19411c6418aaa9883375587b19f0720e79f184535d7ed8c5360e667ade541c1ddbf9c0629255d8d286eae8defd34f000a3be1fa7fea65a4cd4f64b11c641806fa57d67b4c6b7b49892f38dc5d13abdabfaa6cb91ed6022d4fb467cdb6046b13fcc8142a97bc34eddd045796f4e19b1885d04c51f53e5bc0c272678990aea50a124274cdf048ecdb7074ca86f36841a7ade80a8aec6a653a0292c82a1b5c678",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "all bytes in zero padding modified",
+          "msg" : "313233343030",
+          "sig" : "484d71be451d1f3667e01f3e7f1a80db9764f751ca87ffc6352953a773f6519e8a0f210d6d43b417670d9c0ce3c11a668cc83394a5e2d7bcd4ae98e50ed26c0ab66b41ad2e28fa703f2da04db0963875842d90a77899642dc297cf37a76fdb007a990c5b7af83e264be9323149fb680acb69a19e0c5aa949c2094e0a18abfa1b199b73363654638d86f9abe73a678ff0a41f6b702b70ea1aedb287add79b9a7f4a97535d0db46c05983072481dbe43fe6dfe33229ca1aec42e19afeb5bd35f1e44264c1fc6c18fddc95fadf1b1676f185e5b55f9a2bfe6b6d40289f240633513828a7b967748bbf0ccd1d3fb9f6240f31790a789d8c709c278ddbb0f706778b5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "first byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "3f27e0fafc57629ccc0432827187766a30537e821a2fcd5f1088100d4d8b6a6a9ce950f51102e3b55167d4b49e0b6a306e0fdf90837d0630859093e90a94fa564b7a4a82f4ccb772377e07a2b5a6873d98bf665c92df1ce7cbdb583cda83947b3c9c3df5b3807b470f23f8d08df9fba78e13d6b635f9f59d2d4baa34831dc6c3e5a29695645b1ed50f3a3389e9e119de765e6d7daaff0b454eadd10f445e402bf3cf4d14f4d16c2d9e4fb5571cea7929d53019d414d118e82d491bf3fb3bd7427abd6eb48a0ed277221c42840eaa1fd5e7ce658f7763099c1d59431e498cb58357a659aea8e181ec0fb5ad8a55d1c0f129500a25b85cbcc8733fa3dfa9ea30a4",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "first byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "006e3f343b22fbf5cce816efbfe06636c1619632665591f9b1fd2bd0aaac9a0f776c501d7a232fd2edcc12ac63b3b56aa12ae87982c1997e5ac5fd50f6a5c350e6e84fc17d2149547babc4830f8c2eef1885e4bfb15c9b73322b693ea74eabf43e5050c477c0e75ecf75cfe487f41f4a2df4972a16e0580d57946d504fb073f23ea691086e5bc40e2b2e1dd653f2ab201ad609fd06983a5cebb98678c039150563f6c944bd6558b422de25b9720887d97ef63b34cdee0139391c48558941ba94bdc0c22e605dd9cae669406c3ddb361787ec6437c87a688b0c64f0290b1bc0ce17466592a48b83b27f0442bdb15ef753ad56eaabeb08bb3b7ace7f9620fea113",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "last byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "838d0ad34f2393aec53682ed48f937a458a32216a74dcc4a1e591a538119c3b56cad78b1c4b722948373c51c04a50e46fb5f3034f43c5d260364617e6f03af7d75d66baf3dfa1ca94e75e77d304c63ea5015cdd7fb1e1cdfbd6b5ebef2b2addf697f14c97cf9b5cbb1bab7f612b3a428d32cefbb788bdb70729e53d5b8cd14f586aa2b9410bbae2d093bd11f491469479eb640847514d72269cddab484d882aaa9761839aca9851b3d409211de83df742674d6305cc3a71143fa5077bce9d3c8da1f6da0df5c271f048ba589e5c34a23ef12747299d9dc4299589364f2137ace59781e3f01011ae145a5e1af20c74516e0b56d729e49b3de310c197e7a760efa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "last byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "6b19a03c774e1c3c24ea889b552e99fe0068a6cda022d5ccb6d75a447cfa0b16b5b144208dd407e440230ffaad4f12a0746da108dab5d4f162bdc9b24dc68a2e9e077ef5702472c4ceaa89c29cac41b4782b92f6c87e014df2483580cadf2b455f823fe12c9c79a155ea32a9f1ed120fe0f13b10ab4792fd94b99e0aa6ffd27c04ef7088e3cb935436529650894fee6b5b78e0bb5aa59ee7bbb2fb46af784e2c33eb76a12cdd7d0087a081d82d3e466a381dd37d25d3b4a92756723cb1f1f49d0481d12baa21ff77c0291f902682226d99d77d36bfe58d1825988c97d9d00e15ab48c9919583fd60593fa93ab1ca8e7dabaa912f6535bbb05e82bbfaa8537b0e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "all bytes of h replaced by 0",
+          "msg" : "313233343030",
+          "sig" : "682673d7c98ae70039e9f259275c884da7c77136e06d47e8af72f82a09614a08ed125c6d3a80f701a61dc2ad967e9637662bf40b48543e5b620daf37e3088d2a54a8c5147ef99227cd5cfd0a478d1fd1ec62c495cb89046df756908621099913aa4142c3dba2a62de6a8899f0acc7932e33581d4102020423a99876777c59292d597428f50b846a39d709d38c3a842f9a9531f26dc2a11f518950eee92560fb6b6667a113237a3e6d7bdae48bafc90a76a6839b97e6301e546f5b136ff23d662593f74920dccb56d47fea557adca4b36820469425cdd4071ade7c5c14f365ba4e0da97cdd62cec66fdc724d3f309b6297c1c84091a74d656b4b030787df593b0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "all bits of h replaced by 1s",
+          "msg" : "313233343030",
+          "sig" : "1452cef4f4e0d46ca8caf3a628074f7ed0acafd0a16c4c4c423cd361cd61319d5e912b162bb2b7326e56e20d5f9814d6339e0cc44da9ba1be28e473880b6276a86b8cdfd91d2f5fa830024b842834bcf2d425c48b5a58464b7a3111f55ade2d3b9cdb958392efd559f6b6136cd158e157faa4b7ee86a3457dcdbd877b82d53c23d6e71488e554574b78f0be72da8d4160aee680ce485f9fa544562a12a89328560a773ff25138decf4200e2558e3b5a364a4372cd1f64fb25887b8c2b3938aca10d8727535d0eb0b73af2b7ad70656f97c5c1a97d3e2c2d1cd2732c5fe8fdc5ba6f554bd5190a54742313a6175db2a77d36d24934dc056d66cc6bd83abac61e0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "all bits in hash h flipped",
+          "msg" : "313233343030",
+          "sig" : "2f5ab041e87b74c0ffa6f5b0a4c5ec8d0ee3d2357a0fd2face275dbc6b50a230f2108b4b37fa45d5bb1211fb26b96d315cec9391d198ad7713faf3c4fb60806cbe6378c7a08c2e75a67848ca98c80a02680650eda98ff0c818f1e7af9ff3a3236150699a4c900c394c2a00ea65b39fea873504898c6fced5e4520bf3d69a11debd3e66ad681b7d03bbca940fbc809f03f99079d0f24f31cdc76afab73ec0b4f5baff4437b0a304a8893cf593bcf47b2f63a401f1b456f1741b3b3641e3154e6f4bc035723fc3532ee22d4f65a3963c1b278c1a9a8ce7e04876e8c327a70463e3785b9a5aa5b4a50cb4e35d92085172a61cc5407af2752a59d06b58a242926328",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "first byte of ps modified",
+          "msg" : "313233343030",
+          "sig" : "31ce7ca597f76ab95d47563f728ff93bf43d9864e5bd1229b824ae26b5a13c79f6f7957217b37e1af0537fea81616187ff08a0d5c98a92da8dba61bc5c14da3321fd1146d83c2cbd0ec0687d81f6d7349f5a0cab0840e22cbfa83f02a79d321ff88830d47d4842c0b032c27a181ac06a42cd0bfedaf75f2daa53f64eacb5986545bcf150b8d433e66b698f2553f9da259bec319d8c0cec05d9c320e7300463d41eb077028c1e0a7d6d87d4dddf54c5b78d6a15e4527e37110b9b9ad2f3b2dd0db591227d41cc9f26f2349581dd89e0ba639d0cf9f8c86fe819dbadc688522b58d7284caabf843e7143395255e9a0d710ffbef6ad13f6a9361e20d2f6f5a414f5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "last byte of ps modified",
+          "msg" : "313233343030",
+          "sig" : "5798785187910703680cb2109f492c3f0a91b4a8f11d3da775aba891eedec3d76fd30a939f5d7a2baf7290c573e886cec8ecec0b1598f2cd169d53b4abf8accc09709187f32a12c80fdb42ed98d9e98b0923828f0e38acc338234f7b7a0ee377644a655f48816ea4a5bff0f6d63c3945dc3aaf921e9404864594bc323c1f3ef42f9361ed6cb8fcff2994293e17865e2fad2d885277251fa24d7e7aacebc48d61c3b48047dd7c99826b3105d2f820cd62404cad5d758da461af67677e39e55086d8fa52ea0334bc3b77f95191ffacd28ead07a34e4672577c4c65b5bb9d5f9cab6e1f1242216291b69a0c98714452f01f37722ff26589734cf6020c5ac9196374",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "all bytes of ps changed to 0xff",
+          "msg" : "313233343030",
+          "sig" : "3747c7c116cf30567e24fd4213c126ec84366a26eb304a65d144dd9b453054df4e5036c861b5807137934b1cef351411e40654bae5df6fbe3c42d763407f273d3dbe059fc6412a366775603e064b1561a58e70860edf954dbe666f8fe44f44f87df3b0e3f3e19c904966ada52f00806f975f256d4a855cee973e20f33c31f9f2b3792fcf326f075f86f275d8ef8df2dd0abac83d491d485fc167cd40f3802f66036df4fd64fc441ac8a25b405d5ef960127623c269ca836671a66a6bf2f39c0792dade17564d31863c7e0161ee0bb88522ac0c9054bebcedb603a2d18ddb0f64a91ca5a2f0086afd0d8c07cb0c1e7f24d12f866cdcde46d663c1d4dc7f7c6f62",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "all bytes of ps changed to 0x80",
+          "msg" : "313233343030",
+          "sig" : "1377d4997c03d885e4b95f0350b1c8091a4d9beef9533dc6abd194a1439c383622b9dca5a49da247cd55c02186829f695ebb007ef0535c4757baad057d7bf76dcfe37cb9181b0c290db16d0abc51ff32d03b6a8e56ecd270dac231c81e50c7e0203d22b991291fec650b9904b2539a8a330172843bcff0cf46f06e32f55bec1f5a734e70ec8e4e8883e3c22eab7561d9c76737025352b5c9fa9c76eaacb909d23d0d7d7b6f1094ccec8ba94f149f81946faedb39ac557cc28817c9114a89a6f720d849f90cb23ad202ed4682036b3cb70b6fd5df0225900eaec7a21e39fd433d3200aed4bb4abc3b531393fa462fbc920c918f1938d33ca86e7ca3bbf1d34d74",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "ps followed by 0",
+          "msg" : "313233343030",
+          "sig" : "7d0f3cebb4372569e8f02df9f42222151cc31659df8d5078e9ee8e91030735d27e66da8c87039a27ac28588e8431d7ad1583534e8570318cbb2554c07016bfb02fe59af00576b7908286f4b27e36f768a118c3f3a1ceaeffee03a1b67270c3e489cce5c5f1171e0a8734553403047faff680dbcd70bf0fc1f0f4461bd4e68c6c0978da3490a137ddd8f62bd79c6a1daf70f7a9a3e90056ccd41c62f04915bf128f74dabcc47cba85b0fae47a04da32e17799ca150814d27793816e6a198390c35d1f35abf6816761a5ff0c28b1e60eeed244b1f24934174a1d2c469475f3eb8842eb9f5c6224386994aff9579f26ea7d73c668a113ef7dee8b2bda576135d452",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "ps followed by 0xff",
+          "msg" : "313233343030",
+          "sig" : "53f2db262358c21792eca635806ea1c1ad041d9334e977a25c1de0fc8233ec6f01737adcf1fb4dbedbd0078406ecad921e37c77d4585b5eb5ecc74c07ada1864a3c13acaba9372f852aef55ff2dc42c0aaef74bb656b8e0beccb7b9eae587fdf3b52eb678af1032e60ad12321c9c10c445448df523856ad262208a06b8817ee229df825f080a72d5e1a43f222215824a8ea6d455c80b2563c65be1eaa0455714ae576ae67e46d006934cf0c137b8c9900af9ed716391ce96ec43296e83a5a10390ed91f2e6753ed0254f0290ad899462b3b7af42c3c5f0893863a3b5e6052d3a6dee554746960a07fb6ecdf781e47b96023ba01cfde4c7214611a1be5735e2fd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "shifted salt",
+          "msg" : "313233343030",
+          "sig" : "11e8938238a20f0e6947015987380dfd88a1661606bd05bbe4298f4746e81e3bbf34aeceba5360f1839ee0d7d7fe3e578cacc2d24b15eefe2064edb1fd04ff9a44c0a600ebf00f64fbb1ead4246e5ffbad0c22441ed073462f26e30b61a0a9142b4f993d1b26fa32e11382da33b9eb5855cef6736bec2f4f5bc6bf82fdf7da62346a4d9696c53e1cfa789667b721f32f7779daf7df85474096a9e9a7291afc76df3a66c7a0b997b41bfb71fedbdb4e65095efe1a81d35b66be55432e0a6e33905475b46a94e05bce7fee84645f500d8ebd7c0282c35f22774e7089262210f83ed485cd2b045acd5d62b4bb53dcbeb2588dc6535518189cb0220a7c9406e454d6",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "39a8e947c919ecfad7ee28bb708c1f9e825036374ea0f610bf5531d89b813d506fd00bdc15850b250ac50fc556a676c894fb641dc650999eb6239b91e2c755126bbb9fef5783a5ab834e0ad91c60e720e80e096c091167a2a1dae838a16fe0ebaa8efb3573c89ac5d8e0584b5ec4e2168ef097f937ef0f0d2a2f964a8e6a810dd15b9c27b234d788af3c4f54dc97035657ff19f2835555dbafd02c4ed3c76654fa868babb71534bfe84674eeddbfc2b27a517f666bd03a27d8173bb92826a231cd9a241c171445b416934ebec5f7eea4fb41a61937d9a98f61b2fd1ca8e2be125e85cc8d16d553b114ab72395e86fea52f54edd853e9c5156557e38f621b975a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "leading bits of masked_bd not cleared",
+          "msg" : "313233343030",
+          "sig" : "9c13d877ac2bd8c02c11e29ffcc0c1046dbc9870177e843c30b499c2bf7fd09daa43469caf2b8c3e955ded95e4d62209f7571bb45593f4cd8b0c7bc9470a8a693837248b5a7854dc8e37e752d949479272642994182061d7af80b0ac6f6e984874c8cdc6a5d7d17dc9e9de5ad12120cdb9f6c0d09c0e11b87b3423e37ba9437a4f76cc1e6124579e5f79832b89710de1968ce46e3e69fa185c0a924e8cb5f996ee5963f6826dd37714de264d75545e8509caf8735330cde7ed4228e5779471827b83757c466022117c45d598f5a4a7fed7be4e1b4d320f894879061a75d1a41efd8dcaf3c61733ed8ca2cc2f83714f8fdbc7a97cd6d6b97ea3d36ebd69890633",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "first byte of masked_db changed to 0",
+          "msg" : "313233343030",
+          "sig" : "00566c95524ad0995eda7d668fa08e8f75bea868b60972d6488cbe8939bbde68fa5206e671f35555f628fa707ce7ba0f468cfa8b9737e0ef64e0e23c901e4965ccaaeefa9b84363a3037cf5f9e044e295fe57f32c1125ca70c639b22732aa4c4b3e5562690bc1d7e7e74dd01c674212dcb63c58fa23333d45e1e4ccffa5d186443cc785c5ece3f2d7a8995e25de6a171cbc960c272c2899f6f87ceadb72eea1be085245669ac08993591e72bb9aff8bc29388b35c99f1ba7477af9d16754894a50d4caea4bc80e2aef2ced27f4a1c88be284bbb40cb8ae279b4e38a4cd8a51a92a279a799b3316c2938e1386043ae7ab1d8605cd310d7239c805a07a19c7b17d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "last byte in em modified",
+          "msg" : "313233343030",
+          "sig" : "2b46a0aab5f573e32ffbcb411cd99d2f90aa9b1abbc600b0cda0d824f79020aab47a2494caea20fc93017e77b99eb73a1f8a550b611e2747ad29207772629c2ec40918c07adef1c90c99a15cddb9eac88955b4093a9e743d2420b4647e167bff8ddb07ce197db89d8a7d3f327058a41cc459ed4f6d5d23dfc015479d95e195da37f5b1fc318a3f74a0ac5fe2b9569c7fd99b8eb3ed3967a5eda1d246a3b225548f67ff860202033e7164d4b99dcf95f4232d18a7913f7258a33179133a6fb4ab5a4937b642eacb92908cf79495745abc583524cb0236fbfadd2c7e8b0a6597017912b4737fc01432625a508355869670bef25d32afe6753c38cfd96ec38953fb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "last byte in em modified",
+          "msg" : "313233343030",
+          "sig" : "3b65975357ab2a410c2fae7f2f0381e6c40951260451f2eff05f0dc707abd013a996fc10658a6963f462877a808f61ad0362b9f640750b19debf3d59692134e357a49ed3693f50924b7c8a1824ccafcb4b93f7679dd892823cd479895d41fd1c40fb89fb1da19bc1fdc72eb038782f24ba3326428cfb166a475a9fd27f94d1a0ca6fa0e6a0d2c2883db3eeb2c0a59474da36211695fb811b9e8bc7f05ccb1f50d26d71a2dd209b0d269a736610c7dc1f7343a4736fa2b8c27827dfcad49bc4a86822cde1579dfbd646474f11e1a60f5e4ac2f2a3a5421a7baa9dea5d24be03cb6fee771dd808b67f886b37be5a300f6551d7e7636e9997b3255ceed5187ebcc0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "last byte in em modified",
+          "msg" : "313233343030",
+          "sig" : "4516c8a39b8544d1c65d96472fea0b2753060330e76e6f90f41ab349953d26ab1b95fd87484535b68c0afcf1542a9b966a9bf98b89a53bb28877b34d168a4ba8201215c55f9e86d30b7159093517682e6e956078947e54e3f3a779da032af7dc6bcab1c0b2a6693fe0eeb9de0d158bcc125293a6f10ccaf1499b6ad912ed5912537e3c3c5f18eb0ab8e701056d7b973b8b61af918858b87152b6c40671bf96735ab1a112972346e771e7cd9482f6f59d320b8798a271cf21779747f964281afa1303142eb3e1841772de825b4b5e68024dea014193c4e1c206bdc6121a8f2d41837be3d13833ed615d5b9df4ac4c86cd25344fe1022df0adabfe2d46f7d9f0d0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "signature is 0",
+          "msg" : "313233343030",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "signature is 1",
+          "msg" : "313233343030",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "signature is n-1",
+          "msg" : "313233343030",
+          "sig" : "a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d4",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "signature is n",
+          "msg" : "313233343030",
+          "sig" : "a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "prepending 0's to signature",
+          "msg" : "313233343030",
+          "sig" : "000068caf07e71ee654ffabf07d342fc4059deb4f7e5970746c423b1e8f668d5332275cc35eb61270aebd27855b1e80d59def47fe8882867fd33c2308c91976baa0b1df952caa78db4828ab81e79949bf145cbdfd1c4987ed036f81e8442081016f20fa4b587574884ca6f6045959ce3501ae7c02b1902ec1d241ef28dee356c0d30d28a950f1fbc683ee7d9aad26b048c13426fe3975d5638afeb5b9c1a99d162d3a5810e8b074d7a2eae2be52b577151f76e1f734b0a956ef4f22be64dc20a81ad1316e4f79dff5fc41fc08a20bc612283a88415d41595bfea66d59de7ac12e230f72244ad9905aef0ead3fa41ed70bf4218863d5f041292f2d14ce0a7271c6d36",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "appending 0's to signature",
+          "msg" : "313233343030",
+          "sig" : "68caf07e71ee654ffabf07d342fc4059deb4f7e5970746c423b1e8f668d5332275cc35eb61270aebd27855b1e80d59def47fe8882867fd33c2308c91976baa0b1df952caa78db4828ab81e79949bf145cbdfd1c4987ed036f81e8442081016f20fa4b587574884ca6f6045959ce3501ae7c02b1902ec1d241ef28dee356c0d30d28a950f1fbc683ee7d9aad26b048c13426fe3975d5638afeb5b9c1a99d162d3a5810e8b074d7a2eae2be52b577151f76e1f734b0a956ef4f22be64dc20a81ad1316e4f79dff5fc41fc08a20bc612283a88415d41595bfea66d59de7ac12e230f72244ad9905aef0ead3fa41ed70bf4218863d5f041292f2d14ce0a7271c6d360000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "truncated signature",
+          "msg" : "313233343030",
+          "sig" : "68caf07e71ee654ffabf07d342fc4059deb4f7e5970746c423b1e8f668d5332275cc35eb61270aebd27855b1e80d59def47fe8882867fd33c2308c91976baa0b1df952caa78db4828ab81e79949bf145cbdfd1c4987ed036f81e8442081016f20fa4b587574884ca6f6045959ce3501ae7c02b1902ec1d241ef28dee356c0d30d28a950f1fbc683ee7d9aad26b048c13426fe3975d5638afeb5b9c1a99d162d3a5810e8b074d7a2eae2be52b577151f76e1f734b0a956ef4f22be64dc20a81ad1316e4f79dff5fc41fc08a20bc612283a88415d41595bfea66d59de7ac12e230f72244ad9905aef0ead3fa41ed70bf4218863d5f041292f2d14ce0a7271c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "empty signature",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/rsa_pss_3072_sha256_mgf1_32_test.json b/third_party/wycheproof/testvectors/rsa_pss_3072_sha256_mgf1_32_test.json
new file mode 100644
index 0000000..fee3803
--- /dev/null
+++ b/third_party/wycheproof/testvectors/rsa_pss_3072_sha256_mgf1_32_test.json
@@ -0,0 +1,399 @@
+{
+  "algorithm" : "RSASSA-PSS",
+  "generatorVersion" : "0.4.12",
+  "numberOfTests" : 47,
+  "header" : [],
+  "testGroups" : [
+    {
+      "e" : "10001",
+      "keyAsn" : "3082018a0282018100c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b12030203010001",
+      "keyDer" : "308201a2300d06092a864886f70d01010105000382018f003082018a0282018100c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b12030203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAxv4jeSVmAjwmUofFrG9x\nVBwJlNEdBZ7mQDmG76IcJLUb2R2IYvnfeaTjKOPifIPfJgslqbQ0IK/8RLUejXUl\ntvKcNypAUQRzIAdSemLtgvrHP0iSqA4JaCpBpYzTRwF/O+fYATNPktkyGq/VO1G/\n+r/HUs/Mrgse4Dva/55CjMHBF/GslrT+I/jCPmOBGGpm/VkokzmuVcS82tv/hKva\npTIkDU4dKLLQSB2t07JGVXyo/hgJKBdzCznm7jeP/MhbGf/ckWqbmRprZtSpx7q1\n9eejciEBFC56QQjBXVc7FSieB+RurqB7QsKry6Mw6ZVUtGVhZbtMDbK2OToH7KV1\nxRqTxOFb2w90eQlEfj7+NMZ8qJVLUw5WogobbYTUXtG806pY7AbxhO5YV6qoGeHM\nqaJvTijWuXfTORbbmJbSUtGvp2Lih8sNOEzHW/5T9Oki0C3QpIHAQuLTBrSzwYk3\nHldbJeAAWhZM9p3Ql25NW+R2gG6mvmCE5xq09axcGxIDAgMBAAE=\n-----END PUBLIC KEY-----",
+      "keysize" : 3072,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b1203",
+      "sLen" : 32,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "b520065682633ba54c9b713b2ef19cdc1fcf275ba1744c2350da7307a20971cc30eefa37d1667d23d20001a674f0e00df4f9b9e1d5fe7eb85cc45cab5dd625759de83017995c93d48b126df03aa74ef87daea0c1652dd370ad5d663598a383cac217a208b22c7cf0e448cc7ae0555f892ccb8ded6894cfb0c328cb542be0485d860ca77203081f3b04c6f55c5689b1a66b1c24819a4a7ea55f32e00f61accf4b411bb320a96c990173b63ccd74e7da7df5ceaf33a39a8acb89a845a594b164ec6e22cce940eb06f2d487a8bc4574451878c2bbf57d241f76586e0703bf5f86bee832d05b75fabaed6accadfc1ec2cd6e619dbb29b65d6e6f5e118ad52d82a955d21005ecd63fb382f32bb8e2e1e57220b345cd6422bdd84a91495d0ab5775b08139edee960dab1b4ffd9ea5b27398b58e6e35211c3581501e99bf5e3f17fd79381528d28a4927e28082f45bfa9519f98ea663dc84c50317adf0bd5da98b01459011cec61800534dd5afc5a567c19e4a400f06dee74112083b5322615c144ce3b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "8e10f23f49011d761946b283d7152e851ee76e5caa1741b0901eea317d8945f2a0368551b3f2b3a6a0d6a939aebded8fea0a96dd1d037be33b1c35ce78dc89693918a99d547a1d892f4047c09fff7a6523acb0cb0cddebcd4a6fdcc309a466ca9580fedf032bf56154f8d79d5c4686abfd2c7abd342b37e5373b59a07fa865b118c44f2c44b851306dc97eaeeb638f14bafbb09c81996beabaaec28c19f06ffd59dbe3080e0124e2386418052735f541d496322c03ebee6e4dcaba24dde9772a9f079973df26e854c255eb48df50c01d49831e54b64d0ff862d03fb4d82ff204d303b537176c50ea56761a83d0aed8ed2deecbbba981c8aacd1300051a864d1efdc897f31383ccd6f181bf976a75e7a7613b60b3cb2a6f7ab8636f672990c13017f2981c11ba36096cbea898f016c581ee859e950bec195cc4e376e134341b2fd3e3d6181ba4d377b2aab6a148c6ea8cca9ee3478297e901856ab18f61c0233c899841e5da125516cf5274dc1b22e2a51c922daeeccfad0f2a8bf84e531bc4f8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "22915cfa1d7dd30f50b4c0e4cee42c5f0aa1b7a6644f8a11e611b2db042b122af8211ffc1dc220b435d8919cf64d715b54ff8a762f702b365cbdab455509b97d9b310011467d4186647b957e2efa404aed3b84840529bdef7746348385a1c6a2ecdb88d1cc2b40b36c346386739c39d2815938e463a35348426f17d32d633b873d6124d8b49a726743af7c0e56d63394155b63089c63ed8897f8af2a2260d33499afab11c911faa754ced5acdac2de571f39c2768716e4308244a99d1e65da7061d2feb8ec8b4e517bd5e19cac626698479ab2019257cf83ad7b641db2345b38006d63f84b41772b90037778389cc30ed6aba6af212d9326792af746d7bca9211fa344fdc2798a490aed3a2840620c2a85e3d9b9c38f2330072663e16dd26bc414c7d68f6b11d2cd3e0387c1834c5e2262a9e2dc1bf7c0108b4e2052566c7a941ef6b38c8687fd7abe6add2b745c2c2d680ae3e5646ce2e717ef9899c7f3fb1e3088e8c0587d86546f752771819595a7a3d422820ceaa12e3ee671a456dac673",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "8f9ac1354af4161d0e55b5674821d02823b3a6b3f79cefb98cbc77f9ac2d91cc6345f989a7828132f73f3630a247a936b6a057b3e5a2fda0c5999ea7721ee8880960c24cd2377e869cca1799747142d57ad6a8d83ec9254d89f591add11a758e1ea1e29bd08f624d0e28cea52ed5eed7c0f5f49d3533eb1cdbb2af837dc42942f9a86b5f4e2d5ce506697ef067a344949bdd89afcc25978af4d50c300bcd0ffc9d93cc559e3ae1a13215a1d3f6030827340c6591061a5ab7e65153b1df8b25e1421f924d39c7e6f76243c1bb9ae4063d9a475cd2ece45f4e288fe0720074e87868d70a5584a9ac2b47a56417cc76f15154315545a3ed6704b365f15d34320804469c3b09ed211cbc9e9e767b6f21fa16f8641d8b78b8dff8062a25b5bd3b6a38cb4706c42c1fbbe66db1c05cb57531132eb94fe1569735c33ec491c318a686c837ac810be4afff605f92bb390e7ab3cd24c0cd997cf13f112e5aa01746f43902432639e1eefcbd37b413c586f057bcba40a8f1251251e84cb7c87c53c1d1d558",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "6e471c9342aaa27bddf64b02e8805611a13770b22cc3d24cdfa9a2fc14865f59344c288cf15d4c8785089968a12e9d3e63b8179489568743448f698f316640146322ef3b611fc98396cf4a4757e48ce6701f123fc0bb8df80b63cd2371522f8ed929f7bdb709d424af6eab2eab212b43afe537fec7bbb9dd02e64f116e02ad1214ae931a6fe28a5982029088a27bb95ef2ee46ad212083719327acab5ee51c82d94d5b14f6dffd2242ddf9fbbb2d03f945796a3e35346f2334ca6b4ec5d9ed6f1584688e661951e948cb95fc5cc04e90cad98c861ddff514c60275650ae3003185efe0c04356b07f361f7dc7e17c5de479cbf119c2910aaffa032aaa81ec9eb9f7e1ad21a410ffce2502e4829404d01ae090ef289bc28c9c3f37d3fcae33e1523b3c9b81e301f51d046196fc15c90d58bd35a1fb11fa04621b32cb61e718a434a0aaefcb676cbca888554d1e84d43b108fc1cb123cd2d300da630fb77a3ce29a0f53af32a5ce81c5ad772a199d1180a9e2f090847cd87ddf7b39aeec89a6b492",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "39f7dc9010bf3c200df551499404ca40346e58ce0c56271e2eb7835187ae57a7b9a0688c9b088ad85e128f56c0299c437a1a9a9104f3f51aab7043d5714963e46ace5d8e435fd3e416dd61474e9dcac3ffa6c3f0ebc4ada987c4313ec36f2c43d2dc749e496fbfad639dc811304388990b98cf10ff616a866bf5d98cd5199bb74704ae4ef365424130738b9d81f893a5e2316ee6daea185c170f69ebd2ad455b56676ebda9d0bb0bf4d3357475ed8166a3d2dfe6e093c3a4bc5bc2fc2275e6779d809107b621138fc629a6767d5809c85bf88b46b14a8e4ee9e310db746f4c0a79a3d36f6e305125642dbf823474fb913a9967a6d120e82a79ace48c501fed8dd6edb9634df909fe6775f8f6fc5b79f5881e1f13b7cde37c7c3f97319cd612f8ad2b1ac921079f18213e5facba0b83c17887e69501a6d2eb37661f03590af1a15646165eb785f467cad0c625947e8a8a4a68f8938077d5ef7f1b8b4da0d09ad5874bcb22ccc4ee36b9341b974a51a1d6ca009ded4ace9faa99d924a23421aabb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "ae8472e987806e5110beae330056ff974abfce7ea9927979cdd14346747414cdce06a9c78eb1846c75dc288d7da531531da49ba7651d3a1f79e3297fe37aa73e075cfe5ac004b166526cba55f914e0d2fb1f12a60a3222dac434fa378c2e7b0ea9c2cb5e22cc343ea624ad6cf5545a61364cd67d6dc23d22e4888a253e940ff0e0ce0207c1feedccdfa10f50d2363bdbdf10893e3967d7555fba157f9a450d6bbe63ff31777bdfd402afa72c3a2181e5cc025443cec30d253653db7e82eb7dd488e6491fd25001723eae2e3106c7b50c2b73c142a4a31ec43edc9ec9011383c99a095b36258a0a77aac2af19b26af8a166b130f7f57f03a0e8007d5ac0eea9ecbe14fb7885538a22c13de5771bfdf523fef9c9b5f52ebc2af7902a0baf2a33923b0d0622b8fd5c938214aea4b9e7f0a647c5520c3a94a29737b95cc623f20bba8eaa3e9db60116fe1760d9b7ac1841e7586aec9708212a5bef2ff67c74462883062e052ab9fd90ffca0f0a6166b71a93bd289a1d4acd2d6ce72ae0b91cdde72e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "first byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "730a26b2c3fc2df474212c04fcb346b3b78a58c611351871ac1c5262867ce19a6f553880d68ba4c35827610b72bb044162b083fe9ffa7a82e2366090464821946f2ce1a8ea19b12c10c0e42a52ff805851c226748a9d65d7cb2057c9ee0beddd8ca02ae1bc36ced39925d2429d531c2e607bfbf0648708ef4f7d816c8839cc8c62036ac37e811f94a943198acf6e19c66cd829bde9dec9969eb4724e2d4ddc4f8c2bb2527007ddbaf2975937ece7f1779db28c610503e7ebbf0b03459a1f4794136842b57d04f14e22b98ef37939c64d08fb242cca548b7bb2c2d8b1df6bb8b0b7f6f38e47226e9fc0a4723c2a518ebdc5c4c8f15db74fe958bb567e55f092d3dc8af0128b353e2d273d574433c22cca579c479005b52c715eff1ef4eca8d82d2f6d7cc972fe0e75f19eeea3b77ea7fe26b1d29cedbfa7ef0737e4aa50a567b5fb417e356fa8034a72a53c5d1c0cd467808df6faeba89dddeaeb09c3ce7937450b41e7c1d4403b3033d3531adc24e9f5fe35d877a3e36fd3702289e69b460b97",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "first byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "39e95e2dbbcf1817407146b19148aeccdc6b538729ae4f3bc240f4ed8cb9dc6a0e9cdf436bf5237e79e239a432a953ce3804a7a55bcc3f7a0d37d0123b1f046ecbf0eb33f52631e049b0692ba2e55db134f60e085c078b0cbbd66a74bd09c852fa9f029fdcc25679990dc482284de9fc74df343aa7197d84689011f61ec0d1d0fd3b811a918e80b9ede6c78c03f0ff6ec7e7ecba9cbd8a4124128034e425aacb004c042be805710e94ca4d36cc2f5d893036091950bb1663d3499f8ebe09ea2760e3939b835efa585834112a5515c8900db98a44914a6c3e5caead29b182e585092ee59126c9e6a7737d3b34b2fdaeb74ddb299cc3725687167d5c1f92d9186f3aefca61ad6c27283dbc821f6b5aacb238500a51f7439a8bf555ee26fba4c8613fc43ffcd254977f5f67095ef23e956721d5d71a8a73503106b2555c7433cabb304f30492c90b357127b09d45f171d7f4d4939c84516f96eb8f0693385e53a3cf8a6b4d0638b121e2e70b5451883ef368097c7a2010dfd889015eef0081513d7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "last byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "84f1e37e7d52955a8d076e83fabce6a7153d49e771146ad665ac95b67eea85ecf8c126887c0b0e4ff2f4f3ca11ccc510fc4a062b3157edf20ff2763ed0c44ca8d48c571119bf5a4ada5d87eaf5c389cd8ce3a9ce70bfa98d5536fc731a2607066bb2cd0915511404e69ae5ba69bc197ed995f51d835bde74c5dd1d4e69a54445f3723692c3b201c28370e4892ea56c3d2b8354489a728495e7d7d611e82c739d53ded82f1e72c4e7273ec63c8fc4cd13241219659d9c6c8620a455477587737ab97959a91efabc1e1de8218bb67466b8e890f47b5ae46266ac06e06247f3a169a31f9fafa268bd453c67b77f7ca9a53adee42b3a9acd4af467f7defbcfb96f087717137bcc0bfb41f5add94af4981c00d95f992995aa3ae406dd6df56a7070834d201eb1cd12c7ca87779de0eb38dbb92f4e7f6f78dd224d0dee4b12b20836155553b0a76e2cc071abb59a70ab393679ca458d18f9a5ec69d1d70b074d6cc8f9c3d5143de1c53dac156d36d28660953ac68670e34317a8864cf7c7214e5c9c33",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "last byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "875c6f8f3395f75024b7ade4f6b3004c4607aa6cc99168d01ccd6cb481b51fb8a2bb44bd10a0e7768f282653ab6ca340b044ad03e09abd01bd0962a5e3724ff7a49ffee7818dd5acd0a6968c5c458c207d0f77eff3f8a2be4b559314b02e413865ecbfc0bf7ed7e66ae10b86efa9873eff30a17aedbf81cd98811ba228543ece8b14f64ca98dd26aa5ee83a1847d6fdabb8140e4dfe48db39f6a48a825b7af48c1e1bd124a2f6b76d0e37f76f4ba986ab3afeb55c7cf2f45021dc325322ae61b531f43242c65ba8b4a550801e966602730cc186bf4678d300d5783da4bb9d9ad54aceb656ec7e4598e3c209ac48e1b775b68896fe282bc2e3bf9cac99c601d64de18d31d1892b3098fae2933854f822c49faa09e079c4ffa9dd2c006471263f02e7e8eaf0345139482cd82ed8e6d3e080887ed13f2e65819a1dcdb6d3f5692f5ec7f3a0609f2f71ca4564d58f60a0311be5b597ddda9b07b52541ea924cc05146243d8b3899d3ab001184767f896f0e044224d96c975127c1c987a84d15cfa12",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "all bits in m_hash flipped",
+          "msg" : "313233343030",
+          "sig" : "bed5c44c1e2a041c2130caf34ce43e4efdde6f7846c30d5a1bbdd88c266485322b1fd6d6353e85ca4538d862394fd32180b36c10b314a8823a6c4a78cb62b5b9884a6ca480ad2993d4f209d1895f9a4182a14d47f09a13c9c9bbaf211d07653f8c610c16d156c931df9436bc7b9ef929dede2c1d59a2b0441290f51825ef44964564e3420dcf3c1622a8227a82b8d3806eb5d246a3b0527cde1be3f219a9015653f3f8a3956d055eff6a90f42b48f3fae5dc57d6be111956e6a9b6ef52dc35ef5ac363f1ce802c4c09555dd343ad0dda96b467166ac515830e9e2ee40d56e68558408b1fb71cbc4a964ebd832e315d8bee13529314a8ae346f4d12f5ef00686f4ec26f9479f57e69244264d81a0fa39ba7670cdf2db9684e0b70d2864c4f2514e498e87d474e65cb188835d5fd8c34e5432944cc0874eadcd0a3e62d9f533583d33f5a99af63d6cf429363f58f691deb4a95ff409e32c393f344c5e0347b2f12125f6e3944f563d59c6539c661129f300267dde299972f02dcc240bb8541acf2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "s_len changed to 0",
+          "msg" : "313233343030",
+          "sig" : "4e28f546283f9ac74cc99c6bca79bc208e47220cfb0717aabc521ac55119ec6bbcac880bed0007c04eef92a24b091d9a09ee5d3b5be790abdb2c98a07313d505fc876adcbb1089026940e03dfc10fb46a0c2a764ebe86e51ecc2ab489f56daf38764fc0a36a9cb4529367c9880bfd7631c340fb7fbac0edd2e1def00d65bd52e597e2eba1be1e41bd89a00f5c66fbc18b93e9cc1b5be962780f6d7a9c6d375a28556114f37a8a3606dcd68c8128bf7a7e5f1205778bcf3048bd4f7c10cbdb4ae759954c4e4db0a9fe4df270c41bb86885dbdd8cb7e72a33322238a2d29615a2f01e9fc59c230c2cce58ad096c2de5071e020f76c8c39874f1de677dd5d2f96ab4dc145098d25b740b5279f05713daff54ba695f950039882059cfc2f86c35a0501b8d0914aa59a806e8d1403fb2eef163ba1d6e3d1e18dc99c622f8c2d360bfab2c9e8fd9d74a027e466fbcf4fa56777ee0fea7e04ae1901e65b5361f97146d7f4a550adf77539fabb7135967dc16f8ca99e8283dd69627cf27cb9d2df20bbbb",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "s_len changed to 20",
+          "msg" : "313233343030",
+          "sig" : "78d3509284dc06b54583e11ddf2507d9e50bdbf079fc319d107bc2527c1b742f4c759320fa22435d74e94253feb4a379128e7f33c5f3462fbfb92ff40c10b23f8bdc5890114757364207768014380fc16ebeaf22a7b1a9366f3fbbbb912347f1ef595d742a976b69377533e7b61d3237c3693cf43b34f92773497b8df7ac0660f67439aaa66fe179b34d9dd4d013e8fab958fbe2a27ce84b6d1c3c2998a50d41b6b38000191673c23792db2fe47e4ddd3b5396c65dc44812e55298b8b50b5a2a01d508b9d215986113b099717c3a4ee930f479308c20c26630aa5419c2589c8cbbafa7eaebd71fca9e751793629d767be8709fef9177d6631a48731f5e59fc7e98cd466375e8775ba935f12b45575819ecef4d78d85b6e984d90d41c93bb03c832fe415fb567a1d951f7dbdf407beef8caa3a741ca7c7729c8d8ba98896dbe52d9785feb49332e646771e7d84b75476aafa0a54512806339cb54ec1c70943beb508966741eba4d39c2fe535aa82a9cb92eec99d38540efa3e39fbc02d757ad74",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "salt is all 0",
+          "msg" : "313233343030",
+          "sig" : "042bea79b22418311d75e86d0c05a9ab4905e59b3e0b12fa0b1e372bbf66690e1c23145b23b92735f2214ac1eac2cc4045e299f40f7e418c91ff328e68bf17466eb3e28de3139ec23b57ce5aafbc1e0e1521a292935a35c6d6189a42a81c573f8be9a0cf80b34457392faf031b632544fdd50285a7fa82a4ae6150b60dd9a32cfd131b246d6c89fc92e9a1df96857a6b56fd9c897aa4c8b4ee8e10dcd0ee80334d2261f02930a3a54a3477c8e155731878637256f70853484930d180a37c0b604aaaf649ce93f886a5f9aaf86e529286bf1ab5c8e189d44a28814d5e1c7e5c376d8e80ece5686d6ebab90a51773be4a919b22bde123ceed06c76d2c1af878540b5ec81ce067959ea8333e2340a9f9d7f2b22e1052e7478382ca937cbdad62a6d8fa409170ef2a03299126965d558978cad7d399a683d19b76bc598b94f6c94c33c6bb1652d44508c777de0da7b651e7c938e802bac8355d3503029cd1725e2dd70a90627df66c04989e541a56dc7df6a6a24175d921ecdcfdcd0e8b454de4a6e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "salt is all 1",
+          "msg" : "313233343030",
+          "sig" : "1d8bfdc0ddfb312f4b902bd241cb5750f80312688daf5e29ec6fb8cb085fc2978b25f101483e99d6c3a04e7a66e800257ecde1ef18c7ba17eeecd94d89245d15a6690be9d61faa9c94cefd06a24ad229f521688af44a2b26f726268607a3e4c63228261ac1bdfe714ff0414d6029772e53243770d735dbe211df1ce96056431405c2c612ce307957c5e7a7616bfe877148650de4ef0b4cb342aabc9315beab5e33f53986efa2b49de12b7dd1ae3676ba09a2aeec8c39c65dd44ce408a8c87d91e2225ee776cc1d924f354ba2e91c0d52b55fff4ccca2cf6ee76ee6b9588ba8f2d1610a7c7ec520602b37e206095e658fa144393de3fa47d048a017ed93ab89f835b63f8232c3f31eaeabe76a056c53d87f2349198c73cdbe9bc89085f610cbbe5f5ba65a0190d7339f2c26a7e3913aa98aca138bd87e6178c169d8a120eb5e74c51bf5040214efdccf7f9fc61624079081f9faf9c70b294bce55895eef3627cfec1cbd488940f7dc5f34b386fac86a569760bd490e856d364912ea354d4abd97",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "byte 0 in zero padding modified",
+          "msg" : "313233343030",
+          "sig" : "b01d88bdc0b6086a22c3ddd9b04a4e4a95c3b2550dc7e6c06e7a36ab17ecabfc5606a06f7ae7a0fe4723743e403112c7fc08800ecb687a64de4be5ea2482600fbeb01b46fc799b4206bacffa8c38d27c99cadaa0af333a8002829398d1996d1e8f64688670e30f14e96d9977056f310ffaa9d10b83d1c0eec4d3d73f64adaa343fb8b206aeeb2990342013ff42c7242dcf30f1653488b4976dff36a79853cba1dd28c6447e626e14a92459366208b7cadc5442c1a0bf0d4d8be6e32d5306173112742a873e8c4db781cd362b4ef198f32c750b44effe3bcb0448426f090941ed4c151c9b75588ac0867a2f468dc2fa46f0be778a8d6f2ba01ff47534c6d71d62109dea6741c60142580a1f4e22b1761200f4f1599970e1c456496ff82525085c0a12eea8c412b929bb1873cd7dbb2ab35b9eef309d9f0617fd37fb3c56a5bc84d965098dd6b0c058908f9cbde6858f0d0734726c593f2bcec32236741e110acb9d536a7942f67f4c8a4b06478229bab09e8a3ec73930b75e82fd4ac8e466fa5b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "byte 7 in zero padding modified",
+          "msg" : "313233343030",
+          "sig" : "52c636d91f3a8c269ea2be767293a325a7addd7b1026251d45c1e99d818f6f8b1d52306768d163b9d0de3600e18b8e6fc3d9e874ccfcef45e4011ebacf3500e712f36863e53cb01db1749798941d557428ac017d22be753eb401df9a96261126b017bceadb8a58e2d85bd51797e59cf9b34b9a42ad90ea441da58fd986e023d5f617498be1304552cb6f3b27a44a6dc9289a29f10ba879c82ccfbaf7468f65ffd1d9b1f44f60480a8743e4110a454d6b88f8f6870a32336510a0e967b352b5f73bd6a8f39ca6f40b65c016149ab7449452a59ec87dfaaef33fed36f1759dc4485b63ee302d302441502c61b1d8427843080d968341873b272991a0ecf9c19d6f37170ca7cdb8a3068acc8d6a7aa4e8a33ef463097a7978dfeea14018732672df9a124f7b3164f3ccc527a8c0d7a2d75abc03efce9adba296558fbb1110b4c6e7c8f7952f67bc558219d2a836c673467a4995140d9d7cc377adca9898f8ace6446feb50e5b744f76a7f75f103b654096fd2902fd863452ab4bc0f89c457bf1aba",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "all bytes in zero padding modified",
+          "msg" : "313233343030",
+          "sig" : "bcf0f11694a2a707898454a81625b83e3fe9a96155efad7cacd049c348c23eb728fcb3eaf395015657059129328f19f6e44f050d10783adfa384f20c25ac545c38771a0c46c9724a000868043d60cb9c688595c134022a0b6e99d594581f94638d24cff674a1f2ebc77c0d13a8dbd61848bb0595c6e201608f00c75c5cec3d3091bdaaf5d9c7cc60337591edf4850e7b782d45292baa165d99a811d79fbdd75d8389a270507d3eb26d5c240ef00869d910883ccb5436b36907a82e4058b5a2c6a27e092ef4cdcd5c98bb410bf229d8fe9520559e8167c0b1fd3b94632209bfe0332892f879f25afbba6fb67cb1dfc225746df618ada74a2c085bdbaec3b4f6d675504af6221ddd35db01829df1fd386236df6ee476a3660178a7408dff69a86feb522cbedf7ff866d5878bcaf19e82f09bfe2e6d33b4fb70e1467caceeeae4e5e0d8c81b0a7d3e17ec594c9be9c9ec51c23aae99c81fe919d942de167eee370c605564b8dbf1fee860c6e052a280c7190fda3c2f8c1f401e82c4dc1d67c73e78",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "first byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "58384fb43afccf19cdd00c2006d5a6bdd12a5ac149ba6b21d5dbfca1b394624007fa5a729a8d4e308daacece63654606e9be32ae8184ce9aa237cdeb44ce1c961a4598192a609d1edce2b9a9b8944cff2c9bfeec9e2fe6c7887f04e1911d7fdc994cdcc5c1282bbb2a519d4e6433bf087790c8833fc63e9236463121ade094e082d72a456ef9eaf928b2d38a7274b23a5136118e82b897414bb6cd0177298aac6970f179403d152553fc2d7e13e40c3b4875e6bc3fda904582ee49817f39e3c79b8ef70105de88387484595059453f9f57b52f1e79f5226ea2f8168e2e48de1d0d544daad205f6c32a6865f66acd4b318834741553cb1bce7a7c06e4c33cf51eabcbbe44626f53f7a2729cefda59ecba55ffb4bccb746dbd7689e7f3c1f29a6f26180fdfb143b16d10e58c72d4f8abb3dc3d35cabebe7928b5d61d5c1c9bed922bd44badf9db2f0e29f54d950a9978b1408a2935c6ab9e2491bb0624a888d306692fcf71e4c93bfd38ce6590e022c8e5bef0a9b5a3152edcc61c7ab8bdeef219",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "first byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "4e71b92c27a22e5003c8ff639720b5b809b34f1f2797135bb4ce06a7d1f6569c5cc4910d7cd0bbb15ec6d0cbeb5612eb9645eab205130e3cf04a0011f56728eb447d26dc77a4ecaba396ae84ff1481422d83e4418f4858cf6639b831105d0f8c428fa9dc69e380dcd77d8d30c362b1ca067bbaf124aaaa0b0ce4bbe9afa7f2787b6b8c476b6139960e1b436f8b13a1b85ffad382e316223261d7e7a5f2300cfc04e51957ea4a0a65d19596c3034239b8bf8f0bea6f0d6d749e2d3df8241e4622204c334cd748c4d0254fac93db64fbbaf79ecad12ad19c74d944970779a6401135a5a8cbb32b6334988df3424c3993c157620988aee3bf276eca44daaa5370265a6ddbcee5d207670c0d46d555027c1854ba9221bb86dcc4df2fa8e99833e362147c8d2c4598f467d0ffb8ceb18c9187511b4135ea068d9961bd07ee0fe56b7dabb222ac542746daa4a45cfd77f0213f7e5bcdbfebb5a4ad18d79a599d0755dbaaa19fd03f4bd8cf9c7c8416c14d23b0ca54de5f0492d2d9ced1c8b5cb79ccb5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "last byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "1a9f21db6f3fe415a344b61db76ebf60a84ff0df70ecb5cd14a16aafdbfbf895303d9eb831d7a9bed89ee3ca737f49643b077a824dc3f433c00ef1b693f82d30449fcd323a48c84cc5af375d7bfa2d3ad882480225fe4a6adf05c0341a7913ab931bd085134fe470003d3a612d88ff0da54af1bede6bfd58f19901de43ba61c72d5f96302b6428bf03847d54ec1d74921787ba1fedc480605fcb45b74d37dd0abb4067f97e28ccbb86bc0a1c05eeb6582984606be21574bbb7bc04edef528a8581eb135e971c6dbba21b1155e777da9f6c6ac182b4de0c9ebfbc59c71ee6688d9b054cf7772f596fc9f6e87bca4ee8df7d6267e29824b1a70840c69e1d162858ece7de3bf08072f5caaadd1b8c6617fa7888bd5e9d5367be064cc82ac4b59b240e0e7397060417e6386a623c96bc7f9bc1da4365e08c22cbdd2ef1a4a77dfef4bbb3e4cbeee7012c25ce52ceefa18bf5056583109030f91d92de8200f3b202efb9cf58d375df1dfee699586298b9eef0d1e99466bd47a0d128fb9089ec6c87e9",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "last byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "70dab9aba45e87811d667c5e8324d1f0cc50071c306e6877acfb9a58e4b74798b193159021875e18dde242a51c3885cc51573a95eee4029f663222e0fefd68cd4fa71c6fca4ee8e2876e62bf8211e0986b4e1e7afb2c19ddd5e4e184a77cb11a045f77bd2622665732d1674111166924faf5b935eb2bf4ac8cd47b63ac0078c5ec05d4dedc91595c2b3f5c8dc399051ed0654401cae20128c3dab28e7668b05b4da624fbfab83e425031c8b8f4bb76b78e2e666eb854b0af342011a5e19bb252f90a94ef9c916a945e3e1fa926639425c2e2954533fdab1f6b944650249478792339d9b2f77b46b094c986720029e040c5c6b7c14b777fc9a164004a5b011b15ce6cab8d080f9a006546be010591c638d601d775637f2ed7ab94cc786b05e0ea7b0b0b4c7d1c730de93fec5380c1fa76501f7e3a8eeb26287b27fca17c30952893136a5c12c48163c9e7796154b0b2d6cc7a5d9491a9c777e6d38c60413c5dfe921962ebad11fc6771ee4f3cef2a2717a78bb6ae0895160818881798b58d0595",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "all bytes of h replaced by 0",
+          "msg" : "313233343030",
+          "sig" : "9f8d0b7fc6934a3eb7ec6feb90bc8ed2c457eeac964f0fa9ce8924218c5dd38ce85083e657bbd19ce6d6ddb5422315c067ea8307381c7275e9757f11f94723bed3a174728555dea45c8deb3265879d95f005d6bbfb4c75ecc7452a20b923f78d681a010a2c5d1519841383cfa8b299ab60db09905ae9914c7ccf1d1bcb578eede63da12ab0b16231dd40f3e756a3ee84716c64db348b1bc3fd49dce7bee98a16a1f6d9190d57b940a265a31f8298beb1a1f759be17724c5f911ca1d8bc9f2233eddb09fe51d2d36ed1976f0431f06b8ffa848105bf019d30d7d8d05303daebb56980d1a696f1dc9224164932dfd119e8db7b87e44e0dcfa1b76aa2dfba2beba02f14d1410dfdedd27832c03840ff86844b41b73781195c820aae42f756959775f6038f9615bd319f2788756afd3f37d384a775c4d6484ad3dddd7cb9a45e2b750d73f4f802e60efebcc235630ace45f2c50a2d6fbfc10b951e36c363640ea762ce6ed57649be8b49a45c987a66b86c2d590056f7d4a178e1563bb07ed8cbb8b0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "all bits of h replaced by 1s",
+          "msg" : "313233343030",
+          "sig" : "312fe5046619324e6b32a385bccabb713d787ff7a7fc9527bf1b57627940365fc84cb858435f078322935d0384728dc77a56e6429adb6ab9c9e3b6a250363d3a529c7bead31fcc57590faec372f816148fc73c8e0eed5b6dc591a10ca6711eb121eea991afd5b8a820caa377071a04a11f3ea526d150ce9e6f7e51522fa7b86ea5e03a4a37c44cf77c35b4907febb1fbd6d6d9c9f117dc0c41b465dc2afbdd09b93237564a4814cb2831a095fe9862d1f607a31905d45d6946a3d5b6377d85b424b99fe36e1d0fc5c7e74bdc6588bba4af33b9742e5727b32c24b2937a3fae82df3734e86b79fe21d9810fef8d6be753fdfccbdf78d735c4223cc8e7781f111da2d83a63288995d9baf1868158ec3117042a4bc4125f7db1a2e95877fe1437701f31955a20fa05e687ca84b6a8a4dcbf34ef627528bdd22a3daeb69761c47b8799d1e24eccbaa0cfd3f5684d98c5c69a79942846c745bfab428eeadd4dc52cf3827c08547c7e8a8fb0dc149e8b043a49ebd2160e0372733d38000581e775d0c7",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "all bits in hash h flipped",
+          "msg" : "313233343030",
+          "sig" : "69d4190ab2eb0b4a59fe3692c6b99dd3ec7a8498f3b81dbbc4709b77ad49ae344a68acc33ec05176a5c1f572dca5ca962d51bab6381d0dd050f539fb5f6532a3c811d2cbde95b043d854c50f479ccafa3cd7ddce182558693c701df66747e537e29adb9c7e2ec3f345fa5010ff3f8ca5cf4de31139dc3f9ed93b4f7ee77bf9bd29757f330e259e6ddd5e40f86152f26c76cf7a778b7565287406e431c440812420bb1c9e36614b51745cd35ad18a018acaf3a8871e904988b66e2a09662f88810bf5bfc17dd7465abb77d2f625ca83ccf2e2f187b217c28cc0818f04e259ecd59c0ce07f6732eb18c72fbd007a1f070c554424185ba45e9eb1b10b0555f8d4678fd7f7e91c92de9f2a11c45be7dc1366ffc3ab71f263eb892ecef25353bec9ca6ab78668cb9b66a9d0cd68b4df0b2ee17940fc1c66915cf30be060952cba3b4237bebf7ca4b59023a9293c6634912a90291528e48b96542a0560da0c457407bf454a9ce5919c70e62536b8e5e26f95940a2a6446a00e9ca64e710012d07c9904",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "first byte of ps modified",
+          "msg" : "313233343030",
+          "sig" : "54a5a3186bbdf9a08df3b3bb343979c4e74e3e6d507b6b81e1aa34421fee0fc53f9dc5b0f80ad535e25caf47ff3e3abb729e271e2e3d945b61e56fb29e32e7d93e748474276252e3b3f05ba709a1909b95414da0ada0effd5ea3572560fd24d3bfe2798006c322acdfb7caeab12b82169b72771b07030370f301a31f0b919724a5594d9b48bb5c8945cebae01653766b7100103aaa38d4c0080641fb7d946c2ba66bebc4e6df76c127eedd9b83dd239357ecd3c7a4e0370b016d542203963e962aba5ad8305d2980b35b8e4f65e2387afa912c13ac7f725b91badedb1332b21e15692752d474fcfe1b408d5c2bc2e29f67b9ab76cdfd64bbeb809ce9e89ca21722b4e04f03bbcf070df8387485d7a2c3fa0b0b3cd7e17562510dad0ffb1c16d838b042ab85d58fbf4429eb91dc9fb499d54cb92300d331dc5609b270dbe639522d84378b529dd7b592c5eaebefd4e032401b073501a4fe1530851c2d845263b0c988d6f49e7dea2cb4925f9ecaf77365bf01894202783cb4c79f3370b74ea789",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "last byte of ps modified",
+          "msg" : "313233343030",
+          "sig" : "4ed9724ed7882a0ea9d61cf2d1bfb1c042d94b2427d71079625d8d59f7e5632a578521973bd496cdabf1e9dd45bac456440930d221b95cc4d2080e96c963685b909000c45d62835b9e68ddc728e9c03a4831a90435abab57a99affcc7270b490b850721609f568fa4a404ff8b054345e1d8e4edb9234330f9dbe60e4ee2042a5bfb28d3a11a9fd03655687561938c45bafc64f59d0d5d72fd23bc40a521dda3e2b4a7b69b6047193cf8dc3fee3fd299fe88b58fa052bce5c4af62baf548bd5fa8c08bf6aa17eddb8fd175c40128d1efc64e40e08076f738a5da495b1e9e0a2f52f1acc1936c905fb69871de2159aa5b4accfeca00764ecbd03f0c9a2d8231f26ce5e7aef43f271d3623459930a0d99a5a41c726085113509c15abaecd8e78f25fb2e5c3983afda6eadd0e68d742613d085ea1db524f8d97e189136b6481e3e61b7f5290f2d10b15a9b93a5fb4a6891f5e4a341797e5fe27e3c202d267d76be409a3b72b15e406729a2e56c9b9d7cda30283d7dd352c88ea82350e4a12fa17b97",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "all bytes of ps changed to 0xff",
+          "msg" : "313233343030",
+          "sig" : "a855da78c44be74dddee634157b685a227714cbb6a21288cdbf3a87aa48b1da98cd590a049d2ab715136d147142e5526bec5d1d08a24d99e9965242fed7c0e9e3a94c6cd76511083b7fc244db4b8efa094624564feb61992b02b3f7724fbe6f53f4f1220fe03f28a6defec4632cd074636fc129d75f7c12f2da83903b1b40e2415096f3bf3955d1bc231f643cd964463199da00df164f7ebdd967b2415ed460f9d26bdf6542ad355dc0547ddfc93c272902eb0698a53b0d06eac9acb9d54d335c4a460c97fd778dda40854abb7086beff78928b61604dd94f8e0bf8ed54185c3bf14cb8bbbd79c6f9da3888eee31692b30f370f8d6e2716daf73eb5f318ed4f99705f019eed29b2ba5fa6193eb0049fddecff02ed19300102e27be3c85d231bca8cd1c24e175e95fbc2a3bf8e23e2b8a622f48cd100672e058c2ca2f3b1855eddb06b6e707e1f05956a4683976749193faeccb5e25af7a99528da61c686269b49ea5b768768d7f624a1600e403db229a85e8644f4dd7147315cedbdc85703c89",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "all bytes of ps changed to 0x80",
+          "msg" : "313233343030",
+          "sig" : "5b7d079d667b60b3508089031b604327bbcdaedc887c9530ba1554694dfaf081ac91fd339323793d862786c92696f1d9523cc8aac14dba90a6363bee9a93fcd7751973ecb70cd812725f1190d62f9d950a552336eeec2f2759c4d347d4b75717c46365c684acfaac48ffa5a3a74748bd13d4ce461df0095bc2fe74b565f629be5407985ca7ceaac43810e42951e7a7abd8c2f548deca74f34afa47c2d72b85eea9cd2434d4b5ba81f9eec865a2c4ae17d4fe00aced59bc20f0e8a4e9b5fe98da5b7859719fea29b643323f2fb05f4bba83804ba1ae3040e62331d4ee15ad82221f14abe7a9dc440851fb97708b120e4d32e37327d103b626a64845a76d24762d12e4210e166a87fa77f8e2f2c9feda8dfaaefa10774480b8e6f6bd912c4048b77ab3cd7684c348c3ca398ca0c06393e83defa0eea7034c97695e7556facef23cc8a0e9d395080fbd94b085380550deca1a2952554873be0936714c5d78ca53d36728919a7c4e7069ce97bf215da1d02cf14068c16100f8f78baba2d19abd306e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "ps followed by 0",
+          "msg" : "313233343030",
+          "sig" : "8574a80f36973bf6b986c7b81bc6d289b118caafffc31d2c99d2dccc1e6611d598dda3fd7c22cf10c7729fa84a87e3f19ff4bf11a96018694b7d829bc003009eb104e8955e8a8717f2fa89220281fed0878b9febf77e5b81e93515a8541d7a4b8a4c008a298d317e7b82c826b5d67bf04d459a5d5fd7f69389dfbb25146c4805cab1aadd009d7b00956ba93f6d02f5266d8b06e28b346b06f1c3501cef04a1c607d7f85ee037178e6f2b0dde307eb6f5f88229541cb3d37e495cb5997264a0c1342713e8548e318681a783381dec9d6524f5c80c437b997f2fb95c80ca7158d0ebd531b4c9bafb19ad9ea0542217c1ad965ee6f1afa5a48becbf65b380f1946dcc85fbcd82fb90011e650dd1e507dd19037ec1f2ac98a87c25a6f588aa6b6f93d35b83c1e8e09152470dae2af8afc1fb2146cd426fe8d3cae5a80c1a63c7fc42825226bec26d57fb62bd048fcd921b8be7aa8d024926fe3cf5c5e3e7f5b2f50b33dea547389e40fd67a8523cd5facb29e97583f26a34f1ed880869800a4b35d6",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "ps followed by 0xff",
+          "msg" : "313233343030",
+          "sig" : "7857b1fe06fcc417c07766a9892ae30eaca65df7474575a70d8e286fc22e3092dcd23446b101cf27951eeb2cf879d320b2bd12f45b79c10018178532d8fc4d708583adb4d7d7469cd5362c074c519106c761228557d4280dadd907b27675e318033ad32ea71e001c3e7f68f6dc07509396a61db29a9ad376f406ff35aeaebf8c6fd0bf7df4bb721c91dfdffa933f37db0bee5d4f7d34f3df2a3a0f383e443647838d7c02ca87d9d79814ee9d5b2860fdfea5577702dbc829610ee1eb13f6e6f0636f39c5ec537c0695bca4971dcab6907e907650b92b96d5d64c6de52c4d986d458f0195345b1e84fbeaa483e3c926167a0d1a977024aef2474c31752515b55021048d2fc23ecc5ec5126c57b18a1656ed49aa90e0cb51e77e56507d7fc60b1f761354423b110d44c67664781e5caecb5da5475b01ab2356993378491c2ce4fbc41badf110c33bd0b78cd19540d8aaf27bc9f3450ce7579c87ee40a454133093ad89b29b99b4b15c21f072bd2f5c991e6a98a23fefc06121ba81540cad7e2a34",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "shifted salt",
+          "msg" : "313233343030",
+          "sig" : "9393a9989ba865a8be0fee265ee6b5b3cb9380019e3c4377521a729a968dee0374b547e94e6b12d860bdfd5197787d35208ae3e8d6a689d031072f6b993b7a8900a278fbf1c07dadcba6b4074375c666e035c2f12d158f626277d7d4b781c8b6bd71a97f575f08c4520b2d66588756b9fc8603a346cec73eba4e8350d7570e923cf84c1b33ad7bdd507d87c3ddf01084703f47d423a5abacb7a6caf5bf7ac4c61cfc91ba9483e7b3cbf9a094aae25b17468fb3a3b6a42d23225bd4859d2279037de2ff446eb441de7060a675b61b3e591a4f854265ffe937bcf575ea85b84046af568a298902774ad9a888847f3d20496d8c570da907686e3441998857e3927feebbf5540d734fc7093263b0efdc33f32f93b936d8f81b920745c2c854266059c92120435b3f41d7a3a5a7d2c3571a15db2136362f736e099e893785876f0ff0b51d3006417235129ba4480c4164329f1f9c6aaf48c93411e388f00cd8b6b125f4f1d3fbf21ee7ad4355a416101cd857f6ae91958aa88b31134a7b6906aa184d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "b77b9c5862c9fd0f4e4d72fb7bcb23b2a5d2124f13aa7001275451a10148993a3e846e0b29157aa3a1a8ae643e2ee84a459b033201692697eff53b3606e85c6649d76c8288899499f2751918879a034d616543c0b7cfb215744b8dd03e50ce4eeda2891ddb8ca9c568ccf98b3128be25e191a4462f6458c718b33e5f519e3de152b0ec691f2f5b8f3cc150ce37814095001cd60b3dc6e694a3df5aab7a0c1b2dc152c26901294b01cba43b74e4e28d14a9a614d0198c30fe578831c8d1b51b1db0dc34f6c47de0d38d20efd1afc8d385e6bffeae43280f62a5f2715af79af64f04d126e1dd36067bb44d01ebc78769766bd4332a43dba1b124a4cbed381ccb43952ee4cc19201f05558c11f51ab5e76b76b01fcd036a949ec9e4d7153fb25a1aafdc8e0f1754bb59ffecb9a6fd9cb05d527661bc013cb73cec4ad1ab046e1e94b6d518604c7ce7bae1dd1319b612cde529a6ae588c4c6a6a7669e82e141ba6352e4552fdf05d9d1e3fa217ac5b38629d81ed749629ec53f3b30f29df883fa68e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "leading bits of masked_bd not cleared",
+          "msg" : "313233343030",
+          "sig" : "6ae7425610f6d9b6cf5a358bdff3bdd00802d55cdaba2201794738b900489dfeb11d921d87449ef9d1e5b0deae4bdb26cc13c9916a767cde8e0ef67de6f8042e1d5f600bf707f65380f971222d37088edaafa4909ed566694601e25bec8c3128dd61e664688b5ce2ed2f626a5b618bb10d12cc78ebbb0f3cd6883b6476fe4f89008d9e8feb7e835fa873f2d6d9973412abcf12d2646723b1a5ab4e3b206d49ab6f47789010cf902adf720a02c7677847925487634f81e163819f286da4d42437e66ead9278a088d9a2628aec137be60eac2eb30306e598b9459f0ee1c79dc132248f013f15fb80ba713703b66848612d8f4e5d6bc444e166998f3107b459efc73ebe1bdc0b98e4d57bb960d6db0540f68b96212da6ffb05bac7ace76db7b3bb69188715c091f14354fbb8a02cf2b2d77e7f2e8db505e93603bbfff2f33ba54be38630dba291befeca45c76c67f344b9daf7a7b0712b5a49e7b6af29734516570cac32d02074a74cc0e49797508e1aff2af9f20a7163440fd962bbcc5269d8f13",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "first byte of masked_db changed to 0",
+          "msg" : "313233343030",
+          "sig" : "b9bde8fc005ab0b6b0317aadbef7d6e8abb69391bd7ea43fba5a49ffec02979f89d0a9efeacfccabae271c998ad7fbff4442367c07e49a892b9632bf4f30de3e95583875f3069fd3299a30bc21e74526cc51cb10dafe22b06d3a412a6509daa83d337e18c5dee6591a11262e008c3b562a18a9ada3169267eaa849b16a377b195ca6f83df0d2c2945a3d3fc2b872bc2ba965ef4186ad1e7ea5b56fb689fada3f377e0897e5cf86906dd2d894848a6f3d64d96a5523fd74d2e8418809fcefe5b9bf12f5ae7189e2aad268e835b5a701073e26be131c9dac06203142d93c95af3d00acec603aae2a24bff3d5481c7e71be5f63a1c47eef680a00991008ca0047c7bef7812c9b823a64e6cb40d0fb4472b702bf4f1c9483f835812eb3f70808e3dec7ab2ce2d8cf1c0dede8521780513140f10d84727d4f14ae06f65276feba1857a7e879e9c4f59c80760b117e1c4083e342018da1c42adc6c5255404adaf8460d122d3c670aa29b58c087d118643eace86667e6bad6c07f078f9cdb8618b48e92",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "last byte in em modified",
+          "msg" : "313233343030",
+          "sig" : "872f410815926494669ff81dc7114e096f007790f6a4ae3a946b64984eb28bf28351616cc82ed34172f1d1d0a8918f87d64258328db63b72127fbd26320a21c114a7f0b6c88ef717d949f57a28e66244b1fbaaa942d3ab2245ac76f0cc4bafcc119a64f7d167e3e2a64dc9a004464b28bfdcac00a24ed7e3689ca1ed23480c1a0625601c4e7f1e374b54c1c1fbed91e0967b40a3920210b84619c23217c2a6a39734320607abee432c7ad2bb0a8b735400bf775256a61324d4c4ee743ffe99a7bcd13a27b0fa33c0dfbe0cf9663116997573a59204c62aa497e98a698b5dd19314de9ef95cb8bdad0e07b722eb6795f6ea8098b7b092f7bdf73aa459dd85843b310d71e0400470ac14db383940519c060d111f0b80896083b6fb305ee6d9d7879d177f7cfd85c913d226fd6c75f38519d7e8f6d32bce50e85901fe6bdfc74997862a3b809e5ed5793013cd19af9efca616a9ac3e346136142374f58ca823b6a6b2870bfec41207b0a8f58d72c119e319a3934cbd40451f0a1e26b447a5687b9a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "last byte in em modified",
+          "msg" : "313233343030",
+          "sig" : "5e0a2f627d11c2f5c2a61cec6b9ab6ea6f2620085e52ab1d162365a2c7040178b3e6222503efdbc66eff0cb892be95abee6ae02af0a29436de4ecd2ff63eb7e082d51ab31d358309747ce61e30df4ab3382341b88eb2da84406ae20fb3bf9a968cf5ccc871be02f6cd9f2a89ffc6f3a69a589526e8a4f1a8c049286ffca8359e81cb3173a2d2e2cc76a4829edebdd3dbda327a92dd35202b597bdf077d7ac2924f8cfb29a85dc25dfd2ab6e770cc80120a7bd594e020392e58acca9d7356773e58aacfabd66c2d9a888379b73868d07e3d14af1dadc1843f2a6c8e14c93b3b29134169c5ae3b293ee6f6a475f20c7c159258a8cf1a1cede602afa9fe7c61a3218c34024a87bdf4a64ef12c78a11a50bc1521836bc4d84eba90ab1db1b17ef0e6e95d7c9de5d6b84e11dd5422a869ecc7f90f952794f6093df89fb664aae86669c63bd46de5972388d81908fe56c6bd029e393047c52924a97aa55c07d482f98b784e6d39cbc280330a34ac4a8a72733235e66234903a4505228a3fc8e1146034",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "last byte in em modified",
+          "msg" : "313233343030",
+          "sig" : "07f0772411cdb1e02802f8ca699bf55bebadd254c9aadc16e1d6d4af3e12670bfd2adc2dbe80195f065d75fa4a25ef757766fffa4d902b386a9c7f247206f60c744938f50d6f840170ae94c6792299c386a1d6d7aeb73fecd5b72a28249a2ad771a5518fb694f54924e15cecb2d755da44b54535dc6f8fce0e91ea160ea942c9e34eef5d7367c9065f5ac270ef11a35bcedf663183f74cd2d504410b97b4034a59d201333f235f59924aad30fa877a31e0c1573f62e7be41f961e9c31ec334153d83adb0ef38963f0f5e20c90b67ae5c5e2ef8520587587c22e869881abc6bfcecd62a1f878115e6cbca7259e8b9e116fdeed841f1d698e85f65c7ae07421cf3096f6b31a07e251944bd7e2cf50ccf69a18de7c17700b25786d29ed74fe8d5757d4dabe2d6fbffc2227448ee8d5559f992a3b635cd74a68c329f1785e743ce9d3bee57b997f9ae2deb531f8994ada98d9a3536b074814c2d5003d6a3d50a9e56287f3aee8ed87104c19656a6057515fe17bb2a72a53a7c19b7a814252c8bee61",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "signature is 0",
+          "msg" : "313233343030",
+          "sig" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "signature is 1",
+          "msg" : "313233343030",
+          "sig" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "signature is n-1",
+          "msg" : "313233343030",
+          "sig" : "c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b1202",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "signature is n",
+          "msg" : "313233343030",
+          "sig" : "c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b1203",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "prepending 0's to signature",
+          "msg" : "313233343030",
+          "sig" : "00008f9ac1354af4161d0e55b5674821d02823b3a6b3f79cefb98cbc77f9ac2d91cc6345f989a7828132f73f3630a247a936b6a057b3e5a2fda0c5999ea7721ee8880960c24cd2377e869cca1799747142d57ad6a8d83ec9254d89f591add11a758e1ea1e29bd08f624d0e28cea52ed5eed7c0f5f49d3533eb1cdbb2af837dc42942f9a86b5f4e2d5ce506697ef067a344949bdd89afcc25978af4d50c300bcd0ffc9d93cc559e3ae1a13215a1d3f6030827340c6591061a5ab7e65153b1df8b25e1421f924d39c7e6f76243c1bb9ae4063d9a475cd2ece45f4e288fe0720074e87868d70a5584a9ac2b47a56417cc76f15154315545a3ed6704b365f15d34320804469c3b09ed211cbc9e9e767b6f21fa16f8641d8b78b8dff8062a25b5bd3b6a38cb4706c42c1fbbe66db1c05cb57531132eb94fe1569735c33ec491c318a686c837ac810be4afff605f92bb390e7ab3cd24c0cd997cf13f112e5aa01746f43902432639e1eefcbd37b413c586f057bcba40a8f1251251e84cb7c87c53c1d1d558",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "appending 0's to signature",
+          "msg" : "313233343030",
+          "sig" : "8f9ac1354af4161d0e55b5674821d02823b3a6b3f79cefb98cbc77f9ac2d91cc6345f989a7828132f73f3630a247a936b6a057b3e5a2fda0c5999ea7721ee8880960c24cd2377e869cca1799747142d57ad6a8d83ec9254d89f591add11a758e1ea1e29bd08f624d0e28cea52ed5eed7c0f5f49d3533eb1cdbb2af837dc42942f9a86b5f4e2d5ce506697ef067a344949bdd89afcc25978af4d50c300bcd0ffc9d93cc559e3ae1a13215a1d3f6030827340c6591061a5ab7e65153b1df8b25e1421f924d39c7e6f76243c1bb9ae4063d9a475cd2ece45f4e288fe0720074e87868d70a5584a9ac2b47a56417cc76f15154315545a3ed6704b365f15d34320804469c3b09ed211cbc9e9e767b6f21fa16f8641d8b78b8dff8062a25b5bd3b6a38cb4706c42c1fbbe66db1c05cb57531132eb94fe1569735c33ec491c318a686c837ac810be4afff605f92bb390e7ab3cd24c0cd997cf13f112e5aa01746f43902432639e1eefcbd37b413c586f057bcba40a8f1251251e84cb7c87c53c1d1d5580000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "truncated signature",
+          "msg" : "313233343030",
+          "sig" : "8f9ac1354af4161d0e55b5674821d02823b3a6b3f79cefb98cbc77f9ac2d91cc6345f989a7828132f73f3630a247a936b6a057b3e5a2fda0c5999ea7721ee8880960c24cd2377e869cca1799747142d57ad6a8d83ec9254d89f591add11a758e1ea1e29bd08f624d0e28cea52ed5eed7c0f5f49d3533eb1cdbb2af837dc42942f9a86b5f4e2d5ce506697ef067a344949bdd89afcc25978af4d50c300bcd0ffc9d93cc559e3ae1a13215a1d3f6030827340c6591061a5ab7e65153b1df8b25e1421f924d39c7e6f76243c1bb9ae4063d9a475cd2ece45f4e288fe0720074e87868d70a5584a9ac2b47a56417cc76f15154315545a3ed6704b365f15d34320804469c3b09ed211cbc9e9e767b6f21fa16f8641d8b78b8dff8062a25b5bd3b6a38cb4706c42c1fbbe66db1c05cb57531132eb94fe1569735c33ec491c318a686c837ac810be4afff605f92bb390e7ab3cd24c0cd997cf13f112e5aa01746f43902432639e1eefcbd37b413c586f057bcba40a8f1251251e84cb7c87c53c1d1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "empty signature",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/rsa_pss_4096_sha256_mgf1_32_test.json b/third_party/wycheproof/testvectors/rsa_pss_4096_sha256_mgf1_32_test.json
new file mode 100644
index 0000000..bd88f18
--- /dev/null
+++ b/third_party/wycheproof/testvectors/rsa_pss_4096_sha256_mgf1_32_test.json
@@ -0,0 +1,399 @@
+{
+  "algorithm" : "RSASSA-PSS",
+  "generatorVersion" : "0.4.12",
+  "numberOfTests" : 47,
+  "header" : [],
+  "testGroups" : [
+    {
+      "e" : "10001",
+      "keyAsn" : "3082020a0282020100956353ecb7561945dc5544e4602466078c93f28507701ffd39e2a9813c8ac8740e6ad61c955d484e513b3dcea527e001a018ee2c207c1806a96763280236cd3c820dff79837c9b709cb4b522d3ddbc9192242259c43be75ea244d37ccfa8a4c75024a2cf7cc76e842ea69cc7ca1227405b070047387a5068e4976e4b8ed5f9aadd7b4db024fbb8d7bd8a040d8f6610c1c6eb1d4b606dfd182235d0360880304d5a750603af0c424b8c8e6dbc12c3697d2d609c97547e774e2e362ea96d1690dc9432112c535258b3db2c4c32ad510d6c07ad0788357883869efb8b629298724847925cf42b34386be700f02903db5852276bee2370941f397bdc3905e30964a0b5e73602703340960c3ed6078263b611f197955fecce4b9a32e43cd1d2e5e87c4ceb65edc8853a7ee31d28e16e5adffb8ac7b760fbfc63d5f174f4d0936461dbb12c964a6b6d6cee752e5fca1ab4a9fd238dd3e8860a1d763d2019f9e7b99ed7666d4e038710f90e0093bc566987d6c0092f571376e705b342d066c54e6e2578927b92c1f0928de44e9a6e1f49b907c6aa4f605ec9c398d55df81c67373b03cc8110162fb417f96fd321048647dfcbb392455115cd912ea83351853e6a185284648842adcbd25e67174a3b93b8a64ce2ce9de0e8577b8b662ce32e2565782665dd38e5bb5fcc4fe12e4320dab7773b545a09c6d39d9dbad459f21f3e624ee6ed0203010001",
+      "keyDer" : "30820222300d06092a864886f70d01010105000382020f003082020a0282020100956353ecb7561945dc5544e4602466078c93f28507701ffd39e2a9813c8ac8740e6ad61c955d484e513b3dcea527e001a018ee2c207c1806a96763280236cd3c820dff79837c9b709cb4b522d3ddbc9192242259c43be75ea244d37ccfa8a4c75024a2cf7cc76e842ea69cc7ca1227405b070047387a5068e4976e4b8ed5f9aadd7b4db024fbb8d7bd8a040d8f6610c1c6eb1d4b606dfd182235d0360880304d5a750603af0c424b8c8e6dbc12c3697d2d609c97547e774e2e362ea96d1690dc9432112c535258b3db2c4c32ad510d6c07ad0788357883869efb8b629298724847925cf42b34386be700f02903db5852276bee2370941f397bdc3905e30964a0b5e73602703340960c3ed6078263b611f197955fecce4b9a32e43cd1d2e5e87c4ceb65edc8853a7ee31d28e16e5adffb8ac7b760fbfc63d5f174f4d0936461dbb12c964a6b6d6cee752e5fca1ab4a9fd238dd3e8860a1d763d2019f9e7b99ed7666d4e038710f90e0093bc566987d6c0092f571376e705b342d066c54e6e2578927b92c1f0928de44e9a6e1f49b907c6aa4f605ec9c398d55df81c67373b03cc8110162fb417f96fd321048647dfcbb392455115cd912ea83351853e6a185284648842adcbd25e67174a3b93b8a64ce2ce9de0e8577b8b662ce32e2565782665dd38e5bb5fcc4fe12e4320dab7773b545a09c6d39d9dbad459f21f3e624ee6ed0203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlWNT7LdWGUXcVUTkYCRm\nB4yT8oUHcB/9OeKpgTyKyHQOatYclV1ITlE7Pc6lJ+ABoBjuLCB8GAapZ2MoAjbN\nPIIN/3mDfJtwnLS1ItPdvJGSJCJZxDvnXqJE03zPqKTHUCSiz3zHboQuppzHyhIn\nQFsHAEc4elBo5JduS47V+arde02wJPu4172KBA2PZhDBxusdS2Bt/RgiNdA2CIAw\nTVp1BgOvDEJLjI5tvBLDaX0tYJyXVH53Ti42LqltFpDclDIRLFNSWLPbLEwyrVEN\nbAetB4g1eIOGnvuLYpKYckhHklz0KzQ4a+cA8CkD21hSJ2vuI3CUHzl73DkF4wlk\noLXnNgJwM0CWDD7WB4JjthHxl5Vf7M5LmjLkPNHS5eh8TOtl7ciFOn7jHSjhblrf\n+4rHt2D7/GPV8XT00JNkYduxLJZKa21s7nUuX8oatKn9I43T6IYKHXY9IBn557me\n12ZtTgOHEPkOAJO8VmmH1sAJL1cTducFs0LQZsVObiV4knuSwfCSjeROmm4fSbkH\nxqpPYF7Jw5jVXfgcZzc7A8yBEBYvtBf5b9MhBIZH38uzkkVRFc2RLqgzUYU+ahhS\nhGSIQq3L0l5nF0o7k7imTOLOneDoV3uLZizjLiVleCZl3Tjlu1/MT+EuQyDat3c7\nVFoJxtOdnbrUWfIfPmJO5u0CAwEAAQ==\n-----END PUBLIC KEY-----",
+      "keysize" : 4096,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0956353ecb7561945dc5544e4602466078c93f28507701ffd39e2a9813c8ac8740e6ad61c955d484e513b3dcea527e001a018ee2c207c1806a96763280236cd3c820dff79837c9b709cb4b522d3ddbc9192242259c43be75ea244d37ccfa8a4c75024a2cf7cc76e842ea69cc7ca1227405b070047387a5068e4976e4b8ed5f9aadd7b4db024fbb8d7bd8a040d8f6610c1c6eb1d4b606dfd182235d0360880304d5a750603af0c424b8c8e6dbc12c3697d2d609c97547e774e2e362ea96d1690dc9432112c535258b3db2c4c32ad510d6c07ad0788357883869efb8b629298724847925cf42b34386be700f02903db5852276bee2370941f397bdc3905e30964a0b5e73602703340960c3ed6078263b611f197955fecce4b9a32e43cd1d2e5e87c4ceb65edc8853a7ee31d28e16e5adffb8ac7b760fbfc63d5f174f4d0936461dbb12c964a6b6d6cee752e5fca1ab4a9fd238dd3e8860a1d763d2019f9e7b99ed7666d4e038710f90e0093bc566987d6c0092f571376e705b342d066c54e6e2578927b92c1f0928de44e9a6e1f49b907c6aa4f605ec9c398d55df81c67373b03cc8110162fb417f96fd321048647dfcbb392455115cd912ea83351853e6a185284648842adcbd25e67174a3b93b8a64ce2ce9de0e8577b8b662ce32e2565782665dd38e5bb5fcc4fe12e4320dab7773b545a09c6d39d9dbad459f21f3e624ee6ed",
+      "sLen" : 32,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "492e60b828a9847501c7ff46a4a304ee7bf61ae87dd88cd5598c76289a70ab3afb7fa9efa3228a1e826241c13c2e120d22cd3a38a9b9ec5826a9711bdb119748e0f7080ccf917e8cb53f6f21ed19f4ffad9efd94c66e329226a811eef928816b5edb3b10d1f483b64bcad9b055dc78e99491560f59a598001e76a0bff0ddad4ebfd565495e2b523b02dc80050b64db4a200b5ca9efd8a1339d6cdff6a82dcbf769d3b0ed7ae53ea8f1788eb025e186a5eac02e3e1fb1f0aeec29b2929c7a718c32159609f973109d4a876bcecdeee6c6418df27fa46eb5cd238e274f94ab571c968b2c4a838cd812aa90e4657b95c0ccd68d60bd7d33b6e291a6a13f68e046cd41ecfc2bbe35fa9b4a0c17d89a708f89f975bf5a5eb9abc812b0c498d93d2d161f5c7969afbcf798029f3c14efc3f7c265b93fda572d265e9e116ffa9416e111aad32072f61943e9f0754f6e116ab5119ed09bbe245022b6e8bfe35dcee4a53ed375f5451c43f38f6eb55b48e386030cfb76c408c81f606886c81aacc76a999735682413069cc016f6e390ea2df7e8e74d088fb0643aebf4899ee8177a4a5faea3889181612ffdffcdb3fc699d578eba383e23e1beb68824c0bc7f920afbbea8ce7bf2b7c3bb40f33c6b7c8fb6cf73e6e2f3679669f235ddfebeeafa872918581d99c84d6dc37ff85949449d3994982d332cb9f9b8aca691651c4b63e58f6b38",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "3731df2cf46de010d06775044db5ad8c98fcb8bf2be357fd39af55a864395bd24fe7cf104374159cfff1b537bb26ecd67a0488ba7a124d8273ee0b3cee00bf94c5d34900c4ccd6e200cac6e90d97d8b4197ea78ad36be7a4fea6e1b43b1ed954c737bd6ec6960945f24308b085e255c1142c61af876995bb5736ae19ca0e1cd9b319634ff7103a4dc89eaa41c00cd173236c275c463a1cbb67f65e45b1bcc4e10c7f3456911e4f9ac4cee8b43651980dc2e8c332e5452e35f256463b96bb21799e22f4349846e8a2583763226b3278134b9313757163ce6ce0628376001fca63c535d384a6aa7cfecc29ebbb5cf6be9d2b211464e02a09c089fa63cdd9571f3fc559bd2b92b7a5a724d3b88fb4e42079add87ae188a983c11fb769d3ce65fc5aa27dc17b6914283971278a749101e38d3b92ed2817ce2b37d4dbdec14f44f2b015433cd6e5a5de6d803e95b8b8196bcc4a77ff6a8419f5c78b4dcfdae0f9f98e8ab792cdc18645a14604a604a417abcee8051aff0eab887f235b1c6143327a0db2e00a63e4c6b8e002f21c86163de68e49c766fa91ad956c12d36856cf58324d417b4898aaa6db3eac372f06ef21d7a7e86b540972dd4e3f7afae7caec8a692f31386e7b3e8b934499a945cdf556eae3010cb1ece6a08d0dea9500157e78117d0f4cdff096fba973f7c04f79bf42a54e4a82e5456f065bbe9382605c444d21cf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "2b981b661e1e244b67e1892bdab545edc9ef68b50b4572a536dd4a40f31195648b8180454faa8765ba19b7ac6a59176c1a2c621e6f4131af96beb4ea47252d7617b9d8b432b5cd900f7b328b0013364a520ce46ae66a63b7181ab60b514839ec8f6bb63ec2f83a2a142d8ce532f63ebdd3f29ce26797f46f68481818ff1e00c47df1e7e8d809737307a63902c94d9c2ee5c69f1fa0602eeedab4d7f6d0032de1a8294c117ad2aa34f1175544f2bc1d466c5965ae5796bae216cee8bf7b91f9746a97749cce0388f8f443d14317e825cba2ea278045826835dfab50091cc988fc12d4913920cd625ac321df4d89175ba3f49f89d372318bc222643ab888246f8e5ad64f227be043bec3828cea0bc0229be6e71a035dca97bfe0c2f34ce03c1ee9d084d19a6d6c301168129a6589cee1119cee84e35b561d1f658b2e4f16c2b4ac2ded8ed5757ebec2d5ed59c66f7bd932d64c58af7fc16af4d3f6bc42897114c9ec537f8b7ea86752a2a26133a7b8085f4d438ba643f7a389a1c6811c2ee4eda48060d27e6299b44c8d504d280ca56ca49c246b5c4c897d3e1d352e047f735cb7e30ce87061ef267bd9c50e7de77032a162ac9a026e684bb4d0e8131a90240494418fbe471c9900a6b322306e47915f83cdd8e525566e8a71dfc869ee5c7e74d33ac8646d7c170ff82f2f3e5d319dc61cad06235145c031d03cd420fc370adb3e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "75fbc044fe19c72f459b5a1fc4793f7893ffcc95bab8609900b3c3d3be6643a42987c167e7feb63ec2a57f961c1b9c35b11b34044e065d7d3df0b49496dd80f7cd1eb2e8c0d0b726f37e701ba62a3003a17657af55adcb0b6e86f95198ed435207663d616d516bf7222db241094849fb232bf6fbeeed7b5879a6b6c8aebc57646117220bf55403d0ff078e219ff119bd2e52e767b708b91afe30e9be348766e7537e1128087b4c9aca0281415e550965a395ab20d423330939b4e37551a7735c6df2b0395dd032266ec7dd4afaa3c477c64e3f95ee4945960b7a0c43b7a9622448eba4149e30ccaa0c234be7b06f4ebe8ef43063c62282e0643c6e483feb1942e3310bad0c05bb2f87674825fed098d5c787b69c5ba6a1f716dfa62ede3b8a01c076598b15ffa2e2be82fd1d8025f8ded14cd8fc8753ef76419e1dd561bc0310b2c7845e2744c9621735758645af0252315b6a05894c264c4587c8870e02e94813fc3a797d590a9645d92845b614b0d89cfffc0b80c5b48186ae350d877f0bc06e561770736342f00d56b2ae785891afe39cc0412337e4f5d29ff06d727f6fee8f0966d52ac146ba82a753751ad786c9d70ccd3005b11fc4f6b81517433a052c2351390332bf7fcb4326a19930b512631317c0354a81ec7c529ccd1bb2ef206d697999950a539808958d6c2be64220123f12e7aad168be35de70103090937f44",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "66381e10ca91edb043adc721883b8c005eaac4daf040379f4d69a2bd7ded69cc6e85d80a6f3ce8aad523a5d185cbb2fcebece5210feb0318065ced244ff73830cbc628d79572f7f0961c111883b9c40336d110cdd4dc4b9a04ae4a0380e8b17f0667b71b2c5bdd1c9b48c4e83694820d4cf4200051bf3101559625c0d06fd0996b759e9f4c689610e41655b262957457a4d8341c65bd89dd438025699dda37aa2d051cd3c974103aafb092e865b1397661be3eee3f95d7a75d9a2ebd74e6d2cfa54ff0d8753130eca1555eac4bea45e90a6a37d7d057ccde4c32e43c7499d5c38754ce950308fcff69d42aa4a4fa85e6d92bd20d605823e198e94af5ad65ca4c2fb919391f919aa5fe048ff51a506f63063cc5f777fa70b20cf759a0b812b2527265fc7f32a40cc275ef94ebb4a0410280ad658e67c34d581b5e7a17c5629be34ceb70ca68f40aedaa3c9b7dbcf34f30f12789909a3540512044bd812760c3f76dbc644b89760b54d9e090dd9cbab935597c55fdc6793f8ef007f732732e3d1fcc3e3ed253689aa29acfcf85847acb74a722533b0b5debfbcd0b5388f6b19e8b9ac47753f8a616ed9a7e4163ce8669437c62271bad3497edf3b655e4d1523cd8f3448c5d07c48dcfaf1e1f8310baf3d3707ea23288911fdf91d7379738ba8fee9ce525ca0b9c4c03bf1bbcd7d1369c0d2f5e0127ce2d1f95322c94d4c309f2e8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "134d55894c80eefab7744abbc9fc5cbc087072da8243236fda9df5ddedd81d23f0998061ceec59d1bd4fa2f404547056f9616f77843330bc65a2d2386574ec9198b2abcadee4139074c3208e2f09eec1e527e26b78b8773121f852bb8480e22b34c0e1cafe9bb224ce6243c46c03cfbd0fdaf28041dba177ced1a2ad70ca2f1e7dddd6cd137732f4a774e47eb59d8225d4c6a507f8f273b600a5b6449d63924b3a0cefe987cb5998dffef835dfe3a675442c90d02067c9b3ff0e3f1d84ce8801bf366e040710ad2c08c9f379bd07797ed954d3e15ef1350ffef88e9bce7174466358effd2494d7e174ae88b04e17c5ffa7b63bb6cf194d007b3ac22113fe3a1dc0c97d3853aa67c892d7d6bc5b0be6681e18004640416587452c856644ae6c07d135afae80fb80132c1faf56c5b224923cef5abe9969b807023fb84146a62e19bb6d8e5af0475e07f48b469ba3178c99741af6e57aefcb766ead4ea6cb3d172532704818fd82e12132b6329dbdc62e4c9da1fee2cb19e4f60ebfebc681a5b892afb812e82029123a7414f56f57e09731fe107f682f10a5c31fdec1d60118cc3646b0284e1948b2bd37c280135ab587960fd0769629860d17c4349271267a89c26c5f5debfdf40d843428af1010f87ab73648ac1c698898717889c38be7a06b7dfe9f63a9c7a19a77d61e3235ceaccad99cce004d6a870b27cd13414383ef4aff",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "7a7848548b15bf23e4dc1908e5b3aa8989936c498e77d587e64ebc9b335ce6f400a3965c027c6c248afcda5c80efe8d1f1bd9e71a5c459aa428a4ae1d1cef91ae48788f361dd440fb3cf745c9935664e43b81e9f860985418b61c3afe63b85cbd07e7dd3601c8ef8b7467694e3221ba4ace737c3134a8bd7f7ecd84d1382a93e5c9a6b69c9a8f12cbd612e48e5145972a1ad4f92cb0a57f44e0fde4548d231a5ee0efa8698154c66ddfd8fdbdd41d1476bb5d8852663e4b7891755ef9fa7b5d508b190d59270d32a0a7f32b1a28570a7e52592324fc461a32bde7e2cd14b04129a400274e4183cbe44aa4bea3b4680061b119a97da65c6ed4bff5f2f59193ccdfa8d021816a2b5d32ac52414d1c51f8c198f4c03e0993f8e47c268598d665c2b624cb66ff02219a9100adb3ca9674ca1b63d77d6156307efe953a489529a1701ceac83ef1134e7cc7aaa578fa4909e9c4c0220a5c882433dd3f0af1d87bede7ad979ecc9999cccaec3c4d39265efad3c39809ad3f24fed3982dc74c57ff8cf1578d940f9c6d351aff9cdaa2481d0f355054389ab2a6edb6b5455677d828453cd6aa21000adda95644125cdc6b4a4f95cb69a1abd23b46603485e696dc419cbeba767b2fa7081e1641c4b2daa44f5fb2b9a6513dd12d6f12f0f1cf7da5a74223da8dc390468e46af16583faacb7fc0ef4c095c641af4d76be03e880d4f4e2c8a3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "first byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "5629382f987048f03b158dfc15ba27891417674868a94a11b82b82fc412338086390517bc55e280e0c5b6a152c5e44eb25f9c014bf66514aea4f71f467e612b9242186276694fec3b754f30486eec2b67a81b3dd61c70e87fce5b12a75d5acb30ff35e4d94601deeabf2d5cd26d30dd9ffd4106a7247c9149fd440d2af4422b190dff1e891f842c3f5f688f10d07bc127f94c26ae506c38576a9ef93de3a9d47db28c0dc46d0e4d52093039dfbeaa7079d87623788d00c119749c9500bdfc7d980f7bb233c040990dde0800e19d428a3c239e2ebdaafd6f174212ad17a036d2ff31349e8964d5594802b924a33dab69d3d9ccb97edbbe4063bc1dfee3e9986716e2495743bbd4bcf814a45df69b18c46a40659aa6cc61522ca5e395f292e41836dbc66d15a803347b1cc098a7900ff319068acb326bd5bbdb865ca4f391c6554dc9b51ce52510531db7a70d0624869a2d2323eaa54e3b4c49becae203849108c00d6742a144b9ddd7a45132a2dc2b42ef495775c3cc9fe9312345b3f1fad6c13e0e7ba92fe8fd67924cd433739ad524561b7538863aeb16e139779036d32036487ab22e029649b89ebfb264ffde09c38a35258beb29ce46d8bd873614a1ee8e2b7d133da2a18ba14e2a72a9f83bef8332e6243f32dc25582d19fca6d88c1afa4f23837479832fc9834496bda34fefed066280e3fb73cddef8c72c5757e3417f5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "first byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "93cac00d29dcd13c59c08c017fb4d1a1fdbfdc110dd2e87386ce2357cb8623fd167c679707e89185005b185dba5458363d38435c9c49c4a1482a757c67e79c88bd715b601f10b0499423c77803180521f99fe2444d977f27e86f557612e9daced3ebe6e142ecf3ad74c32c395c3fb925493b8440aa6b3183b6283c56fa1625cfffe1b96b1f1f2a906c95e02195dde9cab260db36c31b9f5ac137c575272016d6fa33be2f0434b9462801748695a9256e4069a64104684ba9e098310ba4dc3cc2441fd8f250ca080c7d91ec08eccff15bbf7b4583fbd35d8535befce82a656a6c70a0583d30423712d557f8a1e9560977858a1e4acf0c196c2d92fcd4e9d51e9b811c38477b90928e8af3bb19bf5359003f7acbc1de019ed7b38400acd10eb766cdb3118cc374de28ec2408cf43618b970657cb3307f6081461d90bf9555ffc1df6bdc26a98d54f5bc212ae51db675e2775e997bea806139a7f4d32c75eefca768cd1eb707ac75942b4bc8faaa640555abde6907d34666b4e756bb1d7755f6af157579b82801ca06f56d2153f12000dda261661a2e1b7a1704906d629e116fd3cf1a779a7900144a75b400cd56b43f9676f54b92fd472673af88d249bc34b7b696f55eb08bfc653c428738ec08631480d0caa2eefaa865f85f14f6e61ac0078473e558fd826182bd0a3ce77dd54de5a9d78e3e4d3d46c136b2664bdb2e70d3a21",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "last byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "1590f61a82e0a6f331352230a995032ada91580ee31af5c1683b3efff9ee2c48ad5c36a0a2c65bbf5c7d579685faace7dcbe706fe82003124b94a05a27558ea8983eab69fb226f8605450bf13dc0c8dae90f8abaabcaac27fa8ccc2e06cd37cb1543c138ab80b45d715b6c504cf1a7b82554110de9bb52c7054af4eff289d00c9d56b4a6c933bd6f3c4290ffe4255aad546e5e4e71e5d5b6d882bcac33831ea6069fc2e350fe3776952a5832116c971356af3f1618aec1c466fe50ef64ee9e936acbcbb61552be9d6e1362022186249f4e6ebd8c3169e11b599f6645b11b30150155b0bb03f3b2a4dc585f504b0fa3149210435d2fb9fdac4638661725211908ae1c0540688b71b70100fd12584b19ed054d25aaa1df407f27b9d338ee5b9fa7274a29d580d0acb81c1ea182b957c22139bda8a1c7fca529a6df2089b0c3d0f03d3d1799bc186b07aa22b7bc06f69a80e423e86a239afc819232851c1a18337882835144c8b3f01e632ebc22db346304d794ee1a76dadb5a6f5193bba3b982c5bbbb7585dd7e181633dd92fe01a0994ec08d1054eefb474f45561449be7dbdae57fb1490e533014c0438f57cdcc582034a94c07cc6490794ab2164013b5f2ad5920326e83d9b3c216d3d3d2aab60b177c65b8af1db955456c992e0009eb9270a4cefc04209ac032314142e1c55b518a7b439cfab324fc9962a2c916c14cee7dc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "last byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "70c6a2593c3ce4bb4cbfbc51b41570fb966d50bb48f8e9e6cd294e99bf3f60271c71965277d8f85e280a012c5cea3f3abf9370d983728bff790d93d00813012d286fe4bd7c36274ddc47b8ad6277712f43469811b7dfd77f65839952b5edecbdaaf590be732e45253e09cd98236b16d2157ec762e7c294dccfc4db19566b1f365e91f1169329a1c04e42a3f60c0b2705fbf01dcc933e991702f3c0ff52280014f6b8aab35468619cbdb554a0c6840f4cbfee9a9381c7157efe29f9ff6c7cf32118326e6754012c1d612a8e3fc65295c48d5366a2d649eaf3544fc6b8f43f637540832c5c56e0e7a56dbcd76e32ae7efb41fdc172b01bfb389e5c5df488813a1034dc5cdab30890599cde5b0da830ec2504ebc708e1a96a8571aaec42045d701b080c193472a80886f3a68b2ab330fcac623ea99c3eefb01af168626857d6c458c0293d5d6c76e87cb7a91c3bf62901a0055634ac21688425d1601635ce0f372963e9065195e523d6657c1a10eda3a90e21817150751c7ea1682199e329e8d60b6129109378f45dca594b97d29364d1e5c9c335c7018b1eef7a65fa2741d5e6bf161376a47b0e670ac4f2edd43ad1b05e0d847c74aeda0affe496a2f554d8061242aa705c713ad2166bf81f71c03703e1d43af05455c53a5adae6714302b249b2a8fffe2f04ca1f5e39bb22afa94cf9429fe99f5359231bd93c5ed008beadcfe4",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "all bits in m_hash flipped",
+          "msg" : "313233343030",
+          "sig" : "3ed784b228ca4c6d8600fe7f18db69099881d3ac4ce0577d4e46e10adb3004f213796e9af8cd78ef116f373cd1a070569b49a4ab55f82259410269db674ea4993e7ec3ef834ce32318856142921ef33ba4bb6319ff6118dce780cac66d7a8315c12a92437f446c851c657dcc5b978d454250d3fe9513f787a9e5fe9765be6a92d2a970fab69933e56b692e2c579259105dfe3f0c54da11c21ae0f965c7f8bd15b3695171a2b838cea7085309118dba06cbf83856fcb927569760e341bc5c9dc7da5906b03f74c426b782c418f1ee50f614982f5188bf86894e30770a0b8fc7b02fca221abfbe64356e9bbcc0eb47c5700ed86474006d308ac4c1709b88774b101dfbe0d203c91edd140532878a186e6f972bd70fc7d0527b3a4337c9a715ef7f9256a1e5a06df5aa4fa6be6416143cebeb2d2bd039727325d8aab9b4fef2a31465bf8fac21d27df08db6ae22281a0615d252ce3eb8e539687ef125da304b6bbfe2518b57c95c1d81bf5574880874a49d46cd9a7fd535d9e7d04951b4c2e03ae15fc562016fd6f7b08ea5b427a78a2d8770ad98df16b94ac918edd0c4753055ba14f7d1b253bdc37f5df236d70b0e83b4bdaec9bd29c558dd708fed46daa5d4e3312c08523a0066369fefc7a2ac70ceab29a3b56928317127a558aaaded7bd6855660ea87d4defcc175255894bc9d94d5b420a24d06c4817bfc4ae92ae5ba4ce2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "s_len changed to 0",
+          "msg" : "313233343030",
+          "sig" : "924769b488c2f25bc1d2d2ac9b2934bf4a00122bc9e635e8b2dc3f5550579fd7fd9e072bd8dfeb7e8917045c7b2537b96f8fff9961115a8f8e866b35cc1444633877208bfd1410e1ac91fe62484adf7e8c0eb5885859c0757590e34f095f388320ce455e4df56cfedc7b15fb5c9d95e696207cbddfab63a71eeb9ebd4aba5c214267a6af1524716821a5a2693702e103c3f9b487235a3fd3ed9debcfa51b5c796fe2916746146c07147370ed15424fff4b07ec133a92037783626a0a48d2a3a440a611712ecc7f28d4ab146d898382a2b25df98e27e15e168ffd725c57077e86e2e88cc015217fe2ede8978e4d85acfb66cbd2fbd36936b0292fe63650ea2280f86a9d3ca427a77f4f9db69f117a0e41ff86e98caf36072322201c928c125c2f4a19358c62ef47df4a796d67d2feb9879e3a195895042a5a8028bf9e013f8b142363a1a192a2e3bc96847a515322de750fe346ef150a14e1adc7cbb6d480bc42dd06a8495c4e6ed4ea6441ad719f2edd6696da0530f54868715bb25e17d492b174b77a992e2fd997bee727a63e8cbaec87de36bb700eb4208e174e2ed437930990fc7f5e58e59706402565e52e9f207b4546514dcfd84d74348ee93e90e9bb0f4f288fca98d526ae8876779112236a5446cbaa615d8f6e45dc5c351ff45fcaa7f9e6891f09a620b2b12489d6ee3043c86c35b0992a086a271d78a37fa5ed6322",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "s_len changed to 20",
+          "msg" : "313233343030",
+          "sig" : "1db0c28280679c7279d9f4ca1b3ad582da63a80e18ab2baaec5194aa6c2435cc5f7c3ad16e9b3e8eae8a9e33a7dceef69588aa5b0b16c184ff54b60c41c687b77d849eb36295a7aa3590e30f21f2768eeab26f13135ad5353c889540906da7021ad10751876587888c25247584dd4c7e35de68d6900676872d7aa84dca74cd41390c01eadc982359766fa6cff61bd424baa7cd46fdc40a17a97df468bc200849ed315f4f53d6f24a0af0a1b51112eeeee438f48ebab9c396f4b6a0dfe6e23beac92cda74d5a762bf7591da988341a796ad7e6cd72ffb6df68b081db763a48eacfbfca7132f27979af705089cafcb774e592f92ee06fef8c9f6635480a0f84c89c2ca4a131937a93307ea76326f2c1627989c0dd0eee1b34371d78ab794543124ccc2269f67152f409532e9c1d1231d79e5d6bcfe9a153223038a1fc2df9e5c50739edfcb6e7157e0d885105b11be6e5a55a950cf48e827961c00b556c3f52554ddc9ee9b1a0e3534b724de96b1009af28a3b2d2e4359e674b76ff7bf79d9d6e52db23471c9a3d430b05e85edb469dfe566441e5bd565621006e1d1605b8fc45b2570cb06779b28283834708485438b41b478216ecb9db8ec64158159bfdf84361bb1a2839a6733db28d46f99e2bcb704b55f25cab22c7436474c68fd259e86800ed657b4a2624a1a5de45dcac39c5c2d04f08792b9a5013bff0b6da1c1c288b5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "salt is all 0",
+          "msg" : "313233343030",
+          "sig" : "64a883f439b07c8b21b4150c73cdf50f72f6ca2ef90da34bbffe5c92d37821f7e6a7a1d36904ab5d9133cb82527a72759bfa44c8923c18551129e6a6e3851fb2d4641c62e43f7c7e4c740d414dfcabeb37d40a5ce73a77810a38bdaeb134e5049b29c1486ec401f5e01aab83568cccdf7fe4825d3f56a05875177ebbfb792e5cb2aae418fde5b1e0f63a3e83d45ccc1f8549ef6de0fdcda92de90236560a514dfc520920de4f57325750e52acbd3b0bcd02ecce288e2bcd5058d40c647d9fc9e55276948f19d7d67608e444b632ea1661df452cdf3ab9fe6270db4dea4013d38c857d26685fe31ebcc3a339aecf247bd2b1d7805ceaa22a021523da3522b58cd4f1933c117bc289f20e0aea55bf92e19e824681b2a9b93c9680da90204bb69887cdd774c213368608bbd9d3fd2f567ecad17b49f15a4d55564008f1c27d4526568e34fa231ec5c5ea0023be8730b0e6eda39b4bb96069dff483c8cf303647ff17420a3d022a304be72ec108924a4c84579b38c810988551a76043cd9aa54f763077e4d2a4473b3da44ba857786c6217fd200ad7c0bd5609ad6d6c85ef5fc04a0af27e2489f367ea7f612ab825a73a1fb7b4cd9a7d45bf4cd0a72c9bc54ac81193645b14e39cd46181a79371bfcfcb9359a6656105f79c11ea7053acd4497db651f98f593d8487a2e8f2d3419945410e580c35d40771022340c4c4d6f227f91a1",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "salt is all 1",
+          "msg" : "313233343030",
+          "sig" : "8a5225fe5edbf9240c281f69cc26c89641e258b5f21f56a5f11c681c87f6f451fc07490fe6b1ed4febed4aa7c010bdc312e453a599be2b37fc2f1a079ce1868e2ee59b3e73c527819238393b8acae914ed42c9d2d7641e697ca8946d2b53879d33805fd91f56e608247f1c6744d8b8a12e02bcf7f15e2ba176995f15a6458a926b77e56c2f3557e716cb7a730812a1f6798159118d9d95b593dc45eb59ffc9cd4e636b9b8ac8d9718e0e89269291fd42cc2ba7b379cdbe8e443f283b7517ee5a915ba61cdfaecc9203450d70db365588043cf777fe92e0aaad484cac58ab1ea442a2ae62f5dafb2718112eab650d36743a9735621a18b7aa5dbd9d2d5122afdc3b8ff49d91ee79af3743a0010bb8e88b6fc766b98425e2660af1b38cef8b7ce5b9f3432a7358fbb07f20c9295a5eeed04a586bf04f5f9e8b3425a7d0307b496848da8738cbc267052d7a679c95e799205b4f7c00d9cc668c40cbd6368294402e26bbadb9690a99945d8fab81c5d178d72ce38b0b47b24043b27404690af103b7240595134faef4788a6106234f40e2cdf06089fb602198562b18ecd03ccc58d3e98173a9093eea3b315cd9349a010af282f3c485f92c0fabfb774d6127204a254809585c4890622d98659752276db7a890dd0cd4a6632004651bb194b056ca446c85cee7328e80da15c16c960f514dbe8fb9cc114330a160adee4cd449cc1524",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "byte 0 in zero padding modified",
+          "msg" : "313233343030",
+          "sig" : "2f50dbd395abc6fd0231b9bb6103018534b39c4d60d139615cf1c9271185c5d3988e99735c9fbbb649e3cfb629d73fa9e1249180606f8e8621f3f5033e5cf7f67f4abea48b53eeb5be67031cb6afce1b26538ca318650b87317f6129f9792f3cec4e98a56f2d7504999ac1fe46729fb390448e5353b999a52044d2baa92f2ff664ab5a4ed82911c5c9942a3741fced99b9437b102db72fa5d1fa87929887a2e61ab06dbb6b8a39659f41f3ae07061792ccf88802a6b17aec1da1c35bd85da150dbf11b3401109e43261a0ff2b22cce779b19b5f2925b55cf143743600ac4c7dcfae7a17970da3d52d74ebab46744e214d22da8d1aa8021c8b47d6e2c585535025c19335668e2d851d6881a594d03852b45aca4fb10f9e85f053a0ca532c40cc0537518baf7fa388c2c0743cfd6355dde1382cf2c9ce1f418be20aa0f3be147d0c9c8756e2c23797fe9f3365aef876e793f3636608b6221460cb76863590b3f5f56f6a5cc0b0ec4d56b40776d629eb32c7e1838aeff1d3c3761edeb91bf62682f7502dc685e29ff1f678e287efbfd364ff98088f42ef58ef2a50415531c1021a13c96c080f62842167239cda8209ee3641da51f3711f0b665cc88a278dbe2619200e50037577c9adf0d78be3879cc1a362f673ccc3e03bf9a39f4bdc10d7f044101a02a83ef7b63784f002565c06eecc819483433bdfeb20b5f91185be6adf22b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "byte 7 in zero padding modified",
+          "msg" : "313233343030",
+          "sig" : "0898add7b127d3f46c4eefd56fd293c166e7b601caa0584059c62211f3c063b9a479f7f9361a1ba96a6a640f9c3c12b18820e6da9c9bd01a6062ca722d0abdd5a9031ec328ca8729e84079ea4133b4b4cea8ccca9e1f9b6a53fa8486ca20390a92dd5945790c371eca5c0958247344334891b12b53baa4b7df2e15307cc58420958a4a8cc8bfb06180174ea8228ad46f98725981a2a338d54745ece14b65f38bdc5c6bd87c3b2d81648b47a89afadaafd51bd9250debb9351f654a47708332411234df725ecdd0ba3ab778560689932559f9fe94d937fbe12126025f3d1464f7e5081c9f8b7f7a422cfc3584ca98b5f0277e97ce9229aeb208892f5c564157267fe59d5cecdde948647dfe7dae62ce6f39419dfa80d4d9336f874395a7f4f2099bf54227ed933ce9705efd1704f9a9469c781fbdfe8df12b13a15f802d309abb0c6560635a22e49856ede3c2a5271a656a76a059fead975ea077c4e632b9f13b8b3950f2b00c3834d63750098e792b824e54d53d6dc102a4c7de5b449d083436b7714f99928969c3499104efe30110366abbf71c6f8e4f069be0d246c2ef417e84fbe075d48aa65d82590c3ce862c518de635f8c6ac009288aba112de47c117fc47be80fd79f39e9831239c34cfa9bb54a07ca67ef318fe6efd6bb6f0049fe255846a474cbe28bf73099e948c91b0de01a9f60b80f21ac8f5601ec36f12e06da",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "all bytes in zero padding modified",
+          "msg" : "313233343030",
+          "sig" : "2daac886b4fdbf32ed9f9e66f1abd5af7266025d168620b051dccea674662e1a347ffc519345ec8d40d0dbb4a5d60317632b5d504a2dd56e89aad4438d2b824ead94b87bfa918ece96c3639fb1edb6139bec5c4d3366588992f26ddb39f6d504eb24b90580e475da022c125b6ca3f34251211c40c3e2ce95f9dfe051f728eab654d95a7ea5aa37c84ce0c2c3abe551e469e1ea3fb94b33b5c3cae230aca4a13d09fa6925e7603e2db91a17ea0a8ec77372c4425542bee8b8a5de029715f62a1992c78ee2b06dce17dd57796d48e3789e7f511bf85c15366d504c8266bae2357630e5c70985622dd85bdb6d04131ecb639c34295c49b47c325018247a154afd1674189ae2708ad2ba5c13135cb27d0e5694e058c9d36977fbe36f39aa8ef0f99a7b59a9af3bf3ef737c36d6e8f137faa38bddc62fdb1f1c6ca292cf606a41cb32253804f14a12e66a9851697268b8e619556cd00f6abd55b61d7b4d4a9ec8a7fc3ade79f96e47a2b376c881b96f0279d0cecb634c4031910edaebe92201d144d65f450357313fad99bf10183cca7cc6fdf52382a280d71c0b54a846ad7fcb2e62f569371ca403e60d8611a77ff4392c1da2a0792bfc835b161f407e5c279cc705483fa94db072b9023407f1bb1de67cfd57b08f6c5094eb2754ae1581a8471766c1585c1afef365e492c380b7e64722b6beab3c1e367b9d615a33fa1c13733731",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "first byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "707ba25d4bd3b92daeb91154e68d056f31857c57610f808429bc5f0c0e4b52e079ce2628f78c9b0ed061764cfb9c937164b70ab7274093598a7425d5e67a48c945ab8be4e7138d88eb5f0486c35986c805212366c2a9e775533e7ce71b1c35b4bde53e779ccf31d31fcf278744bc7507969532a8fb32c1073ee31e7277d9a6111450fc65c60afa0632f84fd2e8fad4d201c1dbf7b9ad97de8a8977415a70f3946a17dfd2e4895199775d6ff45d4785ec78bb5c54e26df4dff47b81d88fe70c2d2ee5e8bf83f507b6a4b8d747288e9073fdcdccc972534c1b51638b0f653a4f6a2e22b1393744e978a41856e6753f5460dacc485160d480d4d5bc5eec5ec3eee1e2575e2cfd10856701425c4de05966b0a6e86c9545455f6f62e9313022a60b4d34496db4f94fabf9e3a40be0cd77a15248fc2173a5ea65fe0b992528e0cd8a7ab2e911386c5b64d84c0cd0428fc2940d78e8f75c9e3ffee83b4328561760da96f7b015c2700ac6ffabcdd67a0d5e07db92cb8ecbe4842ad8aa0ebc3a1256ed03e0c3e8f67f51dc70cee8447adb7112ad7791dafe3d1319dba8c3e63a9837c15e3af11b0cf5942a8ef2750bd218ef7c266a756627b23b0861df5fc9cb240d49290aa9eedca74ea69cc8640ff746731fa916eaae176b492f5031105e38490aac5eb46df185f9d6e5f8603991158cc4c43744b03dc897fbbeeec00eeab8c7310051",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "first byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "5acb1b66dbdc180df233c83a3b6291477a9d8b4fb7f0253d928545739b1c517defba99a546e291c23d1e925caf1aa51b462c689d070ae413fe1d88cb7978b01a28ce7ebf2f5f97df648a7d819dd028a53b1d604ac9edc62f62655a56642d087344e52083073ac02fe9b8ef7e61f7476d59c78a66d4ee07932652997bd756b24ce441f539e4c7bb3786f1e4676d7e4bb3ba8a83701cacb2663fee71448ff2124a8cc19e15924404bd0e5f56a7dcc5fdab8146d947010a44711c80409fe6b12297acac7b79943c8de00d15fc1f1ecdf9b0528b3004fbfde8fcb7f082378d97354107e47c48a1e3c0499ad6371480e88fd164deeaa3a014b18760074cc96013b86ec31bd967ddd41900cb9c2f3bf5704754a357124dc536af4305d58c8c88ae214ef3ddb53ef10a2c6211d55a3cbb277efd6be1b36d6a8ab997679399aa7f21444638902fd34d152f8ec2eda7467018c0546cb54233a62fa4b9184813b9d46a034b3d7a7f8f01bccb8a5b364badb94d688302598fa393ee8cf6e2179345b1e5d866e2bb5954bfd9d192ac73374ec4cbc6c1478cd042e4ef270fbfcaad8987b0e4e1c696bec8b1ebaed124a0b58c79fd9fae00e19feaa82d52dce97baecf82b5338a67fb536417ee2d0b8584a998486c770f26b8a58c8856439065b3a4b81627000a01e64daef83b146cdc7357833d447a4ff161d63200457c6721d6dbafc687887a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "last byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "8172c8d2dc7f58d3905698c0e814054a8d780d154d14b9d05d96fe0416e6ad01ef540a95920cbb3b3460e4b3bdefa26134a62e09432d0047e67c680cb7edfbdd65eae2f2a15a84d97886b0e3c46ab9fbbce611145b83aa313fd03ff001ec07b4a6f814f848cedcbf69669e03641210fd5636b889079343de0989031e37ee25057aa0bb2a793feff540f1d6532420a64ef3f620a0070d2c98e7182cf7265e8fe8909b8e2b4cdb2dd20fc0c1db0535d489d37f48d31b3727eec9e171b6467d63124d1663c99c019af340777e6f4b43bff7b50f3ff456bbe6a9938ce5e59f8497be33cf7e9306daa643b5bdb933318fc950f69d309989a262442584a877f114e31de926de13e1e18653deea56a0b5d4d825456e3bbb30debd83aca1c535aa8ac8553da85571ce4ab6e04d2eb292f8e5fea7649529e29c71420ba191c97c24fd9a8662331c7949a4669d2426e76a259b9ad5033109be2dbac49a5d13177162f06d5b6ffe55a98c27c859a43f918ae9b586b18c439f3c418cefcbac8f38af9f8be8fbec886899f754a50f319ea8d09ea8a3d12a658e05e62a43555e241314e246d9421022fd8c8fbfe76d3e26ef17fe84c79664f567edf8fcf6aa43769282d33a85e89832a4e81300c7f156d0030832c3f0cd5ba91c7b6f2e13d2a91a9732b69d32a58ef2773a9a74beb5fd53ad7b479443a6527022a367710428a1635592d90e11a2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "last byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "7bf03228ed95a2af0101321c3db174eb1f597c999c22224812ded57643cc1fb9d9de3ce9085dc60d9f1d40696f0e4c1c721cb247ab1fd2d1804180e5f51b3f8de75c489971e7e7098765e4f991ca5212426e771037a301af1c7ecd95a5ccd8367e2f6e84b63799119c7d0d5dde55e6567fca990c11bffdb9517cbf6726dc36d19a97641dc3ee44e568ef4297c7f96f3fcf480a87312448105a6671778abf9ef6d8c9ab289368560e2373f54c3e313b2d1db35501389131d1947fd7dc49570bccba2167ae4610a0229629da730d8d8d8218c5a586c5095b61fb600563ef660cf48dbae491e91bc07ea96d1575fb26e9802888fedb07a68268d9d76fea5f3429c96fe17f2f0678703871835788ccb733d40009c8be0b3242ca11f7153a4d906f230d56374201902167872d6322470d53e660d5cb4b65a2ac69b6bf6095722540312980aa2adc3d8d3336a8f4205e2e016587772117de6a357c20dce834cd8aa7d31c4444a235683b782e473ab60404e6ef8400ace3b8d48b6a7801c99ff1f405e888257993848f71e81287292790e1b011cd410e3e3acf31f280ab36ddafb0a3e1772690d053f077ed980c596d81d2628e47abbc3019d5277c70db5f4838581db0e572a2bb0187d08b488f2dac22a0358cf77e0e36b17b17664a925eac940d15cd9424e92f489a4d28405ed76507625504fdf489702f089de36a4300373a833022",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "all bytes of h replaced by 0",
+          "msg" : "313233343030",
+          "sig" : "83a5b64effb15f9f46303e81ca509581874881b71b8e1ca08205b22f383e722e89666c2043a5c77362ce6509816d8cc7df36040eced3b7b1a8df22a2efed801dc4dedcfddae40f20c79bc0f8d64c336099f1773a7b32fc484ef01ab770dca03e071815651998bdb4b8ea11255480e63be22de376359c37b3019d6e264e1f7121de2e7f67d2cf98af80c1c4042b8c05bc79877de903740ee6d1889f2814ba9bfbadd6a5ebbe09de94e16fdcde8ca8af9933080124fa2ffc1e4338d1d878fd4c55dbbdb273e617dcdaaa76aaa19542274ca74fdceb0cfcda21547674b2c0ee936e955e8dc4aa366fc9f3f6c202a0a3982220ea8384ef52f8081823679e60095fdb84d6d75a63a563f726f5ec833633ecf35d27a9e3b7ee4a94133b1c5a15a6dda4a3f1957c399045ca096b4be079523d9f558031529e9173e7cf612262e5c9599bbbc2d94ef12301e23f9b2cd173364cafd6a3e3afb7582f282eeb4b2a1c17698bde6b6a82e88624e3d1737071b8c1fc6b5d77ced9b78f0c9aaffd78fea3bd8822288e0bb761092244df57ca49e32ee8213ee0acda5bf8fb91bcc3409ebef6c310f17d9784689e7c79ff33c9bc317921b416c08030c4bd02629061dffff19844d867f9a06ed0a8c1631bf2a55ec418a6003a6b5fde0d0ff223c8e689e93146771a2cb74ca271116af99c68605d9690ceaf833ef898a234dc0b70c684ee1c638152",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "all bits of h replaced by 1s",
+          "msg" : "313233343030",
+          "sig" : "73342b3c90d9fb6a7671295d7c258b80bf907ac32b1cca59db942b80671478c42aa2214a03e4d7d7b645ee333d642dd19acc5b4eba7b50c10688b8044b6c9b765a8124414610b97b84e0fde8876360a53396587eb973ae69e2ab1899ce030aa29d2e83d9206d4a26b384dc32ff02508169b65ebb6fa5f52eb4c24ce41b5e467178b94198fa399b82e2c75055c1417d001ee9d643f9f6cd1da5a566578f1a2af94f7e3901dff3f1f4af10acbe6aec703457b7ed27ff17a77955fbbd527cc7897fa2375cee83d89ec509130c644f8179df5e0537d8ea63b8b29b734227f74062b43334065d4092a30f609acf594d917994ae9e9b256325f47867beea84e036c4f8b117b366b016fbdf66352c5dc6f95750ceb121ea45d4802aacba9b7c7d79bf2604a866d7af58a2f13671eddb7539c2fba46e094e92c129006552ac376d216bd0c91ce45c365b811303dffd2082a1213487090ff3952adc4551a2787ab0d52180d0d016990f243720cbe55f2c0d68465e9be883bfe90ba55d28beae531a2b6924c47fa7ff4222b4f20a2403657f3df30e423875871398ac26fad9776cf8cbbc3cebd735185c1519cf9956c457b2b7a3b8199979f2a0cd0922b391fe3ba9892980bc3ac260d789c36de616fffd525097b358875bb02f27ba2e23c8fedf0aa5635d6179eaaafca58c68ef2438be5ff9a8b5fd91972389d2aac7a72ccb6fffbbe39f",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "all bits in hash h flipped",
+          "msg" : "313233343030",
+          "sig" : "545e9cec19e99d88ffef7d4c655d2f9b43f3c1516d04c034c4ec8f1169bd29b4faac01073bf2c46a6225ccb2347be24d1d185a8036b1f6cfdd32529c7f1ebbab7e183dbc69b761f8ccbe4ace536807c656dba7fc2ad315e7ede291c870e9029d005f7576c34319c1f1cc5a229abf2a1dec3fee015d60c3a577b1f1408e03db21029cca296c0bfc2955caed97cc18c8faef4ecc03f4acbc8fb6790e7a8d0b919a268b242f58eeab9933e0bdbd6e186faf94a16445fb346a341a19c2242e2aa922480e3ab05b96577fe69cb6070c62605e9be171625f0fba269e72910914aabfe0e953d14415c65cb008528bd73bdffd1b7ed09ef613b905b981cc7e72ae48429ce545c5699440037b66cbf640ee711c67f3fa7b7f3061d7323cbf7ca8fd5391ec929c8f33d51cba12db45cabc2597db12d73f5394ab6a7f3bae6b828a07b4240f887b246926cd315cdbbe3af8e27722f02ec8a4468c5980819b5dc9ef9b3240ba4ad0a2f1421b4efc5b9960b89baa5427ef5855d0e4aad5ae99b864b4b7cf85be717de8a8fd602af962eedd1dbe123a3c6b638468448764c034b64c94da5b494551be3e3b7bbfe521bd28f422ae66c89099578c7e16abe414fe8aacc104b89c713aa55db5a27758c0f3b4a8513f89e0a0c2b777a21410a12249dd344fad4fef8db7acbf2f5ef7accde3cc6800cec47d376debbceda46c80605c0eaa41d70688d3",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "first byte of ps modified",
+          "msg" : "313233343030",
+          "sig" : "0e7e3862a2fb354a36843c872c8175c7feba440f5af01cb2080edca8d8df6d66caae40771fe11d3ea7af1c5c3a0a0044818ac2bc1bb764a547f3c3ddde8503330f324adcf962755b8708275056f1a38828376c72c8cfcb115834203654838754747bb1e3d8fb9b542094267f26a37a4e9eac48d277d7cf03b06d8e5636fc75167573fc858fd095409c9bf8f1039d145e4a7dc03f0bd6560c515f06b2a15f14eaad2a39d6e1bc588b082d2da518735ca6843a0e974becaf8e21234d91ccd18aa9ab068bcf5eedda08c4d371ce23ea02ff86541527522e222d260ba481c3660bd5ee6e19cb9b86747463e0ed2a628393e0a321adb6d5ffae8612a5c53fec44ae4a432b01062370ebde52c0738342025ae7333bb710982702f6b4b5b9b22ddab02691000dd83816f3a5adca44fe6175cb24eaeea38d577450624300da57cbfe90366664391662a97906badf4a0bb67a7bca1bc8f4bdd133f969a89c21a9387a1243227f5d67e2486d4f0d1bba97c440c6d1cbdbfe73a23de51f857986e5fba7db761faecc98b9364687d56403c983689e59e5f1547fb4bc18045ceefdba22965edf816a8b7bd7a96b1290080875ce0f3964002b0f1c3453249e96e1239035bb8778a772c9289d9a645b81232831b507e23d34a0d1e2f35595de73d70e74f4c9f4e4213a1d19e9e73c4f22d211eaade00366e46b35ec004df6747a1e9eb6fe04e13e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "last byte of ps modified",
+          "msg" : "313233343030",
+          "sig" : "875ae0615590e5f07fe62b22bd19fa2b91a6fca64d786e1df778015e4642726eb6cd16a57e9a3baa814bde45f74ef5966fc8cec5e519ae52522e0d5467b5c3b1fc9840c1d39b1059efb52dc15dd90cbf8d602c663d30c84709b6cf87c5652305573654fe88f41e40f5918ffd097c3158f98a7dfbbda35904f3e0af6612c9a3564f7d6a2be617f737715913218dafd34339ac56bb5f3ec68dea257d3ed3bc19355d9c96e8045cb5399aac6ac0414e88ff0e1dc1114d226e0778d3679e123c52d6fc8a1e67bc212c03e57b3e0a9a5224687785a597d21c504ceffe7a8fb20fdfed9e229a36081e0699e42ec1bfee8d8fa3718f6a557877f789c51e0ecf38cc430c56d2ff28a4e94130289d7bdd49cbe1e01b9382631bcc8fe81434f14fc1b85f1d19e830d4aa733e7a9f3b7f5e95725cd4610d15d1b6838db89a0f3ec5418c687c2ae0c834729ec16c29b9929f48c15f9d7467413191e965eb15693b26f2a099d47749ee86f061d636f341cb64c8b102bb9ff21f0f1fba81ad86657a1c5228f56174714cbd4023bee481dbace94e2fb9fc59c79428395ec877fb7092af1c6d1b877c967758b6945e7b30c0205be731c755f7bd221f2e5eaaf729790c39281d9ed7e63b2d18d5ff62aa4081f5df5e084d901b4c0f0ed1aa1eba177f65689015f63d61d9aa777385dc85136216645c85f2c77b88e399eee1f298fcecbd3111085a5a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "all bytes of ps changed to 0xff",
+          "msg" : "313233343030",
+          "sig" : "94f9d111adc41e6dc4625bcded3f556a1cb7407456e252e6fc1d873afcb7ca79beb18a2d738dd105dd0a7e54fa969c99d450d112dd2569f1417e15d6f393d3e74b849797972e454fa3ad220f5546cf1f60180d6d70b751e28395348da109afc94e698eb51312abde98c409c751524a6be4862e3cd2dbaf126ec26c76381bc8e8e519944f04e645b904a8685b4cced79d158ab48545164c58ba1c8c662e75a0cbb9f5e360b6ea8b7acfa977efe49d634c10505fe355d57aeecae808977a3e80c8c1a295c293d696871083630c6f3280045e6eac582481ba74d0d637882aefd15e30fdaf2743b415cb74ea97eb92250adda2a514d41bcdebbf8302713f5d0d56b4b9b1b34222041bf5f4f5d64556523610a50652b52d89c8db18a2b567431c93fadcd72ef81b40e958c131d16f56d83d27c95f1041bd03b7e8771540e7c62373da66b761e46b2aeec8198dd38dd7074dd51f66c2398993da738a51b71fac106c1c7000791cecd96d168a5bbf8eb097dd0011d22a5b7e489f2350bf2d698466aee3b7570c3e6659d294c5e4fcbc2a4b46288d067f475a54c1132fb432154d89ee845e43bdd90869ec6a802320eb09dcc455a0c08ca72e0a79a82aadfa8ce79e3d21329f0f71a72b184c361390a7978f199e5acf55aa5a7b1bf13962882c7fb62f519eae6139b74ff5043ede0d65c6ac6af7f2680bfac13b0e27ef6fceb81e45928a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "all bytes of ps changed to 0x80",
+          "msg" : "313233343030",
+          "sig" : "50d81c073d09499d0b73a7511572cd485e2779e0b2309172a43847b9001c52582b75394ca438c4e358946232ef17596d4cff47dcfcf40661afa1d3c3d41a93ce9d2f681622acc2e4e4f273f9e1c5cc23b53c8c89ffe20e1827bea29fdc713ac1dc769df3578a14372d05e0d94ae44ebcd22d4ffa6c9276d22f8def3bd65bfff593ce2477685cc1a2d051656b91233933a9b107940abc716d12a5b3ec939ecbbab7a2785ca4be41e70a99f60a013d04a6b237799d8f1743ada6d5a97193d5b30ada75f57e540a64085d67b0b28d2d3618d52d2da4857d8aec6b05982d07ef918ee82db17182ebdac2d59de4452a2f43c769390c429dac2a34d65670e433c6e00afacd4664aa99b78dba1a1a39ae1a3ea6ddf067debec393046fe544ba9188904178c3b9358dd355fc2a788695b2dd2ab867f1452f9cabf2bd52031703b7e2a6d00daad2cc21bdebe9c3b45f9f164a1e3918998f044e18bbda1b7b01ba732395398db4d50e61085f42944d0b86c09b91e5470ff37e42f299a92d3a38b6b8e98a4dd1b1a8d979aa8a2754aeca22449e08647c09554739c1eb0c359157e87ec35be8fb44aaca5515ec5bda2bc861c08adca65c73a0f944a29db90081560789fa05a2f42a7c0dd8eb199e8efe3c9548cc4a269b0767a830b7fb181346876b3a8f0c9385885bf69b1ec388b93c4ba7aac60fde8bd4e4c9ea44c22fac2de7331df3d5fd",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "ps followed by 0",
+          "msg" : "313233343030",
+          "sig" : "7bd56fe8be48062f611a16d070328829b6e032650e54148551ebfae0c221dbdaa461fc0b837b41db093fd3e7eee34f6ea975b7e7c6a9c65c9da26b8b47a34d4f85cbb76f7f75f0010375c10301e6c656bb990919855bc3941f04817de84b225bc68a53310a2d12c522732c98a435ff2ed2deef13e6c22b92f1518c01d7a46fcdd650030017aa0d55b53256645d15b022bde6494dff48e348bf243b48acb6d5866b01c133c8d0fddbc5d50b1d41fb37d34b3ee76bdbee3be46e9893a64e3571590698444d9eee18308be2a61bf6e28191f052550c82fc600de6e01c8637d7e175399fb8b87aea136d002b589b7372d0476059c153525e63a90d0aedd48f2a59621ced9e6852c9644ecc1a60181b1cacf6adaf549a47b1825973c4d2926a911db41ba10eb244a45d582b9acf30861c284b72bc6ed4ddbfc4df7f96a2b6e4f962e4c8ebf27c35bac4cfd2ae63c1e335ab5049c3bc5e606a65b5155709b9bb30d5e10eeb895232bda1465443e19b356ac9187d5799e62e778710820ca4fd2802ba8c52cdad0bd12d8adda85ec480329e927a6ed41a8c31dd35b1444660f2f643204c4864590014c8fe35db260990fc731f1599bbe223a3d2f6613d393444eb6003cf53431db39691318a1435807b921be34e518bf2ceb99be38d607174a96e8cdef1f49a144c71584b45da1e5277f2ce4e0762c8f5bb8e48e4b01579de204cb80324",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "ps followed by 0xff",
+          "msg" : "313233343030",
+          "sig" : "1f20dc348e8b89ed3004b194c0bb635e27c643f70967d65b0f5d2d4ba55ec2e48d62074a49de2a73a34e5e4c0d172ab24bcb1025008c7d473c90b64f9d6991f3612deab90b0b535b11400c4a11261941ec9ff3738ec48cd6f0237757b26176ec2339e8bf2b4560abfe1a183683f9efc70876ac821d1874079d610a1f7c7ef80bf39f1ec1fa212136114438b422e4dfe65e8fb48f5cbe475715a67f8937ae7dc3ac913bde054cdd1636ee70d98233cf5f0645fd57a38da90428bf7511cd855431d2a2a5419d75c2199d338fdb60deb5617716f2ca73daaf02260deb1cda509ee0eaf457dae4c9f439ac00323c873bd6dd65cede625d3ae25568772823f402c5b354befe236edcbf956b700570c87eeb05568e0a50ee60d30cbb5b57c6c2dfd805126d1aaec535e01c81d62776e4b19c76dd412f622e8aadf9fcf3d78b34fb6016a550bcd72d1709b5b7308f74ad3c37fe0bbf4c707229c7f40282f09eee4be13ec48bf2f84b32d4886d0946dafbd0422fa49b1971b694b7dc55f7b4d059403df37155fefb9967b45db2bd801d9012b1cf0e2fd9b7a073868756d64cddd630a43a9447853b4214b06bd6bb4ccaca1d6bc01e79e328ed68ee4a6b54fba5b47521a2dee8d6425306e339356f97f3b19d7bf822016940559c1685ae93f7be27eb3e9fb49d7b08b0d5960a68524e60cc7561c7e61ec6049362aa484fba37902ad026dc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "shifted salt",
+          "msg" : "313233343030",
+          "sig" : "1e7a63b1ad5c1b708c49031647934fbbfa2edc1185b1096326c8430bf94b4ab4f0e9401a68f94cd6fbe2d23623210723e800ed878c9fb417ec64bd3f38f3f08bae77352a7d409485a83dacc9a79ee25526af32d93b3c702cef4f37bfdc7b295b7d243accb80c256c9ea350120ab7fa5ab047229e9776ef157b26212e748176be885752308720b16664323f65d83ce70de21d4e2e7d5a633784e9d18f58be6469970b52c009639ab9e2b024cedac4553f88e42d8012e8172be9fd4dbd3bea1887f065526e090c3a5e7f28b416785a0fd33c92937383f0570720aa6dab92ad7f006ba8b17c4890864313ed0312c717a2a5906a8f101b7c2775d9609d26e76e274728b03169d94723919e2ae5126caa2b6dd1a443d21d4e36512d06c8b5852dafbea73b042e1a999ff7147c49ef19eb7f41cd31794cfa5f65d9d0fe626d08b6257dd88bf0cc39113d0c0d7412ec7020bdd5dfa7e9f535f4f2799a06d4743c5769c5c85229ba5d0dc39b027df702c6fcbe728887b0fc0b606480d3c0e0f1326a46a7223e3124dd4d27cdcc48c7ecbf7440967c2e57319effe5e416de26e60b995ad9358ce8b863f35d56f69ebf6a6d6c0eec94c917a90316db70e7f105d171700a17c52c4a1f9e15a5274cd96ca4e872c577f43b54cff898af42720f0d3ad00d170f9c0bc35fdf297046f6c750b6d036905fdeca127e6f2da3f5add9ccf7ad819f2e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "62a746655abd3d4963eedbf1ccb42adfd9919f42797c65d833ffc5c5177483534b2b46b6773d7b6b9f6a1a03803a2c85718045caa8995d0eef3d55c66491ed65aca09dab89ae1541245c2edef535f8ceadf4f74f1ae12ba9e922508b7bb157b38247441863aad682200e4da61b4b3c7292cb824158275d042858d15fb7ec4eb5aeb33dcd40f58a670110fa939ddecbcc9c20216b6996a43a3267b501a2d6f05c35a63befad8f6534b71448027183e45abd98dae878379807eb97aad9014a268b2d042bfa20b3559565b22def87bb0beceefcaae1a01f068ced30414501767fef2373fd8d8ae7d44aeee885462dd1cd2136e114a9e63085eba22addc0ade5887776eea10b594da2abcb245a03039fa151aeda0364fc66a12a15dfe89ad7678230194600554679e0c02d3c35bb2af054e2bd68e73fdc66540257cc10a0c0145fd17793f0c88d76670cbc62e0a56b98d82fe1f5ec8a85c0075763e1d3d873deb0fa57f127052971af34122b9bedc760b2e441939c33bf18fd9d49e2def61dfb3aac87eaa480a348bf32bdee4e7303d513203fe23165f39231b64baa0bb1495a868e20a4dc3dcdb4c643646c23bb1ce0a4088907ebedb6fe13938156f9811affe8288e13db8f45705229a31fda7476ff07bf6069ef11c0e19b369f53e99ea901ac8d4a1ba8cf92d74009583e00783add48b6f7cd7d28429bc48c73b47539630b59bf",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "leading bits of masked_bd not cleared",
+          "msg" : "313233343030",
+          "sig" : "2f04e32e17a9a6991733913475f54cb18abe5cd6f7856a8cf12525f7a83127c20255149565983719e58b10c23fa70a27b40d723370bfdd14bad670b5a22b3446ed1473e8f012e5bfe70a1fdc1a7d826430e301405db72c815763e4c5486938de8f78b556648108eaeefb6d5a4520da365cf64ac69d2f0d2842b5650da2d06639032c4f90907a3164f67e0abc68a4bb86778d6f0c6f8c1585b76a73573deccb7010d21e959fc9189aee02458b8e353f12a3d98ccb6bac5e3a57ffe5b60af37b043fb58cc478ca9e249e94a30bfee4c509e150a3e28e56dc4222f9968ca8c62ccf57326a473b30055655654d3e700ea04756bc3f687707e0dafb9531706d06c30aa171e33550b66055adee33910aef573af9dd06b2611425d9d4820807c12f7b29a7fcd98c3948d5352e3fa8083205e13f075eed4e6442c0e3dcf68c765ed93748cfe33d758fee0e47a1977d0b79a755e731be22bb0c55cad80d54939b7a8dbd4c9c20b7369f907bbc2a540fae0189ab09fe62bb8defb479a913f3ebd167abbeb35104b2e3a75504b5eb58a1e34c991254e7b9115dc6fc0946e4d38e2c475199ba283be6b222cdd0a90ef0cf9ec98a3cf815e4d9ee23e3708b6ddaaadd146a802a53b57beee909528452d70170b8aaf40ca92fd5c3f5a7e87e93f30ee89881c7368c0cad47732e9b58f13e2d4873b596005e6344c6f030c9ed75bd65f273baa67d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "first byte of masked_db changed to 0",
+          "msg" : "313233343030",
+          "sig" : "856a35de0779d33d013b7f7bf55de6612b8cb179058d490a4eed4acd8c213902d25b4eb5026c85b60e77773d3ae3570d037a087987267eb9432aa434ddf8b96379753d5d77b842b468af926b87a37b93ba313a6b0b0a5fc0028d68e569fb70c7bc5d29d4353c661fb1cb5e60340998d69ae7ff80ef5bc617207eb5648080265610b56d7b1037ae271e6e76f36b2ddf6d7ba35cb6430b21740ca0efd45d232600842acb225179af8765cddc356308ef617e130edee940e07c964517972ca94458e38f04375de2ca2c1de672f7885244ac95f883fa297d7e31f20b890a7d91758f57e9430c29a021ff5d94281ba0e7932ddcf031f0825881d3607cd3acc5ed14e517b61d2014c9d2ca6cb51e7da4ebe14341eea4c84d9b0b3fa11f9c9f6423bd414c8710cc82ec788f09c40634c3551ca6751af5e9fc966c687e170c5bd4358a4a34a8eac48f7357b2061d0610830bb7c8fdb59e5b9b55005a0cac3ecd3d6992971e64017a0d436406019d1d5fc3726c9c4cc811ed19d10114f61dceea8196b5b3c4015de1d761f4500b5182338a7ec0ba9369b44173ed699fd2ccdbd69f60b80b4c4e730f9793a2cb2c2b2d95a5156940162aff6fd8fe6dc0eeff643cec3fc5f75a9f516b0c422ec3938f4caf76fa09ec797b6088920e910d3d5d8df0abbc6bf78fff486c266540d74f9f55ba6aed8d21b71af65618fa15b94051b096b33a8066",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "last byte in em modified",
+          "msg" : "313233343030",
+          "sig" : "6df0234e29b09c68529dc6e379485376e89da42727fc88a547560ede5c518af124882f393e10fea33f680e1e5aabc51158c9b026a454c152fe4af301f40033693006ec509892850bb0b569b2907f7afa8864a9895752c47838615cf0f15e0b139bf83127bbce69f6abd6356b7bc52b30e9a58422ab4ad68fc2c812b6554f64e5c158027fecbaed30f48e90bf005cc6f0953ea845922d847f30dcae5a9b1e00f3ecdb139a0f38baa31a9404e816a9fb8f13686adbebfee71985ab41de8e0bc714bea3270205bcf16d5b7e8b42cd6332ebce2aa3d9501d30af6dc66c5ad19ed759567d16f0a391839e721e7d04c5c7d23df660fb18cd1e8982b2ed6860bb1700c3abdcfa8853ae187cf32695db4252f22503ea039996ed3877b93bbf413e27990deeefea7253a0ac23da6408923617f1263bce559ba3efa1bce8164ddd282ec5c115ccfef85493abb23c1490f134a63eb683ab16fb952854b40bce433d97d98f0348aa658ae3bdec9f0dfdcd25cecf11a1796726069132726e25b9a9c6278bc010f673b49cf89689cd2de943b94125e5a7b463bdcfb4b4ed7b52ae32f71cb0ae2f0ddcfa6637871fc64d254f1ab763b76cd7f93017759c9c73656a908cf0c687eaf6eedb0e510f3592be48a814ed7a9b387da754b8161f1cfcc2bd9f7bed8391484c98d542f5bab86af285a646965aaef05387153b51c7a915fd1213a6eb789859",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "last byte in em modified",
+          "msg" : "313233343030",
+          "sig" : "31e7df11d14b2fa289e45ca2cb36d568aa4470b5c6aa0d4bc0c10a1876146b876ff953e582b224adad6358998efc738631e44a34e2c1718f9d28f695d0e1b1f8318d2301bb3913dfd318707964e5a7e111e5a8765dbecdd90bf4e265a367216c6126869515c65d8788c9fd4842a6318d1323e50233cb92de965fc23f61cd8c91baee4013a1a928428ca6ed4db99eb2290c0d0683d7cc928d0cf252b389b64e67995249627cdd90cb4e5fefc8da61eb3e8104c6138e52f6710c136f7061e961c485eaaa586eed740eaa2c0ef879d2af5eca41a5aa1a2476e909c8325952a9d8ddb3b9f6bfa6495c4e2571e4c0ce727fe087ce484a038ecc27c7f0743fd93dbe0bc0386e4d025092d21f9c7d569ca0201d3347e71932e6efe64fa847655e4f1b01af20e0137160b5bc03a9450457162db68997a2df476175ffa040cb4818aa6be70cdee08e05724c8ce0174c6b25629c33e9aff85fdd6c438aeab60c3e939bd6deae3be1fc8beaef81b9334a1c4d59117863d7e73249f12a6a295bac6879a66a0935497040357bdb9ce0f2ebd7de693baabbf70ef76406bfe0e8a8a1edc183185a92b97547d50b10f24ed71a8a3d558ddc20f2b40801db842cc9a38021944d8b97e06e520f0ec22189ac11503a2d84b8291957299b8f1f45feb408e6c828ab97cce7c644b9fb84b8b5c3daafaa90e1c177799c1dd06fc6e48fd309d40b2888f4d3",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "last byte in em modified",
+          "msg" : "313233343030",
+          "sig" : "1088ad6c2cb501f99bf0c545d84b526de3665f419af5e941d5940196470da54dd01f58f48ec6cc56e16b1e21573700e57341188921fbd96362ba5e377e051a1cb2025c0da7842409e8ffc5728b2df3fac115d79a11d7a13ff1906cb8734373e62af62dacd1e7412a89327759542577d720581d4b8a928ab01e023ee7caf33b9037fd96fc17ac43ed9d604b096c8b0a11854bacdc88a58ad8dc3105c748813b4d4109fec80a4385f74b8b102f02d59b36e6cf4a347d87daaaff974e0a1f09255fd49e584b3c88d4704258fa8c402ca67ef95d1f2757312a63f307302a31b021fe1bd2be6feb6c1d7895642e5556bbc96026a591431adbb2953efaf4b54f33c8c8b9cd06e23ca369e5bd81ddac3167a9eb280f060afad68295effd5687e131967437d4f9f97d7b46afe1271a4193407a1251c1075705d4c4cab5e523eb66b2e1f57789001075b500a3841b7ea7c130f37761c27097c9ff533832d201ccc243691f19ad4a822b7ab203cc477398bd32506b4952adbaca1bc5eeba7c565843e17e18257a7cfac8746218a2118b9813c655f6ff55577fe17ff6fbd6443ff307f20dbd36bec5835c6a41bfdc7b0afa12dee58b119ebfa8a3ba8d3e77e3841a4812bdbe163aaf5bfa05a305c158115227f569fa92850205abbd275f1f24f0dc5b14cdd405d27fad86f812d51254f1667724fbab80e6fc30a5f1ab60afd412fef8ac19c5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "signature is 0",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "signature is 1",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "signature is n-1",
+          "msg" : "313233343030",
+          "sig" : "956353ecb7561945dc5544e4602466078c93f28507701ffd39e2a9813c8ac8740e6ad61c955d484e513b3dcea527e001a018ee2c207c1806a96763280236cd3c820dff79837c9b709cb4b522d3ddbc9192242259c43be75ea244d37ccfa8a4c75024a2cf7cc76e842ea69cc7ca1227405b070047387a5068e4976e4b8ed5f9aadd7b4db024fbb8d7bd8a040d8f6610c1c6eb1d4b606dfd182235d0360880304d5a750603af0c424b8c8e6dbc12c3697d2d609c97547e774e2e362ea96d1690dc9432112c535258b3db2c4c32ad510d6c07ad0788357883869efb8b629298724847925cf42b34386be700f02903db5852276bee2370941f397bdc3905e30964a0b5e73602703340960c3ed6078263b611f197955fecce4b9a32e43cd1d2e5e87c4ceb65edc8853a7ee31d28e16e5adffb8ac7b760fbfc63d5f174f4d0936461dbb12c964a6b6d6cee752e5fca1ab4a9fd238dd3e8860a1d763d2019f9e7b99ed7666d4e038710f90e0093bc566987d6c0092f571376e705b342d066c54e6e2578927b92c1f0928de44e9a6e1f49b907c6aa4f605ec9c398d55df81c67373b03cc8110162fb417f96fd321048647dfcbb392455115cd912ea83351853e6a185284648842adcbd25e67174a3b93b8a64ce2ce9de0e8577b8b662ce32e2565782665dd38e5bb5fcc4fe12e4320dab7773b545a09c6d39d9dbad459f21f3e624ee6ec",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "signature is n",
+          "msg" : "313233343030",
+          "sig" : "956353ecb7561945dc5544e4602466078c93f28507701ffd39e2a9813c8ac8740e6ad61c955d484e513b3dcea527e001a018ee2c207c1806a96763280236cd3c820dff79837c9b709cb4b522d3ddbc9192242259c43be75ea244d37ccfa8a4c75024a2cf7cc76e842ea69cc7ca1227405b070047387a5068e4976e4b8ed5f9aadd7b4db024fbb8d7bd8a040d8f6610c1c6eb1d4b606dfd182235d0360880304d5a750603af0c424b8c8e6dbc12c3697d2d609c97547e774e2e362ea96d1690dc9432112c535258b3db2c4c32ad510d6c07ad0788357883869efb8b629298724847925cf42b34386be700f02903db5852276bee2370941f397bdc3905e30964a0b5e73602703340960c3ed6078263b611f197955fecce4b9a32e43cd1d2e5e87c4ceb65edc8853a7ee31d28e16e5adffb8ac7b760fbfc63d5f174f4d0936461dbb12c964a6b6d6cee752e5fca1ab4a9fd238dd3e8860a1d763d2019f9e7b99ed7666d4e038710f90e0093bc566987d6c0092f571376e705b342d066c54e6e2578927b92c1f0928de44e9a6e1f49b907c6aa4f605ec9c398d55df81c67373b03cc8110162fb417f96fd321048647dfcbb392455115cd912ea83351853e6a185284648842adcbd25e67174a3b93b8a64ce2ce9de0e8577b8b662ce32e2565782665dd38e5bb5fcc4fe12e4320dab7773b545a09c6d39d9dbad459f21f3e624ee6ed",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "prepending 0's to signature",
+          "msg" : "313233343030",
+          "sig" : "000075fbc044fe19c72f459b5a1fc4793f7893ffcc95bab8609900b3c3d3be6643a42987c167e7feb63ec2a57f961c1b9c35b11b34044e065d7d3df0b49496dd80f7cd1eb2e8c0d0b726f37e701ba62a3003a17657af55adcb0b6e86f95198ed435207663d616d516bf7222db241094849fb232bf6fbeeed7b5879a6b6c8aebc57646117220bf55403d0ff078e219ff119bd2e52e767b708b91afe30e9be348766e7537e1128087b4c9aca0281415e550965a395ab20d423330939b4e37551a7735c6df2b0395dd032266ec7dd4afaa3c477c64e3f95ee4945960b7a0c43b7a9622448eba4149e30ccaa0c234be7b06f4ebe8ef43063c62282e0643c6e483feb1942e3310bad0c05bb2f87674825fed098d5c787b69c5ba6a1f716dfa62ede3b8a01c076598b15ffa2e2be82fd1d8025f8ded14cd8fc8753ef76419e1dd561bc0310b2c7845e2744c9621735758645af0252315b6a05894c264c4587c8870e02e94813fc3a797d590a9645d92845b614b0d89cfffc0b80c5b48186ae350d877f0bc06e561770736342f00d56b2ae785891afe39cc0412337e4f5d29ff06d727f6fee8f0966d52ac146ba82a753751ad786c9d70ccd3005b11fc4f6b81517433a052c2351390332bf7fcb4326a19930b512631317c0354a81ec7c529ccd1bb2ef206d697999950a539808958d6c2be64220123f12e7aad168be35de70103090937f44",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "appending 0's to signature",
+          "msg" : "313233343030",
+          "sig" : "75fbc044fe19c72f459b5a1fc4793f7893ffcc95bab8609900b3c3d3be6643a42987c167e7feb63ec2a57f961c1b9c35b11b34044e065d7d3df0b49496dd80f7cd1eb2e8c0d0b726f37e701ba62a3003a17657af55adcb0b6e86f95198ed435207663d616d516bf7222db241094849fb232bf6fbeeed7b5879a6b6c8aebc57646117220bf55403d0ff078e219ff119bd2e52e767b708b91afe30e9be348766e7537e1128087b4c9aca0281415e550965a395ab20d423330939b4e37551a7735c6df2b0395dd032266ec7dd4afaa3c477c64e3f95ee4945960b7a0c43b7a9622448eba4149e30ccaa0c234be7b06f4ebe8ef43063c62282e0643c6e483feb1942e3310bad0c05bb2f87674825fed098d5c787b69c5ba6a1f716dfa62ede3b8a01c076598b15ffa2e2be82fd1d8025f8ded14cd8fc8753ef76419e1dd561bc0310b2c7845e2744c9621735758645af0252315b6a05894c264c4587c8870e02e94813fc3a797d590a9645d92845b614b0d89cfffc0b80c5b48186ae350d877f0bc06e561770736342f00d56b2ae785891afe39cc0412337e4f5d29ff06d727f6fee8f0966d52ac146ba82a753751ad786c9d70ccd3005b11fc4f6b81517433a052c2351390332bf7fcb4326a19930b512631317c0354a81ec7c529ccd1bb2ef206d697999950a539808958d6c2be64220123f12e7aad168be35de70103090937f440000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "truncated signature",
+          "msg" : "313233343030",
+          "sig" : "75fbc044fe19c72f459b5a1fc4793f7893ffcc95bab8609900b3c3d3be6643a42987c167e7feb63ec2a57f961c1b9c35b11b34044e065d7d3df0b49496dd80f7cd1eb2e8c0d0b726f37e701ba62a3003a17657af55adcb0b6e86f95198ed435207663d616d516bf7222db241094849fb232bf6fbeeed7b5879a6b6c8aebc57646117220bf55403d0ff078e219ff119bd2e52e767b708b91afe30e9be348766e7537e1128087b4c9aca0281415e550965a395ab20d423330939b4e37551a7735c6df2b0395dd032266ec7dd4afaa3c477c64e3f95ee4945960b7a0c43b7a9622448eba4149e30ccaa0c234be7b06f4ebe8ef43063c62282e0643c6e483feb1942e3310bad0c05bb2f87674825fed098d5c787b69c5ba6a1f716dfa62ede3b8a01c076598b15ffa2e2be82fd1d8025f8ded14cd8fc8753ef76419e1dd561bc0310b2c7845e2744c9621735758645af0252315b6a05894c264c4587c8870e02e94813fc3a797d590a9645d92845b614b0d89cfffc0b80c5b48186ae350d877f0bc06e561770736342f00d56b2ae785891afe39cc0412337e4f5d29ff06d727f6fee8f0966d52ac146ba82a753751ad786c9d70ccd3005b11fc4f6b81517433a052c2351390332bf7fcb4326a19930b512631317c0354a81ec7c529ccd1bb2ef206d697999950a539808958d6c2be64220123f12e7aad168be35de7010309093",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "empty signature",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/rsa_pss_4096_sha512_mgf1_32_test.json b/third_party/wycheproof/testvectors/rsa_pss_4096_sha512_mgf1_32_test.json
new file mode 100644
index 0000000..ab3c0eb
--- /dev/null
+++ b/third_party/wycheproof/testvectors/rsa_pss_4096_sha512_mgf1_32_test.json
@@ -0,0 +1,391 @@
+{
+  "algorithm" : "RSASSA-PSS",
+  "generatorVersion" : "0.4.12",
+  "numberOfTests" : 46,
+  "header" : [],
+  "testGroups" : [
+    {
+      "e" : "10001",
+      "keyAsn" : "3082020a0282020100c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d30203010001",
+      "keyDer" : "30820222300d06092a864886f70d01010105000382020f003082020a0282020100c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d30203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyadlwmYbRnTP80gOml5G\nKtCtL8m8b772KEezET0gmR9lOWeXHCglJ1P1+6zOASwqirWSkU0mnvr6ck+kuSDj\nQJMMEG97Nvec6/DmLojg5HaIjp8OIhhqzbbEUjojK2W0/yzCLcRPilWVJ9edfNfc\n83cyEve7mqEzwxFlzGY2kL8SPXOSPIOJKcyv7lnWxwlbjUp0uvLRksmk6HxOErxY\nATB4sop3iegunzHeH01qKqboBjK+jkvfJj6NSbCUFvsZxIjAetivciq3kYKyMCin\nHgZdAkEqnuvEbX2PTgPXkjjYwMtKl6mhIA67bsZAQuvsytlWdSbu7xLBfZTBBJyI\nmXC5bpTMNTFyomiknF6L7hPBWznexE8sehqjenoLb3IpCsraMrHYrx/D3IqJSHuo\nE0fL6xNQkl0w+SOVgQa0mVnIcefB26VdoHcuNiz4Yh14YQhouJThbl3+yWh0qTpM\n83m0fn4xjOMVBm1w7jk4FApgFI8gUIXO+KdwDKPFPVKldWpjs7FvFTBithJipoSW\nIQyL5O8/kCnKDqDjs6DV1tIm7bv0Ta+PBF3Cht7TxOxNtrRTRwefM+r5jjyVtLYO\nee9KMJP+7FQ3A0Irp0oRhRHCGTtU/otjOGbtLHBcy8bn2dNlaAnsPTNW50AKlkjs\nN1BQQePjGvHALu/pJKZwR9MCAwEAAQ==\n-----END PUBLIC KEY-----",
+      "keysize" : 4096,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d3",
+      "sLen" : 32,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "8d4444ab233739c9d1441e99cb4f71581ed78fb996ba1257fffcd9e3c74ff60d6be352f002f959ff66bc6ed0c987a070097e5d57d8bd89b4452a9d2ca121eb6a283e8d0ef6f5f67875b6cbb8f04e6d242900d73d5bd7b59de4b9466ccbe53874ed422610e411fe3e026f47e47b8686b9c891c7226b4ca560a840e1734eb4f6fe877e559c9a9299dbbcaeebaf7eecfce6fe43ffbc483514fa3aabd6959e5aaa3977e23a9f97edf406d396e96c3c830164b10abc680bbaa6d99d19765d7c7e77946ef6ae240b5fef0249e7062792b15c8f9157da95971afb315c9c015c74a2e79ea2d0cc46992704872c340781f052b4b2cb5ded8f5cadd9b5e3edce128ef2354bd0411074d6515251f5231453bd530222f730ec736a86f721744267ba52652289ff6a207a5a7c45c20ec451948d6bd7b10f1af7282afed9f5df43e4a0d0f2e8fc6d3dd3130d4ff6fbc11f0ea460089856df29d1b7b111095754a7de9bc03029c6c397b6994674775fd29cd22ffb03dcd90c51096b18a6c174f2b48d50e94856f5a22adae64915d69c5528dac0345017c24e8aba401c6e9a0a268057a0fea237dbf0c88906796eea0d1bc3c2347cfcd812217e26015825e9f0fac404c22c26272443ccaf30b294c7c467497ee561a2a5f6d219973cffde9aed8e4486faa3de3d17405445e2f78a768dcac1efd01596486c2495f5bb1f830a4984041e03a7bcd77a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "3a58fc64a234dbd7be958d7c34abcba7d780ca636c4f2b2bb7fd3d4e4faaea0e17226c85debf8dc9b1a79e152a3bd83b13f43b1e92be81b37e908d04b717251e32a2d49e2cb5f2e7dc18e74cf9fcf0c0e246d473f76c79c3d50e878a2f89bc4eb6ecdda96c166d6a825a1df569d11384a78d7052782ace5878c41361f148c54528288088716f935d3e5b5d556a0fc9b62c0de31d9ddf4893f82365111043ad7fca010d1fe9187bde48f78cf465657e184857451d64564a16a166743870033e64125ca3f20ba80c065b259666871fcfcf71e711aa34cb70ad9a2ac6051fc02c96149d4e3c1741c4d44663ee0b49e1ba60a80b4c2d389ce3ba953d68bec835432bfe170429951f82ff51f408aff052c934d51526117b3d57ed1f2a912b37cacdb5a980d30d223d79faee7948c5f4986c1df5ed42923a3f4342da02a41872db49aa09d2d48c3b3e1cca7114a9a34e76b747ae6c99141c9f856e41d98456b3fde7d26bf842d6a421b3d4cceda4da1aa4d1298b624159a1c83b6fe5cb89982eba5e7d6005489d39233f156817c00c04511b98463696f8b6b3962ca3f4ef76b37300dda1d368c237250baa057e38658882f482d024c26163dc1fdac29904bc6424130837b8928f764bc939f006913ab1e968c85016dd812dba264520e6380872587265d827557eeac6498db8137dd2ae029fd83250ab7dcd764d018ca05ac9db8f95e2",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "7c838ba65f923660aa4ac47465eb1df4df51d6fa2be26389757de8c6dfc7746aa5164d909b69b7c04758d256e13e3520e77e75b4094d8b0d60da0030b9c991969f6e892ff03ffba9b9f95ca991a279e7cded611a2879e6e6602f411a122c8d11cd333de5d2f7f367e38ee0491380e8796e113487ec7bc05ec1b1261aff871ef82cdd12f4e3d8f239cd49b2f53d57255dfe6ef29038831cdebe9cb1a76dc9ed79578e129b063724ccb3c7b3269f5dd3d9669a405582255cb56b1efe6d61a376df3a141014c3d660b66f9d1b266b5fd3c5472534df778e6e022a8f5a6cab501dde611e07c0c8eb5718962692e8e3773bfd25f1d3b63a20a251ef0c296f01f4a17814e18dfc029f2ed0ce073e83777cff44471f9348434fcc12b0420bf2de1c9018f0282ee21f09302b178f8c772c8f8962f6a29291c63532e1ae9301e7ac55781876965f425619a92559f33737d5e11b282f9434e27d9b27eb2fb0fce4e3e90ca9eaafef170644b00e512537bd779fd2207ee73020aaec07e6cd44103a14940c9499b013c42440d2f27a3def34f3509cd8631db1cc8633ac15180272c824369e1d3c8a6cdca511748361cb60e022173f95ad06e7c79d59e03934854a9f9827f3593d87c34d3fc44beec58e107d454ce04b55c96effce612aef0e5d55c31e367c9fc0166f2c9d450e86d79323d4da8fb409f97adc7af2ec6772ab290f622fe1fa61",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "4a80cafbe2a6095f8e8663f6289878514d7ee7daba0c1b0a077cefb333cacdf7c116ab89b0a01cab3161c68cac92a08aae7d117c9a3416d67365621da3380a85ff34a7a3b512846048acd1ec5957af942721c241a180a5dc5d8f6f6fe54d4d9fcb3709cde37081e2233b4fffa201d2029241932da170a5bad0d927a803a7f6289fc9f7b1d41cc1a6c94cbf588d5492b363920d0c98404f5da9eb9457648e2a4e9a034b2e2328c7f8c0e794771641a981df765887b5ba19b769156b375535911e1a2da68bb6a37eaa0ef8dded4ce3eac5caff4e8dc357703f0409d00baeedf3fbcbd6895dd3938e1f03dd9f131f9c979e22e4fcbea0c58721bc72d1f4976e93fc1a7649a23745c0310181031ac34b2200dfb4e8fe9bd4cdb52a23c31416745521aa4861eaea7dec4ea2c18ae9f75fa9d36c9b61bdc4185e434f8cb091cd731607b749a3990585cbbea2b1c0e0fff4f589a547d320bc7923b8a6b594c5866095df9c914cca80cd6c0e9aa3d691e2607f9de64322031ccfed04d9c805226cb476d3246d6caa1b04c63372a77668d5edf06365827b80391a6abd66010e8e1b873bd83db4dcc99444e109efa2414c6e5319f30a718eb43a1256b2142afa2382316e37aebde32da5bfec93e89d2adc39f62aca25a2289933a7cd8234d72a9b3c6a001d27560f8c8a2d9a233bac0b519b34f4f79288ea2cb08a87242953ac24ea144143",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "3d90ff4e36188b451116227e189a71734571b72cc6fe53dec4eec59e67e98111e96fcd906509fade9922f2de6a13a4faa23c7efaadde6dfd0acf150541eca973c7e38a49c597d741e99ef7575b6e2c8de0974bc868a5567f0890052c4df54d12198ea09a12bdb2b6ffc14a1d874e165ed12caab58b28aee171fa7f1839e36e23ecdee2633616791179084eaf98cc23d2f6ff479df0ba46ed933beedf07cc0cad4dea0f0b48f4a063488ac67519e1fb83c7b7e86e3644b0846383ecbb1b1189743036b271fbf121e2199601a3ffa8e8cab00a6b9b5527d62dc2a398e4a42c1e5a62f8aae35b629755119c54cba5e860b421845f9b4422f20d896abfa962ece5d116f7d4170db8dd0784b7625ab2a384c7d424c69901f59d03b144241f8f6556da8e3bfe07c17eae91c50ef2c53e71072c3ff16e642cf126feab904e09a2febebd282a2540389bb60b145cb332658d6a69e03a0a8419eec0f204d6e592e04df01b92f58236989b6b92eb0344255914c25dcd0a611c9fb77e435e2ef9bbe3c74efe144171ca95d1bb7de814f76be54cdd8c11db8af8d20af4451a4dd3b62387bac37cb79755afe91d0d9a2163d299ff61ee4fc4d5267eb8c5252371b0a83dea738f6383e085e992b3567ae170780f3b83e15d895ad4ea668a6304f10f0914ca3b2900fab1364c8b352dfa8d5a3993d5628f4d2264c412210798c18aa2ed6aee516c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "07440a61252a8906a9264ff58cebad6217ad710833105369b7a858216f1d5a5f5dedbe3eb8128b34dc0f0243faacb64034d21b656a278abb26ced174f76a22637b755b768564db6ed4e4fba0d5784a22be30d088fa965307430982f84476907d55435ca3d4abdbf689e76f2d4b78d99bcc742e0b757b897c4fdb13d15c5057e6816e32c3e294a947374c998550173cc657ce33f9fcc18b2d14e1b448acaaef683ff84b086f545a05414589b1c23210290ed5ebbc25af614129212d3853ff728ec01128d37c4268975ef870a1e4fa00c3c98b39c3110c2c11af10333e25db027448fa8f219a7dca7c8bfb490912bd5040f1f348b2fb437a8a9f407ab7e8af1c6e29594f557f2e03fe74e4fbfd2f935e68ed824a510fc39bb4be0a2e091feb265fd2d7a33d2f238e70b153700f5bd5046aad7a6fc02a5e23dc36f67278fdb904d05f2efd0cabe9e4baf4e16af0f7ba9edad706d67c67221ca0630238d6f688174d66c1b152f8f921e2c6c08a19e870eab76a77371b42458dff1c36b0ae97b811e900f6c09e792c89644448f1d0b97b53b9818d1d8f3d7a37bcb1bd3e3a5bc022039f00a0ef7de19657c4c9e06daa2ecec2de30db3b7b84107bb74e164956eb26edc9bcc57e5e1c4ed875b02f0545383602faf9525f094c72f682995d4e2d71d03e11134495f637a3b1b022153689751b63521b1a16b3c3e269a2499a4be1aff9b8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "2686029fb11cd033724e57dc1835da4f9321eef330747c3500a4893586429ebf02cb4424ee5a0b91a70eb35cb05ef60cf6b3635d4f2ef5eb647f398fd44f67fcd2969b629a7c54f1094f9827f9f27457509730f50c9ecd2dc83bd13f1268d93f0f61c29c5c27eb821c68edcdf1b01f79d1f261dd7f2f283db197ab56cae0ea3b3c1cfaf3fbd4c1ed1f6d313f0b919e5fddcb97b23f0bf64e36bdb6f7cce8ad9cf362953e66c644f8b8b64bddff1e850298f5531f121e6821a393f9658237280c2a53c7c658319bc7d38f93f2d7723ef6728008843f89f61f7ecf5949a2cce6a9fd9dbbc501ef25a53ca02486b61a5de0130149d9d246925f26e1a9a74287439592a4554a872ceca53e54d1c1f4c4e18a4977939a6c37eeaab5c8d0cb5686b44d84c86d736ee8e0d97421f4c8935e926419dd68fd4e5fe9999eef75d0d0f9494cbb0297fa066b3aaca55cc229a36659be310c1e328d0b52f7747c62b1102a2d0a4acbadf0acf621a45e5695ce1393b3eb05a69ca5318e6f6b7ae5c4ed3f6072f8ae99db9af66da6a98d675a35acfe0a7612e9d5f29690870d81114279010bf7bb3d458f630f10f81a785f671e6735d7bdddf4da375d2e6d48ceecaee741a33ec1e8f9e0ce0755bec28315c6f9df363c800ee147bd412c5ea7aeb89e7a354fcd3a2c8474aed04f9a2a5fd2983380f3c00a4558c46ca472a4c15887c07d4bc8a698",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "first byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "9d1925a05f0e28592ed69d6951ff5417b240bc327ded41b460de2fc3a0101bb89d6badc5bd50e2d1432a57b7bd620646e923405253e93c7f2550c0740ab9657752863739fcf89d492ab1cd8ab2088f4ccd8848c4eaf95cd5e7240872472f35cb702341c6965c0fb7b113bc45d991cf9616b7e200f2cfe79201babba3455a60cd628678725c49958282a2c751e0861f20d49a4294d59c3cd33c6ab0b6d02121f6f2c9322b6f9505694de40f9a98f628edddf18b9dcad1cf586ef22e7000cf09582f80f0c377955e110c93dbf9d7938c59a0b7fa283c2f3b186c21e070da5bb800ec622036906306229f8f965133df82521f454d900a01bbee1aefce262b1d8d9219ca809c699e523c5c7204ce45c91fab1cbfcbc1930c661b8a3da04e29d63794a65b1a656a7870c7974bb785fe49dde68118feff1dc6374032e9225325c3e3d312850d0ebba0a5aecea061b5d61c8f13f9f82e6cecf6667278da4ac38ec4424bcc0fa6181ba1d63966e473157c76c7d007f2a0f01eb4efb54cfbcdd1254a871775339354695618d791ffa8d57fedffbbe568a5b848b7fe037f8002d96c478a21313ccf42e5819478aed99f6ba834520ac2460a5aed186a96dd9c90754f9d21bdfcd2635bbd11e956341d0284b51e352c79a7adf1748f2deb2921dfe6ce8d36aafa35cdcfe5917113d0c29cf29478f9000a0c78396cd891dea0056042711c0e54",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 9,
+          "comment" : "first byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "2f19362834eb20e169132d1ba73bfe32b50faaf9c413d0b2ad578e263cad266a3144835b129648471fbbbd4bedd9668d6e96d4c0d0b95504a8beefcda6b9bae162c2c1bf53ba91d9e1771f46e60c0c1d356fa166a331d51ea85bf270e7cec459908f1fc29bb6b5f216eb9f5f453d29fbd486a03355cdfffd6d131f4a027c9b179ef91257272d5a383898b864732edcde78e5cdf2a9ec9640e9500ac7bb06a7b1f1e947ebd468815a56a86a6f747e806cdbfb81d3fec3ff66af0fe5a472f559ac05b2613ada9e40587d75d98c1368776c696ded9c0b34100eaaa80f2016a2797ff0c0090e4e3b042943436336c8fe72fb5ba9c4b5264d97421582e0e859b8a46a083aa75d7b8f1137fc7d1703812f681f615804385d8f533f0f4f8c21ef3921f42be0f2ee863480d72dd8a4d78256cd4f44ffd62526abd67d2b4393328d41e45f569235f091bed9e2c72b559dff4af790401c18b4af71613ab53f1d362f3ff2e6b0d4c181ca051f88087ecfcecfe8a4844f7f99f624aa43a070bf023d28eac88368e7e8f7c2357ce63728820422a48ec0970566ac96ea714422d5f67a28f5b67ea9008dc95bef728c51c8b5d83d59f92c4169dfaf232b4926c9b59c5385fab598bc6df7ef58b88a60462f2692a8abb9f8699169094b1971c9dd6e90517582721f6e49f5af1e94d9bb0efd5a0313968322d86a2e2aa2e91ddc9d4fde0a6b612740",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "last byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "88a4b39c219e6d7a7155a5e38eb2bf76715c540c817f5f7c3ac827fa34ac202c7d904aef8d59bf449154fdec535b45e1d0a5e9d31d4ea75ce4e6a07e2b7b5ad61181a2172f220e4a0679857eb2152a3e2aee3c5c0fbe8e518f6ae410cab5ce861c66ccc7f72494b9b0f0a06cb8122f16776ba7098139884006a08a6f752948b677f1bec1e867afab783f03507c5a4a528ba2a2e0a118630bd93ebaaa96ce378bac92a9f02eaf0838636685cdb7be2da6bc6438cc84b907b4c927eb1df22a3242e4886bd74ef7133e37708d3d2528ebe39e9c051a217c6c7deb2e6a87b905abf4ad4326d6a830ccbf2c3044befbb9100a364ab897a684b472104a1f1484e39c2f9ff3f5b8ead0fb813e3d54673713f1909af085359c881bdc7b82ca9f2f3c1ddf3b17f796496d29b62e1bdc7eeff0c65b78b4ae81fe7b397d02fd0e74463b3cb68064aac87dd0aeb36248c50974b066b7864924f36084e7bcf462f08fdfb387c803afffeebc9f0c317c9882713a50800e1250776720d1dba53e5c1dd3e8b176c6abd051bcdc9851e7107417f06c5cd9e8853f75718dc6386a7f4747ffaa87994462fbd9ceac6b5da79f9dc5c5363116a308b4c20e673acc5a4aad3fe7f427ee1c08ade6eeb048cbaa0120eaa3a74ee39e5f9e39dac10d5019f1d115dfbe051090037503a63229c216a6cd4b6b4723340debcd812c13edd4e77e66380bac99dfb0",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "last byte of m_hash modified",
+          "msg" : "313233343030",
+          "sig" : "39a5d241a8c6648f4f3ffc5224dc31585e22a58d343cf227b405466ff8f8d5bf553affe12198e6f8515b05d4f6bda0fd645874676d7bff6dd67345f4a1aeb21adb43abab63c3cd53f186b62a1d44d2cd9425cdf163bd2f90cd190329718c18e7faccd7c0f5f8547d74bb9df9890cc8c5a84c6f8fde84f4c8e3409703196a7d7466afa6c0edc728f1e513fabb7df97172545ae8c865ce95dfa81ff35870e71b1067762836a8dcaf186c9fc7e0a633f98f7d32ae10b2a6d962f720d6784e64c04e08f8dfd688746daa69bc70f652d1d6f806b0df297f655162809fbed4cf0e07d5ceb66fc5b2fb89abc4c2abafe325eb4617a2d244783f70002056961b26f0c2dc5a7df3e883bfe36310ac3ec92b71687d6b6bb3d11378f0ff85d98c6584bf2d2c317bf287e95537d0314519bc6b01798c26b3d942d08194dc34a884d62160919db67df95fb9bd4d917d4cee73f88914572db84ddb3804984c2da20eaac9bed684a0bbc224dd623e527255fd27ebcf6435292997fec51b55b73dd83decd002c348b2025776f2031672a15fc62ff857938e0cfe4da61f5f9e0442d4452a1f7c2687c632bfcb143a544120017e26854ff6a3e8d597ba4fca595984fe1d38a9199327d12fcdd38663dcc7d1fc7ac6d7845022de5336f9e570a6700f0c5eba0ee68c4e75295f69b76de1455406cc6b285ef5b86729230ef8781fbe63e0bd9c82a1064d",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "all bits in m_hash flipped",
+          "msg" : "313233343030",
+          "sig" : "3ba629ef8d7cb5798b51fef0959cc00b4ed788f6f37b70cfb16d68b864ed1a33ebccf4890c78970695825e78b3f219811e928d27af0d389e4b75624a06c7cf2174e2a9de6e87394f617b8fa0361a490dd45b9cfaff13b8b807e5ecb0c1b6464228f1fd968b9af8f7a63fad9a7fa53bcbc633331d33b4d7c2bac330354324365c0616bbf22bb9de6a5df5570150186f517ed1b75433ac186ce41ea4f330ccb6fdac5f8db5f63e37fd3340631f7e4c0365b75a0b2a9d790bdc6a0ebf828c84a426fa9a7154cfea1bb9450a8261e0cdfacafc10ce08b64f941c3bc23732a4c3c43c6126736d84033365bb57b3587ed98c031a85325a15ec6642a99cdb186156993ccae8e36640419c15287e7b7c0518376589b93106c434d67b5a5c1fd34fbc569a4e4edfe06b621fe3bb86efb0fb15475db5477f6f9a85d385dd49f0cf3c5d4f853d0574991d1a508d5767df9219f8f15e4760f049c84938d4dca1445df3d15f9f42191e34bdeb15742050812b30a509d4a2444dce219f05d0faf11342bae72dc3f5ab1fd2f25b507d7d7e30a9d4c619ff587ea03d471c8d0306ce89ff3a8c1b2d650eee83308a9236dec87e0af54c74f402f9cb84379aa6c9586db66aefc94fbde391330fc108569a0b9d0b63c974f333c34e881494e02047b19102772a61f89f19622e0b8d92dba4acb19d395d6170dd5d22220b5e678d2c9c9cc7c843a195be",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "s_len changed to 0",
+          "msg" : "313233343030",
+          "sig" : "9e591980e9ec3d62e2edc3163ac8206fc09fe026a2f7e622dc5a6d02976d30ecf141295335008d91a223ee98a143541494ccf7cb06a1aa61de524fb5bb4b379a67ed2ced447c7b395c57a625f835dec6844c3b67a85aaae10e273d3902f5f30539711f98d73f86beccd798b98541a84a03ccb3379e8eff88c19c88aac7b7ea99758194ffa6660153d4f22c1252dd1b7b574e19b3492f28cc097d3ee3f30f6b88576bc6299512f9f8749e0b297295bc275ca59f8056decfca9f3980e6f8d6e07b73e1a8ae8b3847556cd67ab77b96618979ed37744be2d6bc9f2b671615f1d4c4c1b419f05036148182ad4c6375f9e3c7cb37bb75d16c4486e97c0ac5685995cd8e5d76452934b26105be9074b2f8daeb1add13c9b127dca2858e5c80e686791a6f98cd98e540bdf27d21b2dc9fc84e09561df968d73c190b3081293d666be7d991761f4722450ac249a6eb4bcdf190c214630c85243a6c5970184e257c00c5a2a18bcd20195fd041887f001e06d4a6049e210cce62356f99853f3da2522d3d63739fbb2ff315e68ab4a05ba1e29e5b93808df51aeaced52539d7b956db2f229999ac09a6d4c2ef8714ef9d4783f538559f29af9d850bf71b001f231270874fb8dc60f1d1554f60fa69cd657112530e22563fcde26c3c86137e476a2fc1d8ba4a15dda42d4d8a20fbbad7586f472b716d6ea2ee30f1c111bdbb3db8e5e2d933a8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "s_len changed to 20",
+          "msg" : "313233343030",
+          "sig" : "23e198d582d048874ce4e6e69f5a81234ca08be1fc9cf0f7be05454997fad87da8f05c2faf7285a7a9ca7aa50f772b8175479b7bec85919162b8a7eb7cd4c1b8f0aaa64a8f371e23ec2c3428d7d83411f24bbd4b80762a75fa0e5de468a71dbe9bac382b4072241e3c7085ed2b9e72ec3779c1f70bbd0f246834f3e81ebffee13312d133e1ddaeb58b84d1ac1b441f311ee1e2c9693e300862cdf5b4a5d820dfde870da22746be0b12dfb943780c0ba928c657c54bea0d84db37fe50f0965ceab905f2ec3ff177421b11c30e846ad93212485e7f6e52d7d51af1c96f31fef174ab38cfb1b1fb5961cfadac518a6a4991ff2d561a7d8dadc5ad430c94b40c04a297012f81e6e84ca02879fd82b73744c4372ec02f141ae6c4ce75595559f3f4cc9e4b7a7a6d93636487e34938082b3fd5f09366a062484d1820586a720a9618ec18d980c969a28d74c81fe4fe7bb61986769a89716c965a7f056aff60e9175527778210eae23e53e244b973b2452f40ab375222621a89e1f5f2abfe5039708f2a659553582f760f0d264f854840d069e8c4db0246738af1697b05980c1f53a1ba4eef8e08583781c13a93d03eb19db75e71bdd0602b91908a885b41f0b8d9588d6e05796c8a6f8d220922ef9bcdb026af9bb328ac7d96d4078205ba1abf00eea45b9c260e3b55da036864bf5bc0cc2d3944fdbcc7e64539a45238bb2061210514",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "salt is all 0",
+          "msg" : "313233343030",
+          "sig" : "0147dc7e2712616f76c84caaa47f17f267954a0924bcd846fb3389202c059062f30b786dafab71fd7464caaec5a968f75b20fda1a4c074c89b2732baee615c6e88d1e2e2fad16bda01db395df1103e0d1796da2fdf9d9c8c1c776578e8acde7d97808deb83d0c4e5115de538b3f5a48ead7ac6b5076b12baf7db4aa68a091174020e5e4adf275702020e6eeb9d8c4500170dc5e2171ac370763f7b1000f805d924bbd80cec120446e9be5669181a8e4eb033ceac5278e7b80ddf97d1a58737f072957a221fc27cdd18aa0514b0811e967d5f0eca4f2553dea4760299c4db6347c9070759809247c48d035cfa06caeba20db6122cc70f81647e93f5fe63c4861f637c3623354f9c2f8bd2f9906b0860d0c81c05a0033d966323c8319c5633f537b9180166a2f15502b5e06dee09616f2589606e7229a0e6fc770261abd737c02cfeb833379d0d5b850a39d4587566dab90ca7a8331654532b589ab7aa20376f355aecc03c2b06149f2f9b4290d0ed304eea6947d235341455ccc04e91e3c56db5d1b74928c3451b5a9d3ab246ffaf7773b0d86f35400ad2ae02ec761ae675ba70d1a8dfceef2a8a70caa3e4aee8c98578bb8ef5a8e2570646d1e62ec2fcbef115ceed2c16cf944b4f175ab0899dca124683f3bf00dd0dee74c25dc4cc82e80d10e9a941845d9e174dbc9844941738eb22076a9f6253cf604d62346c14663bdbaf",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "salt is all 1",
+          "msg" : "313233343030",
+          "sig" : "315a9a4ed7b0ea4db96b233c62a0e7bdd725da924ba2ab8e2f20ccadb2b5256bca0308cddcf739d1e6b33a859f03c550d65c78958f0eeabff625bce6c8ffe38b60afff13cf33866c35ebbfa85b70a3c592f74e47fd97b07f3a7c4f14e26e7be666ff64cfbd873cc06dff82da222dc135ff47f875ccd695ca8c64572a97b76ee7c772d9d07e4476fd4e945ab0146ace3f0c2fb98c34a066f053d93480d1c7725f858e459b0cba699093e8c315bbd6d1347b608b51906d44d49f106ed866e230785afb2a2002b82305bcdb9927ca266ae641a570d0b58f344b5e077501d6ec2fd69b3ebc80d7dce55590f4504fa809178d92b45aa69ec1b28fb69197991ef33dc9f4cd661fd6ae74eb99dfdd1ef122f12d04f7c7e624659fbcb2b987fd5fd25a104d735acf50f3ad070333e9cd4e659aaeb5dd28c86ef0680d0a6b526523e3e5a04cde0fa997c2a4a4744cd87170971ae3d903e0c085b6e62f8b715df76c7779a729c5d92382419804eb32b23fe4fcbaafc58ffe9475710e789a09cd9c3b8737032222d92d0a4cdbe53902d167d49f41e60c94ba8ba119499a5bcdd3eab544cc6226389c732d782c69c97b56c4b701a6bc032079150ae1af8a7ce5e0ac540781e84723e076911f4cc238e95689ac12d05676cc6da9219c491e2efa2af317407b5846fa852261181ccad659911c19931fae0f7e70e44d2b056a2f63d2f6983c9502",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "byte 0 in zero padding modified",
+          "msg" : "313233343030",
+          "sig" : "07c9a0c4ec1ec530aff99c7add866e0d065ad0d4b8c04b1937fbd821a204d11f47f61d934105028abd2f4630c5460d68ce33a02a95866f6b58bf6b3cd06a82e543620cef0e4261083c672f2289f3779bd085368d75a0ca002427b0997e1b13f0ae4e2a32d475c0ab3c7088219708c1b774577db73ddae7dd22d32741cc3815029596c0f654c45d6795d47b4c1007d25e026536124c121b5c1ad7ba59b8cc5ac7c288ebee89df9a7385676f4c928da96b2216505c164f527b0c85e4465809a2bb834d47e1f8221d62f4bcf86e92fe10b11dec6b0d8aa34cbe1a8fc43619f99971c85dc3eb4aa091a76055c41151964b5d65f593efa0dd6a82f076b60a71e11d88b40c5c5643e9fde6c05341d2e32bddba6050af72e8583f8ccc2605e7596f7206ef7b9b59829d911a9b5199d4438f642d2367d28b5d4be12cfc5280402d86712b6eed2ce2ebf37f62bcdeebf989256a1e19dde38f32e3980b8fac73ad9153ccc0f140c96413bf7899d8fda510d8315e7139e8f749f8ecea99afb63af081534cc9847d81e520b926b8f0bf1de4976c5f6de8b7cbbde644158bbd3807bb9fce36339a06d930c137230f52fbe546066bf6064ecdc76568d36ae706252dd4a9bddd3b2567ccdeb3bab11bbab3560507b5557a9c66aabf9e2cf3e42e3691ef77a3b29889a1b7e7287b908f1c281cbe2212a3d980bc3d312819fab824504167ac01c418",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "byte 7 in zero padding modified",
+          "msg" : "313233343030",
+          "sig" : "22e1bb23c2bef81ad373284aebaa714bd1a9aef8bc6730b66e73ff0f6649a17b2a57b3b14ee4dd0362f659b69c1528907ca7ac8a9e5017152073b06491b255a7d5b8f6909c18583d8d118ee32d3c31d7845c30c419b518575b47b6c632f2102c4fbc73c2ae5920d97587ddcb63eb922cdb68c00ad477e028049cac752e4101c364e11c61926bbbe731a7a09cd30c376ced8084bd1e9e7532793300f5d063faacd167f014e66f424a50e2329091a63861539327b664b019124fc3f3131c567426036b55ccd7a5e37c3cea52ed02ab9dfef0d4c08735d04aa32f11938c18c7ec8c126e90793f6f5462366c869c7178701e3ac87e68d7b8aab57e5750b798c89bd528edc2474627aa5f087682b9b652bd6d61455a2b7181e0c2eff78b89fbac1a63691a3c94c873d8ff6969c754d62e1d135e1a69276f978169ffb5495c6c26f77c9a9e9229d436abeb0f635ceb786e5ac52cb5b57bf6f0778b62021c5ebe358099a995197712ce187cfcf60da15c04382d2828b6422e1959445be219e9aad957e050bc5214e8b18e916eb5d1d6f7a7bcf64291f51922c5c41d053d50ae98ff3c3942fbd55168bb2c439835f79d1fcacb3b8f1e40bcb2d3eb1db774b07822a4e6ffd021a49fd9eeed2060a79c3674c7ba5f7ef6c909325bf53739da9b58c775edd9ef54d625f00b99bcbc5b2ff2934769a497597862c818428eada5058e5e988f41",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "all bytes in zero padding modified",
+          "msg" : "313233343030",
+          "sig" : "960e2cc16879708c9ae7329f118b3d9c8c7512f54411c7912c18e1b52fc9b644e72ab9f467c78069e2fd0156241b82b6677e34b782b7fb0094c67adb4827e050b0b3fcd1a050a6fc4e7045b3766dbc9a3f59116226ce2a2e4135e21697bf4560a32b385eb438e78b9adea06a5bd2fe268a1cfe763be160d0c5628fa009c870deb70787d514a78da0b505897afbf0905c3d9c2d849f8bdedbac1ad26f6fc34f74fada027f49972b33d03e9d82b04834a6500599d12d524473b4e8a8d1bc8e4402cc1e5224f62911cb0cc922513aeedae57de13c037b527e36771d555c27ad4c92359dad0f4617b22fe672f01f8967ee1d602f22fd40b6328ecd7698fa1bd8fd5358b5f430ff37904d607ddb45ceec4e66f8a4a12fe24221db24624457589b81159869c26088d426fad0a853cdbac650f4d1fafa913f98069a669e2f0c79ec84ee727dcbcaf233c7908955b98d6b5aeefbe8158b8e8e9ba60afdec7556f4278a78a84c6af3ff4c4bdc7ee06bea762db57e996e81d05ae3ec62e8d99a419c1ede6934ad1b6829d580643e16392d53d268ebb1f225c8011fabd908ce7e0c7b865f1e75290935b27a236a51f32ab43c827e249321cab4b202e02c09a747fd06468dd97906dababc0ce4e05863110945233e2138f5f8a3e4b994ac57424d9a3c1c7075836103ede5b63e2645be30c640c66cfc4ed4b26e76efd8e02f4de24699161c01",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "first byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "492af926baf970e1cafe0062596f226f8b8c38bc1903a3754f83745cb321b86671411b9a96ff88ef68119ca39c8fe4599b703f6776151ef7844a9afa23ca63afa99b64721c1904329eed182a3b61f6e267b6d80f7af5b8a9a40e32e5ba6c029133c73e24c07e64a9343ea8f9b7f6658ace44645ae2a0c18ead4969f73f6b3acafe5b64d285d8fd38269c14c266c1a67f9ab1fb83793352a29ec39d847f02e1903595c88d8c64965507516309b77185a31971dd47ac47f9d7cd04ca1a33e5f61a0302c1dca998723310e0bf8af8bbb42128d3c2d0c4f90139a78bdf3ed4250c2092cf927ca137ecfce6994a6b6c12f840e69ab6855383ef93c33b93b984f5455eca3060b22712c6e82e05eb204bfb77932d7f1f7f0e9954268d801523b1649839cd6b4e04c5c9ed37b56d843aa4f9d546bebe4f2b56093987c715e784c15e6be25e8af454755e4fda56b2b8bc006946dd55469bdd9e5d5843094f78a9d74b192be98dc072da23ffab3e8fe603f7e467792948b158e84c98e8b600c97f0310241310955ce99c65f4910107f4ac96f354fb6005eab9c9f1bceaff68167bb6f39004d37df3b5de71ca13d0bbe1a2420843ece44bd3f5fca845563834eacff00fe6a16972ba647323d637fe8da1e2cd3eb1db2158efd395ec65ed315aa229a7733dd70b741c6e2857334af80f392460c1a5563086f0190e15238cf41e74b76eeee525",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "first byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "94987f1aa4dc1f0a782ff78af1da6495309e247f184b683ecb3ac5f2319ac6cb324f6e081c69ae33d2e8bec90862739187336d1133856d6ff47fd00296e96d9be845a4d606b9974edca34e36cdd19fb0e61ffd526521228f38c2874e99ca8e03f59269337b761c822df212425b38fc853d998a0d411d05a675f7d6aabf64c8068177ba8fb8b36e18df86e7f6e91368f364d7eb91c4b5878a1e4b610d089bb4fe2c4308a3a0610cc3070656b5d2b2fd636fb2ccf7731fc7c850b4cd196ca68992c5b6f2fd87d94d3c7e212fb914362657011ea8aa90baca2fbdc62e51245b88fd59a4f708da72c19202fde546a5f994fda930b9625324846e05bedf4a68d97209dec7e6c4cce36aaaa738876bab824c6a6b7d3bc80befd646fb6e08234cc60d038c510776962ffe26d4edb8ec8e047331ad7c3c9d2d0c8844169ae715a04cc53cb75c2bad8e6163ac43ce4be7c57411eed9b2c986b729af33285a8e487e26ca3254570202bb3bf4f19133ed4ce076c06af6867489c983cd579a705af7ab6818f7667ee0abcf222db7e2e956e26bb6865e7ecb2b25894ee4d27ce782c98a3dcb896ab27aa5d939f5dfc72441d45d384387bc2a162d6240eeb6d0d58eb039f439992d782c7743dfcd3a2427c24197656931b772cdfa9479e72b542b56ee393e3fd63d3552c798e49c67a6777e62fa2bf7bc41440b560f9bae3dde2f3df1da81b9a8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "last byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "445e1dc7a54c43c7aa5de88c92e5ad7dd0895513c042c3a76f4cb12231e35ed524ac846373c7ba5075518577c07063f0634734c8d5fe0ca3a870d1eaac6c8762796d310c5cc9f95aaefd1ee1f1d9adfa511ae4b3ff022eb7224f2d0b4a70915c8ae5fa3510fcfcf05290c9bf5218c39985df21a35f2f971f57f52e493a17817b2a683f82448db330c179fec67640607b4e4d8baae3a86c33a33b8f9f3fd558ac20f841a4d0b58f07c52fc25b98d5713b90bba6db7ba1aab130c7fd988ed81e56280ac4cc48ac165779a5d51ee976a28df0b29b9d5ae9a8fe790b779b9cf7cf4c8060f07e3fdafd120814788bc83952394f6a71ce3b280f065cf219aace434c345541486f05c4744b31fe747b85fe46484171ad66d81ff228dda873c49677c5785a2eeb4534d90113b2d4442af909577420de6a732905636972a334f3670109aac0d26aec70351312930258e688b8b191d2dbb9969494d1004f6747ccf63e8534abbffb0aa643dc50ae60eae61c701c89034ab3125929011420f1d95eff52189908c2ab1e9de77ce15444f5f1cdf9b6a70b5d4adac1a371ad2398f2781a0a5bb6d1c8bec564960050796ebe0ed50faa1d353e6ec959aec8fdae8b3ddd428c93c86d431af7ff53afa539a87e0c07db906692784feaff4a3c20c0f71486b25ef22a16fbe4b3cdd9de5c6c72cd02d1f041787f5052efa621bd89cef96bf48b0023f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "last byte of hash h modified",
+          "msg" : "313233343030",
+          "sig" : "7dc31d29d09e8a858c07924152b0f90f1b575fa9d77ee816acf6aa6c1bf3156bc25e0bae5ed6d9721604115c467f0bea762ddcfa0fbb45a1a9c97c58ce54963aeb35e63a9a26898ae3b08c56f24cc9d9fe2b3f80092cb18581867e4941eb1d1d5899c896327806bcc45ce51a6d5c117917f8ac50445140d48cfc1bd4d37e129607b3949f93463a72ff3dd085559913b73d734c406cb4d8ec5befec27cd8b43a5cacc5afdcddf48b0c3f99a761a74a249e23884aa5092bf201089abfc2b4e705a992a106254b94afa6946f6e43ac533209ccec7bcb2097f242ed4fe8448b6729aac6209b88ada4885e3131782401ccea29b45f35729c5eb810b35239d65696b761785ffd712118c2d1d2d858f7b1cb13fa9f0575b6156f330d8de9dc9431b1a48472e62cfddff6e3dc992a0d2cc4c25671f7e72b3b31d9c4a79187d0336933a6750d8a6d6d4e63332f6158d645b6b94b32f5e3eb23446e62fad0aec1a12b6e1e3e3a735beb31629305dca8ab9ef72b462ad5a04b13a3aa0737273b21fd94ac322dd2b01321f860dc0bb4daec423e3b824f76ba0955e1bf3c2b17bf4275bb91f3204c476a4dbeea928181f5038bb6e78d8b2d5bd1179726bb622694b162fd36e337eff3d41cc4d231869b3f4a49afbf1318732e5644bc32f9ee0f3990cad875d7c09b3b2661a902bca01169943728f0a3a3dfaf5f4aab9a8c9459bd19a6427a8fa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "all bytes of h replaced by 0",
+          "msg" : "313233343030",
+          "sig" : "c30b3f70a397dd8657bfc7dd49bfa7606a0c91fedc39f8b2b2bdf07dcbf8e236edba3df876d58ad90734e045ec3bb10eb6f4f0d04a6ea2b6a29c446d4be3dd5b9c7caf51cd8a591d5238ae252fc0eeeab8543572a7ed61ea77f5d619f696740b1315f2ec6a4ae9efb5a44e4028f6ec977a7439f1847b6a5341aa44b3a495b411fd9883b0f3c782bd4f416ddecc89c6ccb4faae810b961045d7dbd1d605a17ef5378928b1f4d2fdcde8bffdf6dd56bbc2bc9fe26d3f95794a6dc94f2b06521541f8d9e63c81eac921b90f171ac2a178924c45d9005c62b1134d3af85b11b961457c29878fb2442c1b48f71968a83d8630b14c32e9cb5a35c27e8ad6f075d42429721dd3ca7ef4b6daba6e1927aef2e3b8cea49c34020cf9769268e83cf098562fb7f70b158828d94fe4aa84ca5deebc7ffc8c8c8a4af42c556f50e3752740ec955b7020c3b9a6b406fd18689b62719340c68a7b63924af27044aef6879b725c97b4be9bfa794eb3572bbb48cfbc8bf6695f50f5a18b0f35968a0849bfff7b230595338e3c1f69bdb08dd5c05e8d15cc0aa1311fd726185b659cdafb4ba9b904532fa38c77cec9719de9b98f73524b4e9aa282a855f6932f547bec21c691cc2cba9e96da35b6d808b7f5fed29747fb1570fbe0c02674b1722a38434e47d7e4aa48267775e9a3e076b7575bc55b6dfcbf721a2a3e7a7905b0b486468150295e1269",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "all bits of h replaced by 1s",
+          "msg" : "313233343030",
+          "sig" : "8d91bcb5e22a56e39266ad5dd457fadb75626a69454d8606f52d11dbf016ab2d1a1758f0fc3bc95e9e6df808dd0a26f62ba25bcc90c756857adf66e9ab3d8e6af77c86921f63c7da72614ecb521e382126ea8a226c1eb33384d134561e835024eaaa54cdf7f5f4d751871fb2c61e4386120e688650be35c871dad4b7d055c12ef534aab68bb562afbaed8c47ac823792db900a5546c957571504cc4165648f586457623334c3b357b688cf82242373c5a7e48bbf92426e4d33c035a6de4e1d806577c54ad6874d04c5f48994875f41f7cc3f266cc896ae2ef5e875ff08da0b411a66be3e7a3cfc740b9855de42b3913101be2e18284997afb36832d62c8a4b6898b36150bdd24124adc8bd47ae722c2c2d479e13982c9c225616100305019a3d609887222e01c815108988507fbba1cf288703d47b36fe1e54c9f15838e765d95d46155061a10b055b47352670df7b0fcd7b7f89c5d98b5f2ba99f4ca11bbe1194998136c942905db13290e265a594fddb5f4ec3f7734f384bcbaffb70bd78c21faa0e439aa0b3d3ab70893a447337061243de88e13cafd02b53143330900bc009c3d173476081d7948829407502480c905254f8fa36a87eaa8f1265f5c49e6a57c9ea50f1888e64781f4ee821dcff7650636d6bf41772382ca9672f10c599cf90293e39bc80ff4910cd2712cc3ce4c7833cad1a671e9ada9898e9845997f59a",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "all bits in hash h flipped",
+          "msg" : "313233343030",
+          "sig" : "a71ca7bb56501b24e9152f7c08e2002d2b0b59c0a00e20e5ae030820caef502e0069eff23bc65449e13603241b3e06ca71dc0fa46cd7b4fe128486267872315ce4230ef9c4dbb9131d83caaa5eb80c98dd1f4458e71d2d6cc450f43d4049cbbb97bdd97e7d7ec22a2146907469efae344e94eee8b56b44fe5f86e81074c0efee8296875c95c6a780ad7a301428df907901b03cf58a69b3f7404b4af276ec5bcbcdb345b587bbb7b84f9b7c6304b59e9dda1fb313e2810e7e514c80a702f2dceb6553ac0942ecc2a9c508333df5b2fb36cf50ca7df780bba3b1668730e5fe829758d5f22743bb6b110fbad6aeda879084d9f3a519db5e2e4af0dd6edbd779856bd0556b9cdc93e3d0849e76cccc7cfccaa42d925c04ab6c75b58bbd513189b3b61238eb7b412454966a46920d78c20d7a13841190ebcb2d778c5c59ddaedb6c7fdf2dbf0ef244ff96a73ebb4028c1a3d89f57e1a05983aab15f49543cacb7424bd3f48f117db2ad0f27a1f07a65d4cbc43edeca39b88ff35d910bfd87f295f0234bbb1f8efd5b0b3aacb251b7bbb628bdf43cf8276d26e0b0e21bea693c778aeb1c9a2a9b9f7c82c6b0600685a70f881b4354176971e872507d916806a410fe43d9612cc258afd639a59c89ff7f62d5e795b1a3c8817e0859d497806433c2b8e00a20ea05a68af90967a11074ab0866f253f79de4dddb4e721ead959f1f74e385",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "first byte of ps modified",
+          "msg" : "313233343030",
+          "sig" : "a658b821e9f496bfc4d0773bca57118363c0cf6e520d4d1c0e5e4cd92f41f3e68bf29fc2605b98adcc37ddf1460d53a3ccc714c8dd29c5c5f30f234dfd0c2ff4cb88f998adc6801d87f2d3bbcdcde263058d38612d2c476d899297ff5b04448e4b36be9869fdf301f2aba98004eb6456ce5a277ee6408908cccc9fd10948903d6724a32211341bb4f17ef82b58d58d2519304eef3d7df172a317657285fdc3ea170951e5e0d672d50cde0f9502d6ee2d28684deecddfdcb65a3c6bfd4a213ffff97f291d707b2fd214ff207d538b40c4b07dafe059e96690578a86daa08878addd8e4cb422d7cc1ade303d3f3f43b3faf54d6a9316fa862a209d5f324763cd4c9aa4e1766ce52b688e7f32e3680bda51fa1f93404fb77f1e1ff14ffcbc6111f085501dc7d53c7b106d651b562f6357ebe217dc3d6040b57b2df4d811c9f82f2665c18b17497827a1789d9c8b26178ece684c9954a1d5880a0da8b338f111ded5a34f3d4854e39c8a49ba28a89b057a69911110854f247fc1f6b77fae7c454e2f6990e194bd43241724331669d41e6a2b5a9de2d29efbcccd9ae9fd912de728a3a8bf86b79f991b024648c6309feb0641134bb60724ccc59b02b3d629b2ff0b54964d4932bc8953a2da75f8b2fc74c046db96b03738d57d99f061301fa9d2549f9bbe990c8cd7e0b6a0a94e00f30cac6400120abbad679c761c7ba07f54098223",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "last byte of ps modified",
+          "msg" : "313233343030",
+          "sig" : "aaeb65102cbed1c602e4544cf08a44fd282abc4cf6981d8d43cf33004bddf16cfc5488a200ef3935bc42dc6b46a60975a9f1d2e2e41824e1199ccf371b79c91b8fddd43084d1d1a8e8915d5efbf1fa1cdb4759aaad092efbf21f8bef084da1d654f801f8f80051c8d2d8b79fa9ea1578bb54f1d9397597fb164a0316d0d3c7be4be714d0fd1bfaad27325ecef7573b77609c6430c8b1cd648ae574c58b232078da0b5521f376f13b34635a573bfc298cb010f663db67756a9d109b0cf42caf35345ca8cf1ccd15b98a66574c8c6d119ec26d08eecd92fa61c609c302c902a2cf9d78f644e9db3d99d5ebfb4561fb72c33e47bc1f5385362bba51972c1fd9c94c839a6c4a3c6169a711afeb4d020ac6029445a5275a72ffbc3dde7e1f93f5f4eb00492ace4f45feb7b15a882f26e36146a2f55e18a51e8ab329403d19cf8466bae7baf449b84b842e3d2e355ad81fead994b711a3565c9f416c8523c0b26300a53e2add01f4bdaad160bca5bacce95d7b69f1086fca551bb2616818d267a2f3351d17e6f64a896d53265314548c8ceb5f29829e7e2314c5ffacf3caabbb4067441f2cce5693c4c996d887326267cee4e7545535feb7e7cc8e3f36f202ae3210999d2b5df472e0cd5e811336c19db898b6217cbb3f102169fdab8629174cbf04a53690ee4d395f064c03acd7bfd054381198031885b99f51117108f8c04f2eef57",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "all bytes of ps changed to 0xff",
+          "msg" : "313233343030",
+          "sig" : "184964ce5d2c22bd587ef648cc499b007badea08387a646ab544ba57562444667d8d0dc09baf2ea98fd096eaff5dfefdf16e0fe09c88fd895804ed977fce48cf9cc963434dd29d0c612f7dc0cdab2b992ea298393dd3dccf5498100d149bb3b29f7be67397513d532bc30dd964f661726672f6064b657e42f49f6d5e9b9170a8bfd8c2b89a6a0cd1a1691b38efb719f955b478f468092425077d490ea067d72a975df78cbd91708394bf6c703e92995bc79a071023960e0c29de8dc115890b3b250c69242fcfb76bea21b1a72acfde90adb34ca92068a2fa2dbc5431f48b5864a20a6227d521f9ae0be92c4be7cbde99157c3d5d767993176997baba3c2a3254230b8947178640f87372184df010227c3a04e85a4a4c012fb3ddcf335f18a131a864b84dabd75fadea39236e81b15241b8bb220383c6c134de6bf5824240c7b884bf41b1819aa04df77c02fa920bef52c7083eaad216bf628b0f0f08e5b995a9a4b49d9b28b1c3636c9c1ef9cbd7f537d4e3026e869941edd77759bf254945bb095884fee365b34eb9f7fac3c496df866dfed6b07a35721c8248000147677e0960ba2ad077d5022382d9f8415368d79b4ccc28882bd8dfae86bfc73274448cbd0a96ee70650a48931cc16354ad69d3b68d821abc548e3d3c0a7e8808c88d7ac0dc792ba2236e092b994b9d5a7501f347716c3e1e17cbbf8bb9a3ab15c39b2428",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "all bytes of ps changed to 0x80",
+          "msg" : "313233343030",
+          "sig" : "36f38c26e0a23f6cd5c816bd3d3e57688c4f58126b4dc24d5ec659e76c1f97a7369317ddea841a3d90a00b69ddbc6fcca2768c85250cb64c5e10452c2569126c9cf5fbb66c6a98849eddd51c6fe6f87737554f1ebc99cfd161f727bdf9da0738af5dc076c27baef7b4b2af498137475c5100bbea7cd6ad83de7c6916a9cdd3609199de4e2f65d655adfd603b4ddc507d7364fd67940c293d84ac969bbd64e63a57f62a87f5fb3c100b0b3286a1c9d2dcd263c3009534ae05272815c6d9ff82d0fa59fdd91f6a06fdacbeb6806ab71556b4bcb72fce2bc74aa0e12f0a831e103fb248bf1dda7b6eae1d9f2197dcbda37c343bd679d66433d14eff97905d2220c2672d01f69c07600428d47284b1b1d0305ebbb78bd29180d5f54344877e741401fe9cbfb671b62a254811d21f7595f841c2be876104abbf10c2a06949500f7cd883268a1b46207de28ac102b58ec99e0fbc57c99449015ff2dabd9479b3ac796946d602d4cddd9569e38e406b3b3d47027ace498dbd47bfcff785976d4ce4fb0d74b3f780fbe8c6d8a6baa50ebf53111869128ec354ed4dc0719f3cca55f610c5f82b97a1fa443ba73066236610bb6bca882d46dcd613b0f29d4272773456fb35fcdb056ca053a838abf65ceba0ac0d0742bd633351c3909a9289de1f0539fa19c1823aac286e88bc8041edcdbd4b62612b1f1610a0d519e161b2a305cd33eec1",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "ps followed by 0",
+          "msg" : "313233343030",
+          "sig" : "c8ef89f800577cdcfa788084cbd57f070d634ed7ea5aa8c1286b22e9ab33f44519d6776de6b3eeb6d7663194b3097f428e8c52462549b64d3adc26beddf3283fe9af81c46f54fa5513b8df69ca951cfaf2eede4df6eefd39b68d2e5d40867a517567dcb0a4b954c99a194ac448d38cb792782bf07072baee13928a708521d35d97babb3c59095d3026e8371a8067e62bace0a6b42405a4f0e1b242a7ceb8b193d9e0584e4e231def3c1c727a999ab03ad6cc7a33d6cb147c7eab81e73948f58d550750f4d5de507f9a95c5f1a99cdb38215f4b2f22aba9a313b33edfe66473c20d3b3a109ae1ac618418fb655da69c78c56d0d8ee95ae8d569d49ba395473af9e76402a9f4b071b14ede2c28fe5666c7d6302b0914334c420274a77629d835149cd1ad045dce4aec198810ce4167df8123a2b124c7f5fb6d5bd653ca55eb88a8ca2d51f9c42df365cfd8287fcc1dce58f6051e33fb0f1219f02518cbd01d86b51132b32ac0c1a6ef7ae0edcaaeb4fb190817c3c7b6b865bd85995499aaa7d87652fc1b44d9dd49a545a5de0f5f58a4798cf022e97fc8ab28319ed713c3a11d42bab6e2af1280139e03b27926812e5c67e5526c2b9e0ca318fbd48fe951717b7a5e901b782a81253d859820383a1cdf1fb20841fad390e53841b236df9cc7bb665207689e51b7d3948cf924f92d05d2af4c04a8173f46407b1f4d1b1706d27ec5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "ps followed by 0xff",
+          "msg" : "313233343030",
+          "sig" : "83706cf470ac7e2ff571ae2f2fd618b5eca1a794be64eab576aa63e0195ddf9e6e5c44381e3a811387ec948eb2e9006d991a66dc80471f1b4875e014187e0eb1a7a497f06402f390f44b8a5beb2521ec90da193169eb86e44bef92d2bc11150cbfefe31fd9f7c6fe09f6cabde4797bcb861fc6686a0dfb38a51b80631fb25d7bd84c30d2779cb5cc6223b2e0ee8a7343db8c03015a3885b6f66057d9e9281826eb026824f0cc9059c1b21a1b7cc48b80a41713a3d07f85584cfa0cca6f65018713cdaf3ba6acf5102e0c22b2b839c8875f12db8d22c73a153923033e61a4e7c4031006194f3dbe8661428c810f5d1e93e815dce86200a3fe45525c308c5659e0d022dc0640df0591ccc5e704c8ba261fcc53d2c53eddb47f139dfc8f19b5fbbd4b498ca7b22b5ff6016b4c8f6b98e4fd4ec3bd3b4d90592a72d57968a21e912f597440ec068c7c27e7f57347d16644d78e7733634f4ef71635a1c2ad55a2448b85f1eab0feb92bfd3139b66726c77b78d5778fab114eab3d72d3c924112dfb0eb5d19958b1a60cb8f7379d53a6719b3d3a4c9ee2c2acd76cc1e5f3adde590c3e157229b9051b6d62ae4469ca3e55c184060862488160ad35c12d86e8d379c4524cead0d7b0268c5088e31717536f99cfaa7459fecc0247233d6fc890dc2f98b21f4e6008b8f89fcb119cc94a6eb96f87f057305549d18d05af0964f5285088f8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "shifted salt",
+          "msg" : "313233343030",
+          "sig" : "99d2525d1b4ca3ea27d97237c9edd75d44e8cff850e8f3fc8643c95609db33aab1e39bbc94b00e21cba5e9b1d19b5554ff4df42d7bf1a0dd979c9699e9183bfed23c958ea7799aec3585de698d08147acc84366cff33dc45a94feb6f42de9f75927fc74ad3992aecdc100ca6c04a83753930175a85c49821420919bcc392d50e4e290d5a466e92fce5a189b9c87cb10b764c9e476427bc2719f34c1266c446c2bceb10907f730734c0706ca9de348aa5cf7f67cf00a73aad4ab2a1a8b7ccf4af5e326a0aa6df096410855271069991728f367f3569a00b9f7a97151e0c1a5898aad3ae2c9cc20e06f01013b5e4221c65d8fece68e4bd72e57a5762733d3481a721f53041e843ba06e3dbe0407c99d1897bc3b20301e469091c2fa1ec464caa650953e78007dc60750a7a72f61b2c370af195906c831b9f648e633a5c129fd70608cb132f25d51261b62bd3a56ce9c9565422653300355c7d6550b05c7c579b6378a46f57fb2fe57f2a56943640166945530cfe2410bd6cad823c73dc0ab4ad3c3ceae4e2e15225134e47f375641346d36d94e87ef6e5fd31dc88455bf70107fe8bdf9a4009c2d7782f0668739afd9d090b44f599fc1d4da05483cfdd17a9ac55b959d3af20e55a421c7a5d7e6d4200202267219b62db2f92e59bd260383b944e89a1c1beb6d5d28a9d48f235f3bbc4f172a7497c3ca8cbd5bb3418edeef02896",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "121fc93905d9fb187962eb95f6f6c5871720195c624f11a552b6ff644d1eb11bdca770228afa766033cfce705effa5b081d125212bb93956b0d42cc67898be4b617405874f86847c793a4a8019eb1a1193d518f59fe85a7f1a491e68ef7b1c0845cd10419db3fc9a5cccb045e31137ed0fb2180239057f207329b1b60f04bd1111b8a9f7f5179ebf98d991fb1eef76753011eafe090583a32be5010898f24b7154eb10d8dc3fda6828782268a0495e3c0c1ffe8eae51d1106c316dac5a0f07a9748f8be0c639ff12f00af0f0fbf4f651f26298822e08d65b34db6d15fea7ee280f1262ef47338716f3ddd64ec7d7109e97f54a299f07e3e71e229c4bc0f587bfc6c9d3a9e67c16aa79359cbda18f70b21bff5d6f112cfb3a188786c26f54435063c86ff1f867ff8e9e74fc9ff849c657edd17153e71d78c175fbed9d69865faedcd5b1a5392beb932dfca613c54edc8e2be963eb0e7ff47e1bf972a403fb2e257be4bb2d1dfffc84179be8061f37477829155168b25d907c3bbebe2e7492d3950730e227d1faaf7cdbe0fec3f2f19e9f98842bb29cfa60b87d3dd02e51b43468715ec388583656eb50b93ce501daaab974eb191840044a204ab039c09c092ae02dc54330fb65048e7ae8aa8117593ababf695b9fd2704f31d12071d76f8c2bcd2aa14bde65a7ac1c785843c2391462ebae10812a6bb735bfb1f2ac3d74ea5da9",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "first byte of masked_db changed to 0",
+          "msg" : "313233343030",
+          "sig" : "290567b67c0a8c1c756f6f0c4b5157e1ab1c921af2d02d0ced12472404694c6a56549bb0cd3227c7f04e769c75b46569640f2504e2892ea270ad8bb102a001f7af1d1011d92e01c9bcbf284236151fda13a6072bf4da11f9263773967fdf3122a401e11511a04b633251516e8aed8de669a20223e0dd39a6b841bff40ba6af6934e9c9ca3fa2a3d277801e3483879640e16fbc5b8a5240e54d50b07c081f84d63b9ff9b24d703327a997f1a74098ae3e5a5a0c380d68b4a3437c7d5f33da1187e7b6ed5d9eadd1e1c2d60d6df0a0910e9f93e17f01bb2e643f451f36178a13193d057c0c8648a55002df72d1166771e1d9ae36dda2c6058bd9d2ab0a350be60b15a021a016f06dd6e6b9fc8834db10190b89bb880aa38e5dfb03bd122ea9b68ac13057c9f1aec75e90cef05602dbf4bc70d94ce7231265b3e846a2e2d00b53e8d6c04470125d07e782cf559c41d82f1e10113131d48f4ae091204ee81388af98722b17114a396764ea8a3852c1ad727de9742220cb3d111e0fe4de9a27c636e57f8343fc287d74cfa9e811762b4f9ff3715aea0a258baf4cedb89a22e1593eac18f34e83f9a34ed139158b6ad8d4b292a7e4d933b58bd6cd9277d93f67bda8f67be72fe32d1805fb33ac89ae2aa2864aa402ecbca8430bcd6d42b17fda76d13ee659a23a629bf4d0e49d5ff5e327ffd55584b254c90140269b226fe561516fbe",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "last byte in em modified",
+          "msg" : "313233343030",
+          "sig" : "c7a3f33ebacd1b82e186709375be80d2eb75086bebffab34dce599b3e97f59903f04443b1062a6884a4360d92dd8646e1455e95b33dad16854f744c4acf3e9e36f85f830d3a8b75e583a828e253c2d62df5c5ad4374110d6dd85426d86894f35833f37a7433f234ef966f830249dbdbabde11602976c1afeb321dbc46e6c481290108e97cc7cec2f9d62a9a1d0f00a26afbc74d45f6f137880909fb5167da8b842894dd4c933eb1f7db3402179bf130595679e260f38c4a33e0b3e9f73191756f4463b6cd159ccb0b41c75f9f405244de0aa6592563b6f0d3e519582acb1edcca9cf89b91589911e9be178cc29d429721ae373a49addc23d72057c6709eb0eee81a60de406444ce5f00783884caaceb1e07a91de1fc6e2b88a0c9e28d6eeb6c965d4e7964b24b09130b1a2536e117ba1ad3e4eab1bfb84918382739d3a0ad75f271ac343b37224c8b1b86ad1a62250072f68212e0bf1c9a3715e1449d44ae471db4696310d9fc7a4148bdbc29d264ce4c4696f758d4df5543f71ca182b0f4ca36ce1c2df8b574ae3a08e59d0c014fdb44c24d7bbd9d59b39ea7fc269c2d2b2163188d6339209726471fe297548b27cd3b6e3c58ac7bdbe3a792d858268275c12029c28148c2e0563c52061ae83749819e61dddebbe5dbf07e9e2e07503799cbac3c879d8508cefc172bb997d1a3b109d737fbc1c52975704b6f1edb2ba044fab",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "last byte in em modified",
+          "msg" : "313233343030",
+          "sig" : "29d54fda4344d689e54fd3a4625660b994352159a0c045d2b7345e0a6fe4bac788d54d0cd63a13f2374b6f064ccbb379fcbc771126a6d6cf51ad1aa80584046f6b33e9f0eba434d08531f091e314fe8e4075f184b156a267abc3909ba90d5c3e96ea7b3f191e38c631251176334319479a275439a633b61d7197aa45f07837fde18f5e2c639863c1a7689e6f56fa0131ab50c8021ef24ae6d936fb3da4b7c4993de4de3d0da0da8a19f1787f3c2ffecb11e505a60e2716090f2081831ac778a11a4b26db77f7659ed66f00f0c57e478dfe34663496eec5434d8872d16a65f5efe12107ce39225773488dbb8847bfc144672615f8ba18daaf9b4ff0bb36d731e1306e1bc7644ed3aa5820642f7a15fc253ec9fad79ce7d811fbb1959cbe124ebcfbb9d30127f0761585a49c772e9181d47ef4488e6288d17d49e759d39adff61debaaac8bf8e1c5149e9160a40078eb8f8ce47bcc0aa5517db7bcdfa4e8e2fc9825e18824839a2c30fd1cdcef0779b0f7a5da9af8cd315deaa40187a5c4b5a6fa009e1d9e288552be9f6cce448fcca2f011557ea101d41267c5df8331f585315cf6e83f3081ce149ea4813dfd11b217f3924324f34975b275bad2c8b8cfc670e2a8345e28fe3c1f955d88f83422ffe6ce28d5273adc1b30f26b7c558ae7688cba8ab24971baa979de2480f31812b990e14d8859bcce323437c8290bb9b89aeb8c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "last byte in em modified",
+          "msg" : "313233343030",
+          "sig" : "5905112430194b195a3698730332de7ee44cad62157ffb95f99aaa4ca39d972712ff27302a960d5dd5fcbfc3eb48d196697fd57aa83123d62030d27dcb7f481914aa20dcee0bde8dd070e4b5939c359f3b01e40a42b6c4c4f02ad64fb15da070e68f63cda98db297cd535b2ebd0404d02df3036ddc8add1f545a6b09c1dc1d9519854f258a478ae034d3416997ce939bc72206fdcf5d18bb46be8a3dd5f55dad95e1067dedfd7ebb4c05fd57bce7148bf374cad3af3af327878d27782659695459987838dfafc00d898743bba43db494894246366fae5d377c2e5d150c2cb061678147f3d2bd24641cb078f074f503f2bee7231283709dee766609b76fabc0d3d14c5db3543c12cc481972d9d01950c60d4de5f7c01e7b4b81763467f1b6a1bed4f06311defc24453053ade5a50c3dea0117456eb6adef4bbe8afd49d2c1f5152f80f7f76e72b2e2269d3080c1545cd8c7afb7981b60d63ad0c6b1f4deb6cfaa4e0db62684470ed4013581e497c3441c4e9b481d148c89b1872b7d8631b37520bdd900ffc13348c647a71cf52933e46184c5278e6752d9c2e97aadf29d57820eb99de2b050698932b5dfd50a581b3f80a2d39df9290cad87baab094e17c9ec340255ab855b15ce69aeda9080195be03d00a827b6f5f863c16558a407a49862c535bd24a911c4dbbaf2996b680b42ee562dd2f519123fefccbac1d2a343f254e8",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "signature is 0",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "signature is 1",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "signature is n-1",
+          "msg" : "313233343030",
+          "sig" : "c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d2",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "signature is n",
+          "msg" : "313233343030",
+          "sig" : "c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d3",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "prepending 0's to signature",
+          "msg" : "313233343030",
+          "sig" : "00004a80cafbe2a6095f8e8663f6289878514d7ee7daba0c1b0a077cefb333cacdf7c116ab89b0a01cab3161c68cac92a08aae7d117c9a3416d67365621da3380a85ff34a7a3b512846048acd1ec5957af942721c241a180a5dc5d8f6f6fe54d4d9fcb3709cde37081e2233b4fffa201d2029241932da170a5bad0d927a803a7f6289fc9f7b1d41cc1a6c94cbf588d5492b363920d0c98404f5da9eb9457648e2a4e9a034b2e2328c7f8c0e794771641a981df765887b5ba19b769156b375535911e1a2da68bb6a37eaa0ef8dded4ce3eac5caff4e8dc357703f0409d00baeedf3fbcbd6895dd3938e1f03dd9f131f9c979e22e4fcbea0c58721bc72d1f4976e93fc1a7649a23745c0310181031ac34b2200dfb4e8fe9bd4cdb52a23c31416745521aa4861eaea7dec4ea2c18ae9f75fa9d36c9b61bdc4185e434f8cb091cd731607b749a3990585cbbea2b1c0e0fff4f589a547d320bc7923b8a6b594c5866095df9c914cca80cd6c0e9aa3d691e2607f9de64322031ccfed04d9c805226cb476d3246d6caa1b04c63372a77668d5edf06365827b80391a6abd66010e8e1b873bd83db4dcc99444e109efa2414c6e5319f30a718eb43a1256b2142afa2382316e37aebde32da5bfec93e89d2adc39f62aca25a2289933a7cd8234d72a9b3c6a001d27560f8c8a2d9a233bac0b519b34f4f79288ea2cb08a87242953ac24ea144143",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "appending 0's to signature",
+          "msg" : "313233343030",
+          "sig" : "4a80cafbe2a6095f8e8663f6289878514d7ee7daba0c1b0a077cefb333cacdf7c116ab89b0a01cab3161c68cac92a08aae7d117c9a3416d67365621da3380a85ff34a7a3b512846048acd1ec5957af942721c241a180a5dc5d8f6f6fe54d4d9fcb3709cde37081e2233b4fffa201d2029241932da170a5bad0d927a803a7f6289fc9f7b1d41cc1a6c94cbf588d5492b363920d0c98404f5da9eb9457648e2a4e9a034b2e2328c7f8c0e794771641a981df765887b5ba19b769156b375535911e1a2da68bb6a37eaa0ef8dded4ce3eac5caff4e8dc357703f0409d00baeedf3fbcbd6895dd3938e1f03dd9f131f9c979e22e4fcbea0c58721bc72d1f4976e93fc1a7649a23745c0310181031ac34b2200dfb4e8fe9bd4cdb52a23c31416745521aa4861eaea7dec4ea2c18ae9f75fa9d36c9b61bdc4185e434f8cb091cd731607b749a3990585cbbea2b1c0e0fff4f589a547d320bc7923b8a6b594c5866095df9c914cca80cd6c0e9aa3d691e2607f9de64322031ccfed04d9c805226cb476d3246d6caa1b04c63372a77668d5edf06365827b80391a6abd66010e8e1b873bd83db4dcc99444e109efa2414c6e5319f30a718eb43a1256b2142afa2382316e37aebde32da5bfec93e89d2adc39f62aca25a2289933a7cd8234d72a9b3c6a001d27560f8c8a2d9a233bac0b519b34f4f79288ea2cb08a87242953ac24ea1441430000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "truncated signature",
+          "msg" : "313233343030",
+          "sig" : "4a80cafbe2a6095f8e8663f6289878514d7ee7daba0c1b0a077cefb333cacdf7c116ab89b0a01cab3161c68cac92a08aae7d117c9a3416d67365621da3380a85ff34a7a3b512846048acd1ec5957af942721c241a180a5dc5d8f6f6fe54d4d9fcb3709cde37081e2233b4fffa201d2029241932da170a5bad0d927a803a7f6289fc9f7b1d41cc1a6c94cbf588d5492b363920d0c98404f5da9eb9457648e2a4e9a034b2e2328c7f8c0e794771641a981df765887b5ba19b769156b375535911e1a2da68bb6a37eaa0ef8dded4ce3eac5caff4e8dc357703f0409d00baeedf3fbcbd6895dd3938e1f03dd9f131f9c979e22e4fcbea0c58721bc72d1f4976e93fc1a7649a23745c0310181031ac34b2200dfb4e8fe9bd4cdb52a23c31416745521aa4861eaea7dec4ea2c18ae9f75fa9d36c9b61bdc4185e434f8cb091cd731607b749a3990585cbbea2b1c0e0fff4f589a547d320bc7923b8a6b594c5866095df9c914cca80cd6c0e9aa3d691e2607f9de64322031ccfed04d9c805226cb476d3246d6caa1b04c63372a77668d5edf06365827b80391a6abd66010e8e1b873bd83db4dcc99444e109efa2414c6e5319f30a718eb43a1256b2142afa2382316e37aebde32da5bfec93e89d2adc39f62aca25a2289933a7cd8234d72a9b3c6a001d27560f8c8a2d9a233bac0b519b34f4f79288ea2cb08a87242953ac24ea14",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "empty signature",
+          "msg" : "313233343030",
+          "sig" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/rsa_pss_misc_test.json b/third_party/wycheproof/testvectors/rsa_pss_misc_test.json
new file mode 100644
index 0000000..a8154f3
--- /dev/null
+++ b/third_party/wycheproof/testvectors/rsa_pss_misc_test.json
@@ -0,0 +1,3521 @@
+{
+  "algorithm" : "RSASSA-PSS",
+  "generatorVersion" : "0.4.14",
+  "notes" : {
+    "WeakHash" : "The key for this test vector uses a weak hash function."
+  },
+  "numberOfTests" : 150,
+  "header" : [],
+  "testGroups" : [
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "88f4676b502e365dfd82805ac1db27d1107d1516431ab4f71107b62625b6275af4a5dbfd8314fae255820c0cb577ee2457f510851d2678e4ed3e6839848aca8b67c9ce52c5bf57a01b6683828d03470034b136e6ab1914adbb1d918fdc31f7cef6f44b0b0ba0dbd6c1d3c8d7699ce374dc86c28beb3bee8f81f41162344e688af0d91297da0dd5e8104a5440add89bdc6c05d20a164c0f079b78654f038d443743f94bc45762501034a32b5d05bb86e75dd9a171c81dbe43edf50b2e1fc24297375331d78a8f0399d4aebbeeed911f6d964049e67d89eec0e95443af2ceb37125ea8431cbad2d8416fc15fb9cbed9142fb8cb06dc7ceafac056cc1f6696e3d93",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "a85f06875b529ca61b60df404652e79a499f81a0591bafa3377b80d8e300cbae679a941832eb5569fb88c9f8629e3c2ebf5f32ffe43767d1eaf59016f5904de3f7d39cb470dfc5fb5678fcd7b55d1a30f716b7f04c2568f3c1a2bc780e974a363adc622e679902e966af183d874b35396423d1a263bb1c6e7330179671644c6953cd795a19e2fe4208e7da5244e4760dde142313a781a55b0baf866dc158812a723d74911c8717a512d722669193f8883b1cffac98de8473b7a77198e20560c0c21207e00fc7dd14385fabdd530d568d143ddbee8d1b502f7b194b9827eee9472f2be8b2a541124405582bff393412f6aba9c42e5824d7c24bdd4d82d925d066",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "8189776015db3a51805f6bf71aa1214ee07f7e385510ea95a0d4c3d53bc0d59f07ca39af40fe8c3138cf6f4ba0f72a3397df6ffda9cf49e467a34d92ec772f6b6d51d52cef86d16f74bea798a85aac873cd4d5d3a0fbbb618998f4b2b691bc14fe1f235601c51a76c4eacd1a33975d9c3cdf1daf579fb943556f0febd948d1b1e15cc85edf486b00499fa9032b6b801b5ae4454c94d7f89dc1fa6dd6a927969b14a4bdf51caf7cc8a87ae05d41e1933849acc5fcb0f478f1e23a0f476372837ade82f8ed1809e2245062009b8e683f563029ddb9892a398dbc2df594c12fb4a0f0c551abdf2fee4cb325fe9800ea741f7b2f2b4db370939bc7e3ea95ab539b10",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 4,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "49e060ccb577eb614274db1ad34249490d1cab2b8d3ae2b708b93c8a8ead302e6efb8d26644d5caa5f62b89f3949942d07470c37d8878eb5cc9c154701feea36ac66d0a9723fb316f7ad6226f634346c17ef47b3e19c7b9979d60118959a5b35cc188200c8f9b2723046f480d95a9a0af07e648225dc35114d8199a431ccf4f44fe8e8c9c0130aa819aeecb09f95eea8f6d89981c05cc82716fe7ea499c55460c95e99871aba1ad3ac3bdbc96850863b23e3e6659ca346ee0e186ad717a8ec9c7a548d8fed0e7b79f896722659ec7e1335de12f361d5e6c65c791441c3c0020de48e60f200c3ab79fe0179513b2c1592e2f0064ba4799f6a0eea199da77d174a",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 5,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "2d4216f277e50736d41cda2191faa97fa99d9e325b34926a363f8dd73c901153f087ac206cf3cb25001dffbb6200b7b35565b466f46f23aafb872e5c39d26156d36d1bab19382e5f15873022e64b58c129d38eee8126130f6210fa5ffb697bb3dcddbd99a9b60b53b25d094f9ec9b7a1cdcd0cc74a3ac478c7a34cc22c7e30e952bfac85638678b8aa2341fb1f108114d43dc849d91a3b174b0dd62f6dfb96459d4c76ab5fb6479d68d690d4a5c120c42a4bf82a8a7e9e7aba127fd5fda3f4c6ffbf2e4eeb72ee695cfeb286ec99e7cee8cf300e4e149cf17e70cf9f2bdb6421087916e945bca42a70a88b1a87e7ca3ac0a1bf2ab1a65ebab7726994a6c9597e",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 6,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "b66294f7b1e1a673e566c59f9abf264860200763860cbd666e476dbbd61fc39136353ab74299cbfb64bff88ed51cf9a20694e832fd97235d31ec6aef386ad44487d3753cc1224dbd59a34babc3eb8b538c10705775a27fa88ae35c0f618e0b3c6b91d999fdec5b86f15d1e462feea3af6fa12a5234d526e82039e1df013ef1cc6056221b81d755a13b70c618cefc6dedcc3361b5a910fcd4a812ae48382fddd75d5b51ca3d243dac021aeeaf6e2bd4aed75d7ff6d81c9aaee2356e3d12192b5e75d006b124275b0daec06b5af29b0d3e85f057db59db4b887fdd2bd0a33865eb87e8f3e37b4d8621e2e41c760a973f1ba03722d42bf5b921380b71fea949cf0b",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 7,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "513db066bc72893653d1f7fa3f19546281b6239bc8390c4984999121a1dd75aa94004c3874beb6327205f2ecf8f6eb93eab018de3a6c71ea8b2d3a628188d4aa2b1cd6bab169f3e78229e4383ab68aea4635935e0eabbe9dc1d671416945f1867782900da53451369ccbd548c8f756e7221ee7e1ff28dba099b8f28d1f3aad2ef8bd816a53dfa9bc88e4e3983b0de955e647caf71a607ffea20a9677e687cdda29219c7daa839276de3fe436b96b2c68db64c170ab9e300ced00e72a9c0fdc321a517aa113cdec8e2713f8b54ee2d78820f6f86b2f6e6222493d15cbe8ee9815ef2e7ca9a6ceb55955049db35b1af188b99f2c4bce38f130a75780f41b852917",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 8,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "b3e943f3982a29d0c1e241890ebdd9e734baf85bd32de80c6240e34dd1f7f0ca4f37fff2c373f9718e7e900df224d155c4463c66badc8fc3563f36309568436bcbef1d83c63e393d9e1432d50541d45e54b7af1b18cc819d9eaaa65a4b1e4f37ae16ec75e9f44a07262cf3e2dab85a066d92b750ba1cd2a1d42493868123f18017bd9faf1de1a4f87a3f9cf744da1eafc761b7e24c9929d3dfd15d1b08db1e3fc64932816095cea495e0dbb82842b5f3ca90dc7b78895c1f12ba991f3bef6f16451a84880fa31cdfda6b9624a77a3a0489fcfdf6e07b89c0689b5b7b7052372a2b1e06a3457b027285c3b160c0de1dba4910c0162ae8e737a3d7dd1e05c77ace",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 9,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "a9b9eef8197c973d6a73bdc165f40f0f53b05848c93957aec2785fa92a9cc6397418a71870f1bbc21a39b244526b4a39a538d149cde62bf8f21f3eabca932751da83120136c48073792c55e2eff4e29e6973cd3f1090c5bf3ced02a1ba4c145addc674d33b0a285d73d14bcd6f374f60c95c4184e2d57388e9c73f697ac0af5116ddbf5081a8f99ace11027835cb3df8ae785491f42850de04b3e01b9317bd04ed488ad72e787c728b4516c7d839d388a2fd7b21994ff3f5b7f264413bedd3d8a5258d2b39e60411de1ee69fe05f4e76b23a9f50b49f7043f9812aeb81cd54cc1dd9ffdc6e73580e2cae821579ba3642ff7793a3995b136e057d2d2ca7aefae4",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 10,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "899a49ab1511bef8727d1ed7093bf7e6a77fa8750d047b203740324d18fc45b587d3392bb7abbe7e6bed7bf2be2fa5e355f8ac5452e675027dbec1835555d059a4ec44120f499e4951cc3fab33d3e8154a4340d29c69fb50728c60eaa58d61b75cfe7efadbff55fc0edffb4af9719cd1a3b2a240936eb6c2ad70b10b72aab7e64d9fb17ba8fadb6f4f0036bc22d5779705b02d261b8c9be700b65c066c27be02db353f4ebcab1ccb41c4bbcfef39abfa8999196951209558463aab1c6d4917ae97006199daaf963666d85c133817035f36ea321714a6b20dadb355a226257fc0abff10c9afac551bb7c3ba9e44737f45ad4f9b7f2db002afb7ad61cda0d96538",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 11,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "a9cadc9cf41400ea2a91e86ef6e0715fe5669dd6a8fa3aa50036e521e0c939ad9530d15e52b10404cedcc5405e7178a0444d0c5d20cfe4af10f3c07c10ef0915d05e02c62e5d0874c2ef37d4176655f63f9a9dbc2da1561c09c995581cc811b5d7621e84bedd7546d346a7a0b0a65d7f38f101b24303da0b0236a7c78f4026cc20bb32dcf79cec7f9a88661dcd52d5b209bca191f5c607e8d8e1957d779e5dfdedfec49bc2defc0ff921d5f7e875e5df46f0687a05f03b5ba5ee6bc0fcaf8d67592a96c0abb2f9a99616955222dd1e87ec9aeb4b160ab5ae96afc87a65b522c6bf4d8133901dc3a9fa63acf749ca06d00e0a8fab39a939396cdc70f52b9863a2",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 12,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "807285dc6aeab0a5aa0a7667856993288b9bac9544136a5757c63b23715944df3b9b77953ef1db296ff26d87ff3dfe514e415d9f118fd09e7ac518f982736bcc08b558038c771dd1c1d3b43df922ddda57906cb5e6f5a3ed677061787ffae8eb1ee2de41b5e58f5a012b49937af8d7d44ab5f4c935b73764fb46daaa346c54109c224e16f9c53d3bc4cff2120fc3e0907984052f9e33dc1dd24a171b202a52cdefe13e93cab145416569b5a6a7f29f9b7b36bfbac41959903d765bc91c3c10b645fce9e9893ba1e3325df764bf4ef0f8eb3b3a20701d8e417a86d9b859f2a318a66ab923a49fc25a511900a149e89123b488e44d8f77abe9e7fee56286d7b223",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 13,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "9031c063103542817542fefce9e30a72e9f14be94ef2b7a1df2ba721a9a4efe31476684a491e4849ee8720c1f49cdf9755d549b63fcc0e78af8353bcb42575abf92de06a308142f212ac987d42d5f622b8781c6c215d3760aa4ca8441bb3f4587da6a7463ea9425a45876b0470202315ec1881dbd4f1bfa40801dfb8898561a6ce6f88698dab497442f1ef83b1d3540cc3b0af139d5e125a88646f0dcbae053f6a8fc29a2f083e81d61082812121c3e59c3072a76d4ba830d4331105355693f561adda1ad8278ce0e10ec3f7a5ca24e31d839e4823c683e14d75f764872c2267623faacca1707f4038494557df84cdc3fd4f93e4a134e9b53e7e80ec1d60556a",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 14,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "9dd8855b0abfe98598937629db4455c561b074d270146d6af837c709df76d42ff3e0d50f04f7e9b3c43244e4a893f0d22d54c58b121b78dd604d1903c96109f372ac9162bd0e4188992d9b8957fa08ad9723758299ef70125f916da07cd4a696a16340d7575e4fe6d57365c2e4aec1a5465a2ebc7a4a7b3d83d8395fcc36a11e8337878477312a7fb4ab81b70cab24ff98565559846706a42f2c07a555e92f86be89d7704a5329fb8637b7621112109f42e49cf5f9a059a7225e2587ac41b699a0b27fd477e0b1dcaf8ee88291d62f41692929b87513a5d8e69352cf6e3031f42543cbd9d8442be3c28dca1ef8a9b7e51ba089eb691f6054cec55a8e770158df",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 15,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "a61ee300ba0ee8bcad3554a5494a0ddacaeeb8f2e0d4c71383a2684f21a260df6b48d712d7145f62468cd20e3dc70950d89a7d8e962961196e53ddc7f1da53766732e193a7e18b08ab3c71c3547ac5a640cdb9dd3a2dcd866d8b37d57549b17a85b1a97271deb8515324ae30782faca29dae55d50030b4d5eecdaa65b035c048a32f01018a865a9ab1392b477346554ddb403dbc03fd834b72956087b623cdb6d4ad886985576ef75d186d78d50788eeeb70a0c65259f22d5dfb5d08a9c86d6055874b4e38671fc64a36083b34e0f5cc51c26ad876484c47ad7f8e7a524e967f587fb0ada6aa1c06eadb0a149923912565f25031f9c5e721ecb68ff2653e23e8",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 16,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "30389051e99e04c06b5e92773ebe85fe1432ddc868153337a7df1f429b941c779049219a25db26c7ee2f189c4a9b71e690317fad22174b45857a7dee66663ccd608d4ee3da1c26f0f0ce1e87797bdecefd1d794c782a7cac322ad38179aafe3df4cb815885c391b6265244b45a7c870d1836bf361eedaff8995ca882709fe9b32bc08cd6246d74441699bb30462b9df9f74fb597b4d953ae3a4a7f060d464587ccbda79096df38ddf9b10a68cce11d5304d648ba3c5e8e111097a54f2afe1f64eeeec0db303b5f9f8863c300c33a4960a0664b59f18016d48265ec24c6f0bb2e6441262e6ea7afc80ba5399e850fcb37cde3175f63383da272f1f692cd732ca2",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 17,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "2dff26d07bd2e3de20c8b6fa527e9fa16aee9cbfa0d01cd71a0664727bcb505d0518314856c43c602de0fc4647be7f496abaefc1c766fc44f6572ee2b6ae3fa7d4f23c82703d15ccf97e2e8dfa0a15a3f3f639a2f033910ec04494fb2470ec1a6cd7fbb348153f62766e2f84c1542c7e32d4d60d24eda5b26d513f49bf517aa56e43d05c8b12f2de93c36f56bc87f786dbea42fb960cb4423752fb4a811eca396d0552c4f36dd692e2ef551778a9de7843fcf37f767e3d3f63b139a5aa40d8713dfc382a5329b4f90ce43078cccb6a03f18816ef3b053006603cec694bd6e8352c0b545c436213ac5e4cf42b2a3abb5536b68ec05b3cdae133c7105df461f4dc",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 18,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "545a45b222868ac1bfec75f48c52b2addc0f564a7ed54ea7c2805a4640cb54edc58e0b6dad1aaa6b629e2eb4c1c56d53cee00e61ba5596a429e469df55e5964fbf8ce6e1f36ac6adc4aab6663f152fca09729c314449431e96370b51a76261ed37ff264ef4dc9891a41f866e53f98617e496e92bbee75cd2651953afd65ce6d2609f49cb201872ccc6b8d9b853e442bf6e207c394dae3d180bd7126455fe8bc08a9c8d79a97a300884b88e1e2979ad17d15968e80c7b6eaebfcbef488fd4604f24685fc8658560da381ea827d96c78bb17d9e5d09c2d37d61275fbcc333daae6cc3c35a45f7f8d1b869586075ef5f90f60a6e9563f31be4ee6f54c1bfcf85079",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 19,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "40af2e3149996f2bb055dcd6ea3e3fba2d57be6424e206c213abe5b6b3ac7ceff049018abc864118d90c5028857d73db67b94e60208c4304f61412bc856ee76e398e211d5c4927145c3ee61ae101ec071e43be9bf17e2de03cad861f461193efed7950794eaceeeeb34f4944e0bedf1853123557deac03457811270c7925d0c50eab2b6dbe000542fcd3dde5cc8563ecab6ace85bf1c535eed7bd67db0584bd4e911fcd3ff5c4059fe53dea7b382f953a4905d481af39beae68e418d2a4c0d75ed5949dac1327eec5bd9d0fdc4bd9ec67f38f2a74a4d38f0760d3e19eb9dc67c96fbd43f1aa8317aac62781738504a3c0dfa5c2288cbf9a412bbf50025cb4630",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 20,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "a7ae22473e8faca5602b9f8dd4e9a235af3c734cbcd2674f19d9234eee077068b2f65b3ed884e1fabef786a559e458e1fb62990c543f987e09ed482bab699cc2fdbb19397452ae3c080c315b65c61ba0d2088c776ac4533d3f877e9d9bd58dabdc9b557b5a2ce2e90e6a8476fdcc0e84bc2d861ec2e09b078e4ae4f32a0c7032f86f9a0e064a711999fa4dde25ed2841d874b172f6fd621c328413d4bffb3f6d8de7f1a329c816702d1ce6343f28cd024d0d81544854a455f337e10049e9b6366dcf96e7c47c1bf3ae0b9f041017530d319cff6a83c7b4b073f6b2a0034698631b3b103bc296773602c198f17b9233b6b8360863a716ae1b5ba54efc7835301d",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 21,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "432ec7a685060666df6bac3f47d8cb960a70b1f8fd4f161da5b3cfb8fd44f83442a1ba43ca8e748a59c6c7ed7924dc0012bbefb69c97750d8d9144b4cbde2394f4b90502c1d8d047355a51265913838ee974f2386ad46531955dee655b72d470456c8cd67467c905cb06b7d46ef14fc8c9cdb70a4d90820cd80cfde02eb164542e8329dc927e199d0f2ca12cf4feb2414eb49329ba397bd2880510329718c558881891d6085211b6fab614847fbef728e961c8cb710d2e0f4d1f0b292cd372f86831c783755d149a511ce619e3ba09f41aa45a47699f266dfb8c15f90e795db4f78d97c29358a037e330ce7b59d4e34ab2e0bb84a3e8898bfce5d585b9b74f6c",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 22,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "3cbc0634c9ec2732ab369624ae58c3a5c18ac10dca48732a4428a042e8b35668b119d24a5e10b5562ffcc6a5b6892a562c36828658b92037a9d48801f0694cf46535825fe450d26b55866979fe4ea2238550e64b2ae639b533a9b4c7c7c9211c8adb41e8e5d0c3c001f50d025b06af353ca11d7277129b6c3d0c3592aa1dd3e6a3371585b0cc97487a8310cc1403dd0dafb21ddf1f4983512c91f9eca9f2c83c376963a1340d4efc61f3ce23bcfed6fa01223b369f99e13003b9b9b78e54ec305569191b3dd2f7c6b53151b5e446d72b5409b18fe4ac749185feedf30e5db3096df982b76168eea32e4298b75e38caef733228a604adeffa8a878468722d36b0",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 23,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "02d5a96749111200cbf977effa208876f80276dc90804910a4142399c24f46060ab148fe7817558657c459be7a59d01b1c6bed2a9d797e76d3eecf3a9099437c73de1ef1b14fa24304fb35782824e72db1adad75e0dc56e503c5a0ae29cdd55a8a6c29594153be4f69ba6dedba71dabbcfb5ac8de3b70cf82aecd6b03db4f9a0d3e7bbfb90b5b3c750e4f33cd3ecc713f8cfc15eacdb5c6e6db41dab5aed521fcc7188afdf059a7c3ebfcd2f1561baadd648cd6bdfff00b6c80130c5a3ecc3a254f8ea8f484520a0522f3aefa0fa79496b8d82117252a566fb9e191c0482398f16be513551e7a6afd9f7f2f1e89adb2627dedd96ead836a8f88e0b361ebeebfe",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 24,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "97c683214a380bdc8701717ce1c4c0bd6b871fd65eb495d449ced17568b7593714f49ca8110281a1fa8b91ddbb40f85c3f0dda165bbac3ea055c8b06a0f4fb887c597b3e9082607c5c9c837d0034dc6d3a0fd4d472976b81a0792f1e31891691498c07dfab88ec72e1ae0f25467f9a4f532493d9657a0fde2f88ef648769419e269abc830e9d6b6d70b0e398cbbd05064935ff71d586f5c363640da6dcd330cf19016aaae85817311fac58f8bddb304c74e0392f2d61ef940124d6a337a3ad6be2bdaf83955474e7f0b2ca63629ef446c9355ce8f52c3c802ef3e160002ffb3824bcd25535bc2b639a4e609e3377e121b3e170e423d3f827132da216e21292ea",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 25,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "0d9595559acb85a317dd798b6a904ec80a2f9afe5870d05e017371408b101710026e149084dd0399a23faeed59b18082dcd3ab62bd67effe619874bebfcb2d4fbfa44e754a4f1853396fdb79d712f1d3a1dd3ff6b0707b9489694dbd30d2fa92e002258d461023f1564c4964c859ed56f93ed42cc7c022d05eca29fd2b0fc2ea252b7e2a68529fe27da9a7a900f18e61fbb2dad4da8816d52746046a6515c29f63406c13634695ad07aa6d2be0abfe0b8e10788f2a3a31e68129bba1bd51cff5c980f6c45fb36041c07b4c863dfb5ee832cb5f3cd870205b23c8176777f4078b2655a0cb447ff34ced584f0e0eb4abdf2f35fc4523a52a9576c9d15b80a6d54f",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 26,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "98bbf3028617ae1a57a689217ddaebf56191c686f8be8e6da7bce27fdf49af2b9d826c64a43f79fc7c603c5885b0c46ac2d175a7662d9ba3d82072069363cd93f7d3a0d61375e16b5a5ea1f18eaf7307e3cf8b27528aeab9d0a3d1900e5599d9ead68ede88e609c213be0a97642cc2dd6e6d2d6cea5b159ae35c42630fa9d8ddfd5155c3c070e12ec914273ce5304f8057eb0fcb0c595d895aabef7abaf6fa12eba65059bf2ed86b7064e9a279bf9adf94b894082760c5e9c15a29feca66e687df5b68e54f3bc0609aa778204fef7f8ea957c0ce1a883d1c8ece6b6b968b5d2c50b726c43f2882cc76f083647ca259e3cb33bdf1fe38d7bf8cf70da5dd9248fa",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 27,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "740edeef36d73719e813faef24d66f1785b278106db66548d311115ef8203669d2eeccbfa7609d9f40e8bf4180612835d6cb07b7a6c70038936334e007b32d3b84fbf2d78dcfbae22dc5c6d4849e1e073392b02badb521247bff1c277cbabf1421ee9690a236efd5067aa3ee0cd7a3ec67cc80166bd928ba14b1105781a74df09928a816e4f2e66e9c5e45ded285a597bdd65159d87f54c8849291cf50d9aca1b57e612f7d4284f24eeed1277c43a8b1a7cb0a3ea988696afd0f14a0bc1d172bc19d4abbeb9339b5a7b8637a88142f04ff9b8d011f7b8fe1d37f75fe3ffcf13bca3c481d806839a520cb6e760bf21d28da20f58742f52ff5459293a70161bb73",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 28,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "71065afdea905874489d3029ffe3979564b3690e980301717f29c2333aa029dc93dec41c26cebb4e28bd0b4beb5843f6b14ecd803d5e49b3223174f2adeb87a69a20977d3bfd486fee88d829e07957648da5fe6c8cd72d0dd492b2242afb3e9578a415b65c9160a37501e22890a25b4638c9cf9685f49c840a04e8bd99f9029be57523e05a3e35de01c7454a06493b5249b4d5be2419a4ec166f6a50f7dfd7a5852d05a89d197dd37efaa3ecd6c27e0786532fe977d35cd65a4ec2d79db053d667e61793d0719a1432b0c0ab66fc3e5dc6eeb415774c1acd448ef95a3be4fc34083891159cf6d630bcd6d9c78eb596caebf963210684ef43a6a64d4a832251cc",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 29,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "2d01cf0fd2d3f2561b34b7eac9f34564a33267a98b2ed4ec00f07197cb3332a7d0cd416e221acbe3b40e9599eca87cb54f1eed51e5cd70ebbebde573215820417bf55ce998f4121da2851fe01477c988553edd2d85f58d7a24ace99ed1bb440206cb30067dd931cabcc3e3bebde0eea9ad1825690de0c5b2022191b978484379c7aa30531d296e6351c61d6be37b04fdb6eb2f11afc47b9437b5cfbb6a6f059c9f6b23fbd64105adfc72662325b5abb446529216dbe772a3a363eeed2de26647652bba01721a5b875036a75a76665031bc26a97d416fe564ec2a9b808553929e48817b6679abe7feedd41aa9c6ed79676c772f0d8acbce65137b66f45242f31a",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 30,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "552c5ea88b09b51b8653fd164ccd3ea62ab84abfe22d01092449620dcbaa86deacaaa7e40e22b16cc30113cee21b5e491c8afa3806ad39da88d2cd116b25851b57c26c6c6c8580261a90150a88928e22524e731dbf979d7ec7bf70f853fbd3f77fba86d5fd325eb41f12c28416c2125e2bcc68297bba44b41dcc9239d93e5ce9f067f93e0f817d439cd17837503bc82eb342fefa658d064b21d14c6f7ee9e0be061364b3b73e441a6b610d63e1de6627276580861b085648748bd575a33b0e75bb9bf2ef699556bcc09f1262d4bce29b8b508aae8278d9e663818f2745186c33733d9255c5a54aeee8f4180816d8fd2aa0a9b9cf22cd0ae3124eee81c477a6b6",
+          "result" : "acceptable",
+          "flags" : [
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 31,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "52ac571ad2a54ec76a1efc430f87a914dea50dd18bcf82892c93ef233c2b9eeb1970229f3e79086b51d9f1e61eae5b589ca3dcb140189c79e339d56e07b92e24fe61da02c395c651e6f22e9cc618592829ac07883f1edf120897b0737adfa129442404e4bcf23eafbef3439a7ddd1396f1a7ab4979e2c3baaffee936a47a4d74034f6977b9703ffa71de427c621ad5ba6d912aa2dc5e581f2999566ae0abe5a65a7a819de45cfd701c8e1bba727bd777d2102d484caf3f6ad72f400d1cf078e97759eabec691a529a3548f55779b5b9fe7c586590bd44abe003b71dec960c2cfd9098dafa329c2a75c8d94aa0cee0b91680fe3910e5239043276279c701b8aef",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 32,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "58952e6e15ec300c02758a59518f619179778fde614a3e3ef742a6b9039275cc8416c26ab5fd24649ed22def7f9215994cd3ded23459ae4b31c3a24304401a8ae700a22bc270c89f4300506baf4f813396ae017a5ddb2b0477a5786d425a96e967fa350adad596f1ae0f8148311ea14836c36b39d331dffd7453c6f7e79092c13938d90b801d41569bc4d14a8497cdb4292c959663474d3c6b391e5e7ff301647afb4fdaf8bcfd39b4e6e7632dcd5de6ca12f0c22c4b2dd16a74a1e814fb334ee4647cfea98acc691e0fc18f0e4dcd9354d3a8f5a1082000dcb3ac81749bdf2184375091ab31e133216ec0cede22adead906f8595e85fce5f28a67f7d6f11249",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 33,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "5c2ec7ab93afb7a9fe2d0e006597a075f8ee01ff04bab318a3e3c489878bcf321f681d123a7acd0e5eb01f8261a82fc3d34fce1a36560d0859d39ad9c2b8fadaa2673b7faf0c0b74eaef13f8a71f4b9729da1e3d444cbf261db415b59374842789dc60b1fbfad43daff40ebb4dbbdea400cb506ff0b75568a5e48705d75abd9b7444178da7ae901642835cabf86b22e55a5e090664a90d6a78f3e3ade7a72754fff56f2445a014928131ada477420b38951389e84bf3cfeab57e864513ca7247323af03667cd9ca926dab7eb51d24c25918f4980065ef1846cbda3a39b1020380148f70a0ce26ff43658374870b51854b99be2d3315b317efb1390c7c13e871d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 34,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "bad4437432699d9cd3799c29bcd959683b879287eac2b52c5c263f46e2488ab5e0be517ff7a5bc59a5fb217db5602107a28045f08ee9286afd3d61970fbc12feac76b12f75f17993779c8c3aed862dd681665f386610c59a4b6b0e639de5fb55e36b52baf3d9e0ac150d3ee30be85ee95580b34e47022c517a96b14b93a64c4a129def11c56b34f60353f40c813f60a924ea0391ddb2770cb00915bdf33e3cbe6f2e87840e6335b5d8dc3d1a25daa309c5644b035c46416c75460f8ed68a0081df5140cef9533b33296f6271781c2ede182002165be862a2f4d8f5c31d26dfb6dad56cdcf269b4e3143c152dcff6ec80754e22ce2edfe7879a1eb1b83077de98",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 35,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "3b45f1326d3b0bc5101565b022541f836adb79c9e10e20478b1be6a32a54dbb62a5c56c92844f46996289f85501e1a681a29773667f42e3f0c1e79f14963213ceaa59282cb0d2961139ea912faa94d3762aa928a03c88dd5678373e39d182d8690d9c9b8287622fd354bd5d288cb4bfefc7fb5a3187781339441b358b7f0be6c884868b7ec47352712297ef191ed4e55e1c8e438eed1dec2b57907933c14ed5fffb101cde6007c7823e804f79c34db429a55c2861c2c8a4606509f7be774d1adbb66f640adf16aacd61730f8095905ee9978f379dea4d233b3bb0d7a0feaf07fa85a2864014329d9d31f29cf22aa76c5c061ec41e4211fbb5fb42c8d087bb917",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 36,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "84d30ebddeb64f5fcbe17632cbb692c1222c5fffb54e37f25bb87c9219930f5cbda0f762889a8989b8b23fc79eee17d8e590206d55b4006ee3cf4d79aac93ac5a3fc68fefa280b53368e16e95fb8629653d76991609e42ea04f19e19a5bd411b2ecf9a18de945c695407f608c05169e2e200259a6cf43014485b86d3ac10b22783fec39188d39b5960a97a414001df8381cb0c17b1ad05a3a58175202e2cd8aa6ca3131d3bc0efbc2f0d5f09925080da539b93980497816bfd042949acf31fa2705a63d7442cbe1c281328bf58a1e31ac69f96d67cc31856e22b7fafbcae2b6223e55e2c81a5fd67d74cdc8ccc5c3b6fe2d8319ba36ab2da9a8dd9720384662c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 37,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "080c7363b801b6bc22b04978e72ba6ac9c55932431594a2f80e7aca117c51bde990f02defddeca373394829f41a9d49d62fc1593f99b169bf6f8dd4daa149eb2acf6f470932af5615e440f7b648354f081d9b82eade009f52328194eba383593b60bc50689449eb7d478679dee267ce199b3c99d4b004fe308102dccc09fe041c125d4d6c287dfba9c6c40a4a1421d5f3734f6ea09c85e994b1407ac8c7c95b0f78925b9604027a28ab2f921cf1c9feabf5300e826b383b6eb11b00b9a378cf360e760c4777cc8f4467301417ae07556483e4e47ece4e7487b188e2a2ac95d85a77586aa12537436ab2e50bf7a4fd7cd577421fa12ce6f4b69b97bf248d85866",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 38,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "676865e033ad3a73bcecd236a125a8305413e2cc99db2225ac87f7f0bfca644d87bc6489295730b98874201f0889e688872b4c30a68a699e883ec0adc5c38eed5b90ef1ba12a930de42a9bbefdcbf3bf9cc157ca950b9e927841df138f89f874207c2595e6f7fd4039b6f094ac0a5f59ca5707da5c3230fc740a195b8db741d602d5b12dd0042869facc1e05c03905b7be9ccf0cde94426243093e1622373301542c96667f163b067b1b53db10ae401195deb9d1746748e5f491ffc7051c946a245c4c1d1c3f880fe99f09c8a90d9138dbe994785f576d79bb3eb3f4be15de46ad4a8073ccb946e284dc2ed7572d90d8a841ca0dbff4bcae1fc307fe17e87d87",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 39,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "603bf778b29561fcaa54f5ff628c5d257e0212c6327e9112cab8cf2853146fb8e960601e9613f57baff8e64223cd7e0026f66188878bd35d9236e9de5f0950bba51be06eee37304081a36ef7f4f7c9404956c40d30b3a4266a3b25898f546f0f6994c54ec9497474ed04dfb3a24a4938172d877fef56c3e6e11586a5b920c1538e2f22dd4c971d933d69f5a4742e3b23e2bb56b1253b67bcce761722b9a026674398e7711f9ec0415c75c80e3bf38f6991b3963bc4b89bf3f041eb8c894ad12790db35d24c54a4d2123fb91d9bc4e9c116ace06e7b59b093d6c1cdccc067540b2c599f8f5985ff6e14da691169bce203ae8c127770f3833b0b19847cbc4f6a56",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 40,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "8272e0864261c5bfa05f4e40a98aadee43968e9f5a7ebfd7cf39087a2b61b34f4592f00c3c18681e941fb958b446c9d98bae87944f0d41f13b3d1662bf9db1d011c926e69311e296d0dcc59e9e09e4f6c7b0a7e5f232533e02097e52fc0755ea756ba0c0ede3ae4c75f7f8966b42118d1683fb9f1e127c1e6a6a63126a0d50b1b5a59f4adbf5cb822f7b863c0f8d8fc01dc698bd70943a6231d7aa77d517be3f1fccab61c99b8fbe5e4f745029ce81c9595ec930abf7eeee6235ab2a84002471b971eb91838e13ee4b014cd91059b3975092bdb26bb435eca40ec8ae887470f1c11e32d2fca111dc254c029a2f824a8dc2824ae32a1168de2c23fb69c77647c9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 41,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "77c77d25c39754755541409749a94fcf10b28edef92a06792feee1a5381c06aa1ed6fd46dc76bf12541120922473912bd63bb2ac17295110615e8c96039eb800a0a2504a47630852c354da0b9c44c9cc6b30fc2c5715e02425c9d573868f0eac1e97415408d4d7850230d0e02b61d237b4145c99f822c39270fed2d0c236f0128568d7ef5dd5b26d0aac7f752dd45e891e7f3289974168a6fde1c8de368d1e3f546ec4eed21200f217c9de87400d846c26ee70f459c0f87f5ae64273999b0f1bfc1b60bba4db271b3d63db27cc24b9d225c83d2043f3e3a20c088b36adc50c15a5df894a4a4875918c8dd34f91c7fc8bec50872217778992523409cd21f8b88c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 42,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "64a9c0e6fbcea96d62da56213f2a11d922418fa1b56ae4afde7d3442c9f4013ce11ea203ca23a351609a41d5b7696bbe2f3cca01149a1a7b9c0ebf052e51167ff18bead5f2d3c2df375a2fad08a91b8c36baaed7aa58469a8f428e37e83ab04feffe49997c640bb63aef23ef408fb299aff97fce0486ca36abc6441fd52cfdccdff17857ccba6f448cb3d39b729287a6113b67946c004720b4f0bce42678e0702b0ca6096def9e4c67244b68d89a5ac8986ef6f4acb0b50065fa75410c43874844af511d6332c7db8f11988e70a7a02415261101d9e36dece79c211e26d580825a7e5358b1ac64e9fc43f381b6cff477b58d2861c73135d044432cfe34cce883",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 43,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "26dea68e27018d3247e2a1c70796f5e025692ce3d31a6cf9eae6e0ad0941fd36f66a0ff542596ea15149708df7b88b63d77031b1a1e8e60b2221b58560141e2a3cbedf09aed29aabed1c35eb0ffb312bddd04f66acddf42a0d7130e1268d909d988bf06d465b02241096e8744b5541e15ed274e54ceb9bcd796b3c361ad7cc59d5ecee3f1131bdf9ea681e9be09d18394a64711a040fe421b8678da330c38ae6f057a5b690ba7164252938fda0c5396d49f265f7a38754edfe5294c1f092721ba263bcc334439088a0c7169d9badce5b220f2c80c44421ecef605f46c6ed9affdf3c730b266eb031f1f265003dff13066d3b1cbb12d898e6c15f34f7516dec75",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 44,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "91ff01e79f9c9e50aea0efdbc8b2c370f3a40ad8e489601f8217ecf9d047bd8e10bda664ea986f5734ed38aaf67cd7b227e5b68dddae13cd81f9ee1b7d8248bb3042a3ca670f32c316e81e4076788420a18150cb1d4725f7a239b49ef25f458716679cb1971d39b0678c1ffe3f45d272923f3551a337871b59f4762c6e11c9665b200c5bb7fc572e0ad930a63542a1c77c0df7acb8bc3c3b0ef59ce6c2da74ee6ef4210b409e2245873e6fa24739d36c0b12e5e328ca669316fa6a4df7481a547f6e671b7028e2ea3c15ac98e742d5a8995776bd586fcc23922eca59b1497871f744b357078e8e90188a2b7224c19ba9ca4769f91e665a9cbe7de8ebf84f12c1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 45,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "71ab62e163e31ede946e41909ccd87186086c7d99a3459813db6e380a046cbd75e8cfcd2086f2b1db021bd54e72b88193bd38f9664af1b7f100a89c2ac851cd13d3dfe4907d26769a46a4b03256d18db21424636b671189619840737fef2d8d31f4864a7064716000c44e7ebedb6b0a3bc06e5baf01fbed82933abbc43dfbe87fa1cbf68fd30e48ed595a998fbd0ebf1cfdc35dfd8026fad023412e82322efe6182a849857a66b1cb41de7c8a4f22ca251db2714eb8aad67f8738a59602e900c5cd1604e6e12d7b05de329d3bace06e7785cd4d68ba60a2f5b976a4fd112c924e4e15cfea43cda7ce14d741fa8a0e777fb3a77c2cb7ce2680a20a6ff5f817a43",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 46,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "325cacdba224071c1736adb4815a0a13dc199bac13206967894ca897402c2820fe303d2c2160ba6317fe342e8db0a2ab51b5edab4eb9035d3ccc73521db011a0f231d02429480a4398bc68bfd0e248f6f7724d2db791a0366ae25aaeab2f8ab377405f95af2dba8db349236dbe9507b17f52fdf1aad4991894e857054666e770c86ed8e62fc9bc2b6ea6d5e121ea43337277c61eee8d64f550be0aaaeeb29a18c3c9dc543ed0cc41cf0732d394fe008e5d8874f3073046189f0b6679bfe4ac65cf13de43c36073f60f110f1f397ceb1f7cb40346fefdfb0c817d32531713a04099ac6b6594181c11dd8f2c0f0b43f1d687e5b846b69283dca85a9a596bf5c112",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 47,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "6ce19d6c6ed9218bdb0564fd490a088a3d3be80a45bff0f19c7d431bbc240fa300f562d00d25a58456ff092304e51047f5d8956cd0015ebb0eb6509156640f2ded9c003d6db49ed1d95bf74741281990f09cfed582ad7e2d6b896713e28f7d3f4fa41c798dd88ad06a8716063f0d42c55c414fb6c49205fee53a710fbbb98e7291aa07cd6f7160e1fdb5f3dc2dffe014bd91bdd450a1f0da83cb380158b9d16aa27f9c078e444e23146701bd1b42179feda1998258d45a204fce614be395413b259b5898a06379c7eb69e6fb58ea82ca72b8f231f11ed0f180d795087cdbe26aeeb2ff6d7d3eb7feaf4c2c74783c96674ad959bd5cfbb979cc450b9c0510a364",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 48,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "2d3fc532304570b6cdd5b58b0fa7287ba336c29eec633cc5f215f4e96b2ec44c67e3b1de1386ab616975af3ce3ba93887e1b705d5e55b054e1782d50bfc0094c8b7b0f067fa250cf474ac3b42776b1c76509ca821225989c13faeb15b187231f6dbb5cdf2e1ea52cee05fc2c1f8033341caa0772017fe3a720212a7169d46467a05b4cb91ac9886f940ddc8f280d055d54a51100babd9631b2571140cb15c2e53fb3026bac02aefa46065d9c965f71adbc5d3f11f3a0500fd833a05021c95d5e7e5f3fa500f367c99595514ec221d8fb51db4c776d86bbdbd2fd82a395076bd1e12c3d0c94ed098b84d858a733e0c9a153558be90213db2b405d54df94d6c989",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 49,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "391ac1b5a466b886378fdd220d5871292412bbd62005bc8b1f13b02c7c4f98f3578c31a30c0495294cf68dfcca12c2ea09388fe0752487aa060f93a0bffb7d7075428f193f673c43d60fba94bcf2a8b6297d2207fb5db7abb23885fb8b4f858c7a395c5e9731840d17d7ab749dd0f5511ff8529b9461989dccd126bd442e8cf5c56e20c27a8869a6b576ef771520912347099b566ee588eac583a595a333102783c0f993e0eca3f55af1adab66790e5dff1cbcb2f549c5e085317afc8afa181424f2ff252eccf643af509cfe8778872107b4825968acd5271a36d4b83050f11afb34afc4a0cf073204187c1b7e81832500c2b5cc32f123644d9d97f24769c8d7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 50,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "2a6cfd3112b2dcd37aa4fa4ef9ddb13ed713960cb062653656937b807c5ccf80c5bcd205ba314a5307bdcf58279afb16be1b9b038c93ab4d5d5b96de1c042b66e44bedf4f5c72d7564e3f190f4654211eb7471315b512f896dd315f00b4d1952c0c0b70e489cec2cabeaa58123cf000d4653228c7246952e02400bda062d16c37d5790e4aeb9e78f75d0740dc48c7dd6b671e648de13e036a0265ef6c9458f72602bf5d295f468f554caea563b56d3b988615d12366d4ddb4f7ecf39fda9913dec271c9ea5f9286fa11eeafe2088a41f16cee7ed19c7330ee99a54d981b183c3da730394c8f5b90b17fd0fdd47c0260f08490b52483ebb32bb6640a890c94d85",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 51,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "0495075a7ef7da665a8802a3dcab56cda8675e38d6378a9b5f5fbc53f9249bcf7746b2e120db4ced134124d54e62bf7aa187edc28a3384bf2516eb616c0958acb38c68f85ab671ce9f2e3e7f92a247cc4cb71d2aa536ecb24c6e3bb3fcbd8636ede677f91bc59988b01bdbbc2b986ba99082f7d2dc6e13b962f7e6e1c7208ba9b1c55dd96779f89b40178be648bbf906a68ffdfeaa0720dab84b290914667eb423a7cd70fddd4e947cea0773383c048e5e4a250ed20d31ed1730d0d1b10f7ed3401da476cf9c2d8e1bb86dc5aa1c79a5158763c5d6cf0addad25406e4632e1a85617f177f2545f7f0f60b5c297fac40a304767acffc5c098a8ed85da2ab5c766",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 52,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "ad2b4ab917b942d7172df9c51756c21fc23b3bf467f4dc9e024e89b7d6df71f099a0e0c627f12257b6b05f190ddc269206556ac5d34eb4d63f09f07b8ebcc38c3dee48acf056aff46e23f170a47acf16621a65fa3f9319e5e21c65426f9acf9ca6576efeb4e593f0ef01e6577c85be73acede78c3f43157e686a564e0a542dba8080f539556387c199089c89c9866bdfece7bbe0cb713008bf9adffa378d76e4915d1b445080977d353f2f34e9c063d67f0ef50f755f94dcf4ec4122495835024d075aabd7d65adccb1987e1e654dc2a4df0de3252b4646dd7b86a068e7d952410f1341fa49d80d6f1d09825bb2e6741d9e8b43ddebce0f81ac6df635fca3d92",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 53,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "9e5a42ba80c6b91801ce6f914dc48f03bec695463313afe8306f726d1e1e0690ad33425b1f5a043f8bb1c3b474b009eba1ca67d7d9998b56b5eeef09e94358e3e3133b85a4652493253aadfb4df892d1bf73b42e2e857302bdcfc37905e37fafdc8accc26a30d0cbc1ed98d0e971170e1953b91c1de35b363c00ab4a9bb2fef45b753312717920141287a1b8264522131a522df46d5545c760c3a05ff4487542f2b351a74a7dcd8dac6e7b342a987ed65d5e1803362eea8340eb67f014d47f63e720d96738924b1529beadd86e62e20b6479eb9623f29065c8242d753080cc4de962b934e10f8eed23be8bb32ed1abb23e75949e30f58b9667e9c25cfd7972b6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 54,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "1c57dd4fc93dcf4fb62e082d0e861d554563203578c317cd751f017c4779a36ec6e6dae4621ac07eb506d4cd4d627e63c55534bcf2b168649add19628b0a87d455c6f74329fff663a2a9016ed3d5837c2b843b83015d203bbe25dc64075b27c0e708875eabd9aca4ea6468a2117139ad85794b9629a3b06e22a3d945123b41d1ca3b656195ee3b0d7b046dd1f28ed3b46ccad9a174da581d33997541c0d3ec589285587e340dc65c3901c40d3353de448896634698ccb1ce55e22fc3b808cba5082958492fa1997b26442f09615f869db65efef28d50a75075c76fe6f2e96fd38a7429e0746f3b20a0eb31027ee8325756b42b2286e0069e92461ba5e5a731a2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 55,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "aaf95747bafcd968dbc2f7a719315467b1f438e3c71ea01b5b6035b9271e16a27791ec23ba7f7aa637892c9a0110cde9f3df8fab65a4b2dcfbcb827628d0988c488b9def01caa916116538d535fc955aed97830a4b6796cec61fde848d149a3612e4a815a2dfd45131a435559f48e72337c42cc104f1797262ee69709882d57809b19b927410af979c479fb1b3f65c713c8f3aac3907d2a10eec945e302bb5eb5e194363fc4ce15d25961bdd31c51339cb1037b4c86236160a0bd1bd574c52abd88265798013f1e7ace7ff4eb710d0b7726754ce14a0962d7eedbd08353574ca9bcff955ed02166cff430c34dbd44bbc927d8ffcc85fcdc685e0ad8ee82c27d9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 56,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "48486ef632d298186388f80506bf6a12de03781adef4b778d5f616484ab5cefbb5a0a004ae15def2d82134b96c555ebb3ba9e8f7dcf2c473d6198b0a455cb027b33020ac7c7c2d10b8904c94d5ac45ba9fff42c892dc0d845cf42d4d162ea8b9a544084b6565770f3c188e8e2dbaf6861574c94e1295b51c5e13fb7d29d65d9121008870de99b4cf2160718989c9f288d90b50069de579027a624805f1356eedb6bc34ad3f4fc9519fd90e626bb0622bb701e69669724b4544c584573f054dfcb79a2bf4b3b8760fc95da9096d8f56a91433081e8462c92e45b0383811581e37bf4629567c2b19f0135e341a637d866686312626b99c0885002655fc5027aff0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 57,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "9be08bed6aec129b28159d23d0c9d3171372b44ec3385be93c5070ad0714112e88e774522a6c61874ca071dbbba2a41ae03698395943de1c0489a2902c5fbcf7790d3f6df0500b3f04b989863f6ff742954dd32469b96ffdc94086b6dd39024a1db62357ffd59e1a2687d4266581e5af3371b1c45189346b374426a8fe87363e71254a6f1e566c911f467a089dfb19cb527bb0c75e442a42ac356eeb0a60ee1fb16efb5a36076a28e36d6fcbb1ffe5b1662f6ce1be09f30c9949b8056686ab3c1d3894350ea0b12f97f350ef7c2a232dbde200d4ac74b6145a0eeaf40cc3e0b8937d4377bdb04e14730cd4830ff787110452c79f965ec4ec8b080a5bea0d0b2d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 58,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "265f70be75fd2ca926327fc0ad87f20a9ff1a9bf9e45545b6d59cda7abbf32a5b2fb0f78a4acf772749ff038f03699f90e23e6a27df6c324b34a5a995046c72c3123f894a9014a17654337ab455a9a2942af4a31a4e5144ab708c653a9a75b949bf800f817b856a6f139b1ce02e4af27180901121ae1df5196d4c96b013f98874d9305a04bfbdad91ae365b9d39a28ca669ea20c4800af18176ea83f46e094a87998df6e14e8d6e26ffecad9127f6f8c5b96f2f192a7345617f5c563e8fbc3d870c165b87449af77186a813909716747fa0f2a487d6ead2ab67a8b81a0a4dd681298ac8b3ce607cc50d2b9fb3a4a6d4cdd92fa3d9ee3aa0d46fc5715df133d1d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 59,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "af120d2204a6680c75fbc88dc52fa817b4876f2598fb7d6673e7f423d0959656471192c034d02b8f96f82c63d44b22776ed02813dd74fdd383c70838e5139bbb328e068f31ef09c420e54e6857c77b4f2438e6778bd7e6a3b6a2163be5fdbbbbce32823a26d1c85298e7f14ccd9992a510f13e66b5c5c7170f4639b39b2e322b7b25251978801b5fda78a73d1c35c93f29766434b278c7f49acf147cb3bbb906f0ebf3c624e7b0f24cdfacd852ed594d90bbe222c17edf91ced1f6adc36ae7d4a5a2d5b81944ba5401d8285b0a95b04937ded001eae93f470600e7d9b0f74e4d39962a039cf57b6c955c1724ea8bb304faa0cefc097eec4bc5570737656a8a84",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 60,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "285f6b301bd5d54927e3404e5e1ef8dfe90d58dec37e267478b10d2f787573025c2657665d34415932e81ece24af57329c2f54a651cbc7b791bffb0ee20343e2c341cf9ba5a0aa67184c03345d36e561f4ae18ae344414c0478c7bdba9d7fd542fdf8d5e5758295cdba159203494021e6ca674190ece2769a0c0b97c143da517ebebca3aad1933c4d89432bab197e779995e49bcb0e945fbb7dcf257c5af509f19abfa6fcbf29f4704d25aeef57ea3d4c63f0f378e5c5b8f653c5311640df57bd5cb2322d84aebf304b649e337539d47fb1491ba1b0d936cc008d06970e0c0a10d75ba0f2e0c5efc1db92830cb022056952105da83b07e25c375803b3ff536e5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 61,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "55d88872d2dddabe8874f8999fe1a6efdc0ee4ce38bb1057f11c8fcec2da27d238d23a8010ca9c0510c3df12a638fae0c0d64ab83a8b43cae24b154f1b8632dbef8726db103bfde6d33f8253512388557ac502dc90cc173c9ac82a501ed534d4c57fef7ef68d320897fa882ef90ae32b29d379c39b4a8971c46ab9366e39db2c2ff180cc6259cac703330dc2f80ba398e4eb7bd70175aa4847d0e643a8d97ef6abddd239155cfb780ca228985235d0c91188572902c491aa011d9348517c370b5bd60dd9a9598997a5fc763267d2000e2728edefe4509d98f7197c487d0e42951fa92acd621fbffdcb595b20f8cb53c6f1935f535d7f0282837e4d03e188b823",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 62,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "977049eb468411cb4b4745d1804dce61aad8038be0bfdda3d6e6e7f235503100505b6f86ab432cb2ed28bb57358c95042f71b8f9e5221166dafdb9281eeeb79f790f8f9e2b0a19e50b8459eb54f85695b1929ba66520d46203814c74900ec3cc546dd681e35afe3b55e3ec1ab719513dee7e9a9b5568e9bb8e342aa3de2d4ae883e9f0c4dce2c9fccb68ac09d5a260a0f4b948bfe5a03043aced68af31f854dfdd5d42047dee19b71d114bdf823bf4b03c5513b5ed2bf333e323048ddf332ec284c7d31ec032cade848d0d4e8a0121264ecb2325a29b56ce5c168cb9652d31305547dfa281457b16640f3e5d283b3fde108b67cdbd6b2005af93d008be4ec46e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 63,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "4ca8cf2d7817643e14484d757f0853625613984728c9e483efdc16eeec616d3c551212107a9cab91796185bd7e60f661a5f2f17e82b9f34c0c55197eb5e2b7d74b8cff00caee33083bc69aa66027a3e68180817fc065dd5a5eb2e11626bf97c0ca44b70c18b0a0a70ffa628d86aa8b45e718702cc5d15854d51baf34fd637be3e201c39ac3db412bef0137951bdf74a43c7dbf5956207693c40c9578f5edf408b43bb1d078003082592fab58860a3d9a38d6d5aee051e5be85bbea791f57d68a7c4127b7d7f5dce2ea211cc35f367d7b0a561f8ae63c37101748fdfd890d616426690c5b6cea817c219b9165ba6784f9edaf8aba7082f912940254d7b7921212",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 64,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "6ba6eaed9a00575e0ad5cf4ade39dbf0bc6b8f50e7d2a892d626ee6751b6a360a703904d3a11596b10473a8030ab5992dcca8932dea1eae7e3c88829702530301fd85f5be515216f23c39e70b46b256a06d392f13edb5431fd6bbe4b77445db03fb4706adb22105a7ce3c6bd1a537aa3d3bd3e264e15bb68daa88c0db01c2707a2aa7af4b055097b68e7c0e6749214478ec91f1104ef2b513a22316476de696b14090f6a3e36a562fdab5e3c682708c88017a077154fef4fb84611b9df8e3b5db55f9dcb0dd5d2d797d8117a4db392c62f432ae24facf99eddc78c41081de9ceed9f651769e44cba098babf7a78f1992a53fe318879417ff3cd8a5f04e66945c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 65,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "5bbbdc57a45e5fd5a0dcf03b76c06edb2066f9205eda2facdf5120dc6bf93c8e969d714a9ce71104f2b9455d6c6c3b6489a41e578fff9247de07ccf307961b34f454df5fb40ca98a4a0ceba8f705e60afa02c945f8ced0b6daca87acb6ad081098deb1419cc7bacb407bf52559440a69c0ca2af1738b266e2c14fb26bbeb9ae1f415b27b31e36e59026066b2674d60516b8c06b70fc8194d86bc8a5514e9e73dfb29ee959f2c857f33dd0f672e35f13b60185c8cfbb3af23badb9271e40dc1d4374562d88277ce0600b18e634b127d3bb2f5e1264dd9a3c188be38089617344a01efe47e1fb442d747bf5862c409c14327b2e3b8ee065a03764b026d08983ac0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 66,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "4d34e818a3cae7ea179c057aca683ba99e347f661e5a931e702a75e9b8593c888461f8057fd719b4cc57dd674da0daae36972c5418205c87840470cc090d99714aa2d886d246ee6b5751f683070254ce0e12303c9fe252d5ef435f558006d3bfc9d173be2fce9c580c3c6b6efd003c84de74aa6d9e31fd7b04b0fa2f0d6bad247a3c28f157276f525eae16b058936cd91f665ae1858b2c00b778aa42b97aafb5bcb38e577da899c0390a7619339e2eb487265b6e660be420be199586f4124671c682a67e0ac1d31be4b458ba5ea64249e988bbbb67a59bc62d3d827b355f3b0e4ed32ab2078389653bac1861586e2ce2b49e423fe5832c49f7e04a53c6a72997",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 67,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "a4b028e9ce76e68732edd1534e6c50df0fb88de211686858b815f93f899955d91cacb434ead4755f6b2ba64a305e656c31f52581e6910f1b3c3e941baa76ebfb5b08b8544da46f5d557b6baea4b206aa4b03b47f0fb3c4dbb38a6dee18b6e621d26a108b107cf24c00b6f5e9ba2aa98f7afe7ae96e45d073f36d57d8d38e4ec8ebaf00374f9b2a4a2a53dd7a4e5fb0879498240abdf366ffc731ec56cc89cc9657ef0f6eda0cf39c0846be2b8b1dbb681ebe31b20f851e962891d55fc62050a5fa012949ce584af8c9ef5b795f0a4c0a426450d71161638d80a49a842fe76dd320716910a81dd9edbc10717eec8afcb22a590541daadf0bfcd117deebfb2d409",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 68,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "8e835e05ce0b0a5d4b00b8ae5ca60ca6a6f654274d0d1db9f32ebdd91f526cb69bf2508006db1e559489efea6b3b202a70ae72757aa13603fbef69083efdc39a1b762e355f22603860a2b12e69ea5086583eb61d754e5f70812eb3589217bfc41fe4fcacedff8fc146e3ec10f5e06c127f41ebaea7c4e82b3ef6e786886a80ec51189ac5c4d9319ccf50d9ab4b93661768fa2730f8d91a7892d5b72872d69de29c39771e8174ef0a60faa4491eaebdd651c9f2048d800fd6ee5e0b897e7cd962639911943f5401dfb44354a435f353648ebead13dcabd62657074b448c0db9c9a47d8b863b93812e18738c490992e6b16f957cf769fd301a2d609243de926e9b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 69,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "9a0006356a9971ac48b80da03247b0ac9d4eb99bfb7a59c730b707d16a823d31d8c64622f27c0184aee75235c0abd91625a18d0d17f7dda988232257b64727cfecaee137a9a2e033942139ec4c076d16476bb406be43805efd6398e0de37f1b974de2824c39bf61b35af0f4936a00d0f2c078ba815ded518b073cd4a36c8c1c16791bc78a222fcd877504935faedc3da6378b401247c6cbadeebc823fb2f516392d3706f92fde0d519c48a3ca2842007257adffa1fa8927e90e93cbb8d2ea175a6c083f4ee3640f7f7138bf63ccceddab07b2aed7639c2e1a2bba5122e4588a7e695020a3b521e1be3f299ca9996cea0a1ac8f7abf29a13d36732b934404f3be",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 70,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "515eea496a899f1b6f84d8ae1a31390ff4e4c889e0ee2525b2e9d656b51ce60889ec9745a25d908e3e93b10d1775f60f638557e6bae1a9dda1491b26aa038dec60bc0030be3e23b45fb1f55e800f4eefcea448fa8978f144a4264a3b79dddfbcc033fbb987b6f849a91b2a28ff193db1ba715a157026fa442b851369e7e4c086aad5df0e2c9a4b598c4505e5703cb9e2ab0ab8b9c5e7266f84a8e998fbc799ea2f4e0de0db5b97161c7215c246b006c4f3ac9aa973df2aea96661a367d7b09b109d6912cfa84185947298f65274dfe9ada215b172693cd75bd9e0008f07dee6ed159933fdc6940f5a31e5d31f27b84f04d6241ccf440e1ce534c8f16f6f287d9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 71,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "85391950b1f67e9bec6620913bab3792b34285ca2850c2d6767452330c5dd76312483a50d3948a1d721f6de83ef915c67213e0bfe8dcb307905e68103b71f16bb96328e44f4bc61f7fd6d994abea65b774559dfdd3dbcfff7608855fb74d91b3c8397b42f5fec313abd9dc599f0091b419845944a49149ec41ec526e9f5291904ea68aa6d974dc0f771b7aa78bec702601e83d3f24bb3ef48a7712f48dc6e2fb0ec718d7dd0c035f9535b86eafe1c87270f5782f68197ec90dd256ad79efb0f52c1fd376e8a980b681985dfbe995406c17cf919f49ee3122d79eb94586942cdd2cb9fdafc870081e6bc93d90cc5755812c818f1605d652552f9eeefbb8d46819",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 72,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "058cf56a97bc8c274af169b3918df40c88df6f1514903eb467a14ea7d264ca79f56a76b236f60f3eb30fd349c08dd8066aba5983f8a9c2086dcc3e66839f33805e11ca2a39d929508b296fa477293cd6d3314cad77f4757f4c2a59b8946d0a12efe19ee0b534cf6f709ddfd302a9109b5d1caa95b02f903dad6052be22d46f84ece5d3d683fb9689a7e2d1161833d98116de414c8350e48c8ec41902785641c190bf1a14bc5980a5f650bdb1c401ae1be6aca24d5ce8d911d76617c260a5d744ea9ffb50829c3da1c4dec0de3a68dd37e0bc6e8bfb30c2d91201afff113e78a739f074f1725137cb39a62bb130bb5c7c9921cdd5431c078f09d30b2060fbb900",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 73,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "03f634b2c133e157c7955445082102a69228131ec6fdb9840af28ab45c62e20cf832c055418b665a4958c02ead8ce77d62852dc77b8e427bf0326653df718ef84117af503868cc7aff3c4bcbbbe6e69c3e5b14de31095e3b3b43701329a574c7e2c64ecbe08f3cffb0429ba429e83c206625b9be1185bc5df34ba5a58fb20e655972faf6c0f55a94db6cfe975e4506c6ce4572ae5bd196e2b108ca9622b9bbc315193697858094bb8007d8c007674034375cb1d4092e28262216aa44d12edadd1262291cd085eb8d892ae461ae6c227ee91b7be1521f53b332e1c6bf7a3797c92cc86b738d306553bef975ee7fc6f0a968186de390046ce1f51fab68bdaf4ea0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 74,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "46dd15af9e3e221e85d682f4942a8c7e4d31a3bbaa909f48e041b3f582a9e799e9125e6b5c6fc35716e73da6a707f8a2c59c49ac0f4f140715b9c51a6e07172c5c9675f3abcc60a46dc671e866de78c238dba6f34e24c15578ce9d9869a915056c550bd632e49ee78067a7d20c597797c5628048d8286218d1291e759b49e6fdbd617e78d00d8953741c261bc5ee0f27cc61719057c5494234e453aea6c086fc6b63cd21d1da0d160db4a1b80e94f19f14f5d3e8c5291926bc815a378e8cf8b2b3036b02549854bcc0ab0634d0b9e70570a8fc732ce0f12ad927e67356f9454ef5f1e5f89766bc8867693beb4e852e6f2c19ad88e33a435548bd8e840dcf84e9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 75,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "a1f187aaa6f2c383b5b88fcd59d80a58475bffeb05049e71096b0e396ad6168b4f98d2be393753469dd48107e119eda73bc7ddd7830a7772d19cb7d799201b534361ed52ae91909c2efb355ede49f16ca7648b21a0c4a1746ec5bb48cce5b11adca074d79f1252e906331eee3abafa6f985205f9c64dce2a954ade4e600f30d154494be677141e4efa12e5fa86e79cf939149bc30e73627407455622515064b5b3a7e3f2816d67ef59eb499c9cf92b0f9f78a4b21ef7c32dde4cb89461f6c7280dd9d90c403c0dad486c22f039a16524a31644b635f05bdb615ffab67df491783c5c85ca19d935294c6d458a65ffb065229f408596b0be0327d5af052845bd6b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 76,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "3eb30e9c91fe7f0c0da8041f7441bb3ffd542e63a8519705a9941883aa13cc5ff4d5c14263605687778edbb8c9dddd4828524342879a6c8bfa6203d85e338de351608ddc987bcb510590276ea691728d5c94028e10fd47f209c4e4be369ffdad3a0483cf6c8704af3288e1b4b7f4ff9deae00f54bcd068347ddfef7c3bd1e2d05be8e87b52c8f348806898f0cef7f494e2c2ad3fffc73a39d5531c629efc0a63604c4173af03ad73cd71cf8ffa79a5cb8cc10efa66004237a342899bfa81f5a47e76776c9a626d49c6bcb051b168357d5ab4b7e51c1142c86ab4e52a6b3bdf85cae768841396da036a733fc15857078ea563635ccf5b366499c550c63dbc449d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 77,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "b261dbd4e96d7508686709dec566282ca192a0bdd1f37aea4d0530e07734cdd664d933906ea5bbb8616d1ca5b8e893ea85c613e6ec6fc94f4fb500bae6b356af8419f55ccc006781f6916190e50f411bd0c0bcfb729d2b271a4b1b30a80f53dcd9393950e595a2116e27be9b2ca1465e0eb5dff2d8f9d524c70d06127d9bd160eade8328452967739cd5e372e56ea098a662e8f5868614e0834cd380e7481952428cffb9e15daa66406c025acac8a73d63863fe3192c1eb9806d42f4add9a2c9c608c763efb64561c2178f90f46b34dd967fe6b0907bb13d2a13450128c43c8b4569778a1016495ec317dc21475705d6f95843bfb5f8f1029d2f257905ad82b8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 78,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "af289127c72413c318120f8a55752cee713e81786ad2002fe51db89e18fa0ae98afbab320853da32aff8efd5d07c9e9edc8211c53d6cab61e4e02827cc80b0ccdb8ce3a5984bc7810b284384eb6afbbfbdae51ef15537893737a46a750b71a248a257d4e15080201837a69cffb5a1eaa2ba31549ab2737fcfbf8833db9692db50cac6d22d01379aebb00ee43505bcc4c151a84cd5b1da9d58122385d1aca9cbc3cbd6e4568b8efb51f862d170315ab3172c40dc36e871a10f6cd88bfce13b384653738875acc2ad47e5110fcd7702a1737ef459cb49d70d3df4e6f29d2bd6c8020c4c77c3124fd5d53be435b0dbe8eab6a70fe120c5de89717290cb8052aa405",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 79,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "5e6d645c45e43e756bd8299a63110e9afd6e8055b1759f29058208787222d04942da32b858cc355c089cae77751826d13fd6edd8b73d3d93e10558aea863af16c739980ce381fb092eda4ec6b0fa0f40d91ef98b3b855e557e6fbcc15ee46059b75014565fcb826f4f51662fe37f42bae43a628d70f0d8b49fa2e00fea84a22091669b9601964f7dd9eecdc1b539437ca1ec1915499c5cd5f6ffb38e9585c8baf39a283231691658d5a1cfb1befeff4a005804d050c339a681ba27175d4037a8eec6cb882972cc0a408a0081958d2ef13de4f2cd0402a1c6282eab0a8ce418e83f7f5e3880e88d115202c4c481a09d15c79d7388c2561cc724d9ca94e1f33b47",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 80,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "47b07a933329375d1003bb984be0e9a0c3b6c736768f5bc36bd314b9365b525f5f55185e49f4383125bd01f2eafdbda9d1e8b51e0cf5735e5ae36bbcdff9f7e8f6e2449b4d58477a4c9e57f83778be2c7be22b7ef0d5ae540a87b9b7ea123372f09f8ea111ef1816472af9b391122745accf09e0f652aa58a6e79d4081eb3fade4f4ffbb3506c4aa9b8d00f793c4173636ace4f727e7adfa59a40940bfa652ee6faa6dc6b6cc16d9ab34782951a099f33636e810776f212924c9a4b4788a20f2106b8a61529aecca14701738eee59a1d0c46c82b902f5e4957772b9918db556c0bb200321b5d7516d5b0a7b67f9427db0d7da1deacde2ce7008adb8bd4f12542",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 81,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "8b9b86bc3d9f34d2514b54928a542be358c22574ea01e254526cb569841b55d429f4fc190e7a4aa526781e439671acd1189d263a8d7cc8dac7f0978a091ee4455c030ab325ba55adde20ff5b4bdf9c32b9d48ffd5c05e6b643cf7c2827befcbb745cbd305b6efe6d38a69a9e44faa81a1b8481cb141a72d52fb7bd01bfc3db962ac79093931c2fdde0156db7ffa0da461ac9474419ddd27b79ceb55dbbc5cec9d957c4967d3dd2fb9d43f2aea8b254a7428c0e0aa93835bdb82634d125e3041ca999bce5eac7f0b28f87eaae8dc19ea312085c75c72d743e8a6f9c20fd659b0534ea76be885758560abf0de446f975f5689ac83fdbce309afce89f68d551383a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 82,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "67b898d0a5794d80c30fb977e4ec96933fd088df58b2094c9e5dda132bd23fea5820da6dc0eca9cb9f7af7cfdec61b94c05e004a7d1ef18310e716b70ef15fb2e33c856ac0b18580a735eba59b5183491912ee386f7b498370decba37ace8c50608b5dcea22678b5e5db20d06fe25c554ca2d29b25d13c3cbc981a8c9afbe73cd260c9dffb9f3561af8a9b459955072f31621a20941990b04f27e1f88e86c3dc8915fea08aacb41c24284e0ea5bbfa1a7cc09ee786dd0eb2de28392ff15604b10d55f0959a11ad2a895b910cee367764c61daaafa49d60fe951d8e143a1d1453843cae84808bdcb52919a4954573506cb69ee93167c16a0d8dfe89527cc5108c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 83,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "5fd7bd964b097ccf7daf5dcda4946d8969d6140ec7f4208b2593d36f0ccdd94e191b85d3c63dc56b4979b3193122ba3e122b6cd687ff535ae6b78635641173ae76e32ba6cb50384a2560600103cb9f2c1e540c5f73d1434535c8ada6f62ad830838d096df9afcc8ee129f2b3dca499aae25965cc068c2be9b19d3cd4e8c5c7aa69b6c8a6dad86678edb82e906617794baaa0577876ca26ca7b637d6d4133a371eb7a32c42ac0431bf6611ab66d5621c5ad4a94f2ce680b4a8c21f7a2c1a66cfee9a802362041329fd6e1fd66e7175569550bb865f38e6c1803829c537e2ae0049dbb5509cd4e0537b7e1a03eca9b5825f90c091f81c480dd19f086632b0cb338",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 84,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "ad477628385ba60a8c098232fc75e7d4631b5bbfff1c90eeb9f7a9628ea33a808c3b46d86af5c10d6c15cb8827e9404db420aaa18669d3110c3af01375dc9179e6ed900fc0493ce1a470822e23a2935d6240f6ac0e965d8d1d3aefb73e34572db3e807ca0732f4088fea9fb001b17f5c2e575f502f17d056c72c139ba1b9b44403684e25f60ce9427933d9c044757f7dd1f533f7239a7e0c8ad90a4b564cf304a928b5f0a30253d3a4c9f38a872dfbd3af0bba3a4893ce4fb9cbb082f25c2d700cc1b1bd57537abb01cd9dc4ed472ee3d6e5dd1e4604ac118d6d1210d5d35c583e4dbc93ea9f804204d81f509e4feabddee9cce6877d4d9b79de13e08ac01080",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 85,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "3bb2c2b51524d29a8d6a11ec47faee62599f2a310ce42d578725d19d050c1051a1bdd65ecd7e4f1c6e4bfa0434626f933bfcc1532bbbee1ad9b83aa888d51f92f35795a46d06c81970a6f6f8cb0f72a57e62b33e64517c1b2625b11458213919f4b96ea4956143d8d658bdc7f5600dd0f301bc7a85a5f785c91cb345413fc1b1ae9499c68739ab963388db47f7cc816bb53f8169cc8f8ae27f7cec4b4366ff2ac14a5273eab9215a2815fb71c45a274bd4c11d0a7a721501e41f30193130e7fcc150b5c54df4728bf72f667de4f3a8cf6fd62faebf1c2fcf33dfcd694120532c7a638a6f1da9846c36b2c2cfbfcb8782655c743d9d324b4fa88bcd16997f3c2b",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 86,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "275e2235dba328642b7e5a789203119e49012c0006858d0143dd571c67ef8757c3d90f640bc0c73532889dd7739cb023505bbb6f64fff8872aa2274fdbdf1a698ce03aa24e0f985c8e503d093bb138388ae98dd16e9e3f1dbe65a9f313b26dc8d35c527929dc1fc6c387be538a13c97de30a8460ecdb87891e233c826be75cc7f598fec0301dfbe3234b2940d61e93b2e4e6091c19671b7f07033c9f1c6ee90eb99abedc9d6a39aee952329f34d617fb106cfcf6e95fc867f2d991ca30168d08259b12dc974fc74eb5b03f9209d208896b88d0191dab425b7e9ed0c0b6e598e7284b51bb276c46c1b4b60f6c92b1177832ab26b69fc579e7312cb0114576d11c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 87,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "28b91acc263bfa8e50742e54f6a7cf9ead9cc0ed81ef2a063caea8c8055f00d1d1cb897f84f3f832300031d7293c98616a994b2944a4e2bf4765c573ef8aa26db4b9555b55194d2a50985332c0b3e449253454a2b17adaf293bc5ec52d6fe95b6b7bd997741729bc5ed68c2b53e426f4f27b533b765cc58657133566793356e6c4ef8f4a8a0192f2501116baea02a11c7facb9c602eca510e4cd2066bdafc2789f13ed959e44cb3f34f7476e746c6f3d78eadc7d0152fb37428d0d97b52a9f90e47f74b65c3c0ee0f353968c703972262c175f89536e8ab3c26906525d430aaa82d2aeb34ffa70d39cc777bb03e87cd5e5c8f93d37e291192a4f333bc857e714",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 88,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "05d62a19dd4bc8fcd622cd55d6762f7f46f9928b1b1806c92591d432c4fcba91ef9c834c7d99fc0583634d77f7d2a6cf8ca525fbb3ac037b0df8c3fb7da46044c7a54780f9f83aa897d51717c44de91c7f2605a40b3165da8fd92eec6d8bb6612226cf7fcd4c918b7cad68858eb0bddf70d5823986cb580bcb3d274097911acc1dcbb61c9c77daec84251f0233749b6bb03ba5905ac29c6f8485ef9e67c6290c862490bf49dcf4153961abcbcbb30e17169f9465cb71f84873675d9b71f5c04b44dca8bd2501b753869e04328c0095fd4bcfb059324c4e8a08900d2012e25bdf56853fff41e333a552bd1eacbe384909da86845f960d31e8ce570770f174d714",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 89,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "03b0cd1b267805404dad5ddae2cd341ad2d4d4ec35c764ef7205e1a6f0e437ad41990baf569b9b072a2e4d41a8c969c688a586bed3da319ee471f4abb6d4a0ab452eec6e5ed67e6c138befa3b8784af91f158185b11c1ba141bb5d2bb9ab8a759139d19fedb2af16b230a4ca00da9f6f9908194f9202746fa51a1c3372d4f3ef58f61889b67380ade4bbd53a0273d27a37764d5aeeb06d2bd96398d5d2c6f5c7b9718313598aaf881d98262e67d709aac76b6d397727df2c607f7b682adb76cf9b8e58ef64de1cd815a36bafc79b270acc30aa8a184f299ef217cdd630d2026a865821f29d82b8ee8e4055ad45e7388d03a5f319158895ed803e57c3c3b11049",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 90,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "7c9132adaaa0592b7bd0f8b4de70b28c5f3a04cd777e90e82758b95f368d6f7bda039e134ec383c5cd15e67eb75df41c03bab87d60937d5088272392e11e26dab51afcd73c00c0e167fbb5d4bd6939691788603386b8cc90458679111faf4af273b3b32f4ac3790cb4f4d88b362d11b8f7897472ba3c8a6963fb7f708bf6c44a5467646c3972719345ceeb42000603a1b9fc0063719ae44c66c6e8ca989422add2ad533465b954789181e403049411585549a44f0da9abd6af3f53d50238ebbd5f4a4e41e426255c261322d415f3e82e1bc0b889fe80a518b19079565ac7c44d79707354d15872e95e99262cd9d8185804fc923299b2baf8d40814ad9282164e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 91,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "83a3c6df7f928a467000185413d80212bc568ff3bb42aa5d6276c2e52bf2dbb4e44d27c7845f05791deaaa62cd1d3876473454a3a18538ab0552236ccabd63c4b7d98a2d38228c66cdfe9bc8f5d7c60ccf66321da62d2f0cdc168f95846c4bd5f70a918146bce9da84d07e2392d2e0cf5d3d9bc58e2f0f64ae92d90a6c5ba37e074f0328c4c52195c546bcc7d46c0dfdf9bce167848bdc93d34a01a4325d5c1da84492ecad974ed1d047cdd69cdabff0379f2f17a63e33b732a2648d5469c6260eb96aecd7e38892f595e3d1940830605260d2107bfd37d7db3ccf31e39404a0f646673580e0fe7cbe151d6bc522b8d532b2bdfc2418546d802c77ba88ff59c2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 92,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "b1accf7eadc4dc201a87e535242e9d929d83d7621ee97ca27802dfbccfc5f8b968139562fb0df9ccb49178e294c5a78bf0a8c3f3239e762bc7077a9c0befa69d8904b70763cb2cca86e973924240820165aab285a313897eb034d2dd7b9c4e8e1781a8ececf01c610737443ea98628e94e8d94db6ab32687322ceb3d0cc5ae7316f7736c3fc86e8a911b30c6bb80c1bbfa33d5fa8b5d4fed13ba433f66c1c3235e4fdb2aa915141b34323e64bb39d47d3582ad2751f876d22e348e5c4eff9eb38d80dfa0a66f9df9e1f96adaba1d513903c3fbaa8e1379680015ff7fa659f265e8265c5817e742901d9e9c8c9b31e04c50e60fe4904fe9a9bacd3e133870a388",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 93,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "393ec2b5fd66fbeac6cdfb62f43f832483c895f7a99df1d44b74155c9ec7a4174ea80f0011933d9a2988f2ecd2b140120709239ca412d2cf93da30f7626e4d2e41051a29846c4762a7971ebf015786ba720e929deb0f3ebdfcdd4dd9e08dd9dec59f31697a6e41aa20567b31aa0acce622508321a1f0ccfd6ef85c99bb371ce0298e5d501d2597b0508be6838985cb95051c1271b4c7edfbe8976e656488ff61f8ddc291c873034e32fc7ea65dc59503bb49ee279d6aa5a698da77f6ac20d63603308efc20067e903dd3414599edcfc488dc1b93e3ec4de2fca1be8772413d10ab65058f9f1da4c5abbc3e79965ead7cb06b4f0752d8725350cb84c3ace51a22",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 94,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "59ee9757c6d77e1a29bda4c2d0c69afd89a8da8cfae62bec1f87068de3c855421d20172c080d8d5ca24f68009048ea1ba4a72c397a6178867f21f500cfd8b352e4cf02d99c5b084d6bb5001e20e0845b62d3baff8e86c5a9a8d6b5cbd90a215012bff297dedde49978c8eef69d7745c586717fcf3615f83da251af76a77b2035a3bf94f705fca89d3dfc1feaefc21a1990c9acc83ce5320112514e4f9a4bae264f0d6a100be4a44f900450afc99679f07ea0fbe8ec494131830602d571352eb8f7c51812d06b53023413ac436f27e8d9893438efa00ddbbfab975f18a25c9f189eefd90dd751ff7f36ac0ac22e1514c8fa1882af05514bd6c328028de28db79e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 95,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "3a44e84f982a227dd65ca85621eb786d89f86f698251f0e297d607e94c59ec246aab8df5601bd1dc5959768dd13320ed6a9fc5d8e2424d251dae9514bbffa8094ae48b226f87a1e62b0f50aac3de7ab50dac7434b1c72fc6b6c820e0c653d8477837ca12bd53a2435a56201667d0241dc1f5c2c3a73e4c37fb8f10cfbff239cdda5eeaead887a5055c8a2f156fbdb7b5ecd458cbb8baa3b564046147af1cfa7369ceb602e9ecf5d37af5e0a8b7936410d2dac61883e8e8613519e2c6a88286099c7a7611704052f4c1c04f9b40e64bd0cbbdb909bba13fb47cff47594b3e1451992ec0ebbd4d14eb72cd4d3684244190bf93faa3cba93edd3677fff20188d8a2",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 96,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "4800faf5338b7795a8666a28bf8a73f33193ad207bbca13dc3f3baf6397f3762e814c237f5512c99dd1e5124892f7da09c8d2ccae562c4fdfdad929f1de8fc3c434e7a99a0e56cdceff69c00f104ffb2907a064da0e5bc625767fe23104831d545c1ef1f8267a0ffd61755bd8f520ccf797355879faa752ed8d59814aeac713f34f07d8ea803c90ed0581d753646d559a13c4a82cbe04655f5d404b26818447074f0e68012f95acfc59e341e6be59901d00b2f7f41bd034213624c4f33b3a002aca2b8447df255278700edd31d2ee272c248eb2844721444d4a38344fff28e0787c2f138ee84f7cbcc1d4ac96e354ba8baf67793f2466c4b48f39f37253e8396",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 97,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "4068088a052a019bd405635272ed21a3bb7699ef4bd220f5da1951aa419fadf417d3f8187d49ee1fcf17f358bf4642706df684f1eacb8424ae94dc87ae4eb1073969e8f874d4972b671db37f3f59f210d50a75b6f8dcc20a2749253e799b3259f9a95ed5da971d093ce2b3f388b14778dad85b14eb404a3cb16a183cc732df393421d48fe0094395b90270bd760ff7a9fbad19d52a24aa09255d1ec098c878d18498fe9929a52f699cf7a24ad63727ba88bdb3db6ea7682a06b7004559d1f5346d10b709e5c93a8a24fb1487c532b7e7a87b143d22a2213f591e7b3959b420593e603f5beeb4454fc8dccf0bd4d3ea49c8f6ad67f3ac90aab3fc73db8ffbda2d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 98,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "b7e5e12ca4ed531ee805973691e1d971b79aea502a7416a56d14e49c301482668323ff8bdc02ab49c98ec0b2c67f6190cdc3ec548ca6fa05f94a68eaa2111f01d6e3aabd8513d3ee0a52538831ec2c58766b6e28cf7d0b561a8a2d3a54cf30a98e777469e1b2f171f8457afce2e0b61ec147dd7eee64d9535465d626092038b848b556c2d488fd6169cc1115e10dd05a4b77a0560fcef4cf3ba608dee6a33e09f00e014acc3a2e3dfeeb3128db53b1075c6922f9d90e70d0c7de60c57420668b850be0c127d2683b38ce13a6dbb7c9cb9d2beeb7e00613a1385df1088b38288081f2120e947d522a5a145b899eaedc21b9072b201d92efb8e1964858e37574cf",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 99,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "ab24379ba46e86c915374d26ba25217282454b255bc8a675d7b491b7d7ab763d7ca6ad735297bfce4334b72b2c74fe68cccee1b04317023ee3271ba6b674b87237f141e94c2d446fb46344bfd8823741ec931ca8105089c48eb199315dfb615e17a4aed74f9654a1cf5917050ac6a2065e2f8886f4b3fb8ac092891ba462ead334cb64c4ae1a29537ba4fb53aa6bacf521a984c7c9e0fd0eafe5fd354c75ecffb5ec356fb34f2af67593916151f219635ad7afec1ce8a779083219d7fdd1e28c9e78fa6e312ef5507b77711e2f58934b6fb43379c607f99e6b4f449a0b6c4b5c723171d63fd74a34332ec54a2d0f4d1c31090b8bd5002c981d2986fb2dd7f5f0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 100,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "6cb2d2b7235816f9ec77704b9a92e10f6fd545222a029ebde456fe0a7f47711d26ef4012e6445fa455fdcc90525ce4b218a0cb7c0002f3331acf7155ced2b278d46bfa676661d0cb8dfda8048bd1066e46cfdcc3878b845ab0dbd9668bf10fedab8e971b6ac7b42e84ce0c7d51ade27dc317306a8e623df8ac56e15f3cf00992408f5644e17b736550af04361bc7b5dcb10da9f1f7df4415f2243baccf32b500d69dc3802060f66cd5ece6e0bbcdb9d8c1b2152d4e747e8e017889a7a9c0e71abe1dc6c8f4593cc913cfa1c68c5c85fb20db5dc27297605fcd77d81fbb9d114f5a343c0753eeabba92d3a6157925598a5c84022de9ea913a2dd2b86610456202",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 101,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "9c6221f623e091e133f137f82c3b700c907e794ffc567e00b1515f5b7dcd6233043e804d85692c1e9cb9c4a634fd3d798b75205e599a149681fe8c8b766d3b9dfb1e50ace02f587fa903a92766182e55c82afb10893bf29ca64915477abf164d63e3c860c5330169ad4a771649ff2c38aeb36a754aa98377fe8903243dd9342c4c8d0753f5b14f05bbec3e2149f74a5863f8b29733cea10086aeff8726a0d3c5fddd037a279843e5e99130172a19d8fa8b5d8ad2815f6f06a55e413d574d4805572c6256b63e8b8eb338cf54645e5e6e853da7250450c2488acf1e7b63ddd8976b0873d01937b5bcce8cf035d41b4fa14012355c354e6ba1e3c67446325fe224",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 102,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "4657d03e8657ce1d5a60d755765dc8ca3ac956cf8f9025cca0261de70c60dc3ffd3205db3cdaaa15500b652bbf82321296037e2efbfcaa903def52d1d4519df9fa9fc5d4c36912533cdd3d8c78a72c07d16b6240b86a65bde7af5bab617ed35e3b7ab46c93d9857a64cf83109afe83955ee9485184640ea7bd2d7a20345f0933856e2dfbd2ba8905c377ff832da56b9d7bcc27de96125f5c22de218ddede298c95ee20d9bd96bee608daf37adb51e7c8d221c822bf2b030dec29478c208b966b2f6968594d6918e7a8ff705938978ff56f25d008e3f7ed3c90200c5cfac5ba7009c0adda69df94621b0faaa79a23dda0af878d519769e72de127daf69fa3d62d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 103,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "27c8b29e6cbd79a0a564b7ad856b360f8621fa91623813e671536fccb69720cd7596eb023caaa4408a480a14b1b17573d2a190530d00912c5a8430ae29be99148e3ce0a83fa5a7895fae8f2a0ea0e56911e69efc5668018b4fdcd7ac6c147713780b35950ceca07062640fa8b2c946c7dfdb09f69c28e6054dbd25de807f4ed750985d5c21059328a0da9ed8ccb277d473c6a78f873d83a5dab3675f6883a73103d998bcec6e91150338c9b09b847e65c430a64337306f9af9ccc65576224d405764c239e2b1faa375d92cacd09bb6a0ec2ce61615e4319ae1e49183cb0f9647b450497ae900fbbe22de24b31e0f2cb0c5b26de13699225534c218b08e4d425d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 104,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "3e4ae7fe4888ff711a348489a4770abfca50ed0b60ba39c6101972c96dca5428fcd6e2f43ffd493f1de41c22cdfcb327a7a3d43ff3c2218cb6c48a287b885373e8fb4cdc1c799ca256341eb577edf238821e9310f0cdbc98ca2e48f7b1dca5c1b861a6b80f246f7948c29db4b26c648f66573b4acb058c36a462f2d67fea2d23bf449b863c016f3a622320dcb3760d0da34f98a51075b15076e03523fdf370a2800255bbeebe0c0920a695c6ca7758e81ece1e199505df880b365f3b4ee897ef7d04c303322c27ded183ec0d432784b6efcdab558e214b839ca8b0cc4daaf80099f69b9791f5584f0d21ca4ff66f3acc3e5e003a6defa681ffda0a58f8db8861",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 105,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "89e34621c15e6638469bc4e4d95243f1f0ad698e3f374dcf8bb74778f1d7edb5481b22ff1cf1f0bb30ac2f0e842816862e55c9e47b87dda5d05f0b88e02662a4e0fd456529b535893411baddfd965771857b7ca1504f0b0952f2b60f24139db821a45020911e94e8353841756fff109795914a46b126d8e39dc9c0d2ce4882f80ee843bac9060da62f01cf56a3596981120228acbb1da8f5b89415dd652b1458c21ec51cd2fdd89c391f07c15737d7485852b37bba45f27d95fd48d3062ea22019dc9088e27b25acbc486250485a7aeaa08532a5a9e07a7a7675d32a178675ce51a3a0a756180596742c8446b0383b37e86fa910e76034a2648e93a80db970f5",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 106,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "3733f507187912655231dcf642ad9f7eddcbb6db32467a492ae3c30b61fffa2ed141fc2501d11dfe3b36ee1b10754368ef9a04c75aa2c1bfce20e0eda4e46a6d112e29827c03ddfb430f386c9b24a7fed4e8e26c7049ed09ddf231dac183d5046fc1413e86b697c1fc2eb30f13306ea049467b4ec3ac37f56ce824e6f4797640c7ec46a2d28f292824e02e5bde9dfcf9e099df06ceb4911cdc5fdba459bdb19afce8fa8cebd0c64a880655264f35201ee5b5e4ceddb64e583c1c849d6ce8d977f3e8424d37af6f5b810bdc8bdf0ac384bb0dc75856317acc12b66b0a9081ae6d2afb6eb38684df0a8708e7ca45809b98b3ed8092abd77caf38529977b9a52b8c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 107,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "73c0eea34bccc2165128ea9141fa6f39c26fd88c5282cbc26e36b89016a6371ddacdbbabf278875000ab550949a5a26d2672e2219bd8df0ca7fd4d4257d9af6ae20ef7bce5f1b5ceb83ccab2c2e4a47a248493ae85603220a9bd3ee546013bf55cf1bd25255603e54df67e551b6078b442d188f0b25dc5ea8c33004f126320691220f515e74d3548e3a08a194786f1d42e781b0d42efeb461e2afc9304254f2c0dd85e4d80b16ba0d6f356126155bb99820f00c17d307bc7ca677c93c393ef9b2fb4bfe75e58763463909b1a3957f775f01f12ee8aba704a63014f83941c3490da4515be2d4ad1dd43934abe1535def1b3bfe58a43bb0edf296424e2e432003c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 108,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "1768cef965b3e5ea372db44e211de05ae4b69c2ed4465084e9e55e602b4067d1058dccb02a717022f896d2fa2f6f56bf54cfaa73ec21646dddace99e3c4cd6dc2a3c9ec1a68cb91cdde9d56671ee866a3c681b867d126036811e306cc7320bb17d6a025818b468c1052661ac2475865fdeb11ffebd9521d2678fed02b9b3db221b3bf514d8d7a7798ab6bb077b94cb1bc22c541cc15a8385557e85d3c88f622e93e11193b631a331f993138368992015fd70f8cb8716822b6bf418d2438279948fc3b0641c9685f1bb853e5cea0568f7e1c040c13303cd907837b952c1e1f3eb6513888c5cad439e7206bc3f9b9355c5d91263df9f284e5f014cb2f052e4ecf6",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 109,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "55e2a51a5399a3ec9ea0b4bec415f1c53fcfcc9e0b74cc27c80ba07463be541d21e06b4b40b6bcc3e042bfe586ec9f036862be075d84956b0d326d92ad21a150148c9def31a9004c19d888ca4b46a48532497793d9e2d61f305a14f95be6e4fa99c1b9b1feea9cef980353006d71c2cc3105fa0f430e86dfa41743b118aaff6d133d95c52f6795adb53fc0f18161f6740a240e73f8c85fc64d2e74e2338ace4d13e11e02b0f3848038fcff8392a166c581e9dd1f7b8263dfabd5e20ca7dbf01cebd551a26d85199979a8b97c171951d604e9e009ac8d19965c079aa4f09c2eeb6f1aed989260761965c4f9aa135f0ed728c684ff555b3dda4f136369d3fcb565",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 110,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "a9169a0553a8f0f904b0a4a00dcf5247f87bb8e930f180aa2a543cfcd17b07fc1d627fdb061fc6b6fbdc2baf89d3bd8b2344f3c7c5469f88484517243d168a90a963408b63a848ce9fbc8c12f358e553ed624b5ccdde8a941a4f64d29364f83bbf7ebf10b60a85d73c346c7e462e7859e4b7728930472a0b2e67eb836b4d65b20c1cda68f54c9b7cc30840b1fe634176cb8e8be03ecd2b9f32ee3cbc981f8529d5a205d0bb6d8aca576b69e6478f1c033b1bb16ef1522a7ca5ea1f7cb71230681556e3cd1ef488b42004236f9e7c0b421e04bf746670f9c1d515c23875bb980267fe66b17050304db258672b35bd552da1e4860af4f564df3056b543794cfecf",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 111,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "0bad39cd8a9987eb8c5af65c8491f5d975ec833311d1ae98d89a4ede949b93cfcd7f45c2191f5a5def8371a2e7eb26e966374d21bd21e13c52ffa8ac4c45eccabefd0bd372389ea6f857e2d44f7ce548f2b18a6993a3ca81ea14df494e4c1646268b6e7dc3945a0618a5f4447a8309a5ccd45a8dc59bd3cac9348707355911ed09f4e2d5472da0f343be1ed908bb4462c86446bb5fd227761391c367227645ca51c4c4893735093fa508705a7157eab776a515a2e40360b50cdb273994b4e99ea5fa203aafc35490651c6e5869ad9879f17bd6e5c8b6336d0f34db6af8fa0a62bb01ab27b1d5eb5a7d18afa80b8ef3269f0849a99e0483757f3b8c93a27100b8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 112,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "97618c022f53f7e687c6f2e631cdccd07be804873fc70e76ba77ea7131ea25f68d41e2adc6d8d4226a07ad915341a4c05cba2ec1707b14f5edb5b92a25dc39a6418740fb47852add908f40ccc8baecc343fdfe54d222cb2f9fda5d8a64333393707bd1cd2c4a88f13ddd7595aa4db6481115aaa5a5dbb41623c45d0a4d3e4638a4bf05b86803ae607dd8f97260fc3cd9e6fe58e3dc24729cf2a797543742205b93a0f92b32305eb3e52fc762f3333c26de543befc954051c79fe2f0dc2e2b1bb855827b6c11b34141a7a9275083bd246b6174af1b758afee37216961b40e6f504a7525e99eec6c9e1012b5c4b73cf73ca10f993c6a0fcd9b07eb9053f69c1462",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 113,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "915bf230ab9b210ab7a6c648162badd5e56024dcc783ba9993d6d2e02afd2ee48e6624e8c536545c297468fe3e4e76c05c98753310a5df84c2f478ce53783f9b61008b41c260c2b484c7daea7f67cc5f715d81b07bffaead0022419f2c085eeb69807ca189b442300be8dd3b3a71e3ec7069156d214477074965a7d6f747c5188f10ad7c26614fa48474ede7f7a8957eea89e5af57c59a615d52e0c16837cde7ac198607c35726af9d9a8e4e91725d31f47a052dc9f4114dad4101d3b21d919ec4e06fc8df0faf91eea595403927eaba5fbf3f9b6aeef4721aa9a2c899ebd6f3821770863d1dd2de4e8dcfb09978f5c920382f0a843c0607f66a780d53436822",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 114,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "03487a274dccab65c76356abbaf1166a6b8e40bf41fc19362e609103d68b0da623ffa655cd222921deabcc783e32cd922d534c930b2012f03555698c9548b7588094b578c20c1a740a54adfb86780366ed951d01b162d059832e251b38a103394dec291bc72c982c2309918629dc656d96a89b71f57520dbe8baa25b97e68be0bbe8483c1a41cb59f027808ba22b82413c412594191c2293af570f02cc24cf3c79962a46d063bc12d9da5c1b1f562141957d049536d491b50398d2cd8d968add3fbfa8637afe36cfc0b1b4d953aaabc3f73e94fdf72ba8c06d405e224ee80c995ed7b32553dec80590f2787684e8dcd10962e3ed8280dbc2217d819b9de79aeb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 115,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "aab6c1c447d5b10d9219633293a369348984c8614698fd7c46e636e902f4c7fe89e31ef4d4064fda55dd9cfe8461713fcdf0f6a45c88d6efeb10ce02f8d36ade589551988f49158d3d546e747be0f9e65fa1b4c202aff09b5d12feabef52e921b719cf45147ab67e6f0aa9dcbba99c1c3746cb0cd0e3509ac1eed05a2ed91afa424c6a33276245a94a9bdd183fbeac9e7d93051643784f121e13e89b95190af7c51176cf71eb832b3eb73866e897816fa9fbf703b31f1952af5dd8c68400374bece4f1baed06f19c5c5d68a1df8e328af1c8f0779bb8f805f0adb65bad6bce1c2527d4cdb89571c833f09d4375d75dae5bbe17d47608833d1041288d658e136c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 116,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "1364a0181c685d561d44a5d3a735a2630035849de6eccb06bc52431c2ea69907fb08f2fd73c78ea3a849bcd48d2f62b89e370e3bb74ad3b1f9d663dd05d3c829cbd2d97cd4284bde84c293ef45bc0ff98eb47dac24f8b09dc39395da587fceec7a2f10bdef2eb0fc2fa4f01f652e6ab08986d95bfb15125ae5c26f84f11682e9ee4a6f19fb73b66cb2795127a9e98c623d8ce132310471ff6f50d1a7addb2d844c3cde7d1c7bfcfacf64b2880b50dee6a687123d313d74ff83bda1fe09b4c63115ac9c09ae8c936327b700268a3c83a56724a6a086a34afd5c8ccae9a5bc3225be35ac5d6b00f5a4c87466a2c5fa3e660126957d4cb4ebd064106c0456864ba9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 117,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "5210d4bac85e2ba4abf39b41c891237bd36447683b9ad80e738c1933828c6428085c0d4378b544ce6bd633640c058fa3dbd1d309920140ff4768c90710cfe1031ed471bd4ce30344c5eb1acef0713b02841b612c720d24276df366f3c57e5654585f11a48fe47d19f6296dfe2f845dbd91807f2eb6d9491f2ff26ccfec4f53c9a1d48aa7d0bd7adaf94cbac583f9c18d7d6fc99b85555ebc1dcb28e8193ae25fd1b625375235e609e8e9e97bd339747231dbb28b0b16d7a285171a791130a792627d890889a582aaf6aea853a7fc214e3a6cbbfa99a7083b86b4a8e0c69e7762c72e425b7370ae5eb444df3d539c8dfcc9011eaea130f5422a5be263b5bc66ae",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 118,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "1bb37da5ce67bdbd545d59f368b339fdf5e5eb8d2178dd36279955c9b2a97616f380983f89b958c5c845ae061f71ac54422ff3408b9219c1e4328890a6757e635dc2d4b3ff2d9dd683e48c14649c85b2329f1b4ea416459566b63fe50cff6de769cb1a68b372bd1966cbc55919f979b7293bcfd59e299c18d0cd3198ef7e6f828ccc7e06dcaac9ef109e8232ff053e9accc95d12832941e5900dc312c552b5b7bf5c005220722fbadded0d7d4e74ef00e8d531c8bfc4700b4b1880312aaabea147defedeab15114a797333221e7171394a5e73c475be06396b861fa2baf7e47e59c2b77f31d3b753669492e6ae691ece8fcb9bef2162fd86dfd89d051716ee03",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 119,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "103f71ce6260900e6d53721819ed2df38f8e2d7a873a5efc730c16c85619b1ca180acd097d6d550fbe6452fbf0fe70c0a2299e3db88656bc347d28cd21e53c494e3c4ff28a8ce783ee842658863582b3b4473ebd435fd0b836bed51de16ccbb51308cdc953d8bfd97ab0f0c656b34c5d8c417a9206aeeaeb3b9cd2fce653ced21a140b156091754c93119fbeae5a8f868afdc7076cf65e9f1a14a6274bb49f6cb8c4f47b87055da28172176f18cac7feb463d22d841caba412f418e34a88a566d3c40ede21551a520d4bf8118840692d509fbfb18f1d005c2f54356bd51ac8202a85a163a60d885e3754c47cfca3518e7ec27b97df8242388bec5f6a41e1f0d7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 120,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "586439d37bf0268490b2c7d654b5b04418f6f62242bfb0a813a107440898bf63219518f32150e5743d7c55a1a0bdc9083aafc01729576a07f4ee4d1a12f1000a8490fa0d4dd035289a210eb587bb2e83fda1f9995712e1ee0aad7f787083b86af4913b2c5e4c54aa085d29b6b965b86e2caf70433c87ca864f94d68602fda1b547f5fcf132e6c5a341c276208485cfcc5768bf5ae467d06fd231a6b2ad1a0c7ca25d32df891f611093e9939a949e13154597025a2d9f5bae1f19bf11f6f67c37fe441627060ebc3a8b39752df16b6ae0a76f95af16cdb0e6957ef25cbf4ab89aca08ea9121d909c5b7c1b3c46757273cb44a99b026b7f939fec4f00b63e281ce",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 121,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "65b14197a23ee775882c840a5dd631bcfebf6ec45d060d632f8ac00c3faa68d0e958dacd710674f9ebc9532dd0b2d1fa5394e69db283706929df8c206f7a8b311e14eb129bf153363a5f30b65e851535e71b9a1c46801f7591f3c16848042cc9e554e0f0ecd415252e9e61d7244bec0a8c808e35a22caf2dcd899806c0649932a0aba64d61b92a5c8be887aeb5bc50781e8969072ecdb6da96baf59d667b95c7f0d51c4e23636be837ed2c0175c5d42f931b152ecf94e8c6b06499e900c392c0f3bce47176e8507f6d239a26e45005a8d873c76de1283ef852769e13af0bbea460d81c8534bfdcc6e8699070d44837cbffaa1aeb3b72eadcfdd2923e506d30cc",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 122,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "90ea824d128bd7c3b7719dbe79e0fe4e34660badb908a3b36836c8873e07a62086c3d163ee7b9a0b0f6baffc7df54c97dfa7c456c6b40b72cb8d040178f1e29d076febda7dcf5a652930ead66990241ec1afe5640b7297ba52e919b7a7f9e5b718c66095669f8660781da7b8183006a6a67d2dd0676711b4f96f5f71fa6d1d06c1c7abd52a932ea0580d14e1919e5acf2ac90fb55354070b43a1a42831ba288182c52060d31715f2c3febafe8e8080bc31093f7e688caa3f8d355448d95e4321c097ad27c69e8d7882261ea815b81443e8f24b371976df43a8cd7fc42d839df6645f7e5981ce16a6ba56c4270a8da6e09078de26fb4339d60ed0e376e0aaa69f",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 123,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "2cbb507fa7ac718bc67365071673c813cb83d4f3bff46661051a43836a7fe52b42bcc998a8b92a5c279c133e521bde2da0ee8ac12dcb791aaddc6a28dd7b798ce7c26262d5bab10f240170349ea2a27a9eda6cc7976365e4e2502bb2682fd00db43e0ddd83db8aef14c00a272d72fb691a04da1623ef2da7d137d264025cf17f6a4198c0917b394c6f010b1b42927f40647dc2fe4cc3eea57b77249ad4b0112e328467c75454f55bd769759980f62247babc332d263086e27142926719d86379d3c1225e6561f4982148268099469015aa5aeb7a355e3d4f625b4c9f7be1fbb6acbc2c77083f3130c59adcd62b2d1ebdac296f8c31221d2601a92d220ec03d54",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 124,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "68b59c29001b704995ea8b55ff590832ccea1187172e52aaa5b04b4bb27304097b0ea2c08f8796a3da792011185ba13c7aba58139013086dfd818b7b8a465273b7e927eae6eb4c5d057119b695a048a19047f45bacfecffc230138153afe7a0f0983a0e6676ccf0bfc8beffc7cc15781f7270e9b6a98c278699d0e1f7800fdb2e5a30902773ee1cf73ca05938c582392badd982e0b02f23afdc60a4f6a5f8d3b22435eb814d1fa3d0eb063aff7cb1f5556713c82ebe17c9b4de6a43adee9cf9bddc10979791c01cc03dd07e4554e7a2c314ddc97aff8bee5c1ce1bab287362afd44c1e300da8c1cca49b4b462b0fb83db1473ff852fd4f9d289844101dae4646",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 125,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "1dd0ea7e25ebc9c5df19d58bdc4c9eed06c626061c42ee5b97e7d1e188d60752983f58987cc52bd87b7578c1c25a32fe78ac95186c6af64d6221c57626784953cd4989de13a84964e4064ecb1f7fa4ed7d812d41e60c901080f2cb405b73ef8dc8aa7144e8d2fe5457ed54b9aba0a1d77bc280f9324b035d0d2072ac0b630fb4dd596c92b6cce3e4b6e2be46c63f60d62f2f87626d52d34c846ffca8589776dcca43c670fe8fa816e51c45c9a7cbfd3e4fb9055b05a24d9ac22dffaeca4d8037fd453a8f35c9a118ab2d7ccc4ccd3f26c5e882b3fa93c0774067d11be315447e9daec6b65dbc830891c1a7e71e2aaad14a68d5730015ded60923b79e3023d036",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-1",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 126,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "905f3a6f6450d1f7f202eaa68909cedd73e70422e27c6b66f3f6f057b42f0458e10afc61a537cd06b919103a89967da973ea559dc040ec18aa412de1c4fdd848fd287ff8f8743220f2ccc6d9e30898c982e445fbb986268726f4278d7952f901dedd7e586c729a4c434fc023c96e04ac9a86fc5e97b49e50e97079006cf42c54696d37282a86db2a3c02e496a4717001d3019a54b7ada3775dd3e7b690fd79f5388808449566aded7b0bddcfae9aa4f1344b940a681189f2e5403a5cbd811e308a6c0f65784ebff1fe9ee6908bde5e6f9c6392e8aa54eff69fb5521d57d7d3fe6aed5337ac73d31414c7e3a294dacd9a149eb0e42558e9a8bef9800a06d8d1ce",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 127,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "66964c2f2a3194e60ce2aa1f6fcd6f0eadcf525c6b95e2e401d7ac2f88afd0ac1fe52010d830f6a2a3859105fb98713fa188c9b68df7ce5e4d45e49c347d83cf7a1a3ede360e357bb47fb3cc31e0429c25bf5e936bc368391184fb88d6adfdc28aff2bb7fca9cae9c7e4b4ef37c61a7a5fc5d68cb12e5c56a0017b31948b4f0e0267754dc70ee92c5f8dbc3b2e7ebcdec638407e0c08c83e76eecc65f592e9a239aa303581b980f75c2630e3af8d93e8fa33f62cc461099cd9dc1f133ea1f499de3902ed3cc6732be6286168cd3f6b7b0fed005a8645fc4a5855f021302322485d9d694803c4a4275533acf2b1d5ec62ff8c98170c737f800335f84f3e9388a0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 128,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "63e7ef511358d2a28a71bcf1e143d27623637beedecee3638b3a513dcb0f72fc56c372ce5125e46ba442d6e5e9290a6580ed3fdaaf3f51e3daa34eb32cd9ef3c8c30722f9095f6908fc6dafc22f3bd37d998baa92825cbe36ead00b5014fd50d2371d1245abfd605c6a8fd6db6362b18723c797e0ea39c2cdb3aded821a51f8f05821bfa1b6d72ff661415cca11a5dbdb611d9a74d905298f853fa2cd2b1eeb74ffcc4e2c2955fe8db6a1c2a8014918fc0e1e0c9549d74e45287742ff4bfc8a56856d0d4cf89815da4f223d3f8b243cd7a2cca428206b82e28617d9cfcd35cd029deeacac03f8ff7ef72f5010dcdd93ed07388b2482db0ab260e1022a33eaac8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 129,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "0b1423677cf21905e2cc0dda60e27f749c56049bb03e61794a43f37b84b2e5f247ba9bd79050c5a601a7efc2afb42a7936d543b916e24de1ca1e666add1bd51337caf4cf2f88a4c202e53cb5071d638cb41473d4c8db4126e312c711405cab1d6e05414c43b9566b3cd0b72da3d0753796a81fbc1c950c2aab48b34d5def3140e93e0a8d1023374b9687451c847cdad5544b05b09804fc9727bd46bc9a86f0aa23f4a7715a0fe9a9065782ce58a3a53c022f4fabf67146c3c919cd1069a08bd96e44746e1a49315926ee06af8d76c4339f23540b36cd8b07e14d7ff63d38461af49927b53e7496ed6beb855cd740628ec0021768293e7ba86c03cf88b2ee7926",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 130,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "9cd79fcf9b87e3a30f538cb7cbe94d28f76b69335f6d49dfd440210a40dc811a930b76533f789f4e23905e688ec010689e27415c5600eed4da4815db1e6e70f0adc9ce47697947e0dbb23d320fc277d473d3de7abb75837e24cd9829f5993ac35a427c172f47046e485e47003bb8447f1406b14aa495ba4b4a3cf8e2caa1b44f0718a04650dbbe749bd27c0b69ee3c7fb5ee956d0d901b5e42f710d4a3e59b3e72d70604c6d7a7a4d1a3a2763648a891107d3b14988581523356295f42cf77b7cdfe3a38e55463a39557d5ec543710b9c28e27203e23bf8cd81a2e018927a623b84cf010e40d8859b304c97e0c06c67ea017d70852ba28eddbff22712738b120",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 131,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "90cf8affc567778bb47d0b50147e51a10324639cc17b5d5958c4e318c49a22f2bc3421129a24702e1605b3f8fffefe7847f679c91a64e56ef874dec27b4540b2471e79609067c7871cc76d717945bcb558605b3eb4b33034bfd7148d591b837ac988c0cc3bb2372c9594e573a5d5c9ba5c23de5257ce8274f60fc5ecf35e8889659ecd77c2d6ac74898fdedd3c542472a6e113acac5c8aa35faa52ac0deb3ceda9f83d2441a8f441dd997426848e461c00f64ddf6d5659dbeed8681d18102c94b3be137ef926840cb47027006f5699dcfced1aaeccca848fae72b405f4e34c5ef9fe8d15fe6b565216c102aa8e9319289f2dfeac735c8a5b95f991a0fd49be04",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-224",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 132,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "4b88759bb96d67cda87617a09d625f5bb3b7672dffe031c3b88c3d8e67dedffc7c84f0f1f754cfeb4181d0573f2a88ee4c98a10dea1a048712472c724ba81bc28984fc48169a535538c13566f3ab3d2a51b270c4b2d55e4a82292c084b4f4e6a58e473fe7f39015fbba7d34083b7bd2134ca63330f0dd1997d0453aad7dbded4b3175f9a69607a8799e7d3969280c8f5ee010bb2ec7c151ca3c8a6bf49c2ae8eaa470998f390d12a4a7c0a39371a6c63d232bc09a647750aee655a721f066560e40a6f899909e72e2c3bf52e70fbcd26a37402b1e37c2c7bd88783fafba07265985d3a7955a5bc14cd0d0d10f1e9c67f6d98785c9c1b3914a7972cc2b1eb10ff",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 133,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "1c8818df1fd23ec704eeb6868ed1bb8419597f4128b5ffa52166458312f42cf45e710783eab39de511cae689f1d731cb4bcc825829a4773697855e7dc84c617f459dacd58272e75fd2eeb4db20d6f956033e939952614318c3bb82276bb426b55a0deac14b831e75500134298dcc05749426322ccecf10ddf3c4eb49f2ae746d44e5f3f229f9e2298312c0b9168fbdd2104216a27cc1e720cb8e28d9992d841e52f31b2a016d896529fa1cfd7755d363bea1bae565e579663e5b7e8c2b9e0b85e77d7f740232db1978a920c8358274bde475f38794864b08c0eec5bd176de52c27b10f29f3ce0c41b2ae23b091b7393997a436c158cdef76beffd200a4e443cf",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 134,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "0399ea1e6bede457e1046f2363e1db44f8450cc452845c47639f300f192906b7d39acd60ab03df06d1b27d15ca473b9b0a339eb8d63ad6ef2a148b5cddcce79175015241176bac81e6b8cbf87fe256167fba8d3cf2dfd145cba2a8d118f980cf279989d3c491b73fc123d91cc99a4618d21e5ad6789818f3a99a337959adda18fb571867d3a9eb50956dabe7e6b3e64d40bfdd5d5ecf1ba2af4741d3dc2a9ae2e2222c1881da0ebec621636851c46990f24ddbff9c3cef15533a5fc1794f365415e5d948b64877053a93953490c8f250488c9933f2547a89d1cb599ee5e7f7dbea2626ed343c63eb290b1e9098269e1115a2f5995b71aa2617235fdb0666946d",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 135,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "12f0c2161b8f7b4bba16d19c4c6acecd554bd091c6148e92a24f1d73ee6fe7066fe28fc5b066dcf7391967f23786feb935002a0e6308427c613ccaccc74b9aa24e1425785cdfbd8720db37d867d35d09973cf4c9bb549b7d4ef8c85474252b1f760b1a81f79ccb540c0990e6a20d9a0eb5b6c101d558f8aa4333375dc795ee1563657a803c9a63a2fb957554d4b4bd6ba33f2a6b537c08965de4421fd83de78fa5ccdc1d9fd4597568e44f16b60afe961668a0a821b8aee5834b0d527c115abb649c73c994fc6ee641d44773192574d9f330b8664ee07261858d7b5dccbf27dc9452db31fb0e59870217c4751c5247565d2dc94568431f3451dcf6874787633e",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 136,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "09c14c750fbf2c5536b8440173357de03ecc9018679af1ddb1a36dc5b38582c44ae5d42d7e0031f738191171baa6e72562c2915ae7046489a4863d7b86afd634c6ff44b2a9af0751fa84d5054f0a93971cd7c36b634d15489d75386edd1b15e6f9325eec84a2a7879e7c80812cfa387e5b620533e03e4504768f2a8a0816938959b1e70e8f8ca14d1f8809a398d98c155101363e32ab353d10c5e0a3fbffd692665f5b9d34a09d9082fcd1cf733e0f37aaad82a8512b66debc119899471d61b33c7f4f3d4a22a45fccfb8640bc2564e679ba4b6e06cdc05be7cc511e1205b25c4903b7641bd6ed38df4a8008636e5a716c014906d5a0caae3f3d5650ce3408d9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 137,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "47510e3b9785b68cf1524fa9eaaceff81225dd951103507749bb49b23a4c2c5503727c716719feec97b79d3e6051c34982d07ccc361842bc0c92213732c908e8639b1d98a0f7bfc34cf801f96fed23c4d5e25c0837f222ce764fe9d521e4499de93307df29ac4e5c2dc92e0ea65e97f55df7493d96265b048f24260baf8e8c3ae55f44eaffa3198bd0e6e731be13cd43f13d40e354d35c132bc8514bdeccdbb1bd6a3babd73ddb8d51db8598bac7badf1180ec2aaae8494c06c43e5d2bc988b50f2bbb72c0bf8a5529e4618bbfff5356dbb47387d0893cdd601647f46deddfbff81b60961d4c293c3139d046a526398a9cd8cf605cef5358945ff0330f113e3a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-256",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 138,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "14bc1a7955b30cb603f617bcdcc12405a873b1afbdfcf7792a587f1aa085ef9411cb088c34b898234704286d7f09ae1586dfa3a81d4c9662ba26674c0d5ea966184e3578c5c4a926df87d75b149ea9493f5d5600deeca05f76bc445421c25220202c154bca83a216a1d6efb0b9233eb0cb3e787be2f373de8e99996483f39c92e1ac9f18367717cc9468f6e745e25abad55743fd2b59c92f840cef0e5df47ffeb83c5800e5fd486b7516a55c7b05709eb21c8a8575e41bc567739d5f1dbe95be8d43f27769bff55fe1a4dc855cc76bccb3ccf27c68d27e3a65829b1b177015945452254f5f96a96c363ca56969201fdab187c9a6c991afc932e2991837451922",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 139,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "49ad57af4c93b5e714a83e1af3410a9020c47dc9baf25f52c19652970bf70e918780f48c3dd59a6b816899f01d9b47b7af2821ee4ab76953a2b706118eec13f5a0f442278cba1c6b72000891e0b832dfb97c7a4e5b09971c133324213820f1c7711accaf8ed1d099221e8ff6e0042ba1b0b38257a94bb621508c584f5e39c8d4fbd512800f9483dc84f99eb2a9ba9bfbe5aaa8cfe1691cab0ad87dbc354ea49b331b26158274d348620ca01d872d929e8e01d6b9815d573b83bda1623136c55e81db7392b5daba5187a09a883d58cf0687a24d019172b843e327ae507db2dd2fd84dfd25ab04b11cd4b02215fab23bbca886279091e21ffab8d7d5ad49e16ba7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 140,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "8afbe33b98f8c30b36acaafb3d61bd83175499bd5961ff3ebd340bffce9a4169b59768e1e3e5913c2bb411b5bd495cc92d7c04d65816b3c13b2e3ef1fe6076dc910e75f477677e106e3d5d94a784c378ec13b66dfc1e81c2d0c8c9a9156af52a12757884be4cb9d0afc6f32c39c427766db7e3d07c6780bd5fa62c05ca32b85966ee6291e3ced00d00eff0cc51d3c19c7e1bf103db0c85ba5e9e2d130e5136f209d6cf8a7fc18670264b7f392a68c6d6e6a5d3eb370bd5a194f3a17436ff2495f373c4dbb45de9a0575aaa4a2c9da84d5f1adbe15dce341a8b3ac4e3722b0aff0b942e522d8bcf54fb0d942997568bee3324587d0afdbbe578c5b3f50d5f47f1",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 141,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "a91b9cb0025546f2c6696630ad22530d2b41419073541a5d13ac9b739ebd9aff8f8e87f405d5151a930df8311240d6131336a3e55d33166019be5bc97e5209551df0d5b69be224af9a15eab57ab748c081e25b9e6aa68e4db0937eb4bf190ca46689bbbfc4ea5fd4745ef3938a80404ed9dbffbdc423238404768fc513604732b9c30f97fedadd6b8e3fae4e54c574d2da6ba93eeb700541df688011c59688afd11accd6c7c2c0f0d8e5b06380588a5bd6558fafd764446920b21f43af7f9590c4c20b8b90e0acdff1ecdef4456d1c6e898b2e61e6f9ce743063c6c08d1a1182b5d58edb902af0a78e9df5ad6d84da4b5109807a2e6345698c9c879679dd6c7c",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 142,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "9a2ab2bb0264c95145d3a0970b8e66315f93ecf679e92f5fbcec1a4fb5a3f2ca0dddff5d42aeaf6cfd34e3c2a0edba2415920478be0fb23cec4f541c3ef51d4663a85d1b00f84ca069bd8405bf68902910090e3db749b5e46995b05ac28254120d8a95b6d8cb96d1bbef9e796f2cf44e6e539494d07677fadeda723704025edb0e1e48d5c26d584ac61ae3e5e363e99aaa1daed11e2cf9b637d4fd69b1177727a3205c077c1d368eaf3de56e57022629dc93b2f7bea2914036ce5f5c154fd6e216d2ead20b65efbff9ff0197432ecc01ce04993f7874853a80a8c98bc66022bfd5c40cbd8726ab3b51c84d34ac67018e6069f06c2f7b2d9c700404e9e0a23b16",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 143,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "60683e995f60e1cf7d944eac2f0c6dc02a002e89a87b4a0a36378b6247a04456166ca2d85bb24260da59b7ae84e4191f95d15851afb8ceda6765039ef769d13efa89bf081e6cca52753e28de225015e2ff81c9b39d9bc759003a9292c892b5d9c6584cd779180048a40c75378cccec47a84b4097da02878c42423beea50fcd29a5eb7b67ed3a06eee2e05cd4236d86052bff1145a8cd5367cb15e2ccc792636f0305d90aca07d1e3c011a617f0961b938c6ce943c560c42724237ce4965ef50e7c98e52e0d18797aa65150042690dc8604f463104e114a1fbdd7e9ab2646e9c759502f2fd0e2fbd331c92bfb4168b638f4d8873e0e048cf429d8a9977e313029",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-384",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 144,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "7dc5457f6f8aa74bc2314156e2efca717c2360d57a8c5ee396dddd6151c0cc89f356e3f14bea1478c7bb4a54620a73d558be246fa884c41314472bb9c9866fbddb5727b0976593ab6c6635d8258a7dae326dbe65d203951209f8ece46a4132efcb640bcbd7990a6f0c138b456688d268150396eed52b5553f091f4888642b18580977d80680bb9c1194968bed4b0198cf72d1ed4631a6c16f6ea562c6cf344b3f8d1c2fddbcede647c91d01312b3609345d3e32df899fb981f070ed1c0740d79eb19f6d54725c006c0cfd961a2943391baa2a32e4da6dff7ed0a2a61fded39a85ee642c1e219d9ccf93faf80e2c2135b0de494f8cbcec5bb77f75148e83ba408",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 0,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 145,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "a289625f9fe684d186604fa08140f7d522dbec8ae6266ce83fba2b6bc6305e2e27bbfb346165b4e110e1b3e9445ffa8933e5417dbd87e3084835b8677ae439609616f7b755bbbad33ed0257a170a3964b85b3cdfbce43ea3c550354a92ec8e75642b039e2b4d9bc77b84c6bc7f2f2a43a0a403a1992e008786b5e9e43fbe71bee787ecd99501f1204921f61ec0ca83f1a8fb7862efe69b104d822ff5170802d510fd55cba7dcc2b695db905bce4c07a702cdecf24381f49a9b95d4805f1eb51704ea198653f43c3f124a4347ea1becd138cc3fd43e813ed823c373a35eb9060bcbb8fefb1c453c72f1f6198747577aef14ad3fe144b7d8de1bd6a123bd9f3f96",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 20,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 146,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "740cc94a43653655eabe5a2c9f883a3784cbc5b13161e05ac0849cee39b2e8a42a0f53d14b47ff61d143584797ad0889b26de17b0c27c79a69a356e2e3eaee2b8675b0aaf68dfe682df23463b9b780f5b4d6681c00b27277e4e7839a333b022a16e7b75418fae9d5f5b3b996427d518eb1a696ac83ce6c5107efae577859b814100f19c52708481ed03d038a4cf6039f91bf72f4788dba51179e3c95c750a9432af1044f7cc758572ff11c537add14a6618d0fc1064f762485a0ffebfb0cfaceff4602367a231cee6ea2c8407bcc88267f42189c02e3438e62e3825d8667d1ae221494d4e29626caea3a7f5d2284f18862512cdd4cd9cfe1d8d57cedc9960299",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 28,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 147,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "9a8092d3e759eac9374356b3bda80d87c6cd1f1188dc894f48bfcc2d15e99c65ffb6353510998a360f28bd636c61edda93ebb903029feae9b2c3935b2870f9a3f29e044f3ccba9a08357226d48f760158cbe5bfc0d7c0a2eaca0b1b167745bf26ea1e008e7377a085f4bd685fd5ada6602758e27541e6f270adf6d5b1a2b6c65a3757c5b3c4c29284e7cadbd39f4cfcb4253e959945651c60eab57ac0170da7ccb0c8d72e760e603c755a1b1e1356e968989cec1b9e1273ec2c572ed7dd0d0d29c0ad1e77692b0d79ec60657fc21b746168dcdf0d05a3ef1f37a4ebfb199cc167d94cc2c9b75dddf113048326797a6cfd6c9a764a6c71131e5f5654a93fc83a7",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 32,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 148,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "3522943f158039aa68354e3c51eb6d9a496f5c7e7c33bfe9a20cf98caa710b88b18ecb6d73177787479d5064ce3deddc13f98998a7207118de77029e8fd5f012a9e056b972a974cb5b087b6564821af89ce3b64348095accdea8ad7d05cf3d21d6208365a1d2fcce7cd964295c963e5fd495448c0926de0950d12c42e056595295c4376484fd7d0dc6feef3dcb41ec5a0dd21eef375e65523bcf5af70a92331beb0c6b5ac445d6a06cbebeed0083b746b3d667aa366c647313389a2d9b61d41eaed8cf2db8b4938115700967432dcc4f383278b4a397afac04bdb7c2f5f6051854174d85fb96525c2ab7bb58c0ffb481efc29d08e4ad1a86ccfcbdcd98974862",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 48,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 149,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "45d8ed4982ba484e0bcfca14537d607fb6c3f8f444425bca05cf29bd5f92945f0ac211ccbc78d934f6fd24131ae88483547aef01b4e70acd6f84eef74d4a2de40b4d15d38a0807087a54ece36f268a60b70c500b72fe0ff49920c63c0cbde6e0d9100f4e50ea3b5e11a595f3755878bb1e03c295d3e73f1ec32d24d629f2fb469cea48346c057abd64f6bae4cbd0fb89076a1e42bd5260cc5691fee46762136f936aed35cdb6e1579d586fc4e166fe252778a379c134562175e17eecf758c11eca66ad259aa9e51e504d0d317b1715bd224706d65418a4601612e482bf95c1e9e9278e5401bdf1ed24118b908a8e42c562a76896563fe4c04d62b8abdb61e4cb",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "mgf" : "MGF1",
+      "mgfSha" : "SHA-512",
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sLen" : 64,
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 150,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "63942e89a56b634787dbf074e75b0525e8bd3b7b8172f2c27499272b939a812ce2f501eb95a64603f9bc7c2120ef2f7133c3b2a4bf6445e2257b59e57022c879f8d60667ab8e28dc972846670858fc0d5bdbfa71dff870aac96492214533383d8740d84ddf61d46f852c6bf0bfb2d10c2e4d41ce7eeaee028333dfe77650b53e66cd2c2991b80c32faa33aae27b1c30c0ae2abd759c59eb22e0d0597b6dd63491e0c95048c074b1d64d8f356e637669d90974f4eb29ca184468bc1e2d24cfcd36e395c41cf3703cdb1a5c206fbdd4763154e5569d04d75998e6f425bd42f80e0dcd8deeebc3322aa6f50aa873345d7c9a0522154b6de2387664ae33764ffb2a9",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/rsa_signature_2048_sha224_test.json b/third_party/wycheproof/testvectors/rsa_signature_2048_sha224_test.json
new file mode 100644
index 0000000..bdce883
--- /dev/null
+++ b/third_party/wycheproof/testvectors/rsa_signature_2048_sha224_test.json
@@ -0,0 +1,2113 @@
+{
+  "algorithm" : "RSASig",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "MissingNull" : "Some legacy implementation of RSA PKCS#1 signatures did omit the parameter field instead of using an ASN NULL. Some libraries still accept these legacy signatures. This test vector contains such a legacy signature"
+  },
+  "numberOfTests" : 232,
+  "header" : [],
+  "testGroups" : [
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f50203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f50203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwyzQ4UQf3ooolso6Ezc1\nvi0QEHd8/HOa/He22qZvNn1IdtzLMCH8IsJUUKaNbPsRkdSFy/ul7EW0kobXyuK9\nrlU/R+ELlPhnq8xtCv/HM7rMcl5atN4auhmjnXSLTBNV1aanEKUr0EwMJOe8O9q4\n88466G7LMcS0XhC0Ddtf3UDLJBG89bHTkuHu+VnP8nCabgKyD/O0NDZBpreFmVhu\n3JtnPZ8/Xp0znO6/lqGjFlWHbDn8sAscPlcZCMm3RHZQR6u1wj7MQuVR4TdV44zJ\noT4eArzV3OycMB+rdb4+Go7pxCmBYHq6eFX0u+dsjBYOgEaLVL359Dixd8M97jCw\n9QIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "n" : "0c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f5",
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "19c576f191c273306ec6ee9e26c673bdcf3f821adaf13a0759df7787511ddb096e964f5dc199ccc5cf131f855065d6ff0a6c720651477d9026bed82d201f6e84a23b37725fd24f5b75aedc2afa24524e7222c0dd7c6d2742430bab3ec46d12204a94a533e2a9147723d087d619e07873a4261c420226ec1869abd70117c787d4b1827fe98779287451086354292bbb90617ceb391122efe70887710c5cb4549d163d37e79b33c1b336826cb53b648689e6da54241d20df822cf7770d7beaef4bb00068252786580a88cd00e93f5ef42b69efa7c364b98749fe734ee7bd13d0aca585d84e4fe4b29478697170280a5921278997ef9856f7372b6995d7eb43ce0c",
+          "padding" : "302d300d06096086480165030402040500041cd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "ab2e758c8de97282a7ede3401680ead187cc08658be0041f108851149a9b9d2588d5ca544039533eebd0305c07f394504d91a578f5764267149d4ef70b88a2a3f8cf0b1061d06882af53a88bef195aac87294dc833d80f42d942f3a59bb242b187e23bb89a068bb4c8a215247d04aec57f81f75c14e711b5878b04863e715d0f359ad13f008b79342b7a4ca095fd021f639e8f48860c1eafe6fa19162c2632a2d3a05330d149f3ea6c9aed9f89fa3f7bcb2cf2a3d1af0484178710c21c046a812f3b8d68027173ff5aeb1ad19ea6639e2d886eabf8149a8fb491d2c36ccfc4da2a9785a992046f24a93d2dd7765a171cd8ecb68b94ee70b0e5bf791967267251",
+          "padding" : "302d300d06096086480165030402040500041cbd4f57a4cfb1649cca33372f5c5ad32b993ff73aaf4fb75d52798480",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "61c702c72b0177ac857e52707c1a40b84a1859bf1d7d1cdbda643f924e8bab7c3d3eb2065aff837e92f93836fd54ea52e085e19cb0cb59fa58afad48480c2dac579315340883886e78456ce750fc55b6c188b716bda7957ff547222f0cc1462344de4bf078ec19f1ba5901a0e5f40d93dbae4aac407834b272a2be82c8da085a3e1e9e0a57d3f43d26462566f0aeade04ee8981fec8d7e34c916fe78c0c5c43781bab2fecab654fa55ac99182545d0ddf070d41f67efe0737d8ecab3411720c84862606c8e4b53e60faa1c9a98386e92b03d676b53e3fdbca3bdf0187ddc50086cf82ca6052be55fbb7f3bdb6c6c0432defa5634797c23b494c3880846169b67",
+          "padding" : "302d300d06096086480165030402040500041c3606346815fd4d491a92649905a40da025d8cf15f095136b19f37923",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "965f82f0649a338ef14387a7f3335b9e2d5d3b4009eecfd26c0110344a30117bde6bad668cf083beb28242460fbb96adf9754b9a4d4505f6412e677bf3349868fd5b5268786308a5293f2cb2f7ffda76104351f10381e504e72d27435d5bea0517d20ebec0afa531e520e5fe484475a330a40ba1109c204fabc44ec099878a5e31342a650047c299a5f2322f057b9586cd9eebeed1f3d2d94aac24f9d7b2f05c6f28bc49cb2b00f5e56870fa099cfb2c3e276381adf5a030ab6ffd9cb96fe309061d44c2ca5ccdd76a69458be561e3f0ef603ebe9ecd533333584236970dc7414124ace98357c496369bf94123bf0d4e57b03aee567c2f83a9e6378e62a42fed",
+          "padding" : "302d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "105c68d221aa579ab6206d23be01d0c91f98fb67ed8d2044b6278916223758aa346bd6d5c7282d23a2bf702e0facdfb884e0b389202a5073a715fa80158e31d1e3588af30d2fd8b61233499ab7952f0761c84912b700fec807937d00a021eaa84d96f59760cc7733236138cb4ff1fb04c7d4621331b5c729f9694555b6f9c324e74db4a7a8b72f2853dfd0b9fe63759b3468bc66017bd6c1aada2070dc8643b5e581f12cad170d9fe754c65dfd0a5925cfe846a8413d729103e9d7e8825affc20f477d5bd3860947c2665ca4170fc44f2670bc33b51d42e5df78134919bf4660cfbc092c1cdcc09c8fda1ec9383512abe253cd1a470271832e0c7de5a6d9a7c2",
+          "padding" : "302d300d06096086480165030402040500041c3dc6a3fd912b08bf15170296c4f1694f512ffa1dc9bddb8b9e1c8d38",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "3662fc9bc91b00d457bce2fbc667dbb31ce7fa451acdbad95b4b418782b8af67d2fbaf1424be2c99e95e2637d8d39e751d757f89711ae165fe5bf142fd88b284df696e948ee714e3f2062c5d01d04bb6c0387aa5ff1511552dd066bda861e1c5cbfe73dd8c6bc3039b729c700c8f297f48ba2a36aecbb626b5c9f9b3c04102f55ee65ef5477d8d1d14d9b7b048cdac54d7239177e702d0629d3617de2a9fa556a6d4ec37fe38a46b768e39f1d8a380484ffe0cef59abb7e20ffdb7c11b14a42ee3cedda99ef9f71eae7cf760fd81172e03a3f2a9f7e42a813db3b089c11528350e93b131641b8d023d47447f58aeb9f3f38760df8a9b1ad4b8d43ba0c9018e02",
+          "padding" : "302d300d06096086480165030402040500041cabd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "8392c4d888e7c63ae2a3d53d560ccbc226dbb1d9f69100fd86a19ef30a83981371169deb4ef87aafcfb4186c5ebf8d83764470acc8c9cbe36a9b15037e25b1dfc63e929b0bb3891be2d1804b8c6a0bf65891943e4c0fd21e7df55c134dde69682244d22510dac2b304c10a2e31adc134ab27ed186568fa9091df16f1c9f4e7044ddef6675269de710774ed124b52fbac9bed285b4be5ef9f2fd50e1d95383e145553762fb87a1da173b8b89a7eb9e947d08b5303ef0992bf4e3783c30253a43b373d90a75bd52fc53ee4fb86bfa1bad035a8177f8c0a9f53a6214ec950c2a07cea7f908c55c24dc31799867f819af18fa30f304ea001ce9cc87eb703ab578f5b",
+          "padding" : "302d300d06096086480165030402040500041c15a322a18b35c3afd3937b5ac133fbd8d883d300a29ed9d9e2b3d601",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "Legacy:missing NULL",
+          "msg" : "313233343030",
+          "sig" : "00a3e40c77eae1f17fbf23c0218bb5baabb4adc424ec585b499a0e28ac21e664a0a8030026a161b1c3eb96cb5d0e498023561f11cb4ecdbca633f5d6087784106683a804301a16911bd7f8fd44c66a1c890c70fdaebb68267253329280f60fd617594194c96714126ad30547a813ce57f4fd14b1907172986c8a525abd130977a8e0a4af8007bb1e9b7cd83865b6f1b0e40b1709663a25bf118aeabb0af179cf61f034fe23d505c86f9f2be08b4dbd9e9c465c71edc0ee7f6236c1b52ec2e01904c14a3da0a426f39a8a5c462bcbf6edc04febbacde1dfe30495fc5c9726fb103f19d30d9d49d69ffe9190f5d448ac2d063ec4bdb8e07aceddb17202dbc25823",
+          "padding" : "302b300b0609608648016503040204041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingNull"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "1da09f538311c3b591f0c28ff1ba3d0888fd583f78c1bbdb93cd44c17640ea658a62e41adcc74bf8d7509e7d46764b33fa02f74cab9db364101857870003caf2f6df6f4c366997d1d00e891a30275554db7690b267c56eda3a279a1c2d9271cace128f8f3449f2590e4f30befa9f374009c7d4d75dc9101e63c7a102fd7ef19c9d8cc8214c7d8960332be27270e913e2906e55d3e55085c792f2e34cfbc6e017fa7211d3d2aa0dbf9f664d7cd0252247f8d9859eb7d738985e2785d1ddc21a156824dc323b272c04ac36015061888de8cf026afd575257f4fb482d5807d5ca41ee8128b2c9bfb22900a6e60f03b3fa99621f2b7990421a070d89d0eb981de5c2",
+          "padding" : "30812d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "22b094143d7c0e14529739d6e712202114a04053f0ab81f2b9ff357e6866fc58ec238d225ad4dc6ec877db71152395ca3747f72c20de76aa4bc04b1a61babb5d3a08017978de1144c3810ab5e371e0236fe14fce95d79fedc74b3108c0713940d4be0da190a7e7b7b90440e91fa1770b56754b4e7a8024ca5918aba59afbc2fda4d60745665abbc2ce2d9ef7aa9a4894e14c150c98b7855f9c015b90a245b491f5c4f74900737692adb05900d590e617ba6ac8e951166f5c6ca69b1e627ac7cf09d73d84eac332cdb3b6372575a2db2531a4e1342f68b91bf6ab49523d5b29f99515fa6af1e2f5d02ed7a7ecf8aa3884a656dd026b29864762bb85e55e4a8e39",
+          "padding" : "302e30810d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "10319c5491e381dd49b2aca0627aaea12030206508112a84699894de3b85c78df4c1a10bad009d2b56a4089082e53571c954e83d9eef8067b5aa1da948c6fc91baf7eb9b3b53ba00cb1cc7bd96bcf80fd523f3870f86e8bf1726d27325633eac380b9bf36a4d292229f8c2b6ff86476d95e454d91d92e2d850a90ce372d7ba8633a554c05eea5e6d1d6365129cc7a4c4f41d80e770458d0f4ae43d6833544b1c7e5212d5475cc78f326720a480d7dd22d550cb5145c985df82f4ca6d92915326b344f898f1caad6a7bb125fa371f26ca1a91a69173803a808bc2a79d65ab355d3159185660e4b0193a6dd44ff18548d0da0ef9a3da6a4bdcfca64fb617dbbb63",
+          "padding" : "302e300e0681096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "94ef725bc9d4374eae7758aee84e38ef98540d807dffc5de49aa12003f851e18fe3ac23405fd594212687be5ac3e515160ca540cccc3ad7cbdf7cb7e0e8f32466e572e99c46395383ea5588a8bbba46b5fdfa29e2badf8ef536f43c2e72cbf54c779f22ba880e41acdab922a19fb429a1520fa0f4f3c22b911bf7263c424a08aaca49571592b364814fbb5087dc03f52897217b6914609846942bf2566a86cab01b53512b05bff59e74eba5cba66ab47f1d1405b5688e9fd138ab8121804dff9a3f4677493bb9da31e545f69c51d17d1fd447ae2efdd73609d712d80a2a7d26dac168066d6d6f0255cb87589d2240f2ece3787bd122cf2e29999ad35fd6bdabd",
+          "padding" : "302e300e0609608648016503040204058100041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "bc4cb8d9113b6fda304a0e8c8419fbb18d6d9412d0922c727e36aba5a9d8c0ff0cdf62b544fad91af23f6b0ed985f88fba1d64357b7e92df0b4e196b4edeefa2b6b1d04927570ef07d5e5efc6e84bbcbe9f57ad2e0b93fd742e0fdcd37e730ff25fbc038a3a808cc9f40062983d3839977cf2a22539045986be087dfdd30a5611e13427e70c2f486542db4c71fb53273f8653bff224e7e2c1a778163b5b93c06976b111f3cc9fe55ba644bf8233c0752dbc0f130d6bfe85424f1d10b21fa64d074caff5c820cc3f416e1c48bcd17bb4ffe187ec924cfed89638882f190f4eaf45cb2105b208db449b8b9f66a71f0ce4ec9e55dab3ccc19f487080d7efc256f64",
+          "padding" : "302e300d0609608648016503040204050004811c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "1addb77d2c6e825936e498fd1210c2b6fca811a99896ad40375567647012f3601f9657617876c62d1314731ea4609d03dc3681e6b53a93ec3ff0d49af491ed906692ac9278dcd0e0d051eacedaab7a038a6a8ec4d2de08103025a726568271ef9561db94f44ce4bda7210057f6d9d70ab71bef8599226349a88161de5e8035b671505b6b476f2cf39589030148c1bebffddff6d025870a4859866d63e8945a10c2cb2fe575f6676051c9f38140969c0162d87edcd0abd564e92e7389b223895ee92e35add16fb745ad493d269bb1c691cd1dfeebbde8e343da7051dd6d5afaf7aa4ee78200916ea2497043d07dfa25ffad324549902dbda79f4d9f02817a88ae",
+          "padding" : "3082002d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "be516056260537514e69b25f482b4c22c1ff3ee12ca49b7f40e676a48cb424af3ca4bcb4d81b806c9c666ce066063efb1ba00f5b4dabae471e23e3eee7bbfb6ab5d505a725aadb6822a34d12ae00cb8e1a900a25cf236f3b1fe3b576162fcc8f33efd9bc6bc1c44d3c09e5e68c8aad9288a5a94cf86942231a413ced5bd61b4c6ebd83ccdbf52ab886f89d570d78c91d4b2afc3862569570e2d1b5469efb0be9b2c126c32dddac5c34d8f340b52cbcb38b1134c6b22109e7124411522b843c2bc3e575e60b35e7a440156770b85181c95488d82c0a725e02e90ca3dc4d41c8639d110d4bec80827140ffd1fe6e8d0c945de1e1b326a26e2998a2b03d86fbd7a2",
+          "padding" : "302f3082000d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "9a8cbf559ab2651631b39b94dde87261d9b4923fac4d4ab7254fbc7c4abd709a07c4cf29ec75b24728e851bc47f99181ca707e42d41677aa4e52e722db548f3b4302bed7cbc7c006643f2562a4d8af7d93e75867b54d263d29aad85f2b282213d8e12e3d52a8e5342f42ee762a310fd18a24886f07827dcc599c2fd85dbb126a91c340ddd4c43aa276d50606fa9850eda9dd13b009da84905dc2f4251ccf387a492f5ad0ec2167c04e8127e9970064008cc10b18dd0105b8bd30fffa700749cb1ada7f9a80f782b8a2153168747a6e86d4bb9179fd9b5ca7767bef629e6bd969ced193f60a1f09efc54023ddc60561c2a8986479b75086cd2d5cbf829bcd1c85",
+          "padding" : "302f300f068200096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "1e4874b647c48c3328ff47f4e3fd939a105dfd1913236958acfa88e63e4f9bf7e67a171b3c4b67f192092b29443650185281a5dcbdbc6f08530e7ad39a5de2920b9e089a969678841cdf311e2e90f1ce5aeded74ddab79961ea35072016f977b278372cb60d79c0cb84b3c255ac0b9e9dd14c49449067785fed408fca8bc98be54fb3c95e898f3c47b752dd20b067415d055bc175a173eb13b2c513adaf139903c71b13f1b56d381aabbdb6f985eb19bf670124d7f8ddcde05219648f55e203ec1528e2edb7b35022fdaef522001afb9312ae8dec3334b2160b761507f24ca044e79fbcedd5fd7903e2a168c4ac85bfed5f3e6877da3a6b4a604cf389729eedd",
+          "padding" : "302f300f060960864801650304020405820000041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "4278e146dac5ef75ac6b9b3c9082e8401aa47be4fc0043eb5823eea077373f1ca319258b6842d77bed8177aa9e5c61107620d2f07627f869d32c9cd3fcec52cb9becc869f2ef4e567dfea371b021dc49f296acb7413241dff218310df1da4478bc99b24a4b03e7c80e03b5d85bac39eca10888884443ddad80647dbf658d11e0f4963136e030c4f8b687fa4637a11659614e158025fa5ec1a122d38d7097470e3fc8b9922a4909f5127edbeef081cec7c89c4a37157a0e27973c9ad62130e31ca6df22cc97ecde6296e502529475a6d92618e4bda715d1cf0426e92898fcd55b6c962d94aefbee3dd256daf1ed1458ac313f3ba778c29dda8d80e3e3d4d23ba5",
+          "padding" : "302f300d060960864801650304020405000482001c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "a9698fed4f4dd3d10ce7b039bd40b4a81bbd6a5eb82a71ba710094469479c14c1cb0cc13699fc8ccaf0c10382e1b03771a6d05670e22949c28965318acafde1331600f7337be8c19209b532958c5869c89b8384923a065df377de37b9e5cc7e5c8f6d0fd8664691dd9c97739194e5b2dd6d4330cef0aa0d873dce1405e7a435993fd84b339fb3574c78ed93fdc6fe604a3d9cf15c114e5fccbbbded2ae606fb9943a9a45461069e8b2dfdf882e9898a0eb59c4fadc3d86bf92b8dc537b1792be81b662b9c60db2938d513a7bb4878899df96a59334432d07a42b5de4a6d7c4b6449e3f469cd5f60857875bd1a617a2a8de8f9c0777fcf2e3e43499d90f3772a2",
+          "padding" : "302e300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "89d42ba026f51a31c27e079279cdded5cefe75069ce04bead266af39e266dfd8e9df16a3b9972e03f4afd3f561c931e815c66c2e81dafa56a8e6ff148f37e1ef4e98370c0a2b2e10ba47f7bdd4f433e8af206c107efdde39de9d8816bba196d52ace92335c34b15496c15f89bc087a16799059a556da9e96dafdb835b5553c5dc2c1b007a6ec1176e31a021da8c5106947e7a2316d3874a66b8a4ce2b237775365ec6f0842ade6f2a1b1e7d349189f6d2799c9dd40bd9d32056bfba10d14cd7d25fd260b1790f6ac6ff77631d4a5466c7c976c251f2d4b3fe943a344e75cfab3b8e30aff2ecb34014b906e1f1eb3f55dc8e4233a40cdd5364070ecb1f2b15682",
+          "padding" : "302c300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "712651f84c12fcbe98958b629326bb8aa9cf8e96cd8d06ebc68713e0241d2499b181b9216bb777e48d1191cae390d14dc63f0a09b5236fe6cb73f47d6043063ec1960e1fa5abb3631294e3c7fe3fa155864963a69ae9ad7f1b233a00e4b3b256fa0e28a431ff898155cbec008ec8367757b9290fc847bcad3a71d2026cd583b59401b7e66d552d9b59a010235785e6075cfa5f8a6588c957b66ce339882244311d9d0e33cf277134c0bf72c21683183ef12cff0ca9d3f517ee56acc4d89c74b0e81a7e1a26f14649766b0194b933649ec1fb72ebc78dd9645827e78843d31f503eebc40748a290b5fa5c1545d0801b63d753f0c0fb89e11e387d03c5dc465b2e",
+          "padding" : "302d300e06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "b23e98890d5806f743eed29a2f972bf2ef5e53bcd20e4e7f8beae79a4e7074ccc4ee9c38bd2122fc1ff4a94a22f25092024dd3aa598c70278c93d70e932402cc0bc7153d87c59c5fe15c50f13eaf4d0c468caba84e43c925c634a5c4518610e836da434a4743824139610d6ebacc07ef9438dbd860be879fa84f3cbc5ef4aaa140b581f7085cfbb343ea32dfd30546f559759df095853ab2d5dc9026f4f51f86a3621bd22b161215088a58233a42f64b1688244ce2a170b8c6656e33b697abf6a72d57662c5ba8e14cca9ac502392f4942f734670bd9addbc1033a33c1e7af3ec7dac7565a8fa50ddb8e220bc2426746bc0b05a9988aaf3b83103ef3a3902a74",
+          "padding" : "302d300c06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "81188dcd73390585f94e326b28c78bff4cfa08820167e63ef40802e2b6561bc73bdd740ea98f9e7196890ef6fa626b836b5d8dd33d93407ad285191881f4b378f2481ccd2e0ab4fc065e0941c4023fef608a7f2c975e39b0f0c48a833cb3defb5015830707c7050c3348a08a3829728736a6b1d0e4d5827461724b985acb9750cdbbbd451b97e660746238c4aff99b4184098fb5ac9cd4d0b398ead157329abee8feba75171e35c04a317c8d41d8b998e0a7ca5403ecba9ba66210c925864a20893f9a06bf9556ced71e1eed0178a7c36cb94d17b170e08e3e72b8fcd0941c4a41521e98e587a0fbefa2700b90bf12c019724a7d20528fb57ddb458eba8a7c1c",
+          "padding" : "302d300d060a6086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "0c5a755b16d0391221bae10e19594d3640a6a77cebfa79f478f55933f551b897714578fa5e459339e33405ea4290ed250bad9a4af1e49556ce5e76f7d3cf53d24159bcdfb11785a72a79e839a9e86dd394cdd42a3dd57792217d8075724b7460d311459e475ef93ab9a0000617dcfcd20b6982255c346932e1ca0452cb53df17de7d78876136e661341ab971788ee178ee9b8742f7affa11e63c8802d4b816fe3f52dcdc97343600d3703eb79a3706f888645f43bdc8333853e8b5869dca22a4db046f0decd66b8096776433bcdbdc3499a9609ece7f783d0e317ffcb3d764e8545cf6a12168e6f5560d0e7a7e31540d4ec0c3c9dc26dcfe8cc071be87568441",
+          "padding" : "302d300d06086086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "2840188f2742520ddbdd97a24eea63070050d3c9ee536eaee95233b66f5efe55ef4d8a318e460c4614310f00cd25fe2f154f67734556495ec15d2e2ea285aa22d9cd0711033c6db7aa84a24650674ec018cef326fcfc0f632012c4bd6d4930352712162dcd143754e7012c458ae29dde4fdc8f25486833a1a97991883f6f4cb94909768c0b80c2c705dedc6dfb244c465ee90dbfbc821592973b978f723200074ae4691f8f06c3add26e630a1b793f98e27a2f7edc48d043e1962de29b648067872da627967b0327d386f76af93d9c0d84ca89b9d567a845dea4de00accbaa11ddd4668a4f912a1b15666ef0f7604fb0b995a2a78660d8e52da06125335dfdc2",
+          "padding" : "302d300d06096086480165030402040501041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "23d74c2777033454f93db22d2080593c9cee14edbdc62dfcc9f4aa5dd5b32ec7e7c99f48f3225541f1048754ee9904b6f9b9c76819af8595c78762f420048d66907563802e8136560be3397eac0072573789695bbfd1ad4874277b047ef5ae2bbafddaba8ca0280e475f103adacdca558ef346d69036c13c72f388dc42340d76a8915ceb8b81e47122f0cbba0ea8e39d006e783796299309698dce133f1925530f12b3a5a9c8872a5dd3f822968f67b23e891929b9ea726488fbeda66237bd4d9b2618a114cfc62194c2be6ebf4122bd95671f94d88c1cc7eeb2575c3e6d7aa25de63b5a52fc5284a429c6c520f3acd9acd888f52410bd86832f45d1b32cc59a",
+          "padding" : "302d300d06096086480165030402040500041d753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "bd3d6bef4d7dd8f13d84a23eb5d8d7513e1eee3391dca46d02c7a673c1e468f2f0fd341805138c8950c1501b494f78d481cd5642149821f6f0439dbcf815169ded6856135eeefd469f42714b12b5ed5334f3ee2e535b0cbbc1cb7cfa8addbaccc65c7e02df84c926ecfbc5b5646dc9a17a0893d21106613707ae3cec2e13ea3f289b219d871b3bd67e8579c4473695ac761743f9fc5efcd572923e4f5d3d04c6e61585c9797d865d19d820b95e9c38402df6ab1084c7438dfa3fb12bc8f80c6d6a582f9bc9034f3e247058a985b571d0ceae1b3087814dcf70402fe774bc384e026d00fbeae4032ecef45eaaeb531835ad33a8c80fdbbeb7fdeca1d466108470",
+          "padding" : "302d300d06096086480165030402040500041b753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "98053fe9f2dfa6624379b11904fefed76adc19b8446cea727737fa452851deb44ea5a864300736b1c9a3ce27caed3fea4511e9bb9401d3a98b0892fb086a5dc04ae9e1d8ff6407914d0bb730507ceda69efb840219084c8ea2528b4146fc3420eaedaf45c0d8450192c7af36c3d6dc38f1604ea69fa9b2c38baf7e7cd4e0f5c151cc9db3590d505fd73e9c6363ac77aea87c7558582ff3a7b7ea08c4b4ef655984224c2bd9709d34d9b8662e48a2df5bbab3e9df9e5fb8db8411721c73ab50ac3d5a8b31bc64131415cc08daf6c34faae6abbf1b340dd4f3b1b0ab0d64cfa33b501bca552c950ddb7bb5f59562f73c51fd97f2d6d750b30ff19502516f5210f3",
+          "padding" : "3085010000002d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "a25aa3f523066ded870d269c7d26ef45ba35f386097015e0ef59a9de4710e88bffc62a16f8fb02eb18704c562bfb0ab9230d525e23b596a804707d98dce426d3e3a1278c29f342b9dc310b5c7da5aaa5584b84e922a385fedbe78ba432adee58f51b2570b7889fe854de8ba2654d52390217fc1f5f6f35f4a75cae85f388640db87e96908fe2a7b78c91f0fad3c118e75965ff2edc0cc9228cc81700069c6e71d4c7b527869e7a3dc63cf74c7f4aab9ecf0b2498d30765ed719ac0987cd5fa1058c81e57cacb3d489866f96d5962b1fba9f48ff298f89f8261e8fc4dacae06576c550421b419e5c5159a64b6b67eb7c709f145fd4ffbe4bf9d46b0b7d70d2e11",
+          "padding" : "30323085010000000d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "38294610b70d2d81675ee28b6a2a2283dedc976e95ba516b9efa0ccc017e8005056680d389ad287666a383238e9bcbe56ccc2d2acae5310a8accaf85d1048bcbf1ab74b4cbd3a9fd13056bc8e3c429af1b95330799bb9fcaad25b35545696a43f6ccdc3bf60550bd90e9e7592b9997dcdcf7b274dbdf4eb7c0a59b7a2d0b3d50bac5c394b0b60c580eedc6286dce16cf618a2e79d2e504b797914209cc896dd4f1a79354c1dae9c2b260934a2fa22320136fd1070ee272fab398d28c2c7521e4bc741da78a4acbb981383f03f9dc8f7bff26a110ddab72ba03b2cbd1e8e58888b0fc288f1f691cb5c3e5decd4fb656f71eb4f6b389b1f522ad4346927e31b185",
+          "padding" : "30323012068501000000096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "18610e0b455000de3a8c413af0dacfa8928be8844ba29f84235c0668c35b109f1b415b2e3c5ffac1195a9beef33a24821361741ef9669d626a8b76422e26380787af06cc36bcc7a39fd3ab5e8524f310c6530eba3c888eba5a3efa7e519e849cbfb2ce04b5a052f2b7b25784db1b84cea4a0871f58e766b3c93f122613a5486969c88fc20f5e70f55aca0f926cef4a2156cfa1192ce8d025347eb2d48658c7b6ed1f6c6faacc6be630f2f9f73e0258d63cfa489d81648915c20b1d45a8971a3d8a8888f95d7e745b207af923570a9a98e40aa97e1ddd8ece69c22c177b5c67e20b942a6e100142d539ebba5ebb814a376b0de24636cfe6ee19bfc95d1bacf6ea",
+          "padding" : "30323012060960864801650304020405850100000000041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "49ec58072a4c00be0416cb0887462bf350dc06c603958494b81af3680bba1d89fd193e23ad18910daacb63b8df2013923620a2e81cc7b57056b1634d381dabbf37e0748c41889a9c1c57259e743b3da94e2e9b430b8dd21aa06b28f45596fe2ec35c9a4c17d11480c8e771bde791b6dfb1161b84227430f6473395692ceb75fa48f4aea0a5540213899a4f015cb50d1f47cff07dd84156bb127e20e33544c4d2ce0e90c46e06435236ae5648f99a080b6aa20cbb8e9723e7a3c0931f5ad82c806303257128f48900691cbb7959313dfb2ea2a3712ccf3776f6be617305002b5a3daef3ed2e9cba126bcc6a840b09c34c6ff113d25132bab3fc074aba7a74b363",
+          "padding" : "3032300d060960864801650304020405000485010000001c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3f0770de907f40310ecfa536486f77d721aa07371f7e3c77849fb84166389876f4bd2c1730ec69ea95951582f9f7fb9b7ca388689062f50ebf2202893842891edff2bf0449f9fd9d9b5b26a6c96033700230d740dc585e64e0365079df974d12fd96cacddf2f114caa5ded4181f63380f30a696b13000554fb963b6b073891ccedde00ca3701baae4818f5e74838f6824b7590263228e7b31d614432bf06e78247cc82f88c63ad0514868cde210e2625fe5b9162781b4ac32a53d52bd673a257863b0c137bccb2f86e481430d4ae570bca908f62c27746a1e8e1bd051fa2de935bc40278c00901e5974756f94b3824b40e695296dfa730c2493ce257fcd7f00a",
+          "padding" : "308901000000000000002d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "5e4895d00312302559c490c304dcd4fc4a10398cb8d545976d6b700edadac5605c44cb0c0c7c7738fcd77dd5830d0601d65f4b1211b365705f3d5fc36fd713ce5b75e18232557046efb632da5186399a1de3dfd0236e2a4244d72637ccfc39132a642e4d467b15140a32550ce67d602d06e40c4a39085f63b4e382d4ab9bd55e070eb498cf3dce7f315c28b7d83ed704dabcabe0159a7254295755c7cc0ef757614e4d04be52ac43f4586535373780cecc58d07511b310fdb3e858489269968751e25c0641519547127bd99233e0dbb82b0c1b984a7856fd28ade5eddb5df6ece6c252283d66c3477c2a5a631f0e032e5330ed8e097426426502bfdfe1434b29",
+          "padding" : "3036308901000000000000000d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "310abbc3a50d55f557be9a7c8b64130908abb19b82daac9e9ffc00db5f5c701eff529d6cd9c006178f842bbc48c63938e0f6f0a39462f01866e80b6d8c350cbdc6327f7685a392cfa79f14f695278653caa7a2b7ebc7079c4132be18fe45e020bba5e846109ce2f5bc92e1ca70b1ec21f6b1813bea96f0af2c4409c54c2005684b30e8bb5a787e7585caab3a221b918936f74fb74733a8032a8ae471695e776a188ecf9832e1a26442eb8052b1e5ebfe8eda19019c8e727d73a3afe1304c3d6b0b033395286359b478e60dfeeb8481bfd3baf64cb1a2647f6fa55b67c2975868a030084ff60145e2d7b585582d2d3656e24f5809067baa42c0336660c46269ff",
+          "padding" : "3036301606890100000000000000096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "8f63e0cba1bfb93d25bab5873bfbca0f33a78cd5291a7634745e1a9260748b8daf0273225c0549dac01dfcc0a4937d360ec408901a54cc0a2c83bacdc18dd900a24994aa43c208b2067157ee3b04d089a76ba51afb829053b4d63d0b48bd1a96d0a705f8d9c3161a18581e53ad2c534d16723892230bee71cd5e6e05466c4a32bfdd3d62519d54e318b0d99946f04155ff172c2f066b54fb2965a90e129b615af617590c9d418697ac989f1f64468af5e5138df34f6e0190c549edf38f2383aeb08ee2ec697428a0ced1f5299c3e64eaefc507a72d7e32011c4ef56a3157f4d2ee72eb870ba77ce6d688443e0577ca8b9e768e8d7bd965ce894e506617935c3a",
+          "padding" : "3036301606096086480165030402040589010000000000000000041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "60dc41d5618fb2a8dcc94dd2e2d5d4122b4417ee6026f5e3e5e6528a2d59bce72911aeb2fc935b02262290b7c9e7648fe8b7725642796e8e06df60f94071d900169b2ac498cb13002d8fe2fa38321f89c593cab41223aa6997a356d184acdebed45ebfec4fcfdfcbcd0a8b5a74dadac80e372fe51725ff449bd6ff7e4e39be2288879a6342e7293a9fbb3b7faa56991b4ec13f48f27235e7bf348610254fcfe4b517bd010580f9ff1879c8c16973d6e0cd15a69b3ad6b9964f088ea1e90d548487c093a8afa3c3604cc2c6b928969d66605baba1810c2d483b9db183523b3161323ebeee3aab79cbd698126e893ed7412be3505a20eb09831e0d65023e62c522",
+          "padding" : "3036300d06096086480165030402040500048901000000000000001c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "1feb9e7455e16c9b7c572b6b0e095fae2a86e99fa92a8d65ed37f00450a20c3582dcb34c049d82c22200988da67eb45c2fe9d390161d50c3269250dd7e0f6f20a175fc4edaa6fc149a2fca18b3693b7779b686073e3c64f430c7578181389b813700da244d3725df2d63e0bff0b59d3894b646f94587e9431da3f508f23832b0eb69c825685bd1b9381d8127431d7efe2000bcfa5c507bba21b538780aabfe5aa9cbd8a075c91b487b29da70e18c48a9baa411f4f1d14ade15b09aafd0a3984013b376b2355ac9aac22b2695cd608cd9b9983821f1d570f523d3acbf119633af972fd5b311233fd0c7444c10d8b964b8372989640571ad80bf3f67dd1882d98f",
+          "padding" : "30847fffffff300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "43de19d59bba7bc49d2971d66a98e6eb34324705a3a860f74bff5edc1b41bb7b168cb7fe3639d7dd7766cfda9c8cb725c79c66cdf7b1fcfbf97e24ef45134b23e1028bdd8a3f6a50564970d9c8cdfa2e52defdc919a4c915104ec63b122323c9f37878017b5c2005af3249018417efdec9ac2cfe176a0f54b5b1b5cd949be1bf64e7e2b1d22e485bd215c61dc3b50af335e52ac5a9be0d5e3fdf6ead6e25146c429d7d4e0153a52e91504edf9e48ae8ebcbcbd753f06ebe111b72d7e24b80d5225daf8eec2bcc7d484a2fbb9d59c17cd5ab718557a452b848fc605b7f07a6a053049bc1221214932ac0892621b95dcabf0f9b2321a6af61fb4f47fa499d9f085",
+          "padding" : "303130847fffffff06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "70cedd06d21f7082d54c91ea46575e484c32473e9d4ad39d14a32239d56da1a8a1b5c61783c0a6d4d0843860b3800dd3958c93c15c15c454284b7c6e12446efccb5b2615a250e5f8f083c9546336e80a47bf0ddf427488a4937b57c269b2ed9828bd71c75ced34f80a3c7e5083462fb197ef2080a013f99bebde6bbf888b0e0c8ee9c68b3460ac68c82ecf1c31fd94f5fa8c6d931a75206921b694b793b0d63a24a569bafc4809d89a633e14671044464352e34eddb2d08ceb29584139065714754912dec831f9d3df34b8d7d3c57879cfebae1a987002d0705a25430bafcb6fafe8b1e5f113098236868f194457ba3e879e087e2999e6f74e2ca7771cdbc66e",
+          "padding" : "3031301106847fffffff6086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "b7875711a6985e2dbab6e3cc7df4629c99abdda3182a4c7f4b86867a71c929401ee9946e158a1ceeea97882acfe445fa90bdbb1bcdeb28eaa94791297b72e7640009299842e50015fe5cdc1cbb291e54c4aec98de74a012df737192985a89f3d3c8054a4bf5898fe9af8ce3d3b1afd21058929113358dee5908d598e0b531925dd8ccd03d1e0d885c3aa34e357a85abdfcde58893ed59b862dc6c98a35537c040ec6bf7d7af0654c50a3280af8bd48a49ab6ab7ce3000830508017576bd999adbcfce47d46fe6d2702528b73adfea2d7741b082af7b8bc4238a87fb263537d0cccf0cf93401915d7c570cb29394fe98878c07e983d5281a54bd27a097e065c39",
+          "padding" : "30313011060960864801650304020405847fffffff041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "8abaeeb60987b9a8722ab291049fb5c64c813a1bd6a147fdff93aec3b127f2dbb2af213cc920c7717c000d4985e0c833dadeee99437876d3d493550bfecafed0b3503436ff552c773e4d0c60ac9196efa9fb6be10378128c98a96480ad9e2c0242d1a7a9e66fbd7084f0c5e0a8979f2940bec7b6ceb2ae0bb221ec23983d6e3344a0bcda92263f1d768c1a5b9df555aee8de837060052a194851b732d373633ad441bdc761ffb9ea6134cd2982071f780b4fe92bf9253d4f8e8f07df417d1c2bb49e9268bd5cc0e4e652c38a44daf668095507ae05cc5879816b9c6a146330223c98a096847cde6a3e724afd9896aa45234c05c4a259dbc9ac8c8f93fa18181d",
+          "padding" : "3031300d0609608648016503040204050004847fffffff753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "81d561d769770756f1120220a1b8abc6054560f2797778bd433e53e256419f4f58b0ad1356c2cfade14a7a081d1b93b37b5edf2cca3f51ca82c683781e25f2df36f20af9a67491b302cb12f8b96c49ded82557999ea30638fc5b3aaf546e7e81675c79299c1994ab1b3ebbe6adf6f91a4b5fe15af92f05c4f9a63339dd53675e843f50d5e74c47ef3a9f471a7b5966c7995e1dc9bbb3f14187636c8aa1e1d3bf70d24642396765333b72a2d450d839a6582c7a285db440734e2488baa416ddfdebd7b6dbab4b21146c9adde2a14f69cc69aca5bd0a80f285a4aba56b2f5abe0122edfea4b75404ff0eb6304e10886adaabee2b778e36527f38335ae0932f9d11",
+          "padding" : "3084ffffffff300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3b8ef79b1e78c674f827a66f305d67324d31847c0855cbc993fe9159f7a5e310ac2b30621646dacf58e57bc7b44a139c0834b3252f9c06ba6de582bd90de6e94211431820de2e00b9b0ab100239a5a75bbbcbb1761d85a3570dda4889bf37c8d3cc0faad74baa8c83124394cd10131351defb1673cbac952c4d968a4af71a28fc776f6f070b087f69a4d924dea561722f1029dd0c78bea40575b7faa5e8f96d3ac66acaa75aa5f74d11fed5070eaeb9f05892b7faabc4709ebc8b1748fc4d97e1452dc4dec40ab4789df166f68a4c8de218abbffba4b7b1733f81c47b3bf371a35114fff099b7db6fbbcaf37f7fe5d25a0399723a273e2c94f78cd21b4e534a7",
+          "padding" : "30313084ffffffff06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "423b43af069c6cc9ea47d73957dfde488371394e409d4f23ae4d3acfc5397dc328a1df5bdeb2f6bffd46b4da310e29d7a1edd998b76781f31f59705cd76d57236730b9f12366274bb532940d56ff847b38cc8785727b56349554791016bb559b6975551e41cf86b9ef83ff911c1968dbb9417e3d48d0a7605b6b6fbd09625e2d77c083ff5b8752e6a9a181cbdd12fdb636bba0ba9bac3b4b61113c982aaecbf64567009c97fdbca719ea01b2acce11a4711294fd0343a4ef1f50a0ed033303052a0f047e3feb19b0a691958a9392c97aba7fa8411f904e9e873f21224df5e6ae15a29327bf0948fd091b2aa611b40a5394fd29475c6327672d46a1f024809a93",
+          "padding" : "303130110684ffffffff6086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "5374a6b65ae6b7903d5c0d06ccbecc1e4cafc0fc854ab3d58e0a897ff7c65c859e808c17e154f1a8fe19ee7ecf19be910d6baff0d0a2dee05e049a07efa2dcab6cd429bb896655f36566073d576c2ee0829e5134cfda43e836d085c40f51690cc843c32831d37d3388aefd78a1cc2cb86853cb3ae4a92d86cc2acff509410d90a193d74630fc690156dcd4395a26047ee9c3f53b49ec5419d52911f2f89a53582b91618de91c23fdc665e3d5df7bea5c0ac4a84cc07aada130bf13c0be73552f9c9e40383e5d03d35f27e90cd3c615b55aeb0ad0ea3b230e336bf06cc785e11138b3d24e3ea40153c56734bd2fc8aa4236ac3f2e4b166b45280222bf444fa9a3",
+          "padding" : "3031301106096086480165030402040584ffffffff041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3a3184a997e3cbdfe9fec8d260c7e8b09bb7180f65a83dd7d926a0355f1d04366994b0363c92de8730fe85f2f81d15725a6e9f7c06d01a7313d71af795a4abe11fb4c545411fea4cddbc128c8b8b0e713de1d0e78e457551e57a9f55f3c79b126ebcb586d5321ee78ba50034dea7a315f7c571922898230cc0c781383da9d3c2ebd936929bfb1a20bad72389903ee558a904ba39ae931c1ae9798b5951eafad58b1dc96159b1c7df12c2f47e81584099e33ec98ac9b08c192d676cb3eb2ef1a4959e8c29ada3f9f3738d0eac8442ac0e00fff98ce770f629a4a5a5effb465bfe4f7b4ef18432621cfe1d14a99102ab2ff3cab1ee37553b28bec3d04b2cb1e161",
+          "padding" : "3031300d060960864801650304020405000484ffffffff753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "89721e40d6e14639991bdefaab28735bdf50739f2583cb9ab34f4298ecf8070b5badd7d818fba03bace4d54fa050117cae3f575a97cb31859473040360b994866918ff6b83356ccf53ef6ea900a1a8ee77f31cd5cf25245c9c543463d09c4ecdcd9886513f630c9bee91ae0fd054cce64199a3e43ec3ecccf68a155f2bf1086c59ca0a3be47cec1d8638b9120b67d7ba03ebdd066493092297a6bf597ba63062dfbbd428bcd9725afd10586f1d6320738362e551ccb8631d802541ae74348dfb02f8662ff237daa10ca4efbe33cefdacfae2e6d86d96d7d06503c06375ca1abd2196bfae5c2ba9a2f4b1cc2cdcd59ac24451742edb3152852a89e5386c16bf37",
+          "padding" : "3085ffffffffff300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "10264b9667483464d2bff8d643de5bbc3482da0563fe1e77f11977c6c0c0b9c8699ab5b0ea87d123f8a73f4aefaade654f550a0e5197468246e5f8fe96704172ab6e50da24f48793f1de62bebf8fc54a2ddbd11304678f75831da77f3177b458f3ef73852fceb0c25fb91c1b99e865dac0deb6bfec1d924ceab739da876e7641cc3e3faf530d4a47b283b7a6954e943d0ab1435e217687ce7c0d0664c08b307401f7473e732a5edb1e5b76960283a29df5e39abae0a4ac89247c82a828273415189858f280a98ac509303e2a94c01f5e28aa4f04468744c9279858de3d3e81e534816eadd8d2188624f83135529544205e03f9aa256ef31c00cb5bb4cb69607b",
+          "padding" : "30323085ffffffffff06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "7f9b5c22b357cf95f0e3159b06bf2be50ab22f94217538f626f805828d8f154366ca2539e9b8e3355cb289bbef43531ef48b680bec72416e52f850d0c0e72112e6f1811d12a10d50251d8d526e5a11274ebaed0944ff3345903916e19f22a7f25b06005bc78c8713e30d0881cf9e6b510283116ebc44d61341b3fbb4d2bd5849636ac0ea47cb56bee1f6db9c6fb6766304fcb8bae7d58f82560a110c9d1c4d4d8a9eb3a74c9fd535caa86d6b890b2829da5f708388e19d2abbc85987b26e152c7b42ef48d8f79d5ef4337a6f5e19824905bae4b2afd4465d1dabe967a7193e6733056c5c809eb8084126644302ec9f9e672d6cb40f677b0373714fcde4009d05",
+          "padding" : "303230120685ffffffffff6086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "57c8ca1d0e8daba503da489edc7ec8b331e1088090142947cf10039da674933c33fbd7531f9998a67f4e6bc9d1a87e07a1a86ba821242d3a01f4755bff8130c4ffcb44e285cb72d38f729a1fc71e1df6aee5ceb9ce83cd1f635c201ccd0e7f975d4a4b0154fb2badb7b170832fafc9023ac74497fbd0e70009b55f79482a174573a811bf46a774d63ff3fd9ba22d82ad6e46761e9ee3b87f2bba58d76a26f03b4d5ab6884dbe5b51475fcbc2dd160f6f9b86d54b6f5322445ff8022c3d5a78dbc97a364842faf3e3be6b02faacaf22ee98e0aabdb1fc1e9c546d0978bd59f9062101b0d86c93e095b2b080067ca1cb2940a2271a6e738af88a2b9c92553512ac",
+          "padding" : "3032301206096086480165030402040585ffffffffff041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "2edc01b091fd7a5896b25ba0b960548a9c799f1ed7208bdc320c44ea15d46483c8dd8775fa3c689739defabdaa927f88c954befdda8452152757448c1207cc694af555021f5756982210f44780baf6f50ffb888e763ac87bf048611f9340c0ba78227f980b81c059925e3c5c42775e45d400a057c1846a314f5eeca92ed4febba7b4a91e1b1c2902471481e132d40681aa9e2bdd4dd481102d2c8259153c76d41d49106cdd3cd30fc0a0b06266f3cb4b6cc34c60b528cf7e7ef9f7d42e5e305dda9e46d070548c14705685de7bad5970b165e13cd46159f957cd2908b8eebba955d2c6760c16b3a2d3e9e1fca3cd8f184b30b1d6e188ece497e9e01c8e2a5267",
+          "padding" : "3032300d060960864801650304020405000485ffffffffff753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "6cc03e058bdf3761fa04a89069f97bb0654b41d00d825152cd00db635d7844d75596d33685fd02f4a1bf36040ad71d5c448d1e2a95d23dc150463d85394709f95d7e37aa44fe300e3cb6c59967cceb81e5741bdecfd1d877e5e02a543e4acac44c4563df5d5d2bcb20e68c26ba032928c5019b3030457f4a828b19d37c3bc5f341f00e15f14ac1184239ddfc66ad568682620ef099c08d088d5bd0a95935401fc1091bfa2a120e94d25a54cde34c455cadf6b5f784392e3d8a687a9c56f5348fe9e5082432b29f64ddcc292e445f51ee0af42a595e860b88eca2aa486e8c3998c00a3475ba04d740cb1cd3f8f436531271df58bd2f84c8dd20cf45ba4db256ab",
+          "padding" : "3088ffffffffffffffff300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "177e1f3535ebf19016eefcc188271b53387292eed25eab416ef324d58b7c26bccd05e5843e49b5ea573ec7557fa3662159318994595a878bf162f5206729bb960c502e248a1bc85bb60025ef41d9aaccc040d99d3b178b609a40c1581251cce8e6f410b082d5635f94dfbd06885f2935fcfbde23ae0ae509af1f39d77c2d94c0454cb173ea29381ebdedc4983e34efef635f954f6d911968c4f79b6487b28ef427805f4c3d14d2b8ab72f5d736cd48fae65ab3565d8d3b7af61b56f691c064146e424bd6db124ac9e5fb82e9a84e2d7da8ca953fb8db2a845640e6d48532adc426c4761315bbc2639bcde29f420cb553d6ebff0a496ede669b413c80aa63553b",
+          "padding" : "30353088ffffffffffffffff06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "473595c69d05d4776a0cb1186d8b898421123b863ea62b9274a46d488814a7b56e1d94ea2708f34b4deb705bd5df15ba0951a5915d27507bf145bf0a0e40cd2dee33e8c3171463d3db8c0f0efd77238ef463bbd959caf87b283927a304ccbfdc5ecee3e923ed7442afbfebdfd4af8e5d257015f21ea3b5d27fbcac0155238bd86e442e93e91659ead077893a02c32583c48e25784e0e3837bec334337b873b6b6660bdc138d3ea2f41b624116af4cd0ef70eabec4cedf7a3fbd83fa82b2761f1d352fd0770ac3bc00631afc7f5bcc149e7f13de23828cbb804218c000ab31f8cedd59cca89576c7234ff02e3a3ed3102abe1bb8c8e4de1a48192c703e24bcd64",
+          "padding" : "303530150688ffffffffffffffff6086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "5969bfdee65abe62a8cfc7f57efb08aa243fa3c4c4a35b62fa4bbcc3ab9aa45021ede863929644635bfa45ac7e73470bbac2a51b00f496f42bce087193503358eb285f4f45953b903858f1867870156f99b83c5b4a77a799dbbecc8eac25a5fcc26e559594c903cbfd086e72bfdb28b0be91d9f02f8cd94979937e105d2dbf9d134d0451a39f87019c1c13b22a6fd8d4d3603786489810be8078d407f614e4c6e80981f9c3ce32180c1069799063c6d759ce6973322043b611eb957f97d96b106231b52b051371ba5b36002b64b0f88557f0178bcfc040236d675fbcffc0c2ab9e5edaccf00db475e3a99396fb15af3b7ec93e2de668eeb91e6d4d4b78881308",
+          "padding" : "3035301506096086480165030402040588ffffffffffffffff041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "bc0716ac3f37a44d86b8225bb4834ad3d4bd10b171f36fee3885ce424e958e80bcdcf644ac3c3ec868c0c60739d7059f0e264dcfe73fdd708f13cc931255fa2576915b6e40b99cac7b40d259862316ce8f140435d44c973d6bfc48a26027cb1f6044aade27e387f950693e5a2787d6cbb9a38bf64303503c63c02f7649df3ccda47a380af779991b1f7356d81240d99a924c0c389c5fbe2719f7dee3f84283cdf41fed95341a4b249c92df9a93b5e8d031a8d693c9ffd5a91fdf2efdad0feb11fbe5e5eb5ac51ae85c65a4f0f0b3f67a0fef3f4c5ccb340cca0b43bc59015f0192bdf24dbb1e92ce66b534ffd38dc44f08746d0429271ccefe0bfda3c8e5187d",
+          "padding" : "3035300d060960864801650304020405000488ffffffffffffffff753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "2a0d24c903c732f2ad18dc96c7e58289a1ed5887006f1ff7eedcbeb28b517171a25e48bd161b33f8c620fc42f23cc0a4b3ec0c03e42748355650baafe1e03cb1e6dca25bed0afaf5a56f016372dae8b3d92e21e9a5dd7b56b26c9ada092805bdd6933cf2a9017bb258cc19cdb04b2ae507894527d93a1bc85ef0b8f3c2e6fb9671c75cba20986ecccae16470d2a0fd8534fd879d65e62233d0e6450e503912569db3ec382210f8173753b32c8302137f0b3a60faadbd5a2a5c7d117f248797ed44345ed43284adf7655e7f70a0d94c4b05f484553761ec8b7be2ab5bd66d3110b4fed00d83dde2f5e0c6e0dfad1f084a851b07fb097481517805affc7e5abb72",
+          "padding" : "30ff300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "28d582ef90052ede462304fb54653941f2b45d26998ae7af80f058646d2dd472d7ae738fe4ec226e2937366e759d2cf741b72cdc85f49004a143a68dd4c820985a5656b583e95dfdf48afe5895f6e02d8ad5131a522d8bb005303005ffe99fce9374cc538cc78d4f383dfe8b95cdee1938a91c847ad0c29345c99efb03424a4a04e52e5f955eac56fe5ddbb9c103223e0b3883ef4b1b787ccac10d9de11b85cfb8d3f675d18144ad64ebc59823653d54b85696bb6989c54dd368f0a130d8cdba7945216b7dc1da1f0a85e73f1458e009884d02106a2ed5b66d9871b5d1143d0ab5cf09b76e98d4f03675ff3e74af40e4fba4f9c0b87653455da30e4dd0897cb0",
+          "padding" : "302d30ff06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "296c0c4dc1182111feb1f9483872c861de9ef9dc5a0eea97a233379d71b07be1f7f7cc0447b069d871a98d14302c9e54b451f1a060dee8a190d20349eb9e316fb271c8fff3f0125751d3598a14b47c80e49fd772bcdfe08139cde367ad978a642d57142607a1ff367da8993555be75f7e4998030f2c90f7d24979976e5edb547500aa6f350d31b50834c476ca7d679180cf82f32d83489e5246352d39766ce357b83f21bf9233884c178bdacd1b59c084a287208418a5b09f6418720a4253b47d56b041b727b104f4b913156daf797946ce69f6c565aa679a210f300987b12354d2ddfa1d55ee133db4fea872824d40b28d10670a6dd781988cf620c1dc26022",
+          "padding" : "302d300d06ff6086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "11bd148f30f52678e48cc8ddb9bf60ec1d09aa9b80714728c222e249cae2baa098adb29250ec9132947abf8a28d287d5b0401ec86fb91e0995afa30b14c3f7d7fddec5a9e9dc9bf7eb43d218bccd469ae7972807bcdea685226995b3858d5a422409dc4952f661ee8a106642cacd264e645d88ce915caad8355cccbd56018e166fa7605caa05092149407a5cd469326301e4177f613b4ed967d9361bd703ffe26d9c149b583316c0d769cc2dbe5c4e45b0843066173a9dd5874f4498951d22f621be210135a4dfc91a72dd4d2423b3e8baf3d5ba08afa79cdc2bb63d0fa9bca508ec8e13c2dfa2c2aaaf2922bcf8623d8c4c20c3d927c726c57eb26dac95f49d",
+          "padding" : "302d300d060960864801650304020405ff041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "4019e011da7e59b601fe76db0333bf9fc0d2fe1fa33cf0569632e39940affad58dbe255f0e250b5dc5f5f4da0dae5c8a7599e1c6852c9cc052b4d7218acfc1cb6d2899b7e5d06eb0a666903e69383ba4d8bc6d2146a4a54cb0c7ecbf2e60fb09f4611f0d5692c653b31eb5795c838303ace417992185e138ea279f2081ae0c65c0431d9aa3027726674690ceaa3f0cc838bdf1eb2048f1117e896fcfe71513357ad636cff8d3b0c0ea2948d6c4a055cb61b0dbc56b346a6d9d3b8bc18a038d98d8a20ab63ab8798884ded8d9a11e94cd83d6d9a935abf11d079059d3fe6b21db0508ad9abf8603acf8d52d50926043033e054a81e4276fc16687234d4029370a",
+          "padding" : "302d300d0609608648016503040204050004ff753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "2ea2f54a8bb688cfc16d6566f6b94d3170cdd93451316e89bef148e70cd85e185e5e19f23f4a8e7a5e65d938a43002ad4be43b3be2e409aca1b69292928d98830945784abd1ceb0cec45984a5496d0ccf9958efeac39842ba50a1cad7130ef5b227fe93040ab7f4226d5005647cc1b0259373e08ffcd242b77f9037797cfafc0254a96edfae31c4f7ee08833c0490082bd33ea25a2138593cc88fcfd7668a82f0cd26f4e1dc65c4e010c113bb2678c91254de5eeb689b582601b79ad08198072c51987602fc78bee6bb4754361bf5be123aa9c1f8c0d8b2a804102962c8da772529947bf2dd36456f6ff6132a0c6ee7347afc5680e705ad3b8e81c9a04f6a807",
+          "padding" : "3080300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "0bc548744c7474e5d904c1a21dcf938ef8abc3fd1a0e20d94564432dae05550449d4b6ade94503073f6269bb71afd2b3207b809d39a2828a6f14774bfc04624255c1a2f28a722925e28115c98b20e98016fca0f8c4b3e2947e555113d7bc88d5586bd5a0c361d290b4dccbd1cce03a6df3dacc1baa516b1664608e6b9b097e64eaed352c8dc9b8864b0111581b97bd62a0f1b9396a385de650690e36818fc38d042574401c9dafb28b81ecd14d1b9e64ba867b4bf29f8e78fd919ba2b00f0896ab7d7df12fe4a8f525cb5b9a5b1c13ea609cc7d09b6ee57db3858e62270602662e8b160d7d4b76f2d128c901ecd74a0e2188aeea9c40325c18937e0ab67ea4ed",
+          "padding" : "302d308006096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "bf13c64caf9726506b5cf9605c68252c38c9151064fc85666c7572145a72fa04dfe0fa5aa12f020f4581f1b199025e44aee682d65b1d6f78d52b03466fb52c6c8bc2adf65a0e20cf39f4e9d62cbb6746de236279dedb71e4c3b27fa7b4263911ef7ee2164384ea9b47ab8efe33c7c41a785b3b8c3aeb329248a3ad4fe443828b73b7da87475b1ac102b582ef16d45678000dc625fbcff5fc6509f3b42e0b097617af91c63bdb661a6b92f72cb1ea33a6ef2b6d23782bb87d069f9726c8c91a7b412461d59433a85f04f01a94b7db2e6b493505f6ab51dd2cf37c22cb5b3b9cff2316fc4a7433af2f6ad4946bd3faffaf03fafc1921ba7dc135f3d06f76ab31d1",
+          "padding" : "302d300d06806086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "4789ffe0c9ae08e5b4a13e8e94fc0609c0485dd09c3d10621187aca1a503b0ad3e74ca519bc90f171f2de9246967b16ff69730a4fe9073685d35105633300f8af20b543f281fc7c2580a7d90e5977b13e20e3598daed7d1164f99999c49a90d50350e5e5e134c3692bdabb75fde51fe7f09bda5af6d98eadd4396bd90782579b02a0d60bcfab72ba3ff4414cd500360b21f9cfab420ccb67465967bf5a77efc2baf38b97759c28aa1df3443713c2967223e014182699c82169375388fb204b8bd609df94f5c14de98c4c4a97ef52bc4a26907e5610e249aeca9c951b5559ab1a63235cdd50ad991efeeb5cc87c2f270f3ef916c76beb90dd0fe380ef1d7f54ac",
+          "padding" : "302d300d06096086480165030402040580041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "3316b766710c2c54ce3c42fe05188c41bfd22cd91282464930c763ff3325bdf4cefe9328e6a6a9eaa0392422cc000a78903552649146773612a9becb4d7b4cdf2c6e468bf11b2ced75dcfb3f5811b596894c8dc7948d88093face5963356ef5dfe93a0839c0a3bde0ee33319fbf28949e9bf8710b988c6300beb0b04cbc841a9018a6a2fd6cad033fbb8e22c8cddf713fcbd096d5c498310a11863c276ba69d81a2327a0972bef0db5303e3d55dc4ccfdbac75885f337867e81994ce7e890dd52a0174639167b53718ad2dc59f75bb111461b713bedbb1fe00c790fed6984b630ead97647648bb09b65db20d2bdbf63b1101068d82a1ec3b2891f932ffa918cf",
+          "padding" : "302d300d060960864801650304020405000480753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "4f3eb885b1033c3f5cdbf48b6fdcbd092972a466af821ebbd6f8b8a2508240ef14957e9cca82bcc1b3124828f9e2154353292ba3339f19e5e35bc6f6a678bb0296b2b5f54dcf9fb4b19fad1451c61539f5b2a3c0e94a738f25309ef87b273cfc3495c79a3937ea0cf56d3bce104b9b1ce30561dfa64867ff722c37973afefea4b5a79073f8ea6b0af36c9f49e61998381d0dbbdf9243838a987c7c446bfee0f18fd90ca023c03576c1ee24d8e2706d337f126775f6bd3ac3c5985592209b2d15f5ddb8dda0a432a5992d784dccb4d84f91e8edca9eabc4376411cde969c703eb1b61f0a8b82cce96dbf4bd97d574efb97e60c4a2b50808963c36c20baffb0ea5",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "2d481e02fd9cb19356afe5a88342998ef96ef107f5b365c55e24073b815907f3ef9a628146f13101dc8305089ed0487576fa5b149ec6d80a0d1e6e8d874d1aa15f0261605105a63e41c05ba80aebb417a7fad72cbae383a26470e3ed867943a2a697b0e89ae5f2a9fa46edac74bbafec445a5d3f7ff8b010b6e0e0dd815f5a915d867c1345f39a3ff33e49e02c10dc0c87c1fbe3adfe8c21024573fe22e8f6700e9b577ba0c494eb96b55ac1fd6cc041f17f834c6b8b6ddc1c4087b6313012532365bf3771ef37bebc694fff80ae7682452d732da71a30cdee5af3f437451aae30d6b240752d87bfebf1141130d24a470fd991bd06bdc7fc1bc428380311dd86",
+          "padding" : "301e041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "421326a7fb2b1c3ccef84998301905f4f7ea1c3b9a0edee378edf33a555bc379399ba64c970fd8c41a72f6d7f6149908d22700f3836fc0baa11f88a15ef9aba5337c3d5ba081715749b04c3a05d026f17ff8c781af9526add7d138e3899651e28544f21dac75fedb70d1a38f48eb711afb66dbd275ff82fa2cba43d265f07b2087821d63a5467c9ec363bef9a55b65537e15fa0b2015d8e3cebcf096c63733cb418336e8f04a86ef9f430d28b78352043151deacf135b27805fccd9ae4bd6e62b10c11173b22ab155555a88960f3d1cb8ec761c56d6d5aa63bad6b0cbb47a981e283f3c494411a4c3f27d26013e3d09bdb7efbf3073443951c83697f9336fad2",
+          "padding" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "7a722b22c2327408ee6035df9006171f719469bd5b48ee865978b0224eab4f0c3ace1287c3d95cff5c266cfa54a52c64a9b88d15610f6b496d30e9381c6bd83cb94ad574ae7fff00723d6996771e7395705f97c8e7677a3132dff741e38a5284e7fab7a68b042c5df40ea5adbfa650f6cb3eda0790d5be4d16ee07c07d8728bae2cec1d128647cbb2df8606a99804a1a00f9dbba76d4a9cbf013be2c541df73041e7cceb9a187c0241eb213e64ce29219f9acf064eb63a534006277ba02fe5a8c5fe0f040f4323acf78864d3b8a6f6ccd108131dbf92c42f42159a6f5a86651c1cfe56750a79a2a842f8204436800e51eefb7344f733b50e525a06d8dafc3807",
+          "padding" : "301f30041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "047d4caee2c97c7feaa65b9b4c183f54e7cfc8e94c9cd0c0b4c4dd204728c357b959c38376b74e65fdfe3a4b21411e22d3f6495cbb905171322132b879a95fe75f62bb7e648e03b923d6d1e56c810b9b71fa3b68ef01070814e56843a9b943cc83eb6f0091d4c11f0608697a859c3265a5554befef16557435072e251d70053fe6ec28b1399f8ebaf7956868412bc1dd7b6b2632098e3516a133fb13e690e36605f23a588eb1142a55aacd434e7ad8fce310ea6ca6ecd6214bab17ce772c99059ec9fef69fe2d3b1580d53d2ffde3c5930d203d7cd3abd345c56bbdf01804bd146468ed5ea193eb1b329ee33b57bf955704be426768b22654b988365271435b8",
+          "padding" : "302f300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "b0bba3124e4e8d991fefe71464559da12c7228646a5901a7475b1c71e352d6fad3dd37b16601deb4df3896535810dd9060223c0466035c4a2a481a19be2f85de7f0bf0d511e73681717877fbb6cf404727cc52a966b0acb3788967ce1aa5ea887a419f96454e583553ac07b15b3206c984dc32f555612534677bac5565f63d43729a3d2b5af5303d4af92027593313df17f46671caa4ec8deb10b870f4114abea7c11a32f1e66b1ca92fd21bb3678cfb039c5260ad33deb7c2ae1e847d86fb9eba1f212a707276810b91294773d469b484a9c9b2c655ebeaa9f0f77b96e2074c2441495351f605201ce8917d4d8755a74322f88157189dd9eef4b9166967189d",
+          "padding" : "302f300f060960864801650304020405000000041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "2103686c13ca1ec2567a0364cc5c7fbd2d3912d48e8eb79ac078ba92f780ce084c9e2684a7f162808499aa3c7dc17afa25173f6893a382c8a934f1bf9c43b0b3ce7d40f6532fcf6c225286362242a89b9efcc3ce8575099662a51d5ccb1a7dee56c25b475638de68901b855e6ca4f18286aa358fa92a4389fbb0eefc6afa547c68e2790980c41889217b5914bbae5527e7193df70562f4d44b0ace7be822470429c4798c39f33a36870cd3acc0006c356f6a3abff12ace4960f9a03ad1acd44598edf191789a5f8d83f33e4109ecb8a55e66bd950a7f0e91c369fbc97f221347c64dd49ca997451678de3f60d8dccfbf29f92f82c1843500b41a6aab49a2a146",
+          "padding" : "302f0000300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "081375d1eca4a5d33238f9bf1f7354b2d680752617a0caacecda023045cd5bd28771e38f24fdaabba884c87a70030ababa6a4a1d8e3d72b19dc7474250ce2d048a8ced039c8ef4fea770df5fba7ff5353d2beb06571503835a690dfbc43a40b2b9cb10d244c91a50b76f0e0524dd123a8a304378d1bfe6c10d7c281a77c18db64d844ef62802e93dcfe1df5ec9efb8e08c3bcb7d579e1acd4b0a0c33695a15c458ccb507f1715cc79d5c30d90da1de5d3d371ee17baaf51dbdde3f282fd266521940d3d1b5967f830881bf235e4b896b78aaae61e2105ce61fc7bec6274639c05a9ecf59e27a4b70e14a8b13579cd69b5760859243d04d2bc0b35097c551c748",
+          "padding" : "302f300f000006096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "3f04e9d3eeca27f5558685349f50f5dec7cf3d25801b977d0d07028fdafd462c7da1433157637cf2e32fc5b83dca9b3e293889a31e3c8d2e31eba924baebac2ceb7e3aecbdbf023f4e1db0e3b49884ac42ac7b79c31dc19796fd08bc95b08829703dd4ab6ca804a8f5c601be801632d17e08c217b5ff9d4680ea36fd553e51d7477b4e5360b2c076e7da5a9894579e33bc35f797b93d2661efe2bb87f557aca9b1e65b9b6d8646ae1771219cbfb0ed82b18009a8c0ab729b2e3815c6a0bd7d4eb0bb0dd209c417ff310678cc6b5813b2acd4d1223f5afe0ec1e08493860dfaea196c86c35f4506fd88dd78011d2accbadfa38323fc3a9625ed68cf649d1aca94",
+          "padding" : "302d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "0411baa04f289c095a5bf21c481c848caadf6786ae0d9ed6f91a785d81510a3517edd3ac1d6ed4746110a109c8a99bc549a1409eb72a3681fc858249135cb5a24b3aed3ba8b3a33f472b15807c223473bcac0e301a846f6a293b28ae456987b65ec0b1dac7ad30eeb0f3e5d7dcd73978e79dd4b0c80efed470f5c90c8cb75e88c89e49a2c2a3e5c38fe34f57c6b15b835b4cc086721d55b8704299b6cde3b9bb983a9f2403ff68d3f9a55fd40245f421f586cdf8307d73cd77d42e0ba886ae5d191c578c3f4cabed531a0e32899b711f33611a5f89398d903dba08c93084d08e705b1fa5fca28b4e3bd031f5a7a0acefaa001545b432d6665d5ad80ca4cc72d0",
+          "padding" : "302f300d060960864801650304020405000000041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "8e3dde30848a0ec2780b18b8d5cc10875a090dbe69b6ab4e808e723372eeb7752142a3c9be04834d18fc4193e64a1436b7c9d6b62204b03afc122014a6ec2b2037baa3134344b612938a0dffa465cc4f5ce76642dd266afc5375f50927974c3fa458a5cfef69df6316ffff6019f00d40e7951613fd20ba9f5d575fe1d81bcbb1f51bffea42cb5624b3ec5c4f471e3f9fe6f0dfa162bfb6508711150d0727260b63cae72fb429b1153661fb6c6b7d3bfca05bc6ac9e96876c9986a05f62dd85693a9fd8748f9cbcc30ccdc393f9a9249af15610a2ae277f26a05b99dada16354ad93853dfbba23f817ac098ae5007d7e9bd023d7a4d803d5473087f3ddc0a9e71",
+          "padding" : "302f300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "573553d7dc7ae88321d688df3ae7f6a4a621452c55b8caa6c79c678d30f73413f4010a4673971dba59f2a31dde45fbccc00a24c316e186ee0769eadaf6d6fc11193f389fe3d874afe4ed226908acb2de226151d81f00cc8aea420cc2d8a04b24fad5f23353932109ab57c0ac3566b868692a8d7f50e975056e4b462debffe9d8a7ba7b8a2623970ae17ad5472e5fd1a54a4592d4755cee2a4c48391850a7dd732ffc9fb1387d63aad77d767c5ffedd557bfb7c733d8405355c9eeadf376b1ab3a83de9a2711f78903509f030c096cd1b26c867954c6c2c2785c19b438990f4f9e2748da577acd2985301065f5883325eb154294b37398dbc402e805fb637e742",
+          "padding" : "302f300f060960864801650304020405000500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "8f65cbc7da6bbcaddabc96881f19fc7fcc12f7c37995965904a130c83f94294848ee51ac7e0d631f1c8f5de531297b458850179b41bcad718bff75cd7ec3538bfd4c24a3a66a1923ff803595ff297077a7c46c86e58dbaf8532c79c10c630b9282f36bf1cd10bf944c10d7031da6e70efb61850dfc152dec6f5e046990a1880c6d2f3b737fce1066adb6ac7e83f4f54a8364406c85a3eba4d9d5d3653c2e18fee613dd6d6c3aed29db13eacc0ca6f4c153c7ae623061bcc91f9909592c909b78e3da2a030b885969089957ed8e5d547f613d0f75dfb3a6192d49d5e35482841457bb97153ea1692fea6498bf1530546014eefb1041404b04034184ce1a93f1b1",
+          "padding" : "3032498177302d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "0ef30aa40666dc896d83d48f76736806caec90d3e75fc02f61f3d6b2286cc695cf91a4fd58d39cb970c1c1c507431f9401330836d6e98e7d1795ea2afde9adc53da7299325c1b982169f96b11219f1cd987796522148f38a4539420782fa2d7bcb28e836188054420308ab512014c85dbf21acbdc2baa2a2f044de110701c0c42f842d6bd25460067787707b52e1ad14d46a0d815c754cf7939ed10467bdc0de1cec481bc2848dca5a385ba2baebd6b23086ff70eaa6ac2cddfc821f1c989573c749a86ff029faf42a1193a3a23571a9e1321f0b8c24f76c4b6828dd18e0c2bde1a3dfc5d0aa59c676a11c623d06e3d2fc652dab6a980bc4957f3ccbc462ca6e",
+          "padding" : "30312500302d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "b0e67666c17cecdd0ab49ed69aa23b34da30fa6607f0f1be12bb6d5fe480ffc3cc253e97159c4e789019b78d7ad85f197eb91852b03d88610ecf3d63d9e3d69ee2dbdbf8715f0ddf2a0c238dbd83382488acda3cfa51a5f52d060b089354cddcbf76f0bfc74c619988dce3566310c884cf03a4eadd422c8f821865a04a991c64af3c220de643da0bad6a71aaccd87727ef62230c595312e40b1ef12d1b89da7f2c729a94a3c576b750061f150d074ac0518e1c0fa83a015545d56dff6dd5f549a5a471f6b029d2c0aa638e4c797d1dd6aaad0c8e58dccb184b56fe4fbcd7bd43a97e6c1abbe1f44ef0fb0ac79d573e286ef13446b697d2351c00bfe8eb4aeeef",
+          "padding" : "302f302d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "1d02530bce0236b2b3de8b12d0b6725f703f679b39d28dac0764df224d2bfa712e22bff1b56b9ce565dff215e762c5b2d3e7e5230566ad5eb77a5b1eb10c21be29e525df1e7001a9797340e589d078617937eb24ac0001eb4990cb23e8f7ad00850ab8eb2f289cdce45812ab38b902386327a6480a76429bcea479da842ae8d632ff6a5477a520369e7e40e2b1cd8417c27d6e313621339229033ab24b516fd10c4bdcb39fdcb9556567592d79019954be9622aea1751d73f9745402e945b3d9aef077296722865e2f9dc88d1c1e6ff82e6196f690531474165d8a2546b1a40992b7235bd6706a41d414310e014c091e10a8e6cad578b9e23126166ba2cb2156",
+          "padding" : "30323012498177300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "5783c140eec08b80c4b6ab121a106a5eb8b98d10316aaacccdc0a128d6abcd9b69c94256990fa05d747473d39dcb7b7a105c355fa59b88c022900cc2ec0cc0b6d86c498c50f21de8366e497410820f16d21f49ef6c54ce7c83cdb7f6705a65be1c9dcc1ca784933184bdfd2cfdbc0e6849e7db44a14fc02bcda843ef3061a125deadf2ad5e7c64301ecbc8a0bc307c4a92985b3723fceee8343622207a0dcbcf82b3130b6922156c09cbd846a59795a7756ae6c71752f73e740a1199d4428f5bb98b03454944af3553a98890ba5c8ecf63ceae9d2bac536752acd2752e5dd84780974aaa8a1ec2560a04d43a69c480df1c76a64e734b7eab7c148d22b198ff8c",
+          "padding" : "303130112500300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "ac353b1cab78df8b9eec61d5de41f878f246914ab28d983f1b9c837e2d5b85df9bd27f07821e01d149c1e2e6a95d49553d23ee075ed98a75cb5903d7ed474e2102ead177ff584862877cea040714c3cdbe7dc0a7dab28492d7a6d14e1405b8d3f21ce35bf68a1afa46fb0de0c5f9568e3342b30417cd245492869d2264e1c450b0eb22d03aaad0e9eb8f6664e2006dfc044b5c147bbc31c09452d00e154ff8a5c15de66d26cad5efb656b4512f73df85a577fe83efca291c10603ebe79cb3782a79db4456305f259e793300899ec565621aa3700e9d1f328d161aa7d2d511545c3d2f9e3d5dcabd9f45fecc2fe43d6dbf5088362cc1f5193f8d785bd5230c6f4",
+          "padding" : "3035300f300d060960864801650304020405000004deadbeef041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "b97bbe22841dba4b6d115e4d297de6e2a7eb18b69651b15933d8131f5184566129d84e7e3cd9f9670c1b082afe403e8b2082a66db6178c8511a6a1e944a257ad28b163653455b9c416ab2914378d2bbac4edc5692bbbb5877b98ae7f7aa17f6db1a1a8c110e6addfde8d083a37462b461b842690443d3ca2e14a420fd8e663a2423477b0ba979b4f99be3589527d82158d05f437961e29852efe2bb7c3ea1c60993a70170599858f951249405b596cfae321ae71e29e2380455931c17387820d3cbccb91b6c55c53734af6dd94bfbbfb5faffbb6fba6dee37274bfa0c4e486d143b6a820f4568d67c8917cc05c97235984e1716a856071743efb4b00b461195a",
+          "padding" : "30323012260e49817706096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "0d6a1193dcd1fc7e17c72993cbc0d1fa3668496d131cf6e4cd70f9445edb45d228190c0bc05afffa4dc57a8d2abfc68beecc62bbbf0df0bca13101eb0e1a82e62d1f942e718f5849a8b47c9699914bcf6c69807c3288a39cd25429420892d20f9a65be77135921633f21d8f62481bbad628cbce6a5df56ff009ca635dc21c3d64df38382f5aff0397ff7f289b49da3ed1b31c4a25b39f806d8ff18298cffa65e312b663673c7d2a155ab7ecbc70710be28c597a291a2ee0ad695589044be2edcb7f91d08145925fcf3ab354f96717a801ce2d293c6edd89c1df4c9beaebd2ff8e360b1cf95b422729722ee8600939ddfdad24966b867f53be1ebff94e0733d10",
+          "padding" : "30313011260d250006096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "864714bb1336f8b13d8e6cb9c5c9b8523a136f48cb2e284c56f5d2e9f13139deebfe55e9cb132f07d5437bddff75083ee9a912c913372e343d0d4f5b23a19bbc3c4f35fc1408bd2ecbbaefea399c1c217aee2a0a34b9d37af538f01a304689f5b8770b9f30cf7e525179efb333793a2ee89811159e2d16c40f507de9341acdc841d9341a79d1408a6301521b8941e1e71c1d9126144de7e9b6beeec39982bb8d57c62fa8b5274cf3ab0a90fbff7245a30b79e407553fd56c068ca7cece808bd78f866412ea67ee515a4a6469be5bbe96928bae763055b1f327000387240cffb6a9934c9b7289b2101f9c121d456120bdc268b3f490a543246d21194dd3aa8f6c",
+          "padding" : "30353015260b06096086480165030402040004deadbeef0500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "9979b2682f0f00ea94c2e937924ea179cee83631f72c72bfedb182495301a15695e6f3046cca149e939284d729870500e639924422b693a1930f296b210b565f2ceb61254fd57e96158044a1c913621f5af9d3a8d593a9899ab5153442140650227817c5737353648ed9dcd137e8b2a8d66ba62b0256082f7d0d7f9c2cd8d457d01edde6be4021ed7cd6334c0d95633042c7da5cb9eee77ca1288e3b698ed435f21bfe1d4a6b62428b4f8f9612fe19bbb6dfb53b4e387c57de60228f46b3c1d951bc1df5ba6d169de2f420c9e2fbc06b4384eb3f3f3f8778696e862d8ed290a2105802a4a2376557406c7a390cfcdcae7ac71c5c8b4036bfe6718f7e258bb636",
+          "padding" : "30323012060960864801650304020425054981770500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "c30cdd24a0f73bae9ab20a2ed7dc92b7cd18c7603d05dd14498a6c9a7f3b5e332b6cba1aefce53ba9977c452317a8c5115eeaeb4da93c67d323381935eeba09f1ba8755e935cf6f0ecf0ecb7c54165f2dbb221a0a953795c38694c32e715e87673549f9bd1bda907b7f2b0f9430336b98e621e4fdf5c569ed9c5f1a146db2b1ecb0da9bc53caca8fecaa20a59ccd7a97a5323a90140a248e6ec764b9ab573278b4cdc818f202801678192fa83a01320753848b64d6515746ff99edf5384c8fa5317d3e9a043dfa613403b99e4a05a88310157d02601b940db9ded7121701e27cadbe494fdc855e583c1da47bea02520ecfa8242ea18fc61c922ec29d9d9fe209",
+          "padding" : "303130110609608648016503040204250425000500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "0a3d16f6a90c75c52870a3fd75ad9c7ea68aab871686c058659863c84c732ca8d41a0e890e717502a5abfec94a9190ccc1246157f79079091e5f5b5408e5df84550fd302d1a223e9a227c8957fbe926ff8cc83b4fa4bf3a93826724bc9ce4b81343ee1130bf9b6b04871a394dda363bfe493190f0e0bb8cd63efa6558b5636dfceb98013abdaf77d0bcbb139b5270d16e4c75c1890c3e31a1b665c59117d560782fa4dede708168ad08acc4ac4a72e379f8111b06af6e70d4029eeed637cdcc4804bfb20776942675c85b6ac7f2c9386075940b5aaa03b0df227332288a78ec7e9bb086fae1657a87a456ce78ee1a197222eb52b67c6ae33defb7d1cfcb39fba",
+          "padding" : "303530150609608648016503040204250205000004deadbeef041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "79b10605bb396e0fb0ff055e705957f77a8c178b49e6998665d7a07d25eac2e6450477ec5ad54ec5aac9d2802d14a0fe290b0f577721c595c14770fa9680e623d8e724ee97ee0e486d8219e5e4a5ad6d9d12e35af7ac149685fd30a598a561220d497612193c5262d7df3f1d0b76acb3896d22c29d50f5c51fb9ee279d8deb770124ea9e60635ebeaa2c187831b75d6d73d26c3bb01bb958b6a5b1a8fbb5291e1674ae985d4b5f0e1258a803160ef06469e6ff92d3c67de254680ba245c8c4ef3305e55a498076aa9833fabab887258c757778f7dc85258f75efc588392b74f2aee52f04e975d5815eb6350cbdfe18824231a6a5202d67f2423c4769631dc6cb",
+          "padding" : "3032300d060960864801650304020405002421498177041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "23ff1fbcd4bf817c966cbc4fc9f4c62c948664441fc4259b6693519a95e266a7fb3fc51754905126d74c8c7de562d3526932b85fb81e2bdafea221152b995a904a1f980d6e88f276444ca4dffa1e35ba6942478f31732cc4dc2802eeece0beffa4a637b59b96b6ec0c9bd236d438605a177dd4d3bb2aa195d283e379e365645a172ac6712effd84ddd5b8c6736012b417101f6a5f7f2d5daa9fc58ffca9bc9565ad65821e8154b85e28cc8064f11c646d795efe9ba986420b28d8aea0afe5a11e038b03af78ab14b95e050cbb228cb505b708e56ef73b6a715b37d42af08a10dfd573c4fea47a1ed582901de7c0d71e1d016714f03f59106a9d10b15ede1892b",
+          "padding" : "3031300d0609608648016503040204050024202500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "42c18c5f195b1993fec4857593728cf00793bb0961f0a924b20f5cd94978acec7c4cb6d4c56dbb07028a8454d1f3b586ba17c2c9f4c6f993d12d315e49f921dc1e81344741273193b89cea722ead9716362069b5fda2dd45f00f646a25d17ead262c9c856cdf8be4b7fa54053ea5647868cc853e0843fd4577086b55502cdcaf7388ea92fe1250f2333cb744f7108251745cfb272e157f346cb2d1463a6c119ae0d6477232b321075bbcc69d5e76c8485d621bc17cea315c53e49036708c7b33d7f65dd851ddd96182b873e9efb2979678e78116d4d85063e3b314649996bc3908d409158221b563a119f4c857fc97d280e7500f0f4f6ce9761d2260189572ed",
+          "padding" : "3035300d06096086480165030402040500241e041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "8022366a2ecc0f3bedcdfed040048a7b951708d3bd22049be9e7ffeb46da3e2ad1277207b2f84b60bb24d00defbd2b895f3242fe1870a1291ef048a6c164486445729302378b411637073e386b0004321852e448f07620554dce1f75f1965773e20c01d0fa0ce9f51cfb938fb8d356ce3e281675d5e2c5aab46b3b7219d9660fffadf3ebc1f4618d46f54cb03e428e74cae7ff915213194abb0dc016f83b9740a438f6952c6f3e6bf3fc7f124196c34ef4e36cb54baed6a6707078dbf5db2c2941a235cfaf86df2862946e36f4f513160e50dcad2e31106f48619a41ba3a94d2012a87bf21a81dc23002a2c14f216e0f16e57b3cf26419c3cd2d61503936971e",
+          "padding" : "3035aa00bb00cd00302d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3c967b1b7453b98ef67694d96e8fc81c91475a6090395d32150f0df1f9492bcaad385cbeee2143f049aa7a7d59c0876859cb9c5197dab9a0ea886cdc58470e252a4c555fd48546db5c8bc425430ae08923b6cadbc48cca2a68167aad493a7070c27c9fece033567a1bc4969c4e6424660c88e1ecd657409d61f881411d29c1de427be1528af02db4defc6be5df7db0c85f8c890d50223ceacbf715b938d9ff2ee8dcbc57f65583bea6e21684cc5bb629408a80a68cbf901d6d05f1814353a458f6ffcac1c49b7f3cef66f52601f65ad4289707d44278694267fc5c43f4f9df765af887f4ce1753ec189553c77ead37d4dbf963f7b73f360db65b417299384dff",
+          "padding" : "3033aa02aabb302d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "238cbda5396565558992dd9f4e51db93629242f2e8dfb7fec1b1bac8bdafe212b21125b09e782beddcc0122ddfd8463b4d330f2d69875dc560723e58b64f154bfbbad8f8ad3053f0e08108610298396cae35e96e9134d64c4b016a45abaaa10e8d24759727e0f85840f49a99d1ffe9d92561c6d152d1d033fa237f9d23b44ca3eb9c2c353595c4b3bb540a3c7030d64029d97f146a4d5c107cbf1a6a111b8bfeb148882753e3ccddc897cb3231b14650261c9daffe94f4594c43d45533692f0c4445646bc1ab30af8a6c548e2ad3d1fa64c50bfb96542a4c1b04f8a507fe352a3ea1152a3e47f52b520d4064b878d8281a7b3a5528f8bb7353d9c4972323db91",
+          "padding" : "30353015aa00bb00cd00300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3f40a7d901d1f36a2052be75191d05e0141e1411ed61ac4556f411ab83be2c0fbd4c537a537944130c0b62993c1a1ac9b1f93684d7d39112652b0d5594ad9abcadd28ecb85e7683959beb069bd22a4252d2cc1ef3ba181567615255873bce46b0b27ab06d881b1917453c8d944c8ca76b3bd2ebac261b9b9585ea7cdd6cd189c4db872f5cfa41c2a48b1f06f9a5ac70edad5edc199766f7113e60b4da1df4486971ee371fe69ba655578eda765cd89436ee74f46a63a65fe2f373aad63e28e1a5c58db169f598a1dc9f638585da41eee8e971a8429becbb4d0bb03788ec6cf1af7102af35ee1cd7b91e3e68763e34e56532e13d133e8cf3f4b647ad697cd4ca3",
+          "padding" : "30333013aa02aabb300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "2974ef65a46c44f98e9e42db4a90e9896704ae8ed8083e2c8cb3b815b53ecebf381ce8ab71dae4f6a17ed3cd2190655e0f7944d70f61dc602744d0762998661f6e3414caaf5be9e219ce861b9e6cfffdf0453eb586c2ed7245ebca69f145beb5d98b9b41336f25193733e0e36c3982a182e63c3c0bb6beb8b10246f494b01e23ef8b5c2d2307fd5186e9177c8ceeb34b366393ed6b3556ba474d3b07ba137cd3f5c4bb3b614289fc94a4dbe7838d00213d828f505feb1f8163b949002b08da26d4bb0b2ec44a40cb059938bca94029804942bbdd08b975ba8461f4f929179fce2a6e2c15cfd4ff1cfd55a9d03d7bbccd4942bd2141ce3b899c48b8c0f7d3b38d",
+          "padding" : "303530152611aa00bb00cd0006096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "53d232f8030be51ed89087fd1adc816d1ee52ee9bf91a7cc43ae1ca4ec613ab3ba4dfe02c4e492167a0de06a2d546022aa288ca4a4ec6db4455d93343d80c57742f598493657a57c62ebe14fff7f7e3218f8296c2b9952bc58652ae81aee9e26450fa8c9f065081f00e3afc50d17b67f85dca8eda25fe3301f9696d2ca7f0fc4f418a479a2202d83a44bb5f7253d941ef9fd2fc1e6c4c42953d7315fe7916fad820e61bc3f1236e72e9b3ce5167027c791fb9179aabcbb08c307b70d69339acecb55840d0b24a8f596dbcf35e474b71c66188adc2e871436feb12b671261235842accadae54d6893dffa5c02a337fbc58ea4d0862f94f4d18bb0df3073a6ea9c",
+          "padding" : "30333013260faa02aabb06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "2688c25cd6d46dec0c961aaa9f80b38320130c0570f7d028a6cfe1dc0646152cdccb77e0171bc13b14a38e152922b780b73e63ada04cb0831904bf952ad15d82922e11cae73624b8be30a8636162288f4fbfc7ad0bff12628a9355ae7e3b329de67c7ea978ee12e2e8b9b98c8ed5967bcdc1b61a979ca746b6a4b2f61b964f8a8253a443c16a960e94e99f6ea07c9388820f95aa3d4f5e7ede3bc7beb385935c96a54e11e94a1928a6e0dfe68af8475b6903cc9191d2ea3fc43eef8dd0a74af3e8f0761d981ebf905c3361eeaee129263e3d587a46adf60747b6ee0da148a4183ae82f569b1098637a55565a17dc7d93d30b232a60fd3fa7534ef1c995395092",
+          "padding" : "3035301506096086480165030402042508aa00bb00cd000500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "7c4a0234962f20fc3c3402d73a5f01293b6d4066fabf90f2d3221c11d22a415a4c469558833c9573bca8689eb6088ba3ea9e499d6d4deb5106fc9b6e0e0da5d8a39c00cbf455dd81a24cc15ce0cf217385bdbc7603a02967dc1388eeecf15a22431ef7da1cd5d208df946f90a0f1d609e2372b148079bfc3b7c9fbc94819d7847fa73a7aef0c502b3ee0a5d0103aa673add25af6f4ec0dfbca97e720cec8a5af70af732093cc726d72434f7f2ae685c02c4c607fa2f025c7614e164099a27f8aa214c6cd58c524d6402299352f2a83ccc63ff4a2190dc5ecdf407012f2c5c018c4be31382f06ee3aea6a4685cb395680cfebd6576dd07428cff98f6a5389a2ec",
+          "padding" : "3033301306096086480165030402042506aa02aabb0500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "88a2ac7e968f22bc28eef7ec6a825559216e71a51e2b0ce0e66935b33ee0bf3a0f72af9d35b30d6afc9117b8ebb36a1deab61d5e3a1977d32f246918d2d43717b1489059114d3bdfceea25477dec7785b4ebdd230c83e1a7db863b09836be01d005f4cb6e4629bec41d517155410634502d06e5f992ef377cbfc5800f71786a549fae04df96ecd12d0b94857d10f3f631ac2d32a2d18400d12b0039959e725bbaac36245599f71a6f38fb2545d69ff1712e712e3be7ef65df9cac6252c2ab2963d733b503e9f5133ea539ae09c5efb8a1371bf96d617c9ad488be05991ba6e021ba20b900553608c08c67a70e88ba0e2219fd8ca977e8b756dfd5c370a6024a7",
+          "padding" : "3035300d060960864801650304020405002424aa00bb00cd00041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "532ce064cb7186e8b373861f34435d417f4073d1a3ae6850e0ac3909faa275b388ddc7ea7682dd2197ae74dececaa1e21bded0510dfe5a73f8bf2e050aa69b8e592487f39624820d7bfacadd92320bf5f8bcf3b170efbd5e78f36a81cf75262de0ecc6f4ba033abe155e563e83cb82f39c4677df3c8c47af2b1db91e36735a5a1483a91ef98ba0d20abc93bbbb1b79fb9cf553e278d2c5542150f1668074eb1ba7e59eeff74d8fd5fd35ec168323d4b886dcf3961e3eeb05d7bc730c01bc139f27683ee8c1356ce05265d18508e2689fbb34a5d6fc26a40094f64b4ac1cadcc3ce9c3c08aeb181f73701325fb77d84b0ff9b0008aa8f68dee76a37c696c4f8ba",
+          "padding" : "3033300d060960864801650304020405002422aa02aabb041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "19082cac9c77c7837df434d9df18fbc9da0d3efb02316a2be47099aebf0afaaffb08dadc234653b22f16ee1aaffd67afaea5b8467674e1a359802bcf8fcea32f22b21bb258c4d9c802a8bdbb64b256107bb61c2970a6de9612f781cb6ac8852d6298b3f816904cf444203bd6165ed113ed04b5c6568d37ccbc581246e3138669d463f1c1f837a3ce6e99af0084f360ffc0e73d94e633ff1bc69abe0884b2a548066d9ed5674639d4fd1c5f98252b800c43676850ca3885fa644c69b6fcacdfd7c44dccbc0b2395d65c838a4f4e297926ffeb2ab7beedd912e2ef3e8bf685d7783aee5493ba871aa8d1199f88e8cb039b4f529110cf8f256ad89c7062414df91f",
+          "padding" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "b7a46c2c323fda6047c0efe5819333617dac68c61b047d40b86881aa4c8dbdbc195e981e644ae50ab734657206a97d9c525ed3591c8dbde6c617cb150cce08afd867599df818db9c43a1c85ca89fbef7948bd7e089baa7d030546ef749ba5bd5a414302b1dcfc88a7a0054630f48600e7926d99f8b87460eb214df16dc077236d1239c70db04880e6d6044788f2deb20a4efaa3d8e43d73e63792b55aae9d61a3ac50f6452368cbdc7481dee9a419608ea401523868c8a9a825f858f7918c9ce0e138554ba55551e295323d13c30a01ec160c856efa17711698e4aa8e7457b2bf89a158ed4a0e11ba5972c996a1a9719628f0b5ceb81d415e89f34b916c64647",
+          "padding" : "30203081041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "743ac2e50adef925fe5d9c1ef79a650b92b156feeb8f2f5b47f3cc46ae90ff97bbae177679e69fc62f8993b45f5c813d4adc853f469a88b487a04920d490b786b1f511fe27c3cac8b6c631101575154bd6faae13a1798bb66a7df0a6344b2ab08bb7edd741c53078bf5cdc2b77806b103b98904db2bd0038d6cd974675b7aad4af88b767c90b709b35dca4865aca0f55e0467f37367f4cf2ef52eb97060bbc80f08d56632276f2049c51f3a6ad95ccd7cc7d2f8f9320a8dc15acd653c29a4eb6e33094cc957bf8b762ab0b6b128ae3c9306b73c59585864149de30ebc0692bd602735a7f0c29a422549346cc06e44c11149b92c31466c3dd4516a725cdee4a75",
+          "padding" : "3080302d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "247c1089d3c148263fa548007f4416273a6dd21eea760cd6d8422dfa54f607ffb90e825182c4ce897e96de0bc869fe1f96cbabcd9321d5f379215b44c71fbcbd67635babde3061c940e09fafb73d7da345cc01af91edf4a311ef250ce4fdd172657e0c3eb046fcac5f49b0ba149ad8a06dc67c85107bdc064a308330fe5259d50f286dcec2f4ecd6518fa7fc43555dfc8a1692e5392c669d8903fdbb257f7c8f435f872bf4064b35e101a25c6ae7bd7d79ba31519310768272a2153b11d55b4f9cf6ce42584a4204c846cc40ecf9e96fdb428b850607f92f7638270bb93a33ebaf7765c48de75eb11948876d113eb5e265e36745b267f4fd5804519487cdf4f6",
+          "padding" : "30313080300d060960864801650304020405000000041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "5f739b137b57ec0378976ed71d00279a53a17069df1c6e05eb087d20450bb88097381c8fb50b12cf2e2924c2a863711eb416af40ddffd244f0657e2181061efee132e008c82ce7e8fbcb73b376f334b25ea8a842285e62ac6d1f73a70a6621452dd8d3333d44f89fb63cecd9b229e7b3e289eec8eda9309153da264c48296dcbc3afee796458701494cb6f8d4639bab7726aa5c5258de29d4a1b19a079b6f02fb1f8e38f13ae9def64473264cfac91158a6d003544e5b273a2e229c72ac566f33e0b2843dba1297d33416b93e69f4bef4e887388a44c37d310c14a36f88b2bb73351492fd4a8497aae14f5b8664b0fa9427faf2f7c1b990e1460d01a2cc80adc",
+          "padding" : "303130112680060960864801650304020400000500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "a6b75fd7cf6188859a2afc987d28a42e81ccd095c15197fe71f42f37b60dc7d8dd5f7c1687e7be87156d24eeba8f468f66eec94e7167718f5535d556052fc6ddf61cfa4ae50cd7420670611e6010e4bfc945740240e63f0f6ad18de889e33ec269c56ce541a9f2359257cc313c46d76d1c4e9247927f0f7d4dc96174305980df30ce5026585db1f02e019f793ad590482303ae52b39f821650f0eb66b9d79543e5d9f81d3f1c8a64395065d978d1945b47c9110b54b58eb671b56a7a2502db9fba6ace43953f14480e00ae67ad1e16b1a3889528e3e438078764514322cd3a1723a08ae34b2186e3d38dd54d7e53f1a7be25b680fe15e9f813a47001013da5b1",
+          "padding" : "303130110609608648016503040204258005000000041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "667db4f818f537d8b36a441eb01eac4893841c91c6b44be684e7eb6858fd938c350a1450d195384e556e04387e8db2d69f0c9658aee5ea58646e964c4b01b96d08284333d18feecadb613f66ed69b6bdce9150d25a20a5abf4e8212a1099787eedf70292909a3e766a3bccd68567331f7ef6ac798834e2f806595060be19b1908f4c41d7c07bb17840da8a7223feec0e001f36704e87b5b703d9005c6338c1e2baa221ece6037af2653023f022b6a253942cee075899030805b7023fcbebdea43203bf7378f12472e109c7425e5806f586fc9521f7db66bec29a9308008c75868e5afed351691a1a7c607cca6bb711282a9166fa2ca743fbb8a42ff2d72bc83b",
+          "padding" : "3031300d060960864801650304020405002480041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "98484856664b3cae4bb563a23f6da8fcef1a168408e5844217af959ddb3f36045655c71f2569abb4b4a104dff68351e7bc9839117a7d4b666a21201e587823b2578d689b249150b82f3ccb2b36d31a4119de66cae8260c86dc553e3cbb8c2f68f8a7ed72a8526174c2f6df4403482d99fc58a52a95988ee3bc61505b14bcdd3e41cff71f29caec8a59d3181625e1e323967120dbb27f566987b66ca0f1b45429e3b363da5e1634ac48d5a7697a06eee3f96f3c1b84f156a1ce7e6898e07647ce62cec7ae30a6370411ccf9425ca28ba68024f8d21ef59e5c44bbbb5a1bbcb86af45b708d4eac46ca5e500b2ca913a5b49b48c7262f8f50576e7147755be488d0",
+          "padding" : "3080312d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "c1803ea21a43fb4b140650b7d2cda104f0d5a80a385e9b7055c509065d9d671c3f9fb2781ff5ebe5b22ba213ef62d54a43e2250ca4b62cd30b692052e2a7484b26aab40a27ec3c714c733093246f3614792c52b487279df6a693a481033022731fbdcb52c6d6a74b3f2b020df806837a84c2c0cce9d7c6e39f24101069241b7fb432d00015631018a94930ac3ec8c609bc5da81689b20c93435c8dd2edfbb86179c310b83b08747948fe35ba3d06b96d8029ce7609d53795f6e931d5d326ab02a837e839f0f20378a5ccf083f01b39464fa165c8221388391664765dddceb5fd4da58d088be7632f00a889a654d82962d68e078d1379eaa055120dd00b7c9dec",
+          "padding" : "30313080310d060960864801650304020405000000041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3894b11225d3ba5f37298149e2f31b7722a69f3d948ff6a1e39cf651f2ceb2bb4557945f90a6353dd9b217c8fe5d07b9383b5a8ab269b488b6d73030dbd4d2699e079a1d29d34088d9e9db18ca3e95895fb89041c2c5efb1df6d4ce270a577d829216a7c085e71546b20c947aa258f8c6dde4f4c92d7d31f39a447dd96858817928d2d73eae1c99618a664ba48aa7b0e757b6cf259eedda2f070ff0ac8604ae9d9fdc347be3f6fc2844f473a5ee849c01d20f8b9d6f346d2bf87f812c901f935fed89f3a0248484a9f21816e10a44f35731bc84f87c4d4d0723fa917b3f87e4f77155af986ca2c3f8a2022fe88db007a07c806c60cfcd75d787799f8b3aae924",
+          "padding" : "303130112680070960864801650304020400000500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "31cb40aa860da5f103541cffdf14388cd82b683183d0bd4f813d6180ab24537b78f048bcc2fb6a27d79a0d641cb78e904d993d119b0bff260f16af03e70a45d3288980593b1ccc39c105790e0759cd0d9350e87c1d12b448fccfa9eb0b84b745480651caea97bead57d1a6a8fc98c97c00b3daed4662dc074665bb724290603c1b668e5aeb401404a6103412088285a436ac96b8860c576b1c5ebb6ea3d0037ea0d0f4e016046a9cf4bb41cc880556d5dcd87c2857da1b62adc97dc424055027d219f4866e673597309989f17f5bebe89e715c14dc8673c07c5f324f4d30b3bc424b908fb7cb3ed4d499b716575a10905c197cfaa5a8f2ad0b7300f2350abb51",
+          "padding" : "303130110609608648016503040204258004000000041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "9236f2a93872e266cecea65731a4c8942b2f8397f1a844ad667d178566c92b823c191595fa94220105d53c64fa1b60dee3ae982ba3eb507b99011d402c227853a24f3470133caafbb9d3d09fb45e7ad3060b95f53655e55f3264838df3ab258ce5cdf22170f0bd763092be876fa2728639c9a71382c4e04cd142d468596c91e86fc1608cb37af190c3e5ae63eb5ffa8f73fff11ef4b33770bb57491ef850492caff49d40f51e36f55b1e23489663a4bcc22a5e3f3cdaa2806c649adc288fe5031f2b047efcd777345c7803fd5b7957f8bbd6c3370d074fd7ec06b8298b4fab6a49d565e07daeba504871c853aa9d6393a1d83c2393bcbf7cf65fa0d2bf50c204",
+          "padding" : "3031300d060960864801650304020405002480051c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "996476326e01ee4b1cc50cf43aeeb6cd5b6ee7d4d9a0ac4fd6177ad1cb7e946f05b1dc4ab363c3160238755f24dfa7b44f5fb5cceb3d7086a8ffcfaeaba0ad6c50a2bf018de4cca5d01d1db2f818c8c5aad4ebfba39c9a2bf72bd734d1a5c9a51a7d5a29cf8a1a7424121704751c23a40f2e7989b24d3e4ba3c55ebc8fc9df13be98ba653cd18f095edcbad10fee9c3d5cb524413c0b30d4eae9b7c3f677d53bd1268f9786e2f03e6f10bef39c9102cefb0d89b51564d109a6506f2d43604b9c57cb2f9f83add3e0bf3eb80a676f5f6171afe9956be3bd3ba1f7c3d10ea1fcee11dd3d67ad6efa62463d6e418219b03854bd38e1193f43b3b0e4a4de46162c97",
+          "padding" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "2cbe8ec045e8cedae1543a7f3b2f0604a2a94ba7a6fa268c16ec1d84a3980e76f71465d0d214caa0dd8f0148fda5df1e4dcda71c0de219447a7d562f60558418b66f4fe12a5b57a2d0c88251f5a4ddc3349b9b1ae40b41b695bf1ff69fe190c60970d65ca51e3de57cddfb9400eeeaa0f46b5df794b18f0b17959275ac800f57d3c3b7bcac259e6bba5dbfaa68204a15835c72a7c3602347c5fa16c402a37b08bb978395ed03aea43a05f16f2d501d786b7a6d4652ff6446fe16272d59f473333c0aad54787e32bd8a160517404f16aa7817eb6329131c2b2242eb5ffa621a467fa5189c574e63ac3eaff10d27cffcddc2f8fd185ea6ae5e3e64388ad1038443",
+          "padding" : "30200500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "54b4355a6ba1d1f036c86c12a495abfb1d005084a55624660ddc919242382249467ab28d6e975a99a6314ba0bd9c0c533999b85d6df9517d95f18dfd47e878aa8d0495ca5a1fe5bee9009468f3b58272511a6d3503c757bfffcdc1a00e0d0ee2ba385e3aab44e91c2830eb232994b304de062da2751ee4d0d3ba9d8fd9a58660800be4e3cac831850816a183d0a7bf5ef07fe15416987d2a9dcc66dea01f620250eeb8adf5ebd4f3e59eb5c9d15701643d8d00b169fbefcd99df2f237f9f2e7a6b464fdb27a808341aaea2167861e442c69f2fc2c8dce3016e7d58e5463fb9b73180839860d7e498e83f2dfc9f593521ee5135f4a24a853b409c942b55be8477",
+          "padding" : "2e2d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "b2c9d522eab8e949726340434fe91a1934de81f97f8085289c508c99a111b84b1dd0aa2210d29a50f19ca77c2ed1a5adb426682ce9afdb18269a8ccf98b52bda2bfb0a62f7497832521aee1a22d22aab83abeb19ee3d9ec924728d237a88cf18748fa26d53af27935438fb4d6f6a4c43e5ec9462ebeef792df7871e64560dd0fedd94b0ab97f7bfe2816ab208e5cd020a1f5ee490de36087e69c89fc9867fd06610381cfb01184c6b835cc1222ab5a5961fa0dd0a9d7b8d6b7735dd92ed6a15b7694376b62e2cdcbe37cef6268f120d018433329a396a6738260c8e2f34da8bbe19580f1ddb0007198aa2d2d95fb43d96f25b3c46c196d5d26672c30ae830924",
+          "padding" : "2f2d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "0f9a528468ebd469bc9db21a0edd8dbc568bf0492e18edd1a4a7f28666b839a9e3d3ca2a38b8ef41422c0b40de173e2566e32285461030f0cddca6c73f5f03f67b14c146d52b4d03a83dca365cd603dc5668b5dc2bdfd704e23ced38c1d20ee6189efc2f4749c36009afca5362cfb00e5699d559b1e82a4455bd3bef96ed38df75a9dd1d5786d224657658f048b80232bd17f8e690108d7036349ca26a8b369d3c9355e643d4b6e88b27ab7fdaad0115824fc333185a3102fc39e20355e9845c9684813dad7e2b0be33802aa4b94bfaed0938ab0ab1a7cbe28df74a359d7f301e65bba1a8dda1d8874911f9e81348e92db4f6f3780361da79369c6dc773cf6c3",
+          "padding" : "312d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "b408a5f0124d71e810205f8c8618eaeff99cf5029d2c9c7be90a956467a8f3f6df2298dc784d228911342cd5a1dc52f62a9f8e838c3a60a1426f33892e98f7249f2945723a374901c8e4b21d1de9585ddb0aa55992b1d88e685a088e81d460daf72b04c23e3b2ba24c9155aadad7c737a1b556352621dd7e7b5197e966d8ea7c0c50586faf4182aa94f9051f3dcddb5f67e8751eb8dffa258a52981119670c85eb3b371a5c66d635aacdd810aed9a28b8e3d7a5eda1a4db8a857ef65a9b6e1190328ec09044ac41a38837243b6a380647cdf469d16ab0c7a2612200764b8241b0e984510dbde762f5b0a1efdb56efce24c45d9b778bc3b0bb4efe993c6e5b0cf",
+          "padding" : "322d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "11102d3fbbbcad9b9592df2e16f9ace9d47621a9a3ed195b3231f44ceffabc2285842d125507f2ed86035a06ca7172051c10592275feaedc25e6917fd1a2c176596d6219ae303286bdc4a337a88354e3d75031aa586279b5fcc08f74c7de335cc9261c9d3ddff38e7922471096daa5185a396e4d4b4c2010f4f06912e21fbd26e86b78905e10a3d2577e4ffb82d664fbd8293b28578813177a4bb169ad1fa1a1cf092ed87e8eab86f493e65ea7921fbc7f154642aa05bd14a0ca245892841f2a84c411dc4533a9a4795ef210fb97473e6223b6272ba8d26425471470df33b76ad84dc029281a1c3ca2e666e8901dcec12e78a2a2a5b04dddaa2cf475f5365a30",
+          "padding" : "ff2d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "1f56d2c5fe55eb054497a5a9d9c58f4c6f814d3bfe1b4fa5020aadabc9d77256f8ff14c2ece6f2434e703fb16adbf48f91bd5e6df505f2d9bde65496a82d6a5d0d7a2b1a1a5725f7cb58d1c2e7bc101a095fe3f59219112bc4c89970197bb7d48d5afd9a08f3b70963a0a766f1d4aa8eca7893c4e7f7f432649faaf740d36dd20210f32f195b2d085c7e294912cc36d35e01dcfce2c12083f5e473cb75f663de533a8b94ff55ef781d06b1d8120894144fc3e4afd3a8de523d902e59137937d53c6c535550b23ae3dd50da50c2cdcb73dd19899333be21c95d6ccefbacadce30c48f31e982bebf55025241c7cb509a02cb4c8572a1f39abcfd9828f57a6c3800",
+          "padding" : "302d2e0d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3f4d732558fcf6434d2f80c7debd057da8e47f87b8fb9fe62b3229b5cfa656d5003c3d6c6b3b5db6dc2d348fbfc6df1bc483e9f5ed8a415e1045f17644842b96439c5127155ac226097dbd29c8769da7e485db333ebbb3ee22464c928f42f0a1ee972cff3fad879c542c066d8717bc9159302c4b6c2f5cb944d9b21d8502e9e3de6f6bd20b3febdcf8348e86db72d1a8ea451a4af54ec4e0a854225eb7006cbf7b02b3ed5bc5ec81e511d6eb0513617c1b5b9ac330f408960c68e3a2c04d6c9b953da2c50715d191a10739008056c2412c4ea2d46d6dfb68bc7df711a4d543bea6903c8f67f88a553154b64559beb8adad42fe6686525a2a4c8c15d1f669d394",
+          "padding" : "302d2f0d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "615c556ace09f24b725489b29274422524f6e372d385fcacfc44bd82d75ad6f27a9f9378007016617634502691226dcd72aecfec6b839de344d1c53d5bbbf54f93f1d510d0ab9cd1c0d5363e265ed0b7fd9b6de200d4422ede2c65cb225855045f28ea14290435f35cd6e2a4fe59516babd10577c3d690c6f6431a56c1aad768f83098b19b3756a732382089516d3424f23cfe142a199db129c9ce2e61dce822bda75c0dce6f59f7a8e71d43bb0319c373f860f69c5aaa9243e9a52f221430e5315440a6f6a7539c058281309d9e435a31b9fd34f78020f1874c66c7de0f670a31c98bab40415d1a4a4e5ad6249e12f9bad78afd17054576c740673100e71006",
+          "padding" : "302d310d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "73dc8c7ea062d454b15f18d07539a13d08f29bf7791c3fa626f579f7ec701fdcd89a1facdda4b15d808847c419c184b39b6a4fa54a30f9f5d52878a47453fcc7d0cb504d1cc297b69f62a21db59aded5baaa6c100fd31eb32e02450433dd2c3c6dd7b343653c6d171949f52fc963416700dd83d31f259c5fedf9b1cc1385dfcdbdba2538c20a8aab641a7d5bc96223e038c6f84fc8302afd2c9ffd298d313dad50a5a943256549526e35fe61488acba25568826209048856e65acf3c9e2eabf239f20bb68f2538e0c81059603e1b8c94913365adfbd959d9353d8f653aebd086d123d1bf3687c3f644fe1247ae441b235243c4ba87dbc33f337b1e63b119656c",
+          "padding" : "302d320d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3d9ed722a84f0fa9dea4187d8f0d51b70dcc754b7f7f951782643da2b7b06769429cb6d9fd0950eba58b0dace0e73dcbaa2c1b8981fc5971bad5f0c858761877b0c0967be0fad4eacf850b296447ee30519aa598159a179299e603cdba8f7de6cef9f9953144f34ef5f8663cd4bae2828bbe085b35e8a099cebbff34d6ca858eb35aad31e1f38bd2724c817ff32bcdb7658955537ce4ba83de10de7f6cf9d4d26a0e06b522e8e47c3a7ef1b7807792f43461975e0304e65c40afe40de7308989024d9958aa7b04657e9dbffe35d9ac69ab46a7e1796bda54af5cc6295535865b6d53235c8779ccec52108cfeeb3752b1a57eb3e81761731339a0af080d128b2d",
+          "padding" : "302dff0d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "b32a87df98eb19ba1326fa42c78998fea218b9c50bd5858f474a14b324b34cf42c4116a8eb121e79379defd04c8faa876482d9492a8beb951bac9ca56c4610aceccbd803896437d5b104ee06dc41848ce5f6e79dc0ac71bda6ff2ab411b26cc070a17ef3760e6a415929b23323c488e710761e8cef9031ffea40e518c491c32185730a2af20778681c74f030ba9e3947bd8fd2331c7b4e73387945739645bfd767d7a912fba46bed4355ca211f6eb438c4cd3202021deee48cb88f83eee84a5d4763e18f3ff9607b8fcf11e42186505c9cd731e7f6a7a0dd30df61b8ecbfca1fe0a6d3a1908e6f8aab5bbdc3b02be78fc2636cb5d39614c44060fef9d8c5cc70",
+          "padding" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "b720bfc084fdd3352e066e0597edf19f1faa271cecf4b3d21bd32964862465b66e0291d6f5f87342b9fba6a77cb9262fefffad07889f3ef2d49dceb6779ba8025b05b5aaedbc46a011c819411ac4c4c596f88cd421febafd9549f404b3ed8458303dfe88fe8724a9419965945df23d810c3a2db45f27643eac386570a63d6dd6660802208e9bcb900168802b3d1014ec39416608ecd2e304aed4f1d93ddc6fa1a51d3014ef604c8ee9740ef2bbe546f1b5c307f529f1ac4fb8206bd283e9409af446a4b34937447ff259ac3b9a7702a56c8e8a571fadcfe1b6d55fb7d1e572e6ab641af87565a05eb55fcade48780fb99c6da263ab076149a5d2d4c40a15644a",
+          "padding" : "30203000041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "af7d984e678893167aab922ba9f1dea3e67a98bf1ee442c56388ce6455a8cbd69f0cf0a30e21ec67d4bee411577b0700887ca5ce5f2a2b63a026956a6e56676d385b720ad708c9d87fd72a12d2921628f4ea931f3b594ebeb6c26030d7945ff347e7f1b30a0fa9177fe7382dc6247d271015f61f1fb2d15b7477abd4642f64eb5f5bd7adf92ebaa5dabc6714e873a8f93ad13b6ddc61fd92e7167b801410e338ac7ec85838e2f8571be2562d1b56377bf13a8852e15df0ef5f5626d1891988a0210ff2f5436ee9ff526f0dc7cce525d9ca8dbf35e37e17248567b792b1d8d233a2ce4efe589132e58f87e7db6cf86a7614559d90bbb9b10cc4e22b9905ac191f",
+          "padding" : "3031300130302c0d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "2deaf754332fee96a5c4954df9cf4df736deded05cb333d4654563c73d3de5629ad8e4ef290ee992874f2757a1e0520cb233201552c4eaa3b81968c3a315235d70e013cf3c2dfa1fad31336d4adb1b4bfb027fe5bfeb6d4a40274920180caf5d4676ca1bf16e0fe3ec48d72f61b7b37f3c5ee04c2dc095ba650e98eeffa7aa78023351087d4ed55d286ef8506ca09a1ac472d44a7b540dc63818298379a0c86a44751ad3f51e511627cadd54cc9a1a5ac8ff4deb552378d94ec22878239109f769eee07cfc70c96f2a601f722e5634356bcb24fdff5db7a1318213491bf2cc37dbaf36afd1436f976612dacac6e15b72f980099b53b89f220474041a16b9a0fe",
+          "padding" : "30313011300106300c096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "574444942db4e74b6ffdef52694dce12f41a4473c8fd68aaf974816102fcbb0ce4153a05b9e11eed421230d313586602beef2d1ec6c74f91fd70eaeedde7ef827d1409649a3a5dfacff49c5bd6aba7236a90cd4371d3f029029a4691b1f2b4ec037c1704c9470f99220ab35bb5b9f9209b05cb90e7e09047c3e2df1c5e020f2ed228f135f49ba8425f4ab40215e05927ef3be0a502642fcd9f2483bcc8a474b46b5211960d0af0cfb591af6d91b906bb13ac5e8e7baf582e086afa9c1df050321ecf473b56f490a25d158c5a7fc9dc515d5c9dec911cb83a4c05b5501e0cdfa444e3cf5f9b632b1492a1a1766f23132829834fafa8c81abcf9e4fe760be7dbc9",
+          "padding" : "302c300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d12",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "41775fde269f4a630110839a8af5dedd25bca44c7268ae8fc0d5aff838cbc1bae9bfa0948f03c79309b9c0e0c92fc59f4260f57f8483c0a1a014a58542b04e37b235337325c6f5021a4e04b1759a72f6f43434d1f4392c5316d8e69274a1ffcbf18440b4c92b9efc7fa238deae751a6b58c0c4efd5305c3bb63c20f0d782e4ee75e33ef3c7f7df1048eb3b0412bf71915bd372e7792692ecf5c3ee47d71c728cfbbb58f46fadfab99259290f03f9c6b18169e5602afeafb50751f2367af1053b41ac8b1e68107ad466a384c701b5cef71abcf2814bbb5e9088e14205fccd13e1240244c182885df9d32d804af5c34657dfc76f0a27a04d1fda612afd605343da",
+          "padding" : "302c0d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "0d5a499955e174e55cc4129d72cadd7bb43e416f232502d89113e15b557be64484b7a9414fa854205ffd9c33792f02b13070c5411ed2e808fd0c1d70f4a971f0b9aa34e983cfadcb3f027b76a6c35dfb537d87572cb67e7dd7e246219c62313fab5fca5f021f91b64b3ed75e1c371f101c09cc95afae07c2d257b2bd8b946caf839e88078c98fc21583ba5b205e2fa538d0c7de3f6ab17b352938941f6e65fe5455ecf77bdbde6df263d067004d508a2e32b2dd08d4457bea716bff025b5f32c5e8108b045ceda87fe710fb816c81a00ba26cf6f395da75a4ffdce9f47e712b9197898a6aa53fd8dfb3457cf9e1992c7371d370b6cc8125cc05e738a5dfa35f6",
+          "padding" : "302c300c060960864801650304020405041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "37066964e4c35b0540c14716c52798189318c20c73d61078281d3a0213a003e60f1b9867f1b9a0b9725d866677f80deefcaa38a3bd795a0bfd00d5853ac1714147fb2d284e1e8b3213acb96f587b16b9fbee57d4aa333929ea3d95d706c0e7dd8a29acefbf70ca2b77f0340a51c5a44b8ab4a8ad9e125ebb3747ec975d0cbc4d093516255195323106d94703347fdab58d3fb8ec879b783ae01be7c778b2773ab4fb71b4922a13d5638407465bf2bb388fa17c5fb8218077904ca3f532c3a692ada8ef261a8fa5fc91119d5b69b8bd737505eb9256399d6eb415d3b9e7b07f46f67d976e38a6ec9f9de5cdcd240640437d20f5ec76dd4c8817e98b6735a2e253",
+          "padding" : "302c300c096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "65f9966b68519da57e9aa0e6e024704df5307a40502ffca09d99826d9317c34781f81afe459f767ce11dde953affecaee68f444ccc7d8751b25129e54a33d6703f69789e76133f818965d6c97257e0e64b8edf88a8275d58637ed00dc6e606a95a0e7b0062f70d1d52bd8e08b790eda4258a16a418cdeee2064f7273dadef468f19a06c3cc3d25dcb47acadafcc3aa4b61705b44eda5b7deed0bc7e42bb0746bbbad0ace8537682b79cc2e8c6f4ec73b1b1ffbe6b5d07e0a4eaddb3759bc4c3d33756614f54159f3751f38828828a1d06adaf4d9fc270c941ab37d3380c16aac4da352cb152b4dcce0a63eee0a84a0eb07f243597c6759aaf91aa623b5b5c266",
+          "padding" : "3080300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "24882eaa767b6fc594388da59d578bd83ea15e7c2a239c78ae07098f2ad45737b155a7933b98e02de018da380229b2f4649143a82bf86eb4c8b00dcf6418e00ccd9059fcd5665dbf4c065a90efc9305862913871a7ceac586e25634993f4ddb2af2e95992f95166e0ee610bf0b22397ae5db506db3113838afc59efdf7a30a5f5b42ae339f379b8862ae27067718fef95982408de7cf64ca35c5ff195e39a390e62d4465b4977a7c2f7545026f647007e9483dbc3e5f030ce7883e8e4379defedd5f53616a2cb2daf932a053c087cc559fbc477073db8e9aeaf3708c7605dccbd3b2df68f3c957419ae8354ee01f3671fc27aa17a80795d0b65604af0f477b7a",
+          "padding" : "302f3080060960864801650304020405000000041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "97fd91d2e281945e46bef3852562724a0fba617ad2282063c182d6979c3dc72989432ab0c3344af047dd81d41fb2abf6a00bc1a63baf1af320bbbf47a00deb2538a3e353cdf0943a6f362da1458729cc24ca55dc20497a9e30c7895c24c7a36c1e8b42786ce17458134a10abb81de6e14e6a349315142238a22b56ec2165b90d73bbccc249b0e1a1db9c05fa190be7228a5ff8ea105a1e1a40dfb27be77188ad83f77d399cd20976ee20e424a324046394c9c837c6912f3d23512376fdf846134398f0b9d6a1a65894fe9e9522248e399d6e787a889ac5431fe3a2ff5c6855f121b37815be35f65a9c724008ce744d3431b761f87cf84e3320e201b6364885ff",
+          "padding" : "3080300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "5b20dff0b9a6110c8a3b833c72b38d20cc86fab63d9f12a1a46641fa05f45df7cd728e221cc7ef4c59a76bf643918a680afe78253eb840cf563639bde8778fa287717e72f45d3e39d21d07664d8d33c75267d24b6bbfb40ec847aa9f9f45468f014e3d48de25dd735e3c9998dbb0b482b219dac5da971f424d69b98d86f22a35dc65df85f2dcd08c41dbdf65ad53c8210b56c65cd005ba038d33edecebc952ab07582c5e6a4769cf845f254774a7eeeea59aca728029c0f3d07aa44b30a6ddcb17c203f85c732fc24c8d3797d3827d48c40803314b8a9878973335fd827f040d2f716d9d30ca66df6e7b19043dc53a80f05c12e692aa6b3c4d79022788b7e5c5",
+          "padding" : "302e30800609608648016503040204050000041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "36415113cacc680ea4cae62df22e52e420be4f48219f45a90a66e3f1f023a7f004d828bd0ae923ca927a45cc8e840e635b06019a146ffe81e1bd777f79a5bd23a0953d68f520315f905026c530ddeea6a8b7b62f559e208189ad47e5ad797df5fc019de29667b9ba8ad53661b5ed93d73ab3fa3c13eee7c5e75ea40c9d87c0a45ae065776d781a3d94ef9f5878bda1abe940d23563b84be00efdb5f68671668f44e10d560b412e17280f5be9448d8ff057cc077153625fe5243d5cbd4ee358a56f52bb07f47cc6f4d768543446b4cab1ed1f489263477917178f84670a8f1cfbcea97b94ed951d29209dd70ae905c8d795595c723753c9f6028007c3744fb959",
+          "padding" : "3080300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c05000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "883205afeaa96f27231b485c53ead58a9949a375a677a28c13c5e4163d9a9bf40589f198dbac53a58c6f70ed087bcb75780d5160d567d6b77d73747ff7687f6ce708b04197be7fa7c4cd87dbf16d2acb2693fbe75b3b5633cdc0079762129ac6eb7cdf292838648fa2fcbdc4363548f4059f6e96792b98a9a8a0411622dd185c0f65a423fc06d70c931cb288d2f3273d120c8000adebf277b95cbb42d125432ff84be24ff8fbd8992fee51757e9578cfe83ff0b37d4c4fc2856606a820d22d367a1fe47cb3e16954656778df08d1ab8f868639fea43596b45671d06510f5c53ed79ea6c918d015ecedede1f898d626f95fc6bfc5b6d6c81e9ef01faa5b56bffb",
+          "padding" : "303130800609608648016503040204050005000000041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "3fc36fc628b18cf13fa4c6693ee98105590b96da05c58de44cb14d6ee4f038c76a0b0557c6bb9c4a289e3442154caeb427e9d77abdd2bd3dea4f43db5d9e40d2facdbb61b2348291040b4ca18a4106d3c061a7b3f514602901e3d8680c81ebb52b4d4ada68d43a3a0d4f9d79f34449380254e265ebe0524ec60fc9f760fc4b90bdce7f2a7e74a8ee97ea8f0b5799f17300ae6d4a30cebbbd6edd2a41d8862288b37cac2a7b9e4f5fa3f78ebd761715c36e1e226156c05eb6dd6f9d67284523620bb938d912ca388ba3d9cd24fa354cba42be0c932b00f52e345c8c8e491cce4da3e1e07b9e9f14d84353ce93b27ddea1565d8381aadc051579277624cb3fe7f2",
+          "padding" : "3080300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "5b2731749c715c394b718a51cfbbca731e651ddaed84471177169fa7afef0fad68b0cf35416a94d912ce1e555b31218a28dcaa1c22f64577c7999bc15ae99b0bb722a84ade8096c49db9965c2a11dd2294809fc7a3437431708e88b7776a2d17df8dcdca1239d11ebec354b80a4f787d1a15aaeb504d9cfb73dcda2b70233a73acd14579c26d8b166e0dc3f4bdd1d6bdebe81f40cc998fb035c1081d80eaa3dec7ccbe3e5b703cf85a038a9327bfbd3c1f260af148b7980c8d5e7a026d3e5bb36789ef554eb245d05a40aad1d0cbaa9e43ba46c1122a1160cc79d44018982b69e09aa34271b42babe3546d1deea236527b49e9895efac1be13117a8719419bda",
+          "padding" : "3033308006096086480165030402040500060811220000041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 145,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "4aecbf74bb2ebd634e398370983c147d012c4bcc697caa4a5485750135263c004acd2218a1610cb17a328d560a6c692bd0ade10a6aba6f348dde36e8a96efb3cbe9d0fd58cebfac5ace26698ab21b6b45fdc1ffb28347f29069907819987d4333af24736f05bf2953f42c8e79bcd4695584807fdba2e184065ccc51b345d064b26bacde9ee2482ca2cc81c47cb3c30a138c8be31af2645bee217310d81516bc64036a109f19307aae3487dd145d1175efea73d03c1d32bed7adc6c740a64e4f4c78e95f3511cdcb9007d212798fd09dbc90e0728381ae885076e4c3c545ebc5b67a939e55588e9ef5e3640daa28517ded7ae0c068e0fef9940b21d871728b31a",
+          "padding" : "3080300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c0000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 146,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "b61d251dfe5c1851ef8739293b0d9af8ab2a482565cdc3b43bba70db7a03a7d8878c372d93943f42674a7678b41ffc9089d9a93c7a8009b57b2fe15fe1d944eec7c307e2f79ca2b3cfe07878cad8b4d1f38baf181583e30d7b1c7189488b7bc82e0e63c2efab91fc8fc40733306ce6b12e0db3c8245324e4250a9a015c221561178e54b615396892415fb0a9783538cd4bdbb37ee19f10f527165cd5452cb1bd2cf81b672451da9540e36d9d32416bac5b9cd8b1af67ac4c12dc0f39cd3b99648a4fe7d9e23b75df6838408225bdcbaccd80964c13c91ba8c25f5a0f822c5d03ae9e0bffd3324028d4688b2625542ef8ff54cbef0cdd1f52f3ffa88326d1659f",
+          "padding" : "30333080060960864801650304020405000000fe02beef041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 147,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "326febb57eb76b58ea5a0c873383cd14947f0c39be3338690c6e3d1fed1439278b8ce352b9dae697727037affff53350fb57d4e83347e7aca5a86b0bf4dd2eef88e0f08e0b6800021e310a3abb6d85cb504c7114e5987cd3ce39905b1258a3fb0c7ca1c4fa6f540406a1890866a635dd848919ec55eebfe1917afe3ad47d2ae27177c2a1cff84a7519f17245a462c28ca42fe4980070d6f72b52be443c125db095344b89269c8166468b08ddd52896c0b590ce6f3b4184cbe53496cfe38532b18df4c5ff021339e9425e0608e832b67dba265449de2d052adc077f25831baef3f7cb8ce618aa8eb89fe081a2f57d9d0f3d8a9c2010ae32484955bbc28c452970",
+          "padding" : "3080300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c0002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 148,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "ae2e46a32caa85e7e75931aeb5f69ef37a0e6e684a59ec058a48a23bdcb1a0c2186570469d7c6369dc8874e14a25f9b68d6e779ff1a1674499fc8602bac5848bd9f0cccbc7e5b2cd138ba6a02770c87ac82c3fcf60e2b124e48d77c04dda8a05053632e25f2dd95a8f7c79f152a746346462275a8c779d515dba6f8563acf7ae08b10efb95ed85be29281291857944fd74bbf85f782701d7e73abe9424756b1281c9ae3cedc38de4906061b983752d481b3fabbe513cc01539c33fec9f3d5e79b20e050dedc5f975c696607ba64d8e623b717d8fffd41b9d28af51aafb2efe268840d886fad2419df9f32b4d493378dd87bbc1199f86438cf74e0a0f7b9885b4",
+          "padding" : "30313080060960864801650304020405000002beef041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 149,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "4dd4bf9a57fc71a32ecb68063a6fcef1aa8ca1209124d87ab0ff1a8eac2fb89270de10f484fc6b385ddcd5c84049df9c85fba998b33d777a6171f87c5e60948fec10ec6eddabefebd69bca0d0dcdfaa2a3ea65e9ccf55f3c5a3c2f3c794522681a9a3283aa1d03c5b23841984b68e9435dc79e1f32e9dc392a0a4657be8832c9de063eefdfb24fffb2ad11ec16c17607f4fe9e526cccd22d5aa72b11bd2d78b7e3606c95e6a5c2edf8648ca7f27fb6a370be52f3487a7e5db564907f7bead76b0abf8f036f3ebb8a1163b277f66f50f253fc0a98a0eb6d16e76ffda6ac67f637c6d56e0fb64ca53fc036e398a6b6b265ae59546e6b987949ad6cb3430f7502dc",
+          "padding" : "302f3000300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 150,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "96225b7241ededebd722a0c68a46ca99eb081bd0f55eef0cc4595a0737a59009b7ac19288692be4d594fe166ee35dbc7c34b5c4f8cbbb3ce3b3a10b553b7671932d401bc2b7158266eac9e5e0f0e7ca6bc2d0ec0d6bae86104de02e11dbbbc652acb8f88f3122b3a1054d7dd37c94cee5ea82db3b145ae41c5bb065fb1b8eb6d3a706438a03905c8088bc8b8e5ef3cca9001c833e4883ad7e35fdbe654f4c23580d22d533d7a3938b16f0e3d457c629118b3294e4686ed4c6b703bdec946dabe75a0411a8cfe4877f0d7b71c6662d855bf8bd19c61b57ff4e61d756aec4f1a54dba26c0717f83b87056c7b982766b8c1cb407022d6b6c02762aa2ce02cd3bc9f",
+          "padding" : "302f300f300006096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 151,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "26a73b76551879a9188213c39fd69f8887e00f5280aebb87f2e6ac6049d938b41ae616971419a7abb81297a250df76d101c111ae581b1104c2c670c865d32081788d9934cab185ef3f82a2b63e4189cd445750c6f0782dbfd7e9cdb37d781be06cc72a14673e1f244fa3095028404090d2954e13e692b0e624d2c5cb663ce468076c08829a3e51e8b0a12632e71193f5c67780db620a2fab9a36f77916b8639bc82a24ad8cee73d15c17fca3443f37fe6f4a84fcf8bb91f0dd9d371b0f390a4dcad4538cb54919da6b1b584b233599f174827fc541811ece4c5860b81d7c75c859cc836cf28bdd66097537f7e847efdc1dcf03bd4cb2284a02aa172beb52a95a",
+          "padding" : "302f300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 152,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "aaccb6d6e7916330ffe535afe9afe3fa39b37a20008f62168cf34efb4329a31fac1a47f0708846224cd3ab7df38daa71a8441c0b1d133f620258cf00c91858353cb9ad6e6892e241968d9e1005c87ce4811c73059906711a38618ea1a0806893788c6c486fbe46f4e2011fd7c61691d68a18b01f969eefd78498076a458b7679cdd76069d3b17777cecfaf89dcddb3bc7e78631d5be60d90b12138bef2011bce1f6c033750fdbc1366ba1e1283b9513f38445978793889a8621960cf4389235d46831294a5b6e82c6805f373b4b9eb4f0edeb777d2bae6d89de6e7b820b69554e941899b48195ac8bcb37af1aa4e39f0e1ea5b6e62201e0ffc53fc2e1829fcf5",
+          "padding" : "302f300f060960864801650304020405003000041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 153,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "9c95c7d4b8e9bd1719460e08d3ad1842fe43e8397c1605e2e3df9badeb228eba514cd2c5f6a11cba924ec287ab164d41a525de11c8f459829697517d271444b5d1a9735fe0a9cd46c82123caf063a7a2c7eba7ea2ae0e93df04c7f4cab38904ce394d1f12968796c6a744535e2efc6529ab18e747992db7a35c27e556ff0d897f8b1950bd50f333f9f8add8ef1fad5ebdf38cb9aff563b0fe7fbdfed5fc5d63c68060b380f5c792ade7d6c5295c1f25fc75f7207bc3624595669ffb20282d7fcbc3b24b8755740e41bcaf86b974a7aae3cf1a7ed1e7312449240dd80ac1715949b7565ba11c2adf30501bfb0d386b5dc91581fa1df31f5b26c175c7c60fc538c",
+          "padding" : "302f302d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 154,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "b5609442da89be47095a0d9f5721b3c57382025d020b8fdafc0cd96df60f9e90d8499ea2a2a5c715f3d30f99af925a006634a84ff0ecfef26d959ba774ac9b26180dd3e2dcaed03ebf2922fcc33fbabda261534e5558a403cf0844fe0e715afe7059adf9888668aa9c34bb535d72322db8cad93a0f8607e258bbed3bd711f8188c380fba8367780b06f60874437e4249c869535c2668012684a27b29aa1cc6fc15b5268903227ce9838a437efe5073224fce926e2c8e6334aa1fa057526b566c06f685338692e72ac7613884eed1526928892a849caa3ab798361ae2bde4348b5d09d13c4f5a479a94e4e4f3bc84be2fe0184fdf4fc55494312a4f891e69738c",
+          "padding" : "302f300f300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 155,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "6068cbb745926f80b192d4f5cb2b009b74d4337200ceea82e26bb21a3285de6733123c4dd4e4f47f34a0bd05c310b4d50ec5f54cb9fd13d0cdeac8a31073c01e1fe119474c97b08164c62396fc7e1284e8fe97fd570bab065de8ecbcfb88210d44fdafaea7af0bd26c0017a96ba9152db828c42f895f688d92db2d7a51d966c5ab7810062a913c447f75d4e5052da973588fa49e990bbd88ec2ffc6b571674193b584f50093b424a173c253e7e711d647a190a5a5a7dfc2c3110f11dd83608b0fb7cfcc638ea97727c9b185e28c9f0bcda32a8ec43abba401c519e050b7819c09fe03204aec7216bfd41e389877a33bfd18fc6a08cfa815fedd5f10f4b87f833",
+          "padding" : "300f300d06096086480165030402040500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 156,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "92e22a0b52c4b83d9a0ea055979fe3e19984aec5762a639a51d07de1c298ec855b349ed5e8b28e0f3c583a5893c4243653652f544659ba251a017934c98696879784ddf04b9c3bccf4a06b0715dd6e53f762e9b6dc8022178600d88bdad727d8b3d7e72d967d4e44b5bf3095db626ae06e784c49f24849041dac411a42e20a8ac96ce77c31d82ea17e105530d522978ac1c86c652e90481af20ae5449f934eb00dea92bd1665e47e914391cd32a01ac499277b18975aca6e6cdc0e8773c524d8375ded14a85eed50b957f152079297472f41889a2acb5c510cf9030250d1d4799ff165ecd4f6974f8d5094d272fdf1445c84cf27199b7cd33179a4ad14b73398",
+          "padding" : "304b300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 157,
+          "comment" : "removing oid",
+          "msg" : "313233343030",
+          "sig" : "6cce3b4cf07ba332c27e6efec7c1efc60eaf3e021165377a15dcfb6bdf76ab88da2ef3cad44a695d8afabb55e81df29281f85924d265fe18a4ce9b083dc76e070d795378ea95e50ae458d825b824e51fe264b6203e1a17981c69035a3a32eb0d24872a7a9264cf5fe068c1b3b24bd95f2404abe2487683f742a9196187ccf9eb606f5e951f73d614fb99151801794d2f69495cf1350a5369aea41da51de919dad4aefcefd98524b580e63510d6d75b46d4073a3a7d762117489b7e228bcd65dc49082171d54c8e921912f3caf724542a0ee6c0e6602d5c9c9ce5e5ec2797dd77ae8d76a27242a4a349c2f2b87f94584d3f9c470f9a485ffe9aeadeccf6fda97e",
+          "padding" : "302230020500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 158,
+          "comment" : "lonely oid tag",
+          "msg" : "313233343030",
+          "sig" : "085a664ebc3ca8149ab63ff2a46777a05e1b7162cfad4a300f5dd847ee73c33c1142cf485ca957b3c1b3361734a740ab9c4f050e1eec64be03a5d11993de4989a38e7fb9f9c899d8a929981aa1b32c0cbd75299285fcc758d95294687f93f1978e843be1cc5caa76a57603bb3a57fedf4d4066c532cf45f16c57ce0e4a628c3ecf33c0fedc77b670a33b9f71afd59cb725b1b1f0ff894c8c6383788e7604e531b6a02b917f83bf5645626dc8bbbdafb9bd70b7412a440cbe8848c336e0cdc3f94fc9b07a8ea34d50f6ac4a182cdd61bf20e32af5f23a4dbc0ec705670172be1a9a8352facb1a7ff4cc5e021173bf7f5964749f90a234a5589bea721811af8c8f",
+          "padding" : "30233003060500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 159,
+          "comment" : "appending 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "7d14a4c74fb25ea6fb4db19b08d8cfc03b9a20bb2cf9f8bbf7441a7c492854b5190688548438913ff506697f46cbc1ae6abee8dbc94a0a6b8e4d905cb98ac717da0fe81a8a8b12781f26e6e2509a6f4fbc283a2c2b938c267e601f4304726d43960ba571c5b8ae4ac1f8d3968ac61620632b72691d0bafada5fcecbdb5aba56bbe524a56187c4dd9655520bc145b8922a0edf4cb10a0285c65ac96bf22da5bf95e4be37860456417f5cbadfecb4730cbe9844b617b1ce1865db20f622b4550632a0d470703c74922967a84e311634f4936c0f6981de8be71ed7eee90bb6008be2fb5f88b5dc10d9f5721f81b1f7515099a8dedec08d61e84a145bbdfc6e5d418",
+          "padding" : "302f300f060b60864801650304020400000500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 160,
+          "comment" : "prepending 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "8b77e3df0c4988e78be57be796bbec888b40afb6bca4011b396f1fdfb87106a62373fdbdd038bd32fc50f375ee4b97a2f03fc9d866986141e7059a6c9757271db785999051dc71b84a10f15edc8d3b7085ead49c492937192af11dbe80a443407e068354e57ef7bcd436febe436c61140a724387a6e3d67101878aa703394e9054c1c14e01d2fb4fef803871c7e3d4a16787294c76cc5f1721675107f9f15700350fb0df77470832d146e52191abedf817d8165e982c117a40c6acfedd3d3ae075f3840ef07b9c0f281c97c1e41a590356f8ca3434c33c97df9af8fe155da43085e31c0f2c6542a778319b970e416da39fffb3b0c7d8462b219eec0548ace4c6",
+          "padding" : "302f300f060b00006086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 161,
+          "comment" : "appending unused 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "4748745f6c5bde511685fd4b1c50d41e78da3b3c189f66b48390c7be0e166eec074771bead431b40f4634378f82e1f2f858c77a8292a7cc3d7cdbd5a0ab17ff07bd9abadc7c5fd269d329f1b0ccf4b3e1d16c9df7374502c3b1dba57d45ee9e58bd725d5a62c8c2d62b5332718c2d3d73384f73a89423d56247b518b6515780d3415c0d2c31ae1e7f7300401209a8f837be839b8cadf0d104b1c218a0de3fd16ca74174527bdc37b735861fccdf3b7c2601ebbfd47a6bb8b970cbb53d4af55df8ed99d19605c4db379c80500419692c3e6091354c9b3ba4beff13e7c946ffd128cb5d71172562ea734916e6059d5b9eba540ecfca9495401e6579e0eae3d00f4",
+          "padding" : "302f300f060960864801650304020400000500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 162,
+          "comment" : "appending null value to oid",
+          "msg" : "313233343030",
+          "sig" : "53e3142909e9a9c048b7f0f95a0e56424b896db0c7135bfcc23c49e6db250de1884312ce2b144977dde680c20b6652fd1e54eaaa84c673e039c673ea30e0f148b0c73da19f8a75b94e7411cd02a994e7b184e53426763e7c0483fa7be78eac0d4456109081dfe843e07084ba5f96c28c69a21e1468657f15be08e234230251b92ddcb70ef76a163237b85483046450bb9d831fb053cc48af052960120100d3e2bdc02bab4f9e099185a8cd060f8677f3b26617696b9ecb53f84065a21fa41e6695107b13382879fa323c0a9f35594fd40cbb9ff9a3984a78e9a643e88245c57c5372f3d9c300e35785ffd920d7cc9dae26b9cedad6975e492f484b23cbf1de94",
+          "padding" : "302f300f060b60864801650304020405000500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 163,
+          "comment" : "truncated length of oid",
+          "msg" : "313233343030",
+          "sig" : "602943b9d26af2a741f6bdbe8553a3975830ef5f055391dd8169b061567a3edee3dcab00b2c274f233e0542c040cf01e50326619942048453f04081de1d19394a2db310ca8088d75f2b559ed663734eaa3bc6fa26fb8ca1a08d0739d0a426b29fc25023a9f110f22c04f80cf9a243aa37ca594c539091a2d3460fbd5e91f101f1773129bc489a780cd1049e7c55399bfc996a8e9005d191bfc8a605fc23db5106670b95342c1e4827e1c02b8d92db79960fc23f650366747be30a082f2c7b90cf15574e52633c0605ca459ea864841069f75833a6cfd1be6260c0fc1e4f78fd9420cbde31c4c7f7e76be5ca8bcee000ed44591b160c553ab88e2cf4179ecdf70",
+          "padding" : "3024300406810500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Replacing oid with NULL",
+          "msg" : "313233343030",
+          "sig" : "456f7c00d31ad1ec7cb488711a9a4224c5d66b15c9b9a521ea316b94f2341561aa5d4955db7feac3bcbe4347ccfec2ae34ba7779c68e502d4ca9963311b48d3839510c16b5581b69eaf3c83b2430adf6ed6cb2cc5860a7cbfc063879b9913c94d08418cb3d9215090feae09aee52bb0fc24a515f2c7c6c380acf9d027f615ec48704f616bf0ebd7230c0b7d31231a919cf27e1fc7a4f36abd93dc133ab75e9ffd7a655eba1d0bd07a4f5308e047eb421a14908a693394c8eca91e93528f992816bf44b318e821eba1e4bae64c02ac588528b366bf1ee1e9c93d3341a3946f49e98e14b55ba8a5d120708c712b983319cfd8793e19c5608c9a8c511246b376cd8",
+          "padding" : "3024300405000500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 165,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "1d3b8c10515753856261581ef9035a9799fc1adec7296dee7be49a3cd08ee9fe2db6addc5e3c5fc5dea8771f54b1e334a5364f1d3560f2dfd7d88b9ad4670e498282c8fd10f9ebf6ffdf7e3d01e467128c4da0536729169e4583ac6aa472cb4171d3448140299ad69bb8b7276a1f10e85f3ecd66f0cd94b850ac77445d75efeca7bb7e341623e447c3bf86da2f81afacb561b2c0939db30b313a302c52f8bea43b8a85c038d3343e7cf58751dfe19bad35cccf6263bb8f94ba81cd21885ccac5908f65d4b8eda969faeedeecc54c71698f3063738d7b107573876b1a25eee270cd10b44ada6471996dc2c09e95cd39cd2934a3d72f18da461e8a1d0b1773b419",
+          "padding" : "302d300d04096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 166,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "2680b2a4052b86c8ccddad39e73b127b13456dcd53e7794dd42f15c5764084f0d95ecd4aed1495df89988e0de4420413a9ac9da93c9bfe4992c88c480b91d3c4e5d560dca5ea9460cffdc4f89e6e27c44e760ab7893a38392197b762340a16d8b14a96536b1115656161a77c528bae274bd3a40786895be5bee47fcc2bc284e8813c40b3ab250ccc6f85cc1625cdebf1e7854b448843f7e878489c8965c7f3ff4f44110cae9eb124b4544b1cb64dafab668d0473734bca208ccde0aa94befb5ae7ca50ebd42e66bee587435912b439ee75264f60c5082c2060022be69db6d3c0fa6d4d10097d1cd6a4029e5c927e023fac65631091e6d9443afcb79b85474c9d",
+          "padding" : "302d300d05096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 167,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "46333e5ce80dac1d8b3ea04eca470613f7411581c712693852de4b8f2879a9d99777a6c2bbfdd04be775e4ea89c181c94fed707d99350c967d0834350ced2ca3783e975672ae7ac395f39b9f8f3060a9ad88c25b81ce182d9ca1b095e34992612a38aebfb43d94a8f308a2c228c5edf1bb1b7c99a242064240826968b53e357dc46f46780a7c770047f905e82b22c0a626da2631a08367905243ab7eb506f915e8351483575132c059b43c079b05f0a24ccd81547801b5e7a9c377fa34343c509be5b7a243e9b47c4ec824bdb9481407a8d251c79e1f046a2f5356bbe08d4c1bb87dc92361d5a81cfd7a914f0d472bfc3ca1763e89d0be797338c09d6563d556",
+          "padding" : "302d300d07096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 168,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "7f99343e2ab569fab355972825a87080b57746e6b810b07e564f15aa2981c91932bf39108cff2538bcd869e33854ee3479f3fa654b2b93140fe69df27ac661970df9661c6ba3ffdedb3597ddaaef59fa2d1dcb41651fbcdfcc3bc9928fe0648640722e134200aeb04521ed6128d7790844331afea369b532834216a9a1a6e4750b24390f39e091ccec7e17cd8ebcff83ce9175df2538107ce86db0ae5b44163e3ca4d7520e7e5a0af5fdb3c43c2977dd6a09d2523d72f61f4184ead70d6578f0dada65f28c5f04a4b16148d6b2a6c0c06ae9372bbd68ae011923e6835ecd5c9195cea1eb5ba30020f11d80202f9fe6f615caee33b18c0ebfbc98d6143f8f2d34",
+          "padding" : "302d300d08096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 169,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "40f5ccce4f70ba22ee1471ad394e351c4dc0095dca9ce9242215aac8784adb6e7cc353846487a9260eb1d01912ec858a1319f085ee48617573f1477e3dc9e1ebfbb7f8369f17da625d2c291bfa5f4d5e595cc5f0b51d835cbb295e22730e76459326de7be7fc8914558092d7a91de466e2f31a77b16ce00bcfde4d8d9d160b5f8c9987fe792da98e356587d574472dcb15fbe6286b1813caf5258d98739387bbb3ae59272d59f997588e693865c3109c1b43de8fa52e43a44087692fc263d0ed4d6e72f3c1febb529ece3897153bd8f67a9ad2a8bfec0de6db4d3e7f294a3dc8de22b78b4c5e82e36e9d641951de5c1c83b86368f92e5429afe3f2478ae7171c",
+          "padding" : "302d300dff096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 170,
+          "comment" : "dropping value of oid",
+          "msg" : "313233343030",
+          "sig" : "203b76f479e7f4910b519e1a6b8cc4c113ce838fc09fcbd9e03266e1e3e69264c622af09562ca6c985819ece0df48fe6faa580dae52fff36c052cfeeda7d7d0cfeb2eaaff7fe6b015b82e605ca2f75fc13327db5a99e89a96a7c09e79f73dd3a0f1a14a19ce248698f12d48162c4008c253dd6932e9d95ef9fc0de06ac3cdebdfb71301097578afa68a783ee902c7673d72cf4163a13c665a7d73160db15ea239d645150ae8dcedb7b0f1e4566639eede7e3953fb3fb23568cbbff07f0958ebcc5417a04f6c35cf853ba0079820d22fcb14c33ec5a59fc48430b1e92d4cbd948b17675621a092a9e01e05006d6ed74f1bce336f705a02b804a4a7811e2d0bdac",
+          "padding" : "3024300406000500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 171,
+          "comment" : "using composition for oid",
+          "msg" : "313233343030",
+          "sig" : "010cab7807bcaf7a5e9e0d82184c24af79c838663a8a6c5547e5ee77e9b433c2b4b4124a863ec745fc46612b54a30653063142ee1bd5849a558d518389a0bc0e920e16482a15d2c2eb2f531f8b3708ede3f4a582674d45050c1b2f65ace1692f346cf38d3ad1a2db602509d0127fe52a2a9fd2fba7af62ec69d57dca87da17f70cb4af4671d8b4605acfddd95bb49b23e379f3581d848280d1b4c363842d1875e80a9aded043b66e636e0d45e58a7a3c4d3d046c13d2db0158d52fec634c5483f3e864988f80200818f80916d787983851ad3de9f0d2fcd063263e3ff2970e6fac058ed5e91fa99bb81edf1dd1e9dd704cf8f394989337b748c5adc304614904",
+          "padding" : "30313011260d060160060886480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 172,
+          "comment" : "modify first byte of oid",
+          "msg" : "313233343030",
+          "sig" : "5af633ac970bcabc50e4202dd2fd0fed1099fe9d0d0fb3517ed92703bcf6527c827f7e2ff71f0804cbd369788562b7ec3c00450e86c95e03519f3489730091257670c3a785ff4729e40412f9cc7c4f2e42a5deed3f5bae02c929491e4df1e1996b56d8a67f2c29af70ac56c87801eb9ba4bf43d353bf4b41b3bdf9ea9e0e08eab61cea2deb9c9bdb3750afe1ab303393569249a024f1fa2c60e7913ab124dbc9dec67b900ab1035091c75fceb6d45e498144b2441b96fd0db1c84cc1d155517c5bc7cab8ef4e4d76369ccf7c2ea7e686df05039611fa6856760c56457f3ff7c7a6d218ce6b18938ad2d2cd9b48e82e7fbfb3fc9718b00f22617a8090850de678",
+          "padding" : "302d300d06096286480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 173,
+          "comment" : "modify last byte of oid",
+          "msg" : "313233343030",
+          "sig" : "3844c68a3e1721d699de35121c738cd857f1fb64e94594f4e96991a3697b261fbac9977c17385502b7ac536a34031eb77d7035cb5849c501e92c9b3f24350b7089b0df15e8daaa4bf48343ce5fb66bdbb0b1ba5489ee8b04edc996293f258a130c516b00f4cc8d0c4d96794b48d7782cc4579b2502ab1a692a5db2129efd382f2aabb26b7bc845303b9a6898dca5f78b2b981d8f01fe4fe8401f672682b1bb7edb80b8c4e3ef9bb645777bbf3aaf75f4e868f88d66aabb4a0f4fb3d6abca7378689dc6b2fce7832f77a27400a56050d2d84b38d866db2c34264236190455cc6e6b6fddad1afc7515f0f5d501af63732c34fdc8ecb921db54f01a248fce06acc6",
+          "padding" : "302d300d06096086480165030402840500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 174,
+          "comment" : "truncate oid",
+          "msg" : "313233343030",
+          "sig" : "09ee17a7a33ec5483b434de0ab4ad614648c1de9527a436ce118d052697698ff21f096c4d87fb96f579eb099ed52df93de4e6a0f077c8d027d89c51412d56986253cbfdea175fd656f19d345bf0507e825b91b81536e51e73a569d6174a5e2409f213d0dabc090593572ceea2b98ff53d4be9f3f8e560960a60e166da56af88a24f62913699ea8fa68947d51cf543fc86df81454ced19bb72044106f51515d9b3e8972bef606fe17dd2afbdb198ef147b29f2ba332135b373d55bdc08fe78946c4e9b587c99d45ca54020942f79cb7b3f0fc794d66af07a72961ae3ba3b56b982da0ffea0db4028fc21baf50464b37630885d621a8ae17d9e6f44b3ebda04b73",
+          "padding" : "302c300c060860864801650304020500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 175,
+          "comment" : "truncate oid",
+          "msg" : "313233343030",
+          "sig" : "068b437649eaef8cce780c2c6295598b1a55f0eb903a2069aae7c5697eb1a643cda83e2691970f69b7ee9fa1d129eb82097d9d01d7ff7bad9580559f18811d9b9ea0dcc62d16757c73e1d3219b58c276c5d1a887adf6f3826c333c5e42887551f49d08f6bc95681f835ce520d2fcb3e043c1810eeb721706e46fb57e50da5c15bc03bd6ef40b2651c1bc5a55554be3945f485f699c3c27cfb953d3288256d663d9b1075cb473fa9c70862f35f78e19e1799ab19e4098e460d31cb51f87e32ecf5419ea4cb2677123130d8497dc7c03c8a5033b19d5c9b7b5608088a700cea65dad9955e97559a7e55809ee6acd22d7c291bc823920ee1aedaebf02d72845decf",
+          "padding" : "302c300c060886480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 176,
+          "comment" : "wrong oid",
+          "msg" : "313233343030",
+          "sig" : "71ecb662cf7b7b9d1199705b407517a0b5739efa25d61328f640c3540ea04c93621010bb5758ee9449c7650ccee1e3bd7adf7d4bceb6bd66a4e81f9a703738898b5341d8eff363a7abf114067c6ff6a5efb0ab50e3daf4ee3bfe10b4239fa6289ef58750f309fa192789ec6ce9e311ac2bf4954fdc810d86d8fd20322481afc6be18a06d40f643c218ad4bf73127b696d3dcf659ee124839c6d3cecdebc9f810ea83206280d7f981aab8afe30b6f422b61b160f297f2b4ce8ac590c3d313c5a97db8598d6bed63d875d48ff14545ce9a4e6d26f34bb0b48ec071305ad84bec268be7154d63945c51612d90e76b82c5838a0fa73aa8bbb763a98300a56bb83c36",
+          "padding" : "302e300e060a326230653033303231610500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 177,
+          "comment" : "wrong oid",
+          "msg" : "313233343030",
+          "sig" : "027dc14ccecf0f4b53628e69c0554fe6c3cc4cc0f14746b88bf1601fb147a91b6e1fe47fd2a36722f4c7bcec8be56ed5acbae1220b4ea432144fcbcf51fd8933be3e759d28b6a8de985eee560201ff637e39f05ee092e94702cec19a0bd9655f256a3a681b6896208ce5720c2fff59dc67d1ad589b6bf386b07ccefeb3b25c26d35eb9587e86987f6d6889fbd5d3633ea124c8847016d3429d31d1c9fd7a6f4b539aec19d0815a2c4e50974b1b548fc791e51529a1ea6584eaf588f118cd49266810f322f0aa119358ec68ca5a9e7d9628f563820ac3b7803fe0e83019c87af9659729e9fd2e09dc57c8cb12d68aed4780a9878d8e45913d947b1bfe39ae6e45",
+          "padding" : "3036301606123630383634383031363530333034303230310500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 178,
+          "comment" : "longer oid",
+          "msg" : "313233343030",
+          "sig" : "498c6f4fd92499f8edf95ae6c19828e0530a7d1c5c389f029317be8c619b5d5f4086ed0e1ea231de10763b4793282b4d5ab086e26603708fb3c94cf9ed9218813ffbee4fb2fe472da21511505cd53b5ea84053b65b58897bc5dc0119ec9fe214ebe825aa052758105c3bb58f729e911f4dda5191e3825ed224d2f70f15febc752fbdd803604b1fe9437a82ac4de575fce35d02081b20c13acb6da46483f3755e3dea81d47eef789d6c0670ec09f6e1b1d16dade6743db16356b8d893b8a6a19ae4af6aafaee71f1e56e7e80f41757b2c374fdaab47c2141ba8179a6ccb53faadfa08b3d6e405907e1acfc43360bff0a298c24bdac7de35e76399a3aff93a4646",
+          "padding" : "30383018061436303836343830313635303330343032303430310500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 179,
+          "comment" : "oid with modified node",
+          "msg" : "313233343030",
+          "sig" : "899200e00cf7a287e5fb690f1a98db20ca02d4caf704a01de5be69766b9742a9bc6cb756bcf675ddc06bfc2b82807a3dc801f0c0480d5447c391c12ccb9a924323bb0b48fc89bcc9056385fb27513c7d5c8d7d02b824129cdf88bc70e2d3e4891976dfa02856b2367fc2637085ac25160d20937d8faff4fb9551fb2f529729f8b7ff2bd50aa411f74e65a81d367a8b7f0e2cbb4993fb11bac5f45b4e60e427ba8d59ae6a8d8b208a6b1fdb20012a5d6be8de0e05ab4073e59475bad173b8b823745415d4fa8c451282f84fca477aab3f2b5a68682e60c33ae7b087be3a5b3a50f8d978fb0190310fffee76cd81806705678bc8e4dfec39167516930e122adbe4",
+          "padding" : "3036301606123630383634383031363530333034303231340500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 180,
+          "comment" : "oid with modified node",
+          "msg" : "313233343030",
+          "sig" : "9087f6decf72fbe40bdfe9ba5040f6fcfa050164aabe33f5dd6625fc6633a46b24d4ac63f795027763bfa2787a2099780c13fdde2146a9127c85fb3214bb1e788f4755fa9b3edaefd22d82e317c28f34b9f930b436cf7c45dbe884f61c7517af883f5daa689a08f4f2b9713b626520a48ba23c9a221f3522d8ddb55430088ae3ef6f410f1c34022554c0494ef91bc476045e25efd6de65b511a62837fb5459e471081199358993b02b120db6cf8fb505fcf2c0382f39df46ee4bb99ccde80f78dd7b9f008aa15bbc3afee943ffdd791441de04654f5d1af7b8b5606959e279b336434dff7634604e07fd0c25d6910f24da7f1e5fab72c1b555b424663a3bf9ef",
+          "padding" : "303e301e061a36303836343830313635303330343032383838303830383030340500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 181,
+          "comment" : "large integer in oid",
+          "msg" : "313233343030",
+          "sig" : "7836fc6341cdd9127267e09075d6bc1cd8b8b643552a095a87388014188b24a646701417073a0df53f2c04d57fbe542205325c8661cdd1e7580e227586b1e706e0fd4d0e28e32392c75f8104eb1ea9e34a39c63a05d5863fefacf1f9e81cfab1c3dbd0a05153c87595365639c1f9202b242dca3d5f1e022fbb5ef26737421a4a960a28bd6ca9d050414120e19577b8d75753a4a670498d51a9733d5ad23e39680cf287a3674d4f45c205e7982e70d669d3cd74a7292242d8c0dc7ed8e60b1d239306b3a36501a7254edd0b4ebcfe9dfa172f5e327fdaa862ea5d79e90c5bf7f6b3810838c2d3a41981f89b50ead4b137ad48b153bb73430a4990214b0616f44a",
+          "padding" : "3048302806243630383634383031363530333034303238323830383038303830383038303830383030340500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 182,
+          "comment" : "oid with invalid node",
+          "msg" : "313233343030",
+          "sig" : "166cfa96fe00046d45546b8b0c51e1998d39781f1503fe3bb3f405bbd0ff21f5398d5365f07767bbaf98c03329ebb2f7c7bc19d53908a1db8b5820dc50e348bb53393b2955ad5202b85aae3dccce156923fc9ce41af38dd81140c9642a30a90f0933e243dfb148e435255d43421663057af8a28d37f51e2de768c49758ea8e09a768c9f5b8a06cdc8c57da06aa95ba1a2a7ca562d131d16b4f182013b93205502dc447ff4b1274e5b3c1f560ab74e0e3f38bb2b3d2fc9717a8ce5bcbe0cd2fc890d82bb76d28c67d371a7783cd72721a1b4ce17a6a0e4f89061c293ba3cad94eaf2564544ea8198d4af9ab04b1d21ae4f1f618e0f633d0dab80729ae22577abd",
+          "padding" : "3039301906153630383634383031363530333034303230346530330500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 183,
+          "comment" : "oid with invalid node",
+          "msg" : "313233343030",
+          "sig" : "1fba2604adaf2f7cf9c0d4739b3677b1d8a00d4d7cd02519714e9c12881719853427c79e6f10f385c041d442a30897a917826d0a6b9004d559f6ebd119ae6c77ca17f710b963b7aadbf4e0db885de2cca48de8297a64541961ce1fcc0429fe213a0e9e6c59a39837e41dcd7b4ffffebee4736360947ae22eef06abba920791fe64e0b1eb7339946e6ac2aaae405efa0ac8146afefdc398f45319f332fefa03266de3256b6b50c3e6af4d89bcbdaa89b556905931f9bb3315893c4a6ad8548cbd6cf92c633b15c07871a2d8b48352eb1fc6637dbbd19164ef9f2b144a1ea3b53044e9d3d5c9534af7831c141443e32adb9e3db4468546437b5984bcbeb8fef671",
+          "padding" : "302e300e060a608086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 184,
+          "comment" : "appending 0's to null",
+          "msg" : "313233343030",
+          "sig" : "3d15e68ede26431e35c9a90b60fef58b0e4272399d3985fdee920c789995eb8bd99d01c4db80f90fa7e3105de75cea6ae24e677b8b1060a6a9f151a49fb4173397e59f79f46cd70a69ea44b183f6dde2245b4cf7d6c168483f276feaa2460eee644796979f20c6875d2ff9d7b26ecb9568a39db999b2b81c74f644573ccd7816239ac7e36c3cfa3ea458d192ac0eb40b5ecb56201b2826872df27403b98d1c5ca22e5ffa287b5ccd1c1a3f55841dff414d1edc4328c6c8c4b11877c954d0dd7a8d3f776c85810c842a4e14c87a9f9550a687561ff1875a86d4fb63191a7daeddbdc38f556c16ca97309935f13f5e2b2143f3725ec8ebab88f6a6a851a9083e93",
+          "padding" : "302f300f060960864801650304020405020000041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 185,
+          "comment" : "appending null value to null",
+          "msg" : "313233343030",
+          "sig" : "7cee1b5e0354fafa1579370b760ea9b7254ad7341baeb097ba395480d108b1650165bf82e3fb0c7abfcb6e6a26803efd2890f1fd138f57e1bd1dffa438bd28325c20b80d015aa670b27484a3fdac73a298d97356d26abc0f5330b1999ea37fb75d65aeb73fa4bef29d0a788bd1c5d50338c6cf4723071d1390f5911f05daee8307e9090f3509f47d235ea53feb88f82c89125501ec89e737ed31889cecf71c0ca14ca0e50631060069451c7c8d73cc943ab3226d82fbfb9374600b96304f74b2ae4c50c024340aa1ff7c884f010c4449d7fae341a8f048a1d072146ffcac6d13a84b995fa72563ae02f74df72f5e78e93fb7ef5811201fef2c5123e5725855ed",
+          "padding" : "302f300f060960864801650304020405020500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 186,
+          "comment" : "truncated length of null",
+          "msg" : "313233343030",
+          "sig" : "99bcdd4917e12a459c8ec9d7ae7c5f59a74cc3850297c9b47b1ae62c2be91e84fde9bdd07bedab7ff50b721cf3c9f6bb448985b1f0bf1c54d9740b431793ba53c1963c31509a27f21868559d935ed6b3ccd0e52891b2371c8e77d8fd6478c16250b8920620b6dc6e73eddf059d483595e2bc5bb5161a08f1a430766507a68abffcdeb6a472f17f488420f8feed8587219ab1c432988ede2729ea8875cd501d2caf9bf1ea53c4e475c6e97410289f6ddaba3bd96b0b0005cab3b3bdad74c8d0c1185a099ffadfd3440e82a24265125a9ed641174f361c9bf944130939fd0daef02105c5ec01d2b5b3158aa46100d66b48e834d6edf050b88e83a3cca4212f995f",
+          "padding" : "302d300d06096086480165030402040581041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 187,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "4c5df8bcbed902183e3e90fb167a75c8e528eeac4b71557738f6472cc9755230f9d9e661306e7d99d9225cc4d392c094817d406c28df99da1241e26d05fa37a87d151d56ec19a0f7ba0c0852ee6f889fc623d67bb2fca1e8c93aa9d5f37fcfebeea2ff61ce6e7ba4b4e608b89901e17a4ab03db6eba7fa5f3768fb232d58a953456ff31e2fae2aa005ff896a1d6514b6206b7ac4a92946c0ac3485d255a9b7348fdee8bee8e1c4ab36f8a46c4b7c8200f14afefa7acfa8e45a9d0b7b207919f163afa90c36e8dd3da836ee1c5be69c72bed446081a80f6fc8c7fb8f532142d3eb2c56e6ac33bf277cf1bcfe8eed9fe637f24d4bf515c573d02f0868a25e88632",
+          "padding" : "302d300d06096086480165030402040300041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 188,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "5e0352e6010a615ed47d9aae0bff7f23593b2835966ebd2378bedc3459e3d5813093c46ca3ba496486975fab640bc05d4f0f789c730e5fec8692dceaec65062b2f0ad849a2fdba3b9749a8ca7307b71df156a57900fdbe688b98874219bd2b86f5fc2d2fcbde64ca55bd8c5862e68b7883afe0f2a6c5e4cf158349477dc99fc43878d5af3c75a10831a2e7a95710a06f15958e71e32f230c22e8e7c1b08c7dd2a7614e25ddc8c54f819b8ef314881e32e35beac0e70078b11c9307cf20280f8899630a0d02ff4dcc48a6ed74ddb18189c747428dc4657f6fe2f28ff772651b04402cc9cd667d44fb1dc9cb10061fea13c78dc82da9fb7c4a91cbf5d1f99c5449",
+          "padding" : "302d300d06096086480165030402040400041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 189,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "9175dbff955e941f857a3a6ffedbad1228ae8b7eecabd519012deff34ef33a941a079c7b4e541313b314005db463b80111af13e2bf975aff6d26dd97b6ccc3b0cb45d7b8a01126bc80ec48ea2821f3f2ac899a5c0c2b7307d928b24a379332e5a7ee287f3cd736c701be439bef6e83a23b2b93dd551c7cc1d5c14d6a1e9ba0ccd33ac9a2e9ab4158c271d728acafe36c61f68ebbdfd0c8834f5f87f83f296ce2d3880219e6fd8a24f38a685604e9ffdf1ae59ef4a301c7a56861987aaa8cac63e48272911b294c99e8fe5bae8eb32686bcabebf316574d53ba07a5cc07b327c056eb3020b6e9e4064a0b7714ae33375251d2d634e541a37405de3ee31bba78f1",
+          "padding" : "302d300d06096086480165030402040600041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 190,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "5e4816fc498d2e3f0a33263983b81d563bca7be0760b5d54c5f49f08fc6d10cf8ba95188428de68b4864fec29a64adea0119932d2c4e6af69108b1e397b1021528c679e21fbe7dc4dcf7dee27c2654561656d7b3bf08187f74cf8a0d24ac3fbef8bacf82d50981ac18912aa785263212bd71c9c6e209caeefe5d978e67bf34d3a1f6da724d7337c7f197642413d219d24653845ef35fbbe1d7c733d8bb32fc25457d36f20fff3f6c718a27ecc05ef36c143a5a580383e9d47c39c842598d0ea329aacd4eed20dc99e641101628def125b860520797f8434fb96c3bd90d9fc29562a34b4a784f847ff50c7322424d656e401c1b9beb39e2623e1ee7afddd0dbab",
+          "padding" : "302d300d06096086480165030402040700041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 191,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "3af357a109ee6de3edfb8b0ab82121c9e6ba5c78beab6393e776065f08184428100450038d40cac13d7d271c68da1c0d05e6d20065fed3dc1b02bbc9fb8c1de0b0dafff73f0bb88f36020a78590dd96b80189eb5740d2b84f66ff64240fa91ac8a73ba72ff56c6bb82dc424904e65bd1fd969c5d21a81f44b458ac52ed66cedc403d01f2139af14e6e38b722addeb3a2f6e4755e3d2337de4504216acbb596ef39deab19e5244d52fe462f4ab75aaa510552034706e00f33b8dc1b16d7e8cc5b4066a921ba5a70995ccb9d7f6a891cecfcdc78a092a8bea6408f5883fc866462abfe35cb28aaa6ebf1b283351a7505e6a80d8c64867c2d275e2c5d7500617975",
+          "padding" : "302d300d0609608648016503040204ff00041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 192,
+          "comment" : "composed null",
+          "msg" : "313233343030",
+          "sig" : "8a38e8a54857755b4922f9d248d9dfda77d284d2a678aa8bd55f351acf4aa40902f8704479827223c1c6aed95bb33d2c4048cd578f0b24b0ba88a96b881fa8b86f241ed49e4f0bc1a27f2e55289c53c44248ac1268f74123d8d055b72e7440dff28d05cbb174780e2f0636ac596849c8d6b20fc37afa9d160d8cb370651374919464dc618d491fd17754d9379ccdb689b004c7d4d4fd04dba6a9f721d4da77ae9f3abc094350355295ccc773ded661145aead73d5485e49af3d9c112f463503ca5be0549e186f334e95e8aa52c2a33c259306bd12279613f9969ab33075d76222cd6218f2efa9e0213664db951ef956814f29374fbfd0e563a5a77cbd851a9d0",
+          "padding" : "3033301306096086480165030402042580aa00bb000000041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 193,
+          "comment" : "lonely digest tag",
+          "msg" : "313233343030",
+          "sig" : "9f360dbd80e1a28bc2b1759707e4ae5c5e432d4d4b9fa6b67f37e8c576178b820f5fe3c8c44fc3de442b900c73eea6f3040f9b58ce38611f74ce6353793b7ec1b9ad21ec8dea913011e0d76ea2caf5c1ca7899453789d9e868a1317dd707481c213056add922177145e7cb077b9aec2123d8e854dfbab7c2a96a58c51cde0c7c77dccbf58d781cd0cf5f1251e5cf263088af9c374e8781b9f7d0fb0965a765727682f97b3f1ed593082709ca699570c7480c2fb3669bfed128c3063cccd79d1161c781589e733671956cf4d1a6d90a4680f4c38c04cf0b3b05289860a809ec99068fe853176f7e6354b4b2c15e3b535f301a00fe240ca43ea401f954e2e9d170",
+          "padding" : "3010300d0609608648016503040204050004",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 194,
+          "comment" : "appending 0's to digest",
+          "msg" : "313233343030",
+          "sig" : "05ce3264ea04f7f7ce5a073bf70154b120bab5026887f675c9ec97fdaa0c66effeb7952e5b11999ff343bbd176978a6ec6eefa8f4be2671c700382f7d8d221266ecfd2bfec8a7d2fe36de408104df0152ece088b73c1c0a821b9a7ffff8d83059fc7250c5d54ad9e7099cfcd82e887b5ae551732c37a1bac432dcc5504bb5013dfe46764a03e24daf62e180a62491e75cbf560958ade809f8698e8465b99332807ecbacf1b29719c7d582240a3f19ad6799c852b958c7fce3ea5e19b6c098afbafc5bdec765d0b90da1b6df7540435f291cf2a19e9b31176b04579ab18cb3e9b5f4a86c7b4f17f131b7a5a9c03a93542990220709f8a68ad1d691e8c13345cd6",
+          "padding" : "302f300d06096086480165030402040500041e753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 195,
+          "comment" : "prepending 0's to digest",
+          "msg" : "313233343030",
+          "sig" : "0a7bf438897d08deeebb38dcdd687714d69b0f0ccd23c8daf75e3ac8588e1ba0e5cde9bd30cf6d61edac581c8f3d2b8fb7d92102faaa142f75dd78152bceb9a9cdce3ac1b6d3121cd7c65c5508deb1f671a83b3ba45d0d079ae294f56086ee92e109e94639494093b2fd9efb0bfbde8b459c7aee258b23b389871d4bedeef7b8bceace4b870098f42376cd0a2d4631f0e606390b34d86259b983c2c16939fae962a4da25c7874f5f59fe0b3e6a25fa8c0132375cca9f21cc23f4638a6efd3af2aa9010082e340394e33913f7331305e6544c87d34bb3a668a1c8473ff47d59fdff11172dd156aa94e4262c9374b001afde4fe551fb599242dc3584587fadcb3f",
+          "padding" : "302f300d06096086480165030402040500041e0000753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 196,
+          "comment" : "appending null value to digest",
+          "msg" : "313233343030",
+          "sig" : "6db16a706014bdc6d673d5a1e15904915bd1fe1934cc20a6ac6a01f1e3fe54750eb01ddd2afc1cab644bddd3805c57b0c45ec2951b2595cf41ca2a006e6bb4b4f1529516c48e007a2173a5aba22081a529d3d970c0ccd41a43b739e38063fec026f4e9c157670faa2a2d0288991737ccf7833f41dfc4c8d829bf1f4cd35af15b247a9ca676c52e5c3b07c08f1322b31f0d0fc0a9f0698c74248fc54e505431827b2b0e8814d806f12ae85c2e8f49207c21c6abe348e058a17ccaed6a75bcd07a677b5f1312fbc4a1dacb05b64272c178d8c57ce2f3556529d9ca1733cc386e39d661ba1c7bb1badf11488f84e533101a5568b9ef0604a8b2e131f671b1989999",
+          "padding" : "302f300d06096086480165030402040500041e753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 197,
+          "comment" : "truncated length of digest",
+          "msg" : "313233343030",
+          "sig" : "518a1e1c38f30eec3947d32d92d04e57a8a82923ef9f13f67c985a4d2ed90ecc39441372897888906014a98b38c079c9c53d9dedcec059518a1d8066b38b6fb6a6b10cc2b6ec04ba7c2ed60f6d5f17cda6db6db3f24d5e8a46a833594ae3817311a6664ef5a5db0eb988923e6cf5d21cbb1fcd27a4646ab5670780a86cb492bf17359f346b426bc634fe4a89797b9d71e6b80577d7b7cc3179903511bd7475d85596e8371b80684e031c9d676d665e9778be8ec6347a6622e2ea0232755f7fb07a53fc6361e58a76b87cc54678152c4b8febf1d942be3a000b6820cb86c9f25f332dee768dbdbe25c374af05a085e910d1effb97c914cf1cb0578b1f0858557b",
+          "padding" : "3011300d060960864801650304020405000481",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Replacing digest with NULL",
+          "msg" : "313233343030",
+          "sig" : "4fb00ed61d60c0496a690006f40ea8a5df2e3e3dd80f8f6a3e39902e0447a37f4ab2e3737898cc0bdd7617236e637f0fbb9799f17873ad71bfeb32eb74cdd927bb830943bd0c6ae3a11705dcd8b272fa356d34445b46e3067caf45e0b4f37bb8c6dd43600184b25c2651932d07e6c9aedcf94796223bc90eaa329633756ddab77ed3b70de36f585918a7309d502c88aa922465ce213fb347d3aa70e840dbbd3ce920ea2b04a99c3845ef7ac87b68a54bf359a6540001f0602cc458b91032418da97bdc472774cdf65f58cba9b30b6f51777beb83cd6bdcba1fc1bee1ca35eaec7a29c8784e33b7a5b335058df1e2903538ded311330336a88256168a5759a7c2",
+          "padding" : "3011300d060960864801650304020405000500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 199,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "08f67b8e90bb0959c276ed23d45d3752f2594353d868ecb2f213a980d8204d530c7b06ede81453a8ebe58ad685c7c9b8743fb0e940877592b87ceb457857543f060101e0757e02dd8f48c3bc348adc31d57513f5231e7cd32822b9844a41f00b394c20a6abc67d51a141738657247b4898b0c4422d900be64f673177f6a4437a125ce0a85ddefd952acba2c2809d4bdb4a9c05bfb9a1b09bbfb6cb675b51ae23f3857350b208632761ad04267caaf969d43f699d5908dfa7ae634447abebc05e372f194387e29db9adc9360d07b0d48c02f15eff31a0bb2ece9e97797fd18dd3ae2afee6b12576055913ecbb6cd8f58163736c2e45fee2bde79b7da293597c28",
+          "padding" : "302d300d06096086480165030402040500021c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 200,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "386dd157db54f471b88f6f4cd01b25ea4788cb1f8256ce996fa3a12bec90803e92b907d1e9e8c23bf20d8226b9d7df699d5d59daed206d4a5da51d0aa6566a47bb363c9375ea5404539054924b102c1e0ed40cce6c9b6811f79159a971c4a879f7568489d5c0ee7d6d20f48f0255bbe556de271c8291c1e4198f765e3d5cc7fe2f5ddc366d28ff08d57ee5efedb170a18cd27a4d15fa8d315b695d47f1006814731524cf3922aa5a42b2cef314a0cd43578a224cee8d0140c53ec80e8605e1a4f5e1e23f4600d18eeadba902a398c4d874d03ba098956749df963cefd387553b4da2a90550d516451b4430d7ce2601d148d6c83f3275b669bfce35b9a5c7c336",
+          "padding" : "302d300d06096086480165030402040500031c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 201,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "0511a80f4b37cd13711adacaf85270137064579acf30e3c928ed6419507b9a807f9f5e4aaf853d96083420949d4176a4bca9bffcafc149ac57e3138ef4ed6e7aac5b024725654ce7ced2e20ba2c43070ab5a9aac1382f101cd5020bb8ea6bb3e21ebae04de3c65cbb746863232b129e19fa2bf97bd79f7e7975e093da71332fb10d7f70285237017d7251a118ef3fde78dacfde73e4e28921dddcd21fe2fcbedd45121552a10461681fcb90bdd1d1877b4fe34b9deed004ce41581dc1fd38cb767b1ffffa69bc1ae1dfdaaf942f7b50cc0737adaaed0273c929ce60b0e2627c2c1d5153f001c55096120849682f8a9774b6f3ebbee71b5922080076a2d5544e7",
+          "padding" : "302d300d06096086480165030402040500051c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 202,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "4884cc2d614aa4f4f90973c0490a796927a2def10606cac4b00039f6b5e21742e1f75384585b423ea87efc022d8e7d2190b5eead35292677fb843ab81c476fd2c4861695cdf9d3ce3f49e2c6f90671193ef13d6726547f89888bfc16128c7e7ee48d61aec79b5e1e551abff8ee27ed83ee661e42fd614c2e88958d4364460cb9402027a10822c16e17c083e5792b77ce3f07a4698c7e25245c651858d96c1258a0e0d0ddb3badf5f7b9713c2b89ebde7266f5a88c19b794e6cc2a8d96789f0bdcbec49e128473e2efd7ff80387fff30a5dfee3f2ff18e4bef5baa2131937e7d71bab5e5f521570165a8a8fa27d6288a2d524a2be7a28a3dab05712210c8c1f76",
+          "padding" : "302d300d06096086480165030402040500061c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 203,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "101232b1f7090316ac2c1f1e56014df258065a04e8bc08740ce46d54356018ce1567fa2610743b7c496d414506e8d439bda52e3680ef660d4e7ba645825c0e82509be7f9adf0272b212381f5039fd354e693d77931e2d59b0bfb431d903b16cf3e84187a55f709e6bdc46e377ee965de7fa43783004081e9f681f794a922409434cac493d29c9d1ab0f2e033ff4e54af9cf00d6c8cffd0b67f0ea27c5776e2eaf039946e8d287c2c419ff9f1fefffc968ad7475bb95aacfb9cb1d623c2d1b6531bdcb2493f0e93ac4be36c7a05af062e6ce9af1b8e063c808af52f735bc0c64ad141347a19466f650eb660a6e7773900e6a0801083be2934a178403f5ec29e25",
+          "padding" : "302d300d06096086480165030402040500ff1c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 204,
+          "comment" : "dropping value of digest",
+          "msg" : "313233343030",
+          "sig" : "23dbd5d795fd3f97f7a2bc5df227e14e39416976c2c616e1e8a19a85b0648eedcbd2ed91780c043dbcb124de6be7ddb7eee16851a97eed4848589786095cff7c4395fb4bbc606f892b0b3a01b285c9aa4c86a060d4ed5f59e1d1d72180382531f6ef539d4ad5cfe82c9f02e5b6fc81ae0b952a6409d2109710c26280d1fa0be306a37f956ca50803b6eae1d11d4fb3a3d71bff2ba2773dccf3849bfbe42f5085f07334dd5bdd6708325d67d98598ffc5c52a0689449729665c3fa86d542e2f2da752339ded4dae90b36b0dc8a0cb3e350f62eb05ddd710ca6821f32f840eeb98961cc5823e1c827ac67ba8388a4046b8c856dadbd1323c919fea5d0f61e61f95",
+          "padding" : "3011300d060960864801650304020405000400",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 205,
+          "comment" : "using composition for digest",
+          "msg" : "313233343030",
+          "sig" : "bffc9f6d012a4e94763983a47e9f37698e6810c3de75df01f408fcafb3d3099896d07017670867794d5820ec163b1fd2bce080aac8a6cb90f8856d5443d2abbaff0e18d6d3201b5d24745ce001ef8e07f8258a60067c83f42aad79f922ddfbf6199ca7935fba59eb2e639c8aed66845beef5bf01f2ce1b06106ac87a2c27f447d6038ead7cb1fbacf7bdfb7811097fe0b4b1f14012c3cc0025750f9cf67e838ff715f59b5bb75676c93f71ae5cfa96f0375e3e704583d41f499017a5e62a5ee321209041921f5a64e212d3eefa8b42a4a7c240f4da15d903682780ed8c005d4b5fc13e7a95e106644eed0ae9a93133df9dc7ae8555f18579f020651e53ea9340",
+          "padding" : "3031300d060960864801650304020405002420040175041b3bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 206,
+          "comment" : "modify first byte of digest",
+          "msg" : "313233343030",
+          "sig" : "8ccdf190e17969f0e4c496dd400da98607ecca78795348eaf308d11e29950f0bda64cb6de73604f855a36326b4f18cfe433b67eded578feb4f923879e087af1b3c42f6f29d5f688924508586fd5cbe5ab90a1a04aafbe1d548f5945f7699db7264685405b558afdbe34adb976efc9f6ea2776cc41eeaef56c5cc13e8eff817a0b8b2d8978a8e445ce0ef586414550cd79030fc83d4aa4c2867570fe3242f6b9e659500f6d6072b8aab72d16454067d6c97d5f26ad9cb5e2dbacd9b332cef70578db5eeccb36d0d8f815e2125915764134943f03023e991428cb66076119dabf088632b22455f3e4965cb0ff86d67f8d5dc99763f831add9cd23c911e0a11bdbe",
+          "padding" : "302d300d06096086480165030402040500041c773bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 207,
+          "comment" : "modify last byte of digest",
+          "msg" : "313233343030",
+          "sig" : "442fa58b964fcb7b87eb5b901fafb15c38e31db676c2df0cda01514d3bb6559130973b20478585e8429ba873ac0f6baab8c9ebc46805093abf57355f36860921edeb93024d812611669501928cc869b97d4eba755501c9f1a420317527e5694c6b67af946e6ea9fdf4dbd01f8f677d9a5ad69e8878562531c91362145f923c0083d404f1c6c2cfcefc8954e6efb63a10d3cd832958fae01ebb932e76eda84929f5c5032db5db9a9bf49b9f43e3359aa88cbc888fc6b10b4d908de28085af20b4287e30640bd3d67888a24fa7a216658af1add6c721de36a35e00d09dd54e55c2debec12eb475a3adcc2452ac5e68d1e94548734540cc1448949a5eb39945954f",
+          "padding" : "302d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d12ac",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 208,
+          "comment" : "truncate digest",
+          "msg" : "313233343030",
+          "sig" : "a39bf00d81fb83c0c86b5ae8a70aa45079b84ae55c521f4363787f569836703fef97f5ed4f70fa9693ab365bdd8a0a6bb5020d01b0381c5cd17631edc8257a6fc271f05279d64568fa3208a632fe2b34c324fa0e93c259e80fa99fc2adbe43693d16399fca84c934a5f2948e6dd73d4c9f1f17bae710ff68ee63b39b70a09bccb891f2f849632efba4d001418f719b03a298e6f94459aa0786e6436986f637c813149b7ac5941792e7af84f8ba78bd6633811e6ab8c11c90a1a4d8f00795c8aff086c18a69f23cb75d615e298fd0d93f5ddb88b6b198af04247a2741728cbe51f571fd820c4182199df335d7b1480a1686331e8a04e15a4c14ddfa5724b785a9",
+          "padding" : "302c300d06096086480165030402040500041b753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d12",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 209,
+          "comment" : "truncate digest",
+          "msg" : "313233343030",
+          "sig" : "6cc74b8e2ed218ccfdb1d0a448c5a4b519ce9ea56ddc96dbb8a894b1d97405b3d3d728274ffb49913f578dfcfab9bf6581ea90c4b854ed701cb4dcb11b16fc68b7b1396d32eb24f7eac9bc121230450c41b54a6afa82a857c4f0c36dc698a2241d2f628e3f728933fb646cd9e6b97e69d8d059a3d9f08a481ec8e0c0d0b51f15df7a33a88a1e11dd46517a2c3a538f2fc581a65d1787f81594b740283df9aa01c28a64b203d6b43da281481bc4e05cb1e6c55031162afd482fdb7dafe520f4e79431cc956ffd512c68400a705bd4598534328a90e74ed4980a5bbf25efb1b02d32dbceb4b7593c1fe386d58e955a522802072c4ea02bee12ff5b76d5a0714867",
+          "padding" : "302c300d06096086480165030402040500041b3bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 210,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "9e97021c1c5dbc77cb54d1e88b29a02102b7f48e1f94c6f04a8dcdf19f54a72aca26700ed01912bf589e4dea8f385eca79a45e421b16d2d84527428537f4ba4b064773175aff9c9eaa6a6ea1949c5e698fe40de3d04dff9dccd4ed9e06a68bd2e71c6a4ff42d53294b45fcde7517ed378ed8c34c2273bb01c0773af8bdfb7b13e8e38f3cb49965c757f7718104786dd86c10b8696796db7f05dc2fe2474c0a57a897411aa7846919cd4fbf094c5207503dc8a4ef8966aee6561a43784b0ce06e7427429fbdb6c6e283a6a7af3af7a78124ae1ae6c57438d69b050f80b36d6cde6d84fec0bcff2196ea3232db115a3afaacb227417f0470f505ab849f1513058e",
+          "padding" : "302c300c06082a864886f70d02050500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 211,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "8730b927f2540ef947089c056ef194b7b119779e4f7b03fbb85e3830de65827da21d01591659c62e79b998b680ab33dcb64c366a8e0744f097fcb72289173cab08ce7410c025615352dcbfaf36c9f97fb7b372a73c6a93131d7b6a570a17214a691888ffadd5dc71659417a56722291b28b47a6ad418a3501eb3566f632b48728fad399a8dd2547eadb6d271a148e3691b2e8ec3122400f8bd40b0ecb4bff496aeb782bfce28d779f6b4f05d2355189c4e02de3a8b55e6180343888c45cd2afadfa882519f13019677e489294592f5c555a2f9de1510c08a1ad9727a1182ed5e1e8c1aa2903f6ad3f638f94fe1a26d2085aeb11e9f246dd2eb5702cdeca3c20e",
+          "padding" : "3029300906052b0e03021a0500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 212,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "29faf94760d009cd2a16a2ff1d13f415ac85ae4d41af4e13201312c93871c9668c00bd4c5d07841952725897efaec6783a188637d71e8ac8e762d12811c5dc108e8b7c10e4319331b855b041523783353435656e009e60f81a4ebfc900454b4a4d3e21fb4b4c82effa12133e58962a2a4320b6ffc9ece361c0bd4c49990209902633ecc271185127fe765c9c41b4b569220ad5de85b547c762cea9fbf24f92ff44002cefb25fd08bc0425192f332b568711c73f6fe9e87c577792ada529454a044a89783446fd007e18256e289756c60b781250b71a8876ca78404eeed93cd1dd36bf1c61a796195a8be395d59d05e2b2da685022760f6b46f11a9b86baa0490",
+          "padding" : "302d300d06096086480165030402010500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 213,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "7e5c93217161007a38889a0a43234def7026eb0a1259be8c7c5b2c94074c73c8a9b2e809bb635786a31e23cb9737c3ed87b113f9d1709b30240d0cde14e706d02e26f5dad1da07b7a47c21f45223e2946ce675bea3b4f1ccebf3d8219bea475897c5484cdd2558fd6a89a37880a3e32fae45e752bef2cc05c64f45b6bb30da8af951896bdd0ecaa6bff1963a90034f5ed4e45d3e89812826813ff067eef323c9e09943b25da94f138dfcb40457a1357c54ecc0fdd82fea5eddfcfaa86060feb1530d8623625c9de8bb506b13ee55cd29365e424240d8dfce15f09f98bb6d2930697841c81b35a284958ba6478b1cd75760a26a6d56212e83f38c1bfdb1240bac",
+          "padding" : "302d300d06096086480165030402020500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 214,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "b51fbcdc6eccb38cce3fa3cd271b9fa5930c6055a58c07e8b14fe29d0deb12ee2edb938bce4738ed5b28509188c907f4db14d380350de48333c7c2da1a9e284f533eca457dc6cbfb62796883a03c0e4bcd7bc60099b719a39d6b8b2609cc831661da6d84d02b19bc35b00084093225cbe336c34af9a818804ac9440179e19942db0af899e1045a035fdb24414c2a64a33a8887c903d4ba7028598a2c120a7e3da30e4cfbc4585babf11caed778b0e7cbc5198d281d5f82e9978bd8f620b48315a7e6abfc13bd83d0398d31fb89a0c8a51321575ab9a72781ba420ecbbee690604153b38bc76d00b615f901075be5305a2e78713194a36c443c0515166d7718bb",
+          "padding" : "302d300d06096086480165030402030500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 215,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "40f3c15a900e707287238618a78f3c1df4f751792bcfed49e583366a67413267b7022ff5668f583184ff8656fe1c89beb4ed5387fd92372d674b433f9bf0d2132c59db6c5974b8514eaa4e1b28a735c60282329f0d47052178ac07935702c7808285872cc498896f61cb887aee1a3fbc700bec4de4894274a6ad8f1842d6b87b31814dfee5688d573dc0ac5531921fd7266e4b07b26e56a10616d0027980cfc781c6bd1c84a7b104fbe9fa22377fe9f50b3caa1f7ffd4524f96a35e5e5e00f1e0248d36fe2fca1e1f21b0bebe1d4d9b16c8811a8b8207e954bb173cb4a17e8110d3966da35a491cb15f08130222067fd6bb6caef8d5e77ba7b4da52c302a6145",
+          "padding" : "3020300c06082a864886f70d0205050004103fa6e1540a9e5b94313c5907267a7331",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 216,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "090d7a188074116255cbdc8a8c1eb66d5224b045d3420451dab67b2d2111bf7dd145d522428c2e9e71be74af29f8e04d88ef46ac6b6dcddf2cb91156278f8b9151d7d5fec55224acc9b4a015762c9cc7327a16ed21a060b1f17b47d23ad66a2e5276524af9acc652e48d350409a119abdc73235d9de02a26964dff902aa1bcaefcb2b3e1a8394a50acf4c6fb503da872e9a65a220b7c1d31496ef10c2e27c00b7694648c60dfc5f238c7ca3063cd91d96d6617d76b0fed8da990838cb7a33561a7b61507deeebb95cb6a455b441305629ffde7979ac76c44601081f8cc425b346b08171752d4b3f711bf979a657e075e4924b73f011a0ba10d034934f8199c3c",
+          "padding" : "3021300906052b0e03021a0500041421f0fb55d0f5f4e1521ec82216000a17e728f773",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "bac5e1663853e0a4088543eaf4cdf36e8b1ec7b52fef42081d31e3f294dffb31276834807c4719a1cfb8c7ff8db7020b72058d4dc481da66ab60f40db119cb57b66726329194f8a8e2a22499bb53c1346778b9a02f92e015b82b4ef432a13c51f93999fd3bba3723698bb0724b2cc5f91dcda79e29c5eddad80b7d4a08e3c549170952eeb03188dac1c81bf37dde0378f66fb81102aef841a9a69743f4c78a8e31556fadf5af56d81afa825d37d2f6d8516795abb7d5804ebeab2fe2fbafd5ae355dfb9864c996b147bb5f1d8c1b4ccc3040b42876a27c83df2068f1ae264ba557a6f1c5e0436c04fae398ad4200f5d1d5a872f771934d4a22a1c7785d4bf347",
+          "padding" : "3031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "83a66a917fd062478353636c8a55eef1bbd99fe82af9305ef6e9049d8e96758d856191bc2fa3226166670502552d6a9e2a62a26d449b31f5905a34c1199b2de9fa37ba9970d1a00baf6b070b92a59054b12d83517d3fe5ea4b07f7e234b3cce16b2783771d9d6cca2b7c6477d695fbc2566e55feae9c6dfc183f99b7e27a964a6169e6a27b16c6e51e1e4e1becb49f48d3f225214db85f5b8f729f3811ff4497b517c4bc0111396692e4f438c9a8437e62ccc5fc44ba85d6315a63dce77d13e54832835281982e722d3eee4f4ccc4c4112e881df0900433ef46cc6134dfa75ce7da8c6f96729760172cc613cfcc89ae90edf1e8126f39ca5db76f45eab8c20c9",
+          "padding" : "3041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "60ed20bd7d6f5a7e30cfce9c7cb5686507fcadec04b8c8aaae94353f83a5a857b305aa837eb818e11a350d1c1f1d3b40581118771f57e987f1b9fbfe5335a5dec435982fa37a7921af79cf52d638a79fa13fd6007deaaf9cfb5425b7bb99269d464e4a342abef1be23f5c6383750c6563caafa863e82ceb3aac7d66e38eba4811944dcaf6bc75e56bffaa2d1070202c898b381cdec53dce38601c196b40e1dcaa5ad76d7936be573fd2bedaa6ab98dd5cdb1428d36ff98e1784adaa39d3019ba7685c4ccecb18dcd7d120579b8c7dbfa3334a65d4fa7620c6d57ed256a6ef49dd5a317675c6fdf27d6e58000195c65f5b41ad81f866859e2c6adfe7a8b444865",
+          "padding" : "3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "using PKCS#1 encryption padding",
+          "msg" : "313233343030",
+          "sig" : "5f4e316d08081fb15f407f929883188cd7ed34b98fa2fcf2cd79ca01d83c86af4b122c300f4e4075cbe94c8b10b573e8f32f8dd24b5ba74f7ceb9583c562bd966d3071a56d4b815c285e16d15572f26ad3656bd86465cc2d1adcb4ffb0b323c1c77b3d4957523d76d82b25be35aa6a4c18e53ce056166aebc8ce5538f4e3ef33be60373f797fab945368e946fe6ac51516ce38ca46d86077c594e38f5a80e2475f3b929ed320ec43c12c12c297a6f15d90aa9d82321ca9a4ea7d147328ec2ab031ed9486dd889460f800a94a99ed2ee7a09c88f4dbafa1b462cdf42840db943b0b952f574a92c972af4ba04eb59540a2a02c538007f147769e238356a218ea09",
+          "padding" : "0002ff...00<asn wrapped hash>",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "using PKCS#1 encryption padding",
+          "msg" : "313233343030",
+          "sig" : "7cce1a56772b4dcaf1b2fc68dc8300b8ba9cab26f96841934b207590f868a2d5b0ab94d9e31e2edb1fa2b8785c5255d175f7c5eb3ad81d20bdf20bc6f8cc622529ab26688c74015d74257c76fbb3faf101db3823f6cd164bcf6ad60c3a80ab95dc400d275348d7d6a1f946c37b8b8f38c44ab05198c5e5ac32cee8b8e9b4efe4692ccbde4acfce1ab26cd1d8d10c31929d8ae3b0d24b91e2094ae967a42393ab198259230b07651476208350a0a83de06c588f77e4a6b401bed5339749ec26231e7fbbeb690d3d29b3aaea38214b3ebc3707dc1742fa373da53d98a47f3199d0e948f285edaa9d79fe819f8c37d51aa8a60a8059fce71e80f3b95364a0365823",
+          "padding" : "0002ff...00<hash>",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "invalid PKCS#1 signature padding",
+          "msg" : "313233343030",
+          "sig" : "1927a8ca62884d8515e9df565abc521a1c40ee409a7aaf19368bdc2c24f9e0cbd1f6a144109273acd712cb0e34d367d76800dc5f0ca9145feda1c518cdf7d07dbef73c189db35220e78c46339fbfdd63070d47e2bc1fd8dfa8b5bb08db1266960951da2ddd16a345c3d34f8bc59622e940a8317685a98f5883ce155471d6c96605b285b754032f998f2e6cd62139f75cd66b1822dce1a10b5af8c22d0931bab50ea1a47230a2dcdf77b720411bcc64c88efc0dacbe8610c359575a1dad37f923a6ff44b493a3b5ea1ddf22c205484cbe07ee665b04e26f9bd7ed62a66286b32a209fda6b5df0d7df048c400f27c493a2504bb1b10a20fc7a5566d2c0bbb3783b",
+          "padding" : "0001ff...ee00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "PKCS#1 padding too short",
+          "msg" : "313233343030",
+          "sig" : "89c981b36b3a8db41f0282f14fd9cad08d7c088b56aa16eeac5f643e83ff68d165ec6790a5c195bd37ca3e6d23f8da5187e866ef44c401b338337bd4f9312e8e87b019e89814fd5e24d322630555cdf628b56f93ef81c435be13cba6cf91db2c32eb6927c9db7f856a4f86dd127e9cac8159a990cc816edee7e8c39f06eff4c72c8128d2be37d2eb2247a9d709797af04bcd744d54741b14ec0a5b7b1583f9e12063521d1e7143690fbfda7cea18451599e76e7c2bea000ba9ffd5b8c547c4c23e8975bc6ae22eec79937929487e0d1166dc7ea9f6a1e71cef41e704e89f2d01b7a81baaeda1738756265573528a3a495919dc65abc36c9aa246691fe0aede70",
+          "padding" : "000001ff...",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "CVE-2017-11185",
+          "msg" : "313233343030",
+          "sig" : "c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f5",
+          "padding" : "n",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "invalid length",
+          "msg" : "313233343030",
+          "sig" : "c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f50000",
+          "padding" : "2 bytes too long",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "empty signature",
+          "msg" : "313233343030",
+          "sig" : "",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "0",
+          "msg" : "313233343030",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "1",
+          "msg" : "313233343030",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "2",
+          "msg" : "313233343030",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "n-1",
+          "msg" : "313233343030",
+          "sig" : "c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f4",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 231,
+          "comment" : "n+1",
+          "msg" : "313233343030",
+          "sig" : "c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f6",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 232,
+          "comment" : "-1",
+          "msg" : "313233343030",
+          "sig" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/rsa_signature_2048_sha256_test.json b/third_party/wycheproof/testvectors/rsa_signature_2048_sha256_test.json
new file mode 100644
index 0000000..c9b3e99
--- /dev/null
+++ b/third_party/wycheproof/testvectors/rsa_signature_2048_sha256_test.json
@@ -0,0 +1,2142 @@
+{
+  "algorithm" : "RSASig",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "MissingNull" : "Some legacy implementation of RSA PKCS#1 signatures did omit the parameter field instead of using an ASN NULL. Some libraries still accept these legacy signatures. This test vector contains such a legacy signature",
+    "SmallPublicKey" : "The key for this test vector uses a small public key."
+  },
+  "numberOfTests" : 232,
+  "header" : [],
+  "testGroups" : [
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d50203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d50203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAorRRoH0KpfluRVZxUTVQ\nUUqKW0YuvvcXCU+h/ugiJOY3+XRtP3yv0xh42AMltu9aFwD2WQO0aUKeidbqyIRQ\nl7WrOTGJ25JRLtincRoSU/rNIPecFegkfz0+QuRuSMmOJUov6XZTE6A+/48X4aAp\nOXofomqNzib0kO2BKZYV2YFMItphBCjgnH2WWFlCZvXAIdD87KCNlFoSvoLeTR7O\na0wDFFtdNJXU7VQR64eNrwX9evw+Ca2g8RJkIvWQl1oZaYFvSGmLy7obTZyuedRg\n2Pn4Xnl1AF2bwixOWsD3waRdElaaYoB9O5oC5aUw53MGb0U9H1tMLpz3ggKD90K5\n1QIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "n" : "0a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d5",
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "840f5dac53106dd1f9c57219224cf51289290c42f20466875ba8e830ac5690e541536fcc8ab03b731f82bf66d83f194e7e180b3963ec7a2f3f7904a7ce49aed47da4d4b79421eaf937d301b3e696169297b797c32c076a12be4de0b58e003c5123051a84a10c62f8dac2f42a8640008eb3c7cccd6760ff5b51b689763922582845f048fb8150e5a7a6ca2eccc7bdc85349ad5b26c52137a79fa3fe5c29ab5cd7615013219c1941b6708e9c3c23feff5febaf0c8ebca5750b54e3e6e99a3e876b396f27860b7f3ec4e9191703c6332d944f6f69751167680c79c4f6b57f1cc8755d24b6ec158ccdbacdb23107a33cb6b332516c13274d1f9dccc21dced869e486",
+          "padding" : "3031300d060960864801650304020105000420e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "8a1b220cb2ab415dc760eb7f5bb10335a3cca269d7dbbf7d0962ba79f9cf7b43a5fc09c99a1584f07403473d6c189a836897a5b6f8ea9fa22d601e6ba5f7411fe27c638b81b1a22363583a80fce8c7df3e40fb51bd0e60d0a6653f79f3bcb7ec3e9dc14cfb5b31ab1735bca692d50ac03f979dda92747c6430f8045efa3513ba6e0ce3e9e35570e1c30c8ebe589b44192e1344ca83dfa576fc6fdc7bf1cd7cee875b001c8c02ce8d602769e4bd9d241c4857182a0089a8b67644e73eef105c550efa47a40874289395ac0c4e02fd4ba98e130a4c2d1b95521c6af4a002ac3bdc6e52122ae4c08cc3da1c896e059acbddec574ac0432f6103dd97273d8803c102",
+          "padding" : "3031300d060960864801650304020105000420de47c9b27eb8d300dbb5f2c353e632c393262cf06340c4fa7f1b40c4cbd36f90",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "264491e844c119f14e425c03282139a558dcdaeb82a4628173cd407fd319f9076eaebc0dd87a1c22e4d17839096886d58a9d5b7f7aeb63efec56c45ac7bead4203b6886e1faa90e028ec0ae094d46bf3f97efdd19045cfbc25a1abda2432639f9876405c0d68f8edbf047c12a454f7681d5d5a2b54bd3723d193dbad4338baad753264006e2d08931c4b8bb79aa1c9cad10eb6605f87c5831f6e2b08e002f9c6f21141f5841d92727dd3e1d99c36bc560da3c9067df99fcaf818941f72588be33032bad22caf6704223bb114d575b6d02d9d222b580005d930e8f40cce9f672eebb634a20177d84351627964b83f2053d736a84ab1a005f63bd5ba943de6205c",
+          "padding" : "3031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "1758eb94588e6fc4f50c1be1afcaa41027869f304cad513b1fb12c2f446d63cdc05c4830a7e3e630da7b2da4f7867cc173bf6420f9732277282596de41ded32e21d0cc31441174da8765f57419c7764ea758f55bc17646eb100c435d1ac0eed6fc7ba6de5f832094ee2f479979765e05ac9976788db3c241a9e32a0da864f0019a87646ba623d63f4411af5dee1be9ec488c7e3e1b231479de70b9ac5f78a17b1f4120aece45f26c07e7bb345fdfeb05e14bcaacc614672a465fc523624cb19f66f9c6c3f642b832ca44cb25176d679f0e05606c3fed022cac24c2bf960a406d48818e3eb7ed53b0446032469047dfed95fc18088c92d91d93722c47f88163a8",
+          "padding" : "3031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "513a5abde16b5e0ecb8659d3ca0845800adf75cfc4437d42fa34e7aafbbe35fc5984d3560cba938f9a622e932bb6162b7fbb6cd8c1cf8815f28c495995ac18cdbe8fabfdce29c17aa021df192ac02d080d7c5eda6bd4c99154178a9d5e1cf3ff4177106315f4e6d74c991b601069acd60b55b3bb4dbf6316c35096a487d6756181d3394944f1c742a2f4d608ce4f6abbfb72347ad7d342ae15dd6d1049fbd0ff55f4d7c43ab805f81ff1fbe9256b5c78c2de6beb787f4b6d66d290a3d4c4857368aea5f7ebaa1296020c8f9e3670441a08038bb810e853a654e44316a4e52428745123ce2714020d00e55a9eb82f7fb41c73d852a82b003670246c6ca2045fc8",
+          "padding" : "3031300d0609608648016503040201050004202f77668a9dfbf8d5848b9eeb4a7145ca94c6ed9236e4a773f6dcafa5132b2f91",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "38c042a00d6f27742a46f1f963a7b2e04f0eac637849631a491b8e4e58fc721c6ce620d5e705dc8e73409c3909c1c68b6bdb2b30f882cf2797e65030b38c4e7daf6fef9d1f115c890086cf54ca3e7c2b21dcbfd1250ed1d925810970f17dbf482d1784f296adee9ace6979075c1e12f5580cfb322e8737db9d127d38e1b99ed87ec49448a18a6fee650d3c27e4a2a86a3d6e3ce4fe64120be60872fa07a3f78a112715c167fb6c900698ba1afd824087a4cf733335c4a6d5120e3b29bc42f3b3d5db79973e4e321e0910a288d18cdba172d060283c4f4c6656e9175a18b756b7d06251e9060bbfcab04978853eec6032850a0e757bc0c61ad38aa4eb6bb6d907",
+          "padding" : "3031300d060960864801650304020105000420ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "2ae8d95b19cbd64d0e343ff413fffb85d8e6713c06ac8a1ceba7f3924fa740f8d2b3e120fd71f22711e795cd6468c5e263b1a5ba6ac6b8fa9e23d2d6e7243f510592a61d134e68b8ead00612dbf38c5b7302abc3bf33f23e6d4816a6e3ddcea6482566e84f57464f7d56de4cef0b2256ef21874dda4c131a47292ff8ef853f93804483c8e6373d39ca3a22552e75427b812b861de6a310ff4c366f6f6604116efd9770170aa423554c4ebbd2b5c0698950e66bb5b7c5c346285d9f5c35146255736b6e818e8e77983c93b21e7f60b04a7a525598e7fd8049b181000bffc7f3753a504370f6bb70617ac8e914deb05a198a5758a459c9fcd2fce1aede48e8a852",
+          "padding" : "3031300d0609608648016503040201050004209432c1a7d343fcfacb164bdc44ff71c1281c004886b1c428419088d06cd3561a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "Legacy:missing NULL",
+          "msg" : "313233343030",
+          "sig" : "095dad1fd82bcd36652a381b7f4dd656bd89b40aa58b56da4f6aa8247874b935e65d2b86752d537df7103884d39dd9ad3d65f87404526b09094c5615c6249979b0dc58d2199ae8696a5b76b4bb03eaf08c2ab6aec686c6b1b289c9b44f648bd30cb1ac6a64a73d68e59cd05e7aa1b780f4bfd7b83dfe3b884ec11821a93dc5bbb47a00eea4557b6b96b5656276001f1f295ddbbbc511a99b9a665b9c2674c8af0d812286d0be3ce74817ba2cad283757de35dfb149f2835f60cb03ff155524a57f78b148feceb84cd20b0ae22e3e48f433fbd9bfd60be8afec93165ee0310be961d3695f309d031320c830aa6ba08b5a51d943797097c57630be391bd23736cc",
+          "padding" : "302f300b06096086480165030402010420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingNull"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "8a0e82d4f334aca72a718b6f8f643f69c6048d619d5eba71263a5d2d3ac7a7af133b780c7595ca2c982c006e861948f543cd0210c758691f9626842c25de2843ea314ca8eff285d47e0cffa54180af416004017034962a80a5959c3d3f1bfc154a4824462a93c014f6dfe920824f414a6e30e0e5944d480b99949ec7bf64c4a7461575933b17d7d6b0178b5192392ace3ed8469e8ac1dacae51ad5d3ad73dcb213e056d04596e64d8c0703def3110c7cecc93ba8ac8059f0f3d66b89d8712c62b41d407e4b4a104f4569558b0290c213cad6d0653898b9df8f4a453ab07d13bfb7598d505abbd0c4987e4f1ac66e1a523e113e370ab7cf990f0cc63f50f4f0a4",
+          "padding" : "308131300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "3a380c29ce2f304f33a08aed4bd92cc6e8cf56596928fbde6b640cfdbe1dca564cb01421789c7fbb49856bbafb34da6e1c8351fb12f79a4614c33e50197939e237e0b987efdbc042bdd09073f02624c520f1e9524ec1cd10e917b9237166e3689afb710e6c4ef644e08ce866da6dc8849e0b2b4c6615b0aa803bf112e9a4883c8e60660935c43fbae9d939fdce49af603dceea05246b220a5cf99044f0c09dc98f3640eb23fa218d1421adea7898563144085f2c2d1c113e7046f80ff359b2f65742c58551ad62eb6dc6e7465553f7080fe100fcf1aad89fb079bfed32c8c4c15c84d2193de22385df91e9825717feb5209f1dbb47962df24f3b43c114417ae2",
+          "padding" : "303230810d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "24faf2f1b73eeca67814b066b8099b41a973b1c55f319d5e3f7a9943efb958e8f5a7ad9c9a7dfd64e2be0231d341a822a8ce31cf3e008e65e9e7ff7d7076c3ec62632a4c5cc4bc867c54c9789cb248bcd5afd0f8a2fa8b1884f630a0663758a6d472e4e7a085fdcdddcb1917630dc5e19857569208108123c0e87089f2f247b6dcd5940bc35c25dc10718649effbb56048bc03991851b0d50cb82eba64e6726c41567b5c708a8311c22e477a4614a2bb476e5fdb8cd7f14f461118bec1b6defc26a56df14ec3f64707d3d462378f6de72499639c01b6a745402fa46fb09578f52ac50f9db82c83e3041745300029b665701c595476e3e8651f86e1ffa6e0a045",
+          "padding" : "3032300e06810960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "78695d7dc94b3ad16254631482570bc97bbe1e5601c5d437660c9ffbf3d7864321e0a5fa4ea6136084ea004e71bd0ce76432f9b68e3c5e8995bc6e33bde9a93bdabdc6bfe5f8ffa30f22d4a13d453e26f975a7ef6fa21acf7903818df3a008b818e829d00e93f0fbde717f7c9de12e65581cd430993ac5d8ac840d5ab0dfed1834913c66e2689364e30f595c673a3c6c8191e80118e8cb2b36b1b613cbdb40d89444694b2609694ad877df3e42173b8f07f8d0089c34d8d6a539ae508105ee91a3d0cef2208ca74c57b57ac193412a713ad9ddfd10f63a6a9adcafb8c3eaffab0d0aa38fae362de560665022ac755fcea073aa905be19177debd5b00e9434f20",
+          "padding" : "3032300e06096086480165030402010581000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "9b35b207ca21297aac4b6b7d64614d610e43af5d21cf3c024aebdda0947fab0be7c397491eeef644cc31c73b7a51bdec1dfa4b6c34f831ce7044a1ba0ab50882886393c5b714fd3efc762d6d1c9cd51b8972171d998ab884658a8887607ac9b57f730238849806920f2a5da51f1b4247ad8ccb4f6cfd44ce76b9a8ebc57a3593574f8640d553c74a3fb4d36fab9d6cff6241f6d9c48488799b384fe3d8a3b88ec0aca5f8978b2194e7d9ea6d6a0cfd5b4601bedc90cb63b4ce02e03b736bd5249fef55a5259d0001d4a78ec392e3889a6863fc0c9acf9cc2761739e75ba7f940e424992aa9e63609df63a6c2cdc5a15e02e11dc4248d940275bca51142c6602c",
+          "padding" : "3032300d06096086480165030402010500048120bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "8d9c25235cdcdcc7ca2558c0be14f83afeb303f00c13106ac5affc952af527a0585cf4801104a7d019fa2e63fd0b923c061a24b8be7c3105443c8eedf4a033d3de802adfd80f872d3c505f41e3feb116f5d5f31f04df3e448bc7e7cbc2343f7dd4f4c3d2670ed3d3c66f91d626bb12a2001160a123d03b77d2a6ec53445db517147171e3ba3cd7dde902c486c74e8d8d33d4f7699791179d1df4fac78cda67da9138c18f2cc8863018e1739fb309408c62051b715096512602c5c4c7e7c394282593ec087832fd48b4f353d8046600e4152c2092632a79bf05497a13840e171047d79c23a76896235e9d5f0f56a78d3fe472fded2899e228f714690b40b66ee7",
+          "padding" : "30820031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "884b4b6838fb629fe42914cf15257111b502385d71dae543d03597a46cb10a6122f6d539ab411161ee278f16cd3b5f4bb7dfea0f907256d96cbdad1f1fb40093e9f5c97880814d86091bfa080bfaa5a955af9d15e9460610d4c859332c5beafc24fc9e02848e951eee2797246bef20dfb89e8e949ed52af39663f5f088690f1a24abf8a8e221582282127344bf740308d146d6d16b127d1639071037fdcfd630342ac134ec24791cb8905b77dccf45eb3ed7e9b2e72e60b5e19367fbb5d1c41853d79965530b3181e4cc7c24b198a61bcc2e63806cb6b3c76757737e35066b7f1bf0dd709216fcdab4f35d550b31ccfbda9eb8165aa78ba4b4e66e316ee07282",
+          "padding" : "30333082000d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "73cb10d068ce0168ddabc2dc7ccaef8026edd5517c0de9b4c8becf660ba62c3df0fc47710a9628ea478cc75adcae248bdcd3c555cebbc4f1d99ec1f6c0674e092548e20c747f84959cbd0a5589b8db3e464889d537c6977f13668fd02ceebad3d74d7ade6deb16c6c8c5d30fb0778c3db5d7cc9df986596a0768a0d30c199fb8ffe5511d99c8592679febb5f8851a388f291e194fcd19b9423ad4b47f492dd720b9f38c3b0b20bcb816d463ab9680bfde66132a54a8675be19944a5e648e0bf942427f404d9f810f2a9d4626df659f54b6a5d3a6878e113c48b733066b3a83f5b26ac75f20dfbb8efc1ffbdc2cb6b9f198545f95ca0c3f54dec2f8307fb1b6dd",
+          "padding" : "3033300f0682000960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "320d404e25a77d4ed6108433e85c9e8212b3614796c96105421acce95b48abd9683e00fbd57333b4483cda1d69d77189e7ca795ddf23355d0a40b67f9c97bf5843487b7550fc0d3577ba3a0cf7c7e083d18902fb4bb231c6ddb7942f512896af12d344a35cc6f1d3a6ceca567a15484ef95580b831e0c4d62bed425deff9175b68da5b6cf8daedcccaad83110b42ad03c5e8d4bceeb8e1ce2a9b15c2a61f0ec65248698b691a86d61eb593a359366254b8259b396f5ca3aaff4d0d3d1341afc019e6f7a2d43fff46a48aab2f33721d906299305dd97a9aca7aefa772f153371831653b607725fbe60c952bb04f3b02194fd0f0790b6560ee5a8f55ad1e8779b7",
+          "padding" : "3033300f0609608648016503040201058200000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "15e12377d3c5d50865371a69fd5e9f41ba3eb5ab2f9882aaa1729198dbf16299572898e6897b615d7c70d57719591184170321df750358f6b6ab9e7aa5a2e150a77fc4532b6d23fadbc1bb810c8498ee5ed2f8708faac2c80eb704ea65244f731e85e82aeee3c195eb01de1dda86bd80634b586118c1f2c144809f527a4b522d20b241c8e50d679506e7ce8f016cbbb8dcb57fe6cdffb860f0afb090b5007f81c61c87dac85fc0136477823da4011dd65bcd6eb67977091197ef02a1670993113199392b8d8173c971a03de1e1e15872188ab951e21da015a17959527be12fed5fe4cc3019741ede5706c472fc7befce0d9dae71083d61eec4679f3bbf222d75",
+          "padding" : "3033300d0609608648016503040201050004820020bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "9947c137ebf7013ea9e41f1ce93fd29022e340e6ade56c1119cd826430acf9833bbc1ed05c1899757a79d3104c9b4133ff0aef7e1cbeaafc2ada2422bdf9e29926626527f947124d5549d9f4fddb809f84923aa335d331c392a5ae5e29cb0f503e230ce7bff114206d5dfd51b812f9ed5448d9100125a8cc2324e560c69f4a492988045c97ab90a2806df900c3b95ab95bd634dd0a50edc5312eeef6463bc4b62e54261cc67e9cb9caa9a0a7550183c9e03f26bd5c8718dd77f54290b3a27a054d7d3e39e8cb45529d585ac0e507b8688219d2b8032268020b68d2284f9f743debab5cd47fb3fbd77fdfe3a9d7984b11a37cce190ac89a472578a3332b150f5d",
+          "padding" : "3032300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "259cc7e43882850415f4d7f2321fde08212490f6e9929c37c6a60cf686eec1dee385fc513f5e4105f19f2d63565b2d3762080634306b4ca87f857912bc062f31de6cccae9b48213c1b661ec9874d426d74e4c23c0ca53abc8f7bfdfb9d32dc6b5559f6aec33a5b9445ec4490302af6893890f57969de00287203d8df9a511b678caee2a7d666d9fca912826216ae3c62a37f12dac1412100c966ec7c8ff347eb79566784ef86943e999d0d1aa46fc9e5b90e9b91f4d16bfc2d5b9ffd4515f1d23cd0ce9612d19c28079702e1bc96b98cd86a5708b9000a5d61777a92d7d033557492f9ab1a4aee6719dbb14e6c3b4998480a8d49013898a5418bc8c63c41c5f1",
+          "padding" : "3030300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "8965489287b5c6732e9269f3ea349830169f9ab644076423519bd18d744e9547dfa82d9bba9a8cf4e1ff5bcd79ce2c4168a8b6b1c7931bf4eff64dd18a1728715274a735b9f529a2fe7b02cdc2a8740c2f16bed7e0ef2ef003089a30937f04c2d0617f70db8d67ae9f6200b8279200a21a7862b7cdb406d4855d8fc950a10d5430424e4872714cbe07ea03f36689f756ae0bc09b08cf1f3343cac1e1ae6f943b5d0b2a3df116b0bbf2d433a8c03fe27c6cf2de2c0603b2fbe174a6a4d0009248c0a04ee4b6f393195955ba0818d5e3abea276d9eac469b5eccf6b37d42e38d840513d7130009bb93fc3d208b89429d053ec1fb5b635e6240b3f0021c7a243640",
+          "padding" : "3031300e060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "2503d3586cf23777bcf02ac28f32daa1664ffd2e2bc3c34377d80718cd02195de3de6d10cbb057db69ca2bac07881497189bcd66b181972aa8def94a879dfcc1175aca14781a2abb39cd71569b721e69e9d9504b4ed54a58a4d8baa5f17bcaa8ca9524ed86cde37a86139bd62502afa770f4eef4293a0ba157968e42e77dd690a3920311d24013522295cb726e006a2e7f26dc287fd2754087f784151ac30188937c99cb20ae8d26db527d5dd3020742e8964f518bf13bf2cd36d99eacb1c81a6a9a46155894153d3c1a98e7671233febbf4f30bfad312e0dc4a9520a97098c634966c204aeffe7e55543a436ed003ce0772d9f57c8b0d3164ddb785639314a4",
+          "padding" : "3031300c060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3aa737bfa89b66e9ce0508aa68da6c9760d5de6c50e1dc472073d4f5f280794b8e5f2ed5446cd73bbfe29d54c7f7f5ba69880158809b447a39e0363a59f46f83ade8032c7dfd090784c582141a5e4a9114082a2d91538bf55d7370525f31c0209342d78d327c53e21a64d9c81330003dc63b84d1ff3dc7a63528153e3d3028b66ec2c58182fa818d3c333f69b6dc9935cb670fdeeb226bfec9f3f7d04f5aad6947444e72dff3c46858ff89ab9a642b697f8c37fc6d58abd30d7e07061cbd366a566c22784e84d836a8b4d550a0617c4ea1ae7af61e2c78c9c67bb50c0982098faa9e14bbe0bd007e81c6c556bb3ac19b05057d7b4efc0d3d4238943ed1a552b3",
+          "padding" : "3031300d060a60864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "1be82c7d86945e9d8bbbcbbf58216b20f2b44f68af6be2b538c52b0fa7809345aa227017a0854d462b74e287b20783cfd871fd85496dc39e8258b22e6befcefec67c69432ec269af2b4b348ec85ccc03a64523f038bf3dcd2de8cf6b6c6343b374419802d055902569d9188c9f7f795aa2ad22c8551392fedb3c5dadeeed4c1ea0ccf9ad237dbd73fc590f0920ba1ce11a130304bb3c4b923484a4922cdb87c032b16ba940885569e4a8a81fedf839f86e0d264e5c773b2530cfef13614de349779c08b9c18ca8e53348b62d9324c13e7222a99ef4b085cd8bb91d90b37e7bc6a5014a4906d7c3e5c59b56df9322a06434142bec6b066759658aa822c86bb5af",
+          "padding" : "3031300d060860864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3501fae15b0d575cbae58228a1debcbb44575dbfe77fe1aa9dbb45ffeb821031933ca8f2b0e38900b84c86b4825bd587b28b94f27cf83cc8f36ce1e4f565124b2fc3426de04b3951800e54276ec31534a987536ef0e3d081dded8252bec64b432958df9ae045b29c1a85b9d4207fe4941356149dd0ced33fc5de142458a856151fc246c6626e9f1e00c326a00959f9080f5dbdb7e82fa79e100b03b6fe42e2d5c03cbb07b8d0ef8db22d323d9e8acdfc1dc30c765f7db9c9a14d9f41c451c3e037db9468148d8564b63fab33d5637183db20d27cb6a231491d6ac08d70d9a82e6e8ab04da8bc60659a3f9e31f793c2f0f090b6811f1dd634da057b3c4aea5e84",
+          "padding" : "3031300d060960864801650304020105010420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "1365fd05a76a548057742f631e0d957c020f670c74a339c4fe0d78aab13b4a960953201e12d75a8b221c0f30be8a9364f8925c6e1d8717222946f7410014b85eecd0ce632147798eaab5ffbc43df3db7207ad776bfba6d5d356307f9c8c17bacf6aed2a35979dd304e5400541e999aebeb35049c695fb5f6ea15b2f5a5734e14a90ba5126b34b296c5981e13f23fe560ca11bfd934082fe3223e381b24fa17677ff85da1709135e150af32c42415eb954746c0183ec648b7aa2f25ed94bf92afbc3398869f6fcfeca70977a6c6f2505b350e8a647affcb203dd836c80f178007dfc3b4e4ca6d50ada50dc73d3971cb055496f7af889ddb31d73f71501f4309a1",
+          "padding" : "3031300d060960864801650304020105000421bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "1fc4b5129a8b50e734dc531aa0b503c61fae5ae5202aaaddcee197270ec30d8d8e9e06ea5a4b83d113cb430a5b275d8273314c094fbee06047f8d9a090baf8f3f57c52247516b1ac84c1674a4788952dbcffc8c4b50bc3ed0ea16f95887cbe8121fce8c425fb0409494d5a511bcdf9a25fb4590dab75c2ebbaca4f66f6c11229f9367c9ede1214e726c8e3df12c764fd5b3b41121fbf240e92873739dfabdee2a634b142810b04d024b48a8f105682b5999bcec61bbb6fbed1d947922ae808cbc5b7c96eac9a7a94a184ddbf789a816202a19ad9c5a16d10a05e86a870eada53fad5d5cda3ece11b304c2da1c6ba743322ed24417803b1959f2a12c92b9939fd",
+          "padding" : "3031300d06096086480165030402010500041fbb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "129990973396b70468d380897ccbe6930a485460bfc199c7c8efeedf81c7fc6a98f47c0afc29546c92d3ac2d93d8b1c6909642757fa52de1375867a197dac0ee58c5b62f12182a5b4e703ca981ad344411e2dc3aa6c456dc69651cde35bfe136ca323753137b4a28571eccf8d1f0cc4cb4977238dc33827f1bf670d938f5b902e6389c10b564608b396feb0cdca57f5bc3ad6bbb2cd324d531b0c5538de37482a09ce103ef6399cdfb404021c836151c81adf6f852f9a96919e4e78ce76aec77a48bc5eb224a3fc404373e28f07a1488ce2fb3181075b852a87941bd11735b3cd6f5bc0b660031fbf7671d3bb4f8c9f653b8c36e89320f7532ac0fab23dfadb0",
+          "padding" : "30850100000031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "2a004204ec4ec1515b855f1dd802299780835fbf7430f8f5861a4c6d86adaf38159858810d8645a3076fad16d6daac69b942890d6cadfbd12affcc3d3fad8f07e90c2b1e5aecfd9716ac9a12349e4a4b29eedd9bf59d875cbf028bc9a1a0cb4f5ea77b7ad026f09a208d3d39477a1ab59329cb64e9edb6e7e552b8875a73490551df742ab300f254b7805b4a9ad72b650ca944289a9c7c5223d760baad3dea1fc36d2b5961684840939fab0ffaf7fbb7e181ce3b92d9f7eb833235d97431b76891ef910827d110ca9fc88f7e4f98e84d00a98a1b5c6c70d86d89f56bb4f33cc88936db2b7f8127d11cf94d91f56a07aa7880f6a7c3c25b0df691d8657c330a5e",
+          "padding" : "30363085010000000d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "1730655b946726d5db32d09c48c6b06937597b5766f4bea6d2a851faa90d83877887f3250ab9b8b4fef104a2fc0c22d603b28023087536c11da54fca390f4a3bd038e63ad1abf12c5bccf7f80519e941862dd673624ab04390a68fae6e1fc5874ca2dff234172cacf54c565fb999598b372523f4e3730acf43e3a747bc067215bb4f235133a7bc20a9dcf3916d619bfbf6abf0d565bb3e922fa93116725017bb7055e75b455de9b10f00716f448410f6ee84a5612d2646809050eb8b27bb8707b6026c168958b068c5406384e031768defd754d94bc497079982012edf7f966fa81a954e9c9be118001977773def1f29aed719e51e73fa618fb9d61fcbc4b34f",
+          "padding" : "303630120685010000000960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "989c7cce6a8018a5a2b05310bccc3dc0aa8f58fb3752111eaac000a2daed122d44293203ea9eea41eab79d0cae1bfb526a131e8a8bd021e5b98907de2b066a33165c30c7705c7cc684c21fac98d03e3c5e9dffb78d87fd57018cbca50e4cf1bd44e1799c03b0b44bb7a9971c314f2fcb1345269d27dc0375ef89d1062f1ab8220fe57ccf46a04e32b815f2c10a4045fd3b814113c679106f70d9ba9c746be24354e99b54e3dc1aafe2e9d83a668aa440194be87e914eb986c3d21447516efa0051f6a30d89acf520d697776b9b854d49230c6a221c5f67b3d66793b97741200b9f73d9ea7558df17e44de5480d99a4399e72a380c30b314d8b504fe160427df5",
+          "padding" : "303630120609608648016503040201058501000000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "5c0038ea42c3adc50e88f90780e9b0dab64b67c5507f5de0119c0fd2bc7d7a66d6baf1a47c7994fd39e33bd77b31d85db7f7eb1c3e5a5513a507b8c531be20303987382515d84a403ea3f9f3ed7c1b2fb5e5ca7d94458a7fd6fa6a522e92717510a167dd0cd2d27cccae6f29b3dcbd189448834e3ef5c029f6753826ed166f4148269fbb1785bb52a00ca635485c10abc64dcbe1fd7fc39dc9e6499bc72cc0099d6d2c8abdec7beeec586667af53683412ec0491534af62431d650752aa7da5cea0ceb298e24a5166f9df4cd1a05762dca43c5a2ee4687cd230b35d50d811d6cf33c8cfd49f222d5ce2ff0403f95c21f9e6d6d3c38eff74b35a392bbc50f0ea0",
+          "padding" : "3036300d0609608648016503040201050004850100000020bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "002faa1b204fd30ee0d3d6d79274f3b498f736bf6e6b34c0ec6eb418b7a4c105c1a75669c092f52fb1d39b2247a8d5692aaa44d4a4d70b8f9e636dfef370db9315fc1b35434af3ca21afd366c3295424bc1230a898186105a07788b92bd42c56d5b66a336fca64fbe58a843f391fcb58588466e0ba484502aa26c50ae35585eb95fe0ebf248b7a57782373cbac21a00928a091455347127910eb0b9ac35c1bac4a99eee0b718550ad282b4210eabe0602823209902b2bfac9283baac38940800515877366117a2d383e8f0cd09de7c946cff1eada4f1f97c44cbb3bf3562ce21af7f499af8ff40e13b907e5f4d1696dd52e3726570228095b89d4ed958e618a4",
+          "padding" : "3089010000000000000031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "6d8de4a2cc01e33812da2d364cf3cb4fea7c6f37b4314c123eccbb2e4e9ec5d593934c60dadd5fef2a273d01447519573f701d398cfbb72b0c19937e9f7805fc4d354e292c5d0fc18bb872f6843a9211802f5980538ec6b100e3b2b744693a9b8d07654d2655414550a1645f047c865291ea8043137758a13dfb1652ef7dd42182603ba597eace857f39a0b7ea0c9a987326f55358910cb51e4141653e9f3c3d73f09686463433520ef0786163efc39bba3c62cd5c3599678a28b90470bb6f19fa1a56cf60e8c3465f8d7082728c20730227a2a3d2a6a4cc50fe0217f35a45459809de1f921ac5b6aa833a85bda15e288abe640829bc4a0af1aa9b3692a414a0",
+          "padding" : "303a308901000000000000000d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "264fa8d38bb793a078fe9d9f39a484a8d42f4aae23c9486e2d987c7fd18a3e38111c78d4e90a4b0152ef18bcddfc346b901e3029b11ad5c95f92f0c53b62cc7b1f8e489392b323b81f5502e69920e7bddcfd212e32233f569d42ac9c511779de6618ec5411a95475126455e9d3d83d35620eab93f18f7b9080be87298079c5aa2e31f612727d979c7571b7736a8cccf6f3f053cd9e25ec502c8d61ee4a2ac94a879452c4a9aa88c094f73dfe3dc31a5fa3d2802fe2400ee8885f5527100fc82222d4470c979eea045db6e068e9a1b09591754eade5dd48f401da26c44dcdc13ed482b2202b10212d99378cb0f848d19f67e3f3d5351c5698c72f38b2d7f71c0e",
+          "padding" : "303a3016068901000000000000000960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "98ebc21ca822ccf9c7e82166aef286277d2335a8f68d48c1f4cee180bd6003a89e6137885113c2af09e805020ef5c0e13f913d6add5316396654325d04b40c268c3eaf3a0cfcbc5963e5d7e14e8bbe95a8b15f9dc0244b202537cbc561c91e22e933f4ffc96499e6a3b0b33a33d9329f8178f35f5b1a15940f34ff47aa1a6381d8216343cd40a02b4472b5a4ab2f3116803740b947258ec85e3404c375d97ce73e00f9fbace9a53844b8ae669b9743e8f7bf59b3623c0fa1d7c60fbeabe35ad5796a9d8a6d32eaba6c045a6aa2530b6cf1cc045326db85b4f2f567a8a38f58c8d978f3f2fff2098eb6dae5ad4bde60d9d3913eb23f378ce41ba198ac273778fd",
+          "padding" : "303a3016060960864801650304020105890100000000000000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "188571e345ba738adb4d1c4867474faf486c7a4813bb0dbcaf3f051b4fb5205412cabd2f8279930d1038976d5a23e0b064ca804cdd3a5b82b7e8e45c70381386ee84e2b9198206749f79b343677408731853bdeab4b5849abd3e603e612b857e2f63f59ebd66ca977d60e8d66f115394ad06c1c42ca0eafa8f32133ce8737ea606fa17db0f81898de3c3d8f4bbaaf7f6e48aa01424f870a8ecbbc97a6d71f828e91ba3a90c13540c1a3c3c7de2d4708edeb22987574fc9c9be0917cd40b8c75225d71a9b0dc9164d3c194043add6f6cd636a3bf42e0f6dc2f856085ce23e5a9c62f81e120b619551cbeda6e3eb0fbe693b19f2047245281dd6591af89fba425d",
+          "padding" : "303a300d060960864801650304020105000489010000000000000020bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "4c698321f4342f64a87fe6b199d5800af12d39725e449c79706e9af98b51a2d0d724663ab87618b06c49d3c1b98d97db35fbd8746c1d9a61f31ead8893ecc072057ad4004a53009703f66bc2b4fa7fa6826f54e8b873c79bc19ef71fe61a182a8be6cdb6dd35d87d1f46746022f98360f3870f49aceac4bb1a839977af2096539a2d182dfc4bd97af34ea075ba96c39c4a85b3ca83002f97e992c110d40cb6c668eb9fd022a4ef89988095e8c513153f99e37d9cce75a7ffa0a55af6b7d8314de4690934d55895b99cb0882adb346feb8af0480a4fc46251649d6cb2e4358dbadecf27ac713dfda9b8f40cfecb642b39bc1cca681d5628f4fd30e8788635e937",
+          "padding" : "30847fffffff300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "43fe92f5ab6b2583fbba40b493ce45f9eb5f9e0254c6e2547ed4b9543a2c3a927d5b9c1c12525f4f94fcddcc4c586f4e16626ef48fb0688e07eccf77dc65a26c28f374aa4bcca05c72555e7f54d896065f3d44a728bd2ef9c8adfa698b963c16b13c1d5346457beb6a66c964330e0945dafc5bf75f4ff26e84c0a8bbc854c6c877ffad409b11627ba951181939ba9a2e28764de34704a5575f43f70c3f4bc5d74f4d651e25f32fe238f193d4ca55c04463dafcc2bfe50e017fe9d3bd319311bd2d972f5e04d8324a4b26842fd66115ebd139440fe89bdd55d10e14aea5d9e3f6a5c5fac4acada9d9e2006e6a0c36f4b94956493c9a582eab35c69c9add972d40",
+          "padding" : "303530847fffffff060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "8908cf495fae96c593c04e0bc329ed29cb7fc151c8d66546057554b7f59e2da70b164dc6bc26aa19370903eaf5fb60a0c33ba9f8d39cc015a8a5e10e24d9d292227e1a52bd6640b8de82202c2effc973341e0dbf0bf7a47ffe500309699a9787fa74ced281ce129019df96930d66d1f95619abfd5127a85d9e0aa6757e7c8ea29fa339214074580b8181804bd224dd6d4be45c1681158ffac6ebf5399737b5538ead3fbbfa68b9407fe717d255c7e1f3cd02c6c2793095999d0e35493c67766ce320d4bc4c984bd4af0c1a6744357508c2bc23c2eac58b72a181963d7838e8f8d5f979ab3b9c505f177ac3350657cb84c52a4be3976141ca5727190a2f570c08",
+          "padding" : "3035301106847fffffff60864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "94ed6235a870a8ac919051f7204f809e6bc1da3c22eaf7df3f238f7b183a7fac66adc90b51688e3e00764a45990845d542b04181d618c383f632a5f5193e77b48e423c0db3e266c5b87b7f38d95cdeacdaeb29e419619ccea4899cc2d1489e10034560aa52f6b17ff5f650659ccbd403c6e89b2812211894fba188748786b2babaf913a03c432f22da99c44cad95272e6cc16dbc44ac6d0a9afe23946d93299ca8840108dfdf25cb25846a8fa9234bbd92ab5712ae6d7f7f162fc76baabf30e0efeb42cf0a68d8c02dd45a7f4fbbee275dc14a96b6d010823d604f46e09dd1b99939a625f9a419be178bf6244929897d1387928e5013a0c76db37e7c048f60bb",
+          "padding" : "30353011060960864801650304020105847fffffff0420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "6c5623ed04e763ad3bd1f370b1bb67ff8e9029e0c34d81e160c580fe548aed6964d9187a45e8fa87f79dd3d8a94d521f2bb8a52cfc34f76385a924c88e63722a7ca365127c0c56e0125ed29ac2f8c960ddf1c99700a19d42cde3e5e46b96bf319fbeb93c2b54076628e81c2ee998f4257afa27a681e8dbb49fa149acdcce9d55222960d307b2e18b33729a61ecfbb01461e3b159c2c958fa1111ad7b4ea80d8897bfeacaee2afe4b17b9b0c7b19f9c2e394429649aea3eeeab3503fe9966c8f3e6b7f0d5e482d6a07d93dfa1eea617a99e55bba32f957c1472d7605a4ba93669d15365f989be09187a9eb58beb942948b9fc7b658a1c06289bbe0d2e6a1e0084",
+          "padding" : "3035300d0609608648016503040201050004847fffffffbb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "64401a452e3b56bebb1d5f3cdcac3dbb0a6f6e81bf2fe938143b9df7e8f6380687249a0c30a2bc5ba0fdb1e4d0fdecfdfc74064d365fb8dbca0cefeec0ba6fb4f775b4650839f03dc681c1f78d298f6c789ef4734d0a3ceed09ba8850671911e5e68af41ba2f37f3e56f7864fe4775ccc6af928876290ffcd20b988540c0146db97e333da0eadd4772cf15cb494e366f1f3bae740dbc69cd339a5d1f8a5e608cd61eafed4e85886796520ec5ad7240d11f1ce25463b57d0723509fc368f8f81a6c63ed2c61a216629dcdb9fd226215f8b248e2dbab5cd4f62600fbf921f4fb666384333d92251578dbdc5dcecfacc2c4435a211cc984346bf254b7cd52aa2bf5",
+          "padding" : "3084ffffffff300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "8998ed832b496be462a431b1b32c3696374d816bbdd2e348d98795a5ad27b02766aca9b161d8e8c94370fa38c56ab0ea9aeaa0bb37fee33a7bc27024024d321b25504874343cbd50dc31ef1429b16e2ecf53deeef15b4a8e5a447cc3f1b212179ccc5ae4a62e5af2127c02e53e8a23cec5f1863ed53e62f472ea65d599272a5e4c0a0802553f31dd22103b7fb7155fc8ef4a3a7061f78f6e72c265e561436159722da4b8850204a7d85f7d45c18f5ed4e452cb146c47963e38cd29f2dd3652720fd4206bf96ba2c7601895c8771d1b73f03fa88ecf81b8a8f2f290094d85521048ae0c097460cf8340ab32262115b5332abd75950d46ae77ff03cb618dd69e52",
+          "padding" : "30353084ffffffff060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "9175f30fa7863284e06e3a81a23f56b639d0ae37a4f42779c71a6765e6a2e94aaf76fa32e7c29a8d936b9936bd02181c2de75a41a703e99d35ffd4dd3074803e77fddac42fb4ccdb5793b7e6a530297efc326559253d493a8677cebace5ce7b5f5b61c253b4512c3fd58ddc94a5e7c241bb4046ee1b3d955a80d02eacf0b231b3093cc17f18e84ad6d2631d225aff74f66f3e0afb1ed290e8ad10ba44ebb9e3ac198a17044c3abb4e41c4351a7d6d86847f654d3839870a78641aedcded01de60665d8edbbd9d7ff46953d2fcb6127c3e4864a7a64cd4872a2f7074e4ada781e25f18ab3b60d712775b45cac1230e403adcba7af3aad81e532490fda65c5f044",
+          "padding" : "303530110684ffffffff60864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "12c8a3d061fad3c4cc7b6cacb83a8abcee495ff2255464495c9d6a600c6e64a57fa9dcb18cd648ef5133dcab0f1a9c57361e4b2b9b0b996a673615f292601fea09dad776659b014dcf62c35ac063dcfb7186fadcae0b506e7b95c2b8794d771856d0ecf907025675d980746c5dbeeb71482ba4141e50f67dbea79f78b40875a98ec80fe1d7fe2eba043a966543a79317c28a824c3c6b382c0c57068a3036687fa53149788990dacd547723b3f0051f57829b10aa97a15cb4f9fce9617158e77a8399a22629e9d4a708114a1497d0465e3b5a4e1bbbd0096dafdba7b12cb10dbaa54834025043055e5fc6cec45c6ce9c0946e055ef77ed49522892a267ea2c123",
+          "padding" : "3035301106096086480165030402010584ffffffff0420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "27e64c5bc5ad2b95b745e868c21585b53a912249344faa36cc0a963bff4783ee128fa6a8251991c76cedca73b70f7fb27210dc89a93574c2e3a61a8ced2986a1578179c969135656b07502a622fa7c4d208442a8318509f0a736fed1b0dd33dc8a30a5c3249aed7a0aef71ab8858d9f1f9cad06d9802ca9bc125a7fc0354bbb55069d73434b98aa9c7be61fab59fd5c96cd0e64bf704c1b213bed2cfe97e66fc6f6b061cd0a9b01421784c32e71775bed2bb2890c8135c42372f208602ad9c4e3e18ff2cfe24871598803845618308d7956c8314a58eb188e083fed8a11533c933970c2bc313137726273f09e36e827c9e1af36b7ac450e0b544a03eee9a074f",
+          "padding" : "3035300d060960864801650304020105000484ffffffffbb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "09634aaa108980fb190dbaa425d9908a4237a2531c6471ad47dced90ff65e217baa0d9a8b5167d1c07fb414c88214e6caeeb6a1809cbf28f9c6083bd54cb2fea79296ad2dc1e27de2e96c056842ad7694391b40c6b6a6693c64fc1e3dab13185f8c1406ad4d2c39a04c3f6437519489b3d6185d9415d97e9cc405dcafcd488cc4b93a9df5100c1fa8dd31c60575dc64067f2fcd26d1f5c44919a4e28ae00688487c279130d087161137d6fd480111d45b03057bfb7f79ae75362439775f28e84839156b9f1fd1aac698f1b1874ca19964d30a725e92d4ab784b8da18258291f86e0116c9d3d4be6931568c109068ec52af3a26aed5ec136abadab1688f06488a",
+          "padding" : "3085ffffffffff300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "4e63d527dd005236fbe35e838f51ffb09afd2669b684d9bf7488ba49730154be9147a63dd33473ebf547272cb6105b114f72f544e4568d45dc814a3c5250acbcbcab008dcaed3458e02159bf5be9e4b20420f9e4c075d27bb980748528327a1bbbc93f63db57ab03e7fd86c61db3ff8c39bf7d818a26d573fe57f5010718021e45299624e25a2f5acabcb3a1ca608fbde28d13cf74a3f58d283fa5a41e875854cc480c5948d2c0d57f2b857988a28e34a7dc5159c86ae1f970f3e318e9dc9d29641a521eabc66353ff0dbea4f237bce4ae546b8d05f6ad19a4ad8d4cd086b22458b311eb970ca33c484f0b9dc544ed4ddd88e7f70edc32702d66ba570b749428",
+          "padding" : "30363085ffffffffff060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "36f243ff8df76718fcb54fb3ee26a497df468d14cb2e9463797349c85de2fd05ccd1d3c8b969414add075a55c9c4eee7c1b046aa5a9b65c47db59c236ee44b165c38b224379d39b131b63b6df44d6119c947c01eaa14980df1a5e8d7d6e6c5e8306151b16dfd001773331a408b7442dd83a63adb705cdc171d4b43591817a7abec70ac6f85a73db930b651ade05c9d119b63937109ea17aaf72582427e174ce84a1b82b51cba8483d41d06dba51f0355db3e4f48aeeebc3df5942eaecac74ca56a588da107df4be3edd56c4510f12b85760da6676b778024fecaa217cd0f359834cf2fc94985136001d50cc7b38d6f7c7383d3ab58df97a464968aa651d6ddb0",
+          "padding" : "303630120685ffffffffff60864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "789094730a65d2a48085a67c9018839b2187bde7a2898c13b17fe25e509a437c152f9376ad710423e8a08e6c98fc43f9039b630e77cee3629791bfeefe37eb168a46053c80805221fec513e796db2d58f119ab33b6d0a1a62e1fe2824f2d5145de791d651ce86ea84c8740ed423938339d786964139b6e62680c991ab404cfeb166069d8c27a560780722d8b6b9299086904308458b47b9d85ea48fa78f861b396c630b3bdc1111edff7441b37afd526a4066e0a130b0953d51e5c3812dbb054f188440e5d0cc8e134a17e770d5a93d8b1cb500c72ef1f49b7e760828f92ad65050ebe4131ef295c7f8afe19a0d0c5be318353641d02262d557cead9a6052f6f",
+          "padding" : "3036301206096086480165030402010585ffffffffff0420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "6cb9ed3d4ae69ca29c8d865135a86758317510bb3576086999f6985c9f605376f778e9c5f3b80ec6730be4bae0cd4d5d2361a3441ff41118cd4ae3a3bf875c7725f97fcf32805fca3a1e686d408fcb4695db384a179d3c59e3260b17031f971b1c5088ff1849022dedf2d1ba55259c407e57bc01203a2397c7a9ceaa1053a1a75df95ba6a9878e1e40237642c7a4fed84162f4124a1ad45e6f4b98b7e607d730b872467ccd0079d2037e2d4850ac59cddaf4ecc0d2070983f44155eaf26ed4b57308a44d52a36f8093ed35561130e34708c9a3a33285ebf11cef99a4a06fe9318c6bbeb1e770cb71e1645fe343652ec8174aceb462745d4721c8af3e3d2f4b54",
+          "padding" : "3036300d060960864801650304020105000485ffffffffffbb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "467e9fdad9a1f83ffaf7622a156384920eae46b89f63c3fa61c5066786c34108ff73213ffc7ee9102f367726854aebdd9eaed49b32c88517e136778dcdd7e231716bd618261615d029241a77f148c1e5e39777a9f85fc3d4e9320f2455cdfd3280184ae17e35bd9be0a0a0d1c2a2d321a3bc86588fce12d929de1a2f473026e0920b1cb8b6dbadbe3810af22a3e95dabc9553733afa026e0c7847493182aa1f3057a3b227775a3d7ba139c1724b3196f6300ca4ef457c2bb3f09bb2be6fb4e7caee6d4502c962291da0e499213209a28cbf2c4adf5d559e44075631c3035990aceca49bf6161203390509a80bcec1d274f1e9a1bf26c9f59244a695adb2c5fb0",
+          "padding" : "3088ffffffffffffffff300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "063b7dddb7483a77af978f1f09180b98557643574b40522da25e8636d5e5a71888c79ebc5de9ba6ac0e4c30c8dbcc4399661b117e4252d980822cee7cbd4d2aed3a10f91011d11ff92228d02393cadac68030123f52529d76ca2d41546cbfbfd28a43c5d52026ff582a6bcdd10a3dd944fd7232bb950ed162f8827a5625ff322bf98e079dedc770e4d586a7f28b4e19452a353eef2defdf56e0d07dc2fe5625d91651629c5b7bf6e180dd27a1cb51787ff264f0138b46bbbd32c5e1ea63722b4baa8e235f27e283ba6c46f1af28bd744e2db92e326ee7139b9e5370fa5b5e2c2bb79b60c9f9e305a8acaf29340edabf7531d17fffca6f43ff07ef5cccb50eb32",
+          "padding" : "30393088ffffffffffffffff060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "7757a37d09443fcd3836e17cd254d3d03dc705d23f1d656112bf3aba485ee6220c7844912405d41978a94a2be8a16d8afb098b87f2b641e0f9a7d3845b02f10a7d63c2d871cd1d832679209e4a8c66095757b723557a7fcc9a7b6f6f9bc9a167364412905e38a843883fa7b9761e7fa664cd2bfb0a5f0043cf2a6eb7804ea07f79a6ca6633664b3813d8c6e95ab7f376182f315b7c6b043913e19759485d583fa92a4464d76140a9be4305fab54219dfe69590d6841f024bc29d48b39563b6053456dadcb8c7903c7bacbb3a80e3d0a8acfd222758b2647592ca4c4f2bb2a26a04ef15ed65e90c14272d15fb4e0464ed31e0a3203c6242c102f480aac6bcbc6a",
+          "padding" : "303930150688ffffffffffffffff60864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "8b2e3c17fe8adaa8e7c8eaa0e3d98369131c8e9b76f36bc97fc95888c4a0f6ae4bb85fdb2435bc85d6763dd07dd923e29a8eb046512279ff6947b12bb2e2a6b6a3ccd64c7de88ef6b53676b25472997163fd7da09815af219120d6cf58f3a0fb3f408ebedf235e5e0d7bf6231cd87d95cd26c2ed506a0749abf45884c22d795bbee01b01884eedccdc7ec04d6394e4200233b8da3dbf148555e4168123749267f0ace21e1b468ab0d4f99a59ad10bd3bb35f517836d0034e53efa6f4a042434a69d6987b59110cfc99267835d7ebd2ddd0a621116e0fbfeb1b60ae85b9e80bdcc52fa3341f82da73bbb841a0e665b084c6cafaef5bef5de609f4f94005488f68",
+          "padding" : "3039301506096086480165030402010588ffffffffffffffff0420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "58f32013534e2feaf9a78986204ba3912715c4ab8f1e04ad4edff544a3c29d80959a0d5a169af564a4bdd5a9ba3b6e485cb76438c3fceaed89bd7d3aca0096627cf2b6135914c7ace9df9a9c8b5b1c97ba2db844c5e1b73d105fc033571ef8e652e4d95bc8605b28a0cbf92f373e2f31a6fc254c2eb9ad944ea376c150b88bb1887848c290d42314f1c512759d25ef7a79d18c8e5f81318d28f9794f1d6cb30be36bb30c6dcae2cbaf489678f87a008042c02e6eeb067f99ede27043b2b4166d46e1ef02cdd26e9189dc2794bac12334e34e8f93bff071961b52e693f01fd875af73784e8d142a22ec9c477890d47edce8251026aa4e4b001d0d046bda8519eb",
+          "padding" : "3039300d060960864801650304020105000488ffffffffffffffffbb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "5afcf0d327a427f6d51b87aec24789fd7ebaca9c4eebcc307664aa6e92b6acc22b112faa3918ea3ef24552665965842639a532a09b914bcb3b953a0726d5f88eeac1bf65bbdec56d55bbdac534da0f83e182dc8cfd6e9a59095bc82b5f0f5f56a1163f716ce722d80394a712bf0d5d24cc13961079082e4598c8df5510e20febb3d1a778fc5876c65a3e1d3700ea537c8d67f7534780fa8d1cb0ef9c39e439dcb8a4c8b76a723ff8309e3f3cf39e6cdd6e52edca5308aa6be2628608d5206e82251f9f7cd711183f3604d83e1c23ba71041b92d33a695225b1a3f61fc742f969726d79504b224be259e9115f1988bca3c1e2b61541527227c3d629b22a95791a",
+          "padding" : "30ff300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "543ffa8db719767c9eaeacdee487311bd4c1d3b6bca2a07c6a3989eaad5f39042dae40b45a9b5aff326a2994f36f0a2a59ff3d46a3d4abc705d26afa3cd35a35bb662292c6ae3a47cea9b32de37cdadf797cf72c7c62f7c9b61024ad8c7c82f5efa27c8dfac28840677116183f1f0721fa36ccfc13ee5863589b0433b20b6e1c954cca97b3796232a3b0b2b6205382de80db8487bd00b620a4b423acfcaad649a683b915de7caa65a4efa6b0a1249a6d90348171b816deb0cf8c99013ffd84b8ebdc660866b56545de6dc4aa23156cd86c5bf3d5765ab48d8d601f43dc898ea6e05fc0460a28bfa2a776e8917c59f02f1c8e1cc454558658768acfd717718c6b",
+          "padding" : "303130ff060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "1b7e55659dcbd51e3c3de5eb5cc2c4224009489948385cdc8d5e564a49402ae38c1e51f2fa9affe9575b2f768e21565c39b5c0ad107cc1e5e466cc77328b8919321ffefe5431cafcac48bd7d45fb2830a548cb1424e3c94ffbd85e9bc4e6392f56c2b6931a301230b37135e93e460a30026da53bb55e3c6adb68800b694172174615bd2e749e8678023cd7c07fa3021e3bbf75a7ce81ba849efecc3a7d8a0af088a5c437b114bf45be2d10d2280da8a6208049143620134c76933278d54c236065b795b005ffd7be8dcdbbbc7ad822f3ce7a0426dc4eb0194768470b0e7317466899f60c40ee3d49d7902b9c355f6cad7dc26386227c1fe8a264d3b7c0b830e8",
+          "padding" : "3031300d06ff60864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "4706e77141ec16f6936a2bfc200f9c5ec3e147be7e2e6b71790750ec513ca2ff2ac2a84b76fb96ad5f9af0c766af1b7fe8927af940c2487631fef6f7fdbed533df4f5da4f1aeb89c8f8a34c3a6ed7e5e10e28fa1c64f33985ada66a92e9c3b8b5f5366f075b2e9ecc0a41a061712ccbaf2add75254f62e1b66a820924b18239559791dab3dad8f60500fbaa3d76dc754df7a848912aca54e6cf627c5e9f9db9bb22c2cd3ce0fa13838125d88e80b3ae6baf8b65f0530885d307d47f1e3eb4bf6126dd631a4b6de235ab136886ef70d2f483cfc962cdb52e291ca899d108b9980b91eb47087b3132d154c317622077a28a904de3daf415a5634d79625f926fee6",
+          "padding" : "3031300d060960864801650304020105ff0420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "1a6de4aae4ad4de60bf01b8557e47a805fb435ee7e8214b2152bf22655e7f3d6c7e090a79674acdb67126a7c01568f5592ff68d4210104ab92eac884887122b3d489055a55a4d7407862356d192a9d7f15edf8a2eb4ae9ce615c594c0f6918a427e5e27e725b292d2109d94de5afd37d1228ffb293c73ea7ca1c6add14e8f420780d2006109a47d04b70eef26741b846a47387d5fefaecb391063ae1af3e77f493111493bfc5554e164dbc5584f74b3fd833e6d1f3d346d17a3bbc8c171d997d06780d9ba149b688ec575740313181de87f371aac306cdb79b2d256deab35b1806f63aaf2eec73099c937a94ddbf706189ee046fb060d0e586bbb7f951e17861",
+          "padding" : "3031300d0609608648016503040201050004ffbb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "5f912ddc495c20f1975219b0b5cdf0629585a98d5565e8ef2c98fd945cd851d703be32da38e6a376c1269734de5e72734cc685cded8a31d430f526dc3788dc2b54de838ce6514ef970afecb8bcc0b2cfe0c5e8de29d2a6c009813050114374e1db8d7f4cb714ab291a6095b7e2713a28b5dffdbe3ef127307e10155e0386e3af886cbc8e1b9b66086dc9c48d07e460fa4cf66197414a4e1a72f6bf09ca94964d668666ec1daeffc52a3384cb61abe1a4ee0c26674df776c7769fd0c89667a421855de0b060b169eeab02ce0005a1e7d7a126c8583da8a4900f14fbce7ec1b4120994ebebd3e97e0d9465bfb53f2ebef725a10fccd0359a2724a9ca18b2b7f715",
+          "padding" : "3080300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "5dec8ec2a5ccc79cec9d4455a2479f562c049430d572b98e5bd44b83ccf6a08d94cffe4699dd29568dbecddbd28c92c771e37e2ce716ab7455e4a92ad87f9e5b76aa1ef1a08e3a77633bc71b3756e3ac956eb8d5974cb50b88a6f49f36d5d0e84bfc4d379621fde3bdfebfd9cd916e1294c854330218d50aef788aaff97e68f7cdb2e7a12e8350dedad00a0ede2d72fe294effd152ec33f95d66fdc648904c657eaf6fb0c322f5881bdc1f16305c3ef90c3df597a0e75222b82d79f5d6dfd913b2f9620092f418a3e67c48823b85e96b1fe85d306f3653a799811a1ed3dc612461383a6c1eeac737dbd2c6c20fbb56567bf544d199a474bdc38621c8b9bc7920",
+          "padding" : "30313080060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "a2ada8ff1c1821fadf49dfc156293dd59ac8f51367633f73d2200bbb65bd960f7b888d1a843920044ce98528773f3d3df57de92f129c03e1f6d425d39ac83978c7c8ed7cdcc8d47a778350f99f8fde4f6028d5ea77d46091f98f72279c59fb39ff8f73b35ab1c6748970d325c65ff49fdf833e8c2f40621bb770f2dcbdfc34fb22422f0105f5f582c90be73e664c215cc6d89419a8909f0d13f6535182aa567d4e16a2f7ce1e562a6cda4582304a5cef821c538de46c68509f3936166c109da8ef13f2000117644024ee1ec10e8ee4056879c07a6604956e1d03828dae5ae0eb60c322dbc6ff183a57b258c06a2b837021d4df94baab66be636b505a5a5b2697",
+          "padding" : "3031300d068060864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "743209d44a3c907ca08c0b236b9cbabcaf210bf522de862005c977bf7099cb7a38eb9fb15b765a044703c9410082b6a35a7866821f33bc2e2a58ca8bde08b78ff6b3c53e771f8d7fb43503d8060a884ff6012101278564edd6d64fabb6add5f4d4c62707c2ffc45f904acb43ca2ab5609a23daf9cdc58aaaa638f6325a54a5e272b253bd57246d0935bcd19c7aa31f878c474c8298ec567b6a7e165c2e7eedcc80748953c90d20699ab8303062580d4693c058ac761678df6c875bd91d465430afc93cf0bce027ed00a35842ad560d79bb640cf3ea55d8ade362c258fa707397663fec6787d44ec075d857a6fc55c50f8df898da77252d8903220641005177e5",
+          "padding" : "3031300d060960864801650304020105800420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "098464aad869fbb37c36f56d750ba97ba6bbcf96c9e25d92fbd5778fcf214f6a24d1fa276a14b5945320eeb37dc9ce4cfdae21ba57185246052ae26718b549a59a81cf26387356b3d3fe39a45cf303741587e664244233fa2263cfc6f209f796112d61ca5e9f16e362765b0651e8e197920137a3842483772428b1088e7c1a7aec2152b62688c5655410ebc4907680753079706931359e893ac76ebce92a3572c7eb32c58b386d7ab0f3af24acc5047258b5b7c0db4c1ea4a4b64203d65aaf6c879ed89bf046ce5ffb1c647e95630ca485acc9fcd6beb6a5d17bd54fb518cbfa226d9738beb55325f1883ceebed860d54f5db3f1670ca910762d877f78af80d7",
+          "padding" : "3031300d060960864801650304020105000480bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "498209f59a0679a1f926eccf3056da2cba553d7ab3064e7c41ad1d739f038249f02f5ad12ee246073d101bc3cdb563e8b6be61562056422b7e6c16ad53deb12af5de744197753a35859833f41bb59c6597f3980132b7478fd0b95fd27dfad64a20fd5c25312bbd41a85286cd2a83c8df5efa0779158d01b0747ff165b055eb2880ea27095700a295593196d8c5922cf6aa9d7e29b5056db5ded5eb20aeb31b8942e26b15a5188a4934cd7e39cfe379a197f49a204343a493452deebca436ee614f4daf989e355544489f7e69ffa8ccc6a1e81cf0ab33c3e6d7591091485a6a31bda3b33946490057b9a3003d3fd9daf7c4778b43fd46144d945d815f12628ff4",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "4da37914ee4ecf0c0973cc89f9476e2d872eeb2fdb3eddf6fcbcad9b21b8eeff2dde26be6a26d5d5aae6300b4caf4f77f2ab7907af2434026c3369d76268c88b1a4c555c9d54723b17ac48ca1118d94e147a4c63c2c4baefd244235cde4f9c254bce8c8c21b45b7a2fd9d5971b21abad1bef74b9d5583d352ef67483ee611ff3f97198c023cfc56c667c81ef03bda4729b2eff85c24e75aafdaaa4c0f47419d8a63fb2ff72c074ffe985ec7f88bb0e93cfd375c656137722fc6aa45069771c6c66d4b109a5dfd8500331d8d840edf9a5c8024b2520daa56641ead240033b0aa300ff3f951009ac46a97ab9311f8af9467b8ecbde36c9744e44168314f092529d",
+          "padding" : "30220420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "1aff9b9ad34e142421069661c71e35b98108a8f976191b45a97cf12e8ae8ebccd64c0fc6a795f4ed798fa4a2f79746c57a86f894110c1a5402dd72577c2bd9817a9e7a1b0b7e389527428140d53f4918b305e154f7c143011dc27ddb874c52b57758a3f4ee4395108897f0cf7b4fd7136ebf991dd9758bd2cb85cdc6f9d96a40f8e6a0c12970c18325d5742b80ae499da45655f972f33a80373a93572fe302dca03cf7e004690618c5b725e3b9be6e05dfd0ab8f28b8b994ea202875268837d3876681a63e88a410a0bf4a4c41f7336be2799c6e62514a5ee0422cb6d5c57c2e45e9f96d667f8629e0987421f01a9391a3334dc1e8a35425501bef6641f9e6de",
+          "padding" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "7a1eca54a78ee1e92b8c29d667bc89e9ffbb404c5bf13a87a864e99c7d3089c458865a8e3ab714fd76ea4f01edf15e1f80fc9109cdc53184de1443efa533939f498bac27b0f127beb07e4f788ac5d9390da29dc156aa156d342158df68b825732a8d8e852644afd1bf230bf01c15ebced9f710f062b5aba0ba0edb2c1bf9f4fb453d6ba7cc9808d763930b6d8dabe8224db6004aab4a9ed4495fba8ddf371592b05bc057aadeeb3d4b800dc849eefca86f7414b2ca3af53e04b524ec566f646974c17acc6c76e66f7689b9824cf4f98f75de9b3997233cdadc1a79679c47dafcfcc107351f7e64084d67bb986dc2cf693f9e9af2d46c5f8a560b1c7ba2d3a202",
+          "padding" : "3023300420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "0e6eb88e130cf0d79056bdcb87f016f99edd9f35519c44bb509a38cd346d996e3d9b7b21a40fc976a935f2904a6423dc0f251d8a89c4e1424d3312b1e7e0c14f057fa3a45841dcda2bfcf107c2103c0475cbb34d4c769e98b08cbd35964aefc3a8dc4178725c16ed7da6b438107da2488af8fd5cb2c15a8849a531e1a955c40cd6c147956fc3e8a15a1082e9e9a7878efab929c50d52fd6c14cad0987f667221a0c8ab29a682de04e437b20c82e9a759291dabd22fb38e86121b71b3ab473ea0977441db6b137d01b63e328412996ccb8dc27e57c8cd6cbeb31e321160df29ea3151f34ba36846495b6e4bb766f0bcdba00062265ad7d01847e22c06a463dfeb",
+          "padding" : "3033300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "755f090081189878ea1ad03070944d3466c773ffb2632b045ea28655c8527488aca42357718436f6c9222a16ac61ae8d752ea18dcd9f0c5370e76730c31eeb772755e3a763509a9126b64007341c5fa48bf95bbf3e3a9ddc36096625b0f6bb27108dc1c4bfa191d66a403e11df2838fd401215cd2dcfb5806ad0955edc2feda4a19e0d84968a6e1756036bf0aac8990d7b8bdbe45a6c0edd8f55720f105d70be7e42aac114a528f1b3beb81ae796d455beb05b4936ea3b0893e8c2fceb8a6b8e1bb6de37c40e4b3da2a1ebe9a52244a5f4bbd1ee201d218d3a120d6add7171ab56da3062de4952495b602dcfb4404d0c900144bef9d46cbce6d7ef936160342c",
+          "padding" : "3033300f0609608648016503040201050000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "8083dde7cef1b018fab0e9aa58744a665c24dad0791dfa6e8fe3e95b320a94038926f6cbaaf19562fc53f3a69e0aca0d9780af9eb9267f19a081343294356fba81518fdb961574a7ef38625c201036ae954238b889c8eeb3677f7f9df07badd5f27ceb0ccbeaebedc41b977609f8b964f028454b4406e22e0034c3655ab499d01d1b6be0c19bfc9e4ee2e209dc033ba1a66b50ffececa532c2c806cd2ed2586325d5bbc57f42840d8df88636b488ea363bb7f3ec35d65a635befe9d96ce2cb8c4b7b0f90ae3eea677debde8c6b2f63a0bd6b694922ffcdbf8e54864f4a90202eff266678490e53923dc48d70e9fbb756536fe6196553c8492fb5ecbd0a5e66d1",
+          "padding" : "30330000300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "85a965f4cfddb17eb81195bdcb081d307fd7f218de37c6daf043d1be8c9bdfa85b3a7a0951569e670cfcc695365dc45e3b9e44a7d79fdc3b8ba92912a642ecbcea85d56654161b777b280b46be78abf7f0ee220dda1ae3eb4e39fa7ae4d2511d4111b31fe17dfeb897bad9ffb1fb367076ab336b1f48530f7d39f106cba2fb8961e59ed3b060c64f5b2873ee51ae59526e782afd794905923c8753be18ec9cd3791e96eb00433548f2f2da478053c7bc222281e7342a0510224c9f9e53c082a11331f0923c44da8533b56563adb781c76f4bc303ac5754bd6d7448df0e23e41063992ce6abb3d31378be040aa815fcbfb333559fb402124c53f1a5b4e6fab559",
+          "padding" : "3033300f0000060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "51e52edd65ff6f2fb812d2fd4f3f9852eedd745630c9bf12e6f63347c2c80402ab0da654155046e4831ea02fec6dafffe94e6c450a96cf56831a0bf8e48b99456da7e17b9f642e9d6e033153f740095a67c86f5fa4fb37eec9cffacd7dbc368bf07ee00050606748dc887fe0778871ff64953c249244e78ceb4b62efffd2e9cae6803c25504a67fd94941eff1a320b1e0618eb9cc350d8241892adfc42790f24745be12ecdc63f891bb6c0066ee28895c78a9f1773ca527e976eb29abf4f649f83f0fdd7a7f72b7dd3343149b4c1b699588948e5508a58bbc481fbda5115cb5822cb10834cc01989264c79794ba032967271a7d2af9c12a493d1bf3c070b7207",
+          "padding" : "3031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "84a55f8bd78994a9e204bf57292e1c29d663a8963c01225686cd646ff8b23f7ce6be18817bfd284d2649b075fbfe233a2f8cd59ae465af14602108da6bdad31fc97500f791ae1bf4459a4b3be350362b46f84697742c6fb6671533cbe73dd15304e7c569c673c799227a6523a54eaa4e4abba2e451c3f75cff2ffa6cbd9b04cf4a73a35e6bbccb4445a99a1380fbfc2cdd5fda03bde573b4bb88a205fbb38344648ab03829f4e3687117ef7c12522ade2ef736b24633ddefd0ce6da208e860ca6f3a79492bf4db6b466500371e40de78d5d2708c2a97999239e38852de7a02981203c8402274cb1aa24fdb3e2cd27a4305b15797a498145848e74d5dedab41f8",
+          "padding" : "3033300d0609608648016503040201050000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "19ba81c3e688c41625d6714da91efb9bfc95a634409325f1cfab3dba44b807fe063740fae7604a839efce051d254af50efe044bec96280a831ae8e4e93a0d0611e0a43de6aeafeb3eebbe0d6ec74e84fdfbae3ac8cadf657fa342921274be801d05e553f589e8f48d2af38b79404d965e0a4def7c0975d6d9b5351ea82451b6bc26db3fc64729325b059f45089c90f5c8792933487d4c5317b62a02b9367a99e8d5c4148faa1781ae21200f1c39be49353d0976502ff19e08f374ee685d58f14dacf613fbb3a56ae3f1bff1afc060ba36aac11e2d038272c01c430bd463fcf55b311024cd7ce10bf59c32ba3d9943f75f8f76870bf0a8dc3e786e0718df3c01b",
+          "padding" : "3033300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "2f84141b773914947f72db6981d6d0815aa77fa8ffb0444c13b7612d6d89038b02eb60a7641dec20079d6d87961502330f228b936aba65ff8c59a651656bc3ad7a3131e55312d334da0f600f3538f3b65ed61a5d298e32f74453385d09ae45eb93a4d35ed2dd7a7497085d5d3a36e65f1a0bd8683480397dad3b304e49cee02201a9a1ca5b778e91e68ea35ff72827f968426465845698ac0999f7311e5c532438e8fb494d8d92efb520293c503cedac0036fb42907e78377f897bd7b94328f6a1a594ea2ce3770a49bff8702e534798e1eff6324310c6ecc71e5363a0b23f5604a2aa245808b72c9f6eee364bcbb22e8f144460c5300d3f89f3b8b6fd26c15f",
+          "padding" : "3033300f0609608648016503040201050005000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "5e97f3122d202fc0c7688f28a0eba5f5ae8795438b09f6532a2bc3e75a164075146f72e0b3397bf086ec8e7299b67f5c54e4263aa0111f4ff3c16de9aa06682d63be4d8e82b5e2b3c15d913093e29ad844c70f9ff9b3a084d41648e322a2212463ec758823591117e03d90997d6264e5bfcc15b834ce7ae785bf22399a85fc454f6fe9cacae568e0d9bfead7ba998cfa1f25a1b7392edda3115801eb31c9bd0eaf6b5c070224fed09fdb071f87266a6247cc4e3c72c591c5a88a6b41241c491215512a810efa993b0c77e9d3ea4fd78fe9ed4baae8cd8d41196efa3d5f2fa2b4fa6c027f4c385f98c88a296cbc5c6459f91dee01bbdfa059c50b42639641b29f",
+          "padding" : "30364981773031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "8f32f73f3387f371465e3a75a0d1c7df7c52c11abecdb69ba83602c9f8980177e7df76438f2e95ccbb031e0ab972c30279dd2641e5cb43a24ece04d7477879bf989e504887513eaa197c0b5e6365ba62134eb51fcd3a713c69acce9332ca50ec1796d88ac9921631a1fa182e6fddbeecaeb9ec468773cada71f908915259967fd7932f41a3734f09d230b1dd487f3ba1df1ad1be8306096f3dcca684548bd458b0211738c79a8104a17689bef8bb9050cf59df1b0efd3aa3f203b10cfdbd3deafa36d79802126de196c9bffa362b797ccf253af546c4751b68f7a0b819a5b634a9baa6b981b1bc325ecf2b0c48c0463f85b02031589dd793eb682023cfdc7058",
+          "padding" : "303525003031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "2f02de916b44a1aa31811b48ae20efdc26319f2569fffe23d0734dc4f4085352945135b209d4609bace95f8b850146b35f703854d4435536d00c3fbd9e9fd93812b4741f64c33271c01ded56a6c103121dba041b6fa1ca7f9f8e26fb98c6741ffb9e2c7abb10d3581e8f0a8ebcefd386957daf36d0aed4861a2b480467eef8fe5109012b765c6219dfb260a2aa016432dfe74ff2e71c2a748d9c99e1a6a9a98659ad6b5934d7e538c7aceca9534e6a48d27469a6ad582ddd838f135a5fef309e0efdf815485756e7d8046e0db84cf136a725f5defdd78935047dbba4dcca1ba153c68cca59844e1691dcfce73a4fb11cc915a4ee9549c26d08a86ec51a69e104",
+          "padding" : "30333031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "1c6cc57e11fa138c36bdb069b0787fb67a46c70f39124ab2aa2326386e0b055b8195897e024a7e43b7840df0c0d94459830cac7e33ec3f127cb1e9563167b61b3767964122a243e95b15ba9c8e1a992e20d4e70ce14134f932cb5453e795d84fe5856dc5ce39da38af6ea4b6029fafa7f804977ed075c30412ffefeef27277e541e3877f439e49154bf25383c9517162b1d6e469f5e861c385f2e8c45fecbd26504747ce9378f3f25a77ada8ba8343f50cb040f2f8c224d16834c6a4d97b4b8af5d1a08598e9b7c0fb1026ee19feb2a7063f73d78bb9cec8f499c4f66c1fe55049d4fa183b1a5779240b9a7c908c84ef1405e8ed3c53cafb92956d1ba2445ac8",
+          "padding" : "30363012498177300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "077b81fdd849f2ef237cf278e10e506dde35069cc046c4d491cf74ce419f11e4cadd66ab1acb99a33f23654a65c860c9901ca1f8ebca29f0cd78e8eda1f69eca20eb12a6c1448eb679fe5255fdf634f3fe2e716c590b5345515c02636a4f2ba30a2b62efcf5cdc13a6c09757b2d1ebe5943a7804249f5ce9901d95b3030eaa0a2065d9fb5eac8006a176bce1f4ac537941c6d74c9dc73e85264ab058cf5043633535b09abafff891ca6a83c45a7e998de6c8b9b275ae9fd0e7e0ada7ce1434146ab6bd86a6eb790d724b8d3ff921231f92d5fd86f0634ec45b911b07cdd6f0fe275f22ae2219f9497db982e55033dd9867357e6a09a9f4dc281c6aa36d8d984f",
+          "padding" : "303530112500300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "048d13daae417db317d655fd73b112cfeb8cb8be13cb34bf3235cea1e81c4248a7657a005ce89d81fe85f4706a478dd9739fe438373edf453db22fc3480edcaad7acfbee27424173ab89dc37aa50c722a9404bf697f333c5cce65c0394c3a86845029bab0f3e2be57bd98b707e3caeb270d5c0ca72f7fb11d8d6e4717cd0dd6dec4ec5b0829c66d44ecfbcf0b9b46aad8f192c66f1da67c2520fbbb8cf847278ffc665b7d97760ed0581cfa4ebba4333f03f3f7d30b366ee313a8dc3eaa68f1c596b87a848ecfcffeceb961f0e970da56aecad945dd78660446bcf7d5890d0f66ec012c8f2a84a38ac528050a9dc883fbe95b7bc9f289f7762292ee51133ecd2",
+          "padding" : "3039300f300d060960864801650304020105000004deadbeef0420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "20c0e1476060b1ed708c5f7e15d973eb79f23c14d6746cf1f1c0fdc0fa9c3b2acf6593f6d67a541ee279751b384df714a3ae13c1919947638504f0caa2c84291ea00f5b323b38e720035e8ba409b0ad77ca1ccfe909582c4de83e32661be7da06950d959ee812471d878563c75469ed82ddf806a06a4859166d7e7a65953779f9f1a3b72a2063b5c5e6b546beb42bd7a41cca54ff06abfd093a9470202856da9b8709bf1615d7a4520f6842ed29c8911c701e312669d8f7927ea16e4519cb573ac1915061407e957d0ad1e2e732c4f7c75f4c5ee71f25d0aa6c55d2ef7af05deb50656dfce222cdb049a77e6c30d6d8cd1a88938be1cc04ddb1a542409e6a881",
+          "padding" : "30363012260e498177060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "210413ed83069efa72a4215cae4e59f23edbd5d1385294cfca4a8408e69200d3bb73748ca484a5af10b5e665e23942c9e9672ace86228484a8ab0d76f8f5ba63d66c1c6b8d1c032f82c531e4a96856d19dae24b7e090955e9c5716643a81e6a4af6e67d4225f6c3ed2293b8e536c333aa82fc80386249590af1a60307d8787b50419772fa738a753a8d592cdcbd8eab403b744ab87fcf8d42b03040b74a6479acdb21b7b8262aa3d393d34a8f5a5cbc7966bfeaa771641d25611f1e9ecd8acd8532d0c79d3eb80b41c2c6ba03600dde2b555a5b2b7e5970921b6a7f2c341ed1ce44d70dbbf9f038acbed1a4d16004d48fe697ee38a6261c107a6c488f1330a57",
+          "padding" : "30353011260d2500060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "19c1b847f37fe29638684cd2aaf0a8b09af6812685d503713d357d4c97cfa552703d3690f9f3c87d6c95ee417cd47f1ffcbdae96b01e31c59dd4519d5c0d8ac706b6a365394df9c7a49078b489fd612a07d147b98a4b58ce9a0f812f35dfb725e2b53ba807b891e87cb735deb40bae7bb1842c52b924a9413bc893450da1b36edf0a02f8835330a54a2b1ef7bda97f3cb9f3bf354a0c119eb54ef38aaacdcd60aa3e92272754de6d51a54994be7ab44c8dcb11dbd61a593a3ea71f4d616bf055749438f53225b1c0746c6c491c726664ef80e20391e510e6ac99ee8f7453848be2562c173b87742ba48b0596e3080a48e7091cedb9c23fb7d9208990381e815e",
+          "padding" : "30393015260b06096086480165030402010004deadbeef05000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "5f6143cc96b7343e57cc83612c6e85d46352b1eaa4b6bfdabee0af42609a9ebde9dd07db4c10d130f58318f7210cff30f122d9dbc1d0f88a3a0b7c04442c6f23794411dfea767609dc5c767ded7662e5996051052f98ce4eb0e6bcb72fb0109370b86fb0d4ea99d0f02a4e0101cc88d01ec56168510d77b0e7890015bb3b22a032957d8f1ade702aa70a360bab6bb77f08e9340c1c53b72b992187cd4f7c879ed83d462fc69062746e7f0041801709b05a58ca4b034060ad14d25257ce4aa93573db71779072c5c5b21168cda09ac775b37b2975f2d5ed8ad4bd07872e74e6fae98e6d9e8e46f7a2623b940ccb662e897ed6df058c8081ad78c9cbc5468b2afc",
+          "padding" : "303630120609608648016503040201250549817705000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "324d4aa12baa7237b487b756f251b41bcc3cc8c516e582187035127e1cb3dcc789d5306370ab39f243ed45b8834e844fec49c0a190eeb5b4428a9925057a9f26ed57bf34592bd5676b7db1cbd95378c397a6818b75a65da03767038e5d111f5fee2a6d81663f1c8317ea6c4e64498253bc55f07659d14e0efb0de842af6b823884e7dc2eca3ac56c53f618c10362671c575a1cae42416b1e39962bb06fba2369afb336ce44f3fa3868c835d831746c30c3a609ae5e44d528f7f6c7d306d3839bb46b0da1edefb5eaf59b03dcf9c5116ce49b03cf03c1fed3f3ba474ee078ce37970173408660120b342c4b547e9c400c81be8a6d3852a07ab299556ecb868730",
+          "padding" : "3035301106096086480165030402012504250005000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "90a3025f33b6508e08d407443f139b1c03e1fdf203334763e4f010c69d7b1728d37ed146ae7a3667a655ab8ba20c93b5dc432d9d546dcbc41f9a2c4b9411785efd530543f78f5d98e2490a9eaae9164e085a3e50a8aa56ee11f9c27c471a433c6c48da518b890630185ea711a5b3bb0a966af679506ffad0c1f1d2937a6c39ce7e908cab5597c5cd5267f5e724460b12938c70e5b8b589f16a845534702706980b3781ed12bf2a76f9d3a19ee771dc561a84a8b7f4587d4f0763357bd512a1193f07830e64813b6abacb922bf31af6a23d7e2c6d44cd8283b301060b6f6fce58bba01623306bdb761e40fb298a300bc7148c379a4f778f2af934bec60db7c586",
+          "padding" : "303930150609608648016503040201250205000004deadbeef0420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3c1543d5cadefa71b2b00aa9bf5ed02fcba33eaa8237adcf6eea90f100e3133c944f434961a115e8bc8c757ce82734328dc2b442887ea984ab74c5fd415941b0876e45b3a338868aa07dde0463459a358ffe8e625ee2c2f94dad9aecc0d011dca6ba841357d308e0d3d2928f85c42ebeb5613918063c4cf398f9d9c6e57337d4a3c50e900c6035ca0833d4bcb705a0ef8565cc591fb67159bfa1e58c9c9e4985c0860126bb4853d700b13cf0c34ead0f691ae046778e8cd8596fe9189136541429887ccef244b71fd494770c6819ad3ee62a89f8cfbb6a9d7d7b01af6482cedf328ba7b3d7c30c179409b6a6a659978dd26c3e3bffb93cc985a747811b45f69d",
+          "padding" : "3036300d0609608648016503040201050024254981770420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "8897b2a9b6d6eb401b297f006e7b1a81b26bdcc6ec530968c4bf9558c3648beab5e706954ac50b18e20f3bb2f1061215e5013111e651c456516ae34e63f1d4e15d380abe36baddb7c3d0ad38c0f3f59621024c8cc37bf35871dadfb49c1795a87136d5b04a827a4f8fea6a7f6a2612f6866965cbd6635fdc2dee4e582d602c230ccfc29450810be09390125da052823766729a1c005506b975cf22c49c6854dedd737da6de60632e583bcfb4fed6f5a5c8593e999db7db53642f091e9792843d142411b16bc3683fe6a748de93c49a712b405227f1536ffe257c00b3eb525cbd91274ff8472f113c50621e3221173a058c923bd40e28ecf0faf42c9fb7b01f9c",
+          "padding" : "3035300d06096086480165030402010500242425000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "6c1eced47b60318495f7cce7800139d09229c4804482063413e96868ce3074fd99f8880dd01937dc0b956470494afd577d35d5c76ace00bf484c2eb2b9ccb48bee3e85697bef79d7d2b6f541ce5a83d3a71c09d5b8d80943030e6e54c5dc29c5d6e4837078c763cc018cff3c4b214de76d0ebf5bf2d7dcda39fdcb936d1a26c25ecf79342e8a3703cd929aaba16ce0340e5b8134894e6b3b2145969826cc5f1c2f72c1c8035a920c7c00b108ca796dc077e1d19692b92f5d9f12a7cfa3506ef449e13c41530044c1195cc7658b3d0a295877bae7d2fd74044c318d34889004a4f1e14a727c66807e5be4124f5a6819064065c0b14d7545cf0395cea881734f8b",
+          "padding" : "3039300d0609608648016503040201050024220420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3e7d8ce9db20f4b8f3ce10a548544cadbd05f23a7d7c21233bd12641692a4cc153f17e890385b7047b0997f5368b3162078e4fb7fc12b250423ac365f0651c5ba2d0e92f74886ef2f5624e6677679a64acac595c30d8bc3b0d1e838e18705373124adb1f6f01aa816f871eaed99240d6e6d4a18088944ffb11da666b6fe5dbd1ecda75dcb8b5ccee024b0ff9a4f1788fcef403af316d5b1d1611a1ad3f36f9a7bafe1b209a7dfb091f7e63858a119dbcb793bdee7e68234acf06979c0dd5b869dc4c92921422907f01bd3dcf2517b2ead3d1ccacc68da587531d773e1934d766f9ff40566ab3757df02e20a5147e39c92d65534160cbd33d32036e4f7beab5ef",
+          "padding" : "3039aa00bb00cd003031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "507bc632e1a5a2f787b0befa375b322f1989d6dbf4254df8d6e37208c9bc6ce1991a8600abfbb36b9b8fb954b4e5fa134e66bb528d63cdd6c6b05be5844e80d63ebb1503580997c817eecfe7fec54392614f79e2a3c27878e7261b78b433cff39c9a4805502aba917955da4c7bb816a5e636300d75d47b93ca0676ca35ddd15e6d562f8d376f3b60ab5e88290a2a2e0d884392921416d3405e3a3ce3e7e4e6e549c1361be042d060b0a6d5b418369509cd63dfc538fa648083574937ac49ae02246c2a0aabbd6a710f7826bf06dc16e47572e0ed990f3d2392cefb5c6e7eb4b6cdcfa39b08496f172481e20b4cd0c1d529d98e411e0025fa6aa3caa9446a6c9f",
+          "padding" : "3037aa02aabb3031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "84b76f221b3b7d29be54cfaefd1d16d0ebcdd06f30fc49d9c432b7112039d99bc8fd5bbd8e1e8b2ffc0d6adc9df34a7319ec33f86c39819b4ffbdb5de30e94ac6b725690a4a3fae09aa91c0001f9e526b2315ea1e766c5685754101fcc1eeba20cc078f12f166191a5bac18045894d673cc6159738c6901f5edeec291243b42f2390f13006d4f3a29e020744a7889139b7d4b1d8378a80da405e2ec7428ca751ffc17e2186daf177b8762244e059abf697563728ea8fd6a1df30b4b390fb7b0bcc1fa11503777ab66c589ac097e0be98f39a8a2e21ecdf5404ff9b17d092bee119e32001e10cdb11493498094423257291a0d835a1c1b90b87c521fb1c559e36",
+          "padding" : "30393015aa00bb00cd00300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "67bc94022123f356e465b4f42ea02200cc8b526ea393a0c35da34e612b8f7d85853ea31a0b869515ee783ef903f86186b97eb7269420cc1a3c55295119ecbd51ca47c7b3caf4ac6a53433d3aa23d953606ce3692a248c9e43ea5eb067533f4f03369417c8c5d469e9c56b2dd1a60b7a0c520de2ed2d16cdbc323ca43dcb0d0886be11ccf1dd4ec687e205d33eb771531a9bb46d7847aee7017690bd1748b1d39b6c669342a83eb93a070718970c161e8c4c3cfcd83e562d9e4fc87abc1882b16f1c63dfde2d34e230ebc9959e0936fb48aabe716ee751fc4abc62007e4cb875dabe9f7a5533d99514b5296d481df6481ad3bdfeea5a85fc6cfb928ffaad6584b",
+          "padding" : "30373013aa02aabb300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "7ecc2550cfd058167ab406f7f4b3af4180b4b84526ce4fa1d0751a8f3947e027f4b93991409dcf5b4abcc902ad136cde8f65ec2566df0076d46ae2a34b971bf792e5032f026dd03c6f6a1e9bfc535cb15d8c52374bcf09eb2777d38a7767fd1a6baaf65335fc679b8289ee22a32745731ec7c8bd2319b1898286062cbe9302853d42ae61ff0a97cadbce838826c604c042fc6a0579078bfd9dff2bb2d9af7e29f12943fc0dbeeb81b65e3cd6dbb53724bbc3df590fdf9660b634443d485cdb05e18d57e7f9c06f4696c55930b83d70b17e15f49971783133041f6bede672c59df0486b914f61efe622dadec842e85c1da50567decc57dcc842ba946c4cc77e07",
+          "padding" : "303930152611aa00bb00cd00060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "71f92fa1a1d60a965e0fc90f260a322a561ae3d4017409566ff113b0d8f03022d96eb0129755de4d62d8b031c20c93b8c476c3dabfe00f15975029797f593a63a971d465940657a3f147a359fa8dc6f22d0e0b43cca953bed63117670e345ee6c12d2fec365a2b6b49433f1c1b2fd656c8604ce2d83112f457486b8bc5ad376568468487f3539a981ad9c8ebb196f49c797e7a4542e95d7ff77135f533be20222db369f59df8a4e9d081510698409828d0567e0d28a0c1cca2cf674027b18b51122800fc97cb45193592d264cf5e74f707287df9deb77a26f2323b3ec1c1c17be5e11cffcf4ced2508525026deed6b8cf84c5cf7a9ed19e322043a81c0f7f519",
+          "padding" : "30373013260faa02aabb060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30e738086ddf782ba014fa326769c14b9e23818f48dedf3a3d09252dce42c160dbd7fbac9a72b8d3b6c3d6fb0e4f726c20b8c4ed31d8eb2f92a8b6d239fb78668f3687703515fbd9adcf64d272443a457735cce9eb102f881596c416739b316be58cfcf0e4d1fce32a25c2483253b3d7571a9c72479f86123d830a721ccde80e4c243e6bbcd1a895cc17dfbd0e2f8d7bbbabbced4973d578e4da5299ff15ba170d15d87ca2652e724d533288012fdba420e8427a2d1009e3ace74c03d80ac5d0b5949bd1ff42c6a728f28511264fa4152ad77e09ff60caf1cd5ee13a78d67a838294717a23f3940ed7356473dd07ff58c360fa0cffb3dcfcc2a2b673d9d574ad",
+          "padding" : "3039301506096086480165030402012508aa00bb00cd0005000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "9e1300bf1ac3f95d20bed0c450beada85fb878c4e280f3ceaef1ddf6c1723be2023aae1c5adc0c8565c76615e6d8dbc491506a4b086bcafcd211327a01ced188fe1e1802f7bafd3f79a434486d07b417e3fb8139de422ae29d921ec2e8e5b6843719ce8af35349e69623f2d39eef26970c80f67f23409a8b4e4c4b8ca3e5db512eaff96499302f7828a44eee7e277e58e578de56118a7d5e647f8aada1c03eed1beda3e7c57ccce9cc7585b2bf75427747b0e09310c4f9f9e0d2f48cc62e3f413e445ae2a6eb706269a0a1941021222be8663508657557c49433bdbbc7bc4727a405bc12bb0ba3ab7fd46b7458b9112ad010076bb96c596b9682de58ae074863",
+          "padding" : "3037301306096086480165030402012506aa02aabb05000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "45e4acfe9e0f98d8841778018db1d3280a75a08231bc511bfb2392a6120b629df7bc59b2cb2f3f327ba07cbfb4e48b62aa7f871e44e614a824bf7b7852cc020b17147a35dc0bb8baee6479b8a1cdc032514fa412bf4bba8ab531615839f1c4e5730994131f8c01103c8ca84417a84e95d3fc35c94a2cde9437518ba74ac91e9c2e48432a16277310f867764b72ed1c656a627b2f4cd3991708536369e4dad049d45c5ced889c5dc61dfd36ed30060c7bc0bed22d06ec212b68dd7385aeaa25813424653831f7515c4de611a664e1e43205d016e622c632ab297abe51673b447d3a3e067cba4bfd21af1c25ac6cd24e26567e654f12f0cce613edea5c4f14eb56",
+          "padding" : "3039300d060960864801650304020105002428aa00bb00cd000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "79da043a98e24a49eb5c250a5cdd0ca01c744b411774e1e660e7dcb41c12fcde79c90270e750f2758ff1d6d3d73621a13e27424f93c57f777277666964304655a0bedf717daf19915acfa00313ad4f4dc33d69a048741f04c601a009bd27eb9586c41080c56bf8e0b7abaabd76a2d5e9e57a8b8b9d91f30daae3342dd292692915231354db1a665d9c231310b9805d616920a51c66bad7094d6836697161542e09041c12220ca26a3fb6d22cc62420bc3f07ae349b91d3826ace394b0210d710e240468ce7fb821b3a01b8c38287382ec64b093392a82884df2fd0bb530adbd49ae71528f268fd51fc10b43cbb8f383dfa3874b7cfb4722e047e7f0b941ada31",
+          "padding" : "3037300d060960864801650304020105002426aa02aabb0420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "274dabbe063aba2a29f31badac85f874657725510e1f194ff51b43aa4034d86de9b6542720792d2bc07e95e8106b6072e9337ef0c721a07e3ebbb23edb76ec2b93e97a3f0b777d3e28d18cdf4167efff6fe548a1344834f7c92c6fa379070da86240096a030f6362301a601c2da026d72590f0ef30d94acf676c603809f619f432571666b57015a1e41de41a0140b6b79ac5d6613ac3f9fe1eb1345b198f495c27eb8d5ce83e1126a90559a62befa469e7e6ff41d81627b4da0b67891e09b9db22c76f653eddfe83b5b1626c6dc3c13024b27a66e04c070792a6345953a7832aa6ebb963a745914516e1e8a3887ef953934cbda4419b5e6e1080fe379b1eaca0",
+          "padding" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "6970f7dfb793edd1ad41c0d6f57137a9ebff66e04efbfb82c882df25d24f0913b9c906f4214b2b776e6cd6c158f701af8e17487fa77dcc9d66732c568356104ae5450e1e2559d3475cb27858ff8bae188cfb778a587eb243ff6adec6117eae055ffa5de62cf50ee16e0924b0afeb927bad811316a1c2abf01b6a72de25ac30e466d0051d1fea51ca2cf160cddfc9a373d4c796a19885237afac7aac698cbfdc2d10de86c58de9f6597cf5a701d2281f7343176cbea53f088bd7c5c755219066f4b35ccda85c7c8e67ca08cb70a02439a49238e5309f6bd647e1076d67b0b339bf4d5323ddc1e406b13c29010bc325cc17c0c338c38102fb523bf0f4f341c22c4",
+          "padding" : "302430810420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "21d55371d842235e234aeaba3f33e6d7f5fea10b7940939250a07d8938e70f073d1514f54bf9e5bca902190f1149955e3e6251c98e297576f726e2c982969317ec7416c7df93b9340c879dd167431153bd64d3010456d40dee836d71d405bd3127f90a6cb61d837b4355d30ddd1ddaafa5e4204815221f562d10684a6881d7bca66b1e462b8a1b3c889e916c848c4f88b179bfb76debb18208946d40f464f9e5e385cefa1c9065118b104f216f4ac22abbf0bda8583870bfbcc339ccd6a0da7bc46338e90dbb90964100c47dc3af08ead7978e39dd7369084f5f9f941a3a2d7d1fad0dd4b60658b5931296d6357e28fca5fc8d84fee546e1f06e07efcf8f1e4e",
+          "padding" : "30803031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "84567b5a2cd8993fa4297e61067d1d0b34a4d7015c46438bf4e02cdc934c3c586f9f80316307928cb20fd4637852674d99a560352c931559e26e414d67eae6661a34a52809d4a8e1e9b94c72e5afdccc78bcd99f444cbf4617c18f481b36fa36d4dcef140986f2fe6fecdf8864a99d32cf2ca43e7b30d9a5faa61237177ece4fae0f03debc9dc07d1b9de0eeccb76a8b84852bd534cbad9b0845d7f9e9af5d55ff49832ef725e74fd91c45a6bf9d2a519d0c0b0c4e42b42eaaf5b1cc5aeaf18228695838cfab32a47b1b048ff6cd7833ba54d8b83afc3a45fe546b68cc26434b1021217c1a5ee8254ed50508cf79521abbccf81e9d3ade87f236b13b2aef8151",
+          "padding" : "30353080300d0609608648016503040201050000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "211b7ced5b5d0732453757fd3b828aad6d5fe12752d17e79577f7604f282037ce5df075908b53bee8eb9df54098c8c44f8da32fdf95b778a51f333ddcae7069a6e8afad390dce5640ae25597823f0bad036e50dcffc224f86c3ebf09e3ec0679019cf7637ab0b2ab77377266dc5762314bfcbd3a90cb7a3d7cdeb72585ca9a11e1965f029a29c769e003f6abe8bfc1214e4e0cd044d16d0eda0c7357f5a94a71af57d076baf455f56d0c27a437bb649aff9100d55d2988995eed9980999da0271c5c533ae9055a07302d65cf16bb26846ca04c87a72c2efb3355bf6c125524a445250535d984675ff99be9abc0c544fe3fe8d33a9442d2a57b98f159129b23e6",
+          "padding" : "3035301126800609608648016503040201000005000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "1271847c6516bb1deb1487be33819ea16e72cc739f4752b75c8e899fdfa28ef0b40de5112734f6b4a0e2921ea34966da45998834e8429e7a7c8dce6bd432fe90febaefc201e421a93d21aee907210c97efc2890d0c094ae82a5e734958d4e5509b85cd0c17267e1fe1cbee894cb0838508acf9a3e31402352cf4134eabf882f69afa24a7fa490f22d60c180ccdbb14b41ea53aa549044e940f5e5e519b04824f9c97099e83593fd48c36d71dd7151c1e212fd772abdb72429b3931a67cd7527fd45aca652536ef3476955747ef98759c1e561bfda80733d6dfa927e1e32ba070941bcadcfcc21c3bae98e362586b82fb4ad48d347915ed5c89c15b2a13950704",
+          "padding" : "3035301106096086480165030402012580050000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "7d4c142eabfb72a880070621ef9fcd351129f31664ed11a744cfa209a4199b9293f8b603f1d0672b7a2160b4c620982ee7d2553e46f5056ee8ec2711946566f08d23adbf904ce1ab8d744e6df61c6788b22154ac9a516682e26ec31846b6a5fe8a9a519931ab61a9fd424b2babd883c3410c772b89328df17296b464c8914b31b3ad63d6984d46c772b6b9d791c21d3e3ce0984ccbf7f2902deb0961898e8ef835c658db4aa14387857b6b7ab8b38dd06a4885622abdc3669d37bd953584a3f3d19d2d77115d9bea244a65b7b26faf747aec73e8dfc0bed10a85e4ea6398dbf8d9a10154ed3f1ee51e6b3ead792ed2da838c0a25d0b2ea3190fc33bc9902e579",
+          "padding" : "3035300d0609608648016503040201050024800420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "8c76ad15a8de757cfe122ab8759991a1374236f7bedc12495201053b9adf0042ee64665abc4b9485a52818ebb2f5e0dba6d667cc1aae89163fbe0db066b80011f6342ebc22bb3decf96a3901e0fbc44ba79cb17adc811c15bef290026bd9e33ef69bc5717f2c774b208cbfbe88f0e2097595e6cef35745a512690593ac1f0799655a73318e8bf1e1403e42c29622b09d0000f9756ba9a0fc44692e7f86e6be28467cefb8f95aff478965226205ea082848dc503fa0f16b4cb636b916de0e9b0e91216a72950a65855692d1595b5fc9bb55a48cf584048317aa10b63acd505a45537c751c4e898aaff55f0e4e75570b36babc13ca158dc7b009fc4901ed407015",
+          "padding" : "30803131300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3a8c6928a87795c3025ec336cbf4aaa80e1ca6e758c41c7df1b63e223cc140e7703815300ea7ca9c169a972a3049bcfa9452fafa34e0491c99a1867d6f0e1ff45be4feb071c9c1f2e72c12f8aaa2a9542e0a3a037305e57fdc8f2584036b619ca5a30bae66e8c212c8e2e2013209f502bd6478d112bfba869427870e84023ca06229969818ed557e5617c6ccc23f908423c87bbdb03d011d328c81f0c24057d8245bb8d4f861dc76d3a9eed3e31a16af114147d7b17b4753b8294290a3c8fd3d135d7ec144f2eed11e4dbd4dc1e89d96a06d7860e5b1f806e5d15badbe05a310b9da804abb41297b179cf4e8d077258b2f7df549092ec6c8e7274f25aaf257fb",
+          "padding" : "30353080310d0609608648016503040201050000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "64b01c13163085cab7ace03109a35f5aaef67670699dff14720a7d9ca0afafe396746a997ff3efc0eaea70a658bf0eba2d0a146fe93dd5a8b45d8693054e52f4969cf021b6395c8b57abaeba260a4b2e6ffc328069ed30e992191bd17f7be889bfac716d24dfb47667a40eb72f7514ae2feae5ba11bc24793b3e324909fbff67f5000fe7e6e71986e2b79c7825aca40cf6c426def806d59415d6f477d321ef69ecc8eed7d061f242b088df548427ba6188cbedeaccc6dd4d75311658e4dde6d838a8049699893997b6e268d54d5ab13f7d1e38729d1e0f55ff607b74d6f869a5ef50980118047ac859d8cc57c79e0f3cf1f0562dd705689bb471c459c3cdcf4d",
+          "padding" : "3035301126800709608648016503040201000005000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "82240214858bcce755f761d3b6416c15322aa97b4e130a01263cefc1cb11fbb10ac28c5c22207b609f86cd63759a689d6e7f825ed84e6042b66d06362441998c715db426157554e8384898cd63177a1ea538bc589bf7441ff9d3256b851f9ba519e3213da248645e22314b34a53739f035157e222006112c1f6ba8e7add0326d618afbefe456e530532bb29769db477089330c0f0dffdd4302666b128069d8ddcb764f154c8700c45e5a8cdea403f4e4231b6260f18e6039bf497fbf09420163f1dd976af573068e0f87047d338c6446d480c585e6a6b82eb387a8549b7a28c909d88d3361a80baa25eb606e4e5f9eb61be9bb8bab17eaa7a98d5f5e406cb0b9",
+          "padding" : "3035301106096086480165030402012580040000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "3b243a065df77eaf4fc8665e8439377181c422acd42da5642ef55ba548555795ee700b156d690d9fd29cc31d7ccc59d6b29472feba8fa644cc49c4f5d46722516820554e3f98e1dc03e44bad5040ce4f0748c82a5a44bec4c4b5d1b0312e74cad9e87c022385dfa034e91f507e72d7c1f7fe99c6933801eb202c8314c5b60fbd67427fc14efa9e7569d401c6af268e9e3d864fd108f78ea5ed1a2ecfd1c41da2e9353aba41d4df48d3f2535d5ec60cdebf7497eb25db4415875f7ccc15a49ebb493a7eb9476dbc11815eb414577ff76953a63991938fb6ea73e0b77a8cbb77eabf3b893c22aacfcab7108dcb9a3bbe3ec048c17b416b146d4251c7c36fbf0445",
+          "padding" : "3035300d0609608648016503040201050024800520bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "8322390ab9d742c87b5b105f63940d9e4ecc613c12a921798c2b2a00c1e5c6f6fa38b33339c3fa762487629bd589cda879977e257de58a0d3ad4eb9bee9e3d41c57ababe557d0f3f8bef808dd7d5666b8a635b1a1d08a94bd24ddf10db4d6a366c3ed7a6891b7878328ae5d928a6a14bb425c4c1e917044a08ae0cc679b646be53177962bf04f19a345428f7a0c877f5749264edbf0835cec2f5aa66b7a1ae9b5e8db22748bb8b8f37636de4d02c9edc5dd182fe1f3c227d7fff6111005326ca3fd693248759fcd56a356068d3be8f78ab03d484a363fba9a13491ff5752bb263db2d905a90c556c8e5b12315b577786e038c989d13ded424adef4932c87a5ea",
+          "padding" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "0279b5b3e03f864b05e41a6e964c5cea2b777be5e670bbc43d2550c9c443bdf68069a0eb91e4ef95dc9918eb1786a123acb034fbdef2690e5f2f4f5aa0dd10627342b90f2c3ec1e3b6ec77c01a92b0c24e7760cb49f845a168afc256686dc428f48667d1971d56ad81153e7a54a59f10a4b00986d9752f1ba11774923374a990996388bc26dae6be26cdbb4c1eb76cd0d98532720e94caa2904fed7b937cd94481e4212037c628df3e213d5d856776a337ecdb52a4d256b3267fb66f0cef10e39a5330a9899e103817ebe6c32c741dd4eff16f37fb6ac91facfbce7f467397739b1557f0ea4234cbd8d393abb1f842a2a182e8ad9047c7ed643bcfc02156b106",
+          "padding" : "302405000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "24c8587350927113af79616a76bc5aee56e9b580452eec608dc4b25e8ae4101244bc456368e14b1cb595aee9c1d05bfd169981d2f5819023c43fcbb857b5feb7f11e2e3469cb1d53bfe66313cf662057b84b8f9fc1743547d848d24d1678d14bf44fd29b2c10b24da5f42b93534dd535505415c32f05e4078a8d31461bf42f2e465ab90d33c24f2ffc4cf430253f50478fff57dc1eb91debf89e0fac9c382f8acefd9f1dd2f2fa2203dddfa56fb275309bed0671f623f24927abd562b8a4cadec561a530f04dd58863458b802e8fe5fa57cb22708b700be9b250a6163b6e54bc9921944c9a8d468d02981b7fc41b9c6ef92fd705b24da3cce58a90b6b112dcfa",
+          "padding" : "2e31300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "58b5bdce097aa778d5232055b695fe11a01fd06dd2c76f6c4ddbd89b28d823a6dde045d541bf3baa04651fede28dd5bff79719e0310b285c4b5ef39f426ca9eb9d20b759b6455c8ca94b08f14e8b237429cc93e6cfdc8d5f9590ab9eb1a05243a6205cf26323dc5b4c1ea1f815c3d26e9a4d5f58e99b06e213117f6ef7fce8ecd63e661381aafcf2134c0cefe49b9432ee68e9e366d7ef85ac82befedc5c7476befcefcd7a6ca7f0267585576680c6ac901cb4ef12c3abd319f74183c4b5d852e898a955628775b941f91594cc00d281b3e69b034765077e967f9282a1bc16043a162ef1fd193921a3da4e4974cb63bdaa7745278175ac3183976b4bf1534f7a",
+          "padding" : "2f31300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "5498ddd6aa8ec6434d4d772df218db7724d4df79dbaac872d187a9cf58bfc62b194c263660e663b2d50583dfb1e232a6a855c3be31a7297ca1c801b065a13871686f1e379f50935f754243dabea67176fc4d92351e9bf1e3c9655b5de16d725f0e925d554d215bccd55020e749afb612420d30ac95c5723855e2414c9d7bc8d2a9ddf33787c521888852e1946bf866411f72ebaad3ae730ffd13648fd8e5464036e800064472806ba78a0ef8a10c1739fd512cb2913d91325cad3fae38a922c3f0e5482781bfaee6e097e09bdcc6eb67772ff79d358079e522f9c8f32fe5f8b227f126803f0e78554c513bc0316ea267b51aaaf17f1dca423f1e0996dbcdc6bd",
+          "padding" : "3131300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3b2299256cea4f270aa108ace666ff3a44b693c27fe72e21e3f0443956dc277b1f24ce72a48d512d7545825db729983bdfe4ff9fb0ecc6f0893a9d326d39a46e7040f8891ced1174d2abd7acc27f79781501c3a972d562f0b5c57a3ff2ec703100b7fad948c7e46494cabc1955dea0e8734ceb47239b915476b969f317a9953653e0e5d4820bb28a5c81b9a4f1d0f18479096a60b53d0808acdd4efcf16cdc4ed82b69b33d6e5e5261347e821c2e366f2826fd81e8f282840495f6f2613be6b9f1efa989d912b86257d5449c88f7b3cdb39c7bee6d411187a0f2cb83115e5cf3a187d9cbbbbffd9da0a62780b265c2a5a33465abf90e41550f8b7f62747f5252",
+          "padding" : "3231300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "6224ef796a605bb30a142e4671549288d3ce9a7ca6ce58ef79d08b25e95a81143b99c84efc7a0b92885029752b8bc1bab7fc56048c19d50ca21e8c009024dc9dac2746a9b961db242a1454f0df944bbbbe28a9598878f9392746798aa1db8c69c6d36af64726704f9252ad71e655a02adb6f3e8453ad59a0a45ecd1ea512eedab7867fc50b508c49caa7399f343097f76b2361fb7ac2544f6ab1b745965a8d7e83bb9a1d39a21fa6b4c14e9a800983f5c76fd8de81fcce99f4926e48bdaaaabbe09528a203f5e76dc19982021618f231e37758e8e729968c267390fdd759e0ba88c9492e4ae0ae7512ea389bfc6b64d90eee12c012fe278da80a915da794f6e0",
+          "padding" : "ff31300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "81297d38465c4346e408293d770242ca6e9ba2f2ea9a66dd932eb3bf42e72bad344ff31bf058e38bdc716e5a747963e6eb96ea1a48813f39200596d6d589f2164bab35c15f545f80d10276eb6d3b7d13bc7bfebfd0f6949fd7547c45266fe6573389c2343e3adf9fd64ba627baed14e0e753a8fb75a3d1821e2fd03f5422bab3e71dede7470b43449e7e49dec566464fde545a1ca53a567ae460a1d994d295355eb301048413cc92aa34963fc59e054e88bbf2af2ebb0ac0df18b06d1c5d9ddc4f5c3046c5b609a9965a646db2a1c70b0c851e7aac01a5df8e2c822300d3732ec182e3d868adb99d6c0186cc5dd17dd8c89658c0ae021475fae278e7ff464501",
+          "padding" : "30312e0d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "73b38e74ba14249c5fb4d2b3923e2a848898a2a5b1b9e6c17848177e6b0053fbf768d5b393088c3b7c5e12d41d24cbbf214a5bebbea6661229ca55f79b76b1d1118a2f7a6a96f36f88e1388283d446b8f8fa4b10b3a6d8c54ca207ceeed96e06147475a3d47d68cb2790dd0ada7d816fc1edac6e10f4f8e6bcd807cb70d995d7d6029dc774b1ab86de3b31c4fe1033517a64163b4867861d6ca0bacb3e32ffe4761de071a03fb79f8bae8515973a4eda2d7676cdf5ff05974654f97d6dadc6bde754f7b297264945b3bb69b950000a4d597c071fc1b9198fc1ade0047bcc7e79dca09e8f01bf4ab46183cd48c8b243865eb6267f0974e29072e38f65957594b9",
+          "padding" : "30312f0d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "56502d3cc755778ce731048dfff628943f94a966763917f8a9244be934208ca6fff2100faeddea5693273b965e62e08672a2ae4037b2a6681e1037ec8d4f00b7ca75b792d596e01f6312733929751dcb629ab54a6f910a57dc01895cc92d2338b4ddb1271be183f906e128ecdcb5cafe1096beac38e3e49eac7ebca6c91bd3900e83d96910feb192496aae8f55ceac814e6829d9c068f2619b048f1e30e2cc0b7d64e7e335ebc1b566f12b545a5e610fbf5317a2efcfd5d18adebe17b3b71bd788bbd581afda953dead19a0241c6beb851581249d780e780be43c995f23e90ea4190fca6b9e81885031beebe6a65a53db274bede417c35e7e1e597c6610a1ce5",
+          "padding" : "3031310d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "7c49a57abc1b7cdd2699b2d64c9ed240c4ea19ce2dce960f611b5264acd37fc4e1efb3ebb5699a4e2292d9d63dde3b80f30c34118614c617444d7e2b770d6434c58b176db042b74810b40fac6006bfd84a51e32aee8900ff40bc8de3fc77277f9c34c174769afe2bf9c8674712c645db823741a4425043b6152940bce8eadfce213dc4de62fddb626fd12b56efbdd3fbf0b570dfce0ef3ee7b3f7c7ac383fca18e04a4b347fd589e30f283ce56fa60b9761e9d5f584b493062f490680ddb7a2a6a23ba0145ab184cd8e3c5a2f2b297b85db51438233db7d3c72739b7074f6d7a524ad83aea2465f6c1bb236d5ee34e5f66297d549679574a9847ec45180a8aab",
+          "padding" : "3031320d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "41abeab011f029748cd5651c173ffb01f3a5ffb4e198549bacbf8f98523b404791704f52c8ce631d77b31066b1891728e761047a0464e8160fc6093c9ece6f359860da1ce8b229327cd683a2854047aee8afd36540d35c424a19f0db5ea444cf91cdc548dbb9a196f3aac9dc9c4365522618c354c0d99e7a0efe40a2b69b9b99d18f3b941044ab37e0e564543a51cc919870c38a4843d3ff4c6a7d503dd38126b5b76ae7736c9e1790f64f5f6e2faac7fadca3a8f75e6998270004f1836624b580e1430a31c386506b9def2adbcb01c716b74f6a4e1e85e55623d8d3dc4fe8553e1e1feb75eaa4c71829315f67b46c2e018caed17c9dc2a31642ce574a599ffd",
+          "padding" : "3031ff0d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "95ddc932d45b05c0a1f4c2bbf30ec6aba93ee9ae560b4a9c124c6be307cf930b754b6b7b1c8fff23c43c2354b847d37073214ca3c95d27e0551aa45ca36e873122c109c0067df39797563168e5e6cd8d20e972ad364a6c3f162415595ae273574b7b35807072b71a8b17afd06bc26d3ab8374df32ece1da2ceb9daa582ac11fdd9246d162fe4830846d08fcec90234ffd9622e4db5576d86fc4b913882da7bc5b1779b2acc0261cf434cace117090546d86dbf5056d0453fc003ce9c3918a015086583d266602403353f0c62eaff4ef4f5697f6e682163277818af6f487600ac326c76f34cdf49654d3eebc7913c0f12a669fb6bcdc809b2621d7ff5050da3d6",
+          "padding" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "51c0e29286c44d53354c2e11b057c373690cc8a6979ac1e184bd4bdf560c0a3fa76e80aabd7041b0b1cb40e703966312b8037dc40a36acd170ec8fc70e35c1edb41d9fcc8ddafa54bc1e96199b842c72f2421803f8e95c734f19ac169e581fb3ce0da042108b21218f28faacf7141baa0e2b72fc3bd38930f4ab139c1347a9806115b25d3cad3e00fc29296b2d90e403e5ad0dbb9901dd2855fb49f4b7c9500e9428e4037abd6aa767b604edf426cc68e39bacd9862dd61612f0f5c5666e1593bdcc6ba38682f19c5512b1217f05d1905bc47eff2625ea5d6581f3657caa3d84ea9b948aadce632b3bd4ff33699f384f618350b93a223e037d6790bdf7be128b",
+          "padding" : "302430000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "1a9f00a0a13bb63a9a2b98a93a53cead0f0d0f0befcf19404e838996ea86c67919611edf2962f621480741ae34eec18e6c87b5f40b2115f81e73bd1ba59dd32ad41534d143bd82f982f4ed60d84dea28d77ec78dd6301145c63a0778e465e973e963502cf1c9a21ff5a84f5f4a673d81a9f74906fa0f28b81fd4c1be7eba5974266802149a616d5b7b9bfdbf51aaa9ab3051082a0483b33e7b43b52f86bbcb33f07783e3dcc3ade6c70acde471613b6d7863c4dd091017ca9f0d9fbf7405fcc7e7a012f38404fb0c3ce03b2e601611fcbffa985535c238b5a1d529ba092a3c41c8c255da68eab9e84a7b3f6f29eca3b52bb4b977b6c5e1375b691f6ea413b557",
+          "padding" : "303530013030300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "8270bd31d9183e02c4423798ea8f1092bdabc33e144cb9e79187586cf92a2239cf52ff324848461bcc89d0409574655b8374bca84c38df11facf035a6f54f25a7c2e691adaa074d5ebc08b0d20b45346679d94da1fc67f57444a9663704bcce7a6964a7e7d6a98bc89b674bd3037b15639ec5bea57c313331dfdb0bc0d2017f1381cf5f29245af5bace9b7a690b573bc7abd9c36fce49307f0524b37b29776fed6722bcef049e566c8a5a0db44ca6932bf11e2e7447b82318c71eacd164093eaf40b7b122f306cbae65098b68b5b920e96f2143637db6d70070036c2cfd64db05ac87d77806d53096bc63d6fbbf2efc29d8514c8b909ab79495a04639f27b882",
+          "padding" : "30353011300106300c0960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "0f7e36a02137a094719570754763ccf4cbfe21a05b95634fffe0cf0cb46210d379b5e7dda7ad815081d12dc43452e35a89b1fb715e4a507b364da2b73b3fdf91ecf1b04a6aa3ab9b90718660291478e6ac0cbd29c18d4beda2b0bfeb53979facf2e5d8ef1bed5a36686cb034082feff665686c41572441a673e7426a89866f65529de9fecfa32a2cd1c7098e7e7bcf2a720d46cebf23988c259dc880a3acf8e1b17f1ba8de6e8e9cfb8af2b6398f7541d45162438c3f14c308dc6d778bc91106c7d48332d8968fb083bdadf1edcba30638853e5bf1398d61bb8eb6b61363cdd859ce4f6160f7e819758afa067c612be054b4c0e2567fe39a81550001cfa081d3",
+          "padding" : "3030300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "0571ed711f75daa6e7c7b65645cc10ad040b37fcc3230d4e8655b9b40cbac0e1c5e7d9ddf18f7995bb2a630235f7959791b1bc21c72ccd88ee50b5136472fe63c13a4a391452782b673b90fd6e768385e9f09023ed975c9fd5187b86d0d147418396a971faba4c5d968b29df04a28f90f0a2eb89a0777dedb38e4f41cb1c373f88906da1218a80b47334ed4e5cc0bfd1a93d2ddc5141b243bb002dcc513d98e68d512728204bd0d0d9ea5046ca21bd6d32169b69ba8b1f829fdbc4b4c931d0d29ca72e4fc2d92a74d2b5e1569a222f4b8c93c6cac09c67c08ab08fa08b1fe9ba78fd016aec186cf2f9443b8a3af242019a4888839f8c6021f26476e32300af4c",
+          "padding" : "30300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "690df1372a35a30d9c76a4bf91cb951cff5291bccf26a1043bf84805d75d27a28c0567d353a95685d3411acde938df718f2c845d72c4676044f692e8ceda2b22da5fdf32bf493462fc83c59cd8e5ed0f62f607bfc6d04fa38a6b01a5b3cb6b58d55d9fc2c0a36fc4ab80fa3a0dff60d55a0ca946c568451616441fc9f14685077388a069c3892f1b208c5431b69bcd5e6ca8f789e210f63af6b4ead0a8f3380e818f0463b2287599f5c4cc08bffc460ae8404069cbc01e2b1fef6fdaa810478abcabad6b7405d01e5d3f44884ed0c3d69b614b2c794721066887e5389d72fc634d14716f0cec8fbea5a12c70cf6b4471df4f46058c0db75ad3783b2dfe3ce2d0",
+          "padding" : "3030300c0609608648016503040201050420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "13ed9422722bfb8b6172cb5656b9951610f509bfff5d10e2b91ddcb4c2e8ca58879a7db943375343fdb794302c28e3db0e1b850e8428653c09208dfd46f065e3996927d85979927930b89ae12590753ff03889b8eab41acee725b7092472ed00ad66d00a96370c909c2f39fb6300175d510b368d3ec06ebeb0f62f179e191fc1ac9f7abc36d19d0180f50f7a33337daaf73a76f9b38361e91ed7c0af2c9a3519b4f538c532f3bccab27258d711856b29c41f215ac87f6c7f3ea52c3bf30db5e7930f44e489205396e94c0bf11700499b5a72b26c9f3641c45bb248a235b42c410a908e5ddefcb481ae619b23f8a5ed7afc1a9cd782020aa119af745abecbfc57",
+          "padding" : "3030300c0960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "054582c86eb3bac23c330ebe275884ec6c740b477ff69795681bbd88d9da5369ee5d15fa2dd64910947cc4b3a713520716ac747834058f50852233fff1465b4c582ddfa2411ee43d26abe6a26aedd5bb79384b44a45d24b1a374cc9d193c3686fcf7290569173b07b5a698ca75653eb83ce3feecc40767680f6253fbd0d7151b42c82ed7126e6a2d73cd1c64378294932eb790f5997746af7cf87dc5292058c2ae575f5929426fefe7d78867b725fdf6cf2e40c052b69fd8104fec8c017561737e02651aee89c11327f866875dba4cc6a6e69a5f2ab612b4e72671c8206d22c2a9d69dbf1dd29eaf06745bf2267ec2cd89552338136a8981da13b4223d79abe1",
+          "padding" : "3080300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "67ba3a10105822c5f34c661cf7765419ebe52142b5ee9358674a174abf5981fb845d4877315a6a5f856c6a30992f520bf3e979a7169adf0e1666457905d49b91481b641158817cf2ee2b8725bee0d7a659777a128fc7509d3f0fad7a53b04a77339074401cc306328d7fca7876b06a54a2fb46edb4d763598e5fe21b9818c1d61ece98a4fdbc0376fa2f9b3c50217f576124f292d6032234a0a6e34835a8480b25a5254b9718c665911aec227c0f432d2dfdf0a6aae40030a05d3c03a02e54507ce0652cab324a2b29814451c985be5f4dfa2546e5b310e670f9fa510c24352e534d3c46beb8767224d90ca8dfe1ac534a5a8b80fffd5704caed8d5180adcd3b",
+          "padding" : "303330800609608648016503040201050000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "8eccc4b661d66f3c8b4e26791927ac035e2a633b872c60fc006324886d45a88ab29b9bff8075701e61cdfb7d85b3f6d41bb78ae12d2d40b046f1f7bc6ba11cda5eafacf3002457aa6951dd7e574b6ccc7e0621f6e4110336003ac2f368b50969dc45370ed7a673f9b8cfaef3c40a6814afc2ab4ae6eeb8749e8d0230b38658c17fd44aaa9ff65773d001430d0963167fbd08fc72343b1ff40920741423439ee3795c036c912e53f9e75b2d255160e67cac99ccc2db7faa8b488e7f1f56ae3bd0fa6a277b9de387651debe4e16ef29215054d9565ac23a3830ce37b326a4eb5c6cb5db7a8cd961f6d7d7497ac14aa459b3b64f2300da1f95b42687d2126e60d8b",
+          "padding" : "3080300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca60502300",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "574192671e303ee2fa10bb741b24c8632d520a54dbc24184dd70ddae468e71971ead18932c8b74cd6e27b13014a2ea96f2074a9fbdaf432153f408118306922d111e861ff91f549e8e669fbda98c4975a60d36019b2c4bd25ee2fee0e319c56be4554f5334edf152f911a2317123aac2ff0d11359e43189223673e4b4b613cf070841364470b08f5390951e8d9c6f8c3422f79e3bf4863b2e4ae694d63d57f77620511eb308c3fb454270a4d2190c83828bec4c0fe2283e0d9fe945f6aefe7b806151caf38bbc963a40a97d92b8f71428fe89e8f468509f34b2cb35542fa717e5feaa6cf4cd6c8ad87d8921d5b62d97fdd58642a5d8d782c87f8f6a53a9aaefc",
+          "padding" : "3032308006096086480165030402010500000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "90bc6a2164881905a53cf42cd42753f61a47cf4703d4658343dbcc30b46f97d8656ff1ac6c395e1a36f27562d7c23ae859239c1086b1a6473eb4f57d9e0d47f626f8de059084f681032e6fdea27590a08d5e57f06adc0b8960b640d156b31047d26180f1a9c510dcdb316948ebddade72ae3c8d9d6fe49642394f30951a614d03d37c5ea640f0f72435b49a0d382b93121603a424fc84307bea44e0ab83f25389c639eaa2614819d6039c721bd622b86822ceaba916ce302d2be47f38d4ef37e5ce40c3771cea37bbb200cc64f4180199a7e6aa2863e0fa8355b1b456f748fd1cebee88972fc17d9fd77fe9bf8bb7f2ca4299843434b3ed24910c5e2abff7c42",
+          "padding" : "3080300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca60502305000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "7b590ff6d404fec472f9231d39a4ecf4ce6b5e9438b8597c082e01bfdf0909c7aeed2268a3e568c49d9959352378840454f9119beccccc07b46ef2c1f143da08818c578c6b2f7acca6a85109c8acb719fe9f06282c25728d466b4f138a4b129de607de9ca3bc6180f4a2a45941416f8f5c60ea19c921f76047e0dd0738853c0b24c25476025ed4291beeec5db8e2c744795de8367530cd5f5d0876c3b99ed248cef9f83c54a9faa6565eb0662d6a126c15a5a4a55ae3433cdf37c6e8854563d2b9c06363a86f4a648951226a34c612c3e6b6b883c974d4d2a8e07d99f88fc4eba0a9ed28799c95fbb1404b3599578a164721121ee387b0509ed5e00b3df84033",
+          "padding" : "3035308006096086480165030402010500050000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "8dd4b03ddf0c4f8c044fcfe70a0b97ec8d8f31b519d11d7e00702296ac731dac508e074024305a285fd32d93aa80b26e6c1d9bca4dcdf07dd141557f685c473f8a323492e9674ed28fc0f78f141418da63e24ff1d82a9e280d2b63819107190cf0018941a440291ef291fbca9616074efb977c2debe71b4609a6510138754d126d203ffd9c234ab334506bc2607eeb9a64e0600ae45e45b2ec398316f4ffbf405d985be94b23566f71b77679eb34dfd560bcf81d790dd1a30dbbef3b928d13534890d4640d47237b11c56a22401e8354b3327101cfe07be6da690d1b43df4486eb185728d7abdd8e4139b506821640a432a219b1787569cac4a870cf17a3dc28",
+          "padding" : "3080300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "3c6f82cff4559f83ea73f58e5303b37ac576572fb8f94041640e6bfc0d1e527f77af011e5b62f8e854ad052500439a9a6386ec01504a899860eba9f67d78badddf2e72fc92e0ecf25895a807431cb8381cf0bc5eb2fdb28f96340efbf7e54af7d1bf132b53dd9af5b8d8ae37fccddb32f4469b880bb01a84892cc43b394e94f82b22c454e4d308fdfd7e893369498aab4d42ff7048578a5e2d85893c16f8f12e2f8e7be48490fbc8f82c405d1ec3fe8bdc0243898c58dd4306796c40890fd467d024b033ba724c67a1119fb98da9d8c0c9d3673f9d45e3f40811fd223265c8e75fba57dffddd9ef6f94ba03552d18773d009ff142cf09e62cba6330916453f5b",
+          "padding" : "30373080060960864801650304020105000608112200000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 145,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "0f8deaf286c4e55b6e1a936abf3467b99ccda07cbabadec1798d81db7c720d6d8c278c14c494faa48a4def3bd4877b5054ae0dc7cfb6842b69ea1626b667ecb22dd8864a55b7d39205141c5068559874495738c6b9b756c0e46b69ef21ace864740e300c57d3dbbd356d992d08afd4f78d4b0813ba6ff629fc837e04032e6831f931823cc43076a69a91c3da38f76ae4ce127d11ee0aa6c436e68e3b4c496ef04f00778bad4b51807791e901000f6c75f81568b86fa1c606acd36661b1487a45cf36c2991a7bb87e7fc9da54c1f8a98b1ee0ecf26336c4a4088bdfdd7ee463ef3944100785ac16fdf77cbf8d6f6f578418495efecad9dd1c279be63fe5fe9319",
+          "padding" : "3080300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 146,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "7b600cb582f01b2093b8c6836b1ea72a27bb54d167c3cd067de1b9f285e824f46b5712f0024cf4115e69bad8c6caec74742076dbe365acda52fd50368edb854d63020e9d698a4f1f753b4817b282acd37a625e88997c6d067f5f80e43c2f000008a57514989c8ddb6ac36e6ae15858f16a6436588e79391b7fe142be5b66cae553f4b998ea9ec2dc8712af14b9a2a7086631889501f77bb81ce8899dd57f75fb3cedf82394627a72fcf7e1fb5670edb260f71e5a67c502501e1531111978048cd181cd28ba37f20e3c24f9895af9b9067d1c59f69794e43bb64eb8f5b1519255623fdc64bb85e1b85b7c793b0ec42de4d850bd542160791d6e543c633ee21171",
+          "padding" : "30373080060960864801650304020105000000fe02beef0420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 147,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "16378bb4a3a00a1916e10733b6db3b960c20c82929d1d50f6ce694f691b8b1a2be1377d6860b6d678fd27e797d7dec9850d99aec1079ab45e08a70a54b6c6b13ef7c335d48a7119fc855ba69130e08af62540a0327dee39ead88e5dd923edb41f0e0c840737eb35704cf5a3f2320a1b4eaacac70846d05eaafd743046200a5cd25d37ca312d1800fde082652a8e802f15ed775e055b781aaa7375de845378d57ecc516e23d445844edc1442cdf7eacfa60a995c7a9b062765dfda8aac031287b72044af30d5b0ed4e815aaa55b068212b187845e829adbdb2902dfbe2023870d006b8bf77779b8ba205dcbb3225e3c854d853587b08482264c5083576cca1107",
+          "padding" : "3080300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 148,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "64316a2c63e71413bcf87cd2d8efa6e88a527483bf4329a27520217903dd7b4a74ce427cc388786fad14061d50755ae6514e8161dc596a5eac1260a24716523e5016dd55174b25f826a7e806e4204949e8d23a4a7a0a244df064c57432f39d4ff3c90c282fd4f49712d6a922b9b3ce8297f35611ae846bafb060bcaff0fb5c484f9766b0b36b2727c11cd7f6e95410b8398ac5ae1f1473ce16df25b2b4edd80ac083a3796863e2b55428a900ecde671f84c21fd8fe224c03878c62b8d988f487d063e2c972ee46f72a8d859e9659483a860938613c9f4b4c26313d27e828dfdb4fdad98d4edc31e07b050962cdca2f2980cd2034a5a4eb82bedde65f837a04c3",
+          "padding" : "30353080060960864801650304020105000002beef0420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 149,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "49cd3a96260855d9a0ba3005b8ab18f077e18dc88923a4acbffa7ce91a948601db5317c6e6d7e55a7686f735d378ea12bd17ecb26638dc1ef5f613c527c52dd91ec1fab9d3823ccd51d7ad1af5383f4920478116e20fe43996a8ee7b61116cba0f69f42d5661c97c71e62a0ca792d592e6e0ef28e67e27b1ff7260ac427f35f7788ac81dcc69ed4f4ac4eea07a69303cfe083a7cde808e75abf62283424a8727cf0a85df2e26060de2dc04dd12fa6a0471a00f003b30eb4d14b65438d7090c2bdc953588207c0951f39d0aee482dabb782cf593d631900eebb3dca524f9d1607440ada91e20bdb7117486ae90d77fc44cf5e4aacf4c850093ca883ddb7b3a040",
+          "padding" : "30333000300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 150,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "9dfe688124026010b835f972719361baf84e104ead160ece75d8778200f1dfac867d262f6e8dd12cf25a8018c16f176d032b28150079c35a6d831f9825c80e986a9768131fc6e221e897e221a14be3355921369d5accc9fba6ab8649bb444913603db70cf09188c1f2f34eebd06907dea1b7a970add4c01aa4858d78dd2910c251dc832157e0f373e4d6bc532e1fdc85b8f6d3bda13585e789607e823ea8808e71c1bb61fa40dd219c2980f5a84b502363be708ed3a115c5711c69d16427d60a7a605a9c282c5659d6cd203e0dd181e41aaff5dea6233985882978172f03ff34b651f3592155adc34b26ba7a32df6cf5ccfdf15a7ab95d2f217a0565f4564fda",
+          "padding" : "3033300f3000060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 151,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "7b17d3b2cde9c95d954e3d795eb7fadec93e788101d337ff0366a3d2fd7de8294761b0d11daa19dbe5fefea7bbba4986853bcb065a0d5fc34d4386bd0d9ca9f1dfab415377a8ca0c8e879aa2ceee9adb3aa57287adc2b2ce1b4ab07c09212b3d443d29297fc206968dd22ee2160716bece2ac0cd9bc9550cf0bcc71319e97818cf1658f0384d991b2eff0001da8329d50935b3d3efb4a045cf1f88c98a8c91f316a320b90c73487a6b132304c547437c5581c2c66cc1b23f2361e65d888872cad4c16de7138c1ac2cb13a6d84cacc93019e7fd84ea99409d8d8184cbe40bbd75792aaa283183eb290d517d46c7da3b1ecd6a2ce086fad43c565b696ed3fc8250",
+          "padding" : "3033300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050233000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 152,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "5ba48570aea8cea4f6f76ce4d92a9588a6478e6a6dfb82d26eeeb6319420419eb8553dff3fc9843d01c9c708947a413bef9c5e7beee54a57d3ea9a01a81c7fcac04c4a3f0c7ce17bc8fa7c3e47b03d3be004a2f4340fb8c119d6134981d9933b9510e7b89fbae037809b8e49c429fa9e01ba6af5899f0c2f60666d42a62f4ec1f8e2182e9bca160116bd447e9aba05c9ffe8cbd6f9abf3061679a50d567221c2b808a48f1694188820f7ad07e9883fd67ef7f9f2d78ccd13fd8017d8836101de319d17f05beea9d7b1a2c8b1f7dcdca212d332befce5c0c2a89bd29dfe2bcd6be1dc9600baa0ff970393469ac32996c2710bc3d07763b481b6a713abb9880604",
+          "padding" : "3033300f0609608648016503040201050030000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 153,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "25918876ee17947c7ea13c95b6f5e693cfee2ab988a68b72765853a4f47b0075d105952afd7d271e3aa39a88bb35549b18d0aab49a48a0ff25c64ec8d052cdadc92418e84436f3e930f6ffafd0614b5e0af4f87e0c6e646be9e7dfd996139cb73838de8699916317c79fb16df1272efeedf3044fcdff7255fd45ecf26677f8e3cf7e86b40f48e7aad2f4185433b5f04e06bd105c1081e5452d4292346e07f91f9b29cf2e4dd9ea335c065cab8daaff554fdfa1990130dc1650124fd7af5be1eca9c38a4bf2813af9f50e51d293b4b8fe4fc6b40f8da779ea595ec0b43c4db3abf7751c74e92e28481ca919857d9a92c8db1387be5f4ae4b8cd3372d350e57cb3",
+          "padding" : "30333031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 154,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "3dd518a77a43fd87d8923314e8a78d4dac476188c113377fa71ed7d2fda4be726b17e10bd7870ed018368a3c36be143d4c3d59ce35a18cb46e457ed2afabd69bff77fe94ad6fb95b360249944fa6228faa4159531e67490c8ea44dd64b471d96c48bae5d1da7c6fb144604ca8e8abfde84f681b9b700d62649009c135fdfec200c92096bdf9a699eb1b8936e8769044ca0127070b40e2cb8289a9f98b91be61ec77861013cd9ce5b33fd2837ba8a93caa480632aeddbe283fef6ccb953f2e4af9ff6fe5bd01beb0d1a0b3f08e9d22f26749b5c9f5f302002f89af05c7f9a09fd416691abfa0ced5eee4aeba83113bda1ffd418ac4030443b9072cd6602fcf797",
+          "padding" : "3033300f300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 155,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "56e666f4c8b916f556ae1139f9626a6862de59780f148165f924965aeeb35ca681b7fe2a603bfb1098ecd06e3e185564e031699ba6f5b7c4192e60f1c7e06131eea6a6e772f9b7e9be4ec4e94d89eddc0351347c5cd7dfc58e2c9795099144428563b77bc3e3d5dad50cbd19374ff5c7915c8987f046df62907b7ded38deceb2f04f18a868abbbf3f095ac660774be8274d0788b88001c17b7c3a59f792e81e18fd01bf8d67289012f60a887202968c17f2ac684e5a4a05673a0b2189206ca3358ddbef03b54488d5a794d3a5767de1e4e9032e35bbf1c8fbfb9b9be9a8bc5ddd98f12d3853485cb6a38cbc7044e10a61b704c6987e4b76331aef926a843f85a",
+          "padding" : "300f300d06096086480165030402010500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 156,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "759f6957706866606f2ebec1d6400b87afa134067897d332edd191036f318e1e21a71dbcc88e0e3b7599123cc8fbe19a15273b481a795303eb7941139e7d48afc490b61e3fd38078ef756ffa8de344f2e930b56452c619089062c27a47b594c5fff1fd7f5870cb5dc7c30f83b245cc838724639785c2ac7d8295e9e1a99004284ce1a5a5f4c90f1edf87be994e2176ced8b0339bca21068db978864e75e84bf9b65b5b28c3bc9fdfa451b39125a271dc280b9c6cffcdda1d883f5be07cf8c14aa4aef6f7993e86dd9dac620ca24c027b83be7cae015d2a55b85cca9ef1e6d080c298e58c4f0730de7820951df305d85eaaea46f087c74f3ffefeee09aabd5827",
+          "padding" : "3053300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 157,
+          "comment" : "removing oid",
+          "msg" : "313233343030",
+          "sig" : "4e856814cca0d9c39a2ad4efe2b425ca0ddf90634278255edb4b7f643a868ea468f8d1afeb72b1bb60455139f44c046ecc121354f1a9507accf5865aa1268448935790cd1b02604cd800f6f2f0aee5adda9bddb6b5b32e0504e2fe2012896ff9b8f670364ffe6e563e1a9a19b491ba3414f779863bc8bf411ee0e8a0e6ddf1b4d4a70bdf6a9a743818be75628773558bad898e4842fa9727770a15a6aabde3b503709d1e9f602f6fb23115aa46706cc78e48bfe57cc1fc4409c4f1b5f440a3281f955b73eaa662adb9fffaa40b4a8495659625c6b7b51218df928d51cd66f59c25d7b94b798c9fb6e97b43ade5f4d17f59111deeb03d442edfd144f26d3df606",
+          "padding" : "3026300205000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 158,
+          "comment" : "lonely oid tag",
+          "msg" : "313233343030",
+          "sig" : "7dab5f7f0430ba2ed6dc53d9db80579ad10343b72a9d8a37ce0bb38403224a4abab252c3a0b5a950170d2f663ff4a8d03217e289d715b27c069432c5fc9591972f1b4ac468ab8e933c1fd4831978c0381ff9b8ec85baaed76d1351a8abc38a53329e9c8bb3c1f77a8bd15c29e509b198d46bb28c8d98f03c01f9ced381d24ed9d28ffd1d2eab5416ed5754ccbfc1214b5ebc3339f5a6d667581fee46d60eaec42074de8200d71e1773a9c83061f2ba4b9a2475f552f9ba99fec5028a020f4ac2208196f55c9fa8901c31ac31fbf671be577c9cf64f7fbf3ef7ed60132f2a204f6589d23bbcac7a87dcd46607871988b5f9afa5299f35562d58e93478f1d973ab",
+          "padding" : "302730030605000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 159,
+          "comment" : "appending 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "7b677618a244ccf2d2b9ad60413580b07be0460cbcb449e663f1d3504772c369684eb6fa5a3a18e2bde19f8f2584a3a3204bc9026c492137738058ae433d68836889e72aecdbe0385c9fd56c4df102d979f7ed6b59c1be1627575be24401bbaa88ec2346f6633e8b01afff790a4ec4bc1900214d8b9d34f29e0a548e3acef57c197425afac9e4dc2b9d8b9da30e771e34740e5780a52d028ff2016399f78a802f032b92e9f1c4c9b9d8ba9be494f8e652c43cc0a0b4952b5d03795359a130e4cbb0708dde79db136f256f1dd885f340e7a870fb4c3e8efe2bd20deb63fc63a01a8e1161eee493e4bda9879c814d9f16123071dce45209341c54476539a9b1a2f",
+          "padding" : "3033300f060b608648016503040201000005000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 160,
+          "comment" : "prepending 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "2a69e572a00d5d2fab1f91c04c151ab21e1cda5a7675b9e6f67277b120781494f5ace1ad3cdf78e6b6022eece7db55301f5749966c89df5dbf2852bdb182a75baa295697fb1e78122400d013e579cecf3789396102aa494623b5a4145c9bba954e80473fe613513cb9fcaa6792ba67660a9a754d6ed6e3568079a7966396794c1ab9016cf980dd3963179c8f3f0c010f3f136c4b611170fc11c133836cce42fd43952c00d3a7dd868b1715da5ef403e93a64673b15ed114e671caac4109bd2392b43062434c19a68dfbb71938aa8d45b96711950380de2a1c259d770cc5e98ae79fab1a7fda2f53e3098aba41b6fc486b521eb330bb226d0f95fd14aa83e2b14",
+          "padding" : "3033300f060b000060864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 161,
+          "comment" : "appending unused 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "36536ad1227a5d13acae18d8233a00d21e8064b14964a6d0fdb43ce46a76b9ee1749d77d82227d5bbb031ecbcb2030586360460ce3bf14c7a4d1a0202be3a46913913498b3390cdf96ee89914e7e78548f902a175a7f5f35b48838add2418b25cb7f919c1a0ca558f9ba77dfb6e4df85432071ba78fb6fd0edcd343f8c735f061ca9033e5b3441756188ed588564902602e18745a5ce8b57e3af413173801ddf0cc914d1b4d29e3377110a7b844be6c19773f9db22d5b266b12e8e3d4833b721b1497fe7194c0fb4e3d83ea9193e0a12053680a1396ca5fbf69a717758c5bff5b794ea18e56c0e82af3a1b97f6420f4d268f298f75d7c3a7b820d5557b44d035",
+          "padding" : "3033300f0609608648016503040201000005000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 162,
+          "comment" : "appending null value to oid",
+          "msg" : "313233343030",
+          "sig" : "325957b2999e0ee32b5ef7302fde0299c7c3647ee225d51ff330f7cc67b6b406cc4dbfd6a33ab2c831c78fc01685c4c3bea94f2194cdde48b6ed1e87f5984de990b5a8525470dd23153e329660bf31e433159addf094b6edac8f118d9fe59c34b83db1dfd26df7154d13e874830e42cad61cb3186fa80b54b7d7ec9da3274d2544dfb42bd8f29a3bcf976752589ece5b731f63f3b072b7bf95b930fef428c121560e1daae7d8636a5f40312786dadb81c07577d4a04ac94dbaf9b161a7f8987fae51077a7caa74da3c84e46c3e1000f2590ac2b0c04d17a7a3cbddd639e762e80d30608289bc6b7211d69af76602d2ef33c5750cb3c183c11450a3423d6dcf4a",
+          "padding" : "3033300f060b608648016503040201050005000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 163,
+          "comment" : "truncated length of oid",
+          "msg" : "313233343030",
+          "sig" : "5da303d9c88ba80e7df9c1bb650e8317c601676af8fbadd86550d15da9aa9f3d465d2719096e738e922b8bbd1b2e032f7cdebb111266814641fc45857af8b10ebf328c9a434170101a04be7cb2559394debb8a5efac20c6ed858b13d185536270f056913790a4cd269c424075183620c6a312aca860f7d3d694bf5e969fd0fb9333f7e42e8955ace71d957f8eb9fe1965117684c2e73eb2dbdd97c1b2f7802dc68fb9824254b128055932399c796dd3ab14d62b917b7520760e678f7c5eafd82f6510906d959faad867c92a5bd8bbe8c1e64a34025621b20dfa166e37251bda6e76c296dc823acd8ddc73aaa29a5572fac2344f8d213c21e5fcfa1e50b8b2eba",
+          "padding" : "30283004068105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Replacing oid with NULL",
+          "msg" : "313233343030",
+          "sig" : "73ae94e6749a14bf9e157305231ca7941d8cc42892410520060f916e1de657e11b50e42a4766c5e7b55494c605ad3324e78d80f8c4b31b1055a599a3b31843c900980ce057cb8bcf09906c8832a97536fba159723e7ef271a8017545bea5bc0f3cfe19f967f9ecfe0bc9f786daf5367be00456f97d4f3b69d932fc5d119779de21f7a4e0a9e80b65bbee18494c4c48c4be3a62a19b483bd56d194ff1c88cf146c2eac3fa2a05afaf3a813d5efe29342f6b0fba81c1241d565306d0936699dd20248689c5b6b4ec2f31a12c0d5909013ed97799c47ef089b9d98ee7e79c8d89d7a27563c529917977ff12a0753bdf8b4f62b660d33f7f6da7860ed4b021f51d01",
+          "padding" : "30283004050005000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 165,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "468c5f910fbcd2e2e412de22199a9ec2e46d084e2450e3752e58170fc7a7cd9870c24859ca131b967e0a734d555a78795ada986a1b13b81ac3bc5b7e858fb3075708d2cb03e4cada94455970fa7d849479ec8e5484270196147ac77c20c0a14628b8d3a69388973e17d571005ae218fef67c70f62436ba32e5a53566ff6310944417c7dd0f7e1e5aafbbb9d4d0853d84624f9d6e3c8078c17c34aa16f0bc8971580f456c2dc49f13af44cad2e3dd7120b70d3bd2c0a0957d5a739a95932b24ffc564bb94d748242cb95875814fbedf58e8c036a516b540ab62a7afdd6e3f304242173fc69ceeb95871bdcd530d53b7145459ccf41afe2c8ca9ccbffa28d405e0",
+          "padding" : "3031300d040960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 166,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "9e7e0c0d929bc15ef8ad6b64f9dfac6a7f0b55942eca76df1ada99e443fc3925a5dd9e2b25befc7a9e1c09c9d9c19a3bb842c0f35e8ecd4229807012de47130335175d6f558b79aae6fd7bf2bee86ea2902fcd9067927f485b007723af826511d1a01042ed6a7a2b2c558c929a580cabbd83c5676e1af860c596ef784b043d5c5ed963c859761499111337cfcf9d4cdf8a305d6da83ac6239a4b2c16281d1f4f30a06310bf4237ba6594b93de279e8fda3406bd5c7be52a0d3cb2c7362a6ba028e74572c8f21e3ebb608ce284b4b378b211ccc8f42471ee86923f57fd7c2b8926c9fe0a915e160171cd595b37924ebda6ee187f4a5e7e4a63161e246f27eb829",
+          "padding" : "3031300d050960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 167,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "92617dc932c110bf61e88895560638df4f8d05172f435af4457231ad08a5650f1f505604029f423028247d4231c86af51db339c180177bade39076dc67f9691fb7234d9b8c097e650ab3f2822414757f3633a047c5d5082eb469c35757678be46db32c4cb628f30121fd8f5894eeef27707c8689ada5fab7ab0c2e2290a76a1327828f41869eec62c2c03ff50d95a678bd95bbf56f533eabc5474df2f23ce2f8c0bb71b8bd79e2dcc28a682ea34eb20e670018becd44200115ae5116664cdd0429fe227fd0d599b60c6bd3911082a7428ae1f57bcff5b9377fb30994129e2bec9429d6e613c1b527e9f51c6e9921f59be1763dcc210cb2e4ce86297b774b1a0f",
+          "padding" : "3031300d070960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 168,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "144d33ca3e767af7d1cf7de00481c6dd6541189cd4899cbbe3125463469e8d317018d0feeb5f3c875a4b7217bf1128f448068af845886de43a4bf4bfccbe7f4d02ec30569760119ea1446ad2937a0ce28ebe3cf65b8212cfac09d19988c3ebceac6ee62d7ed3d716e12517f2c9aee98561ccdc8e7430c6f9f48e13e1061e18c02d037d22fd4b40ca203b7eecea229d155182fa8c4d70905ef9b42885fae0b99bdb945283be021a521a57de94958785bb9fd8b9ff5f7a334a0062892ec1967db6db2f9d9af726432162857996faa863ead0f7ed761643961e80192b72c7bc2210d80600bdc5d9d766fd4c1e82053f42c54e79f2605705181a4d7039377dc36c02",
+          "padding" : "3031300d080960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 169,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "8cac0ec2416e1ffcb37acb5b86227e5a6b88b7e4f50981aa54a1ead401e9b968f68b1e0278e55300070f3f05963cd74124ed58fa3969c41c5106a145490174001338c504fc01d2574384223eca0a755142697631e59556669e686b6ac89561c283c855e6ac27e4c9e4c6989c97d86f7f9ce042a65f20ea442bff4f6e3025854a2db562f4a25e2e9d0cbbdca056c09bbf2308c3d34a0c0e39b932cb6c6ffa47f471f6276439b320044c8d9d00dffd9f01442326a209fc01cf034ab84b0d9fa8f63c2c342deaa9baf32b904b66451590febe4c1821fd6b6e88a5c1307b053cd0fe9040abc3257766a82e4d9c6f9a059fbb41bb7116bb6d71e6fa778085930895bc",
+          "padding" : "3031300dff0960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 170,
+          "comment" : "dropping value of oid",
+          "msg" : "313233343030",
+          "sig" : "8cf2a2d4f7e3bce319cbf1f2611c9209edb696e61ba984512067db8a91e7faf6bd1bc399cfc9e7e744662d07437f677b1fd04fab3de3f9c89499d4a15a90c194048b7723ff22572acf54187852381c3453ae11da318b92513d3544e671f742bbc3bd69c8552f1d4c58b43a6f7e6bfcc9eaf78f9b94cf59b7be21ceb2de33e50e50fb8a4592441e0919c621477a49f87d5190fcefcf4164ff7d2d5803f03a8dbdbe74258342e50c33fe307294ca1ee3b2dc6f400a12cba00002871bbd852e105b350dc11e4b551182ecf2088cc46af1a899e606bef793897f538792a09901150cf40efdae87e838d6c2a5ac84771599daa0e5ed9db1cd35468ab3b5e2c12a6d1d",
+          "padding" : "30283004060005000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 171,
+          "comment" : "using composition for oid",
+          "msg" : "313233343030",
+          "sig" : "2dd458297ce1a8845a767f0a1e40bc30d3b9b54b4a82f6240a3b993cde0f70695435de7973ab17352699e8e383391f17f35caff60e64587e2714fc6807b00e98344acb71195e20673d7ae0360e2aeb66a5831e1165432534f873c0f625eb3aba9307ecfb7a460ba4e28610a7242cf0f76a73e33d6b15c489e2755f91cc4dc47acd6e9261a2e34641fafe52da98a10e4a8306c843ccc8f1bc3c98f1b4d7e3ebde5607243e4a4bc442f87d2a2d09a83c9acad25e558dbb72277512b284a0f93be155172b9f8463e27a701b3616c3021801f893b72abf7919f9963a20d151a5a8d0bf2dbe528d199084a2d7d4f3d1c0ed5893117620cc6800ad3d7d246ca074c54b",
+          "padding" : "30353011260d0601600608864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 172,
+          "comment" : "modify first byte of oid",
+          "msg" : "313233343030",
+          "sig" : "09b1fcf9a76a1cc0819fbfcc70d54d52ec5c5007c13581415b742cfed2185c2a26784aa85a208dd4ed140654df11436c5487c170bb213e9898650019848b26413f8dd6f0aae6edb41ac017c079b63de311fab7dcce522b9361feeb941e9371bc20936689d0a7e464c869ff8db1f85890d604e814a3fa9c39d101bf7a4b40ae89e122d314462606f8a5e5039f86bbd3da35f8d213b64fa82aff067817936da0c009d9f724abb2060588f8ce3bdc13ac587d51a197acff533d0e4e03083589d1d7363827c34f2616162b085715417d3b8cb1782c04cd0a37dc91780dbfb5218d674a2d2c1096c2f05b28aaa575b60e38123a8ed8d343ef95f777081eee898ea455",
+          "padding" : "3031300d060962864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 173,
+          "comment" : "modify last byte of oid",
+          "msg" : "313233343030",
+          "sig" : "889bcf54a28525d32db03e8452c6e0f0aef9941716dbff0497014ea9b0b181be70d319574c24fbbd752dbb9ffce4b198ab43b950b05c2a1288542b6052c557c87450168e4cdd399ed8d9b7aa7c841a39b28c7bef5bab0f1716e8e9de9a15c1132bc12cfbb77f237409608fb8baaa2e851742655e272e03f28866723b202d639f28e29372f18579c4482570b3816e037f8f256d7a95116988b676e0599885cea80d3c24b6984ec8080a80af020e7d5631ce8646c9d270d4a521122c009ff626d2c428b1b8334569a7e79aa64a5dcecc7c7e4881746bc3754a87fe51018cb401bdcd6982c4fb4b3782008b951847d64d3eafe4e974bf61d215e63b750313163c47",
+          "padding" : "3031300d060960864801650304028105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 174,
+          "comment" : "truncate oid",
+          "msg" : "313233343030",
+          "sig" : "14dbd0f32a7fd64ca18913ef840e113d7bdaf22aea671414c9c44de02218b474d6d4867a9a4b6144bc6274deae6f615ddfc54a9e74b4c657187c818781e399798db8e62987a128105086fbcff4d5a06bb43823b1f754e485dc24d9f952d1d4ede9504c92a2511cf51e68eb67db959152ba1700af0e0aed533246d7ce9e0c012eda62d66ab5be82b0ee5fe4863d3c16b59ed6d463c382b25a9c8ace7dbb26b125afaf44bf93edf6a63942b38f40deef43ae354934056917c9af6655872b010b0840403c1cd5c053355fabaa23ba39dd381f4867a2264c476ba67d46767c546ed3ea59488c5500c79cf5e0670ce744c2603e01e7c53f452c22ba15a8c5930c61e1",
+          "padding" : "3030300c0608608648016503040205000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 175,
+          "comment" : "truncate oid",
+          "msg" : "313233343030",
+          "sig" : "4bad954b43b0fb966ac33ed7c8ccf2fa8246279677172b39854268b3c2a3fa670840aab9e0f53a754bbd105f2e52a29b132991ed814cfee0a102e293451420deac214bdb5a574f9cb4b3661b10f6804f5c27d1239556413db01cf123132882972d04b9a0b8d046b8993eedae811f67d9acb9e28b3ab4b6c4d0e42f85879623f1901ac082c93ef0fbc12f3ffcaf252c8953bbf8abd6fc01b2f272e27448f4f77fb369f2c5215c7eb68b2fcfe2e584fea33e505e22a2aad0844d1c8689160a19ef377e7513e96dfd4efb1aaf180b8d5dd8e6168cea4b34156f2ee20a97deea0fda18c6438485fdca6c705806d7d48ff93f3b8dcb847eacd2235ce1db391bab325b",
+          "padding" : "3030300c0608864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 176,
+          "comment" : "wrong oid",
+          "msg" : "313233343030",
+          "sig" : "9fc7331e80dc59018c96e65ee6576a82fe34c356de829c7153cb3a492835f55f3a6c89d262fb69a531ab2dfe2ddedce11fdf5c0f3308828ed7c1c0200a03a4ddb034077e543706350f25e7ac6fc35a66588ab0a42f2aa0c18f82c93564a35f4746ea30a4c4d18ae61dd641ceab66a526ba0a23d36f9c4851a358e19c2b9b7abae9666616a909ddf93e4c8f095c6f6c5508b65ef2f22242be3706a3ef9404fcc6c3c49b02461420a7ed8cb48cd9ee1ee822dfc37cf531d62ea14d50c2892421821200e82ac81451155ee8bbd21828993669c68f604881299f88500c369505bdd03c0951cb8e7635ad38e56d82e55eb3fe09ebd2b58d44795d86ab45442169fb7e",
+          "padding" : "3032300e060a3262306530333032316105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 177,
+          "comment" : "wrong oid",
+          "msg" : "313233343030",
+          "sig" : "0b8daaad5184ea2987db1d6606ff2eb33f5c9422269392647e09e91773b8c8570bd73963cbbd8fbc0c4788ba95e0de2e0947c542a7a7974daa3dadd807e8c7024f98bfc892c90c3086dbe49d2198a09f659dd4a9f7ae2c0fef7827b2d739cc426885a715cc6a962da140cc9e72eb8e452e7e47dda32ee7b5125a1b811a14d5ccc9e3ad39f145c81abbb390d61d0b10c8785aa67808d02b8bd81aaaeb8963ca21996a65ecf60ffe8bff7f4b8db2d8be0eb0a35ba6e818d2fd6a22db1ed04b71482aa51aa0a54dbf7cc5669fb2be5cac10b3dae866ad4ed188296ce069b8f411104e1ff9d3e47d535b2e86f9daaf5cd7bc1729edcf2344795293552502d2ea7bca",
+          "padding" : "303a3016061236303836343830313635303330343032303105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 178,
+          "comment" : "longer oid",
+          "msg" : "313233343030",
+          "sig" : "9c499c849f5d3708dd29331f152110e04c994a343174f364dfe76bab69cae0b2fed36472ea368b9c2c11687e28f5187e924a0f14825191adcd2f6521559e16f8d5aa7801379fe3932ee064ec7fa74f318479e5a07dedb9363b9bb8789f02e2961f634f685c0fdbc1fa54ffce768ff87c550fb2f5df7fd5fcc5c53f8a5915dab8f416dae759ab034da87769d4fde3cd4184717195946c709af8d42e253ffefbf9545e943474cf0c1a3f23016e4f125e6882ee72bbe81062c29b5ad0fec58ca21f88dd19a7bfdbef2acbf8e3f76aafbc93829a9cfe62488bd9fedde2bef43e774c1e38d3f2153e39296b30a7dddc55b079ea3ab716ae16953936df42638b13bab5",
+          "padding" : "303c30180614363038363438303136353033303430323031303105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 179,
+          "comment" : "oid with modified node",
+          "msg" : "313233343030",
+          "sig" : "5614741c87cdc959f99ae020b7e48b16e485e9197feb8be2778090be2d81cf6c816601bea90bc2a49035e67c66970328b9924b36cae255c4a81c3652f514133e18e6e2a75a33b2a49b8f306e80ad4d84cdaf06d5aae5b550ebe8beece723c1b37327aff25074a1f9db0cb2a7a798684ef45b691c735f1375136372cf2d69806597e8dd208a878e4a40e08b54713c27a606c2dc450f4eee893d9385284de1b31221d3d2d78dfa586f142f82d273d534bd7034d12c70e75c9575d361021f38d765a49d8c6056da1bceffc0492c7047dd73aad77132f6fc2988d264a303d393aa16b7d989eaf4f6407f847c2956bd1e1fd3fa2398a03af3fd9492712e4dccdf113d",
+          "padding" : "303a3016061236303836343830313635303330343032313105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 180,
+          "comment" : "oid with modified node",
+          "msg" : "313233343030",
+          "sig" : "55982db3387bc911e8b9a26b342534aa7c0022d8094d5c9fcbe550807dfd400b161c9e65634e5725fb5fcb1906ff85c11ffd348d365f2b76850adc0927ecefd26e457e8e2c10ed1c70b0d32c11d98002428cd15590bffa81579ba8938228cb9d899dc7220b9daee3593691c5d1d0002bce9f52ffbc95c5803d669936227d8f1e9c73a75958be0a04cef8df30b85ed6ad005477b359d88b010d9c80a8f83221e896924ce04c16b1db9dec202355a9ae6b723a7966db26bfa3d1819365bceb73c66fb501ba90e32c85271d4ed0397c52431b7cf55ea5551f295117f089e3c60b0fa72a5dd1c7424d4ca6a2962f569198e6bf0928a743396ea58cb865c1e3409522",
+          "padding" : "3042301e061a363038363438303136353033303430323838383038303830303105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 181,
+          "comment" : "large integer in oid",
+          "msg" : "313233343030",
+          "sig" : "80f361dbcf7ac9c30a19650c774696b5b565c7874b3ba1fc7e6aed0b685443092136003f8f536f35dc26a1e611d1a85e0bf2372088c83d157dd20d88176b3c8cdff1b7ad066b26f4ea9dc18e107f290475a7a5721746432a0aa6b325ef0569a93321c3b141465ea42dad7ea0e5c2b94d64b01cd295e3d08c889c021615bd1c14311fb4f19c82f6404bfdce07e7e2180431a13c233a1815822b4004edf3a1059477937ae609970bbd70f583b4cdde521cd5a9d0c307c21cc85758bcd238057ed50e252365a36e64ce29c2d089b039a8a6b1fff51323cec688dbc6cb635afe50c0d404838d23398bf8cee82d54c8ab34290bae21fe2bfc5ccd935b5f4c4335b66b",
+          "padding" : "304c3028062436303836343830313635303330343032383238303830383038303830383038303830303105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 182,
+          "comment" : "oid with invalid node",
+          "msg" : "313233343030",
+          "sig" : "8fb57d8e72232bbcd4c737521cb402eed26c264c3ff14de0a5dfdbdeb4e65eb4e7de957b51571ecef1534fc4d850b257bb5c8820997cf14a273c447e9e940251fd17c7d14662f447fa96d34be1728d47799318f592a76510577f18bc30343d35fab9c09720520217358e76f16b2af8feeab3ec650a02c814b2e8614efbce52b501c590db9a6290ae4ff0f7fcbe205a94145fb32e5563ecc0717b1e9148b4a9135a5cd7f1f7c1580ead8aee1e9d492d21f20495f75e67138676f1231468967e7f482a59fbf42433e63effc334f92f02f806492053a0429a5b99b4cefad7f29d4b3daf2fff7d38d6095a690dd9109d5d63d47f5322b2423af5f3c20eb97c1dde53",
+          "padding" : "303d3019061536303836343830313635303330343032303165303305000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 183,
+          "comment" : "oid with invalid node",
+          "msg" : "313233343030",
+          "sig" : "3f52510fde9cc0425aa29ab11dd95bb0063c94b9e835dc4ad839b409e1cd8994c87ef018e0dbc1571d3e3e321d35d88e2694bbdb9422c31cd64331945a8f6133fb8079dd5cd8a55ca761a88f280725f6e13c178ea94bd7b7395b4327d572e2615cc60366acffff56d3f555397b2cc348844c42dce283c948c28fc8d077d07c390b8c78193dae608056c93950cee202d68f02b3d8fd58026a690cbd8a95f4d1f1fd15a19e119b3340d02710faaf1ddb66af60fdd5dbe8f0cac69a370cea0a4297a8a2ba728141886f6aea3aaa113a42b6f9acb2fbdc9f7a0eb295066a1862b75acbeee9eefa0adf208867cbf173aebcd4a9151a657a041577cc4265c0c1ff9e47",
+          "padding" : "3032300e060a6080864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 184,
+          "comment" : "appending 0's to null",
+          "msg" : "313233343030",
+          "sig" : "78e59ab23d412938f10996b4332f5a412d85b8bb8b3d55c9d017337357823b3cc83d2d1f2b9fe0025fd3f898d2661ac2e7d7a834465f096a0d29315fce69ecd15241750df027eb082d799e4d56497bff65a115e69c2cc57cf1b5e1c62edb25d8646fcc89a74082b9ba36c6aa92ddbccae8858ecc06391f6b39ff5a740be97f012b39f2d48134701cf27b5172297d217e8eb679732253591f45bdf97957f29b596f27ec29f7c471a966818c50296ced411e5010fe6da1c26b9e3489316cb16e55f8b65fc5a1b1bad4077dc34c7c9730402205f12e4e61983e6f5ad163324345a59381fbc3cadcb460aebfedf15323cf1be78c45198afcc803719bf13e42ac560a",
+          "padding" : "3033300f0609608648016503040201050200000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 185,
+          "comment" : "appending null value to null",
+          "msg" : "313233343030",
+          "sig" : "46412b003a67d7cac1dc7992d31259013069a1aad4292368ebe0e597f41883e8291aaea88c2a8115b47fb87265ebb9eba6fe9006bc1e34795a1c2bd8a39c46a28ad075d5cad833beddcb116221411efcb8e86863063b5f6b5885082c8fdb6501e708d734df29c87a723e103b3cb487138cccae90c7431a16189ea8971ae152cca07678491c5b3b68d88c4de18ad771fc252a9bef889b963b353621a0d52ddcd043ebccd4bdcfc5fd4f878aa2fecedb11236de9f44cae8559668f9d035f7adf90e03a707d5e0f97ae84c2da6866f85d49a8dd09106616519df0f5d94a59b1199ab50884cf6d912a061c7488fb5491df32c58d1af741a164a21c5a271feab9a2d5",
+          "padding" : "3033300f0609608648016503040201050205000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 186,
+          "comment" : "truncated length of null",
+          "msg" : "313233343030",
+          "sig" : "951b3c537c26d27fe06f602bd224906b1c1d26e41d22c7a22479f11f913978c9a0f7791eac42601122e6a812730cfccd410aec252b203cb0020d3998fd6bd469e335cd664230fb6dd59e0c141dbca861346ff2af394d86b8fdd2e6d5f0cb3d942c3393d917d62cd0148ba82666adfe4c1d999e1a254cc466ce268cc0f14d352e7b0bea8548a5b6fd3745a81f15a72b00d278f881a55677fe37044394ea83630dc15f794b4f6192b7546e841fae0cdf9c00cd3a455596fe9c5fa37d3f3973c58f189db8d39e8ae149f57bdc0b16f9853b798c87e08ae5ca75e89d4b4f3baf87c8c0b699e8c216509e51ea60b52d569491b186abd2365ef5cab983f71abb233b67",
+          "padding" : "3031300d060960864801650304020105810420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 187,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "4b75061a5487fe328a32c9f454bcd7e40f234cb1acf55f7d3bb8a50ee75edb8b4ad16c46b8da533792983de2dc2d6371d7eb08762e2bcefc45467c82130d483819ba06735985b26a19c391f94f854e31e56cc09ca20d542e62e4474d40d5000910a9a24b1443c66451878656d3a5f00a19f476f1c9be86379036555de05b3198f749e40c51e87772a5ecc59abaa9e9a8d0a1681a3964c9f022215a71be814c8859a63b2a62caca2b6e98f5b10a872bab1ee1c00bf0d640926b867a87640f64402596df229d7bdb74f1e39973aeaea0661787a3878b7fec9d31274e227b59d14b1ce2f707da4521e430f17d09fd6e3d61c97d08bea35631611737780f2ac40bbc",
+          "padding" : "3031300d060960864801650304020103000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 188,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "490cbd8f51a6f8aa64af8eae7f76ba045aefefa5bd072a3de5590d7ed120f21aa4f91decd13ae7e9f414bada7916ce26854cb8cb0dc63731c58c94a9a9e621163546f19152c6666648ba9291f5e477ee86ee735cf326958afc468ef7dd9a5b2131505c7fffd17dbb7b35b14cb81058d533c7e9f6ede933825dfa689457af1e1b6ded479e1508f167199be1d8c640d7373283b3fc76d7c3c1354ba725eeab08a24b5529553dd38cef48b9d45f2b90f9aba0663839de4de17e2a838e243b898cf040cf6053a3be2a4bb346b1199a93bb8295c9c4e1ed40d0a5d5628a1be1ba21f45c1c28b936452c3e163810f0a20fa717dd484e46ef92477853592ed3fbe71da5",
+          "padding" : "3031300d060960864801650304020104000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 189,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "7f23aa1e2965383e38563ab246870c43817dbfef46b008de4b1744e3610b1adfb89c96ca9a9e575edb97c471861bf613cc67428234dca7bd72c422f0c75877da341bae476ff43487b087f1bec13d31fb777e94bff6830527bde2bbe83578ae2173fed5a03f142c2a41b8ee8873492c21b623cb8143134f9de25872b39644fafdb1fc96ac072935efcbdcd0fa5a97cf036248388946223399053770197b886b39673a438f67b0ea789b9d206257f9a3be5a13017cba89d28ea493ffbfe596f9f5d040ac3098a9d968198e3d004d79d6d704aa42801ad6de597cedb3676125e9a23f971083b2bff18e42aabeba6ec760ae8b8c19fbffd18947061d44060f754600",
+          "padding" : "3031300d060960864801650304020106000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 190,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "13db6c6f0fae5be1caaec197b79dcf6784582e508c7e0ed3e56c2674e8a74c0b542beab6b7dffb0773a87f00e4648332d4e9771ba85df0ac1f9ca2874dd7792480799209155773e39f1bdfaa561b2d8133f67d47c96275e6b1098d1b56a8b8ab5525c14555f4c9b1f241be6dba874e5d794d0fecbbd82a624b7d31b12bd60ce27451125594c744f7f32029c6c7cd0663627b99f7c5636a836e115d0c55a44f62775eb19444020506b6988e11b2726b2330471536066e1f0d194ff9e6e457442b9154261eae83a178ee2f1eed06ef36e417a04cd007060ab83c53e28056fcf49a26e022ec2baf2badba859490243a0d71e5de61c75d259b53cd3baf7675a1db0c",
+          "padding" : "3031300d060960864801650304020107000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 191,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "6a0b7c4e2b7efa7002c444307bd3848306d2ffc70c8e767a9d5b17dfb3df076c06ac0374a1c23a011d466c095184616abc028b74bc58b91df76aaecf8070d509d7c7b9f6403bbac80040ae854d139af21bf7a0909cd8e059b5a9b444b11fea701bb1e052d77c7863b557647c7d468fd8ac2f6540eaf18896284f56ee01aa66ad89fda43cb38cdf1ba553e63d4301869bf9ddf076cbf68fde5706787470cbfe78174a516c53ffb6d5d1a91ed78b4e297971f30afbb5bdd02dfbd1097128837541e2974be63541f8df256c8a77a3800fc340093355b5690326242b0d90b3dfe63160382fb3bbbdf9bcbd5b0309ca9d748a343f4a5f8a54b3a2736199e27386a4fe",
+          "padding" : "3031300d0609608648016503040201ff000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 192,
+          "comment" : "composed null",
+          "msg" : "313233343030",
+          "sig" : "4f611ad1c6ae7158bfdc5ade114098ab879a79e7c70184884f97dd875bbd6b1b869bfcd82ae7f3ee6fe88de98d813103df76f4001fd430de68b0e18c5bf4c8e0805f46d1f98e44112cce945943f682e1af1444e20a4f5e5ce05f12c00e4af3d871730d5e18609a7abe3b7142fc2042077d03e6184ce935e668570271ceaea52c36e553fe791bdca3d966c31299138a2690a671a76dda745cf2aac5e5153a06d89aa4396aca684938c0ad142d5e75e6615364c921c8d18d2841e9a4722fa1ef136adb3aec7be74a018ebd97d48f62358623a7c8d13a76fecfb0ef73c9477aa59ba225416582faad0d7d466d6de53749c3b51f1c55c92fa9a2a08b83b6dd42848c",
+          "padding" : "3037301306096086480165030402012580aa00bb0000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 193,
+          "comment" : "lonely digest tag",
+          "msg" : "313233343030",
+          "sig" : "7d36a779f2d88b6e0b55fd0cacda1295fea91d1fba45a992befd742c19f3d955ef16b6d2f5e8a98be0cb72f0aa71356c14919d67e546d69d8ff47aa393b8da04a3b73188b0980bb3a638c962940829a6903dfb28f3d68bae1334d2b63b11cfd22baafb231b5b93cdcb405b43a0c6e7a2cbac3c70054bd8e48f458893ae7a4ff62764bd17254aa4db52d67e7a7d1b44a277580786dfd9fb702efd9727d2808f4f859bab9b3da9d6a18fae30742857892d04a3bd001ac10d04842dfa4be2c6209a87defd735000d5704b1f754bdc254fc131765e573510abb5b7307eba62299ed9c3696e88c3a54cbd56305f2a3010b67ce54cf9e77b86ac50d69b8400017e7052",
+          "padding" : "3010300d0609608648016503040201050004",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 194,
+          "comment" : "appending 0's to digest",
+          "msg" : "313233343030",
+          "sig" : "0b7312cc652255319e75a857440a77c01a73de1cc26fe95aa0d6296cb037c79839584b67684f57d3b2959df2bed426eafb6b364ea283674b5bc8ff6f400298781134e56e080b227d47cfa088774ec73f478602c9e4a571ae383a572fa951e8b9ac66e86a532512ceb862339a5050adfe723f1c1e016a3cb944d29ff6d55f9056e6ddce98ee4a80e998f6fa4d535d3f42ebbb2382dcfd5bd4ed179240c2178019e184b957bceec26283575c00a9bc22f8a6ac8dfb99e85657f33a7f52c44e9feaf89ca7fbabfb947032d112dbc99f05badcc995dc012955a7b3169d9956cc091b69051c5f18b1aacaf30653599068d0ab6d380923fcd7b7c8435b88a7344ede84",
+          "padding" : "3033300d060960864801650304020105000422bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 195,
+          "comment" : "prepending 0's to digest",
+          "msg" : "313233343030",
+          "sig" : "24599a537c2958d7ffd18b4d935ccb1d045c8d10afd74452ddc10f8811023584950c546b9920f92cbfd0c08dbc85cacf6a16c76f6cb52bba27ec14837d4b3861b59b9645bba8ad588c07cdaf73d873004d0c4a51aedacfdce1bf3dd63c68e0f2c4b7c9d4f2027b7f35d60e9e2e9c913ab58a21f054f2a2257f46afa9cd300e16a37a4ee116b43f3fc4ca2c58dcf41a99f10835bb788d27f061fa790ad503a9be81ffc01599edb722aa5787a94c99904993676fde027c3395a3260ef9fc9195c85af4db3f15dfdf03178caaaeffa3e33e5b9c454047b2016a82d09ba7521e273b022688f7af5d885b2942a296f2d1bb666b4c2cb2cca98c7462de5ae85749119c",
+          "padding" : "3033300d0609608648016503040201050004220000bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 196,
+          "comment" : "appending null value to digest",
+          "msg" : "313233343030",
+          "sig" : "0a16c4a930b1abf1dcb5e65a48096dea21c0631fdf403c382de73326642d693159ea82831ee14be40cb8a15709e359d6838fad5cc26aebee85e50320cfd2c4f74da82d243b6d9b4212d2977259f36c5c08d31a75fdd920b40543c36b73c8c244ed1766164f99e2aaca92346705583f0b5df277270951a39aa22dc456417b21586b618043da2ba6835eb46f58590f4c21512db1e1965ec8e39bd0aac87c4473af7e1cfc3eaaf3fbdcf30055fd9a47058ce214aa02c0f96b2492c489c5b563954da1651eb7d4bc6d07d49346fcdf7afef5d9b649e67243f900ccb867452f54f73fed48e671fb65dd4f5508d495df8f54228a707e339fc590a1ab9527ce4f328657",
+          "padding" : "3033300d060960864801650304020105000422bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 197,
+          "comment" : "truncated length of digest",
+          "msg" : "313233343030",
+          "sig" : "9ef084bc6824070ddb5af82344467ac985d82e6de8b5e988f92ec1ab41ba5f41ede314b6e64b0ceec5c9e6800a72d79c1d64ed1caf2179f82764a52fc491e5cd20796f040812e38a15c40a4a4509367de92b22af477b2286cd5ef3587480be05b63c513df02c728c30051ba1770de61e4826282d82ca8d80125186870b17256f9fee25f81ff55a8a0a92b1648c09e9f58ac66711087126c1e773a881a10c06168664899bbf1d0e68f256620689f85f1f8254c59a30803966e55012e28ff90a07359d66a73b80945e016ba1381aa66c490662441ab6d6c19d330b4fe39838780be91c07f74bbdb189354557e2f9524856a466c948d350f57aa87e8e97f5bfe616",
+          "padding" : "3011300d060960864801650304020105000481",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Replacing digest with NULL",
+          "msg" : "313233343030",
+          "sig" : "15739f4caf4284e47e7b53dcc8167964f8772bba88a2692da445edfa2eb0f96d2a0a9f25be5f22e8658eda0f9e29881b47229c103bdc0f19f24560da6ed9f8f2c768bac88c19bde510ee301e188f8d86b3ea5d4ad9bc410ded0015213b4044d0b2ad4f0c88a4ea987f5829521a3283214ec3d7e6779f98c29873f302bfc58307e11dccd964fe0f7745bf2e4e92acc1d120342a8e6aab8abc57aec2bcf932efc971532057844758508e00e1abe74c6b6fccc083aaf862b939ed4771c04e2e5f8b7eac4ea4517e3b87084de8eecc6a3ad06ef87f5e4cafd4a1d313fd8e4b19c69493d227f09b72e1b65e08b40837b8c1d275743b699c4a49f3f59bf43e47c1125c",
+          "padding" : "3011300d060960864801650304020105000500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 199,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "0f9b7c0622ce7129ec1d6108b3664fcc7c5fb9e38163897ffc30eee20b5e502f64b2211d903ceb7e14a26ec8720a38cb2801dbaf4d86b42aa87347de85a21e3f648706afa774eb50d10db3afcfb1943d3cdf20240b9322403487baef167571acb0a035cfaa6aa1c0be9450c5a36c02373a6a71c19ed3e4f4941c35b4be82014c915e839f31c27c4338bd5ea954ba2433c4003bd2898ae197c8a276b10afac3538049630f0af67767aed14f646e0303c372ff4f97683f543d7be01960f1d772890e290b44abe59f4e218fdd7b324720dccaa33d380e99ca5d5dd53ab5950dd3aef373643e53f184e36b7f2b399bcb5c6a30780fdc2ee9387e6c13c537913910a4",
+          "padding" : "3031300d060960864801650304020105000220bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 200,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "3f070db7471e7d6c9d32dc5dd19bcb518fdcf2ef2d48a1724d6e3dd6299cdde3b5ed771a0f1a872d872e401373cdb53fbd7bb92a4a13442059f55bf0522d48539db5b52f67b444046a923c7dae3f07230d602bee9f29afcf4880f123d0363de4efc18f6e4fa08610d4203dca4705d26ded912498f653a5ac8a811068c1f3ba547aec31cac73825540e208438e22ee61f20e0506ccb0d6be3459cede4edb91916afd453eed5088df58e023c6040d794e3cf7f531fbb8b0200939ef7c035320356c491c0851a598dc6984c8d98533172ecce1622b7010e49083b5d10ad71c7bfd089ee5695b42eb263b005827928c3f93aba26fe7b6382df948ba761de80dfc187",
+          "padding" : "3031300d060960864801650304020105000320bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 201,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "96a45e04e0fc9a701e680882fdffbd56f5ca0067b93e59f06fb9be63720781790ddaf2d6a981d669e8eca75d5975203c77bbe7cc0e4254cbe40d5d59145f746e3d14f1e393600a150471c4f3f288ac40b8d53de28dca2537dfd1265803bfce7c423179e3483ac86e72865707b0e9b05a8f6f932044b90dff67c444286e8c9cab31df8f70f0658a4497e596526572645b282baab02462e5f34656b0d22d94370339cf52408f71105b668f6b7c37020b12e807c05848b627246d94789e2543a9f69db7ebb1172203c00495ebd64f380ebdd1a1180ea08a323ec88972263e7ee2ba644ce3bfadf46634fae4a2e149bc275fc798f021541145cb2783474bc4060e6d",
+          "padding" : "3031300d060960864801650304020105000520bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 202,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "038c6f8d890722a43126f4d9a053e45f2e10447a62cb931bfdd8b14b342bf651482fc194165853fee8491263e7a7170d13d56eb45449fa09c3c2b2df0dcf51e823d24f7533a348ca00acf910fd10fe2dd9b1ba5b46876763db3a83dcf6311cd9abd02e28331b433961c55c2fe1ad51ed4a4066ed83a0f03b619c411dc8b4542297555d468f6f083331c55b85c89a44e0aaf58c7c953d92f0797b137253061c0f218d48d5cd30d7bd47c7449673304980979d79adb93b91c1eed4f046b45d05f1b3b27eb9e62eca141fa6ac866ad947ff3210987c7d75275362ccbad1792d68d3b8060c5f089aa2a07f06a164641ff5288ac2408bf4c3a9a934f264f962fb9a43",
+          "padding" : "3031300d060960864801650304020105000620bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 203,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "682f3723b4d560faaf6f6b52fa4b387d9b94bf4c436dbee647efd892d661b601a4df467e192b489ba4f3d7a2712da2b09cad25cc3aab2af21ab3ba0d51503c02a577236822e31ca2cf382063d60229003128645ed54ba9813c1de735506a1a63ddda51c3320f60151eb383e56bf6fcea8f6def400305a55ff2103d3697922833eaef804d65f9c1ade60fa5b69eca886b6d472626d444efb74397d37d2182df0db192d382566a6cca3acec93495a61a0802c1197a062b0231f3aca1d1a9e1482dccab4198a0a9df40aa1b354a4e884174d1f4f517776e1054286347623e3b123528b68598dad94cfc79e7a418493eef4db4af8237950018881ec12629f9cfdf79",
+          "padding" : "3031300d06096086480165030402010500ff20bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 204,
+          "comment" : "dropping value of digest",
+          "msg" : "313233343030",
+          "sig" : "321fabda209fa9eb11a555f2d5642274ac93f47dc6b09dc98d870117945e0ec326da4cdd92c9262885387c9660bd5101feeb536bca7de135d517e4c9163672c86e9d47c7ca05e8f6b4d1a472a2a91565029909bc7b007eb39e8d6e6a28c1b80f7c289431b144c99da8264420b8a22ecac431daae7e9627665c64e93c9fd38917d27aefcb74015bf2b4aac0abbf3aa2b1be74e4ea28b4bab05c5181097e50b56e2f3c2143914780ce7b4861dd142b0432f05d23ba926c51a91cd875e7cbea9e65ec7a5d2ef9128eb9857b290314be39b7b9e102f3d3884179ef16fe98fd9ad72e9dfb62a8a5ae81a9f7831159fdc601101d20293ba20042a7736dee9448077c0e",
+          "padding" : "3011300d060960864801650304020105000400",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 205,
+          "comment" : "using composition for digest",
+          "msg" : "313233343030",
+          "sig" : "656c5b616e74f4337340a6ed4db988edaaf677dda18e9871806abde19f26231ccadb30ead180ab3cfa27c74a7ad40eef610d5c99dbc321b049417cb9a36b27026d63940dc05149d030d0e9e34e291416ec857f9b4736f9100a691f8f10a6023258d62e0e1483bd03166fe7640b21de04a533f0d5e9c726f4eda195db54409792889712eee58d56d0b4b2e70f90cb8edc2f55792add333ce591425a0f2a748e97331109e677b72ffd372a88d3518fb7cd716fcd096e3b5393fecd86206947168dd91559ad915874df3bad476e4ec8dd97884190bf6356542878c19e3ca7c7748fe7a639f863482ab230e5ac01ae85e4ed26036ec281017f7cb2f41cf02e6877f4",
+          "padding" : "3035300d0609608648016503040201050024240401bb041f5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 206,
+          "comment" : "modify first byte of digest",
+          "msg" : "313233343030",
+          "sig" : "22f31138d107f7f74ce012c46e9ac322874648bd1e3388d588098e952d7273ab97d1d17f265485eeb2ab0521b91ce47cdcb74342571e5ae103d228dfc1b967aacb0d4afdee4bbcba330abc3ad445e0e7d94ef39e05b4db732240af7ef1538859866750a039697abb79ce91d377a9907271ba865a64d57c4db4ff886e4e9b157d3e9ada5eca127478483fc7548abc1aa27f8ed088dd437ffa9d3959dbd8768b1d1c35c7bfa390d9aa6e8554bb990ac89da7e49b4bc086438be7670a5f9b1871491e2ae8a23f06ca3e7b87a7fb87ed0bb5e6fd64ad6f1af7b8514115af4e9ae53e35ebe90a5912c45d6dc3aa4b9c7c46a3b4d20ec48a7fae3a5ef8981e965dfcef",
+          "padding" : "3031300d060960864801650304020105000420b95a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 207,
+          "comment" : "modify last byte of digest",
+          "msg" : "313233343030",
+          "sig" : "4142f9fb5e58eb4ed8c1dab74515c643b9bc4a013373e79c0280547fab695e88729600167ceba6460d7fe8bb2885d6488f0d929be7be7528910828106f16cc5e39685450c8a859fd4b65a383dec054af0756e67b2ee0b2ea756b17e602c9f5ae20b062c5845596c5cce1b13572f54f251e2976c5d137168a6ade05a14227f719bab6c40da8e8015687099fe78f79eae35a00bcbaa56729f60b8ce6b965ad03cef2c33c3519f07c1dd63e6d199cc56be298d027231d0b6e8471038da9f26474adbf28d52c6a582617046cc678f2cb19abe5491cfe9c8e396477fdd878adf244fbc19d78e9419035f3249ce52dbf281622df55fd8b3cb2c5131591e1d565f4f0bd",
+          "padding" : "3031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050a3",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 208,
+          "comment" : "truncate digest",
+          "msg" : "313233343030",
+          "sig" : "66d88b8adc0caf4ee0524546be91a69aa3a7c8bb4f68e3a199b8d4b0a0cb52158f785f9ca26fa30bf5827524facff27b9f0b1ed06870c35033bd55ff386c4946facacd0bf3be3393777d3043e6050e5750cf6da7a7f4fd495262158dd4f6b0fbe01b601451fc4f090d03eddba5cb140fb01a65ee6912a8bb594f9e25a9b73608c058705a0a41b17ecea9e0016fa7128ddbc561285e3238aeeef72f8133ea6fdd755e3a910e2e2f2c4c5c7e1c7f608f5796b943f2e860f37bb311628153bc7baaf11d4f33e8aedde79f4fd080636739129dbe2a951725fdee5f32e471c9d267999d9a11bb13ad40b315647b3f7e91c373c53f845ba8db9b30b31d6740da10964d",
+          "padding" : "3030300d06096086480165030402010500041fbb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 209,
+          "comment" : "truncate digest",
+          "msg" : "313233343030",
+          "sig" : "9f24ecb03b77a906c8a865182b5cf5921a98f8002d1c59f7c398c469444776fb38d7221b386c5bee4f72ca5dc36ca1b08c2a21947832c4e6e7e755faa4ad61fb1362cc084d0adbed10ac8165f5e13eaa1f6c77bb2e058050b5f902abbf0041c1a3a93497a95608d9dcb5f7d4cfbb4c037453d5558f0f9bd2b1d3a769e2b651252e9054071dd34f065c0350524a39cfea3bb0dd10620288f9e5ca0c92cdbde4277f9961be882ae2f07b1b75f279fb48062945139cb28ea464b4e00b2a5259aae4397f0ce063321df7ef6045d4dad8ac0649c992bf2d22e728827f4c992045f376cabebe75e58e97edb43991bcb38c66009872a5d5c235c483d8d5bea083c6231d",
+          "padding" : "3030300d06096086480165030402010500041f5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 210,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "16b5347808defc31a231c28edac36a3f1789d4c549e8f5c71e2fcf5d5304ba437b4c7c0eb7ffbd80f5c5b2277bf24412b39ee3e74c368517717c438bb88b80b12ad14f7295ecf8841947e5e7457e66d2f869c30d28e9ac2019d7e5eca6229812b649c8b6b4ccd4e17b254e7ab496aa5325525e7974be348dcd53c652e6315e670236bbbef2f501e246631b735c50e388ea3af8bb0030fb7fba9743eb70fc6687cfdb92d46a4537ce88dba96ef52744e22fb7257af1538e3ffc4e2d9ac9101d6f71bc2f5aab71ddcc73a6c635500fa0a9174d25ebcc85dcd7dd85a7d2e8d3138effd171176bbdf23296ba3df630ee42185720ec141ceeaed1681a6ad0c156e099",
+          "padding" : "3030300c06082a864886f70d020505000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 211,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "0043058ff1d0e41ca8034e843d17284e41a93df84ec80c927a2443e954025f74630f118b683d6fc4e3c6b7ee4538cc6b4bbe3505f70ae40a336948f7da8d83b1d7fd4ae3541b885537e92e86570c2b7f622d2c4f63b0e0380e3d13be8ac930d06ac9cb1f3d33882cc235f93702a4118038a343b6da20914c40e52a2842009bf9c8312090bc2abbc4e48541a6b2dffbed3c1d51e989479d017c60e6cd2d76ec292e75ba550c1c195c6ce06c017e5349e10a90adecbcc43f71f3d24493796d464dc89737264dc102d1fdb9fa1262ca696528d87dbf45996b7087e755ee07075c8fbcb2036050c8946866bd972b0fa59a2995fce09e12250341a2e43d5e2c8df8c2",
+          "padding" : "302d300906052b0e03021a05000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 212,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "57d9d9356676927b5b073de32f930db717a920d484b220ed784cbe2805abed86a27ce84f3c9b5c00b5c9bd146249ed776b02c1494faf4dbb2e435d0b914bab59f3e716121fd212a6967f17b82bf1f96911e126d8251279ae28749e24ce8958d54b126e623b880c1c80d15b0c1f5bcddffbca8b957276fe73a076dcf5627f54f36f35195ae5a777479f945abfed5298531c581ae5f71d2ab6fc34aa08a84d53a03829e756f21cb4482649ada260daea8befdaabd2addedcc5515dc439059739f13ac77d1049fedbf38dc00b11fcf2a1432debdd694118e3cfa7ba1cc6ff716255af532c80784fe570fd5b48cda8c50878377ce4503a8ddfb88e7e3dfcb466b8ea",
+          "padding" : "3031300d060960864801650304020205000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 213,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "628db8142e4a89ace83835d484ff84f40e70a0983fc97ad5874c2bf78361ae02f925b41e6af645c0c5d99c3e59929146b3e6de62070cd03be2eaaf760874ca6879b6cd695050bdb8a6c0aff0785918d3b83d214bc1ae73e3207f9dc7ac550cda509dbceb5309658fc52cd1873d747df01ba52a28b09ab4c0eddeab6108e3b75740a80369c0a3296d3514af9a966c5edc9127b88797279291f1dcd3da2a512601880d2ca98cb20d512c0426140f30c11dcf49e769529a72270542501961a5fd3fbde56af7d85bce7521160a95e5388d941fec7a0f312ef9efc8382676735a6ece2d31716e1cde8bcc86063741457644e0a47474f5aac76c618fc960dd9c6d3f29",
+          "padding" : "3031300d060960864801650304020305000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 214,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "9492ac64c45a6ee14fa5996c865c18a0310bad275a26be5f4df7eed2f49bb3fb76b222c9f7e92d413d00fcc9cd6dbe590a48c1250ec6807ef5d231585c202934182266f9bf931be91bafa1ea47d0d6dfbd39b5516585142cb52daee704a6c36f5a216b5e42a20b8deaa3e6d8b26e97cee7ff4cbe4b72980edf50283a48034b1b0deb36730439509424d7a5229a5dbe08005f372057b7bc6c45d7633d509d833b90be33e706b023027165e2be40a165240f28f7708cea38ee9fb87aeb8ffbe53637d6f652755f312038f6dfaf5db3b89df86a7031f4d92d1a1b1886fc9594b8e2c29135aab5e6a66ba428552559ab9cda9d915de834505297471145e0a64fed3d",
+          "padding" : "3020300c06082a864886f70d0205050004103fa6e1540a9e5b94313c5907267a7331",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 215,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "3ec58a94c9495ecec016babf77fa114d78097e484840d82c3cfe7de98d2ee21b499992bfe3a778161e781f89d20745bfd1ea6037c2e7fd67c3f95479315dda5b87fb53badf0b813f28410de6e79a11b351b1668586500917feb44aae0fc18ba6de2bdfb6444d89b9b8b67490c1f2b81e3081e5c5c7c39f4f8f9bca2ae2a9246465610a9e6a5a67162a3a40857fea59e128f21903afa9143bff67df9679918a0f5c7288af9154f096c03a13601db5724356131051ce39037c6b870bfca5198cb9385137b7cf5383630b459cc6132b7ac611d13712f91b2911b9f8526e02a8c61acb7d184a7c6d86d6246cdc6bd13174b6969e5033bb90c4abaa907968edeec362",
+          "padding" : "3021300906052b0e03021a0500041421f0fb55d0f5f4e1521ec82216000a17e728f773",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 216,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "73225d8f91bef922f7fa479aa9cf384df5cf30ca893ebf8be19f09250b35df80cb8fccc5e13e550b926a852d40c6ba0edcf9645d0965e469d38b1212637b1e4041e47ab1af8fe8b738901bb916270061c1032907f6240f33abceb57dcc93da9cadbaf1c26f42922b3a3e0b407bcc4927658d4a465cdae48a138ba7859c303d23b135a3413751f25b108b0058a313271343ad6f0b81458ae7b050bfeebaca51891d94ec9fc07a698471ee3a0a52fe61dd7c028a70fb4c22314ce3f251a21db5e13c8514809ddd0e8e4ed76a01efd1ccd10f73e29fcdb8d8d4f4c60341e166e376d8a60d05816fe1abcb30152bbfbadc9172ae15e58fdf41e4bc53f39f5b0f477b",
+          "padding" : "3041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "3d1e67d3b6f474f7e23ee14223cf10d3d28beb454dc7f7ba972bb3eabf6b66eddf245f34c2b9a2486c693fb193891a084bde18576b50b17dec8f9390a8d10dd80a4498cd718f7134ade41538559ab1140e28aa5753bba7a60a515cfc6aa245d3104a598ae06cadf881be563b42dc138af99de76b080eec50f59c0620136525a8b4a3bfd861a24fe5a2467dc23da5b0a7c298435172e3f280fcf14a2ecac790dbf1907ab0670974433861a2ea6e097feb99827c9626b7464d1fbecd7d2d939db1474c30d9be20b77b1adb92094fe1ddd55c1f66d8cc37bceb1460a120fff35dfc24a7e1e3a0b7f7ff4442b36d147ccb635513f415cfe6305b8b713f813497e6ea",
+          "padding" : "3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "using PKCS#1 encryption padding",
+          "msg" : "313233343030",
+          "sig" : "46bbab5068ebec737454655b811dc71877f4b5cfbfd90b340dfe549942d2493114873470f91f1bb342a39c0bf614268e7bc9f5a68543d57d8ee14fac4b3abffc27bb8d3dbde46ee6cd171b5ea32881f1d037e67caf954769e416c8dea94b7b4d71af3aa2ba321afb997f2120c1ca4ca53583d85a4ffa13552120ae24dd41c71984becf4aa9234ba0a5d9b918c6bd12a85be40d0e390b88150c1635357e891bed185482420bcb2c4f88f21927f4f8e81fc96cdefe82e735c9a34708d5f225e462340a4c71dff89da993e821972b8ac963aa8a73271e602c6f23ecf1f696bbfb3a2bea774b1c058cd8a3fbd8a4a73ddc31a607c9fed0052e3f78766f71dce75773",
+          "padding" : "0002ff...00<asn wrapped hash>",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "using PKCS#1 encryption padding",
+          "msg" : "313233343030",
+          "sig" : "01ccdf739b6385b875254ee9a25872ba1bda2b87cdf57ac741604ee962632e17fdd32effadbaae5ba52904a731925debc87509623d95b0ecd8e97ce7af10f1f9650698d22eeac705a7fff23710c0909d4e8a736a991daa074e32bf8564430ee6f5740df310cfcd3b7bdd98c4c6a1ec24f08a90a015d64ff43dfc00f142838e0cbc2253d8d4a99dc344e6826c79cbc0983147152b0777682e85fb18a9cc0a73d98566aa856f43356eb611ed5b5ae2f551671731967e04aecf96b751e68efa11a3c2174ae0bd2a14271268437c6f60c49a2c1dacf413b2a4f1623502be024488006abcb6680034efccd3104e8c685e0da25f35c703fe91716565241bbaccfb3225",
+          "padding" : "0002ff...00<hash>",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "invalid PKCS#1 signature padding",
+          "msg" : "313233343030",
+          "sig" : "4b140acb262c451b0761236b926afa2829e8a095828f7dcf196eaf7fa46fdcf7fbcaf194aa3000ae8d3dc7dacc26952502b1558a67fb692da5fcc7dbf48cbc5260e2b2a7041fdf7bf46f531d4ef48998dfcb65e182065535aaf182ae6abf6e819e7d96ec86178137a3c14383f89438ab35f0dc7698e1811c415e163f8bac5435dddba5db55aa6b393d538d31b34332fcc34ef8e6eb059d4cc453297d6895ba480593a5536a4e553a55417295b6f6798734df67e739e54d3092de4f476cc0f65aac6950631081df1116097a7f6a9d00a1afbe0ce6b2bd32ef22acc95219f05df9fb7e9a8b391e6277cffeda298bf094730f5663172183dc5842056de36137ee90",
+          "padding" : "0001ff...ee00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "PKCS#1 padding too short",
+          "msg" : "313233343030",
+          "sig" : "7c408d5f2efcbcc3f1c6c2a7f14eab73124910f21e4a4b90a782ec8ee5c72d6e84c43bf76fab6a4953e80e712d755489446130b46dcf8649a316868aca5334afeb7c957db77940e93b4241cdbbfe2a0a31a2594c93afa016ea3b95c6c4af1d076f7d7c1e6d66e3267eb05aa4b52014bd8d9e83f0183a9934963b4e4778176f0ab8fb18c327da3ca10c03797faebb4a0b862746bf19ce76ef214507db80b3497e6b2bebd98087029c458389166364c1a81254e8684b37209579c8d32c3cb02ae6e319e12c30c84422df2e82f99fbe37864f6badd947b4785011a93562de2a55c562335afa67b0853e725f2c91f0f49b2a28bb32bd179d928ec37428c41bf631cd",
+          "padding" : "000001ff...",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "CVE-2017-11185",
+          "msg" : "313233343030",
+          "sig" : "a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d5",
+          "padding" : "n",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "invalid length",
+          "msg" : "313233343030",
+          "sig" : "a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d50000",
+          "padding" : "2 bytes too long",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "empty signature",
+          "msg" : "313233343030",
+          "sig" : "",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "0",
+          "msg" : "313233343030",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "1",
+          "msg" : "313233343030",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "2",
+          "msg" : "313233343030",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "n-1",
+          "msg" : "313233343030",
+          "sig" : "a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d4",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "n+1",
+          "msg" : "313233343030",
+          "sig" : "a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d6",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "-1",
+          "msg" : "313233343030",
+          "sig" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "3",
+      "keyAsn" : "30820108028201010090a5d7aba2c8dc828e616fc1fc45c7c52130c8589dcbe2913da187572f6c23217b89a5186b6f90cbe053abfb0885a91f141dbe106ce6ad303904a5941df26ced10478cb56a7bd6cf1313c4966d9cf7c4509d9dc63566aa323e110af219f3398c04e79bb486de8703793473136f5c9051af24bd2c0208ea1bf9321a3e8f24af00aaca1216842eab248d58cf46ac786c49fd3ca8557e9b53993a4b9718cdc5c474bf1cfe58c07ad97b2c5acb7d86accc0fc7bed147adb2e77b8697d80150948117714b806ff76f9d88147d84e93987b724bf4870429e85a7a7b51486a78d8a88f1688f60e215d43d06221e2b993b5c12a607b80e9e0122472b29945f76b55737c1020103",
+      "keyDer" : "30820120300d06092a864886f70d01010105000382010d0030820108028201010090a5d7aba2c8dc828e616fc1fc45c7c52130c8589dcbe2913da187572f6c23217b89a5186b6f90cbe053abfb0885a91f141dbe106ce6ad303904a5941df26ced10478cb56a7bd6cf1313c4966d9cf7c4509d9dc63566aa323e110af219f3398c04e79bb486de8703793473136f5c9051af24bd2c0208ea1bf9321a3e8f24af00aaca1216842eab248d58cf46ac786c49fd3ca8557e9b53993a4b9718cdc5c474bf1cfe58c07ad97b2c5acb7d86accc0fc7bed147adb2e77b8697d80150948117714b806ff76f9d88147d84e93987b724bf4870429e85a7a7b51486a78d8a88f1688f60e215d43d06221e2b993b5c12a607b80e9e0122472b29945f76b55737c1020103",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAkKXXq6LI3IKOYW/B/EXH\nxSEwyFidy+KRPaGHVy9sIyF7iaUYa2+Qy+BTq/sIhakfFB2+EGzmrTA5BKWUHfJs\n7RBHjLVqe9bPExPElm2c98RQnZ3GNWaqMj4RCvIZ8zmMBOebtIbehwN5NHMTb1yQ\nUa8kvSwCCOob+TIaPo8krwCqyhIWhC6rJI1Yz0aseGxJ/TyoVX6bU5k6S5cYzcXE\ndL8c/ljAetl7LFrLfYaszA/HvtFHrbLne4aX2AFQlIEXcUuAb/dvnYgUfYTpOYe3\nJL9IcEKehaentRSGp42KiPFoj2DiFdQ9BiIeK5k7XBKmB7gOngEiRysplF92tVc3\nwQIBAw==\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "n" : "090a5d7aba2c8dc828e616fc1fc45c7c52130c8589dcbe2913da187572f6c23217b89a5186b6f90cbe053abfb0885a91f141dbe106ce6ad303904a5941df26ced10478cb56a7bd6cf1313c4966d9cf7c4509d9dc63566aa323e110af219f3398c04e79bb486de8703793473136f5c9051af24bd2c0208ea1bf9321a3e8f24af00aaca1216842eab248d58cf46ac786c49fd3ca8557e9b53993a4b9718cdc5c474bf1cfe58c07ad97b2c5acb7d86accc0fc7bed147adb2e77b8697d80150948117714b806ff76f9d88147d84e93987b724bf4870429e85a7a7b51486a78d8a88f1688f60e215d43d06221e2b993b5c12a607b80e9e0122472b29945f76b55737c1",
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 231,
+          "comment" : "short signature",
+          "msg" : "33363730",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000989e7ff72e67e680bd21d5f966e4ad8a48c3592dbacc4a2f035b4ef4d17a2f25f8a9fef7e78eb99d76d68629ed02d67c43c4b7ec8c3badc32e3d0a524c326537739b0fde156723b27c23ae2b09895e470c64d700f5c",
+          "padding" : "3031300d0609608648016503040201050004209385aabddf6b3fe60d2955cb9303e9354b775e8fab2f95cb72ecf3553c64633a",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallPublicKey"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "3",
+      "keyAsn" : "30820108028201010092bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c2671289bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240c11ebf97cd68c2aa19c787b3be21e68c0e397c7f04c6ef98950e27e0e19a40da92a3ea10800fe9252b77026d14c2fa1eb4ac102491e5773279f07d856d446f45169b09bf60b8a2695f5e4864eaaf9590aec8c7c2f86d020103",
+      "keyDer" : "30820120300d06092a864886f70d01010105000382010d0030820108028201010092bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c2671289bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240c11ebf97cd68c2aa19c787b3be21e68c0e397c7f04c6ef98950e27e0e19a40da92a3ea10800fe9252b77026d14c2fa1eb4ac102491e5773279f07d856d446f45169b09bf60b8a2695f5e4864eaaf9590aec8c7c2f86d020103",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAkr8Xzb/7QvqZV843gmu0\nUXCOfN7IdSuAnIGo0W/l/k2rap220R27EghmRdt1RmQrMi6DMd1/Ke/2i/QLJPgI\nhPUVKx/am5964vzichze4PxI+FpujmT3Z+2XJ/0txZeWfidqXi52hSiv3Z30tt3a\nTBdDAOTaPBmjwyKZ4eeFeTTBTdYgPYwmcSibw5JxFZcVU2SlkEayufGQX+cXyn7+\nu0wZabgEEY7/okDBHr+XzWjCqhnHh7O+IeaMDjl8fwTG75iVDifg4ZpA2pKj6hCA\nD+klK3cCbRTC+h60rBAkkeV3MnnwfYVtRG9FFpsJv2C4omlfXkhk6q+VkK7Ix8L4\nbQIBAw==\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "n" : "092bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c2671289bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240c11ebf97cd68c2aa19c787b3be21e68c0e397c7f04c6ef98950e27e0e19a40da92a3ea10800fe9252b77026d14c2fa1eb4ac102491e5773279f07d856d446f45169b09bf60b8a2695f5e4864eaaf9590aec8c7c2f86d",
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 232,
+          "comment" : "signature is close to n",
+          "msg" : "32353934",
+          "sig" : "92bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c2671289bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240b8bf4bb1a6d0616fd5be2f081dc9ef741a9a4ae7274418b791432de470c4556463108388e8e8ed5dcebf3558e4650c2ac97c86fa682176f09b5dd8cfbf15d19c3fe4f961f4607c12cb3dfad9b6a0e59c92faa1fc8622",
+          "padding" : "3031300d0609608648016503040201050004208f87edbf7e3fbfba22df722036c493b7b8f35321b7d147f22c4789a9d0a4cbc1",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallPublicKey"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/rsa_signature_2048_sha512_test.json b/third_party/wycheproof/testvectors/rsa_signature_2048_sha512_test.json
new file mode 100644
index 0000000..8c5e69e
--- /dev/null
+++ b/third_party/wycheproof/testvectors/rsa_signature_2048_sha512_test.json
@@ -0,0 +1,2119 @@
+{
+  "algorithm" : "RSASig",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "MissingNull" : "Some legacy implementation of RSA PKCS#1 signatures did omit the parameter field instead of using an ASN NULL. Some libraries still accept these legacy signatures. This test vector contains such a legacy signature",
+    "SmallPublicKey" : "The key for this test vector uses a small public key."
+  },
+  "numberOfTests" : 231,
+  "header" : [],
+  "testGroups" : [
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba7490203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba7490203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwsSoYCNtPJCWoHbWulEH\n4Pe9geG6kW9zdXJL0rCwtjlWgTcVo0V6sEWLcfs1pFsn+e96w+V53qRd+/0HgZ7W\ntwIapTNsWEQqrdlsqe6dMkc+nZJ4VitNECWK3mqY+xx8/cOzcW713sWM9zs1nziV\nmbS1hlqYY1GesAHDJDh9p1VFDbNBMJNg44B8BWW44sRPvV5ujQTQBtfudouOhDYI\nKpD6DoN/MvRgh6tKDZviiqfaF5TOsBcqf1DtIPbfZB77y/0qrIl3XHYacxAJPGcc\nl3+hiw1uAfsl96QytCxlNZeExokgVxnBz246Zdri2kNMMm3egbtv//vb9t5cFrun\nSQIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "n" : "0c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba749",
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "b03dd72dc84b305ea811267a489aba10a1dc54b59f92e58546a2f0b6883f543512d621951352ef12abafe4bd6e10c2e5b0eabbbbf1d081b66e535fc9b8ad379040c3c71ec8f2b4f5d319f5d2a0240a767ddb4de1fbc878b2c5e8e1e260217bbd70971789fedb8c677fc8193f67e4637239607c7b9d3511868ccc0df372374abc685c9b4b74b2c5f11758f809b19bb3b5c464db870fea61ddfa5e18be2c4106f3e165fe85a7f8241db2806d0fc3c45d8a7f1eb4ca411a46ac411b81c04fd8c4ced5eff497da6bcb8e2fbe1f95cf4c3e761fc3037c82276f7ebfb7e6cc8534cb4fd34192074f580c6e31008df4f1404ae8dbcb111503d4bdfe6e7107a1ab5cd8c6",
+          "padding" : "3051300d060960864801650304020305000440cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "4de4dbf82607b36a5c6778ae6351d83b7ef5b4af64c3788889eb10ef1838822847ceb531914392360b92dee055796f73e3cdb8b3d50910a537dd2244fd7f922780356ea3f01e99e5bebcb1b6ef398d2399bd02472a871417daec3bbe6f89f45f1af0bf819a446dcbbb75c56958d34ba27c8120cee6ff97242921ccf58de9216995fa0c49cb3e6d60e46411b2df3b01b78fa81ca145ce8be594ee009031eda672eb097ba5ed6687a703b154ef616757f94237f4275f54738cb59d36b20a9c84ae133bd715747952f0222573a91faf740e4b7eb4e88abaa91004e72a1709b401616b2edb2784e491f671fcf5ebe326b669facaa5d8a0f6f8469ea995c4db772f06",
+          "padding" : "3051300d060960864801650304020305000440d296b892b3a7964bd0cc882fc7c0be948b6bbd8eb1eff8c13942fcaabf1f38772dd56ba4d8ecd0b626ff5cef1cd045a1b0a76910396f3c7430b215a85950e9c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "a0f46582cde6be215351bb7b29e8ff24398816fad9e7e2ed6ccf1d0b5296bad827316c18b1565253291fa1c0baea9a735357cff8920e1024ae5707dd2f0cfcc9e6cc81402217d9b4f51e10def2bc2f4924e7d22c022fc87d6c3e772f4952050d027b003ab4267ff227a15cc7c884cdb46bbc7eb38852d0e6d8a12f485ccb0312157097687debb6feaf2b6dac998224c6047c1d5727195bb8ce05a59669034e88de0e4815af00c65def5b9748d017455056cc1ac6d3a77e31fcea4e726eda6be7bd33e509696e54d1d1858a1165fa9ece5d62e493c1a33ab3c94d294838a19f367fb799d6b69161bd9532a6ef317deb919923d78e33309f14a97b68023d600b4d",
+          "padding" : "3051300d060960864801650304020305000440c6ee9e33cf5c6715a1d148fd73f7318884b41adcb916021e2bc0e800a5c5dd97f5142178f6ae88c8fdd98e1afb0ce4c8d2c54b5f37b30b7da1997bb33b0b8a31",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "9922f7bd01d7ba6b2de255b91209631af92e5537a4554b3b7a50e39f2fe9b6085a7e418084213d445794ebc19be43782d9f80df1daa7498a1c67d935ec00dac6b7a194033a14431320acd1d7f3d4c2b7b5b1649dd93931c49f538c94e34f44fdcb8dac9d31539f87e6720dc887c6605284a6a0408e244325e35917b1e1ccdf5959ca87091827c8157bdaa31239e2103ca8a112cc76a8e7e90f352fb8cb3a3381e52cedf4d4188bf881054b80387605e7041ab149cccea1ac2bb6560b45000601c33ebc31cebdd499c0b8fdafa7c1691d6dcc48edc98519d55d126a757b2a753eda4f2bf35cb191face371c9c34b2ab57242053b9ecddc91e4b621e650432adc8",
+          "padding" : "3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "99996fc01a53bca03382b96e9ad83a3139bfacc5d37b180a099fb5d515a7b78a5c21a339ae6bd2bee8e0f503ba2bf892c1885ad5f4940a99d8d49df6f4623da16c337a011fb895c006100286aed82977be3fda054d1e935a872939b704750c3e2871c33768946e65a737184efa50060c6898247a6472854884fdbfc2533c936fe9c922d881bd5f093851b46693cf633e25f27efd6db65da3ad96f2e8154ac39f2a9859f15c919a92c8cd22285c1f9e87444e61769f6833bd0d56106f87825e472e59caaca1fedd8d4065fad9dbbc252a84c196bf5d6c40bd8660600bc6c825bc7470aaf4ad118c6c139a5c6fefd5223ef490d4afa6c06269ea8c0054aa1f368d",
+          "padding" : "3051300d0609608648016503040203050004404fb472dfc43def7a46ad442c58ac532f89e0c8a96f23b672f5fd637652eab158d4d589444ef7530a34e6626b40830b4e1ec5364611ae31c599bffa958e8b4c4e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "7930ceed4b191365ccac54cc8a5bd38498c0d0c1fa5a862b6c0744edf9bf1969ec4f3c7c42aec737438acc797b8301aa8b30be2a4a4c1323be0427411dc8be84881036e9062a55fa2334176049305a44b97f90ed0b3becf56f8c9f164ef0bb45729f9fab1d459f690c58f07ef5ef89f21b15da14a235f3012e6f83a7f226e118d3b7fdc9356c39667e1cea5c667b54ec5ca6a0d58ad933484f447c670e5bd3647361c81831dc710360a90692eb7e4a57ad225b2516d9c3bcc77323a9354d1b92d0b3f5ade911f5faac4e4bdbead32f3349840ee66f4010789a84f0934182c2b0cb7d6e72e2b2a6839d03d7c9f681bb7148449161ed50b4466d60002cdb7492fa",
+          "padding" : "3051300d0609608648016503040203050004401f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "16b5ecefcd0167682fbb3601a016bfa8bce9dd5855bf305ff00b45d97e50fecd27716997c37ebf8efd8b269558385b3ecaf2b6e38313508a7a14546107b75afb450b1a0e39cd0760151b666451bab43d7fdbd93771e9d98152ac889bf1abbe1c3f62049c4735602ebd6a90a0361dfa08417ba03c55fc6b7bfabb136851ab01eacf528abb1129bef47f2b04e2aa24c0341720f728bc9fe12cfa5d4248976aaf7035d19c18302fb9ae2443286a71198b500034d48113b705c83e64561762c583dc013cc099c7e5bfecbfaa7b971c8f1a4d3868fe0a4ad518372ca68c65bdefbb726b1fd92ad92ab739d2bd1af97724dc076ba011a9f32db3979ca4cf94c5370b77",
+          "padding" : "3051300d060960864801650304020305000440aa0a2e60e45f276fe3aefe9fc07c6f2435f143ee2afd895e4809384e833be66a6396c839d6f7db83f37736645454c6e63712b27e70edcdd7440e1275235070c0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "Legacy:missing NULL",
+          "msg" : "313233343030",
+          "sig" : "b73d6d97834d8d14bb4536b050dbe47db349dcf6847586f80624425065e10360f9ce491c38ae5e48f6640bd3a314eb097f08c859625d3b7e8198b0b9dda03920ce5fc4937adf8c16af3dea2cc3137c2c200cb8538baba5bf36c9913784e079d8cde826f615313cad093d53110ed616591e5c38f32e2873225634ab10fbc7393dcabe742ebae9ea3802031ffdd6356a30aee51d126064584db555657f11cf742b8ee1ee41119b5c2e65c740219bfc36e6f65fe8db8d16684ba4cd7a12b5bf22551192fa75362b142b95a0b0d786eb26c07547e73ee3f3a3f0b2f2f37ba562f61e86c4bb25e7e059ea504f0ea8f5883382d7b17c95c5297a934479b4d40b632e99",
+          "padding" : "304f300b0609608648016503040203044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingNull"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "93611a697f527bb2d6e4193ea34e079e0b8ec8e4a516962a74cc91c157528bcf4654beb487f5eac5ed445f858fcf8461e63fc657a57bd8226d980b212fb5e61111e0c654e0a6aa0c959f20001f6345a60ab14b8ef5631a81cdc552a04ad3f17eef287b011ce401be17900e79b4b045c12a90412a852131a1b9ae7c31051e8fe6f066b4f7e1d8e9997aef10a8c516fa3d782c9aed73dcbaa1d9794de7300c607c17607740f091c2dde354b58c0ed9d4b8fdc43e249847b494821bc9560fbc3c57f363e5d2bfcc488c041f123fc379c7bc80a9ea6ae98b7fb76058f9260c0f5fa1000a7f865e5a63d1d279fc7f452775186608cae1f3b640594d4b3fd8af4a5a4c",
+          "padding" : "308151300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "a98a9744f1f1893343ba5b702d7d431e40900a3e3948d3e6630fdc0a8f391eabe2f4b5521a2bb03a16053e87a15015d5bfbfb0e7ea4877a05f491bb8df5893c867070256e8bc348f896ca2c8ce4e0ab6a9adf10ab98412e4ab6a4fb8440243fd34749596855cc14745d7096842c48db0647fbd71361ebba7fc263a2d191d719d23e727b1ce36e543cccd521b540cc42e01120994a06a95f43cb83ea51f73dcdb9d5a90683f627a070ba8afe67f9e29b003800479b6b8ecaeb6f2e68bf19f1eb568b170e56d70a8ae41d2524a0e76bfd0f4d27ac8cde9b00900b49577c55384e948c6c6dce081d277c3623b1e749748488e648d9349b9f17cbf072d7083c377ed",
+          "padding" : "305230810d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "13e9948a6ff7595299ccf4fee8f9bc52ca20d8899844c1fcfffebb64052063bef5d4c03460495a475144a252fbf30f00cf58723dc1d4ea48f6d961bdd20d0fb20ded4c90fa9b0384c0de08a2fd4b7f94c6f66a8f3123fffb296cc430ac962001d0bc7d211a80dda72be7e73b84c8b40dcbb8e84722f19ec21aae93924bd2f5dae584d0082ae6c4c52994a7431ad2ab3c80710b089cb79a884d8b40f7452a1874c9fd2f22cf46fbdaeaf5894efd3b0d96bef147b9d600cd0400412b2b8a5fd939e14516e9c2574e02c6f7e4e8f2a5cb0194a34d64a4c5160c55ff1750c5912107805d2c5767a260be1223bdfdb509f59782570c7ec093d7f19f5cbbaa64cf88ff",
+          "padding" : "3052300e0681096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "81752aca9fd0847f603186aad9e57149bc9971f24d1e11b7d12361f989c9ae6e221ff02ad4f907c8cc31b55278ff51d900de8b1635ef5b7bee09b41ce099709e63078d7c0ef58a2dc5c2b5aeb7fe27a283087b9e148c97b29cfdb3a4ff4debd22e60989cecca3fb85c6b5da660bf7d00b4d88d65c0c74ff879edc8ae2848d1e2055856832d05b3f4effdb1c057bd1788e67dfff3d96cd1a4a8b04fe3c82c4fdfef4f91b352b6afc47d5f843b898908c361511ac3980ad1b83994b69400b7702c1bace5e344dd0c5eba651466c2a76c5a8bbefca2fd2bc258dbf424a5465f33bf0a410c606fa3de882cfa5c8038495e3f1ed5e919e18cb107505771a346bef3f9",
+          "padding" : "3052300e0609608648016503040203058100044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "73c5fb16bf8b5da488f290b61eed03b17bac3cdc98b0951e610580392a74f6300961dd15670f8e388ee9659aafccf9dcc1fb97596b9bd39dbb60fe5cc62efb463dfd29f491751b3204e10dfe9845e5c111d335a201c7515e33ce30c4bcc72a6618a9bfb79322b00b675191d763c4299f2a771c9e7e26c0bf0d6fab1f96d0ab60170cb88a101616dbad060ab079dc4ac6f91bb49776642d7b47c3b898fc2cd2d68ff477adcbfb1de10b782c554f1f963fdeead16c2fe5b4e584c6ed8c81725169f27ff371282305d4b1428b89a7a25f057763c417f73ad013e62df8afce855a38dc6f20ed68f4e37a9a4bc7395b9f3a4aa8c54252505de3f9b3e0301316bb376a",
+          "padding" : "3052300d0609608648016503040203050004814043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "1075928172057bdc681a626808436b13f556883057c93b452326c7f51316939cef89fe3072c6f1365120eceabaa0c12ce4ce05762843a09debccfa01ccb9a85f8b0f1f7f030ed2a0c1514ef1c25cce22557d30627cecbac23f9f1fb645776883fbdf502894cc373e18ac6bf47d655894b528369a341ec1e56c2801a30f4c93e5219a24f727b5d41c0789d01b868742dc9225f5bf3b588e5836aed54bb009e44b9598a96bb36df4bf3521cdfd792c2bf9647b01f77e80f8063299ee26a9a36aae9594536b7b3d3ab2fa8df3dfd7e4380eabec23ea09b046d9bd07a11f084107bb6caeaf32559685611791912513f50b0fca6bbc37f93b4c0048a41758228539e0",
+          "padding" : "30820051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "7a21f13f8af98f47bd62b03985a2e91ffb3c7c3a5af6ec75c2269e3ab11d859cd45a214b48310c7fd7983c8577d839cf63d3c3815302ea649a17f813d6cdc75803a6caf2195fe17a5e84d8a59eac0651232dc793d9b7554eb1123e3594e1f6a57a72e2bfa6b1ed9f1f9a6168aaa83ba2d8b408f3c709354a278b991751207075e7e5548f0c0f764d58775db3143191a210e702b69dfa8d8946b1a65d67b3da6f3451f70a65d29314ce5b7ff13b95cf7ae68854f586140d97a0e9de4ede07be81fe20a5b6330bd9c63f15a3d4904b3a4596951ef5c591007ee2f6ff94fa90abd1093d4dec45a9904eb656713a110faaeec429fea9d1b8c47133787ff6aad3f938",
+          "padding" : "30533082000d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "608ee7dbc573b80a6fe241bfe38854451a25de5ec32bc17b067f9cc9679382c8ebaa5607bd4b9f540046129ff555cc203728551001fd45487edde84a80f6c4b035051553b683881c17ed34bbd1e071f28e73cafb9e679489e5c73b02be7698c733d5a6316735c57a4c38a820987d934c463556183ad25f0d2a69e882acd7ac32cc3fc229e0ff80a1c5002095c417a559f84278dd75098b75370e89ae1c6ba708c453322f9be79e74530b062a098956dc6727a515a5e06c3d528f1a8f46318c561ad68060aa459dbaad3b8d8502fcf8109400dc3f1ab6e2bcd0e03c11d6c659f28953d70a9403c12ab154b054d860e534ac5c322f38685239cd20b367ea6b5c77",
+          "padding" : "3053300f068200096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "b06f06dd6e71e4cfd3191fff49312e1e89c9ff09b502f8d81c6710bc25480e34519b70f1282f56c70ff540b507f729702dd6b25a33a3b96848ca94974ffabbe7ef753ed5a6b08459a1229e163777313f7208e7d4bc30eb8221e832efee50fe22ee7f915e6000aa8d38a96bdd1bc87e432fa10da0a1cb70116c62d894d05130aa2994796a4b514531b749405f56aa84874da4c25b4743814e0de174401d28d822f0485b267fd77511eb936011bce790fe8742677622c97f6ee8f749c57b254291deb8cdc759bafd8b8e0e95eb26d2e25097beb24e7b752090549a5f12c276ca182f911b095afcd87942504a026bb2ba3511bf4d32ac7fbaa8e44dafa39a47cb03",
+          "padding" : "3053300f060960864801650304020305820000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "7520c52e90e539f8d2014f1bc44b0c328df96d9f93e6d12fc56c895945993b73ef01834db08369da066eda44e585c56e675b2b96801442e6978d041d0e263a706ff384abc1e9b7b0c0ac4a3602db96694608a83c799a2bb679fdaf6771f2d170827fa284acf4d8ea77b5837794ba74540f52c2db801ed02f040e38043d6447c1aa6db5a76d8cf425d7e6b85bbba2515d9de7063b8acb3bf0d44d364d69fb4a20e0b6ead6fab8c8b17e7c0fbeaf352e5cbd34b2a58decd81dcf452acddc6875b079cde93b10661b254fd04262918a705a1b28926388b069e0184ae4f7349afb33aebd1dc37296e04f116c691b14e5728cdaea04462610bc64b300e8b5b903f912",
+          "padding" : "3053300d060960864801650304020305000482004043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "a7db33f68fd972b3e122e2dc8c749561d14e513e7df9b03f285422015879de35021689bccca37b31aa7d156f39399063a06fc9590c58cee25d83e1debe90037a8713eb0c58194e7b54ddaa86baa0e9f83b604afb5585aa1e1a45fe24f38576e644eedbbb86f57031cb43f3ef1428a33998c1decf44011b63763e47d2b2fbdaa90deae270455607b928645b3f5ac39553feab8f5115c9e2f26497155076c13d76d95af3ef342bd1828e382949a63c54cd0d4c4c53cb00ff4b8e285034e78ee0f7dccf9017839c189ccb3bb8b92f515beb63345c9973e77dfb388b373b8076578e41aa3bf3e86bbd4e1875996ad19c8d618c8d69f4eb06b4103cceb2b8ccbd8a58",
+          "padding" : "3052300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "72eeb72c3c87040a35b98244d6d93cd309b65bcc793bf9b10d5f7501bcc4dd8030eea73c4670de7ed9605b3210dee4e53e758fe7741c6410dcdda4769df6351ee82380b5b2387c1cc8935a60d58408fa1a51b485949e0a4d4a82a27e8b2265ee634815b8fbe3778a00fcdef0201179bc4999ae16e1849027ecf92d53f53ae3e04c9d7a39e71f9be774036d40d38777fd6e115d0bb7d8b538e57cbf16bb4d5748ffac01e1b20347bd688b0b45448fb5028fdeaa190e3c288df6dae55ad078b50cd64adc36d471f0c31b574fe86680afac6a61ea7c2fa5942687e1a4027833655f88a123b50e7ccafb7cbb73c8ebcee7f915258b8ebc47a792832242176e2713ca",
+          "padding" : "3050300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "c280a6067d62ed84b0f9f44bfb322bad0ed92fd26f5c8ec7e91d9a115eec2dd6f5a589c124b50b732bc5f4e382ad344a3498ba280d70a8e7beb9759972fe31da8ba57b29a13c17004e4336207109385a5e27d53f12abd5bb6059fa917afbd45ca8a4322928cccc776cfbdefd7559eaa86326c21cdd6ae4c40c40b1659016520e5d34b1b63b7cf744a37bb795ffb86d853dec82a7c2c57ec5b14f68535c12279841fccacb94b35049a5feed59496db1ed372f968a4de1d70dd98c64e3e17e541d0fcc971a735cc610b9504680cb615301440cb211a73b6bb9355a677be77de6330dbdebcf6abf3ca83d457dbb951f3189d017022c354d08fd7a5d0f8f63aac308",
+          "padding" : "3051300e06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "bb7d11eff4ebfc47082969640c3883ae3b2a95efc08f0a4c4cd59c61fa5f15e1235a3e53a9653186f09c21e11757a016a671db51ab597959a437f26dd1f864ab7c67306fbc578dcf614c304f8ebf6b745967c71b8093485f74348f81865bcbadb39075497e1ed9de3f9e21209d21ce609d2d11c3fe837dc7381ef8aebf4680e680276cfcca5506d3c1eb5fce1655b566ed63cfa69e4e186140580ec9c7a51aab286a54fb674cbc1b527ef6d778ad228109a93ec4a7dd39c30c5879e2517a540ce7c0f4989b7a930899c1ff51143e7d2d3802c2328000331b9c6e9c887fe8242d2dfbff5f828f604050268c450d74779f8a512dd0632b90c9b5870c541b45d163",
+          "padding" : "3051300c06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "423e0dd97d9ce8afc746250cdc9d4cae42ec240e53f08a32bdf9028bc5be2d6848ce48e13655f009e719d19a150923c145891fd2ceb63d2ba5540b658c18514f660831cd9fac648a487cf74075116ef2daf99e8c65c5b3acaeac974769dcf693b535377d69e55162b3c77c8bd92e21d874174e44f6e129d217c0aed09894f4cd75c7d370516cff3a588d4c89da64e60ee89abb4cf28ece616335ed3efe4c9d6f1fe5ade4dc1bab24410f48a9eac864699f4d3dd80bdb34c600cb53a4505613245df1e0edddc9a09a4d7dd540c661a5cde0a32ae22ae5dd63bbffd6fdb91f4bda8443cb8f8dc5ddc40d62859e5cf5911c2f843dd62b82f0c1f39e0bf3e8edf094",
+          "padding" : "3051300d060a6086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "16526d1cb139aedad31a0e397aa3fab0232b3d6432dc7fe1bf223246ea35ca6576c224afdabc95571a57108bcad87faf73136bc694f16f44bac788982382d6c46ab751683a13575f917acfc9830585c9961a61de138bab17171b6c8466fc35065e08a9bc6dcef84e46c37507306d60d855e661db7c41dbe59f3737547063796c618b5c9983726dad445edd1a89a5960758b99058e3fd0159b739649e40e9bf57f39e66f7bf23ef72252079d1527e9099b0f2be56b36c350468202562e33489d1531bc5188640c2d3f4f2745cdd190dd96e3e9e0a578da8132cfaa12ac736c4b5f9a4d6398195a88626f5c38b16016c9e97c2246175f8a1ae5660629e109cf60c",
+          "padding" : "3051300d06086086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "27e34f147a216612af33b2d780da400926ebabd939b41b6d6acf64765087231c6ee9c32398921641dc586048fb2e5a6750bea7d99b1c5d0ebce67fdbe7474fcdb67d9154971556b7dcdd304a28181123b05fac0b738d8ae21dc84c0c7fc6c152c06628579e708d4d7531eade2baf0539ec0b3985cc03f9e5325c093a46f2f53a4a0cd9a4209ab4d7100a06cb446444715c746c4619d3f32a7516c8c13638ecba66242222d3b636a3c609fe2618e080484ca741bcb755d217b50fe2e560d6983b8f708597adf4bcd0b948766f4390d0c1409cbfd87f8e1e1208561a849d79826cc60f380255dc4949af3c4857ae626e2e0dbf4dd5fa4de585a9c0ddff5decc465",
+          "padding" : "3051300d06096086480165030402030501044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "8de2a7328634e513526db5c50c132c3e955c22a6022a904b4fb66d72a2d2aadcb250a6cfb838c9780ea047048b8a6d1650062ba0348a251f61247c0f1babbf1fc6fa5a4da9e01cdd7a80a6e3d8a566f56599eec09903e6b4b14d3b16153bc43fbdb1261bb5328056c9f95cbbe7f7072c93011f6ab837d6f3a38129ffd14c65e1f666f64c6455654748cac6d18c08b1d45481720a7834580452d1f62aec30245aa84ed8a7aeb686d46c2c512fa4e0f3f423c62f5db51a3e74a6e1c6f1450d61bd43c172dfcc355f56bf283421d3d60b2676c39122a99a6e397250c319419bc1c8febcefd04eb40ab336554c870b6dc719c4fae74929ce79807eb712828c85b482",
+          "padding" : "3051300d06096086480165030402030500044143f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "71d7a71edbc49fe622c9fe146967b2e4dc3ce1e3b49e022216b7c64eec7ac9294185a9309f0e2b78c1a828893f0ec1c09a4d7eddcaa60010807cc9878094fd18b179b41cbe73b4ecc03a7a9900eaebe560bdc7b92c22fe7a20fbceeb388d0bc1d440b265166524c7183f577bfcdf2d183257bb9699b529794568756b388f34a987bfadd2344f331092ac1199d7d8688dede96b1ecf279b1f2b027105439224133b43a95d2a31196edb0ba7bb5f72df9d986f0d55466fc37cebef4eb9f5b942e274eddc8f7d51beb95afc8210d88fd1578b28ed31947ce64cbea9c4e7c6a9fa2bfc3ff07f90f0b0e10a1010cac8c6768ca3ba9321c3da03640eb4909f5dc75bf6",
+          "padding" : "3051300d06096086480165030402030500043f43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "4988c316c1057404e4b0b1aa3d0aa039e0b4dee3917449c0cb816c7d738db50c5e62275770f2ac0372fa84e88a20a23b9c36970c6065c599ab4c23b5b28d260e95b7f020d760e7b7e00f0e7f7bba51ba104ef62205fafc6226c95c0f483486980eb163497d7c33aa1b856ff77bc1dcf94c57442edd91923417afa48fe718285f358a24bc7bba48707155e41145d16d9e37a12b8821ff29c581dbb2f3fb64172633c6d7c1ff6b78debd5fa8faa4623fa3fa93352834c7948f7b68311fd8f2189e54420d73dd5190ab34dc3a8efc9bb7787603f6030f0ea2eca2aa7e87c4373c9b0b3c8d9fe16afa3922639501b62459c34012313c160c8707f740330870ac2273",
+          "padding" : "30850100000051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "8f9a07ec03306424540f913dfd03eff0567cd419dbc5be4a28b3dfae5de126a01d1fe4c6147aa4f1a2f57fd50be2566ef8ef52ad8ff816abb114060d6efcfa64abb0864e613907ee142a4f96d965b3aeacc6c870bdfc316c72d43a5c9172fd2a5ba0de6c521fd82023c511c40700f7b7651e8e98a0a20d84f7be365ee540a403c9afc6087dd5ae8473006fe4203a790db4723520be38fa3b9247075c93e6b5499fe8ab997c7267e495d1a99d5865333acda265c02569040787d5aed0bd4e492e3f76605120bd41840473da0e4fe1a388cadca7b4d543f5beec4be9c3fbccd0442dd0b11f9d79c6e910177aa1c997028d675980c439e61571011ff9b26818a69c",
+          "padding" : "30563085010000000d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "c1cd6bdf82c00f4d1ac1bd38ee4ff5929c7651095587293d97f4afe324dfad1c3aa111abafd30cbd4d9d61b68430e9a88e016a85866ae40ac542c2803e0b0959d3a3f1e66b8e79dfc73f69ddfac4c86892c2da5fa2c991ff20cb2630cdd0a8a38d1c4dd3fa623c219ef50430798faad662bc15caed462513ccee3a1aa358d6e55790357fb34221a32796e0c6988dfe18320b3dea14f3423aefe12bc4bf1f78fbcc70a1cc15e8653d6a591bbd662859d81df47bca498e5649c07cebf9cb26d4bffc1ed0aea7059767a6b47dcad293dcd24855afecfdce49e8bc885511e61e754fbb8a6278582bdeca1c04fac5465f15a14d28cae2241a0be7cd662ea87680525d",
+          "padding" : "30563012068501000000096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "b8291b35c54446e9295655967a687ae59a795e96885dfbaa83cf52095d2ee55646cd939ccd8473a5f1fdbc8c10a77e87e65b6741ef2f854229f0cc7f8771ba6ce56391061aafebdc7b4d65d798b4492cb5d58b106c2e9fa5705016e22067b9cbdb6820159e390b8ec4bf41661a224581b774b61bee9238d5a8663217f6bd57e7e3405447126fa0dc3cae2734da94b2d848b9602b4a313c5283a5a5306ada0387589d1a5e6ba004c949dfc1c07350ded30494829d46578251c8a777867486483c0af6f6fb96a137573a72b81872162d051603362e873e5923ede5f418626f917a53ff66cf0d5e35a8fa2b800b8fd2fe68e07492da3bbbea36dfc282f05f243271",
+          "padding" : "30563012060960864801650304020305850100000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "207d9fc28178464713a14c9076366375fee88f884707b3e30d1542be03db648007de08890e60e1a0226927853e13f48908dca2201221deee23c1ec02b8b62da8f5fe6d603ecc8e4fa50b45f65953b418a81ba9783ecc53c45d3c027d7e891c5c9ddfd4e71809370e353904d5a65d31dc083b37c3316a7e59fdcbcd9fccf65132a6736d2143e55c786d73e3c10971d1783ff46fb9d782e8849d2edcda14d9b1587117ddc0defdc612f532bee3bfe12eacab5ad7f7f4961d5a7cafe691409495517c3579b5e9afb1286f8e877b6c92180d892345569f694a779dc45ae91c7181142bc18352f7bf21e62f3c25b486690baae34759fe0d7b5bd5f85c2f6bdead0fa0",
+          "padding" : "3056300d060960864801650304020305000485010000004043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "22f3151da8a6c4d0b32ed9d6fc8fe090e218f18289b5a7d780b9cd78618f57415b49ed7a2ad1064cbeb8a20dcca021cff65e5d51a6d662f947dd2286e4734ea6923ff40acd41cbe4e6b33e4661966a8de0673e59958f71fdc191b24a9ca7b08a78bc318de1330ec7025f526cc6704faa7923c042e561f83719a7edcae9a3cc6ecd91d86a94416d2ef60ab3e74e1f587c0b5c26fbc4e2f67983d4845f907e58866936c80b3159d352383d1deffbb9bbd67a2eabdcc43450ebfda73495618c6b5b8093d49e1c0c32445f5e945227de1e8ce1cec611cbee43cd6956944d6554b5e120ff63899755836df131feba79d7fb06fc3a3b0feda121243ee00cf8965d4acf",
+          "padding" : "3089010000000000000051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "ae0ea39ab7ce7af3075d67f8edd5862508eff6170b43c02e4f592c9101a7da1dd7ef2e4be53ba3449dd6c2a6c1837884f12fa29dbe8e9d40c677d1edb6122f61205b203ab0f342f21ef8cd45839b9fe9f61738e7ed0915ff398a679a983124009fd37fd5bc9891d33f4830aa6f89cf30b59dc3d84cf955ef960a0980f524c686cc8123dcff7bb9dc7e7e1bfb3585bec3aafacd5a0c7ba63f6af332dcd1b5215f95f06d2307cd75dbafff2ac5cdcf4587a68eab0d3d277ac6e999ede44a551a0d266f9358074715931a7787f4ca26a94ece1c963a96f6558a6c8611fef31a5d459635bc2781ecb35e75837829864001074dd585d70b7e5fa6abe2a6e28b67d48a",
+          "padding" : "305a308901000000000000000d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "7be6a7fbe11828cbdde67e5e0f2580b09adfe1b81a564875bb522eb59ffef9c3541208e520b4e73b597a30a526dd954272cf936033cf88891b551d1eb9bfa033a1cdcfd0ab8f51cb8503995d18a0acfb644d5ac892f828166ff25b48dc4ebef7acb8aaac10baa402c8db37698f048cf407df57bf27383db2663ae3e208b320f9634af208c23cc23aed64b7a6f3078f4b873113e75457e3f6baf23d3f49ac6cd64a11c90469a6b6fc9837634c72763f0cf35505b88fae96e149a0b87a0c71820c5696fc7a6100138f07e65c40b2384dacb0c8557837d0a5082773a09fb0ea369e7c296cd75a5e8a4dda61de1f923d31e4d8e48783c39d5eced7c7e82a6e36a1e0",
+          "padding" : "305a301606890100000000000000096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "8c03145d0ab288cb35d62df31d4d9d3f7e8f3bea809f5fd2b02722a1783ec778bd38b861bdb5b5d1d3d283493a7f75a7e458b165df40bc6b370ff901e12b5193187d85860f391594f75276596155b802e497a7b7c0bfae298f8a7627f70924e5008a0c5b2da24eb33346f80d85c7c5851b67e1aeab3124ce64f0c3298c2cc8d3c7ad46ddb945be4b2cb9ee37d08b252372731b0321b617ee2873d187898e9079cad56a9953f38def6f318e6e9f30eb79060dcb82f3013b16444cb10fd84051b9c9c954d9af65ce4f6607063a02e179dbd67cc0a98cfa50a78c75d7e7ab53f5bfef34e0a0afcb782ff74f8846faabf24f3073110e4b1f72b050644adb386c0c84",
+          "padding" : "305a301606096086480165030402030589010000000000000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3ee1be0f2f1033fc034979a6de92c97f9cf26737f8143859b49341bfdd8263f1bfc65e246bd2bb655984b8e98add8bfd43632964a36fa47be4b567bfdb51f10817a34085c4f391717bfc7132736d05ca587bb090b9d2db16b90ae951524f30bcca9aec60f8cde84a373b06050b231ab7a1fbea4c7d1dd8102c2235437d1ccb89571678ff1cab3659061829f867787e6f70b8aee07a0f63345723bef4d26915401862449918e00f9de0594c77fb2ca13259404be5f787bb7bdc49005f2da4a6a2e5beae1623340e7af7fcdeeb7df228d3f7f5cafea8bd8d06bcffc80708e4703f64d874f702533c5642878f408db3ec7f1bf573e92080fe532dd7f68c96679ef9",
+          "padding" : "305a300d06096086480165030402030500048901000000000000004043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "ae177278bf000f22063be4bbe62c28840bf0d293096cdbda95eb2794930c96544817c7af9e92f22dc81ef2b64f43fc50243ac91a99ff41d05a5e38005a32c519473de62f05a5250643412d6339b44fcc3ff2eb671da073ef72832cd9a4e892fa67c59f8dbdb1b5564f1c8b93ec9e9a1080670e649450b006afac18937a62142e2041cc5394f87325e723fee67bea8385eb8847058fc56bad33419314e4097852994286c2094e4d0360870aee0a6fa2a3823d27eb3650e727845df9dc1af0e475a8325cb9a39f0a9ebb2104a3b66214a7cc02b2ad3be12f91fa434553927dac42aec55b8fe2b5230b0951d738b42b73063b97eb6cf1fbebf76f5f7f5619c730c1",
+          "padding" : "30847fffffff300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "1037912266d26bbb66bc872403272075ebc3c0352ee5201b189db701f64ef193dc2facec45af460a38b8d2a71d1ccb17dd0f8532bd87e5d7f6b8e1414367b5128e3f6035b26054d3331ece1f926c2685f5c286ad0befce4be76df6c26bae8a6df520ad073a058eedaff3d5fc6906e8e1c864d5b989ce9319e87fb121623a27432e2c06e936d151b7657d6500a08e8a3c71a0b491cd3908811b18d00add825f848d6a0290f4c0ee2e289274cbac8c8ee00168631d43e7e637609444c18aa4cc0a887bc104d6ec9f699119840a99a9e6b7ee3dec0d0b4a1f6a1e022a44721066b0fbd6a7c6b4f51401036e755924845bc94de315f494c5c19901b23e62e9db6aef",
+          "padding" : "305530847fffffff06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "70a231ac8da499eca0f1f4abf682accffd04f7a611dd850cf5241f13759592877b8d43682a1f84fd01c86247f5fd9fcec98cda26d9845026f15923a16fc6ae438e718159ffe1180df97fd66babacc4b97b156ec6ec500030b0fcb62c52a208cf1ab803a2d8c52be242075cf4f6c84abae285ce2259acd437e7764da25588bc6dd254456158e2ccb9c5f0e89bd899d97621e9c2a6049a60c978428fdbfd7869e3b12aede869d7daf7e3fcff841ad88b6c2be36b7765e3fc24d996e83c592c32fd1c45bfad63acf0bedefd30529dc6f57877ca0c72424474dc7eed3d4f502a45299f14d64f79f3394e00d160c4dc0a05f57664d2cef729b93d37654df8f1cc010c",
+          "padding" : "3055301106847fffffff6086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "6ac40fedc37ad7d9529d4327f81b3d223adcc7050ed1a6cf060a48035f01fbb19f8f90f17b1a5474ba1b362d7d826d2a62bb6cf0a6c41987cd624f887cb259e3a5d7606b479842b4a3dd69421355111df9d1230c2ac9e082cad89619a34d6eca3f317992fc3933b3cc29bb36787102b077d8b87911bc8376e68ee1e5b405adbf62e5ca46d8f500223a386553c45d5d085cfda0b68428eeec08ab0fecac33da41c30062fa4e7c89da57224522343df9c42d55b5b806d02e6ba11b8b434f8f4a638a3d78f4e7a295f17063e6bd8fefe1e452b6a7ebdefd82aa399637b804722849e6a3950df8abcac54e7faa656e52678ebffc9b69e2e8d3b77590ae592bad00e2",
+          "padding" : "30553011060960864801650304020305847fffffff044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "7f6acb039833635053f8746feb3a6df4e3e98d9c253dbed7dcb01b3fa729aa93f7656048d094ecff6b7f283daef8af14bd328422a90c838754c92f79fbdd923c6975ea16ac4b02b9a4e9b67ba729228a35dd94e0272c759ef7d48f75f9e329a0a14e29f925675f9deb1885c1de7f61b9b95dd2067b1305149928093c3c99776c00d4facdbde91b5f975b2a4931ec369efc7f50252d58219a3c7ecefa70410e78b6cdccb96b14384809c257462434e146501cc042eb014eb3c7e0b712c88facaeb8d8bcd7274a0fed55c01d9bf6c7b9262166ab0d52c320a15c1dab52ae3199ba043c50843eb6ffa66fe147b2f1cf33f836017c3652b79f8384b34f68c7daeb8a",
+          "padding" : "3055300d0609608648016503040203050004847fffffff43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "47fc62936a9113548699f3133f7252e4d2b060969d2a992e4e83e2cc6330f4d3c9e5cc2005ab49f26cebe2834b7febf478cd01d0338a56f262955f61c70bf662a55ecb8848374f38bbb16b0b25bc012197e2b92d62b5c38bc7b2b570b376f6aaab95a134cf6d0805f3e5823bfbc5f57b69cd84fc103d7f3fd7f87186a08dade4522cd32a7cca292d25c02c90ea0a44f6c38c13eb58b71a54b58e42f17245f1881087d32df31be3e83a2716ff9487e3b389e2398d79ed80c0cb355322358bd908d397b7365185ec4f55a50a5879bfa87e248d31a6ff51617b282dd2c07e228510790babe57b466e5d7e7ea6491dd720e98c77124354b3e544d064895ac845c35f",
+          "padding" : "3084ffffffff300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "389f60a3f7e33801cc6067cae353b16263aa75279d0cfed16c122b4ed81350538039fe7f43859a1f76bff62b613bc8abbac257ee6eb3e5088e6ec33815281d6f6702f05ff75f2c6260c8791e43dc168f69eedf1d33d42fa5da0ddc9d2f071ab3f9dc0654ff1a3db8c855cdd9941e6c6609aa29d69f6b1b1254c3437196fa871f443fed2b2beb113257da4bde8aa7bf232fd9c0ae7e7419bf977f14c4f2c4d128e5f79f6f5c63939e7fcec231ba64145f8fcf6f43b821b41776811a848d613b5da4cb8418a1a95402c3ee5bd7195666e8d5b13f12b08cbd730938c7ddea9d65ca45683e9de28d618af1b618aa0bc88e3d1db4521dd069be105b3145e54004eccc",
+          "padding" : "30553084ffffffff06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "2dbcfbd059d95582e3c0bc4b91163fedf41dc471aa1fdaee288eb6aea12cfdc6445ad75dc1906397516180884219116bb4415cbc1a45d08ec53b06f3c823cab4f633ad62d3035a66155a706f36f5899c9ec33ce22cc18028311c121000ccb23f34c4a071a8d296466452453787e7a955c5f83dcb3e0c8adcd58806e4d0fc5c90a18f6b570d007c7b5f6200cc96ee8b78c457fb3be09146ebbf7812a747d7d2aaee76085f6f6a14aa7aa7757b17e1eaac0885b0cb4532f46a4b0d5278966db84f5d7513cee0e269d32254e9c041bdf77bc4c2a08020f015f19fc4ecc74ddeb0e58c2693e42c554a7aa9c83a97e8851aa408a39725f123b10f47c4a30cddce2fe9",
+          "padding" : "305530110684ffffffff6086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "0f6a1d4ba914e27eb6df8dabb7d9e042ceec17d40b54171bfcd150278c64d64d4fda06ed0895920a141696a1fbdfcbb4df8ba357b81a8053de2ed74d423ad46220f6af244815b02d44fbd45b31cc2dd26145de9100063e3b1f24cb0e001837c0ec82fe739fa46ac8e75deae417e4ea7b2cf63a1c6d013b2a17bcdcce9a740149e70dd890acbbeabaeed4fb85b2c2c4037593c68769ee060e270d086755f16a2c4efdb84aa690c2dc105d47d0661f794f9a5c2d8bfa01228eb97ed79105dfe80b3bf8c06cf0c54749e9dd94ea26463d3155a268676123cb4562473a7cb6b3292d57fbf65c1e77537f43ea13d4429c76e0efb922b6954aaf481a85cb12d242beff",
+          "padding" : "3055301106096086480165030402030584ffffffff044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "099e3cefadbac010305b80308665c50dc8513e75ab7a19a64ef0c25f1d5336c73b7d50a0798b2b44cc7bfa00eda29077c52b303f1402a90ef4a6bd8c68a6304c30e94a082335d73f064e67e61a95b0ce9507b3b5c04b51380da72d15e22c4bda161b28c9cf73af37737c1d6eb155cb2325160f006aa9920f11253b03fe3a9b1dbf601d29ee89ba7bfea43d7258c91e706c0650091c7169692d1713b6cfb0a4533a8195d67ef679ddbfffd13148c22035583eaac176704179dcf899c86524611ba58640fc7c91b8f477ff0ad39d897aece17bc4248337dc1547fe8eaed37d16cf829a7a77e3d7f3b6438a37ae15c16ab1debabf6117151ba19e5be7bca1477a62",
+          "padding" : "3055300d060960864801650304020305000484ffffffff43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "7528546f84b9a056e49a848644d876452449b0e228681cf1a83c82aed6d1d68da0da6b880e31d71eeadd4ff2f59cd55340d630c6c548b4b9c600de0cc4b18d0e6144a5a294216e4c9901250ec8a6897eb39517212fcb0ba823ed763427e477308194927c7ceef49c440c690f5ed33375cf29d697da0fec04e4bcb0d2bd0f52a3bcd209218605eec678ad665e8adc2ba55caf883d14fc6cedb87634a36b0fb6019849693fe47b0e5ab62bfee78b415397887cc3ab293b170b5cb4217f912e13ffaa27f8ae6bdd4210dffa0179d723a53ecf6d4996992ea0ac9ed6b10064bc793256bfb4ac5aab69858d9ec4cf9bcf13c1bca969831639fe8bc372ca67b7603fd4",
+          "padding" : "3085ffffffffff300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "a736d77611787cfc46ef5e49ca0d39f9a1249326fa77b50e024c657c791da09ea1d363657fb7b9d5978dd9b75a2b7593528e3c19e6e41abbe0e71273cda50382921ec6b366b07f0edc0aedb048484d51b603d062aaa18c404d6bdbd61a7bdbcb32e917a79bd95799cdf43a992ee3d93193f9a20fd113cbe168df7f884067825b79fa73c72b9168f7b83002096fdaf613919ecc40422317fd14b5ef8d2561639a3bcab462c3ef8e0f59929c43e23cf21911be969afe3548c1b449baeab90a8f6b52be5f6cfe47b941a625d4020785e8180eed315b7a6840986b33b6ad6d519c53179a2c3cb180583808dbd3ab5acd90e4ee01687d0946578ed9d7558ab8de8a8c",
+          "padding" : "30563085ffffffffff06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "2675d35e89ae0383be3c9c622c1dff2963444bb319ab7ac8dbda22abb32296c6a5d09419e054a2c8740f79728ed0b1fad7d6213bb7fda21ca739996d97a3d5a21205f13692c4985e360a8297a011432e09c7c4b39816158337319b1704f503b96f3b9b3e270f41a840deda4c869036e456849b8185e03c2d88b6795a397559af36f479d6a5f95b93cf3a87a21307e8bd08b3bab11d0a3fc8342589b0c55093d366af08a3cbc6c0b7d324f09c21670dc50cf1ec1222e41fb114ab4312ec2cd74662a96bd79fba6d6cc9c677f19dca6fdd22d8ea7009fb330844496138f0d119211d9c4dd54f416c6ea0db267ad5077fa1b5aa4fbac15f7f4584922494365b2df9",
+          "padding" : "305630120685ffffffffff6086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "a8872892622d1126133c7de0a0a87f9f31ec8dc37969b81f93f9e43434d305d2bb1d1d990fd3f8ec7068cde599634b42b67529c5ec3585ad9897b45d6f791413d160de78171506cb7f2edcd530ec217b62bf47bbcc4a56cf11ee5f8f736a3a14198784534882b85f2e5533d80add216c9e5d0bb7696f318761f2c0ad788f2894d5aa70f2161b1f9a26cfed2922ee04d05a4bf11ef7800c5fbdf880fc1083ea7482e50133bfd3f514a44ff1d34cebc78c4a3db2d2a244585a23a587b38deac25fd15299deaf9b0e1d8df689876867687f98e60c250b5a0a35ea60763b0d842ebc5c8e3e572f72c8b9c678d17cd65322e1a9288c6b41190b2c39bea774dd02060b",
+          "padding" : "3056301206096086480165030402030585ffffffffff044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "2c2bc9f2b9b0ab9a5f4a02b2b02fc0ebbde33c53fde074a0899597d9a4a93e64c008584e89b281828fadc8cf6c7a6a99870a881bfc854cfe02ae508be21e63fab8c6cf6d910e0515532d695789b2faffa1209596bfd37828ca2b4c687f8affbe13e3ca76fc421f0d76283e6ee2fb60e5460449be80bdd740a14a0cbf98845e373a0e3b0cadacff00d3803d8228d96f75d025071d71056724fa9b2c77af66656a4f71de0c38cbd382a883a92ece692c54f255c2c8552f573605d25486fcbb06aa5da4cac4acbc5831b7f68756fddd48d7fbafae05990e2bba2539a37e534e4f57fdff95ed5ce3e11baddfb4415fbae94db41647b9801fe62c9d8a1585ddf25dce",
+          "padding" : "3056300d060960864801650304020305000485ffffffffff43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "bea793e3475943e123a0f811de9b3066d85d6cf394e1e8494741d8449ec11eed7b3d796ac69a5a3ee4279362f4a69decdcb1dbf397c7e0e46b9b855feb3b125f3ee8c735f79282a9efd6fb25bef533a9f3641f47d1ee3bd647e4b8e0c1bcb48ca35468302cbb32ece10135a63b4d4e14300d0a30b3eed9412b24139134c84cc2231dcaf505a15ebbb8cdffb96ba06b24f8e85e4274588f20454175752d94b0c71aa8d50a776ad13662c8badce5ba74f4d086aab60f12cfed831ee562d3b9d9bbf4cab8b53071dae0ce35644b425202595f155eed25a8d651349a2dc734130e0bff2f09b12750977fec65c79449b95957e3602104b4b0936d8e41d5fdfd1e2c72",
+          "padding" : "3088ffffffffffffffff300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "9740ab49e35c355c40c6eb4839c47c85a27231b2b96133015267e10a7b0f786130308be8255c68584aa3f6d4c1ac2c304130b5bced81ce26cf6a0a0bac293f23b31e2f04f5f91d98ff17750b299dc521cfc946134cfc76ab629f9abf5275739befee3fcc9c217e6e7c81a71dae3cf3407e5362ca0c0db20386ea943466d59ffb9e512022df97d666cb15c35b0d1a0cc532e408727e8f76cf9955587bfc1e327dd5f58d1f7edab6fbc7232d1d2afb9616fb5a5de1795cf6e93896a55285f793edec78ded83560b34b4102f505c4f2ab8f15f603a7fc73b75cbbad2bff29c374fbbd9e1d1a6a1dc10a09140bf0cd5aad2ba8a0926b29b3d830959e6c45e8d8fe32",
+          "padding" : "30593088ffffffffffffffff06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3008e12d14734a49882eacf2cf0b9dd3b4c9d3f40ce7e2fa02ec0577e473171b2a54bdcb8b2ce3569bf95034cd27487d8d90f0ec428876dbcc1bc858a97f521a61149bb8009d5a4eddf55c67e268a53fbd381e0b918455ce7b71a0a8663bc16d8fe2812a3951389db9a114339b16a13d54c88fed79a8c83042e3a436bb4488ad1ab501cb878dddf09a2b5a76a5d065b6f2353bd264c12692aa1dcc463afabf760e55f499110352f527fa98c30feea6d5b0591f4c6639716c0134855df6ada769fbbdba68354d364c2c19bad500c00dd53d5950d0344df58f5dae54ac532b5cdbc78cd5b25243378a903b7b5c9c2f03a7aa9e7b3cf5df2a5a0040d0ad993a0e9e",
+          "padding" : "305930150688ffffffffffffffff6086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "bbecd925ad43825c692249dfaf8d329e195611162f5f92a9041aad022b32d3f557c5492ac4b3909a61d4cb140d66290c5237c19989dbb97f38ca1c3db2cbbe557c23ac33768ffdd28edae33452c84d555aec763752322d285de31ecb8da49d8308aeb978d0e64614411a28b21a848b864ed36665f7490a277f885ac3adef86cba6e09161947f7555d875ed8c09c1d0d2b7abb8305b30211b7cbb5a948ba7f4b4f1b8a3d95112b13738aa7a8d76a65c35af1f4ecf908bc2cff1201e165be270b029ba6e47b9420cbab4bf354cd2e5e617b031c53c4d3d9b4e47084e25007e6dffcd23a4e3372bb52ad7ccae4dd5dc856fe0b1f6540048644290468132e3466c9f",
+          "padding" : "3059301506096086480165030402030588ffffffffffffffff044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "b3fc99e3edc4f81ae19855341b8625b2367e92e5c4b989cd28fa3a78d2f9b6254f314c6e31f6f5cf2ce2c6d835518b7e9a180127e3ce31dd31f896f5f910ff347a98dafc4b441d6046f433c694d300ade547ac6a509cc8a089141f32b1b58e8f87653d382bd58a258a7495d0e0b3737e20e6edff09b314ac7a44f33e83cc524d81b95ed0a2b9969d73b3cb256a0ad207c8c622c557db0c9871eccc36752433aae2393f06bceef3be7ad0d5f9875e24b3d7db00a905aa7066da5317aede4a0964dac144f556dd16f3e626cdaeb78262bd526101ad98e064f42aa9497c37eaafd4a0a2b0252de2556e20f201df34fd1bb52829cf544959f13fd380c435fbe39e8e",
+          "padding" : "3059300d060960864801650304020305000488ffffffffffffffff43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "b5f76f1fd7a6e786981f7a4fa8430dddd9a27ac86f683d4c7abc383932e57e5b15a30d6efc79cd266acac752fa73ff06e3f2169807133d3f9813932cdb7c83de7e57ee196f1785c12341142cc3af2048ea81b4b265ad16408a764b412b7ad96dd29fbf899d8343b01e74b63faba19c36ec825102941acfdb55f8388e7d429a89a5d10e96e2e612e231f8cd857127f6b19c7766e6d0f79d54e9ef54bcf5bcdb457509154eb5cb0640de286e2d4fcdc6941aa4d97f67fa99a1213deda89c78e5373e40a0fce38e71e57da2030575271012c4fe96eae29f65462ce293943952db34a93abb2719226592cd3c651d3d4ee6a36f8082a3f325290869bc3ca5f02de629",
+          "padding" : "30ff300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "1c41cc918d7f45458e0bcf5a8e4ba5eecf39beffac05fc670adfca933f8e997061fb546a2faacf4cbc92f7b6da6b7ec97bc142b41f38476458836df716b9b7597072f11848bffaf7ade3871435f2b06fa0baeb08d3be31466d6c10409e3871c92df4a6a5346b5d7c3e82b90539033d170e4950320169c7d9db5159201bb5457e9b3c02c9aa6fbf2b5359f4b657702d37f34bb0ea2841e46c73f6d30ac546c1cc8a83c72319bcabf4ac741a542f2c45fbdbde6f4d8be88906a24efa7f62cd5e7697ef02a76c3fc827c1d2969d8c4ef05658ac4de9ea06dac8c6c0a65bc3d05ae3517428883a0c219084486c8793e2d546be6c8cffe00e07eb7b82a07449c726c4",
+          "padding" : "305130ff06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "c098a958a53b531cf766bcd77119b565fd9e943eceda96bbd5e9a3178bd8b01f71169660ccdaa440d0523c03a455af18b27ec331756281618f9e23c29b088d2d2ffe0854d665279d3cf305d7b1bb5e5d50341460c483831f1712801496371d1b406a14b6317d495a4042c326e21d578bcbad406589a2bdc3fc0b4fd02dcc41c3379513b370b7c3ddf84614ecc4c3bd9e623153447f1b0dfad67f783f30a2e8c0dded1b085530412cb33b785de9b919f7d7971463bc89dd390aa46970df198d2a25d718c8af793cbb28dc0468190e04f0958145a76ab170400fc2ea35f05b20d2f96fe0f4c68031516fad5d850daa1d2dd2ac89a0eababc037619884e87379904",
+          "padding" : "3051300d06ff6086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "a347a01df709ed197c3b2d2cb37ba7b47b77c04ac8f2c8b210536635ca7204ee94715a8eaccf53ec5d0ec2de0491f9ed35f5b8f380e0d4fc97f380381312dabf7bbbe2b8916ede4b6172b084a46ed834ac7c6fe891eb165d606dff803ac345595e2c7123b827d16a3f0aa3ba10a33a8d92b30840a53a4bbdff30f093b2cb0d77fb4905458cf56313d4e13efa8c4322f75eb0247ca91a3c440c367de13808624c6accb006aef61812217aa2821ec82503f93d22b56029ea0c995982c82aa5036fe63663591165c6be4d5aa357a98cc8f70fd2d7a68aec6c5e2273933f954d7198f073c2cc3263a38d6b4af0079b5f3a5475152feb2d90c1bfa2c859ce909f452c",
+          "padding" : "3051300d060960864801650304020305ff044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "376929ad5fc3c2b1692d36a18402752ee5c18aecbfabe02f09e604b5f6203222eee92f58bc3eb387744b07c55c5e8da5db88501dba16f0c2d75bfc49d0e8ddacc31de46b478916dd4ac26c98302761bada412621287a4d2a72881e97b955cbdfd4ab5093835f6247c5132a5310b5482044704fba3128f3ae14b8b4fb14a347d9f96836a7ce51346d9405f65ddb674f99c4325eafb9044c8e3e1c817cd47c3ea8ff0807a4c863398f4d9658ef729391ad36831ebe616f6fd9505741a93009748f24e849a737aeb4872f267ca94ffb2c6663d0006f22637c27eaa44dc597dfefc2235766f5f001bcfa8db334d88348ef0894732c8b8dede9b8e6801a0b28071f6a",
+          "padding" : "3051300d0609608648016503040203050004ff43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "1b80690c323802241d2b9fd1b024571fce1ba770566018753d6434d0927336d9d4441a845d629ca275502d14bf818ae7a58ff7af427c3b8ec88997473537cc564267270bb2be0030e0cd934c417f814091831fcf776331daa9e73b7e426f73f0ca9c1733d015f37cce5893723f1ce9fb2fa0bfc3df6fe7ac28549983fed2f05b70eae4648011da36855f892dc65c06c909ffa179a8950501f4e650fc6a1b05ab988edd59aef685d5b05224445d9603d5b816f1ea3b3743fde547de72f15ca60c305c6f493310d22e84523b036bd71b1fc3e38164ef7b954b0bec028fba60c4720710356d080917c1c5abce6d27d3ff35d63baaf685db37dc76568e3b35147d54",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "596d8e9730030342f72f0a850fa5ef746f63b89a1e0c48b67a817f775ac937454936cd8400653f4d1f82e315597b9e5146ff3fe4f9412f81cf6f8516d9d440c9c01c6a8e0a56838e2a206216b2f3e419e5fcfeaacc7c9be4fffc7586ec21d8bca6b49a2efe44d66266f298a3b70c4310eb22e64366bbd5f324a1c9c667cf0d970ecb37190bf7c98977f180100d3d6c63e3dbfe382e406128eadcbb99e45407a858dc6a443bdfef2c9531bd2461186ce21ed34cf5715b764c5bb4d4cca9fb59c7f90d9f71f43eafbb256906095edc27679b8c752b6232ad374c668d4ef2c55bc6fad362f8538b553ecea8658adf73fbee8c6c47289d9ac5c4471f74847697ed26",
+          "padding" : "3051308006096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "766027246bf7d6eb5d4a137dfc5d537fe2446156834428d928f6c2c927f8e911fd57db474d55b4e8007a0cc65d40e7f3b13c16ab4c106550e5a89059862a86d95b2de4dae32d29f7fa0ab67bccdb74f90708153e5c726614ac33d61b3ff90c90a2c8b7277dc33e677647cfdd303462ed192c145264f253cfc403bd55a48855ea683b3e0d39b866c9408f149f76beee227a9b22720cb5eafe4ccab94dcda783ce5a15c29905c2d932b57eaf359e1e066ee4e41f97ee2338bd61f01bc0516463a6189cbddbd083e61f82e6ed918942242ca178de8ec45d9c3abbe0d6a621fd395114ec2f53683cfce25c5d5c5758f81bda5f2323c4f5897e7bdb5e0b1c9a2691cd",
+          "padding" : "3051300d06806086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "7465093e55ef94f127a95582587d4096c69391e5fd935f9679cd2423d5e4e2edb53e1c6106f12e57fb372f0ad6f0795fc9619651568834be5f78d4614498b79615f894058d5e9be91138895fc5f38f4dea435ee9d8f9a43cf3bd98778b1c6d17ad4285338b26ac1288b97c4b2fd1ad27d02c152f38e2cab73677de734e56e6d48f1cb5c8bb5cdce8597952fb63ab5801d60acde502e5583825173646d4ad4a7f47dfe060eb7eaf34e44a45f621a57c6afe57a4fa2bf785b09f0ccaa2d6179f4169b65bd8d71b1ddb3ec92807708354cb10d10a4f198dcd1eaf8210079b12ec50a0b759e0f32103f46d256156e8635c99c973a03f70f31e32ed7c441dd4d7e36d",
+          "padding" : "3051300d06096086480165030402030580044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "7925db05fc296b0d369a6695038c4196ef66d47f0a389ea05f0904eb9c048eeb464516de247437b2c8aba8fa6f95b563c982d21f5141505d2676b7691454a5f0c9c9d07d19b81c901b01f9c1cf5bd9b0d5e0b2e244b8475a1931efd5676bc18f84a8bf97031e2fadea1160ed8437c2dfd9a8f7fa918e93dc8803de821a067b0eeda6a6ba7c0a74f403b3fde78b182c7a22b6ca779513e0955a8fcc69d9a6d7d1e7960c032539f17322cc40e8698c146df8448ec2a430203dbe53421f2cf19158bfaba36840a5336a775200395dd1feb4363a4df2d115b6508fb2a52a7e1896a85fc778af2e014d485bd270de8727640d7e878fee0ca41b552241a83c1531fcff",
+          "padding" : "3051300d06096086480165030402030500048043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "7255b2ff2dcd7241daf5c0973f37f460e2ac85bd20d4310c2797f2e263f4f8df1a70eed714bf5fb19ccecd66391abf0d3d6266313cf28b828694ceeb9846e9adaace75f691f9af5818e05fdccb2e2dc0c9cbef64aee2e058a0954ec3ac9d5146073796fee6f1fbaca676a5cb70b00bd0023b7d171e4f79d22d16fa3d6886f7695ebf19ef51d0d6e193ca73939c620c632881a26d61a354184e00e805e20326173fc14f1e0ad0e85c74272138f58345c365e4e46623c624995bda7eb6be14be0d276d6b6ab770b1d1e424aeba562e80bec509fe3c3646f455ad9f3ce1db8f8b923aed9ac89a72505e608f3ec9e58be7bd130e81c1e7d3b0bcfd20bdcda9e0945f",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "9cfcb1b8abbfd5ca02379491ae39e3982ac9fe8bdf9577957ae39cc3b7c82815063a179822657aee3670e4b37436d47d7c24b79f5ac06d14a9ef51d5d48be524d09d1b8068b1af518ec4c80e2da596d9cc5f0fcd261a366ddfb191d0767e02371184ebe7b5999879ca805a79c428315ebc350ebe3d832fa0bca87248be57b1c1ce72df271cd7826888c43dbc4f187640ee5cde3ee3f004b530bfcddfc0eec7884998255351c7cfb7ae5d8356fbce910df9ec471ecfd15c3666b7943ddbbf3c688289ce3375bfa8a0fbf3f6078376c5f310690872c7e608b87b680be66d91630c8f3a71e44906c75560855ef3f341bd8cfcc1e49cbf77b58222ee1288b6979ad5",
+          "padding" : "3042044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "67c3f8293b514637ca21417422cad5f3c5f39fa97cffafd617ac72649a9026047e6d8ad968e48a9523d0883666dcf1d7745e2bca246f01dc285c34b87c10bae061e8e9e9b27c673e43c311bd23531443960f132d78e667ea8d22e118ada4efeb34a84d147b9206a5c462f89c49c34785416575e7ec1d61c0cddcb4aaca309b44cd5a5d0a0266e7dd71171e160b761dc3f12024b2508196caaba0102ae74c7dd1cf1c1f45127cf532f274489e9af63c02b2d5664375faaf1b7ba2b556d46b145c28a8d123b5c88c0151698f7771b790c00c17e75bd63d48406b4b245827364fcafd4fadf605bc5f68a78323d362189ce601a7919e7927e3c62c2149c99025d5b3",
+          "padding" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "584ff1c5a6668279b29b0e4a49fd2eb654c7b6466e76501a79cf204540da66e98d74abb67a990140e2c580cc17cb0eb9a0eca5d92f05c742eff0a037e841f22baa1144e2908df2c2dfffd0574eddf71eefa0a6d9eab16d29acba2af2ea9c6b28f9e577cf24e8fd68b160047d01601a407c048a62af4380b2bd300277f3f95531e0c4648567cd043207e8c80fe93a763214ded5c6706fa2617d8e0e6cb27cb2727b966122ee5031197c1c6f3f84ad1139d867f8c770c3dc0de731ed67e3fbed068ff86e39cba44201a309fc75b2f7c7f99e4282f8e1c7376a70198fc8d3564f7d015c7930658456a94f594abfb6eb6c87f41ab340029c57c761f415f5e5faf6b0",
+          "padding" : "304330044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "19ab49725adeffce9e1be9623d1188d5449e62403909441891a6179d5803dc61e3c647858d8db24ab61aa8f1160db289e7ea0787565d28b097ac975e5602f4052b703de1211f112380aa9264180ca1ac117fd21db9c2fe6b32dfa4b9e6fc42a94e5be8700577401b0958888adc4ce5d2720ea79b1e869b42b22e885224fff14de367bd9765e1e426bea325c7ee7982d7d234209e9f07115363fceb459572fb14c9b2c1477d36d687dfb2413fbff70a7edebf86a7bbdb99b1b6de454544597d499b240867d2fb2b5efaeeaa1107ef4fd62f5684c44d1aee075e52b467187c3312e46889edcc39f3e0bd9b57490c98022c89e5f61a2dd5931685e5d5e8fa1cfcce",
+          "padding" : "3053300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "7bac3340b1498d463629f91de4401adc8794d07610b10b81ef8b936e4a1dd4e7753ff7befb08394ec3d2213a969adb00492ef61247fcd77e1bdcc4f5bff41aaf904ac021b194b1b53e8763be5331e71f7d0f30a70b12c5e1f11678767704f925827e90097d8116e3268a67b77ba40b2ce3f29a8027e06d3072accb1638a08d119819350135d7e3713f7366becbba4797b294e7745476b57504a9464cff1d43bd6ac7b9eb17c9017e951684d1d851737a4e0785be8f50e9981af883baef33dd4bfb293d6e86a8ec34582a5508dbf1860ec5906ec9b18b2dd05ec3df360a5a756cd0328d2001e752674cfdb5080371a9bc62a56b3247f900eff0c98b426cd5aab1",
+          "padding" : "3053300f060960864801650304020305000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "2fdcf46433528f55e55c59db36b48325fb1450446cdf238c5af6edf60d96eab9e0b7e0dd7df8978e61afbbbf98eea261eb18d05c008eb994ad3a4b819d3cdc530bc26cb7e20ae25784fe3b1ec655370bfa5ae8fe9e9a52d4e0d1ea59f579f774df7fcdbb1bb0a46ca9f793bf4955aef584d361c412f488cc4cef9306574dc9c6ab9fd39846b823b4baefa37ed955c882755656c415a4d9c30ffca9da196563154c0935ce0b4445328bd814b2df982312a688faab1b6db92fd6b37d5a55e0af70db5d5cf3e35e5dd626341f53fb3c28514c9c6812f725d5671d9221dce918c397d7484f0a87d884bdb623003bde8eecdcb87aad7227df07b6e738c3db1e46c932",
+          "padding" : "30530000300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "671db30f2d644b954f940763486a3153300b841d03f3879e18d4b146c850a998e8bf284ad997b5c1bc91b053be869a93ddc439c1360ac22e54247c770fdead309dc2b8ee1fc192528751ca97c5cba6cd833e65047e1b136b9e16c89d339d1c4611deed08d78a24573506729df3a67ab6273d653341875cb15c4aab9e32685cccd6d73461605f2d397cc7d8249cb374ef065aed42378c939b3875f64f16fd5b59db0158569e6075aadd5206ce7650a0095d3c11312c3e5f21dab98917b59aa5218b69339853e29fd50949fa24302c6475ff232929562f03980606412ba6b58bfe4baacaeeabd8f6cbe807006c5a527f368cc7719788bba8f5e3de908f40d2fb4e",
+          "padding" : "3053300f000006096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "02889387aedced02dda2786e1b3229958823fe9784b81f0c19bc61920ba00e34aa392409c582fc9f18dd2db125bd47e25820665a91b4832373588a0d2fecc4dc2921da9860e148896efd00c7525c64fc8defcf53551ef8970662b43cdaf14710055d490c031df27206adbed6b4d2cc5e65200eb3e37eb7b3fe5c8897a2d8f1f1546459f1888752cbab6657bb9931c5dd6cd106c114e9f15aad0898c72eee9209db93e8a3f4ff595778fd0f70e205c1e21cc37f64e741dcc5240d9709115781a17ce1b9474bd96e6bf30e320f95d9cd4f234bbcc7d23f493acb5d0a58dd84e1fb1622c08940fea7f6d1c842a948ebb5f4f478b02e8282dc55e69cf014509fd770",
+          "padding" : "3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "2b9fe93da30f53e330a798d543fb4e7fa92130388c55091d28e80ca9ef40061026a0138264c8063187e1fa37baf41ae159d1d3899ec9f22a6a37325e807ac8df2486dbee7f287a896e9124df0872a941fa85138333fad7619f010533e817c23dca7e86c7e99c191e3aba443d80e4c80fc45fc0fe53a6e01df3ae620bc6a7121c533091344c52fe496c349eaeadfa63ba22c58a9070f8d4e705dfff90acb355b789115e3c79e8b146587b06b2167a852be4622354152d24a625bd0a176ea2d3a98fecd4f455fc9f2ad3b4b20ed21bfdeeb498d18fded0d4383a9731b9ed2613dfd13aa2e603e9680dcddc3fb5727fd63dc34da27d3a355079adf6ae74f37767a8",
+          "padding" : "3053300d060960864801650304020305000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "6461025c5ec1eedde863cae192d8a34596d7d620ac1e14abf94d68ceeab229af5c0b966e70e54cb0257a8e26d60cbfb4f40d3ea675e7aba2ce18f2754a8130a0f38018b6e0349afcf63ad02b7bf75cb370b63f2905f2b5326be8bf74707b69487293fb206d4dff1ee0be775c259bee1d862e821c10afa60c3f6e9c610af5c84cded299daa97652a1614f649a90c188622b501dbcdb3ca4d13e19221899e49579a6c6f36238cb3f3d67d87d2df3b824e64724f8c3b8c2755e7384ba0b7cf31bd1e5ff16cbde4e00e5c5b866702467502ab5c1f226f7e2caca913d993755eeb6289af7b75c9548a28f9d51941c5d62ba37b1c76dceabb705fe0254d1d603f40015",
+          "padding" : "3053300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "3047b4b63cd0273a80b6162fe1d13a5b92c1f93ea91bae6a3573975e98016c13299e73d8f996f86573e389a8554de79a9dc873bbef1c849b9643f6f75537fdac9e76f07e94f3777f97c2872b351096a67d0ccfb3dd6b415480d55caad089fabfd3a3de04aafb83948734eb9b56ee5aedb66bd539619d9b5e5ab4fd6c94f74ac3d1980ed1e126a7452b4dad5e0caebfbd7d107dd0c3c0ac654fa5808c2e33aa50598334ea2e1743f45ec1f8a037c869d69b8d6aa86d27720ff214b0a6ec8cf5c775fc2ba8148489700db930de18e0fe5d9e7fd8786d604cb7c85cbffe32ea16a749eb31a6ddd24aaef9ae0edda02b0e8f6bbd1124e3befd7ce56351c4f5632e82",
+          "padding" : "3053300f060960864801650304020305000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "b45aa577e7ee5a6e0b230fb3a2676e47c064c14007ff5d3a56db38ae488e66f260e9c1e9a49d771cdf507ce9cccaf1d5e864f761134444cff79b78ecebb91f60884828df831c38090e718276fb7a57189c978bea9df2e8bf1e9c20dd402ad88e1e08dcd2036821cf47efb29ae10a7507c9d4d6c6bb902230ff99619e9ee4058bc360143db9da02c08a6fcc9e4fa2e068ae4184a166a64f817e1c5e6ef786ce0eee5712dec4c604588d6f907b4fe8a43a7c0a01257566f93b461c8fc5ffa4d55913185979e93fbea0263cbf99d6af7e4873a57da09803fc435cb233aad7b2b1491fc9a123be89378b4fbeed3f55071f96fd9aea7286625769b18a982c8c3a3887",
+          "padding" : "30564981773051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "090dad9560cbeaaef4a311285473f5cfaa4a264bb685d583f50c4b2c13025ac22959e81fb3b253a0e20199e8ec0c50a554675df9846ee579de3e40e72fc4dacff0f847d26155e2c0c42dac136c2ff5f427c63228342c56cc4f56e588dc4d676fbda7d15f59b30197e21feceea75b205d01c29e691a840e884a2a6b6d2042367932c2f71b42ac28f685bfe80868956fba265bdb96a6c8bd101886f7bc6b92111e2d5942b25f3660cdcd0254f09920ea4fae54e40862d7a71be42a2922f8dfc708c1ad4734e6d3452c902da9ff7c9b653ff5ee152fbe0b039f3b1f1a4b125f4a1162d12ae067d614f6b6cb46504dfaa78535c1f5705b4094176a1f968b4f4726be",
+          "padding" : "305525003051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3327d0e8a13c15a84b8e77bb0b6aaa8c437a7b52bb793d00a992612fdbf9dd30721884fa7d96d614266d5667cd4f04e665b2d9fdc07c74aa239d523c01397043176ee4fd4fe542198c4ca9575922a629f6ee6f5d23fe57a7dbc060ef98425e2d0c7a368d2dc3126410233a77f2e9aeb8e0ecd99149bb55b4fbba4b49d968d266aae48d88539cbf64ed738c834b682b1960a13640afda6b760076dc84f059f4f4416aeb62b5311dfb900ff945d7f4b597657d6fd0ff16741031bb36c892e403831d99c250c66f54ac34db3f548029ef2443469209e9f36d7fe6f79af249cbd56b30b767ce09dee699cc5903bce7905878db7e62cf9cb0a0e889152e8589e24d3e",
+          "padding" : "30533051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "54cacd037a775ea0004e41ccbe0779d22926403ac988d1490dee91bcccfa442d509eeaa6f620e09bf9088f42a3d32b7b726be3b4d5e8e9562314ba96a95564ba1684ea4d132f81c14ee67d4383eac8d6ee984ac539030919f81806be095831db118b6821cdf61591517b38e45daba68fe2d1403bbc79ba77d721a9cb45192e28c4292f7ddb61fa3860ed3bbfc53cf5acf6bf9dc01238bee8083a25d93f7959ad931d1f47390d26c3a417eac4b73c48e6536662f41aa8986a65015532d094d85879051611337474abc9e3eaf1c97850e204d298c8c38296d6a5a0058e6114023af7e28ca7fc94eb70a42d37c1ee69775501642bedacb5dde8f7b75ef096fba3e0",
+          "padding" : "30563012498177300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "87493eb1ca944ed8d38710e5231adbc2d21664a963aee4df2fc2573b3839a6daa9269dad4d1eff34ab00931d2e4cc939004ddc429b0c780ba2eaa3e937641468fc3455490906c5c0ecb3c488d3f69a5e2ddb29076a2e2abe36a9542e9b9920db662dea73c1818a71b9299f8e26504a8e2e81e87e713100feb5c75c3b222090987fbe851d53595648fff3490cf6e1b978753ed6250dcb3aabb5498708c2555db98ea4adce3b2a0cff130f38839669ebacc6bf86a177804bbd93155c71f6a754e41e731bc67142488cff417aa2d4d5232eec0e55590e6fb4dd9b22d23803941b922e31b70f2d9a29a1dea5e356719b9fe15adb9bcea46cd935133e2bacdc635e4f",
+          "padding" : "305530112500300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "6dbbb9ae8b55d0dd42bfd45c8086bb09950143d0c0c10b26d1d3d9005fb48830fcd0d720054638b501a2cd7311db9cf664e6c587688193e0fb62f897b295b051c95dae9054770c5d165e2f37ffe4d2cb7e7763381a69ce7d3e0cf8a1ef95d26da58d03341d7ec73c4f843c4b225531996463986f275f9fa7fc18036f69e4e3c3ae3d122c6f035f9a36b7e36e5a6ec811d4791fe7bb603fea4cfcc13044c484431954fcc61c2d103b302698c6470d6a8ae181060d02ee36c7104b6984288718eabceb2c52c36992503fa035c7bf4e37c468fc5783b33d1bcfadfdfd2b04d4db985a4159f7bf08d3a50fe23c1bd4bccecc79ecabd3e0271574531e93f11ae38ef2",
+          "padding" : "3059300f300d060960864801650304020305000004deadbeef044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "4aeb1e493470a207c0ba34de3a752639557db9d7e86424a3852c927d5ec5f384591c0440b55ae33db33b1c3380c96f72d94a93760155a259abc7ac068d86c44285cf3280f75087c5bab487539c002b933638a7851fa491366e89e8c33d27a6ba8c3bd2af0269bafe24abad6d57c86c5c70f61ed0b3a35594a73322997c49ac194eae12e00e7f5a332146786992c431203f836b3ffb1cbd02cea793fb6a133354436d78503e41055714c7cb74351c4d2e51839f42bbfa391ecef0b252e9040454452aafe63b57d4f8c6620cfff49005718454830976fd6dee6cdac55212a4f91082b64f5968f05d405398881e1c27b1d9fab81e63b21725369f1ab7bf29cd3dc9",
+          "padding" : "30563012260e49817706096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "5e005e27f9c909819bca7e39bcb9b83725426ee28521807cdd06c42265a4d0eb4a71f8173edf095969e3aaddfb8c431120fb50d5c5edb9c0b136957245593aa255f06ee0119f301f9ebddad5a826c74c6faa8b2807cce226aefa07d0df0e0ebc92f34d42cb2a0e5c44f150bc78c822b2cb3715f9f2f59e3104e199597abd4c54f473e5a5260da3b826e769b2b0ea0f086c397fab96c727a22bd2758ac1e180e1ce18d0be398e640994b144504f4910f2f437eeb52e597abd1106ebd80cccda505066f884bfe991200b88b6816a80d8a5dd1feced5622c73e1f3964b0148a17bf0e326719d71c8f15189ff676ac154b5c41f787a11443de0e2a953e0a0cc1e937",
+          "padding" : "30553011260d250006096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "7e9e9ae62b8e55e530a179b44e1dc4b2c8ecf08c8f7461bacf03fd78aaccf5ec7168220785969614bb84b44fe5464bccd6ed1073785c8a51d3bb61fe0161d335119ee807298ed0eafe9e248adfdd90ed3e5b5b107db429765da0246c669f65f283c81ca959caee80624deaf312702f407dbc7b4c856b6b28e64f9cd385c5150ceab551f1f17b245915d25795592c2b2486ef2e0095b71413ad195c10c76cb816cd96fd091327821dc40c9ad0b4190c7ba912514d51b8c1191b8b81b7a318d435bd97e50c9c0e459a874230e99c66ec5fd5d9f4af360c744463ca2925df12a47fd76592927d55eaf60014d652527649749509ed6ae24d554cf31b0c3fec8f944a",
+          "padding" : "30593015260b06096086480165030402030004deadbeef0500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "45ac5b2611957ad7f3949c0f86abe649e3b6b08aebf3ead9df022741b87c09ab969bff2827fc96ab1f569463e889e2c42e37718b9ccef9670ed736d90a6b07915070f60bba52c53a1c8e4b56940ffcf628184d410da6e413ff905dba8f38813dda5de7d7aaac84794edd80bb597106f239d1f976203c704abc66bcfe04518bc759c8d40a6866c41f56d17a29c81871968ed7e591f0b0deab4570d2c8c12d6bf815acc3f4e281280e2251195b85d2e8713ab632018b1991e381dbd9c750f6938062460f79bb88793e7ac132219c426d39dd6cc691f5c081d705f13e66df9a4b51862d83e1a5add751dd85ef883db58fe7ddf8a501b4449fd5cbc9c6c1b14b102c",
+          "padding" : "30563012060960864801650304020325054981770500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "22fa9a0051d15ecc5bece4d6ebed89856e69d8142ffe9a5f033dbb1ad51be298d41706fcf15cae260262f41c847e8685126d300a7da7346c6a27f96f4a72f55fd49d71291ebdf56b3bd6c89ee3cc2583f6e437edea19858eb9c086e248c6ccd5f2ad5eeefd907900047152ed760a5a6f4427cb7c3348c62a4aff532836545a9f98eca5862afe03e1bc4ba9ee7134c8cbe30471331f90da43955b3d25db691268afdf18bbe76030e276128b94e6937e1a14b8af87f4e9de84fd0a38a19d86fda4bb952b7b8b11421c2fe700fc58902a8938d6918f5fb5936889891ffc88a8e6996d39af02c21c4ba9b75c8c0ed1b38596c0a8c271d1b598248c15cb27a31f9402",
+          "padding" : "305530110609608648016503040203250425000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "97628cf0b4a0b2d52849a51742d35739731c3572082681d8f4a6a5e3db87a9c5af93fac70109aba06f9befed48f069e1db2bf39e5b5645860875ac5c1c09e4beab0793f40c3072634a1f0ebf121d957e4ebeb92b5cb2b42c387b6d2a31612570c902fccd03c47d7ea38062905c2f8ec457d989833d6fc506785a3d86f6b077ef9ea454fa1dc2f8f6ebab997aeeb5c5a275fad733e28fd5f43c44c46658a7193bba88d1e2bc515740c1c9804524296be7321768fdb0879c6564885b628cf3b7288caffb1d038d446b6e8384b94f6fc14e5d7d51f07468d4356a9ed16c7f7fa1ee899ba579f09d65ad7c5e77311287912d9069ff93eb05297f8d24d7a7e37194c5",
+          "padding" : "305930150609608648016503040203250205000004deadbeef044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "6e31f57bd445e460399878f65fd7ded779319a738c1577248bd2a35e3c6e527a51cf920fc367beda727bd540beab689f0d1f82982f6d5c22a44bedcd1fdd0bd8980a09e4673110dc4ccb696973110a428c978f9f73a96ae984d8a3546e0acdf68bf6cbba4d8436717c5c4f136f8640a2ebc5b0596d2ffd677bd80df4fae538ba27c838b76e4eebd2449bbaed35bc66e2dbbd9dc591086af4ec86d66cc2185ec871e9964ecdbfcc4dcac7ac23642f688dc67ce1391174e7158b06afb5f4b86e0b86ba9dea277840b1076e9a71ed9385af6edfa71cdf8c24a960d5d3e0938b75f15a68bc5110b2c6d2785c1eef49e1308d47d70daf8df22838fc4adec798a322b8",
+          "padding" : "3056300d060960864801650304020305002445498177044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "a6038ff3fc350ac0c54bf0a0724734565afa24e28f119245df0fd0d64780d9a814461629f41c8df83bbd3d1a2af15ea3a6a80999a10482478ec77f141a97a6fae9c58b0984683e7695a6a0353a5ffa8cd1ed4c6f5a0ba56d1351f9b26c943f63043ee71323124de90d2cccfa39d14dc269fbfce545188489c4a15bede668855a81caf4e2ec544f27862633d1e5275e012ce91d80289988d6fa7792011a20e1081d994f21986d8aa72d2514f5c9baa1b8fec3b543e4e2b32d95203f274740e7ef56c3721884897af0b41116dc06ae3d7bcfe7656b333995158797091e20453eaf8da37f20fa52e234ebac3567b736053b211cbc73c8f4e753f000c823c84742ef",
+          "padding" : "3055300d0609608648016503040203050024442500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "1c2a1a28043403ab356f34272b37838011442562695e66e8af127ee75b71ac0f3dd40d60f0a62331e8454f3a422090c24209201a954227cd06eabc05d605f7d6e44a97044e61b9aa40aade2e37611dbe470a043f0df3ebf6c54f715b89dcd88c63adb710386a839308fa1f71abfafa56a9fe678c7d2652e4aac60884cf54b14376d3be85aeb8212888f372d5800f5f25c1bd894aa460905b5151cc712bb3792a0d1b1b85519234b169354f2ed16b3e1beaa7a9da7dd574e1b28a993b4f9d3bf32854ca4881bb1379b11473268bab5919ea3323ed95104049197d9095947433e9356ab2d4800e20fd54999185ae51cb25a50dfd799b9ec575e73d411f373d96e2",
+          "padding" : "3059300d060960864801650304020305002442044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "6efa13c513d0ad3fd5e633e565837e59ae8355453697efbf04256bc76010a09fd257488df9d8cef8d78b2e5819182119092fd483e601a8c4d984cb5e8817b798bc70031bd7325be8a7e0b44508a9350ee179a4792b351d370259724e565e60df9b72186ce2800c4e79511767f66aa84cdcf70e646065c942c9fa2dffb16b0d819dc861cb16a52ef1d5f36833a8a9312189898b142426bace8bc631b1b74c96d03669eb92f1ae83fde6bd1f7db7e94a93d117e21f1368539c3348165a0126fe08a60b8f170455d67cae0c1c5e651a635392ad1818d51412a6b6f958a5a80553f8cdb4be940f78a3366e360cb3edef88419571f0b5ec1f1b5829e5584c2c3d6195",
+          "padding" : "3059aa00bb00cd003051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "647d39715b34361190bd842b775e7b53052b72f9e85a0de8be0436a2a61ab402237cbb85de1466e702562ed04084366d662db011aac0dbace307078ffbba1b3a37495fe6e604fb5bde54ee9afb15f45308a9a3af51f6c8e79ba69935635360cafec26986d339ab8641a1bff1f1af0c1196919ad4d0c9bfc7ae3e43296c04fd5e353ea5f754149cd618172558263d3f17cb6182befe4c40816be06045e5428da0ec1c3aeb71460802485b390b350b37b8ae1264ceaba74b21c052c295e36068e685cf9601673baa2d935ad3e323000b3397bddf91e64ace3669dce6c704e65142773a27c5a07eaf74e850bd72b9cc464dfc5daa8b6c396d0add2937bce611beb0",
+          "padding" : "3057aa02aabb3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "7f8f298c1628a3d42d4a60d93d269d2bdd2aec2b894aff12cb2cc2edef41b4b814622e0afb0f893327e157bca9ac0edfd1b76eedeeda70c0a0c2e8eb85f2098bf9808a0a4e9ae4c738c8f721ce33452c68d0d06ab22184af90bbca42000a90dcf5e3228722db3a206bf2cc6e31c90f1ef233898acc957433760f380137586415056467d43900a7c21d25fa20253b37d7288eb88a9348343b985409843d6491a9e12ee6907233cd83cf8b5b6b45fd22f4b5bbbbbeb152b44e22c3e03c8c18dc608cb5ec6643c17f9165eec5b8135d14bc16a0e70edb5daa70a2d50991040de1f0cf4382ecbded2e6adf8ea5acea034ab00c33b1eaf0f6ab10f62dd30406d83667",
+          "padding" : "30593015aa00bb00cd00300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "b0b831b5ee661f4eb43b906a2f9ee652f7f0a4346a9e4049555d8bda185e195d8af881f2e36304c8b66abf5f8f030cc0b7ffcfcfd67fefd5e7efdfcd8caeb1daf441f834004a610f091ca2f8c974d51a0b7ca76563927f19d0e120a90393ddd6f999dddd766d2435ca3e526247cb2b649d4ca13d43d898369730c6fa7fba937a274721d21e2e0578f4af4824d0cdb377e292c6d142c26494cc0474a9da3f57c60eb2bc8900347b4e619bae96eee6489dae5e2b94cef512c9f2e8a17d277e02ed744c71215e21e6d95896a5e10a982b0f35621036308ce9f556726d9a83fbdd3ba6df047e56b4793ecbcfd57db1f08e6323b3d9ffe3111f7bbcebb46eb33694fe",
+          "padding" : "30573013aa02aabb300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "c16723c96cb88b871f9ec6edf3b008e2d003a8e90b93cb0a1927adbe736a8109cc7bc70f9bc3dfbd656db4fe779167306d97782981d0639252d3b498408357d4ff5828dadf89f4f602462330d4c6fd61d02ba17c39d072a87ab23e926abaae6528c2817faea5c8c02befe96d93bfeb86c5fc0b5ce1c24e3a4986a512f9b935625107165179b53a137b013b0717fd203df902631ebe4331fba1631214f1eac855f50c6a5a59eb8aea944b138dc6c1e92da8cfa514b254aab63395880ec4cb8117779c6a46faf28917fe77c399863598284dc3a5d8671c0d2856dba7791c84b207a2ba18be5d685dfa1b3f9b5582afe9904b2d273113e015b1f4194d3ab070e095",
+          "padding" : "305930152611aa00bb00cd0006096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "4f0248aea56b71437bfcc7bb572c198a4f9f120a8ceb9a0b2fc2e61af786bc447b49b99bab96d009cc6bb8ece7d66f08765439e5fdb4ecb771193bb8b99e20af4435446844252d29e054c0c75fb0baa20760929885575998045dc6840554212ea6d240af67eda477923499f7f5e7d9c3d95d9fc35e40c17e7d5fe22824ec3bcaddfd71744865f775cd7eca63bd615d718518b0ca6c127ed6288b7768445ef8ab6eebf0a3bd0fb5a18e94d28f09e45031c3e3e8c4bc0bd230140de3882959115af01bc6b9efc05554318f733da51f6f9b66c899324eb2a3f21cbfe64e4772889dc5f52dac755d640182a1ead5e0203dfcf1746b64d6d4f4337228698ec757e0f9",
+          "padding" : "30573013260faa02aabb06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "43a674e2a0fe1adbc05065c7a098244c05581303352a797e003c39309b09d4f4303d1757aae29cb2ef361992c28d955af3e293b98c0c977744971c6996c1dd93f2da8bd46c771885a4634952d0538789406723048454ba3e88d78ff44126eebb0a7d850223a02a64285f678d961b4ea77142bbdb1b708db912425c6f4049de3b75b046463638a6abfc463265494ded66db720adca38aea8f5f03a930ddb784a3731124209ece721904fc66d4983a36f6a4d5adbc109a4d66c7b861ba92fa57f846a811a9a4f56187b507488bd49265cd017ef1721e4decb3b2c66666977b2af010ab1985bb6b8b8322ba564b60052ddde7f106777da138cf0013dae91887d71d",
+          "padding" : "3059301506096086480165030402032508aa00bb00cd000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "91c7ca442c95b09a08ffceccaec1ad24609a1593c2a89dbba9f30de5650ee6d534a9c476251c7a601482ff44531350e87bd070bf8d8d3f716c3dfbd635a0719c5bc2a5f042baa13646266d640b414349f008256aa70a8c4ae0fdb34be64684547548a6794d4cc1677fbaa50eaad7cd5ded53c07a601c65358060423498801ac9d2ea1d227f5467f15accd6efd3662e344a724a5728e651b199fc20cd62c4144e60781b458c06bb1521161527179d8fddf3a2087757a0920dcd2e75f88d831e95b246784c765cd21c6ad698bd059d96aac722a70669a13fd3681da3acc784c79924b9b0e6ef4bce2d9d2dcb994c41443b932bf8e5d15797f846b39924ee6c0658",
+          "padding" : "3057301306096086480165030402032506aa02aabb0500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "2447976e684d4f5d35e1c33ec207f921ff9767732e8864cfbac5da51db7533b11d27c07e96f278979da3a6d3bce53807bbc2449390f5ed40bbb81c7517bebfbdfc3f1c15a3b22a8b2c08cd7efccc90e39c2e001bcf2a58a4e29d38426baf2ee533f1cae67c8c1f4ce24d6505ed9a118cbfb192fc4e378a9b5187615e69296e1bcddab1cf88127f05c29f43606d00ebe259868668708de9f5a9bc51ef0dca83e8d73f0a762015100553a440688feacca6364c4c68226582028eabd275692e133054d2f70d8c4b3cbd2ee69e17a571d6a3473cbb2c3fd8450262981180cd1c81194f09bc7cb3a2f7a949d8c56cf69e13af7d981f170073f2ba8ca55c9d1c9a9343",
+          "padding" : "3059300d060960864801650304020305002448aa00bb00cd00044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "10b900848ec8daf64fc40c57765d01462225893d6e5d46c21a1b7de405fd6fb505b678427a274d1e8954f866f3abc6c7d5ebe78af88de6ad8ae31f42827dc7792b160b70dc4d177e7e4925ba24b75fb19c131d443b0d4f0ef73daba868ac342b79209e313b439d5a18e07e9858fc6ca913fbcd1256397456b47db9d987227d84eccd0df2fc2f4ae8ede958382200dc867731a426c80e83f3eae20134f8ae7254c815b1ed75ef2807938b57993f5597f42a0b6542efaba2f5d3ae6c5035ffdfc9adcac7384e53ec601e8624e3471aa6066796bde6241f9d9fc40af340f6bc6a82e15c338706ac25ea7fcddedbfc0a77a852d1becce0ac8fd7a7ac3f376d2e0b56",
+          "padding" : "3057300d060960864801650304020305002446aa02aabb044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "bf524f0f24998c53749025f33201b8270e4800b6798ef21d84f363597299657c49dd6ac74e0500c343b5f5f14d31a422ff44342001f79067ab9d0b0d69b461c687bd4deac90e4300c1bf1f2a809b55fb870d0f52b751c32f0d824e73b82f8186b604af5d5847fb95a4bf4563c65e460ca61913081398d57ad37fd81e652dc13083e9debf8389cdfd564b00398c965ed85cb4f5dc8fd4661215b3a8f7ccfed76eff03085884f08faf20c971032e13483df6ddf78e1bc0c50e77ca69dd678f5e69ef376f206410d9f8336b3789091679e302353362964650593cd1049cd0186dc3ff30cf62f66e3b37f2768e0e5b66d5c7b858e4aac6b53fa727cf42779e0d4ddd",
+          "padding" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "5d0891ba0fa3e7dd890ca0ba77fdf832819d40b84cc8c90940605893e44aa22aa7780aaa3c7f7696bc3f5a7286c270a6b0cf1b0e370b6ee868cc1139ff412ab28877991d541d227092465e034bec6e3fbce0d763de2e0eb045dff2e52c6bd42b4920f13fccee1cfb25e2f54a8221bd733db7e2577e88477973ebf8d3e3e23b0fa4ca2ee182cf65e2bfd3826d2ac3f34ce5142f949d400ea9f3989f54bc852ac2c37ac4e4bfe934c552ef428925b92d5ea23ee5be3cedf0145735203d4aa28d6fec3889f83482e57d16c15e100f35e9697af561dca27c435ab99c99407eaadf200fb7e8172a85b5ca9e080f290408ff81d79f318540d1ee4138adbe3079fc5c1f",
+          "padding" : "30443081044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "7097201c4ea62b8711bb9c5fc1f2f360faa2c1e975622570225cee8df555b46645c4f23de2f6a0a8b018123beb401b0baacdd4f1aaaf8736054ea781ecaabb237d7ed6f0bbbb2da8b8df63f8009440f4829312bb167e035bfbeb39cba467edc1c1bff6d390849046bf89636a87201fab64d04092e13db975bba25736ad560ea297752ed97f67f760acad3e01e5902ed1c768578dcb57c61a17ec1582493ecc6f41c97a439e3fc46ed0954b9b799b88d4f58219f4a1b6515b08c7b5584a0f304f2aab4292dd06f1f616c5a5cd132be50f4519d7d51f0b87e0e0fee39e3ef0e984e9fe489816286108315fd0c19e9fcf2334e00da5334bb7afded2892ff43c04ae",
+          "padding" : "30803051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "2e58069359c7e48521bc0bda40aa98647b81840e82cbe107ef66f1ff6daa1ed22d15c01bd80a39f3bf9f191f5698e1f1dfa43f8c71a4913db2c5186dfa76c405ba83bdfe5011736b6478f598f0f0620987f323b52ff9ea56ca6953a039f44ee0f61c8bbea923978ef1fe2e81ff8066f4dde848035d377f192b5e856539ea875c76df009e1b4c9c3c78ce31b997fe842aa34ff2105ffd54266092f1e8a6c33e4087071072c3f3a19156e1fffb2295fbc741a958559439bf84085bf8641936573576804626734ddd89c889e9ca373c498d84de52bb7a830b4f1c6ba54e66f0869bda2449eba214df065738e823249c0fca1a88236cbcb4381f1cb1930c04f59187",
+          "padding" : "30553080300d060960864801650304020305000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "7fc58ab285b6bff2af7f3ff1036f4d2fe8483d4c36b89e78b0a39f76719eac94c1a7cd1c44447dd408e201726fc7300459122cbb5ccef288b57d42d6efda841945892bec222a10da5d92854b1a7d86fd1ea6fd25f097a9810e3237d8cd615a3acb7a800876f473f6ff570c41a62bfea8d24b7fd4e2c46c0d4904496e536b0cefa340eafc1828d2a0c872788a1046fbc6150ed9e2d15fac878730d9c5666bdef5d1799d43985e711dae99e19996a199e33766ff4469d6cee3687b6703a4f9a3e70515c0761822efb22bb45292b84e8908103cad9c6bb83437088a137db76ddbec9b5c8c80d68024cdd22f16d3deedefb9da927c478f0755d042b662bb34ffb5a4",
+          "padding" : "305530112680060960864801650304020300000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "648115f0266f9c2e9e891088aa19d63b52d0834c367d525b1f904c675e2c20c84c687465119fe51493a0059377239edd310bcdd2265834025ddd7b9299d733dd071b682c301ad304743c2c18fe4b94708917ab131a4900939218715f4d3db8fc9dcb4c7c0af77310cc296502a7682a050d6a8285fcafbc62a8cc28f7f6d404eabe263f9732a4a01060a2c669a3e0b7e17e6da44ab7df25876852de52e43daa09d9438988cf3c5b410dd24f1b72e557f01cd4ff15af5b3ede5d6be6de21b19a945b563ad0b6f169e02ca11a4ca96a80e7d49222f0e4103d19c1862c27a79593e54f97011e67205c5c6b9bf5119b9031d4003be3c17bcd4ad9eaa499f053d92e20",
+          "padding" : "305530110609608648016503040203258005000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "0f4df0a0623c2513a39adae1d5719ce01052d7b72cce3f70373d8bfdd0bbd37ad89e512f78a3fe5ed907b77c14db1bf7ce65d5ebd04d48fcb5a3b475d3343bd7b56cb61a7e437d1532bf4b904b874369459327bd0e9150c709421e7bd54fad085324bed49b3da6fd5bafdfccceaa39ddda0c737b5c3e284c2fb2dd31ebc770b257aee15e926280132e698acc60aa2352bb2d27424707c05ec66905a6294cdf70487aab1798179c125381274850a40c118d65acef6fe7f6d561b2a1723d7ee3c20970948452f308a07cf9a7fae33badafc576387fc993cf37e17726b05dc619e35a6a587a81613dd0aac82d9ea503688f9df225253158a629d674f90412285ee9",
+          "padding" : "3055300d060960864801650304020305002480044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "37b22230608119fa91a6c8b10d573e0e9719570cd0e209abcce67a3b23751617b28518a681ce66ac24f6ef1fcf1f66f3d0e477b85302b0b19852ed3459333511bfe3e589bd567d77e58e411769bbb2ff52c56969cbcddec971520d7461746d1ef920786e099477c33d7584d23334ed21186cc9bcef7edee82790ea1a20f91bc1dd531a9de124437f9f20e6660994b8d0c1b6d60bb7b261dd3d23da6c38115b95af518d12fb24bb930cf2a0378e89bb620c02364f6dd3c0db53526cdc401fcf28975fb4327bd36b1b985d1d8444b7cb63146b907f74a19c96cd3bde356bfee145f25eae40e1b07dadc5b03b3ef7bac252e1197fe64a378de32158bf1abb1b52e0",
+          "padding" : "30803151300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "325aa2dfab66503c6bfd45e770465b03ef7492c3f43f4d5169d907fb85b5e6e00947b11c6ba28d1e45ccbd74fdea67552f2e0362035aab025cf583d274377dd837293178c69c97c9f31b61c128fb19f333f72bbe13643cc389d239c393c91bba05dfa0bec8ea8e13deeea943d5fc91e06da014ea5a7b76ff62f9b53d62e6041b0a53c0ae7796dd42666dbe65c12b1b4143b33004cafe7d69ae76a73943c5d41604f0e9185f758021ec71495034711d37d9bcb5cb3aa302b03d36d79e9fe9a8785df1524c2ecbecda6fb7221c8cc89e896db301d572e6cee253beb7311b0b1fcddc33b2bd84d7ce77af9c702b8ea1ab2d405213f08af17f53a95571e95d14b1c0",
+          "padding" : "30553080310d060960864801650304020305000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "bad07932d5e267ceeabaf78b85715044b99e7a85afaebaf15d2a60c6082c22b1080c663be9544f44f3d70ebb32780465b7a35a3537267f09c65072c1046784c93d90ecba33ddd0399024bc93837e4aa214fa11d258d35c7ac30ce0ec6802554ccaf52b86e20efa055f4c1010ebc3a6cb0b8fc3ad5bda2558554031a7ea9f549b53545b36b658bb3367e93ee619bdfe88e9299fb4f7c6eef5d822c48a227b839f05d23061b2d49481a4a9f164ad3fbbfe2b20806fdaa9e16a465b3e721001002cebb9b9939c605841c831ce785c9c65e866e6c00606518ec08e5598c8b789923c3fdf4ce05524588d3b0b5d9eb56c5de1f20333cfbc7d8e7d43e46f9eef13d6c5",
+          "padding" : "305530112680070960864801650304020300000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "66ff77a8056aba526746d6fc1d6962795512f6cecbaaac2197374426b0983eaf78e00dc9a895f202ffe467f9705564acba03d8a5c2722a2d9cb27a59e0ede7f71614b3a03f32bcb4f10ed094d258e7e2c49dbd0aae647c0578bb4071017acd187a684392297dd8b422b5c0e66ca9c6cfc4c3fb52b9a66efee32c1e2c0a217bec3eb030bbe97297f01389ed3b884d7623dbea779d5570327630f4d863071e3d2dc50b5dfd192bffe5b866c3ed7d3442ba282b8d3040654c97d0f89b436576288599845b3801be28b19d27f2052c0cb792104d58f79eb87c43b626ba46ccc9b288bd8a0e09ed974b2eaa6ac148cc97e5154feacb03937db217a1c3e3e8117b5d92",
+          "padding" : "305530110609608648016503040203258004000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "b55443ab3d8eeaed33a73c1b2f7874782dba51df091d3a6879b050493c43ef8feaada78c06fb4842c690456f5aae3a81871b6961a097dbbe04f63fda2c5581902a1671fdd82ab35efc35d07af64f9791f99cd31239f070c96b34efdc68bb311ae5398271378d12892d40a54c15d7286dd5ea618567f24bec646afa89dc04a1ea5ee770cea923dbff457d7f2f93f602a287ed7180c0ce6e70cb7f02d1c11fc8f9266980a97e00454f9b93c6a06b8132ed7f6d2255214678f22fa2c0a3719a8ca8e685b4b0bdbe59a890c2e11e5608bd049041834a450f4b6eafc1411536f12adbac2712c048ec11ea556a3bb5c98c1ff72c540fe9a9160b4bb0dbba8c50a38523",
+          "padding" : "3055300d060960864801650304020305002480054043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "0e063ec0ba113694f86e107a61b79867edb6e40ba1053fb5132fae6a665c042f371b76a24cc37437bedb0835b44ed8f7e910303a565ab6985c3233dfdb59bd29fcd514577243ba437add9a584a22b704086857b92da088ff72f13e4ae29a94ec9c6276967075a8dd7a51cfbca1a70c3d7d624a6f1f9703092740b3d552cca1e3c69850e88b25d0a830cf5ddeab64e8f856daf921ba8692e3e34c362208c4661d171ee9456fd8be4bdf7354cd6ed703366ce369a81a8c445a62641a1e57fc1de6d3cfe2184eeef69473ddfaa556de0270583a84a60ebdff77cd31f73cfdee04362fbabb3320b7e18ac00e298fa9c502236040423a31ede48601df77f26c7f0090",
+          "padding" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "8b00079190ec5ddfecf3394edcee7c2c7fcf394ecd185c29509d6818bb7c401040c7ebbbe806c20f2c414b72026dd058a12aaa1a90c6d4254ce2e26f98747778786057086663e3a50397d02887af11694718091b0aaaae6ab79740c8285513f92fab0ae112cc25e739fbf7438e2e48a37a1cc86c4443e5ff53c49258878c2d9f08f322651bbf9030a8563a2993d3e2e663b0d7d8ac2cf871fb67a7a5d9ebafb35dff6329c1929e14a66ec62ef92c3490c1daec8fff67c763b1686fae7c4c79993f9c51659436e989338430f4f772aeeade41f4711802f7b5110379b3f0104ad2c897f182cc148d403955d3212b226e99cb6b4bb9cdf89f43198898b5453a4a91",
+          "padding" : "30440500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "02b469c37056f5f17eef3cd2f3e2bf0c37f0c917f3fd0f5341f610cfc5ebbf425a4950dbc42fa3d2d6499f44c31012b8c8f4d26b6aa20905fc198c9ab2642d8208861a3f363470ee499328521749ac7556c3c9b1604fc17f37f72a732b26c9a7fdd5984ed38065a93954b57238a3a6c3e0fcf8c75f6010c1929a8de5e1fcf4729b9ca804251c0a04f364f4f47a042146d13b1e016b43fbf7bc1193307a864df078dbb60449acc1e9621d14057f579141905c323ee6198e3b63f40d75a78e7adecc4b14e0ba346061bda490258298606bc28e8ef33fa041ee2b0f69080651ec7717ad1ff14f1cdd8435d70abe5363d5e4f320339285916bd84a2ce88f890ad8b9",
+          "padding" : "2e51300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "0de9009bcfadfba4e031565e32ba542c22d890329905cfd7dc4c46d86d87b992bfe4c91962c96354c5369ae60e1960a9925671d2c41e5da0fee8fac65ae4c72b1d2d3dc8b33aabb5dd656c1652c04faa17af753e9ba332f74e0996666dbf8a0a4e2634f640c9f2b7da64941f6c81aaf9b6fee9434ebdefa89694b378278a5ed71524c20f85e33ba37c15984d5663f0a5733e65be9fab5655bf80d7b92b231dcb4743dde798cbce8a3ff059f70abaed958719f06ea8f55f18f71bbac78447f3e4e775a7ae02676a3cd11b1493ca8715bce0687959b0cd1a9ca8b6a3792f9f6377ed1f488ec8e3ed95f87aa932f79a6412e2cf5a241b24107590a1f1cf3e7c8545",
+          "padding" : "2f51300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "6a505dc2ab0dd4292cfc68fbff91c28f49d079d02c842db9e9c2078092bbbddac03e8c32efe8b239a5c8570268b86ca1de0dc96c8b550c14f2326c779ab44906c1dae63c3b1c9fc0fbcb03afd7360ea6297b10cdd098131b35ad271aa3b2e39c828ebbdafe97b3dcf12b0c41bfc577fdaa37dad459ffea653dd5bea70abc624fddd856ca9f023116af3eedc18f2747b2e96032253dc194e2e40a4a3257e5c6e210441d31bb826dd70423d12acbac290849ff45dc4ecdcdb07fa9e7f9c3ffacef0800e63979fe70daf04566250860a974eb2297c46d7478108f419055c0223915e8a4d95aa58440e2af3a6ec6d44c157579ad851a53413351c4b8bd5d9201395a",
+          "padding" : "3151300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "60f2f9b066a7329fa2c0e01bfc7d0ce06a77f08fda918703fc56c43e8a4ab058a81a13225af87d7469380fedc9ca5966a29d6631b88b3c1d0b9802f13c4a8c5e3049ec3b3ef4b79b7e03846f96536638a82997d2e55f1c5c3cf5b93685dede69aab95c3ad10ef59f878a69b96ba71421598157048705826c96f6edd6231b4165767d94dd85e68beee6502f0f91a3803e247c22030945ffa665fcc5946d022f938e8973e231be9c81bce34fab30edc9167288bb2bac0fc13f46e3f03d0d76a501b7f4adbee6300c66a13d1918d4fca30e62ebcc16ce97bffa3470929ab65889aabd4b18daece2ede653b85fc070f309cc381365486a36db4b2e85f27c74471507",
+          "padding" : "3251300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "25a236f8161ea633d5e093cddd5fcd0905bc8714e1fd26ac00ba021a8af1612b0f678a9a5e985b32abd3fd7dd711f4eb49dca5421cb728736d074fcda041608ba79efa9fed40ed6d4c0dd0ef4ae6eda4334e374966f079453c755149c7099ede7c54f595c53a83fca7e4f74a546c7259a7f0c62c82005d60cb49a4c0b43f119070aff6429e1f6cb5a7ad9ac34a0863340f8eab186bf4b923d2481c1e830c18933ce28b8b2a847b1d5f515e412bc3e71030d1beb5cb12879c0f7ced790234a3059e3e964b9b17d7129a6c83398f4fbd8c04db7c33879f1475e3d5dfe1d891f1f7134108375c0ade5627c53fc9fafd8a66d2e204fd3ddfdcdcebb6a6d5d6191db4",
+          "padding" : "ff51300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "7e0fcc77e2df20a7c6d81aa9a8368d017203dcbe8c66169c10db0548f0f0fb3d17889cd4fca9952347dfd9bf9ddac6627dcf4c47856a47f4aa1593e4a4483abed71449ab1cb0475b1d039ce7aacdc803a6f271e89c47adf14a1b14250b4552176ba2d6fb18332ec320725bde4df6c347f3e41a81ac581fe519ee95dee3680a0c638694eab145ac5d463f48876996e4e650c0b677fd926cc093a274506fbefd3fa70423f7e5c970437588c228cf9f0906ed05d707596244d8b85424eda776018dff56ab788c8fce1c1ef1f4507805cf6cb37be6da10904cd24ef8fd658c1b98840ab4d24d6e8cc3c282fb9245b76557a6d5258d8c9f1d973b10e350577a675a3b",
+          "padding" : "30512e0d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "7fced2a61a55dfbcd398dd25ec813c30f176fee22fa5aa0cf832afcb8547c4a73dbb40eb723cc3e8248d3f0d9e395d79dbd82af8be5d7dfea1110394528ab9fe031677bf914225de7b325ea136921eb48c206f681942a5f15287658146b5ec959bf86a4244ce34df1436f900a36ebbf4bd0abc28b1b20d5d560e34b634812f54360316a066c4a4e284bf615e6280251a194eecab697e2d0eb8decaebe574a3e222576d394c0fbaa7f4dd97e1016a3c0ea05efaa50c768310d7e2a375b28d526dfabf2ac989e4693bd5a61ac7bfd53704b8538b1d85fed950ee46adbacf820163e03f71329f4285f74ea05777c53c51a91e1c69f1d3e6f0b34b64df73b1b46005",
+          "padding" : "30512f0d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "89e1130ad970c6e236c2dc4152c7879aef47c1bfc3ae6401342900cc53f2e1854734194509bf92e5a533724b27d076049d701300e5fd2747d4c7b90b55cfc7110bea516e380f37d9aba8007d942fa504365181a4c9cbbc6ff7fa0c9f7423414b5454e57c225cd4a15f93f1259a8de85d9deba1c722eda75192a080214e1a039d272eb0ae0be72d45b35ff5d61b316a62606a58490d86ab5c1bce3a27a10a5a0fb6d74f169fd0a21d1f841dd564ec0bee3ff6b8be891b91adf4622aaa926a60de08c002d71312a5d2d4d1a7ef45ac892bf0a6fe496fcf3b223bca3de0cdfe52b0885ebe288fe5bbad0c84542cd0ce0446615b604d47ea3b2506030f986d057035",
+          "padding" : "3051310d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "3a8075727fce3bc85d1b454a9f53f0e6353bc206b8ea30ef8e1354c4420abebb103ad6999184937c412a037c24c84267b198238fd25d55b5a3c27ac7ca221736786b2c4c18139bef13f9ae28792d5f439e9bba6f710e074d16f589f0e2cad2e319a6054fd91de2cbaa657a7c22a34db8561e7d4919e2263f18fb3d176178d711f7f1ed5e0945b5d36456400b7ae43ea4c379916e549221e43a1746424d1dedb0303fdf074c3209d172167a7af1b0a4ec6305decaba57fdb9aedfece4328ae51c2691f578d7e9d2a1c8f4f0fc4626d37a4a1d507766b82f7688f997b991ee4e27dea8631e36d9bdfb24eb5b326b73b793c82e9a0c7f974eeb34843304f000f02d",
+          "padding" : "3051320d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "247f0836500c49f74256360eadfa3c00b7220ea7e306a7fc1f5d0fc5a214d47d5c0a03e72a510847516e7c32a72a899b7a0a840094aa557bf0671c6607cb0793d15586004ef95a90f076c27b4c5d9eed04ea3c4a833e05529311189387df81b2d9a17ef5387ec87d6acfaf8c2d2bce866fe324d6cdd9905eda3d63d1083ef75f29d72b005cb073aaf68fee0c9cf1d8c5b639658c49f65d5cf6f9d0b8c485d641ecb4374449bc823d3bea8c3509eb7884ecc275a3e95c72f3ef5dda3b47438a554878c96048d0278c5c44d8fcae61cf69630645aa595636fed3015fa8617dd22a5d36c37f9605c5a4f386cd194942391ce99177e42afc52350656501e8fd08133",
+          "padding" : "3051ff0d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2874dc4e08a70a652af91e419c2379bd874a74ac75e6488653c99f332825dd111d3cb498a34054ea1cfb5588df892a3c34dd04f29665a0c939526591493d536c6f5ab9e72518f3965c6d595cab132060faa67c031c3c5dc16765ccd2e7fbfe5aed4a019500c7d3c06c31b6605e658e6f88b126d2866d78db75917d168836222f7402097bf2349b5c11ee4b7338e97041b168cd2b0a30e7ded7980b7dfc95e55cac2be1f2371d2c69ea025e59d21292903501caf243b30aa30b13e3c65f8f439d63676e5486e1d9c4827bcbadb73bb40810ff8eb6fe8ff5635cf5038a52fb84112806708746041c52f7d27a6bc7ab5f6ec54ce042ed7e6c258df7fce2d00bf3f6",
+          "padding" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "7ad94d2bb7b43fc3312c4932adb8ac70870be57207411e39174d5b1a8618e94d3369802c8e24ee87e5f0e340bff584f05a4b622835cc75e0ca7a02caaffaa3a7bfc2e6bbf7be33d55807d01c00ce0b3998a1fefa86814651b97399564a862216c57fddda297bfea87aa609dc878e527ba84ef82784f07b37eb7c16b2abb6ed3e7784def03f1623d553697f24b049cb1edbabdf67347983eea902ab3d2cae2d88cdaa98f35dd179d2a6f2617bac5b9694f889cb9a2ac0891db284fe346b5f845adcfd69b76ae7c69d2ff26fedb982815bcbae92a65a5db9dbec68c6ded7dcebea20acb0ade92ad148a66bb2a568bdfb299726f1392345c7138a5629d52a0aced2",
+          "padding" : "30443000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "b46f1ad5f9c3ee1d131cbf92373916b4c45201c02d631be04444bb6892d25371e6c78ff82286e340d1844c0db3ac2bf32f1cddba51096fb6e515eb466fdcfe47ae84b6d5a080e992f1b3149c23bf875b694e9ab0bab8e3c855825c55f8986e58f8d856a0b153145a1b378482b008af81b30ebd73d20cef495f97e548b5367e25d4ae335233b98c051a4531a65dbb2d18241e702643053113810a1a56b9c7e4c7b8e10fde8aa95c0f1bd5088b39b5c45e3393c2cac01365b78a8b455b436805290f1e43ed94873b5e1aed3e6a38dc7459e82a9de9e0095b67af779b5473fdb12dd95491ea7912b5d7271c88ff6fd5a887efb8fff685900d8dcddc031fad7c15ac",
+          "padding" : "305530013030500d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "10791ebd2e8a04cf4d99da2cc43d296e7d2276787d8c0b1cd2628abc74e54c2b88543dc9f1885f2c232be41d8182867a2011e8f28a2d2ebcfb053a31b94eda6974eabb6e8bcb8c273394978a3771bddc8cd21fefe814d32459848ba06672f46c83bba26ce69101c865989d85e5b04d8ca180e1a67ea816594eb71d6536bc57eee88b9ba17b7c3f7b85f905ee1f1dccdd57b1ee6424da71b7e466181befc1e3763d1a367d99a7f2c59939d30a552110f7395750a591b1237e1bfa1845a685aaff44ea7bee45bfbfdfdee6d2e6277a77793e3ef9c5874b5e13ffa9e1725560d5538211fa7bd658f359f085466cd6720093bfa3faecdd137ea0cd0155bf73741044",
+          "padding" : "30553011300106300c096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "b2a06b54e578326e41c2c7f7071dd8458b5fe9bbc42be12b068fc10ae51dc9daa35ac85239e11c30c5a714c5951d09dcb99cf7b400f7a81274ab4409262b3c9362e735cc1dbaf3f4e7afe32b73894cd3191936339e5cdd78b56eb84d48c78a714af0e710d60ea72199955c5f8e9ee9acbc1492e3c1bc2187ca9f77cebff25444622c28c900f213e97100a0653cf8f6307729ff8ecdca410f30aa8928533a7c6190dfae16f63df83a0461bd72aea5f4200c9a831ceb5b0333f1e5c42805155abbc387b271fc4df2dcd4e0e597f616cdee14d364d9a6dbaf5d145581171367b1db517b9aeda83dd731d36a83b1444ab412d8f0c871f72d01f941c7c68b32006307",
+          "padding" : "3050300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "086b546296bb96a5254a28190b345df408924354f6ebc521e1fbc82cc113e6f2b9a03c1cecda71988665220c65cd269b40a36d452ff08ea2c5f31914a45c038810c0e47171682e53b93996ee958c091eabc84c95530a8707765c1a5a783b3c022648879bd8caa4392139bd7975a2dccf6445c8a2c2ab084e72e87bde250091677522cbe71f9121b80dfb365962f97e6108c4c8449fed8cb87561c9f6178a0b96fc7bbeb105122ffb75ce2fb234919d86bff858abf1ba37c9a3ec886cd0cd228afa01b83857116eab734c46031dc485e503abc1a9f9bfd126c887c528379205aa1c8910c94c0c3a1e4f1fb4a637184aa5d36c474791d37e01981678cc63ec8ab3",
+          "padding" : "30500d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "a4b495fdd1120556d60b01459a7935c6eba0642474447fc76cf0bd691a1cc0170c409a969e3d69907d39c9a67e27acb13fe875136a1f466ea10b6b1d2d5d1b97916359851156d085e785128b0d5bf1484c3a44c0c18cc0799e5e22e1f87f33ef78b89d7a21064dbe26974dce5451e60c5d885806c8126d539b1bfe668600394efdff7b840f07a2c3ef8d15dd2c0624bb6919f1862ad606399c8b94b9a19a5404c9857e029a4c76dc1c02655c037c004885c2c16fc727954d8811ccd726a1a4d9f14b2f5d11feb2169aefb7c32af559fd62220fc652f1fad3c5dfcd0679adfcac20ca484d9847b4f9413b0664b19151e6cb42a1cd7ca54c1e5d8a8ba024a3ae91",
+          "padding" : "3050300c060960864801650304020305044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "7ea7ac9d5851bd2e33a6f39ffa512c37eb07944de484f5e000db07e609ff86eb759573949440cdaf4846ed2787137977ba05a17b06761ca658b931089afeacfef78e4e2607a9043253d0c6e9b5a8ea2b176fd3aa835927d4eca9dd2b470296499b8194908c505459d988d492d1290de9a9125d5b73962aa9c139fd18696fc5695d5d852d8afc03ea536f3f77988afa16b44ef9d679bc27e1da7e0673d5d7365a46a3e87bfac629069f820100a13d22aaa88ec010a0b931c9221cbb329b1bf14103ab6623ff7e198d7287c0b11eafdf3bc0aedac23e37f4d97830a0ee3d47cc19c21f13b55d7928ca3baf0c66520069db293f569ff0722fffc9032d4be928bb24",
+          "padding" : "3050300c096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "1342c8de4e6534e10fd55b7a7dbd447d55c79c6318bca69d9f2b30b7bbcee67ba796bd4c38199835c9e0ce6afc0c649c1523a2a14ed9d50f512c4b64eddafd9ecc73b96ad03672feb599b879c4cdc4da4b53606405177aace48dec044f32aa18d23ab3277ee0a99bb87879115832e45eff8d6a653542f879a1c6a79e96eab719b7fcdc19669395ca95df933242ef299942965e2b943c8c5754c6f136535ef76f4b679a693554e8e3bc45af26a4f5ee9f6682734ffb5ef822b62a5e448803b97b7563a0893ec098c0501691b7fe6a9f367cd6cfa9cc8494fe6647f7eefa941f56d14470e5315c9081f3d7a2f5e688ef43d14d1ffc0c189045754d1ec4913a462f",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "5bb15e1401b13223187ec4b9069edc1b7c822f300e09b2c49c8b3a76d6520a0361689e2d5535311beb55fcedd905fa834474dac5d4f8ac7f64ed76e864100dc262abf43c47912f6e1233e8d0a327467ee31c580b42e36c81e6dcde10a5acad83ddc4c72e95bc8ff5d6b3ddfcb06e43cb673c00d855da419d97dc72ac9dc5ba84e59c566925649380c98dc03bdfd94b2178aa5088e4f3a87ab9a9cdd3f6e880329b66940a13336b83746ecc122f711eeb816b460927381bf72367bc4c07529802e083c589ee2d53f84163847cc3da94cbe807b1fc12105f9f1d3e7ade0fbfb86b6e68bb1f67d124aa9c93c76fa6fb95438464173fc154db866e35437f6668f8ec",
+          "padding" : "30533080060960864801650304020305000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "ad644f64d1d3da05772de46bf9e93aa88ba29b1caea1805f4c74335ac9cb8113dfa53fa4e254e6932a3bdee5024f3e4522d0d6354a84b11d8a7dc2d1263009a3ce0b1631229c62c3ec537cf819b052feb88f5aa3cd4901488e1ee51db8332a15eeec5797d450afd5f49bd625e425678c95eccdbf91c24d9824f28258d8edfb4d7af2f3b71d4dd9cc14374069e5d28168c985e1a5485ec7720992fa5cd6c1b8e370ce6c583bd4475304bc2a70e8ffeef40a445cbe9f0d506c3d73814075c9156ae44ef62f2e40a319f5e09e9b39c754325ad59bd81e00bca12efea07c6ce5dda532b9b5c0390db56ff096b73547935f00ac056166f19743a24239b6bd4dc5d38e",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "5666334ec38779802e7c1c18e9b7be98daa86bdbb44b12bcbda7348469fd8a38b18ce25fc6a2e12f84274c23d7d7a4cb9f7b75e17afc5d3221c4224a49e6e32e2079a95e36302ffda163c3eada3aceea77bd75bf57e5cf87071d2b5568204ace66aa58e12bb127b11e9e78fa2a79c7ec738483df8d102db54e9d16ca6de170a5b5adeb9340c5dac1c9c846bb173e056fd5f224619eb043f4916ca1667a11be65811da6c0be2ca2722e858b2ae14c79616e2a558416e1b6de240f8f5dafac00d28f94aac8bbb8661f0f648c5dc001e10488afc6b5cd8604b028faabefbb26fb3813a5f2dcb7adcf01d946bbb17adbebec64ded62962e98fc3931f61ffffbb8258",
+          "padding" : "305230800609608648016503040203050000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "3d24d14d20e9adbcac72a678f082bb084fdc4bcd099d8bf85ec7b2cd90ba8d89a056fcfbcfd9e1fd8f4123fd44b8d4074e52ee5ebf3f8b9a016b68743cce84606c09e63ae5106e9e246b54f4e02d0aa3215ba37dbb7e72784215919d24a74d8f057a4d5bcb1df671c898933f32e9cc475401179ea2231c12582ea13a6acca83bce09815ba8f783c80d49d75d610e3584058e67c581cc8c9d268f3b331fc150a436965f5cb4bb9808de727473131aa442c08fa98594441aa3409ef0df3e108a02dfc70f06b9cc89578a0ba0e5cf4bfc65f5778a95bec0d60864c92b8716eeb308077922f7f659b706beb27a0f3b82395c5d4ba8335d67dfca8a186c0563dc37b3",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc05000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "202277c26e39060d39753e47c8e93266d73b7af28a7b527c4140258164ccc368de4ed91c5e6dc2a84811da2b9fc76f353bc508740d93f9d81987e3e54d4a42c4389b15a0365dd907f07cd44df04d51fe14d60320cebddd3f68b3eb4b2618b222f6c9afe51646a9992247d74fa5313b5e332802ebe3544ba551af2b89c6860718d97a0d36c9fe132410d6215ee90d28b8ec272fdb332c188eae4ca666090dae19d97784601a4ed1f7390864762693f2e3c68465125340921e6f64319c2aa54d0565b6b34ee935f10e69b77c439ca70b087f8f91d6fc656c8a43f05d9319132a67d26d3dc9db37e78cbb4b92bd6165cf83b94a876b6711aa9e430848b257ad192e",
+          "padding" : "305530800609608648016503040203050005000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "38600d6c91ceae4c31e08d7bd27e99f5da851a023eb838266841c2d173eaee4e7f59f1729d11491397bac90137631c14fa8da9f7bbb84e6ee70823b6746dee0eba41e80c25860b62201e1f58bfd4a941f26c8997a1237ad12fb7e3d5f21b65a739f3955a04c76be2352458e3a7b7bb622b135238bb09305e75a068dcc4f5cbbd15690e484176cb07a74333cb401b0975fefe772bb80332025861aff08aae24fe6f58d1f59e02e6af68b0532c7f471ba0e4b5e25ec4b35a38e09dd0202d19512e7e56628377d8fdb45f23694d6846b1d5594c1b8ae858683f3641e4eace65b3996b893b324e8b73ac16f4a9c518ff833848d19aef8d3819835a222112e051436e",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "4416f75cc33c479c6115de4fb437ed353bdfdb231aacd1f4f13b229d7b25f904aa0ead240dca564d9674c6a979ad28244fbf274abc8998461b572901f21e8ab60a6c61ae6d0ea0d5de35a1859a123e8485548aef1833863ca8228aa40ceb202cfee1cb67152a31e4ec8be5d8a24b83846e6f2c05c819d0bc37bffec2933fab9601d072eda2d6f704d80b235ae5b91bb3f4a7173c92e53e144df171e021c4b13889ae0d7d99ae80809c5a6ad173137b21aa545a902f9e5b08e5c09c9bff264c32ea0151eb8a5498a8f582215217c7cfbcaba9ec0f8a3ab1821e0b6cae644d7b487947f33a72d4f050da5f31cd9ee6d18aab50a9abc8a34cc2a6b45e5c23fbd9da",
+          "padding" : "3057308006096086480165030402030500060811220000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 145,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "911dbd150f8ebe9eed71419dc8f6bf2a09590efebacae72f7e6bfd912280b1dfaa2fa7461502368de5f4c609bc992ab8421c86bed775befea591ddfd9701f6bf46b03c2472a2b802e609bc02707d33105d7a00f3f079c4b3b542b06b6d5cbbef6521fa56119a39e1b0e1b3dd86c0050092275dfdaf13fb3a453332888afeda4c376722d45b71e2dc8ad12610dc1a11cea80cb95855dbe120fde8bfc9d1c13b38684db78d62019a9536932c61f441d9d292f5277f00f7e97fc0a37cc4cc8050318475b0ed5ffddbfcdafbc951da39f317d39284c338be3586e352ca1e382b527e21b08f5ed9ae812af902ff0037f9709c5c792f5f0be243aa89b0fe467a04d72a",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 146,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "5d2788622abed2c9d557aa4b66cb8cdb7289f3dadbd6dac50317c9a6103447cc0c333ea9f950a9ace342d82e05f4c88d7eea7dfce425160ec95fe95befedfd8d24b274a887073909272482bd9426ff10805a9d54792dce629f48e1c7f7446b1c1d542180df758dcc2668fe9ba94fe9d347c897725142083f44efe8f41c210ec809e5c96e00848c12e16a1bd792360624028185e597a62f4685e53d831063e4bd6cf50b2600870ee835d9d6067a5d81205cc88d02ebafdb014a80a06d517295b238c13bb0ae31f2fa5f68d14c4bca9015aa122f81d82b9aaccb0cbccca3751ddc8f4cf971190b765ae246bbc10bab538cea8123e81b68d417bb04233eb2b66668",
+          "padding" : "30573080060960864801650304020305000000fe02beef044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 147,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "1779b32fdaf19771df92f2e365fff5f5c2f432af48f660014ef09b9c01913e5902bc0be92938019502178ca736b46fba68a513a884961ad19ebaee84a977ce11ee4f2fd13d72b611be3e30fa9926d1bab6fdda62aa031d79f18a09b9b3a3bb26a8a368ee42846edc1f85f9023c2190d844042a6cc9e5a1b274fcd075d58ad132fad05fd5e2713d0255625ba0e56ec0d64fa66d5e78fb242af25f12d41180cf2d651ab9c812f683262274426b4a539fc36602860e4b7543878c582ebd641ae31dc2e8ff5de9576e24d878350243120ccf800e608d9bbae41d10b8a1a6c3957529b263c6e80d7c8b54c32b15e3ffcfe85fdfc0df5698fe9d6afc677bafc1e55bd0",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 148,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "1a2fe05ff3073be36aeb55e736b7489447f42482f91c7539b9d8ffb27f7dd6d58d1e6274861490f30773b6be750acfbec31e5cab7be070630feaaae2ea35b0cca36c67b544d709fa17de1145489236bbc69fcf3637b1c4c50399e34a5866ccfcc7c572143cad581184eb78fb1e84b9af4075da358ecded93288a609b2d5bf9c159a542fae376e438bb947c8139def481eb308f568345e1a902b433a5766c266b89749bfc4dccafd6b53a8b6c5df1af7eceedcaccd9809d94bacfd82c82a0de376971b6454dcf0dd70a2d94364c73f579b78242967b28bb6e4e08bb1efc47281ced3d0b2d771820336bacbba1388bf73edaf9b140c4eafc18cc16856b78599b63",
+          "padding" : "30553080060960864801650304020305000002beef044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 149,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "551797652916d3e62a0cd534f4a0e6bd1552d7aa38e94ff522e8b4fb39b6dff8e1698ecef6100b4a2e3d7063ef5abd42ccc0e5c49d26e353a903cd06f8ad3297bcd60a8597afb2d7aaf8b70896f1f3bb1d2953fa76ba3059559cac7e5378fd129ba8bfce5851600abe78aecbbcad2516747c7706bba3c835319b1761e237ff593d8165b5a1f58bfe2d437f1b8230f5bbfe61b3c9eb56c60a19f70816dd3c86e28805823106b3f1798feb36b903e6e52340d559721679bb95700d9969367c50997d6786aa10e7614eee58bd98dad66f81c7084068946b391f08fcf3ed67ff4208080d8b093be71d023fd0d66d7e2af5895f5369ff76493f51ba67712ddb085d42",
+          "padding" : "30533000300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 150,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "6a9a4de61a2a54615656280ec94cef9204224fc0b4d0ffe5a25177030d7ed597cbe199c18b18667d54830872fa0b2ae363ddd44dd07941268d5760b8808ff87c942287a4e719f7034d223d1baa21f6d88b2fa52fde4cb7abbb84e1e07417792206f70c208bb1c1d767b13b9d675c5756455bc27852c76c1ce924d7e981f2af4e770969ab86e5f01aa3820ffecad848c7be52e85ee19769acf17e0b5117a8a14885a85eebfb63d4294e87a24fc710e8e560d998da812c7de3fa0f531f2af7553f153cfc2780db420c7a17312266eeebb7ec04c0fcaca815f092156cc3bb65bb7d7e1db3b5db955851b3b3415f60ceb487bf74696cca2eba09f2ec9636ca59e390",
+          "padding" : "3053300f300006096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 151,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "3ec47c244218719cd70bcad5ba1deef15fed2dcbcf4073ac3f05cc32750842bb74d6ffd506224b8543d562b2584e944cf4ab855da0e4f3336c97cc4636bddc2eacd66b3398ef48f5fa74054035475526733ed14bfcaedf421c3165e3a40a5abc098136e687bd7c7ea7e935f5940868cbde5efe0b51c99d15d4a64c7e4ae65c16dbeee1322f7cb3bacb4bf2c7c8a2f5bb03e264824de55eb3510338494dcb1513557120adc5150afac38bef002bdddda43b5c14891d4aab66ba50c20e229c2c3e1a10d5f194900abd3c217a7f5e82b9e77d0571589a51e9f56384d67b4865a7031f57a250d765cf19018dcbb335b856e2376c15c1a78f5ab9bb8836b820ec2e4e",
+          "padding" : "3053300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 152,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "68f20b149aa70ca60748e1c95b10147093aa384a28148b31799839fd0d087121b236503057fcaf6d1f390cb8ac6fa92a18768c6fd04844db995f073e893f08a86a86d003d508262bf01fca7de1e082ffce53308e6ed5b462211013f151c16a375a342b0c1d2fa607a720242558fa82a403b8443360fc0f1b64e4b7bbbe74b10ebaa715087d71fb4539cd1f5b3a72edeb89235c56018a57e04c5ffa5291cd1346cd7cc0feee2b99a3770031aa4319af0a365ba77978c486ac174009a2d3d97d3a113952eea3a8691dcb4b716460365341256b2dd5c846184656135162f38acdbaf70a4c527ee751f384d91d09ca7b618231edb72cc725a942211b00c58d4ea7e0",
+          "padding" : "3053300f060960864801650304020305003000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 153,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "13b9208bef3ecc8a4d327a3b6da582c2ca2326f84d233cc41e962333612edd7d2973305619186247279bad6d849d7dc7426477dbb35635b0b843e977cd8540b078dae1dd156644c4b24bb75fa8a8d247f95842483d9ad0274d5d9f7aa29002f93313bbc277b01f1cd0cdbcc9462f8b984ccad2c05e95b50e1dadf8e6c9c26574151e720abb9747e899812bcbc6e43b40a233804a91a6f50420b309d4291e2c2e1250094625d59079fd264fc1930f72fffae6fb2e3378bdf30543985690e61dc4f1262c762881061e59024b2069f53391ca16b215371e6cfaeaff1815fdc6bc1a8b7b53be114e157b6edd2930e0a7bfdb242c8f7a83013ecbb6c583f0a041723a",
+          "padding" : "30533051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 154,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "4eee2b16048f104753e25236a051720c2d73ef183d70c084e792ad6ed52b0a2535a99c0adee80c59577f2d25d257f790830221711fde591ef71beccd654431a2de33887cb2e2dd4aaf3958806740691448351e5fa44fe869af58bbf15d2f489994c5c3d6b8916c5725b4457a2c7e4764a9043d9455325de8118f9dd60f7988abb3e52c48b40b94d2752f79e203bb75178fad51a0220563d98e798825fdae83f698b8504634c380081179b64042a44f146712203843c7291bce264b64fb3b8ec44854e046c8c4cf5ed786701e2be6bfe8d015826ccc430e79b63e718c8c0ba6ec1cbcdbaa014d5bcb51fe9d74e01890dcf827780a337f495537385311262e9a71",
+          "padding" : "3053300f300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 155,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "459cdcf7a5a6ceb515027f05f54d2457c862d780cb64e502da7a2c4b9eaee3f19391494771811b1d1c60b7aa3343474d16648b85cf30af69203b6ec09f9dbec5942559c8fecfcb08624438415772dc439c62ab785ed2b246644b8f5050a3629a1280de7e5cab55a0b1c22d79cd1a851bff929d393ef521a3bad2f76a8d12435c6c5b83a0bd977d4fcfe3afac7f359cc2e45472adb0fee40aaabc6ffd060963453d96f3f34afd24e95c17cbd222865eec529518746c2815ce6126ec6bd3730e43dc701a26e0c903c51fb5166db09aeb812288ab932cd1ddf42ec17ca2364561267ea4b136198564d768e4da6b19d51f3ca3936451c25e6da102f8c4f10c6ed283",
+          "padding" : "300f300d06096086480165030402030500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 156,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "308be7470d0c265794934b0f211ce54f7d67936b6a1760154d585a1ec6b05da313d942847fd3a1133acb8fb9c5eac471e342755268bfb7f2c762b7d25c4b53855e9bffde4f68460683d2dde2723b0aa5e9705c4cb25bad26bdcea726c9315c2c9341515daa6e12e714c6011eb152a050c903d024ae8e06742c3c8c86612d207f5288093830a83761ee40729ebb2c5dbb0e6e98b785040b1cb3bae9d1463f43e39d752b212aaee52753fdccd6de71eecb17dfe486b296d6c455a17e5718fffaad9e82f999723c8a66d0fd2457c3cf3f1b3df127bd73662651fefdce95f91f1a6ebd370fb2163bca19c9759e7f5901bf177464ffecb8dcd911a4d5ed5d5e7402fb",
+          "padding" : "308193300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 157,
+          "comment" : "removing oid",
+          "msg" : "313233343030",
+          "sig" : "64a7a262c21daacd9a5650b5d86e0bdc07ed09fc4a89e4d3fb260cf5f6e2e4ad529982a0e677b37d8d945c0c98a802f10770f6148ec47bda1b59f63229bc81424e3c53ebda28adbeff58b0c59c9f96721c187be69a6c38ae4bbe664c185c297c150ca49a51812720429438e293a646895e4d30bd152097fae13f05a3b63fae91ea15fb556cece63dd9616e9550af7c2f9e9732ac288fd42258c34a48cd22ae389b9f38a9e16528c7d8deca2b11b609af2259393fb28b353f082ee9346a5aa55111c3362cc245bc671704746955f496f58b574fc193be8581a5aa0a7ee333b6d9f049011b306afe9f99d2ad01545f278aa0fe20502077529849c0eac95ad99fb3",
+          "padding" : "304630020500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 158,
+          "comment" : "lonely oid tag",
+          "msg" : "313233343030",
+          "sig" : "b5ee078736ce4de46ba4afed67454a5d3133044607ce2a5efc69a20cda031e4418b15de0765c6bdfec1e27577624a8d188d3c6a2942a6e9c77afc4d851ef1c489fd400f19b1da93bccd00c43753638944436b0598efe8aea545bd11391062599e4733ec4fd99cb59b16a57b07d7c63e245b9eaee1aa637195a04c51d8b40b33d00a08419365a69b2611e60430352c4f81eb423670b76c556bf3fafa602a4cf97caa580f646bfe6d795d35c547509705fef5c5198b878c467eddb9552051d9c9eb0e86a28d2e5896adc3048a97c0681048c5654081160b0ce2118570a76c648344dc1948a644b7fb745ee47df6344b22c8969d08442885e101efd5e66a9de17a6",
+          "padding" : "30473003060500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 159,
+          "comment" : "appending 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "7ee548d37ad707c16067c91cd1b3f2d9c212d13c5b228c04b904446aa5d5ec13718c8fb36a698a644437dc0ddf1fa2519deec3316b3703edf450df964242b467b01f4162f555de37b10748dbb26f1424ad671b7aec5821b5a9e14a1c7e321924157beefed43d2effd1128416e93f9a4c676e7c564169ce161cccb4a6bfd000d40ca317beb66905fe2a5d0ceb9b65918070c18cb338dfd2718ffedb160d2dd3f321c025ac8bd8b31fb87408ee0c1100b7ae72c731cf3625601e13d23e6ecac8bd5bd475a37b32fd4e8548a268d7d0df133a4e2c417d124572f6b9e741c4df1dc2c2cd6f660663495d93e1c506310af8dd3cee5c0116702c5d2484ad281c78e7ef",
+          "padding" : "3053300f060b60864801650304020300000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 160,
+          "comment" : "prepending 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "00369a147162e880067ff3543d2c4b2572ea1e79629851141e1e1ea5a023bebf1032177cbf07df027b655d617b752075f12276bb40ce958c43c5ff61ad88d6f057b1f38b0a5692b4c8711d886e4608ca76a7e4e30492c37a2590ce8b23a9c78fda60d8254fb4d5dc3356a0c6385fb045e78467c6caa333af9c683504a1c5c40ac7affc005bfa3cf75c4cf9f6dc281e701d18554ec757cd62b5afc3a260ccf19d9047f09044c63bac9d3e90164208b3d69d1862c555fe8bbc916b3410584131ea5f575bb9ce15f17dbeb243764f62288d3f92fb3213d94218c84bef34c97ae2eed3a454a4fec5a69852ab12beee94acf0979a1549d2e975bf176f7bb07494f4a1",
+          "padding" : "3053300f060b00006086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 161,
+          "comment" : "appending unused 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "1e31c9be7dd863bcf2c486c18f350c7caf4a46fd87fec097c492aa0630760a3f8c9aa729cf2d16d1f234090f194f03009bfaf5294006a840f9e6ffb33f3c7c8bd5397dfd1ebdc8d0b755a0699c8cca65fe6127bc0176cb64f658d9ef653c245da12b83669625a585a0afca004bc8450c4e8be8cadc0f7cff7b7a793a4eea7d9334778b6326d404cfe6437dcad120e2a801cb408032e0b617f95cd7af90df1641285b082547c6a55c77b8006c6f575c555ba9445246fd5d9b1fe351deb9be539ee221bfe8a0e1813186f19e420766251cf73028cb70bab2965ccfd67c9a9d8b137045230bd976b666df73489f2af2b5bd1d5e39b1f063a8a93f39ffce0fe69113",
+          "padding" : "3053300f060960864801650304020300000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 162,
+          "comment" : "appending null value to oid",
+          "msg" : "313233343030",
+          "sig" : "b6ca1d31f2ebf35e1410304bfb2841bb600d24f234f163cbf2dc907088f43cacdbeabd0ceb585432286947e02edb6b5d04af456b214023c79d22ab7056e674bf6f124653e1adf12be8805158bcbb4aeeaaeac13ca909d89121e278931ab590d7279e1c720809db409bc484b6bd388f759e9581dca851a97767fe4b017534c1986d8066386c8cd49dca14ad0f00a01db076c79414261a97a353f824a7e07a8eea966bfd87b58dfb93ceecc02d159659b9fc035a29391292571ce4defe1e54f4cb37257401b54f560a4601a5fe39c6898a193547eea558bc6e4cc1d675d46b86b38fdf2f629df7d40bf36eb7e4a46e025c298fc582252b2c17ed7300e0ff4b1673",
+          "padding" : "3053300f060b60864801650304020305000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 163,
+          "comment" : "truncated length of oid",
+          "msg" : "313233343030",
+          "sig" : "6522df9e982d2032265bf683bd586618b9b392d81fde606d9b5f629c170279967455c46e4024b0afe305f245a62cd0460871a6d470bdfbcf0f5296e59ceda6a5444606d7c38491d1ae76ef0f2c26398bbb1850138c8830d1e2baebcb8ae05b81302f490ab08252f2dcb13466437f2b196b4570ea78f34bcf9cb464e5f43dc2e28c3819ef744e5a541254be84f9fda3bf688c7b2181fc5943be1e484f01ce80ec01474e09f55fe6ba54fe92b57613fef41d5d67d4e740229842449e5314125328b6bda2eb3baafb623951ea12b1c4827b2d395b5c470ae83da4af41840dbcf2d0b3eca0403995d0f5644f0f6d9ce5e18338fd097bd0793d60d749dcc431ee429b",
+          "padding" : "3048300406810500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Replacing oid with NULL",
+          "msg" : "313233343030",
+          "sig" : "258f8575c6a1fb31f6979bcbef23df0d12da874a5f12c6d59225dc388582571f30e0585abe7970b0c57b7c4bbf5e41141f9a484a8c01eafcb1b87d612fce7be6a45d7c126e186fcdd108e9b2a55a6f00684c561d486644eaa9653b0f580f05a9876b9d7e7727d82a3e89f9b5bc790939d5546f1404bc34756caca7ca873a9f64fb8ea553dc6c31a61e302bbaa731982b6faf0f44e5fcc1a7aa81a302597901d772bc3b012b2e10eaa3c6f1668d7dc67ac2d0035155c3e32e4db79af54db3ff78683facb523054dc8274f01c0e52f658f62c62a42ee7c05b9426b5a0255689c579aa10875eea16cb14a529bc0e37a17314c37ee81eb99c11f2497e270a9e187fb",
+          "padding" : "3048300405000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 165,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "0e5a02eefe35f7cc3b99aaafe148aa6e904a832f61debe61ab99961df933ba6bfae5010db70671fadf05d7596fbc3a42ba443aca4c046e9dcd46680b16eadb024e822b1c973bffa4a6147c6907e7e5cb5108ed9b710f3a27ad57cd2c69f8c246786d0255159207ea83ec93bd84cdfec3b9d7ad6bbdf3fd35ce4c59f040df0b9f549c03c37e8c9a4a77fa63dc8f0fecae5a4482e766e3e8e7b4509ed700ff3248ed7e2db11c04c8423cbbe86008a194dfd6703c4e172b4eadaf7d179b266e33378809ed389d9cb879d22d9b881442051cbaa5bbb264a3746a15889649af13d3fda9f59ba28aa569bf2a8e79b69881a6abe310d49967edc12207a98431a9c14ab3",
+          "padding" : "3051300d04096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 166,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "7d3451b9055c5922fb6956a1296b243f2ab1c3b689fb1619ed07a812414bafe3e41c2b71ccf90ec30a7b7c6cd6499611c3517e0d91cfd832cdeaaf016056fac2b3f458046fb8af03d521d07fc8649ba62331e6ad894d760c78b95c7369c84f68bb573660de2a08500faa131261a81f123de87abc839a8a6720b0ef0edd98113592818e0f027a0e0e5f1d9b6d924949073d5d061296504f4480029cb2422e6505aa119a5006b6b37e68ce866b758366e4ee8b00231f61030e5d221fe26f5ef30084e04c62a7a965cc1903ed0945dffd830607ad579446bb3292d9a84a1c0172486b4554677b64e21bb9a00bb33df7664dedf10b06d7f691ed5b0e9683ec6fe899",
+          "padding" : "3051300d05096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 167,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "4a3c11a32aec24532f92b8a4cfa5390ccf67caca60d6d1a5512225b80aa811bc4fba8f323c5d71dc1941a2fe02e97bcee6c7a936ac1f95e7817378eb78a257a25dc9ec3a446503a046fa008df571c53301e8bfca9dd4bb9ccad909a1f1899e4e012246824859306011c9a48d678ebef2398712df229988826cbe91a458077f6e4f7b9af84d2ae5901d73e7ca778f8e9635b37f57386f146202be3e95f42909840a4348757085c8de8431e4e1c91aa667466d899b1e41e691745d73d1e2fb9968ab197ef1aa97b70dc49c25bcf62bc0746bbd5a97921fe851d96dee01753fdf6272cdd86ae5b7c4b3f9817994f898e2ef39738b52e62e788bc878fb446f1f0f80",
+          "padding" : "3051300d07096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 168,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "1753bd81f2bccdd8ee330df96e0c03345951b813c551e72dc7d101f16245723df7105b3e815f0e23fd08254158f60a9bff84c8cf5be766d7c150639ed017264d30e568f182c74a7e0d6f6c7d32ebc41d4cff8c09265fe60e8d52f204e6128a57e54a18fb90a587897ed16c50c0b901072f175ebfb20ba3670a5422908043f4e416b5622e02fdcf8d1e632d769d2d1764a537803088921175cc1a7337df11eb006d946576cd08934caab187d71c2184f0502e3827db97976f7485bc34760bee949346d3b3de8ff48642a4ee0ae7f9dd97084ea6f70118e0dc3148a428cdb662b03941f6a505da8a77e00be2013ce2762703c72105885ef2507f9146df1ae15341",
+          "padding" : "3051300d08096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 169,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "1ef6f0daf2eada9eb09ae8b7aadf70dd9c511eb427d5edf04c62b6584f851e47228f0e7ed71cb7a0a1729b62885380f132f63d54782b4c5981593bb4a270b43b2a93e7cb727e11acb1eb649d8f77d9615751d1de6f9b596071b61c19cea2d3941bbe66ec7bfb2718a16110f90f9b852d0d69ddc67923a9861e51fcd22d9faa859b94feaea5b3339817c9e6c7a6d8b4a907787279e0f82174947db7d110690e0bec1ebd7d4d36dd0c8c67dbd54e95e78d150ef635e7c7b6ebdb443aba2eaed29c1b6cce426dbd86dcca2ad0c217fd4d22b2806176f45bf7873839d4051bb15cf0a3bd29d4e80ab39b3b92a1b2e058cbf3d3bed89a8c688f37812497d37aefbd23",
+          "padding" : "3051300dff096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 170,
+          "comment" : "dropping value of oid",
+          "msg" : "313233343030",
+          "sig" : "3ca8aca6df10b57108c39833e880401c593d24594f3f0b176df9bc948171b84b3d1b80fe11770cc3340cd9d77cf61836f5f3e4ff05b4da313e41fc2dae072adb596d43da649280a85933c7f4044954222f06ef58979e2ad172b8bf4a77729dfa7780adc59a52a255e664a85b1f0412246b0e85721275524197c77e03f7beac12b9a43f3ff633d4458baedc4e6f37ed566ce67cfb4fe392411e086746122e8680e3be330c9ccb2acff91ed8eabec3fc84008d8d3e9a3f8a379f1e5d1923a39ce3ecd69231dda661bad8779ab04dd93872bc3a706408fb5e23a4d375af4637da1dd0437ed9398367e3418972f711021db80ca9eef88823c35ec31cdc1509f8d222",
+          "padding" : "3048300406000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 171,
+          "comment" : "using composition for oid",
+          "msg" : "313233343030",
+          "sig" : "0230849ceb04f40b8a6e42546816fbf497fdef532670ca9828fa9f12b127d7a97c5c2c56f95048c11b0c4c0ffdb1bc5af25dabbb09379b707c7b9902f0a730013437e8c5b20690c58a131f77a57320a8258b3df073c63ba75576a552f65f3834bdb7dcc802b4a92dcc81b1e6091cf0f1403fd376cd53ddf62737af6ea847978cd8edf36650ac25cd741c02cc0d1bd503af90ce0b8da6708e8e83ba5cefb28a033b04602999d38acbf03ba0ce675e3ea4833e67ddbed6eea332b6bad6e92973a359e2228cd3020ab4fbfe9056d18470e15a52de034f7b441cbaa5484a6a5882d706ca49a4621a9c159cad90d2b3adabd71df4bc9c63ebc631ad5cf6e5e2e1729a",
+          "padding" : "30553011260d060160060886480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 172,
+          "comment" : "modify first byte of oid",
+          "msg" : "313233343030",
+          "sig" : "61bdae14771e75b523505ed9d9f4f276f72769b723ef6de8f0be6bd482b89a55af6cbb6448474c58ab53f25e0680d8a37a0cd6e6d7c1cf87e6d94e88e405c9044aeeda7380504ace1fe5fd1b8241e74708d513f3396fbfdde9a81a814e82413aae10920610a7e4ed2b00d51b54886a811b63b18e6ffff58549111d7fb5dd0331831ed3be62dd4ae704e140014dc83b57298323af840b53fad3ade4d19086243b433fa39375d32536f42747700914c688bd74244d8393fcbaa6a321abbdefc711485dc17bcdf73fa259fcfac4a5a37111145cd2934ca80cd786117073ac7d42b2b8d9761c6130aab683bf5549f79f95a342717679e67700221ab4b021e5855644",
+          "padding" : "3051300d06096286480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 173,
+          "comment" : "modify last byte of oid",
+          "msg" : "313233343030",
+          "sig" : "6598c1239a83d0c0723b68fe38250516ab689a11a2f61c027f8c0d23877cfac192b03d3beb50c4d6525195383f01ab4a696885bf0f7221f2a4481654019db4a8c463033a8ce16a7e05fd9c93f931e1430be94d8e9d05a62d2d0c3aaf6c4d559b1811b82aa9d37f82d194b86e593c94bac6450ccebb8a6929217b534c00e3e287cd30eafdba3279c97a614153e187be4c2da60167da375c736bfa51239f34690071e0f1f8a73b631553799d1174f36e0c7b7785cc768812f597a69ae74b8f6973084bb272b5fbb6ca56a21a7e0370f08489dc306b0854fc9f9e5aab570d4100d90404f4d9b5c7781fc791759fda49815782b38ec9f58adcd18cb70b2a651a18eb",
+          "padding" : "3051300d06096086480165030402830500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 174,
+          "comment" : "truncate oid",
+          "msg" : "313233343030",
+          "sig" : "0ac9696f7b0b311a6814d3e5d63c48a445d03c89df77884af972961f49812506ec8456747ec53e288937286f14c2e41a8f74fa421f4e14996de675d9751200f42604dec63a68c45430a575da116d77bbd38d60577206c743208fcd843578b575908e569514cf93f597075ab0afae8a09200a1743bfe3610736b70b259becdc38b67bf73721814c0134da8e484ff272cb9326bbf2bb769740132f0b2e44812fb54fbfc5ab96123c0d13eb62bbe115cdfe33222591e0286a09a963e20bb0afc0cd7bd2de7aa36251ba7cac6997a52186cf28dbf31ae3f571f9c86bf26a05412cf1e1a4114db0d5c8ea4e6b07ee215e3189afbc0b430d9fd8a5d2d138ffc0ecd984",
+          "padding" : "3050300c060860864801650304020500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 175,
+          "comment" : "truncate oid",
+          "msg" : "313233343030",
+          "sig" : "b29d1a63166fc63e249b9375636e95d9c054dddadd20e0ae1a3da348feefcca44a27bb23164136a8ca5964afaca45fd0543657801b1ba129c7afb554172abd19ee9edd058018e4dae4968372dea904afc553414f45bfbc26a92172437a699d3040389f0f507ffc9399f5c36956a11aab1e97aba595fb424abcca14ce28928bbac4c4e275fbc96854189509eadde522457e12b22c4fea0aa6a5cc751c87ba30ba3270bb0b6aa1ab580b663e46090104d55c5e9bafbe5d347ec7116676d1fc9100a2eb7c0710f5225885a1796965c923dcb7be7c25ca95458dcf3e48f42373fc3fc55353a029f9dc40050288ee419054203e840ea14fae81fd81ec55797993f076",
+          "padding" : "3050300c060886480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 176,
+          "comment" : "wrong oid",
+          "msg" : "313233343030",
+          "sig" : "3eef2851713beb0573f7d2f79fc883e7f03a167ff005bc7ba3ddaff97681596a0fe6d3544168b05d1fb018f89df1aea8ce23b686487efb62fb51601194696539fbf3fdb6087080b2ab6936e5a91dcc940318525a175762a2166632cbb64e77078e75a50b762acf784c09db1d5382c4e517f44873a31af879d208f6420d022f6d9fcf92106306084c945458a67eff8cd4d63e8face6c6ef72121dc6438e025af2b649b8b3f5c6de008fcd672d775eb7d784142a48f05ed2e98a48db643d7f790cf615a659364b89c3ae4eaa46a54f306c784c33572d05edf400dce23da68da37259eb4c61bb418bc27568a3b79186f9cd436f546c27ff64e9a993b77340026ec4",
+          "padding" : "3052300e060a326230653033303231610500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 177,
+          "comment" : "wrong oid",
+          "msg" : "313233343030",
+          "sig" : "8a8f0df2852c4277395040054f6a26038854bfad1b2ede42d95dcd03583dc97b399dca21c34680caa7a0676e7dfb6f200d32f5d9414e2130c80257bb82297ae52341733d3d7fd76d4cf0bcf7b009fb7ef2f95829dae093be816df5e22e47a3ad6a106c67365f92ebd889286f717de1b39d95e056af48f918880ab62a2e46773d7880d19bb3e435eb170a9858c22d77c3e9f0d307169bad328b8887ee4332ca4a4bde9023e4a578018daa51b59dfc155189c88a44a4956553fd6284f80fe84a3db08945434075d70cb744aeb0dcda0873db6b768466022e568801d867f79d26c35c958e046cabbc7ad1429d241d4b7e61f04302b900a9bdbd73cda784ef181929",
+          "padding" : "305a301606123630383634383031363530333034303230310500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 178,
+          "comment" : "longer oid",
+          "msg" : "313233343030",
+          "sig" : "7f1d64af820f4b91be39f8960c5aa79703d2a3a4414be6c546e930b4bdb3de24090c156f0797e9fa695c3d87c97230ab8e91aa760879af1362b9f094104b189a440fbaa42161ab5f61597fc63994ada230ee9a9ff4abbd16710336265c06bb5c7ac49478df11d31fff267cb7d53a0740d336602729ed5db8547495e36536c9a0367b8ba86fc0cd846da5690f6ef48873141e873c4040ebc6340b4b692cb9fa29b87de0f4f017fb6803f4c063bd1e517cad88139aabade1b946541eb7c1336e9cea97381e49f382abd92b35d2d2b83f1559b635ee72e53d328b731c74b804ce134bfb817be683cf1877d836edd4b691c1f8effcd5f0387028e29929c5942db11e",
+          "padding" : "305c3018061436303836343830313635303330343032303330310500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 179,
+          "comment" : "oid with modified node",
+          "msg" : "313233343030",
+          "sig" : "4eb3918539959c1be188f0f43b6044b5dae507f4689d32559d8d6d9a2c9bbf5eab57f9c9971f12341e734febbf7f86385570cc74292bc513aee3cb592ab0aa51d81627191bf50365df0e3991ac6fd68166e903ad40a8453f49ae9e10818e8c0b9805354396810787929aa39def74f04afef5a6acf267cb6e7d8ec2d9d5ee71cfbd4fc8799d6662b1ea216f85b8707cd0912153d1fc545a2a2d3499839f93b314efd359641e302c7f1462c5d27e6c1d26a90e5cb09a14f7d7568a107c0560742444ba65c7d41be3faf32e5fe535952ef4c4b6ec04439a7375e50345be06a0e404f0f9c10200d7e33816d26bb38048aa118e74fe4d2794a261b1edc931790e6dd9",
+          "padding" : "305a301606123630383634383031363530333034303231330500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 180,
+          "comment" : "oid with modified node",
+          "msg" : "313233343030",
+          "sig" : "2ea8e4b1c5f02af9bc327abdb99f436133e3ca71a33de8d2c9cf230ef8e632aaa6861cb39c2663ee5456cc0043648d5b9eb5875961cfec7ecef0f65877e1b91053adb77690923fc1fdcf34353dc5fabaf74e8f71b9aa363bacda2ce8e1c6a5d33e4197428286959f3cc485825525243401c9cc7a3299f59219cacb5e77db74b1032057cc955c94cdcb1ccf892dcb07deb1479844e0cf7ff1700b6c8ce86cf4b1cb215c630699aa13e2dd1b2977424f6e00485cc23273d8ee6b9ec128135152b8b1864be5a4512710bfa41d26b93fe4d34e8a1712130c279228c9061551ab2b2ac50a06b660b69a17e3b82fa2d7a958fba1d54d52040e73a4420eb0e66b379f7b",
+          "padding" : "3062301e061a36303836343830313635303330343032383838303830383030330500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 181,
+          "comment" : "large integer in oid",
+          "msg" : "313233343030",
+          "sig" : "0fd08c49fd3a73c3dfea351ab38fbab8978c327f8d48d5b1f3748c8803eb265a15c5ff768c1d8d147274ebe9954dca5309a7cf310e5a75728fafb6976bf78ce23cddc97cd7be1c16c9d4a54f3329235fd8056396250886feee30dcf8c23d3e3a60f4ca7b8b4f9f740b12972f43c0571c3ac70dc8e8ad5ec6402ad4f866714158eb1ddbd823f1fa7190277f081ce9eda1236ea094efbd101a365364edc479a92cd4c40a18fb18f55094f53af0d345c562c495fa169e26a78da421042167040d755fe50667bf9063b3e745d7ef40ca493ae8a32a6b200760752ee4f48b1787b109fab89a555b75122ed70c2ebe54547d2e08ec23ad0b5e63f4f89fa441f4f0f537",
+          "padding" : "306c302806243630383634383031363530333034303238323830383038303830383038303830383030330500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 182,
+          "comment" : "oid with invalid node",
+          "msg" : "313233343030",
+          "sig" : "09ff22e383647da8f86cf4ff7eb30846cf1c38457cfafbfd3ba0a9102db7cf3c4df1fc9c18d438c2194bc1ff9c1972edf8d5a5aa178aca278b9269574f06ac6d3e532b60fb0072e3637fba5e396ef62092826f44a4268a09bc812f563af25bbff49d30459e463322ba3604b3c2609b8dc42f6d74fdc0e766b47c064f472df5301e57a6dad07a531f84661dccc41069412e3c6aa2ab30fd7babeb77e9f2759f5e33ed6adce6617797c645269dfdd7138a166938a5972c5f59c5b1f81963a6d6872854b36c803a56664006e2f15c332399c349c8bf9ba98308d9fb0276f1b65bfec39fc8b9eb3c5475e6f9e8759cb357cde0406cbd7a30cd56929d9efe5ae5c7e8",
+          "padding" : "305d301906153630383634383031363530333034303230336530330500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 183,
+          "comment" : "oid with invalid node",
+          "msg" : "313233343030",
+          "sig" : "aa0665f8b14da337f7212640e270e75a75436ada44375e45e6e976b1549bcb6d5a1d4042f160d5b4a3e7ae6cc8c5485450f94cda3c8c52fc071b4b5db3289cd68a4c48045375b7896cb6e8456c33b5bc4238f92ee242628baba30bce1a8856bcaeab25076414d4468d72d26914b9216bd23ccb77e1e5863481acd26bd2d1706c5f9c65ee84c536bf674eaa9d480d631de47bb6c422232e544f977af1eba39741561b2932f286a22681fad7faf5bff4d3f2d9fb22e9fafda6a677ab7eaa005dda5a67228dbda74b043f80d2fccfb0955124db86112cbffeb1db382218151f4baa2837c0f1692ef9a08529f09792ed0b2324157dd39daf63fe972748810c97ce0e",
+          "padding" : "3052300e060a608086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 184,
+          "comment" : "appending 0's to null",
+          "msg" : "313233343030",
+          "sig" : "54bb859f5b913bff81a26bd83526899cfa36ab1f5d0d3f582aa414ad08629d279d694e4d585646dd59ad3fa116e1b7e6ca7548bb8dc81c69b76058b57a4cea6f8db185a02a4fea5a173768faa26c8537a68558cdf8b4fa82b4384a04fe598b1612a7ec357be733546c618466da5175162ca99d9323dc89e9b7fc0c99dacc3c7779fcc1222c23f7375d4926d2f1970f4359cb3083321216169cae055686364c77ee32c339d89ce1884d815cb61702b738436b3f0f9ac3e774c6f74993bf1c7bfd54741476ccf111791e353a991d707f77cd5a52d470a187d6550a17bfa13c33c7dee5da8a07a201ad5a1afdc33e863c7bd80382989fe9a14f6b6314af53cfb71e",
+          "padding" : "3053300f060960864801650304020305020000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 185,
+          "comment" : "appending null value to null",
+          "msg" : "313233343030",
+          "sig" : "450f42cab5828ed1719c100259528c39c2ea655b86f1c45fb8491914f48ea1dfd82b368b09a6b53793b7cd65e1c363a886dd0482360c366a04ac626c6e24717df9ebe0fede2e50b2b2fb5cf715942670ce7ca417f213f6500429ce3953cbea17d1adf4422d56d1598fb194026c40b71499462f240bd778de1162946f3af9c6f72b9daac8562c897d32339e40ac858fda5e5dc9abd6caf4af1b01ab5bf4d99cc86d9d39d12e5d85cd4892bc149da4eea5aea46d37641f3b1c4c15e9bbc9498649e5ff00f329514b890e14bfbea31ea811330b3a3587a556ae2ae53c46e3ebe915d3f3885e6c75f3285c539b95a9dca59513adc89369dda1ef18b064bd74aaa2dc",
+          "padding" : "3053300f060960864801650304020305020500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 186,
+          "comment" : "truncated length of null",
+          "msg" : "313233343030",
+          "sig" : "816256d2f65d1e78a763c2eaf69a6923d2c6bebc46278ac9f4f005b40fecad7f9f0d2a06ec69b08195b76b6651d4873f5acaea9a122b99d381b35fc08a790c8d88ea63c102e4fddf6f923fd5d0b048598fc19bd35e62ff0b41ab729d167e2bb33ad8dee0b3e33ad8e7ef647f51b4e255f677b99e491460f26ac488cd35fc73147d6a18199839b747c53f15a25f14ea56ed0a5e381a774ef69c69d976a0a2847a6ed865a6f402c9eabdab4a8c03956213c19a9783aa8bc153301aca3acb538eece52c43bd7c208452681b877e05c66c914a8811eef729185db3630ae24f0d2a7b46da2b2ee12a0de676df07bf3a84195d5ec354f6bdc5287d8b2349eed31487ec",
+          "padding" : "3051300d06096086480165030402030581044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 187,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "840b053b40a9778db629e725103848e7bc13aa540929c6df42a55c186e2f0330d8894d5247c203c0659301f6fe8784e165ed253a7bbebd35723917c329fefdb439e784ae7aa13411b9de20cd1695ff3a084824b39c25fc6e3187dec94f28f9335b6e03458bf9e0b7099314dee2ed29228c4bc78d1ba0ee0eb9bb340242b083416afd193a93632a9bd761faf1b78444fab6c8a43f159f486605808ff35af1fa0dbe17a093d1d5f47fd8c1eb2e6789f66d7a4dc74145c8ef43b8cb3715d3c7d6f745273b0b1a7c92a6134ba9bf6d0b6670465fef1c176476d53f26613987b5f363c38fd3972e802d5114904fa6c8614fc789b5a40bbfa5cf5d4fb37e2f8049a136",
+          "padding" : "3051300d06096086480165030402030300044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 188,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "b889dd445907633a178a31b9784e0fc57598a6062bdff35cf0fabcec275138fae388cdafe2ce748b89334b54f0dea56f6bfadc1b35f1d81e19c7b633ba0065d3d04855eeae5c175d984d1da2182589e09dd1228a7bcfc118d884346fa9d2f95692f7e10b8848d90ce20f6401a092bb10145ff817b7be159506246267886becd34cdf14aea0af2da54de8f888a5ca1d71ed8a2c213a2c2f963f368a3bbf0cec495f161925418ac5eb5cea816160da64e992670bb900b9bcc1f9fc57a3506410e7e53554f3a8f06701693fe0c3df9fb4a45c1f567cf787d478c409ec97c55f0aa8c9b5b688fb2786bc0a3a20bfe5a57632cdecd75e5eb350f4ae2fc28c9c287268",
+          "padding" : "3051300d06096086480165030402030400044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 189,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "538f60dbb84589f86b608a0457fb1f0019d9058b58c6c9578f7d49ad4c9f312c58b868ab5832e6c0f6ecf1e52582dafcfd6ff46f3fceff1a56ebae05adc421a52b33f8f93893ec760a1b52ce9b5b04570be56fe92eec59ce950441a06ed3d7ce83a17f8cad57f8eedc380e771878e8d8191b14ca783242ce005717acf9c9e05bbec4d9fc0d1007bc0aa2975ceeef98e97750e7f6ed9e91200062ddfb7fa7bb070f7b6539e4590d2c5d92b7ace0367608b9b7b879d592c9f2d0152d3f0184c2ca9e50f14f9f3edffcae85f1122cf579787cd0bd2ed2d98826250654e96fa5aff5d00bae6705fe3d95cbda5cb0dceeee98c17eb2a434a18184cd15b08804a9e5aa",
+          "padding" : "3051300d06096086480165030402030600044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 190,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "1229188a8f890df59c2f8b9a7ea411329f0f2c968d7efd14e7534a9b2c902300a48ae6d5a32b16fe7056bc697cb3a32b1bebb9a459922b37723740f0169def4228787b3817af52d441e59a548995955cb09938d83230be08cb2ee8ea0ac97d8bc354021589a20f7f5a483d29f72646e0d2cb344f915152c18c99ec04512fc5caea03220a48fe91dca9a53004b118af8b940f62a40b6d9f1876149c65ef2e8cc9a8eaeaced66e415f8de62df25d8e5e94e1ca1e52ea71c926df99e97e967cdcf5e1bcb48aed57bf66a34baabc9e773d5048cb436d9ea196829ff0d8b9f843a6eeed72f393aef10a45b5fb9d9ca99acec4744f6edc2d926d665cdd5fa97b29c003",
+          "padding" : "3051300d06096086480165030402030700044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 191,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "19ef5e467b218a8f5dda1f5d3ab6c5c6c275d73292f3da402d41359fb61212309877fac2effb0734dddf6fe6772942d046f89eefac510a5ea511fe8ee690cdff7df4c6590ca9393bd53484630f744ec48c310379994f381608ab1ab356ed5ea1f3077e44107b5967c4a4794cf26b389d92d01b40071f023ba0051e4cb210e31972d12a3a678fb43975a8107d1bb5b883774723fa019a2197e48edc35bcb42781dbfff8cb368e27f6f0d82457ac25713e38340ac5a31cbd4a560d6a762251605badb9f818162e338393ae9fbdf19824de991f459e96b167194c50b223849f9def538507f61daa21c457a4560d7880b6996668024211639ed9fbc4fafe7aaf4b38",
+          "padding" : "3051300d0609608648016503040203ff00044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 192,
+          "comment" : "composed null",
+          "msg" : "313233343030",
+          "sig" : "bac08a201a27e4c05af0ab67c097a77dfab297546f2283c6d8179fffe4116d26c3d9068315594640046ced0248c157ac27e8d2afa2819817e1854f7f8b712bfe9da5eeac951477340b1fb59c85eef525d46e8cf20a0b9e1cf8b799ba18d9ec8cae60d6663c5a921b97d195d1dae5967b288b4a1268a66c5bd22606416bec803c426c406c25d96bb2aa7f58c3041341031368286af25bf96fbac021036321dc4418aa33a49194faefc68dafd7d2239a1d1800451d4906de61eaaf29a61f860f82fd6ed8b5bf4461e8821e91e67fd8a73513014b7625869bc5572a98c048e6d7fba0a22f4eb4a92532aec16c7b6eb762188bb40619f7ef28b77906dafe01852b00",
+          "padding" : "3057301306096086480165030402032580aa00bb000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 193,
+          "comment" : "lonely digest tag",
+          "msg" : "313233343030",
+          "sig" : "535f91dbcb5b924f6979f1bdb9dcd1d59fdcdaf2fba34db7ec68c0d5e334149931ab4dde9b5e711ba06adcba7b529d7dbda571cf53d7988bd31f6f9804799c8ab3e193b712bef52bbe4c2561bc27ae4a0f267cf7636eaf7afb11000e6cfd311ad5a3cbf746bba29cec9a83f73ca3db339a7d570c025e20e4416d2a4c1ac0eaf23812444f1ac0fb7cd96f62da9cdbb8febe3e77a04c09c3e64e48c0ae2868e93d42c2cfc97f1aadde8fae28bf942074cdb55e9a04d23090de87913e36407d98a93fa0785e2eff28d7fdc9f80a457bad3a780cc128439b36cf2ed021e357cfab5ab08da906e1b2337c42f18c01cab7754bb085f5857f2ccb19b055756ae7dac41d",
+          "padding" : "3010300d0609608648016503040203050004",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 194,
+          "comment" : "appending 0's to digest",
+          "msg" : "313233343030",
+          "sig" : "21d0dc541ca6f3766392be26516c1ff06add55fb6341641c884814511af5ad230d036ed7a547da9ea054cd509006f7fd11c39e97364b265d3606a06e44971cf80a1426ad76e699f68937be16cd256ccafb94ff31053d9e01fead1f71c838e05eec5c98fa91607bbb3fd17766dd56daabd826c7aec83ae56f1d60c74b06885aa8cd94ae1e105dc96d13b7927dd08f07daf784155fdaf54a42851c7873ad77b4b2508180cebbf75e0c30aeb82988a20301071f338846e8fd6981c11baa11626aefb15c2e83ea87f0b5353ed2a3fae1cd8a5c9e61a5d387aaa989093e1c58960c759d6699de374cef8ff56e42deb6517f552459a1fe84ea1a8e4da9562d3f567c69",
+          "padding" : "3053300d06096086480165030402030500044243f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 195,
+          "comment" : "prepending 0's to digest",
+          "msg" : "313233343030",
+          "sig" : "5a6b7dacbc1dc464698f2406e9991dcca63bae465a872f62bd9c0626e98386c3ecf7935cb1a6598fe167b61c1c0a8c0b3cbc3c1c911ed56b82bb443838174babb6f7ecead6afb94b371de70328143f367402a55e15e0f390964933e0553ba892bd03f0d42f88e1a67d47b7d9e218aaaa0caac46ad88e76a2f887439406feb886800788469a27c2b911fafec28a23a9a4781018fe491b1876fb514e6c73cbb166ea4c1f1d878b56d2029f277b3471557ca546db6ddfce9f367583c28d14491f82f31e50c11f078801317bc29f6bdd5ad6986e7c0a33d2944f2d4469243fae4d7e3bdbcf6a8b5a01bd5c094b1cc27d772d6f7e5bfd67b83269a60df11cef3b6b10",
+          "padding" : "3053300d060960864801650304020305000442000043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 196,
+          "comment" : "appending null value to digest",
+          "msg" : "313233343030",
+          "sig" : "842978d43a61145541fd3421315fcef1e95ca32896bebd6dbaa0a0e856eb0c47d1ff7fb2eb981c26fb8f7d6f1964cdc05f856ec994517f1eee6165786eb12c44ddc60083eaaf02778400acba6702e54f891c7b5865bc0c735e5443043b4d6dd43f8c9554a524b808be58893e18762b68d893a970638d2de3e677ecf3b6c0889bb1816e910f243dd1c4978ae2cb1aac745d06b2a8add4b6f18b71e016ffdd930c4d5490257f9d0e9969900e1b49796f3e3fb3a110b0fe1a00236191d34dcb5b7c2c75a042f9a50449dc403403af09cda51926d8f32875c8c0e5903700e41c7f93a585f6a6336fe48174d1939e029f6bc30800c269fbf85997424bd2624e5c76ca",
+          "padding" : "3053300d06096086480165030402030500044243f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 197,
+          "comment" : "truncated length of digest",
+          "msg" : "313233343030",
+          "sig" : "5b85cd70c97ddf46244456e8d4f303239b7e401674fd96f96bfb8e28271abeff96f07776090731acddba70fb758571e6d3b015bb20d5e88981a9b9940dcf1d77a4a61954b56a86c22870c8ed4de7d6d991d3421c08179c03cb4d2625f2255491223c66fcf14635a97b8734c4f823adf99d7e04fe44c2206bad08c82868a25685cba38e275559fc1a8fb9f81673210ff766131e05bb727cdf45a39e1e4352f29dfd9f49ef21528a202da5f2c9ca4abf5a2041dfba41843109c22d89d6295229aeb9cd0a4352c5cd8694389e8d43dd6eee8258e57f085e9f0d39c0ba17a35b0bc036c3d568aa901f1b6a3597c43f00d330a92a39cbc4eadcb73e5e9f39b3762496",
+          "padding" : "3011300d060960864801650304020305000481",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Replacing digest with NULL",
+          "msg" : "313233343030",
+          "sig" : "17116ceb9e397e3070704a060eac2b5dba73e325e5841e13209d2c3e836a081839a153d3afa6b336f9c077d9c6f4ce7e1ba77a91241e41a836d12783239d6bdbc12b1c6cc3a0959fad86d1528ecd4f18ac95b2aa0bca0bd1d7473694ce57e72a30b93088541002b92592165d516cb2797f34f686276a80880f18a24fe18204dbac867c646ab6c8b59e007da8ca119b8a0a7fffb127e7b017dafe6d21aeb112219920ca14ff16bf5a88550a7261e20cce9626191c817991d99b671f60ca8e9466868d58e3588be2254f2a1a69b810987eb27231ff5a0046ed4215433c9d8631375d02db3774f3429de73480a16af9819bf8403cd5794292aaa2fa4ae0a28c8092",
+          "padding" : "3011300d060960864801650304020305000500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 199,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "53394fe68d3b43c6037d8bc922be22587d2ef728300b3ec7bd0da9fcb8e7f6a3b68e849a18a7720a9ecb2d93b84f913955ee7be59bfbb9f5981844ce107052a1348533ac30cd421c548f2479b978404b984867f48436256db3de8cc7f76912a796418745d42cfa6aecf5e137431eac95c956f543ac092ee53d439a249fb439b2e1e629d86ceb8139b1229355e203ed3d887a340a97748ab9b7884cca8e7a2ca99ebc7bf0d365456e2203d0b983674ebb87a8d9adde73595790e7aca88100b13fe3355d43322d84e5c41cc50824878c8418562a4bed7a0cb65f9e3c6751fb3b7fc79807c78bf57b0ed12a9341be7f5f39823d02f7a3bef0f86fb1a57569760dc9",
+          "padding" : "3051300d06096086480165030402030500024043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 200,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "c0dbf6f41b307c2eb228f72ab5f763323cc30ac5c3a5f027172e735160627afbe1b5e05dddef7f1cb0bd145d16d128d1a35c03803a01bb2e12f05ee21d05089b9b7070fcfe107194088ce841725433d1b59f3501796930ae4cfa3c20c9176927ce3223dd434f8dc2be9bf706020583f58e73c25d7008783bb30a26fb273efce258e802c509dd319938fef1e5f6a951649a3f461b99488dd3acf45c254eef2ce742d176a58179f720a6578f5101d89f74026bfe2710d150275cbc3b5087e63dbf37c0e7692d18fb53f5b62ab67f51eddff22bbc62dfb864a58047b0d5b83a94c44b1c0aec94f8c0e32b00f3367e505a5390a3d3dd40237ff6f148c6974bba31a6",
+          "padding" : "3051300d06096086480165030402030500034043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 201,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "8300a625836213ab8267dd9b2d5a785bdcfc56c56af0d97d648c2ac1e40855581daf13af70ad1f37111e72faf7bdedd1083cbf05de550ee7f43aba0869d254a0c3a6a2ce2d2a801a9170aaaf452b7e5ededbd685f6cf2c52f3f5842a737d56fc9ee99c4ee9d0c3199957ab9a7a584792c9fc22173744b3eb7076a556505751d6e08414b5e7f4b8779ce8d5a2a30d58960cd94c051c0ef6716d0697fff2d9fc79e362b9c03a2f6c07d27024a2a61424a80c331da1fc321b42834759b5de5dc280248f02d80e85704e754fe29ddf0b680672ee27a65accb8233db3775a81eb1a6126d9ee657d74c878be876f6983521a13310ed3035d8069186c2824dfd8b7623d",
+          "padding" : "3051300d06096086480165030402030500054043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 202,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "be0398b3e6d268582b4de2a05342d5c72131beae600bdab1f3f13d1e21b42d0b4b60d89589bed32dc00b230102f553df95b2960e451f1a240206330d0eaa69c11d50363bfaf360312aad5d3e9356733201ebc3a69a5ae731e20426263591fad1cfe31e0e87d2fb4027de3c57fe32b15c275b9c8f7ec166ae688d625674dd4efc8b5931a41bbb922e2ef1bf7dd9bbea8e98f1556f8aeb99baf2fb848e5e1fefdbbf73d61013171f46ec4f09849d7e7a2388f7ec05491556eba3a3df18edcc9a8db46e10b13593fe37beaf1646138da87e61a98b02b33297cc0f4d7a91d6ecbac28a159d410af25a8b8e653a093a45c3ed19e617cda1709e8b1854cc1028cf886e",
+          "padding" : "3051300d06096086480165030402030500064043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 203,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "6bab815040a7ba6cc82af2d5449931628126eaacedbafbd28673003fe9f5bfb2b53de6700081477f769d9e5456b109250c9409ef998e334e44e132a88efd33d41c8395fa0ebe58c871b289bbf20391db3919f2b51189b2d51f900829df95f5543bdc62be8f94272ccb620a841a4ee4373212b853cdf1d079ee5256c188d3fa17f91d651ebd522b60b5f3eaeb97b302a70ed9cdd05bf1212f9ceafaae5309303e16f18c4477badc580383c13a2333910f6665fd08dca1597f216096614b2b7956142735fa800f5d74a422cb4f568ad9182e0b96e49614e129679d46b387825820017faa81087568e87ef13c89474420c613bb071b5c295ffb9487805d147c7cea",
+          "padding" : "3051300d06096086480165030402030500ff4043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 204,
+          "comment" : "dropping value of digest",
+          "msg" : "313233343030",
+          "sig" : "87007220bbef1a21ab37ea2b757caa112233a61688a0c0ef1d454b86843c434a98f43f451d6eba7da2e8a82e52a93d44dc82d2a0734c69a1e9a77265fe9315984ea2971e729abafe4f7adf4b0bbc750fa4f59fdefa59339bc838d5f6cb9556aa4498f8e596c2d50516fb540bb4ba98b2d04ad3803eddf55767ac7b121b909c9d435d49dc6ed03a9ea0a16d251e63459be47056e2341c239ad4f532fbf4cff50ad3029da8962ff09b4c5e47ae29c28692a53d492361af254ff86e99468e53887708ff9f805894896ede5f7d04530c0eaf6a2159d390a63ee154062789215c160895cc9b8c4a6afcd31b1d474b51bbf157f95e9f2be6675844cd3ac9c4acfd40e1",
+          "padding" : "3011300d060960864801650304020305000400",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 205,
+          "comment" : "using composition for digest",
+          "msg" : "313233343030",
+          "sig" : "185d46fd6c9c3728852a39c11a39b1e8117da5d2be36ee12d7f87c262983690189775eba623251e1d28304bdd7e94d7e9bac6114e4969ad2ccc3fc45b94cdc5904bf3f1aa62cfd8685b2a7b49aeeab673ca2de7b73dce357fa38e1d6c7bfe79329ba7f579d205b4f3c29559baac344adb2db1d5f90ceb542943740901193997c31dc1c5101fdc354b47d8ad37540bc1058ce57a8afb76cac731e03903ebe880ebff1c299d61ca2d3d48204e4c37cce0d80b7458fcf552ceb225e2bdc55c58b3497339ce1662e7064fc59c342d0ca6e6798cfc7b6457e7284ecb5684ef9b68ebc257532a8da54cc830aca53d091fa60d9e1af166aac5da8bc56b79eb9f8433020",
+          "padding" : "3055300d060960864801650304020305002444040143043ff800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 206,
+          "comment" : "modify first byte of digest",
+          "msg" : "313233343030",
+          "sig" : "1e28082a4d00e25231308b793dbdec873d93340a3e85bf0b1af485c4be16514322761d6e80bd848a97d394e76b647b79bf25b23c44cc208650b7877435498cb4e7494145fcb43506e58f15b83fd2a25b3b93232c1f9cfb748b8f83cc961de3fb3dd2856a36d63af7ea488272ebc0174982a7e1f1873ff86bb219dd87e25509f11e47b1cfebb895d9c6745354dbaeb8c5842377b1e9326c28a489285fadac25912f9fd971a8ab4b4bbeb07364dfd998f774633269b516f889633d49351f05008766dd0556aeac57987f3b18db2ca056042068f1ea4fa87bd90fb06c6331ede38ed6ac3c77c3431e30f4c3b977c0e3ef635fe59b0d884495c95d2342eedb3d2266",
+          "padding" : "3051300d06096086480165030402030500044041f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 207,
+          "comment" : "modify last byte of digest",
+          "msg" : "313233343030",
+          "sig" : "1dc7a0aa238280e0fc150a9177a3e4ea9579d6383991210c524db4c07871edc5b89d3c8aa45a27351581366d887bf1060393a1fe62870938805e97bf4aa055199fcccab3523131469ddfc4e7436844fdfe3c2421f1c2e4853d891edeafdcdec7b3e27b71b41e1b055893fa40624dee585898b194942ada5a143bdf2a8d04fe06c449e21093c8be5986e3409c9730b0630c4f8d2b759f50f92be0a13876f0be20e8132f2134e221b9abc03cbca36b3a47cc865bb24806fcbf9b3c862f35610e240634bf97c28b459978f7da007d29e0159fc1f3435a8c4c5c232d4382c9d2d16e168eaf10e1cf0db41fff58807c979f5102925aa50dd27567272303bb4cc8e70a",
+          "padding" : "3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb34c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 208,
+          "comment" : "truncate digest",
+          "msg" : "313233343030",
+          "sig" : "04784d6cfdd749438e88a2e61defac5f50002bb0607ec2b696e94c2d9a012e12a8a6de60a08fba0bf4e372416cea84a8e93fee36276eced5fff257747e3a535608b446cc716887d6ab64859ada40222b86dbac347e5528e65b70a2287319c57addee766427ecb491113014389409214e87029cf5a219108dda4f1cec11637c7290d3096267ef7a5c433f93cfae6b54d4af4da4568f4d88775da1bd94f93ffbddf19e0cfaaf2e200b71c68df04188678ec392fa718d89497feda1342a2100cc8dc7c9a616981e2447b0235241bcb48c0d384dd6e6c4f24f3a1e2754e7ef8348160ae27ae207c72c74866023c35685e1566a4df12d92fd5e7b44188f56e3c00f9f",
+          "padding" : "3050300d06096086480165030402030500043f43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 209,
+          "comment" : "truncate digest",
+          "msg" : "313233343030",
+          "sig" : "65acbb86ca80e6a03047a2ced4c4a461835bdeb42b27845fcef96711bc0e7d3d3b8ee95a87dffa2287132e01d9ad7e07c230fd6d2c1871aa7f113c42174dcfc2a78f2442355f0f10e68749b0ea097a6158795ca0b236f9c73b0b1af7de9be110b244bf8552105f35c761dad993323bb33a03b89ff26c312042073f1eff9807791449ec52a50a8799d0604fd35ea1d10f316843c1ca780cfd4af1b695daa0282d6dc743331d239a087f725fa67980c7ba1515326cb82faa07711df1675c9deb9960955bdde07c8e1f57884cf71ab4bed2b1080be4f4558c3f5484c578530695bbb2ac3405804aa7b5df4a301713c18d4db2c1f9378d32bd5a94a0cca2ceb4518a",
+          "padding" : "3050300d06096086480165030402030500043ff800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 210,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "735758c0d252c3d7eb0d5f7d9b1fce3f3bfaac9c27ab9c64d9dbe53d5a20354a1bab7d7b1da1818852f9d8f3fd24afbd7fd94709672106d7b389c1c07f7347b025e49ed058406bc4e0cbdaca5f550e57f4ea07cf924c371ad89dd72a4b5bbfe95e172436b5ddf10b564662a36c1762a88cf94cc164ec65b538ff8c8d527dbb09aa2ab60972856f1b4fbba5fbe4d82ba53cc8450feac18a276938a3d175095cb7bb923589f54e721b836cec671f7672548392196e1b907afa5fa22f8817d628c922cc1de6c9ff2dbaf691bcc7a53b30d5b39ca8acdbebe6992aff3c28ebc00bb6a91d3714e6cacd42d99653cb9eb3f148a44fd2cbaab35336776e73657b756955",
+          "padding" : "3050300c06082a864886f70d02050500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 211,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "ba75b94a31f9d4cd88ef2cd76ffd0778bee027436f66e9daae2859c331fc57f0ebf6d8843e5897dcd8c94cc775a1546b84ab6e1847584f418539356e50e59863ab15e56a7ccc96bd96400e0b6a6453bebb6d7f9db6e23c59048cee4cb6ca099cb4a67d0df948822195379d01c7b5e3349c4affc78c402a02572ae152904ccb1997b96f030f68362de99a381c6079e4e3b6b0707d17227e3e2b4baa1ee2b35c434295deed6f30501e5a068400684416e5bb0966b4ab74c1bd139cf8b7fe09c2572639c5b87794a89cabf9cc47f35ddc6ed5a86933c564eee6e6fb4590ea20fa012133ea6178780a2f009af14b9e5fd6c298f986f61430b279e933d6d234d3f41a",
+          "padding" : "304d300906052b0e03021a0500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 212,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "61a425423adecb5f5f407ab11b80b32f8ad08ac6a1a16cde833f2d8ddbe6bb311ac30fc71935337a54af6d1509ef70a01b7fac6db659c8de7c5839a700e98e0f6ff4a2fa9b60fe3ae1b09dab7e8f56ea96e326d2116bbf65016b7ed600339bc43c4cdbd05dcd20d8d46dd324833f2c3b39c85aa7cad40313c8523a5926e6bd7dd2335136f518c44e745a178e92b71199fd6c7395462bd9328313d7ab45b3fc45a91ebe4f000b3c84394713a52ad986496bb2714232d6edb11c8cc43257553526b908838ac81f2b566bf5bb193d7ce7b77109c9bc71f70b04e52d0e6d106dc148b61b6c758b79c7259099b09615d43532c8845cc136e1ffdadcce785bd406b785",
+          "padding" : "3051300d06096086480165030402010500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 213,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "409aa4fae8fe1e807391b23ac3a34f9b83554a4765526b3e508bd0d51c054ea3542e6f7853c74ca5ba675833b7b7ac1611e3f4b6d5a88c8b045d45690eb7713d491bb1961be5f7a788c602fcaa558aae928a3afeec262d54cabcafb77ff9cbd7ebda3e0d8af1bfd2ea6a441b99306601a7f456f50a693e0c2489470277572051c0d443b34126cd8fb46e53fceed29101a82b5c0de4efb4dd48cc45bd383c6c208903ab4640de5e6ae7d2c7ec80590d979150775c167e7f2399c9df892c929d8c71c8f084338fac7798742cde063c51926dacd683c2435e3d6c75967b732d2040d89ec3903da1ca5a057bc2987a0cfabdea681a6cbb564b96f320170d9885220e",
+          "padding" : "3051300d06096086480165030402020500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 214,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "697ba35bc32c2ed66e4231a7c98a947b99b67484bbc3eccdbdbdfe8c926b38c484a216bf12250a425004ddb4cbbc1e47112dbec6393bf5d19ee6a9d46cdd618cec2ac8ef12518c6147e524910e8b0c53026b44359f003aaafef681b0ac4137618c3e571ff247b67daf347058fd7d3c145c8e70f7bb5018ace902923dfb002b08922f0584f120f39d94e7f132ca30787b5663c40fcfc93fc1920496f80a4f47b37f0e668cc7a6ddf39ce502badfbebdf5db6dafff8c8abddfdb272eeef478c09a70f4c286c127832d98044e549e20901c968e3f327cef80ce581487438e76ed86d384985137f081ba7995fab6ae8bf9a8efdc8a08f0fc19dba8882ae716472a03",
+          "padding" : "3020300c06082a864886f70d0205050004103fa6e1540a9e5b94313c5907267a7331",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 215,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "5d71198021ef4a0c0ed77cda6f1e7989f023f62fefd5ba81c70d31e1a6a1c0301e4004c2ced7acd9e98938b7faa1d20cdb12b9cf6ac59c9501d8f733b3bc543669440e74cf63be3d41d8b377c2a222cf1ba40cae4c24fec5033bf2ab6860d9d0312413ea8a3446e6040c6166c06ff5bd1070b5cc5f8693cbcf90c1e7ffe562240885ca18c181c86cad85971c743b1f70a4882e0cfef08ecf8a3dee55273bb06bec7dc19263d13a3ac887cbb27510d4e45cc4f183ceec9117f4b0c7ad4af6a89fd9e85bae9da3474d0be8fc42dc9fc1e7a6b98ca1864037d76adde226ff72a609495ab76c2242aa2391b21a3e8e3164e98ab6f1adaa5fb3848eeb687472699508",
+          "padding" : "3021300906052b0e03021a0500041421f0fb55d0f5f4e1521ec82216000a17e728f773",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 216,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "aec1eca91968d08b4bf15b9c5fddd9e7a6a20be74486502380faade04d84d9a5916a6c0ef2dccfd5ac7397e76a301096732584e8442f20ae80627588961cdf97e344e131d79e6894be6fd51b72122bc2654d00f943683a8db630d35c6874ea56f908eea64902f18c0a548905b3c13114e3526f3d6ed39061724c8e9df498545ac7f455c37d2e05beecd47c15181161873925049bfb4a671e4d1901a75099c7edd6499268229353073a598174fc937f856fe85f950e9059496348d0a1d9f98aa94208d66ff3f58792ab0afe27075b241a636f1b5835f4a4b330c6f9e032a736119a1d8feb99f6c22f3490a82a65710abc3767e81ad70a230ac4b1db9a327ede40",
+          "padding" : "3031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "60899366735cff786b22572d67c50af5f644bcdfd50c559d989018efb91cc888398ce3b556d8ed134627827e7af0ffd5106795ddf96f988e581d8498ac2c2ac9ac5195d7c15bca548ccaa070924c6bc8de828fc08f5e74b8eb7cf94477310436b9d139e54e97a9764d0750182867e00f0f9e5b4b6122137bbb65271bda16add4bfb9bddb3d8ebc063296d9ca073c377e56993cd5f3f1bf229e0f40ad3efee00fde0a9ef1604f01a24c20d67fee04fe8848cd245a5b0e69d619dffea08fe1afb6cf075c2594d00cc6a21353656b1aed51af47159ef88b61891842a6eed6c3d294c1d226009d457e4c54108f8ebf4305d0dcacb07e60b51976c35d9dd5aa10b9a1",
+          "padding" : "3041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "using PKCS#1 encryption padding",
+          "msg" : "313233343030",
+          "sig" : "a5521057430948701805207688507441e3ee85b3e8ef9334922c8ae9a9a8485f95f5747778b2f7db8ed3df6655e57b03022bc1244d04961d6ee57e62c762040b581bacefe7e5beee3fd1613a142baa6ad106e720206cb119c1884f41b90e3acca402b18deb5593c3f2d9d841e23b2f9443c13d450463b4e272a08fded7f00d26029f7c0478af557d41e7285c48d9a0ae3719a95a14bf8b9e25351c7513a5ddd86a2e6c124a54be07f29660bb09da8fa8e484c0c930833fd727b429ddd2b8a6e1626d05f6265bd88eb88e9783123a7720068f590d566d16bf19b474d58ab5ca9f718eb5d432d11f6c65e9325a2378c6588c5c6ee89edf7ac708c93bb9b04a1f80",
+          "padding" : "0002ff...00<asn wrapped hash>",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "using PKCS#1 encryption padding",
+          "msg" : "313233343030",
+          "sig" : "9c0eb700b26efe50ee6aafb76f0a996890ea71533c374286ded0c21a567afc5bb212e81cf80cfd6f2d26a3b27fd7f17a4c976f093b240fac274a2a22969d119ebcb26f81ae0bf5641dcef96510757de9b0e7b02db74efc1ae55c55e8135320156ee9152dd05c922066aa895319708bda1c7a9db1890ef7cdfe7de3925f4c9852a8679f4d71714cabf8fe834ff442794ba96c2f1df73641eef076b172ea846d7649e9a42bded0a7da4647e07ed4ad8c1f2d7858f416fdba4d63b7ad80241d8fd60012b3a77e7e0a759091274d350f688c8a73334a6c0f2cece789042cbc16585cc84150278bc3465b3df701533674d272c33d06ac852cc4ce6648e35cfe60da60",
+          "padding" : "0002ff...00<hash>",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "invalid PKCS#1 signature padding",
+          "msg" : "313233343030",
+          "sig" : "084fc83861c80ca0f3c7d5f063916b2de3a1b3f93d11a5289ceb608ed3246bdf1fd79b7bbe22bf40ca7462d6689f1f50a53c0fff60b4899cbf86825f8e834171aad934a06687787c7c833cb4c6a2172002445389583edee72ba4d31a6c5cd09b1bcc18c3358faf548369af125a915d47affcfcd30f934b739a62ce37ee0060e568211ac255ed9481f6a3a871812ca2e86417b807e6d352b0aa0ca078c75319a64bdf4323a34f379dc2699201b1d6ab1599ad02c2e103499dd7cdfe0545716e73e400ea298005481288d384b76f1bff69dab1486921622fcabf0733c0bb392c3a9876d168e0a0ed453d0e020bcdc0432aa00ebcdab36538d616d93cd01ab3a63e",
+          "padding" : "0001ff...ee00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "PKCS#1 padding too short",
+          "msg" : "313233343030",
+          "sig" : "471eccd41ca3c301cc79447afec99925611ea09e5701fbba0ea0458be7d77b35e798452fd19865903b33e2121d4f21cbd0a2df7e2d10e8d20ddad3b9f0194cdac071a3c4f4f879ccd88fd03d761d4cf0770abeecc946a3dcac65e1f4152b833d4a43b65777bb146099800ae324479d98f623c5321cf9d0aca42ea93cd9df23f5bf27cc128f20ff41d9a5f4048357397ea45463f04ee665bf4e10630a006f57833ddae1b3704a6f50f5e2766b3f0c700c21160b24e0666c54eb3661f13cad3fac33b0d63860262e6759632204f0f87a3e1e039e38c15359c99cf89942cea589d78fd3710a83b5e9ab09f1630fd7f9d7a8857efd763d361e158bed5cc85b3776e6",
+          "padding" : "000001ff...",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "CVE-2017-11185",
+          "msg" : "313233343030",
+          "sig" : "c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba749",
+          "padding" : "n",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "invalid length",
+          "msg" : "313233343030",
+          "sig" : "c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba7490000",
+          "padding" : "2 bytes too long",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "empty signature",
+          "msg" : "313233343030",
+          "sig" : "",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "0",
+          "msg" : "313233343030",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "1",
+          "msg" : "313233343030",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "2",
+          "msg" : "313233343030",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "n-1",
+          "msg" : "313233343030",
+          "sig" : "c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba748",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "n+1",
+          "msg" : "313233343030",
+          "sig" : "c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba74a",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "-1",
+          "msg" : "313233343030",
+          "sig" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "3",
+      "keyAsn" : "308201080282010100f2ed0e93228f37c2ce1c215e00cce4ef00e2c08a004a39c4170dc73e5fbd9b91e7c55e596579ec9c60b9bd341e83029b1934e6493eb60099b6cfbb9804d4179c983099e19102bba49eaa28fa505efacc5a9d5374499c0c5775778317ed370de1919f38aff22d5aee8c8af36a86d036029e761f243dff3c205a11e9bce9ac1d6baf81e79ad4146b119abb13903f8562e8f3e6a918f48223465bc93d5e7d5abe3d08503ec42998fe087a1f935d1b8673c495f005dfa7453daf977e1608a8c276da2a4cd0567e4af4d18cba05fdbedcde74493ccabd9060c27d35a02f35c760b12a4deae1359f649f273fa408626fb789c916434a642d528f41db868ff93b7f889f020103",
+      "keyDer" : "30820120300d06092a864886f70d01010105000382010d00308201080282010100f2ed0e93228f37c2ce1c215e00cce4ef00e2c08a004a39c4170dc73e5fbd9b91e7c55e596579ec9c60b9bd341e83029b1934e6493eb60099b6cfbb9804d4179c983099e19102bba49eaa28fa505efacc5a9d5374499c0c5775778317ed370de1919f38aff22d5aee8c8af36a86d036029e761f243dff3c205a11e9bce9ac1d6baf81e79ad4146b119abb13903f8562e8f3e6a918f48223465bc93d5e7d5abe3d08503ec42998fe087a1f935d1b8673c495f005dfa7453daf977e1608a8c276da2a4cd0567e4af4d18cba05fdbedcde74493ccabd9060c27d35a02f35c760b12a4deae1359f649f273fa408626fb789c916434a642d528f41db868ff93b7f889f020103",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEA8u0OkyKPN8LOHCFeAMzk\n7wDiwIoASjnEFw3HPl+9m5HnxV5ZZXnsnGC5vTQegwKbGTTmST62AJm2z7uYBNQX\nnJgwmeGRAruknqoo+lBe+sxanVN0SZwMV3V3gxftNw3hkZ84r/ItWu6MivNqhtA2\nAp52HyQ9/zwgWhHpvOmsHWuvgeea1BRrEZq7E5A/hWLo8+apGPSCI0ZbyT1efVq+\nPQhQPsQpmP4Ieh+TXRuGc8SV8AXfp0U9r5d+FgiownbaKkzQVn5K9NGMugX9vtze\ndEk8yr2QYMJ9NaAvNcdgsSpN6uE1n2SfJz+kCGJvt4nJFkNKZC1Sj0Hbho/5O3+I\nnwIBAw==\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "n" : "0f2ed0e93228f37c2ce1c215e00cce4ef00e2c08a004a39c4170dc73e5fbd9b91e7c55e596579ec9c60b9bd341e83029b1934e6493eb60099b6cfbb9804d4179c983099e19102bba49eaa28fa505efacc5a9d5374499c0c5775778317ed370de1919f38aff22d5aee8c8af36a86d036029e761f243dff3c205a11e9bce9ac1d6baf81e79ad4146b119abb13903f8562e8f3e6a918f48223465bc93d5e7d5abe3d08503ec42998fe087a1f935d1b8673c495f005dfa7453daf977e1608a8c276da2a4cd0567e4af4d18cba05fdbedcde74493ccabd9060c27d35a02f35c760b12a4deae1359f649f273fa408626fb789c916434a642d528f41db868ff93b7f889f",
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 231,
+          "comment" : "short signature",
+          "msg" : "38343432",
+          "sig" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e7a1269086f0bbc0778ded8d7108ff4edcc2313425088117b2d5c53e9d9971950a5fe8b2b67d2bcd1be74f6b557a3f90650a96d7e4dbd63c05b94f73337eea682417c058d66ce523e4461065ac8ba990c4ecd04932",
+          "padding" : "3051300d0609608648016503040203050004406114f0b81fa48090bf41e600bbf301f49262bac5794aae087d8921eb23bf4de867fa9403b85e21cf6f59a14127ef0babdbc425d415f15c0ea18d2962839471cc",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallPublicKey"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/rsa_signature_3072_sha256_test.json b/third_party/wycheproof/testvectors/rsa_signature_3072_sha256_test.json
new file mode 100644
index 0000000..bbb9de6
--- /dev/null
+++ b/third_party/wycheproof/testvectors/rsa_signature_3072_sha256_test.json
@@ -0,0 +1,2119 @@
+{
+  "algorithm" : "RSASig",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "MissingNull" : "Some legacy implementation of RSA PKCS#1 signatures did omit the parameter field instead of using an ASN NULL. Some libraries still accept these legacy signatures. This test vector contains such a legacy signature",
+    "SmallPublicKey" : "The key for this test vector uses a small public key."
+  },
+  "numberOfTests" : 231,
+  "header" : [],
+  "testGroups" : [
+    {
+      "e" : "10001",
+      "keyAsn" : "3082018a0282018100c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b12030203010001",
+      "keyDer" : "308201a2300d06092a864886f70d01010105000382018f003082018a0282018100c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b12030203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAxv4jeSVmAjwmUofFrG9x\nVBwJlNEdBZ7mQDmG76IcJLUb2R2IYvnfeaTjKOPifIPfJgslqbQ0IK/8RLUejXUl\ntvKcNypAUQRzIAdSemLtgvrHP0iSqA4JaCpBpYzTRwF/O+fYATNPktkyGq/VO1G/\n+r/HUs/Mrgse4Dva/55CjMHBF/GslrT+I/jCPmOBGGpm/VkokzmuVcS82tv/hKva\npTIkDU4dKLLQSB2t07JGVXyo/hgJKBdzCznm7jeP/MhbGf/ckWqbmRprZtSpx7q1\n9eejciEBFC56QQjBXVc7FSieB+RurqB7QsKry6Mw6ZVUtGVhZbtMDbK2OToH7KV1\nxRqTxOFb2w90eQlEfj7+NMZ8qJVLUw5WogobbYTUXtG806pY7AbxhO5YV6qoGeHM\nqaJvTijWuXfTORbbmJbSUtGvp2Lih8sNOEzHW/5T9Oki0C3QpIHAQuLTBrSzwYk3\nHldbJeAAWhZM9p3Ql25NW+R2gG6mvmCE5xq09axcGxIDAgMBAAE=\n-----END PUBLIC KEY-----",
+      "keysize" : 3072,
+      "n" : "0c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b1203",
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "157ffb942b1363b5989ec4beb93fb0187ef016de4ce055620825d13c3dafd4fff621c71920e884ba28c5e98b328baac29ad4bfc4d2cae2f0ecb9d1b6c9fbdfc385aa565aaf6c5b3150e085e0316e21d7d440a873074e5d2700d961114ed420478647a4769d832691f7a004d934a89dc249c9343341902d5d0c3d1a623001265634216beacd5f756821f21c3b58111790657690918a2eafa9e85ab1ee44edd3d8bb89e892acf411ba9eaaeef88eca37dffbda72751c117364fd1b38c840d7b42318fcd011a4449aeffc2de32836d3a4f704d4c8ad4e078315d0d1758f098f2ea749ccce62aac592ac4041b5e733ba0431b88332a39a2af7f68f9bb1f469a793b280b964f285ce5cd1ff3adcd7dbd464a7c9414ed45791073f08415be2dd9f01dc2fec8c3a26fe97d9778e2b2fccf71a1ea5e9ce017d2d46778d7e37bb832ebd5825b3257a7852db5cb6c132bcf9ba3522a670b0e866585444ed3601fd32a922818ef6611626eee3ea99cfcfeeaa4c370567cc65e0479bd35e091b772d7445cade",
+          "padding" : "3031300d060960864801650304020105000420e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "631cb4bed6b79dcd3827879f6d64de3ae17e0fdb022be013e733bbfe0031cf204f0508ab87a2e2bbdfaa16cf24acc96b3fd2e72bc4a224428e515d6f1e0ea6927eba6ed7282a959e5df5e52eb3be9a39cfe139ea2fa45c21eb81b3197eff655b918f7c5fff6abab33945557a922063f9600a372ae7701db686f7e1fe4a6e804a0f624331fbb59536733bed3710dcacd22ec74b1a1386d045372853cac91130703ecafad7f6f42ec1aade5cb865339743c83e882f248b0db0855f487a6d3b55442f67773611a11813ff46a58c762b1bd70b5e870c3095507f23758e90b3c84526f47a825f0ae787acfd3ed349ca6786a2e84ec500c6042a9027a994c328c7a6868e6a81481b294383edda62773fd224af46e782ea3f00468515f6100486d94e818afca1bdb81851e62b3bf4f9236f061afafb3e399b93e6f6a295ae200c9bba5ff5aabcac8361c84f2e69aff8a8a21720b900d52ea4bddcfbaba3a231bb9b0dd48f0a4ef1cdd255b3524ca0633d04907ab672314c5e3173108313ff4a97df3772",
+          "padding" : "3031300d060960864801650304020105000420de47c9b27eb8d300dbb5f2c353e632c393262cf06340c4fa7f1b40c4cbd36f90",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "5819a699691c01a7f35f0bb1831a1cb65631ef693f7c9ef89f1e8460ee2ec312f6fd38fe382b3bf4db8f5d208146c32c5ed2d3b13105743767a73529bfddb5753c8cc13148d41db97f69ea1dee0ef1e1de990ff565f633bd3cfd315a7dafc70aa7f27d4f6486a2f1e2711e7919c5c73c518069338c0ac984d75f58b00fb0eee0f7da6c9c84d97955137417df8f20c02b7893b5cd929ba37f6b3278a1bd35748e14086c5f7100abf2edebeab5f767bb83d999a61cc27531bb67e44a92004fba9944b9c5f770bc66671d2efc74e01fbbd2885c5175a1fd72b91937c324b8d99d3592bfb73efb9641b87949266de441b61d180e141de510ae0cdefc2160df918c08c53799f050ca4eeb3a8b6b5ed35b8b59d3acd13a600a8a137eb1b8c1abbf55f3e99cf52d7092d1e3acc08583b04aa25a052668bc982abf060ffb17c1782daf76fbd69e7fc9510c5c6a68bd525719be5b81d0f2a8b961f1aeac7dc13aeeeef9986c7a47b34f8b96167d79f7ec458fef7345c1c31bba599d09b3fe33e738bc7da1",
+          "padding" : "3031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "636d31d8d5dfe0fc6ab01ef2ccd4602dfea62d386b002c429e7e846e7a98d0cb1d448d25be039d5158887ab46a9dd49c41537a89036a065fc10329df051e5f2e5c1d4436e84790ff6db4d3f31575e5f0fbdfcaee625722c5492fceaa3fb29d0a865200dec06e117b04753ca9450a7ca7f7d1a1176cc38ecab721864413a0d7a22d8fc1595b6cd0032fbf154fbbb31b56d3bf963761ce8ec9fb38bba3419716d0d39e976857e79b1faefd5f5a2ce0ebd94968da1ec3a387804694d90f37b34033c7f70ccfb26beffaafb7bf56c1b8385d489217458e0a68b5d680f9fa45382fd1c227ff3c11e3ec82426ec648a564f0e886e5b12e695dd2fc8465bd9d08731fb140084c79be64d915bcb4ba10f1edb4c37e35231753be2d9f339d37d7b5f22c91584a68a973f9cc469a23d3b5800157dbd72a8405fef4e444ff01f7fd23efa143c1887504e81773743843d8a73209a1deb66c5f305df539bc30e871332e82330e5b66fa6ea253b2b64b4c9781011d20e80ddd8cb83916834eb8fa696b0a4b6bcd",
+          "padding" : "3031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "08e0ae3dc0d16c927c423f12a87313afd1d66fbd5d09f48a4dd1a8b52102bbdd208284cdd692932869803a5c7f041a4492ac2e664bb6dd981c370e0c79ee3f7c5c6dd37018986fc2cc618139fe3eb85c0616f0673403c4afe7cbca49c1eff27bbf6d7e541b285ffff20b80bf61dcebcc4250068e25ef5a8e7c3306e49fcc2a1ee0f500a3ec603b472082f12ce4a6a12a6ac66cd4da8b6efac0796e9dcdc66c095a6282ae9a32ad274efe63f43e725410e6ed4c480828ed876b76b71b1cb8c142d0c7a51dc202af796d7bb55cf544dbde2f564f31994911ec7307015b0da2c51abe265a04a74b9afd0791a68e725cd7d8b473296c5d948157c10bc4682f74d843ce72e9ee8719a7a49d9de2f982c5d4490451eaed62c305eae3d0f9cb3493bff056a0dbca8579b7b41dc8deb1becfd5abb455634569d58c5b5535ff1356ccfaddd14e0f9f7f69a7ae9cb9f4c0c9f661fde349facd21f0021423d3a9ee5031855dd242f27009090ff0c15d1655317383231799b18c01fad231385aa5020990f41e",
+          "padding" : "3031300d0609608648016503040201050004202f77668a9dfbf8d5848b9eeb4a7145ca94c6ed9236e4a773f6dcafa5132b2f91",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "9858e2557c6b99fbd84bc7eac3e31283a4efb351ff019343760a1e282368938e29ad902d3eb6cb29b35a036dfbcc7e06d2f1d15548df59ced35326295375bacd7a9d28a01b4e8acfb676d80b6295e19c6b7a259df56456e1df72f6a746e9cd31fed9b79b35d7a30a7aa257e9e8ac60ea886042b9194e7a383d1c9f71c84511faf6c96f7ae0e690112b26bb60cf7bb10f684e4fbe2a3a1b1c0caa9b1bdc79fde23fb758c2ba57880a4de461ecd2bc696689438183e2b9724fa68258f461bb4405425620a4d95c87ddd83e04be381bc743b05d26ede2ceff8a858636baadf56ef1dab54080da0f516307c579833717def053c8906d4f102448ab22693e7f52d5850193a40ccf0d68d1303953771a73924e4bcddd8486e1477d96250bf6b480a5f4b822822183694c52a2edacb331564444f0335d3b17d511ece59889b6d961767a3192d7f081caf7e671addb3757451776d4bd3b03f7b689843dcd59019ae4f292dba54738a88b86cc6ce3b123c61a446f4878b627a7f3585d8ab7bca9b258f10b",
+          "padding" : "3031300d060960864801650304020105000420ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "1294490626bdb36a31c93fa7853d93152d920b022f1b473bde3083a99e11aeba8c03218fa07d6c4a5f8b2504d2cb54505c40130fef5a2412f7a5ddfec5e2c8b5058f7cbde7ace0ac01c7ba8a1bd897e8974d991ad2b95c2f03100a34ff408a788c70ab5ec73b5356a4e3c7beb44fcb9e2f3f25d1c974ed962b148167684351dc2a223a174c9744b092071d58dfd39c38364f47d292651e7806ad7962bbedb64739d7ea298f0254244790e3971c15b861c95f00f65532aa1c77fba5c04ad078525128e92ed2b4f1269ae744547e3efd4ebb63e9df844df152a098c47fa492bfe0f1917ec973867c7491f64c172cf3ea1bc3f97b42a397e6ad88d12e150d3dbe360071a3285d6a68ee6e736eb4d7d637c649c2f545259ecd430b25b38a1618d69a4602ca8a2a151066f12c3807f5dc7cbd06bf095711e4483cb0a89c26dd9e4b0b03e05beca349f601c894f9a245aca3204584a9bd844772dd87b83d481c8df18b615307eaf643cbe856488c160e077458e899755301749d2d27bc190d68a5da11",
+          "padding" : "3031300d0609608648016503040201050004209432c1a7d343fcfacb164bdc44ff71c1281c004886b1c428419088d06cd3561a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "Legacy:missing NULL",
+          "msg" : "313233343030",
+          "sig" : "8b889902d581f3be759dab7e53cf3419d5dcfc825d203c736a374f37ac5570da2b87239c938bd299691a46387fb47ca656bb9ab639f6736207e19680ad1a0c7a7818f2498ec98e4693c51bfe414fcecff4bae7afc6db0d72cb9dc447e2ce4ce9ff435b9daa98cb125d77b7c7d2fe2e39ba15122da11bf19d341b9878de33d3cc134bcb77b9963d19a3037a67458b17eec462eb0d7eb7ce69b71f41287d3b104b45757c76440f370dedb720a0c721c08c055c5b815650737fa478898246d36f7722e913c0913612e753908400bf6b456f269538102b778257af0c7c14339d0ae1ddcbaa357369a065c0b3627cade311a627e1e3179514cd3761463eab7f9485f6651793cdff282daba9b16c2f79adbd24ba54ce4890a9685ca78d73e8785d722825c9fd22ff327b97f38d5e0b95f449928114ee9756aef5213eb95cc40774fa1733fd02bf37cf5243e7ca76f88e7e3fa8d28a754b5adaedf31a91e6911688a6149ecb52eab8024e72e1bc3a98579d9eb242e08fc42bd491e3b0924b03fb95bd1d",
+          "padding" : "302f300b06096086480165030402010420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingNull"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "46da0267738cab66df530dbea6fbbebbe904ad3d6ea7e7a06e39a3b5f3e38bf5856624185080fc756941b226a52c8e6126d07714deb781f6f7944f47147c680aeb0dce310c7d6f429429ac73e562510678c23042b635116174a2c2f4e8e8becfee1e4ba3cfbf4e2ee541c7f7c27b1916a2aa165cdeeaafb9f81c84e9754d196c3a9bdc777fc55d86b6bbd16270bc4d3cc75c2960f2a7a661105184b436a31de2cefad722a14abc1cd2f2c75738b2c81580fecff78d7d385b20d1a03d4aa2c21a168e13da18fd628e34be16d821b48136b6dcf7594ab3e1243c0a2a9e785fe40436cc6fc460879b673b068cd35a9114b59c2dc61fb875310e103610b74aa5e3620c51a257dcc3b9b0adbe774426ede0f779ea9d370f18a19d8844ed9f5d90ebfc4e0607a467645711da2b500840d4851e3de63723283bda8d08acc51a012699df0e8f5aabe269206f93ba4ca6597e17cdc01d2ead46b5dd2433b82237da01518ee3168b133b6a42e9a73194fcf9162b71d08528254c34b20d692e141c657c969d",
+          "padding" : "308131300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "39c1fd7fd0bc4578c3370787ea5a133e8a34ec9702dc1456c1ca7f8c3cda7bdcb8beed72e4098de5ab3e467f325141a324ff55af1390ff6f3d0cdf680f4319378f099604c9044025e04ed1af1ba5c74805265d8963684c7555cb835e8b1bfc162812698679e47b96744809002c805b75bcc5233f378fdfdf3e56593bfd6b0228f416f58b4c32ec0c2d32fe113cf7f3c347425b69e8bda1a2c5bbc3cfd0c1bbc609086d91175fab0adf050a8b3e904fc4a700d747500433fb72c55cdc25bd283d1bfa1db93604f18b8960127e9b7080227235e6ce234880de8e3c49d5edfa205140b8ea383e546e0bbd4c5dc59d0c058670ed91a02a3bee241ccceac20d434a442bf35ec6d5922196d78b080b1c14aca63b827434679d7b6e666db10dd9a85b2da60c6b47fc97979974f11b6051fe9378d96c78328ccf4e5cf5c120c2641b3f6b7abdfd0832fbcf59fd3787100032ae65aef2b076631788e7be1019feed9b863f39759525be659f3ec50dd7e9724bf6d09d8b771bc60e8a8e788ced8d945c89ab",
+          "padding" : "303230810d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "c0fc6e5e9e1398d0cf6575806d6ce8c10f63d414d3ffb7d9945b986362d9da16d61e9e662ce133ad6672964adb4bac861abc4693286f826e4e77cfd72825a4d6dd03c8befc8a9712c12b0a4c2e0f3128878bd9fea55b629abf7029cb7e9cc381fe6b0eebfc05e8a8666c661641fd247ffb6e3c25bf435283a21b2b785b9d4b0b552ab3538e310bae7f36af1d2c6697df7821bd469a10dc53f007c7a240910f9f137c6d59060390c41a32edaa8f49a5b28484f0f69d2f8ac99bc04ef06d7d8cc6e850376c9e66875d00282805df54398bbc5bd8e8216943f845c89e59fd6bbd6a8e2cdbf148c656982440bf2ae364becac976cd8e40a6159b366d8d0522617f422531bfb83ac8bbac33f6b5c8c75bfc107fdd17d3cc4d54c66cf5bfca36cb1e3ccf4383080f18883b890af744b05279111095d6aa0238a86a6f3433185c3ef37203c9bf46ef7bbf3cdad39072e970a1e6dad6983e8bafa6e50a10a6ab7a316a6104e1361bab2837d51735fec2b81cc79ae415051bef115231f6e526201d0cc6ed",
+          "padding" : "3032300e06810960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "33e76286146ec82e95494f798a413f2569722f1dfdbba39e7daca5d654fd9bed5b25272fd3083d493ccb228b9429f672f5f6aecaccc3b6b66e6cfe2748c55c772c7becd12844369fa7283a95aaefc7b7e6b444ef9ea0151655bbd358ba6a42a4b2b9f9c8ee8dd805724bd8fa4d29e322d56e997ee1dced90e10b80a4e2d007985214be77a1807935b75a2df81b9c87b177515bce12722b1ed2ba8295df7342a707fc02f4ac1b17b9413a1f61015c4ba998ae75fda119f20aac84e921bc5d2232f7bc9c6eb29d8de3c57f4bd62cf73fc20fb6759db4f9c47988155bf73d4102bd78b09cb88905dd0be0b8e613f076cab8cf89711670a1ccac6c1b9fd775b05ea6bbe25ff038bda5fe828b561d7be73d68d881fa7b2c3c3cc513da9e19105cc99a02fb3791becf89e7419d2f430713de41ba3c439e6fbd4531aa0949e1fe8f3e910183e75b706083ad11cf3aca16bcf8dfc606ce28c2466dcc111312f3578bd41af4e190436f5c382cc14728c7b7e3f836662acbf7286e621dc5e121d5f5bf8af7",
+          "padding" : "3032300e06096086480165030402010581000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "0679679d5be320641d3f545816d0b04741dcecbe8a6c0d1af3ed2faf80449ed184edc4d1b58c54173a5b26f27ce50d8e6562d9dfa425cd732fc08f47eab900060dfa975b2b4a7b30403557950cbbad3414e61cd7fc004ab1ad7658840d9eb5d001d82fa8ab862ccac8eb2a96fea79fb58cdb05a0e8d601e95fdaaed3c4362d1d6a4e8a396668f9a5d119ca32e4a1c926563231e39bb8d3966f2d986d8ecec22f361c7430636bba2031c60a8eab06ae56d3c491a301a3a5be0e0e0a1daca0f0c90945c2b81d0c873e4eae4b1790c61720f0f7df2d56b9c3a21216d604ce550c547e75bc59c401ef1ea588aaf43b7a17bccbceaa47cc62090df5a7d5a0e908c25d589d54be59b2800a5f6ad29599a01a51b82426528f311824e801babe52f2ca2fb058006f61c7e50b621fd44d4d0fe5e4cf92b48afbf6c37254b82100685c6f57b0ff32ad9a17240788366586a5c3a9458bb5169026cde4f703373c7895b3c86173ea9f24ac89e7a218bea90c1092aebf4cfe7387fcd61fd1f13f3230193a009d",
+          "padding" : "3032300d06096086480165030402010500048120bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "530bfb86fd2a4b31587767d5809e5ec2002cbdd9121e135391392c242354844a9b4c8993ae61bd85810a0ed240203cc4be48ded5997832570875a7b775206460067b30df7c3b7f7af9d98e436f0007ce0d6360de0c1a4e75912b885d1154ebc25df90465ecb5f07a6cc477e44d3579f3a629bb49b7a19a619f44e6b630b684f3ac4daee5eb386dea0386593be825a696656e130ec0e4a4bd5411c45ade6ddb4a6284f343b0a746bbaeaf03cef31120f19f2845dd9a7fb818406b0cba91598ece880836e0b17e6f375b8941381d0b301d0ed1bf746c992649b40899d2ed2b39d488981970cea6da2453b5fc85f23c8d671a3c7544f4a7133fb500f5448da44d4c405bb70e85aa3aa399204148c01d1a79de3f784dc5a9141dcb41872461e62deca48dc567b984ee80097a099290e413e575411faa54f7f3387cd7759f71b8013ddcf9ff2079503ef802c54fb731e3131316c93182dead523f41551bdd3a96a4261bf6c3dc72a952ed4b7cc95d116741c653494b5ba8ed9aa565ee57ad22a4dc83",
+          "padding" : "30820031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "94e0075930de07ea37f0eca5023be15c472a674513654d837befcf17765225c73d17e93ac4c69d855027747c7ab81c6bfb3080ccd5b6dbdd41e2ea4871fe30131bf2dbc143ddad0292dd4156c60cfe5172fd9703729daf99b2067334af23a2aaffd0f74d574955c406ef8ccb1796189c140d1a45701c993737b9de11e44112c4df9a5b2c7ac827c9329c5f63f4bd740f3f1baf69a8fb6b69ddf500272beccfc2f24902c592b91de99783242fbe9767f3809b38368f04b02d973c761fd999b0c69eab43a2187d6de4fe5455e070e20bec5bcb8ffa5e439b04e3883804a5dbeeae652260a405ef5e2e6b9b7bf7e8018065a900cd831b05674a093650644c42341c3f5429d59fa3aa93737a6b525a80e0748518cfe19e6a4de792d3bf842e2a864f04da31a8ecd0b191ea656f1c2987a1973ba1b10e16b09524a3cd07c96814b395b29ae1a434e76bde8e0b6e4e29ea3c6871ca447fddf077f53a4c2c3499c7e96dc6de112cf28ba83d8d274ec03fcd1d570b74e22ddddece554b7645380a2a7483",
+          "padding" : "30333082000d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "92f154acb89d20388e78100191d964c992a2360f2d205a5f008091439f454f865d3d5ae276adfe4b552afae3859a71acaf151eb04696b6222a07e1274d6ac314a60090bc928164596e2de56e77e2cee607080a293b71cc8403bb2466519f0f14d26009ae7f09fd9a41447cf8d26fccf9a564cf3849be92d9e4bd2b3d7095087d43e462873ba0534ae512fa8edb2884d9e1613a1ad3522ad9d449f78cdb8331c35502851e8354829a78c56df4fc9ebebbc7bbc468f2219e93e4c524b3b8a55d7c997bf3151848ce10bfefa6f21207f2ccb2fe9526a0bfc417c239a8362282af93124a0ed209534dd540bdc8a1a08613587a1d62baf3530ba0297aebe6e03c2889942658d50f80f33c6ba0d021f9703933b2ba4a24665bb23103f0498e68a0f5094a9b9a7ac146bcd5842039dfe55191f06a70f103bed094f7adc3c3f3b4a12f2cd76db1e9ca7ad3c9d8ff41811da6adf3a9450cab6170e74270755021fa6f4dbe3b1226de09a334ee82617ab44ce93c6420168f6a75224456910b907ec2de68bc",
+          "padding" : "3033300f0682000960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "2f2fe9ae01a02e6d91f4fd785c4cebe581cb323898e110062c1808801f822cb2e255f9b2bcaf2691e931df9e15c7f876082e569b3448cdb88f44b2a1e0665fce0ddf27c84ce4d9586da28d401e76a54e9e65f7270b0c34e64a7eaf720bfaceb063f984359f38816876d3253770512c5beb06326a62c86b7f05f394b28d09d389cef7644f03acefbbace66c7b1e3de93d39d831b2d27d3998190063adad46335dee71194793739780678056d7a7dce03e2352cb9b22fdd4922cedd5430a3f56d96f9b2cf22669bccb70aea9108fb81d7266d838bafdf7b707da06eaca841996abbc3637a9c246ea52776455b80fad6810eb01916242b3069d333e541b78778bb0e92faa4fbe4ef7feaffce181be52eeb5b6807610f060a93ed663028bea60de1de63b6f69a106d61a93929b6da73f41de02c58572083dacd98e0b11f57c16bc5f0e3ba1a95faebac48c42912a791488fd96322e52bd022d686582eb88fe85a48348bed36d95947f39fcb17ed2512974804c467c9a4ee5e3fe586bc54a22d65c85",
+          "padding" : "3033300f0609608648016503040201058200000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "5af6ce6cd7d8cba3c9be3478cb3ffb94b16c6e6880a2667790cfb8818ac081edd53d49cae910f9e3461b18087504525fe0a97f8d6536829eeb16b0311bc0a07b8ffb061b8d749894b0ac1628a9d8bbe62f69fd1b19222483980145ef76be38f6b497fc1749387f99da7fb5cd0ab7e1a6a186a199ca9f86902c08fb495b5458198bbfa57637cf86fb4b12f7b8e59e0af3336e2fbb2f82cf36193a7c06601b010387e86ef6eeaa5aaf7be0a1b9bcb4a23cfff0fec5f3ab645cf9ae47569cd15b55811fb65be2fb83f4c2f376419fbc6d8a2e4c7901a97c660a05cc9beb925a7dacd91bc97eaab1a13f3728187779635c6b9f706e59a1589ca2974fd1195cc07528a024aa07624aec1b0fa39851e77fa67d36cc11552f4c3c91dad62aba44b989baa54a4dab606559b637b6fae9eab10af9ab5aa156b2bbb169a3a8df4bf546aebcbfb87b620e3aa4530e29b9a4a2e18d859db2c6ac8378ea9b36c3c83d292dd6db85a3e7a5f2580d2615027db3731d80c43c917c2771667f2f8fc2a105223fdcbb",
+          "padding" : "3033300d0609608648016503040201050004820020bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3e65342b3d9322ee9b0473f54f0c3be5a17f56f2cfa5a8168bcf3001ca1256be867d3a575b07c3d7d020037590aa10d75dd764a1d57a123976116286ced29b68e3b625c3ce0c235a629e27e4f8011afe4b383117a8bfc927a7718bd81ec4a156ef6ec5cb206c2f23941b595ab3e8e4a3eed825c8e2af444cc7b0ae0e303c8f109cc149fed6e8a2679c55a2f483dc64642170d0f62f0f20a5387a80c5ee3e72d275a8c3e18c65de6f9af8a7ce886b83d84cd0270bddbca64db5d6de42619ab0f37ec18594a09a80c0183d44dd3ec6b46ca4846daab73effe1d5e2d8ce302db26708ae9223369ba5c488bd11ad27751abbf994e2bd18cc999dfff0f65e8c6d6d04e229252a5d6704483458d7d094dfdc96cd5a7b0573a2e0b50fc14a8d291fc856e63d82343534b75b25298c6ab7af401ce1215cebedf87635ec80d0cc228831d26c40efa5997105fe4b3786d0a44c17be443a67181d35a5ee56da18b7e97db573879686a406c3bf340851d12d8ed57c0530433d655aea85eb3211bb7f128c91c0",
+          "padding" : "3032300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "a7ecbb2fac0916fc1bc793f4503d496cf2683d1529632eaeeee4fc89bb8174e7797a8d78faa95a52da0c4c887585d61c680fc4d1224e02d3a0dd2b33031120a14be8ad16e267656c683c179d261f6aa6089a14122168748a4bfccb59ecb086c0b7edd342bc61d2a9a2f5aab2f4558d458971ca04672e513d3db5784db83fdb93816bf8f1b443470973d96ed20a7d85adf93bcb497ae07022db0f939028b9387a1d448b3fab2408c2754478621640cae0ee6af76fb6e653e4d418e83d431f7967e435b748e8c7a26384addf77115e0dbbf7cb5be6ec0d11b183edd6def81d0554a2e7fffe692e3cdaa6c138cd73bff960f047c0226ff0ce1abf9d16ecca4c3b998ae8ab1fd1e35f80b04979ecf0338497d1df5cea3108bdcb1d0bbb6636ae234cd81e6f2df123d263ae38924783a2a11c85b7605808e84433dfd72d9ae5b9d82fc6a8cf385b0994d32afabf3ba62e8578ffac2073d81d69c808a2c9f46b1115ce7f26885d1be3052ca23e2cfd05e92469795bbb274c4cca1b992612d0610c27f0",
+          "padding" : "3030300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "7c2c6b135814accef0caafe8a22b8cbdb832a30c997edfd33e01a9578e309988322f08c64704080dbec0469274fcbfb131b4388cc1181ae2004a63cfec1080087dbd3b9e7409fc0f960ca721d456755f1bce99bc91ba36c65e747e4cb693ec4253f0ca37d8b9d64d5f7d0526ab809a4f476e6537263adc00f20d4261d78e5b6f22896706c665e885d5283716dd959400d2a7cb35974a3a3adb1a4bf3bf36e9773ca539787c0f6a05d17b75837452e247f065803513eb8c6c995e989a52a5d48bec77930a91cdfc1f373c58b344cb1700b7707a1801a758246267c8ce932035f8a93241f57e9ea8c4d2dab3ff4c5fe06caf37e5c996e60e7bcc4f3a6176a69e61df24f8cc080b7489bfd8395d30b6a4cde92ede49a26a0a03c766cef25ca6bf982fc3126ed7b1b1b2bf4a7ad9ddbe1a3a456a6720953460cebe6e1bd5c333b9ab2812f9b47452b2759436137424832753d8a97fd456603c5585620342fa1dd056be6247297d5758529c152d24fa2644e613244dbb66815278385be78cfa4224b5",
+          "padding" : "3031300e060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "27b9f6f0a34cfa0a71fe15c15c910b7c8f2096225213e7021649aa3689ccccd5e2041578ab5be9d110a05456fdc516c5675561dc82a23fca94cd66df6dbd4b0805ab85b57734f5dd2d6efcb1a0bd8c3da6f8ae7a68f54e015a324212b916a0eae4095975f76f509ea383edc4fd888217abb893693f821f4a3c72dff39dfb0fa7abace8c16151d01bb81be374122f0e479748df2c82ec87b443325ba908bd00b2cab985e64c7f6a1edc62787c64b84410d93ffaf6d9a33bf3164e4348d7e1afeb6cc7d3e8a51d723ba6ff27ff5ef1358001ffb8eaf651cf48ca5534bf5d86650e73b540226fc2a2c1a7c52e6003d89a108a65e1c9df183b47d1753ea697f05e77b3a13cbeba8daf25683a6bd423b2b7acefa66eb5e6d08ac1984007aedb7df5d4fa1da1aa3c6ea5f383571aebfa42ae1d42060d996cd9dcbcbfa605f002dd7ae653e7c295eb3c3d03c9f6c479068456a8b0087f0c61492ff7c125e3bffe30cc45a136d72c75b047b246dba18ebb41f3fb9ad0216a09d888885b4402200291e6f1",
+          "padding" : "3031300c060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "9094c58ae7096b725fc29065eb17648925b972e5fd176a546cdf03b50d3df72e84650e99960c783c54558a44166cc67b0e6a9c8cbb0095b984440995e17e6e7b5c3f561f3a8a0fac06b973076c16c31e11cde1ed0716c41074afbd94695953a7d075acfa529f89e98f406ad028dd48602884b7f1c04d60a2317ce10a4c3574800f05b83eb8f170ee6c6d084fc68d2db32d0a430184719dd0c0141798fe608ba150f5336079c4a712d62a2f58a88d6f6bf334bac46d1be0e6341695995aff0b05e152a4d75898d713cb2cc6a01ba4df3e4b45914a2fe7f2380f94b71facdc6c50b1c61485e3acfabb986cff365df2436e50c44afb7711a53655b250c3336bcc12c251e1f0e7788c71c5f80dd02fe4cc03b1103691b45820038cc094553f8fb2a5b829a230eae9a97ef4b6c7850fb7e1bc99852dd0b7027fe8ffc5e2c1a50bf5b4e42c249e55c7955ffa4f4336a60ce0d8423f349abe3434e3eb9f3425661e0686fec79ac14e435c1f6c3df4982c7392ddb8ed77f3f65a5c9210ab81e40ef3eb76",
+          "padding" : "3031300d060a60864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "59e8c182b8d7c58cba812204a8132fa02af9bb2af8ea16dc10907a14ea29a224a80e0eb6c1e12e16a3144bf01b539133f53a4c2007f15787cf61560c6bf8fb6eaee9ae65b924c5f852f622d8e9bd0b67a46dc8fcf551d577a916c9a0af9ddb50c05dd27e716c4c9e75f3ddc3585cf739986de48d9add7d39bb113234459637f159e7b95245e59546aba7f07f4a40a1d6ca1c6d1cd946e8a2afda98cf663e0ff6e9bf1a05fcb0c46486976e2d9a2a35e43f4b79dba5087fa4af8ca4cff44340b3a60d153b5dd3c9bed8b5dfc684454adada547c1f428dcbb70566b86ad87310aaddd9e935dc5a6c68456b3c2ff98d3484e471e586271c06259cb754cedbd0913981bd5afb5e49dac1e8cd86cc8bb53863f87d11e6feaf489670ba07ffd133ea14a7c60f9263f986b1d13e1e67eb0a72f67db108852f97e424d455633336f3c4388898efcfe500bd45cccadd505c481b5c89729bd1451bd790bad68d2572ff09f8c19bcba18a1b6c9ff260562d1f1ac35373449da2467082b288a4edb76c475795",
+          "padding" : "3031300d060860864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "4c7d25a7c86329b2dee76f6972d27481bd4eadfe1c901371d27406bcdda5c447d35b5b4cde6eff94fd5bf2e83ef8f1bab37bbf04307dad6d38b96a2ff6464970673b0c05c04c1c07e0e28d1fa228510d9b2bc9f5b4461330e348ff61a1eb533df887c6b3719c85d3ed4d75f36b85ee8540048600f4b4b70fef885e90c4e3c8d924cc0a53c44047cba805d15bf88366a50d8b60d5dfaae09e20e5efb186ed49f005011bdaaecfd97074a8cbcf87e3c810d9e698eb2a6f8b77e3868377af16ce42496a8f19b9ef8809dc35364d35d614f1309a3765e3da35b06ebefd522b688b86337a9f578e69a2640cea2ebb5634665ed7fcc7faf124ae7ac70c298e0b3493abd22ecddfe23e595355d5deb305ca5040246bc3aa450faa3a5bb2cd2eafa2433e4a40d1d602422c8d41f02d5a3a7d4908190e065fa5b18f0160298a52d7eaa828440bec7eb234b2c506172e46068823f6084058e511a8fb59fb722577005552346c04f85c841487285b6b2a469e68a374005d8404aaedb57d3c962c186ee7c27a",
+          "padding" : "3031300d060960864801650304020105010420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "369197d34d2131d501babcfb49f789ef8ead12e732279f06d99e87336d840294a40ba22f7f303a4dd2738744e22779ef753ae9eb7bb996c1a10f5e70702d4688334319ed10f9d5159db9f4f58b3a7ad43ec531cfa9238e3e68b63551f4809f6619bded70a38d70b7fe62e892172d1994be13dde2b2c4ac86fe2ef5897412cd665ebb9e26d7d450b05bffa1d201c460fe38ec76b80c7a3671be4847535226ac9b8d8cbd3ff0df537eadde670444cc61c88724178cb4513df04e10c5f0e5ae6d123bf8f966d7cf777eb4140a3d10146ee687d460414f6c883184292a9e3bf052526433d9053957818188a2ee0a6ed8a0f2a4db321123a367d2424960ac462bcf109f65861cb62451066b7aefb5283a6ae50bef219d151d9f23df8f66fc0a8128219770fbaad551b4c7b02c6b3e20380f1e65182c2db933fc5152da8f22b3372dd97f454230b3fabe4edda79562147df5403824d6f44ba5ba00f8649db460fdd29c9b67d32b0d88d56af66f06272a401bf872ec639d5c79acbc020e930095d52f4c",
+          "padding" : "3031300d060960864801650304020105000421bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "935c94aff85633cf56d8e3dc3f58edf03cc95c14e721d2f311f944999b8b5c413f37a5ab1f3ef809683a436d3efe95a679828b8bf6f2d40b17b553cbfa7f32d3d9cbb6a99f8f41efa09a4bd2d17111277be2121c2d85da600bc7ea8f26572bd70d9b66c02a89748f0d8e14520c0696b7f0d18521a632dc9620c19d411278b6a13eaeab0aa84275aea8f548a8ca25b8d59775e61ea2cd4eacaab836337cd3656629c6d896ed289a14c109a4019b8897c9b6996ff7b20a2a1db2a58ce5728a49806d2630b8b64d985be2c2ef14c8b791269bc387355f646ddc19db25cf64d2b2b6eba30bb007959cfed2cac0292dbd207126adc90b8758a65094068fdbec21ff2db53aaf969692e7d0ae22ac850f853b2892290ba6f198aa6754e713f549172d154220fcd6996deefdbb14c9329b015448060aa0152a08b4d1a5e32d6fc5bb60a411ba8b206fecbedafa9883a3bd5d9fa905119656563df1d2d08c24cca881a6ab2222440b64bc12a859a9d20c7f9ea02322c436003c55723cf8678dbc8303f97c",
+          "padding" : "3031300d06096086480165030402010500041fbb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "39c7a8c06ac4835655fa719be214556e0adc5a00ab466d88d33e694c30882e7c41d7fdefde724fb8255a44ec4bdbbd03d1ed528b4ea980bde20717349c0f2eb78141ed6f4490173e62cb2c48b76357c7816d1b0eb5f85391143d04cf6a100ed6917c46ec661a35860b3210ebf71bd7e6b8e4b8909914226ebe925c99a7a5a66f1d02c876f25d80ad4482899193d9a444a8a1d0ad8d5afa912b53995dc36ea89599f4f181241a6f4fbe698de8c7c794a82f1f576c255e701751d3815f5b6fe93efe9a678d2422ec9a4a5d090beef2e552db07a4d146f90bb4cdf1ea6fb844ffa1948542bdaaece102fa3359d2bd23c6447ddd64dfd7e4c94c801c2b6ae17b07b07a4dc79bd69ce5ec46aca637845a0185a372feb8adb7d60996133b9c37c32a9ad869ff5534f39aad8701e3487e1e6c8fb9ddaf71a1c34374a09ffb85fe44790ddea79439bae8eb51ce12e5abed6af335ad1ddbda07a8507b6df0d0f3ce80dec487968d29d92a139eb1d5ede5c28240320c5ad9cd0edefb69fd156f0626f6d45d",
+          "padding" : "30850100000031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "4c8a79462d5c62f418c83b35e67899db78b04883afddd506855ba23e7ef8c5336c1492faeaf1d57444d1049bd008c317fe7249d5decc09fb4f39d7858edd097c3949c53bca1a439674a61b355ff5a9388a60b7d5c7255961af7079e72c07fade552d0b77c36ea3d2f0c7c9985b8ce478df8658de208dbf4690299db7f1d32660585b918af94bbedbbde7ae9444972abcca2f6b3c4004e3c87940793f1a625d932ba14e715dc1b5f9231e0f34956b2920eaced888b3a320ec8376b059fd48ff369beb1ebfd32b9e9c9623d28b54856919b3af12239df425a055cf43e448541af94b88a223a90580977a72782b831ba0a88877cad65f8fb49c68d5e3b2f6224637e61f4b356fda8b8ab916cc31b18e6f92d33e0e27971a480491fde857715cc55388b281e7d313ebb0abe3337f7d4544ef9d144e402f49c2b71eed30f8ffe8e600c31de5960947bb07fcc4e15ac0d7bf00bee0920c9f092c8bed16ad9ab7d752433a96dbe49ac2cf33445257a51dd347dd77dd5ae0d08b223c457db3b57d727f52",
+          "padding" : "30363085010000000d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "b7f073c6413f4f710af62ab1b9f023215fa39db9f47e3156df5d0dffbfe4afe1aa9dd72dd7c681b3ec542ef926bedf01608bf7bf0874fc68fd90d12e0b26b2a049ed75968b77c8a24c626a5c706fedd36336c58b8158a9f1fda4bc3f6e01f2fc19544378756c48a3283e4c8c3dcedac07b71b6610e3a10aa19996efd006b970ce00afd9256fafac4e831cf598ed29d27e6d3238b7e799e1d0d96bf78cc9f50584d6702661ca93a887010d16c711ff138f8b07dc2c4616c5204344f402067527e2eddc0fa70a48fe929e6a195e27159b35121612eb116ce2bac85e9230895044755a4c56f83b45fb3ad795728579719a68bb739bad1e3b1f0f79985a65c43758b29497f99785dfbf985cc6524d9a97739fedff3b1d6af5a7c23957807a5cc2de62110b59a0a5e47aaf33247644beeeda8b1a4bf2ec3c1260701b4c1c052276eae49994b6f8b2f8008cd5e637a9025d364ebb27c908b7f7d803dde6591a543524aac3ea330445b9e7a3090ac3c9c63c964ed6e1e6698d5481704a495f8e9ffb1a8",
+          "padding" : "303630120685010000000960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "4ef8d630c4ba8a424ae7dbc197dc7cab463ff00f93fb6db064d9987f224f2a589fdbc40e7d3c9043f1cbaafb47475cc9dcffd85a41a0b50614a206c5720d1151229d1d988dd6b8f56cc538b8cf0d55d1dc7003f51b87dffc178b3a63160b759c88e829afa2dfcda4b4cdc9e228a7a81f301e2edbb10da5bbd8ae9dc93ae8eb98d47e760012d990ef53ffbfbddcb8a7633b3cdd8695a75ca6b196f9e2709ae9b30b4f7b606eaba508bfe8f46de14dee5c0d663d01718ddd053dbe204475d5c1dac048f6d628019c8b4126003e4364e90121aa0d9472149590537e35858e9bcecadb9a1f2504ec78ea8d09772c992a7a12e31a8850510ca726ea3c1231f778b51d8818b8694be37f4656bd6f3896f6c19f5e9aef74f55d6b44071bdf1ed9dbe9b26e0b124f28db5d32dc877fbdc63d1b51f62997b83877e46785051df7cf4230c82b1007251cd4f3ccdf204103f99b27c5cd48b3ed529702d89e78cdca05cf52d0d99b99c9e9f479c537a578e47194c9912e7df890f15ec671f7ebb6d304d3e834",
+          "padding" : "303630120609608648016503040201058501000000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "71601b43bc8ce6f6ea74985843de5a2c9f71ffa37bde9aac20c59abb025b0dbec4cd8d3623b515f0d098803cfa01564a2d319c93d3acbb5e3603f53e019ce2cd2975905f9faed64ea4756254bd064985e5245d051ba7756d4b1eedf928f9552e9854b0626639702d3ec0c40c2346af7572e86c128d1aea0ca218e63c3bdeccf290ea995bc2a0bc7eb1229395ebc6b9f8f9b14f3d5c1191bb6738ca1d250965cc80c73b3fbcef29d08767038c5c9ab006b100bbfac35e15f35698f6f8c6a1ff3c9039bf4ac984e2429540818632bd02015552e9757f363e8317fcf8998a55154f6161b67e00910cbc736daf7fe738443a3ace0763fd6505cfcaf11368dbe5d585206ca41d76e39feb68519d309dd92a54dfec5791311f5c00bd0bdc7fc5f2f47d558f51a5f3cc2c86c33958d118dfeefb8b531fd4142892e28ccbb2c574b6c115169981af4c3ce6e019fa27c2efe4aa34c0ef104e16c7f02a3b7bd46390039c7d4ccc6b27deb5f6796714d67af88456a8da6395e670b513f45b62ba0aac65579f",
+          "padding" : "3036300d0609608648016503040201050004850100000020bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "93391857ce1fae6df31b1ad972189803a1fc3ae91b89a264ff86246d6efbdc599003bb7c35814a4215dfdd3932834d4064b497f464fa93054363f1fa5e365825d1b87881e125a50deaf22d75aae32fc0fe1e8f3115f7cab6af0c2aca54d6f21f5a72fa77a0731c9f8ea82ac2e31155fe56a7950f61fc1b22c274203ea91b28a4bba0a925ecaaa017b9258e1d0f492c24336334e328054a12df916e1e4108d0b7e5d8b2bdb3d4a10282cc1653b9df2a24a7ecbd753cc7677c88c2acb7f741e3d56d670c226a827fd6b19aefa445bd277eed60dd13619427a048616dd26770ce76a3031bf5856b50f0ceacc7bbef257d86f6e9fae62aa6af550c9d526a6076d1de77a9097acc15728cbab9fedd1428c33a89e07c0a49dc89822558da1da6db6f8f738ae309fec8f033ceda8773ed3eb5bf6203fed189c3b7a774cc5f44073dd0db9e4a614bf7c8005d5c6e022fda36b82dcfe66f4679eea23269ff39213851798e63e42c1ec5be20b3cb5e20787597b43248d4fadd1c10cc94d066639736b7781e",
+          "padding" : "3089010000000000000031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "1d9a1575ce2cd06e5f160063d03199cac5e912cea51439f738d98ede05aaf7b821d8b26082ecaf4d12fd01d0f64be9ea2e1831388cdb5e7c7564b73146de8f9b5314ad6738d98e1053ad0d7d594425043ece575c75128888d0d7b090ba5d5e008be46abadbea23c9b7741a023151ef281d99fdfd684408992a8aa9f2c85376a40e53d9d223ef4ced563fca832ef03bef29a47bf381eb6728830ba37c69a99568494efc85370e8e9c3fcaace1a59d6c98afd03a0e8bd5da2f5c909df5710e385ceac35ab0fab92a6cd918ca8d32cd5d4bfee5dd644e0adb3d188a5d0e7a20a305bda34ec10bb65c922a0c074e8427cec78a590c095a0c670cea6d34bc7a88b2f1f06b00b368b8009cbfe6a14b18bdf2b01caab7041d46e6b76fbb1f63e9b309f60fdb4f1a6033a11dd7dc1eb15d7faf922b3fdde28796c44e226633813a969ae1fc54388525d0a125414060862718bd0ee1337de2133fc773d06bf83987a22e4d2e883765e3affe55ff8d92771da79ea0898258f0d7e858fa3937ff24f122669d",
+          "padding" : "303a308901000000000000000d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "43bcfef9e1c31f739cf7273b1a83fc38c319d4ef394b28147e99566d60d58459482054f2b8ec88db88fa4033132c03eda101406873c76703be2bf0d0703083e9420a917233fc1baf2ccfb8b725efc7d302b474195d54d4d3c7cbcc0573c5fa0f2b07a6ecede1b445ee59d8fe101e8b0b97f9b521963b0933efe4d10bcad18219bd2d33bd2dbc81431bc6a3ae6a827c7be7d3b0a1d1718225670cf25a405ba12e9c7550612a866efc6edf994c155f24f069574d3f73bd09c74eb44326af7846f22687b84b8caf54b4052364f107ce5295bafb2d91ce6f4efd667e6ca40db672385163d1b7a27ad1d57723dbbf00571cfe56a1ee02d6b6503da2ef3f78003d3fc07f778926f16ebcb05762fb72fa50b75f78c2d97f174bae392065db2699b00ea80649ffa470ca92e57631db263aefa225bc1bdaf14093ea1323071f7fd614b475f5fd6ca0ab5df4f03624fafbf5cb3a49a92651d9a6aad2e405a7f76d9eb76644dc6b77d5f3846942ae662fd5a11707feb5dc67912c1285913ae2f54527ef39ff",
+          "padding" : "303a3016068901000000000000000960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "8c1a2b91e9d9fbe87865fc4e6b478290d1e4b189866912508402aa311b953f7d4340fdcafe8f78d76c4a3d6fdd7a387fb38cc507ba6bf383743c8f6aa404d97007d60911622a8b96971cb3956a1be3f3c5e49501048cff335130c9184b78e3913d47ba8a69ce8b457910c69369a1b4ee05ccbb0bb17070efdccb94ea8ffa4f683356b1656485f73b19f7b6d1669b55bc28bbc37b7b0eaf88cacc8c019aad99778c032858ce1da532ce2b039294c8ed0660d20b6bf2019bb864e43623d600b83a1fe09ec5d7a6c434ff42fb3f2c08eda52c1ea033dd757db02159188f1b6383f93e1ccddc027bcaf77ed85303fa86644b2164bf99ebb394e0d25298b28e98da79303621d0b188bb2dc65aa19cd14ddbe0edc1b288fb46daac7db10d49bbafe28acb9e1188331978562fba048badc2f72b942d54c23cddb895250dd590df62f4cd184df7ed6ee88ee82b01eceadc939d822c176cd16f21b9cee6efe6cc4cd7b3b62fcefc83cf4a546c69a81668622e51a11a5b728b7689f4e16692e5d2c7e5b70d",
+          "padding" : "303a3016060960864801650304020105890100000000000000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "241332a0e34ec700cdf2297c8994ee0cfb848e6f5d6f31216524bd3d40b1539ee5d4955d405497fbf19f9b3681306408a4ef5eba87e75799dae8e86ab050b7e78ebbe9a2be1e02f9cec519a51e7880a7f653a8327275bf9a2a298678493df013d3c3a191372f5f84aeed7abf72697ade3e02d521655d2d79003932b92e26ec22a9260606954ed32c536015a8d5306de8354fec6d51b48a0f258e5742eeff0d2c76b86bdec0b42a6606ae043e86b2de8f4242be7ef65b9ce60fe4f798a8aa19f947aea9ef40fb4a467d7c5413d526aa9491ac9a98f9e6342a154a99264ef601293cd2d4a979ffb5dbb5fcf79ee727f87f9cf7cc6570dd88d60816232eaa57dd75a7f0ffc8160f65715fc12508fbf00134964968d33dd30742e93107eb74c3721cf6615fff5ba1566844ad6859e028ce769823f037a6205edadce32f3d38bf778d47c36eaa67a36cb53f572b1beb90622e5217b0833de3e6f8000adea76d4543c803aa707932105724706ca4db008c644336a89b3ae8f196b7f2b3ae306e18176c",
+          "padding" : "303a300d060960864801650304020105000489010000000000000020bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "c0177318feee842e802480dbe0dcfc6215d75431a30bb8492cfb1cb84f7ebc73dc37f56cd0dbca1f6a6516c6eee3de3addbcbd569bbc79d533a4f5955d95babc717cd4c8f5039ce49ce7dd20aa44bdb96a394f8499172079f8ed20c4ed780ffbe11cb00d04aeab80c882eac517c153993892549f2d4203d8e3fdc719fd745b06103b49f54ad51b6dfd0f4c94b08b7059875073ac11701e16af0b73d7b305d9a420fcb560b490d01c4afcc52b9b21a467e95bce62da8f559527066116c602bbcc29a434ca04ea3227a25a07d733f1b867040ad1c85b001904c749505166635c217d8858e637cbd74ebd1b86a400961f2713cd00e64947c2b5d2b97a4ef795822eae56328bc4bf8e8c9c8bb8d759a3743cbe9d368d985299d8338796ad6e24df7eb7db18147450d2db91000c8667681b47aa9f0f2e08b48aebadaeeca32976dd03ba94ae72950803a07f566e091670c83c8ad01cf1a2a921467010c20975e1b9653a7b56d2137799eee863a576a2275c33320445307670bc62fa039c7cdc8094c1",
+          "padding" : "30847fffffff300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "5675e16b96e961dd428de891451ed0d23706165d65392d277eaf846e24f0c4388536b2b52e519c07d0e10686a164bed5a05314249a77f77d140dd16d42fba947bbed204ef4c8a958e49f3aa4e62438ee333812d6a9719ff166839e467080d8762a4268fb575a33070209013741ae8ea0c757bb44d12450579ac8e22870569c6892edf1fdd0bc12a7823b695c4c90e93c3cea57c2fa004eb3306d13ba60cfa7aa3f1465a232c3f4cbb765a82bd59551d0f130137829871bd35cea7c59cfa12f188c91dfc214d8102810a7deccce40f204562993633ba4669f4d7d02418d5a66db59af8ad001884969b8e00951492bd846ad7db619d623b3466cfa062ae9282a1cddf150e761c90a3413e92f2f1fb2b5b62d410cdaf6bd8885d635f05f20331416fc3808fccd342764b7c244c1aaf78fa7a1166b1b204058a16ab750ac3fafbafdb2610f52164f75e7cff8a4c3cb899ebd5fbe1834682ee94e6cd810a4015ed7f0fea7f1494c5a477b572d172056629320307e8ece3f72de5dc0652e688d79d154",
+          "padding" : "303530847fffffff060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "0ec454d968f05e44953e179199eeacffe08757e89401d89f0c34875f81363aa99334615de41513ff604ec742730911b75138d3dc489094fea7ee75de8dd72f70af216817b5fabc521e391d5a0a870f2c089cd76105f96730ac1e33a2ad07896efe98b4237e8a937635f8d1dffd7fc77dd23b3e6959fa450e48b70611878727874df80d4f7949e14133a3135e422fb6fc7dffa6d6cae3ff75df25458c53f859a8ff34e1756b8da403aacf3b7b12980eb8e69f786c4433d92a5971d615251381185ae436d9d8fb04c6bd7264ca6b65b4d6dfdde13668f27fa81cc78115a07cc88f68462a15763041b3f44fe9d6fad4afeb2cd99258df774995b03a567d85553210111d7f0eeecac6a065f3cefef4ecbc607d49972aeb8be6042cddd844149275696cadf5778629c36d524f8b99b2445a8358afbad1c0d549312d6f5d0928fdd563e286ebdfa2e7db8acc4fbab128557ff6dbd03d123bbe525d0cf37cf9624f06821e422bf0f0ca8e27baab590a50d1e563098c920be15c0e8e965a2994d5916af1",
+          "padding" : "3035301106847fffffff60864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "b42bcbbd1403e77665fd47c2199d5d962ec7b224c00a30367d482f3f5beda989f72ba20822a46f5c28e9b5524de1ed6f3efb390a4c0fc222047f3a238a1b53ce6c4f2debf4fb4d92a8e1ede0895c39545c7a3fe07148c8c5944ba76a57315fc814f0c2a08d8627af126c467f281643d648128183379e90f99e97bbdb0acf2ed03f4ed38c61df3ced83a195b92ae786f2a81ed2bd6d1f33a7b1233c5ab13380621950fb27fbcaf63ecdc703bed0b1a58b1d36f84914be476e857a861bad98d35b248fba6afe10e410b93435e5854530f07d5d0c375fa6ee5cb8b306c2e40ce5eeadc16ba8fe40d7bbf31ff9ae2f70b458a8db46f4faf6373ee3cb0e5398b5db53b65bc8b0e4b336dd22de54c7e8e3b09eda2d33bbe53daf8626e63d16808427359cfc8076f07259772f00cfed32a6c1466b1fa1847bd9e7bbcd68b6ca9e8ea8b577985bd107bf1752353390656784f92003d43fb585ef2a4137c7f83cdad4bf3fe1eeed2cf76c79c0bf2cc322950f6ff0a98a3c68f83d7a9dff5d87420295c18c",
+          "padding" : "30353011060960864801650304020105847fffffff0420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "60aa59b8254b47199db7b29de45c02247610f3cf9cadc3f46c969aaf36ea1ecfd7aa2c6cf626a5ca11c275485818b2a433e9648c3dd8f6e100d530b215e107bda795ea13bdd3aed87b5edda40a5bb0105ef3731b44341b6a3300409db7b1bf2dea3b84507bd5fa0d7a11709ddb106df8fddf1a9625c64552b875ea96d5ab33820b9acc94a30f37e8817ba1d757c1555795cc82a26c6adea36676eac2934dd3d54e1bb0fca770f6051c108de1e8cc04c15306d94b088a0ebfafeb93bce91e283ef6b4ef88ee8abbfe549eaf2491f23e3ae13d3319c73330237e06d2d00989cbd9d9c8a095e82534e14845caaa66599d996df6b583c22c3e73f747c5e597b6263efd3d484fa75e227873f50c993eff26e14bca16e2df14098854167f0de73a157df996d0beb2aeb6750b5743b0a9f4d685ee8cfa5df01a4b924a679d14919d2753f8935b82ba4e2e4670097cf11bcd59a613b5f34a2963dc56f59f25f2b8b91e9a00a2cecee8b488d860044dc7e10f82037030d62d48e028022e7c3774bf3c25ca",
+          "padding" : "3035300d0609608648016503040201050004847fffffffbb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "562cb29e3b27d68a9f8741a57006296a943bee15c1e0cff97e8748ad822a321234a15fb3b89f4e07c1756d693507461172981189e9191e0175c71accbc258d3e79bbc627365c95f19fa416aaabf223bf22fbfd46cb8022a88600fdaf84aee70e9c8939e24de4e8a5fb2536c4fda5e3e3d71adc377708c1f4d7982c0c2267265d4f85d9e27f689de2c216a21239d6d4f95dd30ce102da43ec1b3e72ee5696db8c63cf06d94b8ccba75e197b2d26350d35336475f66de615daf8c1900ba37d7699ea881c0f7af84e936c402c08e15d3923733aad0894b4e78216225911ceae7f4c770a17d90fd7178a196050bef7218d7e0fe7fd22eb5c3854c806a5cd179e3a82b59d9b4e9e2dd1d4cd998ed32ffbf19a91cb19149c948b74861fd0e92174c2f35c82c9232a8413adeee723fe489dffc8aded50c7716403c02549802e083f16584b05e3f67a4e726dd8ec6d4adcfedc0695a47ab75e6d0b0486e946b6485f89162349eeeb88f20dc3095ec5f45bae1c2b7af4352138e864e6fec18b9bbe98fbf4",
+          "padding" : "3084ffffffff300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "2302f69cbfe30dbdfb830918913fb556f2634e268210efcd0afff8bc527fe30ea1dc36833b01fc1b7b1d8781913a5004a24c2412b9e0713b84f228b6b08349eaec2ac6908861157576c89bcf472572be53c0075e48534d335b954f46aa456c90653912e07137a418f8eb59329996e86fbcab8e585d80b7a8f97e7aacad3d08d24dbe30a76ef8f47788d36926e74c0f24df942f73fbdfd649ffe9a952acddf3fd8ed9aad055c3a950e749dfce25d0c45114f40dae0a449f23d7915dea8ee1f6f163849affa4b7b8105badbbffc5690190fce192f4a647b81b14101b4fd9b1f0379b08379901f0908ccb48d5c88e8a3d0b6563bf01117ebcecbd84dd61e6bf05b77dd2a3c63d9c36a394843df28b8184de81cde4f381eea84822002008938d3549550cdeafe31606fcc282ef2c2a4ab90b437d0975a6d576fb705e26131bd07add5bcd34887496b653f3e9c2a7760eb367935cc8052ea896c6f2023f0d2a5bf3267835cb4adb079019b8974426953ef1447069a79cdb51fe8c32fff14a9bb8f78e",
+          "padding" : "30353084ffffffff060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "69a1305c5eed4c40a1799a68e0bcd73f2fddf4cdc750d24c1035eb256eadc6e59c13a7784b22b09f4ef0c34b772ebe608f9306bf5fd7a463ce0f96ad0e3a2df6e1dfa8ac846ddf54b1b10dd9583724a96a0500d5aa6184052d553266d6b69b14bc76e82e15386d3b961323b326d75886fa61efe31244f5b79f83eb4ba8eb5d19d066e1844c11ba8ef225ad6817d6b560c0ef551fab8589366ecd74b93a944aa53becaf4c8e77b13e2da12fe5543c2680ad76291f08a146ed42e0273592bedd08e493121843f1f544c766017aaf581bd1645614edada2f90d4dfa5f80c1ce9e21efe901b8ab5687fad0c022b52e154abf2bb1d0c02e7cf934519c0d934ec995c79c244eb3e5462fa86dc7b13feb69abbba73610a70f69dac24e6e5ee98cc7376102f5f3b58240f13e0eef2ad0cbf1b33e828345d17d7940732886a20e05c00f2f400d2f45ab68778f3ec85246e0a2851e44fa77cb6079addf354a37512035643ec785bdc9a011e6d0788208c1e14c02aae32c3ff764f6455c8f8ac4e5017a5d5c",
+          "padding" : "303530110684ffffffff60864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "8a8634d606e5c507f60bc6f932db58af00b8b057132eb1148b278ad00be6e595893982b2f248a3b098dc58dc751bf42094ac236874bcb4b40f95e56f07f1267e559d2bdcf316af97dbb6c9b2356fd7eccf47698190dbe3a116a24ed7a09eb2d51314c8272127f9a5960158ad8c771489aac374b9ed43cc4d85737b808f49fbfaba2fcfe044a526fa067401bf6c4e8b3d89a527dd2340983ec0fe0301a00857726ba5144b8fe1bb6d995c82455b04ddb6dca1c02e1e3cf0086f95e6d51420891231f5422bd16cc84f41705451d5dac7725029e9a4e4a1d1a7d0dec7126e1bdba68dc32fcf5a2ba9d2893d2732847b42659c68da741c3eba87bfc6f127edfaa1ec5c05ffab1ea2d9f412600f0016540f07387b4146c1774a9a0230c23b1ecc8c14ddff0ac8b12bf47b64fe9c7c3c2bc0ae59d1c22d1e1790d88edb1c6d31d90c7996dccca9b91e3da10cf185cd36a35267acd92e13909cae9ae19440f142fb270496396b983c79963a07013a3bf089fad02334c1f76bea4a8dd8578db9174b22d0",
+          "padding" : "3035301106096086480165030402010584ffffffff0420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "0d814684d79c28bc169da20859fef117d2d6c98a9c7d52b788d972fc098db62d46f52ba2b5083cc7de5cff0658d4266c113a8b35cb3bf04061d4c6ba6b7b4cd67eeb48d56101555e4fb556a6e90d513ebe468eed8ef0202118998b2a1c0d9879b14367f21d9b4889b9f2b41cd260d95f540dd8489b78ddec27999ba507da902f60fe1dca5f7fef00a85829166a1839162b8e61436bf6723a136d765581963b812b0005b4cbda844cd76c1054c87f69641d5268abe4991afa2fd98dead30ba26d747aedebf45a96bd1002aa3b8c86cbbadd86124817595f123a39f9cf3fd26543afe54c6fcfe170060af7aa096ee2aa16e206303f8579554b7bb1f412062eecd486219c94798737e9ff75ca2c1f34cd03182c9431382f0e12cc7efa13b1c5ad367f34ae84af42b4614a7eac8ac7f1ca10695b88bf6ef17006f06975dfb4fd02731d5cd8a6e429515c4730d0aec054b3533d5d429150fc9714665e3881c25f5850fcfb3e8dae79c364d58aeaf2bcb0ee5d899af92adc93d632eacfe529ff57a0f2",
+          "padding" : "3035300d060960864801650304020105000484ffffffffbb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "92218f94fc3552f215e98d21758992429cb17fc3313f780feea3f482d0e32cf97fc8832205e74286e69a1fa35062b984635687692d15e6050376afd8e8501b4a07e8c61006a2fa6eb27e2a4c310f54b907808027eaf9cb0530f8ade781c4fa9095a41bb6630c1e0973783eab65cb0849f9c8e89f3c997ea3ab930b4fc629028dda3d5e0e7dcd99b2951282c31b8e3739b6724a414dbc254802e63a1a6a268e7fc6a91934cbb27d9cf0ec994fd02334a7451c3658e7ab13aa5dd27e81736c9cb316679eb9a3d3f87c3739ca07a7be08a0402ab2883d860867a4eccd2476c8d9e37e2ec214d6895664bdda7ce7344c95622791cdfaca32508c8b7388391846b720659de2aea7bbb84520fae9edea66638270e735677f175f115c582f8d76185e8edb3d105e3d6c0f490ec486f7ba41f750add6d50997ec85ed351a2b14a4c328a41faf70ff3e50fd4ddfae6f9c74fd72a7c1bc0df045e31fd72f04b6a797e0cced07bf2fce788d75ef6d783cd6e4eff98c49e99487c76ccd4e08ea26d36c29aae1",
+          "padding" : "3085ffffffffff300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "55a36002b43d9b5a2f99ba0acf767cb04b54b7849fc2443d123bae5b6c6b6fb666d7ffb96e09580462df5fc560cbe9744c166f8f43be98b7b61ab71b86323d771eb6aed87ca4261b4e4d76af84813173c01cd82a87fda653c47f3700fc2110a852def8c785da96dbc779615335ec871a31ac3590562e8f50972b5e217d45089a217e8b0b1905693e7dcd121542d11c0083b967b04a8927211ce89262329ba2f7875412b8785ebe47693b8f3b76f98192bdadd3f4359999d48d751290e87264a5f2e53ef5814225931b253b451a3246f22ee3fc7295806ead7992bee92e74b19dba84b1228a8fcec6fc0729f4840d2b467956f86a916129c57025c7465fbfd760e0ddfb480f748c422c08a98fd0f73a5ef04b28fac58355e6d9bbeafe84d0b24e6ba19ed317bba9dd6b9f0008d5d150b3a27b839ec2bd72205c345211c99c8bd92db11c1bc16415b082f0e6f23bfdf9fb00b80a6921a023cd2d8565d2c98c60b5d44b2593126f6ebea96c6529e54d3f2a503262bff664c955d6435185247b32b9",
+          "padding" : "30363085ffffffffff060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "8475c42278f3ecfb53a8b19904c4cb40ab5eac50077bf85b8cc71f6faff06321110aa240f9a7e8d3e99b813f29c4bf35acc8caecff0873511c9bb9f87e0228a5ccb82601dcec8b8b99acf08683e70981af9f7f2ab570023156471d77d9e944f221bdff3e666f87dffabd079606a4fc139af85031e1de8664590340e39e2c117054c8b48b20763b7b5fca7b5fffa645f93d4a9d6f3336e229f9ddbaa4e1490235c0e7f516b2e995d5abf602803c9e7286fae0fdc7cbed07a69f5b1b11cec32062330fac3b85cc4b549450ee358b859a10b2e8a33d988e52ac6921d5503f95f47d4ca26d04b4d850235f78aef513258b627d27d47edd8374828a1dfc26e4f1c2009372110c729c01dd9a65464bb1ad4be056318a0c0beee9458962e727852374dcc27f437c6c550be2333d014767d1ba0aabaed99297a544ecdb27098cd2acec886ef4aaca14a030d07ee42dc0194c1f867b77aa8b7187358a5d185ebecb24097b00a136d39553cc508ca82dc088f359cd836497b3e87276437e132096b03db97e",
+          "padding" : "303630120685ffffffffff60864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "4efcc5b2b023e2347dd71bd948cb661534e1bfd77fa55e768b9ec3edf20709786ce113b6c9026448e97808d098d33590488028c098b0d7f5719dc39c2cca636d9cf888230a803c75c1a9a4a2c884ebf19d7bbbe21e62f0b3ea8dba5706c98027b3fdc0a6429578fc2ed02625f9bb9c9d3f193ba98b78c510fe7e7beb42513e76d84b72b49abce43d33e23aa25d8038bdadbc3b115dae29d4b4e4616108c9c1727f14bbaee73ca32f8bf4511cf45959c2ad217bceb544f9ad7fc69344a6305680723dc1f18de7d81f2fe49c2d058f9de6b76dd8ae7d94dbb0fa0a54d253d51ad4b7ceb939a239eedd455e9c6645988530ba59fa7311b3ab26eba68d5cca744f57a5cad7fea64a6fd323e93e92cfcf4504b4174f3fe7fa93d68abd98b1128ca909a03fbe82bfbec0dc4017675d3fb54a39ded1e00f93fff69b9374c280bf124ae1a0928ec39bc2a650c345a9192221c172f2a3d22301db276e32e78dcf75dbb3569f9ca45b9c5db35d766910bb8d644a1a3ef02609e42a586e2c9096fdf3fa9d73",
+          "padding" : "3036301206096086480165030402010585ffffffffff0420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "550ce3e78b5e1301a0b375e5c6bb6ceff056689221188d00c6116eba6920eb8c6aafab5bcc11e52984e05f68920d44be9dc2356617d3e7ada79d51865885262defae63a4d34b8c003ef5ff324b59ed6657dba99765ae425ed2c9bdcf11f41ae0164a44c1c41d98cafc66ff4e916390c42c82244196887d18121eae27b6e21c57354b0d37e160f324b95e790956a5093a9283dfe9a72922cdfde37d15bc317bd05909ed8d1c8dbcbf600fda9d26c810da486a865887191e1bfbb21a68c17c217fc3f8aa2efde650fc8ccd3fe5f6d7270231ab0a97e3d5f3b63981e09d0b8201ceb649505346ab22f664b9b6a63ab088bf4ea01fa26142ea3795161f933164bfc4e2412a2961bc09ae13257df7171cedfd2fb48e5a61034a2494b3bf70dc51a3577de4a948bc0bf35036b0496cf79c9b4d1bae0e9184068260189a6b5531715dd47b9e4f011622306ae7cccd7743eb42b4748fdf46bc5e3285373b385b5e38185d9990dec73133a9b88bd3d7ef0cda141f2c6704ae967af791056ff249c3ddb7ae",
+          "padding" : "3036300d060960864801650304020105000485ffffffffffbb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "79ae98a76ace727161e1ce51f127445bad0f3aa45443a099d246b3e04057097bdf2c99e744fee3a55a6feb7f386e89b3b4efca1cd4bda07c0fb4a06c3130c9d23550f56899480f4dac7b74af496e74271eb23f96236d61e12d5fb616b3bab8c53845816efde0d33a8f041fd0b8b01391e99811bc4723941a0b5cef0974eeeb2d4726b51e9a8687709788abc5376374af650724ba6aaca36b854afd09fe978de357de3ff1cbaba28b8afc24887742656fbf6007f61715e9102aee9c1544d8e7300196f5ed3d86d3e665db7b8f98d16d249f92f34b0faf3025387c31b5aa572404b8d3338ead9d7e4a9891f0796cd6866ae0b34ac57592ead287b984794d6ce7da2c89ab5b352b79ea94f8c0a47e03eb11fcb7cb55d2d00a88a09e22b9b8d5040003e4a8b9b5d411b21673ecaa59424bbc59a2e564d7d7fd8a3730c09eeed6b6f3f1a6af60b9e96b2021e27df6893a8c9c7bfd394c7aa02bcf2af96a392497ef1587cc271755b84db15957d30064fa1be2bfd8bb46de4285640e551bb8cbb843ed",
+          "padding" : "3088ffffffffffffffff300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3894bf87b1af9047d10bbf45a65671c8f96c5603ec84ac2edb97684354cc7e1ce2050afdce800626c238b3de0b7d94e59f03c1926fee2ff49b52b11fe64c8825eedfb9fedc4b58fb53b9bed5d5f0447514e6e5af4dba869632bf92051e268835883d16f08ed8ebbc9ce5decfba43acafb72f8776a2cfcfea0d2b43e17d4185782cefbbc27a3a249275cf47456c1486fdb57396d5ac0321c6676432d25ffd946ccc781d521c67995493ca3e6fb05e46a1b906cb0e48096611383a072d5a2b0fa58c003e5c58311267922bdb4217a19f9405b79d0fec5a177de5247f1f939d5b9201378d09328aa98d1e5a7e1efb63ac9bcee721208cabee3e488a4551e444d47236f89a6846d1459abdbbc2096cd7dc1fe69bc3cad5ec7ddd02359c6b96398b455a39022129ca179e1da702fe7019f9d73b8a8bc25fdec727bb70dc1e69e57faae10c8fe6a71fc903b1c2272901a94fc2721fdd8642a61666211f8557bf5f184e524ce64978596e8477ec4ef9abfd9ebd170ccb632b76da9d015d3d7f3306a0aa",
+          "padding" : "30393088ffffffffffffffff060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "ab5bdea7d6018c803966227c8bf584a231fec444b6bc1e53fd3f240b30c7a3d84ff099899902ab9a11f1f2876dbebe6514f190838af546a249f3ce4353831a20effbe944b97b523c3857eec96785dd117ac188ffa41b7c8374ac37b03bd14afb828641b0c0bb2b47c1913ccaa5c1428258461ea57a72678e1ee41fb2ce9b5a1c3bcf3d44b8fed062de9a3600e940949b7478b452af12c97412cbf8f0bf1d95cb2bd4c3581d1ada8a0efdc2055e52a16ed7c2adc36e5f26d5367582b475a61bafd28d92c589cddcf99d3b94c64254a9ec0ea409fb5f480cd3a6e18728b68637b563467c48370286457012f92106278375b018a2cce2a4b274a4971725254049065198ff18e0c6a2f216a3df4accceb0077ba4b8d5492d7078d093e442b24588bdf9076d727b3a17f17172c8240294938b45ce0d695d637f11c8b9a4d71eefa0237828a6ff62d9b0c88fcd4d8a97f71b09df62274f51daad2036ae7765a03036ed637f3de571f4f8af7522e41acbe84d305f43d74f878365ba3fc0f2dd3fce2335",
+          "padding" : "303930150688ffffffffffffffff60864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "70e063e00143ae6836b44a35a084218baea5bcc469be89df6a63cd58de6b40f4718d6b7517afba52a459ce12dddd06cf9e3ff41533e7df2300119af7fb5fe943b133d548695860c4598fb418b278899e4e0e5084d785f468b6cfd9945af926ad6509e7b6cc0482dc0d2b8d1201cbabb619fa8aef07d9700ed0e97062604574aae8bdd9ae2eaead2a22be6aca035f56b25f419ea378dc4bf6cdce24906c62facbe2617804b54c83d35c651d14d5f93e4416a4ad9ffb0784e292f7813af00dffc5971c1f6ef6725754ca06aa116a92cde6088f95ccc8c5ae19a821fce9c316b2c74f07baf29511f3f608e3e8a2c276043e2631a1fc651d622754384ffc10045883b93675c7e4aa8453692b0e984b12c213f31a225c77d28fdac426aefc523f8c5e55512c3a44f4e75b9bc04da2befdae590f09463a0d0fc417a4ae8eb31aaa5820324450b0dddcf8a9b06bb066ccb333a4bf445dbd10c025333154752ac0e919f714deb58ec58f38742fd3379754336ce9944674573cafa81bfcbd71e49beb5ecd",
+          "padding" : "3039301506096086480165030402010588ffffffffffffffff0420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3b2eb94128068de15497d0fb6d8612fa6b900a7c8d38512eea2c579b9f62c45d1bd198ecbc5b2facd875bc0291b6df8de78fc3367529d2e36996f14017f3ef71883d3b95f2525f62ae32d294a170f664d3ce1cf5a5cfed4df8b5c658e45ed65a606b238349cf1cd53d6f74278dd8e0d898c1375f007b8d2777889a104735ab7306df6751d9539447e86bc106e83ce6ed856505e5ca3d9eb58d8f4caafe13a07e2d3670b3934f5a08d1c76f723bf2b2130fb8a99393338912bfb06fc6974bb0493a43e14549927215c4cd0aa76ca99754fcaab897f2cc7a149caf0d2692a82e91c5ff0bc9d33e2f6620544b7fb0734b304df20a1e4389f1da4d8b1f40f019060708a5a05582606970a30ef75606a1cc46609615404b7689520db0dd22434052d6348c01cf8d7a2bf80e19b1799e70d049cdca517f262f754e71f000bc0f83bf9fc59fe3865a4e75f275d514cced20cacf10bdba843b824bbc1c9c9c22e4a8e234be197cf90575f132e1c53cac7d87979a84c612b6ea0c2f0f1cd1da0559661e73",
+          "padding" : "3039300d060960864801650304020105000488ffffffffffffffffbb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "4bce06246b965920ba5768f11973b7773576c8ca811031d091fbf88f0aeeef793859aeee2220a543df5dcb0a6932ab7eda80ca2d9a45687d00c570c0494deb6960424d936a21664108047a4b4f0a3f120d337c7e010e56098e9b707319b1e306a499843d53ae351db6eac5538a4cef9d49660345bcb5bb18900381850b371ad17a47ac57860d1ade90b839402c6bdd8479c79e27fc9cc3fbbb8ded4348da6d70ceb8b6c95d9c8efdc6fc0a51f952ba0e7dcd21f28dfbd39362f2a817c4045b1a3cd6da4c2bfce76516bc918a11dafb9f0c4776bf3f23802b38be8d03cfdc6b3551998842a028ee1585a6c232409469a869b3b144d5d02debfefe09a8e14d0e915dfcc722fccdb87e055929140257428de416d6caeb2437857d585ee6c3a4eb64a5d8f51df2050f28286e3e1987c6e3e3b22131597ed1c83410a2569c8d7cb04a80ef8f37bd043230502987013f560d7ba865759a01f588611d9a9783753093d87e3da0827c7903851ae9601d1d0e7766ba645a0a386d49ae2c5eccac6667f449",
+          "padding" : "30ff300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "7af993a700d939dc8e6b16384c311e092883680d4825c26cea5c25d4b738365473b0dbd01e944d84af0f658993b35c1dbf8a657cbedcb1e4b003694aa401c8e568b4e65c9646cc861d689c02f4f1b176acb79aa8eb9006f0f68da78f41eecd4869ecc576f849e9a20e6c1132f9af34eb92da154a459b5a3034abc8ab4c5b26d8721b89ae1099f88c971a9cd58c28369a9274bc7e2df4eb2dec049fea944ba505f61f3d6c4d65e643fa15ed99e915471d2631840ba05e7e05c714b84f102c8fcd94fae291ab216f0845bbee06a5452ed71d9e429bdbd50d11710890673c28de3cd07448a68c92ae052256837429590176c160e7eb42371753e778a6728a40dcec33d58d46ae03ba97fe2f337288a7ef67d71a42ff3944c1a0ff29b8d59820e5b3429342ac74f2978bcb4b56d455ed7b0f035237863f0dbb249f570c591d46a67ef2ec54bc9fca010d9b6c018c415fb4eaa81bb6fad502c273e72bae7acf4b4e3497c9d42bcdbf731c0bcd04604d85171fedc4b750b63d31fdcca389b6ff7e6dcb",
+          "padding" : "303130ff060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "32329315f2d1bde7c6d3ff918ff3101084385adfc2216c0bbbb22b1e3dde65dafcf76864189d3ace3695e51a40ae844ac6e9fc72f1fbb04a047c58b0b6a86df0f2f73726eeb8ea2a428f1588a222bc95bd550083da397add4a6d37a14358f105e85d270b14fc3ed99c35e75ecb818889a065e9afba8918a8f0590d292b507fe36cc4f416e9168cda8ec687ae7cbe2018a585f4c9d76323656ff4d554744c516128eeca1eb6c77c5f566b1ad66665cfc81632cf47f76c2d366f3b5fa0818ccc39e1a95ae9a5a018e8b9defb060482a5e38b4037cf50d23bfbaae13f096491a811a633ce2aad8317376a087bc46f12154e2fd14b2a008698b0acd3485d326dfbafb1c36a1dbf5d7da8119f3f456a4c0db555aacd48905646ad6d65b64deda1b248e133f251ab7db6bc8449cdec4ccb5f45b1a3452e25c3a04f5881ad19c0c241e10f18ea4aa41e1856123e2694dd701edb7310e651b3d7d295bd193f800000931eaed32e4c4c52e339e939de6612ec6bd10d384ee228d2d14498fd1ee4ad3b46bb",
+          "padding" : "3031300d06ff60864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "889989d3df5ae514b1bc95c5231248b30e38d08e48b88ee8270db52c2cf65427b3f7c59ffb718965849e774e40370587dc37fe4de5eafe74865e8c84ecc7a64fd3ffd657c309db28516100f7b57e70c557302e49f612f185f11540d1cee57f643ed976fcef5c71e0c1db38d12c621b8c80e7cb2a02406ffd728cb3029c23d402343f3040d4fbc0cd2439392a93d0492fd90a89176cd72e6b8a434cef5ac4511ca14d4b7d2dee0937bbf5daadee6a1bafecfad41c000f06f72f73c6426fd540d59b0153934fd059e2dec7a6dcb29f64133b856c3b18ee5531998870f3cec2c375c44060778adc1b159e9411bf43f391f0eb82c20e8ea6c6ffc60c4a0bf27fa82e5f79857ac58de7107472670292c66337781070e562da9bbe023d2396d5f75b852551d721f8aa1a737918db641520809e0be68f5aae43994d6666d31805431b9fa146251424600fa08466622e970f520b4bf5a903e329f21c1c74945cd6898f2f8464eb6b48da5af543bf1937395adb0e4e6b4ec0f11c9ffaf0071a453db37d6e",
+          "padding" : "3031300d060960864801650304020105ff0420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "6496f96674d13a493992dcf6193b557680962c4152826f35b82befb713a5e86b09ac350b36a4b27a730112b91faffd84eef3e032628e5a06e98600e49665c9755b2f48161edafbc9ce527e3403ca919e1614708a7ab697a20a398233fa23f32ca77a9c81e16bddcc4058015518258bd48b955fa81cafa34282bb5e6d42bbd1c82fc30ad3a7aeb1d4381cb2ef951da28941c4b9617be518dd3616a0472669c25ed43acfb5f55e58a87fa6181337efc97256635e7c678f099c2d62f78aff5b54663061c0cb3c6c330c43e8a4c4a50a8229839ef6ca0c5943e87e9216da644aedc80c698f9eaafdf81046548bdfd119cfaf95667bebec6ce029ca0a4c96c9a17c8ef735d43af9c81bc82a9317046eb8444a765cd4cd848e61370b3014af893ef92faba5a14b4217f076872d187d8de12381ddb7e30e40abc6caffb5b267067c411f9d104dcfd1e395e2b73c67b1d884690a6a4ab58aba1e7c720c187604864440b6dd87d85188e94b0c6fd99038f299d44e161de8ca7fdbae62c3a8b6ee003afed3",
+          "padding" : "3031300d0609608648016503040201050004ffbb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "1123e2e0acbc7c8816b6dbe2af9359a2e0b6c10dd522bb3fdfae93855ba73a95961290ed808b3ff8eee8a9f58f3a77f05d03ea1c09d849080c415b3d4214a706692fc72692a75c07b6bc21b9ba4e79f842519b1a5c67259f028995d34c993d0ee0d71262892e3e76d677e838a308a2b4bac5fe20a6ec073148b1a420d5eb5bc4f2c9a45b10ca993d51be5146ca9ad4597ac6ef522e0441e2977fa6470545b086d434d69871561033419e8540299d92f5425e91f82ec902a2d2f5ae8f9017131644107d120786802f30746a116cc67f85ee9676d1738dbca0b360ef257588879f2f6a441d66d5aaa20a98ed3f57a73c3b96e4ced07b8129b50865efe1b8e20f0b81ea5cea294dc99f67cb515a25c646b749b2cc3cf18a41f1e3e66d77710b1854c3af1938a74c991a7e7a93971acc3fc3de3dbab92a84b498d711718106c98c3fb39d3c6eaf5c3621af25d3872e0de8d7588f742183918267458e5975bf5cf0f6c43846ccba256f76529580ff9913776600d1538002690dce5bfb8cc3356d96d7",
+          "padding" : "3080300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "194494470fb927c96faff5627eaba83b85cfec16ad38d166a5d7858d6c77580a4a8bb94c16eabf9b22e7653b7957aaed312695df9bade2b4722dab393a286fc2b734cf6f7876083d42f238d0af3082eaeb85e61158e9dc352bf151de4f1329e7c379b40aeb312fe331df8c460c423ce08bcb6290d7e772a75ba6679eaf4be77227c296246eaadc05fe3451203479eebc0fa86ae86ba9d3b42160f0f58ec0652805000ee8e520fd58f80421ee5e78436ce64a58a8273d512bffd3794b04b37a3f83e7b5805d19595f61d07f7a4790bbffb57565b27e8edba4273339ca62fa711c22ef459e78429e9c1f06f6cf8c6c8d5e0aec1bb88bd29a516f6bc1789fc790188c26c484231a78696bbcb181f608b08084426e49daef7d7cd080ff0a82f9c70605748bcba1fd4ec4976319de01a44b76097f86e627c37c37e92ba35bdd51027651b47f9e87e8490f7ce2d2ef8e1566da7f3bfa880e98564bbe2f80c642d30949391081801af2bd79e4a9de3116658216b9bd7949752661d7ccb7ca3ed5918288",
+          "padding" : "30313080060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "9f6c7acabb5676d40357d7f58dc188aa11da3b032e0fec24d1d377e9dc4aa71d52945873bd82a6b1540b07f6bfa3158a11beb46513446cfd8af28118e693a4f700ce677988221f2cb0f308e29b42feb8c5ce768e34a9ce889fe5429b6b1d9dd5cce537c311228bc524a983ec83d5326cf1141cceabec8170a8ef00d3e003a86962ac760d6de2f906499e60ddf6cdaa394ff2880c4cbd7d658e02c3babdc8c39707e4ab59ece61eebe3e6266d635e0d594e1cb114b699022149b2105157d20c0d4e289c8558348820250a03931033b2cafd400cf62c21a617b16e83cf9c4a79a1df59101eaa180d8b61e5ac2c387f190bc5d01c0766641c8e796afdddaea9a8f625a7eccef21cf8c9bbb391f13fcab5f253f598b880e0391c2e34a64d1aeb028fcd84a3158f692466cd953334db71f4512030534f31a21eb65b459969a00307e9b2ab828f6e4966fbcadec694a394a8b89f94ce1eedd3d2731fc01395d30794ac2abdb0b60dfd14a46b533727d137168fd5b42183cbcb79d38b9259b725fd2485",
+          "padding" : "3031300d068060864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "315f909380797c58724f05150a19becb372342fc5fb8f0073633808be07fa49be3cccd3892417c925674707c1e36e7188d5f1313eadf99a9907d6b0ba2093ddaa28c3e030d64448d935e2a56b7d989475a7a7e577f2329c6e8e2b2ece2a553679ec90a15089b494028c914d883c460eacaee1eac472f000076a4642136ffd2558c5b7033d71cee3a592899fcdaa05ec41de962f19060a32ec686b34f85b105a413f3baa819bc6cdea0f00fdd07900a8b041fde463d7e44cc6c45c48f7a1974e76e0fd67eb495b6448d739fe091a99eaa79f8436839daf485085253ced9ae1d5ea2dd5135fb5caa44d51d728c4e70479c6f0c239fa585fa557e08062edd07141754543c5af6e554afe5b54e7be52d886c83c7ce6ca9f3fcb3e8329816cc6c0d046bb1daeafb271ad6ed3da795a1b8fbaa3a056d407aedafb457045b6e067582be605a7abcd4643bdc2fa492df1e0fd43cc3e8cbac05ae240392ea02db489e6a5561895dfd14f47cb5ec6ac594427642eac91cafec05182f3415dbdfd12a348c3d",
+          "padding" : "3031300d060960864801650304020105800420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "2bff6effa697277d05bb0a7c6a7f714a0c2f23f9870f51c6b2a678d3b06f5c892d75f377f24fbb14c3c9aba52ae06d3741ebe3e116c0d49dc4e651251367fc63720c8553646bd7465298ccb7b4bf765607dd05052fe5a660c84e0e516aa67540af1ca35befb2250602742a53d4cd97cbd98b9136049336e553c3e7dc64eb39f3d96be6fb1146c16f2180992d0f16fdb9a4c9012753901fb7b293e6af23187c76d9ef55a6956b299bf9e9c9c27c9a4fd524360a4a6988ca1168f35f8bd2038869d77f117ce6d20e710a78b363973a08a5eb091a5ae7332e83617deca9911a2b241aca731624905b91ae63a87045bb2c356c934c70a6cc22bcecd7eb26adb6f98b1c1d727582d7329235a438e1161dcc01f82f760833bfd8d54f8d856ec475ef342072c3d6066425cd0309c4bed7a0861afd7e64b92cdf969ca4d2655a2ee47679134fc2ed39b41cd1cf2665eaaf1e21e8bb9fe6f19b16a057d8277d68ea7a240c95978deedff766e84ef46490720a3809e3ce2a9994af4a04de2059c5a393cf3a",
+          "padding" : "3031300d060960864801650304020105000480bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "6e8ac44ae4bfe2af008414861bcdba58127d547d3b4ba6516ab18875ca3dd015dfe303d54b50b2fa8c001951d16e64aa9c2b14da674b4547317f14d2921f1f22ff72f1529dc8074725872720f3799bb9364e27add3c4eed2da587a6a8fa45387a80a68b879b309447874b8d81b74c69486c53aee543ec53c02433c9d405b86d0bca97b34f38db3e7536b838a87c2e007cdb675b7c93be81d1b102ef60672b740f3a9c8124885b6228bb3aae713b69224c5278cf9d4b23028d8fe0890f9897b215929e110265d93b66b98357bbdcd7efd51598012c313b120233911001a8519a9d98b742650296f8c5a67ff0fd0446b3006ac254cf8085036bf6074da96230fb0ccd02fcd95fe4b1e8dc7cdadfa2677da92a80efe36081333c557a4704422c3780a00beb6670a7ca95a30c9ecd78d46c88e30a081d0445142761ffa4e8c8682610395d2de0602043e6567a6d62a77cd6c697fcd362b13aee3fa92946036086ca3b002f1eef8dd5550a4aec137a6f60f7d943c9522f55cdc14dfe58639b17350a3",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "83dc093ac399d896efeaf13a4e5b9f5404592c7740af42186b01f2147e3de7f3f46ba323dfa3dec885e10d92c4f5871f50861dad583794b25e3ca2b68eb1458ac3640c7d13711d3338dc509f10df2c52620e0b7c2e2a72608fb52b981b6191765ffe4e675c6a7896c0f026598a3b156f1777b781b6ee688ccced77b95b61ff54b1bf492cf732b9c7a8212b18b5c899929acadc622069c6b4b905add8de54a2332436b5e6f6e16d572ffe46fbb76067e1c67c7bf58d449d2cecfebba5cd7f8246d6511cac17b106e7421c6c65e704a2496773fe86b937265cf27e81a37a3f4f5b21e47fe214e84a9163cc89781468b3e5868ac3414dc112f0fe159d909fd312382a8b76fe194c32bab360d9d694fae4a1c9639103556a7d283252bc922d889c0d5eb6cc657373bbb02119cc8527e6aff051d555ed12806f7b22a5df8bf13c5fd35d5095ac6af7e106b02d4b18dc4400d2404a3221e1f1c8027e722ebcea1d6271cb878d0e6b825f4e3a692fe7eca65c4287a63a3586810c3865cbd7fddf450f99",
+          "padding" : "30220420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "6823574bd9fdd7e59ced33e5660e9b5cdc90417fc350cb4535d78dda72c07ce81ac1aee37b90a85ae15f8f59be9461e846a45bdaf3e5f5868b83d1c9465b080d5bffeb933aa9341b6d508b059cfd2e62dad31f35d7fe9058bbe65024d0f73d43a3450eaa707957fc452a69ab9a8ecbb8ba002c870950ebefb06fbd9399bd08d64f72dfb4b2d3dbf662daf7c2c1dd8c3c445e1402e2009b47fd92c3a23864a495037b7f2fbc3adf19355f171e2a9f65f5a3a2c45b131e5398c434ac6daff018e5b5e44b9cf1564cdbab39f407a334fe1f05ecf84f49cfee88836d1068012b4fac6b50f85f8b1a8c37a333028e38f719ee6445a9fcdf7bc0fabaeff32dea7e45d6e1c12003cec8dc5680be584ef2cb478b9988fd7484e8d374d825a95efa5163309eebaf962d0b8ead00b4b9e4791dd5c6bd26c085c96462f2e4d19cfef3a0a97cfdbceb8c6ac2b45aac1df4be4e6c775021c6730e88f86babd96bddeb0e36d0fc573c9ea9346d6a93bd096c8fce248b93dbb0ad00596788cfa6fc0635fc0d0778",
+          "padding" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "90954e5cdd1888a510092205c3f66fa1cc9ebe82b14e80e0353ffd417876c69701801153402aaba503e98fe9020f54f717b0af8968fc2524a3081e709974ca8001dd93e52fe0d1782e3eba03a51d260582e4222937252e454ae7d5ac8ede7a4888ff826547350c594186126efac622a44e9731620a57cb73de7e29bbfd727c2dabb6a5f6cf3eb0dbe072990a8b8ead67b8a719e5734d7f4d96fd674c404491becb4b3ecddab7f872afa3326b7e18d47d3332f654793323e13b4d9d2f77871c7ab50ac4d76f57fce635da6656b1e09b3571b8e841835023b2226a4ba8cd0b95588b0827bdd4b6f45fd183100d327777c2bdc0a0d55f0e4e1760cdfa7a2b701f06c0c5800fb49bd48d57a077ac90f1726ce2ead834fa1bdf735b13fc234a07685537a5eb01ec44ff8dcf086d2de02007981bd2338bb2b455a1379d72ca8a552bab119692b9ae1f2851ae5e838c33d1d2255114cb3223edc18512cd41057b71c4185022c4765049089836d62020905faf3eb92ba80dd91db64e51a75dd4f206c140",
+          "padding" : "3023300420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "058742fca1521993d7e3bf04b3369a8cbdd505da63f7684ba9279dc8db6841342664a5d780dab0b87cde7b2dea6a0fe77ec1b723a47592ea932f895faf2d1e8dd8ab16228942a217db65d51c5cd29c05590ce9ddbf6f19111c9092e60e48ac5ff720e0f76cce93c6de41023033a902be28cd5c0203d06f589e7b63431dd741a3e227709e73793d0e2bbe0fd22dfbbbc1bfd8343dbdb8ec3614d771f1c58e107b567b81105546a3b2b54d3b56f8c5785d50f3cac892e03f7f879f22c80c4cef3faceb1038234e6bcdf2382d8565d3ef3ed668b05c64e08e0c7bec759ad77c6178161652b95142ff1bb1b3ef0d1738e444082f113a448e4aa7d3bd182ef8caaf6e2d07448ef5ca7cf7933690040d6d41b5d19378f41bb9cc7e659251bb63444c3983377bb01a176828dae9b255885bc0d872d33a0a257940f3b30b352986f201646efeec10796c6bc43031813f33634b6450a2d9a9d3d96ea95a6660caba876a0f311e4b083b25e2fa9f69e405e59fe81d337ef0b27996e76c816bfa84929b8a73",
+          "padding" : "3033300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "bcf07d322c37a507d2288f6a079b037a6cfb1b5bbbe07de90c9a13b00d400f94a03c8101a2f9a4ea258e3d8ce167fd40e48e5ac42be2095302071f23596474e22d2b9fc20800c2cfceb3b92ba847717eeeb030e4304a5e1138976166ffd83467ae7790bcc4d0e1d093ff09b41b62cd389a612ff3b9204af9a24efee6ced39de96bffb1ad3636d7aba49f8deda056735afc848381546d9c2aeb0a72ed2602b4a619ab9a534186f8bbf5924618b49cbc35bb021e575c68ce5ccd886ad2d0c968292f2dcdd411826470b34717fc2853f52e10307136add9b68f7c79c56d992a08b461418781ce66311f8bc37abbb1dbd3551f924be3b1edfa7340267303cb48de616e7cfde59111dd1f91592f268b20581fd1936d8b3ace85cdf3e0d4cf55e170ac99de5bf5df69b851024858f8f3bcebf3f45d7831ccf72016877ac59ef49ed5d81112a2fbd9f97e40ff1e6f4cb42511dc246a75af9fff33bcde3ba9dfa3249a8df3c8429e700c1b3d701914802b5edebe909ef86b8f57b556da3b1f4e675711d9",
+          "padding" : "3033300f0609608648016503040201050000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "7c6c491e6fe9fd16192b3baf32127f4f9f7dc21b1d2950e67006453f472cf4ba3fd7bcd7cf6f4fbff726b4d757bba414e1a848df8759a0ed67ac8275962c5e812a0e5ee123fc87a0bfbd9428e9f5fb0b484bc0e28b507606a71a5df14a02e968bef67e1a55f66bf54260e5563f8cb14d98ee2567a7653ab93050bc443f6cd857ad4e26e129350cf283ff7c6141ed0a5c5f9034c5e3a4a740ec1e80017c9f2806e87eb946fe7c2e322091632746788d9763a2c11563f871cdf0917ffbcaefa858e03503ea4ac73c6491ae12e9e32f67f217f903f6cff2b3f1beaea6d2fe4aa82dba43d07fc1cadf48f4891acdaf8e622edb0c8d7e0eb745e02f39e69efd6803105fc8413f16e891113272b1c3800b336867a1a303cf8b80527611fa2328c444d293287b226ca32172af6aa79f191811dcce404f5cfda1084e8b8cc8f26c875213ee3ff2d758f58db2e7eac571ab62d4095283083e5287e61623ea9b01be7b2ad31e887146f73ef3a1d70e86428b33db66de0a0e12d9b6960c00d9048b266958ac",
+          "padding" : "30330000300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "43d99d627869bb5cb798be4db332583afc162875ef4200b10b0f019cb186a44894b511fb674ee02f4adb6e2d529ed86812e559797a7d60512747cc6a135dd708bc12f1acc01aaa6f6584a8f9c02351e23b77bdd2999b79660ee956e9bac5b98647068c0c6e1c5c5907f712b6993050abc872a217699ad5468cb420b90f5d74812e9d9af4e5a200212c01469799de9669f28d7b6e9726518a2c4fbe5fd1ec5ad66a1d472e8710fc5559b9e75d3aa625825886e9045c2c8019be254d2f11d3a55b9a3fb87f083a009a7a6634198fb9f4e6521d2706e3192e3e669fe201e60bd80574b5e8f66e8ea08740f3b0f0f3cb78ad90ddc95843e42bf4baac25adb2b57f667618ba7bd1c10b00c5ec14dfc3ff1f8f5c036ca7aa149f71e7560f1b1490baefb2b7d656fd6ed6e9115b9b59167a304ab7383e091c57f57e3bcf1ff57e3a4b99192b91f4297abbe9a5d94b6bac7fbc9a5bdb64657949ff0040ad276e2d9de21df2c02d68929a6c366ba3d0514b8b50ebb3224ca32ff88511d35e5ac6e51a28ca",
+          "padding" : "3033300f0000060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "544f8bc68d5fe49ca8188815dabf1c434ac7379a3796c5c78fea5fd2a9e36a71d50a194724f65cdd9c9562fbebd44f5ae3a690946fb6e528554f51353ccdc899c0c3f635bd83afd3429ea7cccef96f69cd6de7ff58ba4d22ba032bd0a113dbebaa780f149a47203a65973c27f0bf00c168382f2311de1e900253418c77d521d5c5838d4fedf6c3255d8c05051c396f0f6705cd511a94b19a96b043e3c4f95422cdce64c34767ff6373199ae1d3168b62ebc353b8c7e044f4a1ac36b1f692183729f8865d24966101ef047422c284cd9dae44f968b209cb1dc11c60cbe2880c3745862bc1c64899480ffd3229a551fa6e765f4c01731a978a1e2722f1fa0d7f235ef114523756848816cba51a561744355d5d484119faffb953f5ee9b32be692a09ae40bdd8860687197544c39535b196766e69ac8a05dc40c733a0d906d0f7735014810621a6d83a9e6234e6d2d9dc7b1417f8ff782c8f7c44c713dc9fe30757ff95cbcbd159f80fdfb86eae00bb8565d497aedbf3c4233c616ea852b60b199e",
+          "padding" : "3031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "866c67760ebdc192e302d47ddb40a927392833cf3a3a3b9c33923600fa08443da118b47db980ea74bb73518382723e375fcd9baa773f3b022d37a4b0fdfc817edf2a4d9e71987e034cb5cd80caeb97881abc45e8e6b965941dab478d17039d98c989178daa541507b84df445655f1171431da75bbac810729f973cf8f3606529c89b036e046ad7265e4e15c7f18b319a3c870cbfb7953e069794978aeabd9c20d3b8a3b9a44b68b620196eb1817d70162b22078fc4a63921a7f35c5500de7ec0aefa27d93282ce80d2ccd42c2d3ef1212c10a833582b42be78c6e866e887b8ee329b883cb08f3e374ec5064f7d1b760b717976761a44eed64d12021e2fd58c9640398e616ad96ab2e56ac95e32421f7c577e00c35b1fc95f1825a0214cb49047ede981a0db76c18e7ef8a9628702ddb4e9d5dcfe55da36857c497b44d182761a7c185fff68f136846c698b5dc0753956209c2c0e0d247b815d711d49683e9386387e82f6b4ca232b653c365485efafa988e799ce681f3c7c37275391e56a3233",
+          "padding" : "3033300d0609608648016503040201050000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "0767adfd75befa190f623ce2a00fd6c0dd2a8f1e53456489f8329a2ff6dfae00ec4dbd3156cb278c41c197bc80b260c9b8332d5f0d39fdeed33c772c45c17d3594bc37349a31a9ae58b4426860036680546c66d10d3d539ab377c2fd3ae25de99476f94187b895ef9384c7515aaf9b8d580eed7ed9273354eaba4ab57e4bc9b7b48529072dc691fd7e1a51a4164a795e2a3ccb2520cab25b8e78fa7ecfb057b05e8c056fbd407895e83cad14b6840ca773d6e6c8f2c3e7e34d77e3f746351562829a81e04450076c144176bf52c42189336313a71924964bdd34b207c9e69c424030e15e9f2daa50b4f162d2c872828606b12d71cc845e38149d76ce72cd11c33c46e837094b73905534cbe6ea9d9f84f74e9125a07c23dc32ff7535177eed47f979e7d98f62864ced2545a5e994eccce3c9ebab7c746f9a79eca3fa8523cafbe69b5fcadeafe8ccd00d91c1b0f12fc2868aeb19ba57863bea62391235eb35fa7924ba74b73bbd0929aa33862419982fae0389352840833e4c8442449a392105",
+          "padding" : "3033300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "1baf2ccfd98c3c37b60101bc5c8f3ef871937f3e4cd7a21fd765023f03437c3179e6fc9715d6ae00425c7838e5a5eaaf1effe9f7b591f588667a596c539326e8b7d8765d78bec33e057a25067209dd26e7a9d149b0e0a3ba13d7af57c436ab9bebd871a2cf4f88b26da4ac30d6aeed5e67b871eca23c2dc34d0685a7bb9ece53ec9e99228c0561578f39c269cdf19e8c98cbaa2731ba1faa1008fce7df30a1e5f26beabf6cf0716faafb81d1de203a1aae8f6ebab2b123697838b3c0896786fee11e2953667900a7ebd359bb81b340c0b9e4353af1091b008b5d5f8ecb64d75c574193aaf772be64ed106b374cb842ad62adf9c98461327f254f866bc28290b425a3ec9d8e17e126fe930d58fab0a5985d7844d85ada69803bc29026e5be9c9a9bfba5e4ae00c91afcd2901bfa399e459ba87bdef0577366b6a546b91a8bd858e33a3ead31ee07405199b9638f09848af52b21092a5690719c75b28f12b983712b2c79035eb727e928e81df39fec2d939510927e749c4833c02c12139f19447e",
+          "padding" : "3033300f0609608648016503040201050005000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "c5dba54644047fe0d229d54710c0ed4f226380e4d1ac8aa865f3e8060ff6c5b3decff0836898d75b59d6e7a6bff092ced3782a8d46af8f3861eee72045a297b25edb181d1ef69c3ae0e69da6c04fc9286e2f919a531c44af2b2cab59a815f3c02f67a1a2d0b5ac5dc1d8a1fc7f6fd07ef6e3e5415987523d06a9a6a46a6e71f8892756fb18ad6307c22cf97075f6e3abe18992b55925d26dd2fd8227f34f992358736f22ec94ddf9b1401e901931e035fabe04abde7fc3e1b3aae5ea51d5e8c1e4cd6ae0adae1f0840a2c990109bd1fd39d6ad66cdf56b9759067c10d743f39ddf608c8fc7792c753cbadcf5ae6088bcb485c851025c5d7d0f28b099977d619b5b78c3ac9ae15c1fec85ce2ade0743c11bf7709e6e48823a9371e380a9fd0c06f2f7abf6177ebe017ae8d9c1008f04b93a8588848dc963cdcdc26ff6275a7680dc0e5039414d746decb067d058f767291cd1a0ea62850496460f75540ddda51171db09e45098833e2d67e53bb6f3ff7da92b48191c0d7b4b3161bec990359001",
+          "padding" : "30364981773031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "1a9716b7cd0e7d9b2c348076459a9384544de7d52a597fda1d6227247028e21b910472a11e6f3924118a364936c895eb4c3ff4cc4064c43175a78f0b4de4464fa32c14c3593af96f262ddf302abcf7e6756b2a79b821dbb195640e8d30ce57d216b178a4a34415dad08f4cca150e39a901aa478d3f5fe4d4ab351d41a66df0e0677780f84becb4ba59655e211ee6f421685cd42616fbba2c7cc8cef92508b022e525195476fcff4357b79f292ef7e4fc754de490400364ff0969946c9c76366f17cc985aabe0fe6011e734d9dbfe6501a13dbb60daa4c78673a25d84565a1e13b7e981157576b8bd3e33ba750c9bb7b5eccc8f8fffc4ed817e2444425bb5b5d42a5d702d8b0cc093a57336d4becafcee90a65a35ef4800e0e0a5fab2018b1bb5ea153ca23ec59ba40d05b8a3df4cf807d934483fb0d8a2e7c174eb8c3f2efa7f82ac8a047d0b700134eac76a469d6f40e87d2ca2408642218f47e4359e697c62355813e7df722ef622659784406eb5ea26c1fe3c5b3e917b13a12363b20c5d17",
+          "padding" : "303525003031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "191593fff20301e6587a3e57b9228b77260edae7e376416eb8fd4d80b31a4e7326d0e59f3ad3e178e84936c66501a8fafe8f2f4c9e4ba138cd63991342eb5be66c4b6231e995d6dab798efe105f7133db0cfdebe8862b21c447a2acfa9626e4307a0c7ae0fc7f4de3c78f9ec480dc3756c4d2b8c2d748bce4a7865fcdfa5753d72f2b84b609af4c0039425a0b80ee4ebac04bece2e11725f9f766f93917f3822c94c8a186f4ff7855ed54da3a959ccbab54b7ec2a3f41073d5254a06ddd8a240a997e391b06b083dc4d9b3fe7feef65453f356c84492d3842e957ab113897ed874ae9c5ce061be8fac4da3228c0fddb7cabc89c8a2edbb3a1b3f78a8cb41810863f9b1ab8e0e2a6a2782045002d4bd07cbf0c6ce589dddac5878599be97cec0c04dc42594e2366493919c6306d1b2abb1c1279daaf85c90be4904b93064acc73a7d59eff8191e3d4d9e3a763dfdcbaea492741e2e17707285a9ab8d9aaf8d2d95cb4ee0bf1402297917ab025cbae8a201099c4c06ea7eaf0c6808d142057797b",
+          "padding" : "30333031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "105aa4e5e08da8705bd94fda6efaecf22363716f59ec83d0d4fe1a40160276a6cbbaf1fbf3501ae445be06c9c04b541caf22b58357404eeed16093e3d295391732dbbc3eec7589f80c02a5f01dd2b371197b46ec2e45723f086d6e4a72efa11a609c7e528b04a519afee2d01453d8504fe4e039dea8f5fc1035918829b59940eb97f428910186d6569af61371736f3c3aa65913b4b0a585494d386cf83bf6eef442f9e763fa1f205e49a80c35c7906264d5d07012147b557d0f8f5728d1d533b578d0a8294defe7174c3838289ff2505dda63ca7a1d261b754555572fae41db05ea1f3994d4469d490fd9d251d4b53df0a7ee9f091657a717368c4275e3c3e1a2cfb05cb64cf22d1e7d9bcabd4c91da37aa73a05a2f2092b218c081217456aa69962d5660cda5393408cdf1d2c7fd1968bd1d3232bc5fb90041dbe707b63f082c8ee743cf3102792d4b1cc9650d5d9f6004a31b3b32e9613d3fabd94395b1a01026a33fe3a42db19100d3c0eda29b849ce420e4ac0c71fb9a610c730f27bb026",
+          "padding" : "30363012498177300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "396b9f59618e6b824e1ebc57b8f18a133b49d96bd3fa39c66bc4a206e79ee7984013a324dc41d00bc469285e8d255dacd178f106c9a37f11344e21a24275417ac29f2dbe14377d0feac8061fc24d5b178762700c60d6cb0a9d3896961daadddd11712c2c006eecf154b5b0a9fa5786106e8c12cea3e3968c42a165f640fa0bcd5bbb3734c55f57d14506169d7f805a4ec4e055f5ab2f1c0b0968b396119e2d64d8eb81cd0ab78e09790e33ae752e21b1b64dd5aca05259aba1c2014b390e84ff25f2dae3cc198a7ba5d9e4b104ac6a5466e1270a1631e6ffe777860eb63120f1fe8b3422a467a083463a133ba9db8bd18978ec559676f969e5e466ff2a8f0998bab5bde97bd4b759eb3b14b8171f0f5c19a2d590a344284b69d0b08729ed67824665701c360fabc9a48cca7591e8bc3b2300f1c76e4c6c13002f53b2fd5d45da382a63c1073cc6f4c43fd06bfd4d70104c4d5e2c74ae18a5dea531f5a6c2e9e23c381b1fb0fa1fab4fc94d662db842ff202d55f8cb0732628c6f15f824aab121",
+          "padding" : "303530112500300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "82d26da118ac4ce272ad266f402323cfc25d45c885d8a8880e04a6ef52d7de7971b00ea0adb51768b31348f590bda5e41a8fff36939b59cd0012eccf474552ccbe2308db3b3910ea4856a290babe54fbdb1f482f524d3fe81d1037cccb5dfb6a570c898680f19af007abec62fa233f9396279d0c6f9e8f9bf87f7a7e088f9193febca5316f0f10e139fd010de1a37173ee90d2b35467b768625dc59ac028505b885934e55c2bda0a97f3def80a2e26f14a4f2f9ea4fffab807eb2670aedfc85c2f95f9898f7a07dc2295c4f91ce2b96134e92aa9e053dfc2cc012513e39788a6f0af4e14ca6eded4e8e7befa85d69e9c45b98ef9bf0a067e9fe8ba29314b2be334f4a5438ae4bae6ee85b6b9086bd3bc13838ad27f033208c834ddd3f48fcd9c556bd6a6ebd6ca625372ef84f6bd44dd0c24c0184b3815e893952bbc42fb790b472e89beb93338dfc23198551ac7257ccf7ad1ddd776c7eb620dd6e6d341dd0693dcd91cef175f1b3165cd7d99a2623c7607dec9d0eacc0b6c487ee1f90e4236",
+          "padding" : "3039300f300d060960864801650304020105000004deadbeef0420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "02cfa2d1774246a4fa94a7f9142ac84270792fba20b09a47f0ddf702a41e671dda6690451937b0063ce2797c2146eb68d2e84c87211cd3f9e8d169579e88e522c98469ba814c5a0ee2f0f42386d44e07c8d447b77b04fe3799db3f2d7d20843027408a4f1f08a0eebdfec3c3ef81e8d9b4fec722a5782b2e2e920cb60b0cb8a28e7ab9b8c82ebf6dc25d439bdce586f4dbf41b01a2f777ddefb13fcd0e268aed975d5aa986cfff0403b0bc260bdbba4db2b51bf1f0dd88c54b0a7a6bcbf3ebc8840e751c6dbe405d6cbf94f12820c536700ba940a70a4ca8aea4c7690e33ab09c0d1fab7a962167e5a8fc51e4b07c82312b0c97e07d42bb2e2abdbb57442e9a8520b0085af7f3168077a842195a4e19c7fca15f2e7471caebfa80f949528d81b619632fb3345bb7bbccc825ae8bd20fe34474b70b7420fdc17317f711495040cbaf5ae21d7cb70b47a2997b794de3d9bf805d1dcb8104b50ea69429f3861e61b1a0dbeff7a03432f98a8d537a03b37ac38d9838a7c6a7ed0977f29f96b858ad0",
+          "padding" : "30363012260e498177060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "5efc66fac14f6c109e9a2e219bd3852b28cfaca26f3c26fc8777959dfea55c738c5c086e819377f8f4baceb66b4980de412c63fd5a1e329d13a14ffcfeaed1d89047dab579e243b3fd6b85f87069997aa7d07f71ef40250ae307b280f0db1c30a4a7c2411ef723746eab7045f973277a174068bb8bbbe69c0773ae9977a7f20e971d405bfa5f0f975b5acc17237e7341f0ead535ba863c61c155377c47d4bca280c6312c0fdcd76f52eabbca08b442e0eb629a44a0169c6c63e5e1c52cf7e2c61dd29abb9142fa7c83439306c2c1f6cdc3257ad63d0a57ee0d5f41341acc7f452519353aed51d739ea9153bea1f6f029bc4eca33ae0511db90df1bcc780b3ceb6edf3213b0b2e20530d26bb6ba112aa6e1363da049d669266a956fa36e890464399fbc43baf7c8fd3d47ec6db5e1029bf6e603b8e1cf5ed9ddf6536bd8d6a7648af7fde533bd51cd8f9a6cc28779163947dbfecbd6f50917839b900e3fa37274d97a2049daede1525c145bfd1660d4577caad7888f5c84867c6fff30ee8356de",
+          "padding" : "30353011260d2500060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "a4e7378d2aba9bc6cebe5c8e5603fac9bce6e3c193c1675df95ab30904a149ac3f3d7a1312429cd63eec085f7392051a2bb883c0e078af0bdf29464bac2268a8139074ec53330722e1482b935fb57956214c7445d8a778686b624944bbeee7a608dd15ed277ba378f4e2dea04b33103e437f94404a09517f4327c80530a1f183e046756c166e526aeef53565cfe34122ec23312bfaed429369ccf08f52c2351e102f439751f26ebbd5423f9efb3da3d3da0edfcfee3b9607fd77dbbcd7546ca4df84905fdfafb469bcbd78d6cfe6e420993740b64e0846b5c0026990224cf3b5e1c325326376c5d6f3d1971365ff31498089482c7df06dd92f7952e0472bfd81a52b0fcb2058f5abdc70bd7d55e2d843821083bf6e8d13b3c11cb4fa420fc90721f226526ee677a8eff890b664e2a5aa5735db7e752b6c06218a1fac315d6f1cd6120a30fc46e8ac220a1bf2e6e4cea5f352ceca4ed4c5675ebfe68ab15da158a22fd044459a4aa9673a5fc078e7851170faf652c9791b665ebf62e16891b54a",
+          "padding" : "30393015260b06096086480165030402010004deadbeef05000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "616a47c86dc9e2423c5678dc0ddb74cd9555f63c219caaf182f82cc0b47fc5505afb0405a693c4b45ed670e009908b6316d22692d89798521b477d45c913cd31042b8a0a52626e1727bc36878d1303c52ead0cd69c0e9711e8c5693ca3fcadd48e2641cd73e40eaa26fb7de1aa89f54228fe67cef381f52a571c054ec1b815e37d071054b08280e940735569f452dfea10d86e742ee8db6c52c696699b99b730bcae337f093418598bc4b648276b6a7f65130bf8bfa1b2b2c7893e408a6eadee77bab6c28aecaa0e3a200da9fd4a7d06ab00c38e7c0cd7e41f64dc43526fa28e5d9779730b41e90b6366fa7fd10055d76c95cb694d07c3dda1776fcc774c2b42eced3c82c9327d6865ce3c76b6666770b625eb49d6b7df9fb1eaa4867a8b13ec1d15af66bb5c37ad8ffcb7b059ebd9f198fa9388d706efbb20d7bd6f1a2d6a192e55c5adbca41fbf1f27c9afe7f94775c123cfb7f1b13a980e86b812f5a8a848b9bc76472c52f31f556c02eeb4b71e388c7cdde33b22bf4a5ebe1e9e10a08afe",
+          "padding" : "303630120609608648016503040201250549817705000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "a158c783c6141376270cf0ab8f4c08e5a4534b576786e0249fee264afee8d92558a2cc1224422a5b33f1d0661fbd2891f72edf381f9b52aad268dfe82effc96bbca66f4eecc7abf2449aa3fb858ef5606299af5d477242cf91e54edbe042a766cf108731ad6b7b038f28a3534360906272027d2a83ae32cc0ef53c1a89e1372c50edf86b2f9f09f06e49e1072a5260cba1528e8607b8336286fee545e325f34568bb2867f3344a7fd53729da935589671d6ce956462b4729f8a1c97aad3380852760f1c16dc0f9fe9b9f64e7e0317e242cd777ecba0bcda61c19d6e21ce54f007da49e2ef35c10a0bf42ed8c522e6bebab94eeb5557df840c23739751e7cd05f02c52306827c71e14b6f8771e2d3af07670a7956eef491cc26a512a32c3a21a547925406184fe55882303c17c8bc2392cd44a77f3723dfb4c24936dc66b66da9c72a3ed5346ac14d31f5efd227b87faee10e5cd88a1ac73f67e5e6527752d55a12490afee5f500c4b12a28e2ab4ecb8928aa5c889f8aa9696e9d5116f748da8f",
+          "padding" : "3035301106096086480165030402012504250005000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "0f442a9b1d7aaebd50a48a9f81623bed9a6e57a9aafb22f8cb6e56f28086ab3609a8c13f9f676451271325d453f9e3b31c0310a38e71f91ae90899ff610bbf474138a9e610cbdeaa52985446d873695e35d1de1c777efe02eab419d8f0fd5184c850112bfc8a271307f2a9997155383a85b80ac99f6031d94639a6603fa842f731c4920c7841228441136cc0b07ae11c4a07c28b3305ad2cf6a8594ddb6fa357f17a9fd7a72635323265a9a5eab8029215d21f2b3d2ea41350d031c93bf8d3ecc314d6ed13ed0517e12df45ade2f7a3cbdf0b17b220e83031ee06f4a670b47c7d5bda77c0da7f3df5278882049582faa073667a6270467d8b4c28b5930856ff55400aa1c7f7fb52d838d5e9508b8fd4211e130dced03a6996b9afb860c066a56a6d3e1f1f7fde8179adebaeffb2b8bb91b83b7c1c56a6dada297497b8d8de0069e31ea452c0fc4f820d769c12a744d22ed110fd99476a4524caeba7f766e1fd0e0ee01e91825bb5913c0e2f87497427d2687d776e2ca91055e38fcb6be3f843b",
+          "padding" : "303930150609608648016503040201250205000004deadbeef0420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "6e317cb8fc092da3e09b63590743ba17426826083697bdd526f85d1ebf0270afc0fd89ad67762836567f36d2bfb52252a2a54ef9f753a4afbfe520e857a503385ab6c16df6d4e3494954912ecb31c514f6427b676a1c61c83ed38009693ebc39add66a1af1ac1834381df1144fe5f0444fc955334a2cff4aee6f3cdd3abe5dc54cc4ec25c5c66286e91d29a5c498872e7edbf3f4235bebb402dec4b91e629123e841dea66643f224c472f75caf31fbaf18943e7bbd09fdfa8dd908ae92631129b404f7414037d42b5914b532e7ff5a618876a550fdfb80289c5d635adbbc60e41ab577c59bb6895e2c4f02140b95a47dc327d5f414293b3577acb277427285f82dbfca53a4acbbe4497141efd0afea149a7c12b6c702fb9e48dc7dcb0d4ff1f96cb238d34e35fece1436b14592d3eee800641800dd9df1b9541435cb2ce933a0150498f9416446c95172a2116ffb58cf5f397f0d0af2e025e2951444d204291b1c04281c9242058b937b5d01f74b6cfa2d55d975c6622198c6cb271f289110d2",
+          "padding" : "3036300d0609608648016503040201050024254981770420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "41a99f4e616d19dbfec0e1e5ab8ab605ebd218c107176b2d90c58e41e01cd6f6950fe4a71c3b0ce81dcfd6f88b57e7345dcd466e43e3b5dce645ead38d0f5df81d307dc89ae059b3738b7900eda146f0ad965e67e760231ba58fe7e33d3f14fba66978e3eb7bc5dd6960b24ba2d59332760492961b5b81af6e37fc3065105915a4505fd239c79e6fa6cd8ba4bb585fe937d5d87955f659cbebd6bd9f0d0030e8a52341591fbd1624cd2236352e9e6bd91d7c121357a4af1184efd102fa911a7eb8d7dce098fbc02e34ec92d14ae333e502ab8bad7ffc275dc770913eee42a316b1fac871863e0f10899d72d0802bea9c07bf21b91050850547d6c8ff99ef52b1bddbd655352ef0fc4748c44d4bc4a4dc4ad3110b367e63620cf76139fff563a7c76a9b3a24cab86bede3568ef1524d476f8e39b9df374d1d2161167af5a00c61e0aea1bee56ae05ff1759e0826c4bb0b2058b5dc92a5c4dc865110bfa05506121ae58583179bd981100f42d1d89fd604db4f13db7ee6c49ecd381a546813b284",
+          "padding" : "3035300d06096086480165030402010500242425000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "9e64f806c7528a1cd1c8dd5b67ab67335b8f9a1ef1fba99afe67e9fb2cb11263c79dc422d51a68728464422307a0a445ac823d10021ab7789e6f701182f632786f77c23806b81324b5cd78e462c35e495532c2330a08e0e9ab7b44bc6dc5d99c70e052752a4718fff47d00c9b82c4dca22fe3302cec11026564288eda51b692f36fc23ab6b3a9091c332378be3582aa551c8471a9df5f9451291a1da952019788f461fc5262e822bf5d5e11f80b91fd8748bcd2d856e0bf7ee29333b627d6c44ec0ead86c0ab18f93ae9f29dc3a91562387a703b42a17cc4b7b310b6b6fc7d9bd7bdd907520dec948d2048d556dd6db3b0e5e95788d88d0d643c6336604d0b81fc996bb85d2b4993036635a15acab8dc486e061c8e2eab891daee57bf08563bc018401087ba854f300a97b9c5fd6c5a3915ffb240a577e7ed23c76fda89407be57aa7869db4c6e72fb69ae2af877f189992d99dc17a071894a2c6293ebc9e205ee3792c4da94de734b77c47b21c7a6572759126bdda03f4984bfeec0afd744d3",
+          "padding" : "3039300d0609608648016503040201050024220420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "71555a4df579d3970cc515fab9cd2775782e87a7eeb0cdf0fb9614db00ae74a78d495110577e29ba7d7ed8c2f71b8f476a87bc569aba9926c75811241b2a3525e6dbf3c339363b9d85511a89726ade496fb45fb476e0fbbd7bed7ac1fdc9e8948f622b2f2532cdc139fbd500f2807022739cc396023e09833f513caae70374296f6324e31f27b1f00978ad68a65a87f63e868f66589becdd34dcf732f7fb85a79a28975fad578cec2ff9f2b89fa7c03b03fcb14a0cf2cdc4d989b6131fd3ee11907f9405ded3963c2efb6c1bf79cd42335cfa143e108b8b9c2aa8f7d1e417c0fc7891456fd7ef72fc1d0d50affe882d0a31139df99a6366e7b5ca2cf5c11e7f50e2c52f91a36543c554e2e467185e0bb4fe29dda115c214c306dd450bd9c261aaa2844091796c2e8bec02b40c7876495b7b4d327c6ab19e1a0a90dce923ce8f8cd7cff7b6ddf59a011d821f2c86207b356d0badac5c1028b3b3727933f4fdad43c923495af16a23e913ccb998ba0975863dea15a42ddffff3f0b4f04a153372a",
+          "padding" : "3039aa00bb00cd003031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "a9ffef059db6395dcf691eff9ab53fdb762000fefdc58b964af85ddddbed15049cc8bb2eaed4aef8974bd3c9e65386f3a11effadc26a9f85f648bae5334d08ce23db566fcc8a6ddafb127dc95d4c3ba0d7b71546e1c010085d0e5c9e7f6d1f396b50c9fe712ca30e78dca2ffb58ac5fa5816702caea67b932f4b8669f2cd3a61a412c685d15678b2fcd982f3b8853ffc2efd841d59136501ba65707e9488fc0078bc03c318356968e7478ee3eba9aa0b186660f08b055cf025866db2d7162cf152c6caf4a3d68b5010ad9e9fb346e47cee9c95ca4dd5455211d0897ce239ab92a495cf2db2df2e1a3d8cd1039351984277ace1888b0194dde50d53cb9b05b28bd51939d95683160a9d7d36df412632ce7cd693fa89bace61a6a36347339d6e068f8a7d99f76b470f381553a1f901e5de43bdc8ebe32807670abed2d1d7cbfb212ce10fd5bd3769eea5c175f006aff33677b20383e61433f5b63da31404ae940675d3fc1c3cd39f56aa2cbb30efa646427614c2d61ee19e7d5b8ec5686a071b8b",
+          "padding" : "3037aa02aabb3031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "c3ee2d5e72370734429ea8efb80d949ad0f0281909af720183edc0f10c83699f8549fa7820631d084c812d37e17e37d656f2749721b90db083ac0334b56a413399a92977b73fe292822433c1c97b2a176722259e9d19e28618dc7a42aa8585e9665b55f3ce00dfd28c7861eea80583fa99d68c8dbd5accddbfd8dc2f74b9205059637a5a09952b03ea2ec0bc2bdf8ad211e8cd6bd410337eae3331715f92391b631b5f1e2c339dba0cd6ccf9cbaf17c30346987236366ae14882046dacc32b676d84f4378c3f605eb81529c398882450f833969c8849c489934e0225cdb54ad6539f81e276f16004761361ac114581ab1fcb94bd05854687c8117c590683d7a49f7b5d2b80287cf47e001a7c11c74583ef2dcdd096bca5a38326f87e67d4ca1b5e36f88f0f0914ef5405d49349febbfea2ffd44932b7e5b12c7eb0b78c4de0accd9aac30612f6de12e710ca0d5c1db70cadd03e88198c07731995e4b5627dab808d82e2fb47a538323a65327f236c1fb192967fcea14f88c03beea4c31319fc2",
+          "padding" : "30393015aa00bb00cd00300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "c67ba5369bf9eab5141829d0ba753245c885cf33ec6e9ce6751f2abfa172beb3db01ed0513f3b936b48619c64d6cf58cf8fb1a6b85e0771dd9450e3b4535740e7078a06c7a9afa4cc28ed0ffc695a0f9bc532594f0410987d5a308cd2a8607f231186247a89e8babbc6a2adcb71827535d11a95228c38790236ad2fc4de9fbee03c2b2d1ea809f60ac8ee770209e39b3260796bcd63187ded4e70efdbfd89606e9e85b13c26396261b3c907954bb0d7d8cfe2dfaf9a94ba6d54d98c082fba79d254592bbdc3e190c8dffd24d84e03da96eb0d291f5cedc2a9aec051be76dcc9841e6a2201323f79d9f18ddc42fd45bb64d62151a30d1111782a9ac4b8b5893145285eddc0eeda0768e1218a693a863ae2ee5a959e4249ed995f85f1a9f8692e19ab609fccb0a93e986786bd548f0bd70022b61bff520d19aeb97597f98034a5b78d6454e55e8f4caf4eb019d6aa00ff736f9a3105f9e75ced7a5e30882bb5945f71a7c8a401cfed0c07f0347d46cbdce7bc1e931c6b0d5c1488206e39dca2512",
+          "padding" : "30373013aa02aabb300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "004c3e2c6d82ddb5af78bbced9b7d3543f69deef0d7b0acc29652b13fbc2b0a256a733f8201b334918dc8354b3817d2cff4a2ca7d00b329ca88217f28087020528c6c30a75a1f82e0c3ef3e49d8335c1c354c31b31562dcc2f98e6b960e52452d0a37cef4ac21c41110070eed657f2ff30839976c98f38151fa55aae5780ab72fe2f5a254b4f83c8493001a598f2b57197fb3d5eaf439671b4d4a596f7c4a4537d5ba3937c9baa57623aeacf54cfdb708dff8aaf09a23d285ee0ae6aad50ada1f51c1ff5c5a6468f791cdd7619138c06855675da115043795517395716cc8c0d282f5aa5c46b92a2d1cf20c50ff7f69749277611a36f18271d2ad91ca371ab2e87aba74f83c37523b50419e5debd36e56452b39059a32823e3ac57929452052ceebbcf517a8733300ef3500ef4b08e4d2f6533ff3193e866dbfcfb2e841dfc133163ad3d7b605efb3a8c7715f0dcf1aaf848c4721f9c5de2c49e31e92cca767b0fd34d34c1bd1db1dde2edb1eedb119079a4cd25b0862a4b2447dba751e3f3cf",
+          "padding" : "303930152611aa00bb00cd00060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "80fc40a92375cf58a2730a709f08395c7f7a7577ef00c7c4730781b806afd5f69cc0c990012c62ac76cd4f860ecbd8b6f96c4e9a7828595bcb56861cac5a0a1d39040d96637a8628431641115a1f298c144e3e2bdb3b43f8edbf943ca9b1378f256da835a560b35fabb3d0bdfed894643daca246a6e22cd6089bcfe033329a3d18f5a27194cb8c915ba5763b44e51e5380ec4096f7cf5296db6c7ed57ef8b8812edaa10d9f12adca6dd83bec5bab1561e174226896a46d104c134b3c17c876856d54eed489d64c2121d68e48cb1da6357d9ab3128e25f16b1809288c35ae38c901ed6bd1b80961853c1d4e9a60273cc39656078abb4ca9e8afa057df58a5fa851a4dfaacac3631e2065fa8e2e423b4692dfc96a73faa7c2af3d89cf1e98dcf3e69c35dcf38847fad526eb56706ff4f9edc068be609417e60d169ede36e4a9301cdb58a408bd12eb37457f05af1f96e431241354e181f92f1199d2bb45681caf56ddd13542994fab6bdc2027775564b782cfa2cc31d305e7e70692a96182a71aa",
+          "padding" : "30373013260faa02aabb060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "756428ea39f0895138538845d40ff1a8957b5c3e913e7b475198268e40efc604cfdfa189619f60f9dde5694932fe5419b666b10abd4adf096d6af10360e1c6937f3c0ef1e37e2af4faf064831ec44d1f581398121c29c1a4b3a056b20cad0fdcc99ad6f68a51e12717f72d2981038ba2b860f7347a435a69ff01cbacf8d4c66ef98959049bf90f6c78d2215e66b8453fd7de0c2d6ffef90fb003192d053046872fbef084fb1b104a37980c2604d61db8340254b37c8f4df3d5c1ddf6745a00274e7b826398e756d5ebaf19aca16a137a6a38e51612b580ca3fcfbc4d7eef58a743c8c7862135eed1926b4592071ceebb6133eadfd8ae270e1367f705f19b44e0232db2173a261dadb3c61aeeb9ab05dded16d95b6b0ac7815e9aef31314003949e19cd76ed5d7e57509057e6031cda36d17b1988479c2bf217e21a4865743452695415b70e905f836561f08e8df78c593e5a64efbb19b42929c4fc9d875a8769895f21b887b1780dc38937d0dc2efd10a14030e43ed63554b1ffac50b801de08",
+          "padding" : "3039301506096086480165030402012508aa00bb00cd0005000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "579bb79622238ac1cbc0af03c3c0d1ccbaadbb29ad974f67b76d752b960df0928d364e33eb04fae281992aaa01fafcc0669eaf87791cb8a7142b597050afa58571f9fe78a93c647307ea0db9017e0c41a0ba712dc8871063bac01da6a3dae7d0c5bb5a40f633b45cd35213fdfccd296221a0275f3b552e56ef8c856f5bd96722ee3cd9799abf956dbcc0bde6bf65b1b2641658f04e063298cdab2029c8c0af0566878822737fa9d6cc48c175fccaf7e866d80e1e478d7568a3e67d39c3a14508711fadd84c3e7be8cc226a23368e9982138128628bbe97a3c572ee68606bf6427ee5b9862bebeaa4f6b08325241da15c9f223bd18b797e1d6e88b2b08a4cf95baadf4d684c8fcb7cd44711aaf203862ec79bd5f071247636623b88709f6686d6ef3178fcee04e2de0d661d92444f5cbf3216b07a5f6cdde0657b2d4596ed148255957b0a23e8f262b1ff628cbd7ec7e88267d100809ab5eea908aa05e11d823e794a0d1e4cfb82c76b0cf9affce1fa0fe370503accaaedcaec65d1ef3a696df0",
+          "padding" : "3037301306096086480165030402012506aa02aabb05000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "9a32e4a06f502fc0991ba84079044501b140af892bc3a3c46f9c41fa75c47745292de23fa60443adbd2e705ff47ebd1338771b157741c019c2187a2c8a08e06583a5e4d83aefb3146a6eae37ff79c499646116f2e457b9baff4543d2cb0c266fe0a6f75218a0f565c78904777fd63e1958320f084c9abd89056d118a269c11e00f199782353950c005316cd87058ed794235fb0997fccd6c17c7cf9d5784cf8cdbbbafb96d6111824e658c3bf574d123f6dfaa1ddf77f093ded9e636f5b921ba9b205667e3914932407aac17813457ba75e9f4380ba08eebb8abf5ebd281fcf5b2e5d138585651f25c1ca7194edead3507d6e69467013512b679dcd9ce400c66c1f3c0a600c9d0f6c33a56c366e56c1e413433f904eab089075ee9396650849d70faa450c1695400b2f88d42818ac212a13fd9bc2f6926e2ce92d7394f8627b4ebd27b8d45e179ad927099e3bb5e71cfe6ce275b65db98ec4fcdea0b43e2dcde6601f0a1c54de549ebb03d98d1b361be9239fe8dba8dae94cf9d1bae5c51007b",
+          "padding" : "3039300d060960864801650304020105002428aa00bb00cd000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "b5efca28b066937c2cab27c339106a0f40139a1e1a5b6d66ec3a76abb62824c06a3e4dff6bc0dd204610fdf386e1ce13c87159f4aa0e88f1c29d07b1320217347c52e58c57ccff23c01c2039c2a385625072f974b690aed9cc5f6341c33dcd2aaca6c260d5945d49c5963c4fec651423c765c973e457ea2ef33eb57b4b4eb88f0ffb66789303c725e3db8b76e4eecec73c5a466b25745ebc00dc347d33a71f787e7723358270d0e258719093736f72182ef5cf2c4f513fe648531d755d6e945b3c44843978ab009b0b6809bb0db6794a4bb2311991b1493fc15226c15739e2b3d621cbbeeb891286d747dbc71a7c9cf06b51442c8086d839f52d73a072647832309b59edb37522dc61a97a31b7bf3c63980060304fc647c5743687c15389f4d996e38c83bd9e631c3bae53c1ac35486e9348b730f066069bce7e840f1b83d5215a52284972f2258576e608c35c4521d87e9e52cc1f4f284674f1269730bafd4f5727ac61d9d179302c99ccdd4d9e024578803ae6e9fb76ab5f74c23d234313c5",
+          "padding" : "3037300d060960864801650304020105002426aa02aabb0420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "0e5130e5c5145ff0822edeead396c87963494102b8a4a0e38d9f55c1e698d677e5fca1375cf5e027024966ee4fa8e2d8b4f25cc2ae8cbe49050bd675f39be5931ddcce426e1977576f60c6b79174a763f57395890026d762df6c8db0f79f02227196606256ef9af7f6a211b38cb1aa0c2af9be830e8bfa9d30169381a22b74f138939081a5261f3b277f01aabffc2dd3af713b3cf11bf772d69d157d7ed34c2ee7682745129cc7c45881e00a235c5103c09ab3719bf56f22cf29c4e962cf7bf4f633e01dd3e49fbdbb019cf2b56475fca8007fca63202e02dda6866bad778538e459e7df0bcd234abf919b5e6713a68a9981227f8d3ad204d077bf2d70117ac606e03caaeab26d8ff04c3583967a77c63a3a7cbf3d820d650d56c76d31c71173e9577d238f1ec9bff8faa48f3ca49f531b38eea21b192435e0b0138f83b54635e07c12ad6d7f06b5ef51bf5c21083e9170e86189a47f9907a9622201cf3c689b62373f94c540206c8600ba48a049210f1ecf93757d22a70c88402a17ca6a94ea",
+          "padding" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "00eff78b2945917f92e9ba0847516157ed33cc85c64bd1f5bcdcbd62c3906c5b77b247c892536b115e6bb03ae3e692bfe94c9d6b58ae0627bb96bcc53a85975d2929bc930cda5308f8dc797d0b0d6a5f4ab5a36e096fa4e934a7854355c1562553738099640c3ba675399a9d386b6a9c61854d00f7b6fa5998bcd05191a9001987f9621d1469c9b094d72590d76dfdfaf9b9f52f4f8d28315ee6fc22550e5feeba3a41f223dc9284d26955247fbebede5a3d643b4308843165f658ea0887a9661b26a707d22f5a827f33b2a60eecac67e9c730983810952247fb903e62317d835d9cf6140559941c3cc5ee7333ebc4bf43d036983d0cd3a3dc2330062f22933c295b05e6680ad053e8f64898151c72680f4ce8af1583fbd2f730f7d63e6d00a3e6991f809909b6cc8843ffb25016701fafbd6393e65289106cca59f73bba012b0bfe29aefb4a2f458b52d4736add4c2732c7ab1264a33b9074153b5699dc5e9566882a29efad79309fab974fc32b96750f411e62ef0acde9f9bdfbc8ae78ceb8",
+          "padding" : "302430810420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "8d636450d02664f8fd18ca58d208b87ae5efab968fee42eb399f09ef0f3e6dc0ffa4217fa262d1c2cb488ef9625895018abb27feabca718268ff274a84358336375949bfadb21584dd59410c48968ed76b0f5b60e01adb37048416f1360f997d99477f0a18b367f91d68117aa9a0fc229cbf0198ee2f69493330dde8156a265e660f9169d874df428bbce40f00a366a5d6df2bfba9fd6f78da60155af0a5f72bb971fbcd64e144146e037bfeab5692b740bd61c28ccb5fb330bf5f10e595692608881ec857bfef1fdb94a1c4ba63e50ae0dcaf2de94bf50c7fc5d8efe099a51785aa42638d07cc0c23f796bf55d6032fa3027afa5b8d6072aebbb56546f15addebd36495830d7c08ce99533343e182e7d08031b95e50f729f5dde2d276a1be47e93d66ae45547fcd6e90c9a5141439c5a5d3b4000ce58e38ba4809657a622d9d659de3eaac858b6e8e34d16997a2fceaf43a9a733dc67f272f3bcbe560a75542784b7a16cebde20bbd90218466b5501b1f7299de1d9874f682fa0bfd41d6d54f",
+          "padding" : "30803031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "633e28886ac6e7c2c36a69e3c1d6d46caec4d115e852c8030ece2c5ae1489fbd795affa8478b23f484b22baac6d1571f6f2f33f36fd28c66cf9b2c963f051cbbbcf5c33764bf54867a757f6c74bf6574e3b7778eae92b55495bde44a9def4d1a31fc8dc783d60cc23d1e6ca973ec0832d6979e56a42269d6fecb6bffc3eefa36e2c340f89311a89902b40d2179e25df9c841993f245fd644b0bb65e5394beb84b1544fe878b165f2f6bf49b77f8ca4337c60be4a89bf7840dc642da1937f9a933276320d0488bb6cf4535e68cc4a558c95fddf04c65400500fa580b476dc53d60fc33ebd06191ce23ac289c7850a9f6c96caeb68732bbb028f10c496364e673236e55d54eb6b187d6905c9b894b7222b68d90b82da7bf29d1c0ff5a2aa552ca13dd49a9f50d7e69ad40cee65ec7ad140642002e75c3c6cd55d5892528d2503b33debd4be946a3c48d7ba46abc96ce2e79396116c329ce4e967ca28ebd56712fd6a9de4ce1a5ed00df621d18713d508f6f1fb959e2ce8ca9f8eec2e3a5a80c771",
+          "padding" : "30353080300d0609608648016503040201050000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "4f7025ce36f71e0b1c0a4659ddd25396a83e4911287700bf27f72ee19f8990235af6d6f33f3b3d3f7d400370a914de2ff23af964e4eef9c8a1b15a63d38935698ff70b7c2d2d2d34cb8bc82133d70fc1fc3c19d9f47f0fe463393b60a61fc19d49f84385836278bffd710a7ae72005821718d42b2f195b6a3bb5b1b6862443a84d6a4ae04449b6bb6b4347fa14fbb4ed802cfba5dd00aba3e5e1fff2143db0acd4e50bb9951460b1e6ae5608ab642780706522e971aa350b13390df5aec8585c3b4c2bff9b64c5950357fa6c91f88e981882c52a8d93f156718af5c91c7009b3f57ffaf98d9e280ed51148d5b2d0b57495276fdd8a5fe0885ce37426760789e671b4cbf64e2e21b6fe4a1fd3f538675fbbffe51d8cce7b74c9bb9c25e9caa84b88161630a8afa49265d172e68ad42836f6b9b619fe32a1b84734ae58f09a0d8c8a5f3181a5130a503306bcc2535b0cb325c060afe57e29c7346a5489f9dee3206d8eea75e07514ca3ec547c816d88a4e5ce4b7e4a61b3488d2c13eaf62204766",
+          "padding" : "3035301126800609608648016503040201000005000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "90db572ad2c25dd02aee6f8e0ddd5d42f5434b9b59f0bc7057abda8924c2a061404f345b9ed3e2fd0486fe34e2be725bd9446f031071c4ec13772fe468ab4961623d16469a5b9577683f20035caf524d557291b700a6903dd6c472b50cd09455779289b990e86ed6f7135af290b320957c93db1a34bd66289b5304828a71d2928fdbbc3a90af3884fa2f710455d2e909422e66aaa1c01565fb67367223f2bf30661ac72b9c6a84fbf977927a86611514c0c387371cd94bb703f2325e3a11cf83cbc6727b5bd49f6fb31b7238c1a464b22ef6c5db0dd2d5039ab3d5a4a7b1ea01cae494c5dafa48b73a411c982389abe5fb2de35d6abd5d9dc33e7703f67d58feda3a17fb6e9ce3200f44fc614638f7931099f13bc175164d9d68e2a4d38f2c12224fe136fba4e7fca1fbfe3344afd2f52d8812624a1af39c4f128e1c9c1eeccc0ada519f27b694fd982ffb6467f791461a2b803cbd298a4467cecaf274f855583ddcf470092f642edc79b23eecdf4067169a2ee72ae95c93e3ee5d23ec407185",
+          "padding" : "3035301106096086480165030402012580050000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "a2f7d989b2b509b4d774f5de9acf12e5eaab05684edeae1eb42dc090356e58b8e15a32d8fa313252633a8356476327d32915c52449aac56fefc012929988fa5cfbda0d04d81392eb35ea340dfe449511f5fdab774f7e659ca0a8c91911a255d828e00d93d64638f805d63cc926c17804cf1d857c40be5d10318fe06bc311a66329128bd1102756da5da819afaed6ec6864287c44952244e4a8fbf98a90ada98bc1b5519cb81173b64357ce82f29ff16e5d76a929d4b7db51d9f3a7f4c91491dbc6a0550bcaf5fd37646bd8f71ef459540ae8eba668723a81b941939540d92c4a7f9cb0543dba1cb7969c4d644c8f15bfc13aae4a778a81b27b82903dd223ba4d5d5c157a35371ea1443788d973d953318b204f232cd5c53a9a2517d571cafb62d3378655dcde55f46597295c89bf882041ba6f4352a88dd7c1748761728a2d8dd628433855364024d42a0097346443459b840415b5a56934ea476c5f9de84419d564e493c594a9049352ea82700b1767d75244ef84ae2c8a3d5b1853a0ad08a4",
+          "padding" : "3035300d0609608648016503040201050024800420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "5c662670149791048df0ad6c95a119bfae057011d7155851087c0085b901dcd6e95252391f9661159f909def924cc165b140f02db3863ebaeca40b57ad68cd77459ad258b892c090de55b93cb48bed9a96b5ef294e9c73325e4aa595431e780058a392c0b9d512e3731509fd537df0378caba38c3e20d17e3f8c4047181becf3a505acfca94a961cc6d952b387175e8e4274b81acb168f63df180210752fcc72dce93ee2e23333e547f4561ffaac06597757712ba8ce776f0a2c714c40be54b562ad693d631aa1c3a840c8749c833401e73dd05a9592a477dc43e52d140af0b2841a14b945a10bbc5e4d4f47dfda159646ef1d49d39054550dfd188203585d0201c33a42afae62aebccb463e3d2dd8748b8db65a3f5aa3ce7a1b227139041bc805b7a71144510abadff548318f9a76d8a7f64eb9d269f7739319e9a3da728d001e29628ee1366f53b752f7354055ae2e511a6d9fff4c9b1caacba36be1bde8fbfd0a4274145ef6f122cc203fcad66d8f51e97b0f8f25a08ea8c9860849940fe4",
+          "padding" : "30803131300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "30596e00b2ad31f266f2b47b598029146aba9d0cf372b4eccdc5fc9f475c36567e6a159a454b417c77b7bc576721c52f64a31204279d524409434b73de9ae4d819390c3124ccffa5b4aafa135fa753e71c1b3b3f05ead6e6899277d0e994ce6111f61f2464155f539b8871ad0167a30c234e0541b1f39def8deb531ed476d81418218c682dbbbc0f4c3cdfd674c5e7a7bd057eee05a9f1b8b796260380e38631303d227cd9df7e76fe9cc161f8db2d9db7306834b67ecc33ff91b3c59f35f789a65b6f1433f1cffd69545a146fcddbd047a847f55acf4adc9be2f2595faeadcfe39127edeaa9a1144a5a726edeb7b1a48fa900881b157f7f3516f47dc0c108630cfc9304a2acf821a93a867b063217db60c0514143eb53557ec8f86eb8a83a83219f8c3310baa122b79d49d48bff90492acd83de8c3b9d5f07cb2d061b243d813cb1be42c658e2ed52a9b31ef07360df5945406e7c81a80337169fedf5ea76b25a69a1900a673b648831745f3b04815df9ed7d71acde44fe36aec0a85a7d6ec5",
+          "padding" : "30353080310d0609608648016503040201050000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "23bbc7627ae0069673b6de161c79fc721fa169d7719400aaf7d60d53773649bbe5cbeb4ec3b553dbab1b0cfe63142d21ad3a46ee475b7b50ee617e6f58aeb6942b0793b94ea0dee9347ba233b05895b457d478449787cab04fd0c4b01e025088884272bf060a82405172d8da5e0b4e070c61af641d311885519215b0fbc4947097c765e87ee46a4a642bc44b7212bb8b64a2cffaec496ae139c248f6b00f203de256adb345be3f46c11bed0811bab43961e9d78646cf14be18b891552998782a413b6adf9829bc47926178ca118ae0722af0aaf6694d5aa64bf970d530f71e309319dc43f2077fc66afa48365d90061c0e1696ecd2ec29a15007bbb47278641b27e10a28b60e4e7405fbe5a05e5ffb8c0a52472ed51330f169440dd10d828f1830a23dade9fef0c4a2373eae849977e1cd15054e4ff004b9daf6ce8fe8010f9102d09bb4b18ed4e30cc9c3dae2629650e00f139eb433138fb49e2a896dea8a13253282d8e42c1dc42d490b719373b3c723b8c991566474257e96fcd0027808a5",
+          "padding" : "3035301126800709608648016503040201000005000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "37a98cbe608f10cdefb4d787a23681902d7a3a02837438ffcc778091a12dc473aa6cd38d7abe75c362a877456e4b29db13659b4f3d9bb1ef73e0cab33ec2b11d06782ae4ca0a13d15f8856223abe0131f5ec5437b2b001e4f5903a78afd4c46d6a47af171271f3a4cf267b0afec0a1f368a789f4c03193e2f365fe6c0b8dcce1b2f1e6f1e0cbd7c6f1a98a8ab747bbd27485aa61ac84e837a95a178efba0b23725c53f00c94b3cee6831f4d000ecfe84af2a63f341e7bfc2cef7f5654d253654139245c4205c0b2418e8de35da690a8884507134a0b2f0bb9d20eb8f39fb134adbf171f1a8edb4e1489671005f8474708708d1a627d22c76b8ed0993a9c16a6b635fc090e3b38b96f37b28ec44089b17173647eae6ac4439bac2019ae8b928d094665aed8ba0ff89c308097b1e7ba74fd2579f1c21f63296712cf4f5405cf0f3eb60ae1600a5b8d717a09ed23034368c9739ef2f880c659bbfe855f809adbe231ef20d0eb6300f2b6ff02e9f3666876971a9d41f8f0f8fe954f00bf52c0ce013",
+          "padding" : "3035301106096086480165030402012580040000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "2c269aac4605a5e25a660071fba9f97d4b9e4c0f0d2e567459e5620884f889cbfb33ea6094feb6d2817747859f8c203c548d5bda97821c3b6744711ed3f0bf02954ef75ad6b9afcb6872273f1c164ba168db9a8bd72d715bef221420491ab6b67d5f4847743770ed4136280bda363c1fcc2f35ddadd1be3093eede6922cb95e3e206d02d98e91194a7fd39c304c848c1731e1f90e8a9433db71d94e7d76d7b5f2fdabfe20e8e1ac7deb56f81331fedd7a7e9ace76887dba2fcd72ebd2017f5bb85de1cd309b3b7f7fbb9d8901f61bf8992fd9a63f861e8054c9d4fc1472786d6efec3cf4bd1543116e2bf36698de85a6a3c17c200c73001b3218e72b8bd515f9f96d9ced500a1c6da4c0173f35ba24ee746e51cfc3ef00ce60441031bdcc2742d981833006bc05a513f1cf67d6a9e59ad4acc029995608fd05b744d48be829148552e13c7c76450f30b5acd4fab819a71c158c82d587fa7e839c3959a8150395f567387024f7b786006ec0b1f6960d3b5de347742eda16bc76e3359becd2e184",
+          "padding" : "3035300d0609608648016503040201050024800520bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "a2009e307ff24560348c7d796e1d69c5726c8389eb26423ce21cdb701623343a25d2a4841f994f3933fa82242f9d525464e3b6c770584567dd8bff3ae75f22f94139a9ba2612063e8117a23adbf72fb8c425aec994219c16d42299682eeffce61f4a0663d173980066009d542f09fe1186a28698109e0d5ec28ee2848e0a91185b492e53f67123c3f6d81826a943c60cd888e7d332310838f306913e3321c5ca89794f27a0ed36c697abcf665be1253637cf2226d7591884a9e7636b8f49972df71dabb14b6a4cfc4b4689e3c37869043bc0d802fb906a902a24b4445ada3b51f7661cff461c4b7b5a59c1974a8fda528039006f1a860eef799f15f606ec8fc23a20d4b80c01a639d34b9de0eaaef84855082e443f9a85964766473326d6ab6bf49f198c62269356e28eb920f858f3695cdcd77f3fb513121470c64c25f305a00977d0d61ab75143bac7eb57d9c99c8d51ddeefc41e3929f35da3dd544f55d878a9abdc0ead983a08d3d35d54b2afd653f61ddecfbbd936dc6d9721a959aac0c",
+          "padding" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "8431b3c74190f8c0086d779639fed56544ad0fc422dabb1b5dbb600a7021a2e25fd9e69ef305d0a3da9af97e24ecefc11f515412edcc6a6685b3c4e8c251386a7728e3add07ccee395a851e5c1330fdd05c033269fe7a52df15a1e81764facb46718ddf598a83943d35716e3fe1f216b2e17075fde3751148290040a56535eba7e5d05ce7738d2fc7f6e8450bec68a0a35a5cbe8aa3ca0adca3886bcde8649fe491c4629be8a1b8eca64cdb226eb6a0e32397a7e0dffca2fe7b27b99754a428ba300cd62d0ee228e925d96418e75138f56d7219198d04dd7713c8e8d606d7a9bfa9f1b9d731ab9e0ec8553d1515a32994ef29f2d2e9c1ce8a32ebf8d970121655810b1afcb96fbfa0495c39b759921624498acdfc8d9abe95a0693e04ff6eaf8939e4961c32b86f3a5af479d294d6dbd01f90437cf6f830db644ad9466262333829fc2243ed32ca9fb08b9b56633bacc450d86af6b4733034ab987db01a118c5c41b9b792a83be1b4e068216cb642b11075a43efe7e3a81f0872c4481ad696eb",
+          "padding" : "302405000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "421b2b4795661bf967bf5e679f69d06c0fb9a02192d839a440d364533de5c3f620f8531a68603119ec4045391c8f3ed297ba295bc1215d4c4f0f315a73b338f31547c110d4fa1e3deb385eeccc2d57e03c0f6309f6c3c28e4d837d22787bc0b6d626201da55b605f4e8522ef75b92dd1d6dfa0a177b0e666f04fd211b713fce8b2fdd96bfd4c07e64e4b8253289e400da12fd99c2c0620395208b7f2d04a2eb696f9992b0b0485e3147c5b18aba35c8a90d10b0429f3fec71e59d019f270a5e0cb0fe0b5eef004461b5c6286f33ccda3ef358d99784500084cfb5c9d3ed8e1c5327c4ce81eb1ca34390ff613807f5a24e0428eb48c97900fe9c3dd68d201a1d2a55a20174adbed47e53a0d0f032acd4d65978c8afb55487af30439bb2f151e343a47b2ca3b5e082ea741e375885377a2e3769c712f4d4144d80c2a6f2b1f0fe41e9fdf9bb43d7370332ca51bb2f1325f4d1aefcb5dbc42614f9cf11a4ac72eaa350a9c2222a6e2d82f6aa29df12b33979fff1ea265fc2a5055600b9f96c8688f",
+          "padding" : "2e31300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "365aaed072b2d0e5135c82f25944292872f60ed39152eb19045b209140a4a74fb2074037dce30d674e0fbc8e98011ac681204429d9a5ebb8fc3bf20ec70e6b53cfa45b259d4f1312354dd5a00bc2ecf4e99b4434212f92bff2b99c94a08a1327fb45dd3367779a12d8dba9ca846b85c6216add315fe0b17240fb021bf61970446339dc93ed53cf1c57242eb4aaf798a1b8010e9471f78b6f0cfd7a628ace627bc64a4c6d853af0d7ff00500b8c682238eb37f59972ff87a9be9eccf69115475ff45ed6daf9d462e09ccba899315b5dd59a3cd5c3ebface31f99854e0475fd76cc7c191ec3f13ed7933663b3902b0cf7ce7696cc9ec28c13df6b9cbe9182980f7dbf7ebb603274a56871de960a52bb5835f4db71558876202b8d9c4edaa35df599f1c6dd105dffcb077a7ad8f7748c58d6131546694bfdf97a645ecbe3829dbd2da1263556a3d29e92a810337c8c1050686ae880314b3e808abad278c48655708bcd2d711cd93f446911a2b323881c98ac389582fe0a9601096911a8ab0dd8669",
+          "padding" : "2f31300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "24a95969a4ff4982bfa2021ee1ee009d2e4ce995e6938fb48ce35041842bb516ce21f5630264f3f7140e3135ea5d01eb0ea6aa6c3b85ea5f64f1de1de246bd6dbafac9cb0a8a0003c02e5eb68714d569c8036bd604aa7bc604999a85cd3caa209ccb12dee3b89dde2c9bb74f0dac1458399cacc7e4ce538dc3a5b54c5bf7d3132430110089d5b4731dc91c2711dbe0b46b97ad7ecc948cf5881c1473f5b6540ac62963357680f1b12a09a21a957b512126c7457b0635c185d36090696c313e8cdbdb92ddea8b8621d1a640bb2636be15180595e6373c04ec38f981f05c6e255a327d9abc3b3bc04680e277e593b04d8d89963bbf83574a5fb63b4aa1d06de63e4077e8f9242e886014109c3360be74dbdff64af766224aabbec9c0c0a2ca79ce12765cc8334bebdd1355164ff636e24432c042443371f9d7a4ac66658dcbcb001934ea8b896c0bfcd7e5ce140ae265d253180c72fc9fd05b4dce2b6b664b1c9852bf84eac06ce5d237f242fd2cc6d61a870691df8e9b5b0cbde491edf3c8861e",
+          "padding" : "3131300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2bde28ddbc4e84009a9c98c71f5e2b7ef6622d0283889c94a31b25074e8fc2068aa26e4ff0057de239b4588d0421b8351f8473eb2e66c4a2ea28a4ef81613b5216059b35c2aa990c7cd398f1edb7c93723a3ab489f7a91242977969c19a2e9bd421ce79eff960a06c52f05c251d1e8a1d4e3c799ed70948a6ea35f396f6d83dcf8e1c59604730e0d90c2704a9aaa2dbcad25c9c3c559a73b7092a016e6761a65d41b878a5c717ba63344cb1adc247a92d377345cdfc24b652516de0123232d3b0092cd3f5d540b66bcdc024a728d781536ceb7e41fd80622441feebe4fcaa6931c54d67dd28dc664df83e3ea2eed769e24ef7b7ee9f95f36b31984924318d506635f31efd096aebc8a3c04d6d09aecec36484012b5a5793a2405458a250897d246a5829ed7d99bf1638fb5225cea2d0a351fe08aaaa8ee724a824f2b6ddcd69221f4a992ea5edaab8969369f869810b4973cf65adf4529f68d1c0fbab24fd1e80a03b71ddf702418d3452a27b95752a0f86053d29b63b1880911f657e4fab978",
+          "padding" : "3231300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "88258637f7eb07cce4e8cd05cf23340e796bc7e067ec5e74bd031a7b870e87a40597be7ffa8eb135297f6c4e4e19dbfbccc49a23b5a7903d1c8cf979a4e0b181cef1c48a7ecc5adb8fb614415f9cc727d2985b0eccd51f72b714f2ee8a1632b36791a29e68b88a8f482b24e0596ee8c9d4c504aef0820cce5f5a71ee3c236931aea720ed6917ea7b41d13b50f909fa21f07e9cd9f79454a3a1996cd5a35bb92b4a1b1537afa65c9bb67091f340b47f3726407b95e68ebe8d4aae735c7802b559179c64da8385e72628f29aa4e4634777e6b7138f6206c79765dfcc066c034977118255f8c82c66425b5cbec3cf65f952f0f4daedfc2acc204df23a707a77e479d33da4db067608f075e29e4fcc3600819881463f071c0b879251c0b83ea5938761d7d63688006e2597eea88997aef9aaad009ab9cf54b4390eb808b09047a759224835e7c282b301b09007a15ed23e93a33e25079b5079089428607453ed25ec639a513311320dcdfbcbda5fd0f47f6035f0c995a7ce980ea7b2e74a4ea3b9d4",
+          "padding" : "ff31300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "7bcd19e6ea965e860485b4a886d032b2d79971241ca2c512b781822dba95d8db8ad9ff4586e9f238c885e464d8e67f291263ab6481e93544904da7abe00cf7d312077447c7b0e5026114bb732191a06beeaff6a05986a02919264396b8f0ed1eb9bdff5f2888d63d3d66515f30665c9963e13e914feabd50923f674c31091d71b2d01328c07af2d9c4da3d41942020e179420f3d6d8265ca1555db51aaaf281ea92b0b5b9f8deb982723825cae17a877e6f0544d4fe48f8fe3db3a7018691bdc39ea7021ce4d2c052265b33a1a0cefe72392a52086f673a10dfa7240d88001a4053bf376bef41881c27510edb203ca07d8fde2955eff7bec85e9a44794c0fa757e385c376e6be063eb90c23a526f4fe4b5a3caff01ec148bd725ac6ccd8cbacd0b336185c3d98804bbf06626bed831afbaf3c106a847fb72a60e39b192940c898020137a291c656219c322cadfee3100cc988b98da6d203be161945e4d95d455cf73b28eccf5d6f9c36516b1b8a1dd57531d8bb943f3b50d04970b0c114a2a86",
+          "padding" : "30312e0d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "43f62292e9039df3d1160af93dbfbb2963efa6dc905aa967bc765415a74fe4a95612b53866c56c6ba42eeb76aec0a5afaefb24ac7a4eae23cf439918750b2496579c33806d9f60bdec575473371c96ac56de3b1df2d00036ea9166341720d4e164a9bbad13eac4f9364882772a20630e2b067f7d12ae3b02385a638ee562570d4b4913cf6d1f9ec6c36f724c545ffe7e0964d57531925a9de4a58511674f6ce271cbae8fe4d2502bcf5feeebe44aa6a6a6757eb3709b139569b40c019dbf0667d0e23d7a4f93075ea68a303df9aa58b02302d753089fcf6628c318a80815dd3034e5c67cfb88cf678ba1134e7aa722452c0da20328aedf3520939afe9dec999691dc3411f75815f568e3b03b8f8e3c08d99b958fc6e463fc512c44e583f869c9154d630ededfc507dccd68401ed8b37dc3f8c529936d5ce94e6e6ee06115c3d39ccd85e86ec0c27087a82774f05a031677bd5f8d5440dde337b860f00deb788bc9e81531bf7a9492ec4af8ce04f3c94c6746f8fabaf9b7be9e089ba956779d9d",
+          "padding" : "30312f0d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "73d4d40da6efbc72e01d95c3504c95737fc2e401ea73dcbc56b2f1f784b54d0c4587877137abdc84d67383ab0453f69381df09fde92edbb90fdac2b54451d76f00b5c553949ce6e39b86cd5a5fb555f231a1dabf895ef9b7c905ed9b92e333c0af57437662ede62093dbf6c43a8482706853c0025fc724ee13d17d6f052564550140c52cd5f52d98622e02da82ebca62423270dfe18333a9f202b9f6aeaa84bce014c8ff323be51327ba1a7897911df7172b819307bcf09069a3fc1559335e7fdf06f082dffbac70a973d70e5f4210c91744083d5113b510fe721650b3be52bd003b30372d56fd3268bf6aa0461af41c05cbec350f771eae198ef315c60c08dae19b0f31d3ddeaa144cf9940265660c34cc579b4b825616aa3d234d600248645d778a789d7275166cae5cbccc14c3d81c26596e5b236838ce6cf701b106e584d96b1bf40a75398763128d0a748e8f0548ad1d810a00e961a88db49898baeff2ccce4d56d3b0f059ec5727d03ae56499f811705bbf6ab41a1a3683e3debc5a6f7",
+          "padding" : "3031310d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "bf8c782edff2de8dbc7f480a9b29f1292a5f1ac96ebc92670aadfd369ec83ad35987bfc0ab3915dd388a504ca34ef43f0ff55d52e891aef35c47c81493fe6ef53a4cf5de1e415278e63339110722c444c6c2eb26becfd6589f18f2925dba814d5e63a098bfe8882a3bc73a9a184e8eec0c8b7db26b4524a7b3eb3975f63fd16bb461b42e0aef58b7953fa3ae09f5c8c38c4528fc48199fb652b27bffa9c85ebb162a0943af6c1e2ca954e44594157e053f35be8d40ee161dd30929576a2cbabc7dd0cb6bc3305f41dfb77644f32c67d8f04e7d68822def40d341f3963a12a1acc16338d3d8229ff500fbf6849b2507b4dcb68ac7c8e06a076450b3da320ed8673d86e7bf7c91f8379007ba05303489eb9537bf33c275845c923d3881b4a80998e7aad5b6a9f113bf157b3aa96b45791937d9038f94569f1fa753ec9ad612f75bc89fc79fa5d26711d39aacac5c05b06baa5efc40d9081fa39c2ab8de2bab3ee5023a0b668e17d21e470cd1efaf5e7087d440cbdd7b447f5fcd9046fd9197acfa",
+          "padding" : "3031320d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "18c76a48b8a07eb2d64933e6d369bd7c03cdcdf1fb3bb15367ace58ab1539c3798c1afba510f46b1f621c5374343d55e11cf82fa1da003409702635c013481fd785b32e495dbc0400502ac60b82269bb6e3b9a405f6794c34fb801f920413d7e243ab31c1e7e2bb25619e66a016c948a24d3fcd24a63d45f30f0cc41f7c963ced75755a11222095b3451726708b3d255d60c47746633b822ae2ca83ee50d7dbb5bedb2ca666a80a24766ff121b6495a26cb9ac14e0f11b5a17367fa2ee7a3063717e4511a7588c2325e5c9a479db77fc799b42a9cf0962d9fad45ed2cc750bd30e34a088049ca942ee1a83807151986df4b2e70afa7533691171dabfc861baa5ddabdae2db6a3f07086fd539fcefd4694fd9764af7d5d38a75c3a47ebce1820d1a15cf9791da6c194a4d1e3d9484773c256d48989cf800a83c2aa82fd88fe5fbf945856abbaf0a8b843422bf30f933de51739d583ab7870e0402c1c0d8fb95668a35027bc40a2164ea3938e7891fa052b353d87939724bc6e78c3950cd25c3d8",
+          "padding" : "3031ff0d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "89f4d0a739849f213436c9575620dec5f5c2d6a7e4f83cbab2a57b3876663af38a0456a1106efe9937f5ad6d8a8952ac24883918e91a9d19c07b5fb67ee7dbd1716c86ef7f45c651e74a41233eb01d0ec29c7739bc93877fa5a880f5e27dd28e3e58f2c034c6bd512b9034625cfa60fa1b1b966ddef324eaba49f07fde57dd751b22a132cfb50a2f37c69f773feb8637be2296680a1b1511e76f5f31154e6227f748dd101fb7ce4dc4d78aea619ac06a4419c23e2c7a6025f3084c65ee4e2d898f3b8da4b180f592a3e85a3fcd04d788fbd55e7543789c177076918fbbfd0b9bbd69106ecfaf980154b008f86418285623bef88173d6e21de37fc433163f719d1a5b59a69a7b3af6e2c5e8425135c9cb402db577bc0d57bf9e4a2ea6792e59f22149be5280f19f087f99a5a645e7058ced09552f7e324d1d786c939490177c6c882e53332fc64c24b95866131c0e78daf801a8d94e59e1b339529e59fdef88bd1440b9f4928b1c68b57ee8ba22191dd423c32fed56bdc01ad0c14850061d080b",
+          "padding" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "75fa1d30a796ea7e6f6225bfc9001a3d48ee2b66985772624f51f74a4eac8fbf0e126a8a21e7904a4668c37257a2566f6d5398703e160c76fee8cf4510ec4b4fa38af5139a117a40cccdf5b2376da59ccc1030ffb37ecb65e7cea239eab5369c4b20ddaded7b4eb5ed79b3d878844217f4094a536d824b2d1b9960b8f9aae9dc42fc5c9266e0e15a503702096fb725fff3bfe4eefa8bbb232ba28542bcd23f434dc3b3c8b827ebea88bd1e5058763260c45ce83915d7f998b3b557a94a41f2d6e10d5c6c0881c5080f51a20c8def82ecdf795ca5682a4a4b451f627e26f1a0f4c01b0c4215d335c753908ec16f55290fdbccf0855047280c1f0e226199897300e456ecb74ee14bb1b68ed54408c5a3932eb0bea33ffb2f495577f37bfa6daabb8971bc227cbe817efbcc618f7365f5ae49b51280cce5d90a085fcb2568c7381943a93caede03f492869a768c7178abd6d8c051501a81eac5bd87da6bb0424655356d5cc86f0b04a598d83df52680cb20a49aec6f9966e03feed8de78c1e06b2d",
+          "padding" : "302430000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "afa99ed41a02fdc5677826e51db78440e7336159a829d315401f799bcda6eb283c2c442706e8ede5c9641a50f735247795fa823d257cb8342315603904fcb7f3fb94c1d885917b938bb57dd8114effb76f0ffe53474b3b6ac909b8ed94a1ef4886b8101727038f2d3ae6daf82a3e985ba5e005998c31f888c3c53aed0246b99dbf17d12c59c02befbaf580ae4b54bf6cf4098840d86ebb406df68b871ce3c6a6452fb936c975efa9b6b40b2414017eeb8cbcc58fe3547ebb16f95efc24cceedc374744cb102ba6c2de6b6e53d561c5a6be9525df8faa7756a2e7af39950013289d08ea48dfea7e6fb0e7f228a8ed0c19e229f1929fbac0e183aeb196c46a5c0130233d78568736e6cf377e26e3155576982e3d65e08aa4def25b1a1a5a225cf884145c187818e71a989e0745eb6fbf1768d6aa5f0ee20d8d534e1f4f17cfbc78181858d1e887848f359a92b44a8344abbf720e9a0a195003e6bd881d248a80982201f97d524ccc159d0d0a371cb5d913429cd43d4416d9d572d49dd140c00a80",
+          "padding" : "303530013030300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "b5eb805ad3344e51dfc3b5aaf0aee47a8114587e54079d1717ca04e3e0786681fb9a77aba6a915369573714638b408c4574f8951bf38ce7ae055bc95a078dd6c68af56f33d6c8e39e61c386b8d5d148e94fcb64b2ee4826004509f6c033978b75f403b8710b16d4e0029321e340c03dc4ee0cb2e4dc112c1199a9de821a0d73fe5ea361a453175596e0c945ff0812b5b4c92bdf3cb628637b4fca898b09be06188183f37a59dd33398b786c8ed44a0f36a3a99a597071a17b432c76420d5a68d683351d85c6860572e5213f45bb7440febcc4ba6908b3920079021d03c0befbfc0169d987d5e19cd81267aba56684be25b8b94e3f1229c5757966938b63c66ffdf0f07684214d415d73bed838212612d3cd4071a53ec43cbbc5d71bbbb60f51fe310c26054318876a5862033fc21eac0c1ad91f7d7eea9318398b2344dbf3c2f04574a5c3db3121971273244ec876a63363054aee10ee276e8cca376e60189645e3f67517ef820b35c930485479403d697b2a72689fc238f09f60e3b598ba562",
+          "padding" : "30353011300106300c0960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "0f058dadf6bd5ccdb3c9a70a4223439936ac81daa5928d09c182995503d72b8077dc01ee268658e8ec4da9097cba57c19d005243ccbd98454ec42bae8f7b7ff9fff4af6b2382a271931e7ecc15cedbf52d1426cef27e033d58d8e153341265552edbebc46bca1d8e88bbb9c0f82600d29c02283fb295caf4a743fd66f096b3ac12d8f301a1a1464a511f1e5da7e46f722919836ed985bdefe7587391443b7e9f6dc7193e51f0de9e0be451ee335a39b875be4fb6e54ec38d59aedd2000f6149dc1e07bcbc6f674baa3d9170759a2db41d6a1691086da82baba102cd85d97476beec17ba3c10e82c213ec0d09afb4fa70775097df3e9c911a2b8a8e3d70f55e4236447c0a539e499bb4f442d218096ad35b104270205d6677f37f7d96266bc180936c1fcd7a34f13976efa47110b86cc4f5b0e94af73887d31d37fc38f84db3ff7b06bf151f16c0077921179fdb52ee89414dce82c0248a97b88eb2aece5227078877148879f96777fbe7fdb1aba00d9c7340f7a66812a080ad1da514fb1d7855",
+          "padding" : "3030300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "93f7909a8a46597be65fe76b5c724bad99e5b2692e4a6a8e9a7adcb38a39bdd7f4048a00edab88fe9316f532b13be7283bde8f7c4ffc4a822575e992cb8ae46848015c0ee56817aabe22ffc2f25c80e04a0664a7e9a82dad7b001e21b5c33f08965d80a1c4bfff52efbaffacb74b0a9c10acc384cc707b5c5295fdd3fad5fb3b89271f8cfe0059c0317836b2a42640e4c0b3969aac4050bcbc756b5350dcb61cac15d045151e412b6aa94d082266e7f4c7dbc83b2adbe817476eb6bf5a07cc7f76fe80b4135e0ec5bc05b57cc823a0b993b7b3e4f3a6803879754220d7a6ddef0f5c6944b352ac5064b9d836a2565eb0e2049c9208b797de75b141a5f6d89bd6dbae167f8b1c7fa9a316d10d33d96fad6e2692b98d42fb6fb3d79a32a7a5eea23f421c5e1dcf09047b77b253217c3674b97b85afa0162d818e569d6c6438235f404e8fe9e3b3b7e38878b5bd296f88758b917b7d7cb650e6ddfcee085e52fa5143429b678a3fbed73b588b6b4cebc72d3e23266f8478d52629cdf1a80ba37550",
+          "padding" : "30300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "2c40ce5377f098678cb1a3f6177c8e290b691cbafb4195a6244d148ec48be99792f6cebd4c40614d9250bb3d6f6287171ffb713a0814a6746e2c4126c82f7bde8b40518ac506cc73ee8e0516a0d0257ef153fa2464e17cd17dd6ae5343d43eadf67c4bc629082b484985dbfce3cd941c1b69dd4a52b0f177f641945ae0037c79fd0b975ba955b2c1901883f2c5320fa7b43df6c673eba7c76c0dbfc03a470bbaa2a6083892af527d0f5921d2e20080804db8db936d02f53cae19d010a113f080e0f7baca77c70fab4819c2481f6f505b5459b59a2a482c6b8803a26610cf54418a931d48b8b3a2f0a5e82cae0ff81bec4ee9cc93e8fba9350b5cafc6c020b484847d1e590eb1484caa4afbb7d3cbcff85789ff47401d69de6554ae7ea679b69e115ebc0fb3f89ce9d104e4a27a3ce5098da2c4a840f496e1b2395a8725dee67259bbc71e89aa18c35a9c0db3d092e02bccdd93fd6d4fe51eebf17f5cff0e990215537cc0cefcd69eae4a596d8a95a9ec40ef651ea7da397630fafd26494da0be",
+          "padding" : "3030300c0609608648016503040201050420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "28d3351a970732d5ac3bb69fdd6d85f8923a20f7f7d72985d6df68e41f972dcabb638534d163eb8cf8baada3e1debb7249da4efab8e1ee782dfbd3b1add9e77253ce048c8d0a350936806ad473304f1dd0a0318ad10a11085f2cafc20114ab1f724ae5ffeadaad0bb17bf66277c499876d5ce17026d6d30964dc43e9f68e271d5b6c81b9953090f70bd9b9c05e3219942bae623faf06c6f21952427a5a1a40f05c0c5159ff6e9b94fe4aeb8310b0de9e69ac5f0f4787b6d489d1040ad63ffb1cf0fb924239d5417cbbd7afce71ac0841a0fe2b6d6a5742649fa60433c55fa2cd99e1e173b67528784dd0f55488f7a9939b46137f9aa33bd62e477a77d5fbcf0820a10a499aba3ca383210778e7d84dece64f121acd8d74a761219c6359d2dcf9aeab782c58dea8bfdbdedd4490bbef8fd514f90cc5a33992c4d3609e300797fe0d5dd203fa71f4ef0a47624e5e51455b74ef87e49b9d122264ebdec7fee7bc0249f02ba60159aa0aa8585ce19633cbce48e6e4765b0fe7b4f1da4a8417092873",
+          "padding" : "3030300c0960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "c4a4057d4d2eb4e64dc163add62d9ad01b24bff92fe0607c0cd39e3dd05e5661aa1a2c9dcdc7ae8a034b93e502a4eebc0384519a2589afa113a0dfd45b122fe16bb655b6a034b668d7d400dc250b25d7dd4511298c1185c3d02b82ec63f3f406da0c72d204881ef5ef43e63cc64b799044a6cbabb533d862efa9c3f483eea43b26859b134a2f321ba5ad09ac8dd3f740c0ebabbf35ad3736b093097769a635283c20c1b88ea0a115d59a692552ad8f70050d586532cd3b65bd9e281781d09712b1f1287350a20e40f11af5df580a98b258fd7431daf19f92546d5b997df560a3237e8a2e83e925e45effd4cbf2c1cc439d0d3e658d836d6b93513c41c87bfefc85579257cb8273dd0bd4b7ca21c9e2675ab60de22289b31f5f96f708b76ec72b0209c8846ac6e32f1d28996829ebeb949b2358cd2332178bdce80804e4650b84a46ba4f3bdf2aca0edcb7d4138e97dc14d30ba34352d62f547caf117856a745e1e99eec18cc2fbf223f4548755fa3ef8d9d7c0274a9a7411dfbde3bf53d9d84c",
+          "padding" : "3080300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "9a86cbb68e9a4449be3ea6d69e5cb21af81647a8a0105db03c54176fc83991c2b9ea548fa8eb3b248c72c391cd23dd675e865ffa561cda1abbbd58a85fe4fd108bafb213a8c79eeaad5bb3410c7d6e85a237d1e2f9c8e0b8b8fdb472732bd4bbfaf58f57600996a49a742a6ecfaf55319bf939eece50d1b93df931a144b07e075f8486b5dd65071bf43812a27351402b849872c849878634cb01483df78690ce0dbdc5d45d225ca87614ed1afcd084223c86fc9bc9c891996c096f9296b9d91a564465197857fd6769977c8acdf0acf2ffb1b24d311a8d0a46109594f1fc4dd5b139c180c6f02b88e72e155626a748ae9da4eb6a1195126f084b012f72405f027bd22baea81d765f435efd2b97fed2df6e38ea603ddf8f3ae969f9690ac22d8072211d1337125a3e88388fbeff1b0c7cc7677998ee5f7ac31d8e268ca900b72c98889721e18e8dd74f4b43b083998b28eda3895cbaaa607b9a05f90e36d1e172a95617e9b102bc0717dd2a1e807b11d72a8a15288ca4643c791694dce30808aa",
+          "padding" : "303330800609608648016503040201050000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "71399eff1c82b67a7d5da71df51de813631f51679ba441b0532997ada04711a2c874e56ffe4d9289ebdfda910988e1c210507a450031592268385fb9c08102c1961d33bb789522d97fcd86b7e27b59d3c369280c7367286f46c1e815851349fc16e1bb2fa76af8ab168acb634a22a8d60d7c6d2a81f4db77e65c621bbb4d0e5628ee2320b042bb4c83e55e2137ddea75c3547f3a6b93f1b0a0bd29c729835edcbf5129b33112ad000458f4a8db1149d514db7ee70e4b58c11b37809dc32020dd81fd1e3b0bf1354154e7dc0da0403ec944fc5a855026473112c88f072a8fc39b984db2c97d085783d4f8d96c87f4b826f39414ba05f72c7a22e25ded75eff8f00e53401aafd0ec08b255b5d03b2f2cbb9603a2def9e5a754b33953d3c03ab8cc7f8db33ddf6184150f5680f7401dad6b6c38ef848c00b08a70ecead088f895acf5f25c9e21c87089fab3e3edb7ee3bf3570145041808ca738a46c8de389b5c2f84f98f76941fbe2a9a159525994781137cdc00951d4229f8df099b44930a7a72",
+          "padding" : "3080300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca60502300",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "661c8fc20646446cdf579d0a78003666c8fd9fdbe9845c02823b8e3b780f532d2891fec3a554c743e87fe898300ee17639077fcd0936c13eae51a40d98c329c3ff525f65568bf74fc84fa112b3036610d49faf17f3426309805636b9502c3dd81994465594333e2263969da1509168f1228ded2ab8ce0ca53c8d638db26899558ccbcf52af7b7017d68ba5d7bc79657d72f87a14ad8224f40d1eeb1925b51f8330b221ceddd530a73bb814216fd6afda33983a74f7da5cd733729df22ff78e027eff2cfde27a76ab1abc97e08375f670eed1beed74a9b9205ba2497faa1c46f0038f098ff5950be17d4dd8a3ef2bb0811a8945188d635a977de685435dc128184948c53f43abb70c053b9c6298b7dabf1df91116cfcf8945e78c7e3de5bfbdf19b6893e733cbe65cd33950c77132b7816dd47d9ecfef2f15b4290cc1a4cc5d327800215a49e679b640b0ad1aa1593a730eca633ae17bca48e9efafa0471a6591535c94c4d123cb2ffe33014302f3109712c279834871d9b18982ca413d131126",
+          "padding" : "3032308006096086480165030402010500000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "2b0d588982c68cc0b39c00ad80c19ac645e038d3bcaa384909d94cf6c8ecfc886a83084d19843f2878879e60f5a46af4ed8d62f533cda8ed04ad8aeede3e3c823913d62b28bcc20d9836f6ddd9ebc3eab3fa52e37638ecf897d7cc027bb05facd153090a78220c10ab177f1bf19b2c6ef6ce94611d466ef758eda71f4d496c420dd88e712c6dff77149f4bdb50d1585db27fde0f2fe37e04edf63e56eb9cb72106a9a821a670110d69683f32acf5972efcdc34ed5f8ea4a40f4f6329479499d584c4db4df7122a2c7f34e866564e68552ce12fc30c2a6f24ba7c7d9dddd7fc166ba8ab0b8b7c1cdcc8af880d6f1f2b621286ed722edae310891e3b2b81addfda316225965ddfcf0568486921b125cec003a7b48af9dfc95b0a9b94c53535bd4dd977f2a4aecafe2fb08b5bfeb997d22f6fa5fc946481838a32273b6c7a89817dbca3d2730bdffe63e096d3e88a7b9785e7ecc30cc5c847f193268ed761e05231e3009cf3ee58d2a4f03ab73f5053b0bc1e57960ed3ab43ab5b1493d5a73f6faf",
+          "padding" : "3080300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca60502305000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "a60239ae28daef9b18bc56ca81d0c6161762a66e8bcba6f387f71433464361450a6a08912bdbd86da34ea4954ad0c6548131d6a4de7f60615560524ac5644d69e14f4bd11a29b8ad20753e2c74db5529ae90a6c733032e2e365f9f57cdcd5adf5c66979870d8eb9c5eaef244973376f4872c323bc8ec32e5e92713527b6545aa85bfb7c31325000e6ac6dafd5b48db8286bacd05bb4a9de30d81a0eb8e4a2a888a71152e68c0ac99c74adc697ef9f34c9f61dd00514a8285eec30364e96652c49a32afb7b88f60e98a4f0d2382d795d026d8428818633cd5d62d97074839362fdd2508633da09ba491ba0ba0136056e7cc0c25a0367f637e90ccad93c60c5f735fc198810a01e2f1394f5bbeab64cb0eb87c83f0487b353c7fac6434805476f65292a72aad28b1bd7cfc5764a3a6457d05434814e7f669fee063e9a171a7e0dc627221b540bd360fb64ea870a03239eddb4cb582a0fddd6ce73e272c12901af1c9865d30f11a461fa1d7280eddcf12b8531fc1e5b6d6a771b9917fc3cce20188",
+          "padding" : "3035308006096086480165030402010500050000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "1acfcdc7d861cd9b8e26fd8dfbf13517caabeff310a2f5df45941cb6c4ff23fdd500fd1ea35a8ed95060496aab0273091dd9725ec98b14a71f214e7e9f9d8bf77e62c2f1b844d9ffdbcda7c11cae4a463f9e525acb924336a5c93a5331c2f7e167bae20464cdc68fd08f515f21bc897efb732c61219f8a741e867c3faee19dcd9443a8b1f192fa00df56a1de690e0670cbb0149bfe8bb5b95ebe64accf43a80f5d262666da65cba48937ff81b78b489482aa6a59951b1f56817d288d3942cd79ab7eed0b934f6ce092fe775eb0cb7ea9858e6810d3720751361b903706b50f17de49f10616f9d7d8053775b00f6a3d6e77a868045a85ad43c15dead74f5f86e46e2a455961b7f6092317e87d93b50a247c11b8c27087e3ecb3a680551e3bc3874a34cfba1f19f69a708762d1ede6bd560095f31b56863efe7913947132caf74e50c64b94ec8ce28a0ac1b4044f23b89e9fe5c706647ac8ef0305a0402a84d21a3c546cf7a7ab63aaa6577aeec89c8c260124cef46f587bb4ce940e0f963141b9",
+          "padding" : "3080300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "478e30fd62bc07a0ea6fcb4fd9875241139b012c921c448821356f29bfa331a1d44a03870a9c79482bed3ac275e0c2a15f731044133b5f6e1491af217180c7a5133ed781665265bd6fd9cbf3d65111d39c6c4314231f745291c70b6aa3d6ed696157612967a283003f982135520f959d24df7247d0aca3a81f7af80062d4d2b2c4fba1d1982bbfa37d5f9175747f6010391c78bf6445f553a5a77251f4607cac9eb17904680536c2965b5db4431619363245960dc8643c83b914479ef0162c70713b985241d2b271facab79253369b37fae70888db2003cf87677e915888d1f580e1d9fc7360ffc8a36c15fdc1f27eac143081612c004b81d4ed63bade76f04b0c9acdd5a79457c5be90ab26ba7c11ccb3945c05196b7ff9e29c713f6de873cadf6efac0879139d2bf25171474eb4b754762352bc77efcb50d4328e940ab4aabb8907043a4e24fc2eb0fd7da3f31bba14e1b91624212eee638ec4051f1cccab861b8aa6948326bcbcdddcaab5f2d0b38737ca7722d8cbb310585f01787007a9f",
+          "padding" : "30373080060960864801650304020105000608112200000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 145,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "1e035257b6ec35b3ceab42c5ce7a5fc87fe655a55802b7f8dad54bb048d92ac7b22982bf1910a810d0a3c5aa26c5eb9fe3e2692a272ea063a31607b0765bc3cd4365f75db38ac761651f9dce99c3400099fe37a76c9201fdc4f97b83094734dbb64d6ab62e5ac6b581412943285083e2f8ce252596f8bc0e0894d4685de91e248c62d68bf7665028d06b9a28a231243f9022c66c02ca8c47c711bcaae628baddd685f0a4001a23a11e4a898de0c0247373e0a5282e2214f7eda51513a903c810a70dce11a95c808dab26129af2555679d8ba048585a3134c0197ade27eafe7f4a777ae835f509301bae94e9c6d40ffe5ce60a43b96a55efc5abac62f747d5fb3a1c0b3dae4b9bcd8148eefcf7de3bf1731aab7bd21946d58beb2203da98397bf4c1479b1072a01782f8f08367754a1e25a93a096baab9e88475108b4032e473d005a9c91eb3043ed1774cfd36aad18446485f138da61dd9872364d35aa7e10e116c70773547ec1625c9861f0e6c92a9243379604271ba88904fa0d247459a6f0",
+          "padding" : "3080300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 146,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "6a245aa2bff7783e93fdf6f5014a01934272c88d6ca19ce53708237bd15ba9431d0ed81a6e81ccf78eb2d6e1d9ed5c46d39f818e1a1dbc7634fa1e2a1ec207335bc838932efd7eb85bc62fbfac07b0710740a9f0b0621bb212762c891f04e0846ec594922e917f5cc0509787603c9dac04d98407b967e463a0d912bfca979b92b12e756051e7bf023c9f0fe061c0d67a87b79d8ebde7f60ef4d2399964b8071e6a1a9c63a8f316a174e33edb1023fa0a0bf272800a9620db648d061eadb9d180c576817c759483f85ce359685598f15c9b8f00d75f4a8a1cb260f666fbff559da3a4f075e7915b284febf8bf21eb668012dcf31692123b94b4e44e3ef17c942644437d59c49b437398bcdc68b5110523fcb48241c60a8f4fdbc0ec45e80acf259e61cf8414f4dc9e9adefdebf94427b2794009b1377d64059977307059828342d605545e0b776cca88dd0db753b5d8aff63051f9ea49da13821ccd4cd11c2174f5cd179eb95c6998eac5b66a19b8f6a3b4c6b00d744ea14ef64599ebdf94f859",
+          "padding" : "30373080060960864801650304020105000000fe02beef0420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 147,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "bc870ef5ce9468f85274cabad18feb0c0cdf2053f0becab52a3668d7ddf0239197eb2365f29e60edc36e673dc7b0f89f605ed6f3e9670b7bbdea42770957ccb11f8421a9982f38f2764f75f31fecfb1267a9b1e85cbef52c2d3e54aaf304d54edca0e2464a71946442970ee0ccc545946ad7cfe08363c87dd89cddd1d7d579c22ec49525fd9d83760909209c1e79a24f14750f0d0501d517909dbe852ba777415075a797a0f410289fce04c31db77a97f1eb1e8f978713d2b6bf9595c03f6376bfe9b9a5a8943408170d69272d3a5ad2b98b73d1213bfe97fdbed1b29b7b5a01bfff20122974b023251a2825512a2e99031777491fab2c1f41517953c10145b0b606171c22e06fcd78d6f51c02a25bb93edd7bba6fc3d606ca802f8ec4f82c56d1aeafbf6b7617c604ea53c736ba6cdd755df7b03bf3d00266645e68763a2bc53c7692bac8f57d14675d6131bca1319f251eb589c9cd71062d3792a3a359476038dd1f55784754bdd59b91fb7a9fbf9f2274705abf67b26a227e7ad1eba201a4",
+          "padding" : "3080300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 148,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "92780052295fc37894ca6c4ff5f6d68e21f8b907a5ef5411edc4fae49b615503e6b2beeb1501c0cbb0005c4c29bb918eced60c62fb21154d11d02659ec1cc2a41786c813fe80e8fef35594255b11a6f6903b93411b1db9697d69f2ce115954b095d5e56cb7d202c1d4f6fbc795d4966980255098f4929ef28cf80a2dbd5fe2701ca358c6acdd55cc801a0f8fdbee2be57c6b6bd168e90c39cc20adbaf6bf083e3b53332482a411da3983f054557ce976149d82e6ac3613cd95b876c450a474823d03ca31c1be5c7049a5b554fc2b658705f16e24eb9fa4bed22847eefa71ee4a253c52675fa82cd22c924e33467803faec7e4ff7fc81c40e3c8d102cc4d54ac8b5c06b8416041a50cbbc53723373bf13a7f5b2a062552ac843cbe18b3d5238a8bacc5592dd3af26bea3d8cf6db91d9b54f8e61d62f46b39bb9d918ce5d77370341e5c3ea5ce4f46a44bdab383ff1a5afc5ea96dde6094273606e4ce4ae545bce61549e1248011d6e2bea5dd6d219d9d8edc621db13631d17067765827c50aa96",
+          "padding" : "30353080060960864801650304020105000002beef0420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 149,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "abfa120284e8ecbc3ef8eb997e304c657bf2b7e78dbbc7b5d910e10f02a1be9ba1305c1ba831da12e5bf7ceb70a6bbe94cf2c422b2e56ddce696b0ae637f910a7032fa26c8b0489cd57b3af8b3eb09ceb24853e95315db7b6e468c2feb5287f4338d5b301efeb79815a981c8fb5112d16fa5ca1a6f243af9bb57c09e3c0c68a1cea5ce25cae53609295eff951bf030db144d3871580f1b9285f6e58b7d7a0b23dcaf5dbd2d96b81674bc9e4b748073aafcbe476808e7dae536971015891efe25ef14b00e37a63300ae82b6413d31d2453e55b3808670ed8e76fa733d24e346922d93c7d340a820151686f00c4781c08419caa56c950b9674406cce2c1f2658eff3413ed6be5ead69b6a46939120e1b03889c6045805a1f302339c544f32bf0ca56c7b49b2a24078093d2747c4eccb77b2db148df83e4e2094683716abff5599dc5ae6d4b132c2202aaafd8a5770827ea93a15a361a13eaac22edd47e0154164ae88022f6e5da9dd158a3a25f5fa02638b1522180293dc0e06aa0150b98e7903b",
+          "padding" : "30333000300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 150,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "6874b0d4afa491d22ea00d77f521010641dc45ab6081c939770c8a74553ae414fbdd1a2686f346eb5e50eec2b75be6b4d6e3c1574d36fe32968a5683dcec662480ec526136fb119ce78b7983875fed59989b24a2082b7dee49b00cbf3e18d6677ac640f723719362ea64fafcca71c4e5925159bfb36b7634acac6cdfd6eae269ad7a3c2880eaa5be35efb72d42ba30bc5fdcdc0a642e8d4aa2a6c1c7faf4464ee49284142cadb7851e9ee832a367558b1f3f06d4d55f50c8814ec6c2aa4a3284cdf3d471bc07506c4a5f061a441e44b87912612f1e4c576f4207348b40db8bc173002ff3437555b724684bc01e8490e34af10aaef0aa9d509840e5ff8a6cc92b2877d1ca108590d7a382d6a45ed0eea4c0e0abd5ff7675476b253f06a25f21c6e658634878ba318a3858737ad875d3bd1c1cd1128a094d778791e6163970e78909d4bc1f5b62d912bc643afe9218ac9dc29df522909d394a5178b285df3669fb321f0d7b6c7b50791b6ebedcb3740fd7f382410394f5853724970dfe75bf6ad9",
+          "padding" : "3033300f3000060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 151,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "7fafe1dca84d820316780965987a135054f498e3a9f70341dcd4cdc992789dc412b68440806faabde11f00c0b6499d84d5962ad1dc9586fbcb57ff05d57c907d74bded8fc8d990c71336d814f5b732d0fc3f441d44b29e1187102664fa71e047f0bcecbd57d9d6e36d9085c37add3a9c110be47b3ad2b34c5b8e94c6065a56a638fc073199b16e17efec87cc482a192f56f8d0fc0c84e211d1dc658fb222582be550439615803be1384ff8d2ade2ce1aa46bd6544141246ca74b86efefc8c7cb169484c122f2269fda56cd87cb257f7b31ced8516d01423c1ba7edc1ffb5de565979cb45326274f160a67f90a4fc6e66306cb833b914fb31b2070b3f60316aa1b2ad5cb5580be9aa47c3e2223fd9427dbd6f35d83e7a890a8054f71dd4d1b11d2597c47385d3a6123cab406dc61c562ef40d626e7561fb81fd3eb1ab72af94122a40a4f0649022e0ed52fcad209ae22613c5956215f0e3b4bf3d2ca6b45c5bd5c71138ebebecba05d0ff12ef257d5e8706a628876c958e238a3e4a8b3806bd4a",
+          "padding" : "3033300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050233000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 152,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "5015c5a03cba54943ebdb80e79fba8a8bd61085c0febd1a675aa2d0712cca98b1f0f43cd3e239c890af58dfcb40baef28692e81163bd87b5121d67c588cfe972ee8d560621ca1e9325161bd13014625ec02e433cc97f7025544a935e0f8cdd728f7fedf90a8a8e57d5e12d9c22306fbae77c092e13a3bbc9d98bcdb18714d62f3f24e65e74768c0a9e9b8600e87443eae345919ed7fe4c8581dc00f1bc0c2764cde2108e21d34cbb8f0ae4293a4f7d4ef938e8765bc862302379d979207d4f7e294f6bafaa309aa4013877588192ec5c669eda7f41427f81d75176480c85e3d122072d96174a57d77bd1e637254282c840db3d2a1f7f05de9f47422c32f0854a9703c668515b5b4030a5d26611e452306d8d239589458b8bf17f56f3447969c783496ceebe16a163a06f17bed06d4505b8e0d809e351e59883cc3ed15faa22683beb684e04323f146dfabd03e836f08382f5d00dd2d1e9ca17946446c306a2b97875faa042e3a4002fead6d15a07b7b4cc9a2a6b5b436fd03e231cb100a43fd1",
+          "padding" : "3033300f0609608648016503040201050030000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 153,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "5a29dc4f6d3138febf9978266c319c1bc69cb33dc63eee578ae1bd2a4736d28dd9d99a24926a2a6a5a2404f4b5a15112a7d0c00a24a427a0af817df199a4aebd77e6b2ecbc958d30179e00d8ecf9cb1500a91d5f7f4380e2469cbbe61d91b26573b2f7726e5af49af963e22578c08ff74644cf93c547c64965d708574b4e5496e3923d1d0414499220a6a9349a0116ff8d843c8a563865eacec1c284cab41c3d6aa813b0c5cca1add5e7d2edf36d8845499586b5118618e1a616d91ebc3349f5ee3ee1088d9323e79967929a7273910b389fe94882c28044b8978f5137a4b2d8537eeef53600e5c93734de279717141ac470b8b7c40eb0a3b0ac6cfe4e66fa2e50b44e8fb6ffb9db12c7ceefafc75a89c21d767f8d704aecc416f5771daad4310aef485f0b9c150a4a7fe6c38d81e352fcf0e49cb036aa02ea10c2e6222c4f0cc27bbffb7e89d1556457d73cd6333bec31f9acc6b7d927895e96f1e2c87aae21f8b1bf35d173b57820739c7f170c1be4b67a4db347bdbdee1baf477d7de4b9fb",
+          "padding" : "30333031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 154,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "b16e24d20ff575be4f5b0322b0fe67f02b7f2734a7e350f078c401a4f1170111b00e68524b566c7d191e48731d03e3f8e4b2ef90f8c9f798c57ceaa26411836f7969e234ef5e4da1ddbe2f6993efb4c4abd566115727831cee57a7511022c33e47716fd796f2263907c54dcfa7ebffb1912da68bb5572080274a664372822ad2b4516cb54dec43185fdaa0022c84856a178f69483bb743976f3d1f1ea4e2eb77d1c55800b7b405cc4967d3ef72ca6310ea6719617255c95a2e31231e6c8b6603aa82fab5d95009e908986d105296fc1f81eb3709ba27a68edb771e3e887903913e72c6386e3194dfba12defcb6e9764e07dba19a06504faeaf9a2313e345797cc4543c6f38a656c4c1032120ad6e83d65fe51275099c9c6d3619a491c5cd8995c42726f8f7f72644957e87b51b698ee443f81a24ba0564260fc2a776316f3f470ff3e1a3e3d071521351b11c6f4aad061c6ee81da1bfb2f40ed306ebf42f4779432bb79d7f0d20372c55aed8bc9df38bfb64fb016675ed3ac83520900113e1c4",
+          "padding" : "3033300f300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 155,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "3531e3180f6385e8235d402ef40db775cf88d115fe8c3426adba5a4b36d05063130bc2e711d5e71f4fef4cd2d7c21a7e2fe76a4dc02b961a6edd3658a96c78e3f7971649fc913ce8c9c4ec9ebd8be9209cb90073702b97ff94e96471c42dce887732d93f89f7376a1ee0190d7c646d56393f42c60a6db3724a734ef986380e934fc8cb92428851a6ff74f1a3feb94f7f6d3a331d4d61846026477b7d7b77077a8213555d4a7339ceec0c71d65492d2eadb9dc3fcc7b3c0f08ce2d09c97c14351dbe8d2745aeae9882b252ddfcfec719c312b789ba36430d81db2d1e88c29f0ccbe410789e0cc27eddb2b4b6d5d0b980f67700c05cf9e64ba96e5e50ec4e59067cebb580a6983acba34ec260f5ebc6abec53a899483d266b53a0cb24f81c9ca144772ecd622ca3cd0f502c5cfe6efec13574d51acc023f277c3a7efe128fac202e41033ccc4bc78b550a1663fd0d836bfa31c435badd977f38cce70a5fc353449a3357bec99a87b19f92f81c99e1a6d23ba23b5940355b078d05b2554e5885fd8",
+          "padding" : "300f300d06096086480165030402010500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 156,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "885adf1a5e86d463e8f6750b49a3c3a91a2e8bf90e4c19873e19dde041bdfcd08494a9d25ffaa679c3c4c6d5addf99256f75498f3cc6c09c45bc056daae88a509aed0c4b46df5c1a6a1b5b4f2c5d5d008bdabe5f22a0ba1f34e604fa0fc8c647709e82eddf9889241571a07e9dc91b4eca9af390f63ac20a7e526d945df9541fa43caae141ea3feba0d0fcac7c50f7b03d4172daecca84515448f3d8bdecd2513aea8565227c2da298a4e2cc8f5fe5603c30c220c2e96c3a4d802b87815b1d94e06f717030bb2d173339ec3ba700828bc7a02495a1042b644fcaa02fd9e67a26600718d056a050800eb546eea65fe9fda8258cf629cd48dba7393b5569112f156032d5d4e7a989605423d27945401ae7db0a9469375ecc8ccfcc3f2573570056027303a556115b0f98958fef8917e1861de6a59843842d269c8412da05cd2a12b9e2ae75d177ecefdd5af79cf4499488037fd2d592bcb2828b9ddf9cf7fbe309822a9f0f54368ec2a6e67550da715307eed5e1d80bc9baced4fef132b2f59cfa",
+          "padding" : "3053300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 157,
+          "comment" : "removing oid",
+          "msg" : "313233343030",
+          "sig" : "6f4c5d8e23801e4dd6617c4670d2434af72844a997379dd7f877179bd7405bf407247e77a9b0e76956b0b3d61ac2592c7005fa85bf3cb53a231603070a83880c0202e6a2f5e4149ae05d5333f5daf142a8ee7b649cbc97d465b2354e68a192b1c63c51a1166feb428afb215d89e51bbb076eb0fb7f02a0bf512ef352561da2ea1a2265eae0dec4c7f2eeb232208965427c81c596cfc7f18ca9510bd34e83e5a51473e6e138b75368191d6b1b2b605430d9989e9ca4dcd2daa8f11e0ad05b20f3b0eae07795ef85385cb29df224769038f89599990d0ed75eb122e2cf6c0aa80f185c535bc328ae21e53376095ab9ef9f15ec663df2339fde30c480944026304d553b0a2f270f4ff999a0f39391a80a73c22644d53e1e6bb1820826f4aae6f126831b195c2d137b919b5d20d918b3fd3d85a83cca759850b27ca101460d1be3cd417dc16fff5912331118a4d514fa3634f67f72b31056cc65d8f6a11d1fe10618b88fc2754830eae79e12f4f302776137a772489e3488f37cbe0a1139848fd288",
+          "padding" : "3026300205000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 158,
+          "comment" : "lonely oid tag",
+          "msg" : "313233343030",
+          "sig" : "70f10afb809a64ab2407f0c3ddaa0f2f38f981b19536f3f5ac44a6fc85e5535e04795a16bb6c435528ad255402200b02f203bf3f539df42f0ce3cace96456728814df95772560057648867897603ddb96a92f3c7652ec24ba86af4fb7c1a8ddad03409e1bf982d01b63190661dddb932018cadba66a43cb5c4694233541c56d9d03e659e074fd6aaa18976856b8ca27342cdd3a516d587d5d46c9c845be535ad1a923c2242137d0f3dcc112190a807ca112c069fade7af53f17f2f74e2f11fda2b75f9a48250a4e9e8b34920fd20783b179399425b19e7ea99f395cd3bd7d37729a287d423623a33542100d13eb61d7f77439f4e3aed7265d7a08a7d9eb0477aaca23261e4d06d25ecf1219b87610e89af4c1b427f7a9432624dcc6f78454376d215a6fd8f6e5f1211a18334395ffa710c8730abd64de0daf686a45e979547c46f684fc130f8cd9c4ec6252408a87e29e38a8552a4a908ed86f3f83d42a9d7dba1574a2453dbf2613f8c9aa5b7fffd61f222c122e39d86bb01fce55acac1901c",
+          "padding" : "302730030605000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 159,
+          "comment" : "appending 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "36343b89eabc3dcaa053b5be3ed7faa79c143ec18800be18ddd3747ecd557f09998203325f89d3badb3eed7fbc20823680d38eb44dc368abbe180474f494431c04d936d7b5886ab3aa2306c0b03750df05c4e7fcc2dbab79736e2ec9b0e27e277d130060abb4ade70cb924ab950e95ab1c2335578c5cc40dc429e397691542edfaa8f4d408918beb9b0cc0668b6f1cfd9692b32f63c9fa4d482beac2745d5777b6da28ed7665bbaca9999f65309ee46841a8e3998fcc6670edebabc4515a438375ba820380138aa7f2e32b8f74d29db86cb85dc2b556f4a307c02237f18fdc5634811653ec2a440a53f8647c495b76221c058268713191a9bdcebc148a60d2159f28d92f79dc5f3b5f0c09e62bcb68f7003bf71bea00d25c4d7777a28103ea43e92951d10be77ed7c73cbea573f7e46f924e4d12cf9df8faa53560153c8fea87365b90ad3f0e6a50b41612fd191c8abc3a5d8f98bf4006e1ae31907afda4b20d7632829bcac43c100ff3f10f0032e1bffd3b207eea2d6a87027577e5458ab81e",
+          "padding" : "3033300f060b608648016503040201000005000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 160,
+          "comment" : "prepending 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "750133d796053811558b21dbcae35e267b2fa467a9dee49755d45599a6774682e40e00cc46cbdd412e6233070dda3a59814d6238f474d04d9102301bc281816bdef246f80bd3ad06646cca4c9a662527385d3c473d03ec4d021db74c7a1ba6ecd1cac005d58163644b993aea62060a25470083006a6515ed45b1e54601b9e5914b8d5e3a630f29bd88036f5b708d2036e4ce7832a239699b2879b6089048e33c05d3672c0e5c573699264de531a0f6c2c703335fa32cab0003d25f9bb8e0fac2fed05a82c45fdcffdfa0c2be8e5501212007eecfcad720310a8ff44ab7dd52e69900344996ff0dbb7c39d2398769987402a7e1d9a6378721f5aad9faffecfc4fee8c4092207e849715c56ffdd5c42875d170467799e0f8a08ad5edbec4b939cda099d30293bb76086c5315de60e967267f3ec113f7fac4bfa9af68c4288c69d5b0073848aa722124a9f53654544923b5556eab31bc22ecb6cfd8b18e665fb345e8b5e48cb63ae37c7ab8125a1f3e5d6c4bdbdb9778d8e27f91883aac99a69a26",
+          "padding" : "3033300f060b000060864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 161,
+          "comment" : "appending unused 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "4e9272dced0bf87a8a3b6ce118532d1ffba529ee783857ea0ca7510f4dead7406f10c48725092eb41561d067c1ddbe0c111ff24aebe1655edec615adc123839cd77c1a3de8baef7217911adece72b3a6b617c69e8c31464e2bc021ddd2dbdb99ad28042133a6a02df2be394d5004c6ca2d7520af46227171a5ec22870fc8a7dd8d6f4e137393261db00c57fae4fede6ddc7078f7c9fbc2235147da239979fff0dac3c5f0ad10fb3de6ad70e12ca6c3de49b8a36383649da69b62de49c967301cd36d439a6c1729bff6ea0e664a6fcc95898b190cee2492fc6535b7552b5f04d71b4be2dc0471dbeda5ddac313c9cd4e90109f04bb09515e54f6463450bcb6fe06a5cf80e7644f422cb83b123b94184c9d81fd0bd4357b60aa92bbf35a9a7251c515bdbd6016b81ed361837eb6021393daebe302c4c204ad3fe724b4f5b8e52f9590ea33e02ae1ec2863df83c33fb6b21ee051f489668adbccf04883d6aa972b77dcd42c03de0be2ec9e63a717d3713a2c7d31163da70bf53dd3ec342183e9696",
+          "padding" : "3033300f0609608648016503040201000005000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 162,
+          "comment" : "appending null value to oid",
+          "msg" : "313233343030",
+          "sig" : "bee3e72ab46b5bb4cc6138dbef0aa19effb5067358d98252ff739aba22d21d7ada25aa395aedc0c29224ca5b88169072fa6d5da902130ce97f42072b86103e1b93313452fa6285c3f963689cf15c0aea60ebefa1058603b5c9f905d5849e496ab4036ee73e5ac612b364c84b34887cd0141ebc114e240eb8885b0ee82f31a9548fbcdb6faedc1c27e0fb1fb4037124133088d5edb6d34476e1bb93e6da177197b6463a0e1042581b965e9d0e7797c13cc841263b991af9af21f8ccd44f4ff161b6545296346ef54792dd5392d26b8bc2c5a9dcca41ccc6adaa1971cbbc5e676f0c6633ece739b57a24a6bc54fa75bd6c4f2d1e554d7d7e78a57e012f5a86121e6b11daef66a0004fd514e3b688770566f4f98db5d368f1e4ca9ae583c245e30e485d4b71cd3a624eb1157716d6532c866ccdb6c5ddf3e9a6e05952f7c2c6f37c50871b21258a2e9cb152bb877971aec6827fdfb4fcee828324ed2decada3692e3c4483dff53bbfa12b633544f04866b3c7c15f713786feec165502eb895382c6",
+          "padding" : "3033300f060b608648016503040201050005000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 163,
+          "comment" : "truncated length of oid",
+          "msg" : "313233343030",
+          "sig" : "2cb338f3b3e9ca09f101b5ff3169edc180c1ed936f2e4a5f6ee7befe1e005eaa450c1ef3e78739d142dde992cf73b2349a617208f6979220c85f7c5286c3126816e47cf0946a17de1fdd80657ce79254881079da225d3b10898b1e5eadd04489f486a14ad530fa6a444c19d875c0be51875303abf214bcc6fedb1e7e43a257a3375f0ff7ef64e5369b1ac071ef8a64336f5660ff9c5e8fb389a6029a8ff853d4a8e565ba17b0f7302d4eeb5416598421858ae2ab65c2411ac92db844bb430a745470f402b13c9575b171fe9e64f71d6ac40e6ac65c5ee08160864c89df2d9567c13dbd6ab1cc6a767892f0fbcbf2d734424875e9775c2020deb25ad8e93472e1ea1235bcd06301ac181bb20a700050e08548a5cc00234a44e42134591ed70dd4933f4d6c6dac7abad2e6da8417fe42945ced787495fbeb99f2d4648b9382d253e0806d988b1f3a64edbb28904092941c834b63243d583303f6081067d1fabc5afcb818ba8a2edc31890ec28c204eb767e749950c18be17950bbe9df4ffd2bb97",
+          "padding" : "30283004068105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Replacing oid with NULL",
+          "msg" : "313233343030",
+          "sig" : "85825bd4521c433e916152fc89c06d11ca2de44afe406108ba3cf299ca02d0c7165e41ffdac6279d0fe5b915f0aab62de6277e381fb8eda73a89e880fe546fa425f6698b89e47d457a349ac8cf0c38f255981b902f6e22ab9d90ecba5682da95b72ea32b243082d564466abb5e9abe6a66c5cb9f7977eb3b827a1b98af236340991db4b6fb957c4b055c23e13766061aae849a2a8edcd3ba1521f1201cec81c6ad2cc7c20123f8e1c13d1431e6dfcd3481b085e32ee4d935311f5341e3a0c594c709523bfbe9b4a0374967ba42390e9b9a1cda573fa6008b9a0a96250e9ccea74e5bbb019f1b870268a48df9d39b422a9064d923cbed7063d8423b020f07c57e4e33122705b523c845bbbf764e5d505d42940194699143188c7e694059416070f4da019eed7663af0f007d79433a091fab6cef6bd0f3d7021ae7e82ff956b37f9c88c2c82e57fd834abadd012286f1af916819bc9e91085eedcbda6b5cc44feb83018688da4b97c9dcdc1700d015b71597e96c0d6951f04873852a0dc3397f88",
+          "padding" : "30283004050005000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 165,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "8204c6b2d4027f7d93ff89c36eadeda03a5b5464deb495e5bd4fe066c0d9778042b8fa130396c1652949f0fd577ca23f988dadc525a820cf82756992ff81c4a7562ac1017ea01f8f9cd0cfc787dca972f27103a4d92bf215eab991e6970e409d431e6bc2be4f0586f5b98b4ba708d9761905aab265aacb9d495469b1863f5938549175f30b30561c998e081c41b039918a6fab4eb2519e6cac910cc4d931c6c81e899655f06c8a26f7b9433992ff923f27d982c1bfd0dcf62e5ca4c3e035961aacb99f831bc0e42a668c01256cb830b7aba0f22314b548c0b85d84c61c9b4a8ef331bd7c98010c9a65bdb7bc4f0f09b87d0c8b8a1bd96b6bc2035b43348dea48f1f4a4ed6e393040500a12d7a2ce1e08ee8934218630ecedbf2fc7fb5c6748ee3118421967e8685488fba058f312ae41f7d386905646ee334e294662a97ce70486b450a64dbf8ad7c1ba50f0c56295cb2dbaad3833d3922566802c80175526e24b188e18574292e225bb958305dc2749ddd4b46685925c0ae9deab2671e1e799",
+          "padding" : "3031300d040960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 166,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "6593928f8e0a2a486c9af0b6af6ad78865c215f64ba3b72bf3a103788a352d216fe5a2a3382220f037fc2d8a2d25b42f48cda3337cc831e4746266121181bce964abbc7eb6378b8c59b9ff59de336989d58003534458a47cf18fcb0d0397333045f0f0d826445b62487217df62131ac0d84a38a02ab39eb7fb1451c7ab10f47d7e62c06d0d1b8ad35268ce58573432b1f4a9515bbc9bca4428bba426a3ae8ef8695bae7a2a3629177fe00edafad675811c90959ccd7800e4ca1e22b16910170b9d697b25af45b9d2febbec6b57d550b7854b425fece239155f068c6873e314ed3c97a46f7a61c8b82af22191feda559b7e93483350652354f005a78dc62bea279a888b4a6eff708eeb4d93ffa0f5c6381a9f6570746387f0e116376e4625a01ba34d68d39b6b793565dddd357493e8d45c8e676026e93b26abcec1b4ebf467f3f069dbddd63f30b6be3b93525618ce903463ae5cd091c39263327b40b76e4be0403f6686b0ae74213a5208bfffc360d3de49253b85585b181133e55bb38aac6a",
+          "padding" : "3031300d050960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 167,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "c138f33d241e4e88846f66b4c8f6d27c89c08297b8acb8e23f6026b4857f1bba758f5c15f4266b8d66aec30a5a46b32839f8863b3e2a909ff37c97322ca4a9eaafb2124171b52dfd63465e147b8e32c99cee9a60672b70163e747a238402477dce31497b2339f638d5907e43e3b794ed8f1521490957a57cb9bc82c0b066c20c826237c205bd47d1e6ba57eb5e37364bb5fdcfa8155c8015ca06562f7f0c9882cbfcbfefbd2f5ccfd2f78c684a9bd76c659bcef3de3622995ba63913120be5e0ab72d16d11cc1ddbf23d28abbb8a5831bd0f00a8286122a117d55578e58e0da5b7dbfb48aad8ebdac7e8615ccb9c21a1d877dc84f1d89aabb0976f59d038b9657c636b762801f214953b0d0cd55ba1bedb4701c5e2c3872f364585bd675927a56a3a0fa0b962a7170f925ee921c9fbb9d0d8a19057337ae74940cb86fd3103b232314385cbb59011506f94c14d18850f13556cd7f03cafdf9229030963f325b15c701c60668e6a167f9b3256bca99e05f4f5c2c3dbff30f3ecd36d79bd0db54f",
+          "padding" : "3031300d070960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 168,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "8c174bf6650026302423faa9b90c71e66c2e54e65ef77da93795f04dc8fe0cc05f992cf00c41486268252f52d17a4b5eeac356866162c031e55d3ba7d0ccce982fb42457aaa2a92aea50f9cede6c19fc0e1052a4dd85d8039bc3f96dc19d8f2faef835267b6d235c25feaef590c5035c2dcce1ceb6172b693a63d3ae5815f5972bba516a096bf45e006dcda300806eba09ebe7629a939800b7eba88e7f82467d4d65889ab65f8fd37ddb27e62bf4738748d9e429eeeb41bf2a4573baff6890cbec660fa0e1e0c38cfb8a1e086c432562fb14b28c74495689e356ebac1a701deb7328ea31d30227aa9ace477cf76ccc375519995788f90b41bc7f6fd4af812ddde49be65a2c7f9fa1108376701099ce79d640ca5ddf1d34634513a76eac0b3ae02d06a2195263d79e9dd6edfe9b5bc24819fd5ade71b1d1afc3f5302156b97bc3c4fd3386f0a9c00c449eb05b1d742c75f02ff4529ff1a0c0b34ce4cb91a5f8b700d9c38ce6402bbefbbbb3e158aae035074a6e0c91484ef8b65590e6870be30c",
+          "padding" : "3031300d080960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 169,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "39681cfed3cb5ce9fe0bf719a1e92aa3af1302f6b6d0c93cb22795e0ac581317796a79ffe29b5f88fd38b572cffd06fbd2426372efc6f2ec01b2267f8c225cb6c6d911c87e7dd756ca3828383eb5bd9c56d74261e62550c88e39e7642604529ba45c81c6adbbd4104788df8e00f04239e8d4c0b43ad15b497ec04d7cad30dc0082d586b1d88d121e5e5ec1396b207410a3bebbc065ea25b97ecad9bcb9594b749a6fa8f33dc11a64c48494201ea0efb73a203cf10ec68dc052bcb68d336e31535bb0f667001dc2da63358e37bd421fc88a3009c698230c057983968d61c31462363bd93c200ce4f5add74f20d877564e88c20982713da42a1b279caa845b486b090d5fe6c154800feb14e67498cf6d3176a707b2b1c82fc6773cf65befd64c9446a7b62482777b1c77c8dfc644798a3b21533c63e0fbd39e07b127b051ea2cd85b42c0592c27bd988781ef3a405dad25e9659d9ba5cf1b3c3110b59117c322491d55a9c93c8a45635b5b0d378addd082453a6d190b8fa0a89a59867d85dd4d07",
+          "padding" : "3031300dff0960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 170,
+          "comment" : "dropping value of oid",
+          "msg" : "313233343030",
+          "sig" : "7206322956aec277538b8bf09edf980c88df3eb0dc0689f834581b94f801883b384ac4fc218bad411d44e49c03a6d0ab123a19a4f0c7a8e72092acaf5162b0e30a2927f53543b31fca0b0b3c1abe56268f442e6f856018622584205dd898e2f98766b0def32894a508cf7c824ecc26750082b80408cf7a3fb752172afd53afd6ffb1f0b96b9d0c705574eb0f1dc1f291ad5af8c5d1f539757e19e19ad600013bfd2d1fc8b668d0e56a138381389a7fbeee5a7ac363fb4ad95006e3b3e16a3b9abd450aa3f16db19facca9f45cfea2fd52034e7a1835f6e10d40be16e44a0ce5d798a8bb9451488f78edcd203455fa6dc1253505fa83140d610eab8cac65fdb2c669667a75bded33bbd4ded3b0691de5e30c0eed12e01e9c78e56fdfa485481fe671fed3cf558730acb382f24c1810c674e5459ffe449eb82840bde95fd2f23b8438b844ca019882778edcb7d5b6f4d2ba16c5ab439556accadd3029173604e5ba40373d491779a049d0106dec560e084ca942eb6293bd3d88a6b4627332a615f",
+          "padding" : "30283004060005000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 171,
+          "comment" : "using composition for oid",
+          "msg" : "313233343030",
+          "sig" : "2130fc5f94a8a359b90ba546795e788328f09c45903823452fd44c5a0703033c7ceaa0bd956c20b12eccc052c2f535400e0f2d0e90aa0fd1066e400d6e81ee19fc2b7827b48537129b54938d324680966cb39850f755b71d967b50fd7d699ce3fe956a150c17088a4d29740905d4d1a6b5e013c4450302bb3c125e90748c3eca09e39d7c6e1da6d65ad02328865e2c0efc0eda5de61153ae757b33965a95da80e23f531286a3288fd61694298e68dd21dac3816aa0b80c08aa57f16cc24c641164c67bd98b2c5a895926e1025d3d699ab7cb9e4f0b43e31f68bbe2fbd3655a705b28d4266807e236c4fecac9ea470dc9aa55690e428a1b353696314e5c62d9e5895ede07b7c584f65d63935865211fbdd78cd7b0090bfc169dd000342d14b068c6adb65068cf708c4e3c3be72302bbff056087fed642480b9bf2064fb3f0f0356b7875025a4641fe5af22b98432dd708872412144cc9706dea53d9d8f96ee55ed821715124bc824b408092e5eec66eb574f069be3b5d88a8f152ab73fd160b4d",
+          "padding" : "30353011260d0601600608864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 172,
+          "comment" : "modify first byte of oid",
+          "msg" : "313233343030",
+          "sig" : "575ef9ef6335f748555a176d35ef3edd9428abcc6c00850723b926fd84c0937361b662320866f555f6e1062e1844aed72754da4f50b1c960b8522ac932cb263c40d301d232dcda65ced16d0e8272c2a23d2130db57cc2d39b0b1fa03ba4c7fbf03c6dcce9b474583538f48075793c26df725bb88113738e674f7fb4490ca61e56b350650e8039beb39a97b6b55b5693cb7f4106a26ceba9322ff889b0fccb2e35b8309a25bd91bf0b8f5c2459cf81bd9e8c2ded35a9e87ef701e26d82207348624aa596e4e1847b111c518d881da598e1ab6e635af91c802ab35f5cda75833217517e84159bbed67bba55f51d62dac8d14c2f9e1a8d1b1649e367ebe7611af0331424ed6784a5497f80ba4617a580270a69cb2ce8b0f63a73d5ab34c8d7e3fa966f465788efe41f57a99914ebd708922d570d1334a81bd6812882f0a3b3f41f88a25bd48de158c4da84c784235593c00280cce586b5d388e4ccf92ffcbbf69dccc8171a7b4bbc8d68d1f00d8628b725f08c194fa18f064ecd2f3c1bfea173cd1",
+          "padding" : "3031300d060962864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 173,
+          "comment" : "modify last byte of oid",
+          "msg" : "313233343030",
+          "sig" : "a947601ade4bdd5adbb13779e2d0893eef5de17b6f217deaa8e005fcb9a5863e1e84d1258889dbda768ec247848e7c4c8bccd8fa10a322d05fad461ead9b51180070e5b263c5ca4bf471fe2711ca4d34312cc3741148ce2a0ae9ee7735984533606aee498481281cfc398f852ed82020e0c9f5036b38b31f9812f9bfee954411d7db1653c19194710b42d726ea0844022a2e0b5eda0bc205dd94e271883bf91458bcacd093fc40546bb71ab2ef72073e278d46baad57f744b4b31b100288ad6e25fe8a582263428f83b92646579d18438eadd89e59baa4de8da0d91fae6c3667be486fb7bd5891808930ed3c0f6b4d7a6b5e8898215ab479769f040380ed6636751dd19ba27c8284bc8661d7ab86c5242f6b012c48491966925c3f780b35a0286e1b389bfc134a60969d3345b4ce1d0bc23885fbb3883da50d1b470e1bca3e7df62e5872d7855072be216faa971684d632135858303c6de156dc89be01548ed69967b3265d208a62f5887c46e3b395847f8177debf3c572ef212dbabb8573799",
+          "padding" : "3031300d060960864801650304028105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 174,
+          "comment" : "truncate oid",
+          "msg" : "313233343030",
+          "sig" : "4c2912d0f4de569d7db9cc1a407a01874ab8e0bba81f38c370ba55920f64b41c21e6a3b67e5e0271f8d9400374f11396388966e2434aa0ebd4723042c92a876b635b8cfdab85dd25fba5f88236fff2f7caf23602c479c95b5ea6cd3e4f653cb3639e75ac1cb39d268a035e744453ce706caf3f53eafd89ec676baf74f2e6c9cf8ea4c288ddb1198f15a77ce07e7335671168eb1cbd8c607087dbb17b263c9ef83e650ce9a48ef2fb5fd37a13aab9e8239bae823c048cff16a7e1897f5f7e06cd685a829a85859695fe6956179cacdce7181d045419e69903f987b35acdad97a7dd2e7713060c67b8f447a02afc218484cb1948071eb64e77cc4e48d0bfc635340cedda460a1201b3eddec7ae5a008aada21bed3060fb17c8028eb2bb767d1d4c948bb5ff9e9a2192256e59ce48241f5dce29dde5ab2de0ba8240a992239b7a2a546ec66ef7ae549c8a15fca6a70cc1474c90945795e876d609d5bbed72b8f001673fd53b9540be4d187a484ed33506464f402160bb1f18a3dcdd47582cc74488",
+          "padding" : "3030300c0608608648016503040205000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 175,
+          "comment" : "truncate oid",
+          "msg" : "313233343030",
+          "sig" : "357ed432befdd0d673605a705dad0d8d2f100da229e979b1ffac404596d777269d9469dc1b9a4a389015faeb44639d2962a635c3aba4ecd7f38870980e87b2af9c7afcddf2fd379160cd415f261215a5d46ce5c0c9512f543a8b1ed961d2a75415c9f32db7892f1188bba23c6d5f2fb40aaf4fbb003ae6edb74cd0844f7461b3ee029029595b6b8d299e392d4763d3f6b31b222bac5777f87bf9e0beba302ee87da8be3dc5a0434b8482c165087d60532c52c811fe6389c7c2728cba5912d26d8089635fb01cb8d78aa5cb41cd274309d97cc10dc2a43461cf951647b110a65bf47b8c137a8363455155332287867e4c0765ce691cbb750e5e141aa6fe61fcf4e4b707420238e05d955e5dce215168b4d1742dff70ee87d4e24bc0fd9b73835d8cb359a28040935b4c64907a7623d11118e2997fb2282cfc73b2fa27d6e58ba9f5b317f35a14363c78f82466d7c9cfb8b07210289817cef53ad672f10892b0458f0004b68e74796bcd98e51f2e2635d494c615f6f087a293ea4d225b3cf4b0d6",
+          "padding" : "3030300c0608864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 176,
+          "comment" : "wrong oid",
+          "msg" : "313233343030",
+          "sig" : "6eb716c2e05f4e40cea436982787a425442f6031d7649fbb25422125bfc8e818c2509e9ec5938856bca73695cadc80224e5d2b1ec6396cfcfb91752b115f40beec2eb15461c525817109292a590a7da0976d5674328dff122358a349e5a18c29c9b1a5cd19b23dba26c60472366be9cc2d50cdab9f1da1d9888ea445b906e4dffe4fb1e0063478ac2118a28f99578d17073fa328f13ce4bad081fae8fb5070291080bdba9570c28aaa46faadb1dfa401cffb95ead0be7dcb4d5608d88e84aaa9ac90458558bcad4428f632fff04c9dfbee74722a226f16fb32b2963948bb9e3ba0e3dff1d5bbdb8e75762c4d561fb0e25e0a32df0f2a914879a40ad82bb9d0875123278807803d9a098badd2968338da39d7d13d43c5d78935157467a756a7c43bf603a18b98980773bd9067a8ed9d2254816ea9c9e52b9c4c50e0dfb19ef8bd8703fb5e79aa7e5a354da2335d20fff68294aefb8f4494f6fd807d14a46c489811aed166a43e6e2452c951b6d7b83dde6ca03f494ef31d81233bd2b5b25af4a9",
+          "padding" : "3032300e060a3262306530333032316105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 177,
+          "comment" : "wrong oid",
+          "msg" : "313233343030",
+          "sig" : "243b4b959eb29bfc5e2e75dfdd75b1609e3e74c91aa8c3661c7db5472e31acf64212f0a587d0225f096ab5f90b94581d9c1524d08781f98e177ef4792ab04cef9a983f8997cbae5a23156689c05f55fd877b7a725539236887b36a93c0efa64d78368ed8bf9eb7be111f1044b21abeb1adb0b0597417598c64fb21d400a8fd6a63abe6691a58d1e2b31e2f5082ac0ac6fa9efc7344d7853084a76dbfa7b62c90ac385e579b97c1c194bade66e4c39dcf4e19ca8e4ebd7586c7c3b78e0436c361ecbbcc0a46326ca19830a2c5b124d4573b692e58dfaf6b5efabe663a46f329708c41add4acb3d92aea60ae1adfd4fabcb7cbbc55a936286a49763119baa459e2bd3a86cb9ff722eb2832369f0bf1ed56f25f2dc4a44acbc34f7deae84d20fe99e68f5479923ee4c8f145618d956b31063a93757a514bb3ddaaeb51ba35aa1bcf97cfc1140906142dcc6ffaae82488e5a3fbfc3faaa5a3a2579909a6db62e83dfc4c2e7d02a156c837e89d5585a575c92de1b580b5e4843dbefd5cbfd747a2279",
+          "padding" : "303a3016061236303836343830313635303330343032303105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 178,
+          "comment" : "longer oid",
+          "msg" : "313233343030",
+          "sig" : "463f3d894b269830ebc9edfdb2000bb7dcda806094701cdabe83f044e2b70047c00003e8690072a1e01733b72c243f0f7a6cb9124beef55063ff06204d37815b33dab22fe8247676569eb0e32561e3900f632d61d61c9fdb149cf2f8377b420b18e91b72f93f188ccd95eb95f7f553b9676272386ffbacfbac3327900b5bfc844319285e9690076b2956ffbf4da637434775b97f1fd6cda68bf437328e0e8b5b10b89c4af8a988b1f1ce97b571ed0b921b8ba6aea9b8c00888985a6aa03553b4369e5ffa4d01ce9c0ab18a2d74bb274417c3dbcad820a91d3a46e3090499d3eba12857adc4766b69985f61a9c0f43d2ba13d71fe11c23f2c03be6a81daa5eb91ff4fe30ebbb7ee7722a4898b6e094a511f663851768c0f673437170379f0b3a13d69127e596dad6a8e3a791985da08d105ed564c81e7f8f5c4aecad4b65e572916d4cc6383f03460bff2fff1e351c8aac97c4e7f7a14ae99fa6425b405c7a60dd81193091047cb2e0c5b508856d5af93538db9c7a7d5700cc1d89bafd23c8111",
+          "padding" : "303c30180614363038363438303136353033303430323031303105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 179,
+          "comment" : "oid with modified node",
+          "msg" : "313233343030",
+          "sig" : "94f3af47cece8d24ae8de1792aa0115f4781a65a3247cf7967628415d22a73ca9c322206247a3a53fa8dcc6eec560d7d40dfa5c7550690b067120239ae1f29f75ad2db8a4e5a63841363fe735e649dbf0db6137195b1e26887ce7ea81617bb2f4008538b9ba167fd31bed97f269ab14e97ae09bf3cb44125767cba4afdc3fe13e57604170e1dbb0e5e93e6b557af6d05dafedd8a67765c3287565ca41fe4e7d18cdf4099e1d4bda091e84c5ba2314b044d9e10fc7724eeabb5136196be7aaf1393dcf15537cf92fe3aaf6e263c975a587c8bb5495f378ee983270d0e7fed332dd4261d655e3637fc3bdc519de8e3751ed40fa04be2f9b1a6a5282ed80096cd12d1d3941d3ec19ece7e0e7f9278546275ed242896243d8780d966e55f7fee99b1458d5df4def593b678956cc13f1c9742bc7dbca74d591dce9c282c63c01a0cd04a13caf14f78e11c0df956570feb4d834ac2e3acc3892c11ac734c51bc5d629b5b253c402efd1a69d00b7898616666a52a104605b9143a7b1624c89b91ca7075",
+          "padding" : "303a3016061236303836343830313635303330343032313105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 180,
+          "comment" : "oid with modified node",
+          "msg" : "313233343030",
+          "sig" : "89dc343ded466a0e6a49da1fbc54d6d38ec55416db5ea15270c5c88ad8b316f39278088cc6e8d80642e15b90940e316a7a8c5e62b5a54dae89c3a33feff6a6a09cc197fe79ffefbf4157e3327f0caeba3bbe669cf50388390f7fcabc8c4a70dff4eed58f5d731570d13e16435d2e642f224cb779c49c025575476110504dc7a711a2af05e8936b0caede0299d730b792506e4c8d60549a55b3ed200f6c5c9d7874cf9c749c230b2939e263e1b039d1c3fd178a86784e2051efe5ac6bf7a086d0f434de9e762b9f45262b1d6953a927b12d5f1ff75923f9ee303ed9f4236f886478ee5f773c3b8662187e1e807b5aa28c6a53c9c8ba2955698583cc7b38a6de0934d3478fa2860226e3ed9b7bb275bc380cc948560375a643e7d89c0905cad48924a01d0c7596ac69927b642d7d905ac6ece1ab44a8499b5d96be56f694e3b91847d61487c00d4c1569734d07cb7ccf0f47b66b1f5e0756586b37f5bde3ce6055b0eab951964ac38911f520ba5bc8a46da8709e4347482b0f77195a531b164536",
+          "padding" : "3042301e061a363038363438303136353033303430323838383038303830303105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 181,
+          "comment" : "large integer in oid",
+          "msg" : "313233343030",
+          "sig" : "81c61e9ee36edb7f807d4cee86f91acc67023324994b6506a6cf3399536d523126c8af25263d3370993a5d4ed6327b6c90f27052091c9aeb10040c78c416a4ed63cbada68602c7384d2bf8c7661ed98f42a680787eb8a9c70b32227d42cd81e05dfa02a9b49a766d867888eb511b33bd90e446cdae0d448827c6f4ee60fecba48ea455b3750ed38e9b8ec2b3e1a96ad556706abf5ce6b80585c9365fd41c12e5e353f8c9239c6369a0a3342324b99fe69bed94866d88e67b86a8068d0b659984e27b5043849da32a1a60533f526f32f4c05a1b8259776f9f2d117dd1bedb0bd2c4f8b6988b2af345ce67711eff66d184c9643c5318d495f0276cdc01b558f1336cd55542bf3642ab1d58c7eb8287d137ab041b7e1cef214ec6d8f568bea820a998ca7858dfcb430f39e69d1bd546a9e7c98937663ae12a05b34cf96ae0742b528dc5fb0d68fa7ac4a0d091fcf909f59c58e89c6d0a743fe9832051a20adc66168e2ee0dc51e87ef608c7d55ed9c3e50ecbd2c40d905bb10bc1cf7c19d5b21e70",
+          "padding" : "304c3028062436303836343830313635303330343032383238303830383038303830383038303830303105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 182,
+          "comment" : "oid with invalid node",
+          "msg" : "313233343030",
+          "sig" : "3b2cd3efc5d98458e663bf2f32ceb472f5b66707152c041b052cb44ff4648ece7d33fa2b1e167959f34eeaa513d93a2ad08ff7c0535332fd7e106843bae674d409b22ef2b54e90d7c27bfaa6cb634f611388b0b0851b2c65d68886b89149980b7d53d8d5fda7d08329399a0fe754e5ef9885c0c1d91979eef0a2e96537ce5b633a2ded3a14220c0484c3b46bd70eed64a2008a9dabe06a257712e28eb1fb79cf982739c37b74a46d8de3bf31d3b39221dac91cb087c8e268e45e12b2bc8259e4c443a9673331bad88c27afc61ee1cd2560eebfe77d82cba7e8f82ddcd308b5aa83ce175b5a5b65b865ddb8f79c5ecc5fb4da6c24d1fa7d67166a43b173ddfdb6ac117eda90572c46b17332af1662f819c15344be72020ce0644109f4ad958f591ba13dd6ab529c4e31e7d8d34469dfcb94825b7d28baab516897accfe1c1a38bca0fb01a9404c2aada77abb25fd34e40154ac29d326cbe8d5262aa044fea2b0a54b00f18743f1a35387505b5b22263501894f7d87f103226f8c50d77f0d54edb",
+          "padding" : "303d3019061536303836343830313635303330343032303165303305000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 183,
+          "comment" : "oid with invalid node",
+          "msg" : "313233343030",
+          "sig" : "4a8db880aec3d9cf1e3b778b4f1616e1b16ab80ad3410eb847f4319d35b5ed5b63ea0f96260434e5281f6242807f1e776a9a5f6dffbd65c8de10b8ba7addd44289e30b46ff327f7db6c34b09250c22a1ff96044942bb029dcb2ad0022117aeec3c0fe89421e9a873d049e3f1f5884f3f1056974f2df6351960fa5090aedf544bcef4d59dedd3ea170c6bddf6bd5558d8d2ba5212fae3138406a112d0261128284c05178dbed5a25b589d3f1bf90e28ba9ce363f53605016248a7cce838f7ca2f20fe43298637de5327a9c67eb0aa10e6e92c0fe3f55fb299caf302ba1e87c1a3c50142a27947028f60b9baa272f662f443d78ae446f1aadbba4099496c8ed49d9b097d67ba2babe41b62f0feb8a11261f5c4bc86cd9a55baf5b83154116c1f344cb71f9d2d7ff6a8072ff5a9ba0d6e1817a798693be738f9c9b0563e40d7c8737f0f38c73229d00b57be895a75e2c1e5708d39d4a9447de6412be8d5983f5c1bec5a67f941e844c2ab8da51628edd6a03a8d2d9f5bce86a441b5981f7e6c0946",
+          "padding" : "3032300e060a6080864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 184,
+          "comment" : "appending 0's to null",
+          "msg" : "313233343030",
+          "sig" : "b81df2a5f0d8b8d3c5cd1c644f3e110597fd1d1abfc186f4c8012a6247c8102cae07155a7ad2edccf8e6c505e7a4ff0d29e34c8a5ff25aa25e7be34306844f49bb6d90e0d8a7ae3191dac814f00a2c41f6e2eb8122c199d38189770721b4dd0737286ca4456cc771709f23b198c936802c40f8061e6c971963878bde111f3c1f3e1a6503c5e58ddebd395966eb100e6882e71aee84b589e23278f838251092da897ba9ca862cf9c4d20cb20bd0094273f9cdb28164ba3229bb121b3965a02597919b7c75a93ca7e54c2a1a436a7172be4197d6819ecb4b71eab5b37d58600280951d6bb813f7cc5df3929d5b02860f024995311097e42554bb7083e613ba519517abb87ffdc39a0e5f4e4d4dc2d89e3c1b37f98166e80bff7be83f9477211b4ec8f45d8fa99b0dc836101c5cfb385072793698394310ba85772827c4c0774ad917b40fed0418864bff70be1b63fe4f401c411de9e4b57be72baeba53cffb807a7a9eb9c2b4f91049114823ad1abb83787b5d160787cf5d57d97dcfe95c44189f",
+          "padding" : "3033300f0609608648016503040201050200000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 185,
+          "comment" : "appending null value to null",
+          "msg" : "313233343030",
+          "sig" : "0d6eb76e1cc70a4a16d760c0a518defa2bb0987e2d43d8d294a55c9d60507a62236be3a6ae0098a0b28bf7030b373242ccccb88e4f5d4ce3567d8c6ebbf726ebcecb4ef0b26a696b68e59596e104864e5c7c985342e93bb40faa0bb1cde596556951431af93258664c1c1a0dd44e620b2ce0bed8a37014c460c829e0ca104e66cc5a5566394b3a43e21661e5d5fc0497f52d0d8a1c6ae3a57cb689d75e6d94be30c756e9b4d6b7f497a60a897b83c289f6abccd133b63837cee0c2ddba2b2092c29d96831fb14175dc84dd1c5dd1cf42338225d3be6379dc2f0b51b140f5407baac7177bad2de991ca6ed246b53c94381aaca8a299569fd664234d4fe928086383fd50c2af8b91909bf74a5fcf2e2ef30959b7fc0ccfa5d41953e2f1d3886f77ea6f145550b99b0efa3212d2a927db2b3f133a9c45ff5038cf5321fba0dfdbcb8a6abfbc65a2484692c1a89f49a39d00844fc2b4c6d488dc78da5045be8b560228c1e9c93f8f3613555d15e7e39bb5f4160d6e8463ad6b2cedb4174c4813c8d0",
+          "padding" : "3033300f0609608648016503040201050205000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 186,
+          "comment" : "truncated length of null",
+          "msg" : "313233343030",
+          "sig" : "3bf6856f73f6ef422be2e247ca197d3d7ea3c8aac7c12af4e26ab047eb7f8997a97a3b6afbea78dce4ad26aef24568640643293f338dc2a0b867ffd71b9e9a30e9286aaf10281df870d2413b20737eb8673ebe3479685459ebac4c30c123291d9eda00cfd580eea9e77c88087185b72fe6b3b0ea201d9b770f74e24595fc02d40db9356ae20d226f9fc09e59e3f7f760cc3aa855da72d510fbb8ce1e6586588f3e79a64bbfb2ce1983d813fa1ffb5890a5e59c8066842f1bde986b7f1af334cdc1db4d97b793d631d1dc67fd13207198106f58bf80dc1188fe571507b80cf4ca18ba4cf7b7953e937884344d4d8f525db151cd5f2bbd856bd3543fd5cf71bc7e5a45e10553dd1ae47d0cf5947e8dfdc8fa174f6642dfd5e3f4ed300d7571ea31c28f14bcb37dfc6e98ee6b1162d72ee1eab9ad21f4e976510178b6ded5d637b1245fdc48458f6928088d4fd792532144f737a9d9fb157fd22225a98e0a38e8197d4c7af95e2eadad8235ee0800a5ce584257035a6759ee0d70e7216c06b6ad51",
+          "padding" : "3031300d060960864801650304020105810420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 187,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "3428832b0a12ef303ea4510428a001d6c54d3c3cb4008cd07f57a3b73acd1fcbcef9d29f84a4ca1b70701bbd193598aad70e7d64d187da76bac023ff909b338ca75cc5fa7de2eadff33e377814de682aaff232975a1fb1c36e401fc40c4ea61941d7e6d36af36ae0bf30127f2d05fdbf95c8f0e80a27300373c055e3f5aeddb48b57936dedfa58a3712a2041580abfed8d214ee35e08a5c2d06e9bd9487112ea9862c56eb2eed3f5ef166bfb67bb76ddbb1ab56fa60e7e16a34f8d2dae992a255ba12a154130eb07c8cfa6c2d23331c043332c287528239b7b138f7787db620c3c908ba150dfbbf712a51d5e56bd139824ce046c598ba323ed3669021308b76d70925fdc7461059eaabb4c6776280bf985c34f1bc035e65024629f47c2026ec2c9242d840b037aa4c634659bbef8283c39785ccb596185689abec72e7ed527fce49264487cb40423fea92fec60bb547695abba011b862db538684fff0c77823b0df95ef1396dd93a5189c158c7a845682848455b73b8822a9c27b8a3e789c98c",
+          "padding" : "3031300d060960864801650304020103000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 188,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "264ab320b777d6c33b56c4a61d1beec9d4191024268a32d3ec83c247bd34bf55aa60660adf5d7480d1082237ee5515692e6002051900b87ed499ed879d7970028d308aab51496864f2d87d3ce95559b24646be209921dd147546203bbc38fb13f38120c4fa5cbdf5b9e39cebe2034588329dd0e2e393caf14d17135ce467397ff71db128316a7220561c6714e0abaa088dac39f98cfec71f14f6b3bb11848a4809240839eafb0b9695967ed8e9ea0b7b2fea9ad6a60c38005e3ce36aa38a4d2fb974e57a6482ea47a22b31cbf9ecd73ea7d63a4d5321dabdb1d9a1b66baa754805322040807982cc4a0fcaa1b30b13e3b8b1675e190c76e7613db3e57f199964d85ef6b8a169b0d70304355fa1633097407eb30e5c5ec6bb2e356b79d74e8d7a516e1cfa1e105c4e9409dc87ca041840b639668ba9819f3150929d2114ab54fed418fc940edd030c481292c90070542cacb0a7efce531f69ba818447fbced8c622524b2e6fe57c466345c2b74e7c6effe9d9a092e0c5a6b1b7f36b11bd2afb58",
+          "padding" : "3031300d060960864801650304020104000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 189,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "b6921141cacd717d45fba03ff01be38cccfab166c66121177ba660551efc193ab187baa767d12936d1b07fa736240b24e8c7f6bc02b10d82eda0c20b80c591ded6d27abc97f0640147e7c7bf8dca3bb250c993efd3de1f1f58b3e6d5baeb0652472af89d3a08dd8ff39bb4550eb2bf370d6c4f79d0f093c8e3d99953414a5f92593e00448130bf6b2466212d108cc0cd01621658c401cc55700a4e51da8d02ca634cc2560dec5210f28bfae4bcbcc62ffa10569491ad79e9a1b383b55291b8e9b431c51b0afad99eb5cddf015c7d91930c99dd7c47708f1e254ea1c8c09c10c796514478634a9a5c8ad87f6244903c59ca5cc374fb52b244c002dcf39f675caef15bd1329f6180006106111a1e91d4d9c7ae56d065d36fb9843d74b7f4fa8a789cebae586c072359002fb0c3698bfb74439d561f093587fcbc09759b60964578c3150fbfc1823c76804d6e643d2d67c0ec6fd1408d3a7e0ff92527d8c857a92f3ae4400b4312db163ac889b0634f424ee4fa55781e46219ea25b1bc08ddfd959",
+          "padding" : "3031300d060960864801650304020106000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 190,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "6467d159f5a3bcf671e1c4442e5f1455533866ec8053a788b7e15a0fdaa7d62dc93e66a5d9d9c85c11bd6bcef389174caa3aa9d54ad3978963bf69b5ab503e6243ebb515adc2bc45bdd6126446095d0c0bfd7632bcd8168147b141007592b1f1fdc8e6fb826094858685f627bf321457a8cd9df9c7290baaee6480841a5f2c6092a084a52f0abb5edc8a4cf750494b8d494f69b3efa970378ebe6846fb83ec22ce56ae8c2146ece552925d2f3eecea726d02f56ffc23c6010b52b5240119ea326349bbbfca1c799dbc5c24125f2c41fa21718dc5549906c6bccb748e10189d6ce73bf89158b47e6e44f20f95d3684cc710859e61d878e540a53de45388e98fa1a1acc92283ba3790d7b52b22e9ed671c5b661ae33ffcc924825efb90962b430e91f468b9ffae07e0bca510441b73db302296a170d64e8e024170bfd0f5396a369080c4ae8e7a3d23a91b021e100e33a2a1c1f303252e63c62b59aa797f5e61b453c45dcbd69ea14f9e8eea4346d7c4957740d868860d7ca554ab88bc47b0058b",
+          "padding" : "3031300d060960864801650304020107000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 191,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "16669d358f0681b0f7f54c5840192dbfc462bbda4e2e13ebcb23cfd554f1454f616d156a28fe5a2ad2690897a1d6f44b4579407eb7486fd19b5f643a599eaade6bb6197627f38b7fc18eb6e42fdedf030cd4cfa30587e3100302aa37e6840196e1d48be48da0f51e9f92ead2cfa8693b38cb2a732a3fcbb27d2aac903a594c567c2ec8249c97ebc89747047a5315f8b5493c732859e5793672548eaf0161156ff0e96fa7a6d4085aec19c4a218958686746eb0a40d9a6336809ea435e6b45c4ea97b771db37b514415b86d57900c59ceaf4541e0b53f786332ec055bfecc1e14ffe67dcf41e9350802416f31b3ec0654b87db474bd4c3143418de724eaeb74b95312cfc6bb64659a2e537c544673f9ede21dd5e343c15ca7a74478d06951d010acf69a6befbb224262c95c4ae70760d396958fc3ececf8a8c3c42944575e4f4cea5d94dfc1c93abf18aa8a9ff50b96615e8aa8c8649efbfb69e0d1401c0fad73376a589790aca696ee8f92cdf8680a9a5b9a1fdea7260392d9c7c85262af7fd2",
+          "padding" : "3031300d0609608648016503040201ff000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 192,
+          "comment" : "composed null",
+          "msg" : "313233343030",
+          "sig" : "33eeef2f8424d783c321bf75d1b30a57454cf54d5a9c43256db187a70bd58d0a807d807c48ef1f15bbb06d7e908f2160cf36f14411360de927b86bbfa9c726fb859ba05fbcf1614f3f26039815b8663fa715c842ea5613e1322164b37a9e7dd521b1dc3b4cdcdf2787b4aed9853bd1425e951bb16cef49d34fac2c792184255eab68e8c23118baa26a7084ac59b0ca699cf2476689e0bf28dc7b5c7fee4538c0926cc394579e8d20caa0de2548ce9f909abbe6a99cdf4e2ddd7ba91becb620b16262609b07cc2dd9dc7e9594ada4c899de7808633955a40eb3cbe7cebfc503e0a4aa9e89a738ab86033724f5cac153d4fb851b73b6857bfb569cee78c849bf5905cbe09e3bbbeaa5db4b2f13b911706aa350403b6288b53b570ea1223e875343f3f1e4ad2da3755007dcb7cea413dd7d3f8b5a995039152ebaf5617d6e40d01424834c6cbc352b2f76a6b763d8be63013f87741232f6b4c4c67f23fdfef08a4362bb16531dbefd3c7ca514e78ef0b8b7837e5614558c28dfd6fa8c4ad6f11a2b",
+          "padding" : "3037301306096086480165030402012580aa00bb0000000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 193,
+          "comment" : "lonely digest tag",
+          "msg" : "313233343030",
+          "sig" : "04b2a5ace2b1f16c675b02da8a8532511a25d59b2f37031baac48b4b83bb434df89ec93799ca6e3a9125049c051a0f9ba89dec99931cab9786c2bac52b2a06a6250ddec383e3290f423ba899869b4eaab192793d15156b13cee7f7d618ba7a6acf49c992d381b59be6f020812d5a0f90d12814ebffed3a02994a91eb3f2c079f03145576869878f641ccdadfa2eb946c84c122bc198e3d343f0bbd6b041701e7a20db8460a2ca79d35923497028b6abb3d72a5a6fc4b3e9092c2118e248140ed2526ea7b5ea56a2ef04bd40ff27436c7ceb1b3b29a887988d009167dbf2b0ef5ed2191d14ad2eb2d763a7f03e0d733c1f2c27e4634063c39bbb0234189d72bc7b08695e4b0f5b88d5a16f02914c74dcdbe55e7f8a773c9a7b9c9780a2d2ff0b0ba4f9adb0bf263afdddcf2fef8046c605d9e0ceb8b3ee793c41b4b320d7c71f9835dd6a604d5216f55c9a83f67b8f5bd28de1c7b499b7ccf8640c78538c88e00edc66b2d6bcb24bc4018d1d731c05d250d4f3c7b722b38c74bae05c1bae4976a",
+          "padding" : "3010300d0609608648016503040201050004",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 194,
+          "comment" : "appending 0's to digest",
+          "msg" : "313233343030",
+          "sig" : "050789f05b63424da4d9bfb1bb9a6e816f2b77eadd4e127b2e0b2b5d16e0a85b9af3a7e42ec2b862f477261787e4b65d849254839d88165033edf953e954deb1ad3bc6a0b8e45b97ed267f8104e69ef0db1c740e5e587a4cc17f48e10fe240dee9666a4e71d7c58e54518a5b1d04cfcb9b67e76374e7974c44c88b9b4bcd7f8e5a10132745f398e3588b6dba5a4d680ea8af0311f9a3c78ecfae00217706a7d7acb187caa7883b73058015a2b9c3a663488e1a42ef143337acd5a2563feb38faba0c1c0be567481107402715ed56707d7d0015f9cdc38a9098d4aa9806f790ef826dce67bb766c3ea6547d987a00d5ea252e52d9f536ed2b7fcd39abdf93b43bb5110d3c472cc5df4da021e82ea132cee2646a302f6e5c9952c56eca12bf31d29e32bf810c9ff5c0535a9ea3264223874e1406ccd372e05c0cfd95b97cfc991a13c63178bb5ec5223e3b25e055188c77bf05d1c337617b83da328804ede26b599a76bada43cca9c3b271db2dccd7be1259cf3edbb020a4cda776084508081a24",
+          "padding" : "3033300d060960864801650304020105000422bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 195,
+          "comment" : "prepending 0's to digest",
+          "msg" : "313233343030",
+          "sig" : "9bdb19ee8de8003f29924535f141da242c069d7d5efec9c46044071834d2d7858e794591e277b87e1fdfa6b3108ec8b615fe76f3d374381562ce3624e35802730a4bfc2c54385da6eaba8903aaa8475dcadd67ace389724b59a10e7ba3bab6f332f44357c95e2e84a2741337a253bf85efb10cd9e69cc656cde704aa20681f993f2324ff323582c1feaca59ddfa26d696ae43b09832d2d34d126c40be89959dd2a353a2f3722e2e0c1cc070cc1dd0cc5e3dba9e9a7cae5a7e7bb20a58b37366c624180b2b1d77344351508a47ac5cb46277892f0a88db74daaea7a03ad8ac60a0e212ac5e18d01cc81af472d7bd905474c7596c374b6521579ecf115575eb90721c78c741bb48d4081d914b2cc9eaf9e7ff6c898b5c6d70117b2c8870713b4298bb88d7cecc3446dd4e10208c09cbe89738078f573ebac694d6da770b56900ac7e4dca41b7dafd8e3c96a63e79a28d9727a831b05169bb1debd17fab657d8b52d8f915590b3a67963ce5c5896fe6569ce4c90859cef89c79d1c9b8e48a46ee4e",
+          "padding" : "3033300d0609608648016503040201050004220000bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 196,
+          "comment" : "appending null value to digest",
+          "msg" : "313233343030",
+          "sig" : "b252d9c77e84f1274ac8019d0993427574d63a80a26c6e93b786fcc8ec699bb64306a9e425fc7fad43acf8a4fb40cc7c54bb29312430a67c0c23c79d34f2ccbbd3d196363901316bcb1fb1a7b6edbe4e457be1f9e92e272bdfd7b35310048212b8e8059d4dfcee86bedb0d7bb7bb0383d0187ae56b56851cee1f6740cad320af9fc25517d729c09ce30dfcf477a0f5fcc71c7342e99b17d831707150be963057a203b133e30adbe10c73df9079cc0d0b5b535c7a2f1e545352ac80473545143251bcc77ea46ab72f3c4be6ab4d5770020b765e900f33512ebcab8de4b9bae9ad68002abebae75773efcd84748ffe4be93ddbb736bc3cc3e5a81b5221ad4405adf4dd3f5fa9ffd5975116b56a0150fb715d22abe24e81af90455cf617d290873d14cc1b368f0fd969ad622b9bd299efb40f640507dac6bd6d4c8cc144014db6f74f71e751e7349176e549d694f68d4007ca6c51f6f58fc5a6822a3005478d5d890e1919990118ab5eb61535383c6aeebe1f514a793adae3c1a91f90dc3261279b",
+          "padding" : "3033300d060960864801650304020105000422bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050230500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 197,
+          "comment" : "truncated length of digest",
+          "msg" : "313233343030",
+          "sig" : "73c5e90d38f0fda07b0dd538fddff64534db7e4e7f0be09b62ed828c49c616663bcf565b2cca9ea19a77a5135d3dabd86bfc831c2b03d81817aae22f4991422e228e315934e993fb134905e1aa03b3539100d9293b8f68177f4326867bd71de9fa47c8e9f37ef46e1b9f3adcc2711892ce1f1dd9f238ee8e1cf2ee0c30408179cc290dc895cd46e2d717552f0a4dbc890fb85dea92554553c50f7f93b34f52625060b290860734cee378783b32453eea66b5bdb3de41839ea69d873346c710a114848eb0e53b26715bd143fe3ea67c3303d1d238be8032242f622a030571bf4726162788004541d642de9ebf1d4ad7ae7dd84fac1c3bd5215a18d65e982bca38342df82463cf606d7c30ea3a5bca3971f78328d0e55cb0bd99594dec125e73547aa6bf4fe22edb30fbe4ac4298752673b2a4bfd592a75db98a5a6d73e26ad1de4b63ac83ba1e29215125e74908bcc888ce8590925cab290711732e4638443a6dc60e705f3c54706b5cf23a654001de4e0f0c40a0078bd6b071cffc2f9f728351",
+          "padding" : "3011300d060960864801650304020105000481",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Replacing digest with NULL",
+          "msg" : "313233343030",
+          "sig" : "6495b6ed3efb642c89767686ca55fc7f0296bda99a2c04cf03f269f7823de1f8da9f67d0ea773c03a9aeb41d8c56e4f0919c4f228f60d1be84dcc68f0448d95e3028c230ab5b7cd807ad8c939ac83ec77ab5ff44203a6b7ccb6e69a6ef0c902f1e70f31d480737e418b3a73b9b0bb5ab551e86ff80c3e4e9dbff385a49718d7f00b5063c4f7deabc566494314fb5297968538771e0b3a5b27a56f11f6c9f0b9f6ec644a3ebd9b6e7acf668a1e64dbd3ff84b860f91c3d4965e657804e6c5c92bf5921e10bb405f0d11740aa4f7b46a82224e0305e312cd4e17a30757eee88667f2372cb4ac971b774ef78edf1bd299cb172867352c574cfbf23a321faaef28774d65bb22b45647b9a526b7c4245b6c06f2225151401a77ecdde12e767066935c0f9cc94320d6afce02afc71d30a45344c79ea22c72a247a1be6989e27d59ae06295fc69898d5f3d2877e166b9227fc1a0172ac8e367828ba3f6db8ba29fb963a205e897fd2fe1273a6406551d9b2eb4aaf88a7178da423cdb4eda07b2e309892",
+          "padding" : "3011300d060960864801650304020105000500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 199,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "4cb5a50291ed1e9d2514f4b5c8d005d81608ec004b035336991259fa908d5977ba8c75ab7f0fe0b31dc7127f9e81441e11b1fb94ba034459622b301cfc6918d49648b74680c0dfe79e455fd7c0bbe2d9cd0cdf8d28c71b949feb817575e01e3fef84f463acbeec12f1a5eb6b5af59d021413fded81f12e792ef3b4e29d3787f561a20884dfc296fa4490c40a790db98bec78be02d6d83907385a6ae8c15f9ce8b30315e9c0d1593b0a5efe03d25745f00f507aad0e607e5c81ed05838c3b4cee63405ac6b6a6034051479cb9f40f2a6cbb0c82913277e32d5d1c9c55c63aea1110cf6ec03fd7d908083a9aeda83db8bbe72f787af3914408d82ddf9d38e80ebfc152b36ebca127f7d82cba622684d44c150d46149dd452ce322820316bfc207a3b44a614dcb0f9ceed843a8f95bc7cd540df590dcc9a451c39d8d0a9770dcd7950b339990ec5100723bf07da131bd384d6141e98e18600dd44156750db66826d65faa991180866c752858536992a16cc0c89e56dc6cbc7c0972827e586757476",
+          "padding" : "3031300d060960864801650304020105000220bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 200,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "82cc73f7a3bd65b0910b012bb8a90593f78230d0b9cc0e3ad3895271492acf1d520c231aee97e20084edde67572b4f3f4d6f42f2e9b9d262c15479a0bd176c0767b1c89fb8e7776f18ebb210d353c870e4fd2ba3c42ce8949ec0c8a5899a3b841bd4f8de8b549e6736b1f3242ddf959b637d1be3aafc4ba7c46f2cae3a16228180e33796ce759aebbcca47a64ff2cebae8bd1dee8e5cd46b602360386620fe6d4704c16e61cd4801abef4f6832c1400e99c14a7024a46ee43e3f729241ae677c128d9b5c548066a8d765afbb42fcd3b491b480e2496c5ca5cbfc1b93f4f85fc5eb3dd81d882b86376cb800398efc25389750704986e5b79d1f6a22793cfa3519e519e0cfed2ff9e4ed454f87367239cd24cce8fb5b1bb35f9ff286ed565ccb1bd41c2c98094cafec4960e59e5c75e4f03794b7ff913e848c1ff0fc5e19d61b0cecf65cd37c95658e371a8629b091ba05135ef05cf57e7ec508be6f978787d9fc7fbc109132c2fe0efb8c3fff622b600b3d3fcbe46b79db032052e2c082257a05",
+          "padding" : "3031300d060960864801650304020105000320bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 201,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "943d197f031094c5f4938c130e3b9778c44ac5708e2b1346a77a9fad73948505d9630ba4cf537e9c17bae76033c7c6687ff256967c51d4241489440041a2956efeaf7ece62c3baf68057cf72b576258c79793ba81a1f726158867ea20cf1fcb9632c7eaefa0fdfc728c193d08e57a29855f2c4577c566f48cc1e45a6b0af10c0d68dabe814574a131b8ba167e1c7495955edf33f90043c9fa5cfb312b8d55d08689ea68e2c27d1c65188bd35475053196e05cad0ce63b9432bd40770c1b1dfce8ca497a352030c1178c6865b6615103b3634562b7ab1ccb1a08204761574aed2da75478f432add1b2888e21ab9da9ce2c00259f6a4b541388bb19a48daf91135aa9b540bd362a8ce1c986bb609056f19d12e4c56b2031a3c149ceeaa767f57939cbbabf1221d486c66ab5209f29480f63b367c8619d90f5e7eb3116cb87930ffb1ad45717480f00a01c6e69541523b998835c5d81633be9b4b82d492b1d54b2e6b14da2cb33b3fae8210611fcf15009fd7ecda3e135113baac619e8b74d70b17",
+          "padding" : "3031300d060960864801650304020105000520bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 202,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "1301f1131b35def827e8d8560f56d7dffcacdaf65df2200e054ab7717ca7a9f7f19a3628d8774cfaaba6a377e8b854613a4ba7c6237ab989976b0d1398753b7b66a724c91abba885fb77e908a2c6a3ad8d837f75d872eea76d7fe0d75363098a4c7af8bd831de55da3254b85dd199173c2708b191670cc659cd491eea567d633fc256134c2b47e1d1d28db03a5e8294f20a536cd7280e4fe86f750d99d41cbe5687217a55ccf7bae966caaea313258333d07fbb0b00859e5d9e21d71f190e4079ccb0026f074e7e4a984e8f478b298680470ce6338a2b25ff1da6f0aca3247c743c384d82406e44701a46a4c2e50312c11088567788d5743cd3165e3536b693e54f4c6ccc4586e462cbe4796eca57baa70b6296013d9c1c6f4e2e02a75bc6265900bd382892f4135a13ab600c764c546fea14febd51bc378bd1145c2282c94228db5e97d6ce7f29a505e46e373779b50b3856556d8907f07b61c2745ee4051d0f274947fe06eac7d4b091fd5476d6b7c54924018ad7acbdd252f1024080dd681",
+          "padding" : "3031300d060960864801650304020105000620bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 203,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "742a5c3575b6379d7166188aa6c9fe5406b157db778ee0900429d6c427fc530c4c0144a189265dc78ca14715a5a0e69995ff914fe0316e504802be88d5325af9344cc54db76e1d75030b3c41a27c8e9eef0c82d05ca92488475a109c878624133db6154799b4c2820997207389c610204f17d8c2b8d7cf61e49cef4b2a44ea88bf9c3026e29934be4afb3cff846482c5e76d0b581ce2851e4ebecf04f537e89c42f9ff29e0d8c94fa6741ec0a81fe7d3394ebef89d0cbf2824a374283a4e142ac6d7338ca1d6467df4bd97f9f6471c4e772995fceb7e34df6c7b583c73a6502677f23760369472b89e0051d6813bdb16bdfbfd1b9a49f474b29257883d218381a674fe9c245f3c419d0e0aa796e0c37c146469dc23f655a287370727da3a42e99f05595fa3f76165c6e5dbd0f0349daa60086fa30299f5e811c5ed4e957d4f52ffdc902a15fa97d2709f95f680ada1df9ac17ae1703471d00d2958f6f5642635570ec77fa1cf70c17e12d3a1202ff4106bfb7d51819f381b3c8f0d40b3a2f345",
+          "padding" : "3031300d06096086480165030402010500ff20bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 204,
+          "comment" : "dropping value of digest",
+          "msg" : "313233343030",
+          "sig" : "7c5f79bf21ab84e634160b5b201ef9fb0b2aa17713ce440c58e681c91ae777ad63d7ebdd1c77dbf90ce483160ed3451921df200e3eebff4a25a903e0db6c21a2e921a1423a2a23141a841444213524f36fe99386ef68ce319b9093162c475cda89a55487d975fac01318756ee64b70fc4bae1af18fc806acea41e74986716bc47a73293c5d3c55d267310744999e533904e73395f2c77fea30268f83318c6ecc657a4f4e87b239404c72798976258af3b444afa2049763e96072880f3d2a647e586ba284f0a50425a1deb8bbc0e52241d6ad589f5c20f09a2899fae574a4bd29e57b604a2214afd024a54951461af01d4f0a12f497136124bd3806244e8d8633336dd908c68ecf08435f0a97553d2943d060873411ca5ca62fe8337c526dc8146c60a0a1cbef0cf7b5818d6a2e96df207729276ced557b1fce70dde2be3a2012a6f6f20a9f94926504a593fe8dc6b04efbf559a362ec8a401772828d277d8f1abd9588441d575cf166752f57c1b50251cccb0282c75f0145df04e68da9f408b1",
+          "padding" : "3011300d060960864801650304020105000400",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 205,
+          "comment" : "using composition for digest",
+          "msg" : "313233343030",
+          "sig" : "3743ed858c007e5f535e567a2cb63ebd669283a40d369a06df23068afd1bf91ff4521455e45ab94b0751c4c1e648166c7ea571b415faa4311a1598c5ec0ea75472040040994ae32209ef33393f040e05646b0ab14ca0309e1bae24c0bb8ef467edd7ef74bcae2e8ac7e22f5bea0a8537a907f42ab3f6bbe61e24084642f3de68b73c979645a3d43956e7c738ae3621df707638f8b0ab0fdb854eed46e8e307c653b894393479dd1d0dc9f7317bfcc736d51af55aa036e83752a6d6433a6538c5b31900401944288fbe8209728ad1f5394ea66718161511beb70a20bb3e67a464204bd34da479617c8bea4e878c842519655dce03627d833f9b9add861d5ea89e85fc6a56e623719a163159302dc041c7c0c7c493131e09e631c297cfd00388f9bbbcd9a216a8aef364ecd579719bdd5ad40f2dfdcaa3756f574045eaf4f8b05b4b78a7294b77b420cd317f1b74e40afb649209c769d82e434842397749fc5f80b89a1cfba4d532045459179259e37d3506265fbb1b54b0e0d55a036746447dba",
+          "padding" : "3035300d0609608648016503040201050024240401bb041f5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 206,
+          "comment" : "modify first byte of digest",
+          "msg" : "313233343030",
+          "sig" : "7f63d99bd8bbd79dc7916069e234578e8966e7bfd0ed9b8dfa181fe5c340c7cbaa50251d4cf253346f4c4333567f754fb828e8e19399ea645e97a7006536d76198f42af8f57a03ddff688b83d481a222cd6e7f5bce75015783749a34fa5f20b2d0e17610e2c4526dfa780bca5c8d50d08b85e5377820ea657823599a32cc55d2966702e8b3f199f5dce42a2dcab5d372f6f30005e72aba34b149c89ddb14c7c7f5466902c0de4cfa2a6fcf2d297f76d9300e76ac7070091c9ff6a56bd80b9f09be64638db7c200dc455f0437009d3549f543364b03a2178bade56b1b33751752cf7cc744f2e69be572d56801e23e91e8a6f9d3260ad4d42c66cdbaa0b2252785f35500fbc7a61df87b09eaaaa4adf08cb42ed7414928f085baab1991fdbd73aa0afdf7623e14751ae28df8824711cd68c608bf6cf4829c2cc7db1159797ded24d017b9db6d284b5fa2ec7c4e22f56630b3b8779816ef0c77d6be4b3fe40cc0b286284a8773975327f535811278ebeea8530137385a8957964b33cb3489ac683b",
+          "padding" : "3031300d060960864801650304020105000420b95a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 207,
+          "comment" : "modify last byte of digest",
+          "msg" : "313233343030",
+          "sig" : "661b1580ea4a54570440ff74a751624926471469166304117da3cf7c9ef2784c547f29d9c18cc3f0de876b259110180e12570868ec164492b7df971eb6640a0b8d99dfa4e40d1c0b0e10e6945428b2e7e4ab3cac129f34165bfc1e5f370390c865ee44e2e1eb011ee448cd547c6c42ced8b776c9d3e4bcc32106cf112f5ae94e01d8a662e350bd76aeae070b9ef3fdd0b8a9ba01277fd9a5b512e4e3c1a0509b725581959abb340422a0953e79002efd49b72354ed8e75999b633d399c7b7f4e6726850f05d655a600b99f0cef7716ca11a8ca98c40322a1edd15c6e090748994e967f381265705971f9d397fce9a6cb7ce5d3669ddf6c08481a1322fea8c3f030d53514927b269a49cdef8fa287985c3d6f877cdfdc221fbec2bd1f38b4c3d01fddb4ff33e872cfaee30b588102f8ebd97ecca29b695e528ab0ac4c01afa1262dd4275d8de4712a2017dbb085b24b99bfa0b1f94b3d24abd8bc91eec4ed21958602d01c85eb34c2f09c0823dc523b01098c3167de5746fdf6f2661e3c2b541c",
+          "padding" : "3031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050a3",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 208,
+          "comment" : "truncate digest",
+          "msg" : "313233343030",
+          "sig" : "3e124cdc65f1d8fa0ef490cb7c23f812f28175af02b82f168e59d25e80c27678db0a49a1c4884368856a71a4b1b2f82eb6e3141d20c1afeb2f1c3ed827041c7d4e37d6a2869192f9534158813b0acb938610624de4cd410b49dca8a99ba03cbdb5095bee0f6f9b7925e7fc75d3173e19632ffcf0a9800cf75c2676fa614c8218ee996c2914d2205809a7b5bc3cfa6f90613ed68691927aa46a026bd7b2eb59d6512092d87e613cc0f0e76225ac3496051cec1e2d0c390235f814bffab11f67bceb3fcffcd03804ee6da2adf173c1abcb6d1c55960b3d4caa45be02d668ff29a063831bed22985cf74a640420beca4c08d2ba803b847ff696c364aa9610b9eed9a39581f382e76cae1fbcdcd80372499292e302f662e19b36224cab65378dadb6859d9daa4fccc239a61df8e7e288d7f4f4d6332764ffd3790fef9eb64b8c0c14c781f65507570ad29d7afb4689919d3cd674a119bd703cb46e9c95617aac644d71827707f11ce9886ec67211a68869bbfe8ef7b5bfb6af446e75d87aa6d12dcf",
+          "padding" : "3030300d06096086480165030402010500041fbb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca6050",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 209,
+          "comment" : "truncate digest",
+          "msg" : "313233343030",
+          "sig" : "67a7cf917c469d5b4e5c5a6ad0665feaddba9246cf577e4feb2cee49eb971cd41e50386520c3c22e351caeb8d23103f61af2a6abe15753ce14ffc8afa3a66618617b8c2397bb1b14d3c2c39037260e55b1f3f837b193bf39fa8036ff74f9a7adbe5e6d1cc39d368cadb823ac1f969ccfeae89808eb383c89d514ca122f96a7d56f578a3f10e4725b152ec06002eae7bc2acda9728a3fe455dc5f639c42c09bc6517f92dc223f1f08b3367840506c80894edc65d5163fd73d20048136f10f2583c6048c7ed8e82f44d0cdfed868197884dba5ccb4ca532907eed31d3678ce82a0163f10de20e4d5b581b67cc10f7d6030d2477d17e29baf828903b25cf2f77c17d028de6df352674b288aa60a3437834d70c57d40c853df98ef1e38e6456a7cba3d8082c5c212ce08216f604a997d632e7d0f21b1b462df01bea08dd484e0a9e150574ecbf31dae214a8013c2e640a3b01b0945cfb4d0deb5c83a24438156602058b1bd6c30aace6742264f8ff7682e18529010f25c93980a5214a90d0d32dcaf",
+          "padding" : "3030300d06096086480165030402010500041f5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 210,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "a7f03b3383a083af9fe06879d4200e5315d5ab86056dd87ed326fbf48589f95da6b5465158e1b33099c26a962b7b5eccb81fc2962188181a167c6552f1c33ec35ef6eed346ac46b4ce31be3a1726b87387a7e5e7780900f7c0a909e6fa3a8299f5629bd8d2da3e6339c181f45d794879ed812974e5203f1cb745a1da6b34bf886928d6fef9111cea3bf64bb57057c885d8dbba5951a23781993c1670b75404b990a01d4eba230b15a65623ff2b2556077fb91d846b098e16eacf85b541cc23039e9516b465b07e2b06783019dff98420fe15caa3546e823e423c5262af7f54b6d9ed3dd854e41bd1ac9aa4dd951784714e5365d76c096395d76a647090f2348dfaed99b4ded7152beb3798da4bcb533813b653efa5789b9ba863cfe1522e5ed0de68e53b0382aee6b2b888e33482463962a3f9d817a2dbc26a070212046d5e6b80e49767cd85bac25ce2aa0d02c5ebfd4c75ab733d87408c8ef5d21baff4dbd409a4e6d5fa7c55cd4b63796ab79fbdab7587bf234f0690d8e9cd45baf4857ab0",
+          "padding" : "3030300c06082a864886f70d020505000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 211,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "5c87e321dbed16d59c49867ca35cbeed697be4f279027879604f1686dfe246dead0694eec5b2f516702b36702d7b11297075b489d9087bcbc0eb1fe5e756b5824a13d06bcf90d298592ddb6e13ef362ae9eecf0c36380159ec511abf3d071ca89b05a56d709c3350de5be1926007ab5830098cf61e677bb4c9d2b79ddf11d9115905bd862b4cd708a069c79cd276b73aefa05f920ffd6a8fb778131ffe4c8a5ca2d81256d43f60e123564bebf9bf14d04cb6d3109865f6f44b21a8896c294c50f62ece38798ebed8276ea7e40e1d1fac611cb511295c03199491af3e0c3d8baccd4d30b2c9d4d47067073f074f29c079f239871dd62e16f53352914d89cd4c126d0e38370f42a902f007fca4c1557b2d6b420936d1beb484c28e392b4502bac5cc5441cbb59daa3bbde3644836682a45ebf4d683f11bd12082b4e46610847cbc42eda82b80a20c4d847963fbddf016232a6c7bf12409108eb395f66c6335fcb6d1b15f54f825f15c7b2cdd2afcb797c129140626e32c8031caaa007acdbec381",
+          "padding" : "302d300906052b0e03021a05000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 212,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "995096c669017cf835c7be99440523256d5e7c11c06af56032d785d521b68272771ccbd2b403d7ad18d73905a63758ae3a5a5edf49ecac57299ae74987f79417b9880e66a0d9893e29f31d609ab1622cb357a8d19d95d037f5d19c41dcb586111355e7fe91dd51959beca4dc689b36a7f39684753e9284102afb229d50b022427925c2bd4dfb15fde2d2a18f7df3069fb97605e02a341e325b0bf163fd6eef8f7013b4aba1e6f3a311631f5cae20bd48fdc3246e63215838136c402894bcdf1179c05e11a76adb92686e3afecea8ede7456d05f62b7a04983c46fae7d2718515e875a11a261d54d30ea4e8f4db75600a1af0c884635164aa72bc129c1ce543dcaedfe62f7ffd72804db58066613c2235fb4095869975196c1d5f423207c8de777673832aac6e129f7532e2fc16d7034a1255f378c504ab10d149e8d2e79232b01f6261fe8cd73f9f89c277aaf38ddb71ca92194fcd569802a65f4325a4f6aa5e56e0bc5cf2156c04ec0aa9dc63278ae48de9a1657dbb62153c1392e96d551630",
+          "padding" : "3031300d060960864801650304020205000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 213,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "4205aa36ca11b03b644339d978e1b02228e2ad387aabba21fc649a8c75fd9a1a4f29e91b4e607b4b5e3b86794cf9242dec5509bb30e456e4f5dcc57e83028c60b461f748b1d7e79c8fa4f934ab117114956da7a2693a4023d349a68a4cfa0257486d42a0b6c348a9f77b2eb5d8822569e3dea0cb95c66d68b7c955e98a9df4e921bb2731855f35f0327142029f8ef4306d42481406de9deba401b31481597653cca1234cd20d6cf0341292362a4402dad4ee4807b38728b265ed0d10d7707c8562f14b6eb890c5a1d427725d39f10802c7e865638772a9e0709641a22809633b9ae19bcf052b40fbed8a00531e869761a6312216d69fad97a7f58bb20be27cfe75a776a45e207b6cf1a10215da2c6ef89f540006a2177c840493c83fdf616ac8c9cd647a415532ada9cefe067a81393df8bb94a3449ef74bdaaae0b120165f4a64703d7daa14e8dd13fe779b794699ad57b593ffdec9202f9852c33a4336cbc0223e2117b37118bf9fc4fa6204a7e584db27cb009b800915b4618548d24b3b30",
+          "padding" : "3031300d060960864801650304020305000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 214,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "8100d8da45f6b2d77ee4c5c5b6fc8c617d85867eefcb861206a991f50638b0a582908846c8c10eab4b694850b6e440d85fc256fdde3fc4092c262041b28e1daf88a54f48c0bcb5c17d9e76ebf5f86c87e3b89478d679bfef8135cad5394a8e6211c64614f6ffc813707273b4d9496276dfe6d566582eead31eff06769b4c6ca3de97c0a622fb282c646cf3de6fcf8a12317255d724f099f1efb4a7379f47d4f13aa11d87e778cdc79784d6a6b5a2d68b9e4ea52bd507a7036c575485c8c377b8db9cf662e6eb973053b3630a94aea288191d9f26ee5fef5f10be3468c5a721421a07d9b25d5604a190d842fb3b92e70f247bb339295da253ecf1c9011d8d49d68552e192eabfa012fdacd63b9756ffd508c04e28039df08867e5d5298da5e72bfc1f0483129581b25ad3bc69204f2822fa5a34e3af4f9eedc0bb68b66a0268532cdcdf5365eb5162d05cb5619041a2f9dde7fe444fea5e9b3c524e3760ce1c633758ced22d5b98f0e1ccac9af15cf825cbe9464a5a5d45a8d1ea426f9499db8a",
+          "padding" : "3020300c06082a864886f70d0205050004103fa6e1540a9e5b94313c5907267a7331",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 215,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "118bb4ed79ee68eba200bfaf9909e1af3216904d9dad25815b2052da7d6e057c1fd8afd0929e82ec945e9dc17740790f791a1eb546dfe8d382aff418b094244382b97b8b7dc67400c99aaa5c68ecacbcb429a151ad0a77d0ebfcea781cd3093c312758c7478d4b50682702ee37f69df129f0eb6f19d80e88982700cd9bc81786fadf5f7d9d37cb07aa4ec7c863ab706c42133dbb79e34a22cce78617d86806ace0b4fb28525a1b0e8dfb8da4de2b5792531709e1632e36d8b80c5bed87e559819b5aee7613f1841e9f4b1a3caa77736eb71c9c2b190a6c6ebfe97c922b7bf3c1ebff0accf555d447812a1677d576f3a41a8bb3e8062c49481222c8c53bc00ac821c1cea8b909031f23cd1647f685260d31641177b29096f426816337b70bec98cc0d911b0f926a5c2782466af2a8cc8e8ae78243c916986bddec9169eee2f7d84a9d070ef02878a3b15204aced6dbab3c0fb6f35d07bb2514755c318e92e48010cb4ea5e7b9c073fed05a2a5dfacc4a94b0d78ab89fbc5f8746ff440dbb229a2",
+          "padding" : "3021300906052b0e03021a0500041421f0fb55d0f5f4e1521ec82216000a17e728f773",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 216,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "1613ed80cdf3d91d6705bcb079fd15ccc29373b03f84510edb0d74b5651b91967e60738258a03ad3dafff8d83f3c18feadfb08e9a94f9f131d3038288976ef35b9c8dc41beac539dfb0fa1e9772524f512a2054e73467c8443abc599c8a58b46ec2340fc4b26f831af6e09b8d5b876596008aad2c4045fc09bdef06f445f54e36f591c73d798a6905a993177b094dfb345a55aacde1304b05cbe652a62e9f6654b24153a7cff6daae42a55272fc72a8250acdadc59f74dabefb9d321e80050ac1f211ff7946e56d14619355544058b714a000d8b4b096f56338201f22114c81370543b392725b735017a550c7f685b675263f8f9b43c1f8e8f8064764dcc34c0d581efea1647dbdff9a296f1501a1614fe9d53d52ed278a8b017215503c1e648a706c5e6c3a4eb26f5eeae804ff5ad0116fb9d2d246723eaf6533ec71d126bfe7d08273e587a025c97c4d2a55a1d850a730495af8998ed35558866bc580d7c51212e63841f33829156ca9a938aeebf3a38bf67495b686d484b02c4a151bb2661",
+          "padding" : "3041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "906ed74270c0bdbdcf086ef69dccb51c524331e79d6186a8ad18f86c11657d77d752763141153dbbffe125f9e26c30f1d58808bb8628bd1e931262e872fb6503bc0c919b2586c4c5dc6dd53cb122086536a87541d61dc33ac6d437ea1b9a9e3f4476f7e7c3926e6985f3b8df8d7144f6a81568a04a6eae2977ecefe2664806fe144d9a174d53734be7deafc737d0a3e6e54891d85acd0fedfebb55d069cd3d3b2d6a1594ddf65cb433291ca4f2283c21a5aa4811bda25fa9a8b41ca9c5670cacf721bfd0dfbf388f683a7f87c39654d6a8c2f85196e23c915219e92189aa07f60dd6db16afa97cfbdc9413ec33f3bb98020ad58d4895f4959646727521ce4c2c0df3360fa3db123c455b65f4f0b0aa88caac6da5877b1da3c49a4fd587b3bcbf7fa0d107d69fc415842abc860c19f32dfefc8695b863468b112f0f886c8a249496c355740e07291493bb08ce9c941cd624b638b3466a4c2c51863410bd22488c5b7e00ff636f6dcde4ce7ae66614f8a283709b07f80a42739a0b2d7092031261",
+          "padding" : "3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "using PKCS#1 encryption padding",
+          "msg" : "313233343030",
+          "sig" : "0b5d0e26ab8bef0ea2a577c3ba6fd712e5863c3008e85f46122809262efcd65658ee490c85c7945ae06b6fa342d7dfe01aa5faa9bae877e9bb0bc0cd608670b54bf4ab8593720304e2aa0d2bd62c568cfa6bb2eef302e15769e5054e95bf7a954e8d2997c06bebfb9bb25ac6f52b7b4e79c872b425be6b731a4fb9bea7c408703c768a30f9cb455994bc42a200ef17c64f4d4d6d7269f29bffed1ba755fe4ba3233a7ad464932abf831eef5245a18bc61dfb399c7b2da6455b6e023342833b5e5c7b255c8e06fafc78266856db13317af40b6df8990f8ff37344029e731a51c937a1ca4abd66e0fe90ece58be527dda10b3e34ac0bb661135eb04fac8b90b0756bb47d2453be8ff80d05a6596a1b27c0a33f24fc79260e9dc0a6e099f6a95a22a4e083a5acb201cc654d2fc6e21cfeece62eee3270e6c6211c2025d738953e4a8d1ec7e4cee254a8d2eb446429aac5d8ac480c4305b32e566b5a017348fbe2422246f0696c9895c2a72db471e058fe15207c40ae84a46cc7ecbdbbe9cb9100c0",
+          "padding" : "0002ff...00<asn wrapped hash>",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "using PKCS#1 encryption padding",
+          "msg" : "313233343030",
+          "sig" : "37540f8ec9398571bbb6f153c1ff17055c96373b7e75e41f75d959c0b937d635baac3ab200f7907af63bab90b7d0128d603353d5628653bd067caf644cbd4b4319adc964869e2d7933a3c4b873bd2a4b3f8c0659943058293e42963906424a2cece6504fb8cdf76c21e772ab7a0359b191177d2c2231c4e4a5453a8af346db0e91e057fbd6b70dd486caf9516fa7d6f408d10b55fefb03a5795311b0722ee2a5d40a11e29316bd6fa5ab8eb34ef1a0375c87489a8821d0ae554c91bb051b03e8b3c3f301927d8478bbd62f3f37213c734099730c582bf19095e39ece2703ad09a7af236f175706714a80be282e262e7c903c59795754e589007648b550f93d4c7bfa17d116497b258014a86fb00403f05598ad588010eaaeebc2e81f936c5a9524446323a890c69ee99fbfc6917ffde3e04a591957279c334e76dc0dbd4e37a493de9ccd9fae9f3962e5342816901771890a22437f56bc201616359ba68c041ba1daca49e4c7bed3849f9c3758b47b7f90a9e2d03a2fb116b594e28bf74eb1a2",
+          "padding" : "0002ff...00<hash>",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "invalid PKCS#1 signature padding",
+          "msg" : "313233343030",
+          "sig" : "4c548eb5ab00b32b5cc200edb95a1f617fc9a2b82623da511a092c6cd7d428621016ec0e8be4ca66993a079125a4af990df598d5202f73822a5768de5c79af28487218d0f6a23960db9ea8f050b4da444a44bf116179c2d01c4e7b438ee298bb5769a8efca3bfd4492ef4f45494e1540ba279056354f5eb554193269627bca912f0e770e230d5e3671292059515d163cb52c181c160ae8b29de3e90c069cdd757d4adfd5014db2aaf8371a390d0ec6fdc19f37d78776b00b55db4d6e04e0f047ed08a3896cf69bd155e1a95f33fcff2918a58ed0b377cc46d1a09825d06799812309f6473b2a378ffdcb4e6a6d774009085f4cbeff43b542e2bee3aede395f3e0b5c878c303b6667c34c2ee6440657941638b8356318a9ab5d4a072ca83f7482ad764793add9f100377d750bce70b9d063d26ea3d8f29576de1a3795fe2be290623c119beedce6ecedc86804f73f3c210550bd582a98f6a7e86662b6461efbf0e518bf28d9100c09e44c8c78b5158197ed2ed1675291600a6442cf2c8c038fd7",
+          "padding" : "0001ff...ee00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "PKCS#1 padding too short",
+          "msg" : "313233343030",
+          "sig" : "7175635076412325c1aafb617fc38754d4a33800c55f307216233b6824fc26dae7bf8e4906c98ee4a22d527ba46e8161df8383e87018a12735d2036600b79217e61f6b76bf4cc6c50cdec487c28ca9fbd5cfddbd8f3021cbfda8d238c61d848eeb9fea97cb3e0cd6a56bd42f565a1b635f960d786dc229e5f58fd0c4465e32e39e5f10e21ead60641adb04d88f920d0458dd9cbe15214070dd74b1c288d8a1ad83e526bebd0ca0c35375b84ca1e05d9db0992c6453307b8c4d64e02fda6af6a56a8f53196e8bd8c1ac8fcfd699542d6f9ada11fde6a2c25ce3727118f05456ac7cce967726bf1beaa1093d8021b4dfef6cc765696de57d5abd4407ee2d96bc7439cd9385cb89a9a06b2f4cfa8715777b421d9c26e35d314a242c844157f61888b4a57c169407c180392e21ceee821a82d9ca8da77051d7efb1e1ad08c8824c7aad904ccdcc0884272d118bc7200fb112a709c4094884336304f6ac062eacec72ccf143c6dbe181e61c3efed13bb9cd0c7c2901589fad8fdfc880e24d9efe23e9",
+          "padding" : "000001ff...",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "CVE-2017-11185",
+          "msg" : "313233343030",
+          "sig" : "c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b1203",
+          "padding" : "n",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "invalid length",
+          "msg" : "313233343030",
+          "sig" : "c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b12030000",
+          "padding" : "2 bytes too long",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "empty signature",
+          "msg" : "313233343030",
+          "sig" : "",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "0",
+          "msg" : "313233343030",
+          "sig" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "1",
+          "msg" : "313233343030",
+          "sig" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "2",
+          "msg" : "313233343030",
+          "sig" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "n-1",
+          "msg" : "313233343030",
+          "sig" : "c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b1202",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "n+1",
+          "msg" : "313233343030",
+          "sig" : "c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b1204",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "-1",
+          "msg" : "313233343030",
+          "sig" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "3",
+      "keyAsn" : "308201880282018100ab54a4f2560b9f65faa2f83bcf77d41803c080e4e5c3eab3534210982bba8a5d7e513ba50ba1ece33555c5457c41ba58f3f605a04369408f586c26dfda464c7b300a01f1616893264c7606daad4ced14df9a894a1f34586181294297e3ceb9580b0c785c056d5c566467f6f227f3084918d1cd17ed156e7f9fcce4757c5794f92770771ea5cf3101ca0425c846775f56938c1d1cad4401f4df2f5e0d3a3b2770f99e3c1cb4d9d4896c7ca89287b45831218b099add4bdf1dab6e2fb55d2775429386c85dff32c07a6dda504a9627529dd82c943554aaf23c5a5f6cea9c301b4b1f066b86bbef2e4bae9dc5b5e82e1fa03c29ff8bf38556729b356d5ba41d37a069fcc8fc23ac715bbea04c1972a2d50c57cc0159a46b5919fb670fb2a502d5ab66f0aa99e51016b83a406943ce9bdf0ab9b9e946574a5b32ce95d97ac8b1fbb48f0bf7e3c0d4b7a00d131966d009997a166a6630dee4a74c141cde0114aa423351b1dfdd3893a856fc632b6d90dbc79c8a61a9f9e31702ba69fb222860e60a83020103",
+      "keyDer" : "308201a0300d06092a864886f70d01010105000382018d00308201880282018100ab54a4f2560b9f65faa2f83bcf77d41803c080e4e5c3eab3534210982bba8a5d7e513ba50ba1ece33555c5457c41ba58f3f605a04369408f586c26dfda464c7b300a01f1616893264c7606daad4ced14df9a894a1f34586181294297e3ceb9580b0c785c056d5c566467f6f227f3084918d1cd17ed156e7f9fcce4757c5794f92770771ea5cf3101ca0425c846775f56938c1d1cad4401f4df2f5e0d3a3b2770f99e3c1cb4d9d4896c7ca89287b45831218b099add4bdf1dab6e2fb55d2775429386c85dff32c07a6dda504a9627529dd82c943554aaf23c5a5f6cea9c301b4b1f066b86bbef2e4bae9dc5b5e82e1fa03c29ff8bf38556729b356d5ba41d37a069fcc8fc23ac715bbea04c1972a2d50c57cc0159a46b5919fb670fb2a502d5ab66f0aa99e51016b83a406943ce9bdf0ab9b9e946574a5b32ce95d97ac8b1fbb48f0bf7e3c0d4b7a00d131966d009997a166a6630dee4a74c141cde0114aa423351b1dfdd3893a856fc632b6d90dbc79c8a61a9f9e31702ba69fb222860e60a83020103",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBoDANBgkqhkiG9w0BAQEFAAOCAY0AMIIBiAKCAYEAq1Sk8lYLn2X6ovg7z3fU\nGAPAgOTlw+qzU0IQmCu6il1+UTulC6Hs4zVVxUV8QbpY8/YFoENpQI9YbCbf2kZM\nezAKAfFhaJMmTHYG2q1M7RTfmolKHzRYYYEpQpfjzrlYCwx4XAVtXFZkZ/byJ/MI\nSRjRzRftFW5/n8zkdXxXlPkncHcepc8xAcoEJchGd19Wk4wdHK1EAfTfL14NOjsn\ncPmePBy02dSJbHyokoe0WDEhiwma3UvfHatuL7VdJ3VCk4bIXf8ywHpt2lBKlidS\nndgslDVUqvI8Wl9s6pwwG0sfBmuGu+8uS66dxbXoLh+gPCn/i/OFVnKbNW1bpB03\noGn8yPwjrHFbvqBMGXKi1QxXzAFZpGtZGftnD7KlAtWrZvCqmeUQFrg6QGlDzpvf\nCrm56UZXSlsyzpXZesix+7SPC/fjwNS3oA0TGWbQCZl6FmpmMN7kp0wUHN4BFKpC\nM1Gx3904k6hW/GMrbZDbx5yKYan54xcCumn7Iihg5gqDAgED\n-----END PUBLIC KEY-----",
+      "keysize" : 3072,
+      "n" : "0ab54a4f2560b9f65faa2f83bcf77d41803c080e4e5c3eab3534210982bba8a5d7e513ba50ba1ece33555c5457c41ba58f3f605a04369408f586c26dfda464c7b300a01f1616893264c7606daad4ced14df9a894a1f34586181294297e3ceb9580b0c785c056d5c566467f6f227f3084918d1cd17ed156e7f9fcce4757c5794f92770771ea5cf3101ca0425c846775f56938c1d1cad4401f4df2f5e0d3a3b2770f99e3c1cb4d9d4896c7ca89287b45831218b099add4bdf1dab6e2fb55d2775429386c85dff32c07a6dda504a9627529dd82c943554aaf23c5a5f6cea9c301b4b1f066b86bbef2e4bae9dc5b5e82e1fa03c29ff8bf38556729b356d5ba41d37a069fcc8fc23ac715bbea04c1972a2d50c57cc0159a46b5919fb670fb2a502d5ab66f0aa99e51016b83a406943ce9bdf0ab9b9e946574a5b32ce95d97ac8b1fbb48f0bf7e3c0d4b7a00d131966d009997a166a6630dee4a74c141cde0114aa423351b1dfdd3893a856fc632b6d90dbc79c8a61a9f9e31702ba69fb222860e60a83",
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 231,
+          "comment" : "short signature",
+          "msg" : "34333630",
+          "sig" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011a21abeac8409398319e65c8656f8f72e179dd1e99358c7531fddc037e47c1e688cd70eafd6eea01c823516bc79f89d7e52ee1eb4ffdeaad1d550dc0a47185bc9c42e47fce5503c3370a60510f834b4691152ef668deca633cf3873ce6613951784aa7dafde118f37f1cdf1a687ac236d5c956bced564b73cf202e3bace59667",
+          "padding" : "3031300d0609608648016503040201050004205d19d2275db8df24fd8e87092599d5b8c7c798f483bbb6cddb4310353b903971",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallPublicKey"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/rsa_signature_3072_sha384_test.json b/third_party/wycheproof/testvectors/rsa_signature_3072_sha384_test.json
new file mode 100644
index 0000000..3067443
--- /dev/null
+++ b/third_party/wycheproof/testvectors/rsa_signature_3072_sha384_test.json
@@ -0,0 +1,2095 @@
+{
+  "algorithm" : "RSASig",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "MissingNull" : "Some legacy implementation of RSA PKCS#1 signatures did omit the parameter field instead of using an ASN NULL. Some libraries still accept these legacy signatures. This test vector contains such a legacy signature"
+  },
+  "numberOfTests" : 230,
+  "header" : [],
+  "testGroups" : [
+    {
+      "e" : "10001",
+      "keyAsn" : "3082018a0282018100a07887f373378196b0b748cdf31c14735ccfa0f117acafdaa21fde4b6e7559390b834e7b92e9e1cc9d49fc0fe6cfb60429652b4bf9a7768f71fc4271ca6fef4e431192ebdc98630bfb94c5baf18b4cf7881d84483e4c44c22db15a9627705a0b42a26d6f3d6009aee0d2a71bedf4d4b0ee6b6fec2f16e1277ecaa3bdedba406473a476d1688df0fad1da795526c7e641981b4812b05b692d60c60b2bfa424c8b620f40dc9dba59e2c710e7ee750b3e134c1f71f43210688aff17aaa41cdb5668753f0006b1cf951bc5951f4d89a31196985ea55c0966c3662bcfe4e4cd34f12e4afd7e5c4a130739b1017d6a583882fd72db1a67418702c8b01353ccf75b7b93faec0e0be36211d5f2bd910e1552323711bbeb73858f899cc1ec063ef67d88e0c699d5a689c52106f06e960f09d2a3cf84f53bbea2a473edf2e6e0176801d3fa1c2d358e1e5a26f646ac93796ec1fadc6991c0ec19c9dd90b25a2dd3bf73d2cf1eea8867f96caa5a2df54973acb2a2da0a1367ec74afbb968f517765238d17690203010001",
+      "keyDer" : "308201a2300d06092a864886f70d01010105000382018f003082018a0282018100a07887f373378196b0b748cdf31c14735ccfa0f117acafdaa21fde4b6e7559390b834e7b92e9e1cc9d49fc0fe6cfb60429652b4bf9a7768f71fc4271ca6fef4e431192ebdc98630bfb94c5baf18b4cf7881d84483e4c44c22db15a9627705a0b42a26d6f3d6009aee0d2a71bedf4d4b0ee6b6fec2f16e1277ecaa3bdedba406473a476d1688df0fad1da795526c7e641981b4812b05b692d60c60b2bfa424c8b620f40dc9dba59e2c710e7ee750b3e134c1f71f43210688aff17aaa41cdb5668753f0006b1cf951bc5951f4d89a31196985ea55c0966c3662bcfe4e4cd34f12e4afd7e5c4a130739b1017d6a583882fd72db1a67418702c8b01353ccf75b7b93faec0e0be36211d5f2bd910e1552323711bbeb73858f899cc1ec063ef67d88e0c699d5a689c52106f06e960f09d2a3cf84f53bbea2a473edf2e6e0176801d3fa1c2d358e1e5a26f646ac93796ec1fadc6991c0ec19c9dd90b25a2dd3bf73d2cf1eea8867f96caa5a2df54973acb2a2da0a1367ec74afbb968f517765238d17690203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAoHiH83M3gZawt0jN8xwU\nc1zPoPEXrK/aoh/eS251WTkLg057kunhzJ1J/A/mz7YEKWUrS/mndo9x/EJxym/v\nTkMRkuvcmGML+5TFuvGLTPeIHYRIPkxEwi2xWpYncFoLQqJtbz1gCa7g0qcb7fTU\nsO5rb+wvFuEnfsqjve26QGRzpHbRaI3w+tHaeVUmx+ZBmBtIErBbaS1gxgsr+kJM\ni2IPQNydulnixxDn7nULPhNMH3H0MhBoiv8XqqQc21ZodT8ABrHPlRvFlR9NiaMR\nlphepVwJZsNmK8/k5M008S5K/X5cShMHObEBfWpYOIL9ctsaZ0GHAsiwE1PM91t7\nk/rsDgvjYhHV8r2RDhVSMjcRu+tzhY+JnMHsBj72fYjgxpnVponFIQbwbpYPCdKj\nz4T1O76ipHPt8ubgF2gB0/ocLTWOHlom9kask3luwfrcaZHA7BnJ3ZCyWi3Tv3PS\nzx7qiGf5bKpaLfVJc6yyotoKE2fsdK+7lo9Rd2UjjRdpAgMBAAE=\n-----END PUBLIC KEY-----",
+      "keysize" : 3072,
+      "n" : "0a07887f373378196b0b748cdf31c14735ccfa0f117acafdaa21fde4b6e7559390b834e7b92e9e1cc9d49fc0fe6cfb60429652b4bf9a7768f71fc4271ca6fef4e431192ebdc98630bfb94c5baf18b4cf7881d84483e4c44c22db15a9627705a0b42a26d6f3d6009aee0d2a71bedf4d4b0ee6b6fec2f16e1277ecaa3bdedba406473a476d1688df0fad1da795526c7e641981b4812b05b692d60c60b2bfa424c8b620f40dc9dba59e2c710e7ee750b3e134c1f71f43210688aff17aaa41cdb5668753f0006b1cf951bc5951f4d89a31196985ea55c0966c3662bcfe4e4cd34f12e4afd7e5c4a130739b1017d6a583882fd72db1a67418702c8b01353ccf75b7b93faec0e0be36211d5f2bd910e1552323711bbeb73858f899cc1ec063ef67d88e0c699d5a689c52106f06e960f09d2a3cf84f53bbea2a473edf2e6e0176801d3fa1c2d358e1e5a26f646ac93796ec1fadc6991c0ec19c9dd90b25a2dd3bf73d2cf1eea8867f96caa5a2df54973acb2a2da0a1367ec74afbb968f517765238d1769",
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "473432cf11b6f96b1dd41e1742ace21cd10e8dad89a3e00ec68f3b45411059d0bbc6c8a3f077bfb4b12da60aca86dd856934061aa8e4c3221a019b7ed3d4e70ed8bf53fa140d3c31877a135a6ae140e021bea9408ee61fe7f32e60cd18932282b1aef1019f9a39789cb48991e535568b55eb26cf96e9bab35d03121f6be9f0d65079b064cff923edb5639cf08f48ecaec0670ab37b03e4cc2e604582e1cccef79f262c8b3d146887303c542ae7c455b0f68e882c5e2259ecd9f76cd3706e9894766089b267ed3bdec29df5b57e6a6f8deff21e093ce611724ba1012cf63aa2c62e7267af4b1df5ef030e6cba7b217d46fe43fab255f41ce086bec5e4f604718c95acdbd5c56bf8b68541ac0dde0a5e0f2336ea608864abdc5324b29b9f7bd35c514373efde38bb593b8d4b249535984662bf4b397b2a584ca15624416537320fdef81133d6038edd99ee19af9567c9fa536474effa925555c9c2fcea525fe2da935b791ec1d7d3bde33a58f80dd1e587e1c433239c65332e94d66d3c79bfd190",
+          "padding" : "3041300d06096086480165030402020500043038b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "69d89aee9a1b9827228c40c3f3bdb9479ed36bedd2c77b3f5dca19917a5cde9636b9f6ede29718a391224ab58f464c9052b5e6786178194a90ec04d2d2b7513b19df2799b0e7a2d6d1ef2c49ec6870fb8cae45ee1103692da8d211bf61f656d304f69adf68c0227c7af5ceb8c2db4a3668bb6a1b8cc3a437b9df79bc0dd650d6e3a42295b4a6e23d40b3a9b7548f3760e0faf69200df230d2c143807b2f35fa449cfa73792844dff5d2ae50adc272c0dbacacd60eb0b7964012a5c1981cb2f358ff53509f90b0ec41259fef321e9a306a08363ed194e51ab6dbc00ceee576c048c02704a19f8f357250adc70cdd2819157d71af04ab0cc63ac9c6fa4b5799eae521e275f26ce53302017510826f96c4a2889deaef19fdedacc70a6598aa89e2bcf373239bed98d1f2267fa7c2436add13df68d9ea296fab52fed0f5ee46874f48735fe32c61ed2b1c977ff1862ccce093bdf7d84a6b03c3007c4c926d1e52d81dcc0bc2a553a12be363b764f6a322e41a8318ea7408c18e33c260aa05d039625",
+          "padding" : "3041300d060960864801650304020205000430a5a2cb4f3870291de150e09ee864f3b2b3b342937ac719a149439185ad6a47bb4f23ae83ff20f0c8f0c79a1764244a63",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "259332bd5a274bc347ffa3e8a31c8b27f216cc865d32c917a5d7e4c06abd44b6c024f44eba997862c812d8ebaf7caccbb234293178e44b2532478e8bebf6af5f83318ebe398e0850e929a89cda860cd18ec94554e4e0d45a9ec2d9acd83fbef2b5d31dd7b2f3c12e791afd3e39a9437fda7724c9426194bcfdc6bd52036f62aeea7853db2c8c498103eb60180281170aa0fae8139417974d917090dba8f9061665e92d953827dff4d450f5566d2c5b753b65c9b522a0c4da868629569a666b7c292b22060e92acf4ed65e51245403a4f162c8b504b85a810906ecaca2956d395c163a7f6f23573156968ecf62ef46b72b9ce39303681e354e91c5d7944cd3288b2a84a1ea28e7e6f260bc5f8d92be419ad649a8f55a2195ca46130922d82759f9bc030c8b122211d952c3ee7851f09f30c2fecd1070656c69c2598584b55cbe6567dd2719305dc52dfda03ea289a5db920fc2c777e7081cfd92864316d3fca9aaf8e2218ed8a5235e746e5cd9bcc856b0c615b901dc610f0193171869202e845",
+          "padding" : "3041300d0609608648016503040202050004307b8f4654076b80eb963911f19cfad1aaf4285ed48e826f6cde1b01a79aa73fadb5446e667fc4f90417782c91270540f3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "1f32b36eb43f87b18e569fcfe7021763bea0ca576cd273c0b20352906ed8484428d250241709c825704518ff9e97103bb70cd26f437f87754bd40407034a9653d00e868a759a190f3067ce5efce9ab17c8b46000d88e2d9e68b8dae0a0eaa4a31d3bb51c8c8d0fc839b0b273c83dad57016b1b5c1d8eccff1c753e5c6d189ed07b801f0a54a1144c142011fd3226451faea43d52597b003f9256cedb0d7d7f56d86dfeef50179a794f0b0de97da1926e9491f025bb3c3e8e031661e0ead860c8914f0b294bf8cfea2d5ccc726ad0743e192510732dc84301eee15eca3c6a5213ba66d0871789315f8537a44b727bd8a10d6e54636b345715fc0b6f5b5116f22557b0af9f948558b0ff4a3b0faf1de7da1965b977aaaf039c5b7b09b4f03efeeab3189d2a09fddc3983e4815df35ddd1c2198b695cffc35aa6662839f82468cb676b677d53ee4857ab9be7bd99e1749c811e2d6584427cbce14d2ca15df061165e85502420602666993463733b43c1c1ebae8d37780470b8cf5cae31cd7427799",
+          "padding" : "3041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "7e3165358b5d09ab1ad1599935bbdab27abc32486910382a0ae630f725b5dca5ffaa9e606e2e555122c1e0f3409d7d915ea00d8784b814a6721d0dd117297c951c8d225a484a549e488fb80f996ad65490a09defb0b46f9cfca2e952b04dfd5418da920dfb2968e48dba8f0729b16fa32a832fd8b789bfebc63f01a1190813cfd55ace949d802afffbe9a1ec1e6a5df196e5ffb241c918d712e466f30c66c0bddd48b57ba4d0baa0c2ba9bcf519c3a26140df6aa5efbdd5ac9beff48613f92d247b35efbd6014f3d714705933e47d582f4a5da05b15a79bcacba1aa15a5fd6ddb228bbe4c5236f9ac607f41a492e6b1c92bd68ce30659eb5b27a5b2f76a5867dafbf85a9dfddfdd476c383fd03e38e81f2e1434553643e652cc006e5df7313272335f122a7fd9cae6f2f5a7da65865698d6d08d688000a730c90919e1826bfa1db85d5607ff9d76cb100ea1649442cefc4251a8cc1d823215e0ad1abfb2976bc4a6b2bbd793ebf9c7770957dba1e2a8583d9a82a072386d0957789b450993c77",
+          "padding" : "3041300d060960864801650304020205000430b526d8394134b853bd071719bc99d42b669bc9252baa82dcafabc1f322a3841c57cc0c82f080fd331b1666112b27a329",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "8bc948c5c16603ab63e75e18bc7f062ea4c675ebf98dcacc1a9826b0eeab0004e2592b07525fca53bd288bb56b5961aea93b548771068f5b0cef467c387e2d62c91e045872922b516dd6c5b8ac3615c986a9c8b5211a05f63e82387175e8749709951273cd9d8b2eccf678284761c72285be5c189c4400629c26f87bf18ebfe5e56f2057fd91fc9209ec48a872d6d23bc330f1c81ede7fc5a0e2b09c3a4735eff9c8adf73152b3406a62656897c1eef075c4fb02244ecd93912dd36fbe0d358a71e02d2b302dbebd28ba50860e4a963071f0a890a2e400c18f530cf9440a897eb2781ceb17bbc58f61828a6456b93c86df972c42d082b913c4d8807b7563aafb7b330ec39dc988674a5c3b36f6bbdd096201f1c7c25ca9ea8f28e923ba46dbe93910268d6e35cfb605b92ecf98699ae9b09dd4634d1280586c5e6bb0b1a4b5e5e22b225453f5c66f9a7ed7fff83ecb201eb157c76c9beff95227b495c8516bbc7118f011cf9237b6e794bd7a9ba19e35d0a650dbf7c06a0c9ddc95f108a78246",
+          "padding" : "3041300d06096086480165030402020500043054a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "09ee821221ce7bbeb4d66ea3ec88387bb5c5bfb055b8beb36ccba4c2ce9666b1a09935689db1cc2312d797ac8b6f62643de736f38269a81f969308eb616cf41960341fa8edd3501f4edf73736806b6fc1387df4ef3e1e26c03249f3db6471ed580699e8ac77d0fd9a78972347e8657b6cdfe172fda324eea00d60d38b47e066c4a6fc0e33f75d1d4ecdf46efd966ca9aef80d22e43dfc2cd0af37fa70d6df7c637c3c18a219bf58dc1e7bfc941a235bfe81ee7101530a2c264527608d7148dd91325b7895817ae50d774e8dcd2def8a476a9592d55be743c62c1192f0ad69981fdc8651c1db828097ff8088b720c637c60c771b5091f9d9e174bc823115a1f7dbf086f9ad36a403c2d710c47af4753fe6e43c675c30219abc2b8560bd18c25aac719546ce7a74080fcf22bd4e6cffc270e57baedcf2739c5cf4fc5fac18f5dd023301caac1b1faf4dcc65327255ccf54f5fbd3cf82801a8685c2eef3c5e7f608cf6f747b8307f617fce148347b76facf0e1f7895aeeb11e3225e3a6066a244ca",
+          "padding" : "3041300d060960864801650304020205000430ae9ada2a808aca7097c9e9c30fba4ca60a5e79874a6be0f5afeb7f5df3538346f04b84ee06bef7ac879a0085bb2036c8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "Legacy:missing NULL",
+          "msg" : "313233343030",
+          "sig" : "3b1a01f69afa77d96c1b7bfdff94d58e346746f3712b2bf2705d771b6ee082c7dd9d2c8a87de6a684177edd8038ea1b9bfdd6722a1453d68204e4d6effa584a1b9520561982f0181f102de2d62108418778b4976b4933a79c6a981bd48f84711a3f7cc26ddbf06c59aa669d56d60a741407f86e6a645dbdb1f7927dbc0acf996736899dd9aa367ec7bb157ed121da15f25bb21807293ccf6d3a66e18713d80763cd153cdef58b1e6e31b348cc514b8f2d357d14af7cbaae39993d7871bbd0cb9c136936b292dd368ef1d826000d3ca13ab48b659d231c95c02163d2e11e33152e69f6f3f08694918d89f9a04ad6a01c0887309654a4ea8a848422dc924f990cb65ba2550ce166b6a001cce4767a3f1cce74649876624d2a1111436a9a6b06dfdbafeaf329886d5e7482ce3e81a33b69a9fa7d82981aabd81c2650c3c2b34778f99efa2d3843b386c24377fe17483c490a63c6896212f8beeeee04a3959eeef47a00fec8061845d84fe7d7afa206074b41ff001be315a7e32c2cfabdc861eec45",
+          "padding" : "303f300b06096086480165030402020430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingNull"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "7835e135188e97973f3cd0a05a102e888fa51ce232062c9856d134b30ff32b513093e07b7571b251f5b3618364b830b1af01169b0a19c203e079083c4ef85827f1a4095f0a6cfb9ea0c6ea4ad1bcbe27188f90b8c66a9ba0258d3baa49b97d0f8150370bbe9926e1471772f1f37dd85b37a5b9a4e15d32c02b427313407fa9ed693e0f444fc6f10dc1564072c360f9e5433fe985fa699860d6c9fc528aa82cd7b503854a975524b132eeed5f94015ed1b2d85d9dfc6b10b529e140bd611d316cb54f31f9d7d06b6deef9b63519c14ffe3d9694077bd0bbb3482b09a490b10ca2c6b510532f38dc2bfce51cfbf2ff8a43181fe2852e6876b760558129c3066a4f2f6e0f2f4e95c85f40ccdd81e795d5d2987c92013d542d99764bd0cac97024adacefc81ce89b36311ec4ee304b2307cf1e10d1f171f0ce7413cc03d5bd2c2233e0f80d98034e91d8b575e1ecab76d708c0899f27bfa1fee102e9a5f393ad18293d3ba93c7af3bb62e17311e79e02214dc9b62a85e6fe270be98a72391ba14e18",
+          "padding" : "308141300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "0e0e316e9d6d1e5f7333789d42f3761598bbb76da7847d5b75c376ad884ac2b61a0394bb2f65e1dbb986c26fa3837f905bda324dc65545fcc6d949ca4b8bd49f9ef7cc5b1c0c593bc34e02a56a0b2fcde4ced168a504ebd4ef1565cfb400cec0d86275af35afb01a5ed32263bc264a2c8a45a84f348c2ab7c7f74711e4e295323e2b9b76a7ba7475d8f8d72943b10ba64eb084c832ac9b2a984e1a2ce1bfb50b97f64bb754bf5d5832499479a198baef88d9dd21240cc95568c64664a704a359eb56534e241b106cd8d301b047448c9e83d0e3d9632da4641581ce53c8829e49701ed297d815c46f85528d2fc531a7813eeae45c0d249eea00dc69da92550ddd9e04787a1cbb76d7c6f4bf35b7d8582ce2f2e4c1184f79d3d7473d7637f42215ad4b9bebf143f958f3d0295b529d3b3db192dcdf4419d42ae219bd81a716f7d6472a6a86328e2728c5ed4c08cfc6f9c3277e42df22d15d7d46c442af610a45668de66d735e09abcbb638ac39cda905dab0cd802f5a542951df3233aa8732111d",
+          "padding" : "304230810d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "409bac0f385c5d75fcc9ec8a63cef1b00b2aa0b49583ac56c9ea697d704ef5347236a351007dfd7420134dfb8c860bc47d0bd6e303265cc5db8bf2d462744cae06bfd9b92a082ef0911bc8287dc202b2e4893ac15217acb2c29859cfca05769e90e8bd1010b67da6a2b0bda4c310174a9780492b802927f458da53da9d69efe8ac436c5a0ebe06c4d0c62d4421f018f468759b36ce050c8b242e4070d5ae9534406871aea1a7d65736763a27bd97d90828f0f217a745fcf454640dde39030432e8b3cf92686c367fa6affae3bd5fddc57803898a880ea28978c5e7e76bde18f451ea3b2a89d688cd5dcd5f19d1600ff222875f84100ebe2e97c2d98abdfe9cbbb733a0f257bc187a171326268cfbdef12acaa28125062fdf3e9edd756ad8ed9e695b61cbc9adb94046480693e6acd5b415dca69551dbea6883f8611b994ab57d736557b6c2d7a861393a0c8e9daa4be0fb3ba13201f41a56701f1953c3fcf54e2615a20b15a2fb73622d1f5272a9c1150dc975887f032a0bcf1681041a21c527",
+          "padding" : "3042300e06810960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "91f445878bb1b9ff36555ea7342648119f303694c7ecac4e9aba585dc16b36fe7b3dbff9706e1e2c30e1daa8ffdf57214b05c795163d43f6368757ea73a30637a7a7e892499fe8e9510be9e6bcd790ba887e66c6e1132ec553d306d6aa2c4b5a743a1535bbaab8f3e6eff467ae7f403c566d99a598d877860b66f5afb5d468cb94b8ee89a0d67a1e163d2debf7d381c571d8c5c334ee34583856e0ab56dfde8682508eed44afcbeadd60022db7c1446adbcaf6d7fde9b31f028ddf4cf0455849d9d219bc04629989918577b7f460ca46464494479cb4b6bccfd9e1d1a2ee53f16210f5dcc7390cede73b04354bd5bdf6c2e7cd4d4c056c013c0383ca053b15d2412271c7a384901e791e3d5702a9929a540cfc11b80dcd980fa64916dad7aaa9d73048cbb864641398f33775fe50ca590ea490abc0419c78fe0309fc0334312835a0076f1cf34a47623d10704f22e3ef86f1a0989565da39d0d3a0859488e48f057230159787c9443ccc7e8ab93a53bae722613e6c55c1371403b9ca48761e90",
+          "padding" : "3042300e06096086480165030402020581000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "033c248bbc3ff5231e75cb44bff8b3225d20f0252ee528ff24be672328fe66f413a4ff0259b3a22b6ca788b6f4bcb4315ac99f59434e097ef066c0e5821cac2ce1f50e4510d3709bd030a613ef05a818414c9a5580d51fd4e6d5b4b7b146f808af2fed1ea5f23c12a370e526fb1133f06f3acc4d7f1ae5891eed82dcfce4dc46ad947858a228d6e47cbb658176032290ad7b4cc76d219c41a358d64e1989faa294cd6f11b5f9d94fafe133b725cbe482e82ec6594313e0ae9b6baab9733e4ee01a88093ed171bbb8384780d1c26930d409bc98c36989a9db93fdaed7852ffc003e981c6969e3a21f1c1ec80552f3ddfd76f16ef8b04533799a298690c6a76a2e034119faa92d458089df4df5cfc3e5a2ac5fb7496835a4dce6b8522ccf5049e4d294216cc24392ad0b6bc7250f7d319c1352f58123377fc7ff9bd34d2e2f4f504fc272c9ebc41d11f83abe60495daa36c0ce6c2a26b985cb1f30873f7b9d6566bfe6963dc2154c128eee636a815e69ef32d75105f91f1597ffce0fb34b2b89e7",
+          "padding" : "3042300d06096086480165030402020500048130f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "02e31b3b6f1200f93fbe8426cf433575cf01030fa1284ab8bf74428acef25759df587be26a5260789cde2aae7b133d249783b1cae14796658d4b6a4aa24321f5afe684788efaae848b693846a457737694d1a7af6985890ffa7384769864064eca91ece6c03298f5ebfa7a18bf731ec9a7cb23025b7072ad4c06bbbfe33655654422cd4b97a9be3aff016000a6c7303ccfc73cbd908e82c930dd410c3ab2ace258bcd05e91e94e4a616a6ded7a4c64b00dc5cf202689a0ef3583a31e066337b1971cdd909c20a1ffc7c006944b81a89a5c96cf43a6def4d745134056becdb9c9275b2f2a97cfe0163bea5ac8dc32d0fa7b24dda4ec0c88f61cae77fac4c19a67c46fd26a03b990c5737ebeebde402879a02cde56728688394d577e5fc7c347a8cf66702b3b255084eb224436ca5c861b6886db60590a783c2d32beacbcecdfacfe6b6e520586856596b25cd918d586642db9acda72986078511bceddbea5239f229f1aee80cfb9d851ef9e84056141d026ff50abe0c83d2eba6288722457f916",
+          "padding" : "30820041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "0ea7aa33781b897d17e849f3967ff8f99b2f027a2f3d46bb979e5d4e58398f2b6798b6c6ff4e83df0a320cc964dfbd6542c0441668156e108d2eb5c7cd4947b4c310456fbe342a00ad7ec2be365d0e6c71abeba20f701b0b55c833e52e30ea9cde21bb1d23372b9ebf920e1c163703a484960872c2b5ec4e4840843447d108cc76a37474a9b7f2ba09e406ae26722b424f3de7a0c9b68ecd71fb1cbf3e87163dc780fbb8f0a16f06e05cd31a0b6de0c79912df07296bd059ff327fb5f860ddde50c3a28ccef959e89808120cb1298ca5f6f7bcb7366564981bf90161453df0bd8268e8cb34209c969bb5c7028476eb212baa30990526fd57b36c66b71c59180ccd26b02990906e0de5fb386bce5ac1b3d2d23e1893220f698b5d075ec0bd871843f473555df877bed9bb22cbe69cd7004d9eae7feec60808ec74db9f257ccdde2d20ff5eea9a4a8c3b89bd281286864d62e4997db92df8ae0d2a1fc3dfd9aebce9f7093c129c426b5b74e5dabb7fa2bbf8a59fa2e4b1aef9d69ff7ad653c2546",
+          "padding" : "30433082000d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "506d8fa1f4dd3222ef4d1db80d747562ccda3abfc129426610901780241300ad2c52e8cd5ee44b499928d7d42dbd37d0a0ddc0ac2e583a68c763cc3fd8e71cb80288c4a5d0c4fb8ff91abf99cadeba3691982a2f31838096d0d9e1b9e65d8030718aa11924d22f49d6cfc0406ec6af05dbc9ec4d1e8ab13918343f6a973fd23d5ed7bd05603685c5930bdd93c313c290ce678ff25d815c2e469dd6cccf914bcad6e8bd5121baf589dacda9f04a22cbe8b1d041e3c8eb6f902aef22859066ea22feecc33c898a7fc254ca1f84d66cf141d7b1bd1199070749f8f584eb7ec0ab819373a4770916e65acc0be006c301af2c0ca72ccfbf40dae37e316193555bac56fa982c0034a2c7c9785f58cc40945fec7c0ad145c03babc16a9bab02562afa4dfeaeced32cc409d344ec143730c290791fe78a3d6f8ef2fbb163cec5ed548e631f43d3e117258ab8c15f6f62ead7aaf3d590f9fd5c73e947661781fa1f56c3efc9596756c6bdbe4b3e3c8a05bf66220ca234e6043c900e9939d689b7ef4aceff",
+          "padding" : "3043300f0682000960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "804c6e1a8afee9f6201560676b65502a9fd4e17d390821a79c18dd7036f4d7a6f4efdc8a20b9c573b4f1bda1c3c281634bc1c1583ffea03e5dd84a5d3a0728935970c37380b97f81c89a3a2316a909da68946a35f77427e70767d6ccdfcd3ada7e503336b4d9dd1d269c7530994663a4d93f9e5e3d3208dd8f4f2622a2d3bfdc2bc79badb2541e6c04b40f98b5d3a7caca89fb793ef78b5aa0d71c1cff54a6a7548cecb7ae6ebff52aa3f79eccc0fa60dceda2fea8598ef135bd3b1703e072e6b07b9495ee8a48af86d7ee9d6f00fc11fd0cd5af343cfd69eff9c08299baa364de7b999714ab9b31b40efb7980563a6873480d1512dadc7495c105915f18eda472cf4a524a3bc3f7a163c11aec456226615221b321b7dffbf23d4e1e281aaa51203c966d440d4edf3d0c26eb03c0f36486f252680d2b48df239b5cdb7d4c77331fe8d771b999be67bf00a50a0fb806bf9bdcb91d74b6ac9e124f73d696ccd9766df1a8f2911dd27608c50b2a4a0706071a81d26d7e9fc6fbca395fb7f190330b",
+          "padding" : "3043300f0609608648016503040202058200000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "6e64189255c0d7b2a93f30bf771d9c0850f57a173f93f5dafcd599b801b997eba3f76e4f1d78d478c79adfe14ca8191aeadd81848aa769d65b50bc96f3e18654c2096e16eeac3b0246c8d40ce09acbeffcd5edd87815dbac35ec555925f33766a40f330675fee4a68b8b8f54d3550dd0e6a60d3fc9f971685ad1dcff49b17bf7a933a13153dc4b154ff5f56e1e72c8775366b6435b175ba420e6fd09dddb6466f6e87ce2075b2fcd75c99e4df5f2a854d9afb60a38df49452a20f46bc604f92af5c9f155884e3ac1b2319ddd4525c118b32130b7dab2fc18967181a4d5879dbee8b9094ce02683f30d44e5756420137037df7dc4e21efe99721b013098fd895a3593ee8661855644bb8729c36aeb16f230c4e8fb0ac4587e2392a26be95ddc57b19705018771a6160206dce2e6feb02b298dea43e732167cbf7bc96a5bffaf27e3a3b04eb07a77ef482d77b87e028f6cd0be364d9cd606f73ccb0a6ee19d927ee221f3c724e7a3d80c8a715617aa06db021a4e1b956f17e29b462a6daa6bde9f",
+          "padding" : "3043300d0609608648016503040202050004820030f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "556a31f90b1879a1374cc4f2922dd41cb2313a61fc526e889fc9a20868458ad5cd26d6b3d3a0106193d44be3a22d1384084a949e5d1388f1e671f638da0dd1ab90d9d316ce66a25840a332bc2ca312dd9fde87ba57ca718f99f1851b36be9e023e24b9984062828211a581127b0d81e4b1bf5977f23d1c70da7887c09830c0e3c5a4cb66bc8035da055596ee7cbc1ed4ea76d7712708330385e5a9359fa8e3a0f6e63a569e5d2db4e867812b40da15d3015dcf31ffa887fa7faf478a0cfad3125fad16d38a57fac2262e01217d6d7adc50a3af804d8881e61dedb535001d999b82e2d9250ebaac07c4e695e946b5f42c86b546ff18f1a16a946963c9234d56d44a78c4b0ba0adea30b17528ae91fc326f1f976891de26e9320bdbca32f3709f731009da45b0b09ed5ee788278f18baa5a97d039448785a4751b77a7b061489adb289eb85459e663d85f3bb300be43a185283bbb94336c41e08f50ef7ba378e525e48a844e3a165bd484b882db08284e5a51b392727d54f913d4bb9b7c153b884",
+          "padding" : "3042300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "3e5d3c3c140ee9a1443428aa0612506da862e56b1add3a86b13f4a014b65ab0be390c5b6be0aa14caa77c0e0a9116c543f3ae0ecb927924833838993d02cde56819fb5293b84b9a00ee84233c42cf993ca79a9af5dc7fb1d0074b9a9f895bf48f8d9f79f5d8535748196734790ded7f5e1cff092ba949bb70756835d1ff2472c82069aecb50ef4eb2078e59877ee8ebe42d90d8629580813f3ee4b9fe08960615c7b4c59acd071df543fdeb7440499ad473621dfcae3c14a2971f85e233925215ab08f7f2ee3cf70427e94be6c895cc11e2a3ba569d7a530d36e33f00cf76bb7f60b4fe7349cad86f09225a5ce0092b8fa2162b3ed556a7eba89e48461d32a241c4fc7016ed77a097ffb289ed34b88bc471d35a931a75b0309021dcfde235169d8b3f18de671444cc5a86acaccdaf62945fd39f71c833a58521f591c5ba04af3287444d6975d128f090c1030ae4de3100094c24e262481de1ff346da67ea73c410b80758273dcbd83e127524eb93a703bb982930644297545ea36000df500e7d",
+          "padding" : "3040300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "79184f204ed24bea8e2e768a55ced92dbc0b5d59ff9013db7d8b6828d9c631f47e1fea91d383b7c00a64a3a3e553e7953288cfdaa78affed5e7acd78f48878b507b02e85479c9fc529879e9c8c252a0e559543d78f0cde0e3b797d87fdfdbf960a8ec3bd49adf6ea370a10ee8caba7f8edaa44d36430163f1be74bb06a6e6b689aac34ec48c3dad3f95d21d5a453ea55d472331d56e2272765747a06909d8cba8d1543488cba40015af45608cd11dee21c22e76670693498ed7943732fc3bd4c3f5b78821f1d3481a1ecb73c878b190094b5b5094c54f68a017918768d9162c15e1e15e2623019e7773e6815bd6cfdc37560336619980829a61e950d34e87fcca3b5143ca26d55d6b9c896a28eaafd1d77320e18c46ea1933f681d32828486d2703903079633a61d2a828fadff6c617bcec466570da7d9d0a447e50d49beacb46a4488b65743fe8200cf6a0b44bc675ef6c6acb7c96fbaffb7b8ab0ffb6bee5d3d5bf94b6aaee4346307bc65be6e96de1fc84c52e8ccf2b81f65785f097f9bb9",
+          "padding" : "3041300e060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "11ad49205eb560672ca173d10d16e9f196ae3ae43350069549b74ff6c8c4aa71b31e017ba2abb0d8b6e8154652fe186a83fc34844beff934852a9c278286bf60166b6f99a30081a344e11c655a0fb51e1fc7a3ad700676ebaeb0557a2c8140686d5a803bc8e5ccc80f688bd0550bee603ea5f59705cf3add97712642f0b65e517a183b4637da5c7ac78665cc5ec07515fc4cd84c885ca673c35f33b01b9727342ddf269f4be73686b05d8fdbf83a149232f5c7e674d4079b8021dc314afcf3c5561915e03fef780f51eb5acb78ae14e84c82a1efe444330ac4638e3f9918ddc97b89ccfff94538d0031807ea147e068e5df45e7fa3592fec60fbb15a88094d491bf94394e0201a865b40516e1669695bc32813a443aa868de58f60b60617230f871f9923c2aabb9106c39b88650f150ac935485a246f559437a9f687104785630a6b18d5544a1eadeb259228e0a047ef829d9fc5c9ce907a344a89c5afc51408f8f23438be6885ac746a334e797213fb6f854e58dfb58baabaf05a4f2070244a",
+          "padding" : "3041300c060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "8812df05afb4bdb86568cfdd2345a77baabfefa7fafd393c79044c3576fa7b4537e834676ea22501604835cc685030fa596bb5d6ec4e8f75d65d0c69949fcf28f1b6711155bcf19512188dfc8afcc3521b7d875cdbbaa7cc4d993c67e3ada4f554f22a4d6c2ac033e7e2eef68cf1ca89a3267b18911e82c0aa72f452bfca7b296173f4e25842624942345416906576587b97f59a11717bac58cce7337812b9f7c224ad04a6b3c2236ef12983975979fc40719cfec7aa3f4a169156b03ce7952e3bf7af7c3cdf9ab5643c2e43aa1501306cdbf20f7f2ca3af47a4be5d9d668c503ce4406d2a95a209a79e081507edd4609aa5673737f48b04342be20aa1b46969986aa66156fda91b00220bab2e4c9585c3a35a1606aae9e577612f34fe18ef0cec1877c49665c34b17c2e6bc2062798c1f1d38602c7420c414ea3deb098eccb858f22ad5877be24c1c44c7025f934f68b5015a3d9ee0d3991a96d4870f0e7b46926248872cc46a74d7c272faed56f90981a30ad55c8996f38429628afdfeb414",
+          "padding" : "3041300d060a60864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "7131f9f2ef70ceef69d90adacc74dddf5b82c7f0ba6add6e4d53be487861fd8f5b13fd2d9bb4b862336cefbfd369ffec5b7b37d77f5e6d54d4efdcc55c75cfef5500ac39aae0597bfbf6b2c4523a9cb97e539e4f0383dcb3aea4c705015d1748a4e11dbed9979c05eb5f7579a60b625240ade316cefb9c056647927e174241491c87a0ed01128d089e50d878403a4a2946d315ca034003b0899f4bb95613509832c76cccbed4ce3f794aeba83e8f59244e8230bd9f7c5352d12d9bafbb45b11e6d59398d6849920b1876082ab058e682e7fec79c1e0ec7ba6a95b72b9650516d2a25d28470d31e9232002799353c1cc2c921372cb4e38840466501b58629ceb51b1dbd17643be4acb59fc3cdb44de24caa49faced215faccd8d52f437c8aa5e529436facbe9c1efd85c871b65fff075d6d6faec3a7e7bd25f5eafea62bea007c45cfdbb8bc189835088c0691488f4ca2b0d6a6250b5e1fc76eb40aa415d9eeefcf665a41ee0bb53d421a27c2580aa89c6e25ddbda69e963d92145591bef8b910",
+          "padding" : "3041300d060860864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "4544c2ea627bface1242eb30cd981b03220a44587112127ec34b3cec6625f785b89d5466154db2dd8ae2cfcd529508652d4b8d4c3738270411c3fec03dcaac18c363d8ac77778925bfdde9b079b53c1cfa5a952c95895843668fe8a9f34c60f62b1cca341b2cc2ecd7b1b74fa1b8165963cf94c3080f920ac969ff945236eb47062c1f616f1a70ed08439a0ce48f65b7238afce44f51ff22bd2f4954e6c9ca56406d8cbf3a463c41399d958633dd93ce4604d3cf99d7c46cb0b70a5c3abcc7fad329c6ede9a2e2f38accbd55bbbf0562a2539a6258e16a583961564229e21a1b125389b058778ba2ec5e2571c0bdc6ec2740ca4e2c961bac55963b3884132b9dad7c0b172ef8c5abf07ca6f4ee8101d49f9ff9b7c634a713c4f58e8c543e26134564ee6ca5f89e690a92b9c4c195182ebde4898e62ba3ed1471ea6497777658e0cf6e1c079e021695960bd946d04c5fdfba915b2798e79809459b6544f828ff3f7b841581082b8820832f15b39045611059e408424878ec882941195e1e05fc2",
+          "padding" : "3041300d060960864801650304020205010430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "55b771a10f9d7f1dae6650f5a5898c7132e288e98e052732780be3a22bc5a06f00af59831aadebbe5dad715b1e2c80ca27160a126b372c6a02fbc597c9b132d147e5ac72b0ba81cfda442921bb65bc31b55f2cc9eb5ef9fa04553cf814155be4944138a79d053f0adcc8cc2fa0fe5a97ea6129593ffd1d3364cdc1da0d3a8ca2aeeeb96f4cd529919d155b09b35b6ef30790fd928dd623a3143091ae74b298d9e67135939194d6cdeca366f6f17b202ae5a9b291b810a165cfa6581aa42aa49138a8548267cd20bea61d90b208cd4549d9b1f4486ef933fa276fc71eadf7a0c332bd0ffb2c7a7a41239cdd2451b45a5f74db7177cc127edb752a8d38f543b0632bf8e92dc0aff15ce036ac68722e3013f219b6a3fb8b9f9d75e0ea71fd4178aafe16ba575e5fb7bef9d06f294658246b53314a0d05c5dfb36977a8d3f37a7095ad9cbf50bf4d45d7e8291faa72eeb83db4acbc12cf1c9abbe9108b4ab97f2313a9d0767786a13a0f8611c43627e23d0d180c10207db9d366165d5d6a6c183353",
+          "padding" : "3041300d060960864801650304020205000431f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "6551feb2b444f0fac650da3445c113ff927c26a1d4c8ef0f4b150b335635ec50ff1844f469ad6b3da8828705e0abb44270f86e92472b21170ee6e68dc49a46d1bd242c0e15974a863b3fa0f0489391e8791164347c56b87bf0258bd1fe04f6f11d14f7cafc1e50568b871a2bda206dde850f6edd46cfc484bb26e4bc8c9b7e5b5aa694ddf0dc217a8b85f8371e6e00cabda39b22fdef4fc6a7531c18bf03943b3af40f5d49ce4c45488f24a564eaabc4a54fabf3bc4848b309de0f5452415607c431805785d8d440a4d5b36f71d64c49c966001978159e60ad48199c45ab88333e329b65d5780be2650875ec0cca3f31463568e840e5420e387cb1788c614fb95e0392a97c0392d79594155ed58d45546d6ab7ed08be75f959d5232bcf08e77403185dbf5eb9398ce8b9a4fe3535ecb2e54b15965b9cabc427164ab23e284bb72d4f7d12b7b66335686ba988a26aa12617a267ede320e75c8b399a8dca3338613aac83f99bfed281523712fbe32a7046b85af27163e14193ece3bbef93361ed3",
+          "padding" : "3041300d06096086480165030402020500042ff9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "135943bd12689bfe04cc1c0a8860d7c18f13b4bf0a82c334b44ada2c5e82fc32b0ae99c048c94e3508f59855c53e6b42bcc041c219fd6465d21582f4f99cba4b88ec1844ae5a89f3215caf458547f0d147c0fa1db67453465e593ad2bfbac8ea9238d672368d32ccb681663fd8b023115c4f41345551d5f2bfd387117830323a4d061fcbb6aa13f2dc0c5a317e6b7339f6cce5c543291154ed7b118fb8c55e8942d0ee9acba4ec3c9106278c982a8cda67a2f3cf74eef8a37fef7a256e27ab43f5b6f6a5645544bc7d766e4aeb439d255d144330fea4c10438d2b801b477da861f6f13eeaf61bf5ad0b79669dd1c795e03bb826627fc3797846005aa975553343c91deac0c777ba9e253da8f3b925abf5cbb0c317fc2ea6f8d750bdce9cf149ebf623314de480daab1139f882af161750d3b74ca437df8bd7c9570c23d0d896d4a70aa4e464d0a836c7bbc22306aae10058d1dfd81303dfe07b9231c651fe30e0ceb328570802e30dfb5910cbb0739c6f74c6088b2ff20088b7b91fdbbe96068",
+          "padding" : "30850100000041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "5513c16ec53402c0546785ed2febd651c1370352c121289d2a1fc9d4db74f99041af22d59c407d60769174e5976159ad64e84a3dd841c04a16b6f740067b50385cd31956d917372187d04bc169ac0d55555dda949bd422d39ca03e40817a3388a4ae03668af3148dd08e6faf1eaa170d4d8d9d1fd607ebc4f72c3eac163024dd2f86afdcd6b448c7c5d09f2594e95ef97b5fe6a38a265c06c12dda0665393ecbf64770be7cba42563293626c305eb840b54387d40fb371047014a058ed0082be31f59259971a27dc4de18a403bc26c7b4279e390844bfc13215365375fdec2f3c3873b1ff8f87f60506c55b7ccf03f3b3ca2534a4f686145536f65bd1f11bf7eca54f327c6bc120192fe4975657f54b962f0da0444c6650984213ea2b531b0b8432525a416e2de1790efb83a224d29d5d8153279d45f990e36c839ab7ef3cebab0dbae382b096a87075b5fe000a4369bae1335b22edccced1085f7c1fdc7f71c6ec16afc96df26df65bcab54321d91d59f7024ca5d65e4791f8a1589f094b797",
+          "padding" : "30463085010000000d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "2c478e7fe2835ce5363122c379ecee4e7cad31173dc248134a942a724c336200d91013935fbf80a8f5a81f40971ccc491ba5650cc3725e2869b76e06a30feca80d09b48c89696954bb91a41744082ab3a69f3a5b8a122a927fd9e7f41e6e53a26582d6625be1e1b8cabf3ffa5af3500cf9d21319ad5fc6edd85ee7935562fa29cfb2cb3fbcac9aaba5f7e5d2e252f6d30efc20d2176236fa670d4b0134efa570a9bf5fae8bb88da4536f4776f5bfb5304830ab8cb9cf8df3f90665b082ee7ecc03e9f36706cad9d7fb293c2e467800442ab39c0150304b668cef6f84b2afde87728f429802858e6988f8b6ced894dbe24353e5e2e53310acbcc291b688e76c0627152ac92d9d5579bcc73b38b275807569e7ff375cb93c977e52b1f21eac9334b9e1a5e68ab5fb1930b810f5636cfb386448413ea80a8174a616b10b9cfa321dbc648f9d1f8b8ac8087cec959d8245f2bd0ec1bbacdb96afe60abb5c7db43d98790cc3c3f196a1bf23aa1616231ada13a55ff6b345b90198588e3d44eb742ece",
+          "padding" : "304630120685010000000960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "6fa51fe3afa18272aa61fc9eb46e730dc62e41e1305962bfd52ffb1008373fb74127743707dc8a44cac5767bdadf5f9db8130369b2051017d27c4af5e00192d708a74f915128ab7b58bbaca311456cebc65a0b3281c67c13594ed75c478a3b943ba9f6a13e6e5eba3b313e9b48c052e1158e0579a61251694b378aa50d3c3881291758ee38328c6af167be0e13267cfc285d0e155655ef25f73f0e9008cfce46dcd35df1f11731816cc54f62ef292063c74eb13306253e341cb1095c1c87c0759b8362eda2f3b81bbb4254c91d6487fccb247516f5b2eaf075b9c1c8ec64a32541edab4f1d6d828f69762798bf141ab0e6c0a193ff85331ad051f8266392de58b949d3481b9681b2e0313bdbf723e69e9bcb033bca68f6727281b0f827266544023dc4b35a14d418dae7b0ab718326aa9008bed6df1b28fc76efb24ce0fe85a0ce44607f3679621819afef73051d49248f55778844731eb532e6cf476a0818ddad1f12f4a1c2a5950ac7c128c9f492013ed82e11da4b5fa3a281e2f35058bdb3",
+          "padding" : "304630120609608648016503040202058501000000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "16c1b7c4625d3ab8b9a7595bda96e1bb7c70dd7b43bc143aab817524d3fcf281ae9cd5df2c1e1949d6a7d4fede269b6308614c1ecad6db2ee71250deb38a955c07e76f70272a261bfb2b31ba3155b38cd3705bfddd2148f2e3e0976760c4f0051a1f251aec74942dff3fe78bdc36e9c8d41457f42903bded23e05683045c131cdd4e343831a2a1d2e418355e2028d2b3ec94688d3acd7e3a5ef4c0e53f4d722acd328cb9c3ca3f0497f6f5c54711eec8693c67fe9c235e45ea9f27b93901f7ae98e77edc295a697d8a17a91b954ea910900069b43908024b35b7aba822e3ca57af412916f1a5df213e47608e65d2d903ef762755ae60c241b1c36bfeeac202b8a35086dd961b06534ccc5a2a4f23a39131a915ee1d1caf8c5b50834b224cfef8ba8b752b7e030b5e955361a463a6b908f8c8d0cc513af925696614624d12c4eba4ad72b2a7727b5a2928b8335fe870bb17adf089d30116d7c9f0a6cbdfb53e5f5ab7f056af622ca5e77b797118f7add95a7115049e4ac31ef5d7858edf5186c4",
+          "padding" : "3046300d0609608648016503040202050004850100000030f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "62b1fd9511766e69a94d61d38e4b02f1c6b39a3c28e8e390175cd61df62001b189a0e44e7726cd8de44b0518dadd7aa360ebbffcf293c5ff749230066a63cc5e393ac443e73a345d79e4b54637ab3d1625a3d1e7d3d0c5bbcedb65be1c85317035cea9f73b282554f355350513a7f8564d5c2ebf93723f943d579878c89b63d25be92293538bb9d80793505b20c958da5ffde894c71c392453c506649b3891be55d69c607b6e4179d5a91a332f84a44ed32767bb189fdb7145bc13f128a0790b333be81288d4b52493cefb118d770aa5622a4318f5d37ba40cbea11d2433bf51d10d6f0d48f856ac1a87376c6a008ad9507d64103cf2e12d4f903f9dc7bd08c1c6e56a5710c01040a30575e755b8dabbdd83abbf53c9c0e53f184680a5d95526252f9ec04b03ba99731ff15e07d8566366ec78d3eea0f723c6df1cc32e0f906cf33b1967077f61ed045058f040746e4d414584d0c231cde7c28a108e15ccbf5e89744e3ba1f7bd3ec92934101be8af0bc0705690043261e98692ef737ed78e5b",
+          "padding" : "3089010000000000000041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "1b035a14cae3a8c4311b879f4ed000debbe72f9847fa91cffe371d2cc3e5e5853542eeec362006e7bb8fe2528d325071a8d8564ec9d60eea7655ff33bcb698d65cc30753084f773ddc3347e934942afcff23da35628dcb2751337afddf1fd900e2d83f528a96d4a5ebd4636aa7ce0f20b181176973c440b014d203b24b03a92531a79c7fc802cd10b7f633fc238e9ff3e184bbae1db31a8e70a69dbbebf925467e5684218e5651fdcb9ab2379b2cbb398363c410192c1ff0397e9e23eddd8e3cb473ed39dd9ad142a7806c2e753310efb1254edb928d781e70211d0483bcef6b7c43b52d04b96ed56de631343e29c99f4c115d11c0b74880c4d6a1235c55d0601b07b23530c9f619ce12289bc1b3efd4f0a5d1d2f7f46f9d58f0b93f659420cea287532e0f3b6c92d65084c5e188c998857989d5a2056bb973a7cec9f8a25b260963bcc2d4f74f8701aeb9ca92fe7551c006b21dbca74f481b8ca1640e251b98ffa768ef2ec7924cd708931b15752858d6f7dc0890fae266181b52ccedc87446",
+          "padding" : "304a308901000000000000000d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "6319debd263a0921f9d935f8b033a65f6e9fd9bebfa7a383e6dc2c0aae9969a2d29b6f8ba9c9d467f311f9de3d0af75230bcd662b7681f4967ab1dd4afcea3abcf12a7c4b89b3e31e22d112aaee76e114b98b81093684e5172b26f18deb45d47772957d4f68cd5f39e0d7015d983edd534b0ba59afa0f1ecc0cfce748ba42ff9c3c6f54fc447a343c24a3b5e244d18d15cd43a37e3ccf4e0a34a0b6361b650f27cd90ce9241f307975ddee05945430262c68f0bf08afe60c87fa6f2aa8cf0b26e67226cd962e1ca0e3affce55182e26dc5f29e0ebc48a1d9ae837041cbba28461accb677ac793b3bdae610c7f5cfd3ad221317c81d6a2b18415d2d00c25d2759b509cbe5e1a99ee9cca1a1d15f8ec1fb642b2a8772e61861bafd8c67c93a835134e9acf03f7630e1e2c99a1fe9ac08bdfcc31a6c88845d9a0e552a3fac84fa1202bea4ad2868fbd8a08b0368b9a1da078d3576625eb72b7f676b9e67bdaf687e867a66d70147f09b009200bebd4a866202b9de7dc97298b916dd8fadf817ce2a",
+          "padding" : "304a3016068901000000000000000960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "35ac34aed37bedc84ba18695c867d9766905a967cf406b765801be0890c3d52aeb3070f053a407085209bcfb99f5f45860206fdffd3badec9a4e8f19ec2d3f8206e6a4e767c4b52cbd8e262e30c52529a4568692ab8738f03e5b1ee15b64b74c39a57de8882aa512c1eca1e6be516ffa67465aac6472ce80a69985a8f107546b0d9a6086976de8d8b30ca46a76a8620ab64e2504824568b4bd9a5ea8819b454aea310531bff8c0884c52c80543660f2b7dc78fa15d8fcbaa9204f6496df560d66996fe3f022f4cfa36b6d4e427282f840b23c4983819bfb19139512949928d1b1806759c94b6482e9d7e521c42b1775644b885e6e179c20fe78e02b97a01a91f38d61c17d5ca676cb38b3f4313f9fe8520844c1a965897df0f04542552b5a30f37a20fb149b1064007d91ae0ab1e74f1b29d9b612947c6a5b5a3ea7181d216c77bca94ee8aac070022a4cd3aca6b740eb520fdab50e07135f4d157eee0416283ffdeea746e5a625a0a67d321ff0e2ae3a5dd4adbb3f5639f0b412ab047a1b5e9",
+          "padding" : "304a3016060960864801650304020205890100000000000000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "440d17b009f689abd5301d2728eb6238342ae5b63134681b24d61c18443209a18d8a9ff32ecfd231e77783a00be559152fe28807c0c32c8ef1287be6bd0fc3e70d0fb8741bbe2d30bc39a898569b845b1acbeb1688c82a34732f278257fae502db21238a504dc1157cc3298c6bf6137d6700ca6ce03e5a1dc7293271d43f5863e024595e63e2b98eecf3ed14afc2bd08bcabe0fb882d9df837f274077e79d08e1a46326cf5f3b4806945405c84a7e7bea28b6e84305058832c189039038b5e2ad54df21139e47acabd93cc53e91a8e4988a633a63fb8a7db32cc6580acf8467934969cb64fffe3da2744e7518140cbfb1af3f3183be3fcc951d79173d40bec9b5987cf9ada82a48c7734073fdd15296ed07fcf50b270e3f38cf227300138f742c00e02e8d636d6bc46c15eeb631ae0b25f649a1ba9a19a8d35ef313c769aee5e996526bb6a1d205998d366ede6abea912dcf8f39349a0cd0e235aa24d9a4f71b9de18db66d89c8f7a53485343e8ddef174653a454a3c856a3436e2f9872aa25f",
+          "padding" : "304a300d060960864801650304020205000489010000000000000030f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "0d6c8e033994b6ecedf22c5f544f2e3b688db8b2235a00dfc8f1b2bfd1391faf649be65815533d6ee94098a4382072beddc2a2f439837dc6df0c9826ec49c3c529b71e9cad2ce717fa047cebf81e0788ea71f8005a0c7ad1a8d59c27efc334c826b40c3f4ec0354633e7e6d71654509460e7d5eef7a44f4894f07e652d9d7860c78ba7facd161b65e5b8c47fd3df85816ee5af4ed35c03f9bf08c2d95d56bce82954f17da0195e95558dfc49d7d545ba004afc59e8f17236cb6f0d8d7d288f8bfc41122ac5e803ef855b3d02d11dd214a7f1e90617435b2840583acdee0feb145a37a8b8c9f5feef750d9a950a605b59841370a47f59a3aeaad2753f6b1ef1c4327133fd59895b627b7da0dcf5f9bb7660cb9002692ab94711db9c15d3bc5fb4cb0e62b36beff03bda7746a0161b4199366d3e2a3a9c7a762b6bf15ec1fa27585aa22d428e7c7ae7dfe8b8010a7df9f07a060d9115d235287ace863596e1e01fbf3551d9995e5442de650953cd2951c561317d331df010d1c6fcace9f8b05145",
+          "padding" : "30847fffffff300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "7bbba09b554cdbeb72016995325649ab9c9d0a9bdecb5fc44ff0057bf619df2ca2bbd0c3b13dec3126a0545dc4936c043f200d7df11d87c390dfa1b0dd4e20c19877f283f62d6e20e0ff2f0d561589a683034bffb5fb2be9ce2be2a3f9f86667b53cb0901cdf40c23ee67746a49ba1ac576b2075bf1ff7f48941dd8bb9604d5369c9077d766776f265baa4db5dc3fe7a2643fc644a01f14c40a7a96d95713927b7cae6fd55faa5c802added32c5ff6f7026adef607a2f2abf59f2f0a8edd35547db4ace0b8d81961480412b02b5d51f1e7f0420086fb506b7d617605414a59db8d7f1374398efe6d38dfa39a0568a53fb58e1b71ced8e3c126db99b02c0a7b3e27a4d1493f2c077f51f5b9ae73bc89399b18c270e6e5766b69577283e084ce3b2522a77a994fe0e4a192eb997cb5b4bbd7592d24ec4fb1977809440c7e0dea07c384169e9cccb23c1fdca7773afee4ed804f63aa556492b7a4063a0699ddffe2b583230b826a320e1e26677adfc11d185a1992d38e4946631053330a542fe594",
+          "padding" : "304530847fffffff060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "17a45efa88058bdfc012587998e163266a1b5e29f474b77fce1d699aeeffed91d2586c0fb65d20572bab41e678500e3e03fd7202f89f8bcc363d4feb40be4877ad51c2b31f23a4c9967e84e0310d35a831f1f4caab9cad13f7df6394a52375bcdda97c4c8df483eed1735ceacc9bb1270acd2f8e2b71dfedbd60b2c20bfa732053473ddf2e397a6a8c1edd01e1d37eec26a6d4eb858071cb95104368b9457096c0b4f1e8c51e7e51a2b9007f9f88b63aa83173ddf62e0c1e41472015220893f7c7947fdbc5759eb1b05f100440ee7ec166834a33388d0ac0d6b32d81c83853f46ef85e8db63b1eb8432f7f1d33d961426eaeba4156977436ae4e3539a687a02c08d6d6201f57244c83d11f5fe0031548e0267c9bec125cbe5ea2eb2da72986b477274698455d94a9a69267851682ece2da32aeec1aeb666cf969caed281dcd1d3cd9729cd5621883975776b5da8bf1a42c634bcf316c5f1466bdb89c78ef6f68336364cb9e2e29dadd72d19c9155039eb4b259914c0d21ce07145f833c638dbf",
+          "padding" : "3045301106847fffffff60864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "1157d82d3d7d64537c3d71d45c613730c35a2270b75664aa03745bd1145c61030825fc82cebb47b32b483dfd11188dcbeefc33a5a23cd394c8fb496bd46fc37c27f3b2a614f93b83216bb0dc5ed2ab4825e8cbd6146ad90023aee3a17b74567a6219f703d4d298b53adda7efa6e90e94597654eb9f0bdf605402b7e2970ef87d5c9cc361607d40e7dc57df65a021599fddfc33417d58a8747772a4bb2a50b02921de042acc8a7bb86659c29999159f5e528b167f3fc68fb0d6c62738e37a5108e14e80169c4a7aefdc4a6d7e5f8e04c46a99c55c8f3041e01ee25e0ea55e6fb61ab094628bdaf434ca2002abe822d83dcb6199198e28a596e31ca9a1d652279c1f583b0f4d8f62f6d3572cccd7972415fbf3320d53eb402545e5c680094e1d43fddfff9a7c6fc54d99d5bbd89b43b01f495312853897a9293341c66321dde1586afc9a87dc0ee6b96e9522c8e0d3c0d26efc8b8a1e72e920dde2cecf9abb0fc262fe6ed3cc433d1902e668b456da663977b1036666b1efd7609d2fba6c5ff809",
+          "padding" : "30453011060960864801650304020205847fffffff0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "746e41c7844904f729d879917081761ea0020aea2372ee8568f6ccd91e5efc532f9cb12f08da3b98877f2b93851ad627db7411429367f9a7af703a16ba34f2689518f468581879bbcd311c171c781f0f75fe522d038ae5bedbba455ef8bf92d92f53f3d8bb06b6a9fd185d917d01a327224978ee898ab1c0af1105c65d27265b60912f84a3dab3720ed229869523abd565ceec086ddcd48a2404471e70f22e214b80c062f0d2a43c3d0f8c0fa12e449ca1b2174ed1d6f0e7940f1ec35cc74fd0545db764bcccac5483720d25acda5c3bcb9c99f4b60e7717836b8d3520c3a8e7db48fb68571dc9e304b3a3914eb2407c8cf3e8f17bb38495f3397ec850fef614117440aebfedfc40515abb112bccf09fa4b38301ddca73892f4f780c574bd52a913ddb74fb9f56dec6c54e0c8e910eaa95f2f1a9172cf673ffac01c2cc3572b80e93a325373c1770cf69c09fced6be76193c83c740f5e4cd468fc20ba9ba145939e052d2a58b3bcac19541e2f0bc408a2ed547117db7aa6ac3522c6409d8e06f",
+          "padding" : "3045300d0609608648016503040202050004847ffffffff9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "7e13964d767f2f286807be50118481f2651e9da08d93d850bba4297890e79673480d7dc10f5435b5e0e318adc9af3dd5d99e0339f9bbfe21891f2bee35b9462b442ddd764fc278f77e7c17d017779888fd552537f8d7a9bee63dbddc10903c665e975cbb01cc1ddd0349afa100f325e3dad303b707f22ad2c120083e4e304eb1d12abdcee41f6d1cb276f58eb09cba643444697e43a899c5bd3b1d10ac939e618db4bc12ce6d822a29c205ad748d3f632b147a7232f799c14678ebaa0124a9ec16168e32df41d21fc31a2d87c3b6008b2cd90f51230e1dec00311faff09c2fc07acd78b57e39271a8912a0c5b76e3cdfd5915c6362f1559c28c95479750b72c4f0b79ef5f9a25d9022051eb1d9de1ac764fe683958ca8a6980098939b473d2ba58a4041ba3db8b5a6cd19b4a2212744e1e2179d6c94ddcfb770d55abe3e5d7a81032809767dda95683f1ea60054d19b61779f17346b7642a92b57da96c5d5421bd77b49c0cc75e6294354e307453718335f5c1d87f5179c9fc74f0b10de00f9e",
+          "padding" : "3084ffffffff300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "31140fb3b755d517fa660fdc5b940ba6c8fcb667ea633605c730fa47a3b52c0641829f275d2f8d9b8ccfa16e546146561d53a4d16a88bfc7ebf5fc3f81882e9e563346e19944727ccdf53b2f71c30a108ef2a43dba5be533fb0f05ba0ff302cf18e77d2df46d903476a9f7fabfb0a4e8a23e040359326612fdd9411910899900c3987a4b59d2e8ada6d6db45ef7f420b8e8faac28c6b9b55806dcf44f0b2137084035be8475ac6e5c6bbac67069530a36892e1d6bff9c594dad9b7e9bb604200c9320abffedc8ed3a568acb8e83411e6d28e0561848776c18f8822a150c68aa8279b90422f39432b44a9f843a843d4b970ca608b15f54c42057e17b406f939db847113fc6949090b203b35bfe53e3f414837dc0e2dcd58d5f7b829adfbbc60e41a8c9ed4a9fd15f31a7795c4fb93d88f640b20842281e966098060eef25b2ea3df4d8da8b8dbd9454022bed7f33539761303b46bf810b33253ef1a5887a9e4175cff852772101b27d1bc266e8b2924fb37917aaba4a1ffcc9fc444ccad469260",
+          "padding" : "30453084ffffffff060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "3d092c08b138223b594da83fcffe06d090dff3087daa313d9f691ff91572694acd79618016a21128d5ec266ffe6ffd45a55d9e21cc2d32680d12d46b0cfa332d7eb676dabdc9271325ed26d9a9e46dd3d4a2348724661a50c51827ffcd1123e43b09ad646838aad5372ceaf7a5d8e9d0a9daf1c1144c087331c1dffc3a4afb6402285902c0c0a1cddcd39c17d59e26ba87574f9d19e3dea6a907409a8ce60a1a343f99c03fd3c8c2304c4da3f856d2983cea2e212998adefbb4a3c11e11df734b625265b49f580ad733666e420d640fff98967666b9f135d842906e54a20eb922503e0bf0b829237404c376b9fa766ef0a1f9211fd268eeec297833f1a2b6a5f8d058b3b7f4cf06546307dac9a8f8983b423c5e4e35bd6015ddf1a9a118087ca9e836260a449152163438a027c294948b4b72d85e8fd9a8296615d17e370864b8f0fc99c3c177d78889240b47dd6f429fb5517203e45eee832aca712dfbce12ee112dde8613b285ca9cc62aab75eb9ee23a2e9adf7a1cf8d36ef55bca263c18a",
+          "padding" : "304530110684ffffffff60864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "13d10858e9dd83b88c6d06fda2b433637b55c611a9cffc566d10246e966eac2b404a7ebc5f1d382e1000bd07bcb3b47236eef93449cfce8902902dd1a963c69762420125ebd083dedadd93b6a4fe453492da1897f76f11cf161a8b7b54e70ea9fc5e4c8a3909a537eff2f1c693a86685f249be1e8b0a9db591a4d69502574fb161bc00746b1da9d0b697914a8f8032b45d61a3912b50228d6eacdbfaae960876c115034d8caebb4a6b426c3d8813a48eec5221feb6a11f9a4d426f5b142d099efdea1db072f7d776164080e2e42ea973c7b86215d980b1238f80fa0dd03187d1f42e4a6c1b5f99c57a83f0a7297e4f8df41a71637ddd82e6eec3750d226b43144b0595682fdfe29885f330f72ce3a4ac65cbf9abe8030776c224e1a77f818a625288a144ced77173f7d89686d5330831d0f49bb9121f8bd36476522011779a0dfb10dffdac7ef3a6ba5ca9a189a9d599c6dd9a0caa36ddf1a9260360f1d682f56b1bee11fe605dd46a22523d0cfeb6b410697a76aa1a96cbf9b397270eda3352",
+          "padding" : "3045301106096086480165030402020584ffffffff0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "4468ae2dafefe85b8a52539cc8c9847d94e01161e01d377f6ea384bb1799ffd763e4a4210a39e937993311b355850a895286b47b26c251997c9a9f18964e793eff80fc652fbfb7ce1f7f052b39323970c4cf427d32a07708f3859f9d101c4c75899a145da0590da8f07738043e4264e0d3d3e3a2987636018823647e4dd7ec3bc3cf7d65fbfafe365859e6a5fd907d37e0db2345e67ec00d7dc0b75defcf88f50603ab55b1e99e0f788cded4751bb49522dfb4f9eee8b2bea813ac50be538916ce07e3513b1fbbeb9b2f83c4c2e004d42a49d31fe63dc9da6b55e9dd60d705fa367d2cea478466a9257231a53940164d4dcba5dffc17dff7ff023e8a95da9e9ae126cb894a06e0341aa3c3c83a52d83065bd18c36a9edf3d4410f8dfd46cefca3db9b64d6020f9b964c6e4d9b5630b465396790525e55d33b6bdecdb7ff4a085516dda3e5c0fa3a7bb57252f4c79fd56ffb350669ecf1075112c5e90268bd773ab912e1dedf36a859c415f774aafab370883981d3e54ce780097b0797403d610",
+          "padding" : "3045300d060960864801650304020205000484fffffffff9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "7b4bbdd6a446be7d5ff306171d91aad0f94e7996c01b12f2e402ef415b06ea2483a39fc4db755f3e7667f474bfa282dfb8af30c26a561f499b506a9ac15500d8b994e6ec5dd7c0b6963dea7f0bf1e5df5ede5740e41b8f71ba6ff56fea051e44b441df0264d730514e3cb74e8e0ac5d4e0be7e3621be53a41a12c12d0966ce64c524c16f4e1dd04dff3077b50ef54f2f4bb1da42fe79aa81d1604ef346e24321a7d9355c7e3e64d83aedfdcc02038ee483d6c46fc9a2290a8d75c87ac56e04da09e661df1f6adbb1ddc19087a3d7a96896cb803068c496ed93ab184d8377cb277032d627cb5f89aefc574d799445232292382d70e13234e4342825ce75dc08501878f4d3d219442cec45c5c6bcda2a70047d671aac7593c746850d8491a4fc9f17ff16fda341ed97ce8fc9d3d8cfd889dd752eef198914c4dbb78646674a5c88da0f6dbc3083dd5453a520a68ef79a97b580b87ddc7b7761277108eebab138b7eb73fb6d73e8827f0d7b7f4411136cae3ee2f172adad6b5f3fe3acb478cf7ec2",
+          "padding" : "3085ffffffffff300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "56edf756f30417735f334309157c56b1918947f55978e684fc98f2b1a528e45f162ea4dc2463bc3dea7e31e0ae19a8114689ac76464efb2ff7e3a2258ed9dc074d5bfc47d6d0f95b71efbe8dbdfbb0cf6a9f3f96978597b6e2ed5c5cfd365ab5607419c529dd315302a753939c920351e2d1501f63ac2b8e1e3064eb7571cc4fd2d6af08c6a6e54eac092f80304ace2d717d9cc75efcdb714d7c86460f73f962ff221a76a9345aa92a17afb7faf5ee30a9351259a304f8430dc6c063de9547774f1df890756e4a797bbd1faae7f2145940ad316dfdeee42bdc5ffea9bcb19dd329b4f84c48318d63476f09f8de7b88db07634289ed42c546b2998b583e19912092b1895a086a7d050dfe693f3676e3fdf26000ff156827a6bc94ff483e531a52d84bd0f3ba9a8d3c52052c12fb7330b318da34da565f14b37144a0196000ad96629483e4371effed018452e69ffa4c73b0270b6a3bce0c76bb594200f992b035ea653d54ed65b2b4e70bb6d6f51ef37c3a2efb337694e3c54637858d828c57da",
+          "padding" : "30463085ffffffffff060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "405cd9478ad54df415faee76b02ce44a8ea555e9feb13657fe0fd0eb7e99a7195ccf80aea8094df48fad59f4fd7e8b383d1ace0956709cd2cc4a6018e5e364dc0867fe81f19b18a770fc82519848cf338139ccdfed78c5b699652ee4aedd5d529d51ca41aaae623469848b033bba3bb898e9e73a4d6b709f9697ce3c889d2bf2b100fc79feee0e5bb4ca9895d67adfd313fce9bf58a3dea9b6139a7ef7133e07f357c1081747e6093fa10f725bffcefb3ea79e80e66c8870e5cc933c479a64e682f9bcc459459581e483eac41a27af198023aca806b7833b1737912796546dd936dfc1e4c7e3e7b5d584c078d75930c26b6d53d5bc086ed1b5916a02409b6254a296bb0fddeda31c3b26b5865f1655c34654b4b46afc61cabfbc439dc5f5a282107dfb73e16c40e96236101dd998ce8311355529c79822ca442eb1bf089b6f32befb4a430cd3b38c015c2b7c5e74b2e6716ea6d893f8830a20092db85510e721eb5810a3bc7a531cb5e263ea4b1c851ec78da530c694226d6c5cd018f1def21e",
+          "padding" : "304630120685ffffffffff60864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "73d83c49b2f9f21266520b5fc02405ab30fc11097f3531e5ed891897b2111f6980ff87dc9e71037616af49dc7b95ffde6a409694ea5091287d5fb89890286cf018a0355066485ba92ecae9c6197003b8b42178352988cff33de298d6365e0b726a0b6050d2fee7967e79fc8da939a9e6d24930ca674906bd7a5c95a625ca320f28aafca85367f20f8bf4493543bb8a7c7534b28fda975c66d7b40e3997b0145900751b329658ce5d4f5246e96155207b8399ad9e920157b4149a2138915bbf5c8e4aab38c113e1375c6c9bcbd53c2280eec2885b1c9a826f2c938f6d42eb478fc32d27933ef3e0239f50989603366c98999dcbe73301f26a55e2028bd721f1e765225fee1ec13d42106127c826a810b3a0747ae5f70256d6dbefd92843797c708b4b6998c34e57c72d7bee5a1a720df1417a1e50ec274cc4579456c7f72c59803058c6ac5f9d6e97f3ac67b19388fbe2565e421347faf326ea2ab98795025408899cefad1db9f6e9c59fbb6b4ce50034aa26f52374d83e350f765c52e2571126",
+          "padding" : "3046301206096086480165030402020585ffffffffff0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "77d8cec49108b8a6ba4315c2947dac12d8143248447b443d3c189267727ead92e054f8dc591df862eda32e447fbebaf5354f67dac043fbb254331481afb6c4da45b233e4a5449da2ba07b993ecd07de6e5c21f8a2dc8c06a6222eec1cb82043e23ed72bbd9995379672a3a6d700870db6b7e33c459f073b92bbc052935fa967ab7caa04eeea6461db6ddd7cc061d38d8db9de581151d8b38c25e8dd79f8a4e2cd147412bbe90452bcad114a7cbe8d6b6130659aa38be2feed6c96efb1a3b8231d2f8b290356e77d3fcf9230cd75a87a84479a34ddde67a826f09b41340f1372a5dc07acaa0c7db898d49251a95c88731eb93cb35423c0715713e248ca2c7a850a2bbc7816d7bf3d82bab216189dc15d9413e23d77a9fdd11ce16d48f3ffb2643cd611ce15389966656251e5adb08033baca6e69b289f4a03cf88ff493e648785210b30484ff9125d25217348af874cb97b23c8d07258f95997e14f31f646f70d2f94f00db8e2958506cdd8403f110602e92ba7bb0ed0cf8be74ecdc85a131982",
+          "padding" : "3046300d060960864801650304020205000485fffffffffff9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "9e374703a9e94e6d708fab0d94cba375bd294aee74b8b63ed6e0e8396c1908a0284bf0b79b87189dda35b1851578b8026caaaaeebf879e0142ad1574d31f3f9bde867f25f4b3cddb65a273242e08ec77698c8bd1d095f92a87f7777fb865703de7b11f92ddcf8d56a330e43e2bd575cce35aea05f7a17d6b2e7e420a7cb2f6f969076a6a96068b4611e1e2a04c17be333afa6216e7a68f9314307fe49a3faf890f64122c04df658af93e05261b537344baa336cbc0aab6ff1a73eb540eff4922cdf6e0114161efee8178b5875c77f0c87ab5894d71d579f52044e13383d4747829744f3d899fc2278f2ab1d946969790bf62f3d55f015a0e8c47a3ed27dce9a4fae0d8523dee7eaf1703d1f2b1b5daa2bdf13a74fe6cceddab1c7e639df7883b5787579af5429b358a8453a325a3ab5746190b7abeec6babc198d0c6121bc420bc4192ec3cd79faccbf02a2b188d71a5fff9fff899be8101861193d2fd41d9fa253ae243a6de65d25ff86de236ab674e13f5f5ebc795f95ca4415a30cd3a48e0",
+          "padding" : "3088ffffffffffffffff300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "7e1af37a290175e7191640d8c497c126714cc3d90e788a96c70fd2206485c783c3bcac949e09db18d4639ce1d26bb7acb76c3fd7922addfaa370c11d8c96138fff55936c62bef61bb5dc43660467f43039fb5d69a8964e023745ebce424b314df76ce9e5999a7fd8cd33c2d2ca7f62e2d1cb8ee0b349674fa5476949a002fb6be10e21f241b422e5b7a8ad8889d7e52451c261f9b83f9356ea4e37dca86dec14d371a23fc7c9a99e8f81542e5caa691873c57948a3b9b31c8a203ea46e353f4dad30f112ae545e985759b2272664266d8df7cddb889251c8fca0061a27d3682341a789b6626340b9c9a4bd7c063e96d08081b0ab1437283ad8e4d95c5ca48167d4a410565294b657cafc56e75acaf553d609fe02056a20374d3c06bb7484373adca95bdad39d5c5f204f56e9f4a689628a7f0364bcc0fc42f71a8769669764c0244c7956100fae4526c82bc62dcbe47bb6f37dffc59e9dbfdf50225eb8c583b8b161e8aa3c30f70e71181f412758ec9561feac3f51ea5d1960c541ba19795590",
+          "padding" : "30493088ffffffffffffffff060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "1309305b47cf2c6293581a498ec0d9c0baaf682822c1e93c1738519b3845c535afc95d098cc5130e513aea85889f382eedb92447046b762c2ba76eeb89f4c974cfb8c16b0e258178c8ab06b6aabc37669984c4db5ec2eec7cd7785e0fac258ce4ec0145dc4401ff46a33c8e84dd8347327799281ec475a998cc92ea60bb1430954f174f8628eb84f46383514837a33a4b29e46130ad9d181277c4fd2405c9a41f796cb57b7da262255da243e76b1315234c241363abf5877d1ebbcd453b17a3cd2577579ebc0e2b7457b965e33491afc42083cac8526d6f44446425b13da09217fb2cfb3ab5fb5a2d84b837195eea58d412a83726cb67def7bc5f349c4b25fec9c512bbb3b34ba06d33e6fce13b991b9ea76976b2c641641e9d46a1ed19444deb9f20f98ec1fd1f7cab025e2394c5e659abb9968470804212c2bc526a3ed3ae38c5341bbee3b236441c40566bf980efcd1b3319d536876403a9962f8d84d2bfb65bbcbc7f5e7448f2f81418811eda1b758031951c2c7ce7e0e375d7709446c11",
+          "padding" : "304930150688ffffffffffffffff60864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "3f9364cc60c899ec9941174efd85467eaa08d1a61a9013431d28dda61586470415f36218d43ece41d4226e5b2ad325d31bf1c94872a6d491e342fa44cdd6bb14b6a9e33a72374d43cf8c671f1ab01df01be49b07478cf05eb936e551eae53f5bb3ec778116325faee9aaff2861ef3e9eaee8260c85ee1bd53c402df08477537cdc4d15fc577ce7bfe9ef3877dc3b2e27533654e18d62c02322b2d2c9f1dc65a552dfe4ec4f3e5fbcd474bdd9cf4b0ebeeff8adef924c2224265a7e31beffce81bc5e78a4ecf0d116ce73de9844dc025fde2d83db233ee965b08616fefb229a9ab4688d726177082ee11f745a68bd9f73f68f0049b4fd1d6eb6409a465b11ffc9aa9282724a9501e21e00e5d8e182ef35e8d60cf775c852969ef01df5a00455826d6811b4d71f45ad09709ff21ecd7d0162dee3332b0ef5af75a89d50a04fb0637fa89795c883bb156635231b11387b6393940bcddf0dee2511656d019bfc7752ffac5cc7a715b41526418f031e29721d8defedd0df3c360aae5f0615cc2fbf71",
+          "padding" : "3049301506096086480165030402020588ffffffffffffffff0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "4ab6b85a2c2b64135217709b6ef5d267dc8e9f61e65c539fc92993b84900f9f2e6a035592751f5ca54001174c12599466ffbcf7f86b4e7e39a94214a8b84bb2baabedce3f526103e3e951728b35312a4a617a031167acb20e28f2bb7c175076f8556dc5b37e8bdcdb0320ef434821ab5f4b2a312342c7a64cd0fef8981b52d99dc7af0f27e506c7e099eca75109204394d5b50d26ae3770a1416aa73003461a750fb189acb23e5a6802d098f8b33c1397c44d6a4f3c0e6ef4956dbd285868d3f2fcca8280ff7a9afbe4927f444a394e0d62c3bb8e255396f22d14a2148732d80b6fae6de4ee6e4747764dfeb4c60da9a7b2828ffcaa670a136bb22ffdf997e1c8ba1f5a372facfb467d7e7378a64c38f447d45edba202e233f8ee06ba56e7c8a151c4c4b8dafe541de59a7b530a35bbae4cf7a885cd6ec1f2ee6d14930ec20b53893eb4457ec36df22a5ad015300d4d1034286471f72a05e395598f3b09c390e0a0594b7d36b4d9c1758ce3d2832ab64db2a4ca65211dc4e5b4e69b72b21b5e9",
+          "padding" : "3049300d060960864801650304020205000488fffffffffffffffff9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "9d86754511daeeef9ff6b5a1828200670a1a1a9f7c60889644a24cb0664cb01fef5318237a568781c26f49cf9d0c094ae79df3baa9ea53486bd9910a57b3ffe7165f9208bddfe0476a16eee73cd85fb41fd072708eb3484e295ae6dd1cfacf2d63ac269e1dc6afd34d022030a85861d24d8fc73ecc5d9d6f510c2488bf00b311d114f2c73f18d4244bb4ef868c2315734605f8ce5022d74200bf520cd040d899dfa193367f07151ba0de412dbdcecf5cca924ae675631818a68c2b92a8a58d53d168e12f84e5f1cbb087e974590689df361cb3f0243d5a3f325bdbf4456a4d5991d245ff5ccf8d15c346f1f15eb8e6ae7ce4e427553982ba38005711443b4acb99c595f7d3b7f465f4e3642a016b4fa5d1d4108f6fd7aeac9d12afffe7f90619f56162e289a2646760c803f4246bf57bdfebe39aa7c563b8c25e68e35996a8a068fcd3e32ac4d34995cf8623e6d016c0d2ad22460f7a0e3ee8f608b027623e926c36a5b3502f38af59484b71ce68143755e1f2bcfb5b6ce7fc060fe48013a4a9",
+          "padding" : "30ff300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "1be236c819d1e7078aa99ab03c5334ba84c4bb30ed75a05d4dcce54b0c3048720b20f69f703880f9f1ef38b65143f838478aff456fafcd7c7c56618f0a5f689e09d86abde3d4aaf248abe6c4632058cc519517a1cfd3d7c219aa4a53aa2cedb164e9387f789a4099b94fc23451f855e0eb759c522becb8d3b9ba9e73613e7c1a168c378eaed5ffda4e6062184d40b3409ff42dd7f1d1cb20a557122fa82292ef5513da40a16db1d45b0121656831b0f7213650478e835f43c5e103bf663bbce02ef5e34050ca38ffef5574d21dd212b57f65e59336142ecb64cc58a6c51bbf1acac55c8aa30a77c9b5d94416ac2d9c895760045f21901b19db9026aac3da725f90af498e108f3b0f3383ff197dd130ea425254d7a85b5d1d843609d925e09d9a0d0ca6fddd0d7af909134054480fd8f78ea8e106484dfabee2a7260205da8ce2a95ea2a42cdc9de07b0c94fd4682a574ff22ca14c033a18905f7155cfcca994c22c4321915afd0149843b3f2be74d28d3ae0b3017e8eeab4ffc531c382a1dabc",
+          "padding" : "304130ff060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "1d7af7303b7480a2d492f87928ee58e4b30e5a47cde37cc368963d539661b503202a13db3d08ac507d9f98634f869acf6d7824f65fcecf03f7faff5d51732e23f03a20a784808a4f89f1c418a59a7ca7d1a5ddd726bed532bfa498942a6fb4dcb8a331641a261b94f60b43c0a857578fb3122b682d8a3bf9f97c5d98231e091d6a6f35d3b3aa3b2d2397c15138c4c91ce7d8f96b54a0befab5662442b4ff30db1a0d06970e9c1831798c65471e60a5f0e76cc5607fc12db3ec479044fa2ac9b0d36a2794931a644afe754b43716989b4db2a462a8be69b8c7cc2fbd78afb681816b21feb7ba71156eab4ad4dd196ace3908ebcca00d7487327e865769e9b877e4d1c172d4ae77a183bfbeca34e0b27f3d1f50f6739faf982e46340e66c89bced5046764d3dd9b02c6e18db151ceaf9d2789d5a923675e72e89c9e01aa2270f24a31386a7cc64897f4c79d58020634922c2926b72b0d00d1ea28099116465bb5120c64947c9821ba840c0fcb1906dfa88aed9431151f6071fd82e388330009e87",
+          "padding" : "3041300d06ff60864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "5531e7e612176c77975c1af25bded7a9dd232fcd51f3a8a447d4716e91161bfb7997ae973d20a5e555c84950757ca7709d840f0954be1c42b19a7d34178136872828b41e57d3b33b98fa61aa31c90d6bae10bf0a9c74b41900cb6b90cf88158018043c7ab996399904c212ce2b15f096657a24f697f27acd04f3997880a4a021b500a64b6894493130db373904f736de03abe71bb675ddde97885f0c73a770ccfdb8b25b5bfea0fbf5c98d6bf19d3cd2247c11b02cd0bec4476b9da97fe1d4a684158ae235274a1a93a03780b4929b8549128d8cba3af070978688dca296d81facce004d0e15f787c617008ffe3dc145d11d985a264f3ba2caf7a7f5a3bf99eac806af06611e106f2daa06ec6da6b72d8047c454c83ae79bfc44b8053d4be351b46e73cef389a9ecfd82881ce691a87972b3f7eb01881ab5670d6190cfef9e034fba0adb4015835f480d6464a07aeadb0fac199e4524dc6ee850c8aa2799e24128d00b402963549620313b87518a9d003f2babe91ffce92897f3999677553d97",
+          "padding" : "3041300d060960864801650304020205ff0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "131d9d72773f3a6b9026f55edb23b348ccb4e34f6735ccc204592a69ff19663551d73d340cdebe9f1d26ca192ac58764b02989cea4e8253863a6d9376a49a2dd6ab53dceb678c3ea74e7f0b4ff97563dc168e2020bde4a56c21c988f88e379fe647b3a39651c1c561ba444eeb677d7130f9b9d5a9a4cd9b09fc879c2539f2c423bd15458ef32bb1c71d5b518a20dd50f4a9acec57648bebfc4df7964fb6d60d0d37116d594864be9f826ca53533b77317090a3bd1024bb7a39ca67f43a96f5e52aa5d73d69288ca3f2de548641579f54e484aba2e4676d91ce01a50a90996acdd32c2124a3cea110cadfa46338374c87fb52460087a9caea824fb83673796e28e2d00d5785b1e820b8d35ca1ad0523b724a310b606a4bfa6515a2b7af231dc203308e9a9d0a39bc10c2be68651860344661a73cd1e81b61cc3b39b2035c15f6feaf4d6821a38898e3e920f0e707ba72a20213d86b2642873dbc30ada5b5cfc30895f1cab0393383f61a7aac1e442f3a5ebd01d16d5c4b745e56b87b19522f649",
+          "padding" : "3041300d0609608648016503040202050004fff9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "5ecbd91f09531622a73bb696711c450ab91af58c953139dc81fd527875be35b8ac7e377b5bdfc6f2cc502c0b6d3b1efbd5b74f2fcb49779a3c9ed716431aa0ecbf349b1dee3e7285cdd3774db949d27dbed08ed18ecf12ac24f04865b7e11719b9618bd77085106eb05cd994e769fe1f261f8b755d1d4702115638c060c1c5c430790250ca71bdcf10b3105dc3ed84be09ed12fe124495692b2ed841429dbe1382bb513416a488fb4aa7956734ace455695a641dd99719bc2530cffd6e02bdb4f8e0b391e70ab339b153653d9688f2beeb9046ea2ca41a11654978dd81552386827b8dc8e35d5d401f79c3ca2bf2e1188c35b27aaf78a36e2f3c0245a3b5dd1e0ab4bf60a3e5c18e883b4d8110914e08777e463932cdc5d01a4db721a27a99a3c2cfb7a497609243887eb244f6fa276a0a28d53a77d28bb818706e72f9bf91ebd99d3598761b3c38fb0ed0c4c5bb32831277574996fb1f46af34cf173c711fb81e0aec055dcf19a594a4cf5f667ff64166180ec8783d0e82716e57619a45f6ca",
+          "padding" : "3080300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "479f622eba6551b6f975f419bfd3fe5fc357d32199d85ae27d5c64a9a832f2f33dd93ff1fa0f3e9487d3f292b1a60ac1239ccc568998f5a5e2fdae7da0187ccfb7a91d754b23c98c34a810015b050f8fef78fe50f2c9a99e16bc936898a5355b0642ee15286f8a0851a7b91d3988875917e3905a0c265bcc7f5fff020c709fd11049e908eb42e4aa13bb6f7bcaab2a3256cdb2f58500717c7ba28464552901440bdf4ca6f4cb9c9faec372f557cb83d4258bf853808af35b81da76c937af62c926f7f963aa68735f6ea4ec1c487193cd4de17fd679a9fbd8ed18527cfb7bb8266635f4aa66c03f310b19aee57fd3977a76a858b7e7c405051fcbdce4ad4073d8993a1b5ee16b10f5bb3702ac8728c0f3c0c8b723e30287fdd5697fbf5f08c030f17e1ff988ab71e0ea8539fa68c30e2fa760f1998e5bde95a65013c686057a50105c9aa058b44a6982104deec31dd1f393a8223a25828130db01641660f07a5f9531babd71df640871806880f33a2b13db44ef9fb0d03b36ef58a2c554510515",
+          "padding" : "30413080060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "76760f4face7373dcd66f3f89a1cf93344c0ad0ef083ef769a8e26013e0551641c5ef00397eda16e9100be6ce21259eada475b0ffcb2d70ffc561250503c59280c63f5ee5a58cb5c11d27ba88bf1c219e4975f3eb4e02eb88191b3f4081e308b0455ca3d729adf5e9177f837e5b6279e84ce247f6f95164109f5151ac4bab08f5e1a2875e4ef16c0ae9121cd4b1a2601fd52a4f1d742ab6420161904816e4368fb7e64bc8f240651da39c28ae81f20699f6dd71c4c2a3dbfd2109ee973bf4df6fbd48379485e2e7ef6602e6b480a7f894d3385c80d9453191737516034bdc8cd93b35017a2f97356d670f424bcf4e6643b4d29ece738851fb57eb8561fb7260ca1919ec5c9f90c6cd4a5d60796aecd2d28907412ef986cb08157e15e5ae5ea98ea8dfdecf0cf624e65c762a00a78fe1453a070b6df6e89d7b51285379cd8bf4f3ee69a1a233d0caa324ef72a1ef19e5b5376403487b8c6f0d54cd5c2351d082907b045333cb34b56f9bfb3142b889a5cfc3b9e667e8971129a21b4a2e5d1b39d",
+          "padding" : "3041300d068060864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "9893a1f80a5399db63def36a1801903e04c68a22974c37b4c77e610acba1067f8faa6f54f47da6ac680d2f94b6167c71b6f626679d4099294914c53f00fc77263c42ffa995d3777bfda44477ca1b790685fb27997ab80db50e1a99ad4b77dc0aa8b05479ff2ac1589440476b13fcdd5712aebfd188b6e6d11af31718411dd09e55275656467220be8e0ab93ff03796321d72e9ccd32cca553c2dafbd35280e8d2aabfa8aa3c111a7a34da57785de990e1ca0ee13f2118b2277683105ff09fe5800fb0be608729393f2ef495cbcc4ec30bf18e7f23b8e81cb3d5e4973ea3451fa64ed7d2d6bf99245775c6d8c33d62368d5c90d73b9ea292043efaf7564129355e69787e618a199ebdf75ea53bf7b19b3783276f068cf01e744e7c13f99afb3796b6c1f18c8a961f02ce2b1280c66b31d7c2c43c563782359c0dcf67f1c23cebc4caa9f3d129fdd0dac6f0a7917eac5187f01c708b3a6d539e133d6486596c16ad6a2d32730c8593ddcc30e66ce41345e67a92b95b7e876cc6c48930b817d5cc6",
+          "padding" : "3041300d060960864801650304020205800430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "21db7c79c85f32090e2a0087d5558298c700c40f39a6f9e08f70860bbc042ddc1e98c290007f0d426b0cff6d6f32eaef0792f10ad12ab892858bb2ab510d9d5d8d2a2bd0a0c737602c9949d15e0c67d5c54dd85a4cce003582f892317869d34709696620fbcf0bb572d665316d11d14958a58e11ddfb75309c7bddb87fb851d8970ffc2ecef3d7f57cab94045158c01ea3a97843ebb542494b8f883686fbb83fbc89a2aeee590573bb41788824ca49da882f475f415d7bb64b113e046714dd67dbe0cec72416b9be30476d197ed0675deac614be24ed8b4511c41017dde5be0d09e1e4201e8ed9f43327da18ddf40fbce03c477f8a3831bc1d22b7ec72be3b4927c905d77066069962f6ac8a929f810044dc1cbfddafb763df8596d7a8197e8e70b4a818f4c2163a16907bead72940bf94f64f4ced5a5141dc2757d6b93a1c6e5034d47a5ee512f960f37fb269d1b0102b8801ac67eca3ec27a6938544415540f55b1c5919560778c6cfc8c6f9bb21d2438d2c65b95554420d038b1905e02d09",
+          "padding" : "3041300d060960864801650304020205000480f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "169a1d69376ce5e37f7ddb7996c66a6a0bcaefac6e41193cf6b1c15308ac9fcdbb68bce602aabb18d94b458302c7f96110eddad9c61844428513f10d5b82fa8a685b756bd2ae1e2c7a94da573f4bbdbcc49c965748bebbbd94fb0ee74944cd272da81ee3af6f747095d92562c0cb37eeeaeb24ccaab9bac22302c46c7846891f5de1286a16a1bdf4dcf78b4f94795890ab84b5a232e5a21b74e72d5d8897858897201d3db3a7f5a0c3da6eb6465975da790a8271619ecf2f8b14fe5ed986441fc8c26e506f408699b8d100bb2d9dc7515c114d9845e6f29a306800307b50fb4931a249f47dae58756e132684ae1ed6198f88179c5c97d3edfcf76d87931cc9012b23d9efd4d2f330d549eb7b30ac7e00b67f39c8e35268df5f12f163e3f7c45941fdf746a653144a3dc2fab365d527b2b270c185e020545eea07efc6baf00049addcd83874787a3fc986a571c0c11a4c7232b54a438be0332589ecb598348d0a1dc13fc931122cbfd8eb4d286beda183291e713ca1b872d8b831909fbc033b77",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "3a975ff773526672d671380dab20add0000035d47c04ccceae78ffa2975a90647945b467c4e30365cff5f3a769b053b5ed05e0c87934893881d896da2c714023394a1fbc08a09538cfc89ad3481bb0383472aced4e7d1947c40e65a06d6adc0d1d47493199aa981a7bde828a9c45349ce85ceeb00b3978a12c73ead5a65f17df8aa85de1ea87ebb0beb5eb9d96d6aeb242917b777a739bf805ce49e2d0f2f4d5115d621bc7839640d7f5aec3a4546958f62b94841a1e8e53e53ea820eda668f643354b1bdd771fb228f20ec3e968a6dd53db38f0fe847c45dc68aeffb96dca441b85180d9ab348a8a428cfe2d74f238fdf727d02e4eb6f52e740da85ffef408eb500a27ac9fb1461b7daf684f56af3a58e803792cbe2bc7018a2525fd3e4313f42112558ac821cd1274c0656b65a2ee2e9ee7c21d47c211a3018caef798eda6814a9c0a14c039cfeb29e495ca272f0471cf32517bdfd6bc36fa47890ce49fc6a48afa13c84cf7652f8ee1b6d91b0348e90f3801cd19f3dff1ad24ea5fd8b62ef",
+          "padding" : "30320430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "5c102bb519d831ec8b3777861d8da6e59708411d6e278b264e97c0e4963b6e4471175671fe27c64b00511d00fa7c8594405cdd0e8fd5c6fdc997a3f7867d5d6df13376955aa2cbe93120cbbec3f3121ec340d0c52b0b9ccc110d194dcc0154d8ee0a3eb056633a1bb14593afae4c461928b2209013b7ff516c9f8b548490fc1695b57361fdbb806962342652df898f297676b0a0bddc98ee4d35f2ed855205ae00a3bae11bdc7dec322e69e629e7342008b6242199e5a90f550107957e2dd5e037776f3b679e479b8f3842efd6a35a32da5f20ea59ea209b3e4d9e52fef6c3721fdf7caf5c8a52737b573b8e7222842c6b97623e38378d61dc46442ddd056cef1e62528c7f586832a86b39f02c516b766ada35efd6a7a88567e618546ffb027ca826343a9020491572b1b96ddbcc6aa3c34309a254adbf1112774b6ca0ba480f4e9375185d2a12b428943c8d0aad7420857e7e9c8f364a7215b5f3f89c4b345ca24ed6a4535867c7b8b5eed03e4ef02c3ad949522529c7893d4ca2d5e5cd52b9",
+          "padding" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "4c8832f10a7fb51141c4f802bda680a69220ced808e5037933911b97f017ad739191d5f15514e9f42ad7adbfb62da4eef5564ed39806522fc7c7e09429fbafb7f48c23bcfb6ace666fd764747e2b1bb8b3a408ad80983ca0b794a25a2ec4e967b4d1f5cda3c7e708f1f90efeb068df2ab53b1ae279ae3850d8882a38ec2c92772a7a27d7411d50f768b3b99b8329339c5fb375ad513d24cf2ac0b300c4a901b486ae6606293d622fc6e76083a296d0eca5c0863301659d67714c95b48b93631e7e6aa6561d8dd14c0195d382d7bb60e0511fd98b21040cac16f5788ce09671b49f7a0d9397d96969ef3edb12b957430a5325013aeb9fd73adfaf5ccf5d610e5fb31d78a272583523adc899b24dabf8cf15b5c042a59fd87307914e61729eb72c6c1611d4a99cb80cd43eb72fc4f5339be227d4afd682f9666468edcf8f6e7d2ba57979289bc91bf8e2a5e114c7df98ff36d0e3c557917bfd9365f661fa417fc6a75889f8ae639c8ca4f31d5f3d87e1f1711f7f3698f5107146cbcca4f58bd689",
+          "padding" : "3033300430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "91cfec5f96441f0a05179b85502d8dfa2c41966cbf31694e258add869511d24f1846bee404179747dd17b6e6a9524ce397fdcd078bdc93e8b4c75f56699332b8ab06f3cbb868f1e6b2b410e4049cbd31c538e246c4f14f76e12bf230da74692ae55bc019d24eb8cf445eded9a14d5aa2aba24592072ff3b9c801961b0c7cbf8037290755879f2b5158fe133dc7023fd21ba4e21a39da7992b724ade2a52921385b6c359d9814b62b0494e5b1d436b17bf3d2fcc1e95b5f9556fcaee7d8088e808c3ba5d5a92cc1518f82ca24e9659e0435a362d4a1f1d033fecf855a3e6f05b6791b2322d81f1298af5ccb4588d9a6c6d4f1a425c72f9d034f7c35d8f8103ee2ca0ae7d4daee2d2929ce6f3f4ae04d8183427ea0b20f07870ac471503f5b94692ed809c5c6df9b95330baa3d13ae8a3ed21e7480f1f2a2bae1df9fec082ac154276f1f142627bdbaf1abb64703c67d9761a02f88f0e18e9bffbcb7d4bed3db5bae8e6421d9c04fbc88e43a822495cb49d2d6244508f3102a732bfa4cc0bb970f",
+          "padding" : "3043300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "4d13b9eb5da323a7e1877e36b830fe6a84ebfb35a618ca53e43378fa307c9990038520df453c951016ab4f918e94c1a1ce53327e0f9af6410d3e0fc20a22ede95cc21a8b81a55edcc8f64a497c579d5107ffaa0bff5fbe64be77f25d4763d546a3451633f5930dabfdcbc84c5c29f0937efc47fffb25930a7f737632e485176b78a575536cc7522efa7d90817ade8e6a2993e53796ae54f746c4d9e19f55f6cee53109d669d35f0711cb1eb0b835e8257bf4672aaeec2eaba4a0d5611d7573019ed66c3a5064210f187f64e5bd6f345737e76b12e3db4913a752dd7d1ca0a80276b38029f412079545c54997c1890f9f269040f7ce9b13660cb6c348caecaeff3dc9a3bd8f542deb50771a44a17564c992a163be49151654961fdd9975b77b47c2c4b5a731d78416936f0af467116c56dc5987b42ebec4e926184888eb053170b8808dbaf8b58e53b329ea24af08edb82c48f66d58c4b59117a711564b4a886d38e01dd83230d20c2d248594c28a4e16a6910d39ec05d4c46b549cdaba7c8ff1",
+          "padding" : "3043300f0609608648016503040202050000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "79f7076614b968d30136234124eb002100185aa41603b85530a87e56723e363e866ec18b2bf7cd69750eac12aaed2f5d3cd8a174037d1b11e0fddbae8248b6958047f4fb0836eacc7f63af9fe05c772b7fd84b6580f4160ab78239468aa9b7638272eb3bd03135780cffe958085fe571cf872cd3e063faeac687d85c440fd8f9f1b0284a4749ce22406f3d779318b0cf9820a226c54dc2387601a7b0ac8c4c7579821fccb8e8caffb1c506ec3c3390b4308fa5f0d3ea4d0f596b258c4c414c47f6ed143272df118d0759f707b50f4df9ccfac60f72a1eebe484bce46de29ab8450f35852ff06ff860cac57caf20dc81b9f0e8c7cf31667e993c0c502a54f91287fc4d20dcd3cdae22c4fd73c957be77a065a8ff04098b6e7ae166bdb42594cdd9c902e2d031d4ad421da7c4a7d89ff85aec4a05759fa207446f55408386ac9c3c74a52bbd9bf73c094b7a5434dcfd3822ac554a852d3be1ceb966fa5923b917ee4235aaf4624928d568d80f2155c2443c2138b0bfa5c63b7314c2073a72e7d3c",
+          "padding" : "30430000300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "823f727d76fa08e6124b857e24fa0e4d9308c18b5a750f26b8035d924ed56e2ff9226e0747ccdcee6b5df5812e432d952a93be3037ed9194f987bad87498810b4072f9874693b35690bf6a95759b0ad9613aba0b36ec8565d384c345669931366d19480376d79733edb09629791d9b3f7bd4ead3ff37966c3b9b78931e2933a0a9672904ef917c8098cecf30b0f7a11f41dc00c128e64fa52cb5681491fb0813519ee60add3b8750eff8a51faae4f96a5bbac731eedad4c11b81c9f116f2a8c9e7d727b84e90f9f89c37fed569ab6ca9e1bb80529a6361428a6f3e87b83a9122085ff0f9a81faa5e57070fca49daa38b1d590216ff1d38e1977a53fc89440a29e945e6182154aec7e43aa1f59070715be2dd0eef8e3772a2c7f2c44b57ee2a0491ae6fcb312838fddffbdf0e9bc21a52d9473ffaaf4fe9816a277c3c2200528e830ac2d7fa349e50550acb177a0a3621924b202fb44a542e551ec6cb7ba7b66db86ce0767094e89dca1eeea5ea2a732ec009958b7ac55c42001bb5de07d899f4",
+          "padding" : "3043300f0000060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "53785168755db72bcd3b7528e9ab4247f85c2425ee652334859ce25e1abdb26277150db9aa3641cdacb950d8cb430b638ad16f9249f2a0db6a58d0d832e6901becdf4e749bce08fece01d6c4ea7fe4293a66ae4ae39ceee5d0d12cc37b8481939735f7a55524250a0618d39afb3645e1af91fbea02145f1431ca225f6d1c4a562fb4bfc8c59e64887370e548fd973d4c0b7fc0d8d3281ebf3054fe3584dee13564a8818c6df1cd78838f4da2cbc2f447d673dead6a55b27bc8b028c8a9b212f9473f361cd38e8b24be043cfd2a18b42f5b4446a71d4c74dce7b7371658c5337126741eb70783512d2f91b9df8893e9f903183487353008495363e68a357108fc41634830c67d69989d25b5d3b24273542ce78ca72dfda0373598e103b54962dfd29a823fa5c0149e9f2c2f80eadd02b2436b7872cc5f3834437d22a26717964dda44cca259769bf852b378caa879a09718f36e352866f4e76346305319789d86263de746f87c8789f44be6493648789fd7864c30bb089f6bf66ec669da8ccfe9",
+          "padding" : "3041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "5fb58effb5d46a67b88b52ceb30ecf285e264eb8f179f633c7d3c87f0401574ed7365ae5a02fad1437e3c6ce1bfa03986f0f93024bdf3cf0e04f08741f5c8032091d58ca8ac92785a31af964d499eed535d5cd14aefb61508146321e45fa0ac74a4c3bb4cd1a5b921f3368a65eb8df5d887ae303fa7a4531a07e522a7065618d1da75cda66564dec3320280a769a673015870c3f04a52c01eb6e31d74250339613bb3b39e67bc33edd45130b5005918f31dca231cde2a7e5e27d84f189898b537d78becc983f1e00126b21f3f947daab9102623e32639c9e7c66c6099ca1c69b4a4d24a0c56798baf8616c8d4245cbf7b2d7b212b9fb7c7bfd4a49b5bc1cf03dda5f69c7490a8e80473288c7adae02789ab4966ae3b4cdfbfe3a0db1989d1e392d90dbddb52c619b54e3e2855a1507f2c314e5f269f3934308f3aef49ba61e16f0abff6d3d1817afb82c097c9bef22cd439e717480bdf85d7de75e903b3a22060adc88dbdd9b854ed727b6d86f01e203c98d99a1a22dad91842a444f7f81a894",
+          "padding" : "3043300d0609608648016503040202050000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "7a87067db25b9b113b66ebde982d6fb68cb5972a2354061a649fbfa6898ba6e39ed2a206ef0901a5fd2d04ac250e0b1182c0b4820a7d36cae82a17d849b6b483c563192be8e3be5cded937b4a8ed348cad8b1612176f166fd64c4f9ad337494e0602c6707bb9fb0d8bc98b12f4fc07dce28e1c9c3f797d1873f091d3244ff2d8019f04dc5826aae36b3f146916fa1b4adff2c342c285108df07a92b2539fdbc568fb01b3110c465774bf1e7db1420fea6c2c59d9e1142a9ce2a3f14e36f30376dd25ec55a66a16aa53e0410dca324de691728bd9a532e7a73d4466c45c5a3f2b4cc9e79ba5965478f0519050422737703a54252da1c90e6344dad1b1f1100756b421765cac73da14d84d857cf1130796bb97bacc57442ea2f25070b0bafce234b86a5bc69f2ec29bee767a8afdb6e596eb2560b141fe29ecd7a111248662cbffdef2500b9e9c10ed4226811d99648e3a3f8ab0c9f2ef6f79fbe61d9f23cb2fe81e79043344808872e50d81d1bd1de211d431326fbcbcf5a36145f626e2ab021d",
+          "padding" : "3043300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "3710891c1bc609d7d31a58dd5094f70b434d5ff1d37d3aafa3ce31395cd0819d94d744eb0d79d942f0c65da6606be2a89a238954622f5e6d0e993a80ff623708b5186cecbe9a21ec4ab593a95fe46cf73547f25b0a2c8953c1dfef3a1e50c37a725216be9eec50895a62f536fbc9cf448112656cc775506b79a7e26dd6bf90e5f1e53e0d7c1a3f22e2c086bf916aa72f3455dec6c99b720d56b2f80cfe55b4a3e7944f56853910698e6cd974c19468df0fc0e1a4408a2c1ecfe239672a7e104a95b8f7a9dbfbfe4d538ae24b1c76cfbcdeeb31c27c49eb55d6d5d3247fd2411efa66d8e0a53d9d00b76541265a00b9ee0d71e89a38f63ff9b3169dca65158602efb4fa70419b3c7e1617a33df13adeecb46b114c8a96ff8e70eb2231ce8f50c785f0b3a3fb4fba97eeb25eab23115f71a65018a22c0eddc3bf7d31b7598574ffdf0d2baf9c23c660494243907b93eccb3f335bee80334f4572c3d5e57ec1753fd10c764cf4a6d1b5abd99c4ec844fb1ac16fb84501bb0f8cdb75296773523821",
+          "padding" : "3043300f0609608648016503040202050005000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "044d5b6a176c87f3b605e222bd9e2af0635396f73cd2db7560e842b28b5c956eb74dd2aa46cdd9476acf3ff6edd02e0d1801a3e97f89c0611a3bed7732217ed7c8fd890a8319be159dc1038b2df28997cc31edb08f64d9c5ff84e4cd63100859afa5d6c54ada3d39363864e53ed16ebaa0d95df1a8af19c11b236420775bfd0c1c63f25d71b08dd97a023469e84d265d17ce17caf143459f35e3d8f1801f64ba8c97cdab77556c1f34ac570f1947a375f62fc6c4c3ddb04363c6455ff50717f8cbdeff55087c836eca9edc79976d1f14c40b3c4c5dac0c579a64c40a26092d062e1a8c2b4fc63a03d21abcacae6a0faf274db6a1d82ffa55eb272354b7507e0028eeb0bef2fadaae03b82d488ab450e1a7389de4b1f73fbe321d8de48c9118689507ba3bdf6581907523222f7820b85f601cfbe6b6b29771146dae34dee3d7a7bd6c78461c544c81dc1e962c7d78fe50df998de3308a4c2cfe68e3bf78083291f044349bc1220a7b969e7a2e773a9bc57e359d0826d15ce8ec09ad22f03bf2c8",
+          "padding" : "30464981773041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "320e2b1791735625a7846cc56050ef8258ec4baef5e5ae8e69bebbeb4a777407780a9be356687aa13c9f5c04f67044c5a5b10ffb17c9574360c697b72fd2f647a33b0f55867fcbbed311bc5d76be998a92696f37e6b99f27ee448d10e0dd17ffe6f5f7f07262f12a84bb8f539f63a85fbf530cfe1cd9b1be1c98da296e77bbafad6cff34dd559e083a40ed12ff4839e7a118b8d3f1a2a884437272bd9472c56f07fa8cc29f3e14d906c03622b55b0e9ccd7cf8dcfab4dc5ab2bfb158fc1667bb82354c19883808dde6c72e995321413663dbd01b2fcce0f4ed1638aff672aeaf2c82d37eca0dc5a4ec70c324952b71d37d08c7ef30f884c364c1c85524647010aae11b6887e5f2c86aafc7a6c23432eb4c8f57e35f529eef806ad10c39a32f65019a25e04252be1f795d174878cc9afcc4dcaedd73f8080dc3b812516b49a76d7b6c5b2960ee44c6dd4e8ecdb0f15f999d9c457f6bca0083f38aad6a80a7af2f46d89cf125e7f55c75511e4cd9d462d6c4a8c8248a03bb14a5f53987c1c9335b",
+          "padding" : "304525003041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "08a48199ef7c23be30287fa4c8b6c63ef19365b4529f2079ec10303f8baa719af016532593336401f93b922a17a760798b11364abb463a9273936b4a0005b9ecb9658630e8847c5e4ef785c44ff2ce0832c4ca25e1595a54eea621178c7dda27032ffebf3dc9ee27759a0a01400e36b87249b58c854395ea5bf831c08d42b69a57abbffbabea943c5d450dfaa05222f9a82062b103277ca751e99352c8561e7edf01654bf57ebefd8a5a4deeafa9e2aa0055d02d73c3ce43b1c8694513e98b490ece9181e83da0fa9ae2c32e71e27dc95f6df5f5cb78d1ae297bc044b7315d2b03d1df786ab0ac55022fae5c51bdefcd97efd4d5f0ccaa14c3f429d164077c23320da2c47d936a0841f401eee0aa18d3677abc1970905edaa6845de62d8b51166fea8c149634c64b7e552e4304392921492d83b624d917f6da7441ec650c76d8404a6851ba16cc691928b642354e91535ca5be6a636d524594abe1d53268652164a0752fb6bd855ff0e2f16f073f948dfe1d687150cefccd17df8065bf1264e9",
+          "padding" : "30433041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "498641a4096cd12ee4d68ab9f5c0b0bdec3588558fb12a4b4adabf30bd5ce8d757343078fe1f64f83f73d9039d75c8f37a1977cfc7bb8fdbcd94fda1edaa382b4a0e9b142e8ef9e4a101837dd96a9e3448be292d4b4ec59681076ae3f6de3bdbd55ddf2d80b54a9d82152ffeed01043c2a5c0e355ae368dcd0bc666eb46872a0a14a56e56345bdbcdc9592c84ed73ca6189e340a85c11f8e6eee064cd9e0e2a1cc4566e2d142f3f7beaac2f73b9a055c718d53ead553ec52372bc671254b00f6dd8b24cf6d25a965b742968e5013421b71434ec62fbbdcfd86f85db4a4fe1997379f21a89b7b1aa5cdbc13cc27be299d4e9488e938ce7d12a2b5c443047d3388748a3b955e31713ee3acf9a2767acadea54f1f7a728d0f3cf730be1e0a0ec7c6ae8a61fa4a8a3d1560f97ab882a23d20e6ea7beca62d91d00b825a2929bc036fc4b57bdfca3a6cbfc02ab7845a55128f27fe1c0ff385b5c03fd42aff8f8e88480c8c4f4c9123219abce84cce7c936b0016fa8116ba4e6268721e5dfd9118ccff",
+          "padding" : "30463012498177300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "33b201d3b0f66d29e5fac85bcb1430c570a7563d39d591dc8bf7cba5566a6d7106d52a682cdb135e52080df174d476d0b733e9fd376e34581a8ff71e7de7a89c09e03f1294384f3920dd5281d139a5d939902c5d201e975e06173b06e0f02dbbc69db16963a67f6f4dae9a80fd5a4b0796f53fb6d65f39fc9cad68059783491e37928b477c0db578d10a159ab5b0156a49f301e023e85776362e1c3149cc9c5513adf9505259bf92273c8922994810bc2c247838b4672b872792c617109bf46bfc14768e0bb7db4ceefda9997b253e79472605c048cfeaa2bf743e4b10a121810c2a595f1b51780b31484c7e81b2324fc42082240e1f8869932baba91803f633b2afed7f8402fb758cdf928fb1c8f9a5421662e4e086838100ab3fabb8e833999ee40f61e9d8e7b8f02e3207930a131f4c6fa1b890b40c27e1814b5a606f3198902aeef55fd19f327841d1873c0666db2e33ba4653470215773d89ed6bdd5ac8a4889d730f3bcb7e5c57eeb0d48d3f5b620fd02f837ea32629c1b5d747f38b4c",
+          "padding" : "304530112500300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "588f82aab413ba5b03748fe9587d34b9364c41936c8511a02b6e31d72ce7b0f62844252a98b2ef2beab1806b01225c938fcd5a878778b348d45085aefa02335153bcaaebd59071d99098db83a0d603410b45e8f3b56b4900fd23e733367370be2b0adc3eaf3cb0b9a8dfd362fac10c80f059cf3fb471b908d05806ea512ee95ad61d90f0536699a70fe3016244d328ff3dacd5b773b18288648f85c6cb395736dae2b7a52c43589f9e43ccc76c61a6d1c03610249808094e0a45de1b90daa1c4c9f779bd109cf4300e4ca9263565be44e338daa9266f9366a19adab638060937b9da317170ec633b8f8f3a53e283f67ac35def4b18679e84e59f9d262743c72bc7469a10cf8b953f7c10fc62ae8e095a65964841b4f53a152e2511089c83a16960ad1f12f52cd5867775e2e80d1c30be0f7492ad98328c22c8cf5b6aa84985ea0c1e724d3a7ec551f3f5144323948bbaba8f1a360d279c5db5bf85b640ad76e731963bf9daab653af6be27e1fbde4144fc312350e521208e884dce18436bd2be",
+          "padding" : "3049300f300d060960864801650304020205000004deadbeef0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "37130972f89d2c3ee87b9504938a624485bedabc3dba04dc37efb278b9c052c80bb8e601c189ba2b16ce016fec3e4b53bf57350df00f9b52894ef2d076b1b34e43aff4d7b2d09fef66bbf73b9ffbcd98659afd4eb7b96bea4ef99a1e303ce550e2842522f512aa2c3316747b1c4a13750a0c984675746278ec157bc3a4839b4d81584d9c03d77d907f4734492f0680eefb998bc917c38934105164abb65cdaab868b3b299b36bca62ca0e5e36c7a88171f6f8dea5de32e5d127331df9a06edaeff600a4780273b58e6eebcb9d5c391f62b908dcd1399264d2bf428df9d861d5bc4955a817d1762c9c70f4558a14a97897c71079c76e737723c3443e90f44b5b5e7b41ec0e8bed64edcce80c56aa3c0a1a5205f40cd4fea68707ebde9e961eefb0ed47a5ab1e21fd7954da403fe6e71369adb3ae2f2f8ab9c20a91b298209c1296af302091ceaba1373b142a22fc323f588757524884c5c3267e1c2f59ed4a01d0964298147f73b7cebdda37edf4643dce2f5b55f14e2c418621419fbe4c16320",
+          "padding" : "30463012260e498177060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "503bbf0800d6a11442e561278589ea651334def227b19cd636292a6c627d692c52a36a1c526f5810e296831e4c04246cd9d5122e47940a6af708c2e36d7403c5c2b4aff9793daf4ddc6ca12239660477feed36a3cce855c37b46b1c18659cb0f39df01a32ab7f7c4b0a8a2d1f5d2c9bae738a5cf3e1c9399f4e4d9008e87cb143930cf229dfd0f6198787f9cdc80e02d68f34ef7e9e5936aea035f1c3ae67e11f941f70371670039b5a3da37df56ef87e25a3838ad29e9919f1efb2da434628e80c5f95d5c39e781c3bd4063834aa1ee99c13d09927459cab25cd5020a304d0b3364e9848ba5ce852a841029d42ff4d64208a8a3b65b81ce86f3ad60be21d66c75121d51471a4271e34637cbb2a25e13221a310c376465e6dadcce806429f36564d1b86d6c5cde5611e9257a9ee98c6ec54f09d11e16562cd3dd7316f4e13124e3757d45dafa902a01bf04f9303cb9cf86f23517ede1350832c3768bb94232fd93b5c8c38c4bc61c0ddaaa24c3568c352964a6545c6614d0ffcef6faf658fd0c",
+          "padding" : "30453011260d2500060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "07585dd3e14468f327f3da7d401e5ad2fed4bc17d3abaed7a88194f3e9a8f3f95e49852baffe3e8f65192d4d946fced70ca2bfaec7e50469678251e08480f32856e60a46bc0bcc974ce01251c555a7553d9f83a3b19cf94bbd7d9ff39fae54bb4fe552adc92c47141aad66fcb0e65ea290022290f8d7944d54c63502c088a0c97acca122cde48305585f162478d44f42ab093f38280d62d29eddfda75c94d1ead34f240e1e2f3cbb747449518ef6d2338d2f65d95df4753652f1ee2cc55ae10cffd2646ab823cd583a7964e1bf5f9830a3b02abf00d314343154823e536d617774ec605db2cccaacde5fb9bbc3d68abef54c6a95a33fbdcd76b5b43638cb2e30cc2131d1fbd5d69461469d33697c034e1795e6eed75fde1b20f7265dccd4dc7ba90df3fed735660cf84142040ceb2887b662aa260e287fbc968d348858c23fa8908c6cb049906ac9065fcf3a755f905e91f2dd08d5af033084c73f705bd0e46fc864c16da6a8746c75e2a53d96830e8861a975458233dae0eaf43084b6da5205",
+          "padding" : "30493015260b06096086480165030402020004deadbeef05000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "31710db409943c4cdef364b0e8f51267d701170ec680130f959713b7d148656733e4276656ff870a9280b594f3ee50e45eef2a023b3ff2d75373000a4ac77daa789cfc438167d17d9007ed6c67ff3fa047f165a561982ef0924bdc2131a84995e9d039935ee53fe58fe226ca21f6f51e62d01e257165a647c475a069db568f8aebc164f87f97036e2d5925dc763a20e4cb3bde4e8af2cf411a9d4ef5d716c4ae2077c3038ac6d59bee603266b877fc7011d3a95535f0c2691687e62f0d82587d8abfda276294685a583bb98895ca62c59be501ab11c914361fc538ea24333d25a30e6e57d07dad4161a459e5fa1fd2c9b08d2d288b3dc5cc44f0eccb736d4e47766df8a124959fe2827457ec8777d8f98852db813c4612afd211ddf37e6e224abed61323718153b1b18f00a046ce99d4545a575461310cec3805edcfe8e72f916d4147a8f5b27115c2585dbba558ce0282feb8c6a5b051d9639b2f21fc061d205b28ee11016aae87e42f0672f85a0fb1acb3ecdec0c271ad4ed895a4f05599d5",
+          "padding" : "304630120609608648016503040202250549817705000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "9fcc612583b8a8b1098cb09d1421c725907044804e7d05606b788abecf34e80ec77ea0eebdec6970a947fd56931812357d649dedca5111dd8e1c1ca21545c41cc8c969eab26158001957e7e7f848cb61882ff7182e30f1826600f7aa121ac139fdd4980772707fd912a008cc72c002378b22f72b38bea4fcc309bae438858c5a270a81d31633b3a149093510b0bb885407be1bfa128256faccef43b584390b8db4dadf8c3ee2332abc5c82f1a44aab8a632a13a3b047cc90f4cded328afabce21a61f9c74d3ae209e35fc8a5eacf59495ba4dcd599bc4f282e25527cc3515ca3c6925fbf3e83f8afe37b5f496cee762ff1d5ab58cb06c549a76c181a1c75b60330dac711403e40f5cb934c33d4e2a2ad1944041a2fc6bf9f06a4080f7a4d1b9aadd4579c89657bf4ec6f8cfd74a286b48675e574cc2acbf562312fc9db4561699e45741fa6227576b2fa79031a96a8e5651fdb5685878b715ba913f59abe22ece33a224794d7876b2898910e89d4ffbf2ff95385ad41db3cffcc60bce4019f62",
+          "padding" : "3045301106096086480165030402022504250005000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3bc6b4ddbc152df7fe32559a8327f5de5530046fbc14fee2ad4ff942ddd347719a830983ccdcb93f63e72849330a5cb4f1b0de74f56278ee78ba1fc1891a0f572c7694d3c30bf538deccc7c33c2dc863645927cc3dfcb3709cfedcd00454e26deab05d36a3b410df47f73c24c1e3271114b442f5497515b0b32739cf8fcff86c2ce01e0d79202ce6d36ded2047d007088e1500b1941ff72f00547e15ac52db8b03f4f90582c19fb17360a0355305507003abc367675983fbc522a1bd787b3e3cf3e44683099b7f04cfce3e5af53d87b6a9945ba970a0cd243ac4ae93edae84facab15fa3e3fe0e49a771305851c51f677002fec126ed7801c42bd4b32c4c410bf3be1ff439c6c0659a1faf8264b652f3418ac0dc6adfbf67b2c1725aa4ab3bd36f358a2249b4a1784fc965caf1f9743da75550108c1193c9b7e7650c1ba2ee0497ebc8a44283f1589bce15a5b85c87ff3eab980bbe18ed814d6ee8bb6126dc6eb4166637178836c6d2ec63aa332f6d4494855361b3d51f450452168e4b30808c",
+          "padding" : "304930150609608648016503040202250205000004deadbeef0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "64cebd7488052ce28e0a3161ac93beb58e73b9f054019095d268681a42acc2c4579cc0bd628a786b052787485243a763c1f880fc19ae41ccfd70f5e7b1b107244e878c318b1142633bb4fe109996273163c093c34e33c9db45d61a9a38dcff55c4375544018f555b4d3b65ce764c449e1056b288c5979475a6ac48a21718385d1704275dc7bd95535c0b351e60b06b6949feaf7e615a41ca111fd390fcc3dd172cd1a3642f3929a61c228f8a35aef4bd9f4fdbadcd1e61aca7c0d2f0acf4003c504d979aa065be42f769810d9bbb515e9f5ed524d388ca22e80a30085a38bfcccc7348f786b04e8d12ddadd51c1a450b11a3a5345363ca789e061068436cdd0e9aa480d1f9fc143f6bfe22a594068399746c49440e958a434e33136a4a120a314f8f617c3d0c856dc442b3ca53809fec686652becfcb803ccea9a216d5109c208c834f31529d051b4c51559ebea0b5305321895789f3d9d0c80e46ea13e5d0979487a3b75ae6d3034c424ed94a609c8eeddbf11e91d8c012459badf75bbdb3fd",
+          "padding" : "3046300d0609608648016503040202050024354981770430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "9b38a8f73ceb8ba6700fc87f64ef24e6ab775695508988b773169039dfd35171e8e11619c460f431816a75b7f69fa6938919a773b489c53cad243185cd0e09b5e89caaef999c93d0767c05adc26034da9e45ef4390861ddfae45bc41ce54a6f51759079356db05352c7f217920026f0545e872710ca24c1f7167d9d660ba1188eb42648ba07b88b5a9e7983d49819de25817b0fc8b95c6e3dd639e80dd9f5ecf303b7d9d6f3dc751246c8d9719d537a072ecb581867a7b90c92f91e5b46405040eae38696e84495b1283756e769ee5884fa58bdb2325cb4099354a59e191144810a24f7f2f29bed9277b7a03fac6b22ab9d87bab62aa076ada1bdd762e00d1fa2535ffc3e29e8b15f07c56d7e70d65fd4b8b761cf7dac6850cd25c4e8fc8209dff390186257f0e522a7c4cce9fc2a80147f2af9a99eb860073087566a698d8e74b17a9a197dec5acdfdacde6265d6443adf53aad6774d233e08145f7c9821a0a869bfae87b2e39e392c31cb47351982c1f69d54166d550d251be7e368af8f5f9",
+          "padding" : "3045300d06096086480165030402020500243425000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "640765ae60fcdc6e9b81d4846d0aa21779091e45c59e04d5627525926ed5b0a5ed16838903c23c4c53ccdd44f93ddb43ce1a82646c3014bdd5410c155fe72edad7dad7f6b172d4859ceb1774df11064fb60b6c37cadba8cd6744fd69f043fde4680521c82f78af1350ad9f2cb79d5bfd54d39e50e370d3ec2299226e4e86851dd19edd2a3ac1b6f90942219ea805fda80955923265f9abaf086a49a7a242d33fc43c3148eaace6276dc67b5ad428bd3dc5760d2fb2a33ad41fe568c09a89037ce48e91436963504b4fdf1092e3727c4eeb631d1096eec5cbe2ff502577d801e8c363b6c4c51e5c14e263e52ec937f66ca47a38e91ad2a8696cb2d4dddbb1512c6a262f80d95a3c7944a523bf66a5a0e06073b86c47f142a1f632122212b9451aba0e12c987bc5cb891b33719c1272d1c03db0294e09c0ac2cdaba018b7c36b033d96e6a95e9133341efefb4876cdb458f365fc2f8e7ff22b2ac8ee03c27232d405e65070fe0a03b2e1d6a040e78fb872c086a168b6099c26e2f32e88e2ce5875",
+          "padding" : "3049300d0609608648016503040202050024320430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "47eed8ea933bc0b1d22529cef51b0fde6c44ca18073b83165a81e417a16fc6742e886ac977a37bc6dd26c8b9a45e86c424881096d34308f3d406260da35b178619cf327d920ffc891740f14882652f922d8501d9b0c0309aef765a769d98536458e0a0e64b4a7b85d4403b66ece5a9778724c12d3d5701a73fa75e61d54ee7f2d92595a626d7041342836b264a6ebcbdbcc30c4a74dd142d5d4b76609ca20e10feb8348880f3848d72a9beeb02cbf9cc11c443ebe2a7dd786f4866e246f0b8b8de911a5581637f11498e4b05b21195520ca1bfb3b08d1ac0a5bec68d4f63c2afde1e31753f038954452145b6d27103d2f3e3852d4b1895e1c567557ec679bff15530638188853d4f0e48794544028d053294999a2068a81e408606373a8c77296a9cc3606c9b8a6fb7b598310371465668d1dd8c1eed0ce5a1b40058ef9b11a40e269168b5b403417c1e1a550dcfb466dee395d00b1e4d8eedbac1a01ee1653cd60ef96e0b31d721a9d035d63708a5a88dd311a73c07fc03b5897c694297d9e1",
+          "padding" : "3049aa00bb00cd003041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "586641b89ba4d44381eba31bd2031fb648175c94f47e7421df974b668875814978e764555f025481bc3df71b736842e13ed75667ab10eff46d60f9168fe4301b08132fbc847b9fa1b77a547b7e0740675b68e6a383b315ab11f6247f7b734be09addd1f209e80b6d98dc60d72f832a0b15a68aa05a03eab165069d6d477db4c2e752faac8c8e54a9d42bc81d22498fbf7b7b41e8c7eb24e9a64cecb444a37ba6b0bb1220220d201ebdcb2f146688d2f82dc9eef5d89cdc861d7bbaf56d296e91d8efa220484c0f54ed1818cf2b63911d5b2b21c5f9beb190c442d1737141bf2096554a289fca342513217a7219ab04b007aefdcc9a03064d01a57e2e955105aff31921fa6bcc02fae9f50fd88efc581917cc9bd7c8e90850dd2bce26ee7a2b60cf3995e71b3943f591d54b47e759ed5a452262a938b8f5b1f57b484f576b6b6c4b0777c7cd742e7561030f4e0c84ad700fcdf40543fcaa560935cf973eb26b54cda6b28e293c987349164adc847d3876a42e8b61bfd6e9fe5c22069de4a8c665",
+          "padding" : "3047aa02aabb3041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "6b873d87039fe496cd375aa3aa3901632a1efc96c527948f6d3f083ec041af9183da0fb6d0934337be26fbf947d4fd986d2d0216f02bd994a1b2b052ea00f3d762a1516efe2b0b8c171c647c12b1d0de86f249f94462bb96ac3363e3a791fe68eaf1f385e15260a391a8ba8764c411aac0f7d4f2f71a8856c04f10e5be31be758c0456a1dfa90c9f7bdb5fb03faa5bc128c81af05a56d25a2e8b0589b49823fafb775f8b846921f41f48d0cfaffc2ee5b039cb3f7f3c666bf1353ac34f77def48a33bb8eccb12b4d79bc5479836b17b47e251eb3d8f73eab0dc015d3d26bddd3f2bc1433ba3e136a98f4354dee37a11c47d14ee1c3bb45b2000d4f937282eb0d849c78ae16d5079472991791fefbe99d0aa47b2bcce6ed14d336acbd461dd39a3cd2733352cbf120547b9fdca8418c3ad8a309989c3fa506d486d2dd076251065fd54876268c851d41cd72f28b1446c11b34043d5fe1478a63884a0b013c51c53adfa4a274a162c50d33d33bd58bb99cc978f69e0476a51577fd69678ea209d5",
+          "padding" : "30493015aa00bb00cd00300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "7731633ff4bbbfbb7f02024abb12c43197d6992c1c1202ed39d755177524c529fde5d9512a49c150e024d1ec334587ef004caa06381ab7d1bd4015c477da5e07098162cc1f756d0b5fe65d6b80343bfb8d710afa69dfb136971b09a7ccee6443001b834bbd94cbe1c5dd94787fb385687e744b5dc99879d5ed75a8925dfdc0014a480c64d1bf3732fdb1495e1af335c1f8141d03f9dd859a455607ae691a0a9f3232191b7a369c1b5fe634dcda20296c0029931d865004eab1a39bd931a54c934dc4b6c3874362b00bbff2e6b30c5c513e8c20ed63b9e96606994f5219f46ca9af1ee30e9b5c2b4ed74b20b926ca84427fd910ffa0c5368b3bf9a4a4c278b9e335e8c43d1a181af5cd928aca703afc24cee23fd87dc787d73dfee0e80765ec6faa7958ff3b35e70f1fa1812d99c1f23ced1a8c2403eca1e960f317bcb7bbdf8752be3a758df32c403213bd70ed4998174439bcaae4766260f1bbff2af9617af8419a9598738599289b7ce2f5a27c57b5f6a40a29956aae95b5bb45ba08caffe0",
+          "padding" : "30473013aa02aabb300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "73f9a2aca0b9fdcbf0a69a3e6c2e802e0fc6b0a32494989e7d1ebdbde6254317edb92a7c975da8e76a6cf4005de7f572eafd48eccfd8109b44ccc5899695517c274f982f1d41160b18caf2a6767ea9e3ccedf1373f37d2256f682ef8900a6df21cd5aab8de2f9fc9db9681246f34019c0a6b98292215156e685b0a65d2d1bc8555b8a27d31209a26236068bb29b7241b660e3f679daf6b25bf98c9746151e13339a20e5d1dbc11b7007971843fdbba12b9fb4c6423b0dd09265f6da03ad01197bb50937e709c21b4a751b60ce3bb5cdf4537b5127f8cf0ac7e6d3007b5f5a96e482f7d7000c83284998656bdb17b63b29f30676c7dbac14d47b507bc3fe7436f52a6f28f468e8c1ec1a751e7e9b9415fc8a2582da5d2c37294b59559860e69afb59ec0868d33f4632ba7cfd32b5bf66761b2abe326c87ac9543d5b63ac081ae92245a840c0f2e474cfb0c5bb6416b288f65ab5c50ec3a49ff1dcb66f68221c4101698757e7cd7e28c017e71896fc73b67a6e5656a2354ccb1f35fc99b8f6636b",
+          "padding" : "304930152611aa00bb00cd00060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "4469822cdb3c1fe53433001d64fb72128c477e7376e1e6baaa324fe275fd7c8bbedd186b57cc4e8f48d7453086e911c284a69623100524ad3d2104a25fe226845a45e5b9a0c986e443d89cc2458cacd9de6598087e07cd2bce47d8aaf4ff656ba439d7a680da2fe3464300a6eeeca1b9a8dfb6ff55408690e06b5a148485f50ecc1b2eb629c22831e19ccb6c074d78cab3d073ef4823d9a2ac492ed05af14ec9466f58ebc4be5e43769a6118ed2922c45c17b92df13fe872f046061d0a841f8baff6186fb9500fb7663c1597e5345b857ca8e9218cc1fc6ef40ee2a0297c5dd757a9967bbf2ed97dad0611aa3f88006b4c26323730b258bcb5cc401ac8ae52c304d340d6e32944aa65a4714655d930c038a03ef94eda4aeed3d5485c4059c014ef90029d1674edb6805a20c8fb68e55aacea705d06d8d88aa747d8e3d14b9ce72c00e760fda4f5f34640a43f331d0366ad61364a98c1a897d32c087ae038aee593bc3ba74f474e06af53109b2ed750c9049782af970e77f0478174b6c8e7e259",
+          "padding" : "30473013260faa02aabb060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "04416f1cc2f441bdc8f3b4ac16e1ca9fd8d36776bca1d5c8981123e0e76d6a6bb3db4592935ad661755931c23f6330411d592c51054aa898862adcae51ed87499acec4ab1a98f3d37c456c8eb02f8847c25cf31b68b135c33d051440d405e76df02bfdf20539f29134ea09659eba51971fd3d5e0b602592c37e4250e0a7633ce07233f3e2dba369e1ca82d001c309b641d6307f696bdf685666581c1ca92f416471f029d46744c2ddccc3fc7585600cb819a7386fe23b6a18b77dd59c7c2335594c8b2b0d707766658573b3bb056777f6e06c1e8feae6b83345b03db9183de96d08f085c429cfe3ba2ff6a8eb0b025bb4e316ca3985686eb8e6295b3306a62eff35f29c0324e582592b8f29f9797f5d4a26342c103f9f61968cc283210efa221c7d590a4863a84d3befc1e4c991a19d00b2a4e49241af116ffe1ae3bf7401abf0e0321307d9c3b0fbacd28c22d8ff2fb51d5f526e982b975f0ba3b8c7944f13dff530533c09c66e66fda505d90d24b77c2d302eabce7e921a80ec3c3405331f5",
+          "padding" : "3049301506096086480165030402022508aa00bb00cd0005000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "1e7c69c23f692e22292cfb817c0a0bb60bd7550b6aff981e6aeb6ef7b2338646a3a1ab91917a590fbcd0cb142f724c638c5ba91dff9ae358823a749054f147b1045c53eff9190e2f945963b6783c729d7eb0fb9a9b06d18d04fc5695501a93627eabc5d04383456469aef45b634ec3694824d69816e6653a13a0503f6489dc42210396738e4c500c841fa08a7df20eeb18be5e05f18fe23a78813f190ebb921bdccdfda37477cbfe54f574f922ad7db9f566d0fb7cb3686e335b4d70f246dae458848a41a72f7aa702f54b54dd2612b21946d63c398e7024c3a23e8010b3c22dac1d610b1ec0a76f7d9cd87369b0ac768db470ae002835cf48040e659467e340c2363d345ef4153cfaa9d5ebdb5d60be138d34fd7a36aad4ca7da5b46f7821a47114031688fa3658e08c64cb670a58c0fae36b8a19a1a3e8dbc88b5532cbbb044ef90fe24b842eacb5ef1895c1a92cf1fbb5afaa63a62010e939f72b56c6006eb977627ef62542f5085d15c53b1a235b420ce4eaa85f7fc6656d5474ff87fe99",
+          "padding" : "3047301306096086480165030402022506aa02aabb05000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "6ffa54da77609087fd60bb517346a1813954bfc9fa43d1d9543613d02eec6ea3b64bbde3fa067271e56d96a9699b00d9da06f0a71e678b54801be474c15f717fcb42c53eae17ecc84bdb07bc286c37549b06530a145aca253347d39b01953f483329ede5a309e41ae39ab881052944bce75fdaf1c54605a9bb2de43d323cf59f029dc95f2f931e8a86bac79979e5eac2b41279b06c697f81d9a56858a5999e97c228b37622ff0ff20a8a0a4ad83c0fda687ac3a88f71c1deb17bddf789e491f7ca0462693cee4a6ad0f5fe53cd51d257d10aeb66741fd5e4f306d0a886dc63a524bb4ceb1dc99b4e356dd7123c0100abd8382e659ce4bed568e122052b7c78ad4d3c7f2863b5d7fc91dd099b824df381090dd9b401494a939a1bb7a6c718a36916fa0f2f3d27a998a9324547f64e68688ba6d3b948fb1f310908eabb9385fdd7d3a9a0d57a5801863100a5a01a3cd6b09955f6fc67867a8eaec817c3ce7f892a5d6af0015abb4946d3880e9e14b550ae87e3716c9c01ceae5ec20ba252809e63",
+          "padding" : "3049300d060960864801650304020205002438aa00bb00cd000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "3290aa822208aaf760449fa0c88ee9b6135d65ab391b97354f95682052df59a4c3f2187d6e15b563db2b8ad1c48c29945603d7a7b44fefefd642f51aab0034ce6f0ff1cbdd8ced3236bcc149b84132666982d83ddd23cfb5cd21891e927a523b21ab655b8b7d041482a16e7f722246a77542543a11e5b4abfffe8080e67a6f1b4e716ca8a9acdf67d499296d7d7c2193ee7003a9e563bce01f9e363dbe33a1a8dc45cfe37e0eb454809e52f84b682a736b8fc24bbe64f3828c88379a0ed639fb2b650d38321d3db534265b3cf32f8d8475296e0ab33a01c914f294af103be99a102c16c460fd79ad8abe689903f945325f1560b252693f52eb6f6f4a09685d9579b1dc99cbc2eaaf8b039176699337d6e2e4dc2ce1d34a29f71cf01744f74c7ffd0765663bb3e9dd95860618350376d3f39c805e577d01107f06b4efd2e399b261b555789507a7e4b11f26a19bac5d2d723dcf409f9f0c44be400d250235549ebf266fd02c699d45847614848ab73f4851f3c57181392212448c022f6e0303b8",
+          "padding" : "3047300d060960864801650304020205002436aa02aabb0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "7aba2179e63901af10b592252fd681f0df0d83a6a09f727c0446a642a25c4920041395e49886c8c78ff324c3476c7cd052315b91a16d24fed9016f829ba00e0b075158edb164ee03cc691b21d18467776ce0b2353240676cbb72643801cd2c87b0d45b6516a795ac72f4dc93116a5433cc0a2dc5d08e4993eb67fb937d5febe9a7cdad58b9cb57627d9a2b038445a9c8e6f79bfaf35ee057e7c113003e9b54913e4152b1b7513feed12be9d84e87ed9a5ebc1a18e60f63241803856eaca8bf0b648d9c1732573fec56c0e9f11bf0650ab0b3773519f248150419e6184f049841cf736205cd44cb0b2bdaa0421c9287bf5b60b1a703b8519ffb408c25f3f2ff0f6665abfc5d1d5541895fe453f5c29245e7ba58bbe11bf440ec4ed7b7298a2ba12fdaaaa775c34562fb640a6a63b36c74d8fa69adce790e12c2ec4285dadd029bbabf1117b425eee862330a3d52d8a362186644b31bfba6d7d322a49014744e466911578a5cc602c0066419d418a8d057fa280e2798d5f651e4e982068105adcc",
+          "padding" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "555fc83ce658ccdcfe3751aaca06e58ca3860e2bb9d9bf9e1a6a83da94c9a83103afe196d421acabc488a0a296747d73e492cebd68d719a7c56cec53fcd1a21737adcbfddc0447c553aa5d3998bd9f58155c4857036808a9144f12d1fae029d541ec44722eb7dcfd544eb71aec72309b9671606502c183d12c452f37c906419664d2f96ecabbcf389e1ff1ddf5bc9233426e20a42188a4ee8d6f86e9085bc6c36178ec958bcaaa0ba07281be4c9c450570794104848d5b5f529492cc663b7255018e6debf6e6f5962ba6498ac2f3eb5cf5bda84e36979ef079c2bbcdb614bfb5ca9ce86a2a0449f2abc4d4c30ce432382711e621b00e85da71987e04359a879bbc2731a20268d15aabf3537bad25a2e2f0614955b6a689f6fecc1ec846466e24f33b59d3eb9da06f4e90a20c798f11d53b19255cf749a92af0e6ea078348fd5ff795c04c3a1768f8f6f9f00877424ce0887eb8572dd992e6b57e00b144f59b46ab1b364e76ad69a6ba0b3fe4a22986a185fb7ea704e613763935c6958ffea4cc",
+          "padding" : "303430810430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "44b0b41e209070c6f8a19505c7f5bd4c99d86d37de28a95edf8b430dd851eaf9d282f206d14a6a7fd29d3ca953e1a9b45a72ea871b02b2c055a1e6c845719c9530d3ff644065876340408de2aec8b0444c4f9c1115a1a8533f202f918322e01a180abd0d5f679b2b31622fb3972b480ba1aff7d01bd4ee6a44d4ae860c6f36710819f17b622c62c3557913900ea3d681c76e58ef7af7df34d498a4917ef66a6c04b4c0e09b6c70148c1dc083546969a8b4a62f8123f8ec83cb2f359e5ccc7dd4d5fff790d1940196c5495c9d3bba3bc320b14dcb7870b3b8972777eb96ef621f7c30e66225006eda4c5c438bcb996d0de3aef122a6130ed9257f3c7bdd2c048c8741f21583aa1ee0fe3f9338864a91a726988d6d0cff2b2923e8ea0d06fff6c813bb6d5202a90f287b5aa9cdccadf3135ceeb94c02146b6c6a852c67ef91dfe1c2fcb1ef08953bf911866185ff402604c976a0a8af052816a4c8570cfd3794bc273495b5b2bfa27c629084fa6bbab06ed87204a5bd22530ca947098e58738a01",
+          "padding" : "30803041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "93829d94d3153fae20e23e9c5543b64382c3b88fafefda8ecf55fa4dfa4003848bd543f49e7fbfc5ac9b76b347af44774c350776ef02ab3ad9e0f42849cd457b840e0c7b3e9ba419d3ef71961daf4bb637bf8393cd965588019e9ad73fa8c4d2478470c21e5a199196842c15891abfae4fe0296681f5ddca70838f01003ac380d5d8d6db2b5871b14bd20937bf7919dd7ff24a4e4ce14ceef989309de1c53b94ab89feaa567e140005bea8bc411bc24924c486a6819b45ca681e48148beb8997409049e3f1c09ba6fee22fdaadb25044a3bf360f0d29656ebbcddebc0f97129d02d7a155d27c077929dba148efbaec4f2cb776aa8daa14de00b3310922f668fa8881d28e6078299a40770a014157dbb74f242ff0a4dac31da3bffdf850eb7beaba2ec8116d978ffedc2330ba41e8c489e18e1702a3c3845f7a308f43033f1fc7549ddc30509f768be92540372b423a73793890d99b1eda8ca6e6cf4eba1229ed264368a7bbc4ac9412d9b07ce3ea6577e8e44fba010ac863d6d58927757badd9",
+          "padding" : "30453080300d0609608648016503040202050000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "226bb0ee3730072becec171cd12aef240c91ed58e9c2d23b325738575627d5296826403f1f789a7f9d9f285f4372ece003c3bc7e9c31c75e74192e95c1a71b1d67881a8c425b641fd510fd67e522e2588e6b7ded5a454234b8032291345199431f0c08c630e8bc524a352700f2a19d7e25f1229cf4c1e59f2a225e977497678d0594f693009ed970acef791be7181fc67a5b3817ac82448c064f2afd9654fcb8606b4a94099ef11ddbd9705622159f90d165accd894e753cfc134fdcc22004f3d6c271c44ae4958de5d3d0232c08acf03ff543368cb192326ded21b52ec0118e394921fdb335d37121d5c4a33c2370804f5795c26f7bcbb970bc4f5ec740c10f13247181d7ea339cd391318e548a73135979f07a7449acf5184126779a625540eb9220c4126a9561ca3389d5ac2378620674228c7587dc78e7aa6c9fa2ecd1e5eaa37e43a2d79073a20de7c0b21517350b4a1b459372d2fb6acb0504616da893c4a4cd8737c9c7881ed963b36e7e6e2318b9c5f18964308f8932dc7b1ac65436",
+          "padding" : "3045301126800609608648016503040202000005000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "37496eaba06154a08cecd1a768808dfa1516c02105a4317e1e941d967b7160cf9bbe7912b2046db71a0cabe8629f8ed197f17814418d62e616cb10705e662d81775208aa7c272ce40b598c9a846c698532ac967d9aeb610e0033c2ea9d3185b3a549260c1a4a0ed56b10bb7da328c68c70ea058c821e29532bfe3031258d7c61b3ead7ffe4e1c4265dd6ad337e68ec7954c329c3285c80921fe067d072bc8e821dfb6e6d1a7d4354abbaf006eff47d9ab1325a4594d077c9ff20134383c4399e9d99c71b6a00f604d0b2c116cac0fbef037dea83ecc0a3168213b8d6b50a140a55d9d2be409989f7bf29bffdfbb6ee659fe1435438d48978b83529212d706a923d4f194c52c6fe54866fbaf0e8063bc9cdcb283ba9a1269d26010d155085d3fe82734de844a8873212ddf2f5369838aaec95fc7903b788190091c45d90393d929fdfb2eb83cd7300d5f89dfc605aca329a616650760eff74cbf697f6333acff478177c8c38264b4ff0a7f335f9beac0b47d3ae42b2d8be49c0cbb75eb4e39cb3",
+          "padding" : "3045301106096086480165030402022580050000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "27c9de67db99c0490f34b5af2a0494c4888c8b02963fcf931be580faf9a01253c0da3bad70560f7b08eb3ad52989792fc0dcbe0d07ed0849f8a4bb424343997ae049a7552c3719e2f64d2c708df63ee1556b5b8c47b4109f5d534668a2e77b0437c673dae230b3b96129aaba91980f56daf496b2c64b4c11e890af9874e70c497ff2bda8bd70066423536a1044dd84f5d7f842bed546c03ec38fe20eddec53796ee8826de6db5e10dec144ea04893433b7c5387a413709676288b2219befd64bde0539ac32dcace2fff8dd5545c99ec4be8ebbd1e7520020c4c22107c39a13db2b5f692482456250b061d8d82943e0f73ccdb7728c26142540aaebdac04df32c65e6a823de3700d959ea54c5204951b9ba8908c18977b7f15bc89c9596d2eb5265ae1df05cdeca220f5d1b3936f5c346291e37a0b3c68d9867190f7484beb04c2c4c121f53fafbc567e88e99509fe11352cda2569001c8af02bd68b801e745711a3d7dc132e331b24398dbb08e1103a1a7d8b970227434eca6adb5400aa58305",
+          "padding" : "3045300d0609608648016503040202050024800430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "0fdc88f00e546f7cc63269cb15743bbfc025b9321c258df25e605a8a69a133a3a765bbeb6481de0bef05a39d071a425b0332fb06ffbc5724ffccdc3bb44e63e91752e96448f4eda2f3c5efb60a0d33602486aa34e6fb0fc92ea5d97b8840f93e688ab20f12f16b14071c0d87fbf83a5f10518ebb6da3b0a5041a6686f73a696ae6db2f1ac1321929497287aa281721f290d9d612e5d68b7ec5941f46802fa504bd810eeb3178081e0826b88177014a4f80df92a5b766d940c1ad9f3d0c79ed0587c0a97e59d0a3c2ee3cc573251c744f343638795c2181d9dce5b9c47fc1df0f784691d115639362aa49033b337aa2debc909f64dbf975a4a12f14ad52be2fdb4815b04cfbca6f47de56caca0ba3c4e7b211dfcece5a96570109b8a303786ae4b8d400a3fee11a05bc3de55256635d66cb314512331cd2c3d63a6ae7f9a0b1a9e5517265e8e536a6086c9270609afcb48459c75976063cadefe87e0bc02aa84473373ea4c369145631f510640f21c0a105e26216b06917820530100b59ca9c1f",
+          "padding" : "30803141300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "213fe8704eb681efd4bcb42bbede075c4f60f65a48eef3740abe24ca170115c0d7a653bef8d1f9be11d32623825b77aaea42595d97355b31e8a993452a16b3873e8ca426a45968d637ceaea264f3ccc2baa93bfda5745aaa03da3e2fbaa99b2b9460a413bc55d18365ceb29b3b0457bf272587c561f1ceee33cc44a968bcbb7a0ef2ef88f843d6a9414c0555c44fb4fc035f59dfd65be5ce81f5d532f817bca2294fd750ce47b656694241146ed5d82f3cadccaaaa6b0dfedf761519234f7c80bd9197a8ed4b209343fcf7765ec922637c7de6fabcd92cb2a0b4f8563f75c83fa0f6097e4794e377def3166976212a8b49fc021c0a66358e7a0c1f4158dc74247bc81ed4edd048af0c44538a9efb548010f612263f716dd6e0405cc1d1e3b9b18db849f5fd2f1c1386e687daa5b091b595861d81694af3cd62343a32ade113c935aaa57041ed137d7c677ce8ed2954eb3c55812e3a2b1948e1a435c46e0233c77d80813f23649ac1d904ea3c050252c5c62deeb462c6571efd5f08e041004197",
+          "padding" : "30453080310d0609608648016503040202050000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "012ce6406d457b7b55c0f77d140d4318abb425d13f285cb5f50f43690dd6a8afbf4b876a751fab263d0935d78f2dc01d885562050239d9cb849b497dc95a576810f930af1bcaf92ca6020de27d8cf4faf1e54dfb6a5ec666ae542a1583526b2d58c59bbbe042f3397d97021ed8fad1df1dcf7f6f9978a3f0645a02fef83edb42a7ec85beca2217c323a001e13d845332a272a5e00eed1a9b0ac29b45c5734e57c016c34e52b8695d32289b993581e4aa4c4254c6340b8311dbfd85486745c62394d929c15e990ae334175de99480ebc6b9e395842df806699ed326aab550ca47af93fa9133f4c4aba0d605e6f8ebc271f672b23c8934c15ae54d8e74a02e0be90e221dff74a9c17b3f013f8c0980b62747f120c046d69b3a43660f2a5798423e02b047795b07ed44f5d71e3bdddc2a1e7d7fec3d745b6a14092276d2253f92c48433f8f628e2cba8c626f3a4d7d51e4ff049d5e4fc3b27b8dfcfe75d38b95e5a88c2d7a0daf192688e5c0d97f795ca446f81496d29317b4dc5968548a106effe",
+          "padding" : "3045301126800709608648016503040202000005000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "4f93bd8130c780bbc695c07e7c83c7131d4ad16cbb1efb1cfffff1c934dee9b2261ce189ee19bc0b94bd22ab01a21194512ca5ed4ad50f53fb6e577560889909fb5668bb70433466542b4509510d5f7c01b31f18e233aed157011643dadb205abcb5e82b79be7d66925c15b5a6fc0ea40145eebcb0a0fdb233a3f8d56a846cad59af29026aecb8dc7e36a5e7de648801921cb0b498fd76640494f396f07ef5d1ea8eaf3bc1ea6b92e5f92b931e7bd9fcbc9b46376f06f3bfa44fc12a5a1a62e23a2ef921638653074b8ce58845e18dbb5780e51a7eaaa14acf05e92f8c5b7b2e2a0f640db1662b0b4992171a5d69d0bc0dd9a2c8a317b268ec4672f2c6a46c4300be051b424fa904b3165cadeb5a443c54513f759a0530b04b955e81d6ddbc8a972e4e2d9092eed025a6d25226f0445e693ce9c5d21f9f53b411c07d68d6614cded03b8df580ec128fb600fc66760538c55a023b2f89f59d0f56c6e716a7289f268e2794527edadab8bf359e6c00bae5f8f0ff61712fa33afdb4bc0c964054c7",
+          "padding" : "3045301106096086480165030402022580040000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "1a19d23e9e200924e751b01b520ba6321b3f2301647ea667d1adfca563334038136d2779120cdb2301df3165c508c4a64c8407cc6792e0f3332d0b4ff4b1f9c905fdee8b0c0ab6f5fb4f67d3cca6cd90a0fa0d54071efb45f6ef1f155e232a2aa67cde2d7d392e05cc5d2fb49b6ce9d628722a16d2f5aed54e50ec01cbdb75cbf0c9923954ba1d3dfba1bcfe5428345321001ef0ca32d2cf70194a752c092c5d1095f90868ddc389c28938726e1a0000b4d1d8aba7b1ed78475c486f7e1e08cad2e5cda63f25ae05380902ed81ad172c01f01538b5e1e3aca49bf3abb7e3408736036ef14a2273edeba019c20fe5c6af066810debb8b76d98283e717b91caaa5db49917880518523e1ab7272afdcaa24ae4a03019bd4d9885fe1844079c7c55a44a2f06e40d87283a5677cec08f384c47e138edf434f1c52edde198230c3b64011de7482fa1f938ff6c4e1a66fbfbf13565e876ee1563a5862ffc13a1885e20bdc3ce6e34bf8331bfe17773f331b708dce7ed74d96fcf94dac411de53220951a",
+          "padding" : "3045300d0609608648016503040202050024800530f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "04f1bd2b132945662836f27a7236f15c357db02f39db46d902c1c9378a43f9a07c01e23304710d531aeb762070d80c64720801f86f5a2354d146d9b64927f95e541a530b5d20dcf94d6fea56a9646fc610741575cc87e68f43220566003baee8c6fe0ad8cb1bd1c3257d18c39ee05bce7f30750996486ec0069127e49f6aca963bab8892932607507059c444ad917e74ef7fb55c50d6e379b698bde71d116a5bb43f039edf944479122dd660d88187418db1c09c5ebd7e6e35ee78f32f863a19fdcd6245d6d3fbf9a13d9fca7593826715555030f67fbed499b400012852db9c1f4e12e0d88e781c114551d2261b016fd5c920c89ba83f76ae89f92f7693e2e25f625168ee4a153660373d2a29ce7d38139d1f6fb31a93aa4d887801fb44d4a2f586533844bb3abb5761e68f5922ba371d2d9c6db28d36dca63f549730ba90f19eabe8d4f57014af0b0063a340785ccbff6860d1794422ca6d83857f7f3c067d26b2d24a493bd3c13ef0970872941e6ae2c3ef79f4463087dd25a9baa57e3f03",
+          "padding" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "279b3950ec796bfdd55acc8eb0d9c0ef9f209a61ac6c72a3adfc5c11264d84fdac10572e040cc7d694e50c73f8fa5e3ea6edd9b4d181fade7b5fcaf654947bf67ec5922e90f309597763a8901c3ac5ca4f474bf846d5f0887e4a069b6888f00b8ab10fd606c14d4e7f56e3184d171b8848d0c03f9cc0e33e05bbd1e0f40f15a750a802009192b9e3fdd72b1a242194e80110b5ad6f444c2022a5ca2afe8892a152c71cdecef6d33539913956c8ed85580b7bd077072bf0042f5a9ef6544781ad9d4ecdbe5c5d3220ae270826d355efcd13d4221dccb26bc458ccf8321fbc5b9997cd6dbe3b1d8712a262f9e8b15ecbcf1e2243ee3415a9eb7f6126bcf8f7c821b42f9e6a8dbcd7775fbe854b9bdc831f0b416ff0cdd9170774bf4b9b7c17002273fa72d9cae5144c348a86aec7583f81b222a1d8f17cd2e21f9aa4a29c7e8905330b63043594e62fa06f4c6708efa56ad5929eab8599505dc3daa2b55bc6a1b1ec25d6c5b01b277f98d6c7d65cd5450a68ae83ec79fcc519264eba6e69916103",
+          "padding" : "303405000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "960dda2c209de569a1740bd07a71e20476bf66eb192c6207f36a6188f4149da7d47624fb8ea0cc7eec4e9529a479f2822051551c9155670dcc3c8f889c2f3111373f562ac55131ad9e61dc4471ac96ec8f43184ada3112cb1f9e42cb734d85291b282b64c87bcdee549a3efbc79fbce13543b9b8da93883c4d997ec037ca10c5299225d8fc4e3d6e8f91015403d29ead6dab703635f7d82784f89ff5c55e873e5bc11c7579205c0ee6cd6b3cb644075c71738cb5ae2f19673c15f6d17163905df998d659492a40ebfc9b29583281705acf93eaec006f01feba6de073512af10428c2f0c53533129b37068004278503449dee77414d1c52f81f8c39b7100e86b51ca57d03566121885be87dea6b35c9dd5e165c3d10b59e3d5dce19b9c284df33a6431a87d844580b9c39d5c8c777f76ef36428ae34d019ad1b545b323c643e7c0f46529c241fb34ae7e116d62a194c18bd02c2a44229409a48cf8ef99da2bea86788d00360a3ddc3244995ef21cd7c32c6756a5d301f817c189dff3b9c47e351",
+          "padding" : "2e41300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "592b9218b580bf8a8d697769c588567157e106d59a8309fcc6efa858733e38bc3f45d6b762022c5463da73366f2f6cc333b6de44e807c2acb3c69dc3d1c739adea3fefa81ebdaa8a276a0d03f55416eb69ab32642434b55ef1854c183889d4f17c952c507308be7a8bc27af3333736b28842538e55a2cba66369a80fe12a8072ee99e398f2c3b23a4a161977c56c4947cf36d2067572373f85f0de625978700d9eef1fbdb6c79889bc2d90a5a97432da51cac57d69b142e8566584e914f74b74237f06e0b94ac00d76120818b0898800c182720bdbc11ef55e753276fbeb10a7dcff7f2115ef204a2ce606f093b924996a245f939ee2c971e02559eaba64191e25a0ff74e7a96a787c9b60021b02de75ed1ed3adcc9ea24c4ecf9ae0010a7d91db406c48992be7c6bd694e75fca42c58ed76d084e4574cd03f87cce4c399bfc0516abf7443842e53900f828ae660a527045c81da0b067a3507f74d6ff4b140ee992340d3db3eb2020f5af3ccf0455a1c54188b4edf55a14e678e7e12adf054a6",
+          "padding" : "2f41300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "82a8b93a19af90591e212559a93b99a591663f81c1d800d646db7b4a001bd569b06b05556057615629984b7f48009d955d84dfb9c0c4a7ae90c001310a0309b6f9d370add6ef038ef150cdfa6524043748d16d17866c9bd9b1eb58a70cebeb86a5a2ba7337dcbb88023becb7b526f82c5f6abfbc822c68ab0f049c54aee4c49fedcd03b10b4dc708b67ee70d476150c85f3af05f45170e9645cbbf3d5722612cb3424652a2f9ed1157ebae2ab627dc71dab539a5d3d4cfbbc7bcafbf71ac4535de96a47ea33553b76482f7bd7520f12dc9f5bc161759885a8ce244cdd01eddf328c518849c3cb5d8748dc4e9b9983b7c1fa4338c8097be273daae2b6fbd5c713930005bab58ab8c8527438ed21612f75e088bd97b5eadfaefc68a4f12a99165d7c6f61e4de6f3c22ddf84e50643ed41e99e5414c37a696c0a5fcefb3d8c03d9437402e5d6fb6b9631569dd2ced972a69e710b3b6e18419c9a4af401a242705f23d66cb61ea1e275eeaa2bf5700147142a0bf099d5ca426a7ea65399cd5bdf2a8",
+          "padding" : "3141300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "1423b1ab0964b6dd977c227648fcfc29a9c2f3c06909319b0629c6234ab9aa5cad3500b24a71405e7d8c299fa0f6d55aa709e321c712ad1eb6e32e7991f29be7dd116b0054ab4ccc29bac302b24e904c9a13a64dd95edde18edecc7fe60445595424b765cacd8d8071a01d45b6d38d5bd8321b14bcb2e9a3243815a9e6b23d24bb78c3bedf88b93af23c5b70d5ffd9d4e92578018196dc6447b1fea1a6752eb2dbe0d5b42313b7f5a3695078eb2ab251367eccb4ab64181621cadf7c92f8630a5d62500c306e2f9d213926bf75343179e2faaaadbd18c6c3e7856cbe4644337ef412b190819b33c1ec01e7ea371c0dbb03884436a45077b9e05f6d5dc260b9aae341d96820073dce8d02924c2395e0bb977f3245aa019650744f1fb16dff1986d43f99a27411013da06b425da98184ca8dd86b5ac83b8b1aaf71c0769722f1a1e8e49ee664271317c840fc8068eb5ecbffeed99199ec89a1c459aa923170b0dc0a9102a991859100a4cd3b9b7c73cf86303516379ef5221af13f3f1651b4d9a6",
+          "padding" : "3241300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "4c5409386930fa979633663e2e623dd687cfb608a3d2bd764df29540793ecc9362dbeedbf143bbdaea63ebb01ddedbba5c25c35bb55b74ce422a308f4ca7b76988eb781be4f9229bb4601800f99733098a1143e37de19fe0e4b6874c3c7e534ab1d62df42bd48bf6ce75c59400fc31c0d305c1217a3b225f0013bd46d34cba9982700fe7e1c1683c2177fa0f687b5f8d2a7283e122fb1aa0ee1bef057355a7aee117dda07ce79ea8604577473b64ad5e3ed093833fd0c7c496b67a2933edc5aaa550452bbee14d4f6c5c6e6f254faff6ab5bb96a06de99151936df691593c964d91ce1679fa3b55e26be7ea52993a25f67a4595c75c952174d1a6e79cf9f3e0625b7173481b840a8368a9bf45ea16a8f2320ae3b65dd6c654905cff5be15c390cdcad6c142e537f356ed6a5374a3e5b1d17f802f3dee2c1a9cd9230c72160ad5d9c376dfad8c5d39a52ebbbf5161b9cb1e70009a107fd214631c324148ec85ef6d438b98e3df7135ae1a7b052ab02c94a261af7155441751aef19bdd3c1c32ea",
+          "padding" : "ff41300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2aba17783c5e5ac85a1ecf3a76d74435aa6a686c2ceb34517452aa4436c7e961da24aac9e45d8c45ec7edde6e6ab05f1b5496c81ec5c0c47de5d3e490317381cc3619af4b6361c74ecfe9bf8ccb0a717cff26abfa5ec032ae46e6b358761b48993a90c56216c5b6ee91399e29bc1f5b605576f7420505b3beeb7c519a0cf5cb1e198b5de6d737093e12a826707ac009fa4585e777509f11d677f7bf069bebf0f0e555f47a1cd0baf36263bc1fc7e28dda83cbbb640573ea4b0762765180eb861ec6505317025895a89f1e1e4511ef8bcc46bf34974e083b251e2716ec298026cbaba3a2f392bc35b17c8415592c1f496844b20bc505ccdd3d4cbe2fdbc3730f3e54cff67653dc4318790208d825dc45394267e4ffc01f0e071615caae13349889b35e1a8d7dcb83b6402f69f9f1577b8687c2d4bea97240cee41b0b90349d19466fcf752032d395cca317380c6fe665595c4073951f1b0b42d8b50c91269bede7787c30b79e80cbe1740321a6abd8c0480394511e57a619ee80c132b7da6ce9a",
+          "padding" : "30412e0d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "960143a34171a7d6d303878c23aac9d7ccd8b9218a5d84edf0c0956c22d1263debdb5a08cf890e341836f94760135cce793b0b8fcf7c062ddb8661befee62cd790294e345efdffde7c26ddd9dc6d3a3adb0c6efecbfddd9e382c1d788ea9b00c5d2d0f8964c241657bd1c9f82fdf3e4b15452df6e2f7e46faeb34272573936934703dd1583efb419e6c03ff4f5d6ea1d7f1827528604729f1de24721900f3d3ec07237f4cde6846c12ce1b54a06624a3fc90254e3cf72ad26e8223159177376688d1e1e79f800b2f1de811b29c90cacbcbbae8421a34c74c4b0de29ab1e3b6f76e1188d700d8a55a490386073ad1b57898775442e53a78b1e4c9faeb9c15cfd0b735d97d459b11fd11916f6840c86a9eb446c3f4f1f41f62370a7eb9a1bbbfbc0e6098eedeaabb8bea2791a4aeba2443bde74a2bd10de0bbdcda4ffd062c2cd346376d33e540d1667f90b378ef663b5a84c927e3ee41b01aa2c133ca07cf43eccc33058cf4c0e2a66ae9129e14c57f01f254c40470dd6751304641730f9aa3d1",
+          "padding" : "30412f0d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "089a64c082a7db8c5768ca9daa426c446cb5015da417f98de000b4112e0b71a4641071759e96f1a0cf35d60d0c5e7a6190f288233acf9637c0dbf95da1b9a0fc9a6b7d602cb60e82fb03f67e8114d1d596ce637d78a33e176ddcd2a1376104b3dffe09abfd71acfdda66d590c1ef862f35afdb840efb79e8b976c5459a2d8b43cbed8262efd19d2e287a14bdfc5a28a221e94056eaf1b7e1ce382046723d08c4cb761f4ecab57ebe3e24ea1f8d099f67e5a3d57369520e2b1ba993ebe3bc0ec28e68b7d15694b5454953cb5aaf99c835a01a0c5307bb57fb95a2938c54fbc3e7f8ec687f049744fc5f9022e9a93f80f0be2eede75fb7a62d9440df8b5b803e94c9bda66d0a44d7c832fddfb41158128c001c37db31248d6dae5393599ac5297eb13f63ee10ca6e575294589f805c5eadfe16e5da1da78806016c11534ce510a8f7b76c0eb98bb87b90f5ad94e4a9b452e092d9491a0714fa02711fc7b6740d4d7fd49e51dfac1095d300736696d462bc0d796f6d0a837cd7e515e0c631781297",
+          "padding" : "3041310d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "519a4136764dd2a4d09b18e665b233a48a2aa306abb87fb5df1c6020e3cfe8cd85782b9244bbcd436a05eb9f1652fca28b1c8838625b978b6b22e1b86119ce80dec263bada9bd56dd9b7d7227b88511ad83042ba30f1be7159b157ec95b01531bbefbc6c392406ca6b6ea79480072443d921d71dd5e1d583cb86763efeede98d4a46eab1418c64ef929e37b410003bcfae882d66a6e97db80844747bc632cbcb0d38d2a6970b6272db4141cb8c8ebe3236e947848b276530cd76a56ae44279311ae2c0fac018e2b2d930c563068ab154e90f438899510b98d17a256b0411aec17352b137437176c7331b0b315a7eb764fbb7ccf7614b4185907d24063d1fdce8936c1a1ac13101ff7144280784b361eabbcc37f69252010c5c6310f70cde6e3ea89bcb4d7fd0e79018414e5fd3aa00f2c8e6e9febbbc4c02a0c6d794ba6f15038a66771cae6dc876add5dd2338b806d82a18d9ac1f6ae57c5b748ec3111fb56d6cd992b4c80e128434f8b8fc9025b2a21d062dcefa75566c242118b2b0619fce",
+          "padding" : "3041320d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "08e480b9d4324d10ea855e1a0b2a4446370a7a1f3d6565697f8c5b2a5ddb360deab67b0a5c75cf9dd491fb0ba6402b702afb22ff9c4f7daf26fa413323259e15f392393c24fbd2fb9f3008e64a775838d6ff66c68dbce260ee2d0b78b29a0da9d0d6d547193c88c6b04c6059223a68e35329e585911c5a2d7bd6fc4cd89945eede5e3be3f6fd54799e217e1708745634ad06cd103f24fb2cabd07a1d66545e0f641301d8503af94e4b176908254d1fac4cfbf6c227a518f13818e22ff7d5f12f03be7531ee3060f47377f2f0db528d69e6ba436d08a4c034fb23084cf71dd819ac199a4b159aba6a3f3f74733f5e9fdfa9f5af5b7746863ba70ff63a83dd4ad80573747b70173b32d67cfe3d6c44fd3b1071175c77c0353586760c8d6d7d0cd60cca68ca049ae1321d39735be3a71e7654841191bb8953ca6f6677a7a864520402e5ecadce5f0a20f615dfca01786b01e7e81a0a3987f4d1204a8b619867546b41069195f22a9fc0659543bc705ec08e011f5852852eb0a07c670b2b638c19a8",
+          "padding" : "3041ff0d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "7c63c21d6e29a08a6f0edb1958f53b593a26124bcc2d57803bafd7a60404eed22efcda07a7bd8cba1946a488fd7078e807f68d2cf780b5c96ac7fe65c3e975b9274bb9bc1a79205d84d9cc96edad9641a58861efc058d425e07810b721c3106d055084f0711f2fdee8d1b18a8692d13583e502f74b65c909917b4684e4cc6a633e635b24c8be249716f8b86570b5ddeeb98e872c5403917b0ee18d27455ff0c5206bca624ca4b610294cbfdb438279929c4761df942f73dc1d544a7ed8bc2df10ca44d0c7802e3249127a086a209b2c5cc10bccf52a447feb24cb37c4bb332bb414e62e1acc0ba043e160bde9d8e3ad8167d89d1dceed4156fc0c0093f06f4c7f782a78f58328b2f86e8e04ffa94f9fcd90757fca13782bd08a6d3cde56476cd3ca431169534fd855fd9553455385abbd5559a47c1e4c86acf455ca21756a4a5310fef5e2cceff9fd637c0f03bf409788073285c8c0f56acd4f1635b0e21b84e32ba7abf95d3296d52bcbaee4ef4a43437227ebc694d462ca06eb886e7251893",
+          "padding" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "03ed6a107120a2655098e12efaf80bbabb69ecb43632a42fbabe0bfc44d1f0f35b7058da628909fd2427781e470eb1b14c94355fda9bf5bfb47671706a41e5174c6547a266e7741f1ab9618035f3ca8f5e1af4abe191c0b62b47d09cbbfb25a1bfff54dc369096d3602cac21cf42fe206dddf762798621ce14c855b3b2f74f38b2e6801e20ed5b53ee90eadd6f9efc6a087265ce9065a6f525e4508a70322752409a0e5ddac1ccc105150b92e011b832f6c8de408ef1957c1d9621961dd01b4a425ae7244cfc6ed611966d10fff9d2598494bee39ac7020f45785a64be36094af7f26fc93d8ab3f79a83f1cf5ec0e3e9725d2c1059414af44917e19e33416e1d04a4934cb812530d2a0153b33ae02babe12f99599c52dc50801289469a5cd0b3467b988b39a7f43ee9c3ad5f903faae1ee387f7ea9482842780c61503ce50dc72e20300597d759b7c785cda11a45508b51e661efddd4b08af26854a293150085ebc954ce7f5e32e979fbb6ff9d18c38ff6d8287636e9b7268f7ae6bb36fe9514",
+          "padding" : "303430000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "09a748174eac93823247630e59fb5a50bfe1730cb49795ab6ea39b603332419b499f2b75415c45e70464213998ef403ffe533adc65f78aa37399fb81178e56653e973f4e317e2359e6c48c90c173bbdaee564268b45eb62554e8e4bf60bef2da4e261bc1948c7da9249cf97206ab23496b5857a8b0bb09896e16c7f8f5c3d620a2bc455fa5bf600ca5bf76241a512fc3b61148d62054fbdb897035e20aa320890b57dc852fcf8e31ce6e191851c7b11ed692215eb9ce8a508033ea2b7ce08be48e28c29dceb69fbb4a2a2320cbfb914c98edc3a2c1df94cb631ede7ef6ecce1173951e1b962d3f1dfd736cb7af994c7e7856439c9efee52f791b0a49058de7fbc67b630be2341030c88046802434e2a0fcb2e2ac70d5cdbe033eef49dcb872cb839a5696e60e438b718ddf2b79b1fbb4973c35595430567426aef7a641e876d08abf61b3b9535c9c0356492b4aa27adb21364071ebf8ec5cd0dd34e46a9283e997bab627b817e84bf52b09ac08eedf20383f238a573b39ca94b42d31b0a6222a",
+          "padding" : "304530013030400d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "6e702dd62b88ab9265d4ddd71b091eea6a2825d9a64023676488c1e6f467ee9a8893063612cd38da889520941a59f3cd7133b7cb31cc410dbd109566995bbc5146f648f7a014b641d20629ae8d8c75ca4342fd12f374247cc46e154faadbd593d8f9e404adebf925b1c9b0e7f20c01a91908b835cdc2d455d82cde8bbc6cccb0ef311d76dee3c1e832d8a59efbe0367540fbf2fa21cbee2cf345fdf8b9782947436ef7d5285647b1c8c57909d3511cdfde07723eb666599cbda596b08b6164272c8ac4711238615edd19f9dea06a87467d3b8fe2f87f45e8a3a1e5d0d3e15fe0c1802754064debb772e539bb9528f4cdef77e75faebcc6938964cf45d32c7e24d9c9b699b9d927744b2e4324462c38c09ee70a587a8c26fa7fe287f2a8f552aeb5b71836c2e92b6f0cf1ae21178234b8a25ee23c65384eb332d6113a9d48fab1073162806c5671b9f2783f913bc85aad9b3a08ad960a4817e1b4c4e7c63c344b22f6db60e05c3f2c2c025561723be9f9ae007c3e8a1d6c22b0b3957af4c942ad",
+          "padding" : "30453011300106300c0960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "28d3b6aca52dac1cb97ac1893cc5940b8fad22ab50918c78500436546a1cdea65e9000aee44fddb0ac6925421de0209711a51c9c8802636f990adcd17cb1f0889a5cb09ceea430547e8a32679f97dc644874543bb45da2ce442eccdc7f73bff6b8f09d51906e2ec1eaa16c17383ca65f43a76d054f1ee65a1629b7f9d5fdc44c71671bf10ae75a22d7ba9a11acbeda960a47e5732ad838197100fb89e782940f0ebead4bf9b10b7a5d48811a3a8330363e863bc3b56f6e54b70f0fac33a88348c5c49c9359519622d6c79eb1a6433bd68a624b1757a9dca7c7be1bfacdef1f38936f2a35486cf7cee85d801089d6daffa572c25b4f5a70378970a8e4fb48840c74c1be3cbac84798bf9281e29b93a631f23742b93261c96913479598bafede637ff5f4a7761a28c70ef860a4b33abe7fdeb49e9efa9fa9dfb17702be1661789decb6e30a989e00bc6f42a901d1a4345c47ab87d8168e6cfcfb339739f7105de5f68bf011fee5c90f5fca7b2b163ac77e34995d309715e70bcd35ea557a843e27",
+          "padding" : "3040300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8dea",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "07ea7ef7fb61a021c1b5c26a1ebeb8d8fc943b4a2e91d0cbd9b023e8a786e2d521ddd43dd4e75bbf9583213405db98bc3d7aa6b1f0baea1b13f18aaa769ca4234d35fedec6b4017db591f27b9e996c21d7d510d81e3331cb76b320a1338ed2d740e2802fd4a3159e1a47eb0f2e82c442c9f138a630b507f14c277d83df4818054ec8adcfaf170adbfd560d69bb88fb9f7de2a294efb61ae18bb8159ece5da31a4d9a6094cb956d1d9e85ab13755f4e95a9a8dbe9130fe5eafe0f5832cd82b972f2f0f65c60e72e5df412b3f9280cadfd11ecbc28bb1e6655f1c12decba70cd75d90cb1ae494b416c5ad6bc83d0f9eeccd7a0a9686c28e903883e7fd1bcbe4e9dbe3ce1a3226d71dd6df459f72e8415697cb16fc3d2ffff38376a8b1b07397d2e6e2ff65ed7b2b0009faa20a5b425157c847481de2593366d7b7bded304d133fc59a7887513cf5067c1e9713366a533b2ee72324589c46ef9a05d08ca8055c47f0c12c541a854e0dddea4171e6f1f08d091fd681cf90df86c7bdea044013f0485",
+          "padding" : "30400d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "22d60fa58e7b904fc1a8e3dd73855a727153e58a798c0b566c1b72d23a4ffa29363472557b01ebdca870189c024af76aa9560f538bb32e2e76909607e23bf9450912d0cae66cd4c2b168f28b479a5a4606710ee8067462c396773b18f0e1568341728120b718ec8677902b556c89b33690252684684aec96a12e5f9beba0f8fa10fd7809c6940ba7389f152ef6cb39160157fba99acbd5e80e48e54bb5e7b7134dbceec62d73d8d1b3dd0c0a27555d49f622bbe157e3e731ff4628a988ec060271184cf8d4407f95dc5839a55297521694bfe8978cac511d4fabfb9072a79b205bfbaf3cbd1e18c1b877b2ee9dd89d126072bc1e63579d17780d8551dc463ed9ac655b849ed9630ad18cb40e54fc60e56417fa0a89ade99169571c9859dc801139b395b62fdf49ed4748c6b2e21e129c9a5bbf346fc46ff408dd7e10f7ad1abc7f374635e292994de9f3094167d34a1d104f4459b7f48cd05b7e150ad7e3bd69a7e619bb081763a4fb6f284c3d330c4df63d42e0dbf2856044ae1c17ad4e8112",
+          "padding" : "3040300c0609608648016503040202050430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "48dc5549c7d0d689396d966a08e69dd6a9ae38b32f6c726ffad684953204b9f74eb843a7abd788ca7e95acabf44e0b00e1dcfd77919c3de38a77b8f2947461a29e7038290473a95913cdf57c7bf4de826289850281433aab7c8754eeea7e0ae6152b58792d02a8b762550d2c7433d2542e4356f5b8a8db524f9a044e0261c1d2c08387b6257daa1d9974bd7cdf46eabc6eb8168a535e590fa5df0998436c08d6574bf7611443dd9d4aa48c038ad1847e9e661fada41b6a52a95264ec82bd0e497b3ff28fb2e401e7a03cb1ec823cc3ee4efceb31c09ea2dca2d20518cb8af93524ee83a6ec4090685c974f61110eadfaf4943de93ed0eda4d513cfb91f3bad5bc54a4a15742b3b5c06da7a73d43dd9eef9d4df4c2022fc62b1d93b285efbc2a823d3e15ca90ff6b00540d878143ce06f51c996d628e7a5ec185de7c5d37a9ed30a5daa7bda64057174bd1a415aa9c6800b82ed5c0892f174422c51e8592bfdb2f3ba51056012345e92e6319604ded5488636dfcea8139ad8411b13ff5bb89580",
+          "padding" : "3040300c0960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "9cc09df45e13b4d33ee31c545026be5f9a63d393a9b43da7f42722eabd1ca783cadc21e3bc1f7e9e8f70c3bb8ec4e2fefa82db9cfdc106eeb41f49207d6654ac374b07301604abfc28066fb524c97b24e64c2f62ec98307588e4de3b239130123d3f8d0a71582b123612b100be12393d878658e8e122161b1f4848ff2d3cad68edde6406fec0a60f5327120a6d9a4a13746542642d6f918a99892565b7c4ff10b2b7f2344a4506648b5ed8f0dd1ff31687ab535ea991e55f5321f376fb93925f8a0e155092427ad5eff03efb1a712e347f0afb7df9446409d443a839d5d28713cb4064c9c4ff527587d730be3f989c66084ab7270e46e38e4fd2f26686b0f9eb222391a25bb702022d3bb7d7452451efde5b8d1053662015ccbaf80afa51f075ed9fb3ad5ec4ad3ff19a976585e82d55dddf8b1989d44c21d73f1b19e6f259fcbe81807a115690bee1c6a50ae16521358d2ef8c1fbb9b9bc989ed64d9e19e7ac4de2124e3d8efaf09d70a6dfea102c7654924fb6ed944b447c65d81e4d8bbe45",
+          "padding" : "3080300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "60a14686f2e72eb198741efebb65831d2f3b7a51dffda9b39a9dcafbaf496a483e8136c20fb5cf3b9da4d71b256061cf3abf680a2e904bc40916edef0ecfc2bf6f50ab2fc9667cf307b9f236006f2983019c16c25711106ec766217745852f76b5178ea8d0c7c04550a97f38ec0feb9e43193a83c9ef3024d2b86a86142fa0f4c05449f24ce673bfc11d5e36d4d843bbaf0e36a322efadcea13a0081a8a4144ec9dcad0a90aa17cbb9c772957ab950176d1b320dd0651d3450bf3df68b6a39fa0c856109f9d42b058e0a222593e375669cabe963f1daed0fdb449d7b8bcbc2c4c70af474e6486a19ead5e8c3af3dffa613aece85d8e9ffc7e11146aef075ce0001a018f9e7859b3b9d0d5e8a77e229b892f008bba10ad0dddae63952845c0b6a4a1a296ca9e6d99605c923c5d96cd8f8976d2e3e340b637849f22013c99d5e866434189e9117031df332e853fb86174ea30380aecb8c6a11451273f19a352461393b9e941ccff8d4a080d068941984024e3f85c9656769b4d206bbd2f75dd325",
+          "padding" : "304330800609608648016503040202050000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "78d137671fb0c788b1401f11e26055c2b5672891c513713e53d17d1633235437e6205c0a42c40f78d37d940119ab028d0a67e1e61b83c97d41514c943b12c4d9f09797949c3f910e49b4a47a2d0f08996ee581233b30041dd88e599267e4f0da21303a6d0593bf7552e0288974bb198fa84d93b5c38e4ea6450b8d070e3153808ab6aa750fd02c359df30f9cf413ea59246a7e79ac78d8f89ae831b635dad8601344892cf194e6251ef72ffc813646016c25ee0d510dbae75b6a84df12879495a78a29d910e81c59b57c66e055d44720e6adf0e40324c930297ccd6a09a3c05423342c23008370826e9f55b3df4aa2f0f2aa6205d7dfe69c6b6bb70235fabb82651fee69d6b47da6bfd5b47bd4ef8fa475fd8f2202f0a5399b9441eade3a01292754e5b1b2ee88ccdb5b4c735df37632d3cadd6aced32c9657d2c5af50a605a04d4315aba0f7f55b361ac82548b51dd1103e6f9eb423489dbea07ba46ebd27773ef32317e6df26ad95be3e200f4d55e1b7a1c78939b3936053a94f56368e606d",
+          "padding" : "3080300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "390a771c1be9f6d6f4a2682209f9dfe2f565cc191484ff3a178e32272db6863681311a7b406472bb476c1beb597c8f0e9921aa45cd4a8a01e2143ee86a32f71acc84cfc213a1757acd21d81862115400c5cd1408ba65a4f126734efa77be071404a611ed75f08ae28045e014c02c2c79c59c736fca3ec865943d46ec2a6148be8924e4942b79c68e408c60b57c0aaadb234d2bb6eae34f57257a426bdc5aa665230eec4c9aea2af275f0ba15f76655dfbe4e915191c8b804b392f5a9d04efb1a3f4c870850d65244dc9e431249aa906d206f1497b0a1d6deb4d691b61ab9a1e61f72a924cefcd0f6fb566f77a69067b1f6baaf23d1d7ec7c134b9959bf78ff79eb750be286a3f03b769c199ad49e769e913db72317f12f12aa340265060218f0cb28de4be5550dc56151a628061f50599094ea68177d5a9d5a97ccb3a69c53fe5ea36af5974c57dc95b6ef3b067c204eb98249e6a213300e3f28ff7eafa1a1a61ab95bca729d17f849d1fd2857ed00777f7cac3b05ff98e7e75fdcb3a13ace16",
+          "padding" : "3042308006096086480165030402020500000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "7fc48d42f239de51b276d1aca92ff54dfe57a3948992f676c2036df0aac90df4f25e47c713c552f104839452b5c38a0529fdc2b21dcacca0470c82c7a42c80837e293ce4afd3c1ec3e086b961db8209d073c7851eb1345d6f6f372dd358795f0c02761a26df1d0a84901a8ca63e1a705e841a81e849032f8fefb0e3943c45b08e4789841f9e39737f86b9ed88339864da9922e05202cc1f73fc321aa317ad027ad5533fe586b46f92b56e7a32daeed3bd5e56765750c7ff84459c0c0d5fb1d17f0a0b9782b203b5519aad78a872a80bd7b0aefbbcb8b8d1c5e93e7f28506caa8267a575f064f4e6d4df3965760829266d225e1343552fa657850871afef79d2fb25bbad1c84a47a62e2be3d5826a49ab476f386785642ad1186894cc542fb91308a64d1000678a9864578398f02b84ed1f0027c4ee28a5ca5fc97d5e2b27107f6d3a9a68e6d5eebaf6194d22edbbde652b496fc4fdcd65bbc10c292df7c3e8a1df8c6ccb2f70b4e679a820dd250692926adfbff5d127f29a0465bd8c8719a7ae",
+          "padding" : "3080300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace05000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "1950963873afaef51578241b79a6035b4b5b51d950c550aa00957e8eff6ec72e8e7c5c9439eb531f2f050c3e3638e946bc7231b10ea14e47bff11247bb83d984c56d9aee11ffb0772ca915cf80b9e6f5d7768fca787e5051c315007de4cf8c0b697a44a955de4f56999861a3d8a01c897d212ef32c7f79fd986f8ed09955617a3f5bdcc0ae016a414cee5a4df402965e9cd46884449237ddd304e90f7c6856d48ca7c7c9d1a0cf4d2f21ccddba6e7153ddf65de5230a0b21562a9569bd643fb926f14f0d26a8e14ac3df3a2051711307b7dd260e54d1f89c26b02f0f1cd378a09b2116d308979c997e42fbde1facbeb69f0c788e39d09b8f8797bb65f9f2a4c73dd95d028059bbb6807fe7f1a710b453ed16bfd9548fca623fe650da8a701c92579e4a82361b42ed3a22c60276547c7843813f99848dc60aa3178f4c01f8763b0b5d3dd6843213b5dcfaf73a64c5628a3553eaa1f955ee97b8e7a837d69413de9f61f89c2b8efe6b9b6c7fef421a249f4a8be71c2a9cf900e21219080b2651c5",
+          "padding" : "3045308006096086480165030402020500050000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "7795eee4bdd138a4baeb5159c60b56caf396313af6a46ba5375b8dbb88e8bf37935185de5c8ea773b6ab2f6f7872538b6b0ddf35ddaa06afe519ca5c8110985c710b8e8ae876753bc9653764a810bebd29524c362844f106e3489722756af1164fd8cdd96069139a779aab6ae283a95a17da7c79aa43ac43e2512f9eeea845b99f4d284b46aea6596e43f3dc3d1581d9f9943eab06c2ad8aa506ba1c778a1128a1adfcb97372647bae1cf12357fe0e44c307e97374d2167bc864def4ec7a24d35fdb4542c6f3d330c2a630a6f300a1e571cdc4eb76b13e0c5de6b06e2099dadc5f5e8a23958492634cc1cdad8b52629415d779d60b76299e45223a40728f375382492ca0abf45ab23b5fd9f5a45c5e71e1380b47ba32a60b0ab7568c651e6e997e7e8ad401510d30bb32427f9a2a43ce9f58fd1687d86c171910aeab8be986999ab7391e854e2f6e8a815def90eec3bcd2d800deaa63c6dff88aa52c1da9698fd8f1b16a705f4b3de7dd0b228eff75c5f48d3408170d39626c7e9d3ebe437bc0",
+          "padding" : "3080300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "23887a22776bba317c2488243d77916cf706275e3b8ecbba526c0164a11e7b5369b491bbd8e4b413567289c386b922fc111f149c5c1168d49e1255e8d18f28b173acf1b0f0ade32801d0c95627ebf063626bfcbe3ec117c40331ed2757a2cb2b6cf99e0059260cb97627203b7e69dffcfad099ef43728f6311240aa1edd5d4055108098108a23d3c4ae74ae3b6bffc4f97aaa50a41a3d5b22ebe767fe0e1749a3cdbe3ff40e982d9d34878160102afc14a10a3921dea6b89dd813dfd6802f26eb76f223186fc3454b599b2f4528d676efd18b7b28e25b5d9040fb8ef0af2c36491478b10bca1a16741e6276fe2482e63e3b5df6a38a774cf0e2469a5f3d6c63f3a68b562bd63c791a711e1d9379cc919ddf8590310b04a99d8af9508f0a66738fe2d0519ce2a58bdce05e8691afb095c4c60bbe0ff18f2c732e91190b3dbcbd54c5337b12144d98aa918b463c3b3a961121218b70cd032272b0bbb1c545bf7a7b9feaa6eb77d179c13541860a9c78bb7d763227f5a14533fa8434c63e5e05caa",
+          "padding" : "30473080060960864801650304020205000608112200000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 145,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "01d1a157da33355d97b6f363f2cea4f98b31ec1adfc2d4523b40d8fa293f2ed93ea5784a6d133a4d88584ee57d2510162fa16c069961ea904b32446fc1a46692657e0fdc2ee070195ac398359ffd9d338c40d727524176714f550d95f0e6e988a9bb8460d569eafa252ea35c398feb120cb068c9c8b9ce892110a1a4672bdfe4166bbafe667200f5de03493e74e8960b9afa800fe5b3b1a3b8ec857be750d7aac89ca95c03744d3e67ea599e08cae7facfff1eb316d0ed2664c1f15c3559f3a7000eaf89c9d12ab2c4cd212be64a86e80ccab6b23c4ecf2eff3efb84d84bc20bb371717bf1ba83bdd4346c332212f31e82c9f9d89b7b5d44f3628504614fa0b78ed4db11e3fac5041521e8e9e4da9f4a768843e1dafe6e4669f2f6539e947efe24de701c425e1a63f6aafdea19df24c37c23abb2089c0a499a9ddc2f16e4e92de19831db2988b1e53b711bcfbdb3519352a7bf3dd556735f83ef9f438c7d92fc2a561354b19cd028c9b9e92ae420372c4676b7d681a4a1ceadfc11444dbfbba0",
+          "padding" : "3080300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 146,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "0ff8a7a6f38dc29d0ab58605dc1172c32e052e26957b7d3532f7087352b21ae4917824218d79d7c2efefd18284d82b8ae18974949c627cd5d7f75870ff94ecc4b4746b23d8499807286d20fd53215fb33deaa2367d818514744c3aaa877365d23aaac52890a6a14b2737f906997d5bea4ad2c0e6ffe95f28494760dfbe0d21e392a357fac9ba126af9dc1b079757aeadad0631738ac38734064d22ef3f52126f666c10ed05d2b5db78f6725f5de1a7f357437f3208ef4f8426c2824309a6e0e7e82a264da5782151646e711e4968886c4662f87c357bb9311155dc2ccba00642c862120de0c79024a2855dfd97509b15159a2e4eec467b7ac2778fc35d2e941cf3c5d46a931c23752fa69344b6ecf183693806b85f48992e7d1f208be3119a37dc9eecf131fac71f9e55b6a5f5a21d62a7c2422e11b2c5002ef953a6f34e1c1391162e50099865fb24b6297ed528cfe1949999e48b28d0e927f03ac8c256f9711aadfd0d97e98acd12e9c7a2331ff060128a93508d13b019b1219df4f2cf5465",
+          "padding" : "30473080060960864801650304020205000000fe02beef0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 147,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "404a71bbc91ced5b6079d94ca7a0e4c601c3b12c7c1e89c0bce718ab0899cd25a1c3399858480cdd0774a1d24ab72141f5072f6fc85202ea6c45fdedb196133560ec9de18964e0e16cc49959c290b69e5b80f7d0cea34075ab24220f12a324fab92ede089f645cf4c30c18275c3d5224af53e3703ff7b6a8413aaeb41a1e39e29d41986698a7aa7793a40f3f7f389e33860c7d97fd1f158a8a0effc48d08ca9d8c54fd4ec80d4a210e2eb5d09c9afae6fb5788cab46c8251e42285879a872f1b48b847172234e79120047ead865abaf31682c1a2d104f40a2cbcb329404f9502ed7e9f9ba7e1eda6b94a36a8b28ffd4a2b8730b86f9013b5369063615671a58ec601bcc9703f3df6d0427522aff488e57d23a90daf79b894babee8a73e2c18b55a3d5c8bb16ae47eccedf1aef80dc1b84dd9c25c2af6bd39dabd0ddf396c44c22cb15641dd9cc409b1538d6728111b2101f99647e69b9228f522aad40e3f9812f9cc4f506beb5b666242466dda4e7e8e90a4c9d1394df23b93e74eca2393a42a",
+          "padding" : "3080300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 148,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "64f873578fbdfb0543e7412d585ec60f95919216529d93ce7a16afcdfa577bd2f1aa6eb660a5f2ab3b79827de197177a461e6afcc444909d955f30e6524e4fa5c9a5962c7a824a8938543c397c2556471f6c0a030fb79f0cf147ee29532aaad54c67aeeaa8e6db4bdaa869711fe9f02143f9b8532c99e58c3a6629c5e17b9ae02b18695fb1c4c9e61cfac678c75fa27a744a8126e86e0d1d420c3a125f3a705bfe6a7bff256747bcf047cab3842cda6efba927a687d7d9641b2e8cd53404b8510b273717dc3466476888337c37c427f977db09848b8d1faaaa7c163b8ff4608ff90e8d8676703ebba1cefca44c25c732654ea6d45ec0cc58bd00214a217c055aeac7f2dcef5dcadb314454a2e1e5724a1d7621f07c2a77b08d540b74e363244d879bcc1584d0b179ae1144c1e3d8f9769230b936bda8d38be450a223a19d780ec93f5fe678e8d9e6d1d81a4920320f8733b37cdd04766c1adab1feff63136578ac1053adbaa1aaeffd2559d0269e7dc01adff4eb8d8c9902bc42549ad7675f14",
+          "padding" : "30453080060960864801650304020205000002beef0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 149,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "00f67052a70789e75039f18cc6aaaf9b1db8f77e5c2e1c496d2274b5c1d5ca097ff6bf9ec8d8ae5bba13bf2c12098afca25bcf2c26eb5716ece3286c6a7d64f56a473e3116c4e6885fef7ed2685760fc8864613b635fad956b65100bed60477575e5e7bba50bc26e623f4370068870843da5925f7f123403d38d4cb30457e14c3eed2a0268bb9b97d377fa2e47fd5238ac643cf22793b3fce62da501fc0c287e5ae960b78f7acae20ce81866b9b703f85d2c9ae2057cdd2077959356e51903a03fe2757eecf47acd33ac4992522ddda22c8de751ae373a5970a466d8c80c68d435856cac74d2a85c6c0f8474f6a1b89139e15ed9ec8689b1cbe4b97f7eb9ad978d4992bb38e2ba57fa4890166ab792cece41284f97cbd6e892b32d49ed63b0fbab25670c27399627911751427faa6e5a0a475adbc01192be2fe2eb2d323d25ea5210256247f8186db87314bd484dfaeced367256d0807f8e981caf86d42b3bb13639598001d0e57baebf222fccbc5ecebf35bba31238991ac68edeb4e70681f0",
+          "padding" : "30433000300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 150,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "42bf86f17a82ea6cab7eb84215779691819019ed827c485faa11855947183a49f52fb0f6c591de616d2ec5de5480a8017fb1bc3f785ec5e5648c5db9101b087a31b3fd7d3155aad77b69ae3dcfcdd6e32031f670143436bff324566f727a9408bab195a0ab61e79e884dc2fa66b00da52c0c683f1e9fb16016439f6e90c7c3efed53dce7eee9dbf05287c92b23d3d970b745a34b801dfdf9e846da2b4afc086c58daf3eb1132833a9799216da6ce730b94ad7e01ebeeee17794e295f9ade0a7ed8b1b597023e95d67e238e978eff2940c0829e7cf0c1ea885b17803b3730c226b97ea1ab161e862c0183789a729c31232b596afcd9b192d69a429ed2371fddf2bcad11973bd27b2f6cf355f8beb3dca268852930e7c8b194bc999b92ec059e7122bf05b849c0647c399daedaf79998881da3b86a3a5ec08d7ec47ad37012d1a87e6aa4477009ef91176aa61f73dcc040e1063b2003fa2b84635e6b4a206ba4721d0b7882a1a3e360de362f1b01db6afec1cd01424013f66faf2c503eb84b3929",
+          "padding" : "3043300f3000060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 151,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "8bacaebd990eccd128ea06c8e135e50d3f9b00c4b31a58f960458c9256031c832c501cda67ae4f1aad98cb1103d145caad9121113a1a365ac19f4135341763155cb448bed3cbc3185fc8ca63d2bc8b6f0784b37a6df4486bed7978b490fe36aa4d72738e3337e4827806c5970ffc4313966e5246e05804951868fa45d4d417438fd8ea8cb57f4a75717a3012900b19f261d8aad8d48b1e4132604a3273e17fe3bfca080083509b90315013d677e2932e029ba89e9a8e2c3be96dde760f9d3ed422c11bf8d6c9f5c4aac79ca910c0f06a0b0d757f6233ea821c1e2c123c82d32e9638dc6c84cb85dc94ca83026af301d0390d1d3186422ed8a544b675b5267369e4a276743fb88d926b9ccade5ab4d31a7ecfa23fb271f47e14ffeb795fe65adbabd7bcb9fd606003bb8b0cc818162937b36eebe1da0685907cec64e6ea0cb71e01001bb99d19dd205bb264199ad87a07ec20912770c0b6107ee73b094607d31558c5b1c31a1a8c79d22e5c77ae34da98e2a14d3365b7eee4d7789781c8515797",
+          "padding" : "3043300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 152,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "62aa9127d8f3d53285814d9b3e66fe3f75644ad1ca071a6a895ecd148d7fb7df9605ad182fbbced4f9e078563f909398b4324d4d192d2f7abb828445aed783d4c9c76a82ead7fedf109310a6d65852aaeeff87e66303354478085474f60873f0c677b1ad9138dee0de2589235a121b6bbefd6b7d8ebd3d296c2ca091c3445b346ac39f52addf12489955fc4ff0ad218f5f5db5ab808587fc42bbb2052f9782001f828b8294ba1ebf4c6a67ebaaebeef386b56e23555df9231cc22b5a49ecdee35649714040715387f1313b7d8e2ce6e60d20b4aa394d180ea7dc1c70a71e738ce06048ed9f1f6ea1c262c3f77f613968bd86490bc91c43f7e9302a2c9c3f934de2f368d516d0693910b420a9f32689852cb6a3184fe815ed00048e2ca87cf9b4ee53c178cff7bf3398dcd444136a55b6753e0af951cc8e7c53712dd9814d67ed1ef1828b3d827eaf53da05529bdd2d0d24dc1ad64be7bd689f3aeaedfe31a8ef74c46453953b1f1f3466020dff6c690d3e06d5ed9f51c3f28fd3239d1634b93d",
+          "padding" : "3043300f0609608648016503040202050030000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 153,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "772227d41321eda0b8e0625f87cb555befb7a6969df63d03924108c5bd89974bff3c69d8dc963f315f6911cc49d76b2f575bc15ccd6682929661b659b2436b3945d158f2a95721ec1eb8ea4038f5af4cf85266a987b77d318b6c1631999574bfcbc28280dc0b656b33467eeddf75c57129657ee5b77d671118d4b57a55c468bcd91a0f71799433beb7afb8558ac0e70ff91ed48564d93aa55ac79b35c468af57cb64ddd62a4ad56c29f74bbe829b586ccb9bf1b0ac56fb9761b278d1546d2d9d8c8c54822f71ca47929ef6d988895527f6a364bfbd0587f24b8bd1790fdca3eff36339979165a5948ef17125ac8e8d3f3e2aab868013569b57417a53303d5acffbd11e65e5638fc4f9d9b23c16779e82ab38c353ab282eb8035fd1712e15f9f441be8773251e53629fbe9a4d8eaba7607b0d4263df29e425b47345ddbab4da5cd6b66a616729c967c6f28a29e8a8057d7c2bec54d854c8935437ba2205c8a615501d0938a18d10f3ad9ae3f298840eaf87b41e42ad811eb8ba48d915962ff5ee",
+          "padding" : "30433041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 154,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "2ceafd49de62fcfd29d10308a37e84e7b88d990ddfd5787d4d4d945c4309febac385a13c285555161bc14f83ff5ff326da0b6d6278bda7bda7bcb7acd7178f8d71e0c297eb3c98e80b97ec6eea564cf64933ea75d3458fcc4d8cd56254d91efed6152953beff778032ef384925b1e45c91ab30ab6adc979e9ad02c01b1eadfc96311b4ce98745b0576e90f5cf471cf9c75cf3473ddcb0a674d0b3d03787e8446ff1702c4fa588520738cdc48fbce72cd7867ad1ff5a35615b51dd5d42cea9f721cbb12d887f1ed58ae5d3269d781f764e51c1bcd93da5ab32369afad9f6b67218f9bf8dbc0fc1374e67ec360b183594740b63d29d86340d2187c2291d280d3509ef7ccd3b2cbfd45ff6a5f67bf1f92135be0f4b7cc29400cade412e1522d81a138d5e27619993865f8c3d73fc24bc2eb7147a7906b25d8965a4480c4bb46b4c7df348fd0d83119b599619a7c4fd985aaaa1040641679a8ae69aaa2a3a315557595806de350f33dc169ff2905c1b432de34443ccfc3809ff5ec7462ac0fb2a5f2",
+          "padding" : "3043300f300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 155,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "4fc3980f88d8da1814ded92a3f4a4bd66e524e2c6dd98d80b2ae56b59b0006a332c0ebef85b7632b63ec85528aeccee7cf09016ec2465c00cf012c324d21db80be0839b87f631c051d7d152e251f6203c5e937b8f756176f2356f13e947e47619548751c4ebb96b6532f22510ee1ebf946851cd20c098504429dd7ee7472d7ad9b93d9ba415e7547773608834848bf4f80fefdfa233a95fa9a535bde32dbee28a0ce38650bf022bbdcaba39c436d7f7e2d1bc74079fca8dfb9c3affb7f58faf90837aa8d770382f270e815764b52a2eb3f9c2c315e290007df5e881b041b4bee65b6ddc7c549948734ac8e1a8d27f205a30c68b0eb36b63aaee373e0e4fe303d37988cc179ae169552af975d69cc663d82e1159fdd8b1aa14efa3cf465421401d301fec71def2fa1b1c185bb6e9217267b34dc2e13b21a5ed68640e6981820f349b7d35816a2eeaeb5881d12300e0022a15477de159ac9015012bacefe4bc1749fd96d1fb1bd2273f86e6a733688632ccee551ec71cd68f7f204554ca48d345b",
+          "padding" : "300f300d06096086480165030402020500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 156,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "9e9547adfb919109a3a7291bb041f8a431ec229a922c0cf256c16a5c422c860292ffc626ed00f09ae1faa7230f5721807c0a99134091c6ab0b726762592cd61eaa4c58ef2046912c9881119c517c84315096fa0b729ec201a804ca4c4a4b34d4768e97ff099053f6a628eeeb6f3052efb26a61e45f65ea46b6a08f446f239ece38775eddf57eff5f2cd8ffb9d4fae4348c7a4e94a08ebb9aade57cdcab2d39285cdbcf964e5c5b175ef41b4fda46b63d8a810044d93a04d344e072ff348ef8c58f77dd0b46369904f174b144ffee62ad8b1d44a67025a527a7261b78a831b3f91f399ec3dfd5bb38e599a485e9b63cda14f8ab06c1df236b210bda7382df6b1ad8904ffe44f70b893d990d321246d541b4090debe02f2969e04244144a345e4e89f1ee5a51c6a3d83a8b1866152cba055866eea6417ae60cf72b688c5e7b1a1919cd4813afded685f3c78f8edafe6bd642af232daf2e12a4097008a8e7a1aa7d3d4e5583cc922246a4fd051bda5c1e76b5f89c28abe88d606f86b9c26512a6d5",
+          "padding" : "3073300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 157,
+          "comment" : "removing oid",
+          "msg" : "313233343030",
+          "sig" : "13931038753dc1a3f632966d301340bc8d6e63038ac4e9e5bfd3a899c3faa8bc37009313f116e038e55e82087cf593a978d4f56caeb9f8e686887ae351b8c70c06525e0850ae1534fd96887fab5661bcf9ac8ad51a209832e6076ff8a1514c1d229dd77e1e7b10c44769cd3626126cb6231f4a18d9bcbf20e613ebd2b08a855a88adb61f1fc66a134f5e37fe991a1d794ecce4d745c713ee65c293643f418d35ae2335f76dc2683364674c675d93a6e09eb850a703657c0b30faf2268bec61e8cf1294696da8bdc8a13905169c2dcfbe67e3e88e025cc1096a8d02910dda6074be914a2543506aa61af23cc2ebb36af18e4fd5fb13f891ab12a76f3c274143232a8b9ae989cb06db3678a189488fea9e1f5580d35542108cb127c056e923081867d39f3e00cd17dbe18ebea1f2370e1156880eea6a9d649f06250cf60e72bc05879c61a7953c5881966c01751944716bfdf196332478f883c8c1621f9698c975b6adf3d3642cb2cbfd83ca7c8a5eccd4596e19677f42be162dd19731a1e4d6a3",
+          "padding" : "3036300205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 158,
+          "comment" : "lonely oid tag",
+          "msg" : "313233343030",
+          "sig" : "20089ce845c5a3c8a28e3901c74386f1f73babe62b639b636d6d307729dd5c92d8a73c970a880ad5ea79a4b68d0d8e9f672c5441be95f9db740101f99e5076e7572e248a93504167b0ef7c47a54ca159b13856d6648c049ff2cc132bea493ebbbfde6348706c4c2104a53e8c9098a90d59c97928cf5588c8237222470849dcdeb66ebfa6bee33733e16d50efa8f79ac4c5a6c6d1b9851782f0fe5145ba998edecf378e999e91d8d29007ac4431c62de576b953556f9bedbcc6b415b7b29fadf6524a41a4abcf01bd367793eeb841ba934c571c92c52cf76642f6f1e931a8d076540bed56ece9421dbf5f965a828db11627ec062590869d290c27020d5aaf3d626cab8700f20d672f6ca0941e059739744ed192d4dcf4e835b61c74e4537b3c3a80586c68b47dfea8ee429dc1cd4491659eaf7a87a9fde116dac9eb4254aeb265f4f0ddd33549a63ed9096d81f17792b3e4eea06db19cd87b00947ce2fa1584b89b26cc7eec9bc48b6b77c0e0d306a0bc5ac2f8823c464702d491da90fd48e7c0",
+          "padding" : "303730030605000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 159,
+          "comment" : "appending 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "4471378418fe3baf5389f910f1765862b44f4529f7fdeed9ade8f22506152e070f80ec9dc9a55547db688762874fe06be1c1145070b4e91805c23285eb5c1a2e2e0d53a3431516a051d6b880bae3dbcc6adec3934d323910eedcf1ebad0193e75ad17cc6fae778a92e5c6c3460235f1689a9d6af96471b6b4962c10db9a83e72e2614e2cbbd788735a9ed5955c5a0a8a609b5b0adc7d01e49f97bbc33a33c1a47d0fd522e1af333c7a79e4d3cb68a356afb812d44d4bd575791960e375a0ea44e65d0f5b207ecce201c6484ff06c2292bedab8d05e81fdfb14679e80ce22173e21f48aa626b7eb2b92b37df875a1431ce3b09ff97d6cdcf7558c5e745c2453dcd02b3cbdb78e8f4fd804dbdfd9cc9c24ef9334df3f965ba999e556745f717a325346f7a53e3a257972069da572d40b07528ecfb01271fa04d7ac1490ca4c6f2d4c70de47866d8d39e698fb90fab53c072928415a784f5efd2d9222494f089607dd1b61ca6edc86ad3c26b1cd831ebf0bf0c25d85d1f54ae0cff0aef177bebfe5",
+          "padding" : "3043300f060b608648016503040202000005000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 160,
+          "comment" : "prepending 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "24619e4465d1f0ef48a66a18a6c76a11fc9383be6cb9d19ec4fc0928959c6d96f9e45665949a0bdcc9a2609329185851b3a35377b84831f7b4f8f6168d77d25169ffd1f747303c93de0d939c912efc5a16439d1512def8213694c79efe59d85351e466ca148b1ce43b74692f1661e95373bb5077c6591bd0a867d317ffd5b98f2283503e4ee9ce57913adb02def14f0302389317f163301a3f1bb177bc1e91bb5d88a7d2306f54362a1a5138a9bc1653da0bb0a9c0f13c1f3affce6bb0a28e0b4287f5cff033d8055a915e39ad29cdf9d08973d81df34d5a032e53466804859176eec8a52f12134c887282955566cf590385f22d4b9178c1fd11120e8800f19c10e5b3dd432da78b317d54305f76579fd38753961fb66c61f7e81d8a369da1b1ede47bc0ddee63505c53570b2c79516319f2afa05467cc3a3939c9ed5e0ddc8290ca76be90d557553fb146d419e751a4c9631db00491bbcabedfca3605d569647f5543cb196687360927417387bc27b774b1486c7f7668c1665e76d1dbb03b19",
+          "padding" : "3043300f060b000060864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 161,
+          "comment" : "appending unused 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "0796e1ac938aa24c995a03fb2c35a39a5206140c7c2919978f7a84a1e2b5ec93efe70045e213912b6e1e77e65a62df6032925cfcf2f5cade306f4debad6c2e1c6a84a221acb86f8d10769f66cc3e1ad66bb52e9611c3d8eb50de8e21a850d394e2ec690494264269c75c65217e2df1fd4b88e13eb4747a04437434a536b96bd2dd251c49123e1341b7c7ebdf0ba3c7307270be47b0b10d6a52a834a7404ae7725cc0c7e0f7c8c10d525c642965df7b821fdc5d0f7945d94bbb2f8d4cf14f91eda9720b8f345d35a326866ea7040cc3dec32aea044646e9b52c36b8a30218d1c2f1b64ca9dd16d588b6f4a22634c551c22fde9e6c8c0e42e0a29640dd2bb85e734541a974c6f89b44b615e39741899ef9f1e4f3771830aea67de978f9386eea5520aea35dd3820bef1fc90a955edd30c8a299941c623158fed97f08f51d5354c512686778f7ccdfdc396f9de48aaf9ac894e65424e2e31ace4c5c1db28ac809ce6a3f7fff4ae55bf1b96dbc4b5da5beed795281bbd6a0ab75f6660deee3081e36",
+          "padding" : "3043300f0609608648016503040202000005000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 162,
+          "comment" : "appending null value to oid",
+          "msg" : "313233343030",
+          "sig" : "12dac1bca4777d2cb7e7f072e61e87f1a526afb4278d10f498f5a936e4386073b8e262442895c553c4453ccefda23a24a18601f765a3d7a39c5bfadadb80b631a708ba4571d19013be451832ca64952e9cd985059d55d37eab94e3c8fb1cf7565cc1be2ff6b45a7f1b1785d8a0775442b1b96ead3707f9bd712f75c8470f985773ada0433e720af3b8b7389919505fc626733fc90bdb1064cf6cc9ef41c2752c6fb6fbb44043dfc97bb3d31463ac0d8bae9e19658b723d9c74371da9dfd74cbbd7cc8041e2437aa6249651805f8cdf2af2b256142c53073e3c9ac6059b65a8ed25f00d9e31561af1bbf9d27023693803fda4f511af523416337b208430815f09b3aa78c35be8ee439343bc79186702351c9182ad1f5ecf4260e9929d0acfe883a6052397de9e49b51ba7044c751aa6e4eba622e1d9f7db431f3b7048137e17c5d6d28cf31a7995b46cdc5b454eb3593e622a54a96f2b10193ce41608dbaa7a16b7f1e96f627b0b1a2ed2f0714687214372127265d091834b55247e951ed83869",
+          "padding" : "3043300f060b608648016503040202050005000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 163,
+          "comment" : "truncated length of oid",
+          "msg" : "313233343030",
+          "sig" : "890d8b035cf1d2938593150aa00c3f4242098c6250aff9c3c33044e1b9247c81049be88addb57cc68a2cb98b30919c25bbe4931423771e5ae6fa9b15275d058fe931985d896ccb26dc495ca9003fce602d63161c4f00399d7aa46e6616181a06a0cc78906afbd80e65fd0165c7303551b9d0b1d4cb3efdbfc3138da4d1a6cccc43f8cd8613932d9d092cd2936f95b1775ca485f4c2e9a7c0d559a0112a60ed2f1fbaf49e3b514c598de80e0ddc072dc84ae8fdb565ea91c655e5c989d5b0a7bcb241fabf0705c6fcafbfe27abcafb25b26165c2822f9c2b681a86b97cfbce75150fc58a3f9ad92ce9a14c29bf087c2d9813c0e5fa59066dd260ba6e06668b0d305a8612d6d0224b7418c6308b8140f7735bdfde3f0f645eaf20bc0c5e6a4c8e6402e6d1c8016a0cb276e2001b63d2b7de52bed4e0f99b511f060773e5d2d67446e15a9ebf5ba4cdd995891301f08b2892e275a47a5a566d405507f6ec51225a02f8416758c4b35586863cdfc8fe57424b8e35fdc558fa5b3ad84743c5869e405",
+          "padding" : "30383004068105000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Replacing oid with NULL",
+          "msg" : "313233343030",
+          "sig" : "99bb35ff27e19ea04dd2ec367ac90d6043e8c205b50af1061f9ad89013aef6257edef5c865d04cf7a17406b910d3c493fd0cca41edf36ef2f7fc3eb1d4ea842ec044ee89f6d192c69564b2377952b450627af4066c5ff2ee53981797493150094362cabd68f8b52763086654606019c7c293d752ec65dc3d76dbfba6a3675e02041aeb86758d4a53e4d5c938219c101cbba5b5a61890c2ec16e569d8d11a2fe0a838aa0beb5a555145f23411c209124449dd9d19636403018b8e382d5956bcc81f47c5c29348730809b3f3eba2934a39bc954c7787c5a86e5cca144fa93abe1d8a34e65de29151e08f70951acd62b96cb1a8bd9566ea136ce75b83214f8132d5af2cbcf4d159065d22588b3a78d4eb9d86eaab23a35b451719f6ad16635b35bc01705f03a5d8ee71080e69e2a1de5ba2687f458f30b8a5af7596fe65f964645d871d4d7855a372e9c9d4ba6571516d8dde5d9b5c5704c4cc727f9022e2a4ffec77cc8668f320db0aa4211862da93a03e5348f1090e54df3ec9de50c093a79cf3",
+          "padding" : "30383004050005000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 165,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "731e25011da87b990f38e7fcf08faae045402472756be9874d764933f7f1ef54edbb79e2b9660f40d7c9e05f34253fd3a7b8a12edbf9ae5218a203ba82bff1cbb5fa691020615ee59bf69deb02338f0ba879a7b5c6601798a3ae30352404ccd7f84e1c12d021e32871105e8ac34c2c1ec7fde8248e4913e07ce69b5ee9984f0a4e20c2f434dbc9b6fc466e49fbd1d13b7f15922184edc6a985c64b76675d46485263da1251b4ab0030df8cf0ae3a8c92c19ee9ebaf1e803288e209268b13e83127cc3a424fdece29afc03e2990026d710940018e61a2ad90ecc1f25f3e21f174697ad2bf3294888fe3902d240ab35f4dc68ce04401cac82b27ffecece9894c6e83cbb5f42bae62d5a62300afe225d68f54d2b57f70683b6ada55e70cc9802401c761832ab09b40af2a939564dc4ff7265ddac1feb099d22bd7fa4d2b776914be0305e1080f1b1c524b83c13b945f499c2ac043f4832371168853ebb17569eb6d53423447a2044471c36168f78b4145160a8842d4d5b9ce8868da533f6760db2a",
+          "padding" : "3041300d040960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 166,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "07df55e096e6d4fcab3214546aec5cbb90fa6ec621ddbb3256692f8ee683e3e828aea4299c720bc4d2b8b63ea25d53afd91573a2ff9b88ce09176f7b8a73bb8b95cd35fadb4f68d916ab7448cd845b5f1af10809b9e7f359511afef75147b5f5681b346313846461b9133662ab0ec38175e1a9c767659d0dfd9c298d229550403991f74cff05cddb723e5c7edbe9d69bcc6053c1c15592a6be6297dcffac0b4d9d3a49e74a2042480ae831f4c62986635462b39e244a3758cd22dde75b023daa5856e0867892d57d8fd805cebd21fe0862278a63ff39a11e0450999d9d0b01c8f1a045c3474a059617ea21eefb46947a44625e4f017af73d20faa4bf0210c9663c18b203b02a2f0399552c31531cae621bb7717b5550a12fbb896f4c0e30e5fdf9c8e9a6763eb815bfaad226ca947f1da6ba84455986c33aae2ff741905bf1910eec450bb746cfda374cefd6489fa0854d4e4411f439f31ffd7cc0351af22eb0b3ad044636c241e3101265cd7b285d7b6faed192c8015d8a6090b175f1092797",
+          "padding" : "3041300d050960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 167,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "353b37a0e4860de2b2142667988cb7dc30e29d86da33b4b27984aef1803db66edfe116f0ed7d13b98ca30f7e6cd0fb98b02bd86dcbd7988d2db68c611ffe67a11531d83c8216133aaf53f601631fe2f3c900788b568c9d4f6a72ea87ae99af32228638154319c5974ee1e804954dd1aea7a0d4cefbf4442bf69bc67ef002761ce7a5c67a3316f71b2317236866ec3c3e4ed0e902fc2153278cbdc0d2ad2c36a4ba2562f098e71f7fb6b06208bb64031bbe5f95c824c8da862324aec7fd436065986fb704ea44f4d543cc578da5f44ea0f3adcbafb28ea189ca16adfde1dc0f852954cd492289959707afa1423e3ceaf064f3dc3075ea81a51f85717fa7e8b38cf989a47c77a3b9649caaab04a2384befa92e4fd4d2de8b00699d6ffd87c6507cd3b9a81f162b94e60c30fc4a9e70d52406b4d75400457e4c9c8ad900e8fee456de975ff075c08ef378bdcba69e7b1719f5ad6d91434c74b1ee577f016da9229769ec9a3d3e91e7466663212b7bb51182fc245e914446c31810e444923196b972",
+          "padding" : "3041300d070960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 168,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "98ff7ebb8489bcc3c8eafdd75225b744da3ac4bba8ccc6c0157e07294dd2687b50c9e24b206b4e1ba2f9326b8e30ac6561ad0a9642508b0b865dbd89d61930257ec26ffb7bb32ee6754edd09e610ce47a47db0ab0428c4c503daad78201a2006632a06e690d001f345dd4e9534bb64171c49fa2ea250f435475111b4a12460b40e74b14283af18fb4ba2af0c64a76455b2dc31c423817dcd50c0df0e55651bbfee48536f04f3d413ff1be6392dc9f3f3027ef20c58db18ef86bb4834705c1ca368afbf174575f480ec79b0df0efcf24a1651c1c9e260980dc5f6b0ab9bd98a248d9f8a6d2adf44fc501fdafb565ac47c227cd19f4a45618fad2686c765254f6f1fc92162460f7a9d32a91ce21257357988d86a25d6395be70c73c027b53edcb32e5ed58c36b9273495f027b7872c5a24ed39f5e6f07b1d0e21ec97ac3b17cafc4954c0184b01fd44c49fe3fa97698828df8b6f1e4ea27f3225b23263f1e72efaf9a6322e66826fe5b5d087119a5bfbda327cc7a610835230806c9233cbc966bb",
+          "padding" : "3041300d080960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 169,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "103c3122f6ec082438b704ece029f2426e2667411cac998014bd2d8d1fee917ba75753b9907ff4fbc65bef274aa4f863834a0ce45f97458f77862c426ad786a418d8fa3358145bc46cb6cc4ae3de6879127efe9c6fb135edba0bf96f7f2c7cbf3cf8a23799fdfb22d46d18842d3e5eb9f17423a4edd39432323625ce5559a50a602cb80431abc162ad80a4e7323d59467a3b6c2dacf386c38cd82c22658c4f954f2bb5fb8d8c4fb5d3523639b7872ec4b2e431778b41ddc20fea06869f661e6aa2c1092af421f38f52555244e5585b42723179b85c222af2ccb35deb93e5a1fe065b862c857ca096dec9009a17608e421202c227fad739764b064583db1c71af9a018800ceaee556c9f7deff6522d14a4881430fa10273e43fdeb992adc825c1b4472e1f7c298f11dd9ad2c6ce4103509b6c7f591c10cddf306b36bfc63140fd65223cdfbb06af12577353467b6774be789b7c5dd59db10f38451e0582c159246ed9eb2d05285ef3db4980199f52a7893b40ded3e65275617037cf04d054c4bc",
+          "padding" : "3041300dff0960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 170,
+          "comment" : "dropping value of oid",
+          "msg" : "313233343030",
+          "sig" : "0f626f9cc1d12cd197864bdbe12c188613385960d9ff9aad3c5b8d835e4a3eab6087bae290883b45796f436755583f017b2d1293fde26e9493b484cc6634a928d2630b0d76f3b2d26d9d81e9039fd187a1f94963d871280e451938c7223e83f34784e4fa1ef83b20b41975ff514e7624ba82da566b9fa30ddb6ebfca7130b70554720b120d094c731636fc5d938b8adde4c7a49e822d633313fffbdd4ea7d4797713896ea2c213f99399ce8c76e916361f883e1b76760a45de8a08971a2d3741e57079df4c93dc2801077f44395b59a816e55b5c5438b0372d7ccde0623f424442befd7b8db2c05bda177a5e6b6544762a5591989fd2dc3670e0174e12dca4c83f2b5c327b5f3db53897895594980ad4a99a4d3a41e586b27f2c44f30ced8d1779fbefd86e965e7642d4d74efb94b3751cd658ba80f3a6cf90d014582b51f39f41be6c53b5475a0bc1340f583f9491b8c91c9d673ca326af5cf66943a88aa04c04750a83fe8f429ee45c355d9bed7bdcdf886b5b9a8dcd57a99728f005bf7ac5",
+          "padding" : "30383004060005000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 171,
+          "comment" : "using composition for oid",
+          "msg" : "313233343030",
+          "sig" : "568437f4510335fb3cc818d177747da061ae597dcf21e84216f3223c28438d1157df0db8ed06d429c73366a76beddf207dc03b5f6fb3a911a042280e1943319a1cf8c0041611d1633f3e4c53387baa750d94a0c1ddac1e416590ac57a037d40076e276891e70508a1ee7886fbb5c838e34b620e288093b9bafbcd2bbacd4ad365cbe57f3487467de7804239dbfb837d65defa8ab1023b79492c4301419eff396e561224abce40a58d0025d7aec67c941c788b585d7f47913d8bfa8449a4854af5a3806bd3ccf6c2336993500297491304685277822e66e2e56f624c8ebe6a5a675123f488540ffb1c81771a222c3dcdebbebfe180259de8045ae2ef2b44a3e17e27e2a58590dc709b3990c1a1607514693c95f97dee5d1cb527c28e708560eec57b07a6718b2b2ee782ed7490172d08ab71c043434b302ebf297766e8213d8efa959b05cce5e29b85267c3ff8f1850b107b7358e5d1ceb51edc2906c26911bc2fcb3004ddf68ed35cbb5505c4f6ba8ef36cfe7a37e53781e29b57073cd01602f",
+          "padding" : "30453011260d0601600608864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 172,
+          "comment" : "modify first byte of oid",
+          "msg" : "313233343030",
+          "sig" : "0a4d3aa01f80aff978c8dd9fb0e0a8605c8882a5e9936371ff9906f7feceb4ce5c981f41834c9ef6ae34afe6567bd1ccd499135a844e6dc1695b6a1fa7ac58f4ba73714fd3d4681b10e86302d271e44eb685146202daad33d0e3a7b25902a915fcd5c10e45677672581a7e12d7f51a4cbf6197ad013fa83d2b473238963e727af3cb1fe2054d85813a70c8139b795db3e514c9051671f993c9e5096a235665df2a7c0c435171c5012413ef95b2384cf910730ab52a5029b7f328d74f24bd33d41f431dccdc775717cd28ce611af50564da46a17ab2c0e64f5259e67b895631879a831bbdd02f97fdbafa37f92633b9a5925b2930e4060192e2e74832e1ecb280ed8e0aa0d85a025f32a38f9f43ac7fd2203db7424d14263576fe4cd4246949f4b225a42b1a282ce364d0dbc9b0a1119baa2d310a17de8b8e969a93e8a08c1f8a0f6c5baaa50ab9b0368dd9350561e492cec6188f56b0f53795d5303bb0eb6cbee53b09eeb63591314e52f62ed135c772219a9303abaec273bd62b1383471b128",
+          "padding" : "3041300d060962864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 173,
+          "comment" : "modify last byte of oid",
+          "msg" : "313233343030",
+          "sig" : "0da333e509d78d8eccbedd7f9c40eda31131033bf765e895666b71f7efe54177117f10397ae3173e486dc475b9a894301d2670612824575fad6220d55b391b25af6d8779367f85d4302d56669251a08cf0b1a34b3ca7ae7f4740b63156042c040a5e0762df8677007ed3019cb2871064f884ba00b7f20b7aaf2fccd38e8d8c47555c9164a32bbb40458902fd8e086037190e25d57f810ae4ebcc42de13664f4f5c27c7068657f637256faf28f664dde1588f3a649f7bd5b60b9dfaceb29d6dac857fcb3b4bcf2b2c6d448c0fc1c710986825e3550a98312bf3d571ea2cb68e082cb0732d75a665128e56b6b0beaccd476030679cef73b3d07eb56774be3001c5ad89fc77f82743696f0505a6ae454199941d56f6002054ef651e6fade757531afc2bcab05397db8f322dd09d90d4a9a058bee0a16f73b1da816f86864259bea012e58ea7dbe6ffe5ef1c82fcfb97eea91adff47a0c755eae9f25fd5fd732e5bddda3519a6933ed696f81391350b9f3022c549cb6986ea16ee87175d0ba422bd6",
+          "padding" : "3041300d060960864801650304028205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 174,
+          "comment" : "truncate oid",
+          "msg" : "313233343030",
+          "sig" : "8ed8750078ff5a635d6ddf42dac288d6d0268d080ab53d2eb859b8f11352a3a148eec6c6bf888cda29bd80e2708cb5ebded4041f8b01b63cdad1d4342a6cc1bffdf81a3bfc2ec3d123f7d7ce5d6d8d455b1f823bee0c0acf6a9da03d053a0ba314b2dea1d4ae4dad8eb73a4d493d2ce9ed23c3b2678cf764b9b500838b9eea9b551600afbb3cc03b348b4ebba2f6a41ee3e5db39ef2a652994bb0534c8efe2962027609ef4a56203ade8bccb50c7554a22ecda3b80d02653f4e9d0398ca300e9f4d92ec3ba4a1b15565af56cb357f7373331ee795a19d2eef0060eeeae2dbeaea9e283245236b939bf4626581672ec7d0630068250072e86ec9ad1b51f264384a543a52f2ce42471a1505169ba30b608bdab23b9ccaa710bdc3cfcd47864710651873f2411ae7c1abf65d36ef2a2401b8d974d60ba951a023beb7689c099b0816b831a6f2a5364a92331d3fd0dc416d734e0581347108a4ebcfdc9dae2ed7a8b0cd93d2cf5605a9259bed2219478dec3bd38767fd5aa88643f61cbbb69a234b0",
+          "padding" : "3040300c0608608648016503040205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 175,
+          "comment" : "truncate oid",
+          "msg" : "313233343030",
+          "sig" : "4723279e6ffac2a5184ff10943720498c2352ea2e155fc802263e10b17801a030622f5f684adaea8eafc5087e971efda34a69420ceb4fcf3d6aa0c1d8ab3e9f009b9085518921cb684deb50517b57356caa3915d3d12348152b40a8a8693213d9a19c4499cfd42d09d4accd879f1bc2987cfad5278505f90cbd6b981500dadfda23582d2dc159bb9899ef0aa9f1154a4606a95be18a347aa1a77716fec9f84fcdd1b23a8b1d832de858d2f5ae88a5c32cda762d9619796f52a9959aaa86fe527d04e4bf7b19b184657450ca611c24b0c55577ca32b1dc6f6863e2ca5c27058d6803c3b13564dd416d1e9e6f695b4c51e74f2dc280ae3eb89bfbc8cf92d608bf3b2220b26fb60ed78c2d579255820e23eb15c3b3149d76f0ecccdb2dc7f0bea9a346fcaed75f6078bb9d7bcf9e677a15ba92ede667d60c3ad0e5d9097d4423bef4929a79d8bb953ca4dcd85fa1f6a65b578d31d3787402cf7b1d515cfab71fbc489b1f121643a9c048ca55364ce1e770c839311e9c3b8892612c829513d4167ae",
+          "padding" : "3040300c0608864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 176,
+          "comment" : "wrong oid",
+          "msg" : "313233343030",
+          "sig" : "84f849b5fb6c45b12e825c710324ea6920071ccbc816c8b724a55f1785fa18a77c1bc706973a6ed2039410c0e637ddd68f402f2ef894be8d35877ec67e6a984fedb5fb625eaf9f92d4a9bdcde0fc0e930b4a4457f823d24480843d338ab58d3f500a932596ed64673ae077c6985448bc3ee6bc580636ca75de726851983ed6407d6fa9ff31d3e0caa6a42a706d06a1a0cfc466109d277fdd58c33898932922874c4f410390ed3b7787945379dfd51211718e4bd1a8fcaa9ea78f1c04712093eae2ef6445e17e58608a329e5d06deda320749ed6ffc48ed60e747739ca7283ecb18f67afd2987097382c9a04155bacf37657e98056153d97a3aefad120515c69121b5e6deb3e7f66d14cad6925c7fa076a615af15a758331f9b29a6468b6e1f51ce2a0a9ffa6e0585da8389ea671832ffc50654d181de4949f94ca8cf458bb1756733dd081e56557b32ff1d4d61760e73c326a4dc988e64e9d5c9febcc397f161c8e3624395e2216db767231be9c3f842d03b33ab522f45e32df181ec079e98cb",
+          "padding" : "3042300e060a3262306530333032316105000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 177,
+          "comment" : "wrong oid",
+          "msg" : "313233343030",
+          "sig" : "83e3141566aabd0a0af62a6da897a81195f7e4107f9dbb17a1c7159461b6d8c70f45c97fe7ef6078fed69ffe750c7693208d7bd2f5e2391dc00228de6fccc3dab8031577bbbd98ea98b351aea16b8f349039e8cc6451466cd5393ddf6e124ba3f56427a05e612cdd75ee5916fc81891cca8b3496480ee8896137785090fff1b04142ff58726fcd66b81202f64c7355fdc7f93d52423067d072930c38d90875cebe8cdb06149d4a766b2867f1e4a77336e630e7819f77b043171420f9ea6ae657b8428e4873be900a77db5540e645074585388acc97a0f58e920e53a3f001d4d1a1d24307e797209a140ba5635180f9950de57ce05b19faf5ab48e766f61365dc946b1f9a9353ca0b777f08f45c9fcb61e7719171017ea3a3ba256a44129d012a7ba1e35943ed1d44d5e7a387e49af50bb13baf3dc179b76241f8390f36a6ecfca03d8eb88e257193a6443b49e107c98be9a56aec5b1a4e562f64d3a59d5f0854b5f3852e0834abed6e03900f51cb654c73077cd43ccfd863977ceae718bb71f8",
+          "padding" : "304a3016061236303836343830313635303330343032303105000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 178,
+          "comment" : "longer oid",
+          "msg" : "313233343030",
+          "sig" : "8d676f5e059d92ea5023d85161739d0f30d98f9ea8b0db06c7ae7ce5ba329fa18acca82e8cfd2061d2a37129e51afd38b3686f96000efa3e81a666e7bf06b6b82dea36d704d622cdcb75f84020bd31ee59d6c3e1b40ba30aa9dbb9d4a4a7bb85d1d9f81d6db20bede3189b4c257e5c046ef34e6c06c3fe86973a1a9de382d951a23dcac3df1b8ba84421d1ae170e286e41987dd0b50f1c2f1608f0b1815bfbcdca5b6a01d824b8444ea170a8c9b2f951b0b066d3537e12f74b615bc7dd957085c895a548e0f8746646e11472fc0cb64daf5514ce01405fa0d5903794bc5f436456957e8f419a130f8f555eb5249e1c1439802e2d744eb918c0aa6eea75dec26a1cc3f5c71506197d4b71fb1791b7bba97f97882820040d74c6e8449b6fe0b0f3f5b1c9b2e9e86c0d526a997fcc92df5182a70307737863b1adfc9285d03cc73b284bae66c0a9965000cce4a66537e963115c4fea115249b1d9e83019b6b8ff23e6b968c2579aa42dc56c227b6eac7bf748e8a3e0729f315c93ac6c3046d6e662",
+          "padding" : "304c30180614363038363438303136353033303430323032303105000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 179,
+          "comment" : "oid with modified node",
+          "msg" : "313233343030",
+          "sig" : "95037fef1c445aa2d7e72f8b68ff2494fabb1f3d2e9a197b11683afd4f3aff17e3ddcaa707e7ecf45204eb6f8c694c333f0e426b1030ed416f61095719abcf64a398028e01357de3c6f5f4834e2bbe1f1092f71a8083d648283fa7955b7532021675dd642fa8fc6137f22ae5bf5db40f66c03026adaf494af890090cebd2e486b284799de03d62d3fcfc9038b8bf2741e09cb39db9a84d7282b793cdffd9ab5ca870c2584730f6f3c93f608078ef8e6c5bfd488add98deaef34c5d447945226de9724afcfd95f17fc69d5610e47993421035939c78304b6a954fca7f6ae00ea4519067c5b6bb26654d86f722d8d511fc6fce971aa27a2323d05203d6f390157ea0aa44b64ac59c86147e02cd6d0acb34cdb0bc1c3aa7e0529570c2dd7db848ee3b77e654a74fc6fdcbb73d9e6cde808b3d2ca22716c6911b5ebdf49f0520ec2311d1e8be5ba325bd7bc517c0e3112bc520c30c8242151baeb42b4bf099fdc8fb1dfee16cf5d0a34083418d9069b4ac9b3fbfc59e5ab6eaf690e32e736cbf04f3",
+          "padding" : "304a3016061236303836343830313635303330343032313205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 180,
+          "comment" : "oid with modified node",
+          "msg" : "313233343030",
+          "sig" : "25cf65d782cf0c451a33939fa28d65f9484c0abea1df60663d96bbe1ebd619d29d9da35d07c52aaf62000be07f764e1d28c5053570316753d8676fdefdd6b181b08ce674a8a32c8eca5025f11d90cbac8bac3897d7d252714d5ddfc017d097f1b64eec822b318c4e6845527d0737939999798214c91e2227ea4a3c552834acbc3075906e9ae3fbdce81e4b29846b5802ff4b2f062c7a66144c58b227964119e7927e4159ece5592be5c1393af75cc879214477fbb5f6ced52a740d3e3567e30750b1799a7067d3ab2eac8d080a8eb0367d7b4e72384f20e10e9504fe0b3f57b856ca5057ac3d5472cc4ea05d862c8b17f5af619130acd44a5e3dc19dd111fdc7ebfb71613510e65d30d87b7512e56f59eca03545cd32fa7ac9d6ec30db19ef75a7769684d9f5449a908c99c063417b24c29fa4e9f40d34142cefa60d165df65d8f895678989f7bd846641d45cb15e5cbeed29c734c1cb18e964bc8671ef6a179ad63ac19144723cb3d8692d38f396a6cc6e6dc6644b177fd5fd9c0e5a80ed1f5",
+          "padding" : "3052301e061a363038363438303136353033303430323838383038303830303205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 181,
+          "comment" : "large integer in oid",
+          "msg" : "313233343030",
+          "sig" : "58c4cc60774356a970125878ddf14b0f13493f396d6f7a9c134468b0b5f73b1fc966d3050bc9f21b45c13c2461906f9b4551cbb766336a9c19c2c26967ad0bb835f96d5fab890cb029d5fd06d857a04930da254fb808e5edd2b7205d8c703eb757d3b398c6684e119464f890749bb97529a0ed30ea2bc3b182f840be170af43f3b78dfda63953d5f880bb5ec0ed8509f4e70ec0cab4fce9c77468ebd1abb5658e1ac4e8d1e5c57727f8f69c587afc9241e8818ed4eaed2e5867a7d9e6887f1c9f5edb758a4dcf350d41b45ce6fedd9bdeb6f26304e60dfe9d1654aaedabc892120cef2ef5375c67ae9d0a5c39c0bc16075e26789d91f6965da42be0526b28e7f4be9e40f6e55bba2c0e2b76f539b4d79aeb0452c22a5e642219b82473087e111a98b909d2086aecafdff814b701abfb0e7c2fb4db658f77bd6fcb7e9d435fcaa689259ce2b4fe665cab557808191c6fa824405d7ae35a7f0bcfde02747f8e3dc410834ede8a4492c8a8327bfb62751291d60f0e308a38e50b38098e682d4760e",
+          "padding" : "305c3028062436303836343830313635303330343032383238303830383038303830383038303830303205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 182,
+          "comment" : "oid with invalid node",
+          "msg" : "313233343030",
+          "sig" : "18b574df9053faa01ab07cefe518c1fb08effee495e34f7646a2e1bdb535997c61c15d2f14e05118fef793b7321d57a5976a3be6c77d0d202a0b0ace2b1b5621942227807df8147a81111b98e7872037b148b61810d39dcad019ca37b2a4501fb20044d29129909373c6ce175bffdc6624f6defbdf50a6fa4eb03dffa222708934f703f1a608a1177eb2ac5a39f1dfcb7380f130bf1d46441e8a67b05cd0d476b3f98f6bd30a55131ea21712c75d0cebfa56665ee957df8439838a1fa1e05885aadebff0ba986e974b7323f91a11ba4897abd22c4ba5d13e9f747b41e6bbe3e494bf098e6bfe324671416e23e34b4cb27d7343e7679dc55a766b178cfe7715043935cdc8c8b9899e8c923502f7bd5097d3cc9460bb419acc6b3ff7fac7af542a51566f42237dbcc994dfe03d8425818fc085e3297ec34af82dad73a7114c907f7c5d1f110f0a928d0fef2289d01868d3f089f0c7b87ba1fed5c221d76541794b20de11a7993f87e955bd043346003eb856dfe32fac5b1dcb5f877b6591dceaf8",
+          "padding" : "304d3019061536303836343830313635303330343032303265303305000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 183,
+          "comment" : "oid with invalid node",
+          "msg" : "313233343030",
+          "sig" : "1ba3c4136fc31f48fea41a53aa08809c560738e63fe4c80a30b2976f4626d37e488048bc696276e8656ca071f7bd3aae45ce8911e3e49056d3ea54575aa93c58eeaf489039d7596f9e632a586aec5993de8939ed26b6363d5e888dd70c392b96d933b158570fd0917b76b46442964cd4e2692eb2d69b19e4c1c6e6b208a9a5ccfefada5e1ff54fe3fca74211ef01a6097dbae787a65062b00971eea93b8b3eed2a558ac75cfbde9698cca5d1484a2436fb7f54040ec0adf34299e66e3c5062179745618c2868092593dbc1e59236f7d55dd2ea1f5607cca607c00328d63d8e049beb97ee0f92a05927ed2639f68ec742774d6f69afc81e1d288c887f6c4eefb41529f846b49e0ac3c48871bfea4cc84cef08e08f2eb647146286bdca275621bffa048dc11012ed50ad9defc8107bf5344109548a02de126df0d694fb7be6a4db0f8444684e68eacad2af46658084fe9c4546b0df6917771bbfb05125ca4de8585c03584c916b458ad243692f7870b70e93c0cd031700451215df39cbbdf61aaa",
+          "padding" : "3042300e060a6080864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 184,
+          "comment" : "appending 0's to null",
+          "msg" : "313233343030",
+          "sig" : "530df212c308fa97d4e8539a62894771f63de58fb1ef7ff423b42991964f147de2daefadd9414a40059bb3f7b683ba887ccd96db3b9e887b99132a21ef8fb6c2032fc31fcec6b5c9c1de10624438d86e7edaca6baf4a9daae468bc27d985d8cb9f554f05769ca74886a72a42c51cd45ec2b2b6002ee01e52572aa1b17660ecab8c04119f3e5fee56fb54b0367b135d39a905594e3a43e91f24fbd178323d69839bfa2cfffdb7982d6da2f01e60974d905ce75164cb355c43d0057eebccc4451de40b923aa69e0d8339d5ca56e95c0e2e3e7942bf1c53ad40686950a7a7d266a716edace18b30675aa0d531e9c380cc479601136b37e4c902e6cd63b77a29d7d2cee1c044dc347a21043f3b10efdf48b3af769c399993f9de432941fab419b0883a8c5b137d00c5fd827aa803970b207a9ad28c0ea283a2f7c08d273daedd3e73b2dcbd154341a1b0607dc9208a4e0780a4575a1ca541b647033d6947386032b4f2b1ef3dda52fda5460f9e145beedce6d0a030825de385b997b3a61b5a8c8b72",
+          "padding" : "3043300f0609608648016503040202050200000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 185,
+          "comment" : "appending null value to null",
+          "msg" : "313233343030",
+          "sig" : "36bed7e07cc416a7d5ac19b50b56eccddcb530d6739a9fb7aa0ea151fccf65ce872fd48a1d90c816e2b9887276ba07e21d95a8904c300602d5450d6ee996e8ce930fc11015563f6e5e5d8b6066b2cdfc94e5964311d9c7aeb76520cc19c1ec5182f942f93f22e1d1f5eed5572f3f0f90bb7b33f91070d4afc23ee49b36060e46b29a1b7a536809c5578a13ebbc04ab52019a017f946521770fc23be1f3adb1e84ba9abcafd44892d396914f51fa4a7acc0cee3f5d064571a654cbfe1dfd17d2bf3c64875abb62468f2a9b56253e478693a11d0e4e884457090eb3d9c8cb79c83eb64adab19023a6f6e003a74142fabb5b984a92695ecf0df02538c6d5da9fc0753ec36d8a02fbfaee8de74b297b8ecf08a28ddef5531f21fa9cdfb0791f809db1b0cf6cde4a538eaae02a6a459c76cb118d0b6bc06f401e2acdbf3e6baf7ff7b5d34b9113ebed0156fd639d80e51c7b41615096e4f954a300ad7ac98f6d3f1a5d45fd567a33d086532c7e56b55a89785f0eea0c28511d76effabb56e2b96f5d1",
+          "padding" : "3043300f0609608648016503040202050205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 186,
+          "comment" : "truncated length of null",
+          "msg" : "313233343030",
+          "sig" : "94d4378d1c8c763f825fbb1d1a24fb4c62e923483a9728abd4e12519ad2602d3b676987e9ebd3989531f6306d963300f91a0c4498c16afc2dc82a8a97ec08e7c11861a6cd6f037ee90a967612996b78a738ca9ec51f853da12c53c78879afa15ec2e79944cdd036929ca7e6ed28ee9f2f556c1341f3002c9b621e3a5bd4f14965ebbac93979999934dcc7e4d30bbef77b80d7b4abbc0bfa027dfff28a8d16ccb9c47cd9298612a827d060de18c92a18fd92ba4ce86fa360df20b801c93c41e753bcbe3d00341a3cb602d94494bc44a86d6cd970492936d5cbe8c03689cefff2e91955489505ad98617ecd6b440b02167a98357fc4e4c3b5d70ad710fabfe91f244f36a488046097d339598da00c84e7cebf24a82f7bb85404d47b55b91eb1fcf4920aa93d43ca6050bfb2f8cee8625e523f3c620d1d3a85651ba5d0fcfa833dee73540f88b44c1eaddbbeb119ca4de7b163210f0a85591577e7488ff35a0dd52c752055a551d517b7afee521edf4ff60fb00b305fafb6ea47b0084abee01acbc",
+          "padding" : "3041300d060960864801650304020205810430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 187,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "6570b72bc1a3047758f7aff566764bfe3d4a7ae9c6a9ce4778ac3fc05dbc2fa0e3b1713a6fb93dc4d3ff1a8c305652c3478403a995f90065bd48bf3cc82e79382d22e62cf328a92d5191e0bbed42f3f852c984889a908784bf172f46c7f40cee2970429db36229199d2bcc28796628896eb75d86069419c019638cf21defdccd00443232f3ea44edaaa55b044763302f52e92c23ed715f40f7f2ec049719b74670b8b59cb44387acf01bd406e9806f3460bec87e5cc55c5401a3410dfcb0d9dacba84f841239d3416e1234cfbf81f5e88212748c60f5759ab93430b17e92bc8e6d80b5e892c7694f119c285348e77855affa6e24f9bc16a8da2aa245069cc18a3901201c881eb8bd805b49e8720efb24fc0746239b0e4e4521db23ce597cf3b3d7372253214542bc4c40eb5fe1a90b2cf8c75ded44b172e79ea61abdcccd9f27829c91c29d574e828d416e5261cd2d7de42e50ca351597f72795a8bd4fc0eb721437fc848b363fa9d3bff447879f1ddd1c1927d679b0215794c9256b546e1685",
+          "padding" : "3041300d060960864801650304020203000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 188,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "1bbe8fb3a0c107374a27858866d3c9e18861908439f631d6aa55e1f7eb8a62945284efa9f0f8390f7dbb662672b7b447a0bd5abe5aa170686288045227e2d036cb9361b9847516181b1b84dfb59adfb318af3796f54bce608bf9063898dc9ef5c5b806aaf9d1f49d093c3c1ac3a1a8adeb3cbfdc2a88e9a8b657f7a0cd3668f94a68eb6d89c016793777af6d046e9e7a4c51a8401a0f0b043f1b9aa5bcf3b64b25388c0a41f99c0cc15028ba58d9f8c137db4280213e4d4d4126d71e9ca2da4d0c56d215bf1b12efd03e3063b30ebc994b7a47c0101bb5ace808a5a9f0e595abec4f2a5ec8040c35728e6730a3ae79737f495ea9aefa232cd86a2fb728987f11c97ff47d6e65a155e0754d57161a6d427e54e6823e72f368ef02e0af0b38b893035acc60cb9ad8da2da0aedb61d554298c2d7fa855746f6c85cec85e61a287f2fa1ae382e6ebdf5e9574fbbec9be671c96ced4d8547e9b4fa3999dcccb0985b18e9094225a713632883530611bc854a92877e4237233ac8466394bd65145f232",
+          "padding" : "3041300d060960864801650304020204000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 189,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "3a98d7d9fab0680448b1386441fb373c0768bb59fd72484c0038e3e0448ee6d1ae727a1cea451e881f204d429e6bff49b52ea3e16a71c7265ead31d70c4282975c854f7a08f205aaf0cee4040a13a2b4cae71caf16b1f9a307ae029bde33a4659cc92fa632f9fb724717d0a0c126ea256978255358b6c3bd975d0454b974cba17f6455dd240604866c0b45d06b1ec1ea8d590c481dbb9e2806e556d4fb5e40f4f37641570cc2a9de98b26f0346b6fd5dc39e076aa0d836b0a3fe2824ca44e959215468d5ae09ddc8f48b4f1bf8a4eec683ba9d45863b9a544cc0d535b62451822fac336462c67ed0bfef1619d516af66fb147f0061d18b9a8f6790ef30274ab7fefb9ed89d4f2ca6d30c6c1c7fb990149f16af8163d0eba3e59ce59fc1a822a38cb1802d2be4af05c7e452f0674cd1409bca1abd9636ce54b98f1fc4ad22a482cf1e50e9609ae09741d6fd0b1ffec9b8782cbfcb706c41dfd52fd6c600330dc1cc42a4b86e0a85f26e0a269ab8fa76e3bf2fa79f4fd02e5a471961f67c3a7a94",
+          "padding" : "3041300d060960864801650304020206000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 190,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "33538b31ce7c5e24d7dc087d73265c61c312399e8920b8fdf521d3dfc590657f00fdfcadca3fd53d21314e7cc35129cd6e170c06b8dcc25476a47892a689ed5c8afbddf4191b9cd557d4cd29f59333201def168fbbf00253a942eb6c5e543ce01fe3c4a1940edc138cb95e249a32ab7b90fd1d98343d3ddf6062ded626f8b049ffc73a9f69264baa0ebb0b7e8fea0470ed08c2d4140c2d492eeb12e4749a7581835cd81306294737351ea302c9069132d19b0f7eb280760941cb59ead82e665bb138faf7093f45090ebf6beb5754293a1e4f0feaecc7678d5fd56413bdfd7014938f3031a912cbc57fa3211b02ad34139fd9c11f6fc27a8b6ae0ba22f64d4c9e2dc1ad991e3d89f5978d9c87d1fb052a68dfbc0b090abd1b31915ee07a0a481a9437dfc8163f84586d0f3cc3879fb6b4a4203bb44d84f5f5859f5b294bbdadf34eb2343de2d16e7aa005bee959beaa38482b6c0d0f7817f4a556f377cb2b388f609c377921d5e20f08d0fbeadb1a3e63a11fea5b7b7531c94c152a083221d238",
+          "padding" : "3041300d060960864801650304020207000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 191,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "206a841a7c9c2b0af1149a40a5ea82658730ac50bcd20bdd0762afb9e4e5debb745e9943153c8cf4ee1fc0e22c730a66ddcd52204cbe83c05149ccbb6fc60b9d641168af9a78e6d741a0a405731acd459a45b942581632111f9f447a27f1787cba1b3fac01f66e3c6756f63ffc18d550313f579d47ba847e9b3bf5a1f4a138697b938c04e547d22d3343d9ed1b2143f85109ad5a08b835802732a796f1f15698e46b47658648554706521252d265eb353231695eef004b913ba0ce9887eaeaae752a3b7d7db70a97c610c3e212c5336e2e865895291a70a1efb2a593b76b60950727dca1330d1215775f41f5614a094daf94c9a6c5ff04f699cdccc48b6d7953fde80621c796285bfcc56d1cb7ce0d14e555083ffed66d3abef9a9c2ce76c22cc57ca08793c6080cf0b74c21443c5d7338b5be15204b45628844f68b1ec3629e53f55137ff9a0ec9827bf41ef935c6e6cf67b2d5074a8fec929ab4b1b3663e6e755e748988e9d4a5310d3055c3269ad74fbe78354ecf97bdd404db93e8a42d7f",
+          "padding" : "3041300d0609608648016503040202ff000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 192,
+          "comment" : "composed null",
+          "msg" : "313233343030",
+          "sig" : "72434ecd0f59044f64be219f197dd2ab79c91b2bf5d3ced002bcffdb28e3c59ae04f4d87bd9a439f406a21174fcc5b75f2565bee2f36a83e5b89e22ce6e6e26e68cef6c6e7973e27502c3091e57448015f148f0847a805a33be8322127383f0a869d21aed276e9863ce3128ea240b63b6caea2df217644fbee930add2d0145d21f2f799a317c123aaedb1d71f40ade4e76637c9112c4e8f327bb2f6eb050078c9b802d3a2e18defe0c32f436021a6a894b03de5f68d6a677ca57bca8845385d5bda6b0f320325043008fb8be25c97a8499e6545dc99f27d7e2ea222541ae91941dfe812a8ed73f848b692aaba2317dc2eb84900605e0b8328c9e47170c4bb6a90fcbc0ddfe3314677ed4255b6582048846d2a8a738c4e6e60f3619ae722619df0f940660e8988abbc3fd6852a8f6b6b947cccd1cdddbcc676b35eedc5619aba1bf8adb0a74f2fabb31f4affe1555be5ef478f6c5c3936000c575acbd3bf6bdc1faf69276b3753e76331ff6130eb50fa9552c87d7ae047a2fc28a3e211d308765",
+          "padding" : "3047301306096086480165030402022580aa00bb0000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 193,
+          "comment" : "lonely digest tag",
+          "msg" : "313233343030",
+          "sig" : "09cc7ed5357f2eb7449514215b7d4bc94c3d0e3b9403a138683444f12a24fb4f1bffda8037602b19053727c2f1422f540d5c6c2ee0c0205a3e8d19e4ee968640ba857c04cebcfdcf7538e3a11b32226f57714ef6ac47045e94026748fdf05ee975cf8b47d790121a0bef0e86a2fc9e7444f28ebf54e2cc06f7adb7c14c1077f99f434b4f4b23d0e308c3af0809393639f40435b190175fab570b6acda0b2b94dd331cf75edd594aa7d49836620a720cf715643a73704f1f5d7136b3072d6e9058cae72c0cd3fe15394b4438731c37e6fe78971d8280630679131657b64edd132910aa1263ea2bbca36eddb34de0b4d9a42258c6e2727b71a41c28bdc07c3e367f194f0418a4fc7b5ff7e531db5f0e4e5dcd9ba332c0fb6c4fa73e10ada4840f7aa2c310856e2a453ed595e9b7bb0e0c729375eb0607694c4d44ac2203f797f701a13c0a4be1fbf5a90c6c680a78d871e3637637200e4d38ef6cf2c2db5c2a5e55c1105637bd97831c9f39e9ded20be2f381b96157decfa0e648696e5241f3794",
+          "padding" : "3010300d0609608648016503040202050004",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 194,
+          "comment" : "appending 0's to digest",
+          "msg" : "313233343030",
+          "sig" : "8889ba3a0556d7d65a08bedcf40c2862409cf65c5deb821b7d12e6d1961859b8ac91177b7d50ff8168cf80fe88266e574c6fd719980705bd7c488d768e15d2f871f13904ae2280e21c7fe65da19988f2f62d84c87a32ada15fa3a0591e8f7bac5da67e7339966c94c0d864e670cea00c810a01ed78c0552562b37c11a04427c100cda4c6511f2986e577814e48ff565d3f8370e79321e612c371fd4e1b9cf93d53636844fc6c392e547f5c309fa3b89cf62d1912f0774c82c567989bc14399d1fa0b1d87d67ef15ae9c4d577f78c913f58c48cd28dab95d6358b49410926816242edbbca97dfe9fa9f44649fe02fc8c620fe86767708a1619606ab6c873e970c9bba1bb8083a71e2888a7a4917ae8767b3051ce324c8babbca7efa4509f8186264976109c3b0b2b453e1bb1b7468567be2844de295098a8d849602c0261f6c3284613517f79e84008de8ebc151b98a9c19a3833a8c322cd021af09422e09938db0b09cddad47db0beeccba5ea56d2b033e2d90e327359f056d22692cb7aeb2c6",
+          "padding" : "3043300d060960864801650304020205000432f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 195,
+          "comment" : "prepending 0's to digest",
+          "msg" : "313233343030",
+          "sig" : "252594c934192b66a349e58332c9ff111026c512a439f886df1859f327d875836f529e9c462a95d5b0e8ee6b407ed6f7a7512b70e42612c1479e856388da8dcace91780be2f56da99c4a76251f86f2efe2e214404ccfbe26728b6766f9a28f8787ae318d3fed0fa585b68bd76ab238e28739ef19afab1247ed1bb119fa50f1fcce4bb946047510bc683ae499730cf316eab96f14d654ab311786121ff7f2ac09ce146b98ec0302775c0b9f06be0240b28695894f53ec1a92ed985d5c6cd55d9ca5d64891842673d2dbe8f4d6a678da4929eca8450887884229a3edab3305b691f242da7b7043f0d759d6c36361664e4566aa419e26944195ab8746a05d56385943d971a1ebad627c2a9e6c429253a1142abcab5ab71bcb35b7c6dc89ff5795aae1fa0d7d8ae5fe327b3959d3c7c373c7a98cf382819f21e6fc1d29ae15897887728033b6c05c293c28bd9670b7bd7fe70051f1d30bc3e9b4f20d6caac77d331c3c864c61733cecb5cf5756a9c3e485b58f936261487ef2b8054b5a1f95c4295b",
+          "padding" : "3043300d0609608648016503040202050004320000f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 196,
+          "comment" : "appending null value to digest",
+          "msg" : "313233343030",
+          "sig" : "0fe6555340685f83444fd844ae5e7d11a5ab36922f3c63803432ccb84b3643f060fa7abdc6865891a1672b66b921867ab08fc62a4dc48104b9eb8e4bd89c26b821c490e843c3517fcdc249be66680ca40f2c3b7500228cbdd0323cf6b6a7c18a1846c042676f50be45802ba4f1917a84058382b9f0a1401b1656b494a325a9f151edc49fe2cc919d84e3a027d8c83afbb8ed5a72f6815586ada30fd7b6fb3c95b063ce9ee8fea2b134ae42ab8bf08110301a8838c42498f4d6b449e1dcc65454f81af0ad2f6c146f0b3ff0ebc761b53b7f855323cc4c16956607a89e238b376bd76415648a26c8a473709ef02b27a2cf626450c92ed1238ee95df90f4b9cb8ff1d6d092bfb79c0e0114efdb0ab989cef4280b8a8089b4d65460edc9f93d89aab6ad072afc903c74fcc889a1e06ac8bab8e61bceae5e325af68d1357cf0747bd10c103fa04f69d563fb270a06f3821305de3f02ac1617700f07ecaa6dd525ef9e54b9449e2974a94e7e7b8307659495d700181f09f8680064375ca19cafeb5b81",
+          "padding" : "3043300d060960864801650304020205000432f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 197,
+          "comment" : "truncated length of digest",
+          "msg" : "313233343030",
+          "sig" : "1c0849644c72821f89775e8240949fd317e66ad216beb2876865daf067103d51fc428bc9e19dea39b16df3cf55fe9af9941ed456a9b398b373ec7de6ca9c176352d7d2b2e2635529c37715c1139b36a105f7def4aae688266feeccf22a076d19d519aca76b88b71364fda8b5fd52c0832ed2483d3a379316e370b7e10c8e6209debf2172446741aff676da31d7761b7497f2e55bf78954cb3352e51c8f8686cf9949c53d03d6af5258cd3ccf442a6e773a687ec95a07d2fd3c37ad0c7c729a832f0ae3689d1f3bb272a1f901a1b2f9e161432b57c37fa3abfb509e7dd91607895df45cf2b7720f5ca34a9b74cdbf82c9637adb391ad70f53e47131a22f82709fed31c99054a2aaed935e9791a1a6190b724a16e5df74ca14d1d15726ccf96edfea8bf5dfe9f48747f45153056ec068429ed080eb5ec57f0f7ac9c81ce6b1dccc1defd5528088661e0a050322e1a2f315fd65a4decee9ef9f3021a34af2b1f6c365d680f00c0ce9d19ba12b5dfb515c129b7a63c34c5033edf9d876c03e1f3594",
+          "padding" : "3011300d060960864801650304020205000481",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Replacing digest with NULL",
+          "msg" : "313233343030",
+          "sig" : "5681ec35b49708b8f8962a579a33e9689947e9883246a8df999a35d8bc24271ec1460668999ec74192b4f5dcd0d49f22b31c77afda748e3bec58ed52e96dd45b23f66b7b2c2c703add64e6794867e9be72bd3a4f80431ad6d76b9a502b9b81f04d126f65c18e9fe3953af2023c5519fae6958bc7a392ab5413b2cbcd2136491b5f25c02958a844d700468c2bca431d2b998cc1ec6b31856234f67d50872aeb12e9d401f597180d396e74db862db073fd157ff4c2cf0b73c86cfe5266d99ef969d986236960d710853c5540f62f12df09f0a81a7b0acb657179abb0442ade44463ce729540f31b3c2df9687151f142b5df3913d036604636fdf51306c329738fecc711d57713e5f2630e769662bee450bb5fc8c87e0da8a2bfc25902e5c52a5c2fcd46bf027550ae7976f8ed008cdf4b6b53d32bda37dfef9c98a3cb68200c3e06b0a10dd73d02da9c43928e14c7455140e7d4afbc972c089977e0bd69524a721acf48a4fb45dee76b0473db4ac1907ffd586c54c643d6e0ddf04d3821439f3e4",
+          "padding" : "3011300d060960864801650304020205000500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 199,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "349e9fb23a4eb3c943d840912a447870aaa91c3d494c05b1f801bc5384fc0b7e9b0b0d6899462bcd0b357eb7094ce09e817a091f10cc34ba793fb7952759ccfc8ebda5bdc4b7b8932db3cd18f5cb0d3ccc07e1cd5a6537a701f06c07ee01433d50a16c5331a2a913a82dd3c8ca95e66b481237bd38bc76e213af3d32489a325ae448358bd68509d3541a94ca89c898acf6f6bd67cd66c8522222a1ebafc5f47df1b0b10c08b84dbb81926e9e7104c02e7bd5a77a19ebbfac4fb423f5ef0956a9ca3ef49ddec1f7591d851f66834868908cc8a8f569921ec7a9a1248d0f2aa68c380f194e80580e3113427cf6ebb695db18ce345845bf22c75f62bf91cca1c3eb393814a38f4bea08c0f35f03b9b77cc65140a382b4376af27c653e1b7a7c0bf801fdd3d18c5aa3759eeb25c158c1ed8c9865f8c1cf0b6438e412680667a94e4c390ad3d916b3b9c47a50a6ba460b1ff05a3df1f7f0f58596005d28af75eb457aed85ab6475a73172e8eb987af41558028c8cdada1a754229db1c35699d717982",
+          "padding" : "3041300d060960864801650304020205000230f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 200,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "419ad0e31cde95cb53d3b3a86b8a8fb605a0dd08bb4904cffec0d129ab7b20cba91fddedd019897fb486856fd779947702efbe929a006860417354b4932582084b75e3076498259fdc783b34441529c25381cc57d1016e196768dbc01879d768d158c299325cbb0f84a3712a0c9178e57c592e7da5e95ddf35a1adb1c7d217ed13a2f1f53f76344236ea93bea71f113a61c2677e3ed5c406a4e70eddd76439804b6860337452da8cbcef80af7b144ce9dbd7cee010268c9dc68a4145adf2bdfd05f64fe495a3c4c6996358e1833e07f6a189ee3b41952042696d4b9888e6ccf0940b4443adb78b787b29f6c1982e6f86b099a3a6bd0661a4259d4b968cc83467433632d86ff18c2cfc920dba2bfabe852e283525a15fbf2fe7a965b328f8e34514b3430182d426a7e3b392024d8bfe20e1baadcb484eac0ea97812ccc92a4044f60d446d2003080a6f2cbba47afb74fe3d48fc9d599c50227b30df75a941c8f19d6fd6ed66b9d3ded89947ed19bcac7db4fab8097a2d6ee652da61163a7b5a31",
+          "padding" : "3041300d060960864801650304020205000330f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 201,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "9555d56a5edad3ca7f1c40700ee2a072673159193586b08713362995898ba384aacb76f7ef3cbce1e94fb79a77f72bac5be73aeafd9cd3b60546b63abf575741a5824f5b0a621905aff6c7085531936504da15110edf31887be9c90b96950babdfbd6f5b0ccfe99c4c300f730408bd07bd7b9d035d7b829cfd7045150b1c9e89b4600d6f09baffaa4dba48611c8c3f745fb954a52fab6944b6df7f8cc4266c3042bd0e6d7b31a40640f726567c44d456dda93eadb7e2016d4fa10a0376e8acc4e4ed01d0849da3c178a6c75c0d7a8b695a8cfc84d0d8cf29619b3eedfacac2165c31fcc3c3a6f062fd5542c305460cf55858d372267bf95f58817f37ac7b90c19c69f17d9cdeb4504ed7c278dc10c12a86273a919e03419eeb25313d976d927fcaddbe08e4357f7bbbad0f273f0bb0302847e04bc89c850a8605f1b8ff0afe9fe9a00fd05c8235ced766ccb0f2d8590d9fd6c20c4fe16c5a60e056414eca6fe888ed5fa338e7b7e27240bdbc6c708e13a316c113c3af024b4e7dc5360aea3483",
+          "padding" : "3041300d060960864801650304020205000530f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 202,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "8829061808ea7aef2b338ebbcfbea99dcfcde31958420193326e26fa5aadbc9eafba2f49b38bd629f5bf1c2d3e92000050d5d89360896a8a29d147aaa2add622e5913da439451a951c0286863cbfee3083585af883909ea498314f5874282944546de32a80a9309fa9465ebf324d482aa8283c8589ee90757ac52de8f6654ee708b44f588c578f0833a820c8a56bd575552360adfcb95c39616a488f2c95fd94e083c305d5dec38a158eb94c40c018e6b4002efed29e28f78980cc9eae7456c6b68b04f5a0dc0c2a33b71b0911e058bf1e629b8dfc8187319d78285953d53a38bff1a994a23b017a74b6d18b86d37e09271cff51e5d113d9d947abeb188c074182cf281fdc879930685023a5703594820a4cb1dc22c7007083aebe9ec8525a044cdf67d58e775e525ec2d954f2eea316cc12701ea8a32627b8db02152cca9dde87a6bf5dd5eb4bcda3b34d35171d9152560f94ac2dc43bed33f3e0f026f1a578bee46c311e3b14d444428482952184e5a9b05c9cca0cba37b6b4d30844aad78a",
+          "padding" : "3041300d060960864801650304020205000630f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 203,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "9f8ea25a407acb845c6be6e4cb263be64cc2fca7d573536b3076c75ae9d38cb70156873eb2fffa3587c3650a81ce19a254e2ede3410b0c10f8a2f4b8972c75dfc690ed29ed1b41a44c149dfc36d5f07213101cd4d2c6bd3a9b367279af08f8a02fc346437452bb40c46d705db078efd49c0ac0fa6be275e3b2db60ab17204d87e35201a426c4c1b30340ffdc6667c2e0ba82dcccd11340e1c7ccfcd18c6b34ac1545e18e3034e296c2cb482e5b8aa923b68597667abd02af54af7cea95cb2fd923dc90ace6ff906989cdb98d36acb40f5663cfd6c68976e502e79b845b592aba02b43ab16699dbcad74c0f00decd1e26af1963c49dbbc6baeb585c9cbc8230827267c0f6330269317af01ba0ee928b04e83ad94fd871cbbd3a1d4da58acdcc40327042762930995083c10cdbb2d9543cfc6b5478e61ae544f66bb65332a061d4f07fae41f3b25130849aa9ee4ae9497bafb0143def8d0a2fa0e19f87b153fe34f817a46cb00348d39ab1507708e2c2defc388486724e9371148761da04d995e8",
+          "padding" : "3041300d06096086480165030402020500ff30f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 204,
+          "comment" : "dropping value of digest",
+          "msg" : "313233343030",
+          "sig" : "6d675527594f79cc5e66c9f795573bb7374f66eb396f97c1feed0772c86dbd1a3b36167f557285eae066567118670a787d4ff113a7a7ef575de05875c3bceada7af2c86aba621352f0b1ec1aa3a5937bfa830e859e836b3a0a62841feeb7d2460a266fd6d9305cf18421a1744d93183aa68e17ce1d61bc55eebe21a23fa8bf1b94045b10580f57e393a0c72081aa1c83bf9020e3d4c3e761456a18a1fead5e00157029b656797dfc321c754fd1b09cb2111303d1bd603c2c3e650951516c34bfe9650e03446071cc19ff9529505e1c6f69e2fd3f61a71398ca8b55310843033ad0c75578a11db3e83ad802fd335dcb71e83ecb4edf47faafd0b1bccfb89f3172f957eadfe61d9b097185150ba582d23f75387caa248d11413d143c38627be244bdb442ef4756236cf321288264a892856ba0b5784f91326e58fefe80e32f583aeb56f6204a54062119e87758ccd4ef0996ab51579240384149e1f19bcf54e270937b3f915060b989c026b5fda38919bb9fba6bf983091c2c6f338fabbe971c96",
+          "padding" : "3011300d060960864801650304020205000400",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 205,
+          "comment" : "using composition for digest",
+          "msg" : "313233343030",
+          "sig" : "28ac59fd8a65c69dbd4c66e3aab2d1bcbd93d54e4710b3c3003bd8e1a85ffe6e21ffe6ba6526f3ccdcb563295db756f7ef29daf5c3210a36c34fa42fa13c6a557b4f7fae965147420adccd0e1013cf2100963dff6ca27371a34fc7ce72f7de62a1b6992b6bfe287046f01611c0fb65872fa3f988075295b73731ebf149df9b30016f305e950c46bef57cc40cc0daececdc3ca1979da134102e47319b0500cb32b337182d053c0f17ba9b9a7866a3852855d1e5f914a21b83548093d4a6c4f8f635f8c9d7b6625aad390a202c6d3cfc24b2b8a9d195135bde6ced5f57368d2ecba166e7f17e05d29598627d8ce6b49d3e681827e6185272200416502a1b9e1afcb4f9bd454fa39622c3eb839bc55f021ad006a90c4b2d9f9a933a92df7b2d997868352cd011f8ec17aac6619af0be4ece5747b9265a41185ebc6519dc43b1ba9ae20cf8929f54df6e4ce02f87e649b975d1e69c8610cdfc9b6364a148b2176cf1bde486aa141da819f639f58789eba896e9946896fe1995609fdec089e75fd742",
+          "padding" : "3045300d0609608648016503040202050024340401f9042fb127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 206,
+          "comment" : "modify first byte of digest",
+          "msg" : "313233343030",
+          "sig" : "6d05e2f726e9a367b65f841b01844e615280364465071c86b3f4a527debbd7cd46f5732d6203727b868889438d569b821957762c45145951ddb8ff76fda97f5f8a279eb840f9f1f521f804c8e65168233f85adb863824a748b5a5b1395979335a14fbdd160e555ba064b79fa3b6d0b31692753fdf2e088eff549f7f6fcc4256444778ad1ae5112a59ce4e9962214bf0d4e7b4e85c93ca9ccaf55b55302ee3ad0795ea4f4da90af896caf2615aba2d3fb21499c4ff813f696c54d0b955b0fb34b4eea874bf9342193226c6d6b2967543b9d381f33f7370f5d7ff5f89dd79f388b5841e64f1b785d9e29fe235c7d509fd23a08d473ef3b75fb8a7e8ba78274d5538fcedd23886ed916cf20c0054dc43438060da6b685607219410a08245f214779acd278619689ba7e621d0257f54a2583a3508b0d69a968516b5745be891ee0731989a16187216d47600bab7000ab9d34d41d515d909d97419dc4d63ff014e9db91e6f3d5ee83a22d1009327586f451fbada7577f6540954a760a414cef0fe42b",
+          "padding" : "3041300d060960864801650304020205000430fbb127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 207,
+          "comment" : "modify last byte of digest",
+          "msg" : "313233343030",
+          "sig" : "3b07c83eb71633cce02d709bfe927baab8139776565c90ef4f363b9dfe24b5197f4f457a4d5515b18b5833a9732a87ca0ca0f6572767efdc79e29a7429b8f95e5d91236ba88e03041f35188fcf305699a45a10f43d16991a9c4157f259d4c92a9f555468680cd17da5ec93bfb0f8f2fd1edb0646763466af4704ef46123c232ce230aadf0803e89cefa40e8bc00ff53bd6d46466b058b12ede7f6ddac04baf420b0373990cd3c69e277c1da421288ef85f7174793118ded6e65944c666bbc6ad80d2fc17e5fa0255812dd1f227cb9f62f1d8e8e727f77ee76110694f0217b3d1dfe5206c53a2d9908508bc902e0aadf318d8cce51a4dee027db4af891eb495fb69ee8f63e19bdbc7e79f636ecba4e73bc4cbc77cfc38f72349827cbe4ea7d416fd66bbfece0d8089e26917e6b3d16a466139974e5f5837938bdc7e5adb19abdf0c9601ae44895911d26ae0aed08dfdf0ed13a6070da51a7b346794fd4ffd1bb0e4b0eda4118dae388e738aa6d451fb8433b8a1ca4b04e5b36d8ff3dcd537498e",
+          "padding" : "3041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8dea4e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 208,
+          "comment" : "truncate digest",
+          "msg" : "313233343030",
+          "sig" : "2ef1b57d4bae68d33603719c33a1d408f1edbf0262d7f11cf1fe1271206d3004ab581a11e870e7aedd9d48f4ced6d17920d46260331e3b6936be3976c0195d75f1ae0a31531885dafcbcfdab108f830ca811dc5465063b4b0be364e284cc759fac4a6e21aa156f6916654a9f46f850d714d245dd0c0542e61292101839c63c3598d58f56bb9b1efa44be5d6a2adc5548c4c672413d551ffdf239550140e91eb763c54256613c910d4e1c951a1a9b280049e368dfcd7a66448787ae0ac7638f4cc68bfddb0a837b124306b4e864d7a89eed62c20c6c650e1c24064c7c779726d5655e7c7c0f29b3298ee6518f44b316eb0e67fe1ff883acd0bf3e8f43d666db819f50ca3c765148d3552bfed9875ab76506c5ab8008ce19163264d5792caf479fd126f9ed8ccc234f3e696e62a8e6c5addfa0558d9a23bc09f4dee3bf03dc7f997111dd0f1fcc331c6c115ad299c0837cc4b52933d843faeb85ef80971ba4e6c358d29061a35632bf794ace4b85513db058e54f81fdb43a20d5e7c0bffc3f9cb8",
+          "padding" : "3040300d06096086480165030402020500042ff9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8dea",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 209,
+          "comment" : "truncate digest",
+          "msg" : "313233343030",
+          "sig" : "2415c061a50da3a1ec6636857127378eeb1117194d9db2147ec4f11e5d6b4a9137e8159e51ef125bf397782fe3dcf15a110c1994f1ecd006c2030be5de0d94e0e09e55581cd830eafb14bfb473f29a2f11d7bb0b7ea7b7a7156147f7d6e13f3541f8dfd10a4d867b7f82e550bc7c553a43866b295b5430faaf7d5ff4220e8fe1b538837e92eac811fc713a83533241b31e1004627f583fe349ee5c7dfd334fd9b4494dae6809029c12b8dba865734ad7868288aa6d1bda45f37639d2d0feef3f3b1a742720faa0c628dfe016ea413a48032a1eccfc5c54f667c86d14e8c6ad5b9f7a44fc0a85e1aa768bf7fd778d71459a92cf07374d2cc9e6ed2660330f4e8b62e2c7117edca9d16d9b10d833b2c12309a7a2e9d96fb6eba760a4c3528e71ab3a8beb1b11039897443bbe8c85b708613c214a7ab7a7b81c86b493b75fc5b1196caa2b1138b239b0c455f17338ccb6caa35a420455d3ddcee6ddd01847632aad44ea88573cd50e6588e586f0ad6365e7aa3a8fa941e0b6089b9716e5832eb659",
+          "padding" : "3040300d06096086480165030402020500042fb127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 210,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "542afc8d3d3cce9687949f8c540f90232f008e8d2018fbef274870e99b6ce10ca6bd4eb9b47ffe547bcc1e7eadd9643f61be60f86f884dd8a66e1b152550b397d7bbac9cc4296c4af5e14bee66b04bc88a8ca1d35189ca4cd0fc7d0ae73c52086148ba26429709830c339c3dc89cb8dba0e182e3df9b95fb10e5150f18b81ee3023504a4b1daa8f85ca2236f62108fff221936203e9c5ab08d42bbb208bc318aed4869686e844c1b94d94cc3ba6dad5725b343dab9b01553ff5011e59496c8bd3173a1d2b2faba3793030433953ce1085c4b8a8b995cf5cfed340f24a2917af535a26d1c0c5f3a3bb106c300849fc8fe26203d14efcb3b1d9214a565493f5d07e084f3675c971ecc8fb6cbb1f7c4e07352b1b3ff9e4286d258e7b12e844c76ff9eb18e11304cadb7c781661c98bbeb8b8e28b760c66ed71890f3fca7bfdaa15c04fe7eb53622096a8666de2444095e03f016f094800848de29268982466ea0401eeb4c5b8a1853d4b6a33e7176fb3f6a31bdd6d573cbe857ba00c5d5371ee81c",
+          "padding" : "3040300c06082a864886f70d020505000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 211,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "3b40bd88f99c9e37b01472b6efc413c20eb223ec850fe20ef5e9d3d81f266b11225eaf207f3b712d792ee681b1d9d8657af67c995559c602b8f772da2794daccc93f9d7aa8cc50060928b078a1d934dd32f10d62aa492fc2a909ea6ad3dc10593fcbe42009e67dc7c83d7b42c2ed085c5a0b622bd1eaaba07065d8753ee99e323a18e4c31aac3a559268d2dc5ed7460c50accc9a70be784aed2bd4794d18a9a6fece6fa252bd0b5f6e285fc9c9f9f0190b8492f2209077f7215d26c31ebcdfdedffb4bdd1e407d7d2713d6439214d3077549ea5aee7f69ef52f26381bd822294ea22189a87a0aeea85e9b9a85f102c37d81074784ffca6ace2e44f8432bc7e2ce1babec1ab0bb8a17339d2017d254a39a0719957bb2c73f4ea67aadf8fbfac3958e845996caa02934b7064b4646c6368733b73289d5c1bef743893b3a5f570fa900b3328e076a4222e5fd56a9032c305231204a83cd021366b7bf2f1b1c55eb1cce8c11d5bf0804e8f6a29f601a89c3e92849c45fb013296c6658a9e09e6b8e3",
+          "padding" : "303d300906052b0e03021a05000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 212,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "113568a33ad2fb84007606720847b90f48f852950d4b6b39eade1c7304bf701e37eb0944f767a67bdbdfacd9af781727de044509ad7d094fde06fea6d0c6990a834eddbb47c1bdcc8fe39545f0f660dbd50c7aa3ecfe72909fc32dc183309365bbe478175f1be144b1012ea3d849baaf4e6172dc747d220eea7a5ee63120ba8764ce75c8fc1104ed54813b945668da1e73a8c3a802be6ee7d91c3536a49e7c8a39c563bbe3753086a261d19ebe1d5124e815f0624aa16129776750e521928c6578d8ad24bb14f24fc3d94e335b9293b01a6a02d1b75b80d357bc93c1e69d6f8aa51aa781ebc0eef18b7437f7926af3cd86957050e9b759b681462fd2e49daae518a5fdb2c7ce38a6399593b44f4ef32f7bde907ecd7bdc68b761365856603ae781fc0000dfbac9ff956a71c94c32f902d470572feb513b8cce6afa1bcaef04ed4995fec70395976f33feb4a878d27996b422118681d8b51948ee497d8c3bf6ed53500913f985e2f3589fccccaadd81c6fc08423c5643f6ba3ec4bab2b51b82f6",
+          "padding" : "3041300d060960864801650304020105000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 213,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "31690fd711236dd6ca3acf585195ac53cbd636069684f40426ca86e1b2d7b033f6b9033fa75b36ed9a848e2c9f94e5b8dd05b9396c11514ddfae18e8de5a3d5116bf81aab21c2e564b19197fe5e83dbc87f4fc1afdc3a0a6617f3fdee4d63e89b07ccc30aafff4c192cc0164a81c032585cd92c997d852a0ab35a330030e59dd49fe113b889acef34d278eabc985b70b312e6bb62ba278d7d2cb557aa38c88b9a0a4f4ebb51b87306602619a9361d8daf8bc8289e232665f92a244ec0e8b041510c6c1015c01c05bfb0d36999de4a57fb3127258e1ab265365fe2b4c051633254b429131a330750422074803b6dece155bb3af508df4706fa6b465e3be280942e26d82830caab376db6a5c95caddca809a246f05fe1fb9336a433a49b1eb31b26fce820117914f6d7d489c3c79b8d67af29c815a2883470f5384f6516088ba1d999d0d4ad1c7a5d006df523ca69229d20ab6774ff7ad8d80c6f3912671475cfec977827bfee540c09c4be1e3fa1ae5516aeb54773b522621faff15024b20b447",
+          "padding" : "3041300d060960864801650304020305000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 214,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "12c17d7c5ae90aef671b6593279ed2c76219f9fa6b7a01e620b45906582d85611f95c8d5b4224fcadcad8d57e1d6ab7aef928c2a3608ac6d94442afec80945a8d2d25a04376e9a41ac77a76e572819cdafaa788a036a405d9eeb1ee3e3c956d53dbcea9e62adfc921ca0bbb651307818cfbf67000b8089416d09f04fab15382263fc9b2455a8a3472e8cd685be2d36bf6b9f073c0b37e76c3e74a09c968bffae2032b0708e8dcac6e5d539eb22c6e105031fc03a309e23f78fc7ad042196db84b877eda3a234368f982ad458442d998000f413b8a442c7188c9139284989d727d0effd09b6dae707758de61b8a1d6ee2b4873b9f38e87570842c150e7df520445e66565b7ced7bb610878884d08d6438f860c1911e2d07894dc706b14b1f83988c2968fcad0c0bd3f61aeb775a909c40bf4983175c690b910ce3dc402a2f8ab53a093a67f544d652703c82c55b49016d238953b0b31e0f9a9dc32c134032820c17a0275cf3e6bcad0b4adc864407482c9eb34406b7be6c16633fe9c2ed24de2e",
+          "padding" : "3020300c06082a864886f70d0205050004103fa6e1540a9e5b94313c5907267a7331",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 215,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "0797dca79b5a166961da39e28bbec6ebf0d9c32d61881067f667423f584148fe8a22d432fc00d7b560930b9874dd66d731749015af00e518c7105d4d40d48bd824e69b77e92a2e302f14b00af7935fae839c7402ad58e24ced541dcc2e0a95188504e652a7f051781718f741f205a6b7d814b39fa066dc0b300cb2ea8c9c7fb90f0b1a057e64239a97f0bbac7995c60ab8099b272d2e0dffd34a82e6a443211e13daa5ffc5eb28f4e6890a7841e88234495138f6d2b497dc2165c65cc8177651375fbc0e6d0f0815b9e5f49b53f67850249bad66703e84c2291095ba66ec33ff078f40ae5cd66fe3950514820c87c42e5866997a35baf0f721793b08bc50403598058526c0111f91bc46b387cdb212d3f6d144f27d3eb6a32ced5b5022e1775a74e4e2c52638a0d8dc4410718a7330f8d15ed5e1b321fc0cf7e3b209b49f1a61cd71560434068d1759529898f1a6a280d7e31b7cf498bca168208d1335bd35312bb4cb307d7aba823a9ce8767d4c29d9636b85a0cd077e552e59c552c201e495",
+          "padding" : "3021300906052b0e03021a0500041421f0fb55d0f5f4e1521ec82216000a17e728f773",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 216,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "56709e7ac1d1b37f162bebb32a9cb9f86c8f9473e5ebeeff4ce5506642688f0256b5f1fb06108b0c3bd89bf7956e07ac22a4154ee4bb2cf5672592852f24d1eb46211f3a9dc55c515fa87db83d5a747aba9a0b8b3e07e1be26bdb462a3dabe7312350e6814cc857a1cac7ec6e1789f69df392d13fefc49acfb3463ca61dc59f619f34d75de7c7532a1c29228a57337a139a08bcb376ebeea36fe92d098107cc57c1ab328226195844a8cbc292dbe31523a842c5e222271d1ff98ca8ef5985bdd7f8c0c6f9f1a582e07ad46fa64306cafd2ee768baea1e2cb5aa42443920a6ec40e168e5de50dd2a94243f717dcebc9b4ee47a5128369b41fbee068f848b8a9069350dce0b83e6d5a9a9ec66521b11b735ce4ea3d8c7b4ecd8695cd87221d1d7484c9a893cddcbcb304fd203e7c2120ea5104c0d3e8fec59a6e0d1c44abec68d98f6409be5da8aa8800a93f457ad6b085cff25f7a51602691f8465391276e71d7068977130668aac2a533444bd6cdf93d8808aa44f3b79c9930e276bceb33dedf",
+          "padding" : "3031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "26f1c4ba5c1a316e6fc50e47e080740e2ed6869adec3e427d3e85b41e706c92a263924aad99df90d5dd1a7f778486f2bbfa649668b8b8be51f69906ce866b11e3ad2fe85e36bca16ab3b19c3f9662f5e58fa2adb25d706c2a1abf94dfbbdb19d44ee2aca040585c8b83c01d60dc0d6c21914521d5b4d9edf1dfd6301fe24b4a1b27276e61348686b743d3c16cf5ad590667fa231c0e8ccf96b4c30cfff37061a33b01258a6b3133c5087f3d4f90238d0d7689b46444f15cdae75c9f52d934230d5a9c8274c7d78f7b56cf1575ab30976bf4057a4db00080449318395d3453ed40a851ae93d44f0637a743a52dfcefeef2aab70546a7e23db718137c2476b29b9a96a6f144afa4780633562d14018806c5b1e156a0322eaf70aa574e2fecd1df95d22e91b45bf0c8e8a440542d1d70dbf2edc08c408bdb18d70d950286c20e6332cc4c715037e54388c8ca225618c94154241129e642c00fd7accaabdb63222d0e84820f861419b14e3e8cee4b814b1fefc626ba51c2f1097c6a4ebcb8c0ff9f1",
+          "padding" : "3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "using PKCS#1 encryption padding",
+          "msg" : "313233343030",
+          "sig" : "48e9fa9c8e311a1e30a12356c5edbee8a6f426e2afd213bc404618c4a050f00e9029006fb0f285759bd643b03dc4683fc76810b8fa2eed9f559383d9ff58d7f4f67fa6b3f81d702c798b499f300caf17b7d590df9db39b890b5b4d15e33cbefaf4601fffe0d0628aafd028e9252beb0799e2f8dab8245476d141f0f40716145a4f4b7000e66cb388ea037d678f0b867964468467850a7ad6ce57f0662821259b0b937cfe072a587e562f9ea0d04fd5f646727305b1e164578ffdbfcec538ab4b55977f49e9f4643ef5fc91482cd50941ee3389583bed58ee57fabba1755a2994317d903b4933dc5e1b950d2023a1ec8647e47aa718cb3387d2f57c428363c1b96bc21b636bbfe02d329d68d5f2b8a55184997f9f250fe744099a28808b487c2387825d9eef46b898b16a6786391e2bbf651e50d172e6f1581ec3979434cfa313a19006bddab314f5de431da84b377b0b51e01af31c22046e5a08cf01c853e742116ae20722d9d6be74b3659a3a3dc3f72bc4808f6cb205953d8c36381031fa08",
+          "padding" : "0002ff...00<asn wrapped hash>",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "using PKCS#1 encryption padding",
+          "msg" : "313233343030",
+          "sig" : "40be445399dc0f5bbfc80b5114d463155ced7f80afdd048763f3f1c42f7ba0421c30b3f433d4ddc34592985529514eaee3725a6da772328746ca6d0e8e600f18c27c91e3ae86f084144384816fb13083870ef06fae11569c2bf22303331fcd0b4c905c5dbf3f1fb844bb003a96cc8ad2ff8d13d814f8304aef179dbe53141a1b92c28e05a2acff47b0113cec3bd16d0d1d2844c95daecd2103dd8e1801b78bef6ac2bb4e9584956247235d186eba8dbc5ae278a7992ce58f4bd9f0cf79bedcc8c90238bdff6f2c9671ccf355154773dcf425df02d1beaf04ba79b466f036837e26e35ce55a6071b54a92f4e0bad91b8e1e0e7e57277a16b2d66377866371222f8fc747bc2ce1a4baa6ce6eb1289c25b1834377d52c693d90d63cebf7fdad96b22796bdbeec6dea78ec6f2d886c3b7c27b850e4ab9750c9a71e28a29e93db8b980908ae8f485155bb434e4925305ee06f08ca8be63691cdb60d32d28ebd50ccbac1c48e8f91a06fabddd51fb6ca26421ffda5b6bf30e38aff88cc24715f97cf51",
+          "padding" : "0002ff...00<hash>",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "invalid PKCS#1 signature padding",
+          "msg" : "313233343030",
+          "sig" : "98f649a766413ae1348a8e601a78000f7b284eb9077f2b4a202609c6540502d6b8e54a5ddde7634d4e0e8d5bda0a5673a042c659d5fd0366937f222582b0a41305cc382dedee14234f86015e9673defd1133d133b0daa87aa1e5eeebd3af545cd59effe44cc8a581791f874f491a10030837e619fc089c7671eb0551f17ffb8237c2085e0d5c90348b22317efc1ed53893e06242ec60a5d438195bf3c70b0a11b78a7f0edc6d4287129b412d9477b020937882a6bddb9cf7ae963e7bd44ea61fb671ce6fba1a2f085afbf781971359eeea082312f3618c199657653b37f07c46a43ddf6709ab3433d799158ff6671246aac560a7f7e26010d9937ee61537a6a06101163883b68b0e4dbdeabf22a0e9a5a0da15d33427440b48918d620c8947387f92377d3a236942758167aa459fffe96fb5ca7304742a3e4e049a2cca570da8f05c21bd7f797216f01f5f5cf844c05dd74d6a5fd10ea7396b2704c07d44d7d06ecaf18d2d3aeb716599c8013e78dd2812380e15d28272ac1a378fe4dcad9085",
+          "padding" : "0001ff...ee00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "PKCS#1 padding too short",
+          "msg" : "313233343030",
+          "sig" : "9f59ea3f9dee7d9336ed2f86adb180cd2872c032ad3324cdbbf68e26d579bc7580cf9cc28bca27ee4630c3cd69670840e1f8922018023c3ea0b2e85b86a518348b46e103237ada4b5d0edde8a0ff0a54656a156010b16d86dba3c2c1468318325710b8fab1479349739c02729472fd497a92a1a23f8e5b6717292596da69c3faea3e9cc836cd21043569ac64b3b88e394b8bd450538e63b0e1b507ec79969e6e4aaf9e893374103a01297422a6be9991882a48665cc955b6d55bff8c762637f82a181ea8ebbdf6ea25ffb793c09e69842a919881fd0a2f90636b88ea1a3dbf27305cafd0c7233fee01c4f4a4444bcbbc6585efa94a8c298966dd8cf2ea17981f6726c854560c1a908ef78bfa2ebce522072eb5f4b741b45c6365b8d5da492c067c25b4f467b6c34832032a0e2446f5aaad149b298b3b6711dbfeb360cf6149b0ca998a94afd9c835504c6ec97ef49a5b8427e577996bfc921d2da6be89957912f6183b289212279f6fefa768ce8ef4386abcf1dc8c7b6ada1dbde45b7e7624af",
+          "padding" : "000001ff...",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "CVE-2017-11185",
+          "msg" : "313233343030",
+          "sig" : "a07887f373378196b0b748cdf31c14735ccfa0f117acafdaa21fde4b6e7559390b834e7b92e9e1cc9d49fc0fe6cfb60429652b4bf9a7768f71fc4271ca6fef4e431192ebdc98630bfb94c5baf18b4cf7881d84483e4c44c22db15a9627705a0b42a26d6f3d6009aee0d2a71bedf4d4b0ee6b6fec2f16e1277ecaa3bdedba406473a476d1688df0fad1da795526c7e641981b4812b05b692d60c60b2bfa424c8b620f40dc9dba59e2c710e7ee750b3e134c1f71f43210688aff17aaa41cdb5668753f0006b1cf951bc5951f4d89a31196985ea55c0966c3662bcfe4e4cd34f12e4afd7e5c4a130739b1017d6a583882fd72db1a67418702c8b01353ccf75b7b93faec0e0be36211d5f2bd910e1552323711bbeb73858f899cc1ec063ef67d88e0c699d5a689c52106f06e960f09d2a3cf84f53bbea2a473edf2e6e0176801d3fa1c2d358e1e5a26f646ac93796ec1fadc6991c0ec19c9dd90b25a2dd3bf73d2cf1eea8867f96caa5a2df54973acb2a2da0a1367ec74afbb968f517765238d1769",
+          "padding" : "n",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "invalid length",
+          "msg" : "313233343030",
+          "sig" : "a07887f373378196b0b748cdf31c14735ccfa0f117acafdaa21fde4b6e7559390b834e7b92e9e1cc9d49fc0fe6cfb60429652b4bf9a7768f71fc4271ca6fef4e431192ebdc98630bfb94c5baf18b4cf7881d84483e4c44c22db15a9627705a0b42a26d6f3d6009aee0d2a71bedf4d4b0ee6b6fec2f16e1277ecaa3bdedba406473a476d1688df0fad1da795526c7e641981b4812b05b692d60c60b2bfa424c8b620f40dc9dba59e2c710e7ee750b3e134c1f71f43210688aff17aaa41cdb5668753f0006b1cf951bc5951f4d89a31196985ea55c0966c3662bcfe4e4cd34f12e4afd7e5c4a130739b1017d6a583882fd72db1a67418702c8b01353ccf75b7b93faec0e0be36211d5f2bd910e1552323711bbeb73858f899cc1ec063ef67d88e0c699d5a689c52106f06e960f09d2a3cf84f53bbea2a473edf2e6e0176801d3fa1c2d358e1e5a26f646ac93796ec1fadc6991c0ec19c9dd90b25a2dd3bf73d2cf1eea8867f96caa5a2df54973acb2a2da0a1367ec74afbb968f517765238d17690000",
+          "padding" : "2 bytes too long",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "empty signature",
+          "msg" : "313233343030",
+          "sig" : "",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "0",
+          "msg" : "313233343030",
+          "sig" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "1",
+          "msg" : "313233343030",
+          "sig" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "2",
+          "msg" : "313233343030",
+          "sig" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "n-1",
+          "msg" : "313233343030",
+          "sig" : "a07887f373378196b0b748cdf31c14735ccfa0f117acafdaa21fde4b6e7559390b834e7b92e9e1cc9d49fc0fe6cfb60429652b4bf9a7768f71fc4271ca6fef4e431192ebdc98630bfb94c5baf18b4cf7881d84483e4c44c22db15a9627705a0b42a26d6f3d6009aee0d2a71bedf4d4b0ee6b6fec2f16e1277ecaa3bdedba406473a476d1688df0fad1da795526c7e641981b4812b05b692d60c60b2bfa424c8b620f40dc9dba59e2c710e7ee750b3e134c1f71f43210688aff17aaa41cdb5668753f0006b1cf951bc5951f4d89a31196985ea55c0966c3662bcfe4e4cd34f12e4afd7e5c4a130739b1017d6a583882fd72db1a67418702c8b01353ccf75b7b93faec0e0be36211d5f2bd910e1552323711bbeb73858f899cc1ec063ef67d88e0c699d5a689c52106f06e960f09d2a3cf84f53bbea2a473edf2e6e0176801d3fa1c2d358e1e5a26f646ac93796ec1fadc6991c0ec19c9dd90b25a2dd3bf73d2cf1eea8867f96caa5a2df54973acb2a2da0a1367ec74afbb968f517765238d1768",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "n+1",
+          "msg" : "313233343030",
+          "sig" : "a07887f373378196b0b748cdf31c14735ccfa0f117acafdaa21fde4b6e7559390b834e7b92e9e1cc9d49fc0fe6cfb60429652b4bf9a7768f71fc4271ca6fef4e431192ebdc98630bfb94c5baf18b4cf7881d84483e4c44c22db15a9627705a0b42a26d6f3d6009aee0d2a71bedf4d4b0ee6b6fec2f16e1277ecaa3bdedba406473a476d1688df0fad1da795526c7e641981b4812b05b692d60c60b2bfa424c8b620f40dc9dba59e2c710e7ee750b3e134c1f71f43210688aff17aaa41cdb5668753f0006b1cf951bc5951f4d89a31196985ea55c0966c3662bcfe4e4cd34f12e4afd7e5c4a130739b1017d6a583882fd72db1a67418702c8b01353ccf75b7b93faec0e0be36211d5f2bd910e1552323711bbeb73858f899cc1ec063ef67d88e0c699d5a689c52106f06e960f09d2a3cf84f53bbea2a473edf2e6e0176801d3fa1c2d358e1e5a26f646ac93796ec1fadc6991c0ec19c9dd90b25a2dd3bf73d2cf1eea8867f96caa5a2df54973acb2a2da0a1367ec74afbb968f517765238d176a",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "-1",
+          "msg" : "313233343030",
+          "sig" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/rsa_signature_3072_sha512_test.json b/third_party/wycheproof/testvectors/rsa_signature_3072_sha512_test.json
new file mode 100644
index 0000000..29f57b3
--- /dev/null
+++ b/third_party/wycheproof/testvectors/rsa_signature_3072_sha512_test.json
@@ -0,0 +1,2119 @@
+{
+  "algorithm" : "RSASig",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "MissingNull" : "Some legacy implementation of RSA PKCS#1 signatures did omit the parameter field instead of using an ASN NULL. Some libraries still accept these legacy signatures. This test vector contains such a legacy signature",
+    "SmallPublicKey" : "The key for this test vector uses a small public key."
+  },
+  "numberOfTests" : 231,
+  "header" : [],
+  "testGroups" : [
+    {
+      "e" : "10001",
+      "keyAsn" : "3082018a0282018100fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d52450203010001",
+      "keyDer" : "308201a2300d06092a864886f70d01010105000382018f003082018a0282018100fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d52450203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEA+uEjY8xR4mbefXS5iQhf\nEPwI9ENj+rTqf8xWEB0RZhbEPeMTtwVpyyfeE07PNfy8xEioEIJnjuGuQnxI9Fmr\nLELJCFkRo9gckU8Ee6Ru8aUqSYProRE73w7pXoXNIyJM+DL+PpFtO/+m3c/uCSaT\niyxRyJBL7Ec5r8TweXnL6r1RS+WiuHq+xxx6KznHNtd2RC6p6V6X3fytTEw7Qf6F\nb4HM5Tm1BXq/xvsaoVMxbqT452uNyIBO4QMD/C3BgvfOXZB+eHKWeTM7OwEldLTH\nxhPAIM4TiK03/8D2sjMMxe33zpuoDrmEttoqxZqrqjopFy7Sk3kg9HwXRH5hhRGb\nmzipk1ZYmXtIdzWoGEyv8QqPVV0DRVL9V0cbKT+BPxmqbCE5h3mSQ2/RlJ6+IllS\njJFxZBSqcv+Qu1FC0v1ee6EtjfGsmVQI5/tkWpq3tvaV5AUFAKkEIlODOwVRgmV5\nFSRlifg2IgO1UXsvcRfSrKAV/OPMQcaxvLLmctsULVJFAgMBAAE=\n-----END PUBLIC KEY-----",
+      "keysize" : 3072,
+      "n" : "0fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d5245",
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "ebf3c64e4c19fcb0fd920e65554a552cc1e652312c2e0e51cdb3b92c94b2b41ee201f61f434a6aa4703e87416388f4661c04fdc2e459e199af3ea208c61b99d746f4b00d82105caf4f0196f1305e806bc13b4c6e6bf581962862dcb0eb15a0ffcb0fe6b36502320011b540799e1432baf2a56a428fad64811afb57d210d859a1201ec057dd8d2a68784b48dd07357162f21e4c82f8d5e385b1f72834dd4c0d85ffd333410f08ff28fdb7365e408a60af177c80298726940bf4c40efcddceee3945b1d921b9d04080dfb12d3ae61863ad2e3e302370f5a8858a1213dfcd500269ebef76f4ebf0982a751d8ade1aeed95f41d4560084711362774b11b6240c0ba6ee4ca634ba8298f6e63ef560a39047481b9eaa546178e69e4daf5651c66c6235ba97c231241c63ad16efe59b7b5505d9c3f1818368b9462cda71849e431648be9757620c15f99ca78f4e250afc41ffdcdc52693a1fd43506274c431caf34a4d37321f5ccf04971a25c5010b9ada07596bf9a20bf307db9d5e86146226081b25f",
+          "padding" : "3051300d060960864801650304020305000440cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "b9bb1751f2336ef5126508541b949d40f1719bd23c2f0fed64a7b73ebe1819377e6e4262f8440a3a3cd456f5eec0b1c0956bf6989add2c3d1c7ba4acf7a617d198179dd974051fa7a14ecd8093ad572d7e233daa2a9a46fe59bcf7e01c6ad8d68c0afa89a58247ce257566edcedd799173e2babadac15405e2812ad12ad900ad997035966a05a02988e11133c21e111a8e06d7ce509de1e0c11de55379482cfa072348fb41c05083529c2db86aebee92095e7450a75d97fce7b3103ef1f8598459651dcb9b6e90f299c9efc95d7ced2f6e91526ab3788238e2b5e109d3ea984189ea13939d58fd4ab896c76bca4f6a92fd3bc124dddfabef1f286583a1415d1fdb8c80de8e7583fd6d52836a22c3926f69723301904532b9fac2a37d0cedccd4b3d0ddf3550377191f813d4f92a5c126ae91e03fbffbcf59637ebbf1f30acba1dfcb0f93285381cec6da60bbcc62074075c71300f8424e0f964422dfac19d205251f227614bc13568f408284b6b53bebd7dc4adfb7e242953564763292d9c01a",
+          "padding" : "3051300d060960864801650304020305000440d296b892b3a7964bd0cc882fc7c0be948b6bbd8eb1eff8c13942fcaabf1f38772dd56ba4d8ecd0b626ff5cef1cd045a1b0a76910396f3c7430b215a85950e9c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "1cc02717a3321a83da62deb3ed0b9706cf7ca9fdf3674617fcdc3364a697825b910d54b891b5f8eba197049047cf0048ffba6425d47374ec24a84f1f7f04716b7ec54daccd04aff858e2e7c8830e4420b5f99df756018083abe46d3fbce2da6e8ce6c893fc11ce5967a5f367159f9ad38d957078dbfbd32e818a26b49ae00151350044d22b58a4a61a35fadef67e3f8247f407f026eb17b8dd4ab29d388bfb271a1ec606e141cef3fe57e2e55ae8b40fb076a06f5898362b695545124e9c185c50647cc5b83f09f406e780f626ec60462fb50caf8560aa72fbe174111142029b19f2d681f771a774afedfe2500fd8b1bdd437fc41709253ffdedc302f47afa774f5ad23777a57fe44067182f4b35a28923edc82255cce11d2fbe91acbce29289b4e0e8f5e99e906e6607637b05eab4028d85e91d060fc1fee052a09baeea759917b34855e09b8e5b67ad60f45851e991cf01dd528b100327961eefd0c29f1d1d8771bbf3bb1e7f048d9c2e1dc5e652e6ac4f6a2aef86245b83f611700bedd07a",
+          "padding" : "3051300d060960864801650304020305000440c6ee9e33cf5c6715a1d148fd73f7318884b41adcb916021e2bc0e800a5c5dd97f5142178f6ae88c8fdd98e1afb0ce4c8d2c54b5f37b30b7da1997bb33b0b8a31",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "a0de9c2df76523499c6c344173d944b8e02ee1520f90759fa3c27ce284091f80215a9a26c9fcebc125171da556bb732a0645cd64b05c7cbcd8c187d3995e3c86cd59468118e9278ecdb8e791badca8785e56f33478ba03eca721591930db01bc1a5da5e193b2dc9022e98948644a406138a4c7971ad8ade585a3d72e6c9de50320b9fca1ac0e054835005cd39c96400c491e1b706eca22ae2e9f1b844284226fdcdab1f2cc942a8280f7786e0f2cd069b9ae99f04aae424a6d24eb023e064513931b2e4f7629151af6bf83f4c5c58616960f080c6f96eeab07a87b6d7cef3fe6b071e49ed340b48867a5bea30dee332cb89e1a54d9e3a9a8bbb87179c6ad206fd48dab07104b1f887a02160b59f9ddac6d1f8801c1a8df507ec199e970e02058c749475b7636ba2def322160b11b21773fdf904cc665eb5eda887ecb6d9be245d3dbd85cde107d082cc6d8492a087166e23835a379ac69f5a996ad9032cc41e205078c5ec9c50f85c396822c057b25595a35471a2fc3bdd3f75eb8ecf2d1189d",
+          "padding" : "3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "ddad8eeace34f1eb1b0dd28db89ba710ee68aabb54b0a826c2d69355f63acf0f2f2e0dcb96f388d44d0940774d7d55fe81ba6a8a880aeee8ce842101c7e8837fbf2704971341d38bf3289dfc61a6b3b557588db93eef2789d3735000c8e2d830a32070626d079e710c943082a8bd1c0cfb64b2dd911eea76001f8e08cdc01cb072f027fbd9c72331b857d07c1c2f3090eca53accef8b3b015438942e8d2fd3406cbc54c7ec3797a163b13878881f7b4ef5ca45056e16e0c2a76c3d5108c6f0f48803d27eb4b0d55e90b19b6fe372dceaa61270b9efe2800bb259dbead955635ca44ff979bb054b5cdf86d4914ee553d7d5b1a49fb8e49f3f761224802858458f702aa4428964a32a45bed5738224517489f2be075f9ec7234a019005be922b8265bd78abdeb1d1633fe7e5aeb37b61d36b1a03a06847a812e50ed551853d3cdebffaba8b056b788a1bc452ebdb5a3f043a116e5a3d262c745fc15897ad4ad955595292a79eb85373d552d6079ad77e469f7d3a60330702125127b1ee770225cd",
+          "padding" : "3051300d0609608648016503040203050004404fb472dfc43def7a46ad442c58ac532f89e0c8a96f23b672f5fd637652eab158d4d589444ef7530a34e6626b40830b4e1ec5364611ae31c599bffa958e8b4c4e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "2ecc537edc397ae5c3c789638204ba3393bff5cd9c1f0552db515a8258a311b6bdc88325f9072d2ae67bcf132a92c0b4d01ef0f2916349adc6d8f1b415c86bce6b5afcf4cf2d3137897d0f8a33063a0ff69965a5d2ef00dc3e010094ec8214c95c064313c8e90bd84e34c86b2e19b056539bdb3c83eec23722b3e380a53826bbb31cc97ebb8ca77cfd96d3e6a2da59baaace3883c652a92e79653941c5615bd30c77aa38ad74c49d36ceb9f76544835d57f0cd14999c2c0cf3debbee17a8aba6d777ebd9ffd44b09e093f1a894a8aee80301c3a5a59626a79e445254cb1df1174450bee22a7518afeeb15495d663af289dbb09216543bccd136abf2646bac573551cfd04e6a35b5cdf9729c8b14d34c06660a42b3ab365a42ffe470b69062d0f305c733c43844565b0b94d49d2019933de9686088d219d57b256170c137a21475d03f2a7e0783af11426fc6e64895fb92da117702e4487558e8bd21db82f263c4bdc64065c4f66d87c87889ec5aa9cee02c95d001b08636dc3420f817c228dc7",
+          "padding" : "3051300d0609608648016503040203050004401f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "b9b492d4796fa2cb7066069a00e36aab8b8755f9dc8294401137efb3e2681c9b57930c0ba87b45c9d70e214979cca91a06562f710a2427660547006ead7b3e619cf4652131fd84999c5ff1c9a1cf057363b8ac62501bbfb1fae840cc963a95169c658add96c6c969d415c10bec5e2457a5c3fa4fe81e7de1afdec6f4e59e3fea185c7cd1bee4b8a42d2f22c7bad7d4933621a0cfacf0136abffc3ac54ea37c63af719425084cade944999aca3f43c7625d22af10149f39acef32ed7c92f781809aaa945b2f446a03e66150a524c7d88b7bec587ba7d6fe2db4ebb7a8c3bd46e7fa1cae291ff502acf33f003dfd1417fc60674501728e52490476d813f0079f56a9456909ccee3b76b30aca26fd4487527f4ee6283bdb2e72393d661ec0c35b2d1675f679f823fd28e044fed090721ba4c6be46da3eab26e5eb356d17d04fc3ac31425a6f6a50474e2725bd4dc30da74fd3767a122ced21671e47b1fb33bb7018349f7cbc916c6c7f4ca7334735a0e0ec18e01735107bd2ff02cd9508fa5832dd",
+          "padding" : "3051300d060960864801650304020305000440aa0a2e60e45f276fe3aefe9fc07c6f2435f143ee2afd895e4809384e833be66a6396c839d6f7db83f37736645454c6e63712b27e70edcdd7440e1275235070c0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "Legacy:missing NULL",
+          "msg" : "313233343030",
+          "sig" : "7d550b35998d60a62393379e47dc02b1a4530bf60c892c4e559acf9b9a61208dd9ec054c865018aa2fcd11a88493b54935039d0fdf5371436da96ccc342bc1440afdc46eb7bfb6595303b013037537e695787324cf9593dc156881bd0dffe8d2d22d4e90c1bcc801c9bcf12cba9efb7979a293dc2ed17ef787515e2bac8011286c939c418234df353ff9a5e0617615acfd7bccf9aa31c6681950947df67690e36369c3c3bf6c466e9748da0582acc76bf15760e8ceead43b5c2e98d87eb502d5a823ca69702b6936cbe36295b5714fed51b35fad66c819cf1191b3708f398fbe8274f1ce219e8cc77690f30bb7643f9ea472811e6216253c58fbba5d19ab738d6fecad309999a4d814c19620c4ae998a5f0061fa616ec0ab96e3760dc5d3450ec376a1a0292899212828768bbec07a0e1ffdaf4d6e5fd1ef5a2e0567341b2fc0a4944fe8bca36369fdc0177885d5169747103418e2af807c4715d94c2bef45f5eefabe8980f90a11acc01ffe0453e1fed8a7986b07d8f6daae2fdf0cd266c587",
+          "padding" : "304f300b0609608648016503040203044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingNull"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "a31ac04a54a8b6ff7e56a0fd57b356d1f854de8e0f9001cb216b859819279bd80d8584bf603999215ba8debd1e9e93fba985427be8e2169924a3954a43b58521e0c79e7a858a77081439beda623bb7b96ea46176fdd040682da77916fbeb77290e7c93b2e8a1d3722587a70ba56b8de3b2e9599bea708568ed88d2f09d7b9d0ebf9be2345b81d9b343c7392701d35d1f3400f343763af8d9233e40228aaff22ace45920af56956e07cd010af64e01e1f8f63a9dcc3b7b205de730199fad3e3b2f139c556748d704876af986b98785fa5686d5d2410cdd95f1c80a8ab8e24c23f06d5c40ea5f2be6f980db62b6d9b22cf7aed0ec00125e1900e50db95269148f6165f563b8ccc0d35c9867412c21f627ed436769842662c856392d3d0daef99bc47ba8f2738b4ea9d068b20c249d43dc01a067aaa8c249d43e110ce40de060c7c68866639bdd3c6d7b7b635b7ba71b44b71e7f68651b203ee07b914d65a2165791cf2f6d5dcbeddef7bdd7f786f812d9c5515f846eed933248b4f40a00b7735fb",
+          "padding" : "308151300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "693fb14d0d6089db3aae22e292e43627af0cbd67234983ddc1b077b4baaadc45bcf0ea0f36ffdaf970f99ec5ed8ae8a58b7e94db9028963e14c2f624bed16bf24bbc5aafd472915d643e690f6e981287ee7856fd0f14ace63a790676457ac09692bafca0014b2866c870227a976fff547812641a70993da32acb962a3ea050845dc533390175900c668a5f36ffd495ab7917b768c68407f4cfe1d20bedfaca38f9f609e74d9e432829da2487f957069dcc290da513d8a453cca27c8253bebba2653f82f676e663db0248af2a310b254b00219c5969f05d04fbdb9ea0cfbd746050ab25cd10de42a02a0ddf223d40e233c6a6597992576f2d105b72cfd77b2f319fe3525da8a8f084c305b14e090e3bea5c5eedac3360d366c47fe9cd60c6bdeba472d408a79031343bce42bb1ef5d6f4e0e63cb7ad0cd22e4270392ce711d7c8efbf0feb888c74793f2dd903e3ce894ec758d69644f654c5a75378b0e5c63a5f9ae05e0f4818e2aea7286416aff545c1048eb4d359ce1bcd0b26a28f55695b56",
+          "padding" : "305230810d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "618987b90f8071495d4276c5dbbf43c8a7a2b952d5f81a30feec15f3201243c92628b64da8c347a9877499c28e1bbdf63398485c1f88913f803789538d3011469cda13483841bf15dcee6b896aee07bc90e9f7245b016c41fa03944b1676a7fe392bef538ea1a97b71be9d50fae8c6783ad35470d45668634f91187ea61d2cfe959a869034d333bd6616c738f0a99bb4e7bc66040421c833d5e3e1c39fb9a92df063ba851b5cd149d1eb0ea903241297fab62cc15901e82d2eb105e9e037202655a6904f6c051bc79af16b2b9e043d32872ee85bf9592039822835bbb7dfe426a6200e0f0b56b0867ead9c1cd5b8e966ad72ae287da6e84c001d29a9982521d9fc193337f2ce4dec94a9eda41d17a45a60bdbcdc85e6ea034bd696396bcfc40614ae6ffab3e8d78d525163ea55be5d4f1f3bad866cf59089ff727f58e5fdfc5b77f43a3fc0e5507035c875577f247d4d00f5dd6f5a9a8ebd6fffb620e803060fd0e742d7cfcd3ff408ce53b1003a351516ea42a47fad8a62313b8ea03c889754",
+          "padding" : "3052300e0681096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "d7212634520ae65f540677f72d8f230d9b40c37c9307638b1a8321ff6e45924680a68b89ba73b2400db38719906448bec9c35d5c2da337a9e39c82adfbf658507a74799ad647248ab9f21d2725d565ba015327d3a9a4d0aec2c4d2a34425d3feda996851e7547271e5f14543008c556a69341338d7ba9ccb34f42a71fcde9e410395e5c69e6b2c082246075e519096c0745786cc275e2d3fe65c6cca95d97a1f22410f8a2e0d2bdb36a61431b67c6b98f5a34a4592bdbac008dacd7acf7b7a244d5b3edd63e631a4e21f9b9809d832b76dbe82b9acc4531798b1f4a0ad9d84ce23d39652cb5d0fa522e98d442ff39656ac129c5a2611268a534089fa7c58c665fd276790c067e0b799be17975b0388ca2f455b8ee54758a184d25738d97ab9bccb4fc884d59df610809ec7ff9a8e52c5c8e93fa53e69b502975dd595d30496d9ae18fa8daf48d66292998e5a9a815c224ac0a21f6920f08f9f70fa60363cb67f386ff02223ae48300871a84e6a9e2e76e715fbe9fc156078a79f0a5f369a7e34",
+          "padding" : "3052300e0609608648016503040203058100044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "d28388441dcd3adb103515a74be1afffeb250255ca7528e955b94e7b8ce826c97df3f371da7e7f399477c1bb033d50f4bdbfa982e3d5eddb6bf45e08dfa41d5bbd976fed018d1b8bbda013e79fd80c020ddf5379e96929cc70868f025dce41e6f3dbc220b3cc6fe70d7a4bd0659c60fba376d672016599a44f89b62aff469e7e91b24bfe645d63cb0cb03902e8ce8448b41b5886d55ebf054ddbc21c23d571a4e6a353a5f880ec2478d206a2a08d431714de562bf2aa6a5885e0bffab51bce4ed9e243eeaa5d1b2297dff1bd844b440e9cb270b6ce40b76fd79c7591d3f38a719190a5992664f24b8bce0f4d050e8072ae4a27c51b2e284304af4e2ee2dda546a8ff91affe20882c119ec1caebe406ae2b04eec9bed107cb3b66420a730ecc797c028bd97f9dff631512342355b6efb3fffa49d55a9a5d5ad45182e16f7c378ca36135a520732bdbff39d525c89c0a3118c68a779bf2f2f43cd560b4d11c606fbd089b046fae8f01447d661bc374d2b6a0e094e7b40abc240856404d2aa7364b",
+          "padding" : "3052300d0609608648016503040203050004814043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "0783d81e403f352d1140b99d6cbdf63f413a55ef9a64fe1fe019adfe807b5fa59a18e63d455e0f8fd61edbeccd392a01e09dedfe28600d1c7507b1d81bc814d1e835a95219cefaf7525fc0d03bf211bc99397bc8fcce685445263a3db61184a8e44edfe7ee48e2a7a5e3c8c7f28158a308db3fc35d822ef6cc00e8df43ab1b0a7ec2c92e3fb7fccf8f8b35e68ff6d31657aafd756782996785bee97d3ca5c37d22b44f8a1a44ed6afe5b80b9659336f3a39870b5de2385630f3fe7ce3c91bb269ecef7b3fa999a79518aa3a06fb626a5a1e48db98199c1c4d7a139497ed8e9682cdcf343dd03b4a5a056edda9e7101d2da5ed8d5b953e765bd6585cab5a27030a8c909ef69e61c0ffe9cefd2ffbc6f7cb26f64de674ec5f4395f7627adc72203fd6362c17bb1f262c430e502a258edf86076336499fa89efe7e1298c7c932b0893088430a30d7309282cc4a58c5ff05fa3f1dd664b00139c309831b8084e9f3065816844fc3074d7e8bbaa638dfc2fc0aaa74380a1282e65c7934be1cb7cdffe",
+          "padding" : "30820051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "162e2eb2457e28016b961ece8cd8aa9d4d2f4b06a9ab069cb79238f5870075de2a9755fadc5c78c28c82441c474718ee905a8d7700ff2601d7c56d7eb5a9d7019e92db6897c823925cfa75b5608c7a79e24af37abc09c89008be7b2ceb70170c6d1404a892d0804cf9abde53f9aedd13815459c3c6a1b37f7dbfee6e4b9e25143d9c64a6a817550337d0c74bb5cb6c7b5db2bbb770c67037729341cf25aa880b14d39d71e66cba9b62e1ff89c348eaf4efc79c0de4734171406295e346e9ce7562be7a5462834f1a00da1d4d54d7fd7fb12430b4096610fc96ff1bdfb88609d6a961338bae78991b05f2c80d2a131de5eb3477946d0d6f5f500a0fd93d57e0be3518b60e5688d8ba5b25c2343e894326129173b86dc315fa183a0d96845464f24cc020dfbc341f4623d6732ef699b3af9274fb504422bdbcb491c8cfc63f6cf6adbafd4f2bb671b92b6f4316ea456d9d87b8f3b2228e37b0f34f2d1ff70cfb0ed16d14ad3ab5e89985d4e30e51e4eafe69c0cf6ee5cd1ddae25b5585622a8b45",
+          "padding" : "30533082000d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "9547ae982686e6c57123cc12864b93c8e55488e90ef6c2b6779538036dee01392b62066077be8102cfd3d82f46920bfc29b6aec0f29bd56e71bc1dea1f287cf48b65707b5c950f60313efdc537a5ebf6d8fa51ab448c70e9e8726cd368c615c75218465f41446fb8e21beea8a0322f443f125b09ac9d4f4e1978fe93f9eb9ce2fa924a384a922e98a023f20c6fda672082d5f8904429a54d0bd60309d6059f76d66de8d02eb6bea880472f8e569ffa06c0ed88065f9b93f1c124ea881c0cba4d1d2b13564c5c1b221e6295b74840623d9d014e179343936bf583b8391e89ce5e913a6cc3db1e510f63a951bde0d83758a4670f0be237c80f9d5ca851ab835c5330463cabb8d31f4b8e188a3a226d2553668b773c8ded433df5de155c0653bde5d06223c31e39055273e485c78366bc84d013a277dc0ae44b48d3ced278506f2f07e81f74524b0a1353ed6b6c798a1f8e9a421dd8248b81eb25891916b2183580cb8cccbda2d5f45f69451575780d0bf3063f937931367f28d15d3b49ce1626ce",
+          "padding" : "3053300f068200096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "e2d20b15707ec4522a15239977be889b2f72a23f6531c14a14da66c59d5cd647a90441c100985055cf46e4e3d48b00ab99f2f280e5678918af9a7299783b35a1ec63251228d369f61635a6f6c6b228b3a83ef26ea1f899ddc009eabd33d36c325bbcb193fbe1bec12ed756ed02dc21d56d3e7934f3672a3591c655102f766a371a34983d40ab34d8b9476e927c7e23f094af98c9c0ee30df46641f8abe5241d9790af6cc61a6de8248f2e7039510d1ab92b52dd17d8dcba345befd58da2fac4794ebe3e7a41a1e704f9b8fb900b505df8d46a0484d7197beff7c081505616b8a5ab8c6cd25b7dc3c0bcc500bd1a2577c1f499e83cd228c48a0f40164f4716c4ea7dd74b8971cb21a25ea17e3d07c77106cc18652f82d8abbb2ede781e0e85ab668ee1d8769829b8be77d457991287c8308258d9ea2a3ad327f9dcae03fb5f6a71c419fa37416fcebfa3422ddec93c451a7f93b0f970df21be18af1399abab90c7667c1e9174e193efac179239db64a44590c50e52278f460785c6a399102e0b1",
+          "padding" : "3053300f060960864801650304020305820000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "473f662190fa09abd247533dd2d4cbd1880ad6419cc3b3b1dee6059d5672b28e768560c604260a181c41b6c33d9fd902163bd956f67011de608b5a7a0059e2e0be3699119afc8771c44f7f681ded984d0674754b0813fa906ff8d9db40e1e48fa25af65ac49dfebaa30c957e7ed0e06d2bfd04ca564f881dd8cb075a6a708eda0b47174c66386a5fa1b4bd2f8f2d1661d2eae0065c95560da197ef5644c7f317da9a8dce7f42f84bfd099e9cb20bbf1fcad1c4307903e18c9c5595ca8a0bf2f4b2c3c562561df21de86329a7bc5059209d05699b888848723488b111c0e72a0d84978b50242d94ee47e2df4a0c953947d846e56c9c9aaca0543ea13671e6e8b9e3c3799cef6582bdec5579f2edb171fded9e04a900c61c429cbe09768b93a417f1c59b92381682bd66d0018e94cc75dbdc0d37acd85877fa229db0eaaccd9b1e4275a9dfc2bdc60ccd7ad5a597e85c443ac95f878378d88453074b83d152d9ce4f583b57be32cc13971504d713c3ccd719e79303b0c1a866e21426e1049ce3bb",
+          "padding" : "3053300d060960864801650304020305000482004043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "b17c7e6b49469e75e489f9647112354316bf3ce3a58aa9ae41544f73c8e1e56c284667381eda58b3466d3ef16962a2619d718f93edab9aa12e5be05f73cbfd4d8e546bc936ff9043d5c048f93794d68c9f8d99805f85665797a27b84a3e97883e74ea14c180aa2e5c0785af69275d484e14dffb50a4ccee742e809a03da229e70ce529d0166439cad74ec6457016b92df8e53f8ed68cc71229a1e1732b15175aff54ee34de4e908e9b6f9e720417d1a619ba9c1ed70a55e4f5d9bd940532b2f58700f404cee86c8ad9c72ad7731b8c2a063efbdb96c7b35d641d5027d55e8cf6c317613373dc303cf84a469b54df3c2ecf5cc8d1bb3882dda48e41b9e5a3dae95ded93f230959c547ef59131fed18c269a0d5c2be16891071299cf1bf77573fde1535836cec1daaf7cbcc50c563d08a79725d66d3720ecbbe1db7edf85ed3c4a9160350fe94326e3f0440619df346e33aab6333c1e38b9f34139a26778d0b0e64b8c4746e5879fc56eaa4c4641171f79f4f3fa711b9b0548cffdbc39929b4ae3",
+          "padding" : "3052300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "38f8952c63cb832a35b8808ca9255ab12fb5c27573f29d585cc30b94b050fc9e179f87821a2cf8d23f10d3ed6f2a8f461bd098eb5f6ab98923647f87594e2cec18a776af433cdf2b77dce0cd853651b50700c9812d2fec7a9760388f4c26da6bee3b768574644c4069775ce21e81446a9e7aa2c97865f4b953daf7acfaac13e75e079800bc5ffc94090ed6842960e03e95753be39e94dafbeea1745fa7a4fefe777ff5d278a8444c07e3c8526e80960f6e2146900ea86720fe35c881a61e3f23a32a6bbfbddf049084d9a6d1b32b9c2492161d1aec9479a8891c7b651d13e34e784e5a8d3cb2f5412d322689591a98b41ef9b010190e732a5ed0d28b695f6ab06870ebd23fee44845cc64d4ba39017047c7eadbc16a1e35788a9d2c2ff02b48badb7bc4605225b7b631913b19683b6f90e634582ed64c25bb6157f28102c4560945b6baa91dcc551b4a6bf2b5cd2adb8a0aa87e29c502b5b70bc4cce2e197479f9923c3ca35e5437c849d5264dc18cdd3f6bc7b88fd9182bed11f0cba3cc68b5",
+          "padding" : "3050300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "b24733b208d83a92b4a7c6d64209fa2ac1dbf615954eb99704ba9b6eed2a545aad13253234d88e0afa81277321a8662a1c9c59a7ff932c6b2889e44ee47e25e730427665a98f02b8897b24ee3036febef294a8ba02ce60b9fcd6aeb592f32daa1a79afe2a48f5097971f3a72ed3680433d93da0e3f19aa7d37082880b0c3745b86be89d184162287bb6354158ced89bbef14faac68649d995a4ba8576266bf5464106a82cafc07e4ae4dfb4ff3f6f0e8c713d3fb73673e75deb3fd04098c7c939f91594e45323432f30029122afd4e812475f69ec05248d6e2deec18e7dd02c7e9cf89cfdfca8b3412410b1e271023725272ef0d9fc72f35a94a484bdb0c1167c282dfda53a86b72922506d51adfab81df9dd257787aa5fb6033bd7fe61a577a7abe5b48174a3b2f7bf276ad6a6735593440867739851c91bb30fb2f6d279f35aced179d231dd9c5267cffd6b184bcd710a365b29957eb98aa81f10db84deb3448e2bd8ab50dcab06fdb3a2b1290eac0e60dbc4114243540585ec78473fe9297",
+          "padding" : "3051300e06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "a336c6c475b3ddb4f9e58bda547d867c25b155b19d14746f8fe9b22cafabc05aca001d019352e8e96cb0afbadb7bf16998e5052b834a0045e861f646fcfc07347079822e64dfd5e72c2f996f0d5ae5d31596b93c77fee310b046d9c461ae9637ca21020e48c6745feb9b7a8f7e98e47be68214405b55d81d190d0bcdce483b2915544108bc8daaac9563483399a69c19c644d4cc36be4333fa9e9221f17b0ebd2885e57e84d31bd615e438aaa7a1742f0d6f3779c55ea3dedce1940e819cc140cf887edde8506b4c919edf3fb6505293921889c3d6704ca6aef24e620d87d6073c0e9f8a8c43f98fbba9e84fc9c445bff081acf6f6559dc0a49c9acd49c1adeb11ac31e38fe8319389541144dabfff498addb55d974082988503adc422d78f3e6c1764baf174c451eccb13e0e2f9791512e9a949478109176671f56cb3b8b841fb55207bdb7dfee0b7d76ae95a76de6f6ba4e953ad0431bbd23311ef17da7f4272a7ec4a34c08501d01965c4ab325420f6464dfdf471fba6f59ee78bedc28524",
+          "padding" : "3051300c06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "a2d71c57b8e78998da1d98c13757bfd9e0977c5f17ba07e47bfb3afbbeb3a377f8c4c78c8d82890b57a311035e2225942adba57859490e004f8c9c69b71ba818fd1ee4c396215d90580818ec2d5f71bb3006596724541eadc981dca096fa4540be86465274f19a6d47836692d7d0ce80e934ffadaa70f110b08974a32f145d2df260436b0524571b3710bb4c7726d093c90fe333a0fb73af084795e7800a036445ac90a1f3ae08803053cbd06b9dc19ad70d775bfc52c9f2cd7096b4405ef62eb5f330ac6110d5af0872182471f3d9c2ddd65888f902ed0bda98c8a3faef74e50e39841266be25698d28705a577ba3c2f14f59b14e91f70bab478995155ba08c7e5a819b0310121845e9669d45095ce1452f426285e2159230e0dc8c4098cf01ceb3db982a88aaf7940d9f3c59a4bf9cf42c06c11ce61c21bebb92169a04ac0b2f13972c63a7a42d64dd67a6b8eb2d707bf059d831485fc7a73784621b559058f5fadb945f4228e9e01876dcb903448eee5e560539af7354fe5a4e4cd0ee586b",
+          "padding" : "3051300d060a6086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "dd00c9e4579457cf35a1de0cfa01a1b96eb3395deaa2ef1dcb8a1f1a0671a28794db39b0432f00ae28435e5a0055d89ed6d9a20cb1be6aebdfa1a78db7a1ff13bc35040019729f9cf0d344cf1978bcc224e5c184dfe1d7c64a38e9ab3af3703180f8045bb55498e3b797e2c7dd8f23a8341c8b49d8f8eb4d08d96f109ed96b42783251a10365bb6b8a6f0941e1063be9977512462e84b42371b31217945b12c9c9762fdafa7b450386339d0f25c6bb8c9251c09cd58a414e95150d84834657d06bc8d2bbe5b36a18ccd04719c598374299c33e795ababf0eb2a23a053b3635646ac57b88a13b519b8734b1ed17d570dd167b9f95a98d67f0e36b9400e8e6bd61208be53d335b24f14cfe07d32011db038ad0dfe99277fa970a208572f805bba501399d66c7751db984272c89d4d8633af03872f45ba89026aa45e3b63ea861c104e9827d1e233127a79796f1c9ae60d6196c3f299dad4741184121617f9d6ac7bdce2d480e783568955193b0cc2d2272f3e5ee468d4ba84a89519d25926112a7",
+          "padding" : "3051300d06086086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "985830e50116006b97961dbbfa9939ee492284b10771fe3d3910275072e1e2b3d1f4b00a3ccdcaf310e04f10d4ddc2deb544dab03236d3263ca743e8b40c1ae24d025b2524bcda651e7e128344a6c009a148d48504f2c8fc4bdd7dcfc6fb3c66755f35e4e775fa498c1197f0cc1d538afacc3d087a3638220d7ae845ec79e255ecdb8917440026e9f8686c18b1e8dff0d897112bc19b087089abac233b274827d4d4c88f99be595974de26c79917a94772485c94391465e19588836205138cce5d19f7f62ae8fabdccb724c8f84a2d60c03425346189f97613f79ae652dc6b16e0b889b7f310361e52d134633f8cc15da56aa6a560de0c895fedf6de4dcfdcbff3cca6f10d2631119d7d75e0223ae73ad6f79b2f9bc32e4d28776e9a5ce4f733d824c3c7aa0162ce77a438df92a1f53d1878bcc4848f41dd0b0e8c88775d98039a05b91ecd7465186f6dd067db053f3557bba24cf4cf6a372b26162b228a8183484cfffdc7da2f9cc15972746cdef2e07e6c203209ccb7b925373d9f36250120",
+          "padding" : "3051300d06096086480165030402030501044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "c67de527c6b72c804a52df6e44b4fe2e408a9f048948ac16db55b664b5da6044ba9b2498a14f66a83ad76f1b2363f393d85b4470d318114247c6f33c4110e24801ca915800adc98e8b3f88da6fd84be3db00d09f027dedd60e68cb0b467c04d6bc4c629c168f6ca46988b6165347aa885cb954cb4a0d2ff2851b7dbe4cb55eb89ec48ce45064f34d6907ba62d0b5468b316753ed36b1ec8b8f36a05adbd59cc03f1aca50001bf59156b9065cdbbca855c54fc3dae251a0fd1c130f545b3e2d51a632f778999bb2a6693fbed677206b65d9ef04c4dde2e5fabab0ce9668135915389dc498d1641c2a504bcf62c94339d3111d64c5fbb476d7cbde4dc72dc2f1745d02e5da12fc92f9949aa672e9a567ee4dc760610fb3f280a9612b24fb0a367a6b041e5f9075d20cf27f33c34c7a005cb2024468f2ba51de56829cfe25182fe9c7ba95c6314276852b2739c4d7da4514c58a53db655d0a7cd442e3f5728e472b8d0bda4e275c3a3a7d9734a35409ac8b6bee2def19f1507e8b21e278cbad13a4",
+          "padding" : "3051300d06096086480165030402030500044143f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "b41adc2e291efe76182d118257243abc0f8e46353ae3acc7f22b1474ed255be6fef75c620e362c04c875c27a6e93d0beada311c01143a249b160b92753687192fe4875cbabcb09ac137db95eeeb06d9b220da294968bbfba6c0ac2e3e0089fa8038b0a501d90ec64f5270ffaf0bd135980ea84d18f7ebfb7417397c35d4cc09f7099ec5f9c5877b01b95056196d726089689189bdbd828f82ba621ee6c51e14f46de40529fb75550cc92b51887c7746eacff279ace83426de329484e2b3e366366a9570019a8e87802c8bc8d1188e1839837c3e2d108448bd9b78cd9f4d4ef7d2e038ebccdca08365115b68d08e39babcf87919918ee6d84afa8f2acf89e4ebc0847833a18b28330f6228ce6e42a1dce0144772a306e8e6abddc9970769c96ebc0e4c4ebfac7d02e9e87516396ef8134f182b4fedead9ddd8e5a14ad15a395009d58b1839b3543c9c30c01255a56ff93075b7cae3f6cc0717d8b932ba4ccb186a9af42c0df16e4af298280dd6d19eb9b806c05a9d08f2dfb436a9a4d8eb6d60d",
+          "padding" : "3051300d06096086480165030402030500043f43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "84d3cf49f14eb7e6d625614743859b9c1ef5a79c23d3c16e25c492c85df8c3d8f5ed0a6e548c042a71135bfac1d209cf434700e8a6247f8d9bd3f1527ae63a5b797880edd6b3112928b9878a890cb1d0aec6e84cd5da2d3191d590a57a82577c8db2cc51e8eff17c64a6f445ba202c9f13af6b20d5974c88f88bcac534ee80eae451d72bac360511ed77d9a09952937129790dbaebcc92014bde155de59c13ce95784ccec3b4e9ff0a08281fd30f5180f62667f3a2575e67550281c2f3ee42af8b9cd94721713cc95841311f81cfd5d50883d063425b8a307f8bab6bc19441eb5eb256b6cee8126586707eec75465bf8fed4bf010f00633f2d2a216af178f3439fe0857921a92a642b83c7edf45b8b7f0e280cb362fef1e6b77144465aa06968971861a03c8f6e6b0cc77f713a1417ee76934d441784fe9df0e65aa5f439a0cf9889c9366a213fa2f9302d8a70b4d9cf7707687cd2214d720eddf7a61eb0edbe679df5fdef79f2a8df50e90f26be5e156ccad330a3f81b998df0b610383fce24",
+          "padding" : "30850100000051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "f3d8e162aa3662eb0648048acd70eada84b12a7d15476e58e47f7720bca89a0f467f7bc2c6cfb17273d0ee66c82c2e82c7cb184d073af6a601cfa7c8df3c7eff348fd32973f8b3502d5257639016ebb24cb6011deb8ed816ffc44f262f03799b122a0c3bd7d69df064a34b166d7f138982fcb4bc2332384207117986d92bae3a5afafb0836a892a6c9403cf7054bf02a82851b35768ea77498b4d12a6e85018aa59623644e18fd9ebb4cf3490e8577994836a84ce6bca85ed3fce977e0fdac1eedc81e4aef60b9de47900b9dfd1b67a0c89b0be88ae67a5307576ff84a7f99f3f030e2133a51bf7af75142f59330e2492973373e64f34a05ba7f2262ebb91f144a89cd82906358e5a8bfdb5e7da91c2ca95d0e45cd2bca9912b27af36f45d4cc5535b0aa95e75d330cb01bcb01e23438d0bcc4207a2a7fbed4d762d6a81822993bdb42baab84a3b9cdec3dec31729c831cc28dec111605924ae0ce6d6c16ea9a605171a82cb11102bcab108229271e2167ba6ae715500038d1186204ae2fe685",
+          "padding" : "30563085010000000d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "2c425edd6db32c3a52db746211cd9394a47a93dddc932e3c563c9a6a556c5fb4655009fd1d9a2645999304eb0972edea50155e6e1db3ee990eebf35a5a078397c284ec71205c0fc2fd09e20716f82c8dea46ba80f86b837c63809c2df1e51a05a8c9300f2140796fc3f22a851d98e96cc7d70a868c47dbb6364dadcb6f92f1af23c42685fe28c0cf5935d1a0d22be4dba0719644caa84eef15660aed1a32ecfa5dd5bfeba5c84375e5b92735d48d017162660149f8577837297c52522217a2c1adfc42c6853003a75adc7c011d695f3cd17d4266d73bb07553e146d4a944dd072124d339785e7b03382e36e2ee72c844686abba9d273eebd06e202b583fcf74bef871e1f2e15bc99366cf290eb87519cdbf9328da495e392f2ba47d05465f0f555ee915c4a28ddd14ecc82a26e88a2b74e4eed0c0e78aa8465345067c2fbbbd3e53b2c9c7fe69e30bf1c6500f9cdb1c953193d5c334db68318b753d8477ae8cba456a60b1641fbb6343cd0511adf3b836401ca20f01ff2dbc332a91396495102",
+          "padding" : "30563012068501000000096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "809455aeb2529962f94c2a7a214c7c449df1186c7a568d808acd7f21a898ecc63e23e859243702a7279a873109727d67a915ba48df76694cfa2370e5243386cc7751e2b0b40ff511fcbc08b8fd523fc094648c42907d3c30d21b6a3ab74cbf6787001a1dee5366a37a524b831be807c3776fec00575d3d723d4d4edac2cb8875f59c03f843bb9b379e833383e42bb841308a78fa1200f727bfeb3c418a7cecb03814dceaa65d21f8fee9707c198e3ba77b66a9dcee4af4662ba97e3fa83ac7c92694dd3bbf6360016923f0e6bbfbe050bc1b1a073ba08d0d567aed49ab215bced50d2eff95159810de874e174f614751eea978690aa868219b12449ccf74c6ff79e018428d8d41b1ddda2c4abf7609ab48fabda5800a0b97c0d88f546a5674cb507b909bb2c380d1c7f34d65f05a42a872456feb2e2b97e9071d1f17152e2cfe9d208353bd887eb36659d9468d7ec809058523347472d5bff81c44102c9b1db841ab6376d4d16c251bbc9885eb11b7b3187687d15635fb51d9ee918efe40dfa0",
+          "padding" : "30563012060960864801650304020305850100000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "8dd51dc50f3f37d9c4f4ce243a23ead21eb389c27478e295d95abbce83bfa439b29433b550c4e04832f16f59ceb29a7c8c38546a8b5070d37033229cae1ba097b18c05bc590c483d9e4653ce0d8d10734cbf74f35346c6d09867d5e54453c701b9ac228225900272fc916f1207e791c9cda36965935ed16a51ac1f38f773194744eaf00d6d26999ab50256553be60f7679c7001d33415ae3bc4a1cef1dfa720a65e4da6fbb87dcbe1820518b2aefc544a27a627073d6dc5e1db59991f70fccddfa909d7c1a261c355993408229fd78ec8cd889e3f7c686f5db7d66f0aecc750ac49b3fd5e4cfd7702fd2c8181a2540cc7c6ba944e2928eb547b8cb77430b1aeab5d6d1d374515106084abcc8753d3e92370bf2af7685c1fd4dd93f4a04a1dacf15109617f8652758d1fc9ddd78cfbdc44db85a5e233afa29ed6d6c239deadc93a105f47da8a77b34a6bd4ddfc302a3eba565184f3ebe4e086437edadcff4dbb0aa17fdc50401651de60ce7738d3fc0d5c51144be50b4d36b62a33dbe7a55fbc0",
+          "padding" : "3056300d060960864801650304020305000485010000004043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "bbb3dba33bbc56a859bfe0cab3ef7ee4fd1b9b8196f5bf02f55c3fa70ab8eca32d5e2d95e3166d5137b7136d21ee17fe5d790b37f51b030521fba37b0e1aaaf5bffd62db0421bc82798e58f6b94046519adbe859675acdc9efd050792a3ececaccc3dbd774a9cf426c5e58527021cbe8212c9158baf67a8d3ca0361364d0fd486f0402e8b5a94894b3af023ecc6b9c0ec8c9b717736dab8ae1da1c1913df84b6a5b7e6019e3e53efba2bead981e49316f671816b7222deeb8f3f4875cca353351d810f271d3c2a6663e34a8ee083d80a861338e22ff97e542878760ec0fcb8dbb390834409754b95f902210be72d7104abbe1a87979c0460dcccd2cfa5a13470855ead59d0d7554eb6b5a12611c5c1ec9db3ec7d3dd795acce3a2c4c71bd55c15986562689e808683442ddbc8ccb048eb2b154a66e6e19af41c233d6196155912bb1a020fabd6e803f04fab88fc677162b0d98c42500977c002774341c3fa455b6092d8848958c94de4641a43a269cc6903e512ceea3512351a05c52bcc2ac18",
+          "padding" : "3089010000000000000051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "4ff317feb7f29b39f43c6dfe386347e057a97c5063007322c8ccea1761e5285a14a25cc84af041407130fde5e7e94d5196cefefc485d1c793432e62a8063557a0764305b40a7619b8e9aa9b395acd64a1c1321fed36e2187ade19b9a25e52373666cea888f5c699da92a59f2b2db76fa29b8e9d9b78e6fe42fe9d722c524a59a3ac8d7551ad5c5838c4ea92685ec6dbb23b6b69eb07e8a187ab78af4ea81c2d14977be336faf8169cc189eaac340c9578dc6d98148a14844c220ac1085a80c5e3e4c6f04a472cf1a4b893aad0f3370d56468ee1cef675b5fb77da481f128ce8aea30c67fdaad92f26db2df4c45000ef581e1a0f323ffb69e45981a6c1c8e45ffde22b4cfc0045fcb60e127820f4f1b2568797dc34ae29e916030ddc55d78629534f926a230c4144543d383aba05fd3fd1787bd70bb9fb8046d26c4d7034546452a682de60bac900337e5a27978e5b709475f4e01a1d57a00190b5e829d81e82f38450d3a21b5b6eb83ec0c491cd17cc91b6c0553d857a55fac7e8dbe378c95e5",
+          "padding" : "305a308901000000000000000d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "80a9e92817a9edbf2862f1ecbd3029cd1ba0dbc7abae4ea0ddfe44f49c177319a37b646c41e7caa8153e7d88b174e720fd911e7bb09d595c2c46f59168ba2a6a8cbee8a5cb86e2440e4bd7579b6de5ecc56777ab3b0184f77d3d1757ee0e9c9d08d8296eabb488c4b91a14555178ae86f863756ed3a8beba4f59ef90dc75dc3f9d5faf6d4221dd13a6ab4e353a97b59d431042e72956cfacaf8fd95772c8c66ed91c8dc901436e508bae2db4ed99230ec54d0a13436baaac811b78d01050444bf488d507749e242086d11f147b385882d1046b855d335c3ee5e35ebbf7ff4e712e8bf76d4733e6e0f7b84c5e59fd792b89ab1cc456a89dc866bd6b0ac4b2aba3ac7218ecaccc96cc59ac357e1d9705fd848a94fea3d2034b657fc816466c376a55b98299790874988d078330cb19d8e354193066da3fb1aacce6ca61960d115aa3985f02a7948531102b1e473f73303925d8ef988ccd780c55eb0a3ffd35b71d098dd39d42841f19b0de234f18ce8303a4016fd09b73c911ee9609165382ae34",
+          "padding" : "305a301606890100000000000000096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "5936466b943bb0b11015c946373444d97e2af61ba6e67e8a4004c77ac6818aa8bfb5bef619d1267fce4f49fd40e6bf85690ef69d821afb75d6660d0a023fb67b7139f7316f7fde0ddf9d75c3073f1f2683dd02fe0c7a2a2d8551cb88cf3a4c1f4f73ffbdcc29e0fa0f148c7e6649b6f8e7453b708d7f019473103465a24d3b8dcfa98e44883b3bb6a24ee0152a4263b8315ddf52acd3d2f3509fa5c6ca0428aeab323ab77f0612e5e74710b515ea8ce35266540ea31361b1bffd59fa9139ec39962bf5507c0eb77161945e71270dad21ec30d54d9e97f088b829950bb236c0874f4c2ed134b565e7b0e5b63555a57d82ce6973e11f5b737077e336905c87504a24b03846f38a9fea414d7c7a7b902fbf34be86a0087d78935fb0302011a51c778a766751c1f0b11d014f5c33b5a1816eb86430d163c5e3f75ec28ad8f315db53294b5f52ecae24fbf8b1714711ad60766b3952e459b7ec9fd589ce2605bb1c11595e4580434cff6f748c00bf176738b21d2dfef0c44338a1c05660edb59f24f1",
+          "padding" : "305a301606096086480165030402030589010000000000000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "471a17bf9d8a875f1206e9c139877b50389e96d0fb6c15e2f5208ca8a35a6a11cab06ef4b2b8ecd7518f2a546b792897747f9ba849550aec6bcdc268cab059b63dd69e459e317ef3eae7b508bd9e33f4c58578b45a47364e7cac4629d43cfb9d6c4585bb2d8a2f8caf342c4004e933ed6baf652d178538b8a0cebbed2447906f83261df3edad17440e0eea7eca270cd7f2b5a404d6e72565764dcbf57888df3a0b8a6dcb52405b6819af81bcdf36d5c3e7ca8b73224929cafb9d1e98bb1be32f2cdcdaabede8255687d8228efc0713bc901855fb63757b9e755033cbbf09941824762bd0ad53c724d3c6fd01877424c2107e5ca9c1f7e84f1f9dea83a9f802e22d3c2f10833c475a3dbbb5b6544fe48bbcd25248da0357502e9c5f4c00914dc41171038e800082767c62a9c9ca6ff06561f7cd35d9626535fdcce5beae3c9505efbad478915936dfc3947f86776a25c5fbbdaae42922db2607809033ad2296d602fbf47f0fac1c0a281807c6c9fbd68f4d45be8b1d1a0818b0310558f7c81558",
+          "padding" : "305a300d06096086480165030402030500048901000000000000004043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "c3d7c56f39e387328b551f8e33f1a8f6ebcd8375bf8a4ab92df72c732e73919778388f0a3aceec9f6753133626887c3a5793cfa2e8340466e8c0d602663cfc169643a46eccd913085dd1dd1efff1046dd441b1dd071a558c629573ba36631105ad76d89561f284c6321c9f35b1c4d5e588cc93be7c62b2db5b8c52526c8815c9dc5b755431de7abf8b2ae5750dea20823de561f92ec3630f80606a0638a18a7aa71d24a6e19f6ac3fa16eb77f769da4b27ca1b2bde187d10e297f6c8ae8c5aebd84e75948942bb64504ca0230a6801e58b23a7aeb2ae1458b5750a894cf6c5dbf3c60b86ee988bcef8e30f21afa7197e4103fa6f4f1a87680eec6173f480c94e11f8db980597e38c71f36e3c68215d810504ead6ff1b1291ffa5d178708ed3b0e5b9f5651fd1df9c18b21deaf20b1a8bc6de73de6e7337315bfd428156fac738542b38d03bcf1403ec210f67753e5b73db07d363ee85a595c205bf25827231df2bd576167e84c659e9276c7611a92fcc1e06af925543c4b11bac35df7ad14f34",
+          "padding" : "30847fffffff300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "b2b73525c8a556fac8a98c717231601636d1ef1f6d52265bdf3da2236b35d6e673277bfa2b2b1222d6a90b50a30877447573210c87fd85a48469185198af8bfef4393e0b46b416ac0cb7fff2be11860209c340e470bd59d84dfa598b3635a5bdefebeb35feb4251157ec940a0c0fc6fd5ab97493c3e9c663dc943bfee7854f2da6f9b91a9dfacfb88bd21c15a488bf2b08bd00e311de4bb2aff850de3dbd9be9e73b9ae4af9a2dd0a7a3cea94f1badd56ae6679f5cb87cd3eb7ee6ddf7ff426686e551d846eb8399124e23d6b87897bcbbc0242cfaf48f8e08e9d5957b30bbb4dc942bced416ef50388b25208c5f4824ca875c4ee75eb1a705c1b5b693dac65e447e06f41251b295e05d4c5137bb7c0f451a19adb61bcf1282ce729b3ad581596d99c5876db7cd4a614112bc9d5557187b824a266434276c3ba8bd30c7f1541844a262ae8d4c09419c6e21881a3f4b0a8c3d958abd7ac0a9d0e7f1770d229177ad8afba36e324d254d36119d13cf1a47c93f0bedfb7d1776acca7c9f14cd56e3",
+          "padding" : "305530847fffffff06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "4c8c062374efddac383db9c6c0fb53e6687c202caff3378e5499196496956785134abb5cf8c9b1ba586852e2fc5da928643fd375515930fa101371cb855611bebe46e374b8a5b4b2ff7b19e39fe09d8fd72be6183a564570f1fb7b488870d1941f9291d183f323bf9ec606c4388409205377d1a59723d67079689d4ffb138656e30ab4cfff33a0824ef98721f83498bdc7f98565ece6c627aa71844d9557ac6088f1ef2dfe81260c57b84b96d96afbf87e3c18c86a0f3b77bfd99f3680be9c022486c964c4c1de8d777486fe9dadf8d3c865f56069c947d634055304623ff789d5833c73ee381fc4c68ebda227593eef7ad9cad4ce4e165b82273d8bf8dc2c33004ec3c2be3419ec50ae20e8db48c2dcfc7ebd769ec0b04a4c3932707bd355e9d5980670408e9da32a5c90308f8ddfaf9c55b3b7be081a30c2d9cc155f2453a2004d3686041fe31f3473f2dcf04010469e2c3552c52d722e6d0e09947ff575edfb7b780ec77c6868e196229159fa197299008ceb4c8872877c692bc372ee5c4f",
+          "padding" : "3055301106847fffffff6086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "98baea66be8166939f2fcf1cc35963c154776a65fd7e58405e1fce04e2f9d7c25bd8a56be3b0f937b8c521f7e2a9df4c98297fc2aa696864696194c7e742a9769fad227db26af96f0e50d613e02ab24ad142e1642c779ba4ad4d4bde46ac19deba7a694e21659048468bb4da16f8436bf9def4dd148c9b1ffb92a5ce9263a65ce6d729ae9976c59d5de757548b11899704c62a47703fed0451944a82b3e2d592785038edc11a5da29975a5432a2742233b9e9f76969cfd9ce031dd16d1120e2f8dd1965f99d3c5d4a2b6486cf952fdc01f227716b4311154bd8a25939ecefb416e0cfd169a89f3acaec236f3dddb13d417748216fca0e32434ebe953cbbed454c263afa1ffa23ef047c9b06114f2a56109bb77ef58d92b9bc01bed5eeedd7f181628b90df2fab3a7d6615b01d41b9dd1a01d7c467fe1acb42cf7c7111341cbb0fe7f673230148b972ee2cfa781ce2ccbcdc467b8a6aa1c20196ca4479bc88ff06d8a2f0c19ee272997a0f43f2d0a02a0a6a8a1032ee8396574fbf79636970735",
+          "padding" : "30553011060960864801650304020305847fffffff044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "c8443c63bafb0f500af4dd195734765d5177e2b81016fbb647a64642f08701cf00cca3a15b76ae0f60ca9d1469d3e226d5fbcbd33ed9b249def58f54ef90000df2ef35394f454aa232e3629bd95d021b393c7c5d7fd32a5ea7cc1f5eeddc14ae8d80c7af0d781ce0609993c52943e71e01659b51cd4726f9c7d9f8c23ecd6f946dbe5991f4d064a7e7ad92278a00efd19c87a1ceb5ec1506b14860e12db6817556e279b65504a97ade4aedf84e2f44256d88b7db263be75013b3b4e19cdf4f43d1861936eba689cf9f33e1bd514f294fcf4a37c42c2b64d6d40d3acba6b437abd74ff30f2ef733829fa5c5fd00dd5b9aecfc39ba72191130944347360fb721a8d47085aaa33e35b6f5ea43cfe37d71da69ac628cb496bfec81d0ec6663436117b58d5923c09b345d399425d8176f072eac65d3fe6823473c5491c4cdaddf004243ccac1fbb5133e14d8aa59dc936cb9ca1db1716f2c8a631a751b494ad67d3c2cbf8cde2c609bdb4e847a4e318ec19ba5bc804fb92e8552eaa74e7d6a5abf16b",
+          "padding" : "3055300d0609608648016503040203050004847fffffff43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "32506bd08dd88da1d3a3172ed17a6d1393f40413bbf2a7fa4f9393314b7d158a905c1e528d4f0b0c47417d20234f55e58fb9fd87344773b311fe4a77137a829d3a80dc77dac5170e32be53c212404d2802e1cdf982cf57261ae64d402790a7ed8efa42d9d807698884d23187c3f239beb3007b014e324e9f5f070cc225ede15115d07da064665f8dcf5a439cd6ab2aaa86cb4b7bd0f8d97c1c9a1eb3b416702b534ffdad74f447428c04073335bfc96b6f0528b0ba541ddc7aca70e37ba0b9acdb8acc1410bf82d5e6a8effc291f5701565d468c1578025f529be0cc7a2ae473eba843dd72ea8a6f9b3022c79d05e52964287ec9c2156745d4a14b304ad7d52da8a45a854becb8095917a4c7196afb2d73d35a7ef65748138a46c69253f0f67970daa38e0d435fd8f8763e9eca8d3be5ac96618629e30d285db481f23906e8a145f70fc8eaa71e451421501c579446c9545a1d7d033bd9ddf62e587b97ad7925b60a5a69ef383405126e4e0061b0349f9cf292641bb2050a86fbb505a68d321e",
+          "padding" : "3084ffffffff300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "c0eb720b105f53c191b4e62f76d6e49a1c2319c89f4223f1849b0ce95872363e782531d8a1a5a45e4422ce872327a49651df41705ea48087d797e68c1fefe0b25cfc01b457361ac2f98f2b6d675c04a62aa32f18aef7c488205cd1d82c6bbd14708125d86fba57f2c54a667a31a32af54d8df6906c07595d2dd3147fe4ed42da82377c88f44b7d29c8c1daec6230fed36b4e57191d950ac98c78fcbc6e9405645b3c5fdd69111f9e3badb199888d0dfeb69ebef4a4a39465cf9fbc784c59c2fcee8e367387554148ee6318b8a23d3526266206de788c7ec4d93e60e537bc3a13a99add8087f5a33e6c8904050a9b9e2ed7efac91db3e4672a192b6d11f38ffa57f5420043da23c4c1fcaf46adf4f7ee4efaa5f72ab4560953a1e9435f93b00a8dd4b5865d714ce5d026a0ebe9dd56ba7d4b35f33fd764c04850c5dfa91fd6cad03d71d41845eda65f9c36c7117497e82988aa49f553a510e812ac475a0c510eb03e0d5d531edcee01c475b7cfe94a77bf45a22e06307a9f6c6953d0117e3892d",
+          "padding" : "30553084ffffffff06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "f6c8f078a23885c0028b37ffcd85c2bf29a853c4e07a65ff76299a9b9ff9dd4fec9553188fd352addd5e0d0a968b8c58b0b8d501cde7dff6efb40a08420e1ebbedd9d1afe0caf03392e8b1bc075e89f269867d5a04486c6fd64247c0cf2fcc5c6574013bc353264b0fd396380e563137a5c360f13e41a73c44fe6b5726a0787197bcc4048ba50c553e0e7ca2ebfc153e72c57f3a94d8e0ae1f48b5565883579ebb50e3cebbd289e378a284bf6b8c6ede76edb0285516a799b346bda815b860c913182ece4fc3afda940b9b027014bc08e0aa05be909204d624e0dd07d2a883271683936eb8bf2266f1f41073c77718fd675299f4c250222c031f24b0d1aa6d86c5aa54098324efa8704aba7d32e4b9242b3c440e82a4116c20bd1b055d64d9b4b2460764751f92c901706c6865e201da551e8213d979f6997853feed3bfa973e6948a20f7b3ad4d0c5f8e767b6071f0c095712c36ec226a36e030e8d5b9efabf2b626c3eb673ba8c14e099dd22f256b90321c74b4666eb6dd86037e1bb80dccd",
+          "padding" : "305530110684ffffffff6086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "c2caaf308875c6fc7942adce507dc24fab21899905efdfebf24e4d189cb46734eef0547eb68b1fa0e9d3be5e8714f404c0ed1f98d31896f2149e34ec077d493849e369aca2047efb7b4e8accfed92678d41fe8551bdec8bc6073e467a26648b91b885df097c25dcfcd8477301eae038cd41c90d51496412be9ed858dfc111a3b45d9f1b3d84c0449b7f18af43064e703e3724cb73d49db2f92cf7b45ba16608ed332b7ee57c05edc283f7eb572d9fc18ae1d50de26655c06a55fbe09e3d68d61953fefd0b0d42fa470c6751282e190fa42eec5c2a0bfbc58df41198a7e52af01cf456fd5a50375b54edba81902aa21ea0b96919b95a4d605ed6022460e6e811ab23a6d2b889738aeccc2480519e8d3c07e10a9f79b6fe4c9feafd6d62b5ee68f8cf840059050ac40530a8b09f1767dcd6c6daa488fae26fd9daebfbedc42e851427b738129019ba4aaa0075710363c5f3f798865acf910d9be639468bb084c6293d218c1089440c3dbe3ecd4560af4ebfba79b680d944af3aba9205c73a2e7ce",
+          "padding" : "3055301106096086480165030402030584ffffffff044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "448f9991dcb8b062ab546671a097260dcaaf68163440840eb0232ff8a2bfc326d53dc49fe1e0aa84d190522b3020166adc2820fe7fb51529bb9b52caa6a50bea343e1e2169f44476bf3b38ed93206d7f3285df546b674a570fae67f1f55ec3cf3023827dad09b19efb3ad90fb462438a93e3c6f555c8c9fe235c35211aefde711a2b81a805b96c5b5a27f1fe1b16afcb95cd0cf4337d20ffc20b8f505a633972bae62274f15128ccb061822667a6a14c6011193df2d43d3366b79e8d5d9f49bfb8cde25771979fc3dc58b1d5ed9b2952b885340eacf1bdc88a9a83be6ccada327b967310c9653c08985975e15eb7852ef9b815b5530d60217c9b3e2acf38c2618fbb893fd03ab47011e7a17b2acefa5c5e7d09deb4bbe283f5c8a0193ee8273f826afd3ee5e035be329ab04a2acfa6e4f8ec6f90e4e9c8954e1cb4fd2b5846643be5ec81ebbde608deb60a9448e53f7b2d592dadd0734b99cf150dc7b1dc32b0b1dbd68074a2ead3c4d885b404e81162639a34d065626bbc98a46066f6887318",
+          "padding" : "3055300d060960864801650304020305000484ffffffff43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "a90662e02c0b8f5452f56d7343ba207ac0a8141977c46b74923a68f9dc155abd0230dadf771262b1c02db06de7bf78dc40904834e01b7b8bd07d48cb1f0dc9adc5dd140234b7ea8eb51ae64b84ce799b3948a8c7e3601328c3ff520b712fbe037d4ca78353d8b518660a0c0f61d3141f7b6a010e2f7b644665a2038a63174156d67f00fcddff3315d76dba6daee07d8315e518a376b3d4f695576670546656e538d7eb8851497c6e8428dfa0a5a10e3e7834a23968021c7cf17d2610254d411d2a9996fc8052c38c322004fb359bec00b4a781e4dfb66eb842054fa7ada84797010f1dff65a0729554266086e4767dbe7c174b8540f5da25578a3865caea12915e4cacf0284495c208dcc5096f861997d45ed89e534207c79737bf420dd5c9d6a6e81a5064c72c3cfcdd25d8a3dcaf2a9968aa97f8189a37db4a228ac26894f3218c1466343ad41d6b292621e795289bbcb5e80740ff91283012a7f747e0220ab94a8ce96fb54c417e0ff6fb1795f078ef6039939c24b9dd32d31c4b68069537",
+          "padding" : "3085ffffffffff300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "d8436c155e096de5d22e627bff7f42869fb228581273e9eadc0c3f35be02077b3d37c8c6e4fb39300a1093af1fe0cb42440caa0564f7a78295bd1f8946a218051f7257323aeb227d80f3430576da12a54687c96dda4c2ef7e359d5fd17b7d77a2fffb09480d17a60c80f30c4e06724783706b210212ec11cdaaf91cb1a7648b3d197a4c2f4b79380f356a06f026358a5381a4c975eefab6e9546619cf4df87ec106066448644a415820af3136deb86d34b61337b4b0e3a53ec136ce8b26f949a6741bf067ad69da068af1291451b0b882544ba72b74248f6f7df5186ac7da1946c4faf1e1e0f08ccafa7bae6c9224d1ccb6a5fdb778ac4e55ae414be393de1da87424b59de23d245da78bd714ac7d91103c296d4407ec50b61f1173248e9aed1b19ae50d416d9d2cc0464261ca9caf17060a0190baf5e1e3acb9992da2258c8338813b2a14dfb1da5947e694a44e9aa5ad75eddaebed2f837a2b3cb5827ace240f754a9542e94f9734d8ebf895a3175e978731726c24922daebb40ddf75aa1d1",
+          "padding" : "30563085ffffffffff06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "beaf12b6741d14ca48fe9824bf8e47c9d08e0fdf9f5538151dd92c85a039bc8d402e942bd74de61f4c1b7bb3dca3e41afb93cbe35db66bf58d5770cdea919cbf0cfd61febb4ace8d7469ba67bf4f7882f0bb756bc766995c458c11406b31adabe63b33c6203c461579e4c79b406bd626156549b9b222122b1a2d22f6a8d58d0f79bf212a61ca58ed6ce036785f7ea78aceb5490044b05fca41561d4e42802770ba24bb1e7cdc299f9c3cdce99a4b22c80a6086484048132933f0b8c5f42d840ab1ff22d0e7d182571555fd503215685626f4806e07b811f560ecb0387a4f63c525c84c3b1640be6f8c4f7a7562ef232dc10723b7008ab6463f7f5019499499c17c19852d7c60d284889ddbe376e5a4df0505e6cc7dcb69f04685d8d0cbe6aaf127a49bc61278d35d7b9eda9533939cbcaf0f8f8f85f5972ae842920dfea6e14fd5b1416c9303388bd14c4092e6fa86c127e6e8d7859a590cf16a792c3b03f71a72a49e563b7e787aa2982e76031e63c9b81e07c6a2cfecfe3573bfec21a8e9c2",
+          "padding" : "305630120685ffffffffff6086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "b89b0c1f2bd605ee42adcb8ec138f8953395f21dbf983ae6f86296a561d8bad404de8999478d7bc39e9272366b37457a968e68a15d585ab00ce110c58345f290c53432f066c77a027cc8b5fc1509ab3c52e7b095d58e9d245fdba75d206274a01121521f6e6560300fd2331e9a5e8b03a139bc7a6b636e5e519cc7950205bfc03a0ba272ec010b96129407e8a6eade7a3520b56e1d68bd2edb4e0ac3d97e6cb5ebef9a0c9acc9df7fcaf0572935063b2e6912b1bebc4563ed36c295ea3ea27495a11e41ae83fd8d7fe0437947346950b87a44af579713ce590d4fac398aa961590c1fe013cc93b96ef404fd2203313d472a05d8f0fb20822d54a8c3d75939015749523897ac13f18d36c5641f5436eacf5dc02c659a4df5583a8e86b2d812d05da32d0ad9cd5a82e045fdcd558bb4e5106de858bef6b6b5f225f7512cb3d3cd7a23652deb7325328ed59e0fe922c94d5890ec582056eb7f282b48c9c1054dec9c3fd27f4c30609aea52e89e50a6b5408e910a18ba5111c545423fe23e043e0d3",
+          "padding" : "3056301206096086480165030402030585ffffffffff044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "e447af5561678214e302bf3cc4f4023df4d5ac8b27ad8e1586290bf074858cde3dcf624f6ddc6733ebad8ce49bb87dc04e6c492aa0df5b2726260de41353507cc15428e257e8f1068b79972d1f55fcb4100686dcf2cdba809d4ec70bbb22a9c4bf89e338bc63ee180ee4d65cda949c25c2137ef92bc33063ef5580cdde56f72ca206e38db6ab8825e895f5cc3d02508ce7345b16375892f3fa16b11ffd6076cb12e54c9abeb095abf01b4da32ffc977be357a6fcb4c4ba7cab3e60bc5772a83903285fa0183ca87a7bdc31b5deccd55909fb0a6a4d82af45e42a0d47c57a7541344d864c8732ac3d1f1f23cccb3f196f20edc6e1412a3b15e645a5582a9489ed697f4f46bc9a487154fb609dfdee41c424cf09719aad6c85d3ea1c122e29a8e46e0af8e7052fbb100788007d98b4a325dfcc3c4bb1eebf4d0c3c0812b7937713e8702be35a725ca5a0891f78a854188cf46ec97bdc5b44bad949359dc59e9d3e55bdd891b9850402c5ee055197065ee05d702d54f3ef7ebd7a32d44602e73383",
+          "padding" : "3056300d060960864801650304020305000485ffffffffff43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "385dccec5af89ab079eb126efacaf253d560d2f0807fbdb510f7b1afd9bf99bbd2f37e1a35c6d60517774be91f5f182726ae5bb031dd5013addbce8601b17e36ef790c99221dcec94a5f78d4d04deb3cac59db4dc87b0fa48e6e1e846c8efa86af95f13f28b3eb32b0b5afc71e7a74a713bc9f675629c77325527212e3a033f11722314f16b6f5597910a26aa71042ff8ae271d6adf3a294eb2af5dabb0406ede91a9f14fbd8835f83e50ab2f47756e287fd4f0fe09c73ba13b84ef6510a40a0aaecbc3e2d3451024ce5e08617e8b88cda10d3ae277636c13b61c2f81dbb1ffbdcdc4b681f4cea0ae6f9d30858b9576e5c4659aa89a5a32410f07fc6fd4ffde8f7cfcfe04a9b8b9bbc70863360b71ebd1b0c9c04889a2c45c24c9fa259e51deea5c313a9e18e8e44ba8c892b7e3cc1c3877cd7531b4886dfd7eb0104ff2af8e5a886774ea7114c24cb6fd617398c4096355df008ec9a27b7bbf6220618ecd71edf86ab2eac7506de4bcb2151605f767e3d7663dab57df275136299af1e59a5fe",
+          "padding" : "3088ffffffffffffffff300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "475af5abd6944b6985018ac37700f22f00ea36a9e1d6072450c5e8cc95ae37f13864b55ebbed41785a4222648e70841d3e5e702efb39cc58fbad00ef9629af8b9390b994ac91e366fc85518dce5a777553019604896d8b9130664cd5f40afcf455caa40d684ed09c3c968779b06a196b8a65966ddebd3bff289b6031bc1ef8ef64d69b9f98f47ebd8b28d5b761f7950942a714f487020a9fd23cafa893391712328a275a2656076e1ffac7ca816268e17e0ee5e71636c8757816d1f7cc199850c09cecef27db8b854023b174b8e266ff1694a05f78dfa84952399ed48102fe170929bb050f8d4b1fd2e5150a010b77e270c50c65585c36e9e6c860b20df609bbae4340070435f7a8c7acced87dec7f8bc4e2232098632794f2858f5ac5e13aad50c4c187bea9d4d7463530bfe565543079748d9f1fe794bbf7a7fd525a907d7d533e3cd2d6a8e40b26773084f0ab15aaff91c29a7c094b88d45ea39b37c14204682f9416226d11fd577dffc543066c5e954c1565c400fe07985cbcd982332e1e",
+          "padding" : "30593088ffffffffffffffff06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "f50372a93313b5a19689d40356e10d2f6829b9e46d14e613ee1ec8fc44d488b875ba440508c8b20d40124163fc5d7e98c8cf85943909b2c224196c08abfc2cbbaf24f779c672ef8f9410a7e8fcc9a9e01427155194433ed9078aa46deb3e4a1dc8d68fbdd3ac1280210fa3ebc917947a5672d58568ff54e85ae740e4f53f1c00a664efcde4937fdf3f6fa3a0ad5aeacc68108810e6e436f6fe8b3ae31bcfcebd3b7b679cb74d57c7eb78d81ae9b78e2de3716bb971316f6e2c0d1b474f74370400109bbf297efda08602efb86feb7e047bbaf92eb73332419275d9175943ec0d1a70ed8ad3d63f9696981b83b0003c93dac1d2d8b9fde2978993b42939c9e30c3b3d2da67988a89b8e1cfc22847baf8b390a0d3befb92ce103264f9fd91d1a9577b300a9ae5f9f0a77c41cf799fcdb2e188f9afc8029a5a88e76ad3b4688af5b272100e522b294af1fd093ddbb3f82e5f617e0371faddfbb8dfc605e2b9b89ad65c2e5df4d315d5dd4a16c8ae6b96ea289a6774fbb06d666f6e5039003824674",
+          "padding" : "305930150688ffffffffffffffff6086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "22dda4b8c0af2d3038074ef87060d100822ccb58195fad6c084bc1fd81ca7bfaf3ad5bb766d265c48eccd4c3dc0f16e846e9ca36c5b49d716d64ad0710ad327d6478552267d5b5b9f6afb1e0cead454fc48f52b5e414626fc235d9097939f7e68f4df1076032eb024ea336ff34c2aa046252d42ec38b4001d0e1991fdb64b41cc69cf3385c9b32f0b45d56680e987df8f7616ff25f320f8ed22407ed24715ec190233dc4bd2fcc9ead1b91dc17fc807bbe8a7d47df0f9970c36d8a89d22ec623492fe028de0382b32d56b91af5954f515a76323cffe09052f68c35955ebc158b8d069e25b63e70933c2bf914d6d41e23cec30a50b2e35d0a80ed378cf9d43e7542fa656f4417c510abc6a62aa71916d0f010edd19403163d0e022ff41db48a7a1f343ae8589c86b7aa46ea554df5b5e9786ddf0ca3c2ee976e5314650f39c6cca280b09dd787257fac847d9051136b641d3f9d4c26856149540d6bc8d6cffc4c4446851a832c3c65854d341ff040921e9d282ad5790a27c46407e9c8bdac5e73",
+          "padding" : "3059301506096086480165030402030588ffffffffffffffff044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "557241eaacf5e190018db935feecf28d81ba14e2f91ce295a12ac5f48a9d7c7933bc886856b0a4556243b418b1f7ca3d37e3ac730e869f1b9ba119ea6c1b7d1ee906ed1e7fc31be8276b18902cfe59333b891dd864367e268404875452162ef0246be23a46acdd17234569778c887430f17f16ed1a565e97cb7e1dc2f84b68a3821df2177d4c1967b631362fbb128cbb6706b6128960169c3db606fa1b6e31e5b21c7ec1d8ef29a0138c62f902bea7b64bef7971fcd036164d4416884a97e79f641d10d302533790405f248cb502080b666e75041a6164b0cafa293f4d6793e5c4a42cb4041233d7185898daed6aa0044f1ddcc9c3ff57cfada82142cb54cb06868ee9c13b305a92f6efc4af8b8e8a569c57b3ebccb8bdc19e76ab85adb59e7075afd878356269c63812443c84d13f70c22f1c98dfa05faf85904423bb476b325244de80f8cbc874a5311a106a5b977d2d7c1c053cb2c9220d8ee34fba15757175e7c3ef5a139df245a44d08ddb8fb4525f978073c034c9001bd6fbc11786cde",
+          "padding" : "3059300d060960864801650304020305000488ffffffffffffffff43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "201e55e5d00bed299bbf003fda2ff30383c34b8db32828a0737b499f7b19297fe05c4ee5f50f404d1fd347c4042754f327e0aa634a832d098dc8c4a2019114569a48087dccf8e30dbebcde638c8f1d1c7c61ef9f15c478c8bea4d9ae0d5629f2a420e9d1cab335d3237ee9675ed06790865b901cbf29de2b730b77d8319ff9273aab3e041656226c129048040784edf4d13ee1def8fe4d52beb55394b34817c9fc5b64bf6702df68211b637e3f4211afecf8884867f614cdb0eab49a70d5e1e61947f7a2d71416dd72b826968592bf88feada316812301b82694feedaf8cc6f3e2542ae0a3c4023d3e8a9aaf615b8947355da990855538f256927325d65d4f0799039e911cf1e0e9e940a88f771a0e4ffeeccf91588a321e26a48ff2da5d921a0666deba235f7decbe1a3f6b929202227724032af86872ed2e436aa11712173cc0a926b31bead6ad31ecfacdbf98ffe30e1505a42036ccbc76c60f216486ff7d7286324107e95e935a9eba9a4edfdf8f6d76d49a9a9db3aa86f7439609a1a0bd",
+          "padding" : "30ff300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "6419ec844dfdf0475c7db66d008c87e999d7ba56b4e567c344c2c6c06d8b07191f0ad831843db5cc931a96bfe30211447f639781c3563ff9d1991cc0e1ec9c7e4312440f801dda8ff5016ad5e1cd12cf69fb34f4b45118ea3baa18502fe291522b5c7f5016c4d770312d64f18401586904f1a96ae8f99c539026a3aa71967af53dfb88e68de1007b063a581d88720f7f5c7c52c32617b1f5f2cf3d4a2964456f6bc97ba97c11f7fd24f8a632a458d1cad6bf78389053c74eac14221a0adb1b813e957b3ff9a65d143b9ae9ebc8a5def0b0e8db934bc04eb7c91c62df274b50c955c374b5081af628af9f7b86486197688b7a72bb634d849be226cf8960b5cd9d1c5ddaef21c919e755ed17b4dc4aac8292d433ecd6b97826d338b785903e6d059d3a7d051d774183c4344c9119b93cdc5fa50ffeb644c09090fdf0083bfa9ef37d01081bb69e28f6d3e4cf2d8ccfe176d961e67f2ac58dd865d77bb52594aaa87be0b2979c3b569055f59ddcb5926303b3b9109c372d79850af1adf1538a5779",
+          "padding" : "305130ff06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "df8d82d8bc8e14d29f72c862238c5c350ee2f08b70898fccf17d57fbf082d3e1a7b4755ba68d971190dac33dc1053be648ede6014a272ec7f7a1cde09315f90d931ba1df8d580542569dbe7e28772a7b11ecfb904d519a73efea0277209b596141a1a86f455e6036f869005d434fda24a0375eabaaf9b0e2a7c0ebce38a18336c411af96f31147b611132ba2b1ece8ad8996a4b604b4ddc3a87d85c8e58f0406b0f7fdc82bb6e1441030cc9ab2f610f084c2352b296444340a1d12b49e3cbbc065ef2e24e17516e181feb60789c45b181a3639c395471cbf9e013dfa56c6d5651fa0c1021fd8a2158764e2d8b4a0340e964360389aab5446e8617ed15ec3989881e2ebe086c0d992a7c56d5b38dcab7a6f92de59736d6547eac156ab76ff68a079b8ca062cfdcf1ca8c6f0b7ed1d70c3fe04a143a88870a7bfbf1a5cb7914db766bd91381f31b0dda66ae2c778cd751c676d725d3b8798d9793992bd4ebb0181af7c4b6533ece8251e524aac8466e025ef6d31397aeb15e4bd92a02e20d1e51c",
+          "padding" : "3051300d06ff6086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "e070274d94d99f502616ae11eab00aeb6f676b5bdeaf3f6e1f5b9c406ec6f56b8ee90d077f26ac42c0886b24213d38eb102745787eadd5b99ae24b4a986c24f624702902c2f43ed8f6592504328d939800a336d3fb742263d7b907074070673b24f5c5e8a9b402529590895d06c823c3fb9d5c933942c5a18878820243ad8c210b2f98b9163146b75a85ae1127ec1b9f80bdda356eead3c79e5d03a4dba63e382be85786c8c2fc28a26d028a440bb8057f3ab64d13a25ebc772de177e3d755e9866fae37ffb69aaf686d48b4ff07632bdfb3dcb21f666f5458465601e5793744c8a3af675b31f777d4fe7d59787d880939b2ef17156e293da74d5024e3715b866f567423e9e0a307c88397001e1dafa88855c314e5a5ce4e635bc9d3308996b8a1d82a5fb3356c0c37e41e5752e679988521c04278ef37dc112d999bfa1ec29be16a20ff9b8585ce900c234bcd064b1d7993d273982a3c02b026a58501fc5241a9b64ce34f388777d6085594faa5ef3b7f0b992648f2e050397cc30edbf3a841",
+          "padding" : "3051300d060960864801650304020305ff044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "5693dd850f0170bac3e3530bffb8a9bb80b1717376b7736a9e13a343e3bb97211a4ddf47da7edfe019ae1f411bc29d5b70db962a8f36f85010c276b1141b14d42342485d81ebbc291238d1470687ae5f4d564c3f9e5d56eef63f6206c545a80cc59929d16b1916bf36de340552585db477cfe531c5621ced4ed2e450e9b995d8381294a0ae0188bbb7ae0e4501e590eaac173bed94ffc6c92cd7f95f759615b7f7152191aba74d62d10c22d7be5abc8490f659c337f612e21f26252c0da5455d5badf164b135164fc648053ab29fd73a5966af21f33c427ee121ceb563690254a33b764c6239021d83e25a0ae2d2f9b0b162907a548c28c34eead5b4226bac554789f95b7a7486c5160e345780c28912a7c5510bf661b00d7bf09d2a709b30e66fabc369a436cc1f24051e010d5e66115724d4e216cb2c2d5480a72ceeb694e7adafe963deb72e2d32f6a39b2bebd0bc9fcd9e32ec1d58d238b385fd967db3ee485ab5d6938f36e0cb475a61d2c93250e30172946157ffd67be345fb9d8a1930",
+          "padding" : "3051300d0609608648016503040203050004ff43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "7c70ee1645524561876a1b311f389b53bbc5350bb4554e02b427224bb121ce8211b51ce67caece664fc45fad2df211c579e888ab20ad3b86e13b9adf5468bc161589778767486cc620822e1aaba416da06082f48b7331ab9b2c1dc32dc03fd9243b658c9d701f53fe46afaff90463ef6fab2e2467edeaeb01468f1b348d23106bee3637428482f2e8f65466dd9f9a79b892d45e17e7ebe1e0e4e0a227094aabdca782eea92fb78ca38d1e2f9eedded60f91388136f61c450ece1fa08f5fecf50c3e195ec6ab609cf5c20ef8fe342d90e21090a97eefdbd1a69432e2de36d8932b580a0e9fc7ccd027e73d8b5a580fa37a02cc0e304c895cc9f2527a864b48f531d64983e830cec0aaaa9895dd5ddc80a86529dcce89bbb69b6b8b03774e5c03f2412796dc07b5353c52420eab2664dd3ad216fb69c2a74f3bc2a1aeb8efe29602bbcfce10c077ee5768c6f26bfbe0d52ca169275fe87b26af1f2115d5ca592a1c8e63198c4c5d088f2b49aa6aa58c5c0bdf6e836c2cef0b34f7e3effde1ab9ed",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "71e837b50fbaebc31fd94343e5d6e5f8bc45c563e6d263fab9383256fd5ac1f2bac07f6c0d8d90474a1e985ecc5a62481d372ff8b37a867209db1f4389fe80895890607b01f0b44601206a06348813a7457b7a97c7fdcb1b21b2b4ab79731f351a515e2410f93646f889fd391d398a7fa5a0d21b1ce57f6d8c438262e81160dd0c8fd43325ebb6820cab91da203a988c2595268294388049df95b900cfad08fa4b8c5e7d2d4023d0c71d18604388a422af8e8307c6451cc2f206a70669ac7177fb8ef3532b0b3cd4231d350a315b340b9e6603b9b9c7831ef885a72f0f4ebe16ec9a7de4a90ad926b1a4843546f830d50b66d3652b9deeae9d9cc744d3d4f2152d3949b3e71fb0a9336fc8ece6fc733d63c0fa1141b63639048167e1d138a5e4b50ca77382996e7af183cbd330843d378371758be58a657a286c12cb6d555874f38981059a895b2c5f0e77ec0e53c97dd42d64060882bcf5d1239c007166376c0c12e9740b2ec3bb6416a23ff4794a525680d3ebb2c77fd697807044ad720554",
+          "padding" : "3051308006096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "376ac86131ed100ff9dcc808553ca9467e94b564faf47c37a9c383e5dde02516975884fcbcae65b294483f74a585c2d61977174f86df067f826f60c8820f6b99fc78eb830106ec1c9ff4e5706b0de93829ebda0d18924503e92dbe58f68be94fa8dbd16ee7b962c58a1eefafc0a2fcb63e086754ae66e5e3366f8c739b589cadab242649e737a983bdfe88bfe239002afdec11dce52597358d79cfaa72820a37cab83b03e23863108920f435340f450ee66bb97b000cd12347febda1b4e55bac1f4835be2a77fb164dca4c1800099bb42f20fcc0a9f36a7bbadfe979861dc1767dc3c58000fc4b4d25c6d4f929333256c5aca2f7bbed9c9499785fc623ca1686915e7f46d66a888f331dc6d1a2b34a09a526908e9b2c19fa2dfb66fa4adda319023ebae533dc57f3fe9895e523ab67125e0d296271587774642e44a9c034ddd876f67c2c1cf7599c31581b57ec97df1841b5716406fb88ee991abab2a34f5bd06017947a1b43cebe448daa1d98c47a56e813e74a42b3ad05c3172cfc394d5304",
+          "padding" : "3051300d06806086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "9f71ed0cb9f065dc961b8ce1a397f5c3eed98aacf7366be7a6c62ed2c770bbb675081565e57d0805547d36b8166acef4468a2e122f92504263a716342db40b86515a34ce3b99505af3668b1e94e6d9be2ac4cf8b565c4fdad32e575a84e0118113e74875ab59a627b18f01b3d85d91b679de5d18adbad1391233fdff71fd1b08a639ff8d86a28b75f161ca0c711a11ce506ddac3fa450de7f0225c801b1a1a4438137ffa669c2d51d8ebec054aec406f890ba4baf52ab45d7e32f1b32d828d3c6d5cdd673dad9d67d192ce1a66c0b0f46725cc4499b8ce302e693a388b69d10ea58fb87c76adb1ec8e7a998f430380a703160b55b62bfeb0b66ecd0190435c387f6dcc0297603b68b4059d88bd671ceb59d34534f7780292c25f0227a7ac84b471714b74be44104817591c981dc4f795f7162beb8c5af79b267552965aea4cc97ce44524f3f812d455bb7b25cbd24f432751c20557fc16a763430f7541b97c4249a12a7891b67c964e0afc6c205e4d6ea5c531b6cb542d64d655341c61af014d",
+          "padding" : "3051300d06096086480165030402030580044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "938394f2a86941956721d808ccc01920c59f3d99370036e22c8a1d381a83feb1b4bf59de0dd2cbdd74c69f284a52e3c27196706c84ebd8dd7d08f4024609114d3fcbefe06ff94df832a37c8a8a756580b5fa5dd72e315bcae7fc0f94f5aa592f0b171c9771d5c4345edfb625967467b3534cfe958a76adc1337786c634db7074126570c080839f7cf8682f14cf8e62c8fcfe86d2c6fbb5cb32ba7982c924f2a0833db59495067cb20455e573d60af2ba687ccfa5ea0b0004b8ff7f49eddac928b61df4c865377438700faa2db63142cc64378fea33289478361ed704f9d419415c6b91d310bb41921b0b09789062be03ced9fbed5587414a6c0fbdf91c98001c8d479683cb3bc3c6cfe2ea222d3b58fe49bdb1520548d193333eb37ab695a99c9b98d2f8ad2de7e8ea12dd4740e11bf1a66fa33d3183790624dec2e25f20ac79ca1e605afb4c7feaa7c15fbc8bfce4835e4e2bb60b3d4691f9c792c954cac2a432254b8e293166e90d20e5ff6de6026cc696e5849f9b1b427212241b15791f9b",
+          "padding" : "3051300d06096086480165030402030500048043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "d7cac36637ee8e4851c5ea7d95d46092937c85e34d6a69c88a0beabe329013ae2ff61c4753a1670cb08d7b407b28161ac50f50f30865b563e684b90b652daff6b6babd850bf208969466accc03f5a48375f7de56853dac4679f1cad8da476b306b7d007f61a1dc169d1450a9bd25959b1d2b0ba5d043e4ec05e897613a5aed53fdfb528057140202d90bcfbbb47de8dfa7e95f5696ad245f2a2061e90ce825366c1e9b90996bf24c73a5dac95751bb9520b4294a76217c6cc3e0ad4e3d37ce4ba67ba09d7fd597536d90d3e65b391d589d0d4092ca44113da696250a6981dd26f4197db7c2135c0206a0120b9b42c08a1ec6730694e95cf73723dad6d40fd1871bed3fcb86678934dfc459131c84f5418b76d1786b55513938eb069e2f788460fef763ceebff1191daaa8e7bd811fa6b44d6b7eec52bd2f62b8eff81fa3b5459ced8e8a8b02d2c6d67e20117eb6bc3cce5d77488f9fa11363e8bf99129a5de92b49e23066e5fb6da9d352cd9ff6e0050a340fed391cdcf23d416d443a86878a9",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "e7b23269693fae38ea2261ea5acb4fd147c47a71a67272d1b1e2ea49b6a82d6abfe840cb8f2f756922eb6d12dfb9a3c95f9b1acda189df076f6e127e5a88bf3c745813ed9d858ea25eceec8393c0dae2acbc6531df80cf591b2f0bb758c1404be3e5e61e26dd194406ac42ec7b925142b40888b4a8331ab04932a184a586260861aa7eb597d873e21a2a36066c7c7490379b01b6b378a013b965c0e0f77d7cc6ae56e5c143811fc6fcf1eaf16bdda1d110e27527bb49b98efcde70bc742b307478dab7c693c543615fccefffff2410453ebaf289a9440920d230e556766902f9f4feb6e950f88ed1b4a08320f6ba997171f56dce8789a462be0ea6ef38d0195ef98fd79d51d1943be9e1649b221f5d087f96a4dcbcdf086161f1de31e46e3f65e1b63a2176eba38fad5ab259bf375d73b6d7227da661181c3b4a13d7ed2dcab26b71c0e1554bfe57318809e32f5b09eb3dab4f5d385495a1be1899548bd4cf4d5d6ec5b88eb1b69d6c5bf20a539af5d6be5bebf29c2813f1db6830258b3eebb6",
+          "padding" : "3042044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "0d2c03a46e39606fd20a39650049b00f2c218a92a590d887e26f33953e9cf8174004c3bde1676d9b3c17ffb7097670fde1c99a378c49d1134c67b82867440a4b2857237ce10a947333503a63b571beef37a59b3511ac6709fa3ea5d814d457af1a864ad365bbdaa383c862c38af292068d839728bcfc1dd5cb7b310baadf1d70419159191b33c6124d2d9750b88eed87c71e811a7f65a5946ae5ab6ebc8375c6d7fdd1e425d4f48b149d2f48fae14e6b3b97f53639c17a68365cb5b270b52bae1c24042776144b9e5d54932524cc83af8eb4a710f2d301276c215477f7192f82502970d5a332f912c0a9ceb7c4104eb0c104da8fbdb3c624d7e87de20b770dcd568f097cba0dc9c1b2ceb9ed4a9d73f7f805e6aa6f0c59868fbd8a6251598617b157ee31bdc119b0444b60451af8fa90e4c0991d91d2d08189283bba14e6153ee671e83ac12d1c8474a08374e47f0687b6fcbd0b844bc435735645657fac76507a7113fb5f4140c01070ec5b27523effcb47eb426bc3231d4e4dc874c4a16ee4",
+          "padding" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "e383e41e1322976da40c9e5ce64c7dbb0571ed9ade7262251f7ea21ff94c75002f39edb73f0a9f86a2070b5fb143d078b14d908045135fbc930fb79a59920a90bf0aba0d8d7abb46f619cc95654a6aa675ff822d43e22b63b06c3060fbff2873f3e9aa728d663b64f0b0b561da9c3e98b865ddecbabb990463bbac0810b5703f5196384f0c8c4ad6ad55297cca2267db1ed3830e064aa52422d614340af68a361db77de375b7bb1c63997ca85319738c4d0d7519e0a8ecd8cf098075b9bba602f31d06451f83691dfeba27503f969f70767885c4c659e5aa1957259ddfd8676f58dd5d3fcdf951bbcc9009d029d17b0eb650184bf9a2b2df5e7ec8caf3a52f1223611f1c44bc529019a1e38db9c309ce3dfa8d5658ca89eb071a7fdc13fe666a09c7b22650f07eaa5e3943568780a2ac282fdb387d917639b9327237e7d74bb88b19f53719845d0646bb548fa5cfb945550cf1fb5187c142924f11a7043493c53841da19ffe27521dd472108e75980ed1f1ea80325a8aafb272939226284b7c5",
+          "padding" : "304330044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "01892d88434a5f51ab9502d5f3c41c3dea7d6f8eff6a14aa90077e495a0289e9ade4e9b1a103c5436ee2778ffccccf2c99ca4b844609cd95dbc1aba6353929d8d5b0cce922c8afd3da22bafd6f067e2444cc060c22e207f593832604fd94ba6a0c91431cbc5dffc9a272876cfa4fa83ebf1de5e2d889212818a7283433963ec9a15b3ffe486b69c6c3748b03823485182739b5e1eac0b90e6ee62aadd808160dc1ca47e2b345ade0245f1e03983942fa480a38c53c2dfd3666e2f81198cb85424224394efc0d915d7b4819c92316c26219c46c85e3e29adbcd6102a82159dc5227f9392b28b657b08fccab9233ce668646826a0611855547be04eba7dd469ba2110aafa398ec6f61eda59b620f7f95caee46b8a598830d851aca7b7f15fe35fc8e4bca694a0ae9af7567724ba45633ea12a6736dda8c014a0a00b9789905a6c1b2a38b1b270619d79532e07c8ed940af69cd7c4553d6b5938f9b6b4201b495e44358a09ba92f2c487325f9bf3a1311a47e1b55aada4c994496970f80bc2c4558",
+          "padding" : "3053300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "2cd3566990157944c036d72097a0a275da39b5aea4c5b091112cf8376cc1f1cee1b06eb2000b3a2f6d5f8f952e95ad92250227b1f790b23e394a97a9037762d5e1149ffcd952348932e56811caf717ace174c3ee096bb877eea046ae40478c14f81aba9d3c7e47a988204ae7d29f482923047c85b14ac51997b6a5166bca2c73d1b669d842fb16fae98c4dac5edb48fbc7cd38e120f8a70814592cc70dae5f8a7fa8c53bcdcdadf025f674e51abcc03bd9883f15eacdd0801afdc976e61c664a250b6fb211a4a69e0547906914247008beecdd3f513ca600ee3a466b8a78d86d0c5341035acc64c354f2b68830ff8d176272cf1ff541d1609ff3799f0c3a9e6e448e0b713ece48a14db4a58df585e2d13fa739d4314b98ec75c6cdc74d68481662c48988f48d1e8d98814395340e454085e1153f6bc9c20e4a411e2c610f424040b011f66a6c5579fae1b9fb53b673da0cb5a02ded3fb37e5dc117e4e71302b360a23bd300143f7efa1a5f2d0052d692c18bb4895d52c0bdebafa0b625e13134",
+          "padding" : "3053300f060960864801650304020305000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "d59ac64e907bfcf38d4bc3fa50b6f2799483d29879a006bc352620e31f395d8e8ee32f0689a1b145246316d27487fcf3f729eb644d9c44703aff5e57df0567035c18c3af96db6e86fab4aa0ccc0c6fb203a50941767dd17158fc4dfdc34151bae10269bd68e0777f23ea0ca8a332f7f9e77e5d95bb00cd6b8d3a0279da3078c1bdf4824c433f13117e4755eb3fde5f9bec4006a8ff9076ec5fe5247554a8e76ace12f27e819143819bdc6112af4be9b25b896b01608b0ffd11ddc87cb00f826458a5357a78e1308e5b5b961b53e8a19b33789c0f4984fb1e6d9315f9780f81e6196f908fd00da1d2fb6b61b67380bd2d2e579829edc44002111418f9ac624a6165cc538ed0ede4d7363b7f716c84e1e9213ed70f02b5de44ada49cd7c83ed819604433aaeca68d52de440183d878b0315388a884824371aaea41290221820cff49e405544cf3545e4eaa4e7697cfdee0a48eb87a73ff47f4d5d8dd3a4f8b09ed8cd2223ee83edf2d41b7ca572aba38b64e987e668bec1ce88d24fc499c92d0c7",
+          "padding" : "30530000300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "f294d22fcc6f9cce7bec0e44a9d7eae443ad7b750a72be5dbb41e3694f48720dc2c1256e030ae1ae06ba65cbb59e8d180b222430a8fb10ed7abcd69c869ad1c8070f33d0f262085414f7985c47d33d0b398da9d272f996cb701bc6f84eaa0861deb5b7cd7226d2b8a969b48d6272a98ab9a9e3b761231e892f4d8e9100a7d1bbf820d9102a62d7d41d92b3d9d55ff386cdfa066afac04c50bb2e1da0e1b9af62de2a7475bf403dd2a4a50f80f6a0f0eb9eef38e00f19861aee8d78a13328469475cf42e0a675f2d6f086115a14243a59f3ecbb6a47d25cd1011d0bb6e1ffc152060465b354ef2c66305165426ec72625d6fcdfc3e830a6f352383e05556f4e14f5ab739f6ba331d3ae8ebffb49157ce3c597eb9718635493e8a0254410bc75755c5d854a316a40845e97da60412eb028cd97d206d05afce20a3221f13ffb7389c400da0047c6690116de9b987c02f09db67313b163b9df54d2437b1f857832fb982666c19b832f6928db60f8c695a4d95571825b7f87bb9601003f95db54a813",
+          "padding" : "3053300f000006096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "3d8b8f962091c0abfb446c89b26af8dcf6b607ecfc052c4d240742f5bf9568a7f27cbd016ab734220e8c532412fd3608c8dd3b2437ac93071b2e523356194f3d19cef8ec8c6a477fd9c78a67b5e844af28afd7a7c0e4e995020e5a33db394d24dee4577c41d040cb9f78fe31027eff68090b9841a66a83c4af2cb5d076d853d9de73e2059234ad3d62d56b23d80bf9de926bc251a5530dfbd564db9ded9edd75db0c96dca8f7e704d1ecaf2cc66f12ccd9e537e0ba4d64ca3718c439ddd8bc305367da8d11037275fa2589451fdbe2bdc9951af42034521a58f8743d4dc1164dcf83e6ddbf2cfca80ad5e6346e52b805e27702e382da44602cfa4fa98e7c084492fbe4569bcffd7ef3885a05e5b091112c3e39a7e3ee6917d33367a12f087653317ffc156bec46768403e80a8bf59721249c7b909642751ddaf3a7851ae65146d6b44104215218a5f2bd8c4170bbc5dd69afabcd13a5742909a41965f80e191c8bf21f2be9973c8f656bfc46812c3d64e14b52480c31806dcc2fff05ed7b82e0",
+          "padding" : "3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "04dcf055ea6c80a04a302f8b6c7c66e3ac796c4c8c112edaf75531ffa903c5a4c749947b51bb4f74a95b05572cf7f99505c7882dc8c9fb836930a7b78c48e282c287cd64c1ea36c494c1fd7b1597a727c9c0bdbefdac06a752aa5527400f8cf5d881c4364b4ce0dace6c619de1b11ad1461cb9fbc2ce9ccd3e2be901c3204cd613d0e77d7c740bab1ef2634aaa4ffb6f1f25f9982adc8f6c3246267e33de63e7e346f1e22b45ef4438b1f0a8324da5db56e749dd3879fbb5a6fdfde802ed618b15d3abb8fa237bf4623b66a55365b6d771489d8c60f34f83f30092df049c667e86421807561f78bd7075569cc302e3ea72b0559f9f9267463205dee24963c7d56236e433d6d944d4f3708da6fd12173555201df31a52694f0266a4a417b6866e5e33943847020936bdf843fdca5894fb984b6784b1d506360556f1afae4419021c74c6d77f2838b6e4b7d2d040bf6dac3ca591d60a3db50896162913665f7b8ed3ba1027fe246efe41c59c7b5e952aab011e2f8cf72ce3a1bc57c02e9bacbd73",
+          "padding" : "3053300d060960864801650304020305000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "97ba0c5448dd06846b1383a32d9e5fac291036802c4f2bb5499d09dda2215eeedb381dc755a8ba1eacf01d30d60f7850e0d86880cfb11f181933afcb6c9101c97db5fc943e89f0185eb7505b8b0d905690dc1d9d042ec098fecf5443b98c61fec2131b86357cd34efe4f65071bb1a645aa1596795cadf69e14df98b511297f17330c7dc5b9403070f3840d8fa3740e997b4671b7a1baadef2d289e66fb01c43755cbab218c57b871071529e203dc5e884d6f86b45f28e37d80c77d81b3d69347ba7e476d521e17159e875ef7f49ae685ab56e100ec475ab67d10d9337294a1bc1ced1413a1ebd8bef58364b1a1a5ec1482447649ee27c4548f70f12f5c32d8555047834f5841f30a1556e409489826c0d2a03334a63da4957e7ec9608b5ed18e1193af87cb75ae32432021c8094b80a71ac283fe93855033e2cca47d5d362a37607fca51291957efb05711a53ccf7184d8e2a6b79e2da051781582f3a37c28c7ad095f53680088308d8faeca5b75e2a27d3b62c40c6eaeab9ab8a2d6234eb8b6",
+          "padding" : "3053300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "be57eeddc0bea94257eb26456a6a4a6d9e9c8fee1ae2e0121ce8e64806cba6692643186eb10ebf43c0cb032c641736401ec189adc48ef6b222f19a43b09b6d81a1626d93a49055e50968e295b78f883cbe0df94251d1f0c8c067d2a5d5ef7eb33b01289f9d666e1f691762b7ecbac496d0ce3dd2e40307131152068307f28f8d2d38b427e03843a7097c7af5628991b8a752bc1eedccf8cb2e4a7507d4d03ef6f18ddc6e757acf87444ca67d7292b273893b41c1ff4a2070043d5ba76f4284e4f16d75721da32f2120ef666d677b0a6a04e4fc8ea5e5d64552cdc872bc860dd5dfd9939143c271c7886505d696be9d7e7864eb586e396c0270d923574dd2dee855ea3d7f6cf57f834a7942ff2f5ccf88d312d4edfd08fd6615407059604a359548af4d92794ffd1a610d82f04d6453bcf35bd8ab523b06a6875e05dbfbb9c2196e2730c324ac51e8c9ff36930b3025bb2a081ead30f887e4eff6464f784ffccad644b9d7354b071101478fd6ed7c64167b90e16d066ff599c5591a943a5f4533",
+          "padding" : "3053300f060960864801650304020305000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "ecc5b9067a93fb90cda4b45f1c21d2c5503bea7fe7ab592922cbf90b38892741ef75667da1f0435a25588e22645dbaed66ea912db9951fe9adeb357ebbc25b5f524de9c366d657948c2efcd008decbc69cbf085f094cacbf7bbdc9b863cd5d9174dd35176f587ff4f7878817f31c3a9a669bf53aa38ccc782e98f7232b267045252a8cf3ae1bbefbb2030573bdc7cc9222550f5fda9923dcb6412ca0b21e17d464bf334fdbc9ae61887f1a4a96eb4ffdc1dcf29d6c2d7aab07fe96db30289970d5d8200ac95ecef8efcdd60f8fe4991a22427fcad68de1d94c757a764990acf5a76ff33da928a46ee007367b4e90449cdaa4d7bb222babaf1e2ea5a46aa9ba1a1f3999c6a55c2a36d083dca472d30a46dd312cc123b830ee39283a6fb11de58bdff24df169e716d3f2487f05dafb73cf3815a616e59afc78c177a1bc85ff89b431e988f5f7a43359dc9ab7063baafbce30dc245b5ff3ecaeef5a1d518a09a6426a6edf9bf9dc0a5f79860003ec1704b5c756d522dbd93c183dfea819c9758e5c",
+          "padding" : "30564981773051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "e495b2c030b082cd0d58097aa1d1d5f4021215109048db0e4725d3018de3d71dad07d0fd5d94df5f79bebb7678bc85ffc09d39574e7e495d17621c59bff6bc9cab066d5aeafaca13e02a79b3c1a5bd5d8540c4f3937cd4413e9ce6f2e3b7f5f8c7b2d15465435df005304db81181de6d496cb45ff03cfe84e75c5b1d4c4bfa4f055c9da0582ce73dc0974ab5132221a61e7bcbe1e3804937bd007d293861f419bf8ea9a72a142db387b148041f34c5b9cc3e034a0d3cc93cf3bd1e1a5b1bc63233fe8bd1e1d73f16386a70533113b48029a251bbd99106ea7ac9313e93e362a9c6956dac668aa316ed8130376912926ba9e9d2a8a9e808a3833614ffe0e22d7e1ccb49adee5445b1526af4e596eb675e12eb89751ffe5b031a106dc282c6e4f06a233291ae7fffad2b1607ab7d0fc06082de63f7e48ddede5122e3186dee3f797888c804b2aa0322564f39f9041d71b238a816b751216aaf83bfe407f4cd28ca2d319e3dbf873f13329c1ea8064bad9d43f00837cca98080b65fae383c17f2a2",
+          "padding" : "305525003051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "9ac18b311711323d7962279e8c6d693744db2c8500878326bce11a9beda2084a6552b89ff425c21a22598c09b538a194d177c3aa647cf43648e2b17b9675616f81896949bf455edbd0b0f5713ac950b57397c66281a63b96f7af4bad5c697b293387570926ef7ef85056dd11890c8765223b2569b4115bd36f5e17ad7cc8953a9b6c9a45627cff4addd96dc397051f759635ba3de256fa461a2c56848c924d81dd2a9a59cb921ab4a1b9b4657eb6c1709114ebe99b0acb8c598847a650fd7216690cef68bda445a3710fdbf8540378323d32168af666fa0524150ab850e68e1dea1ec00d2e5e63b65ba6943fcb92217acc16955f2d06731e0684a490ca9721183b2cb72633997e3dceb6fadec188da2d7ecc0ddd82ae7d828c640a89696e66ba7d33a64034100a1299c26ed90fb59efa80a88ac8057adea1378eb7d156b2ed30874eca2a0a5917953c0f865034f53de703893419fc650a0f9dc211f0828343bfcd76f16699abd468e863fd8696a52705d3b49268e76514ab6999b98d8eb942f6",
+          "padding" : "30533051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "700ba7745d6c9c146b6026d854f958d4ac00816dfeed7ee9beb4580abdbd491156bfff67215a7cc23dc0dcdbcdcbc79009c86dcd4bbdb54745a8dd85f7c74b96394ae1cf9bc88cebe88eca84776f263434958617b9817339d756e5f301548a1ca4dae92ce9489c5573b9e5f3841358e339e056eb75b105292d9a1897091218a9a95be4a76d2f22a7797a3853bd156a91f0889898a63cfeb764e643e6f4a5987e6de15fa334502aa74dd99fdf9c074e45e463083d434ca0a31424423257d1aebb68375b27fa1a79d721bd3b1cedf744b7afe62ed03cc4b7e6765c50497bf685392d9e95dd1cc11e0e7be8731ebb689d321eb1c67621d87fb1144d56cec866a308a0b3ceb941559f7d157e87f0daf107e82dc18d3c90c67307664415838dfa2969ef1790c4e99017a1f25977b1f787d6504e10693fa1b79f23b42ea1c5318ae79e46ccef01174a752efcbbaebebf24577fa859b6ba87b540f2e46903c3aff0df72b4f8d10b34630bdb22282d7fc1c4f3d7db661865ab5089d221a1f7c24f30230d",
+          "padding" : "30563012498177300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "f0edfb2e764945f6e6585bdc28b421dd735036a4d109d27bd1d79f8cab0ae46f5018e7290775f5a273459fc9992d217dee7051a9cc86670fc82f3377861193ae3cbf9ed4d9f51b9496233f8f01c9f88c43348f64dc64f2e5fe98f3208ece156aee90baf7c200fb8018d715185808e0efd0c570f5af1f0369ad01e18a3200a5e04319b779266b33d70604265c4c95ebf53cf43518988b7501bdec23c9abecc498d98b5195830b2883b261752b4afbe7dd7cdfa21bdf593dad93b106b91fcedddada864df066cb5f5727afe6ed1567ff21336e6b02abfe8ae391b3fad73a4de05728577d7cd4e0c639db381ea446e1b7c35e891bf7258b53fc356e714ea4bb2856ba037b50035b611f070d42445c9263e968e8c803aa040eda540c23d62a48b9884a9b9eb58bdc621a5369ddcb007e52be1da996f020d8c1a0cde9ce41749f33b9a65e5ad33386587b93723ac6eecf3adad996f5affa7a9772336db2ecb9607dae06cbc3a8d1a55cfcce20a43e9323c7fa7a11b83b0198dafb6f0ba860103a54af",
+          "padding" : "305530112500300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "350190cd72b31328cf1fac929b03c45900eb1dbdaae14c3553b40b53773324bc17b13fe11282d70b38771b5ceb0ff87f8517a787b0e06e97b83b71fc7b680cd5d61d616c15d6c1bc98cf93b058a5be99ce09f9936eb55c4f92751f00c4b403d9771994acc556d7e69f5682223807b2e7229e3bb5360125e4366052c9629cd1427f8dba9582348e10ea4f4d768d84dba73db5442eecfc90d38116b002dd4bb34ed8c346ffff883444248ec236c738959154decac717c041dcf3df5492f2c9a509c272d825a49149c84718a9835b40a38de6cfa7d6102042150039510ba401fbe53fdc7ed3b422848f75a9821c0cb0c7a0e4ae6219f305507ece7b84be1cc8c1ebda663fbce724ebe7a2f6793271e8098351991389546cbce7297c8a18c8d202227b7dd574b1c1778058947840ff0c601a7d65f035f7f66081dec7f3cfafd042aa15edbee6b37da61ccd4938e7517dc48ce272ed78cdb4f33cd000217ad142f01b967d7ec4e8fbb43db890ff4ec8fce37a00c88ad9407a6aabf4bfad3ccccba48d",
+          "padding" : "3059300f300d060960864801650304020305000004deadbeef044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "2a32d279cb8e0f44a196a1f83fa8dd5bda36f2f857664f4155b2859d9f940e8fecd466b3a7589254b3a04846721b8ba3fbda7a85a6a00ae24abb2098d3a1e8cc853dbf693d12a1f02ef490594606990dc8aa7916ff6911254039f4a0565068af5620a3caea7f76b775b96a8d8456ffa7bc6dc9fe98832acc512a709ed83e06c72166512e3243e9e30487dc6cf3d288ef5406858b6bd60177b01f466cb8d963a987bf7ac242da9fb78563c2a8c9891b213544855d3fa92c62a8d3219db0dbe7229eda4178a540f7b103c0886d1a1a4ef2c6bf5388228e64d6caf6e65424b0683d0c6f2ecad03355cc7f5efd8f3a18a991e391bc06b0a645586316ca61e101fc0c262b7f67d7979cb0aa1bffeebd3bbee757d257ef9f84418d2b4f9cfc6b09e5efdc2328f7edbd02b1d9e13ea7ae86d044622773c50a8f0c53908079939ca60a08e652c2a6856397814304def15aec6e636eb6679ecc8619b820a655070fdf7fe2f204bba57a92d894cbe2d7328cf6d73fcab07ba83b020c3b2f0951bcdfab8ec1",
+          "padding" : "30563012260e49817706096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "1d95d2affd3c347ea5848aac974bf4c7ff675a876f0944d73785594e2c8d59a9671d8ce8ad1b7c6d0d51f818cce5ab1cbd7b6e3b69f1a1961c4446ae147d64b3794c6a8255386b96f062e022658e0898892b3e54493c7b6c1686d687ee72f5faeff077e6fdb9398b271b6c038d54c3cb0674717a7aa7e75ea3cadfe87b72aa1cf19c799ed2102264eeb646271a81eccf9dcafdab5aabd586fc03e279cb8500203b44fa7178a9d846a85f2cb6492e8175b2a7b04ce24f4df04e0cbac76bd15907ecaa7c07683e20dbeb1cf9f6f03fdcb0e31b55d77c8180f27780df7b253a2422f0f319a081781ac295bc89de4da40708eba17217a6ef42114bb46695cda20b27590565592e4575098ac1ff27af296245005a0ff49d6a697ab4bd70c6758a1897b0a1c09f32293d7d1b2856730658d43853362569bbad81389e85b3a27b316786de7cd0798c628344954ccd1b90c58495fd112dfd246fc623118c7cbba762535038e10885d7d8b96edc600ee03b1430628df94ea65da17b1376719f3ffb739ba2",
+          "padding" : "30553011260d250006096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "c1bd919721819b72b389c27f0345d7506829b38a7973f7d4184184de56a0d78a800b99dbd8a0216f60bd2d423ce18a9fbd45f6e0d171e34689e06d9d155f3f3a0c9af594bcd4dc476dad915d17a4973af9a5d480f622bae2dbffa125e83d9995e81112d633daf225848c8e7ba17cb030a469748dbcbefea29e93f464fe16ec1b1456cc823efa3135d49d94e740146de75c44f380ae4e5a6260e64be7f0c3d29ce97c29c9a76e280f50d88557e52292ae9fd1e783643756f6b8fa867deac05c21793056992ddcad2ce5ad1698470cab4ea16d5e1784dd449bbaba725ec74c6480d0d39319bdfd24f55591ecf92e4352706483f96f75d63714fb1a288ef09ea8f6b7f5ace9c2dc659d95689786c5cf734972b5ef08f78eba8d7e18545dfbc1173a561e597b0412739ffa0fe4448d08f2d307baf85d9ecc5c2a57c008f490ba867f5fffbd21091f77eedf1c6cbc563613a443fcb987d776f05e8cd1307018439bd0ac729a7ca05a968d4f012200293a1740adff9ddb877b054c4d11ad42e1456bdd",
+          "padding" : "30593015260b06096086480165030402030004deadbeef0500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "a6df51d80d2902569a0245422e5b5e8261903fcada8f01c2c2d4d9897be35c64b7286ac79fa73cf39db3d9e3135af2f00a888138df5d6ede7cac535767e17206f585c57149760ba379d8791126b699230b678bea9762e73a2f0abcbec943db9ac74ffbea3824ddf22c36fdbfe77960149d07da6d5acd80a7378675b3e65d4563d60b1937347a4db25d6a1592917e06bb1564542beae5330a8abf9ff854912efb0ec3d93f25c8c4e19fd8716f22ea63d8deafdbf9b9be61c9d98fa2fd4d2a9605de2fe2d0c1273f64b31675c440ee267f02a981c7efe142bf63a09af9693ce07f6807f389fbca151db87589b82a833daa3b104ad472f69b1a966f6b853c20c9a5a5c10657de941803588b1fa77398f18752c175fc3808441d9abdb5bd84c654706c20969c9f97e24806d64aeb9832540de12232838f257345b58dd4532830c531f7e0f42ce2a032bdaa3fce44cbf1bf2eb30277e2babfe3ad12937dcde9ca6d2bbb2093b7da5cd33446355ff0dcae75863f8da2c54872067a717aa07f1eda8853",
+          "padding" : "30563012060960864801650304020325054981770500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "f5e4ddb832cb5ae5314ed853498d9415027ede84e7280fbd802fa3a10a3a74f4b13303362f1c7dc1630d22712167dcc2869dda4c20b90a5f3b6e9b81f456be5a63691a2db758fd64e9adc4cb761e907cbc112353905858f6c1f0f95aa0526332245713ab02e374439446d8325898f169453933364739505ec6813ab53d6bca1362bf7448e9ef30780d2db73fd68d444490263ae2e3aa1d0f500a9f648e188795347f773d18076572d95d1971f02d781ed4d64b8b928777d9d2e59a1947b067c797596ca573dfb0ba69da0d3f0db71ad1e9b07b31c7fca0eeee3582c3c96a7ac4178e01756d5db8c458350527c9405f4c20b4fa1b30c9c7aefa2b7598bcdddf494ed1159ccf6fa3f36e1523cb6412d8d641c80122a6e2b21253a1268b11b8c80dd98b1011c54bfbaed8c7a9e67a96f0e6c8cd90481f1f7c18a98bfd665ddb512cb2a30ad417bb6186e5e3b3993310b3ae79c1064e353cca881478ad49c8c59696de17859e66b0b0877c711f433e38283092cb80c319b9e663a1ff99cf4e583b1f",
+          "padding" : "305530110609608648016503040203250425000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "452a4d8ecbf65423cee481918f6c9b7b4ba369fe652eb1346496553b58012fb7334f9a7c4797b3f3df594938181ccefd3984fc9a8fddbe740d7686e610af25b09a04336cf49458b724e92832e820ad5dbec08098e27431eaf02d81dcd319f585b99e75c311ddfd6cc157e17ae1b33c5fbb4bce28bd919771a27c48bc21b08d45cc4110061f4fe04dab8107b543569d58be18efa572df128c74fdf4193fd73c3bc4e71b772d58e094ba552b8a80c7ec5080d596ef50c7b0727857194f2e1b5ebe7900ede34121a115f4fdf716fc569ec4c6645f06dceda6972bfe2793bb1455b5bca72635aa8599bb67f601ca6485e6ab3b6dd304623ed5e8b3d7a2d07fb6b733fc32491795833f7bd97c313e0865c842c7ce6fac9a304c868e1af99fa686bf842f6c2118ff957b822aac3af68ff6451e1bbc23cb7b9a3234b63d227ce67d61763f9116860d31dccc7f984b1ec9d90377249e73af5dac9759dc82d46e07519f39c2bf21645c68ca6088cd8e28d1afa688cc9d9519e9a29812854f3304475371dd",
+          "padding" : "305930150609608648016503040203250205000004deadbeef044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "a55c1c5b119675dcf844f31e349edeac5d79f87909481eb394ff5c4aabaca507dd0770eb7c7e08d565adf49d236c1b9f05ec9994e1ed01a8cb2e6ac628adcf316614f70d7b2fb813d8862f0c912e7459b23794029ccafb11d74727e5813267b1e423058ab13fc76504466d87cc80bd0a3e00e77a3777ec5202101ef44840c61aeb27ec38bac175980046ea39a13169613166ca401ef40a107fe1c03a05dcfdd6252bbd6a35b1fa4a54523d0efce0d45d194612e1cd6a51cc6d0be11078ecfe5691a43e58f1bbfcce28e09f97d8dd1c6163df9fe1e89bd894fec88676801c5f6567a8250331a3982d90be9be7ee5deb682d44b97a0335c20a9aeb851dd7c02eb7eb47354a02c13c3ce678de820d0e7f67fb2340d79f94754d21e6b61d95d1f14d63f27e47d823117df4f4c84812693193efad890dff16b5119dd78ec95653bf167f740346db8fc3cba757f2a43f9f53bee8e61eeb513790f379ca9cb2d074506c9ecad8843e4c450b26d34153164bee5730e0b6f2a7210953f46cc9d5cacfe30a",
+          "padding" : "3056300d060960864801650304020305002445498177044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "5d379e24ce1388e6ff8bd565b3455ab74f213581ba2e3422aa02d94596844b94c123f3289fe9edff9897cb913a957c4499bfae6d4fb2700187807dc9adb30f568ae5bdb978f1dc1761a465ec87000a4a7b24372d76699ecec070982f66d261788060f86bb0f087343fa9f25beae52436769714d572bdc4f4ab97ae7d47c8d314b53470dba0a3b340bd211d562687832e7d58e521600f69b8b60c10aa2948c1fe5342fd11bb3e218337bd77ced154146d527d493492ddb2e6cd2255be8967863ef0be88040e674a7b599f6388894c04e41d831b42dd9de2ca9c7314c4464801ad2c72e8c7637f320c2fe5c0dec3e4cf3f7eaff761a0a1760d1144b1186507224daf05067623513b045dda51872ff566dba379451e6aa53eb6af12132c4c4d77a90746b56a0a98147f1e98f2b16941b4cd5ff9936f9bbcb72d427a8b8ace967f5dffd6b5d6f345b4b99e86db01790cae49fac889a0f58387a795dc0bfea7f1c2ff3b8615debf9e7440e22de113ed0a76cc38d84386d2859b59460d7a8242f8d324",
+          "padding" : "3055300d0609608648016503040203050024442500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "0e5c7194c9e30a8e07631b3a6474041c85700a0d1dcd9701b3bec1d45bf2837312d2eebf25018229c86ed492d83a72c6fe2726ff15b44cbd5c3b6676b67e1e1360bf5725effcf5153d2b2e820b90848d36a5e00c2e0c2d8daa3f31cfe7aadddb4babf5b8bf2158611821df7435e2f73b1a130e8cc6151fef3ee51abde04c2bf0b0c1a6922638b115aee943a6153fc07f6dcc4c4bc132f3676d3de947bfc3f446323bda136055192e4f1550702d9f9716edff703570a5f736f0a8ce220a1de0746f557e2c81d1723cd484bc78e7fccc6d802bdb67b94d6be1d48450e4c719063ff07d6d2e01f4669f9739da38f62bfc01145739e291992052f17bcc59114cd5d2c12eea3324e7f9bfdfb1e0bda3e8b71a89dd351f9ac5e246d309a87092e06b7c32f67d5971b89482862ac89cbc168eed944106f647e33c33f27e52ed9b57173207ab0a2ff14e7cae22755025818090fa0b4e6827194c2561a7d43094eb6212b65395647349b4b7bac27a5c17c7903ca941fce3d7ee57b689b2bdc8b547aa5bf8",
+          "padding" : "3059300d060960864801650304020305002442044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "686131d0f3fb2b615ab435793456826776a9de40afd11e3a6c4e583beb7df00d6de5bba618ee35e25f9199e47f15c0f5807a10bfbd38bd0b9bfee3ca22b0f9ba07aad708cbdc5545d05448ad09d90742e1e61ceb6b7bb498ea77d3476fd283cc4d379b4cd2e29f1b468f733ee920d16a06f6689643fc611449e4375ac7f9275d553db3f5fe2a858dffe4c9126595e69366698d27efd6e304a92f43d0b43be5c05998e91ef6a73e34931914a3e29ad2f82a3cedc795a430dc877ab5a5bd0816cba7e8cc5cfd5ce8a3bad76bbf77dc66d92652a42eccd7452bc7104a1f208cb0e4252648c3036affbd527a7130edc3da5735229511228abd4cff1dacc1297155cd3a877be79e78020587d80ebe481af9036b83e4108b9f7a89da26ad50ae65d9008fe2374564e133cd6ae1e595a332d08bfbf3612ab7c8b96a735648173691eb124fcb36899df3a5c173dfc1f37fe6f43b7234cae9e373a212484d134f8fb45a34e02b6d9e59d3eeb7d07e4fc69209e30d2d6c1bb763b032ae342bdd6a4226b29a",
+          "padding" : "3059aa00bb00cd003051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "edad8c2d141137677b864afb778cab75c44ee960390398b25bca129b61763fd6ad2e9d24fe3a66b8098982b40081b7520a99e622f80d1f456cf5ae5a000e943966460e83f22c80d32f74cd38111517db3711f78126c0cfed6e5b528615804908b3428367ae7a2d68e5e41ff3826e4882c6996c26b6e879d298bd4fe7d917eda57d56e03392b112e0f940ed408124a5bbbbe4bd1fe4e12392494b155e5acfeb7c0c02305ff8bb17f291dd9adab088275691b217f8f805baab6d5c8ec656dbc67f1921f12b1c3670171e81135f16846e831f57f67ae700f6bfcb4d619d3b9348740bfb3ed9e9bab3c718c4fa9ca34d9814b96fd3c775d83ea7729ce0a04b84014552174968fd4be92f281d764a8bbef9f1b6c04e843ef7fc5618a945cb435891e0ae9332af46af185a91747194cce9f3fefef1bd0e6f1c72096053546d72cdce8c764b27baaa01c3530eb115780f2a9eb1555949f6838be7b53f282606a82ad8c56374b3dbc4d50870bccd1b5e2c50f6d32c0abb92d784de41fe54368e9c8f4ef1",
+          "padding" : "3057aa02aabb3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "9702fab86b0f4cb3594c237ee0dbec79b169a6c9ba83ad6eb3d4af38825fd04a938080429c1409e48e764cbdb56112e217b56f7fc2ab0cdc5b745e078b1cbecbac1dd0fa05f987bdd817c4289ca3418592a1ce84a6357e9943f49fa978a06f0c5cbca2e60a3f159719626e150c27b741481fb0f8e9987b93d72d40f709096fdab57bc3a0939e688136fa819d9729cb7417c18bb7aeead2ee533da70df0571c2798079f663a51aa94e89c8656a6e87171dc3707253b24fbc4342681b51be9418f34a5a443a8760d92bd36c6fafad5fba11ba24fa1a529b583f637d6b251d1f0eb9a650a020aee27f9e5dfe882c1da9caacde3671fb6be4b3af424f8312f1f92eac1cadc65fa1bb146e4d3df14534a320702e22addc9426344ccaeba51dc2d0d3d59a029328b059c7f76dd6a7bcd518530fba8ddc7cd83411b772fce1ed464d13a25385b5537a053e3431fbc958f04d1a539401f6660e5c7019f9617e6c4e5608c409e70d8b16c392e6b3b77860c3d45aa3824dff4b30372a061609f1ae1c88cd0",
+          "padding" : "30593015aa00bb00cd00300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "0eed6d489bde718f00aa338eb64e156e44ca165f4bd09e59ac893e02db61db21aa1a475731bf1ad7a907c94b1b080d33f6081e00dffe5025720b9d828523a4afd2fdf644dbba202d7ee2018ed999de038ea4fc5d96119ab65f0b2c9d889a47aaccd9c42dc5373c8b64f27d2a2521c7dcb8085b8a51c8a5bc08296b2ec2ae980c98bc8d00936b8c96805eff7c09d3835c1479f62a8b77057d8e8381a412c32cac8aaf295bf851a2711466113cedadc5e90c8d0fd1321e6a9015b798eaa66a41fb27a53b0dc80525c87663eb805e76a3853961c12a9fa6520c4902d4d69649b5543b48fb3bc8516f35d4029dc4a140886396f9a69529e8e1b7147e0bcf5819dad1a5340cba0ef530da999325572916bd4c1181cb90aae0be3e4124e08663ff26c8749032ed664115cd20d4f92d92adf2cbc704ce99e389aa0e3f0cd8c1ab905d1ea565701d1075863671618a94a47ae8bb2a2099ae390056beb9dfb1449e363cc86e5e662a176769d1434f249a21a8cf84a69e8a9d2df87b343352fba9260f88db",
+          "padding" : "30573013aa02aabb300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "e764485606b1b477efa3ca4765d452e2b8fd97c8a1c54c51d0235bd1360280cf9c1f21c9a1c148c2a8e560ed6a75d5c324b36d0148aaf20fb2db59c5f461f3399b112cc4bb4766de8d9789b8241c7689a5d296f091658284ee8b429bd3c3c4164f9a67bea9901c2fe89853d6c616921f304a93cc3cb4b38ef80b147866e0f7777cef50f2dc63ad61adb3fd522ec0b9feb3fc9781e97a0a0f1f6b1baca125d9d006de6d3befd9f823bdb307563cfe63ff49d767d68079386c30a03c373fb3cec92c66846b6b87bca60235e0ed1993598947aabd1fb284b0ffd3a4b4a69c5c79483d507d790bde13a6a9019c918736d511cfc4793f75f201405b62b256528d377411217eaa2789b2e839a8cda14d1ea408a3a8bfad6f6acfb33f0d9ea4aed34715501c807541d8dd5da9160b11c7c0ac8ce49fed32fb60a54b1e031f203872a6d8e5b4536fb25ca2e577a8cdcf8843e3715b97983fe935db972e6a8cebfd42c7f348a02aab0fd873ba03d8829d88dc2d0058a9315c6fc5f035ebee4c97a1d5ada7",
+          "padding" : "305930152611aa00bb00cd0006096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "e220c5504ae996d68892965dbcf9d158739387c655c4c44b8695f3f5a00350044e6a3ced79ac812a78ded031c406ebba2d3df4223639747ece73d69e2a5788de752d58a581f2b02dfed499620248b48da2776fe349897d848b8121837714cf29e3a929c34113a05457e5914cd9c14bd683c9025e1491b9ab4865ec25b281ab9696a9bee80d2b32e9ed3e73c162420800c2997819eff42caefc5d193bc3107c567f7f364f3f1b8cc6c8e07b15d00eaa698fdcfeadda11149bbbf0d2ce84162b5f2fdb1763c0108e540c9536318b1eb67dca7cf603921333864a6eae20724ee53495bda6ef5e81a563584edd6a705a434948f0150f711be95d763627c0ba132b8592e9022b18542ff2c314acf0d597fdfc3f9ee3ed617b78cca7bef4cf259329a9ad95ef5dc636b86434e9e7f9f719a9f6022ae913c19737b81bcf1b4281f8561e981bcaf2c38f2265f44755cd9b2311b3ca157d317d98ee273b3a477dcd7954b5f0a6fcc629bbe3338d06773a92e07a8cfb32a96a28cd356acff3a6d060f20bff",
+          "padding" : "30573013260faa02aabb06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "48334ecde4d3717bde04a2257e8aaa94f5383fd49a8e7e6933f60958916d223bfb32c8324b50916e72d4ba62b715e1298946efb8c669e3331c4aba5b4b5d885e513bfe694de8594b0c268a44e1916e1d9460aa419d7e8fa8e5a69b96aa0078a3072f40ccf87685a0e4efd1f88822e2a1491dafb2bf34ac5c7d7c93ec0311e4531f65a8b35f763e9ead78d708e1cd3a45a70d84705e9684b00cdde81b265dc1222a608eb090a5ca0aa0803945a8e5fad9fd13bf9199119051d0fda7a0ce3a8cc186a6d9b4f880bd8d7191c9eb0ead9eee5ecf3160f9457aa9e0e1913a9a18cee98a5fc8c74825f916a002da58e47a85c98e2de0da9ab39d6ec326d5b795586251b8d42866ea5e40d9738d21132fe7163dd90814a7f0f308ba9883f24ec123c9711f1911160034c9d3404466c5f21941129127477baf8aa5e171d573b568a11175451f6fdbf081e976eba6c5f79af5ca99d73dfa2c468e0fbd7ac0f3acdc4755795e09c2363c0b145d23c33e2a0739c953d7bab1bb748062b2129e4eba15c5b6f2",
+          "padding" : "3059301506096086480165030402032508aa00bb00cd000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "2b1fe31339301988be9b729b9a14ba96cf9a6a549ff66a9ba6948af2fb8b2651baadc2fe1fa5ec7d466687553cdd06349c6d76b702aa2ccb6b76658685c7e1c4abc6cc2902d79ff82d3d6da0525be5198d07388b62b1173f88695b03108129e2915822910f25007a6229db142c8923880427645437c9f180765464a317fc882b877ef66d913e6dbbc6701ae7e7e1cf0003d681135a76f59fc9a035b8b6396c66f2fc94a4bd524a816ec028cb43da0e611d3ef20572e0a6f2fd33659cc85f2a4256a4badcb8d519aa780a290867f1a0f671d7de122a3b7c2ee474837dab5a6309f3f90ea42eac6ff768cb82290eff6fe0229333c5c252a650f4bce41f3353799e093a2193f9d6da2e3127db550877c32192b1dcf144b7981259c3e3a5724c993b5077cfe4d5ce3c76de5230d116a556e6272cae5e1ac6a2fcd4478668fd1fc4ef71226dd1ee36516b8b6933236119d4ec7e85d67f2e2684089dd4843cfb4fa0436a1b0195d0f28c52c35236f6f563e3e937e1df08c33a40d2981ac9fba210a670",
+          "padding" : "3057301306096086480165030402032506aa02aabb0500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "aae38ac4dd42a1a038aae4121f0bed8a401fb8861e06cb96c4be4ff803dfaad82084113998081fbabc649238655f2bac523d0109c344bcaf3c2a5613ff8151f94dc4178cc56ed45b31c9935a4d35be965619335b9db9d6ed312d29c4c38aeed6893031fc0f0c9d86b4155cec28541ae7b17eae83243140f8d0df248ed9f921a3184aa944c3c1462495524f25b0fa00124710b36bf03aa80cd7cc549f62578031c6f01cc3b182af18d5f29bcac956e6ba549afef1f5d65e1361f4bce878bfddd526110d6b683a64a522cf56b8f22c2d6c8d181ff4de2b40fb2345badd8335e09cfad9f1e9db86d319f0f510c73a706f8191f7e5022497633867fe9d0d850d39107bf63e6c42513501affd5e253e329ba1145a650101384e40a804944f9347fcc3fed072832a4f2688588340bb2f53475bcf16a8cdfcd4fcb8d2ce874d912459a631c1f00a8e7648382c9f485c6bd86fe02087cb899c334ef7b5fc485f30548d0924d8fa68fefef46b96433d2e806b58b13e0a4dc1ceb92e61120ad5c2734f227f",
+          "padding" : "3059300d060960864801650304020305002448aa00bb00cd00044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "adbf4896d40ee3a9e30c01cd0392d508d3dffdfc36fa624e8040fbd578b1c40258e8e42ede92830cc9492e323166fe56cc93f440e57be3be96c6e6ed8d9d9540e5a68942d8df8adbabbd4962ce4238674e5d7702a7bb4dc83e0289a1b3d57019e278505fe66bd2b8901f832f9f563624cdb465b59e95f1fef1432b728f0af67b3d171b6c4a9b98a582a12c627405aba6e5a9f43a8abc90fa341b56c39afc84392756aaed1659b4c08b70588e65d9e4e245c598a14737bce01ae0c0c16c9da5cfa7c868c264ec46c7f297982f6e009093f93275e2da5e74cbb02cc73b6462a581534fa53cdae39ce37a1c66c27e162ca559aba518a8509bfc827fe4ffdeb2232bc01fb1c92ea8f23b1ec780933cfa0c8df707baa2a796e0190e93a9f90b05c3fe5e5128864b08cf0e27296ed862900e227bde557ff47eb9d7f97762baa59ff5d22b6461af29dd2f02b1e1e20e432b7dd362e8510998549a23857f083a44ac2036a925b92310d9749d8e85c59dcb5fb1aea5cf1cce6cb714dbd77510ee81015bd3",
+          "padding" : "3057300d060960864801650304020305002446aa02aabb044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "38981944b5a9536f7eec9ff78d3b7c1203e94f50313b30a654694397f597695141c3e86f0881923e0de58e0220428fe362c9feabd088d49c0ad93bf52e322b8ff4215b122ebed895a29ea72c8e7896d37f0fe49ad6c9433d4ff16258161ce21204a908869254f0fd1fffa383d8a23451b5c6dab2e9f5481f9cb1b427ea867c05abee1a76a130026908396f2b5facd6426b2a45e26ba6d623e6b56e4a0bcd6f88bf67c116853eac6f29355d3b68a074eecf7ce4daceb68892d078afd70d0f0fd906a592871356145e3227615d50302192dc498c61e79acbe2d2b9b1e61c2c18cae80155cdfe85aa110a6554871f7ee0e64ab3bf61a94c8c42369465d40679cd348928ffa582e678a618c6e8661b51c23368794e85ca699edbdb08d73b83bf66e945c18c7732b6ad85ea0c89ad880dae3de5d09f4ac32fd820360f197fa4ac548d73e44732d9984e46067d16a271469035f3084db2fac481d1f14b61d8273ac320e54e87c9627d3bd2428539c00366e4fdb8a367784e75460e35b50e111aa22b6d",
+          "padding" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "6c773036cb6a6e2cefe921c155dba50e1ca1aab3596aeadda218b05b5cdbe99174f5e6932df80b349f557481e51dd8c3b01777d85dce5ac2d88466646d0a6db82ed261c5a8fe0eacd8913dc941f39d54209410a2f4c4dd4903e1a334aa5adec17e21b274c327c1c8c577fae3572e1acf88cc0567f60930fe7d3582e06ba1cee542985766fd2a5bd324beec1a0d7bb09f6e29f548e936c1966d75607275428dfb33e293d49ca216caf2074f4c8c698f9a02dd3191abf0df2750e56808e89718897eacc64fb6a1186512342cb041b55858867bc42e81bf67e94390f6c628863a6f5d1ae6c28caf921eac0a9738e35799573b862ddb80698c313543e256c0b939152436b8c617f9c0a6db58a1be76d24741d3dcec36a1dec76ac23e31ecca745c93423816b6197671ef8e905a18356494881baeee6c37df47277c9c978b978251929d5dd23acef7e83306b41d9831750cc0af3d67ac10d741f7f78dbb48be0e55641af08bc6566d332aba39710ae2e9d080daf44444f4886bd8b493d6885ff6fe00",
+          "padding" : "30443081044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "6620fea7f9ace7ac74c838dec6ad523e77af793103ba27faf2b6ee464984fe04cffc2e5cb822a10fbe3ab4abc82d96d7090d1fe468ab048bdd341550dbf19828f96654e3db78df2edc8cc09e2281829d70ef84d2f9d9ccbd860bdd61212eded03643cd68075c35ba391dc07dfa422b446bbc834f5382fdbb9c6b23ba8f7f501fc7b52c6e18ebbb42ed7d3e43d7e72911a2f24557b81b685644df9777308ba2a63d0baa7c4d744db45b4dbb756dbb5945ef978c3e140ff851c7128bc43ab48ef297f664ebc33a3490ff0f95899dfc7c06561e55ecfae73406e7b0bd9dee29a4bf9538d42c74ae0f9759ea2fe7ec65566d637e23fe645675e6ba8fd0ea50fe6b617e211bb79a471188030dbefd16c115c67c8ae6854487f68c5b8c196d046425d34e91da1937df0e48df892ee3291e2532fd2f7b0633fcfb8e9f59d03289653b36e93eac77f00c3ca751dc601f4ab7bb1581cd7f1785fa959d85b87d7fb44d83b6742728f8a6311096f6d73f282091745b56eec604fccc0dfaf019eb96abe37e17",
+          "padding" : "30803051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "aaff23fd935dba2da87b10702f80d722c19a81a05b675f7e0e19f6e006e37eeec3ce3b05f11b6a5e493712369a768346c948c657939b3f1aa9857a1d17775eb0c20c2c2b95514c5f158cda935de07e076a0b7e8e69b0a896e9e5757510f94c4cbb0952c804d882d36870497c0981ba9fe7419062852c3a3c3ddaeef9d5b59387474dd4717342d30981289d81689cc101a5bc60de467b19759b7cefe2ddd717ad13e65bfd0158e394721ef2c1ca0ba98af14e5c1d88ba05cbc012c1e944f7d06c4181940c46f64f70debdc474b3e46a37c25f8a6435aaae4081bf883eda779b48abd4abacf394fb5148f4b3f0b7e89ca8c0cdb3c1ab007f5b48f02628a48e67ac51c5dc74976705febdc1f32ab75fe8f683becb6de0f9b81fc76445d8ca68bfecea6e5ded79f92abbef664dad11e508d54c3a0508287c42b687b304687e609dd764f800855ddb1e6dab4b219938d0f890412f74742d6c1734c078ff1fae54bd43014611eba7e7c0c9dc399e638d160410e081c98694d82b747838514223980495",
+          "padding" : "30553080300d060960864801650304020305000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "e880fa8476ba3b887d5eaedcbbc8c0147c9695d719e65242dea3364820908965088d9e89dfce9faaa94cd847282778e0629ab7ad20051656ffdd59020d5b3deb36dd680c5c77ed74e0f2c7bb364fc9b4affa04aa5a1f606ac0ea58928e0e88853acdb6a6883374c28833927386dceda7d5e99a97304c07a75977c859f5e5d8bf7a77130036c449c0a9781eb0909d9c791a1cd7e542a25d44cb11c53c065773392746f19678bfb93a0c5e1347b919c3199570884dc78d2c04924993fcffbdab41d3bc811e965f16742ba802b49946e1e9499db4014e1e9c5a22662ac5e437f0525fe124dd02e2e850e266478fe903325b1a0392662e7b0843391f93df870ef870b543aaf6a5a70d87474d8b013463a10924faee91750fd64e4d18310512756caaf970202401fb878de10eec97c4502581bf2c50d5d339392ee2e41375ee3d5cda64a291fd9ba853bdc7f8ca158d53d2d59c0d049dbc73179fc6252670ab2dd2ba1a30c9b96646bf5543fa2ca4e02d6e0547ff201c831262cf656e5a4c1ccdf693",
+          "padding" : "305530112680060960864801650304020300000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "1b42ad089c3b4de1ad32dbd8f46fcc88abcd7f7099d3a95d1903e80f96e582fddfd94f56069385717fa3da22a281eb35d00ecf4392c00c1b518a1e54ca7d9971643d6c0a75b15518ecc46a73b1108026c2e89bf1fe153798e70420364e447f8dca5096a1b7bea16df4e38ebe6bdb7d758d839c3c61a7ed7dde193cbccf4f77ba555cf65c248313116a4d549c314b62fc5bcf1bbc649d336f46fab6a28dda4cb29dba704459a9a25160d05595a0be63d1fef5ecf3c1167c06868f3dfd3cadc5f61e1aaa2ef6cef1916ee215a2347fbc26078037e4c1c7fe9dc40a0e151daed6a5a30b6b09a29733599bff959885a1e88482da0e7ff8186f924ebc6aeb391c93883a682b6d66b3884ad51b8f1f7c664bd31fc01b966b68d26d6062bbc52f66f020edd561d38417a780f53ad9d8a1219df6be31913e7006f15648d96c3eca2b54c4258b78a27ede8a4a8f24eb4a04df289db6fdffac936437fdebff11f38cb1c958a2aaf68092564f5d9d995394869d9b45e8bffd28d60224a6c7f30f32792755ab",
+          "padding" : "305530110609608648016503040203258005000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "dbaea130782f159f2e7dbbc5d61d7404deab0c7e604a245a73a7cd1df1b48a32b7caea2180a2e3fc4d66f706aba4aec414662fda761c9b56d8c8ec100708d7fb3cb04a1e82385eb5645a4663d7b59d3fc2ef2de527e4c5998cf5ab064ae1833c8bbd714268034e7e269b2eeada1665298b468915342681e811d93ca0b21a847f49876b9a44b62c5e7be7ec16bd40676d31da7ca5cf3be55092b9dd5aefad9dd4711199ee6a806e4fb971f767277302bf5dd5a1b85208ec5a89faca3374854799baf8771e4fc3f98ffc0f71825e895a48c9be2f7697053a906a41fd9a4d853799029a7e4cb05d3d4764419dc3ea3077c9575f47929402090a0eac0b3a004a64f31bfefdf315f8080a0e532698bc704aa9530f7095aed9cddecdc4747ccdd2fdc9e3eb3a40eb7d3b432f00bfa237a082d8a0892f04bc11bacbb81c7c7729da186f6c9cf5d0840c3b79f89829fb061a6d0e1a983e7e99866564e8ae682a73c1e6e1e5a9b2b4d3e308ce8a7b7bf1987da5ddde05b34a92f25eb720c90335375c6742",
+          "padding" : "3055300d060960864801650304020305002480044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "8e22755f152bed807d5a31f9072dca0f388e761e24a0208475b07764e7da9fe76b1653cfedc0575889eae4adef5cde93e36538d2702808b4056ff59123797fce02442d08a4f4e4b957e7e597d732a51d81dcda3f5158a3dc7239b3e0d0598c923affd7f06e31608f950a96eda03222772ca14a3d02eb00c2b6bde5de36904bbf4b81a3401a5aca49a2c0fe0962d8443a3b3351309f8df1e83e64e3f4ed20c1a883cd61a32904208ad46eaeaf960c4e3c2c39af4c21be815f9ab2118af1574f3746e8d740784fa97a583133eff38c3e2b558d8d7c2e0276be9e01b6cb22e25defe0c52c0f68b929cbd62a034ee2c7a63ba81144207f6f804bf18543e8dd487977aa13835e359423db151a3c5347dfdc89ab7bbebcab001aaf78f39af10b923ec24cf795e86569cdd10a3a459e8cc30ecc496996b871d5c425387a986d3dc93e7cc6a5c058974af46be2b617ccddeb85ee101bac2dea07674943579896ddabc9533c560ca5f14da5ff031cac5b1ea587751710674e2f023211566a5536b9a7d8e5",
+          "padding" : "30803151300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "ee8fe865ef88da82301e8724da2ebbf270a8be48d7e6e6d32bd57cc03841cdb6acf470ee716eadc23f155371c4b6b0183062ea44c6931922f2e26241cddbb6bd4c13cd7d74fd8bedc9d072c040508785042b218b55a42af61f0b52b17ebd694c12cf9fadb6854179b3ab8ac7cfd5b6167777f001554abae331b09f996afb5babf3292ff8fe9a380fa6d7bfede2f7b73aaf4684b3fb8a7753602096e17b05c0bfe531579a303eed596b6c7e583646e5746cb917ae3dfd1be2f2b04de3db7c32571c9d45c829df0fb59e9a0a3217498067fd121ec63b249566113aeb2a1733f0c47586144d35ebdceb79375fb86343e5034af795e6d197e09e21cfb9d3c2c3448dcc7e9eec34eb3f009575dacdcc25db9ed33974e279958229e46516efbb77e6274c20e6d86b712114c46da84b581e1a95428795563316b0f42667d2524098ba270f58e60c977136b89715419515d2d53be0fd22c54291d161521551006e3e413a006c8964b4734636e40c06c81171df51c534986d90665bd60d10f34b770ece5d",
+          "padding" : "30553080310d060960864801650304020305000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "03e3a6d8ddaa0dc539796b84822e3e3f59ce2ee733246e891db71f1a3550b0fe17016382a429c7eeec8fbe2444c9bf4a8de7883ad7bba6a527e15cfbcab2f5bbd6dc6d8474bffe41688b6b73ebd8874b6db8a2d025ea9af4000059599660296f890d70d8cb61ca077e463e1fe3c3cb81d0378a603b2fe4405b28c92a5f70e06ca283f32d2650d7d04e252ce08152721b5c6852526b14828159bfc199467c901e658edeaaaa6272e8829cf1fd2f802f4aa565396310a19ff95b93e6291d2dcef36bd90eb3edda917f4fc1e999e335275748203ca0078ef37d0f7d4293c4f5fa3d90f02a92d8bb77922d5f7d02176a329fc1d587f80fa1c247cdc2bb654d2610b2a8a3c04abaa04ab2ee9533294290adc8a12b312449b2e5deb703b086c7ea4887cd8b197f1310aa32694516accf4701ace7a51b5264ae45d7d007294f141387b1761a0568b7ca36dc23694eddfbb7658f5836a353b1029898cea2e647f5e14b2adb01e8d1fa462daf26280ea94f14a252ef5607ce31d910ce1122b323e9a25273",
+          "padding" : "305530112680070960864801650304020300000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "aed52b6e5941a4d7225768a427189ec37a5640f8083827f922bbe563b4e96ddd039e2774e4e790a55bd0986936de6c64c08b1637a1c6bee932f24adf58613d378db73a947e5ad20afe1549ff6e02b6a7f089a97e42ffb2ad5fcd05c4d49a2d82b9437bc34043ec6213f0ac593e42a9c9d0faa96534dc30cff56c8692bd71d376d591b10c450daf3c31b60b5377b0b4639dfbdd6e2ebd5c4e0c344c02dac5ceee2b661b97ac670564604a0d2bf74db73923089fd3a1adf60799289cbe6dd63883818550233e45698d3e7e4a9b0cc2078373beec13e8523d0b118e15705abdc804b785a7c2e8a8ba7106260a5dc860d8a59b717c47817d40be37c392f5fe11662bbd16cb15584f6bf9b5bc577cebc08ec6230e0480483dff16a56ab2ababa26acce9566a10bbf0998b78e1b4ef2379d8a2bbb28da302e6f43d2ea509846c9d079f723966c969e5c1dc383de47fa2571d9e515aa343010b1f8f1ec1d588ad51bb6742f354a5547e5b80151a70d6320c93ee66951b6d44472ab3664f03a3cf309d88",
+          "padding" : "305530110609608648016503040203258004000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "6cf1b3bab7cba1717d2a31fbcf7a2218e4f0186fc7488c3054c2193a97d3824dd15d2e15a7268676a2740dd428fc55572748c8a0b65ceed42ff18ed42439f25664d7ccae0c2b72e2578cac39c69c55d5ab852a34570eaef54db1f91dcfb938fe7d822e581a3a5eeacb836358216ddc7d0d8e56d9aecf1698079f59c7faf4bec74fad37352a1c80c737712dfcdc8f0b8240d478ebee8fc626cdea531365279ecca43f45096f878b18eb71cb924d7454e41bf8c7fbf0d117e082a7310dbf883b439c315e366c98ae886158d276c05e2bd732ecb32e1c5ea05d2cc8d4585c7d3af5b7cf72a02c0d91eac7edaac95ca47efb9c0cb9f2a519c139bf9a6c9ac59de0cdd35f5b6a17cf7f66b822e62aa568ed3046c399e834fc741420200d942fcdc648fecdf186f46a920e87e1313458a312424da15417286ef53fd08a9e38d18a97a819100dbc7b8b43fea385d15f9227332dbe606d795127d95e5f5b9794b81be57d49e48abf11d35fe52edd54e8dd0300588a0ba62047f562a5abf47f0a645f0d10",
+          "padding" : "3055300d060960864801650304020305002480054043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "5898c8ed989e4c4a3780a2868ff1b4801909ed8e0336b75cd32801f169cd81aa16c34dd21fdc78aff996da124f9edaf3542247e00a4cc5e47eb9a837d07984fc5d2f0814d22e274851643963d349a43167a0659549970c053b3cb4293769dc748c6f9d15ccf683714b5df003fd7601f9c62c2c31f5245ef0676585cdc008ad087b8237dd17cb8d5720c98256c9a46daea423fee19abc659b670574ea145d5057ac3837002166ebcc14ccd990388d533fd12cfe7e900c6e80334b9bdc89164dc4c255ca346775944337b6e9c4472a2b90abee876b3f743842ac46e3028815be18af5e405a8f8d4a5d9d890716c6bdb49d365edfed199b2d91aab958d839feeb62895dedcdb75447d741f1be266fb66f915af337716950a4078aacfbe3b744dc44b7d991330f92e2015de7a3ecc6024cdf4fb8106ace7d521f67973a7ec7cef27d66e359989009c68b08d1f0baaa8270ea0323602cda40c9721d7cf667c1f319542fc5eb74b85455b182539497672dc1e20a375f1ba75aa6297ec615d8ecd0ff6e",
+          "padding" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "c353da6e54821c2bbca7bb85317ca50c0ea5486225dae8033c39385dcf3a2fc440ec6aa7dfdee90209cda40ae07d20f7a161df4d17020f620e3040c376f5bb952a7d250d9ed76c3c6fb53d99e2a7d606ee1893b8a62c403e2deba0db6fc27ed8f3300bb2a57618dd0665aad48a9a36ee0259f74b084fe9dc90a1c82d198ce0bef8f3ee44c83795f85e254027ba64487f546e475caf2e03fb563779e8ab3fa7e3f5740d2d3e97892d8d786f0a502f71e3e9e8d418cca8cf1d1ddedec0a5737a8c3e5d07388bccf27fe332b8a3c6965c777f3c6a7b8f6539942c791a78c9d78083dce7ee6b60bbc98dc36cc925d42cd2983176a9fc88d67f8ca1a325febd59086b10c3add5a6573f76154173763813f219e29fe466f0346a7dd9b6c952fb8ff6bd7a0b19baaeb9427fc554fab64d520c1b81a00887be9b50d34507d47dd347331e3948e633ec0738a83deb5c379bacd7623ef2b89c994db4825cdc1ec39113431166e4e240e73cd6635d9a9af25f72623fce4ae4167adf48d24ca19dca1dfc7993",
+          "padding" : "30440500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "aaaec870a8223d256457cb14183889938abb00b21366b90e36b3b51fed1e170c0b3a8944f5cba54b8d233879fda1076a2303309ebc04bf66ee4295030ffc6753f4eed4a138af850139defe1544d5eed4e7e8b75c6c39d66fc68e72921b98cba19f5dde1302e91336aa81e21654892dffb0032b82fee80bbfde4382f22e71281a808b81d58b4f335cfdd6b170fe0998e775181d0304e1195d6c2fb333bf9684b16b10a06dddf8c43032c8870739b39be55e87b0a66bc7d3d65751083ba92086a7750f965eb2952c745747d619ef4ccacc99ede9e2bdf25d62028da81afba377438222a053ee6945ecca2ba227c6da44397951c5b0e28e7362ac5c980295083dc0bb7c9783b0bada0f2ad61e232be626eab91b0c52f8774cc3331f6196b4c16d21e76a3eae64ac85c525c90c670fa422df1a23827a93563044c36af04c7b7c96ae7eb9833dac917e097a1f6a5951de61adc1f6fa3b6aed4edd4fe0d3bb796a88aee0588b8d15bbcfa572a6e697b7d23087d61f6db7740d307f5edca795188dce0f",
+          "padding" : "2e51300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "41d3df075cb50c135e1d07a11d9239a9102dd3672169ccd072ff78e7e955f61c40d2971e10a4825205d067f37eed21f3487b9a512d0c80f09d58b6cac1689cb25133dc840c11a94372332aba692d5f6157a1559e28469ef8a57628b17204b2d81a8e21c0d91e0cd15633f7e612a127f98d64909b71bf3984b24aeb1ae3daa86ea44337e22a91e63b7e1273275e51dae473b0ce61a2e3ecf650d38fdea9e05bd0e83a564dc95869bf1fe1d19b5be985424f55581208b09f6e26397c0bbd51af1b22198f24d483a2e234f2f90ced3b780f7323f29b404dbfd517b4e53bf1fb40d29408812254177dbd7939347d0fd763d2f18fa7e83f0effa7e539a3061a3b7fe77d9b5df5d50600cf39055116f235a60f298512b783e22fd83935083185f565c9fafcd0f038e55ad23246ac5b1e9b6cd777dc36c889d4adce69494d45d5e15848f4ba57169df4a28599648f62e9919861f6d5d8c4e1de4e5601f9e41fde562fae0638c0988bb0c0ee63d24d002b67ba4986d1519694a41ce36cbf20c907d62d53",
+          "padding" : "2f51300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "7bcccc5b52d6a7360dbca47a47c6a360eb5f2f09bc402edc26e696fdc1eee72ed38b9bd3c9472e0e4336ce74dde05b4e94c6933c2763e95e64ab0a1d45256d129ec8cd5bc0a283f2ca0fabd18ef0ba2a6b66dbfac9feb7ff95fe76d443d0aa5caa7095a38619d44f07f5152c44df6acc766859134c5f9c9b8932c10931002e16564b074b28e2588faf7f127c02958a6ecbb04b3830ee05553c83ca8a6d5b1c6f31f2804276cd42e6489693975dfb1f17c09fb5ba41d9ffe597710a8f4d0b64907b2aca89d6d5beb26cc78125e4a4cb3565aee24da8c210dae2dbeefd2d468d006420127f49f5d8e45eb768f9af9eb54a130fe327bb0ea12771d4a6e36e89fe2367e1b373f7c46b34a67c42b165873bea2b763473ecaf60b3894f76bcbd78302bcb1bdbc9f8f42ab9f15c0a2175234074441aaa8da806a5a86880ddbedcae3be07e86fa1700c2437e63c5ac263d98833ed989249cd3e7db8f75323b828034fc4c7dbbf02eb8e3049010ceee24ffd64bbdc294fc1090c5998ccf40098c09650418",
+          "padding" : "3151300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "291f4b35a4dd89e9ed5278e18d322d473e435c7b9b611bd62bef17e6ba619c9e811a295b5da39dd291b7c29303f0cae07ece61b8f3849644f34e0e3dd291df0de5e7225aaafeafd3d07e8e1846b53e0ca61121f91b293a3786fe6a23fbdf15c5adbfb8dbc43540721367d7e9db32588d7651b329985ed3602fa70b3554ef00718155054cbc9f3985ee0c731b05f4552bb64759f398bd36b2984afe66b50c51aa4bfe8ea8a223b827d24904e8781bb1abd5667f731009d315f37bd8b3400573eb96d738be26b0a13c98b147e3f99941ee3608b1f38720c55ffaedd8fef9f815c3e1c48b40134de9553f38a8f8945707d9bd0ce4edf51d626b15c522fb29852ac5f45e8c8fda54bdc81be05088372b2934d7ba9b73c081ceab58505f9080dc3c3941cf3121f5705cd42d9122958148b60740aff97e3e55eaba7d093e1fab65caaa065537dbefc75a3067375694e3f8b7b585718de51829d13e6233613d199c1dfb3f5d16bc056f768253739282bfc248b1870b5c098664714e3219d3d3a433c5ed",
+          "padding" : "3251300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "d43971650646e5535fe0b97a8fc8dc2bbc93140b750641ac2f4302f5fcea941cde611894d856b7c19806bfc7c7708c100254b2e4caaa56f6a3a5ff4e105058679e07b291eac95d8bccfa91811d6c167205f49acffdf0fde91c15e6d3ed37dca02d28ef25c7f11a910c67a91e996fcf397b814cb1537da377955d651d6baccd662e9d5c5264516e4e0c6d396fd5aaecd9a093bfbe8d0e8f9b64a2c84f8a2874b1a788cd94d307658740dc0358535fa1fb545df3125b7ae19f8761a3ecb1ddfc24c1ef754d166239df5bbfc5f4666c588b6a07927e3152a2cf5008a2f718499440066c59dd23c7258bd762c8b06bb12a89dccba58eb8c9851455148296462a2afbb2d392cde73e38d2a1e01ed5b47a85ee3033ea02f1f4a4898c3ebdd5967b88811727fe5431c52c8ef4e58c2e001059e8fb6967d37f819a2586bfc8c715f842334054d70d26882026b410c251a17b89f052ea23dbb9407bec32e2e61994bffb04ba11674c15bade539faa05d84d73aac4966dc075ca968bba6e5dbd8e16a66082",
+          "padding" : "ff51300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "75cc5277b4df2add60a44bc66ee8cd4b62e19f1fcbb7b502e139b26c9b7f16c59a82041a1668d530522131e0b602fea4f5206a59bf793657bc51d320594f504afd7f681627115f49e50e2f3fc4e745b0d7c412d1a37f8b8cf1fc53c25a65b0bb18ea45667caef3a8ed608896741b57d7bf305740e238cc71e930b99be530e866227e0ef26a82f5be083d4dd58b21a3c5f01f29c72d265afce64f56e66f85373939185d312aa83e58d82ab01ece9a4ba5e4295af10d2e563ff571f8a32e68ae78d667af19e17cc1f954620184ec228d8e8982f19c0e4f7a10cc1bac881967371be184b78af4116ed00c7d4d1fcc3b2aa66d28461eac5422716d0a7bfb5d31d79fb4d6b2fb5799d7c86295cd4bfbfa6bfd6c8c35463885fdadc5e5edc2f5135323253d717d7d1e091be6413cdb898800ad96b36e8d2b7c1ccfbbe6a97f516eaf9fe08ef3ec6c902ceb54a9593d65d0976c7015e3a7e6780f238738d3ee725a16a94041b09484acfa8d010d37b78febd3d7a8a4e95d90118dc1897609be0854274f",
+          "padding" : "30512e0d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "9b13eeb9c2d90c05aea36362cf7c99df17dbee7174efa2c2ebbe097211def94cc16943636cfa0ce56fe72254ef79558e4edf20de56edd93501853d63b009b00d40778fe0a46f3a220d0681cf1dc54e3c3f9578f69e9c14055c73a6ca4e2a2cf00e33499879a3c4f6c4ad928535b40220e6cc49a55d2f809181ebdb6ae6c439a235cdd36aa223e56de9d53054bdddfd9514a038b4edc4cc8145a5e37037b3b4bff7e664d87ca6221d7e22b1acd8b54a9a5c6da5da7574d2470476cab1785afc7d7598d4ecc7201ad0aecc09a8615f50ce839c75d224a1771cc29e8a429516529105ea9f8331d1b0a2d1a52d11663295fcd24245eb9ea04fef04d5d17dc3a77602ba98491bef151276a0d6e37e31fdd3b0a463aceb0b03dce495c9fdd85449c305f933dbc1b3fa71ac2853ca04a67727acacb77c48217446854de289e704eeb4279cbdb1d4abfb3e06a2b7d66e0eea608aa5f5843bb957c44902fd1a8d1121811ee891adb63a8fdf6538569a2564d7181c7aa4d4f02cf78f6ba928b00ad6544da9",
+          "padding" : "30512f0d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "577f6e42fd397449565db814762df3efc12973529b0b9f825bdceb5c9c569d8f57da7e97f0007c23d8f8a88f79ad079644dccb2a20bcc56675267cb8d6ebc18d74dc9ab58b1bb508f3b30557ab6a09842d0c02b58d0bc23b6225c551364ba6fe15154ac2c279a2cfeeb7dfe5e4226f24802df3571b72f71b52f99cd2488008eea573aee351508ef0af9d8849621e5603158601444732b6f62185adf4134621e519444e4844d551eaa0779df03f1feb2633f6fd293fc1d3fe2ac1ade85e6b0f6104bd537f67fc09a21ab6f32cd98ec916a0e5e60d385cd4a55644b42707f6e4ab1558209521beac521960c1b3960d4cfd132e5454b18efbbaff1485858a1258de95b871eafe07211601b7f116d3b970fe36cac65c445c62e8473c544dbe9dd03f51d20645fdcae8c918c28ee42d46b8370787ffde9d3820bde2e13cb48d555eceb1db30b1c686d2f01ee83c44a07bfbbad044b786d6d02530f6a101f7a1904cfb3d4e3cbd2bd07accf88bb35c104412f1fa0994ac8d57af6b70caee6186cc44b2",
+          "padding" : "3051310d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "c2bda4a6569e430e701b1181abec2424faf9215a0a72790873f36a0fd935892b43b221596e840b062e7fd05b284b354e8d420efcb9027f1f4722a41c83813f6bc8917baf7046e4491a1291e606fbfdfdf8a18093d1a521d2ccc6a3444d9006c8d16721dce5fc82ff9da22b3eaa841e445ba58a40ea0e96cfa07d067a3a0e83f897fa941da57eff9ab5e0a9b6693dc36d471dd43bdc5b71fbc8d1fb8c22bfa91ea846b4d228e474ad999c2a5eff17ec85678b60a2de1430286f24bfa7ca744041c1c54bf08c9afad6d7387d318cc3980f2022dfe6abc6c15e1321dd835e684f61855546a4e6e74ebc40607e0878d61eed6c287b5ebc3c1b17b2b7b81bb91fcef3572bc8049dd7857614b97eb393bb432ead46679bb77b146a9b27b22e3961f47a8fa38f6370849630ad2caa216ce4645a13e518ff3d3e10bb6d390df6c280482f0d053e08292a9f4152b8bfc6e285ce0b4cce29430aed9956b6c43a40983c2140fa3a64b2d54ca29c52bc63bd67e22270f0bd76ead8e86c2b8fd6f42cf2628c54",
+          "padding" : "3051320d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "121c2499b559e438e8e0ef2e2c1584967c83691610dbf91c9f7422c92a6010bed4d247aab8c20135811193b27239d65fefaf8da30baa8d9d366da8c264a34d61abdcf731b2d4af79abaec9ed4b5dada3c1e982d99b617d42a4f632dd8725e51c937f7c45650aff47a36641d245d0060207908bcc4bf5491954dcb9ac27d1662afe0718a2caf7d451a4a17d68f67190afd4395c4be53eaae6f096d89cd0af20364c1f6f921de4ff75e77aebeaf048b71c4acbd61e13ea90daf65946d2fd7e38c2f50c71e2b9a17ee81017f99925016b0af93100a1d8ba576b07f3479de16d561b83fffd8aebc5ba373d2b28dd5feacae9c0f3deae0a60f3af071dbb3fe07d4142ef2f1836c8944d250ad5f162e92827e64a8593b7df3c932d72b8bb3b416f825c495fd29ef3c3c67efe917e53ec9a71d0ccd29ce5717326aed80665df34c038d6d6faf52ec0e4201acd4dedf6b9774c97b4c806ffdf6f45fe4a2b62433c1de34ccbd14386db40a2d85956fa062b26d232ca83325c38cb5b006ff509c32e50981d",
+          "padding" : "3051ff0d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "0dadbb9332b072d1ad255e22a641abfbd36f4e1aeff311e8e2f81b4612769c285ce708e635549111c9d1b125de03da3adf921964d74299900ee85a379f63b2513e36f5e6eb8b57fe7c0b09244a4e592c6518bb498e5eecb43280d801ffba42bae65eae9bcd7067eeb3353d7914c2dada87e7035f4027b25e27ad6172d231fb27d661c3a7d1c99dc5b402d85ee471dbe0f85b9631a6f9314d99debd84f537cdb789249966265b0ef3269a876c2ff247566855a5570528be74cdef53c596cbb7f01beec17ce61b9f5032db0365673a5b48727617f8c4cb90afa4136e4ca511b80b4fae57afbd1834386014f2f352fb43d5d7119b5b61de629dae681f956bbea009ac2bb52f9ee4c33946ee84252dabe5ae3bcbd9e1a28c60f90a222b6fd97b499c024671f038a9aa7c8b7641dbe1443d3aec968d360ace3f9910984042d5256288260d754648f366574304437f2097e55c4a31787075f0b7af2a212969474848459ced0e3d2178c322b6d8edfc957350995145bea5e9ad81d4b3bef38af862f320",
+          "padding" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "c2719fcf01676eb69173e5b862b3a2ff1f1e71ddfa0f393749deaec8a427ee39757d90dd21e9ff74d142ce9df67cc38e2feec46b74957b287d2767380b53b654507ebe96dc43dba78021d71ea7ce9d48c769d0bee0dee2ee99ecd9cdc9e7ce9f1ace832376316ae1d0755db466a521212747cc1aa94301bb99446a3d5c1e33dbbc60fb73bdb2a9e561ceb2d6ecd6d5c92ddcaf2b2eea8e12222a7050a8dedf44e55350a2c4d2cb0016fd95c2298d0ce805c140f75b4af6912fb3940dd610856671b9e354b767eb28a4f4dff3458f78c7add72617420a287ef3e5486b28307d88ef7bab3a737528cabce0d934fb722606c6fcc942c82ca993c9afa54b71b72056de2437ce393704da59413d419ea8439c3b1ac341e3121a03ad66dca6bc3caedf46cb7c43d33c5f79b40a25a922c640cd943fcaa1c2d8dd6c6dc645ec66c2a5e3873add5cddadb21ae51fa14115534fef8abdd153e2b944892a627cfda3faa71508fe489a28b5bd0d285117794239d4717bbd31b41803475e18b022eb458cb170",
+          "padding" : "30443000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "238a0867ac39812214e7293b9734b0cf70ddbd96c20f27b29abcd7fcb037534d8480fc9d9186227fd919ba35602573d55f1cedb9f307680ccdd850ef7b92a663b5907a83e9e786af8ffdd3181752f839e45649e346cbb0d539b1de62981620c12245079b46d2703e968fcd9d55816fcd3c48eba0a54d321c3d8c341004b45e90ac3013897d4816e007886799439525223607c5100f2d8d48d80b1fee6dd6b25664662460f64b9858f5809845010a6e962f2101606a6b52fa5e154e9e060fe8a4518943385a6cc9af1fb57e388544921d849e2dd72b65f8ec955093cb4c7f18783b347ea19b0325573d92ad4cc0518b6aefcaa156fd4ecada18fd68ca00ca70f8390adcd22aca5fbb5506e8719590d9b74c3a325cbe18b96c2e18d57be8d9907f76d156c8b3d265d12733025d568366879d233a9463e26509bd1a26f141c98946af0162fd5595c83821caeb253be2db73b3752d6dd2bf597064d6ccf6809d02ae0756df341e530697bea1deb37fb34840077cd3032ef1ca38cc302b19d26c3ec7",
+          "padding" : "305530013030500d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "abf57269b9d9d1f2bd1b8df08ab37e56648ea96d30ec02804505fd303213f0313a789e62949281a30e171176b17132b41e3b2163d98fba58e878d48927ea2fafb830f1c4ee6de870289f3513b2afd005f6b0adda15b6b9abe616416deaa9f9e720d246b4d19907514417744d3180d119a93b9b353d7da0913ecb83d01dbbcb8b44571a00bc46c656fca80ad9df6b2e4fb2cd8cfa9a8fbf6883a9c2dd213cbcf0a3e104c27274276bff2be215229756a4a58052e0ae3132ce018f4406210713ea9391ffe1580d8c0c937fc63bc514ab69bb556010802c5a53eab522ac151fd22417b0101f6dd3e020f8f271b8eb2f6086275422d42fa896a8fc3df69c17ce9bad8893ca2b8578bb1866c7673a3e8775dd776e28709225be821f6fccbd7926d1e18605520b90aafdb6a81554d97216f97697cf52bbd9ef55807de827b94a1e54aa2bfe8c778299b1753738e475aad93392dcf99c607c89c43e90e4c524f0a4754281e442c78fb1264e70a43f1d97df8bcabcef359a232cd1eaa36f4761f459ab76",
+          "padding" : "30553011300106300c096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "312fcaa24bb029f9178c3a2fd5ee46aaa41ba1270fd166a097679d632984e57e71e4b1eb7cbcbadb29cfff24b91ce2dfb7fb3020e889b3bfa81647c26a0d7b8f1555b947bf869d551e7a7aae3b38d3146e22c49dd358a62ce634028b42f45ada608c64e8dd548815a42f77ab3a2e52f99c034ad0337470b4ef68bdda89eac668cf12b54bdcbb95ac18d56ae75d530d44ad400571f8af25bf4c4656d862697143cc02b5b40b489e7279a52185dd88b54fb1af807ea2d1691638ab84360fca0e8ae40652c5f58b962fef9ccaa4c6a2dab76cc0c0a0b9096308807def0db94e472f1c97bd29f25ffdf5fae8bbd53053d304f4ec214f79514cfe34623c745e3bcf8eab336c41ce7e299da2868ac955f64c738de975fb970dbbe450e528fbe7d3dfdec8b6f174edf706d12c128d0e846c8bebb23b09c53b693b031395df1cfb8835ab7739f29eeb9758e904e93d10499ccf64fec6942305962b4a78023007fb9c7548017448c028dad3ed092c961b81a6b23f9e14de6f9f78c0f559955d1af00e34f4",
+          "padding" : "3050300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "d726ef3a63208fdda04a5fa68889a77a717ac64fa4a32e51906916ed7dcce303fb0f8a620cc9f49d481b9aa09745d4d2accab1f8ab2e2e60123ce73622709ba8585f6076742dc03071b52c17faee18f6675159c5a842c98a270923c212a1dca4137297f81c9775245afb4f08b8b201635ae7eb5466782a6717bb57f78254198c16326279744823cb381014e4fea28cd3a962d19a194e72fb067689c972a9d3b9af7a14fa63a8ad1b2aba076dc4f750396ef9ab952ab42a1f14d65d9390f75cb7d48a5ac4d0eafda58096924cd6acab19c2acbe1ab0a39a6a0231ca234b4c00beaabb78dfddeb81363594aba0a2a6cf238f2adbe898d5adefbfb74cf9e3e183df5d4bcdf59f87d43f55da0de74884392fc3ec335bf23568946afafe3e1fdb0d2444e878bc38a18a27d4695a2e98f80b001212dc309c3ff24a7faeb24800314761c0024049f7ef55bbf02ac49997bd4b623856553dc813eed9ad8453c83ef51cd7cd2799474559cea86a896607e5976515879760fb245a34e500800860280e5ec7",
+          "padding" : "30500d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "625b90b5decd25d50b44caaff4f911e53e2886383e13df40fa812ca6dcda7186ee306c87685d2992e2a5355e5be06d6174ab25ecdf299d0fb5a282874a19bd31bba308c7cfaa10896ff1f5ba679f20b76d7e59b28bebae065fec99ef94e0e3eb7261ce1493f66955f957cba49375def2de39bbe4402b5b673179a86872a5a41568c8d9e4212e7943084fe97d6409ace3e07aac64247e1132072f6512bf2608084f5f79af1120ea04de9c9505877bb81553544fabadcd0278a4e4913ede9c0eb0530a11ad6e6d507debdd37e40bd6ef9252bf4130644abfdcaa59d29edb2a56e0664e36686f261c6c6bc6f09cef1b840de2e7c1ffb5eb202b1acdf40c0359742a267333c1cec0c4b931efd05d7c2c6500e8e2039622d66ccf0aaaed914b479b677dabd08ec13f14a0e6b2760a1997918a186b84e33efdabbb899f8e2bfafa15077bbb73d85a5df756636acf87dac49300ed0f0e6c6c0dd518874fc84bb097ea4a80ddd500a413e42440c2442b8fe42afe39c9fcfa6d1d2415da85a8ad903bb741",
+          "padding" : "3050300c060960864801650304020305044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "d78b84dbacffe53f9f7b058109251835cfbd56a206a677974a45b7616d66c33c0ddf8c5fab8f6da081339fb9132421933c0f0356354474ea2f440df9d2716583e3755c807a73d4eb383ca677043b30d9828d0392817b64168429787f2845bbb638af68d77590c82d6d7890333cc1a5e31fd140be91a1cf1678806b6eeb65cce02b88d5a69abbf31a16ed3108392467b476f7c2eee9b6fab75cf43358cf353bb2c626062bcf92a8819ac4b2f73d3b00e1e18b7dfb60c2189a79939a390c0815756613f13a7d13d9a79b2182152a29cd498b973b8b00b13ec11af697924fcf0f193aa316a9e4c02cf44cdbed2fbfefb7a01348d72099166945105ec08b3db71b1da6741fb20b5e7206db870bbbf422ac577340ece1d1a93ee439dec9da18c0edf6c89f16a0db8812f187473c8d1c27c65361f5145cc9fb0b3931c45669c0cf8ffbf1721baf92a2876fb9e681762c994dc04806b1103e06d72b852d168ac5b715f0c940e4adccd7a747f7c79b9978eab6c090f938e035d4edc80177b537989daeb0",
+          "padding" : "3050300c096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "654d3d6433b71add296e323b4bd6f1dbbdc60d5f7befb1c7509133e79d30e98ed9432d85a8d123a13ed78a1855d1c9d9c854c516d028e401bfea1d8e58be0e8031e8ce582f7d334421ab504c317263ef33bf743202b3e140654a7c9b1487f0d9454922a919efcf2142f2b9d0e3ab3ce803be110fa7613db80d1da8de04b808a7effd729b751c896c8affdb1172418ffc3bca52cbc1563a5c183f86497195410b57acb7ffe18c2e31dffcdb927a3544caedc5c4f640289317635e5e0ec56e62f68831a717f2810d43265718dbfbf6d2942a5d4245d0a86e3dc17462f42fbdcb9e5ae57b28279f0a394b1e188fe98f3f514642b22d1c26218b2b43aad98a0c8ea73480dcefc02fccad043af277c6dc2a39013a51a24918fc78388327198ca5689c346aeaa2556eeacc63f745dd94d6c8b9b54681cc057fa3abb725c8faea599b685cf30d948b58a228d77fbcc1b18e050c6dc810f7ecb5a0c3501fb8f9bf69689d997637612883752c8a29e51e7b92040f3686d2a3ca020a50ab04361c69fddae8",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "dc8b26af772ad6eba277bab5d97f4335c95f56a1ee5f1e248fc71b409a76883d29b2ebd65a1bd85e3a365284f632672be93bede2000ba6c3cf5e100b4bd9a699af2519f8917631d7563f4f1aaa2ddfb729118c96a01722ab5b74c93e36bb706c8edba0e43225ed825c41b8203e128c45827f43f98cad8e8ea862ca7538e19737dac5b54631cf68b65624845a25f5106a92a111af43bffde1f215395a1d9ea2c08296db9bf97e2c7bd0d6a37a21f97c7bba3ab7544400e2fdd2ca001115928086c177ba9387fc268770652213012b2bb917edae3416217fc4fe58a916d20c9507f11a9404d36e26e1e2f962168f06d5e3ec254dc8b554db9a33ef99775f246974c3d43461ec9229dab0cdfa876bc86a661f783ac2a313691f9e919363b2aa4d7691f59152e331c18c7f1b0f2d39408d937cbb1e669c78d509dc99d10521ad0e6c4a34dc30b792bcf56024aee4c8b9370aa73269ad7c7142886ecc7c29a6d79890922c2c81aa2f5f0ee316cfbdceae3ffa0010de32607efae35ca5f906b04205a8",
+          "padding" : "30533080060960864801650304020305000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "6d19c9ab9e470c402578e0fa8f5d82fe57b3103b94ad551a9174e9e8a4533b9571188ebfb096aef7c1103ceb2a93f592c0f55279a2fa36a0ab77592b110ae7d61a5948f5c9b7bb941963a0acf4ceba0767c52bd62ea4e5d22251e2cb366e61940f11bccce40b35bf4137b9c6447a29dcf0f73ceb1954ce81f37043fda74d38dd7b45edfe3bdbbbd87b74aa71c7384cec2ccbac628271ffc4edd8e9578057aa130b683c25bd286fd652c12522fc7f85b4b55ba4d1cbcab096b19a04d81c2fe0599581237ed6cbd2a28b789dc3edc6f39746cc0375a35b86d09c02f4f996849f0333b76ffa77713787ca0845bfada29a27b66647b6e22cdaef29e8094cf11dde792ccb6f4ff3e33d2bab0215bc7438f34c96765216adce5b053240eb815ae2230173cc4601dbeee51bd3192d4af32c573b7698497dc8b9fc6fae53730e85ceea2cc3d9a15fd00eabfeb99f487367f971d4d0c27babb071df80bcf2398a3e0666a04c9d41c39f72235f125332f54d4ba27b48f0bd580fab9ba74be16594f17b241e",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "d58dfb5abaeb00f79173846f172df4da2b6fd056fb23ea48a4b1c04fbaacf74aac490f49f5bb437018e68260c5fea5ff4bd263f9093394e256a85e5ec8b783da1b296937a155a14cb2a027db233957013c00ea573744b4cfcf58cc51d6787cee3b4ed6f0b23511efb5cf8f553985999dbc54baef408bc5b3ce1eaaf7be828742c30870bd586a63d8c02cbb2517812101759eb290f70c45250f5a197da3cc6620611853ba6130d59cd70f3a4d519e5b49e7b7cb474223dd8a5bebe3f4edb9cc44840f829843c024a7a269673c84677729c4f6a24d40914d8feb182c5eafa02bb45d2d4afcc57751ca5f6b39b6c550876daa5fcc32ec9d4f5d9b6c49a3e6fab053104e344bc7041c2e6b7ead33116cb8ec7c5e59cd4349cf23bc96b1e7b2dbc9f160efab95d3d2ee495f8fb91ab4d53949c946419f36c62eb0363c46bec6d77dab0258eff8910a3df789ab28681a059a9785039529a292c55d431cb6f97525c5d181d113fc24ebee04376b2c22a5faaea5f9431fa48688d014d8a3e22819d4205b",
+          "padding" : "305230800609608648016503040203050000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "9c7c0260a14cbc98d93b0db2c40028fcbc672b4a213f2e284bdf0078b3f9fca950aa43c870ad59a15d21fa0a16cfb292ab54a093ca93e51f32a325edddef0885d1efa35cfd019b4f5d34f8126a1a65e7e2586fcb5c3c5a4e70153477115830024a2400136ed195982e8c3aa76409c38cd63cd8315751d26af0183c2a6a7919939ab1a626b66106d2cc6e884b7f9cda3555ecc16f96a261b74aca59c28dd84ecc668f1e4dcbaacf394ee62d995f3357e387824086f1da4cd35931390f1542c35251ef713a965cc9a58d74a257a6b8d2f7cff0c6155b88f7d201d90acd9e4127dec43ea842f41647891779581feae92a67c184546737960654fe4d74783b13ddc02f4e5c964ed6e1ccef71621a8b75c47b6c7fb98ae24831e72800484b8c38cab8620b0a7a2719d846792f8a04cc338f462e81c52328f8f6a0e5031334803129ed6c96ef8a5e53ff7ee461daa44595c9da95bad9475ccef8fb0839b78b95ca3be577afc9e4b7b63d357b0613aa4d46a0239c7ddacffe6b43fed020c5e4c7fea9b9",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc05000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "edfa8852cbeeb5310de2778612b2f7c1dd18227aec6af8b28d267a6cd481f08c0e9ef807188a7b4db9fb2b315e5a6211a4a46cb4321ea9c9cbd5b61cd3a3011094b82d55d561e3fc1d8830ab99355a8c72266ea6070197f79f191931a13d560a5ffcec16f0fec99a0232851c63397b3cf0f561d9c13d6c54b0840387dd7be3ac7e365baeee631eea26c8ef8a09331acae63a49f8f52026447f403be950184cd5c3dc25acdc1c7468a33b672a71b474131853cbe020f33b7699dd5960a5a817c960de36eaa99805f5a2a56b30113b98bd30b38a12652815dd7b972545be39b1c6573781c6907e0d510f0dc876fa404bef9f36ae895d34008078cd49053b4e4e49483fe8198dacdb68b5e864a491c4435dc7a86deac9ed959a6ea6267d9e3120ac2a091cd5d63950f0c91b3be9954252872620dbdd11c7bae1729652061c2e12ba1b9306eb8822863f479970767f231954a863973916ff5f08e9adf1e486403da4b78b654dd5927481b28af50ecb846073a7e7f95b552935993a7d660452fe89b3",
+          "padding" : "305530800609608648016503040203050005000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "b66681b04e8b3faee9bac3c52d9c6b6e62c5454f744a19df0c91d94f30c8faaa5769437e02cf4ee4f5e3cfa78901213b54476f8ef2d6e619e6ba6e73205eae6a573eaf34abda20e45fa23d9fdc7d474b8a70809c0e9aa233da83e0eaee1abc14858f519076159eefb770c6c3479cd70dd3ce4aab574a15cabf8d9ed64854f52f928310715d7633f3210e5a3595157c1b39e8e9f939c406318d1af7138faf6cf2d755c213aafb0784ac126e71c4d2d0b1f054c28e80cff43af8fc41c51efcb2c620c4600907061e075efcf1cdfb25cb886b64451e07e20e16bd10b223453a7d32c116c2b34b6419534f64964c95ea3bbc08337526fdc66b5ff7f90ad29615c550f74869c03afb91c97934f89d4aee124f3b280b335605d733e395f2a1bcae5454701397f02896a647aa070db7d36112b427d3ffc344281917dd27592c530b6669c0bc3f191ca578486e036f99abdc5ad3e72ae325bfd6a7651de9b965ee56a6965bb3a0b1b6f1288b17a196f4d7d57a31fc9008e665058b299fb988b64be31a91",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "65b6b1cead06a1ef0d9b593e58429e3cecb4be8f3654fcf6f1cf5240c5e1f617520a79c69f1a759889a60a2739107d694e2a21ee8ccbfdda25fd30f46b441f1a524dd0b7f4180705aaa70533e56cd15b73f807fc6d0119eb7f7acfed7ef96a917469b9c74898de4f28f2f8b207221ef062c8c9722ce3480ae352e99d43982b784faf9cb3b98b037a0e6cd994a4cd68cef59277daa3dddf4a0c492eb2e2f354504b5cba4759cb7e1bad9cb73389aa07f48e8410ecf7d46e3617824ba279a96811ae89d15335606da6afc5d68f3dbb71141203646bff8408827a76e7264fe4d47399fe74112b9909f3322f726fe20fdacff5b78492db20198432e497b4a73d0c9bc9a5aba64529a6bf70c9de78741c588b97487d9b13ff552c95e0fb47ca0201d47eb609c712762e23ff39b89827b89ddadd9888a5464bdadf5c168d28d976d9c8d8885ea2495f7221f317dc3d6dc5462eb5af6bd2b02a2e540b3286196abbb9bc36b684e141e4fdca882890b3b79ad57e2584ed8ab361b4a4f5725a7cdad0c1d9",
+          "padding" : "3057308006096086480165030402030500060811220000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 145,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "b5df4fdfaf1665d89a83242e493c8b2a44550228eeb00bf71688b664c1c133eea9f4c0a1adf9a784f7db87fc7bbabeeaab8ef424f9f12aac640be61aab8f5dc6dbf229cd685bab1981a27cb1c63c138f1476393faeda6710b2c6c1c9948f7815f4f488dc9b70ffdfa9c6ed8fea3de1f71c140a6d14ee5643ded186b9c2d94745e105dc0072b3653294e7ab3f89894d2eee9c09f01db2d36fbfcb58192d77b81f05c6a6e9d025b612f055369fb0b67e78ef476f88303f31a7d35917f00b5e4e6fd33af9e01c61e4eb1a2c1b79d126052313b9d9c2b2e257b3ca3294a46ede05727c8a0d1b55c95ab142cc385ee5e724107829371128f17280ac39b47e18215d775255c53b5e19b76507d5009bab76df1a413218b409273b7aefcd20ad38375c648fc85654d87509888b93714c18cb9394840e86fd71e704ff3eecb9a764a19cab975e7441015fd4a2da3299840df025944e69ac79b2e5eb51d894bff04c1787e5fb1841672ae799a3d27fe1c5661074eb2b321def70785b1422b34c7a428f8597",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 146,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "99436e45ec2e733ae7ed9b14664cc0d87b9d70d288cbfab5e903665a140365e6ab8aafe81be94b9707441c588d726c7be562efce80b0d1e6f74466d5520031707759ccef779e06e3a7ab6ae7288f348e111b219d53121ab60e4528455d42aeca72bac0c64632f402f6b8edf76ac7e13cb676fbe0082b32185d13b4acc61933f4707c43942ecd48e71160559d9eaef30342d3e3f362f4c028d0136acbce15897ccda53691ca89db559adf125ff0cb47027fdc7c6376c5b304e004e848f82c6a681235c02d3ca98fcbfce53000450cdd5a48378d7fffe86793520a0ed9bc9091de51cbfc6b88bfd2af75cfc558af37c41c969473a54051f741071e06a4bf42f78f21c4d7de13f6669e9203c77e09de584dbee7dbb5874f1330511a7666275cece3de7ab667cdc43b7a782a42b8e2be8bb983c7744c82fdd0454aba5e1725dd4cd39065bbb86c39239d4a7c56c1939fe37a94966e0433f6211e93e0d9fc9477258239df1292f4e74225547fd6ba68f8af30f5fdb6f2820423b8e8b17b614c91c41e",
+          "padding" : "30573080060960864801650304020305000000fe02beef044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 147,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "b49672bf48881d9397d81b4d962d23b6f4d0da5733c4b4488981de8d61e6aed4083fe15d3e788149f8cab9ea0bda6156db278b4c66887a5aca6e511f0e51319476d329eea509b4a1e3ffa915b3dd39cfc8401164185fece011a6d82d71cf9171612450e24a3d06df84b80298cbbdfaad02ad4d49a178b3e16b4d2b69020f9bafe6c58d577ba4a933531ac3d2d525222073c3dc883c6958b36e7954162031d9559a497187d497e0c1eb6ae55c7050f701df233c4d6b98e45d5eae45b36339d9c619b474c3daf9a5651b1bf9ea5776765148b8e439f8466414247f898f6cdb75f222636ee965dfd9acff0321c1da6f1c3b0b528c75f5f63c4894f746db01f7edb34b1005ea99fb9f82f82e1cd9943e8ba336334c9b2edba2343d09b082629869aa03fe50937d9aa30060dbb4cde14c3f1bc225042a556e0c64ce0df4b3d0486d611bec3c7efdd3b2be977124d0891915bd68e41980389762e01c631af2f70e904a0b7041ee1a2c32c0f59903dadd8ce5cc335b761108c1c176d243fe2140adf792",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 148,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "781a3d96f3bfe9b6f0aabc4f4b6a0c5dd942a76b099f67732f82b6e342016082e6a2c1f584070585c7f2b67c9ec6edbd94e9cdc8693d7d7f3e15084bb02ac7f8d079d2f8a5d4d998c90d242f0a0cf786f99da2104d8b035abc069c763f8abcaecb6194ad78fd433114e61742820cc77d8e0eace89ec7a19b861166967cf22a608175360ff947febf804436ef129c45e86fed9ece9cd16e9756369c638eb6a9f1848eea24e2b9710092e31fadbcc72c82dde582069c2fba3b021bfb8e81bff479687098fd9ac9c7abfede1f1a2811684f745b8e10710fe469ad8f3128694694bb4b333fa59bbacf00c3665402ad486d5609b57f957bf9c964231002bbf190121813f0bd159a6c879edc44200c7e30caa5921d2b0994257d78e0ecaf7c13e67c07bb16b419f48943a956f47f87c839898875a106319a8f860b3d2d140b0bfe6163e2ae5e2b11da259c0c4ffa6d25cb20822049c72d2a142e051b760bc9fd128563e5ba714c01514530f76d50657e4a3ecab74229d773e08347c35e39352db85d3c",
+          "padding" : "30553080060960864801650304020305000002beef044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 149,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "04c8fad7b52391e832af68e62e8cec1cfc2256d560db597138f1aecacf4fe31ee1515fcb1400ca18c56a1e0aad984709b962223a3d7cdaa59bbbcde52ddf9ded9b8ba38e182cb090fc0fb421eedd787a6c987cc693db6cc645c51c41b91a41afbf007f6c3dc291d036688ee41193f49758cc1dbc3c4809f0ef528d00f3ea2da7e8c74016b20de55a6a481e6279978fc851c692eff78886269e45259ff8607a2efab66e7a18d247ebd2826d5c9f7b9f75862d5da206954488ae1cf1c4f28630b46d8f60232ba8bd3cbefcf8b7cbc06fa7e84c06fca1be837d521f1dbd67e7feea7034d6539ed126316ca4401ed1d1ab23623e2ff91ab762809147b9437b46239044a69ed1fa737c896af9d611c1e8062f4a3faf4220d0afb1d8851a4205d34c6a0ffda9d5b114ed46d66c2f20be4611c0f8b73d69918d2079a6da90bb27828e5605cbbe7e3983c2850334750da49361821cdcf0af965f383519f326fe32456615cd8c72bb6ce7106cbbb4cf3627438ec5de18a4f4ccd967b7259585f5e35f050c",
+          "padding" : "30533000300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 150,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "6899934d13c7b6133be112f7f63e2a58de2503fdd0c9055921f94b4db0e1aa8475f5804213e79369f87007f70021382644239b4dbec4f8630c325a79a9c2f1e026a1792c1c43b64a57564fcbcbfc9702aa3a9f497f9f5b236495ed80347613170e5f18c81df504283a04f20381ff60cd11255fcd1fcd255ab4eca0b00c4aeb4d6b66a31d05c3b7d7cc329476a8d5e523af06b7542970bc174a6965bdfc42dc76f9efa2abbc61794eb208c48e33c293620f1b348e2048d82832cf293961844ccc6958ebace14ed3de52d57c0c166def97f602b486b75faa47ee8ff7fed50424ab5f2422d61a5c7bd2c64cd9e12a3750686f30ee965c4f672069796a75db2c106606ff7b9594741ac4ce3e9a29b43759b6c09601ad8fdc22c8ec8be269ab634064f6248cf5ce5c34d100a08ced73296055fbdbb8254cd50a799126970e07a5b42dd7939cc8342e82ea8d4f3037dc16abaeca4b8b97696d42ce51eb5241acfd21711d17e55f0cc31b8be6690bda116ffefd8837249a5efce51445740098148f5f31",
+          "padding" : "3053300f300006096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 151,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "b763fbc33cc69215b354605de6cc21eca3c8e6a8b3378f86107a09476694d31c4d5db179183b0d0923f86c4177149e6143089bded2274b4a7e328f3e45c540421cef31972556c9d81332bd32edee010bca4e77c2113bdf2971800c6b61766a95a2eadfef6901bb1d79237b3af3a817bceb69e564d1de2853f016395bba5a436634dcc1b37f4f1c2f2da979892802046505b20dc28294c3ec9d6517b144c43caa77a3f4f9469295f7d4e0f566b2b10394d8a4e8ef50d06078ed7e614dcc1db9dc3e6f7c9ea8413413fa93d54a0e30785dcdf1cfe5509bf0be80c5ab8ac74579d695cd3ec471def759727470191d057e6d5f32c2c8ead53310890c932de3e6dfd0f3d485a3efb6d733c21d454d032b4d1388fc8f5469de8669e9ee610b725ff46bc08cef304204471ab14fdc585ee02e07191e1e9bb2a2327fee3b23a714cc5d1ea59a13528d97cf75b24357e1e232942aa54db19a980b3e7f64c672743395a9d470d11c32597d1763e62fafcbea2f480c14bef7774f74e2619b1062b84786d5c4",
+          "padding" : "3053300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 152,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "3dbbbfed1a149832c71a1293c20b81b1c8d35c4b75181f66c9f7e6aeaef04066cb6edf1241e9d87ddc842880b7978f18af9d2a33fdf7fd1a5e8c10dd547a5d334233ceeda2bab410d5dea9464f623961c98195b411bb187e981e107b6bf67be5865a059a6daaff8e2da602e91f4176f47c53c9f53b22605b748b68fe98ad9c5936957b074fe844567e7dd1b07d930929d3dcd46e84ba6f9121fe1f49dee955e1ad5a329cc0441d524a20215a9f7304e977df5097546a4d3ed5022765b5cda292f1819b55334e6b95119fb0825756d7fdc8dfe173a391b62e970e51729bf89eba61be3ac1f3a5835aa1f6676ef807395440e984b13e3711ad316b7fd61d0fdd9dd3fab9b75545882fc1a2fe1f0d9dc7c72385b0b445ec411877de83e38fb7111d5b935167f469cbd4f37fe1313b2beff0fd6ac4bcbd4e98e55e787a8e16967d8110b8c33ced213fd792e1741e4824e41be24dc6cdb947361cb9ad8c742b5ec01f5e71fa4eaa452801fdb6524b5c6d1cbe97b10d36bd53c9456977f662b6a1c85b",
+          "padding" : "3053300f060960864801650304020305003000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 153,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "dda96df9b188652fae7ca14a1d3a44e26359ad9f2778f0dba63b5e4aba7c30b55439f74ede96c56d48df4254f4b0a6f308859904f2f69f47ebf438ea87232f84e61c3e376daa2da8c0ab2391a5c8d478e42cdb2b70ba430db5dc3aaaefc9c7c6ee39e2b1393f024a75c4b91843d52a49bb2ebc9aedebec09d2bc5c200bff6556e689e48a3442b216bd7c1927946a41733e8ecce2589d0973ef8dd2a3a88dd9d4ea2d1d0babfa60239632dd2c23124165ab11c625b95c3a0c2141301aa0bed4228a1b87964ae14691b4dd02b34e38d538ea1e02a7fb20eedcc90176e8c57833adecbcff87df4c04f19a77f223976c41723f36cfdcecdafbb72f2fb944d4ffda0eb0796c3c0f1e3d19046c3824137260094bc6eb3b735153e9bd683cd741fb394f75dc7510ac4f6f3dae980b56db7ec4bd15cb193f13df1f03ff8a1b62aa9587df8d6ada3e8cb849cf923575bc5bc4bae87c93393f7894a16da39989305a6ecc77a1a3739ae253679bcea0d7ac472cd5fffc62c64220347765eb4ce21549654f41",
+          "padding" : "30533051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 154,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "80403d3a020d83681ea576847d5d1367e0210401b81413f948ff106e1e341be57b4f39f2d8509586cc477b0b8934c0ba78a3a97ba425c9d123ca3bc64bc26538c1da92b24adc50095c209b522dcb4f0892815064580ea87c208d7477b50d7330bf8d463bbd4ec66003576ca520a1d04f836d1e2abcdad2b0ada71bdbacc9623da2276c718a36825020dd20d6747c9b7616488c7ce0df20ab150d649c4417df73718f3c363927884bfa6134c636402b6e6c231d04b3bdc4ed6b29f479c8c35e0e02af932e59f800e46a14c0647c2f0c31748d56995f346fc6bbbd90e55be49767a16a6934798be43fca5d8ab10853cd20556634df53b13a1bd4c047d7d52b1102796611b016517a28b277510c87d398b4fabad78d11b0a6a094efadb7c21464129636c75eaf06a5c1fcc1a9cef40b9488f24279c6fedf93b576f5314800709929c54cfee383140fa71bdad7552b0db467e39caba1adc70e1ef22f62e81c5d4a50884d5a359de3c7bfaab1c00c31de9fffbbd4f8a4e8e8ae7e39eb29abe0612554",
+          "padding" : "3053300f300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 155,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "e3f92ba88bdc4136cda2e5a248325c98972c8a42872fb5779c46c406dc8a7f117d5fcf3c2ece96f3c2c0f5061547ee233f20e17fab48c4316441367e445d7100a173bda80b9d6d4411188a942c3be703f0779829dbefffadfe6cd95625fe4c5c1bd3f22b8221b2b69d3c20ea407c6d5ebdb5f5c137d056899859cc5faf5bdc87c223508a662e5b56b08ba3c8d2d344b6df040193e36263c11123a39d7b222377a131fe3c36bea8467390ec53e46946c54bafff4bb61a0bafc09c838081e4e66231957752fb8a49cf1904d70b024dbf470f17ae3c50e7407ed5342dc8ff9e556564fe37a6d922d2fd867da8d92be27b20deb8c7597a1bef71edcb402b2bbb986fce5324f4c02af643f5e3daf623f370c9ab7d3a55e1ec92a5a37f2148979c9bdf8488a49d2f6a31a8e99f1da98ffb5c635173a43b94248a8c5037dd385d16ceca4b4e769a8a5762d4ab952ec99f3fc9ac6115666e0f5f94ad59f23c3ef1798093807cad7e08dc86f3b4b85ed6a34abe354d50c772152c9844b9a34e9097688368",
+          "padding" : "300f300d06096086480165030402030500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 156,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "8085ebfe55c20755b6f1375ad924b868867d5c878c41943e61a9eeacbc68c7ee9dfb61f54b8ad22dcbe04c506814711ca1d36c2226a7d906f095ee1e0f6bb61ab8eb6344d727b13a7252543c842bc7fab0fcda70ae328abdc8ca3542a805c6ad30cacb432ad05918a65862f7f2d59d0821eb1e73ef8b7b2c24ceb1232b7b3b5a3ce06e7e5f214722a4fa4675217e09daac6764fc20b3a87d21589b8d2220a56b94eb71acc6ee4c400d47f415507d01207777ca6f3b2baf3cf27e75a6cdbe1eb0089f6b5c3825edc6a223a61c9d256006d30a6f0fcb2c5624ee8b49814f1f560260dececd9d11f697ef417bdad561a9b63236dc2e62d8914382bb92e98a1c39393815cf0915308cbf212c04bfb4a8e9dabfb5ecf957d0b6a3e4f7b0b13233d27998a1c447cd845cf926144370f754494e2c1b845646028e4e26b87888e8866c89e35a00da8f3ff3ff519a813d9016b8c31b861f4a292f7b25180447aeafd03439c543b6e7c94c03eb837d013fcd2151c17155e24127134cfe6f5d88d9515e3590",
+          "padding" : "308193300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 157,
+          "comment" : "removing oid",
+          "msg" : "313233343030",
+          "sig" : "e75d3f7a4fa5564a8ec1bfde667c1a2e9d55645c1ec35c81a427584c8b31c014297106d8b6741cdd11d6f27afd040ea5509d626b54fc601640297adeb3e04878fa5ec4f553d0eb2f49281c0db547933a50e18aa1bf3f5e6cdaa6e452d9bc8dd1d60e7e1c21ea00fed3f70481ce9cba7c2ddee00c1eb3641654e41b92ccfa278874907788f934c1807909f2c9ac7a25157b7b7551e4955fb52a2b7d9a9e30706a1f39704deccda7a156af9da41b874298e78291b31c28fc958170015170454d154759eaaafb9b0800d7c4a7c9351c6e25e1395105a95af889a80340110f132edd2830fa313ec7714100dbca65e427f850c65adbbc94e6208faf33f26098a3d61c17a0b6dc8902eadff5c19c6887eed60a63b9b09753b250fe586f5c34e204fb0e3e4bb431ff1a78c4849fd78e7e6ec1736914d3b1cc6a5503707dd96fd9bb5e8777bd233dd421a6ed0b5dde9f11ff0d1fa9ed8ade754aa1816465a23845727f585d63f1977becacd3a0923b310464432237d2662e61622a00c1d310ece4ce145c",
+          "padding" : "304630020500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 158,
+          "comment" : "lonely oid tag",
+          "msg" : "313233343030",
+          "sig" : "d358d09d7362c351759cff1a38cf5ed30d46ef8cfa4891e1de3f51b0b03f318a00ded0e1fc646b9a98bbcfb1107cd1ea1cd9fd5654814d6a417e0564d28e0e7b35751bde792c55b9ec4e3dbde0b791a04d996450abb85e4d3d60ea2bc0e623f04438948cc7a03e0f11933cc857ff37cf47d3878e6bbfe26310a754ec51bc034785cfcd906dd7f0a97fd5ea3171f333444df812ef93249711b649b46e557f38dfa43e03358363a99610088ed415bd6bb5ff7db644670637a509e8ae3dea48828e178d4cd28049f3c6dab0f2c5a3bbda7d2663742f5b68195e1ea4b14c2c4d8f66e89c6ca1dd51b9f5af289893b57142325f1ac2126db44b10784f12ddf1aed5db309ebdbbe31c99a3191a22a044db2022ec611ffeb0ee3944cc51324240e4d54ee5aca8ca8d3016939e3d4215e9b87a20775f28e7d477b4b9d3526d0dd128d0b97d7530d18dab5ca1d1de165e5638bc236efa62f87ac1c90a0858b41c08f9cb0db85765cc7fdb968e7f6f50546ee914fb7784e94107bc7bb348096bccf3de13ba",
+          "padding" : "30473003060500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 159,
+          "comment" : "appending 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "446145c6c678d35f859a08fe02d4e58a1b8be1cfd2f85754ae1f1576ce7e8c63a8333cc90880b3845c969505d27d4d7de731fb5bc2eba43acefe986891813008d737e200ef1af95a4fd2979c01abd7b06cb52bcbe514da42c5a5fe1bd0de6ef28f078c94101bc65bb187476237d992bb80479ea9470a9a9350b93830fa97b726e858034bdb02f1237771b94c71db8d16bfdfb8eff439e44c9f4b950b9cdf31258d36e6c170aed157bbab1563317499276259c87bfe92f6a73c02bdec02885d8c6cb06be332e87d3f3eda0ea2fb24761333f014e1aac01b076ffbc39322462dc82427b8b6af01ef5bf5bce0ab4d222ee660f3fd661766fc2c402879910cc59d743ef0ed1432ed120754ac0ae1de6239989f013dc17ba66353e1a39878d45333422e53187721b8257848ae5edb451cb1c6967f248e15e92392e5b9553ebae45a9afa0df9c5deca3c9d527c373f83abbec734f2b469e22a391866299fad635766812a339c30cfbc51f22cd6f1139cd76e6798e3e24d40ccbe39b7ea4f7d22c6c87a",
+          "padding" : "3053300f060b60864801650304020300000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 160,
+          "comment" : "prepending 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "85af3a618063afd989a7e1747191e02e93c5fc39230acc8265c575558ea2f5b2dbdcebf00f7007be38c1e5182ccf643cb7e821a26b5824c2c3cdcca308ab157ff8038781d1e89de77ee4832e015fa490ccf6390e9111b7573188d9fe401bb1d32556de05b0cdfa27b5b9930c8d7e044a0470b4fcc03913c018932c700ab61d0a86c28ae4bdb0a9dbfd90eb8922fdf237f2a37a5e4e3ee50c784268048190e5da77588c5a351498113a60f29247f812c457c5183ee1bc6de62720b0383aba38461b6d0da451c55ea383527ed9c4844e5c86c41143f815a9c94eedf4f0ff8fb8b9b33ab1085d9c8103c7df6312cf00b1d094cf5bf2a3410b2c480a201d2db601fd3c906b96db716f7acd73cccec7b6189c9a0e0f11afac74c74d5e8f59ad403ed8cf63e220ddd0264fe4e7d9e038a7bb371221e670cbabf5e99dfe344642c68307ec55bb0a9e61de7b1c8a9b19d317a3a024bac9e5f81d9078817cba296a7977c1f300b01878abd4991e3acd3895c463bcd7b3cfe98c8a5b2aa36579cf9c4d698f",
+          "padding" : "3053300f060b00006086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 161,
+          "comment" : "appending unused 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "32d2095dfac746fa0f63271819bc652ebc1f5a32f16c041fe8e7783e4696ad79e3d2736c1481d81cb5c3a992854de7824e55e62406a44a6576430c86e48e0245da194065a58ca28259bc6294dfb71c30171b4a9b97ec6d7343e8e7e2726d1be0f75295da4f7bfda68a44d8fa78427409c3cb4fa7164da212848e8406ed37f9fe87b1ccf155d46efe2a6391c58f78d8697c1b9965d7f1050c720f10519ab1b42cbb0ff05ee58eff40fb5d0bddbc6b36f42a321d60589b46acb83c07373bfb8636e091d744e3ea643cd28e5bd3bc8ed8262515f6d27a573d38d121c474e132be3a66c35f4fe35ff378883caa731e1cc5cbcd63e4b37ddbb3d20adda51dda12de2c12bc8de468969ed06476139ed99eaa3a21557cbf082768c829bc2d14c7a9c7fdc76eb2a1d7c037330eb3a4f11017a29b7ae47c92a4cb69f932dfdfa4d9d91e2424cc47bc6bc259ce03bfaa7cc43f991e8056df2a6ba27db209c73a27c4e6c2dc2b81d7fe6c7df701631fb9a62f76e74354b74ab2f188a456fca5f241c655e829",
+          "padding" : "3053300f060960864801650304020300000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 162,
+          "comment" : "appending null value to oid",
+          "msg" : "313233343030",
+          "sig" : "94cf74fa31189732accb5392f396fbafe4e0d99d4dd19fb9e91d85aef619e859aae3e27546e3ba5a70739c9d6972afe1383bc4ce501251b427a50f0a5327a55a0f3ffe847d454528e5eca7cfeb122be2bf48e537ee5f692d20f778f7dd9e332631ca7a869a760f6880c9af59e9a1cec96b268fd9bcd675636df91db986422fa04042090aef9b25a2285df8cb5e6c90e5f915679d9da3fed5b39702ab36911b03aeceb3be040e80bdfb4234675863249a5a49987f242282ca3a71197f9d412b71d1c08b70a9c396a832a62e57a56cd6dcf421605c326a95eedbfa85afc9e2e2dbd41e3c675ada6e3315202eb3d15c57e9c08b503093aaa51c2051c35578ce6cd34c40428fae9e9d13caca5877864fa9089979b385ce24c52a9fb807476a2b87856ed06483cd8d471ff3063830c1b6ad8328bf6ff01be02deb7ce5ccf8d38b650582173ba19cab73340e4d3b136d154bf98f5607a4738dfffd87381007701987f88f8fda3093e8b83c64a10d6d71e81cafe1cb33cada4bdab87ad6483e9af9cbd7",
+          "padding" : "3053300f060b60864801650304020305000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 163,
+          "comment" : "truncated length of oid",
+          "msg" : "313233343030",
+          "sig" : "49fc18b547fa4c7d19cb46197707422c411d53a2ed9bc8e0f9351acb69c86e258043130c44b86a0d7dc0590d04422700a230d8b7f0cac824288381d0dd9b310975c5855b7192dfcb5675a2782db475f3fa2ded14894c036cbb343ccd5308316735776e4a8b9b75ed133de1389e0fef59643cf2918974b14f315cdfdbbd6f4e0cdaa46eba5e8de283bcc8b3b5250c8b4b9336e9ae5dd96c375fd16c2d30e50473478ec50803e9f278746c4e6b912b37ac9707b4961484546366fd800bd8cf8d7616cfdcc22a7cfd24237da437ceb0e8016c3016446abd2daf313c325e951da8c01fe964487d3b6e4549af9de5dbc9a30462ecfbb028fce3ee470cad39fff62610fa5526dcae39de93e6909620319b214c2e0ef984a543245c441a3732cc281cf18b63bf7546a659ae226825a0ca5025d73c4c1a1be069edc16e80cc66a7ac0309f5cf4dc3740fe6894e8da2ce75b93a43ae0942bfe0602dbc90315baff355d7574e31a9cafa7c367e2a68fe040f419fb6e71317c30eb7f472e0239790a18825e5",
+          "padding" : "3048300406810500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Replacing oid with NULL",
+          "msg" : "313233343030",
+          "sig" : "dd3ebe40edeec32720d32486b48ee2cf966c87602e5fa879917b9de79d1e4617e882336565dac061769085c9f4f53ca9392de1aad42656f23c4cc3637ec1e4efd2090d6f41d38aa587119451e15ccecd6b3dddf2bac8686776cd0207c0ddff44d10debfeb08cedfe56524a35e95d45ce733b9b86f62aee14c3202fa122dddb017e797f2714df68e72ead5b0a782e66dec732fc706f4c9308af889611128cece803c2efaf07c261a13486bf7d7a21aedd4449266ddcbfcdb5bd171ce4255de460a975badb19a5531dafc97e553058d21fc1643999f209719a0a17e3802ebdde28d261859d4858c30fa6c9defe34f7a7d7b0604363266e538e117a414a0a4af8b68a94d18f4ff8b731a4ee33ae8f2f81ae22d8758cce3c34d2f62786d45c8b0c69724c78984bea20b55c560dc831a674210158298a1e7c90984fcbd994febd83478e8121fdf7abe1f14f2f9764daa70615463ac1aa5e61e0bf457e1cc9ae83b44700ad2dc592943aaa948d9028e59e9999fce4c3374880c7f9b1aa2dbb9ed70eba",
+          "padding" : "3048300405000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 165,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "db0c7c8bceb36078e3ec67ccce2f56cd9de9dc4a8225554d13bfa5dbb2add120240c0ce7c369d4f4a9ac99614b9b44005bc18ea526fd1c00885a88c437debf5d557d8a19ca2e58f58852863d185ecd35a5e4c0fe5abfeb55a1febd9ca107646395f07c1543b9c19b02277368a45adb3c947919972ce4df484a64bf2ad5f16fd76b00b64c8ef9736c14afc99ca5e0160d5ecf33d623a47a053c6e0081a09a6b819eee701616aee79c4b8cb04c556117d738ec9064b92ad716c3ec11cbe6878b51716ebdc75d95cd463fb29f2630eb8ff61f7cf282e639caacec00359e971dd41853f39bced011b2db23c262f950004c2d6ae9476a8e66b4752b376bb549c63b36ae9e9f81c13d05f192c41676bce2823947dfb77d03978854187d3ca94c2dc98f10496a8f8b8bee690217648ef55af1721d73edf4f0a023a0b7e5a5b74f3caf81097a7def0a585ec3adf04df86bda63aca30b3b36d18584f103c8b310fc923f84bd4b9914869e8add86bb8f24af20e790beb984daca7956e85321ac772d1b034f",
+          "padding" : "3051300d04096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 166,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "fa714130cb868439d5d3a57505d6300731c9ded56175570cd5b843b2c6289e70450070e5bf30691dad249ad3acdc0f5fab7fb16d72a5a8d38b4481eddd2b3f8a390e3833997dd01cc953b6b9184285254395c24a911e7b65643582eabeee2f048b366bb50782732d155b70c98e67a89a330257313fc2ed9822c088b55bb7d645f348581f0ef4b89d44c93cb00b7d750e9fa195b87e4d9cffef99be38922da21188481eeedea4a174b25be42b6aa44f9186ac9228b0354896d362a394c1049e31b6db064fceb3a8d4d381e334efa494d6f22fa4c35bb61cf2c9e84090cc8da3083358e7306f2d21727230c7e2741e6175056ffa9ea3c85157fa8dbc76dab85999960739f126bf020c8c38d1b96b2b9e1b850a4be1e861b6505af251ab38f5bfa12022634038ad2ac93f9acc334dcbdfa9c5de36b9dd502ab08435852adaaf7d0f73c7c7133c7aa9f5a057f96b9d370e02c4bc39ff6e3b6bd011a25ff002538d2f238f673514362a98878a518ca98ba3b9e9c2bb454a52a3bec4290544c887a7e5",
+          "padding" : "3051300d05096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 167,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "218562beb53937237244c9185c62743e986519ea1fed36be7a6b6a44e5b88f9c5ea316d33ed5b9126148b5d6699114f804f4d3d698d24d85f0fe6691d5e804305c4b7d76fa7a238b4642035d2f2486dd575980aa2eb36c89e732c420c389d391de20eaaf1f8e23096d4ed73bdfa2feb710a444bfa6557c82c53cd15a2007f7a3f8159e01fd6c890dd9574226c39ede68bd57e3a1c5a70a77b586fb49703d52458a6b587244c39d5852cb2416a391a6bd0b58c99b32f1217209b4349caa0d7fa9397add65a9f494ec1d95deaa4e7257f03c3a08244889a6f682cfa4a6ceec13991b5f832cd7fb8f8349ecedb75ff2795ca33d73ecee7a42553966a1df438f65ddaf6000cf30011c064a3da0c87a66c212a5fd157c40dbe3d748477acd67ffa65ff7049e46da3da0f7bbc041f76173f4fc0acd6a1fa690e1d034aafae009912682f3800111a15a22709cde9ce00fde3b3f5f90cd55b4c5ce224f0c31b62315b5738461bc4606abb9805704312d2716455aac4fef649079ec2e62b901b289321dcc",
+          "padding" : "3051300d07096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 168,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "3652f7be92a00c508d7b1185eb8ff9e15b586d21ea715bd1c85425d4cf9e6a753114d766318f3f1d457a4d71d7464687cecba92df12c5f14236b4a52b52f58e9e3a0ef3bf500d292bc9680f99f016a01ba8923cff14723274c609a83b2e3e9ff2b029998defafa05d2067f8aa4726057e73a4b46eb5cc996c44474f977b550890e557eb83b6df446e620b836a09ca15ce7ee961a30193bd7f1c3b31be510043a38104fc3fa97f93edc51dc26468cad87eebb6be074eaa881aa40fff2c2054a136d2acb58d04f775266aba1f23d5a45afdac8b0a2de37c97d8506ebdf2345a36649a3a243c572afb900627fa89ec84fcacc7a9275024b9ab55af240e1c6f99135b3c78a08da3f23d2e3e81f3bc9c84a03760c415b74c7d00a0e228621c21ecab749292a30e5defe6363b29c590abfd91c1f8d1a819b52ce4deabd219a320f2ed0c9b47bb40ab7e9261b3a4a4987fd5bfb0f18f1a0ed76b44157c2e9093a8767fadba09665b20653965b04e211119f2d78b8c24ddce9cad69827ba4b453330b4cc",
+          "padding" : "3051300d08096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 169,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "f87286ceb7dab7a8faf1c8d68cacf38e576ad5e0999b9e136aca42dcec65dae729a9a94e0631bca93124804ced75e3d8e1ac0a7bc91e626d74a80ed3f20defa5d73283f6fe0b5f1655d49ad7b2c91e170e18ba90d4a0a701e4e7c0fb0178b3f58618a6cfc9cfb31ac94acac92072eb683d1bb5250926a57d6333b297264fa27f114db8e28fac4f65f5c899267b455b91267ab98e6b75c6c3b34efa76ac0c9d78079b037d7f151a7cfb70e52765f3a0d16012ad23b61b75a7cada0137d0a87fc7b82a69682593a77bd31d8b4d74c3d781016c04a1e2a5a1e1bc8afc9f039428555321c73c42a1dc7c60786f0c3d1941e65ad31e16c789be7672325bed8a5b9e779316ab8480dc0a8def681ab80d9902e25e6103844e848831f709ecfcd2403adf595d56a26b3562dcc2d0bc8a7970a5d0a4681686840a864f8e85185255a2ba1c43276353e36cc9b2c0d2d2d2cae1ce4b0d99b17774879192e4fcde186ce1b3d5ac8a33ad60ddacb15692ba4d5a49831a83deab5261bf303e30a0a0266790a204",
+          "padding" : "3051300dff096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 170,
+          "comment" : "dropping value of oid",
+          "msg" : "313233343030",
+          "sig" : "1f6bd67b020e7d210af1a4aa1bd4bf52cabfa3e2cdfcdd07150ca9b6d27f07f1fc1359da727c45e0cb26445a661f1e170312c77c97e03ee3f1c3ca89a633c95c0cc19a486ad09dc95e3b4b8b0dbc64e85ef05ef979ef0f3a7419dfceb1211197701c8dbd6adccd756cd06c98b755fc1cbc438a54d5ccb9c70e5378ef0ae111230865a06114d6e6b8b847417f627ec5b0189858573948147018afd58bf618f5cb2a06be8df46e433b6c42851cc323bca2ff8e286752f9c928efec8ab6212d2fb6ba85050615dd8a956472cc25fb45f7613b5caa1b5f262048ee646c9fd01692f029417fbec9429e5a697837b022d38bed59a5e892c6f9dcaa17d119b9428821d82be7ba0ebe3901078e1bcb98ee0c411911a2efab418e2288f5177e0c889319733a2fb9977b9855da4f6fded7c1684fd5900324075069804db29818c30f1a346446646a3b22dc0a19ae4fbfceb841226d754551597789493470d072d8d1af8f6631b4609521fca978faa56707ce5b18ffae93be4e1a7d27d1fb4cf6423401d50f",
+          "padding" : "3048300406000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 171,
+          "comment" : "using composition for oid",
+          "msg" : "313233343030",
+          "sig" : "97491372bea1be6c54b767009bfa9e1b5d8fddaa2cbf04551584c15b61f30ee48ab25b6e14a2db402fcab453601ffe63cc5311484e9d39f6f0b3aac09875d31d98e8a30fbaed37c1bb68a6185e26d6e35e0daee8fd0cf9c3b8c46e5c97ccae80eff6cb18e6ac9ef15f61d9fa6b983d7f98eb38c8d862aaea96864a7cb2e500bd91ebb291fd852ca16b18897d70ca2d8a22f936b95e9fadda9a6e9595fa1942a942c3e690f5531e029aa5c38407391709dd0121f9820726767e1ab8501eb4641fd8ef3ab37a9918bfd5dca32bae1cf9c5e8f1129c2951804811a126ebf932009f4a30680d1ad9aac7f6c865398c8df5100fd963b91a5115c9cb84b31a1fa94f8ef4930be13f3157d0985a01c9562fb3aa7ae894f11bc54a1e46fec8f78d03c64dae8c8c4f2283175b9903771ab151fb482d64adc97bb371b8263eca46206d8ee8767f61815de44e0c034a433c383fa93d8fb278ffa345395f3399a3f178a3baefd2adf26a2aa998efd1fb7aa14a9fba4737f03b34893c1f2062ffbd4015555c12",
+          "padding" : "30553011260d060160060886480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 172,
+          "comment" : "modify first byte of oid",
+          "msg" : "313233343030",
+          "sig" : "2eaa7958a6efc137e84c5c719a95d613b1b34e334f172eb97a8cbbd3dc7f568100f3b606ccb4942979be06eb02ce2cf5d4450423bf0e21ca8cf3af401d1d4447dd85ac73eb052ef71ba998c843b96c39509e9b15782f6be475dc5491e2f63837e7136d2b8df7571f47c07e4653a6869a6832e1e6c0498994dd94e05a86ed999474b9556f458cec1406a224f61377e97dbbbf578f34160eecb5a04941cc4e8d2211b2ee804e1d351e70352a5f94f1c50ff5ac1cee8916201c26de237386d91d0263ec95039dec97c8b21643ec619bff0a320c21c283809b4e1b7ae82808df8dc1bc87b4144d4486da7f9b0d50495c44d9e858ad5fb5c071c20082b9a50db8bb6a5fd3d23ab112922af6fe6968a568d8da6efa814bea870593a9c46b0d18c00466c8fe31669708d5b2b397f7bcf136c51521feeacdd196af91743f0b79da90dbebcb61094942bca654be2e2230c2094abec7424b5618cac15a7cadacb8d6d05779335a18f3434e1686c54d5d25d8c58ce55f6ffd39b3716ddeb35d0eb6b186c9d9",
+          "padding" : "3051300d06096286480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 173,
+          "comment" : "modify last byte of oid",
+          "msg" : "313233343030",
+          "sig" : "e542315fc8ff4adb3c52637e051c40b8bb911602c21bf3c73072f9d3386fbcca97375f79f17f7f72f7009da6791a4e7d4dfe3c1374d4ff766c6204dd4dac88058c977baae7bd667392c7a3af0fee933caea4e463f2ad0c9c235bf31e526f3f4582b7836c8a0681949996d596b6ba0a5097193e984b7fc77e42fe99585ab21c18f1eb494226f354410805ab4ea02d79234bba5b958dc6bc1afe94810bc583b04e81f1c0ee71d60caa239d18cafe4299f0afddb71c3019f9569a7a4fbe1163cfd23b1b6f4e73d5b9771aa708e2a90e57d9e4875a4a110a960735dd114ecb112e691cbf622cb89d7776b0e98e6b9a5c5643795144f91ec73abb5d8877b80ae697035daeeafddb12993f3d0c8152dba01f074f13c545ff7c3c6f6fd1f1afac35bd3c8a6edfbc9d028e9788af2134cff12708cc65bf53b9120f52bcf5e780652dbc6bb841bcf63fb5106c6b3b3ec2fdde8df1e6bbc88d2e6e6a63e92fe9bb5335d48885d43f7070382f88aee394a714bb8657c120f38306cf9583f24fdf6a80fa6d08",
+          "padding" : "3051300d06096086480165030402830500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 174,
+          "comment" : "truncate oid",
+          "msg" : "313233343030",
+          "sig" : "6399a29b7292371f30ce9c2b61ff030ef5accc4503ec987194a53c9b5738ccfa4a9b3f3e0f59cedf8e55f6ab99bb27d21653b4dd12e277d98c32ce0b551234bae38226c32415f4bacfe80420185821f8a3c7441dd9cabe2bd334bcefcb96e117945f10fb9c2a3a9c3175299e6de82bb24ea3756d8db8a946cde1b5ae01f12d5ecdd114cd6279ca2237c26689580ef5fbd11ba4686b1e102c72d3152ce90d4a4c41835ff19afe2387b24af290bcd3ca9955b7d9a6f616d247f6ee2c52156b7953c9b13bd2840b962936f6cebd5be7549a4a33d16198b64c908224ba29dbdbed40f2c819511c10dc59b36be961a8b1301e5817455cb20fa328221cf04477bcfd244bd2951ff15a6fe9e7e41f1f704273e8d62ef51fc37e1bbc70f08339d0414687164fa6321e00c80115a4c6f1544d88305fe338b95767df72e3b33e7f334bfa50ff26f83e44ee92d63acfe6bdd17db240082b158bfae84ed0ac748c81699fe7a70d8797b5705533e6c6baa72cc5059fa9d856ae7068595113eff5e2625490560a",
+          "padding" : "3050300c060860864801650304020500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 175,
+          "comment" : "truncate oid",
+          "msg" : "313233343030",
+          "sig" : "a3b266f266eb5f6dad2c4bbfbc4fd2db1e9514645efcd1e5465e9fd762d614db5c3d044c7c84c77143471c0d981359a974d6609319764d499823f356b1a0b6a3ebcce63dcd08be24c63a664338f64d1fd775139c0efa67cda0928309bf8815757b936fafdf85d27a17c059ff12ab185cce6fec640291f9089559b87d20bd9c1a0b890a9fc88280682594e97703adeebc0e6739df8388a2f4335e545e9597dd9fb57c2d1a7874b772a9493a3ea34d161a17d176bc2c197c561f0c7e80065a421f77f1f241178c9c70d392997cfedc94e4b1adcbe7a6bcfab7eb6a60cbda6000919973e9b1382e20da6032f86562115fe45ebe67e102e25d423bb6a99b47899da09dadb9f990c905c67559d4d78364eb6be40cff03cf60ceb023dad22082a7b73996640aa3c3e87c3ee8b4229b0ee70023ec7a39231202bd651dca6de076b683e894b845d8f3ad289c3b7c0da4e86eccb2f1b7b053ea4816ea376df01f001a978f9650d8124e3cf7c4d30a5e5369b1260e132b4b3ec838accc3a639580bf4ea4d0",
+          "padding" : "3050300c060886480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 176,
+          "comment" : "wrong oid",
+          "msg" : "313233343030",
+          "sig" : "7730f0e0dc80c1e000f936809fb26f0905c0cf038631abfb73a90c88bb14bf959d4c29e51c590f23bc2eb06c393678900c15eb5e2f8cc4f4c65e9e10bf12db162e89883d3e2fec6ae0f839ba54dc1fb2865b1667b52bf15c13f2cdc075f3b22d1541216c82b9413761f9f30e91bf85bbe5168a4d39c9cbd6cfc2a06ebbb1503be5ba3f2f2cd51b4af501ac4d6577e09d105074de3411c78ba0e3436c497c7b481bbf37269f2a1dc6121e6b02add0fe8be7cd852e93c98faa6c14b9f190f411ae77c5029f46920c60d802fd945de9712ac6dac159c224d39c0b3f043241d3ac3e9d1d9d4dbff036101bd8b294d088346b82f87db3ffe91c866f2921624bf3984dbd2990c53c7d9cc2a3db5aa6697d1f70f84153af2439b2d0e2f59efefa3cf921e46e1a0b7488264a5dc8024934e72486241aba3cf48187d58bae10851e719941f5f22cbeeba02f1fade23735e6af00fcc8ff89e5e0273a02aed810cc5dc8757f890972079bb9630c80ca131cc7e7852b6de3c507b53477bb9ae2d7de15bd2af5",
+          "padding" : "3052300e060a326230653033303231610500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 177,
+          "comment" : "wrong oid",
+          "msg" : "313233343030",
+          "sig" : "72aebee299543d9b3d0b33467948e07c83ca15d5114cc3ab7cf04a19d7e6b377cd3d8b945e0bc62d959f541991890e04288c90a7a9f37fd9935d2f7ae816cb6d8fc65de8e1325027c890d79d83c16f56e3a7a45c3f0593a7f5cd819be3446ec9ac29e3c39690c62acfcdebe7bd1a567b42fc8455295211f489b9bdd671814b9ba3fd3641bddab2dd4e8d8a2e9664531637f07eb89066978b3d67a11d776d0cab4f4638a6ff9cf42474963c5d0ef6f0be0bceb34ff312c1b4760c9ce80036635310b95bec475d36f9c4981ba565e8dd2406ec0cf5970a30cdecb9d1ea7c825d406de65d36655a8ba3759dac0c69fef642625a406452ac2660be5929a783e1281fe3cedb39a11f7318bdf3793484478b5f434000902e8f607c625b68b03734c6792d23ac04f94939834c18dcf0b22ec6ec855c623ae73c952a2b1cfd3dd5e7952888c3e55713f60ca4fe1dc47cc04f3df3a7191442779a47db1e5adf7ae33f9cfa808558a8010606b9828d22e08b594597f36770e12d474809349b9dec394bc8bd",
+          "padding" : "305a301606123630383634383031363530333034303230310500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 178,
+          "comment" : "longer oid",
+          "msg" : "313233343030",
+          "sig" : "cee606b8787ee2d142aee79b55da0c551bb5c4499a255d1a6fb1ec0e028af61bd1678a5795b199ec9456a53c9baf65829a1ddeb97cb251e95f168d60add3c8e6f0fe052767064690f3861f92a89ceb88e3ab7aa6de24627c8d7572b5b8845e315daec3b470219a7dce159675cfba78f414da72583b7f0bf25bffc7c4445184e1ab353ede64d3a1900387d19838ec875837b5b0c1d2bb028ec221ab1c3dfe95d4e1e3a5bc612047db7b0fc0570f4c275c2f00cdcb90d3a8dfb1ab1cc6e6f7c5c41fac19cc2ca1908f6ac8988a8776064d94d21cc8555b1985643ec2965f88ab6140630dc53ea0143d1515b02a0e784ed1f55d19882bf933653146be334c5b049845e8f61c30d0871f9d3ae0d2f9608ad89345232d6abf6b4bf1bfcfa719f44ab580ff7f7677245421c8636b15f86a98671bfc32517422b476f59ed9e4091e44cd1cc64627512877b2a683b49bebe2e54b4ddff294b3987b7b290edc48fdb59b64273a0f13c6290cd1edbcbbd6e6f5d1eacc4e8831c12d32d3019f4f568ee71338",
+          "padding" : "305c3018061436303836343830313635303330343032303330310500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 179,
+          "comment" : "oid with modified node",
+          "msg" : "313233343030",
+          "sig" : "532bacaa5f360c8494ab89fb96b0e8e2a6e3aaf4c2e8b07b85a26c059c9af7eece8656352d5260de34f07b745f95ad9f3dc957b3de960170fef3539b0d075cfca208cdf1fad281f2fd1bd189411f4840684753a998fba3dd05217b32f8a4a419b03b7fd0b8af1e5eab45ab1c3b81a56aca01f58f54c3f54184ed41796d67c9aa34fb9d93b1dddce00d2bf0af72090541b6f1a3febc83c6403ab41243abe96031e0bb99d2fb25d05c227bbda72447c3f5b0274b555efebb3313886661bb8338598cad34e218dcaf9c103f92425206f6ed95a908019e1f7c16b62485c988dd795e42bf174e106dbc896c08e4782d748fa281cb44c5410386fe5fd15972e5695a40bb5c786dee643ec08cd85c38435960789ca0176e640f5baee9a4133dbd960b11156faed1f13a2c7b09a0daf965e66a9cffa257946d049839273de76f1c6ff923927f29d078712124d3251f917f19247c9c4bbd3d9e75a10fabc6571857ccefb5f23a62f935f74280d76905fadb25711c5fae4bb9147412c152b91cedae6f1def",
+          "padding" : "305a301606123630383634383031363530333034303231330500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 180,
+          "comment" : "oid with modified node",
+          "msg" : "313233343030",
+          "sig" : "16e6b13be8f6159ec93abbf15f25ce6bc5924f558c34f1d34680ed0f4c385fafee17de093c95bb2017543f6a52ad3054250c3e18bea493e3985b7e0659a3437344b65044a879e916949e8a03520bbf136b47129ff9668d2cd6c43c27257208ac74c9bcd17d9b2392c3474280fc1199a9f7652301e258abfcf019643b5e201063fc232c382df943ad2f13d354203ee34c1ffe1ebaf21885920729f665877b5e72c0411bba88c3fac725b2e791467d7bfd45d6d366bad1120712e88bfeb22deeddd436b9a2a1c7b0c0af17ee2e0b021ae3162e31a1e6ea6280be03f2d9fbc3ea87288885c6a9ea70cea44647891724abb91ac2529f89b04de8acbcccf56952fea5a76de317106a8aee3203b047e8573d52828e7cad42254fae0576424c19723700125e02f943d6d8162bf27b62f818240ccd04d7d2643c3641b6a1997fc1ef7ec99836d73ca9dec402f276bb626c6247255463e48529cb08f95ae948eafd8fdf92950ba9f5ea66f9fba6e19a442541b751dfe281d30a2673b499437f2d18cd39cf",
+          "padding" : "3062301e061a36303836343830313635303330343032383838303830383030330500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 181,
+          "comment" : "large integer in oid",
+          "msg" : "313233343030",
+          "sig" : "c1fc0727f26fb36b08c29e733a8ce101713cecee7b4e4db87346a2759262cd6f51c694df61f30be69e98fe8e3867ab677ed2ed33e8afdbe8813b53caab18e50844f9fd88c0224b2e4e02af1c3ece83eaea21d7074a2e9ea599dfef5f05b7b84286129b6e24fa0c9632bc825a519a40550058848209fe0c58b229c6da9e0ab546d77313fdc891a3d911ead984d8b02900b7019f65b22e157eb42c74766c3b8e8b950a8cda86d7bf96b431f36c068540ded784aac6c045a719a0a3966287c921332fb8b444c835ee698093bada61ae77ca76276a1a0315f173a4ee8fa965e23d511479462088174e49e51e3f5eb8350c16197f4d43d89863135a8f5936c49d42e0e6f69bd8d96bb3b296bf2e1147c32b2fba9b03db5a4532504d5a557e62b425cb08ebbbc60a2658fe14e259722739c8a2098c2bbe1639503e75f6aa0b2f6f5facd8c179f28ea8d5638cfbf219219ac77ebc6df381752390d85b0f06b43649f51ec6483eaa08fca8802228895e219ff1266bb4d3d1802ba1e5d151d4163c7b77df",
+          "padding" : "306c302806243630383634383031363530333034303238323830383038303830383038303830383030330500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 182,
+          "comment" : "oid with invalid node",
+          "msg" : "313233343030",
+          "sig" : "2b0d9609f16d5aabfdf9997801bc671fa263e588fb6866328bf3b8c7c3145b7c50ffa2996010118330b5bebd1dfdb28f3b4015a1a2b972d1d66bebc83b51f61e103bb2a99f9b28eab697ef08b365b721c5f1a5e68bd11ee56b02638c3d7b0a6055024e75f867a398884f1c6816904a6a43d3e061ffccff66e8b1cbd8f30f350fb764d4f2ad5283f1bfbfe8905a382ce4d7471ae0345b1ac70bc71614fd8b7a8172f9c4ac051cc6ebaa4aa73af18ede0ff6768ac43102c5572a8e651650473c93a890007e0a58f93326031fe5f14933c6a52bd6da8380db8a91d1d36d4278668db69450e04ae202832531601fd2f32db09608aa2cdf2d1c2f30f5e17a764d6983d906e86bd3619ece20817befde202784b4f7a50800d74d24bd01afd672265a5fca6aea5108fb64a2a311b17d4fbf84a1c265e5ba21d28940eaac652523fc4e9e94e8213cc23be7c9acb1c0f29c998acaf8ce05b6aa072c78c7b33247deaa38ccf0f575353ebce65fea97b84836c984e19941f739dbd5f749d7a57ec0a377f1b1",
+          "padding" : "305d301906153630383634383031363530333034303230336530330500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 183,
+          "comment" : "oid with invalid node",
+          "msg" : "313233343030",
+          "sig" : "4345f8620ca6fc5f73a6f412c1cb6fea5c3be84044ac8a7a1ff72057db52ba841529e0796af2715389e83eade82dc9cb525591c44c100ae2bbcf0ded3a19252c486099d85bd7ab24b0fbc6c9e6ee7470ba1a2dd69c3f78c106e12de4842c42a1e0686d85e2ca3e30f015c76df87ad374c444774e4209369708d8eac9c02815f6d75989d993c31cc2ec1d963f4a149d9616b36d90783c3adc448977139ab34985a52f9b96c60c1a5933d8a9db99a23c91ccd41695cbf42638c44932a31a49874b1539d849b2735499680b5d04b1ec31034085be0bb59c651792667b21b2001fe1e4b26e3cc2c72a2037b551aebc304b51fc1deef2a5cc5eab705cc681e7a3d0b14435c9c3a73db06417e3dafe4188530719ccf5611e275e4ed690f657482bc90d87c3c27c95ee03e39eba957a4a7e27e9635c9e833366eb833927d96608f9f98bbd83be20a2be6ae6d7460310c6517d511dab2153eb5aa96e8d4980c2acdf25ccba234309343e85ba68ad6095fb139a30155ff6bbab46009db306f04c5781fe43",
+          "padding" : "3052300e060a608086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 184,
+          "comment" : "appending 0's to null",
+          "msg" : "313233343030",
+          "sig" : "d466b8d8b4fcb2a566b4f2203d786b81e63afd5be21ce8228f40a183a9de52c992e27a85bc7f61cf69ed0aa559880c79016731b5fb667795fd1b37fa0cb2c86dd3bfdc20caaba24d3254bbdd063e6ce1aafca2ba04fb90f58f7d9fbb5be9679e30676b80f7c7cb1af50eab77e77bb01b166d23648c3d36a4fc228d6210e9d64bb3759c1979c014703b85c4aa7a5fe0f9f014819d96c4414920c6b57de2aca8ab12f7067895b13fdef4bdf39c5d863a671d66112d1f841b5610c9065fe14b1b98103c45247c2078f8cda5bec1cb99890dabacf08086bd0d73af4df0a9113e704ce0781ce631d4e39683ffb9c8d21b65d999fd687301ca1f0f9e7744474af65089d9a29c805c3257b32c95eda56426efcc856bdba116a08a5241792b1c282479fedbd8421d746718e859434d3e0b093f9d2de02adcf86697520f05023caaac8740df9ed28fff20e97aa45de9e68075a73b09b2ffe7fe5398e971d69d296dfde0541757248bf0c3876f292373418724fbba47bbf16a6eff8228a8d73da863d882ee",
+          "padding" : "3053300f060960864801650304020305020000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 185,
+          "comment" : "appending null value to null",
+          "msg" : "313233343030",
+          "sig" : "539d5ebdebf1057648e82a961ec142f82a979d34b37cd90a48624cc0cd63c15f835935c3fd7ce618f383a3997e841a0bf5476f4532dfc73e76f2cfe912d42a57c2f38b90a497aee58b280da0a8f2e9bd1776938540d630ac1681997e66e30cde7d5364f88465d43f0bf23b4b2a7476813be3a8b49535366441e126608a3e699023543ee7967b9c99bcada9325d87cf3c4a5ed333ae50d74554f863a05defbdab379d5a43367fddc240ae760fb257e51adf8ee4aa2451425b9e0f1aa6963f43da61714ccdcdb4986f0cb835eb064a112d5ce4ef5e9123f79f21d500b9b87e7ae11bc08af6082b5a284cc04aa9f58972af28ee70a4cb78913746f3184b76fa6e248f827e342338935c0301a18fbac9ac9a97fafb0f80e5c88c4eb9a1c850a118f32dbcf357a1ee8079c0efb912594617b44f1268ca7f256309f60250f7e0b0b7de5077d5c900f4581635e67e5b9f3d80dc8917b995e4ac1a3801a45a1b88ad0ff16f33141824a9769e9ea3359dd88668a9a64ff75201ac2b171d3c85a1dfd9f99b",
+          "padding" : "3053300f060960864801650304020305020500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 186,
+          "comment" : "truncated length of null",
+          "msg" : "313233343030",
+          "sig" : "094cd24b3a601b80b54a60040199c6c0f3ac766f4e7ad56354c9ac551af0cf22d6df1612f81b0a195e4e471eeda3efc95656b87645e05c3f224187c85b8e0fc01f118aec78c5d2533d22951261bdae5346d6d158ad56cb305fe0ff5ebd6b8d0e947f1262e56329479564c1d4a77e03f81ec7c520cfe10a3abaeb77ea602bbf8309a0726051e4313be579d50f2b9113b21e581c2225e5fe3ec435fd80d013ab24b6cae83c0047dd81328a4a3b9d7f5d342c34254ef3618d8cf822ebd738bc4aca8c3a2df349fb7421463e363ea77b78836f825bf023cc6ab9a6bb6528ea925789e577920d9cd1bb402e5cfe192a1cd6c2254e16080ff247f54e9a02c7cfee876583c276d736bda542be218cab897b50ee5d36c3673ca20e02c07e922bc49b054351c921b1d65c23a6d967619901f09ae048d4c09646567c3367ea86b86dc9e353c14f65e7dc6926ea5d70b36e23c66db53786444654d70d910764842689b96cb87ed85668d608d58b31c3632ed985b9051aa288f0005cab9ea1d4a278b3a68fc7",
+          "padding" : "3051300d06096086480165030402030581044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 187,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "06a763017fdada141ed44353e39b0d6a3038c903f059cf8132d7bfb05d49db22f978b86ce942568fcdc9c50354356ba4a1e43bb91172e898abee5b5acb9b0505f3873fa6ddff9f08413074fadfd1c6b977ff1e5cf5f7176726d99204de1031213f7d6c3ce956a93b29b898c197043aeb27db5f914ebf86de7d26e17fc0cbccacc8bfb4dcc7729306cb5aa6f8bd9320ce501aefddd1ff0de105806dbaf06c9c70e10b2a6193903d6e387e7eae612f9ff280614f86da8766c966e70548d255c9fa0e9945d0dbac5a0f0405132bdadd8da67bcbde0f5963f1e0fe9fefc0e238f5abb0030a87793eb952be375501636d86f68c5093b147ec0999987d6e830e90fd3606f1486dbc909ba0e8c6cef23eb4995a9b1264c696bfdf0f4cd969edebf03c5ce8a07258be91566722f0ebe3c736123aee981d1c1fab2a115b0814f584f8c59936974fcfeba4fa7cfebde8e9410494ef3110b6b2d419c3128884799d7ffb2ef99af6c272ccac1d8022fbd110a6fc12d13192e4a9fde1e7a3d8bf3ae53f6d8e3f",
+          "padding" : "3051300d06096086480165030402030300044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 188,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "7b0dbc9f51cbee3ed57cec73dabd268141d15afa82eb378d7c6bde7dcf0650554eae79a2489340b9eb81d54cd677c2d351e36642f1bc5699b5645ff9c4e8ef6c68bf5e337064f78f6eeb19dfd4e5e9e70b3600f4360938cb9336e12361f75f39ebf44994de531bebd230bfdaccc02e0f3452976f73055d24d673a55e58618dea96718d180e7bda5372df8f2adfe8f984de3c5711abfe75cdeb81771fa105f00be7de76e5b0a8838dbdd8d22226518fed7383e2a101f62ba3e79f59538ce3c9f368d6442063ef8591cdde03907fab38c79e5fa326bd67f6c0d017cdb01d39eab8fd3d7a901065986db241e30c80b977a7c5723ccf15c9494b08a39371afb9ea0e51f4cc35f515ed88a8e5b702b9108917061d2b75e9dd55a89a387aa2e4e0d5b9faead4ce10e8622553966c1324e92f8dece4b3d7cb981524ddcb65760aed7cbc32d47585afe5f48eacd24ed570334814121197c48505d790402b85a45a5937b0aa7cff371588e0a04030fe0ec1b8fec9516becac30911f689015b16a44f348a4",
+          "padding" : "3051300d06096086480165030402030400044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 189,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "654e9bcb87ac0bddabb2a877a1127cf9c306c9ce5da052f8ec732b1a98ea14c335ed82ab6f62d174651349407f1d91189bda73182ef8073e2dcffb39c21c2204081b36fa6c5d66c3fc97eb2ef3416ed16cd3e6a4e5e10c2decda13c3a08268893769b212f2932c954c121c01944c51dd5c2305cebd54ef65bb6ea48cb05a37acdffa34395e5e6f540fa87492adfb9ee1fed9d7b47841f75da0a890a0f2914b21aaa0a78781af9790dafa4dd23e511f9d9eb76adb25e85c6cdde568fa14145d821f8602e67569f869d6e73e396e247ace4b84d20522e45a066825450586e428e806a2672525b90d316a5b13dae5d215cca466e064e541f549b0b298b42ece5634c6cc48ce938611aa06ffb120c205955f537fb21cfa7c5db92908cc278f7e003ad2eef936343a70a2d6460a149eb930793fd45ee737776adcd04635aa87a3f7a12e4184689a88dbcf3e9d9f6d829e0fad1f08596768774fd149813fd9e03a42faae20f02ae026647d68f3c74651a7f469da2359758be1d697101135d6ca0da131",
+          "padding" : "3051300d06096086480165030402030600044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 190,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "5be6f89e6f531c41e248f0d72c37cae7b2a466886bd4c1059d966b5c973d127be3c75c7dcbd57a767bb13be20d9402a780a5e58faabb571399d7dfdf3c8f649c825d99309f84140db70d4bed2e160b22e49958e7e35aa444d4fc49aa24a02b2c170859fa621d14c3692a2353249118c7b01e018ba5d82354173afe122a71368e4342d88fe2bebf6a0255f719b985d5b57f720b0d4767f67b13ecd815ce40fab2b610c4af1054734934eae5fc232891f29fba6d364e4c0f2b26bf600836fb1ec9530d5aa14b90103e675efcbc92f6e88afa351369c694892e949da6d90e74f2ae853f5d8aa70d5fc132d9b41e20520baa8aa74b77c60daccf4da758b9d22745e50cd7ea118dc14926b9dfe0fe26600cba5b447e9e2a14d1d8a5e7af01ca143b6af298e031d2560d99aa090ee2d7180ec695dd553847175ce66084fae7b30ce6b5a3b1164757043dfe053853c84bdc9fd66708b029fbd44a2c2fbd8e5ac7c009f8cbf53ec2e285f2c365d823d31772bbfa710e70eba58d71787763bf0dc09ec5c1",
+          "padding" : "3051300d06096086480165030402030700044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 191,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "3d7186aa38d431642aac2fa01101224d652e468ca9e420652606d050f109825b4c2943f57d943a48e8559898f9b6ee174eb0748a9c84e9cb874c50c760d2b1656374703bf82b2e4012d4a4b642a20c2e5e9edac54f6b152c7d79ca5591d50bf9194bf36c8604dd8f31d9c40250909172346331bb73cda23c6ae481ca91dee49a2298df8cd40e5b7f6d497a183499d2a0950f2e440614ab5b4279c887e2b228c27700013ce15841937e319deae2f7350a2f76c43c6e02e5937686f4004369e478f61aa7dcbd38d50d93ce74a9aa8a13cbb1a8f92cdd382fb2c35cf292a9d45e404cb1cdc14608f5ed3e2c490c22862cadf0c6c63116c81b7ca3e8ab6594e55f10bc78769c3e4cbb5b44e5a1c2ab3341714a1a40702926bd5e4facf3b55dc978a2768166a48285c06722d5436bda3add1a7adef76fd317ef06f7286b47566a38720232bb58954efc44f2207de71c2f3661a3140ce5a94145df9d4bc4cce0a16144fe0205a1da7f57409fc8da45a5062b2ee39119c639436ed128983e1c7fc4976c",
+          "padding" : "3051300d0609608648016503040203ff00044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 192,
+          "comment" : "composed null",
+          "msg" : "313233343030",
+          "sig" : "9f32c9b659775417abb7219278e0ef2eb30ba487d42581fc22fbb18dc11f5ab081a40621b4b925fd40ee62ed792e853cc26f3589aa9bed4e04aaa7773a08b24cee1ca2b83331487f889d7d1770a55cfdf1654c4ce320542ceff8b0d62cd6c59c8bdbe923431d9308fce911b25dfd1206b9c97c0cbcc46b36faef1aee9f88e4e353a57fa48d44f88a76b3e67cfe276315305f71d0f3656f3b086d787031dd4c716cc906f9384b765a7d2a648ef497b7f89b8fb72d63351bfd0f019979d859407e30d7ac22f0eefdc92edd7ce8033b11d266d66eb19228f75d7ef300848927c9543e6e7f195bfc9448ed5cdf2963676e1644d09729115ba95878324573d4bfeb74c7713b405304155bf7abcf7f76bc3fbd96c6839e81624d96dc9f45f69af43c46e8720d1b488aa647c0a7f56dd36619c1c6dd5bc93b3fc00a00dfd49a19a2da23de40c3de197ec6cb55ed47062ef17ff15112a78728a8b5f3344d0a7168726b0d8d223037a52a2562dfe6c943cf09d82b9d777c3c2f1a2d2e2112388b324088de",
+          "padding" : "3057301306096086480165030402032580aa00bb000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 193,
+          "comment" : "lonely digest tag",
+          "msg" : "313233343030",
+          "sig" : "d562cad64efe72291dffbc533a218789806229690495e470c0f1fa92ac7388d8c9cd28185c30d302c1c12dc0a8a275a3038e90a8e1b4c0dd2cbcb1122b25fefdf3a3b5bc95c51151c7ec4f2c6dd91a1fdb4f1c95394291ce477a9bc6c374010d073b6d2699a302e10eac34432bde58b2ea64ffa5a165bbe9361221314e46fe63cd668c33f91c995e0ce090525d86509a34b8edfe333c5fc2f15c0bb823d0ce5cf407b38663bc9dd20b9520f9912d8c792771220adc083478a08884423c6f13852e356adea36476f5b7a6da5e127788958fd42a746d854a8aa2834445fc7caf534fe6a07e45330eeeac8c042f1cc528d39a8ef016c5bb88d9bde9fd8502642ccb9d120756cc6eefb34fd379ed20d6f3fd391b54a31dc758a8780935d52881082f23f0b5c9460e83369b9fe030d30be208f8a4686b9f74dc6dda9f29957eb02bc8238ccc3444af8e160f6511633c96b683a5e4f94499a9a944374283e76891072b5cb6216594d87581c2b00c884b07785dd58b954f4f850417f8bfdf6fef77f99f",
+          "padding" : "3010300d0609608648016503040203050004",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 194,
+          "comment" : "appending 0's to digest",
+          "msg" : "313233343030",
+          "sig" : "25b461d95013af14d316948ff8776927113814cb3acc23b7f241799838d9081481e7f27fe1c57a40cb6303f4bdabe3c732c350abec0330164da650eafcd62cc44fd545b8ed7b2247573e4b8c7fc0a0f07a4b4cd685fa64cc9c27dbf7bbf35be98de52249a80e9610f91c724e09e657e3b95d2ad71478f8dd379c73c193fe503245ac003c238045c6e799b3bfd805e55096f86ee9a46e27fc2353fb59439bb7a01bc58956f052543c6da133c5902a053ed5e0c5ec074f35757bddaecef424a7705437e217224b5265445e11110a8dee8cc8881ee03653e9f68ea9ec5dd77810b9eb9cd68ae153531426f208b9e669be6a5013438283f00a1f9e827522178b9730ab72b9ffff5af9bd5dfa87632794d17913467ff0aea511a8aba2774d638a6bf8bc5a5c6589dc9e72df8c6ce28762a2094746e708bccfb4ec975f3676e3729d452542996dfa9dc4263e743afebff649a0b12c214efae176fa22e5342c8f66b10d012f6852136a82ad8da72d2a174b510aa99184df188be760743704d42900d155",
+          "padding" : "3053300d06096086480165030402030500044243f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 195,
+          "comment" : "prepending 0's to digest",
+          "msg" : "313233343030",
+          "sig" : "07de84b9faf2ae81955fb71df5e5e0b432f1ff72bab8b80a3305416d854e4bcc0c33db78d0ea4e51b63ff3c9ed9b7e428fa72a27f9124fe7f7810cf83b830c5993b8fdb85fd7738e8965d48807b087d58d322efa3cc1006abb273f32dc52d6e98ca411fac77617467297750d0413f0af18a39b7429045a0b6122c7cd601b4bb04611a38f6c82117389981f1270f81a4a6f81782ee8ade72559cc7008f86065d697ff5721f34cdca3f7ead956d25bc1387ede5b5e1bc84fc47a31dab45920817c6b86f15fadeab17c22123e6bd4162733ac5a97d58d2e2b9c1fac6cdf682436d719a7940210c546c74c7ed3d64d76d7af06d7eb1eb3d0a5b31dd2322fc8fa3147592ca4f35863c05c60431870c91cb537846dd9028e82f3e014dd8456603cbeba7e48ca89d75ddf053dad7c89fa6ee2d315d1e57841540004251372777e6feb350b6f8e04934b4e623d631a76b2ed78fe67d55ddee2750fc3fc56ddac7141640ccf2b4bbe4e23faf4c9de76b50980a1388afb4b342e6f94bcf6e37988ab523b71",
+          "padding" : "3053300d060960864801650304020305000442000043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 196,
+          "comment" : "appending null value to digest",
+          "msg" : "313233343030",
+          "sig" : "4e3712c19853d5431f8211843b51a56f8f09e182c52c21c8ec8af0b4b01330d3d82618048240eb27b7595b99532676b45f338453cbeb5bf089a2fe6c5a9f2766696254546b2579efa6020324ef17516192b8897f6b5f8e9567bb05b449a0749e2aef992454aeec0a44a4a49b9b2ee6e231428166720c178226f29e48b0dee66c7089aeee7a60ac9001a3dc7873717a4c25e11c3b15a2e688a740d3463f3d4d22c66ae7b749a4a17beb8bdd15fb64a20538edeb2bb5eca7837f4bfeafd0858e910ae943b3073847f68c08186cbbaa1c35e33262077fca3be60e2a8bc051553eefd08d23eca5665837d0a604ecbdfbc16560079a0f7bd1f0659b7ac251a1fcbc18870164996a9601d9882685f359a0ceefd9b476a297ec4e482496da0fe41a081c43bf9e05b4657ee76cec9f50410e190a814cc5ad6125b2c1dae0d07c3aab98839f78a77a20ac238b106289082c695275d989e77eb45f0b63db84546f6c63ba2c0247f73a340bfc55fdefdf02e5de4cb9047a2fc41747a661eed538d980ceface",
+          "padding" : "3053300d06096086480165030402030500044243f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 197,
+          "comment" : "truncated length of digest",
+          "msg" : "313233343030",
+          "sig" : "1d0050b90e5eb30d6f772999383dbf06b89f5752b461b05dc62cf9daea0340a1f43424ffc567c54a9be58a688315618734f2098005552a07d6916221c0f24f539ea57454907d5648670e50a7907a5c7a7156d9576689a3b72e7c78c892a0eb2f4a241484bda80916899fc8ba6080431f47a78a17a0467722ce8b7e66c1502eeafa5963857a1791aa61c355d1d56f1f9c76b4e1c05b2a669fcc22a305baa6754245477aa6c02947cfa15930807884014d3a5d784ed291b5e3261d4e4079a7bf5f07ede12d6a9ea4e0f05909dbd46fdf7f504132963a7aba86f23b0691bd69161e81bebce5bd8b5d545bca66c430e6a05ee7f7d1d9c3b6498c534d1bea91b127d432d45976b29de017523547b936d163d8d8d75d4ad549a502ec441180ef6f06b41ab827a57530499fff99fa4a8c308ecd9bca6764a0846eea97e15cdd19a028fb3ccb1d33f407ed8bf04d8b73b7e004e17ac8e5fc44be897d46e1420b5c57566c114ddc25a05ae8e8525b92ae9b28b2e313658b4f941a6989b46db6ddd8c371f3",
+          "padding" : "3011300d060960864801650304020305000481",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Replacing digest with NULL",
+          "msg" : "313233343030",
+          "sig" : "9a0d31e7f932b616c73ff612e42dd74c9d6f7566a40fae8e6677cf6d54fb6f2e579b28d0d2d8670a33b3fcb3ebc57d7ffc202b801aade2229540e9c45327ede92354bda2dab08190ef6985d824d03af59709f022ab33cd8559b48745f1dfa158e100a68e6acef782407fb0ef4b96b4bf2fd7e40695191845aa88738e66cffd7267d04536e4979508312fed2894db446220014c3cfa8db1fece66e484b56f105755e6d65706bca5b8b4e0b615d56986f1d0ed35b5357d17f54a32f4d5063ff61ea4c853f0fa99d77efbcfd21081589fe63441324a0fedcb6cb31c91f6579b2b8b8ccd288a0f0fb9f907b474686d41c4ed25bfd07acb864118825ce56814babdf6dc8ffaf5a5cd6a30941f7760d9276e00d91e9ac5ba4fd0b3900d54539be2879bc95c6c58e6b8443cd8d561919ac2431528bb8b5f67cde0d05f2e5b4e22aa902771596b5389b662ee847f077f9b8cc35f0c8192576af7aeec1d2c719bf7183f072bf3bab37897aecd785078a4bdb06d0bc2367df36ade0583449ab25e8d035ce2",
+          "padding" : "3011300d060960864801650304020305000500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 199,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "3495cf0c5cbf064fdfa088be1d7e57982a798c17933513d404197aff77c0513cae184df56e0bbbfe6b8311a281d8e2cbb42157a156938381f4b0b1aebbe408d6b0365fc20e8f00c39020fe740332b14d69fb3ec734984e92bf406f1449603164adf2c3c77675b30d25cd5f403acc5f104aa754f755626f1e5bc9fc0c570ef3bb9e7dd2633ec9163f056cddf73debc548d52bec6214af9b4c6b5860d54c2a08b6f81af40f8fbba9902a65e388a121402ea276cd89e0076315d4e12e045497236473dbf6eff14ef21f7875daaab03a81b5070394c127bba13e9fc4480ad245cf4ca8bee343028db6a808a2876b7130bf1f0b4d1de1f1a7f841609db96b50a28ad4e263a76b78ac2fdf3996cc5b67b6fd71f16bbed1067c0f9e71f399990b9223bbd8628614a7fad5a45970c4ffe174120a538ace6969fe0cffc9508929606e4a30ea28d555124206063f2ba7856c6beb0367012176bc258a6688647b161ab2382f9b3c926d33dffc12ec15049c2df248a46f961ba92a94b9e36083d0c229c406ce",
+          "padding" : "3051300d06096086480165030402030500024043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 200,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "330ed439b3750e35bca2cbef5bc0470799c56b206256b543d026dc11a34d15d73c696e03340c8f0751b0dd204b53af0cebc32a1cf1f33b20b5755bc4f2b9f2c8bc91939f880e62a0d8f54fdba12e602ea37af779a2afb9258e19fdcd51d4e767733ff9827432adad2f0781a46991d3d1dd9a8e5a700860e7defb0fdd3b4097aa101f95814b848abc0cb5cbb260e61c42673e0e836eb31f97a0a50ae9aa1df72ef603f0e78c91459e690363042113335b2e1050eaee0b83ae5f6ceb50a4c88956d5b01451d56e72a7755c28768004b258d86c2d790ddbbd66cd0a7f5d017bb62b957fb0b6e6253a88eb94dd5d3cf90c92dc2563b728f46928b83b1a29ecd8100e7efe254c7e043f215933f7e9873fd0cea1221f03e31f43649cc2c1bb42d7f040bd5fb401a1f3381e5c4a4fc1f973b67460b5bd2c7c99d29dc14490922138b8a3b9a2a415f50206f50d254fdea8702cf2e4057ea77cea8f18c5da655416a1f7eea84667789f78faa98a871b0a6837babab974b60ed54cc7d287d538f140e7fd6a",
+          "padding" : "3051300d06096086480165030402030500034043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 201,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "6818ee1c57e9ef40da6b1aafb3d3cfc9376eff56c2913b8b2e0891dc7ffe4450fb25f2a8d1b379c13b6b8f45993219112adac050f43ac612e7957c9484a3bafef2e550d15a8dd88faf9525a2fbec8c702d0721a408b1261b3af2be9c817e0e1dfe8b6c58c569539d66f6346fe0813762caf0ea857895e1fe90d50e1e0bf1fcea7d2cae0d5bd2eae197b0eb6ea15eaac077dd81e10c07e71f948382db1c5dd6ee4d86b0144aa648c38eea0d8253eb988205a71af95e1afb33dd20fe8315c16ced59d6185acc43e8dddf968875c331c5ac31af14a9e55023ed03f503487229be4f772eef970f3f132d1fdf334737848994d939074c4ccd448e6d2b9065088003d76d9ef38e8c713a5d8a010c9ea6dbb0bc07d32a515ad1437029bad8eeaabbe92f1b173bc8c92af832e18fe0b60a006818ebf75622ffcea489cb3f165c905c18a52a04188bcf132db833d7416858d81bbaeb8a62f80c1b328133647b36db5e4b37ef16713a16223fb24e8ae93c9d687c62c77f4ecca256e30b3ff88cd8ca3c0c68",
+          "padding" : "3051300d06096086480165030402030500054043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 202,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "947f2927355398312e17781d59a713a6ecdccd4ee315049c041b788ca52c691a7037bb489f71ecac2776dd1171853483eb453d4b93f136d51318cf32469b3d56d04bbe6dfee2721abdda3f40551beacb3f2348dbf0a8056bc4bef013a4e9819e20e2b045c3bf77f79c116993c8064c46cef8895f874438c30e555a59258d1a01596fdaabb22fed93c51c2a4881c08bd09c3219e5fa2979a32775c00f61af935c839f7f0f54a74677b194749ea1831c44e61113474396e398e4d821d65e41b3cd55cbab2b703435073a3b0c2705622cf802f67f346babfde288ebd26bd909813d8bf51fa2b07946ac0e523c802173fe6a42f41568281944f4dee91077a12e41d37e53a4704d367c2b5b013c90f73b7f24d703cfb006c8d0b399f498ef2b62f08834835108dacf637959c5506a26bc3ef5e30e1100b093707fd3b5190b597d0a6f270b21eea9aeed5b1e77acbdc01c8875724744b37554791631cb60a96ed9d7b985c2d6a2c09a33a17475e2ba47b3f56f9a33072a0fa920eb88ca0d9bd195bdde",
+          "padding" : "3051300d06096086480165030402030500064043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 203,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "d054b2a5ae9bb9ded9a28528b59530dbd6ac220d761652fa44ace78743c5432a517024900c9b24574e096b6d1b295ee5251d2923a928e7852820c455c43b76e1d522ca82f98852d7cbdcfe0f85ff1f3de2cf383ed6172574b12af7fb03c58023644100effe836bfbf8e7362378541f0569606d1842fabfa288dae9ef271079023eaaafb6e6b4957e0ef96bb18b968d73de32707296e805691532925e18a709d036bd798a6ea0ee61c18aab41322a7063dc372bb1f0b9991d2314c94e370a8966a2187a8940d81b6db830931c101ecc47d13c0b9f91b3a07ad0268d0f3693684df91a8720463fd1442f01e5eaf6741d2c2391a8b4d55150728825dd9e922d89823051948c99921b7280675641e9a94c3a9d3de31332545cb6e88fe54d38a111a1f125241333ffc58bbbc4e759b3986d73a3a8f7f4fd81c1c634b65854d12dca87f1d40fa5624079426a53be23a1649252ef027605f3e82333861de641319b8418b963d2d043ff789406c3e34cdecccf111343632c1bad9deb525783676c36119e",
+          "padding" : "3051300d06096086480165030402030500ff4043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 204,
+          "comment" : "dropping value of digest",
+          "msg" : "313233343030",
+          "sig" : "28cad6c07a93289cdc0ffce1c1beb709c6d344883e0e175feee78cd6c9a9700cc89d51cbb214e7b8e6e84a3039ad2eb2be4aac0c968b9081af46ca68fa1155554b923eae4f4129cafe12c44891656b5433d4e048fcc1468710bd9a3447e917a35d6333d4b5c7118996f61e0730af44fe2c663e980b301d8c7c33279da81adbdf33c8e90b04011665c6263fecdc45716015e11b5d9ce3077d894f4168159f37f2ab3296e66f2669f766029f8772835d7b887aef0d597a537f1db4e84e1ee45bd8293b4bb6f302904021522cb9eec833fcec2ba008fad69a6372470cb67207f29bbddb4a22470d91cd58c09e37d54a0751613ae8e0f29007a409d31c4e61dd6ab8d181d14474b56eef68995f2ab50622c998fd49656c9f6507f583927209253886f60de38c294f1fb95cd0f5fe3bb8d9f1462730c599093aa9418429c3ed45d595fc43198094ce216acc729abc9d7d5c2a95014d8b02fd50a7bdf69a3c3bfbbdbf3e29de2217825fda34799f231fd7d3ff80d1fbf82f82ccc189598590a051c23a",
+          "padding" : "3011300d060960864801650304020305000400",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 205,
+          "comment" : "using composition for digest",
+          "msg" : "313233343030",
+          "sig" : "d266da27670c18b97ccd0fe8beb45f2f83a0969258449fabbedc12d7bfe078ba741daca1c3fe504631b221eb1c899aa6c3a89d3a3904f48ebeeddbdca91b1bb9400eb1bb4d9f4ec903000ce239bb0a807de2c3b916336dc196ec87832774b701115796c4ffc66a6e344c9dd1ba9cd8517e93694f4d4502b20c72cb87426f250373113ab5b4f73c0b93de792ad714225eb70b9b44ee154719d89ad6c5c2c78917d3dcceddcdeea90bdaf0b35f2d77bd08f099a245cb39af8cf70d9dac0efeea156aaf83b5316b5f05c6fd9a3b6de3e82c9d02fdc5df5e25888c200219dc324c856d7a0b5687e3463a13accfb1b13b25f3b35ec84e551b2fd3738a1924dfb931b4d264e9515c508782c6ca04e2f66c30ec54873d39c0501459f0749aafc652531aca65d1fbf9b4d3f1272d8e87ed5dc680456d8e7771790a64b628ab05addd1078e99c0e197f9bd648db9caeca4e7160563496a18606e57bf5cd1c21bbfbca5a138852fc471eb09cd5a9e900409dcb2e0b733c54903a70d04e58cd64ee441d9ada",
+          "padding" : "3055300d060960864801650304020305002444040143043ff800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 206,
+          "comment" : "modify first byte of digest",
+          "msg" : "313233343030",
+          "sig" : "bb94c13e6a00776c615fc879f33bde87218a3ba010138d8e239d6480db2431a67499a86d86558e3c16c8292ac5e5324981684894c8c7408f741de4bb4580ba6250f81ca6d0e8927f01de76b48f5e176634e0627342ec7d941fc25926d4b3efa0d94d9e53379c0f07f0d7a68f3fb26ec2073d257a6fed96393707e09e4f7eb247d106720e91911637bf43866d7ac90128159bd2381a5799a03b5658f2ec5956214383f3bf7b11837621dc4dd2a38fa4bf979bdbed9752ab6fb5c5af684304220faa3a5329bd106275900633488f25fcdb7bfb13db8435a53050f00866705c1a6c51507304a7c09c166e15bab7e808032da23405e8d2d25f64066c07a5acec27554782d2fee6d71a52f588268dc6fc928bffce6fc5eff2f53fb9d923f0e036df832c2e834b738646f1726c4016df56cef624d017a8755a9d9c8a885f53774af71ee69b34b7ab5eba4270a19f979909cf8331d64b32f759504ef35e6e1e839c66b000dfe24893a7a55a3d422c2be8c51417c266288fdd5cc98f8af150e579b42e96",
+          "padding" : "3051300d06096086480165030402030500044041f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 207,
+          "comment" : "modify last byte of digest",
+          "msg" : "313233343030",
+          "sig" : "4f66ac4021d9aa29b43caf068b45c62300884232650b1809cc5c1eb9feb5834c9177d5281d53af9b9a868471936fe7911d5a1455fe101a394182c1c21d5aa7cf203eecbd02507797c8f9d1a7d69c53f639f61ef112ad99e87e65d02a15dc48e90acba7b09be2366eafb45a1d2dd4b2caab7fe07b0e3ba94e160a58df743c15d286bf8966447d4305c1b2d27d23203e1eae1a7e2ed7da7b7962c4f6e95e9bdb30e02dc1206039e84aaf495ab6c04628a661f06e7592c4a9f5ad9019e2c4f090fe05282f00b43ca98a8ab1a0b38db98a7ec36c1d1afc61a9839796fcfbcb0560aca2d11a8bfa7dcc46e76b69678184b8ded0d49efc601ec69266164f8e5ad7f7ed416a92c6bf62fff7fea732add959723247c2b688f60a7aa1cea5ebf913caee52cc70f7a850fe1c8b006e4e244cf2d4f948f040e28e90a57a80f2e4fedf6650d59683af70678f52e79b9c60a93536814fc6d669be8092703bee6f2d842518fb7a031d6562c740ec018918aac1ba9192b4b552a3cc620251bdd62670a834627bdd",
+          "padding" : "3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb34c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 208,
+          "comment" : "truncate digest",
+          "msg" : "313233343030",
+          "sig" : "ed93465874a3d62afda94f71718914dff11e99e0793d9a4ba45440f475eff498951cdf6f435f163d78f610a0dd06393e99dd2e7f5139db0c4ddc43a932ecd1b498fd8bf5443c7d62e53230869e631e5ff8a85e379b34c152d662afde843f205b99d15c2258ddf6fe286ae58005d21d4c24d016e2e084d78e684b7344302409e050dd759a5f5168a587a8189c2781f7ce784780c0a6a0ac4978a4a7f95b457b4cf2757246d73e14a957ed061edb0d0c8f345cce741dd7a1c79af84a81fcac9c4badf490ca28c8b8a4b90d2214299f8a6a092012346f8fd0d679439a0dea2e196cdbe8a9a9434982a5fa20af9cc19df2deecbb86dd4772297db08e407d78bd6d0d95aeb4c987a21007ef00276eff17ff24db4f51f5dda13a75cb7b09375e99b6965ca73f423dcc1d5e9aeaf20fd09cdfca37082b92a9a582781da5eed90eaae7b0a6c7684abd0f0417c3c1e8225dfbbb432176304754d82c96dee504fd36d4c1ec0c750d4276180a52c2fc93580192084f270925ba138c52b52a95ab16be998cbd",
+          "padding" : "3050300d06096086480165030402030500043f43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 209,
+          "comment" : "truncate digest",
+          "msg" : "313233343030",
+          "sig" : "eeab3ec4df4e69668f23a6de6d071be7ff5e01613dbfeccefc722997ded7114f680f0fea889a070ea1e1fccd513b1b23059d0eb99d41f4cb08f2b8a1af16584b34f29341722355eae5a8a223c391cb392193e9367b81cdb46b8d897916f5f054a7a02aae0af18fb553050c88ad94ad406e574a52dbb167997dba36d2e8707ae43df0ae089d663c93daca1c354ba9fad356ad788068c7a82a7fe82445f732908e2dfce7d16eea2212945a918d6eae80b8ae93f9fbc4babdddd4b09a040cc355200149ae4d82ae968db6d7693192adba439f33be49143266bbe157baf4291eb8f75328ef0c76fd5cafb554aa843fba336d4f9862f2a2223035fb9e37a43c7cbae811980bed620768d5690a9fb087d050b0f8a09867caaf23ddbeff490497f7d26cca6d69d0beaacbec5a7e4af606a1eef4c4316ac4084b9b51663b438f97e507b54b86e5579409e13de979d749f365e50dbff67b0ee7994ed38e96ac897135c6a249855dbfc10b4628025b7177c3cb0107b1eb66cef39bca2ae00afaae2bb236c1",
+          "padding" : "3050300d06096086480165030402030500043ff800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 210,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "2c5c3cc5f8cec4eac19265eb456fed4be0c582d3324407bdc6aab5002534fa32dccf93ef7f1ac30bdc5f5c2c4964a0483bdff24ea5694224edf98f808c847ceffba864c3cd8b2260626129bfc59ee0117b53bfab63f437c96af170c0caaa68d8d8ed84261cd472b1edf699483fe7b794d07eee92b637dc1c49aa7c1a6aa2dce34abffccb37db3647d3ab877fa11475d0ac2647b4d4e439185a11619cd956f9dbf9f73a33faa321f2f5c501114528817e932ee71be313b4507741ae81ce6b1ab3610f2a65ead30268cc1c5ce3189a37e8218459d717dab5c09f991fff3e07ee309b1bb607144dd0d477cd18b7147b065f9e09b8ecf282dcfa2745154a75cde6097329a9782968b118bb23f3d2b36aa3a023da114dc648fd740250e76cb952d7edc0ddcfe96573ce196cbb9ee3b309b88de6213d1b220a24a95d753cece91e12b211832968fa450cf8f752fd983e64baf9d0707dd708670d614105a574523d49e492d77647717d653c4ce6f997560c3c35e63342a903385d17a1e2174ac8ff4db4",
+          "padding" : "3050300c06082a864886f70d02050500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 211,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "002de47f8004371d52e2cea646c3d30c24c7067ccfe134c4195e79f3c1d5e1c515ae7f09b04184a0d2cf9c829388c11960824150ee619bfc8d55bfef47a58b2a662e62d692f531376cfc887d91f54223007ddd06a2205b4e35419897d0b332c10c3c9bd9cbfdabf44af4b3c9da04a76b2d4fb1e3aab5ae020116bf97623b71c6422656a3f4e9ac1eab2f7de9e0d048782dd312e0dfed774d87e454e5d593bc0f267093420e8047b4246f1561bdf500f1c70a7a96d0f037bbabfb2deece7618fd1453e88f26b6ccd24a8a0bf74450df11c9cfb5f6f9ccfa3ee2aaa8b254750987a14087418815bd7409f21a286bd5a2774e79fb5d6b36cf5259acaf04b8910bc2f6b072d0a4d02dcfbb0fc892043e3b73b1e76598bf95abe447cf995a638309ab1e21b987db52273d592267215b9af4de075821583b409607bd0e3618b2c0f93f5421ad53bbff8cb10be209c1f01a62b8f255f2ab51c1ad583386a6c34b7f60130f7a9112caa79e9e8f47da71be9626d4d68b2b8e3327673f8bbae6815107af7e",
+          "padding" : "304d300906052b0e03021a0500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 212,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "d6b8ec6312bde1ecbd8e3a0bec28319c6778eb1642c1f1d62777c259002cd90ee9f4fe1e84de43c399721f7a954bf59279f53345e9c03160f5797ac477db9fd84866d02ed8ce4433de49885618cf0cac5ad01970aa72922fe658cd0766fefff0dd99a6ce3c10ef2967cacef6cf5af8a662ea35313166a77142ea6bedb2fa730e584211f3703126b3f79b883dd8c1ba23627b51f06b760ce38f01e5d658775db23b83a31236d52e347050172bfdc36ba3234d7d6bd918a48176bcb64d9450dc777288c98d89330dfea1ffdfffbf8a0d16acf4fc1f0acc92d6eefe9b2f56af13516b39be2af12838508db11175c761d77fe647aaf4f06c0a3d5700d04420d74f34f95ee992991b54b579cde870cf5c6a79c60fa1a89740e271dfa80784a3ad722681dfb0ea7c30c85ca57b392cd8fa322a94d2efb5deabb67326900c20f3366cebaf97891696d24b708d81993261b55969f8ac8b808325357a0bdd51f5902cd228e71a71693d3feda96a239bf10fb51f32994dcc439f43cf11185d23652a9ee5b4",
+          "padding" : "3051300d06096086480165030402010500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 213,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "d789585d72ef27eab443d409250ff15e4e188ed3bf497198167fee8c3476bfa2b7f3ed644fee7aeed40bf02df57ec28596fb0a5df4db780fdf78ec97e709c43ab7b805c381d32948f8e43ea2663a8e2fa6f817b99ae897a483bc37d4315f95e8fdd0735d742b9da61ffd7d468855f2aabb2c5d5d5f96c9f5458a4ec612b911a41618160e0a9bf0ac98f723e73a947e8826b1e05b7a293188f3ccec45aa8e8a225f386275287dfd5d6896a716532f876797749d3ac3a60b6dd016fc6fe11007419b605777d3e4d88a1d413bfdfd9698cc67e717e110c386e0c0fef2939648eaa0b0f83e1121a70c0c93dfdc3a92c6fa60f98355e8da8f368302defc9d5f3813de9de57dd493559460383413ac1adf3eccf8ba749e492c7d98da5356565a1eafccbfab2534e405ffb4c89a9548a162445d1027ed93ea6dcfbe4825af3b629dd8f0454cf54f54944986518be2f9bf6c68314c2e98bc10afede065d7c767f1c4ee11ec7121182722afd0f0e3ab65190fd35b227d86daf3f8f740d6164ea5310895a7",
+          "padding" : "3051300d06096086480165030402020500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 214,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "068b2f62d5a72b3d9c1cb75c55699e539c9a9f97c5eb4137aaa30da1c9c2e6438aafca227f6bb87c02194646aafbebfda1f43f361c0fb0ec53ef07f86c9ed3db7ed39fcf08fd3fd0212ec51eddf3059104516ddd1cb0bd9ea329c793772aaf7003e3b0387c03a79eea56695f415c3aa0029238d0baaf619ce5aee8fa73aac1e79949048c330e7b33f55fa4e8822d926394c958045ab6a97859eee5f39f614711a11d5057b5a467802651bff2645d897fb8b95207a968babec7b7604bbfeeafed44e3000dfd4241ebdd87e29103af5184399c65620c9075a91fd2ae5a40c614e4f07cf2c94bb868f0b99ff284a4f4bc1f14834d26ed45349c959c30e8cedbcead87fa7adfb898f998118332a06404ac36d7a897595b64adccf9169865b0d412c204c5f776bfce6959230e29574111e50189dbf0f967856643f135a2c51c8e90f467cd55fac3e8bfe4314d23f46e8f28f399e626f9d576997b21b4be2d9b7e50fc150661a25032d9f150c97a9b4031dd646e411d09054765068e73c1da7fa9f9af",
+          "padding" : "3020300c06082a864886f70d0205050004103fa6e1540a9e5b94313c5907267a7331",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 215,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "1b9c7a5fdba8b0c84a6f98b1c419c6088a478346c75049822877b2402a5d28a0bd6759a1a579e6adb33a59c1bdbe1f829f2d3a4cce9f54ac7c1932a6d7e8c750e538e70a1a2e0af1481096687235d7b598c3ee9fdb3a6ea46b50fae66dfae54a1bb475ec742598dbce5febfce6de99f00176ac8cfde273a0eea6ebf0479f2dc676087873cd204bbf9cc49872571c4965b8d57c511328cd72811f89a6b216a28b9906c12b1dc38282b3cc7f2cbc52803123cb8cc0ac1a58397a7ce85656a17dc19e432fb124b607ac13879a4477dbc099d3826c3d92aa6af39f80fc4934816dde6b50a932cbf902f2f11125c8ec68b56aff6ac545601472380b1f3a19238ca8ee8e8f9e2ca3d3913c4a7f0d6e959590a739028a240d30813260e63e25132e572e7705acb241716aadbd0b9a051df5c5a7ac9a98304d13bdd518a84ddf589ae2d7f122aab5c1db9a7bcdd4688faf3209e80cd9aec91971121f1e5c799d55915b88dee9deb835ae74ad898293988e54662c29559535adea863ef606ceb559d9e236",
+          "padding" : "3021300906052b0e03021a0500041421f0fb55d0f5f4e1521ec82216000a17e728f773",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 216,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "a7ace057a106782b546816f8dcc81cf41216c18e587d8a5753ffa780fc51007196f37a816beac993023b41d192ac88cd30e2e9719309aedc367defd2893d767dae6c6148dbbe6fd4ce3636bed48b746982795dd206d11e603f77fb46fd56ac9e51a88f26c9c9512d3cf851afbfecb061bb6ffe7510bc4a8f4c17b8a6135f9b80557149834d18f4bb23822c1384a48a62ef3e3b723fdbd250d25d25177355ed361d54f372a78798cc111d6374d40062c5d4c5e43e8df75af841cab36bb15c5d4031afef9ae76670059a760e7aa610df8517deedcc6d616366473b8193fea07b3226bb67c3989778a868997371cc4f1242c77e85c2fab1c342ac49131937f16f4f0cb4342874374232ea1aabc7e3681aca47bdf358845f668a8844a7732a48075caaad959354592f5f3ec413cdddf337c64d0263b4096762a7eeb495bc7bf9868c9be5334697f7118c8c1274cdf300937955e36babc895745d02c22f1874159a33abe0cff3da62b76b3921b24573514dff80505c10c530a78b379da653dbc2947b",
+          "padding" : "3031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "7beb0b9c393a8514932ce399ecbcc86d4725fc7c64840d24a45564548eb5c01774f89a75d3365e653fe39be83484b5243d3fd894191ff011f7a16195c1c6b4c9f474bb7abb45981077f49f696b5faae60e45755cc58e4f006a5fe1b02fbdba5e37f0d7a9d930bc2e68cca8f345713a9d0604ac8dd4c53e435631993f3b1aa9a2986dbd0aa9bda6e0789652387fb60aac6183b815743efdc4180917a30fe6f4fbc97cfd2c181855f4571408707fe61c5ead6bf36ebd4d13f4acae41b77160a4fa2ab8895ea7a36e6c8e48a4ab47be8addf9d1f1b9317b94889087a7c459fa89aa7bce959417674765b58554233e561bb03e7265afc15d7078fb18053445e865f5ba637d282406f7634e2d1ecb022b98569203b56c55c2d493b1414684984db401464559b339e37c6c6a147d3d5c05b56fb0eeeddd917a121ee1338ccd33f80fd0cac3cd7d9ff92ab080ed5f9bf350b39580fae2ef3046d03e67fb7cf0ae32872ed0515d27899409b34f842c8eac6a8c7f840fca270725b354500d1b1a904d06c5",
+          "padding" : "3041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "using PKCS#1 encryption padding",
+          "msg" : "313233343030",
+          "sig" : "d4328711d786df1aa78d2bd8f93921d208862d596d92273d861ae5296c0909a6a3bef5a5a49728896a9430e6d8ef9903fecc910c66cf0a9366fb1be322b7760ea0b02768a339d177a392de3efc44216c0a80b68212dfa2d43f95d2b3e4730c770979d67db173ff0f29e00b1abcdfa78afe2f20673f84d75c4b4ebbc0c4499d69c7fb5253bea5c06ba37d6fcbc384e69dda6ad7ae18a220b3f7dd548ff2ae547502567a6cd34456576fdcdd813b491d7f77117288d10ab91de9bc8342407b53d70dd83f4b94b00eee3ef7cd13e9147870382efee58563007b96dd910a7a83cb1246ea39a492e596190511dd313aebcb3ff5f8dd9bd0d9e29b01f75dd9a6a0c62f008f1b24769c0cfb9f56d05f2a102976985e7bf84f75ab3611ca40068ad9c4b1a3db684cd816bc605b22192ed3e0beb5ea42d4242e0ae939e6fdc3acf35755249af5bc8d44b34836463627220d388ba9a356525f77bb636106d961d5ddc069e2301e454f486d478e06becb8574860dc24b617f5709c6f3d981817703a13fcc46",
+          "padding" : "0002ff...00<asn wrapped hash>",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "using PKCS#1 encryption padding",
+          "msg" : "313233343030",
+          "sig" : "2b938542a768f5d8733e373f6b21cdde86bec1a6693d4cb150527491a3707588026527c8bd3b5ce9495068eff3b828844d80b65aa86e0376a487776f648e8bebf487bb02f8b2a6a9703223975f540e7447f14fcbc9dea14463fe42a998934fa8d4516afd7144f199b9b8cc3026217b981649ef89b19c508c6f6880585749787274a7d91e3cee34d69eb52930dd52ecb034ba6f3d482b36446fcbde1e96d45fe36ac1f17c43a2a7b7028113f063ff4cd61b82cb61f4cca8a407848333ffcef570e6e4c39ae0731445e8430f474a1bf48ef138f5188d0e16334139bc40fae60a3cb8cab659cfa992f913bf91541823e38db370d30fcccb260f1dba1e859d7097c4456beb16d5c7674b3dea4a892710b1afb98d43482376fc323abbde6e421d43bc9be112969c5924fc831c43870c2f5e2459fcaaae3038f75028e998251877284506c1a1a231b322572a93fc42c3d8fe23bf03c1ff060100bccc616d92865db402f03f5d7632857156b71322492bd5c9676d8444267d28eddf9023ae84a96eecb4",
+          "padding" : "0002ff...00<hash>",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "invalid PKCS#1 signature padding",
+          "msg" : "313233343030",
+          "sig" : "08317cd804400c88a2cf3055bdb9add4ff6c5844cf5d521e05a59dd32d30397688a1abe7212b385ba4eb82cbf091dde7bdcf16e706675b6687f2765447f2647cb9b626abb96173baaf4f9c24a0ae0a25f2d337312cb58cb7a3487489c91d12390213fb6cc32459369b410e8f87c7013bec907fa0980a31afc213842501498068d3207b48405e13c9cc2e24587aa5621b4c76898ec8219d05043aa2c347805fa2141ced11126850d62b6cf63f05c568cffa1d58c25ebf9771fe0fcac49d1c9b7c6f04d1730f8ccb25722741a64f13f7627d2ed7c89187bb704a6b461e315f36342ad6d7cb270940286af3be4083a5f1d5c1441528b21d0b02af7791a6ca5b72f962d3b7a6f8892dafb35f91425fd7b921179a1280c056f3cf283c8294bf29da404f80e62a9c0a76a0359d8dc6c01159e369ef2d2a29dbb655dfede14f6e3b4fc0d4dc9dbd52501bc6b3fe747bcf8753379791204e4138bae4daf1d6db65e0f9dfd053d90237e12a044e331a6b6bb451ed26405c8534760d00e7d46a0c47b09537",
+          "padding" : "0001ff...ee00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "PKCS#1 padding too short",
+          "msg" : "313233343030",
+          "sig" : "6e35d7e838f318735a6050fb3faea4beede2e0c3e5bd007b096f4d2bf855af1c29909ee6859e3012f3509372f8975be33ba4cf4111f25e7cf91ab9cd23df7bb27e7246f6d03449dae81f93e141044b95365777e1127ef2df2f33c0a43cf1cb28a9b3e877ecc0979983bab8d2da8be009706b5636ec753828aa51c01f48b57c9e2bdd7f23330c47a27d556638ca0d8f92b8d1d5273e7d936500ba5ac79470a669da9ae334256d34dac2d3b241baa61d8127735bd42f43bbc928ef9881996d72012f940e7b8c81ff6d37b5b0f6c3b116d53d816273f33112008ae256352401dcacc12d27f5c912456b5a72334437ee0d4a04ef5c6e77c29d190563c1c500a558b2dee8a432c9aebc53a1f07ffb597d25c832f4df2a4415fb4c142dcd2d8b03020340976f33d58cd8f27b757e6936200f297027a67beef36b50ea79a88c39b0eb5cdb3de55fd8650dd3f480104f418bf7a8e6ed2304db3168beb1d060a00069180f4d820894566bc9237b12b0d87dc5266c07928de63258e3ab532b700cd7cde84b",
+          "padding" : "000001ff...",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "CVE-2017-11185",
+          "msg" : "313233343030",
+          "sig" : "fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d5245",
+          "padding" : "n",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "invalid length",
+          "msg" : "313233343030",
+          "sig" : "fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d52450000",
+          "padding" : "2 bytes too long",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "empty signature",
+          "msg" : "313233343030",
+          "sig" : "",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "0",
+          "msg" : "313233343030",
+          "sig" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "1",
+          "msg" : "313233343030",
+          "sig" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "2",
+          "msg" : "313233343030",
+          "sig" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "n-1",
+          "msg" : "313233343030",
+          "sig" : "fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d5244",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "n+1",
+          "msg" : "313233343030",
+          "sig" : "fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d5246",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "-1",
+          "msg" : "313233343030",
+          "sig" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "3",
+      "keyAsn" : "3082018802820181008733b9c2bc754216fac899159abb71c5ca84be37153720040f33f291f5f7861bc122cafde3091b5211bc81ee03e280e3c6c2902ec49afb8432c3273536edce7116048513e9b33e2fcfe56f9597c81bc9be81a1b1d46e863ca11db2c33ac1bdebf7c552332067e2e588497e7d9e0738caa57a73dd28157e88fc202b31bbe3b9993548399a0b0df9b72dfeece75ecd78376227e9cd21c8d24ca4aa64fa50a59ee8e7621158e7bac2420fc0d77064d3959afab664ecda0decb8c979eb402795b9a562f2de310aa7fc6864469ac88867788c57ee96f6dc32dbdbe3aa7d3ff47ae4b78e1106e1bc80350b2383dae54140a4605f4130d7e5d3f7818262a27c76a51e4c6db4ab4590b4766b8c50ec1bfed53f0d716b5c7d9dc971399246c75ce27745147151f2e7629039f0b2efed99c7f17cda8f3c3df764dfb40cc0c2ad7bf2b6c72829df93329a4bad6be8635953dd10840888784eea738c763be9f5dc3ba47a9e9d800e21b4ffcc18193e591e8a5283192426e8867331c72bdda06a0eb49367bb01020103",
+      "keyDer" : "308201a0300d06092a864886f70d01010105000382018d003082018802820181008733b9c2bc754216fac899159abb71c5ca84be37153720040f33f291f5f7861bc122cafde3091b5211bc81ee03e280e3c6c2902ec49afb8432c3273536edce7116048513e9b33e2fcfe56f9597c81bc9be81a1b1d46e863ca11db2c33ac1bdebf7c552332067e2e588497e7d9e0738caa57a73dd28157e88fc202b31bbe3b9993548399a0b0df9b72dfeece75ecd78376227e9cd21c8d24ca4aa64fa50a59ee8e7621158e7bac2420fc0d77064d3959afab664ecda0decb8c979eb402795b9a562f2de310aa7fc6864469ac88867788c57ee96f6dc32dbdbe3aa7d3ff47ae4b78e1106e1bc80350b2383dae54140a4605f4130d7e5d3f7818262a27c76a51e4c6db4ab4590b4766b8c50ec1bfed53f0d716b5c7d9dc971399246c75ce27745147151f2e7629039f0b2efed99c7f17cda8f3c3df764dfb40cc0c2ad7bf2b6c72829df93329a4bad6be8635953dd10840888784eea738c763be9f5dc3ba47a9e9d800e21b4ffcc18193e591e8a5283192426e8867331c72bdda06a0eb49367bb01020103",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBoDANBgkqhkiG9w0BAQEFAAOCAY0AMIIBiAKCAYEAhzO5wrx1Qhb6yJkVmrtx\nxcqEvjcVNyAEDzPykfX3hhvBIsr94wkbUhG8ge4D4oDjxsKQLsSa+4Qywyc1Nu3O\ncRYEhRPpsz4vz+VvlZfIG8m+gaGx1G6GPKEdssM6wb3r98VSMyBn4uWISX59ngc4\nyqV6c90oFX6I/CArMbvjuZk1SDmaCw35ty3+7OdezXg3YifpzSHI0kykqmT6UKWe\n6OdiEVjnusJCD8DXcGTTlZr6tmTs2g3suMl560AnlbmlYvLeMQqn/GhkRprIiGd4\njFfulvbcMtvb46p9P/R65LeOEQbhvIA1CyOD2uVBQKRgX0Ew1+XT94GCYqJ8dqUe\nTG20q0WQtHZrjFDsG/7VPw1xa1x9nclxOZJGx1zid0UUcVHy52KQOfCy7+2Zx/F8\n2o88Pfdk37QMwMKte/K2xygp35Mymkuta+hjWVPdEIQIiHhO6nOMdjvp9dw7pHqe\nnYAOIbT/zBgZPlkeilKDGSQm6IZzMccr3aBqDrSTZ7sBAgED\n-----END PUBLIC KEY-----",
+      "keysize" : 3072,
+      "n" : "08733b9c2bc754216fac899159abb71c5ca84be37153720040f33f291f5f7861bc122cafde3091b5211bc81ee03e280e3c6c2902ec49afb8432c3273536edce7116048513e9b33e2fcfe56f9597c81bc9be81a1b1d46e863ca11db2c33ac1bdebf7c552332067e2e588497e7d9e0738caa57a73dd28157e88fc202b31bbe3b9993548399a0b0df9b72dfeece75ecd78376227e9cd21c8d24ca4aa64fa50a59ee8e7621158e7bac2420fc0d77064d3959afab664ecda0decb8c979eb402795b9a562f2de310aa7fc6864469ac88867788c57ee96f6dc32dbdbe3aa7d3ff47ae4b78e1106e1bc80350b2383dae54140a4605f4130d7e5d3f7818262a27c76a51e4c6db4ab4590b4766b8c50ec1bfed53f0d716b5c7d9dc971399246c75ce27745147151f2e7629039f0b2efed99c7f17cda8f3c3df764dfb40cc0c2ad7bf2b6c72829df93329a4bad6be8635953dd10840888784eea738c763be9f5dc3ba47a9e9d800e21b4ffcc18193e591e8a5283192426e8867331c72bdda06a0eb49367bb01",
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 231,
+          "comment" : "short signature",
+          "msg" : "36313237",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bdd0c9e451b5b3e5513a94492dbee1ada9ea87e65a8cd95cceb4d304294ce34bf09a212f14908f5b865c7a34a72e68e389794a2d1c5767ba17829e2044108ac7842b6bfe0a5663b433d656f4e38522c5a5a23c460b898833828d257350e5814291b54cf13089080f84998edcacf0fe5fca0c1f8b176b172c5f9989491a039bef",
+          "padding" : "3051300d060960864801650304020305000440925eb0238e4d842826b081a74083e55a2d89e67c524d5a903366c1e26afd1e478cb4779e6f69eb70e7034556745f6bddf9547987d8785a7deaa8765aaffbf2c5",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallPublicKey"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/rsa_signature_4096_sha384_test.json b/third_party/wycheproof/testvectors/rsa_signature_4096_sha384_test.json
new file mode 100644
index 0000000..5673d11
--- /dev/null
+++ b/third_party/wycheproof/testvectors/rsa_signature_4096_sha384_test.json
@@ -0,0 +1,2095 @@
+{
+  "algorithm" : "RSASig",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "MissingNull" : "Some legacy implementation of RSA PKCS#1 signatures did omit the parameter field instead of using an ASN NULL. Some libraries still accept these legacy signatures. This test vector contains such a legacy signature"
+  },
+  "numberOfTests" : 230,
+  "header" : [],
+  "testGroups" : [
+    {
+      "e" : "10001",
+      "keyAsn" : "3082020a0282020100e3ae7de5bf44de7d357e238c8dff063ca713470777ab786b495884e7a9ba1dde65de7d2b5be3f2b7d1830cf6ca8ed5c05d3f094aaaeb1dd2e4b2ede08613109a9ba34c7e2bf8450225974374459f16da2c14192c637985febebbef01f0381e78d0fd63b76038f5e3d35dc7d2243963366af5d7685f1bcfc99dcb91e94c93019068353122edd03cc3e615e17c1bf1dd7c43dae86f47a40238fb594041cebdba25f3fe9593a6c329b7f7c476eab7625d17ba7be7886936b733f8dce6e6c937f588da1315c1117abd29c83895d95988d17f9fd7623960d8e433d7c6841507ff2faac36e0e19a41eb2cccdb2a2c0fae966719a99d203c924349bc0eea1374efd3e23099b2d187922016fd014087520a67363687322b90d7a890d8f4464a8c794d2a3f2070ccd3b0ebbca2b42bbf8eba6f2c0bf8008b5616ee7b81629ebff97a93a5b861989daa10da7c8e3bc7b0cdb095f6ce1185cf8fd3dca035eb3e505cbe022d81d93945a144806b9fe0ba07f3ab9c70e72b5fb77ac6e4c7e03aa2dce7c5ef227aba1acd48c1d93e0e26f01e8f1e43aa97880d15d6c924b060d1face21d03a796c86301f4a74339e472b2f96cd0755741cb9df3535077381ada84d1bc0846a6c44c8a8d3cfe1b7a9913d1f3d7af2c5ea4e67ce0a7ed3c0058206fd13ad9ccad5a8212f3ecd788368a6b6148178c7c5ea8d6d385227f2c76a047216e5e206b1ed10203010001",
+      "keyDer" : "30820222300d06092a864886f70d01010105000382020f003082020a0282020100e3ae7de5bf44de7d357e238c8dff063ca713470777ab786b495884e7a9ba1dde65de7d2b5be3f2b7d1830cf6ca8ed5c05d3f094aaaeb1dd2e4b2ede08613109a9ba34c7e2bf8450225974374459f16da2c14192c637985febebbef01f0381e78d0fd63b76038f5e3d35dc7d2243963366af5d7685f1bcfc99dcb91e94c93019068353122edd03cc3e615e17c1bf1dd7c43dae86f47a40238fb594041cebdba25f3fe9593a6c329b7f7c476eab7625d17ba7be7886936b733f8dce6e6c937f588da1315c1117abd29c83895d95988d17f9fd7623960d8e433d7c6841507ff2faac36e0e19a41eb2cccdb2a2c0fae966719a99d203c924349bc0eea1374efd3e23099b2d187922016fd014087520a67363687322b90d7a890d8f4464a8c794d2a3f2070ccd3b0ebbca2b42bbf8eba6f2c0bf8008b5616ee7b81629ebff97a93a5b861989daa10da7c8e3bc7b0cdb095f6ce1185cf8fd3dca035eb3e505cbe022d81d93945a144806b9fe0ba07f3ab9c70e72b5fb77ac6e4c7e03aa2dce7c5ef227aba1acd48c1d93e0e26f01e8f1e43aa97880d15d6c924b060d1face21d03a796c86301f4a74339e472b2f96cd0755741cb9df3535077381ada84d1bc0846a6c44c8a8d3cfe1b7a9913d1f3d7af2c5ea4e67ce0a7ed3c0058206fd13ad9ccad5a8212f3ecd788368a6b6148178c7c5ea8d6d385227f2c76a047216e5e206b1ed10203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA46595b9E3n01fiOMjf8G\nPKcTRwd3q3hrSViE56m6Hd5l3n0rW+Pyt9GDDPbKjtXAXT8JSqrrHdLksu3ghhMQ\nmpujTH4r+EUCJZdDdEWfFtosFBksY3mF/r677wHwOB540P1jt2A49ePTXcfSJDlj\nNmr112hfG8/JncuR6UyTAZBoNTEi7dA8w+YV4Xwb8d18Q9rob0ekAjj7WUBBzr26\nJfP+lZOmwym398R26rdiXRe6e+eIaTa3M/jc5ubJN/WI2hMVwRF6vSnIOJXZWYjR\nf5/XYjlg2OQz18aEFQf/L6rDbg4ZpB6yzM2yosD66WZxmpnSA8kkNJvA7qE3Tv0+\nIwmbLRh5IgFv0BQIdSCmc2NocyK5DXqJDY9EZKjHlNKj8gcMzTsOu8orQrv466by\nwL+ACLVhbue4Finr/5epOluGGYnaoQ2nyOO8ewzbCV9s4Rhc+P09ygNes+UFy+Ai\n2B2TlFoUSAa5/gugfzq5xw5ytft3rG5MfgOqLc58XvInq6Gs1Iwdk+DibwHo8eQ6\nqXiA0V1skksGDR+s4h0Dp5bIYwH0p0M55HKy+WzQdVdBy53zU1B3OBrahNG8CEam\nxEyKjTz+G3qZE9Hz168sXqTmfOCn7TwAWCBv0TrZzK1aghLz7NeINoprYUgXjHxe\nqNbThSJ/LHagRyFuXiBrHtECAwEAAQ==\n-----END PUBLIC KEY-----",
+      "keysize" : 4096,
+      "n" : "0e3ae7de5bf44de7d357e238c8dff063ca713470777ab786b495884e7a9ba1dde65de7d2b5be3f2b7d1830cf6ca8ed5c05d3f094aaaeb1dd2e4b2ede08613109a9ba34c7e2bf8450225974374459f16da2c14192c637985febebbef01f0381e78d0fd63b76038f5e3d35dc7d2243963366af5d7685f1bcfc99dcb91e94c93019068353122edd03cc3e615e17c1bf1dd7c43dae86f47a40238fb594041cebdba25f3fe9593a6c329b7f7c476eab7625d17ba7be7886936b733f8dce6e6c937f588da1315c1117abd29c83895d95988d17f9fd7623960d8e433d7c6841507ff2faac36e0e19a41eb2cccdb2a2c0fae966719a99d203c924349bc0eea1374efd3e23099b2d187922016fd014087520a67363687322b90d7a890d8f4464a8c794d2a3f2070ccd3b0ebbca2b42bbf8eba6f2c0bf8008b5616ee7b81629ebff97a93a5b861989daa10da7c8e3bc7b0cdb095f6ce1185cf8fd3dca035eb3e505cbe022d81d93945a144806b9fe0ba07f3ab9c70e72b5fb77ac6e4c7e03aa2dce7c5ef227aba1acd48c1d93e0e26f01e8f1e43aa97880d15d6c924b060d1face21d03a796c86301f4a74339e472b2f96cd0755741cb9df3535077381ada84d1bc0846a6c44c8a8d3cfe1b7a9913d1f3d7af2c5ea4e67ce0a7ed3c0058206fd13ad9ccad5a8212f3ecd788368a6b6148178c7c5ea8d6d385227f2c76a047216e5e206b1ed1",
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "a454390b04bfdd69c4be2ad1bad96ec901639f0bb60df268415b4a93b4cd53510fe64f394b319e66ca8605d7d5f7a05dae5eff827060013503d857a977c09ef742525e43b7e69d3802a58206e696848a87ee17b2b9de6829044349036554c659c8f8866c401fe85869c0a5ea90739c4983a1561a84e4f0bceb00015a671f5283f41f0bb8599774829b6a2de24f14d83351c96e35ae1475c8b4bcd2cf66889237a206d147b0e949f2b2028ead379c74203017904ac09a5561a8ec343be22cf46c3bc2a87b12cf9cf6e8fb22de884bdd9677626b757a005d3745f387d296347d3852ddc2c4258cf572dc40df3ff6a8a5f9d8b1b410c54739b9ae182611ec01805c80b445d058ce2afc4bd58d87c03fc9500fba237bcbedb0960a1a02efef52b97cddac63b5eb0481c0c0991375735338ac84c0505415ad2bf8e7a819ad269460668ba8f8c879f521ec9dc709e406de023fc0f9129a3a94eb1f3af08d33eed6273e5166f31110097f5558d8d9028ff558e627c9c0db2454b134a82a9dacca5b4032bc0e27c4d41cf55e9d89cf51528bb4f08c6ee5ce651af3772f008a44863c851933a57cac8e29a84756c9fa7f80435b3b78486f9908512902d5461964918239c76b6790b780e09d2f1d3db1c59b275d20bb24fa4f518b25af3254b61d34ed8b444d3ca736ceffdddaf767bdc92b4543f68b25421cb8c1328f2f253e446be46d10",
+          "padding" : "3041300d06096086480165030402020500043038b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "909c1f13b544933ccf3bc73ff5053a8a65a8f01b447d4b40f109cbde29d866368aaebf46c19051092063993862b32fd166006bdd4d988794d4e9a77821fc9e684fab1366a2d988eaca60e4fa8ea947dbc4b8438a9fc036691107d3d0be52c46c61342ef8fb7e08032921c1b455c55de28d58c77c1eaea03f13c26c4cea73d14acfa8ac2907f6a775273e7686ecf4b882b88a42cba11cd1efa5b985cf5a227654e54cdc9e2d283b80d250cce553fda636279336ba13f7f3659d70b5b2995a2ac7b60f329c62790d8eed1c3dacccd0df468a91e767c190be41a028d4efc1c5ed5e6f3a77930f50217fde9ce9ccb66b75731957959834839fa3bdc1a769fabebab03d3f0e605a12aa9fccb2a9421591a7427d82068623582de592935904b59a42e59b50419cd12d71da871862149a6500ec6870d989423346879551e506fada7c0c01b328244ac5f2e2c5bcbf4b5b09a4512a0edc90fee4d4dd9eb88582bfe37b49b8d8189051b32cccbc4d300284f9e523674a601b1a725722695d5ef438b770b575b6d0955edc761250bcc6a30e8d5c7287093236f223c2da8d9ab7d6b58e5d0e9167f2e8c58255ed16b63789ea16046bd0f987b156e9898076d444cc7a4aadc76699a2e3a442d63ca4c3f92da9f3b2c4ae13edf9d4e28ad206ed0cbd2df2a46920e298abd1904877b75c1a9ff80c5bf05bc5d1ab94d379d064fad894918ce326",
+          "padding" : "3041300d060960864801650304020205000430a5a2cb4f3870291de150e09ee864f3b2b3b342937ac719a149439185ad6a47bb4f23ae83ff20f0c8f0c79a1764244a63",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "65956121a818b842d861d0dbcbdef22aa05c7e94ce5d748308663e142881feadb85dc4421d9d01833b8b4c2713842c77949cee8b853286107c655de7778a5acca11afbf1d9dad429eb6a281c1e8ae1cfd37cdf530fd4f2b765c352bcea26ce44e2165c36553318d89b1e06ffd8a210cb988cbfc916a9401fbdaa56a1a2a4cb66ef00a3176182d33dec5f3625b760c37c82cf618cd2875079a36015af21d060dffeb5c9e1f4255d7fea64386d8d860c6868cd79ef6d7a87927753a78bdb63c4845306de1d73c5d7dccbb6cca9b65aef19a7b9e53d9c02a4a2bd6910e076959f9f40c30eaa0a6ef783c0b73f05566e4492e16b832729e03fc939e54bf0336d376a3b4cda534bee446dad3fe51d20bb8a135103e7e12220484bbe02e99c5803282ab90d11063e5243297f80d3f24ab08fe8f2fb62702b0543f0203972d35287ba64facbc635cb438a888c83c7028a325555f07521c3095bc4e38bd0f60eb90828319777fea2276e0bc76f2c13ebf92f802a08844209ccddd2aac1f2700e8a5107e86426e6ab76288fa01de18b8a63551fbe8705824d16e5190c559c7bbe8a17031e7d352a681b0418cb36423632ec48a8d3861136b250ad2fc72388e771b41849893cdbffe04aac4037209944ff3174f86f7a88414b1666727c960b1e54a2cdb82e39cf9f2661f4ad6e22f330b350eae7f588a623524617b1846486fe9f04abbf5e",
+          "padding" : "3041300d0609608648016503040202050004307b8f4654076b80eb963911f19cfad1aaf4285ed48e826f6cde1b01a79aa73fadb5446e667fc4f90417782c91270540f3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "3b35a042a4791dc1ac1561ad1038750bb9a575a7ff72db2ee60ba027f8994bcbabe41fed36417bd139a286ed0aa6c3ef2868a7251442d060c1cc67d4470c3ab7c307acb0c0641218a45b9cdde05546653850c2168a59f1788cd55dacd40afe38eb941ff08ffa8bbe609f2aa795c73c0368f482d53d691980891ba43b69f5791c2e6f70e17a996a299e60ce1c9d44ebb9f29e700e9ae216df749149f6c222d1e1733953553a792745c382d44f52ff404ed5ee04c41ac8acc97c250f9a5e3cc6d70902d51e8ac000d05e36279d83491dfe6a40f222bc1dfcfa7fa5e0197cf47528f77719e007b65ca39dae17bd0f323b00ee63b66401e2ec5f8917ef600a41c3a61571a4d922c0b0ad0a290ee054ad15e63f1a0cafb749f80cae6cbeb06be62e1608b502182d247bc6a37abe5fd750ead8b7216a35e74b969005309b14be36a31c5e6c2266701d5afdb5ca2314e2f32ae17387d8284ad2c7225fa63ed47e7245a65b74f53a5bd22654b3878ed09b1e5e070bc20eefac6c95b006b8f3e613b19f518c48ee6781a12bd08ad36ba384d03d3ea3c4e0b1facc39741f9ec73d0335d2ee735355955ed12cf8b999d155d389b1a3caebdfbba32c883ef7d0e112d86e6149a3328b63b9385c68fe8a7b679e8436aef7466067a8e8bb49e31675729b3f448e7dd3c048973d2a5f8f7173c4428f3982a99361fa691d1588e39cd4485c450158",
+          "padding" : "3041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "09d8512c4667994623530a2317bbda738eb8917bc80c84b64793351463da171bccc88b95049a57ccd917a4687da3be63db21b0ad0972ed9ed182f4ecc8e06647675340192a57e6591eacbf15d2f5fbdcab568b16ed86e668144d9e676e55ec4df1dce61f672de9f53d1743b72993a5d21ffeb7ab58e0f83e297cccbf25ed68c70dd8441c119afb6c07fb1d83edd9bc1ac34046733c8b827d002c3b6072d74a6c2cf7f1d968e9f7b0873de8ee5adf902dc68fbc93171f763c425964ea6e3af6691f1a303ff7837adb07a09f728de3377fff74adb34c959d363db650fa5c3035febfe8c62a0cde3d006a9d34d51c5b2c4a1dd4f2423c532c6b5fddf03e0a05fdf8d857f98787d6f55f0ce1d0ca95a37177657035ee48bd4f39f7d520ccc48ee999777868b4c3876e2242f59b725798bca28ae66c267c507cd65fde612c1fdc9362994ee31134d5561ad7c3f523858f43611c249cca3c134d00ed966a82b800da11add213731b58caf232fb2094e9dd42ceaffc7002f1592e79b85eb6e39ed5de8484f5509e0f54166426095e8522f88363fd0dd7bf64414011a710c7834958c0aa308189819cd4488588b84729dafe163e79856b913ef55afed55e83ee5b812579b87cdb80d5bc9ffa02ec32a0d97b0a56bfaead58a438cee53d40dd197fa2eeef4aff98eb5590163e68b5f3de443909769080c8a6bf87e3808bf265a41a3b79f8",
+          "padding" : "3041300d060960864801650304020205000430b526d8394134b853bd071719bc99d42b669bc9252baa82dcafabc1f322a3841c57cc0c82f080fd331b1666112b27a329",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "798f597e9ad4ba8b3d00a9527f4e785af5c55994e2953046a1b9062945e8dfa35eedb1e31af3daf1955d7b0afe74fbc53739b1aa02fa2dba629c31b211cd513e2248ed847dd579406ab603d3369de3bb07143a581734fd8b1ca0358c4fda639045be1f192b233efb8848bb2c544e4e188e0c7ce311bb4841077d15051c6f6b31998ddd8a7bd30d75b7b3c824358bccb35f8ffa8c0fc5ac37ed71cdd48ed3c0269a638317756bdc9287043be1b4f3c6ef6423f1d0d38857c195e7be81c3778648ab889474109ff3c7be0fec790d3f5f50b966e3df40c566f572f8f252d09e97d4c90442badf820c7db74d6fbb004bd7eb53c0b1a871bb9f480821bbb48b363c85c9866bf8a86de9c6732a3136f2c80e88a29540a9036b72fb8f4c898e7b487c41d0f693c91309bb3bc06f1e3b2fa9918c31ba2a4b82a37a927784a7c7d2aadc3301524ce2708774c3e2189ca188b3d85a33348d28ed6f080a06452bf8316d483e6a5e28b831797f85a8ca5ca922bcd94b9045f588ea9e15f2a20dd26817eeb80b3421c5de72db98843dc719cfb1aff1f927ee1df1bb718732159bec70d5b6d0f98a3fd5d42c31ecf4124cb1759f183838d676eca2cadb4d57f2d6a52cd0115ffec0fd79c99aa78df8c6b54797a590bfefd4c34e4c3f39750ba47f4d8002a131b870ff8e65c6c37b75e5c54c8a2bc2fdacedb41f30ed8bc9029819b7064b6514a1",
+          "padding" : "3041300d06096086480165030402020500043054a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "41fa907da9f78e107b58ff6c4ac0e92a9bbc7f5b510260572fce4ef047c73cab3fb0d00b353b4cb9256dddad432c5815652bd83c78e657075781140de56189ecfbe1601f24bdce05c63f511a3d04673d24c4e943695d7812aad66f374a74a906177dc729090070cb5d6d518e7045f4cdece06ce2ae42e1177c46856a8425e60bb06040400c8ba0efb8d4f395a4377d4c2c128c68e6b30e358a73d9904d7aa1e517ef396526cb64d39b3b36ed7204b3bab1d91b23ca95b2ca1da3eee91c7d27b4e4e658fbf5060a79cce69be1d95252b0d7d7220797a53982dc371372969d4e06556507e7e7870a9efd9e03766702f217be1c8f7f80006c08d13e175040cf28b215deac6a1ebf3520a3ad9e91f9072dfe50c69d1aa5a0df73ad63f72831b055f2367ea35cfe676a4f7970bc85e2b58917d1bd449ed3d274ac40f7a515e261df3d067a277ae610e4ee4cf68b3a947ae8c8339c818ed10e73b6480577b2a13722023cbb09d3b378cfb71f6c86bd481ee09a1fcbb807338e968aa5af993697eab562aa4975562eea6b1169e86c75ef13e877cfcd4608994eadedea3eba55af19a7a55b19e92b974450a593cde717bf0d7ddbf0bbe8fef90816fecf86ec522a2d06a04ebbc50a1eafd67aa461a8a9cd705ece0bbb46cf773689cc19cd69607594fd2ebde06aaa1e34ebec001edf318fa22245876461fc46126172db41ae9ecd74700e",
+          "padding" : "3041300d060960864801650304020205000430ae9ada2a808aca7097c9e9c30fba4ca60a5e79874a6be0f5afeb7f5df3538346f04b84ee06bef7ac879a0085bb2036c8",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "Legacy:missing NULL",
+          "msg" : "313233343030",
+          "sig" : "174f3644f5380c9d804287d8b58435cf141283eebfeb4e376493b401b812b525dca70833fdf626b043e70a71a9a54974be4b77b8fac0c8cd8b5141eb4c8a906cb16584b385124f2d339035906572e446d230cb60a0604e53454d8d0cfc588c0491190e2c26f46234bce081aab2c2cf15cd1d764baf46fd8b154e75e8be85d54c0b9062ee266e2ec781f7dbbe8764eccd13da5c107b46829590f6f28f595ef4de3744050fa2f721c3fbe1afe8250069d815c63273cfceb77505fec5844c21ad8e60a73149e5d7c3018895967abe471d7cc0800030c70760bd0d3d48d61e7eb12a0a27a91677216d0095a2a95a37f3c86942c1981dde4f7897a4190a270e962e2ba427b4e630e3187ab42cbb3f9aacc9c0f2eac9a8c44f6d73f96eab34b74dbba066c9dd56d32ba7df087dba9e479582bf73d5941cc107cad55c6596d4e25e39a7ee3704228ef978307605f2872eae23d8f2fc5d8c088b482e15adeda22a7cab9d00578d143d53af27b04416a1c3841aa88de6dc4f16b8dd320897d1498e4effb58a6d87b8ddcdcfaeee75ecb9ef64e3db62c232965f556ee3f74d73d2b19993e9a9b8d6ba56cc87fbbe3b7fb7ddcb35184ee2b881d55e55a7803ab2dcddcd3572cb8921bedf958185ee7046b12ef4e6190a314012006f8003aca93f430d121df1ada316ffe0b1ef85706e36ad2164cd1e40389b2f36cf10735e68e15022097884",
+          "padding" : "303f300b06096086480165030402020430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingNull"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "34e01ccf88b7b25ed56f5fafc89ddcb9b6fade81ed2446b0c133f6949e73a1d68134973f59a551582bb3c28651b34fff77f97e91d947a96f269baef355697e15f4999d3b8b173c66c86eaa546b44f1aa42251df45584a938b40c6f1b5e1f8c58ff74f96257a044b10a70bc5075f9769c3c949dcde889e3b9c6d32d4eee6e312dfa2c74318954770556677d1937265e896bf044b3c0a03ac6ef1d82888a5a010787dc4a65a855368532b092a5f6c985dd720966fcd407d465b33426cd6e56ac30feff073bd4c55115bdbaef71c14f180fb559fa4860d7bc94b52aac8d121d0c0ae4c2a64ee32d1a1086efdb4264f4f93f4e8db096724f52d608bc686eb55f3e2820abc4384af6e4e4a8f9eca4cb3e52c43a67e673f2610ded69df520fec76d3aa50b9a6556fcec204cb959a0ebfa6dfb868068f583338e57cdcc2d2603acedc48c59500453522bfa8165c8e2c63e4ac97b3d4d70075c857beffb5db8df58247ec4842fda08a093df5ddae1cad03e374a350a87961408bf4fa99e5511ba42a9059a0ed73c1c9618ae0a300399347ee194003fb81f6e905f0286e1467fc0eef2c5691c0d05a480e52ec578f77d2616503061530de1346d1a424facd2cbb9a7c8da38d870e5f4b8cd406d41421c959101c6eeee60e092b2a5dc717f2caf292c8622d903856a266e31c7c342bbf09f8bc37f67f576a3e8b963b88ebda9aa31d093fd9",
+          "padding" : "308141300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "5da09302fd2e6eb0695f2d027893f42d71476bd0ad8e1783f3015fda3d1b5d4fac1b56fbf133144bf82f874160a3a248e2c6a4da691a7db2110e4bd095d536e72fbde3b47ce0bdcca2fc9050aaaf2395686f98b8da83a7ad152b2f517125843b8306828a0d5ef8d4b3abb874373644e81755e7a929a33e98069c4d4d0a732b65c5b836c2b7ffc6a914ce02c2ac0d4bd5e67f7a395da04d8f24031d1bdad73eed9d08982216aac5a067d90311bffc2b109f9dc3ab4ee2c051e23880a675fab15a3ceebf15f114d79523ea5780d62a0785caddd3d345697b8a1a785b1488eaecbb863f8ba22a307bc835f3c832ce37de47a416136b8c2e559b38fe8d2b94c4cd376fbe209130206b53271f69789bd0f2596b85d9ccb000a15e3f2e7c50e8820dabdb36b1dfac83cf0a307ee46eca142eb747dd72972f0e824e9107f318036e83274ade55d53fb47069cc49cc51460f982cb712074082559bef436c501c968e1b73fae4adae5f2d7111a1741d1299869b5f5d6c831c69c4ab323c4e04227e435cf3cbfba1a3a9e6e6a64368027d5c385acbab0012f385ffa331db5decd358d44afe4d7d047ca4ec9b8f888930c1c6ca1a01106c8f7482ed80cecf0e244ee76e28527d8464f41395e949eda74e233282f50b6fcceddd3478be8b7825ac05f0f1f09617f31f79eacf10d90be50711b8d2c0a4e1f2062a3d6d4ab9ed05c0f6678f94e7",
+          "padding" : "304230810d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "d7084e9d50f340dd41618f6236c0dd09f86ee1858c77e29fcf82cf88431111edd025d3ccfb90039f5b6315e1eaf2adad3f591f3cd4a0ee492061a73da45668485dffbec020947e3f4a07f82b3a5b4797623867ff4d928bd58c19096f604656f60d8e3eca9e218fab21d3470453634838bb52444ae1e2bbbc553b112ec3a3c0785bb3051183fa28ff255584d75b445102521c9376ed9114e84f7a22de4021c334e7da873aef6db293903a8d03cdeec3150bc1890d493b418ed23ee4df2631347247d418f201c04ffadbabfea441684621e78425b9f5e6dfe89977e7d5da88720595850b5e4586337c22c1a4eaf35d5a40b47791925d8ddb9471de7c8756b5bfbe1a440685d3c99fc91f73a334aa2d2b7071f5b5cffa643a40b9a8544b725a1e9f2c2bc62a4ed42dd4db24cdf80f1cfb8e9e5b5b86d200b5b950de96dbae50266f5ee7ec6e4e2cb2a635f4930e0b38d1028f878bfea22b56acc9526af21296a08849bc1c3a9b9f90686d4a0426dd8904fb44e3401fcd6fa3a625a8523184d2e03fd6d341e3bc365bb549c5307dd928cf1e409e7d60a1f3bfec1a95501d32eb79b38cb50cd5202f12de07d466531d85e0c668a70cee060cc3c46983cb488b8f79ca5311c91f2b90c8446fcd2a58d5617709b79ebcfd5234c7103489c4d2fc3d7b3387904e03bfa9f8c5ccb9d5b3f78eb05943273dc8a940ec0f74c5910dc93da81c",
+          "padding" : "3042300e06810960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "47e7664b1dfd6e4711f4de90fd311c1db87659ea992382d5e18aa9fe5a2429eec9cb7abc063e3fe3371e175ec9a51fe4a629d851355c38072743c37352674f6a113dbd79286994c5c6ad37f621283443e30cae094f834585e7ab2580f6d4d8a09310eb56be9105e0f44ce7ea9cf0da7766c2b9bedbf732113a4db1bc0bc7f2569cb71093eb50c0cb88668a78c040860cb54e19a3ceafd7dca8860c4920db6376dc37149e5b18d434853d36eb5977e4012c744faa739832d5f11e33151da54403746678456e3e70a7ac2b3802c719b0892207f2babaca7a3c763fe3399fe109846273e010bb69d15e09d7d9193b2ef00ff0dfb65c983a2c88becf232fc5bd246f441e9dc61a23d0e4c25cfbb527ebd64ec503ac7b4d501cd397e372bdb104aa2004b255a4e11424aac978c32c9e2b61978b1b2818caf2795542ae1a7808f47ff8af16e458f0771bdea370d31b1cfae0f0d73e14d99dd3872c4d9bedb3caf630ddc6ff49d98df360c9c6c4a61e0c94d5af3e5239ac443aa8ef1caecb1d22b148874669c263c325e6b7008a404e5374a9dc10214d412d5d00da814a6f9af0c83c40794e3fea7331f3d3e5736b176c8d6ee13a28efe25239addd4ce4d4ccbf9d79ede0f2cd53f575a4c47a46c14924178f2d4afc2d93d0722d85cb7d3e609d4cf270950e5300c1a75dd2fc10be6421a0c016db3d2d6863f644fb68a5ddf1354c6075",
+          "padding" : "3042300e06096086480165030402020581000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "913842cc62a41a3e105873bac488ab6e5e5971f24f38fb6d99fecb1b99d47519704bce498791e29ebabdefa89b02a516e92afbdea73d39c801a05ebc7b9988b732103d09064fb8137d96383b1c261b52614c8e531684ea0f1a29c043419ab9eb8610e2b5cda1ab9515b5ee19bae627bf622c8c802d6e97565e50a7fd6715ef3e921bdb3e0c82ba1e369541ac3037c056f911d5d434b3ff1185d33e2095a3627134bd6e0bf7e10d2a7a46712c9de87120daeb6b13eaec78d4c577a5f7d33f5a17e5fbe48ca4de7990df00e403cf2871050fe49d49e7b3121f48482d35600f5cf9a836554ee0f80abae1d6379b16833a64b8c354f80be5794fb6d6bac6e1b567917fb903237c79900146bd6120dc49cd1cd48cae7b84de5588d0c4a76fc4cb5b0f6bb3b1a13e7e6bc395d8f6f0723470d300d4529eac1ad6e1b2ed62d6903bd6f92475d585508d242c2b720fa694b09a7b66ec83317596ee62122324b0169cba1564d6c12345ff106472af605f732fb635646c9b608d6e8dce4951b8e72e56ef25eda9b8e81a4a6b40294fd8754340d9ca752274ad72ae3e4cbb5dcc85bdff3903016fdfdf1823134e1c10398d1ede0fa0dff7ab631db5a1bcd943bf6a2a73a03f97a4f504e5e8832df7f58c9ba99c54e843a4420b977a6602d555fdb4ed29e5237347be3707621a43cf809e3ec3b6b1c0e0c8ce7768ef96c7f4735c0632956e83",
+          "padding" : "3042300d06096086480165030402020500048130f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "10877ae7a63a66b8249e34557c24145c4a5bbce1b2d7191ed8a6b194b5a14c6f0c75e157772c90553632c4a58636aec356e50bb15035b7409084ba68e91d09cfa3d090e1b4e17c08c56a3d20fbebd483df984b5f800c7724c52c19339db62ff9b13b2cb38b1187c5927ffe5728b8c7a66d3f209db3e2a490b115e6e854bb8b5fb6e390aedb5ac7fc93921399824120a24c6dfe8b084845e4921c5bdc04f0d3f9dcd7896632252b69727996b325e99a07fddaf055328685035b629c001078c8182e4bc79155405aac2324790497ca082e0d9e6b2707a011a9530fed0fb0e2568a05ab26e3cd1e613d6cf4f10ee619f97bebff59df634427584e26fa81cf8efe07c40eb910a7cbe463eb568cbc0cb1992146fbd7280064a8189d22ee23283f661b9e980d2403e70753c1bca7505ec92c1d688200fe001d597874968d14a8f3d8edbe436a6f7328218b69957b1526d22eea70992ed14526a0415e12534af443a1d8100578be888bad5e2fa18638d77dc5eb177fbb12045d6bb2fc70bd4ac3d9f3a202503611ef6b55b005f6a39cf45e3a896c5a726f8eec1ad5b68624347be0b4561df68afcbbd665935b4b5219d75af0252849ae4bdc9ae89636f7d0bd9533b0a18f94fa2ec5b4c4fcb63a0880619a887b710cb92b3376a407fbc6fbc43d5794dd243c7d235a14e8cc3e4f786c3bd57f391393d05c283bd9c62104fe04cef29c75",
+          "padding" : "30820041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "bd9586f52f2e14b0694a447fc111086141f8864f0d2464ed83adeeb0b702cc0dc501b899f0c1ba5acb0c0163191dc8f46e26631fa236289902949c087ef4968585a9daddac00fdf4430561fd81605f7f3568222da3c4cdddb9047dd529527a5d370c343dd2058d3dd3885157e4594d7af160e2443297a3c87c4214ae3ae2fb3c13a8ff39e1e804fbb39f3097b097a7d2dd568d885a5abdc3d1bb012349758e96b608050285ad3c80132390ae5fc9eddac40ca98d6db6463b8f10f79e4c4a98d2aa91b7d8d6b9c2536d8131a3d447a9622467e7170c66c72495df3f8cec11951db3cc6407ce75ef398581677753773bceb6aece44f40292d8de15e020523644acf0afc79e1381875b6a67168bf566665c4a4aab1a8c6a2a384437f4cd2b242acc8d8385cb39764dab2c73e2476200c2136e4904f8ba0479e5a6ece38ac8b4e99b6be4a2f12310b265a8470628f9d198d897cace6efd9cc2b8bd299696654ae205e1470521ec7ec74d2cfffd058a1bd1f84d72a5e13d2bf44aa8306d78319569635d492c639397d886222d5de46f82dcc5bd9736d401ba2920577bc71e7cee77b9395732317b849d22ea98bd5c6ee461d8275df4fa8a9acaadc3db528d7c53e8b7e797e6647ddf9e2259af83b4c56d63bca901e1f0ce5414b5609fc1edcd2a6a7121b41a2f3082a7ba6fcc630fbc7fff4bc2535920d6e8345e0aa8d6240a5f04f1",
+          "padding" : "30433082000d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "c08f38df11975c781af71a9a75b80f89ca790240533b40de0363b19584977b411adbb2a69921f53d0aafe040ce96d6356b879e0e4f24eb0dc04eb8b3a19ef578033514c63ce08a01e5b3cade4d25ae36e7c105450c7c1e2f2b4077b492a3b23961c9c40616617eb081b8a5616a741c30ddef99e6fcd0934c4af56b99cb48d4419dcb5c0d0db5cabb1a3dd11eb8ebed9a6303efe4b9ba9d00014b72a03b0589cbf604a9a13f224d6540a2881c180370ab9e2c90c93e5c9bb5e58a0926b6ab75cc18c12431c4a173e8c3388170a8cb7100193a8c644ff27495d98fca0a5f0d49cafe618c769cd5831707c8baeadaf32df0713063820173803c58dba9ce292b8e318b93fea3b40d75ba0a0570512e148d9e84b5535ea70eca59e450aa053782ff8e5ffcca140dea1dbfcd37ad8ba3ba24e6087275e947c17a64cbdd8488bd6f98f9388549b00b3389d256ed0c6043785de6932f25c18bed5c0527ba46652f56df24d3ee969e109d9bf23ccc9359603648d8e7b064043c9973931ef78fd107a9df7128362b0ad4cfa449c86fc613c47d99222f9500a95584c746b91dd729a987bc5de7c6bb926d52081945a9b42ae061347c16e71d91a6553109018d159fa7fc13a8d0ac9a57b132bcf7947f19e0444148173728397afcde410416b1360ad1e37cba2762f7e15ff2fffeee2e09d03b83ace24e9395e3aa6a0fe97d035e213164d1c8",
+          "padding" : "3043300f0682000960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "4cf36bf17238f5fb54ca2c60abf1f66db89d674ba3598a19ae16b59c69b818bdebcd1c07848eb8d9bf1ac76d40c7f8277289f8399add2462993f41fe6b5e0cc93d82b691e38c2ff7dc7e0a2ad2676c6ce15b69e322a76cb05ddc6a6cd547b2d126549d6e7a62b37dc9121b68b52a156c0134c8679d553803ad2668551d62bda3d16fd3a12489c7e0edc87fa4da8965627e55256d441e005335cc212a7bdb42e62c7d23139344041b8eb0113bd0f5c64027ff6c5c0bd08a042a287b2ac5d45a002a92a69a7e8325a5456334219f79c174b959afe78c794df1a8aeff180e94ec3d2c1d25b8ad5d1c083c372b2cf3ceb569a5768518877d21105167eb89cf3793362fdc591066e26fbbb028e6f21da34a3ab13f26d8c3d0a3e8bdce05a301924837989cfef516ff4c18cf5e74b0ceb59c375f585bc5b9f99bb1c02968bebb18f7e16f632c33c79f341974f0f8f9d6243d59932e21b278760883f89724e996d5ed7d179afa967ceb37d0a4a4abdd694a386b6c36f7214dd339fd87e2771a36517fd049c04090827db6a0759178464bd013258fcc4f23335ec1398c285697b2f410777c8a9aa2c7c8995ffa16bf71da60fe56e0782a1fc6a58522e1bc000e5e9839e5b812ff220fc884fe35ff2769b4debe516ead552efc4f956a5ef9fa31d0f13523d6c4818d64d4b157c6a2f044dc68c85371a0f23dde353fa086de804cf1f8f916",
+          "padding" : "3043300f0609608648016503040202058200000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "b188bf6d0ef7001eda21409538960de8ce6765f52a39a886d5fe4e5d7854f56888ef04b8f005439ce3db47572166b13717de4c58ad31683e380bf23ac98d5c541aa558fec78b27c0e315fccc960f6b6445f8d732a144dac80980eccb6b6efb7dac2aa3c44c70ffad0d38f50c92acb71d799fa31b7efce919e9a7e7593c864e1eb19e1873a4359b4cee15f941fb70e4ed1c180fceee643c55f35e0a0ea45eda985ed5e104b696f6db37a21df74693c75311ac31b2213babfa473fab2c5eaff5b003264d8a1fae68b701879d8bf7d18af7f2380e513744b7eebe1ee83f6490cac6fb47962d59b2d304a920d7dac88b05260229a178f6196bc0977305a6f9de8aa58f6275df14ea42d3aa74d06760a712a257b2e1e7a83e0f41bd9c1da4f76d7634f8a9c2ea66ca1f16d82d27b55d55586399838c3cbc523c2f588e1de72b0f08ad782c5aa6f28f5eaf5eb04dcbe5b74fb5b3fecc99877330cea7c8bc9f2d99006c0f44f8908716ec8eb3c3273104418dc5b0d90593ddf8d73bfdc883dfa5f3abfa977861147fdeded55d4ce67a27bc8f68fe407cb86f5565879888b207576e05534dd0c6e5ef30a9f7d49dfb2d5023e318c6512a1c91d6a38961ae9681fe98aacb81802ab2415ff7889763329eac8a630245f0acbd2d29d18a5f5b7261e0379bf335e750c6a497d0725f2def9e4f0250e40dd11c62a4f4bee3cad2eaa361afcf06",
+          "padding" : "3043300d0609608648016503040202050004820030f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "23da245bc1defff09dc4a0adc58347ce419109e3002fd1300331a8dfbde68f4b17d7e65b8ecaaa69abc14134422b76036f4917b7d991e0f51d168074722a2f1ccd1b30bbd6f3139f147d29ef11a0da1204d4ad115df67a66d4d10509abeafd2502a6b671a40746861751e7e5912e23db05d0b3ebfa95f0f3fff8876b6f01af3dc3d5e94ccc7582536def9d40facb2c6d91e0eaef3ef7753fa8830c71e6e583fa21d423cdac47189337f8cca61044e492b073caee975cd3cd33ebd548eee68d7220fce78ba2db17ef8ae487d2ff06e94d3d4ae67e3ff9d3d78256403744dfc18c5649d529f3283b51edd7817cc3ee9a3d417d4e2e583f13a36bddc93f078cdfbdfba1c8cc486b50e8104f4dc862d4cfffc7c9209143d43fd7d55918d326f022db836d6d3ae155897aa4a12af78846c94e1bb42025a796d594920011945aa7d7f41eac8c0a42252286267433c0409371d20e312423062dea435283d3857a56d1b47248190b73b358ecbc998e7dfaa4f4b89acd10b05b58a172fa58fd37f07b707a978aa4e26d471726240edce522d4083477db37e4e230031cf06096d373d65e4e7fda47d421e4d000b722da6326d9e8fa5f09f2685f6af3a51f5649e99a67010bfb695f3f5bd8a6027ab1eb759ef0a022f5bd6775e5fe96aa22d9d76b375377e2b556199c940f0567f09899874e02e8b972940fc7d7fd632efa97a617c1d4767e",
+          "padding" : "3042300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "bec4ecc1e9935d26a8a448266a6d450ef1926d3e0353bb61f7d84934d7c66d66b4441d21b54abaf9200257fca89ad352fb0247b5b65fc952f4d75fdfd2c04a8b440817cf351c4c09493191ede4d73ca55d4142f1c8abd1982278c60c2f9f5f2adf4a0d1e0ad8ea2e3aa1778a846a91bcf4ba4b9637e4a2ae49ed91379c2127dce0fe03048e78dc9c37b700089ab84b84cff7872fe08d0d773818e158b896bbd6075af6df1a751909dd1e5dad968ecc91bc6219c613a4ab902de6b0acc46748a30fef9fb33a335820d737fdb353f9e8e5378e9ceced5b8809906ddb710038c6f2c4e3c80158f5ea4ab1e2357bee7f01e2dd2dc81e9912d8b260ef4ad38e181d7f2d5b07287659e03351e4cee0f0cd4e4ca477415504a8e59168937958e3eadda0a9e366fc370c308ad78505a8faca416e94b7f27f60f40709959fe26c1c6ab985a1141537d1fa110cce115ae45a10a3498591800e81102097ff514551819abfab67d876df37e1d04557ca98ac6d9c14cde0bd2e0f9ccfd6e2571750b3a69519ff2630c5f1a08f22767e9500727433126a7da85d992cd14d4d946aafeb596f7aa8ea2239d1d5fc0556584669a8fe968c7d1ec9f35a601afc7d8c5e2620af5bb95fd922dfb3b8d013f5b87c3cb1da4b3349ab13135a13d45de49b4991eefe8c6f6b1bd409b2f827288986e986cf08c643420b160a642dc47afb7af321d9eee89af7",
+          "padding" : "3040300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "6e5a44b4fe52c8104eb60e7d96e697c2fb0c7610fe17fe8c6d10fabc509cd3cb16bb4428935ec58fac84db83542ba166991f923a9889ee78088f0886deee107c1d0852ebcb295561c3977b2d69aa069e1c15e41d5ac47050b2221962413f9b5111a536a0a6c1762d04dd8ad96318964e34b8230564509e62d63b4bfd0dccafefc31bc44a0086daae5da89baf990e454f390343f1755f7db2bceaef0a310d07b7817a29371485d5abce1cb9b1e556b830e15b35de0b0aa977aeb1b6a54117bd787f7f9a64452123a3f29fc2e87256395102b6ac86bfde21c05a5aebd4862008be79eae34faaf324db09b5bc57e7e2650ba2d5a11851ef8c864dc5c04c58b132c208b7c579673b7419557d4bbdb47b2281129c72072d906e0e63f4e6dd55f3d3b2fc386a81a7b746a991a751d49d91a76fa4876b3c93c4b8e6bd9326957994354ce4d93dc93df5c5a8d115897d263857c702f2a95ff4a714d402c88b07caa43d4876ae5c37780a7a22a01e8f5a89ee1b50185a27318120a6d3dad156811ee818fa2d7b051d57c5a4f9b93a99dbe9630b3e301e94b04ff6bfd4361abcd95d86fc89046f66da80e29073365fcbbef0e7f29ea799e33302ee3a29792742f4a078f6cf86494c97e8b1dc2018d4a65ffaca21af43675a6461a4a8519e95f4320e2ce904f88ee8bfcc5d10a980684a2038b3dc8b34b5131995c684c89d01095b41b713be",
+          "padding" : "3041300e060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "856accc6420e940cb6ae49009afc46bc43ce4853098a25631d172c30b2d94b71268949c8ecb721a24f1d9b1dd0448f2825268c3f62c39a97d40bbb36cc93f36f9e78c1e87ae7e217a3f0f3b96c20b99c96d10d8a06b40dab75e7045f484bd6537610f423345df4b9235be70874c3754dc9131ad5041da7ce7c61ede789d87adac85dc9318b82985c83143ea1194c07386ecf2e3af4c1a72722c19649875378b43e85b8251e769e42405f70ae26d94e7b7492dc761accf9d793f5b9e3619a8192d8166ecc53679dc2bd1b8ff609d698bf92c75ac92895653c650ab205a9233237c5ef111d71cd13ae2cabe6c71f5164e896e9659afe547ed1321a6cf84734bccc19b9b93d796b54ee6f3f5355bf1a8f681854ada63ca8beaf9695c5da9adb1705ef06b3bfcf2d35be7793c48c8d8d32a1e2273714c314670447c51065619558c8ae80ef286048ced7e53d3c7b5293d1145b337a0ec34b21dbd3e2bac4897bc657737044c9ebf8c9d8ce82a33a56785a2f21c296b18435895005d1a5bef8c496a36c4608b9f7dff13bc7a741217b54b8293e8b754e1f1d98f9ad74bd3334f381726f405130509b815bcb09f34b3c34b3340870e7702b54dfab81fe68c20e1d6ec9f64ddbb73ef0768f3ed80babbfca7eafe69ccbe1bc8db50ed35614f1b883e702c04612af87fe3cf48063068abc42f3dfbe6499b8faa57ab75384bbc47c0a83bb",
+          "padding" : "3041300c060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "21aedb00191da333a649ecba6a9d715d4b5d379a854f27c6d27c2ce892d6d664664ecb53351ec7f1bf7573336b3bcccf7fb25ffdc3a6feb3b95483717c08eabdb8d9e3a9f91937f495a965028a1c89dbcea8390032d737289298d6124197090f10611e418d7f6d2b36542549de777fb8d0a257f7ede55a9b63a9b0d7bebdc21b4b8c845e43faa271d55d87781ab76bab9b57a2e2237c466bfcdd8e2b23f8f65582c2105aa37aef7687ffb514df3629a367bc2d3fd183199699cf93c687611fc8f190efdcb02dd6b9e228361c7a72c2ebdd5077e09ef866e304dfce2b4b80fe99b42a0ce9f47b8ded420fc0e7e462a46a82307d42e5f139198556c3bd74f7b0215d8d1552c079c895efca2f9de22bdabc46efcadc355d13cb8ad6262f7468b85eb1b1d5c13a9aec97884421914b474d9c5031f8963b5d635cfb8dabde4ba9550978d0bda9c6ea0e28a7f78b1a6ca82185acf4412770cef4189b491c16f77357df7b6b848f4722c098e20cb7c249f3883c029e76ff184f657ac4b38995b428d7acf40239b101787e5c798c683afee7fe19fcada3ce41d45e63d06afcc6baacdf4287e70f03d38ece2b523f57c3a74f89d23c9490f0771cc4259b1d6382f1f0d6ce95e7aa6002104c2571d08f201f57cc8058628677dfc7c9dd631f648327c9478671291acac13cdb02d54c0e7a7ba5899b8757796d976e97ca64b18af462047226",
+          "padding" : "3041300d060a60864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "372a2b118adb8ad8f08f5a1d9ad3688c8507591aef9122fb295c7aced53d3ccd26854a348624757e008de36dcdd1367cff7bfbc94776e762a5c1fe61d1dd2ef8d25e714cc68c2651456bfe310b2c61d170bce07d2d6a574eb6a4fcf0606956d6c18a25406ff80c0e153fd8d78dec66d319a31080906150a8fbd3a6b5a42fc8345be0bd28335baffcdeb458150327591770697bf785cdc1774a34ec740b9ed76f386d941a81e0bf8902f403526797ec5bd5058700131bd42c9c1a42a7f883a85592679f1e81647f7a60981fb5d0975ce03366d4bc5a3cda125e6dde4173b4b99f674e5feb0b94ac15e4226f1817a43761b7871a82a8d0b5a22b30c3969eef469127bb01c3f8be5e35de49c41b3713ca204d750e191a5a303f03ccd67a3d3fc1162b197cdda6cf604b5d7b36c25930f5ca5029f071438fde1f940a27055cdb0a902f3da6f57f28ae670ea2d3d5554c99c967024386835b604b0fd3f148ab081c8e79da6ea467ca16f14c938691eeb831574dd35eee97a8ace57afacd1f5c564db178ca057f596f5f667fe7a6b938075c9ce3b110bd12ec2ba3b82c5eae0d12b6bf1962496bc7e13e4ce04de5a1639c261f9562aecf8f87211821010b0a32b28a4cd6b8c1818b3ea248b5f11ac9ea9372121f30bdde55f28013c9713761a2c85fe563c58c418c08081fecfc178fd6b64c6ba93a9cbd2e7d81bb971132156b03105d",
+          "padding" : "3041300d060860864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "5ac94a9a7fad561012e21c69abeefd2e31e79c2978f2512eb8a3d59c50430c0ba3ba47ebf001b7cd0f6b38455255c3bf241beeb1b4ffe47c8a32919ff9e7aefab02352d4a95f2508d35409dbf0883f2b9d6ba8963c13d8a403096cac6be6a61e52c6a62e416b98036104f4375666a9566e78d3be53708a41f0407d4912a7da03c28d0edf69e6dac1653f8edf05d081a637e3e179d30d595f35f7e75ff418e84991deafec863e100e758de855ce51c1d047fd2c52242ea4f36b0d5a7690b784bcc99eb09eb3a0d434e12aedc829cd9b43fa6d4d2dd6566e12295b25c9a204b0c50a65f3aa69ca20f8f1f2036067891a4927bf3fe00ba892ec904a6e64d01eda8c224765fd3ce14103cf4d4b6261e4dc4d0dd3ab112707f2ba113baf69a56324370689302a956f9d1b1042a9e2baae8d7ae38582f597ab86bfec08f99e8970df218772bda2076ae24f2265fa1a2d197d78143c3daced75e66604098d0587258eed61509cce845410a18a81ff44fe8b46de83909eb0ff18f7c99abb1e3763bc09de54d07500626bd5f11f21f0ca62d1b8cda6297d7ba833934c5a94c60f6a3cb8868a8f7cadd01a154f028d42c00097161253f223b14d7b3656405728804519fd6b903658eb0a56ada5c08348c2263d30b3b476bdbee5810f0dfc131527a5669a4194cfef11c045336c4d60a9966e9117b1b5c0331f9eb9b1669752b0b259bf2972",
+          "padding" : "3041300d060960864801650304020205010430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "88ea7c7ebd2b87ad0909f3c32cd4a460d33a96fb7e5c2fa353245e2f26ab1a6240c895ce28c94af7289d359836ff59dc634556bbac9689d33bb9515cecd733487a3e3b5440187bdbd524853d5102c500975db75252b96806350d875ef933f64ccab351143128ad81e3a02571e5b4048ec58b5a8f774ea5663f13f3e80f9452d67804c142b05ff2bc11de1d2ba0ec0b2e5e0f330006febe1fb470c93a424a05e14029834787d85f3b9d2a0a508a90d00c93ae76ec0a9009344f37c433ee15ec4831a0f14c5222928c2f4af0e6f581a77b3c8caccf5f61e46fc564fd2ef8c29f6ce07257499d70c2861247e3fe037cb986a782536b4bf05ca186e02fa5a5467b11a16f81e6d5eb9502e5d74fb207306c1bca443480b7fb69222152543892f8d4521e18a63690d392dec80db59f9e391f1b1eb733062268f9e5d9df7271b29ffaeb58563bf1eaede746788198afdacfd5443dec21e638e1eaf32341c2dee6a2a46b1a22d20b1c2ec698fefb5bbbeb3950e1f16e75578fbefcf5ce2a65a248d7dbaebf6c5ac23207ef7bf1ab0f52cf0daed998022efc6dd3132439e69b9208abb16dfe4d75a0b87edcd433a62b2be284a68d91ce0e987d5b79bec6924fd24cc030b2720a87fbff09baf20690dcedce53ba70a24fccaf89fe7bd6e70a94c957a910044d434b8326c4cd3cf85d2ac2cc41a4a86f336975ddb73229ea1c46c1637a3279",
+          "padding" : "3041300d060960864801650304020205000431f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "35f9b145c1ebe1e46ade2d5c23d421f944fc093ebd2de01e4a394954b55331c916101ce35eeeb6894e1aa41de098e076b18e258f24a9614581176ba9a5520993d9f4ceefa40943b192be0b39e27b6cb6dc972434d99150ef0737a8f2ceda8353013f0e74455dece6e0364168661b1f394c33f5543d77005feeebf72dbd5e553dc24af1d6f22042adb7ff5aec1ca4d808b490ded1fa867d15909b723cc0d82c45e0d4dbac745901d6f98c73b0fc64bd012d4ec94bb3537b4099655f3e37ba3fd9afa0f27951f57c88dac0658e73e9622fac5826fbf9386bda7ac59c36ca1350a5639215c6c5dd9c22221a8f47f413583a08b6e7d348db552db19dfb245276566df9698fa3685549ed93b95788c918dc4d3b37eb6c79a3020bb61cdc770242325d18b21081507968ae90298986903a55d7f3e4fd79b21bb1e669662a9c3e53f8d43aa201e65aa2dde0778744b2496ea2d9cef2099b68b4090b8dd73171ef95aaed07c4094ba842ebd4155e2d016ee872593bda7f020c59f3911a91d9f4b52dba9a47583bbe57fbf6603c7275de7f49a416440579ca93fedd626d52ce9faa51edc5502a9f28bae780e75cb92fc2a9453e7299d7783745d7bed7b3d1e54224f22f26668ff129ee7b64f4f065ac95b4caaeddb428035be9578ab51202bce32163a5f2b14802698f689216d9cc018ff1f33311f0758d99223a0fcfb3d5e6b451ef782c",
+          "padding" : "3041300d06096086480165030402020500042ff9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "7658eabf44cbf5777f121c459c87744aee55b520f3163f9753d7c21d6487dabccbdd6a54bd8186cc5cd68fde76e6eaba46443ec0a750a1824e7f8e7581f7b57949cc6c44b5a6bc08d61178617c4ee99ec700053562efee3d8c7d532082cea526f6e0949b686399f15658771949cf6ea8eb455587fd328de1315180df149bf764ce52536c82b2d1e924e7b7cdc09d11f7e8e8e1279cfebd39b8dd64902206e3fe437697b0cde2620da6f3252d09e2ceb52a6bb1a63b407d3ef1a0ec2d6dfe7a413dd8e899b8da238032241514b44add07e2a3cf37cee9cbd50bbdecd386226b08020652bb651e292fb4ddf6a0cf8c3acf9ba13ad90e74055418d6cf0ec2dee44fba207a2052474c6e397a7eb30a021d2e44b343624657d4753706df893b031395d0cfd831eae47775b2a4ee21bb36f294f26a1ba1011d16d5a889edfdf0f69e3bcc10d85dd89f54318aa6403ffa0dd3711516a0d13771f04a23c7679a2fead20c57f067e9feb5f43729bf6351ee3bda720d5f01d56688ec2bd5f760977beab14b22bb72885e2b7f43572c0bfda433eb65e8f8c7da81414f96454fde33ceb6775ae73ee119e25a8f54a9cf33922fb06def12c6c6e3cdf01134a62a81412acb67b7e63778d675d110d8fbeef33db054737c9c99b86041e96a13bf064264d3abbde65af598cd60aa827f4f7416d3f3b0c622c038c7fb63ea7c10691e4900f0505a05",
+          "padding" : "30850100000041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "5bdf25b34b0452928d5616140daed62cb7916283165722a98f344e2fb86028f4a5a6459227502f558ab0e6d0591f28bbafc7fbab5a5411167acd7183936d072c3192d73aaf5f02ad4d31d0afec686a6c6c73cb0426c4320b57b73cf6dccc2a376d0cdaa2b0f86f9aac6bdc3700e5df7a75fe69881e3e0573167f3b8faba3d7be21635e7dd10ce82c7cb74e97611415f7e283bdac4b186f7b0c4e9e803a9f19220f686657300e4ec312229ff8cf69fb780964d14c3654df79903fae9969058533a7d0fc29f417f98c1c62aee7eb260a318404e64164699d18a16bdb934e5beaad513d6bb7bdf1f30c89eebc2cc02e623aa7f52532f2e89122f50ad8be9cd3d6476d815e721b789f148be254731e4d5236a678a5894b939de88067a8f70c3ff5355b7a10c2a624d09fadffe29c97e6c2b655b22cbc8f99a1912539d034537f29c343e94d762496ed93072940bc2d56bc419dc584e0f984bcdb4681920d650eac7bac0cf2ad14457566dcb2c4165813aee4d2891adf8979bf38e6d7a3b80073ba04c35b2d161575edba17520fa709e2f1ad8ee43ff5327fb8f40935b7563c0a1487701e964b282c3e5e294b5d5cb570d18108c2d8fb9f9e2419bc154e1f865b2512bcff2424a690afb6d0f582f4b84a41e4a211fe57ac406db5908ac95a5a26d7de6c3d7b4b27d4a7919c8362293e8c8dfe21675e800794d31cb96d9a400c15df4b",
+          "padding" : "30463085010000000d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "6c6f4014c6ea5c64e868215a495fb2e805065458db2bf01987d4457589d5735582c61ae5648d93ec37e3423f721311b9514ba7d59cad19fe731740af194225523889c451eddb5ee1af9b6f3e8da6a439f49052ea041010d0143f2abec804b0d6b1bd1a0336e8e1bf3aa74b817c212712f649862c68667abf57e0aac47b6d03de3b7099c7384669afd0b5dacbae4bc5c4d6b3bf52dfdc23c465d5904d6b6333ff685edbef1f9cdbe5912b4fcdec6c6be4ea77f3d913f47b09123a9d3afa48c231453063ec9c800130efaafe7beb7f7cce2ca5e3ea43529e68d85f93b11392e9912c9ee4b6df257c76d01a18aa6e6cd9d021d7d0d0309cb18b9f1e5a2f30972e57c5c3e12a4f5c37680bc1d1bf68911dbfa79553d993d7a9b197360ea9ea9ef6e7667b23b6eb1067d8bdba19a87d302c7cc627a4beb504860f17b89ff4e3fa7600d9ab651bf71bfabd89166033cfb5585cb6b2356391bdb06cfd034a9fbf467355ee91e19f25a9cd66b45456b50c8133e495e22075374374fcab1d373dbc52d57c1f38224b1aee50c8f0ffb34a7182220d1adfb780548289d7690ca5c2f0414c80e318ce0c62a3b74b793c34b708f1dfa1f87fed6d0ee5ae1813a7e881ef99b0f3c0df8616bde1aaad8571e106497b56c8515ac53bd24879489d7017f7f9dd182b5acb49bd3b76bac12ba7920b1c2e4f0b705a99e29c93963ca897d152329fa097",
+          "padding" : "304630120685010000000960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "8808740c5b391010d78d9daf18b3108f4c94a0efedd9294f73c977a25d6fb372535d5cb7a4a72455f1c540097f8763dc93748307c3cd75852a572d07030c1727dafc70674470e7aef12df09fee2eb53ba1f526de8e15599010a5bebf18d7711a82400b757186e55972ffc4f6493c1a984df0cce9aa53419d4caea1c4f4947081ef3ec9e7888b5b40e4ee943b2b2047ece7b7c63be08660408d8cb061fffd6b43b36d01d0617232c3a6770ce2a6ba1e5e0aba86c77af3e60c74677ea7e458719aaac0b26bc57c3e115db330603f2ff5aa523bd6530b6afc32e014b69a4a929cd83384aaba6ff6220d43bfbde5cab82f572b8d8fd9e1a57b8ec184f48fa174974ae43d5e7d1034301e1f656554929891d61929b43f77023c389bd651dcf5f2278bd9c99ef7ef61a46c1a1ea589beed36e80efc821e8865412a9c22aefe14940ab17e68055d79f328eb5ebff9d43bab4e829c51e9dddc5e8900c1b82381c9e5a3fc56f922a95e3b56c5d2e9cf2797bd394c0fb62a47a5c54f19c76428ecf0bd2e5e3b845a1a14f14660932a446c9617f1b7418a642212bd3465cd812592c0cbcda5c88c8820c514f0702a20c59380ae782190f0e2e4f5f6dbbd296729d7f81ff365f7d8f273f49d27e0e1224930b48f86085a702a45cadb1aefbc07eb0dfb56c2628313953befb3988b20f9bdfbc6481f1816a05344c5a776ce20404897571df934",
+          "padding" : "304630120609608648016503040202058501000000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "c03269d89ef851b1471facf40576a4e6eac16ac9d530f70b1b8af39a3d885b263c893536c943a1449396c38389ffcbeaa8bae8622fb327a2191eac27c1dd682c40ecfbbd977f7988509255a57879940b1e70f8f0252335e128f092b50157aaec86b46b0cb15dc1da05a593124a19a96889df23b6f5c6e2925057e0438aa79acd8fe8f02fe9bf6042668e9e8db2b2eaa67892e61852533e556ab5680db3db94a098c65e5b45526bea26c2809c406871bc32db868630890206c3ad3ac83ede31d8911724af0cd645a7cf99701c44f25d4e717de38e8a6972c9956ca14d17f66484a6e09c294911e5ca70fd29cc3099639f37e832e9baae0031b7f0e2825514683b6a0b38060354c6edef6d990f22ca88154b2a1faad0ff249a7b6e6ffa5d5a1b76534f4c8bfc305bb22872cb762d081485832ce74e9954fb4f6991e3b9adea0d728893d5511ea80a74562d126cb91e1d059621df2e61f59ef08b8f1dbf61ef5a983b168148b3cff5bd8fcc73630055fb50ec800de1a1b758daa39d79f17aae7790ff92c760d4286af58a8eef669e582d44d772bff4fa36d998b1a70f3a57c530d3b1416c1457903ed760f83a2b211c69cfd99d2a19cb604bc6831ef52338985fbf6f0ed657034bdc5cb528f576aeac77500717ff7cae5aebd6e8e5b6e7707babc79e0ff101f72727424bba8a9b50304dbf3843c63d4a4700d544d55e1b8634d75a",
+          "padding" : "3046300d0609608648016503040202050004850100000030f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "20dc09d6978139edbfb570a17a39704a662b77fe4047037275064346e761f2e198046a42ba19087fbf5f44977615a8c3d26950acb99ef1aabb32a99a5a069ba7008a0f8594c4fbd7010ddcdd71c2f5bd2ac972d4f2434cc662443e280f2e241f0c36ed47c276563763d09591c80d1c77fb1fd2ca278448f3d183fdc16f1d9acdbdf94c7a2408ebb7bd3883767ffd5f7a392ba1945c2ab9b03da850e745432f0a09c7c02e7065c8b55c3ff86b171b78b13c3ab933ea1a76c332a2690c852f4bc39e7e8cbff8d71f1d2e614c611e4ac5b9f6340fad1db3a3484fb7a295f9e7673bbaa8ed675da4915eaaf0b3cb882e9b9055ae4bb8ca513762c73a78f12f42bf3cc42c8e37eec06f7caf1da5cad92cda284d07de75aae9681cc4cc9974e2683d4a56a6af6c792f26a281e72df45ee3b2beeb7667e2b254405c3af92889e6add37aacd2e6f1ddb106d1e7de901f285ec7097b15898443d8f368a0756c2c937ef1ec177736e94043689d6ab04abcd7829d58e888335fc64d19783ef08544fae0ef5cda771e481217c09ebbc12e41981f56b68c4c9078172f575928c7003606f69c3d75ef2b397dddb856ad5625035c274b5bfdd6ee91045eb8aef15004160b98846c817cbbe8e608fb1426daff941e9f0d358abef9d8b52b59d3d25ff41a44cd1168e6ac32f09e86569adf3dd11c632ad14c43a4545575f4461bcc29122cbfaf5440",
+          "padding" : "3089010000000000000041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "380c5334185962bef9ee8ad0672b4b997fa0d1be3fad6300732dede2697e5900230c64f93ec093263e62aeea76754223acc93faaced53e558a7147b560bc19638642ddd82d1b240a7983bf2d7c70b986be5cf85abaf28b51599e8d3d50d49abaede889ad06644982aa010d86f3f9e9332443bcee685dd90d2b88a26b41a4bb3675b6242836a168917d22a5eebda2800d65c33da791c3befbb2bc72a17976c027686f967632ad94bddcac0559e82fce6918588f814dcf65cc3137344dd84ae82c00469308ec62e9dcbafa501fd6091e05888a28180b8401a5a2098702e5bc3c8a218f608586c1252cb5ef81bfec154198f0e2af6993e4ad57edd8f74f1212f70509b459b1058584463b96925723c1e9537086356887b450db8525d04f4e53a874b0919e663fc9bf8bd2848986054d56f3766fbeaac550565c8736b65c8b21cd68c3497852bfbc6f9c83f48e787fcf2be244017bef9de6c633d2906bc3a2907ebbc177aeb685e2ffb25be2933c39e426ed28046eb06dd9f02fbf133887fc930b44ceb52a7e45011d1cec76d4937399cf5f5310cc09f847c04efae92aa80543be893dab2b05c30c9b46dd8f075d4d03a8f5c6c07f059c740fd557a406f5147573a9d92c0a832ee25959239760ca0453ec1aea8a1c6a2b332d2a9700236b975b697640082c6974047cb2d3d39968761202701420486e1e271c5ee495eeb7967bfcd6",
+          "padding" : "304a308901000000000000000d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "df88a9d6ac58442587b86def97fc8b0bd5934b841c15f3f1bb78d684060ad8d58991bacdd86880be01e1921d2a0701834dec7b5eab1ce4d6f11c314d4cd28fc7ea6fb63d4bf49c78deea16ec7ad3d807e57dcce387f21b643c7efbbcb36ca23d22ffbfcc27ae5c019a9974fe1543ca1bc894abf08aef39e25f4634eb04f4573862a73aff683ba42a8bf344f8840070dfed0bae179a314d235a6930079c62b22ed6a0d945d237832afe911ebab772ba0ab6f8ce703e28adf589edb836b120f370eb2c78c34a9f5d6258b133f350d211d2ee2955a64d0c7bdf53e957ab1ca4499684ff828aa51b844015bf527f89daf8e54f315144d0ca426fb67ba965a92fe77aaf42290609eb6ee7d9c098b4c396337a4e667baa50ecfc21d53d43270efae88206f4afbb58e94f43ba42ff3bf43ff665e84e7b2c6707d51b71155a734a8cee902d55927e1bc020e72154c06bfae645177142b0d331b480221c5c33555b9ed83057543219528d118b7e66365d9df9eb381d2e31da9b0f6d8dfcf30edaa7da7c3dd2150d9f5c52735c05723995d348c7bfd9f6b38000848ce4ecd8e91b445300a3744e453bf36247df120e5df0f9686d99fb9a5847fbea8b09c2b64003daf243c46e017190ba5a7f7cc8a3c8d3af7f348a757e814f673a8680311769b39288582c9d33de02b2f20cef728cbc9de9629b6002dd71f8e6516eb1f000e17158e9d407",
+          "padding" : "304a3016068901000000000000000960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "62b367fd98766786960949acd2db1e084830ecad8dd52370500e54357ad5cd1f250274fd3108540bb54101981e326949b5a671f582ac3d05a4aa959be04754f1fcc20f3fc43ac910455a217579cb05f50abbc9091fa8cd76fd7cda030c899cad2eb7cd76ea3a3749d524cf08ad4898382e48faf9d34113628280b306e0180a1f9b8122bf8a69bb53ed19200c45fef52c8a41db390839696c4de65d287f0b90afb92d830b7b96a84f122c70df93db43a52876aa58d16c1ada28fffad42995075b41f0117d661f145f11b8bb18982708ef779e27d0d2303930752badd2b73f5720812c5626b38a1cf9b6a759c474d8256b668d50050e00f99ffdaa111cb3f4d96f8f6890ac908dfc56acd0076a6aea13de904acdcae17dcc8d3aabfc90f8f7a51e9f430e56ca8fb0ee3bdec82d2709f514ed037255ec7fafc22e7a396014ff7c479e9333455ab1707e0b65870ccbfd0a3f17b8a33c2fa3e06d9d2b47a77c3ea25dfc95519f2f28e54ed7308157965caa26caff01f64db282a7ac0f51fdeb3d6913939f1c8686f4434a2f4aabb0692ac2b09e269d74a83d8b5c917d1275481dda53a9b040f533b7307e2eba6d6fe582f5a594945182df5b1a7d855f36bd4fa9a47be0912c1be5aea36ca346c6f092157111c89fe825ffbd7bc9d9a5bd778b8c257c90c6677caf72c176efe2645f413acf5616fffc9dc9fff34d4d312a0647ccc296",
+          "padding" : "304a3016060960864801650304020205890100000000000000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "ce821022807ab70f29ff8ad554934d4ee6dbbc97073bafd17b16a72d43ee3691788048afd16a781fc8c48e6c4fe164a50ffed9acabc313531b77a4e3fbdb2bfe73016b3f58da588a98b8670b94db5f21f29ac475c4246c1b7bb06d136250f5e70cd3efd0ade5a107eff64d6c0269949935e4779161e0e0047c5ff6191bb3a7ae9c0188a1928807d694e0e5d60e6e04ab6ec025d958f97e9fd2ff9bc1068600dcd227bf02ec37811e48c2c6963276a157c0ba580b5347d44726626f59db6db03d2470b402325c1173939a96dccb438c81278a7a9ecec51637d2003ea74d66262a389b0937d5586dc4d8d86175625bcee7211ba6b2a037a156f45eb450073f813d4cd5bd7ed02e55cbaf112cc1221da9a0e133733561884ea82e295f8778603e9c438159eefeeaa7e6176c1287a887d97ed394cd37832db837c336bde154d525ea5190d0803fe2b89f12ac8d0744dc02b688915064fa260931fc0d46c2c630b4eec48df59e8eed49aa81f903a8fa9a35b83dc70ab658e8cf9c9b5dd0b12ec4b4187ff7168dd5f5878d1ace1c5d101f9cad3012600b3193c2968cc29a6fb123c640a556c568867f8a18b367a45cfa339615c93a170ddbe5978af9c35a20ed7329de82cac130442813c404c2165bd32437fdbcf6eacf2b07df7cdd637f63cb0ca0fd427ef66292559cb5aae38e4f33400b89d1adeb7a0f40f4dd0f2ae79702c0fdb8",
+          "padding" : "304a300d060960864801650304020205000489010000000000000030f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "b32024e88a28fefc022e4d54eb5e820b5ce205d4eaabc87d3c8dd1877cd163b1bbfb3d3d29c3da78b98d31f2478e8cf31e5238a1d2849b39d4f074ec3ca96bbce4c7364f9a14c83e363ac17a36e42ddbf61fb6638a0307f3feb468ef526b0b1e1d23030fc6eb323f405c3e34cf211e5967c8d84ac436d1ef722650117eb5f74d4ec6e168bbfda7e372c1ad828160937067cf0bed8939b8af2289583f459e6a2e43aa942a78ab811c5f720cdb92cf6357f995dc3c176be981ce4e86be3b63bcd5ca84382031f16440c8cdbaf4327d914166af22321ecdaa02da8faa12a5522de776f23ff9024b60446bca0da45e5e348ecfebb7c85ee4952cf6b543019b5cfc9108d9edabed761b8522e49354fecfddb24fe08154250b2524dae76128f3364f78008a414d0c01bce320b32e8fd8bc820d4598e5a818014cf8ceb119e991722c95e2e4380f66d3e7a2e96b49cfe06dba26b3c6eb4d67f2c61a9864c40230df50b784145be40ad067c0acbbfcfc0d706b87137020317d5d5cedc0bbaaec40c16b5900541eb2c2dee9227f69a006db0554b7eabbd6f5789bddbfbc0d729bc36759cb23c47cb9b0428246351d254735d92816f8f1cc1bb2e3030fb8dec028af473a643997d621b06aab75d8261e9d6e17a7f1c222ea7b4f5c4204a1ffbf60a7a1989fcd0e9accfe8f53ed03dc6ec04ee4ffdc1ab63b581137abac5995afc7c52b11b7",
+          "padding" : "30847fffffff300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "0a95093021bc15ab7be12947e892fc72f12f5cb76600ee3adc0e536dccbdd235110658ff7d1d63b242b9e41ce4d6d8d20ffeacb59a86dab7f5729328d3f5d9d886e88d344788ccd8ac4daced3d4c7eefb5727037d5c073b3abd221c95207f2f7344ef4ff95ffd65a97f4c60a3a75901a616c9af07571bbbc25a9ea3f5caf40bc2790c824b6b31685fc92438b735226c1a2f730eb8596954be137182ee9bf0ba68606006c262d7b24360cb4c08dd5e0d144f8f0cae94d691aec91e0efc1c92d0128ed99ea7ddae3bbbcdbb1669485593a5313ac42f273525fd8dd6337037635571f05898baa6db86fb576054c2f62f9ee695f7bdb54e8224cdd914ce9ec073253917563f9353164b373a7e3d65f3d7860c9692ad5ecbd58ba4fb1c0db705aa2e707332df7573c704569ac92942fc8d7f0c49e973a71a7f7792ea8af8fef8055db774ec12579c9f32809101ab0ad92ffb5157f26a18343c3594a3183d2a92c293db280fc4e4dcfba02b4441048498e3ba8ec1cf92b2f54157349161c90f7259e2aee6572218587b99dccfed4bbcb6fcb2cb9fb2da566d5ce7075e5a8e2932ba467fd027b63cb7bdcad671c1c84b7647598506ff0a572c1762f5a3d9d84860bbae6022e4578d300c507219185446dcef47300dc156fff1b1806e2322b46390b4f38d65c8124baa8af2439ae0d04534cf0d53f8ca768e8c5341254885cce7410a06e",
+          "padding" : "304530847fffffff060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "6f6718083ec44daacefd671314a9b2740e6fe164384d24642bdd71f6233d5de5bdbb6045ff38a86974822016f221d7b3d1c0035ebd7bcbc3f1d4e82bea0346f979242e5d279b41d05e30040d4994d8bfba56724a734298dcc01e7104814253f12ef0f1f677365a27173bb95aaf805e31a305e81d382142447d8c63a424a8cd5b130266659969cbf65f7ddf6b547d4e1bb752a96c6186bf29ffd52a9d8cebd61ceeebce3353b3d9797c6d1f15ab1db5d83b56b7c0b5dcfb10d68c963a7b819e2090645cb3b2be0c85919b114aafc7e08db4c5f05662a74beec2ce7f33a020987743e9fd7f580c6b17399178aa77c230bf1b0afde4ca9b8d5cb18442441f4ea54e5923adb44284cb0478965b5f7f50bf0f3d36eaf9210a5fbaac8deebebcf842d70f2386bde916c04120376c876e671f8df173bb12cc11746cb1b3a7bffac5576fd2fd670b95750b803c8edbf761f1f321251110994027bdfc300a0920ce03a18884d28b4878a1dc6ffe6a4710b37b9ec252b40f69902b737267f0cafceb3c8587c5e484f79abc607bd28135f88ceea3adf84153013afe1b415fea01a6e95793eda64b9f6f701e9b6a51d0f96a04f74a5fae2b19db2ad72d8cc358367cd8b6391e12a852f8963b559f863ae850777b2cbb602bd6a9da58b25464aa24315ecc78c104947b608c41d3589798dcf910fe5279c128c99d6c5467d7ddcfbe35e766c9ac",
+          "padding" : "3045301106847fffffff60864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "ad84f260175f9a0153420722e2d76c6de0d2bb38edccf510041f35818a1802b679b8b1ba3688ea486da1c58a0a22177c500d92e5eb880e6ea0edb543c30f11733e55167ef90bb3d91e0ae27ca2617f3ddf5cf2257335458ad65959eb6552df443de1dd3128475ba5db130524093007b5d4b7c6ff85186107152523b37aa1981e4fc995c1045a018e3559be52ab580eab73424f0d344612be29197b4bd571fc34287c987f090c639099db693f9b85368b61b6a506a283116df3cf651880959d0c98cf0e0372f4467f30b57eef683ebd057d6dc8a9b363bc9589c10edce9c522f2f6df7408e9453eb9439050c9a01eeb95f9a54a64c12bc8cbc883f23a4885c81b0d2fd01459cab54060721ac7245ab1b4cdc6b4c1c9bb4414a3d4a92d273b5edce9f947b9c5c238c10fc383461e3eaf11da8677e65236e70ff18db3966aa07cf596814ead0dca523081b47798dfcc07415720705a888b21d62316c675a8a3abf97deee7641ef7418da715ffdd00de54706de1bb458763142eca28aad1ffa928a06b5bfcb28a1629f1a606cdb6d9af8c0f93425e57cc1dd6b00b0bfbedb8f2bbf7f462cf677dd4483e3178558a0d6ef3cb4ad55f5a302b8d3b4d83ebed4accec1dee8a97c308f86197c4a9a2149531739ac00d3a832cc7f9cead2e8c3fc7c8563040503923090afad5b37266c297452b527211526230bca293bcafda4423983799",
+          "padding" : "30453011060960864801650304020205847fffffff0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "056b0422a3c52fed3b4245e6d75557810d0605df9630c1c82c2b2e2bfdd3321a5e5d27a5c09e5babca9c489f104c17d1b185d6e2e471940869c65312c8c5fc3bccdf97b83a0307847c81bc775a2086327c825f063cc5ae421cecafd00651eb9b4404e8714ff87d753e264d91ef350c41f9d78bf48082fe70de64b29da11b139bb4fc3057d7d956c0863a1ef4e73dfdef88c7746175298a27ad247d6433f3328d4dcd81674cc58005b2383d175700798a55b08d4036066f8a42e021a455a753911a26a0d289f7fe0e2e47bff5e9ea690a5db22e78945fd08337314278b39c0c793cfb1756724f29a730355c969ceae1b2f5f128375f2557bb9f77c4d4a0dd5b375435afb0ba57e9a8535e8b18639ad594c38ed77f53e441cdc6b09827ed9cfd2eee3d8bea950f36d707eed98f4dcedab58ef866e61fbfa5fa12a42e776cec9319e578a3ec6878bfcecb073140b0c1cd3a3b57b7341f743a38cb203136a49cb037eeae34dddbd0fe2b495a508567514f9ed2f663325aa751dc689db7e4fbf94a4a42ece4b7fec7ba1b32c384cb5b083e3d3dadadf1ed303a4f3b6536f648b64915eba1287823834ce0fe9e7726e8714adfca53493ed5828449f1737e3d0b33427e4a1b34341272a8a9ebce78402abe4416292d7aa7e342402f92ca5284369fc8850bcad65e38af3848a5dceeb8b3c2337355e104a6f8892079fc4d140b165aece0",
+          "padding" : "3045300d0609608648016503040202050004847ffffffff9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "d5b62dafa940c5f752457503a90e75696688f04e3723f25ee50765f7061e44a4a02de87395f70f0f13c163fc6b458d3df6bc4ba862be1299858f065373d2bbb5d61c8e43c522cc92ac612c6d508593fc5bdd0e025458094689298a1e8acd76f2cc777d86a430c431c7b1b119c619399ae89a789d99a070e2abff83b93c2a79b8a066a9561021771be167777589612053b3810c12a58ae994ef56917cfac3fadbf9e0c5538301ccbeb566c3736717e32d358e705be486b19a66533d1898fc4771e87929fc25ed6e76f16cf4b9e8801a6846fcc1e63c700e809ac2e4347735a17abf9ac04f6a88fd12a14d36370dafe73e63c802b917b474c6b1bf9e39a052b4193027c4893757f92f6ea8a5bbb7abd4219d561dd0b765408833a84ef118d50340676f8e108024220968416c71372b74c5fd678183e632e814f286f329555a192d2d0d996d47a7de6ee27ba68540adc9b1318fdeb6e2eac326db64cbe4ec7b6e0b019c5171757600eddf9ce00a30591e0fba2fe9037e14d8db08be53de4c89b14849d09022e1b2e914045d9900c80db8af2985c19957c693430ce47f1492c1df5e43bf22800a56be0551dcac39c493db50fc4d47109c93b058c487689c41c5523eaf98e88b792740353ca54dad3f7fb0e143b85f90493716faf91a43ec5a640784e2ab58c5b268ee44ffff1a41b57373b2a6f605067e1323a6892a0f0fb73f4249",
+          "padding" : "3084ffffffff300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "7a4af45432969bd549b2425cfed92f2632f12a13d73f742dba27c886f2ed487ab7aff7acff1dfebb3f3c56b5ca804c3604c49fc328e680c3e1490e1abe753de6f798b7a4472dae1b7d992aef93aa1712fd2b016ddeab87557c5309056aad97a77a63c9668067560fe99973e78571c60e0c41f91dd9b6a6029cd911fa7f9d6145d34c4f49a46fdf0966b2994eec3707a84fc3a473d6d0279de1e8c02a50cdcc9a2784aa956d76a1aa11aceee7032a196cb03b1d374403700757c55363000553c18eed69a31658c77604792b2b9cef101d63c9a16db88d5572be93af8e1b683801bf058456dd033c12a7f4058bb9e55a8d318e4af0c3c62dc045b6c247c80a018485c27d107f6ff8d83bb234f902568085079a6c68042b724577ad18d82b470bec73af855d0b51cccc505fe3199bb7ebd332e7363f50743710a4812240114eeb1184a2bc79a33fcf69f29a61677ee15785d3b419f3d0a82fa32272b05b85495bf1ce2d2e4560aa0983a393b94b247350fac856b28799b84822567957a49fca2d4da6488c7216fff1d4895fcc8e62658643974b8c299bb05fcd46158f929446a536f8564a806e6b37b3058b2465881faa8157b7ec838998fec9fc251cb33630b1c5378d39960f3835b10aefa611bfc1ad0d11f736b9e56a434d2891bafafe8b42049626a8a39325b307c992ebd46f8e0a2a6a9f00f3d7e103fc18e7e6e624760735",
+          "padding" : "30453084ffffffff060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "0c7b971b62c6a539a0f1c217fdf2796fe862e091e98390e752972fee87adf3a541d3c656962aa30f641a28972bd01f2074133f2077477e474f413b5694b872622a1798c776d001d76a2268b7b00020236e95b47f6dcc83e46074643d69545d4f80978c4b127be5eeec5dc87d3e5820432a23b717d276e86ab42eb9c87bea82f602b5036d6b28cba431460bdf475f2c74104d1155cf8004f083dd257aed7048428085a7c345f6e8359bf19a0e6e7d6ee100bbf706e3c7819d427d76920f0ded8d8d1a24c35f182198eb7f3d53bd4f85a011175d2bbe62918e3e021a1273a808bbd3639bebf3792ca0f6c4b541244775976815d5a1f989ffd93e5deb1cceb61dfd10a13eb2ad6b22ae6eaa8ba8c25bf64525dfb440813c5b7486c33651add322f833483e34e16527c5cf5cd881a5dc8f75e369610a301c6565605dcf0c631994bff502872ce62ed85a86412fe40af2289064a551ff8f5e22a79049398933a6d5dfbd4d525ac67781fdc680c9c22e40c0b92a8d25842c076570a983b852957dff31361fcfee297548bbff92be123361d6253adbdd0c0d8bb9d38546c79d59c1f9a09d711bc1728e68ebce398d94fb8244f1c959d54f071c321ec9a69a255e10a69c521d9a1a7128f61169a9621845cf4bfa700729e31edfb9cb9a01cec36882a1d31f8448b63be4d98affc9e5132f171b93604c83f8a688dfdbbae596d563211c36",
+          "padding" : "304530110684ffffffff60864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "24e1fadf0da791af63242170a1ed87c2dd8c9f66dc7c5584b953fa27cdacb3e2eb0175086b34b402bbf7da96f9e5cf6726a06d6472b818701b963530b9fdc8538cc229f0c05d883664de6dc58e0ef822c984bc83db6266f62f6ef6b661e360a1feace84ac3070ca90ee424e19afbbb6123e4ea1094078fafcdadd6a0e7c5b3a10ac38fa6456927021e5e201d5dbb32779e962252950bd3262f5951bf6a2d092e61e3610fd9f8f888a091fe95d0e29a6b519eb1808906458780afc51e476dc9c94d4d15385a0048304beee75ac739d698abd2372f59b107bf31c9af2d6a3476081c7a9a2b1faa1b7b414090f971491205d887dee30ed56e5cf43bf5ba160d6f4909d8cc35015533de2dc7948f51947e268ea29694fc44bc20582ac31184975ef043345b3296c7776999d2b65a5ed429826f658c79db5da04d511b01c2dde23cd0af17fbb95a99bfd0cebc94598adfc0c6aa58f3c6f24a2535849e094d8e87a860e232acbd4bbec060daccafa3fa1fa8b7dd68fa0374ae4feb71f7afd9e9911183db449ec67c89202d9ca3eb6319286b7377733abe0c8b215acb640352267530ab307f94f0a70fc86431e7f1920e97a2f67ec663418350a820ed5bc2df6dfcb05601d24128720eadc5068ccfe7d1df0391cf0427c5555b611f4c9a5f3748e525bb7d1de2bdfa37b8787917fc6f72877e2b9e970068982db3accdded9b533402a0a",
+          "padding" : "3045301106096086480165030402020584ffffffff0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "db414598d4c4387f225934fd5e4c72084ff10722cc898dc51c2c1d45294b29ce712a53a09b710108811a46b33898e0fcbab281e029152fce0b5c29a83665252c7f205993e1f13d9f66e81e6e9394b82f107871cbbd72a44f04bcd433ed44e05c33029b0b5ad1e1d0e0c9e318c2c9b67078b14b75222c162193635f6dfa120429b1e0a4903d9edc3b503909403f2087f3f1eee09628ee7b74489a99abe3b7c7f6d76dcea609035f594194ee3c370e91d6f23d5d397235b07478a61bf983617b999a39baf9b008f34b615ecc2a6bf1936546dedab2b6082066ebf3713f6ba3bfd13733964a8daca273fb2cc11f09658ed20de09095655eac231c5141553d5ff7cf1fb90b4af73e12635b190270db4612a0e3e728d2f3e9495beecb5f05b2d3b235dfb823e1c4dbd5b6944d05f10987a6eeaa1471307483fa0f089b1af4f162eed20567c71eae78f4a409442f05e8465fe796fce7b2ba6ff729d5688d04d4af0f6730836abc1516c3cbc60c29e9883ef270591e98588da2b164afa4540e7707bf162163b5656254136b02bf1343f75b03a28e57d1cdabd20d0a3b0043d80671235e8f617748d4c5e2e574376f6b4af3d4d9222b0f660b0fa24ec53d5532daf334b9da6e5da51b07249579346b987d19481ba501237d82b0da87bb8f69615478bc9faf40f26d190b5dd160ca75226842db370080c0e861a944f97fcaee673db1dff2",
+          "padding" : "3045300d060960864801650304020205000484fffffffff9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "591963c2164e2ef706cf711051010a9bb0e6f3bbe51e77b211431fb7b818873b0f4b62da58f970aa0f397dc65ab9c5a2cd3cb1cd1bb7b10a14d56af37814955db4e5bafaeb5e22956f2adb8b37d7db4753414a7551c287d618967bcd138c79ce2a8f590687285c14ceff93e7acd18005e64221cbe671f2dea1ece956227893031e2b4241a7f7bad418579bbd261913be9033102a03cdc1e3f509cc1597863c7a685921ca005011ec59c22382dede35f94acc06a19660f812e633d730b6ce73468508baf78a072a6b8428bb83f6c5d11df4fe14000fb0d8ecb12f8bf4fc811c1218d2522930972fbb33e0bf4927f51f5921d58ae4a63ed7499761937f482a22ad45efbe0d64e6304be819296a551f958454efe0685b921931a0e5742c94b8fa23ef472d0b718ef96476f27aa87a18562041ba1223ea3401df10ac43b433ebb8f434dbbfd1cdc509956df61c49bf6205a61b36b0df718ae108bd41e91724048c8b73fabdaecae53429ab2b57c7e13bae23a148b39639ef331e0c77ddb4068b1699dcfad43c7170e41c2446011e58ce1722b8276cd69365f798e0bfefafef766e41b3d0b59c8af8ef8f073ac6f540a2ddd6a1aa8628ae5100f0a2d9e2db9eb449e3d5a1c7f01e7cd52bc341b38cab3b26676103e19800391569f73d896fe4440bf3e97cec301fae4260fecbe9a0cc720f5b8c5cd1263456186d77e5c2052870db42",
+          "padding" : "3085ffffffffff300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "8e09ddeb3998ab05c2e49d3b184db86d9d4a19680e38fc4ee1116ab488b2d51d7bc13c45af9611aaff2e2b2278439606cef737361c2a44f705f4797da447154ab72eddecbdf6c0120597728983736a90ffb0bdec5787de559a58b187422143fbe160dbc1ab03cceab3ad8053812a68e9dc87df1610bb68b3dfebd7ec7fed78d7dba4563e5b1a30bbadce6886fcefeecd3f6e3314087a315c1adb893362a32831097b099429efdd2815085b78814a73ed1a99e803f7d10b522f540a2b3d02c6c5ae70f29fc35ec1ff6ec8a0779b6bfcf91c509d423118efd7d9c91fd011e678f6d7adfce905555c06bbfc4bf7e2f5b8e8bad468bcd1f2b3db9a346f68063032c57d0715c7352c48f1171d32943840f5ada9142c50f202f7671b5b4a12b6b516bcccd488c1717dc49025f49c59879a6494c19e2e27445cbe9bb2b3743ac8dabe1139465b8b81939f9e2fcc90b6432b1021a377f8ce728c2bee156d3127163f96be29af1a149e69a9d3834c60e7ad12069933e11e7d6ccb1f36c442ff51250b6c10502b37071dece766b5ed55a068e2b7329ea29b7dfc8f841a7cece5319a14749967b42931e27eb832ec749b9ad8b3ae0802608eaa1fbe4223993471f72ddb90704fa645cd0d9a25da15f2e4d79f949d0e6ead887c309c8cdeff60c5d1990f358ab933077dcf5e6c04db4388da1e93bc3302ae6b7e6efba0f8d3eab4d735513630",
+          "padding" : "30463085ffffffffff060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "df87b7a14a7127daff816395b61a9d9b8f6055460f79962c9561a94ee33f766f8fcf52879859f11df95018eb83abf3fd08331fc0bdb902104c7a931946a638aed114b0e1141c669d31516497945e2ccdbe386e1cc48fa19d9a3b4fea902f8fc62b8977bfd468fdf0e6b7cc2ae4219ee8b42b1ff5b22d72a0c60aea95cae3f7fc542469b3a4811925ce493bd9763a4cea8b87e3e4372d855ca61779a88a51832f72d8f96a31b5b0ce2c312c94cc477febc69d1afbf9c32258e88291d745442b153b4ad31ac376287e9fc20ee27442736d187e396f089f6ec80ec38461bd28af88165bcc5676fc0a09be3c0a322b07ebadc1e90152a50131719ff676efe3624056c03a2484e1745754c58d78a38802969eabbb9a750de6684543086c3b42a1d58c04ab222a465578af09c644e1c7a25bca4f3b5110ec89b5b8c6bc055706f0b4af09e772bd05c5f5dfd8b4e2241778d8d5b6ae3275208a016e53891618d6f6145cf5a6ca613bdacec5b75e183864c61c8354c9ec6939795c818353b8b99b043a2afad1e7b6bd2e91cdc5230169fb551754bfd2dca793124c3c863e7be8a7387ddea9409b745d952b53fca4a20cc29b6bed8bcdf5b2f51ed34721c59e0c630d08d19abbd7d95f6d12892aef338f0c57fdae3b67194c9906d09ffafb5588fb6925ce4a2580e7af10831efbe8f56e24c3e7171239af5e6be3303331c59574cc910edb",
+          "padding" : "304630120685ffffffffff60864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "4e29d514bab9cdc8821f688fd7c846daab154661b0fc6404b45a0e2b487b6ea8a66eb6bb7822e10e3ee4ce601207e64237b29f1e7080fa059c4caa7531ada59cd7d8d9355f382737ac4629273138912392120d5da6ab617e810cce32c67c0cd459ef2a95f8a153167a285f21b67a312a01c150ca94cd9cb6c204b1f98a45705ea48566bceb45a7200f162d30abfff33c97b7ecdf3abec66407d69c0d9bc8964aa8d5cc183b0ee0873bd3bd62d0d29838b1ae51655d2f0af2ff818730f5b26dba1570d569d271c874395e8bfcecc34035c0a216881f7c5ff6bbf715397c2d64119252598357fa9dbe2fcbd3bf76d34a35b9abb7ce42e336b00f7cd1e0369f296d0425fa40102120f76684def5c4d2cb1f82a9cbb35e0b0c62901c676959aeb8a469c07c21cf672c9878efeedea12fe48a10a938253730d2aa5df7277e401bcba1d83a6da09f06769d9d15d4c744ec39ea01135a645b89419197af49d0c7c71f8d40f578282d81f6f3001a8ee6c3b9353b458b2b3db4e66a2969940d3a2404b4c4cdeeba15648cb98989f9eed34dfdadfaa107b9d089d38153099fbb8447a7825ef41511af710eef6c227b1ce034c10a62945f40ecd388cbacf547fb44b8d533acfbbdbf13e078979aa2189aa533decb86f23b7fdae67c48075917b32457b4f67ba84b00e657bea303e23dce601f74a0aca78f6c5ef039d766678770111ff90ec8",
+          "padding" : "3046301206096086480165030402020585ffffffffff0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "11283dbc06396d4c41d44796ffa79ef35040703def2dd15b591abca401e0929ea0eed828b8c495e63c13ea6eb39b646c91a57368d93f6d3546e875b573d05d538fe9bc1cf568488aa150913ac5d0434989e7bdcd86363ea056d7d95f41d8de4926861c9252b345de78986fdcf62940fc53badde36ac81618336e345cc27117533a2e6d92a31b8fdebd5d3d439f09f868d4a0dbc0946516bd833806f722698b1d6b3e7357605d2d1754f4b88371c84fc45ac9dbaa83c1f490f1c5a86ea4154665adbf9dae438984f1c7b2357d6dc51bb7da5f4962f7bdb11f3cd1eb502dae227c61123d9d62fe8ee90346601a0cdff03743576fabb6e93ffb5882d40e4acd41d8dd40819021432d035ad981de1e816a528e31c6f0670d59cee80c0f51687c27e600bddff43f4e15577745d34685c636ebf17c1917c02716bab26596800a43b80e6a46bfde3346945baf12283ac9c03fd0a8b693ad8da48576169132b730f608ed60390efc1af09e6759d9bac49a9b5baa262f071f21f701ff0cebb032b2a755c6ab5495e96c5bd28c8c3956b93eb353eea6fc832cb6d9a3da3b19abb6bdfdf8430de973dfa02006c110a8bacd705b2cf0293783728fcef3faf3bf691975ace772ad4f39c6372d8fee7760bc8867e6b2cecf2e80667ad52ff1d51dc8ef361204e66c1737b1a2ed42883b01ac665177dedc96d436b8780a14bd69b1398c2c27bbc6",
+          "padding" : "3046300d060960864801650304020205000485fffffffffff9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "4dfe3bd4db47837f8c4903e0db204c2d14c0977691f66b21b0036bb849c4688f1472587fc7e1eb6752e41ac492fb40ff14914565998ec30ec3d9963c24167002e1934ad79e9f772622a5d74eecce81fc5e3c02790771c3e44b9ba3eb82f3dae44910a2a5ccb3b4bdfe05d7d0789bbf79412fc27df50b3e7ed7e3016c804705dd24e060a60b0599714dfa46c4e229fc3380129b9e540cbff28fd367f6f0fee13ff47dd2f77c04f18ff123d8f0b02dc8979c9b7035ab1533a890e49b2e19a6122e98ae4fb08978af7486e3e589cb9924cd79026a3262284f8c8fa13c8f29bfb2869a3ce1daa6f2513f939e1e9dd5c2ec8a8c3fc47f0620b38af8bf37059c24d6fe922ec1c9141a8e4804389e328607ff918fbb5e3de846479e71be55ccb4793365b985e4a2ac8b78ec2a40bb1f09ad5bf08bcd6fbcc3fc1eae8dbbc3f6f819e7e4b8f592e8e212eba13fed31483631e0bfea788de85ccccb45307e3a873f5088a3d5e6781eb5223d0e49dde2379b413ba1fce0197734a2a4f12204b16988d576a3d2de4b8f570bcbf5c5e008a9697e89ed47e837428d413a5faa1e98a73d92dae13da9802f615a37415d74e0622f30fb5f637890b28876da30cca8f36f63b755a8aa3f9f5a0490c250258200937d0d8371cc9fcf0cf8e22206a7086fc1e9335d496265a3ff0376f87724f7ff763f24c63c630a8da0ec4d762da5c4db57c5bd4bbd",
+          "padding" : "3088ffffffffffffffff300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "42b9b53d0b6a1013f99a911e61b527fdb2c617ca3df908c74c36ee5a8e856a4b803bd39823bf093e191712c7f6c6fd2e08b0ee793f681ea52205d0c28d8d9cc09d7eb42a5227de646665ffac349718bacb75db619f5b04e920ccb44d45d6386cd697024193e68f39ca2b66906fb5575e9f0ab9d30462a8ab6daa8da2af3403584faf6c5d90801a599f9f6ad6aa8e0b05f9dcbd5da4a816b0e2bf89999bf462f3da047c26c623f3f00c928a1599afd4b7b902716d81e37c82e37e85a6c2e2cd6945dadcd3b0b4ab038b2d4b864358615d4c2d131cd734581f4542dd9c66318828247bff3a5ac977bfa6b6e279a5f01c339ff3d77ab1e35ff268f0be286a0d8a613410be65079062dcf700e262f469295d3392c747226c2a696e4c1b84dff4c8b77149fb9ee79a5f423952df41613715c021354c7ae88f4637d5209f5bfc5d9079fa578425e6b29341c12f7776a6b6386900a2422f950acfebfe4750e60fbdd26f3a9be8db57948e40d340b9ff6834b0893a6f4cc5da6adad48096348cbba72204215cdeb1ad26f772c7bf78ff1bf6eacad8da89262a6a5df69e7532f80f665285cb93b9f69a2aa506d652eb08e6f2592113619e32e9463dcb76d2b21cc298a130379dc0b368596e3b039a5bad86a88b0054225d608aa3e3ba729d3fef1fb9720c9ec19fec34f8002651ed2467764617b0a25c368747853760c3b31096f65538b1",
+          "padding" : "30493088ffffffffffffffff060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "9c5700b7d722a8f1f83fd11359fde32aad1606d20834a7b7b84b22bf34b18f5c383a34f229b65c56f70e1347632ab59a75821ea623d0ebc09c4005c0f32a86e1bc873689ace2b73c7c84b91fe270f457fea200051e041eff72af27e7b773769d37d5569c02de5a101467bbb014b065bdfec7780823e83199a32064cb2149c8ea388162f7a2e3604c7c33e14e5cbfb54e3597704026ded5670f5efd979dcb80a0b5beca42e5f49ee80aee7a81348de4616e3b3d723dd4fa5e73c1f56bd9b3276f85ad8ace654fcd46d7b6160d8ecd640e823432a074d4bef0ab0b58a0dd14943e710b7f6d7d23abff0cc855b7e932a14c9a6a0d550dd28a7dcce4605391b0ad128bf78ef8b550187c4042ae89570670587b8f1f422b12b3cb20d095788a8b31a388efafe616dd1841cb458de9d45829fd1597e55ee0c24e5f6cc71d194fe02930dc371f1243ffa4260a03129f00281e8000069cbdc8701f4693f94d6679807e28944b40317ce760b8ac170390233ab0d00f4e42f1e514950c7699215e2e2cb0a70075a22e554b0821083ad45d63eb8adb54cd0063665c4cb10f679ea3caa647fd5488bb3af879a2f2facc56efb97880a168a3c656c4d100826936934253c47f87a26490e51843845722862b55daeeacf70b7da98e76b497627de060ab3ba712dd8bf9e1a9e15dab3d4674dc32d2ff4caf9b30f81c82e4c302f7288b762b205ce0",
+          "padding" : "304930150688ffffffffffffffff60864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "9e61a779b2a12e128f87cbc3097c4c4f76fc0d0276cf1e7a1cb4eced9fcc0fd4f545e247c6cd6bdfb93835582f153161403efac0ff2b604420855c668691b067a12e1088faa1b0570b6b33821b454b405ccccfa60a9d240beda3ea295c750f45a80e316b4c416a901594b7406decb58ce6aa412a9040807fcd50a100b7fcd882246d1d6924e587a6a625a0fd6789def10a77379ffb653c96eca0ebbb72a5b300c5477ea534e6f853f1a2865f5713a2379835b348ef0e6e79c23812d6231214237c9b19dcf92ed8b474bd5dda450aba3f998854f123710d282878681b92134b851458b071e92863f0305d959bcd7689e597d03ef48ecadceeb74f7ddb5546b8e21a9d3e49505d16520bf67ad8a02b1ed660e6fd9288da454e43d4d45d32ad2f4f087c24a899bf74f0163af4f7d058d14e733a2078001bd619875e0d603614a95b76d4650b338f6cd244b1fe2cf70230f453f84db1abeabb1e8f70cf2650bb3762e3119a156fbb8c5c1dadba6fcf94bd607192bfab2dcea15a6184e71b31d038baf93998e72135af1ee22c5701019f4ae4244b39242a603e983b919efa61c221ab85254d43235ee337b064131a52ddfbcb298d50079c1a9e84700c688f14cfb1c673f347becb6dd337c310f57b800d12a476c2e014efa85245cb5c587d69c3fec4f59bf2bd9482233f9d7a8fa3290dc075df31339447d44577a27682111a9c41c0",
+          "padding" : "3049301506096086480165030402020588ffffffffffffffff0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "df34b1f8f45bf7f30425d81e8bf759ab02605330d5ca334ed2358b7098320c8cd2cb393b8fcdcf3e34b5979e8da7a39b9319f75d8ccb7fca4e67e92a8d19d4597bcceff395a9f27b9b97074e45ba7f041d464e543017a608b6abcefb4d4573eb864278dfcefa71d609ba6f806c95172bb7262f6f3fe586d819b6d6474909b8c03866c43d4fc06a028f30d574aba042cfd53f33a6c5f17ceb642018d4f65f429c4f1993c43c052a796297a5374a77485de537a3d3f94a84913367a90a1b25e9918aae8a1af92fcc6a166e90fba579934b04cc3f77b9f00a85f7c9ec0bfdce253a73599107567e73dd0f7eaceefa468f6444be09e8f598b197de5d81db3c54ed18bf6378145b31842473389c9c818ac5732af3085f44f2d273bcc4e9fe39dac188658f94f02af5f80a19233b5f210fea84d6864709ffd726d9e6d75ce653b2b2c628a355d0abede74a39a2fffcc9738a37bab90d4fd0a5b625e695fc36d289385e2125b55a4d3776eb42f38c18e9eb2231ddcdcca400b366d712aa140a1d9ca6af3744fab95cef9079c9b7b9abe8b93d64b0ad7da07ac6198a497fc4f827e300a98d6b572c89e397b3fc6c443168b23feda2986915d27fc857924cc5ae39ff3ddd357178cc1fe4e57ddc1bbf1548912a0d64e970ee4169b04e24c21fdd8b9046a6c07fdcf191d16691aa091d8547717c40374de170686076275d9231e90743604d",
+          "padding" : "3049300d060960864801650304020205000488fffffffffffffffff9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "dce897567a75219cd59c02c7adef6038f5e937aecf7f1abb14163503e7a37a958b6fd815d088421610b669c47dfb96283c4e843dd6552598d5a10b16f4b638ee97005e13943efe09764f5eaa29227799477e4e10010d11dd09b9964d32d2c0dc5812c282c24d6fa3a2322f90a27d56f8d7d457b2c0965f17768a8c95c109bc73a0130c56fc1c8a2275e0216409b79dfb3c83055b1335006f76bf2eb629d6b2512d022c1683d0ef13af008df0db74cae1a415570ad0bef58bbf6f41ec3d69ef7f53f098b04c477a082bf27a3c4f913c88f5210618873f8deeb12ed59b758364ddfd3d1b19882f085a982feea5fb71594e78a61b0600ff8d460b29af6d155246c77de5e65866dd60b02de47722a898e1948d3e7f083968c9fc9ed995239525af099a51eb44fb95f0fd6f33045e38113ca5e8f38b7fbb2cb3002ee816fb88f4855c97ffc9170e5678d9693a246dad58e22ef4a28f98e235c80e26d1d5f8abd063535852f4c11b74b899a485dd262ce07ec03032179d14226a9b3ccc46bce3add8fb4df08c4678f252e55a972553514403e1804ce5f1e2fce2cc3fd2e7ff72b09d0a1fac8a51e8b4d7391936567ddeff3d1da45ae4c022a57318957f2a46ae8dba2b12623e8d681cfcef63829df00a50983666dbf4b7aa5bbd597579520f20aafa8ee0f7dc2383ca0717d22fb35ed75c9dd65535fdfe95684c9ad076a8dfa96f67b5",
+          "padding" : "30ff300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "7996321602d0a9b5aa742393e774cae9e747a4315dcfd17077cbde30abf1bbbef88d208ff462cfaddd092242f6d0eabeb30638f50157bd844b80e02fb00ebf79b3d67f83534be4f0a65f244bd21b947c379c71cd3d75e83f26ddaa7e643c5ba00ecf7bf18a8ba71a5d200c53d70beb1781e4ed3a1421b0a5aa52333763ba5c739287a1d8f0814258b292e3de344030fa099af0ef5986145da163bf7a85473704daa88116b3a079cb8e4685dddefcf3f8cb39987200a94bd82012a95f5b564cb958aaefdf6f0e84eac82b93004ddbf4ac434357605141e0d03566ed55596c0a4f5e2fee6ca57aa85d454cc11b3f002521b3f59c7e2ecdf0e55f5152625f7f829c3172d278d7a7ec2fbc31ac6b09d983f73bf8fd8413555d91a99ba1c95ddd8c614e7595efe71136f69dc6903f28914b1127e6d6eaf473d56870221abf63977669d215dd7681e8b95fe6cfbf6592a089e69dc9779187fb88536f7ce15fb820018a4b05b0843a18490c03ba611bb07f02d1150ce2d5a2c87bfcdf83b196564379413b899912baca97e1d19c5af7deb1eb3991ca2733604995a2e8c801a1d813b4a65569238b961655e19143610bfeda30f0a6c0526774a622a15bf6d91d5ff7a3bd87ad81a85c20183e9e7290d49f0a5c2e080453906a5f1e67952d6e0e5097c58720519cc5b8b52bc4f63aa9bdaad6d8052fc9e53d670df191d89c5dbc2d7359f1",
+          "padding" : "304130ff060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "84dc441ed215a1b7afa0815ea15f403da0b53709b327a8ad26677bdd79910bc931e84f6e0a9a0617af72c5bf284ee1c05aa0029d4bd5f7204404d58378b5150746097d2f650456bcea0eff70ee1d1371a8b3d14564252bcf655d539a666343883941b3023b095001cd1b05ab45aeb3057bb40f8fc1100108d9c1ba4fccbb776965ba45a5a9cc6eb0ecfd230b0a2c4da0d8ded54f12f290f681878ccfb02ce97c8055f29032497b87efec10e225c204315adc30921de222e4f2fe2a92f995152693f9048700aa127ad651e4fa8f6aace224953a436fdba27470f239c7f9a59bee180e2c114b7e435a634f9cb4ddf49717ec10e95db84fbeec6bc6fb09a10f613c6d8ae9ec315db947fdf8f116256235b02687f0bea2c706637ebfc309895be00264bb462348d524903cc8b134ce52f407aa8c871a829ba7cc568a03b80336603af5ef3d55e54f4bb1aad3353df4645ea9229b3a84c83092df72b0ad5a6ca0972c54f9c1dd7b05f3b8d45e2f5161bc5c32fce2cf9a35bb55e818ca267c0aac225a2e3b63587d9391094596365b3132eed6ce24299f365495cc6029480c2b9e3562d8b7be8ff01ab487c39df67f09ed69fe586eb1875ac71a7a2b696db2362037b8ec4f5f71872119fc975bcebe0247a8bc15cb61bfba478a6f178c1ee9b2936dfbdc0b408ab056d04e9848a7c95c8bd9b00013eb8a045f32a9ae4017557a23400c",
+          "padding" : "3041300d06ff60864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "034db01968cfcc19d6a59c9a15214fa3a7f57ea39a17de71a1b92e4210b48c9299964ec353a6a64bb185e545aa039b7967bab630ac4773fce449ab1a6eaaae89842589d6c92e0047fce4e7adc71190f554ad592c4975cdf6c5b0ce78b3738040d35fa0515479a0967482052ec9a0bf7d00ad2398eb5fcc07ea88682e158da47df3bfb0d895749b1d613160542b1ab30493344a279bd1e9fd4222951adea977cef7ea3458e16360f00ac44bfd8e6fc09e3f4ba5929e1bfb0a33909c180346385461d4b619e0cd2d2b7c30f94cf3192f72ca397901a0d385754b7f80393bcdd5bfb00931ae15194d0c83a8e6d4a3ce682c9f34e2d8f0df0941aecc2aa2d632e6b5a6053171fe54ee84318f305aa2e06280feb10dbcb98b0070b0db8b06209558b6404960f809d51085035b0d032cda67256d747925688f17f98d3f30895a435314c76f6f6936fc6f93b53d117fa0a99fa3953ffd614899ae2dda61bf695935c5fc408a1322ff8678c1a239d8733ac9b65173d4b04a24fdc3236901431fa195b2adb767990f6a9e1bc515e6971b5e34ab9f426b501df7c6fad19db554121a7d955e7fc3e9c3d33abe0198b2c8ff870decc2e3eb31af4d43d895147961278de29e9c11a67a5abf83b0ce89aeeca6e7085ea8ae30595e0f11e0eb65d0252e0cf682c813054b8f05fdb9d77cbf85207e4eeb3c48b9ca07df13d771218fbded402b7121",
+          "padding" : "3041300d060960864801650304020205ff0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "27c4e3f4b1afadcf0fcf455f2973f0c261934f3e4876020d91106a1b2909e5e7765ae76909f33a3fb40788b50330ec983764d2692d09f63cfb0fb109a32c799cad3c1f6cef40959a47eb988c364c85a70f6debc4adbfc9cf5e322b4466a6cf3272f897f072626c61e9d80b5e8f605c71db0a5df837949b023d9cd084b74f09a047c97822f2d9ca140b4a1f7636d49e0ab72d3e06935d67baaeba7eaa7e2c04216020ce84b3b8f424a46f615f1547051af2d9c0eb37a5967b77bd3455f32b029c1377bdb8bc24b9715a4ed04901d117ac3c2e243ad01074eff35c72f23b158b04e0eb5143417e611a5933f085161e9f99eace1c06eb0a12f0aa0e18222c3f9faa53651b587d48c1b455ee41b57b6fb592744b331c0b61962fe2f8e011dc891486bc1f93cab761d48b28635585217ed652cc22b7edd433226a62685405e086df7cba2942b728ee21cd3defa180865fc1da04edaafd86546f84e4569f763ccd70f560f838dcad56868967da89a6271d8e5daecc9b81d2848f8da7223628d016f6a8c8b7debc6fc7f457f31fd8d7e8dc81a9aa826b15569e9e28f9b2d807288f18f08f24ecab89e5d829c64a7a2f304a4b44e1e84966934b86e6d81b2489efa05a72fc8706460b305406e7340130132a7e16d5830dea332c78b8d8da73557052b22e59389a17f9ba3677a78d685ed435e96eed10c073f450a0c720ad3375946e19d3",
+          "padding" : "3041300d0609608648016503040202050004fff9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "7892f12ddbd48d20aba080f3b7c92cb5c918c416a2f71999c89e790e92802968f683602929f8c37acaf2e0a7337e85b5f0bcb9e2e9a1208921d578b24eadf3bc8e130571648dadc144e07f6decff4ffe18a944b8feb38474d9df08db28b65ec155d168f37371708af138316be70103e8f4a8b372ac0d3a9ddeb3144db05120899f8759a37ccc93d0c0907c83e401f0f3118a76ddb2ef14c62a304f618318e2fbee1d5459e48437ed45f5c5efcd8a85e420d350f3c24dcb5f0feb1491019438e4d8f49317f3ec670eedae0d22fa6be70ff190057bd7c9df6411e2ae7cc0f35bec1066bc23d7f2be90b779e017f3b9499b32ce12547a98cb50403620eaaec33757bfad20c55c680fc8e5b0a9d8d9958b1fc377fd34739369cb9118b8ed40db29864975f4451abc2f0c9513ba1d6821ce65c05a4f7d0af7feb9267c5c890aff779b39e6782c3918521ed4a51ff049b8fe9e5d8f5cd9efd9e3b37dc3a0c61769fe25a3e75402121329ae5077b6e71f39ed32d6c6c3c26bda4cfda757bc42e5da1c9f6a99359fc3b3c15bae37528f1df374347ddf4684a5acacdc8de4aa5d7273cd91e29e84c75e197ea168004bed8038ad5b42343e88cbdd073baeb3b1fb7c8df155fb73b1f722f4454d649f939dad2b7ec93b309cc10eeee6634bf96b63aa14434e96dd714a72ffe2d581bad37ba0c73dae1dd23ee6d6743f457232ceb309b25860",
+          "padding" : "3080300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "c0a94ed1c9b55121960dc8d128d4dd62753d5198120db43451504287097c746d74b6be35cab6db103c1ae88189d91ec2028b71b05ee1361eff41b3eb191c08488bbcdde888f91d296ffe68b5a881611a104db77b8d3f7dec932e542eea14de6b0946cb8450455e40623cc9869b92142beabe3bf1e50a6312dea264402e079c5bb78e2f01dcecefbe19958a13078492535600fb052860f673c4046178a7f14f4f316f476b595447ae6acd2ab098f6c9a468b5909a8ff758faed6f457831583e52be6577ac693f3b51984888d3977e5f1d70f46e49e72d0cf46cdfa99047a9b684a2317c9b45cfd450e7a470d147677ac0dfbc6447b6d1dd288ea5769b7a6d6d38b536d952d256a1f5055d058eb5d7d8da33c35e2af92814384ab67241422c2124b30c8289fe7c506ef960f6fd65248b80638060421d1f274d12b5537a2b99030eaa05571dae32857fdae6482a6c989e987aa874a2ce5286d16fea05ca099cce49538ee82e2bd3991ac9aef37cbd9f5498e86c742abfe6778aaba7514ad826a3f53772e9e740df5fa8c3e8f88e836f3f74f743023dc31a49897c6236b37101279aa77f605d6f3b0b4b4ada7d2116ef95ec2ea3d93115112f4542a5d1309df787a78295a0b2572fdcb3f0e1eff6c53537488ef7622d980d9a8a2e33a9d69232dba00a6496da1ceecf055b78f196d3f67c80cc6931fb7c83934d1d44a3749cb19e77",
+          "padding" : "30413080060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "c46b6e7c4963cf7d9b40d58052d59a10d3a4636dc71164158099e3d3071b7dc4c706bf3b2d8763ce7f31e7829092aa74d2b800c0274e4d8f203d33953a4b7a5624ad8b8742a2835c030bdb022a96354f930b8ab6608e8c83c889ac5df6c27823e0050c3cead92db5f3d9624d7b4af915e4215bd25cc2e3138ffa07021e5460a036f6c249ca842e8ae704a7c252c7de2291ce101ea28665ee436e80b5678fc84bf12c4bc81f35d813fac8e71dbbab0320c0997170b07e5f06426e66ad7e09afee86c17224671455cfe893c2966b1fe4ff0ba3db1e4ccf541567d7966e29b132290da4705e9769e76e7be4d9caddca5d2c1aad3d0ff87fbc136468e0a32583949b92a395d36d856002f16c251693f147dee1dbf90f05838b25aa43712c2d85dad962362976423edf11631c4099b4b5c4421d9686480765c87e0bb046b2502dc85a71af6cf5264e7959d5beb6e797de18c3fabc79dd4d5b5e6d8f5dbd852463b7abe49c8602eee12b8b0d4a7bc329722c79d57504239f331d27a62e63ad1a9050d2dc3940badda9c55631dab5ad2bc9e6bbbc8d920274d54879220989ebb6d5db5ed6bd2fa36e1510a76a17447d7b1d8d2e9787c3a98e9684622152eb4f65c04cef55670556d747db203aa62562903d5f2293ce38c2920afb41a0cd94c87cd5c75ba84cd5b4ad841c97f32489562a8571cb282b9047d93ef285fcb867be3cf7a878",
+          "padding" : "3041300d068060864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "48821832360f4c8fc6a5bd036c58e36074e0404cbab3edf5f78e9a9a939b732bdbe5909d09d084fc47de1b6ea7bd1ee82d45167fa49934fa17fe2986bfd540b954990e8db0513872844da0b0b1aab4e7caac1ccbe6ca1a58d2364eb0fa52664082e92d7e05e9fb95b0f27f1a8c1202fd4d5a1b97eb61f4fc80afe72c38e5792f3376c32a01db7ade6704725c3697c65e4700e4b4c94017d2c169603b65388792de2ba38af6c758bf6456d61877ea3af8364e8634621e1fd8167c6af3255a44dc56e4915d4ee2fa77b0e1d3cdc3e1a0b2038095a6462b07c55fdaf5f75862d69dbec7db8d6e63b2df7d99f8b4a98093fdcdeeb680bd1631f89fd7fc667b2f7fa70d3794edd7dc70d3848fcbf47d29132fc344d52b058e99d9146ccdb0fa16b81abb1f1144659eb79bc0d3cdc159dfbe64658d78c0a591f50f88fdeefbfb89716d0c8b7ae983cf00cc0eb8c14ec18f5f7317393dfbefd81774f89171bc1b46e6eb0a9f575c8d31b3694184f8f121188f10560324a67c755ccf816632d143679661c0be62869b20c8b99d752255b67bf8d3f7818559218552d34267e82f805c0a6381e7b82fa862b1af81f96e7fde3d59d1b1f883822131f35a3a7f8607a492066d4958a46a339640533f431951c84662604896f04be007578b8fa0be96ae61946ff4d3853c021eee29541aba68f08c8ec32146058745ef14fc1fbef93bf601afc1",
+          "padding" : "3041300d060960864801650304020205800430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "130eccf66275d0518cbf167b6f922525de36f21d9d9ad74483a34acc65da996d1a98825e1b39281415e8724533b5ddfacacc7afeff1aa28e1cfa8d079483d35debe4ffbdd9cfcf06ea244266ce7444ad91e66fcb1d4fe7bab93d29e69726f6fe45df1aa684304e160c2db01b39628b4a69a1ca48305628d3e5a82d7890a0bc44354f3b640473c8d8f82a313ebe86b07935a94e6ca4ca06170227984ce2f8d20afc9858246048b96ba4d7b62f7247bac17c8d130046fe50e7abac7e8acee2e02cf68d6f8853ac58522751853e89eb36470d8255f43924138640d7566d0d2d66d07d49d2056d3b09bca497ec882c6b6010829f88ff48bb526d7215bcc5613c5b89d4cb12cd9d41761e16756b7164b237cddf0937797bff6020a5158bc3364afb634d0c292df068ed29f5e3501c1aa6961566c61d2641bd3f9012c2e3e346537502c50688ace379155910d98104205f1bded745f40ffb766a45dd90d085eda384fb3f112100ad27f437e56cbf4e47180ae2d6424172664c11136986ed53e5aefef07b927b5c46be8c5849843472bf07e6c49f2f68eb6d619460bf183f424e383b5c858e36c2f287f5c034c9e60ef9a92ed861abba9c057227fdf2daceeec04faf1680751285615cf03734a8b07aadd81f5762776a235258ad5962af2db8c206552e9ff77dafe457572e464a0dc324d597f35d89e0cefb8d0192a749c8ab8856754d",
+          "padding" : "3041300d060960864801650304020205000480f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "4afffe50d1173d25bbc0f2b430589925e1cc85a5370b32b3dd4cf051fa80185552ce457146372792abe9238bebf6727e8da06c652ecae75d1a33b254a9440b54cdc0c2f1fa5f82fda4826ed0e0bf230690a451f14e1c9fea3939a141d354e2240a7d49d57d40556a84ea0b1e27f1914f7acf67865c68e52f406228a0be9d5619dbbd0b090928ebfd87a357d43218a0d63fb5e87cd85f4673b0cfa45d578e608476d6e6e7fb632399e5ac7bb65aee1bc43e86919d5f283ac30ad1b21bff19c5176b24a3c5991f098decc122c35e2f809b6afbf9128395d126350e2a9ef50130064c74e30e34ba97d33192069a286214e4d723e1464a1eeb804d68dc5408252f1c420b98ae118fb50e290b919abbbc379aa5a1a2cec88982feec6029a7018e2b6353b7ff5961dd6e44dc72ca97318806e24dde46dc0f1434c506e070e31b76f4b731661141604047e93018ce7a2cbf3c38b8234a30498d81d0120fa70eadf890ced155ad5d486aa4f1790bf59bd9731cee686b5d4d115bdc1245079defa9092e839ab567a6e741c8760f342ff0f004d6f71dae463d04053b98d5019407f0a885778f7c38d1f6fe80b743354fd1d4c5f7234821a41f6fee658500242763e339a6ea362db1e9cdbc7177733f17331abd97ac4a148c8e2c6dc7e6776853d37308f3a3fc1a5f2724ed1e6793651da7b6fe9e8e8198e58d8f8137a36ec5275622f1018a",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "d90cc3b01cda923057562eb11c013ec3cf77da6c325655a8965eb426fad34786b9b47c3849906135d4a7e9116ce1aa3dbd489345686fb7983947c03ae82ad06faa44c95b7df8a8bad4628a95b8164f75f59f21ae26ac70a3c60009a8d7fbc7f59650d96f19232f8c101ba3ed1127e89f2f8d10c4a8550b0ee5a163b3968c9e252f13a835faddb090d357386a96a0354ab84b119d8eeecd973129edade6450a95f3b8bd4ee32f20eefa54275c5f522bbde6906664d5e612c15b5b7d55beb1a36880bceeb0ec63e62c8f007a836f28759247f606f7c03ac934d1285fd8886540054ac8212f9fb55c01b2aa7d3726c4de0fb9df4eb3e883fc479e51640602b0d306c117f0fc48d71efbcdb898a2b553b39333d31893ac9d7fc2ba13f4334baba4f9f4147aa072912c317f229f04571e56f771873bedbaf8c7641213b06509e1d38e5191573842690bd17d3d16faa0e4263cd3576ae8e25da20037e4701afebbb0e3c5ba8baf2eba91c7a63601577406f7fead119d4c3f0a216f4fda7fa6b869edaff2683b52122cc60edeb5b5536c8583c39df7d1e0c61f7a5ee19ce7c879440258a6b07483210e3b50827d118d0386cb511ceff59afe6d6914de84d7a5ed447288e046440264dbb48dc9249226c92786b5210feac2318e2db91661d96542a6192e3fcdbef679be33a8bff8d31e66ea41cdae65d0aa18c3c460ce9731b14d967abe",
+          "padding" : "30320430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "7b6a7e872b1845f321814af7b20fa9879ba28e1e1433b718a6fe0e521fc8725e57e4ab0cde1d53b0dbedc5a0cacf06237b2eb795e89b8d2fbd0aa22711ad30849b71fd57d67f6eb6a2a8893d8ed68552c163811722b405330040917affbe2a746b4d13428198111ac3e4d63368ea2ee2e3db0a22fa04552d847a0ed9b43efa3dbd0b71e297c4baf9e30f94b06b3f1ec0553713460af77cfc71e537ea1f794aecb1105b57620042e75b248189364c27980f0e4b382fc54cb4b7b2028ee73d04aafc71e77e19e751b1106b3afbff80876da433e13e4607a84bd4e2de85cccfa94337d818d2100d8ab3818f7a973d7164831e9e21f1c9510ccebb4d4cdfe93212757ef97b40b947a10dc846fe5e7d5d4f492acb3284a318a11c12aa9c2828013d08c68f854d0ad9278ae1e88ba8d6849fff026126c04f4dd633e6d35a74585cb4cab87848391fd3fcc77412676ea5c85fca75d5247c283ab168b48173b7753bcd6c20607645fb51e21f43ad1cf5c1968c73e4da07933ec68829d569c5cc270cafcc83015fcb6ae48e6ba4b4542ac802f398428d969e1b2ba5261e9d7ecec0f559b54a6bf1b12727dc640c8dc70d71f2876227f5f1b2b8bb068e94140eb1edddfd4cec54e9b93e0d60ef2d36cf4fba069a72599a7f856f9b12de77ceb658ea7ab615ff3606804805de196309015e4d4f3c73e091e8fe24d9f49d0f7107bc719e816e",
+          "padding" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "5a6bb1b516d2406cbb398deafa93858bf9f4e3d0229bf1b36baf7534265b53aec5c039c371d1fdd6af2ee2a5d6e2af244415fd630443cea8ba4d796f48212ee3fca5815712be72ae6a68f36b5124bb0d5721fa04da44e3a49f02d14a468340000e0394a8f2c7ac78801cde387dda6ddfcd653fa50534e204cd44c679be66f2aee499fecd63946c5b4885baa597ba16ce2cfe9af382879d68ff06139fb5e7d1ea68ba5bf4f3570a1912fba89d6dc5271b588e1684c8f0b9f20e7cb24916e87be1c4600d2e434b22d924260c1b934d630df3adb64b79662925b09ac8c66f8e74a49868f8a7ff23280f5a4d75c9711e59cdb24b3021c02e3dc993161ecc3b3fdebf48581b2984e87ced238cc797e8a173ed0df1b9a8461bb56348f272a43b2c8a065b83ff9fd80e78ab7aa6efefe603a3c6f7d1558c4e5eeb3a89673250a9e15a3257abca309774728813ebab2ae0f4d4cc4d703310a8df68fb7e0fbf58dc280c139cdc14be97cd9bdd8cfa2cbf14ce7cf94f9191b1077909882ae4a181b0dce8aba69c69beb752c80c7fa19025e3d3908108431b10e270cdc7ac75ab040a8f0522e890f1a95b6c1746b9ef2200400821dc4d85ce9efddbd51b1580377b36326ac6b0d88e0a7263c3815605a517cee5cb89bb118fc783ad3ed56700ac82412255469c38c6352b354a0e8d7a0d0a3ebb98791c18aee99962c0d3fee3d49180128f1a",
+          "padding" : "3033300430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "a6f508b757f7a2299a0f259e025b53eaadb72cb0132983fac955cdee1706bb1321463634f707ccadf80291a45663c1676b7e7a24fd7a195d3ae8b1f3aa42ec55b5bf8102c1691a9f6feb4d6462e66219a9aa1a9c85c33a3ed123a6c563de615027becf2722bfb00b9427a641b6acca929caf2201630636f000e252246d979d027c566de5815c19a06edfba163cf0f78e2a73b926ed59e1874848d91a03e579289cd9dcdae852cfc61db8fe0153ce966609cccfac151157643aba1677749e140a81c5d4883e68d8a582c7519c9a0fd3600b1f813afe06b3f5039ac608f5b189bc1c5b0fc2fd2b3d91e936298b312bcda6554a51cda97aa9f22f7118f565017f5690fd500ab90176cac20c0251c5f82d691c0695ca35c7a550e3dda3a20c7e1d34870d04a01e9ecd9f0391143021a1328c74bedf8394530d5868e0fea177c02074e1d732fae99e5ef67de614753889d00c11acc07bbe61c5081659e2d9994f81b1510098a7f2d59a73569c689c1881e0370e00eb9826cc95b74569a7bcacce467701e11424f5d800b910606c453c7e908d8357f0333b829b10d2621832b5067cef0780c8ef9a369ff32569ed2ea2054ed1e25f2afaf34b110dec648533f0cfb4ae8ef327d8341ac054501655235b7dd0e8aea8c93dd656d289e24bc80e90bec472e876a0f1d508c09f1c8444be6e1030848ed6a891bfdb97677d30b8f5f5fe2aa6",
+          "padding" : "3043300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "e26e48dace9b39bb74735c99152cbb6703468744f52c44b21be6e3e2f9633842ef01ae9c38974b4aec38890f7cd3bd865a791eb47553b939c71979f16fe3b9d60c68545839b6089bccfbecc16abc2b9abfede4618d6913ec2cd7848dcd3dfd4c85ddbceadfd2277997e25239f66a3271036912d5974328d439b8935a10f84b04e29dc56e8f6cd851a52c69d658c369a2b5cee465b997c31320f3d9f8d578a25d28a43cf383064eea022780a28f4ad9f0962b1352ba441aca836189d2b01ac3094a68c18cb49edea1dd348aa32374e5d5ca329184d0139ad64a433e8899d41a448bab67f0350460f3bc081e32b18be25643634f3f5769e8c8c79589ea49a471ef9239086a814d4d8bcf53f1b9c9f327305d0d4e5879bb7702cf351d31e436888c63ad64ea53894c5c260dc7bcba2fc138c01b9320656a5cc9e9fabad0cc0f1e68609edd51538babcb4855e90debe0e57077860c4d310891405aab95c51c87d48d2ef276e1edba36048935f1883b69e6b09e84ebca727e6392d94d2325ff943e2d83800127290a6aef55c2f04faa862c17448952c7a18e6d4998d128459fddd24aa8298561e8af09d94f7ac58db509d376132c1133570a211604701a52c233896f20783b86d581474dad71aeb2a560d325d55e74abe17432143f7bae58d7948b2c743910fe3557731d75486f38bdc942dd1aeed216476ebe9e3b8833ef2ba97bcf",
+          "padding" : "3043300f0609608648016503040202050000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "3e1148fa9bebf37e875a51c52dc509a08497b6adfbda1a63565fb63c0f2df6f463be90cdbebca587114bf1ab32cf3516049d3c6530ce8dc7b7dfc6a8c4a6dda8221bbf6fdddc8965820a36ceb33fb98f37b0490caa2a9e5c3a1af0113d92ea9c6df0ea256ffcbf97dbac6316c6b5fc1969b5a3c390fcfdba370b4d802b2c3e53d9ddbddbc888bec7384322fdf550523e1492326434b77e26fa51e213c49606020e3547fe10b7949f6e734bb4ace65d1fc45b4a98b643cd0917aae9315833fc7114a154882bbaac999a86e9ca1e1f29ff2e4d3bf44aa91bee7ee18647a3ff9e033df28a9d34e1f3eea40c5848a39c29bd8b36fcf0264a58ee6586cb3e351eae22848e15a482e9288582c1505a917064db22909b81ea3718ff66c2551bf0bb72d210ae2c3568b71fa654993f75620a1e414fda3eba16406a6a74137752e0da1f9e264df5a025807547c72364682fdcca79dc040fd013b4b4ed3f83f5b2d729640f393a47ba0b4ecac45692ee7245809246b9f010896da355f4078ae0788a007d7fada58b9254e0b5eabe4e4749684c481b940a58a00db7d4e5296f4a5fcbf8a9c8f7ba51712ac64fb3f51fed9b866e86c5354b297796e66d54f3ada43948b5c0605b34ccd39f7c39112ea54d951c88b166c5d7190070e4022cf232161211dc13668f37f0b61602e51aaddbfa9c92f43ae42e057d89d94c41b0e93e27fd8dc8202a",
+          "padding" : "30430000300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "b99fe6f7e3d7a622bc628c60f1a8772309c2ae74e906aa7e0d7c332f991629859edf934f7a38d65a586a646462fff53fb764c7eb9d74a599c7561834c7edbb186c95341d7f2832234537d8c7d16d3722da8de0c4ccbd7f68fa41e0cd0259ec3cd70f25993931690d467351b6d6e89eb59e36ee9a2c871b704800941f2dfca80e4ef46bbdaabbe3ab74ddaa413b6d8b0a9122112e925f193e0335071fd9fbb80486cb29683180a672bfef9e22bd992d46f996b5de54bdf8b3772282dc9adfe3b05b9365359223cf2673b701cf681bf97d9aea8f1425cbb8bb0474db547024220b3592294c2c08998061ab5f788ec9c1b6f9245e621bc68560446306d6579698350132a89dc650f77b334c2d720d5437b1e455627d2726d88aa683b93a17fc8884d0481d00765c7708105321d57f18d64c8268058c94787acecf693da8c7cde204feac0993af053f5a91e78ebee07072a4638eb27a660eed29c4b4183639c51b700eb11e7316750426da74c9bea545051959b122753be9c709ede76d5e0bbc21427f95f8ecdcaad7e9076d1230b363a492bd162441fe22210280982138bb1e9ada871ed719b7f9f7a36e4ff69a2ec2c07d7adb421dec61864e608613bbc539c1666bdd6c2daff21c170d692fe923651f2aee28a88a97b3ee0e707dab503337716cf1c447fbd181f71bb521c1cb10ff2c64d23f1d64c8e1cc8c0b963839dd1cc2ee",
+          "padding" : "3043300f0000060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "d9907f701a9e5696add73ff7055d62ade27bc2f945327aa20f2e36cb9e67666293eae511e11db7de1602493f321a8eb295ab9808c1eb2d0b10eaf78002bdd6a7e65c2d279280b0374feea4b9ec1772edd57b3d0bee6c2c43a9f6edb9c6cd4cf15781ea859eee86e1a354c277549960e05dad60b83348f43a2a8c16fa2735e8562a811bda1ac318102c2f349fda3827b6176918bb8d19aff195d9a7f15d3397bfc437869b322cadd8582945ddaa4ee0741614b62ee2d322015b32da2ae6f3bfb4a4bc63680eabdc8ecddcfa13d56932073f7f96aa5944831a0bee75dfba553e6bfae8cc67ca893116acf8e7a9920eae393fbc40eb34120ce135659d95ae285aa00f8a77431a9a8f83e48f0840bc9fdf891130bf71e2dcaf090b6a87d427816931c5a77ca04b8431c4c96e9b9240dd1b89335653de84615208b9980ce33588c8a145b373f4dae0bf1c722a90f4a21939f9d400f4adcee397a3fb49bfbd3c745936985400eb9125126c5c4d76dedb75c11b1c2a4388d45e1dceac5d467a8eed5cefddbc663ef3c8d853ab1e09022e89218b042752955ebfad1447bc113e21c0abe32fff54bcb2b68d8f18f7a7189d5267c662a7831512b5c419dc34d452b2120642c31c0ffec828251a464be1af84e18768697e88ebbad72fd3a656b1eab86efe5223f521867359aa9202ce7a3cd29e2e20763e660d3bf49d602fa15cb2411def61",
+          "padding" : "3041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "8c1e88b818fe8bbd9d82efbe963b9057e1a9758a6d3c22c9724ef766c3dccdca775bed485ae98d8da9a1fea495b5146ab3106e41e6c73e79290be5dc0d2345af061a8c9143ab809ad84e42564e6484b9711317823af7cd16a88669881227ec2879d8db30f19ce2e8eabccf6d4274809c6ff9fa778db591937406e3221650c3f44e676e3a9df7a6e405bd55e756e3cf19c0b7b2796eca70d836327e10f490d26fd6cebb73c45048c9451c9490c3ff4966a2c48e5c41c35ff982d6bc6c97b5c99dd8fffcd8c3fcfacd65e9c4e7a3b3043134891457649770a622384e9f2c8414d40609f7c3644020492fb84ffc71819713867d45ce5611cb35925b5e1fce8274457ec3608cc7b0f13ba8dbb65d3ce6a3451b5f22d3a62340f0b16669c5d128ed1c93af2dc2c466267d7a09bf73961d14e597d221ef853f036878c3f3b66ecb34a519bee3ff8711207a0fb7816d2d9cf0d5c752c0fec89a08a6e724600f5401e0712296e8c6e4e7f585f72549cf54bbbd3e28d3499310390e644e89f509162e005187b9e52244acda342884dc7964a880d59e5174363bb3e84310fc78d7d2d2b6cd70dd6e01ffb9fea6567231a0f7114d5aaf8741500f834bb03e43e74a1e6515e64475bfe96b8ac855a107dff12d4b4f6f24fd7dc5d5fe254bce1d946522c50387be15c5d6660ffe3fb9ae1237538c5e8f3fadc3c7b984907dc0b7c3b902b5d570",
+          "padding" : "3043300d0609608648016503040202050000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "568b017c1093af7eff04290be0619378435477999ece4008f8a4829fc668d0f75dc7c30a3822decc8df78da28ed12d1780c4dab154887609e2ecbed4e64b22970ec500567c6dcda59979d284f7944bcdbd511fb0e0f3850869e523c778ba53832e1c0806bf737340f7731c5126874f99ba0ddb38f3c2ae5ef879ee0728ef2a9bee6e08fc2d949de4b96ea8a6974b03804ea2574c210f06db4fff6e435c5b7400abe6baf9df97d56432d1082d46f98a302f2ad7ee19cf60d46103eaa1a303819233c62dd76fbcb0ebb1b48fcdbe462fe3dcc9d56b7ee57cbf07988bb6afd1a77f5795c16c261702fe6eadc228df8b4ac3dd371e10fef69f261b4b7460d174724fe9b676c91e24d62a996e7a877b7674d9b0cb01083077ebece7087004377a4450f3eb28abf73bfc3be41ca03691727b1a50409aa5321139826cd5ea3d830617bd1f8e40fe68b5f3e2c7d43dc5ef59482df795a7115a20dd58851c2bb42877507c099dd7a5cd29931ed4153970d4d1d29b36df95d1460f06396757657e3b4ee7b981c810f870702d48ed10cbc11f06595bf72386394c953da2e187a6db74b673967b1e71cc7f69d89747c3f7ccda9eb4f2e7df3b780bbd73ee75e873e5dc486991385c33b25a6ee5fb492bd51db6960e3c9452eb559413ba43140ee14d7fdd5fab8267320e255ef0d55e52680c5c518349d242c2ac2d7d0e3933addfac80e613f4",
+          "padding" : "3043300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "8770c11ccdf5fd9459f0361718db0e130720d2eaa098e8d8229c44d348b8c219c6af4515d33c86f620c81d8aa2bc8aeb4a6c40df8b8bc4a68dee303a0a1d67e6dfd8a69ec38ae7b09dcb4d513a2600e1107f55eccd5f5f1b95ab3c5d31bb56b3be465c3ae323b681d95be15ad1b048bbba2f5325a030098f2e0d54db13760f635acbcb1fa73dbfc695f62720a5ff534631108cb49b20ba3fbe339fdf1df7e14bc583b2166104dd053117a5b2b35b97a0f241cf4dcc6933d25bdad9f3bb5ae606d69dfc33b042f755c725296b942edcf87ebeb4aaecec9aaeee73c9bf04354d76130606f6e56729a459bc950e5cda8a147ce4f578796e3ce1b35d544d2536dddf97628e9acb3c2bca83acbd90bf6613d2bfc31c6895868c360de56b6087c1015be043a166fd67bf7f7865ad46184d68e500ce2d919ee4972c257c2f09ba1bfcf97a712488dee5db462e4fc964a7c7d7d99536f62c4b7ab2c18e8648deff7f2b21fd79a91b1d9eae5105d1dbc5cafba92ed803aa94fac2a7443787f2c22dd65bf1be7e40822dbc8897df8fd97668f997f716b460d0ca19360281886be8769da08cacf41deb7c497aba4e55ff2ab3e012a559420ad9e7730e9c218feec1ce64abe1f76702923eedc2b3b21c171af98e4540548102c586616e3ff5f97ae843e909d07b5b81a198b16d8a8b1b55ac21a35fc657e52bc6ea549eda09e53fd9e8c4f080",
+          "padding" : "3043300f0609608648016503040202050005000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "0edea314cdcac3303b62b333b886360c775d9170e35dbb92d5b113e151828f8c244bf9ef45c607f3b84fdbe2d6775afc74cd8584dcb7b36c5c8deb47af8839c0cd4f1eb319bc88ab0a233f7ba897f96e60b506e83c42b8c35da4c1796bd33930c38490925b13d6ac1800e76a0ec011fea9a6b97cfc36628e519ca8e8422645f61bd26efb3e963f7a3eaa661487bebd9abf377ad9e9700adb2ea6fc60dc7186644afafa6abc6aac644d24efc726147a99d0a745c93ac5ac0d17a0c51308b3d4ad430339543cfc3728902268d024e35c14deb8454d39fffd638289862c7547653346a14760ca700350137cf900964ef4497cf10eda0035dac8d6cd9c1e8dd2410698b5fe3899c2d62bf8d7812c538512fb9ba593ec583643ee162174d7e2095575ea66df5dc6f970fe1add50a001a9c4f8b7f730ceae488d5d5b8fa8a08779a7ead3b49c6082790e35e229fc5532519ab6dfeaa190de89671ee7ff2cc2c06f0a1e056a86bf6c1aaeb02c3c50a534757cf3eeaf899a4866d67c31ff3c480cdafc2042bedc67d26de464032778e9db384df0664246d2514d72e1ba29b0003d051814c1c40c1ace9d4b2ab2d38415dfc6d2ce822de2fa3fa95b3f507130d7664d304f6b1d6efd67f817eff71163d9cc46c0b0069834b60e17948ee101d19311734ae77151c49f283417168518bca3d5ca2d94b4ed525276c363dc35fb45c06a0f14c1",
+          "padding" : "30464981773041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3adb1ea98e1c3eb5412c117762e5b5e98fdfd21e7b51e4eadb5a59704615c2b2d0290a14385bf3daa87c13d374628850a2ac4fd9a1980a015f1a2cc9743d6b6c0e8190e7d9620f7aa6dd7171823a3fe92733921ad95004eff8a3485535fc9ed6bf2e3ff99628d1fca044bdbdf9315e6fdff6d176165b2520b44dba7c17c4f833228ca442bc76f96c957e13c4cd1e3c3bf83d983e92654a55c56dfcee9ce354ee4064a1ad3aad03741825b7b8b155f4ee164890ccf470266468898f8822c964a3f00e3576a4d82e680e0bf9498b291cec1c55c963f2bf6354ea30d17f26c755bee0030b2f97b8c0d6e04f17295df8652a1df84639ef453fd9aab01f1659de48368c5761813ee64e9ad7acd06e5a1f47a26c8fa9adc6af2868dba525b01fc4173fb24e918a1982974cbe2b341ba4056d412cc9b24f06bd5055bbd2da558223c3b0cf7a6dfe97b10c96f669280d69d6ca0fd72d3730b9a9ca6451bbf10ccb6ea80a0ee9896d1102f5a6364e54b4c3f7539c5b185bf90debc8403e060fda58cbadc305ec6055b221651af2cb18b2d1eea8f34e6b5f7bf3a4eca8cc172eaa0498528083913bd42514c832daecc0ce11c5da1fd7665c741f232cdf01024c83b4140be2f34b2f550511b5d7676710941d5363a2bc837f55bb6df390e95929e2ba1f4f305823c9751aad2aa6307ebb9980794c0daa95362430290d6b1e50161c3445bb7a",
+          "padding" : "304525003041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "86404f1a251b770891f3fbe1a6b57add1a0d6ab6137efebe6405cf37a00b26f0a5acbf61d0fd46524780d554cdc4d6c6f5dd100e3a2a90c3de522c5491fd433c559726e06da3a0ed73613099fb17c7b4d3234b152ce4e0e6d26220d49f5ebf9aa65d34a83ac664f47ad1e247c9a1f2916ee6e519c2b4a3eef4afb1049c5f9351e15e43ad8d66d0512edaae3dca0e43dce60cb523e22ec14597c6c1da3d571142b1369d2dcc7c829845f1c59d23d29389cff0f6ddedc4b18241d266de5658da7b49118623b212e69b891b3698dfd0f63112d7a63af1be9a8f8ba88d78e3eeb5d846f71c0d5f6ec192f70a686088953e6c4ee1e6463e6576fb18806209225da46eb55cd888812d563f8d0dd403cc8faa2ec984fb0000a8a847f9572f3a0447a2575feb220cb928abb019e8f624d3fa1a6aed2c46406dcd9b13857f08a69cb59a9ec936295f67632a04d68230da4452a4adda23c12af159f0b5fd5afa282b454365cb5e47c696a00e1102b1bd7d478d6dd35cc68a91680e6f7ebfe8b98086f1cfa0ba89391d95733888093878be7d83ed58a0d758c64077fc42089dddb2f4ab25b312ff2e4cd545a507b0ba5e98372c9f61c8f8e854cd455d03382f5d95a985a45e17b5cff6ad3e759e4c00fbbfcc73e1b2f695f9c103f879b05f0d2d7a8b89070ba578a56bbb4f072cf81db13bdb2cf4dfbc744677b1a175373d075533fc99078a",
+          "padding" : "30433041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "b6f794713172695ae6a9b6c10489f3ad19fbd363329919ea81824c7e394c38f1498a9bed26e7edbe1974feb098d184af43cfe6e2ec6c3cf9b79451f96e0bd49a09a6779a351826461c17167f47370325599a30aa61365084ccd505e90128ea8f98dc54f08d0e2531fb03c109360c3fadb01d597ec51e98df1739737c6e477ba5f4de2d20025602fc5858900cb721da6818b12b6d9ec854dc5b0a4d472f20a7dc6a1ba15b55c4f5c6ec284c9cdc723e208a31c4a3a0ad5316af8a83839060dfdbe9e80e7048d4cf4c6c70ae1db30597d460ac727b41088e21a967e43974048482feac3b76d3fe25cc61626ad48929f83a3b17052d5ca36025095ee06e7a767ce2ebf40e0882191942ed7f1180cb0c449d8dd35306e3c3e6d03881568bbf4adac1274f354e345804e65bddfa54c0fc340fee750672f9a262ab2b54ea3d4c17b6f7a0853624507b320fa94af2a162f401a6898b2cdda7a2595057934656863945e8e3a11c4897fce95133fc4dfea279e94464889c58e7483116559909c405d4754dbca59c65082e9094d116bb7a6d457f9d6efd095882cf412f6aeb9c04fce6508ca47512fc9b802a57c8c9880f66c9092894217a681f636d284109f2ba1ecc6fc62103eed28c93832c9f5ec04cbe535ff9ac489667d48a1e78def8680c0cb81174bd51dae40df4106d65239935455863389026e123165348f46a1ec846c1043fa9",
+          "padding" : "30463012498177300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "dc886629819f93db9aa51ff96f33a3ed76a83f8aef11178e596785c068195b1ca53a951896558786b2cb3933ac12cad77197a94adcc77542acf2f0d9bb733ec6464c14dde15f4b1dd281e6256a9886fdc8bbf4d07cbf314e84692fc3571e2f26a2b7fc44f51bedb668d109a7b7181b2be96663e9bcfca0e8b73e79381bfd95e9ed7a1622cf1934fd18d0f1bbb81b000218a6ecc7e26b20cc9a8ea96c9c34742cb7243fc8135c89a8b7e793bbc433ef09f9e3c8e3a813b0831717ac076a5e1cc58f5055745c96d25422b0f435844bec0504022931b3cff27a4673cd687d071b0442eaef44dc01ce9cc24e239da85963a5ff50d16d74ae9b45418c5306895bb597bf64e0cd0a06bcdb2f08bb35e672841a092ea9723ed665129aeeb40fdeee7d843895a575e2dd757165247652b76ee39dd379b8a3c39db7f7c8946503f8b1e498fd97dc12f847f2f4ef269eb37e1d602b2df249ddf3f5c4a99ce5d0d4c131d89053e8ae848a2a6f281f7555fa2a61782cdbfdb6367a5fec9c61f5c4e2ee32003529c33c8a4f70e30997cc4a74c69e107aa658122c32ab864e1b33f7bd9bb0c5329e0d3195bff711972fc11a10580e16c0f4049b22a955872172f8fd4cc406485af45c34beeba96a23e78183a400bdd3a9d3328d5d2b3b9eb2da2f6f6b95f04b6da502d0b4b1af9704644309ce39378951cc86a0c277fc2a76f1e2c39a8a95e447",
+          "padding" : "304530112500300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "5a8c242268d4abca2915e7ac989fcc7e14cdff7982763487ead667bfcefab1022daae19f137a8921e24e1326db1618757c3210cd67c72a893c09e112915446587367f7a7469d0cfc1f95e40fd19fbf653ae1ad505a71d12dadede3a15721d3c917d7822a8365c5724acb43f45283511a3e8ff6e5958974eadd1a46296a7737802d04291f32bb7bffeafa8dd1325173faec9e3932b45496f0aa7fde91b1586d695684c23536068f1017b837ad2b21238d7ede902808f2e756db620bf145ae62fb9de07fa748d9f0d98599358eba3ac24571d015e44dbe3f4227c369e551005662ca42711877cee27c02a341005bfd393eb42a1384088ec42b4ca574ff548bdec9e1125c67b396da765944d35654776043baab5dc6af360d799cd70a6255a5691cd5d02f6cfacfd6d8747c735750b1b5a6746cafc8237d33ad1d13037884a21b7ba5c897405c34e4ddd4ddffafde442ebf0e34e88b101844bdb1542ebe432ed438ac7cf7f6a1798e8f81c0c296e266a710e83128c6de317df95a01fd60fe899bca898569c14e89edbad7b847675e511429bf22bb6da4f7f01f832916eb8c92e53913b433ada43e2ae909bbb13a05c174bd8827cc181984066ec687801c325e1b694b8fc2ac14066053c20ab52f9e34c3bc4b11584ce3e5350522f1eccc7846541b9f4857a20a13caaffa99b7c0c7c7575ce63143222fd9bf24ee8193d087823a1c",
+          "padding" : "3049300f300d060960864801650304020205000004deadbeef0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "3ae7c74e597df065e162d4c2a183a7dac48f6281c50f5e9ed4382e6ad0df3256a29c9423038c5642c17d2d28b733c0cc89eabe1889847f3e883889f4c37cf61a812573f983fdb0c8907c4ec15a46efbfc66a3174e0d7f718ad28cb86bcd3de32912321882f342b47bed73b243d9c01003ed17389b08101775ba979f7c15dc2e27fd7c67249b38b68211373592c59c541b324c88271c21144e924e78b37a40da423f9b61c59d1af0727ffa6e90719c73230feef6462571986185b47dac3dcc73818e84155c9c93075e454c3739c084d952edf1a6ce208cbbd60595fc18ac560c095522639646cb6787930ca76b09fe40a13a2987c997f45dfa9ee981af3437e4fe92cb1e909716335142cb98b73428d0f86630d08b5b48b9264a869cc68c0c25f30774d145c5067646a43d161313d0bdcd2e4602cfcc1ce8ebfc91873643542adcea5806c7c52895d77e365a2665ef6bd2a49ea86a96833786ba349f2ed6eeef4fc5ad45af3f12fbd57bccba0db235ac56594d9b9671f9b8e5a5e94ca19d84ebf68c3d588b16f14dc8806cdbbf7968f67cd25674ba28e051f35dab89690834111a1bd2fc8c20c12a0b517fe059e2318d22882e6942de196d52cd1a63b1594355fc1f4937798060472eed1c7919d304e6acb8ac022fb56a32a0b48da89e09ef8578a53f150ac4796124e101c531f5aed8bf2a010638c90eebaef8b9d4cd6871c95",
+          "padding" : "30463012260e498177060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "b489aef0ea7a3c7171468a91132d30bba759e3506289023b8d414e5b42829e81ec7257392fad82d2d54cbc2626df4f906ad3e899f202df6df5428ab992c4e2c33d3b4812c3f9eba9d210be1845b37363698d6bb3713003277abb0363b26989a30c151a65a0589bb25c053760219bd2e68c4b5e0a999b64cf7959e05dc427a799ea7f80835b44aef449c4ced5d708a9e12f82d3f4340f98eb9836d1471d76975188dae04bbcb34bbf5b65ece044397d3f05ca734ff978cf3aecd6ef8f2d7569e7d7828abee068445314b9ab143edd70c347863909393d217d7cc35a2e3c12285bea6d848bf0cac7530e306adf3f128044b83e3e2a0cfb2d22feb0af4c1e93ab79b706c903cc0a13cf6bf17a7e23ddbd0e92b68957dd1cf80bcb83a76a9001136712956ceec4523d9be19c71f4455f2c6aaf2f6dbe187b50cdf25855b3d86242404c5544919aed5129f07e2e24511c794aaa75112597a792fea352e1c8230e7ebdb6d48089efd8b85e09fda8d8f317d88792fc7ec2e9693edee4dff1d12acd568c91239b2fca4b6d5fb7bb8fea899976a33fb0e72162b1c9737bf84992d210f6374010187afc02fc27a97e07cf6604d8ee70277189ae97da0a865f93307c8029358ebe4ba1b04a5e06833ac0e468cf1ddf04490884c7fd5b776d578dcf73ffc813ef78d18361c0f4ddaa45afdbd02f5c4e7082ade911b2c69d0bc64d6238cbbbf9",
+          "padding" : "30453011260d2500060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "cf90ee6813db19fd26a6fcde2185d2bfedf5dbe16a87f7b3e04379845855450091675187bb43cb4c8394a38577b88b750b3659da84c6de73c59c63baae39077123192fde07b630dbeb1df55462541a0286ad6029f93f61e954d9f3aabe15732d0130e530ebfc1dff8d846b37904ea72781ab7b8d88e31ca5b35940e738e6594f9c801ebacb2aa227f483f63d52d2200d42ca1261e21cae1424cde46b0f58973a3d73eba6f372637b3679aa31336321501f1c0b28e735829f841de63177c3772020cd446482a76c0700403859d9506e32c99afb0cf674a23c5275529467e65f0dd6e9b838493a94a0af4ee21719270ba83b19f93eeb7705dad959b837f2eb9a6c6aca8d6edeaabaa43175477d644fa4b2b3f5a8a243b19868ddbd4a199f0521f4f00b91399fedd7f7a45df6ef145d54e2019ed8dc56f207e1a4d116a2dec57aaf68b2b8b847524cc1fd208063e74d508bfe648dd8c3d909b3cee1b675ba8fc660cbd1010bb4cd7df3825c3b2279321a9015a1c88022c941db129684e1a7d2817e8b362e5d9aafac8e675923ab8e76aff8aac56e8a682a789487501076f664e16afb5ce76f550bcbcb0e4250791000585ce762594c2f48701654691b0d7b09770d7c9d4b24729d4138995654fed704c47bf1b3341552e1143788630be88d44e7833e3e76f68f3cc81695d1514daadc12349e5e4cac57453e262cccde41238396dd",
+          "padding" : "30493015260b06096086480165030402020004deadbeef05000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "45c53db9a2345c4d808d6b309de82bb90b71431fb3cd7952a48d3aa90abcc9bb7801cdcc1ce324d9cc9314137219511dbd7d5f6195bfb78c85586ae9940ed29ed74ec036f94d440c9cb6750fa3e1389e3cf86acf77671e31c9b6876f80225d75bf18c2b52d96ba2274c91e1c6a0f18c952800f0a975a09e5b17aee54d6cc05438086bb71123bd403b4ae9e0523962cd1e0e5a36bb0411f429657ab0715269b6581c788cda17e806bfdcea6c244d156c01728446e12116e34d3739227817be078406660d8b84881150845aedc295cbf1e83bd3bd0bb7f2b397a3623ec49de587a4d2577e28d288931170a7a119a74ea9a1ad37e06f2913b5884cf563f4b367efa900edeb6948fd81a24877a429636dbb68d94d6a2a73514bdc4f198348f72acd57d022e295ba9829bedf756003818b722cde1e3e65595b28df3b95bc98a59dc3377d0bed0804221cacbb1f5a4f3f8d3eccd8837078447be684afffadcef59c240747172b30881cd960705d88c364cd022e438a1c200b98ad602246d5802ea71a0fbacbe62502ab0f1ed31da96ab5293c9ab6fa9b52674619d3525a4fc5a9d5ae32814f8f0e284a16d0b7917a578692b934bf3d62eabfb2f155328489f89f90dba95b2780419a410fc637b953a9d77549a877ee896977e166e3aa11123d9bd25ff54728453c4b42a5b493dfc88a3ea188d59bf48b8d75a608b8d97d198692483d4",
+          "padding" : "304630120609608648016503040202250549817705000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "87f22dd5dae36089e206d23ffa45fa5f0b05ceed7b35b24558d9fde749403d1a90929a5a34f25b6ddb44c5e40f2084b77393edd5ad8cdc3bc2853a1054524838bc1a4f70f2e043d4397c339aaa8a8bbf918ba192b225e758576e9f3a0b20a8d3ce79506223a4b926fa1bc302b98d37a53382b04d8e76e4739689b0094812d82e29148e297b217173790751036cc7c800b4a80614a18fee9b4885ca841a69ab44aeadcb81ced8612ec11596aa136a2ef0457b2e2c4924eb87dbcfe51ccfb4d229db275d8b9956c4cdd572b0255d08b8efd9368c056f8f147d28690f1831ecf26d70c66533c87616ad1dbc074cd0d3b058e93a0b6df107f8d713161fa38d916821bbc12bb654d7d23c59175a38694a040d1ab03592153d2ef7423bd4f8eca5741f91ac6ad4f25e7fd47d1f41ce63a886affffbcf71ec1bef39dc6ef09f1928c35a4d126a75332a31bc9ff8219f16c1226b872a95f89d03388084a7e2b55f9c04211ec1fb59966fae3446f9390a4a3607e6fb23c366401131296bdd961c76e5f1f19eb25ff8d887cf5f0e28b2a95bd8da627cf4673ac32b368cf62fd3e7bc9e5d1ca78ee406b71c5e965251d8567d9abb05b16dba5cead301c77a4771f08e3b290ee778ea4d7c43666a388efbe5b1a163e3d14417c4b318539344e86592e46374c1ca1b1423fabbe6bebe276067ecc25fc453180e0b1975d01bbc037342cebdeb5e",
+          "padding" : "3045301106096086480165030402022504250005000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "8d3e95a6d3e758dff6cf320702f6865ab1baba3c7bc01e5e6e1bf501e3766e9efc7a3e2c73d1ae06dbc4025219ea6275a92a4b361eab888d100536e620cce007ba3aa7a917f6e715e29cbeecb28308b873d5e3dd4b619c484b9a3d80567570e426b15942c30e9d39879099d2b6e483af3752397342b7d0fc4e556bc8348af4ad280a3d1b1ed25f18b866a8bfbed243cc5257e1b1e5b5a4527f26c99691f2be8bd6e6ef75928672458bc4cd4bd04220b81ee70bd0111041d612f66d57d8b33c251e2ef69d693777cc9fa8d5c9299d2643f7cf95f6992db44ac5524ac9f3193cd4d1bbd1bca5309a830d023c129bffab5441c406572fa40b22fedd76fd23b04f3c6871baee621cbd5dae7e6580a6930105f842f9b213580485b11a01b9788b0c27926f6094851345dfb47f5ef90abd14412173694b8a14609bcd35bb93f9c8d5abccf1697a1c81093afbd83b972d5424195ae6aee02a7c91dcb198440e305b265b1a6e11c1d2eab3bf7d2d4bf17a1da5694701501674838d4e5d79c3b005a4cf08a6bdf8cef2ae75b7e054ee6d15ab0ee04897560060dd514d073d9352d50141e2444c9eda715e68b8a6c24f1e717dd53852fcb5bcfd0d2957f83cc67a7c5f6ad9235ed8355363e02111925faabf8f78f33879b7205695217b780fbae9f69ecf48dd3cde100267a914a81ecd021ad0fdaf2a0d047df68a0a1bf73c18a8cee865de",
+          "padding" : "304930150609608648016503040202250205000004deadbeef0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "5d1c5c91033b1025d81faea8acd768139c112a3669ce1ebb101151ae257f299ba5138b7ea2ce123e927bfdcd8865dc09154fb2adf40ed7ba82d8e757ddf8363063259e8d30d24b169d4d5e98b911ced54d88353c7767922c502db33bd9b4f4dccfb6f5335a0e1839c31405f4c960b9d7a60d7827a405f3bab6296acfaca844392a2f3bb824029c209747e35961a9eea605b12a93134d0b24fd6778dc10699bfc160ab12e39455c027df447bb4d9c915ecfba78d6e66e904c5bae25a9fcd78b84690902dbadc14f636acae14effd84aa28112252e0706262106fc02ec191e891807be31046134ff7922f07e88737ffa9bd34732f87f3d459a53e5e061febc44daf18d0df04cf125ea93064acc3f257652ff1eb9aae4aea921dd89fc28fd7dcb2aafe5d9366e0f6a11a7bd0f67afb62d12efdb537298d787c328390951da3d778d107413b238ea66c766c1a1c3cc364679f8f99098a1cd2b7f9505e7626c6906c837deb1b1587e2c4b680c5a8133782b863fd4baa6b879a292312abe76492cfee03c20790e5ff7c768f206d0b4e3138d46cc515a25bae0d2cd9219f78b9b932a2671097ea651f709477c1649ab3c8c9875e76efac70bdc70671217aa15c6be247c367354443c7e527065fd1874d6edf1826600663eab61097bd007478396be2a2d837d44bba28766048aa02b3860b46cc71915798787ed59e06d836f46ec0c31c0",
+          "padding" : "3046300d0609608648016503040202050024354981770430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "2b5eecfb4064a56748b56fcef79277e05ec827298359df48c41c75a65355c23c678d616bf25f08f44761ae7dbc7d161543b4394c5687d762c85fadb0eaa6e098ade6bb80dfe922b88231fc296e269411bd40ad3f18c6afff66a4bb2599628aa6fac25e4eb996cdeabdf6700327f73f26905ba5923a98908ea13f326538e1423805b75d6637262029c345cb0fdc7c6acf0897f138eb3f7b7976fe129587d4485cbeacadc16fc31dcaffbaeb7bb51c49a4f8bdb15e14a3d0ba958f330ee3d7e805db7474c4a7bfdc7f26a47cf82ae35a589559ff7b39a60564a3fc3b9e4e759bfce76e1e2844368d6d92e0e8ccbe74045cb3caf0ffbc470fbac748f72b5455b9ee38a615bfc5009923890802042a4d273fbd51bb1b00d78904ba06b0d5c425333616af7de7fffc8942a3d42f79ea6b3c5c0696f810e6033b0504ae3db2c6df83982bea64c1d8043573ac3310ffc17e210ddce4b61abf164a5e447591e072b67d01537b525c5388afe87636011ca70a0f2e75f3afa289a1d9de2894e7f8377baddf252019f4770eb1d99d4a473e92f9792066c4ac9019c2e0915a74acbfa9cc8882a4ad243a07767e77246c58618169578ba6a24af4ef24fc0059124668ff988e58aa4f654afd81383ccf9c80e2efd7b7f65aac3369d4cab253d1725a414c169d5c25d08bdd809af264ddf0a0c0d95f1b3acc71a1db00bd3efff553ea78703e54f1",
+          "padding" : "3045300d06096086480165030402020500243425000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "68c8e6796c0cab6fb142bd411354b642469102ae094ef94e1157b704ab4be36e1580adf1ceab32e1c94a2bac154b11c0d80a84284a87d5e5a48ed09f08639be9c7349e2c8b6d52190a241b0afa60a4993981b12a59a38f2ff89e14cd8c765ffe7a07fd6aab3e66aec6b15ba042dd6576ba9526d8a53816a8dec33a81b4fc8b5e6c4447f4db261842c12cd76a3f145269c6a488f6c1baf116624e697270f10f8eec462febc798bfbdf095593271cdf47db347da18f4c470472638b711da67654a6ff54147ed86aeab70f6d85ca62c4a374cf56d0aada38e75c8611343b3bbbb7a5a49bfa8ac327c70cf0a16bf8a700c95fc761a0caea994b9a51089dd90d4c3570717102f965cf78d2015bb6eb19711d51613220be1c9a964319eda9bd767d8d42c6390b19f053e759e027cef3f18431dca9ec303c175356a597bca8807e72e20c71f5d18285e96eaa66ff632a1378d1a38a76c1cd7120c5887a8b2583d64ceb3f5dbb9a0ea3151e8c9e86140b8bbbc5e00b8f1467b1f7dcee49204cc435ba129dfc3c714f144f9b6322bba7184961b496039fb5f015af34b55e2eb2f8eae26c63a99e7b4a04b43efd61b69b670afc39f5e7d5806320f9a6f8c85babefb617df537e2228f85696dfe2e2cca3c057995cb838eb0f39a390f257241de5f1afdbdfb33df3cc1098db7383bc9b47a3c3c68c3f66b8f2028d4176c00556479a9d32d96",
+          "padding" : "3049300d0609608648016503040202050024320430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "523c906493b202dd0ce8893f31ad828c81f07140fdc071f030e6f44afea4fb067dfc44b80edad16a26a1a2ee1c048e1479924f114eebfef6976d595baa77cebce5f955eb34c9f0a6d4d2a0518deef00b8a3fd673508907b7c46e8326bb874f593ea3562489dc03315a5e29f58223a110be55c37bb88509369f84e218d538439f13d46ea315367696299f3966560d282a2c835a9479709242ca2f49d90a341192b32aea1ffe69a2d2444eacf3ab92c083e8593f6ba06cfcb7a0e843d6b830c7b2cb9e9bab1249348ec7b97accc6415c86353fdb158b2008a27baa12e08980f216a724bee7632c9c49595c47e61e565448645fb3b349699ea3a8023256f76e8df613f59364aef561cc970bbf94545518012d5898ec4106af592c5fee551861c7e96659e47f133b6c4e7b63631105367fdabeb3ce38c033d5a965a4dbbed1aff66104df32d237c0264e44cd938d4335fe5c67db6e8be9ca79373dec2631985854fa010cb5be92922a1695d6e47e013a0d7728f3a0dfd519b54e0cdabdc290f4b6eb2c4e3b102055aa1d9005520f00532a8ef3e76d6e6b2470f270aa2456c5bea1db924b863b9749e4b09dcd186a0e0fbca8b3b2f7b98cb64e3682659b3de80e3ad723344269e908c393e8f9b72db5776d51262e9a59f275e56e612c106182745d0e5e8d5299860e631f97b0a5356534a7724c5412ddcf52c85628ae591f40780149",
+          "padding" : "3049aa00bb00cd003041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "30b0c596ab84978dc1e37e88cc7af788047ce46c06f804c749322c0ad6bf2bc5608cf8a7aca3bf695a922e826eb5c3e64b46079d23457c9fb0b98aa6acb470de05fa612e9dfafcc492bead178ad8cac673420f5da5d609b518f1d0b9c0faac154b9310ed12652988fbcd7d5ce757d0704a5aa0b5144345f85cfcb5ee3138dc86cbc291713e50908718faa9badfeebcb73cef9a687db4b811d996ad92c1a9af7e44d875842cef14ee59d6a1f335d4cbb9e41b6155dbb694e15a1487d664e5c8e6c37956ad1292958502a1f4dd75e08efdb1ad4276fbc5c31804937cb175bce6e0f734aaad59ef27c77ec6cc6267bd250455027581565cf91bcec27f62ca5e9a1e1b8b48fb47f91a086ed300c09bdf5e0a4cc36e7f4fa4f431cc5b00c7f7212dc321e9d483770397bdd8e1b22ded6d01ad2d12ea4253ae223c786b474f5751a046357d7caf4322e61ad55c2279ab06dadcff635fae5edd2dbb6d429759a173cfbbc8d3d537eb6cda911b290c0b0396b4b04bcc9a59a73b985b45f2a91612df57fc760a7eeba04ab1d8e728c7e2fc461553eafe21d2af3882b1cf95381c759714603e426748977294038ad528d82e8338f7403c78d78cd4d0fec8f6b0f8cbdc1fbc33f6d70f1cf792cb7066540768a44c4351319512ea70b20831b70682b96c1784316a1be737826e8f4022bd4fa84396f8dcd3ee4ba71542b6c6bf3b3ea9edf150",
+          "padding" : "3047aa02aabb3041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "824ca998fad6a19067dec5785be1397c8e8b341c82b70c02960ce64284cda341bb38a5f1f86a428bcdd7085e939157ca627a18a823b8e3acf152391a8bc1f527cdbea011e44e8450749f0bd28b4568a30ed276d3866d2ed3bcf48e1e1cc8d9687e12736c0de3a1c0693913e39152d636210a3a50788fa9dcd5f747505f48f86b9a406927321a62e006b5a0eed073266efd9fe8d942bc64d1cf32e525e7dd9a036fc4e7229ec141ecd24e0ec67aa0e23f242c04212649b7fb8daaee515737c0d0a1b24a69ce324fc690d6ea0195ffe3f6f8969e19eb7505a56661243035edf27007b6e63bd5cb3abfd755726662a09199ef1a84b3a759cd86c469c5a7bc672cd4e9987154486614688fa3c7763d608f09ef07fda12b257f2550dcdf77617147d0c6ac25751aaa9b8e68210f94c7b2022a7a2659160e74d9bda4d6549a2bcd0930106879365ad7b807bff9971c6083147bb10b89bfd8611a2e363d0e0b77193ee746203faf89acdfd0e85e9efced46c0bf1f7d61c7778a7b8c091da878b5309ed503e9986984a56c857783501237326644b35bad0c50cab3f238b60d6fc63bf23176ae9a6d61e640e5b01aa20469fe5a75613e9da7131c97ca654377ff4f08d32048c99eea9414bf5e60f5d69d9f8c8787e12a4d526febc52b585764df437aa13b50f471fb9bd5cd6d265fde61fe159c4cc709bd27dcb3f18e333fb28265e9db86",
+          "padding" : "30493015aa00bb00cd00300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "844dadc18f1bd4b8bfcd206b0eb2163a3ac64e5fdabc81d17058fd97fb5c883af60bebb6f5a42e0dbf02cd66d3bc6c46787f581549bd22176d8e9b75eee0c10f64052af5ab3c02dd64fa87613b59293900fc5d2ed715d6a022ddd1572449233972a6b39b7c80ef408dd083e4f69ffe1ac2e7ec58153ddc52743c0a4caa9f58bdf44b4cf6890bfc99db817702bb44637a88f13ba92408d53145d693970ce81154124da6bd88cd96d731d0f248f76554ccdb34adf41fffb3c99c660ebe4ce501ab96ad52d184802ed4a66823d44b0374034841e4485909a7c7c888e01742d04f85bf9fabd39fdffacba9e97b3b6cfc3e27bb2530739275f3cd02ca0b4cc0a5b9485546bab8c101511b3d7f1ef335327b10b618cd7bf40a043ed02ee667d5e23277eff4b5d4fb51c92a82fdce10e412e03100c2667c084f54f3769b21dcf6fac728ef47fcb7f3fdf52b6243c155162fa63a832fdc4b48e650cdf17e887d0d37786061c5263a7f61e966a546584e454b61d2ae0b5365ba3fbdff4739ab388c082883ecc9385682c74c3057755ac90cbcac7dc296f795224a902bba9428fbac5cf197d36ada194a221cc6b36d9a93ec508dbeb9abc740cc736023c5298300f0dd3bf6edf0db417af44727807ee26020d33ceeec49efe751671bc06b5f4da2706bca7a0916445d11777725895f741a3e2d137349f43079a89f049f78b680c2e9cb5bdb",
+          "padding" : "30473013aa02aabb300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "c7ea4cf1dedb76167a8c96f7e42346822c6785c94be056d0aef3918c89c243d9a64adef8a7f42f736a19c3688c8ee5d013bc633fee0696408d28c38b9548d998677b3289c7cd8061751e0a7bed4c1ce74d85f66715eb31974f28640e82190bddc7048dc84f747bcb8f74f3567753da72e888e29c6dba6efbf4fd87940d3c707064fce7e600d38318dd1c742b154002a164eebe1e57418f30292f61ba4b2c4bde76699a0f0f069ab3949c2a97116636c6a21603d6e8a419099bcb19eaec3f8d6ac0c76c5b9512f7a0962297aa631e564aedce4d41f36485f3112e2ddc08145c0b02a87067ecdf6e256f70a34b483065c9d15dc294d1e7372c4bf45991a0ef9247d14c8de0acab93ea0b87892b103fb8c1823002c977a7d390b3a3d392c67b72ceec6af72b9f500dc92050327a286b8b9df09a68186c03a6fad8210184a551f6f2545cf86562d978e8a6f2aa697e059c1f37181769058ba7b199150f165edaae00f85a51670c2ef79e2bf4e8c4cc0cbfc5b430b763205e2f208b460b3b70ae504e08b5237c890bbc7312e61823aed4b6998abecf0835f6bab7c6fbd729143f833c1e5cbcebdaa7ead5b5a135b16eeca9255cce98983f3a9cedfa7a01d1c2fd179172a56cd661b642b52ef26a51e98f957c8cf4cd96bcab7b216a48267e661bb6acb328454d376cd3a2367bd47069b2daa01abc3e45dca349710dd174ca55ebe747",
+          "padding" : "304930152611aa00bb00cd00060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "19728d28c3d3ab395d47846577799244469fe195b59730a81e7bc3e02416a86a496d634d704d0a59dbe865a92090b9e37e3a5a0a76a18216f5641eee2a1a8e58a25d3c96500db282fbe476758bcd0bae998732332e42efd1c06db3d3d0dcdc63fa8955c06c7bcbfa968272d4c9f618d2cf211a156b19656acfeffc8749838fbdbbb033d6560bb2df8a07f99db7f18f850fd28aa5d89d1bdebd60fdba1f8b6044c946ab0e53a239e449674c5b9836d5f5a3a9eb1ffac8cb5b0a8714a8fe2e15b6e988b371e434b82891e7896de752216426e0769b11eb59c826856df058992654db6cf4e8999ad4c57d67bcf505fdd3b843d2daf0fc11016d64c554b17713ff838ca03ec5896ee6f26f90fad63cd44f78bb717ebd2c839b655fc5adf0e78018c5ebfc9422bb7efc669e4dd7ab1c306d328cd18e69d16a86b63f0b832e08144980c2e1d7a8c96636d4f4907f365959af5b5604408192d11311199f468ddecdd71e80d0e86f31f36df3576dc0823ee82a0bcaab62afff548201f054f7fbc2272c3dc347363e5b0fd78658db5c91475acf7d02a425ac53cdefa130e2686769daf742d05e06f79d0320617433e0f48980cf09354425d96334a724c1a3628e5fe437b486113bc5ddf70ad93322057e7cfac773fff134591e5133c18fcd49d5ba053ce021ca13744ab764b30c0233546d67b43bc253efbfec35f97d881c3e4c38fc4528",
+          "padding" : "30473013260faa02aabb060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "ba6fe199b2287df8633e89b1a7f38d651092d2fbbdf6cdf6d852590557497bfe731ae99c71b145ea009b6cd17313ced406f0188f773a4e8bf0e351decac56c0ce582ba1924d2d305ca3eb1f10ad87c869bc232a83fd6aa4d9ca4ab22b83dc5964f9dc4a1510032bc409c037e2367ee5a7f6dadf02e54137fe04e84468c424a050e722848c594d3ec59325842ab1ffa0fa25c107251e6d86233e5d43e9d6cc2bb3006bc1b5cd53417a23e1a880045995abe2c6ce8e54bcacee477e6c99e04bc3740b1bbaa246217770b553eec19c61e3267f9db9e68ae8a2ef216c253a668905398e073ddff62075a7aa7ae9530e588f40c18ac294e1d5c1771997887e27d2f07d20ea76989cd12785015cee5194e2db5fb736c2582cfd0486316ff3d3f26f19a348af147b77cf6cdc6264a38761ac270c2ec5d857785abc53a3a5d6d8a05236366180eb7df08765297b384a8e267994b847751b25398671453aab2770e1dd2448d1285e078ae5a561bd233a0ecfa2a4a9264a132beb83eaab5de5c29d9b0d2aacd3b125279e81336700f2ba8e76e756f4411c4f76cfa7580622ea86fab035acda5dffa60dbfea9df2b03b9540a1b89076559cf5606aa96987a5b9c46039593726b6c19c70515db21760817fbf588cd159b7bc56803f1c275533fb59e4913ae2b7973a7dbf034d58b6948a4910b5dbe688b2a2e48354d19259edff55c49527412",
+          "padding" : "3049301506096086480165030402022508aa00bb00cd0005000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "82c99abbb7e54f234ff2f2645d4267ba80f4b4cc7e65a52702f1f735bbaad8861c3d57052d8da51c478e2863d2e806f9ebbaee76625d07be4c49a0fd6e3f8c56f186a43d994bad73eb09ccc7bc3ecd47d05defbe45b5615cfaa2630a1da049f7000f4fc398ca1a969c9debe2bc244f7eca92374a3d57794d5a1b7727b74a9ac3e0343724e6e23cc3645795bb464e505888ba01a87b089659724e52a4fd308ed0452254395eec76cc759b0b352bb5481f721fdc21d4cd31548d11c31541628ff58d6978cb0f8ca0659b53312229e79c17183b727a60f482dd8afe7b212254dfe425cf54c48aad515cedcd0e1184ed757f7d5df9fa7664f1dc2b950de557af0a7ac06782487e40e85b2864c9bce8134ea2ce6112173ccddee031bd53bdb63491d596d43b8b1767018fddb26703f0e5d84fad73c8f8f6fab38234ac60a96c0b6a12619b9570f54491cf86ff7c00fc0414e6bff2ba0c1d79ec42de7cbf5a3237c890dd6626ba6f0b94ece47d616da769b66670cf0e787606903eee99f74f30d453ee0f03a5d5fbe16b1f4954e37af07880e779a913aca04a084e234feca996362a6267304b2133619f91a1cd5dbc87320f46fb3d13637eaade44846fa6dceab8ae8cf591a9119fe50cff61ef789dc2b3fd7996e82d0846a5db6dcd0cfab96bff1dbe14047b213ad6da8229cd281f47abec5c1eb24238eef1006770e5730ff270d168",
+          "padding" : "3047301306096086480165030402022506aa02aabb05000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "a735f661613e78684ccee436e49d78af41a89c325a5d2cc8fefd734c76938ada09ff8ebaa3bbb1f35546fba76e74782076d56cda9a43363c3ec58bdb12183abaa5c50f5ae337ea53af2dff1148ae87825461d294fe433711c9891011f64b2433a643ee850d2227e59a1322a318ea66e3516a8a5844ef87fc4ed961eb55c146b6f98a389455b97304158283ccf03df52471e25d35a9c4693eb51e326ca0a2ae719af93388119365dd06ce0d942a810895e1ed0427960148a6f9e9d65173933482d1babbbfc2f3053d6ead274529254a69a903d7f2d15fe3a347e9e737fcfaf724b7a7cc21d02048dac0e0607aa7f6a7a8e5de4edb2f81c25c7973f632bfd522dad78eb6c628775e12484fc72d97e6bc35b8daf68f48456537682797cb66d4252d01c798606e440142f25859c4dec2e916b3f006c14c329ad67e6fe4f13bb0522145ad1583aa49239cc596cf276ca2e5894e448275a474c9353d2e7e7095cdaa1cee50d967e459b0619d5e48e32c328e0148381ea3f4b5a8afbf3e33ab58b98209d5fe152cf43af042efd5dab4224380e6f209f151642290513affb63961864f35ac85eeaccb8804da6a10aba85eda5438f9aa184f96412a0e205b6b8baf552e0e89a338cacf85eabc390af745694c51e26c877cd0c9c0e38f83436219eabf9dd23be5604a06c2411a08dec7e15cc6eaa99899c56c8c9fc151b838b998e8aebe58",
+          "padding" : "3049300d060960864801650304020205002438aa00bb00cd000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "0d7d84cec3b897703850d770826b1ac6f74ed87d4c5139a1121aeeab20ba0ad83447d7e767f2394ef5b8b28cc431ca907ab64d57d9419028471cae8d6c6dd76ad031f06b462d44f3c82052825bfbc4924e31ef5a89166d90402e082a01ae289d5a92b66ab26a9dad5f279dd39694f291f6113abb9337efdfaccb8a94cb49bed18e2a79865882d24074bd096a3525a6606ed00a3378f867a2ac2e81c4303d59a83871e77d4098f8fafdbf2db9a0e00006e9305dddbf9774d4c55ff925127df721679a0d701aeb8e987b6e061874b5a48a315a3758d398ef265fd7a14d76cbc8a2681bbb3f3cc3ef7ded37f99bf9862205b333d644945dff50fc6b20288b27591a204a415d79c9c1e1a088f9234edc4ecbe49e7951e08350ca64163d27d838433183086f8f5492d7a4c7e018006e82610dd7fc9b744419d3bca768709533e70ad77189a7190f5d1de2e55e31e68efe3724239b61dc8114060b69a0ef2a720eee08162901b05a005036752844caa02b69537efbf24dc522010c7eb53af96ee8bdb033678ec96829f4fbc33c94112c87d945ebdc3334f5b0fcb399b3733fdec76ec4c1d87b5706eb8294ef3f06877a33f311d5533180addae563c57fc939cb791404eba064c8f0009828eb2315b46c266d7352c563a41d6ff038258c94b51a710985ae678fba0a4731d4303b553085162d35440c453eb223d2d8cdb58cd4c348655d",
+          "padding" : "3047300d060960864801650304020205002436aa02aabb0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "673e324d7cd249bddfd4cc0fecfbc59fc92528386045c2c8df3ab0673e631d675a321752134e30947ed7d5cd2124b2870f8777c32ef7e5e8c76b51d262acd2e0b30904140979ee18dc5d6e7e3d4e97bb75825ada5631a1036e8aedfb194de2aefefe38827c13d528752d5337a752d3938ccb492793c99e7a726683ab7dcd9fcbe3fdd2908fffac6d866b13c9617d272b16b35c73bafa10bbcb216f44a543a9c75e88ac85e06c45cdcdfc2b0cbb900dabc11de036fe22ea06d33bf844d1371681c2a511e1c8a475debd0701c67b6ddd907818c300f32fed341ac4fcd7a356d30542cf096bf369dc95e35b59aef2a7c0a3b91e7ed4267e059398e282caa40d4cfd407001af2e85c78199ce9065944d8effcb1a330ea5cf5ccaca9fc448d967ac3e7bfbe1f2499700aafd222fe743377cc91302235e6446cdcde822ab441d074adbd175135b0777588d5a08c6e4a752f46b7e1d24b5179efc3c0e12068567b5c187d327a44de9f8cf2d4346a309bf91995faad1fa7b62270665bfc9d7ab4e5e0a0bf8d86901e5c904170fbc818d2db67f7a341bcf44a13b063d53c81fd7f7c5b83ad2554e5e624b6edb708d0bf1a0b45b0c9a087bc711dab3018615b5f41d164330d5f95dafe67bc482dc4183e70d3e16a4e4d438a728825d30831eb95f59cc65649b4ee89c01db4c013d96265bc85a55ee62fb3360e4cbc08e9dd1986840e8acd3",
+          "padding" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "b01220c67ddd48e204e77994ffae3d6f96790f57837b141deece461202e89f15a4487990e4f5a703c1b24110aae87a8378b7bc5bc8896d51df2d10020ed3a3a3ec74d17db4024c2b23b7b7db958b4f8373cd3800f2acda5848c7d8ab163e54d49336fabc6c3b5d190a8fc78614b4b8ab12dda7846e4094b28decf8fe91f6f6133e2c10c6a8c27338f820416745d2be921d92b1ec557a40e2153bfb6f39e2ed4c462e8d6cea5108a715a857c3e0cbe905b6c9c71858a92aaad5dc8ee34123a8a58fed92edfc68053ad492d29197601994bf8edd7d1f1f86123f0ec55f8b8d15e1e0a9fdd78543f16a7b79a48dd9476466d57d2f0bf43ea4a153c093e2144e53e2fba6c41415c5f40b8a032e753995ba93082e66ab11e1e01321a66fcf65af2d270444f48f1e54f14bb271f4a5d206469ad1fcc6d2416d989c8a42c5f42abd525aec9736bab919ab5dd5bc6314e64d4c0770b963425dd021f90d9043192326974250ba86bf362c566a7012078087dad8c4a17b81466985baa51a306bf675e348c24d27d90a56aecbe7276d214f088313340dcfcf5e5f4400d6f3ffc1497c3eea09ebbd77ed8cfaea82764f2f9478715afa737b079aaa03cfb3dee6ee6fd219d1df49d4c8c7b57f24c8899804aea9f1c1a379616c04ab4b5810543c45f30ba1a660f1325cdd8592069b95196fbdc79c32da7976ed399ddc4948c0cb1994d2c8f109",
+          "padding" : "303430810430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "0922a02d38b254cfc1b02965be4db3b6db137a3fcc7414737ee34b1a204c575ee12a6860e84d8f204dbc67c6613e75ade8450364c05cd7945641dc920f49f92e0aacb59d04d7e302da6f030009305674cfd724946ef5bf661763585addc7081876fc4efbdbbadfd5d77a65221bfe2960b3c7f43842544cc97f3710ef90ce508096921a2e2c32cd55983b2685b2f5fdd7c0da5a2293ab6e7d47a61301222c40f5d64bc66386febd37c375efd2ee8e43abe68afb34ff2ea1236e3f1d01959625aee0e05fa40f95583c455322f8ccf7dbff80d5212bd8cfbc54a12cb6a689f8f4eb4977fc5bdb287ce02f7c5a714abccdf50efd2e5302a89e5654993fa09ff5e45086dace58eabc0f078ce2fce724bbc96b6de36ad9d0e5c4993f2c2fc416ea196b93ac63619f5eab707777a376d8d0a51d79a5c586b4469a54beffa8fe56b0ebfaba579b47844859202e5ff8bcc8660e132c37e46c3fe801aa614d50c9953025b338dc4d8cc2ddebc1d07745a7cec01bd9414d82892a3f4818c634d51c486b7065288e57ae9d1520cf02c397cc0296c674aa05cf671760f2f018b6dcb8db73f79f6e95ea2111c0645be64927c9f802f8277922bdf94a6bdd7023531247baaac95ab10d7fcbfc8354bb44616a859a83fb080ff895528076a5c328f89516e62694b2803600305d10a8513cf705866f459f362f764eec706f77b325bd7cd40255fe08",
+          "padding" : "30803041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "cefdcf39902d003e18d802fe6069039ec65e16a3d14e8e81d5d7187db2eae04a36b3636a0e0ceb37439ba21b0dc127ae57c8d07557d16903ae33d1b3523bf3b93c65e079e5dd7d3d6f467f8c065edade7704b62c3a4d422cd14c0e17220038b1df0e039542758b42a60603411494adca0fe357a33d140c2e53a43b756c0a2444618044fbd2b1844bbe0bac59bf10e527e2b9694887135a29ddec1c68af681547f38fb203bcde4f8b0cadb1930fb63e344067ea1c104f71562c55c5a2fddb1babc7f0de0c3c28a32931d0970f6e42aae2105332e04a36c3b9618bca0a91999c426e32c26a1277fb1338df1b194478d2fa30dffda105007a461b954c1b8bbf843b36964abc21e6b43bed000e19753060f795b9bc1f238a59328a24e7cb3bac9f1a4fdddf01577d8b8ba92523fbcc26e3fabc9dd17ef950d10d61832a269a09a1cd5123eb76c4be680b633d0f6cd58d87833aaab542bcc380971561a5a8d82a49dbb24e48ce5f90f84afb2ac8a32b8e60604650247df0aa9c8e6aeddb84b55446fb8334baaba4b08884d7db20c4abc1fd819cc1a39b1fe63d7a74d272eb4ae5ae25a6d854fefe0d089535a4c3cce02d247dd81f1504c983d8765f3dfa1b1778d2c5d7d90dd1b3ab07dd1bb21841bffeeaf2beb323403a7cbfee9f4fc9e83d3f90af100ea4f892626355bb6c0a9b14c6937cd5974b951afd7221545f1d4ab6cf710e",
+          "padding" : "30453080300d0609608648016503040202050000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "c7bb6a8acdbb237c80d697ae06513c4cbfcc6d823440eb42519a29fb17a7a71a02a8f07f9077057ab2e9664933d0b1905971ed0d8746b11f7036ca7d6fc6328911342c65412716316e6124d074b6a59c2e5c43f4d3d1663bb53882940b34bb34fbb871e0d56bcb590069e6fbdef4601331ae13f6d3a4aeca9ad2143c68e46af7d4114d48a9b33452e072be7a88188f729525e9c72f804402fa6070b24d4c2cd87b498031aa87909ee73d53d3ecc07e9e4766f45dcf8f02ffb289ff6e1507e913e55a9d68bc8c35589b0665ec498237341597f85b1d3e8e7c764ba7da01901f90e9eef54ae72f319ed17a608c256d78a615c16cd430d94af5c0d89777166b048d52fd54f81b548358b1ba94d65d677599ddd7c3b74f1002b2d084334713a39eb5499f5d5163aa2f56cad7d7e18bc42ee1edcc76d921896f0ff7b3b06906b7d074aac730909504b10678a83ead711cdc4c984748228ecd6f92729abd000e38e1755ef159ab0001abbb8af20315ce10fae39d92d2b692e6fb7a2e2200722bf8715b6a3a0bf4a8312b01c20aa1affbbcd49ccf7d6312c5ee3fdd443dc2b7639c417488c63722cf02710432c623854504ee0b6e1183bc3c940876d58f3a507a306c0018982f1cb1630c97c649bb645ef3d1b875189437da270f25f0b5e5fcd1576ad4cf38710bdef5f09131bfe35c82aa0c841e09a14837a5db728a1f377283f95262",
+          "padding" : "3045301126800609608648016503040202000005000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "ab9dd3b3177b8f9fe49bf693b7d6eb8562fa2e0d04905de5bb2d8c27c9504af20cc90052e041880635f454045717779ebd2359a0d25c5d237f5279daf46d016fdba37d271622158b6b1f7defa08ecee01620b0b6e398feac0b3a14b84ebe004a2063d8248f9614b3a469c426f68df38e11c29d88563fa791604adec416b771ecfec6d4c7125b1a1a4c36a617bfb46ff11625914a09d6e72b411a35dfd7b805793ad7458892f7847d5f8d0185285aea27fa43020334e8b5c970f0ac306abcc33b179b2a1c22322543fff1b4031816b62f648490f96c8658752b96e12b222488e0e6bdb170c83d2697c0e97931c26895c9574998d67a2c9a2fe7309e498a22acc7977509e2a7c44764d10ac1f0f269812b0faf98273da99996e0d16816ab33c3c6a2dc8209ab39fe5fe0b121c4e07b3e3bcc5e2fdc46d01cac7dc1c9be8f4b1fb4434ea63d204313101b01aca2f6479d24ac2937c1f80a231de5a263f9faa5c36c1e0af380c550606a92b0b632bc486dc5d496c59c32665d13d8c19b2dcd2af6affc7cae03f7df5547fad63771023114fe8e68628b1bac81231a359b0a27ba86f5ee07e8a1f68c76a9862cbec38150c02c6cd01805d90d249ef0f6616ecca9e844fd9c9c10f4952534e95f0bd0abf66a24a6276dba332bc4dff19e17601da8007bbb2b0ed1e4517b2111e751506461a85271b7651d891d303eada229a311267311",
+          "padding" : "3045301106096086480165030402022580050000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "c68d78d710aa7934f4ea6dbea0e50ea99fabd2ecf5bfbd51974aee80c574509f2bde952d4580b8fecca78a1034aa8b483dfc6a7a4413cc71c4f836f765fb86686ee68f46cf0eb2191f9e887b930544d3fcf20d98a2ec29b652eb77ef6d994dbc9d2bdb0e901b5bb6aac49ccedac770ab1a7a3fb95e33f0b5f42285886c52a65196061f53a308cd43e089fa9d17d14a5ea0fcc39dd837aafc6f556c3b5afff72d76d8a707e6766841baa75640cdc0d9e8c0b01b8d1f0a3a67d91bc12fc500f3a0fcb1c3342e27a6ff48dea24f24cace5494afcf3382d950279a07d175bb10f942fa57d3a28d5bfea906f2311b6432012a42ec25997ff35396c76e48767d6f0d0063b07222de97f1619ab8f4471f092694ef7c3822ac88206b3f491bc0cb92a343bd2912ae54b74330ce8eeb1f2749c99df30667f8c7b39e7c623d0c12aae78feb8ed47578f347eb9e6d9e330de8c1f29745b23e657403367ffc5064d6b62833a3944f4f7e41ff82f8a49a3f08395e5a8101b83621bc479a208236a6c32731206c5363997d5b12efa54fc7946d1cc1c6eb4c955183d9ebc0e16dc4bfd1c11701fc987c5abb11a48fe5c786325a7396f88a155f95a04790590927846d16a62574d2c5f3c716fd4966d9dd4d9c90019b864b23c81794482940400501b224ba9f4e61f690eda2b3359b1a24c63816c3b65d5274e21be2c7482a19865168bc2cc1cc0b",
+          "padding" : "3045300d0609608648016503040202050024800430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "894190558157e1924961175fb40c7d937b9087ebebf38f4456960ead945187ab3692a7990e51302577603487298ec75044aba599d46ff8dd7f97300f8797da644dd2f8299e3e4193e43c41197a9ac3bcc8ead4713a189c7ebac962b2e4a38c85ca94743998e6b078f936b9a53ec2f1afef70df7df96a6a40d03cd13218b884f4060bf2abe465db3e7ecabe9108fb4da987f1983bc0f79e2a2fdf86ee8272c5b8087bb595168c1ea59d32ea3a6538b9b13ace08ab09f75b4eb7c7aa6b23dc4bab318ac58b01758799e3459db3c19964c676d50d3b8196fbfacdc628d6e534061ed6e14a7b0d41c9856966df9c74f2ae82deac7148a9f786797ef4cebec6d431a2e1240727a793882dd3213edd4f22b1f94afea6fba4bcfdb4b41b4d3dc46400cb37bfe61d4236c518db4be052720e774351c7fb2cc7beed192e28a56d3353632ea4c807f688b368660db57b92afde5defa61c4cbc9b6ad1fb012b13b34d545065e448c614835b4bf88042039eb5ef3cfbe93361628635854c37487468e82f946e01da78c3648f04fa903704996a6b8feb98a6d1a393db42443bbeaf266d4fae1ab2c41cf9e974039e4aabe028e40acb4be89c6d7cd8be7b4f4ff743e12b9e3b29ec4b1508a059064c93020d2b8dca8a5488df4219d2e91db5542ca7483609ab8e881c202ed3a48aa6596c7f62cb73c9f0c433f563e49abcefed5c02e307954a7d",
+          "padding" : "30803141300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "2be0a2ea43b8a3a0568411d79a73aa29e74f3e7ab88d8e47426bbe6b6c8730b465f017fb8977caf1cb898300cd86cc873d514253fcaf2398980d89851215dce7f61b3106faff71655b218e2528897a4516014337dcd40867ac81ecc0ab0497908396237f3265be06c005b110b6eeb69dea0c1458ede4fe8b9161427723f0603f8a19cb90a221c5ee9f868f4ad29fe64721e202ab3985f6d93aefc7975380260ad0af2e77fbb9ea4c4326e31307879850d016ee12b239d1fcfa42383dd3e5ac4c11e8aaf3fc8c7b50c650ebcbbcee41c82326830c473e718dbe58adb20b5ae9374ccf3ad9eefaa9e015829ece498f5827326286e2f4c07ea5dc7618d8e56e4f09f0bfa53cd6895f3d6a37871fceeaaae9ad8996007a83a8ff070718e9014fc61c4cb9a4d9cd762b4f1df1883de6efcadd6849a0bdbf3095f4281ffecc278b20e56a978d23e2d2b0f0ff929dd4e11f0f93479f9e09fbcfc50bc3ee345784ed9354ef1dc384316d5a901a87d141238dcc25e90f739bc2d0f61cb5829a6fb298d01527726ffd63030fcfaed120f17836d1c1177f6dc5f10b228d38a3bd3bbc997f33925079e421e2b1e904ff34337f087b609b62f6ce4cc484d2bcad953d7436b4bd0f22036150be04ee75bed7eec5c9f282dd686037178b6c517402431809d60db3eb69fcae0f949131183cb532364fe2a54deb5663070666a6913ba2ddf7ad7007",
+          "padding" : "30453080310d0609608648016503040202050000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "daed6d077ca0d4725797747d0bad8e617b24c4d6bc22d6d6743a01e0b8f9e689c92567b13e68139235e0f0759a7ad4ee967b482828f85cdaacd9070850cedafd2b2fd33f1c5affdc826109e0bf68a0f8b655599c578650326674ba2570abff0ecfec37bd133fb795cccc83162bb84aa93fa4c928a943db51f7ee30c5002e92b8efae476c55560572a2f47a7ba04c9f85018402a4ad8cf2b21388a5276d9a31afa6d3e0f85e45406c54dfcecd1e01e8ff6e0f12f23b95cde387c3ebf6a86a9ead7631d775a39880225107cdff549ca8aa5474885c21a3db2129036b474abfd0abcc134d0866c05e043d16d49eea0109b621c51fd441850013cb2d17a5302f62646efe2dd383f4464eccf727b28f83a2dbbf8febe8472eaa975f6dc34f82571a5e4e1f21d65d19664aec694c1f54dbeed9bd3d6855b19892b4a9d2dc4e54451d2866311770bb2d3da6e091ae83cc261fa14a710511c103eac2fa7bc06c6b1c048133d1479d323ec79adf85908a81f106a20470eed3d1d60b8750a508d8da17164a952a170a2f2aadbdf611ea312b25d93fa10e202ea30edf8f584c3ebd3d7113d5e4ae618a63755b7103e5f5887ed8d33bea287b17162e6497aeca3632076b81e17fa03597f9336f279492899b8f04255a9a8dbd3adfb6ec17adb305dd0fc7a214402963342b33bf1eae98f5bdbc0ff7ca3f6b94cab3e93cf8af64d39d294ec6c0",
+          "padding" : "3045301126800709608648016503040202000005000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "77d2bd2f55b37cd6812038cd8285b7e6dfb491c52b65a7f3465b35a198cdb694d44e8d6613f9061cf5ccbc6c8616317cab78c94a6560e1f64c25dbae259a47b753d9b1f95c62720462043ddc6a1390fda9e151848bfada7f74f523a9e729daf508f2053977f73fcf1a97dd5c227c5cfc03595ef82b36a99be50891aaa1d516eea29c094c4eee18d61e9a53e200b6fdaa4e48d6d954e9d6557f8b4154ece19c745ce348bc5886aa75f753086a1cc613b8b3bd8df209751aa6d7d7ad141eeb19463a44d836e36b1b88b22cbae08d87a713d8308c9af96679122986a2411cad90d4919be3284857a297c3fa4fa950ba0b74e9bf8570171bbd01672a5a0ad6e465090ab74fe6cf7d7d9ea6c5e2f621d52e86b69672e8bdda174f4f1efe745f040ab2745be06254dc94d92022ecd89feac48fe3eb181338bf679df7c06b8c6dd6e8badb7208c609e15ec6e38cbecccf2492b925d245cac1e50376801867d229f8fb92d49a9892645b6d7564647361ad047874f85c202e624128ebdea6e96794f4e941918015ded3b9b7566538f057bdd38866176f004b3639f680f63195a18e8020e042642fefac3edd45a2e746280bcd180e54ea4e8c9c7d196a919d0db1d30d3d5339747dba152bae5cb6eb7b53b85f00b8720f6d4de2109537804c1b1d65293b385c8d97660c1b9b84c46eddee1d2d97b810879ef95c1e83ee250574a9823639d8",
+          "padding" : "3045301106096086480165030402022580040000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "141921b1c1b1dfd44caab5b9439bcf12f1a5c7fa273da49e7ba8b9aa6cffb8474817a7fd799022c762defa18bc64e704aa3defd44de0ac97833f1fcae8a52b58f9ccdb93bc3aa68132584301852534aab75bf2da3da07f4abc46d8591ebbb9fd1f826fd55a9a9bce55c897dedf40379ec289b83ce2842c5953365ddf43b09c9d59dc70e8552ba34d57c8a4ce108c28bb6282439be010211c637980aeb30bb8c01d9b0839cd85e1a3642f3ccda4040cb6037de2f59cbf0af15fac420ca0393589d2d77336dc08a86255a4b9999e2db9195ff3ed79cb80c9ecdae380d684dc07ee1fbafa977dd248e342c12c04808d2fc89dacde84b701364671f5a44952598d2c6fd0e45d53b0e518f1dabe34701b69279253d99b8dba6798ef23648a06c4bf08b8061a956ecbaaeafb6df6d320acb71b6ac0a6a104624f1f54664d688e1853316e000e28e27e5f248085b17265fbcac4311b27b90756eebb3a8001d920c086f517c2aebfcc6a70b89b9130d826b927aa119dd10a15de8c90156efc7df8f684597b62ca9c79869a5157ebeb74d66f6fa6c92dabebe18d652548ae951c8ba659956b263bc2b08ced50176e5a4b2cf265a81511529f961338078fdf0652194da4ae51cd28480c952ee7722d04c5d69383ae8d06fd67e19ec8e6df47d192a9cc605d400b5fbead890e3841005e150ef8d0e1d3fd4e1e8d64faa452c4ffd55cda557c",
+          "padding" : "3045300d0609608648016503040202050024800530f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "077e1d74012e8d54b2583056d0eb8895fdbc56e0a6612b8a38c985d402788c3f0d47cee7bfd3a138dc8f08670fa045de7f1949cd1621bd0963bbd6bbfe8cb35289e998f07f08e101a5de1748acfc0d65bebdf6162ad23ff706b759a0ddad1c10b7685d510cff228c098cefff1cc12f2f9b6c1cbc4ac76cfdf79b49230264dc6a515f58fbbe035016a240df9d7a223501c10bf740332aafff301072d572fa5c6791d45e8cc87f03101ccfefa358afb598e822da5268fdaad0682f7219e6f4bd4ea8b1a138bc9b28e42580fdff4de74b75a10feb9e78b122f8699f5383cac12e8d0efd3e88c5d6d0f4c4c9702303fdcdfe115d662abda6bae43473494051ee74d6289996c4d54beed7e5b2de6453b0cef1f4f42a1fd057362f935d466b48c6873c8737af9a5e62d8c832c1546087f459999658f3ff1a6f7cdb56c2b834eafeb992791316ff9d52b1918da4fb3d091861c7b66f7db4474b501ad83da0b4ff1c4e3be7931949a7bbee7c9a48f01f5f83459ebf93b0cd34b7e8b6bdd35cfdf6815d747fd6f6ce405b9264ce4ab26a458ecb0269d5a849b10393ca441f7e80d90977ac0276599188f8cca39f059185267cb7d60c7d6f2c643343d1161175e39aee85be4f3e87c464bff1088c20edbe4a543e8b54a05c4f1cdcbf1ee887d14c09496b306bfbe70654d0bd19d266952d3d9c9d0b17342f8aeb73aac7f827e53da2585c72",
+          "padding" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "994dd64cdb6233b09ff4b2a5126f50c3dc01880d0d8ac3e9d5c2d34bbc02c674583ddb9a520de643ac81f1ad407855da715e807f200a9310fc1a134f0d6e3cda9ebf541e8437199961c96a5f617e075fdf3e37788ab62c393c2808061e6ed92f72c25916ec8ed846d76adb3114d15ff77a323bbb22463bca4d7d7d95a8c9cdabee3c1b236641a6166d083eb7f772cba93d0945197bf6b9a8a54a24c5f12e6ed520eac3ee9aa244e8374ec4cfe95fab470cc09ead7999f054cdd6b90ff95bc6df33d34d765547fcb6c120c042f1deef402f764d494aeffbd9f8b59d012671ebcf08409e90b40d19fbccb29e105fa087eb1a1cbe6dabfccf41b7e33fb0508116de4548609c1b57d24bc744041362cebd3fe201944c4e4455290f950ca68f5efca364c985a5531957edf5857645fdff619f5dd013b3f751a7a9feac4c971323b730f3ac4663a6b36b21749e6643ef43ebbb3b81c601f23d159c9df3acf6bb3fe63cc86e53b6a846960337afa595ae25694d7a67145c1227c8c693e133131e2c622926e9b363e4445e6dcd89bb65dd74a4f766fbc8570f954513dddc8b5b16e3c200afd47413ce9318a3c08f8b092e0c527be4a6bcf7557264593b803f652652e59712ed718954353197ffd6f19853d8be525e1dd999284fee98ea3ca49dd39a1329cdc1b10ff336bb1b34be9f2334529176792666ed4b924f884a49bbedf0f430ae",
+          "padding" : "303405000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "d292f30cf75b901051216a9579ab9108ca9cdda91d618c08ff9b8ceb455ba0a197ae8b6f60c1722b1d212cda0048144f0147e1b61ec2fb65573e76746be9b237031e95af76d6c726185855436cdfe4051fd56ff929cbcf4ca2e2dd8014d8957c1b821100dd186776dbf463a46a884969bc6e2153b76805a0ced2230b9233fe9a30445d8a5aade694241e6ddaf6a1765a1719c4187e6b8e9a9722fb8b18b3fefc746d32927dce857b2083ac43ece35968b616090157db2b09e2dfdf378f5b593b03c2569e941084eabb29dee9cf6a6706800b274bab9526fa57c1e1fd6ff4195ae377c64a01e8842463ebc41312ac8ba9e72126fc6e31439314145991085a7e876793885511318b2e435461890d588286e8c938d63534da7bb734df3962069b62d1c84acebc0b2d0ecd349126e44da37e04f1cdf42a30941b0622735ad6c13e4757a3d48b96d51d2720ff9b0d02f5df213b26e75facea01a5a2452d3a3a041c4ebea57364bc5f9fb4612998acce1f4f774f8479e488e6efff6c21f68e9a6af70bd7fbe7798b75bf76fc2dc1280d109a8c5fb1ce23c02b1398556d5355f0673e84378cc26ffb27418109c24d30ecf4c4957f30ced867b6cff4f71e832ab81e61573a5ddd4c4091e26ddd0f0d0a85cfc369f8685aee93a225ec7bb23225cdc47ab102d699636be2521694c5aae2be6d282b3222f2e3da965fd0cbd583aeff86b658",
+          "padding" : "2e41300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "7018fd12137bb5fac9fe8cbd2eb3e9d1d08de4546e8af48342160cc305d954b8f9460a12bf0bbcc47e6f93bfab80754fbe2ce64af899a71bd93ef5868e1ce15438843da5d1519d1833d75fc7b7beccdf159bdb175883f3cd71c7590526fd581bef307e21edac07d97c80a274418b7a5a1d5b5aa4de53f478c1d8dbe886d53ab82020869e4ea390d4ff87adea84a2949e2cd29c214ad0f15f041b8cdf427a3c26ec6f51af64142aa40892fe3692d2020eb4b9f3f2285a20ef0144e581e98a4844b4c495fb6213c00112ca114f9450b8abbb727dfee8d1a29b56b847ccef1dac8eca4dda740504a4ac172a8a422bf7f074dae49b5b8269375ffff4d150f07f605d97a3dac62625c25a81f3f5436d36f2386a541a5cbd3768f2fe97dbfcc9d30010401a4d6e679ee3aa7545aba2f0f096f81b579950724539e7538dd175011eb1e47b7e358db13e7785981ce36ed13f979d4bd720728f2d37bec72573aabcf8bf2990932c8e478598a72cdb34efb20f66b3b530a479c679620bf893b3ff0e33e85a3a6db1d72d7c87f9306977f18a8746179ba4948e51fa996d5dbcc27bb4f1c789feba3b1925b9c0af744d294de1375ef8f52ba8753444d798363a76a5f84a1fa542e431f8440df957cc731b7bec4e4ab6e52f092219374a525ec222029dae6448a41702a7cc8920058821a9790a3fa8c88ed06283b43c8ce15fec4138713cfbfd",
+          "padding" : "2f41300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "491a44b18097d9d62e0d3eb41b3f0172f3647d65d9ffcbedc31ee68f03f52795fdc5fa753fc8bd77a21dccafac57924c4051eb89ffd17c0c703fb9d968c0d18b2762ac02faf72d8ab448a5d0161a15eb4ab923f28f82dd6e97ef61fe4eefdb63066a140ed5ac486da016071bde06b617889ebfec7c71ee3f66f35cfeee2ef49e5491021c26d73ed920c8e3913514f65ea49d5453876b85885d51bf0265983578ffd05dc8df8efc0d915e90a4cef181cd0898befeba7300855de21a42600a4fb2d2eb7fed5bb3f940af3d1cf7404f9f6bb3da863fbde246f4d3931278fb7485d59c4af8a6f5354ff4e05153280f6fd6015a13fa15439b9b4ea1c20ce681acf92aac4f60a86fad5f6a636a7e1581b3f8fc1c90ff058c40b5d0e64b7d82056a5bd1fa661610382c92967bedea57af5eaf52d7304e774e4f85daf09d9cc5c039d5bdab649703044047828ef2291777061de497de6d3abe1d2b7d0c5244a6cd7d317327f6e596b1aaa552b2d3048bbd26eee31757aadab0e439460f530fa90b92665856201e4675e99c6c2173fee1828954f2f9cfd324ff1f9b77d6eb0d48f1745dc01fb4761a00d1d29de9c034d502658b2926f6f3c283f82dacc85b8e306f9881a75a71c2bb03f36b5ddc44de525cc3af0c72b1af01c4445e305058af24fde5569594e656ce85192f9409c6bb7f5fa08622dc00102ba4f8fe7f7762ac3050aac0f0",
+          "padding" : "3141300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "c9667d958f9646740576ce18ce3085fbaf6f3392524423be838d71af5c576f2d12ece21c30da0e209921beae756b9ab6a8b04c3cc10c06dcd785a118f45b59cc50be3f3e62ec01e70d0e9d5859e098fb4eb172ce430e32a5ee1d11a94f749bbc0d444e9e03bb2632bc611a70a1e6a4cacfc9118247ecd374f628d3acc5cca79572e45bf4a94bc1da631a59e4b781b88368979f3a909a01cc7c4fc543fd165b67c82d8f82b7961989dfec8e9c4fa6077c89438a6667e42be64aa56944ac43c7eff8e4b9a9fa2b968da2a1f3f03bf7a80e884d22b6d3ff4564444fa5dbefbe62361bfd46c32ab42a27c3f819cd56016479a40ad138b3288560e6a1f3831bdac5c3e850c3f2ce500f766843549f5af32e002941b50cd88ce822a46183f4938d58c12cf17e1ab29da94c0df368d3910318582624cd66f1bf08c7ef9c29a7489ade8086b750f432e1699676a6483099e9ddcd3fa9771b0ed58dbfdb3f61f882799e20114de7c6e0384785a9ee6b22266b2816d485ae09ed2d71d4f8bb0013c932c477745eea36bffed3abf8eabad517118088fe7d6c22c018e0bbcff07ab814f541ff1e4a58042cbea1bf9d5d6f6950691bc61cb918296e05b9747d2303085a8e9057add2b109a661490e357ebd10a8888c7ffc7fe788ca3da7bbba52a8c6b056754d88cc2dc2aecc1a7dd770d19d0a9412860d1a3d7cdf905ab92fd37d559e4e5679",
+          "padding" : "3241300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "0139a6c57398ec02a29cbd47a11129f51c07b61659d0d83fa68a16564795a669bb164e4162d19f852129ad135586a4227b91c54ccbb1e6a02e0a4b1d1e741291d508ac2e9f74bbd27a2d3d4a810ff016fbbd545a479fbe27a37ccd462a9cb22cbcd5d99ea7f99ce4a3e3ce3bba2db87d4343b22304436c60752f6baf33d3cf4d110f7b1b964110fdfa2e0058158325e78b5b4010801aa8ca59986f629912781cecebc33f7d9edb6f6ed529fee06f54ec2e62c6f4b72bddc8ab6ea30db83574bc931c0155db26d3a5bb830b1840c544b155788c66a42e6c8161f05a03e05b7271578d8380946c72b7d322bcc84b1be714cb97cc7851d06e1cb892ff39d88f821a5bebc043135326addaf480c4c99b21c26af904d41a014d5611f42481769228054729973b248ade31a4ea963a626770c5f9277782328ea0635e3a5f6013501e6275b419f145cb60ca2fbb3a7c4bcad7449c47a9336d658bc4a9a3c06b2f84ee9d8a8209ff7ed0505144311df3342d7fb25616c31566f29dd6139aac391e7832fcd0a6bb69cee74cc6a39a2cb29fead82bd23ec272e62bc87656eba34a5a44f443d69de2a572b3d7e9d5435ee69f6c281362c9fab99ef72c7e04bb8d4ff34497b2a80f5cb750462d131cac6da0907b8fc04cdc45a69c22c13c77606a6d6cbb7b27ec65fdbf496b123a3323b0370b031ce839d63e2e1ef59b0d95e646cae94bedc4",
+          "padding" : "ff41300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "1d6813c5fa766d4437e3fcf8c38e7cf829f02eba0cbcfb369b7b087bcefc6c5f65156d0e947d9f537cd885d4dc6050083aeb26f413ac082989b1df5efe7cfd7cca2a9acdea4b8f673ed943f6591ca2e603094fbe5dc4587ce41828b3ea08255ecca5ec6595f326d29616e9c47cd889d063ad8b90326163fff3010a5205883ae86c6cc95d90e449566d771873e5d3ca7584972f824015ec5bbe9330135a7ed18e58581b89d5a26ae0d13ac0b9272df6452d4d3c1761c2b6c5affbd7ac4a2f7d9b5ed2aba0edd11a068d58fcfeedbbd44011bc0b1e64435bf35c49a5411478239d7382d42c53c6fa972a20023da69daf44f091f1da06967809e4976fa851eab901c85514cf410f99c3686ae21c778b075fe73edac13173a13cb08f37ccbca2fab56329832dc0b7b8725bb8f95eb0fe811703dc2047eba3c23a1571c5c7312b38fdaf79e43dc00e82e63d8acef305c12d190b5abdcad1a82e2621b20c8484f56b1c84e55880c0ad9b03920c44a080d436181a7e742580be80602695ffbaa20c22c6b484adcc63cc2b417bd45ac6826764aaebc918a1fbe7ba4400cec0c9728c1c18f943069463a5747052d387f63890be573634f8f122efd0a75969b1aaefe14ae3d3fb3cedf5248df995415095a22dbb3c9d95cc4aa792c05116b727d60a7a9ce4086d00b963c177e3a661caacde70196f4541cbfd1b8909d1f7ff18da9f221b02",
+          "padding" : "30412e0d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "7370d0c5dcd81ebe6544bcea2a73c187a5001c360c8a82c7cfa7b26eb703b73990e6f742c87008e0a2c676d2209d00f069dcfe8ec1dd7f21459236247061a6367bbc4dd02cd88d0bf6505b624c1530e6b730ef29c12da0a664c5e56bc0ed2928e1e2635c3bb82502d3f71d88e2108074664801fa4ee16d49e2de3cc638ba3f6f152b4b4289f715f48a26985c7ade2af50d8f0c1bfc92325863c64b864ee14dc8203be4ec8bf798bde95fc7da29d0a8d6ef2dc428e7e73df45f206646bd0242a49f673847b5d0cdc1da20a1ebc3f04c0e99b2aefb6a0dae2a9421fbc9f26f8f9601b9477145a0526db84440b0ea125182a9c1938c48fff51ea366e4bc2c499ea06d8056ed77e292f5a91a532c0ea68666687d2966249379f5476c35cb28b3242b546dce34c506b9a9991ebccd8fa9285b76b32a9c76d1afb431a040b4bbb5b7a3451ac80866075d776ef12cceecfd48f8202aa2444c44135cfe0b9f57de378326bc1eaae7b656b7dd8a5140c057b6cecb3e9941aeccb2ea87040aa980d06630ac8147282af6160fd36e003586d47b5ad5ba5df676c16c8abd90dfe2f5462d12498bbd2626cdb6fe419d4e98be24049b203288207298167a05e4f9d5c3f96ba3ac6dc14b3e1e6bce3b80ff46d5f370495dfac4636b2c9006299c2056129836b32e0e4d4c79fc300f9c7c59f973b48929f56c299893828343a2875e70e33617f0b8",
+          "padding" : "30412f0d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "2e171b383d528aac51817ba667915906775f6ba446878617d1d4d659d41607ed671f78083488103c0fafa3bb445fb908d548f41314237d36df3840ad82394d23ff9be4a5e45ae6a3bad3e6555ad4362c46ce6f583109ba2a2c2463f98364e1e596db59be7fafa8fe9ee1876dc306a3780900c7cda8f90dd727480bfe707ad46a0321a3cd1e679bdb16f1570ec3b2335665b0c77548c905debe1894a29431f9ebd19222fbabb379521006bf0c490bdbb6e700c06c2ced743c5953b5756641d4105bdb0448ac0daff3fd2e75932ef6f0b4514d483b026d2a6ab9b617f52da83e062d80ca7fa80146023d5fb3f57be6752b8256622364d1c0b793ff070e1b30824bce0b6a1d8115cc13127700072d42b719c849404e7e9c49e71dc5987414aebfde54ebee2238c0568dc5e386f384043967740a231e6290fd42d6dc2b8e2c59fb373a30adaa57eaed796677b9b7b849256c6dff0ca6739206fd30fa6f43692a9d1d3e43c003e5a7f021f691b6f61dfef0f803def665303d95d2e51c7fa4d33ec4efe33de2f6f8ec8de4542500df75fb1b8c0936c992fea43a53a7e22b483a2743fb1fd1f7fc057b1712c8f61af638abbb14fd872ad3df465e81d3036eba7b52587344b9cb25960ebc68e62f9187c1b564136f599746233ab299be16be2d13960d3fe3217733026aa88e3be09510ca181bef04b17d5c198120e5b56ab3e13a2bee61",
+          "padding" : "3041310d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "6be3d15693608f669ebb88cbdde4159a52412b2cb4d839af0f4d2d0c000bb1f6b651be8ae44405276456abd5fe78951c8d24105e2218734a1fbaf7997d1aeadbbf7c5f92c5652b4d447538205d9cfa5c20094bc992358f4c08776b9807d4d32e9b40bf54b717f2f691be337d881f1187b32393522ecaeb30a14de104fa9e229f276f3416675b7b39e92e1987e3d82e2765e35354f4238879bcdbd31a54aee464188b8750d64d2dd5317806b0c32888e0c8cd78264ab0da873ff9e8c9d833c4b00fb51b63155a122f880471f9b163fb63636d94710de21caa3017ce31986ed4e7e46a6e8d5ed7a7ca8df681bfad29cd7566e9e9e2716d37494aa0bf97e412f8e7ffc0056fa0d2000ae151e6a746290e8ef0a2adb8bc9189b8dccbc9b7ca59ded3fb7b1135c261de2a863dae5673cf7934148daa94d1da8e576b9f561af962e2411c5d0f3db0c5410adb7dfd9c25366ed7289389d3859afc92d385fbdf00153164f5f16d9470002c669500988e4a0e413d5b5308a7a3006eafdbc7f3e6710f84d8e76d43f0cbc09a686d7b023aad028bb91a72a4af271ba741d5eb853bded8e82c11297ca0853861c18f89002f76928f5af4db3edb79f91b70e4c5e98203011150488adecdec2e20f4ec6e8dea8a411a45363df881d1ca32a8bee6f2711fdd75c5cc8b27a04509e0e3a832fb83090d32b520db60c7867cf2c4426def622c120d4a",
+          "padding" : "3041320d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "8f89981a56c9e66d4bcf301c57c57a0c2ee2ad2ba19f497f553b898c4ff883fefbd4cdb7da8464cef028cdf35397b440d9367915c47c493f61da7bfa2a33eb62a4a421aebb5183287392f122e28a4963e45566e25fef1816071341b28daa7f586bd6a90fe3f6b9d786d0e57dfc5e4b3e300d5dce337784ca5f967488fcab93c9664a4efff22a213d127ae3918513e4824b5b0471a02d188a1da97cf94e828b2badea31e81dc14ae197c108d822cce7eefb5f4fad27b2e0fbba8d8e25db7b26b6411a87cf01c631675ff3cd0651ba67a419c29a4b9fc01dcd273bda9714a1028f55f926a7b469e4dbf01bd8276a9c04df24f653955c9671f37f001b254334d535e1659fcd4de185f21515c8b0072f6a9b6e93fe0195cb5480d81571270cac23e05a32809f204930ca25f554b22980b0f0ecf99f414fb8fa72cd9530dbbc7dd5ce46490c7c910f9ea229ad88a476ff9cfecd83dc1e9c68ed0a7024e841a81484ab7103c6e6695ddf4ede558e9c48cfa3d7eeae2bebca78ed5b0e3f6879d0cb4c59059e1710eb3142771e63514307cf4151a89875ea5af2c5bb0873a0114c7c1b43f47aeda2aeec62b0c6234793ff1421a36a46f0805fe5fe5b8daf234d48a3664b5f387c92e1a4ca67cc3d4d1783456d4b1a918eb833d14a0cb6f26920e843ee5d648d1332624a21e91a7d23a62dfcd3fee72380d59d78041a52d7e314192fb3d8",
+          "padding" : "3041ff0d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "9ca87049dbcaef6dbbf981c211100fc02b92a79380e2fc0c4c59e320b1f559ad83ed653d77fa0b5ba3aa005182b4359158ffb0c072e6c7d02ae32d19567de28e4fb035be09471b07ff6e72a10f1ab173e46f770d94f78e21ab0ec4d4c11b568f394ad3bf3fef14610afa6a8c8347c99116cacc8833affe119d913a6596e8a2ae4d09bd9816e2c1cf8fc2519ec6319f8f219e36cdc5eace1a4dedd47b09519d64586282674571972eb578cf1e640e58463930fc0b08b1b297c5760303b799b7f24faa760c2442f0adc7d83cddc56a99692cada6ba8ea3fa5aba200719ae43d0770b178ad9cf574ba5b0ce847dde18df9cac32d0adaf7b3cfb460f14db0c542413d5f528b6046e9ba47ce986cb134011efb55064f9eb2163b0cdb264a6eb9793f12203ea5ce9d48896f2c448926615d2dab2dc51a0fbdc6f5c2dfd474f455d0b0d421e3711326ed522d1840c0d0e93bdbeb3781c066b7c050e299a2e450640ab46af4fc1bf4291953372134340d4ced304430efe82ab7c9f391f28c238806249258b7e8cba2db75f62ba910b815db2f889326f3fd724f93adc45b031e08bdbbefb8b2a48d0a861f07390a9f041a0255eb9016157c526e52edd7d714bff40473eb36d0d381e7ec2277dcc3f145d2efa02cd63e5acc5f05632723d5c5e016d5dd5ee267ebb2eb39909c0ce31db4ba0cce2f404f0c42c44d0826b24e0778880067b5e",
+          "padding" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "29835fc87200783df0affe15fbf9e7850b21180cc9033c9918520e4fed3efbd8f41a5f8c558b377782d5c6b4cf038dbc7d084ccee88d3bbbf33a7d0addb95f0e149b39c4a4bcb4ee918c7196fad1d591a166b369effe1d6f3e42bb64597fb7a152d51d18d45f45f9a0593adafd36e522a1e1f777647b225104dbbac31f1e08ca476dd61526e18c4c6a8de4ce4374e139326377d11122fa685dee074ff5541c88d6652af1e5a1b8fb42e5f591c7101d12f5172b6bc5c0002889d5e74653d5e0a86e4fac756ce20eaf5a20cab51e5b6b5dc99e1c481144ea22745d2d7e6c98b7ea4edbfe0161169fea2400d326c53cc5bcd60bb2df345a91333e076ee31c003505c19df7bc96365014a413adc07edc86bbef255c26a46cbdfc381f23192de7c768976dc8e75155ae8d07beba0af122f8a5dd8edc4d425825710bf6845da8008dbf6ab6bb7a5bca8ee7037c9682f8b4e2a5954290d49bf2b0a9e7aee22d63136b7cc2fd7e6cc48b4c88e8c60520d4ddb793c69cb1c677d01770756e58e5846bbf868e0a5996c2ff7faeb2dba19440acba41fa514f84283e66547c5d9e4df8165df402033298759c906c9afa8dd15933573183d5269b4a9a2c63d5636f8b2e0839919897fbe6f87dd2a8cdeefa559cb7071ed2ec18d79fe068cf8f6bbc4dd0dad7f6f7cc869eabd1eba5775901cd248cb500d23110eac0ed206a1649453b81b583b6",
+          "padding" : "303430000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "4bb15135ffc32d2a7e59a5c536d0788ec37633b9b1e5c94adb9f5b01c845dbfab129194b8a5361f352682de8f5a92f0a691df77e06a147c2aa759eb5bb72ca96ebca33367360e22d19f0d4d90c25c3e2ca3785a5cf26fb80e1993ffc08dc9f3d4c1554e5e90a46a21f8f00a2cb376ac4efdbe72e0ab1308bbcfa83b9b484f43fbcb3311a6ee4927e07c568f977545e7d5b8179e6612c2311d5b10c72681c9655b2529017f245639195e416fe0c2800853ffa387bb0934aa977adaea2a13fb87d2f8903cb362c1ae1f4e84fe13d29bcffe4dd92f856db6c5f1e9622268da090a8cf85481036c15d6d9bc97687a09bcbd92e73ac9008d22988893bf78ec3ef87620ee27633faf1fbf3caa3b79323c999932a728b40294ace55c6c7c73ed0fc03151a56c7a87962dee757a29892811dd4ced9500b8bdc905946575ad9521758856780fb4b6192eb6b52a81e9a1ee9c6e563a5682b867511093a14f735f5f20bd6e2ca1d01e4c6598ea6347bbc61dac6a69d05914e716ff1d53ef0b8259e3dafc203c24166f32067201e11c241ad4c107179b93b3e254defb5c67f2d88b732abe96ea5ce09cb360298f1a34b87a8860c32079d5c80ce3f4629ae27f4731293294fc2ab7cd9f2fc101ad87dd489e7a2b0edcca37910d51b8aefe80874088ec53c0d56548ad4761ef14a988739a02ce08fcf81935da7f65c375787740b94d48d8168f1",
+          "padding" : "304530013030400d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "9298b6ef7eec73665c848e50e2c221a013b951888a85d1f7465be1a306f9bc239b206fc3a85ccd438b8e45ac4892478c4945df6849e6148c62a81f8c58f8c78ca4be32806a3d8b16c1a258534f1a5d9694e364c27490ef31e8b45b96c88a10829d902aa48396fb1646fb5a50496780ea455a2f918a914c8408165d11651b2d490874d870b2c2d6c0c73cf654c3522007b8fbd4f1ac59906cf719228d1795cc479c9df3a7baa81f5cb71d8c73d154b90e4d33d208f311150e08f486e76fc1786bee3f287a8b07a768f91ae9d65c3529601568265780031e359273f93ff7df610f47c8d0b025d017e1dd088a676fcec39099f78b25192fcbda0a34c79fbaa6a5abb554e3babe386e7e2246d4f68f0bd60d6036133ea451a12e7c3ed1382e539a01fb3c21e1d21be7ed9372b943937ae4857adb7aff2721a5f5acec2580f2e7620d7fc8cc20fb315ddb42461abe93e8b8911613d06e0fc1947a6376c430837562f8ee8348c1f2086acbd60f8de959355ffd5cb4f58efd9291538f9574fd94e75c7a7710a119f7ee75c4ac0ed49e45b703b2f5e34db04fb71478cbef4292f59b2a76ed18b51992f164b88903da966a0ca3fdb98458979ef79ef83122a6bc2194ed0f737b75c02bd713c670e26aa19883327481597a980475405e8dc4f4eebcfb35e7cb73a05524c92c1599950f0226c11f2721e658673ba9abdf8bb39fe3be76e1a7",
+          "padding" : "30453011300106300c0960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "10b4e879f27b553ff426c209658d787219ebeec9bdba09afadf14362022bc1f6e35be08895bda1c67465c74f8c225de02d49878f460515831f1fb1dcd42b2547558ba805b85a97e17ced0a1f1bcb6aa5ac390129916fa79726452af274fe65a963074be70710c59463e3b90e69e1fe40dc8105f2fdc7f863cc9d808c6878480431b847f372e9cf6418203e9c9a267bc6cb1a1377c394b0f2d69911d48650717644c79fd02b355c4790610ee930c2e9cf1fa1fed72b111f3f4183a2ced3d3aded6b8b5ff3b80b4ed00e97aa6a1e947e95fdad77d91e36472fc9326f745c7127b231eca5b2dca161d5429c0d4c4fb15f43e066d80dc84cfa50949f4dfe3f3a1c9af6aefacef20604fd4d884b4656931c0d3bc02a70e37c810fc7758639e4710a229348e134b5a67443dc36853fdddf632b7688e7622247be4d47b39d8f8dd639f9a32db3bdaf3e45441a8807017a9f078baf89eb46e44e2484e22586842658d1ae39bcb4b6be3e5518079fb10fac9cf6ea9d1e98a3986148ec834cf2d00e365ef8b45af8e7b4f8ef1c36fc675aa704269d5c1cc34e63f4362e527c3c42bcf38c2b1262bc350373941a50102b5f2f1175ba09d9d5235a6c90d3db2875545b7330cc64d44ab5543ede211e9736124ba88db37680574e225deb86e40b1c2943eea5b8351486c75cd7536d6da8dad82334cde6f3cc55033d09c387d6abda7d98398e47",
+          "padding" : "3040300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8dea",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "a62486e6b5c6dbb918e6de18664bf6f2a8c8de6bc0b3b323fdb736faf48d9cca2792f842b3a5e80548a243ab59725c1dd6b2dce185b060008b623be218a9997131106b47eb2bda88fe9479ac8d539698b6f3b3e14eecb3c3a7f8c9e39d5398de8d1c5e9fcfd52bc8fb4e73319a8248f9c99592aaa9ba8c7f44142f63bd851f218a9a73845812f865b921faeed8bdfd8b61b98ea26fab09cc90f78e1e714b3ea6948f1647e1258f2fb965a407d1582f28663b76e187197b71e209bdcf3b7223c1596b9aa2df1e2736ceaf4fb830459415556aa52f47cb26e3e22e4ddbbab3904a7b1968e83661f5c8a02bb50b33200be928cdf1babd794e58e79890435f4e6f3af79b7015a7dd7d996f25d61d6b29bd0034445ab6d8b664667ca7bb4537f19edb9ab1f58ecaae3dd8c56a07b57d9cb60725bda9057e3d9c52cf17caa1d435f8022149901d27e3b152898e3865dcfb0580281838a72fef458328cc1130e59d4f69e58db5fd4552938c182128fe967a42c8413928008581bd41865e0c747b7d5be7df50435adcc707e00c7837a45da8a6e7a6c7ab5f5d3494f36d9f98bc2f422f3bf4c1ff0918529eeff3d4e8e5817ec22021f57a2c66078b8622ff4eedeab8bb61362488e215760dd82ff3a58ac5df2dd0d38073ec574084dce82aa9a056328fe5eab9e637aa71b9d6ba317fabb96944c65eaa00399d2793252a4a7140e1780d6b",
+          "padding" : "30400d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "b48e469d7a411e1521244f8817cf17566517969357f4a8e71297d48d736886793186dd648946bef8f9d74f87b0d0490e6eb58dcfcf7c3504adce0fb2886c174e04e5ee0544465607441a08a93a3d8ef41bde863c05a3825d083e48575175b897792ba547e79b38ab25b89c0067e28dc8014e51486c8cd5c17a190dff2375f3a920fa1c3879ecb7fe387edd215cac72f490cd7018ee17d46a0f4d5fad0b69a74b64ab3363415c6d5edb5b69aa9831984d24ba5f4d1cb192c19cdc4c095375dd5e5a562b17dad8dde34741c865772eb2451afcfb45aaa6023e5932a4d5fe0edbd4d1dd37276755938a47aa3392611013c491962b717744107d2f756f9808a2a2551079277483ab680b1289f2f42655ffe770c78b8f21cfbe461a9f2e8429837f7f15be891797dfc58ab59262e697a03b9ef351e08ab943fbacc7d8c0d23c7351e93a11b614dd8c9024a0a2fbfa91ec04be611b4c5a282278c33c5aa1500d31cf6b7daa8f27158bf28121684f24e8d79e706beb696452ffb71c4ec2c2b9904612e300f61fe9746eb370b3719fc7964e3459f8e61c98d5b1e9ece929381d6bd19ffad5a0ff36e6214d27a0259729a8358fe4ded419576d94de0a27e0828f95d60b0b25a567e397a6d2a45e92a161ad6bdaf503a1b6711d18a2f4aeda01b790f3187d6cb74ed23cea60716105ef65c9c01476c846a0e7f73c01ffe7e9774e74bdd0dd",
+          "padding" : "3040300c0609608648016503040202050430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "414f44654349ab1ee5933470957247bfcbed3bda71bfaf9688523ff3b198500b5e37a62634cba22a0fe2f8b8be9498fc916c704e1070d3940005d889e1618374d0035bd9198dcef4a6b5b7bbdcc1714dce5e21658f107be2d90e10ec048d5f2734f04d58cbf384b4282c839e3c587fdd8657c8201309178dbdfae5a2e0f2f163474cd7dbaaedac90782ac187b493f4f36040b8a9321253335de7a84402ea2bb4a64664030080c69c058426c952bd483de6691760de0b8d13b94ac72c8fe57fbaeee54832b7511113bde450158ffc96821493e37cfb6d21156b3bc038ec64f4e4b3e1e5d01b40982f52041214c55800f9129c2b9c76060f9317285e79a666fe3452d4f13fe1bd1f0ca3254d7dbf0ca5d740ada8db916a1a8305d6969567f39a2ff2662f3642612deecf0a99149420947e7984172bb54efe8dd72f7cae439947c8ca79436209d6de5b65f42542f24c33728e5b3192a76bc9ea51dc1d248f41381d898cca441dcea3c515e9cf15729dcfdaad5c249110254fe2f6738632b5c2a4090b76cbfd4b23378138e21b25ace3635ef68f3d679447cc744ef6d880fd5329058b2ea9cca1eaaf8bb31c8e0bab1342975d268eb4e8fcefa1f702ce1636ac04dbfa772fd2e778ad89c4caa9accb6e3a6324be7e5213790d80b4e217f362b34ce1ede12677ef547e8dd7ba229fc808ce31491764bcf85593f932096556b7d404a1",
+          "padding" : "3040300c0960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "1332f011b204562cc83d5f2a84606cc9afe8a6a374041192e02d13f425e75f9b6db68bf4004158fa11bd591ec7b63b568e18f19191b5b9c67cb2defb5faec6140f240c0014396e9d6e8fd5a0f84dda87f4a46c3b933c34bff55883adaa70c5cd3d69b93326fdeec53e7d1c8897494855f6d83c21470f0bd2248b0f731d45003b7f5897be4bc3993865a6a530952a6505cf49ef6c6e319a581f73a61b20cc678af45d53fa33e8be9988aec097bbaa22bb9544985a23c55df8a2a9776eaaa682bb706003f93d16695646330c8a0475f84900305b40f9b2e54d522ec0372aacb5109079d9db19c03595ad70350aaeefdac12009a4b9898ab4259cc5a29524f2000772440d3d0526cfc7f2d780888832b7527a3fc7b5df763d4d4d774712c31441269aadbe75378be716bf0b4f5cf3164707c8a8d300957564c5c1258119d988b59cf222950de826246f4fb5de111e8b72d6a7b038c9d03ac3b2d061a07c7d6d3b574860cce8d958ccf676324599b33e8ff0d24e24f25e4341fdbd872725c84bb666e604cd6e7521cb478aa80ec831279aea590654a8480ad545df96d89728c0de9e46718a6dcd74758ac354b47c772f23cad609ef6357266c4d21787528c16be7e2b74e23db435e9281029b6b941bf87c9ef9ecc222c2bf7d9feb05fd82aad572d03fb392445517e93ab6231ae9ff9354ddab4d49afa0291563e283e6ec3a7bec33",
+          "padding" : "3080300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "bf2d6fc105da6e9b202864ec36961da33148c02b3ef01919b54252458c48d9c47e8e6c44f68df073be76057a4ce99f7f39a42685522a1d3cb9f4a1a16cdacb079fc3f5947726478d403cec4f6d8547f8113ff42ab2c2a048cebb7f8d989d6b8690b52c19494f7dbb4e9f54b03233f05cf068f715006b0ba22d027b2b026c50690de6bdefb68e36ce3774ba496b4fd6eb9b4dc75756f492e91a7eff34df34739ee4c9d4c70e28cf0d101ef7ae131c602d3ad17adfa6fa6b2d9e290bd3133545d8f86fd9719068bf6466916b1fee375506f4759360dc67394eb5f2eb8229b4f25cf257d5ac798494f936b458f45e97bbb0e555c7ff0a83eb4cabffaf0acb62a5baf3eb76a571aa5c6fee066d9dcf4ee8e114f9b1a67b89de311c2d4e6305330224c10aaa8050c30f7eb611b544c74c3e76f38ecc193bffd82a2fb5538763db40a58d86c5d308d3fc40f7e9d2fc760ab91ec17872907be2b5b59cf8b63c5cb677e0471005eabce70776361e2cc91e98bb925d5576d5e9307b91e30d63cfbd1b77bcbe30541dc2e6367b75bfde9cbecbdedc7b6e83e201716434fc159705ae334e74417e35d5e08540f59061855cdceb1bff124810d6b44c673803257b8fb0d1d381a370d55f3bf59d8364299b7fe2f3ce0e0c8573be935c930a7cf301d5cad10601b5cefbf060e75642c9f6110df8739346c26ab3e7d4eeb8573aba901cdd7f5bc4",
+          "padding" : "304330800609608648016503040202050000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "5924a0a489677abc21003678c30202453cbdbceb80a0730c318745baf67b9ce438861e71076bb3981849310aedd78866d23b493ba42c37ece84044404f43664dd2648fd0e2ccec96acddb8d7ac1a73efd782d994c257b367dc9e84433b09ad4283b87cd6ef27c64b73a33fff9bc80314712adf54abdca29b61722cf38e509de1a7a86100605bd602f4ef5511105c50b1b49c51fb974e9efdde71e6b83858df47228e2e6de6eed91946f03c4b8429dc91d76f449fdc4caa251adb6b55840540b3ea379ba6220a6ea75fc1a716d91fab436bef8894501ec2fec9ca25b4013ca066e4a6f093bf3f2c0fef2965b14acd44c032f28af20d142feeb35eed9f3b7e3339d39a2d20069654df27f6b2577720b3291c7f65dc78601e6088e6c81d9ddfc207d47472b4fe0b4c633640f43c8fa0ed860e9624335d6c8c873b8a57c55c319975c96cb7e1c2c91ba4a4bec588d91837d7698de14ffd27ca6a1407e6cb58657b9a9ea050bede8d3e15d8a1ae9fd5bbe6f544ac0a56e95f5819025e392167db36abff9dc7e22fa1ed8f4034f77b89bcdd472855b918d241608f5d48a0ddf72b97fccb8d5cbbfbd43176d0949c48553ad6d56412244c763deaecf92ae8e09432c871eb2e62c1fe0f385e3590fe9c39264f00bc10d9280d385d88e28a522199a9108bd6d76f7d0d12585c8f6671074ea8405d2b396da5a86d11152d7ed86935e84adc",
+          "padding" : "3080300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "18ac3a1210812bcad60da4018b757ed3494d9f41e8458fec434aea32dd9497ebe4872c19643ad7692ceb186179c168f9e21a58f65531c494f18cdebf315cfc2ab7e423fa0e3872bd1c81dac4f85ff2192c9efaebd2a5f2162a72d13dac495557853cb10f0fc0f06155a808a21202f5743ed6df409f3e8e563feba4b0b11f3fbdd9646a2af4ae47f375dcaf2880ff199f56f1c528868f0bb4ce21434be80ab0e4b8d8f0ad76002542d2fb1d582dca46cdac63192a1b1a23b28807ef569da9a4dd9abf31f6a7b6bcd1cf19cbcd3df50abac097b33ef20dc1f9f372c070c9cf96b8adcde790e02bec4e26204460090fcf13b9cfbb71122c29bf22c2fc1500fb9bce140abf739f84822b4f7c8b8a115f5050993cca0589c5f762bb290643b13d39673238f43219af66b2fe0fa426cd05a774c29e3f6174b210f1eec5b12d879890dbc4b3cc3c43c17ce6d5d4964e3592475ca2aad44b0528f83835c328788d3adc68050b20e399efb422879bab8e5bdec8744c2376fac385abf5f68cae5239a1662da8d56cc048d1b1f55646dced4d1b5d79365d29b330abe412217eccadef0f18e37a2a6b7693271c67143a65adb96dbb561dcfd4fdac0ff9d2ad3579f9d692716ca28008294724709756df98fc53af3a24505294b74d8b43f5ceff8556f021cda4bca401b21f2aa9af455da7f8ad45b1c0c31291ff00e55620480de1fc33f2c96f",
+          "padding" : "3042308006096086480165030402020500000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "ac914ad805a436102bc7f16f93f17600f5f37d53ca361b03273540f838e5b216cab3ae38652a1b23b25db59483f2fff00a369a80cf99d3d0b39d40a66cbc5491213c47f5ea013583653c68eeb5ccdc701a6ffd79f189dd6d6cbe0dee4ee7f537ca3d0399c7ed4171bbb27619c008745227ed2a45535a7f70684d2934cba5f35f60530a27ef9df9a122cda908c357c86ed656993eb8f700b375d050a7c5308cce03f86efdebaddd0ad10e14272047e504bc12145dbedc7fd0b4eae560a1db0688ff1000b4da2645c129b714ef72117505e458bced44cbeeb331399841296ff1ee9dc926edd04f95979653307a5c359b420face9f3b6d8504195bcef9911fb25db0bb3418e87370541a160c53c5db901dc397fe15f9b86f68dac53c9119a6a51ae60005756477fda826c4e0013b272fb2b029eaa8f87375c20ea9626e250927d9649f69ae9e554b6f993ad0976810c3c1b1db5275e1994e8f066c998190fe116bde212b6f11a7efa6c76695f324697cde80faabaa97a9e26bc4c0cfb2c42be2021406156971a74ec6b16ca9954c3ceec6f39c07e9b3c8d60a4c57311d5ea1e66bfcf3df18e3c0cef0e7a791db286e9fdddd143644fc6dde22854d3081fa0a5acbb4e50c14aaec6da1ef6698a20e1d2c1ea6a9f67e4d4658e63f7550e84769cf9d7a1f29ebf28b72ab2d35f7f079ead71abfcec576f862dbd32f6906334384660bf",
+          "padding" : "3080300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace05000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "94d625e64194e4ddf817475a9b0c6ba31804290ff703f39c0f806f54c200be4522cee5c0c37a350546115b28b3bd503f3b9ce17cb485e4c2875a48dbb5b664a280b971f5f7e3f33e09ff9818cb32f14e62eaad82bf7af60c84dde0be79b51c0764fca7b2eb6b3c193738cdc94a3177af0fc6e5fb2ad97e3777c423429e52b7fb937bb4d3b9e0851484501a1c77d0e0bc3b9766bdfcf58a7a909eecd6fd2984f5934e0616f56c1db1b4e72992796b00d7386890d6906170c8349e0a313599024ffb3ae5b7f7a857f9cf91b7b90460be3c975156ce3590ff8bef6eefa4d65e2966e5bd510467d864213367d3ac6db3607b4c6b773078620905d7cc19094e0407f4c92753971227e9888005d1cb12a855563552e610537385ce80ac1eb543ac67331394047c12f4c1f29578e62062b078bcafef26ac9c6a0a306b68cf0a717b99641ea7eaf5677d8effaacc6b6d71ad713c120426b225842accaf4921b9a96151bc9334c545e936462b5eaeac25ae02df0a2c4e76167a4091182d2159ea3d1b2dbfa45fe521fb25aaa56b8e7c5cb0746ef9c984d31dfbc95e40357051ee2182e3a949337e3eea4074ad2d9c0d578584f1a01923393ead31338f23dc48e6f9743f4ea9afa98354ea3c6f657305b4c35eebc391f1601a88e0022601de01a5caf66ed3fc7107c4cd37961cbb953547484efdc4807bbfc8574ee0d895f1bef46437b1ce",
+          "padding" : "3045308006096086480165030402020500050000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "10158b081c00409582fa82d751e779cdb9501972d673a5702d7df6268c8b6c6d76ae8e98ebf558e93c4460f9be3bef7edcd4f78cb3a8bb5893cd055e884d72525b0f249e2418308c7e81b73cd72fdb5f0710b01878917677019fb21165fb819451b807c5b6caa23123e7ff0b889ffbc3484690ff2484acaf8030b6c8221a0f933b82e0b2f92f3b3d17105e4a52dde787ca4e37252ccc060bcb04d9ad752b03e85de89d2eb5d455a91363d189c4f8c0730cd165f4773089896b460584d4048837d9a18941aeb2ef5172ca71d44c72769f34272f612a89691702047ac079c0c52e77229a1baa744620d3b551a26a3b9ac18feb2cfe17abcfe3b9699b2474478ba586b7fa19f8f582f9f57a96a414d81dec30027e2784e031e52a3913de59fd5b5a6645fc71e162b73f0bf37dea30278a50bfff343f4c9f511f1880dab8c53871faa5683c219877d6cb29da4ce3d22ccdd3079f74953fc64262be53ae4dacdde65bac77dc39634e3955c00d817e8321427b6643dbf9f8bc83b85e61c959539e18af5efc22d4c22a18fafddd36b4f18d6285cdf37452d4f6fdbe4da2d478d11c8b5d1ef5435b3c9955a488e76b049dad19f2407871349093020f7879a950536a0a6c0f07c3e7eec951c8ab42dd150405fafc93abf43fbd895686ff662efacf9e3d13aec7ec8a8f318750715b45074c277d25a6ca71142dd15920d7047a4bb4363a10",
+          "padding" : "3080300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "5eb6e05dbd5ef027479a4685b3dbb29ab9be86fe8951a6d6908643a94d8a6ffda59fdeed42df9d400f8b89c1341024560ce5c48646981d6454d2301bf4f1df70be0af6c6dfa2b312eedad88d4a86af49e4c8d8a795b9433c42d77c84fe58035b4ceab914c1a9a19b37f18c85a47fc4449bb403eb1f2de3bc55a1cec6ff7de41bdbcc708b8af6b3776464e9eea900f910e807acd7ba886a7c2b76cc2ae5a6d372c39a6a89035da6934a09be6bf632392289cedcaa1785f6c008f332a887be0b148381f39b5d6da18b1be87920cb5b598eaf87dee65eef6b51f985d02cf5e2658d2847aa05776a81ff06f84bf9445b02cfa5bea1529e216f903b75216b794f3536ab3791eea6b38da91e732d784a870eab2fbf96ba60685db8d618a6dccee306bbbb3fa2c3c755d8a629099593faad78014c9f10ff9b949ee0aeba8bd3b16ad55bd19f18d14820c3a99ed87e1c21da8409786be4cb1b5c48e11fae272d8fa65f53f0bc2b79223f657d19a37931a73b4204573049b96d2e60d6e01e5ece0df14776121efceba7252dbb90c3d889fb7dcb7c43dfae6cdbc5c83416252d3304a82836b1e379046d73317598e6cbdc13bd7a2e89de3e92aa844f41a343e5e682692eb4ed102b3fc29e89567d789cf226811f08fc6d7ca3af31a363087c9cbed0201a2083225062710110395ffb2a2e446784b5c124f6597aa787acf303a0f20fa336f1",
+          "padding" : "30473080060960864801650304020205000608112200000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 145,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "d42e9d65ad28358b663b241dcd920f1390247f086f8cb360e6eafbefc46d8cd3e58ec96f691d39981ffa2c6f1951f4466d71bba2cdfdaffd85646456146121295e672ec14b5ace16b2dbbfca9d8d2c9d9c37aea8598cccc56edec2aa30a592abf542e18febbb8e075b11661676e0099002251faeeae23557efef2d8ec21d713c2fd85f4d194318f9763b81521c270828db050e12248dd6cc60b36752d17d0d3355080370cbcebe4d7323d022b4cd463de54bef641027f4d1bdffcb23f6b0ca3bef588122e35989629c209337bcac8129054d1cf05c057c9ed266ef389791cefbe3b38697c87b8362a7f16bc2fefcd107a99ba1b776dcf83177e5034999cd56fd184ef93320a88f40c0eed889b3ba77a5378938f6c8f0b822e7f4afcef619823e789565de67a7a3daae4b4b9d561fd7361ed000fec8236b94cefe60095c0516f3ee3712b9d3dc8684843c0683881d0ff690bd82dd29e15349817fa12db6f8017374568e127db29115dd9217ffc11c2ea85a563065b3b21372a2173dc0d21a0f8008b73ecb36b605cc17f1603f0d7ba3b1ce95593b77b572ecccd6c4297c60bf260ce5fe07729b75005a9ccade5ee19a04e68549fd926ef629f8cf2f956436f47bed5636afef7cbabcb4fc9c94a190cbeea82c79512b5938f9a746b1d651bd6e1944b3f88289d9c377bdc463457e3e1fcddf8dce6637d88cafc53fa6a3e2078018",
+          "padding" : "3080300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 146,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "0ea22f253fe76780dad6680542ea0f0b559ba604c7f5e16f1f248c773092f6fce860792b7c0a691f3b854d8554f098519084df3cccfa3db83ce1a172edfc672aab5e8d13ea73b15457b0d497f268a5816f842d9d787485dcf1655f6b73378c8e85372485054ddf409a5ce8ed8e8e2769fbcf58648863f0463d4361aa7c32aeb1e2dd3742106a49c684f89cf9f0871c33991ea99f488b81b042721f346400382deaed4dca657ce8ac17a68af64cbf9326088b00913e41885cfab0a551f097b59e2e192101148634bc063a8b2301acc3e5e0088dd1d47a37880c28883f87164b4d667eb96733ab93198c854658a4380b28e5ace8decade9ac82da2d889ec0092d361e34ce2664cfd9c52a0b49a45aee3e65ad4b545fb8c2a9bf2478b7c3ad969f916ab44cfa26f90bc802400435488512c63c83a7a46a1482f89777b629f913ea11a9b7c723c672b7f3f0396239ed75b329b94e1aa33df30523fe904204983db25d80396937c439709e443ece935e51e2d018b6159dc33c064598db728f7199f53fd659df0f6e6cac74e97812920becfb20bfb71d31fb0624a14e521c7a88086830016bb22c43a4efc3fc2a7ceba4291301c5bbb4aa0858823b65b0d90f0baa680809546f0dca13b4dd62f76cad902b522106ac4468c601218896a73da1971d7364e0dd1b6bfbb6f372dcc3ebb4a3f75063b20d389f4ebc5a9938c66c278b5a710",
+          "padding" : "30473080060960864801650304020205000000fe02beef0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 147,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "22b60129d2653639fbe477cba3f07e1c8a6f05a5eeced1d0e1d534acee45949c41c0059a2c24dde635b3b4c11b5f2126eb67d9deeba2067b17546421c970b6f6c72b66fb0fc992d8ea1c871b1256a99cfbfcbf75b2fbe130e2e8ffb0dc1b57d19c2a8ad3f944e27cb3a14eb444c84b2227da621610d3569907fffe581708ac09dcc10d0d4893bf46f18de5be2a5dddfcab4edec6965ca6259c700edf114bdc86444dd2a891ed114c52471a7409f81da490509502ffde2af5ffaea6cbc9c6a37aa18918012a4ce9edec18adde61b8b4f7612e312f466aa00ddf0b27851420f61901d94efc0473cb1f5ce22090735ead3fe18e7e72234ef758fc0a6dadcab006ba54166724099aa8942d7f3ad90f7e0031d4d3ecd79817cee7a0808400deb50c1f0f30589dde23af0990683d5463fd2d3a661edbc9cc79681098c79d61291d1c225bfe2a1d53111d35164e23f3e1cf176f41d292cc08e36a70552ff0114cd8b8ea7a8fe0615b0df6113d2e300a142803132bf296630f331190a33f040d5e8d22ecd8b2aa044d280d72e59a98286e72583521d075be2c39d2d5c35c97b626d571cfe214eb4ddb9ae4353352f6634e0a80e31d1eed3adc698d9652041461e1dbe63ab3cbb992b8dc32ca0ab5e8e280b19585df23317924b888b18416f131adb1ffc30c7e43b330a5ddadcf930ee026a228c2faaebf5678ee5a78677dba739fd7e799",
+          "padding" : "3080300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 148,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "c31a07c948030712faaa219622fb7c5d0b617ac39b9a2c64e944dad71fe7d4c5ac41ac5b03b4d2ef702f86a80da37124c396efb3cb49a699a290a2aad3d94042e51448fa160305403559814627d6f6b71f4869382da10d58e3f3d9b960f3bc6d96b2c228ea08eb37d65099b18ccadba626b79d3feacf1735999e35999dd0925d3384b621d97958533eaad9787159843a431e984e12d502314450336511cbf28a21c313a6308ac7769147caaf7bfe1acb28d819250ba87679a52692f9b1c2f833fbeb68986081fe36d8a9c91bbb939b999d6b4535e796368dad07ab86efaff9cf03dc56f91532e802433c7adff70b18a60c402ce53a3c7077884a3f405014c59fd2efc9fd1c2c008120bb97831b9ef1df8088e80fdfbebc7f0136c9f77e7ffd5123eda1e5d4e40fbec8149f227c5752b0c23035b0a5711b666db60a3ffb1a9e7e704f9704fc735b07d2347c6389c207c9aa17f414712bad469fea9fe6230825955c3bc54949aa3838131c3012cf9e0863cab77d95a96d37e021efd83dae21b9b16f75d3a97d72e8096cffd2f267992c27511b8e1db80c45efd0d95d55b6aff706aa37d7b142193d1ea74b7c359d4f6c8af3aa0bc439f35649d7161cd2ce79041eb268957cda759602d1e197adc6a2fd7421f0ea74a401bf5b947c4b39e6d39c19b18652eb04398e03c9f33d47acc6e3cd4744911bb8ebe5f3b9fa2ef62ad2eecf",
+          "padding" : "30453080060960864801650304020205000002beef0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 149,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "0ef4e9c1a2dea678cfb6b58581e01ae001e67e8310244ccdd6b83dd34d3246fee465fe61853c2fe02fa9857becafa74fdbe59aa21166c210b11730c0699ed35e36a274d0952a88f52e5b60e948d6bc2684146c74cfb255f346a3fac2d7ba3435923877648803976112b19cd9fe347955d0100146d7b8279a3d48b4c55813a60411915388f40ddd87175fb09c0b4aca6b68dad94c811385680c0a54799cabe22d9f376eb73105749dc2408c033f20d21ce0082d6197b2e62ca2fad78f221d971c432445a9330fd06cab0cffbce8046ebe419bfb354a4c935be8d72e75f7f932fa45bc2fae7f6614d59936b669b6a81b15275d8ba7c9e181a99e7d82bae1e152c02b2d3f3406cc98fe85da5dbab2cd6f1f379c302dbfe80e82e0a368c43d4d45907dbbf3c58b2c5eced793e8863dccdfd4c503af9b69355069f1b5254a349ab7350a2584ec044af3ca4c2246bf4ab174bd0477b11d6bdbfed1a9d48f1693c761e340348583ee522d51c89f427dc5c74771f0dd33538b90249db9c67b879d65b65dc818c1b016c51e055be80e8ed68841001c396d19c3caae57bea782dfc1596dbc26a3642b5661dfac202210ab4c85d5a516c2479cbb546915fcc809c14e0db9e6b4c6ca0fbb3c1b5b1f00fb8036cebaa357e05c796b546fe31bb1bf461ab2b65885b48109fec7b215fec0df1459774c96bfa8624f0f4202cdc907ec63162dafbf",
+          "padding" : "30433000300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 150,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "ac7d5e195ed9531de7ab8c86b4ae02c6e0c8d4845d2adfe0580ef3331db8d3267f83d0920cb5384735e1d70b053613e3cedfa84ec606fb2de2de471f40657e05493a05ccd0618a0a1edbbcbb997db604b122b50e12171888cd0af9c5e87614b7a4b91a714e45b1108340127442010b50f135f2e00119d25b32277923ef98c7863c678ae2eb44e8078f60bb2f43aacedd95af37d8d7e773e6405493093c20d358cca6206c4f76c7835bc8b62cbd98962587646ceccf57ffd3a29e1df1ed3e2fc7c69dc1a5c9bf13cedb130e685622807fc1f5ea48de9921f8e53979654b819114fbb475ec43467250dc3ce9fac210924d29d09e16594edfe9b5ecbeb90c14e56ade3bcb0f99fbcec5d0b44089ac0f006b3bc7e51c04420b6b2cbfdc850602c461672d4d1f19bc94e016fb756d59b0818356f07fa9396703adf698a0f29c6709ceb2789d698896ccbf8aadc965596d9072327e84418a733f3ada1b9fe3a7b50319f66a948fad2554644cae7347dc184137ad4fee0d63aa1766f935187d842d4c7a4f51d752c2c22916a2abe41bd1cabd1e155e1637915bec41a5e792ae8ce41917a8041d169b036f705daab59f48d7e4b8e7a4c63b992a4bdbf7fefb14cc76d14936ddd7682363a2b5e9782a0d2a0b3d1cb2d2e4974e4f7edf4e50ac02c1613c33018d1d85b35b7bb435ec957f37b693d736f89769adccf85872818943a67c93a8",
+          "padding" : "3043300f3000060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 151,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "6fcdaa3bdd2851153a88d3ee180d531ffdb082b548f0ad27b1dbeaab932401c62bc47a6cc41a551f6babae17fcf81e8b1d290350d6c827a6219819e9796f1cdec2bbc8a2c75b59953d9003bc0e5d1e9633563e4120ce608c758ba03a779bc54022303fd59bf1f0238fde26748ee60c2d87411bf0c93fb67adc1bec65833bf5d3e80b7a34c8c652b67f73a36e8dd3e450e16b8edbe9623fc895692018899437e14136b72633cccd14703ff9845166793773562f5df070496f5e0b721534b35a5305699cb5dbf56cfd62c1a8527f7d06604bcbd74d0a8f8fce4dc8733bd8ca3aa08fd85a05e2044933702d90897e407b274a6cda2397b58abf12f9cdd377368131e435096915b1031fe900d308196de742c12f156c26e49d7d95c44f4cebb16de3741ce6ce97a4c932a3baa286f4b0521afac0ff081976f028f8e6cf3c14bc16d905818f8c6c5fa8befbe4f753da2c335181e99c92ad106de82aa152fafd8507bc0032d68f22949ff03e3dbc829c513d5c6b4fd003f76516cb2b23859b07b77131fddb427886329db959e4e3553eb8d049ef6e33e42090611fea717ab3b42d56a1f678b0e70dffe70125f5c924d8d0154a3efb75a555b970bde79c1c6c64af6ce2b803e46b8bc94d7db826eab51d9fd441affd173031c0b28447aa6c2dd666ad32814c753fea22f3d816da523f3565e438d73175d508a1cb24bbd2a892d87df509",
+          "padding" : "3043300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 152,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "a5a73b52429e9596e8dc30c0960699a9a39cac3a14404c0e79db0a4e3c81aeb8391ced2ac1fb2808f6d45a8e84432053e9cbc8bd12a3bb862b067697c6d8e602db8c79524ab379fb68da90aa27fdc54617cd4e27433253dab56fa380fbac707a8626129e20a49b207cf0674633e29801eb034354a5252acff7ffeba3d64b29bfc69c54480fdee04d7686b392bdbd489da711de0656b7b86aa174dd78a80e6ddc424e0de16a01c25624f200a19178054835ceaac2c20b183199e62668f3c8141c0c7e4048ebe7623e8b511573dc12cb03ff1023d41484262a0f8f57a73a6ea1e00b3237404dad1ce60c0d7f40faefed4f97f56aae395c6b28f6d2038a769cbd4ee32507c17b4bd17075e855367053b5c2eabe33727c1f54e0a96d188da41220d57575efac1ef2ff9784e0dd5be65bca24e918570c52aff4419d7b0571466091a9f68e3d55a59216f8f69357faaafef2b0627e85ffb6f8cf2338d427952c49e7430a427a5099d22bbee55e8afaf266e10e4fac632769619501c35f48789373f155f3f12adc0047444413a9ebf490e6fb68f8f75a575971333a14ac669f6056f1ca0196761df6a19d237e1b60895386feec829fc7ee1d74c4830f9435562568f858a75dbfa512782d9a3f817cb40d6a496a7e6161e066c8529f1d925eb215ed88b2984a0f98dd8e28886865945ff1be0789677012ec93b88c9593c4cca14d5a4a09",
+          "padding" : "3043300f0609608648016503040202050030000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 153,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "db24a033b6f1f1fb4e43ff98b0612b93c5d19957914cb21ca78c4cc6b3ad5242c13f575302ca531697c1b73cb06f1b7d29d017224a1f2e3fef14c97aee8290d86c00922af0b2e82f7d8010ed993fa983ca77c5dba14d491b32d7db94c56bdc1159e743f4812d73b1103badb4739f2f8a1d4b65d4b6c43fc7b83f35c0f30f0d9177219c133b9be10873c2bb0909c6a3658e5e1b3eff12b0a98c39b7a6b0121b240685113746834eabe950d61e0080ccca319dfe0d7fe33b28ac7d7628691be5211f2e1ae02b394aa9c88b1ad93ed64af0eb8af3898daa98d384e6751767b61687a5a54f6adb4c2fa76319565a5236253faf0497a625a62df92734799e192464f792ddfbb8f64ae65fa1fea3e3d0c4da249c28711db543a588493c5d20f42baf8812b3b41b059c7bba828700e0c032e55ef1c60a1a4d59dfdc2d9f10f9e72e24477256dc956ecc69af456409c700805ae0f04e9fd42c840382708e59214ddcd888e03cb96f2d22d594ec199c54162eabb5b65cec08473590f9c2ac034302391e1b2e9ddb78263bea393992a43ea1bdb3571075d56e2b77f874fffca00e291efbea0efdcb813a5083e4b74b1066ccff5e7a77fa4168dbd14ddec94d523816ac0289f5285b63ece4e5aa48854705a03dfcc6e41982139fac18f7e4fc0893954841be37c18c4f9b1f891c2b8811a60b12ee62b3085509754d9f33c30ba808581168f8",
+          "padding" : "30433041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 154,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "3ec8c8209450d96ed0cb462e1908c450926e7092378c8afec5f70636b8574e85c67635697b95b3fa3ecc024e5629c68435736d1412ca8665b77670afe1a48bd79d636855e2f85ad049385846d275f75b6e77bb69251112352f2d438a5b0db1b71f9f3c8e2d46744a4176ac3a7880a36e0afb157de03e5d59e01fc929c672c144a448c77bde4dda5d5a9dd74ea5e53e07d07e5db63d845fd1a18114548a5098665aa644601d6e696bd5d2f81f1f71d9f2e55e456042d7ff36d813b19ca420d608c8704efa0519e2e147f155c5f85b6430275b5c1fa913f94d78911e0f081f8749f5bf7dfbf21a21fe50312ec40b8f8c9d1c1d955d0a49e668b51fec3a52d268dcc826bd77fd5e0af4f2c447a51dee40fc15faad7f797e0db9072faeb1fecf7cf312814c7d854ff3ce000fb0680028c110e608ca25b8902709faf64d0ea53201abbaac6025b87992d961a455a2778ff556015becb6ca41b477733c22d991cff0416b842ec3d86c5404b2d9ed3f47efddb6fa1f0725385d1733a44bf75b51a6a6fbe25af3ce0840a95f86da227e7f93f30ad47c033660c45013be292820f33d9c9e5d4f68b5e05755e18a1bce10003b7d2ee97932af123f636295bd8a13e07577ee3f3bc46ae6e471fbfee565a3b461bab9af67f18e244bbef312c8a59cf1eac8e88d4ee1b7e085260c0507945dd907ed6797041a594b88bfb1f338669f06984a70",
+          "padding" : "3043300f300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 155,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "4d54e56f587d6fcaf2e43ee1a8eff33e833f83d91ca092d0b536d0fff80ad67bbd9926e7fae8b2b2215babc678e6abb916dd19b35c8bacf99b397c8ef364b9d75b595a4dc9f07d3d4a59c52fa4fbfea7815a2196b7971867c8bf931705be8f106d150e71bd7f7d652686ede684addb0a29987a224627cfad213064c1d1d6cfac92f88fd9fd0703a74741a71d43c8029804fcac4d14f5d8591b15eeb3dff5ba654b521c31cecf2ed7a70014c748f9beca3f1b69baa4fbef8400888c5b354a8f6c80587675435927699f0894e109b21aed4ea54ff60fb2c8298425b2f017db44fce14f6eb4fb95759d79d805f113493f7d40722fa37cf797e03b6937179db4438a7895e74263a93ba212e7410e17251d5fb49fabf05c142c9f4649d44617652a5869496345cd48245a3fbb6dead2ace71b7fc3965de6e70be503b2fa953bd9fc76f5be70c0f7d987a323f8a221b875c805282b6eb58a6e4343eb3caab62b902c9310e56ad50fb4adfdc68f11e9bf94d76410bdcf4ebf05dd90d341f025ab182bb8ea0e36579288f6274d47c6c25ea8650424c2e12682ae58078f6bf5b0772d932aa77d837c2ccbb0856efcc564a28a03fe57e9c674889bda54b452388ba8373cbcc26c74e7e93edb9cdf6b91d22fedd014f1151f8a5935ac64e28bf90bf71d92d8415af15127dbfdeb98ef80e841254015641596f331cf5214edb7d8b3dec1f8b0",
+          "padding" : "300f300d06096086480165030402020500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 156,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "3393a6451aa65fb86560a8d01c75c99485be4cf363e43f829a74ccadf02aaaaa85553853ed1cf0115ed5358580eed986a3de779a1feb8e4e1e312cded0824a0e1b5669422d00ade2d77da369cf2280a99b9cf42b6c2a7f3038aff49599555cd9549064d806625c077a85468c5d36fc8ea42078a16181ffa5f75db72f0eb19d2bbefb5ed86aa80a821078dc42bcaa0f206bf9712ced9f18853a6b24e80b418a0dfafc6f3d25f7ac4f20b305fd959c8972eac20fc1dd962c0e504ed23d2231425ffa5a8ce0a43216f07a3cce90cb503ace3a4dc6e43f4eb9a93a68a0eccacfc5300ce94a48f96cedd1179b294918bf6b1c6989ef4804bd62d820a8e9ffc04025b7657290f74fe6f02f2f6c6e0a5638d2b806aeb27110629ab78f1d4bfb22224e8ca09e47b118c972bbd3038024214e0d2a8d939ce06e0f13ad60d753fd62b26a83f9b2c28a10ab6b8e5112d3e52b03258edf0fb204ddbbe1270e41eae54c7f92c2f65cd287aad76e6dc7724711ec03b338e3f6ccb9c8c859f878c281dc0bc61a990d244154b39cacfe47b92d7f8752334e859b5796951ab3b3a09bb269de282b8530a018e5d4f15481400c0f3fa5e60d0d14ff4546598ced7f73a28468639cda085efd5099c12378b12fa4067c1678c16d0954f4b5954a48c2deabb4f694c171d69e7efdccfd18887e79207fdfd0e879824ab991aace5dbfcab0826ee8f44efb54",
+          "padding" : "3073300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 157,
+          "comment" : "removing oid",
+          "msg" : "313233343030",
+          "sig" : "747cbc58a4e2564523c46358d210af9490c1dd2679ce66d26704351d19fa8ccbb3f66e32a066deb11de7dc910a37f46e250e0f9256dfc8df5c72cbde63a2b2ab561b1d79ea94d51e84d0a022552a7ed8e457822e8c17c30c723ad5c4e333e087211566cfaae130e79bb0103bbe093b30f1819f908c5691f4b4f0ace3d8cbca25654ebbb506560683fad45d8a4914b242b72b99a223a2c0a3ab20486d2cd1b0ac60b438d8cca5ec2f7bb8384690ec4ee9fbb005b3d2ea21749ab86ce9d64414e9a87827fc9177f1a5af6cd97fb823874ba82e9ff53093fa2c05566c63e4c7f5dbbad75d8263594cba2949113341fac7c83fa13350ca06d73177241b3793f78027d61a20c37c56e9f34fffda7258004b0202a12969f718c278854b136a110dfd65fddea97486786bd5785fa2596bfd6e78e353b4d28ee6434df0844af14de10efe2d6f088b2b3ec0a7cf6f9e4a5830d7b0123caed7857d0b71fe9c56e72c29a908bba3cb99482178d64a4e27972179e4da6058c97e648c830e0cb96ba71eddc1cdf41d38f852a16554f3d9821aec57ec8506f0bc1df2a630b58fb082c84dee5e7bf3b645c9887e650098508ea288370f9f2cd32fc3f74784c82fc42bc2a09aef3b8c5fcaf538c50e12adc672200739cb2dbb343b1559bf70b00b2f83ed3139b106ce717f906b6de178c0d9da66966782cad3f7727da3e32950af437f33cf14e868",
+          "padding" : "3036300205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 158,
+          "comment" : "lonely oid tag",
+          "msg" : "313233343030",
+          "sig" : "e168ece53793eaa84954f43707e9db53e1541394540472d502a676f12c5b4c1f1844d1e4a4fbbc3117c1cc503aa49a63138565aa366288fae712542b11b35026a027d3679c5a35f1957cb6c5942b5d86464e3b9dd6463ab9cfb9931136da744370f6b3307ff01e1180a5e79569e73e5ef9de4ea5c9f0d5a3b124714c1b645c8f0c1cc2ab4e1845969654ae9b0c565f4d17a844ed066366c17dca17f22ce69aa56e48937aa1c9f39fc85435770fbcb4d9f05048215664184ee40a4ff77ad44ae9b1d9dbcd9f9f013080b751ac9e2f05aa8f546575562194730f6cf1ea52f0d365d0dfc3fcef820c51d9a5263a2d1dc4ca97be6ef69bb2ebcddc3f8f4ea2f4e12c187949d95c3667f4c2dcbd65e06937fc788b5585b742eb5b99ccad8252be7dd0b4d38460340cccf82c5d2d58c29f87f0fd6f78a90ac7a113d0e5427aa56a42438c3c6fd98fdaaebb3dff5d8d3025cb408da8a6764988bef9d171c7c3a51d187aa1bab3f2a58425dfb82730488e83d97fc54070e2240c2f9083e6f6a4f49c50077067a4fc7d27e40bbf30f8fa90624d7be0e6f8c43ac1ce42760512aadd27f2cabdce2c6fbf7adeae0221e2e82cf22d2941ac56a3e10cf0f0c22242b4d7fcae009081eff5d23b6dbcb7387eb59922e5bf757c02143e1140b2831478a2a5785d056978e07dae02aa804141805acb7a5343acc17206c949d8b9f8fd5df0a36e7755",
+          "padding" : "303730030605000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 159,
+          "comment" : "appending 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "5a23159bb4948c16c9c31f7b3be4e2fd147717b755d13f5f86933302f7356f31003bce391de69f54ff602dacb1522b908fa1fb7156fa555f3f38bddccef9f85f22a53e4f53757f81d6455998169743a4a2306906a375235e548aece0715f94d83377e06faf758a36fc8758a586cadd368b1db26ee3861b79d6b69c0f3639c9ed0a24bf530625319125c301f5c10d12084b2f9917ab404a65a5bfd2bbc78fdd6bd1e583cfe87c0cbb4d41c710c137a7b330247b881af9aac5b2c5075c66ea33910a3b07d55c461940a54cb7579aaadc9e8f567d60d0548d6c2d3628e7bde8b631335f2ed00122e07f942f7005afbb0d2f0340c5c9270b27be30d10333b9ed5edb90ad6216b95594f6ad595abed26576a7b1d807530e7c5556a8698de56b481e5717683404f6b9ecc35bfb6ccc48a381a51537143abff51a717581f2c44df1a1f058c1b793be004b1a837f7acfd764644921b3472906e90a5bd265a0f0fda5e16be4db391e07f8daa84349fdf7a134aa138767441759b74a4913a4790f0e599691df06acd4f80cf5b64767052ff470617c93ab420d90b1838c0bc891bbd2581769bf203dbc8df0073bb826114e71fadea586d7cf6f06cf4d04bfedda455e043439937d330ce0a03ff97d420fc623163afbcc3e7de7025d0689f9441580308d1280e9235d8f5988ef12447067df3ec846c3e3319eee29c2b8cc713c979156d3e3f8",
+          "padding" : "3043300f060b608648016503040202000005000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 160,
+          "comment" : "prepending 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "819926a1c7a0e283aa3ef42cea08dc3893fc71d7295924d7e8909f46ced6724bf38d137541224982f072e39a80cb277dab8dd848ca85fe1ce6a102e8adaaa55f2e9169d8094f10280829c3332d24507a54452a026a541446fb388a7663eec512a0ddf7402efde859fa1662108c704afeac80daf6f8279e5ab5bd552dbb5a0a5d0f35fa5431e8ac36daf25a5e36e09699ba25f00fa69ed7fb527a49fb25908ef400ab9c080b73c5f4d41d965ab1faa1472f76c63d9cc359f7964d854d8f8db382c304572ea6498a6f7e39f6f6064aea336949eb157a2346975f1a71e1c18a77abcd0c7bc2f1ab6a0e9297d121bf13f42cca5662667947d70fbc026fd2a03c1353e34cec608dc2fba202163201cadb6341cf80f49048f55333db9754c5fe95b01219eeb608ca3e8b890df71501dbc579332c7ca6479c6fc3c34f31561c15d500ca81f25204e2f848f87c472cf030b5b40e499e3f034be87041dd5756173f1f2795d1f62bd74aa817f72ca8a131b0a5b7fea3fded32baf493871f0be8251970fb2b3031122c328e7809139d044d8f49e6bd31fa938b732a5ddc0039a723eb7e40491d7533092f1b7b7d8ae68add6001178ed1624fd3b660f0af184fb70c709c78e83b1dbf156b2c8848cb986160db4de954c12a29d88496283a3cf37acd0e7a63d86135376d43bde517c40e9b5e538999a86e55319eebd9a87149a81aea225a8128",
+          "padding" : "3043300f060b000060864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 161,
+          "comment" : "appending unused 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "dbbc34b6ead6c85534784953c2f6ffa36b018f95e15e0c28b214ca2f80bd9694e2f091d8bc3e25aad3c4c9e11edcd73b6785384693e4ccb183553eeee251c5587150bac7bb2d7c717fd6453a72803443c8372260a096596da4a0b7c32750fb264ed58acdc736c86c83396b705fd3acc0f3d7d3135dd4b576729d68664cb1e11966438f08d417c0db8bc37b0201cc9ac0daf9ef60b9b600cefb79c25104d2fd5480c2e2ac100e9500729a4676ab97e09078736696dd2f51cf90ff963a6ee99b765e4e0f7cf52094507294de601c0d46b87e8072e37b88621f9dcaad28cec7d4544ae2d1b5828bc1ac9e5258058209944ab8e924fd228a047dca03ffe2f28e88f49def895401ba3f05c305beaa10928b7a390eca9b61b73e864c93559a3295703c9bd82664b226bca0ecc90d2b27dff22dbe635f3f0a347c49239104080c5b8195eb4d750055889d5853be4cc984f215bb491e2a8c7b0017016dcbea3b9951ee935e967d1515e659ba295f76be48feac1c3aee2e35d309ac71877ae59f024dc9aaa9e2053e4d4223e482ec3fb1d7f9cae98c18db9dcfe307ea6916f137dece096398a0a62a594dce4048588f87e1741cceddec314d5960fbecaae8cf48afb09d3eeadbf5a77ea1c27905f7ae47dcf066207e621e892e7d780bcc9bae3ab62cbe2a4cb43b6621c47f904dcdcbe7036461ee2563de1f6061c22f33a5e4997adf9e63",
+          "padding" : "3043300f0609608648016503040202000005000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 162,
+          "comment" : "appending null value to oid",
+          "msg" : "313233343030",
+          "sig" : "ae10acef7e1ff0d50705a425f623225fecd0ef91890696ff1636123023a6009b971a0fc20c50144ba4c42a6d45fbb9f48dce8a52514574cb41b71bf6c7cb255903aa9dae232c1c1ba567ef505cd040a910c2809be37a0f1d3aa8e6345ff77d0f95502fd6cb88d894d961b987c4c2ff6a11c279eab2c0759024e90ff7332e028391eaa1a9e5d50bf3e7d2a223b52619143afe8066faf3841c28e8b057f4326c0a5eda878226583d1d06e491ed2bccc20dc8ca7340f3582a7e9f313c90759f1fd076054ed464a10971c1f1e837d0dd7539bcc29ae9923691169f6f1b6a3f40eb09605fd987b75f4d035605f9fbb33a4d58f912b76089cdbed34f14d1c26cad0d400fc4f7d048990ab37749dd00b22f1b3b9bb31ec35a51cc336d3a7bfdace0ce5c916784a40c7cc76a8a2ec396939487b62516182b19830aafbfa6bb9c7947e7b1302f1e344100975c1d1ae523bcbdbb9a5a0dccf800447a7917b2a7c40e7b983e98ce15ca2516ed660975f1db031116196d4a52f8bd3ed40e904509506f8fa63daf1dbfce32b817dafd452c03e5502a36b8cf7391a3a7d9d303a9d5c5684dcd17634a80a73eb8a46855318239bc585eb2b1341bbd842baf93373e4b8e611dbd6c24767f1a8d620f5f4b97c8e00c67e77b13315abf9e5a98a08e56630b3d3049ea354ab3e69d5a5ba6c09d1ded3cc61d0006949a140b66b80ac31755c856be989b",
+          "padding" : "3043300f060b608648016503040202050005000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 163,
+          "comment" : "truncated length of oid",
+          "msg" : "313233343030",
+          "sig" : "d9acf55c9c01cb10d9acf6dc61e7c7be67340ac52414cab198b8feab214a561b1e20ee5f6c5f169f0339836efbe99044ea672d41aba73cc40ee7eb47f9262eea426cb560232bce5dd11aff64d9af3bcca961207f8ae559fce24b3335789c8ec32e6f4732ef0136f59ca560f91aaa1fe6d53902822fe559d2dea8d3a318a94ce4d6fbd2fc399c7a78c0f14d70e44de3bac04f3668237f7d45d2cdf53782879a6dce950a33314122654fdce0158c46de33d991b9097b24fd11a2718f60156affb27ace6a880f04689ccde83eb365543406fb7e7826986f2529f0678441ada0b0be5870ce5d1c22d0c6684b5f897ebeeb9ff5833505ce2fd352b5286a3dc9209a490483f3607dd907006e1895b3cf887fd657058d9918e8170f4031f6dea28b73b83f59a94efeac01716a0128807a767860ea417ae681f5f2bc627c3c9de61584f30496d28fcb8f9a18276eb488144f9adc33df6727871d3570ad5f69085073a3622dd8bf4634881d7defaaac0ea73b3a40e98b0ef1214e895c1d449c05137b0440f581641c7f9be0c7c718a08c3c8a6537fca80ab3c5f026644435b873af6b098a792dd4dad914f60e3f0de666df582b0c2279c786a82d44f2bf2328b9dca6a92da5b8a5bbfccc6b9cdbdc741560e9918ca6228629437ce593080b2952af34d28f72fbee2af5347fbcea9c51798ada5e09a8d8b3db7096175b5a44e7005689b49d",
+          "padding" : "30383004068105000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Replacing oid with NULL",
+          "msg" : "313233343030",
+          "sig" : "5e82a192a85eb098c1413968d3a0e58d0084210b641355a74a1b59e8651914017920e905a2909c89cf7b3b097ffebc34c06457bb9647ac394b8a0db5dc33af5f4e95248c45cf22c53ab1906bf5516dd3344c0cb02073e99ebe267e5b36586f3b20cf090f3c9512bf1bff2e3aeebabb3b9c328c971039aef1da8608f0d05ef9128038c35002889af2f463df56d028eb0ffb5309474e7f7e6101ac9aaa854d56f1a120588201f4fa8362515a26201d6249b02f554e7c2a885b520b4ec352387b40a7baef56c3828432feed464c1265225c8183e781869455f36159259297006cdf368c2dc82a93a286941c136c6293b5aa753a053757a8cbdb59ddff5c8b2d7122327d89802b711ec638c6b7c4f8830f160b2aabc128d9f4104b5d794ecc35d5d7773baa976e0efc795e5272fe0b6dedebf3137e9d04085b19912d011cb7e746b10cad9eaf5063cf9e1c1e37c6957a72bacc261fb1c777795d16badee7dc0bdf3bc12672f4d8819eb111bbd2b3ac7b4658d97901ef0c44ecaae7b21d9b04ceced25e50044c69600573c24541608f1ed52c6b2f5feb0684d0b1bda858467f2de0b7c405490bc985817d1bb53d55f99ccc85e6f4dfe3729b43dc6e39ddb6f470e52221447dfc336fad0abce1ef06a4c0741ff70e52fe94af1088fbe6f7ca22bcb0a097e32f3dc6407f757d80fe345bca163f0def954e0b58211b2509a647bd238d08",
+          "padding" : "30383004050005000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 165,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "15f0e55d2c991f709600d78d4e4a2ad19496adb55b99c5f6bd92f460112957c54474afde1f3e75908a5694883b9ce7dc956c28f89aa692b6ebbbd2873836b8ae596c914c11cab73e6333f2aac5d92778d95361110f9f4a23f09a37350c20a8850db12b522a8493cd085714b79906254c14ee5760c7bd41d605ccc106a94794988b2faa823e39b49c828a2a03bae06c57ddb675f0fad16f085a0d720ae8971395e8a317770b5da937b73ffb2a1d86dc6000f0d39be03c1dc0198f5f3121321c1ba0fc480c4280852cb315198ee86a3b295e37160aa2c5e8705b22ad9631a51a76789ffcb753c3cb4802fd7563da76b8ae740bd7546d8dc6b12c318dfdfed2d3f353bc94b0ab8a1c9111531a21c1af6d8422eb61d6fcfc77f983aa87ef8577a737bc095fc766a7a37025d1743969768c3f4389219f4660f9930f4cc45d62d181cd35d118b75ab3b013433b529234204f52bd0dade8609786ae30b97c0152e05ab1b119c3f8862c1eb1756dffccd5f1ad89c93cd946384e615e2c712fdbb0bf16ceb5c233b88e2ebc2b461e27bfe44b35ae09ecf6b726236f45e8b1a8f56fa23f0dd889a5d132448c04ce225d7c83695a891b93639f3214b7ab76418b0a252a595ae3f4e6dbd4e0d729bab70ffd3a31e6e8d8142df6f76a7d5ec60fccc8f04d3f790bd373bdce92e0f92af5bc90b5b7da24a18a38c8fee8f3a20dd303b540dd64a4",
+          "padding" : "3041300d040960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 166,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "d156c8f72fd7bb5413c822f35cb58dc39bf8960f0171b2bf045a46db932d402e63c24e954a466fdaba36689fedd624a0c44c02225866921414909b99aed97925736028ae48bf2ddc5cdc6f57257afaa46b6224a5e9675849493c097542bd778c5da2bc3406bbea398180549027d6602906e25233c078b7ea06b4af69cfa5860ca69eb0070ecc5273db8cc0445eb4caf565af68467a4a24d8a5c31f714ef82c7efaba313ab44f4cd4f6dddc78f604e2dd42802ab9f6d828e43da3dcdf67dc2e5e139bb5aa5c944589f6f57b1e0841c86fce76158b1d3683bdc0c8f85c361f0312dc4b0ed456ff9c670072520f1a139c49d70d21932a50783064d7775adbbb638f36c25b2c5d75af8fa67ab53440508860d1de242a815d0eb87f2692f5c8ecba455380b61dc8653130e2a85110532df6aa39bbe134da1f3a14adcc48a8e7f282e142ed34b1feb119c0189079e81ee35a86472245789d193bf6f5717b5fda552e4eb547b3518b292925f50d51afdc352469796e2c9d28791a7428a68925afd1eea528aa5e85b00edeb34daa09f7da65c49f31d8e12052fa22be651918a797edef66fc5946d5926f21318d8abf21dc15163bf7f630037ca055e83d31cb4cd47d6d44ce81491f318252c8b2d80aea4f5f060643812be02196df31e73c354f91f0dd2cacbfc73501b1d8d5cfd81d6574cc5be05dcbf7603819b81f6fd1b11dd0d3198c",
+          "padding" : "3041300d050960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 167,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "2ebdece5ba8e494f3810c98f49cc05c16369ba336ae0351123ab6f1f80f3fde76b98bcd9f79643993bcf0bee4e05ad6d9350729c4ef61597b454bbd716a85022aa9c9a0ee2471bfdc22e87c327086cbf76e36ae4f55fbf7fe3ddbabf50e744facaeed389aad2f58e8d11d355b2639f382404936d88db825b6de87aeaa3789eec51746db3cf7db9998ff8961a3f499079112c4f59535b8896a30b4deddf1ff6a52e370dcf3dff8b7f3b3164ce78b579469d823292304886cd596c512a1ee5f189e40eb9629095653d45f05683b53404ab2cb5ae55f64bbea4cdcd003ef80c3cec9f24e8842f83a992f8010cb996955a91a5362c6fd2c6e57a81f5dda1fdb931ca43997e51ffedb235d843b590a253d5bf395f6db9ff233af68a1a54349dd7cb37351a1cb3e5ee25cc79f19403ecb41e41eddc02d4eeaab64202b8696ca7149456ff00a563e8a2fc9f90a5d25ad754722763d8a04bd7336dd7884b5b577d88017b2cc66214b9d0d569267b43b0d3b7446f31cffe4b37161ba027e24353d2d63a339c8fb5bd495ac341e0eb864bc8ec25874f65fb627553031a58c932de9e99330a28e65a4066ceaf4120d1036f46b5cff421061796f245ca59a89715e86343a8b52f94eace323ee7578f0cd7ac8b2b6c9d53f1a979cfc863538c1d8a87bf21d07d7104975ec7a62afa2a551b5206d2729cdabf3f7c39396bba123a207a03c6686a",
+          "padding" : "3041300d070960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 168,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "5d02decff78b7129151a66d93a53d501ff3cac82d92694dac78b6833b088a3889daaadc9f1021b02b6d2ee77a2095745a84048f606810b980f715d18f15027ebe9f59279895d668b86d14cd1c056d3de0e1e7da6472349de57b10cbcfa2c71cec7bdcf966ae6407bcc90b3aaa3df2802dd70be459da4e7612be94598dbb67026d61bf3f88fdd014fd6f180b32b785037a396970279fc26c0e689cf47f2b006908251dc1448caf42e71e19bfa0668d7bc4436d11e694add08d86cc10316f07bf64c54508ff058ffd70c24074abe83797157e057465a1129b0712ebc2d3311a7d6bc8226411a824c28d8ce81b21a26eee3cf5de86bae79f8206abdc93698850d141fc54b22d7f8165aeedfefa8a34f78bda9baee9c2ffbe249c33ea2040fe31651a4ab3977a71f36d13f912fac5cda4c1ed36750a6f16bb2e097535de4f019489a18634c4036ec73a3a944fa45bd1ebe073e0d3c36c536340538ca349ffa780e408a4f10da0aa6c01c3bfdc41d4001dabd379d50184c1a78d27944a1bcd25dc17b36ecc89babd03665029bdacc3aaa8c86709e91f656ce7176a25a67622642a5013a7e4d6906f8c3c49f998e9d566b62409b016d7befb6a87ac983b1784e9a1963d7500159912ba514f82966bda58e2aa5ca13c8244c464508c3eb11e9469497a06f1f96b3c459055f6d2e56a73609b5adf94d0587a31e3d85f643b9bc6ce2df28",
+          "padding" : "3041300d080960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 169,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "39ea92860d76b373c6eaee74fb97f8439067c02e26e0da5a1a85e466aa9df4bbc1f2b644cabe5452b2692b4aa396d298e7a9e563d03ce3bb65a64272f903968e5ddba1d0e3322c90c80827beec9935094fe07681f41241bcafade0a2a7fa69f15f852ec457763427075ad4a3e129c229d75fc288b462a1713c8dee10d2a271168e109cacbb2b7f14e625007409aba3436d1ecc074c914b93fbcea73c5132591cf5037814ed9bf7100b48d0caa41f415ed7317072091d72036871a2d32107d02480bbc1f3c2cfaf407d0eb218d003dbd3a53c0a4ceacaf9466eecc741ba7763c912a594ceeebaeb3491ad7603cb74f5772567ff5c978c9dd1a3f5317d957492618b824a445155d1f7fdc25dc93b5d17c696796b21070af78c6bb4ef055b0e44f319af4235daa79b864fda2cf40030c04c1230e721565043e6ff907f17d7b1fe34961e9c8603461dc15c9969d62f17ea9e9ea8783459b135bd8943a8e1825bfcf7eae8437567280f6303abf5a9158bae430b1585c21b2be5ae189ecb5ec59ea66b97dc1d8247641e200c1b5b8ce905d6b095c0a0022efa707017378573eb309fb204c1d85baa39ccf3ac6841673e1aa8caa1954a3a3fd2d8d8bbef94541bcb593172a87b8e5a27f94272a053ba5fc940d905731977c20e050fc5864d2dabdc9b07c9a1512982b6fcfb1bd9ae4a4bf8be086e6c9f8904e1d0da3fe81f756852e982",
+          "padding" : "3041300dff0960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 170,
+          "comment" : "dropping value of oid",
+          "msg" : "313233343030",
+          "sig" : "a3d32a7d13de642496d925d37624c62ccefc1019fb614d289e74e71a71c98381f39dd0a041a364243687ec4d235bf07909fc862a1f9bcf122e73e53ca83433e0588988ae9e3cfd743f2d68404b3fb3b7ddddbf38f202094752f868caf1a234d984c2f80b26a69e39282b3e5dcd7c0a425e16788c1980497aa77aff1d545c95e1ba03b3a22933cbe79f047abdeaa29f9529c871702d59aad3e206579bcf9c1bd05f0986333031b0262734b3ce2c1e11f22408c751917832be4d9fa83e255249775bc9611e5966d08bd2813cd41cb2224d952e6f3d465ba97af6db4d957d72cd82505b6d814ffe92ffdaf742a1e0852b9899a512b02197ba58788513cb5eab15c87e45154dd11095758b7954f2bd10a363557d92e07071b2176230df060a2a6e026eec784bf65664d903a4bda0a6ca37c2463a5347e404cc49d48c1c006f43259441535d53ced7ef3451c705f90f33bcd7e770065c2bdf5af1b407548c79564ea766dea5a4c59a1c07a64b72a9421eb42a9b59107700aa94f9a674c3e948f476da18abc459f8cab734d2742d6557c4c6003d08f8bcb217e7a5aae2dac2c25a5b547d842271203862bf2b351a9848ca7e5b86de87fd1c58d05d801bf648a0b9233560f9704f4eafc35735dfc975d701492d453cc02fba018ff51874185c2d64898e3cf26138aade6e5d99e7d6fb3d1ad8eee11b366d000f1552acf5a4d261ade6f8",
+          "padding" : "30383004060005000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 171,
+          "comment" : "using composition for oid",
+          "msg" : "313233343030",
+          "sig" : "8675ddacec059c224f46442ca3f2c506800fe11dd2444a6a341689fad88cb74047890df144bd1f4589fdd732b92b39a1c654dd33031f4541aa888295887362ac0db4eb7bcde0b2028e8674ed15eff004fda1e7ad4071d4b7eadb9e4a0106b90c92ce3621d9e12ead9917c5ee72b373cf4657dfe69da410fe30fd8ed72ca220c9e471195bae3face29e184c0f33a05b48b2737ba1ce2960a0ccb0ddc4760b5f88c463bb4a349446cf1c56ef332e50f1d6a6369cb3ecd7e2af504de42c075670438e7c58c5ef52e23804167b6db30022e1272f8b698ae457981a18d239c228f78e128a01c7c0c4fe62ab91dcfecf7b6a4e89e9be784d043b4b35fdaf8e81ef0ae534ad448a6650f496b15899abc5f61df6793c97cbed05cc1eadb227ac204bad3edfff32150c73c369a74ec0d84093fac2af59f53ca0d7d8723ea6d5c84a8349ee4936df5b71a3f162c2dbf6f5704a7465702acc00c91c247337d2ffd54f51194530be506660f21916c24305d1d4bded04e39a249a584178fcd2235f5e4997989febb486009e52f9da43b705732895b42c3c4428612aaf8bb966d8274d0b75afe0d0139d55e987211651c4d82cae3ee493c4cdbc7322489bd5d4ff12cf38e31241a817618a18cb5dceced2a5bbf2d32889912a6652cc8d4a4b6e05d9d7bfff47008eda7a0f9e292c360a2cf5d2dd5af567b703718bd4c4c040db4847e30124a29a",
+          "padding" : "30453011260d0601600608864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 172,
+          "comment" : "modify first byte of oid",
+          "msg" : "313233343030",
+          "sig" : "3636498fdb54663dde2c0d06599bcc1ef3a10ef4ed2519c6da19893f3ed970c7f64ac516e14506243846d84e26d53f903e74acfab638a2c62c6aca740a83927561fa27d05296b6459088aa8d21ffaeaeb4e62330c49238b217146c60a777aa25ac96b701a561dfbdde859041d2fa0a116d14e5653a117e5988b2e7bf2bb5835a92e316903113fce30d23e1f55179b2049bb65241acad621d315187c1f0656efe345c7fbae6cc7c4de1e8f060f78acf2022fe6e7373966f5f10e525f0eba8b08a5a167108d3f5323a752577ee05529a5303262edaa6adbec6b7729e282f1f7d9722caa9eb21e856275979785e178b1c19b9b3a60ba678ed34994563b7caef22f13c6f6aedefb827a1afce0c899f72bdf27bdf9bd035ac37c071bc9f131c665e2adae13a14bb9b6d22ae96efa383b783c4d2fc8f5fd8c70688fb70173688f298208429465a7eb7b2e2a9a7531aed6a26d35c856bc099cc212460c0cddddde87440e552386e85ccccddd86aaff940ebf7cea462bda33579515ce1643323ef2d0c37290f3387355240404fc7b4ea610474b026616a4b4a837d78e4c9bda61320892e7cc1124357c08ebc5aad0ef5459ad0036884139ae05f3fd7fb23faaac48995474fa2d9c12f5dda1e3d68de42bf0578e4959bddd26d1ee79479cdf543605407c4ea2c24d84156210a278a8abb93969b519ae9978f8692fa16fd4921d8ae3dabc0",
+          "padding" : "3041300d060962864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 173,
+          "comment" : "modify last byte of oid",
+          "msg" : "313233343030",
+          "sig" : "1d8f7364a550c1e7d07ea18b511aa9314f5bdb758301473b4f2ce4360e0489a8afeb09064f2071c1939b154799160d8cd205866624baac546edd3d8edaba18aa42c0cc9e8316fb8fc69f35d965ef5b7fe18f32d8f12b8180756c9322723b2c97546a2ae62f25b6f3ff7fa2c060f40e6ddb04d18b32fd6c51cf14ea7c2df2b0f2ffab5f0a9f6d1db361fb6d216847d5edb91bee9827eae208ddf18122c9c296020b82c7521c5ed6e30c6ff0b3f0a587f45ff6e993b855cfed925734b5ce86459d3fcbefc0458a6697e933e4d311d09b9bf896c1e2e7be6f739bfb2d5923ac0e69465becbd2e8b90ef3e73c06da041eead456fb5075daf8dfe3e48ab5e23b669fe4958f2b08e518df7eebf9cd8e0653400159c095667e204e1e122e889d87dd1898b27bcb1a40956f9a451cff052dd1c252e384d61e1c7f7015c79714d70a766fb14d2936b01f1d84af1a10f40a53897e6a938caf4c736289a4362fc4cc454f71650a78c1335b4199ff318de908bc098f685d0560abd8168aa0da4022a50b5b5249ceb4a9e52097bc60c254798deca930a5ea160950535a4583fcefe6a61b7d847302408eaf52dfc93478fa99e031d0623a9f5d353cdd735a0a4ca347e81f8d75c1939f5acccdb34f5a0624354b701f74a793d550e33b58b972ae1e7761f03b7a1db88c3dcc451441b89845fd6af4d9328092597f0541253c3bb695a0261dacd08",
+          "padding" : "3041300d060960864801650304028205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 174,
+          "comment" : "truncate oid",
+          "msg" : "313233343030",
+          "sig" : "b0bcd77729a5eb38cb5327a725f93c4d5aac39e8fb1ef6325b8625a37c01a00fbce9cb5f150005a147ab5ccff9c0f347257746d05085e14bea6c016fd56e798517ee93cf9911af32d87b92df6122cb4f21b75d898e5c57255344f8759380c44a06af52d91794044f1cbe022c59fcea76f9d4f692895a8aaed98e7834aa00f0496594b056b1b800271b653d1fc07bd81885f8ad2b4aa60300d30fb29b416020fdc890af547090d307c2034283fedef2edc4ff450457ceb7a3d14442c4c1640a5cb1b67a7db7d6e227258409b36ae1fd52d126f59b0599da776cc1cc960387beb5b0f57cece021f8402ac56d87eba3c2867e4046a8acd9769b9d8164c0d0f5b628d9ffd3c495381f34bd81b73c38bc94441bb62e5716091fe09d40a3ca9a71897f610a501ab173714ba801b22069d20e4edcbb980024a5862e19a600f9bb0657fa3b10be05710817e5bb8388517d8d7597ef5053af84a856c1f3ff403d8e2f028f7dbe110f1ef406b2a78e8afa220a8ff444481eccd1e79fa4c9c38e45d9942fca714fba026d9da0fa3c047abfef6e090e39b973e97990cb8527460edb5c49ce61d3669f27d90cc411b16c8eaddcadecd586d55d237661823bc4eba7078631ddc49960cceb6f6ade3cbdea8e43661d28fff86eed6999f6fed8b76a614f9f5e0a1df9d3bb4ce5b6838d7fbecc3778025cf50698abb0c4249e9aef98720f8ba3c54a",
+          "padding" : "3040300c0608608648016503040205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 175,
+          "comment" : "truncate oid",
+          "msg" : "313233343030",
+          "sig" : "052f44e3f7c5fb805564627c973b591454211db2446e10486a68c3c49847e6bdef7a0530f2db906a93f8e37c8f77bc1be341a96570a4807cc74e72e222bd8cdcbd406ff198df61ea9787d9fad51901a6931bcf67195509055e01b7095527f45e9cffdd4aa2f75fbcb039d011f5c2dcd87233cd74d496c53f95a8d90d1ce1063d9a9384d4bcd0013682974de3deaae49c44a08daf8a8ba770dba97b6fb1ca270535fd777c7b732a5852f48c1f52bf343a3215017af69bd6eb55ca379d556816859ea79f35a2d8e272fa0d8672da61aa10c100f2273772cc459349c015234ce17fd41d6a8cdb516f5e26aeaef9d98e4b41fdf748aef9e40ee2063761e32b919d1051285b3df90063fec355601f0e65e8e4b23579252adbbc3592c1d5479a9f5b8eeaaca95aad9c887540a950c9f83a03a44336672026d911fe40b137fdbfcb28e312a3f1aff09e2140055e89c8d3db97cd69e4f3512c211fab4b2997882d5e4a16b699c64ff73418126a10f63c83b922f1bd145739275aaa7e5d6446e8cf295e7e65244fea145a8d87d3f305a0d6b9dcc912cba677028a21cd1892737c4bcdaf925f2f56a6fdc9e0721fa8eaa1bfc4ef8f678dccd65bcd5726ddccb395eab8a82221d59190514ff08d6ca2043a73484b93fe5b5f6b5519d0973d4ca62e715d61f64d823825bb08161157477686f44ebd157f231d187e8907ddbaf77db58c90a390",
+          "padding" : "3040300c0608864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 176,
+          "comment" : "wrong oid",
+          "msg" : "313233343030",
+          "sig" : "d32121ca2fdd3e99fefd04a957891bfd88800711b9c0276ee0699300ce0af1c865be0aaa40cde4b9f09af2675bf1990d41bd79120de0277e0765f7b4a5449d83c598c830d8eed080940100d40cea3c45cd8349ca333f9052ae2ce111c086aa8e589cfe310b450ab04be9286f3917e178184b0bd51c437382d1c7845b50cdd703e9d13d2b598b51c05f91508b99e5477c11dc92e3a440731ff47cf7fad0ef20cfd99299f534b3fcef83beb3c89ffc7898d7501ff84cb3c73cca8103bda79f1617d28523454181b695ff0ec3a87fe0dd438b7f908ff38ef661a832085f500525c3463ef4a6ba9c9c0444b3a4d1c7951a169f85ef0edc57af72e3873a45684dcbd0ed204c04be0c096ed49fbac148501f0d79b53979a84778fda9947e79007083d3e3d253f8aa2a874452252c95eceeb2a99d132b83253b53824265b43bd98c2eeea5b48872082473b7f37526f53f5731c88a78e83b4cc826b825caabfea565d07937d7b6e3b419e9101873f141f0d566815e567bcb76b6aac39299a6dc0ebb635f1b52640065fa3c4c9e7b621f289b05e7f1b2b25254e076fe03ef22ca4b541559587e730d7832271c3dabb983a84284444f57a0fa4d5ee33695e6bd09bb059648c2a5285f9e636f8504e006f456441126359b0fa30be4626f73608ad9836a037122a1110f5f532a5a4cf1717b1a5efb56b4c1c6bbec25d32ef80ed2f86e1af762",
+          "padding" : "3042300e060a3262306530333032316105000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 177,
+          "comment" : "wrong oid",
+          "msg" : "313233343030",
+          "sig" : "519fb6e6103b5b90b289654b740c10fa750090ec4f9e55943a220e02e0870436df3af22f3a38c63db2c960720053150d6966c3b1788d7a8dc8dbe75a7193d9302d4a344c1cbf4b5983b6d7ea4cbcf9b0ada18bc8bae51feaf906d710752f7af97e2b28894d7878eca1c32a48b95c276aad0375b15f99c58350e4d33379c27f0a36ac4992bbb2dbc86b2b74838e6eadbdb138df7ba158e5852698f4f1a62226a2ffc6e86af69252ed60d04e2e957887b0208b7a9d7d893c2ef7fdccfb015a961afb34c22b24ac3e04410d2fcb8279ab718b3746510dac74f819faa658c05965eb28ed6b570b39a2e486e8f8b2a3e4e29a89834ce5ed394e7e40481dc662c833f0d0d353b690ed7995703253e2d0b3092efbf884db88f3a0fa49bb53e89e590dc65d38ac8312a17b7cf1a1b7f8571d41a859d6e084b02038da80bbf20ac24705b50a1c02e79e60a2d1f74cbb9398cdd97f5ac07931e64a823153e442448ac0a9bdd32cb4926a2527a66e152d835c037995f04b8690431e96e20e2b23ad99d9981337f3a725e26b91272ed3ad2844355466b5aafb8b3b241b0f8261633618312454c7ba8d05834504100223c9fb8307602b71668dc9c0c7ef14c6fead9b8707049885205308c743f8e5940fa92add77cf985b8f3ce1b5f49696b3ea5a368d07fa21b2e407e2cb7d6fef8db99357c433f6983292c1852ae16d6de22a32949e684aa6",
+          "padding" : "304a3016061236303836343830313635303330343032303105000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 178,
+          "comment" : "longer oid",
+          "msg" : "313233343030",
+          "sig" : "a03a23e3cc68b06683890d3415a069b0e97f2d2d4d46bf03a972a33c98c5a443ac6a7f0be50d39772e6cd398ff3389dfa22b144f746f37d27c425bc61fcc9431efc5d246b0f74d7c37d46465e236bf606687c6d597bb62c270b39acb97f0830f7ea957659fa72cf0d368d4e440831af13653e6b447274d32e2ae229c83cb2c519cea9f5370b07a41aab933aa4cd735be9fd889c8067caa3740e4198218e02ebff57d1e1be80504732a21ccff98942f216ec6ecdcf1bbc0f3c210a55c57c7e2bc15fb3cf7f68ffc8be18d3f5e5ab1d8f8445f55720bb6f0487bd170c6403c0d82d480a577a4f77b88d078524cdd34e61ebab6c73f746f80eb5fa0c8c138d08d973e243a1ffbdd03ddb30bd22ceed6a12d76782f9281deaee888dd2ffe4327f291df918968a35bd1d852dda9ead959133dc77a1a6a7be38767b5a9a07d74f15812be40c9e1a9f8e2c049b13dfcce9e5ebb04c45594da06be9a84e2115e5835630c3c39fd18f244b276d856ea16bf7b063475dc5830fd7d9b21997fc10c557492db46590e38bf310e192c74ade2d4ec49b8b676fbfb984b80433a9fca72aa232d749383ad7274c4cc6f380fd9d264545978dab1098848895e16a2a8c0f525247d3b7d2e81ab881a930920e0857c2a105c2df8ae0597b7a8b8026d8fb8be042acf239161247d4dd335dae1599069e6145e08dcc157242602d069eb925109e76de1dd",
+          "padding" : "304c30180614363038363438303136353033303430323032303105000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 179,
+          "comment" : "oid with modified node",
+          "msg" : "313233343030",
+          "sig" : "3d80c40e3188a4a71b394258f72bde22587ac62bb7cf9a2b798e9e1fe4a8c5764937989eb46e733634dbbfbfb4020559fc2c39f25d52059ac5782ab3dc3b00e81885a85466403dfaf530338eb8078fba9e0479921cacf086a8f120539a4d661bdae7680b10a0f5fc5f83df3b2eab57be08e64e1476c914af4011b78676453f93f5fab6a299e747727b8c993afe6a6bc2d18ffc3a25dd5bfa15058b953cceea8eb214644e23dfd5a5a9a48c70f5004e3f0892609cf739f543456e1735de3cb5086b785db612a4d01b09617191bf19c07d5c8dd971de2a8ba493d5a09fcbf9c51afbbc70585af8ca9842266ff9b05afd07febb77e01e82e5d53dd6d5cd9aaff7b9ea1c9c5ef99b41818fbf57c4f22ce0fc11eb0ec85928dace93f7c43303928936fcfd80b516a2a982c60be91b82cebc0d31e9cf279ad90a0258b1281deb5e57de77ae9f45793b4dc59e59563d6c06210660065c1099a11e1b79406968ecc855a6007adf234cbb32931289aa86ca872d79ecdbcfb159550184b7c67daa9a4e4a5693b380a4448034b7ff2ce4ff5ab999eb0b0c5406bc0b94b536a7f99519a6fa3e1599a4fcb90cef2aa5a9bd76d86a8dfa73089b83fe79f74b712380c72ff556c5db54dea366256aea575ea9edb1083b42bff9c98f22fa8584addf4acea40fd0634bce9c6f776f3871c6c4616cead4dc955acc07a3d57b9f49c687fca32f69282e",
+          "padding" : "304a3016061236303836343830313635303330343032313205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 180,
+          "comment" : "oid with modified node",
+          "msg" : "313233343030",
+          "sig" : "a131d5d3da43f590e9ca65cae8fe69867cbf56570ffee1e746cadada6e3fa3bca0e2d17e5a0fb4380283a66598934ea3faff4bdaa548b1a8f751c32ed966292d397ef1d5105f74b95e69910cee001a8375eb37be64384f6a0ee5d442dc239a52bc2e4c0b19f85c284f1bc3ed4306e77ff2f2da77e2b184fa0e578e79b7c8ef8dc39f58e2010369102eaaee3e981baddc780c052af7debe579fd37014f9455314b106812c3fe9ab0824fe79e52b922ca91c2bd729ae4dca8d02d410b099e33f99b305abfe7c9d1091bb80f4fed5c875263bf9cdbbaab28afed8252720a47e2c44728187808d454bf0cf5c90dcacd88513c9848f19849b23d1641780b0877df7f1688479f2114b6247de03bd2a377b7b996fc564ce2f2acc6f1807bd7d75350f0120a3846ef442de75d96e1e20f23e27c10bf2a54c6a7ac2ad780b3d6a2fc4511b17b38d835c8210b9907e63501462f531732bd54acfc086d1e4f655db5f144d095bdbe6f11b80fba729ebcc18369acff9897e0e715eece5ddd169d614a5b35fdc9b423e45d369cb8eb49a9c0c8c00a4947a3f33cbe58559ede6df527c654c13f393aa50e02a8674b0a7d9271ca9e2f74aab280b0dbb70e1ce951fc958639d71cf7ce68fd94d660d328b5a57a48ee1d902abc8aedd17101f05a803704cd5c2600fad8ad56fb86019070b841997c697f23350483ead5b26159cfb9c8cd5a314103f",
+          "padding" : "3052301e061a363038363438303136353033303430323838383038303830303205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 181,
+          "comment" : "large integer in oid",
+          "msg" : "313233343030",
+          "sig" : "67b0229e244fc9d25d1147b8f129ec943ce4ab5619a6b64876ce1d932849da7b47cd2daf46a7c31f161317138a63d3c6e0d207fb2a343e5032eec2100ce1af2b6d00b52629b4c4089433803ce3f28302c8814abf4cfe266d50d6738df516c99138ebd20554f47737e0edeb2547997c4571a6fc6f5707f3b0b1f25ea2b1660168f5ad8a67f652247e2bff5b057af3fbe166e645976f3b5da48f164a4835956597dc9ec555559ea4e490084a20716189e48607da522e93e883eaad74621ba665ca3d009bb08344efadc44971ade287d939a24b2acbaa713c6aeda48eb1c1873e838e23292e3b0043bbe8cbd0fed03c106ec62112fb593d26e417d75e0a317f3a4b856f7d22d9592d59cac17cb65a37a7d3e1c49905a549d77b28f637a396558b5557189e88b44a7ef819726457746c05e5f097e667689c6e8fbb489c10c892623f97add5c8c2d442debf0eafbbb410c775282c625fcad8ed18c27c6b7fce881343278ef23320c1bffa721b97321d4a4c3e8c16c4205e60b621f7ab861e1f3a9f311b13cfcfedf2dd5a4d2d00c6ee72ca5b3d51f99356327f57fde58cdac9c836b025621b64f193809e2310ee1776edac33a2b3a1a113c6c6039b186bd4046a8637f89785c05defc7de8742e582e5c25a8e17715efdb391a8b28ef387c15622d6df2dbea6ce93e6f899421fed32f9b956d6684d28d58ee26a3647fc697aeb649a6c",
+          "padding" : "305c3028062436303836343830313635303330343032383238303830383038303830383038303830303205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 182,
+          "comment" : "oid with invalid node",
+          "msg" : "313233343030",
+          "sig" : "2e73488697eb1f598c792fb98437482a3dcab42ea74abe53c466e9f2337d607a2814f9b0960c796def2dd06256590540476fac0439ec40f3371a7b3b9ae4845a7b2788e8cad5f3dcb3b8ee8a3cbe227c45d276c2bef4ea86cb7c91125a32c85478bc6096321c4a043db0f99269b5dd3771a52929f18a20d7ab230b78096155312b2805b2360e6aad8825a671639d592a033209a356bd2d17947333dc713bea6ac2637d08be758db16fd6ef605a052c4108cc88630aa20e8393c60dd22851db43e650a0f677b6864729c8cdf357d6be1eeed97629a1d3f255217e33e4d8e558cee86468fea7d116ee9e29cd6f050d9d3bf291c82fcd350858fd7d862e609c2f14c8a8cbb3de79e7ef5a9656d3b5ea092c8564f741dc953f9421b2cf83c8c596ab57984663e526de6c9145fc610e4926a9c6df0b4db580a9a698ccac4a65e41bc1ee732bb9dcfe0acce38bb7f6a7b7b492a6f61d788babf431f10f90cb3304455d82f69355a4db180c69302cf7fff5c1ff9a381c8f7d711ebd411225ddae062400cf2550417f83b7b9e2b968ca6e82cfb716bd816408e896b48223267110e2b214649e33122eb5e35579d62fc33720ea361afe9696376774ae2faab0ca932f2f75e0a24e76497c58958a7f5b6c579b1a14b23f2218f4a8ee7f2861b03458afea1b9eb8bd7b3dd121e97e572f05dcd720e0d25499a5ee6a14fe9868f503d81bd5b5",
+          "padding" : "304d3019061536303836343830313635303330343032303265303305000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 183,
+          "comment" : "oid with invalid node",
+          "msg" : "313233343030",
+          "sig" : "a8008cf08682a5bda70df5f1cb05178be6f1f073095cd92e609f8babf0c45938a2cb8f025755b173af0181e87ee79f8a73e60133f4183ee172dc60d6ea0f6d30ab60bc816bd239b0bc70cd2f95e2d6d280bc7401d27cc536dac23cebedb38202a7f4a1709728b3d32dcb67b2e4081153c652ec0f53c13c856ddfc0c57088c4a6acaa4fef18aaea1abb902f8bca7147c54bb13d430f792c48e4d3050a705922d73b2a19f3074857841338521fb996810602683ab0c8299bbab9c598754a34947a2983dd63c76cf74b06f81c02a78d448d228eca205a88cac0877723835afb46869cf38a28b46962269f8fab5695423ac3b37f88d5dd95127c280a1a4018e47755b9bf5c54ba7c470c1ef5ce78dc49d9a175a07352edb26fa36b65c53163c261cdff35e9e2955c5e3a793a00a14cf7c90cb4c43a2009d8e3c896101e5226e65f096804f26f644ae1311f4247a972a60dc6b22062edb565540ce4f3f4cccfeb57ea2a2cc9205a592e7f522a8867fce5681f292c5f2035859fb40790572b319e748fae1b7cd8fcf87421e0ddf8a20b3ae9c02244c6523eeb350f70a19542587eaa9e9798f104136c8ab673c7f3bcf199532d14f17ab532f957cd6afc5b5e57f15064d8b39ef444ff513d7de02ccae382b14aeb2cac0028e5fdb8c1fc33615ae4d93534f3044c97126816a1732d814ced6bd043045b918a4f5b97c8e652b16130f205",
+          "padding" : "3042300e060a6080864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 184,
+          "comment" : "appending 0's to null",
+          "msg" : "313233343030",
+          "sig" : "4985a583b2e7cc653a5343d6bffa4f349e115441d35f594332b753ae0069b66ed24e65a93bbeab94b25d992ca871b64f18974fc65ea52dcef1dd95e46b2b758a847a7c66082cabbc1d08df1e3b4d69dd5e351af6e1dc1edf2db8851ee9ebf24135ad62ca44547bcb954ae58602f7d8eb35a55e8835926726fc31360fe822fb12dc3e08a03ca6e3c19299682feb785ddadce89486ee1175763b52ea96267e5e90cca8b49724c77c27102a2502f1b898353220a0894bee75278539eec5d19431f81ed9b2fa3ddf17955d41ba0b86cf5dc1e78828a8561187d87140ae1a8dfc22646b23df51ba756f0af64a806be81a652cfece86a47e5077f560b89e11758eaf8b01559be0376ea02f40cbeddc9735681b83450f10696f2306d06f98bf2879b3d35b05b75cdf316d62ed6cdcd7a64455c0642f44b1c603d35c1042aad35262db291383400797ab4a0875addda08cbff48811c925df7482e468a3076bc8cc89e8b4b76f7c9202acd554fbeaee95be3ee8d59207ffe2a5461fc3019607ec8da4c267be29ae4646aed386aea72b47e2abf1be5ea4c2ca0107aecf9813da0ba6b3db42c3d48816e35c3432a0db42f433b121b80b461e4b93bfbe26479eac726d5e70643aa2a0cb2c2e4dea03a57ab8e8158c6aa96fa0a70d050969e4ec40ba064bd9abe59d5f35cb7cca552a745d9306f05eb1a16945d5f20477f203f2a4cc69a06a52",
+          "padding" : "3043300f0609608648016503040202050200000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 185,
+          "comment" : "appending null value to null",
+          "msg" : "313233343030",
+          "sig" : "8f4b449309fbf4b460d841593ba66bf21a11565e948d155c9989410e0a112bd38c950e245cbf3010b34218d48c47318116a5f6161c5ac19c9b7d65c6c51ffffe852ee655d33e9dc5b1b92b83efccc1e68376c8e29665a8acbf56837c3fd12ade872b248021e701a64ad8f99ee2d26367b3463bda23654fd736c64dcf737f12b372e146ef652c1d468cdbb669aeb50ddb966da6907d2cf7456d29c3e2b1334147327cf6fcd254c536dd4607f3a2a8b197d5c5f44570d88ebe5fe821f656a6b254fd0fa034f7a56cd1e51724b6bfbbf5fe301223512c6b30a08eb4f8d37f1000ceca973ff43d409a1b7c37586524aaba49d86cf5187dfecc24d8e8fdc2386dc18d519d3125f753b672fa2baf48c8f8fc883f01de016b9d264b31862870340721c8fe35e254689b1ef3beaeb8b9d0dcd6a28bea69ede8f2997206ac30e9999ebeeb15936e24b0964a2198f97f9efbdf45377b064c62aaa68f67d68b181859e2f9022cb2253eebab8c39090fc8828ed6b2a44a9465d4e3068f15bd41c7fa7160e0cf5565180ad3053499628e4d91c27bbf7416429d7e2763ef30719fe639f72e851c305f0ea4c6de7ecb7a010357c17e0a3a4ce3ae784a78b3eabdb524133ecb59b94c3afc1fff696d7d89b03928d0ff480ed32f8610dc36d941665a2880c4af94fd8aed67e70542ce3caeef19bb34517e62aa566c81f1b0f232c9adcfa07c8291ca",
+          "padding" : "3043300f0609608648016503040202050205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 186,
+          "comment" : "truncated length of null",
+          "msg" : "313233343030",
+          "sig" : "1a23f908899cfd37778dc29a4944afea6494b2c3356480113316ed761fbec243ed42fd6f0e7a1bd51c6c432013cb8feb8c4e5203065a8bc5866d2159869d9e4b47f0b8749e606e371f9204dc6b8d1315b9e356cf4d361da1a9054a30620e48f668387b1d825f53752fde9f15fc187f64409df1da8fa8409f09951f445abaaa15c5f370975cd38a0051168779ac77a798a9956fc678acd6c43df3381558ca7b3bb30d3d2a77bf391cc55f057e25e2203c719bfeab7dd434a7bebc8427f70b239497bf1267e053901e161e8be2d461ab0006f151392c598ab08c189ab5797a349b3c06f87b82c894f7b1d6301338e10a960353a6306cd0f3997de6d4a9f31de9cf2da9517935ce7eb91900d517e45a664cefe494ab8c247e0ec7c76f201b6a3b619c286bd84759b5f1055d4a353d7e4feb71185b8e2b00ba3a06f180109941017fa849c10bd9cd187cba1154e64c4a9856f563c6af807d6fb914fbb2a843193c234c3f933e442fd6de4e2f2fba5b228dc0dc53ffc413f5b8eced36d9f19b890ad0aaf77b8e08fef44bcc53d2e7b277578632cb30180e642297d24e9975476236f46cd0fafcd93dccb47097fe91aed1a05dfe855b62768ab2bd65574e6974777d54a1e6620f31e3fe757a4f24e43817ae45538aed83c22ebe904b453bc89796998b3c43661d5b638670a9d46beed06e2208ebe9892da5bdac7127029e1a621731ef",
+          "padding" : "3041300d060960864801650304020205810430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 187,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "3cfa2d610f8884246aad5616c1ce4c5212b2cde20d26b7fb8809e988d6fff65ac322dd443df32ff4008d0f6a9f30a990da3b4c9b3830a9b6f9616e1be9194dcb6f05e634bcf8b8f1241991ec8e922f5b3db8c5f81cd1b4b92f5248b9ae87f00117375c9bb02ff436ee6d078c9f86f1d5635b1100c5c41daa43c9781b414fa2a065b906630259976891e1ba4b97848f10c3425bbddc1e94d7f3e88f8c5e35851cdb1f070fca63a0e49114afede07cb02f2688c2337e632849cef8b5266f1e1e752f4f038bb15c7c08de3bbffe8671280c50e389e2ada8dc33ef777f3b4bc62594061cae12c21a0997e1be807dc9a78de7a8b39d35458a385beaa10cce743cc5cbe105ea2b2f36fda69f7314edfcf14c906ba89fc7bd118a3fa2c874cf72fd50bdbb5519e9fa054b24a86117b1b6cff2674d62d744dcefaadde620970f626a69d9d1db151134f3dae14a02878001e0e4a7eff328255e9e06cd1cf1817fac0cf9e7644177a3b46f417d9845060a8c62e2002dbc6702af1f3eb78822edd87fdc9ed01eeb8d6fa3bbd434ce5b089dc3922c0f0a7d56ffcf874421ffcc843c2675f882de1ce707b9797e73e4144a1ec5324b6b367c2b1c2ab7a3ebec71ce88825192e1959fc1d4e45c7c8c6cc117420c8ac15143c7a4e129b99c61c07db1f01951c3936f5307566df63ae81208ab3bcd7a6a67990d36bfd18b4af41c64d8ee36500d22",
+          "padding" : "3041300d060960864801650304020203000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 188,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "a85de4a779b4d0a339959eba0f9517f408ed878472054e215d066760722aa54f18977e8a58c7b5fd36a5f06220d75b2e6bd6e46a471e6b58df82205b25458c13a7a36f7789bd52e960244403f1a495dfb4feb44e0b0d745b9908de3a7832f5941335a59bf9f4ce32d5b8fab88db64a6fbb043f084bfae5b3d388d38c3e22c893491db8d7995a9206fc89ae29806093e1c0056a80534d20f41ac99473eb3c50695ab5c98deeae78458a00366e620efb890bde973201d0bd2dc5e8c23a5a4d49f94d09e89667f029c68c7a64f46831a718da5f160edf9c85e7e990c6557a3dc6fd3f1f4ee05b6d135abb1c1b338e101061d9197ed6f291900cde627e3bf34757e65d670f3834c2e991c27cee515d36f306369f32b1136553245242d8ce4dda06d6cc1f6f59bf784cf6aae50d2345bab804a934bac9d3bda14ce8f0e658464e42f0fade2d6b464fce88496f7a876aa519f334f2084d83323a4310ca2db6ba79ed24efe8e1349963d3fc7dfbb56adf0752427dc057e88fb250780962df439a6fba2ce35ebb4a6668278555500d32759697ba383b2b6ac70b9307d9497065a4f940196b384a371fc90195de37080c7129f584e57c893b1d45ea1a9b87b1c22dc8e3ba79e2a91765cea094932fb6544c0365960ec87ae9d1ce42c7612c3e66be8595e5c48ec96c2cbd3db29f0ba770836a1ee01069fade93625b4222dd22f4690d21e1",
+          "padding" : "3041300d060960864801650304020204000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 189,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "90cf98fdad0342a96065e493823ccade9b64ba7d55854ea54d5427b5982193727e12382e5626e1c2129551d389b613c4ccf7d29ef7c1b7af895b1081760eab34d354180c22e64a6c4e9e5daa00a13a7d8046478503d3121a02c9ffe35c3bd2b881815f388497d66ea3985bac4eb92f783b53b4e8f9b51e54c7a115aa3412688e3b8a5261d20035945b91cee01839cdb8abe51d96a850bf506466bdca087dbafda1d7eff29170c4c977b18bf218d29212e2dfc170918cee6cdfb6fce32991b71a1103e7df86ee31900509e519e59ecbcc74c99800a241db9fe9f7900cc48f54a3b29366696b65f15a057b2b5299ce92b975c0c0438a2b785d933b131f6ed2ae8506cbfafc0057afb142857d90264c07dedd9707a866ba150a1c54fa76fa3ca46627ba438cf261991e1efa73204f8f6ca7ae1ef041dd52888667bce336641b955161c7c718756c4a4cee7fab6cb9d5b98a96e5417902b30f518328e6f8c405615e5ef53b1ee685081c3d4758da7872395fa7b7010727b873d38f2d9164f254ee8382261f8ca4e7221261082ce9d913362933a2e5f1b3ff1736147782b0a18e17e913353f10d9a8cbf643a73743a37b085b608f2d9579be7a985c1dee58172c5b50bc4315fb2cc32bd62f9876ae4826ad75548573d4b7ce1c0aaf816b91a9b71e4e7e134e4042b219b6ea185814b5a265383f70b9311ee33965f16020d259d34aba",
+          "padding" : "3041300d060960864801650304020206000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 190,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "26bc51a5ca916c06954c53f78cf9cb9828bebffcf0a8a665e3f57b21b1d5448d44d2013cd44df286080125c4996395384de92a32e301369f22c36d554b7fafef65aabde06577edcef85f432691064a07fd71244bd642973d5267e07b6d224b1af31f0f7922c35192f3011e32fd64cf57f9eee9af506136b50d0a8957e9a701b1a0ae2e3115c6a95ff437fe17db195f85db8cea850a6eeae99cfaf496ac1ce023b909127ec2f3d79817348790fb88d36d5777384e0c2ff36f5616a6f805b74078e501a1e8d61b29fb92e95f14624ff9fb56de3a24d28fbe10a111589ff33b28455980410b36c636bf159f94ef30b9f18ca3e6ed69a0d593e06a79bb1a0b066d718064956ea884c7fe13f7bc80f9960efee39ccdd45d36686be74c43ca4106e94dc1be24d799610efbd2fb5002e2549183362ca0eff49bd9971855c29fc4ac31a759a57b2de8db0b1e226d924b4aa0e04f035a3cf7c0ccdd118e577a0eebae4d984f0230287c666d989d4ace41e02da8c704c3b5a2aa95dfa1d18f47dc1532a9fcce3cec6a49ca16e47288857d7553d3526916a976f0eaa238a9e3a2d37714ddacce0b40e260f56e1ccd9073466230b7d328fa69caaf79030a84a1aaca741cc196ee2ac9a44d9ad4788856e9fb510c34b9ccd61aab89a725870171b8a8ebbca35ea0968efb441346c2f04e4fffc19428e54ef96b3cf96593c579a33336e6cc1cd2",
+          "padding" : "3041300d060960864801650304020207000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 191,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "ac0c2beed1984df4bc57b6ac738f12723f8bdba28d7c9a6b4494cd26ca118bf50490d366a1029443bd7754cc507ea785ae55e726762b11bf5ad687342f64b1e48ee2ed52a53f1dff4d5a939c585f2ddd1ce4cb15c460f5b48ac9fb8ee6f0f8e308237319cf7445c6d4c4fe7eecd5edb127eae01496b470aaab8a06488e9bb6473366ab21448855237f1f622a3c419093236cb2b6fdb672ede809f23afb675f15e7723facbe7d542950856e4b104109d6e647d80e29876c698f80dba9fccb279c2bcfbb289252e78477b776bf30b98c2405b9fbaa5ef53d5d846edf70215a99ed6bfa578a613a9cd0cdc5827269311efdc8cb9e907ffcf0e66161fab2c4eb4e3aae73a21a159b341a38d92755a3094854588b1e5e8a427fd310f24a0d5422fd8967d36fa0c54efdf471dd230cc2d0bb837989fc197d193786fc84158649c914e69322c1d831ef10fbd8d26a6cf5a78e86b6ff5958b492201abdd3c3c00f3508eed16c2d243d15b4a41becf2692b45ad351b388550c04520361349df518001e5b0a5df31afd63e67440ce02d72880df09b6a3556200f68dee0eb665e287d197975c998f13272cd02e0a6b41b6d3d4994360abb26b35579d2dfc256b99d110e8328cec738062b1b04aff46aa43f7ff3db2cb6f702a45c23a18949f4e63427c9a6aaf4e44bb6917ec578653eac975b80d9bd8e4f04a2dd518ac74c626022b9214e22",
+          "padding" : "3041300d0609608648016503040202ff000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 192,
+          "comment" : "composed null",
+          "msg" : "313233343030",
+          "sig" : "5e315a5a02fbce14aaec84d260b755cdafc00a9c0108766839d1b0a412eb9825f684118b78d8361fa3e51ce358654f6d179ae660aaab17f75f7f787f9447e7771e559593b0621bb7d169ae936e4e8c85e1a46a2e74364a3b3c965b263259fbd836ebf944eb2d81cacb367562323588745358511512aeb969e6ad5865c6065353daf9d14da626166228f0e9b16381d2717b686d37a3ab02c02ee673042df9ad204c260f35d5ef14fa74d903e6b759d0c558c698470267bfbbbc3181c7be95f9098d21a084bc3210828bfb32618f3c3345f7d54dc97ae69d256ad1e8ee4c7338290cdfaf90d35364ed3e2e9e212345f119571e59bb0fa867a93a2573145c9e943e6ece0e0b88c011ce15c69f143d4054b06897a5681503ca8882154044b003395195f25d32918b380339d13ed673fb434e3a94e104314a79589d53079179552d43de2a18d1e849696d4702d8c905f9cf29f0f805bf28a79ee8ba6557aa96d01a5ee4c8f3d7583a2daf1c5338490fff7dc276669aabe88d851026b3bf6818b7c17299e23412f4bd084a52a1604c00389b629d2310c932cb8606c6dafa16f357565b96d8af78bbeb6b2e10fa2f57cbdde3cec2b3e78d3f853bedaf58fb33d455387ce6aaf6e9d9681d74a88b767acf5f99cb83afe65e167c61b6fedae893b19bd9ebba8c9d1f791ec162aec15eb7301c881bf3bbdcacd1ab4d9bcf032a2472cd98fc",
+          "padding" : "3047301306096086480165030402022580aa00bb0000000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 193,
+          "comment" : "lonely digest tag",
+          "msg" : "313233343030",
+          "sig" : "bade6f04bccb08b16c76f8905a7b8487705e1c1298d0b9b3883014015457e65638e4ac31d5c2c88895c3435a5add7e2f107551f035fc823f1f9492e7f62629357cf03d899c90f09ce6f055a703c0a65dcbab879058975d9cf7c9036e1558278a085c9acd7a0e37ddf5f2395d51cc6312205717b981806add1ca8da8bfa3ab963245f534711b1a5223013270427a7f4282c42008a1d68280a2a9dcc2b61742013aeb6bba22406deb2b01894e4117e90093f2456bb5909320d579b2bcd35b48e5256d91f6c2f45eb0ec97d5238b427bb1995c5d396f1c1f6fcc5b51d80ed61961b1e031d4677415e9a1f7c3b11864426d967f7ffe89d58d6de00cea2933dd2efd018d7f42c8325921c09bb4c7639379cbb22d82ccd6e8b6ce8f309d7ac3b4ce836b7a3c2e10a22235b4b6af855069bfc2be8c509a05c501cbdd5bb76781f6a21bbe54124dd45e9419a7f6ecca95559340b111d7879b55b20a9b66ccb0efb0ac280a0af5a5087548b6dd57513d475f99d2309e1d813303b0317f509b270e016cf598eda54018c04dd9b5931c66ed751a38096bb7d0d37989a9c329a3e614c1feb2a45ed99c2cd32258351b98a3283a489c06bb5a7658dc09d7d50c9eb9a9779f43472c46a48071aad0c93bc08fbc422a4b2130f31099a7a8b6aa53915c448c6e1062008a6b3db1396ed9721fea2232c29b77668f590ff91a6a9171b45fc498a80d0",
+          "padding" : "3010300d0609608648016503040202050004",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 194,
+          "comment" : "appending 0's to digest",
+          "msg" : "313233343030",
+          "sig" : "e0fe1aaa2e1f3a9fad69dfc47b59fc4b7a62fe809d601b7e1898eb1d4757af2272064446583468db4c0579c2312ae2dbcb8f53e3e775e00b6c422f17aead765cfc7bac9bd9a1ac95ce174716631f1436f418f87d4a0c22a239ddfd6fca4100a7ff5dac5a0aca2d445bdf8a0e0367612d8ca4b666bfd8ec11cc1a5974bc39cceb3023e26ed582089ff4c9e121104fe5e54a15013643eee10fdd063f7ec8a0617d69b880a50c4c53759b75bb7364e8505a630e0ec85855453f0669051d95c14636005f5884dfffedc042b68171b335ca8c1a0d9138bc48b3fbdc72b22a79f05acba1d1a95a4c7508cf2a0e7291575da7f0ed3bcdbf85ac0e5c9f717811a367045f13f6c46401184738d138e310b7b62180ed71d4df05181c6636374667d4c08a954845fe8fd7fb1cfc04eb673e5f76c9a15991986d3cbb0afee88124a705bbdc0875d5fd037eeeb16e84296da65db616fbf53ff57b0379be4902b26e8ad9f6d8e49a88987ba658673bf24bda358554842a6172b1656fed2dcb7d37ced7f25db9eb6f1e07ee6a313143c7acfcaf466034cbf7d2e6598dea6a4ddadb5ff6b3c595e9924df35942c53afb4894669de7af0a4d0ba2bb045f0969016596590a3233c13afe8af5a4f03e47a3e4b1310257ab6d42bb78527e7f36314d0bf37e6d35234ff8be9791694a4e018672678483859f4fe484718e324e1d753d90e95dbcf0273855",
+          "padding" : "3043300d060960864801650304020205000432f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 195,
+          "comment" : "prepending 0's to digest",
+          "msg" : "313233343030",
+          "sig" : "d2fc4f1a9c2d8ec2900a5f3fd171e869bd10a9e1be8b0ceae5581ad77b2e3ed42c0e1c1f64e2c813d0aa650cab443039fc9096b36ac2014d8ba3a4ca0f16f64c1b61b14b7d0247836228b3c4c9520666b6971e969096dd431d8467414d1afdcb9df197a8e1985693de6c8933049644dcbf2ad818600b16d77203648cd3be96393f8fbdc2cf885df2cbeefe27b8cb487eeaf75a2c05a18f0e8067c60dcbed330dd08c3e37708db2e2f0647de8f9370db07b4725b594aa23e4c5d991a99d5a889798e5974e783c87df5cc025b0e66d718c76b2977c7fb734b31628b102d280854046923cc31277e01a5567df6811ffedc36b5131c14d49ecb6b07bb10262dc24cc830ba47ff8037d95dd0db3e75b7c0bcace8012c12132889d5bfc68728ab7573fcfc7c0dca0a49f6e3603f911fb0c3865afe52a2e1f45ad880b8bd7d86dc549fc4c697462d0e4e017a307732351accd9f36b4e151554c6ffc300b0cc1a9ae9b517bcba3f2183fbc257fef21de1aac5d88c7cad1145bd20d09e12d757bd3c9f9666ff9f458ce7ea06272d898b8e8689105f699d2f63444ce1e10e901134b200f81424a3b01aec402632118fa103b36ba67a6a42cac9769db9f0013511a436d64ca2bb4f77db3c74ee45d1a745ca9b6080badbf6fe2c37fb8161405fbc7904a348ccd388afb23601099c59bc819231eae98c1c9a393780ea89a5381a65ec61ea3c6",
+          "padding" : "3043300d0609608648016503040202050004320000f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 196,
+          "comment" : "appending null value to digest",
+          "msg" : "313233343030",
+          "sig" : "89ddcabd561a4f806194b8946c8ee5763c45805019564cf69c69884f5139e7be9abb0a6c2bbf57f6ddb5dd4caca478bcbba0e47afa0d811a91a0948f96901fe6343c59769718c517f971c954d9b0a81026b6391839da3cf7deda8425454ca099f4f772de94306b75e92f97070a16d5cfff1446617ac6331de218c2bce80e4146ee109a4344bcf9e0f3a4b487954681d2f55a3a1f6fa6cc4a8cc535a62aa14f8cdb6649dc1323ed62871191bff0c29b2e17593a4ffcd3f453fde02cfa252926d800d4a5c76198f9d178bb5b0ea1142a89eafd52070b4a073667aa5c9bc2cd0b13ed22e3f5eebed02893828feb90db44d0fbd9cd0b7eeed1b46f465b131073b1a2f1e7fbbbcb3fb681b1d22acaeddc6783407dd349a593cba891f5caa2328e5812abe370a017436e25f28db1617bbc66cac26f5722f0b9d78ebf59aa416f41f44da46035ae02e2817ff53d4b9f53e34d81795e4d2fd1cbdf3993942938a323f2a8c05760d9c3eae60698a1a38852bcd8206d5a47c3bb62fe027ff0b699c33b031ebcf275dc31f90b780633db0aceafcf28b25e618c3b3993794f4dd2a6407295d80e9fefea100af06b00815662855a9d5b1bba952417f1787480b4e22dd3f9fbec04fd8b83e9ef6590f6d7387f3e991ab3b98cc88e9b3c625c78c806752a7cec21aa06334bacae39392d009f54e4f5d3a12b6e8a934506273c2059632bbd57dd17",
+          "padding" : "3043300d060960864801650304020205000432f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 197,
+          "comment" : "truncated length of digest",
+          "msg" : "313233343030",
+          "sig" : "afdb8b4cfb240b4ef8bc1b202c038ca85119be1c48ff7ae6039ff1a6d46e26286708ec8bfc3a9726304f944bd82b67201d7becce9a147441ba8eb9ceea369e004f702c29b59faeb1e5efc72d5ba3f989672b170cc1afdf77511a9a2178b6e14a008a2b347b5c8c47efe68c6b44d86c65b9dbd997bf42d143fcbcb90048c92860448e6ae8939add23fbe5ccae562a02df9f9681be016d2d90a96c77fb241c838b1f54526a1adcaff0a6fe50254c9b5c6b3dfd00906849ded5fb6ab06c22473f471288c745b591195568a5ca52f25f7893eb95b17a081763ce66e8490ddbb588fe23b8c9d339348df81b7699631fdb20756b8d915e7cfa3a20bb5a643c90a2dbbc97142a4ca091589a0222c459b8738efde499dfa10e729f863aa42b10a199f4395bf0d131c13891050147db51c8333fa6f2d021a263df37dd10e4b264df144657e9c8bf23175079ef4c9a24b561806d9304a0f342ae4ffa69925b629bf65948e53056ba8891def8b1b827f86a1da69945907bdb365b627bb47f3432616318164a751ee85691ef0a20fd7a3e61c1acc4c2d08bda5b9a23a7119b8b1933af56497d06af4627eb63ed4fa8cabacd70c42e9a2e638863de1138f332d1ddc8a24b4369d4605dacd4df96b1075235d10ddec93e13a20488ba9b649bea15d69a30c716f962119f31927bf4ad5741a739cbb794b68e4103bc05fe30877d5404976c5de0b9",
+          "padding" : "3011300d060960864801650304020205000481",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Replacing digest with NULL",
+          "msg" : "313233343030",
+          "sig" : "e34288ff196d90eed5925c81a8a0127abfd0f0de550948f63be0f60896ed6ed7c474b544a62a96c0f82197e67a34bd53de8cbca4cbbc28b6d65593a154521ffe4331bc7f8459a4326413e838828c0709aa794e62f7518b028d811ab400ee7c875671992ab6553dab38e94a897be099ca7633e790ddd330b50325ae29d8b9f57c498156ba0b74c310e40dd10c1cf8d3ebd1dd40dddecebad7a3f2cb9551e7d384eac9d23bdff84726ea3e14d785994f3ebe7cc1c0cd336f95ccb8b0d6d8ad787ffc2ef008a1112b0315457c631df1641929675f2aa126f66dc88c5ae1b887e417619a1fb853cdc27182d35d1c2db526830540e2e96e9f16f15a0156d6ca4a418c911c2635338e366847b2bf0c48625f3b7c56ab5b19ddc5e1e1fa638a76f562b9d7d26bb4017895b84399317f110159f5710a00b3d9993b1a4d5fd3ab1d79b3aa75597e7ec07db221c84ed88ee9996f510c88ee0bcdc79e13dba8c503e1ae2bf2ea9c0fb7afd67eb2ec7d73823cba3e3bfa84d151b7720c235b13907e2dc5c2c90be719bfceb230448e7ac52b8e0da096182871e2485b96c90c56c9ec69ae4106803af433b50c787c24ad04836d959f9a624c1ef04de3b0f0261fd05720b462c3d6c946b11d337edffb2d44d806ed25f3a9038cb94bc5706e54a81a16fdea228be8356ec86305e7cae97200e8593b47caf69c81b673fc334f7bdcb637872340f2",
+          "padding" : "3011300d060960864801650304020205000500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 199,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "4ff661f10890ed75355d79a70ed18965ceb4a7114154ff3ecde025523853d4efe1d0b80047b5017f4c929aed05d28bc71271ef2dad01142aa2d45a8b82fad9536034799519d51532ed4f1821490fefe3b4e8b305e1c852e0bb1a0231a969236e9abaec94bd62a4b9a7e2e4da50c43a6d284d5a6d596a8b7855a4ca8aef9a1f6b16386f29d161d2f5a7fca600da02fdae9d15f61b1336019e0f280065877f7ba130fd7fa4fa0e97d22ef3d36fba4595bb0f944a6c8da0c5c9be5359067c191ccd486f6475af452f808cffe772dca4726fee3e86bba959633ee16c507c06c35e8c8942a20c1fc6ca323f843414d7fc5022bb24271bed6843244dcea15f5374095d66b4b48fb2ef94684a82826461907705dffee887be660578cca4eb06a6aa53a73a3608bc4206e585b6003d1c67b9964c82611067930612f60a8432486cf11a0b210bf45561f0a97addbd2d6a83d7173c109bdec2ff97e94bf1333b5b09950cf53144ff8b7ae2dc0afe647234f47471655b4c8b0e95ae4ddaa5487c2edfcecc5bb604e2dce7ced405ace964f49d3e3bddd7a18d9d6196df422b6c31c475aa4a055855cadc2d76a644f747823b79f7a10814473ac020f5f776181aa8c202ff00333dbde525a8c312fa2f1b8b739ffc6093dd3f40d604f10c6aac5caab4bbacbcbbd171e44664a4506f6f877f0f043dc25a21ccf6a366974423942187a90b6e915c",
+          "padding" : "3041300d060960864801650304020205000230f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 200,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "1d2ea8aef61828d7421eb7a118de2a98a2cd0d629657d1a3ce68dd6d101347ada185feafb8b90ba2184d90c232636a25a450cda95a9fb0ac7d4aebecbed14f672a3acf8d9fc3f942ad993446bb6955c5dc821eba7a333970a00d8d50bf8b95ce31da018bd9ae5739acff8e06498247e6b3f2a86658f4b5aba6d2a4594b17429b160f6a57510b89eb0e9960aae2b41f516ad10d9caf4c0f2ba014d365620933aef5de42ac831ba096b7ae17ddf6c9ab72507302a8c32d132752c19b173df21efaba1c875548fd2e3f7400e410c7921db0929a1614de61725b26e84d2919d53ffee6579e99d4630b2fe6414f329f1998a771a85ee265a1686d5f89943a48bf817fbf0750255d4648f835e12ca37a990aaa8d676a8f085269a2943fc244477cbcda6c57226fab8de4ab60f6ee6f87aad20f675521624bce16d3f172190d86fbbb0d71ef72ea0f05b45baef86e5a482d613248e07fd2eb6eaf61d0def5e0fc3ac457d2e232a1eabf31908d22f1539002c115a7d9a5eac4aa63e3b1fd7bd2dae0abd001f7caa0c5b20bb45f269a7eb117621f82b508960f2a0cbbff2b52935b93f213a8cfdb1822989fa9605c8b828296e3d3a5ca31b27ad87f10d92c13e783e7e0c1edafa0904f3cbacd4e0841498653dbca0983a3b7d173a51f4de2cc23cda295a96efd310fd119cbcd163bf7bb66e9aea8116ade1a9348cfc703e51fd98eb1b0e1",
+          "padding" : "3041300d060960864801650304020205000330f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 201,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "d3290f4a3b1c0505d4c9b5152ef833339e71aaa0cd14bd0b2d03a521036f28e650619432759d127c2f20fda5abb7e88fbcb907892df94d67e6dd2d4a92a6a047e7e953596741cfd29b53f663527acec8d0504cc88c8e1f156e1ee45b51f98a4c8bbbc466af0722622140ee525aa03e11c3d62f4110eed8678b503a0cae1c65b89a4e97a1770aec47a0a6bac5ef72dc3377796c043c04ec25f697fdcce652e63fabaae912750342cd57231316539e28e99eae207fb457271f01ddf51790761c647cb8f7491105444f26b5cd2c1a03effc43689cd9b71a92965f250adcc1222ab43b0d3b1c1c3934247b50f96e847aaa0f0acb93124bc9bdc7beb4b9a3254df7a53eab2440228fc7c2c2dbdf3c629b7c8645d31ad4a0d229a5fc872230d35c058ad05b6d285eadb405f29913cc139b9e308de6360e07ac50811fc91edde0a74a6b7f2ce95854401faf3eb8befc1e1cc55022ef6d347997787c30c302d82137a634a74d9318c34788233731bf071a2ea9babc4e44006401222ea35fb82a7bb4d53daa757b7429a992b88d817488a785506feafd638af45b66b52198f53f9d6ca41650bcce8bcb8139f246342b964552ab4672dffba1c9d1272ae2c2619a4b58eece51e1a00fdae1df59fc32528a7e77f6095792e84c62b00be673c1772023a8890fa8d6032d4c145e5a48854b78784583a191e851e4698454e2b047ee1723c2e721",
+          "padding" : "3041300d060960864801650304020205000530f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 202,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "a4fb0c8c9ac70f9ef42b996437e16e4b5c7d17b821a5b38b5b0c648cf67967193b09e2fcb3ecfd6a9cc8b758bbbdc105b69a1384ebeef13bcdecafa1a6bf90a45100ad0689e71664f4244f814c8996bba8e11ba864938c256dbfba387b946d6ee631accb6b3758cf7db7255916b0e58862aa9d8a193479dcd2f72402d2f77e5f9084c013eac518820295177d46e99b5407da65eef2785fab0391f294678dde09781a5047666c6a49312498d888fcba2c7e614222dbb0065703535993946cd86f13f98b36411a6cd02c9071a0d5a3d45a96b73f728e8158ee16525bd3efb0f3f99a622f77e07dd54a9cbf158d20084e8a426c5f55f2d34714ba0057dbe37992292236dde94bd9dfaa686ae06a4519a5760f8e7eaae57eef705b4f508321f759362340216b0f8d652212c7688f39b3559807054af2b318125214b30c22f5f0f1526bfeb14feb388c441611130ce8923115f199d111de1710a81c578ab551b59c1cacc7b642fae437ded45d04dfbd2a18a8d79ee2fd7a4056e74aa2d15fe9c2d1abaa6c16ad412b96b8026c662b3f23abd8b7f15469684cae9b6fa2c720f3a79ffec8df5790a57454b70580f70eeeb2f34267c33ba0d5d9ea23bb807ceac9dcc3e028409c938a558daf691b63b426026308d3d9083c8093e6e78c35a3e281eb0745520deb51b68d4b1952d69b426f4a0204571fe96439083b0c5d0059d7447a1821",
+          "padding" : "3041300d060960864801650304020205000630f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 203,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "58422b206a09e3565c35b4f267dfd0ce1adfdc43ec9a055794338ef4416126e8e19f2cc560e2181a0bb06123b67eb5f4064fab203e21b53b3c9c947951a8c847ef8b93e737e8af6ce491cc6bb9c551eb396190cebccce7d5e4a635317ee177a703c558d5747a67c44d11a6bb4975f7ea5638f6250bef9a54afc6cce0845644e12f0eef92cd5d6257eaf866154c23b29e40963d9377450942e730f613c8514d2907a5ba5923c2c0aa953f78fbf735b7f92d5803384deb562d108b12e37509538d95f98a8fc19b4d3ebeea086b6798c6bd10eae7b3c2dd49da6f20a9f4f5d2a10d12cf42b7b00b5e1abe973df0d87efba3fd9ab3e1e8679dd8bf9ff242fce530806190b48d2bb0fc45190894402213420b170fac5485eeebfafa1067211853f7b90b627e52e40b50b7a1ffcba5cf658bd77812170cc0ab620d3989f5da77474d5026fe48776bb3868baab780fb67ea8ee8c91d414a82904b37b59cde4b9f07e7099ad493cc32933e5c809a00fe5f7455b1e086681e7b15c3dd3fb8ad56fe2b3d78751231cc5b8a006b3ca2c6b3485a7974a85d80ef23824d25588ab7298a3425806620ed51ebdfb58e36c7b8bce12ce956734c6c4776b4c62ffad9083c59648b56efd64d9646763fd49d67302fcc6ea850c7f0a8c95c2e507a73f4818c8683261bb6c5f53b82aec1d969b396d93517113482902903adc8751fac1b6f788ab21f68",
+          "padding" : "3041300d06096086480165030402020500ff30f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 204,
+          "comment" : "dropping value of digest",
+          "msg" : "313233343030",
+          "sig" : "42efdb22fe5240c1d2865936d0f9c6d1bf192c9f8cf4c4784876af753b45bb619b2417ca65d9cb24d1d1302c7ed5262c8b78baa6e167e96a4d612fec50bb7fb3a25dd1007ca0da4c83451515462594f38a1092a480a0e5a267ad312a556bff53f2fe02f9b011a97c48c8748d57340bc77ba12a1d6ac1f63a1751b945c7c1ca5521d6e66ac524ac6d5d8a8e02a7688384d39598034c76a1571a65f6f2246aa24773a032353ccfc764515fe1f2466ff95b2d49889b511f6518fcdd83843777968b2fc8317ae488daf8c66153da7339774180444f9498646f9533e7b7dedb87037891941001e92490cef687949087f1de9f96e0f5fc53aba7b4054aeb58c0b53e3357e1a201dc588470cb93b8ec631ea3590c1edd06de087725e9d11d474a730c3558303f9b3f333527acdc77db186883e821db8ee8517535c5bd17b20ba5025b92996237c7eb57d15e87c8bfd5f705646b3f9138f24d85a955a78d757939454d4715309d31c267e4f2914d2f4ea22a0b8c3acedc88812d4341fe0af38a84d3dbccd5b46326f8dd05d54d310449165bcb33e701600f5b65a543c96dc50e4035a5ebc11391db62ffe56d8359f64544edfe08f7426605d5d2c13f77c09330c6a400daf9aa9f406c3a4d25f589b37ca298a2bd5a53320ede5ce4af3d66737173840e875705d77a6835d0ae1896a696683cdfc2d57a07227bcf56d52faa9c7c7f3e3e7a",
+          "padding" : "3011300d060960864801650304020205000400",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 205,
+          "comment" : "using composition for digest",
+          "msg" : "313233343030",
+          "sig" : "6f7a76a5951ecbab674440063d1e84141cb042487a12d45d262fd84731b2c17be86ff70cb498838d27ac9a9578ce66eeed034afc5f7701bdc94d7ae2232add9959dd810ad38ef28b49b5b86ccc48f4635c05a5f79a0915efed17cabee46c7bb4f01a73995e076f1b603005ac8337c616e933ff925db88ac61a674dca81c4adbc9c5c7b998cc2d517243da348212cd335c63b789777b1c10a3b0c37004ef7020d0738dfa6c16f4f8d8653f90d166468ca5b9afccc19a62e53b9c8a8e5aacec116996c253b801bdafd66894850d89e0af4a82af11aa8a2fbfa9ecefd8e91265eb3d10b745a018b7bbe7598682dd48aa9221d135c2b8151e611e09deeb145d600583f7158ec5f5cb79d626286b3e9c371339d52eec29a4ab31685f4363d6b14da452c0e1c07744dc831982792f417536186d8aa200f916ab14a462296f78461b104af201499682ef3c2e9500de916d18ec7bc6d4405a0fa54614e637e8847de309bead8750601876b2e0fb0fb86b59aa2176aa07b46e5d4e9c06faf6fc8aea873ce81e78d7dba87e6064e61c2ed382e940fa6804661f34dea0030d518c9b927da7043d13e1ca5c5d2e398c5c11c91930d262ed604a3f43f192e447beef0c6a3ce0c484704ae2cc36f16c88da090f856b802e93ac47b9d5c8a1ad6dba286ec1e2dcdfc8db758f0690d40a02cc02b552f4c9fc337943a2b32f75932a6b88797faebad",
+          "padding" : "3045300d0609608648016503040202050024340401f9042fb127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 206,
+          "comment" : "modify first byte of digest",
+          "msg" : "313233343030",
+          "sig" : "90500ce4cddabd94c38fc4428e7a4d024ff698e05bd46c654e0f8e0d56c1816e9842124e30f8dc4307c67956759339248ffab63bc8a89b440d071d8dd513cf144fd8bdfbd9329a895945acca6515d2775458690baa1f91636b29057f322654c15d8d777e6e065892d2e2880b23ba740f3206b04f2be0ded63bd9797f314f6dcd127bd39322f08c12099f7bb6553f71696101244f34ad21d246e125c8e9581099888cb5b71becf9813e500cf54d6d07db780695d92cce8353bb4e8d78dd46512450508ec7da0192e8967675b572960e9bbcacea5958d56db1c8b3ac3ce5dc36da6e200c388194a51dc7f6edd86ceb9c4907d3150f9392298ff2e4058077ec9e61e13ebb45abf8eb51137bca51a8193e5e153894aa3beb7f6b5846da01acf0936858784598750b1c0494625bb6aff4af8b08e4198378677eb230282ccf57cf3dc82315107191fcd19b695bc3b7289b3c2f03d64fdcf62f06aa2eebeb09583659d3ee473f61381809c9ca3c268fc75ace4d69675fe50db2b8381935bda99b69f777fb9b26feee35aedd39725ea93ae945a9403478cb708a4054e3efd4e57eae8122b4b7632e0947452d5f417f08ded0ba479be8e05389b37d0b8e6875b0d4820cb5ea874dd7fe872c2e031ca2717f04bd592e7b8c2edd54b284cf8a713f13a46c4b7a501e1545ecdedfaab179d08aa6af51352f1510a61458b71dd18f46dd255140",
+          "padding" : "3041300d060960864801650304020205000430fbb127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 207,
+          "comment" : "modify last byte of digest",
+          "msg" : "313233343030",
+          "sig" : "990e1338bb87618092594f64a8b924b5891fc8300b3544c6a35e56f9d526576ba80ad84479ee270364d7a56ce6d1ad3babe976c85866971ea1e4a579e178c457a2862c62d48d38fd6e019895b44a9945ec481291e1a8b4da0e14ac656db4932ad54f31493b7888881a70b263b1494fb842b3d7b28b2782c95902e3dc41979cab7019331437b4d1bb30fbc1e1d36bf282fbe7d3f63804ab61ba14f3d4249401694ea5263334010d22ac8466d4748916e5463a3e3ea330dee97363bbef5146f2f1b0a29767fa674ce724744ff67bfb583699dbecc3c12795b3d5b4e39d6318d4efd0610b1bf9cddc06feb587b7c67978968558173ab5e96c8518b694cec5806c21446b9acd975cde187dd30242afc3eaed7b841749b1df8372c3d5701b6bf9ae0d81d8cbf19a45089fb71843a6b8e933482fc862c80b5eb3193ecfff870f9fb58f5fd5d2463691193dd71b13553adbc54486c24557299b48436a75068baa9220d9537a52dcc20429f7356f1daac52a6077760aedfd82093996793cd506b3a08d50ca7e9972da658dfff8df88e635b6fd8ad576096ad274ce36313f662dd46b52a2d5e822eaded67fa51f74c4bc7ae66ea44dbc3c6f3b5dde792cc0176d780e34efd7174ab64a3249e530f5f75b0e3723deca0b1447d0256a2d3638b4b0d0f26afc1887c4dbbd73cff676e7bc67fb114fbbf791e9483a27cdbb6f24177ebe7d8d08",
+          "padding" : "3041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8dea4e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 208,
+          "comment" : "truncate digest",
+          "msg" : "313233343030",
+          "sig" : "7e6e6f4d815794ba19f8a3d48d051c33d2a46e34d4239ebec18df040695d1712bf978993a142d7ef283f020d75dfc7ec1bf3576f1af6d844b091a2cf9533f3cbe0b408c079327b67bbcc161689cd3754108378c4d88995245069df43ce3328c91b0e7ef50454ce344147761e600d3f4ea33f18da72d0c4f5c2cf6f16d4935fbccbf57369f81d057341eb38023bc14a72f7b6284bd68281a1f43a3e10c00dfa09215e12cb5f091884bbb1c09dcc05f400a41f3a38090716ac1166374d42ca4b90cebfe78e886128b58a3d123d4a31102c0e9e7b3219201fed4fd1a690bcefe17aa37f534ea37391595da40e381f58a4323666d64691d4506721568e96a82376bf7b058e224d8dc977065895e1adecc31e68c469ec0199377fc59e3c9f65b8702fd7da1bc6f6e4840b902eee1fe4b77b847b407402c68295274b748b3ff93c505127a64ca61ef8a2c9e2615b60d559d1d03e06bec92bd54f671f115b2f17f81aa68b55535f3624d3ca940939578f54cd9e570db55e07c4a192d5086c534c4b499ca7d5ab240ddc1c6ce63364f39d2cb9e6489f2fce8941a20556da30f419ce039920bb266a38ad00fe8cecbdfe430066f9656b5a85d8984e9950e78f5cd1918adcc0c8dca978616e17734ec911985e08223a6175492d1aa8fe98db769fdd0c2ea375e085889a7c366ca471717f676ab2873c0f31bf9e9ae9a820f5985f37295259",
+          "padding" : "3040300d06096086480165030402020500042ff9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8dea",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 209,
+          "comment" : "truncate digest",
+          "msg" : "313233343030",
+          "sig" : "79e0a3e4c04ca817128b73f11c4286e6c39a25b6a979deea45f0ee0a6cc0b5b9bc67b206da977f628c8db3b242b451fc0faa8ba3e522f0ec09776801cd78129230e121d2e2c9d302a1ffc5489052eae15ba9152738d1e0fae879a324bde029546082da97f88f67bc40e3431425b9599d6d097c452059fac41839a6e8194e0e539a5ac1a94af4708fe29dee4df1e21f0085016aec68f3c4fcbf7e64b7820885bef35ed4cd6b5d8775d691d2553b61afb596eee499666b7dbcd043d928ccd8d0be5754c73bbf36226017bb62b27cdf64bcb900ded9452eee442fc0341211f58cf15fb6164cfbd0a187c3ac90c05c4620394ef3e4b93841191a299c763e24f5695a230d1c03b1edff006d774cf400d2ec2fa2d4c397a5aeed9394699553c7102839267ae8379a3d7311d8d7bcc2547773e8acbb5a7fa2a9d2724597304f865bd8ff38e975afead121e2456f669b54a442fd6312aaa3c9bf1320eaac7a9fddd82abf70c2c0d252bf9d74432f9595e9d19ceb1b89a416c1c10bc62e031215f579fd5049f6e2ef5c34717f192c28f34aed00bfd8314adad692bcf2e5af5e68bbf31ed2923949df8c28bd77be6f4ecc00f5c1ce725da9fca12b884ff5a8576db58b174fbb11822202a8b015dc6d1b3ccdd5d306b64dcf4e4df138e44e8ddb264326fa35e969dad71eae521697a1ee02b101ccf76e794eb252acc5472ea00d8366d4e2ad",
+          "padding" : "3040300d06096086480165030402020500042fb127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 210,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "388f02de647e67bc729a241dca57c75fc55d876559d697587b302bddef18222d1d0f53a9c5f6d9459d457c2f8b22db872078fa3ee73407be9be6ec15785f9721400d414fbe908aced1af9453092e241a41d9506944ee4c7f0ba79ca3d05195408cbed131a6cf4ee28167959ad35cffcaef2b88903213a7a9f7270278cfecc9c61077517e3b7c9fb72bee572bea2817e8c0a774040b5eb508bfb280e3bbc878ecaf8cacb91fbec22d130a1a123b8dd6451c3744de779dddfc7516e483fc01554f16ada990016ed6e4ee81470688b0d91b36199a8e7e0b8aa3f3e12161f53ca859b2accf0667a1a306bc10cf9e66e5562410c183c5322b1024f0eac7cfa4a5e633ff99412d769d52a0dc2c585b7b6a5706c7351b7d04b26d7b9061d4455a97f89b0824023ceabfde9837d743a06a36ec974ed0c1a626fca20c95e5dd1e1a3a59e15632bc6b556c8394ccf4733c85a9b9008c8dcef89693ca34f8cd32847816eb75f303c96b627ecc8801c3a25b612983f0d8b098c0833316b427f5dfd66834afbd9222110c31e81c61eb2eaacfa39b5082d2207b547eccc25c03a825648cde875a09a03d2205080b4352c5cd6b47c32a5257f9b77b6b4d25b606f87e353ca096ea5b63fb0ae5e51e0ade201ac4452d3cc457a49be9aac9068e584ca9f056fd5908aba626b5fb12fad165fdb1687a358a010adf42020d6aa17152676a11a6a060df",
+          "padding" : "3040300c06082a864886f70d020505000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 211,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "6dd73d8eb7f7af0e6f0bfdcd84a107a4cd6edaee3cbc50b137426e21e2608ff446a2ff5badb2dfd517cfb47c60d832c00f86e14292c79872633c26f92008f2664672a24e8f9347c3b37940ce86f64ac698a5038afd97d6545969a7a5c03e81a29cff5dfcd1c0915df288766c6483bf32b980e60b07208479be18046acc3050fe0f25def3cd63cd5c77f86d2bd0f41925dc7881e19b74bab0323b2bfef61da8948d77dac968eca8f66a10d384735d57badeb0cf738d90652f48512d05bf39bfb0c239de3c0573519c1067f08feccf48d928e8e36633e48025dbfea49efe70dae118f0cfdd2cf5978cb8f63df6ab89f39e13ce05e6d27eb1091d803b5a621ed95758fe45d1fb249811735e7e1a5f2fb6d4e413dffd6c4b95cf106f7f7629b0525a77c70dc78822cfdadda44681652e4d1baf883114bc558b4eac1d43c2701365d5863429f1ac71684e08bf3e5bbafedc5b419b148b2d5161e763a96b634f29b32f2b43dabc68b3a51136576df5e2bbc40f319332971c8fdf673e2b65c6a09fb981182701eaf5afd6bbbc17073c49d6a6de3a539c5429f48eccfe9359db691b06f122ee22864176bfa5dbf6fc6b4d6bb1ccb2f10d58ffb941474bf5d5be955f4b2d45edf7c4c5bcb0605186ad3776a2308852144ce69df2ad216eb5db72b904e50c7b9e25a8c3e7c14243e3fa9a91069561c77d0c51d3f84008f512032949926433",
+          "padding" : "303d300906052b0e03021a05000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 212,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "4ed5e27ff4a7733f60af2f99d2515c155f29854768664dc309f14b8040496645fe6a3e2c7d868f8c4aa8ff6152f38f3646b0b00e9fc8b60f9c893c2941ea6ea031d9d2fe212ed3f6c0b50e6c09b23bf1016d5f2ddb1d72f96a4a67a2c425795c96e4b9ccd22d3c1cba00a1b1c6e6f07acf1ecd730827c5a7ac0718a8f0617e7612e85c56b4359bab844753e2c8f7d15c853bc1a60fc58096036641ef7cd3d6ff8d3865b730194867022ed6a9a8c3955d95860dcfec490d6639c264a42807ff4978247498ede2dcd993c7d70fdfad848093f76710b8528ff8cdc6850eec48f0e59c278cab5da3fb35c26852f52c0672b87112332980a1910927561aad6fde18edc05f0eb607a976da88cd78e9c19e356ed79591736839a78ade95e098c04135e87b4062a6064913d079cf682a6799dfd41cc35a44cf8b04c5666e74b6cf4c1ef76dfb777eb8b071a42a1032450ff4dd198d0d429659948685854b4a4f97f4a281279d364760442475ea124f0f5f0d6c4a48ec7f8224e068dd640331138e8fbab4da96f757c09d96ade27c6a3f4c85192ab63c3c61ffbe21643c0e261d60791f59628fe128245f49b64227ddf357c0ea1b63ffeb48c1bacf088b63bcf6d3958cba85bfb081d3208eef0562f2df3d9d0b939d2aee3bc841e337d69243ed1ff627ece41fbb9fcebdbaaa9687f2a18fc43e571c8a1af885907d1a751d0253e918d04f",
+          "padding" : "3041300d060960864801650304020105000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 213,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "365c5a432cd3eec15aa93df76917c577a947c5442ffa98373c70f19199dea96ffd8faae8233f46963ca70052348123d394796f596102506e4e09e6717493aeb257d9dda41316afc0499678ad11df91104afffc1e20beefd94f0d57500fac2dd7b71b3ca0366f3187452f3c202bd4441862ea4ff715c12af53b68f01001e5054ef851aceef138b094461abb7796a5dc84bf53f7c4e7006effbd9ff91e1edc498e867e754854c59213c0116a8dde9ea694210731eb366c53729cb2b6a9d9038b153ba2879b0de5b5c9088b79a84a9552f3f6f2021213010dc915b041713eb9350f7a1858e338fee7063cee43aa0f195fc70639479b5fa9e6539e69033c8d3f12acd78eff73c3ac110025f6f7c7dce6d472a240f5e6aea2beec9b7d8bc413e27df4a0cc5be5e73e887ac265fb258ddf5c94ec90c0a4909c73a58bfd4beebcfd9f23602ee10f78a8a8b395aa17ccff5e737a0de2a061394355b1bc5e3c688ed06ba65e8b57967a429a2c352a2437a448fdbf8fe52ec1da0934b8eaa2b7c230e507341efa2625bc4e015c21a7f9aa4e050b26d3aac6e474ac7f2dcd709984643700a0521b0d840cf93c29a276c12e6ff32978d92adbf36690d2fe8bcc9e12a42f42c26119f1f432a7304b1350c3d584a04b14cc6f31e4566f72786ec1e24d5ae1fcb8b66ed7d8e28619a02cbb8f217b1d8a3ab2938aa0b92e5b3cd8d3d0fbfb77f5c5",
+          "padding" : "3041300d060960864801650304020305000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 214,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "64d797c9a480a0af29bc1d0fab877feb031e12d211621d1780f0e6c7d1e121fff78490dacb450c84ca886124336160b381c49e2985f90148b86015e32adb5d090f3a5b09e3cc46fddeb0905f92c3efb94e2ee887d160008d5a6221a637411ffecd725df8e92baaa8249f07c452439750c40b0afb88654585bd287bafe4a61de4509721eb4bd71d992f62d1f49ef96695c155055138fef906cf2846a2abf8c51d70a333206bd7a19ec8b0c9ea182a7b4d76c33c21196aa72d158a0ca7fb3dd44a39e4191fa47d061e2fe283dbb98dbb0914859a73d5fc199c297080f71a1c91547730b219a365646b5fdbbc0b397ed2b4eeb3055ea7ac38fa2e27ac236ef055965456bc2ea396acc1ea2802e367ed1b465d4706ff7e1ed810620247378abcf6545cfb3793a695a0abaf924333b291a6ba8e1714db4986a5b485f7a0618b731b9ad4b03b3d07ea3f8d7be90114f9d66211ff8b30febb2def245e6a561108264c237f8fc8c35e52b20953b9c49e620146beab9c3912f9a012cc5d421ef8ba5fdbbec3a142098ce9861c6750498cf7ad05d9d5e5cb557a2bc386960274d9d0bd091478bbe20c086d3321cf44c8f8466755dcece0078a0a5ec83d206d0c3f70744f234bbfe0130c3f6bb455f175a038db19ed336306ba77d1c4646a578d229fc94ad2dbabdaf773c49452bfa06ad01b8fc8aa6b63a4d4d8144c3270018bbc122f87c2",
+          "padding" : "3020300c06082a864886f70d0205050004103fa6e1540a9e5b94313c5907267a7331",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 215,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "26864e54d84f29b53367ac7073df84ce5d885c7b67320e09f3bd3a8468de72f8ee21253f1157e74680190a14c895897535e04d8861a7460039970e10bd1f1c7f4690a2b7e2422f33c4eb2c18fbefaf72a85b552a26dac27bcf5e66aa97a4763a1a32a8681b2627409c8a71c4a6e35b5d845e35a3ef67b976ef02940fe0a4e479535a0b6239e4d1eec727e4a214cc7bd7f3029b3c36aca191ce5bec40f0927cf16a38542a46453764ba94ecf0651946978df3396f6bf12dec23c3f33c78376df770842f28aff8d752f25308c2ecc74e588bf16cef324cc0f9aa156b0f52c93b1590056f3f5e01248c589f55e415ec387bdee72f96790b1cdf01f07a48f57f058d1eae9730dfffe05eefc8882952f88a4a193e76ea79c03a32941e051f750c49b39e5f42083664f8e56a1a09854ec7f11931f9b59b880dd19ec698e4fd299b155427e209614bad115f277812b1dfcbe81375342d8336096012ff6d5b819c0a3d3592ff31994c2e6734c11fe3aa9767f2e07ca61e5fcc1b38fb0284bcccb80eb4763aaaea78ae33483d0aa73e5109182913347ede34ecea4cd1571efba8086cf7a4532a85c872e27f39375f736aed8cd56348aef209544efb5c433b013b912a71e25e832bf7d8f657b8885062dfbdf092085e34eba9b60cd4523a118405985e85370ba59735ca3c8805616158eee9b2431fb135e061d2c9b7af6f1a1e100a77da79",
+          "padding" : "3021300906052b0e03021a0500041421f0fb55d0f5f4e1521ec82216000a17e728f773",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 216,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "05efbba03b90bda7ba280c6aa2bc8af655c884de2401c9ff9dd59e0d82c8502dca3d90879694692ea2b3e77c6dd3fb0e1f180777b237e462bae0a8b35cc21497c36818a1dc89dfa64bca89cb07babc10ddb98538aee10a4e59b4040c366c8413326e79bc015ca2ebe0a53ee6a4c49f5d9a87bac550e4b6a8173fb49188aeefd28457b594420cf2d77bbc044f6f4f6a7d7ba52d657f5dc6b631ad914bb05bcbf2901293e5eb5a17a88dad2326b508624b698b31d1fa08d00a001db8cba4a9f42bebb0eaba07e87235a883bc719513aa217a36ee016832b12cc4ca0d628598212d5da416af6342855da7d77ba153e5435ed7ea5d04b2459d68c721adeba8c071e979bf89c04a3c8219d67eb514a79b3a2f6926650c55e724b62f800b4f9060110479442e4f8b82ead56330e2374cde8b335552dcfdc3d0f940186192fa9fa6daa8156b1e55005896fe74a3b7164520823e7b7f21611421c281242b37da0ded476903f4b44be8ea35b594a2d97cb0c98a7d2a50123be606c3e3c11b4984c5a55ed01b1848fc54b83f681ceec448dbc4d35d15c389283b26de66c713f05a0d31993ad3e6e1b3aaff06b6f046ab075d93a8ca75c3e5558f8f2a445cf10d5eb813bd6f2754c502c93e81b904d845fb55c9e0810ca7259a012840cb0c85056b0a7e141e8d3a7fa5849da50e157c46164c9c02ffc099f42cffb71368f0ac3dac77b2ceb6",
+          "padding" : "3031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "182a3c3009c88b744220bb4740f2e7a3fbaff9f691ad27dd572ef3678c908fc22897accadbd6900c8b754b47a5f680784303978971fd9ccc90364a19a13e2b681c980bd71be1b45280d57febc33da4d1cb6201bdb2f7efb61b2c48dee4b395738e6814fb228d41203a6cb99c5b6affd6e11a0327fb0a920db90319b0b8578399ed7461f0575acd25157153bf483793f047d02cc02466201fbf6383478b05e61c49683bdc610ad3b0e77e95d9adc991e7214f26db5e685d0ca7ccdd3ea77c5069085d421633c1d7b894c8253da0cf5905bb16e412ff92c5dd91bf0a88e9ebfd34cb65b2f0347e4f2148741e8f660c39e3a156700548a8f5e847903011af1c1821fc5b4139bf306449d77f0acb5a8703687063a16bbed3fde1c5ea05bb8c7ccf9201f44634fcf08af88540a005f590eb5f91421a14d96431be124655dc3dc11bd7dc9922c35699c8b5c9244bd3286dc2514df3b034c973db50a4289e49eb179b7424ecaff6c3ddb7c3f7038e63474a270adde2d5a347e6138dd9f1c5deb7b5bd3a0c5a3720d960314c6f6e47b1508c38fbabb63466e0029157c34f3b67517e9044b5c0c4473c0b88a845e314a4b0193e0057d460384c62cfbd7ec5ba725114635baf28fd44f35ab0f9023d59019c2bd3bf48a9d8b223931e1587057633749590c19c8e96175c8384c3a525d35575429d9b4e89d01585ea15caea456a6d947964df",
+          "padding" : "3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "using PKCS#1 encryption padding",
+          "msg" : "313233343030",
+          "sig" : "86ebb86cc898d04b302d9dad510e9fc5e0018d685eb334c9fab116ae9187b9593b5e2b9690c9f32cb8219bbfc3317a9c2906a811415c7ff339531b554031248d668e29ce59e4f641cb1bfdc36bf12be43e86dc91ef095b18e8f60d671b20f06f1b0021e4e6e723abcd55ed4ddef563f837d8da6af8d078bf22492d4b00b0a4ebee2dcaddc918c585dedabfc69a9a98d553056e37f2888f2357d7e1292d4513db3cf8090af30b2c22057ffceefe98b9437f2ec751f8003f012aa4647b34bf230ba7e8128dd5b5628defc43a40d9107e4f36a4fdbe319d6dd210f0fc8c608db79956537deace1483ff2987327839fede77b1aca4ae0bdee7376e01df2f7ec6ee4735e9e573606dcf46038226273184b8dd1752d3c7fa989c32000fab98127ece022df538de31c65ed5b59d94bfaf1313618714c7d92c08137a35b3724dae445a088d209920a5867dce2e67338daf329d9516bc7fbc0a883fa96a9886a2d0c5a4671a1189013e07abd5dcd114929e5c3e7aa42d151696a467f58e4da1ae7ed623fa311eb16f67c3fac14bc9431f66146b3d015caf46205f2e70fe5d922c18be1f655e43a6f660752e388481ff2f8099c077ab7f816ea7dfe18f9fe2056af94a5dafc0565286e6fc2a7fde0d0beab06781c00b2253a30eba3407e2b6469aa3ea896e70780cfa00afaf73f441e1b726c1cc5be9fc69c0e62759893379c39f81be64e6",
+          "padding" : "0002ff...00<asn wrapped hash>",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "using PKCS#1 encryption padding",
+          "msg" : "313233343030",
+          "sig" : "12053524fc1eabdd9eb1f39912999cb88339b12f53eb2817e50acaaf6ec0ba9b28a554e4037fdfdfafb6533fdff27be0e74dbbd53e95b66746ce22fd5c155d4f7f6898b3d82b3a917c300fa95a3471819be51199fde252ec77c4747d7feae66108197f7fefb8f5a2a78bb9f6adaf927839ef696cb5d5b0524cd3482313827821d56537a1af7c72ba4b68463d033b5af9c4aa9dbc7c69008a19793e60053259385947ec3672780704a772ac4b2481ea5252f5229d8aac50143c7049d2ae9e90a0205f1da466fb8d3fce4111bef81e856b8b362aa98826142f98b5d08fd36bda2b3d2b79f277beb942a6f28da26db50910646bbc78d06a0db015a8371bc75d29a75bdf91bf29adc2aa6e0f255093ab1e27ba31a9659fa7b4f5fd6d997f23150e3eca7e0abed2faa0d9069b37a95f4803fbd76dd3f4e4a657b8d7fa8e1cfc1c0f1734baf1559f49173da13b7783fdd0df41f9e73bd19bd6a93f3a43291faa740e95f7452c53c6ed05b4c1d25729842d461e2907aacd6a5e2aa84d9226d809d4b3bae8f8729fa08bbc93e10072d7920515479baf691a34b2ba7f71ec6d3b3a1630b4de74865b9c7ad4f1c3d3d73205caa67b18149b87f913701fe9c6fb9644bfc9efbe715223f3d0f75f5fbe1b6988c1d623cd4c3e2afa419cc950dd48b09dc8a4048163f899165b990eea24e9b1b43b946f5800c614e37c813aa9490e3d74fbaa35",
+          "padding" : "0002ff...00<hash>",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "invalid PKCS#1 signature padding",
+          "msg" : "313233343030",
+          "sig" : "78fbe68519b106475e9407f0ec83652a9ee79bc60c3eddacc3419860190237ae947b21ccbfdee04db09e7ee4383f2b5b1019aed8c7ce14d4832d48153316499f21f4348bb87126ede5f8976e0d31a712200ca85cc484b114bdb7c32990e067a15ece647d637405ce8cca20db1a0b5918a8b7e51c29c9e323582c78de565de12b828bad378a3e13c85d7771790f6bd89186c991560d8d83c405c212ca195d765d6a8e3eddbc77471a077ab4e239f75a147919d817cb8da78fc35c907624900aef916dc0a81c394e9f8124103a5096b8d737e395c1d5a8ea70f79f416e6e7277c28c041e02c7bd4b1b4b07841cf35701da7184abf8943430fb443e81f7844f2f85fb9fdc349620c8bcff4d7c8d1bf0f38e4b2476c27afd74977ebfeeb301f58e6982ff78b1442376fb5a60cbf26d9df59dee940ae42fc2071ceb4ca78aeed44214546aadd6b34774a1e487c0b383d02d458bb7d76b799244ed1bcde685d8d913a785803166440a9147af47de0500a65b8166568f5a1d9bd0b8a5a805ed3c665dd95d6b8241ab9c81bfdc0ca1da068839c46babe1b344ccf2a9b8abe3d4421ab7debad0be0102ccbabbed438a384f5fd131d2e3b85d3a733f9a625e55be79010c44d386a2df6d7d96e896b2db0d06e3fe9c2eca9970c3abe79e1d413db294515eb54e479fb3c718cdef7b47c6a89287e48f246177207b8e75b75f47a2a348062b5a",
+          "padding" : "0001ff...ee00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "PKCS#1 padding too short",
+          "msg" : "313233343030",
+          "sig" : "8fad4280452da19d7cb9c1ebc9098733b6d337ee8dab0ee913163d8632620a15e7f27aa9ae1539907916993e0cfcb6577747fdf5934897ccb36ade1b495286fc66d78226df5d8ebcf1552dc2d7ce495444241b7f4e53f0e53572df653678ca5a102857943ffd446ae261850026b2ccf8689df7a72f3fb024483527251ba84c2c334d0395f47365bfab6ebde0791a8c9c3e9dec028e2d5af58525a43181f91c69a5acc78b3672b67e09803c6343cef3aa0869613a74ba59ce4f1967ac2d87e56227ae9f7e24cf4e25b32a82753bd50fde846fbd3618a6985fb05326b91e6003e614466bde4713766551fe6838b3789302ec084e0700c37e9c62ee98fbf711d31b7b1173e77a104dee21b393dfb3fd2e4ba506db1d9c2d99bda0c3744d04e11a1374cce40e1bb0c1c3e4e1680c1199c5e9a71119cc4cb4e4d7482c365f6a4b950e0ef06092b330e94bcd310ee9c12dc08c62ac1166474101944165d26c7a9aaa9328935914f2a6d79090a79465c69239eef14adf66a32117709528fec892619c26f59e234b5755530d1c10c59973b40a55c289b85f5e5f34c5e147af44c84460e2ee834f0a4798f49aa61a16148c8a36fad5fc255bd02621b5f51212908d73089b10936d778b6882c031eda9e26c7fc8bdbbc4eb808e318090e89cd6daabb75c1d55d638d603b60d51d3f3a82ac56663a0e4df5d9cbf323e1ee7b1531e97a2129f",
+          "padding" : "000001ff...",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "CVE-2017-11185",
+          "msg" : "313233343030",
+          "sig" : "e3ae7de5bf44de7d357e238c8dff063ca713470777ab786b495884e7a9ba1dde65de7d2b5be3f2b7d1830cf6ca8ed5c05d3f094aaaeb1dd2e4b2ede08613109a9ba34c7e2bf8450225974374459f16da2c14192c637985febebbef01f0381e78d0fd63b76038f5e3d35dc7d2243963366af5d7685f1bcfc99dcb91e94c93019068353122edd03cc3e615e17c1bf1dd7c43dae86f47a40238fb594041cebdba25f3fe9593a6c329b7f7c476eab7625d17ba7be7886936b733f8dce6e6c937f588da1315c1117abd29c83895d95988d17f9fd7623960d8e433d7c6841507ff2faac36e0e19a41eb2cccdb2a2c0fae966719a99d203c924349bc0eea1374efd3e23099b2d187922016fd014087520a67363687322b90d7a890d8f4464a8c794d2a3f2070ccd3b0ebbca2b42bbf8eba6f2c0bf8008b5616ee7b81629ebff97a93a5b861989daa10da7c8e3bc7b0cdb095f6ce1185cf8fd3dca035eb3e505cbe022d81d93945a144806b9fe0ba07f3ab9c70e72b5fb77ac6e4c7e03aa2dce7c5ef227aba1acd48c1d93e0e26f01e8f1e43aa97880d15d6c924b060d1face21d03a796c86301f4a74339e472b2f96cd0755741cb9df3535077381ada84d1bc0846a6c44c8a8d3cfe1b7a9913d1f3d7af2c5ea4e67ce0a7ed3c0058206fd13ad9ccad5a8212f3ecd788368a6b6148178c7c5ea8d6d385227f2c76a047216e5e206b1ed1",
+          "padding" : "n",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "invalid length",
+          "msg" : "313233343030",
+          "sig" : "e3ae7de5bf44de7d357e238c8dff063ca713470777ab786b495884e7a9ba1dde65de7d2b5be3f2b7d1830cf6ca8ed5c05d3f094aaaeb1dd2e4b2ede08613109a9ba34c7e2bf8450225974374459f16da2c14192c637985febebbef01f0381e78d0fd63b76038f5e3d35dc7d2243963366af5d7685f1bcfc99dcb91e94c93019068353122edd03cc3e615e17c1bf1dd7c43dae86f47a40238fb594041cebdba25f3fe9593a6c329b7f7c476eab7625d17ba7be7886936b733f8dce6e6c937f588da1315c1117abd29c83895d95988d17f9fd7623960d8e433d7c6841507ff2faac36e0e19a41eb2cccdb2a2c0fae966719a99d203c924349bc0eea1374efd3e23099b2d187922016fd014087520a67363687322b90d7a890d8f4464a8c794d2a3f2070ccd3b0ebbca2b42bbf8eba6f2c0bf8008b5616ee7b81629ebff97a93a5b861989daa10da7c8e3bc7b0cdb095f6ce1185cf8fd3dca035eb3e505cbe022d81d93945a144806b9fe0ba07f3ab9c70e72b5fb77ac6e4c7e03aa2dce7c5ef227aba1acd48c1d93e0e26f01e8f1e43aa97880d15d6c924b060d1face21d03a796c86301f4a74339e472b2f96cd0755741cb9df3535077381ada84d1bc0846a6c44c8a8d3cfe1b7a9913d1f3d7af2c5ea4e67ce0a7ed3c0058206fd13ad9ccad5a8212f3ecd788368a6b6148178c7c5ea8d6d385227f2c76a047216e5e206b1ed10000",
+          "padding" : "2 bytes too long",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "empty signature",
+          "msg" : "313233343030",
+          "sig" : "",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "0",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "1",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "2",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "n-1",
+          "msg" : "313233343030",
+          "sig" : "e3ae7de5bf44de7d357e238c8dff063ca713470777ab786b495884e7a9ba1dde65de7d2b5be3f2b7d1830cf6ca8ed5c05d3f094aaaeb1dd2e4b2ede08613109a9ba34c7e2bf8450225974374459f16da2c14192c637985febebbef01f0381e78d0fd63b76038f5e3d35dc7d2243963366af5d7685f1bcfc99dcb91e94c93019068353122edd03cc3e615e17c1bf1dd7c43dae86f47a40238fb594041cebdba25f3fe9593a6c329b7f7c476eab7625d17ba7be7886936b733f8dce6e6c937f588da1315c1117abd29c83895d95988d17f9fd7623960d8e433d7c6841507ff2faac36e0e19a41eb2cccdb2a2c0fae966719a99d203c924349bc0eea1374efd3e23099b2d187922016fd014087520a67363687322b90d7a890d8f4464a8c794d2a3f2070ccd3b0ebbca2b42bbf8eba6f2c0bf8008b5616ee7b81629ebff97a93a5b861989daa10da7c8e3bc7b0cdb095f6ce1185cf8fd3dca035eb3e505cbe022d81d93945a144806b9fe0ba07f3ab9c70e72b5fb77ac6e4c7e03aa2dce7c5ef227aba1acd48c1d93e0e26f01e8f1e43aa97880d15d6c924b060d1face21d03a796c86301f4a74339e472b2f96cd0755741cb9df3535077381ada84d1bc0846a6c44c8a8d3cfe1b7a9913d1f3d7af2c5ea4e67ce0a7ed3c0058206fd13ad9ccad5a8212f3ecd788368a6b6148178c7c5ea8d6d385227f2c76a047216e5e206b1ed0",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "n+1",
+          "msg" : "313233343030",
+          "sig" : "e3ae7de5bf44de7d357e238c8dff063ca713470777ab786b495884e7a9ba1dde65de7d2b5be3f2b7d1830cf6ca8ed5c05d3f094aaaeb1dd2e4b2ede08613109a9ba34c7e2bf8450225974374459f16da2c14192c637985febebbef01f0381e78d0fd63b76038f5e3d35dc7d2243963366af5d7685f1bcfc99dcb91e94c93019068353122edd03cc3e615e17c1bf1dd7c43dae86f47a40238fb594041cebdba25f3fe9593a6c329b7f7c476eab7625d17ba7be7886936b733f8dce6e6c937f588da1315c1117abd29c83895d95988d17f9fd7623960d8e433d7c6841507ff2faac36e0e19a41eb2cccdb2a2c0fae966719a99d203c924349bc0eea1374efd3e23099b2d187922016fd014087520a67363687322b90d7a890d8f4464a8c794d2a3f2070ccd3b0ebbca2b42bbf8eba6f2c0bf8008b5616ee7b81629ebff97a93a5b861989daa10da7c8e3bc7b0cdb095f6ce1185cf8fd3dca035eb3e505cbe022d81d93945a144806b9fe0ba07f3ab9c70e72b5fb77ac6e4c7e03aa2dce7c5ef227aba1acd48c1d93e0e26f01e8f1e43aa97880d15d6c924b060d1face21d03a796c86301f4a74339e472b2f96cd0755741cb9df3535077381ada84d1bc0846a6c44c8a8d3cfe1b7a9913d1f3d7af2c5ea4e67ce0a7ed3c0058206fd13ad9ccad5a8212f3ecd788368a6b6148178c7c5ea8d6d385227f2c76a047216e5e206b1ed2",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "-1",
+          "msg" : "313233343030",
+          "sig" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/rsa_signature_4096_sha512_test.json b/third_party/wycheproof/testvectors/rsa_signature_4096_sha512_test.json
new file mode 100644
index 0000000..8d3d630
--- /dev/null
+++ b/third_party/wycheproof/testvectors/rsa_signature_4096_sha512_test.json
@@ -0,0 +1,2095 @@
+{
+  "algorithm" : "RSASig",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "MissingNull" : "Some legacy implementation of RSA PKCS#1 signatures did omit the parameter field instead of using an ASN NULL. Some libraries still accept these legacy signatures. This test vector contains such a legacy signature"
+  },
+  "numberOfTests" : 230,
+  "header" : [],
+  "testGroups" : [
+    {
+      "e" : "10001",
+      "keyAsn" : "3082020a0282020100c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d30203010001",
+      "keyDer" : "30820222300d06092a864886f70d01010105000382020f003082020a0282020100c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d30203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyadlwmYbRnTP80gOml5G\nKtCtL8m8b772KEezET0gmR9lOWeXHCglJ1P1+6zOASwqirWSkU0mnvr6ck+kuSDj\nQJMMEG97Nvec6/DmLojg5HaIjp8OIhhqzbbEUjojK2W0/yzCLcRPilWVJ9edfNfc\n83cyEve7mqEzwxFlzGY2kL8SPXOSPIOJKcyv7lnWxwlbjUp0uvLRksmk6HxOErxY\nATB4sop3iegunzHeH01qKqboBjK+jkvfJj6NSbCUFvsZxIjAetivciq3kYKyMCin\nHgZdAkEqnuvEbX2PTgPXkjjYwMtKl6mhIA67bsZAQuvsytlWdSbu7xLBfZTBBJyI\nmXC5bpTMNTFyomiknF6L7hPBWznexE8sehqjenoLb3IpCsraMrHYrx/D3IqJSHuo\nE0fL6xNQkl0w+SOVgQa0mVnIcefB26VdoHcuNiz4Yh14YQhouJThbl3+yWh0qTpM\n83m0fn4xjOMVBm1w7jk4FApgFI8gUIXO+KdwDKPFPVKldWpjs7FvFTBithJipoSW\nIQyL5O8/kCnKDqDjs6DV1tIm7bv0Ta+PBF3Cht7TxOxNtrRTRwefM+r5jjyVtLYO\nee9KMJP+7FQ3A0Irp0oRhRHCGTtU/otjOGbtLHBcy8bn2dNlaAnsPTNW50AKlkjs\nN1BQQePjGvHALu/pJKZwR9MCAwEAAQ==\n-----END PUBLIC KEY-----",
+      "keysize" : 4096,
+      "n" : "0c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d3",
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "9cd28bf41b99fa4df2852d86536257fe111f63f01815146c057dc3bda9b6633e49495d38822392b6b901e6ac69c4f09623a524e49246c3710c85a1957943d89c8399b0c2a649938bb07340f14c6981a0da0fd35163bc7eedac80ad1cbf06a4c32a4a08523554256eb221395c76e1f79a5e3c5b9636673db3ba27eebf8315468888671f8441324e092124df31d396ad8367eb7c9d0afa44dae85d56208ba21ec7c1f0ed6a3678f5d97ba7089422c662d86cd514fe853f38481632197c1ba07e4d92735eef3b75afc25ffa900769c74ba34f2d157e74bbab64cf413bc858cf6c393e8afe24f9e71168e97db96717d0081d88a27257d8c692dd0e001f3fdc2090512550ad38725c10a201fc50f8dc89ecf363b4d21a7d815eb78557d42e657cb44bfc785203e8de00f9e18af1c8e12953a33b0717af215d9b04b71fc320bdf4d558faf55d03d30844237551e35ed6606bc706ca43a47e6c493e14719049065eb8e00760283ee72c1ae3ce019ce3263a90b8340d1a47b49b78d5cae9602539b379186e5c1e847b69c75152036c8d9ef3c77ecd151bdae7ff36a459d0bbc1dfa33ce3dcd94ee2cf6ee08a77485746306ed987eebaae2baa544b543b5afe143e4122ade5adfa4fd463a246f29482dce7a51573aa18fce87f7edde842e7f21ff9e40c4101b922616ee4c14ea1af3c4d417fe8876af381027d837fc40dc684e81b9eecd4",
+          "padding" : "3051300d060960864801650304020305000440cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "659ffcbf6b22f5d201fa4114077aa7df32b513a1fa5948ee01f6e21c1862a2b91863f7aa53d1aadcab9347955210a91829a5f7c86b3e2850bd1f76b3c4f4333615ceb22830a7a9d7a13436683a48995bfd62f528ef4959d30b6ddcc8ed2a431c06c337250f8274417f6369b7a08b927885df52bd7370d3675094bf1bd32a7f5b0ca9a399a59f868cfb78f87b8647ab37d0d7a58d6f4a58f3e3df7ae88ddfa6470050229754f4ccfa265cec0635f0360c485d8f81974c6b8a11adce3775dd01936b82db37641ecf5f43cb8538055a053d4085c38a8a1c4e0c8af961448a779288c5efaab1eb4401c8f388c0b729e42243d935df1ad3705c1c5a7ffb6ea8ce77a69481a3b930f95ff118cd0fdb17393a37139b3b5a9c275c6bbbc819e18f49c369153bf1f7807b450e54fc28065a6ab6d5b0ee91d0a9302ebc0bccd35c2fb2fefc341a954b67e91f6d8f3f7b62c5fbe504508594f357b1ed951fcac7043a082b9bbf41ccf609881861e2de15ee99d373c0e99027ff240c0b6fa52be2e199967860baffbe25b3254fcd375da7152bb94ce8dd01465290fbcdea0838a69576e97e63cb636db79c2799a26f94a9fb044e3bf66c520895b4683bd799e6b04ab62f621dc00f20a4adb131606f127b84025269466c760181d7dd9ffd0aa5381180b541e5e933e1841d6386ec55a63bd9d8674a775526d30dbe34e4db87067a9326c6dba0",
+          "padding" : "3051300d060960864801650304020305000440d296b892b3a7964bd0cc882fc7c0be948b6bbd8eb1eff8c13942fcaabf1f38772dd56ba4d8ecd0b626ff5cef1cd045a1b0a76910396f3c7430b215a85950e9c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "46eaa4624a4d2c1f1043eb3d17b48d977819a8796f48f20174c50da624c657e64d3154dcfa2a5b1d8c6d2ed07cf1f1c19aaa611d6466f7e7ec73df5ee786573adc5a9e3c1d0a25559dad282db26e889807764115a05a23959acf48d23b3b33a93d8b6c7de3ee446f113eef96055d285fdfd27888e569c50f022d5e8abafc874dd5a61df6258e85268bff66cc5643107f7d9097496caedc185b37311ab6979f273e5670f143146b68e44b49389554772c1ca7bb7a12fcf67d67a1fd0c245bb4cbb924276ae756098599392cde076a1c0edc8096d9125e5a5d30c2a93d00fe2e0362e98592c8fd31ab5b4c3b34e65d38ca0c25874eb394e04969982b70932616b75ee2912c6a07f20ec70e52be630ebe024c0622aed125e00bc84980416b80cba7752eb90af2b8215c4b559880d2e1c577b7374531038083725d23d02d4fa5d8b5a4c68e9ea5e11fe2d9e03c1b8a4db0b053097b5a175b1131e8beef5d559bcc3f17ed2e6f6304c0e4650a2bb675aa8de44af8a2e301734584eea145c4b389f6180e6395412ae70e57f488ed15d45895be580bd87cd916b8f20e46ad2fff0367dda54266778bb444c6e4fdd45fa62cae3aeb54b6a7a6b4d8068e3a4d0730f0260340a6c32c3c5d33f514612c941bb63d730df5584933e12546500495b5ed3ba3631a3db871d17353d4c16676a0332ba4c4c4c68cdb6ff21ff737ee249be153c1d9",
+          "padding" : "3051300d060960864801650304020305000440c6ee9e33cf5c6715a1d148fd73f7318884b41adcb916021e2bc0e800a5c5dd97f5142178f6ae88c8fdd98e1afb0ce4c8d2c54b5f37b30b7da1997bb33b0b8a31",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "12813153b37fa6c0fd755a1c7c409bb8169c5a39d045dff2da02b2f8e8897b0cdc6c2d40e6945b97006f18e1b26983f77b70bf2961b5e5f2759241daee8c56fca7c53c81f69d3a0341720d9761a4f7be8c068464e881c85a2c39e0ac6f74f6f5cb42df8c3713f66a282d7fba85b7a09a6af83a068b78bfe83ab25841e4bc67c9e40cf2a0974f8875fb81cc6a115b91f922419c44ea82b33187521a7e1f46c0ab9459b4e97a3f4a1d9e92403a37168826fa0ee914232afb6c4d7dd082d0c58885e356d0efb8aa9ae33d045f24b4b3182d5c54556f5838c449d31a49a3ac4ba568c248ed72c111b5ffabd991ebf5c48efbca33cb38996d584992c4abdcc7b93700ca03619412a355b41b000a32f6cc4935f942209b56a23cfb7b788dceb692343995f77daffa25e44d672f8bc451f776560b415d0d1bfe9925af1c2567a8e9bd15b8554d93377c62b0addabd27e8d9e0859f498ba8e03094e1d86d41e69f7606d9f1fac04744c3b7b8fc4942a846e2a3649bd9416d500b9895455fb6741ed8ed4f426f20ab40d8ab2e6cf6c63f5c290fc011768b317bde49753efbdfd12583f1ca79287225f9c3d3ed0c4530815e4f5e7ed78d14aec0d04142d0ac0fa3bb5d73b4bfda2fe7103a2ab40672abf08ef4d9e537b9f856d32450e2e41d9277be62ad0675d1a530709f2747f51f17aba10381fdc70c626bab45d51166b6f6ad978d2dee",
+          "padding" : "3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "27a042625f50673fe9edab9aa2fb4c60dcae0be2e8b75662bdddec7b1d698065510a193e17981bb0b1c32e46d237e15915afe2e2d4890c09907e1866095c19763524b6c8d2dbb7814ac5047f0a082f7fed4109741f4719e12ebb91f27a3cda71e80ec8a7f6c882ea5b3de3c9f156cff033a0d3cf787f9a8a833a29d0c96f0b68ccf55ffc62098e21f0df1832b70878dc94ef1a3260ec2fa56dd3c4fece5d855644d26012f56d2af85a0771d61367b7e266577e44c444347970908ab6cfae42069e2ceedf63679c2bd03697957e287d156b2717a416f0e4ad96868e1c7b80eb84e99778f670ca39c15e1f901def1efd824ea5f7bbe127dce8c8f53d849fe1172a1254caec13b10b0612e72d3f8e7206eee2620e8e3c0ea176deb4b1fdf5d8d37b57af553cf7628ead74443f98655b5166cdc08190d7e3b134d71c21bfacde3e4673529e6d8a9c7a8b419451e7ecc6c16a44b8e1b3f2c9d1c822df8f2b51d8fd027074ab2d1c52d16aab0a266c7d9ec03df7e631052e67a28963bf8560e89326168bb7c8f5a152f7ac54a46e88190c62a938628950df881a4be4136a55bad4f608d39ff37907a6f99bdee065e5ccd2921f8f1a2ebafcb336fc6ca96a207a5a0a7873420a2ea383a5f1c604c93b6c0ac69244f05d54cab184c6592e9bc4069df60d3cbcbf16729dc2f3f3540474890abef29e1b21dee8af0386ab61784d7af8d79c",
+          "padding" : "3051300d0609608648016503040203050004404fb472dfc43def7a46ad442c58ac532f89e0c8a96f23b672f5fd637652eab158d4d589444ef7530a34e6626b40830b4e1ec5364611ae31c599bffa958e8b4c4e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "2e642b8a5208890b52187729c43a1a308cf6b846ba1c2fff152ff4a1b051753f14ab035c2f3f732d5a9df7c2cb732d09f8147509bf02df8ad26924eeb04dded8467b66c5e3eae384568f624e55c81cfd8e3204422677ab62d919a176471b1fa8bae44bcc8d4d116a6afe5ea2773ac52a24186d6a4374171ce0516bba8733c59f38d622b7b6b7ca7ed2123f7f46b6c06b02f4c7506c46327d7cd908ddd503fd42be3cc896008eb9202bbd7af08b9908121a8b27fa44747217ef72a8c549444232e9209ca1345ee017010409527faf0722e3f13641ede5730639bf560c8a655e2f96cbba7b2811da8a1fc3e5125c92754ea7b823f394998b8890602b1713c2a4d352066e01f55ea86fe3da71f9119300d84874b667a6538a90ab24aec2bdfd9ba9a5f0c3072d549653b16f4a4319ca398147e6753f9a048b5b250c64d599115bb717ce85c8370df62c93da7e10fe705a12482e6f25e6ef1f4851a305aa4dc21b08791885867fc10c5503a769a6d6794ab5a9cc5da68cfc3546b0e848ed8629ecded620ee3fa6dc1236b59874916c45f9c409c9889bb85d7b289ee5f45f6d33262dea83b32c071417d3759cf650b9d43468ff0c2e922632e8d73feb4c55fe4233dc1f0cc6f6e522fbc9e9362f1d69441d56ee5f3252dc0559339335901f539ba274cc3640ec776a12c5c7e5c1cfeddedccce36884ea01071c2bcfae7ebfb5b874e6",
+          "padding" : "3051300d0609608648016503040203050004401f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "811dec041124d3ed9d5eaa9c760ca5756e42525687d4af701231671e8f7f4448ea9b9eaacbd9c99659ee3c175277d30cdede73e1b332ffe41b8b737150ce1f1c67aa6b22ff801077c4241a6ff4af8f4db9462c70c13e1da86edec4042a70be9d08384d932681dae48fdb83149170472564a5bc68cbe952c76e476b99c8a5a1ecaae809690a014b28224ddb9c9dce0d4f6a77fa2888a71f3aa9b5deda0af40ad0464d9adbd26fde242523c096106124048bafe824f733b0af480056de2314f5e27db5aa3fd15705777e14efd2ac43beb12f8f496d09103ab377971cdd45e9afee8baa874c23d3942ee3a505bbc3901dd4cf55ea8a30fac0cb754793fb2d8f4edc29afd51b99140a8d03aa0614169428205fcd66c1047d3366fb32f1c2b1bcfed8ae23580ed254c3dcb127daf16aec1892714ee05a1ceb4e561a1e9c8fd4118ef8cc9e063bd86c55d28b8acc9d5b4c589583e7c6b78fd518d8ca85b88517f10c27aca2f0bcfa54ba5bb94ed5b005e3d871b68b86e96adf12588037adc97cbef59c05f0d2162db2e4cce41227df11eab5449d612be56ef6fc522452573340d4d68af0178d4f19db6a0ded521f1a982bc5567dbde2036f74d6d67b806ccc7c7f70d3092c22c9c1acf307b751d994fa5259a5046668a047afe4c3302e908bf70bc6b55c39726bf24ceca809357c623b89fbf0eaf8b5d18823337e7e0245d865574cb9",
+          "padding" : "3051300d060960864801650304020305000440aa0a2e60e45f276fe3aefe9fc07c6f2435f143ee2afd895e4809384e833be66a6396c839d6f7db83f37736645454c6e63712b27e70edcdd7440e1275235070c0",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "Legacy:missing NULL",
+          "msg" : "313233343030",
+          "sig" : "47dd8953f9fef033d428958a32a4b30983d7eb9950c3d9acd167d50d9445cafe2bd02f44db5f7c5f6f999d3e1cae5b7458cd3220034132a3195481fbe5ba6b878d85c6f8ec53769f28245dacf66b562bec12399919265b3ce99c5f2217c3f5b33228a7300a0e87174675b379ffcd8a048467f04df2b5b7a7b8e3b8ffeb2dcd408a9363891518988a2a09453e98f7cd73aee8be03acb0bc8d67f7f944b62a717a7a5dc9869ac3d30e7fdf68cef439eabb8220c6923016f00b353ce5209ace5d387a7f50dbe09a7d2e521f1ce57251c48883229dfcea220e31810aff68da93744715f0720d49d8a5f3df2ce56d8fa42c02300729e8099df6e8d39bcfed502a5ef910b024e09031e141266e5493e64202a77c661da8c363f713b78247d8962b271e6ce968810775b6e76b577f01c24daeb7f765e9aa0118168103a51870dacbb4144389cb0e221e6529f9692005a2828e68936c339c96f7bcb4ae61494d03a3ff46adde34aec671b5aaff2fb61dc6011f53f9dd9a19bb6f0180ed90a4ed44ec0ecf97fc50c15607d1c6e42d35e36526f3a39278a7afa2601ba7610292bd6f04bff85f8c4f32f32b42379085b461eaee65de85ef2fbdce1d0dc39120f5670ee2ba5b12902878d2eae39290909dc55d64d1d6b03cfb4b144dab9e7bd8cbfe8500576e1a9f300818abce002ffedb4e8f2f0f58eab36f5c81929b50578d4ca3626b87fe",
+          "padding" : "304f300b0609608648016503040203044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingNull"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "17ac14ac21d38aaa857542a9d871f7d81a829c39aa26cbe7db722f68e4397a7c758b11a0154edd42e1cc6b64047238ce4177558a0caac2a6c66136c8347ba058d6aadfa3630b4c44fa7205e0b8a9582eb5d904cdc7d25e5b9fc83bb4fc5723b3171834c07d59876f9ac771ee66ee17dae152dcfd86095fcd908697008ec1776536724d9e4322b6f7cfa59949a0b9be7990ada56722e6536b8e1442e0f0d8799ebb36e7881ccd52ddcd8a8033cfaf6d3e2a5f2d5aaa04291ab11e48e745c4de3fcad3120261d01eca03f502b69ea1d5d6f5556e9a198d663b05b7d631dc975cb7368b8f34fac47c621e60163914144b2e98e2f993606f1961d2f176a1b1eb17e119d48fd2249889a89be68ac78a415a8752f0425f1baa1cc5de9a4e0b51bed081ebdb538a70be96cf7519eeda55bccfa7ec5fc82acf88036af913cd8b30f182646d9f7f02daa27306f0ea2fdf436a40bace578ec2166a4080c7cef4a862804820020d9bdccfb2289c99ae61ee3fb3b3a9d3f6df672c4690e8c943f2fe23b5718a199439c5b2dc65b63d37e00440fbba51660242550484c94c8b6f504b0bb4e2579f1f560042b721db7d2ec2ea175401c14899062f9022fc0d8e4775c8d10c63cef61e9c649f771351b94620a3305f2d4b681c11089b5fddfbbdd291ccf9e1a997c1b2e6ab3cb1e1bdb428590ced534cd4da5a9548f3d8a6edc20139115d459853",
+          "padding" : "308151300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "15850012d1a5af88b5d1105aa0aacf404c2417de3dec04484cac687f6bec531cd569074e5c44ba15b27ebd131d018c2a4b463ae029bef8295e89c594c23ac9878e6d7a03276cb7c0b5231e887fa7e0fc3529c11e2580e329e65c669c346998d687fbf7e76b3539605753c3cd708dc19a072331d77290d810311b23a76137ddb50737436fa31f078852bc0d546364a28456c4048bae337ccc0fd8713c02713a987f89f9868cb64658ab1b8298846bd36b8efbbca088b6489d69a674aef11191c3409ea5b6428c2d847833db1563c77727706d2657ae8f249a75e23a1782024f23383330d11f1b91ca7b0ebfbe3f4a5fc6b2d37210b16049a2aa61030ed1c15b5d2ebd1a0ece36de2f53b36323a0eb25d4f77ea3582591e13f00e836a87a1fd2fd432f074fdca1a27e97dfb62f1666277bef1404958601d4e6b8b24125b4a86c9dfb260c3eb84750ba00930a1f7772510fdc0b265efeafb5de8c2525f5706fdf52a6e813bdd18cf683dbe94a6df2464366707bec34cfebb097b2f025011a0c4b5f263d30fc0c67c6e5a65f2281b463988ceb9b072718802a0a80a52f90af1aeadc8fb290bcdfea333a90b55c1a73839665df30f5b42f3e795ff1f57cdd7edfdee1dcbc81155bc3be1e264084ee3d7af4fe8d9a5be9cb2692674f1f608139b9707dc4c4b5b6968d4081236946f4c6ed2c8836769a03f9e87efd1c555f4ac1013882",
+          "padding" : "305230810d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "4f7ebe74a37d53164e8aad17079b798dce589d4b27878e57789093081e1fd6333871fca7943ad1444010f8a181c2cc6fb35b0729830fbbe3313551d51dd443011fda09370cf7aff65c448e5270781e1483291efc6f6fedfec81ada2f141fd436f685d28acfd7e2a01ad2e87030e076d8a93c497bd986654409c427c4f58ff7bfb9937cc068230804fa78977fc7649f31202437db9475db9def4e9b8409438c0724b9c05f3ad9f5ed9908ae3211367d465442de238edc8c2ca8d0e109cabed865fe37f6a4994651bbcb4d0af61e466808be729cc6978d1c08a1332a21f04aef0ee77e62becf11590b096704ba67219147b0881a000fd06baecb87db7549a74e08c17f2c1b54d93cbd43adadcd94fd116f7aa45d6e595d9ceac28d5ea23847ae6424bebe2d856f1c5605f8c88ba0ede58b90382e3eacf64c1c153174732061f4c80d071bf985946fcbaa362049fa86e59a72a93781a26c0f52f93a80e42d4a01fa4d292911325fe2cd70fa48d7e02ae80ae50bd37a2b23010cb8805b26a6415c4c6d265b3e28196c54d65cb67736378b00551a44da7d2f9f345f697175e4d5628f61998429312045f2baa16579a8511d9b4656979bb89babdf101ca9b81d49dbe0e329c9104ff76e290f6182e96e729884cb8dc3c5d43818508a19f462f0b7e4c790ba7601ae40d41cc6678a8a6eeb694d7e2c374397dca9ebc6a49ff79ca5463d",
+          "padding" : "3052300e0681096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "a9e80f11d11c6a1c07319788837939fcc55b76cae1c7338e5858e56aa250343b3a3b2c898e0e47623f4f3cc1fa6499ff7f12bdd8d43b4c811c067ba6739958dcba6c849a7f1dd924b12a6442a6bfe5ea60876452b86589a904d71b7b997a1dc4486bc1b4f2a9776948e0c3d1da887c20be126db414566425a409577eef6969836bb84afb715ff8e7f434505503193ba9e398bb7a15df0b132bcabe98d64e05aef8007b9acc87b1792283468ba77fa8173585411da87308f3715d0caf957f44b05f5fae579551a111288bfc8e3a2c2bd41db3dd741ae3c70bcd9f01504174d9117dae1bfae2f38b0391a377d230a6dc246c552b4fe41c7bc4e797daaf5dc5b421d1b5e7d88c69c5d5d7b4dcdad3a2a854935c01fc7e44fbcce85e6419511bd3191c973c6590e024dd21e46c0a5144e71b4f7166f4bb69455f59c6e617ee457d0fd1aabc9f77b56a05397cceae6c4a7dfda5758e52f6c94a8949d426e6f554b2aa86767d32ace6885f4c63767775ea2bc925325d9fdf665dbc941d6cebcc0385f590ba36100e6848e309d3d2e2cd0523fa7ab95fa871d78510a978a988c34e10204f1d669a4f78858fb49672c13e9f489fca236b913fdf075a7167d1e27e45a6b3614e55f7817f191cb2e09fa3c98a6a77ad0330385af0c875c471010e33a8c1633a23badc03f7046a6c2634054892d60d5b3da0aeb3f14282749e7e5e62c9760d",
+          "padding" : "3052300e0609608648016503040203058100044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "long form encoding of length",
+          "msg" : "313233343030",
+          "sig" : "8abfb449d903f408a10718ce5c72d6160d662b03cfffabfe52cda027247d2af8ac9d870446a8b657b496fbf8d74d9d8e36d396f2e0d85d3948404788fdcc02f5462be06329efd901f711c77e83014ff3a02751ba8f3dd28cb2f30ccfe3a958ef2945c0f8a3c6d331e38a5c6534e71612c3f0b45dc81396410e4d55c7d31401ae7c7a1549104c718bbacbc9623637705a2342f261c37bbe35ed30c64d87be17ac10a263a2cdf82947b73144d145f8711693edbb51e707f1bc75a63ec875572f6f1913469bd9e8ce4f7dcb542ed3c5a61e82f671a39f69895f0c360233b0613c73ad683bb4d2b7771c7b7a24ffec537d8e9382c0b1a274d96eecc6a541e6a7a8115cb07767d7ff40bf1266df4b22bbaf49c8f1d103a3b9d3aab33bfb05dfced5b1e04a842add8f18a462c47363793d707f4fd5fce6fd1d2be48faf532523955adbd22d7294dd66e5c586e90a59be612777b3e66139a72fcb608329c297cb84134f20e55622d6f56e9653877042b1532c143a2d9c00004a5bb4355eb290695524c38a45f97a0d67eb4d1bb487d3967349e25fd4dd5b1823a545478dad20ee4dee931c6637ffca4f88549ead5f36d86e799ee757cc555f910835077f273f5c38c9508e8d1a932169618daf6269e2c85676c515f3a190dcdabb0bf1c748a385fef8bf108cd716ec09cf2251916ba42c20d67f178fd0853d40a90327053cabd5d8997f",
+          "padding" : "3052300d0609608648016503040203050004814043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "b053f20b91837472425746c5cb3c26f4aa24bb58482556b418aad3aa6df71b9f67fb66855b83ee57e7a62aba93167d9a0aadb514c7d9f4c6e0000fea8525aee39ebcd59017fe5e58ba751c89daa976c158d9de60192230c0ce85f832882fb3db671ae091c886559dce66ad1d6ac0a5d1b2ebf2e1c30d88c46d43f9ffce192ad1cef57a7f0c437f6d25db071b74b49faee3b9732e9e0c7fef58e5b9971277411fff636aa2393ddc82202319f2aa5b2d14024609310f9c4fb6b8641504151f07ec1db8f729ecbbadd5a1d21969cdca6d4c9e7995de673ef79e95384f83900303c157ac79bcb681d2601e9b2f97a9438cef3a8ccb72a740750a2cdecd1b1b0df4a313e912701e82d76d4af9c8e18ad175345ef59968ea8c5dc62a8afb39f52515d6e8527902a03dab09419208636a3b0eeda8148d2ddce169ad3389776e10ac3a88b1e57f0f5da8e12bb1339f1cbfd367b221fc2754c185fd52897deacfadfa401eba9d55521592311ca3441c4228896a09c080443f78144e3e5d8068a946fa0d30b2187cea28085913ac86051e77f84873ff2b150455fc2486edad521ccd0b58a9055b049664d1156f4eb4ed393bf73a5d3d09cf7d163b4ef5df618dc6a57d2983024b779eb6a3331cbca72094052a8621d24d76db741a9f57dc42f41712b474cd8ad90fb348a2646f456c6ffd8a30657e344e57bcf890bd0a2d199bec9e2d5be5",
+          "padding" : "30820051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "4d8feae269696ba5aa750a49b64e7346de9e11ce331a3c7bf917c5467bb077099150b760541fce35521073fc68a5c638a5884fff577e97f0d78faab8161ca4c766ee4cd89e26d8b747671d84bba1865fd133e51a7e81e8986f0c95400ecb58c8b0af8aabc9ab352a675041e7bccd972c2be01080ad175c76e431ff670780e4b63d34aa69e3227696d8736a6d6fc2e20015180a680117a6f04f8f56836d907fd9efe10a7fb5a0f57f6461fb527494e9678568e168a83ad61b8c5cc9872f27a80e159f8547849186ebc43a54c41bd49c0dbc48fa2ce3781cec1d6623017035cf7425d7fd8a8562d3ab36c9e605738f82b5a77fc65afd217963e710a1e3a4e30862c8a8f18c97b095f68ae0878ce3cf1d062dd440764e19868c5b98f08575d65e0b944ce83b35028da466051d082ba66c2650eaca9ea9d83804f41437a3ea43932ddc217fee2c59765b5e862e85bed19e9ba0de41d64e518dd1c7c2f2f0b4bf44b40b26eeae0911d0c63b1b2cbbf3cb8e24a1ec6ddd70b9d442313e47fd36d1f1624d071de53d76384aeeedde697c206dd27cb1d54e513621351444a4d139cee2fd04ff760d08d6aa949fe9f2c2ebcecda4f8478900503eaf172a63d4d6deeac67b3b880cf20f8472394451caad83af1e8de2e29c0bf904f288d74b73fb330fb3a50b63ecafee8ad9701361db09a1026146bbd0ffc4f0375488e5a178af304b6301",
+          "padding" : "30533082000d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "8023460b5fd886c16f15c0a31d2ec5a0cf43fecfb5a5bf4c9ca5a13e4c076cd55483398a20920138d821f1ddea3706ce3ea84df82a1542e9905f89322462e818fbd22873176ef1112d5bc2d8be0363b84dafc4dfdd4f09a694469d0c60133e2f4563a8718f0666f3d137456c2a1b644e963100e43b038b0896bca1775567d9ea6f0dc112918c2a5049c00823652222109eb6de7ea784e1f620666d61ba1127b4b2efcbd184a2300365d04b4724fa89a915d59c62903e93e8aa2b5cd04f6e1713de76335ae34ab98e2ab7c8b2da8009da54124685b2ec2688c4cd324e0b550c521274c848799a24fc901cc8f4cdac2a83d702e8ae0dbd1cafb69cb5ef4980e39d6683ef62454b47d0234bcefd2a9d93a482492a1bf80da22c8f43c0315b81f845b9597f855288370dce9f3d4256573e867d9fab46e5fcbf419f7f87c8ead3beaf9ddb345970648a0ceb2a94b487aebfecf020ca6b2950619da60af583abecd0c3f35fd449f20de3c6ae3ced3d348019c60295d324d68ca6be1071d336658e98d6882468ea8086af6ec66777076425bd708a046c259a391d90c1c89fcd4a8012de03872630368419d5d71dc1d77d0624fc6c29202c60cfd4904a1455955874c8fea2ebd940215d8978c5d23cd40cac7e99575b9b536eceb3351dee111e7a724798039a9c0bf8b5e671060e1e497877788967fb482ca6569472b6a4fd195dd1f9a7",
+          "padding" : "3053300f068200096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "c0886e882249dcd81dd653f46d96e5db093c4216c375e4e7cf7317254f978c846c11d34220b4460ab2062309d059c6314563b5c128a68c46da172fc9f07f569d5043b328e48a18ef5a59ae15b8368820891fa36b883ca71ea14632985e61181491e71b607962f2574f95e9bf95eb22370babf73361b704cac83c814c5c0597bd45658fedeadd0d5d87671c7f67f6825d0d18618f337e4d5e55062f474b242a08fcb1831916d46648ba55c857c897f3cb8868b19c3b6179966fb79f0586020e3b6abe68621f48004df422c9e9a69534542ad1b5585ec2f052768a67471357c0350323f3ce372609621692c4714a672b42138f274cef4a6d47047218576e9fecc506f5bcaa2339383972aaaeadf7f1efa3e4ecf1ae300735d27cb919c1366eed82f2eda833154c96eba7a5f9eb7e45504dff0320c0a12181244f47303b774b925fc3887259003cf5db9adaeb956d3748aaeeaf18e0d67b000076210470af70074bc7633b20d06ed6d3b9f9cf5868fee480ec2f80fb5ad0d115515249b4a72e256ae6caea187a89db3691de3d63bf4c6eec37ef2a4df99b9da6c47cc4546ce39111eec9983b8d352f7d34e7a975893beafee92e0c5b50f40f91e15be4f8af8c4fea1cc8c176be238bde66e9cc0778ea0d8b55e4cabe379e002904e1b5ee757bfe632b4f0858f42e0789d57deacef432fa528045336437ea1752730c72c9345eb3f7",
+          "padding" : "3053300f060960864801650304020305820000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "length contains leading 0",
+          "msg" : "313233343030",
+          "sig" : "33ebb328fe4a82206ee3db40d58d9e3081b53aa51ef33625afc2d778c8ef56c174bf40ad2a20d3524675269efc92579bccc332b1b1af5ae33092a3579d21ac756a232ca4c18f6a5e73ebb1fd0547e18b6bca99cd8dc715f715fc262461f587b2ebf4c2f7bf41c9a21cd45455d492d5dfbeba588cbdc2ad00183a3dfcdba9ebac02bed5425ba71d0890efa95d0caddd9c871cf414f2357ae97a28b48b656b27b3ce1efee9b29114ec551c2afb28c4057451d52c8ca1050444bccc8863c0b8ea65f45c985264022a767d245d3fb2d677b7bc56007d55ccc85dd572d2cf669855e38b41ea69b75f2a6f405a55c495daffd75ade0f086ecff34e3b89dd80627041165a91be8d92b58a44664c32bb7baeb5b3906a475e5efd680a85a0a3bc0aace9bcda1b5f83239d88f1d8f085149c3bf9b4dd972444d3885f266d4b30bb5ff239b05f2addf7e2e8b6588fe46ae137ab7fb9e795a37bea74766f79938b0d56d2df81bd3c7ff79c387909463dddfe36029275ba18c7fc7d2f50a042b4e2a65ecbee8b89f99cc2a5e45d34e1d4d42855f2d36a2a8e2459ad564ac9bd83b87a5d73e499cafff57c3742c652fa8651ceb10456b3673eaa564e4d72352e7f4f24e15a16ba94e7673f9c584cd9a12670cbf0f1fbd6764e15544a179e9e1cdada1c42ce8ea189d0d4bb9a275bc3102a180f440b09dfefb355a56f0c74ad80ab8954c6e35767",
+          "padding" : "3053300d060960864801650304020305000482004043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "5113288772030fec77b5bcea9a599a9502d8dc6b2b13832ae23c34e4be89eeefc4cdce3311fc6520ef8164ac409e9c2a8f6b3f7ae54788bd652f73cb8902be3f0f95c64b7135a231d8b0ac9dbb82441408eae432106aecd8167e0d3ff56fedfdd0facdaf1478183fc35a522e34933ec07844f21dcf76ed0eef71559769ee6b5a6bfb14f654528e6e24cd3f331634e88862f2b37e25cd61549a7ce207aabf6550292c21b187a30707eb0a463be2bc8ca7532f1b00f7bf3e7b561f685c91f6492c5b728ff2fa26865e6f1bc85ad84d44728fb549fc9d1ef6cc0fce603c3fd94ba8bf795fdf1b347a9f5ac58f1d922bc7cc3754cf427287a8458d075a148f6a336a0fde617f771789cdaf7223a2dab71448cfe2c2ffabd43eb839c5eca84538785e3c6f1cb0a19e532b5efebbdab5b98260f26190a359c378983548497cd746d4ee0021f148a6c7b5ae97e96d72565521b9d9ea066a3bbfba1427d40099ca367e378b227616d3d679ab5832b2dc93d2eb4993ade501059cfa8b916158aa8238bd5e1cd83e4a2ee676dfcb85051906f94a8861f5e2679912df5b48ba309b90fb383e213a70ebba0964b00f7df451c6d60ec38350e260861f5b5e86af8fadfd09d66d8d1c4955fc8dabba82b937ddea4003f9c39d4e7b152c4d13fd2e54fc95cd3c3e1bf20a065fb6a78d161e80bc4bc00c5bd93acfac027c94d21accbc423c2932db",
+          "padding" : "3052300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "78e1817f4671f8c737dd45ca7d069a572d73010927e5957dd6f05ecede34487e8b4168e666305a80ead3f6f5701d350397ee730ffb6a320161c9743db09cdfa272683383271287908eb5a61b0e72cb783b4b0f341f042973247e525330201eed0b0ad881582de9ca70aa66e5171fc08ae22a89a6d5bf61f056ec02fb5207a82ca0270da42d44afb79f299782da7fc8156320e837269c9170dec5a767451edf0543361c5e5ef4f6a165cde8b0f6c6b6c62ceddd73bbab815d08340046579482e39a216d2dc8069fea722937ba5333cd47905497e512b904db8731a88006aa6b650841f636cb75c1b6d0be32b955389eb1f6ab5df19bdeb9ec19f090d7a46b1d45063126037b9f8f025816bc79d33b983cb576392ae135bcef786665522b65a6afcae3e345c06d551d5a122b305b413144cda4a58012d539bc7f9326f1a80ff70b5cde353622577dd23d10f75d206839274c771f2c6e4da1eb7b93c3c0640ebf7d3d8010e22a2d58281b8f811cf8f99725542fc9059228fd7e01113b9c3c8956badeb798d89606f481e99c222ea1918a26aca49a9ce98bd4fd658ded3c5a2c946643ff312d418b7b0da0e8d96ce91da8cc037c16280632083ee0032ef65532ecdc45589dddac1fab52f8ed55e35c261425701d9778ae53caf595d7b32510f7dfa8a7c86af4e358fe08b8efc19835e0e9c40dda2f1ac05613a26520f0ca5a126e95",
+          "padding" : "3050300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "246873df5e978483ab6bde2bf90219bfce3d2b6dd6db3a32d5f3da3808e5ad945f1dcdf1186f066ef8860c8854cc80ea794758a84dcf399c9ecfc54f184de1397d48b2a15432422c60d50ae42ca8203be687f4a51fb27f46ae5c8ffe354b708d9e7007af22b42a2662a61ce1001761f3935cd6649efcf5049e4ecc0dadf8424dc3be83a299902ec387e42a79207170bea5db24c729d811b6ae9480065809aa0956760d40fe0759024af27620c12a9ce2f842b429d005848857a904ed62cca6752cb5be1935c6562c3319d42efddd490705eaff46c822f81a28c6dc44dc9e08893ffda5e044217a6e01fcb0f6e55ef1a6393ced7049657d4c37b3dca55f5ed8ca383a4a72c3a6ea6f096d1cdb63c767d0c5f4900006ced15e0d39a1a6c2d36f69af25b2a324fe6568e4665b4ca9730f50aea9ac98bb2a8aca25132e614a70c20533cc0b78c1092988482dd42cd13e4a3adabf45f811d638915214b184692ea09b83975a5e0c3384c9b37db667cf321f3d297c0f4fea1c80ed2fdc218c0b7db9cf8da370cec25549f2a0e5be001df317f0d1f6f36b4dbbe4a499e5e5c004a51bc88435872e4c4e34115619659b94bacada61e7d3283bf5a23e6c548bd089a6553524e430285e2ee278768242952b041732fc7091260537b0801d50e01891cdadab05c671a39dd46db4d9988e03593f7b4002b3ed4b0ce1b0e6d5253c423f59bf6e",
+          "padding" : "3051300e06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "0d93eb247bbcf1003b3360fd8ab063378baf9ca43df1ed46aac03429ad1d817071522cc56dfe61e96db6ee747a5ebfcbe2ae6ca7571b17b9e8e2a3f5fd8879f167d3f9c20fed72058c00801a4058446122ef04d8685a16804ff91c0073efa697ba4d6639fd789a3fef6a53fa5eb062c82c974bf8206dcd5617ed1851f537643ae16b58e368456636b56f4fcda9c81041def1cfc854203af0a5ad581ea126bee84a4452c58602a2eed0ee082ef19f4ac75f8a7ba52d927f35a3bdcfc64183238adf1174dddc29c49ae4e1e3388fb08d28d9cbb379dd6c83903f096f395ad3bef4fa245e6aa7af5533ab6bedff2775649e5cbe89513a18b00ba726954ef0ed94865a7d9aad1e845415cbc19e039b3f7a7e4fb8a0b47edffd9c6eb2834331f0b636fb5eca42925b5dab4ba08078a71a6e44896abd06276f6f2e41f122848b94e2a22baf2d262a06498e0084f700ed1d23faa7b2ba9f7a71673f4f8c2a9a00e611f53c2095c43d9e78c1a9dd73cdcf0b74aadb47127a990ce7dc335ee26f4c13fee45a1eb44b99b2325fdc30e33fd675fb991d487efd478ac79c8d7a57dd210c5cb9c6fcc7be1a7e4a86f2ddde1ec8e4ac687b61231646d9457b4bac5dd5eba2eecfadcc5852dd2f1f7b9a14a0d346c6effce2549c9fe552bf1f21b99e5a013d41b5693059fb905bc30eb40b075ea8da092fab2024e6c03c4630f53e31b8e78be253",
+          "padding" : "3051300c06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "6e936a844e70aacab2a52b08c722035c1fece44e7da375047c8a0131072d4cd34598250ce2d953f1bcd3b9f010f6e73da16b5956b26017831e4937e3331c74f67de02623a0553e236e2f2c6c37b5ea6f9e88f2ccb33b6aa92823e23407998fca861bd2474c266070d32433b2d2d880dee2969b483b7b4701fc2eadaefb0954d17a2ab9ea94b050e84a71e32f319cb517f1c84a2df48cf8792fd4fe41ce53f71fcbef77a2aeb4b5f1214564e9bc238f92fddb7a231d154b65b1d02441e45a44c68fb775ecbad29b6b6afe0bcf37f7b28b9c2d0bf2aea540eb1a0035552147b25354f695070decab791e6a6f4524ed7d5991bb47b055fe4110a55dbff10c8d906c3b05bf012297cba96001c175130316a6080e9ef61f0afc653e9b0f82b7a5f07734865754753993c80b1aed172b2fc097d9cc1bb0eed9ecacab4f1954f454954db7bac959828a1b2e3e60f9a72280237d54653daf3561f65aacfb930774dabd34b52955d7f44cb81071bba7843ee327847e6f9190a6898f0907435595deb3ae9ea6bd6a11d1834f663fb9af3676f76a5e12762e893700eb9e65f4679dd2357b093285a96af7654cde9378919b5459c92f9d439b88cb3d9599204543a5ed89f24457c5f43f0afd36e774a23642c4359d1dda581cd27aec0fad4fb2554058d37cd5f517e3f0e9f71d9e80454f8c201144d966a626afeb31aa36126c115a33496461",
+          "padding" : "3051300d060a6086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "89d47254637f19d578cbbf89ab9f8dd5d658411d763501e10dc13a73b1898421be0b28352e2c505c3957cb65d745aa6dec6227954e7d7f9b6be8ccb98ff67f5733efa8b10d2041b862d2123a055291bc3038f9abfd340eac2e2ce9e4a6ede56feaf504903e7e8a2b1534bbf774cf56db230ec03be0da2299cd316af26c3e2058d3551ea3319b38a2ed142c8d806a0fe308a752277e8061aed64fe252464d94d60e1ddba421ba48262073b114566b3c9837cf643b8d168342624282dc20272dd5d92fa3de55fb1edc0079f4c2f63f2bad399323c3d3697e48eb5497289bedfcde9303e1e8de42f45e6ae9bbe94ce1cdbc1e92755ede9dcec33f49e711d0120df200c0dd6747801ef42e08e6d32902876bfd9a946ce2167a6575d4f9ff6ead1c320c2234482aead7fa90720b8115932cf243f49d3545e16e70afbec4c27b12dbab36954899ec927833a81087abb75d9bd854a4fe4daa1c3c6d466ffaf15fc2371789d64abef79ba05036b671311944179bce2fd6e707e4987ef9201a2a20531ab0dd163501892696166c47fc00e1060f5eddc64d79dcaf85551afe31ba3d87aad9c302e7c22bff0d7a5aae109f9a1bd95e02ac5c41bb3177a0bbaf4a1efef0dd9efa6e09d4cc3900c5a0164f6d391fdab7720c577b7fa1f6e3699457c72bd7ffc0bc32198e7ecc87a26946090c0199252a340acaf9dc5ed063b0b2ead7350ce5ce",
+          "padding" : "3051300d06086086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "9a4fe22826f1c64e9c88e178efd07f4ef95991c6c3e9c1cb10bfcf0a0c9d028cf05207e93edf3ac302b72d2961073cd1113ea5c8b3ba05a0e3c913535839884eb595ab189ee81c5e67763268f47fa7e313951e65a84165fb096edc7f1a8318e66d740c61d8bd9031d78189120262d2b9e50bf639a7bd70881e9e598f8f7d83de56793cf960971b60dbb24f3b6e8209d87464776e55d4cd6291cf8fa578a2d943fe03251898aabd477b748dbf12712f30b4cc5732826318b76bd638788d2bab9b178e12d28433e52856b7f466a155e3fea2e45e7d3e570074eb6c2227b0fa3ce6a3372f448f7791f2c7471a0cfcb098060bdeb700729a53e5236b5e35eafe765d672627014c94450289a8f62b90c4f928768372ace3658bd158f02a7953863597f0f0774a463125e0b5eea643f2d1049514e5c6590cfe2c28ec9ddced3c6185d5cb2656cea16506a302b65070eba32f8a873a873164bda838744a0d5a315e37739ee4c66b511d036661114d4a0443b2fb8ebd433abbd045d219423ece0a2d6d7f3f2e24b8a5dd88988eaa96fcf879eda5f01c26a19728f9ed917a6741448f9e3dd64b02c8eb059c13bebec0d6df85a44be3887b8b25797941d2252f8605dcc3f0e7d3aed45bd110b6c79acd65adc8d6d8551345ca8b277de67279f2315c0a19240bd57466bb6263ddfea47474420b1be82a37e2f65bec7f973c15c961d5dbbf55",
+          "padding" : "3051300d06096086480165030402030501044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "9f80040b3371cf9b2bcbacc068f03645a114b73c73313b3e146d2c20e8c6d4bcad24f0893bfd320febd6991379ec8ea796faefa3384b9289f3023eb4a188439c79ad5c501cdc0807630ee7f9617a4ffb0e00fda1674972eadbf57692f516f52b3ca7c4146694cad95d54257d76abd3a93b6e2a30114217d2439959d9df1d218b95eefe36e4a01456aae9311932bbbaa34aeb12ed21039d643524462c7e0bfdd647576a3ced6b2a28558230ce33dec63a5123666d1522f9b2e624574fee22827ecd7314bd2e2ba28cb5b0fffb0e78798da8a61b1b752753f6053b67def7b19936e35fd9a0671a12cc54d099a7db5c4429b39eb4df20ba325ebf478675e5532cf79b9e534a96129dc71225e9cd337207fc1a060734c132843317b05c8b0b2a253366dd340a7d65e61f825a8b96af263b351a13c312141c7f70794a048c704294b152a918e21c1546b0e50694c12fa1feb5e999b2076dde418f2b3a8d4c906824a9735f80f0914e94740366fdad81a02911cd40e1a590a587dbdc31d15196698b8f1d658262a5d88752a0c102208f4c24c0e61a66561175cb71b3dafcb599ac327ecdb72bfc4794568e3ca5696e1d0b64039caaf2d2808d9f528d9740243d781359f9b4b9b68244a381ea74023f8b5c7eb770ef189b1c2638fa1234ecf74037ad0f6f03d62bcaf10df7755846d8d1ff31223d20b0543f39092e40d5aac96e3c5f58",
+          "padding" : "3051300d06096086480165030402030500044143f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "wrong length",
+          "msg" : "313233343030",
+          "sig" : "7216b71f801c5c4976a9db1cdba4262f4158e424644b9c9f9dadfb3de7648175ed1b4f57f2ffa25f6b5977153d059366e80bb07619ec5d9ba865cdb004bffee65b066fc285a4829891d17e502337991baac032138d85c6f0b3398e3029343010fb7ddfa6d9e444022cd4992918a55e5df7bf0604120d9adf25b30eba21725105077cbb6b142e00ae97f03a7ea943f6107e4e7ac8c639fce407f3a335cae69a960dd423a511802e8d1fb25f7e736a49d8ebfc4cdccdee4168726eba22246f9f21ce0483e6f07499d6375158a7761ffefe81948b59d47f0e9a45a8bf104b19536535d5b315fa325341c4c199b3dceed592b3b06d10f5b8223644e7e85287038f71cff7302ef5ea1cac02511e47aadff53010e8bf433ac804df5f0c80f71e580f1cfba783ba758b8fd1f62a6278eac81a798ccde4b15e3ce1909ddea724ce9ccc674320e3e023fa0c35bb5a705bf17875ba623e4c30feef0e6ffdd34f4c303e042d551f5a83ff18120f9f44c104cf8a604fa9cd0e300daec6298581cf6426b9f89f4b7fbeb7de681c638a2873c27e73528362c32332b9cf7bb03560f30558d1fa0c3b1ad8b3478911ae41bf1c939b59852570529eee9f7615109f1ca228a5ec78258e57276bfba2ff77f6ea715c2bd0113bf28e7bbc152dec211d14ccd8fb30e72149bd8c097ea8b6dd82d49481dc8794b120164ee0d9cbf9a2778216abaecbf4fa",
+          "padding" : "3051300d06096086480165030402030500043f43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "3fe3db1dfbb41a675e4768562c60dc2c2ed3c43022b54f4c9fa8e99de6a93ce650984c6c27b7bc5524c0b032c9115fae2cd23ac7b03e496c6f4785e7045b24d226b2ac535b7eb605cf8b56906ab95ab0e2e6cb3e2b3df71b714c66685a2433244ed153a8f526bad60a530c97ea9a238fca6fc5aac295a257b32fa6fdc68f9216d8118907f282df1fb2085644cd8c51d1be9f6dfa9f3eaaa57acc75d1bd29c3a59f167215c90603e790c5658b2d7887254ff80630122ab5578083556351edf1cffb7e42775a5ef79b2ff6cad7a1b8f32a7704bdaad7d63844b7cb7a295155fd8643044c3a83f867d427511e352079f578f00fa55575445e4af5c6e42500d0e4ffeb718e13076d9531195bcc36333960060830496256702c20df4759c74cba389ad73001f166a3b6c2d9e69d2b3bf86a5f929c79d17483164d76cb43f8723cda7648cd37e5d9d3aaa5cf9d077a6f3a1135e3e62feac9d0a0d8c15d6cade7ed6d2b568f89f74d6892d645c89bbf1429cce33e525c4d151a0a4e9192fb6737f151d5b460c4915ba57e3fec3b537aed97ca425f58a81beb3144b5898e27905ae56539c97b9994cffdb9e4bd91a600dd02c2ab3c9d8c668ee077a2f1f58c8ab7d0db0333190c59d37ad615dc3029faed93f31a4334a1ea29bf7b53f3d9415b8b760891a4a649a92781eb0568d5442b65e574193f040af56e5d33d2e6a47da09b7bb8c2",
+          "padding" : "30850100000051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "34e1788aadfc237f7896f530426725bf06a553fad96003cf7f6dc90dc6ecf745ea1c6ed5facf0fed6a0b88f9eaea6895b6bdd4a6e79f114a75a01be620eb5eb782431bb58feef95956cfea2b5fbfcbca452f65ea049663639e996e35ef37c27987015ed3af600598543f1faef183199ceaecf01ef86b026e974721a94a549aff6545f42197df772729797f4b6c6dc7f500106a793993216d5a356104a72c880f8e55343bc4593f13f988834c03c45101a4c1b27ef8ade0b56c4df4592654c32289a706d7afd7095e7f8a7846d2607d12a409c67fff8a3997e4d6963abb979d51dba6c5be5e58b105738744acbffb6ebf7428ae4599318948767b40c831ea810f5d11cd3de09a066093205e852ebc663b0b970497c64081d1ac6a418289f7ac2eb755cad07390c553bdd82ff5dacd2937bedec7d84f820e054a3ec16ba447a8c25325c0f1cf1b8df93443c56947f5c9c8ba2eed73d379583fd6c57ecf4f70e1b899cdbff6c6d80834e8e88440cc8bb2596cb26df266544326c5a15b4e6fcd6f3296994ff3887898d95a0d32f92d179c3d1dedac8e2eab8e097770a0b35e886c2fe65fbf9766e397b746a2819d1e1d4f8eec4f7354e504310241bf6becf0b84d21a2b41ac6fa5ada51cde86b8151c409d642bde0307fc732de16476995628f79bf02295929e220e2a16dc17c6b271be629cbdd43823e0ac5a25c4596400b0b2f2a",
+          "padding" : "30563085010000000d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "40a14c4df726ed0f62b294f62573994e821d855a28d990fe600b7efad50219b2b2fa584ac37aacaf50428a36194ae2674ca2d6775290eda47cd40bc7b15a43f1f14293ede4f90c29c3a5bdd4081328d03d19511663d1e83dae82a791fda6a97d70ce80a977e4cf6b68ec832c24e4cfab0b0bcc9730d95395630bf4ae205c54cd45a1b818c83b6f9e457644671370753036920d62c2d6f64ded5f8249c79badb8bd6c2a1664069979ec38a739a92fd81114abf1a143a51af4a8895912e83b5c08a5206931feaed126374e870bf73e36203c9ed70028bcfb8965f2fdd115538d3cd603e2b172555c11347ab15caf65cc535bc09429fd0e5ff2ee9ddea121b18caf4d6436c24c56c4d97de567d4dee96daeadd310c808358cb1fbbf7bacd2b87eadd063e9bd10d6969b9cfcbbb7287162eb2a5fc904d53408b64cfd346a507f39ba6d8bab3dc01a12ebd753a7113fe3bce02ddbb47e2d4ded5e342758cb9e9113f0f287da337594fa3da4ec03b167b606f1f5cb42aa205f275e5187d166d8769d0d210f88fd956580ffae30c6fc637bbf16204146309569fda24fd38ef7a7ca5bd0f74ca8197d2bb9b2ef82f58d5e541a54190d1198a1a3d88a4e0331f1900f8edf2d31d6d8c74f0662ad92ec598a7fa27ff41de4951fdc4c353cb90caee871e725bda215068e41ed1df37f6287157deaab3f6e30c68cdb71e3257165cdd4c1489b",
+          "padding" : "30563012068501000000096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "2446322c0bcfed72abd95c57f8e7d815ada2a5a1d15f98c567f568cd033c0aec84af602fe7376a885166f611d4139dd9f78bb581b3f1ec373c474947c7751e67acd90c7c66bdb233811da04d5ddf9dbed9c6b560f144f6ced47c810142325103bbda47fcb5659688ae56e678c117f33fe01ec8b01de1faf0ff40a27c57f851e4ef399d8108c229471205a5d3a08a41069af72764842314887d3c141d1899926bdb6d825a0616a0d635c4ecabc4324c0f56418e7db0de1a7f94a9861ce9148f9da47e034157b522d60bec3387a659bba7d14a63d31fba5865d7a7b061d75f87be4bc830617c84445d7eefa53c5c4f77a730f7e06335b3fa4f5ae201834caa5bb73a14916dc4e6c577a0357039c8fcee155ac51f47b0c19ca692b73ec194d7db0134065e59bf784ddedb87233859e639fb675ea80ea4458b7f783b6c2de5bad3313844b4a7cbde66521597cf964e48ecd8f9ce97fe7e40dd2f3247192a382694f3d0ba5dc95d64028f8c0a11afa8708651cbf9d80438a0426424182f9b19f064ae7294d54baabe358255e258ea129cc81133032b73398942430657b796655a6d4a21e284425fca023f7d8609f80ff564e34d4919c1168b48322a32c6f3808eb977c7e696fe7f0709e5e1001ceb17233b5452fcf1f4b5939b4f0302ca90897073170f0a6efc3a5379905af1a813b384f3c850a69d700f0375fabc0e43680d847e53",
+          "padding" : "30563012060960864801650304020305850100000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "uint32 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "c11a64adfcc6711c6b80549a729c311ecf30d66ca2c7d31eaa2e7f7e867b3c3b5101146f4161aa11f6e44756215ec09859602051c7cf6238dc49cf3afcfea22683c4cef0cdddab1ee87365d9999445c083c5fa28234597bdb19b90789a84393c72aef4b7767694b3e0c09e62b4a2a864525e43e858e1e9a1424d7ea29a44f24038bfa2cac74501156e3fdb7d7956cae230f5d3efe726d817988351e893b3727643a3a78a484d91103a5c50fb80efdb8fd5852e9d63019c8d80a1ecfa043783c918d45e356c552b0957ac92841f3acaf38e725fd2cff798e941ca9a63d53c94a578c9e936140c2c0ea7f261c8cfe6376fd20bc3171b30fb386d9cad48a24fbf17896781d0c56d7635d9e61348673defc7ff1ddcd2530dd3b7d6a8b09c0c94a44ae450652b0954671ee78c93a0c5213b0e97dcef53b738fee913215684e4858a6f3bd6533591ac8988b91f1b60dcda60f17ed3f0de1388656589ddd78c5d61e40ab2280e7c4ccf83a0a6c0c0845b3036d55b48be0100f0945a86a3bd539f4d2421cd93a722eea084a839f70b21790a503a5c5c5ee89dddaec3fbe4f35ceb6fde832f281b8e2eba35d9dcdb0fddab11a7c6fc6c365cbc0eb59607e3dcb37ee8e15cf473f5118ba8727ebd705613a7a2ce2df80f21af23522c585d499a2503f11614a0fb7f2949f8e7882cac49e0fa077b6d5435c9a49e3f0714dd118709f95a27e5",
+          "padding" : "3056300d060960864801650304020305000485010000004043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "a79151876e4e870920cd837bdf756398cf9929bc47dd5d082916cb622c05b52f2d02406960c2eccbd387b722303d5de1edb4f0a2ec2ac82fe2842dc6b321bb1ac772270997594460bb14d9ac27c3fa7c17ffc987035a30784e0817b4a90fdbcbecddfcbdda814b2296b2fa976199c2cfe8e2567a56b100aeadc571b8172f05eabfe8e10b302fb3dca6079c387914430e64f32c5267dd41782fda4e134e691eb4455656f740048640e3bb1226d47f04c973236a2c0a864cb1bf0dd354f47df45486c60ee8fd931328d8298aa77dc561c394dc337b418d4c41040fc3f15fe72d3b6ef9d3c582c939b6a33692b8032ef32e025683b015c276161e526c19c3e4223e71460918c03c31496e8eae68fa97850b051208e2a989a8e53beff882484992fe9b5c47a4f72849aa8d7896adf4592736e31940c714f8198101d123b72c2715a18e8d58d2c3d7d0d3a36c303f62ffa1abb5f8ca057aa5c4030af66b931fc6bf80389d84dfc1af44dd69e73bfe22f76ae6c0da7f936f06f652a9432697a94bdc2f869f8ce2338cc938cbc2c7809a4000666002bc351ffbce64a860d7e00bfb1083c47a2cde7ba67ba5829769b0bd63d0f2277f000faec93e225234e3cdf1a3c41c8a327f67d41eacea3a7ba3dac55072429f47226d95c235857739027b85a9462e7a9906d8908e5c7f25f0efe596ee4c05a22b611a33580054686f6dc17e930a41",
+          "padding" : "3089010000000000000051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "18318a9ed077357126cea3c22f6dddd974374e2615a3b964804e3169121d24d7b3ad9aee6a697e6de7e85c76e40a0c4cec8c00b679530706408ca48ec12eec40291480e42638bd948fd55c0540eacdca1bb95dbd596455d48782a291ec35c2dbad742b46f84ac5a4bf6cc2ee23a8ca421477292a64598089a96739f905581f77d1ffac1288ebdc9daa41cdcafb517ab8b44d22799706903d9ef4d9e43756a7e0b146fee94fd6a899ebb6f46039c52c95ee5fbe3aaaca76f604f013749baa2d25127df4f358f0f8b8a0b90706925ff62deb6c30fd871bda0e40121f59ae0a683062dcf3afd85af83ee06a059f3c74c62c13e250f9ac7fbee4efd083d897db98b2f69a3241d10331c00eebf1c6bddcde26b45407f925fbb499bb52be2659cf2b6df5921f96f5d6d97a1ff80b4360135cd5e0660f08c3f4391d84cbadb483415a3e60730ebe52936a66edb549430de1549941d9442f0cb465081328a80bac3b4b68ed504e41af0ee6b2ceb087db8e6e497ddda5b0692b1d527b3ab9f5906098e62bbcbf39cf897b06df78c059b766f2fb17ff0434af9aa3d9a3b3b9ce8c0a2bcce33fc8ffd0bf06e4209050ebd175e292d2e9e4a36c702d6e7712d951cbbc516c2421b65b1cd9359629b7f772e410f1cab7a2c675d7c7e5082b09f9ed92f1d417523281a61d37d19b0f1e77d58a6956148ac20b5dbe28d8afec6ecc4e789ac08c52",
+          "padding" : "305a308901000000000000000d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "80c01d6f05ac1f8cea15e6adb85916192c365af6860d9760082ee6c15bfe56139b7bbe81865e9bccd775c0e805df4d82449dac42b29dcb7d404d5cb0532842572677fdfc834cd5fcdb0eb4be798a50d583b8d4ba730712e3f2d7c18c430aa7622b8239851441021fb08a9f98d51213ce81d0fb8e07ef990090610be6bd930367d76cd06835fb32cdff607d27f55a84b8ad7b8cdbab417cbc3072adaac5694c55a2e63a59a67585b925a56a4d9f47f0e9012935979ac75af96f7a40306363fe3bfdb428e9998adb3f2695e68cde1310212439abfcb5f78b56c5bd3db7b48caf897537d29c9433221359d080af9f8139d946d87ad5561741508f4ef400da92cebac640572c62ebd1d047a0f575fea856eefa057fac1fa3fc641dc8c1db63aa9074afec472feaf0082497cb37fe86fd84303b501f3e0346148635caa1ae2dc76f9fd7fc606529d5ffdc7a74d0ad667386aba017d510b11ee624adbc397e01b24ac8511bb1f3d1f74953a28114b5f26f0bd175f13949bdacaf9e69afc712f711d51c54c04db4da3c598c055ed786381c449265433719c26ebe442880f0797a254b165d0142527aef085a025b53c422e5ed4c4f8ad66455360e1344070c9ed3276979bcd210db43598033e60bfa302a02f77c30bb18487482d2c9b26447527d6cec876139379cc6b2a5df9f3ed91ddfd19a9ee6952ad4ffdece266203bb77a136a6de",
+          "padding" : "305a301606890100000000000000096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "7531710ce5187fb75a63038aeca4e24e4c64b6746320b231ecd1073fe8c8d002a2f8fa7debecb3a7a156cc9485dbb452d0c39922e6ec9fe0ddba0f068d8a3615a459c8c2787e5224034094ec18a744508590723523492be0c307f0a241549f5c12c8bf9ef2561c402fb2c4b1989c351c9746133e75bb3b0edefbd81d334c46dc9c18208f2ea55614edac9f01ffe02688e3f5831de580ae2e02b70e3925ae2f791af72e992abd82c5c79122d81e32db603b2ab19e484e5ba13e1c319cb14ad23e746e90fb2091165822a88289c45095d9f823196d9c62c4d0222c53aeb192b5f69aaff7997d88e76c923942e1ad889e80ae7aaf33a225acf23e14c41b649df7c94ceba04bb9eb53f19220835c998cc9c55be022f4037a027c0e25ed2ead758d8a305c35fc3e94f2c410a1e7d49d75e0c34cd01c7924cfe4f7dd76d44c22ff53e3f8433f8c18486c99ba7e25afe3dd2eb2484bf01af23c24e61d92cc0a31d1f3a60952020269e640e9b22788df23c28e8132fba1655bae5df03da2cbfa87a416d2dec19ec427a733f3284cf9aebe2b915113e0976caf6110577687e73d0882d6d6653844a22b82ccae942dfda37c669eb81aff068b724d2f21c7b0b1b44a6ffe1b7dcf0272b1fc3555956a5dd97f2ee460e500d011067cb2fa8f2b43e15f66ad48e63c1a26f00516f9914c05b45d0daa854ac7f5a3be7829f6cbceae7fbd558cfa",
+          "padding" : "305a301606096086480165030402030589010000000000000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "uint64 overflow in length",
+          "msg" : "313233343030",
+          "sig" : "197247a515fb4a12e874a4d4c9be95cee53782ef475577df61e0e70e3c3bcd5bd4e9867c0e5c9ee5decdedc53603f5aaa5b783d756279f4f74cdeb36a93aa51bf6ae3db9d1647ee62f6a079286391c0f691d2aedc1378e83de154572db611b61b8f06a84e93b94a868b7e6f2d1346acfe7e154986e49afe19f906b69f3e8f420b57774deb244d26b515e88fc133eee717786da42a166de47d7ba2736bda6227ec63d089a37064130d95e1605c848407b38ae9d35850a3b4988a22b867078a01fa038281c5f7a5abd947a9ed12a2121a74e3da6b2b50a7d8c24009fecdd7018335a1de8d86677a2a2ce9c57241b4805310608fe7a5e7ed9d29d46f99f63f89f1c4a5012f41ca1696383d9b2b4d19bf92b7d0302639797b4dc5576a059278badf1da475fc4731bea6d6277117d03f4939ed50f989095286d5dfc484e535f7929cf0191c5e006f8876527169a49f3ccfb8b9b21a9fa48a371da5960ff7b399ac3cf89a1cc0dd0315b23207ebfff886cf03422a01405dd8c7098ca926f65db7bdc8f32ad9146ac2cd81f743568207ddd52b04420a6fdb861938790234b3ae923e2f483bc6905ddc5a084e6265b39a443178aba79079e33e7d18315a86a0ac42d6ec513e3a88c0619e09cb25195aea856355bb3df00820a856e1730a61196bae28b89fc1914cda5ce0f97447c5817798516b48c0dd437953ae7ca17a1c84502b31198",
+          "padding" : "305a300d06096086480165030402030500048901000000000000004043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "15948a4c114544bcb6ede3a68bf71cc062eb718dd9ba2818136084e79852026a4241918ed4ff81739356e960493f83da7cb4ea536c2a77ca574b94b44cc9fcfe3a35d442a2d43e91fb74c426e94d9b5381ae2853a1f1f06f9c9fb23ce3974d7184b3a3981e0e30a88f8614c305fb6d98b6af1175f39457c02a8c61364238382cb5a4cd861b9a406526c0308fded92dde543e1b26ca3fa2ecc6ddb6a5641760ec774b6f43c40880d57c504ceac48d550288617012f54d803b21aabaeccd041f6eae3beede1ee7146e91ca544721ad3de98e7118e1787f8b3fbce518b2c238f9ab8c10c1c1f391388759015c25365ea57fe6cf01188cd262ab3795b9f00aea6b333a64e505afc9fab75fb7df290668a5d60b5c2d3c18228b9ffbc5a56ee04edb24cbfd4a0a1ba42928342c25b9415e37f564672e7c83ba1824066c21ff578a081381b62f7fc8d2776fd6bdaa7cc68bb6e9ccccce8296334ee42dc33cfb6f2e56e01c9df06fd5dc43e868eed33635a291cc509c707638cd2f09cc595561d3007ff0bb49cdf9fc7c2d61d464878cb0abce6afea05f2806e65c7914ef33f8bbda8a2e7766750b79d60c00803dfa636339093f72ee4fd062508cfddaac7a1e3e0c1a0601000e69eb09ca3445893109adb13312b9e4f604d85aee88378993420f6d88da3763dac4844d01ad76c9030a60178444652d3e0f0c1fbe43ec2d558e0871f640",
+          "padding" : "30847fffffff300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "bd94dbe35a23ac704c874dff24aab7514d82b17cb8eaa8a3654539d2a658307b4a4457259d985db4601beedd8e48036efb05a7f7131f18380a21117fe644c6363de327b73f424f45a98022315a02cd61988e359f1728984bd06545f04bdceae8bf8bda39cd67331ba88a88e9f24e6924e51deb29db461fe9c3bc6ad0d3d3093c2fb873ef9749b93fcad251f20d851e111f61c835c99b259130f4d08669d636506d1049081e4ebba38cf616628929c6c16bf0a5714eb91270aa3e28b9884de986075e308d84ddcdd4f44d47ee9cdcc95bf77ca9d2a862c5866d57b14b0a4e4adba7a520f0257340ce255abc2237810e5005e2194bbbb116f6c4d078f4fb2240f4daa732d5bc22347d897e517beccdda073b35ca8aa6f822a5a6b4acd20cebc2eb34b97e6c298e4264634017fda05db8efb65bf7cdf11ecd774124834f9edf6291a885e456f075b681e892ce86397e95b3a7c39edd39b8424b42f1d40210840d5768b39dbbb96ef0e5debf2c4bb8ad0c9a6e4b23799d5aee4115ee6a393a362d790c6b18eac3c32e37a0aa33b37cf986aa1c23f0ad49f44c303cfe304d799cd7448517d4ddc6b4605ce92ec5e15d76fcd2a50ba005e52925218dcfb22bca9cd988c3c703fd1f5de578d2d3b003a8c5b42506ac72ff19c553aac8e73183dbddecb88b75c78b2b56cd86b5de592b88279bd4608b38124bcbbca35fcdce44f8743e26",
+          "padding" : "305530847fffffff06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "b260371786cab481593ce95cd03a0ae66ed3a9b9e15f0a5a928a94a44f26e0c965c0035901ca12d09b5acfcd95ae770c7598f49e9f67eb7cf5d62722242cb0da595e2b5ac350140dac4eb36df1fdcf2298365527f876e1f798396b141f083b5de06f4a37741da6d8a6b227a8ffa1437d9afb73bc5eac196d846e3d7b209e61ef8122809fd21571e22876c8229e3a6ba49501784199ad8836838d2c28b90f86c570e25edc8aa8ebdc2bc2c08e8b24a0fa61b57fcfaf9427e6899b8fd10f2c263e3d2eb6981537bf461c3bc0f13748b937fe6ca7dad710c1706fbea0df183efb1efaa5ea2a73a61be57acea6dc6480db146a0798c2d50a310bf538da086305efdcde7735da2bd5e4efe5f1546602abbb378b1e8cca85507e6af865914b07f271305cacab66ebbcdaa4f9a21c66bae144b97e80aef5b75150613d46a2da399f3a51d4abe8d5959f96819820594ac4b8e37672552f58e3339b259cbefb000ab82c3c00839c265c032bacd25fd5c0c7816e65539eb4598d669834e2771f0fc416c4527e0c904e96ba50dd6786f6296b4d0de93ddfee864f8f8cd1a38c82ff4f46494aed49bf928721945b5e7c881549dd31b603391f1eab6d67ed5065d19d78159766a807fe05083d13986949b5fa004bae48252878c98aeddb884b079dc55b3771a67e294bc3aed666d25dfc865c7302bb012ffca4f146abeabc1eb1268d88a6faa2",
+          "padding" : "3055301106847fffffff6086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "6e737db7a2273a789f038e94bace3aedcf7ef5e889b6859e1cc75a4a8854773368f32a500e9bfabf732548a3b3f4feaf62d0c20a0b5f4f7731f2dfec63dd1561fccccf0d9c91af47eb064c15e7883a41c9b49cbff3ee59f612a1b639617be841ac2e0fbfc5ea482a4ed9a245f8ac8a0a2e624ab1a4482eeea3e5f1e13f120c23829ee33ae2b6e2d5b90dec3b6f68eac069ac50634ce52b7f4f8653f48e3e92d3874172eb7d721d57d782475e8915b44476415260bd69eed4f15c2d99e2cdcfc2b1ef5d9cef4b105d00efbadfabf26392b1bf7b4f0634ba970a87eab426025d71191ac78e28abacded9d2fb99cfdd3d2dbebd6807da96c540e704b1396188c0778c022b9d0ce92dd9f70bd2c96eab2b47dfcbaa2f2a6546764fafd16ade9dd9c6ac65fbbccb7906138ad28beeb4ad74d87d1e477ef60763eb312954f8c1b3eacf0353f39b0cfe7da589d672a7403fa5ecd0c83ccf8879087639cf704edb09459abad3322b0b6d5c01138f4b19adefe1a02ab86f49cd964ff463e839f2334a39b44bb3661e80a55cd15343adae57e0e8f958ce50ee1693b40c4a61c48e119d05da98016dc6f29d85940a64d7a5b605f51313a586fc1ef9930073ad616011ad6662ef43c85c99857ed8a5fd0f6f7df8b180fb1c07a41374ca7c0fbb8334159243f630b63e76f068da81c6ce07c8b9f6fa543e1047418c126451f528e5ce8f495039",
+          "padding" : "30553011060960864801650304020305847fffffff044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "313233343030",
+          "sig" : "568e9fe5954b9d77643aff10e698d24ca734bb988a6591bcbd38659638e58e8ba7d5b03a9114c9dc8cd4c91613a5e90e21a83ecdb08844a6b42639e1c4a2929754eef740b7dd21626d2a3d0f93d1a78e6402361ea406652d98db84e235858c6c35aa4ae83133fdd08807fba77825668c0f6e36af5adbb5422db4b5bde2c9669fd6973e56dc12866d48e132be7393a95aee49613df83a042c6ec389d51fdf2e38ac4f9e816eb3fa5467f50d5939481ede71c94577095d2f94fa1f09fcb2529e86ee0e9548b455eeb7d435b14764fd9936b0b000b6157cdfb1940ebcc4f4ab2470913fa9af408042f4cd09a6e32bea3301a1ab093ea930413c230dcc72360391b95e9819e4e245529b0a1e75511cab8f2d4d3c10c37f2bd1c2548ca688f3db84c274d66ef934d6ae55a48ea68e8b9b37214cfda51036a526f33744bf2ba5a63b7d8be0a4e6f503949d38bcef9dfb8137984ad9c87c44e7e79c00a0a82d00c5757823d2c49f4ac73f05589a9ac3f97bddafa208a5e07171f9b2e5dbb692bec4aa4c7122a72084346ea665b87da227e31d8773f49e086c6ba1d2cfeadfb356419b3c695a3634693f2eb023eba301d6218685993c201eda426a377310f853afe4f5eb0171d772089c63faef2e7341145408d7a32ce5cf2d1212408446c8e04bb5a2ff58badae4019a56a99d64c95daff600d8ece037f98d7c763f9b699136106feab5",
+          "padding" : "3055300d0609608648016503040203050004847fffffff43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "5fed965c75ed7cb7051779c004ea0cac049734ad8579394d660565337bc0f248057b24f89a7e52d3bae2a3defa4a4c8359c074cfe96bb29c63d7f183c2d5959cd7a5f5728611fed9d511ad078b7fd6c6661aa269fced9216bd094664602f537c77871d8cba65f149c600007d5e57804d2540d4a5b0fb109c1811fc86775a19f716174c5331e693ad53bb893a950afa1b5821c97dd70f7a2ced3cc2e9b1b5f40a7dec2d44b17c8df9f9f2d956d5bed00c2718e7d3b724af758ee6e1577a2f4bae9c4d47053418b49c4fdf3f94e5835774a432598e456e1e9a474d9c39434d741450b02143d365bc28699cb470cef886e5a92a60c66b1a11934127aab6b36e93c7635fa42d8ec014ee26e679ea7e3470e7836f3948bfee3505e0434504884508ba66aaa79b32be94e2545881f47da2132bfa380aaf5380b7d45e76893b628deaee0336cadf927e64c3acddaedc182b92280bbb505ef6e70eb53717feb00c9c29b035f2e4e1431409ff809678188b400d70227c540fbce9b17eb5532645e762a26e00d532fc326f589a831f5fae74addc916942cc1e5025f55b8500fe55f44199a625514e017551ee8b4ab0cedea5fd1c7f6f66bb03f031ddcb572a4178f3feedd1174d91fa2a43b82972a14cf5a207c021595176bad8b6fa4b76544d42457410a140dc871ceb0617b36b9ba8cf4ad10111f5206279dafc6685bd7f56c6b19b1a77",
+          "padding" : "3084ffffffff300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "b14d10f659dd8ee3065e57bca4e4c0ea28531de697385355944e72a7e877ecef2760764e1451d88276b6223f5a973d3b706443ae1645b0ecdb019063d176589aeacb7886893bb0ac1289a5e99496892e5010fc5e3625de66c3f0c3394e9485a405e6b2b448a3c07ecf6d27e784c5b271bba20af97e86fe909d84e4b9ebc8e80ddf8f4f55df28aac9d332dcdf547849167767ca496883bb6c546447753e7f35aa0f9daa9a4a293ad172b8b5c383189478301574d8d2f0033a982013bf39d8f041c510df0fab7dbca86d092409af5c75d43b39a83e52962c576e891b00fe1bf9a26dfc75299e61aedf4ee27b35d024e6d5f00f9ee58a5aae97b65b98a900b489800c59a94ad91b2e99a5dda868c46be99154b874e85621f683543f70c5433c06e76b0921abcb5431e1e7094e4fa4c9bfcfdc6a29eba44a28fbe44c082d510dee9db21b002521754b47f072fd9e074025a2cb928abadefc045a925926cf53cb9702c059ed8cc48e37f5a4a639cb7aa1152e6099e183a63baab5252129897f92e388d819a1067c3c870e3630ba599f2445b92c04830b24c3067cb8ec39eba5a06de0cb9da04f1914d817b5fd56d2ff1e2e37aa588272a665afb3474a0709293412bfb6a94c185d8bd66a7de0720e9a66ea8f6652cbe172c0f3af0b48c6d349c73f654477460acc5cd10d757cbba8a8d9bf7bf8627ce7f76a99b9223fd5de3f59f3e3",
+          "padding" : "30553084ffffffff06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "84b69d46718915c6e9fb582d7209f64d7d05927985b47f60903584f73d1652d571ec61243051dafa5d440d9ba7ee59813c5ed847386952769b0c0ebb9633b302597a3eef713499129440a20e9f4c33d982261d68b87c5fec638475c41982e84229b6ce7e4d2fc957e66084dfe57702d94a7e8f31599c49e1baf6bcff00cf1a422e833c29233a71db631f125b1efd05c472d78f1244a2bdb1707d6c9f9b4fc7022b47a9a6de1530966e49a67e0b6346afb05bbf77e3fc415a696509b7ee4ca8e7b0a9b8cf7325f7f5d4cc37ebcdfa009d33d285e4064a554f0bf8010528db507d9dd12172236e02616a4e8693f064cc08e733eb1b975956d1db53b4d267fd0567e5a913f083df1dc3053e2377f0f2e063b69c4a741b51a2cc430a2539c13e831a7f35ce971587b08bd90ac0c3d801e22ece2a673ba1e224d4bed142f8a6fbdb6bc2a573bbd0674a05958868d994cc9c91165bddb67d6f2008a6b78896a77bbda1d14ca1f9c49dd34ae43f1e85585396b56223c2535b49df276e7e25bd6d75f137c9f3bc6411690c0dcf9b9d0882996df8ba5a36a5178e0975e8eea0007ca4b54bb7f6914172370226033f9780614236c21aa2864306da344876fce8f24a055caf66809648b608107ab0ce1881398ee5b14c2cdc6f49521317b9cb68fc877b3b52b4909be1d599a835903832bd243fd0dab75b43a02eabf7c7c61efdf59a2ce2ec",
+          "padding" : "305530110684ffffffff6086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "9fb8c68e27ac09ce37068c09d56d3a4c354d5710945253078aa47f31c1e709cd2dd6d53be85eb45535c2aa0ce139d0dcecb093749193bb55d08d8af62f142db9a07dd178022b303ed05d49eb61e1094798f33ecdac79ae6f5726306dec7f652c58be5fb196c2b9479f0806b19adea15448d359987e9377f3706290e1e75237657310555d5cdbbbcef83dcfc90cafb1c98aaffd0c277c6b73c6e0023ec66136e60a6be3375e1140d87ebcbc11a753aaa679b8e4b2ab8d686d4954b0b85365f070a35d600f18b34151460227ee3b49d2770e07bedcff1cb69ccfddfbdc6541f3273990b6f3c708c0eb40863fbb691cf5cf8e19b87746270cf7cb827cb64984cc3be7b9357c66b00d8a90063d2af51c34bc3da3857f07eef270989fca58b09435d4b15335722fb5b214965494edd8a9dd0ac0abe5523ec62367d8c119a5ed637a97a507286705d06520e7df4077de24dce5e087bff576eae20f9bcc4b651a8630eb025edc7ea28ad2df19305658e20db4abbeb18b38aceab9c611da6ccf127429ca4d0c448aff54342431b3d99fc69010945cefefb905a4dc63def5c2adabf71bc9f02691b35bf9367408f4408c315ca0f8a0f28466f8b5a7b069ed76cf9180c0125e56df8b515cf590c1bd6d61f443fcbe584e0695b68c9b097c21e12c1d06f1ad0177252822474bbbb2c29b6f4810e749f71b18b306812525c42e727f92f1b949",
+          "padding" : "3055301106096086480165030402030584ffffffff044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "313233343030",
+          "sig" : "9d5698c424b9c2d5980a5913afc9fa988a5115e0e689b9684ac6a1f894749561467804d11fda1fd2e6fb7b983727f42229be82938ecba0e9c446bcae9f213d722baef08fe2386e490712104d795fe939ee7cefa78bdac9e63d23bc9a27f5a93f3577517b7607b432cd0b045babaf241c9fb6f2bc4abb0f710b7b707aee58249837fac16d3a0b8745713611082d50327daad96b57e8f9b256e72e0a32c11e439abaa21d1693de7e03016bfce396b3591d27d069616a8e0bdc340df8340048b0073a4b24dffc83f0d662a58ecf549b1821cf71f4acac30c1566c95f14f02f7dc3e7ab75f91827284c5417b47e3a513bfba2a8a34e15c253c5c4ecd87a4d470cffd49cccb44f1b94e0e43738e526e2fbde7a75d7984d317d2f7d0e3dff24d5c0edda477ce1ecde8e1ba73b84575fbf77d9dbe50112b9e130581f8587dc7a2dead3e2e52cd9ae558bb74243aea20fbec26c9323e45b30dd9cc6c68f1d0febd890920d89aa0fa1eab29b8658c7331d65790da9e12c4a92945ee54b38cb9b12795d74b5cb9bce70633b007a6051516d48018d0157a946a1b8297d5417d8fd54084ac611bac2ef2df20600c3bd1b6056d2a29c9d4369890958ba030eb25cfd33ea00455c682bd2c36bfd24b02a8862060feb3da9f437ced7faff2afbe5a157fa0ade435e94116fa17f67424faf3d01c22763f95c9486e03ca0c46527769393d47ba2daa",
+          "padding" : "3055300d060960864801650304020305000484ffffffff43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "183f3c9853c987fe83123605574c6317a7b6779047cba4e661a0b8b48a8d8b94a1a1fa9f3fd2b6c2d7d133d778d34bc2d9234c122e81019756f8ce88fb07a4ae0af3b532facfed257532e6f148b85111a5b8a005000e63f44e31113748ca045db35b85af307d5c5b6928c88395801d2983c198952985811ea64258ef4087c604b71570a54f9881c2c7139323d682e6e4c137cf391d9b91b1dd5370ae0d0cdbb24a8c0c376d6528381d1a63599e46e145ddf81ad18086ea2146969f16b21075cd89fb18f695ec6461e4d572be485838aca6d0e76ab0ea3c33484defa48522fe5069d2040260f55cb7ad9750a4ba94375b660ac25a7d71443ff8d3ef54d58e2a05709e3b679dbd4b9104763d386edaf807996ab84fe8006b33313c16958885f2fc22aefdbb28c34d6835225f03a7b18324a99a2175b83f198547e210d56b68a1d85315779df7957bf19c62aec044236a4bbe63a7d8e982b4572b386d3c85b18357f44d807ac218a8b8f75697db20800650a543f57a151c23288d0f5c9df00b780857f43596da4cbadd531f47017476cbedcc551fb1beb70f9f922d72a3cae9a467cd02258cf4cfb673c0cdcae118ae56c2d3b3892f1cdcf5087fa421588c09c9031056d297ba9e0bf443072fca124e53023e1d8db5b60d7aeba0bb1958002a72f54cbcefb740340c8f4fefb82b4e5dd57d6ac7bcf85f9f9d57ca4c1a60bfac4b25",
+          "padding" : "3085ffffffffff300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "bdeb05d5e66c9bf5f9771a973872e05adb613d2bcbb6748193a8d21105cfeb4e8ab5242e9f2a1bb2bc2e48ecd8669ee7d66f1a1a93ca824b1daf21b52b416bbba48c667facc86a10d0d54c9c08f2bb002b22499b5537351f5490b397bbf0533a34b3b7d058a50dafa7765b1ccd5afb89e4b354d538b89f42a5b5fb5eef7b4e5d8ca9ae40d46fb3c83e36fdae9dd08d282f1ecf5664d319f07f430ace3e321d215af9ac8cbec02275f7b26d89505e3a0d2668c8c06f30d57cbc09733d45bec55f2e877cfef31db7782b5de2f1d8d2a7f03b1f3e6c5fd517dab5c0145a8e36578a86eea7ecf9f3dfd6081042023f3025d6124ee9b2ac7b40a6dec3b5c2d29d46d834d2c47b9837d377c0a2e965ac248a84dddc9fcfd11ad448788b2b9a2aac2eb8cb25932eaf1d7c36529c6f6892980b4cef6759dcdfcfdc2aab28b10df46f39a1724824918669f0df2a9e7af87c3ef0602a56d09bad330f1cbf71b146fbdd3a5e45f16b701744e28c8821adc2397171554e0c6713355155065591e0b6fed94c17ecd47a9beba3da0c7a6d17bd5145f0fb438cc4fb4b53b08b16d239bf839b33a321fb030df77c7534c0cc0664cc0f485fb54745111891e92ea2bc1c3596bcbc3ad40034d6e511b7e9a3a7eba426bfde56926d05af2f98ba15cc3ddc26686d5ed5a3611ddd0ee774094111bfab88dbf5ad99c1b3f6edba85285e7478465d351755",
+          "padding" : "30563085ffffffffff06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "7755314b6e33091c4217c503165e7465cf272fa856ade2cd36ff9a5db7b8e846f15a39418ab5e681d038fbe89ab6c7f7dc8ff7bc57040844b0ca6905a9019e592ac6a523b0edda7d3f11e224da2535338e371b05f736b7593c37ff156f73003b1ff335271649beccd87c02d5308b339ffd5b909b005274a2a09c8a0ac425e7d51599158407fe05de1d41e11008143dfca497f70c0e283faf9554025fc0ecdb1ff83b1cfafcb6ca8f0cc6e97e3a3a7b62b00d61cc4c1401dfeae2408622e19d5c06e69fe7fc1feb4570d58a7049de874751309af9ee0fc7ca3b50fa6493d03368405db1d483b61486bf06e640985c3adffe3540883716c3f78281347de09dc3de044a5c60c33caf0608fbb685d21fae3213fa280ba68aab5f822b9f1f5afcd51832b59466a1212c92063d657441b55fc39cdbf16801137cb531fd23de3fea0ff01d5cc68a6804fb7115a7deb35952d9a0dff4d3e31d52af4b68104f85654619908d08b16881c68a52b9b52b4807c3b44425b0987c08ab934c1342bb5469646ec0480798453d5c4d471f1c2b59fd4e4e363e1b01e1f05e19157e2508e57b615a1016269effd29890148867f5cc4159dc409a3320f9b2124997da6fce481be241ad7d4f780786eddd5ea0ee7a0b52fe419148059aadf0b90cf81825719abe73d6f9110b01b96fcd5640f945870404afda9550926db3611d89b22b73d05976adb679",
+          "padding" : "305630120685ffffffffff6086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "bf7d4aacb76f4174b6787a710da30bcbc9115857b5170f6f98d4aa4e9f74888fcd341824e5da12c26d05612b591d4aec64c008db58c2710f450eddb1fc71fcef26ca5f3cbac2bfe53f611f7f0b4f3909fd763481cf4aa76e25d755e33c3e7a2e3d7a2ab8cf9d49d2ebe952f02637cd901e8784556ee49407a5901d9a1b6cc777b5f036650de693440dbec5b466efb84053d73c7932aaf18350f9c6acba1cfee21f874ec779f0e5d756afe936644459edc592e217fad93d799c9bff84921a2159eaefb9a978021e8bc1673f8e1a809797d317bc8c3d4ce1c38ae1e995cdc37c50457a16d553cfcaa2cd58e36bb43557ef70e1588bc0f6a4fc59604f921abdde57a2b05375c4ddecf23c5ac0cfd3465a364a6387327844aae68e9732b776e04330744296429200be89136aced6bc329e4715de6be8db047d4810c62bc19c8c2ded5e34e6cf8ccf000563b342b6ac2df2833232d12be0bedf219dddc187ecf1a61f994225f04eadf96e330c2f8dd42fb7035d6785328f8f2a575513eff22390ecfb93bbf9a57b97a4458e95bfde6c676a9b8fca765ead93cdfe9927e2330cc17061da5f2860a0291513361dab4ee5bd7bfa91af6857d1afc47faab730066ac9777b69804f491f0e2106361161fdc83f1e89ad18e61a1cea4fb128dfa681d1126bb3fb11610a7071965c9f706347b2c521f63c6e59dde524cf107403205e905d0eba",
+          "padding" : "3056301206096086480165030402030585ffffffffff044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "313233343030",
+          "sig" : "a63a208ccc6becc02fc5c8b433d34b4e380e232e4a03a0b95b8df2ca86d6a5c402852d3a9e3ca48f65af6733ebadbf99226b3522db6a7c851873822f859ebe6c12014ee9d792bacaa7b917c0b8408ff1eb328bbe31a36832b0729344a38a60ee140f3ff708b64e1af538d888345b5afd7015163f5749d2d025bcc9fde2da10a3a193447ffbb6b9f110da2cfabefb9b4e00bd151ae7855c35d3da37f03a17490e02416ea7b8075431f3280afa904df88fb8c5e4d3bb0a7f2a52c67134d8c81756540921c9ec8273983079c4bbba69e11ae24240725c6a4ed90cd8ce1311b7531908b2cb2a58ad8b49eaa208a5bbc67c4293d97d34f507b120971aba0f1bc9c539aaeec3dbe1f9a252e203e48b05eef955e0a2aec652d330a4766705a73f6c4edacd9da5b4fb5cbc20d39e9ed1954e2c80ac15f59abfbe6d8f5fffa95862f4c151132a2b11c4d1a7b615cd6f5c1b2658593c43124ad3d5da14c3d3923fc11dd0e797decae73ce25b58966c5d00e48fad63afc4204c52b27985f4b15012ababd9c901dc81d7f63797fdd350e748862e56228f7fc0516a93f3e95ad15c1d2401eccabe185a533d42630e94b7cbec2a200a59405350a5a9399d83c58dcc3a64429c6d9fea31cb1917aa6b312416bd19b9c6c6113b9f44d812d7e83690d5a9120d4bcf3caec2c7d1e629a840a50143da2c242b2a761193fdfa3d33707dcac7d09563da",
+          "padding" : "3056300d060960864801650304020305000485ffffffffff43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "4df5e7aadd429163a756b8b9d9035bcf3d61151fb765688dbb4c238a2b0199ee7d520bf3d593ec42660f28ecb6825f72e5a124d6858a33514fd43e1485cc06b7813c7659c68273e05a615d1f7f51873e1e2c7582882faa2564c0ecebd364fc7d6a63c0f2abb4dcd15a2688ea5450d9b5ad445abe6035758aed19604e46ed2cf7b3627278c86c218a5d3dbf9446d94a53f59e46d540db4a0f714defd10b310042a63f07132d36fb13ea731d1124ce3c6138d3423b44f7b7680ac8c78f4d89ae98a6c226d5c4e3a1f5d69513199c629dd008cd4a2d272b429060f136931c41b58384f5297e88f6a72d7b10d982c93c4757e4f86cb888e8472417091e9fc5f3bfdcb673063c15d108a01b04819c53962ced6bc98894de71ffcb211a4d5032731b98cce5854efae284e247d224b71de20cb680ab64f32e18a2165986ef45717b710f3b23b3265c547980044455f9bff029de7b9a750645975f04ac7992d66393645aef61896e372d4df1c40685e5abb8db4a788d65e0ead96d6c13713eb2c5197f0c561a4889a0052380166936ef096637717ac8650b1b821164e2ebfa6efb6a0443079c2c8b04f2dfd2410cde6049c511a46ccbd4001fca328160f2f499380f03b17ec2d98ac3c9fbb38ae18309328a3a3230d0d85d55e9159b710d357100b4673f7c1b73ca66e08359dbb260bd0c72d6e95e293f1c6b7b754729c90f5a5102ed99",
+          "padding" : "3088ffffffffffffffff300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "737fa672e21c243bad70363eb698965a67083b4abcc3576c66353ee8204e36d260b00e5efc8bcc2bf5d9667468f99c6353b06c4eafbf49414f4bc80213907ba5a455e65fad522a00e08ddf44137e417f8d4fcf61ac7f1b826bb38322a403e8f6d2eb4e76ddb4badec8c4d50944615930d86194d7954c686caf822dbe253e72a184ade53fd494873d38344ed2f41c09b3941813d5e3cc4827626d02d420ba50c46619914fd0e3b8ba5639b1bccfc12bc2017fb9aa679e5ba5f3f7fa898a977d2660a06339df5341ac63bd4595d327fd9f651e478f701d58312c5ef36cacbe9fd3b8f8c726a580639267c6d2f3aec161a6dab89169c50e68e116549da431b50c1b18d157f48c3a28d9f5c8bbe6e5ed535356843cb12fa06680d117d9c663c84e512c9500ea876a547f5b60286388bd13bafe446aad7420d67cd2a7925a0b46720ff5aaf5e9c2e7f8cbb8141892d2d27c7e0976913db329213f277a08d9a9c99317a14e92bf48f01443298901e57c287488dc4d4126aaf560c9423239e21052f1a0485d80f86b74f2748c0f192f416ce236a79e7c0e6d77d08a2869f49c3a5e73210745699cb677372e3afb14d64767c1f7f31932720c3ad0b08348233d757cd02a39025a9460c83e8daf8be59b6d9240263bf9cafce0f3656fd4f4b0f9f8ebfaea86ccef25b93a8c893789e6eea2d588815639c09abee232812b8b379b3248f39b",
+          "padding" : "30593088ffffffffffffffff06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "51729b157cf61f9dc88245a3d0caed291c33d738c416ddc9f4aa73fc17a2a9b39500a361cd0db72243e02faf129acc8378f689842db2cff07ad43ee7cbf3948902d847ee2d43773e8a86fcc3016cc879d238ba4d7f19e097e331225146dfc915ae1c19184f81be47a3cace37327b134999c497425671a8f62e6678530114665f1861df49e8ef9a924e40424daf847b6ae1297d4c554ddf327f3b22b58488d83712fc5d736bb11e807bfb83297484902e100fa9abd4f36dae6195239d4ba9da11dd685574565df0b2cd9b4cd60dba42f646d76315d2eff56b24f7ad5744e109148d608a0a130b278974047992d7c508216a134cf0dc73931c85fa130ada08905d0046c2c5d05125db1fbac0af81c3c465bbec62fe0d93f7971639335013e7daebe749c1369764e9ca158bd27624fd1ed440046bdc49a6c4319ebc41a813f5859983fa023f781b0f99ffa62aa22d77363970f4e9085e2d5e928ce0dca2122df17dbcb3db72c73f68f7b507356ad1c7b3c47500408aaa4aa8b9070affa7c7fde7cbf29c3c93d29ac2283543e0912795d71e21e4c722d6db948ba8c30844879b151fa7e1543c0dddca62c34461ac3220a57e7efa9b01d48f8c41c13612c74e47feccae95fd8e1bf41b6e4c5946c32a5edaca3b6a89793ce34f3579fae2a765fc21c3521d5c3d5b3d80d7fc29f92bf94127ca0e509112aa579d66eb9a015c001be1d4",
+          "padding" : "305930150688ffffffffffffffff6086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "5b652650b3d26f1c5b3451483c4dd8072de76b639b34ed959f13328df20289042264a64d76d711a7b33dfc0b6e65a8d8a1ee8a747b7e4e1511c53200742b1b54bade56fea7895eca7557a45da92aca71daefde3e56cddc12667a06acaa609bef750ff1efda81490ecfec3838583c1a4d6453cfac3de7958dc0ee4fb650d50d36ed7724c53819a53de3e1498a8fd1cab183a567417c217a10f028edbfd4c35b339c4b5aafd0c8e04a474b7671681b80e95c3474702b2608478ae3ed0a8b0cef33d8265c98db5758a2c5c2166833cb560a0b88b9d2b5eb0f38392685cf8591eee3d38d66aab0a33b88e00dcca04f0a2a5b47d367d93390305e1fc0a49e70ec117836e6fad4d7cd5492379a612b2b0634f66195529a40293b1c08b87deb03ced33210721a63bc534e7e00761789d49a27cb348b2e89dfa1c238d733dbecec88d9e962bd32fbed47dbc134fc79990d0fac4dbeb7484b149a9b08169ee9ab46f1c9297fa19504f8f7060858bb57852386063c04d5e0a1c4e0545d57bda9d0f342574f02c7e3a2ef88842872461513bd524457856b24e4c25ab3f16527e9c90ff98ae9ec263358d6e8c192257c0269db714803cf2ef8a3e6c0d203c939adbdbdef1e7d37633c54873ba6b6ac5a26e8100f17f8b4be1e64ff884c40befef7c40e7e810cb03b1e738e6628ff424c20d2ca064df9b92a1f337b9905a918bb948fb9e03e52",
+          "padding" : "3059301506096086480165030402030588ffffffffffffffff044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "313233343030",
+          "sig" : "b6302a6dc2c5c9e13b4b3931769ba271d97f0df7e54b7b636e3275ef69f06b521563bc5f5ca1cc3170705fb1800500e67c97dfce5d4986514f4e8dcc67c8318fde5794e1ed138f9f50f748a66ffdefc9eb0c227cb8bdb6b003fe63558c6698cbfcb12cd53b5f986ce977eda7be54e62ac9ea523fc38ca255998b744c8ff907a99dd8bfdb0305e0b1d8e79c8313ea0c78d47d6b76a25ded0da248502800ccb44b1665d1793de207e20fecd09152eef0dadc99d24fc013e55c983e9a4b3097895d41c38cc6e9c7034b225de5a03fe11bfaf4aa2f2cc290ba0765732adcb24796ac9a7c3e2ad159856750cc9417427ca013e26fe911d2a31ba8746da30ae717dfe866446b6b6ada2fe9a5b9137ab9e65e2ab8fd79d8ea8f55d5f7215e234fd5ead6c334ef3405c567999e0b3a540e9467ad17ad20dba6ac7de39c11545e86e2d973c39f0a83e15a62d22b628b4b88903015ccc5c2ed12818c9f22fc97a9ebe1d32f426acbae9723f71b86f7ac7b6fdaf7075b9fb14620486a218da4ed75578aabe4600f2a394cc6865ab2f5c35913cdcb7d7580285ec08389ed9d8eca93a7490098c89c720bf1af7e1f37889fb85ca6b4bec4d552784fff6fce0be5c62a79e6ccf05f048bbcd033e6c7210c1311c48876d3e739827ced4e8344b7477ce5cbe5f561ca32a61b1927d0af1419e75f383a5ea01b117bf4ea4c9e0c64052f2367af8b4a",
+          "padding" : "3059300d060960864801650304020305000488ffffffffffffffff43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "52fa2c3025e2673fb95953747fc989615f634d32362d365dcabe6dd1c37370e0c582fe0cd54245fb2b7a892f9b45fdd6ce6bfa5e630eae4163f83c4ea2ca9a43a3f21e8a8b803d50d0345ba48155d1af3f419d8b0f2e8da897f7a36f88f0420bf53d89f3c2618852a858be2ab5d49d5a79b1d7866dff1421deea7143f75c27d9caee5372b1fe36c8ac8f3b5b06f4f71525c88be369b7743a7f5e84abad148492c23f6dc57f4218289a0be3ba1db5cc4468173b5fffe7455f94f5c2ca6c8acae8701dc393b9e5c2c5ab8633a67e4094ffbe2ced9700af85c8b3c0a31878696b53510a991b35f00e1f7c8d17106615b32e8649aaee855e25305c6864bdcea7ff583687ace773a9d56c67df5b462995444bf414b17ad7d5801c60340bec5bbffd49bb69ef97eb10156a490fdee3c3695fc8055cccf2cbf217587f5570efa8baaa384fe2053530791434610e4da67d075f6b8c5613e862e743bd42dbc1766dea5e67f2dc6117791ba42c737e56b108d6e8845b08a33f905416726b02354c6c2c17b296fb58d90fb2d87902e87a80ebe83f72380c9d8c7c5c74dbba510d658dc84976b2122b3216eb3b1cf7bbf868b844fd5559a4ea0c8a8a67219634fc9e4ceb637e6afaba347f7cbcaa562d21fa7e9364251aa9600a50b22694e4b532638d56ff3cce3a232d76b756bb2b7b21e8102841731f923ed410b04b4efb414454aaeb8120",
+          "padding" : "30ff300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "1a79e14f144c0b349987f2d2bf07b860848a6cb5abb07b3229796960a81adce08c7eebc1b935c58db8ac1b9a0998236cb726f704005b128e9da87cda8b47e43881a67d9fefaf081cd1597a8095c935e5eb3625940b1ad60d071a5085bafd3b662a2e7dd23205fd4d5af060c52ce23a9e8566977f696cd1d941508db5af70d6b065c3ec1ea08ecdd5c1d2591bbec6d48aef425d91b65761e1cbc38ef4c0792ca3a52c62b6a812db9d6c4ceebabbdb2e1c125e419912b12ba64ac1c89563eb5e10e55798513f8b6068235fffe66ea13815021f2e4cff34d0501aa4a8023a6c1e2aad933f69be3229b161da5902979bf0e71fbde0fedd73b2674eec7f478628d45e2ed59b5b1321b9c68d8c0ec79fb7422f3ef9cda93e97212412c1210c2d1c02a2e5ee1b653b923fd5b350ca17196c821095e5e71fbf32577e2720593b5f8a7786907b2d460489bf25ae961fdffb3aff6cbad48b067811f192e20971204085b2c297f8c4a1f64e0847d267ba11486f2304b03cf72880c78d92dc33ae458f436b266749f0b472ed0371c5a7ddd0701dd2a70578064986ffae40fb6bcd9d9c268821c0eeba083405318c43b9ffdd1053e717c938ae7ca2df8bfb4a69fad029c6de8993fff2f4be3fa051fcf4404362341e831e37be5f48081a9a439f07382c1706956f3088da20806b5cb56daed9247a9c414e08748f44681f84bea5d835af6e2f3e",
+          "padding" : "305130ff06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "b39a0d5cfcdf3534ffd2b1f7f025b33dd949164a50acba28b30499c7c6a5ced79dc278df30aa2e1e8086377b9b958a79751f32c4804a435f237c74fcdcac84c6fc635723446196b46d44356771eb5e276f2c8a2e359b2cdf052c0ad7fb629fef23fc22c82c375ee52601f858cae79643646f77e4c84fcc31f50455a48095c1eb72a54b4c0dd36ea3199a762a885d20694e0875ea2d2237053086dd7d34982ae10971b6bb478a85193d1114aea5ceae7821cfca3f521d62c57e7c97b55dd5fc1369602f15874925745503ccdf131345815bfd16b386de391f32cffd30a529e9f210cb3b9efe865f07b50c26810fc7220089b193e51003c819197e0d4a4044c5eeac1e87288a091db026886e09ecc386cfc378b775f42d403d6cccab2e473f1936eccb4cd41d5b246870ebe32785d8f9abc503db5ac269554ac3b6286b3b63434de33aee9df97b817050b0b857906d6cd4cd4d07b11df2058bcf924405ce020c42d01ffe04bb3919deab04b190d1eb4906378288a6feb1a1ce01e8256cf5b5f8888d6ce18b093151ae18bacbe81c42058fd35d6fcd1f6385d9d7a01a164cbfeb6882c7d094d2f058a5686d64708c928967dc8c7115ea940f994416563115d847e1c3e15f63618d42af12b47ed76b2ec0a96634b409c80241abcf3a68b0e255b9da7985a966ffe8098f1af6c7fe9da64be053c7db9addeb142f97a3ee6a90fe2329",
+          "padding" : "3051300d06ff6086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "8de0ebcefe961be81df5cfbf212c86481071c93b89c876272597e9a1e069deb3677a8cc273c2f29233ee063611cf7a9d42af04e9e1d4a8c148f0152e7b7b73e5b6feb87e964b6bd71d7666cc25f96947442844a915425af387a876623c40f9760edd28bf2f6a51251db8b8139266a04b13258a6294dbd08bd1e9eb5154265d691afeaafc4fd1a386d09fb71f8c2241163fb84b9ac18f6294c3d3ffd10515532ec501998c2f73790e8e15075645061e9ac3109cee0b3b23e49ee7db31512cd251aecbd536aefa435b54980d6d2668812fed9516ae8e3e0f7e235e338f40d4fb192d126e19d709eb892c2e54f55e15d43e08373f0358f7ffe874d23596b63ef34511f59b692a20e386f410c2238f46b7d5d546619329790c8dcdf825e9bcd7a5251c650f25f8cad5eb4ac50735a04dda2fd03ad759eb1c5e1cb61f4befbe96f3bd432a4ac7882fe3f7a8aaec56a0d9d0ed4ef29b1332ad3c0155d3069de4b6fc6dd299c319ba67d1156549f2ff6403a087f21559d084ad4a0e6e99c55a9fe1efbb6cb1eba926673d182ca112a2d42ae8c402f24d54c4f8ecf0c2d5140850b3dcd676754d7cfb423c5c4da1fba0c1ee257eb22864b6481bab3228d8e42e8068993a87af19e78bde89cf7afc0643121880177d817f04523dc9e792b987bfc96ee4d5aaf4d18465a0e6d28f50e9701dc84c347302b7cee5fe7d048d07be8ee620a34c",
+          "padding" : "3051300d060960864801650304020305ff044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "incorrect length",
+          "msg" : "313233343030",
+          "sig" : "56c674dd1819d11b4546be728e25e19c23ff0529c927013e81d637a082b2d0ae13e2f6f9f48727f3b9e318d6f15d4e737eee63a7e0104ae6c115539cd26c4133ba386bf5265d2d9fc91997d3f262b53c311f2b54e75ffc716844d806ee30a5ab463d1bbd635f882e188b67b06210c2afca567bc47af50c76d1bcf703397512d30b67c198af319c2afabe343fd0366ca8099b4e8bf925bb01f39ddfda97c1f0f3bb7f62b8285ad6dbd427889bb4d29bee788ff4b46b29dd8ff4c5e5af919e61e5cbd4242a0e46a1af6a26ad99d8de39a1864501f3724e348b62445673a9d71b997afe2348bf8cc6f9ca262e81b955e5109b0258502ad9ac8a24c5e220536b99be690851169c3ea56a125eee7b2b374daf9f6b95eeedaf97f8151f618f1499256656afcedb8fefd1a524128068ce65c98162f9b5467fe3e41f73b2039d056745544d927ed63f8a588c820a8b45ad7bbf4cde144fdea2f241560199eb8ce45b1868498385677a13ba3f3db9f2ecaf8b55985a398a8c95ec2e02dae95d4e4c0cf864aff3fac920c1f12d7685961bb6e681b31e944d58ca22d64d38322d66d28e2d7db1bbe640df42a108daa275ddf2050ca93cadee433f3a65e88e7e52733d4a352dab1449baf69c9efa736427443c26b587bb0e359de5ddb75253615654b33246f1a035a23eeedb2f150704589e986a52cb8354697f33ea874079cb828be00d56ca",
+          "padding" : "3051300d0609608648016503040203050004ff43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "0a8e2386caa1122470b2b1c28bc9ff5e752726b52ec4a2205a45e8bdf28081cc12527d06ea5ea752de377078e2d0419b8e8da0ca5379b7d798c198e3bddfbc847fcf97baa52b2e8f03a03ca394d6e551b441d48a9a6cd005ec3c306c86b72feaa859dbc3076960cb5e43ec88092f2d0c69d2c6d55b0b8e955c514a420bd8c3d3cba6168f2c3ce212c8a04b534c8f2cf1b4cf5d5032ff5d23f74b332064a70e4fb9ca814269e0dd93d7bf7164361726d48fcb20820e3fddcbb480010b7589adcf19722d60097c2aa40ddeec5f02997e496c07b094f66f21288b1b6c634efc647301b76333c6bfe1934a038a5e83f0135d49156fa50bea7db362fe67bdf081f32de8418216717f63bb8ceca3664953aad3c0fc0629798635cbc193830551988fb7aee0b78dce22addfa3f4a830947a29fbe19464d0d0a74fb76237ed128e42b192fbd428e8d72c4b9ed37b07f800cc368e9c6aded9f1b1d45cb10978432990197ef5982290cb64e422a844e69a5fa9d96b854be009d3d9c223dfa4fadfb13a6e4c060308619c2d3682ce48c9b7ce29d2f0e56e5c95129f12f97b8857e0fc1d85480de20fea1db5f66a9a3eee6c085e1288c8a12fd0cda67ce1637d307a3852207184bca56b478fbfc07fa83b427f61320c6723bd877e1a34a38773f71df65b07619b94028001be0ddaaf43bb1f738c6cf728617bbb466161450a4ea79ac83d353b",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "78fa766502eccb06f5d328dd19237803a09beab4470437f46eecb745950c6bbb6e8c28213c1a108f472098f9b955449d29d33444103ec65861116dfacbb0d52e2fbb5fd3ecfa4658d34622e88d11fd1d1d2be67ca63e26e022de9cd14a0a1b20598b1cc0d0733015ea386fe92645e15d23360f9a654c1fec8da3982bc16d2848a62494fe24fe8c3aaffbbb0e017e42de8a886617d6716aca701a706344bb00ed486dd6c4976ce5e95edfe2616154975259ff539081f8b71dae6333b1bdd181cfc93bb15fe656a5a4eb964df55d1519a66fc8023dfabf02a59af4554e77fc2e391e9645909a70684f0beae65fc39b260ea86f63da19482a8286e8c7ee3bfc93fb7e0a09fda6f8a2ac59f7642e5e88373f93e242bfb2c1665186cc1223101df4843752cd9ceaf73157eee67a93d14ad939dcbc88d9c4e13a7328d9df5b6529c9db604770764355081f703030279a9f997dc9cb9af61e0c4d53e89005d664be47d07eb6bb4c4b5e79453f7afa2192bdc5491d34d9b5b34cd9c08c18a3cf9cd9cf3f9d13e229c8611a2fc583d22b0f3737f4f1a74ceb6944c0198c88c4b693a43cdfe353778a5f5fd792c4d165811b388fcc3e65dca3565131c522cf19e848fb2a38f1be44ae4f9b3c2840ed539d8add6f11a549d30255544e3e25a8b7db849ac3de562f8d7477f0fc58e26c89b6dca486b5bbef305ea1dfe91bf790124102e14dc5",
+          "padding" : "3051308006096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "481b7bdecb34d4cfc817f217c883dea3248f2cfe0e004d830b0a5e6002af4d94a52a7ef208df247747bc26f958aa82dde17152612005bf5924c79557b3039105238a66b1754e0dddeff2b399182827a5f24fbab5dcef1d8134193db2b7358269fd02bc11ad83ca74114e7d0f36e700eaefbce93509ebfc6483b177b58292646d16e1c66a31deed0c041884456f3577757917b045b9db6ca5a93c54258255716e022916fe656883e350d90bc59e11d0f3687ad073e3a4f9430dbdf7209fedf051b7b2b6ef4decc1c8bd56e3b6f38e0343567909282908449ceac2fd162bf019175eaaeb9c74eff24180e04747537a8e6464acedf96e557ed956104453c03a191830ee9fa23d5d8eed138d1e498a9fdfb0603456df099b1650d78ff836d13cf1bf068c8d6c9ca828b234b9076439f6ab2b4b778a1ab529d8a6d6011becb7cdddf11ac5cf2f24af50425d26db425815d7913e6f76b804890b13e5c01faca314a8d79cbfff018b4f8c69005b4db1f4dd5a2706f17d5f7558e52368aedd61117b8f3b3e8f08615396c6427deb4a53d3b0237946a4d25bc47e3f5ea0aaa5c569e37f755a9e0cf172212920cbeb31eb00a1fbf2fd55d400fd5785c5d15a52865ce512ade691bcbc27459465bc4e65a9cfb07ae397c80e0df579635ee74d0cd38fdb58bb9bd506269023d3dc8c8c5f58a3d1151171ba92b35cc7cddde54e383dfed063ac",
+          "padding" : "3051300d06806086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "27ab14c45501ca20e57d171479b224267f159104fdc8a76db33244e25be46d2555280c20e6adda573133dbfa5a3be591483f2dfefe52fba5e524106c7565642ba5c035723f00202b278e3c0c4c0ac4c2f71271ca3d55a41ffa111b9b16b38bfdf64a7fbd3e4b747c44802775168358110ad9df1b50608a1576078c13f71ddb9ef1654d433ead4dad38de9ef07bbc0ecc9f157a73414eaee1ce395141c9595aa51781dbd81fbf024ac7a0fac3efe0086d22e1372179532660ea51a593f24ef7cab63f2493f994e8836c47a340d45b04acc0efefad4eb839e537b0f9b30589adb7923a06464714dcdba351553926e78846e3662b0f8326c02efbb93b11b739e1993f4302695850b1d09b558ff35392fb6006c6cec3382c192da7ba5cbf5e233520b13b56c2dc231a607aaaddb3449c0673428bb5e43fd27b5ffa6c6b2e073d7192962d81289f3b6727095e5e7b3527c8c27dc1b5958a87f3d073880c25e022ac4e4986f2fb5f176f964722f62115e15406464270d6f3aa15dffd1203ad732c42d91b3979fb182bb4a5f0a8d1142847cadbadeedf2a8365981137b87237f3699c0f0b114fcb41f83855b2af879bbca68001147af3f226fe82a2329ff7db263972730521e405c9bf408f36a1017950ed2f609a41164985634330615811b5005261fa3774166eb5a79bdda9b3e6c5528f54589ac294dbc6cc2cb0c8a76822a1deddeb",
+          "padding" : "3051300d06096086480165030402030580044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "indefinite length without termination",
+          "msg" : "313233343030",
+          "sig" : "b01aebed848724596b962d0d628a4420f25d12814e4d5ae253b3a67ea1c9638b540c678a8ae83622c0d755206fe423c29bb3f46cc52ab963ad9e8078240cb96c36becfd2e69b60644b1e4f2183ec24e53938fe2720c4c78252b2919e178b9a53db4168a5a65534cc149e56b3e93153bcb7bb96be3429583da9b5ab2ae7bd2546cd5ef2def209872ce619a2c1d1f98bd4d720d90cbf9396441db92e41a045b874061a6d2d196d3dbe19e871c60cad31460cabb88b0c35873939ce29e70e8c11cb35ddf80b5c82a47a399890cc20eb32181f732755d4f3e761c070e88b6b1d3dc38224349d26a7c77945073bf70037cb184ddb893f29f06b6864323f0963def7652692957d2ae6dfa25979f516763ce7cea66f21e2a774a8cd1e077af88c3927f181ee599239c76ca063631a53f419497efeabc48d4b31124fc986586760224621f46826e3e7acf1e83c33a09e4a6ec9d36ed286c37c27629725bb318525ba2f0332743227aef14b42c86696a44400c496ada4270cdee164a67eacdf5a1252e3066c0775d7d1bdce5bd42dcb429bf355428acfc7e3d9d0e88878054da4b5b0dfde7f31454488ac214f0b484b2eb95419395d7936d0ff3c6f2cd2e0ec1485a7c741a766656b3275533abeec8d598648d3527feefb378749e622f97b9e5c068e222fcbca164bd1a5cae13e0a5e9d0b32e8b64bad7ad7cd17967b06d18b8b5e6e8706",
+          "padding" : "3051300d06096086480165030402030500048043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "bb673cbe9c34aa4e50653b50f151d67ed2c1297ecd20ae73a53df4fbb4987d51c3c229b0cc6063b220a0b3afcf5afaeb1881f1307da10a41af9588276b4649b0d023621ad0ee4df1fca2b4e7d1f605c587c52b8bdc566097a72f99c29cb8d29d6167731441429ce6f8931a331b44d33b691d044a7efbe97a31cfa22129ad3df7633a78f3859ee5d4a970f404be87b5f486e8006562d3312f3b13a934dcc48894dea5985505a917dc6976151f17a9818f6ca4ffcd2b020fe9cedf53945ba1b5b840a7291f449f1b42c56da6d229e9d48b0e51764cdcd1e1709ef7a9e2def7306e32b6e8355140220b4a5c53f38aba8d505fce60541a47eea7c7e3d8f2dfae74e1cd1725b4ed477a8771f55f51a50be57bb97f40329fde3a2acc3ec8d13f51428320a8d184240bb0af9ea0b67eb7d441ab63782f7e75e11aab72a7ac87e3fa6143c969b4ac80877bbb21e0b0c66be69db1eb46fe475cf6a1d5d46786cdd11ab88a99957f451cfc743a0928dfc5ba41764ab9154a8783edccad25f8336599ca5659758bb55f77d0b2ec2ef6f627047b7a15a82065dff9fb436fcfce4e747c2a0c52d30fdd3507835b49ef4158d77ad86cdc51293399aa7424369d2fc11bc93ca0c66d3d7a75f82cd2b0002b28c28cf3c91ca89b5115bfaca6d04a0daa82fc3d4dbeec6e87db394b67026b6a595b5965db12cdd8ab2ca1519fc19d326056fec39ad5",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "removing sequence",
+          "msg" : "313233343030",
+          "sig" : "94b660539810d7595c69b95cc2a59e20ad68292d1f381f639bb38f2f24f3ffeb81cebdabe27a56e33e7cbdf954bc00930de4afbebc7dc798a911efd3f62b2f6b8a3fbb71b94aab913d50a5f48250ec509a8a2fa3cc22cce006aec45697ef50672d44b574262422071424fa1e7a33b81df9a74ded09018072c9941d261e2751e173c6f32ffaa184fb51ad3b020b812a890fd650987d5fd374531535dd1c89dc52215c1660f71833060945a5e1a0b530a87b34a542549c1730989b9d25b0cda122e590f0304bcd3d08bd65b4f19df84d3755e993ac5a80f169797e16760d1bb4f714a762103895283b403b55271b4fdf0a8e486651a4a955cdc8e23f7287aa6f75f8c01e365d38fc4e783de00f05081399294b1be143af43904afd6d211d49ade9b78307281ffac4eef7a5624b9f867e113c30a686472f1af4663085eb8f65394f623dc029a0b5adf0140147900ecb0320bac5fe856baccd42eec8b5c9a5e69d2d6a42b00f0e60a6b9619b111ddfca6f94e845a1b8bfbcb4f6b13e52259852ea8475fb168bd8deba00a6424b6e54e1225542493a535e7a6cf01479da324f98c34403ee944a8e37f36596779b895d829b9f35f063723ec8ff2a423c1e78328de60a03bc61095d037e8a3e246e34e2e3df1b07f243daa208240edc73ff3d9b89a1db8086b1cc7fd0adbca26510723791afb390877222434982b8b19d566cb2f300d9",
+          "padding" : "3042044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "3f529f9eecfc1e50f2407c70f82ab4c0a62d7ac9401e6c239063d575b0e198449dfd14b8fd732a9dc562b7ba83d9bf6df2295927dc8293c8502f1db4049ad46fcf9996b9b3746a0264517b909e7415a9f7d97d0754b83de36d16e85e201666321df84177a862634f3667fa8f780c404178e744cf73a923f470e02411d452991822d6b509a786b48a89480eb559c5ca7a351c9a383c76f2895ff80bfad92b57c80aa621bf67963dc1924a3014982ed5f30dfdaa4429e65767bca3521b450c4f9c8a1c36b91a9652598ce31b3cd531cefe675299d171112d2e591357c12fee6be0c52b192baa95e951fd563c4471de85bb6cdfdcc2fe7e7219b8d0963a4d6d4d72a3e94f724756c198ca340c1e09bc418b72ce9954c625c1547589e45563ee79cde1211e0169e94514f9f27c3eb3f19ef78ec78d50638150b41b59d369ff44c1f5e54dc00961a05600c5491f558e698d316eb0b21074422cccc11f80ca7c6f6ea8942e198ffbe9375f1fa55103717b765ab0fde89c58cedd0933785565bbfb0ced42133ff4726b5d42afff53686da3348572eb3a24f6e7b119906d30f24b5d007900d7095e4be80097f509e89d630a931582e112eabfaed2f562e4cce3c121167c454f9043ffabd95cd8dfc1ceb2c10a5e58faca8a23f32c86aed077fef810c32cd7266080a8b0238607a107cd036414a2185ef4b0328c6b1023c178d4fab5de38",
+          "padding" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "lonely sequence tag",
+          "msg" : "313233343030",
+          "sig" : "2cae83310a2b413f44e68ca488b6d13ecaca8289e797786076bc63b00b583e373c48128d8500924bcf95b1d67fcd6961f2429aaad0e07a3a8273d164b8c9031d7b90bbda134ada626562d45c693c92847fa180af4f67dd87b31485b4a3e11aa188a69cec24f7603548fdb523c064cbaaee173cf45c82824c0bf5398b6339f55e07b66d0377ddc4282e3bf0bea5e987c556ed138bb66e3976288e0255701223cf93d11f415066d405aac2c330eeeabd84e7c7d022d6805dc854ab29f1ea6528762e40abcb4710503b44801b23473bc8f15a58f5f3cb69a0589acd129aebd2480cbd1c90018ecf36c4e2ecf82ef8076d8c8747db8cff0e0799840305d11ea2ebb36e4874d689622c223e3744356aff9e9817b9a8c0af82956bb11546382747d7cf8a9eb861b1ec6cfba56678b5a1581213898c63454db21714e2da0fc3eaf897f8f21ef84e8ee207b6c90a9821d4689f603e27827c0859a497abd9d0af6e7c070671c407bc3f864e600c43107a0270bc06585a6a14fcc7547978296f7b51dd8ecd43303ec204b6c83dfd4e731e3486014987ae821d69446b3578fc9862f13384f66afd807ce69037c5d6a388ebfa3e5ea5b9602f5e48abf21472838682e23826179b9c60ed6c5724db772c087e4f4a5109cb8eb90a70ee95779e89909ff47b7ca553b8f35ddb2e6d57049ede2879408fee0cd28a3444790544f5d9688e54199a97",
+          "padding" : "304330044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "40dbf72ca7d7f8067728e9c31e118d8899d71bb6a5e57253462a107521babbf81943428ffaaf03bab926e41a12da79961fec9233150d0af2d2a384d75f0c83ba607bfa485f6614d2d08879906fdb8ac9ceaf98bb2015af14e36fbbf3b381dff6c033dcb157f46da42fd89aa3d95208b917ebc387313013b3c550a906c0ffc27ca7b6fb8dba26b7696b36886800148d7cbc2ef6cedcd938a97a4792ee150cfcddb7d405d5c7670852b1e40b8d3bf3b4b74e208210378c5caa2071149d5a0ed6f2f8b69ebd8922e5f6232369fa2774dafb6b69254083517465aabad8657e550d7c36c2e2ae7788f1f2fe475c17e910e796a0e84f36eed6dfb8a3650d80b91d77f0442075c8009bc76f84a289b45768307f00f583bc3d98bb92e2cafa4703d52d6164ba44940c393e06e9b5d7bc91a11bc9396c910763aeec359d1a98259605edb643b0bee6ccd8f830daf123bf802fa0424cff97218ca54e5be6fa49f1c1e4a021d4e8981fede024c87b7f1ca2f3edbd3b9510bd8ccc90178449689eb261521f88d3a6a4e9cfd5b3a74d139297eaa0fb5b0fe39b0034881a11b2da1679e266cc636c8066fb7891863d885bf0ab06403066e2e00692148c9980a143517a1044e04709d38efea7fc7825fea19379356055ee0831d2dc0ced31070514fdb2c0bfe4a1ac1c5001166bd9b3939cb213d43b28e0825a503abfd138db3ea9d170e02f0236",
+          "padding" : "3053300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "appending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "4d8f1f1511d2c2f4ba2572e057ee0f73377ac09fca0eba99e32a346ef406c504ac40ccc3b8f89fc566b9ad43e62d1d389aebb2ec4ac35edf65b71a4d05d8b712176ffd3d0025636785a01f7710105d13155bffe7f2c128ee9580248655aebcb98bbf1410ad652e73089fb570b33038e91b1b898451cf8cd4e65eef5ff25e94e19acf1593ec99240bf3d839c1c01538705dc62f93709dc1e59d00c4f9ee1879d3454e68a205a83165a7726d13a8e47a84fc88ae0a9a74389bf1d73b89fc2fcfcfc2780c1e2773b38d3688b82e03c2298c3f584968afd0181b5dd6221ef2b0d2813c6dfb95b763bbaa68771029b1b19c77c75acd36dcef0b5754dd85109d4c86f593df46d2adc57238abfd2ac3a9ad14bc443a0c4ec6f3d2aa4133b1598e77a5990d456309245268ec6b48f876b1fbad84d3c20c928fc2695197bb5893023582e0403e06954c03a3748b1d96df7abcfe77d59b97451499aa8fb02a181ab68fe5a5d6380fb7a7bfc16e186f119b6ecd18c4a4007b72be18efa2ebb005430a405ea0cc1f2740c1b07ac0775f3b1bb25637a2142416588e043747a4303b7f7265a8ae34aefb7ec0cc912a81ac7b975b16651426fc0392b8850d78af728503a9ccb687249388d05045733cc2abb27929287cbb8963e5cc4a18fd64d167922decf900f39d1a9d745d995568bbc56a80ac21940a991e6211beb5fbb4a7857a4fb151ee92",
+          "padding" : "3053300f060960864801650304020305000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "6918ed68ef3e63fb6a020a6af0504fa7caf68d21bd87306ae1161bb6b6658c2e6d42277c9eeec6676d6273fbe9c215d9dab12e3aec042d663ec40c2a6ba3a1847d4f81e6631f40e1f1de474b79318a6ee72e39943ebfe8217c4f6be9fedf801ea50d7532319f82f0c43d0bb80031f589364b0cf93553dbbcbada10ca0983f03a35801af10e373459673b1bff8d1154069828762778ac146efb4f2653ac1d42243a76036d0faf8040945b41cdd1cfa4994d4e9120b8dea24cc862ff4c6fc7b3da4f6a1867368165a5e4e7d786f85ad850193baf614cecd9dd1035105ede78d16daeb015f1c7ea44bcd2a75318652bc91895b40d9538568cf033a590106d370c778c0566c0881609cf0f6235296bba81fa78c59eaf76ecc275904947aa74ec1692e6d35e715cd09c4a57bf8ef2fea478a30c9ca8b773f2aa7ba49af33260f9d37d72eca27f67abc14d51cd8f644a163d2996b9e92ba424ef1cc7f657dc7591d4947fb5a19ac5cf8372c0b6ea64616873a2b8bc2cbeb6eb0d58e106984a3691a588dca0e0d6fbfc071cd3c5e4c00c3b0b3c245c685cd1932c58770cef8bc916ac11781994a9fb61f490fc707ede0e90ef1f700800c59d113ca7a347a61791100c60f3eb5aacb168bce7a7535d57f29ce61be9ed75f2f02cae48e3637eab25e1e26c432ae7d94e40a5ac8b6c9117f12fc1ca3df21aee1160df775e201c9d32c33393",
+          "padding" : "30530000300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "5c3930a672c7bb3370704c2118883d71eec08d0373c386eafaae8ad29f6e34cd9052f2c532bdc2dde0d33dcbc4e00b54984f80844462bd222a886abb303fd4e78735c34eed7d9e72039c01d8a6ab7b8ad0d5c161d6d6a50e67a72b1bbb58fa03656f6860bacc01d1e79d99818e26793100573a3a86441100dffe2b1bec0028c320e271801d9e29427c7e48277568775fcdb84199451ea0cabf17b44474dfb632552f03118338100118495dc62df9fbb2d623bf8f09de14a03a18c0d5895844bd08c7c982fa966af224bea611bf7fa7a38e7d0bb788827ed66413ec962a8c49a30c2b01697b0246f812d484afee38fc3f49e34770be2e7ae6dfb0a92c70ed84bb516b1f5e26a04ef51a00f22c894507fbde0c35563e2c1ffb33e2847d16fa1c713cfd7f25245df18062c8c8a6d30c4244b01dd243481a65ab0685ba3cc6be4aabcebd7c8af3e5bcc7ea0c75e2f7955bc834d4f4280c31dd3ccf30dc0ae5ffb2862c8e42fbd86919e4f449f0513587a346a714699c4d1c99a28d17f4b1cfddc3a6c032113608e36cf0dcba19d743189f40a4374b66499b737d7f53bfc86cf334ab9ef9dc9e178098751e32471e9edbc00251988cc18fbd9e786290e523ca54907d3e3c6ed78c8217708f06a5bcda4e048d698453d1e0deb0d79b3200c1a7380289ab047bbc99e05dd897f48526d7fbff7cd0cfc244c991c1f962b6570c83e409b7",
+          "padding" : "3053300f000006096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "5179f20c7125d575420c85b0954d96a0fa73100b265113f301d91457cc901e04876f86603f7b5edfd2578fa64c1ca58ea48bdb7de0f7831f4f331f25548b35915167cbbfafa56ece7fae60f814c3faabd5101d82f04c80f53e3d1ae1a3ebc6e764e26676ea8ac34c64cc3f1d81a6343ce1622dde7b80f7d01f5906b1b05e6bb013f1c9ec9f60fd9a0b6220ad1ed6daf7b4a81371f3d80ee3a5f80bab868a70462b6414d700f60df20185bace77576a106594d2d5ce4b1eed154b85d779329d92b9187e181b321619e7fbe9aa711d98594b434f3e013eb64ee56cfeb7a70e0ca586e177540460512e61698035ed1e1537a635857c09e01c762809a8fc348278060b7b751c3009ffb9181703671546797a604b435625f21196b49d3cab7a4450c8bd339e2aee3a1ad8ef61e6643ec1037b593f66f9632a6fdd92cfc7edf472e62e386a3b5434a45f742461372ceb097d23b7b4f5d153d4cb4e7b692a736925e5110ad1a8ee42f992b96d4fc39ab47e14854913b7e9aa41536dba61de7f084e25609a08cda63f1b8677396778a0016445333ae370a3f26de61c607da3b1bc52dc3ef8c2b96b9a9d7261c4081449da088c6f02cd6f97222191a828dceb8d3c257ad60aed903d689123982b6d3af0b03ff17613a4b77d0bbe6f671c6cc04978714899714106892cb91fa91d912b1fd570665264508dfc1117b5d60e066ecdc494d7b3",
+          "padding" : "3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "313233343030",
+          "sig" : "2b822c97ee5998744c50488a0c2b47422c2ca0e13c8a07aeec7e42e0ef813077212ad5046b522898fd5d5f4a4662f25ebaa6403260ab5966599159c45e66e21e62b94f8dbd41cb760424cb8dedea67405e14bdf327065b2ee3844da82f7ae8a2ff4641b9a83ed6abe51cfdeb0c84022ef42570ca51f1f4a59956e43e3a59f132afaa4e872b1534fadd8568cfae195f6faf0fd4a405d5b2e8840df0db18ed8dbc2030ba57d2d49d364544dddac038628296b9937ff4eb97123bbba35fe7a32c676bc0292901b16fec329536eff1922a565b91b2b8ffc0985563a6ea245a20ac0fd096b227b0f3fc610f627a9e306336e42012ec55797a67a5c411c647e7d4f3422b3914ad8be283f33d654debafc3bedbd84bcac4fc16f70467c34461355396d59afdd13420a5cd5b290adb9c5d05e5ef3c9360c3ccebff652221dfe6076104e9acd92715344cbbec2b174c024ac06f7dadd34ca1d24750cb248bafae221e7d88750d3daf842717d567a7add339ef54b1b218d634caaca3a729b15561ac75f1f38a00ed34bc322e854f9bd5fb69b3e82062696e40602203f9e534295ce2ba8245afdd0c6028d1b02719962ff054d2e575cf33aa5076c75244d07fac155c3515a4ea9eafd6af33ad2d7536322f0e9ef91a28bf82e98feef675b50b223da27331425029a6c30d9ced424992b75d10c1657c0ec5c133f168304e34dedb4cda80128c",
+          "padding" : "3053300d060960864801650304020305000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "5294afb7d060306ba815a17ba743aa671114bb97487289a092183bd41373e5e3a0df7244688781af07d118e9f18818468a837e83f2c58252da523f8b25e61c96fa6ac97434ee553ce58fded689ee82ceab47b38f845e725504b2ddd61753bb9e334a607fc45616ef66b347aec5cd44b8a78968abc6bcc0a2a19c36324937fd1eb11554516806dede4075c86b86835a35c60f4bb482204d0b0855bbaf67228d6936dd1886335e85a59ea445084735368f76be5b7fa3aeaebdbe87591451d9499cdad26f82ec680a46587d5b1008b78bd99575650af8975797bdea912932ac9398ba35ac95a615ef6b51b141f18eea88a1aac53dc13542eecab714285f5bf2ea75d9385425784fcffb33128bbe3646e5be152b2000020bdd0d00e008e674d5012170b2ded848ae57bdaf25877e333fa1c112acee9fa1498cef6b353e5b3c6da68bf49f302372bab5946065fe20b68ffda400f57f82f9e0bb024e06da7370d8ff47c8cc0098cb365ae97bba0608d14565f83a73008a454f028eb818dc8f5ff2897ffc964530990dceebcbe3acf46151b1f1111d79f99d988e89481144c39ae4902effebba8799ca9ff6d51994d94c70eacf33fd5e8a5c38c72d2f1e282688d2699a76a99f123dbca741d83aa222cbb11c85ca1019da80950c0e00a31922aabd37f6685150df7ef26587feb3cd825d5b4801a46b056b2d9dc491790249fff549bae0",
+          "padding" : "3053300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "appending null value to sequence",
+          "msg" : "313233343030",
+          "sig" : "15347a7617d234e8c94d0fecb9960972c2c99ccb33d384967fb821d9138debad76fa5dbaa4af3672c773cd95c9f0349251a90e813acced8b37d99255cb6190b5beb3083c176a6e30a5371fb32e8e1b8345dc60bb4b642aee31179e81107bfe71389bb4c821357f01c2fa352368f4d03f88e4b6ffbb82228681b1d8bbc40bad39ee532f35e747c7962a2a2b8b862939c017fd16f1f9e1cb68ffa78b491af152559376397f59ea0d13fa47a101c57fec26152ef46809244a7a1518d9a921a2f07b76e5b0269a504bd7add87de023a323eb4fb32a2d36b05d3edc840be4b93300cfce30db29d3b7e2ccdac422423e6027a8de9cdf5d998bd04feb953cd455d1b87e7cace1d5ef40cf41857e2611cb046bdcf6670d548e76015f2ffc48f482ee68aa9c963d81196ac8e99bde7e0959107e5646de07a1c44e99fd5ee6e2633b541c40579779baa2dd0448ef4e1169dbc7f328e59f618e8084212f07869d323510e88d19e0eee65784fe6b4eeaa584db42db2587740a6a89e746bac566fbe8ede6aa3e494db5143c5834454c70a1da8a66cc7382292f04102713132cf74f992e4690efea72dce8cc0345c0ce368671deb564515a43925d858f4e04d99c681195ca77e0731dc73ab14c1994a32703f7f30859a542e949cc5b07398246a2e428fb04cff95d4fe48a525384c9f03dec4d4a3220e17d55e6a2b2c241e83c76363a327d8483",
+          "padding" : "3053300f060960864801650304020305000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "81d45dd2ed7bdeb122eded3c9d8e2a9c0aed1857483764f86e8d9453ca398e159886710558cfd82594b82726c95806e364c857aac2309f249c3f9272e2842f19f381ba9f062ba12163cec808a9d2f75f01d3760937e3c795d3028223b29ebc6b23898205ce286fc2c7345e67644db5b5fafc539a4a07f8da447815204827e53421431e978e86f61c07e413ccdad6bd8353cb0b6929cab0b309f88891ad9306046835eb04e6295536bc39f95d4023d326b93896217f4f5966d7c297dc58940652c46af565871fa0af03d9445357cc1e62ee9019a3cf0709b395db776d69063a028c04ca1a1430cc85dcced8d05b42698304f674238394febf532e3aa281ea66248b5539a33c7320e6c080bde47ee1107b107761170ee18c094a45385dde9def358360114c7ff9b561901646f2872825d63547ea3dcefa9a07be2b96ac269e4065cdddea77b8462478c981d0ef19c0bc856e00680e728e9189674fee43e2ab98b8b43f822b0d3194ca8e7df40ca9b8c795848c9f4a7e7a7ad8011e07a1ad88322c84af0cc1b979efb2c53bda8877c0bf7620128dabb993c4df1f6a6b254aab3425b9ccef47eb04c20112d04d6089ab2bf67b1fa9e4beabca33f882a9075dab810dbcde8dca885c897983159aa6074e022a2e2e4e3b679452ffc04bcef7f267111df2e7ea57c7bb593454924c3640c37487b0d3a967e56748400c856c6530df8ca4",
+          "padding" : "30564981773051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "63bfae421bea1bc841c4c55761d3b902663c575777e3a4ef2231406600c6055f138a97d8e52a67b1edf7d47384e32c56ca0e9addb1f33e425613a4449ab1d511ec58f9b03cf8ddde8113b943148ae6456590a81746382d4622f260adeaf217434315e1ed44f52ee89e705b292a641a72e25d6393599af2d77524f720996c233540751d9d300ffd467acf58eeb1b3af0ea9805d5ebc8e6f70ed6bab6c5350088ab1d279b4ecbccb41a34a3d7f366df89f1c477981876ae70f019b9716e8c45519fed27f1599d469c93ac32ab0aeaedd37a067b6d460eb7de710e7a25c7c2e02f2d2a79a2299c6d4745af60e44cd30d804fb958e9c8851c191575b9cba358200f413e97dc435a8de7b996a935b87192a1fb9c892be426786c2a26e38ce1b61ed0600aa73b142498952ec8bafe3e261c5a51d70cfcd8f179216386f71956b017fae883697fd626798dc3ffea15fd689e59fd5c9143cae2f150e54243839fb48dced3c70c4061a88fb77d971420b858ffc221f3ad6577848117970d062af3f255e197ed358a5eb7efb063b54fb6c21073ae1187659099682fb1583a0242947bb804665912471e4121381e4a7ac9b33d9a1d82b48a12c8b98e434e97eed912a41363bb66b78d92fc52dfb7c153449a06a095f29798101577fafa4d9125775621853644e2fac9b2de281c0dcd8665cef3d1d6bbef61c2c091dfa931cc6ef40ee9d5b80",
+          "padding" : "305525003051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "921897122fe95da7b369055a24438e31977ae5ecebec0e6a969efc589fddf69237fe8ae0761a4ea886fcf52cf3c40a8432cc462815fe34480488b094d5e156df992564afcb2808939dee01a8d9398b7dac996a76a207f7538b382e4da8eaf403d470e8ec98b9ce939ec7c9d97a8a9eadc2b7ed4d01b088b57483b9840570ef35d404f5bc47be1ee7db3a19d9359f5433b7ba5d5770a1c2c319c0e4574e7068dc0481c6446a47291f8a658ccdc974842d85658106d75a3d2979baad2c90b597b036814535b3d437fdfdcd0977f72a66c51c27ddb846ad7181930ece42056be4c1b7f4d62f081f60befadfd4493b1400c749c9d343b15356a0c4b863b9dfe92baae0a6784e4cd25ee1d352c55d257c16c7ecda76954fbfdaf79c3ae8ba81a940264bc75203a1ce4090f1e09ac54eada3b84a06a13fa5253f38f61dd5bf8fccc8b4645756f08e66f44499c4cf3a235acf0aa156a24f6070e9496ac4ee0211068fecbc5e6c7ee19455351c1037561deb2e86ad855dfc8c02d73b109a4e775a9a104c0f389dfaced039127b93c8a6edd943f8aad35c7e074a918b599a9d305b31f32c52e1a5a735f71635abb0d7833e449d16247e4d1bc1dbffceeed7c92c4b1805460aec4e2442513ad391671ac87b9b089b8482eebc80efb9eb389c4e87a85f5f53f7882bd66b42bd09b0275e60e76b4208384e6fd864ff99a4d72b39f401962e72",
+          "padding" : "30533051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "37aa38b4532bc3cbba962bdd106979b4bd0d06963490f0a7c4bb0b1bbee5772fd976902c077799e6d24d21613e1aaf364687521ec8c75c763e27b94734c25a5595a1359e9f2a72641e473e70aff36ba14cd79495fdc0055c2f22cde8a0dc36bd0c4eb8d12f67ea9fbc05c282b57834b94f8704e8c229207b82bc379d959ca4284da7ea2bf6cf08c189439d765db056144f4e0f65db91128f506664fb1c136c7649c92b38bce90a4f8ab6e08290cbcc4d924c01b1178ad2993c971d055969b5253cbf98cdeab6a87cfa9983c7201ba7ff3522a292eac3a08c7f463fff16ffef3271175ea4eba206a634844fbd4b130a683a93785b7893e9ef8bd3ae73c513cee3bb1ed8da9be1a9c39b20ff0c6aad6f1f178ba75d3ebb71140f6d75f7aa71d258069a14e1d42934bdb8ddc3ddfff75b78c1cd8e1fedf0bb0fe66e2e817db92f98f7f73417ce821415a0c1b06a7ac5d1e4586545129d02a6fb171209446c7adceff80198dfd010f84241f3e18b0b99458092319f967b7064f3915d171875a2b63a30b45ae60dd1ed8af936bb48d8254e823f167a40e89bbfa2ff40ae2d48dae05989552cf8ab5bf7f571e5ffa7f9a1808723fc27555ee7595b09dbbdb3f35181da4b794995b5a07b96cfadf38d60204a8e0172fd92e0d3c8902fdb0c161f3ea3053bae2e21a9c478aea7bea42f8ab082e6e3777ee58ad797b0bfb7e7c79e0e371c",
+          "padding" : "30563012498177300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "15796dfe18c6eedb2488e75f4501f350c1c35b6af637f09460d94f3c61d4e119039c4779b88994006c3f62cb7f34f39e8ed8757f28dfafb55ca2ba207147960a71c29d1089550778b7b187a4953610e856adadcec93e166bb718cbb2e5e7fd09a2c0d978652eb89b698f2f629d71da55c2b2caa24d4069b82f4074dfad02d78ded1e1058f67117def7ceaeeab37bd48da1ba887bee751bef68ef4028c7cf4577f883f463eb56a5fe9145be0b2cc5455a9b3096d41af9f0f500da9489d00b6082689706fa01f40ecd0dc554c8e8bf6021139978bdcc25b73e11c3fdf6a74d3e1ec6260eaadf40c0cd86db81de9287b25e5cfbcb754a713eedba9e8253f65a7f02eab00851e2c189b3cf47f1d60a1c3f058f93aa644def56afa071677eff0d9f60eae8f3bfecccfb63724c618558e51d3455b7ed103ed1bab225dac9a675d56c960757cfe3609f178a13ba299ebca3468d7ed0ae53a5854134bcb3d875642224d330e4af4680fc951801392cf2c43bb8b299ba348cb91c890886f7db8ad8113b5e84215ca1be49199396be27553f8d3c1c4e281d4f911e39048229e4761197d2147276fb9d88565135d1a2767f8c8817ccb76b835dcd2b598c5567efdadde869d4ed4a3446f01f271f324c7cc943a194a4e6e1a9d56658419eaec73b0557f823a946c2f6f4dfb8505cb2620192df8f110fbbcdc4fd6b2298f124cd53041b0913e6",
+          "padding" : "305530112500300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "c699a76b8f2743d7fbe4c47d6052887a8cb6cec90f7eb95f39256fa677093c71f604645c9d01b6cf177e6b30f825f63a0ff805337e1eb4f64d5d894de4d2bb3d0aa3c39cf309580a3fbd5415710b4d9aa015edbe4e3189ace28cad4477f2a73af8cfeaac7637cb18bb5aca78fdd2914281d6c0cda03ea136ceec5920fb258da99e6816074dff6fe625873d3bfde7818c756329f84f398a52e7a7ac886169f77acd790dbffe66f01c3820d93dd487eb3c0e222c4f0c246b99b13b5038a81120d8035c5d023e1296fc25d09a64a1782ea557df44219748c0572df48cf8eb285f7c2231e1aa8706f58e5dfd6723c779f71d87b8af852895564f869031c6696838f9a00164e78069ea87c9106d439c43d7c050ff1dcccc17a83b05cfd2b59c7c267ad5c32ac6e467496650d6fdba12ede1cda8e15e03091e628149e6c43183fd95d4bcabe8d179096879551e1259c59d6fbf9f19838c6283936b6402039928c8a428ccbe97ab523f79e70adc17e324315a740b00be8ae82c2adfdc0aeb60a840beeab03c6e690f54d4103858bca95dc507333892c15536d62b1f6b32e3f50f6faac5cf29833186fada7deba7604b1229a8c832d1685323f0a45e67d32a447db8ebe1c1d5083fd84510a5c92e839573dabbb97c240cb1d53909e1d304807c79a859228a3dc5756eba16b9545940c077133e876c6c280f08c5dde9eff0498bd5187a7a",
+          "padding" : "3059300f300d060960864801650304020305000004deadbeef044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "c4c8233dcbfc7d176ff4d31081ed91fe02a64cd00f66e830a97dfdc3ce1a7952fcac2696da6a95a54b76c14115ff9337ddf7c74bd36932e0d0abf5535b1d030ad6848f8f0184d62784d0d378d150fa8be447f00570492b6f540f88eba62917796cf9a76e7338f27779144ce3ec7196bba1f6cfb2b47541741ec454a97fc465cfbf1aeb681618837c481fb76074ecbcecf18f9ced503b5203fd3bb4c18a6a2d6858020c39d641063d28dd5d4903fe7437e914114e2fd8898b5170d3d50dfe856bd72ec1c676015a5335832892d015e39ac498e90c8d179967d425fd59663b8270fdbcff3b433fc2468f88f3126a4f3a5636ca92af919d6ab566598498130d777ebf8ca73705cc4e4dd6507f28baabebd462ca47ca24e2ad4a1a0ab930eea27053aeebeea63d32d6096fc0469adce1649132081acf55b80eeab28743bf7da9deea58d3ca0a96e4784397f459f6cbb040dfb9a6f813be0d55b1dbc1c3a0ed32e2e11ee01b4c6854cb4b3332027cbca24d0af9c2f9eaf61ea809831d44c4e194a0b142b49897496f56f933aee0e2fdbf4e542e0a05dbfc077d4cf1e4c41f8464f6ca18a9f958d859a6a6326230800e88eb6163d8056e0103b68987aaf0a601bbe5b9c50f6dda156315e84913cef48007933d4b52f100c763b7e1b78daeb2cfe7d6c92d32307039db8ab24889dadb7657ce0d36377f9e646da539747b266d849bb92f",
+          "padding" : "30563012260e49817706096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "42d49b58398a0600e337a94146eb805b9419d7424189ced4a3cbdb49fdb82f47aceafcada6b120f6ab678496ba35be664598cc35e230491f474475d5ac55638d02c5a1ff93287a684ade443b5ef6a4715ee19680d9466db8a85d152251a54afd2d102eeb546d61ad80552353ffbf93ce5c38850c60a627df67d57fec100cd70a51558dac111972df1a1f6923644cc53d0b32c8236f0d30fabe027767c81e429e77cf2f0c21c979939133eb3063b447f12c6df48d82aaf3294d6b2fd1ed44a9ee123c7a6ba68b278c412b673787f6f6161553604d7bccaa4178bca05eb4b650dd94d73f55c7b2a2859310d406f6ea36f1400230113b3c4c6a9cf2b5b79b7906a184d9bdf2445330e5d869693537897ff45dc8e9dff48a78626e7da181ae439068f80f2bf460e9274a42d9be27115a456f28593bbcee4f2b1e8c33da85cbb0d4a25f551340b2a6dc6cbc26802457a720b053ff39d70b164a019643ba9e61172b5792cf4f90a277637ffdd9eec290d1ca9717cfae6285ae504120db2a081368e06bee71dbf5ee70b63037044b1b3f20e5dbe1749832566bf2c5788826df2983c38049b806e06e568d18637a4209cfca714626a433dfd4f4954a6e348fc373f95c59d2aa29b9d3dd435630f500d50ab424cb8c7b795de92d14c7fed75f0e2181b7ea901286dc9fc61cd887c6289a357d633c7c0ddcec38461784cb59be0fc7430e03",
+          "padding" : "30553011260d250006096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "28abe06eabb02be52b20e50de761f97fa5f454f4ce892484ca7df812c4dbcbab2d7163a20c0544ee454e43d1c96fbdfafcfee7d9c5114a5c6b324157e77bc283c3b0202e7067e252289f6feffd3bc287d6670f85175bac90d4d842cd902ecbc489c881abd113273cf3802ab3c4e347572394a8517763d7a2985214add76e757ade4994bdf23f7b9fe3d936eac96ebf11f13b3f09deb71e13705fb2a2c52311162eef035523902874989cd63e688ad53fb35bd5f0ead9dab6112db19c2ee186009c83455a57f6eceb4e6e5c2f46435d21d3d9f7d6e53583c35d859f42da569d0113322d7d0f91468d9c7c05b4a648b45b15ec638e210436ccc59acd2b223fd98255dce7cf75dea03cce9e8f80ebbb09b13fd2c0adc7c039ef0c5b369031600c29636a7ed8dbab4eac60a9940547e3591b48d97c329c47d86eff1b0a3f28f3b6cb213fc35bf35098e394c7f9f84277859fda51ac25a3e75dad7fdec12c29ea441612213c56d24b4cbb8529b8ea80d1c95690d540819ec36332d05ad922d71782fa48a2268fe149b6a77ea4b4f941b537c170607ad1a453550cb62e81ec6cfe8c0eac8fff6fef5e5b148c7ac5bdb5317a44c17bd9ece2a41305845ed3693911b3243b94f8a5f8cbd06cd1fbee782fff542f3dbb8367263eb1f79474d1419c6351923d861a347c53f298f2a959f6ea29015a99bf76034ba9ff91cd79a43402172080",
+          "padding" : "30593015260b06096086480165030402030004deadbeef0500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "606368a102b687b3f77b23add45ce84f5ba81f69c55f327ab98c8a2af52a89d332e202bb3531a31394d683c691cfe3dd1087dc7001bbd58aa6eed9b22933c4e84ae303b449f38017dce2fe034a2cedc6ed4b2d29c8ba95dbabbd7337dd797429ddb2defa3410479bdf13b120f1ab1663f01fe13cebde75545ff950f374bee071a35d0078e0d11e56f4a73738a205431b10bc54e935f097c10559c7f8cd0fae3f60dced2ae9cfb90f641ef79c627a0eefeaf04f1c5d03c1a3e2dea991c7e18be5db6bd821b07297b630e33b58cd8e1d964935cc330921f89d97b3b14960d59d8a228fd1c7ded2728e7159a5121cac987c8afe63b58616b8b8db82942558f997be8853b3b152bebc39f251223fde61e05b6da00e273e54b29cfdebc54b2faf84280b09881def19f25ef3d36a13ee4a30dd30f517f9e738123f090e69a87f98b51b9a3100802e4be126b36f02dc999b1a1d83481a8903e6e87bec9c85182a6573747dd00d61c9daa35954cfa76196a1cbedb50b9491e41c28b2fd3cf69c262fc52307f97870fad0b16ad013ac7ad6f9ce9155d9c67d0f5e197aed564fee6a12b0c8c7fe3adc5e354397d80d7ce9afc2516b101f67b061cf0ca4842be2dc535fe51bd073103fd57b3872ccebed778cc2901abb454fbc77594e85c5d02e4d0d388e1e3ce0e3ab5b99a321de242f6631b70b44bb32a004d167ec248e6e0a9c55bc01b6",
+          "padding" : "30563012060960864801650304020325054981770500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "578e32b1a21efd13040da60f84b4b23177693f91f0655042a485aa72bbd8ab5c9404ddbfd679586e11ed1115784c1d0a052345106b8beab6073258d01758fbfe4dc6c6990c0eaabf24fccb77ca7bf85e7b18ad25817adeb6ddad6d85b7d7cb3214281676ebc2adf0a4e6bbc9a64e1301c31d0c0c55dccc050a798568525bc01e99fac22fb44dd636ea08f388f3ac0c515f92242cde081077e88ac47b13920206834ba3e27ff6fb4ecb7c364d8c70f66cd6df9f0e3a4742f72a8ece5a4578d7f6d54eb7ef24f6a693ff684d0358802d0d842f7ae8b29d934ab657265cc8af115da8b8049ebd8767192db1a876f9412d021ffc7b8e91e2495090d556a35ca16cd850c521b65a28468cd130f0f23fabad041385b3232583d70a904cb3d7b6d7f1781b4267bbe27e40d91b2cb2c18a8da23aa3dd6f82b3fd6e9325dfde9958a284845958f5cebb0bba2ca1f34e96c010251286fe440e6e395117b6e2c7d9b007f13dbfc4d5d512fe66464264e6f5c502bd6af825bd502f8bcf21d1f213ae69cfa68f16449634505a6e965bd68e959d5dd247e0944ec26e4f1bc857f1b46f55ffc4cfb85df6130cdefb147a65025fa6b12f313e0b893815876ab575c0f9647bf69f45f538bf0ecb8593dd6a39aa12ad3420187d291cab553cf3a4c801e282a5db349b54ba15fbfb1054e9aafec5b45ee83634dadb7d7a50af029291428f6556280b09",
+          "padding" : "305530110609608648016503040203250425000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "9759ffc461e0e342fc0ccab8bf5f71a528e12e368d45c371dbfd709e7a16d146c3b847b2a9a00d54b2eb91ffa080b072a630c0645f2c8c6de2f4f815702a754971651914ba24a9c35d895e747745dabaaf21ac9b908116e56a8043702b151555a9f90b33356cb46b6989a4a900b8b7911c2704440173321293ca6382b2289f859bedc8ba6d160355b029a4b3f30d4205b33416b41e97c2cb5848acfac5d52006ef8d93638d48a2e0fab5dd6d6009e1945463e7ab53809ef6aa7ebb297b5b72ed9f55c43df18d85596bada1b014a5576a195a99c9e6c729ccba224fd46da6f0ad1ce90422318b0a2edeb135b12fd61d0ed2b56be2cda4b4d9819d537bb10079cba8d44eb401498c194d1e9eed31604cf79ffed10f8675ee31d57dd2443afd43d07d55b7971ae50c38b2b00dda28f7b99d14d3f885b70762ed54eeaa899aa62c738035a972d0b6ad1574bfbaf0e8d2fbaefda5dfd7c64e44e5a81f1feaa3c9305013ccbb10af2268c6001d0c2b3d0edbf558c2eaa22d3a840e1cf678de90c341d310de3d7a3eeff1f275fc92119c7e13e9c7f8230da11c9acfc1ce44d1dbf3766cb83e1a335d9b2a51dd2d7c5e9316db24a8d1f9fece9b3e19abee6a54694a0b622120840629710eec4da9b1a1125f0a8d68a3a4e95e8d5de298a308857563add33499e50aa09dfed1ec34c103dbcbe400daeacd8d0d1a526b922afefd2e421c54",
+          "padding" : "305930150609608648016503040203250205000004deadbeef044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "55c9f8533f91e175b2faef772dfc8452afdd8af6558e62d854688457772785a37fb25c9bdd54c94374ce39f25d08ae61d32e42389a01c7ebfe19ad81f85b2680b157ba885f77bc651da4744f06fa06219f791c19e6c65a443d6f8ee989e0112a9b2c7a50f7180474861ccff6bef6f4d625e06d072b987ab6d5f4e49397a1d6ab5de81fa17790af6c20d6cc173b7afd8a986e885db4596d784196a1aa6aa16566e4fd95ea1acca6abf75e76d23bb5bcb9ff77703924c6cf0841bfe20a9210c6b039837765fd88621ac40966a7fff636d8c08d6e01aae0e6cbbe6d939273b41fded42cef520723689533b9c9ef880cec7165b51d2b2661abbaeec93655075e8ba0966387770ee4bf6dc0b5c64f700a1627ddb6444331d3d84a5f049e4313ed3408b3235f906cf1f71cb8a659cbb9d2d21bdb570a890a84b4eda357f5798e491306a146f9e48548567c21ed146082cc827c298cc03c7e9948ce0aade3c663ac1ba599a0aa4794f80507c5948f68c72ec45815b714cbd5efc5cc44b9b8143a00dab66bbf96d8caa34d89508b05de17282fcf4cbc16232123634efda9dd797f38d54cba71f4d0c4d610368f7687dc0d042dc85088f8f8da3ef01583613b2a3093b9f0f67c29120a6de03c92de3fa40078d5145d9331c69ca03e4978bee78418ecfc85410a19092d2eadcea18edb79849b838dd991026fe3bfaac57ffb0fa4992e41af",
+          "padding" : "3056300d060960864801650304020305002445498177044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "622bc03c975ecbcf270d4fd0a81e245d2d2bb967211995550d2599b1ff72b0106fb155b2683ff4b3a61aeefaa4b9933a5177d45374eda2994c3b5394106a021ba370247559fa1217fb401b6a57c0c7f7af1dbfbb73ea8c1a8f60b23a65c1bbaaef01f35c0c950e70f430ebbce87ca13c2429b8e7a99bfc2fd9d563e60c68b0852da2db0acf752a1fe73f577fbd62a6c06f479e8bcbe0f6eece671644d0f650254b0131381b3b5e55529dda85fbb96ca8e7668d55acd5dc08dfbcba9962ebcf9e82469a11e38377d47aa6ac47e9a8985d35f0a23296da33457e3c95dbfeb57378dede44d8be3df8c88eb953ee82aebabd5ad5e632f5f89aef6aa7519a07fc52ed7314703cd8778672968ab6b31e5b371859fcac5267fc568c1339234eef70b22590dcfbb3678f8e91483fb2fda6c62b2dc38c7db4538d3c4673b7ab32806f8251b41be88226def56d05e031b1ae47b7375dd348081bfc34b655ad5181f83f4c7866510e947580c9f79d7cec9a2284ad169dc5c12a135df8f8aceb2bbb853246f9bed7ba175dec9c5f4aadac16c9b3ce74383260c9c71e88ad54161edbda05cda6922d906be8567d1dd5a78191a96c164976c0f6078d36468acc911f4c5782841273f7181be5781ad330d4b371e2b1888f53c26824ac4321efabe3a63a70775ba2a6b123d82365aa08aa01434fb973feee939ddba69d1d9ea0a4cf5c8750ecfb98",
+          "padding" : "3055300d0609608648016503040203050024442500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "including garbage",
+          "msg" : "313233343030",
+          "sig" : "48ebe9de8e53729f8eda91b65096655ced00e42b9e60135730e26f454fa2ccfb75ca69fe5d199b049200d5eb092052df1e49c7788f0dae5b1e1fd0b90ce71be65c3078adc9f2ca1690dea7c8c742070449f5f2e381711f64960a3c8af07492a7211c6c4c130b51cc02eb4705cfcc5de189e59a4ff1f118bcd05a99ba5bda03d789f573aa859df0f6fe2e09acb2b48f3f2205d9a1b1a576d10a3506344c82dcf636013ae464dd694c299f6bf3035a230ddc08b9bab222ac4ab8eedfd75cd00ff7574fd351d3908f9c625188916a44a57c3da0233043fc4c20d2cb2d2a02f134764982a9a0004324ac2e8cc68ce7d22cc50fa792923c5582321ec980231bf00be12fe58c942584689d2174260558c2ba96366185de989149b4bea1b45811ca835f98293f6da83325f9f7fc24a67652e2629e8b429ffcfdfb1f5f8835d4e5fedb6f37b0646c3593fc2085d6166202535d16da6eb67bf63c5de8972224356424e230e54710c25d0077927564c35f7898766a6f9c4aace37037c438a6d795e575bed7df883e8ec673dd7b40e801ca1fa943ca8794f3edb528acae6f083985f5fd05b2d8eaecb3db23304d6ca405507b0aa3ea0ce5dc3db24e1d4ed5567659a51aa2f0c32d5653a78a9a3664109b47c2ca8667a190dd5879377e2a9749f45b115dd6a89bd98befe252178f4a202479e6bf1ec5efa3ca4381e66cb2e69d56d68a5f9039",
+          "padding" : "3059300d060960864801650304020305002442044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "584e9969bb4b1cafaa2378ffd159216abc171a48487e7ff85533efbb00c31b133eaf6b61d1bc392c0eac00711c2c0a5815319b8e12f0a50c3f357d9fa419df1f1c81e1746ca5f4fb0d304f269f07d4041ebb0906de301a6ab99f8a792ffdcb26ed2fe000f8a719a4987425628e49559cccdaa74f56b3029b23ee6be01da127bb6c7c47067b281ad8dd47ab02ad93c87941a01e3369c7d21086279d45f2cde90faf493933539ed526eaebd254b03a5c5b69af634f81dbf30ec8b9cd2ee5d5638e7b9bb9051e9dbaed1895afd992db9cec16b30a440c640660bffe55621ade0ac1ee1f61823389577de5b76a0b52319a42b80c31f457aa9bf483a9d61820d418d90ab9a578560cf4b8d27ef68c338b2c5a6c7b92efa493ebf792b24218911b5acabf2d4101a62b90bc0d860c66dd871a9a748a4adcf8307f676bb49da703cbc24ca190a2641ddcf7e590f8b93b12ebcedbada2020ffcd25492f1683909e8f63a2139acbae12b9b077f2e327a990503b7ec079d288b23dc1ec70df44f821869e106d1717d384e8d8e55e29143042f91d98fd14f403740d0885f353519f2be192b172d4a0ae3399324ae7620514029bf60d1f80d4d228f3378b6d093729aab9af1defc2731929037b6f36495f764ad7b023517edbba0f9deb31e82456c98f7d1b7aa0a308af1350c17295208515b6055a6d2bf41e9a98f193a5568e9719523b6dc7e",
+          "padding" : "3059aa00bb00cd003051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "2eebba04c692db87e21982dab4776e0ea15be89e1ea2b7096225bb3d4c7ff8eb5a35c0ede28f57b052eeee4718a1215d4767b8d31931d52e9afb52e48b493a451f32e1a90564db40bc81ab8a1885b049609abe7d0f2e4ed8afce0f7b7d6fff141dd76a3004c2bd9dc8cd903a2bafb77e8b9524f38a4aee393a07b787c9527cc7f39d2254f10f1c834416ae9cc689dc71dad489051bec16469552714601fd5c059fd076c2f011a37b1ab0acf7fd4729e232e68dfd79ec0b6ee87413ba94ab4b53b1619d760c8473fad0d5d6b6921cc0838810c911e891d3492c2eeb008a1124c25a2a68c48c72064f4171c114a16effb23e351614cf6bf87e63df60bb59a77acf769924ecc1a7a6cbaa9cb29d69a7ee5721f1e3dfe8820120265195b8650a4c3f5c3fff2c66658a79c3f9e1e9b83985e09b42b0907791f65ff0c46bb10dceb0c16d0aa49c8d1b9b5f094eae440e62b938c842bdbfb0d52340e8b77da5c728574f0a090dd3e5eaa97a2c3fa7c1402768a693c7635ca722d81f101ebf1ad853ed6a3a2fda270c49e9afedeba199cc6dac0a329eaf47a35ca0a304286c5e9269d6d82cf9bc3aa49feb6b775e82a1e474d6bf5b40ddcf8f976f5017018ad1471ad50fa1237d1af971c153339cbdf9b6ac5bd4f348838c94c5d68183bbf81c87f3a362a795a714396c0e2c458bdd86c3ada3b8049b175d540d36b5ff48ea6f51cfd0b0",
+          "padding" : "3057aa02aabb3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "72e0dbe8885928b6f14fbb06089957a13e57a87fb1e1de0edcf859b35bcae036a4986c939cd93a67525e960a3863ef32a4eeecd5544f151e6838305cb7cfac7ff9a5040c078fa09b5b6b3e1297fdccf34ee22c69079e912a67acdff40ed543def23bf6185fe12c91b29f73f68baf91144d4298c6200941f7fa381cb70f02d951f261bf1e42543eb82a93e94c50c955e90d4fa70317b1d0d6d6ab771a6a4663a08a6b22248f855eb064364fb7f96d755ea62debc5f6b6f08e6024c221eb599465ffae9ddbb0db1f9a81f6e140b24a36bf16d4c02908af25478d1d5e8f35c2fb088343cb51a9280dfa5d0795957cf62ca1d4c51289e64c7b14ce178ca6ce0baab676c629f363d4a6ff8fb8395a1fbfe85d3de190252d058e2be5f1dc3f8a9929d5cee2320cf0945a82be5e649b83e8ede3a3b01a18259a5b5afc377c36a2b038e5fe5904651619e470a083da069efbd2dca6725c92f34f574d7f5d467453f1802b970211f041caf78139a41f671d7500b1e6659894b4cd7d1af04e6d7a3fc6359430d4680260cdbfcfc49d46d8ff1801eb6f28b32c1cc4278750529328d10adedd792e6397209bd0ce6db0c965df029eb835bcd3b5661b083a4b46b9616525da7f5783793ac5e22c0a58f343aa7b11c05c4ed039e19a072549e31bcbc6bb5f6889d3c28ece7f091b6abe7fa5a2d952d9ac2408127bc46b773b4dedeb78e76bdcfd",
+          "padding" : "30593015aa00bb00cd00300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "1bd88eaedfb86d2f11d9db39d011b4c001a20a726545cca555df9b3ba46f032dff5a259fab7ccab203a50faade4db09302a5dd3bb1f0d854d96baa47e74e59d42e54b94409a2cb63aac19aa2c601d49821c7a0cfe5f612fc00b5ac3963b19298bd4a00eb3eb8169d06b2c4ab7cef1e3e3504ab4750da995019cfe760ed976f7c996df4a353fb1177121a7b3d6165d08f6fdfe75716c031f49572c2b2981a770180723a62bd337d6a8916447cc25718c19e61122b32ada40a3948d1dc12b8a2940cb16245330e721e251955f3d48c7ffb8d0dba29c552270f5d5971fbc304729b7b0ce405ecef1e38d42a3823ea27cb177e85e8da196d8a07ca9a105f4e6ffc4a857d9a3a03cacfa097d3de68b2948dc29b19cffb847d0f1ebed4752d4f31697fa3adacef16eca901fa058efdc7a70338bd1541e851009916cf49b79b593010986e4042f7855b0c5a4a3fa331209e46aa2c7e6f1f180ec4e1ea6a81fcec25bb2c7f212ac4a7ab23ccdacaf81ac854d7826ab51cc991a1cb602f13e0039abacdce2e565c8709f4ee23ea3b3b23186af7560050676e905590fa9f6b40f0b874fbeaff6a467163a50cc1339e16f79bdcbf0b1670feb1dffc3cf867312861053a2908ed92be30edbd1ac1b3376c5fe7f05e27f56d72b08e7813c597d58ce3681cfbf943ce086db930f82cf0cb6b131169cdb8c57bee130d30eca2deec14dc0cf3b174",
+          "padding" : "30573013aa02aabb300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "57b03e4921cdc73982de748d94eb594090e998ce4ae520cb801b881a5b6ff9830a28b4419e7b3059e919bc0b27a5d020506f2db02c504b7029aa21a8be8a225ca9acc9472912d00348313fe856ed032dfa2814d88d7925c1f9e955e8ff4fd175b96e8fac7a5c6d749bb68073df1db6dd4b54b9cf87958379e327ea95c2b68a3fa8bd3aea08c34d82d82ac4e425fac275620d29704d3d636a5f6153b4b10695af831e694dd11bb17f72dcf6e72d807d7b876bcba57e49040297a417183f92827c449fc1ab162fc76520a74f03c979516f2ce46e2e25d07744ed93848a2bdebe55edcd978ac7249d0a61cebff1af4611a163b810c29140c93f05781b613fb046d87302ab6bb9ec68612c6e61481984f09eb3b57a80866e7085deb66130d24aa74bc9d9b44d7bd93e979c50265baa9a2528e98cd42668084f0c6d94d3740aaf55b66183d2b899808d418eb18e1490c7fa1224c870d9236e68ee071191dffc084a6590ebfaf7d54bcd2c7f14660f73fdd57e8339af64cacf159081bb4ba2a158b0c2e4795ea140383e4a0edaf6126721670919bba3fb41b4eff070608d364c0fcdf17c983938624d2eb7244a438a605a87a45374ddc6a5886a5550e5e2430a29b956aa24f2a217937ac96caf55488d9bff9956f41dfc00f017b9b53ff2ac77e69447ff53d0211745f0e9f91951e6f0b148f0488f88f70906c4606b47a6e6490be868",
+          "padding" : "305930152611aa00bb00cd0006096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "b67f4a92151f8959f87b8c02ef7dfcab2a34f0d185432b277587e06fd14d00f580f66453ff4bf9e82cfa4fd399fef899f868d573b4dfc75b1b537a3d899e8064811417b5df57e02f8909b6fa45aaf40793a7b3ea3bc7941e785cd47e38c941d3b5976fcae196e6448646eb7d3110bdde27193dce9a199137b33374390bb6619096d219713981cbc199eb427de73a715f1e63e59c512c74d386b60ca716bb96646526445364205dbd102e05ef53d552ff293603554de2199e470e9c5db18aa885efc16771be1b4af38ef6a1d08282554afd5fca4f7282dbb07174843778aef52c70503a97b8f29acc72ca9becda1bf35ef6888c50905cc49d9747cc244eb3f023d822e977eef43e4cbea91993a0f9c9698ab45b21f2cc6408a55aa370662cc0e6238a2c18f77cb3db699828bce9b7a782b5448fdd0c1f9cd18544386f863ad07531385b9a2b5619672f706f22ee3dc9a20658178347135e9d22f141c0b759c3926ad8dcd9283a19c77791324a94f9200d53e0e7de40fff54494803559b0d72f5bb8f8a7903c8586c8e179a1787c8653bc54a3d1fef1dfbcc8e6f7efd460e5b255e759551b21dd72d4c68a73be8f7e5e7eb94cf3790d0aa5a2406e53e67b4cd32bca5d57b463821441b7d4feffa4894a2b1a1db26567256051d2f195b5f8e7ac676706788093b222e5617455a4ab45f291ed2382f12918a4044a502598d23b166d",
+          "padding" : "30573013260faa02aabb06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "c69503be9745fead30b4fc7dce08d8c6a0178754a15f805dae455ffe8f33262105017502235f8ab25c13d63b42703d9fdc272beaf4f9553f62832203dc1d45915d64032496749eed244b798580e3c2594c0cf3d100e9c600912dad5d777708b0a883490b28e5922c6061458f57730eea9c6b61c6c6325a7c46435b3626cc9d7d33142ef75551a12e644b50115c4feca83d69406482b0d7d4e5ade8cc8345575d61cd7cb4e9bdd2efa07d2c998e2a1c205b54445ccda6d54a885eeae9fea3fe6fdeab8c9ad58412cbdd2a3ae4b8290bc792bf64a7f36f8574f22ac8839a7c4fa68c23d7bec8638c08cc7b501ff0652b272442b89692a5ab724050add8cbf9b229f50e75ffb88b07c29f3193d1c90bf4973ba336f70b06830202ea0dc69fa965f4bb05bfcf9c1e896dc832c8d4fdc98242ef26ec72df311d011a7aebf850efe276fafc7ebe3b7de020863e9ca1a3bce423302f47487b17e24ce9305d98bd2222d27404ea8a2d25c688c85d0640d96c05a1c2b49ce27abbb7ff0895b3fa75a3d649a2e14872a2919004f6a1a833b8a15ca91db08d5a6261f63fc3c0cd8e95aaf78c328d60409bdbcad741c9858924a844ae55a80e1ece9e9505ab8f301d9b8ab6a5d49f90fc46c09eea0d3b0ef7586536712dc695b2b1053880bf6282344098d6658a94f9d2c81d931cd1d35441e57f1c24d85150ac37b2280033f16bcda1c4f86c",
+          "padding" : "3059301506096086480165030402032508aa00bb00cd000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "727998d4a172ced0ec2cb6d2d49f766837c1dfceff9fbd35dfe9e357a4b9b143c4d53a8214a39000467bc8c88bb3582633d471fdecc58c033bf3f66a29b893cf4f6777f58841e467b84c15c2c5007e0c322b0a51779490bad134e905e83bb90c13a2f0425331b97197d6485f2c4c534e3262f78dbda5a5adae63901504fae86d25ab579aa8b1a3f2451d1b8a02c2d81f425689c34cc9abb8d035c0acad50f2d166c58d1fcb75c251615e48741a38831da8124d821b2a369ebbf7c06cc5fa2c78950640274675d1ac38530814c4b0642fbc895f966bd7bc1648f526a611a979df403672b29d37786281311d9d537a9faf74020b8af03df4bea590463f31aa9b5aad6c602642d012b65eb70122a40e93ac059d25c6f7ade43ca1257bbfd17b29b1cac1ab46aca85213c9399e9f3c2bce25b9709ca52d9be29890a409090e8d4356aeb85751c3a8d85a6f49e498aa63e48f6fa08754711ae2e849dda0a784b29ed39fbc92cc54c2027b2912572da0242d480c2df0a347ca68f4435405c14fde7e07ab61860924fc9e2f0b123a7d1dc9505cf9219ee2e5fc0e3a40240cb9398fd5583b48971842e57227adf50927c7b2ce06fc52007920582a7fecf2a5848e8aaf44be1fdf01b39e833fe2e6874109154d321a00218c37e368c2cdaf2bf743fbc724b2d4ddf772b7dcb5c0f50aeaecca9e0351b93be126ff4f8653df60a21765c71c",
+          "padding" : "3057301306096086480165030402032506aa02aabb0500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "0a0cf5f50cbdfd0571c75579da50bbe83c0f92f154534ad5682a5e4b5ea7da1f0b6967ccc0e228d03a0232901493954451713c76daf5b7a550c42ad6e9dcaedd42c6212c20065b09b2be9bbb6d8479bac00393ae00c82313efc6fd3de3e3e48355e232be62c89ac74077cac1fb83dc7315723d879c9282056ef53b2ebd2570b517c498f587eb23b7c1d84cfa7aaffe4839d8ca39acaf2156425ea49134b41d4824347bbcdf7798f7d56009e8def5450f9519e3520e956357f11abf364077c287ec249e54810757300bd9b5c4b525a998b19247d41301bfe3f01ef89356a7322d0b3effa08c7b6c996194ae6b154ab33a97b9b35523314e5f5c8bc130fe2504fe08316449f46dec845395edd389ee5672b5e8e3360bc54a6c45d02b04150e86f695afb6537e6d1000f8e7c65cc0a2fa1fdcd8f823e5d8d972a99fad864b9a7423d06e8d4f5421e439d54e3d250e807fdddecdb65705d98e0200026e1d46ae9461534361ca41f6c68e126992b177d9692ecc7c77a68df09fc74159d382e9943ba85a62825f700ea3c8010c385e1fb2f4c2d1755c54cafba826055c0a4d2a2bdb2093e0b8f6fd009d448b09806ba4a3714937c39a23370e99f96bd293af486674d746faaae76bddf56e43f1a0218ca64891d0cb1ad8130ea80156a32c0873bda12f372ae58cdc2766bed53dc27d81e7f16487ebea46893818b434c7c9ad4e1a60dd",
+          "padding" : "3059300d060960864801650304020305002448aa00bb00cd00044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "including undefined tags",
+          "msg" : "313233343030",
+          "sig" : "5aa65a18332c2b515bb70c97059bde6c6cfef26b9c7d874575dc2fdabbd1176199b208c3ccec06bf52324a0cf13222add3b65011bf54338e139b91602fafde29d01df109540c057786a20a211283bd87b051cd0c226cc6d5539048a9622105379db015326cbbc1353da1ee4575b5635784c67dd9fe2e464a949f84f9926f7102f92b2a3109a77785a05416ac162179ab3ea4425755c61c5fe04cfbf735318415cb17f45c90f86b3ac7112698a0efe9e903fc816ff08817e62d645437359781098efa9b34c0246b3bf43e10233d55b334ced1d9a590fddd1190b9eaa56855f464d8152a71eea9dc4e9a82f021472b84f34b48fb418a941995ded70529149acc84d50880a8370e00f7c9817b86ca8d58991fd517e3d1123cd46e459c13fa1b07d42c64e32e1855225739b4a29d28e0c550db2080d1e41451fb1eaa55cb69c7d7ee0677201bff841ce0d59277b09daa91aaae042ca730d2e835371d6e1551c72fdde0466188278a651178c769769c4c5e83f7b492bc01c94dea2906dcefe48473da6e00b47823ee1440af77f058b0b3c53787f26ac1879ca0ea0fd5fb4dde72cc47f22fa0897b8ebb0d594163201b6d1e565c6a9070abb42567f65f5d252b1ba537c496b2688e1dc864cffb8863727e5311daaa0ec54397d725b6fd88c5f10c76dd4878a8981d864358d16764d82915064c1df1d14edfc0217ff13a367d8c9634ef",
+          "padding" : "3057300d060960864801650304020305002446aa02aabb044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "8901dfd3f87f0a88bd64a6dca03f9b9143c12558838d7c4e8e8e7683f0a5fe4d89a6e92898ae653d7d54ff54f388f1fe6b3d7199619993fffbbf239a46bbd76573752a20fe645abd67856980c541ac70cab0f61bf08d35230d1c3dac05d2a109ca3695bac4525fda535baf36263856fd5060f95c9fdbd84c23f37fc8f00d9c545d491e33c056b1844b68cafb3d380563a9d24bfb85cfb871c81522cf70afe2d872d5cf98fd857abb68e14144651afcb52d3aed6cafbcf8473d63aa37732c3d6ac04439e0bdeb8708758dbbaef40726733c65a0714583ae97e9d61c7d59fc03cd5a8ee0201bf1e20c75c4d3a55f7c959b6e6b37168a5ed527d50d7ab4312ab3b4b20a57e8d4e1393abb77bd898bfe43385477850580a461a663f5ff587c67b33f2c7510833de38c2cf6188e52e6414884d10131fe66c0576cd0f786a07ec47590d777a9ccca9b542aedb4995da75878c7e56605396538972abf182148acc26f7b2f7b9812c09efcc7150f31e661aad6136a6148757a2a06661821848b2ee0bbdcc158fe0d7063a7cd7e65a519a0e97950c9cfe2a2550aa1a568b0cea62e16a9f96d75d49e4b0db0a9e6041de753dcebb1152f51b8140bc3e567c1fac0a5b37fd9ba91ccde9bb8c9d6da2b82f22d10137e78de24fd2ebb7a720d55cdf5e8375e3cf903aee907ba530d953c52f236b55411c082fc956b16a31a321d714a67e82a19",
+          "padding" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "truncated length of sequence",
+          "msg" : "313233343030",
+          "sig" : "977e0e6d0d2153c34a30178af3fb99efb9edb76799ff0b1669bd0eea5b5e87150e84e5313a921e074108cc2ae6cbccc6ef0e0219af4f226a3e9e57f0a162ed209feffd5a89e65716486bcf5d6a79bf926edfacda0bf4091746345fdfa7d688aff90d9b3570185f664d94e5216bbe0de6143480d7051a36306ed99599631efb6a916e61cf49a03d10aae2317f758f1c4d1c46097e161a4ccf7d1029b4778645d5cf5e8d022681db62ff15c3854349727d7f65df9cd24f5cace6fc0fb131571144d24866be5509332fc77c3823779340c95637a003a549b3a8e1e90d8a3502e42cc355391371b09946a2274861a558d90dcfa12e1021cc1b98e96796264f7bbae5f6a3080ddc498a8e810e112ce6b6bacfafc8326e92956618886e2d3d4081a54339c895805d9242b7146f635af6c1f17ae1955f7fe49f45b148b65fa7c616cf48b5627de9f08c609575ec4581f0062f1476076b359145857325d19c0c22c30ceccf055dbdde9b562a1adcbaceef8429a44f62fb8f24a512d6ee70499bc3921f70831b57a15d7a3c023b18b6febde581d7ed5d3f2d587a4af0a3ed1f87be027a1cb7cc171756b170a65ae7a1fa4da832dffcf7efbd37cbd4d98750d437377cae209c51c049fbc166e381d4f879cc50a5dc3b31bf7d693c0d613171eeaf9e2572267236b08b655e4a068826300d7d92d370bc348124e63f8b871fbab0b2d85303b3",
+          "padding" : "30443081044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "a91c56df4ca300b638c505771bf7b9ac3ef866ef9b16979ea0e5f691f5c91b886bb4e3540be2eb3c5dfa7a6ec11c513a62036766dccf50a36c058a9d06dbee640c0830bef3e50747ad7de9dda9810309856bcb634043b0907b7dd70f50f49b8fa35e2181c4a7d386742639f049a758b05e8a66b5f41756909d8d7afc31f63eb4b03a346e3a79d3ec22ffcea5c01632641e469c441951765eaf41c09f5c7dec10f7aa0eea85cb991428c496b67880b3ebaf13397878af0264a4276b08d85eae131553c6eacda05c5cce34ede7e5248427e390af8434e567a8941aaec4ed57049df79996de2cf3355b7b16531e0bef7ab3a3d715eaef6fb19d5e03c755cbf9dcd1a1d8ea756c6c75df8080963a9bfbdcdb551a53a7f4ae14d9469d93f92a8a509a687e96ec567176bf2c0766f03a9947545302b750d8901beb87acc83b6eb358fc1b82138741b5d33aaa7b6186a96f78f28d1e83aab719b6f383fa2e56062dcc50aafdbac7877ce8c2cd794e72d07e6b10555e06ecdeb03ad3de8f45a65b4a654ea3dda0c8bedab17ff55768ea45b17cf66ed9c00c8156ba86c5ce0228d4e5996b0268f3e19c75f14c34a3327808015e46cb347e892e88429fffea65b295eefd007ee77b533fa2be245af0bee8f175b6170c3b9d85cab02c40d15c6aeb7651c325caeba8fb17bf177b38d0a06abbda7030fff4969c11bae68d0027a79bdae1f340",
+          "padding" : "30803051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "563ccc0f74bc3c6bd12af3bfa0a290244bc017a3b6c452eb9531906f5ab092222dc5eedfb06b129ccf1eeff16d5f3a241be62b671098393661ddf88d1ef751e5cc46d90118334961eb989b8c6f1c38f806fe636c1f8c1961604b9cb3f4275d520b7f037b4c6c78cc3162d6cf3caa589af31f77a8edae1489ba86a2b36652a84a861e34f480783ff10bb3c9d1bd0794abcb77b785a9d214eae906a51e2d65fd30ef722bbc687fe8eb43df347f9ede204ceca53f7ee9525b5498d04233df06631706acf65338a88cdcb9201607ae6f71f830653d6e3d320a362248617ebab100c6450dd88cbb01c6e3bdc183b8851e2cd2780ebdace96eb88d2c5672b28d9e77ddf9146b6ca17caeeacb472840d0e965a038e08e437b0f8a1402356bd6305aaaa9cfb8fea1282feb103cf3e2014259513f1f43316a5610d767398eca18cf3bcffbb1ae179df35ad4342d89bad741db6cf2f0fbcb08ad857a738d306c651e6f7eda3f9d0eeed6e6d11df2c0398b2d3e0cba596fa1891872021c7fbe6c99e0ed545f147b093397b2727756f1a0260a50fccab5ac17cba2926ceb3495a11db8f1537ba3530d0d428644ae8721c67baf87bd2788fbde87c7c907860c277030d3141a65c57df025551ecf385c12da746ec7b594305bed042104922751eede193dfc9e1c9fb4785bfc622328bdfc5607dd21a6817abe4c941f2ffb63657f8797e3c84973",
+          "padding" : "30553080300d060960864801650304020305000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "2a7439f30d8d4600ba553f9100b26a2c5861d5d5106410b369b94801c262d124a262fb17b448bc14114f1dd5c24c36e0d5528c4d617093df934e0523f4adaa4e262c2fa1cfe59db2f51336c627bc2e2a11b3022bdffc649de8690aa22fb6b96f90f7573d0fe23ff65d95c81274543a01ea654728c57b64c717f0767b800734aa84af805fdaf2d04946303c80286a487b48638b8972e49d412d351b9101bc435dac70f28c78dc1d79986e9a8dd64bcb11c8fb3e90d2c036c5b74d22157be15ee1ba291b97606057a5926b84eee13fffb3c8ba245f153d47b48d836828d71a5bcc02ffb12fa7ca66b576d2d76f38643502c4e529605f833b1d0af3bc7a58f20b5fabe63de399693b728b3b35db26ddd52f62bf6268c502cdffe883e8485f4a7c60e438e1bb84070c7adbe021a6380989a76b72faba576d20c4333879700e5142522589dd2c49e539b7d49f1293634b18f594d3f8106687049cd4093f442d34654e82f20bb8c4b252287cda4d9e69223e22e95a717aa5008bfd232ec5e2b85c92ec093c6ec16a7b043aa5a86c136a38dc9d1c7fabaee3af9f1b77fa4f4517c596b129d8fea402c856f041af5f98d235ecf2e6894798a857fa3e295a4a63c4d5d7d5a5d3fd6452775cf512ab4bbe7355f71be5c07449e0a8345bd6c3960a999c3c3ce6681071f5078f331619a9f5283e01d184782b7e1393c8291d0c409094d45b84",
+          "padding" : "305530112680060960864801650304020300000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "5276a6fab88bd401b451eff5d1a669c405225e90450584c5d6d2e4c05f715249900d10679fd58d736deaec1cc26b1000d6d0e60afe374981790dc850af0ce22d1e51946605783e37e8a2e899a607fa2551fa76ea9b20780b92e9b263be76e8b1da9a725e58b20a34e5013ede41c8601b466a7d693ea2b903295f0768fadef5c0ec3f0c83f659fa2db43fba1986bf3c6c7bb8bbb851905e62c4bf9b0b8f9029edf9f737ac3060f252cfe8c46b4bc4dd58f2ad8bb55a89a0989d9f2d684ee4934c1bb6859d17f8077275ec229e8bea6ce9e2d9383c2b89109380ac6335a46017bcfc57d500e5833cc404fb81b25f0b3ba28d71996a345ac8c9869167521daf8af6c89e130bbc27d55869717e5b7e3eb67f1c6912c6e9cf262544ac8d7b76ffa24bbd078c12c09f0b26e4f87aa227820aeaf17102180d272291d7c65dc40914f42c026cfdd5bc330b8d0d5c948e0c93f4beff299872f65da8790a9ad33e7a3232220b684cb8ea87d6855aa4c053c98fd20830dc89f66dbd1046f816405490884f97b9dc0ba5b5c2e9c8c0cd5dc13a156edb25ac384ab16bd5921008e823050b166b3f727efbd7f65d3e4fe741dec24d7e95f6ba707d5315c71749fdbaccd16b6e98a0cfdc456257878a2138ac754ecd96b76b9b63644c3c40a31f5553a0dfb5ce7c02ac8b9875a0a24b0f9b655502af4d5c5a8d714fe708f0e1dc188369a07f927a",
+          "padding" : "305530110609608648016503040203258005000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "using composition with indefinite length",
+          "msg" : "313233343030",
+          "sig" : "8e96d28c66d90a67a5f09894c5b2db57b24cc18480fac7132ccff9b0b0da5f3cde652a919a7d20270083bf5da9635cb1c1e4927b8a2238e00c7e828c9fc251c8a5d326fd8e46f08ff6c36ce4b0a8b368806612e3172bff7534b2a28b365e4f74fced400efc93c1d4adc7483cc270b9d1f30afc7d25430b36e2abe82e3220f040e221483447f6d5b153eeaf137d4b2f5102a07e4cfa336e53e71a624236e3def136b479190072a55ed97d15be64bd92006623009b34cbd5197a3d57318c9754b90b105b3fef38db1acc0b8c3325581a1521371500bea1c1f5212d95f3def741d96e3d5387c4aab64b0a0f584b33fc00039e58c526280cf1aabb380c66d3b191ba11ce20b73944d76a50e8547fdad2d3486918a104c4622a78493eb1cec2ae748701ea5329d67814f581c8576149034e655c9d230dc72d93df0d37a0a4b23178220ec2a22dfa95f99ffa650d55d73c09ffd95fbed23407cfb5042e93a2baf9074ff85cb0efd306e5ec0813df08677dcb75e0c067559760d310a17c7ac0249c5193ed1823821b210e100b130909c2296b2cb1feff4e58f58065e8321515f99295d93400c133e528e44e659530e17b8b92156f151e49574774ff3e05038a31d6ba247efec4feb0a1efec266d5a90d0643fac6e390b37b26ff6e83c5f5aee67bb9c229b8362b50f4a10bf37d47df247841a28dd20d6d10934f6204c8681df0cfb1816",
+          "padding" : "3055300d060960864801650304020305002480044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "685f47587011d1f43cf865c9ef73b28f633f3a93aabc67ec69b6f3556b78c86e6b64409652b936d327bb1dd2bf96ece912d27b08899d11aa7dc9a27988d8dfa61f6ccb87084e22425a35dd57a43be80d508c04bc8fd18bd0348c790b1b33b6b84d9ddbec598ef50b739e4ecf1127457410ab2410e3164f313fc185f1d07dfecebc543eb5a9ac30cffbdd56d183c63efb7e288677492aebf212241a492ee1a736dc2d9e31c0200630d00a42b808d812c660ae2b4700958bc7f2f8223dc5ab0d32c788be311170608dff9378336dd152f4705ec687e75d4beec24c9495d801c3dce72fd604c3ebd50f0b7b6095f54cbd6c9b7a167a76649fdf98d627ed94d1307463430e4ddd99d4f79221fd0af76f42d94f5f472daf0faf63d9bd8649cb998f7be39388b85b5e0af9a3cf71fc8e72360f7efcd3e96af14601fcbc2d019bf4cb62fc9d892b070e191d7d68553a01fe04a3a46fce2ac45220e40f4033c07ba794bcdf31d90ebfeaf2da93f2bb7f51e58e884ac453e2274da963c60db990fed394f181f9578f7165b852ae2a9bf51415c89787b440f358e7774e6c8f2ae0a52588f13334cafa9f71c4262016e6995a76c98d5afe3e62bc8d23bbf62d3f2a3ed019165004a05a16c074a021b1064909c591e84c4a547c90de53e2bdfff68ef170660526708fe788e4b1b98d136295113112ec13f87ee3ec3f2590bcea4c34dbfa6561",
+          "padding" : "30803151300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "1b68c793bbbc11aaaebe1b09036cdbb4b754b5d18858127699a1091714e6d07687b5d9ea9ceb4d937c8c09db1f919f33a319bbbf62efb506aeb085387632b9a1a016061f0ab9aa2b717c4602c5996b42e312f04854ee21852ad9fc9bcba137f59c981864b608d82fcd26964df05832983991cbe6bf74d09d851f95d13650994f56e8fa3204bc8685f16a0e7006918230a30f025547834145774758cec92d25c1b75fd143e4166c255aecf9af8189b90bacb4d08655d861b0ce2d58894f00b6eae3395a1d692cf7091f43885ce8220c5a4ea8d312625b650377238dac43da5b8ffac7420991d00b70453fcf633b844fe630e798b8ded1f27bc170ba0e7565a85299158bfd9249bc5d006f3ae97969f18334290b00c284c8a61ebdb1bc8c78f913f724f308c6f34d1b36ffef06f09a2ff5efe4e0f1cc6b16db8690ef0dd07cef88cd2b56c25cbc76d6ef2a0c1c7bbb5145eeec4ead730faea578f98c6fb30a4751fa15dca5a09d353c7afce7d572b8c725a8cf82386a3fe49c4ae31227c165a93fb821a93b47636170a2e1379ff57bd4ec495293eff1e0162ab6926c787005723fc58fbf3f4b23f466eebc1916c3d2a7e99a1416a06a3753284f02f4066cafdb9f6cd739fe8f34e49737b2989b37c4a01ee133fb41fefea2d437f4814f5a3ff433396800221428e420692c8d70271755234bfca374c43b331c20e3d8c77d11863b",
+          "padding" : "30553080310d060960864801650304020305000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "530e5a01bd59e922ae4ac02a57974759da8bd978d6331bf58a522460a4cea7cd3e78c76987ed9bf39f5e6e0a0127d950c3de95e3603fd9dfa9d2f8daecc8f84ede2dbf99f29fae1a73da64c6ea602a90a529d9da1d8b1c2c1575667a7ffdffb8347dba3d13174f63c387966b3661429fcfe8da1f3e3287769b5826be0ebc0f6bf04b47cf5f0e6d9f494f6073ff7533131d17d7ce859febda32f8c639b9e2a7aabf0e82a3da62aac20864738d215a862c984343a639d4caf91fde8e4289bc23c65321dc387d8dac38765e4a3bfb1b7feb6360fabb62b97efe71c9fe789347187562ae4a6bc35c6f842f7e8f1bda9ea31b39f58340b352ed31745306c4cb5dd24fe308bafbf1e654bb8898333ab6b2fc96ccee80a50c44bf8af4f77f2c146ad5f552b893c2a036e3e7e64b1e6f8ed152ed1ac66390b1b828ea9c43645d7f36723c111cc56a4f7c973c0ff99c460e3f82169fe2cb3d30e518a38f1c1e2bf4bd113b85a30d26d9ab03a803ed4cdc59fc7f16f095a84d663eae4a3b1c3aaafad19c2458528cbf37ffc46d5b1595422210c9378bad7ecfdd222260f12a304baf3113e0a20d40a1202de6a2f5b8d23a8bb2fa12aecfab4d8c6c402ac417f6ddbd27e17f4fc3f5349b97f5363c9f74b5200d8e96e1d38e08dbba1a68b8d09f115d0bd277c39bc02ecb13ec6ee590d0ba1ca3effb97021a4802e2d1ea47d58cc494a68f8c",
+          "padding" : "305530112680070960864801650304020300000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "26bc4df6a3ac430e14349156fa87159cfe3be489c4f4a3bb3ab1e9fb6a24224bc08c8fc68d31c2dfa7bb1eee34486c189cde443569fcb046837278b85c2a3dd5d79a32ab234d962d9c3397901dc2cb9a9f2a4efa607b2d664974fc0ed8b21d83b6fc26fbec342aa000e798b398da25aec7f3036b4bf5b996268ca306497d49f94c29612fda4013e51bbd5f8ebd7ed6d3cb9651810f1953a0a0d91f21d23d2193d9124eb7b993b92c3f39b4b2ed75b9a6998899a0e627685244d692c9bbfbf57a32d2075066e26693b66c2d6abcaa06349610a30b9e365bcb40563232f5a618975d70b9ef3d2e370ebcf371e840400bc59cdb8ed8816e21295378668349f9b6872ed38cceed565b37d67f7cc53ef3048b4dae2ff6e6ef05c54f08da2b25af6ff8971b1e9b56eaf59312a82e074fd03ff310d2d063fd604807c2e1c9d8d10f1f63ade7df27f0894daef9cf713bc1900b8e9697bbd19c8ccbb6f7e608cd751f6befce4d1672190beac40e81feaea5987e8be14ef53f95af53a766c864e1e20922d745ad3db7fbc03b0889525a00ae2e748a9675628439b5967ee7dc3f3babc24f4497744940448806af9143b552a304a25f9112aefaf7dd32ba9cac33bc8c3e77f7133ad325cc83a10a2890c5ebe73cab87e756e16d7f17721af90c927ddc53d448adec90932dfbfd28c031e497953f1b75d16fc59f44f232eda3c6d9a05d601b05",
+          "padding" : "305530110609608648016503040203258004000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "using composition with wrong tag",
+          "msg" : "313233343030",
+          "sig" : "62f48629c7a24179701c9c7dd3ad6573b147a46ad95364fe9b061f1a7a53f22ca9c94b628fb114ae94219eb443ce43847a948c04b9c9e865d06a508eaa53ea6e95bd06c0d678a99c68eb5d637e1348669853ed27aaf9eac212e10e63db88ee4ae572d71bcbaa9559ee698af1464e8c7e06a6089fac21e0f44673b59ad886870556b6aad683457ec4c8000a7213544de10d493f70a67bf768472c06a4d8d013d246cb6301c05d251d06e396297510bbd802adfb16c44d5667d49784f390cdd51a989227db8a0547b70139cee85fb98405157566f48df9bd99fc93f05164a3806a7a73225b0369b66b1a5b297184ebea4bf6e6d003458da70655aa78f936236dcf096d1bf2afae7552b42cbfa127343ef081a8a63cc65f2075b33f01ebde0c4c80306b36a70657becca450f3d720f5c0855a827e4d43fc2a12512f5f19301ba404ec46814e1bbfdf81e41dc03154283df7a10e6c38a89d2e1d1c43a71cf19edd6e4fad846ede85d42faaaa84c1b5380be55933200ec463f149915d65321cbd21ffd57c3afcfb84832c9b81e654f9a402d9c5b305fd3bd042e99a33dfbb4e3d6f441ad9646bbfb8473c9c01707ac4cff91e7ba9d5996ed795a1d562a174cf117b22ecce7e679e474e1f7e2e305818058aa85a80f87efa5c2877db870e4d784a3446802339b9f8e1f09e6eda2aea8c447794ca16a814bdcb1877c29a5a0e99243f70",
+          "padding" : "3055300d060960864801650304020305002480054043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "1f40a467924354f3025b37a3c5569518bfcc634350ce3f82ba8ba961d2dc9ba4206cf8b99ac3838e24c1ad80a8a967a7224ac47d3b3b141bae6b6ac34e2d5e1c65305038ac88f83e63e1d59cfd3db23ebdd8e3d32ac2a8c57b16c367540e2eadf9ae41a9fe284e3b0a9514557d468d17883cd55f741fa03f4ad166cc9b40b96eae4ce3546264582281562357d66942d09aad87d739dcfe6510295d08189562276a0cb11b38a32acd0b4372fbcb8ab19ada423416a99173205aecda49447d0d000cfbccaa8ed870416a1ba8401ad61cd94d4e99a98c4789f7af5afb24685fca9ba12bd7052f69517b3024c3b1fbeac62ac04a4746731cfe00948acb95aee3ea746776a90c7a4a54411432adbecd6bc239e7f629f02faa24e55f42bc15ca566d7214494577611d173746ffb3d59adc68fb3dce801993f779a2b6cdc0c10cdbfe5af0c99a2edaa23dca3152585221cc17ddded8474dc77954a6c96c5f903d179bc00603c6e0c9b809ff31bf31bc4d91c1973d29a0931c8dbdbb70ed09730f6c8274cc43adb64004bba369b1f6a9c7be6a49ce36a50121c342b1ac60ee51e89b73afa1afbe52bc86667a89536eba90d5cf036849bc2c26e7c45cbb7f919d3c7d139a3c7c249c0b8943ddb1da3bd875e5aeb917a9730cd20c58994e965f7dc35f26d35642e08210a82024343289a724709c9eca3a468b5825f6a13eb2e22da584634e",
+          "padding" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "313233343030",
+          "sig" : "c3f770ae10c10780d0ba92c89a1fcfabc248c0c4f8cccc3c6fe3e2887b543661e946c0ddb982d5b7cd89ae430058cba9fd40a321641646e590df3a2cf86b9645e347fb368c6ef5695ca8d2e9a9a327fdc75ae0d54010f594a050c9be6c5c0f60a4ee41f29191f7570f6dfb2d17d6b0933a22bf7822f520b3cba26419de1a91e39fbb12a84bab08ce9b1deb10b56e576e7be5dd9b746118ca8c8d991255bbcc34f9c7ba317f5e1190637c585f5a4f10dd037a498176b7d84d33a0370da7f834d443dbcfe1e5f502f09a0ca946eb4e6373dce383c9ae8714a5ae45ff555ba407405057d60dbbedb0b9782608a92f0710547330e842ff95533537e01272898f7a4dad71d4099b372a504a0e02770efc85190e0987fa7bc49a3ae482905f47d23260a698842c1d94123c79320d042c8f39f5ab91c241bc7ca834aae345548660617d0d886d89cc91780e070ac36d67dd28bd48109dfd69f7229077dbf490467ff14b6b57dcc05c3e46fd8a2688f248011b539d2fd5dc2b217a0b41d57fe667b936158be8c91c0044c688e752566a383db0525b9a72d9059b9d2793cda58dc9980ba8f4c3557304d991d190c935e76a9eccf50953d04d561b5fef7e62b1368fbcff1797c6cd6768885c9bb98e6876d556b29a54e7e535df63be53a4f509f5454d492bc92be81d1bb68516e35dac89aad54fb10e286b012a0d41a04f75860c7e03113b",
+          "padding" : "30440500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "339ef221a9520ce055fc25955bcca1c6565b3f889fa1c2b2f078923905e9b6e950af0977e5d81bba0d8e39a5efc6a21ab6e6c942ea872d2311fab297d550d8444848ab12f920affb56ff2f70d750c3fcc4d5e0e8653b9f8cd1bc1a44985cd6c62b43d2b59e1f08e6a807e376295fde08fa32fc6ab25e8668a8bbe72c8e0332f83ba64e635f1cbecb0e06d548f24821a673a8b4600d45506a2e84fcbb57bacb0c47204a4006b0a5ac3d5e2677b01ec4b1461e4e862232010559dcbd177ca1c327cc2179b8c62f4b84c2bd77b8115b221ca83a1664daa100c060caf945dbce345b1f16c4c95f3fd8fdda21c1fd274b548862e751641d0152fe2be7f14e168c911c0400c589a6ba879995d017a31535a0dea22d29d6df8ad7d3f7e98c5f3c9a6c1a29f4dfa50002e59d39c9a46e03350dd2eada66f087e517dade0f72fe33ebd6af0859fb16d945aba9571d8e263127f633d14c68a61da09cec82dd75226388ba86c3b9499e6e5ab1fd34797a1f9f4a054d9636665e7e54442b24edf93c3b9e59119e15e0bc9e6d390aa42f3fba32b3c2dee6e66499ef065c0a0001b489e56ccf082264f9ebdb9ce1fc0c2de37c9fe81ca2c8071ea4e79d0cf70bbaa64e4b07af3a57a54ed85bcbc21cac3ab32ff623f38cbca65df1afc17ab5f6c7e7e54d67f8fb768a8c4f32d1a69b7b0ffd2ebf811a72219a9b0d26778ffce5da7cfa53655d57",
+          "padding" : "2e51300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "1ac7cb7cc3dace7b4cb1f0900ad3e3d0b246d19095bb39c2afa0965995d5ebd42a4dfb6bf8931f8f641adc2eb34dd714b1da21c3c64bece5d77b3e2e5a7757fdf885ae0a92afc7da4965cc4cbd83cb5ae15d7d104d92eec701fe676a61347f11d0afc1bd4ff3cccec0ba5bcf47615ec6f4ff6dc5d036ea64aef6dabe6d47c2252095f45f9f9165ee591498328131a379cea3548f0e403d4f859dc083124b67171256cb54d6d328c206056bd00e3168b1184a8c21704ee9a4b990221c37a524579d0ce74703be382858d921a8d8afa1915d6cdad89c753d828bb8afebd22eaa0298470221260fb7ad9d3267fdf6840e4efe266a26e591b55bdc742a8605debe986ef689f5bc9a0c131317f06daa631712c5c33a604f5af4f6e023bae233a74dded177d6cfe42bcbad3a82468fdb7f60da8f4e11b61fe1c635e0a9ea0eeaa8265344a75e34d66d42ec85c817d86686d0d0c19d8419ecbb119d023b603ff48f22e39bbfdfbab66314f8f0e3f22e750b873336c37a1612c075fe7959b28dd39362749062afa4f57e08ec8dd8781f878fd5ca8707b07417adb72cfbf8fab72b21faddb8a1be9356227f4738f56f03212f4198c2e5ad0888d6cff60796be3e77d85425f666c7ad8a2c684257b922aaa6f1574d469a6a7f9840f4851454f5772161c8509877c6f3b6ac748a56a63b0e4d8e07942efeae3fd88d239cc5341261defbd83d",
+          "padding" : "2f51300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "272f90a1f74f89ecd56326849a40d81bcb2ceb3cbbc7f961dd3c2a86fa187137b913b034012546e518e8cf9c5b07ce126435675f1f9f543e49f470a9d75f129d089c6c8aff33d19e51101502ea903f7b271817a58abe086dd8a2f41ad3aea277f17e26d3932c0fc0bfc506cdd19cd86cb41670d202bff6d55f413036c94520a197c12b58c3cbea1e9599e2ee80e361dad7ca71439a5e000720d8b0c979aa7f37e5637800f23fcfc736f8a9f687e2cdeca40936caadaac563a1a66c61b6e65ea3a251446ff0c38050516396aecef1762eb1d821b5c3d1a8dffefb29a77a8f680d240dfa98daea7d514216fb9dd5a9aa4e47795e6885c876b446df905a690044a85e30bd19aac5a32aab889e12663e5d68c2af656c12815c27ca62d28cadd5a08ef7c745a8dc0271799362da62dadc289243cfd8cdb422a348d23cbc5f3de64d2183d3d7e30677a665c656f60a40c0bfeab92442291ad1d15d9ee46e437df9391600af277bb2bd4000547dc4fedea3b0dcec337dc6db5bf2a18ff8561bf1952eda654fbdb865b7c06ec316a9244708c3466ca5b67356cdc702e1713d8a1591a4407e0f8eb6185437c2eb3b599c4b530aef6ec5a700f49ac3720f0761e69b97b71921212a75bf9c29ecd97ccbffa7f636860e12f54899ce4608cb774f2fb99b23c43e7f12dc262e593ee941a1b987936c16ade689e43d56ae9ca02fbaa0d4d7e9d3",
+          "padding" : "3151300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "90fceda255c8612798fe325acdca9c8dff227bb9564768155bae0187bf834cc4c03bf14ccc9a58516389da715e70376272dd4112150d678983878b5a3af8784d1302a04f7f3dd7dbc47e2deda258051fbcd018be39605f34aa0af4bdfc3015de49afa72e966d1667630992c31aea0747ddc925ced69407c64352bfc65c6aa48b0236cb0f9e7869f4a408ad90f2ee7ffe5ffceaaa9db1c778b568a3c6a1844d1af2051c81c618d3327c6085b18beea8ced2168921f63bdeb67dfee4ddc481f247237cd3a6e7ed0e4b6b0f2a332899ec6726cf90eb317b54375122d975868d785d2a99e42a3914798a0378ee293f6b12ea6de0370ba30dc8bd33d4f0c81459a21a729556fb02456a2abed752b3e0c666704b1b3195d269ee43a9de6dc224b69b2def19fe10d247d0554182eb998b49833fa874c6ce3a2148c9addba17db473c09cee1b910316be921cbb19b18b1c2aab1ce08ec1753080aeb17af2b4aa88a2b76474481bfe347c744dced8e7c627b4c99c490d6f8a24d049b7fab93a134a485127cb58b817ffa2123497bd4961722a1e23c5f9a275d9de6fcb0d0e94992e7903d4856a92c85696fdac207d4716896afabe0cb9e500650632088f1d1a13414aaae61ea0a13b756b71e88711c5a810b2729b7320cd58698cf08bf9d6d1304154a06f9d8c6f2e8362fc4ccfb9e261ebc3a600450f30d09cabd456eba321f21e2e9a60",
+          "padding" : "3251300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "af7c386df1cba24f753c589d9756266b6473ca3513b51cc50c888103636e9cc1e0f2ae4f74220004ab02c9f734ffa96b6db34556fdd27a0a6ced6bd0f695f4550d941064f509185e4b3dc2e71de6512725fbe167083650e7deba3035a5d7bab68050d2a0bb1f3ac6e13dffb43db0f6355cff1809e0450f629a99975e9368213853a1bc49538ece8aa64aeb1dfd837ea7e7ef54845bccbb8c9a409f262004f55c5e0a807ba3cbd6f3c43cf498852765f740c2c3e8ca8b3fc4c43bd7d28f6ec2d29bcb0ffa8e484b4d9f6f26c75add460a3b98c0e911a3ace448a66d8a313afc2c1abff8e4f7cbb30bd7660659da17b4c7e7c42764363899881d43c3fb306cc0cfb17c7b4d2c1de8aba3a43a5bc16431d8630bdc1338421c12d65b2909a87b7f82b9e8a3af44a28cc762f5b62b58737e07ed34ef550d553b0447f994405287a2542befed0b2eefdc552a6fb94e42e354928eec6c8e93e0b24ae6719da20dfc2d6a4a79086379fdbe5dfbd3c35e4ab219481f8a64d33ab84a94f4b8b57a174788dfaf9e558798a98c4fdb52ebaefc0f1f5617652de0aec1724e015381ef7145a15245917de42cdde83188dd12afba47cef5b1fcb064a3a6945fa4d7c6ef37ea582d4036d6cfb6621335747fb6473306b27fec80afffc4deb77578644637c9c3f2cee11a0eb641b491c84e9201fb2829d80e7fb0418ee0b44b76b7c2940edf29a4a7",
+          "padding" : "ff51300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "b986dd481be76a98b5a23ee494a8264f9cf2b37e2ce40caf5a7ceaa1b2a5cced5827a652c998e1c26d03b48b77c440733d1be048a651ea93ee60695c34b4642a88d848897d89bc4f285081345f54516fb9705c9a90589115ddd0587544ec6a1984a4a72c1b6d36f2a57218b647b57315177834169b29d0b57326b3f4cd1df7914b088f48573b6b32efdaa678118e85aa6aa319ffd85cdfc4ca054a0f04822d934af73a7aa4d5f51d93b443e4d8473831b31bcd9aee22fcf4a6234f0fd6e27125905bc0bed0d7274f0734bb1f51414a5151fe60e4510e158e98004f9203c7a711bb2057d0e6aa7066469f900bfad93c7f9b1eb87459900b915da4d1a59aed8393088d5f23ea4614551607d8cd0c0dd0aea75734ae23a75e93e50c09bfeb7303fb704f3c976ae573f363553e89391d6f65035c613831abbb5f266cf40ad5ec1ef2a4871d798575216606ad76a1634d78abe9f16d6b2cc4ae3e99d1d43ec25e93b52c547be4a30a98e5d6c180e44a7c2db4eb0247b2b42993552e691cd9eb22547ff3bc4ee6cb2033549b883a58d3f50e121a70d51070b0d37647cfb6227764ad2703e0fe5ea61108f4e7e3d3318fc87a9ff59b005e7a6d232243ae16d4420e9e024d3904a6e54b30815a5bc1f1619b4416c2baa464a61cefd7a6fe1442d4552238414d5b2ecfe531bec9045e811fea37f8cd2e7a8345bb309cf17654cee8884c1b",
+          "padding" : "30512e0d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "5b3aac4ec4a0db836f2686221ab82071979fc1f09facbdaec056ad60e952c91ac77efef520fcd6627f5510b04b8651fe73c364e5fed835b412c37e5dbd81db1bb86838bf1cd865132fbffda55ecb18b2c7801be854a06aad0e1c2f0b4cafc8612ce40cba4865c3ddee40aa43782833f5ce775f2fc1be9a4097b1dd0fd5c7ea1afbeae7577fd70cd2c019642b74e2c94a259b26c34bcdebcd68982fd745127d0974a6397b92e9a3bd56ef74fbcf89a84546daf1b97b85be46106e6a6c91488694e25f9ed88ed136629ef0409a0686745c94322787dbb0df7f78d9e3424f5f47b24c6bd455d7bc1d89ce95e0229041bc985a6dc49695719878c28f821cd1aaf3cff0e23855890452bb92de37f04e9bb756fe62e9e4529e5f01b7b6a4374cd504cf7882c7377a82dbff7b4b87184709166e52238792368392c25d9b28218bf8730e6549cc9087e28fdc7bbcb0b6fc4c752b0482ab3b1c7c62d64b53fce9cfd558fcbba96c39c6a3d50708c0c5947dfc62a764f30feb857688e004d2e4e2c21523231dfa4cfaabb982b449ef516f93c81b53ff1a8dec51a441c50cc8a20ee5e2a19fa120b992e58e3cd5ca57a30f17c7ae47c6e579a572a1d667128e4285390f2906b69923fba414c6c92fadc58b87dae9378d2be30ad3240a27226530cb8afc70292eed5af4037ae6c0c28684fe964d049ddad06305ea30ddae64d0a86094339a6f",
+          "padding" : "30512f0d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "4c53c7b94b6eaacda889c647202d90dfecaa05e75a1b78041a08526869cf299a48b306577c1a1d1efebc7dd694e45155dc434e11627a7e7246aa0703a1592b00898ce4cb40e672d35ffe4aee140a6bc1df6d40c560da214aaa637d94b665763a7cb34e1db10d0f6772debc15d05bd0e1af359b53a521fd359c7e67e28d87c903254bba1f0c48f95a8e4dfdf09ac7afa2fd37a836e85b10c2cc6e0e0986a526dff679d3bd9da38e24e1a8a91adbe57f40ec7fc713792294da7682008be9cda6652254f0af7128c5c5ada8f7d5530ca4659b19b3a2b4b900776a9e06fd7fbf96a80320f9cf52d16936038e151e1b4928a0232c7d0d69d7c16839cc975ccba76bf435f50521e1905548e68302e35ba6642cabd84facdb0e9e5964ea683e1f09a12939abf306564bd97bf95f2fd266ca17326c6bf4e2a3f52a32fee4acb963872893f502e7a12ed4e97080816d34a112f3b5d184f7e0c7f4fa06e716fefa909ddb8d04a07c13f23b9ac919e10231e8bccd43a91d71ef02dce87ba6728e32e6dd92b1cfd96e9f3997e56aeb57ebed6b5f9b33ef1b6e4fec0410053339a5e7eaf956f262bb0ee6e828204627755a4c7bfd29e0485cf9d38f459b36f4783a6888639e0117b5fb72505184a727e2f3c7d7117d0cd4ccf621c670b33b709d165b68374dbd1eae9ac58da2826336fa01fea00f2a09ddd7a32ec83ba4ce0cdf4108241a7ac5",
+          "padding" : "3051310d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "7c757f1a1ca4ddc9e1b4cac3b2166c6b8185de0b1214c48cf1cbafecb58147d5649e741af62736cb3945afc90e720b3d0d4dae820fe84169b2857e0bed0119593520f6f6d0103490526b9952e62ab19544509c174de8d2683722f83a332b4b2ec736eb85dc08faa8c76ce48b0ce51521a967a559fac7f39767ec4544f5a4901fc4b3c7fec298a843eda287a152d48ef75d1ed2464de565da4b82fcdb872633509b67c6b15be1ae709539261595fda30b6f46423aa74b4e12f505c2f160082b4cde448f59a70137aefa4fa4ff3f146a25a91a657c639e4855fc97c98d2f21b52376a881554d39a23acb938ba15f7f63f849b20465e1583c27bdb32952635e497d8f7321a2d45678cb8d5d3317f8c8a593c84aa0b767ec5472a0cfa6f7f4b6c32cb48dd11eaeafa25b1e195545a602f3b3cd18ac318a48743e9adc8ee1ee4134787d9de88b796340c46862d7c7ca97f142a28e915985308e3f703df70d88d72bc22404aba08d6bde21e2540a3d58d49517bf48cc0b3138d1ac08aa427876630199e11460cd6bb04bb9bb29210d9880bdd05b95ac9d769f00da72cc2f7ee20d3cc10fbb20490957022837656a69fefa83c5f0873aac068481921fe82482c05943a6607ae92c38806f5396387617c26b9f330c52384bc0e818c66465ff3650c1d3414d95bb528a768c82a7c076fa4050b353fa614a830bfb0c603a5d44a01d4d0e72",
+          "padding" : "3051320d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "changing tag value of sequence",
+          "msg" : "313233343030",
+          "sig" : "ba1157f9b6c0d31a4c928e0c3dae7df2e13853eba781fd40605da2d2e71edbe65adac0f982bd940f52cd816f791232ae056d2553f5c82027616a65501a2ad1239d5c7b2b7511aae7c385d72f63944d1f1fcd9613ce5ccd192e674d22280a79817ab3308c3dff66c0fadbe9c0434f5318fcb9e1da396f11b4ba9e961de9f18e5b2ba3716d917e38de29027de43cda232f50d6ad948368a0faaf96f28fc4bea690d347f80e3ce21aa0aa49f445d3a4a1ebe5640f9f16e0b3d8b24405b1afae7d7eae6339ceabfa538a7ebdb66a4da5716dd3aafe0305c928c12175c648384ccc85e425b202e4cb34410f602a6bea3be79038ccf90af5357ae8ae842fd46359225d56371b05146798f04e92869c33c4166acef5bdf5b433c191a31eb4d4ef8827cd9bfe40345789d07f685f5d6fea483ace17fc8bddd120b245e7362a4516cfe4c192f3922bb9638cedd5e6958a6d2cb5da85fbae98ed6db16208336baa6950265adcba00b0203b669b62494bb56dcf3a417fe0f7d568c1e0ad1c11137d5b5736d344d0e5b3451721653c4bc9278284d9881ddf0e0fee8fcbb3f54db82747a0d8ea828229e09ce7d5459dfa590e4ad6ea2ac31dc72e68768a702546f0a98687a3dd45f2783e1fca8617d391598a6f9aaba7c829dc8f6e824cc5f9a7df39e209d12264205609d49c9958da2a3a59e4706ff9b119bfde600cb3a1127a75c77c77e586",
+          "padding" : "3051ff0d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "4614ec70586ef4c0e772106102b65652fd9e90aea637b0c808e6d28ed8aeab18ab750d5b7b5d34f918ce863eee94fae4cb67d8d30951db4bfadf62070436630a495e108f22c383c08107fbf7e363d5e7f7b610c134617c527027490aa2582ed0d8769853f9447afb7444aca2034a7e0258585c49aab54e6124ecb9f95daa507e86d7dde366c9fb2eb0430b7a990f1f055df4b3b6c2cb7e353b394723a1672301a43579028a34a92235cc26d2a15d5c7b9935c5b98a99c752badd0836e7902cde06abfad9ee917052814fb9d8a775516b948450c06d3e33b612e848c0f7dd7322e8b264d17bb67ef21177a93b13e9fd54b70cf5737a6aa870caa9a082595e70e6df68fab028e9cbb7f72e9d48c2f2106a98a8298dfddf575afb3fe266729c3346f567dbd3cf2fbafb82ae5851ca031c6e8259d822ea8623a3b63dd1de7c266c89278b3bbe2d3384ebd94c7557c63d08d290508cb77ed80ad97663540b7209ac3f7e9608be2db31b837154f1accfed92e0124fcd1c626d0d24db9e9c5a316d3e9fedf2c62fa55483ceea4c9c1c9a540d3eb8116422ac4229f3be8ddf8dbca64151590b3eef0411aaeb2b25ca03ccdb5309b28153515e9d343d5def471d5c67ac2ce59b62db6291b8753b0ec15038b8ba5ed0fd17050cbafebde18d78cda92f21e162ed72758f68fd50ad4b84b4a2318dd06279937db705d535d516fdb0757241a2",
+          "padding" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "dropping value of sequence",
+          "msg" : "313233343030",
+          "sig" : "904acef8f764eda821c39c4c75443f43cc00e0ab0cdcc6ac9a3ecbf21c38999d04c15a9b11d7ca9de9c221b2ad3a233f988423868f5aff0ace189a48c4452c41d3cfd0bdfa29d6652cca3685062fd6d59122a37cded790122d1f4ddecdacfa50605658f23c2013c31814c23230ca2adef7ca10239fa9d56a141cfd6c4f48eb87b08d7fbf12e9e62d27a86f82f229cdad78ec31d1146d339aa6fe06261823f899f418d19a3bdf817f086077d7dfc8fa1b9f96586f0854279795e9b72596f25872f88a0e00e91ed18545823f8e427b2b4dde5dcc110381b77d4e5c397ad9cda2052062123b32293a1d73f7b32dd98761b9eac5cca2d397489469216eed8e4f359471c7025f66e7affd79c8b34c611233a197a96642ed5d7ae4d4a8155679f174386c5a90c8265f7c73faf1d9c510173dd52a00877bd7afc995f6399145816a764e68838afcc54dcebe67181290505d3a274be28c9b2a4db3924a98c3c13121239fe46b76685bedf1b89fa2c055f01d4a44679231dd9b9a2c24fcd0b7c95254c36de5251e496db67372c1f76422a687267186b3ebbb6b4fdb7a93ab5ca9eb0e0e45cab2b2b9ca8d5c8e19aad48776e45b92e1baa1b4275d7a8355911693e5f791793bd6cc01fba821d4b4e6150cbb4958cd1abf7e3c9e11e19254e74d441903791c8db111fc40b9cbe780ed3175596c98546073e918daffba9f87a92e397b61b8a3",
+          "padding" : "30443000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "b6b03138199eb4e399d472be6d3504666820c52260150bd3ed24fac67d346de3dfc5b94f8683704de5dce5e5e4fc2fc3dcd77a3f60ec393d4b7b183e3d609d2ada0e6b2107cc84089acf9209183607b22dfb9739f40557192292f51723b8a261bbf1f1184cbbea65f6da8118634abca9b8c23fccecd74f14c49fc0c83bf2e6c8a6ce20d8c50bdac4c52cc0053480626b01b3b468160fc47147ebf8edf75860a5a500455347630983ada520e7317e91824fdec6a0d17a9001b9d2322c39c8eafe67ec484efeceecae83c875589d6625b20f494e390fc79816cb80f8f305018143a68b46572252ce0ae5240fd55e40ad76d36993cdeec6bd6733ddfe71ea6be95998ce53a601dfe87e35ca08f6aef11a247cea520ee7f3a8c703053ecc85f9b041af3e68254b4c3cc28d10714cd9e1b6cb08b0f9a9e0a6f902a0bbaacc98db90caade714a1ede7f132593794e25a469243d7cbac76f852d822fc823515419e6f0ac8a85abae42abadf274abc5a9c4127a375cfaefe6cad2be69d14dd29829b62c9f748a2f64c632bfeedba192d7b0d686bcedb29be3ff0589866dae5ac16058e0227fc98eae32da566851c023ae67f5de3d2eea56a15effdb615d4aa217681216fd42d50b255ddcb9ddec8a81b2e7e881bacd3cc0f1a5212dd3f66dc52994555a67ac5df0607cdfd279adb3cb0983c05a0117daa86b2da84b5ce146c1dd58115a4",
+          "padding" : "305530013030500d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "using composition for sequence",
+          "msg" : "313233343030",
+          "sig" : "a6cbc4959b1df49d751233e534513fba0efb1d4670e72f76ceb2b0aa90c1caad8430ba7067e4e9f4d0a274762a78c6a4c24c4039ea668e6e51ed4df98be132804078ffff469d00acad620fae3be3a9b46d89824a4f8a4a34d0c837dd6e612c05477c39623429fc34504524d6cdfee03104c6cd05ab2e01f2e4cccab8b08e905cae05d7f858a67a149e8eefbee4e7c01c851215a1c303666ec39272b5ba9870c0d3824546b3d314bf0407e33bbd8e7c04ac77c935f90b4679e8b14f724601a25bbd3c61e304028eb9ed0f974daacd5fc9f6feaf36237bbd413e16aaf188c65def2ab73353c9f17a5fa0d490598f27f3c7ec41bc2399436e7ba6a10b8f2cd6639c932c5f1f8512e3e25bd40d6e2776633828c2556f0661bb80ae7a5fd22eb50d8b617916b64df8e4927d07d61685a0c31b168bbd3f89dca636864735b3d6851ab6d4cefe983d7e765a251d26ab98c530d19de0213c7625a7904604acd68633d0284d83e6a559cdeee27f1dc308dbf23521a22a42739d5db8119dbc5d34220d1f30e62bcdd97808f00920f990edea9c3cd73ab659cc443e6c38a7209669176f8530699dc22ec02bf01feb4b2f58674c4838663fdb37c8aed415bfd2b79b7779384ad4555c62670d271c553cc00e46537e4d25fec955ca504351b7c7786993ad92335e19bfbcbb8f4441714523f28755b8cfba031c719d1521ac05e399092ad4d51c",
+          "padding" : "30553011300106300c096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "95313651a554ffad8c251bddb24dac0c4fab3544e82d62f7445cc6be99be3a5eb2b7f6b7db3f26b91795210a56907af9ae5306b73d6b8993eda74c44184385c4c0368b9d4314e05ba0f519dfb3959376554989f4e850d5e25cc0c091ffaf3388cfdbe94688d54e5ed4954e00f74d1f719d8f9615d4406882bf37f0c1cf8c1c0f2a6c7a82aab3a820f9fb241971cf51d15bd26f8df90cd3597d9ee31e258c53372c1949b2728559e174ae34726ff176d38055ec1bda06cfa96d07c4934f4fcebeb9d4a4c03080cee9d611cdf6af64f051c5cbcdb97d91fa2de5b92bbb9b01bd874e1e9ed2964982bdf4dc9140ea84b2700693f804e4ab9c6bccfe251964fca579879e2c015e6537c4889743da609fa78b155fc02548f353db6f470358b9c6e72b1c40cc41a5c3da88581663e721f02d443f22c9d8db056925d805f505c77c270f37c448b15c0ecdb2396cd790c434c1b9cf8cb889c272c0524c44351abb64b3b65194eb7b76241d971d2505c21af85588aa98b4c020e3da106275d6ad92ac77b383b463f712c70ad7085c49f4515402264cfe1fdd70a220b3a0552d71be2c8f1caa3f6f7e53b9147b42d4971d7b0314da97a20dac44795849a155a48f40dd10d2025189d5a2a6a176e44aed266e79a52713d8820a52893efd32b3d2f22509c813245a6df5fb9076a9340352167f2aba0e5d9af38569feb6edf485cb106dde284b",
+          "padding" : "3050300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "a057eeff7fb0d83799344e85b08e98410e2a85f6bd08bcb9c15a1662b0d4ccc9d7cbbadd7494b8ad390b58e5c48c9fead61091df7b3b59c721b82438265b7ba6e3cfaf3912bd3eee3a8f0ea64cb8696a393dbaf55959d7e516e16785d184847daac958445a79013a4884e434ee756de7533853cd219b0f5a4faa1133ff09d43c00c49fe37dffe0e3fac850c2d9c8e0264e64955eb3f78fa17795dd595c38324742ed77b85560e3dee3867ba4a793dcaf8f08faa612530355bd377c8009a08687999a76b5e4c74b36385a074e7316392457486a8679b226a1ecfa53f3666977af37e860e2c074e817b11b9dd4965d660074ae3c5016029a3fc210823f3f849a1c8fbeace5688a7ae7fd3358bdd6ee47d96c0ae6090360ba5601fa21cd60e71594438fb4d99b3276d49e506575d86fca9749d2db9639df69e15c89c3d555f1bb0c74e4f1ba3297b8affe1fa70d8fe5a19649a1f0d7f06804b0e021598c881b696d8a0b9396cecb61abe0e14ec200cde80fbf23cf521e110934ee7f33abd6355dca78f543d71a2b05327e0dbd88c9becb1817feb07f18df694e9312c3b4e24bbccedafef4d0bd99a268dfaba389f6462471eb9133a3bb49379bba80389105c5200b899b53b4f504d4dcaac174f99dd742ef574be0350d8c4f2db3a896e162e3058af5b919f40249349c0c3e780f685b113d01a1f4405cdf8ed4bd865adb2d1c3140",
+          "padding" : "30500d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "04050d0ef42a4d145e63322e2b20da48aec3bd58dc95a4658e69be740b655bc94ba3af9c5f9af76f023eb6051d9e2956ec963fdf64cfef1862bf15b4e896d37e884a0a23b60754140aac87d15583b0cb84d8f9083555ca64530c64984e3d322b4233b0a318ce33c57857829986dcfd1d23dfed79d3c59ffc6ba44052fe9f74232348b9e4e2d704070449b4852d6985609b3d4f5b1ee55d99612d23db06f5d2fdcabc0b1f5cb2f47187aec2fad8f385a438a5ad5d6212574c5b61f500a0d192d253968282c393c42855fbe46fd1e85627c154e4df999ed95d905e89278c23eeb79c581c9bd2f9252c265e3368951fa3270b6582c99d80f7e2b58a6ea278d98b295273abda89f0dda0caeb3fc7819673d5116ad16991563f08db0c5639e1fadcf0ca122a2d1286a2f994f646fe98efd35a83999915df0170094add1271f2e3bb193d5605d8e410d0fd0bb3e73f64295dec54093626f92a227498b6af7aaabd88ae1f057d30b61d5da0778d67cf45c65a3bee3a172039efe97e25f3b3145c47cb824b02b393d15f7b67e2167da3f2c740eb591f6a4a6afdee0eaf602fc963af1792cadc6fcf805432cfe005e2d4484df25c999eb484ffe618b03ee9bfd373418ef12af89b73ba49021b2721d18f5f9a024497dfadf201b7f6fb7415f255fd8534b62b2e2cf1e337a2270d6c286ffbadd063fc09f0f8e9880820a6dc7d03d2bcdf5b",
+          "padding" : "3050300c060960864801650304020305044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "truncate sequence",
+          "msg" : "313233343030",
+          "sig" : "25f364b8aed878c58caf9b40fabf09d3a9517f297dbe4e101eb1fd840a82e57ebe9ec185206756fc76a53d9f045eca0a4d819e87e81fb0569804c3b9f62a54ace4163c9695849878ade09dfae4f50fca5c68dd201e6a1bc2cb0cf970cdeab3630915556b79a9aed7903a526288b66b00a30f565e53875f448ce0b3b5b05e3b6cf71df9fbdf248fc1843eeb11955570136bcb4f8214c39e8c12ce59aba1f96062d7ba5e63ee178a9210f8cc53965b62fc4b0dfbcec2cb35933c7cc1bf5d5e26aa63aafe3c53e2b8d06bde785db99dd8ccc981435cc9a5c3d69a75de2c6ad22a87fb9262099563a6a149ed96012f25e0c87ea90885734332d21a66381b5c7c6a306ee571905a21d95a2e6374a3bb84aed9af3cecb5724a5afe5126541ceebae4cecf2a91802f18ab4c6f421c9ac31fec7fb6b883a576e1d26b1671663df442810ea405bb3d311b795dd8292b093e5650196189f83ae963623196ce850130f018eecf9a933c442f4f0f3b8067e24a50d363e4d10e2f254571b3acd5c318209c93f002436fdc0484373ba47b18b6ea50e9a9726dad987ff09b2bcd00bccd56e7572a75e321d1da85f0da1be719b893a06a40c3813ece6623dc70d0115946297ee0bc62d733aac3f1065e6f7b79d7b2a6f2be33e3264828e911b09e38582b56f0c1bb46c014506aa9c8293926401e0c6b4c1aabc2d70e739498f723605b7dce4eabf7",
+          "padding" : "3050300c096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "6dc8ab655d1a764a219c97ef4053addff2957e3d350b50f85d8c51c26e34d923a080ebb7a7ebf2feffa328b6d39109b821c241741ede029a55c83ed08c861f677470b8455ca048a0e329e67ec921943c1a6b5121ad714c3f7207a8b2ea1e7b100c3f95a8033afa5c0abf37f7f6120454466c019581bbf2fa26eb456f7f773cd5a60a6b1db90d9a26c652df8ef63e2de5b55b2fc14689e1a88df9cb95e11e5ce4944e1b9ad036d02cd25fa46ae08fddae96f5aa78539b062ba705af779a566209805190b57abf5698c129f149200ecd1260dd14dd59cb27160ead13c2f6d0494356a556295f6cbf5d237318e16b3ef9b0485c13a193e59f0adefba176d1f27ca5dbceed9ca6cbe8e112de56084ff3bd80d27a2d5e9306d6f56764feb4be5871930ad278c09bb444e213a7ec5f1fa6665a1f39c6fb4f4fc5aa8bec99141c4c559fdf9760ab4074780e191a9d3d1581ed411d502846748fa2956f75f779a2d0172c8011611da0a2e77e2fdf94aff98dfb549ca04227283d63224fe97d01bc3b80e08efab42b381013afdd1de26fe343acfe0d9981f0a432888c7e93afda0b4618d513663658556902c2396156ccfc4a8ea7bd650627a8228e51c4252b7df0ffd0f5b25df547c2691d6c4cae45081bd66e3e18ffe8eb37d378abef362024b4b73340cef4cceb36b38d78d816a2489be479244bf5fd25416a277535b350a90eb799c7",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "indefinite length",
+          "msg" : "313233343030",
+          "sig" : "6f1c83e54cd4810755b1ab483607f44f5437b82d8fefd1428e4831a825ec7d2182fe4e0910a596413d425aea53665a58622f66bf3b2fd42b04d4fc0212a5bf06c6093c8fc87c3fdcd59ddfb4672e3e78a289e74f7715865035cb1d66dc82d70b4565594e368e02afce093f12106407f47c2a21fca84259fccda46fcd1de83b697d48123946b1cfcdd58415d3e8bb5603981b0ae3367f7a65fb80b8545104fbf8a7a1df79d2b9c5c2775c9e25d5675c8dea5beec01ddc6e404e1b13dba3cd00ee19f59e5fc69bb82aa31a26f7e5ebbc8884783ea3fbfb8a56558a487d12f2b54f6a79758f2f9c803475979c0ae53ef9f808a0ad08abc836cd87134cd956e76a440454e4b9632d38f67afc1fed63d142e58fe5b61fee453ad4fc180498f91d47ef3481622e390c81bb4ad16e641d2c6223aea9b99ac4a8c39aaa8048e2fe34fe938c0b2fd5f097df6f15280c6a8af7517e4f94b0d081582892937efd56aeae6dfd8e410c08527395fe58b7520c7557e3166a863c4c29c79172f164c4c99f084b7bcf661a2612851ae04656bfe640413b45e0597c05c221def5109be11c28038323d5fc183f0b8c487551696d800bc157303e06dcbb8ec86a7423bab242cf24fde4d08fc640735a0158865dfb338c23ce90a9f4976836860fb737d504e5ca6d3d733a4865d9aa9e97e9cc8d923d31b8088da0e575cbe4bf9c78410452704cf5a2e0",
+          "padding" : "30533080060960864801650304020305000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "92b2c003636f38616d66d59c6288063f36e8c81b57a64fbb4225fa0bce3d058dc3821098d60d44efe8c925c34d3c607bc79eb6a8b667bc99800843bcded44846a974dd0eccae8db6a5a6bf66bf8df83306ccd785e3d16b21bbebc9be03ee86f107dd9a99fb227d7c95aceafaaf2945b653df862269d16aa9eead9449d77c55dd998316f9f9f6f8de1b2fdbd9eac1791541e3b725902284e6ea5e29ab66bb00bde4b0f702891205363328f0a185527826a1cf3db16d016b34fa511234d672830606747f4b06c251cb153707207c22e76f1b85841db5a282554e6d35bdb540709fa1ff4a22d429ba582049766aa5b9a9767a37adef399ca976f086e7b8e0cdd61d8ec24258056921b487d2eb51ebeeb612d26d5678f51cf187be515a4dc642674c9c797ef0696ad4b6bffb3d958aa95b76b2320cc2383155e6ba45ec6546d57925c8ee96f212c46af7a3ad6f8bc833f3e3b416f5be85a1ff7cf77d112e7836ec085ae65c183b1fcc598e9f3af8bd032b0aaf83cdef8109bdf4c3c4a418c966fa459e1bbeb8ef48be950543a784016e84cb67d26f5755e499bf93e8047d16e954796d5522b28df0a20ba9f27b2141c9f20ee1a2421d13822fc35d50e1d6cc9ad4bb197b19b6b9613cf7f4d56501fe9188bd87a17f6ca070c95ec64c76f8637fd952188737895a327d3c90513f47cc9a76d7dbf74b554367882b934545ae2d030f3a",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "313233343030",
+          "sig" : "4e04d028ddc31ef77e19b3638cce03719a814aa2749b04c73be1d5d2235799185625bc17f1116b386bc70bff5caba577cfdd09270a7d1ba05de0770dd727f94c5a7a73a5beb611c68a765bfce90983e6f1948168b3921ee8fe338ae19d4af386b8c17dec3edf4ab7aa9cd98a3c8c6740b760de0b07bc7e5855c5c2ff196930d0af0674712f4b4b6c8043de8284d3175daef39756d8afe3bf5ae868045553ed7bd8233e087ddd4ff276246f16aa9676d8e8bd2d2499459c927c164c9faa9e9a0f12879c13fe204c422a4256fda1f67eeedfee97fd67c726ae522d2a67e56932588439aa6fa190b3cced40daca91f7f27e22c36dd17e4260e4e85cd1d005356863eee5fb09653054192003fce49dc211102513107f01cf0a86ff85ad0e9808a195f721ddc38405bd13b26603293b0edbe508f3df5da640270b33a7f4bd40558467ef1945087e57e387fc3864bcdff5de2246c86b11e1a5ec56161d11dc10cb116f099e9700060a0daa45c96930aaf58b440a5c78c58057cd93508558dc363c332bc9a825f0c0650e49053e69c6d3798e127236bb0397a4bbe0d7fada7b5caa28fd7ce9c86fe57c00eee1a7c0cf2e218519dc529455cf650ea19c6a446edddd04733376cd9423f3f64fd3dd9cd2ef9e79f1c905be8e1e2f1c95e6e0289cd57c281f715a283258e3887d853db97677e8f3f3a7fae06cd9eb29012ffec0ee3347b3ba",
+          "padding" : "305230800609608648016503040203050000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "968d675e64da18df5f5a42aeff479ecfc8cca4c2e95d3f75df51328496dadb3b33b9a0c0606fcc8c709e9bba0327f8caaa1f5bbe11fdfe89b9e34e5e3411cd3a64e08b268689386b2a83b0e05a997083befc86a74fd3db92c0445f9f253466807cbcacc80592c5befa2441aad8b3ca3c561522eb0571556d6a71e1cbbef325183fe70e92af1bb2d0011b0f56ac2688d7d24364e324bd76a8f86a3274647197c4ae625c44f24891365e62bdfd0e50d13b3a883ce21c1a563620a4023f228078e56a75ec884e376b09a6f03729b28e515b3ebf7179e21017d0c129832a19f9762cba6af38a2ee230f2c2d3e07258ea3f50a92f39f13050578ee0b5523f05a5be71ab0f84d13b0b63eef3632ebd7139de37b37056982d202141582b086ff099aa4f919ce2a346e43f252289bb21d0005c97175764cb9ce717aec0e8ee1b81de516014ee5885d442b2bfbdd6e40c69ac74e149612b21a017e6d0dec38513e4c4049f47fd01c23b56274eb074292a1c40bf5c0725ff83ca0fa1e32c7ed454ab6cbe57507a1929530462531560f8b075d363948dc3ef4c3f48f44853d395999aae8d8efb4aee9e83e490d6a3e76a91aa2569551e8b82b760029c5f38713af907bdaeb0c36079ab3e16dd678762e67c7bf3239deee05de9b11d5ac35dbba0affa55b0682f20bdd42f5f37a6022d962720dbdaf9c7e0f751070489c850349fbd9f9ff486",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc05000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "indefinite length with additional element",
+          "msg" : "313233343030",
+          "sig" : "99c99292436a3f1b088154826d134aa10426f2a1d3a359a316eecaba5537f4f655e99e268d66e146250da025b82a3265d8ba2994f7eec9c9dd87c1232225cd985a40def354a42c4ed35c428743def6871d2c3381bf8586634558c28f5eec0e5020993359037fac4d1ecffc2468e75c88ed996c7bec2fb9c7893a6114381662be9e476653973f9e93d12ba4c738a51e67f813ad34d625c75f99acf5acb3cbf9997c86c52da8b41aa2012f2d492e30e898ae5f79af10db51bb492ea3b25f4bff2f4bc00b35af3aea5666289cb2685917d3c67b32c3eabeabfc79b1fa2722157b8e1d36e503314017d022f6d188a62c6f9aa05ab53ee7851e911dce4ee74c555c3534660271e3fbad5d398e5d0472651079ac2d79d5ce759ef71e0b38f2d2f023c4d9e7126a02773c41c996940b84193fededb07651ccd5b411e5f44d0e14614978842fa7a38c127d781a59b9c1a9f76b50ada3c4835c3ba2691556ec3b90ca5ffc93890ed1a6fdff6b2e40dcb747d1c2f7112e4ae75e79e4061823f330c6931663c4540d4898ed2004209fdda0f65eb06436bc562546d0d49f8181f7aadb15995d2e3468e41bdbe96fb42079dff14133f05175ffc5c6547e76ee232de0887713d9aed4daf1f72b6e131002821b5ad30a0afae478de9b3e4a559bdc8db9fa523b1aa402cb00a55320bc3d1e7bb2bc7cd1a3fe9f367203926a5da28a745d3741b368",
+          "padding" : "305530800609608648016503040203050005000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "a79dac666f7dd5d498b2e84b9b5eb5a88138bdb68e3d2377d85dd1608ccf2eb73cfbacab4f0ecc390c773e8676b88512fa3831093dc88264768a46a7914220b511f64155012df7927eac52a5367a8060e91259d169eedcc6be788dc39bee42b55e1c98f1c8597e5bc5ffe014cf2502dede3899e91ef7284689f726ee9ab4cb405d729452359e210d71219c236e1c66c694d69d36f85374d7f64d9ad4168a45e8e50309944b8bcec31f8131252ce42dcc840431a27a8b2d881bad3cafac25f653e65a182c8ed5afe75c82fb056ef7d6bc22e82c47f3bd0d389873c4decbc0b94313902331595c933bf445feeb6a9908fd2abe26f5744b963fcf6cb225d28612e609c1f443984f2ac84f1c49a8c814b21113d95dffd0307019b675f5b91e65c2d0756782ea1969e9afdba85d18ba0f7b4b5bc24bc06458cb3adb431af2be297387a28bac89f2266bd7dde35c9483183f8239bf7bb253df1305ca218d1d4ff7015f74df1ca7e1b29f7a66844f59e7ed96ed28b4bf53a3e6bc21b348fbcf144d26d4003d3e15ea5e51dfbb40bbf7eda7f5f0ed515532bdff3943f98fcebcf17c1d6cc73825f093a4fa261550417314ff9d53658c9f9aab00839394e91c1d07bce42a816f1a80f0192b76c482affa5c0e85d359e926d43bc595d0e74b44c3c6195bc5fcd3ac29734db6882e344bdb56c0dd367b9478880935bff82381f546d5182965",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "313233343030",
+          "sig" : "5a6d798ed5ea0d324429c38276b8f78bd3dd300f80b5700df516a4ef353587029bccac953861455cec0fd8cafc06dc18d1bf4883c76ba7c52a55213b7b57cae878e6ffa29890c4ee9b1f9f402f81168ca1f8fccdaaa1d3b712c6426e67690b868391d32e11e238c8edba7ac67e52ce364c9dd3302972a14405e43b93e212ed0063474b1227ce409d4e4b9b6c6d100d96670e464272b3db6e2688bf3d3214b766218d14cb2d33c53cfcb70cb955bc8ccac2fe2943e9209fdf046d03bd3d278898aafaf4ce87bcff6fc9ca1145e66fc35534cfe5e9323ac1ca62665e71912d50b3d0510c2f831c5829a33d5b86ed5d67270f21d514745e4a1b1413157c4c059bb43340fd30552a0b2443b3a005f824a3fb3ba930f836c3346553c50fdc4c344e8ba0ebed8c5a095c9fcf3f6725c49738740cbc450fc6a6e07accf91ebdc8d73fe70be3ead564823e4dc86a6cf2766b1d528ad04dd6578f4cd582b23faa2a2da787882012a8239d28ee4a072265eec50637b753c9f03ac890767df638c37834a266251f57a7283efa8ad9f9eab2f636608a7708d41d06c94382c1dd19c057f163e4d1363e93fec15c4739c41e1428ee3e013354739a6321d7149c51740c23e03a3e31ed1856c04fd35aa3f5e974e5900c29257c5033db7930e8e1c3b0c08de956cd89ffd1adde36f330584b533891505df523481c41945842b3136a13fc183b9d0d",
+          "padding" : "3057308006096086480165030402030500060811220000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 145,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "c16831c84203186d55d5391ca48c31c4a7ea17f4c83a773041af8fdbf4f98511ce7122decf06b7ed3a0b3e3a3fd3aa9927984c3a5e59661ae35366b2330caea6c2a33f01134d30fc210529c599e9f4dd0b12142acefef6b218ed6723dd06fe88a55d3e9f3cee052b83044a46e84d39a80eb1ebdbb0db8a0a7caa5231ea82a9738b1393e77965092377723f9a6b8f2d6a35deea4023d87c6e6a46fe9cde5fcec17ce55960a784df02dbfaa300f8e939d9afdc509e7805e253bdd64da9dc3e17cda39a4fa1e183c4e81f6fda5a79df2a4b9cd388509e350c47d5cc039514a25a37ec758ffe196afdaa8174578ba0e91d435580f17270847731123f0a9fe98a7586e6c82da1b9b59b43b283c03ace8da8eb56a3c4b6231893622100b3e277cdc0eeb13897ce9c676c0c1413b6751b220cc6394494962b4fc09aff620eb82d59f823afe1be2341908b3972eb0d17280a67de0156ea3430b498201e5bc38301928983a61473ba28fb8984daf6d1a551489c26d69b9f8761f2d5537e514e453d5d06ba960d298f25a16aeeb2dda3be6072535c336c8c8e96d99105a7b3dd93a310073e520e7cca1b3ca34bbcfd247c981685e7a0b141de1895c555d2feb883bdada9f070edf8cbfe32bcbc9d00a64e636c776fe7dc4ffb271ab92b673b396c90cf3774beeb7fc568dff65b46e73764c3c291c92ee2910604d75d3d890a90ef57461a2b",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 146,
+          "comment" : "indefinite length with garbage",
+          "msg" : "313233343030",
+          "sig" : "8cfbbab87567c1c9444563c93fbbc9900e197b42e47db8e082aee99df5eb7457e50282b28479c59a49a939ae6819eaec9f6e20b3631e4d1a86a23ae7eb5f7d7daa28ee3b5ee22b6ec7baa6541795d5785fd432d9586ea69951c0e2ab370ecda5836ce161abd44d2bf811c9145c40aa0d79eb3b26d2969b9e80d408c8a15f468989b0cd65af62445321c901309a18791eb87bd114dbd7f9a67d9ce717d3ee72c6604813593e885d52a7d6214c286c8b1160a50c816140ceba231b9b16e05f73006b90f63916941916b987d732138c6e8bab399f2ff0ef3e48aba6cbda52eba31555a89dca745c8e20c1dc4711189c49d58f212ab314159294aef96d6f3c3fddbcab72355d8d3b4cf26334543fd9f4e1b7e78314db152de2824f5001c1ec25fdb1cc9ad7a7ad753f4da458e70517e152b17961f27fd33b16222e974add27e34ff67f31da5bcb05c489d7b0bb163e0043d63d2e064a4f626f8d9917a9ac0a6ae79d94630773dee440af99562a7a918d77cac2d3c82e43cbf02a4cc00e4e7dbd149151b78b1aff4de3959b857fb8cf73f8c0da2d683101d4d3bfce02d234c343116836cf47aec0f593ce76f0ad9ce206194b4d830be1008937f5dd6418adbcd58f36c772e3ac456bb7d675f7027b692d3e759cbeb5f6fc57fd1ec70d459dc6153be6f056fa5c0b660cd37c0d3c73a8fe6a368e81c4f50a43d6147ffc057e6642000e",
+          "padding" : "30573080060960864801650304020305000000fe02beef044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 147,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "06d7c10ab9db50ccadcab75474b8d9ac17dd43f24c5fb37ddac738e3e102150975e6b37c63bbcdd987b9675d6f96c1ffe35e74da3c13fcf689a5e0c33ad11db44e87fa3db110e19bb25a6c8abe573a52f0b35e718a2c3365dda52f566c62785e61a47f87f56d870f148ead3571a1569f2e58fc46a8f5f8b7bf03a6494d9bbba960da1ff465815dc697480c8c4d4ac08e960d9f17511aa2bb6347c0d95f33e7e9c444c302019100cba7aeb93eb4dab84d80764559ea3cd3e17ddc8606a279d7bd54f7f2d2e9eeee1ff28427cb8fc1d4d4c552b8c6a52940841a3409f0cdc28eefb5eccbb9e12f604bbc8ca24d02d706f633810810d9bdad9ee77cd4971c6c5c6aaf3718440c7a8191fd1e5b334435152552c34181aabad626384e68329b32b4abc53b157a255b8e077dbd950e9e6cba24cbdc59e54ef056139b5899ee90fcb0113909b0df2ca447ecc860c416c025f9d65f7f17afacb7075c3378660a9432f4e4582d5db2009c5180567522c5a58eb72efb1ab9b4799111f351fb5b0a8326559467ca4363094ce9de5ff622fe15ba857d5b24a091a39cf1bfc0a1f5ca167f3a61ef57bbecb827638abe183f8ff1bdd6231e262a98469a8dd2afa0b436d9c47e121ca9c9bf318ffa0020490e89684662eb540b4eca22282695f422aee1520f290e10c6a66cb7e2153bbd3bb90965784b46711cf93750907b632cd816fa9398614a",
+          "padding" : "3080300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 148,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "313233343030",
+          "sig" : "8bdd32c9ebc98617e93f5c81c5f9b2e65183486cd249dc4efdbe1a91aa9e3aae668f8008db7f2a09c42435766ecf436dc73bcc496e6908a17697129ad1594ea8d169b89198d632907e050340583a7e9580328cadc4c6cce0686eca1cf7cc5445b84846a4042648120de621104f05fea2f5f12ca2a856bb90654dbbe1ab3a15337deb7ef4798fae6eb3b9664d7afdcac73e1972e5abf2f16c8d1672e54c97e321f41d5ace05eaeb9513e2d18cbc2d7a1ad856aaf18bc84cc6cd6d7273279191315970e55838922b3d10fc4d99eedb22bca24e20e586258928343620a8361239b919d03a2ab2a537f2224376576eaa4a67e0e06cf79e335aa39b928e1c4d7a2a7c87ca4401d188715a6063802408582fb486c8890dab132276665f5f173a587fb2c4d3b1e9d50fb62e7ac6c548ca6da19d1a0c22a79d4c190550e109fd3a85a0adde9f00b22a9331eb72bedb1b564a788a5df7b5516388f37f8fb7b534adbd8ab7eb7be5e66963c6fd00bea58fdf570ed9b5b0aa7cebfb17b477e28ecd78461ab8b0cc026d2bde97fe1d1643a971670081ac495396e61d234b591ed07c58081fe938d0ec534eae561cef1999bc5cdb1f20cafe4dc4223ed015a41ceacbeef2e886bb0d3e5e70925f02c8e9f59afb86c5937598fd69d61e69054d5670c484ddd5b2b54a2e39633e611dbef4e4c72a8be0b7fd163ab5686e09030abcf373fe86138f",
+          "padding" : "30553080060960864801650304020305000002beef044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 149,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "9188914ee2bbab207120e12f280d6176cd8e12276eaa94f9c7b7dc66d886879b5641f12ab8b232982db86ad14145191f13ef8909f63108806c49ed9998824845730ab86db5fb3a4b4ab100f79da8af5c10d0372fbd2c9a2448ad5f3b10365fa316762c3031218b4a874b66d14be5ecada07c9e772283a9a678450b60d56fe71a6c2ebb4936c5c89b66dd2b68ba4a5cb1dc2866cc3792e710bf6548e24565ed2b15eb02fea87d239ec8802f802a31bb62591b72f59bfb4a63403d89663d9ab2aaf87d37400aee9c44de5f246571bb2fbf0557ae04a35cb515d42232b0a311fecd31319830ee6d2e505e6b315aedaeb68e7efff3015da5d390521782d32edc15386e102247f81d0607bda75cb15e06bc7bf25bf3063207c36c85a4d1cb3da5b96b638df3c80fa40579209834a1bd980e28da8f1916f62d9bf567e0afae734afc2bb2ca8288487164a3a7941b64af1a86efcd630aff21587ae9d2927faf1534d23765f7e88432a8e2fea53f385540fb992a8ce42e89176c07e66656e03fc875f81b897e002783bdea0eb92d1f1e6a95b676f616c6a03cd1c952477f3744c5473d4e2132e7945c290239428c6f140f79907ee082bfb7e6b96a3f314956acca345e8b832a8f97057a33c70416d2382c5e695173365261fd1f32039215db4bffa1a08a0991ff2bd09b31ee4642f090fb029a95bc1edb6e310cbd50cacff508ec1d2040",
+          "padding" : "30533000300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 150,
+          "comment" : "prepend empty sequence",
+          "msg" : "313233343030",
+          "sig" : "bb7c6dd59e12462ac9895137d99e3c8d96772e6cce695c0c75abada842cb602c1a2a74d048e1ab581b237cca9dc909e6012bec30f40742375af7a0f6a00e85176c22ad0abb49cabfe3b15c90376898357e6b1faf61428cff699046a2b3b534b4c0abca5c1c5494c6549475a468a33e139edaa09ce1f59d58e51b80cb7c7e268b90338735bc3019c289cc610a9dabb6dd8751d00f7a90148db42d812aa53aee5223b76a19cdd0f41697aecbc2860f52aeaad6ea9927bfb1e7eb5b66c44c717c4378150c8df156a8dc9f42b9859a7905d79af61e7ab5e9aa7dacf2177c12c6cbb43c70815cbef1b4d4d7421564b1e6587553b64577961ed23b2da0113ca0b6a86f78d98ad3c91569992b1e1efec5a7accddafa8d806543f0705b0808fc52923575b068cfb227ca0bb8ddd65c421456c1d7028ecaecf56e2f42dab6b02c6b6df257263d941e7540c67cd09db507d1b63c59047ac7859f0d7d311419ce3016af5c2b74f68c3cefc073d5740aff573696c5f6c3e0c5f099f9d25d9ece981961a0591077e2ff0e07e1849bb75874350b68e368c48a1d9648a91904c53dda47b0071577a2217db4ed9edfa33aa44a250664d0a7c7c8defd05cd0c56d029f3c3213d1115cb44a109367617ff6cda8409e8e3eaf7042e49a9391e972b70024877ebae686909bb339d3f7c225256e1735d3b11028bff3ec7ac928f8469c60bc84c58fe7f41",
+          "padding" : "3053300f300006096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 151,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "a292fadf0c5839f4b4c282a8871f366351d2f5889daf595e2d309f750fe7d05961004a614f398ad47138a63a9eb493f4232e8073b30f48245c12d700a7ca19a95af5f128a5203f80709e7ca612a8d3924dcfe28d626351553287de2bba75a6aeab85988566555b22e4b13f8bfa5a81e6e8b66f51758b2de5639bb7bfef99df264d0e0d5f4e475b73ad5533c9862fce2ac8c28463f9a2d9ad6ba7db7d94a387c309c92da156c46a7413bb6fbea0dcc14492f1b8fce4009daadefd6304e864559a1b27e473df7a8a7166054d9eef10511c90ea6c69cc19389529101f917c2562de3a1681fa1b41c789cae6ccdd82f93a9dbdc4775274783d37a8b975945ec05a0d7362941a041e4fe7ba87624a586586010444ac79ffea8d58057d808d3b8c1f2c705b8f77ed5e3907a16ed8685eba933d34f1dae99743a11a6cc6a47c6c168441ccdac81c0a9006ffe79473385d2c9f74ddd55d593af03b209df03eca844a26068c2da0967b7d0f2f4f2f2caca2decdb2ed3b33bab1250a0be60a2b0722cd481921518eb025f4aad96ac49e408b74ec6e372ef7c4921622b250a73de56b2a1721b5db919182eb3a5cad4e0f383d9ec82dd588e544741035be958e9bf14f7f029eec8828d98f8e2efc943efdac302e78e424779dda31d29ecdbfcb583e9573f0a3eb348d9f63d683d9e190f8f7a51c1fc7db924f70cbcdf8c70ac1ecd2176d38f6",
+          "padding" : "3053300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 152,
+          "comment" : "append empty sequence",
+          "msg" : "313233343030",
+          "sig" : "22e0569ccd3187cbe2091997452e48c5a91308a4f9c944f58afc3ba1f9b4c155121b4ebbcbcb90a548bdf98c8e713ba6ca20c701363af4fff2b0784af10414077f5a0747eb60d0f1a38a03d90aa952f3da3d908eb8d0de98d4dadee03d4fd2ddc4ada4389d21da9d8a2cd4ba752ace8be606c0c088e10e7b411c90eaa342c5e8425f5733d0668c586ccbece1482d0ee5855b3a5d93c5105d631df7a1d13c0597d5530b32c13ad5bc7ef5c578e442322267a48b427bc201d30c2010fc6c3e27c40bd924e897e9e4d932467c1389c3465c71374e8a289720332da4a0ec29d7aafdc115515edab8064cfb35c653b99cf651c2fb004dc898a0c4b66af1eb370b1556b3d28814cdce5b7fff88981e6b7707d95eece4b9b75d624b3c6efffc10222e742090dc030542b7c2918bb2c73e20139aa9c383be690e8be74f3ea9eb8881c6c0ab27c16ddf10867a4a7dce3496b1a0a2295357d49b498ff1ea0a27bc7ea182a7a89a7cc53859fe2ac8d876e30d1e810bbefc5a48bee8be7b3e12e83c1dff218814bd6ea42228faa6b69195121f0d079cd887d1da9c1be4e3b3ffa9e4d23a1884d19845e6c76e74d9319884bd31622e09525ae8507c4d4b66e93ab55d57e1dee708542e1ec9ba7baa2fbab8c41c8be4101bb7c75ff7f3178169f93899c0c0b4550276cf166962194091c177179481c620a50290fb85feb83665a399f0afe6d961",
+          "padding" : "3053300f060960864801650304020305003000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 153,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "57f36d681dbd16ac7cc447a9bd77b3f71ec31ae19853de2d9899d8acf7a95002f8e838efe479f56995d56e9822e5928d261017e1ff0042d00c9aa8b2adc00ea72778279e9665a394cba187af5b9ea3c9772cf0721528ca14d1cb6bcf0b13a71e455202641838f6bc353563204147960a5cadd5e370929cbed21150c85df76dfc907d4aa372e66e891adec59aab2460a97f473f0bc1f6480d2bffc94d0662d5a35c6771aaacd07e096f9802116b9b2440bd2c4b85c57556f4fe2d0765fef9c77b2428c39a1117fc26ef7f15fec08da0be03c0fd4617b32038d692aa3999f81bff85d1783a48a6f0973bbb7df191da707b797419c856e589a5acdff0a934b0646bc3e42fcf6f0568f233096209466f0aabb90d9e1ee5945820f46fc4d7d63f12048a542d3d4df4aaf21f43fd7ed74183971b458da1162864fe8c85187868a3916ba95e80cb130cd89116ce3ffac1b9d3090b8d90be18f48d61ac56635fda18498b4bc9a6ac1d41e5cc7f73b67f28dd03572f1efc3a73438652c3e49a6be79c9325439005be0d2d87d9fef65129bd6c9186a01fbc3812738b006e8952c500f4b271694f3cbc7b9dc648be76592fde4fd757f68f79d659ea3edb6b3434a73a125303e1bbe6d24bcd8e0e4b36e70b3e386b181ce8291492eca83fe7633901423ba5d273e1ce2bbb8da9b6afa8ca6870ce99cec7e5d470eee11d1835012fb228ca1c50",
+          "padding" : "30533051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 154,
+          "comment" : "sequence of sequence",
+          "msg" : "313233343030",
+          "sig" : "342ec794c9b7ca5d17ac049f38b6528a847ca8b9a56cbcf05d106b4f3ed1459b3d99df85f2f5c55f1c78aff72007ec8a04a7d484865120907cc4afc8cca65bbab407f60d7548e189ae03bbe3084a5eddb27412d63e2475b2bdd6f7e432e3715222dd21ab3311b70d1199fcf3a1577f94ddfa9ce19029b7d7e9bab354fb471188f03956773b839d4c2e2527d912fc13daefef311e023657e17f2accf7f76056e3ebb24ba42881ea916d88ee494eac687ce75c6af7bc5206a25ccf3988a6c39aadbefacf496ae5864a1176a1f556f70fa9885b4e0fc263d70f11463d1409f6dca8a3fabd5898a8b93add7cad8d46f122173a0b764328e649251ea1184c4d13d7236fd420c8dcdfd821df19e1ffbb082dac30220d3fb7e16bf9711917707842aeab180c3ee05ff2529a3c5be2677768be4ce7aed70c64c8dcb8c7b22fee404fbd9651a7a02d514c62e7dcd8038deeeb8adede607209fa263bdae4a5ac37b8e7f3c6e8c3a9c63ebd250c5846c331638c147e39f3f8ecb6356e9238b779e75da7b94f4924d63211796e88ca11343455a5d1b1f6c3918c311ece01e5fd65f766046452c644319cf4e495e67ae1c108e5b7c50fe5e3fbe3fa75c25ed71c013f81ab53a77dfb8014f357afe68a42da2e41e5f689ecdda7445e3c5996ccf16eb2dbc2b5f4c4601aa4094929986a776def1da70a530bd21d71d3ef62d559eb2727216f0f30",
+          "padding" : "3053300f300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 155,
+          "comment" : "truncated sequence",
+          "msg" : "313233343030",
+          "sig" : "770f83107ea496e0b6104c4d507008ad00b37608d30426b960d834c64614b5ed556771cb945f69af00cf2b055a08c1e2292dbfef0135e913164732348607873891269417b291fa737bdf689a11f48638e55a5242b55698b1c19080fd01fb4b3d2409ec9cc3b8a06c0c6c3244ccfd38ee9af027e84a2ab0cc1a90bc9af780579dbac88ef61a5aad1a8cf6e625eb8b18df7413d4363d68171430088897f02c5751a321d5c44a2de28c4739e974a881a46bb3c7d33021dc40c6baee2b85baa12bc9a54047834ce19f2ac97859b1e3818cb9179fa04f339d0c348f3681f40eb775b0d5ae6df0a653b2816d98f6a3554846f007c357f1f357d4cfecc4177097b0eb88dc4d132d70872f3f51f18617781e6a4f7a3ed74fb653c7946ee6600392a113d446d5a957fec8b797313ecff115eabe61cc7f01af93fa1af6dedb962f26f10d703d4b984e5bc33e74de3c04289bb9a96db7180823bf74245b4ca80262438cea1cf2b552289976b026301fc1570d94fb8767def547f086d91609f5b133755631611b81b3bdf1d63e163c3457b2ff144bd2a98805ebfc29b75ccc605e2a98b75f66ccd4182be191f8558c4b5aaf3446b86ccc1fe74758b85b555a268eba91acec4473bf96729a423f22d3222b042aca2d7838348bcca7563df0659ac6625f1678454e7eeb35ae0a63873f0e0c2632a4ce990826e66b943d70bba0bf562db8a289fe",
+          "padding" : "300f300d06096086480165030402030500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 156,
+          "comment" : "repeat element in sequence",
+          "msg" : "313233343030",
+          "sig" : "bda7b5ffedb9d0072c3dd8fb9ca35213dfb68e61eb9e3ac88e2647e3a7dbfc28de193485f97561b7c72e899416bcb191798cdcff2f50630aea4b296943a970dfb983acd47ec990d55b1ec8c16329ad94320fb1c2c3b896a19619dc204523aca890324f022b41a20bff7ca4356314bc4e952313edf91cbebfe55a65d27ea92290b975adeaf952c5fbc4415e7d8d3bd6e6319b578de5a66fd0a2197736b88d06bbd0a58ca65e1ba649759c70ffc914ab4b88bb81a1c7e6a2d4327944c967019ee63e34adadd5c1c77c2c733d02f93503e532af0a5178be79777a75a30bc2b4a5a374ca61f35f9d166d9bd3eb0aec8cc31b4c7e89bb751d1e38a16df5860e393c7c7ce995a315fb7c9a3d5c7eb38ffdcd3a9888c5b80b19cf35885f2ca26ce78a00d05654ee97c5dca4624f5c763bdac9fa45e8a0f53c3a18859f544421f746d00021aecde92466e5be57731900e57711e49868f826286ccf44133411b566b5300d9205aaa3231d02caa8434043e30b891b4e47969db9cf85ae95617db31e9a9d8834f816552c239649dd0962414cc683a39089144f3c1ee8c622c41c7b9b740a840ccd7f24275618a3f1e68c50f37c8fa073bfce35629c5512de29e50e74cfd66600564469de2500572a3e1867f549590bdd99f20487276246742dd114eca02905ebaade0a3895ee0f3d5fc70249f28612550f1f7a9a0356d4fed33020125b21c7",
+          "padding" : "308193300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 157,
+          "comment" : "removing oid",
+          "msg" : "313233343030",
+          "sig" : "1747d4961c28d37c225f944ffbd967ae2fcb8f5dbd3ec217cfed16b1ed602f3d00b16007f94369a754f240ccfbf089f13a086d7e5cb5c39b4205d24c1b1838ab13618c8e6607d9fa52d08243d09c2ada538ee032fbf4bde8fd0b80ad97a557f6d3deb365481e6895525db6664c10f909a87915091608764707a7afc42a64a5c8a8effd4855485de4457d74765aa82a744614d35c83a21ea8f6b5591eec74a31476f39fce293328f9d3865070942308d64599d704aebaa707e406f3ab55945b7f9165392c13d069527011d813d20638d80eca7fafbdb548161e7f6c8ed25c0e8ed1d0faa3179dd18e75f0132ae11bc1904f7b195a345ea2b78025f0de6d81e05c01bb1734c766eb23e4032febfd5a3617ed3641ba7e18a16cb46ba9cf89dd406f8ed55748e0e9e868578a6575470b1066e336b4bf8fa42fc687d0590c8055866c3bb33d272f435258fcc2208a161d300267e7014b2a6bc95a42638daccff3cdad1570bc3e92746108d56d5ecb4a5fbf7d43062b5906571f41e09a3f7d2c5858b80cc25f9fe54774874539ffeefb485e25f2330893a16a0754b681ef34672eb8b881adb6700f5e19251259a3d20f42fd8b9bf3d9bce3b7b53639564171ae6bf78943009583bb1eca73809b1703f1ddbefc678e3f435c356676803a6072bbd0711d367f28f70338414895bdead3c97688c1e070f77697eef691a8cc609660e4f6bd",
+          "padding" : "304630020500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 158,
+          "comment" : "lonely oid tag",
+          "msg" : "313233343030",
+          "sig" : "bc565c386b1056d48bf0bdfeaba954dca19874a51159f3ed835f2ed3d9023e3752171e70cdaa1f8ad1bb47cc921daab303f371759a5eb35a20722119921f2b3b866d2a806c4ce9ec9ea458b26c3e4d1e1c146b4e5cc855fffe27e4409a4fbf1c847ee6894a74a25a28e1dbdc4c3cc58c645e3b81be590aef4ea038add13779c29dc7c25710750cf516551d53e8a50f42f5117b9c6e139b2e8f1ab64331886a959136f55a03614d230b2f2b076c5d76df5dfe1a3ecdd38718cc6cf9c4d92f63df73b6672591760e46ed7e99ad65a800f15df2b88baed34d70242ae8f1a966f1289fd7beda15105bcafffa314f899016ad723a3e8fe067a7fb7763e019845caf1259b8f82cbf4dfb8682c7ac98d9293be1f0e697dd1c2c5bedac5a8f4c84e7a27f5fa5122007991c34a415ca7c8ea7cb15b16b2d85783e703e6b95ee7e2920fb5ca35b1f0e06b7f3107255e8b3d6041c5c105d225fd3eebd2799fc6677454a8a72d9086f741e0d83b4bf4a4c8051e5f02194328089182de71ad70c083287150c42eb48c613ced2aa51c713fffacf451c7bb03bed05280d3b30c2fb702e9efd31b7e79a3c27e419243da148024186afb40213a5c9b9325987c3abcc40187971b8590f6f4c3f945a63044851390ebb6ea99fc56e682c2c0c1b969f1fd265a7d6d11a38ec96f9ca517ee9849634bdd0cdfee2ecf0af21303ddc97b93e9c12e0a136fb",
+          "padding" : "30473003060500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 159,
+          "comment" : "appending 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "3d8f557eb9f275a861327edb49e64aab8f27f15b0503ef64543cb50003c8e8198d1a21b220ae7fa8f2b9a82d150a6c07777d68ddb51e2ce4954f96936bf62f4f8b0417138a28cdce24f760368cf8a2d316dbe30597fe6060da1ee0a6a8a79774431d63c425a70eccc0ba2e6edd5e6708183f556689235736610049a2ca48e3ea3f4e15966eb95401581d159f89128614af8ba09cb380b814a0e0798ca89413a7ac4dd882b051c95599e6997ea029667103433c8f899b97807ea5e08bfc96e2cf7b1f76bfebd1ee3bdec90b6ecdfec135f97ccdae19d9c2a8f27fd63bd4ebd8f081df8db0e467a6f8ccffc09525edf345558446a919ef25acb69d419264af84cf45ac9756af252d8108cb10fc63fe8d0f15d8ce8c3ba4aaa9131bee157b99821e2fbc479092a9bfaae7b816046826e104b9f89eb2472b1d604ca09d4d530dfbb5ce8ed2cb4caaa0b0bb0c7694b37e64ad1f7bc26a976bf69467c671561270b38b224f0817e0380be488f2a86d1eb753c1470de56eb72a18380979e7d2f4b6a39778b4546f8b4782b19b5cfa41544171ff640a90a418a8f3fbee0e0c7a5e3a30c7fc2beb63a6bb51a071d6fdb3ca6ffbfe9d49890529a4c47452cf34f828e46c2d14437c47fa7a0ed16a1024752b5a9112692ebec7fd4f81d443d52c94849d3a1de7880ca30886f1b7497a18ecb3da314e66b6ac35996b609682307e1846d1efdf",
+          "padding" : "3053300f060b60864801650304020300000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 160,
+          "comment" : "prepending 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "7d26b01b6f272a51683167a0a345b132e2a259b1d2d255d839844bc1587837a366b9313c33a76a8e2c3b0dde023d4b4b45090fa8ee80ee3bc1ccbaa7a69aba4ca0dafaf412aa618b4ade92260a34b60792ab817a199d6a4efb8edbd1a6b1f9a2b9b100eca45f2566f29c9f3af891442804e7f9784ffe9cff2d8c78485640668ff7c0228acb147d66f8e42e72ac8961dd6f1102ed68d9812457c24e87708e4225ac098b4d604f1863fa90a45a6adbb67390d715a393e1229e1736bbc8a7a5cf7b7bf8a5d132122bc94f6056a47dd3f4ab0fb395adc96ea6f1ed3f96d0907e14b80d539abc99d5a5ecd1f7cfe310adf519a15c2cfa0447190c70982c07b35ca89c5717b8cc7bae01cdc7725af43fcd4ccea4175564b1a673c464d83f8c43dba42d0e2785245dffcc104f2e717782886dcddd29ca2a7ba5ee630ecd2ad185ae29647b728aed38924001ef055077ec01fb0333d5a687425a8385e7ec274635e780e0e4ed50dae9602b133111a08ffbd266945cb6e798b45820bfdece8b9ea7ac10253fa822e45071b8cfbe1387b0b7b70ca0a071cb20c5f0487c2ed022123606dd6a9228cbc892ff0c39e4816e8e1974942cc094cfa324e9074d55fc66acf160fb8577b04fa213a4010133211d59714fc1bc284a9d96d9a7351ac644d48e0ef6518142f06efdd702652638ac9725cb769b8c8faad1ac0c0edc344d17483f4f1dc073",
+          "padding" : "3053300f060b00006086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 161,
+          "comment" : "appending unused 0's to oid",
+          "msg" : "313233343030",
+          "sig" : "19f9103e7ea9ba79c0e880bf8724136202b5ad3328108384813ebffa98e1c84c7f335c99473cb72207371222e86a6c6f601bbf017a1bc50a42749730a03bf6722c24a928156b86bccc97906be1ee6abde357a2ec4850719d8507a567cea7d1581c1bfd35b78aee7e44edcdecf768d636a257ad39f9def79e0459bc33aca63d97287e3bb37e41482bcdc0bc41071af3a01a33560db1a150ee744206dc5ea20da2bf75e5d2b7656d85e83d9bf63250d97998e3cbeee6eb3e112f590017c5d0883af97b7d3ed36ec7f8fce6bc84c7cccbcd7f69b205f9ffbe2aa940f929be01e25861efc0bc0701f366a5197e50da18f8d79cd277c48086d1373ed67b983dab817fe44fc1b85411c3205a46f4e209474a8b23c0da698f8c4130ec8e032714a05bb38dab60c79feacaac3907c4a353f21c40f00d3df123fa4327d686576606af1e380472712f65ff064f31ead17c79c87daaa0be792f8074099ce70bae1016a62f941aa124811b1316a6a584401ed8b3c5c58583cb43afb29140c90422c9557b8033413604cbf425a1f3d61e7d8aeb9f989a2b4d2549602f2db514b44b82e7850388cc396f5be16ac1a5d4e919724239c5c784e16d6439589e832031c1a133741ed373a1ea5a7ca08916b7a305ec97dd8f2ec080a051c60f4e7aee36ff5ec62ef81365806ce48a3eaf77ccdf4263b38207fe922ae4beb49621aa396376357b03dc88",
+          "padding" : "3053300f060960864801650304020300000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 162,
+          "comment" : "appending null value to oid",
+          "msg" : "313233343030",
+          "sig" : "a5c5c5ceb2d575014100aa459cee7136fa14894260c42d89da8b5d63e100ff5b504c25103319366e169a99516de7d0e14d37c590b586b5eec989a9cce06141f6e130e377285e4c64bdf57f2821f6aca81db1bb95539016956039d74f7c3f47fd689eed707f5e6defddf68f0d5185debd03d67bd84172481df01a83bfa45787585be655f7a064f8cd86d03fa2537f061edcbf8a141caec80c6a745a77c5fa8a00821582e7975e0f61a5ef0cc5ec2ce48fb793dd28dfd076b67424fd2498ee01a7e6721ce868474bcae0f29ede3a3afc7d6dae8bc35790ddf1e61f170d6609bb9634ed6bcf2482870c700dafa2af9769ddeb7bc98fef19fc04ce1663006d44f388c93cd6f4e4cc56825f341c09073a6252f142404b1521c83b42272899b19b7853d238e50784a9d5424290d1763a441a7709d02e49bec7c7837fffecf13ac1a8fc21764b5d88e333172a660c816ec8472a921dee5782d1037f32f9b938da205411c05f8ba0e869fed9efb7b898558d0a5480ae0092f836279bf4bea3f20d202bd8a2cde9cd118c84cad909be76a5aafccd602158052bf7d2ad765526e26648eab3526a5d5e8d198231e88f487641c8232a9e15e6acb1e72b550c6d60ff47f3247a558e94b2838032b2a43ebcea66e47e554ab8783308c75713d58e57bac17ffd472bbb8ace21cd8aa3dd60e712c76d81b7bec09b23d3db48549dbaa7dcb42e5e9e",
+          "padding" : "3053300f060b60864801650304020305000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 163,
+          "comment" : "truncated length of oid",
+          "msg" : "313233343030",
+          "sig" : "959e078e58b4daeeb3cf822627f6603bf94ecc5bb5d06afe4755fb188b6d7f96223cbf39211a8a37929dfa8c429544723de33d8fc7082625ea483abd525551a0be89a2d3c80d810e7a66b86129675c87cbe54b3b5b636c057a3858a4151890fa45652b673399ccb0fbd66856c43452407adbf856deaa851b3e3fe39df38ce388bf8d368252d3ae1f6290328a3db8b924870eff43e61469aaf2f3a82a5afbd4ffcbff173bab81de4534bbda85f92571021975e06ceda4232b821e8c1fbc8fd897086ebd5a364a212ad0fae314767ff535632abae2e11d2012d40b4f7d4657fa6df28fd0105e6075414cbc05fa139adbd0f777d280ca6cb84c46b819293f165fb288a96a19fe58bb4ce835e0f2fc8827dac483bbd60c5d7398a9723646644c20edd068efa8ee85806a0db06f761bd325fefd07566a34d9f5e61897c39af9d7b953c3deb5817bf01084bfa3f8b1783e2f545abe8ac76f1d1e32ddc5ac66695d976f111e05dd921f4413063b014167e45228eb070a390dcb44443ea6ec44794c86804a64368a9ed51dab5d95b34de8719c602727dbe1952d7a6107a43a54877871ec9a82dca237eaf7ae007a3c35f33f3f39401fa4e134623ef69feee6c2ddca8e25cb8a07f8a696a0b344d046cf3f83d3580b1ae75af0a033a000ed490204ee19c0338e5eac9906dc3d66f5edd402baf5576c7df56eea17070dffe047997851e0a7",
+          "padding" : "3048300406810500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Replacing oid with NULL",
+          "msg" : "313233343030",
+          "sig" : "62f4be8408c6b8884e73392b37df67e92bc0efc3ac3f8d75a226d0d4955177b71d63d25b25353f34d4ecc9b9389958129d3467b57448e75820fc6630cd595c58263a582027dca51a7e84767c2e619fda7746f230e9f0679ba4407e1d2719774e8a4476afed55cd636df12391a55e4f94a37b81747abbbac5d95891e4971c705402e8a9e6d0d9c4a028f36ff2db53a12624086ed6d4deca25801d849d82d79e95d09eebea8d783b2461d1af6ef4ba880aadc1b25c7ab8dfe474f8eff200ee551fb261c620499b7cc36de32f20bdde7891eb0e7683893f3bd9aedf0af9cb06fb090628d0b83ce6cc3f7a22bf337a30e9b3c77e112ded280a391e5c66774da01b282ae7444247f90a4ef58eca6983fa271442b8706f881b3f1ca7c338bd5316f16bc8e7f5887e54f39f1858d2496f724ad49cbf9d1c53bcfa4ceebc9327d977d844ce25cc3ee109a54f33c7fb5ed72149f454b39da42aa64a96227965936e70c79b3d1e0aaa670179e5293e601e30cf18632b00480592403b915408a054cbe42c81a9812e9722fb19d96d9838ce9b5f83e953305278e34ed676f520c49814fe45ff07d85085fcc262f93b622fa26af2adcb5996b241d137aed2af656db1d00b55f16935b04bf6f56961f093632f3876cc1285cf48262b3d5431932d1ab7c509681b98714fe34c59ea8ff235118155d1ca81ec1f7467cbeec0baab014b84d26d62f4",
+          "padding" : "3048300405000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 165,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "93d462a876e26c401e4efed28a56ff2f4328d4b66d26ba4fe5679c334d7466d3b9907d4b4f78e933f91aa5fc18e36b751a6e40fb1221ba375dd55805fc0623834355d39985253dfcffa3802e8719db3a213fd3500506127fd9a3b856f06f1ba54c720458b1a40a7c349df52515615e61c7bb93ebf7871d7f781df46467e4cf37004fbbb87915fbea73368b5108de32ea25954d3ecc1777d1d6f818ed3ebc2b86b7c431df48974c5efccab71c44f8ee7882f9ef8057e87e1c48aeba10952b48f75ae296943988460bd489688a9179d27eca11e3878f7422177ab6f451ebc48d30ea79609b36c4fb16d35f43b0ac1bd2e765841f571413cd2474fef28d695a7daae3a42dbecfb4ccd3c3200b69bf39f725a15d749fca56eeee1b6c43bf59e490ae15237992561c8d7994592b4d911e8d26aa95b131ec228c5da95367e3a4a0ce74f73cf3a83d9ba31eac9673e73361ecc504ee52d943470db9668aaf8263bee6457338c19439cfc1d24a4f8fe20df2270fc32b145ef974d13e666124ddab7c5d879a2255cadcbcc78167e5a6afe692d2711450ed29f5459ca4a65168a090f17e82323b0ed5abd8558509071ec5b90acb7353a6bf5001bafd690c8c35cde3376e104a9c46b3c4d3302dbb00cfcf252d788a003c5cc50dd0e4cdb6a4038e4b7cf347ebaa49a9270c2b846d032b5dfced84571a1cf365c6a83a3f3eae71b97566a6c2",
+          "padding" : "3051300d04096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 166,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "1b1c3f45878014d91b5c757bdab09dc48b38af3068ea80e1c2d412b8518c6b3382d067bbb2308d3e5c109bee3e483c90717d7c6d71554812acbeae40566f205393c4873e63bfae5acfa95ee73559d152595b78f11ab33112fbaf0296b335e6efc4aff2dba640abc0cc76c69cdc0f4748aa1ab1c4ae9792e2801a852b63f297f0d6126fd57df87a628a12cd1b33f9fcfbacf140fd393282cb9c3c7d04a93d3c7e00ddd691095530643260973134504911d98aeffb49d04e8594a261b813995ba19ada639de090bccc10b87ed1f2304a16d2a4b5c0c868b376789d03f291ae8c0bb9ec336d89c5865536bb725fb94a73dcb830f03d49d4567a444b1ddcd1c575fbc27adcaea7b1d98949890acbb554b49bf92924ead8f616c83563ca93874317048a48d71ec0aada0a7b8d05daf073e8095bc9c6fc280c6e35ffe414d75b059efebcb67ce51c3f6efe0967bff90ff5b1ec7cf818d9485f1dc8baa5e8e30119e055448f0d12b0005a0581c4a296e8490ca032bd4ea05ee8d7bc3bcf290cebe11ea116609e13f5fb7b9f2caae9c5fd233c88b8f5ed90b5c8a167187c9510e6e902eb927aa7b315dac3ce141aaa61a3238f29c19a2af0d76c9ee5944257644d81a4e8a3a5ebd4aba0001c4fe6eea68d01a0b0fe715f591e07d7b39f560a91f3559542a8fe9be39424fd852f5dea99524cddecd1c7127be1f6524d5de2acd10c01da74",
+          "padding" : "3051300d05096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 167,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "9de0c820290da7fede3b34f8936c27812fd7c039c23a49117215ee99e2c17ee43c48727b6cf75a404936d393c1c592ef014682d49144263cec28708c1909cd4aec3270ccdc81de872f30b62fc6379ccb5fcf7056c100b2db6e57f4d2dc217a0ec9a3d6e912776c401b11d75b193e4b5d0104a92b0110d8af03740860d1824c5569451183c0f9a8bbbb84b64d2acc0595ff5c68ee203e0a0b148fae4115298ae9efda89aed3c7a5185f8e26b9b846bfee61d98da9bf0bb6cd5e4029dbb10f96e9f30815316399807ab31aaca8b3127ad35e2de8c01f2f63082898ff7913e3b8cbbe9191ca94074c3c99ead0b363d35d64df211462f42a30b280f4933d17b0f9df9ecbf424c07c733fef868c1a42cc380421df8a6c2ad49059d0cf7aa585c2a3314e1a0930a340d30cb4d4dbcb0514a7e8fbbe93a6071352ca91e9bfbce906189b8a319a4f44fbd4aae52477f90b75f82578adbf1310c6c62011279f1bc8c71519428b8b9be578a5532125a47900e9167f33d18307ce54b140778b5502b5a22198d1300ce03d16ebb95c4a927a69b9dafafcebb4435cab780851ce586b746f1bb46186bcffc2e78c58211087948546eb9260742ae938b3f04f10d194a4c937f9affd573be9942945e0720c5d3b4740f6a498259195243e51127a581cd6728f0d8ef67261320737906816810324089d9e535b111355d4bc1b1a1d082fe44820774e",
+          "padding" : "3051300d07096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 168,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "1a14143280cfd555bd05a13d9d546a94f5fc0e7994eba32475ea07f73aaef2f5e914c6018db12835b3168fd8e39cd580918a52ae09df03b93afc2335f05caf5ed944f9210af9223108b50bc49a48627487f7131a12d35d338d840c74961a55b41c099b152d052371ed15a7849dfb37f65a980f628f4033803decab3db64c80cb39cfefd94a38e21c9c650d7734a40262200c1b9265c823b006a3c4d95e1ac3cdd493015e4616b70bf73ff0cdffe5c5c05de8e5007c8d58613fb4280e70e51ccf2680098fd89eec6aa1d860d03a8b2cb722208a68d721713ca6c2c5c514db6e296087a8aa4a65e0be3f721a9abf46aa4767677a0016e27e16fd12d00ea0b9bd30b8f44e698d659aedff34fee6f563ead88fd2d53f2c5260f23d299a4bea1829b85ae898b47d76fe64e6294c1a7629702e5807f9ae131a8ac34c694c8284065e986a4134401675ee4124fecbfb772ef057a5a2602b24e1842b7a4a160bf0ec6b599e9ec7ed6f4bb6be0c27c0c6505aff4b3ab889a3e8b9c24bd329d39a362b8446a9b01827330782323c455466855f5de197463fe4d9810d69490b12cb92023b4a02a01429d8e03f22dfe9f614aa326f0a7a0d153cc6f4f7c9b5d3916fbbf115839c7250657f03e17931269d043f16612be118f3d64b0a8a85fd57ac7fbc02ba7a5212c5e71813a3f711245c68a3b28db4723462af16e1a3db94e79c344b7614b4",
+          "padding" : "3051300d08096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 169,
+          "comment" : "changing tag value of oid",
+          "msg" : "313233343030",
+          "sig" : "76afacb11b73f2de01c01482b3b9c0e0be0a814bd0f9dbfe73e5acc49d4089d7702dcd9cc4bb3a4efb3036c8ff062fd816b41ce2b144c6f7fccc9c6edec44609d13d052011ba6994c74c30c5e17670ba07868aeeeff18a65a70408fa422428bba9131b8586c2a4ac2af0aac2c2a0a2a56f3126d1b76dd2608a3d9512b9396559491a98c761226ed435ac657172664b865fc5a038747f3ee225694de434838e0b87d14fed71a9046fb36434104051a17a658d76b129bffd25a11098137f561cc4f2e3a72cc66619658848dafc5fabce6707acf3c919ca2f88fd4117eb3b9805d2a00dc65da7ae9656e77d671872d73dcc43e72a0c94846061cd7ab361f0e3d33e03d72732e39545e6283da8b50726c6ccaec0ff96c5a3504da85b11e61e167a7965ed18b828bce7606f1aabaf66701c2d7c23a6c7dabbe8e087ce5302d16b2bdfc372be4f7002e7d3204b5d410edab015995dbc4258205a76d9ba1981dac70aaff4059c87255ba196140a0a2b8e484edbaf242dd3e14780c499c78c5c809cb11fa0329e17d47d890b4011838aee545b4312517527eb59fff5e52a125ce8dbb9dae5f72f3577344cd4f2330f09758e36b50dfd38006382767393c308c0acf9f4bb0c580bee3eb619b8d94a30568eb5a67b32e602370f7023c363c7b6d8ac38cc2666914ebfbe0b190a032405d73c7c2a8cfd1349e4fecb90d7e50575e3d3f5be4a",
+          "padding" : "3051300dff096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 170,
+          "comment" : "dropping value of oid",
+          "msg" : "313233343030",
+          "sig" : "a08cc360ffd7fa1cdf82be1d2ee5a39b9dfa9d34eec9a7e5125444a080ce3ef49061d8f188facd751b06abf4ab4360ae343c245244bee8f6517c894491c2dbfd94cffca8344066009a4be1275dcbf3932d58566e8d71be2365d3ac081350726d429cc0a4edeec41713a3496ffcc476451862190142d895449851f07a79bdd3387697dc0b76a1476ecfe9cb05675b49a12f3552d0c3d90239899921fb41bd26774e00ab270296300c7dfc577f854d7868600f8ac69d7efa5cf331095ac1300d410c6f25ad48894474e9008c91cdfeb187feaf47c6f4cab4e4cf83b300b19a566abdd957677eb63d30c53c4feafd3bf37e2bd4680f2c4e473a1ceb44dd7ff18e99dca6c506feac0785255f91a03267a3268603e4d39ccf16880a436c2c87c79e075dd4e712577cb9dbe0dec4f42328cd1f369478ab43ed516bdb45d91fb237194149ee89dc656e0814f951ad30f75ea04a0ecdf8e3d4657d47290502d67bd1fe18b9530765e4db10211da2e1470849d7021a39cd4e7b954464296595064883374cd3ad5ac417fa48fb2816d5896bd7f0b588be9e483246c48afd9898b49889d13af851d064cdcbb4ce35747b15d1c7a050aaf494ba7e79687f59f326acae771742ac7f7b0f1a680321d0356f97164203260e187d661fe9387b9d20f8f26e3871eb0ae331b4962599490743e1ed509c50d55721be351ab7662f2d9e039699ebaa52",
+          "padding" : "3048300406000500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 171,
+          "comment" : "using composition for oid",
+          "msg" : "313233343030",
+          "sig" : "bb59b5832cc0b4cb649cf9bd8548cc025f6596fe73c3315684ccce1b79b453093328336edfd8562045a4ba413aec0ae63678fef9402cb0aadeceb20f9419a654d81c83ef0e4183797a054091dd8fb06d8614ab0d266cbef3b871bdb5643dbe7a93fb0a733166a556993a60809083ef5a4bc70b525c5c0de3ef220d725059561436ec2162c3beb9793f4e9849e7b89e0a26c44446e52c514e8000c9f206676fd6a034d54a77c31ca73c2396f58048d6c90148fd6d2924bf125e3b126edd1f17fdf31498ba04b7b86da5f1c4a6843a7bf6394d021b1692acc641d0956ff3bd6b7663a4759eafe920eb28a363ad12cfbbf654343aca9f670ce6757ee12f21446c23ea32ac46b79d10a3bb55683caa97450607b5473920cf10c7059b5719430102dc511b039f9a55b9e1824332c9b0e29608666c0f1ca37c8c299a9c1c5ecb25e2b9695903f8d406c98c0ca3d74052f09d16cd2f4a607d70732b8d877285c9089ae59dac80e031e563283270dffc024dbd8e70120d44b0fd36c643c135a811dc042fa376eaddf2e3c1fd5f2a23c0b7f481f5a053da7a4971d911db3acc6d4a3e60b63b291debff77fb55acc5b7081dc75c651706986e90e9f77edc2dcf721ead020f86bbb1ba439ffd165d127e51063b0916f36ca292eae26962cf9a59f68ef8d200652d42d13c80ce7f0b5817fa9c701600a4ec3fe770a4b42aa8e6016cd16d8dab",
+          "padding" : "30553011260d060160060886480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 172,
+          "comment" : "modify first byte of oid",
+          "msg" : "313233343030",
+          "sig" : "557a0cbd9b8b16b5c9603b2d36e541313d22a1904f446dbd308308679a096c2fc3110d4e98a474e0f5a7e04628f066b4480697dd29d63df810ef7f1890d5b16c3a7172200dbf7eff2862bbe6eea017cb8c98097bec1f342a985ed7d9e462a55da249f9a523c80b1cb5def853ce94cf43d22243c028c84201a993d2eb48a876722f939aaa81a9e92e65b07e541894e5bc23d8cc901b121dcb6f543a12272a81c8274bcf996bb010188d99efbbe07403c708085e5e7b24ac09e96b2fbe561c2d4ad49ab3f9d45ed7c2bfecdd26f089b9bbb3361c848607fb50ebb00fdcd8bc9dea6cd311ea49be89b1fc59063ef2da7a9b03c5b8aff5478e7d8a7aab8b271215d4f26afb0d6b71b4520eedb4687c72e26680e79c20ac06f7a245b0257567d3f325c186f891289513848c7066acb96241b1efc2bf2a2908f39576c9976131d89e4d1f7c71f0a4b97238d05e7e46cd207c0c864df8b8df368160fd766efb98cccd879afe48cf448eea4f660b069be0b15a6bbd561671997c5d92d0e1c0d24a52b5ac82aeceebe419b6e092ecc02b8f151a33108150301bffaacd8de624e4c50ef1e392063b9249ac6d2b7e747e5899619df886e41f92571d3015a1eccf1d1de6bf469bc54442161ecaa56d447c99ee5224e1d049e626faa95cd1b099151fe6091660fdd2dc9aae83b4c2228447b36a440c639bde2cf65a14fe778aaedb21fda83a1d",
+          "padding" : "3051300d06096286480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 173,
+          "comment" : "modify last byte of oid",
+          "msg" : "313233343030",
+          "sig" : "857a7a9076c1d8345142a6f66d251882cd958629e8e4a101f22d75bf0080a964916c5224484f4ac8de771c2ae210567b09bf49e8842e08370c874bec3cb4472cbf597f4877571f9a89e01e2d7247229103a7d9086cdd86c488dd51065ad8dfed3b30c9505881f4daed5f86ee6e8ee2eebc995b8da2e8b3f44f768bad620192f5e798b31b6eae9abad0b6db18366958b5e6c04894af47deaa57dc443d03391adcd5fcaba34dafe33dc8bea6042fad8d5313cf8b5b7079bc3a3a7b68c36777ab2e6f6b72cdcd93ce0297509f3db4fbe69a628696b13f705622e679a0dcc64037aecdc5b3b379692c048162fb8290ac71f017e82a85a8e6550f53872ada3efad72da3632514e50e709f4ca60c1f079deb46e70724f7db31f1c47fbfafebe5be9e78168ee135a629b2daffecf3077b8456ff91dc520b344461bf2c8be7de3f9889a67d0811695efc5799853c23640cdf5f60d837019ea6a536e27ea9c16ab5a7014e1c4fb6005d74a74bf1921a6d7ec725e336d10e1d649f4731b4ec2be54ff6e61ccec57e07f6a90a80085897f584b371db73b27d0e8ca29dc7fc35a809f9c69d7a3bef3740c93b0aeb3938b59b018009a4580e35337599dd56b8d06c63025fd12952fa1f292e053adee0a8cfea8cc8b5ee5d01ed4f141356e294bf6056eb712248a0884508075f40d0facddeebba5d73e6a9dabddd829aead07c7e473859e479b3",
+          "padding" : "3051300d06096086480165030402830500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 174,
+          "comment" : "truncate oid",
+          "msg" : "313233343030",
+          "sig" : "3722ef91b2465c53451d59972adbbe6b7f65bf07c91677858924b5b5b4ec59422d6d57ec065fc652357963d616593862e74dda3b43d2f93fafb8366d4a7c708e3d0ec1098c6f92a53b7067bf73054662385957ed8efaa09675436154fe3b069614a0c61f58e78ee5e18dbf8daa2cc43a3bf46e4a71bc3db0a80c719cdcb7e009fe6f0757861a8d6e3c59a5596c428bb1767e5648cf682d03f5d0794061bebb57ef1b817956e697bc5ff3746510f29242eb7a4ccfdcab6b9a9daa343f4d86763f498fb71cfd842f9f8d1f7ddd766959099066a2adf21170288b2dec74ceff77728cb1f3a75c5897c0ff781564f628286e61f21b25dd5b36f8c8682f596b783a29d84d7b450c910c2b6b20434f377c304d08983af0b12e16a700f063b370882ad64ef9310f5716ec50402f33b336ee84a6cc96f115982ddd3d35a9494ed3d347d70f61cc699fdc7a7a1fe8808cad7f13e52dabf86ad417bb76614c0cee7e63a53f5f5e5b7e7bf04e94ed42d5db1d1e70455ffee317ee167f041b2619b6549dc6627c954f65b4b06171889429a21bf286cc6b80cc18db089fbc00ec827e3360fa1ce1f4224ada5f778c7e433863afe19350a248bb78b7c5aa6ecba8c2f8b9936980611c4260ac3cbf4d821a22a3d886f598085c3efc8818a95336ee6a748d0c811b7256f3ab8eee183597956f793a44e85be9f87e92b6b197baf7cf2f7a08c5f9c3",
+          "padding" : "3050300c060860864801650304020500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 175,
+          "comment" : "truncate oid",
+          "msg" : "313233343030",
+          "sig" : "8d1a54e2472f14039f1a2e1019fc6ae4159ad89f6480d141b78ebd8cd4837246a94c5938a67f2d2e05b5d5d196ae055d26e1b4fda469d6b8068163bef5bed0be6d098deb84e7007c06b3b6eaf14a07130b44dd01c14d7cd0d3fc2579c220f2822628edb9adb9aa5509858c14d242bf1d77d56a10e379e370c892d1ff2becf19aebbef2302aba66763c853e575c29421ed66f842b859c222ac2c0636078057adc1a185511085111d279b520cb2fe43b011554e8e7e37baf2a9a51003630759a9b6f6d2f18074751327ed739f39ad69f5275f340bfa985a4adcf865478278430eaca43d99cfe865bfe279ce417c10cff0f8cdf4d73a5e5ce77c95a0e306f3500b19055aba5b389de3d7809498725469f4396f05c2eb89a09f55cbfa087202d7c9b1f25fcca58f3908199a9e733f57aabdd3ca42bf2ddcc5612c81cd8619bce0c3b339ba8e9010535513d2aae38953b573800a4924a3e26a5739af64fb0667370038ec0e2f09b053e1c32312c72583ae40b78846c7fc128fb17b5f5cf88b276eaab83c54ce2db2b8d6ffb6cb8f6d0dea42f6c4b8a01999285a55c2e48aab2a29ee15d6101b699bd7d361436a6547788b68d40b340af8e61ed6caa189e1d095fe735bf98dd4fa8730c204f67dce1faa021238a1dcd34b14869d8ecf8bc283f964cfb7c8f01e4d1ed92204316b5f3eb5355adfc8f04ba97a2b9f0f221ba103551458e",
+          "padding" : "3050300c060886480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 176,
+          "comment" : "wrong oid",
+          "msg" : "313233343030",
+          "sig" : "4beb33042824e7aec0ac557ff6eb9f9706d5d2674c14a76ed4e8b0daaf77b61f4a17e05beaf9eef2fc87d21e91d5f264844417011799334430ab58bb8421801511bb0255b1feac0309e6cdc0a5b56e8278bd822a2025ab6612f6b9e7c540abae7e0381399e0531a488adf56ae1cc7955c4cfd169db281249c6a300e267510552c257479906145cdad5779a738490794f1362f16ace172d01fd5af1e6925f08e8952c51c103bacd09bba4274540c25faacc090749140c13d2798fcfbc544e32f674906104f99828ba5a5364c5628e9e9dd159422b14b2d1de6dfce16eff1689878b0b35d94f8fdcd21282cbbc38da0becf7416446b6be9b62d0931370254eafe7eafd24f61c701082dfd6d787be273b5211a843f9b819559c0b64d75c20c0626d5b64f5b4960e629b10f3e1979499540f332476398dba841839c47aadc9d33a6f962b20fe2ef6242fbf3ea61efbc7c73546f701015037d85f0b440fe99737cf5b90e5bc205186e4e49a775a01c89fdeb7b51e23c178a7a926fa1d87ae8c0013e3e5138504402aaedc6b25200044a170239105460f8370b4da8fa3ef0330ab2360c5f9396033d5b3c0eacc73fbdfb9b87b22594df1de19a16c375e687a7f0e660242fc35cf21aecbe86533bed1eda52cd6e3f99475143697ce0fa8664512b42dc92cfd215042c95b621825f343b70361db55cc1bf0f72db03a27cdde0d3537c8ed",
+          "padding" : "3052300e060a326230653033303231610500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 177,
+          "comment" : "wrong oid",
+          "msg" : "313233343030",
+          "sig" : "1e04efbe2068c166c7e2ebc1c04a5fe2575d4fb320d85d23b951769cfe7be2b7ddf218651e7b09257c1f84b269489d32b24f28f1fd529a7795168889040c4a3321f352ce5a017ed923f21f7152699c020afa87f7e705b51329f120d61199db2a5cd792da1d213448d95d085f6160e554f86ca7bbe4a6f7719a7c19e4b0c2d77c5e3ffbe4cc6e1286a2cb701b1b8e93fd220af4874a4e76d168305ec56444562cc0f542864671d4f47cf746c69c96e828fba0bfe131d0e14f1ba3f8aff3af5628defa210ada0a8bb92d9154d83e8def78cb8365aa4e2e35f9900aab2bcfcea12a985366ea2bc79be5f4647b8f69dac992d44136ca3f84ddd90d1a74cdc12fef9d915c90c2fc07386becf3702e2d8bf9ce6911539fdaff9ca744f81b182400193fe0f069e19882b125758ff5c5ebb863c5b8ecd41433f65436c746bfd842a78b7c0f6bff5fc238d62b05ce01d145f5ba93dd9bc5bcfc38cef5b66551fddec5a4cc1fc64ec467fd8b51e814b39874c593c9c24bf45e61c5822c2990e51f43870a0fbd00fa309adb0ac38c89d6e48ffc9d4211f87417a9c7c2fe7fadbc76f8ab9985da3bab6abc2b252404ee126ae76668970b0ef6fb921778786ef80a80bf45fe922f0920256d304da0f04b0993f0a75883f8b63ce497d6bae43e5c939925b0490de86807ecdad3781f8bd57e528353b89ddd49d9385d426c69a69264d3e316b6c9",
+          "padding" : "305a301606123630383634383031363530333034303230310500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 178,
+          "comment" : "longer oid",
+          "msg" : "313233343030",
+          "sig" : "522304296688eddce66ed041c3abf3b76fde0116bf277031c73953a0becb66d5d10bf2418caf41bf2bf6b48e3a346a92702fe69f90e4ec175c2de0a3ef4598f61dabc1d0216bb2d010acabd112305f247043b77e1d5cd687442d902472e3b09a26fb609aa919332c652b56c943986c188761ac46b8c6ffdf91e9f552358001fdf0944f038fd7b9bbc4200a21a343395777bd69b45b9a7d5472d3c35c4ea009a5de0f6281ef91319091b0a2bc71b97130eb4a41f1a47098f14f66c9dc68eb5b4a5b2f761b912f2121ed12007f594b94a30d25e38384f98ff45ea48f30aeb20fe9610aafd68d65d2b875722798740891277e44e844910d03bf70eda19c733693c90e397a828f3ee8dd0e52758d6bf42b2380f4ab7da1f36dc77c47a5488b715b5f884dd4f245d04e34d0551a872558bb6107275e0b5fb29d41e459b50f5dbf2fc4b582603eeff2234bbbbaae50dd0f577f7754964d93e78763153db7c3b0c7bd64a3c3cb7a1413f7a65d6d1375604de109a0432e854ac82527534892948c1a5ce1c5c01497270abf30f78c349abaa14048c00380ba5ed3a3e418a49414501201b44c0f8093dbbfddc3592ece3f16d15217c7f851d9b66977dbffdf2e98c705560f96ca6bf07cc73a187794d2b1dedaea3a26ea3a101141170377e332779eecbcc94aff80c92b42a2fc434c61e4e66cf9f823fa52f88a0725f69e146437ca8ba5fb",
+          "padding" : "305c3018061436303836343830313635303330343032303330310500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 179,
+          "comment" : "oid with modified node",
+          "msg" : "313233343030",
+          "sig" : "457618f9f481945cffcf1f874c5e38fe7c0b6310b3493e23592e7033d07ce5ca9d41400d8d4d97193b5fbd52c05bbc9c1729b612288db74b57b2923cf496ab291c843b01afd5156bf0187f9007c57928108f1ba7c5eac7d9656db05a457e8ae8e41080511f8c3942d7aa17a9ad52e8387e68edabb94f2dbcb6cd9997e463e83a8554124af66faac2eee8cf2819968d83684f2d6d9edfb067bf052a3b1624bfc1b360b3bc531a270e91ebe01284d202d8fea7736d076a2e32b11b2cd8d7829cb63818ed51381f9bb67f7e1f328dbf139aad3d62b32f42973094eaf5272e41e133320ad0fbcab6c7c8b73a2b9f173ad3627419b69630dbb8673e4ee2eb72be49682d873e8061be6b04fe93d3c540b2a7d7d34da21a447d14da66a457cdf0afd6b496b8575aa0d14f1839919d6c3c17147dd5ee7e11208a9425ee83b1f69a855853263029a125b25add787d5263e4dd0311c16cab624dc221d176d78e2722124ac38a71f6f4761bb62de50f8a2e8b2bc3ce3146664de99ace7ad458088ef97ca2d0b59882d6a525ad9b316cfbe882d2d9a3e763b14d2a600f63fea356c19d9ee3138a95c35dfcbde201637a9327bc1cd85ecb93422134d10b9938f18f0565e0031e57a83fe7145964eb79acc2b657a0305421af387859388e78b5eee782167dd54a70e89be94c602fecadaec951e3a409f5e0fc370bbab026a7fcb4e28a18a2dbc4",
+          "padding" : "305a301606123630383634383031363530333034303231330500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 180,
+          "comment" : "oid with modified node",
+          "msg" : "313233343030",
+          "sig" : "9b19d42349a3edf406a827639d8655793e170b7adc259f1f63b0f6d7074051210aae941777b71685ac18a94e46604f8ab5915fa8c34c9d178cecf7eeb26294382554380629c12ab2d129c2d40cf09c8db8fafd69602ac5e1ab6a5cc7cf0d346080028fdd4396d9f0e7e032d33b29501ca9fc9b05f6fd2b2a67bf7dcb7411781c76fbee55ff1c179f8e0812550e261b8a06fb575944702eb13b5f99af7b920e44ac9df42db1b9ea3775042929c6a984992781b802a7c88ac14579fed757cede07e6cc46f7dc17cc024f8316f58137834072a3711eb725a9043126222c4d715c48dd4f8e65c06afa5a927f3d39dd0caad7fbd89f3d7219cfb9d028915b89886845326e1d5a18dd34a78c84bc2d28d872f2ac3e4026459535a2c929fd711d8aa03063063328b83bc330b2062e2b186889adeaca2232162a115dd4bd256e51872624fac294845d22533be374a4bb21273f567306b7d2b3b26b81e68065eb43ece48a1c7a4a13e13b48bab6ad0ee2c64f9d6fa169e8ef6d778954bfcfc884b6346ea65532a30268355975cce9907f7b0fb8e9160e0c59a45ec065d0f8f448b7d88edc604fad4a049846dc7db7ff7246d29dc86d625e8d13153113c0303e794a57394d065888274d1ea5a48f927f0a471125ecbffa8efb510199f1586986c3b8b4124d7c324ed5f1b2067ff275b3f164e07fe11539885a77d4fa5f0401a45d5ab1e5bc",
+          "padding" : "3062301e061a36303836343830313635303330343032383838303830383030330500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 181,
+          "comment" : "large integer in oid",
+          "msg" : "313233343030",
+          "sig" : "79e26bc7d1d180fc4ee14625d2207321e61c91fa9454143e1b3888b4bf4ad12c7dfb54428df91be2cef260d2c13b003a3cb3f4908c2f33d94e99104ad1c98ec0bcd65502f6130ed7c4ca14aa6711e950f5a0520431d199f502223567804929e5d24fddfb9f69516ed0e34fe843ef4a102dd90f1e6791020fcd20b4e170389ab29595fdecf7a66dd7243747480844ac2770436a92d630b90677c2540ad5d9db3bbd04663d0d62349bfc74fb3e8c6b41e0043ff32d8f108e6e74ddd0910f1df577eb9e7e155e411b78b791e9d2f2172378c4def112b8527a63114b3cb3d21077f2680d7d39b895a2000697a7f0355d5d0832aa4b435b37e9ef80e5d55eb46a22514b78dc624ec583c169cf204a1a928e26b10b98a35f65a7dfb0041439f200b127013b5cf86ae05ba3c1b6ad3ebc3ea513eebe4b280ca323dc3b943aa8980fd69b7c3c9378bbb86302cd298245a45e27dd3265f630e2799157fc83f20a1a7ec945c536d69abc139f255d8bad3dc2fe1804565ab7ff4af7693b015c7adbb74ce6182d0684ae034dd01e4d20ca16462599511f000cfa297b527f9f5391b08b9f7cec59f8ef962c7e4755f2086d7105d0fddad4eb1ac8fc555057c5d2a8a7f79465f7e1782dcefca3b04591fde2dfacc96484513dfa761e088edf99346d876d1425cb38c8f7e69a2dae1950fc863de2ef395e35e086922b4778e6481f7532dfca4f9e",
+          "padding" : "306c302806243630383634383031363530333034303238323830383038303830383038303830383030330500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 182,
+          "comment" : "oid with invalid node",
+          "msg" : "313233343030",
+          "sig" : "25622d82412a7013e01afb4338fbe55179ada626af37459a20c8827399a61baa42260f04ee03c38f2e19b7ca7a429c4d3879fb618630a38ef497c0197814d5f91e2d9d07258d290dba1402b6b5d95b9c1fdd6066e4b82daede5387bfcfa899a880ac8efae5ba43c14b4a15b52a39e86220cd47fe4a27593e6a7c7b5adca5e7b2d2d05178daf1d4503ee8b64be7a5db79073f8b4b936b5cfde4d1b4bb8c8ab1e5072877514735684aeec0ccd16b128539f985231b6e01db91859f9987ca254ab6dbeab64088e0228e3e28b858daa0d1bb632c625488ba9c254fd9c9ba8170f385971962e825a50b67e1ef4809547a806799b4561eb4431ea20cf9e3ce91a69783b3153b1dc5c9a516ddd162d74e403a2eed8dde7e8dc74386b26a787a9859e949390adaffa1d37e6731469388ca6f3620d27e11ee49f3b7354885476fc3e7ffd094e1c9273912136197004828df7a0c7d85ce80ab3f27d568e564183f9f975d87b65a8b892862b2d82ed43d5222a3aca49680b1a28f6b1f1b119333b276e8125544637636c2bc48c90ee946823fc9744174d8a28509a2d3b37e7acac81357a28348e1aaa5669a8c8d0e07d660cb1e85727a37e8bf237507b64d1520d63d6658c7c8d5c3cf9f106a2f142b020d220a9155ddd777693018f089c4d5c4a66ed1d7b2c7e06395950e7c880d348084560d52d19e839b727569717367449aaaabe154c2",
+          "padding" : "305d301906153630383634383031363530333034303230336530330500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 183,
+          "comment" : "oid with invalid node",
+          "msg" : "313233343030",
+          "sig" : "43f736eaeec5b5ae03b1c68c460e115d20a6c1b456f5847599aed9af2900c6316bc090729d466a83b6879834108dda0325770913f14b248a71707a52fa2982db368f86b4eab52dcca31c07cc5e7ef1634c6a1b25e273fb35d3f802571278f79b8c27a6cf2a170205c493fc457248170ecbca4ebd0b42bc3d03198489680fcb5e58bb31c2b22d2aa1b99d8c8c3ccf42fb784c878f3c7632a656781ef638381c3604b0f4d84fc7086c0000664fb6bab33e55105dfd5dfbef634905dafbc12da2a25df3bd8530440fa636812da39c5faf26e76261a4ff947795156e9d159d6bd5b0c9c9b86ee1818d31dac3f541a4bb6b25a02df82057be4f9320c8be9764e989aaeab72d8559dd35bb1bfc221940624db06f46e467936bbeb1b97018b7e632d770447bdf7553d9f696b6ef56f2b737aa6171791d756c0809b3d50c5cde737492b87a9c5517c6607df77ca126e08e34139664137b6bd30ce2e6d97a9e2b8c4d4d4441c71697697bc3ff75fcd980d6e65e8ad8a0b3d29bc952e07c19a5bc0f5f09357cb664dc8b79ef7279f047ff1a7592b5ac8b1bc98b99a426da08a2178f76d96624ce84e1996e3b4af9e978e041c5e326f3c9e0db0fdd7787e2c138063db4415182e9af87c74cd36fef96761703e5843aca4c3963f484b90b1b800d189ff727debaa2773e08c8ca70c6f762bbc935687f4bb103b53805495cc0bd6caedee834eb",
+          "padding" : "3052300e060a608086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 184,
+          "comment" : "appending 0's to null",
+          "msg" : "313233343030",
+          "sig" : "2fcc3280d48b7b6d5e9bcaa5d4dcbe70cad1bae22b1c4f407591021f4afab50c0a1f454329f8ba4cdfa69f4a7bb6fbec6744e32c78d9bdc6d585f30160e17117fa364638215531afbef6822ebdaa6ed89708343e14c843a24a6c152820b9e130b1a1a406270f50db5b0f2eb63204dfdc8e4230738ab9f43bb982a2435988e1e44ca08b77dade0c55e57b35db27e4cb9af9a35d634a69f6869110b219b2d8d231ce92aa5c1c2d8bfa78d67cac339e4af01a238e6cbf5dfbd58b92765d7818963f68e107db5388fd2b430b1541f2560c79a861288c17bd066d51672866ae8f9796ac5385ea4b4c165f2860dbb950435d830cf9d920f79a42507af93ee82876c02dc097b6c47c56a6bf3b1b165b98bd34c4335ab212b66c99c43894f67ae20e3e5730fb1fc1af38333f46f4aa8c745ed0f58b5d2f5b48a98fad75e922864eeb43e339b9ff8768f71f92a3bfc5806e34e02f2f3769c6d36f3a4d9bc13d939944bbbe1449735f9d848d2a4681e0dfd426115397bca1df86ea5739871722b0191dda8dbf93be29a8b8ecc154ef4810022500533425891991c3c8fd5540263a69a13fae3cdcc72c337d7e37571e9a3a590e82ce6a05daa260ea38f7fda25737716ac5a3b558bbcb5055e473f0d87cc8a171a4766432e66ab84177f924eec6e8504f658571ef737f466407717f30c7276306995831487ed1c6031bfa8929b68e51fb341f",
+          "padding" : "3053300f060960864801650304020305020000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 185,
+          "comment" : "appending null value to null",
+          "msg" : "313233343030",
+          "sig" : "6f76a4e433c0c2702e0bef87379cb827927b9350f9a6537aa67bc7812457c4406de7684ba9614e09e75ab4a54ae09717c7147c69ac0ce8b9b962f5842eed73aba82ba2db71c39337948fb4a2fa00ac018b5cf19e0dd9824f5b836ea9c04ac875abd8b8efdcffe7e6e17e75782b4c93ce0bc186a99e8567d9fe089dda051aa77b82f329dce58ff7228fde880d5e86342e3d049118f8e4c9034f2d586f3376851ead317eb691e9975f08f1767bdf8c5db321428fa7899e23ebbe11e2b5e7575805319a3b18a1e0fb7e763f6390434df2ec5062f4a4223b353bd12760d09636829a740cb3b6761536c1aa7f50f36711180ed2925d1aaa6bdd38d5d5c45b9b5f9c09de47751449ad6962cffccc6eb9a4939f7551a18f3cfb3dcfe13f1c160eef9de768b23faf85b480a2342216238ce93c59d202d861dabb693639695cbbd8009151ff64e5e3eab3bcb5e6a539bdd8d4bb5434f30a12a12ea92ae5d21dfacecbf559a2ce1dc9e5082e2217cea6c122b3468f01c737f0be0391723c8448f3372d88c9dc46cd40041e11a592606f6409c1fd831fd51fd6adc8cced49e62e9466cba70d177adb0a295019011d463b153c5e05a6c1177548c3dfac3ac1b2e8978e39ce1923244cf10dab652d250b2cd6abae03df960add94e9519dd801f4dcf2242cd5c22e287b34091fc42f6644e83006402dfce2b82bf8acebd4b65a9738642963bf82",
+          "padding" : "3053300f060960864801650304020305020500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 186,
+          "comment" : "truncated length of null",
+          "msg" : "313233343030",
+          "sig" : "b1cb3df9c5d8e04a90cbaf83a03e1e976535db1d66372c4efa3370948e546cc310d827fad9227a7e35923d8b2fc56dfa1039d25968f984e5f22614cb2dd0e5dec8e1719fc7bd7018843889e3fca0c9e9ffa6de47fdf67c266398de961c51e7831475b0b8021a0c587617d62eef417b93e675630ca26d8f41111b20d944c39f47adaff1b636d7fa1ee000fca852038b3ccbb05d99a2fd664a50129e5062b8e5ab04a65476aa60dfc872345be0139f4e30f107f7e1d40a7a01a7889592c5ab40c2bfb188f345d3086af7e725b5a209420798e30084561fd5ac1626e93ccbc42e9c1f283073bf91232cb48f571c32c71e4b47c2575295726340cfb69112877501618575748da81e7f8fc6f898003ab89a11a8d7e3647c72f4389d30b265020e99814ea8bf0406bd75292aa55e69c5a168f5915bb1e9df30be1bfc1f097bcfe78d6f7ea963f8f0482f2a122d1b3d3c66465b6d7d035ac5249d4a3a2c54fdae260a9d50f29c84cc39defd53b616c785da76a862fc60a619e25903bef207cf1c93e8c765a13f87027c9bd7736fc044ef4f6dd3cf3752beda24b3d2890f09ed85e5f45c02fdcc474ecbac108d63f4bb0266f5f08d4a4cc09e5217793ed16532d0796bc22f05607f6f265d967e424e47d73a3c486532efbc91d8f7bd970cc9412fbf1650cdaceb99635885b78abe2b8047d3e04b07573018a5c8b9518d26f25fc6b64ff6",
+          "padding" : "3051300d06096086480165030402030581044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 187,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "b4fb9d923c57a13fd71e27c25cf0edf872de5a7345f04c2d5e002a9a42445f823e976f078fcd9b24014d74b31c2380f953007afd3da3ffa66e89f03425faed2befeb11cdc7725e9a031277be6e2c6216b0f2d0a53bb8242f055b80fc4709292b1c56a18101f2c2abaeb9bc5ddcc6ad3184e6ae8562c30216e22b43c889ce27cdf1469fd996ed90ac09050f31264cd93051507aae73eab22c64a63a28150de06b43b3b4099aeda795811cdd47e2b73515c2cad2609b9d8adfa543ed2ab122285a12bfb7df219151f0eddfdb4be45a5624621e1d45ec511e7b505c92516b70bc7981ad61ac6b8b1037b5e00aabe9851e3577d4e335244f32de627a7fcf9e937715bf31414bf432d339c65ab8ceea49bfac6f5ddaa4ed0a9d2bd7f5d2abb29819ffdd7ddea9c71c3bd575eb18c4d69f50d98c4955373408651ae19bd2ad839ab1fcb43f5881fd290ac2109df9c16fc6c14a86a614fc5509b7329e7dfd8197bbf659966701a1395a5f498988c485025a25822423efb7775c9b44ad3f3c7c79efb329735b21339611e7756a532dfe00d2c426b2b41942d65c48be63f9188f0b851348405dda0ce3de333fb82ea80e3dccb7f4f2453415ab86bf5a5cf8512c6f5bc1846961fdeba1955b96a5145cf447aa34d6fa22b226bc6696db29a50e3455474754db86155065dd596f9412cac880a0132b1e1fec5ed015b1c8dc8b682ba771021c",
+          "padding" : "3051300d06096086480165030402030300044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 188,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "98a116f889aa8209366a0ff461bc3a2283c37f78b990622ee49e7046af1dfb8d5b56c2c669e71e4a0fa1f1cc5024d387d6f9f5d981e8fdf09142da58d760c1cf10ce4ce8f2b467f054a9c26eecf4abee45d3b582f9f881e77d626b3b30054507efcfa2d4444dca8a3075780d306f5780de76f70db07a57e0a49f80883bf0d9e838ca5770f07ced784ea09e4eee412d02e20411ee5ec48aa85330c5e2c7a93ade0ec3383ac0f821e086871c207144472a47ae36e15b5b6eb5c564031b1581afe321de00be20e5125cf4fa01d2cb7e510f85eb690c32bbcbf79de19d6f162805c4b630d2f0122176222799b9e5ec6729bc150e360ff7e5ad28741626577926efaf8541336a9bc1adb4d1205e0b2e7eee73740357ce21599ff5414082d228f089f2e218f413109fcc20bd61dac6218d84f90c2926a6dee012edf069adf4007465a8e3574033c4be54bedb51abda9bb2cec081d1ee2aa616178aa08cb0fe4836ec7536649cebd2a29b9056510b4a6fabc6b91c72fca3c46572f397749486e4b118df5237703be3de3b5efbbf31033905300c50efce2aaa7f0a819b819ace881984707bb1ec6680b9ab97186b0696e9cf1043ae43acb3fd9cac9fba305d756c4406418e5dd148034f6b3b87e207fb9d1ac3ac24bcbd5f681645773177d09c73e8c14874bca763c79f873a2853e742aeef70b4c74f88e2b2c8b094dead8ed088dca294",
+          "padding" : "3051300d06096086480165030402030400044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 189,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "aa4cd5424b77ce7dbe0654a7609ce273d77cb2b2b0a2262a093f4ee53cd4fcc4bb01e16fb50a13b20023fe6f3003ac635d1fc7148318745b52e4df0a88a72a20ba60334fb5b445f9e67f31dcbc08b0933d10d320cc48b0ab426ccdbe5658d6dc66159d622a0b3550a970e4b90de79e76f1bb5e5f073f7802a627493dcdf5e8c22f3bd3cc6b48b1ee4077527b75fb38a23e0ab2ffb302f7c50a85215cbac99a49357ad13cbc12496c2495fb70608c242118e3bf01ebd0a63dc259e605c5421cb83e1003643a6ffa96e385bbff3f49a17de6846f54631c95d4534f3a9069069c578a40ca248be0e5915e6e499a42cf11f2652bd9b81719750f0e0a9707ba30753771af12726afe23a9c4e38b03e34c0bd18eb0cc93770a6f00543966d1709b659780a35af82b32c259d46f19efe26cb51f062d142f897cc99940bef767805c32ac8a1bda03d5e20c7f60385720e2d47544f8dd5999fdc766afd8c988751111521381422dfcc8816b862c422372e9b86a5d9859be32d8dfc02bd6f5e61f6bbba6cf7f4531ed7b12341c91533133d90402d0668552fc17470c21bb843cb36b8a4fa6a3db24b0d4254b3e16b92515d31baf6f76b988ccec2a420d0f0e9591962de92fdedd1b619711417af45702d7e1d5ce0daf2ef0154bfc46c6460492a8855d87e9a5046071a990d6e7fb0ca63c03b15b12c42c1ad5b0a20cc0472dc5e0028c642a",
+          "padding" : "3051300d06096086480165030402030600044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 190,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "5f9515d56d86e65d565634ad95002b9595f25ecfbaf4dc44897a7d468d3c71278131444d48b1cbf19e6409b6756fe753eb6c3ac1c73fd6391d4cd6e1e7be9f0fc044cd124db1a3db575046698d140d477a4c6d95a5eb06de11d8bbbc8b2e6c04f8184008cb2388574fef51aecb8f188ab2206da09333cf536d004dfd33890cb24be2af682d02bbbac68fb1fcfa6a5cafd3266ef4b09a758c667ccbded9affc37c13ee29daa9d0db2c1afde3f6e7b070e2a9b5a9b3b7d75e0871e4e60d868d8ce38fee726c40a27fc4f54287fa7872e5f719198f20b7887ba524262feda06d751a670dc1827374cd2fd25330a180e21bca4cf8dffef445acdee58eaa8c6aea3cfe55ec6ed963c05b7d492e7984f976d6ee4831c4ea1e65b840a1d190f1c49b3cd7f8d289c3a2751c4885cd6368f17bfd0da533bb2ffdeeeef4281a1efa93667b9fb07042e0ce3d17c7c94d39fdf81c348bb3a9caa17b96b028fd04f89bbdaaba37ca3c867b5b06f913b6c3bd6f7c1dabc82be3cdbd4a184b1ee30dddd28b00b4f015765cc95db18c74847839ccd3ac02f3997ce47f63f26c9f20d02dc1aea57dbc768778534a8460f88554ded387a64fc65209c0413fcbfa81dc24a9b8a081e14509fd1c2cbc05aaa90e202acb0688da67cebcd3eb0eb867eaadba412cb6c88f0fe9c780b2f61b33f47ce2d70060b8146a6cc5ae825b1edc492a88b4e397f5c05",
+          "padding" : "3051300d06096086480165030402030700044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 191,
+          "comment" : "changing tag value of null",
+          "msg" : "313233343030",
+          "sig" : "550fbcf50804c11a93debfbf269fbb6437b171fe00b9e93076ca7fc7db88e91765ee439bccc417d647d145943ed7994324b514a2d4a70527d8f857ff5933f4a47168b49f5920641c49ca5f287b0497ce878857f64c51afcf36f5f115b4a8e8491286e972f54deec16ffdc4b8b602b5eb76d8a729d35fa964fd685813bb7ef3ae6529d6610af6efcc825eb234e4561973956c0b0ce4f93c4bdbbc6787418a6a738b7771547deec774c404589efa676bc800019a9ec8a68f4f479d0c03b7cc7e7f04444fbcde9f8b1180db9a7e60a7fc82ef7f4e7ca2130833c5f5683ab06e244ca904e791dfd01be0a96cbd55b69cfb31d640f4bcdb72deac2cec6fcb045f3c259ff598e82c52b34b96a6e0f3e2558b6e84e8b90591ebec10c66f809c37738349cc6e2691f02d69e95a2db99510cc17e76993a5d860d7f19f21593f6be3907a3a56aee4e79eb2d5f61d9c8732796e3894002bc09a8550e682d9acc92fa3fbad21503b117c6a6382651d08eab777cc87dc06266709625d7f162739532ef1b8e25fa0254a71ac1dfb00c77ea5b593267b142fd60f565c6825985812e1a8c1e47353ecb743a2ea52f165c330a5f0a25a0a2edc515ccfda97dcaf40b774140e1306e68911932170e103aed2ffe108efd2197a05188f9f18b1f59bf59c6571f27ef20d12bd1f0b12d513243d0e117630b0f521e29e401cda904a0484eeed9ecf1d049c",
+          "padding" : "3051300d0609608648016503040203ff00044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 192,
+          "comment" : "composed null",
+          "msg" : "313233343030",
+          "sig" : "78c6bcc6e22b2051f5dcba26edd20d680536ea15aa5d5ed438db92b3b2ecce0eb59dd46c2496dafeac3e49911dbc72f895ca0cf6679f36c770847646e99ea102648b8fcc3d6e41466c5fbfb0a343d985fc95f4582b671650d991768403e4f75d852856a450804ee29e0203c076736076ae79929a88d307c07efa0992e45fe49205f67061f7ae2adc2caa37cdd4ae3e4b9157983834055bd521124360e8e03021f703ab4b245ba30b4e421505cb3263d955c6d315fbcfd08dba056e2eb96daba28abfda149084b0052a9f0013593692a35d52f3843a76ed35ce3f0c8e8aa3418a53bceb9d5cef61b84c766648563bf00ff3def6a71d02a03acbe3458679ad8b710225544af5c4f7142bcf0289e54f76b4ab0d2273a651ddaf4f565ad76f231eed8c80b5d98481eb6dd507da55396c6fec6571d81c3008081c7cb4792c47025ef33f89332a4f28f03bced3111c895c5f48fdb64faba97dedd1c18d86335be0b66a334113a0149c67dcad53040d8ad2325fd6c11b40350a92f03fce0d991034e25272ef3665d2bcffc8f52b7c08a23d821fb824713d04196075b05e82d3138c06319759e859c7973ce15c3aaf1baa2bf90ebed260f87a413ef0a17fa654c35aedfccb4e496612b947235522eca5b10e195f7341951cabe3e0db663532a8fb6cd8eea06a3667e1fcc4002a0a0bbbcb4d7b7e20bb635a4934f58213775693ed2c64f8",
+          "padding" : "3057301306096086480165030402032580aa00bb000000044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 193,
+          "comment" : "lonely digest tag",
+          "msg" : "313233343030",
+          "sig" : "876d9d2c9fe40b3d3c9b3589ac75cd8876b5e3b65fd15d39cf61daa157dabfb659ac0d411e5da5a4fc69edbd33f3f2dc2bdd12b5e2a497c7a0d6486cdccef0ca8ee1f654aafae800ed764670a34d2f2d6491a97724e6d8c933a318726bf91765baf06bac71788178e565ad8caf12c4c1003ed4f724d7fb83ab09cf05cebf660daa44fe8918b6bc6525e7361ce4190625c52442bc99ac3657f25a0ace3890b90eb947d8229adccf191f7b7362ebda5f62794de03589b7437d85991c91fd55f0123b6c489e18514c0a977a798ba90453f4bf4521f438b6c096f2cf76352e2d48737a28cbc26fcf1515ee54e6bda99524b9c2fb454abbcaa9835f36f73509ed7fdf1b367be380283f0d391a1ff6a9819bffe629e7144ae5fbe03fd5fa9bb9acb9bfc0c2906aba09f8d797c38046c996f458a2e55f1451dcac20e082257d6ebb13f6966b0c2cbee4b8df9e75d31b457205a8b534efecdbbfd8706aa8258b2a85669641fe9ee8132e6fb356ddfca16344329f9245b856aefd263fa4a74fec495e28eacc50eebb822792c400b2b3c0741013da880d5f739bfc5ed23b0f523c719588f3a1f4c45b8f3058794013ee49cd604888a1477b3227c9de0230210479dbeddb1fdd6b94573141200db3da79a6caae2b0118fa8ef28b924b7116b304d2f2b469db8757fb463a05c495baac6d63a76119ed4a8c4910048eb7813fdc86eb9b9db1de",
+          "padding" : "3010300d0609608648016503040203050004",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 194,
+          "comment" : "appending 0's to digest",
+          "msg" : "313233343030",
+          "sig" : "b0f76eeff1462f8ee6e73c524c8fc6792547774d17c00f38df8533546d802c0d8ebe192d23a5f1472eaf562423c423d3646c12574f69f7c85fed1aed0083532d1e52050053a8a111e3cf4e24a24b0944f0f14afbd70fe53615764524a9715e3336bfabad476c12faaeca1df21c0162b7ed9a5c91ea64b2b8ddfbe5d7d1b50149b31523d396e6c96ea7c5f9c2fd20fbbdcb699a6d75fa00adc390ff6ab95de2b405c314a1ae7398087f4d54f37b6805318fc8088a49ba46b2b1f7dcd6dd16881a641d922aae80e3cd0baa82cf1bc1da9b0d3af24d4b04bbfb1d1570b2385c848cad1902083f9e7823fd8f6afe84051ba54c76db9d7313238959791fe2b0947cef28b2954234a56ea3823433ff5fcfbeb37dd8d18f6a04d202c7757d2f0c0e91d6384a9037104041dabd72ca429a3b649315c5e700c51d35c16a585b0e9b6b9e019ab36c9168a17170fcc38b4c8dbfaf413b148b3217efee713e0a44540498f92cb33e8439ec585d03fb9c5ddb443253914b0ac90ff97c6c9093003bf10cb05652ac59cc2a4fb54e92ff6438f3985e7cedcc0fc7ff18e2e2683d5bc41eafb8bd267b3bb50b6370b164fd84f053acacd8dd38a26c08a3ca1ae85284249b5b9419080a6dea945191421504a1eaf3230ef8d1a8b353fa68452aff1423f5021e3b9b6c7d290c9eeb03101909f96a3b02d87a1239663e3460c6ca0453f5b2c17bc2f08a",
+          "padding" : "3053300d06096086480165030402030500044243f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 195,
+          "comment" : "prepending 0's to digest",
+          "msg" : "313233343030",
+          "sig" : "9ab76d318d79a840c7d81a15fb67baf380901dda026d6ad392eee9cad2520a7d87a659a49b65d5dee773b30c0d319dc57f31818902247868a55874f210b1e0b8629f4d565626837ee063deee65d95c8b569f3c38673172c48ad68cbacaee2d8c69fc3e22523f95ab75f587af15d5be529d95835f72c163b54af9d92831ae8f3fff0cf7920d57c28a88a23084649cb20a68216458ae67b6d99d54387fc00d845174e2f3e930c1a0e089cda56273ea4f673af196b56b55924b57aa0b91adee03b69e98438b12ef9d3c3a65f7ba06d7c58e5fc10eaec8253cb6fcdaeed5c31f177291945bf0c69e7bfa273d30504cc6e94f7b7d60754135117411ad5b25b6003ea86b808ad80efed199a559f9c84f473fa1f554eea985e7111dcb2df4c4bee1aae22e58fe0216c4a0c937aa08d62b9222833fde32d991e4f8eca619d0353c2770e61ba3abe08e9b71de29fbb71c10ee6d8220f0ac6289c9c425f4981fc290f9faffe65ef6d207572055a5cd5a33caf6a61f4eeb6205c76887accff381591c51499a32a310a50ac479b45ec1a3f05c1bffe4d38d1f083926a208d9ef6e8b9e852a6261cb4a9224d35b0eab8bced1a3e0946736e6d49edb2885325a01bc0e7f89a58ceb57f88cd7047c5b002104fb180415094251e49bed59112eeccb7ddf99977d1a25544cdba5b10516d7f6f95c9e9275b484fad64b7e2e25d995a541d28448329d",
+          "padding" : "3053300d060960864801650304020305000442000043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 196,
+          "comment" : "appending null value to digest",
+          "msg" : "313233343030",
+          "sig" : "1d21743f51fa1fe1038b8126f6ed9e62f99a0fccc2a8b645fd90b996de8ee8d76e0752c83ec965e342a87c02c248b96665413de03aa7cd413ca67b17f74bf9886c9fd8223cd94dd71c98f874476667ee96c311fb40e17f8e7446624a41c02791726e62c0489accdcebffcbde06bbe3ccae1d669667f0f6157b463eefe4474ee89f2e9c6ef07b6d63c1582c4570f8473e07b2d7d0be72ee7446633b7ca5f7838e92b977558444580f0d305dba8ac74e3542b0277c6c21d51491c1a5fc6abf3ece671675e48a41c254f78e1d2a58c2d5a0294ed4720e511985e03502458108200fb47ba00ce379da0f429877b62d6d60133f231debae91a29b940c8e8dd278f7551bb5df882a833a3205d2058958a0f11685b3bc0df0dfd5b8b2badb8e02c4449f1144fd744ebdc2452522ab32de4bba59a3abee73c9baa120a74474d79a5b414645ed827ed3b19842a78e9bb83f03ce2a985cd5ecebf6e773594af60e285638a7ab6fa5db555015460f03fe3fe2e4e815792108d5a39f2fc5fe620145e7899001cb722b1c1524c0c409d8207e48e7341ad209ffc2552e4fa4eb09c749c320f9568cf9fe1f4c0f1a04c20ebb522fa77a1d2016305a75dab806ff3f5dfa49a191bed0468fc5bcd680e0f5f4c730123571408d6e3c3d466fb5adb838e9be035d8588f1fc9055473200cfa569454bdc5a31531d9af5e7861f035119b1584356c7f505",
+          "padding" : "3053300d06096086480165030402030500044243f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 197,
+          "comment" : "truncated length of digest",
+          "msg" : "313233343030",
+          "sig" : "807554d5b4af18450ab5584c0d81a98da3c2cd417048399c060fdc8d45d8fe3f621a06f7ebf08953c091157014bb9c555673aa6bafdfcff69bf27b62992af6694b1426236cff69fdad373f11044d2352259144ad73f37025bd23b2a9fb9b9d310eedef1c875c269194584c9672f229af762274bbff201e9cc0faf3a8ea4b0ac0605666aa358b87c63ad12c4fd644113fc049f98daf2b076abe82670f85853ca2ba8058480b124461057be13f690057a9cf68cff0cab120de21c6d18b7b6a099a0a3cd60c9bb40fc683c19a4def659ad9d806dfa876a2860c6f63bc48c96bb75d0e3bebc1fe6da96251703264b9657d4a3c355f692b27608ef72d5cc88b0415273c3717f5a3809fd1bab1be928881efe8ac5968050494030fbb332bca315a6b2b31ddb433cfeb1dcfd4a8aabb50d3db62f33822cc6d68d96f1e600fc83edb4b8784930c0b9c9b7ebb22b12218840fc65c6467703ce961b19d7a64aef4cd4c2acd350779df4ddb1050429a0858570ab155b174c928e168b818dfcd311e0d2d2135c7d2d639ef5e66c2b806ffba10edc6e789f3816b7de76bcf84e0db5e7509babe5c2cc057d835428aea81f13a5de5e38d5a4a34dd657c72874c21065c02b4f0bd841bcf58e1c35ae3f1214d719f8790f1c873ba3f0d7a70d18622382d94d0468c2f5b1834b57abcd33d1ecd71ff9cc18ff398a0c14a88a2ef0738d866c767d8b1",
+          "padding" : "3011300d060960864801650304020305000481",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Replacing digest with NULL",
+          "msg" : "313233343030",
+          "sig" : "7bc68409ccab429900777ef7996b067cf577eb5c5005f8244e0aebc2d09f35dae9f555c6b3c103fc01df943d90d6d57ff6594d47f080dc486607df002fcbf308cdf2a0291f702c23127d7856e9e442ab0cadfaa393dd6a0cba3c07c66e864f8fd488ec6b309267a18bd3099be8f38c31eb016a7ba00d2a74103a78e7877365da66f3c16a7fb2165a9de1e8b81d7e2ba33f3d687298545af611ca205912b79a5c63425f8c9659ff27d0041ade0ef02a1cb204588000a37733de3b2099d6eb7addb0baf2cbd6c9c92ea36b39c38943d6550d13adccd447aac93c664efc2100f48a0a6f9cd490e2668de46299347d04090f39b01de69032cd527e2b961cfe90f888053cc177fe98eaadb3ebb1b8eb44a1b232aa0e286d6f7ffebb7ac0a4aaea6711c1f0b95db88ec6dd10e2b84e83c672e4015edca760899d69f0f7801eb95a50d6673220968db8d7459ea74982ef3e907caf08ed42343a48d60f529fa64011ea457f69d2fcf693013ed6da6eaea5e80965d4d218fdf3b3d46445ed081d47e9b148ac2aa7669b3f1ada4f5b110ccb4bab9c869f849bd1947aad30cadab36b69ee0de614765315b7926055d3704aa0ada17b9d109111e538ebe431ddb745c6a4910dfe276eda05629126422d70dc3d9490cb79cd25625cbb96b300e11c0ed68a2ac10f87322129494468999ac29a7b2f1871a6d06fa4029903bdc441c7bc6af879fa",
+          "padding" : "3011300d060960864801650304020305000500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 199,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "3fd9709bd5e962443646b263ec4869daa6faeec59433cce2f237fdd1a1c6c4373bb770bc4172cb2374d937abadcd12abde5287705ba3b7c76aaa36e92c73e44b0dc629514ba6c24ce82daf867c21300d573970877b588c1292e2dfa8e9eb6dda466bd64c1f484e0a40fa25885f8cd3685de748df58e2fe3203451421b3aa0cedd45559e2c723747fb4d63c42ff078479b52ef98db0ad558def856f23ed9093ff8e7a36b475c66993ee13ca6ec2ab8d27d9021b5195cfe57c0d48fc51bf9237a7876d693bbb27cfd1668306bf5aaac676aa6a4095c8691d77b75a3e98725d2cf80a3136f64d2b7d11c26735f98b3f49000a67cbb37ed39a985cc3cb3af3ffe4ef43820b4bc9db22d2c5d7ec74b52b7b2ac1dcedca614265dddf30066fccc217043dcb37c1d40a370e6039a1490f41830be87766415dc6f0423e3b979e90f4ec0cc738ec11c03cec9bfe7cb1bca84c9086e0824cdcb55fcde0df40ba1fa4acaa51d2c548a58cffa69b14fc71f34f36c457989da718f9ab2ed5f428337bcd7211ea982879593724b8ad8a347bf1a8b260bf56dfe0994e2104c00d5cc1f6fadcff927b4e12ce53a2b784430a5b55ad52a1927c6a6c949fad1fa121b0061fc838e6923ec22734c94758b3d1ed033ca1f5c3235fbf79fddb61618b620b76bacd320ffc20e0110c8e106ef1fc8ba46f4cd42786a689c1ed80df66dde2c8f76716c5cbf7",
+          "padding" : "3051300d06096086480165030402030500024043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 200,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "0e698f7add604508b556c6f9a02cb65d3c8b494e68d440fdce02375781c264e4b0120bb5a417c1f1b47e355dc68821a5d2a72bd3bd5424e1f9671a1267c7672a411e1e6412998a1ef45f80d96a11e50a6585696389250f8f84dfcd8c9e357fc35edc022084ba99eae2af55885fb145db13636a81a5f7ea52eef79c9268cf98cdf43f1a47674daee33cb1df5f7a09f875c65f7f9978442827bbc156ced42e564070ab44d551bebc7d218617a9d1ec4a5f48619e5987629060700bc188ef8b90a48137f5b31eef4710d5ee7561691832a0af77df933bbaff392be3b2b598b57acb38240a5b204ff9b28b0a52972f278919a8c14d01deb6447fc78e9659c32ac9e68706c1b16f8db3303290ee0c94b5c33db127e741f6980d1868a91571ac2d72e3a174dd3eb417f3739ad61c68110b0ce8ec78cae6b20cc59a6e7a07a8ca7cb37214105f1cd04447127144882dc3cc7b86fbce2827b9b756deac3f911e11a35599db509cca6f41e2b718a850befb7401772a5b3453dfdcf99b1781f9f41411e1f67d22dccf2ac2e0db7b524feac72ea2029cc8ae2ff834ae17031d4e052652ad957593ca6a042501dab1a8b000d6499d7a79741b0b73ebbf497023e6854753cce30a43fd01cb3db662c9e06da25e17122733987cc156cebeae44d67f3c0c5abe680fe105d2b8b501960f75bfb2397130f1d3ac0c5c13aee841f3e5c0aca621300e",
+          "padding" : "3051300d06096086480165030402030500034043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 201,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "06956b9875fd5b4f7e0bc252a1fb560303d1d5eab0b676b6aa555b0bfa9be63100357c74a05624f9babbbe980a94b5e68b37202082d6ae713b4dfd0a7689ad5ed3ff70e9aafba45f7e905ac6b9aa9e4717969065d51c003d23bad8f2c821e709746ef58a9fffee3a99dc782811b8af30501d28d6865d0f52899df3c08b2254b199faa6402ff9cbab16b168c801bda906e537f01d9a541bebd77f112947480f1d7d470add94411e0598e7f0895b1ede3ba2f1b907ed04b10ed415fc3880043871677624ca0b74ade7f18f6e01bedc0d1931986e29e7eb0e7e2514742f828879cc8668d110f4bb940d1f7573835a504ba6021d6075cecbb5a1e4e908a418f56b1cc7edc77957305521534fe00e919d6cd03ff0a3b9416e44fdf31cedbe02b47932a6d95b702418ec6fe6e3e69ce5cbab745bec15a6122b5e74dc32bf7ad2b984f25bf4018d4b62fe92b1010558024b28009a72cc4f72412a559d84559b97d12c549cc569f2ce4ec25a31567930cf85caa4cdd34117e775f48750b6b5c70d819b9e6e5579009179eb8fdf779bb8b898686f03617501d9293ecaa5df479b046819706d73a9b3afa0ed6292aa30504b65ab73aba5c1acf8485472bceea7256540a00e6c4624623286c9e4847172881b091f40e520e0a6d1280cba14abd774eb0db338f76a0d86ceaa5df7ce4fed554b890fec7f32874798265d1838a590be8634c217",
+          "padding" : "3051300d06096086480165030402030500054043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 202,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "7afebee544075bd481ae14685a0fd2c391eca22ac5dc5379a2dfcf9cfaa21ff2cbc334c7ee489572c9cf30f34fef16457dd60f391f85c304779482bfe2ddfe8573345fb16860f60e3489f4314f971d169e8a4ebb910e05013965384830750e6d82e4dda7b366ee11372e638de2dbbab1c1cbb3439f45e57a8863bd7abe7c53d61f050c0a52b63bacf5e92fe47e3e7448f16ddf73d2576bd222ec6466572a134e54921ba1a7c29b6c6e7049ca08172e1d55cda0bcaabc7f6a38e17033d92b5d81e5c6c45fe117230fbdcb11541f019afca47ee5132d9368903ac946e5522b636fbd302c9013f0e5cd2acae07cf7e806fe7e96ed3390f214769ffe7a78fb76879820990ccf7799991695286944b5416aaa09e85fce29ac1360f055e7ff698a11c40de0be6c5d5d39b8e969552da090274fb2f996a0b7baf57d75e63669efd5113667f732a91aefe57c9fc18022ec83d1865f858c74a397806588c3849a30235749bdd7dbdd3f3d8debaa92d4c91cbde08fbd929073bc9d9d5855614415eb54ca518dc2b91ed1b90c0d2ec27a149d18f6ea006abca2cbccf1fdd9c03d46dab827e9cf420ffdc9109dd8505a0db745312d19bc3bb6896f99cd9ca124bc4ed4edfcfb972abd98b1fe606662ccd77471a35b8ae3f405d688cc8c6b2e27399fdc89d189b8aeb67031138c7168afdef50b9b2bf9c23191fd19203ba4e9d0b4629e5a0dd4",
+          "padding" : "3051300d06096086480165030402030500064043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 203,
+          "comment" : "changing tag value of digest",
+          "msg" : "313233343030",
+          "sig" : "806cbf33b9b7c058714403ea504babd8ac78416b0a3e77b4f821e6fe2161f86104703f2ecf9e747be60512aae660fe8f7c1dbacdde77b421172b5e68aec78d7646ae8e849fdc878b8dee55947e58deb80235f1d79999dedfb2967e52b2554350ed7954b21710c96537d58ee2ffb4f3310e77d8663fd6b1ff92efb0fbd5658d757c887b92c84f8d79c17bcc498543a38e97219029343f59eb0d67b0f16e80bf74d50361798999b7783f92575d3ae4fe8ad6efb51346fea20e6c0beaeea2f56af5d073dc45878e6e975bbab9632d38f84da8296165320652c4fdeaaeb8cf17e5a3ba72aea4e46d91008de112144d770ad7ce78ee230b296cb2df5b4a1585c6346566ba8963648750c3744a17de3dad45fad71702bc0f0396969cd6ffe6368b6274418d23b56de452f14894db50720f657bf2e3700635cd1e1fd80fc61de45297fb7f180d02d4563edd24e757c461987a06ec07638bda0f362a5b3ca2ca1d7272d6039d4cf161e2cadbbc755ba3d19157d4fbf320845e9c7242265807add4b18f5952229e4dad0d1eaa5d225d4d1aea144e83254e6c9690272e3312995ab337d673a285707fee499e72701a5283e0cf5802c49d07a113383d65e3496de37b3dbbfdec2b90df48490bd9e9dc21ae294144759434a7183c9c8767e0d8efcae2a6bd1bc794781f8df000431664256b0d1e3413824317eac6db977937e47f2e401a7c70",
+          "padding" : "3051300d06096086480165030402030500ff4043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 204,
+          "comment" : "dropping value of digest",
+          "msg" : "313233343030",
+          "sig" : "4c9e5d015a27bbbdffff3fefa717015004f1daa497060fa5d67660621ae82c148dd128cf2c3b6a2212ee74303ede9736327d56b79bd967dbe4593ec445d551582f0094e4d6573f1425325778b1a9720949d4a67ad98019839314daac19044472fbb463e576f5164ea0815b013773ab8abaf57d895316e6b7baa4fea6168b2d5f622f88ea37612b75417016ed92defab4de906951df472ad10700b11ea13f8f43ebe8bc27a944572ac4435e8f03772ac427bb794bffc52cb26bd7f058750a991d2bfcb5eaa205a1ed321487e7a2d80157f6d394ea1fb4f51ae546b8f8189c41415cd6a983fc363422ee0cd1bc9c6b0e3f5171fac51406af6b93f47a9449c0ba274584c8332d6253aa967690e59671591f9cc783d045f8cd2e53ae695d2b43c6dbef08398f17cb53faffa1ee45475879bd6b1763c361af445175723c6fc55f1dd2f108d51f9e2249e6b1c0b11e8a1134dc4aa348942ca2818df11a84be7ef9056b57d0701e41373909b0b7f2acbbec997c20f9c4c5b6fb373396608f8e2cbf4d246b5ab7bef83eac4061caef51895ad856839c8b776522ad217f8cdf54311720c28da64ab5d9a339ca82d43ba98eac57b8532c5606dc6d1a9c7fcb20dab617ec74984246b326ddf2596326267dd90cddd41586ec2279a25c2798fafb68684df90036f3bbab85ccef8d50209fb317af04825ea69c844b613d0f8388db9c2cef819c",
+          "padding" : "3011300d060960864801650304020305000400",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 205,
+          "comment" : "using composition for digest",
+          "msg" : "313233343030",
+          "sig" : "1b4fa86e9437a740396f01dfc719b300bc30013ef20702a886018f73ff6009e20b0aea169d6c8d3f8e5b39938edb137e2118fadf6c6b66a352880d08fd59d0db8e5682214fd2344a67ce6dce96e4e7d0bca67211498b3cb2688dc312c97b051bfdcb6e950c19edad779d41df34888a89ab67e9ed352890a8e29a9c9009d0c22facf3f18351faa3ebbbc617be26ed26787208e8c6028534155fe983e8a856addecde394e7eb182177e32179582f3eefa06f8db14915f65053e7e5a17575551774be4848c00c8d781984e6e421df5d2e2cf6a59fd7049c2a2a299bf1fbbe1aec676ecc30e2e20656410d98eacabaa9de1c216f16363097e81b49bb0783a611ab32dd19eaf4dea1f97c4ba1204cef5f6dc1f1b20ec8ae246c3ebcce57d61d0dcd13ac4765ff8f0f36c0f2e7249b85b9178ccb454a4aaef2c9a5d05bee8e1464404036f4e17fa1c6dc31aa622f4e130ee6c447ee85d78852b424bbfe55330265d2f013915edf736da1a3871d3c62df5a1b0007306706286fa6c3897eea636fb2de3f4cb6a0f3c23294a4831d388b4ddd0fdff21461a8cd27b84da0a12d1e35405e2726071c7a0ac8523d19254a15296737a8a08630a767aabe2ea6eeac27271479e1fca1ca2b13ebfe8341c52411abd3056d00947f68b2434d94129a0f604b3fc76734d32e5ea65078af02330543d4e7f728988506095925a9c215f1b8ee0e734ec4",
+          "padding" : "3055300d060960864801650304020305002444040143043ff800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 206,
+          "comment" : "modify first byte of digest",
+          "msg" : "313233343030",
+          "sig" : "5b2d1405cd372618413fccf1492dda7ddd2aba5e48f1f0396cd56e4f51a8728c67d3e127839b8fd44871165e2b0ef25f31e612fee9614f5ad6a1112f20e9283ca7906eb93cbe75290d015bc90957e570324689e466ff8822863178fccd491e5aaf34b0e16bf00986abd15e2117523643761f45eecbd7beed4d59fc8be32473872f2cbc91b17410a35d55badc3bfb746cea5f725863dcbc6aedd0228f56e94f5021ccfbd522c5d25f6b8ec86ba5c15f784b4d819e91ac622edc774cb4863844ae120c35e5fe78ec777bd815b07df996ceb679d74141684358aa50f96c47940157aed461e465d6aafd16b1e22c85e93336f93cbecfa9cd113e72af41012374a8bc143f95004705925b35f1724369000ccc3c07ec572dbcfe36a0d29cfe99b9fb5d6fc620864a717b8556c931e05d32ee93674c092025cf01f37e36ec21d34b9631b3ce3fa40893376abfdaa2f7aad26a60817106651660948b8ca568128348534c82778af0c91bc6204ce6b6bcba682146244903d0c6ec12130005c97d390977f71ed0a3acb9fe5c69b62db6ecc0baa94d608a4c95a62f98ca67f9d4583cc96c98cedff1f563ce9254d4e4cc88d127d74b7f9e6e59bd83a03ad3c720cc687e102cde5bdff8bfa0b4969bf037126b2eabeaf4d67bbd8f19449ac1af10442c5976f0d99e57070d6fafd0c64a25ec8fbc380cb71ef952f120530f3940227d0de6c8c1",
+          "padding" : "3051300d06096086480165030402030500044041f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 207,
+          "comment" : "modify last byte of digest",
+          "msg" : "313233343030",
+          "sig" : "0ecfdc9e8f66eb0091fd4ba2c702c3be35664feb4a8f2cb6612b3aa6585180c8dd1cb81956b0ff84dd7463a00d007bd26bd4132f29fc540b8f6fd2a29806fcebb167ce31cfe9d307558deb60db8e68f6c22fc153ad979686e0bc82bc199500a1a71ceae7b3cced4141c95dfd54fe0d8af15c0fa93e416525892d30ea6890ea451c0425db2ad2437f6dd77d0487fafb966f2d82f6752456f8604a66ea9367c7fd5e7dae8e4a8237da2cbadc97814fe05be3fb8da7a8263151451300e8f6ac051d1f2757920d59d5138181c41649b786f8957246a3459a299177f5e895d47d1156bdb2dde021b20a1e6153aff898fbdbb17824036cb0c0965ab508f1a323044fcaa8bb7955ca9188aa42ba3807c595ad27632b7b381a219cf162d0a80d56f58c7b5089a167dd0766e6cd77f5a1af2945a1930752b46a3c729233f6d849a6aea1dd13ed3a2e7a91ee0b8bd00bcf4c5888542fea02792367d42a9a675d3b3c973c8f1497811d6fe27a8bd82bbe5b8b4abfb39cac4c2265da619a01fb5847e5a4fd423674b2d3949d262095805555597e4930a2895bac40b8e18c711223ae7b2ce23dd556ac179c0124a6f1ac327807e8540b1497e1c72499757468b1ea8c39e8e9b9a5058db4340846c410ccb4dd6c477484ef3c96b183b6586fa79054b06ff22475dd6fa7aa08bb6bc3451dff8de4457523a4c0fd832007396ecff76b16ad19017b",
+          "padding" : "3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb34c",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 208,
+          "comment" : "truncate digest",
+          "msg" : "313233343030",
+          "sig" : "97b76bef18ef7d36234435eb59cb4e7c93d3820b825122b19c2e0824f255cca6486aff6ed6f2cba7603e81e17c5839678b6e498e41c0959ec95415ecc8795a091655790cdd335ac12fc7be271587433ae2b8cec08d2375c16a02afca54b4a68fdb63e3645678977ecb5f05696fa668ee06a2e390e48057999f018e98ef9fad938b124d86bd4a4739282f5273d198339faadf0d6488e4b6a968ac25d7a0ca88ea7cf8aff0de54509970fee9bf9914773bf247b622f7471d0df722ee5e7fdafd18c33ad92c6673d464c9e1f0de460c106d4a54be1c7538248f65004eb7ca94aabffc4f37cce9f4e628fde81a3d8300e0ee486b52555c94d4182e5e7cd1eb6328f872f9b1528d0e1337d20bc96cae3b5744ae88db90bd9f3a5cb3ba6d64e949e9b64d84c47ec5f5b7af02b08fd06a820b4df22b808203d0f9e327ab64a54282a30ad12abddd03b9beb83b8647897c52a889e7039632fc63b40c3cd5a8554f0dc96e3727fa24948d97cf0ea2644f888129cc6a450840cc526b9bc9446430393d571e4081a10e6fae856e15ea97b5852ccb253517bd8db2ceedf23e50e51c1b3500919e0e4c915a3ef3b75c862290bc0b6dfd88129195ef4fb4b16837a0064c60513246f1d4ac068754aca0f59aa847ab5c7086ef65d371075ed4caf0345bb22a69163089d683465d48d27cff4d5a200a1cc93e54bea0033b6082d52cdec5726c9bb9",
+          "padding" : "3050300d06096086480165030402030500043f43f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 209,
+          "comment" : "truncate digest",
+          "msg" : "313233343030",
+          "sig" : "50bd7b6ee4aea6da1a7e92a2439817dd3e521030d55ffb99889681a9e938f9ff0fc50c4a329ce439f862b8c12744fd565f0f18063bc27357faee33bcaf24887a72f15851de6c014664501954ad7e27cadfa2a1c852bbdf212928807be0185ef51d11175195e8621dabf5d29a58cfa28d96a1aac79a60bf83dbf6508fe891177f521388e13ffef6e870614a35c60253c5717020d6e91f860c3f447f038d65891cd783d06095b615bf1016b0d73183bf417521bb05d007f6fc23ee5c46e9e43307b0e2ef35bab3d7c86601c54cdd7cf9d495a4a514a0e804e084f53235ba8b7050fcea6c858eb67c17f45f1baa9f4afb7d7cc0c0df4fff8301ff4cc3a5754ac6a9c2956e78ec3ed3faba10994621b8474982809418124f8392a123abf92d8bdb717b94e8dbe87fa620c1c8f597401ee7f3087cd1765d9bc008db8bc017fa151860c9280984db887cc74c9429b503413b6c2d29765a3bb04c70dad254d598104becffc37173c892048c490df48addf5970193f748eb51c5536692e61c21f6f33f5a4728455ca916e3d707053b6d781535ac3c75bd33a1f6048d3632b092fced4f4214a6e060aaf0e6fcb5153f1f65cd3e62d65842e8587b378c0310d9fa6197f1981adcefb5b33936763945704df6b871d7026a3a2d011e43aec8651020b01902168c216ccfe367edb111184ac012abff7dc1a188fdfe5d8e865db27fd9ce4a4af5",
+          "padding" : "3050300d06096086480165030402030500043ff800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 210,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "8aa39e382cd8607c148606cb9693ec37591bf4f663b0ac40892656050e57dd9442cbfbf34d1b45d6e6b2ba24fb5910c6521627c45a580af8b26bc2c4dc411794a0115d11588fe7c24324661ad04023e8700f0958bd700e7319685e5e349497037a9dff809d5d8a2b89b62bb1e7530f35f5024ea927a4ad4c40ae09736fccdd967d0e59dba17af33d803061e4349e19066d92ecfc327cd660fd7dbf2863a1fb6685b5a7b9386c232fb7df96fee7244f37a5df24e4a039931a41cee3763919544bb1bb6d14e2adfb88607ab80fc0e434553a5e4c2186064a9c0d844571644977da31d6e5bb70d1ea319a6cd270983d22d73e226f65a5a5bc0c804272ebbc4553cf9666bd0985a97ddf676788d09889b2d323241c6fac07e13b7440554734d2c0aee1f3b882085f3a266b452ed2fb69d518304c5289b2c2a6484ab93f8a540e6d1f423aef15a8441485e5768cd0e9f47cbebdb85d7dcf045a5d2714f0d422fa2ff6a77325d5fddfe194eff9f03fb02a3914096a9078d0d954e981e7542c975fcf43503d2aa806bce49b2c6cdc971b290b3b2fe45b3e0b6c106cd6fe0e7003103fd2324665f800068f0a8ce635b6aa3de021ae52b2cf33cefd54b9e874a0665ef31fb8584ef80df6eeca5e1c323feeb36d804266cf2193c9a660efc6c791d9f571c22de39296deed36f10f59acb93b1558a15d5da024574a1a5c190ea80de8d9cc97",
+          "padding" : "3050300c06082a864886f70d02050500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 211,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "37a5fb4d5ba5c2177b7fe767e59ed949992e0bb6b0c9e5d1cd2b777bd1f57f60e79799b42cea9eef4b0415d6d1825199f44d703b80298c93f4cf5a46b33c891a93f9b54b9462f0286e6504f0877e32160d098fa7b8f593010c5a315399660567adcba7fcaeaf557feb6b0b743d09866cf92abb2586560c70897d2d1d5c7958cba4bd8fa33814091acf3e36260b44158faeed33510f1de9a6c8ca38f3182328576ca98ee18531b24c8699e4f975cdfadce528f87914aa1e9fedc573634534b2f080ff4458f64e1e02d71b2490a0db3595797b5ddcf213238d4b91d04c44bda997740e4d1a73b150f82e874cd6d062955f2993fbdf3523f2132d6cfd6ffb1e33ca1fca9dc53f2f767d604aea78a3f2751df2a21ef92b408d10549234490172c26168e293acc3b862e5537f9e6975476246e91a72e38b5554405e130caf094ffead06e397e885d79994dd3d7eefd7decce7e93621e93867d33c68ed87ed11ffa4ca700ee3c36cf06ad467f339fcbc35da52bad2c8e3cc65e9a89e6046ab0142095f0502f6ddab68f341f5b71c39d57629cd66bb7b0b4fdd507105cb12ec3810361430a78ccd1f0aedd96fac40f8f31823d6c3c11534ab3dc6978838ef91e2526362ae869fdfc52a6166bb5611a43f4783867649db78fda04954cb6a52f43d81048934519429de8de14a75a87f1802625c391138d79a96775b87ceff69d0f8d2b729",
+          "padding" : "304d300906052b0e03021a0500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 212,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "0139c2571d73ed85895ed7e78bc4fd1eb47b9883d5feb7b17cf7b571ab4d9731e3210c4d4c3eb6c6f1f833f59e01e9487afb35a0ac558f8c337a1261f2c6bbb21de0a54d2f8740d452477ddb8ca734ac9fdbc508e77f266b6ea3291bd26b1617c7f2737fea1b154c035ecd0ec7c796955a66d23a799f755c64e28b0996ce26c529a11d876423df3aabe0f2cb7d8b5a7688b4b1a0563ec3ec9265171bd766f226e855567348df48da3e7c5b12bb6cd6b3773eff51d82f0de2fcea359d88b664dfa9b33c5aa079a9e0d874553a9ecaf76c0e1358c7e1f4cf2d0b8943555740a827b98d141e760c27f7c673c54d562d28ef86770b3673dfd205222e6ff0b03f394e89ce5e04825b4696c4c88e92dc3242746872a8a409e5e01b07ff64ef1e9554c35cd1630a842125516c6f4073b455217640711d80d6352e263ea0439cb67dfe9d9e169c5a9f0a34d21de64d63e67b4474e1004af8a251200e21ff01acc9290e6afcd02da6bd5f18c2af4ac01414eed63211b14af38ce103d190061ee6eb54edb69b4e443708703125883647466784e45ecdb6ff15a9be7281491bbd1e557445c77ef7d5de6d50f8b03ae9bbf670edc8d87b7ce3d39fb57fa245ea98b54c4da97ff4928206368841257880198236b308ac230a18b20e5b89ffaaa58be66fb748a2971794a88f36c7c3b81e389ca5cd993a0fe6d911838ae07480925d4899e38e83",
+          "padding" : "3051300d06096086480165030402010500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 213,
+          "comment" : "wrong hash in padding",
+          "msg" : "313233343030",
+          "sig" : "bde28951ec3257efc054f48bb34c43fa230009131244f0a909bbbb387527e8251d9594d22e435db30fa55c01c43421dd51ab38dcbc23cee280180d74b6a9c1c30fdcbca02070ce3e0868419d9f28b04dcb1013734bfe9678f7c16f156f382596d9561fc32fa8b9de8b7b1bbc0047a4a2deac7add9a0736f0b0546956291d231d39b53d19e533d99924c8237df0ff91bd74a5131f4f361d7e541083dd4f3d711ce4ec9aa869a082e4d93ac9cec840cd00690629d7aa30454991a18d8d342fd582d8054eb66c6bc41df3e7c98b47b50ef7d1955215d5ca27f80d2b919a75c25f6c18bf427caaf3431d64e27969b6002cf125758316378fe05a26e3b2cd0da2f86016a5a9a8587577463592ae0c02f95c0b099f2bb0ac2143a13b9131ba86af8b32414d33c63d4cc281d5b1b442a68033dbdb445591ab88d33d184b4d87e84ea09fc047261f6cdef18462ea8392ef9f8593b71acbcea15f81fa68c9418ef37720c8077d7384f9544f85a519614a6e900f178f57535761cb388f60fd15eff8ab321f49bc152626c2749bc3033f46bdc20e853e2b5d98297c4f74d9b0b632d0bd1b6b64346cb6704afcb8afe94979caba4f56713c4c966ceee9bc0d7d1f248bb55dca1c58b55fd04422c8f2c390238c1fa4778d6f31b54a3ffe7654fadd8bcb14540333ca3aee93184ea1022b355a902373d7de9b60f3785465668bb0ab7a2542bd86",
+          "padding" : "3051300d06096086480165030402020500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 214,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "c996f9bc755208b9231ff74c7eb386572fae494aa1ef14d906947d8e392a8c9729df0875788716010cc0b65c2e7fc445425a3e0f3f268a981886ea82fa6638eeb399b13e382c699c9c2120190315dfbcabd96c64cc65251cadc8eaa344fd48bfb139a7f3b84d0b9ba2e8ba730807e8f39035672f4fcc6e16959e77b33457881af75f658ad3493dc8cc10e8ebeee25f6ab0c435b6608fa1754ce3610a729a8f620ab5007fe95866feeab912deaca144b8dcfc682bafd0d766372d37ca4f78ce57bdb180079f577ba2a8b38754d7849179df6fb76c26fb6e744d2ae5bc1ec622eadc77dc58789e691160f369e02c1490316a3236dd8938bb17627e9a2e0a6450ba6617b65d068ca22c3e2fd32c94a1edf25d05231dfa1848a79959f327ca2eb2a5945f3c6520f6fbee14f4271e22b47c53879f1e968979f08232619aaa82e5477692edf1df76ce5c7588bfcecd32986360ee77ff918d34b7fa81df9d9630cfbbe9e789382679ab360c9623a414cb8472ea1bb85184099a66e53074d35d8c6bfd8a7e2ab60fde351d253a69f5f75c103a43457024f2500c0175f09af86694e278f6d7c967445195c1094d93b5bc1d3871a673ba4038e59ab4e4a3e034b1ce2385ede252e6ca5d8b40785fe3c0f9fc02071db80e97deff27dff9d9b96679ef5c25e8e68d1ad5c17b1e35ee054d7a3e7e9bc8fb97b68918979741f8d73bf75ba910f0",
+          "padding" : "3020300c06082a864886f70d0205050004103fa6e1540a9e5b94313c5907267a7331",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 215,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "b5fdeed7f0f69e4c0c2aeb07d36e868c827d2e7eccf409a77ee8bdb810d2dedf337dfbbf723bcf9411c5357650f8e92ca9189ed821dd2baddab466084d348b0580b19acb9dc7346739a314846aaa59d5c28e3120621b961b5d0b0c1d4de49739cd95eed627738cc1e4512881568e41ee94a77b9b0ae19c7c4f07bda6900c010a5e10ac9f8d110f2edf368669002d2585b1394aff0687e98ebb7e88a8fb1d950bd563e77c8c9852faaf941e17405c1d7f12a51e8ac338f5c0d6a605ed2445814c14ee949a781c65d318cf2e46064ed0eb8cfe68fbb0970115aace71722b6c5649017125685a79ea175c30d1d0ada039d453a56c59f4d01333948e769580db290c271c15e5800706db6b5ab775822b293be7c62c647f42feb2effc270d50accf866dc1b19616e7b2d7c5c91e298df86044df61f00ac48ebe2957258ad7d9f4d69266627a0aa7acce8350bcdd2d139a0e8a641d38b85070ee7a909ea71d3d10f9108324a5ba8288137b322367d973e5a6a8a8a12c2442eb93879bb4b3b3495960a4b704f7dab9690c44528d2bd442cf2d597c1ed9681f9352077bfe6177b3ecb157177cc572db7081113e45750d8850314a49e7fc38c31b4cd79709161b87d1f31280f496f07d39804d8b638819d250a5755b00440c91be15114e1244bdd8e5a783a61da98688af5781cff347fea61445580103bcd75422d43bcd77177c7ea0b554",
+          "padding" : "3021300906052b0e03021a0500041421f0fb55d0f5f4e1521ec82216000a17e728f773",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 216,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "8682d5bac51bb32bf283b8cab1172d6e8054dbfc672de6f35f33a9f7b3f0662fe19ec01a74d5cbe6d90351843e2b129d0ce30884fdbdcfc962d2721fec5b3b7f6a9db4a95b13def111c737cfae72d13aef4d0ea9c29181891505a0d28c5c8853ce5c37476654703ea2e7c68ed52591c182bc051b5d837ef3be064901be454967be52f9c7d406b7409e93308b74a826d3d1e6aedd8aba3f5f971824784167df53d042781b7c2d3cac29428c7da1fbc451680cc211517f9175ff1b2c00f819916d6d25581542c8f05479aacfc245e5894763db8e79849d3e2dd8d7178a38cd4cb7b03436c150c467540dfcdd001d6c8994b2f8b332705b2b5ae0c841708c83dadc7d647ae15e547403d689a00a6bd4de8602633443e0b7edf060bb7b529e0afeb1b4171f70a943a14f69c59720b4b5ae59313325685c102d992645fd23af12f3b8f8de79399cc6c80f9a0c006c316ff7a6963a1f8ef58a67d107e5b49fd8d7079bd45f23ef67f6a83127da157f54fef9dc01415a6cf7a957f5ffa15457a1a8bf831273f48f927ba8bde79da623a8a2784e7d8950c5fcbeef5868311acbb793cdfa54c702209073ad8599c4c74b31ce3b662399789febb36d922d77cddf63c1de3a6aba21d6d8ed54a1b48f48955602d0f6a4f5eb5546131561809236f0c71b8374290106b893ab70f6fec1fbc3bb6ef5e6c0263a7c8cd90c289968671744e853d7",
+          "padding" : "3031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "wrong hash in signature",
+          "msg" : "313233343030",
+          "sig" : "088bef646bbe07ef0c2d8b191ba0b36420a35ca1a85f222bd9622af778497ec8e489fe00f0b7b236e7a594ac83963d8f07079e97397b8b973402225215d2fab8ddfbc11ab3de487fbf9fb704a5e0cd1191acfdd61031e72ab931407029a9fdf519de6fd39e61f89c6f8773b588b1645ba193de9c44cf9e237c4aab05767ac6b13b125b39b9e303d175f38952d536cd1f0a4aa92872fe6bbf630414bee94a824f063dac6238f846ff829ea4dac1ac46037ab115aad3fe76c58c28bfd15a0f43b445e0d2ca02f7a886ca123fb19ee6b9685b4a704796e35c2e05c3bdd7106efde0a2fc3f478fb734b39e1f6fe6507d8804d8067dc57a02f6687a5efa85168131db331b1b426a0f86a6c2581cb3101b1baa35e24c2fc5d8127ad8c749cfcb62e94f0bd1c68341cc9c680aa2a067d242b1085cc6724d5411e1e71fd0747b2a17408371740b2c95f6956385936ab4322c977d95d03dc320629bd8ac9326169c073c2c1a87f4e36bda5546766c2d8a1f6599e20aac010d447458b84f5160e186861096f035f28c44cfa6e6a4565ee25b8f1a2868fdc079e1e93beeaa0c2da15adbea1af2f4de54b4015218420e309c330476bca71e303bb2910edec339ffe7f9048d16d98c0e3e6f4c582c50fdcc85c54e11b72542ca7b1fe4507095b0fba9cabfe5ff9596ade9efddafe266d7a542ea8549bba6c52910a76ccdf5ce296271380ef6b3",
+          "padding" : "3041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "using PKCS#1 encryption padding",
+          "msg" : "313233343030",
+          "sig" : "6364ba6ae98bc935690023d9df5f4bcda28e09e344719597ee429ae66f4271dc0420c366c2ee339a1964d9794cf5f5c8f1b823639088a0a7a1bc553edb8db695ac74e8498de5cd34a1d95248b05de56da0878d23f646072ebc37075a4c625f721149104578213dea116b26bf726ed2550b451fb893fb90bfd6963f3298f6c10629d42584dff7c8dc7d5060b52f93492c8dffb71cd3b55756b93ac27569acb2602dbff71a95ce74cafe6ef5759dcb85949c142384b4f15b059070dbc0511734ed977ad70bbe1dc2a45dc724e8d709559c975a731b619e5ff9737db0c7fa1c77fde76a63334e8fda761531d35d292428b199a5f2e08cd4ea2a37d5b2bf47b68fc18f0ea0c6b5f903f10e597f4c768124668ed832f9d6a8fd17c8bbfd352685196cf7b7a8f6b6c55aa4b1fb0fc516bf9b618ba23661d49fb70a4e0827b9439f7786fc29132752e258261ed8f6e2a06a869d85e2e48489114b636558edefeb1ad6de98a21125e1f2401cb20e76496037d801d7cdaff0fb5cd3c817efc7a67a30fab316593e9a6d487115a82ff32ca64eb79483ca337dac18e8b17f6f998bcc5bfafef937fb1233fcc06a2f151982a27ac27b3005569251ea6d1995dafe4f82f592dcce808882621ba245619b0a7ff4fb1a445b598a3ccd7acc072864729c5572d8a4c8c207dd7eafc9385a44e6a6e07b5a744795c74a1a789e1a3520e43eaf06640e",
+          "padding" : "0002ff...00<asn wrapped hash>",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "using PKCS#1 encryption padding",
+          "msg" : "313233343030",
+          "sig" : "7104011b21345d72d2c8b9264b8841db3db436ed2b1d4943596a756144626de1663a5ff4f294c3bdadff4998a127c29522c63c44d8ae7af49a0e6715551a2a7da73bf69866ffe55bd20a9b2620b813b21d404be5d2a8ec857a95d160adca91f15bb8d95f5d53aca7a2a32611b113ebfa69a3ea903fdaf5d33488394dd574ac6d1359dbc584b00218c2bf3415baec27c2286054770ac75de56936d6a0429d1b46fd9ac35dfba0ff2d23e935b970874c128970876ae0e60326d2f7f117a72e2f205bbb63d9f33bf624aedef361b5d60d295cba044a43cffc079451158812a794b516aac6f4f086059e1a1adb94504cad7b3e4f6296c14a162655e54fd68f95576782700afa51357144485cd4959cf2cbb9c2be718f39210261d90b963f8e6cc9bd94442a13f98d2bc7178ae460e749d72cb648dbb7d9966b9700efbb908f039487abc607bf88fd4e7df9a4f045f998810972e68811c1c3961556e0ec85808d3ea4093ff0e0b10bd1d066f5adb9deb852a726690bc6294fa10f83d9281edc380c0cfe5e70e6ea344ddfdc2d071c37247821ea5a290f72b2ce509406968853d6fa4b2ceb635a612486cc903c01bb76d34c19d4bc75b39150de67fbc125e7022b3774d01260c0d62e6bc6eaaa189ebb70a00b1bb9a8ba25564afe00498d541010dbcdef82a597ad313871357115f8af3de78f366c3f0d9439acdc79556c8a3be6604b",
+          "padding" : "0002ff...00<hash>",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "invalid PKCS#1 signature padding",
+          "msg" : "313233343030",
+          "sig" : "6048d8149c4c3744c35b315117e983d47ac0719c8417b41e7d001af0b9dcf465db93631d7ecfd4994086409d39cfbb2b2cb08a30c69bd45ad74d63007e0853f763dd5006d1f1f9b457d5fde60fb86904b669e0f3d5379eef168dd74f0d33989c308a80fcb26b61002a81a1ddd619d5c9bbb4f9fbd7c4f99eb2d4df27e37d0d4984ec2853475cfb533b5cacce9c31d65f06d7fb06613530d942696ff427150e112be4fd06517d643e50c59ee0e5f8fc28ad2f8a220399bdaa66569492dbc1a817bf76dfd07d9d99fcd2c290a6a289e4f5030508ef4d07c77fa1f61084cd14bc3041b20d1672b3948a4de3005e3709e126c46eb1ec1f63dff00785cdb4c16cd02645a7acc1bab969625977d2037a7ad910185c4c8109dd72294d553ef8b73998c12a118c4feeb40c27fa8ff4fac98da8ecb7b5883f22e09487db871351b89d484d113d58dab0dfabe42c06fd46547588c53f5cf11088025d54f61f724623275b18d4c361ec021379f2fa50df7d2bea9efaf028d13aa5f6a024dcd93454b278790844bc42cd39af896c23a46c37f5dbbd7fb791bd8e5378d5df68ef053264710c224fe80a197c9a9338a4433f174be73c37e25af31158c5bffd71fc480514560db478553adedde31fbb65ed5d28201e3bf15750f328834e5a963d0fc2daa4949df041f54a6a196ebcb789f023084e48433820815ed7e5c5359d3a0fffdaae8b34f4",
+          "padding" : "0001ff...ee00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "PKCS#1 padding too short",
+          "msg" : "313233343030",
+          "sig" : "81fd5d22e36e8bce36644c47467559bf83c2aae87a22032922f6e0aef582e4c799b2a12ec8534183c982ff1cd97ec7410e7203c3ad426ed6a97efa158261c7d9486effed3640c469a6444a5b1e43ebf7c359b04aa37135bc51de5750519231f682c0ed6fc715d78c34bf52df4e3ccd28edd0cce4828042d3894381fb99429aa306b326bf59f030b752535914d324284ebb5073c14ce3cc1000e0d65ca90f068ddde05e2d7b22ba575b409aefbe37d110f92aeb4afb58d4d03d140f74fe04b6772b52c960bb1120d359b270f0bc926bbc21d0a42d7d8bc56c5756dbddd0b32af7fde1e8930e195874f590001fcf63968caa75bf9acf3067f22a64370ea68302bb36fcfe35b1c39f7e69bc69328ab6af1b5b67fe3f86c06dc823e34f8652a0f5e38f6965f930e3ec4abaea3e9ab3b81132a14b61357aae48bba795f585a4f87a81bcaa612ca564fffe043e663dd8469ccaa4a8f388fbf5dc498bccb23f72cbfda7a853c9c132c0ff27435a6baf40d77b7a52ad8e8ee7ed6f0d6524cdf060e3e843b538e586facd8a5f5f3dd97712ef426f229d803ac6d6ee6567ebd0ccc467b2301f567c92e1c4731a4134c18edc00c55779d7a34a6c155823320914157fe9d7226907a7750bb78f7b6b61b134c18133de7dd4357a7763f88fd3886d95d47449a6385243cde3bfb975738e96078cf8759d516b31268c0052045635ce50f8805ff0",
+          "padding" : "000001ff...",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "CVE-2017-11185",
+          "msg" : "313233343030",
+          "sig" : "c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d3",
+          "padding" : "n",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "invalid length",
+          "msg" : "313233343030",
+          "sig" : "c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d30000",
+          "padding" : "2 bytes too long",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "empty signature",
+          "msg" : "313233343030",
+          "sig" : "",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "0",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "1",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "2",
+          "msg" : "313233343030",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "n-1",
+          "msg" : "313233343030",
+          "sig" : "c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d2",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "n+1",
+          "msg" : "313233343030",
+          "sig" : "c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d4",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "-1",
+          "msg" : "313233343030",
+          "sig" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/rsa_signature_test.json b/third_party/wycheproof/testvectors/rsa_signature_test.json
new file mode 100644
index 0000000..470c602
--- /dev/null
+++ b/third_party/wycheproof/testvectors/rsa_signature_test.json
@@ -0,0 +1,3706 @@
+{
+  "algorithm" : "RSASig",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "MissingNull" : "Some legacy implementation of RSA PKCS#1 signatures did omit the parameter field instead of using an ASN NULL. Some libraries still accept these legacy signatures. This test vector contains such a legacy signature",
+    "SmallModulus" : "The key for this test vector has a modulus of size < 2048.",
+    "SmallPublicKey" : "The key for this test vector uses a small public key.",
+    "WeakHash" : "The key for this test vector uses a weak hash function."
+  },
+  "numberOfTests" : 362,
+  "header" : [],
+  "testGroups" : [
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuw1BJMIBMGiLhBn6vsxC\nfZRsUJbc9p7LDrafz1rtFdfh5f5ONPvib4skSqPwiNVGoApTFGS6S4mAvMTV5UvM\nIOGlGvqQRPf97Lxu23UbWl+nq0A6BOX3e6eGXdbSEdoK+nEmKnemPZwG6LALYWyh\nXxHqW0lIlzhkGD9XA0dXBVPjh4N2yk91Nq1a+sEMCns0pcEfjPFhFfuutLMjsa1v\ndcfsO5VIkcqyYRzxdozsmDwXF8V/Z2dtchqVW9u8IWozRbsx19Y+Br2slqa5kboe\nARPQHkjHerMn02tCbC+P5IJaN4d0JYhckn6SQjtpd/wwQSKiw5fLdIRf6ZYduiLB\npwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "n" : "0bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "9f420516e9d063e5e2961accd80e3eb0198b10f4d64e749b5bd39a80f7356d2ca0fdbbfe5f5b2bba92da7616a83912b449e69f8ce6e35a27e9e553279d6a9317a1d07d897dddd9a8291321359c6a8a31a4ad7dbb54432bebaffbe8940e40cc875d941ecaa10196e1aa68b83e0db67e34f3937dc1dd11cc0e5b40cdb0b90ecdcad793d7279dc5b5f6cb356b805e6357baa1b3659dbbdfc9a0f042131760fe1b78202f289699e04b5c55f3ec26fa25460ce3de5aeff0b1f5c435e022e1168f9fb86147e7a8b0f11cd988d59c81c3fe74116b350e0396b1cdb2b4e0326b5c90dc384529c7f794c4c2f40958f97ea203d76a75076d5360228e7ddf166842b9165e8e",
+          "padding" : "3031300d060960864801650304020105000420e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "b4e0a273bbf6e942cb22ae5ccbfd9d843400ba451c5e086fce9b3b1f90bd892fadc54ac45b61f3b3b37aca67d835fda1b37d5bec427382be2348062716d4592c7eb5c9107cf391e1cec01c74d64dfa5cb7052f2f8e442a09d21c22ef5484cb045c25a05b3057b266335f619ea8dc43b72e9abf38c19b5d71c21b9bf2eb8b63f2fe0fa868f7dbc9deae9745adb1fc26027bf5e2770b2d250c7507faf2fa63fabc67eeada9f2ed8f724dbd99d43294e5ec11d1575101d32af1a308abb56f7f15f544204b533fbd96fd3fe9174db3bc2af67c35401cc4003bbce360a7898dc831011ff0582c0658663a8c2e7c0e7a0df7f3c8ef95175bc136c3b49eb7a65023b08f",
+          "padding" : "3031300d060960864801650304020105000420de47c9b27eb8d300dbb5f2c353e632c393262cf06340c4fa7f1b40c4cbd36f90",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 3,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "9f74957ef2ec67062c5064143d096610d04af16f23189bf010f560d49bd793d619f70125dbef4edb4d4c923f8447e48a744428d8b463745d84a718d3c5592cdf6f611a735c7e04fe3f89920cc61e0113df20b93c719df7cf62013a2db3b497c033704352519dd51975eb156ee733d7bb342093bf494e6d7c8e92537adaf8b9170c0a2f0d76af847f716ecc87e8cd3545151387cafe062d5a2db83c5463b84d13b1ede8656efb3ae9509b449f4676084042b7c9091fb75476c8a866bbdbe57e125d7c64f2f7f1d4f732666bc7ac09c8e767d145f22243dd1f10943aa61b75e85256c52c522426c1dafde98af977c8538f7441ccdbb4eabff1990304c087070b12",
+          "padding" : "3031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 4,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "257d5214d02f48bf63a6a1f2604824bef64108af97a6032d9eab48b7964642e104f13c462289fa889109274360dfedaec2ace0f5f190d2e9ba0d2d522dc763dd60fcee52d513bf9ca7c0b29de279ca8b401bc2016c10d837cca56498dd644e4d350315819767e2908c1c33b71acecd0143e2913f9eec1978a900a3326bd8bb7574521c39efa2e987327c9343b9da06b304d1e4688ef80e6c285a6dfb64b57ffbfc786f69a2a1c0948ee6781dae288089a5dcb7fcb1e53a74b828b34867b8d7fb5a0151e43076772bd53a537937f8ad6e44adcf96a18181b460b63e530edc56a773fa3adb252cfc8bb664ca560a054f374c2a03d7532ac8986377b76ad0a4f1d6",
+          "padding" : "3031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 5,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "339b527aeec23ed9319d5c5ee671e8e92fde09932648734b1ded4eeae420e113a7ff1119686aef90c0bea5248ee1d50f5081515fba7a68a7ac8e2ba9828ebd58237d211c8212267f2a82363ffe790e3ad5282bef3842ead902cd98194d440cd1a53cc34121862034670dffd82aff9bda7f867a3893c2ba2d60cd3d5a3ae1c446c718e99bda195e8b19af734786c62908e1e18b155dbf791283c1bf3e02ce009e08415444d56f5defe78200557d513c8d93414228c4b746a10262cc4dc573da6801f624c5d99c200bd5731142e49d69f9cc9d6d914be18d09bcff4411f62bf028223ea559a41c71a970f5e0010ae487db94461a662d56e124d7b275e8266e55f0",
+          "padding" : "3031300d0609608648016503040201050004202f77668a9dfbf8d5848b9eeb4a7145ca94c6ed9236e4a773f6dcafa5132b2f91",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 6,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "6ea7297a28c575e4348878b928d6e938a2e3d77dc46a785611a64817fa0e9c8ec71728bc7e8f9eb3268aae0f3bfa23dcb73d503e0147432b4003400167ddf2f9fc8d09464e0b91a44de12c1efc8c38732e1ed87f91cebae036610c43a3b8bcd5bb4beac4f9fb5e39f193cfd4bc00d4c7a3a98d00c4efcd1bd64f260a2a957fc730df6dba68d622441901c51f5788d6c3636299ed3eaf0bc23000650ca97ed62d367a844f23649bdc23efd0349dc8d58cdbcf655aad1f9d3a21afa02930d68a2c2db68e364b0966b005c460b682717035fd43f0cb0e7008a3d841a90c0449de8d154082703313cd9abdcc836e6c1ae5b1887f75d2e4b6387e7971128790a62c00",
+          "padding" : "3031300d060960864801650304020105000420ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 7,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "5a7186589cda0f9fb081dad864032ffd26a775fb33c7dae0ac080aebdd4ab53bc3ed37cc09f0a1b1edee78f0790ce0d1b656e4a788172db08900bb1474159937ad29a7899d6bbc87c743945c798307e61141ac21542af06bc2f435a47b505b2aad2619800a97396392f141772cfa97d762c42ee8afdef27617dc8056fe75b23ede6c8f4e9abe31c8344edd2c73e5304621283021ae7003cd760c3e34caec5b4b5cc6d291cff1ea80e5b9b68c5b7b045c04714d3dc73e150eb770d3d3ed788a4ed039117881ed5cd03eb3db6e4084679e09078110630aa6895029e7a6dd19d5b77952bbb06de26c2179fb06c64d184caee0079287c7b18f5ae7843e3cd01eae28",
+          "padding" : "3031300d0609608648016503040201050004209432c1a7d343fcfacb164bdc44ff71c1281c004886b1c428419088d06cd3561a",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 8,
+          "comment" : "Legacy:missing NULL",
+          "msg" : "54657374",
+          "sig" : "38e80b028443d96685ed76d4574b36c43cf9722e5fbcf08bc974385454316dee326a308c935a6e612ed26ef4e470e5f3f19a223e2866a2f1c805f74c804e2184f5620c1e84f894b890be7d46420178a2a5ad97b4bd3d31db24828281587207041a96792d8ee57889c666719c769f759c2175361434b18f188de387c8c13f6fb3a7e96f1abbb6124e94fbb4c6bc1d88caf54136b8f01c9eedfd614bc35375f33277d2e71a4dc5f65254179bbe75634e9dfe05aff9e1f1d792f4e6caf88e4299ed90d212d3d7ac9bfc71a8ac85ffbf2f49f77b41d36a64bccd3fe8948054cbad480451b0ca5f7fe35b0f6c772d64b70346f469808dc0057ba1c25c6ae7ac8450e9",
+          "padding" : "302f300b06096086480165030402010420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "acceptable",
+          "flags" : [
+            "MissingNull"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "long form encoding of length",
+          "msg" : "54657374",
+          "sig" : "33a82ebc17f79f56f79073afbe0ff3f984f868684c529ecfffb3bfffaf52a99bfc057b196c3faeae3cf722c386c224ac235f781d9025ff8c9dcf10c4cc7f93c1f1aa5e1db9b166a71ac7350134ae1a1e5537a67f846f8c6970c269c4b91bc59ec783b7710afbd763ae42b1125eb9d0fc28b4045071c72320448a474006eefb256bb403b30a67c253028a2a0af7e4e36e85aa70ea73541ee2694d2bbe1415b37d2210def5ec77ba23c6f5cbe31ee21e072b49313e6e18bc6d6f2ffbd6b28267a5cdda24a62edd2151bff87ea6858db5b863c13a8e2a6445d8d31fd6b3ce8fa5a31060f97545f1e04df6819648a1933b1bcfa2470bb14844963f53175f1b26b612",
+          "padding" : "308131300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 10,
+          "comment" : "long form encoding of length",
+          "msg" : "54657374",
+          "sig" : "37c62aaa10e8cb4bcce5fe466ac8688431e8ad2105dc12c6b7a0dfe8657ef3dbd027d04847c7d708c2099d7d38ca2b21aa5146ec0ffc7fd1a44c91c24689fa37475013e5b30c92c3565e3d53afa73fcf269dcf3b2bfc48a2ff026130bc008a724cd29ffc546d1aea5aeefc8cd13779b3b821d78bc7b7664fc7a89ce0273a8eed1e4a683c739005640c2edb756ea95f48d9c91d1ae9f57f24f6ce3193cedbcc52d05eb0dc8a9634a0ca8e12a446e9ac3378cfabc37b498aa4a1a9d1d3a6fb308411566f9c68063c0bc8e78621fed3a22073260aa87c76c5768c3db7f674f84d8826381fc3491f46d417a73ab88587d905d1c090e37913c99cfe29dae491841d31",
+          "padding" : "303230810d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 11,
+          "comment" : "long form encoding of length",
+          "msg" : "54657374",
+          "sig" : "875b9204a6603968f50d6e4dc13d3192077a286c3475165b0bd160ff3df39fec5859a512886fc1e06916c2025e01ae2f7ab3b341b6372f819a625a42c22cdafce031d9635f95dd962a8f202b52f9925f07bc0c94434a2091d861729551e37d7c6019e16a47ce87f3f4051b8e9adf62444b522f522918c391d82940418cb3976f0c30634bc5dff2c4c3f36a4489d00c5ae65021b3bcf5abbef9257e3c976e5fd305fb30ccfe13c43fed64c371f8532dddc70a1f411cae257f37b6743da2d9567f9dc3513b267ee26e2da1a6ef005526fd90b6ecdfaed9a8d9e2bbdfae25b0adb81004501ff32fe1e7b7acfa18de5a1ab876705784181b1336288aefdc91186c3e",
+          "padding" : "3032300e06810960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 12,
+          "comment" : "long form encoding of length",
+          "msg" : "54657374",
+          "sig" : "3cba108ad11cc9c6cfb4b849b1533c37557dd1ef2e201a78da42e164458ac54a29f0b11b1931e72f57266264584c13e910267e52bbcf15883e109a45ce14a86ac8e700cb04ea0ccccb55b01ce699275190b98c77981d2734d35d8ad41f94edc6481cc831a44d38a617a32855df03fcc44914e55b88271015c971bbf051d878b3ae7a8f53582ac8e2ab5d10e5023e67599725e9122b8ec42a96b40410edac51b26bec597b727404a6b1b24807e3df2fca8847de8b7517061edb009a40c8b3aa82cb22de080d3f7921c504965d5a23887ddb54100bc81894991c1ace0ee2afd1c38c554fd00ade0240c2067f01977326916d1708af027453f734b0a22331bc9453",
+          "padding" : "3032300e06096086480165030402010581000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 13,
+          "comment" : "long form encoding of length",
+          "msg" : "54657374",
+          "sig" : "50c6c70b2cf065c62b8b69884ae779e08b376574fe9307e2dc4ad58a50c5b2a8b74c1e8929b190045dec835e5f26c73824ddcf1a4b63f54b9f90c5f80c36f6a0cb616fb8b63926cca91c90761f960b83381cbbed3f8ee83eee92324fd9697b7f2cc0e784c956354b58e9243495800235156ca1698c407dd9b6332281bb5de1ff180dae7bb3393016e6396cbc7a02ca159b5eccee507a36ccb9338623e050d217be8d9826d0683d59c0acbaa190ba91da6b8579b6086d86d32edfa0f6f17ea5a58d3b8bb9e06ac1517eb66a8fb38094ee19e22b3d6d3cf8c1d001635e3c7e18823b69b9026d81975cb209024b8ebbdd88accbd9c5279c7a2fcd824697907223ef",
+          "padding" : "3032300d06096086480165030402010500048120532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 14,
+          "comment" : "length contains leading 0",
+          "msg" : "54657374",
+          "sig" : "ac3c440334308e0eef1b3c3afb42dd050c77f1bfe9f3c3c83d466a46bf708502f1866f423d52866147554a5c9f86f10c079d2bd47192dce0968e8aefd5f43a2892ad21b0bdb92be45bc380c11565ac7c01be00cb1e294048a1efb4cbb19be44fa4b542e0bbf9a47549d09e456f58ff377adafbd68ef8d86dc2d7d56c5d3be08ec6cf12c0d04bb7c64c13f08f75377ba896bece7f409d50809521b7f6496c992c90ce15a70a8f8096f8f2cbd3e575acb618c87f56324885cea1a6ded33d2f09d684f8d5a98c78f94853d74b9e6ab503918fea323e5534d3e45d51b3097e082c5da614d03a5ac422e5dcc3b764bbc02aa633a517bbe391d2662d71ab851e4eb3f5",
+          "padding" : "30820031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 15,
+          "comment" : "length contains leading 0",
+          "msg" : "54657374",
+          "sig" : "65fa4957fe03c0eb8a6680ede12f009178d3ce357927c8586ae056f209e0ab0c110871fdf0b95a2ff684748beb4e5a6a73ca3c657b23bfa06d362a300f260f4d60d459a066c9f5311d634bf96ac7ee4c80ffec2fca27eca7dbd37025bae76122a1fed1914da70f2bfb6bf2e1bf3a624acf2a6377606fbf06044a21a39ccd55b2cc1f0ff184d9df95bd73942a190f30028e770139d38ef3156f64fc3eec68ed5170c41f09f110f5a0fd195cd42c4dd8e394f32d195c159c7c2b69943ea966039b20c7ca17cec610be60aaf7ecdf3511590a662b74a181fb89135604d84cf9c4d6cb6cc0b4c24f4b5e7e9e9cd969855cdb92e3b399f32cb31319ac81701d056e84",
+          "padding" : "30333082000d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 16,
+          "comment" : "length contains leading 0",
+          "msg" : "54657374",
+          "sig" : "305b0cb38db7ba5dd11c1d82195313b522f57ceb7b4045249dcf5977b99315f6708e9d8eaef6a89da0c11fa6f8dff3aa9050369cd520dd6e957226144fb68c846255b923a49ce896fed8828f8956d0d7aa5193123940ad0a5225e921ca0dc0852aae48507c7e22ca007f403bf0fcb6553d0af0bcce6be17eb53b0e8401349c8d144eb1ddbbf8215fc0e06d6adef096acf52d71978b1bffe95ffd21899256dc944fa9cfd4d7a25e62843f965d55515f6c45b22a825288773e25410582f62b9f1fdc1e0c6d4c941b90de7d8c3b18cd3eaf5319862d7ee160a5edba133cbc67024771817c7eda526c92d146e3b38b801025d01871c3efc2591a32ffaeb7b20e7dbc",
+          "padding" : "3033300f0682000960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "length contains leading 0",
+          "msg" : "54657374",
+          "sig" : "69c99cb5b397c6f9fa0f38b0d311f8b64eca97b578302912208bdae5c04244da7cae594e59a6bc0935b8878b7a55b90acbe73ed2adfabbe561cf104d2a60aae3c4fb58cb69a11ed739dea095c224c98bb0fcbddd44d4e1e4b71a8681730c4605d93a93e40e27e6b1182c57fe5f4332898872add7e2e7c3b39e0b45d07ad7cf3c90ea5bdad70902533ce78130c74ded898cad1d1830414951f33ecc0119ae785722d1d4320781178f393ca1fd11dd96da6f44bc586fb4b5a911fdfbb87b7d88833a9a1e036405e205013e2bea23e663dbb2fa813f1d8420f1c57b25dc5bc09fd7dcf99d0dd4a5b3bba8ff2cfddf2f9aa9ea78b8f4132cf0f373157b97097fdffc",
+          "padding" : "3033300f0609608648016503040201058200000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "length contains leading 0",
+          "msg" : "54657374",
+          "sig" : "29a239412587861ba02da5cbeae093ff6217ca4b1c80eee56baba352290d6cf721260021b3779a009a3050c2e5fbf19e1e717f906a7f62e52d626c4a31e259c8324796e63ac75bd04081cf2d1f22a5687ee9464cd47ce491eb7ccace2b6bda1ad3c99de2b4dae26021d08dc270a2e84d4467f7a6a2cc59888f3b74cb107311c62ccf5f327c75adc5bdc830c2bee5303a1c43cdf80e00374fd3601f122b19ca4b2f36476abbdd0633561eb3f05265282b4d637647a1e8a2be47b4ea40e4248c3e2541950ef2eb98a487569a35d3c8d8fad28d42ba57e3134f828aa1222c4d13b6fba906086cf8f07f5f3ad539cff8c0cefaf42d89a884444e62e408e36236e70c",
+          "padding" : "3033300d0609608648016503040201050004820020532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "wrong length",
+          "msg" : "54657374",
+          "sig" : "36f62f546a36d5215548e6a770a14fc6edd4a9353ff8ed6231369cbb6598d25d86018b8cea9f1a87c150fda18c7e89b2c907f0ce485c8c321be467a97febc05dce335db88cabdb99ebc4c187a04fdc8e879487f03c2aeccb6ddaf006f0613d32b197c79b2a8cfae015909e02746fecb9ae9da3f07ee91ba70c0356984dd15d078cd0b93dd9e3c1cc03d6f255c1383e6e949e529ca4408f0f453e7e94c17e9b47f841f73dd62e5be047c44e1d9d7eee0d9f2a56bab13d4397494812793a49e8dc0d237242bf134aaead8f303226e532afd0c2e9748be08d7b7fd74f6f1806cfc4092af39d6eada4e0b6d7aa6f06592f6cd7dd26c1fcc84fdff1bf3086e8e2c81b",
+          "padding" : "3032300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "wrong length",
+          "msg" : "54657374",
+          "sig" : "6e18d86059eb2f05c0c1277abcd8d2380ea39ea0c4587ae140d2f709363eaa2b0b7f801a75fbe15aa329129c4abe43ec0fd84f552a3aff7e4de40a5943ef13cc3b2d02a1ad90309e8091d5c2c6fe3b6dc2472c94116cd9adf367e575720906a9fe41068a86c15214e3dae39ac41b84f5fb824dbf5c911c8c640254cd19910e15a6488c2a59179f271dbde468d540cb33dd5add9a864780e27a3e55c87402d9e2c0e12d70c9a41681bda6f9f337e7a26dd2ec06580e6fd9cd4db40a62002feaf5a4c93dfe05dc392b63809d4caebdcdac74a7a240260a6eb8db8dcbf25527d4297e4c6145decb0a888817b4f949fb66ee63e5cb2c2477a9373d1e30b4d71cd7c1",
+          "padding" : "3030300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "wrong length",
+          "msg" : "54657374",
+          "sig" : "61a6e5ea6b3c5241d75dbf0cb397da7cd9d5b2c23ffefa183ddd1d34b6cf116b127045f4681877fd58907c1209528a6b45266cfd5bf4e95361b9036c77fd6cc7891cb2417d081ed897ab97588dfcf975992ac9c0239aa9fc19dcf6d6d0f3e4bf72da5ab09cdd4b205b41a27e6b36dff608a638925d13e3ad7143b1ea9a2758c787a2f33790ad423749c1b79b3239d1f96fc4690b19a0b8edbeff446b148fbf39a890ed8e4a18ea09d5e50c25855e1a4a4c28c5437c906d1a9c371569936c858c29bd16e98af749edf2f048933d706068928e81ac7e219fc923f6dee8a411f40ede593468ada31e5c647d4a576ddb68a335bd50cdf7446dc722ee711b5c71ae93",
+          "padding" : "3031300e060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "wrong length",
+          "msg" : "54657374",
+          "sig" : "6494a47f97d18199ce0948b2ddf81e408e2d4acd58705059454b728b1be79842ca8b9e197a29347bfc02a6830aa7189ccd84469e696daed24fd3e45a403af6d38a2bf3e5e8005b9535a00a5b1520a9665676aa51a1b274a3c0270a20b86a5168e08000fc4cc60673604564f8620e9a2a2374ae148ec6fdbf7e880fb8be7bd85131a3b2cc08e85ff3270a4b433a6f58583a16e5b18eb2a093e6249e0e5e27c13e1cfc3fb8e078ede70034f52f4540f5fc69dc9124671200c5dc6961aee740d39bb5b6ea9f9325f2dc9eb85be46b998b29ed3dd9c7169d58e33efc212c9cc0b09e356e65463b9becc52e7654cb22a374832ad6d4e219e0fc5eddec8debf779031f",
+          "padding" : "3031300c060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "wrong length",
+          "msg" : "54657374",
+          "sig" : "99647015158993892da3dcecb4fd837d0111d7ac81efac2e1bae2242e6605182ff1ed43e41b81b85448367815c6549e363a635b946ada99ca0118cc35f37872aca53b024aab1d809909d27bd664f32be9501c3d4b7e3539c2ef10bfc340a89c23cd2c25e51425e2e7f989076bb716057078c968632e0d47ec81192f37dd5dc4d8a0ffb5e9b828b08b47b350801bb4d358e91165444e8ce8bf5d59d4dae17202919f67c7ec8b78105e255d1714ead968b9c075c11e69b5478c3595756858a98e39f321957b6ddd63b37c69d34891beadfded732f0ba587fba6ca62b0e932acddb5c5a75ac316974dc3b5a27cefd81d799a8a6244a9a78fcbc403e6fb41e4f157c",
+          "padding" : "3031300d060a60864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 24,
+          "comment" : "wrong length",
+          "msg" : "54657374",
+          "sig" : "629e5afc04cc1f4c602f030755deeedb0a5f5c271b3d52556e81c44911296bcdad7f5d223cb6d72cf9740554bdde2936a7e3cbfad72a7704d27343240f68e2f598892911e50340c2c29a41c0d10ebb996c7e92a94fcd23a03507488be345ffd63db338b19e95d47a1095cb6894079865d299ac8101a443e6b5a9557acb9113552932108565d1d3409aa30b6c013c54bc571a08fe9f39c6a3ddaad948656bf77e7407cee8d74a037ca6860a466ad06082c39f9266f7ea16b62b5fc149a7d23093b5f7c48f81673574c8a68b75503c15ae7565775160e16d0e4035489179735c0c9736e52654d4c84c1a785f8b5a9ec2f42aecf88cd925dd274ceeec7e1d31ce4f",
+          "padding" : "3031300d060860864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 25,
+          "comment" : "wrong length",
+          "msg" : "54657374",
+          "sig" : "278b61e00fe4e47bfde76cf6c436bfa0e7fed104493a2457ba41ba5fa430cd417ba2ffd345b27d739f6fe7b414e9498e1e44a0a5af8af2f9091f4b42470da0cf09fd1d3542f8a991f4a3be0ac6fb499290889a0e5ba595ca1ed9d97f4407dee17867ca650a49e42c701e3429a34a8bd8e934aa8d107f1761a6fe774c70a974c4ba30990b55a082c87f39266b526c13c4021918196797336e49de36844c908234def2f66aa82e84715834019cbb906011d8bdb29afcbb31dc7503ede0bc39124ac7fe054536d4d79d99186542454253f94a604559a6e992116230c7c9ce4137308b8a091f31843a87e39e29c4ce1520803beeff3fc668741cf504754bc870908d",
+          "padding" : "3031300d060960864801650304020105010420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 26,
+          "comment" : "wrong length",
+          "msg" : "54657374",
+          "sig" : "b9709d62db65f1584a5f0dad0602cf2d1ad02447289312f59d001fac696d5b52ac9311e0e5266dc04f5a382405259f6568274a8aca4782d5017b97c765742c6a3bec33c8f3cde398d55bf7ee0b2d3fa768b416c0b1a58e70b865c39057bf6ccea37112ba2d277159ccdbaca928fb4fbf5970296462df7b8ea7715f76c14bf1ac7e4a48a6086e7ffe71653e4246aadcf97a9999782596c87ee5098d788a1a82c2c52bda65ff5c417f9583537aa52c5d8151b3dad189dc0f93758c9e3d45a216359f9952388dfa3eb7b5727774815647b17f6feb39d963340aec6b37507a349eca6c677fdec97d9a5d21a87e999573be5c90d71cbb1b58946036f3f4e6c26dcedb",
+          "padding" : "3031300d060960864801650304020105000421532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 27,
+          "comment" : "wrong length",
+          "msg" : "54657374",
+          "sig" : "7cc584726f5874d041a892993bcac52a34e71ba6fe4c3db4d48960b1abae664549656af526b59b3018fbfe7447c4c6730f0e93cb148c0f0fda55fa0a93aebab07519123805ee1d551f19c4c69c09549ae56455710cf7b5468206b820672a0d7221fc7972e958e241d4ad164ef1f90cbf769a1ccb466081cc60877d28a05c91f90eabe57d9ff8d097a3a1f59fa69761f0f3b356c2ce1fa7af8bfc70a1c4753af9c715387a5b3249cb792532d1cba87be23624836eb33f0074e927122479a9d71f1962ee6e7e7be1ead8a514bfed9abfd4cbe33ac2d3adf438bb86ec47734961292bae4b61224e957e331b794c22066cde9e51847dad897e7c65d35c98803830f0",
+          "padding" : "3031300d06096086480165030402010500041f532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 28,
+          "comment" : "uint32 overflow in length",
+          "msg" : "54657374",
+          "sig" : "55d1cee3129381d3c8526661a5f2c9b59bef9972a8d3ecbddd3cd859db06be0971a181d9deb7a7333b3f40eab2e93a67342da7880961fa3b931b3ee94cfa5eb7cc76ca8f6f013bda5b1dff7a7d8ec7afa76fc6acb7809b411e8d77e97fd11f4d13af1033a04b949ce35efdc52e125394759df4f7658fb4c807823f80c01b74c5424744a39193c901a8b7238f77c330f0c37877cdfb493228a600dbb5694ccaf9521b0e2921cf84fb0a778d6616ea76f79d89ddb344834bb34a033f2399289c35ba4b5b70b1aa6d504db3f15cd1be6215678f01f3df03a3a38cd2f6e9d18755c484b4b4ee514c976a7a3edb9d93f475c4fcfa6fec43e6f815095d4dda75a5ec81",
+          "padding" : "30850100000031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 29,
+          "comment" : "uint32 overflow in length",
+          "msg" : "54657374",
+          "sig" : "759135e8b8f94d853d92e75bed21033eaa80c88e1cfa202aeaeee96fc9dd8f5430da9baa436062c843e2a6d06801e4397c93a7643b52e4e33c298638f546be9f8b2961c0da08a172ab2a9185eec9b9b859a8b46cb240317e66469882269a53b34c9db60ba080e1831942db3ad65d3779c7205aaa366c00b6372496d71fd5cebc14b885303fb7c9e968f7d4f9f0511bac5f273608c8803db4ce582eddb0c672d579b4d1d67cb5aaa4fcaa14d744acb8124f3715bb82417ca020cb1b2a597f149364f859d5f1dc17dde4181628b96438df017e9b96b87f45d40383badf6b6a89620adf601c9c4fee15b1a868f8bf7ed6f59d1f9a960fcc1d961c8d010002e238f3",
+          "padding" : "30363085010000000d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 30,
+          "comment" : "uint32 overflow in length",
+          "msg" : "54657374",
+          "sig" : "829207379fc900183437b9794d8f7fe9ce67bf4dfb66b04c5e841575ff2ca607766acd6def23b5e22d25be703c0126be641d72f245bcdd60ca0fa8ace694fb8866ded8d5b572852ab899b5ed8808789167ffc699c242c7a6124f6aa6754b2b8c7e654f14aca2446a40f64030b0d836562ea9fd44adb75d235f1b7ea86048b4094aef96f0cd76c31ce25788aa9fae68c1062ae48c9a6b9130652b50be2f98ba64c89a987c0e566ba74bd3616f79567bbdd867f0081e97d0fbc948b6819f46561281061a413b4f3f43d5eb4174052055745d950caa95c320c4c7fc5e02f604071bcc361c20d72dd5509aa496a9bf1d497b61a064893880e052957353b2fab31476",
+          "padding" : "303630120685010000000960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 31,
+          "comment" : "uint32 overflow in length",
+          "msg" : "54657374",
+          "sig" : "8daf99c4f0ddc3b0eaa50d674076e2806d744bda24522938c6e4ee2970a5079586d866f0c1abe824b16d40bfe0239aebbecbf67a9155b2855da4656a15d23fc3f1d3518567deec75587d7ea77d3b510b9dd2b1672c8d4774860535f8690a286ea8da3636a1b65f38689b25e9e9b0ddadfb52a0c60ac90b376af968fc654387b5d712f93cfcad8f571ae550072d42b77e439cf28ab0b5857646b4bf2f7b57af7f0443944943828ad174780e1ac0d182fa92cf992991f8fcf2a9d5fcf72eff4ec1847c30f268092b87825fd5931e5306955fe0457e1b9f7162683218f6a9abe5213442a7f8f6a5f4dfbc6084b1bc01f11558fb314a0f07b86b0c6538cd3c7d2fb9",
+          "padding" : "303630120609608648016503040201058501000000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 32,
+          "comment" : "uint32 overflow in length",
+          "msg" : "54657374",
+          "sig" : "0b93779478f1ebd8d0b018e0db874d2f639834d48d2440cf5215c9b914acc3a7eb9111b5f77d605903a40c7020ec8a4be9cced3714df84586d5f9e0fe44fc1c61a0ac529e9fda9863086b77555e68e290ef716b9add9455b2349d9e14d7d2825af2ed0f619636c50599616508c79badc2dc2c47489028c5bd793022d189058f559dc272a01ddffddb8fee9d83c259cabecd93398d48591d7acc2787e1b8598cb0218b007440ee11733100ec3a3a9749ed81b3b62d4b9c32dddde30740c4875e451e3cf89fe5a970bb92f4065aa7d43fc6e08eefa416aba932a7bde5a10df11b433527bafb2854439b463f6a0a13ae66265dfabaeb4d8de6eeeba4de45e0be421",
+          "padding" : "3036300d0609608648016503040201050004850100000020532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 33,
+          "comment" : "uint64 overflow in length",
+          "msg" : "54657374",
+          "sig" : "8fcf0a72c6fd0f9b505effcd2c074051f1d25840f8803a68f1c149dc43af6b94a114efa7ce2b399a91aba823470b9f32a70fb6631dfef593dd312801062c7f64d7c7b8724bcd36b05df16838f9e2ef209c2dfa180717d9d1bb59c10d30bdf6a0c0041ff395d4eee8a1c60af17b8152906a58786ab39840909508f7a8f3a05096e92eb57b31c07e79500091f119698bf31bd14399e122e16c3f0083d0a9a6f6413a8427dd27dd5473a9060450349f51ac265030778dbb04d4a35aa98dd72ea38a548be905717b46a1e31cc0b2c9247b7a64d26c027b7d09fdc5f2c6f3f625ecc3a5e07e37d2623b099aa776c48c66d62764def44896651c6b0ab10f1db7105f8c",
+          "padding" : "3089010000000000000031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 34,
+          "comment" : "uint64 overflow in length",
+          "msg" : "54657374",
+          "sig" : "a34534b9e1b82be8c7a70d643c85664cb3919ced9c6b6cbf470f4aa8c62194d3e287077d3dc03e9e49d9069b69a4fc2caa5c9fc0ff1f08cb9b8370d044baa4be1b5918174997d74579c791a4c9d53f0348d33b6dd9151ec11823fa765a04cf03791f9d8f89048bd702f03247e3d9ea4e9882d9c768166e60b2db47a1bd76dd8cde45933dd1e4c3fd2bd46bbb8b2fbd6a2630f9db7e09dc342a3e279927a68f3da34192d0a283e2df7530b06a42ad1680b4a33c8b4bed2a8e799ff39ce4c5853a2f9d016610e58ce819771cd0ca5cc286134fafdcf36eb6c0f198e312e0e2cf722c47487a43cf4630c0703e65f5cc23972d5c16012b0e338aa6bbaa9a6110bb7b",
+          "padding" : "303a308901000000000000000d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 35,
+          "comment" : "uint64 overflow in length",
+          "msg" : "54657374",
+          "sig" : "615fd599966ab4eb5d30e60eb0fd82ceff2eb244b4888442ed7f6a1f32005ec8818cfbe3e6f4ed7bf9d51775635307e281ece422219059736e938931dcb7fa1c0aed81808d39ec396acf70766e918f017fd41209972ccc55c1e31c84eb217a2d82dfd84499c4499cf0362ea60c40439c3d47e8a05128fcb5f445f08f5d92a29df6824d7c8bc735941ce54f464e44f2bcc6eb3619248bb52d04da149a5f9cbd9cf617257dc95a152681656f537a2e2053170cb2114dff07737872703914144acfa7f26b148c59258ef72e2061dea6c035853a6be96063dc05109ec7f2176a4d601c41caa637eebe907b248922c6fda83bb7e9481ea500576144355dbc98779944",
+          "padding" : "303a3016068901000000000000000960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "uint64 overflow in length",
+          "msg" : "54657374",
+          "sig" : "a9648dacee46c926af22555c2d4784f01f3565949f177f5cfd4c31659186645d115d4a24dfbca04b583ce8f0c1e452a953fb081fddfd61b9ad9e59df2d52be9a6ac1ecfb58c211a8182f93093ff4f14f5e729e15dc0690aa612a09dee2ec44ec05f75ddfbc0b5a88e93e098cb8b0f7b74a3dd07ec559f964962f83fdb95ed913f2603ee50b36482e8a379522d12c620af2b0ac7537a95417df11430a72f72c0ab16babd7396e0c348f033026dc7239e2a61fe75b8ad4ba4ed154bf05cbfec5260f1e4f2cc0bf5f39542e12a3cc8e490c20a554d3b9afe73ac65c0a4c22bd9349ac39ee25d0feac57b6d5e065d82a757fd1fea928a4e741aa8ca724269415c1e9",
+          "padding" : "303a3016060960864801650304020105890100000000000000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "uint64 overflow in length",
+          "msg" : "54657374",
+          "sig" : "174cf250f8b41af4e2bcde276dabe55d193d51d80db308ee072cba6d7823e49ea26b32631a18316f48a8c933ff9660352917d5f197d44afbaf89808fdd16853786e3cb3a348009d58056e3ed84388ac73789732105e0c57fef0362b38ad103aa7eaaff599fcb07520ccaf39aae20ee0e1bda9a604e76646c72c9b4156efc0fc4a2fc733a5c080f50d9a5bed24a35ec863bbc7297c2a7ffdee9c7b3fd614da2466b9e77a72af6d2dba40bab35235e14e520278df7260b588528f0b32072aa532d09471f4e1992c8ff3534e6d0723c1664e8c6ec141eee2f7439cd57cf167f1b6dc681aac0a6ddfceeee9a81c53845ab87c145452627547a0961e0fc89b17ef70f",
+          "padding" : "303a300d060960864801650304020105000489010000000000000020532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "54657374",
+          "sig" : "87bff62986cb2cd250de8d56fb4674c65cafd441da9dd4e42b1e7e14231519b63fa59608cd70d3ad761fdba810993ab3da3ba5d182dabefdce2c383e153df2b21c4cd4b58ea94e353d8c02bcfef4d565cda92975610207c9c30754cbe22bfe0f7cebaad0b6fe1d470d9119090adde8587d15cf27965f525d92ccb2c8778261f9d126ffdd8b90bd00acbe648979567a3ecb1fb5ceae06bbfb1df595e2155889ce62b3b47bce372a7527fd59ab5dca37378d0a90f4487690385acadea3766fa407d277ce4e76416daaeeba1591aa31dc601efd0d9e29b50ccc68d1511581b00f75de4c05d145b7ce0f74ccc509748fb1f8c636e1a56c9c412142d5c9a95efd0b8d",
+          "padding" : "30847fffffff300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "54657374",
+          "sig" : "2fadb8a429803ec2956ae6012289f15f7ed8d535c07412994204ade72d2e7a5548024390e1356d432b7e68c1a8738382f5aef3cc7739f926b44f9b9905222323a97fe7b303c130eb4147a5a4c69a031bd0c459779f7c3bc00bd5ad616421d14aa90ff3f5f4f700efd19826d89c80c6c4ab4ec81ec05498bb543be74acb3f61e6e1bef48e61646ab962da08502fb092961c5fb324026a52abfd1c47b9ea76187f5134916c5dbfc18668933c2a562a02c102b6efb9ca2df40869e920e84f8e73668a73c1cea83bc8600f7dbadeb5babfa74b99a3d02794b924b01dbf087da3d8d579514647633d8d6922a59a3f5625687a4b1c3b5cc67858e9b78ebbc7adc20aa7",
+          "padding" : "303530847fffffff060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "54657374",
+          "sig" : "249c65c65a3334eb4be16dcc3db0732547ded2ce4ae6c10b1e1a0f474298b2ce230c59e7e746ffa173d5dad3b16dd4325e5469daf6ffec2af4ea23db279601b014b54fbcfb3578b078a8ec53121038ad666ac9408d65e8ff4570aa3b5747041f4c3a45a0e9856f2ed04b3c2060925a5c77314f7bfb5c85a71155df5b23f694a9caaac2fb11dc6612bac680d7494ee19bd4945ee82c5d1f5acdf6b5ab46e937a90bc4d6d3f301373026edeee725da4ba5202e1896b716bd8c69ddb95fb364d697fc596709b0ec48bc66041df7127aed311110545c4aafd228ff55986781780455241830397f8fb6764e33d0262aa65814521ec71890700a093f50db4659cc5e2c",
+          "padding" : "3035301106847fffffff60864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "54657374",
+          "sig" : "7d2652c6ffce45a2fc4d740db90e1e87795e38dd5f58d3905b9fd41a2a49f3b6c3c14db49f8378fac35cb67b3593a0991ed4c2439cb7890ef727b94833e455edb94b11c2b0cd7bf5c11f8a206e62f540928f873fc6c6b0ea4e520e85f01140d21ff2ed65945e602e09d6880c275fb9cb0cb9cf7a85dfec032f29d5bbb4303256c0cd02a99a3433186558b0ee9bbd93e5e2a89c9ac2b8f74b94e0d9b02438d1bb54dde5424893683f5e74d9acd1424456a55f74d0654b20f55d199d17d5b3184930d5f95068f61c6d1ca4b0e75f01d56fddeb13a9fc07e185b514ec05bc657f97e1ed7c25670a1ed4e16172ed2c19c7521914dd3001d23219c8b578c566eb2c1b",
+          "padding" : "30353011060960864801650304020105847fffffff0420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "length = 2**31 - 1",
+          "msg" : "54657374",
+          "sig" : "a47037577d6a1480d07bda7574648d9b4d613a6d112f7027e873cca188cc41ad35cb8c931928d2765b60c21af9756b6f0acbbfe0b44b4eb63abded9d8547fb1a37706ab562b448b47f29a81673e27345c156e0fa29a353b90c3262a8a48b0f002dab41aadcd0edbb016973fd85ca98e53116cc3a3cda5754c76ac8c8e44e31aac06d1e248137ba096237d14119538f55a1cff1c7a93e1095eb40918233e5b33e092741f658962355541af6eef3bf3b84e9b87fac775f53e7bade8581804139b765090051474b08c82555daa5407fbbe998f29fa337d21b24b6917d4cb315d035dd397a84c47b6b806bd1e7812795d653073cf349c57193397c542f3fdd512bcd",
+          "padding" : "3035300d0609608648016503040201050004847fffffff532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "54657374",
+          "sig" : "85ec33234ac05061985a24bd9e5e13de3fc8e8c246f75d85abf8021cd993f97c38ec6b73d713c6417effc7a751530feff849a5591ca0c4e6dc5bf6bf97c34bace7faa2e448bbc81e3d8551d4f82f7ed095ecdb19e91498e357909f090fd8c215f830b2741a4a4af518341c312bd6f7fef9c1b563cd4284f785430c538234f6bd3fceb2b49ab872cb481447b2d45a37d45dafad4d6de26246634b99b926e37832a8302d24b35e315f0b971cf52c60ac486460d7678152beff5369441c84ed54f16177f5ae560eacac13d7f94f14764ecd42adeaa0599a1a47e7f500e6b14e0a3b198aaa18fdc6d9141932bb28b20e71f69c173c2b841fa042a3fa0a388e164fd3",
+          "padding" : "3084ffffffff300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "54657374",
+          "sig" : "4d28f0c7915b1eb63badbd931675ecf29f8d69b4b2e1b1fad776fa5adbccdc17bde98029059d46b197de49e061ec57cce2cb77a63deec3c75c2cc14fc9bb4a2ac29d5f4a05e6b4ff97ecbcc26a0dce39760423740141e675b52878a83aa044f68e84d9abd0ea6bfc5e6fc3acd971af258b7b9a01079010e68e70bd7bd31a9f9bdbb70598758ba274fb8feeb8ff46a4b2331a4da03330cf55910e6ce940c1a95b6bee9adec351354774139e3b213627a6d7e8381656362b4c6f83e97f93630939d22763f0850f1b4d38a8e3ed213d2febeeb125ec03854a4b276fb59087904ffabe83cfa66c1af413af6ecde5efcbc5241d5b958425b66ccd31500ceb9b80d793",
+          "padding" : "30353084ffffffff060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "54657374",
+          "sig" : "2c59c0f5bf7fa3b6bda22a75dfc3ba14c26ff3e7ad24c1527ee7ab7c032dbfda6ea5171d88df2de56c1ad6d955dc41bcb8395e83518e40b840c062cfe982c0e42065d7e2a9bcbf91dee53949bb6f67c99d1e1fc44cda982a3df171f9c35424efb2f6c0cc169a44b6e5015df5150796a9c669515aaae57076bb1fbc9480a8ca6954990612eb0314da7efea7d14223081618f2225ce3ce43770d457e84b54a80cb3a35f14c511a2fa2a4d295afa6ed3996d47b5a0c6b1d7c11ab14bbff13af67b7475ac543307626598d69557255bb3a92c07e36c3e9d1530b21284b3d5c2066057035bc753894c01e0f33764b51ca3319ef32d4288d11c7a1767ed7ed89433216",
+          "padding" : "303530110684ffffffff60864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "54657374",
+          "sig" : "6bbfb1ef162a8cc8c140dbcc73e922e1b25c0a5f29e59b879315e5336697f86dcffa1f26c435ef3f38657a501e1a3dca7dea9226ae179eb6e7b4604c4a984da95421676c0a1d5b5ceeedcb02def8ca2e90f657b257695e7f87aa948c7d54570540657f8b79f3622347d4c3aaeb8c8c72abb45a156b7facb3ec3c4abaaed5491b84263ec9614a08dd4ad2fc81682e11d834c328ab21bf6af4f25cf26b81032ef1aac9edbd1879b64e04a24f36f6bbd1b317a58fbfe6657a4450deb0b07386be1e4c9f692d6e96740e300905fe7ab3f48ffa279b581b98afeed03243779127fe57d97d7313ee6b2ffbb5ec7e2bfe5d1509b9e8a794cc3cf45ef488874c3e494214",
+          "padding" : "3035301106096086480165030402010584ffffffff0420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "length = 2**32 - 1",
+          "msg" : "54657374",
+          "sig" : "790911646b9fc46991a8c1fdd0c7a5a8b45a078305d71eafad2dae2ecfeb5f7122d1ba2c77faecd5bab50b05b355740f93c6cde64c42ddb3be48362a741fe29173d58d950b2c242753ba3db6f4dd576c2240f490f53ccf9b6e781fc610966b80cd9700f41c8bffc87790a01a45f3623a82167ac42e52c5ab5ef539b29f5d19449e9fb0b6749a559010daaaa19d15f3fc53b58b1a912db79a46caf10fdd5ea81256842acb1e06282ee66c0bccbd69131b532b3cf7ef72fb725c910338e24cdf2653d443f209efbd03573b54536f98fb002e57a27f62fbb117cca57d9d6a2ac04cb0211e227682988c64421a5f8ad6dd3916d0d84b441847324c03451a4ba24fd0",
+          "padding" : "3035300d060960864801650304020105000484ffffffff532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "54657374",
+          "sig" : "02d431509bae6e097fffb5e719b16a296b81fcfc9fc6a64b85b337c88049fed54971ef61e635388c2653554685e652059c769c5947af49858439d9c388a40703a016f73cf231726853f498f94a0a9a98e14e0cf8f0c8284b4d992f00cbb8dde41b07679c7bb7a2b4b7b307f2edda65fe3e002c7235eb85dd2ba41483b26131c997793ed64fe92a9fa9198eead1e8506385db0c3c4dfb93b87e2cfc09d9d3b00937cfc0a35bc211cc8efa4de83745c5eb0bb28ae52a22ae4ec8712be72bcf420476fdada50b618f0e9576e3e7ad8df5a0ebab78b1bfcdcef594cb7ff56a895b5ab5e0a30f82453880d394bad6ddb92231e44aa275f945ba6220d9f226da4d0aaf",
+          "padding" : "3085ffffffffff300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "54657374",
+          "sig" : "665e80a08c78f4c8a2768d1ba374bdd5e5101e61a594300a18a071d7c98c68cdb73acf32831ea077734e2486f1b13f76cd779a80fedbd76716fd022006a6faee19cb9789359e5b7013a59cd671a2a91c8328f4a1697e14a085c897eb45692d0bec074b400ded2820c6a5dbee2feac84cb6a37baece0ce763dfa7ca3b3fd4a82863a0eb35fcff709ca401c0bbb73f27f251b627cc442dd43eea634942bcd8bd72f1e8f192ae8dec1b7275c7739db254ced8b57332407f8a85285a190c94ea7f1c9318b7fcf67369ed23243c2454dd2ffa153ef12074a842878b38695336e8acfebf2d56d3560e43cdb039c27b207ae35f7a527b05baffc73fe76e57813b484f00",
+          "padding" : "30363085ffffffffff060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "54657374",
+          "sig" : "31e48e30de0cf259d0273991b633da6228289d540d84c527d5f12a13d2d6fd489b1ee282ff5261eeffb8e1c716572b207eb59c1dcf04bf9d4a9ca92feccf318254aba5fbe1df1dc6e3101f2ccd0cf329d23cfd9fa19c2acfc98c319be1c4d9831e86343513769e4dded967f512d5371ee845e47544c303d52ebeaae15e139eb2606989268b1ab641c44efd8b1ee3a5fea73907cafd4322c00d666d3d0e11ebebae763b0bc4948acb034eeec91ba2b90cb40218f8c8f4653338eef0a4d31e3dbd29a3d90b9a11c8fd8e613ccbec221799fc2d98625215ad28ed9b7c38eff27c44fc5cfd408a6ef1c7af90465cd4b5aa424c48604e2d72bc10d9ddfafc30129a42",
+          "padding" : "303630120685ffffffffff60864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "54657374",
+          "sig" : "681e2eb5134130900a52086c86aa16e20c7b95e7cfde30607e84e467fc67797d01674240cdb189aee160f8574f773095200c66c96507524f612e0d00adc1b4edf4c5f6c3e499a0bcb892e917c01c2c0ab9bafb6ad219ecf4030f6aac5253cfde1c1e71f1a7c1de03e65f9751d3ecdc09e4b499a96f9fb22da50a8ee8f4d62c9b67281848824d787c40fed31dc0036577e17c2d9a43cf7170c52ae92311725599d51957364da73424464d63c0edb55e79361f7798dd61d0c4068e4d0821ce80e27054459e9ec3fc0f202e9a30f4ad01747c6ee854b1f3615059d4bcce267a857287e7a9cc6058836af04d9f8d9b4adde905bb455901418e2aea9659c65aca0cf8",
+          "padding" : "3036301206096086480165030402010585ffffffffff0420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "length = 2**40 - 1",
+          "msg" : "54657374",
+          "sig" : "876fea7a5f814cb533109f000830bf5d8776d57b502a86f1df6e4dc50125a18e08f267edb7abe0afe44a5e75e8f4fd5e11fb2691fb73735617bdc5dc270e2b51adb064f5a560a4557c0b925e6af7852a110ac3f8c33150d3dd1d5253b7fc69d11949a8e80aa2e240cb3eed5a44afd0ed7a651ff6205bb80333cd060a2d2dbe5e37de3fe38c342c1635d553a7bab6be1b6ec1bbe9524944ec967200d35bfea076846b8460333d17cc90be7c6862695fab2cb5d02beebd6b1b86229e48d64f391ae3e506a7d252ecef54b61d4c186ab9fc8f2b32e006d07d9958292b6f4735a4c4d8e63713c212558f73de273647dc37bead249379831979c8062c0768148bcdda",
+          "padding" : "3036300d060960864801650304020105000485ffffffffff532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "54657374",
+          "sig" : "58bb9a11f29ec8bc8ec7bba4c056e09087fcc881d8fe8e5dc58fa74d979676a20e00468e16238d8e2a53e40b4952ae47cc857807558b12224b3ab06ae355fbbd35180e555d7d468c23c6466ae74c8003d2b1591fbd529cc479e7469f5645787b8d7baaedb089efacf7f4395cc1382a3068770530ae97729089100960f22a13d73883a3a5ce6867c77a9e833d60f8f3c79fc2f36e63cbde5a02cdb7e226f387588456b9161814abb84c638aafb44f293e19f1bd5093e36d68386e365a5ab076b64275880823bb77502924d26bf443e94e45921866c68edaf5e66b24df38155b6faa25e531eb1af900780413cf5d5d903146a9cfe9350a3a1509beb679d7b75cd6",
+          "padding" : "3088ffffffffffffffff300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "54657374",
+          "sig" : "ab35fb3939affc42b2ac00248105dbd3da37b59db5d489d1ab1962418e6bec3b6fb4dbc03fb47c2a64cd09fee70acd723a50402b47cc2a3411c716a1f380138511d693751e37a0bf23751488293a68382a909202b7d18dc3721521f9c8fa3554dac15b20ce5ff9638edeba6ae89afaa100cfc92f51326b82e8fea27ca216b8b953afe00d0a02c0df5ec76ac494c1ed3398144a2654570d8daebfb27dc698bb5fc3a69e7b3759c1f1c7d5e807f509185a17b642f8b24934b5efef55287dff737fe633f19e0d1af46a0b4675b300583f96a3670b1e50f1c27441b5e601b8c4cee015854d680ab544900e65f4e205e2666ac0087586012d8ae52711a9cda02ee520",
+          "padding" : "30393088ffffffffffffffff060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "54657374",
+          "sig" : "300282f3e571048e6a298d3b1d979961d17e5f460510227aecd83d7e8b3e21c76a1a304bf464dcbaaaa3e134bc5b25ecb745b78829fe5d7590c1c799bd613ccb8e1e55ed89abc0fc663599e77ea87515c2446091cffa063d6b2df5e3c623da69bcdfd9da5176356f76b05c98413d762cbe0f47ab6d470eaa8dac88dd55890a8c386d5ba195bba8751af133a24d204b7e7077e7a9268cb9dd7021d9348f12dcb46f145a19f0b408e2563d5487281db1c2807908ddd125db751b735adaed2f8e8cb55ea470a45383e2991b80ae0126f93555908a9154c1633c820e8942d4c37c807ac6a94507a3b9e1f95ae5a712cb7740180eb4e56c15d4e1829fbee2bb1e642a",
+          "padding" : "303930150688ffffffffffffffff60864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "54657374",
+          "sig" : "2021ef89c0db9b47dde3df73014ec88ad9d33575e64ff6cbd46201b45811b15f197594de8e35c26139be07132600cd48459e0439b93c2fe734337c914fa87c3913887275ab41aae8a70d60c1690ddacab4711ca0f1949fec70a7173c39116992c051c5802d1c1f005cda7f5b1dd61a8ebabb27563313f6d25347654c64437165590e29e78dc0bfd5491d02d6ed45a0f2ad58c46367670876050ab385f7af6e9f9bb06b279e360519d047296ca055429935b0a96d6b1d6ad1e77c130bd99db29531b0bb6a6abf3bbe1156217a94d137a76736cad06e5d53b9671204a49d54bf5371b8a3d7bbaaffe7871dc8c4ae8165c70bf14dc6ffce5ad74450a564f21f59af",
+          "padding" : "3039301506096086480165030402010588ffffffffffffffff0420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "length = 2**64 - 1",
+          "msg" : "54657374",
+          "sig" : "4b06f62bb29091d0ae2dc52c2443bac02e9bebc68f84bd0186e0e565483db3fdb2ee8c3bf17e2fc256f7df3810c5c597fd03dd65d9726f4699734a89fb5dd88176ded8f2caba4c1a869ba85ecee2ad4ed782006bb5d1f6e9a8ced64a9a74298a9c512b27cdd93b7f3fb4845bf2d95af41acc95a43fda8784424d3ff5ce18292abb0d43ad644c28ed076011947a317a5543fc48becb1836a8f57a1dbebd5dad249a00e01c102b98a799b05c2a08565c5778e629264727a9cb8fb4ecd71f8f3db26e3ebbe59812462d6c2e042a4f92456df56cb9caf959ce3181aaa1956109a0dfb8524ef802891e80dffcc2132ee1cf380641c7da5d1e3ef1a3b37c8b9a7d4c05",
+          "padding" : "3039300d060960864801650304020105000488ffffffffffffffff532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "incorrect length",
+          "msg" : "54657374",
+          "sig" : "3f9ed26d39ea6b13377ba941923d1c55544c4ef8c9187dc6430eb1e7c8b86292e528fbc74b7876016ff3cf8014da3d85f37e975810c0a7a8996c91533567e40b0c8464de887b18c9adf84571f7703147cee96c81e5eaa61cb3c40840d21cc0a280991173d5fb1cce01514003bec10e28420ba01819ff003d9ca8658f41a6e02c3295a53613adac27ddbe959d90faa58e33c3326c4b5b6a5a015955541531fc62ea216a4dc54878b65e6a12e0fd548046e103d8dd4516bcebf008ae4d5b971e9e2eecc8379356ebf76b69943b6f0d87ccdc19036007f7c79f363ace8e85bb97c40f7b59bbeacba0325decf642cc8cb8e51efb55a7296bb23bb12a3a1b334f5ca8",
+          "padding" : "30ff300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "incorrect length",
+          "msg" : "54657374",
+          "sig" : "748e7f86340f83dfe05a19e73449b7814398c6951a649029509c3072b6ce053e6176453d9046677e4996ea9a490fd602d8a735042b29d2a17f997817c6d9600bea2d5f7d7129a361bac6b7f76df520f4971790d250fbf89df5c22bb9e7a510bb6fcbd18251fcc5b77d61128f27adb3784c9c363eedd2c0acf9fbff65c9b4c67d631c98ec6ad6ce56389420a9f7e78973e3b55c90b3c3a6b37ffaa74ced4889cf306eb75e87d4b34519a349d1b7842f81eb588c3137e80895fbb98d67fda3621c7510815a5d5ae512e6566088dc333107a3a6f4309d6dda5417bfa795c72d4e70253775afeda3940d4bedb9a094502e1bd90084cae6f66c5f0369d3ca6a00d4f0",
+          "padding" : "303130ff060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "incorrect length",
+          "msg" : "54657374",
+          "sig" : "7705d76a011d696708921967a9e86166528d77c656946a5ab0e157a78073f4b2f2785a1feef6efd8d337a22a8ef59c6e710e984844498f0ae0c1f61b5d7057d09e3fed79922d492302e28c0c0401100049ccb68fab95feceff0acc24a913840290b27477b295f942ba232e6ec76d112632c9f02f9d40505323d81f4ff1bea14f42d6743a3c2867df273f80274fefbb20346c3f1cf0c2f87b55e8de277a8b2f4ab8006346dc8ceaaaf0d4af382337952e3c55cadab336da343723bda0ec0272ad6251995d58764679135c1a20098e9c3df54f161bb16bce5a600a075b36022f224ad5b4c7dda09bd94bc7eda7a853d96b5100e5af8fa2dc1a6964e4e1fdceb826",
+          "padding" : "3031300d06ff60864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "incorrect length",
+          "msg" : "54657374",
+          "sig" : "b298cddbcc889842ade9fc8a116492416b2fbb01b3f414e0dacb2a17d386dc26b1c046192f70ebcba7475445c7794e137afbf0c252077272b645a91b9cfd8312a83d75a696c777b762d832272c544ae96be8e28ae5a639e7581b1bb1c395e693c0cbfdb0f2706e2b93134aaeba76de19674c6a0317eed9b06119fd3025a3141e06211047468e9a59fb8932dee92db824b4f3a8a11ef4bd0b3a015d861ebae48f842203a79a66395da42a4b2f943b51c8824eadc11cbbfb34c4a82c553f83341cdffd8256871ee06f160852ec6b0e7a79c1f06aeaa474efe6309f7caeb4a26fb33364737496f233ee6fafa5e13dde525fa414078271cc439fe5ad0a52fa6401ee",
+          "padding" : "3031300d060960864801650304020105ff0420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "incorrect length",
+          "msg" : "54657374",
+          "sig" : "8b15577f817c9f63a94b9633fdd36af378d9f5f471636c7b518d467a37aacb5013a3640d4ad384286c68dec71ac5d6a4ba2578fe2c61d1db0922108bc777703c8f09f251cbec3a6d2a0e26d7e4f271efcc3458e96c710cb8b120eb7d5d8a5a535e823b42d6c3d59f8647bb244eaedea2b91e3b4e3e4fb9f2b0fd4d877d4fc10f135c54ed5f6228a48605016c7348ac4d7c00246be44d9e8660616bfafdaaccda021c33bbc564a5594ec98472b0f559dc45ea57b254a6397685643d1fbc1e074fcbcfcbc5de4f5833a7dcfddef6a1af5bafc6687ac8664d9920f9be8d8bf9e3b404db41b1d3ac1c87e9627a4b69a2b04c0ac751eaced3b7fa618bd7c0dceee17b",
+          "padding" : "3031300d0609608648016503040201050004ff532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "indefinite length without termination",
+          "msg" : "54657374",
+          "sig" : "672bf0ea5541b809287c9e2b6a584da21271f24d58eb68cf2dca42f604bf3d62fa9d5a52ea20e234002ceda5bd919ee8ff344c8f84e2cf4d8efc511560e03f930b6533cce2ebaf14203401317fa8b0fd17807389b3c5449ba24a8a1f16d143ad06c1dc62c5c40facabe64faf0a9816d51a831b648ae9c99b465535b342085ebb1aa44ad23c08bf4dd9e0838209d4805f48cb16d9bca302d161ec3f6e66ac734f001e232c3133558c4b89c00eba40bd53c37c5b03ff6fb3f323d0b79510592141946a7a7b16abfa78ab81d886d7c4d4090bdcb782efbf0c4a76b47abb18e1fc9259cee098929a1843a04ba52704bc9be25a2b96779a2b647d3ba7c11e2a8dfe48",
+          "padding" : "3080300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "indefinite length without termination",
+          "msg" : "54657374",
+          "sig" : "94818574cddac115d352d1740c4e5581ce36f1eac658a7cc9c0fa26a1d6f5f43279c9f2af313b3e0df805ac1e24976d58aee16e2a4616cbe421e46f5263ce46e301d8c295cb8a807a9c65610b176c61ae03229fc6601cfcffcf90d53edcfe869a1bc692dcdf88ce84f23b34733f9c8046d1cb7df77f1eb29cddcd4b420dcc8761169f3c7dab4f04e2eccbc046b0b26007406dec7505a38273e3bab522a81a054241afea6b6576cb1fdab2569cfa605c0cfcea0f4665f489273b92d2fcaae21be8f2d37dc40a38d847c56c3df5a2d5cab476753c91bb4e2dfbf2bd9ded2010e202976055c78de4fb2ec3f2a6a44d6816c7cbb829c83646156941418b4f060e196",
+          "padding" : "30313080060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "indefinite length without termination",
+          "msg" : "54657374",
+          "sig" : "5c54c39c0a079e7a842c8b7f5c6bc63f4b90873e1379132fc1a52fb78fe6eb46aece7f5ebeeaf2df8862622442f0a470d2a8ae252c5c5d71702033c6b5e6e983cf44ac0e818d9453b86b91b5d99a1af0fa5ed8aff718d49864c093e4cd5be4db1fd44b6ed38e58df96e70cab32fae1889e091be25eb9f15c07ad2c304e0ccb881cdbb1e45ba993b95e169358a169c70e7d0915ba34955bf20fe1df2c7aae78fb78c893d184c85a56524643dfdfc41e62539da005751409a18fb4e59d2877c6cc45a4b832fbfa8ad2880775d9fe92b6516f8458bb52cd5820710bc16ca32cd7bb3998af0299778a2dab50d62d73415294a857d92bc5bad97248e70cdacd50dd5d",
+          "padding" : "3031300d068060864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "indefinite length without termination",
+          "msg" : "54657374",
+          "sig" : "9b91890eb53272fe7542c2067a4e9295b8c7b8ddf1c9ece6a75fcde79c9af2cbcbcef38d342032b85ccff9d6c82d3cfd68a7b27a38eaa45c78a17741c230391b3df0bd79dcc3447c8717b7207fa1fd04e917b5282e3a7dad48e8f2f6d1360f6c720f9eaf1d1d59f061d71daac1548538c0a06fa65b2ac87abc9e6fed3a6e15f48422bd9c4c681fa98a27c873d7efc5c100e708d58141b60e5a691747df4036162456bb11f92f2a391170233ca1c03e1786a32fe9ab8a94246dc643a884ad59edc40e2eb873713e84816e4a7f7857126da3f063cb9a3dda0547207c426f7cc985b5a3b6374cfff51d0d542ce9f82ffc07ad24c106363ffaed12c97526394a84ff",
+          "padding" : "3031300d060960864801650304020105800420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "indefinite length without termination",
+          "msg" : "54657374",
+          "sig" : "0f07dc8786a46a7ae2fe2bd534715044f46ad17b836b00370996258aa90bddf563b5f3e7eb1500ed0604f9380491a5a6c6c004b560b0f280a2de30d191928bf5aa0378fd6beda830beb1db8b6b1c8846079b6013cf586e384be0e1163c62b526fbf8e26992afba6ef5e5f15755ec7b5287a149b19e577e79bff6526d72616e28d921661752e8cd0e4b950d7ee9f2414e45b3069a80a2e089e46d0b3da5cc0352c07305f8dfef2e1e928e85bb76c5a0f1516383143184f66f31c69adc0b8219f11809501927744fa37d1c8cc1e2a6712d54ed66dd177714b7cbd005e6a6f83db92041b595dd934b0b19fce5db369e504fb45c9df1e645e81bef62cd4da3497e9d",
+          "padding" : "3031300d060960864801650304020105000480532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 68,
+          "comment" : "removing sequence",
+          "msg" : "54657374",
+          "sig" : "70f9515388762b320cf84e90eb571b27eee58a43ebd4773573bffbce8b162bf17e6c0317636b211b2bc56aafa99b968ec950466ae5cd7b10d94c993dabace14b94bed501dacc0b40feb8a89586eb1a792e92115ba5430ce1183ffc6f538ca657fed3ea684a1b9d998c0d9ff004e150a0a32d20455176e8db3d96b5063a60106a7bf6c9d0baa8879ddb77d9a3037400348ed1ee4b88f8256e8e632b15b0dc2611da3a9faab929a0bd4881418d7fd8fc7760c523e1ca4cd3f25c8243b8bcdcd51e96a3840de589744bb8d655851b9cdbd8b7f2d47a57144d9c2a7ea07d49c0d141cf918a4eb1507f8a7b11cbaa28c1a35745209a5fad2bd1e66f7929fe0223d505",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "removing sequence",
+          "msg" : "54657374",
+          "sig" : "8804d661bb17ffa73e371d134984ee95e426d7c12af978d9ad00ce746db4a3bad36546709f029d2c9ed13e6d27123cb7a1954f1f65f3fa46eeb56f449ba6b5e0736e5dd2586d642711d98aa19595d9da1c4ec20953009e2711738263170b487072566558de1301e0d0253f8fc14d12c8cfb4644b50aeb3d3a9fe1a26fd3bccd72986cbaff34fc4fa38ce52e65821f169d54b78037b8ddcba141ffc72797023c802564989a20b07b9a2ba6a256647e937b1c16df2081cb61bc6e6a2ec6ca9939db91ec2ae62c4b2d0d7f61a0bf0c693165175c91b100c195f3611c3ecb797c531439655ace9aae18e53a69e66698fb593f48084117ba288a134fd0389ee0f7544",
+          "padding" : "30220420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "lonely sequence tag",
+          "msg" : "54657374",
+          "sig" : "47004cf187bd2a34c6ed89f6f8eb9f67a401a40d66a95c8cddd98fa0faa829bbfc9e62a854788e4d23015a68f098a77cc5daac7e23c6ba56167518753187a8ead68edc686c393940f77255fc8092c4c65a01aa6901c0af96830c05747791e511c8c01da4358feb38bf5507543184fe887c5821c4af048c5082bed56c7934985d86de2402b37e16a6f3e23d5a1e838992bef2a46d4fa87971f0cb01a470e185654a6b174d9bba81117e8df24b19a7be0d1f8e3906d3029b5ad4f0d8c152375dfc4fa490f9fa3a5b52fb929a7d41a84d61bbf60d80162b16334b4958ec879bbc0098962d5d3220169c8ccb338d31c664c23144cc85bc371b2d9da61a69f0b4b658",
+          "padding" : "30",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 71,
+          "comment" : "lonely sequence tag",
+          "msg" : "54657374",
+          "sig" : "24bc364503e9aa28177f9fe7ebda884cbe9494a6b589b0db875541174cb1ceb60f514b74838a0df3bfa8e59b06e4ff83e4a4e336b41761da705b5ff9c0fb36e522cd50ead114067f58b100d6868581b69ead695a5c4b15198c5ae35d67e5181335590ec176af6eea69dce2a69e87d9f4a03f351bdad1c0c80dd1d27b75cc7bfb6acc7c25bdd87d0233ae4ab186f1b11ede86139954d9e886b910c3030d372f8900645b8e17b08e61cd64e520b882203b57723f00e96a6698fd65e7d99664351cb797ed2ed67901475169d47cd64fedfcfb6b67df5fa5d7c5ba53d65dd86d26d899df5aa6811c53a3a28fecb72df39e0eef50053d674d521acedbf6cd17ac2108",
+          "padding" : "3023300420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "appending 0's to sequence",
+          "msg" : "54657374",
+          "sig" : "b6a1d94b0ebd824f6b5a95f6697af65995eb388f3ae12c87399accdc639cf5b7e71bcf436feaaf8bac9f3234d0f429ab1b0c081f71340ecd727d9b94c66fad1fa070c4b80350eeb55878ba427e4acc5762597039fe1ef92ce29aa9919607045ed76326744b0e361cefa24a24725af612b40febc4f8293d4ca9faae0d19f1f2dbb5c4f0d27f92eba41457b39f9cb2c75695834992c326d5e39f56adfbdafad08589a5d4aed79f0abd8af3e056558afca803e6d75da2379a0cc52168f88e88a2c14abff048ee8174c0e2f31854d6687b7097d0f3352fea3a02dcfcccbece2819d4b5e1c97f93857151aaef70cde099a7226fa39f89a8c92e08de354fa80744dbae",
+          "padding" : "3033300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 73,
+          "comment" : "appending 0's to sequence",
+          "msg" : "54657374",
+          "sig" : "32fdb9a7898c2281cf10104e74adf455a4553ba47e96bcaca5671c9ed13180140cc8556d7a429319079622e352f5f364193ce54528a3d3906628fa8945b9050f1365e99a58dfbe50572dea466cd9dc96d2c773cf35c5f1e51a6d2da23a5631bf4aeff50019e1542cac38e71ad2a1580c24865c8f65217e330415df95f83f1a29a41e4a20f63ee1f06a3ab10ed2f10994291f8d7c80032adca004094dad4b2d33203c09b134dfd5ce9ae577f8b7edc7637046d5c59036362ffc283a7c297641d6d7a36a95843661266289365e021a393d80459e5c63cb71e504661c814d8cdaef3d5cdc0ea2f95be650a0e14af9fd560acee1728fc46f5253557e8eda487e4659",
+          "padding" : "3033300f0609608648016503040201050000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "54657374",
+          "sig" : "6dde567bbdcef450502b9c76daa040d2ab0cbbbc79533c5576287ceaf79aeaf587c58ce90974d555f4d7bd099abb90d61a25a6c064b58826fad6eafde247457564f8183ce79f7881bb2ceecc830c8891c35704ec66694574838c14287024eec643d7dcca4c4990b616c8fa98b0f97f914230e786a102a4e2ecb926ec89f40c69b39b54ed8890fc08edbe50f338c909b7b6c816a44010addbe65b527734e0502c59aaf8bb7e108999c540a023b60a9227ec052348b01bb1bd5ce7b7580b18f40b5f39b556bcb560ced438c84b2e8e67eeadf4837340d7c913afb7e0ed7fdbb2c58e3d9a71ccc59ebd8a63a80a8049bd9df49b164219fd87f345e1da34a929546c",
+          "padding" : "30330000300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "prepending 0's to sequence",
+          "msg" : "54657374",
+          "sig" : "97c4a36c30fc317a6c1f712fccbd699f3de5a7420efdabf17edfefd790b90e20afc914d7e0aa34dbabf736db460eb697abc285f029d784b2b394d689e1a383af8a51f153b4bb77e199441ce622e6d146a842244f35d5eb3d410dc78c2c85dc73c570f848063de0445871e7210207b02144f461b7105b3a74ea3caf25412eb92d1058f18e9afac51006e859da988c733293d1e64164b733936d563c4edd8e81f57b4c463934ede932cc93237bd26fa0f86c5745d804722f8b837b19e50d415889d58fbc78bfd4eb35ea5dece233638689c11d212c47a1e1bc0b733eff107ec9dcc90a7a7395e06785e75973e0d4a20dc0c562405886c9603daaa20f6763fb9f7f",
+          "padding" : "3033300f0000060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 76,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "54657374",
+          "sig" : "2fbc69383978c97e1075a9d8f9ad1e01dfc6fdef216b381ae5349f005617c739e086f45ffd2cdb45318321bbe77e5a2d67fb1c6b209c81eaa2388c38b036f66575590447219b7771a92bd6c594d8190339dafaffdf2a5a8b73e0382eddb2b2f95a42fe0235042965bd530584fa9db7fafc8c14a417c84b1421c63419610ebd67d20966e1ce9406c4e938784e967ca37b9499d9df4dded8b74c55b08c6244ea8285b17d55a6c51367562563524e6a45ff7956e656a1bd46229db68398f8a0011ded00f30f6bb46c5599ea3fbffb30746b56d83b17d461b20dde2bab7303f92ad9a322e41ea9962065b9ed683f56e31a58be7177505dc35a10e6703c4628933a01",
+          "padding" : "3031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 77,
+          "comment" : "appending unused 0's to sequence",
+          "msg" : "54657374",
+          "sig" : "94087e73e94662f9f925abc756bdac96a520ee6d5c8baba1c8947ff9d7a22fe43aac67e91986890b83eac61de630aca7813578e65a2268d78dd25982b89aa7a9d693bd868acf156c9cbb70779bde1cf7fd304b040c428d7aa48f972f0ff0c24f4d2aa88b622e801a1e2011804f331e80d17b3d15f8410b8cb301c7ef4da7eef69089fbbb4aa05433d16e673171d881357f304cb4ba929a7ccb6690bbd6911f6f5fb7d570345719fc55a5129dc8e870a7083457cbaeb86c3cf51f0c5f605645fe40410055942bbe957d9911d84a1d423978b37ffc91eadba802443cae32f48f7d987eca24719f0e77d568f56726e24e3d85b1a1d13a0bcf0c72f0424650ce50c7",
+          "padding" : "3033300d0609608648016503040201050000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "appending null value to sequence",
+          "msg" : "54657374",
+          "sig" : "46ebaddd8f38c7acc4f2874a34dbabf6596e42b8f62313d12f9e01d16cca9968d0b73a5407ac15cb3ffb232b925acad2d5b29b7ac1907e294cba0107d9b0fe46f728695f3be72df258e504771ae356ca180cae5bfce3e67b2de72f8d7d13c63772810162132a2d512c041fdfd49b2bed59942ad0aa9c11d192292f945a36f6ff267c5ddba7dbef67645efaa8e8455957dcf6723e4d1df6e5e3fd60a43bff3d1549d0c89906b4ece2a1cda030c7ad644748610182f92ae01b65e2ea9b006af277ae685c4690827091346e1f2169a7dd93a520fe4123612e8960fbfe3367583b50be4f3acaa5f07ad9705a48640e828f797d37e58fccfbc9c39b9989e7b5a5f827",
+          "padding" : "3033300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 79,
+          "comment" : "appending null value to sequence",
+          "msg" : "54657374",
+          "sig" : "a4782205277bafd94e1b611942552b9d6171a15b171f75c3d13459c6d813302941d1ff03536b76508f333ea3736dff38a0ef61dea1e83cd81433c683ad4568365617f603a13e1fcc2813b08915eb681140bf52d4f10ca4e9d95811494ff3f2ce5c27d3a6f43f21375a8bf5b70291b57b24b18a99b38132cc002cfe5396e7d3ce5bcde6fd82ccea835e1ced230effa174a1b8b02544222d9e3ef6ea13433c2f2847bce7c4c55320c849fe9a21f558d3c2205a550b4d04b3bc49f79e4f471c44d4d8a34eb674cbf5762089494ca4d7d8528d61098ddd543bdeb9556247e3821d91954bf493edd6888c1dd23a9d06c44d0faea21f146d0f1a310a8700d66b4093e5",
+          "padding" : "3033300f0609608648016503040201050005000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 80,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "67fcd94d1573d0712a7da64cb211d9049b3dd043b2b17cd97662f837226379c1c94022bbd5d82d1c67597f510f15959033b63bad63fde6c6f972b60337f52aa45e34f826da9a9040ecc6c268179dd1d10794edbf5690bf834a6a26d07023ad99794e71b675a8c6b202234ae9fcdf43b04dc9c933aed66222154ba7c2fb324b6a6bf9c4eb0535807eff2016b44002a3557564559141a34719b142245fcfb3737166ed7f83227d257f5accc579d20f4fd0debbd2ebf7fe4c8680847aaf17514dea444caf74dd0fc67dd07b9067ec16093d7b21db72a82a35af2b71b0c214136af03ac411b14bdb5a9ab2b3b603becb1fd808dc36a9065c744faae07f18b8d71195",
+          "padding" : "30364981773031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 81,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "6895daf9824474538545d9e1c7288bbc938bfa56cd6ebcd639a897f45624ea7f409c2fedb2ad09cc98143c461262f22f9646e26aad9325af0063024e29bf63b2807c41d615ea8902de10357c747b37e8264d55f48bfe8cefdfe19ac93d251634453c4a0c00dd9a0795c3195d047256abcfec964cdeb3ebd663ad29c457c307e0d05bad643a160e343b516da6a015193cbd2b28b7eeebac2f1a2156c2e62d85f4883ddef31011628d680d4d608e5074574459d6dce4bb623d059ffd39e6956f7243382165fda42cf1064a1bbad91ef5d0a0906785cb8c78ee641a3a4c9afc2030ee4188b32ef2dba42dd6ef5c86e43a9e413303c5ae978b41e74f646ae5185c35",
+          "padding" : "303525003031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "a6a996451e9217ea6c0ea0aa0cb6442620847d85a8c2e9e8464d929e91b5e8fae333cdb81678fb7f90285f8a4e77f6e249ba2c342cf5603df2224df31bd9fd74a244f51b639c5f0ddb85c51eae877426ea611cd8e01082e783604c38c7dfa882d3c5b4c4ae59237a9bdba51f1627dae88e9773ccb94abc6113217163ae11e6590abb26038f651335cc6dacd5db4436b1550a37dda9258919cec2c72b78c9bd4205fb3776e7e785f85518b4d2e0529903b39a49486aed55b6622465d4ca581a71c86c40ec96e2300fcd438ebd5dacaf8c585411d8978ddb8d040f4cedf48969791ed638eb5666cf9a77b0b27e1a572447e3b0005337af99d2e5dbeb96bbe06971",
+          "padding" : "30333031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "4e1280bb478bb46f4e9f49a455bfa382b4231eba33ab8d7861d852d2a0aab225f08635b73c3602021c0d5aba603b09b13c4b1ecc53f702d21e225da737e87b5820d628277254ae6d244c02068f2bb0dc532e7ed04e72296340d2241f0cf508f7a96f3683614478dad9923610f9cd285d2bbfa98ba86e2aefe49a52dad162a36fa2a763ca4a09c1afd3ab86de4986ad0e29150f070dc9f5330c62d1da6c2b494f2d8d97caefdb508fd468d121a7ed36ca9c1d7612d386e2974fc12f3f701577cee82b13098410cf65fd9619151f2f69e0cbdac7d3838d94345b5d3059fdda42e527dcc2200193789b347f90a273b06106abd0f6fa79de26086751d0289ce4766d",
+          "padding" : "30363012498177300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "09691e7bb6a322e91962d6868e380fe98ced520bf556cd085fb8e8d41efe7ba220a67a13bd72c7fefed3e1d4500e055398b29dec57d0a4eaee6e1016ff7c65b837fee29962fda0d65186bd317dad959dbef96ed34e2c89ac2b5841995b2d78d14945ecf01e632c19325dc77fb879988c7ec2f6924abc8eb0a6933bf091617add696c186aff6bb811042862cabba547ee91b8000e92fcaba7edfdbd1bd03b3d6bf5c2b5d7fc77f2c0adbc398de8995e8bd1c4040a73e5490372bf75a33f111666ce9d69b0f61c9a01cc541b4c0e6a902988ae3f876c0a0029d2f0741523a49c12034d572c6dae9b5d170208f0ffee12be344288a3c53519388dbc20d86066f5f4",
+          "padding" : "303530112500300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "128bf8c66a90e5267f7aa9c89b8713ce22c118845c5cb9b579d29287ce720c747608b68fbfca40747178e1dda3cdc3921fed5ccbfae5d976d286e9382fbcef3026eb988d537bfc9a67470094f8ae30e4da19fca114e6626811c3b355d104ab1f921c3ed8abff6148e817f5c9f21d270b2ac8983c6acdbf789ad54f32aaf9773f0b2570e810058b0f9f12b523cc763975884d13902580cd4f9981ccfbc84fb18f6a9670876c3a120b6907211b003b035a1846cedcd7a414dee37cd77b16c89ad22035c3754b098049ba72b78259c333bf88609184571955c74974083dfcf5d70d940bfd64a6c575fc52b3b8ed5571519961f2356b7bff6a127128103ba24c5142",
+          "padding" : "3039300f300d060960864801650304020105000004deadbeef0420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "1901af3da39f5eaa20edd6002255b5977d3285f99a2bad2c4d7a57899e8b19d89da3bc5e418b39b744138a0a60dacd84542922f208b0e7fb0e1ab7b47891aa9b95921a46d2de54687cb2a79b3a7f3a640c2b21a139ad7f8a456faa22c16f27308ef95ffc92fa9b70e5feb0e317de4bb5b0a1558af98d177c097dffd7ab42eb8520935fa87512fd6f0172645631cee29187227fe01bd49dd0f6a28d2033276d696e0631ec2da88f7f1128a7a9acffda408ab10c26cfd6a3bfdbe4e9afc93001deea66d443137936d65bf31ca0a940e25c72b2f8c3cb7f3bce957539136cc7af0e6e5a4f9d8dc0b5fc656952d225ac9612072d037c07f9909261c02934caf542b8",
+          "padding" : "30363012260e498177060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "1ba99c4dffe02d72a6a5abc06d7aeeb7478aa057d8752ba59f72165e12e740160931f6419b1cd5a0cce4871ea974453f821cc43a0bbd7f541f4320fded5ed89c1abcf32806c13aabbad83c09173a2f8dd1fc15fdea66e9ecae0f92c376ea6ff1c2ffaaba304f74425e3f2df4a6436b5b1bb15035cc44466c240a2a2fb41d275ea8751136686d69adc53373a0eda516148aded67f8fb22d0985f92b6fcf236e7782687ac95cf5ff0104ee3de37523cf6faa1c5b428489e11a115f502fcf56567ba18e3e39830c6653bd29abf86b3b842bd1f24928277f1b3fca68a525243fe1bfe085307802803378d9854cc0f90318c79b79a4e939de2730a08269077fafe57f",
+          "padding" : "30353011260d2500060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 88,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "89476619f367778d5252add21e8a22395c44e2bbcd5a743fcea07655c3ad3a7f4c8c2d4e871a1c0c3787763128fe21d2d270c07c8ef0aa607dc2e9697d9ffb8263b3e0c82851e0a5a884b23fc4842d60ae0eef01670f988bbce5055cd8d7e613ec8294b9ed61459486907e37ed816e7c795bab8dceca60e476d01cad4dbb1c00336003319273f85b57808b6f1c8d8d8d1f119faa4eedccf3c98cbeafff20e54e3b101c094dbed77d33c54f63932ae49f8c584d66ab61373eecb541fcb89e788a5e43f99c67f4921d63bc54a2cfef49cf4ade494d32449db5c8e0960bff24e8ffdcdd5e4a71bafd1e3753786bcf8a8388fc9b9c53f95622763394f1ef88cfee85",
+          "padding" : "30393015260b06096086480165030402010004deadbeef05000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 89,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "8227c6081b51017a528a59ab9a2d5275ad7769fb418a2514965a9e2acb1acf807685e57fcc438187a01bb5d592bfdfcf68ea2ae3182ce349c5bc5445131e8693bcc63d6abb96881e112b0e0a9b3d85c0ba5a463e6d6035ba18cc395176ade7fdcea30abd725d6ed4ce5c3905e0d12d0cbc7622e44ee8c3d343a3e6ef046c4310ed7d12e7639436176e2a1b7faf54e1bd97d77fcbac40368013c8a2491f2c9e084ad110dff1a2621d704c8f5e8ab1654220e959fb665e6e6770da6c23a66035571d844a1dd2eae68001169bb95253d7e18dcf5c376b5a31e9ccdf7918715d281fbc027d0b2510184f2a4c454805b73aae89370cfd80b345c8ed878ad1c314a7a4",
+          "padding" : "303630120609608648016503040201250549817705000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 90,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "4360d9bfd89ed3c5c40290142efb667b2afff6fcf53256660409959a06c24d858b3999b2b1fbb8d9c7da7958a5a4ad9c2d9ea617c5f7edecb7ad302b0004957a979d6eba0d56fc378946fb5145429dddb6d12dc2245d4a071fe162947b67546fddd5efb1f277c9e0ffe4281572c3f6ccc9ca5d19c8c1284a5b2816b529a54c02e9acad68fcc71a5d274cad33cee0c2826d0491eadb1e4d0f05776aa02f00fc702b50927d333c2cd9ba753b3e70c26461a0c6d374a20fa6a006ef77a630ffaef2bba01f4bab3314f7f110c4b9c56aac18ce9fac6ffcef3fc140afcc0adda45473e241d592fbae6014f701fc58bbf655b519d2315630c4827e6e16d9f24e9f9407",
+          "padding" : "3035301106096086480165030402012504250005000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 91,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "b0939c12151b60d2302513c5901647b0800a5fdd45ee42009828610a83b017a32ce042db7257f17f5504b3347c7b482499d3547282cab6d35360b88b88bf57f0b6f7051452f309a324be5792ff00c0057fe3936a9d584ddbf64b8590ee3dbd04961aeb0fc11598a4bdbb92453b3c646e55bfba321d1d21b5ff883a8e7b22afbd66de6a273cd3e4bc5d857af6c55198358f22a54fff26a903e9fbc3af78ee158dbf9a546dee4b5c77c33980619eabf13dfc72007acd263ea2cfa3f4a89f97b48ca684a1be77925e051184387fb0b8d7ac4063aa84d63b8846932d220f5052eb91debde89aeb6533903fcd01a53e12048990b506773239c83e891667dfcfda3076",
+          "padding" : "303930150609608648016503040201250205000004deadbeef0420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 92,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "8a439878c5c694fb16b51bf584c67cea27287e51e5b259efcd62e8ef1c7441555e788e66bbaf0f508440370cf04e87b9474cf0aefd15a7150fadb809ab4bd981036d906cd3bd6eafada91632123de1c38aa486c9d6117e6a1b57099a8fbd78848c7ea47be3125c866151a8d46a3bc0d8020b34915ba17f3d835e641bd797b1e55ff44fffef98a4820063434229315035165196377dff2c5f50b7475c835729bdce9b63d120bfe27d5606fb051c7c946a0512092e08ca7e800abc734e0d8234262ab56037ffb2e8ab3099d1fc11a202bdaf4c7e322995ccdd5efc18c234e1b6139d84d0193dd27751e0db9d077aec1bc23f978d2127fde875e1ed7c992a82d051",
+          "padding" : "3036300d0609608648016503040201050024254981770420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 93,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "b95dd2dafad0610015fcfe7d8b5c83c34a76dcefe627c513011d953cb2238ef20273feb8b8672475fbda75112c85340e7ab08fac809b6e2b4d314110866e61abe8d15d02f64952036525b0069f2cbf61042a39810d37b7860fb6eb1c423aac7311fe7bc98d6880954055a9ba7d7a1bfb4e45255f4cb68babe6bfcee6da47ba18d95b4954c3374176782f841b85fa6e773f58c5d56fa85f85a4d8c7b8c6412ae83e26b3fae582c3090a9fc6d2394d1a02e3864111cee49ada14e5e625da3650608bde5a5bbc0b99a46095fbd7c01d87dd6c83819c13825bff3a62cf893af31d03f44875388a4f8e83b7a7f360227182b26dce8b310b389e2c672016a166f71557",
+          "padding" : "3035300d06096086480165030402010500242425000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 94,
+          "comment" : "including garbage",
+          "msg" : "54657374",
+          "sig" : "b4fbe49100d4f15bea29586e58d27cdea5270a035432d89b245e7a323cfc19f77afb4f2652caa2afb3acf712746710e837ee932e9d315ae21732c164835fcd77f8498109ef05704b081df7f0a5566f8c176e5031b184ea6aa7c590b0eddc6037d642f463f41f61c00f4b12d0b4bb7924b9caef831961857854ba53521f2b9da0210cb38132b46892ec7d44bca599c5efa9029eca8f1663ec301fd064df65f9fc35f14ffae2a3794a3e1519ab077cc761368014acd84989e690449b95c5c8c59e4fbfe260c64ff044be245c33b4fdf2f44c87ecc6510b524927a296a1f32cf57024f07a8609ebd164139ebc129b5eabcb0a84f24048673b7c9ecf89e24099121f",
+          "padding" : "3039300d0609608648016503040201050024220420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250004deadbeef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 95,
+          "comment" : "including undefined tags",
+          "msg" : "54657374",
+          "sig" : "963142f737aa6b8eac11c6e52dc02b3ea881f4a1a29dc672b8392f4eabf487d9296c0cfb3acbc6d56c1b4eb4378b6f118e6e754d2a16ebf20e9b66f7961d7af4e1a8deb9e4d089d540496c0ea89cb2cfff8220bc7c5bc7ffb8a002d549900d773d00a7cfbfb9499523f353a1dfbfdc9e28054bdb69c64d2bce0e172b586f6ba615e1af9c822280324b1b9db915a50fd0658083eff495f1721eab30d3be3ee276d33c3177aec8fd5dbfd9689195e7a944108ec8e734d524a27e9bc67fd8ade717c234627e2fa25279bb216fecf1f79e1d724e65b10614f334c161f2a2cc50db7113f9dc1c73bca1c67c41f6f77f80c3950d4d4e1252b64300264473cc904b0e61",
+          "padding" : "3039aa00bb00cd003031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 96,
+          "comment" : "including undefined tags",
+          "msg" : "54657374",
+          "sig" : "3d1ba856ee722aafa5bb68d8b2901c95dd1ddf22559f05b70aa3e92afdac040e08819db5417cb8f551cfea76e622a2aabde7863c183d41c23f4690da5983c29db4e0d603d349086aced24d33695a788c617348ada9f68baee069c0dcc43d671382158c70f0f91134aa4d2bca45e1e5a106710025240d496d79c3e6bd70e15f5a4d732b37d53f400aeaa0dd49cfb24fb7af9811cfceb185c697d70c61ff454672128a0fefc6dd776befb87ff0c7f248373a17f8d2a08f138aaaa986182c084178103897fa8ad0e921ffaedd7e650637cc0c09a185eec68413e75a6f80c9fa2cba46f328b00d2f3e414f670be8056a77810240eebba03e923c01c096fadef1cfaa",
+          "padding" : "3037aa02aabb3031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 97,
+          "comment" : "including undefined tags",
+          "msg" : "54657374",
+          "sig" : "582b5c38000b069573bec33ebe6d4cdd9e250affdc8b4c17937afa464d107f41bf3ea182b86ec8143c9ce977ba2caa3d5656323d4744556f7bc85ed4054d2ca170d35e8958bbd299aed1bd983a7ceeadb2454bf3f5c19d1e3d98785d644585a1ad3a914cd40401d587f18da2c05bf2a9394902254914ddd4d2ec216bf791d87a8e8cfe6518d9e7520d080376cc35cf5b8cc92995f1e825bd5260f19b0185fa9340f1b15d6c7e0d0533268f8e269295de143449ffe15cf03a0036b17899bd18cc48ac7f18bf270f0949b659dbcea7651634da97e27a2ee1da78b10ca674e5c38475a7ecd654e051161c95fea16c5bd8aca95773bbf18f7f2abff4912bfa46e388",
+          "padding" : "30393015aa00bb00cd00300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 98,
+          "comment" : "including undefined tags",
+          "msg" : "54657374",
+          "sig" : "3ae33c56969f5a2b11e0a29698e60962db13458531739d56a4d30379aca857b0d33d48a111865a010a6a6942a64bfb2df5dc3f859f2134b7ca6a9b48093187f3554047a95d22c5d013ee4f5a65ece677229b6bb830d5e33d8bcd749c63d5ff41c1d48e6de89c4ef43048d8be79ab7b547ce1e5731a4a5fa0f71df485e514978dc34cc297a34215e519b944b59d3762b71a5c885fda79481a886b5b587bff0e604d2cc1a02f506f1e9353d3811b154506586af833bb42192ddaf4c78a1f01f65999ea602f79de8f55e987c5bd63f01f27de24361df86173f3d4a2020b440f32fbded2dc62bafb7f77c5b1bddf4b774a820d45d98076bc456aadab3e6b55a50568",
+          "padding" : "30373013aa02aabb300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 99,
+          "comment" : "including undefined tags",
+          "msg" : "54657374",
+          "sig" : "86cc2f6da999d54a27f1d573b192e01350cee91adec8f9a02b67b1528dfab632160fa962bcba95594dc342840cb4fdccc3698cd4e186c005c68d342432e5e7ea8019469becdb33a76f806504c26e619a17d8de1b79474f669e91e0bd07b31444e53cbb525b0f47ec438391a3587912805c485dd2909e14d8289310312a7616cbd3465c2922a00c5afe88a89d3807c614bac7c5b9697e8902bec0a2fd9e466eeb932b668f6e643a8109292ef8bdfbca19459715dc569f3f12b90faf1f31d7f8506cad98bc4742b47ff0f8f1de840e10e62afb66e93df34d43a2dfeb3346fb3e0e19402235e00c4805bf6f5dc6bb10a1406d8eaaaccdfd118cce8d1a62eaa4a97e",
+          "padding" : "303930152611aa00bb00cd00060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 100,
+          "comment" : "including undefined tags",
+          "msg" : "54657374",
+          "sig" : "18d77b56276d2a2960630b730edde16b0a26b6c65b28fa20ad7982b8b48d1de6038a940f8c543d7fb71181ea2feb85592f608b20bb93ac7c06ce725026f39c645c7f964a14d68ea53de398cb64cd0a26262ed6fd5091332f8b437b71e98ec59122abeb7a27259130b203a81da5577fb0590e2d6842e22e943256c0093d143f58c023e719df92454a979bd76d08c550de11dbf7085afce1581c31a2214752548af5913485c00b7466a1cdfc60e7d857a913694fbc2fca13d77fc5b775f7adaa79668a5afe0b743f13bed6078006e6b7b16ee6ec576554aa2e864f77b43e4e61786780085edf3c6e8deebfcdc057a1de8d8d7d8a6b188a8c771e347365d25240f6",
+          "padding" : "30373013260faa02aabb060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 101,
+          "comment" : "including undefined tags",
+          "msg" : "54657374",
+          "sig" : "a2066d53103e4d5ed9c08d7dbc8be145d932bac9d6363a146784fbe172ad2e02216cabce279b3599b5f3858e7179561e3c489b87f47f33d266cb019b747ec49d3dc1069cb078419f6dbe7dbf640500cd110a93e54f2bad919e60cda6401f7d88e52b9017b7675f082ac349e4fa4e49b0a0c6006d2821382fdd00fa0b9d4e948db23c1a4d3d658ea857ad829aa7a3474e0f8f86520970edbdb3035ed195f039c807f8613cf333a13a14c22f1a5e4b77ebb0db9c98c35f33b19c914801f4aa4459af043a39ec5e016af1602bb795bf2c3655c9f9e30ee2f49c6e059d0d616eb7bf7c9650581ab0f29d1e2d1fb06b4d78dbd06f0d3155494a6f3d7730f55a03c1a6",
+          "padding" : "3039301506096086480165030402012508aa00bb00cd0005000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 102,
+          "comment" : "including undefined tags",
+          "msg" : "54657374",
+          "sig" : "b1f2b2ceac435cb3c650e8214ed70a87ea039da7c6730ea29958c375c85d88459065a8987dcf66b93e732ae5b92af964e7341eceac3c252b93c62b2474b54a9477053491179986eea94820ed6ea58edc7e758177c1d150aca2531651963272231f98daaf1b90e7b61a02c7e61b25f9b7c33d7f57d846284699a924d11c45995c9b85bc3192f349af5e669d893eda953272516c1a86764f46ccc17569880ccee30bcd607a21c306f84abf4b6a5fe6839ba00b73b2df062b1d9d7285c4f3b7412b8ab5f68130000c95761a587818811e4632d209f34c4a8c9e13e78358a37b696cb444ff022bb1508c299a6eddce1f8961bee97c5eaf29267d6ff4f6ef9e30061d",
+          "padding" : "3037301306096086480165030402012506aa02aabb05000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 103,
+          "comment" : "including undefined tags",
+          "msg" : "54657374",
+          "sig" : "012e5e56d0e1bc77798b42190ac5a15665cd5f2fc1257c66553d8d00acbe85cd2b42e56f344099da06024c5578851c3463d86d00f7c43c4c959569e2a0657840305b655f4607bde3e44ee1ade5a40162544c9e81a94612d600c069f3073c3e9710cb4006aa5e4a8b9083c4cc4f18fb2fbc3343075c8eb8f7d8b7595532d52301944cc79054512141bdce292d339f85008161af499002dee163d01eb8211e6115e637b7d3ad074507e8492f1a524e39e1a5151802b44b74e1c78dce275825a67d3945e80e73c605ea44328d10a16a99f4960e8f83ca5c01c277beb245f4d0758bbafe969dcb497915d787d760673c86755c1ac38e06e530d24e54b4dc90b67e25",
+          "padding" : "3039300d060960864801650304020105002428aa00bb00cd000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 104,
+          "comment" : "including undefined tags",
+          "msg" : "54657374",
+          "sig" : "51f6196459dff03d29f6fd4c7477faaa392cdb0b2541056b94484fb8a266c1490e97d90050843010629f7eb61c3671daf8fb5344eca91dada6c2408d3ae9d6a66fd74c725ded0a4470027d13a09402f0d965a6177ebbf0c24ce66cc463892ad282ae07c0231b394725ba8f14705f4cb860495b2df5bbf143e3e48bebfa3503f6bd2bb56f4b5b589e5be883a0fc2249b6b59d6dca99e13b14868df7aa7fde62b4ef75bc6f2e90c18685922be7335d4d3f55eb629e2873d66305e434180701b805f832be5f5757117543ae00141d49d094d37e66091fa4a0b06c630156f99bf2a42d7f9315b9e4e2bc66883b9a83e1bd83fe9904642f66b19b40ac0c0a9ad27aef",
+          "padding" : "3037300d060960864801650304020105002426aa02aabb0420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 105,
+          "comment" : "truncated length of sequence",
+          "msg" : "54657374",
+          "sig" : "7f8104fe5b383a7745e52b6eb6cd2404abd1d6e5ec4255424fe802ebe76b70594c3f5e8a38959ae9e72076de7ee5a485636cd59e51e9270ad5ee38af4c5b295855d86efebb2678a66b6fd0328479b1b75461b9eac59e71ed9441cf972af074f20320d5c01d93feb037cd212f5c9774ba65754a003f1380ee0c77d3f7fdaf753adc1f7912ecbaf801959d2a70ebb5c24a68ff725ff8f9901a712ec338d3a798294ea0f10fefbce5a99bebfbef2ed91f6668d8e25b676731d9595d679b8a7e8c35c918ff0bc6b080f0f0a187f526b55b450d069bc0d4b47c59f7bbc58ac3af21180ebd6707d7237c967454e459b696842d41841d02b4c34fc964677b0116a22879",
+          "padding" : "3081",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 106,
+          "comment" : "truncated length of sequence",
+          "msg" : "54657374",
+          "sig" : "9bf8795b877ed9a89e70af142e44cffdc770cd2ddee32ecf32b962840dc26406b1449f03ab16c7c9c72e41e2ab24bbd163d2b7213ff7ea8ccff463cd41ab87a39232383a6405911fc9bf33ea82fa9fee0954912afad0b50d80a70a52cb043f5d8fef8f80249f4d2a8a1f47d524bbfe9678ffd3a3c9d307d9c61a909478cf87d45001d66f5786a7d22d8069884c3248a3e5f223d6988e6c595009cfe24947a564f43964a1ac7d4319a446e7491230a3814bfdb80ab2227a2029a36b13da4a584c7cfccb337bdac86b5f727169596bf6a53467c06eb94b7d168624847df7679f27877f43954c4593cc4e28951dfbaf4727e3728cc9b9a59efa92c3249a4e796f33",
+          "padding" : "302430810420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 107,
+          "comment" : "using composition with indefinite length",
+          "msg" : "54657374",
+          "sig" : "48e200aab82c1d2798b90dc2ddc522ad5d638699b2349b26596a58aaaf7d14f90f52f44a320fc424ae2ef781dbe5ac12de05b85a02866895329f36b1f2e8c78b5a8161ccde69de9c112682331363398659f832544c7848806a3f2076a3127a9b4813e6d5c8ef31bf7a102b136fd5f9b3675c5e8ea7df25bd9b8df6cc46e9134b5aa185c13e40c935add77fbe1c1853ca8dd28fbb53942e7965a44d9694b96dba9ddcd8396d7b191c7b385629e6c391242ec76a916cf038cad4f5239a4c17816a39deefb43ceecd31fae33d3afe50edd8086dd501f6b72ef43f21ea1858dd46ad56ed63402bb92ab06b85a0d17fed8d9028b22f528a9544b8827dced2c778d082",
+          "padding" : "30803031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 108,
+          "comment" : "using composition with indefinite length",
+          "msg" : "54657374",
+          "sig" : "4323f6998549f0c6d79dd67cbdbea827da1ed45026bc16ee020d42b1d448a66810677b3f0278c20213a3949b204a773b533e5e203f2eb48b936b01ce5b151c32be13f89c1f56b20b44d5987e1d7220c67d07578f8af642b6d504e1fb11bf1657203eef4f9882488f68ef830be437a3ef948def0a6b34715056926504439262cd5e971a91ec5b2948498fcdd5fcb1e4b4f5ba04ee2631546a5454f28304a07c5c14d01a75322bbd764cc452aa9042bb03a466b0c62a8bf945b85c63b6726f378a72555108d27029268706976de496f7098d093a3a542db8fd5aeb805ef3b547267234271124e9e267f27a9525bf224e3f5d33b67a64436d65cdcee729bbf28897",
+          "padding" : "30353080300d0609608648016503040201050000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 109,
+          "comment" : "using composition with indefinite length",
+          "msg" : "54657374",
+          "sig" : "225c4bec4924b6aec5e2524258edc63007b35b37faf9c735959c9f932f982f5d5434fe0f11deed690f9a023337a20dbedd42921f2a019ad6ff033ffd297e8225269bb6a83bc2fe8e08b7d0b9af492917bd3d0cc7e3c7bc213e0be8401ddd2e4b5c1687ab6da434ca3870f0ed3c2c1b08a00b9f52715d2efe0f4e4097510395a087b5bf389471bbce2e85814a43f10d68d8d77398b3b3fbf196cfc35f6eee8b21117fd6c0d317674a6f89b2f7635c7b5a91301b6e64578fbbfa327fefd9d8e4c992bb88a23f8561298c60a075c4f29fd737387349037c1cc360238dfe4e2c3bb6da805da25feb9466923e00242dacae167b40c4c4d5f4473e22adb0851162f7d4",
+          "padding" : "3035301126800609608648016503040201000005000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 110,
+          "comment" : "using composition with indefinite length",
+          "msg" : "54657374",
+          "sig" : "1e416fa2194a2297866cd7df7d4db6477bd71e2b2159313204dcdfbfc69ec84f826f01e35e4ce6bbf43c8377f34e7d4bc9c339d20307ba6391c2091698885480a776628addb3ad0f5a7fbcf944ef41fc2ea9ab078ed8ea62ef4ddd1067d8863d61c1b52534d51b2473a11208d260460008da01f8c88540a594b3eb6c2145472efc20770342f2e17bd2a0025fa2b8d820b8d5fb41eb6025ff990b054f741a8f716f354b18064902e208648b9e3eb312f2917782c0db5c8ef49ac0707a82f71182e8a21daa75d36e0d4938cee289742a3463133082faec3fca8979372957486d5410b90de7e232818b839882b513da01b4cb9fc59c0da62b70ac5a4de1ebbee89b",
+          "padding" : "3035301106096086480165030402012580050000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 111,
+          "comment" : "using composition with indefinite length",
+          "msg" : "54657374",
+          "sig" : "9801706c663bfa15fe7877c8d09f58d4664d3619471c27d333ca869536a6c4f4e816c905b2596c71a4ab3bcf07b550ccee0e8ffd5f7a9fab3afb5b8bf76f8e118b7d07170ab6f82e7e33db4a81f2f9ef1f86d04a1b2fc141768d9b4e44792ff9ed882032ad5578560d51c7ab2fa96128fd147bc260d05074ef42846db7c8feb7ea71ec6755efc554e46ad4c9dc77c259aa834fea03ccb9b931c7d3c8b0316e30d25346b682df91a6bf68c6266723ffc77576abf8a732ce1a7368b71d740677c28029d2854797fd515278d884f4eb0806f21752207b103de1e19d357e480021d3e28ba9461b6895b777f1b6a9e08bd4cf713cc41f4e9a5bd7071921a614f0c3fb",
+          "padding" : "3035300d0609608648016503040201050024800420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 112,
+          "comment" : "using composition with wrong tag",
+          "msg" : "54657374",
+          "sig" : "71c756c9def03a24fed38e597b1925905783f0b25c974602d982c1e7413e7bd82c78466df5decf09100b924ff254ef01b2bd425b2e0ade75ee4ec58aec4f3da80030eff25601f3ebfec46452e01cf51ecc6c0d2268f754795486f7886b8dc181c96f6fe4dda05a2b54e6fba77869fe347c2eea5b42081d2140cb9fa7a6bf023a6b9f806bef65038aa680fa6ab6263d756d3cc7acdbb93ab3952998b2cb37aab72a50657e276d70dbac6be84526c17c5c1790f0a1eb0dc0644e6c47510d3704fbe9e10c8509419f6c49656e06f7bdc4637891afebd376f1e1be139a87b2eec9063dcd815a17a08f63e2a4e9f9da822cd0cb5539c4623da6d279ffece0b8e58f86",
+          "padding" : "30803131300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 113,
+          "comment" : "using composition with wrong tag",
+          "msg" : "54657374",
+          "sig" : "50d70adc01b502dee439ae57f59ec78608d05820f858a6f0e9271a4372b47042613aef6ec2f36da7dea07dfae4c84f57435980b4982348e2d33c4df6c3384accd7c7e3892184a3778943ef50477b906c2890b5c93322c065315b960be0ead30bfa496960d53a4dcc08c8df158ac5090c10c395d18cb33c8faadb7b8d6bab8fb9997e017d5c12789c1ef0b285761d2e43fbd5b4313726cfc85061f9ae33e3da0addbd86e267fef72b966ad5286220b2da94bc1b667016bece0111dbd2ee4943d9d0fd041b666d93bb3dab53e16995d6b10d1a3b4aa07be08dcae8f0f5cc03c6b9c3419d5ff8268103a850c2f2043842637f54468aed58aea06d6f2dbb965a3208",
+          "padding" : "30353080310d0609608648016503040201050000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 114,
+          "comment" : "using composition with wrong tag",
+          "msg" : "54657374",
+          "sig" : "b96e8894734529229c0830d77834f5a07060c22186c2cbc7c0fdbaf405b466fb9727694a527acf3ad0a35223254efe854789375311ffb6ea35d1335216d7b8fb215241cd3dbbc90dd569c0ae8979d9c0a2dfede3988c85e18756835734d45974dd50aaf649c1b9635f0c53dae4e44b0d2315897ee248998f6efaaeafe72a41f2f13a1271500bd6f9be8ef84421f443e68488a3eb40604cd4f28f7e9cefb539c8c5e87de966017d9ab0a3f01275fe25677c0049c0fcd7ff5799b4b96cc0490bc4199da554daaed28ae235dbd3104f9f2462468facc932da3bf2e5822a8159d6e8e8d9ea96ac200113a60a57f3253b8e05f3f0e8e040fe3a55b1a8ba749d5d5ef3",
+          "padding" : "3035301126800709608648016503040201000005000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 115,
+          "comment" : "using composition with wrong tag",
+          "msg" : "54657374",
+          "sig" : "1b640c511649dcb0d23df1fd808a340415cb87bf3b15ff5e19cb6ced922fcfb4ee376d6dee61df8aaca7e108c8a0868c8a2e99db2c0e769c80b7e5adc3bb4cd4da70f7fa68933470aa61d50a793702a49d3dc635670fa77f2dc282e28f4a74aaf5a76c9383b093e529ffde33e3f8f947719c5aa2680b1ed4a4c07a72189e03cc0528a814a6ccc7cbcb4148667c9170c882ecd4bd6cc8dee957b9f334e8e5316fc4041ccd6b422cf658ca6cca6f27972f818ab2f0defdf35ff5e4dd87de52d6a1d2cbda5f7649a13d83f989d208d95b076a1984b548b71232325469d111a8dd0b508e4affeb2f6dd42c90f4cd1e10dfc4e896e483bd9e96c3e951a51519a19486",
+          "padding" : "3035301106096086480165030402012580040000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 116,
+          "comment" : "using composition with wrong tag",
+          "msg" : "54657374",
+          "sig" : "8dfc2c2577dc3f36d36430f25f76fc01ffb2af51e1f5aa8fdafe6d42f57a0934a106d88254f834999177b204a5388543a49d638af70d52edde954fc9a6a2a0b99bc3d3e2c148058a72e2a50c1c3774dd83f151e8fecab64e1bbc6095cccafd0d1774b8b4ccd8d4b995af3e1ba9c9430fd8fff39bac43b0c6bfd051c5d20758900c9e79e11c7918af1a38523090454b2c14f01d1aa16b6d3c2d94bf4724a37c471e3bbdd710ad1f268030ad3b3fceb83e808c1cbb1d3b4d3a4de84f0a4f6f1d7765b324ebb81e1bcd08ace01a4713c6b376069114b8f0cd236f7bbbf3bea3bc583412617d97d508a511c54eb32f166dcd7f80d53a5c0c881030de35266a30dae0",
+          "padding" : "3035300d0609608648016503040201050024800520532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 117,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "54657374",
+          "sig" : "a43fe7407fbd017415df9e194db645a0a5744bccc05dcc89044e7b978a97090833589251d57ac70f0591ef9a787788360602624dbf50209fdf21f578f0839b9b27c9aab1bd58d2a17ab1da720fb686420fdc17f2756edbd8eed82502a1e66c3b2b90c08dd4150f6f6d0b569cdb14f7cad5f7925d9c8a1fc3f0a6092219ab6902599e018f88247f2e4edebf9050104a387de07db955bad9cd01f2b189d9a6a2ee9369bf1f6ba272449e26d4a67712a3a22947ab67de53b1a416f38e304011dd477eb33c8191d46101b17d9e835d9816f76dbc540a2d6a0ced2562325b9a21ee7c90f010c22fe7723ab4fb16197af8fcd507f61387dad1ce8ecd7a39fc84eb8da0",
+          "padding" : "0500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 118,
+          "comment" : "Replacing sequence with NULL",
+          "msg" : "54657374",
+          "sig" : "852f74fc801faff2486afa44197fec789d36c1a40ea41b55d46b6fb6a5c994a9943c6d9b3d46165ab2023124271ed5fb34ea0299b205197e4d8432c1dabb40236a095c05587e885e6f8ed0e08611c2c7573c928c6ba6159541fbe6751c04486ebbe2f20ccbe8410ff39d7db6649eb46c6f0ba552f0dffcd183628e863ce2ef8f44faadf3fd94659f98517a5e8b5969aca73c32ae22c433887315ba8631f4f10cbd7a0c3204e377e7366c136986d505f1e8855f80c5f8f97b9ec76a69e9290734e80906701372e1f9fff6f22d15508e4393539dddfbc78471fd2326e7fbfcb5fde066f437171329905fc90c95eb174e9bcca53ba46b5c42b5f3f47f1e0fa4df04",
+          "padding" : "302405000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 119,
+          "comment" : "changing tag value of sequence",
+          "msg" : "54657374",
+          "sig" : "6ae97ba33d02719f5e4a809f5b44054331d0ec1b61c34067c6c8996d126c972df2eb48f2decf74623116e4b54401bbfc05023501e00245eb98d86aec6357697e67cdc78e0eb37c53b3ce06cd078af9bbde0206ac5d63e8a842726d4bff489e6695c6539de3bef40a4fbfc500bf932c35db6d8185ed3ae713ef6f7931b8e4a76834a6cb59c4114c230dcdefaf3b4460775650e03d3461deb3a229511bc97636341c0bbb1aad24f477c3a1658155c338d37aca1d6b5ba039f3a486535a2e2dda68e4bf1998b8931a52781e465d32596c6781612af4a6f495974c023b68a0f537fee00a32c3e499da4f8b2e4ee677b68b058f99a104dde579ac31e6ff966679cd47",
+          "padding" : "2e31300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 120,
+          "comment" : "changing tag value of sequence",
+          "msg" : "54657374",
+          "sig" : "b00ec164825f457f144e3208dd887c0b69762a2877f62d8795ac3eca14e49988f898d3c939613caa5094e21ea361c804c8ea0c5f6a0e09e118e183441b5719ae308eb95d705046218e7dab336e53fb30a7c1ddc59cba08785ce9bda385743526e6b7bd15b3cde6bfa10f8ad4f6f20534c388d7f61dd04f34009dc4d6266f7363fcc59853f24e0ea5f9ee100f0004adf75767d95c12b30473594f67bcd5ca63cb76a4b837509901dcf0bbf5f2d109700bf04e2169cdb47ba4de1019fd595665acb114039bc75a62cc07624646fd1ac2bd71625974567a9508c512b0576ecda69a59e950802331002662dfebe08d2548968ea8939364a27e202184380cefc1796d",
+          "padding" : "2f31300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 121,
+          "comment" : "changing tag value of sequence",
+          "msg" : "54657374",
+          "sig" : "1778c178579119618a407ba834a7de8ff244d4da6ed2f979c54684dc459257e70240691ee844f745d72e64633200b800be5da738484c0258405e7319800c8128d023db5227fc2e348c426a026c3f84060a4548f0ddc2dc92be1dd42bf7a819a9e892d318eac58919a01f1ce3da9c17528af6022b2cd088144fe44c3dbba60ccc83970199b758fd49c2226f5b742668d6685dee1a5feee173aa8f4428118a18701ac503600e0704410595e8fd7208e22c161c81e108056b52da131f1f806c3bc118f934cc78b8e047c0b181ee7386d9c283a3dd251ca30a81a9b6f562b3364815ec3d247e5cab8ccdd78e0653e2067c6148b76191bb797e800f0d6e9e282409d9",
+          "padding" : "3131300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 122,
+          "comment" : "changing tag value of sequence",
+          "msg" : "54657374",
+          "sig" : "13b647d93816de9c2fef162f8dc37956690dd40d2124b0b7b724ddbe5c62b1242369f82851b24cf98b1b462f6f5fa40c248c02d778ed28d3ec8d2eeb1668081c691f6a3939f72345f0eb58fa02737ab0334693c6333b9e4593eacd3dcb71586623d11b5230eb624034561f3c6c7b151c1f18d3311f359a166500d78995d6ede43421058a571c639f228a804e33deb8aa06e646c7aa425a8d0ea245e4b2c2a5d48413c6ada61d195e2302577cd517876eea82b043c6741aba882242d9c97fcf7edf0d0a3ba6cf3723f5d3006790d22dcd8ec6bca701568cecc2420284e140c84d94e4bcc72861bb31d61a9dccd53857060f7f6bde1503580f2d52424afd1c0794",
+          "padding" : "3231300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 123,
+          "comment" : "changing tag value of sequence",
+          "msg" : "54657374",
+          "sig" : "ac52288eb0ae64f6897a5b383e9e4d734b45685fe3a75e2f5c65ad8235311a6a2fdcb5a8aec47b430a7a84efe10bac9da10786badd033089243526a4d9ea57a9e7103ca9e7dc889a9d1a4e4b86deb34ebd3a5b454d0afa940af71422a4c4dae4e1a5bd1e4270ad32a486e2a1334db7a511f3251834d112b9696979dcb0abf8ca83f304e4e8cc6892c4dc5188e416428570f0e3e56e4b171a3ee741787384f9375019fee5cda1e161d4876e9ebb349fc1f33ded8a733bc5c7b719c0367ee44ca8212c517eaede6689e1caae2b5cfd347378efbeab78114435986f95add85e48d433074288e0cace49de21c0fec2414bed9b01274a8e8f6959fdc29648bfceee70",
+          "padding" : "ff31300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 124,
+          "comment" : "changing tag value of sequence",
+          "msg" : "54657374",
+          "sig" : "6b31d3f3d9c007718c2a7f9bf201ffc003581b3fca2371fc15aeba38214e51d6f72ddc632a7632ba95f79c868230c56851231a8fa178cf6cde67fc25cea8c8a811d33e451844b86fdc11c1a75b03de5084a9642490d5e9b49de50d51c93c765bb36388f1b3506a098a8a9d58f509d48e76477bdeb4ae2fdfe410c17cce011da703b47035fe2041fb82d82a158480fdc25d8e868209aec6f788e575635a7df9fa58a95919356d52a38e678a8268f3baa2af7a6efbe3af72e23eed354bd43472ef7c7a877842efbf3d9f08ef45cd562ca3ed4f903d7d4a571bdda531a00458387135e09d276729ef230297c289d9a0010d6db66c40b96d91929e685742946a4c05",
+          "padding" : "30312e0d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 125,
+          "comment" : "changing tag value of sequence",
+          "msg" : "54657374",
+          "sig" : "b72975609463db5cfa161a7f29ca78c1e8ec6083eb055bda72fa7245d71d565af2855f175ed29dbe881e2106f90a84f3abbf7d229db8cb7be2a7d5d29cddfb16468d9f142e07d2e5f4780ab52354504743ef0cb4e32d3cc1c2e612245324afe6604004518d8fad3ea2884104ebac9eaa95e14180e86c54cb801ba9b8510bee1e2df90fc49a005b1a26ade197c63de5f1cdf8ac8a84f6c67768c0adb54ae853388de71d1643e07d8bb083166efd077251cbcea5905fc035f01919bd143fa8d5b600cc9062d8b61eb86d118c0ce9f98a3622f90084236124ed6a5024b0b7a61bf7641cbc7647008099decf493b56c59458a1a9dfa19c13ba96c0e050d3df512491",
+          "padding" : "30312f0d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 126,
+          "comment" : "changing tag value of sequence",
+          "msg" : "54657374",
+          "sig" : "6afd7245b1521c942c1d38b8dc0b9a3bbe124833ee97de0b50ea9e537973e3d199376f1de834ec239318389e479a89c97b5df2bb08d3fc565c33903aab595f4005461c833bcbb5c04d90a21aa7c251e1342e2d8db768ca1c23ca473adc011f40eef9faeb783cca57657b6fc4200fd54694ad457db2942c8a9271b61e3cc1aea81f97052c3c4ce968b5c6b56710d5733615d960e29a636bb959a4fe3644c41f7cb85987b9112df1204f81c69d193f10b5ac2aa9d8f223c77641ade87567469c07b82918d1b44df6d047a0ed9291e489abd7050cf7ba1adb85cc5fd079cde65e8168c2480121ee7145bb094dc846517b6490250648f9b58398130a69dba9ceee10",
+          "padding" : "3031310d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 127,
+          "comment" : "changing tag value of sequence",
+          "msg" : "54657374",
+          "sig" : "582dd05a81d329fb7c4c1bcb5716eddd21334fd2f7763aba0de67eff550838dc7f4284ea5e4b94bfd0ea823aed8bac214e3c9adb0144c7ea34ad98cacb583e8f5e2ceecfaddda67031de748b3edea986dd13906ffe06695b7fbbdc455e350b64a459a8cb260ee87b0004433d5dfcab404da5bd9a116168d8453071dcbc13af9abdfd009704721e65df950984b564b957984108afbfcf1b6f14ff50425a16da4f1d043778a50b91ff340d94e04d9cf9e7e3b35a7482cd2096370b189844542b2976713466cac44b356581411db0bad42a5b0898d05e5b19d062e04d4d22e3170001d46499a20ad125779ae95d3477cf2ec3d39634ad787ce1ed0136bc432cc813",
+          "padding" : "3031320d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 128,
+          "comment" : "changing tag value of sequence",
+          "msg" : "54657374",
+          "sig" : "666430efff090b85acbd66acc054f29a8c05720e140a599c211fd699955c8857ff68dd8ebe56517a1d4b10ec5cc175b17488161d8de9c07c3263e5c3c73a9c649d85e8b4cca02035f6ed9b8ec80e0fb1e102a06ba60e30a2d2d2026b1efa283b6744c1f2a9b5bfb2aa054fc061626bb7c5d18cde129e1a188b62f440abb78ff3eec10943b60c168c2aebddec92191d04c2d06fe1af82e9f6551834f2c6142b7e81bbd4b4b501986056530602489d59a338694b08f56b83089c76ebbd0d2700ab2b1489cdf43913586b426b22574d20bfecfa1efb0a72b72d7374ba235c8708eb68feeefa9dfeb71c94bbf999b952b2bb5d6f47bf3404427f931360e94c8087d1",
+          "padding" : "3031ff0d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 129,
+          "comment" : "dropping value of sequence",
+          "msg" : "54657374",
+          "sig" : "4f1b6b6f44242c393d6047cc0c52f5f11e53ee6f67cda2ee9995ef5d85846e35bd501adda9e0e274147b3898b56d80a78127569ef977872f46bf6f996ee398a489843d51216b90dac9bf173ee966cde1903c072f3da2551b47930d0d4c8c74836e2027ae33a34056c40a9bb7d811956463dd01aaa305899130d180e61532a604910d0eb25cb14a6e46ebce99914f820e64ca685a33a2409b3df75796cee1e0ea4e907265d4478327cea93d2779d607854d3f327125e4fc641f6f87da99b9138afc90965dcd95f95e54729618cf0785a115a0e7d9534fdf4442646602b9cc305eb48457f692ed6740ce315ab8a6facfddc36077a8bcf0ebd2a4cc41565c71bee8",
+          "padding" : "3000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 130,
+          "comment" : "dropping value of sequence",
+          "msg" : "54657374",
+          "sig" : "0ff1386eda5e2e274e20fc68a2f2e04e0b299b99ef4c3c043761992e669da54a51d9ee1c1626674ad35b95e7c9cdd72312616f461bd933bd281f3ed79b532b54a39f1ad84602edd80767ce0e89dafa6841fdc9c4b2339ad0a28aee8ac5859881e23b4ff38e2ffc9648489b5fb61f64c6201c0558858f01ad97ec7fd40965567d7aa98c03ac0b3615c2d17d1c7695df50e03c362506f2a7e0a3c95e1e5be6e382a86bc66c4f1fd4d0972af088a3fa7f9dd439ca4b44cdf40cc84370d087ac198af66e6a99415c3b4954cb6893d1cdef0f7329ba339e01fea4ee4096b94bda9c4d0c74351009678a723402524976dc01e70f81bce36c4d39ace0d12111733ec1bb",
+          "padding" : "302430000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 131,
+          "comment" : "using composition for sequence",
+          "msg" : "54657374",
+          "sig" : "1a183748037cc7201b866108573e83611953f72b96a56a33eb7052399614834d04daaf3892bcfb194aa1ca19df3a149720a0ea970fe9aae1bdd09c0548071ad50d806d8a6e40a8036fdc5803de61bdc14ac155d26dee61e1c23dde867c16f28cde28dc6a357010ed1714a0d8c6fbc5a1894d1dea159c3a8f4c5251233ac2cb1ee715d42b15360bd045a38be1fae6f5b5c5b5f8eb97cc537e18d71f506790b35e69faeb43b30a80ce6c291dd2ee4b0fdf6dd97dc197df9b125c59809cfec7045698ecb700cf99f3feb6099f7516dbbe17665ed515ab41e7154dab04e568e1fbd1b419d9d261ba35f05512f181f87d23143f0649ff5711cc4c66d4e7b702903fcb",
+          "padding" : "303530013030300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 132,
+          "comment" : "using composition for sequence",
+          "msg" : "54657374",
+          "sig" : "3134086af9ed8e92e0dd74f4a83807bf263b3bd5ca32fc975391091016dd632b980c1df91854508164088e61c8af8ab1cf2149a8e8b2fd7d223e67da5d524cd6dfd3052bd307c991761bd8047c2403fc84871430978a0099954bc4befa89c7281ae62b10972a06b5dc8f4cd6d7e1ba42d19b486392fc2f1658ac31fbe9f0bd6d7b7738ed9f7e7f51649989de4817c7e4a613e357e9d4d0cccd5fe365ca4505f99ecdee8b0f9ad3d76deae39de4a815493611128919e344ffef0776b917541aad6709487f4605f1aab878c3a62d881085cb1ff1cb55bd6436bbfc4347c0ebfdfdfc6482581bb1402bcb787e9c6fbd3c96d9dcd16245f1935279116223aaacd83a",
+          "padding" : "30353011300106300c0960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 133,
+          "comment" : "truncate sequence",
+          "msg" : "54657374",
+          "sig" : "39963c8d72f4b87502bddf258c441e3b7928c0e99f5f4c7c66e45db5cab0aff14102cc66de1555e6053e7285e53cbe1c4645883768d4e3e6bb18dd87eba514f1fce3177854b7f58adc573d2f14ba065f0cc36d62e62988a85ffc4b1ed6e7e7f3f5c18d185495f2ddb1fe32ac0dcf2404cdd3078ea5986e293e2cc28b36f4be1c654f8cf86d0b8fea5be318bceb08d62594255273b420ed9f6aafc9a639fa384259c636132d8297d92cd9bb4e8f2eb77785005683905409978b50b97685c39274299cb9da6098ad02a66971943f0e7c6df90622e39f2e8582770f252fce3f1659ad742e68dbe4dbc6562c065f82f5cf7c85f8967b9de92dacd2b05cc5d1ff0457",
+          "padding" : "3030300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 134,
+          "comment" : "truncate sequence",
+          "msg" : "54657374",
+          "sig" : "10da62f2d21b08fa1f0a9c6be729d60939340de884ee9ddf15e37944517b9c1e692193029e3aee69bfe92fbdf91bb7018deaf025e75944952b379e85c35d079cbdc1da17f97d844c78b0f0849b7e81e284bda48f0e354daf99fe5ad35f3b782beae791966d2d6cc7d6ec262a86089c385fd56d1e8e21ad69b85d305b43a271fa410c65f2ea088941ece8fd98063d50d6bb07e50119f0c4cd9c27775bcd40803124c85fa7dc2c555bced956e131a473a0e3d357a8287c0aedc6bba5239d3c8e92421918b137c08c08b424040e26a559b8cdee5daca596e7506109515e822d3de3d826284140b935683483185f8ad5684b0ed648a2cbc9e549fc4b0294d7384684",
+          "padding" : "30300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 135,
+          "comment" : "truncate sequence",
+          "msg" : "54657374",
+          "sig" : "48751b8bf25b88354852664446a3133204880e38e9bb4e34ee79beef8b464f138c83a45ecab05ea954038ffe6a2fc2f90dfd76f2d2a6c3a2acd36f63c43569999d54aef4b9550fb2406344779d695c773b9605d189d42a825ee489e4b69d5f1538e4853132cb9fc97a56bd9180a0ec32c2fdf6beb855d62ef6b18ea45354d49bfa225145ca639e57e10248a3e947c84d35502f6b40a64c44f813aa34ce502edd4dea72ceb11d453e66d1175d9ccd5d925e087aba6e8e34ee641eb7e76cde594409969752061847630c7d7f8d87d3fd019ffdf5cb3fb0ae5c51a8e66b03fb1f6a8601c1cf79a3596c4ee9c66331e159779f7e7c78bf0462bbaee953c31ab6be6e",
+          "padding" : "3030300c0609608648016503040201050420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 136,
+          "comment" : "truncate sequence",
+          "msg" : "54657374",
+          "sig" : "17ce85f7b037ff2f5902e3df389932e95b3814547414bcfef491ca0aa9f6ad8eed3bff73f240352410bd67caa01c77994543af721d1c93beb57a6b5ab348ab51b75d75cc4b5addfab9479ec0f852984b81ad6eb0ac7005b24ddcc43723b37e24f509dce252e5cbc3dd5ba4fa43385f773b9d8a49ab07735db9a7aec91fcdef0fbff7a6c3dd8c8e7ca1710f90ac3ab1594a20e4421491cae9abce372b2bd703808363e26feef7ae93d40c298865de766a4de885f2e9efd2ad0b465d569893b15b194d2d8c9ef66b5557df770ea009d1520b87078b7339a53c84a3dd477c185c2f7e3e0370346df5951dce75d4b9e49092deaf020e0651d409d7ff17a5b5439286",
+          "padding" : "3030300c0960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 137,
+          "comment" : "indefinite length",
+          "msg" : "54657374",
+          "sig" : "299a19ce5d0226447644ee011e1633135feebb8765072c33c18c7786b93797c6ff66f182a698d291f50f60bb20d244721a3e1304e425e4caf5d893690fe555c45f2eef068fc829d313499c0e2301c127c032caafeecaba6e339a96b5654d8dd61dad1d31e594fb538042a7c14c2953ed843207d628cde26453241edea643a2a50eb6a9446ae1d266550f558a5c8caac34ab4e812a2afc751e0033a16a1bc09eac9118ac7bfd39440926da48867dd1baf0cafe46a2f3d588a01fedefb7e8b0fbb294d9beb78229dc2a1ee2b045517e25b2c521c0b6431dd490376b7e3874da096535ff2cbadcd7507d048c82e550b2da59cdf3435dd6c15d00b81072d0b0cdebb",
+          "padding" : "3080300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 138,
+          "comment" : "indefinite length",
+          "msg" : "54657374",
+          "sig" : "5047ce51895b102150c34f652bb0e6f683189dc2b4c5baf7787d01438f0b24a4fd3120f6fe958dea1aeb126ea1c93745fe8d0d0f9280d701a00bb4ba9eaf35a4694345b9d38f724f0dfec600e379477999ffad9122980ce111ad4492cb4349ade4aeb85f3de7e71be992a42240a78ec9355d3a2bdc44525a93d66a41cc18a6910f43e11a528d67237901a4196383f64fe6ce5f246ed02ee2b5f5ffa86bf16044a20540d2313384cca1317cf3d18bf9269f3b539b78a6c84cb4df1e9f2cdd4d9a9b53b11f329ff7db8248d23ff3dd53e805242ecb307bcf2cfe23d90de16c68cb3d33a5e461b3a6db28eb1ee25bae53076df190e6f9cd23a4880514264356f02d",
+          "padding" : "303330800609608648016503040201050000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 139,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "54657374",
+          "sig" : "47e9373136f0034afd98de6e5519770af7ed2bfb4926ede7b6b774cce7d8df94fd56de9b5c8a2d0d3a23c2a49b171e62e9233bfdd88a48d66ef3b1007cf7425b46d5823b3e11a4527716f4cfa9bb4b9ee0fed76c00a6f5e1093ceb2117eee845b1daff24f8da60456d429a94d180ff40600e29088d1c181a60a233dda2c01fc3bd24f248f8d55d12c9b818ce608d8ef9194ec2379ead30addf1d88a4b9879f5217419753d036fe39e88cb0461b5856af8f2cf0b5e6e74ee8c0d052b851029ca7ad23c2eede49a3d916d5ca5a0190a92ff3b2f9cc4e41dac240620afa6efa358a9f1539abcb1073fd7a5fd18552437bc01cf5149506359e822cc405f5b474510a",
+          "padding" : "3080300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e2500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 140,
+          "comment" : "indefinite length with truncated delimiter",
+          "msg" : "54657374",
+          "sig" : "9de821d4fcecd5c3ec6ebe88582c61390c5d471724a7c9aad4d4eac2576aaf133d92e5c53e45d43bd707ad80a5d3bcff1d45599e048ea27899f27a873151392afbdf287aaeeb7020491c835050c7d7fa3a905eb529fe2760e55bcf994bdd25f4bbeaaa26653660802b4131cda45e1a51fda7f6ae42f38ff688c8be59a70b7ad805e30186177e094ea2ead3b1dac4c24a42accb112155abaa12fe452bac975485fd8a40a549b484fda7d078bc6e443ddcc0289aab9f99061b083676fb00492aaca801cae31578247487fbaed775a74fadac298be953e0a108533211088290b3ed8af563186a18976ccc04e24097e4642d0e2d5242a28ec13ba321df4b8705624b",
+          "padding" : "3032308006096086480165030402010500000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 141,
+          "comment" : "indefinite length with additional element",
+          "msg" : "54657374",
+          "sig" : "7c566a9339a3bff1a30d14b7ce5b4f2b1037907657106945a1159ec0daa86d687fc3db4b0f434bf6f5797f3870fc935f0aa1a67cafdd57b3e260a5ca95f17fe9e745a8aae891860e98600b835c0e18d119f41053612bfaffb9c780318d8628a965449b38a508bc2ed5e9ca208f44189ee72ccf5b28208eb27968fb5613bf070686d638e48d8f2dbd3b8ede717f350c41e1d97e9dd4d3a82bd0fa7ba4c49ddb50ebb1d522355f0307297e7d833e11125efd6d4201e6ed7fca9f0db1813c634af35d780769dc08738bfefe32fcef60014d5049ad739aaf7d2b885c2dbe97c726c269333d592d0c35d0a1b448b972346dcf849cbe370854ef33270e49b17c93ce7d",
+          "padding" : "3080300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e2505000000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 142,
+          "comment" : "indefinite length with additional element",
+          "msg" : "54657374",
+          "sig" : "92996c9f61dc7e216d111ad097ddbee4cc15ae29b37b944ecdb2976b440c5e94ab693d118d2c129f10b327c46ee8225099750df108ec8f412796dfe607c2f0535ef8a4a66394bd3d72e242e8182c3b1f9e8b2e29420aa6f1dc4c6268d982931f1ffd177293223de1e6c8bf65e1593876a6865ac228a898f475510ff938ca9f1568b0a90560cfc79dc4f05734013cc0aa65602aae3015dd83a7566937808b1e7d8d64fc0db46a47e35185ecdb9c086f4b857007ac3649a7e773b04dd8b6775adca21611b819e4b90f9315d4769771cfc674c41c054fe8493149eed9c84747b067e5efdf289a798368298aa12628a4ed8021c0827b0893c3458eae2f8104c12999",
+          "padding" : "3035308006096086480165030402010500050000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 143,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "54657374",
+          "sig" : "3abd11508528361765b79ca41cdf3a114305b9c481b11eb71b742694d5f9ba59f3010c066971df5b80f969fe1971449550031ed1348de43ce3bd9fba4d1b93e1f7d1e4e0f79e98466ad37cf0e5ce9fc01b7e08a9a540d458f546bf53fd6f2bc215366cdafb9572600c0b85e9f3bbe0dc287b6630d7fd10114ff692fe2799959f6777daa709fe7b42d70161cfdc86c03a9cc815e51febbce992104020da3f7abb3c800f4c8ad7f7bb56d0c82689a32764a3029210913a1f78ac54c50af92fbd5df563dba505235deabc0a6e6a39c4f8b211747151e3a677eb93026b513f0a121fbcf4b533afa41c13378634536173b1838fb3d436ffab58cedb48bf2562d59554",
+          "padding" : "3080300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25060811220000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 144,
+          "comment" : "indefinite length with truncated element",
+          "msg" : "54657374",
+          "sig" : "70f8af936746d605b1527960344f07f63c2933c32f43cfb0509f4461b897bf09fc7c37e1828b4f63c55b9be11cc9642c2c1b6d44e388857207676e6914aef480ea49645296f5c0c01c63e1269ebc0c27544042ac036af2dbefa2eaea0be474d534e34995871c4efb9ae6f85b0f0c724ec191b3fe46554094a39d785441dda07713e51f6f9af8116689f65296e40ab21919c7f9a67c33be44dda122771c2fa1c5bce89e07dc739f671754a99ca273e256bd2a6c0812b9f3f3e76c2ff7ed972be9836a8a926cc680df79361dc94b948da882021ea1e1f5cb6848b2ddfa285c5daec97606c029c33c1fa312b409794c8e701a414f3cfe987b08f37b635d1c68ec8d",
+          "padding" : "30373080060960864801650304020105000608112200000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 145,
+          "comment" : "indefinite length with garbage",
+          "msg" : "54657374",
+          "sig" : "53dea4ade112b2919cac494c1bb1bb9027ed7a70685451c21d3618ae862502bc052ed40a0000471085792a636ab95093b73f4eb4505ce6896fad47a27322a245cceb730dd53365659cb4467308bd001773b20cc7a850f48e78a0100eac31052857ca323dee8ae643241dcc33dbd2ac098aa5a6c87624483d7ff51b1d1d2f2409ab2d1d0aafd29002bff4640f8dd0d24375f7e0d5789bf71035ebab7b6ccd23cd0597103ff93882e58c0a5ae2899bbbac9df615331a9142c0d39a46d57a57c94ceaaddba6beb5ec6027b096ef3f8786d498db1baea9bf8e23996c8ccc17d6bd5b8f4a616ac31b0f5ea1181a092fe3e5b960d309497792eb5046c4ded68a460fc3",
+          "padding" : "3080300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250000fe02beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 146,
+          "comment" : "indefinite length with garbage",
+          "msg" : "54657374",
+          "sig" : "97b5788236de2f816fd21cc21cc39b04be38d51c39805d98c59ef4647523a5fba15f08c7a2076fd63b71282ba90d14656c696f312626a17db5d74e0ed8234704238ff0dcb7539a846adb85795d0ecb407457404df35fcc04d41ce92379c08896eef2cd5547158431e71ee1cdeea4e1e42e41abfa6fb13dce3bf2955f8ecda8bc4fc7e413a21988d189794eb5ceecc722203b9154bae7b14c3c6f7e51081d7898eaee4d4cc84665909ebbf31d7c3dfa216e854c305c7ea42e502af50d6045ca3baf89a836c7f11242aef492586d77b4e6d96bbb7f428bd38e583768fa67ce9622a8e0c8d77c6af211eef2e2bc1418141dcb8401f67b8321095d623e00a3d65bde",
+          "padding" : "30373080060960864801650304020105000000fe02beef0420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 147,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "54657374",
+          "sig" : "41ea411be09bb58c61d4ef960c124d68e9c2e594c9e2f460b1fc2259b20678418e2d0a7fb556464c3cbb0df01e1eb304c64a9815c992640679559fa3b2652553072575804fdee685121efdf4b49d8174ad1441c9a563ce0d02ee15e0e418ebe86aa1bc75cbb91bf910f8bd7dc1544319d0c1babfdd331fe6de6b6999c31890421a3803a99679f70b9b628c7ddff98f57cf2d4660feecf3deb76c35862e90a3dde6ad0a7e09d38485cbdc6c0a86e68bd913e09478f2bae177d51650f9dc630775f9b91d81c149a1e1db0367fa321488501493a715a8a70b406bfdec8b1a79843a63d6c5db1dcbcc7244f3576556081432930f152f466495612315479a5c2ab3ba",
+          "padding" : "3080300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250002beef",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 148,
+          "comment" : "indefinite length with nonempty EOC",
+          "msg" : "54657374",
+          "sig" : "4ad9f71529be0829b7a89c58aec8bd34e251f6df8e50aa5c51c57ed1611d72faf1cb114a8ff12dde0ab838583541a2abb38109f82e248ca8522cf7c4b385153badf5140bf84bccebf88f549aab8ce6fc438dad7ddc87eb2797cb8e7cf3d46e7bce4c853edcb7f0ca2e7dbe94444a3fe45d01818197ddcc20803d91793cfc34f34eb07bdae151fb987f164bb27b5cdb7c6867f2340ef14b900af51c335e68185997174534acced5d97db67835c03ec2bea14c3806810155a1ce916ebd80ec112515baf25f600ceababd9e06069176619b4c1bcfe7f9c151fcad91b018dd9c5ca6536ec999a7387519c42bf71f3b088d915f5150d4b388349b310644a5dc834cf7",
+          "padding" : "30353080060960864801650304020105000002beef0420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 149,
+          "comment" : "prepend empty sequence",
+          "msg" : "54657374",
+          "sig" : "72ae997b4a0bf2841fc14c64a0c44580607eda384aea73eaab998708b2b79b44815ceb2c907ee4c49c1f083574e3476fe1e3dcd2c581596af38ccff0676c2cb24df91535b22e49e8f0723238555c748675e80e4907261b943b167ece76e9d767b64585a1ff6054f09dd5e22dfc7f743d691704698e778b8c031df4464004f2ba03e642654051165c9bb7fc2a1c5ce3054a8579cfbc710bda13b7b2bb2f23e6eb7221fb51ef2404483e914075cc4a9f8eb91f247a600675a9411a6cdc516e5f8b9b4c9900086a3733ef932255235c4e5b4484f49bf9f5937d3d9e1d0ffad627ec0ff0aabe08a0b0197d430abe67929bc6bb1a96b907c34b2498bad0664b1eeda6",
+          "padding" : "30333000300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 150,
+          "comment" : "prepend empty sequence",
+          "msg" : "54657374",
+          "sig" : "8d6ac89a1e6e7d09e463eff106d8817d50ac80e101df01329d64f6001c7b713ffb4a96159f4cafa5ffa0cea9bc6b1a25dcf6f01572666382e546c0da556da811b5fac121a200825964cc2e90e8147c846ed3a4cb4b25151e1c832e3fab42d140bcab9f17a247d1ef819db5e6decea280f44cb4db5ff24e56515317847b4849acb6e58c16beed80200b65305270859eef3c5bb2677dc318e5841092c21dde882a02b16071a5c951a7edab12e3df75f4c842bbc48f876eed02a7f3b878e13a213c18fb54bea46fe8e9e397817794ad24033188b1268c7ed4255376f7807f9491c6370a3eff6021861840ebeee2bf7dfc8bff45ec9b04db5099a586d44ca71d8876",
+          "padding" : "3033300f3000060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 151,
+          "comment" : "append empty sequence",
+          "msg" : "54657374",
+          "sig" : "a613eb54af4df4410229cfd628f646ef26dfb7d610682d1187e9696d35fe5849cd9ec3d48f0b5b239628a08cebfe9c539c6828995beee9788f6aedfba31dae0c7b32221b4220cf5b0d53acf5d8de4d80cfdbd2366203a68b43a72bdfbfae12b96314fef915d1b6fcc645ca935385d23d66418d47d60fd4c7395afccac61c4a02df3b0edd3152c2e398556785e9c982f8bf55e2417e614ef694c17082e556b4a48ff9e7155021747b952011abb053dc09e487450cc7a8a02b7af672b776ea8561504b8b08e2e219919ba8cc7e24e605cd7ef856cf25f3d3391311415ee67dc369b52d676f425c773d72baf572b3f5829fc76925e3386cb770adaada942dc0a4ef",
+          "padding" : "3033300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e253000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 152,
+          "comment" : "append empty sequence",
+          "msg" : "54657374",
+          "sig" : "7104a754fb3341262f603e5695d700b35eee82e4ce5b5f82010f7b8d788cbe44230aa11289d739ab6478b7336772fe869eb5e702a6275a7c385b7488cafff3d7d8f6843229674a53bb6be30c84b3bf58c7591c7374fdfdf1f5fe8c948f7d472007e6c327d9f67f44622af44c55592946243275e5cae5f8ea8590d6efad7820a06181e8180cb2b9f5f0480fbb4e7ca32ae5265e019acc39b46d02e77e0f09426a2b211ca4420a970c805e61fde998d39b14a9ecddfc852efc8d52e669aa80405647330e284f87206e97d4db2e5f798f77a83043dcdbe76a9c876bbe7a14528bff82c35418a6fa6d93beda59bebf2ebc050adf7091df4a20b03ccf9cb335875868",
+          "padding" : "3033300f0609608648016503040201050030000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 153,
+          "comment" : "sequence of sequence",
+          "msg" : "54657374",
+          "sig" : "7c26f8b91b43be4d09cf5ee7490a27ce7bedad4575fff6980a07bcef5cf783eeb57aa1863ade6ede8dc95d07c1a3d0841652b357be04556a549fd8234ede8f5e5083a3d4af273e3023f610029a0b3cf85a8a2f276e4f57251e2a6338d2ca0305a685dcb240f36c966dd0da783176313ef7c93ae6d13008099f846438ad2c9dcc0ec9f8c343cb3377d5d14ad23bb25b11c19a5bc460592591697e92ea088160f87c0418b0903bca2c7567dc76da84da000233c391f93b05e9e8f01b78639bf95bb21f74b7fe1c00b64ebace8458d292bef3acdbff89276702c547171d8aebd56dc24f98d832feaea03cd16e977b99382040f2ecc1ac45885c4f07dfbf9fe61d35",
+          "padding" : "30333031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 154,
+          "comment" : "sequence of sequence",
+          "msg" : "54657374",
+          "sig" : "4a4b7998d9282ad4b458b6b041da104e98f8252b711bd07b7900d4acd3cbc7b1c90cf78eba718c87b9b6ad94fb35566560d6d6be59e801862505e908ef42c934d085ea82fe47de6ae3efbbe1dfcbaf99005ef250ed6fb74c09095a031a30fd33e52a7e7d0b73736f3f7516ee96a08f61e3df85e174650bae50b4dc632698f6e7f1efd2bbf10464153ed4dba71757d2fc1966d3c80e0c555d252d9e9dcdf59534175feb7db6d9d17f30c82678d6ea680876c2ed71447f127dc3c75852dc0fdf0e1c17fd1bc38bcd25501f07a5c0dfcfe295f0be27cfe18a5c596960407623097cdad148e5043433bd4567951ded89d0bdd8528497b8525212b8affbcc976a50f6",
+          "padding" : "3033300f300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 155,
+          "comment" : "truncated sequence",
+          "msg" : "54657374",
+          "sig" : "6fb0241a3961a03138b8473f8bd3ec202979a98f07d325909a2e85a52167fc379ab164c4a03986edba638abf1f8817c1cb89f297387f2d5938e707aaa53eee6bbd6a9a7fe8b70a31373e675f443c902dc1d0dfcdfe4b3ea83cd575bffb04071220f1094b9a3e7cd04fabd70c0b8761231abebd3f4eda11f74f83d77a1a44e28432d05da33998419e5cafba0e81960963209379a51fa9c5c27649ec89f8a528ef0a885f055edf3f66ab1d4baf07a405b87678ed6d170ab890ded0e8ee90ca1ec0e9f6e5ac247e01009d6eb7101da6eded84339ca191bd6194e3b6bd8b094da788c1ae068d8ce7322fc7e22189e6cea7655b1ae690da05a0aae46466800ddd6f26",
+          "padding" : "300f300d06096086480165030402010500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 156,
+          "comment" : "repeat element in sequence",
+          "msg" : "54657374",
+          "sig" : "9300a86600b600330a19b750ceedca9da6c96a99bbf65ab7dda6a5924d22a5fc9a2162e3375172fb38f62aa52a9fec71af1007ebdc5ce29b02163d9c55ead2141959eaea28f13c482be046d676770e02b71268d54d52839ddd929117e4857c9a6a17f92915d0acfef9bca2c40819ef58130eec1bd60359bb8f47ce67f0663086caf2281136b6076b20310203a9ac1b293c511a53e10ff880ffcb7184be60fad58586bc9a11fb51d7dcff71b401e42c1c7e92cacae3c50b62dfbea390c285c5feea91c288fb845401417fb01a09b3b6f0a1621df5c172632d40fb2936a7c2b62e989b848a06c098e69a333759d9ba2d270853f65daee1f7a81bdaf64af2347517",
+          "padding" : "3053300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 157,
+          "comment" : "removing oid",
+          "msg" : "54657374",
+          "sig" : "1d35c1575269b1ca4e071f2fa19ae31388f4cfbc7875449b2027984d2b363bb2c77c80819725e03ce9f3db97cf939b07895c55b93cfbb204a3b036dcb69470e9e99a5584195ac3dd24214758a82f354338e50c69f3a5de6cc0920b845550fcf104b397ab4b4add6659efd34f64b9b673e73662ef5fced6e7737147e41b48e36410eece6db65f5803b16d33c25cde6bcaeda8930e7635656d9174d179c74f5df33b08d5b90e866624180f0a03fc6a94a8c40731658a5d90a071c6f77e460c6ae1e6d6350869db442219bf3730cdf3e74ee102d6579fab4892e8e410f06bd4cc19d776c47ffe667071fa437c80452950df7e12d909e0d2f7494a8500e1bba86435",
+          "padding" : "3026300205000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 158,
+          "comment" : "lonely oid tag",
+          "msg" : "54657374",
+          "sig" : "5cf9db664d1baa241293db08ee7c8d4cb7cfd374d9c4e0a4fe3c81fee279be9f0452e6545a01ad3adace3d0843ccc26826d446c9bbcde6dfce30fcdcdfcae415b6771cce7f1d7505c07969a8abafb200828aff641d0c07cdc4a9621c6d0ac607f950ee0652c138b4b48f724a632c8345b2919abc24fce3d815f82b99026f258a6d2cae1fb767a3d20591aab866640b4fe821e010e19db0d696a513db246ba42603b302c64f17c0296414dbc14a41726254d333f1dfcf29f55fe22a576eb6bdc65c7d0204d22001e858abb48069f65f7c1d8e8e84365429c01c048d4319765de14c48e68a4f7c898598597677b294d71fa2b5278a0a9eb52bb627c118a5bf2163",
+          "padding" : "302730030605000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 159,
+          "comment" : "appending 0's to oid",
+          "msg" : "54657374",
+          "sig" : "a15fd53bf93274aba318e4f37dfabd414a47c27631f0c779bc8cc1223621730380817ccf1147a18b778481c64c48edad0815988e6942199d0b0599a1e33636f7e83e6addd65d87e53d734357b5d2111231cafd3a4e40845073ae50d4506f37d671b184246ce15a77f36f554607f016e7f7806e5099cb2a69ab4127c893f28cd8fb8989863e787151cdbdfc9e0be0b3235b1057a39e656ea482aae6d7c3aa08bd06fd38bc0f9b21240233624ba5c767b5f3f48c7fe365ea1552c5a9e64934869974ed2555ae81f9d5cd20f48579f238de1e150fdac4b321a05938638b81f0b7292a61e12528b077949f7ab3e6f8e1f78be81da0602fb30b47f569f7290cef3366",
+          "padding" : "3033300f060b608648016503040201000005000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 160,
+          "comment" : "prepending 0's to oid",
+          "msg" : "54657374",
+          "sig" : "8db939e248a2140b770acfdbe16ea6153d968ef51c56b024dd1ec56cd600ad79172a14f6253d0a9bdffe9ad10b6ebf57eab8528474fa96a06c9284e5fe08c48dad5520730cd182dcf1bac660ce3411c7cb68686b3b91c5a55b8627130f0e31cf340298117b3a0b358a42e9deaba700f8d2dbc934236cf81c0c4d15017602e82545e1eaf9d31e4e8ee51d35054f3b05b7a7cd121854a0661ca19706ae95cdb0582cde723e389d58579d02c679f8d287a2d0ea51f442df0641682458ac6590b3df77230273eb779ae4b827c09075c7163b993eae72ec0596c2adafc8e20201e21eda1f4a13c27dd9ca7b3bdae47707b362912979357aa587ea2d86c9c2c2587ac7",
+          "padding" : "3033300f060b000060864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 161,
+          "comment" : "appending unused 0's to oid",
+          "msg" : "54657374",
+          "sig" : "0c985f857ac4219bbf98f767f42c7e0ba886889a0a7612a3e7d7c8bad581250aa7ec8a71567490d0c509a6b927b8ad714107e7248ecd5f1ead25828707072c87913e7cb765fce62d175c4335d09d764bc5322648e53a73eea7f55371a9a73a5283500e0d1bea254d217fcccf917d5e0f28b987e9a16d11361dde37d699edc524714122333d897279eefd79274c095c2d6c9683673318e7f3536296c6be23837d69e7222683004d7e52b017e61a27c5ff3c8bd4ccd8622a52de0d24baaff3c43116e4f043ab30cf8549dcccab4905f458ab7761792e7655c6a66eba7668e4b731c62ecfabefbc31a1cc8b3e8f1a69cdf9c8f7825ef266d9c7e34710f6af936670",
+          "padding" : "3033300f0609608648016503040201000005000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 162,
+          "comment" : "appending null value to oid",
+          "msg" : "54657374",
+          "sig" : "9957846928b38e0fb520a2786df5307373a096bdee5c5605500791321564ab48283a682cac388bebab9212a6429f9e03519f4f830719df9b313d62f2c46b78eb936b3ad13f3e6ce3429181678359ef6392e68bab0aaaf925721c6f991d989fe1a6edac5be9faad908b0ffb9b0b0b5e32cb6080bc9007a5da47fee8e343803bcccd4352f284df0e418bf6c8317b6ffcd7b4d9e82a911d654f0344b28f39f55ba9f1955d7976ca153059d5de7bad54e21d49bcddf8051a53e4ae496759504eda1ea3ca3bca7f6d47821440850bf44b2ac43d4afc1620b150b77f288af03b41c4d32977f726a91c80cb5c37177bddcd5fc5e206c4284537d8eb740f3285ef1a62de",
+          "padding" : "3033300f060b608648016503040201050005000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 163,
+          "comment" : "truncated length of oid",
+          "msg" : "54657374",
+          "sig" : "2d99760b2853ce20a37f51045006ed11d83b250d54da4122e200179a564a296292479116406d69b858cf15b8575bfe9df9832e484ca8fe4f0a24bf62aa350194ed642c68bb074e70790d7e18209b23dbdef6756f037a3391e6bf841f7b6dc763547565fee7e9416e62504df61cbc00cc2ba5907261e4e39bf9337e7a15594732f08ce136f37752a585e286c001424351f30a9bd585e3c2e2d99a6c91f3ff3081194b24f6bed3864b36b14d1ff3a05b584e06a994df9dceda839ac788d08d608009681db0aa23931d8f4a3aa1b1f93b6851a7899723e858eedeae4d25394bb7954bdffb975a3a1e4d46339a0e25f8e85958b006cc5f0d5b60c9fad1a829e81342",
+          "padding" : "30283004068105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 164,
+          "comment" : "Replacing oid with NULL",
+          "msg" : "54657374",
+          "sig" : "3e0270e701eebc757862ec646322ab99511bd27d1351bbc3ab0584e218dbed9952a9074ebb7c5fb8f846a0f5d90dc1040e2c45914c86ae0b722f1fb95f7621b986136d7656a2a4300df494c0235166e51e3c9e9fb98bfb4604d4838adecd5c55300332ae0e141eebb328524f1fd95adfcb9ff7fabd203e89775f94a2e84ecc5efc0d9626920ca8a13154dd0e97f2527d6d518e6d460299cca0db870b0834d5b99e464760c390768e97c091708887244833117afa89baea5c1641b88d45bb9d711bdbd559af73bbc8eb91ef377a0140cd639fb7e8024dd3c48ddad6e37e31ed0a3fbc47a6c28b5fa3df0f38a912a4fa2895c2e25f0cab70bc5e660f725fe22da2",
+          "padding" : "30283004050005000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 165,
+          "comment" : "changing tag value of oid",
+          "msg" : "54657374",
+          "sig" : "a781bb3225276cce1858b9f9316f6dc40abdabda8119931faddc5a871b5ae9c7c68fb1151d9cf477a66e4a13a6c3f114087bbbf219beb524e308a91fa88411d450053605f9f00bf28a146c10b825ac3205174ec57675035c8cc2c9f411fa1df596d1e33a7da0afce271c6b456c665c430cb619c971d60754afcbab103ca02aae079b3803492109ce37c800051ead6d47a4e0c30b8cc147c66d5eac20399249af4082e70c7d5556d2b0d46508e2e1fb805b6ded365c2f0d20f33315a8d49f62896ade6e0ac9187e186a73e5146cf8da9821c2e5fc5ad4ff0b28347322c09da2dbb196120762093ce33fdb53d8a9579c13fef218a62a834d5fabf53e1ca8a751b6",
+          "padding" : "3031300d040960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 166,
+          "comment" : "changing tag value of oid",
+          "msg" : "54657374",
+          "sig" : "5032da548bf0168a4b3b3f99c144e3e13ce14b7d539e397f37847ffa8db34a0dfc0d73d30e6e3f2a23f0ac92bc5643af1adaddf9dea73c688ea98364c1e610835b62f1ea602589fd44a8a2cc73b00cebc75c212228b508634137c1eed7a942c18bc6ed4bd0ffd39961f54bd4455155c08a304c2e05d78950e42e92275b2f02df29ec2b2523bf97511a0ea3126c1012ce9683e175a45f7ee24a721707b7b7534ba8441633faf9953cf120dd6a13c8d88cce5e0b374ad2a3366f1e96f823128bfe6b830345e94d611e1d923620a57db4ae51e5d17b5d8a0eb4acea8377cac9b35553b7464e40190f40cfabef9bfd393d0f87e6e5bb08775d9d4768e8f2f0cc4a24",
+          "padding" : "3031300d050960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 167,
+          "comment" : "changing tag value of oid",
+          "msg" : "54657374",
+          "sig" : "489a6107f0052ef49f97222aa666c8025f2a30eb4bda5f47c888d256dc742094b2b03aea0b087d3f27e6df02fda958780626512441910fb83a7e4412a3aaac388933798922f6a4dbd48b851680d1f3f84e39fd30716921f99b87945001d26955ad33ff1047b5771869a6f1519906e461a7a50d8fd08d67a9f9fc272699e7cbc30a12aa8601fbab4884878a371b3c1b00054e9e585df1e2a084ff3f6a3be5f3e32cc6295939c1cdcd9b3aba7e58ec73dedf0caf5d3f5618c6909435823140b29635ccc13f658f1339fb2a3b21e1919be181c15edaf1cb6feb142464e6eb4dd18b9633f55fcf370b6c0643d6710b875df63a6220ce340a97987e577aad0fab4eeb",
+          "padding" : "3031300d070960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 168,
+          "comment" : "changing tag value of oid",
+          "msg" : "54657374",
+          "sig" : "41858f3edb8f7fde81575c399fd90c01162e6017d0c03b5c68167fcb668790d054b40d4d2438daa0411034ddbea901ab1924248185dfee64d5944486530fb407cf967d171110ba8acf00d1dfcc6c7a330f5f828fea17a9168e083f8e118857d29baa32351dd284a2efa0672ccc3d0e917818663cdda0e5dac638ae150c308b8737a50cc9f17a595800ae925930319cfbff91c02535d3d35d3256591094a38b3dd10af4f51c2eaee0f8bce27aff7819e22a2191019e419f4e45fba1272d104e0c278654ff6a21b9506ea4317832e7767f46d97c64e0041c767ac1ef88f3ded74fca09bcba82b519fa7716a9f7c4a2b78931f6805b4f914f6e6bd0a3adbde2a88f",
+          "padding" : "3031300d080960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 169,
+          "comment" : "changing tag value of oid",
+          "msg" : "54657374",
+          "sig" : "b1771079fca7ad8ba3698a9cdf7bb5309d55ec40500fc83424f1469c9fb77ed08082b5ad1e66890b51465763d1deeadecfaf9c8efaabadae7f7fec17589271ac920cfd1cb32135fca21ead942ba15f09a38414a796f67a5cb29f877caa6ff8e1c71755fedc58485dd9d4d62455c7a8b2ca2d1906e8045e60f681c39a0a162dfd63a9fdab5954352515a926324dfe252aa1a1e576b4dab1588b08344aa40f406f6352317055a8feb9292b9611c90d417b0bd42fa7e4a4b82c63885423283ae4b2467fba84c34c391339a5a3154d70d9543401cd260e9db236b1f96e705fd9704fe557a53397ff99d74d9d97847247e15ed410aecc0f74bd7bdebded30e34d3412",
+          "padding" : "3031300dff0960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 170,
+          "comment" : "dropping value of oid",
+          "msg" : "54657374",
+          "sig" : "9464a738ad70b16f8621a806e95d4d2cb1866383dd6c0d61ee85bda1ac8b56c3833373257daff4d360b1c366c10938929a8ca0819ff929311346501c67aac447500b2fe5b812d7cbf93db5e5631cbff3c498461fb446eb0f25c881043b2339b13c373012d7546b9b194d45b9aff2283d7074f6119420bb6442af9116236b91ef37f5abca8aa9eab2b0ebd44d3bd302ab51a67e1d9433dedeb1bca87edce75d02ef149dc5784e1772c9ce846c17e4f7ccebbc908c46cd062e0e4bca76a033125a407919f7862a6ecef7f6bdc279fe65ab938be35858c98956c95c396b15d2a17c1c2ac996b5bf0fc345321fff7dfc44fa4b0b858db0f556de1d477a85a19f1856",
+          "padding" : "30283004060005000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 171,
+          "comment" : "using composition for oid",
+          "msg" : "54657374",
+          "sig" : "06d0a8d9247e6e39a8e09e7f8db128c23225d88e831068cb3187a6cf657d709710c129f688c3b1560448986e1f9e83a56e9053e7e7ec86f61c597d3713ba8326f7ac0098fb51a49ee64e306c249a09533f464a59f2e5ebb3fc85da8be6a60ad076e8091774cdce2742d5f9112d8089fa8e3071283e2bb7b6869f3c44d6dd9803ce6e467bcc8122d1e96832d05033f7ccdbd6bbd0666bbcf41ee1aa077454d0e136b725e7fe0057b2e5bca0d9a645cb50a67ea0b98e7c0c60a91c5b5098638a3027bba417ddf5ef968ab5d1695fe3c2b1fcc664624a783cb5ed2c6261e0627a26f351d8d2eb055098a2b8540791c2e763ef27086b1f7cee54837514790defed29",
+          "padding" : "30353011260d0601600608864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 172,
+          "comment" : "modify first byte of oid",
+          "msg" : "54657374",
+          "sig" : "b06563b316ee2d9a41adc5a99748b373538f15a44c3c9227e46ec05f99bcb14f4316110b1d1a82709dfa57e6a81dff1f3f692d27a96ca51f44e7b9fac9d2d87eebadab0a2d4b8d90427af8797ec5819dd451787ea741023f2e208ebe8542dd95f4b24cd86937bba642ce66851a782588fb2bb9e2d8fc9cbcd20b79f758537799740fde8e1a8ac4888abc363feb341758160f0d21498eb754e5189fc556448621a4dc095a47ba5b2759315beb9430ccab5deaee086cc87ade1cb243a8f4d9c63bc80f200dfdbfba9624e6084046e05dbbbb836ef5e4b0a06a8a26578faf21eb155cf0adca6b72817dac6c3c992a80c708137422b015196169bed668cbe78a9792",
+          "padding" : "3031300d060962864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 173,
+          "comment" : "modify last byte of oid",
+          "msg" : "54657374",
+          "sig" : "8848be6a99395116fcb45143dabbf7f8a95b800c269af5a986430190d9834502a37839afb083b66a96713159ec17e66cdee5e4110d0f9c9c17697f38af177b93b17c0fead88ff2dc53a0b5c502f96c4f3d402c623dd81408b06426bf6ff7d602ccc8eb21db91c6c0d614d108703ed32026de99e1a5c411edd7c6a66976faa57cf022a34111d791f0e469080c7eeb84999e0e9040def04df707fcc937095993f1a8bfa889c45127feb9de274bbf08a805d32f4830b4c5078b65a9340bcb9b74b9368c02af63d2b3481da5f57eda94ac2e5255d3b72bd1a19e45edcab46a119736d7e2508111a0838d1e6fd5bba4eb67ef697976f3cce044d29c6d8d76c2d92e1d",
+          "padding" : "3031300d060960864801650304028105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 174,
+          "comment" : "truncate oid",
+          "msg" : "54657374",
+          "sig" : "0baac664f223ae40e336ad610b804b5997397b46a4a2905de1287481aa43a5bf059271b6a3ec648faec7345823aacf1bcbf09189b9dd349bfdaa979df8fa78fb199fb7c69fe824f83f83d566ff49e2ea28c704de66f187e3a42e90663423bdd0c8b67dad4e92cbba14a1ccc1810a43d116347ee7ec21ff9a8324a4c110e661092426769a443627ddaf25ea4d144427993a2e82e0b15f20936dfc2405da8ab5a6232b9552f175331e220337f22008033910dde7bdfe87b2f7f3b4847e665da5e03dbdb866b05d92c5ba490bf5a75903aaff4f657bf734d284081f52d81e6bfb040dfd6811bae2b73831ca3709b6044134200c700f2946f234f946a69886be2bb3",
+          "padding" : "3030300c0608608648016503040205000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 175,
+          "comment" : "truncate oid",
+          "msg" : "54657374",
+          "sig" : "2394109f99286c6d9cf82b46d1015a086f826e3725998819ef5e1d99e504df76a7dca903360567cc58d6bc327e90d7555d646f42f7c452777071b3e6be8ef1a97c0b33fa50709806d83fb3b8acf656067050708ee080af5a85aa2ca3f871324759d06d9a019b8314c66c15cb0c314d807026515d46e2163a19e89a7808af30a71acea51f92dc5e39d237eabdcfd46abe7cb8af5a47bd352cd5b1d0dda6fbc6fa5dd19b3051ad13ebe75462080bb3b7f23b013085e6f6010819494b5b303c279c2cafd1595831daa558624ef42a46a4621b6374cdb2113ec5d8e8a3661e19814b60b5394d9305c7d02073a7d930ba9bd912cf72efac5feabb8e69f34b74ef7775",
+          "padding" : "3030300c0608864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 176,
+          "comment" : "wrong oid",
+          "msg" : "54657374",
+          "sig" : "3d0632482138f5b9525dc60a459624d40d8c0187264cf1e076d7490295c59aedb5cf68fdf0d7668a94d3d585cee39ca6a05c0a2817b2f5ddb0ab52385dac4e1845378a113d43b936739b21335261aa4b96727ba086c75f88f600b4375d7cf796e62bbcd8d8d59f18fad4972c3638367de39d36f3e1ec4672fbac6e33246263feb65f2a014163ff1329fa3b7a97ac1b07d71059d23f631ed4798b05dae25204c0e4b29101e2828b972c63d11de274781e8882ec8ac5e1f5284dad188de1bf62ad234d56ade827eaf9c7378447da3791e4b49fd2559f8e37002171152d530da5b13342e3a9c7f45552c9208e83205271a767ff3862b5090db5971fc0cc8ee08a17",
+          "padding" : "3032300e060a3262306530333032316105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 177,
+          "comment" : "wrong oid",
+          "msg" : "54657374",
+          "sig" : "3ae4a98262c515ec4610a836597409747dc21f91ec5380cd949925205cfe42026f6603b73c1d38ca6580a67b7ee11c4bd85bd2b610c7fd2809bc63b23b98b151c0c9298793fb5e13dae893713adc8761d6e98389d918853dd2b7799e32eb3bf9d97f1805bb0d59efa7978f5bb7d3432797c851c4cf4fe6a3c54cadafdc770ccc012c0e80750e339007747a7711b0f2229fcdf3c53b48cabbdd61ae6de1bb7a50b03052ceb1cfab6e80931fcb5d8faa4b37ee3f7875298d64b7f55cc766a11ada020a6a198f92c2077418b0eccb4f432e35b31952a53213b0f3dace6349c6d96d3061d9168635864ca3b95b480a179cf90d1bdb318147813b9cc4d61caf80b963",
+          "padding" : "303a3016061236303836343830313635303330343032303105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 178,
+          "comment" : "longer oid",
+          "msg" : "54657374",
+          "sig" : "4a5ca8f9c21990190bcd35e09815b509521a9c421f2eed985c90bc6e5177d6bd452f89f3f035911d23b01de756b4a65cdf8170e5f809cc0d2973bba249e6bd495e334aef2bc8951d46b55dd669a360a9cf1601f088049ea40ee30bd37eb513d0e06c6b01840bb3220d2d427670faeffdbf5e69c4647abeb29e7dfe6fdcbe78794685fd538df7dc32f08307a5460523578011e05db78a3468cd022b1b164dace85bf2b0dd26c1947a98f519efd8dc86cd8308abedec30ec2a25c293b7fa9bdb0430c99717e6cde1249fbe44252299257a3e4a51dba86961707b3f62281da804929698cf04e471b9fc0cf36b7472c66e74f3632a74c8b1d70e0f4492671a38b9c0",
+          "padding" : "303c30180614363038363438303136353033303430323031303105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 179,
+          "comment" : "oid with modified node",
+          "msg" : "54657374",
+          "sig" : "5a75946d283b9a97c0a8f3329869bcb0bf69944e594935238b02ed32586f0f4485fe5c2fb3d7aa03843d8b34468e8d268d1a089362e96b0fb2ed670fa7d971abb3e34172262406269d94149603d7a728d32161e1cb3b77d932e6857047836e2d13f9e51b6938c14f450aa30868cb966eba324e72026562fd0a90d2709796ea089a5ed72703ca1a86606f299ab1b150166b4fcbfbaa97ea2102608a67bf9a282adb96dc1880a93020ba83d03d5388851e35c43b505fe563b087606bf6502e0e7d046d960d0e3881ab5a1b76a23df3b0816e314bbc66f216a76bf123e2631affd3bce91160a39dd39523cf06f9f62fa6f22cf39aaf5efe7fb38742291cc1bc732b",
+          "padding" : "303a3016061236303836343830313635303330343032313105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 180,
+          "comment" : "oid with modified node",
+          "msg" : "54657374",
+          "sig" : "7d93fbf46c22edd6296dee68a2e0ba67ea48c05e2cfdb5c08f5a6d2651e8c8fb40ef9056194a8e7e2d04274e93a5c166b1bbafc90aff1ce5b753169329a98a29f7a6ae12a55fc5f06cd11dab0d3fde97393b6d6606145075e16e6c1afdd826814e2a185fa88fa5798a185a78deed1c5ec8e5d5f02fb9e0c2e27d2fc809a615bd3e0c665a750d52227cfcb23732ebe646c1f16ec295bd6806e9e68cb34292413c7d41adaca17ffed4439f2bc50570a2de3e95be3cd20eaee46d5f93fe933961ddbf57a92958e2c7386e1547ed00ac9da5b3a5a263c68c145144dd653d80ecc4af81aae1f5f7052d24dab5ed098e2e42aadca0f4e23d34b77225d01ad0a3d466a3",
+          "padding" : "3042301e061a363038363438303136353033303430323838383038303830303105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 181,
+          "comment" : "large integer in oid",
+          "msg" : "54657374",
+          "sig" : "1a7f1394c001ca2901a0ac44d334cf48e7254f1ea5acf2833cf9f9e409a0194f6d196f915e885b1b15458f42089f44f2e26b9c6ece6f770947519485c8dcc31b4ab910ee6b83b8f906685e38b23c9e250495d5b754f6ca845d1860d5a4f6906c50d05f09dac23956ac2684909017454901681b50c3a55a990643e7df7b940ef27b901755b14730e5f534789127be7c15e0fc68d7f043ced9d515d3ba592f62c59272db977b31b509ba6f738a7b8484c3eb8878f178b18c56675dc349e72c5a29bea0ed00aa2705d3699ccd90cc285f430212693a04e02b510607681e70f1f9aa206120d085964278e6c108b5699d73c2d56273021107b7b9d71a339d466911b2",
+          "padding" : "304c3028062436303836343830313635303330343032383238303830383038303830383038303830303105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 182,
+          "comment" : "oid with invalid node",
+          "msg" : "54657374",
+          "sig" : "5848e40bd96dfab48d5885e90ea3eb2e89209577cc36cead08328313a65b75436e88d4a8aa5be55667544ae77193e0813ecb6469b8d6bd028e3b5a3821bad3816921c6ad27271812ac6bef72292debbfd64f123d7799fd36e4d27ce557df21e06cee4a5198eb22d70e0ab86f4490a382a790ce341a50a006573f5be9c1c067b42d9998e867fb1c03ff54ca1d3688e887ef2b445ca69c0d79053b9de5580dab688eee42e65f1aaaf89cc2003e9402f7afc21350c912c70a7585ec76bd6fb302a9d5d211723c123a4cd64cb7fca0cb877b235c0fb362cd092760581e065ebee1a18e0109f22cf6b7bc7ef728c092f871dca0d21fe54e2778b836869ffcc804cc98",
+          "padding" : "303d3019061536303836343830313635303330343032303165303305000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 183,
+          "comment" : "oid with invalid node",
+          "msg" : "54657374",
+          "sig" : "a38dcc4e8070333703ce26a8b1eaa28d242bd5ff4854fad67959caae66db5e6654aaabf81eaf31441b8c5e7419a3ea5b04efdea91fd1910b5e5c6f02ff77b7cf42b2efc55b03407363069b8dd031c56d6d0ac54838760d7ecf9f3dc03828b27a73b827f394700558f160c196503855c255332efea838098e637cd1c7eea9e687fc552b5422a62f6c6b49fb16ad56509dca5a9148ed9883f1d76453f8d607d9fdb7589f4b07eecdecca950e58ccfb9e7784db9592b6406691a413caef5e994ca06f21fe61f0986644be041878429d721e403ba6ad8dd8629eb78cf4fcac5cc42ec03d51ab64c051cba22b5cd4b160aaef28646b5776a19605cbed694e0d6310c5",
+          "padding" : "3032300e060a6080864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 184,
+          "comment" : "appending 0's to null",
+          "msg" : "54657374",
+          "sig" : "202c2fa04697b4c4f5b9889e67c90e597c403fc7b97bf43f3b7fd9bf648bc13db56f02aa517cc5b8b79ff90529528304c877a081a634de4007cafd341cdc19152f5d117a422b5e2df3f4368f0aeaeba2e242823422e3a3e896474edbc636b491baf44e032d5f671f45f599761530b18efa0300d56f0f141b22f0ba9a8187dc771b1575ddac950948cbc7d043c1686e4ae22d093ce4650a99d88752a2748285e935d46ea3a69e84338e1afd57fadc2fabc1dded35706759af7ff32b9f75664f50ffe23700dc46eadece6c5ce271208326f9342e7a63c852463a156edfca011df3a1889ce94fe8be66b125c80540de3aade0dc8bc1baa3f33a892cdd6099560562",
+          "padding" : "3033300f0609608648016503040201050200000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 185,
+          "comment" : "appending null value to null",
+          "msg" : "54657374",
+          "sig" : "49a336a5a98444fb1617e4dbbec502ca47a888aa84ca700c5909da12a4ae44f8831d2e42fe711c5909533885837ef60be1f37acc7a9a2023d63f0f5252473568aca337f672983058c35df36c4880b17ad15b5e2c1b289ca30e9af9566b5844a30685d59430f4f399188a22fbdd9a892415a7c169cedb52ff274b5eeb25a0f1f33e327a077a98342ace7227710a3db891f579315cf772dfaa142612f5bdb612fc31d940cbe338e6fbdee76ee31fb6471215f176d2f3c884bdb5f55444adf0fa6ad4015b25f494fbdb5a2bd7622b2b9f77b84c7e37e5df8ee553db37cd07e1f0c8003184e3f6404efe27341f41ee9c44f5acb09606ea686fd79108c9d6970ff80a",
+          "padding" : "3033300f0609608648016503040201050205000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 186,
+          "comment" : "truncated length of null",
+          "msg" : "54657374",
+          "sig" : "ae3857a0e8604a5e8bf4e70aa110a9973da8d78853525b265e9189e7a495ddd200c9773c2b733a50f2e748224966ea27c2b87d9d15355a9b65ad02cd04539cf92f257030ba50e63269c5586a6103ca8abbc3c30fa9d232737d42af86a598ce4c8c591c70c3af322a29397a17c7dea43fb7354f8bad1c14e63b9e84909dec485e17e4331921d091bfe604d5aaf14b014ccec2ef23ba477cd8cda620d1c44f5d9c2e67f96f0a9920ea866cba0661f75a687e4d08e731a6e7bc52a79e08210bb03a33ff72e2b791c3baaf760dab4abe08c8d2f6775b03a3e7024cad124b5bc77312777bf24633683cfd033b459ca0115503a886c76e0af975f93a553616f3636154",
+          "padding" : "3031300d060960864801650304020105810420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 187,
+          "comment" : "changing tag value of null",
+          "msg" : "54657374",
+          "sig" : "b9965f3c8202794e341e140f1801c29966c67c758f01caf07c0433821f803f6f3bc932043a5c42d0d1a90c9687908c428c3bdce32b2756652862c647c4884af0ee00d55bddb5a56fb9c06ba0e29a3c4b61febe6eb09df43c607f8138d7d0ad2fd49398e69d6baf9764cae101a6933c430a9b45f981769257fe3e342f8835ae8a1129787069dc008dd40eb039cb0e8e1ce0965a98959b7e69001437567d0f336666cb6c8e5826b12bd5f195a18833428dbbcb1733642d129be808159eee346dae44e3f5468859c34af260d2bae45b92e04ec1b5ddaf950b774333c4b433c797ae1ad53f4d5d4508805d663920c2d9b78517dade0d3eb6fc17bfe08d0b2e314c97",
+          "padding" : "3031300d060960864801650304020103000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 188,
+          "comment" : "changing tag value of null",
+          "msg" : "54657374",
+          "sig" : "4421d6cdcacef33e31663941531d1253765b01cecc92c741fd5a4c254f088b0d95a478f2ac913f408862b107f82c09c11867e3f27e34a0c1ea72010224c199a942383f4f6205884751091c9f4b190fceb7eff09110fa0a1546a857b091b930326a1f774a0185332a57185df89196ad4f56a0f8394fd6a49a635ebde48bc8ff23c925f846100ada2c3bd40f7d1a92fc31c1327af4d40933de0ab0c4a94d0d47c4d53e956716ec96cffdf0669e81bfe9552df8dd72a687f670896d7279b4ea5c9bfc26e93cbe50449776ce78753738cc9de7ab7aa02130efda3599ca0377346ab3b71bc31d56a8eab581ed70967e9e05463e19ff372130c5a1d9c2217f0f5a3f58",
+          "padding" : "3031300d060960864801650304020104000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 189,
+          "comment" : "changing tag value of null",
+          "msg" : "54657374",
+          "sig" : "a71e400721490c8e2baae3b0c49e3c3af9bfb341db3626cb22d2137c5989081402e440cc7e0445a447e5371920a9637ea696a482c0ecbd8eb93a16ab1ba991359e5bea0f6ce0c0ecf927bf8dbb543e307dc17840a0ecc17eeb23caae349e1f12f95abe10fb85695da43e8688855bbbfa842b4a73543fa61ea8076ca3a63505430e7723b39f4859e1cee10e558f2e54a671ee2f040f1eac7d5464bb8482dae2690bed114a6e56f4816e7413ad6ad05cc803446f65c5bdb596a6eb63491709789ddefdb51d461abc777a6a0306dd8a83a6a7792c42559fbf426fa881e55d45a4d346b302efba670443570bda58b9963abec39e6e49d2a17ce572c16446564ae339",
+          "padding" : "3031300d060960864801650304020106000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 190,
+          "comment" : "changing tag value of null",
+          "msg" : "54657374",
+          "sig" : "0bfda5d7880717ef40cce0a8437efa8404ac1ead0472a7d4cf54934f8f3432db4db9ed4c8d98cb606229902b383112dfd4fbef54a28e7cac91338b1f591e2de4addc08943596058132b3a75442f44ad4d18b663b1c1be67c00aaab52e92d87759dbd89b386666dbb4b67429267d25c1ec12ce5cf03e4438dedcdd591c442459eeb86d6e74a937bd7c470ef90dcf8cfd497911413c4a817e7dbf826858807059f8426710ac582ca9d7c657d22a07289fc6c1bb37bcbe27ac755dfc50a54232c16eadf3b1694827ce435aca9061d21699029edbcbe05524d6bb35a866c78122f06f45b8a3615ff38c9bad24b9127287e5c46b73b7435a7bec837c4336f61e9fd01",
+          "padding" : "3031300d060960864801650304020107000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 191,
+          "comment" : "changing tag value of null",
+          "msg" : "54657374",
+          "sig" : "05f2928db82cd2f734f233d59897fe873f57714e5f5abf5132b33d924038a9d0616b62aa25b9353e69dfa17528945043da1d38c96bb6161a34c2529bb32d83fad6b65c0d186105afd1f27f92626860ecf18c7c865a02c3bc16a89c38fa9449d6e23cd389b6083e245b894c52507d07adc123c131998e8dd768b72c08a94bb709ba773d0216c9ffaeff15755ce005b8dfb03d1edbe75780cf3c493767d00b679facf4b188394e3218118d39bac152516dc36c4cc5f88ea9066bf3252670a5714fd5021688ac6b94491012666f0a41463ab265ed62939320a7e3c91298c82ab31f84a3afc62fef61ccb03c011c0317a93728b896f6f8da1ff4e6a04df5cdc14097",
+          "padding" : "3031300d0609608648016503040201ff000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 192,
+          "comment" : "composed null",
+          "msg" : "54657374",
+          "sig" : "1b02fa06a93da1fe5b74c877eba5629fa9469b01e9919016717eb8cd627f05fcbedcbe2fee00cbf2c954fa7f9d6f001312026b96209fe551b736a4c25e9203be7a706ffde8df35dc7db4add2ae9aa3ce76bc055b5fcdb057139d521fd94a241b2571fd8b73d7e07502819291b226f560b01c0aee7210bca486f623b3f7f84b098bc7bfe9a1a46ff2b6d114373ef988cbcf8d87b3eb7b8374b13b85650b9b894183e589d1ae1646c144a3e6054f7387c548632870f14842683830ba1ab80789e3f8b3e65cf86684ef73cef5dada6a93b6dde8b836ffbb79703b39c3e7179055ebe2071d19a49a8b85af694d9d3cdc0a054073a579e054c76c74d851cc08a95a2c",
+          "padding" : "3037301306096086480165030402012580aa00bb0000000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 193,
+          "comment" : "lonely digest tag",
+          "msg" : "54657374",
+          "sig" : "abddf6c8fceec1026b0fe6799db56b01e0b2eb066f9e5d0821f6a954462b71e1d22ea111f1b69bb86c1e4e77b6cf035573b9f6e0894ca4bc0990f9986ca209ee41bae1a48a764c5c464ca4e5de36c8fbc47dd8865775f9771ad6c6bb82f6b2802bd045c1f2d4a1845798b7dc16ff37866c90a613f1d019e53602fe2c99ec4650360ab69eccefaef07f9156f58a1f5f65fa00bcc2a544feceb70adc74e6710ea01e9ef4829a8165d7ce24647e6a8770eb8247bfa87de15ac560b6dcddcd112c24bf9c694090060bd9f0b5e50a59ff65c135f0bcc527c8793f4c84769b7461e9e2d755f99aa13b4c938f8fb7816e9d9f7f91159779b9d7749489b549aa263d8d92",
+          "padding" : "3010300d0609608648016503040201050004",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 194,
+          "comment" : "appending 0's to digest",
+          "msg" : "54657374",
+          "sig" : "35446aacce869a91a157aefc5e3d4660a7de0272debbee1ff6253f74e38e8d54637cbba4412c0c211589a477eefd3dd0106cd878c46870cebba6e053a990f3341647736b00b5691d6b83dccb6684ee35063e2da6a6b1e8daeb5739d96291522d7c9fa54aa7d9208b1d73828c9a0f657ff39ebd09c709a8913b04a83c7b610fba815c222db8a2f00b089768cb4ae9ef93441c1463a43a6a691b407b4c1266e0ad4e146b0f8d06ccff215d48b513528f7cdb53a3be1be8031a48d092751e195b09a65b26d63795020c2a887eb4af5f002944b878962cf87a08c676946290164c667a3817fd8ad48e508d4a1e4811ff85b5844ce0af7937eb48fb99e8cf7e154c4e",
+          "padding" : "3033300d060960864801650304020105000422532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250000",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 195,
+          "comment" : "prepending 0's to digest",
+          "msg" : "54657374",
+          "sig" : "b0fec4f0f9b06a684c9816bc221f888860c1e5ceb40e67bd440bfb322c6026120b28af4905183d0ada4043b4f4a0df4710b20f37cc5ac9c5ad391e379f12784135cbab2cd7e3770fe1bc68fbf5e0e07c4fa07a5597d5f5c3f682e57cbf047cc5d8de859e3e7f997fa91c4a16026f43bac22a7afebcf56c804f656ad510dd03e6c4cff8be628a9a3fcce0034105152ebdb148100203f17eb37b7165b03661e5526f4fe1bcefea270e74a2bd9afc7fc00e52c9256548f36db3486b7cdf6fa9bea4d558d592fc6ed7869b8a59ce26608d21328a0e5001c273c8d29e3350c9d69d3b4a57d5574f1b18686c66598ac6de82d50af4589d53f1c5fba9e103ec787283d3",
+          "padding" : "3033300d0609608648016503040201050004220000532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 196,
+          "comment" : "appending null value to digest",
+          "msg" : "54657374",
+          "sig" : "b21fb36d1ba5ac09f4bc9c9bb1c3b08ef4b5e39d5a13bb27de6d949022262723fc6f96e1d0f76bf95e1f90eca04fb20bc65262233f6335d8a0b8211f0e2481819607354700ede1ff85c8e53413685ac5d31db4fa5f807aaf6818b9531baf1555db3e062a3e74ad677e9f378bc6020a73673decc9f6176f4c2dcb02859932b7a7a9d12da602b668a14846eb8acd2abfa0952fe5ec78a67a8f6d751ba3b420464c10cdfde93b96847b9bd05504b1ca49121cc92db8f2b7a33fac17535fefe32028d0c1484f1aee86b4260b668d9dfba6cf27a7faf2bbe0df47267108a84bd5cf595f522f9a2ae52e4c4b7c9c08b39200683bd33043f14b562d37b910dd438f714f",
+          "padding" : "3033300d060960864801650304020105000422532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e250500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 197,
+          "comment" : "truncated length of digest",
+          "msg" : "54657374",
+          "sig" : "1d582d82ca0b3db426ca8adf9465e46531e60d71b2cd7276f0d764e629a767e61171e1667a22c1a1404adf7e87b2617268c56e792d9f9653466666a09bc82d4c1c2c04fb9b8fd6c532f169196009598b6efc8feb2850f4ba8adb75d37705fe07bfc2e67356231f1845556ed8f3f8793f4c7e58572fe849ec0148a840e442968c1df6910152a5a4c0be18e3a7891ce2e16e53414366e8d92c1de75073818da1dde1c3c3f8f5c4d31d13da73bb507947e986915cbf3d9edf92a6bd17775eeadd9d5b363adaf1a33ccabd441267a476b314aeb86a91837b5c9a5d969001259fdc5a2b69982ca41405685379e758c255fcf35267dc2f1075ccb57ba0c339dacd7feb",
+          "padding" : "3011300d060960864801650304020105000481",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 198,
+          "comment" : "Replacing digest with NULL",
+          "msg" : "54657374",
+          "sig" : "096a7f2148458f37e9c6589c25e4e90626468575849037e8f62534a01e08dbdb34332da17528bcd83683e1d05a6b159a8a629225e9067f20b0c7484bddf978178107128855f63a29c727d2a49ddfb650954e5c9131b98fd188858b595a2be7196921fa872ac945336a47224a4f572c85469ed34303bb23a5822b1fa87f5b5fa0a4bfbcd9927c32c32c349c0689600ab4f616f31dc19ba9b5e6f45ac64bdc8070863358949e10a46f2af51a071db4de3d7ce5a9b2d76ec66eae8d1e106edccf72d27159a113d888d2f3c73cbb738bd096fad53a7bd3ead255f928b7915b137152bda12b3365a1fb7f9c4f53cef8484b5bd59c5c34c692f6ad20e129651a7cab69",
+          "padding" : "3011300d060960864801650304020105000500",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 199,
+          "comment" : "changing tag value of digest",
+          "msg" : "54657374",
+          "sig" : "5ac9934544425ddb9678fcfd28245b7f5568eb1de108e7d3e99e2d3810ee261b877073d32ae8abce7279f2177d6b11f36234ae2d9d03e4fa51907677a950ca4c644e64399ceed4395b18dd89a152f62a16520ee8ef27867387b3082db40e6462baa7ae6148c9e3e7d069d00431dff74b38556b31f3622b79b3714bfcfb6c662c6e92b3332f7e029debfe21430ea04fbd7cf75e410d1be0712fb5f754a9610f24f34efef2bf4690a589d387001dc652226775fb81b726b3c036fdce3a52ec7131d1fcfbfc2d6bb8434699d9905d9d7992d7977ce0a599309040ff4cffbff2028c9d6ebe7d0f9de0d17876f2da3a497b2a36170618c82e3f169e0ea0708557f1bd",
+          "padding" : "3031300d060960864801650304020105000220532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 200,
+          "comment" : "changing tag value of digest",
+          "msg" : "54657374",
+          "sig" : "13731f7476ca8813b66d36cd6cdb93a48eb42742cca037b828774ff5971c173bd08e88542f2c39f53ae8700a56be54755b64e1e81a00097cad58ad21b2ebc59518ab6bc345db326572bc0b39572590c90b2b72894b33cb2fcc37fbe549405a7fc656dee567df49bcd93fc4d2c235e2d14c2107952de0e635ee93cfcd167d4dc5e3ea1dd0cf79973bc96cfe43a738be7e1304d4c1e318eb32612cf3d6784e1f842b8780dc5e3a8ec369eb8226ffdf9be69b54867f2461c810c74187d72cefec60a646c4a576d8ab977d4daea3422007454a306e5acbf3f7043d5d3bda70752e4979d1657918fbb863d4eb8eb58ba6f2a372636871b75af84e645a7f49e99eb300",
+          "padding" : "3031300d060960864801650304020105000320532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 201,
+          "comment" : "changing tag value of digest",
+          "msg" : "54657374",
+          "sig" : "0cbf884a755f8ea52d3da21e3e88fbcbe2562d35440d1fa0f8c3dbd4f27aabb5603e6d1b172af543c6739c8b644a4f438df55be7ad17a82c69a03d08c628c8fdbb7d1ff9202a7fb7bd7d4f4c400fbcaef8aa463f1e0ec72b1df8834e07cd4f465a97f7129fe9221ed3205043d2ea4597b857088fc27e95da84900e87ce9578d8bcb120b23096b1f143ced492cc966e2ef60ffe9055f5d225cad682c12fff248347f234713970565c532cc2302965bc69af16acaa3ac8b59b9f8698261a1a6074e3a3bc2a6e87dd01f2c0f13a628c134aaf65500681f1a002d921725b362d94c5dacaa8726c0a029749f9ebb699028b48e59d22dac2aa27ffdc35648a57c57f70",
+          "padding" : "3031300d060960864801650304020105000520532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 202,
+          "comment" : "changing tag value of digest",
+          "msg" : "54657374",
+          "sig" : "711f73de0bbe41e3296a1473121f47a735d093a06c9c7be63559987d98f5fc52c6dee6de2a3fa565e9dc6c75308652978350e5dc407560474ddefb45f8bdadc8dc89b5640aa8552117161d8da703b52948b08596b92dfb4d343320aff80af3507d11a27ca6d2db3e2f028cc1d53adde20ae164f602ee146bbadec7a22b36eaf08849e35425a88bc1d6c8f1434a82f31998f980579c287bef989607c0e09977c52932c9d1b1a7437a3c87d09d9ce521c59fc44c51a279d9d3c94c88405ad38c3122e2e993348360490e1698d4ab126b05066fbf764f259c69fbc7d875eb69a78bcdad95e3ff1eef50183791acec694449e6c944bf2bebc01e5f1cc62d60b83966",
+          "padding" : "3031300d060960864801650304020105000620532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 203,
+          "comment" : "changing tag value of digest",
+          "msg" : "54657374",
+          "sig" : "3e85dff099a3f6cef0b15f86f749cfd21c5ca4a6d7ecdfb075a9dfce9e11240599be07f5200431771763469e1d13eedb3914c2d991fc49f32769ceca68e3de4ca53c1fee5f27b54c05ccc69d4cf0ad3ba62202bf7f1c6fd5cfebc7a8ed29e489f6350372f439f606d0b1e879438463b400704ccc2a323acc70ac4f46a621f0dcb49dad6d72cc8f4225dcd9e228f0611e28847745d0f24514506a91ab2a85b4f8f0fd02850c37e2e923ec14c2099ba90b9cf72ced38180d94cbe313215e19dbe46923e2d573115443f3e98bdb96305dac90564c4e667cf3430d174cd077c5533ecbf3f8ba08e7ac56c0b03c4d2dd0caa9d13c968f6a4e968418e42ef4f52aaf77",
+          "padding" : "3031300d06096086480165030402010500ff20532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 204,
+          "comment" : "dropping value of digest",
+          "msg" : "54657374",
+          "sig" : "b9861f3d1a03cdd4f49e90947a21e5da9fc1281a816a9f5b520a7de27740504d43333f5facf65dec5bb06699c37aa1aa911bd4e8acd7aaeeb6dbe50e577731b4babd4587504821be0ec4798b14124e9adcdc2831d8822e7768302338953584147af1e323a9982ad01cc79f46e239c804b6c119a022e1850f4445d98dc27e83f808f33f8c0c81bbe16d5f04ff0128e34d03ff6a65260a7ee6e10dcd08d09d9db7912fbfebe0304b00135ab184e063a884992ccfa5d64953ae98f050c751817629fd5491eabaa52b0e52626bfd025c926dbdc25af5727d92bad2acc5ed59f5f597606c9752579c57ed0e015440ac194228323a71f708fb92d5cf36c841e8a07366",
+          "padding" : "3011300d060960864801650304020105000400",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 205,
+          "comment" : "using composition for digest",
+          "msg" : "54657374",
+          "sig" : "8729c630297b010164e90d0e99fc65eaaaf2bbbdf309f20bb48037bbd40e59ebd8d6fb7e23911051731b5ba5a8423bb3d0ab44bcaea5eb03f56eb8f3ead1c3fd252197fea478fb4b9b9b4e0649503d4f45922ebb72a4cc1716f914b3e8dd8fb111c9300e946c0eae83a2e6c40093fd1f55c684e4c4b2b0f09ecf03ef71a01449eb0cc2c4a274cfdd55efee7ff136a28626eb86af9d88c25bd0ba012d8a0218d43bb02d9b6b1273d3d2414789aaa076da4dcbde9444a151fba9c25ce225876b63b09e17b16e0e115a7db6860afd08c48ad37aa64a54d8b0230314354f1c943fdcebc1607e66121fdb7390f131ba6bbf8f88375497505d7d3ba4dd9761d842e937",
+          "padding" : "3035300d060960864801650304020105002424040153041f2eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 206,
+          "comment" : "modify first byte of digest",
+          "msg" : "54657374",
+          "sig" : "6385c6d4dbca9ee08e1f525a8b7915831a732854c7b26cf42681bc90dd49078873025b62e1830ba193445e129fd419ee12cde859032eefc5758c6c12ffeed3ed049322609d2665b5e1eead21af5f354acf336629e62cfc4a740bf9a51fd66e6b72287ed5558261252f50dc925417c1e48a4552589a7099ab0a3371cdb1c209573f7f5ac9436d298fda9606f9582e8c873420e7c4edbf5ead17e3c93fa3209208b91728c208b3fd10b27045be1cfbf242c5d34cadda97608271326444ad35d309d47f4add6bfc5ad95710db6d65f82a06a04bd7c71e335c2b86cf6a466c311f7e735b8ff8c2912269c3b1f2007f7d1369a55440a5abd98a46a4389756f73782ef",
+          "padding" : "3031300d060960864801650304020105000420512eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 207,
+          "comment" : "modify last byte of digest",
+          "msg" : "54657374",
+          "sig" : "1eff927cfa95030c95547b3f3403636ed63fe85c99e21e64bdd8593f56119329fd7d75f876e13317aafe540b79964cdf62330cf98be66ee41ec92d7ab9ba7988e8bf6eba3dc95ffedffe09b382a9ff566f07c61c06944de3b68dca4c4a3b2076e778286b50c6ece0dc066c29dae7d824969fecc6d5f8bbc2731e875ed9780428d53591d2f2021aa7864baac55d276cbb14098e9af5869e18c29c89d8732503fcf8e65a384454785ed39dbc516eba130e2add655a8e7df260a668ff9214194681033fd8b57202fdf627270fe4f63a49fbaffbce1520562ce53c9ecef6da5e942ad06c8ce3e673524b84c19da4f071d9d0ef9e24d4c8b0dd64627ccae7468372bc",
+          "padding" : "3031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345ea5",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 208,
+          "comment" : "truncate digest",
+          "msg" : "54657374",
+          "sig" : "ae443b008918b477cc8f80c54afc175ea0935ad53bbb2784fb1948ed4186f0374b760302dd2346c3797e79a080461c802c39cd72bfc9101b408ddf8ac4e449e2f2f0f03cc1fa5dd77e72becd52a36da64150edcd290df30fdff2a4701c7e923756eb4700184af4e06078517385f9f52d650a46eb94393b37761444fa1d3fc925579133c85e63b25a7a7d1587dc43fc500e54a70ead1cf872e47b33f34ce7971331007e5e74aafe18895f4e5b1faf925437af5dd7d5ac520eee778752130ecdba9d33a792e189e9c8d95770a4d5ecfd71647c99470604b269f14921b1fa50ba063b47bc6c490e9926e4065d5602555e51c9cf6669ee53b7cc7cd0da607478a5a0",
+          "padding" : "3030300d06096086480165030402010500041f532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 209,
+          "comment" : "truncate digest",
+          "msg" : "54657374",
+          "sig" : "5189a516b2ff014f527ffde7cfd65cca11f0b907160ff901a51511d4b94317e86f3065600728ad0c43e68a6f1f7017708bb8dbbc84e388f43a9c83acb98eaa6b4532cc68c4c6a44f649989b5d254f89fec6de1fea45e3e5b83e562608a7867f0919a2320a120c871421eb164895ed4bae27d34227b1e8cfb600292d208cd15cd62068aff9d692ae8088c9c08a51202694faec5d6c78e995e5e013f931b8a6cdd726357d0d5c6e9a83dc634810fe383ea1a89adc42c2bc675f075e571ecd3fff8581a0df3f83b1959a5e64b5eb1cb9bfb5c4c4c17d47a24a2ab3da66ba62d54b74624555c19c56ffa94203cf78101d181ffeafe8e8fed9e0897b27a88419aa540",
+          "padding" : "3030300d06096086480165030402010500041f2eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 210,
+          "comment" : "wrong hash in padding",
+          "msg" : "54657374",
+          "sig" : "8b009088b814c2e2a306b4cfd72d87db4ca1ebf6ad5f37e7aa29777b77d93c005922168e3634be085c9e4b147194046e38b7d32fe6814652672cc6eb724742a0a22fae278a9953e665e7351281c42e98d4fca8237be482080b9fbc471b9854ee75ece636868c6b3270dfc7dbb32cfd2e28901ff6ac699dd74d8bf096bfe89c22c228522474df25d13e5b7c1148edd5df5fbc06fe165729418221c610a8fbac579955b8625eeaa8e00aea009b42b2456c9316c5c005688bc060e61bf302418740f0be9b5a30df845608a9008804e89d1a5233d34b6fa84c3698451e472fedd9f4aa6ffbc9f4491256df7181334ff181cd66dce7dc66ef9d3c511ae5e6e3c88083",
+          "padding" : "3030300c06082a864886f70d020505000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 211,
+          "comment" : "wrong hash in padding",
+          "msg" : "54657374",
+          "sig" : "4469b8e895fb4340328360414352059a4b701d2c21cc2125d91f5025b7b22ae7ba840123ef45ba9c8c27a8a34a74f010a4fdd6be9474ac270501bd96a602afb05df7becdcaefb29df9be5d090af6869a4311fe94b70bcc0c5633d69169ca038b2fcb2a4abe60c0b542b308527781d184d06966632d7404da5e3494d76bc72e9f87d006950e7a4388334f99e212d5f253c11fa8361179be7bc927d9437ed11b7685529e832162e41a72ba3106b9af7acf5fef70178fd83ce3598683ad61c27cd1d69b437dfdf93ac43a1876d594e0eb8523a0ef8f75ccf1ab079d4538bbb726d04f45ec864b04f57c18cd6984f1a3a08a7c3944c6946c3c3e090f9d833c5d3d81",
+          "padding" : "302d300906052b0e03021a05000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 212,
+          "comment" : "wrong hash in padding",
+          "msg" : "54657374",
+          "sig" : "68a90a62da7b0ac09e26ca8786723164c0e6535e82f28839d12c08348aacccdf0218d3470290665e6d6fbb59cafda63c9e50d596442b02f4ec7b55753b13b82b217e32fc5f3818e3fee1a6b89855f5902dcdba3eccffddb7491317961af36dc74f5b6a4477f57aeb28d57658fcb8e77f8e223d2870b730d53ca1aadeafb389d3f934ba609689ce50bf82b08f31dc2578d7f076d26be5b267e87d2ca4df8d57c112831f45c46b9078c3ec13b01f0b5d67e82579243408e4eb29a154314cd5c68cad6b7198a02c522d87aad93e17aaf8fea49d38e39314c12c816e73d997c0fd10cb12d47aa7af0e82fa4b939f1209085c01a88f5cecd533901d5b1ab2866e753f",
+          "padding" : "3031300d060960864801650304020205000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 213,
+          "comment" : "wrong hash in padding",
+          "msg" : "54657374",
+          "sig" : "a1060a690b31b1b2feba5f0b8ede1c8f025da644da1f1d66a6cb218226ea6751a7f391ad063d80b63035cdb991e6a549d85c9f569f7677a40becf0326cb93297e23ed49dce7a5c1a4866d788aec24d23cf9c9cf15783ff5692a579db8f11b7e1ee8d28aea15f358b4d01e127dc438f5edf53346744594c3f946492a39aeaa17352a6791a52d4812637c8612323a50af3b7dd4216100020df91b653e5e4772bca49750ab9844c8cf13d651541d2a1aa7c74a673e645971df9acee059fa981ad39e8011b06bb39a86cdbba9fa544b8f2460188ca04354a95effed4e7c5905d5bf25973589809360d5e154e7a3613c27f4c5c920e71996063c2f86c44b7ad12a376",
+          "padding" : "3031300d060960864801650304020305000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 214,
+          "comment" : "wrong hash in signature",
+          "msg" : "54657374",
+          "sig" : "49cea19f5adb723c41e895337a24ced9e685736ec060f2aeef35bbdcf37741056d5f3ace051b0f6099585d82f576591da0c1139a590685b3e35ff9053bc6c3e381cba077700558328fa785128f78f5cfa481e6bf581bc9424f101cd8c2efeb4f8f00684776416c309d217df1dfde8f1e4643aad23207541fafeb5b7d263fb560cfade4792d716f68e7809cf8478cc4dc6a4c14e4e5df4f137d7a05270c6b0ca1f73e77eac07f5e7b60c8574b5c7487db4aa334173fbe03d93805bba291194f02f77ec0eeae2373ec9fc467a621feb77afc7d3757ca98b4f3fedbdc391f99df24663233f7394935b14eb81cf5b24d169cafa7506bcbcc2a4166fcf8fdbd5f7f3e",
+          "padding" : "3020300c06082a864886f70d0205050004100cbc6611f5540bd0809a388dc95a615b",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 215,
+          "comment" : "wrong hash in signature",
+          "msg" : "54657374",
+          "sig" : "b1e5095d61e4a986fe3425a08401ca726bafcb778dc818254e7ea5d299a9ee3e8c303a51ce19644b60a7f6156850b3325f4ada0958ce9a0a8cfe2a7ca085538b9b9abcfaaaf7413c810d6b2c03b5a3bbf98faef5374053cbff979815e5f1a38980087b291e1cf1683febc32da71b9040bedeb014de01cbc794ee40c12e7d44cbd01336ee92884d60d20bb0c9a5fe4d7dbc93478dab044bb6f04050ee4a3c8d2577c0e8443781f1ba5d8e763ed7f879f0bd970045299d2e2bc00ae47598e822fdf2461343c5c5f2111b099823c35b7ec4f07d337e52729c19e1df28c4bab6e7fbd1abd9cd3052920875e59ad251970e98c7a944ee6ba71787f65eda75e84cd048",
+          "padding" : "3021300906052b0e03021a05000414640ab2bae07bedc4c163f679a746f7ab7fb5d1fa",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 216,
+          "comment" : "wrong hash in signature",
+          "msg" : "54657374",
+          "sig" : "ba0ac1ff39b108015703583afcea5c777ec70df6ad11f561f23ca84eeacc73b7d93375f5e44c6c84e16273d442f93e36d474c7190184a0766e5b2bfe9896f0f0906a7a0c08dd78f0a9702cf3f706040893885f1e1da9cd01aca80de8c0c8197bb6e5e34562c37ff3256fbc6e99d1e9a7459a2cb1f49eb371a9e3cb1e87a460880664adb76e6bc3f2652010a7a1dde552dd4aadcf30366b0de3964e85d76bf79e20ced2aef87c9d31b4f2756cea23d9cef75ce07cea41204b42260a25ded448df639a0493d24262e1c411b7c294cabb56b95126c44d333385a63dbbf9219f22499812ae99772ba6c30d881c4bfdb3d074cc8f6090810546e64b1dfff6847a21f1",
+          "padding" : "3041300d0609608648016503040202050004307b8f4654076b80eb963911f19cfad1aaf4285ed48e826f6cde1b01a79aa73fadb5446e667fc4f90417782c91270540f3",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 217,
+          "comment" : "wrong hash in signature",
+          "msg" : "54657374",
+          "sig" : "4ab504da964bee491512b40b79fe9befa7e5960b142b619db35569cc9387265cc8fa8d4505b3b7cde5e884853bbea5d47ce7d60aa7e4c81853f0ee3f6b357dda5efe13119fc42f464b0cfb9d3506024c2c884eb57373e16611a6ec1eb803a61300bd248587594d081b501d5a141d2ea38d9ef69a87a3ee9d8d83aba410b8d30765c81f997d71457dc8ff1d9c3ed83f06f0156826105bc0a6fef0260ba6fb24578de5f58e7b0a64d5da1512f525f41e987a27e4d59c7d4917fb60586535341bf1644f6bf6a7e3cfba1c225a66bd65cc90b1eaed3696eaecbbc24a318a2e2ad711af85b02ee730940aa3dcb2d87aa8dadac182b5eefebaa3e729204d04e8ebf09b",
+          "padding" : "3051300d060960864801650304020305000440c6ee9e33cf5c6715a1d148fd73f7318884b41adcb916021e2bc0e800a5c5dd97f5142178f6ae88c8fdd98e1afb0ce4c8d2c54b5f37b30b7da1997bb33b0b8a31",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 218,
+          "comment" : "using PKCS#1 encryption padding",
+          "msg" : "54657374",
+          "sig" : "a5280543fcf9276baba49a297f0803ca4782cc05d35c53a7bd692b0356991d1ef6211efd591ef2eaa5d39b00bc193f3a5f175dd55de90f04396874b799374625a8af5ac162f9af79eb5f3615dac8a33c8d41182c6183db82b9e509ddcf4de0231e419d0e07487fbbb42d84ffc9b4f4c3ecdf6efe2efbfc64f3f665978ab6d210febb690d05a4c9252f97ddca64884df93fbcfc6356954ea7c4f486f2c201e6988400802904f61c02acf066698ff5af6fc8eaba4f81ec93d886a47e4652aad5df2ecf463db049b923a657ca629ba91ac0090be3a1381432ca2c3abccfb85b3c251776b910bd7ec4283d7493e309d251e07404324de24d65a3dfb8e3c5cb8a5a83",
+          "padding" : "0002ff...00<asn wrapped hash>",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 219,
+          "comment" : "using PKCS#1 encryption padding",
+          "msg" : "54657374",
+          "sig" : "4f2688932d7bf6ec48e50c69933006d28b055aa97621fbebf3ca336536b8dc61172c8ad52e453c4ec203dbb2904557012dcf43da92f55d62baa56961701bef821240a5fd2d1735ae14be136ea92ee10adc650eff7ef6b5cb08c3f4a9dc17bcfc66cf50616f305908719f467af5abb45beea1835f95544f53cf2813394767959ff3440da42757bd135806be3ed2698ea3d903e0f2447916c94deacbda484cb1e074114dcf3b41bf60383153b838f018f8b2e35e3af68eefd202a2b3d7ddc1ec134fff746f1ce9548f9e53a3cc41faf2e991ea1b5860c55f5c000bff72f5524bed9cb8f9e8dc34713f3ce443d202c8ed3df13dec385e8c19871508804c3267b67b",
+          "padding" : "0002ff...00<hash>",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 220,
+          "comment" : "invalid PKCS#1 signature padding",
+          "msg" : "54657374",
+          "sig" : "412f631c6df4c4402f70528635f4ed69094f33b198499980ff880e8e5fbdd22236c7836cc65ce18c1b3f183b69a47c27f3699fe7477462fa8d17e8a247e6ee9e994037ade036583ecf4497c083f78db36a15bebc291f164568655c27752f2ad27efa13a7fb897e658cd9f6aa1515bd14a4793fedb7722fb148c3a0e48cae63d14ad939a99a90f1dd7a7c09d478c9217e31f083c12dd3395332af68a4231a15069b1f43765584f6aa094645596ecb4923c59430e6ba76ae7ac4aa724b0fa9b5e2df9d9254857df70423f9323bdee97d74d662793ac72a0d089a79038b8b85e4c0d3a6f616fadca300a77bbd53ec69287a1f0f6fab0560ed90a28262bc310c14b1",
+          "padding" : "0001ff...ee00",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 221,
+          "comment" : "PKCS#1 padding too short",
+          "msg" : "54657374",
+          "sig" : "77dc98b3302f80235104cb8810d290be782529da8d49c7ed804c59f6435464668dc2d1fc3040ff31d7da3e31a472e218e7f8bf20b626673cecd2a56d7c15af20b42f3b1e155cb5bd3cc0f15c71152a64a6f15fa3e12f6060c2539f6f635c56a0192be82925c277f5f317b6531f1d5618ca95d038b4df9c1a99df4d09e6f5eb8940f8c5919051180822ccccd49c88da70c9c0bc1f206fe8a6d8e5678c02097f821b1d53a26e5542d9287442e9f74780fdb40f10fcd06aef31bc8f14de73eeb437555c4510762fe6bded19a21eb5e94ce51445ca10a6569f2a92bf70caf2e442975611c6f02b3e2875f911260bebfd5131956c98c5932461831313e3cdd9e7ef0c",
+          "padding" : "000001ff...",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 222,
+          "comment" : "CVE-2017-11185",
+          "msg" : "54657374",
+          "sig" : "bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a7",
+          "padding" : "n",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 223,
+          "comment" : "invalid length",
+          "msg" : "54657374",
+          "sig" : "bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a70000",
+          "padding" : "2 bytes too long",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 224,
+          "comment" : "empty signature",
+          "msg" : "54657374",
+          "sig" : "",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 225,
+          "comment" : "0",
+          "msg" : "54657374",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 226,
+          "comment" : "1",
+          "msg" : "54657374",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 227,
+          "comment" : "2",
+          "msg" : "54657374",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 228,
+          "comment" : "n-1",
+          "msg" : "54657374",
+          "sig" : "bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a6",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 229,
+          "comment" : "n+1",
+          "msg" : "54657374",
+          "sig" : "bb0d4124c20130688b8419fabecc427d946c5096dcf69ecb0eb69fcf5aed15d7e1e5fe4e34fbe26f8b244aa3f088d546a00a531464ba4b8980bcc4d5e54bcc20e1a51afa9044f7fdecbc6edb751b5a5fa7ab403a04e5f77ba7865dd6d211da0afa71262a77a63d9c06e8b00b616ca15f11ea5b4948973864183f570347570553e3878376ca4f7536ad5afac10c0a7b34a5c11f8cf16115fbaeb4b323b1ad6f75c7ec3b954891cab2611cf1768cec983c1717c57f67676d721a955bdbbc216a3345bb31d7d63e06bdac96a6b991ba1e0113d01e48c77ab327d36b426c2f8fe4825a37877425885c927e92423b6977fc304122a2c397cb74845fe9961dba22c1a8",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        },
+        {
+          "tcId" : 230,
+          "comment" : "-1",
+          "msg" : "54657374",
+          "sig" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "padding" : "",
+          "result" : "invalid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "30818902818100d0941e63a980fa92fb25ed4c7b3307f827023034ae7f1a7491f0699ca7607285e62ad8e994bac21b8b6e305e334f4874067d28e304230dca7f0e85f7ce595770b6e054c9f844ba86c0696eeba0769d8d4a347e8fe85c724ac1c44994af18a39e719f721f1bc50c46a39e6c075fcd1649f01f22608ce7dc6955502258336987d90203010001",
+      "keyDer" : "30819f300d06092a864886f70d010101050003818d0030818902818100d0941e63a980fa92fb25ed4c7b3307f827023034ae7f1a7491f0699ca7607285e62ad8e994bac21b8b6e305e334f4874067d28e304230dca7f0e85f7ce595770b6e054c9f844ba86c0696eeba0769d8d4a347e8fe85c724ac1c44994af18a39e719f721f1bc50c46a39e6c075fcd1649f01f22608ce7dc6955502258336987d90203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQlB5jqYD6kvsl7Ux7Mwf4JwIw\nNK5/GnSR8Gmcp2ByheYq2OmUusIbi24wXjNPSHQGfSjjBCMNyn8OhffOWVdwtuBU\nyfhEuobAaW7roHadjUo0fo/oXHJKwcRJlK8Yo55xn3IfG8UMRqOebAdfzRZJ8B8i\nYIzn3GlVUCJYM2mH2QIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 1024,
+      "n" : "0d0941e63a980fa92fb25ed4c7b3307f827023034ae7f1a7491f0699ca7607285e62ad8e994bac21b8b6e305e334f4874067d28e304230dca7f0e85f7ce595770b6e054c9f844ba86c0696eeba0769d8d4a347e8fe85c724ac1c44994af18a39e719f721f1bc50c46a39e6c075fcd1649f01f22608ce7dc6955502258336987d9",
+      "sha" : "SHA-1",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 231,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "03e64d148e05201b021fb5d3d72ab6abd4294be6c1673277ba5822ad2fe7ce4bb29ac547b2fdf09c2894ea0e31e76f1b3e1937db91c389467e9a8ac7be0a4f674456f01c5b4fa4277a26028b49b16e25689827d0a4b9f1c25a63350dc15131da908a05c7cfa8c08a67ac9efe3b0cd04aba7db12064cbc36729eaaec540c4bc12",
+          "padding" : "3021300906052b0e03021a05000414da39a3ee5e6b4b0d3255bfef95601890afd80709",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus",
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 232,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "1d19763e80121e228ac4dbb3be8448560aac613ec74b168efe1d8a8335b77e6d8c3cc0f641de8c8e26a2aff9d32a4ab77340912fec0e60e89257b5b6b19c8deb866c2d2349fe63a06ac6b72397b478cdd4198ead64f8d36b9df29651e95ac7b886978cffbb5f7498f136b1ded7580cbcbb31620415eb71cdb5bd615b47eff813",
+          "padding" : "3021300906052b0e03021a050004146768033e216468247bd031a0a2d9876d79818f8f",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus",
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 233,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "0891ef2061c4d3377744cd7243ccc444619df533f4eadee216f7ffb9244e86d3e0162fc82c0b9502dc7aeebaf7884067e5f18f21b395c43bbfce5559ae84157ffde2aa457b7f44675e706af443acd9e38070428dfc6471a24cdc0d44f9283ac158704ad114375f10c24e3adbd12c55dabb78b8c41d3938124acc74126c82bb0b",
+          "padding" : "3021300906052b0e03021a05000414640ab2bae07bedc4c163f679a746f7ab7fb5d1fa",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus",
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 234,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "8277e8984d536f81667feeee7e24068ca5bb8b815210b3e9fa82294e11cae92c45164c9dd5683be4650e4b7709eb8879f793ae804620750b26032894e53333158f6afa6b52318e6c730a4a55d5a0fca6d029744f2ecaa2e00d3d6dffa0716acefd5c91afeda74b7f1a1bd7e635283bfa2142ace513da24eb8f25f3578a401ba7",
+          "padding" : "3021300906052b0e03021a0500041421f0fb55d0f5f4e1521ec82216000a17e728f773",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus",
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 235,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "b41191a7a1d11e973600e9a28c8d6e6d1513f7d970cb05ad50c686bd6fc42b7848559b2b3073a8cc9839f464d82f8a7d864cbc9698cc1a4b5b8c8103d07e9d79e5d24e1b3ab69053461bd76ac3b62935c31ef9f0c44120bf5c0a012eeedbd2a39d347cf6676ee8c81a88eb87eef2708edd793ebb79d6fced626e6475681fe73d",
+          "padding" : "3021300906052b0e03021a0500041468f4145fee7dde76afceb910165924ad14cf0d00",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus",
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 236,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "29f69d320ea3221cd0704300f456295becf54e877c2b9b2704dc47ef992588c7dcc1648d17172d8c76362c488aadb3437be488fe667a192c5db1440f70d102361d7e85ffab370c7bdaceba0d15b1f32ba0801ccddc9fbaed1323834a60d19ff13ecd46a27f06e79cb0d3aefdefc0c69d8e85fbe8761d83f35e362355ba675933",
+          "padding" : "3021300906052b0e03021a0500041486f7e437faa5a7fce15d1ddcb9eaeaea377667b8",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus",
+            "WeakHash"
+          ]
+        },
+        {
+          "tcId" : 237,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "9aa3040e7df724bf506881f6a92a133ff76f6a168f0f3ced70b3363835ed6b655fae6f39416555af4071c16262da7556412d9905279d666f9e15fb8a813b313d00007cef3ed2be306b9e29e6b69c2c5bebe36aa057feba44ccb6c8619076a5b23f39729ef78bd6478249f34ee99f3abeef37c504410910d1ad3f1a712c8d697e",
+          "padding" : "3021300906052b0e03021a05000414b92747057fbbdde83bc06b7e869eb40c32d08a6d",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus",
+            "WeakHash"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "30818902818100dfbe6f882c8b0c42c3229f29cd858bead25c213b5c0346c3052f844b045ac792c81c1df5ad6a66e9d4f3f7c11096f069f5fc0d1d7da555c6e685cf672ab2a6599f01605f50c93a91d6882f5884e4cf3e9c41a790b0c44247150777f95acf69312b0ed68f3c82693e6b67f0e1ea5927c0eeab3554c2c157181f4634e77bcb088b0203010001",
+      "keyDer" : "30819f300d06092a864886f70d010101050003818d0030818902818100dfbe6f882c8b0c42c3229f29cd858bead25c213b5c0346c3052f844b045ac792c81c1df5ad6a66e9d4f3f7c11096f069f5fc0d1d7da555c6e685cf672ab2a6599f01605f50c93a91d6882f5884e4cf3e9c41a790b0c44247150777f95acf69312b0ed68f3c82693e6b67f0e1ea5927c0eeab3554c2c157181f4634e77bcb088b0203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfvm+ILIsMQsMinynNhYvq0lwh\nO1wDRsMFL4RLBFrHksgcHfWtambp1PP3wRCW8Gn1/A0dfaVVxuaFz2cqsqZZnwFg\nX1DJOpHWiC9YhOTPPpxBp5CwxEJHFQd3+VrPaTErDtaPPIJpPmtn8OHqWSfA7qs1\nVMLBVxgfRjTne8sIiwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 1024,
+      "n" : "0dfbe6f882c8b0c42c3229f29cd858bead25c213b5c0346c3052f844b045ac792c81c1df5ad6a66e9d4f3f7c11096f069f5fc0d1d7da555c6e685cf672ab2a6599f01605f50c93a91d6882f5884e4cf3e9c41a790b0c44247150777f95acf69312b0ed68f3c82693e6b67f0e1ea5927c0eeab3554c2c157181f4634e77bcb088b",
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 238,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "507e6233a3c80971daa07c13f34a532d53441e196d642fd6564b347fdceb865c55dd47330587622a30f8d4ee66bf8f163c626f8dd26b313bb4095ea1ae9d6a96a24365f4c20056998eb9d1e3f2e1c78257361e5c21e5ba76320997e8cb30021e8f11a580000891bca3537d7a2c0972e06844f1a01a1dbc9a3f8b8a2955f7005f",
+          "padding" : "302d300d06096086480165030402040500041cd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 239,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "414de39059daab523a725efe437d688824a43689766b33136aa3e6da0a2fcf1c2aeff952605c2f1a12a29e36f282e59631f442af96c7659e0717bb24807835aa06f034906670b042f8db1cdcbf3c54e25472383b6b9097a09bfbd73b2e7c10e18731c6bad47af591bdb2d376680f6cb62048a97c19f23a70e98ddedf02786efc",
+          "padding" : "302d300d06096086480165030402040500041cbd4f57a4cfb1649cca33372f5c5ad32b993ff73aaf4fb75d52798480",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 240,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "aa5d174e95f9a1ff88c1ce60b3aed1d39e256e28b0512cc4b52be1d41b8ccfa2a739945aefb5b697886f4f08cef365d18bdd8151acc588fd4ebf2aede9bdd904aa3481822206f3fedc5889c9f9889a8dd4d160d65e587ee228f9ef155108cb283c4e2a697a1e739827cb4a9790f96023e6ad24cabe51741a7c7cea8c52f08cdc",
+          "padding" : "302d300d06096086480165030402040500041c3606346815fd4d491a92649905a40da025d8cf15f095136b19f37923",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 241,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "54a81c62bed2f716feb2939f504db144c1c3b70485a1f35b2871ede567ffcdeb8d2ed0c57c56f21b70388d631be05b4c738e67f160f34ec42f236cef92b03d3dc8e50145b33e634a6fad8e87f84624e96feefeeaa91ddbb003c3969017dd2d102da2e7d5de8ed298139d5e503e0aaab136fb583b99ece2e6b1681699a04b977e",
+          "padding" : "302d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 242,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "11890613a8ae298c21bda95fbe4059c37426f41ceccb7bd79598c72ab4662e012f08b7009c15155b5ae9d132b4ede565963e6014241305279d60662f57df7119e5d4088d32bfc7e0847036f41ca71f9a92660f90ec13ee9e19717d0b567ec5a6b5978a11337d5ee4e9147352fb954817be04fb767ef35c07babb03fd04a31338",
+          "padding" : "302d300d06096086480165030402040500041c3dc6a3fd912b08bf15170296c4f1694f512ffa1dc9bddb8b9e1c8d38",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 243,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "0fd461012145fe0ae9362eef22ee35dac0d4751a037ce4cf0792012bb179d101f9a9752e5ebc5454b18684fa1b557f3136ae68edc087dbfa4bbfaa59be42d0daa84b574a9f23238d4d538ae3e6c32f8dbd98b1138b545badcc10b184428fe2707aec73206367f147196f7b83f358377562e8c7d9f1d396a1cd9aa74f8a78cb1d",
+          "padding" : "302d300d06096086480165030402040500041cabd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 244,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "307e421e06bdec1fc1750d53529f5f007eddcc991af8351477e1d67169409e3acc93367fadc412a4554854004c4a29c8af4af09793e55967ed439645034cc9e9ae565edfc861e04c763d058ff3aa29bef3942277b4c971d830be1259aa30c125a6ede65971b0120758c2a6eb21f238ff18228f344155ff9109a0f9656cae2351",
+          "padding" : "302d300d06096086480165030402040500041c15a322a18b35c3afd3937b5ac133fbd8d883d300a29ed9d9e2b3d601",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "30818902818100ac9048a7a4f560af91b4fcaf62a14595cb9ca9ec12000fc845e48572113cab2890adb011a919575a40760d1f23fe92509c8a5810b6d05990b909dd0f4c6014f2b31b6abd805bace99816e2eda41fd7b95405db7c5c8f4cf6babb14f550d5d0dd5179b54951fff6aa9686f30f478db649b7c7044cc202dccad00343468eaacfbf0203010001",
+      "keyDer" : "30819f300d06092a864886f70d010101050003818d0030818902818100ac9048a7a4f560af91b4fcaf62a14595cb9ca9ec12000fc845e48572113cab2890adb011a919575a40760d1f23fe92509c8a5810b6d05990b909dd0f4c6014f2b31b6abd805bace99816e2eda41fd7b95405db7c5c8f4cf6babb14f550d5d0dd5179b54951fff6aa9686f30f478db649b7c7044cc202dccad00343468eaacfbf0203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCskEinpPVgr5G0/K9ioUWVy5yp\n7BIAD8hF5IVyETyrKJCtsBGpGVdaQHYNHyP+klCcilgQttBZkLkJ3Q9MYBTysxtq\nvYBbrOmYFuLtpB/XuVQF23xcj0z2ursU9VDV0N1RebVJUf/2qpaG8w9HjbZJt8cE\nTMIC3MrQA0NGjqrPvwIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 1024,
+      "n" : "0ac9048a7a4f560af91b4fcaf62a14595cb9ca9ec12000fc845e48572113cab2890adb011a919575a40760d1f23fe92509c8a5810b6d05990b909dd0f4c6014f2b31b6abd805bace99816e2eda41fd7b95405db7c5c8f4cf6babb14f550d5d0dd5179b54951fff6aa9686f30f478db649b7c7044cc202dccad00343468eaacfbf",
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 245,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "a0abd165a5ef8733ba111fa0fa092630222d809d8ae811f24f8bead4968b7533af31019663713ba134e7dd345c38e7166a037025eb34adcd6891c9ec941d2e3eb1e4bded1d269272b602cb9b53568b992ddb5103914e6424c75505701a37996c8318b0b6f8640cb6b6e770ac44314b866a7c683a6903f7bba07b6f197ec554fc",
+          "padding" : "3031300d060960864801650304020105000420e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 246,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "41339884a9b3940e8488d666bb158063c6a2a2717cae7f564834a876fcbf7098ecf3acbfabf37d38a8e6127b1e313744f1f896e165efdaea0b2e7673867842b9e94db0868ed9a92bcdcb370a4e20ff275c82595e4400a8b9e9f12482f014846b48216f321266ae6ae6338dbcdc41b711e483e6e3e728772e7f9f5ef95c30196b",
+          "padding" : "3031300d060960864801650304020105000420de47c9b27eb8d300dbb5f2c353e632c393262cf06340c4fa7f1b40c4cbd36f90",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 247,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "8883676becdc27878ccdff53dda011e5e2f886e31e1e88d520bb161cd63aa001fded9f0656109c1507bd1ba5d3bb3e725029a236b4c3c0420a1fcfffe348c5277d6aa51bf75d9af26fdc15fc49d637b078a8b0478b5b0a9c428756d260068e5e622f193b9f9a2c1d979e3322d7f3edc32053541c6efa2485e42e99a804f94388",
+          "padding" : "3031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 248,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "9f2e01b92bc9dd32dcf24aee91467797396649a3255bac943dd0e03c9ef416f349c0cbb728704730f3c7a7c244066a94b229a6e86bde7753c8940129626307b542cc7f596583932b4fe6ea9384d5353e08654e966a64b63bd6745503f7e4383dcef74ad4516ac25c8790db6702ac5b8b057a8fae75669b6a9e689e9211a337b9",
+          "padding" : "3031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 249,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "3cb9557d9fe49b889319e0d41efc00cba34277caeed2b2c54fc89772c669200dd63f02f340cb6ed579a379a3fd6a568ca9d4bce206655ae4586850638ee6bffaae2bed7c7afe7353d22418d7e4f6b15e198c85b649d3e5a67f00702dd9fefed7dc72136bb4440fac58e64453e4ee63a81de4270446571b192f414116e165efc0",
+          "padding" : "3031300d0609608648016503040201050004202f77668a9dfbf8d5848b9eeb4a7145ca94c6ed9236e4a773f6dcafa5132b2f91",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 250,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "06e6fb568e366fa20d48704be40e991a291d47a464296a49c37718c1153b0fea17ac18a01ff97b32a92d07635dfb9143d011d003c9153020f5ef7fd3ef258cfe92a7a2120718fcc85c73acd34cbd50670c2e044dc3b82fca29b1017912b65d8a844515655308367d8797ae5b7fb91042df573f32de69c1842a128ac88937c0e9",
+          "padding" : "3031300d060960864801650304020105000420ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 251,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "327238fd701dc4a829827550aad98f9bcd75e9f3831c3679998c869c1dd8381bc6b74b721e9d3377034e059d6637690ba3a184ffd98af951d43a22105a51838f72cf592d658af01adeedf721cf2eb2bb2c90c68311cb267f0cfacca903c1a2a73f7228badb5d86976f5d3371fe9b00cca048a7a0b0fc4b03da11c5a098045e07",
+          "padding" : "3031300d0609608648016503040201050004209432c1a7d343fcfacb164bdc44ff71c1281c004886b1c428419088d06cd3561a",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "30818902818100a1d3912e65d994e0ba51135f78844d9a3ea5161e5450d16a8cf0173a0a309a1ee94e94385dffc5e27dea6692a1713516af86df2283c8e327e60ee26a7b7cfccb0af3f4b5efec358651996b97d5b25da933b063490cf7b67073d399b04ad55c0a89f8ec36d7f5cae757dbd3d6d0f5b77f7c94e28878397cb45cfd178f3f07ed010203010001",
+      "keyDer" : "30819f300d06092a864886f70d010101050003818d0030818902818100a1d3912e65d994e0ba51135f78844d9a3ea5161e5450d16a8cf0173a0a309a1ee94e94385dffc5e27dea6692a1713516af86df2283c8e327e60ee26a7b7cfccb0af3f4b5efec358651996b97d5b25da933b063490cf7b67073d399b04ad55c0a89f8ec36d7f5cae757dbd3d6d0f5b77f7c94e28878397cb45cfd178f3f07ed010203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCh05EuZdmU4LpRE194hE2aPqUW\nHlRQ0WqM8Bc6CjCaHulOlDhd/8XifepmkqFxNRavht8ig8jjJ+YO4mp7fPzLCvP0\nte/sNYZRmWuX1bJdqTOwY0kM97Zwc9OZsErVXAqJ+Ow21/XK51fb09bQ9bd/fJTi\niHg5fLRc/RePPwftAQIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 1024,
+      "n" : "0a1d3912e65d994e0ba51135f78844d9a3ea5161e5450d16a8cf0173a0a309a1ee94e94385dffc5e27dea6692a1713516af86df2283c8e327e60ee26a7b7cfccb0af3f4b5efec358651996b97d5b25da933b063490cf7b67073d399b04ad55c0a89f8ec36d7f5cae757dbd3d6d0f5b77f7c94e28878397cb45cfd178f3f07ed01",
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 252,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "8bda47e85848bb1d98eab90bd5f1880540204c8753a17b2552ee4778405e4c42cc3d25a4d869eb38f1e6fd122a2f52fa8685c3ef40400ade2017555ae88fa892a1ad2793f7c23762f0e54db0852cfdb2e52ebd02c8acf81b9a1e78accb5fbb57a29391cf4fa9aa298111c7b94fe240f0f576b1b52853853fce13da155f16e81d",
+          "padding" : "3041300d06096086480165030402020500043038b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 253,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "74b9a7b9548a281c5a258520c879e0e64d8a28812a7b6461c6e418e0502b61008a8e535a5b55fb64529a6a6df2f60ef33c1844b27f81532be2bc2992d0eb5e524112da90bf40adefcf206469639ff3895a9826674ee1acbdd623842ab0a9a36d48da13ba17c4ee069254da2ea418d5a8f135e2a414c0654a266d538621917545",
+          "padding" : "3041300d060960864801650304020205000430a5a2cb4f3870291de150e09ee864f3b2b3b342937ac719a149439185ad6a47bb4f23ae83ff20f0c8f0c79a1764244a63",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 254,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "10d9c8b0bf55586e985799be60a17979eb0461daca00ea6defcc62fe720ea502e7e486c02a48f5ca41ecd96c67b5c762a067c465c35a8e416748897ede3ee2cd3c3e1b1199da5c7f0dd0f036774a1730e63ba781d6ee43d78b067608e831a16dbec6075c8ec90e81a4d8e2ac2587b0ae43f7445478b03ab7eba2e63d4043c2e1",
+          "padding" : "3041300d0609608648016503040202050004307b8f4654076b80eb963911f19cfad1aaf4285ed48e826f6cde1b01a79aa73fadb5446e667fc4f90417782c91270540f3",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 255,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "2cb15eb09030fade89eabc41794d288275c456f12cb0d414311e5edb551a51c3e1354f134b27aecae50536379a871a4ce6ab2e1b999c0308f5fed2ec48d97d68885b37a1e3e26b841db103b64f720f9aef265632f4f4a207ddffe19092e8b16144b0a3443d779c0b648077d3b04b72dd4f4051ac232261ac9df65974764b97a9",
+          "padding" : "3041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 256,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "9c80154e3087b443fe6d9bc24faa7ea009330a210f2f1063ea1b61261507a5e3853079a0287d5b27983bd751ac782b1a5c31130978d3f2a8a95101c4ed87eacee964953ad32cd2cd4caeb7c37330d1650d7ca19dfa6e8f1c184d3dd9a3a759d6badc700b7063d2c579b336c5e141c200614ba613d9bb6493e87d26978b438573",
+          "padding" : "3041300d060960864801650304020205000430b526d8394134b853bd071719bc99d42b669bc9252baa82dcafabc1f322a3841c57cc0c82f080fd331b1666112b27a329",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 257,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "99fc12c90f67dff9600c30c9f81bbf335492151345c809c05771d59ef73d438f88c5c43ba507a3cad6633641d70ec3f3c38f67cf7f2566489f59422a2dad1f647e790bbd28acc290ab392d48ce7a140184bb71023f8c9c5dcd9469ebe848063d96bad26fbd390974b38459d51727eb8c0a5b8a8ef1d3394b6f852dd2b22cd22c",
+          "padding" : "3041300d06096086480165030402020500043054a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 258,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "869b42bb93624a139bb98c043cba8fe12d612aef040e3085994824a480274c0cca24d08d178321acb048055b777d897e267cd50809bc7e9f86c276beeb8a8d59d82aa2091c66c71e41ca59738b0e18f055f9c75a01e87aaad446e64ac0183c002ea2080415ebb4f85a590622bfa4e701a6e37d0b33bd78d5ff874d8d28fda263",
+          "padding" : "3041300d060960864801650304020205000430ae9ada2a808aca7097c9e9c30fba4ca60a5e79874a6be0f5afeb7f5df3538346f04b84ee06bef7ac879a0085bb2036c8",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3081c90281c100b8be129638e9c805359e6169b263265e2a8ec4b849101f2a321ce523665e399954ac3865ee8c85d14f3d3f24fbd583664bf09394cbc7f7ffc98aadc94eda35ca4b9614fd2d773c782086a1ea9ca23f357cb2cdc465fb85100172845d6b2906dc9315a542d204bcc4dce68d90484198e2350cd682eef9313a13df3607669aa4dd186f563ba0ae3ee054f857a92985f2694a54e1a87ed7327acbfda3e61ecbfecfdd1b7b2d08dd306122fd44268f08463306760f40dfb7634e71d7a72f1224e6110203010001",
+      "keyDer" : "3081df300d06092a864886f70d01010105000381cd003081c90281c100b8be129638e9c805359e6169b263265e2a8ec4b849101f2a321ce523665e399954ac3865ee8c85d14f3d3f24fbd583664bf09394cbc7f7ffc98aadc94eda35ca4b9614fd2d773c782086a1ea9ca23f357cb2cdc465fb85100172845d6b2906dc9315a542d204bcc4dce68d90484198e2350cd682eef9313a13df3607669aa4dd186f563ba0ae3ee054f857a92985f2694a54e1a87ed7327acbfda3e61ecbfecfdd1b7b2d08dd306122fd44268f08463306760f40dfb7634e71d7a72f1224e6110203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIHfMA0GCSqGSIb3DQEBAQUAA4HNADCByQKBwQC4vhKWOOnIBTWeYWmyYyZeKo7E\nuEkQHyoyHOUjZl45mVSsOGXujIXRTz0/JPvVg2ZL8JOUy8f3/8mKrclO2jXKS5YU\n/S13PHgghqHqnKI/NXyyzcRl+4UQAXKEXWspBtyTFaVC0gS8xNzmjZBIQZjiNQzW\ngu75MToT3zYHZpqk3RhvVjugrj7gVPhXqSmF8mlKVOGoftcyesv9o+Yey/7P3Rt7\nLQjdMGEi/UQmjwhGMwZ2D0Dft2NOcdenLxIk5hECAwEAAQ==\n-----END PUBLIC KEY-----",
+      "keysize" : 1536,
+      "n" : "0b8be129638e9c805359e6169b263265e2a8ec4b849101f2a321ce523665e399954ac3865ee8c85d14f3d3f24fbd583664bf09394cbc7f7ffc98aadc94eda35ca4b9614fd2d773c782086a1ea9ca23f357cb2cdc465fb85100172845d6b2906dc9315a542d204bcc4dce68d90484198e2350cd682eef9313a13df3607669aa4dd186f563ba0ae3ee054f857a92985f2694a54e1a87ed7327acbfda3e61ecbfecfdd1b7b2d08dd306122fd44268f08463306760f40dfb7634e71d7a72f1224e611",
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 259,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "9cbe6b808679d666332a97049be279327c7e00e3c17354fd1d5f611969f487d9e397456b90549a77582a6e8b51fe212399ff68b979fe293efcd11ab79cbfda818cc4039c62d32b58717fe0abf2b4eeea0304baa5afe23ff6614dc6cec45b518d6d58a157ae211e0a67c36a0ef6468d0dd68f6155a818bece4f8d35884f4f90aa6ac6250bb3459604d4598ca7c7e57489d484351aa936be4fc9051e28e229f4bb60fa97a3f018ef37fdfe78ca8cfc0caae758c53d0f68edb8b9df2b826c80272f",
+          "padding" : "302d300d06096086480165030402040500041cd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 260,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "570c9a8a85a988b5e254b74af7611f0a1e4843e4727c9117a5e2bbbec29b0a6e84c5ccc2cec9b100410b37d1e0eef9a2a21a2894e1a5b581e6567d1043a980166ed7449e557fd7f1fb19fff60f3cfc85c79c9793c553314060b95f0a2199f4de16792e35888b78f7bbd4520eb09efc7aede5d24a51d8c123669ee2452357dfd089986005506df4431c50432509302e7c7e9aa8e9f383ef8b856fda1ba8db44f36b7aae91c597bd6aa0b4f12573a664f328b23b7a7e8738d5bfe772b39d5017d7",
+          "padding" : "302d300d06096086480165030402040500041cbd4f57a4cfb1649cca33372f5c5ad32b993ff73aaf4fb75d52798480",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 261,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "74cd13a7cad1ba8c0254967f1cf7d594a084995b5778b113a42f35654151556e36ff796f609146bcc519a8f983d0093a1fe7d2789d0c2688d8444ff4c3c8f6759eb71d6fb7f47a2eff42e62ecdd14fb3cf2e6df4b0717094863bf19a84457a656d3fd64aa5c086e09a8097e3576ba1d91fa17b7a1222b9064e2c6b06aba5b692a7078117838c64cd6598bea415a231daf4e62d4bffcbc0986c3cf86ae6a3bbb7ffbe85ee002ce9af3177b1f2c0ae14b8b1cd41b1bf1b2ccc688794f092c91873",
+          "padding" : "302d300d06096086480165030402040500041c3606346815fd4d491a92649905a40da025d8cf15f095136b19f37923",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 262,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "1ecad2c46d9d37b3bdecb7f9002cc48f8345a2aec090f5d599350c855c4eb58f8a503d8dfe042525a66e771bd8dd8a70fb4822aea1a0cf33577ea658288e6f2fd886888cb9225f1ea0d03bf5b5e63afd3bf59c0c1d3f2cf4f4ba2a8dcf23182feec72f76a60d252a8cb0b770b7d0dd6c72c072098f81b852f7271007273eccbc55a9099e426e566a52e11be82e78bc8ce8c6bb721f858816c43aa253a950da5810e5690c193b820d9ed4f02046a548503c72755abf1450c09dda9c84dd2a079a",
+          "padding" : "302d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 263,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "402c91c41a3e1782ae406b04ff52cbbf9f71cc5f3473b9af43a2ef96245e79b62551d9b23a85e6e80a2041b616dce2647312258b29bc6b549eb38afb083d823b3c2619caee52cb1583a7c20cba7da2159ac8154b98a9683388bcc523c10b6e560fe0c8a0cce9237ab1991b207e708b601b13c5d1d86825d89fc5aaffa0e89ddcc11d2b516de64e34783d86c6d05ded6024274498b6f3dd5593feb03147cfca3890f92487b64e67ccb676b85144899e6d257b28edff14130eaf0cc45b60ddec80",
+          "padding" : "302d300d06096086480165030402040500041c3dc6a3fd912b08bf15170296c4f1694f512ffa1dc9bddb8b9e1c8d38",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 264,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "4d93f0d689c59942d9e7c26cfc5af040cff4b3a114c7e191851baa888133ea52583899520f8e063d7ea1ac7773ccca280b92840082d960b0d1e20bc8549c83f989b6991613c1711a0a2586de7fc2bd10750023e2866fce48329621e9203c2818373abd69bc1807fc1158639d3837b5391077a39f829f04472c74bab0a15757083a34ec2701abb6839ade2674f1220af9d109678d209bf5f16eceaa8227ab028d0017530900f52b8be12c33f007dd21774a5bdae2ee12d7e47e98e5cc7d301d9e",
+          "padding" : "302d300d06096086480165030402040500041cabd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 265,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "44a571c4bbf737001fd5602e8d096123de21b47c36eea780f3e0e19fd2243605066ea949c88b6abb8353ee8b88e394a485031e9e980936e09bbd17fb6dfe340f07bcca5cc51edcbd5bf98c223f44976b6ba3b4b2157f1a14a7b2a20728f92a31120f968138a33164c78b7fe9146ba6d641d6c7b7cc9b1b4062e96002054eb9cd2e738fd82564dc0fd87f08b5006f52db13a7efd4602dd6736cc9667701fcb9ad48c5b3625a11e44e034d0cecb38cea4766b03416c94f01418b411e2f4739ccba",
+          "padding" : "302d300d06096086480165030402040500041c15a322a18b35c3afd3937b5ac133fbd8d883d300a29ed9d9e2b3d601",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3081c90281c100eb477c90d46bd1896cf4930cf2615140e029a743f0649ae586eb04d51f21ac5241744b5872ccebc87b401487a9c859176c9fc8200b2054875e2c811a56b5d9468e6d3a99c058b1c89547f55a3d7b1d08852f673d3288544aab906e57364cac817728dcea18bc1193e62269e04112c19451702cfaa46fcaf716db14f2e1c9b8d312bdb15dde506945395bdb0865f22ac0553f827a27719c2c703a83c6cbfd949d06d4eb560a8fddff052fd6f0a20f6cdeb2909211b75f8182e58590d069a2a2710203010001",
+      "keyDer" : "3081df300d06092a864886f70d01010105000381cd003081c90281c100eb477c90d46bd1896cf4930cf2615140e029a743f0649ae586eb04d51f21ac5241744b5872ccebc87b401487a9c859176c9fc8200b2054875e2c811a56b5d9468e6d3a99c058b1c89547f55a3d7b1d08852f673d3288544aab906e57364cac817728dcea18bc1193e62269e04112c19451702cfaa46fcaf716db14f2e1c9b8d312bdb15dde506945395bdb0865f22ac0553f827a27719c2c703a83c6cbfd949d06d4eb560a8fddff052fd6f0a20f6cdeb2909211b75f8182e58590d069a2a2710203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIHfMA0GCSqGSIb3DQEBAQUAA4HNADCByQKBwQDrR3yQ1GvRiWz0kwzyYVFA4Cmn\nQ/BkmuWG6wTVHyGsUkF0S1hyzOvIe0AUh6nIWRdsn8ggCyBUh14sgRpWtdlGjm06\nmcBYsciVR/VaPXsdCIUvZz0yiFRKq5BuVzZMrIF3KNzqGLwRk+YiaeBBEsGUUXAs\n+qRvyvcW2xTy4cm40xK9sV3eUGlFOVvbCGXyKsBVP4J6J3GcLHA6g8bL/ZSdBtTr\nVgqP3f8FL9bwog9s3rKQkhG3X4GC5YWQ0GmionECAwEAAQ==\n-----END PUBLIC KEY-----",
+      "keysize" : 1536,
+      "n" : "0eb477c90d46bd1896cf4930cf2615140e029a743f0649ae586eb04d51f21ac5241744b5872ccebc87b401487a9c859176c9fc8200b2054875e2c811a56b5d9468e6d3a99c058b1c89547f55a3d7b1d08852f673d3288544aab906e57364cac817728dcea18bc1193e62269e04112c19451702cfaa46fcaf716db14f2e1c9b8d312bdb15dde506945395bdb0865f22ac0553f827a27719c2c703a83c6cbfd949d06d4eb560a8fddff052fd6f0a20f6cdeb2909211b75f8182e58590d069a2a271",
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 266,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "e4f7f0076b4bddb632c470881bbffe95a148573a75c014689eda7acf5e57a546327d4bead01da0b093b2c4eb5b048fd707d27a4baf85d610e4ff8861feca57e1ea88ff0c4b803c4b0d62ae0cb89012b0ff041b438e49a79680f2cb30722a5a2a3aa9b516ff2a02947ebe27186aa9ffdb35e15328c0f49f172af51f764258e909651469ebc6a59cd98c996fa3417008252e3386b9a2d059d3c67983ce62ae2d052733c55732320679eae156d0e4b89da1022bd052340819cfcdd7366c34b65a01",
+          "padding" : "3031300d060960864801650304020105000420e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 267,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "8d2611d4c79f6b2087ae8bc76610905c361b9fe0a6629388197b4293f9e14ecbeb377206e4c1db35cdc0ab163dc5c51e8a7370a059e9ee8014d18ef0937f7936879d7825c792180a4f10a0d46e0a954f093d703b82bd076dcec0b8a66fc3be9bdf79ce4550c453015dc1c7397ec1bfceed040a4d777915546b9cbcf1eeb13eb71ac49c235e69cb07c315d529442f4863d61b7d5caa5ce07820edf649a9342211a26f8280dab9c5dd11af0752168326f8e8d5e834ddba3bce063f011eccc8f46d",
+          "padding" : "3031300d060960864801650304020105000420de47c9b27eb8d300dbb5f2c353e632c393262cf06340c4fa7f1b40c4cbd36f90",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 268,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "e12e3540e7f20fb5533772e91b708151c12d8440ba9bc994791f5916d521726b53969063f9e13114ab89de0b0adf119cfaf19dd74a65b5eee32f39e69ab6776dba721adb2a8dea1495c51d5984b6aa2b5d216eb48459103907442f725410f53ddd5d006762dd3167c2da3bdb19f07d27e3fda712f444c093f4c8126d40ca7c381ab1d3875294df84055239ebac5039490b597366b58c2806e52f1f259c9ed16f829f41851b6ce7e390ea73251395bf940997d47bc323657160ede973f2342b91",
+          "padding" : "3031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 269,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "90ea80b14758fa12319e54c446e70bf5bede38f5d8d8e978531e6c54c567b63a0fb7b870ab963f979c4015c27714dc9292a48123c0a1f13896055f6628687040459488bca149f410cdae4249ef918f10329e902f1344a666fdf96085b7bbfb086ee2f4e5891904f945d867a50289da018c245be31b684bebb8dc367d43d53448865dc005ffd58e2f76f1ae8ac51fa7ad723db9bf3b78b82bc5b0e209ed216575009c27a6d46bfd1d9ba35fd50eaf4a39afd7b3dfdbd2f437d0d97b5b08e1870b",
+          "padding" : "3031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 270,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "3ebfdd69af2a561bdf4315d015d397b8af75f6c17a3e6e1c6b52bd6e812bd9112e1920f6cabd82b996b1b48be3aa40e447d29689be7dc64b8548ce5414318c4288a6ccee97f55c523661e629d3cb124b97a042c1e77a9b039a8631815c535c8216912ea47684a7220a63c198ef2b80568882e153be8fe92ae4c786a5fd56a1e64fdb235663f3a242c121e59df3a19c29282e647a5123583378577925f399560f6ad3b2a4c2b18ca2547aab5e3ed4030c6585fd2abd1d65fc720bb30354c966d9",
+          "padding" : "3031300d0609608648016503040201050004202f77668a9dfbf8d5848b9eeb4a7145ca94c6ed9236e4a773f6dcafa5132b2f91",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 271,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "7fbb42d2bc1c3e5a0f66fedd581e5ce3e555f6f1c736db24b6e963d2ba72118cc989e2969c21bede87ff3f4209f2b009263b7ca3716a9d3e7115dfe65bad1ea2a1013304696248dd2b1d70764dae248bd1e9d49623826f2c6640247cbe8bcda47d882e298f30bcf3db1f496c26b738848e9876e4b70f0ca8259760e919e5c5c0a2ce3d05b5804a94b67f4c719fdeb3ce23657a26635f867af0271736ba20abb7fff18bda006c48d9c3ed774365d00aa0340a04906fc07f00b18a572c96f986f5",
+          "padding" : "3031300d060960864801650304020105000420ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 272,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "b9b478f6ddabce2b1ffb306e2135132df09585be16eaa5182b8476796c10b0eecaff9b91100882f5872e00e3d1df2df40969ca4d00596b6d6c9c13d3a956dd8d91decbd3a48728aea05b8f7707414a8a5de3bf0becbc20ae0ba852ee7c4f2c177f3d95a4a8375ac50e11fd2be4da1f94608786fc84747117604138d06956387924e5d7baa2c97e25d1b0125122c0a13981559db80ac2d6848f4db163027c4484a51ac5095f5653b12059440dac69970b5680e017a7eb2861c857a607446b9420",
+          "padding" : "3031300d0609608648016503040201050004209432c1a7d343fcfacb164bdc44ff71c1281c004886b1c428419088d06cd3561a",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3081c90281c100d1060fe7c6d185f09c3c1865cf6beaf5dc9306f2f3646bbccf19e47fadf98cfda7716c797d15afe506d573f19163ae2ab0ed9964c7b125dad7841125d38dd9f430b30fe5ea0d24083cb9b09f241b0700821cb5e40dc781e72ed95a2a8cfd33da065c58db8b8166aaec385a5db04f473198fa3b27d4de0a3267b11769af1178d284fb9ca6ac2ffd03b940509dbf2383838d39e0d5c93fe29a6802e12716431e25965f5b7b146663f4e5567ac4c3edf8824913d26ff2dd03830c8a0645adb04d7f0203010001",
+      "keyDer" : "3081df300d06092a864886f70d01010105000381cd003081c90281c100d1060fe7c6d185f09c3c1865cf6beaf5dc9306f2f3646bbccf19e47fadf98cfda7716c797d15afe506d573f19163ae2ab0ed9964c7b125dad7841125d38dd9f430b30fe5ea0d24083cb9b09f241b0700821cb5e40dc781e72ed95a2a8cfd33da065c58db8b8166aaec385a5db04f473198fa3b27d4de0a3267b11769af1178d284fb9ca6ac2ffd03b940509dbf2383838d39e0d5c93fe29a6802e12716431e25965f5b7b146663f4e5567ac4c3edf8824913d26ff2dd03830c8a0645adb04d7f0203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIHfMA0GCSqGSIb3DQEBAQUAA4HNADCByQKBwQDRBg/nxtGF8Jw8GGXPa+r13JMG\n8vNka7zPGeR/rfmM/adxbHl9Fa/lBtVz8ZFjriqw7Zlkx7El2teEESXTjdn0MLMP\n5eoNJAg8ubCfJBsHAIIcteQNx4HnLtlaKoz9M9oGXFjbi4Fmquw4Wl2wT0cxmPo7\nJ9TeCjJnsRdprxF40oT7nKasL/0DuUBQnb8jg4ONOeDVyT/immgC4ScWQx4lll9b\nexRmY/TlVnrEw+34gkkT0m/y3QODDIoGRa2wTX8CAwEAAQ==\n-----END PUBLIC KEY-----",
+      "keysize" : 1536,
+      "n" : "0d1060fe7c6d185f09c3c1865cf6beaf5dc9306f2f3646bbccf19e47fadf98cfda7716c797d15afe506d573f19163ae2ab0ed9964c7b125dad7841125d38dd9f430b30fe5ea0d24083cb9b09f241b0700821cb5e40dc781e72ed95a2a8cfd33da065c58db8b8166aaec385a5db04f473198fa3b27d4de0a3267b11769af1178d284fb9ca6ac2ffd03b940509dbf2383838d39e0d5c93fe29a6802e12716431e25965f5b7b146663f4e5567ac4c3edf8824913d26ff2dd03830c8a0645adb04d7f",
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 273,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "6428e8d022f52b4a9307fe0f93e650e9665680d3c4a66194c6d50cf08726a3de45dbd8f24c9b5d4ad3fb6fad8bf3744d166742c6bb8cd690325e8eeb8d33e1303234d2a9ef9f12f8adb29a423279405dfa25d5bbbfb4255f6d739dafad66e4024fd413b16a167ea4cd66a75258c476e9f23cdf99346cecd6a51d44176346e6704e1f25fd953123716dca1eb8e2ba0288a38723f76c7b873299e34373fc2b18027500c26aa32c903389eed545b87061988f9e06effab524655e52103be7551fdb",
+          "padding" : "3041300d06096086480165030402020500043038b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 274,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "58c4c42da5eee1b757b31e3362a95d75180c0fee472c431527ff5500fe0b5c1d59968d79e6e41650f013a6b3e37c5a1d79233b818ef76c4ed469a09607becdc58987e6a548610de14ff06899ef284778dd5329a27b85072e8ffd46b63a5e8f7602ddb9fc5a07224c49818fc8057581ea36da033f2b936f0761186c7fd82b474e87d47aa1b7ec610642d3bcb16c59bb70ac68b1f081a9c9248f069474d6ed9b29c669fc40a979cdfc2053e1a3c0cf40efa29c01785323995f1d8f3850c32bdf92",
+          "padding" : "3041300d060960864801650304020205000430a5a2cb4f3870291de150e09ee864f3b2b3b342937ac719a149439185ad6a47bb4f23ae83ff20f0c8f0c79a1764244a63",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 275,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "62a81171990b2066d9c8a12d75b719b1d81513e9ab0a38ceed12c19835e8291db53045c6be238fb8a0a7daa974f8d0e10495c197c8d94b617a5e84982b849a121377a4deaff1c61f07365a4429b3aa90a0a475d3475e93b27254e1e0a75f49864287f2027f7b4c8c0f54ad69649c042e2445a5f131dc5d7878d7a040ac8499ef4208f3cf7b63863feb6fc3ae7d9e299ef5777b1d872cb19799f5097d456473760e5953a650a207f50f5dec349e71b848640930608208dd0745bc185d78284482",
+          "padding" : "3041300d0609608648016503040202050004307b8f4654076b80eb963911f19cfad1aaf4285ed48e826f6cde1b01a79aa73fadb5446e667fc4f90417782c91270540f3",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 276,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "af896fc432e8f0d10c082153fcfd95b9ad7c90fd1f757d3be4e57556553b982af328b2f3d96fdffa3d26a9fb58e011206f88bfb7dc453f8ecc1b8a86910f993e91a1f70e2d75311015d676ed9245f1a9379f4f29ef26ab403eb1e76184855b10696f5254f2b51e536df54c84189d1a1f97bfb56a3b7cd13a82d8c0262229795a3d2bd46f28c3e71d5ae18c2ab32b295477e3f0fb428c5278eea15622ec47efd731b78d747568757f82a943fda22d37d883d8daff25dbb168032b5b36e081ce2d",
+          "padding" : "3041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 277,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "a3c4eb3756805db479ee0aa802a9cccec9c9e146e736ed48b8739f2c8f108c579f1a16a71b7d222fd146f82292e78d254ec030b47267490927843c13005b88e2956550bdaab0e5748dafbbaa825425e9d83283a9a5fb086603ce00c8dac8f73dae249082378fcbdef763ef2f207047e9a9eaa35ce466e9569470f612c87292df4babe1d1446c55be5ab0109895afd337843eed2ca777f3ea1c08898fcb36e02674772d6dc3c71fbc49c897d05c81cf2aaef212dab088d9722db4033bb8f2ba56",
+          "padding" : "3041300d060960864801650304020205000430b526d8394134b853bd071719bc99d42b669bc9252baa82dcafabc1f322a3841c57cc0c82f080fd331b1666112b27a329",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 278,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "d0deb372624d4e1f64b9f3d7517fe2bc9407b1cb99ca0e6f641d5557935b4ce3e0e7fc88a75a8a6b39a7d03b9c9b43d6f5da250bc2c672ecad4f559a02f45bd6319d7377d305493264b17beca8ad93656a88767221113a30c8402794a920da9edc530a6649b881abfee5b92dc857332970973366ba05954d70a99f378e8f65e3c1586ec71f79fec02657bf6dc5ed82c835735af15ab1f305bad5c49ae4dbab4f6bb4a5c70d35ba779e01b85ef208d7def3d0358fbe9202923fd035d58ff36a06",
+          "padding" : "3041300d06096086480165030402020500043054a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 279,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "4e47d4cbe778a471ec643bb235fe9ef8d10398bfb2edfeeb9c9bc12caafe4031e33144be385e3adcd1609652f4c9dfe15f5cd6ba3ff38b34dd67c47c659473cb12f9b3905306d92405d38bb763474ad65e96b7f68104c1dfdd217ee56c912f42b054f16efe23fa8821093d8169826a64a77b86ef33061210280e3b4793fe540a09cb910f5a1f12a410b588c2793726999021f8880b7d9b83792ae9ed282871921a63976131b8aef855078787bf32df696458e507b1dba70d7422d4d37edbbdfc",
+          "padding" : "3041300d060960864801650304020205000430ae9ada2a808aca7097c9e9c30fba4ca60a5e79874a6be0f5afeb7f5df3538346f04b84ee06bef7ac879a0085bb2036c8",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3081c90281c100d1f33c4d0c3b127cfd4c711aef054e291cb9a9b7b769d6dfcea5ba02d99f0807ffb63f097ed7b5c5e2ad09578c749863a96a2bedc3e72738fe887a4a1fae6ca8c8e722c8dedc065a4df9f5c38e950175a7e0de9008f3a9a67e3413f9891e2f8a70b29f55dd21d2cba16f8e2300ef7c35ed1e42ebfbe70645230ddd8c067dae9069ae5f32937a207e0e7896e87fb399e6c93bc5bf6c2504fbdb3ecfc281f8da29115b2ec41eb9acc4176e311fe8dbcac24b57f8d656600e5fb4095eb4bf90b6e90203010001",
+      "keyDer" : "3081df300d06092a864886f70d01010105000381cd003081c90281c100d1f33c4d0c3b127cfd4c711aef054e291cb9a9b7b769d6dfcea5ba02d99f0807ffb63f097ed7b5c5e2ad09578c749863a96a2bedc3e72738fe887a4a1fae6ca8c8e722c8dedc065a4df9f5c38e950175a7e0de9008f3a9a67e3413f9891e2f8a70b29f55dd21d2cba16f8e2300ef7c35ed1e42ebfbe70645230ddd8c067dae9069ae5f32937a207e0e7896e87fb399e6c93bc5bf6c2504fbdb3ecfc281f8da29115b2ec41eb9acc4176e311fe8dbcac24b57f8d656600e5fb4095eb4bf90b6e90203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIHfMA0GCSqGSIb3DQEBAQUAA4HNADCByQKBwQDR8zxNDDsSfP1McRrvBU4pHLmp\nt7dp1t/OpboC2Z8IB/+2Pwl+17XF4q0JV4x0mGOpaivtw+cnOP6IekofrmyoyOci\nyN7cBlpN+fXDjpUBdafg3pAI86mmfjQT+YkeL4pwsp9V3SHSy6FvjiMA73w17R5C\n6/vnBkUjDd2MBn2ukGmuXzKTeiB+DniW6H+zmebJO8W/bCUE+9s+z8KB+NopEVsu\nxB65rMQXbjEf6NvKwktX+NZWYA5ftAletL+QtukCAwEAAQ==\n-----END PUBLIC KEY-----",
+      "keysize" : 1536,
+      "n" : "0d1f33c4d0c3b127cfd4c711aef054e291cb9a9b7b769d6dfcea5ba02d99f0807ffb63f097ed7b5c5e2ad09578c749863a96a2bedc3e72738fe887a4a1fae6ca8c8e722c8dedc065a4df9f5c38e950175a7e0de9008f3a9a67e3413f9891e2f8a70b29f55dd21d2cba16f8e2300ef7c35ed1e42ebfbe70645230ddd8c067dae9069ae5f32937a207e0e7896e87fb399e6c93bc5bf6c2504fbdb3ecfc281f8da29115b2ec41eb9acc4176e311fe8dbcac24b57f8d656600e5fb4095eb4bf90b6e9",
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 280,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "190497b9c697bc8571dea0e67a6594d1ad0c401904a6a8f6e44837452949b1fb2044482ada64df89978f1168d5caf866afd928817afcdb589ce3dc6ffc5d58cb76fb9edc59b7d9188ead57981e1acba36e21d76a668660fb7bbf6f0c946ccc86dc251855c2cc19de83d11aba1d2c465db713725c2014e48865778b762dcbefd40de78f624436c6a3d316594dbfb3b05af97cb1d19229b3cc29c9cc6df414ab963bf1d6fb4e50c82dbb1add6d091d5930de580a988e3268cc5716d86c90dc12bc",
+          "padding" : "3051300d060960864801650304020305000440cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 281,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "5259fe9566e1bd81952a805384b1657374f33550ee0895b57b7a0869a831270d3b3b2db8e295a4eb98d8eb036183b3d228ad22b8e493c7eb0f9ab00eeab2e086f10f8018a8daaff4858ae745a4d70881a166963c64403216422e18974aa456d8229ef2e43002e0390166630c7fabd14efaa974a9521a72a69e0b446971db077ce80f6dd95cf797b6ed276873bbf6b1ba6a79df8c917c2a3fbbc0e5347b0bb99eec6ad0b6bdb7bc9d3e0a7f6b7b623f2aa9dba1e940676ec5629d39778286f261",
+          "padding" : "3051300d060960864801650304020305000440d296b892b3a7964bd0cc882fc7c0be948b6bbd8eb1eff8c13942fcaabf1f38772dd56ba4d8ecd0b626ff5cef1cd045a1b0a76910396f3c7430b215a85950e9c3",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 282,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "288226f169838f352ffe409368cf03d840e0c0ac5e2c8d24471a924bab05ccbef26f202aabed9fbdaa33ae4a95de90e4196d92a72926971230f90a08fa68e51b326c9b5dde4b7bfe76766b0362695315846c2270a67e7c3f623367c87ce13670c8c778ba379b7de015a1b3fddce8d54825ddd22a8f88d89a43a0c5be784c1c1a1b920aa0dd31102a23d50e3874c411051f724a9b6181299d63db58dec0dbe667f7455f97f5abddc87cdd9d85e7e8139fa5e4ebd167aa8af8439934f34eb7f1e5",
+          "padding" : "3051300d060960864801650304020305000440c6ee9e33cf5c6715a1d148fd73f7318884b41adcb916021e2bc0e800a5c5dd97f5142178f6ae88c8fdd98e1afb0ce4c8d2c54b5f37b30b7da1997bb33b0b8a31",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 283,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "15eec15039b374bab3d0eafff08146e4ace24e67a2dc14dc6cd19826cff0ffef52f62210d5d1299ee482c6d39be0fc4544b2911af75a8c5fc1b57b658febdf094d4f648f82ac88717c14204e3a570b2c796ac3a2e3cab052c3ca8f5d39c5e5a4ce883b5aeb6a9e6f0b72d6ef7b8caaf75c4914df6a8a0e7ba6180ac639296d9e29f21b7b6ddc09ebd9559ce95d3fa27d7325a2c3e8c4dbe52f18036a9261a2f35c48e34bb5a137fd92549746b0095008e63d351acc66033f3c9b6623d2db976d",
+          "padding" : "3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 284,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "17f4a3294054ba76deb171fa60d4d224604082432b5119253bb28766aeccfdeee20fcd450fb2b1c76496d28f871b7d3b3b768a81ccb5313ffc37a25760c30d282c309fc929108ae743507edca29b594360c924c8f00f472bdb15fe207fc76c83d4160ec3ef502349f4baff23cf2c954029db4c68eac992447dc63abb3126c1b82af57472aa205c40dbd445f008e01dcb3ddf770fc0d778c3f4913a9c4615dc6291e29e0debbc3b02a82f0a52ed59f0ea19cced519cf037b4d6159cab53c23c67",
+          "padding" : "3051300d0609608648016503040203050004404fb472dfc43def7a46ad442c58ac532f89e0c8a96f23b672f5fd637652eab158d4d589444ef7530a34e6626b40830b4e1ec5364611ae31c599bffa958e8b4c4e",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 285,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "505ffc20f64d17502d9697458c58153b34bcf607a01dfa4fc77c89df2ec41e63f9b396056b76140c46b2b47d6535fea8dca0ba19395df2f7e7f2ba53d05c9cb4eb2e04d2a123747f15899c65cee85e794626e35c0f1dbd3e592904c0f0324e417d122a0adf401a0a5d5e7516d263fc8f6909c7ea7c984a4e3f1c9535e6a6e66d8d35689ced12049b4ded2cc93a5e6148773dffdfd1734ab55822a6e38a654a7bb82fecf83d5816228962e17bb8bf6f3108f0c89bc4430d67c38d648d7a17a29b",
+          "padding" : "3051300d0609608648016503040203050004401f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        },
+        {
+          "tcId" : 286,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "75627812c1b05dea5a309394dd74d9fad11a6776cbe6d8ad0936b343bdbd0b6a770ed1075676bf55cabaded9c6f74913e97f512dbda5b9ab0578b1f1dcfde313fd88c4c876252f4334c2d4752abb22c484e76237f59878b42d4d75843c93761ab3532295b6a26dec558fa6a65321d0f6f3fc88c8c21ffb8b0739de2459f1a3fe1fb9b71a92de934d86a8efdd0447885cfee91ed8b559df65d5b57276b5ae2068ec30f3dfe48371ea59fe487419c9fb3c4b58449c46553b497a2ddf7b30aa7a78",
+          "padding" : "3051300d060960864801650304020305000440aa0a2e60e45f276fe3aefe9fc07c6f2435f143ee2afd895e4809384e833be66a6396c839d6f7db83f37736645454c6e63712b27e70edcdd7440e1275235070c0",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f50203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f50203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwyzQ4UQf3ooolso6Ezc1\nvi0QEHd8/HOa/He22qZvNn1IdtzLMCH8IsJUUKaNbPsRkdSFy/ul7EW0kobXyuK9\nrlU/R+ELlPhnq8xtCv/HM7rMcl5atN4auhmjnXSLTBNV1aanEKUr0EwMJOe8O9q4\n88466G7LMcS0XhC0Ddtf3UDLJBG89bHTkuHu+VnP8nCabgKyD/O0NDZBpreFmVhu\n3JtnPZ8/Xp0znO6/lqGjFlWHbDn8sAscPlcZCMm3RHZQR6u1wj7MQuVR4TdV44zJ\noT4eArzV3OycMB+rdb4+Go7pxCmBYHq6eFX0u+dsjBYOgEaLVL359Dixd8M97jCw\n9QIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "n" : "0c32cd0e1441fde8a2896ca3a133735be2d1010777cfc739afc77b6daa66f367d4876dccb3021fc22c25450a68d6cfb1191d485cbfba5ec45b49286d7cae2bdae553f47e10b94f867abcc6d0affc733bacc725e5ab4de1aba19a39d748b4c1355d5a6a710a52bd04c0c24e7bc3bdab8f3ce3ae86ecb31c4b45e10b40ddb5fdd40cb2411bcf5b1d392e1eef959cff2709a6e02b20ff3b4343641a6b78599586edc9b673d9f3f5e9d339ceebf96a1a31655876c39fcb00b1c3e571908c9b744765047abb5c23ecc42e551e13755e38cc9a13e1e02bcd5dcec9c301fab75be3e1a8ee9c42981607aba7855f4bbe76c8c160e80468b54bdf9f438b177c33dee30b0f5",
+      "sha" : "SHA-224",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 287,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "19c576f191c273306ec6ee9e26c673bdcf3f821adaf13a0759df7787511ddb096e964f5dc199ccc5cf131f855065d6ff0a6c720651477d9026bed82d201f6e84a23b37725fd24f5b75aedc2afa24524e7222c0dd7c6d2742430bab3ec46d12204a94a533e2a9147723d087d619e07873a4261c420226ec1869abd70117c787d4b1827fe98779287451086354292bbb90617ceb391122efe70887710c5cb4549d163d37e79b33c1b336826cb53b648689e6da54241d20df822cf7770d7beaef4bb00068252786580a88cd00e93f5ef42b69efa7c364b98749fe734ee7bd13d0aca585d84e4fe4b29478697170280a5921278997ef9856f7372b6995d7eb43ce0c",
+          "padding" : "302d300d06096086480165030402040500041cd14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 288,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "ab2e758c8de97282a7ede3401680ead187cc08658be0041f108851149a9b9d2588d5ca544039533eebd0305c07f394504d91a578f5764267149d4ef70b88a2a3f8cf0b1061d06882af53a88bef195aac87294dc833d80f42d942f3a59bb242b187e23bb89a068bb4c8a215247d04aec57f81f75c14e711b5878b04863e715d0f359ad13f008b79342b7a4ca095fd021f639e8f48860c1eafe6fa19162c2632a2d3a05330d149f3ea6c9aed9f89fa3f7bcb2cf2a3d1af0484178710c21c046a812f3b8d68027173ff5aeb1ad19ea6639e2d886eabf8149a8fb491d2c36ccfc4da2a9785a992046f24a93d2dd7765a171cd8ecb68b94ee70b0e5bf791967267251",
+          "padding" : "302d300d06096086480165030402040500041cbd4f57a4cfb1649cca33372f5c5ad32b993ff73aaf4fb75d52798480",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 289,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "61c702c72b0177ac857e52707c1a40b84a1859bf1d7d1cdbda643f924e8bab7c3d3eb2065aff837e92f93836fd54ea52e085e19cb0cb59fa58afad48480c2dac579315340883886e78456ce750fc55b6c188b716bda7957ff547222f0cc1462344de4bf078ec19f1ba5901a0e5f40d93dbae4aac407834b272a2be82c8da085a3e1e9e0a57d3f43d26462566f0aeade04ee8981fec8d7e34c916fe78c0c5c43781bab2fecab654fa55ac99182545d0ddf070d41f67efe0737d8ecab3411720c84862606c8e4b53e60faa1c9a98386e92b03d676b53e3fdbca3bdf0187ddc50086cf82ca6052be55fbb7f3bdb6c6c0432defa5634797c23b494c3880846169b67",
+          "padding" : "302d300d06096086480165030402040500041c3606346815fd4d491a92649905a40da025d8cf15f095136b19f37923",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 290,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "965f82f0649a338ef14387a7f3335b9e2d5d3b4009eecfd26c0110344a30117bde6bad668cf083beb28242460fbb96adf9754b9a4d4505f6412e677bf3349868fd5b5268786308a5293f2cb2f7ffda76104351f10381e504e72d27435d5bea0517d20ebec0afa531e520e5fe484475a330a40ba1109c204fabc44ec099878a5e31342a650047c299a5f2322f057b9586cd9eebeed1f3d2d94aac24f9d7b2f05c6f28bc49cb2b00f5e56870fa099cfb2c3e276381adf5a030ab6ffd9cb96fe309061d44c2ca5ccdd76a69458be561e3f0ef603ebe9ecd533333584236970dc7414124ace98357c496369bf94123bf0d4e57b03aee567c2f83a9e6378e62a42fed",
+          "padding" : "302d300d06096086480165030402040500041c753bb40078934081d7bd113ec49b19ef09d1ba33498690516d4d122c",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 291,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "105c68d221aa579ab6206d23be01d0c91f98fb67ed8d2044b6278916223758aa346bd6d5c7282d23a2bf702e0facdfb884e0b389202a5073a715fa80158e31d1e3588af30d2fd8b61233499ab7952f0761c84912b700fec807937d00a021eaa84d96f59760cc7733236138cb4ff1fb04c7d4621331b5c729f9694555b6f9c324e74db4a7a8b72f2853dfd0b9fe63759b3468bc66017bd6c1aada2070dc8643b5e581f12cad170d9fe754c65dfd0a5925cfe846a8413d729103e9d7e8825affc20f477d5bd3860947c2665ca4170fc44f2670bc33b51d42e5df78134919bf4660cfbc092c1cdcc09c8fda1ec9383512abe253cd1a470271832e0c7de5a6d9a7c2",
+          "padding" : "302d300d06096086480165030402040500041c3dc6a3fd912b08bf15170296c4f1694f512ffa1dc9bddb8b9e1c8d38",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 292,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "3662fc9bc91b00d457bce2fbc667dbb31ce7fa451acdbad95b4b418782b8af67d2fbaf1424be2c99e95e2637d8d39e751d757f89711ae165fe5bf142fd88b284df696e948ee714e3f2062c5d01d04bb6c0387aa5ff1511552dd066bda861e1c5cbfe73dd8c6bc3039b729c700c8f297f48ba2a36aecbb626b5c9f9b3c04102f55ee65ef5477d8d1d14d9b7b048cdac54d7239177e702d0629d3617de2a9fa556a6d4ec37fe38a46b768e39f1d8a380484ffe0cef59abb7e20ffdb7c11b14a42ee3cedda99ef9f71eae7cf760fd81172e03a3f2a9f7e42a813db3b089c11528350e93b131641b8d023d47447f58aeb9f3f38760df8a9b1ad4b8d43ba0c9018e02",
+          "padding" : "302d300d06096086480165030402040500041cabd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 293,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "8392c4d888e7c63ae2a3d53d560ccbc226dbb1d9f69100fd86a19ef30a83981371169deb4ef87aafcfb4186c5ebf8d83764470acc8c9cbe36a9b15037e25b1dfc63e929b0bb3891be2d1804b8c6a0bf65891943e4c0fd21e7df55c134dde69682244d22510dac2b304c10a2e31adc134ab27ed186568fa9091df16f1c9f4e7044ddef6675269de710774ed124b52fbac9bed285b4be5ef9f2fd50e1d95383e145553762fb87a1da173b8b89a7eb9e947d08b5303ef0992bf4e3783c30253a43b373d90a75bd52fc53ee4fb86bfa1bad035a8177f8c0a9f53a6214ec950c2a07cea7f908c55c24dc31799867f819af18fa30f304ea001ce9cc87eb703ab578f5b",
+          "padding" : "302d300d06096086480165030402040500041c15a322a18b35c3afd3937b5ac133fbd8d883d300a29ed9d9e2b3d601",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d50203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d50203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAorRRoH0KpfluRVZxUTVQ\nUUqKW0YuvvcXCU+h/ugiJOY3+XRtP3yv0xh42AMltu9aFwD2WQO0aUKeidbqyIRQ\nl7WrOTGJ25JRLtincRoSU/rNIPecFegkfz0+QuRuSMmOJUov6XZTE6A+/48X4aAp\nOXofomqNzib0kO2BKZYV2YFMItphBCjgnH2WWFlCZvXAIdD87KCNlFoSvoLeTR7O\na0wDFFtdNJXU7VQR64eNrwX9evw+Ca2g8RJkIvWQl1oZaYFvSGmLy7obTZyuedRg\n2Pn4Xnl1AF2bwixOWsD3waRdElaaYoB9O5oC5aUw53MGb0U9H1tMLpz3ggKD90K5\n1QIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "n" : "0a2b451a07d0aa5f96e455671513550514a8a5b462ebef717094fa1fee82224e637f9746d3f7cafd31878d80325b6ef5a1700f65903b469429e89d6eac8845097b5ab393189db92512ed8a7711a1253facd20f79c15e8247f3d3e42e46e48c98e254a2fe9765313a03eff8f17e1a029397a1fa26a8dce26f490ed81299615d9814c22da610428e09c7d9658594266f5c021d0fceca08d945a12be82de4d1ece6b4c03145b5d3495d4ed5411eb878daf05fd7afc3e09ada0f1126422f590975a1969816f48698bcbba1b4d9cae79d460d8f9f85e7975005d9bc22c4e5ac0f7c1a45d12569a62807d3b9a02e5a530e773066f453d1f5b4c2e9cf7820283f742b9d5",
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 294,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "840f5dac53106dd1f9c57219224cf51289290c42f20466875ba8e830ac5690e541536fcc8ab03b731f82bf66d83f194e7e180b3963ec7a2f3f7904a7ce49aed47da4d4b79421eaf937d301b3e696169297b797c32c076a12be4de0b58e003c5123051a84a10c62f8dac2f42a8640008eb3c7cccd6760ff5b51b689763922582845f048fb8150e5a7a6ca2eccc7bdc85349ad5b26c52137a79fa3fe5c29ab5cd7615013219c1941b6708e9c3c23feff5febaf0c8ebca5750b54e3e6e99a3e876b396f27860b7f3ec4e9191703c6332d944f6f69751167680c79c4f6b57f1cc8755d24b6ec158ccdbacdb23107a33cb6b332516c13274d1f9dccc21dced869e486",
+          "padding" : "3031300d060960864801650304020105000420e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 295,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "8a1b220cb2ab415dc760eb7f5bb10335a3cca269d7dbbf7d0962ba79f9cf7b43a5fc09c99a1584f07403473d6c189a836897a5b6f8ea9fa22d601e6ba5f7411fe27c638b81b1a22363583a80fce8c7df3e40fb51bd0e60d0a6653f79f3bcb7ec3e9dc14cfb5b31ab1735bca692d50ac03f979dda92747c6430f8045efa3513ba6e0ce3e9e35570e1c30c8ebe589b44192e1344ca83dfa576fc6fdc7bf1cd7cee875b001c8c02ce8d602769e4bd9d241c4857182a0089a8b67644e73eef105c550efa47a40874289395ac0c4e02fd4ba98e130a4c2d1b95521c6af4a002ac3bdc6e52122ae4c08cc3da1c896e059acbddec574ac0432f6103dd97273d8803c102",
+          "padding" : "3031300d060960864801650304020105000420de47c9b27eb8d300dbb5f2c353e632c393262cf06340c4fa7f1b40c4cbd36f90",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 296,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "264491e844c119f14e425c03282139a558dcdaeb82a4628173cd407fd319f9076eaebc0dd87a1c22e4d17839096886d58a9d5b7f7aeb63efec56c45ac7bead4203b6886e1faa90e028ec0ae094d46bf3f97efdd19045cfbc25a1abda2432639f9876405c0d68f8edbf047c12a454f7681d5d5a2b54bd3723d193dbad4338baad753264006e2d08931c4b8bb79aa1c9cad10eb6605f87c5831f6e2b08e002f9c6f21141f5841d92727dd3e1d99c36bc560da3c9067df99fcaf818941f72588be33032bad22caf6704223bb114d575b6d02d9d222b580005d930e8f40cce9f672eebb634a20177d84351627964b83f2053d736a84ab1a005f63bd5ba943de6205c",
+          "padding" : "3031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 297,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "1758eb94588e6fc4f50c1be1afcaa41027869f304cad513b1fb12c2f446d63cdc05c4830a7e3e630da7b2da4f7867cc173bf6420f9732277282596de41ded32e21d0cc31441174da8765f57419c7764ea758f55bc17646eb100c435d1ac0eed6fc7ba6de5f832094ee2f479979765e05ac9976788db3c241a9e32a0da864f0019a87646ba623d63f4411af5dee1be9ec488c7e3e1b231479de70b9ac5f78a17b1f4120aece45f26c07e7bb345fdfeb05e14bcaacc614672a465fc523624cb19f66f9c6c3f642b832ca44cb25176d679f0e05606c3fed022cac24c2bf960a406d48818e3eb7ed53b0446032469047dfed95fc18088c92d91d93722c47f88163a8",
+          "padding" : "3031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 298,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "513a5abde16b5e0ecb8659d3ca0845800adf75cfc4437d42fa34e7aafbbe35fc5984d3560cba938f9a622e932bb6162b7fbb6cd8c1cf8815f28c495995ac18cdbe8fabfdce29c17aa021df192ac02d080d7c5eda6bd4c99154178a9d5e1cf3ff4177106315f4e6d74c991b601069acd60b55b3bb4dbf6316c35096a487d6756181d3394944f1c742a2f4d608ce4f6abbfb72347ad7d342ae15dd6d1049fbd0ff55f4d7c43ab805f81ff1fbe9256b5c78c2de6beb787f4b6d66d290a3d4c4857368aea5f7ebaa1296020c8f9e3670441a08038bb810e853a654e44316a4e52428745123ce2714020d00e55a9eb82f7fb41c73d852a82b003670246c6ca2045fc8",
+          "padding" : "3031300d0609608648016503040201050004202f77668a9dfbf8d5848b9eeb4a7145ca94c6ed9236e4a773f6dcafa5132b2f91",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 299,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "38c042a00d6f27742a46f1f963a7b2e04f0eac637849631a491b8e4e58fc721c6ce620d5e705dc8e73409c3909c1c68b6bdb2b30f882cf2797e65030b38c4e7daf6fef9d1f115c890086cf54ca3e7c2b21dcbfd1250ed1d925810970f17dbf482d1784f296adee9ace6979075c1e12f5580cfb322e8737db9d127d38e1b99ed87ec49448a18a6fee650d3c27e4a2a86a3d6e3ce4fe64120be60872fa07a3f78a112715c167fb6c900698ba1afd824087a4cf733335c4a6d5120e3b29bc42f3b3d5db79973e4e321e0910a288d18cdba172d060283c4f4c6656e9175a18b756b7d06251e9060bbfcab04978853eec6032850a0e757bc0c61ad38aa4eb6bb6d907",
+          "padding" : "3031300d060960864801650304020105000420ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 300,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "2ae8d95b19cbd64d0e343ff413fffb85d8e6713c06ac8a1ceba7f3924fa740f8d2b3e120fd71f22711e795cd6468c5e263b1a5ba6ac6b8fa9e23d2d6e7243f510592a61d134e68b8ead00612dbf38c5b7302abc3bf33f23e6d4816a6e3ddcea6482566e84f57464f7d56de4cef0b2256ef21874dda4c131a47292ff8ef853f93804483c8e6373d39ca3a22552e75427b812b861de6a310ff4c366f6f6604116efd9770170aa423554c4ebbd2b5c0698950e66bb5b7c5c346285d9f5c35146255736b6e818e8e77983c93b21e7f60b04a7a525598e7fd8049b181000bffc7f3753a504370f6bb70617ac8e914deb05a198a5758a459c9fcd2fce1aede48e8a852",
+          "padding" : "3031300d0609608648016503040201050004209432c1a7d343fcfacb164bdc44ff71c1281c004886b1c428419088d06cd3561a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100bfb1873c3e85a383b14c36fc0a630c7c4ed51a3b7c8fe752fdee259cca52634af4b9276395e58381bc018bd6ce37204df140c557fbc52852bdfbbda31596c63574367ee273acb06164210a6a3193d3da6a720430b89e8c829c4bcd08145282fb295a84809537f26a8e126612c57a605ca2b33ed0674aad19914e0cab73daca6e018735a33661b3994726e5158e0390fdbfe2ad1fa27216e8c2a4b77857a95f99e2d35326438ba9fa0ac119fa930a817273299f6e49eb65ba4f521e1d50c440542c7fe3f7487618ffc4693010e0049344d465fa57dcf999ab6b42e7011571a9bf6d7ac3c84344da872e9ce3a8ab5682ce206bba31299033161168700eed4f62750203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100bfb1873c3e85a383b14c36fc0a630c7c4ed51a3b7c8fe752fdee259cca52634af4b9276395e58381bc018bd6ce37204df140c557fbc52852bdfbbda31596c63574367ee273acb06164210a6a3193d3da6a720430b89e8c829c4bcd08145282fb295a84809537f26a8e126612c57a605ca2b33ed0674aad19914e0cab73daca6e018735a33661b3994726e5158e0390fdbfe2ad1fa27216e8c2a4b77857a95f99e2d35326438ba9fa0ac119fa930a817273299f6e49eb65ba4f521e1d50c440542c7fe3f7487618ffc4693010e0049344d465fa57dcf999ab6b42e7011571a9bf6d7ac3c84344da872e9ce3a8ab5682ce206bba31299033161168700eed4f62750203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv7GHPD6Fo4OxTDb8CmMM\nfE7VGjt8j+dS/e4lnMpSY0r0uSdjleWDgbwBi9bONyBN8UDFV/vFKFK9+72jFZbG\nNXQ2fuJzrLBhZCEKajGT09pqcgQwuJ6MgpxLzQgUUoL7KVqEgJU38mqOEmYSxXpg\nXKKzPtBnSq0ZkU4Mq3Paym4BhzWjNmGzmUcm5RWOA5D9v+KtH6JyFujCpLd4V6lf\nmeLTUyZDi6n6CsEZ+pMKgXJzKZ9uSetluk9SHh1QxEBULH/j90h2GP/EaTAQ4AST\nRNRl+lfc+Zmra0LnARVxqb9tesPIQ0Tahy6c46irVoLOIGu6MSmQMxYRaHAO7U9i\ndQIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "n" : "0bfb1873c3e85a383b14c36fc0a630c7c4ed51a3b7c8fe752fdee259cca52634af4b9276395e58381bc018bd6ce37204df140c557fbc52852bdfbbda31596c63574367ee273acb06164210a6a3193d3da6a720430b89e8c829c4bcd08145282fb295a84809537f26a8e126612c57a605ca2b33ed0674aad19914e0cab73daca6e018735a33661b3994726e5158e0390fdbfe2ad1fa27216e8c2a4b77857a95f99e2d35326438ba9fa0ac119fa930a817273299f6e49eb65ba4f521e1d50c440542c7fe3f7487618ffc4693010e0049344d465fa57dcf999ab6b42e7011571a9bf6d7ac3c84344da872e9ce3a8ab5682ce206bba31299033161168700eed4f6275",
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 301,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "446e7cb43ba8c5fc5835f35f764e183fd54cf26e406149343f1346aa2acd215a6e1f26b9af53fe165c81429f6dd69e422ef7f0930c750ce0a79d1bc8491c0df320d81cc57606833d02f1c82e3c55d730e982e29e3c59fdad24d3910d8ff75df99cb3a67b8bdad00f7dea293f98c90e812ec182132b257c65a328ccc3fd203eb1b09181f50c6b4a8767071bcbf9c08c8d7fca99f80476975cd6e6509014cf4215475435fb520bb7374886c5664577092ee47a6460396fdcc8c7450c3b87ff9a951a8cd6e7209d762350157f7a7f8d6858bae4aaf13e38d2d06a7b10dbf96ea2e444ea66c9d1c91def798abe927715ffcce2d4d18f34b23ed6bcfc2aa79327bb80",
+          "padding" : "3041300d06096086480165030402020500043038b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 302,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "51c1c99864e703b875e3e1629a7227d1d777e13d12968e28b358f5fc910cac6c836183aaad8baace0822a9468539d476a8a1a8cb2fad7486d400b11794ae38ec288f1e6e0c76e3616601634ce4286230625dd4c970ae97924e5a2982ec6be8cb0bdb6dc62523999cdcb8408e1aea3048ebe020c8c86db2f9b424ba1b1ff7afebc775b76725dab5a521e06d7ca876ffce9c6ac210459d19b65f9a7ae96a6febb352b500d2e2723dde3ca2c1a073cdfd99945fb521e8ebeb1e8da1c382c3f4eb73ccd5e6af07ad4ba647bbaf6c9435040de3924dc25289eb87419e367565ba105ed7747468acdfb3654fd3a2da7fa33f26347f0efce04ec91968c03bb6153a333b",
+          "padding" : "3041300d060960864801650304020205000430a5a2cb4f3870291de150e09ee864f3b2b3b342937ac719a149439185ad6a47bb4f23ae83ff20f0c8f0c79a1764244a63",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 303,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "623c0920639c8cdbc0f0190a9488ac6996d36d4fa4c61019ac5347da64862b3bebfdb112365d0473d32736dffad9be3a24acb57d1ec2ef7a41fd8e972a70beca630867ed6052b76c467c86c5851db0ed0b898fbe33cd79a000ca529eaf07254d979140d0a1aa43f1214fe13876483e80e96f1d17004c89d598d359e11764e0c4b0491e9c52345aebaeefe484f9ba0c9b5ea824e267f1de9f75b882c0b89888718a5dbcaa0966ccd0f2e7243e794e33fdfbe0569c0e975eef3ba50152db5292d36ffd6f85bfedb6abf3c65e6f789a504dfdaf003facd1f16c66c06a79549552109d55c1bdcbf0abbabf7cf2b6a8bbf0065fafe41e029f783d69ed61360cbffb01",
+          "padding" : "3041300d0609608648016503040202050004307b8f4654076b80eb963911f19cfad1aaf4285ed48e826f6cde1b01a79aa73fadb5446e667fc4f90417782c91270540f3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 304,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "22a290e37fa590f3e164cbd7c211faff31e43ca0abe1f5d6f6b33bf16fad3925b0f9c41c9d847d9fc4cc9ec1816bd133f916f8650c2d77f482a753e7b8e7e2693bc345895de467f17690f8330d2212928d9090d34802020bf73999197f70896afa9ada4f353d438b6a0c809f74c28e65d2431f3d0c50e1d536fd3efcb6eb8327f18f0ce3964eb39100531f73a51b10a42d5bde73969630727fd74fcdaeb2a49687e344fedb0d54d1ddc7070aac0b08f4594b0f9e7e4c3d18b9ec24e20e957eaf861753ec6a2de28de823e2f4c7ee3d6d42a5f5480b4e32dae97f802907248bfb29dac52f24ab1009c3d0ae13c4ad6bed1e575aa86ac9d69ddcfc771df7b890ff",
+          "padding" : "3041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 305,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "0c9ec254a5e405d6b33be22985471c75b6b66158ec73d1dec8bc54a25d1036baf23e902a9ca025732d6cf581a7eb0cb59aa7fcb27c99c5ce5146a59627e5453faca300a0a5f95d9d55782bec4db4e4b2acbcad85d222403996f2f05552b8abffe11a1b517deb4c25e39ca38cc53252c987bbb992643c4c280ffc71fc87cf776d94adf3d2cba279df2c2021f68bbd4a87ea6045068cdae95a773c1e7f1066d37e67b91ac7c5d7850a25589b8bc814eefb30547f847fe9135aca321c56291aace07ccdec8a5848c7a80c419aa35ede36f50d6f1c593453561a46c4d767a7cbfafaf1d448c5ac118e121c0d06045cabf171fdc43192bb7b30449467ba95c671d3fe",
+          "padding" : "3041300d060960864801650304020205000430b526d8394134b853bd071719bc99d42b669bc9252baa82dcafabc1f322a3841c57cc0c82f080fd331b1666112b27a329",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 306,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "ae7836c86c23e8b41ec2cd750838e78c5de9d8d54e74e3985c88a7380446d4fbd6366925ce5dcd213f46bf2f5f6de2cea4df015f2cd8c2c3d71b7adc743d1d045c88598c0b1ddf1bd734c2fbcfb446c9ead91ec468ffc37fba4f948fa950ce6f70455907f34d76f6a68e7b4d7bf2f805384fe2c0128eb3418f804a87d96c2968d69d3487e2d827cf1da978b0c723b312ab65bee05e01245ecba28ed45f46cb249641be080a3b35a3f1925997f52e774a3a509a384dc7f66f28d6930f8ef33704da53f582305b61ba234d11148aba024c1dea63fd74b6f34e4375a130975f7bd257df5184573c426910d3930a902e1d05975ec45042241f3322c34f4a697c429a",
+          "padding" : "3041300d06096086480165030402020500043054a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 307,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "8de7393e352364d42d6c45ba249cf557d61b6283558384000b7552267acfa6ec3607d550d37b63850f4e734adf90608b76ed05a74e97fa4e8f42f79a14dae885e1b02d83a2707241518295e5844cf6e7dcd418bb935aef3bda8309eaca38afecf80e12fcd256b3ba724f7012729c1cc2b5ad36135877b4082b718ebd10212f19e45f17d05d416267a67759392b58693d093cdb2747c4c06f2a102e164e9498f83111ca97250a89dfb9eada0095062b90f2c44442220e4ae04738d7a76394e3ee859497224c33b92866941d171355017bc5ccebd61ed9234963fb63acb6ffb6571b1b20ff806a7050ecb14d48eb745c9acdc95d102f62455225db05eca49d4ec8",
+          "padding" : "3041300d060960864801650304020205000430ae9ada2a808aca7097c9e9c30fba4ca60a5e79874a6be0f5afeb7f5df3538346f04b84ee06bef7ac879a0085bb2036c8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082010a0282010100c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba7490203010001",
+      "keyDer" : "30820122300d06092a864886f70d01010105000382010f003082010a0282010100c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba7490203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwsSoYCNtPJCWoHbWulEH\n4Pe9geG6kW9zdXJL0rCwtjlWgTcVo0V6sEWLcfs1pFsn+e96w+V53qRd+/0HgZ7W\ntwIapTNsWEQqrdlsqe6dMkc+nZJ4VitNECWK3mqY+xx8/cOzcW713sWM9zs1nziV\nmbS1hlqYY1GesAHDJDh9p1VFDbNBMJNg44B8BWW44sRPvV5ujQTQBtfudouOhDYI\nKpD6DoN/MvRgh6tKDZviiqfaF5TOsBcqf1DtIPbfZB77y/0qrIl3XHYacxAJPGcc\nl3+hiw1uAfsl96QytCxlNZeExokgVxnBz246Zdri2kNMMm3egbtv//vb9t5cFrun\nSQIDAQAB\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "n" : "0c2c4a860236d3c9096a076d6ba5107e0f7bd81e1ba916f7375724bd2b0b0b63956813715a3457ab0458b71fb35a45b27f9ef7ac3e579dea45dfbfd07819ed6b7021aa5336c58442aadd96ca9ee9d32473e9d9278562b4d10258ade6a98fb1c7cfdc3b3716ef5dec58cf73b359f389599b4b5865a9863519eb001c324387da755450db341309360e3807c0565b8e2c44fbd5e6e8d04d006d7ee768b8e8436082a90fa0e837f32f46087ab4a0d9be28aa7da1794ceb0172a7f50ed20f6df641efbcbfd2aac89775c761a7310093c671c977fa18b0d6e01fb25f7a432b42c65359784c689205719c1cf6e3a65dae2da434c326dde81bb6ffffbdbf6de5c16bba749",
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 308,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "b03dd72dc84b305ea811267a489aba10a1dc54b59f92e58546a2f0b6883f543512d621951352ef12abafe4bd6e10c2e5b0eabbbbf1d081b66e535fc9b8ad379040c3c71ec8f2b4f5d319f5d2a0240a767ddb4de1fbc878b2c5e8e1e260217bbd70971789fedb8c677fc8193f67e4637239607c7b9d3511868ccc0df372374abc685c9b4b74b2c5f11758f809b19bb3b5c464db870fea61ddfa5e18be2c4106f3e165fe85a7f8241db2806d0fc3c45d8a7f1eb4ca411a46ac411b81c04fd8c4ced5eff497da6bcb8e2fbe1f95cf4c3e761fc3037c82276f7ebfb7e6cc8534cb4fd34192074f580c6e31008df4f1404ae8dbcb111503d4bdfe6e7107a1ab5cd8c6",
+          "padding" : "3051300d060960864801650304020305000440cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 309,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "4de4dbf82607b36a5c6778ae6351d83b7ef5b4af64c3788889eb10ef1838822847ceb531914392360b92dee055796f73e3cdb8b3d50910a537dd2244fd7f922780356ea3f01e99e5bebcb1b6ef398d2399bd02472a871417daec3bbe6f89f45f1af0bf819a446dcbbb75c56958d34ba27c8120cee6ff97242921ccf58de9216995fa0c49cb3e6d60e46411b2df3b01b78fa81ca145ce8be594ee009031eda672eb097ba5ed6687a703b154ef616757f94237f4275f54738cb59d36b20a9c84ae133bd715747952f0222573a91faf740e4b7eb4e88abaa91004e72a1709b401616b2edb2784e491f671fcf5ebe326b669facaa5d8a0f6f8469ea995c4db772f06",
+          "padding" : "3051300d060960864801650304020305000440d296b892b3a7964bd0cc882fc7c0be948b6bbd8eb1eff8c13942fcaabf1f38772dd56ba4d8ecd0b626ff5cef1cd045a1b0a76910396f3c7430b215a85950e9c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 310,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "a0f46582cde6be215351bb7b29e8ff24398816fad9e7e2ed6ccf1d0b5296bad827316c18b1565253291fa1c0baea9a735357cff8920e1024ae5707dd2f0cfcc9e6cc81402217d9b4f51e10def2bc2f4924e7d22c022fc87d6c3e772f4952050d027b003ab4267ff227a15cc7c884cdb46bbc7eb38852d0e6d8a12f485ccb0312157097687debb6feaf2b6dac998224c6047c1d5727195bb8ce05a59669034e88de0e4815af00c65def5b9748d017455056cc1ac6d3a77e31fcea4e726eda6be7bd33e509696e54d1d1858a1165fa9ece5d62e493c1a33ab3c94d294838a19f367fb799d6b69161bd9532a6ef317deb919923d78e33309f14a97b68023d600b4d",
+          "padding" : "3051300d060960864801650304020305000440c6ee9e33cf5c6715a1d148fd73f7318884b41adcb916021e2bc0e800a5c5dd97f5142178f6ae88c8fdd98e1afb0ce4c8d2c54b5f37b30b7da1997bb33b0b8a31",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 311,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "9922f7bd01d7ba6b2de255b91209631af92e5537a4554b3b7a50e39f2fe9b6085a7e418084213d445794ebc19be43782d9f80df1daa7498a1c67d935ec00dac6b7a194033a14431320acd1d7f3d4c2b7b5b1649dd93931c49f538c94e34f44fdcb8dac9d31539f87e6720dc887c6605284a6a0408e244325e35917b1e1ccdf5959ca87091827c8157bdaa31239e2103ca8a112cc76a8e7e90f352fb8cb3a3381e52cedf4d4188bf881054b80387605e7041ab149cccea1ac2bb6560b45000601c33ebc31cebdd499c0b8fdafa7c1691d6dcc48edc98519d55d126a757b2a753eda4f2bf35cb191face371c9c34b2ab57242053b9ecddc91e4b621e650432adc8",
+          "padding" : "3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 312,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "99996fc01a53bca03382b96e9ad83a3139bfacc5d37b180a099fb5d515a7b78a5c21a339ae6bd2bee8e0f503ba2bf892c1885ad5f4940a99d8d49df6f4623da16c337a011fb895c006100286aed82977be3fda054d1e935a872939b704750c3e2871c33768946e65a737184efa50060c6898247a6472854884fdbfc2533c936fe9c922d881bd5f093851b46693cf633e25f27efd6db65da3ad96f2e8154ac39f2a9859f15c919a92c8cd22285c1f9e87444e61769f6833bd0d56106f87825e472e59caaca1fedd8d4065fad9dbbc252a84c196bf5d6c40bd8660600bc6c825bc7470aaf4ad118c6c139a5c6fefd5223ef490d4afa6c06269ea8c0054aa1f368d",
+          "padding" : "3051300d0609608648016503040203050004404fb472dfc43def7a46ad442c58ac532f89e0c8a96f23b672f5fd637652eab158d4d589444ef7530a34e6626b40830b4e1ec5364611ae31c599bffa958e8b4c4e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 313,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "7930ceed4b191365ccac54cc8a5bd38498c0d0c1fa5a862b6c0744edf9bf1969ec4f3c7c42aec737438acc797b8301aa8b30be2a4a4c1323be0427411dc8be84881036e9062a55fa2334176049305a44b97f90ed0b3becf56f8c9f164ef0bb45729f9fab1d459f690c58f07ef5ef89f21b15da14a235f3012e6f83a7f226e118d3b7fdc9356c39667e1cea5c667b54ec5ca6a0d58ad933484f447c670e5bd3647361c81831dc710360a90692eb7e4a57ad225b2516d9c3bcc77323a9354d1b92d0b3f5ade911f5faac4e4bdbead32f3349840ee66f4010789a84f0934182c2b0cb7d6e72e2b2a6839d03d7c9f681bb7148449161ed50b4466d60002cdb7492fa",
+          "padding" : "3051300d0609608648016503040203050004401f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 314,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "16b5ecefcd0167682fbb3601a016bfa8bce9dd5855bf305ff00b45d97e50fecd27716997c37ebf8efd8b269558385b3ecaf2b6e38313508a7a14546107b75afb450b1a0e39cd0760151b666451bab43d7fdbd93771e9d98152ac889bf1abbe1c3f62049c4735602ebd6a90a0361dfa08417ba03c55fc6b7bfabb136851ab01eacf528abb1129bef47f2b04e2aa24c0341720f728bc9fe12cfa5d4248976aaf7035d19c18302fb9ae2443286a71198b500034d48113b705c83e64561762c583dc013cc099c7e5bfecbfaa7b971c8f1a4d3868fe0a4ad518372ca68c65bdefbb726b1fd92ad92ab739d2bd1af97724dc076ba011a9f32db3979ca4cf94c5370b77",
+          "padding" : "3051300d060960864801650304020305000440aa0a2e60e45f276fe3aefe9fc07c6f2435f143ee2afd895e4809384e833be66a6396c839d6f7db83f37736645454c6e63712b27e70edcdd7440e1275235070c0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082018a0282018100c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b12030203010001",
+      "keyDer" : "308201a2300d06092a864886f70d01010105000382018f003082018a0282018100c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b12030203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAxv4jeSVmAjwmUofFrG9x\nVBwJlNEdBZ7mQDmG76IcJLUb2R2IYvnfeaTjKOPifIPfJgslqbQ0IK/8RLUejXUl\ntvKcNypAUQRzIAdSemLtgvrHP0iSqA4JaCpBpYzTRwF/O+fYATNPktkyGq/VO1G/\n+r/HUs/Mrgse4Dva/55CjMHBF/GslrT+I/jCPmOBGGpm/VkokzmuVcS82tv/hKva\npTIkDU4dKLLQSB2t07JGVXyo/hgJKBdzCznm7jeP/MhbGf/ckWqbmRprZtSpx7q1\n9eejciEBFC56QQjBXVc7FSieB+RurqB7QsKry6Mw6ZVUtGVhZbtMDbK2OToH7KV1\nxRqTxOFb2w90eQlEfj7+NMZ8qJVLUw5WogobbYTUXtG806pY7AbxhO5YV6qoGeHM\nqaJvTijWuXfTORbbmJbSUtGvp2Lih8sNOEzHW/5T9Oki0C3QpIHAQuLTBrSzwYk3\nHldbJeAAWhZM9p3Ql25NW+R2gG6mvmCE5xq09axcGxIDAgMBAAE=\n-----END PUBLIC KEY-----",
+      "keysize" : 3072,
+      "n" : "0c6fe23792566023c265287c5ac6f71541c0994d11d059ee6403986efa21c24b51bd91d8862f9df79a4e328e3e27c83df260b25a9b43420affc44b51e8d7525b6f29c372a405104732007527a62ed82fac73f4892a80e09682a41a58cd347017f3be7d801334f92d9321aafd53b51bffabfc752cfccae0b1ee03bdaff9e428cc1c117f1ac96b4fe23f8c23e6381186a66fd59289339ae55c4bcdadbff84abdaa532240d4e1d28b2d0481dadd3b246557ca8fe18092817730b39e6ee378ffcc85b19ffdc916a9b991a6b66d4a9c7bab5f5e7a3722101142e7a4108c15d573b15289e07e46eaea07b42c2abcba330e99554b4656165bb4c0db2b6393a07eca575c51a93c4e15bdb0f747909447e3efe34c67ca8954b530e56a20a1b6d84d45ed1bcd3aa58ec06f184ee5857aaa819e1cca9a26f4e28d6b977d33916db9896d252d1afa762e287cb0d384cc75bfe53f4e922d02dd0a481c042e2d306b4b3c189371e575b25e0005a164cf69dd0976e4d5be476806ea6be6084e71ab4f5ac5c1b1203",
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 315,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "157ffb942b1363b5989ec4beb93fb0187ef016de4ce055620825d13c3dafd4fff621c71920e884ba28c5e98b328baac29ad4bfc4d2cae2f0ecb9d1b6c9fbdfc385aa565aaf6c5b3150e085e0316e21d7d440a873074e5d2700d961114ed420478647a4769d832691f7a004d934a89dc249c9343341902d5d0c3d1a623001265634216beacd5f756821f21c3b58111790657690918a2eafa9e85ab1ee44edd3d8bb89e892acf411ba9eaaeef88eca37dffbda72751c117364fd1b38c840d7b42318fcd011a4449aeffc2de32836d3a4f704d4c8ad4e078315d0d1758f098f2ea749ccce62aac592ac4041b5e733ba0431b88332a39a2af7f68f9bb1f469a793b280b964f285ce5cd1ff3adcd7dbd464a7c9414ed45791073f08415be2dd9f01dc2fec8c3a26fe97d9778e2b2fccf71a1ea5e9ce017d2d46778d7e37bb832ebd5825b3257a7852db5cb6c132bcf9ba3522a670b0e866585444ed3601fd32a922818ef6611626eee3ea99cfcfeeaa4c370567cc65e0479bd35e091b772d7445cade",
+          "padding" : "3031300d060960864801650304020105000420e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 316,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "631cb4bed6b79dcd3827879f6d64de3ae17e0fdb022be013e733bbfe0031cf204f0508ab87a2e2bbdfaa16cf24acc96b3fd2e72bc4a224428e515d6f1e0ea6927eba6ed7282a959e5df5e52eb3be9a39cfe139ea2fa45c21eb81b3197eff655b918f7c5fff6abab33945557a922063f9600a372ae7701db686f7e1fe4a6e804a0f624331fbb59536733bed3710dcacd22ec74b1a1386d045372853cac91130703ecafad7f6f42ec1aade5cb865339743c83e882f248b0db0855f487a6d3b55442f67773611a11813ff46a58c762b1bd70b5e870c3095507f23758e90b3c84526f47a825f0ae787acfd3ed349ca6786a2e84ec500c6042a9027a994c328c7a6868e6a81481b294383edda62773fd224af46e782ea3f00468515f6100486d94e818afca1bdb81851e62b3bf4f9236f061afafb3e399b93e6f6a295ae200c9bba5ff5aabcac8361c84f2e69aff8a8a21720b900d52ea4bddcfbaba3a231bb9b0dd48f0a4ef1cdd255b3524ca0633d04907ab672314c5e3173108313ff4a97df3772",
+          "padding" : "3031300d060960864801650304020105000420de47c9b27eb8d300dbb5f2c353e632c393262cf06340c4fa7f1b40c4cbd36f90",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 317,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "5819a699691c01a7f35f0bb1831a1cb65631ef693f7c9ef89f1e8460ee2ec312f6fd38fe382b3bf4db8f5d208146c32c5ed2d3b13105743767a73529bfddb5753c8cc13148d41db97f69ea1dee0ef1e1de990ff565f633bd3cfd315a7dafc70aa7f27d4f6486a2f1e2711e7919c5c73c518069338c0ac984d75f58b00fb0eee0f7da6c9c84d97955137417df8f20c02b7893b5cd929ba37f6b3278a1bd35748e14086c5f7100abf2edebeab5f767bb83d999a61cc27531bb67e44a92004fba9944b9c5f770bc66671d2efc74e01fbbd2885c5175a1fd72b91937c324b8d99d3592bfb73efb9641b87949266de441b61d180e141de510ae0cdefc2160df918c08c53799f050ca4eeb3a8b6b5ed35b8b59d3acd13a600a8a137eb1b8c1abbf55f3e99cf52d7092d1e3acc08583b04aa25a052668bc982abf060ffb17c1782daf76fbd69e7fc9510c5c6a68bd525719be5b81d0f2a8b961f1aeac7dc13aeeeef9986c7a47b34f8b96167d79f7ec458fef7345c1c31bba599d09b3fe33e738bc7da1",
+          "padding" : "3031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 318,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "636d31d8d5dfe0fc6ab01ef2ccd4602dfea62d386b002c429e7e846e7a98d0cb1d448d25be039d5158887ab46a9dd49c41537a89036a065fc10329df051e5f2e5c1d4436e84790ff6db4d3f31575e5f0fbdfcaee625722c5492fceaa3fb29d0a865200dec06e117b04753ca9450a7ca7f7d1a1176cc38ecab721864413a0d7a22d8fc1595b6cd0032fbf154fbbb31b56d3bf963761ce8ec9fb38bba3419716d0d39e976857e79b1faefd5f5a2ce0ebd94968da1ec3a387804694d90f37b34033c7f70ccfb26beffaafb7bf56c1b8385d489217458e0a68b5d680f9fa45382fd1c227ff3c11e3ec82426ec648a564f0e886e5b12e695dd2fc8465bd9d08731fb140084c79be64d915bcb4ba10f1edb4c37e35231753be2d9f339d37d7b5f22c91584a68a973f9cc469a23d3b5800157dbd72a8405fef4e444ff01f7fd23efa143c1887504e81773743843d8a73209a1deb66c5f305df539bc30e871332e82330e5b66fa6ea253b2b64b4c9781011d20e80ddd8cb83916834eb8fa696b0a4b6bcd",
+          "padding" : "3031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 319,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "08e0ae3dc0d16c927c423f12a87313afd1d66fbd5d09f48a4dd1a8b52102bbdd208284cdd692932869803a5c7f041a4492ac2e664bb6dd981c370e0c79ee3f7c5c6dd37018986fc2cc618139fe3eb85c0616f0673403c4afe7cbca49c1eff27bbf6d7e541b285ffff20b80bf61dcebcc4250068e25ef5a8e7c3306e49fcc2a1ee0f500a3ec603b472082f12ce4a6a12a6ac66cd4da8b6efac0796e9dcdc66c095a6282ae9a32ad274efe63f43e725410e6ed4c480828ed876b76b71b1cb8c142d0c7a51dc202af796d7bb55cf544dbde2f564f31994911ec7307015b0da2c51abe265a04a74b9afd0791a68e725cd7d8b473296c5d948157c10bc4682f74d843ce72e9ee8719a7a49d9de2f982c5d4490451eaed62c305eae3d0f9cb3493bff056a0dbca8579b7b41dc8deb1becfd5abb455634569d58c5b5535ff1356ccfaddd14e0f9f7f69a7ae9cb9f4c0c9f661fde349facd21f0021423d3a9ee5031855dd242f27009090ff0c15d1655317383231799b18c01fad231385aa5020990f41e",
+          "padding" : "3031300d0609608648016503040201050004202f77668a9dfbf8d5848b9eeb4a7145ca94c6ed9236e4a773f6dcafa5132b2f91",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 320,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "9858e2557c6b99fbd84bc7eac3e31283a4efb351ff019343760a1e282368938e29ad902d3eb6cb29b35a036dfbcc7e06d2f1d15548df59ced35326295375bacd7a9d28a01b4e8acfb676d80b6295e19c6b7a259df56456e1df72f6a746e9cd31fed9b79b35d7a30a7aa257e9e8ac60ea886042b9194e7a383d1c9f71c84511faf6c96f7ae0e690112b26bb60cf7bb10f684e4fbe2a3a1b1c0caa9b1bdc79fde23fb758c2ba57880a4de461ecd2bc696689438183e2b9724fa68258f461bb4405425620a4d95c87ddd83e04be381bc743b05d26ede2ceff8a858636baadf56ef1dab54080da0f516307c579833717def053c8906d4f102448ab22693e7f52d5850193a40ccf0d68d1303953771a73924e4bcddd8486e1477d96250bf6b480a5f4b822822183694c52a2edacb331564444f0335d3b17d511ece59889b6d961767a3192d7f081caf7e671addb3757451776d4bd3b03f7b689843dcd59019ae4f292dba54738a88b86cc6ce3b123c61a446f4878b627a7f3585d8ab7bca9b258f10b",
+          "padding" : "3031300d060960864801650304020105000420ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 321,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "1294490626bdb36a31c93fa7853d93152d920b022f1b473bde3083a99e11aeba8c03218fa07d6c4a5f8b2504d2cb54505c40130fef5a2412f7a5ddfec5e2c8b5058f7cbde7ace0ac01c7ba8a1bd897e8974d991ad2b95c2f03100a34ff408a788c70ab5ec73b5356a4e3c7beb44fcb9e2f3f25d1c974ed962b148167684351dc2a223a174c9744b092071d58dfd39c38364f47d292651e7806ad7962bbedb64739d7ea298f0254244790e3971c15b861c95f00f65532aa1c77fba5c04ad078525128e92ed2b4f1269ae744547e3efd4ebb63e9df844df152a098c47fa492bfe0f1917ec973867c7491f64c172cf3ea1bc3f97b42a397e6ad88d12e150d3dbe360071a3285d6a68ee6e736eb4d7d637c649c2f545259ecd430b25b38a1618d69a4602ca8a2a151066f12c3807f5dc7cbd06bf095711e4483cb0a89c26dd9e4b0b03e05beca349f601c894f9a245aca3204584a9bd844772dd87b83d481c8df18b615307eaf643cbe856488c160e077458e899755301749d2d27bc190d68a5da11",
+          "padding" : "3031300d0609608648016503040201050004209432c1a7d343fcfacb164bdc44ff71c1281c004886b1c428419088d06cd3561a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082018a0282018100a07887f373378196b0b748cdf31c14735ccfa0f117acafdaa21fde4b6e7559390b834e7b92e9e1cc9d49fc0fe6cfb60429652b4bf9a7768f71fc4271ca6fef4e431192ebdc98630bfb94c5baf18b4cf7881d84483e4c44c22db15a9627705a0b42a26d6f3d6009aee0d2a71bedf4d4b0ee6b6fec2f16e1277ecaa3bdedba406473a476d1688df0fad1da795526c7e641981b4812b05b692d60c60b2bfa424c8b620f40dc9dba59e2c710e7ee750b3e134c1f71f43210688aff17aaa41cdb5668753f0006b1cf951bc5951f4d89a31196985ea55c0966c3662bcfe4e4cd34f12e4afd7e5c4a130739b1017d6a583882fd72db1a67418702c8b01353ccf75b7b93faec0e0be36211d5f2bd910e1552323711bbeb73858f899cc1ec063ef67d88e0c699d5a689c52106f06e960f09d2a3cf84f53bbea2a473edf2e6e0176801d3fa1c2d358e1e5a26f646ac93796ec1fadc6991c0ec19c9dd90b25a2dd3bf73d2cf1eea8867f96caa5a2df54973acb2a2da0a1367ec74afbb968f517765238d17690203010001",
+      "keyDer" : "308201a2300d06092a864886f70d01010105000382018f003082018a0282018100a07887f373378196b0b748cdf31c14735ccfa0f117acafdaa21fde4b6e7559390b834e7b92e9e1cc9d49fc0fe6cfb60429652b4bf9a7768f71fc4271ca6fef4e431192ebdc98630bfb94c5baf18b4cf7881d84483e4c44c22db15a9627705a0b42a26d6f3d6009aee0d2a71bedf4d4b0ee6b6fec2f16e1277ecaa3bdedba406473a476d1688df0fad1da795526c7e641981b4812b05b692d60c60b2bfa424c8b620f40dc9dba59e2c710e7ee750b3e134c1f71f43210688aff17aaa41cdb5668753f0006b1cf951bc5951f4d89a31196985ea55c0966c3662bcfe4e4cd34f12e4afd7e5c4a130739b1017d6a583882fd72db1a67418702c8b01353ccf75b7b93faec0e0be36211d5f2bd910e1552323711bbeb73858f899cc1ec063ef67d88e0c699d5a689c52106f06e960f09d2a3cf84f53bbea2a473edf2e6e0176801d3fa1c2d358e1e5a26f646ac93796ec1fadc6991c0ec19c9dd90b25a2dd3bf73d2cf1eea8867f96caa5a2df54973acb2a2da0a1367ec74afbb968f517765238d17690203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAoHiH83M3gZawt0jN8xwU\nc1zPoPEXrK/aoh/eS251WTkLg057kunhzJ1J/A/mz7YEKWUrS/mndo9x/EJxym/v\nTkMRkuvcmGML+5TFuvGLTPeIHYRIPkxEwi2xWpYncFoLQqJtbz1gCa7g0qcb7fTU\nsO5rb+wvFuEnfsqjve26QGRzpHbRaI3w+tHaeVUmx+ZBmBtIErBbaS1gxgsr+kJM\ni2IPQNydulnixxDn7nULPhNMH3H0MhBoiv8XqqQc21ZodT8ABrHPlRvFlR9NiaMR\nlphepVwJZsNmK8/k5M008S5K/X5cShMHObEBfWpYOIL9ctsaZ0GHAsiwE1PM91t7\nk/rsDgvjYhHV8r2RDhVSMjcRu+tzhY+JnMHsBj72fYjgxpnVponFIQbwbpYPCdKj\nz4T1O76ipHPt8ubgF2gB0/ocLTWOHlom9kask3luwfrcaZHA7BnJ3ZCyWi3Tv3PS\nzx7qiGf5bKpaLfVJc6yyotoKE2fsdK+7lo9Rd2UjjRdpAgMBAAE=\n-----END PUBLIC KEY-----",
+      "keysize" : 3072,
+      "n" : "0a07887f373378196b0b748cdf31c14735ccfa0f117acafdaa21fde4b6e7559390b834e7b92e9e1cc9d49fc0fe6cfb60429652b4bf9a7768f71fc4271ca6fef4e431192ebdc98630bfb94c5baf18b4cf7881d84483e4c44c22db15a9627705a0b42a26d6f3d6009aee0d2a71bedf4d4b0ee6b6fec2f16e1277ecaa3bdedba406473a476d1688df0fad1da795526c7e641981b4812b05b692d60c60b2bfa424c8b620f40dc9dba59e2c710e7ee750b3e134c1f71f43210688aff17aaa41cdb5668753f0006b1cf951bc5951f4d89a31196985ea55c0966c3662bcfe4e4cd34f12e4afd7e5c4a130739b1017d6a583882fd72db1a67418702c8b01353ccf75b7b93faec0e0be36211d5f2bd910e1552323711bbeb73858f899cc1ec063ef67d88e0c699d5a689c52106f06e960f09d2a3cf84f53bbea2a473edf2e6e0176801d3fa1c2d358e1e5a26f646ac93796ec1fadc6991c0ec19c9dd90b25a2dd3bf73d2cf1eea8867f96caa5a2df54973acb2a2da0a1367ec74afbb968f517765238d1769",
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 322,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "473432cf11b6f96b1dd41e1742ace21cd10e8dad89a3e00ec68f3b45411059d0bbc6c8a3f077bfb4b12da60aca86dd856934061aa8e4c3221a019b7ed3d4e70ed8bf53fa140d3c31877a135a6ae140e021bea9408ee61fe7f32e60cd18932282b1aef1019f9a39789cb48991e535568b55eb26cf96e9bab35d03121f6be9f0d65079b064cff923edb5639cf08f48ecaec0670ab37b03e4cc2e604582e1cccef79f262c8b3d146887303c542ae7c455b0f68e882c5e2259ecd9f76cd3706e9894766089b267ed3bdec29df5b57e6a6f8deff21e093ce611724ba1012cf63aa2c62e7267af4b1df5ef030e6cba7b217d46fe43fab255f41ce086bec5e4f604718c95acdbd5c56bf8b68541ac0dde0a5e0f2336ea608864abdc5324b29b9f7bd35c514373efde38bb593b8d4b249535984662bf4b397b2a584ca15624416537320fdef81133d6038edd99ee19af9567c9fa536474effa925555c9c2fcea525fe2da935b791ec1d7d3bde33a58f80dd1e587e1c433239c65332e94d66d3c79bfd190",
+          "padding" : "3041300d06096086480165030402020500043038b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 323,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "69d89aee9a1b9827228c40c3f3bdb9479ed36bedd2c77b3f5dca19917a5cde9636b9f6ede29718a391224ab58f464c9052b5e6786178194a90ec04d2d2b7513b19df2799b0e7a2d6d1ef2c49ec6870fb8cae45ee1103692da8d211bf61f656d304f69adf68c0227c7af5ceb8c2db4a3668bb6a1b8cc3a437b9df79bc0dd650d6e3a42295b4a6e23d40b3a9b7548f3760e0faf69200df230d2c143807b2f35fa449cfa73792844dff5d2ae50adc272c0dbacacd60eb0b7964012a5c1981cb2f358ff53509f90b0ec41259fef321e9a306a08363ed194e51ab6dbc00ceee576c048c02704a19f8f357250adc70cdd2819157d71af04ab0cc63ac9c6fa4b5799eae521e275f26ce53302017510826f96c4a2889deaef19fdedacc70a6598aa89e2bcf373239bed98d1f2267fa7c2436add13df68d9ea296fab52fed0f5ee46874f48735fe32c61ed2b1c977ff1862ccce093bdf7d84a6b03c3007c4c926d1e52d81dcc0bc2a553a12be363b764f6a322e41a8318ea7408c18e33c260aa05d039625",
+          "padding" : "3041300d060960864801650304020205000430a5a2cb4f3870291de150e09ee864f3b2b3b342937ac719a149439185ad6a47bb4f23ae83ff20f0c8f0c79a1764244a63",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 324,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "259332bd5a274bc347ffa3e8a31c8b27f216cc865d32c917a5d7e4c06abd44b6c024f44eba997862c812d8ebaf7caccbb234293178e44b2532478e8bebf6af5f83318ebe398e0850e929a89cda860cd18ec94554e4e0d45a9ec2d9acd83fbef2b5d31dd7b2f3c12e791afd3e39a9437fda7724c9426194bcfdc6bd52036f62aeea7853db2c8c498103eb60180281170aa0fae8139417974d917090dba8f9061665e92d953827dff4d450f5566d2c5b753b65c9b522a0c4da868629569a666b7c292b22060e92acf4ed65e51245403a4f162c8b504b85a810906ecaca2956d395c163a7f6f23573156968ecf62ef46b72b9ce39303681e354e91c5d7944cd3288b2a84a1ea28e7e6f260bc5f8d92be419ad649a8f55a2195ca46130922d82759f9bc030c8b122211d952c3ee7851f09f30c2fecd1070656c69c2598584b55cbe6567dd2719305dc52dfda03ea289a5db920fc2c777e7081cfd92864316d3fca9aaf8e2218ed8a5235e746e5cd9bcc856b0c615b901dc610f0193171869202e845",
+          "padding" : "3041300d0609608648016503040202050004307b8f4654076b80eb963911f19cfad1aaf4285ed48e826f6cde1b01a79aa73fadb5446e667fc4f90417782c91270540f3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 325,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "1f32b36eb43f87b18e569fcfe7021763bea0ca576cd273c0b20352906ed8484428d250241709c825704518ff9e97103bb70cd26f437f87754bd40407034a9653d00e868a759a190f3067ce5efce9ab17c8b46000d88e2d9e68b8dae0a0eaa4a31d3bb51c8c8d0fc839b0b273c83dad57016b1b5c1d8eccff1c753e5c6d189ed07b801f0a54a1144c142011fd3226451faea43d52597b003f9256cedb0d7d7f56d86dfeef50179a794f0b0de97da1926e9491f025bb3c3e8e031661e0ead860c8914f0b294bf8cfea2d5ccc726ad0743e192510732dc84301eee15eca3c6a5213ba66d0871789315f8537a44b727bd8a10d6e54636b345715fc0b6f5b5116f22557b0af9f948558b0ff4a3b0faf1de7da1965b977aaaf039c5b7b09b4f03efeeab3189d2a09fddc3983e4815df35ddd1c2198b695cffc35aa6662839f82468cb676b677d53ee4857ab9be7bd99e1749c811e2d6584427cbce14d2ca15df061165e85502420602666993463733b43c1c1ebae8d37780470b8cf5cae31cd7427799",
+          "padding" : "3041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 326,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "7e3165358b5d09ab1ad1599935bbdab27abc32486910382a0ae630f725b5dca5ffaa9e606e2e555122c1e0f3409d7d915ea00d8784b814a6721d0dd117297c951c8d225a484a549e488fb80f996ad65490a09defb0b46f9cfca2e952b04dfd5418da920dfb2968e48dba8f0729b16fa32a832fd8b789bfebc63f01a1190813cfd55ace949d802afffbe9a1ec1e6a5df196e5ffb241c918d712e466f30c66c0bddd48b57ba4d0baa0c2ba9bcf519c3a26140df6aa5efbdd5ac9beff48613f92d247b35efbd6014f3d714705933e47d582f4a5da05b15a79bcacba1aa15a5fd6ddb228bbe4c5236f9ac607f41a492e6b1c92bd68ce30659eb5b27a5b2f76a5867dafbf85a9dfddfdd476c383fd03e38e81f2e1434553643e652cc006e5df7313272335f122a7fd9cae6f2f5a7da65865698d6d08d688000a730c90919e1826bfa1db85d5607ff9d76cb100ea1649442cefc4251a8cc1d823215e0ad1abfb2976bc4a6b2bbd793ebf9c7770957dba1e2a8583d9a82a072386d0957789b450993c77",
+          "padding" : "3041300d060960864801650304020205000430b526d8394134b853bd071719bc99d42b669bc9252baa82dcafabc1f322a3841c57cc0c82f080fd331b1666112b27a329",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 327,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "8bc948c5c16603ab63e75e18bc7f062ea4c675ebf98dcacc1a9826b0eeab0004e2592b07525fca53bd288bb56b5961aea93b548771068f5b0cef467c387e2d62c91e045872922b516dd6c5b8ac3615c986a9c8b5211a05f63e82387175e8749709951273cd9d8b2eccf678284761c72285be5c189c4400629c26f87bf18ebfe5e56f2057fd91fc9209ec48a872d6d23bc330f1c81ede7fc5a0e2b09c3a4735eff9c8adf73152b3406a62656897c1eef075c4fb02244ecd93912dd36fbe0d358a71e02d2b302dbebd28ba50860e4a963071f0a890a2e400c18f530cf9440a897eb2781ceb17bbc58f61828a6456b93c86df972c42d082b913c4d8807b7563aafb7b330ec39dc988674a5c3b36f6bbdd096201f1c7c25ca9ea8f28e923ba46dbe93910268d6e35cfb605b92ecf98699ae9b09dd4634d1280586c5e6bb0b1a4b5e5e22b225453f5c66f9a7ed7fff83ecb201eb157c76c9beff95227b495c8516bbc7118f011cf9237b6e794bd7a9ba19e35d0a650dbf7c06a0c9ddc95f108a78246",
+          "padding" : "3041300d06096086480165030402020500043054a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 328,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "09ee821221ce7bbeb4d66ea3ec88387bb5c5bfb055b8beb36ccba4c2ce9666b1a09935689db1cc2312d797ac8b6f62643de736f38269a81f969308eb616cf41960341fa8edd3501f4edf73736806b6fc1387df4ef3e1e26c03249f3db6471ed580699e8ac77d0fd9a78972347e8657b6cdfe172fda324eea00d60d38b47e066c4a6fc0e33f75d1d4ecdf46efd966ca9aef80d22e43dfc2cd0af37fa70d6df7c637c3c18a219bf58dc1e7bfc941a235bfe81ee7101530a2c264527608d7148dd91325b7895817ae50d774e8dcd2def8a476a9592d55be743c62c1192f0ad69981fdc8651c1db828097ff8088b720c637c60c771b5091f9d9e174bc823115a1f7dbf086f9ad36a403c2d710c47af4753fe6e43c675c30219abc2b8560bd18c25aac719546ce7a74080fcf22bd4e6cffc270e57baedcf2739c5cf4fc5fac18f5dd023301caac1b1faf4dcc65327255ccf54f5fbd3cf82801a8685c2eef3c5e7f608cf6f747b8307f617fce148347b76facf0e1f7895aeeb11e3225e3a6066a244ca",
+          "padding" : "3041300d060960864801650304020205000430ae9ada2a808aca7097c9e9c30fba4ca60a5e79874a6be0f5afeb7f5df3538346f04b84ee06bef7ac879a0085bb2036c8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082018a0282018100fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d52450203010001",
+      "keyDer" : "308201a2300d06092a864886f70d01010105000382018f003082018a0282018100fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d52450203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEA+uEjY8xR4mbefXS5iQhf\nEPwI9ENj+rTqf8xWEB0RZhbEPeMTtwVpyyfeE07PNfy8xEioEIJnjuGuQnxI9Fmr\nLELJCFkRo9gckU8Ee6Ru8aUqSYProRE73w7pXoXNIyJM+DL+PpFtO/+m3c/uCSaT\niyxRyJBL7Ec5r8TweXnL6r1RS+WiuHq+xxx6KznHNtd2RC6p6V6X3fytTEw7Qf6F\nb4HM5Tm1BXq/xvsaoVMxbqT452uNyIBO4QMD/C3BgvfOXZB+eHKWeTM7OwEldLTH\nxhPAIM4TiK03/8D2sjMMxe33zpuoDrmEttoqxZqrqjopFy7Sk3kg9HwXRH5hhRGb\nmzipk1ZYmXtIdzWoGEyv8QqPVV0DRVL9V0cbKT+BPxmqbCE5h3mSQ2/RlJ6+IllS\njJFxZBSqcv+Qu1FC0v1ee6EtjfGsmVQI5/tkWpq3tvaV5AUFAKkEIlODOwVRgmV5\nFSRlifg2IgO1UXsvcRfSrKAV/OPMQcaxvLLmctsULVJFAgMBAAE=\n-----END PUBLIC KEY-----",
+      "keysize" : 3072,
+      "n" : "0fae12363cc51e266de7d74b989085f10fc08f44363fab4ea7fcc56101d116616c43de313b70569cb27de134ecf35fcbcc448a81082678ee1ae427c48f459ab2c42c9085911a3d81c914f047ba46ef1a52a4983eba1113bdf0ee95e85cd23224cf832fe3e916d3bffa6ddcfee0926938b2c51c8904bec4739afc4f07979cbeabd514be5a2b87abec71c7a2b39c736d776442ea9e95e97ddfcad4c4c3b41fe856f81cce539b5057abfc6fb1aa153316ea4f8e76b8dc8804ee10303fc2dc182f7ce5d907e78729679333b3b012574b4c7c613c020ce1388ad37ffc0f6b2330cc5edf7ce9ba80eb984b6da2ac59aabaa3a29172ed2937920f47c17447e6185119b9b38a9935658997b487735a8184caff10a8f555d034552fd57471b293f813f19aa6c2139877992436fd1949ebe2259528c91716414aa72ff90bb5142d2fd5e7ba12d8df1ac995408e7fb645a9ab7b6f695e4050500a9042253833b055182657915246589f8362203b5517b2f7117d2aca015fce3cc41c6b1bcb2e672db142d5245",
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 329,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "ebf3c64e4c19fcb0fd920e65554a552cc1e652312c2e0e51cdb3b92c94b2b41ee201f61f434a6aa4703e87416388f4661c04fdc2e459e199af3ea208c61b99d746f4b00d82105caf4f0196f1305e806bc13b4c6e6bf581962862dcb0eb15a0ffcb0fe6b36502320011b540799e1432baf2a56a428fad64811afb57d210d859a1201ec057dd8d2a68784b48dd07357162f21e4c82f8d5e385b1f72834dd4c0d85ffd333410f08ff28fdb7365e408a60af177c80298726940bf4c40efcddceee3945b1d921b9d04080dfb12d3ae61863ad2e3e302370f5a8858a1213dfcd500269ebef76f4ebf0982a751d8ade1aeed95f41d4560084711362774b11b6240c0ba6ee4ca634ba8298f6e63ef560a39047481b9eaa546178e69e4daf5651c66c6235ba97c231241c63ad16efe59b7b5505d9c3f1818368b9462cda71849e431648be9757620c15f99ca78f4e250afc41ffdcdc52693a1fd43506274c431caf34a4d37321f5ccf04971a25c5010b9ada07596bf9a20bf307db9d5e86146226081b25f",
+          "padding" : "3051300d060960864801650304020305000440cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 330,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "b9bb1751f2336ef5126508541b949d40f1719bd23c2f0fed64a7b73ebe1819377e6e4262f8440a3a3cd456f5eec0b1c0956bf6989add2c3d1c7ba4acf7a617d198179dd974051fa7a14ecd8093ad572d7e233daa2a9a46fe59bcf7e01c6ad8d68c0afa89a58247ce257566edcedd799173e2babadac15405e2812ad12ad900ad997035966a05a02988e11133c21e111a8e06d7ce509de1e0c11de55379482cfa072348fb41c05083529c2db86aebee92095e7450a75d97fce7b3103ef1f8598459651dcb9b6e90f299c9efc95d7ced2f6e91526ab3788238e2b5e109d3ea984189ea13939d58fd4ab896c76bca4f6a92fd3bc124dddfabef1f286583a1415d1fdb8c80de8e7583fd6d52836a22c3926f69723301904532b9fac2a37d0cedccd4b3d0ddf3550377191f813d4f92a5c126ae91e03fbffbcf59637ebbf1f30acba1dfcb0f93285381cec6da60bbcc62074075c71300f8424e0f964422dfac19d205251f227614bc13568f408284b6b53bebd7dc4adfb7e242953564763292d9c01a",
+          "padding" : "3051300d060960864801650304020305000440d296b892b3a7964bd0cc882fc7c0be948b6bbd8eb1eff8c13942fcaabf1f38772dd56ba4d8ecd0b626ff5cef1cd045a1b0a76910396f3c7430b215a85950e9c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 331,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "1cc02717a3321a83da62deb3ed0b9706cf7ca9fdf3674617fcdc3364a697825b910d54b891b5f8eba197049047cf0048ffba6425d47374ec24a84f1f7f04716b7ec54daccd04aff858e2e7c8830e4420b5f99df756018083abe46d3fbce2da6e8ce6c893fc11ce5967a5f367159f9ad38d957078dbfbd32e818a26b49ae00151350044d22b58a4a61a35fadef67e3f8247f407f026eb17b8dd4ab29d388bfb271a1ec606e141cef3fe57e2e55ae8b40fb076a06f5898362b695545124e9c185c50647cc5b83f09f406e780f626ec60462fb50caf8560aa72fbe174111142029b19f2d681f771a774afedfe2500fd8b1bdd437fc41709253ffdedc302f47afa774f5ad23777a57fe44067182f4b35a28923edc82255cce11d2fbe91acbce29289b4e0e8f5e99e906e6607637b05eab4028d85e91d060fc1fee052a09baeea759917b34855e09b8e5b67ad60f45851e991cf01dd528b100327961eefd0c29f1d1d8771bbf3bb1e7f048d9c2e1dc5e652e6ac4f6a2aef86245b83f611700bedd07a",
+          "padding" : "3051300d060960864801650304020305000440c6ee9e33cf5c6715a1d148fd73f7318884b41adcb916021e2bc0e800a5c5dd97f5142178f6ae88c8fdd98e1afb0ce4c8d2c54b5f37b30b7da1997bb33b0b8a31",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 332,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "a0de9c2df76523499c6c344173d944b8e02ee1520f90759fa3c27ce284091f80215a9a26c9fcebc125171da556bb732a0645cd64b05c7cbcd8c187d3995e3c86cd59468118e9278ecdb8e791badca8785e56f33478ba03eca721591930db01bc1a5da5e193b2dc9022e98948644a406138a4c7971ad8ade585a3d72e6c9de50320b9fca1ac0e054835005cd39c96400c491e1b706eca22ae2e9f1b844284226fdcdab1f2cc942a8280f7786e0f2cd069b9ae99f04aae424a6d24eb023e064513931b2e4f7629151af6bf83f4c5c58616960f080c6f96eeab07a87b6d7cef3fe6b071e49ed340b48867a5bea30dee332cb89e1a54d9e3a9a8bbb87179c6ad206fd48dab07104b1f887a02160b59f9ddac6d1f8801c1a8df507ec199e970e02058c749475b7636ba2def322160b11b21773fdf904cc665eb5eda887ecb6d9be245d3dbd85cde107d082cc6d8492a087166e23835a379ac69f5a996ad9032cc41e205078c5ec9c50f85c396822c057b25595a35471a2fc3bdd3f75eb8ecf2d1189d",
+          "padding" : "3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 333,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "ddad8eeace34f1eb1b0dd28db89ba710ee68aabb54b0a826c2d69355f63acf0f2f2e0dcb96f388d44d0940774d7d55fe81ba6a8a880aeee8ce842101c7e8837fbf2704971341d38bf3289dfc61a6b3b557588db93eef2789d3735000c8e2d830a32070626d079e710c943082a8bd1c0cfb64b2dd911eea76001f8e08cdc01cb072f027fbd9c72331b857d07c1c2f3090eca53accef8b3b015438942e8d2fd3406cbc54c7ec3797a163b13878881f7b4ef5ca45056e16e0c2a76c3d5108c6f0f48803d27eb4b0d55e90b19b6fe372dceaa61270b9efe2800bb259dbead955635ca44ff979bb054b5cdf86d4914ee553d7d5b1a49fb8e49f3f761224802858458f702aa4428964a32a45bed5738224517489f2be075f9ec7234a019005be922b8265bd78abdeb1d1633fe7e5aeb37b61d36b1a03a06847a812e50ed551853d3cdebffaba8b056b788a1bc452ebdb5a3f043a116e5a3d262c745fc15897ad4ad955595292a79eb85373d552d6079ad77e469f7d3a60330702125127b1ee770225cd",
+          "padding" : "3051300d0609608648016503040203050004404fb472dfc43def7a46ad442c58ac532f89e0c8a96f23b672f5fd637652eab158d4d589444ef7530a34e6626b40830b4e1ec5364611ae31c599bffa958e8b4c4e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 334,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "2ecc537edc397ae5c3c789638204ba3393bff5cd9c1f0552db515a8258a311b6bdc88325f9072d2ae67bcf132a92c0b4d01ef0f2916349adc6d8f1b415c86bce6b5afcf4cf2d3137897d0f8a33063a0ff69965a5d2ef00dc3e010094ec8214c95c064313c8e90bd84e34c86b2e19b056539bdb3c83eec23722b3e380a53826bbb31cc97ebb8ca77cfd96d3e6a2da59baaace3883c652a92e79653941c5615bd30c77aa38ad74c49d36ceb9f76544835d57f0cd14999c2c0cf3debbee17a8aba6d777ebd9ffd44b09e093f1a894a8aee80301c3a5a59626a79e445254cb1df1174450bee22a7518afeeb15495d663af289dbb09216543bccd136abf2646bac573551cfd04e6a35b5cdf9729c8b14d34c06660a42b3ab365a42ffe470b69062d0f305c733c43844565b0b94d49d2019933de9686088d219d57b256170c137a21475d03f2a7e0783af11426fc6e64895fb92da117702e4487558e8bd21db82f263c4bdc64065c4f66d87c87889ec5aa9cee02c95d001b08636dc3420f817c228dc7",
+          "padding" : "3051300d0609608648016503040203050004401f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 335,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "b9b492d4796fa2cb7066069a00e36aab8b8755f9dc8294401137efb3e2681c9b57930c0ba87b45c9d70e214979cca91a06562f710a2427660547006ead7b3e619cf4652131fd84999c5ff1c9a1cf057363b8ac62501bbfb1fae840cc963a95169c658add96c6c969d415c10bec5e2457a5c3fa4fe81e7de1afdec6f4e59e3fea185c7cd1bee4b8a42d2f22c7bad7d4933621a0cfacf0136abffc3ac54ea37c63af719425084cade944999aca3f43c7625d22af10149f39acef32ed7c92f781809aaa945b2f446a03e66150a524c7d88b7bec587ba7d6fe2db4ebb7a8c3bd46e7fa1cae291ff502acf33f003dfd1417fc60674501728e52490476d813f0079f56a9456909ccee3b76b30aca26fd4487527f4ee6283bdb2e72393d661ec0c35b2d1675f679f823fd28e044fed090721ba4c6be46da3eab26e5eb356d17d04fc3ac31425a6f6a50474e2725bd4dc30da74fd3767a122ced21671e47b1fb33bb7018349f7cbc916c6c7f4ca7334735a0e0ec18e01735107bd2ff02cd9508fa5832dd",
+          "padding" : "3051300d060960864801650304020305000440aa0a2e60e45f276fe3aefe9fc07c6f2435f143ee2afd895e4809384e833be66a6396c839d6f7db83f37736645454c6e63712b27e70edcdd7440e1275235070c0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082020a0282020100956353ecb7561945dc5544e4602466078c93f28507701ffd39e2a9813c8ac8740e6ad61c955d484e513b3dcea527e001a018ee2c207c1806a96763280236cd3c820dff79837c9b709cb4b522d3ddbc9192242259c43be75ea244d37ccfa8a4c75024a2cf7cc76e842ea69cc7ca1227405b070047387a5068e4976e4b8ed5f9aadd7b4db024fbb8d7bd8a040d8f6610c1c6eb1d4b606dfd182235d0360880304d5a750603af0c424b8c8e6dbc12c3697d2d609c97547e774e2e362ea96d1690dc9432112c535258b3db2c4c32ad510d6c07ad0788357883869efb8b629298724847925cf42b34386be700f02903db5852276bee2370941f397bdc3905e30964a0b5e73602703340960c3ed6078263b611f197955fecce4b9a32e43cd1d2e5e87c4ceb65edc8853a7ee31d28e16e5adffb8ac7b760fbfc63d5f174f4d0936461dbb12c964a6b6d6cee752e5fca1ab4a9fd238dd3e8860a1d763d2019f9e7b99ed7666d4e038710f90e0093bc566987d6c0092f571376e705b342d066c54e6e2578927b92c1f0928de44e9a6e1f49b907c6aa4f605ec9c398d55df81c67373b03cc8110162fb417f96fd321048647dfcbb392455115cd912ea83351853e6a185284648842adcbd25e67174a3b93b8a64ce2ce9de0e8577b8b662ce32e2565782665dd38e5bb5fcc4fe12e4320dab7773b545a09c6d39d9dbad459f21f3e624ee6ed0203010001",
+      "keyDer" : "30820222300d06092a864886f70d01010105000382020f003082020a0282020100956353ecb7561945dc5544e4602466078c93f28507701ffd39e2a9813c8ac8740e6ad61c955d484e513b3dcea527e001a018ee2c207c1806a96763280236cd3c820dff79837c9b709cb4b522d3ddbc9192242259c43be75ea244d37ccfa8a4c75024a2cf7cc76e842ea69cc7ca1227405b070047387a5068e4976e4b8ed5f9aadd7b4db024fbb8d7bd8a040d8f6610c1c6eb1d4b606dfd182235d0360880304d5a750603af0c424b8c8e6dbc12c3697d2d609c97547e774e2e362ea96d1690dc9432112c535258b3db2c4c32ad510d6c07ad0788357883869efb8b629298724847925cf42b34386be700f02903db5852276bee2370941f397bdc3905e30964a0b5e73602703340960c3ed6078263b611f197955fecce4b9a32e43cd1d2e5e87c4ceb65edc8853a7ee31d28e16e5adffb8ac7b760fbfc63d5f174f4d0936461dbb12c964a6b6d6cee752e5fca1ab4a9fd238dd3e8860a1d763d2019f9e7b99ed7666d4e038710f90e0093bc566987d6c0092f571376e705b342d066c54e6e2578927b92c1f0928de44e9a6e1f49b907c6aa4f605ec9c398d55df81c67373b03cc8110162fb417f96fd321048647dfcbb392455115cd912ea83351853e6a185284648842adcbd25e67174a3b93b8a64ce2ce9de0e8577b8b662ce32e2565782665dd38e5bb5fcc4fe12e4320dab7773b545a09c6d39d9dbad459f21f3e624ee6ed0203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlWNT7LdWGUXcVUTkYCRm\nB4yT8oUHcB/9OeKpgTyKyHQOatYclV1ITlE7Pc6lJ+ABoBjuLCB8GAapZ2MoAjbN\nPIIN/3mDfJtwnLS1ItPdvJGSJCJZxDvnXqJE03zPqKTHUCSiz3zHboQuppzHyhIn\nQFsHAEc4elBo5JduS47V+arde02wJPu4172KBA2PZhDBxusdS2Bt/RgiNdA2CIAw\nTVp1BgOvDEJLjI5tvBLDaX0tYJyXVH53Ti42LqltFpDclDIRLFNSWLPbLEwyrVEN\nbAetB4g1eIOGnvuLYpKYckhHklz0KzQ4a+cA8CkD21hSJ2vuI3CUHzl73DkF4wlk\noLXnNgJwM0CWDD7WB4JjthHxl5Vf7M5LmjLkPNHS5eh8TOtl7ciFOn7jHSjhblrf\n+4rHt2D7/GPV8XT00JNkYduxLJZKa21s7nUuX8oatKn9I43T6IYKHXY9IBn557me\n12ZtTgOHEPkOAJO8VmmH1sAJL1cTducFs0LQZsVObiV4knuSwfCSjeROmm4fSbkH\nxqpPYF7Jw5jVXfgcZzc7A8yBEBYvtBf5b9MhBIZH38uzkkVRFc2RLqgzUYU+ahhS\nhGSIQq3L0l5nF0o7k7imTOLOneDoV3uLZizjLiVleCZl3Tjlu1/MT+EuQyDat3c7\nVFoJxtOdnbrUWfIfPmJO5u0CAwEAAQ==\n-----END PUBLIC KEY-----",
+      "keysize" : 4096,
+      "n" : "0956353ecb7561945dc5544e4602466078c93f28507701ffd39e2a9813c8ac8740e6ad61c955d484e513b3dcea527e001a018ee2c207c1806a96763280236cd3c820dff79837c9b709cb4b522d3ddbc9192242259c43be75ea244d37ccfa8a4c75024a2cf7cc76e842ea69cc7ca1227405b070047387a5068e4976e4b8ed5f9aadd7b4db024fbb8d7bd8a040d8f6610c1c6eb1d4b606dfd182235d0360880304d5a750603af0c424b8c8e6dbc12c3697d2d609c97547e774e2e362ea96d1690dc9432112c535258b3db2c4c32ad510d6c07ad0788357883869efb8b629298724847925cf42b34386be700f02903db5852276bee2370941f397bdc3905e30964a0b5e73602703340960c3ed6078263b611f197955fecce4b9a32e43cd1d2e5e87c4ceb65edc8853a7ee31d28e16e5adffb8ac7b760fbfc63d5f174f4d0936461dbb12c964a6b6d6cee752e5fca1ab4a9fd238dd3e8860a1d763d2019f9e7b99ed7666d4e038710f90e0093bc566987d6c0092f571376e705b342d066c54e6e2578927b92c1f0928de44e9a6e1f49b907c6aa4f605ec9c398d55df81c67373b03cc8110162fb417f96fd321048647dfcbb392455115cd912ea83351853e6a185284648842adcbd25e67174a3b93b8a64ce2ce9de0e8577b8b662ce32e2565782665dd38e5bb5fcc4fe12e4320dab7773b545a09c6d39d9dbad459f21f3e624ee6ed",
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 336,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "368105195f0dc82c2cd37e8edc6ddc0c983dc13ddcf6f9db9a24b52921e5280319a1bcf797f774066d643e5c99b811f0ad9df2a3f430f4848a03ddb97e06daa4d01ddd50bf2b638935cd26b19d6ffccba884a4e7cba35830c6cc5ccce38bc0fcc4ea421347e241711a551c67923b3daaf2e9c51635d416cc2393a9a4f108f84f26990c11dbaacea75e39dc6082b539cd2c0c8dda6c78cbad12e14a352b9dd5c92a3702d8538fcce0e92e26489ea83d75c174ab671210fbc6c397be2167864b519b5136d23a4363ef773ebc140e1da4b0a788d7b1f15a300375ee42b27261675fdfc60c29bab7022dc2e624c7d1f31e278ac089c5880e701bec41f63c8f897c0cecc5eff0a801dbc58d7d4df6e860c20e61f31d9ab2d50e8fbec7471070d8ed06c4c9c725cb63afde0cc4475d3dcb7dcad7eabd874ddf7294cd9d2a66b13b6367a14dfe3827da0c6c8b9e734deece80fd79609ce5ce0a16de6610fd04a09b0b2411bae2bc3222ab4c02867838d0c8346c60589e6204b226efb401841fb95da05ff32989ef935425b943d1b5d2f8af5113491a36c60a98c90b6453144f5fe00a0df3de8d02f0f59c7b94ddc7c8895b1dff8d88f69a9a2cfbb55eda0837800950601fc9e230a5514c9674fb576df8391c51ba0febc29c267462ed5337326b6f40d243ad7d81459ecabbd00126b2142e6ba10d9f903a9918d2280c63ee84b47062e1",
+          "padding" : "3031300d060960864801650304020105000420e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 337,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "46a6c9cd78e38d5567795dbea71872ac16da06725975cee7d8839d2de665ec3b8411277f3e026fd2f9b836d788b48539755858bc8be0804147b59c09354b372713145e5a000ac15744ccd2db5795727e2f4d5f67bcab5e7cb1290824963ae88528aba0e6785989c8adb86084d26dd1faea3ae2a6175739fe978b576eff673832e513419806d206e0984d1ef0e1c8d8981084ee2ee569806b003fb7f08e775998eba1771f1efa070c00a769363c6101d5c5fc6140f102469574cd09746130ed80d14eabcd0a0418a752d5595b5f40ee0fb05f5f9860e600d75fbdd53461f5ea18be5bd807281f9e8fd6cf7eb31985206c9a5033cdea631512bffdd977fee5e692b3153a2ce9c7708a9c7d665d84762740cc9ea374bd32c18c2d76320e4893a2fac374ca7122e01e08011c351bd33725a6adad96becd44e4ec1032fbfb0c8dcf13cae9556eaf419211d0149c574b8d12ffe5bc59468c7c549283be541697258af847e52a9aa8063557dfa40404adbaa95e38ad28eba053aec3c123e98ab1b947bb774841e9040dd5409068a2c8a84c530fc4273897ed845d76dbafbf45af1a8fd2767234fac1e852453d8b7eede02af228d8b5821238a50a321490dab74d687a3400c34f215b85823424c9d966b516cccac38fc7f08769f47d66c57b9b75ea67be82508a513946bcbc809436efc4ee85f139b143c5bc15ff69ad1f3667c3f69bcf",
+          "padding" : "3031300d060960864801650304020105000420de47c9b27eb8d300dbb5f2c353e632c393262cf06340c4fa7f1b40c4cbd36f90",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 338,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "43929c2fb0986fc4570a3ee7f6701b96a78ec9297a997415a142ae539031c0e196add5e4c6ec572de0a2b109cf23a42567ebe98f42cf312d07538e4a32b0f20403b662c652ba9e3d6e38a625d6b5e91cce5c810d7a02262338e144a57db4ac4debfc536e8eaca7fe08022a2f64741d66d25e3010f2fd259d4c6b00582584bbbdcde4266d86eddfd0443ff24b06cf7ade6d733c637a48a398dbb28355ffb9bd21a49de6b345ef635b68d917b5bfcb9016f7c64c444dc0036ecab8f59b0d29098facca02335df44db87d30d02f08553ffd0379b33d13d09a385cae7d63b6db52e9b1eb8fd549e0e1e18210de1d3e9527547e5c72f816eb36288b09d96db772f955ca46fc8cbdb6eea93c841e1075c00c3c45e9442d28095136cc5ce8212ed8c60c9668898ab5d64734d4d0f2311f104cf8a732e6d88fb2064cb57bd54d3cdef7c11c840ecb238466c747289233a317b73785778ff4349949da47c9b4b2dc9f89bd1fe7e98b582500dfc05dba3fa410cca66acd854669940543c22ed1038eac7f0212b9ce4aedba0eb15ea1e75a73c45c1ae03fd241662e9cb89b051939c468db3a0adab822617b5bc669d1e0226cf6b475445d9d5e77ef54ed646cd81f0952b949b7f4f37381ba6427e060966467a76e1d9261a5fe8c68398a89eb5025cc39339885b6c33dde898a159f0af4acc81461fae37f5f4c61de4a888dc4f6b1e2b7336f",
+          "padding" : "3031300d060960864801650304020105000420532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 339,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "0e207de1295caadb15098f51f5db90f9f000776055b107be58bd24d52a01d4171cb9e47a40790254f86a8a56c8ae38252f909aa3b9bbe7b7e1fed008105690d9afa647067ac122a272d30ac28213d2cd37b45cf81dc48d59e87d9ffaef6e1c9cf6ddf4ea5ff6123523c9cc885344b7e1ef4c8096bb542bc0fa5c47abaabca9a58ca85bcf092924741503a0f3c54c725c48855dc434b09d761f729051fb15af5612bdd387b4cd5019577327bb2e64edb065f713d50ff4285f1d184fe709207f809b9c38d064722897a868f8a09bfe1d33c80be0693e98d7e85600befb643e9f713584c716306731d7f8087dff66be1c4f6dddbc51b6ffe6034845cf0f88749e039ec314887c94648154f7c97235323bf78041ec2c8ee98ea7c553ecfec1f9fe89279c9c91ac6acd12ebe969da4c67fa6534ef9ace4b629c7b1de8c4ce1dc2b0f5bd7d416db6eb512a4dc8eda0322138cb7c65b9a58d712284e4aaf059db80af5785af4d83d391b7d8bdc4071636712410d1dde662478eada1a2f1f35786b78eec77b2788536108e7463d676814a91f81fd5e2084a8c1b1cc33988e73184110c6e6b0ef1de874104602eb33b5276ebbac95d91b943e25de6dfc66b31d8091961c78dcddd358de7f25584d9f74dc6271ff31294bee2cc9b2f97a2583c9b33243600500bc723b05d65839de7442895bd57a1dd508651a20e20f264d8dcb59d485247",
+          "padding" : "3031300d060960864801650304020105000420bb5a52f42f9c9261ed4361f59422a1e30036e7c32b270c8807a419feca605023",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 340,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "0a882c367ff495646c21ef0489ce268d6c4e6cd0176bf9488d4b8edf04e1706f23d121b500b427eb8652099689429a08e73294cfd29694f9b4f33ebc8a7f9d0f9d11f114d0f848114d116ebcab828c7ed4c64d5ddce9958bd0883ae82ee2be0a185d54ae64690accd816971ea5ef80d7d601e72a814b9b61e8d00727a843ac90639f2c83cc7e2a9065ebea3e7aad3b12dd9ed8a1ee03a43e669598571490fd92b699d2941fda3af7271f8864c844f8efcbac20066c7bee682c644da2329db721ff33a7a81869a7bfb7a910fde6008e1bdb4e9ff989ff78fc0a9f43b38399083808fb3f38f0e96d4020bf8a4b329bbf81d59dffb03f5d1ea34276ddcccc2a4319393e1777488c843f9b0aef1fcab7a97e00d50f7f83bbfd30272c8ea4a5b0d7b74e7f7b70a9295d0e942e5b6e627ff8457d0f60c1aac8fe10b7d7ab1b8cd18d3904bfde2a316a83ee2b7633c3dee3141fbd61c8115f88ee7ca4b2b677d1803a1a35361c956c1adcfa8c8e10f0422eb3347b4983eff3c1c79e7da80a2e7c6d55e61f5af74254bd91db0d4bc10c3812513d832bd6a603a6bafd29cd5c062d9e3b74631f873fb3ab47e59791446e5f795d6ef5bbfa267a541d4405dc09e82c8b03f51db4798cc96dda7a7bce7ba9c679d851d5dd2e6b3735aaa2fcff0d558d68959c6af8b283fd383315762767cd0e4ef6e027020148cd3b14833cad4d92c2c9ce15",
+          "padding" : "3031300d0609608648016503040201050004202f77668a9dfbf8d5848b9eeb4a7145ca94c6ed9236e4a773f6dcafa5132b2f91",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 341,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "374603f5d4728526e6cc7c7bfb6f456bd33bdabf37d942dfa8132a9479f6e4a9c2dfee515d883ace45cf1d660190e442a9ea7590d67aac9bde6951314af90baac21bed537c774148afb7927337d626525e13fa15664cdd78dfa5e3886ee1fe7137ad5f69aadcb098a0d49475b0f76ed1bb86cbd08a0cae9a6ec120eabd55b7e5c4456bfac2b2acc3892110b7f62c0dbe7ec7e491474c5c641453743fd70b15f7a726a0ca44a78bfaf3445a979bd4df362b7f29d4ed9189bfcdee01476cf1b48c2edaf02d226b41f587a8db161bd36e6ea20d64c8773fbe8c0296b9e016ccde333b380161a641d822bc65d3b60417534072263cd461a4f77826cbd0508ea11720081c34b12d80ef0963857624d48c53748f279bf6ad338ba564e35d37d1dea27d19ad5dcb76d6f4aac62e49eededb1121e06b9f78eb285f7d7ee2cd475e791cc04c029cb76e5b33743aca3ac3adf5e317d95aa79a2f0ac3c328e69ea4692661b8107d89eeaaf3be01122544fd9d0c61511e87c6a5507c5701655d35f71586badd55b26363b51f019896c03326c72332de5be8a0f146d630a6e747a906684c7dc59d3bda667c8a92432e879f6a4d91d3cdca89b9840285bd8a22e5e5bebc32011725f64cb5fcbade8a5f5f9ba372a9be7f0a4907e40b4d06feffee3a558fd023514b504308a1d821c41955c305f550ffdf005b9bd5dfce2d16d3d09bf17c156c4a",
+          "padding" : "3031300d060960864801650304020105000420ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 342,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "401bf4e63be4259b54c5909797b2b01fca18a6f74d76fecf75535f2876079ad9ee56c653dafc3513eb02114f5c96efb4025cf58c2cd576d003f688b11458fe3df1657657ed52b2756a99b48c6722708ef11765c8da2f3b061c779f26a64fe13e4be4602d0ca2553793d36c23f3194705e34a75b9b91ff7f4e554c5907b85ecb561a8d22262aa3669cc7be2fc5c21b9170869ff52dcba46b2b1c688e4c04e7a8f099e3a4196863bd1e828fb5ea5443b64b190327622055d44ff4c9999601338e56c175c716abf8d6c2ce6b9ef17930e846745e751f882ffb3f0b1a20e68ce9083d1466295caacdce85bd4a34615d09f2051839ff83650708888db818aca9229c38ddef86848a2c0c88b86a2f5a1079dcf0e888be62e116850b7e8d06785627fca1899f6d7c02eb60c3bae0d538cde8a05ef7281bba7f35757360ffa79fdd08642b6af5aaf8c71a32aecd0e9f3d9a2ef164da1740a5c2dd7943603bafde05e38f2ba78c15c3eef13a5059f3f242f07af2e6044896d1d6d9810ed3fb8203ca4efc116e95d2f53be8c55fc1ce653f02597c0df7d4a7dd88b41c2a65e40bf5dafbef2a97e4dc3bb49445774cac283ae131c08492c9715712f998241e16eb776915f15b7e9544ccf1dc220a9e139defd63cb2951090808395ce56555a7cdab4564d82151ddc0ba00db24454f2174bf0fe7ffe6e2d9d82a92437890bcae1601dbcea29a",
+          "padding" : "3031300d0609608648016503040201050004209432c1a7d343fcfacb164bdc44ff71c1281c004886b1c428419088d06cd3561a",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082020a0282020100e3ae7de5bf44de7d357e238c8dff063ca713470777ab786b495884e7a9ba1dde65de7d2b5be3f2b7d1830cf6ca8ed5c05d3f094aaaeb1dd2e4b2ede08613109a9ba34c7e2bf8450225974374459f16da2c14192c637985febebbef01f0381e78d0fd63b76038f5e3d35dc7d2243963366af5d7685f1bcfc99dcb91e94c93019068353122edd03cc3e615e17c1bf1dd7c43dae86f47a40238fb594041cebdba25f3fe9593a6c329b7f7c476eab7625d17ba7be7886936b733f8dce6e6c937f588da1315c1117abd29c83895d95988d17f9fd7623960d8e433d7c6841507ff2faac36e0e19a41eb2cccdb2a2c0fae966719a99d203c924349bc0eea1374efd3e23099b2d187922016fd014087520a67363687322b90d7a890d8f4464a8c794d2a3f2070ccd3b0ebbca2b42bbf8eba6f2c0bf8008b5616ee7b81629ebff97a93a5b861989daa10da7c8e3bc7b0cdb095f6ce1185cf8fd3dca035eb3e505cbe022d81d93945a144806b9fe0ba07f3ab9c70e72b5fb77ac6e4c7e03aa2dce7c5ef227aba1acd48c1d93e0e26f01e8f1e43aa97880d15d6c924b060d1face21d03a796c86301f4a74339e472b2f96cd0755741cb9df3535077381ada84d1bc0846a6c44c8a8d3cfe1b7a9913d1f3d7af2c5ea4e67ce0a7ed3c0058206fd13ad9ccad5a8212f3ecd788368a6b6148178c7c5ea8d6d385227f2c76a047216e5e206b1ed10203010001",
+      "keyDer" : "30820222300d06092a864886f70d01010105000382020f003082020a0282020100e3ae7de5bf44de7d357e238c8dff063ca713470777ab786b495884e7a9ba1dde65de7d2b5be3f2b7d1830cf6ca8ed5c05d3f094aaaeb1dd2e4b2ede08613109a9ba34c7e2bf8450225974374459f16da2c14192c637985febebbef01f0381e78d0fd63b76038f5e3d35dc7d2243963366af5d7685f1bcfc99dcb91e94c93019068353122edd03cc3e615e17c1bf1dd7c43dae86f47a40238fb594041cebdba25f3fe9593a6c329b7f7c476eab7625d17ba7be7886936b733f8dce6e6c937f588da1315c1117abd29c83895d95988d17f9fd7623960d8e433d7c6841507ff2faac36e0e19a41eb2cccdb2a2c0fae966719a99d203c924349bc0eea1374efd3e23099b2d187922016fd014087520a67363687322b90d7a890d8f4464a8c794d2a3f2070ccd3b0ebbca2b42bbf8eba6f2c0bf8008b5616ee7b81629ebff97a93a5b861989daa10da7c8e3bc7b0cdb095f6ce1185cf8fd3dca035eb3e505cbe022d81d93945a144806b9fe0ba07f3ab9c70e72b5fb77ac6e4c7e03aa2dce7c5ef227aba1acd48c1d93e0e26f01e8f1e43aa97880d15d6c924b060d1face21d03a796c86301f4a74339e472b2f96cd0755741cb9df3535077381ada84d1bc0846a6c44c8a8d3cfe1b7a9913d1f3d7af2c5ea4e67ce0a7ed3c0058206fd13ad9ccad5a8212f3ecd788368a6b6148178c7c5ea8d6d385227f2c76a047216e5e206b1ed10203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA46595b9E3n01fiOMjf8G\nPKcTRwd3q3hrSViE56m6Hd5l3n0rW+Pyt9GDDPbKjtXAXT8JSqrrHdLksu3ghhMQ\nmpujTH4r+EUCJZdDdEWfFtosFBksY3mF/r677wHwOB540P1jt2A49ePTXcfSJDlj\nNmr112hfG8/JncuR6UyTAZBoNTEi7dA8w+YV4Xwb8d18Q9rob0ekAjj7WUBBzr26\nJfP+lZOmwym398R26rdiXRe6e+eIaTa3M/jc5ubJN/WI2hMVwRF6vSnIOJXZWYjR\nf5/XYjlg2OQz18aEFQf/L6rDbg4ZpB6yzM2yosD66WZxmpnSA8kkNJvA7qE3Tv0+\nIwmbLRh5IgFv0BQIdSCmc2NocyK5DXqJDY9EZKjHlNKj8gcMzTsOu8orQrv466by\nwL+ACLVhbue4Finr/5epOluGGYnaoQ2nyOO8ewzbCV9s4Rhc+P09ygNes+UFy+Ai\n2B2TlFoUSAa5/gugfzq5xw5ytft3rG5MfgOqLc58XvInq6Gs1Iwdk+DibwHo8eQ6\nqXiA0V1skksGDR+s4h0Dp5bIYwH0p0M55HKy+WzQdVdBy53zU1B3OBrahNG8CEam\nxEyKjTz+G3qZE9Hz168sXqTmfOCn7TwAWCBv0TrZzK1aghLz7NeINoprYUgXjHxe\nqNbThSJ/LHagRyFuXiBrHtECAwEAAQ==\n-----END PUBLIC KEY-----",
+      "keysize" : 4096,
+      "n" : "0e3ae7de5bf44de7d357e238c8dff063ca713470777ab786b495884e7a9ba1dde65de7d2b5be3f2b7d1830cf6ca8ed5c05d3f094aaaeb1dd2e4b2ede08613109a9ba34c7e2bf8450225974374459f16da2c14192c637985febebbef01f0381e78d0fd63b76038f5e3d35dc7d2243963366af5d7685f1bcfc99dcb91e94c93019068353122edd03cc3e615e17c1bf1dd7c43dae86f47a40238fb594041cebdba25f3fe9593a6c329b7f7c476eab7625d17ba7be7886936b733f8dce6e6c937f588da1315c1117abd29c83895d95988d17f9fd7623960d8e433d7c6841507ff2faac36e0e19a41eb2cccdb2a2c0fae966719a99d203c924349bc0eea1374efd3e23099b2d187922016fd014087520a67363687322b90d7a890d8f4464a8c794d2a3f2070ccd3b0ebbca2b42bbf8eba6f2c0bf8008b5616ee7b81629ebff97a93a5b861989daa10da7c8e3bc7b0cdb095f6ce1185cf8fd3dca035eb3e505cbe022d81d93945a144806b9fe0ba07f3ab9c70e72b5fb77ac6e4c7e03aa2dce7c5ef227aba1acd48c1d93e0e26f01e8f1e43aa97880d15d6c924b060d1face21d03a796c86301f4a74339e472b2f96cd0755741cb9df3535077381ada84d1bc0846a6c44c8a8d3cfe1b7a9913d1f3d7af2c5ea4e67ce0a7ed3c0058206fd13ad9ccad5a8212f3ecd788368a6b6148178c7c5ea8d6d385227f2c76a047216e5e206b1ed1",
+      "sha" : "SHA-384",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 343,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "a454390b04bfdd69c4be2ad1bad96ec901639f0bb60df268415b4a93b4cd53510fe64f394b319e66ca8605d7d5f7a05dae5eff827060013503d857a977c09ef742525e43b7e69d3802a58206e696848a87ee17b2b9de6829044349036554c659c8f8866c401fe85869c0a5ea90739c4983a1561a84e4f0bceb00015a671f5283f41f0bb8599774829b6a2de24f14d83351c96e35ae1475c8b4bcd2cf66889237a206d147b0e949f2b2028ead379c74203017904ac09a5561a8ec343be22cf46c3bc2a87b12cf9cf6e8fb22de884bdd9677626b757a005d3745f387d296347d3852ddc2c4258cf572dc40df3ff6a8a5f9d8b1b410c54739b9ae182611ec01805c80b445d058ce2afc4bd58d87c03fc9500fba237bcbedb0960a1a02efef52b97cddac63b5eb0481c0c0991375735338ac84c0505415ad2bf8e7a819ad269460668ba8f8c879f521ec9dc709e406de023fc0f9129a3a94eb1f3af08d33eed6273e5166f31110097f5558d8d9028ff558e627c9c0db2454b134a82a9dacca5b4032bc0e27c4d41cf55e9d89cf51528bb4f08c6ee5ce651af3772f008a44863c851933a57cac8e29a84756c9fa7f80435b3b78486f9908512902d5461964918239c76b6790b780e09d2f1d3db1c59b275d20bb24fa4f518b25af3254b61d34ed8b444d3ca736ceffdddaf767bdc92b4543f68b25421cb8c1328f2f253e446be46d10",
+          "padding" : "3041300d06096086480165030402020500043038b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 344,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "909c1f13b544933ccf3bc73ff5053a8a65a8f01b447d4b40f109cbde29d866368aaebf46c19051092063993862b32fd166006bdd4d988794d4e9a77821fc9e684fab1366a2d988eaca60e4fa8ea947dbc4b8438a9fc036691107d3d0be52c46c61342ef8fb7e08032921c1b455c55de28d58c77c1eaea03f13c26c4cea73d14acfa8ac2907f6a775273e7686ecf4b882b88a42cba11cd1efa5b985cf5a227654e54cdc9e2d283b80d250cce553fda636279336ba13f7f3659d70b5b2995a2ac7b60f329c62790d8eed1c3dacccd0df468a91e767c190be41a028d4efc1c5ed5e6f3a77930f50217fde9ce9ccb66b75731957959834839fa3bdc1a769fabebab03d3f0e605a12aa9fccb2a9421591a7427d82068623582de592935904b59a42e59b50419cd12d71da871862149a6500ec6870d989423346879551e506fada7c0c01b328244ac5f2e2c5bcbf4b5b09a4512a0edc90fee4d4dd9eb88582bfe37b49b8d8189051b32cccbc4d300284f9e523674a601b1a725722695d5ef438b770b575b6d0955edc761250bcc6a30e8d5c7287093236f223c2da8d9ab7d6b58e5d0e9167f2e8c58255ed16b63789ea16046bd0f987b156e9898076d444cc7a4aadc76699a2e3a442d63ca4c3f92da9f3b2c4ae13edf9d4e28ad206ed0cbd2df2a46920e298abd1904877b75c1a9ff80c5bf05bc5d1ab94d379d064fad894918ce326",
+          "padding" : "3041300d060960864801650304020205000430a5a2cb4f3870291de150e09ee864f3b2b3b342937ac719a149439185ad6a47bb4f23ae83ff20f0c8f0c79a1764244a63",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 345,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "65956121a818b842d861d0dbcbdef22aa05c7e94ce5d748308663e142881feadb85dc4421d9d01833b8b4c2713842c77949cee8b853286107c655de7778a5acca11afbf1d9dad429eb6a281c1e8ae1cfd37cdf530fd4f2b765c352bcea26ce44e2165c36553318d89b1e06ffd8a210cb988cbfc916a9401fbdaa56a1a2a4cb66ef00a3176182d33dec5f3625b760c37c82cf618cd2875079a36015af21d060dffeb5c9e1f4255d7fea64386d8d860c6868cd79ef6d7a87927753a78bdb63c4845306de1d73c5d7dccbb6cca9b65aef19a7b9e53d9c02a4a2bd6910e076959f9f40c30eaa0a6ef783c0b73f05566e4492e16b832729e03fc939e54bf0336d376a3b4cda534bee446dad3fe51d20bb8a135103e7e12220484bbe02e99c5803282ab90d11063e5243297f80d3f24ab08fe8f2fb62702b0543f0203972d35287ba64facbc635cb438a888c83c7028a325555f07521c3095bc4e38bd0f60eb90828319777fea2276e0bc76f2c13ebf92f802a08844209ccddd2aac1f2700e8a5107e86426e6ab76288fa01de18b8a63551fbe8705824d16e5190c559c7bbe8a17031e7d352a681b0418cb36423632ec48a8d3861136b250ad2fc72388e771b41849893cdbffe04aac4037209944ff3174f86f7a88414b1666727c960b1e54a2cdb82e39cf9f2661f4ad6e22f330b350eae7f588a623524617b1846486fe9f04abbf5e",
+          "padding" : "3041300d0609608648016503040202050004307b8f4654076b80eb963911f19cfad1aaf4285ed48e826f6cde1b01a79aa73fadb5446e667fc4f90417782c91270540f3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 346,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "3b35a042a4791dc1ac1561ad1038750bb9a575a7ff72db2ee60ba027f8994bcbabe41fed36417bd139a286ed0aa6c3ef2868a7251442d060c1cc67d4470c3ab7c307acb0c0641218a45b9cdde05546653850c2168a59f1788cd55dacd40afe38eb941ff08ffa8bbe609f2aa795c73c0368f482d53d691980891ba43b69f5791c2e6f70e17a996a299e60ce1c9d44ebb9f29e700e9ae216df749149f6c222d1e1733953553a792745c382d44f52ff404ed5ee04c41ac8acc97c250f9a5e3cc6d70902d51e8ac000d05e36279d83491dfe6a40f222bc1dfcfa7fa5e0197cf47528f77719e007b65ca39dae17bd0f323b00ee63b66401e2ec5f8917ef600a41c3a61571a4d922c0b0ad0a290ee054ad15e63f1a0cafb749f80cae6cbeb06be62e1608b502182d247bc6a37abe5fd750ead8b7216a35e74b969005309b14be36a31c5e6c2266701d5afdb5ca2314e2f32ae17387d8284ad2c7225fa63ed47e7245a65b74f53a5bd22654b3878ed09b1e5e070bc20eefac6c95b006b8f3e613b19f518c48ee6781a12bd08ad36ba384d03d3ea3c4e0b1facc39741f9ec73d0335d2ee735355955ed12cf8b999d155d389b1a3caebdfbba32c883ef7d0e112d86e6149a3328b63b9385c68fe8a7b679e8436aef7466067a8e8bb49e31675729b3f448e7dd3c048973d2a5f8f7173c4428f3982a99361fa691d1588e39cd4485c450158",
+          "padding" : "3041300d060960864801650304020205000430f9b127f0d81ebcd17b7ba0ea131c660d340b05ce557c82160e0f793de07d38179023942871acb7002dfafdfffc8deace",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 347,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "09d8512c4667994623530a2317bbda738eb8917bc80c84b64793351463da171bccc88b95049a57ccd917a4687da3be63db21b0ad0972ed9ed182f4ecc8e06647675340192a57e6591eacbf15d2f5fbdcab568b16ed86e668144d9e676e55ec4df1dce61f672de9f53d1743b72993a5d21ffeb7ab58e0f83e297cccbf25ed68c70dd8441c119afb6c07fb1d83edd9bc1ac34046733c8b827d002c3b6072d74a6c2cf7f1d968e9f7b0873de8ee5adf902dc68fbc93171f763c425964ea6e3af6691f1a303ff7837adb07a09f728de3377fff74adb34c959d363db650fa5c3035febfe8c62a0cde3d006a9d34d51c5b2c4a1dd4f2423c532c6b5fddf03e0a05fdf8d857f98787d6f55f0ce1d0ca95a37177657035ee48bd4f39f7d520ccc48ee999777868b4c3876e2242f59b725798bca28ae66c267c507cd65fde612c1fdc9362994ee31134d5561ad7c3f523858f43611c249cca3c134d00ed966a82b800da11add213731b58caf232fb2094e9dd42ceaffc7002f1592e79b85eb6e39ed5de8484f5509e0f54166426095e8522f88363fd0dd7bf64414011a710c7834958c0aa308189819cd4488588b84729dafe163e79856b913ef55afed55e83ee5b812579b87cdb80d5bc9ffa02ec32a0d97b0a56bfaead58a438cee53d40dd197fa2eeef4aff98eb5590163e68b5f3de443909769080c8a6bf87e3808bf265a41a3b79f8",
+          "padding" : "3041300d060960864801650304020205000430b526d8394134b853bd071719bc99d42b669bc9252baa82dcafabc1f322a3841c57cc0c82f080fd331b1666112b27a329",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 348,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "798f597e9ad4ba8b3d00a9527f4e785af5c55994e2953046a1b9062945e8dfa35eedb1e31af3daf1955d7b0afe74fbc53739b1aa02fa2dba629c31b211cd513e2248ed847dd579406ab603d3369de3bb07143a581734fd8b1ca0358c4fda639045be1f192b233efb8848bb2c544e4e188e0c7ce311bb4841077d15051c6f6b31998ddd8a7bd30d75b7b3c824358bccb35f8ffa8c0fc5ac37ed71cdd48ed3c0269a638317756bdc9287043be1b4f3c6ef6423f1d0d38857c195e7be81c3778648ab889474109ff3c7be0fec790d3f5f50b966e3df40c566f572f8f252d09e97d4c90442badf820c7db74d6fbb004bd7eb53c0b1a871bb9f480821bbb48b363c85c9866bf8a86de9c6732a3136f2c80e88a29540a9036b72fb8f4c898e7b487c41d0f693c91309bb3bc06f1e3b2fa9918c31ba2a4b82a37a927784a7c7d2aadc3301524ce2708774c3e2189ca188b3d85a33348d28ed6f080a06452bf8316d483e6a5e28b831797f85a8ca5ca922bcd94b9045f588ea9e15f2a20dd26817eeb80b3421c5de72db98843dc719cfb1aff1f927ee1df1bb718732159bec70d5b6d0f98a3fd5d42c31ecf4124cb1759f183838d676eca2cadb4d57f2d6a52cd0115ffec0fd79c99aa78df8c6b54797a590bfefd4c34e4c3f39750ba47f4d8002a131b870ff8e65c6c37b75e5c54c8a2bc2fdacedb41f30ed8bc9029819b7064b6514a1",
+          "padding" : "3041300d06096086480165030402020500043054a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 349,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "41fa907da9f78e107b58ff6c4ac0e92a9bbc7f5b510260572fce4ef047c73cab3fb0d00b353b4cb9256dddad432c5815652bd83c78e657075781140de56189ecfbe1601f24bdce05c63f511a3d04673d24c4e943695d7812aad66f374a74a906177dc729090070cb5d6d518e7045f4cdece06ce2ae42e1177c46856a8425e60bb06040400c8ba0efb8d4f395a4377d4c2c128c68e6b30e358a73d9904d7aa1e517ef396526cb64d39b3b36ed7204b3bab1d91b23ca95b2ca1da3eee91c7d27b4e4e658fbf5060a79cce69be1d95252b0d7d7220797a53982dc371372969d4e06556507e7e7870a9efd9e03766702f217be1c8f7f80006c08d13e175040cf28b215deac6a1ebf3520a3ad9e91f9072dfe50c69d1aa5a0df73ad63f72831b055f2367ea35cfe676a4f7970bc85e2b58917d1bd449ed3d274ac40f7a515e261df3d067a277ae610e4ee4cf68b3a947ae8c8339c818ed10e73b6480577b2a13722023cbb09d3b378cfb71f6c86bd481ee09a1fcbb807338e968aa5af993697eab562aa4975562eea6b1169e86c75ef13e877cfcd4608994eadedea3eba55af19a7a55b19e92b974450a593cde717bf0d7ddbf0bbe8fef90816fecf86ec522a2d06a04ebbc50a1eafd67aa461a8a9cd705ece0bbb46cf773689cc19cd69607594fd2ebde06aaa1e34ebec001edf318fa22245876461fc46126172db41ae9ecd74700e",
+          "padding" : "3041300d060960864801650304020205000430ae9ada2a808aca7097c9e9c30fba4ca60a5e79874a6be0f5afeb7f5df3538346f04b84ee06bef7ac879a0085bb2036c8",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "10001",
+      "keyAsn" : "3082020a0282020100c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d30203010001",
+      "keyDer" : "30820222300d06092a864886f70d01010105000382020f003082020a0282020100c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d30203010001",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyadlwmYbRnTP80gOml5G\nKtCtL8m8b772KEezET0gmR9lOWeXHCglJ1P1+6zOASwqirWSkU0mnvr6ck+kuSDj\nQJMMEG97Nvec6/DmLojg5HaIjp8OIhhqzbbEUjojK2W0/yzCLcRPilWVJ9edfNfc\n83cyEve7mqEzwxFlzGY2kL8SPXOSPIOJKcyv7lnWxwlbjUp0uvLRksmk6HxOErxY\nATB4sop3iegunzHeH01qKqboBjK+jkvfJj6NSbCUFvsZxIjAetivciq3kYKyMCin\nHgZdAkEqnuvEbX2PTgPXkjjYwMtKl6mhIA67bsZAQuvsytlWdSbu7xLBfZTBBJyI\nmXC5bpTMNTFyomiknF6L7hPBWznexE8sehqjenoLb3IpCsraMrHYrx/D3IqJSHuo\nE0fL6xNQkl0w+SOVgQa0mVnIcefB26VdoHcuNiz4Yh14YQhouJThbl3+yWh0qTpM\n83m0fn4xjOMVBm1w7jk4FApgFI8gUIXO+KdwDKPFPVKldWpjs7FvFTBithJipoSW\nIQyL5O8/kCnKDqDjs6DV1tIm7bv0Ta+PBF3Cht7TxOxNtrRTRwefM+r5jjyVtLYO\nee9KMJP+7FQ3A0Irp0oRhRHCGTtU/otjOGbtLHBcy8bn2dNlaAnsPTNW50AKlkjs\nN1BQQePjGvHALu/pJKZwR9MCAwEAAQ==\n-----END PUBLIC KEY-----",
+      "keysize" : 4096,
+      "n" : "0c9a765c2661b4674cff3480e9a5e462ad0ad2fc9bc6fbef62847b3113d20991f653967971c28252753f5fbacce012c2a8ab592914d269efafa724fa4b920e340930c106f7b36f79cebf0e62e88e0e476888e9f0e22186acdb6c4523a232b65b4ff2cc22dc44f8a559527d79d7cd7dcf3773212f7bb9aa133c31165cc663690bf123d73923c838929ccafee59d6c7095b8d4a74baf2d192c9a4e87c4e12bc58013078b28a7789e82e9f31de1f4d6a2aa6e80632be8e4bdf263e8d49b09416fb19c488c07ad8af722ab79182b23028a71e065d02412a9eebc46d7d8f4e03d79238d8c0cb4a97a9a1200ebb6ec64042ebeccad9567526eeef12c17d94c1049c889970b96e94cc353172a268a49c5e8bee13c15b39dec44f2c7a1aa37a7a0b6f72290acada32b1d8af1fc3dc8a89487ba81347cbeb1350925d30f923958106b49959c871e7c1dba55da0772e362cf8621d78610868b894e16e5dfec96874a93a4cf379b47e7e318ce315066d70ee3938140a60148f205085cef8a7700ca3c53d52a5756a63b3b16f153062b61262a68496210c8be4ef3f9029ca0ea0e3b3a0d5d6d226edbbf44daf8f045dc286ded3c4ec4db6b45347079f33eaf98e3c95b4b60e79ef4a3093feec543703422ba74a118511c2193b54fe8b633866ed2c705ccbc6e7d9d3656809ec3d3356e7400a9648ec37505041e3e31af1c02eefe924a67047d3",
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 350,
+          "comment" : "",
+          "msg" : "",
+          "sig" : "9cd28bf41b99fa4df2852d86536257fe111f63f01815146c057dc3bda9b6633e49495d38822392b6b901e6ac69c4f09623a524e49246c3710c85a1957943d89c8399b0c2a649938bb07340f14c6981a0da0fd35163bc7eedac80ad1cbf06a4c32a4a08523554256eb221395c76e1f79a5e3c5b9636673db3ba27eebf8315468888671f8441324e092124df31d396ad8367eb7c9d0afa44dae85d56208ba21ec7c1f0ed6a3678f5d97ba7089422c662d86cd514fe853f38481632197c1ba07e4d92735eef3b75afc25ffa900769c74ba34f2d157e74bbab64cf413bc858cf6c393e8afe24f9e71168e97db96717d0081d88a27257d8c692dd0e001f3fdc2090512550ad38725c10a201fc50f8dc89ecf363b4d21a7d815eb78557d42e657cb44bfc785203e8de00f9e18af1c8e12953a33b0717af215d9b04b71fc320bdf4d558faf55d03d30844237551e35ed6606bc706ca43a47e6c493e14719049065eb8e00760283ee72c1ae3ce019ce3263a90b8340d1a47b49b78d5cae9602539b379186e5c1e847b69c75152036c8d9ef3c77ecd151bdae7ff36a459d0bbc1dfa33ce3dcd94ee2cf6ee08a77485746306ed987eebaae2baa544b543b5afe143e4122ade5adfa4fd463a246f29482dce7a51573aa18fce87f7edde842e7f21ff9e40c4101b922616ee4c14ea1af3c4d417fe8876af381027d837fc40dc684e81b9eecd4",
+          "padding" : "3051300d060960864801650304020305000440cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 351,
+          "comment" : "",
+          "msg" : "0000000000000000000000000000000000000000",
+          "sig" : "659ffcbf6b22f5d201fa4114077aa7df32b513a1fa5948ee01f6e21c1862a2b91863f7aa53d1aadcab9347955210a91829a5f7c86b3e2850bd1f76b3c4f4333615ceb22830a7a9d7a13436683a48995bfd62f528ef4959d30b6ddcc8ed2a431c06c337250f8274417f6369b7a08b927885df52bd7370d3675094bf1bd32a7f5b0ca9a399a59f868cfb78f87b8647ab37d0d7a58d6f4a58f3e3df7ae88ddfa6470050229754f4ccfa265cec0635f0360c485d8f81974c6b8a11adce3775dd01936b82db37641ecf5f43cb8538055a053d4085c38a8a1c4e0c8af961448a779288c5efaab1eb4401c8f388c0b729e42243d935df1ad3705c1c5a7ffb6ea8ce77a69481a3b930f95ff118cd0fdb17393a37139b3b5a9c275c6bbbc819e18f49c369153bf1f7807b450e54fc28065a6ab6d5b0ee91d0a9302ebc0bccd35c2fb2fefc341a954b67e91f6d8f3f7b62c5fbe504508594f357b1ed951fcac7043a082b9bbf41ccf609881861e2de15ee99d373c0e99027ff240c0b6fa52be2e199967860baffbe25b3254fcd375da7152bb94ce8dd01465290fbcdea0838a69576e97e63cb636db79c2799a26f94a9fb044e3bf66c520895b4683bd799e6b04ab62f621dc00f20a4adb131606f127b84025269466c760181d7dd9ffd0aa5381180b541e5e933e1841d6386ec55a63bd9d8674a775526d30dbe34e4db87067a9326c6dba0",
+          "padding" : "3051300d060960864801650304020305000440d296b892b3a7964bd0cc882fc7c0be948b6bbd8eb1eff8c13942fcaabf1f38772dd56ba4d8ecd0b626ff5cef1cd045a1b0a76910396f3c7430b215a85950e9c3",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 352,
+          "comment" : "",
+          "msg" : "54657374",
+          "sig" : "46eaa4624a4d2c1f1043eb3d17b48d977819a8796f48f20174c50da624c657e64d3154dcfa2a5b1d8c6d2ed07cf1f1c19aaa611d6466f7e7ec73df5ee786573adc5a9e3c1d0a25559dad282db26e889807764115a05a23959acf48d23b3b33a93d8b6c7de3ee446f113eef96055d285fdfd27888e569c50f022d5e8abafc874dd5a61df6258e85268bff66cc5643107f7d9097496caedc185b37311ab6979f273e5670f143146b68e44b49389554772c1ca7bb7a12fcf67d67a1fd0c245bb4cbb924276ae756098599392cde076a1c0edc8096d9125e5a5d30c2a93d00fe2e0362e98592c8fd31ab5b4c3b34e65d38ca0c25874eb394e04969982b70932616b75ee2912c6a07f20ec70e52be630ebe024c0622aed125e00bc84980416b80cba7752eb90af2b8215c4b559880d2e1c577b7374531038083725d23d02d4fa5d8b5a4c68e9ea5e11fe2d9e03c1b8a4db0b053097b5a175b1131e8beef5d559bcc3f17ed2e6f6304c0e4650a2bb675aa8de44af8a2e301734584eea145c4b389f6180e6395412ae70e57f488ed15d45895be580bd87cd916b8f20e46ad2fff0367dda54266778bb444c6e4fdd45fa62cae3aeb54b6a7a6b4d8068e3a4d0730f0260340a6c32c3c5d33f514612c941bb63d730df5584933e12546500495b5ed3ba3631a3db871d17353d4c16676a0332ba4c4c4c68cdb6ff21ff737ee249be153c1d9",
+          "padding" : "3051300d060960864801650304020305000440c6ee9e33cf5c6715a1d148fd73f7318884b41adcb916021e2bc0e800a5c5dd97f5142178f6ae88c8fdd98e1afb0ce4c8d2c54b5f37b30b7da1997bb33b0b8a31",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 353,
+          "comment" : "",
+          "msg" : "313233343030",
+          "sig" : "12813153b37fa6c0fd755a1c7c409bb8169c5a39d045dff2da02b2f8e8897b0cdc6c2d40e6945b97006f18e1b26983f77b70bf2961b5e5f2759241daee8c56fca7c53c81f69d3a0341720d9761a4f7be8c068464e881c85a2c39e0ac6f74f6f5cb42df8c3713f66a282d7fba85b7a09a6af83a068b78bfe83ab25841e4bc67c9e40cf2a0974f8875fb81cc6a115b91f922419c44ea82b33187521a7e1f46c0ab9459b4e97a3f4a1d9e92403a37168826fa0ee914232afb6c4d7dd082d0c58885e356d0efb8aa9ae33d045f24b4b3182d5c54556f5838c449d31a49a3ac4ba568c248ed72c111b5ffabd991ebf5c48efbca33cb38996d584992c4abdcc7b93700ca03619412a355b41b000a32f6cc4935f942209b56a23cfb7b788dceb692343995f77daffa25e44d672f8bc451f776560b415d0d1bfe9925af1c2567a8e9bd15b8554d93377c62b0addabd27e8d9e0859f498ba8e03094e1d86d41e69f7606d9f1fac04744c3b7b8fc4942a846e2a3649bd9416d500b9895455fb6741ed8ed4f426f20ab40d8ab2e6cf6c63f5c290fc011768b317bde49753efbdfd12583f1ca79287225f9c3d3ed0c4530815e4f5e7ed78d14aec0d04142d0ac0fa3bb5d73b4bfda2fe7103a2ab40672abf08ef4d9e537b9f856d32450e2e41d9277be62ad0675d1a530709f2747f51f17aba10381fdc70c626bab45d51166b6f6ad978d2dee",
+          "padding" : "3051300d06096086480165030402030500044043f800fbeaf9238c58af795bcdad04bc49cd850c394d3382953356b023210281757b30e19218a37cbd612086fbc158caa8b4e1acb2ec00837e5d941f342fb3cc",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 354,
+          "comment" : "",
+          "msg" : "4d657373616765",
+          "sig" : "27a042625f50673fe9edab9aa2fb4c60dcae0be2e8b75662bdddec7b1d698065510a193e17981bb0b1c32e46d237e15915afe2e2d4890c09907e1866095c19763524b6c8d2dbb7814ac5047f0a082f7fed4109741f4719e12ebb91f27a3cda71e80ec8a7f6c882ea5b3de3c9f156cff033a0d3cf787f9a8a833a29d0c96f0b68ccf55ffc62098e21f0df1832b70878dc94ef1a3260ec2fa56dd3c4fece5d855644d26012f56d2af85a0771d61367b7e266577e44c444347970908ab6cfae42069e2ceedf63679c2bd03697957e287d156b2717a416f0e4ad96868e1c7b80eb84e99778f670ca39c15e1f901def1efd824ea5f7bbe127dce8c8f53d849fe1172a1254caec13b10b0612e72d3f8e7206eee2620e8e3c0ea176deb4b1fdf5d8d37b57af553cf7628ead74443f98655b5166cdc08190d7e3b134d71c21bfacde3e4673529e6d8a9c7a8b419451e7ecc6c16a44b8e1b3f2c9d1c822df8f2b51d8fd027074ab2d1c52d16aab0a266c7d9ec03df7e631052e67a28963bf8560e89326168bb7c8f5a152f7ac54a46e88190c62a938628950df881a4be4136a55bad4f608d39ff37907a6f99bdee065e5ccd2921f8f1a2ebafcb336fc6ca96a207a5a0a7873420a2ea383a5f1c604c93b6c0ac69244f05d54cab184c6592e9bc4069df60d3cbcbf16729dc2f3f3540474890abef29e1b21dee8af0386ab61784d7af8d79c",
+          "padding" : "3051300d0609608648016503040203050004404fb472dfc43def7a46ad442c58ac532f89e0c8a96f23b672f5fd637652eab158d4d589444ef7530a34e6626b40830b4e1ec5364611ae31c599bffa958e8b4c4e",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 355,
+          "comment" : "",
+          "msg" : "61",
+          "sig" : "2e642b8a5208890b52187729c43a1a308cf6b846ba1c2fff152ff4a1b051753f14ab035c2f3f732d5a9df7c2cb732d09f8147509bf02df8ad26924eeb04dded8467b66c5e3eae384568f624e55c81cfd8e3204422677ab62d919a176471b1fa8bae44bcc8d4d116a6afe5ea2773ac52a24186d6a4374171ce0516bba8733c59f38d622b7b6b7ca7ed2123f7f46b6c06b02f4c7506c46327d7cd908ddd503fd42be3cc896008eb9202bbd7af08b9908121a8b27fa44747217ef72a8c549444232e9209ca1345ee017010409527faf0722e3f13641ede5730639bf560c8a655e2f96cbba7b2811da8a1fc3e5125c92754ea7b823f394998b8890602b1713c2a4d352066e01f55ea86fe3da71f9119300d84874b667a6538a90ab24aec2bdfd9ba9a5f0c3072d549653b16f4a4319ca398147e6753f9a048b5b250c64d599115bb717ce85c8370df62c93da7e10fe705a12482e6f25e6ef1f4851a305aa4dc21b08791885867fc10c5503a769a6d6794ab5a9cc5da68cfc3546b0e848ed8629ecded620ee3fa6dc1236b59874916c45f9c409c9889bb85d7b289ee5f45f6d33262dea83b32c071417d3759cf650b9d43468ff0c2e922632e8d73feb4c55fe4233dc1f0cc6f6e522fbc9e9362f1d69441d56ee5f3252dc0559339335901f539ba274cc3640ec776a12c5c7e5c1cfeddedccce36884ea01071c2bcfae7ebfb5b874e6",
+          "padding" : "3051300d0609608648016503040203050004401f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 356,
+          "comment" : "",
+          "msg" : "e0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
+          "sig" : "811dec041124d3ed9d5eaa9c760ca5756e42525687d4af701231671e8f7f4448ea9b9eaacbd9c99659ee3c175277d30cdede73e1b332ffe41b8b737150ce1f1c67aa6b22ff801077c4241a6ff4af8f4db9462c70c13e1da86edec4042a70be9d08384d932681dae48fdb83149170472564a5bc68cbe952c76e476b99c8a5a1ecaae809690a014b28224ddb9c9dce0d4f6a77fa2888a71f3aa9b5deda0af40ad0464d9adbd26fde242523c096106124048bafe824f733b0af480056de2314f5e27db5aa3fd15705777e14efd2ac43beb12f8f496d09103ab377971cdd45e9afee8baa874c23d3942ee3a505bbc3901dd4cf55ea8a30fac0cb754793fb2d8f4edc29afd51b99140a8d03aa0614169428205fcd66c1047d3366fb32f1c2b1bcfed8ae23580ed254c3dcb127daf16aec1892714ee05a1ceb4e561a1e9c8fd4118ef8cc9e063bd86c55d28b8acc9d5b4c589583e7c6b78fd518d8ca85b88517f10c27aca2f0bcfa54ba5bb94ed5b005e3d871b68b86e96adf12588037adc97cbef59c05f0d2162db2e4cce41227df11eab5449d612be56ef6fc522452573340d4d68af0178d4f19db6a0ded521f1a982bc5567dbde2036f74d6d67b806ccc7c7f70d3092c22c9c1acf307b751d994fa5259a5046668a047afe4c3302e908bf70bc6b55c39726bf24ceca809357c623b89fbf0eaf8b5d18823337e7e0245d865574cb9",
+          "padding" : "3051300d060960864801650304020305000440aa0a2e60e45f276fe3aefe9fc07c6f2435f143ee2afd895e4809384e833be66a6396c839d6f7db83f37736645454c6e63712b27e70edcdd7440e1275235070c0",
+          "result" : "valid",
+          "flags" : []
+        }
+      ]
+    },
+    {
+      "e" : "3",
+      "keyAsn" : "3081870281810089863f6993177d65e5f1b6d41e183ebde1fe8c0f23fa8c99893ba0267416b74d93bcf04cb77f7bbc5015f501c001fe81eed5c339fca8d6804c29523668d57b32e2058b20366c4d66c5e1684b925bd7c71959ba4b022a4ce4a04c7e4ff13fa433f81553999ed9e73dc6f4e0cec5b00452391bb7a742f5b932c0a4eccf802120cf020103",
+      "keyDer" : "30819d300d06092a864886f70d010101050003818b003081870281810089863f6993177d65e5f1b6d41e183ebde1fe8c0f23fa8c99893ba0267416b74d93bcf04cb77f7bbc5015f501c001fe81eed5c339fca8d6804c29523668d57b32e2058b20366c4d66c5e1684b925bd7c71959ba4b022a4ce4a04c7e4ff13fa433f81553999ed9e73dc6f4e0cec5b00452391bb7a742f5b932c0a4eccf802120cf020103",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCJhj9pkxd9ZeXxttQeGD694f6M\nDyP6jJmJO6AmdBa3TZO88Ey3f3u8UBX1AcAB/oHu1cM5/KjWgEwpUjZo1Xsy4gWL\nIDZsTWbF4WhLklvXxxlZuksCKkzkoEx+T/E/pDP4FVOZntnnPcb04M7FsARSORu3\np0L1uTLApOzPgCEgzwIBAw==\n-----END PUBLIC KEY-----",
+      "keysize" : 1024,
+      "n" : "089863f6993177d65e5f1b6d41e183ebde1fe8c0f23fa8c99893ba0267416b74d93bcf04cb77f7bbc5015f501c001fe81eed5c339fca8d6804c29523668d57b32e2058b20366c4d66c5e1684b925bd7c71959ba4b022a4ce4a04c7e4ff13fa433f81553999ed9e73dc6f4e0cec5b00452391bb7a742f5b932c0a4eccf802120cf",
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 357,
+          "comment" : "short signature",
+          "msg" : "3831",
+          "sig" : "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c68149efc8a4a913a26c9170590a1ed9064323c12b6ebde15ae8c05a0e5205c91f57f5753815ff39c918",
+          "padding" : "3031300d0609608648016503040201050004205316ca1c5ddca8e6ceccfce58f3b8540e540ee22f6180fb89492904051b3d531",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallModulus",
+            "SmallPublicKey"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "3",
+      "keyAsn" : "30820108028201010090a5d7aba2c8dc828e616fc1fc45c7c52130c8589dcbe2913da187572f6c23217b89a5186b6f90cbe053abfb0885a91f141dbe106ce6ad303904a5941df26ced10478cb56a7bd6cf1313c4966d9cf7c4509d9dc63566aa323e110af219f3398c04e79bb486de8703793473136f5c9051af24bd2c0208ea1bf9321a3e8f24af00aaca1216842eab248d58cf46ac786c49fd3ca8557e9b53993a4b9718cdc5c474bf1cfe58c07ad97b2c5acb7d86accc0fc7bed147adb2e77b8697d80150948117714b806ff76f9d88147d84e93987b724bf4870429e85a7a7b51486a78d8a88f1688f60e215d43d06221e2b993b5c12a607b80e9e0122472b29945f76b55737c1020103",
+      "keyDer" : "30820120300d06092a864886f70d01010105000382010d0030820108028201010090a5d7aba2c8dc828e616fc1fc45c7c52130c8589dcbe2913da187572f6c23217b89a5186b6f90cbe053abfb0885a91f141dbe106ce6ad303904a5941df26ced10478cb56a7bd6cf1313c4966d9cf7c4509d9dc63566aa323e110af219f3398c04e79bb486de8703793473136f5c9051af24bd2c0208ea1bf9321a3e8f24af00aaca1216842eab248d58cf46ac786c49fd3ca8557e9b53993a4b9718cdc5c474bf1cfe58c07ad97b2c5acb7d86accc0fc7bed147adb2e77b8697d80150948117714b806ff76f9d88147d84e93987b724bf4870429e85a7a7b51486a78d8a88f1688f60e215d43d06221e2b993b5c12a607b80e9e0122472b29945f76b55737c1020103",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAkKXXq6LI3IKOYW/B/EXH\nxSEwyFidy+KRPaGHVy9sIyF7iaUYa2+Qy+BTq/sIhakfFB2+EGzmrTA5BKWUHfJs\n7RBHjLVqe9bPExPElm2c98RQnZ3GNWaqMj4RCvIZ8zmMBOebtIbehwN5NHMTb1yQ\nUa8kvSwCCOob+TIaPo8krwCqyhIWhC6rJI1Yz0aseGxJ/TyoVX6bU5k6S5cYzcXE\ndL8c/ljAetl7LFrLfYaszA/HvtFHrbLne4aX2AFQlIEXcUuAb/dvnYgUfYTpOYe3\nJL9IcEKehaentRSGp42KiPFoj2DiFdQ9BiIeK5k7XBKmB7gOngEiRysplF92tVc3\nwQIBAw==\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "n" : "090a5d7aba2c8dc828e616fc1fc45c7c52130c8589dcbe2913da187572f6c23217b89a5186b6f90cbe053abfb0885a91f141dbe106ce6ad303904a5941df26ced10478cb56a7bd6cf1313c4966d9cf7c4509d9dc63566aa323e110af219f3398c04e79bb486de8703793473136f5c9051af24bd2c0208ea1bf9321a3e8f24af00aaca1216842eab248d58cf46ac786c49fd3ca8557e9b53993a4b9718cdc5c474bf1cfe58c07ad97b2c5acb7d86accc0fc7bed147adb2e77b8697d80150948117714b806ff76f9d88147d84e93987b724bf4870429e85a7a7b51486a78d8a88f1688f60e215d43d06221e2b993b5c12a607b80e9e0122472b29945f76b55737c1",
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 358,
+          "comment" : "short signature",
+          "msg" : "33363730",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000989e7ff72e67e680bd21d5f966e4ad8a48c3592dbacc4a2f035b4ef4d17a2f25f8a9fef7e78eb99d76d68629ed02d67c43c4b7ec8c3badc32e3d0a524c326537739b0fde156723b27c23ae2b09895e470c64d700f5c",
+          "padding" : "3031300d0609608648016503040201050004209385aabddf6b3fe60d2955cb9303e9354b775e8fab2f95cb72ecf3553c64633a",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallPublicKey"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "3",
+      "keyAsn" : "308201080282010100f2ed0e93228f37c2ce1c215e00cce4ef00e2c08a004a39c4170dc73e5fbd9b91e7c55e596579ec9c60b9bd341e83029b1934e6493eb60099b6cfbb9804d4179c983099e19102bba49eaa28fa505efacc5a9d5374499c0c5775778317ed370de1919f38aff22d5aee8c8af36a86d036029e761f243dff3c205a11e9bce9ac1d6baf81e79ad4146b119abb13903f8562e8f3e6a918f48223465bc93d5e7d5abe3d08503ec42998fe087a1f935d1b8673c495f005dfa7453daf977e1608a8c276da2a4cd0567e4af4d18cba05fdbedcde74493ccabd9060c27d35a02f35c760b12a4deae1359f649f273fa408626fb789c916434a642d528f41db868ff93b7f889f020103",
+      "keyDer" : "30820120300d06092a864886f70d01010105000382010d00308201080282010100f2ed0e93228f37c2ce1c215e00cce4ef00e2c08a004a39c4170dc73e5fbd9b91e7c55e596579ec9c60b9bd341e83029b1934e6493eb60099b6cfbb9804d4179c983099e19102bba49eaa28fa505efacc5a9d5374499c0c5775778317ed370de1919f38aff22d5aee8c8af36a86d036029e761f243dff3c205a11e9bce9ac1d6baf81e79ad4146b119abb13903f8562e8f3e6a918f48223465bc93d5e7d5abe3d08503ec42998fe087a1f935d1b8673c495f005dfa7453daf977e1608a8c276da2a4cd0567e4af4d18cba05fdbedcde74493ccabd9060c27d35a02f35c760b12a4deae1359f649f273fa408626fb789c916434a642d528f41db868ff93b7f889f020103",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEA8u0OkyKPN8LOHCFeAMzk\n7wDiwIoASjnEFw3HPl+9m5HnxV5ZZXnsnGC5vTQegwKbGTTmST62AJm2z7uYBNQX\nnJgwmeGRAruknqoo+lBe+sxanVN0SZwMV3V3gxftNw3hkZ84r/ItWu6MivNqhtA2\nAp52HyQ9/zwgWhHpvOmsHWuvgeea1BRrEZq7E5A/hWLo8+apGPSCI0ZbyT1efVq+\nPQhQPsQpmP4Ieh+TXRuGc8SV8AXfp0U9r5d+FgiownbaKkzQVn5K9NGMugX9vtze\ndEk8yr2QYMJ9NaAvNcdgsSpN6uE1n2SfJz+kCGJvt4nJFkNKZC1Sj0Hbho/5O3+I\nnwIBAw==\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "n" : "0f2ed0e93228f37c2ce1c215e00cce4ef00e2c08a004a39c4170dc73e5fbd9b91e7c55e596579ec9c60b9bd341e83029b1934e6493eb60099b6cfbb9804d4179c983099e19102bba49eaa28fa505efacc5a9d5374499c0c5775778317ed370de1919f38aff22d5aee8c8af36a86d036029e761f243dff3c205a11e9bce9ac1d6baf81e79ad4146b119abb13903f8562e8f3e6a918f48223465bc93d5e7d5abe3d08503ec42998fe087a1f935d1b8673c495f005dfa7453daf977e1608a8c276da2a4cd0567e4af4d18cba05fdbedcde74493ccabd9060c27d35a02f35c760b12a4deae1359f649f273fa408626fb789c916434a642d528f41db868ff93b7f889f",
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 359,
+          "comment" : "short signature",
+          "msg" : "38343432",
+          "sig" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009e7a1269086f0bbc0778ded8d7108ff4edcc2313425088117b2d5c53e9d9971950a5fe8b2b67d2bcd1be74f6b557a3f90650a96d7e4dbd63c05b94f73337eea682417c058d66ce523e4461065ac8ba990c4ecd04932",
+          "padding" : "3051300d0609608648016503040203050004406114f0b81fa48090bf41e600bbf301f49262bac5794aae087d8921eb23bf4de867fa9403b85e21cf6f59a14127ef0babdbc425d415f15c0ea18d2962839471cc",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallPublicKey"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "3",
+      "keyAsn" : "308201880282018100ab54a4f2560b9f65faa2f83bcf77d41803c080e4e5c3eab3534210982bba8a5d7e513ba50ba1ece33555c5457c41ba58f3f605a04369408f586c26dfda464c7b300a01f1616893264c7606daad4ced14df9a894a1f34586181294297e3ceb9580b0c785c056d5c566467f6f227f3084918d1cd17ed156e7f9fcce4757c5794f92770771ea5cf3101ca0425c846775f56938c1d1cad4401f4df2f5e0d3a3b2770f99e3c1cb4d9d4896c7ca89287b45831218b099add4bdf1dab6e2fb55d2775429386c85dff32c07a6dda504a9627529dd82c943554aaf23c5a5f6cea9c301b4b1f066b86bbef2e4bae9dc5b5e82e1fa03c29ff8bf38556729b356d5ba41d37a069fcc8fc23ac715bbea04c1972a2d50c57cc0159a46b5919fb670fb2a502d5ab66f0aa99e51016b83a406943ce9bdf0ab9b9e946574a5b32ce95d97ac8b1fbb48f0bf7e3c0d4b7a00d131966d009997a166a6630dee4a74c141cde0114aa423351b1dfdd3893a856fc632b6d90dbc79c8a61a9f9e31702ba69fb222860e60a83020103",
+      "keyDer" : "308201a0300d06092a864886f70d01010105000382018d00308201880282018100ab54a4f2560b9f65faa2f83bcf77d41803c080e4e5c3eab3534210982bba8a5d7e513ba50ba1ece33555c5457c41ba58f3f605a04369408f586c26dfda464c7b300a01f1616893264c7606daad4ced14df9a894a1f34586181294297e3ceb9580b0c785c056d5c566467f6f227f3084918d1cd17ed156e7f9fcce4757c5794f92770771ea5cf3101ca0425c846775f56938c1d1cad4401f4df2f5e0d3a3b2770f99e3c1cb4d9d4896c7ca89287b45831218b099add4bdf1dab6e2fb55d2775429386c85dff32c07a6dda504a9627529dd82c943554aaf23c5a5f6cea9c301b4b1f066b86bbef2e4bae9dc5b5e82e1fa03c29ff8bf38556729b356d5ba41d37a069fcc8fc23ac715bbea04c1972a2d50c57cc0159a46b5919fb670fb2a502d5ab66f0aa99e51016b83a406943ce9bdf0ab9b9e946574a5b32ce95d97ac8b1fbb48f0bf7e3c0d4b7a00d131966d009997a166a6630dee4a74c141cde0114aa423351b1dfdd3893a856fc632b6d90dbc79c8a61a9f9e31702ba69fb222860e60a83020103",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBoDANBgkqhkiG9w0BAQEFAAOCAY0AMIIBiAKCAYEAq1Sk8lYLn2X6ovg7z3fU\nGAPAgOTlw+qzU0IQmCu6il1+UTulC6Hs4zVVxUV8QbpY8/YFoENpQI9YbCbf2kZM\nezAKAfFhaJMmTHYG2q1M7RTfmolKHzRYYYEpQpfjzrlYCwx4XAVtXFZkZ/byJ/MI\nSRjRzRftFW5/n8zkdXxXlPkncHcepc8xAcoEJchGd19Wk4wdHK1EAfTfL14NOjsn\ncPmePBy02dSJbHyokoe0WDEhiwma3UvfHatuL7VdJ3VCk4bIXf8ywHpt2lBKlidS\nndgslDVUqvI8Wl9s6pwwG0sfBmuGu+8uS66dxbXoLh+gPCn/i/OFVnKbNW1bpB03\noGn8yPwjrHFbvqBMGXKi1QxXzAFZpGtZGftnD7KlAtWrZvCqmeUQFrg6QGlDzpvf\nCrm56UZXSlsyzpXZesix+7SPC/fjwNS3oA0TGWbQCZl6FmpmMN7kp0wUHN4BFKpC\nM1Gx3904k6hW/GMrbZDbx5yKYan54xcCumn7Iihg5gqDAgED\n-----END PUBLIC KEY-----",
+      "keysize" : 3072,
+      "n" : "0ab54a4f2560b9f65faa2f83bcf77d41803c080e4e5c3eab3534210982bba8a5d7e513ba50ba1ece33555c5457c41ba58f3f605a04369408f586c26dfda464c7b300a01f1616893264c7606daad4ced14df9a894a1f34586181294297e3ceb9580b0c785c056d5c566467f6f227f3084918d1cd17ed156e7f9fcce4757c5794f92770771ea5cf3101ca0425c846775f56938c1d1cad4401f4df2f5e0d3a3b2770f99e3c1cb4d9d4896c7ca89287b45831218b099add4bdf1dab6e2fb55d2775429386c85dff32c07a6dda504a9627529dd82c943554aaf23c5a5f6cea9c301b4b1f066b86bbef2e4bae9dc5b5e82e1fa03c29ff8bf38556729b356d5ba41d37a069fcc8fc23ac715bbea04c1972a2d50c57cc0159a46b5919fb670fb2a502d5ab66f0aa99e51016b83a406943ce9bdf0ab9b9e946574a5b32ce95d97ac8b1fbb48f0bf7e3c0d4b7a00d131966d009997a166a6630dee4a74c141cde0114aa423351b1dfdd3893a856fc632b6d90dbc79c8a61a9f9e31702ba69fb222860e60a83",
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 360,
+          "comment" : "short signature",
+          "msg" : "34333630",
+          "sig" : "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011a21abeac8409398319e65c8656f8f72e179dd1e99358c7531fddc037e47c1e688cd70eafd6eea01c823516bc79f89d7e52ee1eb4ffdeaad1d550dc0a47185bc9c42e47fce5503c3370a60510f834b4691152ef668deca633cf3873ce6613951784aa7dafde118f37f1cdf1a687ac236d5c956bced564b73cf202e3bace59667",
+          "padding" : "3031300d0609608648016503040201050004205d19d2275db8df24fd8e87092599d5b8c7c798f483bbb6cddb4310353b903971",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallPublicKey"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "3",
+      "keyAsn" : "3082018802820181008733b9c2bc754216fac899159abb71c5ca84be37153720040f33f291f5f7861bc122cafde3091b5211bc81ee03e280e3c6c2902ec49afb8432c3273536edce7116048513e9b33e2fcfe56f9597c81bc9be81a1b1d46e863ca11db2c33ac1bdebf7c552332067e2e588497e7d9e0738caa57a73dd28157e88fc202b31bbe3b9993548399a0b0df9b72dfeece75ecd78376227e9cd21c8d24ca4aa64fa50a59ee8e7621158e7bac2420fc0d77064d3959afab664ecda0decb8c979eb402795b9a562f2de310aa7fc6864469ac88867788c57ee96f6dc32dbdbe3aa7d3ff47ae4b78e1106e1bc80350b2383dae54140a4605f4130d7e5d3f7818262a27c76a51e4c6db4ab4590b4766b8c50ec1bfed53f0d716b5c7d9dc971399246c75ce27745147151f2e7629039f0b2efed99c7f17cda8f3c3df764dfb40cc0c2ad7bf2b6c72829df93329a4bad6be8635953dd10840888784eea738c763be9f5dc3ba47a9e9d800e21b4ffcc18193e591e8a5283192426e8867331c72bdda06a0eb49367bb01020103",
+      "keyDer" : "308201a0300d06092a864886f70d01010105000382018d003082018802820181008733b9c2bc754216fac899159abb71c5ca84be37153720040f33f291f5f7861bc122cafde3091b5211bc81ee03e280e3c6c2902ec49afb8432c3273536edce7116048513e9b33e2fcfe56f9597c81bc9be81a1b1d46e863ca11db2c33ac1bdebf7c552332067e2e588497e7d9e0738caa57a73dd28157e88fc202b31bbe3b9993548399a0b0df9b72dfeece75ecd78376227e9cd21c8d24ca4aa64fa50a59ee8e7621158e7bac2420fc0d77064d3959afab664ecda0decb8c979eb402795b9a562f2de310aa7fc6864469ac88867788c57ee96f6dc32dbdbe3aa7d3ff47ae4b78e1106e1bc80350b2383dae54140a4605f4130d7e5d3f7818262a27c76a51e4c6db4ab4590b4766b8c50ec1bfed53f0d716b5c7d9dc971399246c75ce27745147151f2e7629039f0b2efed99c7f17cda8f3c3df764dfb40cc0c2ad7bf2b6c72829df93329a4bad6be8635953dd10840888784eea738c763be9f5dc3ba47a9e9d800e21b4ffcc18193e591e8a5283192426e8867331c72bdda06a0eb49367bb01020103",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBoDANBgkqhkiG9w0BAQEFAAOCAY0AMIIBiAKCAYEAhzO5wrx1Qhb6yJkVmrtx\nxcqEvjcVNyAEDzPykfX3hhvBIsr94wkbUhG8ge4D4oDjxsKQLsSa+4Qywyc1Nu3O\ncRYEhRPpsz4vz+VvlZfIG8m+gaGx1G6GPKEdssM6wb3r98VSMyBn4uWISX59ngc4\nyqV6c90oFX6I/CArMbvjuZk1SDmaCw35ty3+7OdezXg3YifpzSHI0kykqmT6UKWe\n6OdiEVjnusJCD8DXcGTTlZr6tmTs2g3suMl560AnlbmlYvLeMQqn/GhkRprIiGd4\njFfulvbcMtvb46p9P/R65LeOEQbhvIA1CyOD2uVBQKRgX0Ew1+XT94GCYqJ8dqUe\nTG20q0WQtHZrjFDsG/7VPw1xa1x9nclxOZJGx1zid0UUcVHy52KQOfCy7+2Zx/F8\n2o88Pfdk37QMwMKte/K2xygp35Mymkuta+hjWVPdEIQIiHhO6nOMdjvp9dw7pHqe\nnYAOIbT/zBgZPlkeilKDGSQm6IZzMccr3aBqDrSTZ7sBAgED\n-----END PUBLIC KEY-----",
+      "keysize" : 3072,
+      "n" : "08733b9c2bc754216fac899159abb71c5ca84be37153720040f33f291f5f7861bc122cafde3091b5211bc81ee03e280e3c6c2902ec49afb8432c3273536edce7116048513e9b33e2fcfe56f9597c81bc9be81a1b1d46e863ca11db2c33ac1bdebf7c552332067e2e588497e7d9e0738caa57a73dd28157e88fc202b31bbe3b9993548399a0b0df9b72dfeece75ecd78376227e9cd21c8d24ca4aa64fa50a59ee8e7621158e7bac2420fc0d77064d3959afab664ecda0decb8c979eb402795b9a562f2de310aa7fc6864469ac88867788c57ee96f6dc32dbdbe3aa7d3ff47ae4b78e1106e1bc80350b2383dae54140a4605f4130d7e5d3f7818262a27c76a51e4c6db4ab4590b4766b8c50ec1bfed53f0d716b5c7d9dc971399246c75ce27745147151f2e7629039f0b2efed99c7f17cda8f3c3df764dfb40cc0c2ad7bf2b6c72829df93329a4bad6be8635953dd10840888784eea738c763be9f5dc3ba47a9e9d800e21b4ffcc18193e591e8a5283192426e8867331c72bdda06a0eb49367bb01",
+      "sha" : "SHA-512",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 361,
+          "comment" : "short signature",
+          "msg" : "36313237",
+          "sig" : "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bdd0c9e451b5b3e5513a94492dbee1ada9ea87e65a8cd95cceb4d304294ce34bf09a212f14908f5b865c7a34a72e68e389794a2d1c5767ba17829e2044108ac7842b6bfe0a5663b433d656f4e38522c5a5a23c460b898833828d257350e5814291b54cf13089080f84998edcacf0fe5fca0c1f8b176b172c5f9989491a039bef",
+          "padding" : "3051300d060960864801650304020305000440925eb0238e4d842826b081a74083e55a2d89e67c524d5a903366c1e26afd1e478cb4779e6f69eb70e7034556745f6bddf9547987d8785a7deaa8765aaffbf2c5",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallPublicKey"
+          ]
+        }
+      ]
+    },
+    {
+      "e" : "3",
+      "keyAsn" : "30820108028201010092bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c2671289bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240c11ebf97cd68c2aa19c787b3be21e68c0e397c7f04c6ef98950e27e0e19a40da92a3ea10800fe9252b77026d14c2fa1eb4ac102491e5773279f07d856d446f45169b09bf60b8a2695f5e4864eaaf9590aec8c7c2f86d020103",
+      "keyDer" : "30820120300d06092a864886f70d01010105000382010d0030820108028201010092bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c2671289bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240c11ebf97cd68c2aa19c787b3be21e68c0e397c7f04c6ef98950e27e0e19a40da92a3ea10800fe9252b77026d14c2fa1eb4ac102491e5773279f07d856d446f45169b09bf60b8a2695f5e4864eaaf9590aec8c7c2f86d020103",
+      "keyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAkr8Xzb/7QvqZV843gmu0\nUXCOfN7IdSuAnIGo0W/l/k2rap220R27EghmRdt1RmQrMi6DMd1/Ke/2i/QLJPgI\nhPUVKx/am5964vzichze4PxI+FpujmT3Z+2XJ/0txZeWfidqXi52hSiv3Z30tt3a\nTBdDAOTaPBmjwyKZ4eeFeTTBTdYgPYwmcSibw5JxFZcVU2SlkEayufGQX+cXyn7+\nu0wZabgEEY7/okDBHr+XzWjCqhnHh7O+IeaMDjl8fwTG75iVDifg4ZpA2pKj6hCA\nD+klK3cCbRTC+h60rBAkkeV3MnnwfYVtRG9FFpsJv2C4omlfXkhk6q+VkK7Ix8L4\nbQIBAw==\n-----END PUBLIC KEY-----",
+      "keysize" : 2048,
+      "n" : "092bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c2671289bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240c11ebf97cd68c2aa19c787b3be21e68c0e397c7f04c6ef98950e27e0e19a40da92a3ea10800fe9252b77026d14c2fa1eb4ac102491e5773279f07d856d446f45169b09bf60b8a2695f5e4864eaaf9590aec8c7c2f86d",
+      "sha" : "SHA-256",
+      "type" : "RSASigVer",
+      "tests" : [
+        {
+          "tcId" : 362,
+          "comment" : "signature is close to n",
+          "msg" : "32353934",
+          "sig" : "92bf17cdbffb42fa9957ce37826bb451708e7cdec8752b809c81a8d16fe5fe4dab6a9db6d11dbb12086645db7546642b322e8331dd7f29eff68bf40b24f80884f5152b1fda9b9f7ae2fce2721cdee0fc48f85a6e8e64f767ed9727fd2dc597967e276a5e2e768528afdd9df4b6ddda4c174300e4da3c19a3c32299e1e7857934c14dd6203d8c2671289bc392711597155364a59046b2b9f1905fe717ca7efebb4c1969b804118effa240b8bf4bb1a6d0616fd5be2f081dc9ef741a9a4ae7274418b791432de470c4556463108388e8e8ed5dcebf3558e4650c2ac97c86fa682176f09b5dd8cfbf15d19c3fe4f961f4607c12cb3dfad9b6a0e59c92faa1fc8622",
+          "padding" : "3031300d0609608648016503040201050004208f87edbf7e3fbfba22df722036c493b7b8f35321b7d147f22c4789a9d0a4cbc1",
+          "result" : "acceptable",
+          "flags" : [
+            "SmallPublicKey"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/third_party/wycheproof/testvectors/x25519_test.json b/third_party/wycheproof/testvectors/x25519_test.json
new file mode 100644
index 0000000..f669487
--- /dev/null
+++ b/third_party/wycheproof/testvectors/x25519_test.json
@@ -0,0 +1,956 @@
+{
+  "algorithm" : "X25519",
+  "generatorVersion" : "0.4.12",
+  "notes" : {
+    "LowOrderPublic" : "Curve25519 or its twist contains some points of low order. This test vector contains a public key with such a point. While many libraries reject such public keys, doing so is not a strict requirement according to RFC 7748.",
+    "Small public key" : "The public key is insecure and does not belong to a valid private key. Some libraries reject such keys.",
+    "Twist" : "Public keys are either points on curve25519 or points on its twist. Implementations may either reject such keys or compute X25519 using the twist. If a point multiplication is performed then it is important that the result is correct, since otherwise attacks with invalid keys are possible."
+  },
+  "numberOfTests" : 87,
+  "header" : [],
+  "testGroups" : [
+    {
+      "curve" : "curve25519",
+      "tests" : [
+        {
+          "tcId" : 1,
+          "comment" : "normal case",
+          "curve" : "curve25519",
+          "public" : "9c647d9ae589b9f58fdc3ca4947efbc915c4b2e08e744a0edf469dac59c8f85a",
+          "private" : "4852834d9d6b77dadeabaaf2e11dca66d19fe74993a7bec36c6e16a0983feaba",
+          "shared" : "87b7f212b627f7a54ca5e0bcdaddd5389d9de6156cdbcf8ebe14ffbcfb436551",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 2,
+          "comment" : "normal case",
+          "curve" : "curve25519",
+          "public" : "9c647d9ae589b9f58fdc3ca4947efbc915c4b2e08e744a0edf469dac59c8f85a",
+          "private" : "1064a67da639a8f6df4fbea2d63358b65bca80a770712e14ea8a72df5a3313ae",
+          "shared" : "4b82bd8650ea9b81a42181840926a4ffa16434d1bf298de1db87efb5b0a9e34e",
+          "result" : "valid",
+          "flags" : [
+            "LowOrderPublic"
+          ]
+        },
+        {
+          "tcId" : 3,
+          "comment" : "public key on twist",
+          "curve" : "curve25519",
+          "public" : "63aa40c6e38346c5caf23a6df0a5e6c80889a08647e551b3563449befcfc9733",
+          "private" : "588c061a50804ac488ad774ac716c3f5ba714b2712e048491379a500211998a8",
+          "shared" : "b1a707519495ffffb298ff941716b06dfab87cf8d91123fe2be9a233dda22212",
+          "result" : "acceptable",
+          "flags" : [
+            "Twist"
+          ]
+        },
+        {
+          "tcId" : 4,
+          "comment" : "public key on twist",
+          "curve" : "curve25519",
+          "public" : "0f83c36fded9d32fadf4efa3ae93a90bb5cfa66893bc412c43fa7287dbb99779",
+          "private" : "b05bfd32e55325d9fd648cb302848039000b390e44d521e58aab3b29a6960ba8",
+          "shared" : "67dd4a6e165533534c0e3f172e4ab8576bca923a5f07b2c069b4c310ff2e935b",
+          "result" : "acceptable",
+          "flags" : [
+            "Twist"
+          ]
+        },
+        {
+          "tcId" : 5,
+          "comment" : "public key on twist",
+          "curve" : "curve25519",
+          "public" : "0b8211a2b6049097f6871c6c052d3c5fc1ba17da9e32ae458403b05bb283092a",
+          "private" : "70e34bcbe1f47fbc0fddfd7c1e1aa53d57bfe0f66d243067b424bb6210bed19c",
+          "shared" : "4a0638cfaa9ef1933b47f8939296a6b25be541ef7f70e844c0bcc00b134de64a",
+          "result" : "acceptable",
+          "flags" : [
+            "Twist"
+          ]
+        },
+        {
+          "tcId" : 6,
+          "comment" : "public key on twist",
+          "curve" : "curve25519",
+          "public" : "343ac20a3b9c6a27b1008176509ad30735856ec1c8d8fcae13912d08d152f46c",
+          "private" : "68c1f3a653a4cdb1d37bba94738f8b957a57beb24d646e994dc29a276aad458d",
+          "shared" : "399491fce8dfab73b4f9f611de8ea0b27b28f85994250b0f475d585d042ac207",
+          "result" : "acceptable",
+          "flags" : [
+            "Twist"
+          ]
+        },
+        {
+          "tcId" : 7,
+          "comment" : "public key on twist",
+          "curve" : "curve25519",
+          "public" : "fa695fc7be8d1be5bf704898f388c452bafdd3b8eae805f8681a8d15c2d4e142",
+          "private" : "d877b26d06dff9d9f7fd4c5b3769f8cdd5b30516a5ab806be324ff3eb69ea0b2",
+          "shared" : "2c4fe11d490a53861776b13b4354abd4cf5a97699db6e6c68c1626d07662f758",
+          "result" : "acceptable",
+          "flags" : [
+            "Twist"
+          ]
+        },
+        {
+          "tcId" : 8,
+          "comment" : "public key = 0",
+          "curve" : "curve25519",
+          "public" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "207494038f2bb811d47805bcdf04a2ac585ada7f2f23389bfd4658f9ddd4debc",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : [
+            "Small public key"
+          ]
+        },
+        {
+          "tcId" : 9,
+          "comment" : "public key = 1",
+          "curve" : "curve25519",
+          "public" : "0100000000000000000000000000000000000000000000000000000000000000",
+          "private" : "202e8972b61c7e61930eb9450b5070eae1c670475685541f0476217e4818cfab",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : [
+            "Small public key"
+          ]
+        },
+        {
+          "tcId" : 10,
+          "comment" : "edge case on twist",
+          "curve" : "curve25519",
+          "public" : "0200000000000000000000000000000000000000000000000000000000000000",
+          "private" : "38dde9f3e7b799045f9ac3793d4a9277dadeadc41bec0290f81f744f73775f84",
+          "shared" : "9a2cfe84ff9c4a9739625cae4a3b82a906877a441946f8d7b3d795fe8f5d1639",
+          "result" : "acceptable",
+          "flags" : [
+            "Twist"
+          ]
+        },
+        {
+          "tcId" : 11,
+          "comment" : "edge case on twist",
+          "curve" : "curve25519",
+          "public" : "0300000000000000000000000000000000000000000000000000000000000000",
+          "private" : "9857a914e3c29036fd9a442ba526b5cdcdf28216153e636c10677acab6bd6aa5",
+          "shared" : "4da4e0aa072c232ee2f0fa4e519ae50b52c1edd08a534d4ef346c2e106d21d60",
+          "result" : "acceptable",
+          "flags" : [
+            "Twist"
+          ]
+        },
+        {
+          "tcId" : 12,
+          "comment" : "edge case on twist",
+          "curve" : "curve25519",
+          "public" : "ffffff030000f8ffff1f0000c0ffffff000000feffff070000f0ffff3f000000",
+          "private" : "48e2130d723305ed05e6e5894d398a5e33367a8c6aac8fcdf0a88e4b42820db7",
+          "shared" : "9ed10c53747f647f82f45125d3de15a1e6b824496ab40410ffcc3cfe95760f3b",
+          "result" : "acceptable",
+          "flags" : [
+            "Twist"
+          ]
+        },
+        {
+          "tcId" : 13,
+          "comment" : "edge case on twist",
+          "curve" : "curve25519",
+          "public" : "000000fcffff070000e0ffff3f000000ffffff010000f8ffff0f0000c0ffff7f",
+          "private" : "28f41011691851b3a62b641553b30d0dfddcb8fffcf53700a7be2f6a872e9fb0",
+          "shared" : "cf72b4aa6aa1c9f894f4165b86109aa468517648e1f0cc70e1ab08460176506b",
+          "result" : "acceptable",
+          "flags" : [
+            "Twist"
+          ]
+        },
+        {
+          "tcId" : 14,
+          "comment" : "edge case on twist",
+          "curve" : "curve25519",
+          "public" : "00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffff7f",
+          "private" : "18a93b6499b9f6b3225ca02fef410e0adec23532321d2d8ef1a6d602a8c65b83",
+          "shared" : "5d50b62836bb69579410386cf7bb811c14bf85b1c7b17e5924c7ffea91ef9e12",
+          "result" : "acceptable",
+          "flags" : [
+            "Twist"
+          ]
+        },
+        {
+          "tcId" : 15,
+          "comment" : "edge case on twist",
+          "curve" : "curve25519",
+          "public" : "eaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+          "private" : "c01d1305a1338a1fcac2ba7e2e032b427e0b04903165aca957d8d0553d8717b0",
+          "shared" : "19230eb148d5d67c3c22ab1daeff80a57eae4265ce2872657b2c8099fc698e50",
+          "result" : "acceptable",
+          "flags" : [
+            "Twist"
+          ]
+        },
+        {
+          "tcId" : 16,
+          "comment" : "edge case for public key",
+          "curve" : "curve25519",
+          "public" : "0400000000000000000000000000000000000000000000000000000000000000",
+          "private" : "386f7f16c50731d64f82e6a170b142a4e34f31fd7768fcb8902925e7d1e21abe",
+          "shared" : "0fcab5d842a078d7a71fc59b57bfb4ca0be6873b49dcdb9f44e14ae8fbdfa542",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 17,
+          "comment" : "edge case for public key",
+          "curve" : "curve25519",
+          "public" : "ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000",
+          "private" : "e023a289bd5e90fa2804ddc019a05ef3e79d434bb6ea2f522ecb643a75296e95",
+          "shared" : "54ce8f2275c077e3b1306a3939c5e03eef6bbb88060544758d9fef59b0bc3e4f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 18,
+          "comment" : "edge case for public key",
+          "curve" : "curve25519",
+          "public" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03",
+          "private" : "68f010d62ee8d926053a361c3a75c6ea4ebdc8606ab285003a6f8f4076b01e83",
+          "shared" : "f136775c5beb0af8110af10b20372332043cab752419678775a223df57c9d30d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 19,
+          "comment" : "edge case for public key",
+          "curve" : "curve25519",
+          "public" : "fffffffbfffffbffffdfffffdffffffffefffffefffff7fffff7ffffbfffff3f",
+          "private" : "58ebcb35b0f8845caf1ec630f96576b62c4b7b6c36b29deb2cb0084651755c96",
+          "shared" : "bf9affd06b844085586460962ef2146ff3d4533d9444aab006eb88cc3054407d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 20,
+          "comment" : "edge case for public key",
+          "curve" : "curve25519",
+          "public" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f",
+          "private" : "188c4bc5b9c44b38bb658b9b2ae82d5b01015e093184b17cb7863503a783e1bb",
+          "shared" : "d480de04f699cb3be0684a9cc2e31281ea0bc5a9dcc157d3d20158d46ca5246d",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 21,
+          "comment" : "edge case for public key",
+          "curve" : "curve25519",
+          "public" : "fffffffffeffff7ffffffffffeffff7ffffffffffeffff7ffffffffffeffff7f",
+          "private" : "e06c11bb2e13ce3dc7673f67f5482242909423a9ae95ee986a988d98faee23a2",
+          "shared" : "4c4401cce6b51e4cb18f2790246c9bf914db667750a1cb89069092af07292276",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 22,
+          "comment" : "edge case for public key",
+          "curve" : "curve25519",
+          "public" : "ebffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+          "private" : "c0658c46dde18129293877535b1162b6f9f5414a23cf4d2cbc140a4d99da2b8f",
+          "shared" : "578ba8cc2dbdc575afcf9df2b3ee6189f5337d6854c79b4ce165ea12293b3a0f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 23,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b800",
+          "private" : "10255c9230a97a30a458ca284a629669293a31890cda9d147febc7d1e22d6bb1",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : [
+            "LowOrderPublic"
+          ]
+        },
+        {
+          "tcId" : 24,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f1157",
+          "private" : "78f1e8edf14481b389448dac8f59c70b038e7cf92ef2c7eff57a72466e115296",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : [
+            "LowOrderPublic"
+          ]
+        },
+        {
+          "tcId" : 25,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+          "private" : "a0a05a3e8f9f44204d5f8059a94ac7dfc39a49ac016dd743dbfa43c5d671fd88",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : [
+            "LowOrderPublic"
+          ]
+        },
+        {
+          "tcId" : 26,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+          "private" : "d0dbb3ed1906663f15420af31f4eaf6509d9a9949723500605ad7c1c6e7450a9",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : [
+            "LowOrderPublic"
+          ]
+        },
+        {
+          "tcId" : 27,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+          "private" : "c0b1d0eb22b244fe3291140072cdd9d989b5f0ecd96c100feb5bca241c1d9f8f",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : [
+            "LowOrderPublic"
+          ]
+        },
+        {
+          "tcId" : 28,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "0000000000000000000000000000000000000000000000000000000000000080",
+          "private" : "480bf45f594942a8bc0f3353c6e8b8853d77f351f1c2ca6c2d1abf8a00b4229c",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : [
+            "LowOrderPublic"
+          ]
+        },
+        {
+          "tcId" : 29,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "0100000000000000000000000000000000000000000000000000000000000080",
+          "private" : "30f993fcf8514fc89bd8db14cd43ba0d4b2530e73c4276a05e1b145d420cedb4",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : [
+            "LowOrderPublic"
+          ]
+        },
+        {
+          "tcId" : 30,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b880",
+          "private" : "c04974b758380e2a5b5df6eb09bb2f6b3434f982722a8e676d3da251d1b3de83",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : [
+            "LowOrderPublic"
+          ]
+        },
+        {
+          "tcId" : 31,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f11d7",
+          "private" : "502a31373db32446842fe5add3e024022ea54f274182afc3d9f1bb3d39534eb5",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : [
+            "LowOrderPublic"
+          ]
+        },
+        {
+          "tcId" : 32,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "90fa6417b0e37030fd6e43eff2abaef14c6793117a039cf621318ba90f4e98be",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : [
+            "LowOrderPublic"
+          ]
+        },
+        {
+          "tcId" : 33,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "78ad3f26027f1c9fdd975a1613b947779bad2cf2b741ade01840885a30bb979c",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : [
+            "LowOrderPublic"
+          ]
+        },
+        {
+          "tcId" : 34,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "98e23de7b1e0926ed9c87e7b14baf55f497a1d7096f93977680e44dc1c7b7b8b",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : [
+            "LowOrderPublic"
+          ]
+        },
+        {
+          "tcId" : 35,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "private" : "1064a67da639a8f6df4fbea2d63358b65bca80a770712e14ea8a72df5a3313ae",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 36,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "0100000000000000000000000000000000000000000000000000000000000000",
+          "private" : "1064a67da639a8f6df4fbea2d63358b65bca80a770712e14ea8a72df5a3313ae",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 37,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+          "private" : "1064a67da639a8f6df4fbea2d63358b65bca80a770712e14ea8a72df5a3313ae",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 38,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f1157",
+          "private" : "1064a67da639a8f6df4fbea2d63358b65bca80a770712e14ea8a72df5a3313ae",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 39,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b800",
+          "private" : "1064a67da639a8f6df4fbea2d63358b65bca80a770712e14ea8a72df5a3313ae",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 40,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+          "private" : "1064a67da639a8f6df4fbea2d63358b65bca80a770712e14ea8a72df5a3313ae",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 41,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+          "private" : "1064a67da639a8f6df4fbea2d63358b65bca80a770712e14ea8a72df5a3313ae",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 42,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "0000000000000000000000000000000000000000000000000000000000000080",
+          "private" : "1064a67da639a8f6df4fbea2d63358b65bca80a770712e14ea8a72df5a3313ae",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 43,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "0100000000000000000000000000000000000000000000000000000000000080",
+          "private" : "1064a67da639a8f6df4fbea2d63358b65bca80a770712e14ea8a72df5a3313ae",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 44,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "1064a67da639a8f6df4fbea2d63358b65bca80a770712e14ea8a72df5a3313ae",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 45,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "5f9c95bca3508c24b1d0b1559c83ef5b04445cc4581c8e86d8224eddd09f11d7",
+          "private" : "1064a67da639a8f6df4fbea2d63358b65bca80a770712e14ea8a72df5a3313ae",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 46,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b880",
+          "private" : "1064a67da639a8f6df4fbea2d63358b65bca80a770712e14ea8a72df5a3313ae",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 47,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "1064a67da639a8f6df4fbea2d63358b65bca80a770712e14ea8a72df5a3313ae",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 48,
+          "comment" : "public key with low order",
+          "curve" : "curve25519",
+          "public" : "eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "1064a67da639a8f6df4fbea2d63358b65bca80a770712e14ea8a72df5a3313ae",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 49,
+          "comment" : "public key >= p",
+          "curve" : "curve25519",
+          "public" : "efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+          "private" : "f01e48dafac9d7bcf589cbc382c878d18bda3550589ffb5d50b523bebe329dae",
+          "shared" : "bd36a0790eb883098c988b21786773de0b3a4df162282cf110de18dd484ce74b",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 50,
+          "comment" : "public key >= p",
+          "curve" : "curve25519",
+          "public" : "f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+          "private" : "288796bc5aff4b81a37501757bc0753a3c21964790d38699308debc17a6eaf8d",
+          "shared" : "b4e0dd76da7b071728b61f856771aa356e57eda78a5b1655cc3820fb5f854c5c",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 51,
+          "comment" : "public key >= p",
+          "curve" : "curve25519",
+          "public" : "f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+          "private" : "98df845f6651bf1138221f119041f72b6dbc3c4ace7143d99fd55ad867480da8",
+          "shared" : "6fdf6c37611dbd5304dc0f2eb7c9517eb3c50e12fd050ac6dec27071d4bfc034",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 52,
+          "comment" : "public key >= p",
+          "curve" : "curve25519",
+          "public" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+          "private" : "f09498e46f02f878829e78b803d316a2ed695d0498a08abdf8276930e24edcb0",
+          "shared" : "4c8fc4b1c6ab88fb21f18f6d4c810240d4e94651ba44f7a2c863cec7dc56602d",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 53,
+          "comment" : "public key >= p",
+          "curve" : "curve25519",
+          "public" : "0200000000000000000000000000000000000000000000000000000000000080",
+          "private" : "1813c10a5c7f21f96e17f288c0cc37607c04c5f5aea2db134f9e2ffc66bd9db8",
+          "shared" : "1cd0b28267dc541c642d6d7dca44a8b38a63736eef5c4e6501ffbbb1780c033c",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 54,
+          "comment" : "public key >= p",
+          "curve" : "curve25519",
+          "public" : "0300000000000000000000000000000000000000000000000000000000000080",
+          "private" : "7857fb808653645a0beb138a64f5f4d733a45ea84c3cda11a9c06f7e7139149e",
+          "shared" : "8755be01c60a7e825cff3e0e78cb3aa4333861516aa59b1c51a8b2a543dfa822",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 55,
+          "comment" : "public key >= p",
+          "curve" : "curve25519",
+          "public" : "0400000000000000000000000000000000000000000000000000000000000080",
+          "private" : "e03aa842e2abc56e81e87b8b9f417b2a1e5913c723eed28d752f8d47a59f498f",
+          "shared" : "54c9a1ed95e546d27822a360931dda60a1df049da6f904253c0612bbdc087476",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 56,
+          "comment" : "public key >= p",
+          "curve" : "curve25519",
+          "public" : "daffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "f8f707b7999b18cb0d6b96124f2045972ca274bfc154ad0c87038c24c6d0d4b2",
+          "shared" : "cc1f40d743cdc2230e1043daba8b75e810f1fbab7f255269bd9ebb29e6bf494f",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 57,
+          "comment" : "public key >= p",
+          "curve" : "curve25519",
+          "public" : "dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "a034f684fa631e1a348118c1ce4c98231f2d9eec9ba5365b4a05d69a785b0796",
+          "shared" : "54998ee43a5b007bf499f078e736524400a8b5c7e9b9b43771748c7cdf880412",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 58,
+          "comment" : "public key >= p",
+          "curve" : "curve25519",
+          "public" : "dcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "30b6c6a0f2ffa680768f992ba89e152d5bc9893d38c9119be4f767bfab6e0ca5",
+          "shared" : "ead9b38efdd723637934e55ab717a7ae09eb86a21dc36a3feeb88b759e391e09",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 59,
+          "comment" : "public key >= p",
+          "curve" : "curve25519",
+          "public" : "eaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "901b9dcf881e01e027575035d40b43bdc1c5242e030847495b0c7286469b6591",
+          "shared" : "602ff40789b54b41805915fe2a6221f07a50ffc2c3fc94cf61f13d7904e88e0e",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 60,
+          "comment" : "public key >= p",
+          "curve" : "curve25519",
+          "public" : "ebffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "8046677c28fd82c9a1bdb71a1a1a34faba1225e2507fe3f54d10bd5b0d865f8e",
+          "shared" : "e00ae8b143471247ba24f12c885536c3cb981b58e1e56b2baf35c12ae1f79c26",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 61,
+          "comment" : "public key >= p",
+          "curve" : "curve25519",
+          "public" : "efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "602f7e2f68a846b82cc269b1d48e939886ae54fd636c1fe074d710127d472491",
+          "shared" : "98cb9b50dd3fc2b0d4f2d2bf7c5cfdd10c8fcd31fc40af1ad44f47c131376362",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 62,
+          "comment" : "public key >= p",
+          "curve" : "curve25519",
+          "public" : "f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "60887b3dc72443026ebedbbbb70665f42b87add1440e7768fbd7e8e2ce5f639d",
+          "shared" : "38d6304c4a7e6d9f7959334fb5245bd2c754525d4c91db950206926234c1f633",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 63,
+          "comment" : "public key >= p",
+          "curve" : "curve25519",
+          "public" : "f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "78d31dfa854497d72d8def8a1b7fb006cec2d8c4924647c93814ae56faeda495",
+          "shared" : "786cd54996f014a5a031ec14db812ed08355061fdb5de680a800ac521f318e23",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 64,
+          "comment" : "public key >= p",
+          "curve" : "curve25519",
+          "public" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+          "private" : "c04c5baefa8302ddded6a4bb957761b4eb97aefa4fc3b8043085f96a5659b3a5",
+          "shared" : "29ae8bc73e9b10a08b4f681c43c3e0ac1a171d31b38f1a48efba29ae639ea134",
+          "result" : "acceptable",
+          "flags" : []
+        },
+        {
+          "tcId" : 65,
+          "comment" : "RFC 7748",
+          "curve" : "curve25519",
+          "public" : "e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c",
+          "private" : "a046e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449a44",
+          "shared" : "c3da55379de9c6908e94ea4df28d084f32eccf03491c71f754b4075577a28552",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 66,
+          "comment" : "RFC 7748",
+          "curve" : "curve25519",
+          "public" : "e5210f12786811d3f4b7959d0538ae2c31dbe7106fc03c3efc4cd549c715a413",
+          "private" : "4866e9d4d1b4673c5ad22691957d6af5c11b6421e0ea01d42ca4169e7918ba4d",
+          "shared" : "95cbde9476e8907d7aade45cb4b873f88b595a68799fa152e6f8f7647aac7957",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 67,
+          "comment" : "edge case for shared secret",
+          "curve" : "curve25519",
+          "public" : "0ab4e76380d84dde4f6833c58f2a9fb8f83bb0169b172be4b6e0592887741a36",
+          "private" : "a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63",
+          "shared" : "0200000000000000000000000000000000000000000000000000000000000000",
+          "result" : "acceptable",
+          "flags" : [
+            "Twist"
+          ]
+        },
+        {
+          "tcId" : 68,
+          "comment" : "edge case for shared secret",
+          "curve" : "curve25519",
+          "public" : "89e10d5701b4337d2d032181538b1064bd4084401ceca1fd12663a1959388000",
+          "private" : "a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63",
+          "shared" : "0900000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 69,
+          "comment" : "edge case for shared secret",
+          "curve" : "curve25519",
+          "public" : "2b55d3aa4a8f80c8c0b2ae5f933e85af49beac36c2fa7394bab76c8933f8f81d",
+          "private" : "a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63",
+          "shared" : "1000000000000000000000000000000000000000000000000000000000000000",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 70,
+          "comment" : "edge case for shared secret",
+          "curve" : "curve25519",
+          "public" : "63e5b1fe9601fe84385d8866b0421262f78fbfa5aff9585e626679b18547d959",
+          "private" : "a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63",
+          "shared" : "feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f",
+          "result" : "acceptable",
+          "flags" : [
+            "Twist"
+          ]
+        },
+        {
+          "tcId" : 71,
+          "comment" : "edge case for shared secret",
+          "curve" : "curve25519",
+          "public" : "e428f3dac17809f827a522ce32355058d07369364aa78902ee10139b9f9dd653",
+          "private" : "a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63",
+          "shared" : "fcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 72,
+          "comment" : "edge case for shared secret",
+          "curve" : "curve25519",
+          "public" : "b3b50e3ed3a407b95de942ef74575b5ab8a10c09ee103544d60bdfed8138ab2b",
+          "private" : "a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63",
+          "shared" : "f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f",
+          "result" : "acceptable",
+          "flags" : [
+            "Twist"
+          ]
+        },
+        {
+          "tcId" : 73,
+          "comment" : "edge case for shared secret",
+          "curve" : "curve25519",
+          "public" : "213fffe93d5ea8cd242e462844029922c43c77c9e3e42f562f485d24c501a20b",
+          "private" : "a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63",
+          "shared" : "f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 74,
+          "comment" : "edge case for shared secret",
+          "curve" : "curve25519",
+          "public" : "91b232a178b3cd530932441e6139418f72172292f1da4c1834fc5ebfefb51e3f",
+          "private" : "a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63",
+          "shared" : "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 75,
+          "comment" : "edge case for shared secret",
+          "curve" : "curve25519",
+          "public" : "045c6e11c5d332556c7822fe94ebf89b56a3878dc27ca079103058849fabcb4f",
+          "private" : "a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63",
+          "shared" : "e5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+          "result" : "acceptable",
+          "flags" : [
+            "Twist"
+          ]
+        },
+        {
+          "tcId" : 76,
+          "comment" : "edge case for shared secret",
+          "curve" : "curve25519",
+          "public" : "1ca2190b71163539063c35773bda0c9c928e9136f0620aeb093f099197b7f74e",
+          "private" : "a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63",
+          "shared" : "e3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+          "result" : "acceptable",
+          "flags" : [
+            "Twist"
+          ]
+        },
+        {
+          "tcId" : 77,
+          "comment" : "edge case for shared secret",
+          "curve" : "curve25519",
+          "public" : "f76e9010ac33c5043b2d3b76a842171000c4916222e9e85897a0aec7f6350b3c",
+          "private" : "a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63",
+          "shared" : "ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 78,
+          "comment" : "edge case for shared secret",
+          "curve" : "curve25519",
+          "public" : "bb72688d8f8aa7a39cd6060cd5c8093cdec6fe341937c3886a99346cd07faa55",
+          "private" : "a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63",
+          "shared" : "dbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+          "result" : "acceptable",
+          "flags" : [
+            "Twist"
+          ]
+        },
+        {
+          "tcId" : 79,
+          "comment" : "edge case for shared secret",
+          "curve" : "curve25519",
+          "public" : "88fddea193391c6a5933ef9b71901549447205aae9da928a6b91a352ba10f41f",
+          "private" : "a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000000002",
+          "result" : "acceptable",
+          "flags" : [
+            "Twist"
+          ]
+        },
+        {
+          "tcId" : 80,
+          "comment" : "edge case for shared secret",
+          "curve" : "curve25519",
+          "public" : "303b392f153116cad9cc682a00ccc44c95ff0d3bbe568beb6c4e739bafdc2c68",
+          "private" : "a0a4f130b98a5be4b1cedb7cb85584a3520e142d474dc9ccb909a073a976bf63",
+          "shared" : "0000000000000000000000000000000000000000000000000000000000008000",
+          "result" : "acceptable",
+          "flags" : [
+            "Twist"
+          ]
+        },
+        {
+          "tcId" : 81,
+          "comment" : "checking for overflow",
+          "curve" : "curve25519",
+          "public" : "fd300aeb40e1fa582518412b49b208a7842b1e1f056a040178ea4141534f652d",
+          "private" : "c81724704000b26d31703cc97e3a378d56fad8219361c88cca8bd7c5719b12b2",
+          "shared" : "b734105dc257585d73b566ccb76f062795ccbec89128e52b02f3e59639f13c46",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 82,
+          "comment" : "checking for overflow",
+          "curve" : "curve25519",
+          "public" : "c8ef79b514d7682677bc7931e06ee5c27c9b392b4ae9484473f554e6678ecc2e",
+          "private" : "c81724704000b26d31703cc97e3a378d56fad8219361c88cca8bd7c5719b12b2",
+          "shared" : "647a46b6fc3f40d62141ee3cee706b4d7a9271593a7b143e8e2e2279883e4550",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 83,
+          "comment" : "checking for overflow",
+          "curve" : "curve25519",
+          "public" : "64aeac2504144861532b7bbcb6c87d67dd4c1f07ebc2e06effb95aecc6170b2c",
+          "private" : "c81724704000b26d31703cc97e3a378d56fad8219361c88cca8bd7c5719b12b2",
+          "shared" : "4ff03d5fb43cd8657a3cf37c138cadcecce509e4eba089d0ef40b4e4fb946155",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 84,
+          "comment" : "checking for overflow",
+          "curve" : "curve25519",
+          "public" : "bf68e35e9bdb7eee1b50570221860f5dcdad8acbab031b14974cc49013c49831",
+          "private" : "c81724704000b26d31703cc97e3a378d56fad8219361c88cca8bd7c5719b12b2",
+          "shared" : "21cee52efdbc812e1d021a4af1e1d8bc4db3c400e4d2a2c56a3926db4d99c65b",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 85,
+          "comment" : "checking for overflow",
+          "curve" : "curve25519",
+          "public" : "5347c491331a64b43ddc683034e677f53dc32b52a52a577c15a83bf298e99f19",
+          "private" : "c81724704000b26d31703cc97e3a378d56fad8219361c88cca8bd7c5719b12b2",
+          "shared" : "18cb89e4e20c0c2bd324305245266c9327690bbe79acb88f5b8fb3f74eca3e52",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 86,
+          "comment" : "private key == -1 (mod order)",
+          "curve" : "curve25519",
+          "public" : "258e04523b8d253ee65719fc6906c657192d80717edc828fa0af21686e2faa75",
+          "private" : "a023cdd083ef5bb82f10d62e59e15a6800000000000000000000000000000050",
+          "shared" : "258e04523b8d253ee65719fc6906c657192d80717edc828fa0af21686e2faa75",
+          "result" : "valid",
+          "flags" : []
+        },
+        {
+          "tcId" : 87,
+          "comment" : "private key == 1 (mod order) on twist",
+          "curve" : "curve25519",
+          "public" : "2eae5ec3dd494e9f2d37d258f873a8e6e9d0dbd1e383ef64d98bb91b3e0be035",
+          "private" : "58083dd261ad91eff952322ec824c682ffffffffffffffffffffffffffffff5f",
+          "shared" : "2eae5ec3dd494e9f2d37d258f873a8e6e9d0dbd1e383ef64d98bb91b3e0be035",
+          "result" : "acceptable",
+          "flags" : []
+        }
+      ]
+    }
+  ]
+}
diff --git a/tink_version.bzl b/tink_version.bzl
index b6e0c97..bac14bb 100644
--- a/tink_version.bzl
+++ b/tink_version.bzl
@@ -1,2 +1,2 @@
 """ Version of the current release of Tink """
-TINK_VERSION_LABEL = "1.3.0-SNAPSHOT"
+TINK_VERSION_LABEL = "1.3.0-rc2"
diff --git a/tink_version.cmake b/tink_version.cmake
new file mode 100644
index 0000000..3525104
--- /dev/null
+++ b/tink_version.cmake
@@ -0,0 +1,2 @@
+# Version of the current release of Tink.
+set(TINK_VERSION_LABEL 1.3.0-rc2)
diff --git a/tools/BUILD.bazel b/tools/BUILD.bazel
index 09610f7..6d4701f 100644
--- a/tools/BUILD.bazel
+++ b/tools/BUILD.bazel
@@ -1,3 +1,3 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
diff --git a/tools/build_defs/BUILD.bazel b/tools/build_defs/BUILD.bazel
index b9879b8..2bbe82c 100644
--- a/tools/build_defs/BUILD.bazel
+++ b/tools/build_defs/BUILD.bazel
@@ -1,4 +1,4 @@
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 package_group(
     name = "internal_pkg",
@@ -8,8 +8,10 @@
         "//examples/...",
         "//go/...",
         "//java/...",
+        "//javascript/...",
         "//objc/...",
         "//proto/...",
+        "//python/...",
         "//tools/...",
     ],
 )
diff --git a/tools/build_defs/javac.bzl b/tools/build_defs/javac.bzl
index e706ab4..9a37c80 100644
--- a/tools/build_defs/javac.bzl
+++ b/tools/build_defs/javac.bzl
@@ -1,104 +1,12 @@
 """Build definitions for javac related operations in tink."""
 
-# errorprone checks primarily related to coding style, enabled to
-# improve uniformity.
-EP_STYLE_CHECKS = [
-    "-Xep:ConstantField:ERROR",
-    "-Xep:LoggerVariableCase:ERROR",
-    "-Xep:MissingDefault:ERROR",
-    "-Xep:MixedArrayDimensions:ERROR",
-    "-Xep:MultiVariableDeclaration:ERROR",
-    "-Xep:MultipleTopLevelClasses:ERROR",
-    "-Xep:PackageLocation:ERROR",
-    "-Xep:RemoveUnusedImports:ERROR",
-    "-Xep:UnnecessaryStaticImport:ERROR",
-    "-Xep:WildcardImport:ERROR",
-]
-
-# additional checks with occasional false positives, enabled
-# for consistent coding style.
-EP_SUGGESTED_CHECKS = [
-    "-Xep:AmbiguousMethodReference:ERROR",
-    "-Xep:ArgumentSelectionDefectChecker:ERROR",
-    "-Xep:AssertEqualsArgumentOrderChecker:ERROR",
-    "-Xep:AssistedInjectAndInjectOnConstructors:ERROR",
-    "-Xep:BadAnnotationImplementation:ERROR",
-    "-Xep:BadComparable:ERROR",
-    "-Xep:BindingToUnqualifiedCommonType:ERROR",
-    "-Xep:BoxedPrimitiveConstructor:ERROR",
-    "-Xep:CannotMockFinalClass:ERROR",
-    "-Xep:ClassCanBeStatic:ERROR",
-    "-Xep:ClassNewInstance:ERROR",
-    "-Xep:DefaultCharset:ERROR",
-    "-Xep:DoNotMock_ForTricorder:ERROR",
-    "-Xep:DoubleCheckedLocking:ERROR",
-    "-Xep:ElementsCountedInLoop:ERROR",
-    "-Xep:EqualsHashCode:ERROR",
-    "-Xep:ExpectedExceptionChecker:ERROR",
-    "-Xep:Finally:ERROR",
-    "-Xep:FloatingPointLiteralPrecision:ERROR",
-    "-Xep:FragmentInjection:ERROR",
-    "-Xep:FragmentNotInstantiable:ERROR",
-    "-Xep:FunctionalInterfaceClash:ERROR",
-    "-Xep:FutureReturnValueIgnored:ERROR",
-    "-Xep:GetClassOnEnum:ERROR",
-    "-Xep:ImmutableAnnotationChecker:ERROR",
-    "-Xep:ImmutableEnumChecker:ERROR",
-    "-Xep:IncompatibleModifiers:ERROR",
-    "-Xep:InjectOnConstructorOfAbstractClass:ERROR",
-    "-Xep:InjectScopeOrQualifierAnnotationRetention:ERROR",
-    "-Xep:InputStreamSlowMultibyteRead:ERROR",
-    "-Xep:IterableAndIterator:ERROR",
-    "-Xep:JUnit3FloatingPointComparisonWithoutDelta:ERROR",
-    "-Xep:JUnit4SuppressWithoutIgnore:ERROR",
-    "-Xep:JUnitAmbiguousTestClass:ERROR",
-    "-Xep:JavaLangClash:ERROR",
-    "-Xep:JavaNetIdn:ERROR",
-    "-Xep:LiteralClassName:ERROR",
-    "-Xep:LogicalAssignment:ERROR",
-    "-Xep:MissingFail:ERROR",
-    "-Xep:MissingOverride:ERROR",
-    "-Xep:MisusedFormattingLogger:ERROR",
-    "-Xep:MutableConstantField:ERROR",
-    "-Xep:NamedParameters:ERROR",
-    "-Xep:NarrowingCompoundAssignment:ERROR",
-    "-Xep:NonAtomicVolatileUpdate:ERROR",
-    "-Xep:NonOverridingEquals:ERROR",
-    "-Xep:NullableConstructor:ERROR",
-    "-Xep:NullablePrimitive:ERROR",
-    "-Xep:NullableVoid:ERROR",
-    "-Xep:OperatorPrecedence:ERROR",
-    "-Xep:OverridesGuiceInjectableMethod:ERROR",
-    "-Xep:PreconditionsInvalidPlaceholder:ERROR",
-    "-Xep:PredicateIncompatibleType:ERROR",
-    "-Xep:ProduceMethodShouldBeAnnotated:ERROR",
-    "-Xep:ProtoFieldPreconditionsCheckNotNull:ERROR",
-    "-Xep:QualifierWithTypeUse:ERROR",
-    "-Xep:ReferenceEquality:ERROR",
-    "-Xep:RequiredModifiers:ERROR",
-    "-Xep:ShortCircuitBoolean:ERROR",
-    "-Xep:SimpleDateFormatConstant:ERROR",
-    "-Xep:StaticFlagUsage:ERROR",
-    "-Xep:StaticGuardedByInstance:ERROR",
-    "-Xep:StaticQualifiedUsingExpression:ERROR",
-    "-Xep:SynchronizeOnNonFinalField:ERROR",
-    "-Xep:TestExceptionChecker:ERROR",
-    "-Xep:TruthConstantAsserts:ERROR",
-    "-Xep:TypeParameterShadowing:ERROR",
-    "-Xep:TypeParameterUnusedInFormals:ERROR",
-    "-Xep:URLEqualsHashCode:ERROR",
-    "-Xep:UnsafeSdkVersionCheck:ERROR",
-    "-Xep:UnsynchronizedOverridesSynchronized:ERROR",
-    "-Xep:WaitNotInLoop:ERROR",
-]
-
-EP_OPTS = EP_STYLE_CHECKS + EP_SUGGESTED_CHECKS
-
 SOURCE_7_TARGET_7 = [
     "-source 1.7",
     "-target 1.7",
 ]
 
-JAVACOPTS = EP_OPTS
+JAVACOPTS = []
 
-JAVACOPTS_OSS = EP_OPTS + SOURCE_7_TARGET_7
+# Compile Tink open source with java 7 and produce java 7 bytecode.
+# This ensures that Tink doesn't use non-java 7 features.
+JAVACOPTS_OSS = SOURCE_7_TARGET_7
diff --git a/tools/common.bzl b/tools/common.bzl
index 0d1dfd7..a83f768 100644
--- a/tools/common.bzl
+++ b/tools/common.bzl
@@ -47,8 +47,7 @@
     attrs = {
         "src": attr.label(
             mandatory = True,
-            allow_files = True,
-            single_file = True,
+            allow_single_file = True,
         ),
         "substitutions": attr.string_dict(mandatory = True),
         "out": attr.output(mandatory = True),
diff --git a/tools/gen_java_test_rules.bzl b/tools/gen_java_test_rules.bzl
index 551858f..26a8f3d 100644
--- a/tools/gen_java_test_rules.bzl
+++ b/tools/gen_java_test_rules.bzl
@@ -35,6 +35,7 @@
         flaky_tests = [],
         manual_tests = [],
         notsan_tests = [],
+        no_rbe_tests = [],
         resources = [],
         tags = [],
         prefix = "",
@@ -60,6 +61,9 @@
         notsan = []
         if test in notsan_tests:
             notsan = ["notsan"]
+        no_rbe = []
+        if test in no_rbe_tests:
+            no_rbe = ["no_rbe"]
         flaky = 0
         if (test in flaky_tests) or ("flaky" in tags):
             flaky = 1
@@ -75,7 +79,7 @@
             jvm_flags = jvm_flags,
             args = args,
             flaky = flaky,
-            tags = tags + manual + notsan,
+            tags = tags + manual + notsan + no_rbe,
             test_class = java_class,
             visibility = visibility,
             shard_count = shard_count,
diff --git a/tools/java_single_jar.bzl b/tools/java_single_jar.bzl
index ce3dd20..7fffde0 100644
--- a/tools/java_single_jar.bzl
+++ b/tools/java_single_jar.bzl
@@ -20,13 +20,10 @@
     _check_non_empty(ctx.attr.root_packages, "root_packages")
 
     inputs = depset()
-    source_jars = depset()
+    source_jars = []
     for dep in ctx.attr.deps:
-        inputs = depset(transitive = [inputs, dep.java.transitive_runtime_deps])
-        source_jars = depset(transitive = [source_jars, dep.java.source_jars])
-        for td in dep.java.transitive_runtime_deps:
-            if hasattr(td, "java"):
-                source_jars = depset(transitive = [source_jars, td.java.source_jars])
+        inputs = depset(transitive = [inputs, dep[JavaInfo].transitive_runtime_deps])
+        source_jars += dep[JavaInfo].source_jars
 
     compress = ""
     if ctx.attr.compress == "preserve":
@@ -39,7 +36,7 @@
         fail("\"compress\" attribute (%s) must be: yes, no, preserve." % ctx.attr.compress)
 
     if ctx.attr.source_jar:
-        inputs = source_jars
+        inputs = depset(direct = source_jars)
         compress = ""
 
     args = ctx.actions.args()
@@ -74,7 +71,7 @@
 
 java_single_jar = rule(
     attrs = {
-        "deps": attr.label_list(providers = ["java"]),
+        "deps": attr.label_list(providers = [JavaInfo]),
         "_singlejar": attr.label(
             default = Label("@bazel_tools//tools/jdk:singlejar"),
             cfg = "host",
diff --git a/tools/remote_build_execution/BUILD.bazel b/tools/remote_build_execution/BUILD.bazel
new file mode 100644
index 0000000..e807cda
--- /dev/null
+++ b/tools/remote_build_execution/BUILD.bazel
@@ -0,0 +1,19 @@
+package(default_visibility = ["//tools/build_defs:internal_pkg"])
+
+licenses(["notice"])
+
+# Configuration for Remote Build Execution (RBE) builds.
+# It is used to select() RBE-specific args for tests.
+#
+# Example:
+# args = select({
+#   "//tools/remote_build_execution:rbe": ["--no_external_tests"],
+#   "//conditions:default": [],
+# }),
+#
+# This will set the --no_external_tests command line flag when a test is run
+# on RBE.
+config_setting(
+    name = "rbe",
+    values = {"define": "RBE=1"},
+)
diff --git a/tools/remote_build_execution/README.md b/tools/remote_build_execution/README.md
new file mode 100644
index 0000000..b3eb6ba
--- /dev/null
+++ b/tools/remote_build_execution/README.md
@@ -0,0 +1,7 @@
+This directory contains bazelrc files that are needed for
+Remote Build Execution.
+
+The latest files can be found here:
+https://github.com/bazelbuild/bazel-toolchains/tree/master/bazelrc
+
+The current version is: 0.27
diff --git a/tools/remote_build_execution/bazel-rbe.bazelrc b/tools/remote_build_execution/bazel-rbe.bazelrc
new file mode 100644
index 0000000..731210e
--- /dev/null
+++ b/tools/remote_build_execution/bazel-rbe.bazelrc
@@ -0,0 +1,68 @@
+# Copyright 2016 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This .bazelrc file contains all of the flags required for the provided
+# toolchain with Remote Build Execution.
+# Note your WORKSPACE must contain an rbe_autoconfig target with
+# name="rbe_default" to use these flags as-is.
+
+# Depending on how many machines are in the remote execution instance, setting
+# this higher can make builds faster by allowing more jobs to run in parallel.
+# Setting it too high can result in jobs that timeout, however, while waiting
+# for a remote machine to execute them.
+build:remote --jobs=50
+
+# Set several flags related to specifying the platform, toolchain and java
+# properties.
+# These flags should only be used as is for the rbe-ubuntu16-04 container
+# and need to be adapted to work with other toolchain containers.
+build:remote --host_javabase=@rbe_default//java:jdk
+build:remote --javabase=@rbe_default//java:jdk
+build:remote --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8
+build:remote --java_toolchain=@bazel_tools//tools/jdk:toolchain_hostjdk8
+build:remote --crosstool_top=@rbe_default//cc:toolchain
+build:remote --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1
+# Platform flags:
+# The toolchain container used for execution is defined in the target indicated
+# by "extra_execution_platforms", "host_platform" and "platforms".
+# More about platforms: https://docs.bazel.build/versions/master/platforms.html
+build:remote --extra_toolchains=@rbe_default//config:cc-toolchain
+build:remote --extra_execution_platforms=@rbe_default//config:platform
+build:remote --host_platform=@rbe_default//config:platform
+build:remote --platforms=@rbe_default//config:platform
+
+# Starting with Bazel 0.27.0 strategies do not need to be explicitly
+# defined. See https://github.com/bazelbuild/bazel/issues/7480
+build:remote --define=EXECUTOR=remote
+
+# Enable remote execution so actions are performed on the remote systems.
+build:remote --remote_executor=grpcs://remotebuildexecution.googleapis.com
+
+# Set a higher timeout value, just in case.
+build:remote --remote_timeout=3600
+
+# Accept remotely cached action results.
+build:remote --remote_accept_cached=true
+
+# Do not fall back to standalone local execution if remote execution fails.
+build:remote --remote_local_fallback=false
+
+# Set custom flag RBE=1. This is used to select() custom args for tests.
+build:remote --define=RBE=1
+
+# Enable authentication. This will pick up application default credentials by
+# default. You can use --google_credentials=some_file.json to use a service
+# account credential instead.
+# DISABLE THIS! Kokoro will setup the credentials for us based on the build config.
+# build:remote --google_default_credentials=true
diff --git a/tools/testing/BUILD.bazel b/tools/testing/BUILD.bazel
index c1606cb..66e3fee 100644
--- a/tools/testing/BUILD.bazel
+++ b/tools/testing/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/testing:__subpackages__"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 load("//tools/build_defs:javac.bzl", "JAVACOPTS_OSS")
 
@@ -40,6 +40,11 @@
     deps = [
         ":cli_util",
         "//java:testonly",
+        "//java/src/main/java/com/google/crypto/tink",
+        "//java/src/main/java/com/google/crypto/tink/aead",
+        "//java/src/main/java/com/google/crypto/tink/integration/gcpkms",
+        "//java/src/main/java/com/google/crypto/tink/integration/awskms",
+        "//java:testutil",
     ],
 )
 
diff --git a/tools/testing/cc/BUILD.bazel b/tools/testing/cc/BUILD.bazel
index b31863c..ab2ecb6 100644
--- a/tools/testing/cc/BUILD.bazel
+++ b/tools/testing/cc/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/testing:__subpackages__"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 cc_library(
     name = "cli_util",
@@ -15,14 +15,8 @@
         "//cc:json_keyset_writer",
         "//cc/config:tink_config",
         "//cc/util:status",
-    ],
-)
-
-filegroup(
-    name = "aws_kms_access_files",
-    srcs = glob(["*access_key.csv"]) + [
-        "aws_key_arn.txt",
-        "bad_aws_key_arn.txt",
+        "@com_google_absl//absl/memory",
+        "@com_google_absl//absl/strings",
     ],
 )
 
@@ -34,11 +28,23 @@
         "//cc",
         "//cc/integration/awskms:aws_crypto",
         "//cc/integration/awskms:aws_kms_aead",
+        "//cc/integration/awskms:aws_kms_client",
         "@aws_cpp_sdk//:aws_sdk_core",
     ],
 )
 
 cc_binary(
+    name = "gcp_kms_aead_cli",
+    srcs = ["gcp_kms_aead_cli.cc"],
+    deps = [
+        ":cli_util",
+        "//cc",
+        "//cc/integration/gcpkms:gcp_kms_aead",
+        "//cc/integration/gcpkms:gcp_kms_client",
+    ],
+)
+
+cc_binary(
     name = "keyset_reader_writer_cli",
     srcs = ["keyset_reader_writer_cli.cc"],
     deps = [
@@ -74,6 +80,18 @@
 )
 
 cc_binary(
+    name = "streaming_aead_cli_cc",
+    srcs = ["streaming_aead_cli.cc"],
+    deps = [
+        ":cli_util",
+        "//cc",
+        "//cc/util:istream_input_stream",
+        "//cc/util:ostream_output_stream",
+        "//cc/util:status",
+    ],
+)
+
+cc_binary(
     name = "mac_cli_cc",
     srcs = ["mac_cli.cc"],
     deps = [
@@ -125,8 +143,24 @@
         "aws_kms_aead_test.sh",
     ],
     data = [
-        ":aws_kms_access_files",
         ":aws_kms_aead_cli",
+        "//testdata:credentials",
         "//tools/testing/cross_language:test_lib",
     ],
+    tags = ["no_rbe"],
+)
+
+sh_test(
+    name = "gcp_kms_aead_test",
+    size = "medium",
+    srcs = [
+        "gcp_kms_aead_test.sh",
+    ],
+    data = [
+        ":gcp_kms_aead_cli",
+        "//testdata:credentials",
+        "//tools/testing/cross_language:test_lib",
+        "@google_root_pem//file",
+    ],
+    tags = ["no_rbe"],
 )
diff --git a/tools/testing/cc/aws_key_arn.txt b/tools/testing/cc/aws_key_arn.txt
deleted file mode 100644
index de21741..0000000
--- a/tools/testing/cc/aws_key_arn.txt
+++ /dev/null
@@ -1 +0,0 @@
-arn:aws:kms:us-east-1:889465572106:key/465a8817-deb2-4c2e-8466-2acb3643f568
diff --git a/tools/testing/cc/aws_kms_aead_cli.cc b/tools/testing/cc/aws_kms_aead_cli.cc
index 5c9aa43..be88269 100644
--- a/tools/testing/cc/aws_kms_aead_cli.cc
+++ b/tools/testing/cc/aws_kms_aead_cli.cc
@@ -17,44 +17,40 @@
 #include <vector>
 
 #include "absl/strings/ascii.h"
-#include "absl/strings/str_split.h"
 #include "aws/core/Aws.h"
-#include "aws/core/auth/AWSCredentialsProvider.h"
-#include "aws/core/client/ClientConfiguration.h"
 #include "aws/core/utils/crypto/Factories.h"
 #include "aws/core/utils/memory/AWSMemory.h"
 #include "aws/kms/KMSClient.h"
 #include "tink/aead.h"
 #include "tink/integration/awskms/aws_crypto.h"
 #include "tink/integration/awskms/aws_kms_aead.h"
+#include "tink/integration/awskms/aws_kms_client.h"
 #include "tink/util/status.h"
 #include "tink/util/statusor.h"
 #include "tools/testing/cc/cli_util.h"
 
 using crypto::tink::Aead;
 using crypto::tink::integration::awskms::AwsKmsAead;
-using crypto::tink::integration::awskms::AwsSha256Factory;
-using crypto::tink::integration::awskms::AwsSha256HmacFactory;
-using crypto::tink::integration::awskms::kAwsCryptoAllocationTag;
+using crypto::tink::integration::awskms::AwsKmsClient;
 
 // A command-line utility for testing AwsKmsAead.
 // It requires 6 arguments:
 //   key-arn-file:  Amazon Resource Name of AWS KMS key for encryption
-//   access-key-csv-file: credentials file containing AWS access key
+//   credentials-file: credentials file containing AWS access key
 //   operation: the actual AEAD-operation, i.e. "encrypt" or "decrypt"
 //   input-file:  name of the file with input (plaintext for encryption, or
 //                or ciphertext for decryption)
-//   associated-data:  a std::string to be used as assciated data
+//   associated-data:  a std::string to be used as associated data
 //   output-file:  name of the file for the resulting output
 int main(int argc, char** argv) {
   if (argc != 7) {
     std::clog << "Usage: " << argv[0]
-              << " key-arn-file access-key-csv-file"
+              << " key-arn-file credentials-file"
               << " operation input-file associated-data output-file\n";
     exit(1);
   }
   std::string key_arn_filename(argv[1]);
-  std::string access_key_filename(argv[2]);
+  std::string credentials_filename(argv[2]);
   std::string operation(argv[3]);
   std::string input_filename(argv[4]);
   std::string associated_data(argv[5]);
@@ -65,53 +61,29 @@
     exit(1);
   }
   std::clog << "Using key_arn from file " << key_arn_filename
-            << " and AWS access key from file " << access_key_filename
+            << " and AWS credentials from file " << credentials_filename
             << " to AEAD-" << operation
             << " file "<< input_filename
             << " with associated data '" << associated_data << "'.\n"
             << "The resulting output will be written to file "
             << output_filename << std::endl;
 
-  // Init AWS API.
-  Aws::SDKOptions options;
-  options.cryptoOptions.sha256Factory_create_fn = []() {
-      return Aws::MakeShared<AwsSha256Factory>(kAwsCryptoAllocationTag);
-  };
-  options.cryptoOptions.sha256HMACFactory_create_fn = []() {
-      return Aws::MakeShared<AwsSha256HmacFactory>(kAwsCryptoAllocationTag);
-  };
-  Aws::InitAPI(options);
-
-  // Prepare AWS credentials and params.
-  // access-key-cvs-file contains two lines, where  the first line
-  // describes the actual comma-separated values present in the second line.
-  std::vector<std::string> access_key =
-      absl::StrSplit(CliUtil::Read(access_key_filename), '\n');
-  std::vector<std::string> access_key_values =
-      absl::StrSplit(access_key[1], ',');
-  std::string access_key_id = access_key_values[0];
-  absl::StripAsciiWhitespace(&access_key_id);
-  std::string secret_access_key = access_key_values[1];
-  absl::StripAsciiWhitespace(&secret_access_key);
-  Aws::Auth::AWSCredentials credentials(access_key_id.c_str(),
-                                        secret_access_key.c_str());
   std::string key_arn = CliUtil::Read(key_arn_filename);
   absl::StripAsciiWhitespace(&key_arn);
+  std::clog << "Will use key ARN " << key_arn << std::endl;
 
-  std::clog << "Will use key ARN " << key_arn << std::endl
-            << "with access key ID [" << access_key_id << "]" << std::endl;
-
-  // Create AWS KMSClient.
-  Aws::Client::ClientConfiguration configuration;
-  configuration.region = "us-east-1";
-  configuration.scheme = Aws::Http::Scheme::HTTPS;
-  configuration.connectTimeoutMs = 30000;
-  configuration.requestTimeoutMs = 60000;
-  auto aws_client = Aws::MakeShared<Aws::KMS::KMSClient>(
-      kAwsCryptoAllocationTag, credentials, configuration);
+  // Create AwsKmsClient.
+  auto client_result = AwsKmsClient::New("", credentials_filename);
+  if (!client_result.ok()) {
+    std::clog << "Aead creation failed: "
+              << client_result.status().error_message()
+              << "\n";
+    exit(1);
+  }
+  auto client = std::move(client_result.ValueOrDie());
 
   // Create Aead-primitive.
-  auto aead_result = AwsKmsAead::New(key_arn, aws_client);
+  auto aead_result = client->GetAead("aws-kms://" + key_arn);
   if (!aead_result.ok()) {
     std::clog << "Aead creation failed: "
               << aead_result.status().error_message()
diff --git a/tools/testing/cc/aws_kms_aead_test.sh b/tools/testing/cc/aws_kms_aead_test.sh
index 9aaf4b8..9f54b87 100755
--- a/tools/testing/cc/aws_kms_aead_test.sh
+++ b/tools/testing/cc/aws_kms_aead_test.sh
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
@@ -11,14 +12,13 @@
 # limitations under the License.
 ################################################################################
 
-#!/bin/bash
 
 ROOT_DIR="$TEST_SRCDIR/tink"
 AWS_KMS_AEAD_CLI="$ROOT_DIR/tools/testing/cc/aws_kms_aead_cli"
-AWS_KEY_ARN_FILE="$ROOT_DIR/tools/testing/cc/aws_key_arn.txt"
-AWS_ACCESS_KEY_CSV_FILE="$ROOT_DIR/tools/testing/cc/aws_access_key.csv"
-BAD_AWS_KEY_ARN_FILE="$ROOT_DIR/tools/testing/cc/bad_aws_key_arn.txt"
-BAD_AWS_ACCESS_KEY_CSV_FILE="$ROOT_DIR/tools/testing/cc/bad_aws_access_key.csv"
+AWS_KEY_ARN_FILE="$ROOT_DIR/testdata/aws_key_arn.txt"
+CREDENTIALS_AWS_CSV_FILE="$ROOT_DIR/testdata/aws_credentials_cc.txt"
+BAD_AWS_KEY_ARN_FILE="$ROOT_DIR/testdata/bad_aws_key_arn.txt"
+BAD_CREDENTIALS_AWS_CSV_FILE="$ROOT_DIR/testdata/bad_aws_credentials_cc.txt"
 TEST_UTIL="$ROOT_DIR/tools/testing/cross_language/test_util.sh"
 associated_data="some associated data"
 
@@ -31,16 +31,11 @@
 generate_plaintext $test_name
 encrypted_file="$TEST_TMPDIR/${test_name}_encrypted.bin"
 log_file="$TEST_TMPDIR/${test_name}.log"
-$AWS_KMS_AEAD_CLI $AWS_KEY_ARN_FILE $BAD_AWS_ACCESS_KEY_CSV_FILE\
+$AWS_KMS_AEAD_CLI $AWS_KEY_ARN_FILE $BAD_CREDENTIALS_AWS_CSV_FILE\
   encrypt $plaintext_file "$associated_data" $encrypted_file 2> $log_file
 
 assert_file_contains $log_file "UnrecognizedClientException"
 
-if [ ! -e $AWS_ACCESS_KEY_CSV_FILE ]; then
-  echo "WARNING: no AWS access key found, skiping the subsequent tests"
-  exit 0
-fi
-
 #############################################################################
 # Bad key arn test.
 test_name="bad_key_arn"
@@ -48,7 +43,7 @@
 generate_plaintext $test_name
 encrypted_file="$TEST_TMPDIR/${test_name}_encrypted.bin"
 log_file="$TEST_TMPDIR/${test_name}.log"
-$AWS_KMS_AEAD_CLI $BAD_AWS_KEY_ARN_FILE $AWS_ACCESS_KEY_CSV_FILE\
+$AWS_KMS_AEAD_CLI $BAD_AWS_KEY_ARN_FILE $CREDENTIALS_AWS_CSV_FILE\
   encrypt $plaintext_file "$associated_data" $encrypted_file 2> $log_file
 
 assert_file_contains $log_file "AccessDeniedException"
@@ -62,13 +57,13 @@
 decrypted_file="$TEST_TMPDIR/${test_name}_decrypted.bin"
 log_file="$TEST_TMPDIR/${test_name}.log"
 echo "    encrypting..."
-$AWS_KMS_AEAD_CLI $AWS_KEY_ARN_FILE $AWS_ACCESS_KEY_CSV_FILE\
+$AWS_KMS_AEAD_CLI $AWS_KEY_ARN_FILE $CREDENTIALS_AWS_CSV_FILE\
   encrypt $plaintext_file "$associated_data" $encrypted_file 2> $log_file
 assert_file_contains $log_file "All done"
 assert_files_different $plaintext_file $encrypted_file
 
 echo "    decrypting..."
-$AWS_KMS_AEAD_CLI $AWS_KEY_ARN_FILE $AWS_ACCESS_KEY_CSV_FILE\
+$AWS_KMS_AEAD_CLI $AWS_KEY_ARN_FILE $CREDENTIALS_AWS_CSV_FILE\
   decrypt $encrypted_file "$associated_data" $decrypted_file 2> $log_file
 assert_file_contains $log_file "All done"
 
diff --git a/tools/testing/cc/bad_aws_key_arn.txt b/tools/testing/cc/bad_aws_key_arn.txt
deleted file mode 100644
index 0b730f3..0000000
--- a/tools/testing/cc/bad_aws_key_arn.txt
+++ /dev/null
@@ -1 +0,0 @@
-arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012
diff --git a/tools/testing/cc/cli_util.cc b/tools/testing/cc/cli_util.cc
index be0ac5d..eb65072 100644
--- a/tools/testing/cc/cli_util.cc
+++ b/tools/testing/cc/cli_util.cc
@@ -28,7 +28,9 @@
 #include "tink/json_keyset_reader.h"
 #include "tink/json_keyset_writer.h"
 #include "tink/config.h"
+#include "tink/input_stream.h"
 #include "tink/keyset_handle.h"
+#include "tink/output_stream.h"
 #include "tink/config/tink_config.h"
 #include "tink/util/status.h"
 
@@ -36,13 +38,52 @@
 using crypto::tink::BinaryKeysetWriter;
 using crypto::tink::CleartextKeysetHandle;
 using crypto::tink::Config;
+using crypto::tink::InputStream;
 using crypto::tink::JsonKeysetReader;
 using crypto::tink::JsonKeysetWriter;
 using crypto::tink::KeysetHandle;
 using crypto::tink::KeysetReader;
 using crypto::tink::KeysetWriter;
+using crypto::tink::OutputStream;
 using crypto::tink::TinkConfig;
 
+namespace {
+
+// Writes 'contents' of the specified 'size' to 'output_stream'.
+// In case of errors writes a log message and aborts.
+void WriteToStream(OutputStream* output_stream,
+                   const void* contents,
+                   int size) {
+  if (output_stream == nullptr) {
+      std::clog << "'output_stream' must be non-null" << std::endl;
+      exit(1);
+  }
+  void* buffer;
+  int pos = 0;
+  int remaining = size;
+  int available_space;
+  int available_bytes;
+  while (remaining > 0) {
+    auto next_result = output_stream->Next(&buffer);
+    if (!next_result.ok()) {
+      std::clog << "Error writing to a stream: "
+                << next_result.status() << std::endl;
+      exit(1);
+    }
+    available_space = next_result.ValueOrDie();
+    available_bytes = std::min(available_space, remaining);
+    memcpy(buffer, reinterpret_cast<const char*>(contents) + pos,
+           available_bytes);
+    remaining -= available_bytes;
+    pos += available_bytes;
+  }
+  if (available_space > available_bytes) {
+    output_stream->BackUp(available_space - available_bytes);
+  }
+}
+
+}  // namespace
+
 // static
 std::unique_ptr<KeysetReader> CliUtil::GetBinaryKeysetReader(
     const std::string& filename) {
@@ -155,3 +196,36 @@
   output_stream << output;
   output_stream.close();
 }
+
+// static
+void CliUtil::CopyStream(InputStream* input_stream,
+                          OutputStream* output_stream) {
+  if (input_stream == nullptr || output_stream == nullptr) {
+      std::clog << "'input_stream' and 'output_stream' must be non-null"
+                << std::endl;
+      exit(1);
+  }
+  const void* in_buffer;
+  while (true) {
+    auto next_result = input_stream->Next(&in_buffer);
+    if (next_result.status().error_code() ==
+        crypto::tink::util::error::OUT_OF_RANGE) {
+      // End of stream.
+      auto status = output_stream->Close();
+      if (!status.ok()) {
+        std::clog << "Error closing the output stream: " << status << std::endl;
+        exit(1);
+      }
+      return;
+    }
+    if (!next_result.ok()) {
+      std::clog << "Error reading from a stream: "
+                << next_result.status() << std::endl;
+      exit(1);
+    }
+    auto read_bytes = next_result.ValueOrDie();
+    if (read_bytes > 0) {
+      WriteToStream(output_stream, in_buffer, read_bytes);
+    }
+  }
+}
diff --git a/tools/testing/cc/cli_util.h b/tools/testing/cc/cli_util.h
index cd45599..359c6d3 100644
--- a/tools/testing/cc/cli_util.h
+++ b/tools/testing/cc/cli_util.h
@@ -20,7 +20,9 @@
 #include <iostream>
 #include <fstream>
 
+#include "tink/input_stream.h"
 #include "tink/keyset_handle.h"
+#include "tink/output_stream.h"
 
 // Helper function for CLI applications.
 class CliUtil {
@@ -61,6 +63,13 @@
   // Writes the given 'output' to the specified file.
   // In case of errors writes a log message and aborts.
   static void Write(const std::string& output, const std::string& filename);
+
+  // Reads all bytes from the specified 'input_stream', and writes them
+  // into 'output_stream', where both 'input_stream' and 'output_stream'
+  // must be non-null.  Afte writing all the bytes, closes 'output_stream'.
+  // In case of errors writes a log message and aborts.
+  static void CopyStream(crypto::tink::InputStream* input_stream,
+                         crypto::tink::OutputStream* output_stream);
 };
 
 #endif  // TOOLS_TESTING_CC_CLI_UTIL_H_
diff --git a/tools/testing/cc/gcp_kms_aead_cli.cc b/tools/testing/cc/gcp_kms_aead_cli.cc
new file mode 100644
index 0000000..bfb2798
--- /dev/null
+++ b/tools/testing/cc/gcp_kms_aead_cli.cc
@@ -0,0 +1,116 @@
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+
+#include <string>
+#include <vector>
+
+#include "absl/strings/ascii.h"
+#include "tink/aead.h"
+#include "tink/integration/gcpkms/gcp_kms_client.h"
+#include "tink/util/status.h"
+#include "tink/util/statusor.h"
+#include "tools/testing/cc/cli_util.h"
+
+using crypto::tink::Aead;
+using crypto::tink::integration::gcpkms::GcpKmsClient;
+
+// A command-line utility for testing GcpKmsAead.
+// It requires 6 arguments:
+//   key-name-file:  Google Cloud KMS key to be used for encryption
+//   credentials-file: credentials file containing GCP credentials
+//   operation: the actual AEAD-operation, i.e. "encrypt" or "decrypt"
+//   input-file:  name of the file with input (plaintext for encryption, or
+//                or ciphertext for decryption)
+//   associated-data:  a std::string to be used as associated data
+//   output-file:  name of the file for the resulting output
+int main(int argc, char** argv) {
+  if (argc != 7) {
+    std::clog << "Usage: " << argv[0]
+              << " key-name-file credentials-file"
+              << " operation input-file associated-data output-file\n";
+    exit(1);
+  }
+  std::string key_name_filename(argv[1]);
+  std::string credentials_filename(argv[2]);
+  std::string operation(argv[3]);
+  std::string input_filename(argv[4]);
+  std::string associated_data(argv[5]);
+  std::string output_filename(argv[6]);
+  if (!(operation == "encrypt" || operation == "decrypt")) {
+    std::clog << "Unknown operation '" << operation << "'.\n"
+              << "Expected 'encrypt' or 'decrypt'.\n";
+    exit(1);
+  }
+  std::clog << "Using key_name from file " << key_name_filename
+            << " and GCP credentials from file " << credentials_filename
+            << " to AEAD-" << operation
+            << " file "<< input_filename
+            << " with associated data '" << associated_data << "'.\n"
+            << "The resulting output will be written to file "
+            << output_filename << std::endl;
+
+  std::string key_name = CliUtil::Read(key_name_filename);
+  absl::StripAsciiWhitespace(&key_name);
+  std::clog << "Will use key name " << key_name << std::endl;
+
+  // Create GcpKmsClient.
+  auto client_result = GcpKmsClient::New("", credentials_filename);
+  if (!client_result.ok()) {
+    std::clog << "Aead creation failed: "
+              << client_result.status().error_message()
+              << "\n";
+    exit(1);
+  }
+  auto client = std::move(client_result.ValueOrDie());
+
+  // Create Aead-primitive.
+  auto aead_result = client->GetAead("gcp-kms://" + key_name);
+  if (!aead_result.ok()) {
+    std::clog << "Aead creation failed: "
+              << aead_result.status().error_message()
+              << "\n";
+    exit(1);
+  }
+  std::unique_ptr<Aead> aead(std::move(aead_result.ValueOrDie()));
+
+  // Read the input.
+  std::string input = CliUtil::Read(input_filename);
+
+  // Compute the output.
+  std::clog << operation << "ing...\n";
+  std::string output;
+  if (operation == "encrypt") {
+    auto encrypt_result = aead->Encrypt(input, associated_data);
+    if (!encrypt_result.ok()) {
+      std::clog << "Error while encrypting the input:"
+                << encrypt_result.status().error_message() << std::endl;
+      exit(1);
+    }
+    output = encrypt_result.ValueOrDie();
+  } else {  // operation == "decrypt"
+    auto decrypt_result = aead->Decrypt(input, associated_data);
+    if (!decrypt_result.ok()) {
+      std::clog << "Error while decrypting the input:"
+                << decrypt_result.status().error_message() << std::endl;
+      exit(1);
+    }
+    output = decrypt_result.ValueOrDie();
+  }
+
+  // Write the output to the output file.
+  CliUtil::Write(output, output_filename);
+
+  std::clog << "All done.\n";
+}
diff --git a/tools/testing/cc/gcp_kms_aead_test.sh b/tools/testing/cc/gcp_kms_aead_test.sh
new file mode 100755
index 0000000..bde4aed
--- /dev/null
+++ b/tools/testing/cc/gcp_kms_aead_test.sh
@@ -0,0 +1,74 @@
+#!/bin/bash
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+################################################################################
+
+ROOT_DIR="$TEST_SRCDIR/tink"
+GCP_KMS_AEAD_CLI="$ROOT_DIR/tools/testing/cc/gcp_kms_aead_cli"
+GCP_KEY_NAME_FILE="$ROOT_DIR/testdata/gcp_key_name.txt"
+CREDENTIALS_GCP_JSON_FILE="$ROOT_DIR/testdata/credential.json"
+BAD_GCP_KEY_NAME_FILE="$ROOT_DIR/testdata/bad_gcp_key_name.txt"
+BAD_CREDENTIALS_GCP_JSON_FILE="$ROOT_DIR/testdata/bad_gcp_credentials.json"
+TEST_UTIL="$ROOT_DIR/tools/testing/cross_language/test_util.sh"
+associated_data="some associated data"
+
+# Roots for GRPC
+# (https://github.com/grpc/grpc/blob/master/doc/environment_variables.md)
+export GRPC_DEFAULT_SSL_ROOTS_FILE_PATH="$TEST_SRCDIR/google_root_pem/file/downloaded"
+
+source $TEST_UTIL || exit 1
+
+#############################################################################
+# All good, encryption and decryption should work.
+test_name="good_key_name_and_credentials"
+echo "+++ starting test $test_name ..."
+generate_plaintext $test_name
+encrypted_file="$TEST_TMPDIR/${test_name}_encrypted.bin"
+decrypted_file="$TEST_TMPDIR/${test_name}_decrypted.bin"
+log_file="$TEST_TMPDIR/${test_name}.log"
+echo "    encrypting..."
+$GCP_KMS_AEAD_CLI $GCP_KEY_NAME_FILE $CREDENTIALS_GCP_JSON_FILE\
+  encrypt $plaintext_file "$associated_data" $encrypted_file 2> $log_file
+assert_file_contains $log_file "All done"
+assert_files_different $plaintext_file $encrypted_file
+
+echo "    decrypting..."
+$GCP_KMS_AEAD_CLI $GCP_KEY_NAME_FILE $CREDENTIALS_GCP_JSON_FILE\
+  decrypt $encrypted_file "$associated_data" $decrypted_file 2> $log_file
+assert_file_contains $log_file "All done"
+
+echo "    checking decryption result..."
+assert_files_equal $plaintext_file $decrypted_file
+
+#############################################################################
+# Bad credentials test.
+test_name="bad_gcp_credentials"
+echo "+++ starting test $test_name ..."
+generate_plaintext $test_name
+encrypted_file="$TEST_TMPDIR/${test_name}_encrypted.bin"
+log_file="$TEST_TMPDIR/${test_name}.log"
+$GCP_KMS_AEAD_CLI $GCP_KEY_NAME_FILE $BAD_CREDENTIALS_GCP_JSON_FILE\
+  encrypt $plaintext_file "$associated_data" $encrypted_file 2> $log_file
+
+assert_file_contains $log_file "invalid authentication credentials"
+
+#############################################################################
+# Bad key name test.
+test_name="bad_key_name"
+echo "+++ starting test $test_name ..."
+generate_plaintext $test_name
+encrypted_file="$TEST_TMPDIR/${test_name}_encrypted.bin"
+log_file="$TEST_TMPDIR/${test_name}.log"
+$GCP_KMS_AEAD_CLI $BAD_GCP_KEY_NAME_FILE $CREDENTIALS_GCP_JSON_FILE\
+  encrypt $plaintext_file "$associated_data" $encrypted_file 2> $log_file
+
+assert_file_contains $log_file "Project" "not found"
diff --git a/tools/testing/cc/streaming_aead_cli.cc b/tools/testing/cc/streaming_aead_cli.cc
new file mode 100644
index 0000000..b4b1b7f
--- /dev/null
+++ b/tools/testing/cc/streaming_aead_cli.cc
@@ -0,0 +1,120 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include <iostream>
+#include <fstream>
+
+#include "tink/streaming_aead.h"
+#include "tink/keyset_handle.h"
+#include "tink/util/istream_input_stream.h"
+#include "tink/util/ostream_output_stream.h"
+#include "tink/util/status.h"
+#include "tools/testing/cc/cli_util.h"
+
+using crypto::tink::InputStream;
+using crypto::tink::KeysetHandle;
+using crypto::tink::OutputStream;
+using crypto::tink::util::IstreamInputStream;
+using crypto::tink::util::OstreamOutputStream;
+
+// A command-line utility for testing StreamingAead-primitives.
+// It requires 5 arguments:
+//   keyset-file:  name of the file with the keyset to be used for encryption
+//   operation: the actual StreamingAead-operation, i.e. "encrypt" or "decrypt"
+//   input-file:  name of the file with input (plaintext for encryption, or
+//                or ciphertext for decryption)
+//   associated-data-file:  name of the file containing associated data
+//   output-file:  name of the file for the resulting output
+int main(int argc, char** argv) {
+  if (argc != 6) {
+    std::clog << "Usage: " << argv[0]
+         << " keyset-file operation input-file associated-data-file "
+         << "output-file\n";
+    exit(1);
+  }
+  std::string keyset_filename(argv[1]);
+  std::string operation(argv[2]);
+  std::string input_filename(argv[3]);
+  std::string associated_data_file(argv[4]);
+  std::string output_filename(argv[5]);
+  if (!(operation == "encrypt" || operation == "decrypt")) {
+    std::clog << "Unknown operation '" << operation << "'.\n"
+              << "Expected 'encrypt' or 'decrypt'.\n";
+    exit(1);
+  }
+  std::clog << "Using keyset from file " << keyset_filename
+            << " to StreamingAead-" << operation
+            << " file "<< input_filename
+            << " with associated data from from file " << associated_data_file
+            << ".\n" << "The resulting output will be written to file "
+            << output_filename << std::endl;
+
+  // Init Tink;
+  CliUtil::InitTink();
+
+  // Read the keyset.
+  std::unique_ptr<KeysetHandle> keyset_handle =
+      CliUtil::ReadKeyset(keyset_filename);
+
+  // Get the primitive.
+  auto primitive_result =
+      keyset_handle->GetPrimitive<crypto::tink::StreamingAead>();
+  if (!primitive_result.ok()) {
+    std::clog << "Getting StreamingAead-primitive from the factory failed: "
+              << primitive_result.status().error_message() << std::endl;
+    exit(1);
+  }
+  std::unique_ptr<crypto::tink::StreamingAead> saead =
+      std::move(primitive_result.ValueOrDie());
+
+  // Open input/output streams, and read the associated data.
+  auto input = absl::make_unique<std::ifstream>(
+      input_filename, std::ifstream::in | std::ifstream::binary);
+  std::unique_ptr<InputStream> input_stream(
+      absl::make_unique<IstreamInputStream>(std::move(input)));
+  auto output = absl::make_unique<std::ofstream>(
+      output_filename, std::ofstream::out | std::ofstream::binary);
+  std::unique_ptr<OutputStream> output_stream(
+      absl::make_unique<OstreamOutputStream>(std::move(output)));
+  std::string associated_data = CliUtil::Read(associated_data_file);
+
+  // Compute the output.
+  std::clog << operation << "ing...\n";
+  if (operation == "encrypt") {
+    // Turn output_stream into an encrypting stream.
+    auto enc_stream_result =
+        saead->NewEncryptingStream(std::move(output_stream), associated_data);
+    if (!enc_stream_result.ok()) {
+      std::clog << "Error while creating an encrypting stream:"
+                << enc_stream_result.status().error_message() << std::endl;
+      exit(1);
+    }
+    output_stream = std::move(enc_stream_result.ValueOrDie());
+  } else {  // operation == "decrypt"
+    // Turn input_stream into a decrypting stream.
+    auto dec_stream_result =
+        saead->NewDecryptingStream(std::move(input_stream), associated_data);
+    if (!dec_stream_result.ok()) {
+      std::clog << "Error while creating a decrypting stream:"
+                << dec_stream_result.status().error_message() << std::endl;
+      exit(1);
+    }
+    input_stream = std::move(dec_stream_result.ValueOrDie());
+  }
+  CliUtil::CopyStream(input_stream.get(), output_stream.get());
+  std::clog << "All done.\n";
+  return 0;
+}
diff --git a/tools/testing/cross_language/BUILD.bazel b/tools/testing/cross_language/BUILD.bazel
index af5806d..42f218d 100644
--- a/tools/testing/cross_language/BUILD.bazel
+++ b/tools/testing/cross_language/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 filegroup(
     name = "test_lib",
@@ -46,8 +46,15 @@
         ":test_lib",
         "//tools/testing:aead_cli_java",
         "//tools/testing/cc:aead_cli_cc",
+        "//tools/testing/go:aead_cli_go",
+        "//tools/testing/go:generate_envelope_keyset",
         "//tools/tinkey",
+        "//testdata:credentials",
     ],
+    args = select({
+      "//tools/remote_build_execution:rbe": ["--no_external_tests"],
+      "//conditions:default": [],
+    }),
 )
 
 sh_test(
@@ -60,6 +67,7 @@
         ":test_lib",
         "//tools/testing:deterministic_aead_cli_java",
         "//tools/testing/cc:deterministic_aead_cli_cc",
+        "//tools/testing/go:deterministic_aead_cli_go",
         "//tools/tinkey",
     ],
 )
@@ -73,6 +81,7 @@
     data = [
         ":test_lib",
         "//tools/testing:streaming_aead_cli_java",
+        "//tools/testing/cc:streaming_aead_cli_cc",
         "//tools/tinkey",
     ],
 )
@@ -87,6 +96,7 @@
         ":test_lib",
         "//tools/testing:mac_cli_java",
         "//tools/testing/cc:mac_cli_cc",
+        "//tools/testing/go:mac_cli_go",
         "//tools/tinkey",
     ],
 )
@@ -103,13 +113,16 @@
         "//tools/testing:hybrid_encrypt_cli_java",
         "//tools/testing/cc:hybrid_decrypt_cli_cc",
         "//tools/testing/cc:hybrid_encrypt_cli_cc",
+        "//tools/testing/go:hybrid_encrypt_cli_go",
+        "//tools/testing/go:hybrid_decrypt_cli_go",
         "//tools/tinkey",
     ],
 )
 
 sh_test(
     name = "signature_test",
-    size = "medium",
+    size = "large",
+    timeout = "long",
     srcs = [
         "signature_test.sh",
     ],
@@ -119,6 +132,8 @@
         "//tools/testing:public_key_verify_cli_java",
         "//tools/testing/cc:public_key_sign_cli_cc",
         "//tools/testing/cc:public_key_verify_cli_cc",
+        "//tools/testing/go:public_key_sign_cli_go",
+        "//tools/testing/go:public_key_verify_cli_go",
         "//tools/tinkey",
     ],
 )
diff --git a/tools/testing/cross_language/aead_test.sh b/tools/testing/cross_language/aead_test.sh
index 919a55a..3ee31e3 100755
--- a/tools/testing/cross_language/aead_test.sh
+++ b/tools/testing/cross_language/aead_test.sh
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
@@ -11,14 +12,22 @@
 # limitations under the License.
 ################################################################################
 
-#!/bin/bash
 
 ROOT_DIR="$TEST_SRCDIR/tink"
 CC_AEAD_CLI="$ROOT_DIR/tools/testing/cc/aead_cli_cc"
+PY2_AEAD_CLI="" # placeholder, please ignore
+PY3_AEAD_CLI="" # placeholder, please ignore
+GO_AEAD_CLI="$ROOT_DIR/tools/testing/go/aead_cli_go"
 JAVA_AEAD_CLI="$ROOT_DIR/tools/testing/aead_cli_java"
 TEST_UTIL="$ROOT_DIR/tools/testing/cross_language/test_util.sh"
+RUN_EXTERNAL_TESTS=true
 
-KEY_TEMPLATES=(AES128_GCM AES256_GCM AES128_EAX AES256_EAX AES128_CTR_HMAC_SHA256 AES256_CTR_HMAC_SHA256)
+# TODO(b/136245485): Update this script to use go/gbash.
+# Tests that require external resources cannot run on RBE. If the
+# --no_external_tests flag is specified disable these test cases.
+if [ "$1" == "--no_external_tests" ]; then
+  RUN_EXTERNAL_TESTS=false
+fi
 
 source $TEST_UTIL || exit 1
 
@@ -27,37 +36,165 @@
 
 # Basic tests of AEAD-implementations.
 aead_basic_test() {
-  local test_name="$1-aead-basic-test"
-  local encrypt_cli="$2"
-  local decrypt_cli="$3"
-  local key_templates=$4
+  local test_name="aead-basic-test"
+  local encrypt_clis=$1
+  local decrypt_clis=$2
+  local key_templates=$3
 
   echo "############ starting test $test_name for the following templates:"
   echo $key_templates
   for key_template in ${key_templates[*]}
   do
-    local test_instance="${test_name}_${key_template}"
-    generate_symmetric_key $test_instance $key_template
-    generate_plaintext $test_instance
+    echo "## TEST for key template $key_template"
+    for encrypt_cli in ${encrypt_clis[*]}
+    do
+      local encrypt_cli_name=$(basename $encrypt_cli)
+      echo "## ENCRYPTING using $encrypt_cli_name"
+      local test_instance="${test_name}_${key_template}"
+      generate_symmetric_key "${test_instance}_ENCRYPT_${encrypt_cli_name}" \
+          $key_template
+      generate_plaintext $test_instance
 
-    local encrypted_file="$TEST_TMPDIR/${test_instance}_encrypted.bin"
-    local decrypted_file="$TEST_TMPDIR/${test_instance}_decrypted.bin"
-    local associated_data_file="$TEST_TMPDIR/${test_instance}_aad.bin"
-    echo "some associated data for $test_instance" > $associated_data_file
-    $encrypt_cli $symmetric_key_file "encrypt" $plaintext_file\
+      local encrypted_file="$TEST_TMPDIR/${test_instance}_ENCRYPT_${encrypt_cli_name}_encrypted.bin"
+      local associated_data_file="$TEST_TMPDIR/${test_instance}_ENCRYPT_${encrypt_cli_name}_aad.bin"
+      echo "some associated data for $test_instance using $encrypt_cli_name" \
+           "for encryption" > $associated_data_file
+
+      $encrypt_cli $symmetric_key_file "encrypt" $plaintext_file\
+          $associated_data_file $encrypted_file|| exit 1
+      assert_files_different $plaintext_file $encrypted_file
+      for decrypt_cli in ${decrypt_clis[*]}
+      do
+        local decrypt_cli_name=$(basename "$decrypt_cli")
+        local decrypted_file="$TEST_TMPDIR/${test_instance}_ENCRYPT_${encrypt_cli_name}_DECRYPT_${decrypt_cli_name}_decrypted.bin"
+        echo "## DECRYPTING using $decrypt_cli_name"
+        $decrypt_cli $symmetric_key_file "decrypt" $encrypted_file\
+            $associated_data_file $decrypted_file || exit 1
+        assert_files_equal $plaintext_file $decrypted_file
+      done
+    done
+  done
+}
+
+#############################################################################
+### Helpers for AWS AEAD-tests.
+
+# Envelope encryption tests using AWS KMS AEAD-implementations.
+aead_aws_test() {
+  local test_name="aead-aws-test"
+  local encrypt_clis=$1
+  local decrypt_clis=$2
+  local key_templates=$3
+  # lint placeholder header, please ignore
+ # ignore-placeholder1
+  # lint placeholder footer, please ignore
+  echo "############ starting test $test_name for the following templates:"
+  echo $key_templates
+  for key_template in ${key_templates[*]}
+  do
+    echo "## TEST for key template $key_template"
+    for encrypt_cli in ${encrypt_clis[*]}
+    do
+      local encrypt_cli_name=$(basename $encrypt_cli)
+      echo "## ENCRYPTING using $encrypt_cli_name"
+      local test_instance="${test_name}_${key_template}"
+      generate_aws_keyset "${test_instance}_ENCRYPT_${encrypt_cli_name}" \
+          $key_template
+      generate_plaintext $test_instance 30000
+
+      local encrypted_file="$TEST_TMPDIR/${test_instance}_ENCRYPT_${encrypt_cli_name}_encrypted.bin"
+      local associated_data_file="$TEST_TMPDIR/${test_instance}_ENCRYPT_${encrypt_cli_name}_aad.bin"
+      echo "some associated data for $test_instance using $encrypt_cli_name" \
+          "for encryption" > $associated_data_file
+
+      $encrypt_cli $aws_keyset_file "encrypt" $plaintext_file\
+          $associated_data_file $encrypted_file|| exit 1
+      assert_files_different $plaintext_file $encrypted_file
+      for decrypt_cli in ${decrypt_clis[*]}
+      do
+        local decrypt_cli_name=$(basename "$decrypt_cli")
+        local decrypted_file="$TEST_TMPDIR/${test_instance}_ENCRYPT_${encrypt_cli_name}_DECRYPT_${decrypt_cli_name}_decrypted.bin"
+        echo "## DECRYPTING using $decrypt_cli_name"
+        $decrypt_cli $aws_keyset_file "decrypt" $encrypted_file\
+            $associated_data_file $decrypted_file || exit 1
+        assert_files_equal $plaintext_file $decrypted_file
+      done
+    done
+  done
+}
+
+#############################################################################
+### Helpers for GCP AEAD-tests.
+
+# Envelope encryption tests using GCP KMS AEAD-implementations.
+aead_gcp_test() {
+  local test_name="aead-gcp-test"
+  local encrypt_clis=$1
+  local decrypt_clis=$2
+  local key_templates=$3
+  # lint placeholder header, please ignore
+ # ignore-placeholder1
+  # lint placeholder footer, please ignore
+  echo "############ starting test $test_name for the following templates:"
+  echo $key_templates
+  for key_template in ${key_templates[*]}
+  do
+    echo "## TEST for key template $key_template"
+    for encrypt_cli in ${encrypt_clis[*]}
+    do
+      local encrypt_cli_name=$(basename $encrypt_cli)
+      echo "## ENCRYPTING using $encrypt_cli_name"
+      local test_instance="${test_name}_${key_template}"
+      generate_gcp_keyset "${test_instance}_ENCRYPT_${encrypt_cli_name}" \
+          $key_template
+      generate_plaintext $test_instance 30000
+
+      local encrypted_file="$TEST_TMPDIR/${test_instance}_ENCRYPT_${encrypt_cli_name}_encrypted.bin"
+      local associated_data_file="$TEST_TMPDIR/${test_instance}_ENCRYPT_${encrypt_cli_name}_aad.bin"
+      echo "some associated data for $test_instance using $encrypt_cli_name" \
+          "for encryption" > $associated_data_file
+      $encrypt_cli $gcp_keyset_file "encrypt" $plaintext_file\
         $associated_data_file $encrypted_file || exit 1
-    assert_files_different $plaintext_file $encrypted_file
-    $decrypt_cli $symmetric_key_file "decrypt" $encrypted_file\
-        $associated_data_file $decrypted_file || exit 1
-    assert_files_equal $plaintext_file $decrypted_file
+      assert_files_different $plaintext_file $encrypted_file
+
+      for decrypt_cli in ${decrypt_clis[*]}
+      do
+        local decrypt_cli_name=$(basename "$decrypt_cli")
+        local decrypted_file="$TEST_TMPDIR/${test_instance}_ENCRYPT_${encrypt_cli_name}_DECRYPT_${decrypt_cli_name}_decrypted.bin"
+        echo "## DECRYPTING using $decrypt_cli_name"
+        $decrypt_cli $gcp_keyset_file "decrypt" $encrypted_file\
+           $associated_data_file $decrypted_file || exit 1
+        assert_files_equal $plaintext_file $decrypted_file
+      done
+    done
   done
 }
 
 #############################################################################
 ##### Run the actual tests.
-aead_basic_test "CC-CC"     $CC_AEAD_CLI   $CC_AEAD_CLI   "${KEY_TEMPLATES[*]}"
-aead_basic_test "CC-JAVA"   $CC_AEAD_CLI   $JAVA_AEAD_CLI "${KEY_TEMPLATES[*]}"
-aead_basic_test "JAVA-CC"   $JAVA_AEAD_CLI $CC_AEAD_CLI   "${KEY_TEMPLATES[*]}"
-aead_basic_test "JAVA-JAVA" $JAVA_AEAD_CLI $JAVA_AEAD_CLI "${KEY_TEMPLATES[*]}"
+KEY_TEMPLATES=(AES128_GCM AES256_GCM AES128_CTR_HMAC_SHA256 AES256_CTR_HMAC_SHA256 XCHACHA20_POLY1305)
+ENCRYPT_CLIS=($CC_AEAD_CLI $JAVA_AEAD_CLI $GO_AEAD_CLI $PY2_AEAD_CLI $PY3_AEAD_CLI)
+DECRYPT_CLIS=($CC_AEAD_CLI $JAVA_AEAD_CLI $GO_AEAD_CLI $PY2_AEAD_CLI $PY3_AEAD_CLI)
+aead_basic_test "${ENCRYPT_CLIS[*]}" "${DECRYPT_CLIS[*]}" "${KEY_TEMPLATES[*]}"
 
+KEY_TEMPLATES=(AES128_EAX AES256_EAX)
+ENCRYPT_CLIS=($CC_AEAD_CLI $JAVA_AEAD_CLI $PY2_AEAD_CLI $PY3_AEAD_CLI)
+DECRYPT_CLIS=($CC_AEAD_CLI $JAVA_AEAD_CLI $PY2_AEAD_CLI $PY3_AEAD_CLI)
+aead_basic_test "${ENCRYPT_CLIS[*]}" "${DECRYPT_CLIS[*]}" "${KEY_TEMPLATES[*]}"
 
+KEY_TEMPLATES=(CHACHA20_POLY1305)
+ENCRYPT_CLIS=($JAVA_AEAD_CLI $GO_AEAD_CLI)
+DECRYPT_CLIS=($JAVA_AEAD_CLI $GO_AEAD_CLI)
+aead_basic_test "${ENCRYPT_CLIS[*]}" "${DECRYPT_CLIS[*]}" "${KEY_TEMPLATES[*]}"
+
+if [ "$RUN_EXTERNAL_TESTS" = true ]; then
+  KEY_TEMPLATES=(AES128_GCM AES128_CTR_HMAC_SHA256)
+  ENCRYPT_CLIS=($GO_AEAD_CLI $JAVA_AEAD_CLI)
+  DECRYPT_CLIS=($GO_AEAD_CLI $JAVA_AEAD_CLI)
+  aead_gcp_test "${ENCRYPT_CLIS[*]}" "${DECRYPT_CLIS[*]}" "${KEY_TEMPLATES[*]}"
+
+  # lint placeholder header, please ignore
+  aead_aws_test "${ENCRYPT_CLIS[*]}" "${DECRYPT_CLIS[*]}" "${KEY_TEMPLATES[*]}"
+
+  # lint placeholder footer, please ignore
+fi
diff --git a/tools/testing/cross_language/deterministic_aead_test.sh b/tools/testing/cross_language/deterministic_aead_test.sh
index 8be5e58..9c72be4 100755
--- a/tools/testing/cross_language/deterministic_aead_test.sh
+++ b/tools/testing/cross_language/deterministic_aead_test.sh
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
@@ -11,11 +12,11 @@
 # limitations under the License.
 ################################################################################
 
-#!/bin/bash
 
 ROOT_DIR="$TEST_SRCDIR/tink"
 CC_DAEAD_CLI="$ROOT_DIR/tools/testing/cc/deterministic_aead_cli_cc"
 JAVA_DAEAD_CLI="$ROOT_DIR/tools/testing/deterministic_aead_cli_java"
+GO_DAEAD_CLI="$ROOT_DIR/tools/testing/go/deterministic_aead_cli_go"
 TEST_UTIL="$ROOT_DIR/tools/testing/cross_language/test_util.sh"
 
 KEY_TEMPLATES=(AES256_SIV)
@@ -63,4 +64,13 @@
     $JAVA_DAEAD_CLI $CC_DAEAD_CLI   "${KEY_TEMPLATES[*]}"
 deterministic_aead_basic_test "JAVA-JAVA"\
     $JAVA_DAEAD_CLI $JAVA_DAEAD_CLI "${KEY_TEMPLATES[*]}"
-
+deterministic_aead_basic_test "GO-GO"\
+    $GO_DAEAD_CLI $GO_DAEAD_CLI "${KEY_TEMPLATES[*]}"
+deterministic_aead_basic_test "GO-JAVA"\
+    $GO_DAEAD_CLI $JAVA_DAEAD_CLI "${KEY_TEMPLATES[*]}"
+deterministic_aead_basic_test "JAVA-GO"\
+    $JAVA_DAEAD_CLI $GO_DAEAD_CLI "${KEY_TEMPLATES[*]}"
+deterministic_aead_basic_test "CC-GO"\
+    $CC_DAEAD_CLI $GO_DAEAD_CLI "${KEY_TEMPLATES[*]}"
+deterministic_aead_basic_test "GO-CC"\
+    $GO_DAEAD_CLI $CC_DAEAD_CLI "${KEY_TEMPLATES[*]}"
diff --git a/tools/testing/cross_language/hybrid_encryption_test.sh b/tools/testing/cross_language/hybrid_encryption_test.sh
index 0ab9da1..3f9c04c 100755
--- a/tools/testing/cross_language/hybrid_encryption_test.sh
+++ b/tools/testing/cross_language/hybrid_encryption_test.sh
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
@@ -11,7 +12,6 @@
 # limitations under the License.
 ################################################################################
 
-#!/bin/bash
 
 ROOT_DIR="$TEST_SRCDIR/tink"
 CC_ENCRYPT_CLI="$ROOT_DIR/tools/testing/cc/hybrid_encrypt_cli_cc"
@@ -19,48 +19,62 @@
 JAVA_ENCRYPT_CLI="$ROOT_DIR/tools/testing/hybrid_encrypt_cli_java"
 JAVA_DECRYPT_CLI="$ROOT_DIR/tools/testing/hybrid_decrypt_cli_java"
 TEST_UTIL="$ROOT_DIR/tools/testing/cross_language/test_util.sh"
-
-KEY_TEMPLATES=(ECIES_P256_HKDF_HMAC_SHA256_AES128_CTR_HMAC_SHA256 ECIES_P256_HKDF_HMAC_SHA256_AES128_GCM)
+GO_ENCRYPT_CLI="$ROOT_DIR/tools/testing/go/hybrid_encrypt_cli_go"
+GO_DECRYPT_CLI="$ROOT_DIR/tools/testing/go/hybrid_decrypt_cli_go"
 
 source $TEST_UTIL || exit 1
 
-
 #############################################################################
 ### Helpers for hybrid-tests.
 
-# Basic tests of HybridEncrypt and HybridDecrypt.
+# Basic tests of HybridEncrypt and HybridDecrypt implementations.
 hybrid_basic_test() {
-  local test_name="$1-hybrid-basic-test"
-  local encrypt_cli="$2"
-  local decrypt_cli="$3"
-  local key_templates=$4
+  local test_name="hybrid-basic-test"
+  local encrypt_clis=$1
+  local decrypt_clis=$2
+  local key_templates=$3
 
   echo "############ starting test $test_name for the following templates:"
   echo $key_templates
   for key_template in ${key_templates[*]}
   do
-    local test_instance="${test_name}_${key_template}"
-    generate_asymmetric_keys $test_instance $key_template
-    generate_plaintext $test_instance
+    echo "## TEST for key template $key_template"
+    for encrypt_cli in ${encrypt_clis[*]}
+    do
+      local encrypt_cli_name=$(basename $encrypt_cli)
+      echo "## ENCRYPTING using $encrypt_cli_name"
+      local test_instance="${test_name}_${key_template}"
+      generate_asymmetric_keys "${test_instance}_ENCRYPT_${encrypt_cli_name}" \
+          $key_template
+      generate_plaintext $test_instance
 
-    local encrypted_file="$TEST_TMPDIR/${test_instance}_encrypted.bin"
-    local decrypted_file="$TEST_TMPDIR/${test_instance}_decrypted.bin"
-    local context_info_file="$TEST_TMPDIR/${test_instance}_context_info.bin"
-    echo "some context info for $test_instance" > $context_info_file
-    $encrypt_cli $pub_key_file $plaintext_file $context_info_file \
-        $encrypted_file || exit 1
-    assert_files_different $plaintext_file $encrypted_file
-    $decrypt_cli $priv_key_file $encrypted_file $context_info_file \
-        $decrypted_file || exit 1
-    assert_files_equal $plaintext_file $decrypted_file
+      local encrypted_file="$TEST_TMPDIR/${test_instance}_ENCRYPT_${encrypt_cli_name}_encrypted.bin"
+      local context_info_file="$TEST_TMPDIR/${test_instance}_ENCRYPT_${encrypt_cli_name}_context_info.bin"
+      echo "some context info for $test_instance using $encrypt_cli_name" \
+          "for encryption" > $context_info_file
+
+      $encrypt_cli $pub_key_file $plaintext_file $context_info_file \
+          $encrypted_file || exit 1
+      assert_files_different $plaintext_file $encrypted_file
+      for decrypt_cli in ${decrypt_clis[*]}
+      do
+        local decrypt_cli_name=$(basename "$decrypt_cli")
+        local decrypted_file="$TEST_TMPDIR/${test_instance}_ENCRYPT_${encrypt_cli_name}_DECRYPT_${decrypt_cli_name}_decrypted.bin"
+        echo "## DECRYPTING using $decrypt_cli_name"
+        $decrypt_cli $priv_key_file $encrypted_file $context_info_file \
+            $decrypted_file || exit 1
+        assert_files_equal $plaintext_file $decrypted_file
+      done
+    done
   done
 }
 
+
 #############################################################################
 ##### Run the actual tests.
-hybrid_basic_test "CC-CC"     $CC_ENCRYPT_CLI   $CC_DECRYPT_CLI   "${KEY_TEMPLATES[*]}"
-hybrid_basic_test "CC-JAVA"   $CC_ENCRYPT_CLI   $JAVA_DECRYPT_CLI "${KEY_TEMPLATES[*]}"
-hybrid_basic_test "JAVA-CC"   $JAVA_ENCRYPT_CLI $CC_DECRYPT_CLI   "${KEY_TEMPLATES[*]}"
-hybrid_basic_test "JAVA-JAVA" $JAVA_ENCRYPT_CLI $JAVA_DECRYPT_CLI "${KEY_TEMPLATES[*]}"
 
-
+KEY_TEMPLATES=(ECIES_P256_HKDF_HMAC_SHA256_AES128_CTR_HMAC_SHA256 ECIES_P256_HKDF_HMAC_SHA256_AES128_GCM)
+ENCRYPT_CLIS=($CC_ENCRYPT_CLI $JAVA_ENCRYPT_CLI $GO_ENCRYPT_CLI)
+DECRYPT_CLIS=($CC_DECRYPT_CLI $JAVA_DECRYPT_CLI $GO_DECRYPT_CLI)
+hybrid_basic_test "${ENCRYPT_CLIS[*]}" "${DECRYPT_CLIS[*]}" \
+    "${KEY_TEMPLATES[*]}"
diff --git a/tools/testing/cross_language/keyset_reader_writer_test.sh b/tools/testing/cross_language/keyset_reader_writer_test.sh
index cd8d8ee..431d0f6 100755
--- a/tools/testing/cross_language/keyset_reader_writer_test.sh
+++ b/tools/testing/cross_language/keyset_reader_writer_test.sh
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
@@ -11,7 +12,6 @@
 # limitations under the License.
 ################################################################################
 
-#!/bin/bash
 
 ROOT_DIR="$TEST_SRCDIR/tink"
 CC_KEYSET_RW_CLI="$ROOT_DIR/tools/testing/cc/keyset_reader_writer_cli"
diff --git a/tools/testing/cross_language/mac_test.sh b/tools/testing/cross_language/mac_test.sh
index a141ebb..dfc0841 100755
--- a/tools/testing/cross_language/mac_test.sh
+++ b/tools/testing/cross_language/mac_test.sh
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
@@ -11,15 +12,13 @@
 # limitations under the License.
 ################################################################################
 
-#!/bin/bash
 
 ROOT_DIR="$TEST_SRCDIR/tink"
 CC_MAC_CLI="$ROOT_DIR/tools/testing/cc/mac_cli_cc"
+GO_MAC_CLI="$ROOT_DIR/tools/testing/go/mac_cli_go"
 JAVA_MAC_CLI="$ROOT_DIR/tools/testing/mac_cli_java"
 TEST_UTIL="$ROOT_DIR/tools/testing/cross_language/test_util.sh"
 
-KEY_TEMPLATES=(HMAC_SHA256_128BITTAG HMAC_SHA256_256BITTAG)
-
 source $TEST_UTIL || exit 1
 
 #############################################################################
@@ -27,50 +26,59 @@
 
 # Basic tests of MAC-implementations.
 mac_basic_test() {
-  local test_name="$1-mac-basic-test-$5"
-  local compute_mac_cli="$2"
-  local verify_mac_cli="$3"
-  local key_templates=$4
-  local output_prefix="$5"
+  local test_name="mac-basic-test"
+  local compute_mac_clis=$1
+  local verify_mac_clis=$2
+  local key_templates=$3
 
   echo "############ starting test $test_name for the following templates:"
   echo $key_templates
-  for key_template in ${key_templates[*]}
-  do
-    local test_instance="${test_name}_${key_template}"
-    generate_symmetric_key $test_instance $key_template
-    generate_plaintext $test_instance
+    for key_template in ${key_templates[*]}
+    do
+      echo "## TEST for key template $key_template"
+      echo $compute_mac_clis
+      for compute_mac_cli in ${compute_mac_clis[*]}
+      do
+        local compute_mac_cli_name=$(basename $compute_mac_cli)
+        echo "## COMPUTING MAC using $compute_mac_cli_name"
+        local test_instance="${test_name}_${key_template}"
 
-    local mac_file="$TEST_TMPDIR/${test_instance}_mac.bin"
-    local result_file="$TEST_TMPDIR/${test_instance}_result.txt"
-    $compute_mac_cli $symmetric_key_file "compute" $plaintext_file\
-        $mac_file || exit 1
-    assert_files_different $plaintext_file $mac_file
-    $verify_mac_cli $symmetric_key_file "verify" $plaintext_file\
-        $mac_file $result_file || exit 1
-    assert_file_equals "valid" $result_file
-  done
+        generate_symmetric_key "${test_instance}_MAC_${compute_mac_cli_name}" $key_template
+        generate_plaintext $test_instance
+
+        local mac_file="$TEST_TMPDIR/${test_instance}_MAC_${compute_mac_cli_name}_mac.bin"
+
+        $compute_mac_cli $symmetric_key_file "compute" $plaintext_file\
+            $mac_file || exit 1
+        assert_files_different $plaintext_file $mac_file
+
+        for verify_mac_cli in ${verify_mac_clis[*]}
+        do
+          local verify_mac_cli_name=$(basename $verify_mac_cli)
+          local result_file="$TEST_TMPDIR/${test_instance}_MAC_${compute_mac_cli_name}_VERIFY_${verify_mac_cli_name}_verification.txt"
+
+          echo "## VERIFYING using $verify_mac_cli_name"
+
+          $verify_mac_cli $symmetric_key_file "verify" $plaintext_file\
+              $mac_file $result_file || exit 1
+          assert_file_equals "valid" $result_file
+
+        done
+      done
+    done
 }
 
 #############################################################################
 ##### Run the actual tests.
 
-### Tests with OutputPrefixType=="TINK"
-mac_basic_test "CC-CC"     $CC_MAC_CLI   $CC_MAC_CLI   \
-  "${KEY_TEMPLATES[*]}" "TINK"
-mac_basic_test "CC-JAVA"   $CC_MAC_CLI   $JAVA_MAC_CLI \
-  "${KEY_TEMPLATES[*]}" "TINK"
-mac_basic_test "JAVA-CC"   $JAVA_MAC_CLI $CC_MAC_CLI   \
-  "${KEY_TEMPLATES[*]}" "TINK"
-mac_basic_test "JAVA-JAVA" $JAVA_MAC_CLI $JAVA_MAC_CLI \
-  "${KEY_TEMPLATES[*]}" "TINK"
+KEY_TEMPLATES=(HMAC_SHA256_128BITTAG HMAC_SHA256_256BITTAG HMAC_SHA512_256BITTAG HMAC_SHA512_512BITTAG)
+MAC_CLIS=($CC_MAC_CLI $JAVA_MAC_CLI $GO_MAC_CLI)
+VERIFY_CLIS=($CC_MAC_CLI $JAVA_MAC_CLI $GO_MAC_CLI)
+mac_basic_test "${MAC_CLIS[*]}" "${VERIFY_CLIS[*]}" \
+    "${KEY_TEMPLATES[*]}"
 
-### Tests with OutputPrefixType=="LEGACY"
-mac_basic_test "CC-CC"     $CC_MAC_CLI   $CC_MAC_CLI   \
-  "${KEY_TEMPLATES[*]}" "LEGACY"
-mac_basic_test "CC-JAVA"   $CC_MAC_CLI   $JAVA_MAC_CLI \
-  "${KEY_TEMPLATES[*]}" "LEGACY"
-mac_basic_test "JAVA-CC"   $JAVA_MAC_CLI $CC_MAC_CLI   \
-  "${KEY_TEMPLATES[*]}" "LEGACY"
-mac_basic_test "JAVA-JAVA" $JAVA_MAC_CLI $JAVA_MAC_CLI \
-  "${KEY_TEMPLATES[*]}" "LEGACY"
+KEY_TEMPLATES=(AES_CMAC)
+MAC_CLIS=($CC_MAC_CLI $JAVA_MAC_CLI)
+VERIFY_CLIS=($CC_MAC_CLI $JAVA_MAC_CLI)
+mac_basic_test "${MAC_CLIS[*]}" "${VERIFY_CLIS[*]}" \
+    "${KEY_TEMPLATES[*]}"
diff --git a/tools/testing/cross_language/signature_test.sh b/tools/testing/cross_language/signature_test.sh
index 52e5485..e40b209 100755
--- a/tools/testing/cross_language/signature_test.sh
+++ b/tools/testing/cross_language/signature_test.sh
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
@@ -11,70 +12,80 @@
 # limitations under the License.
 ################################################################################
 
-#!/bin/bash
 
 ROOT_DIR="$TEST_SRCDIR/tink"
 CC_SIGN_CLI="$ROOT_DIR/tools/testing/cc/public_key_sign_cli_cc"
 CC_VERIFY_CLI="$ROOT_DIR/tools/testing/cc/public_key_verify_cli_cc"
 JAVA_SIGN_CLI="$ROOT_DIR/tools/testing/public_key_sign_cli_java"
 JAVA_VERIFY_CLI="$ROOT_DIR/tools/testing/public_key_verify_cli_java"
+GO_SIGN_CLI="$ROOT_DIR/tools/testing/go/public_key_sign_cli_go"
+GO_VERIFY_CLI="$ROOT_DIR/tools/testing/go/public_key_verify_cli_go"
 TEST_UTIL="$ROOT_DIR/tools/testing/cross_language/test_util.sh"
 
-KEY_TEMPLATES=(ECDSA_P256 ECDSA_P384 ECDSA_P521)
-
 source $TEST_UTIL || exit 1
 
 
 #############################################################################
 ### Helpers for signature-tests.
 
-# Basic tests of PublicKeySign and PublicKeyVerify.
+# Basic tests of PublicKeySign and PublicKeyVerify implementations.
 signature_basic_test() {
-  local test_name="$1-signature-basic-test-$5"
-  local sign_cli="$2"
-  local verify_cli="$3"
-  local key_templates="$4"
-  local output_prefix="$5"
+  local test_name="signature-basic-test"
+  local sign_clis=$1
+  local verify_clis=$2
+  local key_templates=$3
+  local output_prefixes=$4
 
   echo "############ starting test $test_name for the following templates:"
   echo $key_templates
-  for key_template in ${key_templates[*]}
+  for output_prefix in ${output_prefixes[*]}
   do
-    local test_instance="${test_name}_${key_template}"
-    generate_asymmetric_keys $test_instance $key_template $output_prefix
-    generate_plaintext $test_instance
+    for key_template in ${key_templates[*]}
+    do
+      echo "## TEST for key template $key_template, output prefix $output_prefix"
+      for sign_cli in ${sign_clis[*]}
+      do
+        local sign_cli_name=$(basename $sign_cli)
+        echo "## SIGNING using $sign_cli_name"
+        local test_instance="${test_name}_${key_template}"
 
-    local signature_file="$TEST_TMPDIR/${test_instance}_signature.bin"
-    local verification_file="$TEST_TMPDIR/${test_instance}_verification.bin"
-    $sign_cli $priv_key_file $plaintext_file $signature_file || exit 1
-    assert_files_different $plaintext_file $signature_file
-    $verify_cli $pub_key_file $signature_file $plaintext_file\
-        $verification_file || exit 1
-    assert_file_equals "valid" $verification_file
+        generate_asymmetric_keys "${test_instance}_SIGN_${output_prefix}_${sign_cli_name}" \
+            $key_template $output_prefix
+        generate_plaintext $test_instance
+
+        local signature_file="$TEST_TMPDIR/${test_instance}_SIGN_${sign_cli_name}_signature.bin"
+        $sign_cli $priv_key_file $plaintext_file $signature_file || exit 1
+        assert_files_different $plaintext_file $signature_file
+
+        for verify_cli in ${verify_clis[*]}
+        do
+          local verify_cli_name=$(basename "$verify_cli")
+          local verification_file="$TEST_TMPDIR/${test_instance}_SIGN_${output_prefix}_${sign_cli_name}_VERIFY_${verify_cli_name}_verification.bin"
+          echo "## VERIFYING using $verify_cli_name"
+          $verify_cli $pub_key_file $signature_file $plaintext_file\
+              $verification_file || exit 1
+          assert_file_equals "valid" $verification_file
+        done
+      done
+    done
   done
 }
 
 #############################################################################
 ##### Run the actual tests.
 
-### Tests with OutputPrefixType=="TINK"
-signature_basic_test "CC-CC"     $CC_SIGN_CLI   $CC_VERIFY_CLI   \
-  "${KEY_TEMPLATES[*]}" "TINK"
-signature_basic_test "CC-JAVA"   $CC_SIGN_CLI   $JAVA_VERIFY_CLI \
-  "${KEY_TEMPLATES[*]}" "TINK"
-signature_basic_test "JAVA-CC"   $JAVA_SIGN_CLI $CC_VERIFY_CLI   \
-  "${KEY_TEMPLATES[*]}" "TINK"
-signature_basic_test "JAVA-JAVA" $JAVA_SIGN_CLI $JAVA_VERIFY_CLI \
-  "${KEY_TEMPLATES[*]}" "TINK"
+# Common tests for Java, C++ and Go
+KEY_TEMPLATES=(ECDSA_P256 ECDSA_P384 ECDSA_P521 ECDSA_P256_IEEE_P1363 ECDSA_P384_IEEE_P1363 ECDSA_P521_IEEE_P1363 ED25519)
+OUTPUT_PREFIXES=(TINK LEGACY)
+SIGN_CLIS=($CC_SIGN_CLI $JAVA_SIGN_CLI $GO_SIGN_CLI)
+VERIFY_CLIS=($CC_VERIFY_CLI $JAVA_VERIFY_CLI $GO_VERIFY_CLI)
+signature_basic_test "${SIGN_CLIS[*]}" "${VERIFY_CLIS[*]}" \
+    "${KEY_TEMPLATES[*]}" "${OUTPUT_PREFIXES[*]}"
 
-### Tests with OutputPrefixType=="LEGACY"
-signature_basic_test "CC-CC"     $CC_SIGN_CLI   $CC_VERIFY_CLI   \
-  "${KEY_TEMPLATES[*]}" "LEGACY"
-signature_basic_test "CC-JAVA"   $CC_SIGN_CLI   $JAVA_VERIFY_CLI \
-  "${KEY_TEMPLATES[*]}" "LEGACY"
-signature_basic_test "JAVA-CC"   $JAVA_SIGN_CLI $CC_VERIFY_CLI   \
-  "${KEY_TEMPLATES[*]}" "LEGACY"
-signature_basic_test "JAVA-JAVA" $JAVA_SIGN_CLI $JAVA_VERIFY_CLI \
-  "${KEY_TEMPLATES[*]}" "LEGACY"
-
-
+# These tests work only in Java and C++
+KEY_TEMPLATES=(RSA_SSA_PKCS1_3072_SHA256_F4 RSA_SSA_PKCS1_4096_SHA512_F4 RSA_SSA_PSS_3072_SHA256_SHA256_32_F4 RSA_SSA_PSS_4096_SHA512_SHA512_64_F4)
+OUTPUT_PREFIXES=(TINK LEGACY)
+SIGN_CLIS=($CC_SIGN_CLI $JAVA_SIGN_CLI)
+VERIFY_CLIS=($CC_VERIFY_CLI $JAVA_VERIFY_CLI)
+signature_basic_test "${SIGN_CLIS[*]}" "${VERIFY_CLIS[*]}" \
+    "${KEY_TEMPLATES[*]}" "${OUTPUT_PREFIXES[*]}"
diff --git a/tools/testing/cross_language/streaming_aead_test.sh b/tools/testing/cross_language/streaming_aead_test.sh
index 2ec77b1..014f19d 100755
--- a/tools/testing/cross_language/streaming_aead_test.sh
+++ b/tools/testing/cross_language/streaming_aead_test.sh
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
@@ -11,14 +12,12 @@
 # limitations under the License.
 ################################################################################
 
-#!/bin/bash
 
 ROOT_DIR="$TEST_SRCDIR/tink"
+CC_AEAD_CLI="$ROOT_DIR/tools/testing/cc/streaming_aead_cli_cc"
 JAVA_AEAD_CLI="$ROOT_DIR/tools/testing/streaming_aead_cli_java"
 TEST_UTIL="$ROOT_DIR/tools/testing/cross_language/test_util.sh"
 
-KEY_TEMPLATES=(AES128_CTR_HMAC_SHA256_4KB AES256_CTR_HMAC_SHA256_4KB AES128_GCM_HKDF_4KB AES256_GCM_HKDF_4KB)
-
 source $TEST_UTIL || exit 1
 
 #############################################################################
@@ -26,35 +25,50 @@
 
 # Basic tests of streaming AEAD-implementations.
 streaming_aead_basic_test() {
-  local test_name="$1-streaming-aead-basic-test"
-  local encrypt_cli="$2"
-  local decrypt_cli="$3"
-  local key_templates=$4
+  local test_name="streaming-aead-basic-test"
+  local encrypt_clis=$1
+  local decrypt_clis=$2
+  local key_templates=$3
 
   echo "############ starting test $test_name for the following templates:"
   echo $key_templates
   for key_template in ${key_templates[*]}
   do
-    local test_instance="${test_name}_${key_template}"
-    local test_file_size_mb=5
-    generate_symmetric_key $test_instance $key_template
-    generate_long_plaintext $test_instance $test_file_size_mb
+    echo "## TEST for key template $key_template"
+    for encrypt_cli in ${encrypt_clis[*]}
+    do
+      local encrypt_cli_name=$(basename $encrypt_cli)
+      echo "## ENCRYPTING using $encrypt_cli_name"
+      local test_instance="${test_name}_${key_template}"
+      local test_file_size_mb=5
+      generate_symmetric_key "${test_instance}_ENCRYPT_${encrypt_cli_name}" \
+          $key_template
+      generate_long_plaintext $test_instance $test_file_size_mb 1048576
 
-    local encrypted_file="$TEST_TMPDIR/${test_instance}_encrypted.bin"
-    local decrypted_file="$TEST_TMPDIR/${test_instance}_decrypted.bin"
-    local associated_data_file="$TEST_TMPDIR/${test_instance}_aad.bin"
-    echo "some associated data for $test_instance" > $associated_data_file
-    $encrypt_cli $symmetric_key_file "encrypt" $plaintext_file\
-        $associated_data_file $encrypted_file || exit 1
-    assert_files_different $plaintext_file $encrypted_file
-    $decrypt_cli $symmetric_key_file "decrypt" $encrypted_file\
-        $associated_data_file $decrypted_file || exit 1
-    assert_files_equal $plaintext_file $decrypted_file
+      local encrypted_file="$TEST_TMPDIR/${test_instance}_ENCRYPT_${encrypt_cli_name}_encrypted.bin"
+      local associated_data_file="$TEST_TMPDIR/${test_instance}_ENCRYPT_${encrypt_cli_name}_aad.bin"
+      echo "some associated data for $test_instance using $encrypt_cli_name" \
+          "for encryption" > $associated_data_file
+
+      $encrypt_cli $symmetric_key_file "encrypt" $plaintext_file\
+          $associated_data_file $encrypted_file|| exit 1
+      assert_files_different $plaintext_file $encrypted_file
+      for decrypt_cli in ${decrypt_clis[*]}
+      do
+        local decrypt_cli_name=$(basename "$decrypt_cli")
+        local decrypted_file="$TEST_TMPDIR/${test_instance}_ENCRYPT_${encrypt_cli_name}_DECRYPT_${decrypt_cli_name}_decrypted.bin"
+        echo "## DECRYPTING using $decrypt_cli_name"
+        $decrypt_cli $symmetric_key_file "decrypt" $encrypted_file\
+            $associated_data_file $decrypted_file || exit 1
+        assert_files_equal $plaintext_file $decrypted_file
+      done
+    done
   done
 }
 
 #############################################################################
 ##### Run the actual tests.
-streaming_aead_basic_test "JAVA-JAVA" $JAVA_AEAD_CLI $JAVA_AEAD_CLI "${KEY_TEMPLATES[*]}"
-
-
+KEY_TEMPLATES=(AES128_GCM_HKDF_4KB AES256_GCM_HKDF_4KB AES128_CTR_HMAC_SHA256_4KB AES256_CTR_HMAC_SHA256_4KB)
+ENCRYPT_CLIS=($CC_AEAD_CLI $JAVA_AEAD_CLI)
+DECRYPT_CLIS=($CC_AEAD_CLI $JAVA_AEAD_CLI)
+streaming_aead_basic_test "${ENCRYPT_CLIS[*]}" "${DECRYPT_CLIS[*]}" "${KEY_TEMPLATES[*]}"
diff --git a/tools/testing/cross_language/test_util.sh b/tools/testing/cross_language/test_util.sh
index c859a3f..c501102 100755
--- a/tools/testing/cross_language/test_util.sh
+++ b/tools/testing/cross_language/test_util.sh
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
@@ -11,11 +12,10 @@
 # limitations under the License.
 ################################################################################
 
-#!/bin/bash
 
 ROOT_DIR="$TEST_SRCDIR/tink"
 TINKEY_CLI="$ROOT_DIR/tools/tinkey/tinkey"
-
+ENVELOPE_CLI="$ROOT_DIR/tools/testing/go/generate_envelope_keyset"
 #############################################################################
 ##### Helper functions.
 
@@ -67,6 +67,45 @@
   echo "Done generating a symmetric keyset."
 }
 
+# Generates an AWS Envelope Encryption using $key_template,
+# which should be supported by Tinkey.
+# Stores the key in file $aws_keyset_file.
+generate_aws_keyset() {
+  local key_name="$1"
+  local key_template="$2"
+  local output_format="$3"
+  if [ "$output_format" == "" ]; then
+    output_format="BINARY"
+  fi
+  aws_keyset_file="$TEST_TMPDIR/${key_name}_aws_keyset.bin"
+  echo "--- Using AWS KMS and template $key_template to generate keyset"\
+       "to file $aws_keyset_file ..."
+
+  $ENVELOPE_CLI $aws_keyset_file "AWS" $key_template || exit 1
+
+  echo "Done generating an AWS KMS generated keyset."
+}
+
+# Generates an GCP Envelope Encryption using $key_template,
+# which should be supported by Tinkey.
+# Stores the key in file $gcp_keyset_file.
+generate_gcp_keyset() {
+  local key_name="$1"
+  local key_template="$2"
+  local output_format="$3"
+
+  if [ "$output_format" == "" ]; then
+    output_format="BINARY"
+  fi
+  gcp_keyset_file="$TEST_TMPDIR/${key_name}_gcp_keyset.bin"
+  echo "--- Using GCP KMS and template $key_template to generate keyset"\
+      "to file $gcp_keyset_file ..."
+  $ENVELOPE_CLI $gcp_keyset_file "GCP" $key_template || exit 1
+
+  echo "Done generating an GCP KMS generated keyset."
+
+}
+
 # Generates some example plaintext data, and stores it in $plaintext_file.
 generate_plaintext() {
   local plaintext_name="$1"
@@ -80,10 +119,10 @@
 generate_long_plaintext() {
   local plaintext_name="$1"
   local size_mb="$2"
-  local bytes_in_mb=1048576
+  local bytes_in_mb="$3"
 
   plaintext_file="$TEST_TMPDIR/${plaintext_name}_plaintext.bin"
-  dd if=/dev/urandom of="$plaintext_file" bs=$bytes_in_mb count="$2"
+  dd if=/dev/urandom of="$plaintext_file" bs="$bytes_in_mb" count="$size_mb"
 }
 
 
@@ -161,8 +200,3 @@
   done
   echo "+++ Success: file contains all expected substrings."
 }
-
-# Keeps name of file while removing the path part.
-get_file_name() {
-  echo $1 | sed -e "s/.*\///"
-}
diff --git a/tools/testing/cross_language/version_test.sh b/tools/testing/cross_language/version_test.sh
index 6ecddeb..2f21376 100755
--- a/tools/testing/cross_language/version_test.sh
+++ b/tools/testing/cross_language/version_test.sh
@@ -1,3 +1,4 @@
+#!/bin/bash
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
@@ -11,7 +12,6 @@
 # limitations under the License.
 ################################################################################
 
-#!/bin/bash
 
 ROOT_DIR="$TEST_SRCDIR/tink"
 VERSION_FILE="$ROOT_DIR/tink_version.bzl"
@@ -23,7 +23,7 @@
 
 #############################################################################
 ##### Run the actual tests.
-TINK_VERSION=$(cat $VERSION_FILE | grep "TINK_VERSION_LABEL" | cut -d \" -f 2)
+TINK_VERSION=$(grep "TINK_VERSION_LABEL" $VERSION_FILE | cut -d \" -f 2)
 echo "CONFIG: $TINK_VERSION"
 CC_TINK_VERSION=$($CC_VERSION_CLI)
 echo "CC: $CC_TINK_VERSION"
diff --git a/tools/testing/go/BUILD.bazel b/tools/testing/go/BUILD.bazel
new file mode 100644
index 0000000..0a71950
--- /dev/null
+++ b/tools/testing/go/BUILD.bazel
@@ -0,0 +1,112 @@
+package(default_visibility = ["//tools/testing:__subpackages__"])
+
+licenses(["notice"])
+
+load("@io_bazel_rules_go//go:def.bzl", "go_binary")
+
+go_binary(
+    name = "aead_cli_go",
+    testonly = 1,  # keep
+    srcs = ["aead_cli.go"],
+    out = "aead_cli_go",
+    deps = [
+        "//go/aead:go_default_library",
+        "//go/keyset:go_default_library",
+        "//go/testkeyset:go_default_library",
+        "//go/core/registry:go_default_library",
+        "//go/integration/awskms:go_default_library",
+        "//go/integration/gcpkms:go_default_library",
+    ],
+)
+
+go_binary(
+    name = "mac_cli_go",
+    testonly = 1,  # keep
+    srcs = ["mac_cli.go"],
+    out = "mac_cli_go",
+    deps = [
+        "//go/keyset:go_default_library",
+        "//go/mac:go_default_library",
+        "//go/testkeyset:go_default_library",
+    ],
+)
+
+go_binary(
+    name = "public_key_sign_cli_go",
+    testonly = 1,  # keep
+    srcs = ["public_key_sign_cli.go"],
+    out = "public_key_sign_cli_go",
+    deps = [
+        "//go/keyset:go_default_library",
+        "//go/signature:go_default_library",
+        "//go/testkeyset:go_default_library",
+    ],
+)
+
+go_binary(
+    name = "public_key_verify_cli_go",
+    testonly = 1,  # keep
+    srcs = ["public_key_verify_cli.go"],
+    out = "public_key_verify_cli_go",
+    deps = [
+        "//go/keyset:go_default_library",
+        "//go/signature:go_default_library",
+        "//go/testkeyset:go_default_library",
+    ],
+)
+
+go_binary(
+    name = "hybrid_encrypt_cli_go",
+    testonly = 1,  # keep
+    srcs = ["hybrid_encrypt_cli.go"],
+    out = "hybrid_encrypt_cli_go",
+    deps = [
+        "//go/keyset:go_default_library",
+        "//go/hybrid:go_default_library",
+        "//go/testkeyset:go_default_library",
+    ],
+)
+
+go_binary(
+    name = "hybrid_decrypt_cli_go",
+    testonly = 1,  # keep
+    srcs = ["hybrid_decrypt_cli.go"],
+    out = "hybrid_decrypt_cli_go",
+    deps = [
+        "//go/keyset:go_default_library",
+        "//go/hybrid:go_default_library",
+        "//go/testkeyset:go_default_library",
+    ],
+)
+
+go_binary(
+    name = "deterministic_aead_cli_go",
+    testonly = 1,  # keep
+    srcs = ["deterministic_aead_cli.go"],
+    out = "deterministic_aead_cli_go",
+    deps = [
+        "//go/daead:go_default_library",
+        "//go/keyset:go_default_library",
+        "//go/testkeyset:go_default_library",
+    ],
+)
+
+go_binary(
+    name = "generate_envelope_keyset",
+    testonly = 1,  # keep
+    srcs = ["generate_envelope_keyset.go"],
+    out = "generate_envelope_keyset",
+    data = [
+        "//testdata:credentials",
+    ],
+    deps = [
+         "//go/aead:go_default_library",
+         "//go/core/registry:go_default_library",
+         "//go/insecurecleartextkeyset:go_default_library",
+         "//go/integration/awskms:go_default_library",
+         "//go/integration/gcpkms:go_default_library",
+         "//go/keyset:go_default_library",
+         "//proto:tink_go_proto",
+    ],
+    tags = ["no_rbe"],
+)
diff --git a/tools/testing/go/aead_cli.go b/tools/testing/go/aead_cli.go
new file mode 100644
index 0000000..17f1faa
--- /dev/null
+++ b/tools/testing/go/aead_cli.go
@@ -0,0 +1,132 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+// A command-line utility for testing AEAD-primitives.
+// It requires 5 arguments:
+//   keyset-file:  name of the file with the keyset to be used for encryption
+//   operation: the actual AEAD-operation, i.e. "encrypt" or "decrypt"
+//   input-file:  name of the file with input (plaintext for encryption, or
+//                or ciphertext for decryption)
+//   associated-data-file:  name of the file containing associated data
+//   output-file:  name of the file for the resulting output
+package main
+
+import (
+	"io/ioutil"
+	"log"
+	"os"
+
+	"github.com/google/tink/go/aead"
+	"github.com/google/tink/go/core/registry"
+	"github.com/google/tink/go/integration/awskms"
+	"github.com/google/tink/go/integration/gcpkms"
+	"github.com/google/tink/go/keyset"
+	"github.com/google/tink/go/testkeyset"
+)
+
+const (
+	gcpURI      = "gcp-kms://projects/tink-test-infrastructure/locations/global/keyRings/unit-and-integration-testing/cryptoKeys/aead-key"
+	gcpCredFile = "testdata/credential.json"
+	awsURI      = "aws-kms://arn:aws:kms:us-east-2:235739564943:key/3ee50705-5a82-4f5b-9753-05c4f473922f"
+	awsCredFile = "testdata/credentials_aws.csv"
+)
+
+func init() {
+	gcpclient, err := gcpkms.NewGCPClient(gcpURI)
+	if err != nil {
+		log.Fatal(err)
+	}
+	_, err = gcpclient.LoadCredentials(gcpCredFile)
+	if err != nil {
+		log.Fatal(err)
+	}
+	registry.RegisterKMSClient(gcpclient)
+
+	awsclient, err := awskms.NewAWSClient(awsURI)
+	if err != nil {
+		log.Fatal(err)
+	}
+	_, err = awsclient.LoadCredentials(awsCredFile)
+	if err != nil {
+		log.Fatal(err)
+	}
+	registry.RegisterKMSClient(awsclient)
+}
+
+func main() {
+	if len(os.Args) != 6 {
+		log.Fatalf("Usage: %s keyset-file operation input-file associated-data-file output-file\n", os.Args[0])
+	}
+
+	keysetFilename := os.Args[1]
+	operation := os.Args[2]
+	inputFilename := os.Args[3]
+	associatedDataFile := os.Args[4]
+	outputFilename := os.Args[5]
+
+	if !(operation == "encrypt" || operation == "decrypt") {
+		log.Fatalf("Unknown operation %q. Expected 'encrypt' or 'decrypt'", operation)
+	}
+
+	log.Printf("Using keyset from file %q to-AEAD-%s file %q with associated data from file %q.",
+		keysetFilename, operation, inputFilename, associatedDataFile)
+	log.Printf("The result will be written to %q\n", outputFilename)
+
+	// Read the keyset.
+	f, err := os.Open(keysetFilename)
+	if err != nil {
+		log.Fatalf("Opening the keyset file failed: %v\n", err)
+	}
+	reader := keyset.NewBinaryReader(f)
+	handle, err := testkeyset.Read(reader)
+	if err != nil {
+		log.Fatalf("Reading the keyset failed: %v\n", err)
+	}
+
+	// Get Primitive
+	cipher, err := aead.New(handle)
+	if err != nil {
+		log.Fatalf("Failed to create primitive: %v\n", err)
+	}
+
+	// Read input
+	content, err := ioutil.ReadFile(inputFilename)
+	if err != nil {
+		log.Fatalf("Failed to read input: %v", err)
+	}
+
+	// Read associated data
+	associatedData, err := ioutil.ReadFile(associatedDataFile)
+	if err != nil {
+		log.Fatalf("Failed to read associated data file: %v", err)
+	}
+
+	// Compute output
+	var result []byte
+	if operation == "encrypt" {
+		result, err = cipher.Encrypt(content, associatedData)
+	} else if operation == "decrypt" {
+		result, err = cipher.Decrypt(content, associatedData)
+	}
+	if err != nil {
+		log.Fatalf("Failed to %s input file. Error: %v", operation, err)
+	}
+
+	// Write to output file
+	if err := ioutil.WriteFile(outputFilename, result, 0644); err != nil {
+		log.Fatalf("Failed to write result to output file. Error: %v", err)
+	}
+}
diff --git a/tools/testing/go/deterministic_aead_cli.go b/tools/testing/go/deterministic_aead_cli.go
new file mode 100644
index 0000000..0f8236b
--- /dev/null
+++ b/tools/testing/go/deterministic_aead_cli.go
@@ -0,0 +1,104 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+// A command-line utility for testing DAEAD-primitives.
+// It requires 5 arguments:
+//   keyset-file:  name of the file with the keyset to be used
+//                 for encrypting/decrypting
+//   operation: the actual DeterminisiticAead-operation, i.e.
+//              "encryptdeterministically" or "decryptdeterministically"
+//   input-file:  name of the file that contains plaintext to be encrypted or the
+//                encrypted text to be decrypted
+//   additionaldata-file: name of the file that contains
+//                        additional-data used for encryption/decryption
+//   output-file:  name of the output file for the resulting encryptedtext
+package main
+
+import (
+	"io/ioutil"
+	"log"
+	"os"
+	"strings"
+
+	"github.com/google/tink/go/daead"
+	"github.com/google/tink/go/keyset"
+	"github.com/google/tink/go/testkeyset"
+)
+
+func main() {
+	if len(os.Args) != 6 {
+		log.Fatalf("Usage: %s keyset-file input-file additionaldata-file output-file", os.Args[0])
+	}
+
+	keysetFilename := os.Args[1]
+	operation := os.Args[2]
+	ipFilename := os.Args[3]
+	adFilename := os.Args[4]
+	outputFilename := os.Args[5]
+
+	log.Printf("Using keyset from file %q to %q the data in file %q using additional data from file %q.\nThe encrypted data will be written to file %q\n",
+		keysetFilename, operation, ipFilename, adFilename, outputFilename)
+
+	if strings.Compare(operation, "encryptdeterministically") != 0 && strings.Compare(operation, "decryptdeterministically") != 0 {
+		log.Fatalf("Unknown operation: %q\n", operation)
+	}
+
+	// Read the keyset.
+	f, err := os.Open(keysetFilename)
+	if err != nil {
+		log.Fatalf("Opening the keyset file failed: %v\n", err)
+	}
+	reader := keyset.NewBinaryReader(f)
+	handle, err := testkeyset.Read(reader)
+	if err != nil {
+		log.Fatalf("Reading the keyset failed: %v\n", err)
+	}
+
+	// Get Primitive
+	d, err := daead.New(handle)
+	if err != nil {
+		log.Fatalf("Failed to create primitive: %v\n", err)
+	}
+
+	// Read input message
+	ip, err := ioutil.ReadFile(ipFilename)
+	if err != nil {
+		log.Fatalf("Failed to read input file: %v", err)
+	}
+
+	// Read additional data
+	ad, err := ioutil.ReadFile(adFilename)
+	if err != nil {
+		log.Fatalf("Failed to read additional data: %v", err)
+	}
+	var op []byte
+	if strings.Compare(operation, "encryptdeterministically") == 0 {
+		log.Printf("Encrypting...\n")
+
+		if op, err = d.EncryptDeterministically(ip, ad); err != nil {
+			log.Fatalf("Error while encrypting: %v\n", err)
+		}
+	} else if strings.Compare(operation, "decryptdeterministically") == 0 {
+		log.Printf("Decrypting...\n")
+		if op, err = d.DecryptDeterministically(ip, ad); err != nil {
+			log.Fatalf("Error while decrypting: %v\n", err)
+		}
+	}
+	// Write to output file
+	if err := ioutil.WriteFile(outputFilename, op, 0644); err != nil {
+		log.Fatalf("Failed to write result to output file. Error: %v", err)
+	}
+}
diff --git a/tools/testing/go/generate_envelope_keyset.go b/tools/testing/go/generate_envelope_keyset.go
new file mode 100644
index 0000000..f9d9025
--- /dev/null
+++ b/tools/testing/go/generate_envelope_keyset.go
@@ -0,0 +1,116 @@
+// Copyright 2017 Google LLC.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package main
+
+import (
+	"bytes"
+	"io/ioutil"
+	"log"
+	"os"
+	"strings"
+
+	"flag"
+	// context is used to cancel outstanding requests
+	// TEST_SRCDIR to read the roots.pem
+	"github.com/google/tink/go/aead"
+	"github.com/google/tink/go/core/registry"
+	"github.com/google/tink/go/insecurecleartextkeyset"
+	"github.com/google/tink/go/integration/awskms"
+	"github.com/google/tink/go/integration/gcpkms"
+	"github.com/google/tink/go/keyset"
+
+	tinkpb "github.com/google/tink/proto/tink_go_proto"
+)
+
+// lint placeholder header, please ignore
+var (
+	gcpURI      = "gcp-kms://projects/tink-test-infrastructure/locations/global/keyRings/unit-and-integration-testing/cryptoKeys/aead-key"
+	gcpCredFile = os.Getenv("TEST_SRCDIR") + "/" + os.Getenv("TEST_WORKSPACE") + "/" + "testdata/credential.json"
+	awsURI      = "aws-kms://arn:aws:kms:us-east-2:235739564943:key/3ee50705-5a82-4f5b-9753-05c4f473922f"
+	awsCredFile = os.Getenv("TEST_SRCDIR") + "/" + os.Getenv("TEST_WORKSPACE") + "/" + "testdata/credentials_aws.csv"
+)
+
+func init() {
+	certPath := os.Getenv("TEST_SRCDIR") + "/" + os.Getenv("TEST_WORKSPACE") + "/" + "roots.pem"
+	flag.Set("cacerts", certPath)
+	os.Setenv("SSL_CERT_FILE", certPath)
+}
+
+// lint placeholder footer, please ignore
+
+func main() {
+	if len(os.Args) != 4 {
+		log.Fatalf("Usage: %s keyset-file kms dek-template", os.Args[0])
+	}
+	f := os.Args[1]
+	kms := os.Args[2]
+	dek := os.Args[3]
+	var dekT *tinkpb.KeyTemplate
+	var kh *keyset.Handle
+	var b bytes.Buffer
+	switch strings.ToUpper(dek) {
+	case "AES128_GCM":
+		dekT = aead.AES128GCMKeyTemplate()
+	case "AES128_CTR_HMAC_SHA256":
+		dekT = aead.AES128CTRHMACSHA256KeyTemplate()
+	default:
+		log.Fatalf("DEK template %s, is not supported. Expecting AES128_GCM or AES128_CTR_HMAC_SHA256", dek)
+	}
+	switch strings.ToUpper(kms) {
+	case "GCP":
+		gcpclient, err := gcpkms.NewGCPClient(gcpURI)
+		if err != nil {
+			log.Fatal(err)
+		}
+		_, err = gcpclient.LoadCredentials(gcpCredFile)
+		if err != nil {
+			log.Fatal(err)
+		}
+		registry.RegisterKMSClient(gcpclient)
+		kh, err = keyset.NewHandle(aead.KMSEnvelopeAEADKeyTemplate(gcpURI, dekT))
+		if err != nil {
+			log.Fatal(err)
+		}
+	case "AWS":
+		awsclient, err := awskms.NewAWSClient(awsURI)
+		if err != nil {
+			log.Fatal(err)
+		}
+		_, err = awsclient.LoadCredentials(awsCredFile)
+		if err != nil {
+			log.Fatal(err)
+		}
+		registry.RegisterKMSClient(awsclient)
+		kh, err = keyset.NewHandle(aead.KMSEnvelopeAEADKeyTemplate(awsURI, dekT))
+		if err != nil {
+			log.Fatal(err)
+		}
+	default:
+		log.Fatalf("KMS %s, is not supported. Expecting AWS or GCP", kms)
+	}
+	ks := insecurecleartextkeyset.KeysetMaterial(kh)
+	h, err := insecurecleartextkeyset.Read(&keyset.MemReaderWriter{Keyset: ks})
+	if err != nil {
+		log.Fatal(err)
+	}
+	if err := insecurecleartextkeyset.Write(h, keyset.NewBinaryWriter(&b)); err != nil {
+		log.Fatal(err)
+	}
+	if err := ioutil.WriteFile(f, b.Bytes(), 0644); err != nil {
+		log.Fatal(err)
+	}
+}
diff --git a/tools/testing/go/hybrid_decrypt_cli.go b/tools/testing/go/hybrid_decrypt_cli.go
new file mode 100644
index 0000000..6e6ff56
--- /dev/null
+++ b/tools/testing/go/hybrid_decrypt_cli.go
@@ -0,0 +1,87 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+// A command-line utility for testing HybridDecrypt-primitives.
+// It requires 4 arguments:
+//   keyset-file:  name of the file with the keyset to be used for decrypting
+//   encrypted-file:  name of the file that contains ciphertext to be decrypted
+//   contextinfo-file: name of the file that contains contextinfo used for decryption
+//   output-file:  name of the output file for the resulting plaintext
+package main
+
+import (
+	"io/ioutil"
+	"log"
+	"os"
+
+	"github.com/google/tink/go/hybrid"
+	"github.com/google/tink/go/keyset"
+	"github.com/google/tink/go/testkeyset"
+)
+
+func main() {
+	if len(os.Args) != 5 {
+		log.Fatalf("Usage: %s keyset-file encrypted-file contextinfo-file output-file", os.Args[0])
+	}
+
+	keysetFilename := os.Args[1]
+	etFilename := os.Args[2]
+	ctFilename := os.Args[3]
+	outputFilename := os.Args[4]
+
+	log.Printf("Using keyset from file %q to decrypt the data in file %q using context info from file %q.\nThe decrypted data will be written to file %q\n",
+		keysetFilename, etFilename, ctFilename, outputFilename)
+
+	// Read the keyset.
+	f, err := os.Open(keysetFilename)
+	if err != nil {
+		log.Fatalf("Opening the keyset file failed: %v\n", err)
+	}
+	reader := keyset.NewBinaryReader(f)
+	handle, err := testkeyset.Read(reader)
+	if err != nil {
+		log.Fatalf("Reading the keyset failed: %v\n", err)
+	}
+
+	// Get Primitive
+	hybrid, err := hybrid.NewHybridDecrypt(handle)
+	if err != nil {
+		log.Fatalf("Failed to create primitive: %v\n", err)
+	}
+
+	// Read encrypted message
+	et, err := ioutil.ReadFile(etFilename)
+	if err != nil {
+		log.Fatalf("Failed to read encrypted data: %v", err)
+	}
+
+	// Read context info
+	ct, err := ioutil.ReadFile(ctFilename)
+	if err != nil {
+		log.Fatalf("Failed to read context info: %v", err)
+	}
+
+	log.Printf("Decrypting...\n")
+	var pt []byte
+	if pt, err = hybrid.Decrypt(et, ct); err != nil {
+		log.Fatalf("Error while decrypting: %v\n", err)
+	}
+
+	// Write to output file
+	if err := ioutil.WriteFile(outputFilename, pt, 0644); err != nil {
+		log.Fatalf("Failed to write result to output file. Error: %v", err)
+	}
+}
diff --git a/tools/testing/go/hybrid_encrypt_cli.go b/tools/testing/go/hybrid_encrypt_cli.go
new file mode 100644
index 0000000..cf38d91
--- /dev/null
+++ b/tools/testing/go/hybrid_encrypt_cli.go
@@ -0,0 +1,87 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+// A command-line utility for testing HybridEncrypt-primitives.
+// It requires 4 arguments:
+//   keyset-file:  name of the file with the keyset to be used for encrypting
+//   plaintext-file:  name of the file that contains plaintext to be encrypted
+//   contextinfo-file: name of the file that contains contextinfo used for encryption
+//   output-file:  name of the output file for the resulting encryptedtext
+package main
+
+import (
+	"io/ioutil"
+	"log"
+	"os"
+
+	"github.com/google/tink/go/hybrid"
+	"github.com/google/tink/go/keyset"
+	"github.com/google/tink/go/testkeyset"
+)
+
+func main() {
+	if len(os.Args) != 5 {
+		log.Fatalf("Usage: %s keyset-file plaintext-file contextinfo-file output-file", os.Args[0])
+	}
+
+	keysetFilename := os.Args[1]
+	ptFilename := os.Args[2]
+	ctFilename := os.Args[3]
+	outputFilename := os.Args[4]
+
+	log.Printf("Using keyset from file %q to encrypt the data in file %q using context info from file %q.\nThe encrypted data will be written to file %q\n",
+		keysetFilename, ptFilename, ctFilename, outputFilename)
+
+	// Read the keyset.
+	f, err := os.Open(keysetFilename)
+	if err != nil {
+		log.Fatalf("Opening the keyset file failed: %v\n", err)
+	}
+	reader := keyset.NewBinaryReader(f)
+	handle, err := testkeyset.Read(reader)
+	if err != nil {
+		log.Fatalf("Reading the keyset failed: %v\n", err)
+	}
+
+	// Get Primitive
+	hybrid, err := hybrid.NewHybridEncrypt(handle)
+	if err != nil {
+		log.Fatalf("Failed to create primitive: %v\n", err)
+	}
+
+	// Read plaintext message
+	pt, err := ioutil.ReadFile(ptFilename)
+	if err != nil {
+		log.Fatalf("Failed to read plaintext: %v", err)
+	}
+
+	// Read context info
+	ct, err := ioutil.ReadFile(ctFilename)
+	if err != nil {
+		log.Fatalf("Failed to read context info: %v", err)
+	}
+
+	log.Printf("Encrypting...\n")
+	var et []byte
+	if et, err = hybrid.Encrypt(pt, ct); err != nil {
+		log.Fatalf("Error while encrypting: %v\n", err)
+	}
+
+	// Write to output file
+	if err := ioutil.WriteFile(outputFilename, et, 0644); err != nil {
+		log.Fatalf("Failed to write result to output file. Error: %v", err)
+	}
+}
diff --git a/tools/testing/go/mac_cli.go b/tools/testing/go/mac_cli.go
new file mode 100644
index 0000000..3bcec6c
--- /dev/null
+++ b/tools/testing/go/mac_cli.go
@@ -0,0 +1,116 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+// A command-line utility for testing Mac-primitives.
+// It requires 4 for MAC computation and 5 for MAC verification:
+//   keyset-file:  name of the file with the keyset to be used for MAC
+//   operation: the actual MAC-operation, i.e. "compute" or "verify"
+//   data-file:  name of the file with data for MAC computation/verification
+//   mac-file:  name of the file for MAC value (when computing the MAC),
+//              or with MAC value (when verifying the MAC)
+//   result-file: name of the file for MAC verification result (valid/invalid)
+//                (only for MAC verification operation)
+package main
+
+import (
+	"io/ioutil"
+	"log"
+	"os"
+
+	"github.com/google/tink/go/keyset"
+	"github.com/google/tink/go/mac"
+	"github.com/google/tink/go/testkeyset"
+)
+
+func main() {
+	if len(os.Args) != 5 && len(os.Args) != 6 {
+		log.Fatalf("Usage: %s keyset-file operation data-file mac-file [result-file]\n", os.Args[0])
+	}
+
+	keysetFilename := os.Args[1]
+	operation := os.Args[2]
+	dataFilename := os.Args[3]
+	macFilename := os.Args[4]
+	resultFilename := ""
+	if len(os.Args) == 6 {
+		resultFilename = os.Args[5]
+	}
+
+	if !(operation == "compute" || operation == "verify") {
+		log.Fatalf("Unknown operation %q. Expected 'compute' or 'verify'", operation)
+	}
+
+	if operation == "compute" {
+		log.Printf("Using keyset from file %q to compute MAC of data from file %q. The resulting MAC will be written to file %q.\n",
+			keysetFilename, dataFilename, macFilename)
+	} else {
+		log.Printf("Using keyset from file %q to verify MAC value from file %q computed for data from file %q. The verification result will be written to file %q.\n",
+			keysetFilename, macFilename, dataFilename, resultFilename)
+	}
+
+	// Read the keyset.
+	f, err := os.Open(keysetFilename)
+	if err != nil {
+		log.Fatalf("Opening the keyset file failed: %v\n", err)
+	}
+	reader := keyset.NewBinaryReader(f)
+	handle, err := testkeyset.Read(reader)
+	if err != nil {
+		log.Fatalf("Reading the keyset failed: %v\n", err)
+	}
+
+	// Get Primitive
+	m, err := mac.New(handle)
+	if err != nil {
+		log.Fatalf("Failed to create primitive: %v\n", err)
+	}
+
+	// Read input
+	content, err := ioutil.ReadFile(dataFilename)
+	if err != nil {
+		log.Fatalf("Failed to read input: %v", err)
+	}
+
+	// Compute output
+	var result []byte
+	if operation == "compute" {
+		result, err = m.ComputeMAC(content)
+		if err != nil {
+			log.Fatalf("Failed to compute MAC: %v\n", err)
+		}
+		resultFilename = macFilename
+	} else if operation == "verify" {
+		log.Println("Verifying MAC...")
+
+		// Read MAC value
+		macValue, err := ioutil.ReadFile(macFilename)
+		if err != nil {
+			log.Fatalf("Failed to read MAC value: %v", err)
+		}
+
+		result = []byte("valid")
+		err = m.VerifyMAC(macValue, content)
+		if err != nil {
+			log.Printf("Failed to verify MAC: %v", err)
+			result = []byte("invalid")
+		}
+	}
+
+	// Write to output file
+	if err = ioutil.WriteFile(resultFilename, result, 0644); err != nil {
+		log.Fatalf("Failed to write result to output file. Error: %v", err)
+	}
+}
diff --git a/tools/testing/go/public_key_sign_cli.go b/tools/testing/go/public_key_sign_cli.go
new file mode 100644
index 0000000..9554670
--- /dev/null
+++ b/tools/testing/go/public_key_sign_cli.go
@@ -0,0 +1,79 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+// A command-line utility for testing PublicKeySign-primitives.
+// It requires 3 arguments:
+//   keyset-file:  name of the file with the keyset to be used for signing
+//   message-file:  name of the file that contains message to be signed
+//   output-file:  name of the output file for the resulting plaintext
+package main
+
+import (
+	"io/ioutil"
+	"log"
+	"os"
+
+	"github.com/google/tink/go/keyset"
+	"github.com/google/tink/go/signature"
+	"github.com/google/tink/go/testkeyset"
+)
+
+func main() {
+	if len(os.Args) != 4 {
+		log.Fatalf("Usage: %s keyset-file message-file output-file", os.Args[0])
+	}
+
+	keysetFilename := os.Args[1]
+	messageFilename := os.Args[2]
+	outputFilename := os.Args[3]
+
+	log.Printf("Using keyset from file %q to sign message in file %q.\nThe signature will be written to file %q\n",
+		keysetFilename, messageFilename, outputFilename)
+
+	// Read the keyset.
+	f, err := os.Open(keysetFilename)
+	if err != nil {
+		log.Fatalf("Opening the keyset file failed: %v\n", err)
+	}
+	reader := keyset.NewBinaryReader(f)
+	handle, err := testkeyset.Read(reader)
+	if err != nil {
+		log.Fatalf("Reading the keyset failed: %v\n", err)
+	}
+
+	// Get Primitive
+	signer, err := signature.NewSigner(handle)
+	if err != nil {
+		log.Fatalf("Failed to create primitive: %v\n", err)
+	}
+
+	// Read message
+	data, err := ioutil.ReadFile(messageFilename)
+	if err != nil {
+		log.Fatalf("Failed to read message: %v", err)
+	}
+
+	log.Printf("Signing...\n")
+	var result []byte
+	if result, err = signer.Sign(data); err != nil {
+		log.Fatalf("Error while signing: %v\n", err)
+	}
+
+	// Write to output file
+	if err := ioutil.WriteFile(outputFilename, result, 0644); err != nil {
+		log.Fatalf("Failed to write result to output file. Error: %v", err)
+	}
+}
diff --git a/tools/testing/go/public_key_verify_cli.go b/tools/testing/go/public_key_verify_cli.go
new file mode 100644
index 0000000..999bd30
--- /dev/null
+++ b/tools/testing/go/public_key_verify_cli.go
@@ -0,0 +1,89 @@
+// Copyright 2019 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+// A command-line utility for testing PublicKeyVerify-primitives.
+// It requires 4 arguments:
+//   keyset-file:  name of the file with the keyset to be used for verification
+//   signature-file:  name of the file that contains the signature
+//   message-file:  name of the file that contains message that was signed
+//   output-file:  name of the output file for the verification result
+//                 (valid/invalid)
+package main
+
+import (
+	"io/ioutil"
+	"log"
+	"os"
+
+	"github.com/google/tink/go/keyset"
+	"github.com/google/tink/go/signature"
+	"github.com/google/tink/go/testkeyset"
+)
+
+func main() {
+	if len(os.Args) != 5 {
+		log.Fatalf("Usage: %s keyset-file signature-file message-file output-file", os.Args[0])
+	}
+
+	keysetFilename := os.Args[1]
+	signatureFilename := os.Args[2]
+	messageFilename := os.Args[3]
+	outputFilename := os.Args[4]
+
+	log.Printf("Using keyset from file %q to verify signature from file %q of the message from file %q.\nThe verification result will be written to file %q\n",
+		keysetFilename, signatureFilename, messageFilename, outputFilename)
+
+	// Read the keyset.
+	f, err := os.Open(keysetFilename)
+	if err != nil {
+		log.Fatalf("Opening the keyset file failed: %v\n", err)
+	}
+	reader := keyset.NewBinaryReader(f)
+	handle, err := testkeyset.Read(reader)
+	if err != nil {
+		log.Fatalf("Reading the keyset failed: %v\n", err)
+	}
+
+	// Get Primitive
+	verifier, err := signature.NewVerifier(handle)
+	if err != nil {
+		log.Fatalf("Failed to create primitive: %v\n", err)
+	}
+
+	// Read message
+	data, err := ioutil.ReadFile(messageFilename)
+	if err != nil {
+		log.Fatalf("Failed to read message: %v", err)
+	}
+
+	// Read signature
+	sig, err := ioutil.ReadFile(signatureFilename)
+	if err != nil {
+		log.Fatalf("Failed to read signature: %v", err)
+	}
+
+	log.Printf("Verifying...\n")
+	result := []byte("valid")
+	if err := verifier.Verify(sig, data); err != nil {
+		log.Printf("Error while verifying the signature: %v\n", err)
+		result = []byte("invalid")
+	}
+
+	// Write to output file
+	if err := ioutil.WriteFile(outputFilename, result, 0644); err != nil {
+		log.Fatalf("Failed to write result to output file. Error: %v", err)
+	}
+}
diff --git a/tools/testing/java/com/google/crypto/tink/testing/AeadCli.java b/tools/testing/java/com/google/crypto/tink/testing/AeadCli.java
index 8c0d7bd..3f93bb9 100644
--- a/tools/testing/java/com/google/crypto/tink/testing/AeadCli.java
+++ b/tools/testing/java/com/google/crypto/tink/testing/AeadCli.java
@@ -18,19 +18,24 @@
 
 import com.google.crypto.tink.Aead;
 import com.google.crypto.tink.KeysetHandle;
+import com.google.crypto.tink.KmsClient;
+import com.google.crypto.tink.KmsClients;
+import com.google.crypto.tink.TestUtil;
+import com.google.crypto.tink.aead.AeadConfig;
+import com.google.crypto.tink.integration.gcpkms.GcpKmsClient;
+
+import com.google.crypto.tink.integration.awskms.AwsKmsClient;
 
 /**
- * A command-line utility for testing Aead-primitives.
- * It requires 5 arguments:
- *   keyset-file:  name of the file with the keyset to be used for encryption
- *   operation: the actual AEAD-operation, i.e. "encrypt" or "decrypt"
- *   input-file:  name of the file with input (plaintext for encryption, or
- *                or ciphertext for decryption)
- *   associated-data-file:  name of the file containing associated data
- *   output-file:  name of the file for the resulting output
+ * A command-line utility for testing Aead-primitives. It requires 5 arguments: keyset-file: name of
+ * the file with the keyset to be used for encryption operation: the actual AEAD-operation, i.e.
+ * "encrypt" or "decrypt" input-file: name of the file with input (plaintext for encryption, or or
+ * ciphertext for decryption) associated-data-file: name of the file containing associated data
+ * output-file: name of the file for the resulting output
  */
 public class AeadCli {
   public static void main(String[] args) throws Exception {
+
     if (args.length != 5) {
       System.out.println(
           "Usage: AeadCli keyset-file operation input-file associated-data-file output-file");
@@ -41,6 +46,15 @@
     String inputFilename = args[2];
     String associatedDataFile = args[3];
     String outputFilename = args[4];
+
+    KmsClient gcpKmsClient = new GcpKmsClient().withCredentials(TestUtil.SERVICE_ACCOUNT_FILE);
+    KmsClients.add(gcpKmsClient);
+    AeadConfig.register();
+
+    KmsClient awsKmsClient = new AwsKmsClient(TestUtil.AWS_CRYPTO_URI).withCredentials(TestUtil.AWS_CREDS);
+    KmsClients.add(awsKmsClient);
+    AeadConfig.register();
+
     if (!(operation.equals("encrypt") || operation.equals("decrypt"))) {
       System.out.println(
           "Unknown operation '" + operation + "'.\nExpected 'encrypt' or 'decrypt'.");
@@ -56,7 +70,6 @@
     // Read the keyset.
     System.out.println("Reading the keyset...");
     KeysetHandle keysetHandle = CliUtil.readKeyset(keysetFilename);
-
     // Get the primitive.
     System.out.println("Getting the primitive...");
     Aead aead = keysetHandle.getPrimitive(Aead.class);
@@ -73,7 +86,6 @@
     } else { // operation.equals("decrypt")
       output = aead.decrypt(input, aad);
     }
-
     // Write the output to the output file.
     CliUtil.write(output, outputFilename);
 
diff --git a/tools/testing/python/aead_cli.py b/tools/testing/python/aead_cli.py
new file mode 100644
index 0000000..4123b88
--- /dev/null
+++ b/tools/testing/python/aead_cli.py
@@ -0,0 +1,130 @@
+# Copyright 2019 Google Inc. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS-IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""A command-line utility for testing AEAD-primitives.
+
+It requires 5 arguments:
+  keyset-file:  name of the file with the keyset to be used for encryption
+  operation: the actual AEAD-operation, i.e. "encrypt" or "decrypt"
+  input-file:  name of the file with input (plaintext for encryption, or
+               or ciphertext for decryption)
+  associated-data-file:  name of the file containing associated data
+  output-file:  name of the file for the resulting output
+"""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+# Special imports
+from absl import app
+from absl import flags
+from absl import logging
+import tink
+
+from tink.core import cleartext_keyset_handle
+
+FLAGS = flags.FLAGS
+
+
+def read_keyset(keyset_filename):
+  """Load a keyset from a file.
+
+  Args:
+    keyset_filename: A path to a keyset file
+
+  Returns:
+    A KeysetHandle of the file's keyset
+  Raises:
+    TinkError: if the file is not valid
+    IOError: if the file does not exist
+  """
+  with open(keyset_filename, 'rb') as keyset_file:
+    text = keyset_file.read()
+    keyset = cleartext_keyset_handle.CleartextKeysetHandle(
+        tink.BinaryKeysetReader(text).read())
+  return keyset
+
+
+def main(argv):
+  if len(argv) != 6:
+    raise app.UsageError(
+        'Expected 5 arguments, got %d.\n'
+        'Usage: %s keyset-file operation input-file associated-data-file' %
+        (len(argv) - 1, argv[0]))
+
+  keyset_filename = argv[1]
+  operation = argv[2]
+  input_filename = argv[3]
+  associated_data_filename = argv[4]
+  output_filename = argv[5]
+
+  logging.info(
+      'Using keyset from file %s to AEAD-%s file %s with associated data '
+      'from file %s.\nThe resulting output will be written to file %s',
+      keyset_filename, operation, input_filename, associated_data_filename,
+      output_filename)
+
+  # Initialise Tink
+  try:
+    tink.tink_config.register()
+  except tink.TinkError as e:
+    logging.error('Error initialising Tink: %s', e)
+    return 1
+
+  # Read the keyset
+  try:
+    keyset = read_keyset(keyset_filename)
+  except tink.TinkError as e:
+    logging.error('Error reading key: %s', e)
+    return 1
+
+  # Get the primitive
+  try:
+    cipher = keyset.primitive(tink.Aead)
+  except tink.TinkError as e:
+    logging.error('Error creating primitive: %s', e)
+    return 1
+
+  # Read the input files
+  with open(input_filename, 'rb') as input_file:
+    input_data = input_file.read()
+  with open(associated_data_filename, 'rb') as associated_data_file:
+    aad = associated_data_file.read()
+
+  # Compute the output
+  if operation.lower() == 'encrypt':
+    try:
+      output_data = cipher.encrypt(input_data, aad)
+    except tink.TinkError as e:
+      logging.error('Error encrypting the input: %s', e)
+  elif operation.lower() == 'decrypt':
+    try:
+      output_data = cipher.decrypt(input_data, aad)
+    except tink.TinkError as e:
+      logging.error('Error decrypting the input: %s', e)
+  else:
+    logging.error(
+        'Did not recognise operation %s.\n'
+        'Expected either "encrypt" or "decrypt"', operation)
+    return 1
+
+  with open(output_filename, 'wb') as output_file:
+    output_file.write(output_data)
+
+  logging.info('All done.')
+
+
+if __name__ == '__main__':
+  app.run(main)
diff --git a/tools/testing/python/py23.bzl b/tools/testing/python/py23.bzl
new file mode 100644
index 0000000..0fc2a56
--- /dev/null
+++ b/tools/testing/python/py23.bzl
@@ -0,0 +1,33 @@
+"""Macros to generate python 2 and 3 binaries."""
+
+load("//devtools/python/blaze:pytype.bzl", "pytype_strict_binary")
+
+def py23_binary(name, **kwargs):
+    """Generates python 2 and 3 binaries. Accepts any py_binary arguments."""
+    native.py_binary(
+        name = name + "2",
+        python_version = "PY2",
+        **kwargs
+    )
+
+    native.py_binary(
+        name = name + "3",
+        python_version = "PY3",
+        **kwargs
+    )
+
+def pytype_strict_23_binary(name, **kwargs):
+    """Generates python 2 and 3 binaries.
+
+    Accepts any pytype_strict_binary arguments."""
+    pytype_strict_binary(
+        name = name + "2",
+        python_version = "PY2",
+        **kwargs
+    )
+
+    pytype_strict_binary(
+        name = name + "3",
+        python_version = "PY3",
+        **kwargs
+    )
diff --git a/tools/tinkey/BUILD.bazel b/tools/tinkey/BUILD.bazel
index 42bff91..65c6fd6 100644
--- a/tools/tinkey/BUILD.bazel
+++ b/tools/tinkey/BUILD.bazel
@@ -1,6 +1,6 @@
 package(default_visibility = ["//tools/build_defs:internal_pkg"])
 
-licenses(["notice"])  # Apache 2.0
+licenses(["notice"])
 
 load("//tools/build_defs:javac.bzl", "JAVACOPTS_OSS")
 
@@ -16,12 +16,21 @@
     ),
     javacopts = JAVACOPTS_OSS,
     deps = [
-        "//java",
-        "//java:cleartext_keyset_handle",
-        "//java:protos",
-        "//java:subtle",
-        "@args4j//jar",
+        "//java/src/main/java/com/google/crypto/tink",
+        "//java/src/main/java/com/google/crypto/tink:cleartext_keyset_handle",
+        "//java/src/main/java/com/google/crypto/tink:primitives",
+        "//java/src/main/java/com/google/crypto/tink/aead",
+        "//java/src/main/java/com/google/crypto/tink/daead",
+        "//java/src/main/java/com/google/crypto/tink/hybrid",
+        "//java/src/main/java/com/google/crypto/tink/integration/awskms",
+        "//java/src/main/java/com/google/crypto/tink/integration/gcpkms",
+        "//java/src/main/java/com/google/crypto/tink/mac",
+        "//java/src/main/java/com/google/crypto/tink/signature",
+        "//java/src/main/java/com/google/crypto/tink/streamingaead",
+        "//java/src/main/java/com/google/crypto/tink/subtle",
+        "//proto:tink_java_proto",
         "@com_google_protobuf_javalite//:protobuf_java_lite",
+        "@maven//:args4j_args4j",
     ],
 )
 
@@ -33,13 +42,10 @@
     javacopts = JAVACOPTS_OSS,
     main_class = "com.google.crypto.tink.tinkey.Tinkey",
     visibility = ["//tools/testing:__subpackages__"],
-    runtime_deps = [
-        "@com_fasterxml_jackson_core//jar",
-    ],
     deps = [
         ":libtinkey",
-        "//java",
-        "@args4j//jar",
+        "//java/src/main/java/com/google/crypto/tink/config",
+        "@maven//:args4j_args4j",
     ],
 )
 
@@ -55,11 +61,11 @@
     ]),
     deps = [
         ":libtinkey",
-        "//java:test_util",
         "//java:testonly",
+        "//java:testutil",
         "@com_google_protobuf_javalite//:protobuf_java_lite",
-        "@com_google_truth//jar",
-        "@junit",
+        "@maven//:com_google_truth_truth",
+        "@maven//:junit_junit",
     ],
 )
 
diff --git a/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/AddKeyCommandTest.java b/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/AddKeyCommandTest.java
index b67f663..ed12c39 100644
--- a/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/AddKeyCommandTest.java
+++ b/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/AddKeyCommandTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeFalse;
 
 import com.google.crypto.tink.Config;
 import com.google.crypto.tink.KeysetReader;
@@ -102,6 +103,8 @@
 
   @Test
   public void testAddEncrypted_shouldAddNewKey() throws Exception {
+    // This test requires KMS/internet access and thus cannot run on RBE.
+    assumeFalse(TestUtil.isRemoteBuildExecution());
     // Create an input stream containing an encrypted keyset.
     String masterKeyUri = TestUtil.RESTRICTED_CRYPTO_KEY_URI;
     String credentialPath = TestUtil.SERVICE_ACCOUNT_FILE;
diff --git a/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/CreateKeysetCommandTest.java b/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/CreateKeysetCommandTest.java
index b94ef1c..de027b8 100644
--- a/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/CreateKeysetCommandTest.java
+++ b/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/CreateKeysetCommandTest.java
@@ -17,6 +17,7 @@
 package com.google.crypto.tink.tinkey;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assume.assumeFalse;
 
 import com.google.crypto.tink.Config;
 import com.google.crypto.tink.TestUtil;
@@ -75,6 +76,8 @@
 
   private void testCreateEncrypted_shouldCreateNewKeyset(
       String outFormat) throws Exception {
+    // This test requires KMS/internet access and thus cannot run on RBE.
+    assumeFalse(TestUtil.isRemoteBuildExecution());
     // Create an encrypted keyset.
     String masterKeyUri = TestUtil.RESTRICTED_CRYPTO_KEY_URI;
     String credentialPath = TestUtil.SERVICE_ACCOUNT_FILE;
diff --git a/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/CreatePublicKeysetCommandTest.java b/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/CreatePublicKeysetCommandTest.java
index a47c087..f0590cc 100644
--- a/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/CreatePublicKeysetCommandTest.java
+++ b/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/CreatePublicKeysetCommandTest.java
@@ -17,6 +17,7 @@
 package com.google.crypto.tink.tinkey;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assume.assumeFalse;
 
 import com.google.crypto.tink.CleartextKeysetHandle;
 import com.google.crypto.tink.Config;
@@ -123,6 +124,8 @@
 
   private void testCreate_encryptedPrivate_shouldCreateCleartextPublic(
       KeyTemplate template, KeyType type) throws Exception {
+    // This test requires KMS/internet access and thus cannot run on RBE.
+    assumeFalse(TestUtil.isRemoteBuildExecution());
     // Create an input stream containing a cleartext private keyset.
     String masterKeyUri = TestUtil.RESTRICTED_CRYPTO_KEY_URI;
     String credentialPath = TestUtil.SERVICE_ACCOUNT_FILE;
diff --git a/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/RotateKeysetCommandTest.java b/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/RotateKeysetCommandTest.java
index 8c3aae3..ddecc0a 100644
--- a/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/RotateKeysetCommandTest.java
+++ b/tools/tinkey/src/test/java/com/google/crypto/tink/tinkey/RotateKeysetCommandTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeFalse;
 
 import com.google.crypto.tink.Config;
 import com.google.crypto.tink.KeysetReader;
@@ -102,6 +103,8 @@
 
   @Test
   public void testRotateEncrypted_shouldAddNewKey() throws Exception {
+    // This test requires KMS/internet access and thus cannot run on RBE.
+    assumeFalse(TestUtil.isRemoteBuildExecution());
     // Create an input stream containing an encrypted keyset.
     String masterKeyUri = TestUtil.RESTRICTED_CRYPTO_KEY_URI;
     String credentialPath = TestUtil.SERVICE_ACCOUNT_FILE;